Merge "Do not output invalid links for deleted names on Special:Contributions"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 29 May 2017 20:03:00 +0000 (20:03 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 29 May 2017 20:03:01 +0000 (20:03 +0000)
1916 files changed:
.gitignore
.mailmap
.rubocop.yml [deleted file]
.stylelintrc
.travis.yml
CREDITS
Gemfile [deleted file]
Gemfile.lock [deleted file]
Gruntfile.js
HISTORY
RELEASE-NOTES-1.29 [deleted file]
RELEASE-NOTES-1.30 [new file with mode: 0644]
Rakefile [deleted file]
UPGRADE
api.php
autoload.php
composer.json
docs/extension.schema.v1.json
docs/extension.schema.v2.json
docs/hooks.txt
docs/uidesign/child-selector-emu.html
img_auth.php
includes/Autopromote.php
includes/Block.php
includes/Category.php
includes/CategoryFinder.php
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/FeedUtils.php
includes/GlobalFunctions.php
includes/HistoryBlob.php
includes/Html.php
includes/Linker.php
includes/MWTimestamp.php
includes/MagicWord.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/MergeHistory.php
includes/MimeMagic.php
includes/MovePage.php
includes/NoLocalSettings.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ReadOnlyMode.php [new file with mode: 0644]
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/ServiceWiring.php
includes/Setup.php
includes/SiteStats.php
includes/TemplateParser.php
includes/Title.php
includes/TitleArray.php
includes/TitleArrayFromResult.php
includes/TrackingCategories.php
includes/WatchedItemQueryService.php
includes/WatchedItemQueryServiceExtension.php
includes/WatchedItemStore.php
includes/WebRequest.php
includes/WebStart.php
includes/WikiMap.php
includes/WikiReference.php [new file with mode: 0644]
includes/Xml.php
includes/XmlJsCode.php [new file with mode: 0644]
includes/actions/FormAction.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/PurgeAction.php
includes/actions/RevertAction.php
includes/actions/UnwatchAction.php
includes/actions/ViewAction.php
includes/actions/WatchAction.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/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiErrorFormatter.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiHelp.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/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/ApiQueryAllCategories.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllRevisions.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryAuthManagerInfo.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryContributors.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFileRepoInfo.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/ApiQueryPagePropNames.php
includes/api/ApiQueryPageProps.php
includes/api/ApiQueryPagesWithProp.php
includes/api/ApiQueryPrefixSearch.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryTokens.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiRemoveAuthenticationData.php
includes/api/ApiResetPassword.php
includes/api/ApiResult.php
includes/api/ApiRevisionDelete.php
includes/api/ApiRollback.php
includes/api/ApiRsd.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiSetPageLanguage.php
includes/api/ApiTag.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiValidatePassword.php
includes/api/ApiWatch.php
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/en-gb.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fa.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/hu.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/ksh.json
includes/api/i18n/lb.json
includes/api/i18n/mk.json
includes/api/i18n/nb.json
includes/api/i18n/nl.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/uk.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/auth/AuthManager.php
includes/auth/Throttler.php
includes/cache/BacklinkCache.php
includes/cache/FileCacheBase.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/MessageBlobStore.php
includes/cache/MessageCache.php
includes/cache/localisation/LCStoreDB.php
includes/cache/localisation/LocalisationCache.php
includes/changes/ChangesFeed.php
includes/changes/ChangesList.php
includes/changes/ChangesListBooleanFilter.php [new file with mode: 0644]
includes/changes/ChangesListBooleanFilterGroup.php [new file with mode: 0644]
includes/changes/ChangesListFilter.php [new file with mode: 0644]
includes/changes/ChangesListFilterGroup.php [new file with mode: 0644]
includes/changes/ChangesListStringOptionsFilter.php [new file with mode: 0644]
includes/changes/ChangesListStringOptionsFilterGroup.php [new file with mode: 0644]
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/changes/RecentChange.php
includes/changetags/ChangeTags.php
includes/changetags/ChangeTagsList.php
includes/changetags/ChangeTagsLogList.php
includes/changetags/ChangeTagsRevisionList.php
includes/collation/BashkirUppercaseCollation.php [new file with mode: 0644]
includes/collation/Collation.php
includes/collation/CollationEt.php
includes/collation/CollationFa.php
includes/collation/CustomUppercaseCollation.php [new file with mode: 0644]
includes/collation/IcuCollation.php
includes/compat/Timestamp.php [new file with mode: 0644]
includes/config/EtcdConfig.php [new file with mode: 0644]
includes/content/ContentHandler.php
includes/content/FileContentHandler.php
includes/content/TextContentHandler.php
includes/content/WikiTextStructure.php
includes/content/WikitextContentHandler.php
includes/context/ContextSource.php
includes/context/RequestContext.php
includes/dao/DBAccessBase.php
includes/db/CloneDatabase.php
includes/db/DatabaseOracle.php
includes/db/MWLBFactory.php
includes/db/ORAResult.php
includes/debug/MWDebug.php
includes/debug/logger/ConsoleLogger.php [new file with mode: 0644]
includes/debug/logger/ConsoleSpi.php [new file with mode: 0644]
includes/debug/logger/monolog/KafkaHandler.php
includes/deferred/AtomicSectionUpdate.php
includes/deferred/AutoCommitUpdate.php
includes/deferred/DeferredUpdates.php
includes/deferred/LinksDeletionUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/MWCallableUpdate.php
includes/deferred/SiteStatsUpdate.php
includes/deferred/SqlDataUpdate.php
includes/deferred/WANCacheReapUpdate.php
includes/diff/DifferenceEngine.php
includes/diff/WordAccumulator.php
includes/exception/ErrorPageError.php
includes/exception/MWException.php
includes/exception/MWExceptionHandler.php
includes/exception/MWExceptionRenderer.php
includes/exception/UserNotLoggedIn.php
includes/export/WikiExporter.php
includes/export/XmlDumpWriter.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filebackend/lockmanager/MySqlLockManager.php
includes/filerepo/FileBackendDBRepoWrapper.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/NullRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/fields/HTMLCheckMatrix.php
includes/htmlform/fields/HTMLFormFieldCloner.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/htmlform/fields/HTMLUsersMultiselectField.php
includes/http/CurlHttpRequest.php
includes/http/Http.php
includes/http/MWHttpRequest.php
includes/import/WikiImporter.php
includes/import/WikiRevision.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MssqlInstaller.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleInstaller.php
includes/installer/OracleUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteInstaller.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerName.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/installer/WebInstallerUpgrade.php
includes/installer/i18n/ar.json
includes/installer/i18n/bg.json
includes/installer/i18n/br.json
includes/installer/i18n/bs.json
includes/installer/i18n/ca.json
includes/installer/i18n/ckb.json
includes/installer/i18n/es.json
includes/installer/i18n/eu.json
includes/installer/i18n/fa.json
includes/installer/i18n/fr.json
includes/installer/i18n/he.json
includes/installer/i18n/hi.json
includes/installer/i18n/hu.json
includes/installer/i18n/lij.json
includes/installer/i18n/lv.json
includes/installer/i18n/mk.json
includes/installer/i18n/nl.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/th.json
includes/installer/i18n/tr.json
includes/installer/i18n/yi.json
includes/installer/i18n/zh-hant.json
includes/interwiki/ClassicInterwikiLookup.php
includes/interwiki/Interwiki.php
includes/interwiki/InterwikiLookup.php
includes/interwiki/InterwikiLookupAdapter.php
includes/jobqueue/Job.php
includes/jobqueue/JobQueue.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/JobRunner.php
includes/jobqueue/JobSpecification.php
includes/jobqueue/jobs/DoubleRedirectJob.php
includes/jobqueue/jobs/PublishStashedFileJob.php
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/jobqueue/jobs/ThumbnailRenderJob.php
includes/jobqueue/utils/BacklinkJobUtils.php
includes/jobqueue/utils/PurgeJobUtils.php
includes/libs/CSSMin.php
includes/libs/CryptHKDF.php
includes/libs/CryptRand.php
includes/libs/DnsSrvDiscoverer.php [new file with mode: 0644]
includes/libs/IEUrlExtension.php
includes/libs/IP.php
includes/libs/MultiHttpClient.php
includes/libs/StatusValue.php
includes/libs/filebackend/FSFileBackend.php
includes/libs/filebackend/FileBackendMultiWrite.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/HTTPFileStreamer.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/filebackend/fileop/FileOp.php
includes/libs/lockmanager/DBLockManager.php
includes/libs/lockmanager/PostgreSqlLockManager.php
includes/libs/lockmanager/QuorumLockManager.php
includes/libs/mime/IEContentAnalyzer.php
includes/libs/mime/MimeAnalyzer.php
includes/libs/mime/XmlTypeCheck.php
includes/libs/mime/mime.info
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/CachedBagOStuff.php
includes/libs/objectcache/MemcachedClient.php
includes/libs/objectcache/MemcachedPeclBagOStuff.php
includes/libs/objectcache/RESTBagOStuff.php
includes/libs/objectcache/RedisBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/objectcache/WinCacheBagOStuff.php
includes/libs/rdbms/connectionmanager/ConnectionManager.php
includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php
includes/libs/rdbms/database/DBConnRef.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMssql.php
includes/libs/rdbms/database/DatabaseMysql.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabaseMysqli.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/IMaintainableDatabase.php
includes/libs/rdbms/database/MaintainableDBConnRef.php
includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php
includes/libs/rdbms/database/resultwrapper/IResultWrapper.php
includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php
includes/libs/rdbms/database/resultwrapper/ResultWrapper.php
includes/libs/rdbms/database/utils/SavepointPostgres.php
includes/libs/rdbms/defines.php
includes/libs/rdbms/exception/DBAccessError.php
includes/libs/rdbms/exception/DBConnectionError.php
includes/libs/rdbms/exception/DBError.php
includes/libs/rdbms/exception/DBExpectedError.php
includes/libs/rdbms/exception/DBQueryError.php
includes/libs/rdbms/exception/DBReadOnlyError.php
includes/libs/rdbms/exception/DBReplicationWaitError.php
includes/libs/rdbms/exception/DBTransactionError.php
includes/libs/rdbms/exception/DBTransactionSizeError.php
includes/libs/rdbms/exception/DBUnexpectedError.php
includes/libs/rdbms/field/PostgresField.php
includes/libs/rdbms/lbfactory/ILBFactory.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/lbfactory/LBFactoryMulti.php
includes/libs/rdbms/lbfactory/LBFactorySimple.php
includes/libs/rdbms/lbfactory/LBFactorySingle.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php
includes/libs/rdbms/loadmonitor/LoadMonitor.php
includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php
includes/libs/rdbms/loadmonitor/LoadMonitorNull.php
includes/libs/redis/RedisConnectionPool.php
includes/libs/stats/SamplingStatsdClient.php
includes/libs/time/ConvertibleTimestamp.php [deleted file]
includes/libs/time/TimestampException.php [deleted file]
includes/libs/time/defines.php [deleted file]
includes/libs/virtualrest/VirtualRESTService.php
includes/libs/xmp/XMP.php
includes/libs/xmp/XMPInfo.php
includes/libs/xmp/XMPValidate.php
includes/logging/DeleteLogFormatter.php
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/LogPager.php
includes/mail/EmailNotification.php
includes/mail/UserMailer.php
includes/media/Bitmap.php
includes/media/BitmapMetadataHandler.php
includes/media/DjVu.php
includes/media/DjVuImage.php
includes/media/ExifBitmap.php
includes/media/FormatMetadata.php
includes/media/GIFMetadataExtractor.php
includes/media/IPTC.php
includes/media/Jpeg.php
includes/media/MediaHandler.php
includes/media/PNGMetadataExtractor.php
includes/media/SVGMetadataExtractor.php
includes/media/TransformationalImageHandler.php
includes/objectcache/ObjectCache.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/ImageHistoryPseudoPager.php
includes/page/ImagePage.php
includes/page/PageArchive.php [new file with mode: 0644]
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/pager/IndexPager.php
includes/pager/RangeChronologicalPager.php [new file with mode: 0644]
includes/pager/ReverseChronologicalPager.php
includes/pager/TablePager.php
includes/parser/BlockLevelPass.php
includes/parser/CoreParserFunctions.php
includes/parser/CoreTagHooks.php
includes/parser/DateFormatter.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserDiffTest.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolWorkArticleView.php
includes/profiler/output/ProfilerOutputDb.php
includes/profiler/output/ProfilerOutputStats.php
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/registration/Processor.php
includes/registration/VersionChecker.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderJqueryMsgModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderOOUIImageModule.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserDefaultsModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelArchiveList.php
includes/revisiondelete/RevDelArchivedFileList.php
includes/revisiondelete/RevDelFileItem.php
includes/revisiondelete/RevDelFileList.php
includes/revisiondelete/RevDelLogList.php
includes/revisiondelete/RevDelRevisionList.php
includes/revisiondelete/RevisionDeleteUser.php
includes/search/SearchDatabase.php
includes/search/SearchEngine.php
includes/search/SearchEngineFactory.php
includes/search/SearchHighlighter.php
includes/search/SearchIndexFieldDefinition.php
includes/search/SqlSearchResultSet.php
includes/services/ServiceContainer.php
includes/session/SessionBackend.php
includes/session/SessionManager.php
includes/session/SessionManagerInterface.php
includes/session/SessionProvider.php
includes/site/CachingSiteStore.php
includes/site/Site.php
includes/skins/BaseTemplate.php
includes/skins/Skin.php
includes/skins/SkinTemplate.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/ImageQueryPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/PageQueryPage.php
includes/specialpage/QueryPage.php
includes/specialpage/RedirectSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialAllPages.php
includes/specials/SpecialAutoblockList.php [new file with mode: 0644]
includes/specials/SpecialBlock.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialChangeCredentials.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialExport.php
includes/specials/SpecialGoToInterwiki.php [new file with mode: 0644]
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialLog.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php [changed mode: 0755->0644]
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnusedcategories.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserLogout.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/helpers/LoginHelper.php
includes/specials/pagers/ActiveUsersPager.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pagers/BlockListPager.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/ImageListPager.php
includes/specials/pagers/NewFilesPager.php
includes/specials/pagers/ProtectedPagesPager.php [new file with mode: 0644]
includes/specials/pagers/UsersPager.php
includes/tidy/Balancer.php
includes/tidy/RemexCompatFormatter.php [new file with mode: 0644]
includes/tidy/RemexCompatMunger.php [new file with mode: 0644]
includes/tidy/RemexDriver.php [new file with mode: 0644]
includes/tidy/RemexMungerData.php [new file with mode: 0644]
includes/tidy/TidyDriverBase.php
includes/title/NamespaceAwareForeignTitleFactory.php
includes/upload/UploadBase.php
includes/upload/UploadFromUrl.php
includes/user/BotPassword.php
includes/user/PasswordReset.php
includes/user/User.php
includes/user/UserArray.php
includes/user/UserArrayFromResult.php
includes/user/UserGroupMembership.php
includes/user/UserRightsProxy.php
includes/utils/AutoloadGenerator.php
includes/utils/BatchRowIterator.php
includes/utils/BatchRowWriter.php
includes/utils/MWCryptHKDF.php
includes/utils/ZipDirectoryReader.php
includes/utils/ZipDirectoryReaderError.php [new file with mode: 0644]
includes/widget/SearchInputWidget.php
includes/widget/SelectWithInputWidget.php [new file with mode: 0644]
includes/widget/search/InterwikiSearchResultSetWidget.php
includes/widget/search/InterwikiSearchResultWidget.php
includes/widget/search/SearchFormWidget.php
includes/widget/search/SimpleSearchResultSetWidget.php
jsduck.json
languages/FakeConverter.php
languages/Language.php
languages/LanguageCode.php [new file with mode: 0644]
languages/LanguageConverter.php
languages/classes/LanguageAr.php
languages/classes/LanguageAz.php
languages/classes/LanguageKk.php
languages/classes/LanguageKsh.php
languages/classes/LanguageLa.php
languages/classes/LanguageMl.php
languages/classes/LanguageTr.php
languages/data/Names.php
languages/data/ZhConversion.php
languages/data/grammarTransformations/uk.json
languages/i18n/ace.json
languages/i18n/ady-cyrl.json
languages/i18n/aeb-arab.json
languages/i18n/af.json
languages/i18n/aln.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/ang.json
languages/i18n/anp.json
languages/i18n/ar.json
languages/i18n/arc.json
languages/i18n/arn.json
languages/i18n/arq.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/atj.json [new file with mode: 0644]
languages/i18n/av.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/ban.json
languages/i18n/bar.json
languages/i18n/bbc-latn.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/bpy.json
languages/i18n/bqi.json
languages/i18n/br.json
languages/i18n/brh.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ceb.json
languages/i18n/ch.json
languages/i18n/ckb.json
languages/i18n/co.json
languages/i18n/cps.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/csb.json
languages/i18n/cu.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de-formal.json
languages/i18n/de.json
languages/i18n/din.json [new file with mode: 0644]
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dtp.json
languages/i18n/dty.json
languages/i18n/dz.json
languages/i18n/ee.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en-gb.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es-formal.json [new file with mode: 0644]
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/ff.json
languages/i18n/fi.json
languages/i18n/fit.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frc.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fur.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gag.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/glk.json
languages/i18n/gn.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/gor.json
languages/i18n/got.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/gv.json
languages/i18n/ha.json
languages/i18n/hak.json
languages/i18n/haw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hil.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/ht.json
languages/i18n/hu-formal.json [new file with mode: 0644]
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ie.json
languages/i18n/ig.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jam.json
languages/i18n/jbo.json
languages/i18n/jut.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kaa.json
languages/i18n/kab.json
languages/i18n/kbd-cyrl.json
languages/i18n/kbp.json [new file with mode: 0644]
languages/i18n/khw.json
languages/i18n/kiu.json
languages/i18n/kk-arab.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/kl.json
languages/i18n/km.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/koi.json
languages/i18n/krc.json
languages/i18n/krl.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/kw.json
languages/i18n/ky.json
languages/i18n/la.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lfn.json
languages/i18n/lg.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/liv.json
languages/i18n/lki.json
languages/i18n/lmo.json
languages/i18n/ln.json
languages/i18n/lo.json
languages/i18n/loz.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/ltg.json
languages/i18n/lus.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/lzz.json
languages/i18n/mai.json
languages/i18n/map-bms.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/mhr.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mo.json
languages/i18n/mr.json
languages/i18n/mrj.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/mwl.json
languages/i18n/my.json
languages/i18n/myv.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl-informal.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/nov.json
languages/i18n/nso.json
languages/i18n/oc.json
languages/i18n/olo.json
languages/i18n/or.json
languages/i18n/os.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pap.json
languages/i18n/pcd.json
languages/i18n/pdc.json
languages/i18n/pdt.json
languages/i18n/pfl.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/pnt.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/qug.json
languages/i18n/rgn.json
languages/i18n/rif.json
languages/i18n/rm.json
languages/i18n/rmy.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sat.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sdc.json
languages/i18n/sdh.json
languages/i18n/se.json
languages/i18n/sei.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/shi.json
languages/i18n/shn.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/sma.json
languages/i18n/so.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/srn.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/tet.json
languages/i18n/tg-cyrl.json
languages/i18n/tg-latn.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tly.json
languages/i18n/to.json
languages/i18n/tr.json
languages/i18n/tru.json
languages/i18n/ts.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/tyv.json
languages/i18n/udm.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vmf.json
languages/i18n/vo.json
languages/i18n/vot.json
languages/i18n/vro.json
languages/i18n/wa.json
languages/i18n/war.json
languages/i18n/wo.json
languages/i18n/wuu.json
languages/i18n/xal.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zea.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesArz.php
languages/messages/MessagesAtj.php [new file with mode: 0644]
languages/messages/MessagesCa.php
languages/messages/MessagesCs.php
languages/messages/MessagesDe.php
languages/messages/MessagesDin.php [new file with mode: 0644]
languages/messages/MessagesDty.php
languages/messages/MessagesEn.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesGn.php
languages/messages/MessagesKbd_cyrl.php
languages/messages/MessagesKbp.php [new file with mode: 0644]
languages/messages/MessagesLad.php
languages/messages/MessagesLn.php
languages/messages/MessagesNah.php
languages/messages/MessagesPl.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPt.php
languages/messages/MessagesQu.php
languages/messages/MessagesQug.php
languages/messages/MessagesSv.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTe.php
languages/messages/MessagesUk.php
languages/messages/MessagesZea.php
maintenance/Maintenance.php
maintenance/addSite.php [new file with mode: 0755]
maintenance/archives/patch-archive-ar_id.sql
maintenance/archives/patch-categorylinks-better-collation.sql
maintenance/archives/patch-externallinks-el_id.sql
maintenance/archives/patch-image-user-index-2.sql [new file with mode: 0644]
maintenance/archives/patch-image-user-index.sql
maintenance/archives/patch-rename-ar_usertext_timestamp.sql [new file with mode: 0644]
maintenance/archives/patch-up_property.sql
maintenance/archives/upgradeLogging.php
maintenance/backup.inc
maintenance/backupPrefetch.inc
maintenance/benchmarks/Benchmarker.php
maintenance/benchmarks/README
maintenance/benchmarks/australia-untidy.html.gz [new file with mode: 0644]
maintenance/benchmarks/bench_HTTP_HTTPS.php
maintenance/benchmarks/bench_Wikimedia_base_convert.php
maintenance/benchmarks/bench_delete_truncate.php
maintenance/benchmarks/bench_if_switch.php
maintenance/benchmarks/bench_strtr_str_replace.php
maintenance/benchmarks/bench_utf8_title_check.php
maintenance/benchmarks/bench_wfIsWindows.php
maintenance/benchmarks/benchmarkCSSMin.php [new file with mode: 0644]
maintenance/benchmarks/benchmarkHooks.php
maintenance/benchmarks/benchmarkTidy.php [new file with mode: 0644]
maintenance/benchmarks/cssmin/circle.svg [new file with mode: 0644]
maintenance/benchmarks/cssmin/styles.css [new file with mode: 0644]
maintenance/benchmarks/cssmin/wiki.png [new file with mode: 0644]
maintenance/cleanupImages.php
maintenance/cleanupInvalidDbKeys.php [new file with mode: 0644]
maintenance/cleanupRemovedModules.php
maintenance/cleanupTitles.php
maintenance/convertUserOptions.php
maintenance/createCommonPasswordCdb.php
maintenance/deleteOrphanedRevisions.php
maintenance/deleteRevision.php
maintenance/dictionary/mediawiki.dic
maintenance/dumpIterator.php
maintenance/dumpTextPass.php
maintenance/eval.php
maintenance/fetchText.php
maintenance/fixDoubleRedirects.php
maintenance/generateSitemap.php
maintenance/getLagTimes.php
maintenance/hhvm/makeRepo.php
maintenance/importImages.php
maintenance/initUserPreference.php [new file with mode: 0644]
maintenance/jsduck/categories.json
maintenance/jsduck/eg-iframe.html
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toSimp.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/migrateUserGroup.php
maintenance/mssql/archives/patch-alter-table-oldimage.sql [new file with mode: 0644]
maintenance/mssql/tables.sql
maintenance/mwdoc-filter.php
maintenance/mwdocgen.php
maintenance/namespaceDupes.php
maintenance/oracle/alterSharedConstraints.php
maintenance/orphans.php
maintenance/parse.php
maintenance/populateContentModel.php
maintenance/populateRecentChangesSource.php
maintenance/populateRevisionLength.php
maintenance/populateRevisionSha1.php
maintenance/purgeChangedPages.php
maintenance/purgeModuleDeps.php [new file with mode: 0644]
maintenance/rebuildFileCache.php
maintenance/rebuildImages.php
maintenance/rebuildrecentchanges.php
maintenance/rebuildtextindex.php
maintenance/refreshFileHeaders.php
maintenance/refreshImageMetadata.php
maintenance/refreshLinks.php
maintenance/resources/update-oojs-ui.sh
maintenance/runBatchedQuery.php
maintenance/shell.php
maintenance/sql.php
maintenance/sqlite.inc
maintenance/sqlite/archives/initial-indexes.sql
maintenance/storage/fixBug20757.php [deleted file]
maintenance/storage/fixT22757.php [new file with mode: 0644]
maintenance/storage/trackBlobs.php
maintenance/tables.sql
maintenance/update.php
maintenance/updateCollation.php
maintenance/updateCredits.php
maintenance/userDupes.inc
mw-config/config.css
package.json
phpcs.xml
resources/Resources.php
resources/ResourcesOOUI.php
resources/lib/es5-shim/es5-shim.js [deleted file]
resources/lib/jquery.ui/PATCHES [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.core.js
resources/lib/jquery.ui/jquery.ui.widget.js
resources/lib/jquery.ui/themes/smoothness/PATCHES [deleted file]
resources/lib/jquery/jquery.migrate.js [new file with mode: 0644]
resources/lib/jquery/jquery3.js [new file with mode: 0644]
resources/lib/oojs-ui/i18n/af.json
resources/lib/oojs-ui/i18n/bqi.json
resources/lib/oojs-ui/i18n/br.json
resources/lib/oojs-ui/i18n/bs.json
resources/lib/oojs-ui/i18n/jv.json
resources/lib/oojs-ui/i18n/mg.json
resources/lib/oojs-ui/i18n/nn.json
resources/lib/oojs-ui/i18n/pnb.json
resources/lib/oojs-ui/i18n/sr-ec.json
resources/lib/oojs-ui/i18n/yi.json
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-apex.js.map [new file with mode: 0644]
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-core.js.map [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js.map [new file with mode: 0644]
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-toolbars.js.map [new file with mode: 0644]
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-widgets.js.map [new file with mode: 0644]
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/oojs-ui-windows.js.map [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/icons-alerts.json
resources/lib/oojs-ui/themes/apex/icons-content.json
resources/lib/oojs-ui/themes/apex/icons-editing-advanced.json
resources/lib/oojs-ui/themes/apex/icons-editing-styling.json
resources/lib/oojs-ui/themes/apex/icons-interactions.json
resources/lib/oojs-ui/themes/apex/icons-layout.json [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/icons-moderation.json
resources/lib/oojs-ui/themes/apex/icons-movement.json
resources/lib/oojs-ui/themes/apex/icons.json
resources/lib/oojs-ui/themes/apex/images/icons/articles-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/articles-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/beta.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/beta.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/caret-ltr.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/caret-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/caret-rtl.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/caret-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/caretDown.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/caretDown.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/caretUp.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/caretUp.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/case-sensitive.svg
resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/clip.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/clip.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/close.svg
resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/move-end-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/move-end-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/move-end-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/move-end-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/pushPin.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/pushPin.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/search.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/search.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/subtract.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/subtract.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/unClip.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/unClip.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/icons-alerts.json
resources/lib/oojs-ui/themes/mediawiki/icons-content.json
resources/lib/oojs-ui/themes/mediawiki/icons-editing-advanced.json
resources/lib/oojs-ui/themes/mediawiki/icons-editing-styling.json
resources/lib/oojs-ui/themes/mediawiki/icons-interactions.json
resources/lib/oojs-ui/themes/mediawiki/icons-layout.json
resources/lib/oojs-ui/themes/mediawiki/icons-location.json
resources/lib/oojs-ui/themes/mediawiki/icons-moderation.json
resources/lib/oojs-ui/themes/mediawiki/icons-movement.json
resources/lib/oojs-ui/themes/mediawiki/icons-wikimedia.json
resources/lib/oojs-ui/themes/mediawiki/icons.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/articles-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/clip.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/clip.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/indicators.json
resources/lib/oojs/oojs.jquery.js
resources/src/dom-level2-skip.js [deleted file]
resources/src/es5-skip.js [deleted file]
resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.head-ltr.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.head-rtl.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png [deleted file]
resources/src/jquery/jquery.arrowSteps.css [deleted file]
resources/src/jquery/jquery.arrowSteps.js [deleted file]
resources/src/jquery/jquery.color.js
resources/src/jquery/jquery.colorUtil.js
resources/src/jquery/jquery.getAttrs.js
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.mwExtension.js
resources/src/jquery/jquery.placeholder.js
resources/src/jquery/jquery.qunit.completenessTest.js [deleted file]
resources/src/jquery/jquery.suggestions.js
resources/src/jquery/jquery.tablesorter.js
resources/src/jquery/jquery.tablesorter.less
resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
resources/src/mediawiki.action/mediawiki.action.edit.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.edit.styles.css
resources/src/mediawiki.action/mediawiki.action.history.css
resources/src/mediawiki.action/mediawiki.action.view.categoryPage.less
resources/src/mediawiki.action/mediawiki.action.view.postEdit.css [deleted file]
resources/src/mediawiki.action/mediawiki.action.view.postEdit.js
resources/src/mediawiki.action/mediawiki.action.view.postEdit.less [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css
resources/src/mediawiki.action/templates/postEdit.html [deleted file]
resources/src/mediawiki.language/specialcharacters.json
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/oldshared.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.legacy/wikibits.js
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.less/mediawiki.mixins.rotation.less
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.libs/mediawiki.libs.jpegmeta.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.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/dm/mw.rcfilters.dm.ItemModel.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/images/clip.svg [new file with mode: 0644]
resources/src/mediawiki.rcfilters/images/pending.gif [new file with mode: 0644]
resources/src/mediawiki.rcfilters/images/pushPin.svg [new file with mode: 0644]
resources/src/mediawiki.rcfilters/images/unClip.svg [new file with mode: 0644]
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/mw.rcfilters.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.mixins.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less [deleted file]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less [deleted file]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less [deleted file]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less [deleted file]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuHeaderWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.monobook.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuSectionOptionWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FiltersListWidget.less [deleted file]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FloatingMenuSelectWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.TagItemWidget.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js [deleted file]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js [deleted file]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterGroupWidget.js [deleted file]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js [deleted file]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagItemWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FiltersListWidget.js [deleted file]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FloatingMenuSelectWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ItemMenuOptionWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.TagItemWidget.js [new file with mode: 0644]
resources/src/mediawiki.router/index.js
resources/src/mediawiki.skinning/content.externallinks.css
resources/src/mediawiki.skinning/content.parsoid.less
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.skinning/interface.css
resources/src/mediawiki.special/images/special.search/book-icon.png [deleted file]
resources/src/mediawiki.special/images/special.search/book-icon.svg [deleted file]
resources/src/mediawiki.special/images/special.search/course-icon.png [deleted file]
resources/src/mediawiki.special/images/special.search/course-icon.svg [deleted file]
resources/src/mediawiki.special/images/special.search/definition-icon.png [deleted file]
resources/src/mediawiki.special/images/special.search/definition-icon.svg [deleted file]
resources/src/mediawiki.special/images/special.search/dna-icon.png [deleted file]
resources/src/mediawiki.special/images/special.search/dna-icon.svg [deleted file]
resources/src/mediawiki.special/images/special.search/image-icon.png [deleted file]
resources/src/mediawiki.special/images/special.search/image-icon.svg [deleted file]
resources/src/mediawiki.special/images/special.search/news-icon.png [deleted file]
resources/src/mediawiki.special/images/special.search/news-icon.svg [deleted file]
resources/src/mediawiki.special/images/special.search/quotation-icon.png [deleted file]
resources/src/mediawiki.special/images/special.search/quotation-icon.svg [deleted file]
resources/src/mediawiki.special/images/special.search/textbook-icon.png [deleted file]
resources/src/mediawiki.special/images/special.search/textbook-icon.svg [deleted file]
resources/src/mediawiki.special/images/special.search/travel-icon.png [deleted file]
resources/src/mediawiki.special/images/special.search/travel-icon.svg [deleted file]
resources/src/mediawiki.special/mediawiki.special.apisandbox.css
resources/src/mediawiki.special/mediawiki.special.apisandbox.js
resources/src/mediawiki.special/mediawiki.special.block.css [deleted file]
resources/src/mediawiki.special/mediawiki.special.changecredentials.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.comparepages.styles.less
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.newFiles.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js
resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less
resources/src/mediawiki.special/mediawiki.special.search.styles.css
resources/src/mediawiki.special/mediawiki.special.userlogin.common.css
resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js
resources/src/mediawiki.toolbar/toolbar.js
resources/src/mediawiki.toolbar/toolbar.less
resources/src/mediawiki.ui/components/anchors.less
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/forms.less
resources/src/mediawiki.ui/components/icons.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.ui/components/radio.less
resources/src/mediawiki.ui/components/text.less
resources/src/mediawiki.ui/default.less
resources/src/mediawiki.widgets.datetime/CalendarWidget.less
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.less
resources/src/mediawiki.widgets.datetime/ProlepticGregorianDateTimeFormatter.js
resources/src/mediawiki.widgets.datetime/mediawiki.widgets.datetime.definitions.less
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less
resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js [deleted file]
resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less
resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.base.css [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js
resources/src/mediawiki/api.js
resources/src/mediawiki/api/watch.js
resources/src/mediawiki/htmlform/hide-if.js
resources/src/mediawiki/htmlform/htmlform.Checker.js [new file with mode: 0644]
resources/src/mediawiki/htmlform/styles.css
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.Upload.Dialog.js
resources/src/mediawiki/mediawiki.Uri.js
resources/src/mediawiki/mediawiki.confirmCloseWindow.js
resources/src/mediawiki/mediawiki.diff.styles.css
resources/src/mediawiki/mediawiki.experiments.js
resources/src/mediawiki/mediawiki.filewarning.less
resources/src/mediawiki/mediawiki.helplink.less
resources/src/mediawiki/mediawiki.hlist.css
resources/src/mediawiki/mediawiki.icon.less
resources/src/mediawiki/mediawiki.inspect.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.log.js
resources/src/mediawiki/mediawiki.notification.css
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.pager.tablePager.less
resources/src/mediawiki/mediawiki.requestIdleCallback.js
resources/src/mediawiki/mediawiki.storage.js
resources/src/mediawiki/mediawiki.toc.js
resources/src/mediawiki/mediawiki.toc.print.css
resources/src/mediawiki/mediawiki.user.blockcookie.js [deleted file]
resources/src/mediawiki/mediawiki.user.js
resources/src/mediawiki/mediawiki.util.js
resources/src/mediawiki/page/gallery-slideshow.js
resources/src/mediawiki/page/ready.js
resources/src/mediawiki/page/startup.js
resources/src/mediawiki/page/watch.js
resources/src/moment-locale-overrides.js
resources/src/polyfill-nodeTypes.js [deleted file]
resources/src/polyfill-object-create.js [deleted file]
resources/src/startup.js
tests/.gitignore [deleted file]
tests/browser/README.mediawiki [deleted file]
tests/browser/ci.yml [deleted file]
tests/browser/environments.yml [deleted file]
tests/browser/features/create_account.feature [deleted file]
tests/browser/features/create_and_follow_wiki_link.feature [deleted file]
tests/browser/features/edit_page.feature [deleted file]
tests/browser/features/file.feature [deleted file]
tests/browser/features/login.feature [deleted file]
tests/browser/features/main_page_links.feature [deleted file]
tests/browser/features/preferences.feature [deleted file]
tests/browser/features/step_definitions/create_account_steps.rb [deleted file]
tests/browser/features/step_definitions/create_and_follow_wiki_link_steps.rb [deleted file]
tests/browser/features/step_definitions/edit_page_steps.rb [deleted file]
tests/browser/features/step_definitions/file_steps.rb [deleted file]
tests/browser/features/step_definitions/login_steps.rb [deleted file]
tests/browser/features/step_definitions/main_page_links_steps.rb [deleted file]
tests/browser/features/step_definitions/preferences_appearance_steps.rb [deleted file]
tests/browser/features/step_definitions/preferences_editing_steps.rb [deleted file]
tests/browser/features/step_definitions/preferences_user_profile_steps.rb [deleted file]
tests/browser/features/step_definitions/view_history_steps.rb [deleted file]
tests/browser/features/support/env.rb [deleted file]
tests/browser/features/support/hooks.rb [deleted file]
tests/browser/features/support/pages/create_account_page.rb [deleted file]
tests/browser/features/support/pages/edit_page.rb [deleted file]
tests/browser/features/support/pages/file_does_not_exist_page.rb [deleted file]
tests/browser/features/support/pages/login_page.rb [deleted file]
tests/browser/features/support/pages/main_page.rb [deleted file]
tests/browser/features/support/pages/preferences_appearance_page.rb [deleted file]
tests/browser/features/support/pages/preferences_editing_page.rb [deleted file]
tests/browser/features/support/pages/preferences_page.rb [deleted file]
tests/browser/features/support/pages/preferences_user_profile_page.rb [deleted file]
tests/browser/features/support/pages/view_history_page.rb [deleted file]
tests/browser/features/support/pages/ztargetpage.rb [deleted file]
tests/browser/features/view_history.feature [deleted file]
tests/common/TestsAutoLoader.php
tests/integration/includes/http/MWHttpRequestTestCase.php
tests/parser/DbTestPreviewer.php
tests/parser/DbTestRecorder.php
tests/parser/ParserTestRunner.php
tests/parser/extraParserTests.txt
tests/parser/parserTests.txt
tests/parser/preprocess/All_system_messages.expected
tests/parser/preprocess/All_system_messages.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/autoload.ide.php
tests/phpunit/data/helpers/WellProtectedClass.php [deleted file]
tests/phpunit/data/media/adobergb.jpg [new file with mode: 0644]
tests/phpunit/data/media/missingprofile.jpg [new file with mode: 0644]
tests/phpunit/data/media/srgb.jpg
tests/phpunit/data/media/tinyrgb.jpg
tests/phpunit/data/resourceloader/oouiimagemodule/apex/icons.json [new file with mode: 0644]
tests/phpunit/data/resourceloader/oouiimagemodule/apex/images/icons/search.svg [new file with mode: 0644]
tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/icons.json [new file with mode: 0644]
tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/images/icons/search.svg [new file with mode: 0644]
tests/phpunit/includes/AutopromoteTest.php [new file with mode: 0644]
tests/phpunit/includes/CollationTest.php [deleted file]
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/FauxRequestTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MWTimestampTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PrefixSearchTest.php
tests/phpunit/includes/ReadOnlyModeTest.php [new file with mode: 0644]
tests/phpunit/includes/Services/ServiceContainerTest.php
tests/phpunit/includes/TemplateCategoriesTest.php
tests/phpunit/includes/TemplateParserTest.php
tests/phpunit/includes/TestingAccessWrapper.php [deleted file]
tests/phpunit/includes/TestingAccessWrapperTest.php [deleted file]
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php
tests/phpunit/includes/WatchedItemStoreUnitTest.php
tests/phpunit/includes/WatchedItemUnitTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiBaseTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/api/ApiLoginTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiMessageTest.php
tests/phpunit/includes/api/ApiPageSetTest.php
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/auth/AbstractAuthenticationProviderTest.php
tests/phpunit/includes/auth/AbstractPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/AbstractPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/AbstractSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/auth/AuthPluginPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/AuthenticationRequestTest.php
tests/phpunit/includes/auth/CheckBlocksSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/ConfirmLinkSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php
tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/RememberMeAuthenticationRequestTest.php
tests/phpunit/includes/auth/ResetPasswordSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/ThrottlePreAuthenticationProviderTest.php
tests/phpunit/includes/auth/ThrottlerTest.php
tests/phpunit/includes/changes/ChangesListBooleanFilterGroupTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/ChangesListBooleanFilterTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/ChangesListFilterGroupTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/ChangesListFilterTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/ChangesListStringOptionsFilterGroupTest.php [new file with mode: 0644]
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/collation/CollationTest.php [new file with mode: 0644]
tests/phpunit/includes/collation/CustomUppercaseCollationTest.php [new file with mode: 0644]
tests/phpunit/includes/config/EtcdConfigTest.php [new file with mode: 0644]
tests/phpunit/includes/config/GlobalVarConfigTest.php
tests/phpunit/includes/config/MultiConfigTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/FileContentHandlerTest.php
tests/phpunit/includes/content/TextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/debug/logger/MonologSpiTest.php
tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
tests/phpunit/includes/debug/logger/monolog/LineFormatterTest.php
tests/phpunit/includes/deferred/CdnCacheUpdateTest.php
tests/phpunit/includes/deferred/DeferredUpdatesTest.php
tests/phpunit/includes/exception/MWExceptionTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filebackend/SwiftFileBackendTest.php
tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
tests/phpunit/includes/filerepo/RepoGroupTest.php
tests/phpunit/includes/filerepo/file/FileTest.php
tests/phpunit/includes/http/HttpTest.php
tests/phpunit/includes/interwiki/ClassicInterwikiLookupTest.php
tests/phpunit/includes/interwiki/InterwikiLookupAdapterTest.php
tests/phpunit/includes/interwiki/InterwikiTest.php
tests/phpunit/includes/jobqueue/JobTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/DnsSrvDiscovererTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/MemoizedCallableTest.php
tests/phpunit/includes/libs/ObjectFactoryTest.php
tests/phpunit/includes/libs/SamplingStatsdClientTest.php
tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php
tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php
tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php
tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php [deleted file]
tests/phpunit/includes/linker/LinkRendererFactoryTest.php
tests/phpunit/includes/logging/DeleteLogFormatterTest.php
tests/phpunit/includes/logging/LogFormatterTest.php
tests/phpunit/includes/logging/NewUsersLogFormatterTest.php
tests/phpunit/includes/mail/MailAddressTest.php
tests/phpunit/includes/media/ExifBitmapTest.php
tests/phpunit/includes/media/ExifTest.php
tests/phpunit/includes/media/JpegTest.php
tests/phpunit/includes/media/MediaHandlerTest.php
tests/phpunit/includes/media/XCFTest.php
tests/phpunit/includes/media/XContentDimensionsTest.php [new file with mode: 0644]
tests/phpunit/includes/objectcache/ObjectCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/objectcache/RESTBagOStuffTest.php
tests/phpunit/includes/objectcache/RedisBagOStuffTest.php
tests/phpunit/includes/page/WikiPageTest.php
tests/phpunit/includes/pager/RangeChronologicalPagerTest.php [new file with mode: 0644]
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/ParserPreloadTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/password/UserPasswordPolicyTest.php
tests/phpunit/includes/rcfeed/RCFeedIntegrationTest.php
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderOOUIImageModuleTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/search/SearchEnginePrefixTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/search/SearchIndexFieldTest.php
tests/phpunit/includes/session/BotPasswordSessionProviderTest.php
tests/phpunit/includes/session/CookieSessionProviderTest.php
tests/phpunit/includes/session/ImmutableSessionProviderWithCookieTest.php
tests/phpunit/includes/session/PHPSessionHandlerTest.php
tests/phpunit/includes/session/SessionBackendTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/session/SessionProviderTest.php
tests/phpunit/includes/session/SessionTest.php
tests/phpunit/includes/session/TestBagOStuff.php
tests/phpunit/includes/session/TestUtils.php
tests/phpunit/includes/session/TokenTest.php
tests/phpunit/includes/site/SiteExporterTest.php
tests/phpunit/includes/site/SiteImporterTest.php
tests/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php [new file with mode: 0644]
tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/SpecialPreferencesTest.php
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/specials/SpecialWatchlistTest.php
tests/phpunit/includes/tidy/BalancerTest.php
tests/phpunit/includes/tidy/RemexDriverTest.php [new file with mode: 0644]
tests/phpunit/includes/title/NaiveImportTitleFactoryTest.php
tests/phpunit/includes/title/NamespaceAwareForeignTitleFactoryTest.php
tests/phpunit/includes/title/NamespaceImportTitleFactoryTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/user/BotPasswordTest.php
tests/phpunit/includes/user/CentralIdLookupTest.php
tests/phpunit/includes/user/PasswordResetTest.php
tests/phpunit/includes/user/UserGroupMembershipTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/utils/UIDGeneratorTest.php
tests/phpunit/languages/LanguageCodeTest.php [new file with mode: 0644]
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/mocks/MockChangesListFilter.php [new file with mode: 0644]
tests/phpunit/mocks/MockChangesListFilterGroup.php [new file with mode: 0644]
tests/phpunit/structure/ApiDocumentationTest.php
tests/phpunit/structure/ContentHandlerSanityTest.php
tests/phpunit/suite.xml
tests/phpunit/tests/MediaWikiTestCaseTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
tests/qunit/suites/resources/jquery/jquery.placeholder.test.js [deleted file]
tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/qunit/suites/resources/startup.test.js
tests/selenium/.eslintrc.json [new file with mode: 0644]
tests/selenium/README.md [new file with mode: 0644]
tests/selenium/pageobjects/createaccount.page.js [new file with mode: 0644]
tests/selenium/pageobjects/edit.page.js [new file with mode: 0644]
tests/selenium/pageobjects/history.page.js [new file with mode: 0644]
tests/selenium/pageobjects/page.js [new file with mode: 0644]
tests/selenium/pageobjects/preferences.page.js [new file with mode: 0644]
tests/selenium/pageobjects/userlogin.page.js [new file with mode: 0644]
tests/selenium/pageobjects/userlogout.page.js [new file with mode: 0644]
tests/selenium/specs/page.js [new file with mode: 0644]
tests/selenium/specs/user.js [new file with mode: 0644]
tests/selenium/wdio.conf.jenkins.js [new file with mode: 0644]
tests/selenium/wdio.conf.js [new file with mode: 0644]
thumb.php

index b2c4d45..a82ae21 100644 (file)
@@ -72,3 +72,4 @@ Thumbs.db
 /.htaccess
 /.htpasswd
 /tests/phan/issues
+*.rej
index 232824d..e649fb1 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -32,6 +32,7 @@ addshore <addshorewiki@gmail.com>
 Aditya Sastry <ganeshaditya1@gmail.com>
 Adrian Heine <adrian.heine@wikimedia.de>
 Alex Z. <mrzmanwiki@gmail.com> <mrzman@users.mediawiki.org>
+Aleksey Bekh-Ivanov <aleksey.bekh-ivanov@wikimedia.de>
 Alexandre Emsenhuber <ialex.wiki@gmail.com>
 Alexandre Emsenhuber <ialex.wiki@gmail.com> <ialex@users.mediawiki.org>
 Alexandre Emsenhuber <ialex.wiki@gmail.com> <mediawiki@emsenhuber.ch>
@@ -131,6 +132,7 @@ Dereckson <dereckson@espace-win.org>
 Derk-Jan Hartman <hartman@videolan.org>
 Derk-Jan Hartman <hartman@videolan.org> <hartman.wiki@gmail.com>
 Derk-Jan Hartman <hartman@videolan.org> <hartman@users.mediawiki.org>
+Devi Krishnan <devikrishnan67@gmail.com>
 Diederik van Liere <dvanliere@gmail.com> <diederik@users.mediawiki.org>
 Domas Mituzas <domas.mituzas@gmail.com> <midom@users.mediawiki.org>
 Douglas Gardner <douglas@chippy.ch>
@@ -194,6 +196,7 @@ Jackmcbarn <jackmcbarn@gmail.com>
 Jackmcbarn <jackmcbarn@gmail.com> <jackmcbarn@users.noreply.github.com>
 jagori <jagori79@gmail.com>
 James Forrester <jforrester@wikimedia.org>
+Jaime Crespo <jcrespo@wikimedia.org>
 Jan Gerber <j@thing.net> <j@users.mediawiki.org>
 Jan Luca Naumann <jan@jans-seite.de>
 Jan Luca Naumann <jan@jans-seite.de> <jan@users.mediawiki.org>
@@ -407,9 +410,11 @@ Steven Walling <swalling@wikimedia.org>
 Subramanya Sastry <ssastry@wikimedia.org>
 Sucheta Ghoshal <sghoshal@wikimedia.org>
 Sumit Asthana <asthana.sumit23@gmail.com>
+TerraCodes <terracodes@tools.wmflabs.org>
 Thalia Chan <thalia@cantorion.org>
-Thiemo Mättig (WMDE) <thiemo.maettig@wikimedia.de>
-Thiemo Mättig (WMDE) <thiemo.maettig@wikimedia.de> <mr.heat@gmx.de>
+Thalia Chan <thalia@cantorion.org> <thalia.e.chan@googlemail.com>
+Thiemo Mättig <thiemo.maettig@wikimedia.de>
+Thiemo Mättig <thiemo.maettig@wikimedia.de> <mr.heat@gmx.de>
 This, that and the other <at.light@live.com.au>
 tholam <t.lam@lamsinfosystem.com>
 Thomas Bleher <ThomasBleher@gmx.de> <tbleher@users.mediawiki.org>
diff --git a/.rubocop.yml b/.rubocop.yml
deleted file mode 100644 (file)
index 5b6c3f2..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-AllCops:
-  Exclude:
-    - 'extensions/**/*'
-    - 'node_modules/**/*'
-    - 'skins/**/*'
-    - 'tests/frontend/node_modules/**/*'
-    - 'vendor/**/*'
-  StyleGuideCopsOnly: true
-
-Metrics/LineLength:
-  Max: 100
-
-Metrics/MethodLength:
-  Enabled: false
-
-Style/Alias:
-  Enabled: false
-
-Style/SignalException:
-  Enabled: false
-
-Style/StringLiterals:
-  EnforcedStyle: single_quotes
-
-Style/TrivialAccessors:
-  ExactNameMatch: true
index 5a7b29f..27e289d 100644 (file)
@@ -1,15 +1,8 @@
 {
        "extends": "stylelint-config-wikimedia",
        "rules": {
-               "declaration-no-important": null,
-
                "no-descending-specificity": null,
 
-               "selector-no-id": null,
-               "selector-pseudo-element-colon-notation": null,
-
-               "string-quotes": null,
-
-               "value-keyword-case": null
+               "selector-no-id": null
        }
 }
index 5e2c7a0..baf7f03 100644 (file)
@@ -31,6 +31,11 @@ matrix:
       php: hhvm-3.12
     - env: dbtype=mysql dbuser=root
       php: 7
+  allow_failures:
+    # Postgres support for unit tests is still buggy
+    # https://phabricator.wikimedia.org/T75174
+    - env: dbtype=postgres dbuser=travis
+      php: 5.5
 
 services:
   - mysql
diff --git a/CREDITS b/CREDITS
index b37edf2..14c454e 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,5 +1,5 @@
 {{int:version-credits-summary}} <!--
-MediaWiki 1.28 is a collaborative project released under the
+MediaWiki 1.29 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.
 
@@ -16,6 +16,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Aashaka Shah
 * abhinand
 * Abhishek Das
+* Ad Huikeshoven
 * Adam Miller
 * Adam Roses Wight
 * addshore
@@ -23,12 +24,14 @@ The following list can be found parsed under Special:Version/Credits -->
 * Adrian Heine
 * Adrian Lang
 * Ævar Arnfjörð Bjarmason
+* Aftab
 * Agbad
 * Ahmad Sherif
 * Ajayrahul P
 * Alangi Derick
 * Albert221
 * Alejandro Mery
+* Aleksey Bekh-Ivanov
 * AlephNull
 * Alex Ivanov
 * Alex Shih-Han Lin
@@ -42,9 +45,11 @@ The following list can be found parsed under Special:Version/Credits -->
 * Amalthea
 * Amir E. Aharoni
 * Amir Sarabadani
+* amritsreekumar
 * ananay
 * Anders Wegge Jakobsen
 * Andre Engels
+* Andre Klapper
 * Andrew Bogott
 * Andrew Dunbar
 * Andrew Garrett
@@ -70,6 +75,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Aryeh Gregor
 * Asher Feldman
 * Asier Lostalé
+* awu42
 * ayush_garg
 * Azliq7
 * Bagariavivek
@@ -86,6 +92,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Bill Traynor
 * Billinghurst
 * billm
+* blackspirit96
 * blotmandroid
 * Bogdan Stancescu
 * Boris Nagaev
@@ -116,9 +123,11 @@ The following list can be found parsed under Special:Version/Credits -->
 * Chris McMahon
 * Chris Seaton
 * Chris Steipp
+* Chrisludt
 * Christian Aistleitner
 * Christian List
 * Christian Neubauer
+* Christoph Jauera
 * Christopher Johnson
 * church of emacs
 * Cindy Cicalese
@@ -145,7 +154,9 @@ The following list can be found parsed under Special:Version/Credits -->
 * Darian Anthony Patrick
 * Darkdragon09
 * DaSch
+* datguy
 * David Baumgarten
+* David Causse
 * David Chan
 * David E. Narváez
 * David Lynch
@@ -161,17 +172,20 @@ The following list can be found parsed under Special:Version/Credits -->
 * Dévai Tamás
 * Devi Krishnan
 * Diederik van Liere
+* divadsn
 * Domas Mituzas
 * Douglas Gardner
 * DPStokesNZ
 * dr0ptp4kt
 * Ebrahim Byagowi
 * Ed Sanders
+* Eddie Greiner-Petter
 * Edward Chernenko
 * Edward Z. Yang
 * Elisabeth Bauer
 * Elliott Eggleston
 * Elvis Stansvik
+* Emad Elwany
 * Emil Podlaszewski
 * Emmanuel Engelhart
 * Emmanuel Gil Peyrot
@@ -188,6 +202,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Erik Moeller
 * Erwin Dokter
 * Étienne Beaulé
+* Eugene Gvozdetsky
 * Evan McIntire
 * Evan Prodromou
 * ExplosiveHippo
@@ -207,6 +222,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * georggi
 * Gergő Tisza
 * Gero Scholz
+* Ghybu
 * gicode
 * Giftpflanze
 * Gilles Dubuc
@@ -220,6 +236,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Grunny
 * Guillaume Blanchard
 * Guy Van den Broeck
+* Haikal Izzuddin
 * Happy-melon
 * haritha28
 * Harry Burt
@@ -243,6 +260,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Jacob Block
 * Jacob Clark
 * jagori
+* Jaime Crespo
 * Jakub Vrana
 * James Earl Douglas
 * James Forrester
@@ -259,6 +277,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Jaska Zedlik
 * Jason Richey
 * jeblad
+* Jeff Hobson
 * Jeff Janes
 * jeff303
 * Jens Frank
@@ -275,12 +294,15 @@ The following list can be found parsed under Special:Version/Credits -->
 * Jidanni
 * Jimmy Collins
 * Jimmy Xu
+* jo12bar
 * joakin
 * Joan Creus
 * Joel Natividad
+* Joel Sahleen
 * Joerg
 * Johan Dahlin
 * John Du Hart
+* John Erling Blad
 * John N
 * Jon Harald Søby
 * Jon Robson
@@ -293,6 +315,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * JuneHyeon Bae
 * Jure Kajzer
 * Justin Du
+* Kai Nissen
 * Kai_WMDE
 * kaligula
 * Kartik Mistry
@@ -329,15 +352,18 @@ The following list can be found parsed under Special:Version/Credits -->
 * Liam Edwards-Playne
 * liangent
 * Lisa Ridley
+* Liuxinyu970226
 * Ljudusika
 * Lojjik Braughler
 * Louperivois
 * Ltrlg
 * Luc Van Oostenryck
 * Lucas Garczewski
+* Lucas Werkmeister
 * Luigi Corsaro
 * Luis Felipe Schenone
 * Luke Faraone
+* Luke Welling
 * Lupin
 * Lupo
 * lwelling
@@ -345,6 +371,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Madman
 * madurangasiriwardena
 * Magnus Manske
+* mainframe98
 * Manuel Menal
 * Manuel Schneider
 * Marc Ordinas i Llopis
@@ -366,6 +393,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Martin Urbanec
 * Massaf
 * Matěj Grabovský
+* Matěj Suchánek
 * matejsuchanek
 * Mathias Ertl
 * mati
@@ -375,6 +403,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Matthew Bowker
 * Matthew Britton
 * Matthew Flaschen
+* Matthew Walker
 * Matthias Jordan
 * Matthias Mullie
 * MatthiasDD
@@ -398,6 +427,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Michał Roszka
 * Michał Zieliński
 * Mike Horvath
+* Mikhail Popov
 * Minh Nguyễn
 * MinuteElectron
 * Misza13
@@ -406,14 +436,17 @@ The following list can be found parsed under Special:Version/Credits -->
 * Mohamed Magdy
 * Molly White
 * Moriel Schottlender
+* Moritz Oberhauser
 * Mormegil
 * Mr. E23
 * MrBlueSky
 * MrPete
 * Mukunda Modell
+* MusikAnimal
 * Mwalker
 * mwjames
 * mybugs.mail
+* mynk-96
 * MZMcBride
 * nadeesha
 * Nakon
@@ -426,9 +459,10 @@ The following list can be found parsed under Special:Version/Credits -->
 * Nicholas Pisarro, Jr
 * Nick Jenkins
 * nicoco007
+* Nicolaie Constantinescu
 * Nicolas Dumazet
 * Nicolas Weeger
-* Nik
+* Niharika Kohli
 * Nik Everett
 * Niklas Laxström
 * Nikola Kovacs
@@ -442,6 +476,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Nuria Ruiz
 * Nx.devnull
 * Ocean behind ears
+* Od1n
 * Olaf Lenz
 * Olivier Finlay Beaton
 * onei
@@ -463,6 +498,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Pavel Selitskas
 * Pcoombe
 * Perside Rosalie
+* Peter Coombe
 * Peter Gehres
 * Peter Hedenskog
 * Peter Potrowl
@@ -470,6 +506,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Petr Kadlec
 * Petr Onderka
 * Petr Pchelko
+* Phantom42
 * Philip Tzou
 * physikerwelt (Moritz Schubotz)
 * PieRRoMaN
@@ -478,6 +515,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Platonides
 * Pmlineditor
 * pmolina
+* pppery
 * prageck
 * Pranav Ravichandran
 * PranavK
@@ -500,6 +538,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Ricordisamoa
 * rillke
 * River Tarnell
+* rlot
 * Roan Kattouw
 * Rob Church
 * Rob Lanphier
@@ -531,7 +570,9 @@ The following list can be found parsed under Special:Version/Credits -->
 * Salvatore Ingala
 * Sam Reed
 * Sam Smith
+* Sam Wilson
 * Santhosh Thottingal
+* saptaks
 * Schnark
 * Scimonster
 * scnd
@@ -547,6 +588,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Shahyar
 * Shane Gibbons
 * Shane King
+* shanika
 * Shinjiman
 * shirayuki
 * Sidhant Gupta
@@ -569,18 +611,21 @@ The following list can be found parsed under Special:Version/Credits -->
 * Stephen Liang
 * Steve Sanbeg
 * Steven Roddis
+* Steven Walling
 * Str4nd
+* Subin Siby
 * Subramanya Sastry
 * Sumit Asthana
 * svip
-* Swalling
 * Szymon Świerkosz
 * T.D. Corell
 * Tarquin
+* TerraCodes
+* Thalia Chan
 * The Discoverer
 * The Evil IP address
 * theopolisme
-* Thiemo Mättig (WMDE)
+* Thiemo Mättig
 * This, that and the other
 * tholam
 * Thomas Arrow
@@ -606,9 +651,11 @@ The following list can be found parsed under Special:Version/Credits -->
 * Tomasz W. Kozlowski
 * Tomasz Wegrzanowski
 * tomek
+* Toni Hermoso Pulido
 * Tony Thomas
 * Tpt
 * Trevor Parscal
+* Trey Jones
 * TyA
 * Tychay
 * Tyler Anthony Romeo
@@ -620,6 +667,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * utkarsh95
 * Van de Bugger
 * Viačeslav
+* Victor Barbu
 * Victor Porton
 * Victor Vasiliev
 * victorbarbu
@@ -641,10 +689,12 @@ The following list can be found parsed under Special:Version/Credits -->
 * Yaron Koren
 * Yaroslav Melnychuk
 * Yesid Carrillo
+* Yifei He
 * Yogesh K S
 * Yongmin Hong
 * yoonghm
 * Yuri Astrakhan
+* Yuriy Shnitkovskiy
 * Yusuke Matsubara
 * Yuvi Panda
 * Zachary Hauri
@@ -652,6 +702,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Željko Filipin
 * Zhaofeng Li
 * Zhengzhu Feng
+* Zhuyifei1999
 * Zppix
 * محمد شعیب
 <!-- END CONTRIBUTOR LIST -->
diff --git a/Gemfile b/Gemfile
deleted file mode 100644 (file)
index 8bbd00f..0000000
--- a/Gemfile
+++ /dev/null
@@ -1,5 +0,0 @@
-source 'https://rubygems.org'
-
-gem 'mediawiki_selenium', '~> 1.7', '>= 1.7.4'
-gem 'rake', '~> 11.1', '>= 11.1.1'
-gem 'rubocop', '~> 0.32.1', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
deleted file mode 100644 (file)
index 8243874..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-GEM
-  remote: https://rubygems.org/
-  specs:
-    ast (2.0.0)
-    astrolabe (1.3.0)
-      parser (>= 2.2.0.pre.3, < 3.0)
-    builder (3.2.2)
-    childprocess (0.5.9)
-      ffi (~> 1.0, >= 1.0.11)
-    cucumber (1.3.20)
-      builder (>= 2.1.2)
-      diff-lcs (>= 1.1.3)
-      gherkin (~> 2.12)
-      multi_json (>= 1.7.5, < 2.0)
-      multi_test (>= 0.1.2)
-    data_magic (1.0)
-      faker (>= 1.1.2)
-      yml_reader (>= 0.6)
-    diff-lcs (1.2.5)
-    domain_name (0.5.20161129)
-      unf (>= 0.0.5, < 1.0.0)
-    faker (1.7.1)
-      i18n (~> 0.5)
-    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.1)
-      faraday (>= 0.7.4, < 1.0)
-    ffi (1.9.14)
-    gherkin (2.12.2)
-      multi_json (~> 1.3)
-    headless (2.3.1)
-    http-cookie (1.0.3)
-      domain_name (~> 0.5)
-    i18n (0.7.0)
-    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.4)
-      cucumber (~> 1.3, >= 1.3.20)
-      headless (~> 2.0, >= 2.1.0)
-      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.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.2)
-      net-http-persistent (~> 2.9.4)
-      page_navigation (>= 0.9)
-      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)
-    rainbow (2.0.0)
-    rake (11.1.1)
-    rest-client (1.8.0)
-      http-cookie (>= 1.0.2, < 2.0)
-      mime-types (>= 1.16, < 3.0)
-      netrc (~> 0.7)
-    rspec-core (2.99.2)
-    rspec-expectations (2.99.2)
-      diff-lcs (>= 1.1.3, < 2.0)
-    rubocop (0.32.1)
-      astrolabe (~> 1.3)
-      parser (>= 2.2.2.5, < 3.0)
-      powerpack (~> 0.1)
-      rainbow (>= 1.99.1, < 3.0)
-      ruby-progressbar (~> 1.4)
-    ruby-progressbar (1.7.5)
-    rubyzip (1.2.0)
-    selenium-webdriver (2.53.4)
-      childprocess (~> 0.5)
-      rubyzip (~> 1.0)
-      websocket (~> 1.0)
-    syntax (1.2.1)
-    thor (0.19.4)
-    unf (0.1.4)
-      unf_ext
-    unf_ext (0.0.7.2)
-    watir-webdriver (0.9.3)
-      selenium-webdriver (>= 2.46.2)
-    websocket (1.2.3)
-    yml_reader (0.7)
-
-PLATFORMS
-  ruby
-
-DEPENDENCIES
-  mediawiki_selenium (~> 1.7, >= 1.7.4)
-  rake (~> 11.1, >= 11.1.1)
-  rubocop (~> 0.32.1)
-
-BUNDLED WITH
-   1.13.7
index 0e1c8cb..811d2c0 100644 (file)
@@ -4,6 +4,7 @@ module.exports = function ( grunt ) {
 
        var wgServer = process.env.MW_SERVER,
                wgScriptPath = process.env.MW_SCRIPT_PATH,
+               WebdriverIOconfigFile,
                karmaProxy = {};
 
        grunt.loadNpmTasks( 'grunt-banana-checker' );
@@ -13,12 +14,19 @@ module.exports = function ( grunt ) {
        grunt.loadNpmTasks( 'grunt-jsonlint' );
        grunt.loadNpmTasks( 'grunt-karma' );
        grunt.loadNpmTasks( 'grunt-stylelint' );
+       grunt.loadNpmTasks( 'grunt-webdriver' );
 
        karmaProxy[ wgScriptPath ] = {
                target: wgServer + wgScriptPath,
                changeOrigin: true
        };
 
+       if ( process.env.JENKINS_HOME ) {
+               WebdriverIOconfigFile = './tests/selenium/wdio.conf.jenkins.js';
+       } else {
+               WebdriverIOconfigFile = './tests/selenium/wdio.conf.js';
+       }
+
        grunt.initConfig( {
                eslint: {
                        all: [
@@ -80,11 +88,14 @@ module.exports = function ( grunt ) {
                                } ],
                                logLevel: 'DEBUG',
                                frameworks: [ 'qunit' ],
-                               reporters: [ 'progress' ],
+                               reporters: [ 'mocha' ],
                                singleRun: true,
                                autoWatch: false,
                                // Some tests in extensions don't yield for more than the default 10s (T89075)
-                               browserNoActivityTimeout: 60 * 1000
+                               browserNoActivityTimeout: 60 * 1000,
+                               // Karma requires Same-Origin (or CORS) by default since v1.1.1
+                               // for better stacktraces. But we load the first request from wgServer
+                               crossOriginAttribute: false
                        },
                        main: {
                                browsers: [ 'Chrome' ]
@@ -105,7 +116,15 @@ module.exports = function ( grunt ) {
                                        return require( 'path' ).join( dest, src.replace( 'resources/', '' ) );
                                }
                        }
+               },
+
+               // Configure WebdriverIO task
+               webdriver: {
+                       test: {
+                               configFile: WebdriverIOconfigFile
+                       }
                }
+
        } );
 
        grunt.registerTask( 'assert-mw-env', function () {
diff --git a/HISTORY b/HISTORY
index 7f365ac..9259814 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,377 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.29.
+Change notes from older releases. For current info see RELEASE-NOTES-1.30.
+
+= MediaWiki 1.29 =
+
+== MediaWiki 1.29.0 ==
+
+=== Configuration changes in 1.29 ===
+* 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.
+* (T158474) "Unknown user" has been added to $wgReservedUsernames.
+* (T156983) $wgRateLimitsExcludedIPs now accepts CIDR ranges as well as single IPs.
+* $wgDummyLanguageCodes is deprecated. Additional language code mappings may be
+  added to $wgExtraLanguageCodes instead.
+* (T161453) LocalisationCache will no longer use the temporary directory in it's
+  fallback chain when trying to work out where to write the cache.
+* The user right 'editusercssjs' (deprecated in 1.16) was removed. Use
+  'editusercss' and 'edituserjs' in $wgGroupPermissions and elsewhere instead.
+
+=== 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.
+* 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.
+* Expiry times can now be specified when users are added to user groups.
+* Completely new user interface for the RecentChanges page, which
+  structures filters into user-friendly groups.  This has corresponding
+  changes to how filters are registered by core and extensions.
+* The edit form now uses pretty OOjs UI buttons, checkboxes and summary input.
+  Because this change can cause problems for extensions and on-wiki
+  scripts depending on the exact HTML, the old version is still available
+  and can be used by setting $wgOOUIEditPage = false; in LocalSettings.php.
+  This will be removed later and OOjs UI will become the only option.
+  To make testing easier, users can also force either mode by adding
+  &ooui=true or &ooui=false to the action=edit URL.
+
+=== External library changes in 1.29 ===
+
+==== Upgraded external libraries ====
+* Updated QUnit from v1.22.0 to v1.23.1.
+* Updated cssjanus from v1.1.2 to v1.2.0.
+* Updated psr/log from v1.0.0 to v1.0.2.
+* Update Moment.js from v2.8.4 to v2.15.0.
+* Updated oyejorge/less.php from v1.7.0.10 to v1.7.0.14.
+* Updated monolog from v1.18.2 to 1.22.1.
+* Updated wikimedia/composer-merge-plugin from v1.3.1 to v1.4.0.
+* Updated OOjs from v1.1.10 to v2.0.0.
+* Updated jQuery from v1.11.3 to v3.2.1 (including jQuery Migrate v3.0.0).
+
+==== New external libraries ====
+* Added wikimedia/timestamp v1.0.0.
+* Added wikimedia/remex-html v1.0.1.
+
+==== 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.
+* (T27187) Search suggestions based on jquery.suggestions will now correctly only
+  highlight prefix matches in the results.
+* (T157035) "new mw.Uri()" was ignoring options when using default URI.
+* Special:Allpages can no longer be filtered by redirect in miser mode.
+* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed.
+* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect
+  to interwiki links.
+* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when
+  $wgAdvancedSearchHighlighting is true.
+* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep
+  their values out of the logs.
+* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF
+  token.
+* (T156184) SECURITY: Escape content model/format url parameter in message.
+* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD
+  declaration.
+* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory
+  in it's fallback chain when trying to work out where to write the cache.
+* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion
+  syntax's link parameter.
+* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against
+  it.
+
+=== Action API changes in 1.29 ===
+* Submitting sensitive authentication request parameters to action=login,
+  action=clientlogin, action=createaccount, action=linkaccount, and
+  action=changeauthenticationdata in the query string is now an error. They
+  should be submitted in the POST 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=purge now requires a POST.
+* There is a new `languagevariants` siprop for action=query&meta=siteinfo,
+  which returns a list of languages with active LanguageConverter instances.
+* action=query&query=allpages will no longer filter redirects using a database
+  query in miser mode. This may result in less results being returned than were
+  requested.
+
+=== 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.
+* API parameters may now be marked as "sensitive" to keep their values out of
+  the logs.
+
+=== Languages updated in 1.29 ===
+
+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):
+  ca ↔ oc; hsb ↔ dsb; io → eo; mdf → ru; pnt → el; roa-tara → it; rup → ro;
+  sh → bs, sr-el, hr.
+* (T137376) New language support: Atikamekw (atj).
+* (T163600) New language support: Dinka (din).
+* (T155957) Talk Namespaces for Javanese language (jv) have been updated.
+
+==== 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
+  to Ukrainian is not available, an English string will be shown.
+
+=== Other changes in 1.29 ===
+* Database::getSearchEngine() (deprecated in 1.28) was removed. Use
+  SearchEngineFactory::getSearchEngineClass() instead.
+* $wgSessionsInMemcached (deprecated in 1.20) was removed. No replacement is
+  required as all sessions are stored in Object Cache now.
+* MWHttpRequest::execute() should be considered to return a StatusValue; the
+  Status return type is deprecated.
+* User::edits() (deprecated in 1.21) was removed.
+* 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.
+* 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.
+* refreshLinks.php now can be limited to a particular category with --category=...
+  or a tracking category with --tracking-category=...
+* User-like objects that are passed to SpecialUserRights and its subclasses are
+  now required to have a getGroupMemberships() method. See UserRightsProxy for
+  an example.
+* User::$mGroups (instance variable) was marked private. Use User::getGroups()
+  instead.
+* User::getGroupName(), User::getGroupMember(), User:getGroupPage(),
+  User::makeGroupLinkHTML(), and User::makeGroupLinkWiki() were deprecated.
+  Use equivalent methods on the UserGroupMembership class.
+* Maintenance scripts and tests that call User::addGroup() must now ensure that
+  User objects have been added to the database prior to calling addGroup().
+* Protected function UsersPager::getGroups() was removed, and protected function
+  UsersPager::buildGroupLink() was changed from a static to an instance method.
+* The third parameter ($cache) to the UsersPagerDoBatchLookups hook was changed;
+  see docs/hooks.txt.
+* User::crypt() (deprecated in 1.24) was removed.
+* User::comparePasswords() (deprecated in 1.24) was removed.
+* ArchivedFile::getUserText() (deprecated in 1.23) was removed.
+* HTMLFileCache::newFromTitle() (deprecated in 1.24) was removed.
+* BREAKING CHANGE: Internal signature changes to ChangesListSpecialPage
+  and subclasses.  It should only break if you call buildMainQueryConds
+  (changed to buildQuery with new signature) or doMainQuery (new
+  signature).  Subclasses are likely to call at least doMainQuery
+  (possibly both), but other classes might too, because they were
+  public.
+  Also, some related hooks were deprecated, but this is not yet a
+  breaking change.
+* Removed 'jquery.arrowSteps' module. (deprecated since 1.28)
+* The 'jquery.autoEllipsis' ResourceLoader module is now deprecated.
+* WikiRevision::$fileIsTemp was deprecated.
+* WikiRevision::$importer was deprecated.
+* WikiRevision::$user was deprecated.
+* Article::getLastPurgeTimestamp(), WikiPage::getLastPurgeTimestamp(), and the
+  WikiPage::PURGE_* constants are deprecated, and the functions will always
+  return false. They were a hack for an issue that has since been fixed.
+* Hook 'EditPageBeforeEditChecks' is now deprecated. Instead use the new hook
+  'EditPageGetCheckboxesDefinition', or 'EditPage::showStandardInputs:options'
+  if you don't actually care about checkboxes and just want to add some HTML
+  to the page.
+* Selflinks are now rendered as href-less <a> tags with the class mw-selflink
+  rather than <strong> tags. The old class name, "selflink", was deprecated
+  and will be removed in a future release. (T160480)
+* (T156184) $wgRawHtml will no longer apply to internationalization messages.
+* Browser support for non-ES5 JavaScript browsers, including Android 2,
+  Opera <12.10, and Internet Explorer 9, was lowered from Grade A to Grade C.
+* Removed wikibits global methods deprecated since MediaWiki 1.17 (T122755):
+  is_gecko, is_chrome_mac, is_chrome, webkit_version, is_safari_win, is_safari,
+  webkit_match, is_ff2, ff2_bugs, is_ff2_win, is_ff2_x11, opera95_bugs,
+  opera7_bugs, opera6_bugs, is_opera_95, is_opera_preseven, is_opera,
+  ie6_bugs, clientPC, changeText, killEvt, addHandler, hookEvent,
+  addClickHandler, removeHandler, getElementsByClassName, getInnerText,
+  setupCheckboxShiftClick, addCheckboxClickHandlers, mwEditButtons,
+  mwCustomEditButtons, injectSpinner, removeSpinner, escapeQuotes,
+  escapeQuotesHTML, jsMsg, addPortletLink, appendCSS, tooltipAccessKeyPrefix,
+  tooltipAccessKeyRegexp, updateTooltipAccessKeys.
+* The ID of the <li> element containing the login link has changed from
+  'pt-login' to 'pt-login-private' in private wikis.
+* The old, neglected "bulletin board style toolbar" in the edit form is now
+  deprecated (T30856). This old code dates from 2006, and was replaced in the
+  MediaWiki release tarball and in Wikimedia production by the WikiEditor
+  extension in 2010. It is only shown to users if no other editor was
+  installed, and leads to confusion.
+* (T92459) Loading ResourceLoader modules containing JavaScript through
+  addModuleStyles() is deprecated and will log a warning server-side.
+
+= MediaWiki 1.28 =
+
+== MediaWiki 1.28.1 ==
+
+This is a security and maintenance release of the MediaWiki 1.28 branch.
+
+=== Changes since 1.28.0 ===
+
+* $wgRunJobsAsync is now false by default (T142751). This change only affects
+  wikis with $wgJobRunRate > 0.
+* Fix fatal from "WaitConditionLoop" not being found, experienced when a wiki has
+  more than one database server setup.
+* (T152717) Better escaping for PHP mail() command,
+* (T154670) A missing method causing the MySQL installer to fatal in rare
+  circumstances was restored.
+* (T154672) Un-deprecate ArticleAfterFetchContentObject hook.
+* (T158766) Avoid SQL error on MSSQL when using selectRowCount().
+* (T145635) Fix too long index error when installing with MSSQL.
+* (T156184) $wgRawHtml will no longer apply to internationalization messages.
+* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed.
+* (T154872) Fix incorrect ar_usertext_timestamp index names in new 1.28 installs.
+* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect
+  to interwiki links.
+* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when
+  $wgAdvancedSearchHighlighting is true.
+* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep
+  their values out of the logs.
+* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF
+  token.
+* (T156184) SECURITY: Escape content model/format url parameter in message.
+* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD
+  declaration.
+* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory
+  in it's fallback chain when trying to work out where to write the cache.
+* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion
+  syntax's link parameter.
+* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against
+  it.
 
 == MediaWiki 1.28 ==
 
@@ -326,6 +699,49 @@ There's usually someone online in #mediawiki on irc.freenode.net.
 
 = MediaWiki 1.27 =
 
+== MediaWiki 1.27.2 ==
+This is a security and maintenance release of the MediaWiki 1.27 branch.
+
+ApiCreateAccount was removed in 1.27.0. It was incorrectly still marked as
+deprecated (rather than already removed) in the RELEASE-NOTES at the point 1.27.0
+was released.
+
+=== Changes since 1.27.1 ===
+
+* (T68404) CSS3 attr() function with url type argument is no longer allowed
+  in inline styles.
+* $wgRunJobsAsync is now false by default (T142751). This change only affects
+  wikis with $wgJobRunRate > 0.
+* (T152717) Better escaping for PHP mail() command
+* Submitting the lgtoken and lgpassword parameters in the query string to
+  action=login is now deprecated and outputs a warning. They should be submitted
+  in the POST body instead.
+* Submitting sensitive authentication request parameters to action=clientlogin,
+  action=createaccount, action=linkaccount, and action=changeauthenticationdata
+  in the query string is now deprecated and outputs a warning. They should be
+  submitted in the POST body instead.
+* (T158766) Avoid SQL error on MSSQL when using selectRowCount()
+* (T145635) Fix too long index error when installing with MSSQL.
+* (T156184) $wgRawHtml will no longer apply to internationalization messages.
+* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed.
+* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect
+  to interwiki links.
+* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when
+  $wgAdvancedSearchHighlighting is true.
+* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep
+  their values out of the logs.
+* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF
+  token.
+* (T156184) SECURITY: Escape content model/format url parameter in message.
+* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD
+  declaration.
+* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory
+  in it's fallback chain when trying to work out where to write the cache.
+* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion
+  syntax's link parameter.
+* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against
+  it.
+
 == MediaWiki 1.27.1 ==
 
 This is a maintenance release of the MediaWiki 1.27 branch.
@@ -2670,6 +3086,32 @@ of files that are no longer available follows.
 
 = MediaWiki 1.23 =
 
+== MediaWiki 1.23.16 ==
+This is a security and maintenance release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.15 ===
+* (T68404) CSS3 attr() function with url type is no longer allowed
+  in inline styles.
+* (T156184) $wgRawHtml will no longer apply to internationalization messages.
+* Submitting the lgtoken and lgpassword parameters in the query string to
+  action=login is now deprecated and outputs a warning. They should be submitted
+  in the POST body instead.
+* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect
+  to interwiki links.
+* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when
+  $wgAdvancedSearchHighlighting is true.
+* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep
+  their values out of the logs.
+* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF
+  token.
+* (T156184) SECURITY: Escape content model/format url parameter in message.
+* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD
+  declaration.
+* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion
+  syntax's link parameter.
+* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against
+  it.
+
 == MediaWiki 1.23.15 ==
 
 This is a maintenance release of the MediaWiki 1.23 branch.
diff --git a/RELEASE-NOTES-1.29 b/RELEASE-NOTES-1.29
deleted file mode 100644 (file)
index a1ce9d9..0000000
+++ /dev/null
@@ -1,309 +0,0 @@
-== MediaWiki 1.29 ==
-
-THIS IS NOT A RELEASE YET
-
-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.
-* 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.
-* A temporary feature flag, $wgDisableUserGroupExpiry, is provided to disable
-  new features that rely on the schema changes to the user_groups table. This
-  feature flag will likely be removed before 1.29 is released.
-* (T158474) "Unknown user" has been added to $wgReservedUsernames.
-* (T156983) $wgRateLimitsExcludedIPs now accepts CIDR ranges as well as single IPs.
-
-=== 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.
-* 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.
-* Expiry times can now be specified when users are added to user groups.
-
-=== External library changes in 1.29 ===
-
-==== Upgraded external libraries ====
-* Updated QUnit from v1.22.0 to v1.23.1.
-* Updated cssjanus from v1.1.2 to 1.1.3.
-* Updated psr/log from v1.0.0 to v1.0.2.
-* Update Moment.js from v2.8.4 to v2.15.0.
-
-==== New external libraries ====
-
-==== 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.
-* (T27187) Search suggestions based on jquery.suggestions will now correctly only
-  highlight prefix matches in the results.
-* (T157035) "new mw.Uri()" was ignoring options when using default URI.
-
-=== Action API changes in 1.29 ===
-* Submitting sensitive authentication request parameters to action=login,
-  action=clientlogin, action=createaccount, action=linkaccount, and
-  action=changeauthenticationdata in the query string is now an error. They
-  should be submitted in the POST 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=purge now requires a POST.
-
-=== 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 ===
-
-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):
-  ca ↔ oc; hsb ↔ dsb; io → eo; mdf → ru; pnt → el; roa-tara → it; rup → ro;
-  sh → bs, sr-el, hr.
-* (T155957) Talk Namespaces for Javanese language (jv) have been updated.
-
-==== 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
-  to Ukrainian is not available, an English string will be shown.
-
-=== Other changes in 1.29 ===
-* Database::getSearchEngine() (deprecated in 1.28) was removed. Use
-  SearchEngineFactory::getSearchEngineClass() instead.
-* $wgSessionsInMemcached (deprecated in 1.20) was removed. No replacement is
-  required as all sessions are stored in Object Cache now.
-* MWHttpRequest::execute() should be considered to return a StatusValue; the
-  Status return type is deprecated.
-* User::edits() (deprecated in 1.21) was removed.
-* 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.
-* 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.
-* refreshLinks.php now can be limited to a particular category with --category=...
-  or a tracking category with --tracking-category=...
-* User-like objects that are passed to SpecialUserRights and its subclasses are
-  now required to have a getGroupMemberships() method. See UserRightsProxy for
-  an example.
-* User::$mGroups (instance variable) was marked private. Use User::getGroups()
-  instead.
-* User::getGroupName(), User::getGroupMember(), User:getGroupPage(),
-  User::makeGroupLinkHTML(), and User::makeGroupLinkWiki() were deprecated.
-  Use equivalent methods on the UserGroupMembership class.
-* Maintenance scripts and tests that call User::addGroup() must now ensure that
-  User objects have been added to the database prior to calling addGroup().
-* Protected function UsersPager::getGroups() was removed, and protected function
-  UsersPager::buildGroupLink() was changed from a static to an instance method.
-* The third parameter ($cache) to the UsersPagerDoBatchLookups hook was changed;
-  see docs/hooks.txt.
-* User::crypt() (deprecated in 1.24) was removed.
-* User::comparePasswords() (deprecated in 1.24) was removed.
-* ArchivedFile::getUserText() (deprecated in 1.23) was removed.
-* HTMLFileCache::newFromTitle() (deprecated in 1.24) was removed.
-
-== Compatibility ==
-
-MediaWiki 1.29 requires PHP 5.5.9 or later. There is experimental support for
-HHVM 3.6.5 or later.
-
-MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for
-Oracle and Microsoft SQL Server.
-
-The supported versions are:
-
-* MySQL 5.0.3 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-* Microsoft SQL Server 2005 (9.00.1399)
-
-== Upgrading ==
-
-1.29 has several database changes since 1.28, and will not work without schema
-updates. Note that due to changes to some very large tables like the revision
-table, the schema update may take quite long (minutes on a medium sized site,
-many hours on a large site).
-
-If upgrading from before 1.11, and you are using a wiki as a commons
-repository, make sure that it is updated as well. Otherwise, errors may arise
-due to database schema changes.
-
-If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
-1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
-with MediaWiki 1.21.
-
-Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.28.x and older releases, see HISTORY.
-
-== Online documentation ==
-
-Documentation for both end-users and site administrators is available on
-MediaWiki.org, and is covered under the GNU Free Documentation License (except
-for pages that explicitly state that their contents are in the public domain):
-
-       https://www.mediawiki.org/wiki/Special:MyLanguage/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-It's highly recommended that you sign up for one of these lists if you're
-going to run a public MediaWiki, so you can be notified of security fixes.
-
-== IRC help ==
-
-There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/RELEASE-NOTES-1.30 b/RELEASE-NOTES-1.30
new file mode 100644 (file)
index 0000000..e61277a
--- /dev/null
@@ -0,0 +1,140 @@
+== MediaWiki 1.30 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.30 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.30 ===
+* The C.UTF-8 locale should be used for $wgShellLocale, if available, to avoid
+  unexpected behavior when things use local-sensitive string comparisons. For
+  example, Scribunto considers "bar" < "Foo" in most locales since it ignores
+  case.
+* $wgShellLocale now affects LC_ALL rather than only LC_CTYPE. See
+  documentation of $wgShellLocale for details.
+* $wgJobClasses may now specify callback functions
+  as an alternative to plain class names.
+  This is intended for extensions that want control
+  over the instantiation of their jobs,
+  to allow for proper dependency injection.
+* $wgResourceModules may now specify callback functions as an alternative
+  to plain class names, using the 'factory' key in the module description
+  array. This allows dependency injection to be used for ResourceLoader modules.
+* $wgExceptionHooks has been removed.
+
+=== New features in 1.30 ===
+* (T37247) Output from Parser::parse() will now be wrapped in a div with
+  class="mw-parser-output" by default. This may be changed or disabled using
+  ParserOptions::setWrapOutputClass().
+* Added 'ChangeTagsAllowedAdd' hook, enabling extensions to allow software-
+  specific tags to be added by users.
+* File storage backends that supports headers (eg. Swift) now store an
+  X-Content-Dimensions header for originals that contain the media's dimensions
+  as page ranges keyed by dimensions.
+
+=== Languages updated in 1.30 ===
+
+* Support for kbp (Kabɩyɛ / Kabiyè) was added.
+
+=== External library changes in 1.30 ===
+
+==== Upgraded external libraries ====
+* …
+
+==== New external libraries ====
+* The class \TestingAccessWrapper has been moved to the external library
+  wikimedia/testing-access-wrapper and renamed \Wikimedia\TestingAccessWrapper.
+
+==== Removed and replaced external libraries ====
+* …
+
+=== Bug fixes in 1.30 ===
+* (T151633) Ordered list items use now Devanagari digits in Nepalese
+  (thanks to Sfic)
+
+=== Action API changes in 1.30 ===
+* (T37247) action=parse output will be wrapped in a div with
+  class="mw-parser-output" by default. This may be changed or disabled using
+  the new 'wrapoutputclass' parameter.
+* When errorformat is not 'bc', abort reasons from action=login will be
+  formatted as specified by the error formatter parameters.
+
+=== Action API internal changes in 1.30 ===
+* …
+
+=== Languages updated in 1.30 ===
+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.
+
+* …
+
+=== Other changes in 1.30 ===
+* The use of an associative array for $wgProxyList, where the IP address is in
+  the key instead of the value, is deprecated (e.g. [ '127.0.0.1' => 'value' ]).
+  Please convert these arrays to indexed/sequential ones (e.g. [ '127.0.0.1' ]).
+* mw.user.bucket (deprecated in 1.23) was removed.
+* LoadBalancer::getServerInfo() and LoadBalancer::setServerInfo() are
+  deprecated. There are no known callers.
+* File::getStreamHeaders() was deprecated.
+* MediaHandler::getStreamHeaders() was deprecated.
+* The ExtractThumbParameters hook (deprecated in 1.21) was removed.
+* The OutputPage::addParserOutputNoText and ::getHeadLinks methods (both
+  deprecated in 1.24) were removed.
+* wfMemcKey() and wfGlobalCacheKey() were deprecated. BagOStuff::makeKey() and
+  BagOStuff::makeGlobalKey() should be used instead.
+* (T146304) Preprocessor handling of LanguageConverter markup has been improved.
+  As a result of the new uniform handling, '-{' may need to be escaped
+  (for example, as '-<nowiki/>{') where it occurs inside template arguments
+  or wikilinks.
+
+== Compatibility ==
+MediaWiki 1.30 requires PHP 5.5.9 or later. There is experimental support for
+HHVM 3.6.5 or later.
+
+MySQL/MariaDB is the recommended DBMS. PostgreSQL or SQLite can also be used,
+but support for them is somewhat less mature. There is experimental support for
+Oracle and Microsoft SQL Server.
+
+The supported versions are:
+
+* MySQL 5.0.3 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+* Microsoft SQL Server 2005 (9.00.1399)
+
+== Upgrading ==
+1.30 has several database changes since 1.29, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions, including
+important information when upgrading from versions prior to 1.11.
+
+For notes on 1.29.x and older releases, see HISTORY.
+
+== Online documentation ==
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
+
+       https://www.mediawiki.org/wiki/Special:MyLanguage/Documentation
+
+== Mailing list ==
+A mailing list is available for MediaWiki user support and discussion:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+It's highly recommended that you sign up for one of these lists if you're
+going to run a public MediaWiki, so you can be notified of security fixes.
+
+== IRC help ==
+There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/Rakefile b/Rakefile
deleted file mode 100644 (file)
index 59f5480..0000000
--- a/Rakefile
+++ /dev/null
@@ -1,17 +0,0 @@
-require 'bundler/setup'
-
-require 'rubocop/rake_task'
-RuboCop::RakeTask.new(:rubocop) do |task|
-  # if you use mediawiki-vagrant, rubocop will by default use it's .rubocop.yml
-  # the next line makes it explicit that you want .rubocop.yml from the directory
-  # where `bundle exec rake` is executed
-  task.options = ['-c', '.rubocop.yml']
-end
-
-require 'mediawiki_selenium/rake_task'
-MediawikiSelenium::RakeTask.new(site_tag: false)
-
-task default: [:test]
-
-desc 'Run all build/tests commands (CI entry point)'
-task test: [:rubocop]
diff --git a/UPGRADE b/UPGRADE
index 3ec1a22..0e6ad9b 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -109,6 +109,12 @@ In the "maintenance" directory, run the updateDoubleWidthSearch.php
 script.  This will update the searchindex table for those pages that
 contain double-byte latin characters.
 
+== Upgrading from 1.10 or earlier ==
+
+If upgrading from before 1.11, and you are using a wiki as a commons
+repository, make sure that it is updated as well. Otherwise, errors may arise
+due to database schema changes.
+
 == Upgrading from 1.8 or earlier ==
 
 MediaWiki 1.9 and later no longer keep default localized message text
@@ -135,6 +141,9 @@ to set only specific items as recommended in DefaultSettings.php.
 
 $wgLocalTZoffset was in hours, it is now using minutes.
 
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
 == Upgrading from 1.5 or earlier ==
 
 Major changes have been made to the schema from 1.4.x. The updater
@@ -149,7 +158,7 @@ UTF-8; an experimental command-line upgrade helper script,
 'upgrade1_5.php', can do this -- run it prior to 'update.php' or
 the web upgrader.
 
-NOTE that upgrade1_5.php does not work properly with recent version
+NOTE that upgrade1_5.php does not work properly with recent versions
 of MediaWiki. If upgrading a 1.4.x wiki, you should upgrade to 1.5
 first.  upgrade1_5.php has been removed from MediaWiki 1.21.
 
diff --git a/api.php b/api.php
index 6e75fb7..a6ce3b2 100644 (file)
--- a/api.php
+++ b/api.php
@@ -63,7 +63,7 @@ RequestContext::getMain()->setTitle( $wgTitle );
 try {
        /* Construct an ApiMain with the arguments passed via the URL. What we get back
         * is some form of an ApiMain, possibly even one that produces an error message,
-        * but we don't care here, as that is handled by the ctor.
+        * but we don't care here, as that is handled by the constructor.
         */
        $processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
 
index 1863577..6d2b66b 100644 (file)
@@ -11,6 +11,7 @@ $wgAutoloadLocalClasses = [
        'ActiveUsersPager' => __DIR__ . '/includes/specials/pagers/ActiveUsersPager.php',
        'ActivityUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/ActivityUpdateJob.php',
        'AddRFCAndPMIDInterwiki' => __DIR__ . '/maintenance/addRFCandPMIDInterwiki.php',
+       'AddSite' => __DIR__ . '/maintenance/addSite.php',
        'AjaxDispatcher' => __DIR__ . '/includes/AjaxDispatcher.php',
        'AjaxResponse' => __DIR__ . '/includes/AjaxResponse.php',
        'AllMessagesTablePager' => __DIR__ . '/includes/specials/pagers/AllMessagesTablePager.php',
@@ -176,6 +177,7 @@ $wgAutoloadLocalClasses = [
        'BagOStuff' => __DIR__ . '/includes/libs/objectcache/BagOStuff.php',
        'BaseDump' => __DIR__ . '/maintenance/backupPrefetch.inc',
        'BaseTemplate' => __DIR__ . '/includes/skins/BaseTemplate.php',
+       'BashkirUppercaseCollation' => __DIR__ . '/includes/collation/BashkirUppercaseCollation.php',
        'BatchRowIterator' => __DIR__ . '/includes/utils/BatchRowIterator.php',
        'BatchRowUpdate' => __DIR__ . '/includes/utils/BatchRowUpdate.php',
        'BatchRowWriter' => __DIR__ . '/includes/utils/BatchRowWriter.php',
@@ -187,10 +189,12 @@ $wgAutoloadLocalClasses = [
        'BenchUtf8TitleCheck' => __DIR__ . '/maintenance/benchmarks/bench_utf8_title_check.php',
        'BenchWfIsWindows' => __DIR__ . '/maintenance/benchmarks/bench_wfIsWindows.php',
        'BenchWikimediaBaseConvert' => __DIR__ . '/maintenance/benchmarks/bench_Wikimedia_base_convert.php',
+       'BenchmarkCSSMin' => __DIR__ . '/maintenance/benchmarks/benchmarkCSSMin.php',
        'BenchmarkDeleteTruncate' => __DIR__ . '/maintenance/benchmarks/bench_delete_truncate.php',
        'BenchmarkHooks' => __DIR__ . '/maintenance/benchmarks/benchmarkHooks.php',
        'BenchmarkParse' => __DIR__ . '/maintenance/benchmarks/benchmarkParse.php',
        'BenchmarkPurge' => __DIR__ . '/maintenance/benchmarks/benchmarkPurge.php',
+       'BenchmarkTidy' => __DIR__ . '/maintenance/benchmarks/benchmarkTidy.php',
        'Benchmarker' => __DIR__ . '/maintenance/benchmarks/Benchmarker.php',
        'BitmapHandler' => __DIR__ . '/includes/media/Bitmap.php',
        'BitmapHandler_ClientOnly' => __DIR__ . '/includes/media/Bitmap_ClientOnly.php',
@@ -236,7 +240,13 @@ $wgAutoloadLocalClasses = [
        'ChangeTagsRevisionList' => __DIR__ . '/includes/changetags/ChangeTagsRevisionList.php',
        'ChangesFeed' => __DIR__ . '/includes/changes/ChangesFeed.php',
        'ChangesList' => __DIR__ . '/includes/changes/ChangesList.php',
+       'ChangesListBooleanFilter' => __DIR__ . '/includes/changes/ChangesListBooleanFilter.php',
+       'ChangesListBooleanFilterGroup' => __DIR__ . '/includes/changes/ChangesListBooleanFilterGroup.php',
+       'ChangesListFilter' => __DIR__ . '/includes/changes/ChangesListFilter.php',
+       'ChangesListFilterGroup' => __DIR__ . '/includes/changes/ChangesListFilterGroup.php',
        'ChangesListSpecialPage' => __DIR__ . '/includes/specialpage/ChangesListSpecialPage.php',
+       'ChangesListStringOptionsFilter' => __DIR__ . '/includes/changes/ChangesListStringOptionsFilter.php',
+       'ChangesListStringOptionsFilterGroup' => __DIR__ . '/includes/changes/ChangesListStringOptionsFilterGroup.php',
        'ChannelFeed' => __DIR__ . '/includes/Feed.php',
        'CheckBadRedirects' => __DIR__ . '/maintenance/checkBadRedirects.php',
        'CheckComposerLockUpToDate' => __DIR__ . '/maintenance/checkComposerLockUpToDate.php',
@@ -251,6 +261,7 @@ $wgAutoloadLocalClasses = [
        'CleanupAncientTables' => __DIR__ . '/maintenance/cleanupAncientTables.php',
        'CleanupBlocks' => __DIR__ . '/maintenance/cleanupBlocks.php',
        'CleanupEmptyCategories' => __DIR__ . '/maintenance/cleanupEmptyCategories.php',
+       'CleanupInvalidDbKeys' => __DIR__ . '/maintenance/cleanupInvalidDbKeys.php',
        'CleanupPreferences' => __DIR__ . '/maintenance/cleanupPreferences.php',
        'CleanupRemovedModules' => __DIR__ . '/maintenance/cleanupRemovedModules.php',
        'CleanupSpam' => __DIR__ . '/maintenance/cleanupSpam.php',
@@ -278,6 +289,7 @@ $wgAutoloadLocalClasses = [
        'Config' => __DIR__ . '/includes/config/Config.php',
        'ConfigException' => __DIR__ . '/includes/config/ConfigException.php',
        'ConfigFactory' => __DIR__ . '/includes/config/ConfigFactory.php',
+       'ConfiguredReadOnlyMode' => __DIR__ . '/includes/ReadOnlyMode.php',
        'ConstantDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
        'Content' => __DIR__ . '/includes/content/Content.php',
        'ContentHandler' => __DIR__ . '/includes/content/ContentHandler.php',
@@ -288,7 +300,6 @@ $wgAutoloadLocalClasses = [
        'ConvertLinks' => __DIR__ . '/maintenance/convertLinks.php',
        'ConvertUserOptions' => __DIR__ . '/maintenance/convertUserOptions.php',
        'ConverterRule' => __DIR__ . '/languages/ConverterRule.php',
-       'ConvertibleTimestamp' => __DIR__ . '/includes/libs/time/ConvertibleTimestamp.php',
        'Cookie' => __DIR__ . '/includes/libs/Cookie.php',
        'CookieJar' => __DIR__ . '/includes/libs/CookieJar.php',
        'CopyFileBackend' => __DIR__ . '/maintenance/copyFileBackend.php',
@@ -305,6 +316,7 @@ $wgAutoloadLocalClasses = [
        'CssContentHandler' => __DIR__ . '/includes/content/CssContentHandler.php',
        'CsvStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
        'CurlHttpRequest' => __DIR__ . '/includes/http/CurlHttpRequest.php',
+       'CustomUppercaseCollation' => __DIR__ . '/includes/collation/CustomUppercaseCollation.php',
        'DBAccessBase' => __DIR__ . '/includes/dao/DBAccessBase.php',
        'DBAccessError' => __DIR__ . '/includes/libs/rdbms/exception/DBAccessError.php',
        'DBAccessObjectUtils' => __DIR__ . '/includes/dao/DBAccessObjectUtils.php',
@@ -377,6 +389,7 @@ $wgAutoloadLocalClasses = [
        'Digit2Html' => __DIR__ . '/maintenance/language/digit2html.php',
        'DjVuHandler' => __DIR__ . '/includes/media/DjVu.php',
        'DjVuImage' => __DIR__ . '/includes/media/DjVuImage.php',
+       'DnsSrvDiscoverer' => __DIR__ . '/includes/libs/DnsSrvDiscoverer.php',
        'DoubleRedirectJob' => __DIR__ . '/includes/jobqueue/jobs/DoubleRedirectJob.php',
        'DoubleRedirectsPage' => __DIR__ . '/includes/specials/SpecialDoubleRedirects.php',
        'DoubleReplacer' => __DIR__ . '/includes/libs/replacers/DoubleReplacer.php',
@@ -420,6 +433,7 @@ $wgAutoloadLocalClasses = [
        'EnqueueableDataUpdate' => __DIR__ . '/includes/deferred/EnqueueableDataUpdate.php',
        'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php',
        'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
+       'EtcdConfig' => __DIR__ . '/includes/config/EtcdConfig.php',
        'EventRelayer' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
        'EventRelayerGroup' => __DIR__ . '/includes/EventRelayerGroup.php',
        'EventRelayerKafka' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerKafka.php',
@@ -486,10 +500,10 @@ $wgAutoloadLocalClasses = [
        'FindHooks' => __DIR__ . '/maintenance/findHooks.php',
        'FindMissingFiles' => __DIR__ . '/maintenance/findMissingFiles.php',
        'FindOrphanedFiles' => __DIR__ . '/maintenance/findOrphanedFiles.php',
-       'FixBug20757' => __DIR__ . '/maintenance/storage/fixBug20757.php',
        'FixDefaultJsonContentPages' => __DIR__ . '/maintenance/fixDefaultJsonContentPages.php',
        'FixDoubleRedirects' => __DIR__ . '/maintenance/fixDoubleRedirects.php',
        'FixExtLinksProtocolRelative' => __DIR__ . '/maintenance/fixExtLinksProtocolRelative.php',
+       'FixT22757' => __DIR__ . '/maintenance/storage/fixT22757.php',
        'FixTimestamps' => __DIR__ . '/maintenance/fixTimestamps.php',
        'FixUserRegistration' => __DIR__ . '/maintenance/fixUserRegistration.php',
        'ForeignAPIFile' => __DIR__ . '/includes/filerepo/file/ForeignAPIFile.php',
@@ -628,6 +642,7 @@ $wgAutoloadLocalClasses = [
        'InfoAction' => __DIR__ . '/includes/actions/InfoAction.php',
        'InitEditCount' => __DIR__ . '/maintenance/initEditCount.php',
        'InitSiteStats' => __DIR__ . '/maintenance/initSiteStats.php',
+       'InitUserPreference' => __DIR__ . '/maintenance/initUserPreference.php',
        'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php',
        'Installer' => __DIR__ . '/includes/installer/Installer.php',
        'InstallerOverrides' => __DIR__ . '/includes/installer/InstallerOverrides.php',
@@ -669,6 +684,7 @@ $wgAutoloadLocalClasses = [
        'JsonContentHandler' => __DIR__ . '/includes/content/JsonContentHandler.php',
        'KkConverter' => __DIR__ . '/languages/classes/LanguageKk.php',
        'KuConverter' => __DIR__ . '/languages/classes/LanguageKu.php',
+       'LBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactory.php',
        'LCStore' => __DIR__ . '/includes/cache/localisation/LCStore.php',
        'LCStoreCDB' => __DIR__ . '/includes/cache/localisation/LCStoreCDB.php',
        'LCStoreDB' => __DIR__ . '/includes/cache/localisation/LCStoreDB.php',
@@ -681,6 +697,7 @@ $wgAutoloadLocalClasses = [
        'LanguageBe_tarask' => __DIR__ . '/languages/classes/LanguageBe_tarask.php',
        'LanguageBg' => __DIR__ . '/languages/classes/LanguageBg.php',
        'LanguageBs' => __DIR__ . '/languages/classes/LanguageBs.php',
+       'LanguageCode' => __DIR__ . '/languages/LanguageCode.php',
        'LanguageConverter' => __DIR__ . '/languages/LanguageConverter.php',
        'LanguageCu' => __DIR__ . '/languages/classes/LanguageCu.php',
        'LanguageDsb' => __DIR__ . '/languages/classes/LanguageDsb.php',
@@ -863,6 +880,8 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Linker\\LinkRenderer' => __DIR__ . '/includes/linker/LinkRenderer.php',
        'MediaWiki\\Linker\\LinkRendererFactory' => __DIR__ . '/includes/linker/LinkRendererFactory.php',
        'MediaWiki\\Linker\\LinkTarget' => __DIR__ . '/includes/linker/LinkTarget.php',
+       'MediaWiki\\Logger\\ConsoleLogger' => __DIR__ . '/includes/debug/logger/ConsoleLogger.php',
+       'MediaWiki\\Logger\\ConsoleSpi' => __DIR__ . '/includes/debug/logger/ConsoleSpi.php',
        'MediaWiki\\Logger\\LegacyLogger' => __DIR__ . '/includes/debug/logger/LegacyLogger.php',
        'MediaWiki\\Logger\\LegacySpi' => __DIR__ . '/includes/debug/logger/LegacySpi.php',
        'MediaWiki\\Logger\\LoggerFactory' => __DIR__ . '/includes/debug/logger/LoggerFactory.php',
@@ -917,6 +936,10 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Tidy\\RaggettInternalHHVM' => __DIR__ . '/includes/tidy/RaggettInternalHHVM.php',
        'MediaWiki\\Tidy\\RaggettInternalPHP' => __DIR__ . '/includes/tidy/RaggettInternalPHP.php',
        'MediaWiki\\Tidy\\RaggettWrapper' => __DIR__ . '/includes/tidy/RaggettWrapper.php',
+       'MediaWiki\\Tidy\\RemexCompatFormatter' => __DIR__ . '/includes/tidy/RemexCompatFormatter.php',
+       'MediaWiki\\Tidy\\RemexCompatMunger' => __DIR__ . '/includes/tidy/RemexCompatMunger.php',
+       'MediaWiki\\Tidy\\RemexDriver' => __DIR__ . '/includes/tidy/RemexDriver.php',
+       'MediaWiki\\Tidy\\RemexMungerData' => __DIR__ . '/includes/tidy/RemexMungerData.php',
        'MediaWiki\\Tidy\\TidyDriverBase' => __DIR__ . '/includes/tidy/TidyDriverBase.php',
        'MediaWiki\\Widget\\ComplexNamespaceInputWidget' => __DIR__ . '/includes/widget/ComplexNamespaceInputWidget.php',
        'MediaWiki\\Widget\\ComplexTitleInputWidget' => __DIR__ . '/includes/widget/ComplexTitleInputWidget.php',
@@ -934,6 +957,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Widget\\Search\\SearchResultWidget' => __DIR__ . '/includes/widget/search/SearchResultWidget.php',
        'MediaWiki\\Widget\\Search\\SimpleSearchResultSetWidget' => __DIR__ . '/includes/widget/search/SimpleSearchResultSetWidget.php',
        'MediaWiki\\Widget\\Search\\SimpleSearchResultWidget' => __DIR__ . '/includes/widget/search/SimpleSearchResultWidget.php',
+       'MediaWiki\\Widget\\SelectWithInputWidget' => __DIR__ . '/includes/widget/SelectWithInputWidget.php',
        'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
        'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
        'MediaWiki\\Widget\\UsersMultiselectWidget' => __DIR__ . '/includes/widget/UsersMultiselectWidget.php',
@@ -973,7 +997,6 @@ $wgAutoloadLocalClasses = [
        'MovePage' => __DIR__ . '/includes/MovePage.php',
        'MovePageForm' => __DIR__ . '/includes/specials/SpecialMovepage.php',
        'MssqlInstaller' => __DIR__ . '/includes/installer/MssqlInstaller.php',
-       'MssqlResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php',
        'MssqlUpdater' => __DIR__ . '/includes/installer/MssqlUpdater.php',
        'MultiConfig' => __DIR__ . '/includes/config/MultiConfig.php',
        'MultiHttpClient' => __DIR__ . '/includes/libs/MultiHttpClient.php',
@@ -1045,7 +1068,7 @@ $wgAutoloadLocalClasses = [
        'PackedImageGallery' => __DIR__ . '/includes/gallery/PackedImageGallery.php',
        'PackedOverlayImageGallery' => __DIR__ . '/includes/gallery/PackedOverlayImageGallery.php',
        'Page' => __DIR__ . '/includes/page/Page.php',
-       'PageArchive' => __DIR__ . '/includes/specials/SpecialUndelete.php',
+       'PageArchive' => __DIR__ . '/includes/page/PageArchive.php',
        'PageExists' => __DIR__ . '/maintenance/pageExists.php',
        'PageLangLogFormatter' => __DIR__ . '/includes/logging/PageLangLogFormatter.php',
        'PageProps' => __DIR__ . '/includes/PageProps.php',
@@ -1117,7 +1140,7 @@ $wgAutoloadLocalClasses = [
        'Protect' => __DIR__ . '/maintenance/protect.php',
        'ProtectAction' => __DIR__ . '/includes/actions/ProtectAction.php',
        'ProtectLogFormatter' => __DIR__ . '/includes/logging/ProtectLogFormatter.php',
-       'ProtectedPagesPager' => __DIR__ . '/includes/specials/SpecialProtectedpages.php',
+       'ProtectedPagesPager' => __DIR__ . '/includes/specials/pagers/ProtectedPagesPager.php',
        'ProtectedTitlesPager' => __DIR__ . '/includes/specials/pagers/ProtectedTitlesPager.php',
        'ProtectionForm' => __DIR__ . '/includes/ProtectionForm.php',
        'ProxyLookup' => __DIR__ . '/includes/ProxyLookup.php',
@@ -1128,6 +1151,7 @@ $wgAutoloadLocalClasses = [
        'PurgeChangedPages' => __DIR__ . '/maintenance/purgeChangedPages.php',
        'PurgeJobUtils' => __DIR__ . '/includes/jobqueue/utils/PurgeJobUtils.php',
        'PurgeList' => __DIR__ . '/maintenance/purgeList.php',
+       'PurgeModuleDeps' => __DIR__ . '/maintenance/purgeModuleDeps.php',
        'PurgeOldText' => __DIR__ . '/maintenance/purgeOldText.php',
        'PurgeParserCache' => __DIR__ . '/maintenance/purgeParserCache.php',
        'QueryPage' => __DIR__ . '/includes/specialpage/QueryPage.php',
@@ -1142,10 +1166,12 @@ $wgAutoloadLocalClasses = [
        'RESTBagOStuff' => __DIR__ . '/includes/libs/objectcache/RESTBagOStuff.php',
        'RSSFeed' => __DIR__ . '/includes/Feed.php',
        'RandomPage' => __DIR__ . '/includes/specials/SpecialRandompage.php',
+       'RangeChronologicalPager' => __DIR__ . '/includes/pager/RangeChronologicalPager.php',
        'RangeDifference' => __DIR__ . '/includes/diff/DiffEngine.php',
        'RawAction' => __DIR__ . '/includes/actions/RawAction.php',
        'RawMessage' => __DIR__ . '/includes/Message.php',
        'ReadOnlyError' => __DIR__ . '/includes/exception/ReadOnlyError.php',
+       'ReadOnlyMode' => __DIR__ . '/includes/ReadOnlyMode.php',
        'ReassignEdits' => __DIR__ . '/maintenance/reassignEdits.php',
        'RebuildAll' => __DIR__ . '/maintenance/rebuildall.php',
        'RebuildFileCache' => __DIR__ . '/maintenance/rebuildFileCache.php',
@@ -1246,7 +1272,6 @@ $wgAutoloadLocalClasses = [
        'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
        'SamplingStatsdClient' => __DIR__ . '/includes/libs/stats/SamplingStatsdClient.php',
        'Sanitizer' => __DIR__ . '/includes/Sanitizer.php',
-       'SavepointPostgres' => __DIR__ . '/includes/libs/rdbms/database/utils/SavepointPostgres.php',
        'ScopedCallback' => __DIR__ . '/includes/compat/ScopedCallback.php',
        'ScopedLock' => __DIR__ . '/includes/libs/lockmanager/ScopedLock.php',
        'SearchApi' => __DIR__ . '/includes/api/SearchApi.php',
@@ -1306,6 +1331,7 @@ $wgAutoloadLocalClasses = [
        'SpecialAllPages' => __DIR__ . '/includes/specials/SpecialAllPages.php',
        'SpecialApiHelp' => __DIR__ . '/includes/specials/SpecialApiHelp.php',
        'SpecialApiSandbox' => __DIR__ . '/includes/specials/SpecialApiSandbox.php',
+       'SpecialAutoblockList' => __DIR__ . '/includes/specials/SpecialAutoblockList.php',
        'SpecialBlankpage' => __DIR__ . '/includes/specials/SpecialBlankpage.php',
        'SpecialBlock' => __DIR__ . '/includes/specials/SpecialBlock.php',
        'SpecialBlockList' => __DIR__ . '/includes/specials/SpecialBlockList.php',
@@ -1327,6 +1353,7 @@ $wgAutoloadLocalClasses = [
        'SpecialExpandTemplates' => __DIR__ . '/includes/specials/SpecialExpandTemplates.php',
        'SpecialExport' => __DIR__ . '/includes/specials/SpecialExport.php',
        'SpecialFilepath' => __DIR__ . '/includes/specials/SpecialFilepath.php',
+       'SpecialGoToInterwiki' => __DIR__ . '/includes/specials/SpecialGoToInterwiki.php',
        'SpecialImport' => __DIR__ . '/includes/specials/SpecialImport.php',
        'SpecialJavaScriptTest' => __DIR__ . '/includes/specials/SpecialJavaScriptTest.php',
        'SpecialLinkAccounts' => __DIR__ . '/includes/specials/SpecialLinkAccounts.php',
@@ -1437,7 +1464,6 @@ $wgAutoloadLocalClasses = [
        'ThumbnailRenderJob' => __DIR__ . '/includes/jobqueue/jobs/ThumbnailRenderJob.php',
        'TidyUpBug37714' => __DIR__ . '/maintenance/tidyUpBug37714.php',
        'TiffHandler' => __DIR__ . '/includes/media/Tiff.php',
-       'TimestampException' => __DIR__ . '/includes/libs/time/TimestampException.php',
        'Timing' => __DIR__ . '/includes/libs/Timing.php',
        'Title' => __DIR__ . '/includes/Title.php',
        'TitleArray' => __DIR__ . '/includes/TitleArray.php',
@@ -1573,20 +1599,41 @@ $wgAutoloadLocalClasses = [
        'WikiImporter' => __DIR__ . '/includes/import/WikiImporter.php',
        'WikiMap' => __DIR__ . '/includes/WikiMap.php',
        'WikiPage' => __DIR__ . '/includes/page/WikiPage.php',
-       'WikiReference' => __DIR__ . '/includes/WikiMap.php',
+       'WikiReference' => __DIR__ . '/includes/WikiReference.php',
        'WikiRevision' => __DIR__ . '/includes/import/WikiRevision.php',
        'WikiStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
        'WikiTextStructure' => __DIR__ . '/includes/content/WikiTextStructure.php',
        'Wikimedia\\Rdbms\\Blob' => __DIR__ . '/includes/libs/rdbms/encasing/Blob.php',
        'Wikimedia\\Rdbms\\ChronologyProtector' => __DIR__ . '/includes/libs/rdbms/ChronologyProtector.php',
        'Wikimedia\\Rdbms\\ConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/ConnectionManager.php',
+       'Wikimedia\\Rdbms\\DBAccessError' => __DIR__ . '/includes/libs/rdbms/exception/DBAccessError.php',
+       'Wikimedia\\Rdbms\\DBConnRef' => __DIR__ . '/includes/libs/rdbms/database/DBConnRef.php',
+       'Wikimedia\\Rdbms\\DBConnectionError' => __DIR__ . '/includes/libs/rdbms/exception/DBConnectionError.php',
+       'Wikimedia\\Rdbms\\DBError' => __DIR__ . '/includes/libs/rdbms/exception/DBError.php',
+       'Wikimedia\\Rdbms\\DBExpectedError' => __DIR__ . '/includes/libs/rdbms/exception/DBExpectedError.php',
        'Wikimedia\\Rdbms\\DBMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/DBMasterPos.php',
+       'Wikimedia\\Rdbms\\DBQueryError' => __DIR__ . '/includes/libs/rdbms/exception/DBQueryError.php',
+       'Wikimedia\\Rdbms\\DBReadOnlyError' => __DIR__ . '/includes/libs/rdbms/exception/DBReadOnlyError.php',
+       'Wikimedia\\Rdbms\\DBReplicationWaitError' => __DIR__ . '/includes/libs/rdbms/exception/DBReplicationWaitError.php',
+       'Wikimedia\\Rdbms\\DBTransactionError' => __DIR__ . '/includes/libs/rdbms/exception/DBTransactionError.php',
+       'Wikimedia\\Rdbms\\DBTransactionSizeError' => __DIR__ . '/includes/libs/rdbms/exception/DBTransactionSizeError.php',
+       'Wikimedia\\Rdbms\\DBUnexpectedError' => __DIR__ . '/includes/libs/rdbms/exception/DBUnexpectedError.php',
+       'Wikimedia\\Rdbms\\Database' => __DIR__ . '/includes/libs/rdbms/database/Database.php',
        'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php',
+       'Wikimedia\\Rdbms\\DatabaseMssql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMssql.php',
+       'Wikimedia\\Rdbms\\DatabaseMysql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysql.php',
+       'Wikimedia\\Rdbms\\DatabaseMysqlBase' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqlBase.php',
+       'Wikimedia\\Rdbms\\DatabaseMysqli' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqli.php',
+       'Wikimedia\\Rdbms\\DatabasePostgres' => __DIR__ . '/includes/libs/rdbms/database/DatabasePostgres.php',
+       'Wikimedia\\Rdbms\\DatabaseSqlite' => __DIR__ . '/includes/libs/rdbms/database/DatabaseSqlite.php',
+       'Wikimedia\\Rdbms\\FakeResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php',
        'Wikimedia\\Rdbms\\Field' => __DIR__ . '/includes/libs/rdbms/field/Field.php',
        'Wikimedia\\Rdbms\\IBlob' => __DIR__ . '/includes/libs/rdbms/encasing/IBlob.php',
+       'Wikimedia\\Rdbms\\IDatabase' => __DIR__ . '/includes/libs/rdbms/database/IDatabase.php',
        'Wikimedia\\Rdbms\\ILBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/ILBFactory.php',
        'Wikimedia\\Rdbms\\ILoadBalancer' => __DIR__ . '/includes/libs/rdbms/loadbalancer/ILoadBalancer.php',
        'Wikimedia\\Rdbms\\ILoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/ILoadMonitor.php',
+       'Wikimedia\\Rdbms\\IMaintainableDatabase' => __DIR__ . '/includes/libs/rdbms/database/IMaintainableDatabase.php',
        'Wikimedia\\Rdbms\\IResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php',
        'Wikimedia\\Rdbms\\LBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactory.php',
        'Wikimedia\\Rdbms\\LBFactoryMulti' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactoryMulti.php',
@@ -1598,13 +1645,17 @@ $wgAutoloadLocalClasses = [
        'Wikimedia\\Rdbms\\LoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitor.php',
        'Wikimedia\\Rdbms\\LoadMonitorMySQL' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php',
        'Wikimedia\\Rdbms\\LoadMonitorNull' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php',
+       'Wikimedia\\Rdbms\\MaintainableDBConnRef' => __DIR__ . '/includes/libs/rdbms/database/MaintainableDBConnRef.php',
        'Wikimedia\\Rdbms\\MssqlBlob' => __DIR__ . '/includes/libs/rdbms/encasing/MssqlBlob.php',
        'Wikimedia\\Rdbms\\MssqlField' => __DIR__ . '/includes/libs/rdbms/field/MssqlField.php',
+       'Wikimedia\\Rdbms\\MssqlResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php',
        'Wikimedia\\Rdbms\\MySQLField' => __DIR__ . '/includes/libs/rdbms/field/MySQLField.php',
        'Wikimedia\\Rdbms\\MySQLMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/MySQLMasterPos.php',
        'Wikimedia\\Rdbms\\PostgresBlob' => __DIR__ . '/includes/libs/rdbms/encasing/PostgresBlob.php',
        'Wikimedia\\Rdbms\\PostgresField' => __DIR__ . '/includes/libs/rdbms/field/PostgresField.php',
+       'Wikimedia\\Rdbms\\ResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/ResultWrapper.php',
        'Wikimedia\\Rdbms\\SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.php',
+       'Wikimedia\\Rdbms\\SavepointPostgres' => __DIR__ . '/includes/libs/rdbms/database/utils/SavepointPostgres.php',
        'Wikimedia\\Rdbms\\SessionConsistentConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php',
        'Wikimedia\\Rdbms\\TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php',
        'WikitextContent' => __DIR__ . '/includes/content/WikitextContent.php',
@@ -1623,11 +1674,11 @@ $wgAutoloadLocalClasses = [
        'XhprofData' => __DIR__ . '/includes/libs/XhprofData.php',
        'Xml' => __DIR__ . '/includes/Xml.php',
        'XmlDumpWriter' => __DIR__ . '/includes/export/XmlDumpWriter.php',
-       'XmlJsCode' => __DIR__ . '/includes/Xml.php',
+       'XmlJsCode' => __DIR__ . '/includes/XmlJsCode.php',
        'XmlSelect' => __DIR__ . '/includes/XmlSelect.php',
        'XmlTypeCheck' => __DIR__ . '/includes/libs/mime/XmlTypeCheck.php',
        'ZhConverter' => __DIR__ . '/languages/classes/LanguageZh.php',
        'ZipDirectoryReader' => __DIR__ . '/includes/utils/ZipDirectoryReader.php',
-       'ZipDirectoryReaderError' => __DIR__ . '/includes/utils/ZipDirectoryReader.php',
+       'ZipDirectoryReaderError' => __DIR__ . '/includes/utils/ZipDirectoryReaderError.php',
        'profile_point' => __DIR__ . '/profileinfo.php',
 ];
index 3520dc3..e6f2d5e 100644 (file)
@@ -17,7 +17,7 @@
        },
        "require": {
                "composer/semver": "1.4.2",
-               "cssjanus/cssjanus": "1.1.3",
+               "cssjanus/cssjanus": "1.2.0",
                "ext-ctype": "*",
                "ext-iconv": "*",
                "ext-json": "*",
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.19.2",
-               "oyejorge/less.php": "1.7.0.10",
+               "oojs/oojs-ui": "0.21.4",
+               "oyejorge/less.php": "1.7.0.14",
                "php": ">=5.5.9",
                "psr/log": "1.0.2",
                "wikimedia/assert": "0.2.2",
                "wikimedia/base-convert": "1.0.1",
                "wikimedia/cdb": "1.4.1",
                "wikimedia/cldr-plural-rule-parser": "1.0.0",
-               "wikimedia/composer-merge-plugin": "1.3.1",
+               "wikimedia/composer-merge-plugin": "1.4.0",
                "wikimedia/html-formatter": "1.0.1",
                "wikimedia/ip-set": "1.1.0",
                "wikimedia/php-session-serializer": "1.0.4",
                "wikimedia/relpath": "1.0.3",
+               "wikimedia/remex-html": "1.0.1",
                "wikimedia/running-stat": "1.1.0",
                "wikimedia/scoped-callback": "1.0.0",
                "wikimedia/utfnormal": "1.1.0",
+               "wikimedia/timestamp": "1.0.0",
                "wikimedia/wait-condition-loop": "1.0.1",
                "wikimedia/wrappedstring": "2.2.0",
                "zordius/lightncandy": "0.23"
        },
        "require-dev": {
                "composer/spdx-licenses": "1.1.4",
+               "hamcrest/hamcrest-php": "^2.0",
                "jakub-onderka/php-parallel-lint": "0.9.2",
-               "justinrainbow/json-schema": "~3.0",
-               "mediawiki/mediawiki-codesniffer": "0.7.2",
                "jetbrains/phpstorm-stubs": "dev-master#1b9906084d6635456fcf3f3a01f0d7d5b99a578a",
-               "monolog/monolog": "~1.18.2",
+               "justinrainbow/json-schema": "~3.0",
+               "mediawiki/mediawiki-codesniffer": "0.8.0",
+               "monolog/monolog": "~1.22.1",
                "nikic/php-parser": "2.1.0",
                "nmred/kafka-php": "0.1.5",
-               "phpunit/phpunit": "4.8.31",
+               "phpunit/phpunit": "4.8.35",
+               "psy/psysh": "0.8.5",
                "wikimedia/avro": "1.7.7",
-               "hamcrest/hamcrest-php": "^2.0",
-               "wmde/hamcrest-html-matchers": "^0.1.0",
-               "psy/psysh": "0.8.1"
+               "wikimedia/testing-access-wrapper": "~1.0",
+               "wmde/hamcrest-html-matchers": "^0.1.0"
        },
        "suggest": {
                "ext-apc": "Local data and opcode cache",
+               "ext-curl": "Improved http communication abilities",
                "ext-fileinfo": "Improved mime magic detection",
                "ext-intl": "ICU integration",
                "ext-wikidiff2": "Diff accelerator",
        "autoload": {
                "psr-0": {
                        "ComposerHookHandler": "includes/composer"
-               }
+               },
+               "files": [
+                       "includes/compat/Timestamp.php"
+               ]
        },
        "autoload-dev": {
                "files": [
index 3d6eda9..f241cf5 100644 (file)
                },
                "JobClasses": {
                        "type": "object",
-                       "description": "Job types this extension implements (mapping of job type to class name)"
+                       "description": "Job types this extension implements (mapping of job type to class name or factory function)"
                },
                "LogTypes": {
                        "type": "array",
index b7ee1a7..6345632 100644 (file)
@@ -2,6 +2,7 @@
        "$schema": "http://json-schema.org/schema#",
        "description": "MediaWiki extension.json schema",
        "type": "object",
+       "additionalProperties": false,
        "properties": {
                "manifest_version": {
                        "type": "integer",
                                                        }
                                                },
                                                {
-                                                       "description": "An arbitrary ResourceLoaderModule definition",
+                                                       "description": "An arbitrary ResourceLoaderModule definition by class",
                                                        "properties": {
                                                                "class": {
                                                                        "type": "string",
                                                                }
                                                        },
                                                        "required": ["class"]
+                                               },
+                                               {
+                                                       "description": "An arbitrary ResourceLoaderModule definition with instantiator",
+                                                       "properties": {
+                                                               "factory": {
+                                                                       "type": "string",
+                                                                       "description": "A static instantiator function for creating the ResourceLoaderModule object."
+                                                               }
+                                                       },
+                                                       "required": ["factory"]
                                                }
                                        ]
                                }
                },
                "JobClasses": {
                        "type": "object",
-                       "description": "Job types this extension implements (mapping of job type to class name)"
+                       "description": "Job types this extension implements (mapping of job type to class name or factory function)"
                },
                "LogTypes": {
                        "type": "array",
                                                "description": {
                                                        "type": ["string", "array"],
                                                        "description": "A description of the config setting, mostly for documentation/developers"
+                                               },
+                                               "decriptionmsg": {
+                                                       "type": "string",
+                                                       "description": "The message key which should be used as a description for this configuration option in a user interface. If empty, description will be used."
+                                               },
+                                               "public": {
+                                                       "type": "boolean",
+                                                       "default": false,
+                                                       "description": "Whether this configuration option and its value is allowed to be revealed in public or not."
                                                }
                                        }
                                }
                        "type": "array",
                        "description": "List of service wiring files to be loaded by the default instance of MediaWikiServices"
                },
+               "attributes": {
+                       "description":"Registration information for other extensions",
+                       "type": "object",
+                       "patternProperties": {
+                               ".*": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               ".*": {
+                                                       "type": ["array", "object"]
+                                               }
+                                       }
+                               }
+                       }
+               },
                "load_composer_autoloader": {
                        "type": "boolean",
                        "description": "Load the composer autoloader for this extension, if one is present"
index 846a073..62b22e1 100644 (file)
@@ -736,7 +736,10 @@ $current: the reverted revision
 $create: Whether or not the restoration caused the page to be created (i.e. it
   didn't exist before).
 $comment: The comment associated with the undeletion.
-$oldPageId: ID of page previously deleted (from archive table)
+$oldPageId: ID of page previously deleted (from archive table). This ID will be used
+  for the restored page.
+$restoredPages: Set of page IDs that have revisions restored for this undelete,
+  with keys being page IDs and values are 'true'.
 
 'ArticleUndeleteLogEntry': When a log entry is generated but not yet saved.
 $pageArchive: the PageArchive object
@@ -982,7 +985,9 @@ $rows: The data that will be rendered. May be a ResultWrapper instance or
 $unpatrolled: Whether or not we are showing unpatrolled changes.
 $watched: Whether or not the change is watched by the user.
 
-'ChangesListSpecialPageFilters': Called after building form options on pages
+'ChangesListSpecialPageFilters': DEPRECATED! Use 'ChangesListSpecialPageStructuredFilters'
+instead.
+Called after building form options on pages
 inheriting from ChangesListSpecialPage (in core: RecentChanges,
 RecentChangesLinked and Watchlist).
 $special: ChangesListSpecialPage instance
@@ -993,6 +998,15 @@ $special: ChangesListSpecialPage instance
 'ChangesListSpecialPageQuery': Called when building SQL query on pages
 inheriting from ChangesListSpecialPage (in core: RecentChanges,
 RecentChangesLinked and Watchlist).
+
+Do not use this to implement individual filters if they are compatible with the
+ChangesListFilter and ChangesListFilterGroup structure.
+
+Instead, use sub-classes of those classes, in conjunction with the
+ChangesListSpecialPageStructuredFilters hook.
+
+This hook can be used to implement filters that do not implement that structure,
+or custom behavior that is not an individual filter.
 $name: name of the special page, e.g. 'Watchlist'
 &$tables: array of tables to be queried
 &$fields: array of columns to select
@@ -1001,6 +1015,17 @@ $name: name of the special page, e.g. 'Watchlist'
 &$join_conds: join conditions for the tables
 $opts: FormOptions for this request
 
+'ChangesListSpecialPageStructuredFilters': Called to allow extensions to register
+filters for pages inheriting from ChangesListSpecialPage (in core: RecentChanges,
+RecentChangesLinked, and Watchlist).  Generally, you will want to construct
+new ChangesListBooleanFilter or ChangesListStringOptionsFilter objects.
+
+When constructing them, you specify which group they belong to.  You can reuse
+existing groups (accessed through $special->getFilterGroup), or create your own
+(ChangesListBooleanFilterGroup or ChangesListStringOptionsFilterGroup).
+If you create new groups, you must register them with $special->registerFilterGroup.
+$special: ChangesListSpecialPage instance
+
 'ChangeTagAfterDelete': Called after a change tag has been deleted (that is,
 removed from all revisions and log entries to which it was applied). This gives
 extensions a chance to take it off their books.
@@ -1045,6 +1070,13 @@ $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
 
+'ChangeTagsAllowedAdd': Called when checking if a user can add tags to a change.
+&$allowedTags: List of all the tags the user is allowed to add. Any tags the
+  user wants to add ($addTags) that are not in this array will cause it to fail.
+  You may add or remove tags to this array as required.
+$addTags: List of tags user intends to add.
+$user: User who is adding the tags.
+
 'ChangeUserGroups': Called before user groups are changed.
 $performer: The User who will perform the change
 $user: The User whose groups will be changed
@@ -1093,7 +1125,7 @@ $title: the Title in question
 a given content model name, but no entry for that model exists in
 $wgContentHandlers.
 Note: if your extension implements additional models via this hook, please
-use GetContentModels hook to make them known to core. 
+use GetContentModels hook to make them known to core.
 $modeName: the requested content model name
 &$handler: set this to a ContentHandler object, if desired.
 
@@ -1382,15 +1414,18 @@ textarea in the edit form.
 &$buttons: Array of edit buttons "Save", "Preview", "Live", and "Diff"
 &$tabindex: HTML tabindex of the last edit check/button
 
-'EditPageBeforeEditChecks': Allows modifying the edit checks below the textarea
-in the edit form.
+'EditPageBeforeEditChecks': DEPRECATED! Use 'EditPageGetCheckboxesDefinition' instead,
+or 'EditPage::showStandardInputs:options' if you don't actually care about checkboxes
+and just want to add some HTML to the page.
+Allows modifying the edit checks below the textarea in the edit form.
 &$editpage: The current EditPage object
-&$checks: Array of edit checks like "watch this page"/"minor edit"
+&$checks: Array of the HTML for edit checks like "watch this page"/"minor edit"
 &$tabindex: HTML tabindex of the last edit check/button
 
 'EditPageBeforeEditToolbar': Allows modifying the edit toolbar above the
 textarea in the edit form.
-&$toolbar: The toolbar HTMl
+&$toolbar: The toolbar HTML
+Hook subscribers can return false to avoid the default toolbar code being loaded.
 
 'EditPageCopyrightWarning': Allow for site and per-namespace customization of
 contribution/copyright notice.
@@ -1398,6 +1433,12 @@ $title: title of page being edited
 &$msg: localization message name, overridable. Default is either
   'copyrightwarning' or 'copyrightwarning2'.
 
+'EditPageGetCheckboxesDefinition': Allows modifying the edit checkboxes
+below the textarea in the edit form.
+$editpage: The current EditPage object
+&$checkboxes: Array of checkbox definitions. See EditPage::getCheckboxesDefinition()
+for the format.
+
 'EditPageGetDiffContent': Allow modifying the wikitext that will be used in
 "Show changes". Note that it is preferable to implement diff handling for
 different data types using the ContentHandler facility.
@@ -1486,13 +1527,6 @@ $ip: The ip address of the user
 change the tables headers.
 &$extTypes: associative array of extensions types
 
-'ExtractThumbParameters': DEPRECATED! Media handler should override
-MediaHandler::parseParamString instead.
-Called when extracting thumbnail parameters from a thumbnail file name.
-$thumbname: the base name of the thumbnail file
-&$params: the currently extracted params (has source name, temp or archived
-zone)
-
 'FetchChangesList': When fetching the ChangesList derivative for a particular
 user.
 $user: User the list is being fetched for
@@ -2279,6 +2313,10 @@ $page: the Page that was rendered.
 $title: the Title of the rendered page.
 $parserOutput: ParserOutput resulting from rendering the page.
 
+'OtherAutoblockLogLink': Get links to the autoblock log from extensions which
+autoblocks users and/or IP addresses too.
+&$otherBlockLink: An array with links to other autoblock logs
+
 'OtherBlockLogLink': Get links to the block log from extensions which blocks
 users and/or IP addresses too.
 &$otherBlockLink: An array with links to other block logs
@@ -2681,6 +2719,13 @@ variables from $wgResourceLoaderLESSVars are added. Can be used to add
 context-based variables.
 &$lessVars: array of variables already added
 
+'ResourceLoaderJqueryMsgModuleMagicWords': Called in
+ResourceLoaderJqueryMsgModule to allow adding magic words for jQueryMsg.
+The value should be a string, and they can depend only on the
+ResourceLoaderContext.
+$context: ResourceLoaderContext
+&$magicWords: Associative array mapping all-caps magic word to a string value
+
 'ResourceLoaderRegisterModules': Right before modules information is required,
 such as when responding to a resource
 loader request or generating HTML output.
@@ -3095,7 +3140,7 @@ use this to change some selection criteria or substitute a different title.
 &$title: If the hook returns false, a Title object to use instead of the
   result from the normal query
 
-'SpecialRecentChangesFilters': DEPRECATED! Use ChangesListSpecialPageFilters
+'SpecialRecentChangesFilters': DEPRECATED! Use ChangesListSpecialPageStructuredFilters
 instead.
 Called after building form options at RecentChanges.
 $special: the special page object
@@ -3108,8 +3153,8 @@ SpecialRecentChanges.
 &$extraOpts: array of added items, to which can be added
 $opts: FormOptions for this request
 
-'SpecialRecentChangesQuery': DEPRECATED! Use ChangesListSpecialPageQuery
-instead.
+'SpecialRecentChangesQuery': DEPRECATED! Use ChangesListSpecialPageStructuredFilters
+or ChangesListSpecialPageQuery instead.
 Called when building SQL query for SpecialRecentChanges and
 SpecialRecentChangesLinked.
 &$conds: array of WHERE conditionals for query
@@ -3140,8 +3185,10 @@ $term: The string the user searched for
 $title: The title the 'go' feature has decided to forward the user to
 &$url: Initially null, hook subscribers can set this to specify the final url to redirect to
 
-'SpecialSearchNogomatch': Called when user clicked the "Go" button but the
-target doesn't exist.
+'SpecialSearchNogomatch': Called when the 'Go' feature is triggered (generally
+from autocomplete search other than the main bar on Special:Search) and the
+target doesn't exist. Full text search results are generated after this hook is
+called.
 &$title: title object generated from the text entered by the user
 
 'SpecialSearchPowerBox': The equivalent of SpecialSearchProfileForm for
@@ -3211,7 +3258,7 @@ Special:Upload.
 $wgVersion: Current $wgVersion for you to use
 &$versionUrl: Raw url to link to (eg: release notes)
 
-'SpecialWatchlistFilters': DEPRECATED! Use ChangesListSpecialPageFilters
+'SpecialWatchlistFilters': DEPRECATED! Use ChangesListSpecialPageStructuredFilters
 instead.
 Called after building form options at Watchlist.
 $special: the special page object
@@ -3224,7 +3271,8 @@ SpecialWatchlist. Allows extensions to register custom values they have
 inserted to rc_type so they can be returned as part of the watchlist.
 &$nonRevisionTypes: array of values in the rc_type field of recentchanges table
 
-'SpecialWatchlistQuery': DEPRECATED! Use ChangesListSpecialPageQuery instead.
+'SpecialWatchlistQuery': DEPRECATED! Use ChangesListSpecialPageStructuredFilters
+or ChangesListSpecialPageQuery instead.
 Called when building sql query for SpecialWatchlist.
 &$conds: array of WHERE conditionals for query
 &$tables: array of tables to be queried
@@ -3546,6 +3594,10 @@ $removed: Groups removed
 $performer: User who performed the change, false if via autopromotion
 $reason: The reason, if any, given by the user performing the change,
 false if via autopromotion.
+$oldUGMs: An associative array (group name => UserGroupMembership object) of
+the user's group memberships before the change.
+$newUGMs: An associative array (group name => UserGroupMembership object) of
+the user's current group memberships.
 
 'UserIsBlockedFrom': Check if a user is blocked from a specific page (for
 specific block exemptions).
index dedb3a6..9db4c54 100644 (file)
@@ -26,7 +26,7 @@
 
                /** second table. Try to emulate child selector */
                table.childemu th,
-               table.childemu td {
+               table.childemu td {
                        border: 1px red solid;
                        background-color:white;
                        padding:1em;
index fa1609f..2052809 100644 (file)
@@ -68,7 +68,7 @@ function wfImageAuthMain() {
                $path = "/" . $path;
        }
 
-       // Check for bug 28235: QUERY_STRING overriding the correct extension
+       // Check for T30235: QUERY_STRING overriding the correct extension
        $whitelist = [];
        $extension = FileBackend::extensionFromPath( $path, 'rawcase' );
        if ( $extension != '' ) {
index 56fbb07..a01465e 100644 (file)
@@ -177,7 +177,13 @@ class Autopromote {
                                }
                                return false;
                        case APCOND_EDITCOUNT:
-                               return $user->getEditCount() >= $cond[1];
+                               $reqEditCount = $cond[1];
+
+                               // T157718: Avoid edit count lookup if specified edit count is 0 or invalid
+                               if ( $reqEditCount <= 0 ) {
+                                       return true;
+                               }
+                               return $user->getEditCount() >= $reqEditCount;
                        case APCOND_AGE:
                                $age = time() - wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
                                return $age >= $cond[1];
index 66b9ff0..a7e7308 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 
 class Block {
@@ -265,7 +267,7 @@ class Block {
                }
 
                # Be aware that the != '' check is explicit, since empty values will be
-               # passed by some callers (bug 29116)
+               # passed by some callers (T31116)
                if ( $vagueTarget != '' ) {
                        list( $target, $type ) = self::parseTarget( $vagueTarget );
                        switch ( $type ) {
@@ -358,7 +360,7 @@ class Block {
                if ( $end === null ) {
                        $end = $start;
                }
-               # Per bug 14634, we want to include relevant active rangeblocks; for
+               # Per T16634, we want to include relevant active rangeblocks; for
                # rangeblocks, we want to include larger ranges which enclose the given
                # range. We know that all blocks must be smaller than $wgBlockCIDRLimit,
                # so we can improve performance by filtering on a LIKE clause
@@ -553,7 +555,7 @@ class Block {
                $affected = $dbw->affectedRows();
 
                if ( $this->isAutoblocking() ) {
-                       // update corresponding autoblock(s) (bug 48813)
+                       // update corresponding autoblock(s) (T50813)
                        $dbw->update(
                                'ipblocks',
                                $this->getAutoblockUpdateArray(),
@@ -708,7 +710,7 @@ class Block {
                // than getting the msg raw and explode()'ing it.
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                $lines = $cache->getWithSetCallback(
-                       wfMemcKey( 'ipb', 'autoblock', 'whitelist' ),
+                       $cache->makeKey( 'ipb', 'autoblock', 'whitelist' ),
                        $cache::TTL_DAY,
                        function ( $curValue, &$ttl, array &$setOpts ) {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) );
@@ -1117,7 +1119,7 @@ class Block {
                } elseif ( $target === null && $vagueTarget == '' ) {
                        # We're not going to find anything useful here
                        # Be aware that the == '' check is explicit, since empty values will be
-                       # passed by some callers (bug 29116)
+                       # passed by some callers (T31116)
                        return null;
 
                } elseif ( in_array(
@@ -1142,7 +1144,7 @@ class Block {
         * Get all blocks that match any IP from an array of IP addresses
         *
         * @param array $ipChain List of IPs (strings), usually retrieved from the
-        *         X-Forwarded-For header of the request
+        *     X-Forwarded-For header of the request
         * @param bool $isAnon Exclude anonymous-only blocks if false
         * @param bool $fromMaster Whether to query the master or replica DB
         * @return array Array of Blocks
@@ -1223,9 +1225,9 @@ class Block {
         *
         * @param array $blocks Array of Block objects
         * @param array $ipChain List of IPs (strings). This is used to determine how "close"
-        *        a block is to the server, and if a block matches exactly, or is in a range.
-        *        The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
-        *        local-squid, ...)
+        *     a block is to the server, and if a block matches exactly, or is in a range.
+        *     The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
+        *     local-squid, ...)
         * @throws MWException
         * @return Block|null The "best" block from the list
         */
@@ -1450,13 +1452,9 @@ 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, 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).
-        *
         * @param WebResponse $response The response on which to set the cookie.
-        * @param boolean $setEmpty Whether to set the cookie's value to the empty string.
         */
-       public function setCookie( WebResponse $response, $setEmpty = false ) {
+       public function setCookie( WebResponse $response ) {
                // Calculate the default expiry time.
                $maxExpiryTime = wfTimestamp( TS_MW, wfTimestamp() + ( 24 * 60 * 60 ) );
 
@@ -1467,12 +1465,21 @@ class Block {
                }
 
                // Set the cookie. Reformat the MediaWiki datetime as a Unix timestamp for the cookie.
-               $cookieValue = $setEmpty ? '' : $this->getCookieValue();
                $expiryValue = DateTime::createFromFormat( 'YmdHis', $expiryTime )->format( 'U' );
                $cookieOptions = [ 'httpOnly' => false ];
+               $cookieValue = $this->getCookieValue();
                $response->setCookie( 'BlockID', $cookieValue, $expiryValue, $cookieOptions );
        }
 
+       /**
+        * Unset the 'BlockID' cookie.
+        *
+        * @param WebResponse $response The response on which to unset the cookie.
+        */
+       public static function clearCookie( WebResponse $response ) {
+               $response->clearCookie( 'BlockID', [ 'httpOnly' => false ] );
+       }
+
        /**
         * Get the BlockID cookie's value for this block. This is usually the block ID concatenated
         * with an HMAC in order to avoid spoofing (T152951), but if wgSecretKey is not set will just
index d558dbc..50ffeec 100644 (file)
@@ -96,7 +96,7 @@ class Category {
                $this->mSubcats = $row->cat_subcats;
                $this->mFiles = $row->cat_files;
 
-               # (bug 13683) If the count is negative, then 1) it's obviously wrong
+               # (T15683) If the count is negative, then 1) it's obviously wrong
                # and should not be kept, and 2) we *probably* don't have to scan many
                # rows to obtain the correct figure, so let's risk a one-time recount.
                if ( $this->mPages < 0 || $this->mSubcats < 0 || $this->mFiles < 0 ) {
@@ -321,6 +321,13 @@ class Category {
                }
 
                $dbw = wfGetDB( DB_MASTER );
+               # Avoid excess contention on the same category (T162121)
+               $name = __METHOD__ . ':' . md5( $this->mName );
+               $scopedLock = $dbw->getScopedLockAndFlush( $name, __METHOD__, 1 );
+               if ( !$scopedLock ) {
+                       return;
+               }
+
                $dbw->startAtomic( __METHOD__ );
 
                $cond1 = $dbw->conditional( [ 'page_namespace' => NS_CATEGORY ], 1, 'NULL' );
index 504b35f..595cf95 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * The "CategoryFinder" class takes a list of articles, creates an internal
  * representation of all their parent categories (as well as parents of
index 31369b0..7086a48 100644 (file)
@@ -740,10 +740,7 @@ class CategoryViewer extends ContextSource {
                        // to refresh the incorrect category table entry -- which should be
                        // quick due to the small number of entries.
                        $totalcnt = $rescnt;
-                       $category = $this->cat;
-                       DeferredUpdates::addCallableUpdate( function () use ( $category ) {
-                               $category->refreshCounts();
-                       } );
+                       DeferredUpdates::addCallableUpdate( [ $this->cat, 'refreshCounts' ] );
                } else {
                        // Case 3: hopeless.  Don't give a total count at all.
                        // Messages: category-subcat-count-limited, category-article-count-limited,
index c64f550..19c585d 100644 (file)
@@ -75,7 +75,7 @@ $wgConfigRegistry = [
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.29.0-alpha';
+$wgVersion = '1.30.0-alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -1337,7 +1337,7 @@ $wgXMLMimeTypes = [
  * to reduce disk usage, limits can only be selected from a list.
  * The user preference is saved as an array offset in the database, by default
  * the offset is set with $wgDefaultUserOptions['imagesize']. Make sure you
- * change it if you alter the array (see bug 8858).
+ * change it if you alter the array (see T10858).
  * This is the list of settings the user can choose from:
  */
 $wgImageLimits = [
@@ -1442,14 +1442,19 @@ $wgUseTinyRGBForJPGThumbnails = false;
  * Default parameters for the "<gallery>" tag
  */
 $wgGalleryOptions = [
-       'imagesPerRow' => 0, // Default number of images per-row in the gallery. 0 -> Adapt to screensize
-       'imageWidth' => 120, // Width of the cells containing images in galleries (in "px")
-       'imageHeight' => 120, // Height of the cells containing images in galleries (in "px")
-       'captionLength' => true, // Deprecated @since 1.28
-                                // Length to truncate filename to in caption when using "showfilename".
-                                // A value of 'true' will truncate the filename to one line using CSS
-                                // and will be the behaviour after deprecation.
-       'showBytes' => true, // Show the filesize in bytes in categories
+       // Default number of images per-row in the gallery. 0 -> Adapt to screensize
+       'imagesPerRow' => 0,
+       // Width of the cells containing images in galleries (in "px")
+       'imageWidth' => 120,
+       // Height of the cells containing images in galleries (in "px")
+       'imageHeight' => 120,
+       // Length to truncate filename to in caption when using "showfilename".
+       // A value of 'true' will truncate the filename to one line using CSS
+       // and will be the behaviour after deprecation.
+       // @deprecated since 1.28
+       'captionLength' => true,
+       // Show the filesize in bytes in categories
+       'showBytes' => true,
        'mode' => 'traditional',
 ];
 
@@ -2820,8 +2825,9 @@ $wgUsePrivateIPs = false;
  * MediaWiki out of the box. Not all languages listed there have translations,
  * see languages/messages/ for the list of languages with some localisation.
  *
- * Warning: Don't use language codes listed in $wgDummyLanguageCodes like "no"
- * for Norwegian (use "nb" instead), or things will break unexpectedly.
+ * Warning: Don't use any of MediaWiki's deprecated language codes listed in
+ * LanguageCode::getDeprecatedCodeMapping or $wgDummyLanguageCodes, like "no"
+ * for Norwegian (use "nb" instead). If you do, things will break unexpectedly.
  *
  * This defines the default interface language for all users, but users can
  * change it in their preferences.
@@ -2880,27 +2886,32 @@ $wgExtraInterlanguageLinkPrefixes = [];
 $wgExtraLanguageNames = [];
 
 /**
- * List of language codes that don't correspond to an actual language.
- * These codes are mostly left-offs from renames, or other legacy things.
- * This array makes them not appear as a selectable language on the installer,
- * and excludes them when running the transstat.php script.
- */
-$wgDummyLanguageCodes = [
-       'als' => 'gsw',
-       'bat-smg' => 'sgs',
-       'be-x-old' => 'be-tarask',
-       'bh' => 'bho',
-       'fiu-vro' => 'vro',
-       'no' => 'nb',
-       'qqq' => 'qqq', # Used for message documentation.
-       'qqx' => 'qqx', # Used for viewing message keys.
-       'roa-rup' => 'rup',
-       'simple' => 'en',
-       'zh-classical' => 'lzh',
-       'zh-min-nan' => 'nan',
-       'zh-yue' => 'yue',
+ * List of mappings from one language code to another.
+ * This array makes the codes not appear as a selectable language on the
+ * installer, and excludes them when running the transstat.php script.
+ *
+ * In Setup.php, the variable $wgDummyLanguageCodes is created by combining
+ * these codes with a list of "deprecated" codes, which are mostly leftovers
+ * from renames or other legacy things, and the internal codes 'qqq' and 'qqx'.
+ * If a mapping in $wgExtraLanguageCodes collide with a built-in mapping, the
+ * value in $wgExtraLanguageCodes will be used.
+ *
+ * @since 1.29
+ */
+$wgExtraLanguageCodes = [
+       'bh' => 'bho', // Bihari language family
+       'no' => 'nb', // Norwegian language family
+       'simple' => 'en', // Simple English
 ];
 
+/**
+ * Functionally the same as $wgExtraLanguageCodes, but deprecated. Instead of
+ * appending values to this array, append them to $wgExtraLanguageCodes.
+ *
+ * @deprecated since 1.29
+ */
+$wgDummyLanguageCodes = [];
+
 /**
  * Set this to true to replace Arabic presentation forms with their standard
  * forms in the U+0600-U+06FF block. This only works if $wgLanguageCode is
@@ -3205,6 +3216,14 @@ $wgHTMLFormAllowTableFormat = true;
  */
 $wgUseMediaWikiUIEverywhere = false;
 
+/**
+ * Temporary variable that determines whether the EditPage class should use OOjs UI or not.
+ * This will be removed later and OOjs UI will become the only option.
+ *
+ * @since 1.29
+ */
+$wgOOUIEditPage = true;
+
 /**
  * Whether to label the store-to-database-and-show-to-others button in the editor
  * as "Save page"/"Save changes" if false (the default) or, if true, instead as
@@ -3357,7 +3376,7 @@ $wgDisableOutputCompression = false;
  *
  * Currently this appears to work fine in all browsers, but it's disabled by
  * default because it normalizes id's a bit too aggressively, breaking preexisting
- * content (particularly Cite).  See bug 27733, bug 27694, bug 27474.
+ * content (particularly Cite).  See T29733, T29694, T29474.
  */
 $wgExperimentalHtmlIds = false;
 
@@ -3654,6 +3673,16 @@ $wgResourceLoaderMinifierMaxLineLength = 1000;
  */
 $wgIncludeLegacyJavaScript = false;
 
+/**
+ * Use jQuery 3 (with jQuery Migrate) instead of jQuery 1.
+ *
+ * This is a temporary feature flag for the MediaWiki 1.29 development cycle while
+ * instabilities with jQuery 3 are being addressed. See T124742.
+ *
+ * @deprecated since 1.29
+ */
+$wgUsejQueryThree = true;
+
 /**
  * Whether or not to assign configuration variables to the global window object.
  *
@@ -4081,7 +4110,7 @@ $wgMaxRedirects = 1;
  * Attempting to create a redirect to any of the pages in this array
  * will make the redirect fail.
  * Userlogout is hard-coded, so it does not need to be listed here.
- * (bug 10569) Disallow Mypage and Mytalk as well.
+ * (T12569) Disallow Mypage and Mytalk as well.
  *
  * As of now, this only checks special pages. Redirects to pages in
  * other namespaces cannot be invalidated by this variable.
@@ -4162,7 +4191,7 @@ $wgMaxPPExpandDepth = 40;
  *
  * WARNING: Do not add 'file:' to this or internal file links will be broken.
  * Instead, if you want to support file links, add 'file://'. The same applies
- * to any other protocols with the same name as a namespace. See bug #44011 for
+ * to any other protocols with the same name as a namespace. See task T46011 for
  * more information.
  *
  * @see wfParseUrl
@@ -4235,7 +4264,8 @@ $wgAllowImageTag = false;
  *    - RaggettInternalPHP: Use the PECL extension
  *    - RaggettExternal: Shell out to an external binary (tidyBin)
  *    - Html5Depurate: Use external Depurate service
- *    - Html5Internal: Use the built-in HTML5 balancer
+ *    - Html5Internal: Use the Balancer library in PHP
+ *    - RemexHtml: Use the RemexHtml library in PHP
  *
  *  - tidyConfigFile: Path to configuration file for any of the Raggett drivers
  *  - debugComment: True to add a comment to the output with warning messages
@@ -4565,8 +4595,8 @@ $wgAuthManagerAutoConfig = [
                ],
                // Linking during login is experimental, enable at your own risk - T134952
                // MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class => [
-               //      'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
-               //      'sort' => 100,
+               //   'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
+               //   'sort' => 100,
                // ],
                MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class => [
                        'class' => MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class,
@@ -4865,9 +4895,7 @@ $wgDefaultUserOptions = [
 /**
  * An array of preferences to not show for the user
  */
-$wgHiddenPrefs = [
-       'rcenhancedfilters',
-];
+$wgHiddenPrefs = [];
 
 /**
  * Characters to prevent during new account creations.
@@ -5884,15 +5912,6 @@ $wgBotPasswordsCluster = false;
  */
 $wgBotPasswordsDatabase = false;
 
-/**
- * Whether to disable user group expiry. This is a transitional feature flag
- * in accordance with WMF schema change policy, and will be removed later
- * (hopefully before MW 1.29 release).
- *
- * @since 1.29
- */
-$wgDisableUserGroupExpiry = false;
-
 /** @} */ # end of user rights settings
 
 /************************************************************************//**
@@ -5910,7 +5929,7 @@ $wgSecretKey = false;
  *
  * This can have the following formats:
  * - An array of addresses, either in the values
- *   or the keys (for backward compatibility)
+ *   or the keys (for backward compatibility, deprecated since 1.30)
  * - A string, in that case this is the path to a file
  *   containing the list of IP addresses, one per line
  */
@@ -6743,6 +6762,11 @@ $wgRCWatchCategoryMembership = false;
  */
 $wgUseRCPatrol = true;
 
+/**
+ * Whether to allow users to save their RecentChanges filters
+ */
+$wgStructuredChangeFiltersEnableSaving = false;
+
 /**
  * Use new page patrolling to check new pages on Special:Newpages
  */
@@ -7304,8 +7328,10 @@ $wgServiceWiringFiles = [
 ];
 
 /**
- * Maps jobs to their handling classes; extensions
- * can add to this to provide custom jobs
+ * Maps jobs to their handlers; extensions
+ * can add to this to provide custom jobs.
+ * A job handler should either be a class name to be instantiated,
+ * or (since 1.30) a callback to use for creating the job object.
  */
 $wgJobClasses = [
        'refreshLinks' => 'RefreshLinksJob',
@@ -7384,6 +7410,19 @@ $wgJobQueueAggregator = [
        'class' => 'JobQueueAggregatorNull'
 ];
 
+/**
+ * Whether to include the number of jobs that are queued
+ * for the API's maxlag parameter.
+ * The total number of jobs will be divided by this to get an
+ * estimated second of maxlag. Typically bots backoff at maxlag=5,
+ * so setting this to the max number of jobs that should be in your
+ * queue divided by 5 should have the effect of stopping bots once
+ * that limit is hit.
+ *
+ * @since 1.29
+ */
+$wgJobQueueIncludeInMaxLagFactor = false;
+
 /**
  * Additional functions to be performed with updateSpecialPages.
  * Expensive Querypages are already updated.
@@ -7392,15 +7431,6 @@ $wgSpecialPageCacheUpdates = [
        'Statistics' => [ 'SiteStatsUpdate', 'cacheUpdate' ]
 ];
 
-/**
- * Hooks that are used for outputting exceptions.  Format is:
- *   $wgExceptionHooks[] = $funcname
- * or:
- *   $wgExceptionHooks[] = [ $class, $funcname ]
- * Hooks should return strings or false
- */
-$wgExceptionHooks = [];
-
 /**
  * Page property link table invalidation lists. When a page property
  * changes, this may require other link tables to be updated (eg
@@ -8121,11 +8151,41 @@ $wgShellCgroup = false;
 $wgPhpCli = '/usr/bin/php';
 
 /**
- * Locale for LC_CTYPE, to work around https://bugs.php.net/bug.php?id=45132
- * For Unix-like operating systems, set this to to a locale that has a UTF-8
- * character set. Only the character set is relevant.
- */
-$wgShellLocale = 'en_US.utf8';
+ * Locale for LC_ALL, to provide a known environment for locale-sensitive operations
+ *
+ * For Unix-like operating systems, this should be set to C.UTF-8 or an
+ * equivalent to provide the most consistent behavior for locale-sensitive
+ * C library operations across different-language wikis. If that locale is not
+ * available, use another locale that has a UTF-8 character set.
+ *
+ * This setting mainly affects the behavior of C library functions, including:
+ *  - String collation (order when sorting using locale-sensitive comparison)
+ *    - For example, whether "Å" and "A" are considered to be the same letter or
+ *      different letters and if different whether it comes after "A" or after
+ *      "Z", and whether sorting is case sensitive.
+ *  - String character set (how characters beyond basic ASCII are represented)
+ *    - We need this to be a UTF-8 character set to work around
+ *      https://bugs.php.net/bug.php?id=45132
+ *  - Language used for low-level error messages.
+ *  - Formatting of date/time and numeric values (e.g. '.' versus ',' as the
+ *    decimal separator)
+ *
+ * MediaWiki provides its own methods and classes to perform many
+ * locale-sensitive operations, which are designed to be able to vary locale
+ * based on wiki language or user preference:
+ *  - MediaWiki's Collation class should generally be used instead of the C
+ *    library collation functions when locale-sensitive sorting is needed.
+ *  - MediaWiki's Message class should be used for localization of messages
+ *    displayed to the user.
+ *  - MediaWiki's Language class should be used for formatting numeric and
+ *    date/time values.
+ *
+ * @note If multiple wikis are being served from the same process (e.g. the
+ *  same fastCGI or Apache server), this setting must be the same on all those
+ *  wikis.
+ * @see wfInitShellLocale()
+ */
+$wgShellLocale = 'C.UTF-8';
 
 /** @} */ # End shell }
 
@@ -8372,7 +8432,7 @@ $wgPagePropsHaveSortkey = true;
 /**
  * Port where you have HTTPS running
  * Supports HTTPS on non-standard ports
- * @see bug 65184
+ * @see T67184
  * @since 1.24
  */
 $wgHttpsPort = 443;
@@ -8560,6 +8620,7 @@ $wgCSPFalsePositiveUrls = [
        'https://atpixel.alephd.com' => true,
        'https://rtb.metrigo.com' => true,
        'https://d5p.de17a.com' => true,
+       'https://ad.lkqd.net/vpaid/vpaid.js' => true,
 ];
 
 /**
index 35c2a2d..6bc70ed 100644 (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';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * @defgroup Constants MediaWiki constants
  */
index 814da6a..098ffbf 100644 (file)
@@ -363,8 +363,8 @@ class EditPage {
        /** @var bool */
        public $bot = true;
 
-       /** @var null|string */
-       public $contentModel = null;
+       /** @var string */
+       public $contentModel;
 
        /** @var null|string */
        public $contentFormat = null;
@@ -413,10 +413,17 @@ class EditPage {
         */
        private $isOldRev = false;
 
+       /**
+        * @var bool Whether OOUI should be enabled here
+        */
+       private $oouiEnabled = false;
+
        /**
         * @param Article $article
         */
        public function __construct( Article $article ) {
+               global $wgOOUIEditPage;
+
                $this->mArticle = $article;
                $this->page = $article->getPage(); // model object
                $this->mTitle = $article->getTitle();
@@ -426,6 +433,8 @@ class EditPage {
 
                $handler = ContentHandler::getForModelID( $this->contentModel );
                $this->contentFormat = $handler->getDefaultFormat();
+
+               $this->oouiEnabled = $wgOOUIEditPage;
        }
 
        /**
@@ -476,6 +485,14 @@ class EditPage {
                }
        }
 
+       /**
+        * Check if the edit page is using OOUI controls
+        * @return bool
+        */
+       public function isOouiEnabled() {
+               return $this->oouiEnabled;
+       }
+
        /**
         * Returns if the given content model is editable.
         *
@@ -843,6 +860,9 @@ class EditPage {
        public function importFormData( &$request ) {
                global $wgContLang, $wgUser;
 
+               # Allow users to change the mode for testing
+               $this->oouiEnabled = $request->getFuzzyBool( 'ooui', $this->oouiEnabled );
+
                # Section edit can come from either the form or a link
                $this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) );
 
@@ -993,7 +1013,7 @@ class EditPage {
                        $this->recreate = false;
 
                        // When creating a new section, we can preload a section title by passing it as the
-                       // preloadtitle parameter in the URL (Bug 13100)
+                       // preloadtitle parameter in the URL (T15100)
                        if ( $this->section == 'new' && $request->getVal( 'preloadtitle' ) ) {
                                $this->sectiontitle = $request->getVal( 'preloadtitle' );
                                // Once wpSummary isn't being use for setting section titles, we should delete this.
@@ -1027,7 +1047,7 @@ class EditPage {
                        throw new ErrorPageError(
                                'editpage-invalidcontentmodel-title',
                                'editpage-invalidcontentmodel-text',
-                               [ $this->contentModel ]
+                               [ wfEscapeWikiText( $this->contentModel ) ]
                        );
                }
 
@@ -1035,7 +1055,10 @@ class EditPage {
                        throw new ErrorPageError(
                                'editpage-notsupportedcontentformat-title',
                                'editpage-notsupportedcontentformat-text',
-                               [ $this->contentFormat, ContentHandler::getLocalizedName( $this->contentModel ) ]
+                               [
+                                       wfEscapeWikiText( $this->contentFormat ),
+                                       wfEscapeWikiText( ContentHandler::getLocalizedName( $this->contentModel ) )
+                               ]
                        );
                }
 
@@ -1255,11 +1278,7 @@ class EditPage {
                }
                $revision = $this->mArticle->getRevisionFetched();
                if ( $revision === null ) {
-                       if ( !$this->contentModel ) {
-                               throw new RuntimeException( 'EditPage contentModel was false' );
-                       }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
-
                        return $handler->makeEmptyContent();
                }
                $content = $revision->getContent( Revision::FOR_THIS_USER, $user );
@@ -1299,11 +1318,7 @@ class EditPage {
                $content = $rev ? $rev->getContent( Revision::RAW ) : null;
 
                if ( $content === false || $content === null ) {
-                       if ( !$this->contentModel ) {
-                               throw new RuntimeException( 'EditPage contentModel was false' );
-                       }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
-
                        return $handler->makeEmptyContent();
                } elseif ( !$this->undidRev ) {
                        // Content models should always be the same since we error
@@ -1437,10 +1452,8 @@ class EditPage {
         * This uses a temporary cookie for each revision ID so separate saves will never
         * interfere with each other.
         *
-        * The cookie is deleted in the mediawiki.action.view.postEdit JS module after
-        * the redirect.  It must be clearable by JavaScript code, so it must not be
-        * marked HttpOnly. The JavaScript code converts the cookie to a wgPostEdit config
-        * variable.
+        * Article::view deletes the cookie on server-side after the redirect and
+        * converts the value to the global JavaScript variable wgPostEdit.
         *
         * If the variable were set on the server, it would be cached, which is unwanted
         * since the post-edit state should only apply to the load right after the save.
@@ -1459,9 +1472,7 @@ class EditPage {
                }
 
                $response = RequestContext::getMain()->getRequest()->response();
-               $response->setCookie( $postEditKey, $val, time() + self::POST_EDIT_COOKIE_DURATION, [
-                       'httpOnly' => false,
-               ] );
+               $response->setCookie( $postEditKey, $val, time() + self::POST_EDIT_COOKIE_DURATION );
        }
 
        /**
@@ -1911,7 +1922,7 @@ class EditPage {
 
                        // Don't save a new page if it's blank or if it's a MediaWiki:
                        // message with content equivalent to default (allow empty pages
-                       // in this case to disable messages, see bug 50124)
+                       // in this case to disable messages, see T52124)
                        $defaultMessageText = $this->mTitle->getDefaultMessageText();
                        if ( $this->mTitle->getNamespace() === NS_MEDIAWIKI && $defaultMessageText !== false ) {
                                $defaultText = $defaultMessageText;
@@ -2326,12 +2337,9 @@ class EditPage {
        }
 
        public function setHeaders() {
-               global $wgOut, $wgUser, $wgAjaxEditStash, $wgCookieSetOnAutoblock;
+               global $wgOut, $wgUser, $wgAjaxEditStash;
 
                $wgOut->addModules( 'mediawiki.action.edit' );
-               if ( $wgCookieSetOnAutoblock === true ) {
-                       $wgOut->addModules( 'mediawiki.user.blockcookie' );
-               }
                $wgOut->addModuleStyles( 'mediawiki.action.edit.styles' );
 
                if ( $wgUser->getOption( 'showtoolbar' ) ) {
@@ -2432,7 +2440,7 @@ class EditPage {
                # Show log extract when the user is currently blocked
                if ( $namespace == NS_USER || $namespace == NS_USER_TALK ) {
                        $username = explode( '/', $this->mTitle->getText(), 2 )[0];
-                       $user = User::newFromName( $username, false /* allow IP users*/ );
+                       $user = User::newFromName( $username, false /* allow IP users */ );
                        $ip = User::isIP( $username );
                        $block = Block::newFromTarget( $user, $user );
                        if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
@@ -2618,7 +2626,7 @@ class EditPage {
                        return;
                }
 
-               $this->showHeader();
+               $this->showHeader();
 
                $wgOut->addHTML( $this->editFormPageTop );
 
@@ -2641,10 +2649,11 @@ class EditPage {
                }
 
                // @todo add EditForm plugin interface and use it here!
-               //       search for textarea1 and textares2, and allow EditForm to override all uses.
+               //       search for textarea1 and textarea2, and allow EditForm to override all uses.
                $wgOut->addHTML( Html::openElement(
                        'form',
                        [
+                               'class' => $this->oouiEnabled ? 'mw-editform-ooui' : 'mw-editform-legacy',
                                'id' => self::EDITFORM_ID,
                                'name' => self::EDITFORM_ID,
                                'method' => 'post',
@@ -2731,7 +2740,7 @@ class EditPage {
                if ( $this->hasPresetSummary ) {
                        // If a summary has been preset using &summary= we don't want to prompt for
                        // a different summary. Only prompt for a summary if the summary is blanked.
-                       // (Bug 17416)
+                       // (T19416)
                        $this->autoSumm = md5( '' );
                }
 
@@ -2744,6 +2753,14 @@ class EditPage {
                $wgOut->addHTML( Html::hidden( 'format', $this->contentFormat ) );
                $wgOut->addHTML( Html::hidden( 'model', $this->contentModel ) );
 
+               // Preserve &ooui=1 / &ooui=0 from URL parameters after submitting the page for preview
+               $wgOut->addHTML( Html::hidden( 'ooui', $this->oouiEnabled ? '1' : '0' ) );
+
+               // following functions will need OOUI, enable it only once; here.
+               if ( $this->oouiEnabled ) {
+                       $wgOut->enableOOUI();
+               }
+
                if ( $this->section == 'new' ) {
                        $this->showSummaryInput( true, $this->summary );
                        $wgOut->addHTML( $this->getSummaryPreview( true, $this->summary ) );
@@ -2891,24 +2908,38 @@ class EditPage {
                                }
                        }
 
+                       $buttonLabelKey = $this->getSaveButtonLabel();
+
                        if ( $this->missingComment ) {
                                $wgOut->wrapWikiMsg( "<div id='mw-missingcommenttext'>\n$1\n</div>", 'missingcommenttext' );
                        }
 
                        if ( $this->missingSummary && $this->section != 'new' ) {
-                               $wgOut->wrapWikiMsg( "<div id='mw-missingsummary'>\n$1\n</div>", 'missingsummary' );
+                               $wgOut->wrapWikiMsg(
+                                       "<div id='mw-missingsummary'>\n$1\n</div>",
+                                       [ 'missingsummary', $buttonLabelKey ]
+                               );
                        }
 
                        if ( $this->missingSummary && $this->section == 'new' ) {
-                               $wgOut->wrapWikiMsg( "<div id='mw-missingcommentheader'>\n$1\n</div>", 'missingcommentheader' );
+                               $wgOut->wrapWikiMsg(
+                                       "<div id='mw-missingcommentheader'>\n$1\n</div>",
+                                       [ 'missingcommentheader', $buttonLabelKey ]
+                               );
                        }
 
                        if ( $this->blankArticle ) {
-                               $wgOut->wrapWikiMsg( "<div id='mw-blankarticle'>\n$1\n</div>", 'blankarticle' );
+                               $wgOut->wrapWikiMsg(
+                                       "<div id='mw-blankarticle'>\n$1\n</div>",
+                                       [ 'blankarticle', $buttonLabelKey ]
+                               );
                        }
 
                        if ( $this->selfRedirect ) {
-                               $wgOut->wrapWikiMsg( "<div id='mw-selfredirect'>\n$1\n</div>", 'selfredirect' );
+                               $wgOut->wrapWikiMsg(
+                                       "<div id='mw-selfredirect'>\n$1\n</div>",
+                                       [ 'selfredirect', $buttonLabelKey ]
+                               );
                        }
 
                        if ( $this->hookError !== '' ) {
@@ -3015,6 +3046,25 @@ class EditPage {
                $this->showHeaderCopyrightWarning();
        }
 
+       /**
+        * Helper function for summary input functions, which returns the neccessary
+        * attributes for the input.
+        *
+        * @param array|null $inputAttrs Array of attrs to use on the input
+        * @return array
+        */
+       private function getSummaryInputAttributes( array $inputAttrs = null ) {
+               // Note: the maxlength is overridden in JS to 255 and to make it use UTF-8 bytes, not characters.
+               return ( is_array( $inputAttrs ) ? $inputAttrs : [] ) + [
+                       'id' => 'wpSummary',
+                       'name' => 'wpSummary',
+                       'maxlength' => '200',
+                       'tabindex' => '1',
+                       'size' => 60,
+                       'spellcheck' => 'true',
+               ] + Linker::tooltipAndAccesskeyAttribs( 'summary' );
+       }
+
        /**
         * Standard summary input and label (wgSummary), abstracted so EditPage
         * subclasses may reorganize the form.
@@ -3032,14 +3082,7 @@ class EditPage {
        public function getSummaryInput( $summary = "", $labelText = null,
                $inputAttrs = null, $spanLabelAttrs = null
        ) {
-               // Note: the maxlength is overridden in JS to 255 and to make it use UTF-8 bytes, not characters.
-               $inputAttrs = ( is_array( $inputAttrs ) ? $inputAttrs : [] ) + [
-                       'id' => 'wpSummary',
-                       'maxlength' => '200',
-                       'tabindex' => '1',
-                       'size' => 60,
-                       'spellcheck' => 'true',
-               ] + Linker::tooltipAndAccesskeyAttribs( 'summary' );
+               $inputAttrs = $this->getSummaryInputAttributes( $inputAttrs );
 
                $spanLabelAttrs = ( is_array( $spanLabelAttrs ) ? $spanLabelAttrs : [] ) + [
                        'class' => $this->missingSummary ? 'mw-summarymissed' : 'mw-summary',
@@ -3061,6 +3104,35 @@ class EditPage {
                return [ $label, $input ];
        }
 
+       /**
+        * Same as self::getSummaryInput, but uses OOUI, instead of plain HTML.
+        * Builds a standard summary input with a label.
+        *
+        * @param string $summary The value of the summary input
+        * @param string $labelText The html to place inside the label
+        * @param array $inputAttrs Array of attrs to use on the input
+        *
+        * @return OOUI\FieldLayout OOUI FieldLayout with Label and Input
+        */
+       function getSummaryInputOOUI( $summary = "", $labelText = null, $inputAttrs = null ) {
+               $inputAttrs = OOUI\Element::configFromHtmlAttributes(
+                       $this->getSummaryInputAttributes( $inputAttrs )
+               );
+
+               return new OOUI\FieldLayout(
+                       new OOUI\TextInputWidget( [
+                               'value' => $summary,
+                               'infusable' => true,
+                       ] + $inputAttrs ),
+                       [
+                               'label' => new OOUI\HtmlSnippet( $labelText ),
+                               'align' => 'top',
+                               'id' => 'wpSummaryLabel',
+                               'classes' => [ $this->missingSummary ? 'mw-summarymissed' : 'mw-summary' ],
+                       ]
+               );
+       }
+
        /**
         * @param bool $isSubjectPreview True if this is the section subject/title
         *   up top, or false if this is the comment summary
@@ -3069,6 +3141,7 @@ class EditPage {
         */
        protected function showSummaryInput( $isSubjectPreview, $summary = "" ) {
                global $wgOut;
+
                # Add a class if 'missingsummary' is triggered to allow styling of the summary line
                $summaryClass = $this->missingSummary ? 'mw-summarymissed' : 'mw-summary';
                if ( $isSubjectPreview ) {
@@ -3080,14 +3153,22 @@ class EditPage {
                                return;
                        }
                }
+
                $labelText = $this->context->msg( $isSubjectPreview ? 'subject' : 'summary' )->parse();
-               list( $label, $input ) = $this->getSummaryInput(
-                       $summary,
-                       $labelText,
-                       [ 'class' => $summaryClass ],
-                       []
-               );
-               $wgOut->addHTML( "{$label} {$input}" );
+               if ( $this->oouiEnabled ) {
+                       $wgOut->addHTML( $this->getSummaryInputOOUI(
+                               $summary,
+                               $labelText,
+                               [ 'class' => $summaryClass ]
+                       ) );
+               } else {
+                       list( $label, $input ) = $this->getSummaryInput(
+                               $summary,
+                               $labelText,
+                               [ 'class' => $summaryClass ]
+                       );
+                       $wgOut->addHTML( "{$label} {$input}" );
+               }
        }
 
        /**
@@ -3497,9 +3578,21 @@ HTML
                        $wgOut->addHTML( $this->getSummaryPreview( false, $this->summary ) );
                }
 
-               $checkboxes = $this->getCheckboxes( $tabindex,
-                       [ 'minor' => $this->minoredit, 'watch' => $this->watchthis ] );
-               $wgOut->addHTML( "<div class='editCheckboxes'>" . implode( $checkboxes, "\n" ) . "</div>\n" );
+               if ( $this->oouiEnabled ) {
+                       $checkboxes = $this->getCheckboxesOOUI(
+                               $tabindex,
+                               [ 'minor' => $this->minoredit, 'watch' => $this->watchthis ]
+                       );
+                       $checkboxesHTML = new OOUI\HorizontalLayout( [ 'items' => $checkboxes ] );
+               } else {
+                       $checkboxes = $this->getCheckboxes(
+                               $tabindex,
+                               [ 'minor' => $this->minoredit, 'watch' => $this->watchthis ]
+                       );
+                       $checkboxesHTML = implode( $checkboxes, "\n" );
+               }
+
+               $wgOut->addHTML( "<div class='editCheckboxes'>" . $checkboxesHTML . "</div>\n" );
 
                // Show copyright warning.
                $wgOut->addWikiText( $this->getCopywarn() );
@@ -3517,12 +3610,12 @@ HTML
 
                $message = $this->context->msg( 'edithelppage' )->inContentLanguage()->text();
                $edithelpurl = Skin::makeInternalOrExternalUrl( $message );
-               $attrs = [
-                       'target' => 'helpwindow',
-                       'href' => $edithelpurl,
-               ];
-               $edithelp = Html::linkButton( $this->context->msg( 'edithelp' )->text(),
-                       $attrs, [ 'mw-ui-quiet' ] ) .
+               $edithelp =
+                       Html::linkButton(
+                               $this->context->msg( 'edithelp' )->text(),
+                               [ 'target' => 'helpwindow', 'href' => $edithelpurl ],
+                               [ 'mw-ui-quiet' ]
+                       ) .
                        $this->context->msg( 'word-separator' )->escaped() .
                        $this->context->msg( 'newwindow' )->parse();
 
@@ -3565,7 +3658,7 @@ HTML
                }
        }
 
-       private function incrementConflictStats() {
+       protected function incrementConflictStats() {
                $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                $stats->increment( 'edit.failures.conflict' );
                // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
@@ -3582,20 +3675,28 @@ HTML
         */
        public function getCancelLink() {
                $cancelParams = [];
-               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                if ( !$this->isConflict && $this->oldid > 0 ) {
                        $cancelParams['oldid'] = $this->oldid;
                } elseif ( $this->getContextTitle()->isRedirect() ) {
                        $cancelParams['redirect'] = 'no';
                }
-               $attrs = [ 'id' => 'mw-editform-cancel' ];
-
-               return $linkRenderer->makeKnownLink(
-                       $this->getContextTitle(),
-                       new HtmlArmor( $this->context->msg( 'cancel' )->parse() ),
-                       Html::buttonAttributes( $attrs, [ 'mw-ui-quiet' ] ),
-                       $cancelParams
-               );
+               if ( $this->oouiEnabled ) {
+                       return new OOUI\ButtonWidget( [
+                               'id' => 'mw-editform-cancel',
+                               'href' => $this->getContextTitle()->getLinkUrl( $cancelParams ),
+                               'label' => new OOUI\HtmlSnippet( $this->context->msg( 'cancel' )->parse() ),
+                               'framed' => false,
+                               'infusable' => true,
+                               'flags' => 'destructive',
+                       ] );
+               } else {
+                       return MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
+                               $this->getContextTitle(),
+                               new HtmlArmor( $this->context->msg( 'cancel' )->parse() ),
+                               Html::buttonAttributes( [ 'id' => 'mw-editform-cancel' ], [ 'mw-ui-quiet' ] ),
+                               $cancelParams
+                       );
+               }
        }
 
        /**
@@ -4008,132 +4109,295 @@ HTML
                }
 
                $script .= '});';
-               $wgOut->addScript( ResourceLoader::makeInlineScript( $script ) );
 
                $toolbar = '<div id="toolbar"></div>';
 
-               Hooks::run( 'EditPageBeforeEditToolbar', [ &$toolbar ] );
+               if ( Hooks::run( 'EditPageBeforeEditToolbar', [ &$toolbar ] ) ) {
+                       // Only add the old toolbar cruft to the page payload if the toolbar has not
+                       // been over-written by a hook caller
+                       $wgOut->addScript( ResourceLoader::makeInlineScript( $script ) );
+               };
 
                return $toolbar;
        }
 
        /**
-        * Returns an array of html code of the following checkboxes:
+        * Return an array of checkbox definitions.
+        *
+        * Array keys correspond to the `<input>` 'name' attribute to use for each checkbox.
+        *
+        * Array values are associative arrays with the following keys:
+        *  - 'label-message' (required): message for label text
+        *  - 'id' (required): 'id' attribute for the `<input>`
+        *  - 'default' (required): default checkedness (true or false)
+        *  - 'title-message' (optional): used to generate 'title' attribute for the `<label>`
+        *  - 'tooltip' (optional): used to generate 'title' and 'accesskey' attributes
+        *    from messages like 'tooltip-foo', 'accesskey-foo'
+        *  - 'label-id' (optional): 'id' attribute for the `<label>`
+        *  - 'legacy-name' (optional): short name for backwards-compatibility
+        * @param array $checked Array of checkbox name (matching the 'legacy-name') => bool,
+        *   where bool indicates the checked status of the checkbox
+        * @return array
+        */
+       protected function getCheckboxesDefinition( $checked ) {
+               global $wgUser;
+               $checkboxes = [];
+
+               // don't show the minor edit checkbox if it's a new page or section
+               if ( !$this->isNew && $wgUser->isAllowed( 'minoredit' ) ) {
+                       $checkboxes['wpMinoredit'] = [
+                               'id' => 'wpMinoredit',
+                               'label-message' => 'minoredit',
+                               // Uses messages: tooltip-minoredit, accesskey-minoredit
+                               'tooltip' => 'minoredit',
+                               'label-id' => 'mw-editpage-minoredit',
+                               'legacy-name' => 'minor',
+                               'default' => $checked['minor'],
+                       ];
+               }
+
+               if ( $wgUser->isLoggedIn() ) {
+                       $checkboxes['wpWatchthis'] = [
+                               'id' => 'wpWatchthis',
+                               'label-message' => 'watchthis',
+                               // Uses messages: tooltip-watch, accesskey-watch
+                               'tooltip' => 'watch',
+                               'label-id' => 'mw-editpage-watch',
+                               'legacy-name' => 'watch',
+                               'default' => $checked['watch'],
+                       ];
+               }
+
+               $editPage = $this;
+               Hooks::run( 'EditPageGetCheckboxesDefinition', [ $editPage, &$checkboxes ] );
+
+               return $checkboxes;
+       }
+
+       /**
+        * Returns an array of html code of the following checkboxes old style:
         * minor and watch
         *
         * @param int $tabindex Current tabindex
-        * @param array $checked Array of checkbox => bool, where bool indicates the checked
-        *                 status of the checkbox
-        *
+        * @param array $checked See getCheckboxesDefinition()
         * @return array
         */
        public function getCheckboxes( &$tabindex, $checked ) {
-               global $wgUser, $wgUseMediaWikiUIEverywhere;
+               global $wgUseMediaWikiUIEverywhere;
 
                $checkboxes = [];
+               $checkboxesDef = $this->getCheckboxesDefinition( $checked );
 
-               // don't show the minor edit checkbox if it's a new page or section
+               // Backwards-compatibility for the EditPageBeforeEditChecks hook
                if ( !$this->isNew ) {
                        $checkboxes['minor'] = '';
-                       $minorLabel = $this->context->msg( 'minoredit' )->parse();
-                       if ( $wgUser->isAllowed( 'minoredit' ) ) {
-                               $attribs = [
-                                       'tabindex' => ++$tabindex,
-                                       'accesskey' => $this->context->msg( 'accesskey-minoredit' )->text(),
-                                       'id' => 'wpMinoredit',
-                               ];
-                               $minorEditHtml =
-                                       Xml::check( 'wpMinoredit', $checked['minor'], $attribs ) .
-                                       "&#160;<label for='wpMinoredit' id='mw-editpage-minoredit'" .
-                                       Xml::expandAttributes( [ 'title' => Linker::titleAttrib( 'minoredit', 'withaccess' ) ] ) .
-                                       ">{$minorLabel}</label>";
-
-                               if ( $wgUseMediaWikiUIEverywhere ) {
-                                       $checkboxes['minor'] = Html::openElement( 'div', [ 'class' => 'mw-ui-checkbox' ] ) .
-                                               $minorEditHtml .
-                                       Html::closeElement( 'div' );
-                               } else {
-                                       $checkboxes['minor'] = $minorEditHtml;
-                               }
-                       }
                }
-
-               $watchLabel = $this->context->msg( 'watchthis' )->parse();
                $checkboxes['watch'] = '';
-               if ( $wgUser->isLoggedIn() ) {
+
+               foreach ( $checkboxesDef as $name => $options ) {
+                       $legacyName = isset( $options['legacy-name'] ) ? $options['legacy-name'] : $name;
+                       $label = $this->context->msg( $options['label-message'] )->parse();
                        $attribs = [
                                'tabindex' => ++$tabindex,
-                               'accesskey' => $this->context->msg( 'accesskey-watch' )->text(),
-                               'id' => 'wpWatchthis',
+                               'id' => $options['id'],
+                       ];
+                       $labelAttribs = [
+                               'for' => $options['id'],
                        ];
-                       $watchThisHtml =
-                               Xml::check( 'wpWatchthis', $checked['watch'], $attribs ) .
-                               "&#160;<label for='wpWatchthis' id='mw-editpage-watch'" .
-                               Xml::expandAttributes( [ 'title' => Linker::titleAttrib( 'watch', 'withaccess' ) ] ) .
-                               ">{$watchLabel}</label>";
+                       if ( isset( $options['tooltip'] ) ) {
+                               $attribs['accesskey'] = $this->context->msg( "accesskey-{$options['tooltip']}" )->text();
+                               $labelAttribs['title'] = Linker::titleAttrib( $options['tooltip'], 'withaccess' );
+                       }
+                       if ( isset( $options['title-message'] ) ) {
+                               $labelAttribs['title'] = $this->context->msg( $options['title-message'] )->text();
+                       }
+                       if ( isset( $options['label-id'] ) ) {
+                               $labelAttribs['id'] = $options['label-id'];
+                       }
+                       $checkboxHtml =
+                               Xml::check( $name, $options['default'], $attribs ) .
+                               '&#160;' .
+                               Xml::tags( 'label', $labelAttribs, $label );
+
                        if ( $wgUseMediaWikiUIEverywhere ) {
-                               $checkboxes['watch'] = Html::openElement( 'div', [ 'class' => 'mw-ui-checkbox' ] ) .
-                                       $watchThisHtml .
-                                       Html::closeElement( 'div' );
-                       } else {
-                               $checkboxes['watch'] = $watchThisHtml;
+                               $checkboxHtml = Html::rawElement( 'div', [ 'class' => 'mw-ui-checkbox' ], $checkboxHtml );
                        }
+
+                       $checkboxes[ $legacyName ] = $checkboxHtml;
                }
 
                // Avoid PHP 7.1 warning of passing $this by reference
                $editPage = $this;
-               Hooks::run( 'EditPageBeforeEditChecks', [ &$editPage, &$checkboxes, &$tabindex ] );
+               Hooks::run( 'EditPageBeforeEditChecks', [ &$editPage, &$checkboxes, &$tabindex ], '1.29' );
                return $checkboxes;
        }
 
        /**
-        * Returns an array of html code of the following buttons:
-        * save, diff and preview
+        * Returns an array of html code of the following checkboxes:
+        * minor and watch
         *
         * @param int $tabindex Current tabindex
+        * @param array $checked Array of checkbox => bool, where bool indicates the checked
+        *                 status of the checkbox
         *
         * @return array
         */
-       public function getEditButtons( &$tabindex ) {
-               $buttons = [];
+       public function getCheckboxesOOUI( &$tabindex, $checked ) {
+               $checkboxes = [];
+               $checkboxesDef = $this->getCheckboxesDefinition( $checked );
 
+               $origTabindex = $tabindex;
+
+               foreach ( $checkboxesDef as $name => $options ) {
+                       $legacyName = isset( $options['legacy-name'] ) ? $options['legacy-name'] : $name;
+
+                       $title = null;
+                       $accesskey = null;
+                       if ( isset( $options['tooltip'] ) ) {
+                               $accesskey = $this->context->msg( "accesskey-{$options['tooltip']}" )->text();
+                               $title = Linker::titleAttrib( $options['tooltip'], 'withaccess' );
+                       }
+                       if ( isset( $options['title-message'] ) ) {
+                               $title = $this->context->msg( $options['title-message'] )->text();
+                       }
+                       if ( isset( $options['label-id'] ) ) {
+                               $labelAttribs['id'] = $options['label-id'];
+                       }
+
+                       $checkboxes[ $legacyName ] = new OOUI\FieldLayout(
+                               new OOUI\CheckboxInputWidget( [
+                                       'tabIndex' => ++$tabindex,
+                                       'accessKey' => $accesskey,
+                                       'id' => $options['id'],
+                                       'name' => $name,
+                                       'selected' => $options['default'],
+                                       'infusable' => true,
+                               ] ),
+                               [
+                                       'align' => 'inline',
+                                       'label' => new OOUI\HtmlSnippet( $this->context->msg( $options['label-message'] )->parse() ),
+                                       'title' => $title,
+                                       'id' => isset( $options['label-id'] ) ? $options['label-id'] : null,
+                               ]
+                       );
+               }
+
+               // Backwards-compatibility hack to run the EditPageBeforeEditChecks hook. It's important,
+               // people have used it for the weirdest things completely unrelated to checkboxes...
+               // And if we're gonna run it, might as well allow its legacy checkboxes to be shown.
+               $legacyCheckboxes = $this->getCheckboxes( $origTabindex, $checked );
+               foreach ( $legacyCheckboxes as $name => $html ) {
+                       if ( $html && !isset( $checkboxes[$name] ) ) {
+                               $checkboxes[$name] = new OOUI\Widget( [ 'content' => new OOUI\HtmlSnippet( $html ) ] );
+                       }
+               }
+
+               return $checkboxes;
+       }
+
+       /**
+        * Get the message key of the label for the button to save the page
+        *
+        * @return string
+        */
+       private function getSaveButtonLabel() {
                $labelAsPublish =
                        $this->mArticle->getContext()->getConfig()->get( 'EditSubmitButtonLabelPublish' );
 
                // Can't use $this->isNew as that's also true if we're adding a new section to an extant page
+               $newPage = !$this->mTitle->exists();
+
                if ( $labelAsPublish ) {
-                       $buttonLabelKey = !$this->mTitle->exists() ? 'publishpage' : 'publishchanges';
+                       $buttonLabelKey =  $newPage ? 'publishpage' : 'publishchanges';
                } else {
-                       $buttonLabelKey = !$this->mTitle->exists() ? 'savearticle' : 'savechanges';
+                       $buttonLabelKey = $newPage ? 'savearticle' : 'savechanges';
                }
-               $buttonLabel = $this->context->msg( $buttonLabelKey )->text();
+
+               return $buttonLabelKey;
+       }
+
+       /**
+        * Returns an array of html code of the following buttons:
+        * save, diff and preview
+        *
+        * @param int $tabindex Current tabindex
+        *
+        * @return array
+        */
+       public function getEditButtons( &$tabindex ) {
+               $buttons = [];
+
+               $buttonLabelKey = $this->getSaveButtonLabel();
+
                $attribs = [
                        'id' => 'wpSave',
                        'name' => 'wpSave',
                        'tabindex' => ++$tabindex,
                ] + Linker::tooltipAndAccesskeyAttribs( 'save' );
-               $buttons['save'] = Html::submitButton( $buttonLabel, $attribs, [ 'mw-ui-progressive' ] );
 
-               ++$tabindex; // use the same for preview and live preview
+               if ( $this->oouiEnabled ) {
+                       $saveConfig = OOUI\Element::configFromHtmlAttributes( $attribs );
+                       $buttons['save'] = new OOUI\ButtonInputWidget( [
+                               // Support: IE 6 – Use <input>, otherwise it can't distinguish which button was clicked
+                               'useInputTag' => true,
+                               'flags' => [ 'constructive', 'primary' ],
+                               'label' => $this->context->msg( $buttonLabelKey )->text(),
+                               'infusable' => true,
+                               'type' => 'submit',
+                       ] + $saveConfig );
+               } else {
+                       $buttons['save'] = Html::submitButton(
+                               $this->context->msg( $buttonLabelKey )->text(),
+                               $attribs,
+                               [ 'mw-ui-progressive' ]
+                       );
+               }
+
                $attribs = [
                        'id' => 'wpPreview',
                        'name' => 'wpPreview',
-                       'tabindex' => $tabindex,
+                       'tabindex' => ++$tabindex,
                ] + Linker::tooltipAndAccesskeyAttribs( 'preview' );
-               $buttons['preview'] = Html::submitButton( $this->context->msg( 'showpreview' )->text(),
-                       $attribs );
-
+               if ( $this->oouiEnabled ) {
+                       $previewConfig = OOUI\Element::configFromHtmlAttributes( $attribs );
+                       $buttons['preview'] = new OOUI\ButtonInputWidget( [
+                               // Support: IE 6 – Use <input>, otherwise it can't distinguish which button was clicked
+                               'useInputTag' => true,
+                               'label' => $this->context->msg( 'showpreview' )->text(),
+                               'infusable' => true,
+                               'type' => 'submit'
+                       ] + $previewConfig );
+               } else {
+                       $buttons['preview'] = Html::submitButton(
+                               $this->context->msg( 'showpreview' )->text(),
+                               $attribs
+                       );
+               }
                $attribs = [
                        'id' => 'wpDiff',
                        'name' => 'wpDiff',
                        'tabindex' => ++$tabindex,
                ] + Linker::tooltipAndAccesskeyAttribs( 'diff' );
-               $buttons['diff'] = Html::submitButton( $this->context->msg( 'showdiff' )->text(),
-                       $attribs );
+               if ( $this->oouiEnabled ) {
+                       $diffConfig = OOUI\Element::configFromHtmlAttributes( $attribs );
+                       $buttons['diff'] = new OOUI\ButtonInputWidget( [
+                               // Support: IE 6 – Use <input>, otherwise it can't distinguish which button was clicked
+                               'useInputTag' => true,
+                               'label' => $this->context->msg( 'showdiff' )->text(),
+                               'infusable' => true,
+                               'type' => 'submit',
+                       ] + $diffConfig );
+               } else {
+                       $buttons['diff'] = Html::submitButton(
+                               $this->context->msg( 'showdiff' )->text(),
+                               $attribs
+                       );
+               }
 
                // Avoid PHP 7.1 warning of passing $this by reference
                $editPage = $this;
                Hooks::run( 'EditPageBeforeEditButtons', [ &$editPage, &$buttons, &$tabindex ] );
+
                return $buttons;
        }
 
@@ -4431,7 +4695,10 @@ HTML
         * @since 1.29
         */
        protected function addExplainConflictHeader( OutputPage $out ) {
-               $out->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
+               $out->wrapWikiMsg(
+                       "<div class='mw-explainconflict'>\n$1\n</div>",
+                       [ 'explainconflict', $this->getSaveButtonLabel() ]
+               );
        }
 
        /**
index 071a3db..3268291 100644 (file)
@@ -129,13 +129,6 @@ class FeedUtils {
                }
 
                if ( $oldid ) {
-
-                       # $diffText = $de->getDiff( wfMessage( 'revisionasof',
-                       #       $wgLang->timeanddate( $timestamp ),
-                       #       $wgLang->date( $timestamp ),
-                       #       $wgLang->time( $timestamp ) )->text(),
-                       #       wfMessage( 'currentrev' )->text() );
-
                        $diffText = '';
                        // Don't bother generating the diff if we won't be able to show it
                        if ( $wgFeedDiffCutoff > 0 ) {
@@ -196,7 +189,7 @@ class FeedUtils {
 
                        if ( $html === null ) {
 
-                               // Omit large new page diffs, bug 29110
+                               // Omit large new page diffs, T31110
                                // Also use diff link for non-textual content
                                $diffText = self::getDiffLink( $title, $newid );
                        } else {
index af5d5fa..e1d0520 100644 (file)
@@ -27,7 +27,9 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 use Liuggio\StatsdClient\Sender\SocketSender;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\Session\SessionManager;
+use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\DBReplicationWaitError;
 
 // Hide compatibility functions from Doxygen
 /// @cond
@@ -222,18 +224,18 @@ function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
 /**
  * Merge arrays in the style of getUserPermissionsErrors, with duplicate removal
  * e.g.
- *     wfMergeErrorArrays(
- *             [ [ 'x' ] ],
- *             [ [ 'x', '2' ] ],
- *             [ [ 'x' ] ],
- *             [ [ 'y' ] ]
- *     );
+ *     wfMergeErrorArrays(
+ *       [ [ 'x' ] ],
+ *       [ [ 'x', '2' ] ],
+ *       [ [ 'x' ] ],
+ *       [ [ 'y' ] ]
+ *     );
  * returns:
- *             [
- *             [ 'x', '2' ],
- *             [ 'x' ],
- *             [ 'y' ]
- *     ]
+ *     [
+ *       [ 'x', '2' ],
+ *       [ 'x' ],
+ *       [ 'y' ]
+ *     ]
  *
  * @param array $array1,...
  * @return array
@@ -1197,7 +1199,9 @@ function wfLogProfilingData() {
                        $statsdSender = new SocketSender( $statsdHost, $statsdPort );
                        $statsdClient = new SamplingStatsdClient( $statsdSender, true, false );
                        $statsdClient->setSamplingRates( $config->get( 'StatsdSamplingRates' ) );
-                       $statsdClient->send( $context->getStats()->getBuffer() );
+                       $statsdClient->send(
+                               MediaWikiServices::getInstance()->getStatsdDataFactory()->getBuffer()
+                       );
                } catch ( Exception $ex ) {
                        MWExceptionHandler::logException( $ex );
                }
@@ -1262,7 +1266,7 @@ function wfLogProfilingData() {
  * @return void
  */
 function wfIncrStats( $key, $count = 1 ) {
-       $stats = RequestContext::getMain()->getStats();
+       $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
        $stats->updateCount( $key, $count );
 }
 
@@ -1272,7 +1276,8 @@ function wfIncrStats( $key, $count = 1 ) {
  * @return bool
  */
 function wfReadOnly() {
-       return wfReadOnlyReason() !== false;
+       return MediaWikiServices::getInstance()->getReadOnlyMode()
+               ->isReadOnly();
 }
 
 /**
@@ -1284,19 +1289,8 @@ function wfReadOnly() {
  * @return string|bool String when in read-only mode; false otherwise
  */
 function wfReadOnlyReason() {
-       $readOnly = wfConfiguredReadOnlyReason();
-       if ( $readOnly !== false ) {
-               return $readOnly;
-       }
-
-       static $lbReadOnly = null;
-       if ( $lbReadOnly === null ) {
-               // Callers use this method to be aware that data presented to a user
-               // may be very stale and thus allowing submissions can be problematic.
-               $lbReadOnly = wfGetLB()->getReadOnlyReason();
-       }
-
-       return $lbReadOnly;
+       return MediaWikiServices::getInstance()->getReadOnlyMode()
+               ->getReason();
 }
 
 /**
@@ -1306,18 +1300,8 @@ function wfReadOnlyReason() {
  * @since 1.27
  */
 function wfConfiguredReadOnlyReason() {
-       global $wgReadOnly, $wgReadOnlyFile;
-
-       if ( $wgReadOnly === null ) {
-               // Set $wgReadOnly for faster access next time
-               if ( is_file( $wgReadOnlyFile ) && filesize( $wgReadOnlyFile ) > 0 ) {
-                       $wgReadOnly = file_get_contents( $wgReadOnlyFile );
-               } else {
-                       $wgReadOnly = false;
-               }
-       }
-
-       return $wgReadOnly;
+       return MediaWikiServices::getInstance()->getConfiguredReadOnlyMode()
+               ->getReason();
 }
 
 /**
@@ -1452,7 +1436,6 @@ function wfMsgReplaceArgs( $message, $args ) {
 function wfHostname() {
        static $host;
        if ( is_null( $host ) ) {
-
                # Hostname overriding
                global $wgOverrideHostname;
                if ( $wgOverrideHostname !== false ) {
@@ -2551,8 +2534,15 @@ function wfShellExecWithStderr( $cmd, &$retval = null, $environ = [], $limits =
 }
 
 /**
- * Workaround for https://bugs.php.net/bug.php?id=45132
- * escapeshellarg() destroys non-ASCII characters if LANG is not a UTF-8 locale
+ * Set the locale for locale-sensitive operations
+ *
+ * Sets LC_ALL to a known value to work around issues like the following:
+ * - https://bugs.php.net/bug.php?id=45132 escapeshellarg() destroys non-ASCII
+ *   characters if LANG is not a UTF-8 locale
+ * - T107128 Scribunto string comparison works case insensitive while the
+ *   standard Lua case sensitive
+ *
+ * @see $wgShellLocale
  */
 function wfInitShellLocale() {
        static $done = false;
@@ -2561,8 +2551,8 @@ function wfInitShellLocale() {
        }
        $done = true;
        global $wgShellLocale;
-       putenv( "LC_CTYPE=$wgShellLocale" );
-       setlocale( LC_CTYPE, $wgShellLocale );
+       putenv( "LC_ALL=$wgShellLocale" );
+       setlocale( LC_ALL, $wgShellLocale );
 }
 
 /**
@@ -2573,8 +2563,8 @@ function wfInitShellLocale() {
  * @param string $script MediaWiki cli script path
  * @param array $parameters Arguments and options to the script
  * @param array $options Associative array of options:
- *             'php': The path to the php executable
- *             'wrapper': Path to a PHP wrapper to handle the maintenance script
+ *     'php': The path to the php executable
+ *     'wrapper': Path to a PHP wrapper to handle the maintenance script
  * @return string
  */
 function wfShellWikiCmd( $script, array $parameters = [], array $options = [] ) {
@@ -2972,6 +2962,7 @@ function wfGetPrecompiledData( $name ) {
 /**
  * Make a cache key for the local wiki.
  *
+ * @deprecated since 1.30 Call makeKey on a BagOStuff instance
  * @param string $args,...
  * @return string
  */
@@ -3008,6 +2999,7 @@ function wfForeignMemcKey( $db, $prefix /*...*/ ) {
  * instead. Must have a prefix as otherwise keys that use a database name
  * in the first segment will clash with wfMemcKey/wfForeignMemcKey.
  *
+ * @deprecated since 1.30 Call makeGlobalKey on a BagOStuff instance
  * @since 1.26
  * @param string $args,...
  * @return string
@@ -3072,7 +3064,7 @@ function wfSplitWikiID( $wiki ) {
  * @todo Replace calls to wfGetDB with calls to LoadBalancer::getConnection()
  *       on an injected instance of LoadBalancer.
  *
- * @return Database
+ * @return \Wikimedia\Rdbms\Database
  */
 function wfGetDB( $db, $groups = [], $wiki = false ) {
        return wfGetLB( $wiki )->getConnection( $db, $groups, $wiki );
@@ -3089,9 +3081,9 @@ function wfGetDB( $db, $groups = [], $wiki = false ) {
  */
 function wfGetLB( $wiki = false ) {
        if ( $wiki === false ) {
-               return \MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancer();
+               return MediaWikiServices::getInstance()->getDBLoadBalancer();
        } else {
-               $factory = \MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
                return $factory->getMainLB( $wiki );
        }
 }
@@ -3104,7 +3096,7 @@ function wfGetLB( $wiki = false ) {
  * @return \Wikimedia\Rdbms\LBFactory
  */
 function wfGetLBFactory() {
-       return \MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+       return MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
 }
 
 /**
@@ -3523,7 +3515,9 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
        }
 
        $cache = ObjectCache::getLocalServerInstance( 'hash' );
-       $key = wfMemcKey( 'bad-image-list', ( $blacklist === null ) ? 'default' : md5( $blacklist ) );
+       $key = $cache->makeKey(
+               'bad-image-list', ( $blacklist === null ) ? 'default' : md5( $blacklist )
+       );
        $badImages = $cache->get( $key );
 
        if ( $badImages === false ) { // cache miss
index 3d86201..56cf815 100644 (file)
@@ -590,7 +590,7 @@ class DiffHistoryBlob implements HistoryBlob {
 
        /**
         * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
-        * the bytes backwards and initialised with 0 instead of 1. See bug 34428.
+        * the bytes backwards and initialised with 0 instead of 1. See T36428.
         *
         * @param string $s
         * @return string|bool False if the hash extension is not available
index b46ea81..8fe4dbe 100644 (file)
@@ -220,8 +220,10 @@ class Html {
         * Identical to rawElement(), but HTML-escapes $contents (like
         * Xml::element()).
         *
-        * @param string $element
-        * @param array $attribs
+        * @param string $element Name of the element, e.g., 'a'
+        * @param array $attribs Associative array of attributes, e.g., [
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
+        *   further documentation.
         * @param string $contents
         *
         * @return string
@@ -239,8 +241,10 @@ class Html {
         * Identical to rawElement(), but has no third parameter and omits the end
         * tag (and the self-closing '/' in XML mode for empty elements).
         *
-        * @param string $element
-        * @param array $attribs
+        * @param string $element Name of the element, e.g., 'a'
+        * @param array $attribs Associative array of attributes, e.g., [
+        *   'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
+        *   further documentation.
         *
         * @return string
         */
@@ -459,7 +463,7 @@ class Html {
         *
         * @param array $attribs Associative array of attributes, e.g., [
         *   'href' => 'https://www.mediawiki.org/' ].  Values will be HTML-escaped.
-        *   A value of false means to omit the attribute.  For boolean attributes,
+        *   A value of false or null means to omit the attribute.  For boolean attributes,
         *   you can omit the key, e.g., [ 'checked' ] instead of
         *   [ 'checked' => 'checked' ] or such.
         *
@@ -759,7 +763,7 @@ class Html {
                $attribs['name'] = $name;
 
                if ( substr( $value, 0, 1 ) == "\n" ) {
-                       // Workaround for bug 12130: browsers eat the initial newline
+                       // Workaround for T14130: browsers eat the initial newline
                        // assuming that it's just for show, but they do keep the later
                        // newlines, which we may want to preserve during editing.
                        // Prepending a single newline
index 05e3abb..bed9957 100644 (file)
@@ -164,10 +164,10 @@ class Linker {
        }
 
        /**
-        * Make appropriate markup for a link to the current article. This is
-        * currently rendered as the bold link text. The calling sequence is the
-        * same as the other make*LinkObj static functions, despite $query not
-        * being used.
+        * Make appropriate markup for a link to the current article. This is since
+        * MediaWiki 1.29.0 rendered as an <a> tag without an href and with a class
+        * showing the link text. The calling sequence is the same as for the other
+        * make*LinkObj static functions, but $query is not used.
         *
         * @since 1.16.3
         * @param Title $nt
@@ -179,7 +179,7 @@ class Linker {
         * @return string
         */
        public static function makeSelfLinkObj( $nt, $html = '', $query = '', $trail = '', $prefix = '' ) {
-               $ret = "<strong class=\"selflink\">{$prefix}{$html}</strong>{$trail}";
+               $ret = "<a class=\"mw-selflink selflink\">{$prefix}{$html}</a>{$trail}";
                if ( !Hooks::run( 'SelfLinkBegin', [ $nt, &$html, &$trail, &$prefix, &$ret ] ) ) {
                        return $ret;
                }
@@ -188,7 +188,7 @@ class Linker {
                        $html = htmlspecialchars( $nt->getPrefixedText() );
                }
                list( $inside, $trail ) = self::splitTrail( $trail );
-               return "<strong class=\"selflink\">{$prefix}{$html}{$inside}</strong>{$trail}";
+               return "<a class=\"mw-selflink selflink\">{$prefix}{$html}{$inside}</a>{$trail}";
        }
 
        /**
@@ -590,7 +590,7 @@ class Linker {
 
                # ThumbnailImage::toHtml() already adds page= onto the end of DjVu URLs
                # So we don't need to pass it here in $query. However, the URL for the
-               # zoom icon still needs it, so we make a unique query for it. See bug 14771
+               # zoom icon still needs it, so we make a unique query for it. See T16771
                $url = $title->getLocalURL( $query );
                if ( $page ) {
                        $url = wfAppendQuery( $url, [ 'page' => $page ] );
@@ -892,7 +892,7 @@ class Linker {
                        if ( $altUserName === false ) {
                                $altUserName = IP::prettifyIP( $userName );
                        }
-                       $classes .= ' mw-anonuserlink'; // Separate link class for anons (bug 43179)
+                       $classes .= ' mw-anonuserlink'; // Separate link class for anons (T45179)
                } else {
                        $page = Title::makeTitle( NS_USER, $userName );
                }
@@ -1096,7 +1096,7 @@ class Linker {
        ) {
                # Sanitize text a bit:
                $comment = str_replace( "\n", " ", $comment );
-               # Allow HTML entities (for bug 13815)
+               # Allow HTML entities (for T15815)
                $comment = Sanitizer::escapeHtmlAllowEntities( $comment );
 
                # Render autocomments and make links:
@@ -1165,7 +1165,7 @@ class Linker {
                                                $section = str_replace( '[[', '', $section );
                                                $section = str_replace( ']]', '', $section );
 
-                                               $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # bug 22784
+                                               $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # T24784
                                                if ( $local ) {
                                                        $sectionTitle = Title::newFromText( '#' . $section );
                                                } else {
@@ -1374,7 +1374,7 @@ class Linker {
                        } else {
                                $suffix = '';
                        }
-                       # bug 7425
+                       # T9425
                        $target = trim( $target );
                        # Look at the first character
                        if ( $target != '' && $target[0] === '/' ) {
@@ -1561,7 +1561,7 @@ class Linker {
                $title = wfMessage( 'toc' )->inLanguage( $lang )->escaped();
 
                return '<div id="toc" class="toc">'
-                       . '<div id="toctitle"><h2>' . $title . "</h2></div>\n"
+                       . '<div id="toctitle" class="toctitle"><h2>' . $title . "</h2></div>\n"
                        . $toc
                        . "</ul>\n</div>\n";
        }
@@ -1797,7 +1797,7 @@ class Linker {
 
                if ( $context->getRequest()->getBool( 'bot' ) ) {
                        $query['bot'] = '1';
-                       $query['hidediff'] = '1'; // bug 15999
+                       $query['hidediff'] = '1'; // T17999
                }
 
                $disableRollbackEditCount = false;
index c1e5cc4..7f3649e 100644 (file)
@@ -21,6 +21,7 @@
  * @since 1.20
  * @author Tyler Romeo, 2012
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * Library for creating and parsing MW-style timestamps. Based on the JS
index 09317d7..ee95918 100644 (file)
@@ -46,8 +46,8 @@
  * $magicWords = [];
  *
  * $magicWords['en'] = [
- *     'magicwordkey' => [ 0, 'case_insensitive_magic_word' ],
- *     'magicwordkey2' => [ 1, 'CASE_sensitive_magic_word2' ],
+ *   'magicwordkey' => [ 0, 'case_insensitive_magic_word' ],
+ *   'magicwordkey2' => [ 1, 'CASE_sensitive_magic_word2' ],
  * ];
  * @endcode
  *
@@ -502,7 +502,7 @@ class MagicWord {
                        # multiple matched parts (variable match); some will be empty because of
                        # synonyms. The variable will be the second non-empty one so remove any
                        # blank elements and re-sort the indices.
-                       # See also bug 6526
+                       # See also T8526
 
                        $matches = array_values( array_filter( $matches ) );
 
index cfe4965..b18414d 100644 (file)
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use Psr\Log\LoggerInterface;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ChronologyProtector;
 use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\DBConnectionError;
 
 /**
  * The MediaWiki class is the helper class for the index.php entry point.
@@ -73,7 +75,7 @@ class MediaWiki {
                if ( $request->getCheck( 'search' ) ) {
                        // Compatibility with old search URLs which didn't use Special:Search
                        // Just check for presence here, so blank requests still
-                       // show the search page when using ugly URLs (bug 8054).
+                       // show the search page when using ugly URLs (T10054).
                        $ret = SpecialPage::getTitleFor( 'Search' );
                } elseif ( $curid ) {
                        // URLs like this are generated by RC, because rc_title isn't always accurate
@@ -183,7 +185,7 @@ class MediaWiki {
                $unused = null; // To pass it by reference
                Hooks::run( 'BeforeInitialize', [ &$title, &$unused, &$output, &$user, $request, $this ] );
 
-               // Invalid titles. Bug 21776: The interwikis must redirect even if the page name is empty.
+               // Invalid titles. T23776: The interwikis must redirect even if the page name is empty.
                if ( is_null( $title ) || ( $title->getDBkey() == '' && !$title->isExternal() )
                        || $title->isSpecial( 'Badtitle' )
                ) {
@@ -203,7 +205,7 @@ class MediaWiki {
                        ? [] // relies on HMAC key signature alone
                        : $title->getUserPermissionsErrors( 'read', $user );
                if ( count( $permErrors ) ) {
-                       // Bug 32276: allowing the skin to generate output with $wgTitle or
+                       // T34276: allowing the skin to generate output with $wgTitle or
                        // $this->context->title set to the input title would allow anonymous users to
                        // determine whether a page exists, potentially leaking private data. In fact, the
                        // curid and oldid request  parameters would allow page titles to be enumerated even
@@ -280,7 +282,7 @@ class MediaWiki {
                        }
 
                        // Special pages ($title may have changed since if statement above)
-                       if ( NS_SPECIAL == $title->getNamespace() ) {
+                       if ( $title->isSpecialPage() ) {
                                // Actions that need to be made when we have a special pages
                                SpecialPageFactory::executePath( $title, $this->context );
                        } else {
@@ -520,7 +522,7 @@ class MediaWiki {
                        try {
                                $this->main();
                        } catch ( ErrorPageError $e ) {
-                               // Bug 62091: while exceptions are convenient to bubble up GUI errors,
+                               // T64091: while exceptions are convenient to bubble up GUI errors,
                                // they are not internal application faults. As with normal requests, this
                                // should commit, print the output, do deferred updates, jobs, and profiling.
                                $this->doPreOutputCommit();
@@ -942,24 +944,45 @@ class MediaWiki {
                        $n = intval( $jobRunRate );
                }
 
-               $runJobsLogger = LoggerFactory::getInstance( 'runJobs' );
+               $logger = LoggerFactory::getInstance( 'runJobs' );
 
-               // Fall back to running the job(s) while the user waits if needed
-               if ( !$this->config->get( 'RunJobsAsync' ) ) {
-                       $runner = new JobRunner( $runJobsLogger );
-                       $runner->run( [ 'maxJobs' => $n ] );
-                       return;
-               }
-
-               // Do not send request if there are probably no jobs
                try {
-                       $group = JobQueueGroup::singleton();
-                       if ( !$group->queuesHaveJobs( JobQueueGroup::TYPE_DEFAULT ) ) {
-                               return;
+                       if ( $this->config->get( 'RunJobsAsync' ) ) {
+                               // Send an HTTP request to the job RPC entry point if possible
+                               $invokedWithSuccess = $this->triggerAsyncJobs( $n, $logger );
+                               if ( !$invokedWithSuccess ) {
+                                       // Fall back to blocking on running the job(s)
+                                       $logger->warning( "Jobs switched to blocking; Special:RunJobs disabled" );
+                                       $this->triggerSyncJobs( $n, $logger );
+                               }
+                       } else {
+                               $this->triggerSyncJobs( $n, $logger );
                        }
                } catch ( JobQueueError $e ) {
+                       // Do not make the site unavailable (T88312)
                        MWExceptionHandler::logException( $e );
-                       return; // do not make the site unavailable
+               }
+       }
+
+       /**
+        * @param integer $n Number of jobs to try to run
+        * @param LoggerInterface $runJobsLogger
+        */
+       private function triggerSyncJobs( $n, LoggerInterface $runJobsLogger ) {
+               $runner = new JobRunner( $runJobsLogger );
+               $runner->run( [ 'maxJobs' => $n ] );
+       }
+
+       /**
+        * @param integer $n Number of jobs to try to run
+        * @param LoggerInterface $runJobsLogger
+        * @return bool Success
+        */
+       private function triggerAsyncJobs( $n, LoggerInterface $runJobsLogger ) {
+               // Do not send request if there are probably no jobs
+               $group = JobQueueGroup::singleton();
+               if ( !$group->queuesHaveJobs( JobQueueGroup::TYPE_DEFAULT ) ) {
+                       return true;
                }
 
                $query = [ 'title' => 'Special:RunJobs',
@@ -1026,12 +1049,6 @@ class MediaWiki {
                        $runJobsLogger->error( "Failed to start cron API (socket error $errno): $errstr" );
                }
 
-               // Fall back to running the job(s) while the user waits if needed
-               if ( !$invokedWithSuccess ) {
-                       $runJobsLogger->warning( "Jobs switched to blocking; Special:RunJobs disabled" );
-
-                       $runner = new JobRunner( $runJobsLogger );
-                       $runner->run( [ 'maxJobs'  => $n ] );
-               }
+               return $invokedWithSuccess;
        }
 }
index e44fefe..3bf6d78 100644 (file)
@@ -656,6 +656,22 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'VirtualRESTServiceClient' );
        }
 
+       /**
+        * @since 1.29
+        * @return \ConfiguredReadOnlyMode
+        */
+       public function getConfiguredReadOnlyMode() {
+               return $this->getService( 'ConfiguredReadOnlyMode' );
+       }
+
+       /**
+        * @since 1.29
+        * @return \ReadOnlyMode
+        */
+       public function getReadOnlyMode() {
+               return $this->getService( 'ReadOnlyMode' );
+       }
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service getter here, don't forget to add a test
        // case for it in MediaWikiServicesTest::provideGetters() and in
index e57f880..cc589c9 100644 (file)
@@ -24,6 +24,8 @@
  *
  * @file
  */
+use Wikimedia\Timestamp\TimestampException;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Handles the backend logic of merging the histories of two
index f062d13..8670729 100644 (file)
@@ -28,7 +28,7 @@ class MimeMagic extends MimeAnalyzer {
        /**
         * Get an instance of this class
         * @return MimeMagic
-        * @deprecated since 1.28 get a MimeAnalyzer instance form MediaWikiServices
+        * @deprecated since 1.28 get a MimeAnalyzer instance from MediaWikiServices
         */
        public static function singleton() {
                // XXX: We know that the MimeAnalyzer is currently an instance of MimeMagic
index ae12ba5..ce6ecad 100644 (file)
@@ -455,7 +455,7 @@ class MovePage {
                        $overwriteMessage = wfMessage(
                                        'delete_and_move_reason',
                                        $this->oldTitle->getPrefixedText()
-                               )->text();
+                               )->inContentLanguage()->text();
                        $newpage = WikiPage::factory( $nt );
                        $errs = [];
                        $status = $newpage->doDeleteArticleReal(
@@ -501,7 +501,7 @@ class MovePage {
                $defaultContentModelChanging = ( $oldDefault !== $newDefault
                        && $oldDefault === $contentModel );
 
-               // bug 57084: log_page should be the ID of the *moved* page
+               // T59084: log_page should be the ID of the *moved* page
                $oldid = $this->oldTitle->getArticleID();
                $logTitle = clone $this->oldTitle;
 
@@ -550,13 +550,13 @@ class MovePage {
                );
 
                if ( !$redirectContent ) {
-                       // Clean up the old title *before* reset article id - bug 45348
+                       // Clean up the old title *before* reset article id - T47348
                        WikiPage::onArticleDelete( $this->oldTitle );
                }
 
                $this->oldTitle->resetArticleID( 0 ); // 0 == non existing
                $nt->resetArticleID( $oldid );
-               $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
+               $newpage->loadPageData( WikiPage::READ_LOCKING ); // T48397
 
                $newpage->updateRevisionOn( $dbw, $nullRevision );
 
@@ -581,7 +581,7 @@ class MovePage {
                # Recreate the redirect, this time in the other direction.
                if ( $redirectContent ) {
                        $redirectArticle = WikiPage::factory( $this->oldTitle );
-                       $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
+                       $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // T48397
                        $newid = $redirectArticle->insertOn( $dbw );
                        if ( $newid ) { // sanity
                                $this->oldTitle->resetArticleID( $newid );
index b0a6b7b..50950ef 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-# bug 30219 : can not use pathinfo() on URLs since slashes do not match
+# T32219 : can not use pathinfo() on URLs since slashes do not match
 $matches = [];
 $ext = 'php';
 $path = '/';
index eb2f7e7..e22f42c 100644 (file)
@@ -285,9 +285,9 @@ class OutputPage extends ContextSource {
        private $mTarget = null;
 
        /**
-        * @var bool Whether parser output should contain table of contents
+        * @var bool Whether parser output contains a table of contents
         */
-       private $mEnableTOC = true;
+       private $mEnableTOC = false;
 
        /**
         * @var bool Whether parser output should contain section edit links
@@ -302,6 +302,11 @@ class OutputPage extends ContextSource {
        /** @var array Profiling data */
        private $limitReportJSData = [];
 
+       /**
+        * Link: header contents
+        */
+       private $mLinkHeader = [];
+
        /**
         * Constructor for OutputPage. This should not be called directly.
         * Instead a new RequestContext should be created and it will implicitly create
@@ -781,7 +786,7 @@ class OutputPage extends ContextSource {
                        'epoch' => $config->get( 'CacheEpoch' )
                ];
                if ( $config->get( 'UseSquid' ) ) {
-                       // bug 44570: the core page itself may not change, but resources might
+                       // T46570: the core page itself may not change, but resources might
                        $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $config->get( 'SquidMaxage' ) );
                }
                Hooks::run( 'OutputPageCheckLastModified', [ &$modifiedTimes, $this ] );
@@ -1466,7 +1471,7 @@ class OutputPage extends ContextSource {
                        ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
                );
 
-               // Site-wide styles are controlled by a config setting, see bug 71621
+               // Site-wide styles are controlled by a config setting, see T73621
                // for background on why. User styles are never allowed.
                if ( $this->getConfig()->get( 'AllowSiteCSSOnRestrictedPages' ) ) {
                        $styleOrigin = ResourceLoaderModule::ORIGIN_USER_SITEWIDE;
@@ -1568,6 +1573,7 @@ class OutputPage extends ContextSource {
                        // been changed somehow, and keep it if so.
                        $anonPO = ParserOptions::newFromAnon();
                        $anonPO->setEditSection( false );
+                       $anonPO->setAllowUnsafeRawHtml( false );
                        if ( !$options->matches( $anonPO ) ) {
                                wfLogWarning( __METHOD__ . ': Setting a changed bogus ParserOptions: ' . wfGetAllCallers( 5 ) );
                                $options->isBogus = false;
@@ -1581,6 +1587,7 @@ class OutputPage extends ContextSource {
                                // either.
                                $po = ParserOptions::newFromAnon();
                                $po->setEditSection( false );
+                               $po->setAllowUnsafeRawHtml( false );
                                $po->isBogus = true;
                                if ( $options !== null ) {
                                        $this->mParserOptions = empty( $options->isBogus ) ? $options : null;
@@ -1590,6 +1597,7 @@ class OutputPage extends ContextSource {
 
                        $this->mParserOptions = ParserOptions::newFromContext( $this->getContext() );
                        $this->mParserOptions->setEditSection( false );
+                       $this->mParserOptions->setAllowUnsafeRawHtml( false );
                }
 
                if ( $options !== null && !empty( $options->isBogus ) ) {
@@ -1765,17 +1773,6 @@ class OutputPage extends ContextSource {
                $this->addParserOutput( $parserOutput );
        }
 
-       /**
-        * Add a ParserOutput object, but without Html.
-        *
-        * @deprecated since 1.24, use addParserOutputMetadata() instead.
-        * @param ParserOutput $parserOutput
-        */
-       public function addParserOutputNoText( $parserOutput ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               $this->addParserOutputMetadata( $parserOutput );
-       }
-
        /**
         * Add all metadata associated with a ParserOutput object, but without the actual HTML. This
         * includes categories, language links, ResourceLoader modules, effects of certain magic words,
@@ -1842,6 +1839,14 @@ class OutputPage extends ContextSource {
                $outputPage = $this;
                Hooks::run( 'LanguageLinks', [ $this->getTitle(), &$this->mLanguageLinks, &$linkFlags ] );
                Hooks::run( 'OutputPageParserOutput', [ &$outputPage, $parserOutput ] );
+
+               // This check must be after 'OutputPageParserOutput' runs in addParserOutputMetadata
+               // so that extensions may modify ParserOutput to toggle TOC.
+               // This cannot be moved to addParserOutputText because that is not
+               // called by EditPage for Preview.
+               if ( $parserOutput->getTOCEnabled() && $parserOutput->getTOCHTML() ) {
+                       $this->mEnableTOC = true;
+               }
        }
 
        /**
@@ -1882,7 +1887,6 @@ class OutputPage extends ContextSource {
         */
        function addParserOutput( $parserOutput ) {
                $this->addParserOutputMetadata( $parserOutput );
-               $parserOutput->setTOCEnabled( $this->mEnableTOC );
 
                // Touch section edit links only if not previously disabled
                if ( $parserOutput->getEditSectionTokens() ) {
@@ -2102,6 +2106,28 @@ class OutputPage extends ContextSource {
                return 'Vary: ' . implode( ', ', array_keys( $this->mVaryHeader ) );
        }
 
+       /**
+        * Add an HTTP Link: header
+        *
+        * @param string $header Header value
+        */
+       public function addLinkHeader( $header ) {
+               $this->mLinkHeader[] = $header;
+       }
+
+       /**
+        * Return a Link: header. Based on the values of $mLinkHeader.
+        *
+        * @return string
+        */
+       public function getLinkHeader() {
+               if ( !$this->mLinkHeader ) {
+                       return false;
+               }
+
+               return 'Link: ' . implode( ',', $this->mLinkHeader );
+       }
+
        /**
         * Get a complete Key header
         *
@@ -2358,6 +2384,19 @@ class OutputPage extends ContextSource {
                // jQuery etc. can work correctly.
                $response->header( 'X-UA-Compatible: IE=Edge' );
 
+               if ( !$this->mArticleBodyOnly ) {
+                       $sk = $this->getSkin();
+
+                       if ( $sk->shouldPreloadLogo() ) {
+                               $this->addLogoPreloadLinkHeaders();
+                       }
+               }
+
+               $linkHeader = $this->getLinkHeader();
+               if ( $linkHeader ) {
+                       $response->header( $linkHeader );
+               }
+
                // Prevent framing, if requested
                $frameOptions = $this->getFrameOptions();
                if ( $frameOptions ) {
@@ -2367,27 +2406,16 @@ class OutputPage extends ContextSource {
                if ( $this->mArticleBodyOnly ) {
                        echo $this->mBodytext;
                } else {
-                       $sk = $this->getSkin();
-                       // add skin specific modules
-                       $modules = $sk->getDefaultModules();
-
-                       // Enforce various default modules for all pages and all skins
-                       $coreModules = [
-                               // Keep this list as small as possible
-                               'site',
-                               'mediawiki.page.startup',
-                               'mediawiki.user',
-                       ];
-
-                       // Support for high-density display images if enabled
-                       if ( $config->get( 'ResponsiveImages' ) ) {
-                               $coreModules[] = 'mediawiki.hidpi';
+                       // Enable safe mode if requested
+                       if ( $this->getRequest()->getBool( 'safemode' ) ) {
+                               $this->disallowUserJs();
                        }
 
-                       $this->addModules( $coreModules );
-                       foreach ( $modules as $group ) {
+                       $sk = $this->getSkin();
+                       foreach ( $sk->getDefaultModules() as $group ) {
                                $this->addModules( $group );
                        }
+
                        MWDebug::addModules( $this );
 
                        // Avoid PHP 7.1 warning of passing $this by reference
@@ -2502,7 +2530,7 @@ class OutputPage extends ContextSource {
                ) {
                        $displayReturnto = null;
 
-                       # Due to bug 32276, if a user does not have read permissions,
+                       # Due to T34276, if a user does not have read permissions,
                        # $this->getTitle() will just give Special:Badtitle, which is
                        # not especially useful as a returnto parameter. Use the title
                        # from the request instead, if there was one.
@@ -2724,7 +2752,9 @@ class OutputPage extends ContextSource {
                } else {
                        $titleObj = Title::newFromText( $returnto );
                }
-               if ( !is_object( $titleObj ) ) {
+               // We don't want people to return to external interwiki. That
+               // might potentially be used as part of a phishing scheme
+               if ( !is_object( $titleObj ) || $titleObj->isExternal() ) {
                        $titleObj = Title::newMainPage();
                }
 
@@ -2978,7 +3008,7 @@ class OutputPage extends ContextSource {
                        && $this->userCanPreview();
        }
 
-       private function isUserCssPreview() {
+       protected function isUserCssPreview() {
                return $this->getConfig()->get( 'AllowUserCss' )
                        && $this->getTitle()
                        && $this->getTitle()->isCssSubpage()
@@ -3084,7 +3114,7 @@ class OutputPage extends ContextSource {
 
                $curRevisionId = 0;
                $articleId = 0;
-               $canonicalSpecialPageName = false; # bug 21115
+               $canonicalSpecialPageName = false; # T23115
 
                $title = $this->getTitle();
                $ns = $title->getNamespace();
@@ -3094,7 +3124,7 @@ class OutputPage extends ContextSource {
 
                $sk = $this->getSkin();
                // Get the relevant title so that AJAX features can use the correct page name
-               // when making API requests from certain special pages (bug 34972).
+               // when making API requests from certain special pages (T36972).
                $relevantTitle = $sk->getRelevantTitle();
                $relevantUser = $sk->getRelevantUser();
 
@@ -3171,6 +3201,10 @@ class OutputPage extends ContextSource {
                $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user )
                        && ( $title->exists() || $title->quickUserCan( 'create', $user ) );
 
+               $vars['wgRelevantPageIsProbablyEditable'] = $relevantTitle
+                       && $relevantTitle->quickUserCan( 'edit', $user )
+                       && ( $relevantTitle->exists() || $relevantTitle->quickUserCan( 'create', $user ) );
+
                foreach ( $title->getRestrictionTypes() as $type ) {
                        $vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type );
                }
@@ -3510,16 +3544,6 @@ class OutputPage extends ContextSource {
                return $tags;
        }
 
-       /**
-        * @return string HTML tag links to be put in the header.
-        * @deprecated since 1.24 Use OutputPage::headElement or if you have to,
-        *   OutputPage::getHeadLinksArray directly.
-        */
-       public function getHeadLinks() {
-               wfDeprecated( __METHOD__, '1.24' );
-               return implode( "\n", $this->getHeadLinksArray() );
-       }
-
        /**
         * Generate a "<link rel/>" for a feed.
         *
@@ -3620,10 +3644,21 @@ class OutputPage extends ContextSource {
                        [ 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' ]
                );
 
+               $separateReq = [ 'site.styles', 'user.styles' ];
                foreach ( $this->rlExemptStyleModules as $group => $moduleNames ) {
-                       $chunks[] = $this->makeResourceLoaderLink( $moduleNames,
+                       // Combinable modules
+                       $chunks[] = $this->makeResourceLoaderLink(
+                               array_diff( $moduleNames, $separateReq ),
                                ResourceLoaderModule::TYPE_STYLES
                        );
+
+                       foreach ( array_intersect( $moduleNames, $separateReq ) as $name ) {
+                               // These require their own dedicated request in order to support "@import"
+                               // syntax, which is incompatible with concatenation. (T147667, T37562)
+                               $chunks[] = $this->makeResourceLoaderLink( $name,
+                                       ResourceLoaderModule::TYPE_STYLES
+                               );
+                       }
                }
 
                return self::combineWrappedStrings( array_merge( $chunks, $append ) );
@@ -3855,7 +3890,7 @@ class OutputPage extends ContextSource {
         *    $wgOut->addWikiText( "<div class='error'>\n"
         *        . wfMessage( 'some-error' )->plain() . "\n</div>" );
         *
-        * The newline after the opening div is needed in some wikitext. See bug 19226.
+        * The newline after the opening div is needed in some wikitext. See T21226.
         *
         * @param string $wrap
         */
@@ -3885,15 +3920,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Enables/disables TOC, doesn't override __NOTOC__
-        * @param bool $flag
-        * @since 1.22
-        */
-       public function enableTOC( $flag = true ) {
-               $this->mEnableTOC = $flag;
-       }
-
-       /**
+        * Whether the output has a table of contents
         * @return bool
         * @since 1.22
         */
@@ -3955,4 +3982,75 @@ class OutputPage extends ContextSource {
                        'mediawiki.widgets.styles',
                ] );
        }
+
+       /**
+        * Add Link headers for preloading the wiki's logo.
+        *
+        * @since 1.26
+        */
+       protected function addLogoPreloadLinkHeaders() {
+               $logo = ResourceLoaderSkinModule::getLogo( $this->getConfig() );
+
+               $tags = [];
+               $logosPerDppx = [];
+               $logos = [];
+
+               if ( !is_array( $logo ) ) {
+                       // No media queries required if we only have one variant
+                       $this->addLinkHeader( '<' . $logo . '>;rel=preload;as=image' );
+                       return;
+               }
+
+               foreach ( $logo as $dppx => $src ) {
+                       // Keys are in this format: "1.5x"
+                       $dppx = substr( $dppx, 0, -1 );
+                       $logosPerDppx[$dppx] = $src;
+               }
+
+               // Because PHP can't have floats as array keys
+               uksort( $logosPerDppx, function ( $a , $b ) {
+                       $a = floatval( $a );
+                       $b = floatval( $b );
+
+                       if ( $a == $b ) {
+                               return 0;
+                       }
+                       // Sort from smallest to largest (e.g. 1x, 1.5x, 2x)
+                       return ( $a < $b ) ? -1 : 1;
+               } );
+
+               foreach ( $logosPerDppx as $dppx => $src ) {
+                       $logos[] = [ 'dppx' => $dppx, 'src' => $src ];
+               }
+
+               $logosCount = count( $logos );
+               // Logic must match ResourceLoaderSkinModule:
+               // - 1x applies to resolution < 1.5dppx
+               // - 1.5x applies to resolution >= 1.5dppx && < 2dppx
+               // - 2x applies to resolution >= 2dppx
+               // Note that min-resolution and max-resolution are both inclusive.
+               for ( $i = 0; $i < $logosCount; $i++ ) {
+                       if ( $i === 0 ) {
+                               // Smallest dppx
+                               // min-resolution is ">=" (larger than or equal to)
+                               // "not min-resolution" is essentially "<"
+                               $media_query = 'not all and (min-resolution: ' . $logos[ 1 ]['dppx'] . 'dppx)';
+                       } elseif ( $i !== $logosCount - 1 ) {
+                               // In between
+                               // Media query expressions can only apply "not" to the entire expression
+                               // (e.g. can't express ">= 1.5 and not >= 2).
+                               // Workaround: Use <= 1.9999 in place of < 2.
+                               $upper_bound = floatval( $logos[ $i + 1 ]['dppx'] ) - 0.000001;
+                               $media_query = '(min-resolution: ' . $logos[ $i ]['dppx'] .
+                                       'dppx) and (max-resolution: ' . $upper_bound . 'dppx)';
+                       } else {
+                               // Largest dppx
+                               $media_query = '(min-resolution: ' . $logos[ $i ]['dppx'] . 'dppx)';
+                       }
+
+                       $this->addLinkHeader(
+                               '<' . $logos[$i]['src'] . '>;rel=preload;as=image;media=' . $media_query
+                       );
+               }
+       }
 }
index e6e96c7..5a440c4 100644 (file)
@@ -3,10 +3,6 @@
 // @codingStandardsIgnoreFile Generic.Files.LineLength
 // @codingStandardsIgnoreFile MediaWiki.Usage.DirUsage.FunctionFound
 /**
- * Check PHP Version, as well as for composer dependencies in entry points,
- * and display something vaguely comprehensible in the event of a totally
- * unrecoverable error.
- *
  * 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
  *
  * @file
  */
+
+/**
+ * Check PHP Version, as well as for composer dependencies in entry points,
+ * and display something vaguely comprehensible in the event of a totally
+ * unrecoverable error.
+ * @class
+ */
 class PHPVersionCheck {
        /* @var string The number of the MediaWiki version used */
-       var $mwVersion = '1.29';
-       /* @var string The minimum php version for MediaWiki to run */
-       var $minimumVersionPHP = '5.5.9';
+       var $mwVersion = '1.30';
        var $functionsExtensionsMapping = array(
                'mb_substr'   => 'mbstring',
                'utf8_encode' => 'xml',
@@ -63,10 +64,41 @@ class PHPVersionCheck {
        /**
         * Returns the version of the installed php implementation.
         *
-        * @return string
+        * @param string $impl By default, the function returns the info of the currently installed PHP
+        *  implementation. Using this parameter the caller can decide, what version info will be
+        *  returned. Valid values: HHVM, PHP
+        * @return array An array of information about the php implementation, containing:
+        *  - 'version': The version of the php implementation (specific to the implementation, not
+        *  the version of the implemented php version)
+        *  - 'implementation': The name of the implementation used
+        *  - 'vendor': The development group, vendor or developer of the implementation.
+        *  - 'upstreamSupported': The minimum version of the implementation supported by the named vendor.
+        *  - 'minSupported': The minimum version supported by MediWiki
+        *  - 'upgradeURL': The URL to the website of the implementation that contains
+        *  upgrade/installation instructions.
         */
-       function getPHPImplVersion() {
-               return PHP_VERSION;
+       function getPHPInfo( $impl = false ) {
+               if (
+                       ( defined( 'HHVM_VERSION' ) && $impl !== 'PHP' ) ||
+                       $impl === 'HHVM'
+               ) {
+                       return array(
+                               'implementation' => 'HHVM',
+                               'version' => defined( 'HHVM_VERSION' ) ? HHVM_VERSION : 'undefined',
+                               'vendor' => 'Facebook',
+                               'upstreamSupported' => '3.6.5',
+                               'minSupported' => '3.6.5',
+                               'upgradeURL' => 'https://docs.hhvm.com/hhvm/installation/introduction',
+                       );
+               }
+               return array(
+                       'implementation' => 'PHP',
+                       'version' => PHP_VERSION,
+                       'vendor' => 'the PHP Group',
+                       'upstreamSupported' => '5.5.0',
+                       'minSupported' => '5.5.9',
+                       'upgradeURL' => 'http://www.php.net/downloads.php',
+               );
        }
 
        /**
@@ -75,30 +107,44 @@ class PHPVersionCheck {
         * @return $this
         */
        function checkRequiredPHPVersion() {
-               if ( !function_exists( 'version_compare' )
-                    || version_compare( $this->getPHPImplVersion(), $this->minimumVersionPHP ) < 0
+               $phpInfo = $this->getPHPInfo();
+               $minimumVersion = $phpInfo['minSupported'];
+               $otherInfo = $this->getPHPInfo( $phpInfo['implementation'] === 'HHVM' ? 'PHP' : 'HHVM' );
+               if (
+                       !function_exists( 'version_compare' )
+                       || version_compare( $phpInfo['version'], $minimumVersion ) < 0
                ) {
-                       $shortText = "MediaWiki $this->mwVersion requires at least PHP version"
-                                    . " $this->minimumVersionPHP, you are using PHP {$this->getPHPImplVersion()}.";
+                       $shortText = "MediaWiki $this->mwVersion requires at least {$phpInfo['implementation']}"
+                               . " version $minimumVersion or {$otherInfo['implementation']} version "
+                               . "{$otherInfo['minSupported']}, you are using {$phpInfo['implementation']} "
+                               . "{$phpInfo['version']}.";
 
-                       $longText = "Error: You might be using on older PHP version. \n"
-                                   . "MediaWiki $this->mwVersion needs PHP $this->minimumVersionPHP or higher.\n\n"
-                                   . "Check if you have a newer php executable with a different name, "
-                                   . "such as php5.\n\n";
+                       $longText = "Error: You might be using an older {$phpInfo['implementation']} version. \n"
+                               . "MediaWiki $this->mwVersion needs {$phpInfo['implementation']}"
+                               . " $minimumVersion or higher or {$otherInfo['implementation']} version "
+                               . "{$otherInfo['minSupported']}.\n\nCheck if you have a"
+                               . " newer php executable with a different name, such as php5.\n\n";
 
                        $longHtml = <<<HTML
-                       Please consider <a href="http://www.php.net/downloads.php">upgrading your copy of PHP</a>.
-                       PHP versions less than 5.5.0 are no longer supported by the PHP Group and will not receive
+                       Please consider <a href="{$phpInfo['upgradeURL']}">upgrading your copy of
+                       {$phpInfo['implementation']}</a>.
+                       {$phpInfo['implementation']} versions less than {$phpInfo['upstreamSupported']} are no 
+                       longer supported by {$phpInfo['vendor']} and will not receive
                        security or bugfix updates.
                </p>
                <p>
-                       If for some reason you are unable to upgrade your PHP version, you will need to
-                       <a href="https://www.mediawiki.org/wiki/Download">download</a> an older version
-                       of MediaWiki from our website.  See our
-                       <a href="https://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a>
-                       for details of which versions are compatible with prior versions of PHP.
+                       If for some reason you are unable to upgrade your {$phpInfo['implementation']} version,
+                       you will need to <a href="https://www.mediawiki.org/wiki/Download">download</a> an 
+                       older version of MediaWiki from our website.
+                       See our<a href="https://www.mediawiki.org/wiki/Compatibility#PHP">compatibility page</a>
+                       for details of which versions are compatible with prior versions of {$phpInfo['implementation']}.
 HTML;
-                       $this->triggerError( 'Supported PHP versions', $shortText, $longText, $longHtml );
+                       $this->triggerError(
+                               "Supported {$phpInfo['implementation']} versions",
+                               $shortText,
+                               $longText,
+                               $longHtml
+                       );
                }
        }
 
@@ -112,10 +158,10 @@ HTML;
                        $shortText = "Installing some external dependencies (e.g. via composer) is required.";
 
                        $longText = "Error: You are missing some external dependencies. \n"
-                                   . "MediaWiki now also has some external dependencies that need to be installed\n"
-                                   . "via composer or from a separate git repo. Please see\n"
-                                   . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
-                                   . "for help on installing the required components.";
+                               . "MediaWiki now also has some external dependencies that need to be installed\n"
+                               . "via composer or from a separate git repo. Please see\n"
+                               . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
+                               . "for help on installing the required components.";
 
                        $longHtml = <<<HTML
                MediaWiki now also has some external dependencies that need to be installed via
@@ -150,12 +196,12 @@ HTML;
                        foreach ( $missingExtensions as $ext ) {
                                $missingExtText .= " * $ext <$baseUrl/$ext>\n";
                                $missingExtHtml .= "<li><b>$ext</b> "
-                                                  . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>";
+                                       . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>";
                        }
 
                        $cliText = "Error: Missing one or more required components of PHP.\n"
-                                  . "You are missing a required extension to PHP that MediaWiki needs.\n"
-                                  . "Please install:\n" . $missingExtText;
+                               . "You are missing a required extension to PHP that MediaWiki needs.\n"
+                               . "Please install:\n" . $missingExtText;
 
                        $longHtml = <<<HTML
                You are missing a required extension to PHP that MediaWiki
@@ -198,7 +244,7 @@ HTML;
                }
                $encLogo =
                        htmlspecialchars( str_replace( '//', '/', $dirname . '/' ) .
-                                         'resources/assets/mediawiki.png' );
+                               'resources/assets/mediawiki.png' );
                $shortHtml = htmlspecialchars( $shortText );
 
                header( 'Content-type: text/html; charset=UTF-8' );
index 6d15c1e..4017619 100644 (file)
@@ -120,7 +120,7 @@ class Preferences {
                        }
                }
 
-               # # Make sure that form fields have their parent set. See bug 41337.
+               # # Make sure that form fields have their parent set. See T43337.
                $dummyForm = new HTMLForm( [], $context );
 
                $disable = !$user->isAllowed( 'editmyoptions' );
@@ -915,6 +915,9 @@ class Preferences {
                        'label-message' => 'tog-hideminor',
                        'section' => 'rc/advancedrc',
                ];
+               $defaultPreferences['rcfilters-saved-queries'] = [
+                       'type' => 'api',
+               ];
 
                if ( $config->get( 'RCWatchCategoryMembership' ) ) {
                        $defaultPreferences['hidecategorization'] = [
@@ -1201,8 +1204,7 @@ class Preferences {
 
                if ( $dateopts ) {
                        if ( !in_array( 'default', $dateopts ) ) {
-                               $dateopts[] = 'default'; // Make sure default is always valid
-                                                                               // Bug 19237
+                               $dateopts[] = 'default'; // Make sure default is always valid T21237
                        }
 
                        // FIXME KLUGE: site default might not be valid for user language
index 48b1d72..62ee5c6 100644 (file)
@@ -231,7 +231,7 @@ abstract class PrefixSearch {
                        }
                }
 
-               # normalize searchKey, so aliases with spaces can be found - bug 25675
+               # normalize searchKey, so aliases with spaces can be found - T27675
                $searchKey = str_replace( ' ', '_', $searchKey );
                $searchKey = $wgContLang->caseFold( $searchKey );
 
@@ -243,7 +243,7 @@ abstract class PrefixSearch {
                }
 
                foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
-                       if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# bug 20885
+                       if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# T22885
                                continue;
                        }
 
@@ -256,7 +256,7 @@ abstract class PrefixSearch {
                $matches = [];
                foreach ( $keys as $pageKey => $page ) {
                        if ( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
-                               // bug 27671: Don't use SpecialPage::getTitleFor() here because it
+                               // T29671: Don't use SpecialPage::getTitleFor() here because it
                                // localizes its input leading to searches for e.g. Special:All
                                // returning Spezial:MediaWiki-Systemnachrichten and returning
                                // Spezial:Alle_Seiten twice when $wgLanguageCode == 'de'
diff --git a/includes/ReadOnlyMode.php b/includes/ReadOnlyMode.php
new file mode 100644 (file)
index 0000000..592d495
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+
+use Wikimedia\Rdbms\LoadBalancer;
+
+/**
+ * A service class for fetching the wiki's current read-only mode.
+ * To obtain an instance, use MediaWikiServices::getReadOnlyMode().
+ *
+ * @since 1.29
+ */
+class ReadOnlyMode {
+       /** @var ConfiguredReadOnlyMode */
+       private $configuredReadOnly;
+
+       /** @var LoadBalancer */
+       private $loadBalancer;
+
+       public function __construct( ConfiguredReadOnlyMode $cro, LoadBalancer $loadBalancer ) {
+               $this->configuredReadOnly = $cro;
+               $this->loadBalancer = $loadBalancer;
+       }
+
+       /**
+        * Check whether the wiki is in read-only mode.
+        *
+        * @return bool
+        */
+       public function isReadOnly() {
+               return $this->getReason() !== false;
+       }
+
+       /**
+        * Check if the site is in read-only mode and return the message if so
+        *
+        * This checks the configuration and registered DB load balancers for
+        * read-only mode. This may result in DB connection being made.
+        *
+        * @return string|bool String when in read-only mode; false otherwise
+        */
+       public function getReason() {
+               $reason = $this->configuredReadOnly->getReason();
+               if ( $reason !== false ) {
+                       return $reason;
+               }
+               $reason = $this->loadBalancer->getReadOnlyReason();
+               if ( $reason !== false && $reason !== null ) {
+                       return $reason;
+               }
+               return false;
+       }
+
+       /**
+        * Set the read-only mode, which will apply for the remainder of the
+        * request or until a service reset.
+        *
+        * @param string|null $msg
+        */
+       public function setReason( $msg ) {
+               $this->configuredReadOnly->setReason( $msg );
+       }
+
+       /**
+        * Clear the cache of the read only file
+        */
+       public function clearCache() {
+               $this->configuredReadOnly->clearCache();
+       }
+}
+
+/**
+ * A read-only mode service which does not depend on LoadBalancer.
+ * To obtain an instance, use MediaWikiServices::getConfiguredReadOnlyMode().
+ *
+ * @since 1.29
+ */
+class ConfiguredReadOnlyMode {
+       /** @var Config */
+       private $config;
+
+       /** @var string|bool|null */
+       private $fileReason;
+
+       /** @var string|null */
+       private $overrideReason;
+
+       public function __construct( Config $config ) {
+               $this->config = $config;
+       }
+
+       /**
+        * Check whether the wiki is in read-only mode.
+        *
+        * @return bool
+        */
+       public function isReadOnly() {
+               return $this->getReason() !== false;
+       }
+
+       /**
+        * Get the value of $wgReadOnly or the contents of $wgReadOnlyFile.
+        *
+        * @return string|bool String when in read-only mode; false otherwise
+        */
+       public function getReason() {
+               if ( $this->overrideReason !== null ) {
+                       return $this->overrideReason;
+               }
+               $confReason = $this->config->get( 'ReadOnly' );
+               if ( $confReason !== null ) {
+                       return $confReason;
+               }
+               if ( $this->fileReason === null ) {
+                       // Cache for faster access next time
+                       $readOnlyFile = $this->config->get( 'ReadOnlyFile' );
+                       if ( is_file( $readOnlyFile ) && filesize( $readOnlyFile ) > 0 ) {
+                               $this->fileReason = file_get_contents( $readOnlyFile );
+                       } else {
+                               $this->fileReason = false;
+                       }
+               }
+               return $this->fileReason;
+       }
+
+       /**
+        * Set the read-only mode, which will apply for the remainder of the
+        * request or until a service reset.
+        *
+        * @param string|null $msg
+        */
+       public function setReason( $msg ) {
+               $this->overrideReason = $msg;
+       }
+
+       /**
+        * Clear the cache of the read only file
+        */
+       public function clearCache() {
+               $this->fileReason = null;
+       }
+}
index d9e42ff..c3782ba 100644 (file)
  *
  * @file
  */
+
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * @todo document
@@ -216,7 +221,7 @@ class Revision implements IDBAccessObject {
                        // Pre-1.5 ar_text row
                        $attribs['text'] = self::getRevisionText( $row, 'ar_' );
                        if ( $attribs['text'] === false ) {
-                               throw new MWException( 'Unable to load text from archive row (possibly bug 22624)' );
+                               throw new MWException( 'Unable to load text from archive row (possibly T24624)' );
                        }
                }
                return new self( $attribs );
@@ -1238,8 +1243,9 @@ class Revision implements IDBAccessObject {
 
        /**
         * Get revision text associated with an old or archive row
-        * $row is usually an object from wfFetchRow(), both the flags and the text
-        * field must be included.
+        *
+        * Both the flags and the text field must be included. Including the old_id
+        * field will activate cache usage as long as the $wiki parameter is not set.
         *
         * @param stdClass $row The text data
         * @param string $prefix Table prefix (default 'old_')
@@ -1250,8 +1256,6 @@ class Revision implements IDBAccessObject {
         * @return string|false Text the text requested or false on failure
         */
        public static function getRevisionText( $row, $prefix = 'old_', $wiki = false ) {
-
-               # Get data
                $textField = $prefix . 'text';
                $flagsField = $prefix . 'flags';
 
@@ -1267,21 +1271,35 @@ class Revision implements IDBAccessObject {
                        return false;
                }
 
-               # Use external methods for external objects, text in table is URL-only then
+               // Use external methods for external objects, text in table is URL-only then
                if ( in_array( 'external', $flags ) ) {
                        $url = $text;
                        $parts = explode( '://', $url, 2 );
                        if ( count( $parts ) == 1 || $parts[1] == '' ) {
                                return false;
                        }
-                       $text = ExternalStore::fetchFromURL( $url, [ 'wiki' => $wiki ] );
-               }
 
-               // If the text was fetched without an error, convert it
-               if ( $text !== false ) {
-                       $text = self::decompressRevisionText( $text, $flags );
+                       if ( isset( $row->old_id ) && $wiki === false ) {
+                               // Make use of the wiki-local revision text cache
+                               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+                               // The cached value should be decompressed, so handle that and return here
+                               return $cache->getWithSetCallback(
+                                       $cache->makeKey( 'revisiontext', 'textid', $row->old_id ),
+                                       self::getCacheTTL( $cache ),
+                                       function () use ( $url, $wiki, $flags ) {
+                                               // No negative caching per Revision::loadText()
+                                               $text = ExternalStore::fetchFromURL( $url, [ 'wiki' => $wiki ] );
+
+                                               return self::decompressRevisionText( $text, $flags );
+                                       },
+                                       [ 'pcGroup' => self::TEXT_CACHE_GROUP, 'pcTTL' => $cache::TTL_PROC_LONG ]
+                               );
+                       } else {
+                               $text = ExternalStore::fetchFromURL( $url, [ 'wiki' => $wiki ] );
+                       }
                }
-               return $text;
+
+               return self::decompressRevisionText( $text, $flags );
        }
 
        /**
@@ -1327,6 +1345,13 @@ class Revision implements IDBAccessObject {
         * @return string|bool Decompressed text, or false on failure
         */
        public static function decompressRevisionText( $text, $flags ) {
+               global $wgLegacyEncoding, $wgContLang;
+
+               if ( $text === false ) {
+                       // Text failed to be fetched; nothing to do
+                       return false;
+               }
+
                if ( in_array( 'gzip', $flags ) ) {
                        # Deal with optional compression of archived pages.
                        # This can be done periodically via maintenance/compressOld.php, and
@@ -1349,7 +1374,6 @@ class Revision implements IDBAccessObject {
                        $text = $obj->getText();
                }
 
-               global $wgLegacyEncoding;
                if ( $text !== false && $wgLegacyEncoding
                        && !in_array( 'utf-8', $flags ) && !in_array( 'utf8', $flags )
                ) {
@@ -1357,7 +1381,6 @@ class Revision implements IDBAccessObject {
                        # Upconvert on demand.
                        # ("utf8" checked for compatibility with some broken
                        #  conversion scripts 2008-12-30)
-                       global $wgContLang;
                        $text = $wgContLang->iconv( $wgLegacyEncoding, 'UTF-8', $text );
                }
 
@@ -1473,7 +1496,10 @@ class Revision implements IDBAccessObject {
 
                $dbw->insert( 'revision', $row, __METHOD__ );
 
-               $this->mId = $rev_id !== null ? $rev_id : $dbw->insertId();
+               if ( $this->mId === null ) {
+                       // Only if nextSequenceValue() was called
+                       $this->mId = $dbw->insertId();
+               }
 
                // Assertion to try to catch T92046
                if ( (int)$this->mId === 0 ) {
@@ -1557,15 +1583,14 @@ class Revision implements IDBAccessObject {
        }
 
        /**
-        * Lazy-load the revision's text.
-        * Currently hardcoded to the 'text' table storage engine.
+        * Get the text cache TTL
         *
-        * @return string|bool The revision's text, or false on failure
+        * @param WANObjectCache $cache
+        * @return integer
         */
-       private function loadText() {
+       private static function getCacheTTL( WANObjectCache $cache ) {
                global $wgRevisionCacheExpiry;
 
-               $cache = ObjectCache::getMainWANInstance();
                if ( $cache->getQoS( $cache::ATTR_EMULATION ) <= $cache::QOS_EMULATION_SQL ) {
                        // Do not cache RDBMs blobs in...the RDBMs store
                        $ttl = $cache::TTL_UNCACHEABLE;
@@ -1573,10 +1598,22 @@ class Revision implements IDBAccessObject {
                        $ttl = $wgRevisionCacheExpiry ?: $cache::TTL_UNCACHEABLE;
                }
 
+               return $ttl;
+       }
+
+       /**
+        * Lazy-load the revision's text.
+        * Currently hardcoded to the 'text' table storage engine.
+        *
+        * @return string|bool The revision's text, or false on failure
+        */
+       private function loadText() {
+               $cache = ObjectCache::getMainWANInstance();
+
                // No negative caching; negative hits on text rows may be due to corrupted replica DBs
                return $cache->getWithSetCallback(
                        $cache->makeKey( 'revisiontext', 'textid', $this->getTextId() ),
-                       $ttl,
+                       self::getCacheTTL( $cache ),
                        function () {
                                return $this->fetchText();
                        },
@@ -1781,6 +1818,7 @@ class Revision implements IDBAccessObject {
         *
         * @param Title $title
         * @param int $id
+        * @param int $flags
         * @return string|bool False if not found
         */
        static function getTimestampFromId( $title, $id, $flags = 0 ) {
index 53cf699..ccdedb8 100644 (file)
@@ -21,6 +21,8 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * List for revision table items for a single page
@@ -35,7 +37,7 @@ abstract class RevisionListBase extends ContextSource implements Iterator {
        /** @var ResultWrapper|bool */
        protected $res;
 
-       /** @var bool|object */
+       /** @var bool|Revision */
        protected $current;
 
        /**
index 42b166d..c4883ba 100644 (file)
@@ -344,12 +344,12 @@ class Sanitizer {
                        $space = '[\x09\x0a\x0c\x0d\x20]';
                        self::$attribsRegex =
                                "/(?:^|$space)({$attribFirst}{$attrib}*)
-                                 ($space*=$space*
+                                       ($space*=$space*
                                        (?:
-                                        # The attribute value: quoted or alone
-                                         \"([^\"]*)(?:\"|\$)
-                                        | '([^']*)(?:'|\$)
-                                         (((?!$space|>).)*)
+                                               # The attribute value: quoted or alone
+                                               \"([^\"]*)(?:\"|\$)
+                                               | '([^']*)(?:'|\$)
+                                               | (((?!$space|>).)*)
                                        )
                                )?(?=$space|\$)/sx";
                }
@@ -545,7 +545,7 @@ class Sanitizer {
                                                        $badtag = true;
                                                } elseif ( in_array( $t, $tagstack ) && !isset( $htmlnest[$t] ) ) {
                                                        $badtag = true;
-                                               #  Is it a self closed htmlpair ? (bug 5487)
+                                               #  Is it a self closed htmlpair ? (T7487)
                                                } elseif ( $brace == '/>' && isset( $htmlpairs[$t] ) ) {
                                                        // Eventually we'll just remove the self-closing
                                                        // slash, in order to be consistent with HTML5
@@ -835,7 +835,7 @@ class Sanitizer {
 
                        # NOTE: even though elements using href/src are not allowed directly, supply
                        #       validation code that can be used by tag hook handlers, etc
-                       if ( $attribute === 'href' || $attribute === 'src' ) {
+                       if ( $attribute === 'href' || $attribute === 'src' || $attribute === 'poster' ) {
                                if ( !preg_match( $hrefExp, $value ) ) {
                                        continue; // drop any href or src attributes not using an allowed protocol.
                                        // NOTE: this also drops all relative URLs
@@ -922,7 +922,7 @@ class Sanitizer {
 
                // Normalize Halfwidth and Fullwidth Unicode block that IE6 might treat as ascii
                $value = preg_replace_callback(
-                       '/[!-[]-z]/u', // U+FF01 to U+FF5A, excluding U+FF3C (bug 58088)
+                       '/[!-[]-z]/u', // U+FF01 to U+FF5A, excluding U+FF3C (T60088)
                        function ( $matches ) {
                                $cp = UtfNormal\Utils::utf8ToCodepoint( $matches[0] );
                                if ( $cp === false ) {
@@ -1508,7 +1508,7 @@ class Sanitizer {
 
        /**
         * Decode any character references, numeric or named entities,
-        * in the next and normalize the resulting string. (bug 14952)
+        * in the next and normalize the resulting string. (T16952)
         *
         * This is useful for page titles, not for text to be displayed,
         * MediaWiki allows HTML entities to escape normalization as a feature.
@@ -1760,6 +1760,10 @@ class Sanitizer {
                        # true
                        'img'        => array_merge( $common, [ 'alt', 'src', 'width', 'height' ] ),
 
+                       'video'      => array_merge( $common, [ 'poster', 'controls', 'preload', 'width', 'height' ] ),
+                       'source'     => array_merge( $common, [ 'type', 'src' ] ),
+                       'track'      => array_merge( $common, [ 'type', 'src', 'srclang', 'kind', 'label' ] ),
+
                        # 15.2.1
                        'tt'         => $common,
                        'b'          => $common,
@@ -1784,7 +1788,7 @@ class Sanitizer {
                        'rb'         => $common,
                        'rp'         => $common,
                        'rt'         => $common, # array_merge( $common, array( 'rbspan' ) ),
-                       'rtc'         => $common,
+                       'rtc'        => $common,
 
                        # MathML root element, where used for extensions
                        # 'title' may not be 100% valid here; it's XHTML
@@ -1926,7 +1930,7 @@ class Sanitizer {
         *   3.5.
         *
         * This function is an implementation of the specification as requested in
-        * bug 22449.
+        * T24449.
         *
         * Client-side forms will use the same standard validation rules via JS or
         * HTML 5 validation; additional restrictions can be enforced server-side
@@ -1949,7 +1953,7 @@ class Sanitizer {
 
                // Please note strings below are enclosed in brackets [], this make the
                // hyphen "-" a range indicator. Hence it is double backslashed below.
-               // See bug 26948
+               // See T28948
                $rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~";
                $rfc1034_ldh_str = "a-z0-9\\-";
 
index ce82702..6afabed 100644 (file)
@@ -48,7 +48,8 @@ return [
 
                $lbConf = MWLBFactory::applyDefaultConfig(
                        $mainConfig->get( 'LBFactoryConf' ),
-                       $mainConfig
+                       $mainConfig,
+                       $services->getConfiguredReadOnlyMode()
                );
                $class = MWLBFactory::getLBFactoryClass( $lbConf );
 
@@ -155,7 +156,8 @@ return [
        'WatchedItemStore' => function( MediaWikiServices $services ) {
                $store = new WatchedItemStore(
                        $services->getDBLoadBalancer(),
-                       new HashBagOStuff( [ 'maxKeys' => 100 ] )
+                       new HashBagOStuff( [ 'maxKeys' => 100 ] ),
+                       $services->getReadOnlyMode()
                );
                $store->setStatsdDataFactory( $services->getStatsdDataFactory() );
                return $store;
@@ -404,6 +406,17 @@ return [
                return $vrsClient;
        },
 
+       'ConfiguredReadOnlyMode' => function( MediaWikiServices $services ) {
+               return new ConfiguredReadOnlyMode( $services->getMainConfig() );
+       },
+
+       'ReadOnlyMode' => function( MediaWikiServices $services ) {
+               return new ReadOnlyMode(
+                       $services->getConfiguredReadOnlyMode(),
+                       $services->getDBLoadBalancer()
+               );
+       },
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service here, don't forget to add a getter function
        // in the MediaWikiServices class. The convenience getter should just call
index 72ed1fd..5ea96dd 100644 (file)
@@ -329,7 +329,7 @@ if ( $wgEnableEmail ) {
        $wgUseEnotif = $wgEnotifUserTalk || $wgEnotifWatchlist;
 } else {
        // Disable all other email settings automatically if $wgEnableEmail
-       // is set to false. - bug 63678
+       // is set to false. - T65678
        $wgAllowHTMLEmail = false;
        $wgEmailAuthentication = false; // do not require auth if you're not sending email anyway
        $wgEnableUserEmail = false;
@@ -403,6 +403,12 @@ if ( is_array( $wgExtraNamespaces ) ) {
        $wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces;
 }
 
+// Merge in the legacy language codes, incorporating overrides from the config
+$wgDummyLanguageCodes += [
+       'qqq' => 'qqq', // Used for message documentation
+       'qqx' => 'qqx', // Used for viewing message keys
+] + $wgExtraLanguageCodes + LanguageCode::getDeprecatedCodeMapping();
+
 // These are now the same, always
 // To determine the user language, use $wgLang->getCode()
 $wgContLanguageCode = $wgLanguageCode;
index 105a581..6ce1aed 100644 (file)
  * @file
  */
 
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
+use MediaWiki\MediaWikiServices;
+
 /**
  * Static accessor class for site_stats and related things
  */
@@ -75,9 +79,12 @@ class SiteStats {
                $row = self::doLoad( wfGetDB( DB_REPLICA ) );
 
                if ( !self::isSane( $row ) ) {
-                       // Might have just been initialized during this request? Underflow?
-                       wfDebug( __METHOD__ . ": site_stats damaged or missing on replica DB\n" );
-                       $row = self::doLoad( wfGetDB( DB_MASTER ) );
+                       $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+                       if ( $lb->hasOrMadeRecentMasterChanges() ) {
+                               // Might have just been initialized during this request? Underflow?
+                               wfDebug( __METHOD__ . ": site_stats damaged or missing on replica DB\n" );
+                               $row = self::doLoad( wfGetDB( DB_MASTER ) );
+                       }
                }
 
                if ( !$wgMiserMode && !self::isSane( $row ) ) {
@@ -95,6 +102,7 @@ class SiteStats {
                if ( !self::isSane( $row ) ) {
                        wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" );
                }
+
                return $row;
        }
 
@@ -181,12 +189,11 @@ class SiteStats {
         * @return int
         */
        static function numberingroup( $group ) {
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                return $cache->getWithSetCallback(
-                       wfMemcKey( 'SiteStats', 'groupcounts', $group ),
+                       $cache->makeKey( 'SiteStats', 'groupcounts', $group ),
                        $cache::TTL_HOUR,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $group ) {
-                               global $wgDisableUserGroupExpiry;
                                $dbr = wfGetDB( DB_REPLICA );
 
                                $setOpts += Database::getCacheSetOptions( $dbr );
@@ -196,9 +203,7 @@ class SiteStats {
                                        'COUNT(*)',
                                        [
                                                'ug_group' => $group,
-                                               $wgDisableUserGroupExpiry ?
-                                                       '1' :
-                                                       'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
+                                               'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
                                        ],
                                        __METHOD__
                                );
index 470a75c..2759ff9 100644 (file)
@@ -54,18 +54,11 @@ class TemplateParser {
         * @throws UnexpectedValueException If $templateName attempts upwards directory traversal
         */
        protected function getTemplateFilename( $templateName ) {
-               // Prevent upwards directory traversal using same methods as Title::secureAndSplit
+               // Prevent path traversal. Based on Language::isValidCode().
+               // This is for paranoia. The $templateName should never come from
+               // untrusted input.
                if (
-                       strpos( $templateName, '.' ) !== false &&
-                       (
-                               $templateName === '.' || $templateName === '..' ||
-                               strpos( $templateName, './' ) === 0 ||
-                               strpos( $templateName, '../' ) === 0 ||
-                               strpos( $templateName, '/./' ) !== false ||
-                               strpos( $templateName, '/../' ) !== false ||
-                               substr( $templateName, -2 ) === '/.' ||
-                               substr( $templateName, -3 ) === '/..'
-                       )
+                       strcspn( $templateName, ":/\\\000&<>'\"%" ) !== strlen( $templateName )
                ) {
                        throw new UnexpectedValueException( "Malformed \$templateName: $templateName" );
                }
@@ -109,20 +102,22 @@ class TemplateParser {
                        $key = $cache->makeKey( 'template', $templateName, $fastHash );
                        $code = $this->forceRecompile ? null : $cache->get( $key );
 
-                       if ( !$code ) {
-                               $code = $this->compileForEval( $fileContents, $filename );
-
-                               // Prefix the cached code with a keyed hash (64 hex chars) as an integrity check
-                               $cache->set( $key, hash_hmac( 'sha256', $code, $secretKey ) . $code );
-                       } else {
+                       if ( $code ) {
                                // Verify the integrity of the cached PHP code
                                $keyedHash = substr( $code, 0, 64 );
                                $code = substr( $code, 64 );
                                if ( $keyedHash !== hash_hmac( 'sha256', $code, $secretKey ) ) {
-                                       // Generate a notice if integrity check fails
-                                       trigger_error( "Template failed integrity check: {$filename}" );
+                                       // If the integrity check fails, don't use the cached code
+                                       // We'll update the invalid cache below
+                                       $code = null;
                                }
                        }
+                       if ( !$code ) {
+                               $code = $this->compileForEval( $fileContents, $filename );
+
+                               // Prefix the cached code with a keyed hash (64 hex chars) as an integrity check
+                               $cache->set( $key, hash_hmac( 'sha256', $code, $secretKey ) . $code );
+                       }
                // If there is no secret key available, don't use cache
                } else {
                        $code = $this->compileForEval( $fileContents, $filename );
index 3ce775b..a8cfad8 100644 (file)
@@ -21,6 +21,9 @@
  *
  * @file
  */
+
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\Interwiki\InterwikiLookup;
 use MediaWiki\MediaWikiServices;
@@ -134,7 +137,7 @@ class Title implements LinkTarget {
 
        /**
         * @var int Namespace index when there is no namespace. Don't change the
-        *   following default, NS_MAIN is hardcoded in several places. See bug 696.
+        *   following default, NS_MAIN is hardcoded in several places. See T2696.
         *   Zero except in {{transclusion}} tags.
         */
        public $mDefaultNamespace = NS_MAIN;
@@ -307,7 +310,7 @@ class Title implements LinkTarget {
                        }
                }
 
-               // Convert things like &eacute; &#257; or &#x3017; into normalized (bug 14952) text
+               // Convert things like &eacute; &#257; or &#x3017; into normalized (T16952) text
                $filteredText = Sanitizer::decodeCharReferencesAndNormalize( $text );
 
                $t = new Title();
@@ -1681,6 +1684,33 @@ class Title implements LinkTarget {
                return $url;
        }
 
+       /**
+        * Get a url appropriate for making redirects based on an untrusted url arg
+        *
+        * This is basically the same as getFullUrl(), but in the case of external
+        * interwikis, we send the user to a landing page, to prevent possible
+        * phishing attacks and the like.
+        *
+        * @note Uses current protocol by default, since technically relative urls
+        *   aren't allowed in redirects per HTTP spec, so this is not suitable for
+        *   places where the url gets cached, as might pollute between
+        *   https and non-https users.
+        * @see self::getLocalURL for the arguments.
+        * @param array|string $query
+        * @param string $proto Protocol type to use in URL
+        * @return String. A url suitable to use in an HTTP location header.
+        */
+       public function getFullUrlForRedirect( $query = '', $proto = PROTO_CURRENT ) {
+               $target = $this;
+               if ( $this->isExternal() ) {
+                       $target = SpecialPage::getTitleFor(
+                               'GoToInterwiki',
+                               $this->getPrefixedDBKey()
+                       );
+               }
+               return $target->getFullUrl( $query, false, $proto );
+       }
+
        /**
         * Get a URL with no fragment or server name (relative URL) from a Title object.
         * If this page is generated with action=render, however,
@@ -2093,7 +2123,7 @@ class Title implements LinkTarget {
        private function checkSpecialsAndNSPermissions( $action, $user, $errors, $rigor, $short ) {
                # Only 'createaccount' can be performed on special pages,
                # which don't actually exist in the DB.
-               if ( NS_SPECIAL == $this->mNamespace && $action !== 'createaccount' ) {
+               if ( $this->isSpecialPage() && $action !== 'createaccount' ) {
                        $errors[] = [ 'ns-specialprotected' ];
                }
 
@@ -2122,8 +2152,7 @@ class Title implements LinkTarget {
        private function checkCSSandJSPermissions( $action, $user, $errors, $rigor, $short ) {
                # Protect css/js subpages of user pages
                # XXX: this might be better using restrictions
-               # XXX: right 'editusercssjs' is deprecated, for backward compatibility only
-               if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' ) ) {
+               if ( $action != 'patrol' ) {
                        if ( preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) {
                                if ( $this->isCssSubpage() && !$user->isAllowedAny( 'editmyusercss', 'editusercss' ) ) {
                                        $errors[] = [ 'mycustomcssprotected', $action ];
@@ -2287,6 +2316,17 @@ class Title implements LinkTarget {
                        ) {
                                $errors[] = [ 'delete-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ];
                        }
+               } elseif ( $action === 'undelete' ) {
+                       if ( count( $this->getUserPermissionsErrorsInternal( 'edit', $user, $rigor, true ) ) ) {
+                               // Undeleting implies editing
+                               $errors[] = [ 'undelete-cantedit' ];
+                       }
+                       if ( !$this->exists()
+                               && count( $this->getUserPermissionsErrorsInternal( 'create', $user, $rigor, true ) )
+                       ) {
+                               // Undeleting where nothing currently exists implies creating
+                               $errors[] = [ 'undelete-cantcreate' ];
+                       }
                }
                return $errors;
        }
@@ -2549,6 +2589,29 @@ class Title implements LinkTarget {
         *   protection, or false if there's none.
         */
        public function getTitleProtection() {
+               $protection = $this->getTitleProtectionInternal();
+               if ( $protection ) {
+                       if ( $protection['permission'] == 'sysop' ) {
+                               $protection['permission'] = 'editprotected'; // B/C
+                       }
+                       if ( $protection['permission'] == 'autoconfirmed' ) {
+                               $protection['permission'] = 'editsemiprotected'; // B/C
+                       }
+               }
+               return $protection;
+       }
+
+       /**
+        * Fetch title protection settings
+        *
+        * To work correctly, $this->loadRestrictions() needs to have access to the
+        * actual protections in the database without munging 'sysop' =>
+        * 'editprotected' and 'autoconfirmed' => 'editsemiprotected'. Other
+        * callers probably want $this->getTitleProtection() instead.
+        *
+        * @return array|bool
+        */
+       protected function getTitleProtectionInternal() {
                // Can't protect pages in special namespaces
                if ( $this->getNamespace() < 0 ) {
                        return false;
@@ -2576,12 +2639,6 @@ class Title implements LinkTarget {
                        // fetchRow returns false if there are no rows.
                        $row = $dbr->fetchRow( $res );
                        if ( $row ) {
-                               if ( $row['permission'] == 'sysop' ) {
-                                       $row['permission'] = 'editprotected'; // B/C
-                               }
-                               if ( $row['permission'] == 'autoconfirmed' ) {
-                                       $row['permission'] = 'editsemiprotected'; // B/C
-                               }
                                $row['expiry'] = $dbr->decodeExpiry( $row['expiry'] );
                        }
                        $this->mTitleProtection = $row;
@@ -2926,8 +2983,6 @@ class Title implements LinkTarget {
                                        continue;
                                }
 
-                               // This code should be refactored, now that it's being used more generally,
-                               // But I don't really see any harm in leaving it in Block for now -werdna
                                $expiry = $dbr->decodeExpiry( $row->pr_expiry );
 
                                // Only apply the restrictions if they haven't expired!
@@ -2979,7 +3034,7 @@ class Title implements LinkTarget {
 
                        $this->loadRestrictionsFromRows( $rows, $oldFashionedRestrictions );
                } else {
-                       $title_protection = $this->getTitleProtection();
+                       $title_protection = $this->getTitleProtectionInternal();
 
                        if ( $title_protection ) {
                                $now = wfTimestampNow();
@@ -3371,7 +3426,7 @@ class Title implements LinkTarget {
                $this->mTextform = strtr( $this->mDbkeyform, '_', ' ' );
 
                # We already know that some pages won't be in the database!
-               if ( $this->isExternal() || $this->mNamespace == NS_SPECIAL ) {
+               if ( $this->isExternal() || $this->isSpecialPage() ) {
                        $this->mArticleID = 0;
                }
 
@@ -3741,14 +3796,14 @@ class Title implements LinkTarget {
                        }
                        $newPageName = preg_replace(
                                        '#^' . preg_quote( $this->getDBkey(), '#' ) . '#',
-                                       StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
+                                       StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # T23234
                                        $oldSubpage->getDBkey() );
                        if ( $oldSubpage->isTalkPage() ) {
                                $newNs = $nt->getTalkPage()->getNamespace();
                        } else {
                                $newNs = $nt->getSubjectPage()->getNamespace();
                        }
-                       # Bug 14385: we need makeTitleSafe because the new page names may
+                       # T16385: we need makeTitleSafe because the new page names may
                        # be longer than 255 characters.
                        $newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
 
@@ -3865,7 +3920,7 @@ class Title implements LinkTarget {
         * categories' names.
         *
         * @return array Array of parents in the form:
-        *        $parent => $currentarticle
+        *     $parent => $currentarticle
         */
        public function getParentCategories() {
                global $wgContLang;
@@ -3939,21 +3994,52 @@ class Title implements LinkTarget {
        }
 
        /**
-        * Get the revision ID of the previous revision
-        *
+        * Get next/previous revision ID relative to another revision ID
         * @param int $revId Revision ID. Get the revision that was before this one.
         * @param int $flags Title::GAID_FOR_UPDATE
-        * @return int|bool Old revision ID, or false if none exists
-        */
-       public function getPreviousRevisionID( $revId, $flags = 0 ) {
-               $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_REPLICA );
+        * @param string $dir 'next' or 'prev'
+        * @return int|bool New revision ID, or false if none exists
+        */
+       private function getRelativeRevisionID( $revId, $flags, $dir ) {
+               $revId = (int)$revId;
+               if ( $dir === 'next' ) {
+                       $op = '>';
+                       $sort = 'ASC';
+               } elseif ( $dir === 'prev' ) {
+                       $op = '<';
+                       $sort = 'DESC';
+               } else {
+                       throw new InvalidArgumentException( '$dir must be "next" or "prev"' );
+               }
+
+               if ( $flags & self::GAID_FOR_UPDATE ) {
+                       $db = wfGetDB( DB_MASTER );
+               } else {
+                       $db = wfGetDB( DB_REPLICA, 'contributions' );
+               }
+
+               // Intentionally not caring if the specified revision belongs to this
+               // page. We only care about the timestamp.
+               $ts = $db->selectField( 'revision', 'rev_timestamp', [ 'rev_id' => $revId ], __METHOD__ );
+               if ( $ts === false ) {
+                       $ts = $db->selectField( 'archive', 'ar_timestamp', [ 'ar_rev_id' => $revId ], __METHOD__ );
+                       if ( $ts === false ) {
+                               // Or should this throw an InvalidArgumentException or something?
+                               return false;
+                       }
+               }
+               $ts = $db->addQuotes( $ts );
+
                $revId = $db->selectField( 'revision', 'rev_id',
                        [
                                'rev_page' => $this->getArticleID( $flags ),
-                               'rev_id < ' . intval( $revId )
+                               "rev_timestamp $op $ts OR (rev_timestamp = $ts AND rev_id $op $revId)"
                        ],
                        __METHOD__,
-                       [ 'ORDER BY' => 'rev_id DESC' ]
+                       [
+                               'ORDER BY' => "rev_timestamp $sort, rev_id $sort",
+                               'IGNORE INDEX' => 'rev_timestamp', // Probably needed for T159319
+                       ]
                );
 
                if ( $revId === false ) {
@@ -3963,6 +4049,17 @@ class Title implements LinkTarget {
                }
        }
 
+       /**
+        * Get the revision ID of the previous revision
+        *
+        * @param int $revId Revision ID. Get the revision that was before this one.
+        * @param int $flags Title::GAID_FOR_UPDATE
+        * @return int|bool Old revision ID, or false if none exists
+        */
+       public function getPreviousRevisionID( $revId, $flags = 0 ) {
+               return $this->getRelativeRevisionID( $revId, $flags, 'prev' );
+       }
+
        /**
         * Get the revision ID of the next revision
         *
@@ -3971,21 +4068,7 @@ class Title implements LinkTarget {
         * @return int|bool Next revision ID, or false if none exists
         */
        public function getNextRevisionID( $revId, $flags = 0 ) {
-               $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_REPLICA );
-               $revId = $db->selectField( 'revision', 'rev_id',
-                       [
-                               'rev_page' => $this->getArticleID( $flags ),
-                               'rev_id > ' . intval( $revId )
-                       ],
-                       __METHOD__,
-                       [ 'ORDER BY' => 'rev_id' ]
-               );
-
-               if ( $revId === false ) {
-                       return false;
-               } else {
-                       return intval( $revId );
-               }
+               return $this->getRelativeRevisionID( $revId, $flags, 'next' );
        }
 
        /**
@@ -4001,7 +4084,10 @@ class Title implements LinkTarget {
                        $row = $db->selectRow( 'revision', Revision::selectFields(),
                                [ 'rev_page' => $pageId ],
                                __METHOD__,
-                               [ 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 1 ]
+                               [
+                                       'ORDER BY' => 'rev_timestamp ASC, rev_id ASC',
+                                       'IGNORE INDEX' => 'rev_timestamp', // See T159319
+                               ]
                        );
                        if ( $row ) {
                                return new Revision( $row );
@@ -4581,7 +4667,7 @@ class Title implements LinkTarget {
        }
 
        /**
-        * Whether the magic words __INDEX__ and __NOINDEX__ function for  this page.
+        * Whether the magic words __INDEX__ and __NOINDEX__ function for this page.
         *
         * @return bool
         */
index 5a28b85..bf2344b 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * The TitleArray class only exists to provide the newFromResult method at pre-
  * sent.
index 668ea54..189fb40 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 class TitleArrayFromResult extends TitleArray implements Countable {
        /** @var ResultWrapper */
        public $res;
index 825860a..a9ebd76 100644 (file)
@@ -45,6 +45,7 @@ class TrackingCategories {
                'expansion-depth-exceeded-category',
                'restricted-displaytitle-ignored',
                'deprecated-self-close-category',
+               'template-loop-category',
        ];
 
        /**
index 2b8147a..22d5439 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\LoadBalancer;
@@ -389,7 +390,7 @@ class WatchedItemQueryService {
                }
 
                if ( array_key_exists( 'rcTypes', $options ) ) {
-                       $conds['rc_type'] = array_map( 'intval',  $options['rcTypes'] );
+                       $conds['rc_type'] = array_map( 'intval', $options['rcTypes'] );
                }
 
                $conds = array_merge(
@@ -505,7 +506,7 @@ class WatchedItemQueryService {
                        $conds[] = 'rc_user_text != ' . $db->addQuotes( $options['notByUser'] );
                }
 
-               // Avoid brute force searches (bug 17342)
+               // Avoid brute force searches (T19342)
                $bitmask = 0;
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $bitmask = Revision::DELETED_USER;
@@ -564,7 +565,7 @@ class WatchedItemQueryService {
                }
                if ( isset( $options['filter'] ) ) {
                        $filter = $options['filter'];
-                       if ( $filter ===  self::FILTER_CHANGED ) {
+                       if ( $filter === self::FILTER_CHANGED ) {
                                $conds[] = 'wl_notificationtimestamp IS NOT NULL';
                        } else {
                                $conds[] = 'wl_notificationtimestamp IS NULL';
index 8fcf131..93d5033 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Extension mechanism for WatchedItemQueryService
  *
index 9af5310..06f93c6 100644 (file)
@@ -1,18 +1,23 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
 use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Assert\Assert;
 use Wikimedia\ScopedCallback;
 use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\DBUnexpectedError;
 
 /**
  * Storage layer class for WatchedItems.
  * Database interaction.
  *
- * @author Addshore
+ * Uses database because this uses User::isAnon
+ *
+ * @group Database
  *
+ * @author Addshore
  * @since 1.27
  */
 class WatchedItemStore implements StatsdAwareInterface {
@@ -25,6 +30,11 @@ class WatchedItemStore implements StatsdAwareInterface {
         */
        private $loadBalancer;
 
+       /**
+        * @var ReadOnlyMode
+        */
+       private $readOnlyMode;
+
        /**
         * @var HashBagOStuff
         */
@@ -56,13 +66,16 @@ class WatchedItemStore implements StatsdAwareInterface {
        /**
         * @param LoadBalancer $loadBalancer
         * @param HashBagOStuff $cache
+        * @param ReadOnlyMode $readOnlyMode
         */
        public function __construct(
                LoadBalancer $loadBalancer,
-               HashBagOStuff $cache
+               HashBagOStuff $cache,
+               ReadOnlyMode $readOnlyMode
        ) {
                $this->loadBalancer = $loadBalancer;
                $this->cache = $cache;
+               $this->readOnlyMode = $readOnlyMode;
                $this->stats = new NullStatsdDataFactory();
                $this->deferredUpdatesAddCallableUpdateCallback = [ 'DeferredUpdates', 'addCallableUpdate' ];
                $this->revisionGetTimestampFromIdCallback = [ 'Revision', 'getTimestampFromId' ];
@@ -454,7 +467,7 @@ class WatchedItemStore implements StatsdAwareInterface {
                $item = new WatchedItem(
                        $user,
                        $target,
-                       $row->wl_notificationtimestamp
+                       wfTimestampOrNull( TS_MW, $row->wl_notificationtimestamp )
                );
                $this->cache( $item );
 
@@ -568,7 +581,8 @@ class WatchedItemStore implements StatsdAwareInterface {
                );
 
                foreach ( $res as $row ) {
-                       $timestamps[$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp;
+                       $timestamps[$row->wl_namespace][$row->wl_title] =
+                               wfTimestampOrNull( TS_MW, $row->wl_notificationtimestamp );
                }
 
                return $timestamps;
@@ -591,7 +605,7 @@ class WatchedItemStore implements StatsdAwareInterface {
         * @return bool success
         */
        public function addWatchBatchForUser( User $user, array $targets ) {
-               if ( $this->loadBalancer->getReadOnlyReason() !== false ) {
+               if ( $this->readOnlyMode->isReadOnly() ) {
                        return false;
                }
                // Only loggedin user can have a watchlist
@@ -649,7 +663,7 @@ class WatchedItemStore implements StatsdAwareInterface {
         */
        public function removeWatch( User $user, LinkTarget $target ) {
                // Only logged in user can have a watchlist
-               if ( $this->loadBalancer->getReadOnlyReason() !== false || $user->isAnon() ) {
+               if ( $this->readOnlyMode->isReadOnly() || $user->isAnon() ) {
                        return false;
                }
 
@@ -780,7 +794,7 @@ class WatchedItemStore implements StatsdAwareInterface {
         */
        public function resetNotificationTimestamp( User $user, Title $title, $force = '', $oldid = 0 ) {
                // Only loggedin user can have a watchlist
-               if ( $this->loadBalancer->getReadOnlyReason() !== false || $user->isAnon() ) {
+               if ( $this->readOnlyMode->isReadOnly() || $user->isAnon() ) {
                        return false;
                }
 
index 78d7444..3d5e372 100644 (file)
@@ -216,7 +216,7 @@ class WebRequest {
 
                        $host = $parts[0];
                        if ( $wgAssumeProxiesUseDefaultProtocolPorts && isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) {
-                               // Bug 70021: Assume that upstream proxy is running on the default
+                               // T72021: Assume that upstream proxy is running on the default
                                // port based on the protocol. We have no reliable way to determine
                                // the actual port in use upstream.
                                $port = $stdPort;
@@ -308,7 +308,7 @@ class WebRequest {
         * available variant URLs.
         */
        public function interpolateTitle() {
-               // bug 16019: title interpolation on API queries is useless and sometimes harmful
+               // T18019: title interpolation on API queries is useless and sometimes harmful
                if ( defined( 'MW_API' ) ) {
                        return;
                }
@@ -1229,7 +1229,7 @@ HTML;
                                if (
                                        IP::isPublic( $ipchain[$i + 1] ) ||
                                        $wgUsePrivateIPs ||
-                                       $proxyLookup->isConfiguredProxy( $curIP ) // bug 48919; treat IP as sane
+                                       $proxyLookup->isConfiguredProxy( $curIP ) // T50919; treat IP as sane
                                ) {
                                        // Follow the next IP according to the proxy
                                        $nextIP = IP::canonicalize( $ipchain[$i + 1] );
index 861e532..e281b6f 100644 (file)
@@ -1,12 +1,11 @@
 <?php
 /**
  * This does the initial set up for a web request.
- * It does some security checks, starts the profiler and loads the
- * configuration, and optionally loads Setup.php depending on whether
- * MW_NO_SETUP is defined.
  *
- * Setup.php (if loaded) then sets up GlobalFunctions, the AutoLoader,
- * and the configuration globals.
+ * It does some security checks, loads autoloaders, constants, and
+ * global functions, starts the profiler, loads the configuration,
+ * and loads Setup.php, which loads extensions using the extension
+ * registration system and initializes the application's global state.
  *
  * 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
@@ -30,7 +29,7 @@ if ( ini_get( 'mbstring.func_overload' ) ) {
        die( 'MediaWiki does not support installations where mbstring.func_overload is non-zero.' );
 }
 
-# bug 15461: Make IE8 turn off content sniffing. Everybody else should ignore this
+# T17461: Make IE8 turn off content sniffing. Everybody else should ignore this
 # We're adding it here so that it's *always* set, even for alternate entry
 # points and when $wgOut gets disabled or overridden.
 header( 'X-Content-Type-Options: nosniff' );
index f7b8d2f..a03bc19 100644 (file)
@@ -175,106 +175,3 @@ class WikiMap {
                return false;
        }
 }
-
-/**
- * Reference to a locally-hosted wiki
- */
-class WikiReference {
-       private $mCanonicalServer; ///< canonical server URL, e.g. 'https://www.mediawiki.org'
-       private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org'
-       private $mPath;   ///< path, '/wiki/$1'
-
-       /**
-        * @param string $canonicalServer
-        * @param string $path
-        * @param null|string $server
-        */
-       public function __construct( $canonicalServer, $path, $server = null ) {
-               $this->mCanonicalServer = $canonicalServer;
-               $this->mPath = $path;
-               $this->mServer = $server === null ? $canonicalServer : $server;
-       }
-
-       /**
-        * Get the URL in a way to be displayed to the user
-        * More or less Wikimedia specific
-        *
-        * @return string
-        */
-       public function getDisplayName() {
-               $parsed = wfParseUrl( $this->mCanonicalServer );
-               if ( $parsed ) {
-                       return $parsed['host'];
-               } else {
-                       // Invalid server spec.
-                       // There's no sane thing to do here, so just return the canonical server name in full.
-                       return $this->mCanonicalServer;
-               }
-       }
-
-       /**
-        * Helper function for getUrl()
-        *
-        * @todo FIXME: This may be generalized...
-        *
-        * @param string $page Page name (must be normalised before calling this function!
-        *  May contain a section part.)
-        * @param string|null $fragmentId
-        *
-        * @return string relative URL, without the server part.
-        */
-       private function getLocalUrl( $page, $fragmentId = null ) {
-               $page = wfUrlencode( str_replace( ' ', '_', $page ) );
-
-               if ( is_string( $fragmentId ) && $fragmentId !== '' ) {
-                       $page .= '#' . wfUrlencode( $fragmentId );
-               }
-
-               return str_replace( '$1', $page, $this->mPath );
-       }
-
-       /**
-        * Get a canonical (i.e. based on $wgCanonicalServer) URL to a page on this foreign wiki
-        *
-        * @param string $page Page name (must be normalised before calling this function!)
-        * @param string|null $fragmentId
-        *
-        * @return string Url
-        */
-       public function getCanonicalUrl( $page, $fragmentId = null ) {
-               return $this->mCanonicalServer . $this->getLocalUrl( $page, $fragmentId );
-       }
-
-       /**
-        * Get a canonical server URL
-        * @return string
-        */
-       public function getCanonicalServer() {
-               return $this->mCanonicalServer;
-       }
-
-       /**
-        * Alias for getCanonicalUrl(), for backwards compatibility.
-        * @param string $page
-        * @param string|null $fragmentId
-        *
-        * @return string
-        */
-       public function getUrl( $page, $fragmentId = null ) {
-               return $this->getCanonicalUrl( $page, $fragmentId );
-       }
-
-       /**
-        * Get a URL based on $wgServer, like Title::getFullURL() would produce
-        * when called locally on the wiki.
-        *
-        * @param string $page Page name (must be normalized before calling this function!)
-        * @param string|null $fragmentId
-        *
-        * @return string URL
-        */
-       public function getFullUrl( $page, $fragmentId = null ) {
-               return $this->mServer .
-                       $this->getLocalUrl( $page, $fragmentId );
-       }
-}
diff --git a/includes/WikiReference.php b/includes/WikiReference.php
new file mode 100644 (file)
index 0000000..724ba98
--- /dev/null
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Tools for dealing with other locally-hosted wikis.
+ *
+ * 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
+ */
+
+/**
+ * Reference to a locally-hosted wiki
+ */
+class WikiReference {
+       private $mCanonicalServer; ///< canonical server URL, e.g. 'https://www.mediawiki.org'
+       private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org'
+       private $mPath; ///< path, '/wiki/$1'
+
+       /**
+        * @param string $canonicalServer
+        * @param string $path
+        * @param null|string $server
+        */
+       public function __construct( $canonicalServer, $path, $server = null ) {
+               $this->mCanonicalServer = $canonicalServer;
+               $this->mPath = $path;
+               $this->mServer = $server === null ? $canonicalServer : $server;
+       }
+
+       /**
+        * Get the URL in a way to be displayed to the user
+        * More or less Wikimedia specific
+        *
+        * @return string
+        */
+       public function getDisplayName() {
+               $parsed = wfParseUrl( $this->mCanonicalServer );
+               if ( $parsed ) {
+                       return $parsed['host'];
+               } else {
+                       // Invalid server spec.
+                       // There's no sane thing to do here, so just return the canonical server name in full.
+                       return $this->mCanonicalServer;
+               }
+       }
+
+       /**
+        * Helper function for getUrl()
+        *
+        * @todo FIXME: This may be generalized...
+        *
+        * @param string $page Page name (must be normalised before calling this function!
+        *  May contain a section part.)
+        * @param string|null $fragmentId
+        *
+        * @return string relative URL, without the server part.
+        */
+       private function getLocalUrl( $page, $fragmentId = null ) {
+               $page = wfUrlencode( str_replace( ' ', '_', $page ) );
+
+               if ( is_string( $fragmentId ) && $fragmentId !== '' ) {
+                       $page .= '#' . wfUrlencode( $fragmentId );
+               }
+
+               return str_replace( '$1', $page, $this->mPath );
+       }
+
+       /**
+        * Get a canonical (i.e. based on $wgCanonicalServer) URL to a page on this foreign wiki
+        *
+        * @param string $page Page name (must be normalised before calling this function!)
+        * @param string|null $fragmentId
+        *
+        * @return string Url
+        */
+       public function getCanonicalUrl( $page, $fragmentId = null ) {
+               return $this->mCanonicalServer . $this->getLocalUrl( $page, $fragmentId );
+       }
+
+       /**
+        * Get a canonical server URL
+        * @return string
+        */
+       public function getCanonicalServer() {
+               return $this->mCanonicalServer;
+       }
+
+       /**
+        * Alias for getCanonicalUrl(), for backwards compatibility.
+        * @param string $page
+        * @param string|null $fragmentId
+        *
+        * @return string
+        */
+       public function getUrl( $page, $fragmentId = null ) {
+               return $this->getCanonicalUrl( $page, $fragmentId );
+       }
+
+       /**
+        * Get a URL based on $wgServer, like Title::getFullURL() would produce
+        * when called locally on the wiki.
+        *
+        * @param string $page Page name (must be normalized before calling this function!)
+        * @param string|null $fragmentId
+        *
+        * @return string URL
+        */
+       public function getFullUrl( $page, $fragmentId = null ) {
+               return $this->mServer .
+                       $this->getLocalUrl( $page, $fragmentId );
+       }
+}
index 8f18046..8289b81 100644 (file)
@@ -59,8 +59,8 @@ class Xml {
         * Given an array of ('attributename' => 'value'), it generates the code
         * to set the XML attributes : attributename="value".
         * The values are passed to Sanitizer::encodeAttribute.
-        * Return null if no attributes given.
-        * @param array $attribs Array of attributes for an XML element
+        * Returns null or empty string if no attributes given.
+        * @param array|null $attribs Array of attributes for an XML element
         * @throws MWException
         * @return null|string
         */
@@ -563,36 +563,6 @@ 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.
         *
@@ -857,27 +827,3 @@ class Xml {
        }
 }
 
-/**
- * A wrapper class which causes Xml::encodeJsVar() and Xml::encodeJsCall() to
- * interpret a given string as being a JavaScript expression, instead of string
- * data.
- *
- * Example:
- *
- *    Xml::encodeJsVar( new XmlJsCode( 'a + b' ) );
- *
- * Returns "a + b".
- *
- * @note As of 1.21, XmlJsCode objects cannot be nested inside objects or arrays. The sole
- *       exception is the $args argument to Xml::encodeJsCall() because Xml::encodeJsVar() is
- *       called for each individual element in that array.
- *
- * @since 1.17
- */
-class XmlJsCode {
-       public $value;
-
-       function __construct( $value ) {
-               $this->value = $value;
-       }
-}
diff --git a/includes/XmlJsCode.php b/includes/XmlJsCode.php
new file mode 100644 (file)
index 0000000..d1cd037
--- /dev/null
@@ -0,0 +1,44 @@
+<?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
+ */
+
+/**
+ * A wrapper class which causes Xml::encodeJsVar() and Xml::encodeJsCall() to
+ * interpret a given string as being a JavaScript expression, instead of string
+ * data.
+ *
+ * Example:
+ *
+ *    Xml::encodeJsVar( new XmlJsCode( 'a + b' ) );
+ *
+ * Returns "a + b".
+ *
+ * @note As of 1.21, XmlJsCode objects cannot be nested inside objects or arrays. The sole
+ *       exception is the $args argument to Xml::encodeJsCall() because Xml::encodeJsVar() is
+ *       called for each individual element in that array.
+ *
+ * @since 1.17
+ */
+class XmlJsCode {
+       public $value;
+
+       function __construct( $value ) {
+               $this->value = $value;
+       }
+}
index e94a188..0141b9e 100644 (file)
@@ -58,6 +58,14 @@ abstract class FormAction extends Action {
        protected function alterForm( HTMLForm $form ) {
        }
 
+       /**
+        * Whether the form should use OOUI
+        * @return bool
+        */
+       protected function usesOOUI() {
+               return false;
+       }
+
        /**
         * Get the HTMLForm to control behavior
         * @return HTMLForm|null
@@ -68,7 +76,11 @@ abstract class FormAction extends Action {
                // Give hooks a chance to alter the form, adding extra fields or text etc
                Hooks::run( 'ActionModifyFormFields', [ $this->getName(), &$this->fields, $this->page ] );
 
-               $form = new HTMLForm( $this->fields, $this->getContext(), $this->getName() );
+               if ( $this->usesOOUI() ) {
+                       $form = HTMLForm::factory( 'ooui', $this->fields, $this->getContext(), $this->getName() );
+               } else {
+                       $form = new HTMLForm( $this->fields, $this->getContext(), $this->getName() );
+               }
                $form->setSubmitCallback( [ $this, 'onSubmit' ] );
 
                $title = $this->getTitle();
index b381edc..d1be7d4 100644 (file)
@@ -24,6 +24,8 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * This class handles printing the history page for an article. In order to
index 167b709..0f13b17 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\Database;
 
 /**
  * Displays information about a page.
@@ -72,8 +73,9 @@ class InfoAction extends FormlessAction {
                        $revid = $revision ? $revision->getId() : null;
                }
                if ( $revid !== null ) {
-                       $key = self::getCacheKey( $title, $revid );
-                       ObjectCache::getMainWANInstance()->delete( $key );
+                       $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+                       $key = self::getCacheKey( $cache, $title, $revid );
+                       $cache->delete( $key );
                }
        }
 
@@ -689,9 +691,10 @@ class InfoAction extends FormlessAction {
        protected function pageCounts( Page $page ) {
                $fname = __METHOD__;
                $config = $this->context->getConfig();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 
-               return ObjectCache::getMainWANInstance()->getWithSetCallback(
-                       self::getCacheKey( $page->getTitle(), $page->getLatest() ),
+               return $cache->getWithSetCallback(
+                       self::getCacheKey( $cache, $page->getTitle(), $page->getLatest() ),
                        WANObjectCache::TTL_WEEK,
                        function ( $oldValue, &$ttl, &$setOpts ) use ( $page, $config, $fname ) {
                                $title = $page->getTitle();
@@ -902,11 +905,12 @@ class InfoAction extends FormlessAction {
        }
 
        /**
+        * @param WANObjectCache $cache
         * @param Title $title
         * @param int $revId
         * @return string
         */
-       protected static function getCacheKey( Title $title, $revId ) {
-               return wfMemcKey( 'infoaction', md5( $title->getPrefixedText() ), $revId, self::VERSION );
+       protected static function getCacheKey( WANObjectCache $cache, Title $title, $revId ) {
+               return $cache->makeKey( 'infoaction', md5( $title->getPrefixedText() ), $revId, self::VERSION );
        }
 }
index 942b731..904c6e2 100644 (file)
@@ -42,7 +42,7 @@ class PurgeAction extends FormAction {
        }
 
        public function onSubmit( $data ) {
-               return $this->page->doPurge( WikiPage::PURGE_ALL );
+               return $this->page->doPurge();
        }
 
        public function show() {
@@ -75,12 +75,24 @@ class PurgeAction extends FormAction {
                }
        }
 
-       protected function alterForm( HTMLForm $form ) {
-               $form->setSubmitTextMsg( 'confirm_purge_button' );
+       protected function usesOOUI() {
+               return true;
        }
 
-       protected function preText() {
-               return $this->msg( 'confirm-purge-top' )->parse();
+       protected function getFormFields() {
+               return [
+                       'intro' => [
+                               'type' => 'info',
+                               'vertical-label' => true,
+                               'raw' => true,
+                               'default' => $this->msg( 'confirm-purge-top' )->parse()
+                       ]
+               ];
+       }
+
+       protected function alterForm( HTMLForm $form ) {
+               $form->setWrapperLegendMsg( 'confirm-purge-title' );
+               $form->setSubmitTextMsg( 'confirm_purge_button' );
        }
 
        protected function postText() {
index e466e65..a914c9b 100644 (file)
@@ -66,6 +66,10 @@ class RevertAction extends FormAction {
                }
        }
 
+       protected function usesOOUI() {
+               return true;
+       }
+
        protected function alterForm( HTMLForm $form ) {
                $form->setWrapperLegendMsg( 'filerevert-legend' );
                $form->setSubmitTextMsg( 'filerevert-submit' );
index 7f043e4..aa17b89 100644 (file)
@@ -31,22 +31,27 @@ class UnwatchAction extends WatchAction {
                return 'unwatch';
        }
 
-       protected function getDescription() {
-               return $this->msg( 'removewatch' )->escaped();
-       }
-
        public function onSubmit( $data ) {
                self::doUnwatch( $this->getTitle(), $this->getUser() );
 
                return true;
        }
 
-       protected function alterForm( HTMLForm $form ) {
-               $form->setSubmitTextMsg( 'confirm-unwatch-button' );
+       protected function getFormFields() {
+               return [
+                       'intro' => [
+                               'type' => 'info',
+                               'vertical-label' => true,
+                               'raw' => true,
+                               'default' => $this->msg( 'confirm-unwatch-top' )->parse()
+                       ]
+               ];
        }
 
-       protected function preText() {
-               return $this->msg( 'confirm-unwatch-top' )->parse();
+       protected function alterForm( HTMLForm $form ) {
+               parent::alterForm( $form );
+               $form->setWrapperLegendMsg( 'removewatch' );
+               $form->setSubmitTextMsg( 'confirm-unwatch-button' );
        }
 
        public function onSuccess() {
index 0ba964f..134b8a4 100644 (file)
@@ -58,9 +58,6 @@ class ViewAction extends FormlessAction {
                                $touched = null;
                        }
 
-                       // If a page was purged on HTTP GET, relect that timestamp to avoid sending 304s
-                       $touched = max( $touched, $this->page->getLastPurgeTimestamp() );
-
                        // Send HTTP 304 if the IMS matches or otherwise set expiry/last-modified headers
                        if ( $touched && $this->getOutput()->checkLastModified( $touched ) ) {
                                wfDebug( __METHOD__ . ": done 304\n" );
index 23505c0..e12a727 100644 (file)
@@ -35,11 +35,8 @@ class WatchAction extends FormAction {
                return false;
        }
 
-       /**
-        * @return string HTML
-        */
        protected function getDescription() {
-               return $this->msg( 'addwatch' )->escaped();
+               return '';
        }
 
        public function onSubmit( $data ) {
@@ -57,15 +54,27 @@ class WatchAction extends FormAction {
                parent::checkCanExecute( $user );
        }
 
+       protected function usesOOUI() {
+               return true;
+       }
+
+       protected function getFormFields() {
+               return [
+                       'intro' => [
+                               'type' => 'info',
+                               'vertical-label' => true,
+                               'raw' => true,
+                               'default' => $this->msg( 'confirm-watch-top' )->parse()
+                       ]
+               ];
+       }
+
        protected function alterForm( HTMLForm $form ) {
+               $form->setWrapperLegendMsg( 'addwatch' );
                $form->setSubmitTextMsg( 'confirm-watch-button' );
                $form->setTokenSalt( 'watch' );
        }
 
-       protected function preText() {
-               return $this->msg( 'confirm-watch-top' )->parse();
-       }
-
        public function onSuccess() {
                $msgKey = $this->getTitle()->isTalkPage() ? 'addedwatchtext-talk' : 'addedwatchtext';
                $this->getOutput()->addWikiMsg( $msgKey, $this->getTitle()->getPrefixedText() );
index 5d12590..b8bd511 100644 (file)
@@ -132,6 +132,6 @@ class ApiAMCreateAccount extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Account_creation';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Account_creation';
        }
 }
index d037c36..8862cc7 100644 (file)
@@ -169,6 +169,7 @@ class ApiAuthManagerHelper {
                $this->module->getMain()->markParamsUsed( array_keys( $data ) );
 
                if ( $sensitive ) {
+                       $this->module->getMain()->markParamsSensitive( array_keys( $sensitive ) );
                        $this->module->requirePostedParameters( array_keys( $sensitive ), 'noprefix' );
                }
 
index e249810..a6c4b2a 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * This abstract class implements many basic API functions, and is the base of
  * all API classes.
@@ -186,6 +188,13 @@ abstract class ApiBase extends ContextSource {
         */
        const PARAM_EXTRA_NAMESPACES = 18;
 
+       /*
+        * (boolean) Is the parameter sensitive? Note 'password'-type fields are
+        * always sensitive regardless of the value of this field.
+        * @since 1.29
+        */
+       const PARAM_SENSITIVE = 19;
+
        /**@}*/
 
        const ALL_DEFAULT_STRING = '*';
@@ -376,6 +385,13 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Indicates whether this module requires write mode
+        *
+        * This should return true for modules that may require synchronous database writes.
+        * Modules that do not need such writes should also not rely on master database access,
+        * since only read queries are needed and each master DB is a single point of failure.
+        * Additionally, requests that only need replica DBs can be efficiently routed to any
+        * datacenter via the Promise-Non-Write-API-Action header.
+        *
         * @return bool
         */
        public function isWriteMode() {
@@ -617,7 +633,7 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Gets a default replica DB connection object
-        * @return Database
+        * @return IDatabase
         */
        protected function getDB() {
                if ( !isset( $this->mSlaveDB ) ) {
@@ -700,7 +716,7 @@ abstract class ApiBase extends ContextSource {
         * @return array
         */
        public function extractRequestParams( $parseLimit = true ) {
-               // Cache parameters, for performance and to avoid bug 24564.
+               // Cache parameters, for performance and to avoid T26564.
                if ( !isset( $this->mParamCache[$parseLimit] ) ) {
                        $params = $this->getFinalParams();
                        $results = [];
@@ -1023,6 +1039,10 @@ abstract class ApiBase extends ContextSource {
                        } else {
                                $type = 'NULL'; // allow everything
                        }
+
+                       if ( $type == 'password' || !empty( $paramSettings[self::PARAM_SENSITIVE] ) ) {
+                               $this->getMain()->markParamsSensitive( $encParamName );
+                       }
                }
 
                if ( $type == 'boolean' ) {
@@ -1326,7 +1346,7 @@ abstract class ApiBase extends ContextSource {
                }
 
                if ( !$allowMultiple && count( $valuesList ) != 1 ) {
-                       // Bug 33482 - Allow entries with | in them for non-multiple values
+                       // T35482 - Allow entries with | in them for non-multiple values
                        if ( in_array( $value, $allowedValues, true ) ) {
                                return $value;
                        }
@@ -2028,6 +2048,7 @@ abstract class ApiBase extends ContextSource {
                        $params['token'] = [
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true,
+                               ApiBase::PARAM_SENSITIVE => true,
                                ApiBase::PARAM_HELP_MSG => [
                                        'api-help-param-token',
                                        $this->needsToken(),
index 58e3d1c..4d37af3 100644 (file)
@@ -46,7 +46,7 @@ class ApiBlock extends ApiBase {
 
                $this->requireOnlyOneParameter( $params, 'user', 'userid' );
 
-               # bug 15810: blocked admins should have limited access here
+               # T17810: blocked admins should have limited access here
                if ( $user->isBlocked() ) {
                        $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
                        if ( $status !== true ) {
@@ -69,7 +69,7 @@ class ApiBlock extends ApiBase {
                } else {
                        $target = User::newFromName( $params['user'] );
 
-                       // Bug 38633 - if the target is a user (not an IP address), but it
+                       // T40633 - 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() ) )
@@ -193,6 +193,6 @@ class ApiBlock extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Block';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Block';
        }
 }
index 4139019..3a78c13 100644 (file)
@@ -186,9 +186,9 @@ class ApiCSPReport extends ApiBase {
                        'method' => $method,
                        'user-agent' => $this->getRequest()->getHeader( 'user-agent' )
                ] );
-               // 500 so it shows up in browser's developer console.
+               // Return 400 on error for user agents to display, e.g. to the console.
                $this->dieWithError(
-                       [ 'apierror-csp-report', wfEscapeWikiText( $code ) ], 'cspreport-' . $code, [], 500
+                       [ 'apierror-csp-report', wfEscapeWikiText( $code ) ], 'cspreport-' . $code, [], 400
                );
        }
 
index c25920e..35c4e56 100644 (file)
@@ -93,6 +93,6 @@ class ApiChangeAuthenticationData extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Manage_authentication_data';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Manage_authentication_data';
        }
 }
index 3cc7a8a..480915e 100644 (file)
@@ -73,6 +73,7 @@ class ApiCheckToken extends ApiBase {
                        'token' => [
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true,
+                               ApiBase::PARAM_SENSITIVE => true,
                        ],
                        'maxtokenage' => [
                                ApiBase::PARAM_TYPE => 'integer',
index a5474b5..3b24630 100644 (file)
@@ -50,6 +50,6 @@ class ApiClearHasMsg extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:ClearHasMsg';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:ClearHasMsg';
        }
 }
index 3f5bc0c..0d512b3 100644 (file)
@@ -132,6 +132,6 @@ class ApiClientLogin extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Login';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Login';
        }
 }
index 50c24ae..99065c4 100644 (file)
@@ -218,6 +218,6 @@ class ApiDelete extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Delete';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Delete';
        }
 }
index b45be31..0b8156b 100644 (file)
@@ -611,6 +611,6 @@ class ApiEditPage extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Edit';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Edit';
        }
 }
index 8aff6f8..72c7c35 100644 (file)
@@ -114,6 +114,6 @@ class ApiEmailUser extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Email';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Email';
        }
 }
index c52b731..5484a78 100644 (file)
@@ -176,7 +176,8 @@ class ApiErrorFormatter {
                        } else {
                                $msg = new RawMessage( '$1' );
                                if ( !isset( $options['code'] ) ) {
-                                       $options['code'] = 'internal_api_error_' . get_class( $exception );
+                                       $class = preg_replace( '#^Wikimedia\\\Rdbms\\\#', '', get_class( $exception ) );
+                                       $options['code'] = 'internal_api_error_' . $class;
                                }
                        }
                        $params = [ wfEscapeWikiText( $exception->getMessage() ) ];
index 6f7cf65..e15d7da 100644 (file)
@@ -210,6 +210,6 @@ class ApiExpandTemplates extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Parsing_wikitext#expandtemplates';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Parsing_wikitext#expandtemplates';
        }
 }
index e0e50ed..0b04c8c 100644 (file)
@@ -57,7 +57,7 @@ class ApiFeedRecentChanges extends ApiBase {
 
                $this->getMain()->setCacheMode( 'public' );
                if ( !$this->getMain()->getParameter( 'smaxage' ) ) {
-                       // bug 63249: This page gets hit a lot, cache at least 15 seconds.
+                       // T65249: This page gets hit a lot, cache at least 15 seconds.
                        $this->getMain()->setCacheMaxAge( 15 );
                }
 
index 7f349bc..b7c5ccc 100644 (file)
@@ -307,6 +307,6 @@ class ApiFeedWatchlist extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Watchlist_feed';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watchlist_feed';
        }
 }
index 67f54a8..eb23bd6 100644 (file)
@@ -186,7 +186,7 @@ abstract class ApiFormatBase extends ApiBase {
 
                $this->getMain()->getRequest()->response()->header( "Content-Type: $mime; charset=utf-8" );
 
-               // Set X-Frame-Options API results (bug 39180)
+               // Set X-Frame-Options API results (T41180)
                $apiFrameOptions = $this->getConfig()->get( 'ApiFrameOptions' );
                if ( $apiFrameOptions ) {
                        $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $apiFrameOptions" );
@@ -269,7 +269,7 @@ abstract class ApiFormatBase extends ApiBase {
                                        false, FormatJson::ALL_OK
                                );
 
-                               // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+                               // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                                // Flash, but what it does isn't friendly for the API, so we need to
                                // work around it.
                                if ( preg_match( '/\<\s*cross-domain-policy\s*\>/i', $json ) ) {
@@ -330,7 +330,7 @@ abstract class ApiFormatBase extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Data_formats';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Data_formats';
        }
 
 }
index 8ebfe48..e5dafae 100644 (file)
@@ -91,7 +91,7 @@ class ApiFormatJson extends ApiFormatBase {
                $data = $this->getResult()->getResultData( null, $transform );
                $json = FormatJson::encode( $data, $this->getIsHtml(), $opt );
 
-               // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+               // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                // Flash, but what it does isn't friendly for the API, so we need to
                // work around it.
                if ( preg_match( '/\<\s*cross-domain-policy(?=\s|\>)/i', $json ) ) {
@@ -103,7 +103,7 @@ class ApiFormatJson extends ApiFormatBase {
                if ( isset( $params['callback'] ) ) {
                        $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $params['callback'] );
                        # Prepend a comment to try to avoid attacks against content
-                       # sniffers, such as bug 68187.
+                       # sniffers, such as T70187.
                        $this->printText( "/**/$callback($json)" );
                } else {
                        $this->printText( $json );
index a744f57..671f356 100644 (file)
@@ -60,7 +60,7 @@ class ApiFormatPhp extends ApiFormatBase {
                }
                $text = serialize( $this->getResult()->getResultData( null, $transforms ) );
 
-               // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+               // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                // Flash, but what it does isn't friendly for the API. There's nothing
                // we can do here that isn't actively broken in some manner, so let's
                // just be broken in a useful manner.
index e347a9f..7cd6d58 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use HtmlFormatter\HtmlFormatter;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class to output help for an API module
@@ -108,7 +109,7 @@ class ApiHelp extends ApiBase {
                }
                $out->setPageTitle( $context->msg( 'api-help-title' ) );
 
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                $cacheKey = null;
                if ( count( $modules ) == 1 && $modules[0] instanceof ApiMain &&
                        $options['recursivesubmodules'] && $context->getLanguage() === $wgContLang
@@ -116,7 +117,7 @@ class ApiHelp extends ApiBase {
                        $cacheHelpTimeout = $context->getConfig()->get( 'APICacheHelpTimeout' );
                        if ( $cacheHelpTimeout > 0 ) {
                                // Get help text from cache if present
-                               $cacheKey = wfMemcKey( 'apihelp', $modules[0]->getModulePath(),
+                               $cacheKey = $cache->makeKey( 'apihelp', $modules[0]->getModulePath(),
                                        (int)!empty( $options['toc'] ),
                                        str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) );
                                $cached = $cache->get( $cacheKey );
@@ -844,9 +845,9 @@ class ApiHelp extends ApiBase {
 
        public function getHelpUrls() {
                return [
-                       'https://www.mediawiki.org/wiki/API:Main_page',
-                       'https://www.mediawiki.org/wiki/API:FAQ',
-                       'https://www.mediawiki.org/wiki/API:Quick_start_guide',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:FAQ',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Quick_start_guide',
                ];
        }
 }
index bf5e4ce..b46f0b1 100644 (file)
@@ -171,7 +171,7 @@ class ApiImport extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Import';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Import';
        }
 }
 
index 9a21e76..f5c5dee 100644 (file)
@@ -124,6 +124,6 @@ class ApiLinkAccount extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Linkaccount';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Linkaccount';
        }
 }
index e017eda..398c8c7 100644 (file)
@@ -49,6 +49,23 @@ class ApiLogin extends ApiBase {
                }
        }
 
+       /**
+        * Format a message for the response
+        * @param Message|string|array $message
+        * @return string|array
+        */
+       private function formatMessage( $message ) {
+               $message = Message::newFromSpecifier( $message );
+               $errorFormatter = $this->getErrorFormatter();
+               if ( $errorFormatter instanceof ApiErrorFormatter_BackCompat ) {
+                       return ApiErrorFormatter::stripMarkup(
+                               $message->useDatabase( false )->inLanguage( 'en' )->text()
+                       );
+               } else {
+                       return $errorFormatter->formatMessage( $message );
+               }
+       }
+
        /**
         * Executes the log-in attempt using the parameters passed. If
         * the log-in succeeds, it attaches a cookie to the session
@@ -64,7 +81,7 @@ class ApiLogin extends ApiBase {
                if ( $this->lacksSameOriginSecurity() ) {
                        $this->getResult()->addValue( null, 'login', [
                                'result' => 'Aborted',
-                               'reason' => 'Cannot log in when the same-origin policy is not applied',
+                               'reason' => $this->formatMessage( 'api-login-fail-sameorigin' ),
                        ] );
 
                        return;
@@ -84,8 +101,10 @@ class ApiLogin extends ApiBase {
                if ( !$session->canSetUser() ) {
                        $this->getResult()->addValue( null, 'login', [
                                'result' => 'Aborted',
-                               'reason' => 'Cannot log in when using ' .
-                                       $session->getProvider()->describe( Language::factory( 'en' ) ),
+                               'reason' => $this->formatMessage( [
+                                       'api-login-fail-badsessionprovider',
+                                       $session->getProvider()->describe( $this->getErrorFormatter()->getLanguage() ),
+                               ] )
                        ] );
 
                        return;
@@ -190,25 +209,15 @@ class ApiLogin extends ApiBase {
                                break;
 
                        case 'Failed':
-                               $errorFormatter = $this->getErrorFormatter();
-                               if ( $errorFormatter instanceof ApiErrorFormatter_BackCompat ) {
-                                       $result['reason'] = ApiErrorFormatter::stripMarkup(
-                                               $message->useDatabase( false )->inLanguage( 'en' )->text()
-                                       );
-                               } else {
-                                       $result['reason'] = $errorFormatter->formatMessage( $message );
-                               }
+                               $result['reason'] = $this->formatMessage( $message );
                                break;
 
                        case 'Aborted':
-                               $result['reason'] = 'Authentication requires user interaction, ' .
-                                  'which is not supported by action=login.';
-                               if ( $this->getConfig()->get( 'EnableBotPasswords' ) ) {
-                                       $result['reason'] .= ' To be able to login with action=login, see [[Special:BotPasswords]].';
-                                       $result['reason'] .= ' To continue using main-account login, see action=clientlogin.';
-                               } else {
-                                       $result['reason'] .= ' To log in, see action=clientlogin.';
-                               }
+                               $result['reason'] = $this->formatMessage(
+                                       $this->getConfig()->get( 'EnableBotPasswords' )
+                                               ? 'api-login-fail-aborted'
+                                               : 'api-login-fail-aborted-nobotpw'
+                               );
                                break;
 
                        default:
@@ -250,6 +259,7 @@ class ApiLogin extends ApiBase {
                        'token' => [
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => false, // for BC
+                               ApiBase::PARAM_SENSITIVE => true,
                                ApiBase::PARAM_HELP_MSG => [ 'api-help-param-token', 'login' ],
                        ],
                ];
@@ -265,7 +275,7 @@ class ApiLogin extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Login';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Login';
        }
 
        /**
index d5c28f1..d56c096 100644 (file)
@@ -75,6 +75,6 @@ class ApiLogout extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Logout';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Logout';
        }
 }
index 9e00830..00f976e 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- *
- *
  * Created on Sep 4, 2006
  *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Timestamp\TimestampException;
+use Wikimedia\Rdbms\DBQueryError;
+use Wikimedia\Rdbms\DBError;
 
 /**
  * This is the main API class, used for both external and internal processing.
@@ -159,6 +161,7 @@ class ApiMain extends ApiBase {
        private $mCacheMode = 'private';
        private $mCacheControl = [];
        private $mParamsUsed = [];
+       private $mParamsSensitive = [];
 
        /** @var bool|null Cached return value from self::lacksSameOriginSecurity() */
        private $lacksSameOriginSecurity = null;
@@ -543,7 +546,7 @@ class ApiMain extends ApiBase {
                        $runTime = microtime( true ) - $t;
                        $this->logRequest( $runTime );
                        if ( $this->mModule->isWriteMode() && $this->getRequest()->wasPosted() ) {
-                               $this->getStats()->timing(
+                               MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
                                        'api.' . $this->mModule->getModuleName() . '.executeTiming', 1000 * $runTime
                                );
                        }
@@ -574,7 +577,7 @@ class ApiMain extends ApiBase {
         * @param Exception $e
         */
        protected function handleException( Exception $e ) {
-               // Bug 63145: Rollback any open database transactions
+               // T65145: Rollback any open database transactions
                if ( !( $e instanceof ApiUsageException || $e instanceof UsageException ) ) {
                        // UsageExceptions are intentional, so don't rollback if that's the case
                        try {
@@ -1041,7 +1044,8 @@ class ApiMain extends ApiBase {
                } else {
                        // Something is seriously wrong
                        $config = $this->getConfig();
-                       $code = 'internal_api_error_' . get_class( $e );
+                       $class = preg_replace( '#^Wikimedia\\\Rdbms\\\#', '', get_class( $e ) );
+                       $code = 'internal_api_error_' . $class;
                        if ( ( $e instanceof DBQueryError ) && !$config->get( 'ShowSQLErrors' ) ) {
                                $params = [ 'apierror-databaseerror', WebRequest::getRequestId() ];
                        } else {
@@ -1227,6 +1231,35 @@ class ApiMain extends ApiBase {
                return $module;
        }
 
+       /**
+        * @return array
+        */
+       private function getMaxLag() {
+               $dbLag = MediaWikiServices::getInstance()->getDBLoadBalancer()->getMaxLag();
+               $lagInfo = [
+                       'host' => $dbLag[0],
+                       'lag' => $dbLag[1],
+                       'type' => 'db'
+               ];
+
+               $jobQueueLagFactor = $this->getConfig()->get( 'JobQueueIncludeInMaxLagFactor' );
+               if ( $jobQueueLagFactor ) {
+                       // Turn total number of jobs into seconds by using the configured value
+                       $totalJobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
+                       $jobQueueLag = $totalJobs / (float)$jobQueueLagFactor;
+                       if ( $jobQueueLag > $lagInfo['lag'] ) {
+                               $lagInfo = [
+                                       'host' => wfHostname(), // XXX: Is there a better value that could be used?
+                                       'lag' => $jobQueueLag,
+                                       'type' => 'jobqueue',
+                                       'jobs' => $totalJobs,
+                               ];
+                       }
+               }
+
+               return $lagInfo;
+       }
+
        /**
         * Check the max lag if necessary
         * @param ApiBase $module Api module being used
@@ -1236,18 +1269,22 @@ class ApiMain extends ApiBase {
        protected function checkMaxLag( $module, $params ) {
                if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) {
                        $maxLag = $params['maxlag'];
-                       list( $host, $lag ) = wfGetLB()->getMaxLag();
-                       if ( $lag > $maxLag ) {
+                       $lagInfo = $this->getMaxLag();
+                       if ( $lagInfo['lag'] > $maxLag ) {
                                $response = $this->getRequest()->response();
 
                                $response->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
-                               $response->header( 'X-Database-Lag: ' . intval( $lag ) );
+                               $response->header( 'X-Database-Lag: ' . intval( $lagInfo['lag'] ) );
 
                                if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
-                                       $this->dieWithError( [ 'apierror-maxlag', $lag, $host ] );
+                                       $this->dieWithError(
+                                               [ 'apierror-maxlag', $lagInfo['lag'], $lagInfo['host'] ],
+                                               'maxlag',
+                                               $lagInfo
+                                       );
                                }
 
-                               $this->dieWithError( [ 'apierror-maxlag-generic', $lag ], 'maxlag' );
+                               $this->dieWithError( [ 'apierror-maxlag-generic', $lagInfo['lag'] ], 'maxlag', $lagInfo );
                        }
                }
 
@@ -1600,13 +1637,17 @@ class ApiMain extends ApiBase {
                        " {$logCtx['ip']} " .
                        "T={$logCtx['timeSpentBackend']}ms";
 
+               $sensitive = array_flip( $this->getSensitiveParams() );
                foreach ( $this->getParamsUsed() as $name ) {
                        $value = $request->getVal( $name );
                        if ( $value === null ) {
                                continue;
                        }
 
-                       if ( strlen( $value ) > 256 ) {
+                       if ( isset( $sensitive[$name] ) ) {
+                               $value = '[redacted]';
+                               $encValue = '[redacted]';
+                       } elseif ( strlen( $value ) > 256 ) {
                                $value = substr( $value, 0, 256 );
                                $encValue = $this->encodeRequestLogValue( $value ) . '[...]';
                        } else {
@@ -1656,6 +1697,24 @@ class ApiMain extends ApiBase {
                $this->mParamsUsed += array_fill_keys( (array)$params, true );
        }
 
+       /**
+        * Get the request parameters that should be considered sensitive
+        * @since 1.29
+        * @return array
+        */
+       protected function getSensitiveParams() {
+               return array_keys( $this->mParamsSensitive );
+       }
+
+       /**
+        * Mark parameters as sensitive
+        * @since 1.29
+        * @param string|string[] $params
+        */
+       public function markParamsSensitive( $params ) {
+               $this->mParamsSensitive += array_fill_keys( (array)$params, true );
+       }
+
        /**
         * Get a request value, and register the fact that it was used, for logging.
         * @param string $name
@@ -1668,7 +1727,7 @@ class ApiMain extends ApiBase {
                $ret = $this->getRequest()->getVal( $name );
                if ( $ret === null ) {
                        if ( $this->getRequest()->getArray( $name ) !== null ) {
-                               // See bug 10262 for why we don't just implode( '|', ... ) the
+                               // See T12262 for why we don't just implode( '|', ... ) the
                                // array.
                                $this->addWarning( [ 'apiwarn-unsupportedarray', $name ] );
                        }
index 3c08093..42de161 100644 (file)
@@ -125,6 +125,6 @@ class ApiManageTags extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Tag_management';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tag_management';
        }
 }
index 357698e..79e9909 100644 (file)
@@ -137,6 +137,6 @@ class ApiMergeHistory extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Mergehistory';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Mergehistory';
        }
 }
index ab7199f..1fb034f 100644 (file)
@@ -103,7 +103,7 @@ class ApiMove extends ApiBase {
                // a redirect to the new title. This is not safe, but what we did before was
                // even worse: we just determined whether a redirect should have been created,
                // and reported that it was created if it should have, without any checks.
-               // Also note that isRedirect() is unreliable because of bug 37209.
+               // Also note that isRedirect() is unreliable because of T39209.
                $r['redirectcreated'] = $fromTitle->exists();
 
                $r['moveoverredirect'] = $toTitleExists;
@@ -292,6 +292,6 @@ class ApiMove extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Move';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Move';
        }
 }
index e6fe27c..dc1b4e7 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\Database;
 
 /**
  * @ingroup API
@@ -309,7 +310,7 @@ class ApiOpenSearch extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Opensearch';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Opensearch';
        }
 
        /**
index 466d186..5b0d86a 100644 (file)
@@ -169,7 +169,7 @@ class ApiOptions extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Options';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Options';
        }
 
        protected function getExamplesMessages() {
index d42e306..599b3de 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * This class contains a list of pages that the client has requested.
@@ -64,10 +66,12 @@ class ApiPageSet extends ApiBase {
        private $mMissingPageIDs = [];
        private $mRedirectTitles = [];
        private $mSpecialTitles = [];
+       private $mAllSpecials = []; // separate from mAllPages to avoid breaking getAllTitlesByNamespace()
        private $mNormalizedTitles = [];
        private $mInterwikiTitles = [];
        /** @var Title[] */
        private $mPendingRedirectIDs = [];
+       private $mPendingRedirectSpecialPages = []; // [dbkey] => [ Title $from, Title $to ]
        private $mResolvedRedirectTitles = [];
        private $mConvertedTitles = [];
        private $mGoodRevIDs = [];
@@ -810,6 +814,8 @@ class ApiPageSet extends ApiBase {
                // Get validated and normalized title objects
                $linkBatch = $this->processTitlesArray( $titles );
                if ( $linkBatch->isEmpty() ) {
+                       // There might be special-page redirects
+                       $this->resolvePendingRedirects();
                        return;
                }
 
@@ -1030,7 +1036,7 @@ class ApiPageSet extends ApiBase {
 
                        // Repeat until all redirects have been resolved
                        // The infinite loop is prevented by keeping all known pages in $this->mAllPages
-                       while ( $this->mPendingRedirectIDs ) {
+                       while ( $this->mPendingRedirectIDs || $this->mPendingRedirectSpecialPages ) {
                                // Resolve redirects by querying the pagelinks table, and repeat the process
                                // Create a new linkBatch object for the next pass
                                $linkBatch = $this->getRedirectTargets();
@@ -1061,58 +1067,82 @@ class ApiPageSet extends ApiBase {
         * @return LinkBatch
         */
        private function getRedirectTargets() {
-               $lb = new LinkBatch();
+               $titlesToResolve = [];
                $db = $this->getDB();
 
-               $res = $db->select(
-                       'redirect',
-                       [
-                               'rd_from',
-                               'rd_namespace',
-                               'rd_fragment',
-                               'rd_interwiki',
-                               'rd_title'
-                       ], [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ],
-                       __METHOD__
-               );
-               foreach ( $res as $row ) {
-                       $rdfrom = intval( $row->rd_from );
-                       $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
-                       $to = Title::makeTitle(
-                               $row->rd_namespace,
-                               $row->rd_title,
-                               $row->rd_fragment,
-                               $row->rd_interwiki
-                       );
-                       $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom];
-                       unset( $this->mPendingRedirectIDs[$rdfrom] );
-                       if ( $to->isExternal() ) {
-                               $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
-                       } elseif ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
-                               $lb->add( $row->rd_namespace, $row->rd_title );
+               if ( $this->mPendingRedirectIDs ) {
+                       $res = $db->select(
+                               'redirect',
+                               [
+                                       'rd_from',
+                                       'rd_namespace',
+                                       'rd_fragment',
+                                       'rd_interwiki',
+                                       'rd_title'
+                               ], [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ],
+                                       __METHOD__
+                               );
+                       foreach ( $res as $row ) {
+                               $rdfrom = intval( $row->rd_from );
+                               $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
+                               $to = Title::makeTitle(
+                                       $row->rd_namespace,
+                                       $row->rd_title,
+                                       $row->rd_fragment,
+                                       $row->rd_interwiki
+                               );
+                               $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom];
+                               unset( $this->mPendingRedirectIDs[$rdfrom] );
+                               if ( $to->isExternal() ) {
+                                       $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
+                               } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
+                                       $titlesToResolve[] = $to;
+                               }
+                               $this->mRedirectTitles[$from] = $to;
+                       }
+
+                       if ( $this->mPendingRedirectIDs ) {
+                               // We found pages that aren't in the redirect table
+                               // Add them
+                               foreach ( $this->mPendingRedirectIDs as $id => $title ) {
+                                       $page = WikiPage::factory( $title );
+                                       $rt = $page->insertRedirect();
+                                       if ( !$rt ) {
+                                               // What the hell. Let's just ignore this
+                                               continue;
+                                       }
+                                       if ( $rt->isExternal() ) {
+                                               $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki();
+                                       } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) {
+                                               $titlesToResolve[] = $rt;
+                                       }
+                                       $from = $title->getPrefixedText();
+                                       $this->mResolvedRedirectTitles[$from] = $title;
+                                       $this->mRedirectTitles[$from] = $rt;
+                                       unset( $this->mPendingRedirectIDs[$id] );
+                               }
                        }
-                       $this->mRedirectTitles[$from] = $to;
                }
 
-               if ( $this->mPendingRedirectIDs ) {
-                       // We found pages that aren't in the redirect table
-                       // Add them
-                       foreach ( $this->mPendingRedirectIDs as $id => $title ) {
-                               $page = WikiPage::factory( $title );
-                               $rt = $page->insertRedirect();
-                               if ( !$rt ) {
-                                       // What the hell. Let's just ignore this
-                                       continue;
+               if ( $this->mPendingRedirectSpecialPages ) {
+                       foreach ( $this->mPendingRedirectSpecialPages as $key => list( $from, $to ) ) {
+                               $fromKey = $from->getPrefixedText();
+                               $this->mResolvedRedirectTitles[$fromKey] = $from;
+                               $this->mRedirectTitles[$fromKey] = $to;
+                               if ( $to->isExternal() ) {
+                                       $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
+                               } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
+                                       $titlesToResolve[] = $to;
                                }
-                               $lb->addObj( $rt );
-                               $from = $title->getPrefixedText();
-                               $this->mResolvedRedirectTitles[$from] = $title;
-                               $this->mRedirectTitles[$from] = $rt;
-                               unset( $this->mPendingRedirectIDs[$id] );
                        }
+                       $this->mPendingRedirectSpecialPages = [];
+
+                       // Set private caching since we don't know what criteria the
+                       // special pages used to decide on these redirects.
+                       $this->mCacheMode = 'private';
                }
 
-               return $lb;
+               return $this->processTitlesArray( $titlesToResolve );
        }
 
        /**
@@ -1151,12 +1181,14 @@ class ApiPageSet extends ApiBase {
                                        $titleObj = Title::newFromTextThrow( $title, $this->mDefaultNamespace );
                                } catch ( MalformedTitleException $ex ) {
                                        // Handle invalid titles gracefully
-                                       $this->mAllPages[0][$title] = $this->mFakePageId;
-                                       $this->mInvalidTitles[$this->mFakePageId] = [
-                                               'title' => $title,
-                                               'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
-                                       ];
-                                       $this->mFakePageId--;
+                                       if ( !isset( $this->mAllPages[0][$title] ) ) {
+                                               $this->mAllPages[0][$title] = $this->mFakePageId;
+                                               $this->mInvalidTitles[$this->mFakePageId] = [
+                                                       'title' => $title,
+                                                       'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
+                                               ];
+                                               $this->mFakePageId--;
+                                       }
                                        continue; // There's nothing else we can do
                                }
                        } else {
@@ -1184,8 +1216,31 @@ class ApiPageSet extends ApiBase {
                                if ( $titleObj->getNamespace() < 0 ) {
                                        // Handle Special and Media pages
                                        $titleObj = $titleObj->fixSpecialName();
-                                       $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
-                                       $this->mFakePageId--;
+                                       $ns = $titleObj->getNamespace();
+                                       $dbkey = $titleObj->getDBkey();
+                                       if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) {
+                                               $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId;
+                                               $target = null;
+                                               if ( $ns === NS_SPECIAL && $this->mResolveRedirects ) {
+                                                       $special = SpecialPageFactory::getPage( $dbkey );
+                                                       if ( $special instanceof RedirectSpecialArticle ) {
+                                                               // Only RedirectSpecialArticle is intended to redirect to an article, other kinds of
+                                                               // RedirectSpecialPage are probably applying weird URL parameters we don't want to handle.
+                                                               $context = new DerivativeContext( $this );
+                                                               $context->setTitle( $titleObj );
+                                                               $context->setRequest( new FauxRequest );
+                                                               $special->setContext( $context );
+                                                               list( /* $alias */, $subpage ) = SpecialPageFactory::resolveAlias( $dbkey );
+                                                               $target = $special->getRedirect( $subpage );
+                                                       }
+                                               }
+                                               if ( $target ) {
+                                                       $this->mPendingRedirectSpecialPages[$dbkey] = [ $titleObj, $target ];
+                                               } else {
+                                                       $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
+                                                       $this->mFakePageId--;
+                                               }
+                                       }
                                } else {
                                        // Regular page
                                        $linkBatch->addObj( $titleObj );
@@ -1301,7 +1356,7 @@ class ApiPageSet extends ApiBase {
                        }
                }
                foreach ( $this->mGeneratorData as $ns => $dbkeys ) {
-                       if ( $ns === -1 ) {
+                       if ( $ns === NS_SPECIAL ) {
                                $pages = [];
                                foreach ( $this->mSpecialTitles as $id => $title ) {
                                        $pages[$title->getDBkey()] = $id;
@@ -1371,7 +1426,7 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Get the database connection (read-only)
-        * @return Database
+        * @return IDatabase
         */
        protected function getDB() {
                return $this->mDbSource->getDB();
@@ -1384,7 +1439,7 @@ class ApiPageSet extends ApiBase {
         * @return array
         */
        private static function getPositiveIntegers( $array ) {
-               // bug 25734 API: possible issue with revids validation
+               // T27734 API: possible issue with revids validation
                // It seems with a load of revision rows, MySQL gets upset
                // Remove any < 0 integers, as they can't be valid
                foreach ( $array as $i => $int ) {
index 67983e7..39b5897 100644 (file)
@@ -543,6 +543,6 @@ class ApiParamInfo extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Parameter_information';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Parameter_information';
        }
 }
index 287ffb7..91e49ab 100644 (file)
@@ -22,6 +22,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @ingroup API
  */
@@ -278,6 +280,54 @@ class ApiParse extends ApiBase {
                $result_array['title'] = $titleObj->getPrefixedText();
                $result_array['pageid'] = $pageid ?: $pageObj->getId();
 
+               if ( $params['disabletoc'] ) {
+                       $p_result->setTOCEnabled( false );
+               }
+
+               if ( isset( $params['useskin'] ) ) {
+                       $factory = MediaWikiServices::getInstance()->getSkinFactory();
+                       $skin = $factory->makeSkin( Skin::normalizeKey( $params['useskin'] ) );
+               } else {
+                       $skin = null;
+               }
+
+               $outputPage = null;
+               if ( $skin || isset( $prop['headhtml'] ) || isset( $prop['categorieshtml'] ) ) {
+                       // Enabling the skin via 'useskin', 'headhtml', or 'categorieshtml'
+                       // gets OutputPage and Skin involved, which (among others) applies
+                       // these hooks:
+                       // - ParserOutputHooks
+                       // - Hook: LanguageLinks
+                       // - Hook: OutputPageParserOutput
+                       // - Hook: OutputPageMakeCategoryLinks
+                       $context = new DerivativeContext( $this->getContext() );
+                       $context->setTitle( $titleObj );
+                       $context->setWikiPage( $pageObj );
+
+                       if ( $skin ) {
+                               // Use the skin specified by 'useskin'
+                               $context->setSkin( $skin );
+                               // Context clones the skin, refetch to stay in sync. (T166022)
+                               $skin = $context->getSkin();
+                       } else {
+                               // Make sure the context's skin refers to the context. Without this,
+                               // $outputPage->getSkin()->getOutput() !== $outputPage which
+                               // confuses some of the output.
+                               $context->setSkin( $context->getSkin() );
+                       }
+
+                       $outputPage = new OutputPage( $context );
+                       $outputPage->addParserOutputMetadata( $p_result );
+                       $context->setOutput( $outputPage );
+
+                       if ( $skin ) {
+                               // Based on OutputPage::output()
+                               foreach ( $skin->getDefaultModules() as $group ) {
+                                       $outputPage->addModules( $group );
+                               }
+                       }
+               }
+
                if ( !is_null( $oldid ) ) {
                        $result_array['revid'] = intval( $oldid );
                }
@@ -286,10 +336,6 @@ class ApiParse extends ApiBase {
                        $result_array['redirects'] = $redirValues;
                }
 
-               if ( $params['disabletoc'] ) {
-                       $p_result->setTOCEnabled( false );
-               }
-
                if ( isset( $prop['text'] ) ) {
                        $result_array['text'] = $p_result->getText();
                        $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'text';
@@ -303,26 +349,26 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['langlinks'] ) ) {
-                       $langlinks = $p_result->getLanguageLinks();
-
-                       if ( $params['effectivelanglinks'] ) {
-                               // Link flags are ignored for now, but may in the future be
-                               // included in the result.
-                               $linkFlags = [];
-                               Hooks::run( 'LanguageLinks', [ $titleObj, &$langlinks, &$linkFlags ] );
+                       if ( $skin ) {
+                               $langlinks = $outputPage->getLanguageLinks();
+                       } else {
+                               $langlinks = $p_result->getLanguageLinks();
+                               // The deprecated 'effectivelanglinks' option depredates OutputPage
+                               // support via 'useskin'. If not already applied, then run just this
+                               // one hook of OutputPage::addParserOutputMetadata here.
+                               if ( $params['effectivelanglinks'] ) {
+                                       $linkFlags = [];
+                                       Hooks::run( 'LanguageLinks', [ $titleObj, &$langlinks, &$linkFlags ] );
+                               }
                        }
-               } else {
-                       $langlinks = false;
-               }
 
-               if ( isset( $prop['langlinks'] ) ) {
                        $result_array['langlinks'] = $this->formatLangLinks( $langlinks );
                }
                if ( isset( $prop['categories'] ) ) {
                        $result_array['categories'] = $this->formatCategoryLinks( $p_result->getCategories() );
                }
                if ( isset( $prop['categorieshtml'] ) ) {
-                       $result_array['categorieshtml'] = $this->categoriesHtml( $p_result->getCategories() );
+                       $result_array['categorieshtml'] = $outputPage->getSkin()->getCategories();
                        $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'categorieshtml';
                }
                if ( isset( $prop['links'] ) ) {
@@ -340,6 +386,9 @@ class ApiParse extends ApiBase {
                if ( isset( $prop['sections'] ) ) {
                        $result_array['sections'] = $p_result->getSections();
                }
+               if ( isset( $prop['parsewarnings'] ) ) {
+                       $result_array['parsewarnings'] = $p_result->getWarnings();
+               }
 
                if ( isset( $prop['displaytitle'] ) ) {
                        $result_array['displaytitle'] = $p_result->getDisplayTitle() ?:
@@ -347,38 +396,42 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['headitems'] ) ) {
-                       $result_array['headitems'] = $this->formatHeadItems( $p_result->getHeadItems() );
+                       if ( $skin ) {
+                               $result_array['headitems'] = $this->formatHeadItems( $outputPage->getHeadItemsArray() );
+                       } else {
+                               $result_array['headitems'] = $this->formatHeadItems( $p_result->getHeadItems() );
+                       }
                        $this->addDeprecation( 'apiwarn-deprecation-parse-headitems', 'action=parse&prop=headitems' );
                }
 
                if ( isset( $prop['headhtml'] ) ) {
-                       $context = new DerivativeContext( $this->getContext() );
-                       $context->setTitle( $titleObj );
-                       $context->setWikiPage( $pageObj );
-
-                       // We need an OutputPage tied to $context, not to the
-                       // RequestContext at the root of the stack.
-                       $output = new OutputPage( $context );
-                       $output->addParserOutputMetadata( $p_result );
-
-                       $result_array['headhtml'] = $output->headElement( $context->getSkin() );
+                       $result_array['headhtml'] = $outputPage->headElement( $context->getSkin() );
                        $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'headhtml';
                }
 
                if ( isset( $prop['modules'] ) ) {
-                       $result_array['modules'] = array_values( array_unique( $p_result->getModules() ) );
-                       $result_array['modulescripts'] = array_values( array_unique( $p_result->getModuleScripts() ) );
-                       $result_array['modulestyles'] = array_values( array_unique( $p_result->getModuleStyles() ) );
+                       if ( $skin ) {
+                               $result_array['modules'] = $outputPage->getModules();
+                               $result_array['modulescripts'] = $outputPage->getModuleScripts();
+                               $result_array['modulestyles'] = $outputPage->getModuleStyles();
+                       } else {
+                               $result_array['modules'] = array_values( array_unique( $p_result->getModules() ) );
+                               $result_array['modulescripts'] = array_values( array_unique( $p_result->getModuleScripts() ) );
+                               $result_array['modulestyles'] = array_values( array_unique( $p_result->getModuleStyles() ) );
+                       }
                }
 
                if ( isset( $prop['jsconfigvars'] ) ) {
-                       $result_array['jsconfigvars'] =
-                               ApiResult::addMetadataToResultVars( $p_result->getJsConfigVars() );
+                       $jsconfigvars = $skin ? $outputPage->getJsConfigVars() : $p_result->getJsConfigVars();
+                       $result_array['jsconfigvars'] = ApiResult::addMetadataToResultVars( $jsconfigvars );
                }
 
                if ( isset( $prop['encodedjsconfigvars'] ) ) {
+                       $jsconfigvars = $skin ? $outputPage->getJsConfigVars() : $p_result->getJsConfigVars();
                        $result_array['encodedjsconfigvars'] = FormatJson::encode(
-                               $p_result->getJsConfigVars(), false, FormatJson::ALL_OK
+                               $jsconfigvars,
+                               false,
+                               FormatJson::ALL_OK
                        );
                        $result_array[ApiResult::META_SUBELEMENTS][] = 'encodedjsconfigvars';
                }
@@ -389,7 +442,11 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['indicators'] ) ) {
-                       $result_array['indicators'] = (array)$p_result->getIndicators();
+                       if ( $skin ) {
+                               $result_array['indicators'] = (array)$outputPage->getIndicators();
+                       } else {
+                               $result_array['indicators'] = (array)$p_result->getIndicators();
+                       }
                        ApiResult::setArrayType( $result_array['indicators'], 'BCkvp', 'name' );
                }
 
@@ -452,6 +509,7 @@ class ApiParse extends ApiBase {
                        'modulestyles' => 'm',
                        'properties' => 'pp',
                        'limitreportdata' => 'lr',
+                       'parsewarnings' => 'pw'
                ];
                $this->setIndexedTagNames( $result_array, $result_mapping );
                $result->addValue( null, $this->getModuleName(), $result_array );
@@ -474,6 +532,9 @@ class ApiParse extends ApiBase {
                if ( $params['disabletidy'] ) {
                        $popts->setTidy( false );
                }
+               $popts->setWrapOutputClass(
+                       $params['wrapoutputclass'] === '' ? false : $params['wrapoutputclass']
+               );
 
                $reset = null;
                $suppressCache = false;
@@ -655,13 +716,6 @@ class ApiParse extends ApiBase {
                return $result;
        }
 
-       private function categoriesHtml( $categories ) {
-               $context = $this->getContext();
-               $context->getOutput()->addCategoryLinks( $categories );
-
-               return $context->getSkin()->getCategories();
-       }
-
        private function formatLinks( $links ) {
                $result = [];
                foreach ( $links as $ns => $nslinks ) {
@@ -751,7 +805,8 @@ class ApiParse extends ApiBase {
                        ],
                        'prop' => [
                                ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|' .
-                                       'images|externallinks|sections|revid|displaytitle|iwlinks|properties',
+                                       'images|externallinks|sections|revid|displaytitle|iwlinks|' .
+                                       'properties|parsewarnings',
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => [
                                        'text',
@@ -777,14 +832,19 @@ class ApiParse extends ApiBase {
                                        'limitreportdata',
                                        'limitreporthtml',
                                        'parsetree',
+                                       'parsewarnings'
                                ],
                                ApiBase::PARAM_HELP_MSG_PER_VALUE => [
                                        'parsetree' => [ 'apihelp-parse-paramvalue-prop-parsetree', CONTENT_MODEL_WIKITEXT ],
                                ],
                        ],
+                       'wrapoutputclass' => 'mw-parser-output',
                        'pst' => false,
                        'onlypst' => false,
-                       'effectivelanglinks' => false,
+                       'effectivelanglinks' => [
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ],
                        'section' => null,
                        'sectiontitle' => [
                                ApiBase::PARAM_TYPE => 'string',
@@ -806,6 +866,9 @@ class ApiParse extends ApiBase {
                        'preview' => false,
                        'sectionpreview' => false,
                        'disabletoc' => false,
+                       'useskin' => [
+                               ApiBase::PARAM_TYPE => array_keys( Skin::getAllowedSkins() ),
+                       ],
                        'contentformat' => [
                                ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
                        ],
@@ -829,6 +892,6 @@ class ApiParse extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Parsing_wikitext#parse';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Parsing_wikitext#parse';
        }
 }
index c33542f..06e8ae2 100644 (file)
@@ -112,6 +112,6 @@ class ApiPatrol extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Patrol';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Patrol';
        }
 }
index c74f890..1be4b10 100644 (file)
@@ -199,6 +199,6 @@ class ApiProtect extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Protect';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Protect';
        }
 }
index 3124638..83227a2 100644 (file)
@@ -56,7 +56,7 @@ class ApiPurge extends ApiBase {
                        $page = WikiPage::factory( $title );
                        if ( !$user->pingLimiter( 'purge' ) ) {
                                // Directly purge and skip the UI part of purge()
-                               $page->doPurge( WikiPage::PURGE_ALL );
+                               $page->doPurge();
                                $r['purged'] = true;
                        } else {
                                $this->addWarning( 'apierror-ratelimited' );
@@ -176,6 +176,6 @@ class ApiPurge extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Purge';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Purge';
        }
 }
index 8196cfa..e6f3fc4 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * This is the main query class. It behaves similar to ApiMain: based on the
  * parameters given, it will create a list of titles to work on (an ApiPageSet
@@ -168,7 +170,7 @@ class ApiQuery extends ApiBase {
         * @param string $name Name to assign to the database connection
         * @param int $db One of the DB_* constants
         * @param array $groups Query groups
-        * @return Database
+        * @return IDatabase
         */
        public function getNamedDB( $name, $db, $groups ) {
                if ( !array_key_exists( $name, $this->mNamedDB ) ) {
@@ -536,10 +538,10 @@ class ApiQuery extends ApiBase {
 
        public function getHelpUrls() {
                return [
-                       'https://www.mediawiki.org/wiki/API:Query',
-                       'https://www.mediawiki.org/wiki/API:Meta',
-                       'https://www.mediawiki.org/wiki/API:Properties',
-                       'https://www.mediawiki.org/wiki/API:Lists',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Query',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Meta',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Properties',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Lists',
                ];
        }
 }
index 614b06c..aa89158 100644 (file)
@@ -200,6 +200,6 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allcategories';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allcategories';
        }
 }
index b09b977..5682cc2 100644 (file)
@@ -230,7 +230,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        // (shouldn't be able to get here without 'deletedhistory', but
                        // check it again just in case)
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
@@ -455,6 +455,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Alldeletedrevisions';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Alldeletedrevisions';
        }
 }
index ef6bb6a..250bee6 100644 (file)
@@ -26,6 +26,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Query module to enumerate all available pages.
  *
@@ -85,6 +87,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                $db = $this->getDB();
 
                $params = $this->extractRequestParams();
+               $userId = !is_null( $params['user'] ) ? User::idFromName( $params['user'] ) : null;
 
                // Table and return fields
                $this->addTables( 'image' );
@@ -189,7 +192,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
                        // Image filters
                        if ( !is_null( $params['user'] ) ) {
-                               $this->addWhereFld( 'img_user_text', $params['user'] );
+                               if ( $userId ) {
+                                       $this->addWhereFld( 'img_user', $userId );
+                               } else {
+                                       $this->addWhereFld( 'img_user_text', $params['user'] );
+                               }
                        }
                        if ( $params['filterbots'] != 'all' ) {
                                $this->addTables( 'user_groups' );
@@ -198,9 +205,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                        [
                                                'ug_group' => User::getGroupsWithPermission( 'bot' ),
                                                'ug_user = img_user',
-                                               $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
-                                                       '1' :
-                                                       'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
+                                               'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
                                        ]
                                ] ] );
                                $groupCond = ( $params['filterbots'] == 'nobots' ? 'NULL' : 'NOT NULL' );
@@ -269,7 +274,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                if ( $params['sort'] == 'timestamp' ) {
                        $this->addOption( 'ORDER BY', 'img_timestamp' . $sortFlag );
                        if ( !is_null( $params['user'] ) ) {
-                               $this->addOption( 'USE INDEX', [ 'image' => 'img_usertext_timestamp' ] );
+                               if ( $userId ) {
+                                       $this->addOption( 'USE INDEX', [ 'image' => 'img_user_timestamp' ] );
+                               } else {
+                                       $this->addOption( 'USE INDEX', [ 'image' => 'img_usertext_timestamp' ] );
+                               }
                        } else {
                                $this->addOption( 'USE INDEX', [ 'image' => 'img_timestamp' ] );
                        }
@@ -417,6 +426,6 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allimages';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allimages';
        }
 }
index 3b24e37..9d6bf46 100644 (file)
@@ -308,6 +308,6 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                $name = ucfirst( $this->getModuleName() );
 
-               return "https://www.mediawiki.org/wiki/API:{$name}";
+               return "https://www.mediawiki.org/wiki/Special:MyLanguage/API:{$name}";
        }
 }
index 244effc..271d281 100644 (file)
@@ -256,6 +256,6 @@ class ApiQueryAllMessages extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allmessages';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allmessages';
        }
 }
index 7460bd5..315def0 100644 (file)
@@ -76,10 +76,13 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        $this->addWhere( "page_title $op= $cont_from" );
                }
 
-               if ( $params['filterredir'] == 'redirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 1 );
-               } elseif ( $params['filterredir'] == 'nonredirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 0 );
+               $miserMode = $this->getConfig()->get( 'MiserMode' );
+               if ( !$miserMode ) {
+                       if ( $params['filterredir'] == 'redirects' ) {
+                               $this->addWhereFld( 'page_is_redirect', 1 );
+                       } elseif ( $params['filterredir'] == 'nonredirects' ) {
+                               $this->addWhereFld( 'page_is_redirect', 0 );
+                       }
                }
 
                $this->addWhereFld( 'page_namespace', $params['namespace'] );
@@ -108,6 +111,18 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        $selectFields = $resultPageSet->getPageTableFields();
                }
 
+               $miserModeFilterRedirValue = null;
+               $miserModeFilterRedir = $miserMode && $params['filterredir'] !== 'all';
+               if ( $miserModeFilterRedir ) {
+                       $selectFields[] = 'page_is_redirect';
+
+                       if ( $params['filterredir'] == 'redirects' ) {
+                               $miserModeFilterRedirValue = 1;
+                       } elseif ( $params['filterredir'] == 'nonredirects' ) {
+                               $miserModeFilterRedirValue = 0;
+                       }
+               }
+
                $this->addFields( $selectFields );
                $forceNameTitleIndex = true;
                if ( isset( $params['minsize'] ) ) {
@@ -219,6 +234,11 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                break;
                        }
 
+                       if ( $miserModeFilterRedir && (int)$row->page_is_redirect !== $miserModeFilterRedirValue ) {
+                               // Filter implemented in PHP due to being in Miser Mode
+                               continue;
+                       }
+
                        if ( is_null( $resultPageSet ) ) {
                                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
                                $vals = [
@@ -242,7 +262,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               return [
+               $ret = [
                        'from' => null,
                        'continue' => [
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
@@ -314,6 +334,12 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_DFLT => 'all'
                        ],
                ];
+
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
+                       $ret['filterredir'][ApiBase::PARAM_HELP_MSG_APPEND] = [ 'api-help-param-limited-in-miser-mode' ];
+               }
+
+               return $ret;
        }
 
        protected function getExamplesMessages() {
@@ -329,6 +355,6 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allpages';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allpages';
        }
 }
index b64b2c8..20746c9 100644 (file)
@@ -131,7 +131,7 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( $params['user'] !== null || $params['excludeuser'] !== null ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                $bitmask = Revision::DELETED_USER;
                        } elseif ( !$this->getUser()->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
@@ -290,6 +290,6 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allrevisions';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allrevisions';
        }
 }
index 136f60e..fd95e17 100644 (file)
@@ -122,9 +122,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                        [
                                                'ug1.ug_user=user_id',
                                                'ug1.ug_group' => $params['group'],
-                                               $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
-                                                       '1' :
-                                                       'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
+                                               'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
                                        ]
                                ]
                        ] );
@@ -147,9 +145,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $this->addJoinConds( [ 'ug1' => [ 'LEFT OUTER JOIN',
                                array_merge( [
                                        'ug1.ug_user=user_id',
-                                       $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
-                                               '1' :
-                                               'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
+                                       'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
                                ], $exclude )
                        ] ] );
                        $this->addWhere( 'ug1.ug_user IS NULL' );
@@ -165,9 +161,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $this->addFields( [ 'groups' =>
                                $db->buildGroupConcatField( '|', 'user_groups', 'ug_group', [
                                        'ug_user=user_id',
-                                       $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
-                                               '1' :
-                                               'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
+                                       'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
                                ] )
                        ] );
                }
@@ -186,7 +180,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                ],
                        ] ] );
 
-                       // Actually count the actions using a subquery (bug 64505 and bug 64507)
+                       // Actually count the actions using a subquery (T66505 and T66507)
                        $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $activeUserSeconds );
                        $this->addFields( [
                                'recentactions' => '(' . $db->selectSQLText(
@@ -395,6 +389,6 @@ class ApiQueryAllUsers extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allusers';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allusers';
        }
 }
index 661ec5a..c775942 100644 (file)
@@ -127,6 +127,6 @@ class ApiQueryAuthManagerInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Authmanagerinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Authmanagerinfo';
        }
 }
index 613589e..56cbaac 100644 (file)
@@ -59,19 +59,19 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        'code' => 'bl',
                        'prefix' => 'pl',
                        'linktbl' => 'pagelinks',
-                       'helpurl' => 'https://www.mediawiki.org/wiki/API:Backlinks',
+                       'helpurl' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Backlinks',
                ],
                'embeddedin' => [
                        'code' => 'ei',
                        'prefix' => 'tl',
                        'linktbl' => 'templatelinks',
-                       'helpurl' => 'https://www.mediawiki.org/wiki/API:Embeddedin',
+                       'helpurl' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Embeddedin',
                ],
                'imageusage' => [
                        'code' => 'iu',
                        'prefix' => 'il',
                        'linktbl' => 'imagelinks',
-                       'helpurl' => 'https://www.mediawiki.org/wiki/API:Imageusage',
+                       'helpurl' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Imageusage',
                ]
        ];
 
@@ -152,7 +152,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                if ( $this->params['filterredir'] == 'redirects' ) {
                        $this->addWhereFld( 'page_is_redirect', 1 );
                } elseif ( $this->params['filterredir'] == 'nonredirects' && !$this->redirect ) {
-                       // bug 22245 - Check for !redirect, as filtering nonredirects, when
+                       // T24245 - Check for !redirect, as filtering nonredirects, when
                        // getting what links to them is contradictory
                        $this->addWhereFld( 'page_is_redirect', 0 );
                }
index 4ed7f52..00cbcd9 100644 (file)
@@ -432,6 +432,6 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
 
        public function getHelpUrls() {
                $name = ucfirst( $this->getModuleName() );
-               return "https://www.mediawiki.org/wiki/API:{$name}";
+               return "https://www.mediawiki.org/wiki/Special:MyLanguage/API:{$name}";
        }
 }
index 2d21865..baefbda 100644 (file)
@@ -24,6 +24,9 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * This is a base class for all Query modules.
  * It provides some common functionality such as constructing various SQL
@@ -103,7 +106,7 @@ abstract class ApiQueryBase extends ApiBase {
 
        /**
         * Get the Query database connection (read-only)
-        * @return Database
+        * @return IDatabase
         */
        protected function getDB() {
                if ( is_null( $this->mDb ) ) {
@@ -119,7 +122,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @param string $name Name to assign to the database connection
         * @param int $db One of the DB_* constants
         * @param array $groups Query groups
-        * @return Database
+        * @return IDatabase
         */
        public function selectNamedDB( $name, $db, $groups ) {
                $this->mDb = $this->getQuery()->getNamedDB( $name, $db, $groups );
index 0040860..076a09e 100644 (file)
@@ -335,6 +335,6 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Blocks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Blocks';
        }
 }
index f2498ca..c4428d5 100644 (file)
@@ -227,6 +227,6 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Categories';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Categories';
        }
 }
index 3416240..2a3bf38 100644 (file)
@@ -115,6 +115,6 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Categoryinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Categoryinfo';
        }
 }
index 3a8847c..c570ec9 100644 (file)
@@ -391,6 +391,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Categorymembers';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Categorymembers';
        }
 }
index 148e315..693d954 100644 (file)
@@ -163,9 +163,7 @@ class ApiQueryContributors extends ApiQueryBase {
                                [
                                        'ug_user=rev_user',
                                        'ug_group' => $limitGroups,
-                                       $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
-                                               '1' :
-                                               'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
+                                       'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() )
                                ]
                        ] ] );
                        $this->addWhereIf( 'ug_user IS NULL', $excludeGroups );
@@ -256,6 +254,6 @@ class ApiQueryContributors extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Contributors';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Contributors';
        }
 }
index d0b8214..90fd695 100644 (file)
@@ -123,7 +123,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        // (shouldn't be able to get here without 'deletedhistory', but
                        // check it again just in case)
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
@@ -288,6 +288,6 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Deletedrevisions';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Deletedrevisions';
        }
 }
index 6a259cd..b68a868 100644 (file)
@@ -203,7 +203,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                }
 
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
-                       // Paranoia: avoid brute force searches (bug 17342)
+                       // Paranoia: avoid brute force searches (T19342)
                        // (shouldn't be able to get here without 'deletedhistory', but
                        // check it again just in case)
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
@@ -250,7 +250,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                $this->addOption( 'LIMIT', $limit + 1 );
                $this->addOption(
                        'USE INDEX',
-                       [ 'archive' => ( $mode == 'user' ? 'usertext_timestamp' : 'name_title_timestamp' ) ]
+                       [ 'archive' => ( $mode == 'user' ? 'ar_usertext_timestamp' : 'name_title_timestamp' ) ]
                );
                if ( $mode == 'all' ) {
                        if ( $params['unique'] ) {
@@ -505,6 +505,6 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Deletedrevs';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Deletedrevs';
        }
 }
index 02b7883..2ebd6de 100644 (file)
@@ -189,6 +189,6 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Duplicatefiles';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Duplicatefiles';
        }
 }
index 9b05537..6c29b60 100644 (file)
@@ -230,6 +230,6 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Exturlusage';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Exturlusage';
        }
 }
index 8c9c887..71fd6d1 100644 (file)
@@ -134,6 +134,6 @@ class ApiQueryExternalLinks extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Extlinks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Extlinks';
        }
 }
index c491236..4589991 100644 (file)
@@ -111,6 +111,6 @@ class ApiQueryFileRepoInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Filerepoinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Filerepoinfo';
        }
 }
index 116dbb3..7383cba 100644 (file)
@@ -292,6 +292,6 @@ class ApiQueryFilearchive extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Filearchive';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Filearchive';
        }
 }
index 6e2fb67..a10ba16 100644 (file)
@@ -215,6 +215,6 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Iwbacklinks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Iwbacklinks';
        }
 }
index cfd990b..9313af3 100644 (file)
@@ -194,6 +194,6 @@ class ApiQueryIWLinks extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Iwlinks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Iwlinks';
        }
 }
index c9dae8d..b2664df 100644 (file)
@@ -509,7 +509,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                if ( $mto && !$mto->isError() ) {
                                        $vals['thumburl'] = wfExpandUrl( $mto->getUrl(), PROTO_CURRENT );
 
-                                       // bug 23834 - If the URL's are the same, we haven't resized it, so shouldn't give the wanted
+                                       // T25834 - If the URLs are the same, we haven't resized it, so shouldn't give the wanted
                                        // thumbnail sizes for the thumbnail actual size
                                        if ( $mto->getUrl() !== $file->getUrl() ) {
                                                $vals['thumbwidth'] = intval( $mto->getWidth() );
@@ -821,6 +821,6 @@ class ApiQueryImageInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Imageinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Imageinfo';
        }
 }
index ae6f5bf..0086c58 100644 (file)
@@ -172,6 +172,6 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Images';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Images';
        }
 }
index e789dd4..c2cdfe4 100644 (file)
@@ -946,6 +946,6 @@ class ApiQueryInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Info';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Info';
        }
 }
index 8d5b5f3..fd67d7c 100644 (file)
@@ -214,6 +214,6 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Langbacklinks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Langbacklinks';
        }
 }
index 55e3c85..df33d02 100644 (file)
@@ -190,6 +190,6 @@ class ApiQueryLangLinks extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Langlinks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Langlinks';
        }
 }
index 4556e29..29c0b74 100644 (file)
@@ -42,13 +42,13 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                                $this->table = 'pagelinks';
                                $this->prefix = 'pl';
                                $this->titlesParam = 'titles';
-                               $this->helpUrl = 'https://www.mediawiki.org/wiki/API:Links';
+                               $this->helpUrl = 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Links';
                                break;
                        case self::TEMPLATES:
                                $this->table = 'templatelinks';
                                $this->prefix = 'tl';
                                $this->titlesParam = 'templates';
-                               $this->helpUrl = 'https://www.mediawiki.org/wiki/API:Templates';
+                               $this->helpUrl = 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Templates';
                                break;
                        default:
                                ApiBase::dieDebug( __METHOD__, 'Unknown module name' );
index 4d84aad..df8a11e 100644 (file)
@@ -198,7 +198,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $this->addWhere( 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() ) );
                }
 
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                if ( $params['namespace'] !== null || !is_null( $title ) || !is_null( $user ) ) {
                        if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                $titleBits = LogPage::DELETED_ACTION;
@@ -467,6 +467,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Logevents';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Logevents';
        }
 }
index 1324f2f..457f6c6 100644 (file)
@@ -145,6 +145,6 @@ class ApiQueryMyStashedFiles extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:mystashedfiles';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:mystashedfiles';
        }
 }
index fc50b50..ff97668 100644 (file)
@@ -57,7 +57,11 @@ class ApiQueryPagePropNames extends ApiQueryBase {
                }
 
                $limit = $params['limit'];
-               $this->addOption( 'LIMIT', $limit + 1 );
+
+               // mysql has issues with limit in loose index T115825
+               if ( $this->getDB()->getType() !== 'mysql' ) {
+                       $this->addOption( 'LIMIT', $limit + 1 );
+               }
 
                $result = $this->getResult();
                $count = 0;
@@ -104,6 +108,6 @@ class ApiQueryPagePropNames extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Pagepropnames';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Pagepropnames';
        }
 }
index de1df34..e49dfbc 100644 (file)
@@ -120,6 +120,6 @@ class ApiQueryPageProps extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Pageprops';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Pageprops';
        }
 }
index f1f4d9a..e90356d 100644 (file)
@@ -173,6 +173,6 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Pageswithprop';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Pageswithprop';
        }
 }
index 3bf6d3f..5606f3c 100644 (file)
@@ -127,6 +127,6 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Prefixsearch';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Prefixsearch';
        }
 }
index 62b2e42..5f6510e 100644 (file)
@@ -234,6 +234,6 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Protectedtitles';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Protectedtitles';
        }
 }
index 908cdee..caa5f05 100644 (file)
@@ -166,6 +166,6 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Querypage';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Querypage';
        }
 }
index 00bd467..cc1fc89 100644 (file)
@@ -209,6 +209,6 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Random';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Random';
        }
 }
index 2c76e97..0dc01aa 100644 (file)
@@ -147,7 +147,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                /* Build our basic query. Namely, something along the lines of:
                 * SELECT * FROM recentchanges WHERE rc_timestamp > $start
-                *              AND rc_timestamp < $end AND rc_namespace = $namespace
+                *   AND rc_timestamp < $end AND rc_namespace = $namespace
                 */
                $this->addTables( 'recentchanges' );
                $this->addTimestampWhereRange( 'rc_timestamp', $params['dir'], $params['start'], $params['end'] );
@@ -320,7 +320,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
                                $bitmask = Revision::DELETED_USER;
@@ -699,6 +699,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Recentchanges';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Recentchanges';
        }
 }
index 48f6046..a4f0315 100644 (file)
@@ -218,10 +218,75 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                                );
                        }
 
-                       $this->addTimestampWhereRange( 'rev_timestamp', $params['dir'],
-                               $params['start'], $params['end'] );
-                       $this->addWhereRange( 'rev_id', $params['dir'],
-                               $params['startid'], $params['endid'] );
+                       // Convert startid/endid to timestamps (T163532)
+                       $revids = [];
+                       if ( $params['startid'] !== null ) {
+                               $revids[] = (int)$params['startid'];
+                       }
+                       if ( $params['endid'] !== null ) {
+                               $revids[] = (int)$params['endid'];
+                       }
+                       if ( $revids ) {
+                               $db = $this->getDB();
+                               $sql = $db->unionQueries( [
+                                       $db->selectSQLText(
+                                               'revision',
+                                               [ 'id' => 'rev_id', 'ts' => 'rev_timestamp' ],
+                                               [ 'rev_id' => $revids ],
+                                               __METHOD__
+                                       ),
+                                       $db->selectSQLText(
+                                               'archive',
+                                               [ 'id' => 'ar_rev_id', 'ts' => 'ar_timestamp' ],
+                                               [ 'ar_rev_id' => $revids ],
+                                               __METHOD__
+                                       ),
+                               ], false );
+                               $res = $db->query( $sql, __METHOD__ );
+                               foreach ( $res as $row ) {
+                                       if ( (int)$row->id === (int)$params['startid'] ) {
+                                               $params['start'] = $row->ts;
+                                       }
+                                       if ( (int)$row->id === (int)$params['endid'] ) {
+                                               $params['end'] = $row->ts;
+                                       }
+                               }
+                               if ( $params['startid'] !== null && $params['start'] === null ) {
+                                       $p = $this->encodeParamName( 'startid' );
+                                       $this->dieWithError( [ 'apierror-revisions-badid', $p ], "badid_$p" );
+                               }
+                               if ( $params['endid'] !== null && $params['end'] === null ) {
+                                       $p = $this->encodeParamName( 'endid' );
+                                       $this->dieWithError( [ 'apierror-revisions-badid', $p ], "badid_$p" );
+                               }
+
+                               if ( $params['start'] !== null ) {
+                                       $op = ( $params['dir'] === 'newer' ? '>' : '<' );
+                                       $ts = $db->addQuotes( $db->timestampOrNull( $params['start'] ) );
+                                       if ( $params['startid'] !== null ) {
+                                               $this->addWhere( "rev_timestamp $op $ts OR "
+                                                       . "rev_timestamp = $ts AND rev_id $op= " . intval( $params['startid'] ) );
+                                       } else {
+                                               $this->addWhere( "rev_timestamp $op= $ts" );
+                                       }
+                               }
+                               if ( $params['end'] !== null ) {
+                                       $op = ( $params['dir'] === 'newer' ? '<' : '>' ); // Yes, opposite of the above
+                                       $ts = $db->addQuotes( $db->timestampOrNull( $params['end'] ) );
+                                       if ( $params['endid'] !== null ) {
+                                               $this->addWhere( "rev_timestamp $op $ts OR "
+                                                       . "rev_timestamp = $ts AND rev_id $op= " . intval( $params['endid'] ) );
+                                       } else {
+                                               $this->addWhere( "rev_timestamp $op= $ts" );
+                                       }
+                               }
+                       } else {
+                               $this->addTimestampWhereRange( 'rev_timestamp', $params['dir'],
+                                       $params['start'], $params['end'] );
+                       }
+
+                       $sort = ( $params['dir'] === 'newer' ? '' : 'DESC' );
+                       $this->addOption( 'ORDER BY', [ "rev_timestamp $sort", "rev_id $sort" ] );
 
                        // There is only one ID, use it
                        $ids = array_keys( $pageSet->getGoodTitles() );
@@ -244,7 +309,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                                }
                        }
                        if ( $params['user'] !== null || $params['excludeuser'] !== null ) {
-                               // Paranoia: avoid brute force searches (bug 17342)
+                               // Paranoia: avoid brute force searches (T19342)
                                if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
                                        $bitmask = Revision::DELETED_USER;
                                } elseif ( !$this->getUser()->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
@@ -447,6 +512,6 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Revisions';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Revisions';
        }
 }
index 05b693d..72b39b6 100644 (file)
@@ -415,6 +415,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Search';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Search';
        }
 }
index 5093608..6b896c9 100644 (file)
@@ -88,6 +88,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                case 'languages':
                                        $fit = $this->appendLanguages( $p );
                                        break;
+                               case 'languagevariants':
+                                       $fit = $this->appendLanguageVariants( $p );
+                                       break;
                                case 'skins':
                                        $fit = $this->appendSkins( $p );
                                        break;
@@ -713,6 +716,49 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
+       // Export information about which page languages will trigger
+       // language conversion. (T153341)
+       public function appendLanguageVariants( $property ) {
+               $langNames = LanguageConverter::$languagesWithVariants;
+               if ( $this->getConfig()->get( 'DisableLangConversion' ) ) {
+                       // Ensure result is empty if language conversion is disabled.
+                       $langNames = [];
+               }
+               sort( $langNames );
+
+               $data = [];
+               foreach ( $langNames as $langCode ) {
+                       $lang = Language::factory( $langCode );
+                       if ( $lang->getConverter() instanceof FakeConverter ) {
+                               // Only languages which do not return instances of
+                               // FakeConverter implement language conversion.
+                               continue;
+                       }
+                       $data[$langCode] = [];
+                       ApiResult::setIndexedTagName( $data[$langCode], 'variant' );
+                       ApiResult::setArrayType( $data[$langCode], 'kvp', 'code' );
+
+                       $variants = $lang->getVariants();
+                       sort( $variants );
+                       foreach ( $variants as $v ) {
+                               $fallbacks = $lang->getConverter()->getVariantFallbacks( $v );
+                               if ( !is_array( $fallbacks ) ) {
+                                       $fallbacks = [ $fallbacks ];
+                               }
+                               $data[$langCode][$v] = [
+                                       'fallbacks' => $fallbacks,
+                               ];
+                               ApiResult::setIndexedTagName(
+                                       $data[$langCode][$v]['fallbacks'], 'variant'
+                               );
+                       }
+               }
+               ApiResult::setIndexedTagName( $data, 'lang' );
+               ApiResult::setArrayType( $data, 'kvp', 'code' );
+
+               return $this->getResult()->addValue( 'query', $property, $data );
+       }
+
        public function appendSkins( $property ) {
                $data = [];
                $allowed = Skin::getAllowedSkins();
@@ -772,7 +818,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function appendProtocols( $property ) {
-               // Make a copy of the global so we don't try to set the _element key of it - bug 45130
+               // Make a copy of the global so we don't try to set the _element key of it - T47130
                $protocols = array_values( $this->getConfig()->get( 'UrlProtocols' ) );
                ApiResult::setArrayType( $protocols, 'BCarray' );
                ApiResult::setIndexedTagName( $protocols, 'p' );
@@ -851,6 +897,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        'rightsinfo',
                                        'restrictions',
                                        'languages',
+                                       'languagevariants',
                                        'skins',
                                        'extensiontags',
                                        'functionhooks',
@@ -886,6 +933,6 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Siteinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Siteinfo';
        }
 }
index abb827f..1924ca0 100644 (file)
@@ -123,6 +123,6 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Stashimageinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Stashimageinfo';
        }
 }
index 43eb7e8..1b154fa 100644 (file)
@@ -53,37 +53,24 @@ class ApiQueryTags extends ApiQueryBase {
                $softwareDefinedTags = array_fill_keys( ChangeTags::listSoftwareDefinedTags(), 0 );
                $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
                $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 );
+               $tagStats = ChangeTags::tagUsageStatistics();
 
-               $definedTags = array_merge( $softwareDefinedTags, $explicitlyDefinedTags );
+               $tagHitcounts = array_merge( $softwareDefinedTags, $explicitlyDefinedTags, $tagStats );
+               $tags = array_keys( $tagHitcounts );
 
                # Fetch defined tags that aren't past the continuation
                if ( $params['continue'] !== null ) {
                        $cont = $params['continue'];
-                       $tags = array_filter( array_keys( $definedTags ), function ( $v ) use ( $cont ) {
+                       $tags = array_filter( $tags, function ( $v ) use ( $cont ) {
                                return $v >= $cont;
                        } );
-                       $tags = array_fill_keys( $tags, 0 );
-               } else {
-                       $tags = $definedTags;
-               }
-
-               # Merge in all used tags
-               $this->addTables( 'change_tag' );
-               $this->addFields( 'ct_tag' );
-               $this->addFields( [ 'hitcount' => $fld_hitcount ? 'COUNT(*)' : '0' ] );
-               $this->addOption( 'LIMIT', $limit + 1 );
-               $this->addOption( 'GROUP BY', 'ct_tag' );
-               $this->addWhereRange( 'ct_tag', 'newer', $params['continue'], null );
-               $res = $this->select( __METHOD__ );
-               foreach ( $res as $row ) {
-                       $tags[$row->ct_tag] = (int)$row->hitcount;
                }
 
                # Now make sure the array is sorted for proper continuation
-               ksort( $tags );
+               sort( $tags );
 
                $count = 0;
-               foreach ( $tags as $tagName => $hitcount ) {
+               foreach ( $tags as $tagName ) {
                        if ( ++$count > $limit ) {
                                $this->setContinueEnumParameter( 'continue', $tagName );
                                break;
@@ -102,7 +89,7 @@ class ApiQueryTags extends ApiQueryBase {
                        }
 
                        if ( $fld_hitcount ) {
-                               $tag['hitcount'] = $hitcount;
+                               $tag['hitcount'] = intval( $tagHitcounts[$tagName] );
                        }
 
                        $isSoftware = isset( $softwareDefinedTags[$tagName] );
@@ -178,6 +165,6 @@ class ApiQueryTags extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Tags';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tags';
        }
 }
index 5b700db..85205c8 100644 (file)
@@ -131,6 +131,6 @@ class ApiQueryTokens extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Tokens';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tokens';
        }
 }
index 31a9238..181cddb 100644 (file)
@@ -582,6 +582,6 @@ class ApiQueryContributions extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Usercontribs';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Usercontribs';
        }
 }
index 04b0fac..1bb54c1 100644 (file)
@@ -352,6 +352,6 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Userinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Userinfo';
        }
 }
index 3a814c4..a5d06c8 100644 (file)
@@ -172,10 +172,8 @@ class ApiQueryUsers extends ApiQueryBase {
                                $this->addJoinConds( [ 'user_groups' => [ 'INNER JOIN', 'ug_user=user_id' ] ] );
                                $this->addFields( [ 'user_name' ] );
                                $this->addFields( UserGroupMembership::selectFields() );
-                               if ( !$this->getConfig()->get( 'DisableUserGroupExpiry' ) ) {
-                                       $this->addWhere( 'ug_expiry IS NULL OR ug_expiry >= ' .
-                                               $db->addQuotes( $db->timestamp() ) );
-                               }
+                               $this->addWhere( 'ug_expiry IS NULL OR ug_expiry >= ' .
+                                       $db->addQuotes( $db->timestamp() ) );
                                $userGroupsRes = $this->select( __METHOD__ );
 
                                foreach ( $userGroupsRes as $row ) {
@@ -406,6 +404,6 @@ class ApiQueryUsers extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Users';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Users';
        }
 }
index 3f59751..f8f6e7d 100644 (file)
@@ -475,7 +475,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_TYPE => 'user'
                        ],
                        'token' => [
-                               ApiBase::PARAM_TYPE => 'string'
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_SENSITIVE => true,
                        ],
                        'continue' => [
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
@@ -501,6 +502,6 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Watchlist';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watchlist';
        }
 }
index a1078a5..b0b1cde 100644 (file)
@@ -170,7 +170,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_TYPE => 'user'
                        ],
                        'token' => [
-                               ApiBase::PARAM_TYPE => 'string'
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_SENSITIVE => true,
                        ],
                        'dir' => [
                                ApiBase::PARAM_DFLT => 'ascending',
@@ -198,6 +199,6 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Watchlistraw';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watchlistraw';
        }
 }
index 359d045..661b50c 100644 (file)
@@ -106,6 +106,6 @@ class ApiRemoveAuthenticationData extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Manage_authentication_data';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Manage_authentication_data';
        }
 }
index b5fa8ed..4f3fc0d 100644 (file)
@@ -134,6 +134,6 @@ class ApiResetPassword extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Manage_authentication_data';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Manage_authentication_data';
        }
 }
index e27cf7d..6734740 100644 (file)
@@ -364,7 +364,7 @@ class ApiResult implements ApiSerializable {
                        }
                }
                if ( is_array( $value ) ) {
-                       // Work around PHP bug 45959 by copying to a temporary
+                       // Work around https://bugs.php.net/bug.php?id=45959 by copying to a temporary
                        // (in this case, foreach gets $k === "1" but $tmp[$k] assigns as if $k === 1)
                        $tmp = [];
                        foreach ( $value as $k => $v ) {
index 4896e7e..4580aa2 100644 (file)
@@ -199,6 +199,6 @@ class ApiRevisionDelete extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Revisiondelete';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Revisiondelete';
        }
 }
index 9584f09..76b6cc6 100644 (file)
@@ -202,6 +202,6 @@ class ApiRollback extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Rollback';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Rollback';
        }
 }
index 4fac37d..fdc62a8 100644 (file)
@@ -89,7 +89,7 @@ class ApiRsd extends ApiBase {
                                'apiLink' => wfExpandUrl( wfScript( 'api' ), PROTO_CURRENT ),
 
                                // Docs link is optional, but recommended.
-                               'docs' => 'https://www.mediawiki.org/wiki/API',
+                               'docs' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API',
 
                                // Some APIs may need a blog ID, but it may be left blank.
                                'blogID' => '',
index 5769ff6..1fc8fc2 100644 (file)
@@ -248,6 +248,6 @@ class ApiSetNotificationTimestamp extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:SetNotificationTimestamp';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:SetNotificationTimestamp';
        }
 }
index 3ff99f1..2d6d9be 100755 (executable)
@@ -144,6 +144,6 @@ class ApiSetPageLanguage extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:SetPageLanguage';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:SetPageLanguage';
        }
 }
index 7470ff3..76c6762 100644 (file)
@@ -187,6 +187,6 @@ class ApiTag extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Tag';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tag';
        }
 }
index 3eeb7a4..887edaa 100644 (file)
@@ -44,7 +44,7 @@ class ApiUnblock extends ApiBase {
                if ( !$user->isAllowed( 'block' ) ) {
                        $this->dieWithError( 'apierror-permissiondenied-unblock', 'permissiondenied' );
                }
-               # bug 15810: blocked admins should have limited access here
+               # T17810: blocked admins should have limited access here
                if ( $user->isBlocked() ) {
                        $status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
                        if ( $status !== true ) {
@@ -132,6 +132,6 @@ class ApiUnblock extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Block';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Block';
        }
 }
index 7fda1ea..3aa7b60 100644 (file)
@@ -33,7 +33,6 @@ class ApiUndelete extends ApiBase {
                $this->useTransactionalTimeLimit();
 
                $params = $this->extractRequestParams();
-               $this->checkUserRightsAny( 'undelete' );
 
                $user = $this->getUser();
                if ( $user->isBlocked() ) {
@@ -45,6 +44,10 @@ class ApiUndelete extends ApiBase {
                        $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                }
 
+               if ( !$titleObj->userCan( 'undelete', $user, 'secure' ) ) {
+                       $this->dieWithError( 'permdenied-undelete' );
+               }
+
                // Check if user can add tags
                if ( !is_null( $params['tags'] ) ) {
                        $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
@@ -145,6 +148,6 @@ class ApiUndelete extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Undelete';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Undelete';
        }
 }
index af3fff6..a283b5a 100644 (file)
@@ -928,6 +928,6 @@ class ApiUpload extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Upload';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Upload';
        }
 }
index 262f072..2a364d9 100644 (file)
@@ -58,7 +58,7 @@ class ApiUserrights extends ApiBase {
                $params = $this->extractRequestParams();
 
                // Figure out expiry times from the input
-               // @todo Remove this isset check when removing $wgDisableUserGroupExpiry
+               // $params['expiry'] may not be set in subclasses
                if ( isset( $params['expiry'] ) ) {
                        $expiry = (array)$params['expiry'];
                } else {
@@ -214,6 +214,6 @@ class ApiUserrights extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:User_group_membership';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:User_group_membership';
        }
 }
index 6968523..943149d 100644 (file)
@@ -76,6 +76,6 @@ class ApiValidatePassword extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Validatepassword';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Validatepassword';
        }
 }
index 37d319f..efe21f1 100644 (file)
@@ -183,6 +183,6 @@ class ApiWatch extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Watch';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watch';
        }
 }
index ca1e85a..a6f1a28 100644 (file)
                        "Dvorapa"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentace]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:API:Errors_and_warnings|v dokumentaci]].\n\n<strong>Testování:</strong> Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentace]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:Special:MyLanguage/API:Errors_and_warnings|v dokumentaci]].\n\n<strong>Testování:</strong> Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Která akce se má provést.",
        "apihelp-main-param-format": "Formát výstupu.",
-       "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „<samp>maxlag</samp>“ s hlášením typu „<samp>Waiting for $host: $lag seconds lagged</samp>“.<br />Více informací najdete v [[mw:Manual:Maxlag_parameter|příručce]].",
+       "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „<samp>maxlag</samp>“ s hlášením typu „<samp>Waiting for $host: $lag seconds lagged</samp>“.<br />Více informací najdete v [[mw:Special:MyLanguage/Manual:Maxlag_parameter|příručce]].",
        "apihelp-main-param-smaxage": "Nastaví HTTP hlavičku pro řízení kešování <code>s-maxage</code> na uvedený počet sekund. Chyby se nekešují nikdy.",
        "apihelp-main-param-maxage": "Nastaví HTTP hlavičku pro řízení kešování <code>max-age</code> na uvedený počet sekund. Chyby se nekešují nikdy.",
        "apihelp-main-param-assert": "Pokud je nastaveno na „<kbd>user</kbd>“, ověří, že je uživatel přihlášen, pokud je nastaveno na „<kbd>bot</kbd>“, ověří, že má oprávnění „bot“.",
@@ -32,7 +32,7 @@
        "apihelp-block-param-nocreate": "Nedovolit registraci nových uživatelů.",
        "apihelp-block-param-noemail": "Zakázat uživateli posílat e-maily prostřednictvím wiki. (Vyžaduje oprávnění „<code>blockemail</code>“.)",
        "apihelp-block-param-hidename": "Skrýt uživatelské jméno v knize zablokování. (Vyžaduje oprávnění <code>hideuser</code>.)",
-       "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Pokud již uživatel blokován je, přepsat současný blok.",
        "apihelp-block-param-watchuser": "Sledovat stránku uživatele nebo IP adresy a jejich diskuzní stránky.",
        "apihelp-block-example-ip-simple": "Na tři dny zablokovat IP adresu <kbd>192.0.2.5</kbd> s odůvodněním <kbd>First strike</kbd>.",
        "apihelp-opensearch-param-search": "Hledaný řetězec.",
        "apihelp-opensearch-param-limit": "Maximální počet vrácených výsledků",
        "apihelp-opensearch-param-namespace": "Jmenné prostory pro vyhledávání.",
-       "apihelp-opensearch-param-suggest": "Pokud je <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> vypnuto, nedělat nic.",
+       "apihelp-opensearch-param-suggest": "Pokud je <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> vypnuto, nedělat nic.",
        "apihelp-opensearch-param-format": "Formát výstupu.",
        "apihelp-opensearch-example-te": "Najít stránky začínající na „<kbd>Te</kbd>“.",
        "apihelp-options-param-reset": "Vrátit nastavení na výchozí hodnoty.",
        "apihelp-xml-param-includexmlnamespace": "Pokud je uvedeno, přidá jmenný prostor XML.",
        "apihelp-xmlfm-description": "Vypisuje data ve formátu XML (v čitelné HTML podobě).",
        "api-format-title": "Odpověď z MediaWiki API",
-       "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr <var>format</var>. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte <kbd>format=$2</kbd>.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].",
-       "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].",
+       "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr <var>format</var>. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte <kbd>format=$2</kbd>.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].",
+       "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].",
        "api-help-title": "Nápověda k MediaWiki API",
        "api-help-lead": "Toto je automaticky generovaná dokumentační stránka k MediaWiki API.\n\nDokumentace a příklady: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Hlavní modul",
index 341c68f..e1588e7 100644 (file)
                        "FriedhelmW",
                        "Predatorix",
                        "Luke081515",
-                       "Eddie"
+                       "Eddie",
+                       "Zenith",
+                       "Tacsipacsi"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentation]]\n* [[mw:API:FAQ|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:API:Errors_and_warnings|API: Fehler und Warnungen]].\n\n<strong>Testen:</strong> Zum einfachen Testen von API-Anfragen, siehe [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentation]]\n* [[mw:Special:MyLanguage/API:FAQ|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Fehler und Warnungen]].\n\n<strong>Testen:</strong> Zum einfachen Testen von API-Anfragen, siehe [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Auszuführende Aktion.",
        "apihelp-main-param-format": "Format der Ausgabe.",
-       "apihelp-main-param-maxlag": "maxlag kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um weitere Replikationsrückstände zu verhindern, lässt dieser Parameter den Client warten, bis der Replikationsrückstand kleiner als der angegebene Wert (in Sekunden) ist. Bei einem größerem Rückstand wird der Fehlercode <samp>maxlag</samp> zurückgegeben mit einer Nachricht wie <samp>Waiting for $host: $lag seconds lagged</samp>.<br />Siehe [[mw:Manual:Maxlag_parameter|Handbuch: Maxlag parameter]] für weitere Informationen.",
+       "apihelp-main-param-maxlag": "maxlag kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um weitere Replikationsrückstände zu verhindern, lässt dieser Parameter den Client warten, bis der Replikationsrückstand kleiner als der angegebene Wert (in Sekunden) ist. Bei einem größerem Rückstand wird der Fehlercode <samp>maxlag</samp> zurückgegeben mit einer Nachricht wie <samp>Waiting for $host: $lag seconds lagged</samp>.<br />Siehe [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Handbuch: Maxlag parameter]] für weitere Informationen.",
        "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.",
@@ -46,7 +48,7 @@
        "apihelp-block-param-autoblock": "Die zuletzt verwendete IP-Adresse automatisch sperren und alle darauffolgenden IP-Adressen, die versuchen sich anzumelden.",
        "apihelp-block-param-noemail": "Benutzer davon abhalten, E-Mails auf dem Wiki zu versenden (erfordert das <code>blockemail</code>-Recht).",
        "apihelp-block-param-hidename": "Den Benutzernamen im Sperr-Logbuch verstecken (erfordert das <code>hideuser</code>-Recht).",
-       "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von <var>[[mw:Special:MyLanguage/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-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-linkaccount-description": "Verbindet ein Benutzerkonto von einem Drittanbieter mit dem aktuellen Benutzer.",
        "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-login-param-password": "Passwort.",
        "apihelp-opensearch-param-search": "Such-Zeichenfolge.",
        "apihelp-opensearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
        "apihelp-opensearch-param-namespace": "Zu durchsuchende Namensräume.",
-       "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> falsch ist.",
+       "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> falsch ist.",
        "apihelp-opensearch-param-redirects": "Wie mit Weiterleitungen umgegangen werden soll:\n;return:Gibt die Weiterleitung selbst zurück.\n;resolve:Gibt die Zielseite zurück. Kann weniger als $1limit Ergebnisse zurückgeben.\nAus Kompatibilitätsgründen ist für $1format=json die Vorgabe \"return\" und \"resolve\" für alle anderen Formate.",
        "apihelp-opensearch-param-format": "Das Format der Ausgabe.",
        "apihelp-opensearch-param-warningsaserror": "Wenn Warnungen mit <kbd>format=json</kbd> auftreten, gib einen API-Fehler zurück, anstatt ihn zu ignorieren.",
        "apihelp-parse-paramvalue-prop-sections": "Gibt die Abschnitte im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-revid": "Ergänzt die Versionskennung der geparsten Seite.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Ergänzt den Titel des geparsten Wikitextes.",
+       "apihelp-parse-paramvalue-prop-headhtml": "Gibt geparsten <code>&lt;head&gt;</code> der Seite zurück.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite aus. Zur Anwendung verwende <code>mw.config.set()</code>.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite als JSON-Zeichenfolge aus.",
        "apihelp-parse-paramvalue-prop-indicators": "Gibt das HTML der Seitenstatusindikatoren zurück, die auf der Seite verwendet werden.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Gibt Interwiki-Links des geparsten Wikitextes zurück.",
        "apihelp-parse-paramvalue-prop-wikitext": "Gibt den originalen Wikitext zurück, der geparst wurde.",
        "apihelp-parse-paramvalue-prop-properties": "Gibt verschiedene Eigenschaften zurück, die im geparsten Wikitext definiert sind.",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "Gibt die Warnungen aus, die beim Parsen des Inhalts aufgetreten sind.",
+       "apihelp-parse-param-wrapoutputclass": "Zu verwendende CSS-Klasse, in der die Parserausgabe verpackt werden soll.",
        "apihelp-parse-param-section": "Parst nur den Inhalt dieser Abschnittsnummer.\n\nFalls <kbd>new</kbd>, parst <var>$1text</var> und <var>$1sectiontitle</var>, als ob ein neuer Abschnitt der Seite hinzugefügt wird.\n\n<kbd>new</kbd> ist nur erlaubt mit der Angabe <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Überschrift des neuen Abschnittes, wenn <var>section</var> = <kbd>new</kbd> ist.\n\nAnders als beim Bearbeiten der Seite wird der Parameter nicht durch die <var>summary</var> ersetzt, wenn er weggelassen oder leer ist.",
        "apihelp-parse-param-disablepp": "Benutze <var>$1disablelimitreport</var> stattdessen.",
        "apihelp-parse-param-preview": "Im Vorschaumodus parsen.",
        "apihelp-parse-param-sectionpreview": "Im Abschnitt Vorschau-Modus parsen (aktiviert ebenfalls den Vorschau-Modus)",
        "apihelp-parse-param-disabletoc": "Inhaltsverzeichnis in der Ausgabe weglassen.",
+       "apihelp-parse-param-useskin": "Wendet die ausgewählte Benutzeroberfläche auf die Parserausgabe an. Kann Auswirkungen auf die folgenden Eigenschaften haben: <kbd>langlinks</kbd>, <kbd>headitems</kbd>, <kbd>modules</kbd>, <kbd>jsconfigvars</kbd>, <kbd>indicators</kbd>.",
        "apihelp-parse-param-contentmodel": "Inhaltsmodell des eingegebenen Textes. Fall ausgelassen, muss $1title angegeben werden und Standardwert wird das Modell des angegebenen Titels. Ist nur gültig im Zusammenhang mit $1text.",
        "apihelp-parse-example-page": "Eine Seite parsen.",
        "apihelp-parse-example-text": "Wikitext parsen.",
        "apihelp-protect-param-expiry": "Zeitstempel des Schutzablaufs. Wenn nur ein Zeitstempel übergeben wird, ist dieser für alle Seitenschutze gültig. Um eine unendliche Schutzdauer festzulegen, kannst du die Werte <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> oder <kbd>never</kbd> übergeben.",
        "apihelp-protect-param-reason": "Grund für den Seitenschutz oder dessen Aufhebung.",
        "apihelp-protect-param-tags": "Auf den Seitenschutz-Logbuch-Eintrag anzuwendende Änderungsmarkierungen.",
-       "apihelp-protect-param-cascade": "Aktiviert den Kaskadenschutz (z.&nbsp;B. werden eingebundene Vorlagen und Bilder in dieser Seite geschützt). Wird ignoriert, falls keine der angegebenen Schutzebenen Kaskaden unterstützt.",
+       "apihelp-protect-param-cascade": "Aktiviert den Kaskadenschutz (d.&nbsp;h. in dieser Seite eingebundene Vorlagen und Bilder werden geschützt). Wird ignoriert, falls keine der angegebenen Schutzebenen Kaskaden unterstützt.",
        "apihelp-protect-param-watch": "Wenn vorhanden, fügt dieser Parameter die zu (ent-)sperrende Seite der Beobachtungsliste des aktuellen Benutzers hinzu.",
        "apihelp-protect-param-watchlist": "Die Seite bedingungslos zur Beobachtungsliste des aktuellen Benutzers hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.",
        "apihelp-protect-example-protect": "Schützt eine Seite",
        "apihelp-query+langlinks-param-limit": "Wie viele Sprachlinks zurückgegeben werden sollen.",
        "apihelp-query+langlinks-param-prop": "Zusätzlich zurückzugebende Eigenschaften jedes Interlanguage-Links:",
        "apihelp-query+langlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "Ergänzt den Namen der Muttersprache.",
        "apihelp-query+langlinks-param-dir": "Die Auflistungsrichtung.",
+       "apihelp-query+links-description": "Gibt alle Links von den angegebenen Seiten zurück.",
+       "apihelp-query+links-param-namespace": "Zeigt nur Links in diesen Namensräumen.",
        "apihelp-query+links-param-limit": "Wie viele Links zurückgegeben werden sollen.",
        "apihelp-query+links-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+links-example-simple": "Links von der <kbd>Hauptseite</kbd> abrufen",
        "apihelp-query+linkshere-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "Die Seitenkennung jeder Seite.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Titel jeder Seite.",
+       "apihelp-query+linkshere-param-limit": "Wie viel zurückgegeben werden soll.",
+       "apihelp-query+linkshere-example-simple": "Holt eine Liste von Seiten, die auf [[Main Page]] verlinken.",
        "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
        "apihelp-query+logevents-param-prop": "Zurückzugebende Eigenschaften:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "Ergänzt die Kennung des Logbuchereignisses.",
+       "apihelp-query+logevents-paramvalue-prop-title": "Ergänzt den Titel der Seite für das Logbuchereignis.",
        "apihelp-query+logevents-paramvalue-prop-type": "Ergänzt den Typ des Logbuchereignisses.",
+       "apihelp-query+logevents-paramvalue-prop-user": "Ergänzt den verantwortlichen Benutzer für das Logbuchereignis.",
        "apihelp-query+logevents-paramvalue-prop-comment": "Ergänzt den Kommentar des Logbuchereignisses.",
        "apihelp-query+logevents-example-simple": "Listet die letzten Logbuch-Ereignisse auf.",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Fügt die Seitenkennung hinzu.",
        "apihelp-query+pageswithprop-param-limit": "Die maximale Anzahl zurückzugebender Seiten.",
+       "apihelp-query+pageswithprop-param-dir": "In welche Richtung sortiert werden soll.",
        "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
+       "apihelp-query+prefixsearch-param-namespace": "Welche Namensräume durchsucht werden sollen.",
+       "apihelp-query+prefixsearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
        "apihelp-query+prefixsearch-param-offset": "Anzahl der zu überspringenden Ergebnisse.",
        "apihelp-query+prefixsearch-param-profile": "Zu verwendendes Suchprofil.",
+       "apihelp-query+protectedtitles-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.",
        "apihelp-query+protectedtitles-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+querypage-param-limit": "Anzahl der zurückzugebenden Ergebnisse.",
        "apihelp-query+recentchanges-description": "Listet die letzten Änderungen auf.",
        "apihelp-query+recentchanges-param-user": "Listet nur Änderungen von diesem Benutzer auf.",
        "apihelp-query+recentchanges-param-excludeuser": "Listet keine Änderungen von diesem Benutzer auf.",
        "apihelp-query+recentchanges-param-tag": "Listet nur Änderungen auf, die mit dieser Markierung markiert sind.",
+       "apihelp-query+recentchanges-param-prop": "Bezieht zusätzliche Informationen mit ein:",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "Fügt den Kommentar für die Bearbeitung hinzu.",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "Ergänzt Markierungen für die Bearbeitung.",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel für die Bearbeitung.",
        "apihelp-query+search-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.",
        "apihelp-query+search-example-simple": "Nach <kbd>meaning</kbd> suchen.",
        "apihelp-query+search-example-text": "Texte nach <kbd>meaning</kbd> durchsuchen.",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Gibt eine Liste für die Sprachcodes zurück, bei denen der [[mw:Special:MyLanguage/LanguageConverter|Sprachkonverter]] aktiviert ist und die unterstützten Varianten für jede Sprache.",
        "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen",
        "apihelp-query+stashimageinfo-param-sessionkey": "Alias für $1filekey, für die Rückwärtskompatibilität.",
        "apihelp-query+stashimageinfo-example-simple": "Gibt Informationen für eine gespeicherte Datei zurück.",
        "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-description-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.\n\nAktiviere <var>[[mw:Special:MyLanguage/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-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-format-prettyprint-header": "Dies ist die Darstellung des $1-Formats in HTML. HTML ist gut zur Fehlerbehebung geeignet, aber unpassend für die Nutzung durch Anwendungen.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Lege <kbd>format=$2</kbd> fest, um die von HTML abweichende Darstellung des $1-Formats zu erhalten.\n\nSiehe auch die [[mw:API|vollständige Dokumentation der API]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
+       "api-format-prettyprint-header": "Dies ist die Darstellung des $1-Formats in HTML. HTML ist gut zur Fehlerbehebung geeignet, aber unpassend für die Nutzung durch Anwendungen.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Lege <kbd>format=$2</kbd> fest, um die von HTML abweichende Darstellung des $1-Formats zu erhalten.\n\nSiehe auch die [[mw:Special:MyLanguage/API|vollständige Dokumentation der API]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
        "api-format-prettyprint-status": "Diese Antwort wird mit dem HTTP-Status $1 $2 zurückgegeben.",
        "api-pageset-param-titles": "Eine Liste der Titel, an denen gearbeitet werden soll.",
        "api-pageset-param-pageids": "Eine Liste der Seitenkennungen, an denen gearbeitet werden soll.",
        "api-help-param-default-empty": "Standard: <span class=\"apihelp-empty\">(leer)</span>",
        "api-help-param-token": "Ein „$1“-Token abgerufen von [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-token-webui": "Aus Kompatibilitätsgründen wird der in der Weboberfläche verwendete Token ebenfalls akzeptiert.",
-       "api-help-param-disabled-in-miser-mode": "Deaktiviert aufgrund des [[mw:Manual:$wgMiserMode|Miser-Modus]].",
+       "api-help-param-disabled-in-miser-mode": "Deaktiviert aufgrund des [[mw:Special:MyLanguage/Manual:$wgMiserMode|Miser-Modus]].",
        "api-help-param-continue": "Falls weitere Ergebnisse verfügbar sind, dies zum Fortfahren verwenden.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(keine Beschreibung)</span>",
        "api-help-examples": "{{PLURAL:$1|Beispiel|Beispiele}}:",
        "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-badgenerator-unknown": "<kbd>generator=$1</kbd> unbekannt.",
+       "apierror-badip": "Der IP-Parameter ist nicht gültig.",
+       "apierror-badmd5": "Die angegebene MD5-Prüfsumme war falsch.",
+       "apierror-badmodule-badsubmodule": "Das Modul <kbd>$1</kbd> hat kein Untermodul namens „$2“.",
+       "apierror-badmodule-nosubmodules": "Das Modul <kbd>$1</kbd> hat keine Untermodule.",
+       "apierror-badparameter": "Ungültiger Wert für den Parameter <var>$1</var>.",
+       "apierror-badquery": "Ungültige Abfrage.",
        "apierror-cannot-async-upload-file": "Die Parameter <var>async</var> und <var>file</var> können nicht kombiniert werden. Falls du eine asynchrone Verarbeitung deiner hochgeladenen Datei wünschst, lade sie zuerst mithilfe des Parameters <var>stash</var> auf den Speicher hoch. Veröffentliche anschließend die gespeicherte Datei asynchron mithilfe <var>filekey</var> und <var>async</var>.",
+       "apierror-emptypage": "Das Erstellen neuer leerer Seiten ist nicht erlaubt.",
+       "apierror-filedoesnotexist": "Die Datei ist nicht vorhanden.",
+       "apierror-import-unknownerror": "Unbekannter Fehler beim Importieren: $1.",
+       "apierror-invalid-file-key": "Kein gültiger Dateischlüssel.",
+       "apierror-invalidsection": "Der Parameter <var>section</var> muss eine gültige Abschnittskennung oder <kbd>new</kbd> sein.",
        "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-protect-invalidaction": "Ungültiger Schutztyp „$1“.",
        "apierror-readonly": "Das Wiki ist derzeit im schreibgeschützten Modus.",
+       "apierror-revisions-badid": "Für den Parameter <var>$1</var> wurde keine Version gefunden.",
        "apierror-revwrongpage": "Die Version $1 ist keine Version von $2.",
        "apierror-sectionreplacefailed": "Der aktualisierte Abschnitt konnte nicht zusammengeführt werden.",
        "apierror-stashinvalidfile": "Ungültige gespeicherte Datei.",
        "apiwarn-invalidcategory": "„$1“ ist keine Kategorie.",
        "apiwarn-invalidtitle": "„$1“ ist kein gültiger Titel.",
        "apiwarn-notfile": "„$1“ ist keine Datei.",
+       "apiwarn-toomanyvalues": "Es wurden zu viele Werte für den Parameter <var>$1</var> angegeben. Die Obergrenze liegt bei $2.",
        "apiwarn-validationfailed-badpref": "Keine gültige Einstellung.",
        "apiwarn-validationfailed-cannotset": "Kann nicht von diesem Modul festgelegt werden.",
        "apiwarn-validationfailed-keytoolong": "Der Schlüssel ist zu lang. Es sind nicht mehr als $1 Bytes erlaubt.",
index f4373ab..93ee3e1 100644 (file)
        "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-watch-param-title": "The page to (un)watch. Use <var>$1titles</var> instead.",
        "apihelp-watch-example-unwatch": "Unwatch the page <kbd>Main Page</kbd>.",
-       "apihelp-dbg-description": "Output data in PHP's <code>var_export()</code> format.",
-       "apihelp-dbgfm-description": "Output data in PHP's <code>var_export()</code> format (pretty-print in HTML).",
        "apihelp-php-description": "Output data in serialised PHP format.",
        "apihelp-phpfm-description": "Output data in serialised PHP format (pretty-print in HTML).",
-       "apihelp-txt-description": "Output data in PHP's <code>print_r()</code> format.",
-       "apihelp-txtfm-description": "Output data in PHP's <code>print_r()</code> format (pretty-print in HTML).",
        "api-pageset-param-redirects-generator": "Automatically resolve redirects in <var>$1titles</var>, <var>$1pageids</var>, and <var>$1revids</var>, and in pages returned by <var>$1generator</var>.",
        "api-pageset-param-redirects-nogenerator": "Automatically resolve redirects in <var>$1titles</var>, <var>$1pageids</var>, and <var>$1revids</var>.",
        "api-help-param-multi-separate": "Separate values with <kbd>|</kbd>.",
-       "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Manual:$wgMiserMode|miser mode]].",
-       "api-help-param-limited-in-miser-mode": "<strong>Note:</strong> Due to [[mw:Manual:$wgMiserMode|miser mode]], using this may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned."
+       "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]].",
+       "api-help-param-limited-in-miser-mode": "<strong>Note:</strong> Due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]], using this may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned."
 }
index f9de725..9670260 100644 (file)
@@ -6,10 +6,10 @@
                ]
        },
 
-       "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 Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Testing:</strong> For ease of testing API requests, see [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Testing:</strong> For ease of testing API requests, see [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Which action to perform.",
        "apihelp-main-param-format": "The format of the output.",
-       "apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code <samp>maxlag</samp> is returned with a message like <samp>Waiting for $host: $lag seconds lagged</samp>.<br />See [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] for more information.",
+       "apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code <samp>maxlag</samp> is returned with a message like <samp>Waiting for $host: $lag seconds lagged</samp>.<br />See [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]] for more information.",
        "apihelp-main-param-smaxage": "Set the <code>s-maxage</code> HTTP cache control header to this many seconds. Errors are never cached.",
        "apihelp-main-param-maxage": "Set the <code>max-age</code> HTTP cache control header to this many seconds. Errors are never cached.",
        "apihelp-main-param-assert": "Verify the user is logged in if set to <kbd>user</kbd>, or has the bot user right if <kbd>bot</kbd>.",
@@ -34,7 +34,7 @@
        "apihelp-block-param-autoblock": "Automatically block the last used IP address, and any subsequent IP addresses they try to login from.",
        "apihelp-block-param-noemail": "Prevent user from sending email through the wiki. (Requires the <code>blockemail</code> right).",
        "apihelp-block-param-hidename": "Hide the username from the block log. (Requires the <code>hideuser</code> right).",
-       "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on <var>[[mw:Special:MyLanguage/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-opensearch-param-search": "Search string.",
        "apihelp-opensearch-param-limit": "Maximum number of results to return.",
        "apihelp-opensearch-param-namespace": "Namespaces to search.",
-       "apihelp-opensearch-param-suggest": "Do nothing if <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> is false.",
+       "apihelp-opensearch-param-suggest": "Do nothing if <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> is false.",
        "apihelp-opensearch-param-redirects": "How to handle redirects:\n;return:Return the redirect itself.\n;resolve:Return the target page. May return fewer than $1limit results.\nFor historical reasons, the default is \"return\" for $1format=json and \"resolve\" for other formats.",
        "apihelp-opensearch-param-format": "The format of the output.",
        "apihelp-opensearch-param-warningsaserror": "If warnings are raised with <kbd>format=json</kbd>, return an API error instead of ignoring them.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Gives the limit report in a structured way. Gives no data, when <var>$1disablelimitreport</var> is set.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Gives the HTML version of the limit report. Gives no data, when <var>$1disablelimitreport</var> is set.",
        "apihelp-parse-paramvalue-prop-parsetree": "The XML parse tree of revision content (requires content model <code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "Gives the warnings that occurred while parsing content.",
+       "apihelp-parse-param-wrapoutputclass": "CSS class to use to wrap the parser output.",
        "apihelp-parse-param-pst": "Do a pre-save transform on the input before parsing it. Only valid when used with text.",
        "apihelp-parse-param-onlypst": "Do a pre-save transform (PST) on the input, but don't parse it. Returns the same wikitext, after a PST has been applied. Only valid when used with <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Includes language links supplied by extensions (for use with <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-preview": "Parse in preview mode.",
        "apihelp-parse-param-sectionpreview": "Parse in section preview mode (enables preview mode too).",
        "apihelp-parse-param-disabletoc": "Omit table of contents in output.",
+       "apihelp-parse-param-useskin": "Apply the selected skin to the parser output. May affect the following properties: <kbd>langlinks</kbd>, <kbd>headitems</kbd>, <kbd>modules</kbd>, <kbd>jsconfigvars</kbd>, <kbd>indicators</kbd>.",
        "apihelp-parse-param-contentformat": "Content serialization format used for the input text. Only valid when used with $1text.",
        "apihelp-parse-param-contentmodel": "Content model of the input text. If omitted, $1title must be specified, and default will be the model of the specified title. Only valid when used with $1text.",
        "apihelp-parse-example-page": "Parse a page.",
        "apihelp-query+alldeletedrevisions-param-user": "Only list revisions by this user.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Don't list revisions by this user.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Only list pages in this namespace.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Note:</strong> Due to [[mw:Manual:$wgMiserMode|miser mode]], using <var>$1user</var> and <var>$1namespace</var> together may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Note:</strong> Due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]], using <var>$1user</var> and <var>$1namespace</var> together may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "When being used as a generator, generate titles rather than revision IDs.",
        "apihelp-query+alldeletedrevisions-example-user": "List the last 50 deleted contributions by user <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "List the first 50 deleted revisions in the main namespace.",
        "apihelp-query+filearchive-example-simple": "Show a list of all deleted files.",
 
        "apihelp-query+filerepoinfo-description": "Return meta information about image repositories configured on the wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "Which repository properties to get (there may be more available on some wikis):\n;apiurl:URL to the repository API - helpful for getting image info from the host.\n;name:The key of the repository - used in e.g. <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> and [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.",
+       "apihelp-query+filerepoinfo-param-prop": "Which repository properties to get (there may be more available on some wikis):\n;apiurl:URL to the repository API - helpful for getting image info from the host.\n;name:The key of the repository - used in e.g. <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> and [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.",
        "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories.",
 
        "apihelp-query+fileusage-description": "Find all pages that use the given files.",
 
        "apihelp-query+revisions-description": "Get revision information.\n\nMay be used in several ways:\n# Get data about a set of pages (last revision), by setting titles or pageids.\n# Get revisions for one given page, by using titles or pageids with start, end, or limit.\n# Get data about a set of revisions by setting their IDs with revids.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "May only be used with a single page (mode #2).",
-       "apihelp-query+revisions-param-startid": "From which revision ID to start enumeration.",
-       "apihelp-query+revisions-param-endid": "Stop revision enumeration on this revision ID.",
+       "apihelp-query+revisions-param-startid": "Start enumeration from this revision's timestamp. The revision must exist, but need not belong to this page.",
+       "apihelp-query+revisions-param-endid": "Stop enumeration at this revision's timestamp. The revision must exist, but need not belong to this page.",
        "apihelp-query+revisions-param-start": "From which revision timestamp to start enumeration.",
        "apihelp-query+revisions-param-end": "Enumerate up to this timestamp.",
        "apihelp-query+revisions-param-user": "Only include revisions made by user.",
        "apihelp-query+search-param-limit": "How many total pages to return.",
        "apihelp-query+search-param-interwiki": "Include interwiki results in the search, if available.",
        "apihelp-query+search-param-backend": "Which search backend to use, if not the default.",
-       "apihelp-query+search-param-enablerewrites": "Enable internal query rewriting. Some search backends can rewrite the query into one its thinks gives better results, such as correcting spelling errors.",
+       "apihelp-query+search-param-enablerewrites": "Enable internal query rewriting. Some search backends can rewrite the query into another which is thought to provide better results, for instance by correcting spelling errors.",
        "apihelp-query+search-example-simple": "Search for <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Search texts for <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "Get page info about the pages returned for a search for <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Returns wiki rights (license) information if available.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Returns information on available restriction (protection) types.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Returns a list of languages MediaWiki supports (optionally localised by using <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Returns a list of language codes for which [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] is enabled, and the variants supported for each.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Returns a list of all enabled skins (optionally localised by using <var>$1inlanguagecode</var>, otherwise in the content language).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Returns a list of parser extension tags.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Returns a list of parser function hooks.",
-       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Returns a list of all subscribed hooks (contents of <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Returns a list of all subscribed hooks (contents of <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Returns a list of variable IDs.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "Returns a list of protocols that are allowed in external links.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Returns the default values for user preferences.",
        "apihelp-query+tags-example-simple": "List available tags.",
 
        "apihelp-query+templates-description": "Returns all pages transcluded on the given pages.",
-       "apihelp-query+templates-param-namespace": "Show templates in this namespaces only.",
+       "apihelp-query+templates-param-namespace": "Show templates in these namespaces only.",
        "apihelp-query+templates-param-limit": "How many templates to return.",
        "apihelp-query+templates-param-templates": "Only list these templates. Useful for checking whether a certain page uses a certain template.",
        "apihelp-query+templates-param-dir": "The direction in which to list.",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "Adds flags of the edit.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Tags patrolled edits.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Lists tags for the edit.",
-       "apihelp-query+usercontribs-param-show": "Show only items that meet these criteria, e.g. non minor edits only: <kbd>$2show=!minor</kbd>.\n\nIf <kbd>$2show=patrolled</kbd> or <kbd>$2show=!patrolled</kbd> is set, revisions older than <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|second|seconds}}) won't be shown.",
+       "apihelp-query+usercontribs-param-show": "Show only items that meet these criteria, e.g. non minor edits only: <kbd>$2show=!minor</kbd>.\n\nIf <kbd>$2show=patrolled</kbd> or <kbd>$2show=!patrolled</kbd> is set, revisions older than <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|second|seconds}}) won't be shown.",
        "apihelp-query+usercontribs-param-tag": "Only list revisions tagged with this tag.",
        "apihelp-query+usercontribs-param-toponly": "Only list changes which are the latest revision.",
        "apihelp-query+usercontribs-example-user": "Show contributions of user <kbd>Example</kbd>.",
        "apihelp-removeauthenticationdata-example-simple": "Attempt to remove the current user's data for <kbd>FooAuthenticationRequest</kbd>.",
 
        "apihelp-resetpassword-description": "Send a password reset email to a user.",
-       "apihelp-resetpassword-description-noroutes": "No password reset routes are available.\n\nEnable routes in <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> to use this module.",
+       "apihelp-resetpassword-description-noroutes": "No password reset routes are available.\n\nEnable routes in <var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> to use this module.",
        "apihelp-resetpassword-param-user": "User being reset.",
        "apihelp-resetpassword-param-email": "Email address of the user being reset.",
        "apihelp-resetpassword-example-user": "Send a password reset email to user <kbd>Example</kbd>.",
        "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-description-disabled": "Changing the language of a page is not allowed on this wiki.\n\nEnable <var>[[mw:Special:MyLanguage/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-xmlfm-description": "Output data in XML format (pretty-print in HTML).",
 
        "api-format-title": "MediaWiki API result",
-       "api-format-prettyprint-header": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the <var>format</var> parameter to change the output format. To see the non-HTML representation of the $1 format, set <kbd>format=$2</kbd>.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
-       "api-format-prettyprint-header-only-html": "This is an HTML representation intended for debugging, and is unsuitable for application use.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
+       "api-format-prettyprint-header": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the <var>format</var> parameter to change the output format. To see the non-HTML representation of the $1 format, set <kbd>format=$2</kbd>.\n\nSee the [[mw:Special:MyLanguage/API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
+       "api-format-prettyprint-header-only-html": "This is an HTML representation intended for debugging, and is unsuitable for application use.\n\nSee the [[mw:Special:MyLanguage/API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
        "api-format-prettyprint-status": "This response would be returned with HTTP status $1 $2.",
 
+       "api-login-fail-aborted": "Authentication requires user interaction, which is not supported by <kbd>action=login</kbd>. To be able to login with <kbd>action=login</kbd>, see [[Special:BotPasswords]]. To continue using main-account login, see <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-aborted-nobotpw": "Authentication requires user interaction, which is not supported by <kbd>action=login</kbd>. To log in, see <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-badsessionprovider": "Cannot log in when using $1.",
+       "api-login-fail-sameorigin": "Cannot log in when the same-origin policy is not applied.",
+
        "api-pageset-param-titles": "A list of titles to work on.",
        "api-pageset-param-pageids": "A list of page IDs to work on.",
        "api-pageset-param-revids": "A list of revision IDs to work on.",
        "api-help-param-default-empty": "Default: <span class=\"apihelp-empty\">(empty)</span>",
        "api-help-param-token": "A \"$1\" token retrieved from [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-token-webui": "For compatibility, the token used in the web UI is also accepted.",
-       "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Manual:$wgMiserMode|miser mode]].",
-       "api-help-param-limited-in-miser-mode": "<strong>Note:</strong> Due to [[mw:Manual:$wgMiserMode|miser mode]], using this may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
+       "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]].",
+       "api-help-param-limited-in-miser-mode": "<strong>Note:</strong> Due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]], using this may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
        "api-help-param-direction": "In which direction to enumerate:\n;newer:List oldest first. Note: $1start has to be before $1end.\n;older:List newest first (default). Note: $1start has to be later than $1end.",
        "api-help-param-continue": "When more results are available, use this to continue.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(no description)</span>",
        "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-invalidoldimage": "The <var>oldimage</var> parameter has an 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-invalidsection": "The <var>section</var> 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-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-badid": "No revision was found for parameter <var>$1</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.",
index fd22eb2..3244801 100644 (file)
                        "Hamilton Abreu",
                        "Pompilos",
                        "Igv",
-                       "Fortega"
+                       "Fortega",
+                       "Luzcaru"
                ]
        },
-       "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> Todas las funciones mostradas en esta página deberían estar funcionando, pero la API aún está en desarrollo activo, y puede cambiar en cualquier momento. Suscribase a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] para aviso de actualizaciones.\n\n<strong>Erroneous requests:</strong> Cuando se envían solicitudes erróneas a la API, se enviará un encabezado HTTP con la clave \"MediaWiki-API-Error\" y, luego, el valor del encabezado y el código de error devuelto se establecerán en el mismo valor. Para más información ver [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Testing:</strong> Para facilitar la comprobación de las solicitudes de API, consulte [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Qué acción se realizará.",
        "apihelp-main-param-format": "El formato de la salida.",
-       "apihelp-main-param-maxlag": "El retraso (lag) máximo puede ser utilizado cuando MediaWiki está instalado en un conjunto de bases de datos replicadas. Para evitar cualquier acción que pudiera causar un retraso aún mayor en la replicación del sitio, este parámetro puede causar que el cliente espere hasta que el retraso de replicación sea menor que el valor especificado. En caso de exceso de retraso, se devuelve un código de error <samp>maxlag</samp> con un mensaje similar a <samp>Esperando a $host: $lag segundos de retraso</samp>.<br />Véase [[mw:Manual:Maxlag_parameter|Manual:Parámetro maxlag]] para más información.",
-       "apihelp-main-param-smaxage": "Establece el encabezado HTTP <code>s-maxage</code> de control de caché a esta cantidad de segundos. Los errores nunca se almacenan en caché.",
-       "apihelp-main-param-maxage": "Establece el encabezado HTTP <code>max-age</code> de control de caché a esta cantidad de segundos. Los errores nunca se almacenan en caché.",
+       "apihelp-main-param-maxlag": "El retraso máximo puede utilizarse cuando MediaWiki se instala en un clúster replicado de base de datos. Para guardar las acciones que causan más retardo de replicación de sitio, este parámetro puede hacer que el cliente espere hasta que el retardo de replicación sea menor que el valor especificado. En caso de retraso excesivo, se devuelve el código de error <samp>maxlag</samp> con un mensaje como <samp>Esperando a $host: $lag segundos de retraso</samp>.<br />Consulta [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: parámetro Maxlag]] para más información.",
+       "apihelp-main-param-smaxage": "Establece la cabecera HTTP <code>s-maxage</code> de control de antememoria a esta cantidad de segundos. Los errores nunca se almacenan en la antememoria.",
+       "apihelp-main-param-maxage": "Establece la cabecera HTTP <code>max-age</code> de control de antememoria a esta cantidad de segundos. Los errores nunca se almacenan en la antememoria.",
        "apihelp-main-param-assert": "Comprobar que el usuario haya iniciado sesión si el valor es <kbd>user</kbd> o si tiene el permiso de bot si es <kbd>bot</kbd>.",
        "apihelp-main-param-assertuser": "Verificar el usuario actual es el usuario nombrado.",
        "apihelp-main-param-requestid": "Cualquier valor dado aquí se incluirá en la respuesta. Se puede utilizar para distinguir solicitudes.",
@@ -57,7 +58,7 @@
        "apihelp-block-param-autoblock": "Bloquear automáticamente la última dirección IP y todas las direcciones IP que traten de iniciar sesión posteriormente.",
        "apihelp-block-param-noemail": "Evitar que el usuario envíe correos a través de la wiki (es necesario el derecho <code>blockemail</code>).",
        "apihelp-block-param-hidename": "Ocultar el nombre de usuario del registro de bloqueo (es necesario el derecho <coɗe>hideuser</code>).",
-       "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-allowusertalk": "Permitir que el usuario edite su propia página de discusión (depende de <var>[[mw:Special:MyLanguage/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-delete-param-reason": "Motivo de la eliminación. Si no se especifica, se generará uno automáticamente.",
        "apihelp-delete-param-tags": "Cambio de etiquetas para aplicar a la entrada en la eliminación del registro.",
        "apihelp-delete-param-watch": "Añadir esta página a la lista de seguimiento del usuario actual.",
-       "apihelp-delete-param-watchlist": "Incondicionalmente agregar o remover la página de la lista de seguimiento del usuario actual, usar las preferencias o no cambiar el seguimiento.",
+       "apihelp-delete-param-watchlist": "Añadir o quitar incondicionalmente la página de la lista de seguimiento del usuario actual, usar preferencias o no cambiar el estado de seguimiento.",
        "apihelp-delete-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.",
        "apihelp-delete-param-oldimage": "El nombre de la imagen antigua es proporcionado conforme a lo dispuesto por [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
        "apihelp-delete-example-simple": "Borrar <kbd>Main Page</kbd>.",
        "apihelp-edit-example-undo": "Deshacer intervalo de revisiones 13579-13585 con resumen automático",
        "apihelp-emailuser-description": "Enviar un mensaje de correo electrónico a un usuario.",
        "apihelp-emailuser-param-target": "Cuenta de usuario destinatario.",
-       "apihelp-emailuser-param-subject": "Encabezamiento de asunto.",
+       "apihelp-emailuser-param-subject": "Cabecera de asunto.",
        "apihelp-emailuser-param-text": "Cuerpo del mensaje.",
        "apihelp-emailuser-param-ccme": "Enviarme una copia de este mensaje.",
        "apihelp-emailuser-example-email": "Enviar un correo al usuario <kbd>WikiSysop</kbd> con el texto <kbd>Content</kbd>.",
        "apihelp-help-param-recursivesubmodules": "Incluir ayuda para submódulos recursivamente.",
        "apihelp-help-param-helpformat": "Formato de salida de la ayuda.",
        "apihelp-help-param-wrap": "Envolver el producto en una estructura de respuesta de la API estándar.",
-       "apihelp-help-param-toc": "Incluir una tabla de contenidos en la salida HTML.",
+       "apihelp-help-param-toc": "Incluir un sumario en la salida HTML.",
        "apihelp-help-example-main": "Ayuda del módulo principal",
        "apihelp-help-example-submodules": "Ayuda para <kbd>action=query</kbd> y todos sus submódulos.",
        "apihelp-help-example-recursive": "Toda la ayuda en una página",
        "apihelp-opensearch-param-search": "Buscar cadena.",
        "apihelp-opensearch-param-limit": "Número máximo de resultados que devolver.",
        "apihelp-opensearch-param-namespace": "Espacio de nombres que buscar.",
-       "apihelp-opensearch-param-suggest": "No hacer nada si <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> es falso.",
+       "apihelp-opensearch-param-suggest": "No hacer nada si <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> es falso.",
        "apihelp-opensearch-param-redirects": "Cómo manejar las redirecciones:\n;return: Volver a la propia redirección.\n;resolve: Volver a la página de destino. Puede devolver menos de $1limit resultados.\nPor motivos históricos, se utiliza \"return\" para $1format=json y \"resolve\" para otros formatos.",
        "apihelp-opensearch-param-format": "El formato de salida.",
        "apihelp-opensearch-param-warningsaserror": "Si las advertencias están planteadas con <kbd>format=json</kbd>, devolver un error de API en lugar de hacer caso omiso de ellas.",
        "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": "<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-headhtml": "Proporciona la <code>&lt;head&gt;</code> analizada de 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-limitreportdata": "Da el informe del límite de forma estructurada. No da datos si <var>$1disablelimitreport</var> está establecido.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Da la versión HTML del informe del límite. No da datos si <var>$1disablelimitreport</var> está establecido.",
        "apihelp-parse-paramvalue-prop-parsetree": "El árbol de análisis sintáctico XML del contenido de la revisión (requiere modelo de contenido <code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "Da las advertencias que se produjeron al analizar el contenido.",
        "apihelp-parse-param-pst": "Guardar previamente los cambios antes de transformar la entrada antes de analizarla. Sólo es válido cuando se utiliza con el texto.",
        "apihelp-parse-param-onlypst": "Guardar previamente los cambios antes de transformar (PST) en la entrada. Devuelve el mismo wikitexto, después de que un PST se ha aplicado. Sólo es válido cuando se utiliza con <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Incluye enlaces de idiomas proporcionados por las extensiones (para utilizar con <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-generatexml": "Generar árbol de análisis sintáctico XML (requiere modelo de contenido <code>$1</code>; sustituido por <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Analizar en modo de vista previa.",
        "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-disabletoc": "Omitir el sumario 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-purge-param-forcerecursivelinkupdate": "Actualizar la tabla de enlaces y todas las tablas de enlaces de cualquier página que use esta página como una plantilla.",
        "apihelp-purge-example-simple": "Purgar la <kbd>Main Page</kbd> y la página <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purgar las 10 primeras páginas del espacio de nombres principal.",
+       "apihelp-query-description": "Obtener datos de y sobre MediaWiki.\n\nTodas las modificaciones de datos tendrán que utilizar primero la consulta para adquirir un token para evitar el abuso desde sitios maliciosos.",
        "apihelp-query-param-prop": "Qué propiedades obtener para las páginas consultadas.",
        "apihelp-query-param-list": "Qué listas obtener.",
        "apihelp-query-param-meta": "Qué metadatos obtener.",
        "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-revisions": "Busque [[Special:ApiHelp/query+siteinfo|información del sitio]] y [[Special:ApiHelp/query+revisions|revisiones]] de <kbd>Main Page</kbd>.",
        "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+alldeletedrevisions-param-user": "Listar solo las revisiones de este usuario.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "No listar las revisiones de este usuario.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Listar solo las páginas en este espacio de nombres.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> Debido al [[mw:Manual:$wgMiserMode|modo avaro]], usar juntos <var>$1user</var> y <var>$1namespace</var> puede dar lugar a que se devuelvan menos de <var>$1limit</var> antes de continuar. En casos extremos, podrían devolverse cero resultados.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> debido al [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avaro]], usar juntos <var>$1user</var> y <var>$1namespace</var> puede dar lugar a que se devuelvan menos de <var>$1limit</var> resultados antes de continuar. En casos extremos, podrían devolverse cero resultados.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Cuando se utiliza como generador, generar títulos en lugar de identificadores de revisión.",
        "apihelp-query+alldeletedrevisions-example-user": "Listar las últimas 50 contribuciones borradas del usuario <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Listar las primeras 50 revisiones borradas en el espacio de nombres principal.",
-       "apihelp-query+allfileusages-description": "Listar todos los usos del archivo, incluyendo los que no existen.",
+       "apihelp-query+allfileusages-description": "Enumerar todos los usos del archivo, incluidos los que no existen.",
        "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-ids": "Agrega los ID de página de las páginas en uso (no se puede usar con $1unique).",
        "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+allfileusages-param-dir": "La dirección en la que se listará.",
        "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-ids": "Agrega el ID de página de la página de enlace (no se puede usar con <var>$1unique</var>).",
        "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+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+allpages-param-prexpiry": "¿Cuál término de protección para filtrar la página en:\n; Indefinida: Obtener sólo páginas con protección de vencimiento indefinida.\n; Definida: Obtener sólo las páginas con un definitivo (específico) vencimiento.\n; Todos: Obtener páginas con cualquier caducidad.",
        "apihelp-query+allpages-example-B": "Mostrar una lista de páginas que empiecen con la letra <kbd>B</kbd>.",
        "apihelp-query+allpages-example-generator": "Mostrar información acerca de 4 páginas que empiecen por la letra <kbd>T</kbd>.",
        "apihelp-query+allpages-example-generator-revisions": "Mostrar el contenido de las 2 primeras páginas que no redirijan y empiecen por <kbd>Re</kbd>.",
        "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+mystashedfiles-example-simple": "Obtenga la clave de archivo, el tamaño del archivo y el tamaño de los archivos en pixeles en el caché de carga del usuario actual.",
        "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-ids": "Agrega el ID de página de la página de redirección (no se puede usar con $1unique).",
        "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+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-securitysensitiveoperation": "Compruebe si el estado de autenticación actual del usuario es suficiente para la operación  sensible-seguridad especificada.",
        "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+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-description": "Obtener información de revisión eliminada.\n\nPuede ser utilizada de varias maneras:\n# Obtenga las revisiones eliminadas de un conjunto de páginas, estableciendo títulos o ID de paginas. Ordenadas por título y marca horaria.\n# Obtener datos sobre un conjunto de revisiones eliminadas estableciendo sus ID con identificación de revisión. Ordenado por ID de revisión.",
        "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+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-param-prop": "Propiedades del repositorio a obtener (puede haber más disponibles en algunos wikis):\n;apiurl:URL del repositorio API - útil para obtener información de imagen del servidor.\n;name:La clave del repositorio - usado in e.g. <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> y [[Special:ApiHelp/query+imageinfo|imageinfo]] devuelve valores.\n;displayname:El nombre legible del repositorio  wiki.\n;rooturl:Raíz URL para rutas de  imágenes.\n;local:Si ese repositorio es local o no.",
        "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+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-size": "Agrega el tamaño del archivo en bytes y la altura, el ancho y el número de páginas (si aplica).",
        "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-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-paramvalue-prop-uploadwarning": "Usado por la página de Carga Especial para obtener información sobre un archivo existente. No está diseñado para ser utilizado fuera del núcleo MediaWiki.",
+       "apihelp-query+imageinfo-paramvalue-prop-badfile": "Añade si el archivo está en la [[MediaWiki:Bad image list]]",
        "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-urlwidth": "Si se establece $2prop=url, se devolverá una URL a una imagen escalada a este ancho.\nPor razones de rendimiento, si se utiliza esta opción, no se devolverán más de $1 imágenes escaladas.",
        "apihelp-query+imageinfo-param-urlheight": "Similar a $1urlwidth.",
        "apihelp-query+imageinfo-param-metadataversion": "Versión de los metadatos que se utilizará. Si se especifica <kbd>latest</kbd>, utilizará la última versión. El valor predeterminado es <kbd>1</kbd>, por motivo de retrocompatibilidad.",
+       "apihelp-query+imageinfo-param-extmetadatalanguage": "En qué idioma obtener «extmetadata». Esto afecta tanto la traducción que se obtendrá ―si hay varias― como el formato de elementos como los números y algunos valores.",
+       "apihelp-query+imageinfo-param-extmetadatamultilang": "Si las traducciones para la propiedad extmetadata están disponibles, busque todas ellas.",
        "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-param-badfilecontexttitle": "Si <kbd>$2prop=badfile</kbd> está establecido, este es el título de la página utilizado al evaluar la [[MediaWiki:Bad image list]]",
        "apihelp-query+imageinfo-param-localonly": "Buscar solo archivos en el repositorio local.",
        "apihelp-query+imageinfo-example-simple": "Obtener información sobre la versión actual de [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "Obtener información sobre las versiones de [[:File:Test.jpg]] a partir de 2008.",
        "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-watched": "Muestra el estado de seguimiento de cada página.",
+       "apihelp-query+info-paramvalue-prop-watchers": "El número de observadores, si se permite.",
+       "apihelp-query+info-paramvalue-prop-visitingwatchers": "El número de observadores de cada página que ha visitado ediciones recientes a esa página, si se permite.",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "La hora de notificación de la lista de seguimiento de cada página.",
        "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+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-url": "Si desea obtener la URL completa (no se puede usar con $1prop).",
        "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-title": "El enlace Interwiki para buscar. Debe utilizarse con <var>$1prefix </var>.",
        "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-description": "Encuentra todas las páginas que conectan con el enlace de idioma dado.\n\nPuede utilizarse para encontrar todos los enlaces con un código de idioma, o todos los enlaces a un título (con un idioma dado). El uso de ninguno de los parámetros es efectivamente \"todos los enlaces de idioma\".\n\nTenga en cuenta que esto no puede considerar los enlaces de idiomas agregados por extensiones.",
        "apihelp-query+langbacklinks-param-lang": "Idioma del enlace de idioma.",
+       "apihelp-query+langbacklinks-param-title": "Enlace de idioma para buscar. Debe utilizarse con $1lang.",
        "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-paramvalue-prop-lllang": "Agrega el código de idioma del enlace de idioma.",
        "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-generator": "Obtenga información sobre las páginas de enlace en la página <kbd>Página principal</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+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-description": "Realice una búsqueda de prefijo de títulos de página.\n\nA pesar de la similitud en los nombres, este módulo no pretende ser equivalente a [[Special:PrefixIndex]]; para eso, vea <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> con el parámetro <kbd> apprefix</kbd>. El propósito de este módulo es similar a <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd>: para tomar la entrada del usuario y proporcionar los mejores títulos coincidentes. Dependiendo del motor de búsqueda backend, esto puede incluir la corrección de errores, redirigir la evasión, u otras heurísticas.",
        "apihelp-query+prefixsearch-param-search": "Buscar cadena.",
        "apihelp-query+prefixsearch-param-namespace": "Espacio de nombres que buscar.",
        "apihelp-query+prefixsearch-param-limit": "Número máximo de resultados que devolver.",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Agrega el nivel de protección.",
        "apihelp-query+protectedtitles-example-simple": "Listar títulos protegidos.",
        "apihelp-query+protectedtitles-example-generator": "Encuentra enlaces a títulos protegidos en el espacio de nombres principal.",
-       "apihelp-query+querypage-param-page": "El nombre de la página especial. Recuerda, es sensible a mayúsculas y minúsculas.",
+       "apihelp-query+querypage-description": "Obtenga una lista proporcionada por una página especial basada en QueryPage.",
+       "apihelp-query+querypage-param-page": "El nombre de la página especial. Recuerda, distingue 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-description": "Obtener un conjunto de páginas aleatorias.\n\nLas páginas aparecen enumeradas en una secuencia fija, solo que el punto de partida es aleatorio. Esto quiere decir que, si, por ejemplo, <samp>Portada</samp> es la primera página aleatoria de la lista, <samp>Lista de monos ficticios</samp> <em>siempre</em> será la segunda, <samp>Lista de personas en sellos de Vanuatu</samp> la tercera, etc.",
        "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-paramvalue-prop-sha1": "Añade la suma de comprobación de contenido para las entradas asociadas a una revisión.",
        "apihelp-query+recentchanges-param-token": "Usa <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> en su lugar.",
        "apihelp-query+recentchanges-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+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-param-generaterevisions": "Cuando se utilice como generador, genera identificadores de revisión en lugar de títulos. Las entradas en la lista de cambios recientes que no tengan identificador de revisión asociado (por ejemplo, la mayoría de las entradas de registro) no generarán nada.",
        "apihelp-query+recentchanges-example-simple": "Lista de cambios recientes.",
        "apihelp-query+recentchanges-example-generator": "Obtener información de página de cambios recientes no patrullados.",
        "apihelp-query+redirects-description": "Devuelve todas las redirecciones a las páginas dadas.",
        "apihelp-query+redirects-paramvalue-prop-fragment": "Fragmento de cada redirección, si los hubiere.",
        "apihelp-query+redirects-param-namespace": "Incluir solo páginas de estos espacios de nombres.",
        "apihelp-query+redirects-param-limit": "Cuántas redirecciones se devolverán.",
+       "apihelp-query+redirects-param-show": "Mostrar únicamente los elementos que cumplan con estos criterios:\n;fragment: mostrar solo redirecciones con fragmento.\n;!fragment: mostrar solo redirecciones sin fragmento.",
        "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-description": "Obtener información de la revisión.\n\nPuede ser utilizado de varias maneras:\n# Obtener datos sobre un conjunto de páginas (última revisión), estableciendo títulos o ID de paginas.\n# Obtener revisiones para una página determinada, usando títulos o ID de páginas con inicio, fin o límite.\n# Obtener datos sobre un conjunto de revisiones estableciendo sus ID con revids.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "Solo se puede usar con una sola página (modo n.º 2).",
        "apihelp-query+revisions-param-startid": "Identificador de revisión a partir del cual empezar la enumeración.",
        "apihelp-query+revisions-param-endid": "Identificador de revisión en el que detener la enumeración.",
        "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-param-enablerewrites": "Habilitar 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-restrictions": "Devuelve información sobre tipos de restricciones (protección) disponible.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Devuelve una lista de los idiomas que admite MediaWiki (opcionalmente localizada mediante el uso de <var>$1inlanguagecode</var>).",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Devuelve una lista de todos las apariencias habilitadas (opcionalmente localizada mediante el uso de <var>$1inlanguagecode</var>, de lo contrario en el idioma del contenido).",
+       "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devuelve una lista de las etiquetas extensoras del analizador.",
        "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+usercontribs-paramvalue-prop-flags": "Añade las marcas de la edición.",
        "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-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>, no se mostrarán las revisiones con una antigüedad mayor que <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|segundo|segundos}}).",
        "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+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-groupmemberships": "Enumera los grupos a los que se ha asignado explícitamente al usuario actual, incluida la fecha de expiración de la pertenencia a cada grupo.",
        "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-setnotificationtimestamp-example-pagetimestamp": "Fijar la marca de tiempo de notificación de <kbd>Main page</kbd> para que todas las ediciones posteriores al 1 de enero de 2012 estén consideradas como no vistas.",
        "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-description-disabled": "En este wiki no se permite modificar el idioma de las páginas.\n\nActiva <var>[[mw:Special:MyLanguage/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-xml-param-includexmlnamespace": "Si se especifica, añade un espacio de nombres XML.",
        "apihelp-xmlfm-description": "Producir los datos de salida en formato XML (con resaltado sintáctico en HTML).",
        "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-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:Special:MyLanguage/API|documentación completa]] o la [[Special:ApiHelp/main|ayuda de API]].",
+       "api-format-prettyprint-header-only-html": "Esta es una representación en HTML destinada a la depuración, y no es adecuada para el uso de la aplicación.\n\nVéase la [[mw:Special:MyLanguage/API|documentación completa]] o la [[Special:ApiHelp/main|página de ayuda de la API]] para más información.",
        "api-format-prettyprint-status": "Esta respuesta se devolvería con el estado HTTP $1 $2.",
        "api-pageset-param-titles": "Una lista de títulos en los que trabajar.",
        "api-pageset-param-pageids": "Una lista de identificadores de páginas en las que trabajar.",
        "api-pageset-param-generator": "Obtener la lista de páginas en las que trabajar mediante la ejecución del módulo de consulta especificado.\n\n<strong>Nota:</strong> Los nombres de los parámetros del generador deben prefijarse con una «g», véanse los ejemplos.",
        "api-pageset-param-redirects-generator": "Resolver automáticamente las redirecciones en <var>$1titles</var>, <var>$1pageids</var>, y <var>$1revids</var> y en las páginas devueltas por <var>$1generator</var>.",
        "api-pageset-param-redirects-nogenerator": "Resolver automáticamente las redirecciones en <var>$1titles</var>, <var>$1pageids</var> y <var>$1revids</var>.",
+       "api-pageset-param-converttitles": "Convertir los títulos a otras variantes, si es necesario. Solo funciona si el idioma del contenido del wiki admite la conversión entre variantes. La conversión entre variantes está habilitada en idiomas tales como $1.",
        "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-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-disabled-in-miser-mode": "Deshabilitado debido al [[mw:Manual:$wgMiserMode|modo avaro]].",
-       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> Debido al [[mw:Manual:$wgMiserMode|modo avaro]], usar esto puede dar lugar a que se devuelvan menos de <var>$1limit</var> antes de continuar. En casos extremos, podrían devolverse cero resultados.",
+       "api-help-param-disabled-in-miser-mode": "Deshabilitado debido al [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avaro]].",
+       "api-help-param-limited-in-miser-mode": "strong>Nota:</strong> Debido al [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avaro]], usar esto puede dar lugar a que se devuelvan menos de <var>$1limit</var> antes de continuar. En casos extremos, podrían devolverse cero resultados.",
        "api-help-param-direction": "En qué sentido hacer la enumeración:\n;newer: De más antiguos a más recientes. Nota: $1start debe ser anterior a $1end.\n;older: De más recientes a más antiguos (orden predefinido). Nota: $1start debe ser posterior a $1end.",
        "api-help-param-continue": "Cuando haya más resultados disponibles, utiliza esto para continuar.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(sin descripción)</span>",
        "apierror-changeauth-norequest": "No se ha podido crear la petición de modificación.",
        "apierror-compare-inputneeded": "Se necesita un título, un identificador de página o un número de revisión tanto para el parámetro <var>from</var> como para el parámetro <var>to</var>.",
        "apierror-contentserializationexception": "La serialización de contenido falló: $1",
+       "apierror-contenttoobig": "El contenido que has suministrado supera el tamaño máximo de archivo de $1 {{PLURAL:$1|kilobyte|kilobytes}}.",
+       "apierror-copyuploadbaddomain": "No se permite realizar cargas a partir de este dominio.",
+       "apierror-copyuploadbadurl": "No se permite realizar cargas a partir de este URL.",
        "apierror-create-titleexists": "Los títulos existentes no se pueden proteger con <kbd>create</kbd>.",
        "apierror-csp-report": "Error de procesamiento del informe CSP: $1.",
        "apierror-databaseerror": "[$1] Error en la consulta de la base de datos.",
        "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-invalidsection": "El parámetro <var>section</var> debe ser un identificador 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-reauthenticate": "No te has autentificado recientemente en esta sesión. Por favor, vuelve a autentificarte.",
        "apierror-revdel-mutuallyexclusive": "No se puede usar el mismo campo en <var>hide</var> y <var>show</var>.",
        "apierror-revdel-paramneeded": "Se requiere al menos un valor para <var>hide</var> y/o <var>show</var>.",
+       "apierror-revisions-badid": "No se encontró ninguna revisión para el parámetro <var>$1</var>.",
        "apierror-revisions-norevids": "El parámetro <var>revids</var> no se puede utilizar junto con las opciones de lista (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> y <var>$1end</var>).",
        "apierror-revisions-singlepage": "Se utilizó <var>titles</var>, <var>pageids</var> o un generador para proporcionar múltiples páginas, pero los parámetros <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> y <var>$1end</var> solo se pueden utilizar en una sola página.",
        "apierror-revwrongpage": "r$1 no es una revisión de $2.",
+       "apierror-searchdisabled": "Se ha desactivado la búsqueda de «<var>$1</var>».",
        "apierror-sectionreplacefailed": "No se ha podido combinar la sección actualizada.",
        "apierror-sectionsnotsupported": "Las secciones no son compatibles con el modelo de contenido $1.",
        "apierror-sectionsnotsupported-what": "Las secciones no son compatibles con $1.",
index 2ae81d4..daaf0c0 100644 (file)
        "apihelp-help-param-helpformat": "قالب‌بندی خروجی راهنما.",
        "apihelp-help-example-main": "راهنما برای پودمان اصلی",
        "apihelp-help-example-recursive": "همهٔ راهنما در یک صفحه",
-       "apihelp-help-example-help": "راهنما برای خود ماژول راهنما",
-       "apihelp-help-example-query": "راهنما برای دو زیر پودمان کوئری",
+       "apihelp-help-example-help": "راهنمایی برای خود راهنما.",
+       "apihelp-help-example-query": "راهنما برای دو زیرپودمانِ پرسمان",
        "apihelp-imagerotate-description": "چرخاندن یک یا چند تصویر",
        "apihelp-imagerotate-param-rotation": "درجه برای چرخاندن تصویر در جهت ساعت‌گرد.",
        "apihelp-imagerotate-example-simple": "چرخاندن <kbd>۹۰</kbd> درجه برای <kbd>File:Example.png</kbd>",
index 4c36cc3..4674dd2 100644 (file)
                        "The RedBurn"
                ]
        },
-       "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 Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Test :</strong> Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Test :</strong> Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Quelle action effectuer.",
        "apihelp-main-param-format": "Le format de sortie.",
-       "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Manual:Maxlag_parameter|Manuel: Maxlag parameter]] pour plus d’information.",
+       "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel: Maxlag parameter]] pour plus d’information.",
        "apihelp-main-param-smaxage": "Fixer l’entête HTTP de contrôle de cache <code>s-maxage</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
        "apihelp-main-param-maxage": "Fixer l’entête HTTP de contrôle de cache <code>max-age</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
        "apihelp-main-param-assert": "Vérifier si l’utilisateur est connecté si positionné à <kbd>user</kbd>, ou s'il a le droit d'un utilisateur robot si positionné à <kbd>bot</kbd>.",
@@ -57,7 +57,7 @@
        "apihelp-block-param-autoblock": "Bloquer automatiquement la dernière adresse IP utilisée, et toute les adresses IP subséquentes depuis lesquelles ils ont essayé de se connecter.",
        "apihelp-block-param-noemail": "Empêcher l’utilisateur d’envoyer des courriels via le wiki (nécessite le droit <code>blockemail</code>).",
        "apihelp-block-param-hidename": "Masque le nom de l’utilisateur dans le journal des blocages (nécessite le droit <code>hideuser</code>).",
-       "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-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de <var>[[mw:Special:MyLanguage/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-feedwatchlist-example-all6hrs": "Afficher toutes les modifications sur les pages suivies dans les dernières 6 heures",
        "apihelp-filerevert-description": "Rétablir un fichier dans une ancienne version.",
        "apihelp-filerevert-param-filename": "Nom de fichier cible, sans le préfixe File:.",
-       "apihelp-filerevert-param-comment": "Télécharger le commentaire.",
+       "apihelp-filerevert-param-comment": "Téléverser le commentaire.",
        "apihelp-filerevert-param-archivename": "Nom d’archive de la révision à rétablir.",
        "apihelp-filerevert-example-revert": "Rétablir <kbd>Wiki.png</kbd> dans la version du <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-description": "Afficher l’aide pour les modules spécifiés.",
        "apihelp-help-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-param-tags": "Balises à appliquer à l’entrée dans le journal de téléversement.",
        "apihelp-imagerotate-example-simple": "Faire pivoter <kbd>File:Example.png</kbd> de <kbd>90</kbd> degrés.",
        "apihelp-imagerotate-example-generator": "Faire pivoter toutes les images de <kbd>Category:Flip</kbd> de <kbd>180</kbd> degrés.",
        "apihelp-import-description": "Importer une page depuis un autre wiki, ou depuis un fichier XML.\n\nNoter que le POST HTTP doit être effectué comme un import de fichier (c’est-à-dire en utilisant multipart/form-data) lors de l’envoi d’un fichier pour le paramètre <var>xml</var>.",
        "apihelp-import-param-summary": "Résumé de l’importation de l’entrée de journal.",
-       "apihelp-import-param-xml": "Fichier XML téléchargé.",
+       "apihelp-import-param-xml": "Fichier XML téléversé.",
        "apihelp-import-param-interwikisource": "Pour les importations interwiki : wiki depuis lequel importer.",
        "apihelp-import-param-interwikipage": "Pour les importations interwiki : page à importer.",
        "apihelp-import-param-fullhistory": "Pour les importations interwiki : importer tout l’historique, et pas seulement la version courante.",
        "apihelp-opensearch-param-search": "Chaîne de caractères cherchée.",
        "apihelp-opensearch-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-opensearch-param-namespace": "Espaces de nom à rechercher.",
-       "apihelp-opensearch-param-suggest": "Ne rien faire si <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> vaut faux.",
+       "apihelp-opensearch-param-suggest": "Ne rien faire si <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> vaut faux.",
        "apihelp-opensearch-param-redirects": "Comment gérer les redirections :\n;return:Renvoie la redirection elle-même.\n;resolve:Renvoie la page cible. Peut renvoyer moins de $1limit résultats.\nPour des raisons historiques, la valeur par défaut est « return » pour $1format=json et « resolve » pour les autres formats.",
        "apihelp-opensearch-param-format": "Le format de sortie.",
        "apihelp-opensearch-param-warningsaserror": "Si des avertissements apparaissent avec <kbd>format=json</kbd>, renvoyer une erreur d’API au lieu de les ignorer.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Fournit le rapport de limite d’une manière structurée. Ne fournit aucune donnée, si <var>$1disablelimitreport</var> est positionné.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Fournit la version HTML du rapport de limite. Ne fournit aucune donnée, si <var>$1disablelimitreport</var> est positionné.",
        "apihelp-parse-paramvalue-prop-parsetree": "L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu <code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "Fournit les messages d'avertissement qui sont apparus lors de l'analyse de contenu.",
+       "apihelp-parse-param-wrapoutputclass": "classe CSS à utiliser pour formater la sortie de l'analyseur.",
        "apihelp-parse-param-pst": "Faire une transformation avant enregistrement de l’entrée avant de l’analyser. Valide uniquement quand utilisé avec du texte.",
        "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-preview": "Analyser en mode aperçu.",
        "apihelp-parse-param-sectionpreview": "Analyser en mode aperçu de section (active aussi le mode aperçu).",
        "apihelp-parse-param-disabletoc": "Omettre la table des matières dans la sortie.",
+       "apihelp-parse-param-useskin": "Appliquer l’habillage sélectionné à la sortie de l’analyseur. Cela peut affecter les propriétés suivantes : <kbd>langlinks</kbd>, <kbd>headitems</kbd>, <kbd>modules</kbd>, <kbd>jsconfigvars</kbd>, <kbd>indicators</kbd>.",
        "apihelp-parse-param-contentformat": "Format de sérialisation du contenu utilisé pour le texte d’entrée. Valide uniquement si utilisé avec $1text.",
        "apihelp-parse-param-contentmodel": "Modèle de contenu du texte d’entrée. Si omis, $1title doit être spécifié, et la valeur par défaut sera le modèle du titre spécifié. Valide uniquement quand utilisé avec $1text.",
        "apihelp-parse-example-page": "Analyser une page.",
        "apihelp-query+alldeletedrevisions-param-user": "Lister uniquement les révisions par cet utilisateur.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Ne pas lister les révisions par cet utilisateur.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>REMARQUE :</strong> du fait du [[mw:Manual:$wgMiserMode|mode minimal]], utiliser <var>$1user</var> et <var>$1namespace</var> ensemble peut aboutir à moins de résultats renvoyés que <var>$1limit</var> avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>REMARQUE :</strong> du fait du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]], utiliser <var>$1user</var> et <var>$1namespace</var> ensemble peut aboutir à avoir moins de résultats renvoyés que <var>$1limit</var> avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Utilisé comme générateur, générer des titres plutôt que des IDs de révision.",
        "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par l'utilisateur <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal.",
        "apihelp-query+allimages-param-maxsize": "Restreindre aux images avec au plus ce nombre d’octets.",
        "apihelp-query+allimages-param-sha1": "Hachage SHA1 de l’image. Écrase $1sha1base36.",
        "apihelp-query+allimages-param-sha1base36": "Hachage SHA1 de l’image en base 36 (utilisé dans MediaWiki).",
-       "apihelp-query+allimages-param-user": "Renvoyer seulement les fichiers téléchargés par cet utilisateur. Utilisable uniquement avec $1sort=timestamp. Impossible à utiliser avec $1filterbots.",
-       "apihelp-query+allimages-param-filterbots": "Comment filtrer les fichiers téléchargés par des robots. Peut être utilisé uniquement avec $1sort=timestamp. Impossible à utiliser avec $1user.",
+       "apihelp-query+allimages-param-user": "Renvoyer seulement les fichiers téléversés par cet utilisateur. Utilisable uniquement avec $1sort=timestamp. Impossible à utiliser avec $1filterbots.",
+       "apihelp-query+allimages-param-filterbots": "Comment filtrer les fichiers téléversés par des robots. Peut être utilisé uniquement avec $1sort=timestamp. Impossible à utiliser avec $1user.",
        "apihelp-query+allimages-param-mime": "Quels types MIME rechercher, par ex. <kbd>image/jpeg</kbd>.",
        "apihelp-query+allimages-param-limit": "Combien d’images renvoyer au total.",
        "apihelp-query+allimages-example-B": "Afficher une liste des fichiers commençant par la lettre <kbd>B</kbd>.",
-       "apihelp-query+allimages-example-recent": "Afficher une liste de fichiers récemment téléchargés, semblable à [[Special:NewFiles]].",
+       "apihelp-query+allimages-example-recent": "Afficher une liste de fichiers récemment téléversés, semblable à [[Special:NewFiles]].",
        "apihelp-query+allimages-example-mimetypes": "Afficher une liste de fichiers avec le type MIME <kbd>image/png</kbd> ou <kbd>image/gif</kbd>",
        "apihelp-query+allimages-example-generator": "Afficher l’information sur 4 fichiers commençant par la lettre <kbd>T</kbd>.",
        "apihelp-query+alllinks-description": "Énumérer tous les liens pointant vers un espace de noms donné.",
        "apihelp-query+allrevisions-param-generatetitles": "Utilisé comme générateur, génère des titres plutôt que des IDs de révision.",
        "apihelp-query+allrevisions-example-user": "Lister les 50 dernières contributions de l’utilisateur <kbd>Example</kbd>.",
        "apihelp-query+allrevisions-example-ns-main": "Lister les 50 premières révisions dans l’espace de noms principal.",
-       "apihelp-query+mystashedfiles-description": "Obtenir une liste des fichiers dans le cache de téléchargement de l’utilisateur actuel",
+       "apihelp-query+mystashedfiles-description": "Obtenir une liste des fichiers dans le cache de téléversement de l’utilisateur actuel",
        "apihelp-query+mystashedfiles-param-prop": "Quelles propriétés récupérer pour les fichiers.",
        "apihelp-query+mystashedfiles-paramvalue-prop-size": "Récupérer la taille du fichier et les dimensions de l’image.",
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "Récupérer le type MIME du fichier et son type de média.",
        "apihelp-query+mystashedfiles-param-limit": "Combien de fichiers obtenir.",
-       "apihelp-query+mystashedfiles-example-simple": "Obtenir la clé du fichier, sa taille, et la taille en pixel des fichiers dans le cache de téléchargement de l’utilisateur actuel.",
+       "apihelp-query+mystashedfiles-example-simple": "Obtenir la clé du fichier, sa taille, et la taille en pixels des fichiers dans le cache de téléversement de l’utilisateur actuel.",
        "apihelp-query+alltransclusions-description": "Lister toutes les transclusions (pages intégrées en utilisant &#123;&#123;x&#125;&#125;), y compris les inexistantes.",
        "apihelp-query+alltransclusions-param-from": "Le titre de la transclusion depuis lequel commencer l’énumération.",
        "apihelp-query+alltransclusions-param-to": "Le titre de la transclusion auquel arrêter l’énumération.",
        "apihelp-query+deletedrevs-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
        "apihelp-query+deletedrevs-param-limit": "Le nombre maximal de révisions à lister.",
        "apihelp-query+deletedrevs-param-prop": "Quelles propriétés obtenir :\n;revid:Ajoute l’ID de la révision supprimée.\n;parentid:Ajoute l’ID de la révision précédente de la page.\n;user:Ajoute l’utilisateur ayant fait la révision.\n;userid:Ajoute l’ID de l’utilisateur qui a fait la révision.\n;comment:Ajoute le commentaire de la révision.\n;parsedcomment:Ajoute le commentaire analysé de la révision.\n;minor:Marque si la révision est mineure.\n;len:Ajoute la longueur (en octets) de la révision.\n;sha1:Ajoute le SHA-1 (base 16) de la révision.\n;content:Ajoute le contenu de la révision.\n;token:<span class=\"apihelp-deprecated\">Obsolète.</span> Fournit le jeton de modification.\n;tags:Balises pour la révision.",
-       "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées de des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec le contenu (mode 1).",
+       "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec le contenu (mode 1).",
        "apihelp-query+deletedrevs-example-mode2": "Lister les 50 dernières contributions de <kbd>Bob</kbd> supprimées (mode 2).",
        "apihelp-query+deletedrevs-example-mode3-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal (mode 3)",
        "apihelp-query+deletedrevs-example-mode3-talk": "Lister les 50 premières pages supprimées dans l’espace de noms {{ns:talk}} (mode 3).",
        "apihelp-query+filearchive-param-sha1base36": "Hachage SHA1 de l’image en base 36 (utilisé dans MédiaWiki).",
        "apihelp-query+filearchive-param-prop": "Quelle information obtenir sur l’image :",
        "apihelp-query+filearchive-paramvalue-prop-sha1": "Ajoute le hachage SHA-1 pour l’image.",
-       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Ajoute l’horodatage pour la version téléchargée.",
-       "apihelp-query+filearchive-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléchargé la version de l’image.",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Ajoute l’horodatage à la version téléversée.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléversé la version de l’image.",
        "apihelp-query+filearchive-paramvalue-prop-size": "Ajoute la taille de l’image en octets et la hauteur, la largeur et le nombre de page (si c’est applicable).",
        "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias pour la taille.",
        "apihelp-query+filearchive-paramvalue-prop-description": "Ajoute la description de la version de l’image.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.",
        "apihelp-query+filearchive-example-simple": "Afficher une liste de tous les fichiers supprimés",
        "apihelp-query+filerepoinfo-description": "Renvoyer les méta-informations sur les référentiels d’images configurés dans le wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans les valeurs de retour de <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> et [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.",
+       "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans les valeurs de retour de <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> et [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.",
        "apihelp-query+filerepoinfo-example-simple": "Obtenir des informations sur les référentiels de fichier.",
        "apihelp-query+fileusage-description": "Trouver toutes les pages qui utilisent les fichiers donnés.",
        "apihelp-query+fileusage-param-prop": "Quelles propriétés obtenir :",
        "apihelp-query+fileusage-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+fileusage-example-simple": "Obtenir une liste des pages utilisant [[:File:Example.jpg]]",
        "apihelp-query+fileusage-example-generator": "Obtenir l’information sur les pages utilisant [[:File:Example.jpg]]",
-       "apihelp-query+imageinfo-description": "Renvoyer l’information de fichier et l’historique de téléchargement.",
+       "apihelp-query+imageinfo-description": "Renvoyer l’information de fichier et l’historique de téléversement.",
        "apihelp-query+imageinfo-param-prop": "Quelle information obtenir du fichier :",
-       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Ajoute l’horodatage à la version téléchargée.",
-       "apihelp-query+imageinfo-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléchargé chaque version du fichier.",
-       "apihelp-query+imageinfo-paramvalue-prop-userid": "Ajouter l’ID de l’utilisateur qui a téléchargé chaque version du fichier.",
+       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Ajoute l’horodatage à la version téléversée.",
+       "apihelp-query+imageinfo-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléversé chaque version du fichier.",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "Ajouter l’ID de l’utilisateur qui a téléversé chaque version du fichier.",
        "apihelp-query+imageinfo-paramvalue-prop-comment": "Commentaire sur la version.",
        "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Analyser le commentaire de la version.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Ajoute le titre canonique du fichier.",
        "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-limit": "Combien de révisions 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-urlwidth": "Si $2prop=url est défini, une URL vers une image à l’échelle de cette largeur sera renvoyée.\nPour des raisons de performance si cette option est utilisée, pas plus de $1 images mises à l’échelle seront renvoyées.",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "Ajoute le nom natif de la langue.",
        "apihelp-query+langlinks-param-lang": "Renvoyer uniquement les liens interlangue avec ce code de langue.",
        "apihelp-query+langlinks-param-title": "Lien à rechercher. Doit être utilisé avec <var>$1lang</var>.",
-       "apihelp-query+langlinks-param-dir": "La direction dans laquelle énumérer.",
+       "apihelp-query+langlinks-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+langlinks-param-inlanguagecode": "Code de langue pour les noms de langue localisés.",
        "apihelp-query+langlinks-example-simple": "Obtenir les liens interlangue de la page <kbd>Main Page</kbd>.",
        "apihelp-query+links-description": "Renvoie tous les liens des pages fournies.",
-       "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de nom.",
+       "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de noms.",
        "apihelp-query+links-param-limit": "Combien de liens renvoyer.",
        "apihelp-query+links-param-titles": "Lister uniquement les liens vers ces titres. Utile pour vérifier si une certaine page a un lien vers un titre donné.",
        "apihelp-query+links-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+links-example-simple": "Obtenir les liens de la page <kbd>Main Page</kbd>",
        "apihelp-query+links-example-generator": "Obtenir des informations sur tous les liens de page dans <kbd>Main Page</kbd>.",
-       "apihelp-query+links-example-namespaces": "Obtenir les liens de la page <kbd>Accueil</kbd> dans les espaces de nom {{ns:user}} et {{ns:template}}.",
+       "apihelp-query+links-example-namespaces": "Obtenir les liens de la page <kbd>Main Page</kbd> dans les espaces de nom {{ns:user}} et {{ns:template}}.",
        "apihelp-query+linkshere-description": "Trouver toutes les pages ayant un lien vers les pages données.",
        "apihelp-query+linkshere-param-prop": "Quelles propriétés obtenir :",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "ID de chaque page.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Titre de chaque page.",
        "apihelp-query+linkshere-paramvalue-prop-redirect": "Indique si la page est une redirection.",
-       "apihelp-query+linkshere-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
+       "apihelp-query+linkshere-param-namespace": "Inclure uniquement les pages dans ces espaces de noms.",
        "apihelp-query+linkshere-param-limit": "Combien de résultats renvoyer.",
        "apihelp-query+linkshere-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+linkshere-example-simple": "Obtenir une liste des pages liées à  [[Main Page]]",
        "apihelp-query+logevents-description": "Obtenir des événements des journaux.",
        "apihelp-query+logevents-param-prop": "Quelles propriétés obtenir :",
        "apihelp-query+logevents-paramvalue-prop-ids": "Ajoute l’ID de l’événement.",
-       "apihelp-query+logevents-paramvalue-prop-title": "Ajoute le titre de la page pour l’événement.",
-       "apihelp-query+logevents-paramvalue-prop-type": "Ajoute le type de l’événement.",
+       "apihelp-query+logevents-paramvalue-prop-title": "Ajoute le titre de la page pour l’événement enregistré.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Ajoute le type de l’événement enregistré.",
        "apihelp-query+logevents-paramvalue-prop-user": "Ajoute l’utilisateur responsable de l’événement.",
        "apihelp-query+logevents-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur responsable de l’événement.",
        "apihelp-query+logevents-paramvalue-prop-timestamp": "Ajoute l’horodatage de l’événement.",
        "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé de l’événement.",
        "apihelp-query+logevents-paramvalue-prop-details": "Liste les détails supplémentaires sur l’événement.",
        "apihelp-query+logevents-paramvalue-prop-tags": "Liste les balises de l’événement.",
-       "apihelp-query+logevents-param-type": "Filtrer les entrées du journal à ce seul type.",
-       "apihelp-query+logevents-param-action": "Filtrer les actions du journal à cette seule action. Écrase <var>$1type</var>. La présence d'une valeur avec un astérisque dans la liste, comme <var>$1type</var>, indique qu'une chaîne arbitraire peut être passée dans dans la requête à la place de l'astérisque.",
+       "apihelp-query+logevents-param-type": "Filtrer les entrées du journal sur ce seul type.",
+       "apihelp-query+logevents-param-action": "Filtrer les actions du journal sur cette seule action. Écrase <var>$1type</var>. Dans la liste des valeurs possibles, les valeurs suivies d'un astérisque, comme <kbd>action/*</kbd>, peuvent avoir différentes chaînes après le slash.",
        "apihelp-query+logevents-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+logevents-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+logevents-param-user": "Restreindre aux entrées générées par l’utilisateur spécifié.",
        "apihelp-query+logevents-param-title": "Restreindre aux entrées associées à une page donnée.",
-       "apihelp-query+logevents-param-namespace": "Restreindre aux entrées dans l’espace de nom spécifié.",
+       "apihelp-query+logevents-param-namespace": "Restreindre aux entrées dans l’espace de noms spécifié.",
        "apihelp-query+logevents-param-prefix": "Restreindre aux entrées commençant par ce préfixe.",
        "apihelp-query+logevents-param-tag": "Lister seulement les entrées ayant cette balise.",
        "apihelp-query+logevents-param-limit": "Combien d'entrées renvoyer au total.",
        "apihelp-query+pageswithprop-example-generator": "Obtenir des informations supplémentaires sur les 10 premières pages utilisant <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-description": "Effectuer une recherche de préfixe sur les titres de page.\n\nMalgré les similarités dans le nom, ce module n’est pas destiné à être l’équivalent de [[Special:PrefixIndex]] ; pour cela, voyez <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> avec le paramètre <kbd>apprefix</kbd>. Le but de ce module est similaire à <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd> : prendre l’entrée utilisateur et fournir les meilleurs titres s’en approchant. Selon le serveur du moteur de recherche, cela peut inclure corriger des fautes de frappe, éviter des redirections, ou d’autres heuristiques.",
        "apihelp-query+prefixsearch-param-search": "Chaîne de recherche.",
-       "apihelp-query+prefixsearch-param-namespace": "Espaces de nom à rechercher.",
+       "apihelp-query+prefixsearch-param-namespace": "Espaces de noms à rechercher.",
        "apihelp-query+prefixsearch-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-query+prefixsearch-param-offset": "Nombre de résultats à sauter.",
        "apihelp-query+prefixsearch-example-simple": "Rechercher les titres de page commençant par <kbd>meaning</kbd>.",
        "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Ajoute l’horodatage de levée de la protection.",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Ajoute le niveau de protection.",
        "apihelp-query+protectedtitles-example-simple": "Lister les titres protégés",
-       "apihelp-query+protectedtitles-example-generator": "Trouver les liens vers les titres protégés dans l’espace de noms principal",
-       "apihelp-query+querypage-description": "Obtenir une liste fournie par une page spéciale basée sur QueryPage",
-       "apihelp-query+querypage-param-page": "Le nom de la page spéciale. Remarque, ce nom est sensible à la casse.",
+       "apihelp-query+protectedtitles-example-generator": "Trouver les liens vers les titres protégés dans l’espace de noms principal.",
+       "apihelp-query+querypage-description": "Obtenir une liste fournie par une page spéciale basée sur QueryPage.",
+       "apihelp-query+querypage-param-page": "Le nom de la page spéciale. Notez que ce nom est sensible à la casse.",
        "apihelp-query+querypage-param-limit": "Nombre de résultats à renvoyer.",
        "apihelp-query+querypage-example-ancientpages": "Renvoyer les résultats de [[Special:Ancientpages]].",
        "apihelp-query+random-description": "Obtenir un ensemble de pages au hasard.\n\nLes pages sont listées dans un ordre prédéterminé, seul le point de départ est aléatoire. Par exemple, cela signifie que si la première page dans la liste est <samp>Accueil</samp>, la seconde sera <em>toujours</em> <samp>Liste des singes de fiction</samp>, la troisième <samp>Liste de personnes figurant sur les timbres de Vanuatu</samp>, etc.",
        "apihelp-query+random-param-limit": "Limiter le nombre de pages aléatoires renvoyées.",
        "apihelp-query+random-param-redirect": "Utilisez <kbd>$1filterredir=redirects</kbd> au lieu de ce paramètre.",
        "apihelp-query+random-param-filterredir": "Comment filtrer les redirections.",
-       "apihelp-query+random-example-simple": "Obtenir deux pages aléatoires de l’espace principal",
-       "apihelp-query+random-example-generator": "Renvoyer les informations de la page sur deux pages au hasard de l’espace de noms principal",
+       "apihelp-query+random-example-simple": "Obtenir deux pages aléatoires de l’espace de noms principal.",
+       "apihelp-query+random-example-generator": "Renvoyer les informations de la page sur deux pages au hasard de l’espace de noms principal.",
        "apihelp-query+recentchanges-description": "Énumérer les modifications récentes.",
        "apihelp-query+recentchanges-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+recentchanges-param-end": "L’horodatage auquel arrêter l’énumération.",
-       "apihelp-query+recentchanges-param-namespace": "Filtrer les modifications uniquement sur ces espaces de nom.",
-       "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications par cet utilisateur.",
-       "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications par cet utilisateur.",
+       "apihelp-query+recentchanges-param-namespace": "Filtrer les modifications uniquement sur ces espaces de noms.",
+       "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications faites par cet utilisateur.",
+       "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications faites par cet utilisateur.",
        "apihelp-query+recentchanges-param-tag": "Lister uniquement les modifications marquées avec cette balise.",
        "apihelp-query+recentchanges-param-prop": "Inclure des informations supplémentaires :",
-       "apihelp-query+recentchanges-paramvalue-prop-user": "Ajoute l’utilisateur responsable de la modification et marque si c’est une adresse IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Ajoute l’utilisateur responsable de la modification et marque s'il s'agit d'une adresse IP.",
        "apihelp-query+recentchanges-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur responsable de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "Ajoute le commentaire de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé pour la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "Ajoute les balises de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Ajoute l’horodatage de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-title": "Ajoute le titre de la page modifiée.",
-       "apihelp-query+recentchanges-paramvalue-prop-ids": "Ajoute l’ID de la page, l’ID des modifications récentes et l’ID de l’ancienne et la nouvelle révisions.",
-       "apihelp-query+recentchanges-paramvalue-prop-sizes": "Ajoute l’ancienne et la nouvelle tailles de la page en octets.",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "Ajoute l’ID de la page, l’ID des modifications récentes et l’ID de l’ancienne et de la nouvelle révision.",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "Ajoute l’ancienne et la nouvelle taille de la page en octets.",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "Marque la modification si la page est une redirection.",
        "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Marque les modifications patrouillables comme patrouillées ou non.",
        "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Ajoute les informations du journal (Id du journal, type de trace, etc.) aux entrées du journal.",
        "apihelp-query+redirects-paramvalue-prop-pageid": "ID de page de chaque redirection.",
        "apihelp-query+redirects-paramvalue-prop-title": "Titre de chaque redirection.",
        "apihelp-query+redirects-paramvalue-prop-fragment": "Fragment de chaque redirection, s’il y en a un.",
-       "apihelp-query+redirects-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
+       "apihelp-query+redirects-param-namespace": "Inclure uniquement les pages dans ces espaces de noms.",
        "apihelp-query+redirects-param-limit": "Combien de redirections renvoyer.",
        "apihelp-query+redirects-param-show": "Afficher uniquement les éléments correspondant à ces critères :\n;fragment:Afficher uniquement les redirections avec un fragment.\n;!fragment:Afficher uniquement les redirections sans fragment.",
        "apihelp-query+redirects-example-simple": "Obtenir une liste des redirections vers [[Main Page]]",
        "apihelp-query+redirects-example-generator": "Obtenir des informations sur toutes les redirections vers [[Main Page]]",
        "apihelp-query+revisions-description": "Obtenir des informations sur la révision.\n\nPeut être utilisé de différentes manières :\n# Obtenir des données sur un ensemble de pages (dernière révision), en mettant les titres ou les ids de page.\n# Obtenir les révisions d’une page donnée, en utilisant les titres ou les ids de page avec rvstart, rvend ou rvlimit.\n# Obtenir des données sur un ensemble de révisions en donnant leurs IDs avec revids.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "Utilisable uniquement avec une seule page (mode #2).",
-       "apihelp-query+revisions-param-startid": "À quel ID de révision démarrer l’énumération.",
-       "apihelp-query+revisions-param-endid": "Arrêter l’énumération des révisions à cet ID.",
+       "apihelp-query+revisions-param-startid": "Commencer l'énumération à partir de la date de cette revue. La revue doit exister, mais ne concerne pas forcément cette page.",
+       "apihelp-query+revisions-param-endid": "Arrêter l’énumération à la date de cette revue. La revue doit exister mais ne concerne pas forcément cette page.",
        "apihelp-query+revisions-param-start": "À quel horodatage de révision démarrer l’énumération.",
        "apihelp-query+revisions-param-end": "Énumérer jusqu’à cet horodatage.",
        "apihelp-query+revisions-param-user": "Inclure uniquement les révisions faites par l’utilisateur.",
        "apihelp-query+revisions-param-excludeuser": "Exclure les révisions faites par l’utilisateur.",
        "apihelp-query+revisions-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
        "apihelp-query+revisions-param-token": "Quels jetons obtenir pour chaque révision.",
-       "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres <kbd>API</kbd> et <kbd>Page principale</kbd>.",
+       "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres <kbd>API</kbd> et <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-last5": "Obtenir les 5 dernières révisions de la <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-first5": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd>.",
        "apihelp-query+revisions-example-first5-after": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> faites après le 01/05/2006.",
        "apihelp-query+revisions+base-param-generatexml": "Générer l’arbre d’analyse XML pour le contenu de la révision (nécessite $1prop=content ; remplacé par <kbd>$1prop=parsetree</kbd>).",
        "apihelp-query+revisions+base-param-parse": "Analyser le contenu de la révision (nécessite $1prop=content). Pour des raisons de performance, si cette option est utilisée, $1limit est forcé à 1.",
        "apihelp-query+revisions+base-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
-       "apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser <kbd>prev</kbd>, <kbd>next</kbd> et <kbd>cur</kbd> pour la version précédente, suivante et actuelle respectivement.",
+       "apihelp-query+revisions+base-param-diffto": "ID de révision à prendre pour comparer chaque révision. Utiliser <kbd>prev</kbd>, <kbd>next</kbd> et <kbd>cur</kbd> pour la version précédente, suivante et actuelle respectivement.",
        "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase <var>$1diffto</var>. Si <var>$1section</var> est positionné, seule cette section sera comparée avec ce texte.",
        "apihelp-query+revisions+base-param-difftotextpst": "Effectuer une transformation avant enregistrement sur le texte avant de le comparer. Valide uniquement quand c’est utilisé avec <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour <var>$1difftotext</var> et attendu pour la sortie du contenu.",
        "apihelp-query+search-paramvalue-prop-sectiontitle": "Ajoute le titre de la section correspondante.",
        "apihelp-query+search-paramvalue-prop-categorysnippet": "Ajoute un extrait analysé de la catégorie correspondante.",
        "apihelp-query+search-paramvalue-prop-isfilematch": "Ajoute un booléen indiquant si la recherche correspond au contenu du fichier.",
-       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Désuet et ignoré.</span>",
+       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>",
        "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>",
        "apihelp-query+search-param-limit": "Combien de pages renvoyer au total.",
        "apihelp-query+search-param-interwiki": "Inclure les résultats interwiki dans la recherche, s’ils sont disponibles.",
        "apihelp-query+search-param-backend": "Quel serveur de recherche utiliser, si ce n’est pas celui par défaut.",
-       "apihelp-query+search-param-enablerewrites": "Activer la réécriture interne de la requête. Les serveurs de recherche peuvent changer la requête en une autre dont ils estiment qu'elle donne de meilleurs résultats, par exemple en corrigeant l'orthographe.",
+       "apihelp-query+search-param-enablerewrites": "Activer la réécriture interne de la requête. Les serveurs de recherche peuvent réécrire la requête en une autre qui est censée donner de meilleurs résultats, par exemple en corrigeant les erreurs d’orthographe.",
        "apihelp-query+search-example-simple": "Rechercher <kbd>meaning</kbd>.",
-       "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>signification</kbd>.",
+       "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Renvoyer les informations générales sur le site.",
        "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :",
        "apihelp-query+siteinfo-paramvalue-prop-general": "Information globale du système.",
-       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Liste des espaces de nom déclarés et leur nom canonique.",
-       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Liste des alias des espaces de nom déclarés.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Liste des espaces de noms déclarés avec leur nom canonique.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Liste des alias des espaces de noms déclarés.",
        "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Liste des alias des pages spéciales.",
        "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Liste des mots magiques et leurs alias.",
        "apihelp-query+siteinfo-paramvalue-prop-statistics": "Renvoie les statistiques du site.",
        "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Renvoie la correspondance interwiki (éventuellement filtrée, éventuellement localisée en utilisant <var>$1inlanguagecode</var>).",
-       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Renvoie le serveur de base de donnée avec la plus grande latence de réplication.",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Renvoie le serveur de base de données ayant la plus grande latence de réplication.",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Renvoie les groupes utilisateur et les droits associés.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Renvoie les bibliothèques installées sur le wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "Renvoie les extensions installées sur le wiki.",
-       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Renvoie la liste des extensions de fichier (types de fichier) autorisées au téléchargement.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Renvoie la liste des extensions de fichier (types de fichier) autorisées au téléversement.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Renvoie l’information sur les types de restriction disponibles (protection).",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Renvoie une liste des langues que MédiaWiki prend en charge (éventuellement localisée en utilisant <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Renvoie une liste de codes de langue pour lesquels [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] est activé, et les variantes prises en charge pour chacun.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant <var>$1inlanguagecode</var>, sinon dans la langue du contenu).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Renvoie une liste des balises d’extension de l’analyseur.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Renvoie une liste des accroches de fonction de l’analyseur.",
-       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Renvoie une liste de toutes les accroches souscrites (contenu de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
-       "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste des IDs de variable.",
-       "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste des protocoles qui sont autorisés dans les liens externes.",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Renvoie une liste de toutes les accroches souscrites (contenu de <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste d'IDs de variable.",
+       "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste de protocoles autorisés dans les liens externes.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Renvoie les valeurs par défaut pour les préférences utilisateur.",
        "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Renvoie la configuration du dialogue de téléversement.",
        "apihelp-query+siteinfo-param-filteriw": "Renvoyer uniquement les entrées locales ou uniquement les non locales de la correspondance interwiki.",
        "apihelp-query+siteinfo-param-showalldb": "Lister tous les serveurs de base de données, pas seulement celui avec la plus grande latence.",
        "apihelp-query+siteinfo-param-numberingroup": "Liste le nombre d’utilisateurs dans les groupes.",
        "apihelp-query+siteinfo-param-inlanguagecode": "Code de langue pour les noms de langue localisés (du mieux possible) et les noms d’habillage.",
-       "apihelp-query+siteinfo-example-simple": "Extraire les informations du site",
-       "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux",
-       "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle",
+       "apihelp-query+siteinfo-example-simple": "Extraire les informations du site.",
+       "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux.",
+       "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle.",
        "apihelp-query+stashimageinfo-description": "Renvoie les informations de fichier des fichiers mis en réserve.",
-       "apihelp-query+stashimageinfo-param-filekey": "Clé qui identifie un téléchargement précédent qui a été temporairement mis en réserve.",
-       "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité descendante.",
+       "apihelp-query+stashimageinfo-param-filekey": "Clé qui identifie un téléversement précédent qui a été temporairement mis en réserve.",
+       "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité ascendante.",
        "apihelp-query+stashimageinfo-example-simple": "Renvoie les informations sur un fichier mis en réserve.",
-       "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis en réserve",
+       "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis de côté.",
        "apihelp-query+tags-description": "Lister les balises de modification.",
        "apihelp-query+tags-param-limit": "Le nombre maximal de balises à lister.",
        "apihelp-query+tags-param-prop": "Quelles propriétés récupérer :",
        "apihelp-query+tags-paramvalue-prop-description": "Ajoute la description de la balise.",
        "apihelp-query+tags-paramvalue-prop-hitcount": "Ajoute le nombre de révisions et d’entrées du journal qui ont cette balise.",
        "apihelp-query+tags-paramvalue-prop-defined": "Indique si la balise est définie.",
-       "apihelp-query+tags-paramvalue-prop-source": "Obtient les sources de la balise, ce qui comprend <samp>extension</samp> pour les balises définies par une extension et <samp>manual</samp> pour les balises pouvant être appliquées manuellement par les utilisateurs.",
+       "apihelp-query+tags-paramvalue-prop-source": "Retourne les sources de la balise, ce qui comprend <samp>extension</samp> pour les balises définies par une extension et <samp>manual</samp> pour les balises pouvant être appliquées manuellement par les utilisateurs.",
        "apihelp-query+tags-paramvalue-prop-active": "Si la balise est encore appliquée.",
-       "apihelp-query+tags-example-simple": "Lister les balises disponibles",
+       "apihelp-query+tags-example-simple": "Lister les balises disponibles.",
        "apihelp-query+templates-description": "Renvoie toutes les pages incluses dans les pages fournies.",
-       "apihelp-query+templates-param-namespace": "Afficher les modèles uniquement dans ces espaces de nom.",
+       "apihelp-query+templates-param-namespace": "Afficher les modèles uniquement dans ces espaces de noms.",
        "apihelp-query+templates-param-limit": "Combien de modèles renvoyer.",
        "apihelp-query+templates-param-templates": "Lister uniquement ces modèles. Utile pour vérifier si une certaine page utilise un modèle donné.",
        "apihelp-query+templates-param-dir": "La direction dans laquelle lister.",
-       "apihelp-query+templates-example-simple": "Obtenir les modèles utilisés sur la page <kbd>Accueil</kbd>.",
+       "apihelp-query+templates-example-simple": "Obtenir les modèles utilisés sur la page <kbd>Main Page</kbd>.",
        "apihelp-query+templates-example-generator": "Obtenir des informations sur les pages modèle utilisé sur <kbd>Main Page</kbd>.",
-       "apihelp-query+templates-example-namespaces": "Obtenir les pages des espaces de nom {{ns:user}} et {{ns:template}} qui sont inclues dans la page <kdb>Main Page<kdb>.",
+       "apihelp-query+templates-example-namespaces": "Obtenir les pages des espaces de noms {{ns:user}} et {{ns:template}} qui sont inclues dans la page <kdb>Main Page<kdb>.",
        "apihelp-query+tokens-description": "Récupère les jetons pour les actions de modification de données.",
        "apihelp-query+tokens-param-type": "Types de jeton à demander.",
-       "apihelp-query+tokens-example-simple": "Récupérer un jeton csrf (par défaut)",
-       "apihelp-query+tokens-example-types": "Récupérer un jeton de suivi et un de patrouille",
+       "apihelp-query+tokens-example-simple": "Récupérer un jeton csrf (par défaut).",
+       "apihelp-query+tokens-example-types": "Récupérer un jeton de suivi et un de patrouille.",
        "apihelp-query+transcludedin-description": "Trouver toutes les pages qui incluent les pages données.",
        "apihelp-query+transcludedin-param-prop": "Quelles propriétés obtenir :",
        "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID de page de chaque page.",
        "apihelp-query+transcludedin-param-show": "Afficher uniquement les éléments qui correspondent à ces critères:\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+transcludedin-example-simple": "Obtenir une liste des pages incluant <kbd>Main Page</kbd>.",
        "apihelp-query+transcludedin-example-generator": "Obtenir des informations sur les pages incluant <kbd>Main Page</kbd>.",
-       "apihelp-query+usercontribs-description": "Obtenir toutes les modifications par un utilisateur.",
+       "apihelp-query+usercontribs-description": "Obtenir toutes les modifications d'un utilisateur.",
        "apihelp-query+usercontribs-param-limit": "Le nombre maximal de contributions à renvoyer.",
        "apihelp-query+usercontribs-param-start": "L’horodatage auquel démarrer le retour.",
        "apihelp-query+usercontribs-param-end": "L’horodatage auquel arrêter le retour.",
        "apihelp-query+usercontribs-param-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-namespace": "Lister uniquement les contributions dans ces espaces de noms.",
        "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+usercontribs-paramvalue-prop-title": "Ajoute le titre et l’ID d’espace de noms de la page.",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "Ajoute les marques de la modification.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Marque les modifications patrouillées.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Liste les balises de la modification.",
-       "apihelp-query+usercontribs-param-show": "Afficher uniquement les éléments correspondant à ces critères, par ex. les modifications non mineures uniquement : <kbd>$2show=!minor</kbd>.\n\nSi <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd> est positionné, les révisions plus anciennes que <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|seconde|secondes}}) ne seront pas affichées.",
+       "apihelp-query+usercontribs-param-show": "Afficher uniquement les éléments correspondant à ces critères, par ex. les modifications non mineures uniquement : <kbd>$2show=!minor</kbd>.\n\nSi <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd> est positionné, les révisions plus anciennes que <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|seconde|secondes}}) ne seront pas affichées.",
        "apihelp-query+usercontribs-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
-       "apihelp-query+usercontribs-param-toponly": "Lister uniquement les modifications qui sont la dernière révision.",
+       "apihelp-query+usercontribs-param-toponly": "Lister uniquement les modifications de la dernière révision.",
        "apihelp-query+usercontribs-example-user": "Afficher les contributions de l'utilisateur <kbd>Exemple</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "Afficher les contributions de toutes les adresses IP avec le préfixe <kbd>192.0.2.</kbd>.",
-       "apihelp-query+userinfo-description": "Obtenir de l’information sur l’utilisateur courant.",
+       "apihelp-query+userinfo-description": "Obtenir des informations sur l’utilisateur courant.",
        "apihelp-query+userinfo-param-prop": "Quelles informations inclure :",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Marque si l’utilisateur actuel est bloqué, par qui, et pour quelle raison.",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Ajoute une balise <samp>messages</samp> si l’utilisateur actuel a des messages en cours.",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Liste tous les groupes dont l’utilisateur actuel est automatiquement membre.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Liste tous les droits qu’a l’utilisateur actuel.",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Liste les groupes pour lesquels l’utilisateur actuel peut ajouter ou supprimer.",
-       "apihelp-query+userinfo-paramvalue-prop-options": "Liste toutes les préférences qu’a défini l’utilisateur actuel.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "Liste toutes les préférences qu’a définies l’utilisateur actuel.",
        "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Obsolete.</span> Obtenir un jeton pour modifier les préférences de l’utilisateur actuel.",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "Ajoute le compteur de modifications de l’utilisateur actuel.",
        "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Liste toutes les limites de débit s’appliquant à l’utilisateur actuel.",
        "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Ajoute le compteur de pages non lues de la liste de suivi de l’utilisateur (au maximum $1 ; renvoie <samp>$2</samp> s’il y en a plus).",
        "apihelp-query+userinfo-paramvalue-prop-centralids": "Ajoute les IDs centraux et l’état d’attachement de l’utilisateur.",
        "apihelp-query+userinfo-param-attachedwiki": "Avec <kbd>$1prop=centralids</kbd>, indiquer si l’utilisateur est attaché au wiki identifié par cet ID.",
-       "apihelp-query+userinfo-example-simple": "Obtenir de l’information sur l’utilisateur actuel",
-       "apihelp-query+userinfo-example-data": "Obtenir des informations supplémentaires sur l’utilisateur actuel",
-       "apihelp-query+users-description": "Obtenir des information sur une liste d’utilisateurs",
+       "apihelp-query+userinfo-example-simple": "Obtenir des informations sur l’utilisateur actuel.",
+       "apihelp-query+userinfo-example-data": "Obtenir des informations supplémentaires sur l’utilisateur actuel.",
+       "apihelp-query+users-description": "Obtenir des informations sur une liste d’utilisateurs",
        "apihelp-query+users-param-prop": "Quelles informations inclure :",
        "apihelp-query+users-paramvalue-prop-blockinfo": "Marque si l’utilisateur est bloqué, par qui, et pour quelle raison.",
-       "apihelp-query+users-paramvalue-prop-groups": "Liste tous les groupes auquel appartient chaque utilisateur.",
+       "apihelp-query+users-paramvalue-prop-groups": "Liste tous les groupes auxquels appartient chaque utilisateur.",
        "apihelp-query+users-paramvalue-prop-groupmemberships": "Liste les groupes auxquels chaque utilisateur a été explicitement affecté, avec la date d’expiration de l’appartenance à chaque groupe.",
        "apihelp-query+users-paramvalue-prop-implicitgroups": "Liste tous les groupes dont un utilisateur est automatiquement membre.",
        "apihelp-query+users-paramvalue-prop-rights": "Liste tous les droits qu’a un utilisateur.",
        "apihelp-query+users-paramvalue-prop-centralids": "Ajoute les IDs centraux et l’état d’attachement de l’utilisateur.",
        "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-users": "Une liste d'utilisateurs pour lesquels obtenir des l’informations.",
        "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-param-token": "Utiliser <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> à la place.",
        "apihelp-query+users-example-simple": "Renvoyer des informations pour l'utilisateur <kbd>Example</kbd>.",
-       "apihelp-query+watchlist-description": "Obtenir les modifications récentes des pages dans la liste de suivi de l’utilisateur actuel.",
+       "apihelp-query+watchlist-description": "Obtenir les modifications récentes des pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlist-param-allrev": "Inclure les multiples révisions de la même page dans l’intervalle de temps fourni.",
        "apihelp-query+watchlist-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+watchlist-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+watchlist-param-excludeuser": "Ne pas lister les modifications faites par cet utilisateur.",
        "apihelp-query+watchlist-param-limit": "Combien de résultats au total renvoyer par demande.",
        "apihelp-query+watchlist-param-prop": "Quelles propriétés supplémentaires obtenir :",
-       "apihelp-query+watchlist-paramvalue-prop-ids": "Ajoute les IDs de révision et de page",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "Ajoute les IDs de révision et de page.",
        "apihelp-query+watchlist-paramvalue-prop-title": "Ajoute le titre de la page.",
        "apihelp-query+watchlist-paramvalue-prop-flags": "Ajoute les marqueurs de la modification.",
        "apihelp-query+watchlist-paramvalue-prop-user": "Ajoute l’utilisateur ayant fait la modification.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Ajoute l’information de trace le cas échéant.",
        "apihelp-query+watchlist-param-show": "Afficher uniquement les éléments qui correspondent à ces critères. Par exemple, pour voir uniquement les modifications mineures faites par des utilisateurs connectés, mettre $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Quels types de modification afficher :",
-       "apihelp-query+watchlist-paramvalue-type-edit": "Modifications normales de page",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Modifications normales de page.",
        "apihelp-query+watchlist-paramvalue-type-external": "Modifications externes.",
        "apihelp-query+watchlist-paramvalue-type-new": "Créations de pages.",
        "apihelp-query+watchlist-paramvalue-type-log": "Entrées du journal.",
        "apihelp-query+watchlist-paramvalue-type-categorize": "Modifications d’appartenance aux catégories.",
        "apihelp-query+watchlist-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.",
-       "apihelp-query+watchlist-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilsiateur) pour autoriser l’accès à la liste de suivi d&un autre utilisateur.",
-       "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel",
-       "apihelp-query+watchlist-example-props": "Chercher des informations supplémentaires sur la révision de tête des pages récemment modifiées de la liste de suivi de l’utilisateur actuel",
+       "apihelp-query+watchlist-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilsateur) pour autoriser l’accès à la liste de suivi d'un autre utilisateur.",
+       "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel.",
+       "apihelp-query+watchlist-example-props": "Chercher des informations supplémentaires sur la révision de tête des pages récemment modifiées de la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlist-example-allrev": "Chercher les informations sur toutes les modifications récentes des pages de la liste de suivi de l’utilisateur actuel",
        "apihelp-query+watchlist-example-generator": "Chercher l’information de la page sur les pages récemment modifiées de la liste de suivi de l’utilisateur actuel",
-       "apihelp-query+watchlist-example-generator-rev": "Chercher l’information de la révision pour les modifications récentes des pages de la liste de suivi de l’utilisateur actuel",
+       "apihelp-query+watchlist-example-generator-rev": "Chercher l’information de la révision pour les modifications récentes des pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlist-example-wlowner": "Lister la révision de tête des pages récemment modifiées de la liste de suivi de l'utilisateur <kbd>Exemple</kbd>.",
        "apihelp-query+watchlistraw-description": "Obtenir toutes les pages de la liste de suivi de l’utilisateur actuel.",
-       "apihelp-query+watchlistraw-param-namespace": "Lister uniquement les pages dans les espaces de nom fournis.",
+       "apihelp-query+watchlistraw-param-namespace": "Lister uniquement les pages dans les espaces de noms fournis.",
        "apihelp-query+watchlistraw-param-limit": "Combien de résultats renvoyer au total par requête.",
        "apihelp-query+watchlistraw-param-prop": "Quelles propriétés supplémentaires obtenir :",
        "apihelp-query+watchlistraw-paramvalue-prop-changed": "Ajoute l’horodatage de la dernière notification de l’utilisateur à propos de la modification.",
        "apihelp-query+watchlistraw-param-dir": "Le sens dans lequel lister.",
        "apihelp-query+watchlistraw-param-fromtitle": "Démarrer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :",
        "apihelp-query+watchlistraw-param-totitle": "Terminer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :",
-       "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel",
-       "apihelp-query+watchlistraw-example-generator": "Chercher l’information sur les pages de la liste de suivi de l’utilisateur actuel",
+       "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel.",
+       "apihelp-query+watchlistraw-example-generator": "Chercher l’information sur les pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-removeauthenticationdata-description": "Supprimer les données d’authentification pour l’utilisateur actuel.",
        "apihelp-removeauthenticationdata-example-simple": "Tentative de suppression des données de l’utilisateur pour <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "Envoyer un courriel de réinitialisation du mot de passe à un utilisateur.",
-       "apihelp-resetpassword-description-noroutes": "Aucun chemin pour réinitialiser le mot de passe n’est disponible.\n\nActiver les chemins dans <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> pour utiliser ce module.",
+       "apihelp-resetpassword-description-noroutes": "Aucun chemin pour réinitialiser le mot de passe n’est disponible.\n\nActiver les chemins dans <var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> pour utiliser ce module.",
        "apihelp-resetpassword-param-user": "Utilisateur ayant été réinitialisé.",
        "apihelp-resetpassword-param-email": "Adresse courriel de l’utilisateur ayant été réinitialisé.",
        "apihelp-resetpassword-example-user": "Envoyer un courriel de réinitialisation du mot de passe à l’utilisateur <kbd>Exemple</kbd>.",
        "apihelp-resetpassword-example-email": "Envoyer un courriel pour la réinitialisation de mot de passe à tous les utilisateurs avec une adresse email <kbd>user@example.com</kbd>.",
-       "apihelp-revisiondelete-description": "Supprimer et annuler la suppression des révisions.",
+       "apihelp-revisiondelete-description": "Supprimer et rétablir des révisions.",
        "apihelp-revisiondelete-param-type": "Type de suppression de révision en cours de traitement.",
        "apihelp-revisiondelete-param-target": "Titre de page pour la suppression de révision, s’il est nécessaire pour le type.",
        "apihelp-revisiondelete-param-ids": "Identifiants pour les révisions à supprimer.",
        "apihelp-revisiondelete-param-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-revision": "Masquer le contenu de la révision <kbd>12345</kbd> de la page <kbd>Main Page</kbd>.",
        "apihelp-revisiondelete-example-log": "Masquer toutes les données de l’entrée de journal <kbd>67890</kbd> avec le motif <kbd>Violation de Biographie de Personne Vivante</kbd>.",
        "apihelp-rollback-description": "Annuler la dernière modification de la page.\n\nSi le dernier utilisateur à avoir modifié la page a fait plusieurs modifications sur une ligne, elles seront toutes annulées.",
        "apihelp-rollback-param-title": "Titre de la page à restaurer. Impossible à utiliser avec <var>$1pageid</var>.",
        "apihelp-rollback-param-summary": "Personnaliser le résumé de la modification. S’il est vide, le résumé par défaut sera utilisé.",
        "apihelp-rollback-param-markbot": "Marquer les modifications annulées et les modifications annulées comme robot.",
        "apihelp-rollback-param-watchlist": "Ajouter ou supprimer la page de la liste de suivi de l’utilisateur actuel sans condition, utiliser les préférences ou ne pas modifier le suivi.",
-       "apihelp-rollback-example-simple": "Annuler les dernières modifications à [<kbd>Main Page</kbd> par l’utilisateur <kbd>Exemple</kbd>.",
+       "apihelp-rollback-example-simple": "Annuler les dernières modifications à <kbd>Main Page</kbd> par l’utilisateur <kbd>Example</kbd>.",
        "apihelp-rollback-example-summary": "Annuler les dernières modifications de la page <kbd>Main Page</kbd> par l’utilisateur à l’adresse IP <kbd>192.0.2.5</kbd> avec le résumé <kbd>Annulation de vandalisme<kbd>, et marquer ces modifications et l’annulation comme modifications de robots.",
        "apihelp-rsd-description": "Exporter un schéma RSD (Découverte Très Simple).",
        "apihelp-rsd-example-simple": "Exporter le schéma RSD",
        "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-description-disabled": "Il n’est pas possible de modifier la langue d’une page sur ce wiki.\n\nActiver <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> pour utiliser cette action.",
        "apihelp-setpagelanguage-param-title": "Titre de la page dont vous souhaitez modifier la langue. Ne peut pas être utilisé avec <var>$1pageid</var>.",
        "apihelp-setpagelanguage-param-pageid": "Identifiant (ID) de la page dont vous souhaitez modifier la langue. Ne peut être utilisé avec <var>$1title</var>.",
        "apihelp-setpagelanguage-param-lang": "Code de langue vers lequel la page doit être changée. Utiliser <kbd>defaut</kbd> pour réinitialiser la page sur la langue par défaut du contenu du wiki.",
        "apihelp-stashedit-param-summary": "Résumé du changement",
        "apihelp-tag-description": "Ajouter ou enlever des balises de modification aux révisions ou ou aux entrées de journal individuelles.",
        "apihelp-tag-param-rcid": "Un ou plus IDs de modification récente à partir desquels ajouter ou supprimer la balise.",
-       "apihelp-tag-param-revid": "Un ou plus IDs de révision à partir desquels ajouter ou supprimer la balise.",
-       "apihelp-tag-param-logid": "Un ou plus IDs d’entrée de journal à partir desquels ajouter ou supprimer la balise.",
+       "apihelp-tag-param-revid": "Un ou plusieurs IDs de révision à partir desquels ajouter ou supprimer la balise.",
+       "apihelp-tag-param-logid": "Un ou plusieurs IDs d’entrée de journal à partir desquels ajouter ou supprimer la balise.",
        "apihelp-tag-param-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-unlinkaccount-example-simple": "Essayer de supprimer le lien de l’utilisateur actuel pour le fournisseur associé avec <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-upload-description": "Téléverser un fichier, ou obtenir l’état des téléversements en cours.\n\nPlusieurs méthodes sont disponibles :\n* Téléverser directement le contenu du fichier, en utilisant le paramètre <var>$1file</var>.\n* Téléverser le fichier par morceaux, en utilisant les paramètres <var>$1filesize</var>, <var>$1chunk</var>, and <var>$1offset</var>.\n* Pour que le serveur MédiaWiki cherche un fichier depuis une URL, utilisez le paramètre <var>$1url</var>.\n* Terminer un téléversement précédent qui a échoué à cause d’avertissements, en utilisant le paramètre <var>$1filekey</var>.\nNoter que le POST HTTP doit être fait comme un téléversement de fichier (par ex. en utilisant <code>multipart/form-data</code>) en envoyant le <code>multipart/form-data</code>.",
        "apihelp-upload-param-filename": "Nom de fichier cible.",
-       "apihelp-upload-param-comment": "Télécharger le commentaire. Utilisé aussi comme texte de la page initiale pour les nouveaux fichiers si <var>$1text</var> n’est pas spécifié.",
-       "apihelp-upload-param-tags": "Modifier les balises à appliquer à l’entrée du journal de téléchargement et à la révision de la page du fichier.",
+       "apihelp-upload-param-comment": "Téléverser le commentaire. Utilisé aussi comme texte de la page initiale pour les nouveaux fichiers si <var>$1text</var> n’est pas spécifié.",
+       "apihelp-upload-param-tags": "Modifier les balises à appliquer à l’entrée du journal de téléversement et à la révision de la page du fichier.",
        "apihelp-upload-param-text": "Texte de page initiale pour les nouveaux fichiers.",
        "apihelp-upload-param-watch": "Suivre la page.",
        "apihelp-upload-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-upload-param-ignorewarnings": "Ignorer tous les avertissements.",
        "apihelp-upload-param-file": "Contenu du fichier.",
        "apihelp-upload-param-url": "URL où chercher le fichier.",
-       "apihelp-upload-param-filekey": "Clé identifiant un téléchargement précédent temporairement mis en attente.",
+       "apihelp-upload-param-filekey": "Clé identifiant un téléversement précédent temporairement mis en attente.",
        "apihelp-upload-param-sessionkey": "Comme $1filekey, conservé pour des raisons de compatibilité descendante.",
        "apihelp-upload-param-stash": "Si positionné, le serveur conservera temporairement le fichier au lieu de l’ajouter au dépôt.",
-       "apihelp-upload-param-filesize": "Taille du fichier de tout le téléchargement.",
+       "apihelp-upload-param-filesize": "Taille du téléversement entier.",
        "apihelp-upload-param-offset": "Décalage du bloc en octets.",
        "apihelp-upload-param-chunk": "Partie du contenu.",
        "apihelp-upload-param-async": "Faire de façon asynchrone les grosses opérations sur les fichiers quand c’est possible.",
-       "apihelp-upload-param-checkstatus": "Récupérer uniquement l’état de téléchargement pour la clé de fichier donnée.",
-       "apihelp-upload-example-url": "Télécharger depuis une URL",
-       "apihelp-upload-example-filekey": "Terminer un téléchargement qui a échoué à cause d’avertissements",
+       "apihelp-upload-param-checkstatus": "Récupérer uniquement l’état de téléversement pour la clé de fichier donnée.",
+       "apihelp-upload-example-url": "Téléverser depuis une URL",
+       "apihelp-upload-example-filekey": "Terminer un téléversement qui a échoué à cause d’avertissements",
        "apihelp-userrights-description": "Modifier l’appartenance d’un utilisateur à un groupe.",
        "apihelp-userrights-param-user": "Nom d’utilisateur.",
        "apihelp-userrights-param-userid": "ID de l’utilisateur.",
        "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-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre <var>format</var> pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez <kbd>format=$2</kbd>.\n\nVoyez la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
-       "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de déboguage, et n’est pas approprié à une utilisation applicative.\n\nVoir la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
+       "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre <var>format</var> pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez <kbd>format=$2</kbd>.\n\nVoyez la [[mw:Special:MyLanguage/API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
+       "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de débogage, et n’est pas approprié pour une utilisation applicative.\n\nVoir la [[mw:Special:MyLanguage/API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-format-prettyprint-status": "Cette réponse serait retournée avec l'état HTTP $1 $2.",
+       "api-login-fail-aborted": "L’authentification nécessite une interaction avec l’utilisateur, qui n’est pas prise en charge par <kbd>action=login</kbd>. Pour pouvoir se connecter avec <kbd>action=login</kbd>, voyez [[Special:BotPasswords]]. Pour continuer à utiliser la connexion du compte principal, voyez <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-aborted-nobotpw": "L’authentification nécessite une interaction avec l’utilisateur, qui n’est pas prise en charge par <kbd>action=login</kbd>. Pour se connecter, voyez <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-badsessionprovider": "Impossible de se connecter en utilisant $1.",
+       "api-login-fail-sameorigin": "Impossible de se connecter quand la politique de même origine n’est pas appliquée.",
        "api-pageset-param-titles": "Une liste des titres sur lesquels travailler.",
        "api-pageset-param-pageids": "Une liste des IDs de page sur lesquelles travailler.",
        "api-pageset-param-revids": "Une liste des IDs de révision sur lesquelles travailler.",
        "api-help-param-default-empty": "Par défaut : <span class=\"apihelp-empty\">(vide)</span>",
        "api-help-param-token": "Un jeton « $1 » récupéré par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-token-webui": "Pour rester compatible, le jeton utilisé dans l’IHM web est aussi accepté.",
-       "api-help-param-disabled-in-miser-mode": "Désactivé à cause du [[mw:Manual:$wgMiserMode|mode minimal]].",
-       "api-help-param-limited-in-miser-mode": "<strong>NOTE :</strong> Du fait du [[mw:Manual:$wgMiserMode|mode minimal]], utiliser cela peut aboutir à moins de résultats que <var>$1limit</var> renvoyés avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
+       "api-help-param-disabled-in-miser-mode": "Désactivé à cause du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]].",
+       "api-help-param-limited-in-miser-mode": "<strong>NOTE :</strong> Du fait du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]], utiliser cela peut aboutir à moins de résultats que <var>$1limit</var> renvoyés avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
        "api-help-param-direction": "Dans quelle direction énumérer :\n;newer:Lister les plus anciens en premier. Note : $1start doit être avant $1end.\n;older:Lister les nouveaux en premier (par défaut). Note : $1start doit être postérieur à $1end.",
        "api-help-param-continue": "Quand plus de résultats sont disponibles, utiliser cela pour continuer.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(aucune description)</span>",
        "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-badformat-generic": "Le format demandé $1 n’est pas pris en charge pour le modèle de contenu $2.",
+       "apierror-badformat": "Le format demandé $1 n’est pas pris en charge 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-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-badupload": "Le paramètre de téléversement de fichier <var>$1</var> n’est pas un téléversement 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-cannot-async-upload-file": "Les paramètres <var>async</var> et <var>file</var> ne peuvent pas être combinés. Si vous voulez un traitement asynchrone de votre fichier téléchargé, importez-le d’abord dans la réserve (en utilisant le paramètre <var>stash</var>) puis publiez le fichier importé de façon asynchrone (en utilisant <var>filekey</var> et <var>async</var>).",
+       "apierror-botsnotsupported": "Cette interface n’est pas prise en charge pour les robots.",
+       "apierror-cannot-async-upload-file": "Les paramètres <var>async</var> et <var>file</var> ne peuvent pas être combinés. Si vous voulez un traitement asynchrone de votre fichier téléversé, importez-le d’abord dans la réserve (en utilisant le paramètre <var>stash</var>) puis publiez le fichier importé de façon asynchrone (en utilisant <var>filekey</var> et <var>async</var>).",
        "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-upload": "Vous n’avez pas le droit d’importer des pages téléversé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-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-copyuploadbaddomain": "Les téléversements par URL ne sont pas autorisés pour ce domaine.",
+       "apierror-copyuploadbadurl": "Les téléversements 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-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-invalidoldimage": "Le paramètre <var>oldimage</var> 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-invalidsection": "Le paramètre <var>section</var> 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-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-uploadstash": "La réserve de téléversement 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-no-direct-editing": "La modification directe via l’API n’est pas prise en charge pour le modèle de contenu $1 utilisé 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-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-nouploadmodule": "Aucun module de téléversement 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-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> n’est pris en charge que pour le contenu wikitexte.",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> n’est pris en charge 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-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-badid": "Pas de correction trouvée pour le paramètre <var>$1</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-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-stashfailed-complete": "Un téléversement par morceaux est déjà achevé, vérifiez l’état pour plus de détails.",
+       "apierror-stashfailed-nosession": "Aucune session de téléversement par morceaux avec cette clé.",
+       "apierror-stashfilestorage": "Impossible de mettre le téléversement 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 .",
        "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-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.",
index f8e3f05..45de579 100644 (file)
                        "Hamilton Abreu"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte [[mw:API:Errors_and_warnings|API: Erros e avisos]].\n\n<strong>Test:</strong> Para facilitar as probas das peticións da API, consulte [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentación]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Erros e avisos]].\n\n<strong>Test:</strong> Para facilitar as probas das peticións da API, consulte [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Que acción se realizará.",
        "apihelp-main-param-format": "O formato de saída.",
-       "apihelp-main-param-maxlag": "O retardo máximo pode usarse cando MediaWiki está instalada nun cluster de base de datos replicadas. Para gardar accións que causen calquera retardo máis de replicación do sitio, este parámetro pode facer que o cliente espere ata que o retardo de replicación sexa menor que o valor especificado. No caso de retardo excesivo, é devolto o código de erro <samp>maxlag</samp> cunha mensaxe como <samp>esperando por $host: $lag segundos de retardo</samp>.<br />Para máis información, ver [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]].",
+       "apihelp-main-param-maxlag": "O retardo máximo pode usarse cando MediaWiki está instalada nun cluster de base de datos replicadas. Para gardar accións que causen calquera retardo máis de replicación do sitio, este parámetro pode facer que o cliente espere ata que o retardo de replicación sexa menor que o valor especificado. No caso de retardo excesivo, é devolto o código de erro <samp>maxlag</samp> cunha mensaxe como <samp>esperando por $host: $lag segundos de retardo</samp>.<br />Para máis información, ver [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]].",
        "apihelp-main-param-smaxage": "Fixar a cabeceira HTTP de control de caché <code>s-maxage</code> a esos segundos. Os erros nunca se gardan na caché.",
        "apihelp-main-param-maxage": "Fixar a cabeceira HTTP de control de caché <code>max-age</code> a esos segundos. Os erros nunca se gardan na caché.",
        "apihelp-main-param-assert": "Verificar se o usuario está conectado como <kbd>usuario</kbd> ou ten a marca de <kbd>bot</kbd>.",
@@ -41,7 +41,7 @@
        "apihelp-block-param-autoblock": "Bloquear automaticamente o último enderezo IP utilizado, e calquera outro enderezo desde o que intente conectarse.",
        "apihelp-block-param-noemail": "Impide que o usuario envíe correos electrónicos a través da wiki. (Require o permiso <code>blockemail</code>).",
        "apihelp-block-param-hidename": "Ocultar o nome de usuario do rexistro de bloqueos. (Precisa do permiso <code>hideuser</code>).",
-       "apihelp-block-param-allowusertalk": "Permitir que o usuario edite a súa propia páxina de conversa (depende de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Permitir que o usuario edite a súa propia páxina de conversa (depende de <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Se o usuario xa está bloqueado, sobreescribir o bloqueo existente.",
        "apihelp-block-param-watchuser": "Vixiar a páxina de usuario ou direccións IP e a de conversa deste usuario",
        "apihelp-block-param-tags": "Cambiar as etiquetas a aplicar á entrada no rexistro de bloqueos.",
        "apihelp-opensearch-param-search": "Buscar texto.",
        "apihelp-opensearch-param-limit": "Número máximo de resultados a visualizar.",
        "apihelp-opensearch-param-namespace": "Espazo de nomes no que buscar.",
-       "apihelp-opensearch-param-suggest": "Non facer nada se <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> é falso.",
+       "apihelp-opensearch-param-suggest": "Non facer nada se <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> é falso.",
        "apihelp-opensearch-param-redirects": "Como xestionar as redireccións:\n;return:Devolve a mesma redirección.\n;resolve:Devolve a páxina á que apunta. Pode devolver menos de $1limit resultados.\nPor razóns históricas, o valor por defecto para $1format=json é \"return\" e \"resolve\" para outros formatos.",
        "apihelp-opensearch-param-format": "O formato de saída.",
        "apihelp-opensearch-param-warningsaserror": "Se os avisos son recibidos con <kbd>format=json</kbd>, devolver un erro de API no canto de ignoralos.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Devolve o informe de límite de forma estruturada. Non devolve datos cando <var>$1disablelimitreport</var> está fixado.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Devolve a versión HTML do informe de límite. Non devolve datos cando <var>$1disablelimitreport</var> está fixado.",
        "apihelp-parse-paramvalue-prop-parsetree": "Árbores de análise XML do contido da revisión (precisa o modelo de contido <code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "Devolve os avisos que ocorreron ó analizar o contido.",
        "apihelp-parse-param-pst": "Fai unha transformación antes de gardar a entrada antes de analizala. Válida unicamente para usar con texto.",
        "apihelp-parse-param-onlypst": "Facer unha transformación antes de gardar (PST) a entrada, pero sen analizala. Devolve o mesmo wikitexto, despois de que a PST foi aplicada. Só válida cando se usa con <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclúe ligazóns de idioma proporcionadas polas extensións (para usar con <kbd>$1prop=langlinks</kbd>).",
        "apihelp-query+alldeletedrevisions-param-user": "Só listar revisións deste usuario.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Non listar revisións deste usuario.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Só listar páxinas neste espazo de nomes.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], ó usar á vez <var>$1user</var> e <var>$1namespace</var> pode devolver menos resultados de <var>$1limit</var> antes de continuar, en casos extremos, pode que non devolva resultados.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> Debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]], ó usar á vez <var>$1user</var> e <var>$1namespace</var> pode devolver menos resultados de <var>$1limit</var> antes de continuar, en casos extremos, pode que non devolva resultados.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Usado como xenerador, xenera títulos no canto de IDs de revisión.",
        "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribucións borradas do usuario <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Listar as 50 primeiras revisións borradas no espazo de nomes principal.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Engade o nome do ficheiro da versión do ficheiro para as versións que non son a última.",
        "apihelp-query+filearchive-example-simple": "Mostrar unha lista de tódolos fichieiros eliminados.",
        "apihelp-query+filerepoinfo-description": "Devolver a meta información sobre os repositorios de imaxes configurados na wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "Que propiedades do repositorio mostrar (pode haber máis dispoñible nalgunhas wikis):\n;apiurl:URL ó API do repositorio - útil para obter información das imaxes no host.\n;name:A clave do repositorio - usada p. ex. nas variables de retorno de <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e [[Special:ApiHelp/query+imageinfo|imageinfo]]\n;displayname:O nome lexible do wiki repositorio.\n;rooturl:URL raíz dos camiños de imaxe.\n;local:Se o repositorio é o repositorio local ou non.",
+       "apihelp-query+filerepoinfo-param-prop": "Que propiedades do repositorio mostrar (pode haber máis dispoñible nalgunhas wikis):\n;apiurl:URL ó API do repositorio - útil para obter información das imaxes no host.\n;name:A clave do repositorio - usada p. ex. nas variables de retorno de <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e [[Special:ApiHelp/query+imageinfo|imageinfo]]\n;displayname:O nome lexible do wiki repositorio.\n;rooturl:URL raíz dos camiños de imaxe.\n;local:Se o repositorio é o repositorio local ou non.",
        "apihelp-query+filerepoinfo-example-simple": "Obter infomación sobre os repositorios de ficheiros",
        "apihelp-query+fileusage-description": "Atopar tódalas páxinas que usan os ficheiros dados.",
        "apihelp-query+fileusage-param-prop": "Que propiedades obter:",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devolve a información dos dereitos (licenza) da wiki se está dispoñible.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devolve información dos tipos de restricións (protección) dispoñibles.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Devolve unha lista dos idiomas que soporta Mediawiki (opcionalmente pode localizarse usando <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Devolve unha lista de códigos de lingua para os que [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] está activo, e as variantes soportadas para cada un.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Devolve unha lista de todas as aparencias dispoñibles (opcionalmente pode localizarse usando <var>$1inlanguagecode</var>, noutro caso no idioma do contido).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devolve unha lista de etiquetas de extensión de analizador.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Devolve unha lista de ganchos de función de analizador.",
-       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve unha lista de todos os ganchos subscritos (contido de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve unha lista de todos os ganchos subscritos (contido de <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Devolve unha lista de identificadores de variable.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devolve unha lista de protocolos que están permitidos nas ligazóns externas.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devolve os valores por defecto das preferencias de usuario.",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "Engade os indicadores da modificación.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Marca as modificacións vixiadas.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista as etiquetas da modificación.",
-       "apihelp-query+usercontribs-param-show": "Só mostrar elementos que cumpran estos criterios, p.ex. só edicións menores: <kbd>$2show=!minor</kbd>.\n\nSe está fixado <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd>, as modificacións máis antigas que <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|segundo|segundos}}) non se mostrarán.",
+       "apihelp-query+usercontribs-param-show": "Só mostrar elementos que cumpran estos criterios, p.ex. só edicións menores: <kbd>$2show=!minor</kbd>.\n\nSe está fixado <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd>, as modificacións máis antigas que <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|segundo|segundos}}) non se mostrarán.",
        "apihelp-query+usercontribs-param-tag": "Só listar revisións marcadas con esta etiqueta.",
        "apihelp-query+usercontribs-param-toponly": "Listar só cambios que son a última revisión.",
        "apihelp-query+usercontribs-example-user": "Mostrar as contribucións do usuario <kbd>Exemplo</kbd>.",
        "apihelp-removeauthenticationdata-description": "Elimina os datos de autenticación do usuario actual.",
        "apihelp-removeauthenticationdata-example-simple": "Intenta eliminar os datos de usuario actual para <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "Envía un correo de inicialización de contrasinal a un usuario.",
-       "apihelp-resetpassword-description-noroutes": "Non están dispoñibles as rutas de reinicio de contrasinal \n\nActive as rutas en <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> para usar este módulo.",
+       "apihelp-resetpassword-description-noroutes": "Non están dispoñibles as rutas de reinicio de contrasinal \n\nActive as rutas en <var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> para usar este módulo.",
        "apihelp-resetpassword-param-user": "Usuario sendo reinicializado.",
        "apihelp-resetpassword-param-email": "Está reinicializándose o enderezo de correo electrónico do usuario.",
        "apihelp-resetpassword-example-user": "Enviar un correo de reinicialización de contrasinal ó usuario <kbd>Exemplo</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-description-disabled": "Neste wiki non se permite modificar a lingua das páxinas.\n\nActive <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> para utilizar esta acción.",
+       "apihelp-setpagelanguage-description-disabled": "Neste wiki non se permite modificar a lingua das páxinas.\n\nActive <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> para utilizar esta acción.",
        "apihelp-setpagelanguage-param-title": "Título da páxina cuxa lingua quere cambiar. Non se pode usar xunto con <var>$1pageid</var>.",
        "apihelp-setpagelanguage-param-pageid": "Identificador da páxina cuxa lingua quere cambiar. Non se pode usar xunto con <var>$1title</var>.",
        "apihelp-setpagelanguage-param-lang": "Código da lingua á que se quere cambiar a páxina. Use <kbd>default</kbd> para restablecer a páxina á lingua por defecto do contido da wiki.",
        "apihelp-userrights-param-user": "Nome de usuario.",
        "apihelp-userrights-param-userid": "ID de usuario.",
        "apihelp-userrights-param-add": "Engadir o usuario a estes grupos, ou se xa é membro, actualizar a caducidade da súa afiliación.",
+       "apihelp-userrights-param-expiry": "Marcas de tempo de caducidade. Poden ser relativas (por exemplo, <kbd>5 meses</kbd> ou <kbd>2 semanas</kbd>) ou absolutas (por exemplo, <kbd>2014-09-18T12:34:56Z</kbd>). Se só se fixa unha marca de tempo, utilizarase para tódolos grupos que se pasen ó parámetro <var>$1add</var>. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, ou <kbd>never</kbd> para que a pertenza ó grupo non teña data de caducidade.",
        "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-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-format-prettyprint-header": "Esta é a representación HTML do formato $1. HTML é bó para depurar, pero non é axeitado para usar nunha aplicación.\n\nEspecifique o parámetro <var>format</var> para cambiar o formato de saída. Para ver a representación non-HTML do formato $1, fixe <kbd>format=$2</kbd>.\n\n\nRevise a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para obter máis información.",
-       "api-format-prettyprint-header-only-html": "Esta é unha representación HTML empregada para a depuración de erros, e non é axeitada para o uso de aplicacións.\n\nVexa a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para máis información.",
+       "api-format-prettyprint-header": "Esta é a representación HTML do formato $1. HTML é bó para depurar, pero non é axeitado para usar nunha aplicación.\n\nEspecifique o parámetro <var>format</var> para cambiar o formato de saída. Para ver a representación non-HTML do formato $1, fixe <kbd>format=$2</kbd>.\n\n\nRevise a [[mw:Special:MyLanguage/API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para obter máis información.",
+       "api-format-prettyprint-header-only-html": "Esta é unha representación HTML empregada para a depuración de erros, e non é axeitada para o uso de aplicacións.\n\nVexa a [[mw:Special:MyLanguage/API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para máis información.",
        "api-format-prettyprint-status": "Esta resposta será devolta co estado de HTTP $1 $2.",
        "api-pageset-param-titles": "Lista de títulos nos que traballar.",
        "api-pageset-param-pageids": "Lista de identificadores de páxina nos que traballar.",
        "api-help-param-default-empty": "Por defecto: <span class=\"apihelp-empty\">(baleiro)</span>",
        "api-help-param-token": "Un identificador \"$1\" recuperado por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-token-webui": "Por compatibilidade, o identificador usado na web UI tamén é aceptado.",
-       "api-help-param-disabled-in-miser-mode": "Desactivado debido ó [[mw:Manual:$wgMiserMode|modo minimal]].",
-       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], usar isto pode devolver menos de <var>$1limit</var> resultados antes de seguir, en casos extremos, pode que non se devolvan resultados.",
+       "api-help-param-disabled-in-miser-mode": "Desactivado debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]].",
+       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> Debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]], usar isto pode devolver menos de <var>$1limit</var> resultados antes de seguir, en casos extremos, pode que non se devolvan resultados.",
        "api-help-param-direction": "En que dirección enumerar:\n;newer:Lista os máis antigos primeiro. Nota: $1start ten que estar antes que $1end.\n;older:Lista os máis novos primeiro (por defecto). Nota: $1start ten que estar despois que $1end.",
        "api-help-param-continue": "Cando estean dispoñibles máis resultados, use isto para continuar.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(sen descrición)</span>",
        "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-badvalue-notmultivalue": "O separador multivalor U+001F só pode utilizarse en parámetros multivalorados.",
+       "apierror-bad-watchlist-token": "Identificador de lista de vixilancia proporcionado incorrecto. Por favor, obteña un identificador correcto en [[Special:Preferences]].",
        "apierror-blockedfrommail": "Foi bloqueado para o envío de correos electrónicos.",
        "apierror-blocked": "Foi bloqueado fronte á edición.",
        "apierror-botsnotsupported": "Esta interface non está dispoñible para bots.",
        "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-invalidoldimage": "O parámetro <var>oldimage</var> 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-invalidsection": "O parámetro <var>section</var> 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-nosuchuserid": "Non hai ningún usuario con identificador $1.",
        "apierror-notarget": "Non indicou un destino válido para esta acción.",
        "apierror-notpatrollable": "A revisión r$1 non pode patrullarse por ser demasiado antiga.",
+       "apierror-nouploadmodule": "Non se definiu un módulo de carga.",
        "apierror-opensearch-json-warnings": "Non se poden representar os avisos en formato JSON de OpenSearch.",
        "apierror-pagecannotexist": "O espazo de nomes non permite as páxinas actuais.",
+       "apierror-pagedeleted": "A páxina foi borrada dende que obtivo o selo de tempo.",
        "apierror-pagelang-disabled": "Neste wiki non se pode cambiar a lingua dunha páxina.",
        "apierror-paramempty": "O parámetro <var>$1</var> non pode estar baleiro.",
        "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> só está soportado para o contido wikitexto.",
        "apierror-pastexpiry": "A tempo de caducidade \"$1\" está no pasado.",
        "apierror-permissiondenied": "Non ten permiso para $1.",
        "apierror-permissiondenied-generic": "Permisos rexeitados.",
+       "apierror-permissiondenied-patrolflag": "Necesita o permiso <code>patrol</code> ou <code>patrolmarks</code> para solicitar a marca de patrullado.",
        "apierror-permissiondenied-unblock": "Non ten permiso para desbloquear usuarios.",
        "apierror-prefixsearchdisabled": "A busca de prefixo está desactivada no modo Miser (avaro).",
        "apierror-promised-nonwrite-api": "A cabeceira HTTP <code>Promise-Non-Write-API-Action</code> non se pode enviar a módulos da API en modo escritura.",
        "apierror-readapidenied": "Necesita permiso de lectura para utilizar ese módulo.",
        "apierror-readonly": "A wiki está actualmente en modo de só lectura.",
        "apierror-reauthenticate": "Non se autentificou recentemente nesta sesión. Por favor, volva a autentificarse.",
+       "apierror-revdel-mutuallyexclusive": "Non se pode usar o mesmo campo en <var>hide</var> e <var>show</var>.",
+       "apierror-revdel-needtarget": "É necesario un título obxectivo para este tipo RevDel.",
+       "apierror-revdel-paramneeded": "Requírese polo menos un valor para <var>hide</var> e/ou <var>show</var>.",
+       "apierror-revisions-badid": "Non se atoparon modificacións para o parámetro <var>$1</var>.",
+       "apierror-revisions-norevids": "O parámetro <var>revids</var> non se pode utilizar xunto coas opción de lista (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> e <var>$1end</var>).",
+       "apierror-revisions-singlepage": "Utilizouse <var>titles</var>, <var>pageids</var> ou un xerador para proporcionar múltiples páxinas, pero os parámetros <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> e <var>$1end</var> só poden utilizarse nunha soa páxina.",
        "apierror-revwrongpage": "r$1 non é unha revisión de $2.",
        "apierror-searchdisabled": "A busca <var>$1</var> está desactivada.",
        "apierror-sectionreplacefailed": "Non se puido combinar a sección actualizada.",
        "apierror-sizediffdisabled": "A diferenza de tamaño está deshabilitada no modo Miser.",
        "apierror-spamdetected": "A súa edición foi rexeitada por conter un fragmento de publicidade: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Non ten permiso para ver os resultados desta páxina especial.",
+       "apierror-stashedfilenotfound": "Non se puido atopar o ficheiro na reserva: $1.",
+       "apierror-stashfailed-complete": "A suba por partes completouse, revise o estado para obter máis detalles.",
+       "apierror-stashfailed-nosession": "Non hai sesión de suba por partes con esa clave.",
+       "apierror-stashfilestorage": "Non se puido almacenar a suba na reservaː $1",
        "apierror-stashinvalidfile": "Ficheiro de reserva incorrecto.",
        "apierror-stashpathinvalid": "Clave de ficheiro con formato incorrecto ou non válidaː $1.",
        "apierror-stashwrongowner": "Erro de propietarioː $1",
        "apierror-stashzerolength": "Ficheiro de lonxitude cero, non pode ser almacenado na reservaː $1.",
        "apierror-systemblocked": "Foi bloqueado automaticamente polo software MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "A expansión de modelos só é compatible co contido en wikitexto. $1 usa o modelo de contido $2.",
+       "apierror-unknownaction": "A acción especificada, <kbd>$1</kbd>, non está recoñecida.",
        "apierror-unknownerror-editpage": "Erro descoñecido EditPageː $1.",
        "apierror-unknownerror-nocode": "Erro descoñecido.",
        "apierror-unknownerror": "Erro descoñecido: \"$1\".",
        "apierror-unknownformat": "Formato descoñecido \"$1\".",
        "apierror-unrecognizedparams": "{{PLURAL:$2|Parámetro non recoñecido|Parámetros non recoñecidos}}: $1.",
        "apierror-unrecognizedvalue": "Valor non recoñecido para o parámetro <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "O repositorio local de ficheiros non permite consultar tódalas imaxes.",
+       "apierror-upload-filekeyneeded": "Debe proporcionar un <var>filekey</var> cando <var>offset</var> é distinto de cero.",
+       "apierror-upload-filekeynotallowed": "Non pode proporcionar <var>filekey</var> cando <var>offset</var> é 0.",
+       "apierror-upload-inprogress": "A suba dende a reserva está en progreso.",
+       "apierror-upload-missingresult": "Non hai resultado nos datos de estado.",
        "apierror-urlparamnormal": "Non se puideron normalizar os parámetros de imaxe de $1.",
        "apierror-writeapidenied": "Non ten permiso para editar este wiki a través da API.",
        "apiwarn-alldeletedrevisions-performance": "Para ter un mellor rendemento á hora de xerar títulos, estableza <kbd>$1dir=newer</kbd>.",
        "apiwarn-badurlparam": "Non se puido analizar <var>$1urlparam</var> para $2. Só se usará a anchura e a altura.",
+       "apiwarn-badutf8": "O valor pasado para <var>$1</var> contén datos non válidos ou non normalizados. Os datos de texto deberían estar en formato Unicode válido, normalizado en NFC e sen caracteres de control C0 distintos de HT (\\t), LF (\\n) e CR (\\r).",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> quedou obsoleto. No seu lugar, utilice <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd>.",
+       "apiwarn-deprecation-expandtemplates-prop": "Como non se especificou ningún valor para o parámetro <var>prop</var>, utilizouse un formato herdado para a saída. Este formato está en desuso e, no futuro, o parámetro <var>prop</var> terá un valor predeterminado, de forma que sempre se utilizará o formato novo.",
        "apiwarn-deprecation-httpsexpected": "Utilizouse HTTP cando esperábase HTTPS.",
+       "apiwarn-deprecation-login-botpw": "O inicio de sesión coa conta principal mediante <kbd>action=login</kbd> está en desuso e pode deixar de funcionar sen aviso previo. Para proseguir o inicio de sesión mediante <kbd>action=login</kbd>, consulte [[Special:BotPasswords]]. Para proseguir o inicio de sesión coa conta principal de forma segura, consulte <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "O inicio de sesión coa conta principal mediante <kbd>action=login</kbd> está en desuso e pode deixar de funcionar sen aviso previo. Para iniciar sesión de forma segura, consulte <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-parameter": "O parámetro <var>$1</var> está obsoleto.",
+       "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> está en desuso desde MediaWiki 1.28. Use <kbd>prop=headhtml</kbd> cando cree novos documentos HTML, ou <kbd>prop=módulos|jsconfigvars</kbd> cando actualice un documento no lado do cliente.",
+       "apiwarn-deprecation-purge-get": "O uso de <kbd>action=purge</kbd> mediante GET está obsoleto. Use POST no seu lugar.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> está obsoleto. No seu lugar, utilice <kbd>$2</kbd>.",
+       "apiwarn-difftohidden": "Imposible facer un diff con r$1: o contido está oculto.",
        "apiwarn-invalidcategory": "\"$1\" non é unha categoría.",
        "apiwarn-invalidtitle": "\"$1\" non é un título válido.",
+       "apiwarn-invalidxmlstylesheetext": "As follas de estilo deben ter a extensión <code>.xsl</code>.",
+       "apiwarn-invalidxmlstylesheet": "A folla de estilos especificada non é válida ou non existe.",
+       "apiwarn-invalidxmlstylesheetns": "A folla de estilos debería estar no espazo de nomes {{ns:MediaWiki}}.",
+       "apiwarn-moduleswithoutvars": "A propiedade <kbd>modules</kbd> está definida, pero non o está <kbd>jsconfigvars</kbd> nin <kbd>encodedjsconfigvars</kbd>. As variables de configuración son necesarias para o correcto uso do módulo.",
        "apiwarn-notfile": "\"$1\" non é un ficheiro.",
        "apiwarn-parse-nocontentmodel": "Non se proporcionou <var>title</var> nin <var>contentmodel</var>, asúmese $1.",
        "apiwarn-tokennotallowed": "A acción \"$1\" non está permitida para o usuario actual.",
-       "apiwarn-toomanyvalues": "Demasiados valores para o parámetro <var>$1</var>: o límite é $2.",
+       "apiwarn-toomanyvalues": "Demasiados valores para o parámetro <var>$1</var>. O límite é $2.",
        "apiwarn-truncatedresult": "Truncouse este resultado porque doutra maneira sobrepasaría o límite de $1 bytes.",
+       "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valor non recoñecido|Valores non recoñecidos}} para o parámetro <var>$1</var>: $2.",
+       "apiwarn-unsupportedarray": "O parámetro <var>$1</var> usa unha sintaxe PHP de matriz que non está soportada.",
+       "apiwarn-validationfailed-badchars": "caracteres non válidos na clave (só se admiten os caracteres <code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, <code>_</code> e <code>-</code>).",
        "apiwarn-validationfailed-badpref": "non é unha preferencia válida.",
        "apiwarn-validationfailed-cannotset": "non pode ser establecido por este módulo.",
+       "apiwarn-validationfailed-keytoolong": "clave demasiado longa (non pode ter máis de $1 bytes).",
        "apiwarn-validationfailed": "Erro de validación de <kbd>$1</kbd>: $2",
        "apiwarn-wgDebugAPI": "<strong>Aviso de seguridade</strong>: <var>$wgDebugAPI</var> está habilitado.",
        "api-feed-error-title": "Erro ($1)",
        "api-usage-docref": "Consulte $1 para ver o uso da API.",
+       "api-usage-mailinglist-ref": "Subscribirse á lista de correo mediawiki-api-announce en &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt;  para obter avisos de obsolescencia da API ou de modificacións importantes.",
        "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 682f9fc..b6a5b09 100644 (file)
                        "Macofe",
                        "MojoMann",
                        "Mikey641",
-                       "Esh77"
+                       "Esh77",
+                       "שמזן",
+                       "Or"
                ]
        },
-       "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|תיעוד]]\n* [[mw:Special:MyLanguage/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:Special:MyLanguage/API:Errors_and_warnings|API: שגיאות ואזהרות]].\n\n<strong>בדיקה:</strong> לבדיקה קלה יותר של בקשות ר' [[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-maxlag": "שיהוי מרבי יכול לשמש כשמדיה־ויקי מותקנת בצביר עם מסד נתונים משוכפל. כדי לחסוך בפעולות שגורמות יותר שיהוי בשכפול אתר, הפרמטר הזה יכול לגרום ללקוח להמתין עד ששיהוי השכפול יורד מתחת לערך שצוין. במקרה של שיהוי מוגזם, קוד השגיאה <samp>maxlag</samp> מוחזר עם הודעה כמו <samp>Waiting for $host: $lag seconds lagged</samp>.<br />ר' [[mw:Special:MyLanguage/Manual:Maxlag_parameter|מדריך למשתמש: פרמטר maxlag]] למידע נוסף.",
        "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>.",
@@ -43,7 +45,7 @@
        "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-allowusertalk": "לאפשר למשתמש לערוך את דף השיחה שלו או שלה (תלוי ב־<var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "אם המשתמש כבר חסום, לדרוס את החסימה הנוכחית.",
        "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.",
        "apihelp-block-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.",
        "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-suggest": "לא לעשות דבר אם <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> הוא false.",
        "apihelp-opensearch-param-redirects": "איך לטפל בהפניות:\n;return:להחזיר את ההפניה עצמה.\n;resolve:להחזיר את דף היעד. יכול להחזיר פחות מ־$1limit תוצאות.\nמסיבות היסטוריות, בררת המחדל היא \"return\" עבור $1format=json ו־\"resolve\" עבור תסדירים אחרים.",
        "apihelp-opensearch-param-format": "תסדיר הפלט.",
        "apihelp-opensearch-param-warningsaserror": "אם אזהרות מוּעלות עם <kbd>format=json</kbd>, להחזיר שגיאת API במקום להתעלם מהן.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "נותן דו\"ח הגבלות בדרך מובנית. לא נותן שום נתונים כאשר מוגדר <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "נותן את גרסת ה־HTML של דו\"ח ההגבלות. לא נותן שום נתונים כאשר מוגדר <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-parsetree": "עץ פענוח XML של תוכן הגרסה (דורש מודל תוכן <code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "נותן אזהרות שאירעו בזמן פענוח התוכן.",
+       "apihelp-parse-param-wrapoutputclass": "מחלקה של CSS שתשמש לעטיפת פלט המפענח.",
        "apihelp-parse-param-pst": "לעשות התמרה לפני שמירה על הקלט לפני פענוחו. תקין רק בשימוש עם טקסט.",
        "apihelp-parse-param-onlypst": "לעשות התמרה לפני שמירה (pre-save transform‏, PST) על הקלט, אבל לא לפענח אותו. מחזיר את אותו קוד הוויקי אחרי החלת PST. תקף רק בשימוש עם <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "כולל קישור שפה שמספקות הרחבות (לשימוש עם <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-preview": "לפענח במצב תצוגה מקדימה.",
        "apihelp-parse-param-sectionpreview": "לפענח במצב תצוגה מקדימה של פסקה (מדליק גם את מצב תצוגה מקדימה).",
        "apihelp-parse-param-disabletoc": "להשמיט את תוכן העניינים בפלט.",
+       "apihelp-parse-param-useskin": "להחיל את העיצוב שנבחר לפלט המפענח. יכול להשפיע על המאפיינים הבאים: <kbd dir=\"ltr\">langlinks</kbd>, <kbd dir=\"ltr\">headitems</kbd>, <kbd dir=\"ltr\">modules</kbd>, <kbd dir=\"ltr\">jsconfigvars</kbd>, <kbd dir=\"ltr\">indicators</kbd>.",
        "apihelp-parse-param-contentformat": "תסדיר הסדרת תוכן שישמש לטקסט הקלט. תקף רק עם $1text.",
        "apihelp-parse-param-contentmodel": "מודל התוכן של טקסט הקלט. אם זה מושמט, יש לציין את $1title והערך ההתחלתי יהיה המודל של הכותרת שצוינה. תקין רק כאשר משמש עם $1text.",
        "apihelp-parse-example-page": "לפענח דף.",
        "apihelp-query+alldeletedrevisions-param-user": "לרשום רק גרסאות מאת המשתמש הזה.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "לא לרשום גרסאות מאת המשתמש הזה.",
        "apihelp-query+alldeletedrevisions-param-namespace": "לרשום רק דפים במרחב השם הזה.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>לתשומת לבך:</strong> בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]], שימוש ב־<var>$1user</var> וב־<var>$1namespace</var> ביחד עלול להניב החזרה של פחות מ־<var>$1limit</var> תוצאות לפני המשך; במצבים קיצוניים יכולות להיות מוחזרות אפס תוצאות.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>לתשומת לבך:</strong> בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]], שימוש ב־<var>$1user</var> וב־<var>$1namespace</var> ביחד עלול להניב החזרה של פחות מ־<var>$1limit</var> תוצאות לפני המשך; במצבים קיצוניים יכולות להיות מוחזרות אפס תוצאות.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "בעת שימוש בתור מחולל, לחולל כותרת במקום מזהי גרסה.",
        "apihelp-query+alldeletedrevisions-example-user": "לרשום את 50 התרומות המחוקות האחרונות של משתמש <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "רשימת 50 הגרסאות המחוקות הראשונות במרחב הראשי.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "הוספת שם הקובץ של גרסה מאורכבת עבור גרסאות שאינן האחרונה.",
        "apihelp-query+filearchive-example-simple": "הצגת רשימת כל הקבצים המחוקים.",
        "apihelp-query+filerepoinfo-description": "החזרת מידע מטא על מאגרי תמונות שמוגדרים בוויקי.",
-       "apihelp-query+filerepoinfo-param-prop": "אילו מאפייני מאגר לקבל (יכולים להיות יותר מזה באתרי ויקי אחדים):\n;apiurl:URL ל־API של המאגר – מועיל לקבלת מידע על התמונה מהמארח.\n;name:המפתח של המאגר – משמש למשל בערכים המוחזרים מ־<var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> ומ־[[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:שם קריא של אתר הוויקי של המאגר.\n;rooturl:URL שורש לנתיבי תמונות.\n;local:האם המאגר הוא מקומי או לא.",
+       "apihelp-query+filerepoinfo-param-prop": "אילו מאפייני מאגר לקבל (יכולים להיות יותר מזה באתרי ויקי אחדים):\n;apiurl:URL ל־API של המאגר – מועיל לקבלת מידע על התמונה מהמארח.\n;name:המפתח של המאגר – משמש למשל בערכים המוחזרים מ־<var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> ומ־[[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:שם קריא של אתר הוויקי של המאגר.\n;rooturl:URL שורש לנתיבי תמונות.\n;local:האם המאגר הוא מקומי או לא.",
        "apihelp-query+filerepoinfo-example-simple": "קבלת מידע על מאגרי קבצים.",
        "apihelp-query+fileusage-description": "מציאת כל הדפים שמשתמשים בקבצים הנתונים.",
        "apihelp-query+fileusage-param-prop": "אילו מאפיינים לקבל:",
        "apihelp-query+redirects-example-generator": "קבלת מידע על כל ההפניות ל־[[Main Page]].",
        "apihelp-query+revisions-description": "קבלת מידע על גרסה.\n\nיכול לשמש במספר דרכים:\n# קבלת נתונים על ערכת דפים (גרסה אחרונה), באמצעות כותרות או מזהי דף.\n# קבלת גרסאות עבור דף נתון אחד, באמצעות שימוש בכותרות או במזהי דף עם start‏, end או limit.\n# קבלת נתונים על ערכת גרסאות באמצעות הגדרת המזהים שלהם עם revid־ים.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "יכול לשמש רק עם דף בודד (mode #2).",
-       "apihelp-query+revisions-param-startid": "×\9e×\90×\99×\96×\94 ×\9e×\96×\94×\94 ×\92רס×\94 ×\9c×\94ת×\97×\99×\9c ×\9c×\9e× ×\95ת.",
-       "apihelp-query+revisions-param-endid": "×\91×\90×\99×\96×\94 ×\9e×\96×\94×\94 ×\92רס×\94 ×\9c×\94פס×\99ק ×\90ת ×\9e× ×\99×\99ת ×\94×\92רס×\90×\95ת.",
+       "apihelp-query+revisions-param-startid": "×\9c×\94ת×\97×\99×\9c ×\9c×\9e× ×\95ת ×\9e×\97×\95ת×\9d ×\94×\96×\9e×\9f ×©×\9c ×\94×\92רס×\94 ×\94×\96×\90ת. ×\94×\92רס×\94 ×¦×¨×\99×\9b×\94 ×\9c×\94×\99×\95ת ×§×\99×\99×\9eת, ×\90×\91×\9c ×\9c×\90 ×\97×\99×\99×\91ת ×\9c×\94×\99×\95ת ×©×\99×\99×\9bת ×\9c×\93×£ ×\94×\96×\94.",
+       "apihelp-query+revisions-param-endid": "×\9c×\94פס×\99ק ×\9c×\9e× ×\95ת ×\9e×\97×\95ת×\9d ×\94×\96×\9e×\9f ×©×\9c ×\94×\92רס×\94 ×\94×\96×\90ת. ×\94×\92רס×\94 ×¦×¨×\99×\9b×\94 ×\9c×\94×\99×\95ת ×§×\99×\99×\9eת, ×\90×\91×\9c ×\9c×\90 ×\97×\99×\99×\91ת ×\9c×\94×\99×\95ת ×©×\99×\99×\9bת ×\9c×\93×£ ×\94×\96×\94.",
        "apihelp-query+revisions-param-start": "מאיזה חותם־זמן של גרסה להתחיל למנות.",
        "apihelp-query+revisions-param-end": "למנות עד חותם־הזמן הזה.",
        "apihelp-query+revisions-param-user": "לכלול רק גרסאות מאת משתמש.",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "מזהה הגרסה.",
        "apihelp-query+revisions+base-paramvalue-prop-flags": "דגלי גרסה (משני).",
        "apihelp-query+revisions+base-paramvalue-prop-timestamp": "חותם־הזמן של הגרסה.",
-       "apihelp-query+revisions+base-paramvalue-prop-user": "המתמש שעשה את הגרסה",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "×\94×\9eשת×\9eש ×©×¢×©×\94 ×\90ת ×\94×\92רס×\94",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "מזהה המשתמש של יוצר הגרסה.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "אורך (בבייטים) של הגרסה.",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (בבסיס 16) של הגרסה.",
        "apihelp-query+search-param-limit": "כמה דפים להחזיר בסך הכול.",
        "apihelp-query+search-param-interwiki": "לכלול תוצאות בינוויקי בחיפוש, אם זמין.",
        "apihelp-query+search-param-backend": "באיזה שרת חיפוש להשתמש אם לא בבררת המחדל.",
-       "apihelp-query+search-param-enablerewrites": "×\94פע×\9cת ×©×\9bת×\95×\91 ×©×\90×\99×\9cת×\95ת ×¤× ×\99×\9e×\99. ×©×¨×ª×\99 ×\97×\99פ×\95ש ×\90×\97×\93×\99×\9d ×\99×\9b×\95×\9c×\99×\9d ×\9cש×\9bת×\91 ×\90ת ×\94ש×\90×\99×\9cת×\94 ×\9cצ×\95ר×\94 ×©×\9c×\93עת×\9d × ×\95תנת ×ª×\95צ×\90×\95ת ×\98×\95×\91×\95ת ×\99×\95תר, ×\9c×\9eש×\9c תיקון שגיאות כתיב.",
+       "apihelp-query+search-param-enablerewrites": "×\94פע×\9cת ×©×\9bת×\95×\91 ×©×\90×\99×\9cת×\95ת ×¤× ×\99×\9e×\99. ×©×¨×ª×\99 ×\97×\99פ×\95ש ×\90×\97×\93×\99×\9d ×\99×\9b×\95×\9c×\99×\9d ×\9cש×\9bת×\91 ×\90ת ×\94ש×\90×\99×\9cת×\94 ×\9cצ×\95ר×\94 ×\90×\97רת ×©× ×\97ש×\91ת ×\9c×\9b×\96×\90ת ×©×\9eספקת ×ª×\95צ×\90×\95ת ×\98×\95×\91×\95ת ×\99×\95תר, ×\9c×\9eש×\9c ×\91×\90×\9eצע×\95ת תיקון שגיאות כתיב.",
        "apihelp-query+search-example-simple": "חיפוש <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "חיפוש טקסטים עבור <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "קבלת מידע על הדף עבור שמוחזרים מחיפוש אחרי <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "החזרת הזכויות (הרישיון) של הוויקי, אם זמין.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "החזרת מידע על ההגבלות (ההגנות) הזמינות.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "החזרת השפות שמדיה־ויקי תומכת בהן (זה יכול להיות מותאם מקומים עם <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "מחזיר רשימת קודי שפה שמופעל עבורם ממיר שפה ([[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]]), וההגוונים הנתמכים עבור כל אחת מהן.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "החזרת רשימת כל העיצובים הזמינים (זה יכול להיות מותאם מקומית באמצעות <var>$1inlanguagecode</var>, אחרת זה יהיה בשפת התוכן).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "החזרת רשימת תגי הרחבת מפענח.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "החזרת hook־ים של הרחבות מפענח.",
-       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "החזרת כל ה־hook־ים המנויים (תוכן של <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "החזרת כל ה־hook־ים המנויים (תוכן של <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "החזרת מזהי משתנים.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "החזרת רשימת הפרוטוקולים המותרים בקישורים חיצוניים.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "החזרת הערכים ההתחלתיים של העדפות משתמש.",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "הוספת הדגלים של העריכה.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "מתייג עריכות בדוקות.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "רשימת תגים עבור עריכות.",
-       "apihelp-query+usercontribs-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלה, למשל רק עריכות לא־משניות.\n\nאם מוגדר <kbd>$2show=patrolled</kbd> או <kbd>$2show=!patrolled</kbd>, גרסאות ישנות מ־<var dir=\"ltr\">[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>‏ ({{PLURAL:$1|שנייה אחת|$1 שניות}}) לא תוצגנה.",
+       "apihelp-query+usercontribs-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלה, למשל רק עריכות לא־משניות.\n\nאם מוגדר <kbd>$2show=patrolled</kbd> או <kbd>$2show=!patrolled</kbd>, גרסאות ישנות מ־<var dir=\"ltr\">[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>‏ ({{PLURAL:$1|שנייה אחת|$1 שניות}}) לא תוצגנה.",
        "apihelp-query+usercontribs-param-tag": "לרשום רק גרסאות עם התג הזה.",
        "apihelp-query+usercontribs-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.",
        "apihelp-query+usercontribs-example-user": "הצגת התרומות של המשתמש <kbd>Example</kbd>.",
        "apihelp-removeauthenticationdata-description": "הסרת נתוני אימות עבור המשתמש הנוכחי.",
        "apihelp-removeauthenticationdata-example-simple": "לנסות להסיר את נתוני המשתמש הנוכחי בשביל <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "שליחת דוא\"ל איפוס סיסמה למשתמש.",
-       "apihelp-resetpassword-description-noroutes": "אין מסלולים לאיפוס ססמה.\n\nכדי להשתמש במודול הזה, יש להפעיל מסלולים ב־<var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.",
+       "apihelp-resetpassword-description-noroutes": "אין מסלולים לאיפוס ססמה.\n\nכדי להשתמש במודול הזה, יש להפעיל מסלולים ב־<var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.",
        "apihelp-resetpassword-param-user": "המשתמש שמאופס.",
        "apihelp-resetpassword-param-email": "כתובת הדוא\"ל של המשתמש שהסיסמה שלו מאופסת.",
        "apihelp-resetpassword-example-user": "שליחת מכתב איפוס ססמה למשתמש <kbd>Example</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-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את <var>[[mw:Special:MyLanguage/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-upload-param-sessionkey": "אותו דבר כמו $1filekey, מושאר לצור תאימות אחורה.",
        "apihelp-upload-param-stash": "אם זה מוגדר, השרת יסליק זמנית את הקובץ במקום להוסיף אותו למאגר.",
        "apihelp-upload-param-filesize": "גודל הקובץ של כל ההעלאה.",
-       "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94×\97ת×\99×\9b×\94 ×\91×\91×\99×\99×\98ים.",
+       "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94פ×\9c×\97 ×\91×\91תים.",
        "apihelp-upload-param-chunk": "תוכן החתיכה.",
        "apihelp-upload-param-async": "להפוך פעולות קבצים גדולות לאסינכרוניות כשאפשר.",
        "apihelp-upload-param-checkstatus": "לאחזר רק מצב העלאה עבור מפתח הקובץ שניתן.",
        "apihelp-userrights-param-user": "שם משתמש.",
        "apihelp-userrights-param-userid": "מזהה משתמש.",
        "apihelp-userrights-param-add": "הוספת המשתמש לקבוצות האלו, ואם הוא כבר חבר, עדכון זמן התפוגה של החברות בקבוצה הזאת.",
+       "apihelp-userrights-param-expiry": "חותמי־זמן תפוגה. יכולים להיות יחסיים (למשל <kbd>5 months</kbd> או <kbd>2 weeks</kbd>) או מוחלטים (למשל <kbd>2014-09-18T12:34:56Z</kbd>). אם מוגדר רק חותם־זמן אחד, הוא ישמש לכל הקבוצות שהועברו לפרמטר <var>$1add</var>. יש להשתמש ב־<kbd>infinite</kbd>‏, <kbd>indefinite</kbd>‏, <kbd>infinity</kbd>, או <kbd>never</kbd> בשביל קבוצת משתמשים שאינה פגה לעולם.",
        "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-userrights-example-expiry": "להוסיף את <kbd>SometimeSysop</kbd> לקבוצה <kbd>sysop</kbd> לחודש אחד.",
        "apihelp-validatepassword-description": "לבדוק תקינות ססמה אל מול מדיניות הססמאות של הוויקי.\n\nהתקינות מדווחת כ־<samp>Good</samp> אם הססמה קבילה, <samp>Change</samp> אם הססמה יכולה לשמש לכניסה, אבל צריכה להשתנות, או <samp>Invalid</samp> אם הססמה אינה שמישה.",
        "apihelp-validatepassword-param-password": "ססמה שתקינותה תיבדק.",
        "apihelp-validatepassword-param-user": "שם משתמש, לשימוש בעת בדיקת יצירת חשבון. המשתמש ששמו ניתן צריך לא להיות קיים.",
        "apihelp-xml-param-includexmlnamespace": "אם זה צוין, מוסיף מרחב שם של XML.",
        "apihelp-xmlfm-description": "לפלוט נתונים בתסדיר XML (עם הדפסה יפה ב־HTML).",
        "api-format-title": "תוצאה של API של מדיה־ויקי",
-       "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר <var>format</var> כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום <kbd>format=$2</kbd>.\n\nר' את [[mw:API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
-       "api-format-prettyprint-header-only-html": "זה ייצוג HTML שמיועד לניפוי שגיאות ואינו מתאים לשימוש ביישומים.\n\nר' את [[mw:API|התיעוד המלא]] או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
+       "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר <var>format</var> כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום <kbd>format=$2</kbd>.\n\nר' את [[mw:Special:MyLanguage/API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
+       "api-format-prettyprint-header-only-html": "זה ייצוג HTML שמיועד לניפוי שגיאות ואינו מתאים לשימוש ביישומים.\n\nר' את [[mw:Special:MyLanguage/API|התיעוד המלא]] או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
        "api-format-prettyprint-status": "התשובה הזאת הייתה מוחזרת עם סטטוס ה־HTTP מס' $1 עם הטקסט $2.",
+       "api-login-fail-aborted": "אימות דורש הידוד עם המשתמש, שאינו נתמך ב־<kbd>action=login</kbd>. כדי שיהיה אפשר להיכנס לחשבון עם <kbd>action=login</kbd>, נא לראות את [[Special:BotPasswords]]. כדי להמשיך להשתמש בכניסה עם חשבון ראשי, ר' <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-aborted-nobotpw": "אימות דורש הידוד עם המשתמש, שאינו נתמך ב־<kbd>action=login</kbd>. כדי להיכנס לחשבון, ר' <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-badsessionprovider": "לא ניתן להיכנס לחשבון באמצעות $1.",
+       "api-login-fail-sameorigin": "לא ניתן להיכנס לחשבון כאשר מדיניות מקור זהה אינה חלה.",
        "api-pageset-param-titles": "רשימת כותרות.",
        "api-pageset-param-pageids": "רשימת מזהי דף לעבוד עליהם.",
        "api-pageset-param-revids": "רשימת מזהי גרסה לעבוד עליהם.",
        "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": "לשם תאימות, גם האסימון שמשמש בממשק דפדפן מתקבל.",
-       "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-disabled-in-miser-mode": "כבוי בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]].",
+       "api-help-param-limited-in-miser-mode": "<strong>לתשומת לבך:</strong> בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]], שימוש בזה יכול להוביל לפחות מ־<var>$1limit</var> תוצאות לפני המשך; במצבים קיצוניים ייתכן שיחזרו אפס תוצאות.",
        "api-help-param-direction": "באיזה כיוון למנות:\n;newer:לרשום את הישנים ביותר בהתחלה. לתשומת לבך: $1start חייב להיות לפני $1end.\n;older:לרשום את החדשים ביותר בהתחלה (בררת מחדל). לתשומת לבך: $1start חייב להיות אחרי $1end.",
        "api-help-param-continue": "כשיש עוד תוצאות, להשתמש בזה בשביל להמשיך.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(ללא תיאור)</span>",
        "apierror-blockedfrommail": "נחסמת משליחת דוא״ל.",
        "apierror-blocked": "נחסמת מעריכה.",
        "apierror-botsnotsupported": "הממשק הזה לא נתמך עבור בוטים.",
+       "apierror-cannot-async-upload-file": "הפרמטרים  <var>async</var> ו־<var>file</var> אינם יכולים להיות משולבים. אם ברצונך לבצע עיבוד אסינכרוני של הקובץ המועלה שלך, יש להעלות אותו תחילה לסליק (באמצעות הפרמטר <var>stash</var>) ואז לפרסם את הקובץ המוסלק באופן אסינכרוני (באמצעות <var>filekey</var> ו־<var>async</var>).",
        "apierror-cannotreauthenticate": "הפעולה הזאת אינה זמינה, כי הזהות שלך לא יכולה להיות מאומתת.",
        "apierror-cannotviewtitle": "אין לך הרשאה להציג את $1.",
        "apierror-cantblock-email": "אין לך הרשאה לחסום משתמשים משליחת דואר אלקטרוני דרך הוויקי.",
        "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": "הפרמטר <var>oldimage</var> נשלח בתסדיר בלתי־תקין.",
+       "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": "הפרמטר <var>section</var> להיות מזהה מקטע תקין או <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": "ממתין לשרת מסד נתונים: עיכוב של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
        "apierror-maxlag": "ממתין ל־$2: שיהוי של {{PLURAL:$1|שנייה אחת|$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 dir=\"ltr\">$wgEnableWriteAPI=true;</code> כלול בקובץ <code>LocalSettings.php</code> של הוויקי.",
        "apierror-nochanges": "לא התבקשו שינויים.",
        "apierror-nodeleteablefile": "אין גרסה ישנה כזאת של הקובץ.",
        "apierror-no-direct-editing": "עריכה ישירה דרך ה־API אינה נתמכת עבור דגם התוכן $1 שמשמש ב{{GRAMMAR:תחילית|$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 ב{{GRAMMAR:תחילית|$2}}.",
+       "apierror-nosuchuserid": "אין משתמש עם המזהה $1.",
+       "apierror-notarget": "לא נתת יעד תקין לפעולה הזאת.",
+       "apierror-notpatrollable": "לא ניתן לנטר את הגרסה $1 כי היא ישנה מדי.",
+       "apierror-nouploadmodule": "לא הוגדר מודול העלאה.",
+       "apierror-opensearch-json-warnings": "לא ניתן לייצג את האזהרות בתסדיר JSON של OpenSearch.",
+       "apierror-pagecannotexist": "מרחב השם אינו מתיר דפים אמתיים.",
+       "apierror-pagedeleted": "הדף הזה נמחק מאז שאחזרת את חותם הזמן שלו.",
+       "apierror-pagelang-disabled": "שינוי שפת הדף אסור בוויקי הזה.",
+       "apierror-paramempty": "הפרמטר <var>$1</var> אינו יכול להיות ריק.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> נתמך רק בתוכן קוד ויקי (wikitext).",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> נתמך רק בתוכן קוד ויקי (wikitext). $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": "כותר <code>Promise-Non-Write-API-Action</code> של HTTP אינו יכול להישלח למודולי API שפועלים במצב כתיבה.",
+       "apierror-protect-invalidaction": "סוג הגנה בלתי־תקין \"$1\".",
+       "apierror-protect-invalidlevel": "קמת הגנה בלתי־תקינה \"$1\".",
+       "apierror-ratelimited": "עברת את מכסת הקצב שלך. נא להמתין זמן־מה ונסות שוב.",
+       "apierror-readapidenied": "יש צורך בהרשאת קריאה כדי להשתמש במודול הזה.",
+       "apierror-readonly": "הוויקי הזה במצב לקריאה בלבד עכשיו.",
+       "apierror-reauthenticate": "לא עברת אימות לאחרונה בשיחה הזאת, נא להתאמת מחדש.",
+       "apierror-redirect-appendonly": "ניסית לערוך במצב מעבר־אחר־הפניות (redirect-following), שצריך לשמש יחד עם <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-badid": "לא נמצאה גרסה לפרמטר <var>$1</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": "הגרסה $1 אינה גרסה של $2.",
+       "apierror-searchdisabled": "חיפוש <var>$1</var> כבוי.",
+       "apierror-sectionreplacefailed": "לא היה אפשר למזג את המקטע המעודכן.",
+       "apierror-sectionsnotsupported": "מקטעים אינם נתמכים במודל התוכן $1.",
+       "apierror-sectionsnotsupported-what": "מקטעים אינם נתמכים ב־$1.",
+       "apierror-show": "פרמטר לא נכון – אי־אפשר לספק ערכים שמבטלים זה את זה.",
+       "apierror-siteinfo-includealldenied": "לא ניתן להציג את המידע של כל השרתים אלא אם <var dir=\"ltr\">$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": "אין מפתח קובץ כזה: $1.",
        "apierror-stashpathinvalid": "מפתח קובץ מתסדיר בלתי־הולם או בלתי־תקין באופן אחר: $1.",
        "apierror-stashwrongowner": "בעלים בלתי־תקין: $1",
        "apierror-stashzerolength": "קובץ באורך אפס, ואל יכול משוחזר בסליק: $1.",
        "apierror-systemblocked": "נחסמת אוטומטית על־ידי מדיה־ויקי.",
+       "apierror-templateexpansion-notwikitext": "הרחבת תבניות נתמכת רק בתוכן קוד ויקי (wikitext). $1 משתמש במודל התוכן $2.",
+       "apierror-toofewexpiries": "{{PLURAL:$1|ניתן חותם זמן תפוגה אחד|ניתנו $1 חותמי זמן תפוגה}} כאשר {{PLURAL:$2|היה נחוץ אחד|היו נחוצים $1}}.",
+       "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. משתמשים רק ב־width ו־height.",
        "apiwarn-deprecation-expandtemplates-prop": "מכיוון שלא ניתנו ערכים לפרמטר <var>prop</var>, תסדיר מיושן ישמש לפלט. התסדיר הזה מיושן, ובעתיד יינתן ערך בררת מחדל לפרמטר <var>prop</var>, כך שתמיד ישמש התסדיר החדש.",
        "apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.",
        "apiwarn-deprecation-login-botpw": "כניסה לחשבון עיקרי (main-account) דרך <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> מיושן מאז מדיה־ויקי 1.28. יש להשתמש ב־<kbd>prop=headhtml</kbd> בעת יצירת מסמכי HTML חדשים, או ב־<kbd>prop=modules|jsconfigvars</kbd> בעת עדכון מסמך בצד הלקוח.",
        "apiwarn-redirectsandrevids": "פתרון הפניות לא יכול לשמש יחד עם הפרמטר <var>revids</var>. הפניות ש־<var>revids</var> מצביע אליהן לא נפתרו.",
        "apiwarn-tokennotallowed": "הפעולה \"$1\" אינה מותרת למשתמש הנוכחי.",
        "apiwarn-tokens-origin": "לא ניתן לקבל אסימונים כשמדיניות המקור הזהה אינה חלה.",
-       "apiwarn-toomanyvalues": "יותר מדי ערכים סופקו לפרמטר <var>$1</var>: המגבלה היא $2.",
+       "apiwarn-toomanyvalues": "יותר מדי ערכים סופקו לפרמטר <var>$1</var>. המגבלה היא $2.",
        "apiwarn-truncatedresult": "התוצאה נחתכה כי אחרת היא הייתה ארוכה מהמגבלה של $1 בתים.",
        "apiwarn-unclearnowtimestamp": "העברת \"$2\" בתור פרמטר חותם־זמן <var>$1</var> הוצהרה בתור מיושנת. אם מסיבה כלשהי אתם צריכים להגדיר במפורש את הזמן הנוכחי ללא חישובו בצד הלקוח, יש להשתמש ב־<kbd>now</kbd>.",
        "apiwarn-unrecognizedvalues": "לפרמטר <var>$1</var> היתנ ג{{PLURAL:$3|ניתן ערך בלתי־ידוע|ניתנו ערכים בלתי־ידועים}}: $2.",
index 232386e..746391e 100644 (file)
                        "Dj"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentáció]]\n* [[mw:Special:MyLanguage/API:FAQ|GYIK]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Levelezőlista]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-bejelentések]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Hibabejelentések és kérések]\n</div>\n<strong>Státusz:</strong> Minden ezen a lapon látható funkciónak működnie kell, de az API jelenleg is aktív fejlesztés alatt áll, és bármikor változhat. Iratkozz fel a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce levelezőlistára] a frissítések követéséhez.\n\n<strong>Hibás kérések:</strong> Ha az API hibás kérést kap, egy HTTP-fejlécet küld vissza „MediaWiki-API-Error” kulccsal, és a fejléc értéke és a visszaküldött hibakód ugyanarra az értékre lesz állítva. További információért lásd: [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Hibák és figyelmeztetések]].\n\n<strong>Tesztelés:</strong> Az API-kérések könnyebb teszteléséhez használható az [[Special:ApiSandbox|API-homokozó]].",
        "apihelp-main-param-action": "Milyen műveletet hajtson végre.",
        "apihelp-main-param-format": "A kimenet formátuma.",
+       "apihelp-main-param-smaxage": "Az <code>s-maxage</code> gyorsítótár-vezérlő HTTP-fejléc beállítása ennyi másodpercre. A hibák soha nincsenek gyorsítótárazva.",
+       "apihelp-main-param-maxage": "Az <code>maxage</code> gyorsítótár-vezérlő HTTP-fejléc beállítása ennyi másodpercre. A hibák soha nincsenek gyorsítótárazva.",
+       "apihelp-main-param-assert": "Annak ellenőrzése, hogy a felhasználó be van-e jelentkezve <kbd>user</kbd> érték esetén, vagy botjog ellenőrzése <kbd>bot</kbd> érték esetén.",
+       "apihelp-main-param-assertuser": "Annak ellenőrzése, hogy a jelenlegi felhasználó a megadott-e.",
        "apihelp-main-param-requestid": "Az itt megadott bármilyen érték szerepelni fog a válaszban. Több kérés megkülönböztetésére használható.",
        "apihelp-main-param-servedby": "Tartalmazza a válasz kérést kiszolgáló gép nevét.",
        "apihelp-main-param-curtimestamp": "Tartalmazza a válasz az aktuális időbélyeget.",
+       "apihelp-main-param-responselanginfo": "A válasz tartalmazza <var>uselang</var> és <var>errorlang</var> paraméterekben használt nyelveket.",
+       "apihelp-main-param-uselang": "Az üzenetfordításokhoz használandó nyelv. A <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> a <kbd>siprop=languages</kbd> paraméterrel visszaadja a lehetséges nyelvkódok listáját, vagy <kbd>user</kbd> az aktuális felhasználó, illetve <kbd>content</kbd> a wiki nyelvbeállításához.",
+       "apihelp-main-param-errorformat": "A figyelmeztetések és hibaüzenetek formátuma.\n; plaintext: Wikiszöveg eltávolított HTML-címkékkel és a HTML-entitások (pl. &amp;amp;) kicserélésével.\n; wikitext: Feldolgozatlan wikiszöveg.\n; html: HTML.\n; raw: Az üzenet azonosítója és paraméterei.\n; none: Szöveges kimenet mellőzése, csak hibakódok.\n; bc: A MediaWiki 1.29 előtti formátum. A <var>errorlang</var> és <var> erroruselocal</var> paraméterek figyelmen kívül lesznek hagyva.",
+       "apihelp-main-param-errorlang": "A figyelmeztetésekhez és hibaüzenetekhez használandó nyelv. A <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> a <kbd>siprop=languages</kbd> paraméterrel visszaadja a lehetséges nyelvkódok listáját, vagy <kbd>content</kbd> a wiki nyelvbeállításához, illetve <kbd>uselang</kbd> a <var>uselang</var> paraméter értékéhez.",
+       "apihelp-main-param-errorsuselocal": "Ha meg van adva, a hibaüzenetek a helyileg testreszabott üzeneteket fogják használni a {{ns:MediaWiki}} névtérből.",
        "apihelp-block-description": "Szerkesztő blokkolása",
-       "apihelp-block-param-user": "Blokkolandó felhasználónév, IP-cím vagy IP-címtartomány.",
+       "apihelp-block-param-user": "Blokkolandó felhasználónév, IP-cím vagy IP-címtartomány. Nem használható együtt a <var>$1userid</var> paraméterrel.",
+       "apihelp-block-param-userid": "A blokkolandó felhasználó numerikus azonosítója. Nem használható a <var>$1user</var> paraméterrel együtt.",
        "apihelp-block-param-expiry": "Lejárat ideje. Lehet relatív (pl. <kbd>5 months</kbd>, <kbd>2 weeks</kbd>) vagy abszolút (pl. <kbd>2014-09-18T12:34:56Z</kbd>). Ha <kbd>infinite</kbd>-re, <kbd>indefinite</kbd>-re vagy <kbd>never</kbd>-re állítod, a blokk soha nem fog lejárni.",
        "apihelp-block-param-reason": "Blokkolás oka.",
+       "apihelp-block-param-anononly": "Csak anonim felhasználók blokkolása (anonim szerkesztések megakadályozása erről az IP-címről).",
        "apihelp-block-param-nocreate": "Új regisztráció megakadályozása",
+       "apihelp-block-param-autoblock": "Az utoljára használt IP-cím blokkolása, valamint bármilyen további IP-cím, amiről a felhasználó megpróbál bejelentkezni.",
+       "apihelp-block-param-noemail": "A wiki e-mail-küldő rendszerének letiltása a felhasználó számára (<code>blockemail</code> jogosultság szükséges hozzá).",
+       "apihelp-block-param-hidename": "A felhasználónév elrejtése a blokknaplóból (<code>hideuser</code> jog szükséges hozzá).",
+       "apihelp-block-param-allowusertalk": "A felhasználó szerkeszthesse a saját vitalapját (a <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var> beállítástól függ).",
+       "apihelp-block-param-reblock": "Jelenlegi blokk felülírása, ha a felhasználó már blokkolva van.",
        "apihelp-block-param-watchuser": "A szerkesztő vagy IP-cím szerkesztői- és vitalapjának figyelése.",
+       "apihelp-block-example-ip-simple": "A <kbd>192.0.2.5</kbd> IP-cím blokkolása három napra <kbd>First strike</kbd> indoklással.",
+       "apihelp-block-example-user-complex": "<kbd>Vandal</kbd> blokkolása határozatlan időre <kbd>Vandalism</kbd> indoklással, új fiók létrehozásának és e-mail küldésének megakadályozása.",
+       "apihelp-checktoken-description": "Egy <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> kéréssel szerzett token érvényességének vizsgálata.",
+       "apihelp-checktoken-param-type": "A tesztelendő token típusa.",
+       "apihelp-checktoken-param-token": "A tesztelendő token.",
+       "apihelp-checktoken-param-maxtokenage": "A token megengedett legnagyobb kora másodpercekben.",
+       "apihelp-checktoken-example-simple": "Egy <kbd>csrf</kbd> token érvényességének vizsgálata.",
+       "apihelp-clearhasmsg-description": "A <code>hasmsg</code> jelzés törlése az aktuális felhasználónak.",
+       "apihelp-clearhasmsg-example-1": "A <code>hasmsg</code> jelzés törlése az aktuális felhasználónak.",
+       "apihelp-clientlogin-example-login": "A bejelentkezési folyamat elkezdése <kbd>Example</kbd> felhasználónévvel és <kbd>ExamplePassword</kbd> jelszóval.",
+       "apihelp-clientlogin-example-login2": "A bejelentkezés folytatása <samp>UI</samp> válasz után a kétlépcsős azonosításra, az <var>OATHToken</var> paraméternek <kbd>987654</kbd> értéket megadva.",
+       "apihelp-compare-description": "Két lap közötti különbség kiszámítása.\n\nMindkét laphoz kötelező megadni egy lapváltozat-azonosítót, címet vagy lapazonosítót.",
+       "apihelp-compare-param-fromtitle": "Az első összehasonlítandó lap címe.",
+       "apihelp-compare-param-fromid": "Az első összehasonlítandó lap lapazonosítója.",
+       "apihelp-compare-param-fromrev": "Az első összehasonlítandó lapváltozat azonosítója.",
+       "apihelp-compare-param-totitle": "A második összehasonlítandó lap címe.",
+       "apihelp-compare-param-toid": "A második összehasonlítandó lap lapazonosítója.",
+       "apihelp-compare-param-torev": "A második összehasonlítandó lapváltozat azonosítója.",
+       "apihelp-compare-example-1": "Az 1-es és 2-es lapváltozat összehasonlítása.",
+       "apihelp-createaccount-description": "Új felhasználói fiók létrehozása.",
+       "apihelp-createaccount-example-create": "<kbd>Example</kbd> felhasználói fiók létrehozásának elkezdése <kbd>ExamplePassword</kbd> jelszóval.",
        "apihelp-createaccount-param-name": "Felhasználónév.",
+       "apihelp-createaccount-param-password": "Jelszó (figyelmen kívül hagyva, ha a <var>$1mailpassword</var> be van állítva).",
+       "apihelp-createaccount-param-domain": "Tartomány külső hitelesítéshez (opcionális).",
+       "apihelp-createaccount-param-token": "Felhasználólétrehozási token az első kérésből",
        "apihelp-createaccount-param-email": "A szerkesztő e-mail-címe (nem kötelező).",
        "apihelp-createaccount-param-realname": "A szerkesztő valódi neve (nem kötelező).",
+       "apihelp-createaccount-param-mailpassword": "Ha bármilyen értéket kap, egy véletlenszerű jelszót kap a felhasználó e-mailben.",
+       "apihelp-createaccount-param-reason": "Opcionális indoklás a fióklétrehozáshoz a naplókba.",
+       "apihelp-createaccount-param-language": "A felhasználó alapértelmezett nyelvkódja (opcionális, alapértelmezetten a tartalom nyelve).",
+       "apihelp-createaccount-example-pass": "<kbd>testuser</kbd> felhasználó létrehozása <kbd>test123</kbd> jelszóval.",
+       "apihelp-createaccount-example-mail": "<kbd>testmailuser</kbd> felhasználó létrehozása, véletlenszerű jelszó elküldése e-mailben.",
        "apihelp-delete-description": "Lap törlése.",
+       "apihelp-delete-param-title": "A törlendő lap címe. Nem használható együtt a <var>$1pageid</var> paraméterrel.",
+       "apihelp-delete-param-pageid": "A törlendő lap lapazonosítója. Nem használható együtt a <var>$1title</var> paraméterrel.",
+       "apihelp-delete-param-reason": "A törlés indoka. Ha nincs beállítva, automatikusan generált indoklás helyettesíti.",
+       "apihelp-delete-param-watch": "A lap hozzáadása a felhasználó figyelőlistájához.",
+       "apihelp-delete-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.",
        "apihelp-delete-param-unwatch": "A lap törlése a szerkesztő figyelőlistájáról.",
+       "apihelp-delete-param-oldimage": "A törlendő régi kép neve az [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] által adott formátumban.",
        "apihelp-delete-example-simple": "<kbd>Main Page</kbd> törlése.",
+       "apihelp-delete-example-reason": "<kbd>Main Page</kbd> törlése <kbd>Preparing for move</kbd> indoklással.",
        "apihelp-disabled-description": "Ez a modul le lett tiltva.",
        "apihelp-edit-description": "Lapok létrehozása és szerkesztése.",
+       "apihelp-edit-param-title": "A szerkesztendő lap címe. Nem használható együtt a <var>$1pageid</var> paraméterrel.",
+       "apihelp-edit-param-pageid": "A szerkesztendő lap lapazonosítója. Nem használható együtt a <var>$1title</var> paraméterrel.",
+       "apihelp-edit-param-section": "A szerkesztendő szakasz száma. <kbd>0</kbd> a bevezetőhöz, <kbd>new</kbd> új szakaszhoz.",
        "apihelp-edit-param-sectiontitle": "Az új szakasz címe.",
+       "apihelp-edit-param-text": "A lap tartalma.",
+       "apihelp-edit-param-summary": "Szerkesztési összefoglaló. A szakasz címe is, ha $1section=new és a $1sectiontitle paraméter nincs beállítva.",
        "apihelp-edit-param-minor": "Apró változtatás.",
+       "apihelp-edit-param-notminor": "Nem apró változtatás.",
        "apihelp-edit-param-bot": "Szerkesztés megjelölése botszerkesztésként.",
+       "apihelp-edit-param-basetimestamp": "Az alapváltozat időbélyege, a szerkesztési ütközések felismerésére szolgál. Az [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]] kéréssel szerezhető meg.",
+       "apihelp-edit-param-starttimestamp": "A szerkesztési folyamat kezdetének időbélyege, a szerkesztési ütközések felismerésére szolgál. Egy megfelelő érték lekérhető a <var>[[Special:ApiHelp/main|curtimestamp]]</var> paraméterrel a folyamat kezdetén (pl. a szerkesztendő lap tartalmának letöltésekor).",
+       "apihelp-edit-param-recreate": "Bármilyen hiba felülírása arról, hogy a lapot a szerkesztés közben törölték.",
        "apihelp-edit-param-createonly": "Ne szerkeszd a lapot, ha már létezik.",
+       "apihelp-edit-param-watch": "A lap hozzáadása a felhasználó figyelőlistájához.",
+       "apihelp-edit-param-unwatch": "A lap törlése a szerkesztő figyelőlistájáról.",
+       "apihelp-edit-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.",
+       "apihelp-edit-param-prependtext": "Ezen szöveg hozzáadása a lap elejére. Felülírja a <var>$1text</var> paramétert.",
+       "apihelp-edit-param-appendtext": "Ezen szöveg hozzáadása a lap végére. Felülírja a <var>$1text</var> paramétert.\n\nHasználd a <kbd>$1section=new</kbd> paramétert új szakasz hozzáadásához ezen paraméter helyett.",
+       "apihelp-edit-param-undo": "Ezen változat visszavonása. Felülírja a <var>$1text</var>, <var>$1prependtext</var> és <var>$1appendtext</var> paramétereket.",
+       "apihelp-edit-param-undoafter": "Minden változtatás visszavonása az <var>$1undo</var> paraméterben szereplőtől eddig. Ha nincs megadva, csak egy változtatás visszavonása.",
+       "apihelp-edit-param-redirect": "Átirányítások automatikus feloldása.",
+       "apihelp-edit-param-contentmodel": "Az új tartalom tartalommodellje.",
+       "apihelp-edit-param-token": "A tokennek mindig az utolsó paraméternek, vagy legalább a <var>$1text</var> után kell lennie.",
        "apihelp-edit-example-edit": "Lap szerkesztése",
+       "apihelp-edit-example-prepend": "<kbd>_&#95;NOTOC_&#95;</kbd> hozzáadása a lap elejére.",
+       "apihelp-edit-example-undo": "Az 13579–13585. változatok visszavonása automatikus szerkesztési összefoglalóval.",
        "apihelp-emailuser-description": "E-mail küldése",
+       "apihelp-emailuser-param-target": "Az e-mail címzettje.",
+       "apihelp-emailuser-param-subject": "A levél tárgya.",
        "apihelp-emailuser-param-text": "Szövegtörzs.",
        "apihelp-emailuser-param-ccme": "Másolat küldése magamnak.",
+       "apihelp-emailuser-example-email": "E-mail küldése <kbd>WikiSysop</kbd> felhasználónak <kbd>Content</kbd> szöveggel.",
+       "apihelp-expandtemplates-description": "Minden sablon kibontása a wikiszövegben.",
        "apihelp-expandtemplates-param-title": "Lap címe.",
+       "apihelp-expandtemplates-param-text": "Az átalakítandó wikiszöveg.",
+       "apihelp-expandtemplates-param-revid": "Változatazonosító a <nowiki>{{REVISIONID}}</nowiki> és hasonló változók kibontásához.",
+       "apihelp-expandtemplates-param-prop": "A lekérendő információk.\n\nHa nincs megadva érték, a válasz tartalmazni fogja a wikiszöveget, de a kimenet elavult formátumú lesz.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "A kibontott wikiszöveg.",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "Bármilyen, a bemenetben szereplő kategória, ami nem jelenik meg a wikiszöveges kimenetben.",
+       "apihelp-expandtemplates-paramvalue-prop-properties": "A wikiszövegben kibontott varázsszavak által meghatározott laptulajdonságok.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "Maximális idő, ami után az eredmény gyorsítótárazása érvénytelenítendő.",
+       "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "A lapra vonatkozó JavaScript-változók.",
+       "apihelp-expandtemplates-param-includecomments": "A HTML-megjegyzések szerepeljenek-e a kimenetben.",
+       "apihelp-expandtemplates-example-simple": "A <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd> wikiszöveg kibontása.",
+       "apihelp-feedcontributions-description": "Egy felhasználó közreműködéseinek lekérése hírcsatornaként.",
+       "apihelp-feedcontributions-param-feedformat": "A hírcsatorna formátuma.",
+       "apihelp-feedcontributions-param-user": "A lekérendő felhasználók.",
+       "apihelp-feedcontributions-param-namespace": "A közreműködések szűrése ezen névtérre.",
+       "apihelp-feedcontributions-param-year": "Közreműködések lekérése eddig az évig.",
+       "apihelp-feedcontributions-param-month": "Közreműködések lekérése ennek a hónapnak a végéig.",
+       "apihelp-feedcontributions-param-tagfilter": "A közreműködések szűrése az ezen címkével ellátottakra.",
+       "apihelp-feedcontributions-param-deletedonly": "Csak a törölt szerkesztések lekérése.",
+       "apihelp-feedcontributions-param-toponly": "Csak a jelenleg utolsónak számító változtatások lekérése.",
+       "apihelp-feedcontributions-param-newonly": "Csak az új oldalt létrehozó szerkesztések lekérése.",
+       "apihelp-feedcontributions-param-hideminor": "Apró szerkesztések kihagyása.",
+       "apihelp-feedcontributions-param-showsizediff": "A változatok közötti méretkülönbség lekérése.",
+       "apihelp-feedcontributions-example-simple": "<kbd>Example</kbd> felhasználó közreműködéseinek lekérése.",
+       "apihelp-feedrecentchanges-description": "A friss változtatások lekérése hírcsatornaként.",
+       "apihelp-feedrecentchanges-param-feedformat": "A hírcsatorna formátuma.",
+       "apihelp-feedrecentchanges-param-namespace": "Az eredmények szűrése erre a névtérre.",
+       "apihelp-feedrecentchanges-param-invert": "Minden névtér a kiválasztott kivételével.",
+       "apihelp-feedrecentchanges-param-associated": "A kapcsolódó (vita- vagy tartalmi) névtér befoglalása.",
+       "apihelp-feedrecentchanges-param-days": "Az eredmények szűrése az elmúlt ennyi napra.",
+       "apihelp-feedrecentchanges-param-limit": "Találatok maximális száma.",
+       "apihelp-feedrecentchanges-param-from": "Szerkesztések megjelenítése ekkortól.",
        "apihelp-feedrecentchanges-param-hideminor": "Apró változtatások elrejtése.",
        "apihelp-feedrecentchanges-param-hidebots": "Botszerkesztések elrejtése.",
+       "apihelp-feedrecentchanges-param-hideanons": "Anonim felhasználók szerkesztéseinek elrejtése.",
+       "apihelp-feedrecentchanges-param-hideliu": "Bejelentkezett felhasználók szerkesztéseinek elrejtése.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Ellenőrzött változtatások elrejtése.",
+       "apihelp-feedrecentchanges-param-hidemyself": "A jelenlegi felhasználó szerkesztéseinek elrejtése.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Kategóriaváltoztatások elrejtése.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Szűrés címke szerint.",
+       "apihelp-feedrecentchanges-param-target": "Csak a megadott lapról hivatkozott lapok szerkesztéseinek megjelenítése.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Inkább a megadott lap''ra'' hivatkozó lapok szerkesztéseinek megjelenítése.",
+       "apihelp-feedrecentchanges-param-categories": "Csak a megadott kategóriák mindegyikében szereplő lapok szerkesztéseinek megjelenítése.",
+       "apihelp-feedrecentchanges-param-categories_any": "Inkább a megadott kategóriák bármelyikében szereplő lapok szerkesztéseinek megjelenítése.",
+       "apihelp-feedrecentchanges-example-simple": "Friss változtatások megjelenítése.",
+       "apihelp-feedrecentchanges-example-30days": "Az elmúlt 30 nap friss változtatásainak megjelenítése.",
+       "apihelp-feedwatchlist-description": "A figyelőlista lekérése hírcsatornaként.",
+       "apihelp-feedwatchlist-param-feedformat": "A hírcsatorna formátuma.",
+       "apihelp-feedwatchlist-param-hours": "Az utóbbi ennyi órában szerkesztett lapok listázása.",
+       "apihelp-feedwatchlist-param-linktosections": "Hivatkozás közvetlenül a módosított szakaszra, ha lehetséges.",
+       "apihelp-feedwatchlist-example-default": "A figyelőlista-hírcsatorna megjelenítése.",
+       "apihelp-feedwatchlist-example-all6hrs": "A figyelt lapok összes változtatásának megjelenítése az elmúlt 6 órában.",
+       "apihelp-filerevert-description": "Egy fájl visszaállítása egy régebbi verzióra.",
+       "apihelp-filerevert-param-filename": "Célfájlnév, {{ns:6}}: (File:) előtag nélkül",
+       "apihelp-filerevert-param-comment": "Feltöltési összefoglaló.",
+       "apihelp-filerevert-param-archivename": "A visszaállítandó változat archív neve.",
+       "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd> visszaállítása a <kbd>2011-03-05T15:27:40Z</kbd>-kori változatra.",
+       "apihelp-help-description": "Súgó megjelenítése a megadott modulokhoz.",
+       "apihelp-help-param-submodules": "Súgó megjelenítése a megadott modul almoduljaihoz is.",
+       "apihelp-help-param-recursivesubmodules": "Súgó megjelenítése az almodulokhoz rekurzívan.",
+       "apihelp-help-param-helpformat": "A súgó kimeneti formátuma.",
+       "apihelp-help-param-wrap": "Az eredmény visszaadása a szabványos API-válaszstruktúrában.",
+       "apihelp-help-param-toc": "A HTML-kimenet tartalmazzon egy tartalomjegyzéket.",
+       "apihelp-help-example-main": "Súgó megjelenítése a fő modulhoz.",
+       "apihelp-help-example-submodules": "Súgó az <kbd>action=query</kbd> modulhoz és összes almoduljához.",
+       "apihelp-help-example-recursive": "Minden súgó egy lapon.",
+       "apihelp-help-example-help": "Súgó magához a súgó modulhoz.",
+       "apihelp-help-example-query": "Súgó két lekérdező almodulhoz.",
+       "apihelp-imagerotate-description": "Egy vagy több kép elforgatása.",
+       "apihelp-imagerotate-param-rotation": "A kép forgatása ennyi fokkal az óramutató járásával megegyező irányban.",
+       "apihelp-imagerotate-example-simple": "<kbd>Example.png</kbd> elforgatása <kbd>90</kbd> fokkal.",
+       "apihelp-imagerotate-example-generator": "Az összes kép elforgatása a <kbd>Category:Flip</kbd> kategóriában <kbd>180</kbd> fokkal.",
+       "apihelp-import-description": "Egy lap importálása egy másik wikiből vagy XML-fájlból.\n\nA HTTP POST-kérést fájlfeltöltésként kell elküldeni (multipart/form-data használatával) a <var>xml</var> paraméter használatakor.",
+       "apihelp-import-param-xml": "Feltöltött XML-fájl.",
+       "apihelp-import-param-interwikisource": "Wikiközi importálásnál: forráswiki.",
+       "apihelp-import-param-interwikipage": "Wikiközi importálásnál: az importálandó lap.",
+       "apihelp-import-param-fullhistory": "Wikiközi importálásnál: teljes laptörténet importálása, nem csak az aktuális változat.",
+       "apihelp-import-param-templates": "Wikiközi importálásnál: importálás a lapon használt sablonokkal együtt.",
+       "apihelp-import-param-namespace": "Importálás ebbe a névtérbe. Nem használható együtt a <var>$1rootpage</var> paraméterrel.",
+       "apihelp-import-param-rootpage": "Importálás ennek a lapnak az allapjaként. Nem használható együtt a <var>$1namespace</var> paraméterrel.",
+       "apihelp-import-example-import": "[[meta:Help:ParserFunctions]] importálása a 100-as névtérbe teljes laptörténettel.",
+       "apihelp-linkaccount-description": "Egy harmadik fél szolgáltató fiókjának kapcsolása a jelenlegi felhasználóhoz.",
+       "apihelp-linkaccount-example-link": "Összekapcsolás elkezdése <kbd>Example</kbd> szolgáltató fiókjával.",
+       "apihelp-login-description": "Bejelentkezés és hitelesítő sütik lekérése.\n\nEz a művelet csak [[Special:BotPasswords|botjelszavakkal]] használandó; a fő fiókkal való használat elavult és figyelmeztetés nélkül sikertelen lehet. A fő fiókkal való biztonságos bejelentkezéshez használd az <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd> paramétert.",
+       "apihelp-login-description-nobotpasswords": "Bejelentkezés és hitelesítő sütik lekérése.\n\nEz a művelet elavult és figyelmeztetés nélkül sikertelen lehet. A biztonságos bejelentkezéshez használd az <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd> paramétert.",
        "apihelp-login-param-name": "Szerkesztőnév.",
        "apihelp-login-param-password": "Jelszó.",
        "apihelp-login-param-domain": "Tartomány (opcionális)",
+       "apihelp-login-param-token": "Az első kérésben megszerzett bejelentkezési token.",
+       "apihelp-login-example-gettoken": "Egy bejelentkezés token lekérése.",
        "apihelp-login-example-login": "Bejelentkezés.",
+       "apihelp-logout-description": "Kijelentkezés és munkamenetadatok törlése.",
        "apihelp-logout-example-logout": "Aktuális felhasználó kijelentkeztetése.",
+       "apihelp-managetags-description": "A változtatáscímkék kezelése.",
+       "apihelp-managetags-param-operation": "A végrehajtandó feladat:\n;create: Új változtatáscímke létrehozása kézi használatra.\n;delete: Egy változtatáscímke eltávolítása az adatbázisból, beleértve az eltávolítását minden lapváltozatról, frissváltoztatások-bejegyzésről és naplóbejegyzésről, ahol használatban van.\n;activate: Egy változtatáscímke aktiválása, lehetővé téve a felhasználóknak a kézi használatát.\n;deactivate: Egy változtatáscímke deaktiválása, a felhasználók megakadályozása a kézi használatban.",
+       "apihelp-managetags-param-tag": "A létrehozandó, törlendő, aktiválandó vagy deaktiválandó címke. Létrehozás esetén adott nevű címke nem létezhet. Törlés esetén a címkének léteznie kell. Aktiválás esetén a címkének léteznie kell, és nem használhatja más kiterjesztés. Deaktiválás esetén a címkének aktívnak és kézzel definiáltnak  kell lennie.",
+       "apihelp-managetags-param-reason": "Opcionális indoklás a címke létrehozásához, törléséhez, aktiválásához vagy deaktiválásához.",
+       "apihelp-managetags-param-ignorewarnings": "Figyelmeztetések figyelmen kívül hagyása a művelet közben.",
+       "apihelp-managetags-example-create": "<kbd>spam</kbd> címke létrehozása <kbd>For use in edit patrolling</kbd> indoklással",
+       "apihelp-managetags-example-delete": "<kbd>vandlaism</kbd> címke törlése <kbd>Misspelt</kbd> indoklással",
+       "apihelp-managetags-example-activate": "<kbd>spam</kbd> címke aktiválása <kbd>For use in edit patrolling</kbd> indoklással",
+       "apihelp-managetags-example-deactivate": "<kbd>spam</kbd> címke deaktiválása <kbd>No longer required</kbd> indoklással",
        "apihelp-mergehistory-description": "Laptörténetek egyesítése",
        "apihelp-mergehistory-param-reason": "Laptörténet egyesítésének oka.",
        "apihelp-move-description": "Egy lap átnevezése.",
+       "apihelp-move-param-from": "Az átnevezendő lap címe. Nem használható együtt a <var>$1fromid</var> paraméterrel.",
+       "apihelp-move-param-fromid": "Az átnevezendő lap lapazonosítója. Nem használható együtt a <var>$1from</var> paraméterrel.",
+       "apihelp-move-param-to": "A lap új címe.",
        "apihelp-move-param-reason": "Az átnevezés oka.",
        "apihelp-move-param-movetalk": "Nevezd át a vitalapot is, ha létezik.",
        "apihelp-move-param-movesubpages": "Nevezd át az allapokat is, ha lehetséges.",
        "apihelp-move-param-noredirect": "Ne készíts átirányítást.",
+       "apihelp-move-param-watch": "A lap és az átirányítás hozzáadása a jelenlegi felhasználó figyelőlistájához.",
+       "apihelp-move-param-unwatch": "A lap és az átirányítás eltávolítása a jelenlegi felhasználó figyelőlistájáról.",
+       "apihelp-move-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.",
        "apihelp-move-param-ignorewarnings": "Figyelmeztetések figyelmen kívül hagyása.",
+       "apihelp-move-example-move": "<kbd>Badtitle</kbd> átnevezése <kbd>Goodtitle</kbd> címre átirányítás készítése nélkül.",
+       "apihelp-opensearch-description": "Keresés a wikin az OpenSearch protokoll segítségével.",
+       "apihelp-opensearch-param-search": "A keresőkifejezés.",
        "apihelp-opensearch-param-limit": "Találatok maximális száma.",
+       "apihelp-opensearch-param-namespace": "A keresendő névterek.",
+       "apihelp-opensearch-param-suggest": "Ne csináljon semmit, ha a <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> hamis.",
+       "apihelp-opensearch-param-redirects": "Hogyan kezelje az átirányításokat:\n;return: Magának az átirányításnak a visszaadása.\n;resolve: A céllap visszaadása. Lehet, hogy kevesebb mint <var>$1limit</var> találatot ad vissza.\nTörténeti okokból az alapértelmezés „return” <kbd>$1format=json</kbd> esetén és „resolve” más formátumoknál.",
+       "apihelp-opensearch-param-format": "A kimenet formátuma.",
+       "apihelp-opensearch-example-te": "<kbd>Te</kbd>-vel kezdődő lapok keresése.",
+       "apihelp-options-description": "A jelenlegi felhasználó beállításainak módosítása.\n\nCsak a MediaWiki vagy kiterjesztései által kínált, valamint a <code>userjs-</code> előtagú (felhasználói parancsfájloknak szánt) beállítások állíthatók be.",
+       "apihelp-options-param-reset": "Beállítások visszaállítása a wiki alapértelmezéseire.",
+       "apihelp-options-param-resetkinds": "A visszaállítandó beállítások típusa(i) a <var>$1reset</var> paraméter használatakor.",
+       "apihelp-options-param-change": "Változtatások listája név=érték formátumban (pl. <kbd>skin=vector</kbd>). Ha nincs érték megadva (egyenlőségjel sem szerepel – pl. <kbd>beállítás|másik|…</kbd>), a beállítások visszaállnak az alapértelmezett értékre. Ha bármilyen érték tartalmaz függőleges vonal karaktert (<kbd>|</kbd>), használd az [[Special:ApiHelp/main#main/datatypes|alternatív elválasztókaraktert]] a megfelelő működéshez.",
+       "apihelp-options-param-optionname": "Az <var>$1optionvalue</var> értékre állítandó beállítás neve.",
+       "apihelp-options-param-optionvalue": "Az <var>$1optionname</var> beállítás értéke.",
        "apihelp-options-example-reset": "Minden beállítás visszaállítása",
+       "apihelp-options-example-change": "A <kbd>skin</kbd> és a <kbd>hideminor</kbd> beállítások módosítása.",
+       "apihelp-options-example-complex": "Minden beállítás visszaállítása, majd a <kbd>skin</kbd> és a <kbd>nickname</kbd> beállítása.",
+       "apihelp-paraminfo-description": "Információk lekérése API-modulokról.",
+       "apihelp-paraminfo-param-modules": "Modulnevek (az <var>action</var> és <var>format</var> paraméterek értékei vagy <kbd>main</kbd>). Megadhatók almodulok <kbd>+</kbd> elválasztással vagy minden almodul <kbd>+*</kbd>, illetve rekurzívan minden almodul <kbd>+**</kbd> végződéssel.",
+       "apihelp-paraminfo-param-helpformat": "A súgószövegek formátuma.",
+       "apihelp-paraminfo-param-querymodules": "Lekérdező modul(ok) neve (a <var>prop</var>, <var>meta</var> vagy <var>list</var> paraméter értéke). Használd a <kbd>$1modules=query+foo</kbd> formát a <kbd>$1querymodules=foo</kbd> helyett.",
+       "apihelp-paraminfo-param-mainmodule": "Információk lekérése a fő (legfelső szintű) modulról is. Használd a <kbd>$1modules=main</kbd> paramétert helyette.",
+       "apihelp-paraminfo-param-pagesetmodule": "Információk lekérése a pageset modulról is (ez szolgáltatja a <var>titles</var> paramétert és társait).",
+       "apihelp-paraminfo-param-formatmodules": "Formázómodul(ok) neve (a <var>format</var> paraméter értéke). Használd a <var>$1modules</var> paramétert helyette.",
+       "apihelp-paraminfo-example-1": "Információk megjelenítése az <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> és <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> lekérdezésekhez.",
+       "apihelp-paraminfo-example-2": "Információk megjelenítése az <kbd>[[Special:ApiHelp/query|action=query]]</kbd> összes almoduljához.",
+       "apihelp-parse-description": "Tartalom feldolgozása.\n\nLásd az <kbd>[[Special:ApiHelp/query|action=query]]</kbd> számos prop-modulját a információk lekérésére a lap aktuális változatáról.\n\nTöbbféle módon megadható a feldolgozandó szöveg:\n# Egy lap vagy lapváltozat megadásával, a <var>$1page</var>, <var>$1pageid</var> vagy <var>$1oldid</var> paraméterrel.\n# Magának a tartalomnak a megadásával, a <var>$1text</var>, <var>$1title</var> és <var>$1contentmodel</var> paraméterrel.\n# Csak egy összefoglaló feldolgozása. A <var>$1prop</var> paraméternek üresnek kell lennie.",
+       "apihelp-parse-param-title": "A lapnak a címe, amihez a szöveg tartozik. Ha nincs megadva, a <var>$1contentmodel</var> paraméter kötelező, és a cím [[API]] lesz.",
+       "apihelp-parse-param-text": "A feldolgozandó szöveg. Használd a <var>$1title</var> vagy <var>$1contentmodel</var> paramétert a tartalommodell megadásához.",
+       "apihelp-parse-param-summary": "Feldolgozandó szerkesztési összefoglaló.",
+       "apihelp-parse-param-page": "Ezen lap tartalmának feldolgozása. Nem használható együtt a <var>$1text</var> és <var>$1title</var> paraméterrel.",
+       "apihelp-parse-param-pageid": "Ezen lap tartalmának feldolgozása. Felülírja a <var>$1page</var> paramétert.",
+       "apihelp-parse-param-redirects": "Ha a <var>$1page</var> vagy <var>$1pageid</var> átirányítás, annak feloldása.",
+       "apihelp-parse-param-oldid": "Ezen lapváltozat feldolgozása. Felülírja a <var>$1page</var> és <var>$1pageid</var> paramétert.",
+       "apihelp-parse-param-prop": "A lekérendő információk:",
+       "apihelp-parse-paramvalue-prop-text": "A feldolgozott wikiszöveg.",
+       "apihelp-parse-paramvalue-prop-langlinks": "A feldolgozott wikiszövegben talált nyelvközi hivatkozások.",
+       "apihelp-parse-paramvalue-prop-categories": "A feldolgozott wikiszövegben talált kategóriák.",
+       "apihelp-parse-paramvalue-prop-categorieshtml": "A kategóriák HTML-verziója.",
+       "apihelp-parse-paramvalue-prop-links": "A feldolgozott wikiszövegben talált belső linkek.",
+       "apihelp-parse-paramvalue-prop-templates": "A feldolgozott wikiszövegben használt sablonok.",
+       "apihelp-parse-paramvalue-prop-images": "A feldolgozott wikiszövegben használt képek.",
+       "apihelp-parse-paramvalue-prop-externallinks": "A feldolgozott wikiszövegben talált külső linkek.",
+       "apihelp-parse-paramvalue-prop-sections": "A feldolgozott wikiszövegben talált szakaszok.",
+       "apihelp-parse-paramvalue-prop-revid": "A feldolgozott lap lapváltozat-azonosítója.",
+       "apihelp-parse-paramvalue-prop-displaytitle": "A feldolgozott wikiszöveghez tartozó cím.",
+       "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Elavult.</span> A <code>&lt;head&gt;</code> HTML-címkébe kerülő elemek.",
+       "apihelp-parse-paramvalue-prop-headhtml": "A lap feldolgozott <code>&lt;head&gt;</code> HTML-címkéje.",
+       "apihelp-parse-paramvalue-prop-modules": "A lapon használt ResourceLoader-modulok. A betöltésükhöz használd a <code>mw.loader.using()</code> függvényt. Vagy a <kbd>jsconfigvars</kbd>, vagy az <kbd>encodedjsconfigvars</kbd> paramétert kötelező együtt használni ezzel a paraméterrel.",
+       "apihelp-parse-paramvalue-prop-jsconfigvars": "A lapra jellemző JavaScript-változók. A használatukhoz állítsd be őket az <code>mw.config.set()</code> függvénnyel.",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "A lapra jellemző JavaScript-változók JSON-szövegként.",
+       "apihelp-parse-paramvalue-prop-indicators": "A lap státuszindikátorainak HTML-kódja.",
+       "apihelp-parse-paramvalue-prop-iwlinks": "A feldolgozott wikiszövegben talált interwikihivatkozások.",
+       "apihelp-parse-paramvalue-prop-wikitext": "Az eredeti wikiszöveg.",
+       "apihelp-parse-paramvalue-prop-properties": "A feldolgozott wikiszövegben definiált különböző tulajdonságok.",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "A tartalom feldolgozása közben előforduló hibák visszaadása.",
+       "apihelp-parse-param-wrapoutputclass": "Az értelmező kimenetének körülvétele ezzel a CSS-osztállyal.",
+       "apihelp-parse-param-pst": "Mentés előtti átalakítások elvégzése a bemeneten a feldolgozás előtt. Csak szöveggel használva érvényes.",
+       "apihelp-parse-param-onlypst": "Mentés előtti átalakítások (pre-save transform, PST) végrehajtása a bemeneten, de a feldolgozás mellőzése. Csak a <var>$1text</var> paraméterrel használva érvényes.",
+       "apihelp-parse-param-section": "Csak a megadott sorszámú szakasz feldolgozása.\n\nHa <kbd>new</kbd>, a <var>$1text</var> és <var>$1sectiontitle</var> feldolgozása úgy, mintha egy új szakaszt adnál a laphoz.\n\nA <kbd>new</kbd> csak a <var>text</var> paraméter megadásakor engedélyezett.",
+       "apihelp-parse-param-sectiontitle": "Az új szakasz címe, ha a <var>section</var> paraméter <kbd>new</kbd>.\n\nA szerkesztéssel ellentétben itt nem a <var>summary</var> tartalma az alapértelmezett értéke.",
+       "apihelp-parse-param-disablepp": "Használd a <var>$1disablelimitreport</var> paramétert helyette.",
+       "apihelp-parse-param-disableeditsection": "A szakaszok szerkesztőlinkjeinek elhagyása a kimenetből.",
+       "apihelp-parse-param-preview": "Feldolgozás előnézetmódban.",
+       "apihelp-parse-param-sectionpreview": "Feldolgozás szakaszelőnézet-módban (az előnézetmódot is engedélyezi).",
+       "apihelp-parse-param-disabletoc": "Tartalomjegyzék elhagyása a kimenetből.",
+       "apihelp-parse-param-contentmodel": "A bemeneti szöveg tartalommodellje. Ha nincs megadva, a $1title paraméter kötelező, és az alapértelmezés a megadott cím tartalommodellje lesz. Csak a $1text paraméterrel együtt használva érvényes.",
+       "apihelp-parse-example-page": "Egy lap feldolgozása.",
+       "apihelp-parse-example-text": "Wikiszöveg feldolgozása.",
+       "apihelp-parse-example-texttitle": "Wikiszöveg feldolgozása a lapcím megadásával.",
+       "apihelp-parse-example-summary": "Egy szerkesztési összefoglaló feldolgozása.",
+       "apihelp-patrol-description": "Egy lap vagy lapváltozat ellenőrzöttnek jelölése (patrol).",
+       "apihelp-patrol-param-rcid": "Az ellenőrzendő frissváltoztatások-azonosító.",
+       "apihelp-patrol-param-revid": "Az ellenőrzendő lapváltozat azonosítója (oldid).",
+       "apihelp-patrol-example-rcid": "Egy friss változtatás ellenőrzöttnek jelölése.",
+       "apihelp-patrol-example-revid": "Egy lapváltozat ellenőrzöttnek jelölése.",
+       "apihelp-protect-description": "Egy lap védelmi szintjének változtatása.",
+       "apihelp-protect-param-title": "A levédendő/feloldandó lap címe. Nem használható együtt a <var>$1pageid</var> paraméterrel.",
+       "apihelp-protect-param-pageid": "A levédendő/feloldandó lap lapazonosítója. Nem használható együtt a <var>$1title</var> paraméterrel.",
+       "apihelp-protect-param-protections": "Védelmi szintek, <kbd>típus=szint</kbd> formátumban (pl. <kbd>edit=sysop</kbd>). Az <kbd>all</kbd> szint azt jelenti, hogy mindenki végrehajthatja az adott műveletet, vagyis nincs korlátozás.\n\n<strong>Megjegyzés:</strong> Minden nem listázott művelet védelme el lesz távolítva.",
+       "apihelp-protect-param-expiry": "A lejáratok időbélyege. Ha csak egy időbélyeg van megadva, az vonatkozik minden védelemre. Használj <kbd>infinite</kbd> (végtelen), <kbd>indefinite</kbd> (határozatlan), <kbd>infinity</kbd> (végtelen) vagy <kbd>never</kbd> (soha) értéket le nem járó védelemhez.",
+       "apihelp-protect-param-reason": "A levédés/feloldás oka.",
+       "apihelp-protect-param-cascade": "Kaszkádolt védelem engedélyezése (a lapon használt sablonok és képek védelme). Nincs hatása, ha egyetlen megadott védelmi szint sem támogatja a kaszkádolt védelmet.",
+       "apihelp-protect-param-watch": "A levédett/feloldott lap címe hozzáadása az aktuális felhasználó figyelőlistájához.",
+       "apihelp-protect-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.",
        "apihelp-protect-example-protect": "Lap levédése.",
+       "apihelp-protect-example-unprotect": "Egy lap védelmének feloldása a korlátozások <kbd>all</kbd>-ra állításával (vagyis mindenki végrehajthatja a műveleteket).",
+       "apihelp-protect-example-unprotect2": "Egy lap védelmének feloldása semmilyen védelem beállításával.",
+       "apihelp-purge-description": "A gyorsítótár ürítése a megadott lapoknál.",
+       "apihelp-purge-param-forcelinkupdate": "A linktáblák frissítése.",
+       "apihelp-purge-param-forcerecursivelinkupdate": "A linktábla frissítése a megadott lapokra és minden olyan lapra, ami a megadott lapokat beilleszti sablonként.",
+       "apihelp-purge-example-simple": "A gyorsítótár ürítése a <kbd>Main Page</kbd> és <kbd>API</kbd> lapoknál.",
+       "apihelp-purge-example-generator": "A gyorsítótár ürítése az első 10 fő névtérbeli lapnál.",
+       "apihelp-query-description": "Adatok lekérése a MediaWikiből és a MediaWikiről.\n\nMinden adatmódosításhoz először a <kbd>query</kbd> segítségével szereznie kell egy tokent a rosszindulatú oldalak visszaéléseinek elhárítására.",
+       "apihelp-query-param-prop": "A lapokról lekérendő tulajdonságok.",
+       "apihelp-query-param-list": "Lekérendő listák.",
+       "apihelp-query-param-meta": "Lekérendő metaadatok.",
+       "apihelp-query-param-indexpageids": "Egy <samp>pageids</samp> szakasz hozzáadása a kimenethez az összes visszaadott lapazonosítóval.",
+       "apihelp-query-param-export": "Az összes megadott vagy generált lap aktuális változatának exportálása.",
+       "apihelp-query-param-exportnowrap": "Az exportált XML visszaadása normál eredményszerkezetbe (JSON, XML stb.) burkolás nélkül (a [[Special:Export]] kimenetével megegyező formátum). Csak az <var>$1export</var> paraméterrel együtt használható.",
+       "apihelp-query-param-iwurl": "A teljes URL visszaadása, ha a cím egy interwikilink.",
+       "apihelp-query-param-rawcontinue": "Nyers <samp>query-continue</samp> adatok visszaadása a folytatáshoz.",
+       "apihelp-query-example-revisions": "[[Special:ApiHelp/query+siteinfo|Wikiinformációk]] és a <kbd>Main Page</kbd> [[Special:ApiHelp/query+revisions|laptörténetének]] lekérése.",
+       "apihelp-query-example-allpages": "Az <kbd>API/</kbd> kezdetű lapok laptörténetének lekérése.",
+       "apihelp-query+allcategories-description": "Az összes kategória visszaadása.",
+       "apihelp-query+allcategories-param-from": "A kategóriák listázása ettől a címtől.",
+       "apihelp-query+allcategories-param-to": "A kategóriák listázása eddig a címig.",
+       "apihelp-query+allcategories-param-prefix": "Ezzel kezdődő című kategóriák keresése.",
        "apihelp-query+allcategories-param-dir": "A rendezés iránya.",
+       "apihelp-query+allcategories-param-min": "Csak legalább ennyi taggal rendelkező kategóriák visszaadása.",
+       "apihelp-query+allcategories-param-max": "Csak legfeljebb ennyi taggal rendelkező kategóriák visszaadása.",
+       "apihelp-query+allcategories-param-limit": "A visszaadandó kategóriák száma.",
+       "apihelp-query+allcategories-param-prop": "Lekérendő tulajdonságok:",
+       "apihelp-query+allcategories-paramvalue-prop-size": "A kategóriában lévő lapok száma.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "Rejtett-e a kategória a <code>_&#95;HIDDENCAT_&#95;</code> kapcsolóval.",
+       "apihelp-query+allcategories-example-size": "Kategóriák listázása a bennük lévő lapok számával.",
+       "apihelp-query+allcategories-example-generator": "Információk lekérése magukról a kategórialapokról, amiknek a címe <kbd>List</kbd> kezdetű.",
+       "apihelp-query+alldeletedrevisions-description": "Egy felhasználó vagy egy névtér összes törölt szerkesztésének listázása.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Csak az <var>$3user</var> paraméterrel együtt használható.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Nem használható együtt az <var>$3user</var> paraméterrel.",
+       "apihelp-query+alldeletedrevisions-param-start": "A listázás kezdő időbélyege.",
+       "apihelp-query+alldeletedrevisions-param-end": "A lista végét jelentő időbélyeg.",
+       "apihelp-query+alldeletedrevisions-param-from": "Listázás ettől a címtől.",
+       "apihelp-query+alldeletedrevisions-param-to": "Listázás eddig a címig.",
+       "apihelp-query+alldeletedrevisions-param-prefix": "Ezzel kezdődő című lapok keresése.",
+       "apihelp-query+alldeletedrevisions-param-tag": "Csak ezzel a címkével ellátott változatok listázása.",
+       "apihelp-query+alldeletedrevisions-param-user": "Csak ezen felhasználó szerkesztéseinek listázása.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "Ezen felhasználó szerkesztéseinek kihagyása.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "Lapok listázása csak ebben a névtérben.",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "Generátorként használva címek visszaadása lapváltozat-azonosítók helyett.",
+       "apihelp-query+alldeletedrevisions-example-user": "<kbd>Example</kbd> 50 legutóbbi törölt szerkesztésének listázása.",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "A fő névtér első 50 törölt szerkesztésének listázása.",
+       "apihelp-query+allfileusages-description": "Az összes fájlhasználat listázása, beleértve a nem létező fájlokét is.",
+       "apihelp-query+allfileusages-param-from": "Listázás ettől a címtől vagy fájltól.",
+       "apihelp-query+allfileusages-param-to": "Listázás eddig a címig vagy fájlig.",
+       "apihelp-query+allfileusages-param-prefix": "Ezzel kezdődő nevű fájlok keresése.",
+       "apihelp-query+allfileusages-param-unique": "Csak különböző fájlnevek listázása. Nem használható együtt az <kbd>$1prop=id</kbd> paraméterrel.",
+       "apihelp-query+allfileusages-param-prop": "Visszaadandó információk:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "A képeket használó lapok lapazonosítói (nem használható együtt az <var>$1unique</var> paraméterrel).",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "A fájl neve.",
+       "apihelp-query+allfileusages-param-limit": "A visszaadandó elemek maximális száma.",
+       "apihelp-query+allfileusages-param-dir": "A listázás iránya.",
+       "apihelp-query+allfileusages-example-B": "Fájlnevek listázása, a hiányzókat is beleértve, a forráslapok lapazonosítójával, <kbd>B</kbd>-től kezdve.",
+       "apihelp-query+allfileusages-example-unique": "Különböző fájlnevek listázása.",
+       "apihelp-query+allfileusages-example-unique-generator": "Az összes fájlnév lekérése, hiányzók megjelölése.",
+       "apihelp-query+allfileusages-example-generator": "A fájlokat használó lapok lekérése.",
+       "apihelp-query+allimages-description": "Az összes kép visszaadása.",
+       "apihelp-query+allimages-param-sort": "Rendezési szempont.",
+       "apihelp-query+allimages-param-dir": "A listázás iránya.",
+       "apihelp-query+allimages-param-from": "Listázás ettől a fájlnévtől. Csak az <kbd>$1sort=name</kbd> paraméterrel együtt használható.",
+       "apihelp-query+allimages-param-to": "Listázás eddig a fájlnévig. Csak az <kbd>$1sort=name</kbd> paraméterrel együtt használható.",
+       "apihelp-query+allimages-param-start": "Listázás ettől az időbélyegtől. Csak az <kbd>$1sort=timestamp</kbd> paraméterrel együtt használható.",
+       "apihelp-query+allimages-param-end": "Listázás eddig az időbélyegig. Csak az <kbd>$1sort=timestamp</kbd> paraméterrel együtt használható.",
+       "apihelp-query+allimages-param-prefix": "Ezzel kezdődő nevű fájlok keresése. Csak az <kbd>$1sort=name</kbd> paraméterrel együtt használható.",
+       "apihelp-query+allimages-param-minsize": "A fájlok minimális fájlmérete bájtban.",
+       "apihelp-query+allimages-param-maxsize": "A fájlok maximális fájlmérete bájtban.",
+       "apihelp-query+allimages-param-user": "Ezen felhasználó által feltöltött fájlok visszaadása. Csak az <kbd>$1sort=timestamp</kbd> paraméterrel együtt használható. Nem használható együtt az <var>$1filterbots</var> paraméterrel.",
+       "apihelp-query+allimages-param-filterbots": "Botok által feltöltött fájlok szűrése. Csak az <kbd>$1sort=timestamp</kbd> paraméterrel együtt használható. Nem használható együtt az <var>$1user</var> paraméterrel.",
+       "apihelp-query+allimages-param-mime": "Szűrés MIME-típus alapján, pl. <kbd>image/jpeg</kbd>.",
+       "apihelp-query+allimages-param-limit": "A visszaadandó képek száma.",
+       "apihelp-query+allimages-example-B": "Fájlok listázása <kbd>B</kbd>-től kezdve.",
+       "apihelp-query+allimages-example-recent": "A legutóbb feltöltött fájlok listázása, hasonló a [[Special:NewFiles]] laphoz.",
+       "apihelp-query+allimages-example-mimetypes": "<kbd>image/png</kbd> vagy <kbd>image/gif</kbd> MIME-típusú fájlok listázása",
+       "apihelp-query+allimages-example-generator": "Információk 4 fájlról <kbd>T</kbd>-től kezdve.",
+       "apihelp-query+alllinks-description": "Egy adott névtérbe mutató összes hivatkozás visszaadása.",
+       "apihelp-query+alllinks-param-from": "Listázás ettől a hivatkozástól.",
+       "apihelp-query+alllinks-param-to": "Listázás eddig a hivatkozásig.",
+       "apihelp-query+alllinks-param-prefix": "Ezzel kezdődő című hivatkozott lapok keresése.",
+       "apihelp-query+alllinks-param-unique": "Csak különböző címek listázása. Nem használható együtt az <kbd>$1prop=ids</kbd> paraméterrel.\nGenerátorként használva a céllapokat adja vissza a forráslapok helyett.",
+       "apihelp-query+alllinks-param-prop": "Visszaadandó információk:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "A hivatkozó lapok lapazonosítói (nem használható együtt az <var>$1unique</var> paraméterrel).",
+       "apihelp-query+alllinks-paramvalue-prop-title": "A hivatkozott lap címe.",
+       "apihelp-query+alllinks-param-namespace": "A listázandó névtér.",
+       "apihelp-query+alllinks-param-limit": "A visszaadandó elemek maximális száma.",
+       "apihelp-query+alllinks-param-dir": "A listázás iránya.",
+       "apihelp-query+alllinks-example-B": "Hivatkozott lapok listázása, a hiányzókat is beleértve, a forráslapok lapazonosítójával, <kbd>B</kbd>-től kezdve.",
+       "apihelp-query+alllinks-example-unique": "Különböző hivatkozott lapok listázása.",
+       "apihelp-query+alllinks-example-unique-generator": "Az összes hivatkozott lap lekérése, hiányzók megjelölése.",
+       "apihelp-query+alllinks-example-generator": "A hivatkozásokat tartalmazó lapok lekérése.",
+       "apihelp-query+allmessages-description": "A wiki felületüzeneteinek lekérése.",
+       "apihelp-query+allmessages-param-messages": "A visszaadandó üzenetek. A <kbd>*</kbd> (alapértelmezés) az összes üzenetet jelenti.",
+       "apihelp-query+allmessages-param-prop": "A lekérendő tulajdonságok.",
+       "apihelp-query+allmessages-param-nocontent": "Ne tartalmazza a kimenet az üzenetek tartalmát.",
+       "apihelp-query+allmessages-param-includelocal": "Helyi üzenetek befoglalása (a szoftverben nem, de a {{ns:MediaWiki}} névtérben létező üzenetek).\nEz az összes lapot listázza a {{ns:MediaWiki}} névtérben, így a nem valódi üzeneteket is, mint a [[MediaWiki:Common.js|Common.js]] fájl.",
+       "apihelp-query+allmessages-param-args": "Az üzenetben behelyettesítendő paraméterek.",
+       "apihelp-query+allmessages-param-filter": "Csak az ezen szöveget tartalmazó nevű üzenetek visszaadása.",
+       "apihelp-query+allmessages-param-customised": "Az üzenetek szűrése módosítási állapot alapján.",
+       "apihelp-query+allmessages-param-lang": "A visszaadott üzenetek nyelve.",
+       "apihelp-query+allmessages-param-from": "Listázás ettől az üzenettől.",
+       "apihelp-query+allmessages-param-to": "Listázás eddig az üzenetig.",
+       "apihelp-query+allmessages-param-prefix": "Ezzel kezdődő nevű üzenetek visszaadása.",
+       "apihelp-query+allmessages-example-ipb": "<kbd>ipb-</kbd> előtagú üzenetek lekérése.",
+       "apihelp-query+allmessages-example-de": "Az <kbd>august</kbd> és <kbd>mainpage</kbd> üzenetek lekérése német nyelven.",
+       "apihelp-query+allpages-description": "Egy adott névtér összes lapjának visszaadása.",
+       "apihelp-query+allpages-param-from": "A lapok listázása ettől a címtől.",
+       "apihelp-query+allpages-param-to": "A lapok listázása eddig a címig.",
+       "apihelp-query+allpages-param-prefix": "Ezzel kezdődő című lapok keresése.",
+       "apihelp-query+allpages-param-namespace": "A listázandó névtér.",
+       "apihelp-query+allpages-param-filterredir": "A listázandó lapok.",
+       "apihelp-query+allpages-param-minsize": "A lapok minimális hossza bájtban.",
+       "apihelp-query+allpages-param-maxsize": "A lapok maximális hossza bájtban.",
+       "apihelp-query+allpages-param-prtype": "Csak védett lapok listázása.",
+       "apihelp-query+allpages-param-prlevel": "A védelmek szűrése a védelmi szint alapján (csak az <var>$1prtype=</var> paraméterrel együtt használható).",
+       "apihelp-query+allpages-param-limit": "A visszaadandó lapok maximális száma.",
+       "apihelp-query+allpages-param-dir": "A listázás iránya.",
+       "apihelp-query+allpages-param-filterlanglinks": "Szűrés az alapján, hogy vannak-e nyelvközi hivatkozások a lapon. Nem biztos, hogy figyelembe veszi a kiterjesztések által hozzáadott nyelvközi hivatkozásokat.",
+       "apihelp-query+allpages-param-prexpiry": "Szűrés a védelem lejárata alapján:\n;indefinite: Csak meghatározatlan idejű védelemmel ellátott lapok.\n;definite: Csak meghatározott idejű (konkrét lejáratú) védelemmel ellátott lapok.\n;all: Bármilyen lejáratú védelemmel ellátott lapok.",
+       "apihelp-query+allpages-example-B": "Lapok listázása <kbd>B</kbd>-től kezdve.",
+       "apihelp-query+allpages-example-generator": "Információk 4 lapról <kbd>T</kbd>-től kezdve.",
+       "apihelp-query+allpages-example-generator-revisions": "Az első két nem átirányító lap tartalmának megjelenítése <kbd>Re</kbd>-től kezdve.",
+       "apihelp-query+allredirects-description": "Egy adott névtérbe mutató összes átirányítás listázása.",
+       "apihelp-query+allredirects-param-from": "Listázás ettől az átirányításcímtől.",
+       "apihelp-query+allredirects-param-to": "Listázás eddig az átirányításcímig.",
+       "apihelp-query+allredirects-param-prefix": "Ezzel kezdődő című céllapok keresése.",
+       "apihelp-query+allredirects-param-unique": "Csak különböző céllapok listázása. Nem használható együtt az <kbd>$1prop=ids|fragment|interwiki</kbd> paraméterrel.\nGenerátorként használva a céllapokat adja vissza a forráslapok helyett.",
+       "apihelp-query+allredirects-param-prop": "Visszaadandó információk:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "Az átirányító lapok lapazonosítói (nem használható együtt az <var>$1unique</var> paraméterrel).",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Az átirányítás címe.",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "Az átirányítás célszakasza, ha van (nem használható együtt az <var>$1unique</var> paraméterrel).",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "Az átirányítás céljának interwiki-előtagja, ha van (nem használható együtt az <var>$1unique</var> paraméterrel).",
+       "apihelp-query+allredirects-param-namespace": "A listázandó névtér.",
+       "apihelp-query+allredirects-param-limit": "A visszaadandó elemek maximális száma.",
+       "apihelp-query+allredirects-param-dir": "A listázás iránya.",
+       "apihelp-query+allredirects-example-B": "Céllapok listázása, a hiányzókat is beleértve, a forráslapok lapazonosítójával, <kbd>B</kbd>-től kezdve.",
+       "apihelp-query+allredirects-example-unique": "Különböző céllapok listázása.",
+       "apihelp-query+allredirects-example-unique-generator": "Az összes céllap lekérése, hiányzók megjelölése.",
+       "apihelp-query+allredirects-example-generator": "Az átirányításokat tartalmazó lapok lekérése.",
+       "apihelp-query+allrevisions-description": "Az összes lapváltozat listázása.",
+       "apihelp-query+allrevisions-param-start": "A listázás kezdő időbélyege.",
+       "apihelp-query+allrevisions-param-end": "A lista végét jelentő időbélyeg.",
+       "apihelp-query+allrevisions-param-user": "Csak ezen felhasználó szerkesztéseinek listázása.",
+       "apihelp-query+allrevisions-param-excludeuser": "Ezen felhasználó szerkesztéseinek kihagyása.",
+       "apihelp-query+allrevisions-param-namespace": "Lapok listázása csak ebben a névtérben.",
+       "apihelp-query+allrevisions-param-generatetitles": "Generátorként használva címek visszaadása lapváltozat-azonosítók helyett.",
+       "apihelp-query+allrevisions-example-user": "<kbd>Example</kbd> 50 legutóbbi szerkesztésének listázása.",
+       "apihelp-query+allrevisions-example-ns-main": "A fő névtér első 50 szerkesztésének listázása.",
+       "apihelp-query+mystashedfiles-param-prop": "A fájlok lekérendő tulajdonságai.",
+       "apihelp-query+mystashedfiles-paramvalue-prop-size": "A fájlméret és a kép dimenziói (szélessége és magassága).",
+       "apihelp-query+mystashedfiles-paramvalue-prop-type": "A fájl MIME-típusa és médiatípusa.",
+       "apihelp-query+mystashedfiles-param-limit": "A lekérendő fájlok száma.",
+       "apihelp-query+alltransclusions-description": "Az összes beillesztés listázása (&#123;&#123;x&#125;&#125; kóddal beillesztett lapok), beleértve a nem létező lapokét is.",
+       "apihelp-query+alltransclusions-param-from": "Listázás ettől a beillesztett laptól.",
+       "apihelp-query+alltransclusions-param-to": "Listázás eddig a beillesztett lapig.",
+       "apihelp-query+alltransclusions-param-prefix": "Ezzel kezdődő című beillesztett lapok keresése.",
+       "apihelp-query+alltransclusions-param-unique": "Csak különböző beillesztett címek listázása. Nem használható együtt az <kbd>$1prop=ids</kbd> paraméterrel.\nGenerátorként használva a céllapokat adja vissza a forráslapok helyett.",
+       "apihelp-query+alltransclusions-param-prop": "Visszaadandó információk:",
+       "apihelp-query+alltransclusions-paramvalue-prop-ids": "A lapokat beillesztő lapok lapazonosítói (nem használható együtt az <var>$1unique</var> paraméterrel).",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "A beillesztés címe.",
+       "apihelp-query+alltransclusions-param-namespace": "A listázandó névtér.",
+       "apihelp-query+alltransclusions-param-limit": "A visszaadandó elemek maximális száma.",
+       "apihelp-query+alltransclusions-param-dir": "A listázás iránya.",
+       "apihelp-query+alltransclusions-example-B": "Beillesztett lapok listázása, a hiányzókat is beleértve, a forráslapok lapazonosítójával, <kbd>B</kbd>-től kezdve.",
+       "apihelp-query+alltransclusions-example-unique": "Különböző beillesztett címek listázása.",
+       "apihelp-query+alltransclusions-example-unique-generator": "Az összes beillesztett lap lekérése, hiányzók megjelölése.",
+       "apihelp-query+alltransclusions-example-generator": "A beillesztéseket tartalmazó lapok lekérése.",
+       "apihelp-query+allusers-description": "Az összes regisztrált felhasználó visszaadása.",
+       "apihelp-query+allusers-param-from": "A felhasználók listázása ettől a névtől.",
+       "apihelp-query+allusers-param-to": "A felhasználók listázása eddig a névig.",
+       "apihelp-query+allusers-param-prefix": "Ezzel kezdődő nevű felhasználók keresése.",
+       "apihelp-query+allusers-param-dir": "A rendezés iránya.",
+       "apihelp-query+allusers-param-group": "Csak megadott csoportokba tartozó felhasználók visszaadása.",
+       "apihelp-query+allusers-param-excludegroup": "Csak a megadott csoportokba <em>nem</em> tartozó felhasználók visszaadása.",
+       "apihelp-query+allusers-param-rights": "Csak a megadott jogosultságokkal rendelkező felhasználók visszaadása. Ez nem tartalmazza azokat a jogosultságokat, amiket implicit vagy automatikusan hozzáadott csoportok adnak meg, mint a *, a user vagy az autoconfirmed.",
+       "apihelp-query+allusers-param-prop": "Visszaadandó információk:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "Információk a felhasználó jelenleg érvényes blokkjáról.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "A felhasználó csoportjai. Ez több szervererőforrást használ, és lehet, hogy a limitnél kevesebb eredményt ad vissza.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "A felhasználó automatikus csoportjai.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "A felhasználó jogosultságai.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "A felhasználó szerkesztésszáma.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "A felhasználó regisztrációjának időbélyege, ha elérhető (lehet üres).",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "A felhasználó központi azonosítói és az összekapcsolási státusza.",
+       "apihelp-query+allusers-param-limit": "A visszaadandó felhasználónevek maximális száma.",
+       "apihelp-query+allusers-param-witheditsonly": "Csak szerkesztéssel rendelkező felhasználók listázása.",
+       "apihelp-query+allusers-param-activeusers": "Csak az elmúlt $1 napban aktív felhasználók listázása.",
+       "apihelp-query+allusers-param-attachedwiki": "Az <kbd>$1prop=centralids</kbd> paraméter mellett annak jelzése, hogy a felhasználó össze van-e kapcsolva a megadott wikivel.",
+       "apihelp-query+allusers-example-Y": "A felhasználók listázása <kbd>Y</kbd>-tól kezdve.",
+       "apihelp-query+authmanagerinfo-description": "Információk lekérése az aktuális azonosítási státuszról.",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Annak ellenőrzése, hogy a felhasználó jelenlegi azonosítási státusza megfelelő-e a megadott biztonságkritikus művelethez.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Információk lekérése a megadott azonosítási művelethez szükséges azonosítási kérésekről.",
+       "apihelp-query+authmanagerinfo-example-login": "Egy bejelentkezés elkezdéséhez használható kérések lekérése.",
+       "apihelp-query+authmanagerinfo-example-login-merged": "Egy bejelentkezés elkezdéséhez használható kérések lekérése, az űrlapmezők összevonásával.",
+       "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Annak ellenőrzése, hogy a hitelesítés megfelelő-e a <kbd>foo</kbd> művelethez.",
+       "apihelp-query+backlinks-description": "Egy adott lapra hivatkozó más lapok megkeresése.",
+       "apihelp-query+backlinks-param-title": "A keresendő cím. Nem használható együtt a <var>$1pageid</var> paraméterrel.",
+       "apihelp-query+backlinks-param-pageid": "A keresendő lapazonosító. Nem használható együtt a <var>$1title</var> paraméterrel.",
+       "apihelp-query+backlinks-param-namespace": "A listázandó névtér.",
+       "apihelp-query+backlinks-param-dir": "A listázás iránya.",
+       "apihelp-query+backlinks-param-filterredir": "Az átirányítások szűrése. Ha <kbd>nonredirects</kbd>, és a <var>$1redirect</var> paraméter engedélyezett, csak a második szintre érvényes.",
+       "apihelp-query+backlinks-param-limit": "A visszaadandó lapok maximális száma. Ha a <var>$1redirect</var> engedélyezve van, ez a limit minden szintre külön érvényes (vagyis összesen 2 × <var>$1limit</var> eredmény lehet a válaszban).",
+       "apihelp-query+backlinks-param-redirect": "Ha a hivatkozó lap átirányítás, az arra hivatkozó lapok keresése szintén. A maximális limit feleződik.",
+       "apihelp-query+backlinks-example-simple": "A <kbd>Main Page</kbd> lapra mutató hivatkozások keresése.",
+       "apihelp-query+backlinks-example-generator": "Információk lekérése a <kbd>Main Page</kbd>-re hivatkozó lapokról.",
+       "apihelp-query+blocks-description": "Az összes blokkolt felhasználó és IP-cím listázása.",
+       "apihelp-query+blocks-param-start": "A listázás kezdő időbélyege.",
+       "apihelp-query+blocks-param-end": "A lista végét jelentő időbélyeg.",
+       "apihelp-query+blocks-param-ids": "A listázandó blokkok blokkazonosítói (opcionális).",
+       "apihelp-query+blocks-param-users": "A keresendő felhasználók (opcionális).",
+       "apihelp-query+blocks-param-ip": "Minden erre az IP-címre vagy CIDR tartományra vonatkozó blokk listázása, a tartományblokkokat is beleértve. Nem használható együtt a <var>$3users</var> paraméterrel. A CIDR tartományok maximális szélessége IPv4 esetén /$1, IPv6 esetén /$2.",
+       "apihelp-query+blocks-param-limit": "A listázandó blokkok maximális száma.",
+       "apihelp-query+blocks-param-prop": "Lekérendő tulajdonságok:",
+       "apihelp-query+blocks-paramvalue-prop-id": "A blokk azonosítója.",
+       "apihelp-query+blocks-paramvalue-prop-user": "A blokkolt felhasználó felhasználóneve.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "A blokkolt felhasználó felhasználóazonosítója.",
+       "apihelp-query+blocks-paramvalue-prop-by": "A blokkoló felhasználó felhasználóneve.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "A blokkoló felhasználó felhasználóazonosítója.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "A blokkolás időbélyege.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "A blokk lejáratának időbélyege.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "A blokk indoklása.",
+       "apihelp-query+blocks-paramvalue-prop-range": "A blokk által érintett IP-címek tartománya.",
+       "apihelp-query+blocks-param-show": "Csak a megadott feltételeknek megfelelő elemek megjelenítése.\nPéldául csak IP-címek végtelen blokkjainak megjelenítéséhez állítsd <kbd>$1show=ip|!temp</kbd> értékre.",
+       "apihelp-query+blocks-example-simple": "Blokkok listázása.",
+       "apihelp-query+blocks-example-users": "<kbd>Alice</kbd> és <kbd>Bob</kbd> blokkjainak listázása.",
+       "apihelp-query+categories-description": "A lapok összes kategóriájának listázása.",
+       "apihelp-query+categories-param-prop": "A kategóriákhoz további lekérendő további tulajdonságok:",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "A kategória hozzáadásának időbélyege.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "A <code>_&#95;HIDDENCAT_&#95;</code> kapcsolóval elrejtett kategóriák megjelölése.",
+       "apihelp-query+categories-param-show": "A megjelenítendő kategóriatípusok.",
+       "apihelp-query+categories-param-limit": "A visszaadandó kategóriák száma.",
+       "apihelp-query+categories-param-categories": "Csak ezen kategóriák listázása. Annak ellenőrzésére alkalmas, hogy egy lap benne van-e egy adott kategóriában.",
+       "apihelp-query+categories-param-dir": "A listázás iránya.",
+       "apihelp-query+categories-example-simple": "Az <kbd>Albert Einstein</kbd> lap kategóriáinak lekérése.",
+       "apihelp-query+categories-example-generator": "Információk lekérése az <kbd>Albert Einstein</kbd> lap kategóriáiról.",
+       "apihelp-query+categoryinfo-description": "Információk lekérése a megadott kategóriákról.",
+       "apihelp-query+categoryinfo-example-simple": "Információk lekérése a <kbd>Category:Foo</kbd> és a <kbd>Category:Bar</kbd> kategóriáról.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mód|Módok}}: $2",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "SHA-1 hash hozzáadása a fájlhoz.",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "MIME-típus hozzáadása a fájlhoz.",
        "api-help-param-type-boolean": "Típus: logikai ([[Special:ApiHelp/main#main/datatypes|részletek]])",
        "api-help-param-type-timestamp": "Típus: {{PLURAL:$1|1=időbélyeg|2=időbélyegek listája}} ([[Special:ApiHelp/main#main/datatypes|engedélyezett formátumok]])",
        "api-help-param-type-user": "Típus: {{PLURAL:$1|1=felhasználónév|2=felhasználónevek listája}}",
-       "api-help-param-list": "{{PLURAL:$1|1=A következő értékek egyike|2=Értékek (elválasztó: <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=A következő értékek egyike|2=Értékek (elválasztó: <kbd>{{!}}</kbd> vagy [[Special:ApiHelp/main#main/datatypes|más]])}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Üresnek kell lennie|Lehet üres vagy $2}}",
        "api-help-param-limit": "Nem engedélyezett több mint $1.",
        "api-help-param-limit2": "Nem engedélyezett több mint $1 (botoknak $2).",
index 61e70f4..0cc154f 100644 (file)
@@ -19,7 +19,7 @@
                        "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]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentazione]] (in inglese)\n* [[mw:Special:MyLanguage/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:Special:MyLanguage/API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\n<strong>Test:</strong> per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Azione da compiere.",
        "apihelp-main-param-format": "Formato dell'output.",
        "apihelp-main-param-assert": "Verifica che l'utente abbia effettuato l'accesso se si è impostato <kbd>user</kbd>, o che abbia i permessi di bot se si è impostato <kbd>bot</kbd>.",
        "apihelp-move-example-move": "Sposta <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> senza lasciare redirect.",
        "apihelp-opensearch-param-search": "Stringa di ricerca.",
        "apihelp-opensearch-param-limit": "Numero massimo di risultati da restituire.",
-       "apihelp-opensearch-param-suggest": "Non fare nulla se <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> è falso.",
+       "apihelp-opensearch-param-suggest": "Non fare nulla se <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> è falso.",
        "apihelp-opensearch-param-format": "Il formato dell'output.",
        "apihelp-opensearch-example-te": "Trova le pagine che iniziano con <kbd>Te</kbd>.",
        "apihelp-options-param-optionvalue": "Il valore per l'opzione specificata da <var>$1optionname</var>.",
        "apihelp-query+redirects-param-namespace": "Includi solo le pagine in questi namespace.",
        "apihelp-query+redirects-param-limit": "Quanti reindirizzamenti restituire.",
        "apihelp-query+redirects-example-simple": "Ottieni un elenco di redirect a [[Main Page]].",
-       "apihelp-query+revisions-param-startid": "L'ID versione da cui iniziare l'elenco.",
+       "apihelp-query+revisions-param-startid": "Inizia l'elenco dal timestamp di questa versione. La versione deve esistere, ma non necessariamente deve appartenere a questa pagina.",
        "apihelp-query+revisions-param-start": "Il timestamp della versione da cui iniziare l'elenco.",
        "apihelp-query+revisions-param-tag": "Elenca solo le versioni etichettate con questa etichetta.",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "L'ID della versione.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Restituisci librerie installate sul wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "Restituisci estensioni installate sul wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Restituisce informazioni sui tipi di restrizione (protezione) disponibili.",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Restituisce un'elenco di codici lingua per cui [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] è attivo, e le varianti supportate per ognuno di essi.",
        "apihelp-query+siteinfo-example-simple": "Recupera informazioni sul sito.",
        "apihelp-query+tags-param-prop": "Quali proprietà ottenere:",
        "apihelp-query+templates-param-limit": "Quanti template restituire.",
        "apihelp-removeauthenticationdata-description": "Rimuove i dati di autenticazione per l'utente corrente.",
        "apihelp-removeauthenticationdata-example-simple": "Tentativo di rimuovere gli attuali dati utente per <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "Invia una mail per reimpostare la password di un utente.",
-       "apihelp-resetpassword-description-noroutes": "Non sono disponibili rotte per la reimpostazione della password.\n\nAbilita le rotte in <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> per usare questo modulo.",
+       "apihelp-resetpassword-description-noroutes": "Non sono disponibili rotte per la reimpostazione della password.\n\nAbilita le rotte in <var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> per usare questo modulo.",
        "apihelp-resetpassword-param-user": "Utente in corso di ripristino.",
        "apihelp-resetpassword-param-email": "Indirizzo di posta elettronica dell'utente in corso di ripristino.",
        "apihelp-resetpassword-example-user": "Invia una mail per reimpostare la password all'utente <kbd>Example</kbd>.",
        "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-invalidoldimage": "Il parametro <var>oldimage</var> ha un formato non valido.",
        "apierror-invaliduserid": "L'ID utente <var>$1</var> non è valido.",
        "apierror-nosuchuserid": "Non c'è alcun utente con ID $1.",
        "api-credits-header": "Crediti"
index e17b9ad..dcf14ab 100644 (file)
        "apihelp-query+siteinfo-paramvalue-prop-general": "システム全体の情報。",
        "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "特別ページの別名の一覧。",
        "apihelp-query+siteinfo-paramvalue-prop-magicwords": "マジックワードとこれらの別名の一覧。",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "アップロードが許可されているファイル拡張子の一覧を返します。",
        "apihelp-query+siteinfo-param-numberingroup": "利用者グループに属する利用者の数を一覧表示します。",
        "apihelp-query+siteinfo-example-simple": "サイト情報を取得する。",
        "apihelp-query+tags-description": "変更タグを一覧表示します。",
        "apihelp-rollback-example-simple": "利用者 <kbd>Example</kbd> による <kbd>Main Page</kbd> への最後の一連の編集を巻き戻す。",
        "apihelp-rollback-example-summary": "IP利用者 <kbd>192.0.2.5</kbd> による <kbd>Main Page</kbd> への最後の一連の編集を <kbd>Reverting vandalism</kbd> という理由で、それらの編集とその差し戻しをボットの編集としてマークして差し戻す。",
        "apihelp-stashedit-param-title": "編集されているページのページ名。",
+       "apihelp-stashedit-param-section": "節番号です。先頭の節の場合は <kbd>0</kbd>、新しい節の場合は <kbd>new</kbd>を指定します。",
+       "apihelp-stashedit-param-sectiontitle": "新しい節の名前です。",
        "apihelp-stashedit-param-text": "ページの本文。",
        "apihelp-stashedit-param-contentmodel": "新しいコンテンツのコンテンツ・モデル。",
        "apihelp-tag-description": "個々の版または記録項目に対しタグの追加または削除を行います。",
        "apihelp-userrights-param-userid": "利用者ID。",
        "apihelp-userrights-param-add": "利用者をこのグループに追加します。",
        "apihelp-userrights-param-reason": "変更の理由。",
+       "apihelp-userrights-example-expiry": "利用者 <kbd>SometimeSysop</kbd> を 1ヶ月間 <kbd>sysop</kbd> グループに追加する。",
        "apihelp-watch-description": "現在の利用者のウォッチリストにページを追加/除去します。",
        "apihelp-watch-example-watch": "<kbd>Main Page</kbd> をウォッチする。",
        "apihelp-watch-example-unwatch": "<kbd>Main Page</kbd> のウォッチを解除する。",
        "apihelp-xml-param-includexmlnamespace": "指定すると、XML 名前空間を追加します。",
        "apihelp-xmlfm-description": "データを XML 形式 (HTML に埋め込んだ形式) で出力します。",
        "api-format-title": "MediaWiki API の結果",
-       "api-format-prettyprint-header": "このページは $1 形式を HTML で表現したものです。HTML はデバッグに役立ちますが、アプリケーションでの使用には適していません。\n\n<var>format</var> パラメーターを指定すると出力形式を変更できます 。$1 形式の非 HTML 版を閲覧するには、format=$2 を設定してください。\n\n詳細情報については [[mw:API|完全な説明文書]]または [[Special:ApiHelp/main|API のヘルプ]]を参照してください。",
+       "api-format-prettyprint-header": "このページは $1 形式を HTML で表現したものです。HTML はデバッグに役立ちますが、アプリケーションでの使用には適していません。\n\n<var>format</var> パラメーターを指定すると出力形式を変更できます 。$1 形式の非 HTML 版を閲覧するには、format=$2 を設定してください。\n\n詳細情報については [[mw:Special:MyLanguage/API|完全な説明文書]]または [[Special:ApiHelp/main|API のヘルプ]]を参照してください。",
        "api-pageset-param-titles": "対象のページ名のリスト。",
        "api-pageset-param-pageids": "対象のページIDのリスト。",
        "api-pageset-param-revids": "対象の版IDのリスト。",
        "api-help-param-default-empty": "既定値: <span class=\"apihelp-empty\">(空)</span>",
        "api-help-param-token": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]] から取得した「$1」トークン",
        "api-help-param-token-webui": "互換性のために、ウェブUIで使用されるトークンも受理されます。",
-       "api-help-param-limited-in-miser-mode": "<strong>注意:</strong> [[mw:Manual:$wgMiserMode|miser mode]] により、これを使用すると継続する前に <var>$1limit</var> より返される結果が少なくなることがあります; 極端な場合では、ゼロ件の結果が返ることもあります。",
+       "api-help-param-limited-in-miser-mode": "<strong>注意:</strong> [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]] により、これを使用すると継続する前に <var>$1limit</var> より返される結果が少なくなることがあります; 極端な場合では、ゼロ件の結果が返ることもあります。",
        "api-help-param-direction": "列挙の方向:\n;newer:古いものを先に表示します。注意: $1start は $1end 以前でなければなりません。\n;older:新しいものを先に表示します (既定)。注意: $1start は $1end 以降でなければなりません。",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(説明なし)</span>",
        "api-help-examples": "{{PLURAL:$1|例}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|権限を持つグループ}}: $2",
        "api-help-open-in-apisandbox": "<small>[サンドボックスで開く]</small>",
        "apierror-missingparam": "パラメーター <var>$1</var> を設定してください。",
+       "apiwarn-invalidcategory": "「$1」はカテゴリではありません。",
+       "apiwarn-notfile": "「$1」はファイルではありません。",
        "api-credits-header": "クレジット",
        "api-credits": "API の開発者:\n* Roan Kattouw (2007年9月-2009年の主任開発者)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (作成者、2006年9月-2007年9月の主任開発者)\n* Brad Jorsch (2013年-現在の主任開発者)\n\nコメント、提案、質問は mediawiki-api@lists.wikimedia.org にお送りください。\nバグはこちらへご報告ください: https://phabricator.wikimedia.org/"
 }
index 258a3d4..3391708 100644 (file)
                        "Ykhwong",
                        "Jonghaya",
                        "Jerrykim306",
-                       "코코아"
+                       "코코아",
+                       "Macofe"
                ]
        },
-       "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 버그 및 요청]\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/ko|API:오류와 경고]]를 참조하십시오.\n\n<strong>테스트하기:</strong> API 요청 테스트를 용이하게 하려면, [[Special:ApiSandbox]]를 보십시오.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|설명문서]]\n* [[mw:Special:MyLanguage/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 버그 및 요청]\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:Special:MyLanguage/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-maxlag": "최대 랙은 미디어위키가 데이터베이스 복제된 클러스터에 설치되었을 때 사용될 수 있습니다. 특정한 행동이 사이트 복제 랙을 유발할 때, 이 변수는 클라이언트가 복제 랙이 설정된 숫자 아래로 내려갈 때까지 기다리도록 지시합니다. 과도한 랙의 경우, <samp>maxlag</samp> 오류 코드와 <samp>$host 대기 중: $lag초 지연되었습니다</samp> 메시지가 제공됩니다.<br />[[mw:Special:MyLanguage/Manual:Maxlag_parameter|매뉴얼: Maxlag 변수]]에서 더 많은 정보를 얻을 수 있습니다.",
        "apihelp-main-param-smaxage": "<code>s-maxage</code> HTTP 캐시 컨트롤 헤더를 설정합니다. 오류는 캐시되지 않습니다.",
        "apihelp-main-param-maxage": "<code>max-age</code> HTTP 캐시 컨트롤 헤더를 설정합니다. 오류는 캐시되지 않습니다.",
        "apihelp-main-param-assert": "<kbd>user</kbd> 플래그가 설정되어 있다면 로그인 여부를 체크하며, <kbd>bot</kbd>  플래그가 설정되어 있다면 봇 사용자 권한이 설정되어 있는지 확인합니다.",
@@ -45,7 +46,7 @@
        "apihelp-block-param-autoblock": "최근 사용한 IP 주소나 로그인을 시도한 이후에 사용한 모든 IP 주소를 자동으로 차단합니다.",
        "apihelp-block-param-noemail": "위키를 통해 이메일을 보내지 못하도록 막습니다. (<code>blockemail</code> 권한 필요)",
        "apihelp-block-param-hidename": "차단 기록에서 사용자 이름을 숨깁니다. (<code>hideuser</code> 권한 필요)",
-       "apihelp-block-param-allowusertalk": "ì\9e\90ì\8b ì\9d\98 í\86 ë¡  ë¬¸ì\84\9c를 í\8e¸ì§\91í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d í\97\88ì\9a©í\95©ë\8b\88ë\8b¤. (<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var> ê°\92에 따라 다름)",
+       "apihelp-block-param-allowusertalk": "ì\82¬ì\9a©ì\9e\90ê°\80 ì\9e\90ì\8b ì\9d\98 í\86 ë¡  ë¬¸ì\84\9c를 í\8e¸ì§\91í\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d í\97\88ì\9a©í\95©ë\8b\88ë\8b¤ (<var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>에 따라 다름)",
        "apihelp-block-param-reblock": "사용자가 이미 차단된 경우, 기존 차단 설정을 바꿉니다.",
        "apihelp-block-param-watchuser": "해당 사용자 또는 IP 주소의 사용자 문서 및 토론 문서를 주시합니다.",
        "apihelp-block-param-tags": "차단 기록의 항목에 적용할 태그를 변경합니다.",
        "apihelp-createaccount-param-language": "사용자에게 기본으로 설정할 언어 코드. (선택 사항, 기본값으로는 본문의 언어입니다)",
        "apihelp-createaccount-example-pass": "사용자 <kbd>testuser</kbd>를 만들고 비밀번호를 <kbd>test123</kbd>으로 설정합니다.",
        "apihelp-createaccount-example-mail": "사용자 <kbd>testmailuser</kbd>를 만들고 자동 생성된 비밀번호를 이메일로 보냅니다.",
+       "apihelp-cspreport-description": "브라우저가 콘텐츠 보안 정책의 위반을 보고하기 위해 사용합니다. 이 모듈은 SCP를 준수하는 웹 브라우저에 의해 자동으로 사용될 때를 제외하고는 사용해서는 안 됩니다.",
+       "apihelp-cspreport-param-reportonly": "강제적 정책이 아닌, 모니터링 정책에서 나온 보고서인 것으로 표시합니다",
        "apihelp-delete-description": "문서 삭제",
        "apihelp-delete-param-title": "삭제할 문서의 제목. <var>$1pageid</var>과 함께 사용할 수 없습니다.",
        "apihelp-delete-param-pageid": "삭제할 문서의 ID. <var>$1title</var>과 함께 사용할 수 없습니다.",
        "apihelp-delete-param-reason": "삭제의 이유. 설정하지 않으면 자동 생성되는 이유를 사용합니다.",
        "apihelp-delete-param-watch": "문서를 현재 사용자의 주시문서 목록에 추가합니다.",
+       "apihelp-delete-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.",
        "apihelp-delete-param-unwatch": "문서를 현재 사용자의 주시문서 목록에서 제거합니다.",
        "apihelp-delete-example-simple": "<kbd>Main Page</kbd>를 삭제합니다.",
+       "apihelp-delete-example-reason": "<kbd>Preparing for move</kbd> 라는 이유로 <kbd>Main Page</kbd>를 삭제하기.",
        "apihelp-disabled-description": "이 모듈은 해제되었습니다.",
        "apihelp-edit-description": "문서를 만들고 편집합니다.",
+       "apihelp-edit-param-title": "편집할 문서의 제목. <var>$1pageid</var>과 같이 사용할 수 없습니다.",
        "apihelp-edit-param-section": "문단 번호입니다. <kbd>0</kbd>은 최상위 문단, <kbd>new</kbd>는 새 문단입니다.",
        "apihelp-edit-param-sectiontitle": "새 문단을 위한 제목.",
        "apihelp-edit-param-text": "문서 내용.",
        "apihelp-edit-param-nocreate": "페이지가 존재하지 않으면 오류를 출력합니다.",
        "apihelp-edit-param-watch": "문서를 현재 사용자의 주시문서 목록에 추가합니다.",
        "apihelp-edit-param-unwatch": "문서를 현재 사용자의 주시문서 목록에서 제거합니다.",
+       "apihelp-edit-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.",
        "apihelp-edit-param-redirect": "자동으로 넘겨주기 처리하기.",
        "apihelp-edit-param-contentmodel": "새 콘텐츠의 콘텐츠 모델.",
        "apihelp-edit-example-edit": "문서 편집",
        "apihelp-feedcontributions-param-feedformat": "피드 포맷.",
        "apihelp-feedcontributions-param-user": "기여를 읽을 사용자 이름.",
        "apihelp-feedcontributions-param-namespace": "기여를 분류할 이름공간",
+       "apihelp-feedcontributions-param-year": "년부터 (혹은 그 이전).",
+       "apihelp-feedcontributions-param-month": "달부터 (혹은 그 이전).",
        "apihelp-feedcontributions-param-deletedonly": "삭제된 기여만 봅니다.",
        "apihelp-feedcontributions-param-toponly": "최신 판인 편집만 봅니다.",
        "apihelp-feedcontributions-param-newonly": "새 글인 편집만 봅니다.",
        "apihelp-feedwatchlist-param-feedformat": "피드 포맷.",
        "apihelp-feedwatchlist-example-default": "주시문서 목록 피드를 보여줍니다.",
        "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-recursive": "모든 도움말을 한 페이지로 모읍니다.",
+       "apihelp-help-example-help": "도움말 모듈 자체에 대한 도움말입니다.",
+       "apihelp-help-example-query": "2개의 쿼리 하위 모듈의 도움말입니다.",
        "apihelp-imagerotate-description": "하나 이상의 그림을 회전합니다.",
        "apihelp-imagerotate-param-rotation": "시계 방향으로 회전할 그림의 각도.",
        "apihelp-import-param-xml": "업로드한 XML 파일.",
        "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>기존 제목</kbd>에서 <kbd>대상 제목</kbd>으로 넘겨주기를 만들지 않고 이동하기.",
        "apihelp-opensearch-description": "OpenSearch 프로토콜을 이용하여 위키 검색하기",
        "apihelp-opensearch-param-search": "문자열 검색",
        "apihelp-opensearch-param-limit": "반환할 결과의 최대 수",
        "apihelp-opensearch-param-namespace": "검색할 이름공간.",
+       "apihelp-opensearch-param-suggest": "<var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var>이 거짓인 경우 아무 것도 하지 않습니다.",
        "apihelp-opensearch-param-format": "출력 포맷.",
        "apihelp-opensearch-example-te": "<kbd>Te</kbd>로 시작하는 문서를 찾기.",
        "apihelp-options-param-reset": "사이트 기본으로 설정 초기화",
        "apihelp-parse-param-preview": "미리 보기 모드에서 구문 분석을 합니다.",
        "apihelp-parse-param-sectionpreview": "문단 미리 보기 모드에서 구문 분석을 합니다. (미리 보기 모드도 활성화함)",
        "apihelp-parse-param-disabletoc": "출력에서 목차를 제외합니다.",
+       "apihelp-parse-param-useskin": "선택한 스킨을 파서 출력에 적용합니다. 다음의 속성에 영향을 줄 수 있습니다: <kbd>langlinks</kbd>, <kbd>headitems</kbd>, <kbd>modules</kbd>, <kbd>jsconfigvars</kbd>, <kbd>indicators</kbd>.",
        "apihelp-parse-example-page": "페이지의 구문을 분석합니다.",
        "apihelp-parse-example-text": "위키텍스트의 구문을 분석합니다.",
        "apihelp-parse-example-summary": "요약을 구문 분석합니다.",
+       "apihelp-patrol-description": "문서나 판을 점검하기.",
+       "apihelp-patrol-param-rcid": "점검할 최근 바뀜 ID입니다.",
+       "apihelp-patrol-param-revid": "점검할 판 ID입니다.",
+       "apihelp-patrol-example-rcid": "최근의 변경사항을 점검합니다.",
        "apihelp-patrol-example-revid": "판을 점검합니다.",
        "apihelp-protect-description": "문서의 보호 수준을 변경합니다.",
        "apihelp-protect-param-reason": "보호 또는 보호 해제의 이유.",
+       "apihelp-protect-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.",
        "apihelp-protect-example-protect": "문서 보호",
        "apihelp-purge-description": "주어진 제목을 위한 캐시를 새로 고침.",
        "apihelp-purge-param-forcelinkupdate": "링크 테이블을 업데이트합니다.",
+       "apihelp-purge-example-simple": "<kbd>Main Page</kbd>와 <kbd>API</kbd> 문서를 새로 고침.",
        "apihelp-query-param-prop": "조회된 페이지에 대해 가져올 속성입니다.",
        "apihelp-query-param-list": "가져올 목록입니다.",
        "apihelp-query-param-meta": "가져올 메타데이터입니다.",
        "apihelp-query+allcategories-param-prop": "얻고자 하는 속성:",
        "apihelp-query+allcategories-paramvalue-prop-size": "페이지 수를 분류에 추가합니다.",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "<var>$3user</var>와 함께 사용할 수 없습니다.",
+       "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+allusers-description": "등록된 모든 사용자를 열거합니다.",
        "apihelp-query+allusers-param-dir": "정렬 방향.",
        "apihelp-query+allusers-param-prop": "포함할 정보:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "현재 차단된 사용자의 정보를 추가함.",
        "apihelp-query+allusers-paramvalue-prop-editcount": "사용자의 편집 수를 추가합니다.",
        "apihelp-query+allusers-param-witheditsonly": "편집을 한 사용자만 나열합니다.",
        "apihelp-query+allusers-example-Y": "<kbd>Y</kbd>로 시작하는 사용자를 나열합니다.",
        "apihelp-query+authmanagerinfo-description": "현재의 인증 상태에 대한 정보를 검색합니다.",
        "apihelp-query+backlinks-param-namespace": "열거할 이름공간.",
+       "apihelp-query+backlinks-example-simple": "<kbd>Main Page</kbd>를 가리키는 링크를 보이기.",
+       "apihelp-query+backlinks-example-generator": "<kbd>Main Page</kbd>를 가리키는 문서의 정보를 보기.",
        "apihelp-query+blocks-description": "차단된 모든 사용자와 IP 주소를 나열합니다.",
        "apihelp-query+blocks-param-start": "나열을 시작할 타임스탬프",
        "apihelp-query+blocks-param-end": "나열을 끝낼 타임스탬프",
        "apihelp-query+recentchanges-paramvalue-prop-user": "편집에 임할 사용자를 추가하고 IP인 경우 태그합니다.",
        "apihelp-query+recentchanges-paramvalue-prop-userid": "편집에 임할 사용자를 추가합니다.",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.",
+       "apihelp-query+revisions-param-startid": "이 판의 타임스탬프에서 열거를 시작합니다. 이 판은 존재해야 하지만 이 문서에 속할 필요는 없습니다.",
+       "apihelp-query+revisions-param-endid": "이 판의 타임스탬프에서 열거를 중단합니다. 이 판은 존재해야 하지만 이 문서에 속할 필요는 없습니다.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "판의 길이. (바이트)",
        "apihelp-query+revisions+base-paramvalue-prop-sha1": "판의 SHA-1 (base 16).",
        "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "판의 콘텐츠 모델 ID.",
        "apihelp-query+tags-paramvalue-prop-name": "태그의 이름을 추가합니다.",
        "apihelp-query+tags-paramvalue-prop-description": "태그의 설명을 추가합니다.",
        "apihelp-query+tags-paramvalue-prop-hitcount": "판의 수와 이 판을 가진 로그 엔트리를 추가합니다.",
+       "apihelp-query+templates-param-namespace": "이 이름공간에 속한 틀만 표시합니다.",
        "apihelp-query+templates-param-limit": "반환할 틀 수.",
        "apihelp-query+tokens-param-type": "요청할 토큰의 종류.",
        "apihelp-query+tokens-example-simple": "csrf 토큰을 가져옵니다. (기본값)",
        "apihelp-query+watchlist-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "적절한 곳에 로그 정보를 추가합니다.",
        "apihelp-removeauthenticationdata-description": "현재 사용자의 인증 데이터를 제거합니다.",
+       "apihelp-resetpassword-description": "비밀번호 재설정 이메일을 사용자에게 보냅니다.",
+       "apihelp-resetpassword-param-user": "재설정할 사용자입니다.",
+       "apihelp-resetpassword-param-email": "재설정할 사용자의 이메일 주소입니다.",
+       "apihelp-resetpassword-example-user": "사용자 <kbd>Example</kbd>에게 비밀번호 재설정 이메일을 보냅니다.",
+       "apihelp-resetpassword-example-email": "<kbd>user@example.com</kbd> 이메일 주소를 가진 모든 사용자에 대해 비밀번호 재설정 이메일을 보냅니다.",
        "apihelp-revisiondelete-description": "판을 삭제하거나 되살립니다.",
        "apihelp-revisiondelete-param-reason": "삭제 또는 복구 이유.",
        "apihelp-rollback-param-tags": "되돌리기를 적용하기 위해 태그합니다.",
+       "apihelp-rollback-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.",
+       "apihelp-rollback-example-simple": "<kbd>Project:대문</kbd> 문서의 <kbd>예시</kbd>의 마지막 판을 되돌리기",
        "apihelp-setpagelanguage-description": "문서의 언어를 변경합니다.",
-       "apihelp-setpagelanguage-description-disabled": "이 위키에서 문서의 언어 변경은 허용되지 않습니다.\n\n이 동작을 사용하려면 <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>을 활성화하십시오.",
+       "apihelp-setpagelanguage-description-disabled": "이 위키에서 문서의 언어 변경은 허용되지 않습니다.\n\n이 동작을 사용하려면 <var>[[mw:Special:MyLanguage/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-description": "데이터 수정 작업을 위해 토큰을 가져옵니다.\n\n이 모듈은 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]의 선호에 따라 사용이 권장되지 않습니다.",
        "apihelp-tokens-param-type": "요청할 토큰의 종류.",
+       "apihelp-tokens-example-edit": "편집 토큰을 검색합니다. (기본값)",
+       "apihelp-tokens-example-emailmove": "편집 토큰과 이동 토큰을 검색합니다.",
        "apihelp-unblock-description": "사용자를 차단 해제합니다.",
+       "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-unblock-example-user": "<kbd>Sorry Bob</kbd>이 이유인 <kbd>Bob</kbd> 사용자의 차단을 해제합니다.",
+       "apihelp-undelete-description": "삭제된 문서의 판을 복구합니다.\n\n삭제된 판의 목록(타임스탬프 포함)은 [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]]을 통해 검색할 수 있으며 삭제된 파일 ID의 목록은 [[Special:ApiHelp/query+filearchive|list=filearchive]]을 통해 검색할 수 있습니다.",
+       "apihelp-undelete-param-title": "복구할 문서의 제목입니다.",
+       "apihelp-undelete-param-reason": "복구할 이유입니다.",
+       "apihelp-undelete-param-tags": "삭제 기록의 항목에 적용할 태그를 변경합니다.",
+       "apihelp-undelete-param-timestamps": "복구할 판의 타임스탬프입니다. <var>$1timestamps</var>와 <var>$1fileids</var>가 둘 다 비어있으면 모든 판이 복구됩니다.",
+       "apihelp-undelete-param-fileids": "복구할 파일 판의 ID입니다. <var>$1timestamps</var>와 <var>$1fileids</var>가 둘 다 비어있으면 모든 판이 복구됩니다.",
+       "apihelp-undelete-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.",
+       "apihelp-undelete-example-page": "<kbd>대문</kbd> 문서를 복구합니다.",
+       "apihelp-undelete-example-revisions": "<kbd>대문</kbd> 문서의 두 판을 복구합니다.",
+       "apihelp-unlinkaccount-description": "현재 사용자에 연결된 타사 계정을 제거합니다.",
+       "apihelp-unlinkaccount-example-simple": "<kbd>FooAuthenticationRequest</kbd>와 연결된 제공자에 대한 현재 사용자의 토론 링크 제거를 시도합니다.",
+       "apihelp-upload-param-filename": "대상 파일 이름.",
+       "apihelp-upload-param-comment": "업로드 주석입니다. 또, <var>$1text</var>가 지정되지 않은 경우 새로운 파일들의 초기 페이지 텍스트로 사용됩니다.",
+       "apihelp-upload-param-tags": "업로드 기록 항목과 파일 문서 판에 적용할 태그를 변경합니다.",
+       "apihelp-upload-param-text": "새로운 파일들에 대한 초기 문서 텍스트.",
+       "apihelp-upload-param-watch": "문서를 주시합니다.",
+       "apihelp-upload-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.",
        "apihelp-upload-param-ignorewarnings": "모든 경고를 무시합니다.",
+       "apihelp-upload-param-file": "파일의 내용입니다.",
+       "apihelp-upload-param-url": "파일을 가져올 URL입니다.",
+       "apihelp-upload-param-filekey": "임시로 보관한 이전의 업로드를 식별하는 키입니다.",
+       "apihelp-upload-param-sessionkey": "$1filekey와 동일하며, 하위 호환성을 위해 유지됩니다.",
+       "apihelp-upload-param-stash": "설정하면 서버는 저장소에 파일을 추가하는 대신 임시로 파일을 보관합니다.",
+       "apihelp-upload-param-filesize": "전체 업로드의 파일 크기입니다.",
+       "apihelp-upload-param-offset": "바이트 단위의 청크 오프셋.",
+       "apihelp-upload-param-chunk": "청크의 내용입니다.",
+       "apihelp-upload-param-async": "가능하면 잠재적으로 큰 파일 작업을 비동기로 처리합니다.",
+       "apihelp-upload-param-checkstatus": "제공된 파일 키의 업로드 상태만 가져옵니다.",
+       "apihelp-upload-example-url": "URL에서 업로드합니다.",
+       "apihelp-upload-example-filekey": "경고로 인해 실패한 업로드를 마칩니다.",
+       "apihelp-userrights-description": "사용자의 그룹 권한을 변경합니다.",
        "apihelp-userrights-param-user": "사용자 이름.",
        "apihelp-userrights-param-userid": "사용자 ID.",
+       "apihelp-userrights-param-add": "이 그룹에 사용자를 추가하지만, 이미 회원이라면 해당 그룹의 회원 만료 날짜를 업데이트합니다.",
+       "apihelp-userrights-param-expiry": "만료 타임스탬프입니다. 상대값(예: <kbd>5 months</kbd> 또는 <kbd>2 weeks</kbd>)이거나 절대값(예: <kbd>2014-09-18T12:34:56Z</kbd>)이다. 타임스탬프만 설정할 경우, <var>$1add</var> 변수에 전달되는 모든 그룹에 사용됩니다. 만료되지 않는 사용자 그룹으로 지정하려면 <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, 또는 <kbd>never</kbd>를 사용하십시오.",
+       "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>bot</kbd> 그룹에 추가하며, <kbd>sysop</kbd>과 <kbd>bureaucrat</kbd> 그룹에서 제거합니다.",
+       "apihelp-userrights-example-expiry": "사용자 <kbd>SometimeSysop</kbd>을 <kbd>sysop</kbd> 그룹에 1개월 간 추가합니다.",
+       "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>Example</kbd>를 만들기 위해 비밀번호 <kbd>qwerty</kbd>를 확인합니다.",
+       "apihelp-watch-description": "현재 사용자의 주시목록에서 문서를 추가하거나 제거합니다.",
+       "apihelp-watch-param-title": "주시하거나 주시를 해제할 문서입니다. <var>$1titles</var>를 대신 사용하세요.",
+       "apihelp-watch-param-unwatch": "설정하면 문서의 주시는 해제됩니다.",
+       "apihelp-watch-example-watch": "<kbd>대문</kbd> 문서를 주시합니다.",
+       "apihelp-watch-example-unwatch": "<kbd>대문</kbd> 문서의 주시를 해제합니다.",
+       "apihelp-watch-example-generator": "일반 이름공간의 일부 첫 문서들을 주시합니다.",
        "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-login-fail-aborted": "인증은 사용자의 상호작용이 필요하지만, <kbd>action=login</kbd>에 의해 지원되지 않습니다. <kbd>action=login</kbd>으로 로그인할 수 있게 하려면 [[Special:BotPasswords]]를 참조하십시오. 주 계정 로그인의 사용을 계속하려면 <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>을 참조하십시오.",
+       "api-login-fail-aborted-nobotpw": "인증은 사용자의 상호작용이 필요하지만, <kbd>action=login</kbd>에 의해 지원되지 않습니다. 로그인하려면 <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>을 참조하십시오.",
+       "api-login-fail-badsessionprovider": "$1을(를) 사용할 경우 로그인할 수 없습니다.",
+       "api-login-fail-sameorigin": "기원이 동일한 정책이 적용되지 않으면 로그인할 수 없습니다.",
        "api-pageset-param-titles": "작업할 제목의 목록입니다.",
        "api-pageset-param-pageids": "작업할 페이지 ID의 목록입니다.",
        "api-pageset-param-revids": "작업할 판 ID의 목록입니다.",
        "api-pageset-param-generator": "특정 쿼리 모듈을 실행함으로써 작업할 페이지의 목록입니다.\n\n<strong>참고:</strong> 발생기 변수명은 \"g\"로 시작해야 합니다. 예시를 참고하십시오.",
+       "api-pageset-param-redirects-generator": "<var>$1titles</var>, <var>$1pageids</var>, <var>$1revids</var> 및 <var>$1generator</var>가 반환한 문서들의 넘겨주기를 자동으로 결정합니다.",
+       "api-pageset-param-redirects-nogenerator": "<var>$1titles</var>, <var>$1pageids</var>, <var>$1revids</var>의 넘겨주기를 자동으로 결정합니다.",
+       "api-pageset-param-converttitles": "필요하면 제목을 다른 형태로 변환합니다. 위키의 내용 언어가 형태 변환을 지원하는 경우에만 동작합니다. 형태 변환을 지원하는 언어는 $1을(를) 포함합니다.",
        "api-help-title": "미디어위키 API 도움말",
        "api-help-lead": "이 페이지는 자동으로 생성된 미디어위키 API 도움말 문서입니다.\n\n설명 문서 및 예시: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "메인 모듈",
        "api-help-param-type-limit": "유형: 정수 또는 <kbd>max</kbd>",
        "api-help-param-type-integer": "유형: {{PLURAL:$1|1=정수|2=정수 목록}}",
        "api-help-param-type-boolean": "유형: 부울 ([[Special:ApiHelp/main#main/datatypes|자세한 정보]])",
+       "api-help-param-type-timestamp": "유형: {{PLURAL:$1|1=타임스탬프|2=타임스탬프 목록}} ([[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 또는 [[Special:ApiHelp/main#main/datatypes|alternative]]: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=비어 있어야 함|비어 있을 수 있거나 $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-upload": "여러 부분/폼 데이터를 사용한 파일 업로드로 게시되어야 합니다.",
        "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",
        "apierror-filenopath": "로컬 파일 경로를 가져올 수 없습니다.",
        "apierror-import-unknownerror": "알 수 없는 가져오기 오류: $1.",
        "apierror-invalidcategory": "입력한 분류 이름이 올바르지 않습니다.",
+       "apierror-invalidexpiry": "잘못된 만료 기한 \"$1\".",
        "apierror-invalid-file-key": "유효한 파일 키가 아닙니다.",
-       "apierror-invalidoldimage": "oldimage 변수에 유효하지 않은 형식이 있습니다.",
+       "apierror-invalidoldimage": "<var>oldimage</var> 변수에 유효하지 않은 형식이 있습니다.",
        "apierror-invalidparammix-cannotusewith": "<kbd>$1</kbd> 변수는 <kbd>$2</kbd>와(과) 함께 사용할 수 없습니다.",
+       "apierror-invalidsection": "<var>section</var> 변수는 유효한 섹션 ID 또는 <kbd>new</kbd>이어야 합니다.",
        "apierror-invalidsha1base36hash": "제공된 SHA1Base36 해시가 유효하지 않습니다.",
        "apierror-invalidsha1hash": "제공된 SHA1 해시가 유효하지 않습니다.",
        "apierror-invalidtitle": "잘못된 제목 \"$1\".",
        "apierror-ratelimited": "속도 제한을 초과했습니다. 잠시 기다렸다가 다시 시도하십시오.",
        "apierror-readapidenied": "이 모듈을 사용하려면 읽기 권한이 필요합니다.",
        "apierror-readonly": "위키는 현재 읽기 전용 모드입니다.",
+       "apierror-revisions-badid": "<var>$1</var> 변수에 대한 판을 발견하지 못했습니다.",
        "apierror-revwrongpage": "r$1은(는) $2의 판이 아닙니다.",
        "apierror-specialpage-cantexecute": "특수 문서의 결과를 볼 권한이 없습니다.",
        "apierror-stashwrongowner": "잘못된 소유자: $1",
index 7db9665..85cab4e 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Purodha"
+                       "Purodha",
+                       "Macofe"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page/de|Dokemäntazjohn]]\n* [[mw:API:FAQ/de|Öff jefrohch]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mäileng_Leß]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Aanköndejonge zom <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Jemäldte Fähler un Wönsch]\n</div>\n<strong>Status:</strong> Alle op heh dä Sigg aanjzeischte Ußwahle sullte donn, ävver et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> weed jrahd noch äntwekeld un et kann sesch alle Nahslangs jädd ändere. Holl Der de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ Mäileng_Leß med Aanköndejonge], öm automattesch övver Neujeschkeite enfommehrt ze wähde.\n\n<strong>Kapodde Aanfrohre:</strong> Wam_mer kapodde Aanfroheaan et API <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> schek, kritt mer ene <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Transfer Protocol\">HTTP</i>-Kopp ußjejovve met däm Täx „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">MediaWiki-API-Error</code>“ dren, dä mer als ene Schlößel bedraachte kann. Mih dohzoh fengk met op dä Sigg [[mw:API:Errors_and_warnings|<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i>: Fähler un Warnonge]].",
        "apihelp-xml-param-includexmlnamespace": "Wann aanjejovve, deihd en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Appachtemand derbei.",
        "apihelp-xmlfm-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Fommahd schöhn jemaht met <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> ußjävve.",
        "api-format-title": "Wat et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> ußjohv.",
-       "api-format-prettyprint-header-only-html": "Dat heh es en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>_Daaschtällong un för et Fähersöhke jedaach. Dadd is för Aanwändongsprojramme nit ze bruche.\n\nEn de [[mw:API|complete Dokkemäntazjohn]] un de [[Special:ApiHelp/main|API Hölp_Sigg]] kam_mer doh mih drövver lässe.",
+       "api-format-prettyprint-header-only-html": "Dat heh es en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>_Daaschtällong un för et Fähersöhke jedaach. Dadd is för Aanwändongsprojramme nit ze bruche.\n\nEn de [[mw:Special:MyLanguage/API|complete Dokkemäntazjohn]] un de [[Special:ApiHelp/main|API Hölp_Sigg]] kam_mer doh mih drövver lässe.",
        "api-pageset-param-titles": "En Leß vun Övverschreffte för ze beärbeide.",
        "api-pageset-param-pageids": "En Leß vun Kännonge vun Sigge för ze beärbeide.",
        "api-pageset-param-revids": "En Leß vun Kännonge vun Väsjohne för ze beärbeide.",
        "api-help-param-multi-max": "De jrühßte müjjelesche Zahl es {{PLURAL:$1|$1}}, un {{PLURAL:$2|$2}} för Botprojramme.",
        "api-help-param-default": "Schtandatt: $1",
        "api-help-param-default-empty": "Schtandatt: <span class=\"apihelp-empty\">(läddesch)</span>",
-       "api-help-param-disabled-in-miser-mode": "Dadd es wäje em [[mw:Manual:$wgMiserMode|miser mode]] affjeschalldt.",
-       "api-help-param-limited-in-miser-mode": "<strong>Opjepaß:</strong> Weil der [[mw:Manual:$wgMiserMode|miser mode]] enjeschalld es, künne heh winnijer wi <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> Äjehpneße ußjejejovve wähde, vör em Wigger_Mache. En Jränzfäll künne et Noll sin.",
+       "api-help-param-disabled-in-miser-mode": "Dadd es wäje em [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]] affjeschalldt.",
+       "api-help-param-limited-in-miser-mode": "<strong>Opjepaß:</strong> Weil der [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]] enjeschalld es, künne heh winnijer wi <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> Äjehpneße ußjejejovve wähde, vör em Wigger_Mache. En Jränzfäll künne et Noll sin.",
        "api-help-param-direction": "En wälsche Reihjefollsch opleßte:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">newer</code>:De Ählsde et eez. Opjepaß: „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1start</code>“ moß fröhjer sin wi „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1end</code>“.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">older</code>:De Neuste et eez, der Schtanndatt. Opjepaß: „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1start</code>“ moß schpääder sin wi „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1end</code>“.",
        "api-help-param-continue": "Wann mih ze holle es, nemm dat för wigger ze maache.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(nix drövver bikannt)</span>",
index a803645..1b347c2 100644 (file)
@@ -70,6 +70,7 @@
        "apihelp-move-param-movetalk": "D'Diskussiounssäit ëmbenennen, wann et se gëtt.",
        "apihelp-move-param-noredirect": "Keng Viruleedung uleeën.",
        "apihelp-move-param-ignorewarnings": "All Warnungen ignoréieren.",
+       "apihelp-opensearch-param-suggest": "Näischt maache wa(nn) <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> falsch ass.",
        "apihelp-options-description": "Astellunge fir den aktuelle Benotzer änneren.\n\nNëmmen Optiounen aus dem Haaptdeel (core) oder aus enger vun den installéierten Erweiderunge, oder Optioune mat Schlësselen déi viragestallt si mat <code>userjs-</code> (geduecht fir mat Benotzer-Scripte benotzt ze ginn), kënnen agestallt ginn.",
        "apihelp-options-param-optionname": "Den Numm vun der Optioun deen op de Wäert vun <var>$1optionvalue</var> gesat gi muss",
        "apihelp-options-example-reset": "All Astellungen zrécksetzen",
        "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-description-disabled": "Aschalten\n<var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> fir dëse Aktioun ze benotzen",
        "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-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-login-fail-badsessionprovider": "Net méiglech sech anzelogge mat $1.",
        "api-help-source": "Quell: $1",
        "api-help-source-unknown": "Quell: <span class=\"apihelp-unknown\">onbekannt</span>",
        "api-help-license": "Lizenz: [[$1|$2]]",
        "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-revisions-badid": "Fir de Parameter <var>$1</var> gouf keng Versioun fonnt.",
        "apierror-revwrongpage": "r$1 ass keng Versioun vu(n) $2.",
        "apierror-stashwrongowner": "Falsche Besëtzer: $1",
        "apierror-systemblocked": "Dir gouft automatesch vu MediaWiki gespaart.",
index 3abfdeb..fa5dd2a 100644 (file)
@@ -13,8 +13,8 @@
        "apihelp-main-param-maxage": "Задајте му олку секунди на заглавието за контрола HTTP-меѓускладот <code>s-maxage</code>. Грешките никогаш не се чуваат во меѓускладот.",
        "apihelp-main-param-assert": "Провери дали корисникот е најавен ако е зададено <kbd>user</kbd> или дали го има корисничкото право на бот, ако е зададено <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Тука внесената вредност ќе биде вклучена во извештајот. Може да се користи за разликување на барањата.",
-       "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во резултатите.",
-       "apihelp-main-param-curtimestamp": "Ð\91клÑ\83Ñ\87и Ñ\82ековно Ð²Ñ\80еме Ð¸ Ð²Ñ\80еме Ð¸ Ð´Ð°Ñ\82Ñ\83м Ð²Ð¾ Ñ\80езÑ\83лÑ\82аÑ\82от.",
+       "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во исходот.",
+       "apihelp-main-param-curtimestamp": "Ð\92клÑ\83Ñ\87и Ñ\82ековно Ð²Ñ\80еме Ð¸ Ð²Ñ\80еме Ð¸ Ð´Ð°Ñ\82Ñ\83м Ð²Ð¾ Ð¸Ñ\81Ñ\85одот.",
        "apihelp-main-param-origin": "Кога му пристапувате на Пирлогот користејќи повеќедоменско AJAX-барање (CORS), задајте му го на ова изворниот домен. Ова мора да се вклучи во секое подготвително барање и затоа мора да биде дел од URI на барањето (не главната содржина во POST). Ова мора точно да се совпаѓа со еден од изворниците на заглавието Origin:, така што мора да е зададен на нешто како <kbd>https://mk.wikipedia.org</kbd>  or <kbd>https://meta.wikimedia.org</kbd>. Ако овој параметар не се совпаѓа со заглавието <code>Origin</code>:, ќе се појави одговор 403. Ако се совпаѓа, а изворникот е на бел список (на допуштени), тогаш ќе се зададе заглавието <code>Access-Control-Allow-Origin</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": "Блокирај корисник.",
@@ -79,7 +79,7 @@
        "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> кога ќе почнете со уредување (на пр. кога ќе се вчита содржината што ќе ја уредувате).",
        "apihelp-edit-param-recreate": "Занемари ги грешките што се појавуваат во врска со страницата што е избришана во меѓувреме.",
        "apihelp-expandtemplates-param-title": "Наслов на страница.",
        "apihelp-expandtemplates-param-text": "Викитекст за претворање.",
        "apihelp-expandtemplates-param-revid": "Назнака на преработката, за <nowiki>{{REVISIONID}}</nowiki> и слични променливи.",
-       "apihelp-expandtemplates-param-prop": "Кои информации треба да ги добиете:\n\nИмајте на ум дека ако не изберете никаква вредност, резултатот ќе го содржи викитекстот, но изводот ќе биде во застарен формат.",
+       "apihelp-expandtemplates-param-prop": "Кои информации треба да ги добиете:\n\nИмајте на ум дека ако не изберете никаква вредност, исходот ќе го содржи викитекстот, но изводот ќе биде во застарен формат.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Проширениот викитекст.",
        "apihelp-expandtemplates-param-includecomments": "Дали во изводот да се вклучени HTML-коментари.",
        "apihelp-expandtemplates-param-generatexml": "Создај XML-дрво на расчленување (заменето со $1prop=parsetree).",
        "apihelp-feedcontributions-param-deletedonly": "Прикажувај само избришани придонеси.",
        "apihelp-feedcontributions-param-toponly": "Прикажувај само последни преработки.",
        "apihelp-feedcontributions-param-newonly": "Прикажувај само новосоздадени страници",
+       "apihelp-feedcontributions-param-hideminor": "Сокриј ситни уредувања.",
        "apihelp-feedcontributions-param-showsizediff": "Покажувај ја големинската разлика меѓу преработките.",
        "apihelp-feedcontributions-example-simple": "Покажувај придонеси на <kbd>Пример</kbd>.",
        "apihelp-feedrecentchanges-description": "Дава канал со скорешни промени.",
        "apihelp-feedrecentchanges-param-feedformat": "Форматот на каналот.",
-       "apihelp-feedrecentchanges-param-namespace": "Ð\9dа ÐºÐ¾Ñ\98 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\80езÑ\83лÑ\82аÑ\82иÑ\82е.",
+       "apihelp-feedrecentchanges-param-namespace": "Ð\9dа ÐºÐ¾Ñ\98 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87и Ð¸Ñ\81Ñ\85одоÑ\82.",
        "apihelp-feedrecentchanges-param-invert": "Сите именски простори освен избраниот.",
        "apihelp-feedrecentchanges-param-associated": "Вклучи придружни именски простори (разговор или главен).",
-       "apihelp-feedrecentchanges-param-days": "Ð\9dа ÐºÐ¾Ð¸ Ð´ÐµÐ½Ð¾Ð²Ð¸ Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\80езÑ\83лÑ\82аÑ\82ите.",
+       "apihelp-feedrecentchanges-param-days": "Ð\9dа ÐºÐ¾Ð¸ Ð´ÐµÐ½Ð¾Ð²Ð¸ Ð´Ð° Ñ\81е Ð¾Ð³Ñ\80аниÑ\87аÑ\82 Ñ\81Ñ\82авките.",
        "apihelp-feedrecentchanges-param-limit": "Највеќе ставки во исходот за прикажување.",
        "apihelp-feedrecentchanges-param-from": "Прикажи ги промените оттогаш.",
        "apihelp-feedrecentchanges-param-hideminor": "Скриј ги ситните промени.",
        "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-help-param-wrap": "Обвиткај го изводот како станрадна одѕивна структура од прилотот.",
        "apihelp-help-param-toc": "Вклучи табела со содржина во HTML-изводот.",
        "apihelp-help-example-main": "Помош за главниот модул",
+       "apihelp-help-example-submodules": "Помош за <kbd>action=query</kbd> и сите негови подмодули.",
        "apihelp-help-example-recursive": "Сета помош на една страница",
        "apihelp-help-example-help": "Помош за самиот помошен модул",
        "apihelp-help-example-query": "Помош за два подмодула за барања",
        "apihelp-imagerotate-description": "Сврти една или повеќе слики.",
        "apihelp-imagerotate-param-rotation": "За колку степени да се сврти надесно.",
+       "apihelp-imagerotate-param-tags": "Ознаки за примена врз ставката во дневникот на подигања.",
        "apihelp-imagerotate-example-simple": "Сврти ја <kbd>Податотека:Пример.png</kbd> за <kbd>90</kbd> степени.",
        "apihelp-imagerotate-example-generator": "Сврти ги сите слики во <kbd>Категорија:Некоја</kbd> за <kbd>180</kbd> степени.",
        "apihelp-import-description": "Увези страница од друго вики или од XML-податотека.\n\nИмајте на ум дека POST на HTTP мора да се изведе како подигање на податотеката (т.е. користејќи повеќеделни податоци/податоци од образец) кога ја испраќате податотеката за параметарот <var>xml</var>.",
-       "apihelp-import-param-summary": "Увези Ð¾пис.",
+       "apihelp-import-param-summary": "Ð\9eпиÑ\81 Ð½Ð° Ñ\83возоÑ\82 Ð½Ð° Ð´Ð½ÐµÐ²Ð½Ð¸Ñ\87ки Ð·Ð°пис.",
        "apihelp-import-param-xml": "Подигната XML-податотека.",
        "apihelp-import-param-interwikisource": "За меѓујазични увози: од кое вики да се увезе.",
        "apihelp-import-param-interwikipage": "За меѓујазични увози: страница за увоз.",
        "apihelp-move-example-move": "Премести го <kbd>Badtitle</kbd> на <kbd>Goodtitle</kbd>, неоставајќи пренасочување",
        "apihelp-opensearch-description": "Пребарување на викито со протоколот OpenSearch.",
        "apihelp-opensearch-param-search": "Низа за пребарување.",
-       "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\80езÑ\83лÑ\82аÑ\82и за прикажување.",
+       "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\81Ñ\82авки за прикажување.",
        "apihelp-opensearch-param-namespace": "Именски простори за пребарување.",
        "apihelp-opensearch-param-suggest": "Не прави ништо ако <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> е неточно.",
-       "apihelp-opensearch-param-redirects": "Ð\9aако Ð´Ð° Ñ\81е Ñ\80абоÑ\82и Ñ\81о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aа:\n;return: Ð\94аÑ\98 Ð³Ð¾ Ñ\81амоÑ\82о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе.\n;resolve: Ð\94аÑ\98 Ñ\98а Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а. Ð\9cоже Ð´Ð° Ð´Ð°Ð´Ðµ Ð¿Ð¾Ð¼Ð°Ð»ÐºÑ\83 Ð¾Ð´ $1limit Ñ\80езÑ\83лÑ\82аÑ\82и.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
+       "apihelp-opensearch-param-redirects": "Ð\9aако Ð´Ð° Ñ\81е Ñ\80абоÑ\82и Ñ\81о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aа:\n;return: Ð\94аÑ\98 Ð³Ð¾ Ñ\81амоÑ\82о Ð¿Ñ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе.\n;resolve: Ð\94аÑ\98 Ñ\98а Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а. Ð\9cоже Ð´Ð° Ð´Ð°Ð´Ðµ Ð¿Ð¾Ð¼Ð°Ð»ÐºÑ\83 Ð¾Ð´ $1limit Ñ\81Ñ\82авки.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
        "apihelp-opensearch-param-format": "Формат на изводот.",
        "apihelp-opensearch-example-te": "Најди страници што почнуваат со <kbd>Те</kbd>.",
        "apihelp-options-description": "Смени ги нагодувањата на тековниот корисник.\n\nМожат да се зададат само можностите заведени во јадрото или во едно од воспоставените додатоци, или пак можности со клуч кој ја има претставката <code>userjs-</code> (предвиден за употреба од кориснички скрипти).",
        "apihelp-query+revisions-example-first5-user": "Дај ги првите 5 преработки на <kbd>Главна страница</kbd> кои се направени од корисникот „зададен од МедијаВики“ (<kbd>MediaWiki default</kbd>)",
        "apihelp-query+search-example-simple": "Побарај <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Побарај го <kbd>meaning</kbd> по текстовите.",
-       "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во резултатите од пребарувањето на <kbd>meaning</kbd>.",
+       "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во исходот од пребарувањето на <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Дај општи информации за мрежното место.",
        "apihelp-upload-param-filename": "Целно име на податотеката.",
        "apihelp-upload-param-comment": "Коментар при подигање. Се користи и како првичен текст на страницата за нови податотеки ако не е укажано <var>$1text</var>.",
        "apihelp-xml-param-xslt": "Ако е укажано, ја додава именуваната страница како XSL-стилска страница. Вредноста мора да биде наслов во именскиот простор „{{ns:MediaWiki}}“ што ќе завршува со <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Ако е укажано, додава именски простор XML.",
        "apihelp-xmlfm-description": "Давај го изводот во XML-формат (подобрен испис во HTML).",
-       "api-format-title": "РезÑ\83лÑ\82аÑ\82 од Извршникот на МедијаВики",
-       "api-format-prettyprint-header": "Ова е HTML-претстава на форматот $1. HTML е добар за отстранување на грешки, но не е погоден за употреба во извршник.\n\nУкажете го параметарот <var>format</var> за да го смените изводниот формат. За да ги видите претставите на форматот $1 вон HTML, задајте <kbd>format=$2</kbd>.\n\nПовеќе информации ќе најдете на [[mw:API|целосната документација]], или пак [[Special:ApiHelp/main|помош со извршникот]].",
+       "api-format-title": "Ð\98Ñ\81Ñ\85од од Извршникот на МедијаВики",
+       "api-format-prettyprint-header": "Ова е HTML-претстава на форматот $1. HTML е добар за отстранување на грешки, но не е погоден за употреба во извршник.\n\nУкажете го параметарот <var>format</var> за да го смените изводниот формат. За да ги видите претставите на форматот $1 вон HTML, задајте <kbd>format=$2</kbd>.\n\nПовеќе информации ќе најдете на [[mw:Special:MyLanguage/API|целосната документација]], или пак [[Special:ApiHelp/main|помош со извршникот]].",
        "api-pageset-param-titles": "Список на наслови на кои ќе се работи",
        "api-pageset-param-pageids": "Список на назнаки за страници на кои ќе се работи",
        "api-pageset-param-revids": "Список на назнаки на преработки на кои ќе се работи",
        "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": "За складност, се прифаќа и шифрата што се користи за обичниот кориснички посредник.",
-       "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-disabled-in-miser-mode": "Исклучено поради [[mw:Special:MyLanguage/Manual:$wgMiserMode|скржавиот режим]].",
+       "api-help-param-limited-in-miser-mode": "<strong>Напомена:</strong> Бидејќи сте во [[mw:Special:MyLanguage/Manual:$wgMiserMode|скржав режим]], користејќи го ова може да добиете помалку од <var>$1limit</var> исходни ставки пред да продолжите; во крајни случаи може да не добиете ниедна ставка.",
        "api-help-param-direction": "Во која насока да се набројува:\n;понови:Прво најстарите. Напомена: $1start мора да биде пред $1end.\n;постари:Прво најновите (по основно). Напомена: $1start мора да биде подоцна од $1end.",
        "api-help-param-continue": "Употребете го ова за да продолжите кога има повеќе расположиви ставки.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(нема опис)</span>",
index 6506036..f2705ba 100644 (file)
@@ -9,15 +9,22 @@
                        "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]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentasjon]]\n* [[mw:Special:MyLanguage/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:Special:MyLanguage/API:Errors_and_warnings|API: Feil og advarsler]].\n\n<strong>Testing:</strong> For enkelt å teste API-kall, se [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Hvilken handling skal utføres",
        "apihelp-main-param-format": "Resultatets format.",
+       "apihelp-main-param-maxlag": "Maksimal forsinkelse kan brukes når MediaWiki er installert på et database-replikert cluster. For å unngå operasjoner som forårsaker replikasjonsforsinkelser, kan denne parameteren få klienten til å vente til replikasjonsforinkelsen er mindre enn angitt verdi. I tilfelle ytterliggående forsinkelser, blir feilkoden <samp>maxlag</samp> returnert med en melding som <samp>Venter på $host: $lag sekunders forsinkelse</samp>.<br />Se [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]] for mer informasjon.",
+       "apihelp-main-param-smaxage": "Sett <code>s-maxage</code> HTTP cache control header til dette antall sekunder. Feil blir aldri mellomlagret.",
+       "apihelp-main-param-maxage": "Set <code>max-age</code> HTTP cache control header til dette antall sekunder. Feil blir aldri mellomlagret.",
        "apihelp-main-param-assert": "Verifiser at brukeren er logget inn om satt til <kbd>user</kbd>, eller har botrettighet om satt til <kbd>bot</kbd>.",
-       "apihelp-main-param-assertuser": "Verifiser at den nåværende brukeren er den navngitte brukeren.",
+       "apihelp-main-param-assertuser": "Verifiser at den gjeldende brukeren er den navngitte brukeren.",
        "apihelp-main-param-requestid": "En gitt verdi her vil inkluderes i responsen. Kan brukes til å skille forespørsler fra hverandre.",
        "apihelp-main-param-servedby": "Inkluder navnet på tjeneren som utførte forespørselen i resultatene.",
        "apihelp-main-param-curtimestamp": "Inkluder det nåværende tidsmerket i resultatet.",
+       "apihelp-main-param-responselanginfo": "Inkluder språkene brukt for <var>uselang</var> og <var>errorlang</var> i resultatet.",
+       "apihelp-main-param-origin": "Når man aksesserer API-en som bruker en domene-kryssende AJAX-forespørsel (CORS), sett denne til det opprinnelige domenet. Denne må tas med i alle pre-flight-forespørsler, og derfor være en del av spørre-URI-en (ikke POST-kroppen).\n\nFor autentiserte forespørsler må denne stemme helt med en av de opprinnelige i <code>Origin</code>-headeren, slik at den må settes til noe a la <kbd>https://en.wikipedia.org</kbd> eller <kbd>https://meta.wikimedia.org</kbd>. Hvis denne parameteren ikke stemmer med <code>Origin</code>-headeren, returneres et 403-svar. Hvis denne parameteren stemmer med <code>Origin</code>-headeren og originalen er hvitlistet, vil <code>Access-Control-Allow-Origin</code> og <code>Access-Control-Allow-Credentials</code>-headere bli satt.\n\nFor ikke-autentiserte forepørsler, spesifiser <kbd>*</kbd>. Denne vil gjøre at <code>Access-Control-Allow-Origin</code>-headeren blir satt, men <code>Access-Control-Allow-Credentials</code> blir <code>false</code> og alle bruerspesifikke data blir begrenset.",
        "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-main-param-errorformat": "Formater som kan brukes for advarsels- og feiltekster.\n; plaintext: Wikitext der HTML-tagger er fjernet og elementer byttet ut.\n; wikitext: Ubehandlet wikitext.\n; html: HTML.\n; raw: Meldingsnøkler og -parametre.\n; none: Ingen tekst, bare feilkoder.\n; bc: Format brukt før MediaWiki 1.29. <var>errorlang</var> og <var>errorsuselocal</var> ses bort fra.",
+       "apihelp-main-param-errorsuselocal": "Hvis gitt, vil feiltekster bruke lokalt tilpassede meldinger fra {{ns:MediaWiki}}-navnerommet.",
        "apihelp-block-description": "Blokker en bruker.",
        "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-autoblock": "Blokker automatisk sist brukte IP-adresse og alle etterfølgende IP-adresser de prøver å logge inn fra.",
        "apihelp-block-param-noemail": "Hindre brukeren å sende e-post via wikien. (Krever rettigheten <code>blockemail</code>).",
        "apihelp-block-param-hidename": "Skjul brukernavnet fra blokkeringsloggen. (Krever rettigheten <code>hideuser</code>).",
-       "apihelp-block-param-allowusertalk": "La brukeren redigere sin egen diskusjonsside (avhenger av <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "La brukeren redigere sin egen diskusjonsside (avhenger av <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Overstyr den gamle blokkeringen om brukeren allerede er blokkert.",
        "apihelp-block-param-watchuser": "Overvåk brukerens eller IP-adressas bruker- og brukerdiskusjonssider.",
+       "apihelp-block-param-tags": "Endre taggene slik at de brukes på elementet i blokk-loggen.",
        "apihelp-block-example-ip-simple": "Blokker adressa <kbd>192.0.2.5</kbd> i tre dager med årsak <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Blokker brukeren <kbd>Vandal</kbd> på ubestemnt tid med årsak <kbd>Vandalism</kbd>, og forhindre ny kontooppretting og sending av epost.",
        "apihelp-changeauthenticationdata-description": "Endre autentiseringsdata for den nåværende brukeren.",
-       "apihelp-changeauthenticationdata-example-password": "Forsøk å endre den nåværende brukerens passord til <kbd>ExamplePassword</kbd>.",
+       "apihelp-changeauthenticationdata-example-password": "Forsøk å endre den gjeldende brukerens passord til <kbd>ExamplePassword</kbd>.",
        "apihelp-checktoken-description": "Sjekk gyldigheten til et tegn fra <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Type tegn som testes.",
        "apihelp-checktoken-param-token": "Tegn å teste.",
        "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-filerevert-description": "Tilbakestill en fil til en gammel versjon.",
+       "apihelp-filerevert-param-filename": "Målfilnavn, uten prefikset File:.",
+       "apihelp-filerevert-param-comment": "Opplastingskommentar.",
+       "apihelp-filerevert-example-revert": "Tilbakestiller <kbd>Wiki.png</kbd> til versjonen fra <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-help-description": "Vis hjelp for de gitte modulene.",
+       "apihelp-help-param-modules": "Moduler det skal vises hjelp for (verdiene til <var>action</var>- og <var>format</var>-parameterne, eller <kbd>main</kbd>). Kan angi undermoduler med en <kbd>+</kbd>.",
+       "apihelp-help-param-submodules": "Inkluder hjelp for undermoduler av den navngitte modulen.",
+       "apihelp-help-param-recursivesubmodules": "Inkluder hjelp for undermoduler rekursivt.",
+       "apihelp-help-param-helpformat": "Format for hjelperesultatet.",
+       "apihelp-help-param-wrap": "Omgi resultatet i en standard API-responsstruktur.",
        "apihelp-help-param-toc": "Inkluder en innholdsfortegnelse i HTML-utdataen.",
        "apihelp-help-example-main": "Hjelp for hovedmodulen.",
+       "apihelp-help-example-submodules": "Hjelp for <kbd>action=query</kbd> og alle dens undermoduler.",
        "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-imagerotate-param-rotation": "Grader bildet skal roteres med klokka.",
+       "apihelp-imagerotate-param-tags": "Tagger som skal legges til oppslaget i opplastingsloggen.",
+       "apihelp-imagerotate-example-simple": "Roter <kbd>File:Example.png</kbd> <kbd>90</kbd> grader.",
+       "apihelp-imagerotate-example-generator": "Roter alle bilder i <kbd>Category:Flip</kbd> <kbd>180</kbd> grader.",
+       "apihelp-import-description": "Importer en side fra en annen wiki eller fra en XML-fil.\n\nMerk at HTTP POST må gjøres som filopplasting (altså med bruk av multipart/form-data) når man sender en fil for parameteren <var>xml</var>.",
        "apihelp-import-param-summary": "Sammendrag for importering av loggelement.",
        "apihelp-import-param-xml": "Opplastet XML-fil.",
+       "apihelp-import-param-interwikisource": "For interwikiimport: wiki det skal importeres fra.",
+       "apihelp-import-param-interwikipage": "For interwikiimport: side som skal importeres.",
+       "apihelp-import-param-fullhistory": "For interwikiimport: importer hele historikken, ikke bare den nåværende versjonen.",
+       "apihelp-import-param-templates": "For interwikiimport: importer alle inkluderte maler i tillegg.",
+       "apihelp-import-param-namespace": "Importer til dette navnerommet: Kan ikke brukes sammen med <var>$1rootpage</var>.",
+       "apihelp-import-param-rootpage": "Importer som underside av denne siden. Kan ikke brukes sammen med <var>$1namespace</var>.",
+       "apihelp-import-param-tags": "Endringstagger som skal klistres på oppføringen i importloggen og nullrevisjonen til de importerte sidene.",
+       "apihelp-import-example-import": "Importer [[meta:Help:ParserFunctions]] til navnerom 100 med full historikk.",
        "apihelp-login-param-name": "Brukernavn.",
        "apihelp-login-param-password": "Passord.",
        "apihelp-login-param-domain": "Domene (valgfritt).",
+       "apihelp-login-example-gettoken": "Henter innloggingstegn.",
        "apihelp-login-example-login": "Logg inn.",
        "apihelp-logout-description": "Logg ut og fjern sesjonsdata.",
        "apihelp-logout-example-logout": "Logg ut den aktuelle brukeren.",
+       "apihelp-managetags-example-delete": "Slett taggen <kbd>vandlaism</kbd> med årsaken <kbd>Misspelt</kbd>",
+       "apihelp-managetags-example-activate": "Aktiver taggen <kbd>spam</kbd> med årsak <kbd>For use in edit patrolling</kbd>",
+       "apihelp-managetags-example-deactivate": "Deaktiver taggen med navn <kbd>spam</kbd> med årsak <kbd>No longer required</kbd>",
+       "apihelp-mergehistory-description": "Flett sidehistorikker.",
+       "apihelp-mergehistory-param-from": "Tittelen på siden historikken skal flettes fra. Kan ikke brukes sammen med <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "Side-ID-en til siden historikken skal flettes fra. Kan ikke brukes sammen med <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "Tittelen på siden historikken skal flettes til. Kan ikke brukes sammen med <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "Side-ID-en til siden historikken skal flettes til. Kan ikke brukes sammen med <var>$1to</var>.",
+       "apihelp-mergehistory-param-reason": "Årsak for fletting av historikk.",
+       "apihelp-mergehistory-example-merge": "Flett hele historikken til <kbd>Oldpage</kbd> inn i <kbd>Newpage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "Flett siderevisjonene av <kbd>Oldpage</kbd> til og med <kbd>2015-12-31T04:37:41Z</kbd> inn i <kbd>Newpage</kbd>.",
        "apihelp-move-description": "Flytt en side.",
+       "apihelp-move-param-from": "Tittelen på siden det skal endres navn på. Kan ikke brukes sammen med <var>$1fromid</var>.",
+       "apihelp-move-param-fromid": "Side-ID til siden det skal endres navn på. Kan ikke brukes sammen med <var>$1from</var>.",
+       "apihelp-move-param-to": "Tittelen siden skal endre navn til.",
+       "apihelp-move-param-reason": "Årsak for navneendring.",
+       "apihelp-move-param-movetalk": "Bytt navn på diskusjonssiden om den finnes.",
+       "apihelp-move-param-movesubpages": "Bytt navn på undersider, om mulig.",
+       "apihelp-move-param-noredirect": "Ikke opprett en omdirigering.",
+       "apihelp-move-param-watch": "Legg til siden og omdirigeringen i den gjeldende brukerens overvåkningsliste.",
+       "apihelp-move-param-unwatch": "Fjern siden og omdirigeringen fra den gjeldende brukerens overvåkningsliste.",
+       "apihelp-opensearch-param-search": "Søkestreng.",
+       "apihelp-opensearch-param-limit": "Maksimalt antall resultater som skal returneres.",
+       "apihelp-opensearch-param-namespace": "Navnerom det skal søkes i.",
+       "apihelp-opensearch-param-suggest": "Gjør ingenting om <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> er falsk.",
+       "apihelp-opensearch-param-format": "Resultatets format.",
+       "apihelp-opensearch-example-te": "Finn sider som begynner på <kbd>Te</kbd>.",
+       "apihelp-options-param-reset": "Tilbakestiller innstillingene til sidestandarden.",
+       "apihelp-options-example-reset": "Tilbakestill alle innstillinger.",
+       "apihelp-options-example-change": "Endre innstillinger for <kbd>skin</kbd> og <kbd>hideminor</kbd>.",
+       "apihelp-options-example-complex": "Tilbakestill alle innstillinger, og sett så <kbd>skin</kbd> og <kbd>nickname</kbd>.",
+       "apihelp-paraminfo-description": "Hent informasjon om API-moduler.",
+       "apihelp-paraminfo-param-helpformat": "Format for hjelpestrenger.",
        "apihelp-json-description": "Resultatdata i JSON-format.",
        "apihelp-none-description": "Ingen resultat.",
        "api-help-flag-readrights": "Denne modulen krever lesetilgang.",
        "api-help-param-deprecated": "Utgått.",
        "api-help-param-required": "Denne parameteren er påkrevd.",
        "apierror-multival-only-one": "Bare én verdi er tillatt for parameteret <var>$1</var>.",
+       "apierror-mustbeloggedin": "Du må være logget inn for å $1.",
        "apierror-permissiondenied-generic": "Tilgang nektet.",
        "apiwarn-validationfailed": "Bekreftelsesfeil <kbd>$1</kbd>: $2"
 }
index 71dcdfd..c4e7f89 100644 (file)
                        "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentatie]]\n* [[mw:Special:MyLanguage/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:Special:MyLanguage/API:Errors_and_warnings|API: Foutmeldingen en waarschuwingen]] voor meer informatie.\n\n<strong>Testen:</strong> u kunt [[Special:ApiSandbox|eenvoudig API-verzoeken testen]].",
        "apihelp-main-param-action": "Welke handeling uit te voeren.",
        "apihelp-main-param-format": "De opmaak van de uitvoer.",
-       "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode <samp>maxlag</samp> teruggegeven met een bericht als <samp>Waiting for $host: $lag seconds lagged</samp>.<br />Zie [[mw:Manual:Maxlag_parameter|Handboek: Maxlag parameter]] voor mee informatie.",
+       "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode <samp>maxlag</samp> teruggegeven met een bericht als <samp>Waiting for $host: $lag seconds lagged</samp>.<br />Zie [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Handleiding:Maxlag parameter]] voor meer informatie.",
        "apihelp-main-param-smaxage": "Stelt de <code>s-maxage</code> HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
        "apihelp-main-param-maxage": "Stelt de <code>max-age</code> HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
        "apihelp-main-param-assert": "Controleer of de gebruiker is aangemeld als <kbd>user</kbd> is meegegeven, en of de gebruiker het robotgebruikersrecht heeft als <kbd>bot</kbd> is meegegeven.",
+       "apihelp-main-param-assertuser": "Bevestig dat de huidige gebruiker de genoemde gebruiker is.",
        "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.",
@@ -41,7 +42,7 @@
        "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-noemail": "Gebruiker weerhouden van het sturen van e-mail. (Vereist het <code>blockemail</code> recht).",
        "apihelp-block-param-hidename": "Verberg de gebruikersnaam uit het blokkeerlogboek. (Vereist het <code>hideuser</code> recht).",
-       "apihelp-block-param-allowusertalk": "De gebruiker toestaan om hun eigen overlegpagina te bewerken (afhankelijk van <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "De gebruiker toestaan om hun eigen overlegpagina te bewerken (afhankelijk van <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "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-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-days": "Aantal dagen om de resultaten tot te beperken.",
        "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-purge-param-forcelinkupdate": "Werk de koppelingstabellen bij.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Werk de koppelingentabel bij, en werk de koppelingstabellen bij voor alle pagina's die gebruik maken van deze pagina als sjabloon.",
        "apihelp-query+allcategories-param-dir": "Richting om in te sorteren.",
+       "apihelp-query+allcategories-param-limit": "Hoeveel categorieën te tonen.",
        "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.",
        "api-help-param-deprecated": "Verouderd.",
        "api-help-datatypes-header": "Gegevenstypen",
        "api-help-param-default": "Standaard: $1",
+       "api-help-examples": "{{PLURAL:$1|Voorbeeld|Voorbeelden}}:",
        "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.",
index 3aebf9a..6bdaaeb 100644 (file)
                        "Woytecr"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentacja]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista dyskusyjna]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Ogłoszenia dotyczące API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Błędy i propozycje]\n</div>\n<strong>Stan:</strong> Wszystkie funkcje opisane na tej stronie powinny działać, ale API nadal jest aktywnie rozwijane i mogą się zmienić w dowolnym czasie. Subskrybuj [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ listę dyskusyjną mediawiki-api-announce], aby móc na bieżąco dowiadywać się o aktualizacjach.\n\n<strong>Błędne żądania:</strong> Gdy zostanie wysłane błędne żądanie do API, zostanie wysłany w odpowiedzi nagłówek HTTP z kluczem \"MediaWiki-API-Error\" i zarówno jego wartość jak i wartość kodu błędu wysłanego w odpowiedzi będą miały taką samą wartość. Aby uzyskać więcej informacji, zobacz [[mw:API:Errors_and_warnings|API: Błędy i ostrzeżenia]].\n\n<strong>Testowanie:</strong> Aby łatwo testować żądania API, zobacz [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentacja]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista dyskusyjna]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Ogłoszenia dotyczące API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Błędy i propozycje]\n</div>\n<strong>Stan:</strong> Wszystkie funkcje opisane na tej stronie powinny działać, ale API nadal jest aktywnie rozwijane i mogą się zmienić w dowolnym czasie. Subskrybuj [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ listę dyskusyjną mediawiki-api-announce], aby móc na bieżąco dowiadywać się o aktualizacjach.\n\n<strong>Błędne żądania:</strong> Gdy zostanie wysłane błędne żądanie do API, zostanie wysłany w odpowiedzi nagłówek HTTP z kluczem \"MediaWiki-API-Error\" i zarówno jego wartość jak i wartość kodu błędu wysłanego w odpowiedzi będą miały taką samą wartość. Aby uzyskać więcej informacji, zobacz [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Błędy i ostrzeżenia]].\n\n<strong>Testowanie:</strong> Aby łatwo testować żądania API, zobacz [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Wybierz akcję do wykonania.",
        "apihelp-main-param-format": "Format danych wyjściowych.",
-       "apihelp-main-param-maxlag": "Maksymalne opóźnienie mogą być używane kiedy MediaWiki jest zainstalowana w klastrze zreplikowanej bazy danych. By zapisać działania powodujące większe opóźnienie replikacji, ten parametr może wymusić czekanie u klienta, dopóki opóźnienie replikacji jest mniejsze niż określona wartość. W przypadku nadmiernego opóźnienia, kod błędu <samp>maxlag</samp> jest zwracany z wiadomością jak <samp>Oczekiwanie na $host: $lag sekund opóźnienia</samp>.<br />Zobacz [[mw:Manual:Maxlag_parameter|Podręcznik:Parametr Maxlag]] by uzyskać więcej informacji.",
+       "apihelp-main-param-maxlag": "Maksymalne opóźnienie mogą być używane kiedy MediaWiki jest zainstalowana w klastrze zreplikowanej bazy danych. By zapisać działania powodujące większe opóźnienie replikacji, ten parametr może wymusić czekanie u klienta, dopóki opóźnienie replikacji jest mniejsze niż określona wartość. W przypadku nadmiernego opóźnienia, kod błędu <samp>maxlag</samp> jest zwracany z wiadomością jak <samp>Oczekiwanie na $host: $lag sekund opóźnienia</samp>.<br />Zobacz [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Podręcznik:Parametr Maxlag]] by uzyskać więcej informacji.",
        "apihelp-main-param-smaxage": "Ustaw nagłówek HTTP kontrolujący pamięć podręczną <code>s-maxage</code> na taką ilość sekund. Błędy nie będą nigdy przechowywane w pamięci podręcznej.",
        "apihelp-main-param-maxage": "Ustaw nagłówek HTTP kontrolujący pamięć podręczną <code>maxage</code> na taką ilość sekund. Błędy nie będą nigdy przechowywane w pamięci podręcznej.",
        "apihelp-main-param-assert": "Zweryfikuj, czy użytkownik jest zalogowany, jeżeli wybrano <kbd>user</kbd>, lub czy ma uprawnienia bota, jeżeli wybrano <kbd>bot</kbd>.",
        "apihelp-block-param-nocreate": "Zapobiegnij utworzeniu konta.",
        "apihelp-block-param-autoblock": "Zablokuj ostatni adres IP tego użytkownika i automatycznie wszystkie kolejne, z których będzie się logował.",
        "apihelp-block-param-noemail": "Uniemożliwia użytkownikowi wysyłanie wiadomości e-mail za pośrednictwem interfejsu wiki. (Wymagane uprawnienie <code>blockemail</code>).",
-       "apihelp-block-param-hidename": "Ukryj nazwę użytkownika z rejestru blokad. (Wymagane uprawnienia <code>hideuser</code>)",
-       "apihelp-block-param-allowusertalk": "Pozwala użytkownikowi edytować własną stronę dyskusji (zależy od <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-hidename": "Ukryj nazwę użytkownika z rejestru blokad. (Wymagane uprawnienie <code>hideuser</code>)",
+       "apihelp-block-param-allowusertalk": "Pozwala użytkownikowi edytować własną stronę dyskusji (zależy od <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Jeżeli ten użytkownik jest już zablokowany, nadpisz blokadę.",
-       "apihelp-block-param-watchuser": "Obserwuj stronę użytkownika i jego IP oraz ich strony dyskusji.",
+       "apihelp-block-param-watchuser": "Obserwuj stronę użytkownika lub IP oraz ich strony dyskusji.",
        "apihelp-block-example-ip-simple": "Zablokuj IP <kbd>192.0.2.5</kbd> na 3 dni z powodem <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Zablokuj użytkownika <kbd>Vandal</kbd> na zawsze z powodem <kbd>Vandalism</kbd> i uniemożliw utworzenie nowego konta oraz wysyłanie emaili.",
        "apihelp-changeauthenticationdata-description": "Zmień dane logowania bieżącego użytkownika.",
        "apihelp-compare-param-torev": "Druga wersja do porównania.",
        "apihelp-createaccount-description": "Utwórz nowe konto.",
        "apihelp-createaccount-param-name": "Nazwa użytkownika",
-       "apihelp-createaccount-param-password": "Hasło (ignorowane jeśli <var>$1mailpassword</var> jest ustawione).",
+       "apihelp-createaccount-param-password": "Hasło (ignorowane jeśli ustawiono <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Domena uwierzytelniania zewnętrznego (opcjonalnie).",
        "apihelp-createaccount-param-token": "Token tworzenia konta uzyskany w pierwszym zapytaniu.",
        "apihelp-createaccount-param-email": "Adres email użytkownika (opcjonalne).",
        "apihelp-createaccount-param-realname": "Prawdziwe imię i nazwisko użytkownika (opcjonalne).",
-       "apihelp-createaccount-param-reason": "Opcjionalny powód tworzenia konta (aby został umieszczony w logu).",
+       "apihelp-createaccount-param-reason": "Opcjonalny powód tworzenia konta, który zostanie umieszczony w rejestrze.",
        "apihelp-createaccount-example-pass": "Utwórz użytkownika <kbd>testuser</kbd> z hasłem <kbd>test123</kbd>.",
        "apihelp-createaccount-example-mail": "Utwórz użytkownika <kbd>testmailuser</kbd> i wyślij losowo wygenerowane hasło na emaila.",
        "apihelp-delete-description": "Usuń stronę.",
-       "apihelp-delete-param-reason": "Powód usuwania. Jeśli pozostaiwsz to pole puste, zostanie on wygenerowany automatycznie.",
+       "apihelp-delete-param-reason": "Powód usuwania. Jeśli pozostawisz to pole puste, zostanie użyty powód wygenerowany automatycznie.",
        "apihelp-delete-param-watch": "Dodaj stronę do obecnej listy obserwowanych.",
        "apihelp-delete-param-unwatch": "Usuń stronę z obecnej listy obserwowanych.",
        "apihelp-delete-example-simple": "Usuń <kbd>Main Page</kbd>.",
@@ -88,7 +88,7 @@
        "apihelp-edit-param-basetimestamp": "Czas wersji, która jest edytowana. Służy do wykrywania konfliktów edycji. Można pobrać poprzez [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "Czas rozpoczęcia procesu edycji. Służy do wykrywania konfliktów edycji. Odpowiednia wartość może być pobrana za pomocą <var>[[Special:ApiHelp/main|curtimestamp]]</var> podczas rozpoczynania procesu edycji (np. podczas ładowania zawartości strony do edycji).",
        "apihelp-edit-param-recreate": "Ignoruj błędy o usunięciu strony w międzyczasie.",
-       "apihelp-edit-param-createonly": "Nie edytuj strony, jesli już istnieje.",
+       "apihelp-edit-param-createonly": "Nie edytuj strony, jeśli już istnieje.",
        "apihelp-edit-param-nocreate": "Zwróć błąd, jeśli strona nie istnieje.",
        "apihelp-edit-param-watch": "Dodaj stronę do listy obserwowanych bieżącego użytkownika.",
        "apihelp-edit-param-unwatch": "Usuń stronę z listy obserwowanych bieżącego użytkownika.",
        "apihelp-edit-example-edit": "Edytuj stronę.",
        "apihelp-edit-example-prepend": "Dopisz <kbd>_&#95;NOTOC_&#95;</kbd> na początku strony.",
        "apihelp-emailuser-description": "Wyślij e‐mail do użytkownika.",
-       "apihelp-emailuser-param-target": "Użytkownik, do którego wysyłany jest e-mail.",
+       "apihelp-emailuser-param-target": "Użytkownik, do którego wysłać e-mail.",
        "apihelp-emailuser-param-subject": "Nagłówek tematu.",
        "apihelp-emailuser-param-text": "Treść emaila.",
        "apihelp-emailuser-param-ccme": "Wyślij kopię wiadomości do mnie.",
        "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-expandtemplates-paramvalue-prop-wikitext": "Rozwinięty wikitekst.",
        "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-imagerotate-example-generator": "Obróć wszystkie obrazki w <kbd>Kategorii:Flip</kbd> o <kbd>180</kbd> stopni.",
        "apihelp-import-param-summary": "Podsumowanie importu rekordów dziennika.",
        "apihelp-import-param-xml": "Przesłany plik XML.",
-       "apihelp-import-param-interwikisource": "Dla importów mediawiki: źródłowa wiki.",
+       "apihelp-import-param-interwikisource": "Dla importów interwiki: wiki, z której importować.",
        "apihelp-import-param-interwikipage": "Dla importów interwiki: strona do importu.",
        "apihelp-import-param-fullhistory": "Dla importów interwiki: importuj całą historię, a nie tylko obecną wersję.",
-       "apihelp-import-param-templates": "Dla importów mediawiki: importuj też wszystkie użyte szablony.",
+       "apihelp-import-param-templates": "Dla importów interwiki: importuj też wszystkie użyte szablony.",
        "apihelp-import-param-namespace": "Importuj do tej przestrzeni nazw. Nie może być użyte razem z <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importuj jako podstronę tej strony. Nie może być użyte razem z <var>$1namespace</var>.",
        "apihelp-login-param-name": "Nazwa użytkownika.",
        "apihelp-opensearch-param-search": "Wyszukaj tekst.",
        "apihelp-opensearch-param-limit": "Maksymalna liczba zwracanych wyników.",
        "apihelp-opensearch-param-namespace": "Przestrzenie nazw do przeszukania.",
-       "apihelp-opensearch-param-suggest": "Nie działa jeżeli <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> ustawiono na false.",
+       "apihelp-opensearch-param-suggest": "Nic nie robi, jeżeli <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> ustawiono na false.",
        "apihelp-opensearch-param-redirects": "Jak obsługiwać przekierowania:\n;return:Zwróć samo przekierowanie.\n;resolve:Zwróć stronę docelową. Może zwrócić mniej niż wyników określonych w $1limit.\nZ powodów historycznych, domyślnie jest to \"return\" dla $1format=json, a \"resolve\" dla innych formatów.",
        "apihelp-opensearch-param-format": "Format danych wyjściowych.",
        "apihelp-opensearch-param-warningsaserror": "Jeżeli pojawią się ostrzeżenia związane z <kbd>format=json</kbd>, zwróć błąd API zamiast ignorowania ich.",
        "apihelp-options-example-complex": "Zresetuj wszystkie preferencje, a następnie ustaw <kbd>skin</kbd> i <kbd>nickname</kbd>.",
        "apihelp-paraminfo-description": "Zdobądź informacje o modułach API.",
        "apihelp-paraminfo-param-modules": "Lista nazw modułów (wartości parametrów <var>action</var> i <var>format</var> lub <kbd>main</kbd>). Można określić podmoduły za pomocą <kbd>+</kbd> lub wszystkie podmoduły, wpisując <kbd>+*</kbd>, lub wszystkie podmoduły rekursywnie <kbd>+**</kbd>.",
-       "apihelp-paraminfo-param-helpformat": "Format tekstów pomocnicznych.",
+       "apihelp-paraminfo-param-helpformat": "Format tekstów pomocy.",
        "apihelp-paraminfo-param-querymodules": "Lista nazw modułów zapytań (wartość parametrów <var>prop</var>, <var>meta</var> lub <var>list</var>). Użyj <kbd>$1modules=query+foo</kbd> zamiast <kbd>$1querymodules=foo</kbd>.",
-       "apihelp-parse-param-summary": "Powód do analizy.",
+       "apihelp-parse-param-summary": "Powód do sparsowania.",
        "apihelp-parse-param-prop": "Jakie porcje informacji otrzymać:",
        "apihelp-parse-paramvalue-prop-text": "Przetworzony tekst z wikitekstu.",
        "apihelp-parse-paramvalue-prop-langlinks": "Linki językowe z przetworzonego wikitekstu.",
        "apihelp-parse-paramvalue-prop-externallinks": "Linki zewnętrzne z przetworzonego wikitekstu.",
        "apihelp-parse-paramvalue-prop-sections": "Sekcje z przetworzonego wikitekstu.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Dodaje tytuł parsowanego wikitekstu.",
-       "apihelp-parse-paramvalue-prop-wikitext": "Zwróć oryginalny wikitext, który został przeanalizowany.",
-       "apihelp-parse-param-preview": "Analizuj w trybie podglądu.",
+       "apihelp-parse-paramvalue-prop-wikitext": "Zwróć oryginalny wikitekst, który został sparsowany.",
+       "apihelp-parse-param-preview": "Parsuj w trybie podglądu.",
        "apihelp-parse-param-disabletoc": "Pomiń spis treści na wyjściu.",
        "apihelp-parse-example-page": "Przeanalizuj stronę.",
-       "apihelp-parse-example-text": "Analizuj wikitext.",
-       "apihelp-parse-example-summary": "Analizuj powód.",
+       "apihelp-parse-example-text": "Parsuj wikitekst.",
+       "apihelp-parse-example-summary": "Parsuj powód.",
        "apihelp-patrol-description": "Sprawdź stronę lub edycję.",
-       "apihelp-patrol-param-rcid": "ID ostatnich zmian do patrolowania.",
+       "apihelp-patrol-param-rcid": "ID z ostatnich zmian do oznaczenia jako sprawdzone.",
        "apihelp-patrol-param-revid": "Numer edycji do sprawdzenia.",
        "apihelp-patrol-example-rcid": "Sprawdź ostatnią zmianę.",
        "apihelp-patrol-example-revid": "Sprawdź edycje.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Uaktualnij tabele linków włącznie z linkami dotyczącymi każdej strony wykorzystywanej jako szablon na tej stronie.",
        "apihelp-purge-example-simple": "Wyczyść strony <kbd>Main Page</kbd> i <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Przeczyść pierwsze 10 stron w przestrzeni głównej.",
-       "apihelp-query+allcategories-description": "Emuluj wszystkie kategorie.",
+       "apihelp-query+allcategories-description": "Wymień wszystkie kategorie.",
        "apihelp-query+allcategories-param-from": "Kategoria, od której rozpocząć wyliczanie.",
        "apihelp-query+allcategories-param-to": "Kategoria, na której zakończyć wyliczanie.",
        "apihelp-query+allcategories-param-dir": "Kierunek sortowania.",
-       "apihelp-query+allcategories-param-limit": "Liczba kategorii do zwórcenia.",
+       "apihelp-query+allcategories-param-limit": "Liczba kategorii do zwcenia.",
        "apihelp-query+allcategories-param-prop": "Jakie właściwości otrzymać:",
        "apihelp-query+allcategories-paramvalue-prop-size": "Dodaje liczbę stron w kategorii.",
        "apihelp-query+allcategories-paramvalue-prop-hidden": "Oznacza kategorie ukryte za pomocą <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Nie może być używane z <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-param-start": "Znacznik czasu, od którego rozpocząć wyliczanie.",
        "apihelp-query+alldeletedrevisions-param-end": "Znacznik czasu, na którym zakończyć wyliczanie.",
-       "apihelp-query+alldeletedrevisions-param-from": "Zacznij nasłuchiwanie na tym tytule.",
-       "apihelp-query+alldeletedrevisions-param-to": "Skończ nasłuchiwanie na tym tytule.",
+       "apihelp-query+alldeletedrevisions-param-from": "Zacznij listowanie na tym tytule.",
+       "apihelp-query+alldeletedrevisions-param-to": "Skończ listowanie na tym tytule.",
        "apihelp-query+alldeletedrevisions-param-prefix": "Szukaj tytułów stron zaczynających się na tę wartość.",
        "apihelp-query+alldeletedrevisions-param-tag": "Pokazuj tylko zmiany oznaczone tym znacznikiem.",
        "apihelp-query+alldeletedrevisions-param-user": "Pokazuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+alllinks-param-to": "Nazwa linku, na którym zakończyć wyliczanie.",
        "apihelp-query+alllinks-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+alllinks-paramvalue-prop-title": "Dodaje tytuł linku.",
-       "apihelp-query+alllinks-param-namespace": "Przestrzeń nazw do emulacji.",
+       "apihelp-query+alllinks-param-namespace": "Przestrzeń nazw, z której wymieniać.",
        "apihelp-query+alllinks-param-limit": "Łączna liczba obiektów do zwrócenia.",
        "apihelp-query+alllinks-example-unique": "Lista unikatowych tytułów plików.",
        "apihelp-query+allmessages-param-prop": "Właściwości do odczytu.",
        "apihelp-query+allredirects-param-to": "Nazwa przekierowania, na którym zakończyć wyliczanie.",
        "apihelp-query+allredirects-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+allredirects-paramvalue-prop-title": "Dodaje tytuł przekierowania.",
-       "apihelp-query+allredirects-param-namespace": "Przestrzeń nazw do emulacji.",
+       "apihelp-query+allredirects-param-namespace": "Przestrzeń nazw, z której wymieniać.",
        "apihelp-query+allredirects-param-limit": "Łączna liczba obiektów do zwrócenia.",
        "apihelp-query+allrevisions-description": "Wyświetl wszystkie wersje.",
        "apihelp-query+allrevisions-param-start": "Znacznik czasu, od którego rozpocząć wyliczanie.",
        "apihelp-query+mystashedfiles-param-limit": "Liczba plików do pobrania.",
        "apihelp-query+alltransclusions-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+alltransclusions-paramvalue-prop-title": "Dodaje tytuł osadzenia.",
-       "apihelp-query+alltransclusions-param-namespace": "Przestrzeń nazw do emulacji.",
+       "apihelp-query+alltransclusions-param-namespace": "Przestrzeń nazw, z której wymieniać.",
        "apihelp-query+alltransclusions-param-limit": "Łączna liczba elementów do zwrócenia.",
        "apihelp-query+allusers-param-from": "Nazwa użytkownika, od którego rozpocząć wyliczanie.",
        "apihelp-query+allusers-param-to": "Nazwa użytkownika, na którym zakończyć wyliczanie.",
        "apihelp-query+allusers-param-activeusers": "Wyświetl tylko użytkowników, aktywnych w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}.",
        "apihelp-query+allusers-example-Y": "Wyświetl użytkowników zaczynających się na <kbd>Y</kbd>.",
        "apihelp-query+backlinks-description": "Znajdź wszystkie strony, które linkują do danej strony.",
-       "apihelp-query+backlinks-param-namespace": "Przestrzeń nazw do emulacji.",
+       "apihelp-query+backlinks-param-namespace": "Przestrzeń nazw, z której wymieniać.",
        "apihelp-query+backlinks-example-simple": "Pokazuj linki do <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Lista wszystkich zablokowanych użytkowników i adresów IP.",
        "apihelp-query+blocks-param-start": "Znacznik czasu, od którego rozpocząć wyliczanie.",
        "apihelp-query+categorymembers-param-limit": "Maksymalna liczba zwracanych wyników.",
        "apihelp-query+categorymembers-param-sort": "Sortowanie według właściwości.",
        "apihelp-query+categorymembers-param-dir": "W jakim kierunku sortować.",
-       "apihelp-query+deletedrevisions-param-tag": "Pokazuj tylko zmiany oznaczone tym tagiem.",
+       "apihelp-query+deletedrevisions-param-tag": "Pokazuj tylko zmiany oznaczone tym znacznikiem.",
        "apihelp-query+deletedrevisions-param-user": "Pokazuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Nie pokazuj zmian dokonanych przez tego użytkownika.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Tryb|Tryby}}: $2",
        "apihelp-query+deletedrevs-param-start": "Znacznik czasu, od którego rozpocząć wyliczanie.",
        "apihelp-query+deletedrevs-param-end": "Znacznik czasu, na którym zakończyć wyliczanie.",
-       "apihelp-query+deletedrevs-param-unique": "Liatuj tylko jedną edycję dla każdej strony.",
-       "apihelp-query+deletedrevs-param-tag": "Pokazuj tylko zmiany oznaczone tym tagiem.",
+       "apihelp-query+deletedrevs-param-unique": "Listuj tylko jedną edycję dla każdej strony.",
+       "apihelp-query+deletedrevs-param-tag": "Pokazuj tylko zmiany oznaczone tym znacznikiem.",
        "apihelp-query+deletedrevs-param-user": "Listuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+deletedrevs-param-excludeuser": "Nie listuj zmian dokonanych przez tego użytkownika.",
        "apihelp-query+deletedrevs-param-namespace": "Listuj tylko strony z tej przestrzeni nazw.",
        "apihelp-query+deletedrevs-param-limit": "Maksymalna liczba zmian do wylistowania.",
        "apihelp-query+disabled-description": "Ten moduł zapytań został wyłączony.",
-       "apihelp-query+duplicatefiles-example-generated": "Szukaj duplikatów wszystkich plików.",
-       "apihelp-query+embeddedin-param-filterredir": "Jaki filtrować przekierowania.",
+       "apihelp-query+duplicatefiles-example-generated": "Szukaj duplikatów wśród wszystkich plików.",
+       "apihelp-query+embeddedin-param-filterredir": "Jak filtrować przekierowania.",
        "apihelp-query+embeddedin-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+extlinks-param-limit": "Liczba linków do zwrócenia.",
        "apihelp-query+exturlusage-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+imageinfo-description": "Zwraca informacje o pliku i historię przesyłania.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Dodaje kanoniczny tytuł pliku.",
        "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias rozmiaru.",
-       "apihelp-query+imageinfo-paramvalue-prop-sha1": "Dodaj sumę kontrolną SHA-1 dla tego pliku.",
+       "apihelp-query+imageinfo-paramvalue-prop-sha1": "Dołączy sumę kontrolną SHA-1 dla tego pliku.",
        "apihelp-query+imageinfo-paramvalue-prop-mime": "Dodaje typ MIME pliku.",
        "apihelp-query+imageinfo-param-urlheight": "Podobne do $1urlwidth.",
        "apihelp-query+images-param-limit": "Liczba plików do zwrócenia.",
        "apihelp-query+iwbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Dodaje prefiks interwiki.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Dodaje tytuł interwiki.",
+       "apihelp-query+iwlinks-description": "Wyświetla wszystkie liki interwiki z danych stron.",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
        "apihelp-query+iwlinks-param-limit": "Łączna liczba linków interwiki do zwrócenia.",
        "apihelp-query+langbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Dodaje kod języka linku językowego.",
        "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Dodaje tytuł linku językowego.",
        "apihelp-query+langlinks-paramvalue-prop-url": "Dodaje pełny adres URL.",
+       "apihelp-query+links-description": "Zwraca wszystkie linki z danych stron.",
+       "apihelp-query+links-param-namespace": "Pokaż linki tylko w tych przestrzeniach nazw.",
        "apihelp-query+links-param-limit": "Liczba linków do zwrócenia.",
        "apihelp-query+linkshere-description": "Znajdź wszystkie strony, które linkują do danych stron.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Nazwa każdej strony.",
        "apihelp-query+linkshere-paramvalue-prop-redirect": "Oznacz, jeśli strona jest przekierowaniem.",
        "apihelp-query+linkshere-param-limit": "Liczba do zwrócenia.",
-       "apihelp-query+logevents-description": "Pobierz eventy z logu.",
+       "apihelp-query+logevents-description": "Pobierz zdarzenia z rejestru.",
        "apihelp-query+logevents-example-simple": "Lista ostatnich zarejestrowanych zdarzeń.",
+       "apihelp-query+pagepropnames-param-limit": "Maksymalna liczba zwracanych nazw.",
        "apihelp-query+pageswithprop-param-prop": "Jakie informacje dołączyć:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Doda ID strony.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Dodaje wartość właściwości strony.",
        "apihelp-query+pageswithprop-param-limit": "Maksymalna liczba zwracanych stron.",
        "apihelp-query+pageswithprop-param-dir": "W jakim kierunku sortować.",
        "apihelp-query+pageswithprop-example-generator": "Pobierz dodatkowe informacje o pierwszych 10 stronach wykorzystując <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+protectedtitles-param-namespace": "Listuj tylko strony z tych przestrzeni nazw.",
        "apihelp-query+protectedtitles-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Dodaje poziom zabezpieczeń.",
-       "apihelp-query+protectedtitles-example-simple": "Lista chronionych nagłówków",
+       "apihelp-query+protectedtitles-example-simple": "Wymień zabezpieczone tytuły.",
        "apihelp-query+querypage-param-page": "Nazwa strony specjalnej. Należy pamiętać o wielkości liter.",
        "apihelp-query+querypage-param-limit": "Liczba zwracanych wyników.",
        "apihelp-query+random-param-namespace": "Zwraca strony tylko w tych przestrzeniach nazw.",
        "apihelp-query+random-example-simple": "Zwraca dwie losowe strony z głównej przestrzeni nazw.",
        "apihelp-query+recentchanges-param-user": "Listuj tylko zmiany dokonane przez tego użytkownika.",
        "apihelp-query+recentchanges-param-excludeuser": "Nie listuj zmian dokonanych przez tego użytkownika.",
-       "apihelp-query+recentchanges-param-tag": "Pokazuj tylko zmiany oznaczone tym tagiem.",
+       "apihelp-query+recentchanges-param-tag": "Pokazuj tylko zmiany oznaczone tym znacznikiem.",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "Dodaje komentarz do edycji.",
        "apihelp-query+recentchanges-example-simple": "Lista ostatnich zmian.",
        "apihelp-query+redirects-description": "Zwraca wszystkie przekierowania do danej strony.",
        "apihelp-query+siteinfo-param-numberingroup": "Wyświetla liczbę użytkowników w grupach użytkowników.",
        "apihelp-query+siteinfo-example-simple": "Pobierz informacje o stronie.",
        "apihelp-query+stashimageinfo-param-sessionkey": "Alias dla $1filekey, dla kompatybilności wstecznej.",
-       "apihelp-query+tags-description": "Lista zmian tagów.",
-       "apihelp-query+tags-param-limit": "Maksymalna liczba tagów do wyświetlenia.",
+       "apihelp-query+tags-description": "Lista znaczników zmian.",
+       "apihelp-query+tags-param-limit": "Maksymalna liczba znaczników do wyświetlenia.",
        "apihelp-query+tags-paramvalue-prop-name": "Dodaje nazwę znacznika.",
        "apihelp-query+tags-paramvalue-prop-displayname": "Dodaje komunikat systemowy dla znacznika.",
        "apihelp-query+tags-paramvalue-prop-description": "Dodaje opis znacznika.",
        "apihelp-query+tags-paramvalue-prop-active": "Czy znacznik jest nadal stosowany.",
-       "apihelp-query+tags-example-simple": "Lista dostęnych tagów.",
+       "apihelp-query+tags-example-simple": "Wymień dostępne znaczniki.",
        "apihelp-query+templates-description": "Zwraca wszystkie strony osadzone w danych stronach.",
+       "apihelp-query+templates-param-namespace": "Pokaż szablony tylko w tych przestrzeniach nazw.",
        "apihelp-query+templates-param-limit": "Ile szablonów zwrócić?",
        "apihelp-query+transcludedin-paramvalue-prop-title": "Nazwa każdej strony.",
        "apihelp-query+transcludedin-paramvalue-prop-redirect": "Oznacz, jeśli strona jest przekierowaniem.",
        "apihelp-stashedit-param-title": "Tytuł edytowanej strony.",
        "apihelp-stashedit-param-sectiontitle": "Tytuł nowej sekcji.",
        "apihelp-stashedit-param-text": "Zawartość strony.",
+       "apihelp-stashedit-param-summary": "Opis zmian.",
        "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-upload-param-file": "Zawartość pliku.",
        "apihelp-userrights-param-user": "Nazwa użytkownika.",
        "apihelp-userrights-param-userid": "Identyfikator użytkownika.",
-       "apihelp-userrights-param-add": "Dodaj użytkownika do tych grup.",
+       "apihelp-userrights-param-add": "Dodaj użytkownika do tych grup, lub, jeżeli jest już ich członkiem, zmień czas wygaśnięcia członkostwa w tych grupach.",
        "apihelp-userrights-param-remove": "Usuń użytkownika z tych grup.",
        "apihelp-userrights-param-reason": "Powód zmiany.",
        "apihelp-validatepassword-param-password": "Hasło do walidacji.",
        "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-articleexists": "Artykuł, który próbowałeś utworzyć, już został utworzony.",
        "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-integeroutofrange-belowminimum": "Wartość <var>$1</var> nie może być mniejsza niż $2 (ustawiono $3).",
        "apierror-invalidcategory": "Wprowadzona nazwa kategorii jest nieprawidłowa.",
        "apierror-invalidlang": "Nieprawidłowy kod języka dla parametru <var>$1</var>.",
+       "apierror-invalidoldimage": "Parametr <var>oldimage</var> ma nieprawidłowy format.",
        "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>).",
        "apiwarn-invalidcategory": "„$1” nie jest kategorią.",
        "apiwarn-invalidtitle": "„$1” nie jest poprawnym tytułem.",
        "apiwarn-notfile": "„$1” nie jest plikiem.",
+       "apiwarn-toomanyvalues": "Podano zbyt wiele wartości dla parametru <var>$1</var>. Ograniczenie do $2.",
        "apiwarn-validationfailed": "Błąd walidacji dla <kbd>$1</kbd>: $2",
        "api-feed-error-title": "Błąd ($1)",
        "api-exception-trace": "$1 w $2($3)\n$4",
index c340d4a..a0d2676 100644 (file)
@@ -11,7 +11,9 @@
                        "Caçador de Palavras",
                        "LucyDiniz",
                        "Eduardo Addad de Oliveira",
-                       "Warley Felipe C."
+                       "Warley Felipe C.",
+                       "TheEduGobi",
+                       "Felipe L. Ewald"
                ]
        },
        "apihelp-main-param-action": "Qual ação executar.",
@@ -22,8 +24,9 @@
        "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-main-param-origin": "Ao acessar a API usando uma solicitação AJAX por domínio cruzado (CORS), defina isto como o domínio de origem. Isto deve estar incluso em toda solicitação ''pre-flight'', sendo portanto parte do URI da solicitação (ao invés do corpo do POST).\n\nPara solicitações autenticadas, isto deve corresponder a uma das origens no cabeçalho <code>Origin</code>, para que seja algo como <kbd>https://pt.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parâmetro não corresponder ao cabeçalho <code>Origin</code>, uma resposta 403 será retornada. Se este parâmetro corresponder ao cabeçalho <code>Origin</code> e a origem for permitida (''whitelisted''), os cabeçalhos <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serão definidos.\n\nPara solicitações não autenticadas, especifique o valor <kbd>*</kbd>. Isto fará com que o cabeçalho <code>Access-Control-Allow-Origin</code> seja definido, porém o <code>Access-Control-Allow-Credentials</code> será <code>false</code> e todos os dados específicos para usuários tornar-se-ão restritos.",
        "apihelp-block-description": "Bloquear um usuário",
-       "apihelp-block-param-user": "Nome de usuário, endereço IP ou faixa de IP para bloquear.",
+       "apihelp-block-param-user": "Nome de usuário, endereço IP ou faixa de IP para bloquear. Não pode ser usado junto com <var>$1userid</var>",
        "apihelp-block-param-reason": "Razão do bloqueio.",
        "apihelp-block-param-anononly": "Bloqueia apenas usuários anônimos (ou seja desativa edições anônimas para este endereço IP).",
        "apihelp-block-param-nocreate": "Prevenir a criação de conta.",
@@ -33,6 +36,8 @@
        "apihelp-block-param-watchuser": "Vigiar as páginas de utilizador e de discussão, do utilizador ou do endereço IP.",
        "apihelp-block-example-ip-simple": "Bloquear endereço IP <kbd>192.0.2.5</kbd> por três dias com razão <kbd>Primeira medida</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear usuário <kbd>Vandal</kbd> indefinidamente com razão <kbd>Vandalism</kbd> e o impede de criar nova conta e envio de emails.",
+       "apihelp-checktoken-param-token": "Token para testar.",
+       "apihelp-clearhasmsg-example-1": "Limpa a bandeira <code>hasmsg</code> do usuário atual.",
        "apihelp-compare-param-fromtitle": "Primeiro título para comparar.",
        "apihelp-compare-param-fromid": "Primeiro ID de página para comparar.",
        "apihelp-compare-param-fromrev": "Primeira revisão para comparar.",
@@ -60,7 +65,7 @@
        "apihelp-edit-param-text": "Conteúdo da página",
        "apihelp-edit-param-minor": "Edição menor.",
        "apihelp-edit-param-notminor": "Edição não-menor.",
-       "apihelp-edit-param-bot": "Marcar esta edição como feita por bot.",
+       "apihelp-edit-param-bot": "Marcar esta edição como uma edição de bot.",
        "apihelp-edit-param-createonly": "Não editar a página se já existir.",
        "apihelp-edit-param-nocreate": "Mostra um erro se a página não existir.",
        "apihelp-edit-param-watch": "Adiciona a página para a lista de vigiados do usuário atual.",
@@ -91,7 +96,7 @@
        "apihelp-feedcontributions-param-newonly": "Mostrar somente as edições que são criação de páginas.",
        "apihelp-feedcontributions-param-hideminor": "Ocultar edições menores.",
        "apihelp-feedcontributions-param-showsizediff": "Mostrar a diferença de tamanho entre as revisões.",
-       "apihelp-feedrecentchanges-description": "Retorna um feed de alterações recentes.",
+       "apihelp-feedrecentchanges-description": "Retorna um ''feed'' de mudanças recentes.",
        "apihelp-feedrecentchanges-param-feedformat": "O formato do feed.",
        "apihelp-feedrecentchanges-param-namespace": "Espaço nominal a partir do qual limitar resultados.",
        "apihelp-feedrecentchanges-param-invert": "Todos os espaços nominais, exceto o selecionado.",
        "apihelp-feedrecentchanges-param-hidecategorization": "Alterações de membros pertencentes à uma categoria.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por tag.",
        "apihelp-feedrecentchanges-example-simple": "Mostrar as mudanças recentes.",
-       "apihelp-feedrecentchanges-example-30days": "Mostrar as alterações recentes por 30 dias.",
+       "apihelp-feedrecentchanges-example-30days": "Mostrar as mudanças recentes por 30 dias.",
        "apihelp-feedwatchlist-description": "Retornar um feed da lista de vigiados.",
        "apihelp-feedwatchlist-param-feedformat": "O formato do feed.",
        "apihelp-feedwatchlist-param-hours": "Lista páginas modificadas dentro dessa quantia de horas a partir de agora.",
        "apihelp-move-description": "Mover uma página.",
        "apihelp-move-param-from": "Título da página para renomear. Não pode ser usado em conjunto com <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID da página a se renomear. Não pode ser usado em conjunto com <var>$1from</var>.",
+       "apihelp-move-param-reason": "Motivo para a alteração do nome.",
        "apihelp-move-param-movetalk": "Renomear a página de discussão, se existir.",
        "apihelp-move-param-movesubpages": "Renomeia subpáginas, se aplicável.",
        "apihelp-move-param-noredirect": "Não cria um redirecionamento.",
        "apihelp-protect-example-protect": "Protege uma página.",
        "apihelp-protect-example-unprotect": "Desprotege uma página definindo restrições para <kbd>all</kbd>.",
        "apihelp-protect-example-unprotect2": "Desprotege uma página ao não definir restrições.",
+       "apihelp-purge-description": "Limpe o cache para os títulos especificados.",
        "apihelp-purge-param-forcelinkupdate": "Atualiza as tabelas de links.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Atualiza a tabela de links, e atualiza as tabelas de links para qualquer página que usa essa página como um modelo.",
+       "apihelp-purge-example-simple": "Purga as páginas <kbd>Main Page</kbd> e <kbd>API</kbd>.",
+       "apihelp-purge-example-generator": "Purga as primeiras 10 páginas no namespace principal.",
        "apihelp-query-param-prop": "Quais propriedades obter para as páginas consultadas.",
        "apihelp-query-param-list": "Quais listas obter.",
        "apihelp-query-param-meta": "Quais metadados obter.",
        "apihelp-query+allfileusages-description": "Lista todas as utilizações de arquivo, incluindo os não-existentes.",
        "apihelp-query+allfileusages-param-from": "O título do arquivo a partir do qual começar a enumerar.",
        "apihelp-query+allfileusages-param-to": "O título do arquivo onde parar de enumerar.",
+       "apihelp-query+allfileusages-param-prop": "Que informações incluir:",
        "apihelp-query+allfileusages-paramvalue-prop-title": "Adiciona o título do arquivo.",
        "apihelp-query+allfileusages-param-limit": "Quantos itens retornar.",
+       "apihelp-query+allfileusages-param-dir": "A direção na qual listar.",
        "apihelp-query+allfileusages-example-unique": "Listar títulos únicos de arquivos",
        "apihelp-query+allfileusages-example-generator": "Obter as páginas contendo os arquivos",
+       "apihelp-query+allimages-description": "Enumera todas as imagens sequencialmente.",
+       "apihelp-query+allimages-param-sort": "Propriedade pela qual ordenar.",
+       "apihelp-query+allimages-param-dir": "A direção de listagem.",
        "apihelp-query+allimages-param-user": "Retorna apenas os arquivos enviados por este usuário. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1filterbots.",
        "apihelp-query+allimages-param-filterbots": "Como filtrar arquivos enviados por bots. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1user.",
        "apihelp-query+allimages-param-mime": "Quais tipos MIME pesquisar, ex.: <kbd>image/jpeg</kbd>.",
        "apihelp-query+alllinks-param-from": "O título do link a partir do qual começar a enumerar.",
        "apihelp-query+alllinks-param-to": "O título do link onde parar de enumerar.",
        "apihelp-query+alllinks-param-prefix": "Pesquisa por todos os títulos com link que começam com este valor.",
+       "apihelp-query+alllinks-param-prop": "Que informações incluir:",
        "apihelp-query+alllinks-param-namespace": "O espaço nominal a se enumerar.",
        "apihelp-query+alllinks-param-limit": "Quantos itens retornar.",
+       "apihelp-query+alllinks-param-dir": "A direção na qual listar.",
        "apihelp-query+alllinks-example-generator": "Obtém páginas contendo os links.",
        "apihelp-query+allmessages-description": "Devolver as mensagens deste site.",
        "apihelp-query+allmessages-param-prop": "Quais propriedades obter.",
        "apihelp-query+allpages-param-minsize": "Limitar a páginas com pelo menos essa quantidade de bytes.",
        "apihelp-query+allpages-param-maxsize": "Limitar a páginas com no máximo essa quantidade de bytes.",
        "apihelp-query+allpages-param-limit": "Quantas páginas retornar.",
+       "apihelp-query+allpages-param-dir": "A direção na qual listar.",
        "apihelp-query+allredirects-description": "Lista todos os redirecionamentos para um espaço nominal.",
        "apihelp-query+allredirects-param-from": "O título do redirecionamento a partir do qual começar a enumerar.",
        "apihelp-query+allredirects-param-to": "O título do redirecionamento onde parar de enumerar.",
+       "apihelp-query+allredirects-param-prop": "Que informações incluir:",
        "apihelp-query+allredirects-param-namespace": "O espaço nominal a se enumerar.",
+       "apihelp-query+allredirects-param-limit": "Quantos item a serem retornados.",
+       "apihelp-query+allredirects-param-dir": "A direção na qual listar.",
        "apihelp-query+allrevisions-description": "Listar todas as revisões.",
+       "apihelp-query+mystashedfiles-param-limit": "Quantos arquivos a serem retornados.",
+       "apihelp-query+alltransclusions-param-prop": "Que informações incluir:",
        "apihelp-query+alltransclusions-param-namespace": "O espaço nominal a se enumerar.",
        "apihelp-query+alltransclusions-param-limit": "Quantos itens retornar.",
+       "apihelp-query+alltransclusions-param-dir": "A direção na qual listar.",
+       "apihelp-query+allusers-param-prop": "Que informações incluir:",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Lista os direitos que o usuário possui.",
+       "apihelp-query+allusers-param-limit": "Quantos nomes de usuário a serem retornados.",
        "apihelp-query+backlinks-param-title": "Título a se pesquisar. Não pode ser usado em conjunto com <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-pageid": "ID da página a se pesquisar. Não pode ser usado em conjunto com <var>$1title</var>.",
        "apihelp-query+backlinks-param-namespace": "O espaço nominal a se enumerar.",
+       "apihelp-query+backlinks-param-dir": "A direção na qual listar.",
        "apihelp-query+blocks-param-ip": "Obtém todos os blocos aplicando a este IP ou intervalos CIDR, incluindo intervalos de blocos.\nNão pode ser usado em conjunto com <var>$3users</var>. Intervalos CIDR mais largos do que IPv4/$1 ou IPv6/$2 não são aceitos.",
+       "apihelp-query+blocks-param-prop": "Quais propriedades obter:",
        "apihelp-query+categories-param-limit": "Quantas categorias retornar.",
+       "apihelp-query+categories-param-dir": "A direção na qual listar.",
+       "apihelp-query+categorymembers-description": "Lista todas as páginas numa categoria específica.",
        "apihelp-query+categorymembers-param-title": "Qual categoria enumerar (obrigatório). Deve incluir o prefixo <kbd>{{ns:category}}:</kbd>. Não pode ser usado em conjunto com <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "ID da página da categoria para enumerar. Não pode ser usado em conjunto com <var>$1title</var>.",
+       "apihelp-query+categorymembers-param-prop": "Que informações incluir:",
+       "apihelp-query+categorymembers-param-dir": "Em qual sentido ordenar.",
        "apihelp-query+contributors-param-limit": "Quantas contribuições retornar.",
        "apihelp-query+duplicatefiles-param-limit": "Quantos arquivos duplicados retornar.",
+       "apihelp-query+duplicatefiles-param-dir": "A direção na qual listar.",
        "apihelp-query+embeddedin-param-title": "Título a se pesquisar. Não pode ser usado em conjunto com $1pageid.",
        "apihelp-query+embeddedin-param-pageid": "ID da página a se pesquisar. Não pode ser usado em conjunto com $1title.",
        "apihelp-query+embeddedin-param-namespace": "O espaço nominal a se enumerar.",
+       "apihelp-query+embeddedin-param-dir": "A direção na qual listar.",
        "apihelp-query+embeddedin-param-filterredir": "Como filtrar por redirecionamentos.",
        "apihelp-query+embeddedin-param-limit": "Quantas páginas retornar.",
        "apihelp-query+embeddedin-example-simple": "Mostrar páginas transcluíndo <kbd>Template:Stub</kbd>.",
        "apihelp-query+embeddedin-example-generator": "Obtém informação sobre páginas transcluindo <kbd>Template:Stub</kbd>.",
        "apihelp-query+extlinks-description": "Retorna todas as URLs externas (não interwikis) a partir das páginas de dados.",
        "apihelp-query+extlinks-param-limit": "Quantos links retornar.",
+       "apihelp-query+exturlusage-param-prop": "Que informações incluir:",
        "apihelp-query+exturlusage-param-limit": "Quantas páginas retornar.",
        "apihelp-query+filearchive-param-limit": "Quantas imagens retornar.",
+       "apihelp-query+filearchive-param-dir": "A direção na qual listar.",
+       "apihelp-query+fileusage-param-prop": "Quais propriedades obter:",
        "apihelp-query+fileusage-param-limit": "Quantos retornar.",
        "apihelp-query+imageinfo-param-limit": "Quantas revisões de arquivos retornar por arquivo.",
        "apihelp-query+images-param-limit": "Quantos arquivos retornar.",
+       "apihelp-query+images-param-dir": "",
        "apihelp-query+imageusage-param-title": "Título a se pesquisar. Não pode ser usado em conjunto com $1pageid.",
        "apihelp-query+imageusage-param-pageid": "ID da página para pesquisar. Não pode ser usado em conjunto com $1title.",
        "apihelp-query+imageusage-param-namespace": "O espaço nominal a se enumerar.",
+       "apihelp-query+imageusage-param-dir": "A direção na qual listar.",
        "apihelp-query+info-paramvalue-prop-readable": "Se o usuário pode ler esta página.",
        "apihelp-query+info-paramvalue-prop-preload": "Fornece o texto retornado por EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Fornece o modo como o título da página é exibido.",
        "apihelp-query+iwbacklinks-description": "Encontra todas as páginas que apontam para o determinado link interwiki.\n\nPode ser usado para encontrar todos os links com um prefixo, ou todos os links para um título (com um determinado prefixo). Usar nenhum parâmetro é efetivamente \"todos os links interwiki\".",
        "apihelp-query+iwbacklinks-param-prefix": "Prefixo para o interwiki.",
        "apihelp-query+iwbacklinks-param-limit": "Quantas páginas retornar.",
+       "apihelp-query+iwbacklinks-param-prop": "Quais propriedades obter:",
+       "apihelp-query+iwbacklinks-param-dir": "A direção na qual listar.",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Adiciona o URL completo.",
+       "apihelp-query+iwlinks-param-limit": "Quantos interwiki links a serem retornados.",
+       "apihelp-query+iwlinks-param-dir": "A direção na qual listar.",
        "apihelp-query+langbacklinks-param-limit": "Quantas páginas retornar.",
+       "apihelp-query+langbacklinks-param-prop": "Quais propriedades obter:",
+       "apihelp-query+langbacklinks-param-dir": "A direção na qual listar.",
        "apihelp-query+langlinks-param-limit": "Quantos links de idioma retornar.",
+       "apihelp-query+langlinks-param-dir": "A direção na qual listar.",
        "apihelp-query+links-param-limit": "Quantos links retornar.",
+       "apihelp-query+links-param-dir": "A direção na qual listar.",
+       "apihelp-query+linkshere-param-prop": "Quais propriedades obter:",
        "apihelp-query+linkshere-param-limit": "Quantos retornar.",
+       "apihelp-query+logevents-param-prop": "Quais propriedades obter:",
+       "apihelp-query+logevents-param-limit": "Quantas entradas de eventos a serem retornadas.",
        "apihelp-query+logevents-example-simple": "Listar os eventos recentes do registo.",
+       "apihelp-query+pageswithprop-param-prop": "Que informações incluir:",
+       "apihelp-query+pageswithprop-param-dir": "Em qual sentido ordenar.",
        "apihelp-query+prefixsearch-param-limit": "O número máximo a se retornar.",
        "apihelp-query+protectedtitles-param-limit": "Quantas páginas retornar.",
+       "apihelp-query+protectedtitles-param-prop": "Quais propriedades obter:",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Adicionar o nível de proteção",
        "apihelp-query+protectedtitles-example-simple": "Listar títulos protegidos",
        "apihelp-query+querypage-param-limit": "O número máximo a se retornar.",
+       "apihelp-query+random-param-limit": "Limita quantas páginas aleatórias serão retornadas.",
        "apihelp-query+random-param-filterredir": "Como filtrar por redirecionamentos.",
        "apihelp-query+recentchanges-param-user": "Listar apenas alterações de usuário.",
        "apihelp-query+recentchanges-param-excludeuser": "Não listar as alterações deste usuário.",
        "apihelp-query+recentchanges-param-tag": "Listar apenas as alterações marcadas com esta etiqueta.",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "Adicionar indicadores para a edição.",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "Listar as etiquetas para entrada.",
+       "apihelp-query+recentchanges-param-limit": "Quantas alterações a serem retornadas.",
        "apihelp-query+recentchanges-example-simple": "Listar mudanças recentes.",
+       "apihelp-query+redirects-param-prop": "Quais propriedades obter:",
        "apihelp-query+redirects-paramvalue-prop-title": "Título de cada redirecionamento.",
        "apihelp-query+redirects-paramvalue-prop-fragment": "Fragmento de cada redirecionamento, se há algum.",
        "apihelp-query+redirects-param-namespace": "Listar páginas apenas neste espaço nominal.",
+       "apihelp-query+redirects-param-limit": "Quantos redirecionamentos a serem retornados.",
        "apihelp-query+revisions-example-last5": "Mostrar as 5 últimas revisões do <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-first5": "Mostrar as 5 primeiras revisões do <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-first5-after": "Mostrar as 5 primeiras revisões do <kbd>Main Page</kbd> feitas depois de 05/01/2006.",
        "apihelp-query+revisions-example-first5-not-localhost": "Mostrar as 5 primeiras revisões do <kbd>Main Page</kbd> que não foram feitas pelo usuário anônimo <kbd>127.0.0.1</kbd>.",
        "apihelp-query+revisions-example-first5-user": "Mostrar as 5 primeiras revisões da <kbd>Main Page</kbd> que foram feitas pelo usuário <kbd>MediaWiki default</kbd>.",
        "apihelp-query+revisions+base-param-prop": "Que propriedades mostrar para cada modificação:",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "O ID da revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Texto da revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Etiquetas para a revisão.",
+       "apihelp-query+revisions+base-param-limit": "Limita quantas revisões serão retornadas.",
        "apihelp-query+search-description": "Fazer uma buscar completa de texto.",
        "apihelp-query+search-param-prop": "Que propriedades retornar:",
        "apihelp-query+search-paramvalue-prop-size": "Adiciona o tamanho da página em bytes.",
        "apihelp-query+siteinfo-paramvalue-prop-statistics": "Voltar às estatísticas do site.",
        "apihelp-query+siteinfo-param-numberingroup": "Listar o número de usuários nos grupos de usuário.",
        "apihelp-query+siteinfo-example-simple": "Obter informação do site.",
+       "apihelp-query+tags-param-limit": "O número máximo de tags a serem listadas.",
+       "apihelp-query+tags-param-prop": "Quais propriedades obter:",
        "apihelp-query+templates-param-limit": "Quantas predefinições retornar.",
+       "apihelp-query+templates-param-dir": "A direção na qual listar.",
+       "apihelp-query+transcludedin-param-prop": "Quais propriedades obter:",
        "apihelp-query+transcludedin-param-limit": "Quantos retornar.",
+       "apihelp-query+usercontribs-description": "Obtêm todas as edições de um usuário",
+       "apihelp-query+userinfo-param-prop": "Que informações incluir:",
        "apihelp-query+users-description": "Obter informação sobre uma lista de usuários.",
+       "apihelp-query+users-param-prop": "Que informações incluir:",
        "apihelp-query+watchlist-param-limit": "Quantos resultados retornar por solicitação.",
        "apihelp-query+watchlist-paramvalue-prop-title": "Adicionar título da página.",
        "apihelp-query+watchlist-paramvalue-prop-comment": "Adicionar comentário à edição.",
        "apihelp-query+watchlist-paramvalue-type-log": "Registro de entradas.",
        "apihelp-query+watchlist-paramvalue-type-categorize": "Alterações de membros pertencentes à uma categoria.",
        "apihelp-query+watchlistraw-param-limit": "Quantos resultados retornar por solicitação.",
+       "apihelp-query+watchlistraw-param-dir": "A direção na qual listar.",
        "apihelp-rollback-param-title": "Título da página para reverter. Não pode ser usado em conjunto com <var>$1pageid</var>.",
        "apihelp-rollback-param-pageid": "ID da página para reverter. Não pode ser usado em conjunto com <var>$1title</var>.",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "Trabalhar em todas as páginas vigiadas.",
        "apihelp-upload-param-ignorewarnings": "Ignorar todos os avisos.",
        "apihelp-userrights-param-user": "Nome de usuário.",
        "apihelp-userrights-param-userid": "ID de usuário.",
-       "apihelp-userrights-param-add": "Adicionar o usuário para estes grupos.",
+       "apihelp-userrights-param-add": "Adicione o usuário a esses grupos ou, se ele já for membro, atualizar a expiração de sua associação nesse grupo.",
        "apihelp-userrights-param-remove": "Remover o usuário destes grupos.",
        "apihelp-userrights-param-reason": "Motivo para a mudança.",
        "apihelp-none-description": "Nenhuma saída.",
        "api-help-license-unknown": "Fonte: <span class=\"apihelp-unknown\">desconhecida</span>",
        "api-help-parameters": "{{PLURAL:$1|Parâmetro|Parâmetros}}:",
        "api-help-param-deprecated": "Obsoleto",
-       "api-help-param-required": "Este parâmetro é obrigatório."
+       "api-help-param-required": "Este parâmetro é obrigatório.",
+       "api-help-param-default": "Padrão: $1",
+       "api-help-param-default-empty": "Padrão: <span class=\"apihelp-empty\">(vazio)</span>",
+       "apierror-badurl": "Valor \"$2\" não é válido para o parâmetro <var>$1</var> da URL.",
+       "apierror-cantblock-email": "Você não tem permissão para impedir que os usuários enviem e-mails através da wiki.",
+       "apierror-cantblock": "Você não tem permissão para bloquear usuários.",
+       "apierror-cantchangecontentmodel": "Você não tem permissão para mudar o modelo de conteúdo de uma página.",
+       "apierror-canthide": "Você não tem permissão para ocultar nomes de usuários do registro de bloqueios.",
+       "apierror-cantimport-upload": "Você não tem permissão para importar páginas enviadas.",
+       "apierror-cantimport": "Você não tem permissão para importar páginas.",
+       "apierror-filedoesnotexist": "Arquivo não existe.",
+       "apierror-invalidexpiry": "Tempo de expiração \"$1\" não válido.",
+       "apierror-invalidtitle": "Título incorreto \"$1\".",
+       "apierror-invaliduser": "Nome de usuário \"$1\" é inválido.",
+       "apierror-missingtitle-byname": "A página $1 não existe.",
+       "apierror-mustbeloggedin-generic": "Você deve estar logado.",
+       "apierror-noedit": "Você não tem permissão para editar páginas.",
+       "apierror-noimageredirect": "Você não tem permissão para criar redirecionamentos de imagens.",
+       "apierror-permissiondenied": "Você não tem permissão para $1.",
+       "apierror-permissiondenied-unblock": "Você não tem permissão para desbloquear usuários.",
+       "apierror-specialpage-cantexecute": "Você não tem permissão para ver os resultados desta página especial.",
+       "apiwarn-invalidcategory": "\"$1\" não é uma categoria.",
+       "apiwarn-invalidtitle": "\"$1\" não é um título válido.",
+       "apiwarn-notfile": "\"$1\" não é um arquivo.",
+       "apiwarn-tokennotallowed": "A ação \"$1\" não é permitida para o usuário atual.",
+       "api-feed-error-title": "Erro ($1)",
+       "api-credits-header": "Créditos"
 }
index b00e30b..9129d64 100644 (file)
@@ -6,13 +6,14 @@
                        "Macofe",
                        "Jkb8",
                        "Hamilton Abreu",
-                       "Mansil"
+                       "Mansil",
+                       "Felipe L. Ewald"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentação]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e pedidos]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página devem ter o comportamento documentado mas a API ainda está em desenvolvimento ativo e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das atualizações.\n\n<strong>Pedidos incorretos:</strong> Quando são enviados pedidos incorretos à API, será devolvido um cabeçalho HTTP com a chave \"MediaWiki-API-Error\" e depois tanto o valor desse cabeçalho como o código de erro devolvido serão definidos com o mesmo valor. Para mais informação, consulte [[mw:API:Errors_and_warnings|API:Erros e avisos]].\n\n<strong>Testes:</strong> Para testar facilmente pedidos à API, visite [[Special:ApiSandbox|Testes da API]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentação]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e pedidos]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página devem ter o comportamento documentado, mas a API ainda está em desenvolvimento ativo e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das atualizações.\n\n<strong>Pedidos incorretos:</strong> Quando são enviados pedidos incorretos à API, será devolvido um cabeçalho HTTP com a chave \"MediaWiki-API-Error\" e depois tanto o valor desse cabeçalho como o código de erro devolvido serão definidos com o mesmo valor. Para mais informação, consulte [[mw:Special:MyLanguage/API:Errors_and_warnings|API:Erros e avisos]].\n\n<strong>Testes:</strong> Para testar facilmente pedidos à API, visite [[Special:ApiSandbox|Testes da API]].",
        "apihelp-main-param-action": "A operação a ser realizada.",
        "apihelp-main-param-format": "O formato do resultado.",
-       "apihelp-main-param-maxlag": "O atraso máximo pode ser usado quando o MediaWiki é instalado num ''cluster'' de bases de dados replicadas. Para impedir que as operações causem ainda mais atrasos de replicação do ''site'', este parâmetro pode fazer o cliente aguardar até que o atraso de replicação seja inferior ao valor especificado. Caso o atraso atual exceda esse valor, o código de erro <samp>maxlag</samp> é devolvido com uma mensagem como <samp>À espera do servidor $host: $lag segundos de atraso</samp>.<br />Consulte [[mw:Manual:Maxlag_parameter|Manual: Parâmetro maxlag]] para mais informações.",
+       "apihelp-main-param-maxlag": "O atraso máximo pode ser usado quando o MediaWiki é instalado num ''cluster'' de bases de dados replicadas. Para impedir que as operações causem ainda mais atrasos de replicação do ''site'', este parâmetro pode fazer o cliente aguardar até que o atraso de replicação seja inferior ao valor especificado. Caso o atraso atual exceda esse valor, o código de erro <samp>maxlag</samp> é devolvido com uma mensagem como <samp>À espera do servidor $host: $lag segundos de atraso</samp>.<br />Consulte [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Parâmetro maxlag]] para mais informações.",
        "apihelp-main-param-smaxage": "Definir no cabeçalho HTTP <code>s-maxage</code> de controlo da ''cache'' este número de segundos. Os erros nunca são armazenados na ''cache''.",
        "apihelp-main-param-maxage": "Definir no cabeçalho HTTP <code>max-age</code> de controlo da ''cache'' este número de segundos. Os erros nunca são armazenados na ''cache''.",
        "apihelp-main-param-assert": "Se definido com o valor <kbd>user</kbd>, verificar que o utilizador está autenticado. Se definido com o valor <kbd>bot</kbd>, verificar que o utilizador tem o privilégio de conta robô.",
@@ -36,7 +37,7 @@
        "apihelp-block-param-autoblock": "Bloquear automaticamente o último endereço IP usado e quaisquer outros endereços IP subsequentes a partir do quais o utilizador tente iniciar uma sessão.",
        "apihelp-block-param-noemail": "Impedir o utilizador de enviar correio eletrónico através da wiki. (Requer o privilégio <code>blockemail</code>).",
        "apihelp-block-param-hidename": "Ocultar o nome do utilizador do registo de bloqueios. (Requer o privilégio <code>hideuser</code>).",
-       "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-allowusertalk": "Permitir que o utilizador edite a sua própria página de discussão (depende de <var>[[mw:Special:MyLanguage/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-opensearch-param-search": "Texto a pesquisar.",
        "apihelp-opensearch-param-limit": "O número máximo de resultados a serem devolvidos.",
        "apihelp-opensearch-param-namespace": "Espaços nominais a pesquisar.",
-       "apihelp-opensearch-param-suggest": "Não fazer nada se <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> for falso.",
+       "apihelp-opensearch-param-suggest": "Não fazer nada se <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> for falso.",
        "apihelp-opensearch-param-redirects": "Como tratar redirecionamentos:\n;return:Devolver o próprio redirecionamento.\n;resolve:Devolver a página de destino. Pode devolver menos de $1limit resultados.\nPor razões históricas, o valor por omissão é \"return\" para o formato $1format=json e \"resolve\" para outros formatos.",
        "apihelp-opensearch-param-format": "O formato do resultado.",
        "apihelp-opensearch-param-warningsaserror": "Se forem gerados avisos com <kbd>format=json</kbd>, devolver um erro da API em vez de ignorá-los.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Fornece o relatório de limites de forma estruturada. Não fornece dados quando <var>$1disablelimitreport</var> está definido.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Fornece a versão HTML do relatório de limites. Não fornece dados quando <var>$1disablelimitreport</var> está definido.",
        "apihelp-parse-paramvalue-prop-parsetree": "A árvore de análise XML do conteúdo da revisão (requer o modelo de conteúdo <code>$1</code>).",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "Fornece os avisos gerados durante a análise sintática do conteúdo.",
+       "apihelp-parse-param-wrapoutputclass": "A classe CSS a utilizar para envolver o resultado do analisador sintático.",
        "apihelp-parse-param-pst": "Fazer uma transformação de pré-gravação ao texto de entrada, antes de analisá-lo. Só é válido quando usado com texto.",
        "apihelp-parse-param-onlypst": "Fazer uma transformação de pré-gravação (PST, ''pre-save transform'') ao texto de entrada, mas não o analisar. Devolve o mesmo texto após aplicação da PST. Só é válido quando usado com <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclui links interlínguas fornecidos por extensões (para ser usado com <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-preview": "Executar a análise em modo de antevisão.",
        "apihelp-parse-param-sectionpreview": "Executar a análise em modo de antevisão (também ativa o modo de antevisão).",
        "apihelp-parse-param-disabletoc": "Omitir a tabela de conteúdo no resultado.",
+       "apihelp-parse-param-useskin": "Aplicar o tema selecionado ao resultado do analisador sintático. Pode afetar as seguintes propriedades: <kbd>langlinks</kbd>, <kbd>headitems</kbd>, <kbd>modules</kbd>, <kbd>jsconfigvars</kbd>, <kbd>indicators</kbd>.",
        "apihelp-parse-param-contentformat": "O formato da seriação de conteúdo, usado para o texto de entrada. Só é válido quando usado com $1text.",
        "apihelp-parse-param-contentmodel": "Modelo de conteúdo do texto de entrada. Se omitido, $1title tem de ser especificado e o valor por omissão será o modelo do título especificado. Só é válido quando usado com $1text.",
        "apihelp-parse-example-page": "Fazer a análise sintática de uma página.",
        "apihelp-query+alldeletedrevisions-param-user": "Listar só as revisões feitas por este utilizador.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Não listar as revisões feitas por este utilizador.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Listar só as páginas neste espaço nominal.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> Devido ao [[mw:Manual:$wgMiserMode|modo avarento]], o uso de <var>$1user</var> e <var>$1namespace</var> em conjunto pode resultar na devolução de menos de <var>$1limit</var> resultados antes de continuar; em casos extremos pode não ser devolvido qualquer resultado.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> Devido ao [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avarento]], o uso de <var>$1user</var> e <var>$1namespace</var> em conjunto pode resultar na devolução de menos de <var>$1limit</var> resultados antes de continuar; em casos extremos pode não ser devolvido qualquer resultado.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Ao ser usado como gerador, gerar títulos em vez de identificadores de revisões.",
        "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribuições eliminadas do utilizador <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Listar as primeiras 50 revisões eliminadas no espaço nominal principal.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Adiciona o nome de ficheiro da versão arquivada das versões anteriores à última.",
        "apihelp-query+filearchive-example-simple": "Mostrar uma lista de todos os ficheiros eliminados.",
        "apihelp-query+filerepoinfo-description": "Devolver meta informação sobre os repositórios de imagens configurados na wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "As propriedades do repositório que devem ser obtidas (em algumas wikis poderão haver mais disponíveis):\n;apiurl:URL para a API do repositório - útil para obter informação de imagens do servidor.\n;name:A chave para o repositório - usada, por exemplo, em <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e nos valores de retorno de [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:O nome legível da wiki repositório.\n;rooturl:URL de raiz para endereços de imagens.\n;local:Se o repositório é o local ou não.",
+       "apihelp-query+filerepoinfo-param-prop": "As propriedades do repositório que devem ser obtidas (em algumas wikis poderão haver mais disponíveis):\n;apiurl:URL para a API do repositório - útil para obter informação de imagens do servidor.\n;name:A chave para o repositório - usada, por exemplo, em <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e nos valores de retorno de [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:O nome legível da wiki repositório.\n;rooturl:URL de raiz para endereços de imagens.\n;local:Se o repositório é o local ou não.",
        "apihelp-query+filerepoinfo-example-simple": "Obter informações sobre os repositórios de ficheiros.",
        "apihelp-query+fileusage-description": "Encontrar todas as páginas que usam os ficheiros indicados.",
        "apihelp-query+fileusage-param-prop": "As propriedades a serem obtidas:",
        "apihelp-query+redirects-example-generator": "Obter informação sobre todos os redirecionamentos para a página [[Main Page]].",
        "apihelp-query+revisions-description": "Obter informação da revisão.\n\nPode ser usado de várias maneiras:\n# Obter dados sobre um conjunto de páginas (última revisão), definindo títulos ou identificadores de páginas.\n# Obter as revisões de uma página indicada, usando títulos ou identificadores de páginas, com start, end ou limit.\n# Obter dados sobre um conjunto de revisões definindo os respetivos identificadores de revisões.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "Só pode ser usado com uma única página (modo #2)",
-       "apihelp-query+revisions-param-startid": "O identificador de revisão a partir do qual será começada a enumeração.",
-       "apihelp-query+revisions-param-endid": "Terminar a enumeração de revisões neste identificador de revisão.",
+       "apihelp-query+revisions-param-startid": "Iniciar a enumeração a partir da data e hora desta revisão. A revisão tem de existir, mas não precisa de pertencer a esta página.",
+       "apihelp-query+revisions-param-endid": "Terminar a enumeração na data e hora desta revisão. A revisão tem de existir, mas não precisa de pertencer a esta página.",
        "apihelp-query+revisions-param-start": "A data e hora da revisão a partir da qual será começada a enumeração.",
        "apihelp-query+revisions-param-end": "A data e hora da revisão na qual será terminada a enumeração.",
        "apihelp-query+revisions-param-user": "Incluir só as revisões deste utilizador.",
        "apihelp-query+search-param-limit": "O número total de páginas a serem devolvidas.",
        "apihelp-query+search-param-interwiki": "Incluir resultados interwikis na pesquisa, se disponíveis.",
        "apihelp-query+search-param-backend": "O servidor de pesquisas a ser usado, se diferente do servidor padrão.",
-       "apihelp-query+search-param-enablerewrites": "Ativar a reescrita da pesquisa interna. Alguns motores de pesquisa podem reescrever a pesquisa, substituindo-a por outra que consideram que dará melhores resultados, como acontece na correção de erros de ortografia.",
+       "apihelp-query+search-param-enablerewrites": "Ativar a reescrita da pesquisa interna. Alguns motores de pesquisa podem reescrever a pesquisa substituindo-a por outra que consideram que dará melhores resultados, por exemplo, por corrigir erros de ortografia.",
        "apihelp-query+search-example-simple": "Pesquisar <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Pesquisar <kbd>meaning</kbd> nos textos.",
        "apihelp-query+search-example-generator": "Obter informação sobre as páginas devolvidas por uma pesquisa do termo <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devolve informação sobre os direitos (a licença) da wiki, se disponível.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devolve informação sobre os tipos de restrição (proteção) disponíveis.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Devolve uma lista das línguas que o MediaWiki suporta (opcionalmente localizada, usando <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Devolve uma lista dos códigos de língua para os quais o [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] está ativado, e as variantes suportadas para cada código.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Devolve uma lista de todos os temas ativados (opcionalmente localizada, usando <var>$1inlanguagecode</var>, ou então na língua do conteúdo).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devolve uma lista dos elementos de extensões do analisador sintático.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Devolve uma lista dos ''hooks'' de funções do analisador sintático.",
-       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve uma lista de todos os ''hooks'' subscritos (conteúdo de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve uma lista de todos os ''hooks'' subscritos (conteúdo de <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Devolve uma lista de identificadores de variáveis.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devolve uma lista dos protocolos permitidos nos ''links'' externos.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devolve os valores padrão para as preferências dos utilizadores.",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "Adiciona as etiquetas da edição.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Etiqueta as edições patrulhadas.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista as etiquetas da edição.",
-       "apihelp-query+usercontribs-param-show": "Mostrar só as contribuições que correspondem a estes critérios; por exemplo, só as edições não menores: <kbd>$2show=!minor</kbd>.\n\nSe um dos valores <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd> estiver definido, as revisões feitas há mais de <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|segundo|segundos}}) não serão mostradas.",
+       "apihelp-query+usercontribs-param-show": "Mostrar só as contribuições que correspondem a estes critérios; por exemplo, só as edições não menores: <kbd>$2show=!minor</kbd>.\n\nSe um dos valores <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd> estiver definido, as revisões feitas há mais de <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|segundo|segundos}}) não serão mostradas.",
        "apihelp-query+usercontribs-param-tag": "Listar só as revisões marcadas com esta etiqueta.",
        "apihelp-query+usercontribs-param-toponly": "Listar só as alterações que são a revisão mais recente.",
        "apihelp-query+usercontribs-example-user": "Mostrar as contribuições do utilizador <kbd>Example</kbd>.",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Etiquetas que indicam se o utilizador atual está bloqueado, por quem, e qual o motivo.",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Adiciona uma etiqueta <samp>messages</samp> se o utilizador atual tem mensagens pendentes.",
        "apihelp-query+userinfo-paramvalue-prop-groups": "Lista todos os grupos aos quais o utilizador atual pertence.",
+       "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "Lista os grupos aos quais o utilizador atual foi explicitamente atribuído, incluindo a data de expiração da sua pertença a cada grupo.",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Lista todos os grupos aos quais o utilizador atual pertence automaticamente.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Lista todas as permissões que o utilizador atual tem.",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lista os grupos aos quais o utilizador atual pode ser adicionado ou de onde pode ser removido.",
        "apihelp-query+users-param-prop": "As informações que devem ser incluídas:",
        "apihelp-query+users-paramvalue-prop-blockinfo": "Etiquetas que indicam se o utilizador está bloqueado, por quem, e qual o motivo.",
        "apihelp-query+users-paramvalue-prop-groups": "Lista todos os grupos aos quais cada utilizador pertence.",
+       "apihelp-query+users-paramvalue-prop-groupmemberships": "Lista os grupos aos quais cada utilizador foi explicitamente atribuído, incluindo a data de expiração da sua pertença a cada grupo.",
        "apihelp-query+users-paramvalue-prop-implicitgroups": "Lista todos os grupos aos quais um utilizador pertence automaticamente.",
        "apihelp-query+users-paramvalue-prop-rights": "Lista todas as permissões que cada utilizador tem.",
        "apihelp-query+users-paramvalue-prop-editcount": "Adiciona a contagem de edições do utilizador.",
        "apihelp-removeauthenticationdata-description": "Remover os dados de autenticação do utilizador atual.",
        "apihelp-removeauthenticationdata-example-simple": "Tentar remover os dados do utilizador atual para o pedido de autenticação <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "Enviar a um utilizador uma mensagem eletrónica de reinício da palavra-passe.",
-       "apihelp-resetpassword-description-noroutes": "Não estão disponíveis rotas de reinício da palavra-passe.\n\nPara usar este módulo, ative uma rota em <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.",
+       "apihelp-resetpassword-description-noroutes": "Não estão disponíveis rotas de reinício da palavra-passe.\n\nPara usar este módulo, ative uma rota em <var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.",
        "apihelp-resetpassword-param-user": "O utilizar cuja palavra-passe será reiniciada.",
        "apihelp-resetpassword-param-email": "O correio eletrónico do utilizador cuja palavra-passe será reiniciada.",
        "apihelp-resetpassword-example-user": "Enviar uma mensagem eletrónica para reinício da palavra-passe ao utilizador <kbd>Example</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-description-disabled": "Não é permitido alterar a língua de uma página nesta wiki.\n\nAtivar <var>[[mw:Special:MyLanguage/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-upload-param-checkstatus": "Obter só o estado de carregamento para a chave de ficheiro indicada.",
        "apihelp-upload-example-url": "Carregar de um URL.",
        "apihelp-upload-example-filekey": "Prosseguir um carregamento que falhou devido a avisos.",
-       "apihelp-userrights-description": "Alterar os membros de um grupo de utilizadores.",
+       "apihelp-userrights-description": "Alterar os grupos a que um utilizador pertence.",
        "apihelp-userrights-param-user": "O nome de utilizador.",
        "apihelp-userrights-param-userid": "O identificador de utilizador.",
        "apihelp-userrights-param-add": "Adicionar o utilizador a estes grupos ou, se já for membro de um grupo, atualizar a data de expiração da sua pertença a esse grupo.",
+       "apihelp-userrights-param-expiry": "Datas e horas de expiração. Podem ser relativas (por exemplo, <kbd>5 meses</kbd> ou <kbd>2 semanas</kbd>) ou absolutas (p. ex., <kbd>2014-09-18T12:34:56Z</kbd>). Se só estiver definida uma data e hora, ela será usada para todos os grupos passados ao parâmetro <var>$1add</var>. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> ou <kbd>never</kbd> quando a pertença a um grupo não tem expiração.",
        "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-userrights-example-expiry": "Adicionar o utilizador <kbd>SometimeSysop</kbd> ao grupo <kbd>sysop</kbd> por 1 mês.",
        "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-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.",
-       "api-format-prettyprint-header": "Esta é a representação em HTML do formato $1. O HTML é bom para o despiste de erros, mas inadequado para uso na aplicação.\n\nEspecifique o parâmetro <var>format</var> para alterar o formato de saída. Para ver a representação que não é em HTML do formato $1, defina <kbd>format=$2</kbd>.\n\nConsulte a [[mw:API|documentação completa]], ou a [[Special:ApiHelp/main|ajuda da API]] para mais informação.",
-       "api-format-prettyprint-header-only-html": "Esta é uma representação em HTML para ser usada no despiste de erros, mas inadequada para uso na aplicação.\n\nConsulte a [[mw:API|documentação completa]], ou a [[Special:ApiHelp/main|ajuda da API]] para mais informação.",
+       "api-format-prettyprint-header": "Esta é a representação em HTML do formato $1. O HTML é bom para o despiste de erros, mas inadequado para uso na aplicação.\n\nEspecifique o parâmetro <var>format</var> para alterar o formato de saída. Para ver a representação que não é em HTML do formato $1, defina <kbd>format=$2</kbd>.\n\nConsulte a [[mw:Special:MyLanguage/API|documentação completa]], ou a [[Special:ApiHelp/main|ajuda da API]] para mais informação.",
+       "api-format-prettyprint-header-only-html": "Esta é uma representação em HTML para ser usada no despiste de erros, mas inadequada para uso na aplicação.\n\nConsulte a [[mw:Special:MyLanguage/API|documentação completa]], ou a [[Special:ApiHelp/main|ajuda da API]] para mais informação.",
        "api-format-prettyprint-status": "Esta resposta seria devolvida com o estado de HTTP: $1 $2.",
+       "api-login-fail-aborted": "A autenticação requer interação com o utilizador, que não é suportada por <kbd>action=login</kbd>. Para poder entrar com <kbd>action=login</kbd>, consulte [[Special:BotPasswords]]. Para continuar a usar a autenticação da conta principal, consulte <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-aborted-nobotpw": "A autenticação requer interação com o utilizador, que não é suportada por <kbd>action=login</kbd>. Para entrar, consulte <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-badsessionprovider": "Não é possível entrar usando $1.",
+       "api-login-fail-sameorigin": "Não é possível entrar quando a norma da mesma origem não é aplicada.",
        "api-pageset-param-titles": "Uma lista dos títulos a serem trabalhados.",
        "api-pageset-param-pageids": "Uma lista dos identificadores de página a serem trabalhados.",
        "api-pageset-param-revids": "Uma lista dos identificadores de revisões a serem trabalhados.",
        "api-help-param-default-empty": "Padrão: <span class=\"apihelp-empty\">(vazio)</span>",
        "api-help-param-token": "Uma chave \"$1\" obtida de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-token-webui": "Para efeitos de compatibilidade, a chave usada na interface ''web'' também é aceite.",
-       "api-help-param-disabled-in-miser-mode": "Desativado devido ao [[mw:Manual:$wgMiserMode|modo avarento]] (''miser mode'').",
-       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> devido ao [[mw:Manual:$wgMiserMode|modo avarento]] (''miser mode''), usar isto pode resultar na devolução de menos de <var>$1limit</var> resultados antes de continuar; em casos extremos pode não ser devolvido qualquer resultado.",
+       "api-help-param-disabled-in-miser-mode": "Desativado devido ao [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avarento]] (''miser mode'').",
+       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> devido ao [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avarento]] (''miser mode''), usar isto pode resultar na devolução de menos de <var>$1limit</var> resultados antes de continuar; em casos extremos pode não ser devolvido qualquer resultado.",
        "api-help-param-direction": "A direção da enumeração:\n;newer:Listar o mais antigo primeiro. Nota: $1start tem de estar antes de $1end.\n;older:Listar o mais recente primeiro (padrão). Nota: $1start tem de estar depois de $1end.",
        "api-help-param-continue": "Quando houver mais resultados disponíveis, usar isto para continuar",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(sem descrição)</span>",
        "api-help-authmanagerhelper-returnurl": "O URL de retorno para processos de autenticação por terceiros tem de ser absoluto. É obrigatório fornecer este URL ou <var>$1continue</var>.\n\nTipicamente, após receber uma resposta <samp>REDIRECT</samp>, abrirá um ''browser'' ou uma ''web view'' para o URL <samp>redirecttarget</samp> especificado, para dar lugar ao processo de autenticação por terceiros. Quando esse processo terminar, a terceira entidade encaminhará o ''browser'' ou a ''web view'' para este URL. Deve extrair do URL quaisquer parâmetros de consulta ou de POST, e passá-los como um pedido <var>$1continue</var> a este módulo da API.",
        "api-help-authmanagerhelper-continue": "Este pedido é uma continuação após uma resposta anterior com o valor <samp>UI</samp> ou <samp>REDIRECT</samp>. É obrigatório fornecer este parâmetro ou o parâmetro <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "Este módulo aceita parâmetros adicionais, dependendo dos pedidos de autenticação disponíveis. Use <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> com <kbd>amirequestsfor=$1</kbd> (ou uma resposta anterior deste módulo, se aplicável) para determinar os pedidos disponíveis e os campos que estes utilizam.",
+       "apierror-allimages-redirect": "Usar <kbd>gaifilterredir=nonredirects</kbd> em vez de <var>redirects</var> ao utilizar <kbd>allimages</kbd> como gerador.",
+       "apierror-allpages-generator-redirects": "Usar <kbd>gapfilterredir=nonredirects</kbd> em vez de <var>redirects</var> ao utilizar <kbd>allpages</kbd> como gerador.",
+       "apierror-appendnotsupported": "Não é possível acrescentar conteúdo a páginas que usam o modelo de conteúdo $1.",
+       "apierror-articleexists": "O artigo que tentou criar já existe.",
+       "apierror-assertbotfailed": "A asserção de que o utilizador tem o privilégio <code>bot</code> falhou.",
+       "apierror-assertnameduserfailed": "A asserção de que o utilizador é \"$1\" falhou.",
+       "apierror-assertuserfailed": "A asserção de que o utilizador está autenticado falhou.",
+       "apierror-autoblocked": "O seu endereço IP foi bloqueado automaticamente, porque foi usado por um utilizador bloqueado.",
+       "apierror-badconfig-resulttoosmall": "O valor de <code>$wgAPIMaxResultSize</code> nesta wiki é demasiado pequeno para conter informação básica de resultados.",
+       "apierror-badcontinue": "Parâmetro de continuação inválido. Deve passar o valor original devolvido pela consulta anterior.",
+       "apierror-baddiff": "Não foi possível obter a lista de diferenças. Uma das revisões, ou ambas, não existem, ou não tem permissão para vê-las.",
+       "apierror-baddiffto": "<var>$1diffto</var> tem de ser um número não negativo, <kbd>prev</kbd>, <kbd>next</kbd> ou <kbd>cur</kbd>.",
+       "apierror-badformat-generic": "O formato solicitado $1 não é suportado pelo modelo de conteúdo $2.",
+       "apierror-badformat": "O formato solicitado $1 não é suportado pelo modelo de conteúdo $2 usado por $3.",
+       "apierror-badgenerator-notgenerator": "O módulo <kbd>$1</kbd> não pode ser usado como gerador.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> desconhecido.",
+       "apierror-badip": "O parâmetro IP não é válido.",
+       "apierror-badmd5": "A chave MD5 fornecida estava incorreta.",
+       "apierror-badmodule-badsubmodule": "O módulo <kbd>$1</kbd> não tem um submódulo \"$2\".",
+       "apierror-badmodule-nosubmodules": "O módulo <kbd>$1</kbd> não tem submódulos.",
+       "apierror-badparameter": "Valor inválido para o parâmetro <var>$1</var>.",
+       "apierror-badquery": "Consulta inválida.",
+       "apierror-badtimestamp": "Valor inválido \"$2\" para o parâmetro de data e hora <var>$1</var>.",
+       "apierror-badtoken": "Chave CSRF inválida.",
+       "apierror-badupload": "O parâmetro para carregamento de ficheiros <var>$1</var> não é um carregamento de ficheiro; verifique que usou <code>multipart/form-data</code> no seu POST e inclua um nome de ficheiro no cabeçalho <code>Content-Disposition</code>.",
+       "apierror-badurl": "Valor inválido \"$2\" para o parâmetro <var>$1</var> do URL.",
+       "apierror-baduser": "Valor inválido \"$2\" para o parâmetro de utilizador <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "O separador de valores múltiplos U+001F só pode ser usado em parâmetros de valores múltiplos.",
+       "apierror-bad-watchlist-token": "A chave secreta da lista de páginas vigiadas que foi fornecida está incorreta. Configure uma chave correta em [[Special:Preferences]], por favor.",
+       "apierror-blockedfrommail": "Foi-lhe bloqueada a capacidade de enviar correio eletrónico.",
+       "apierror-blocked": "Foi-lhe bloqueada a capacidade de editar.",
+       "apierror-botsnotsupported": "Esta interface não é suportada para robôs.",
+       "apierror-cannot-async-upload-file": "Os parâmetros <var>async</var> e <var>file</var> não podem ser combinados. Se pretende o processamento assíncrono do seu ficheiro carregado, carregue-o primeiro na área de ficheiros escondidos (usando o parâmetro <var>stash</var>) e depois publique de forma assíncrona este ficheiro escondido (usando <var>filekey</var> e <var>async</var>).",
+       "apierror-cannotreauthenticate": "Esta operação não está disponível porque não é possível verificar a sua identidade.",
+       "apierror-cannotviewtitle": "Não tem permissão para ver $1.",
+       "apierror-cantblock-email": "Não tem permissão para bloquear a capacidade dos utilizadores enviarem correio eletrónico através da wiki.",
+       "apierror-cantblock": "Não tem permissão para bloquear utilizadores.",
+       "apierror-cantchangecontentmodel": "Não tem permissão para alterar o modelo de conteúdo de uma página.",
+       "apierror-canthide": "Não tem permissão para ocultar nomes de utilizadores no registo de bloqueios.",
+       "apierror-cantimport-upload": "Não tem permissão para importar páginas carregadas.",
+       "apierror-cantimport": "Não tem permissão para importar páginas.",
+       "apierror-cantoverwrite-sharedfile": "O ficheiro alvo existe num repositório partilhado e você não tem permissão para o substituir.",
+       "apierror-cantsend": "Não está autenticado, não tem um endereço de correio eletrónico confirmado, ou não lhe é permitido enviar correio a outros utilizadores, por isso não pode enviar correios eletrónicos.",
+       "apierror-cantundelete": "Não foi possível restaurar: as revisões solicitadas podem não existir ou podem já ter sido restauradas.",
+       "apierror-changeauth-norequest": "A criação do pedido de modificação falhou.",
+       "apierror-chunk-too-small": "O tamanho de segmento mínimo é $1 {{PLURAL:$1|byte|bytes}} para segmentos que não sejam segmentos finais.",
+       "apierror-cidrtoobroad": "Não são aceites intervalos CIDR $1 maiores do que /$2.",
+       "apierror-systemblocked": "Foi automaticamente bloqueado pelo MediaWiki.",
        "api-credits-header": "Créditos",
        "api-credits": "Programadores da API:\n* Yuri Astrakhan (criador, programador principal, set 2006–set 2007)\n* Roan Kattouw (programador principal, set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (programador principal, 2013–presente)\n\nPode enviar os seus comentários, sugestões e perguntas para o endereço mediawiki-api@lists.wikimedia.org, ou reportar quaisquer defeitos que encontre em https://phabricator.wikimedia.org/."
 }
index c3ccad6..adea9ab 100644 (file)
        "apihelp-parse-paramvalue-prop-limitreportdata": "{{doc-apihelp-paramvalue|parse|prop|limitreportdata}}",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "{{doc-apihelp-paramvalue|parse|prop|limitreporthtml}}",
        "apihelp-parse-paramvalue-prop-parsetree": "{{doc-apihelp-paramvalue|parse|prop|parsetree|params=* $1 - Value of the constant CONTENT_MODEL_WIKITEXT|paramstart=2}}",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "{{doc-apihelp-paramvalue|parse|prop|parsewarnings}}",
+       "apihelp-parse-param-wrapoutputclass": "{{doc-apihelp-param|parse|wrapoutputclass}}",
        "apihelp-parse-param-pst": "{{doc-apihelp-param|parse|pst}}",
        "apihelp-parse-param-onlypst": "{{doc-apihelp-param|parse|onlypst}}",
        "apihelp-parse-param-effectivelanglinks": "{{doc-apihelp-param|parse|effectivelanglinks}}",
        "apihelp-parse-param-preview": "{{doc-apihelp-param|parse|preview}}",
        "apihelp-parse-param-sectionpreview": "{{doc-apihelp-param|parse|sectionpreview}}",
        "apihelp-parse-param-disabletoc": "{{doc-apihelp-param|parse|disabletoc}}",
+       "apihelp-parse-param-useskin": "{{doc-apihelp-param|parse|useskin}}",
        "apihelp-parse-param-contentformat": "{{doc-apihelp-param|parse|contentformat}}",
        "apihelp-parse-param-contentmodel": "{{doc-apihelp-param|parse|contentmodel}}",
        "apihelp-parse-example-page": "{{doc-apihelp-example|parse}}",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "{{doc-apihelp-paramvalue|query+siteinfo|prop|rightsinfo}}",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "{{doc-apihelp-paramvalue|query+siteinfo|prop|restrictions}}",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "{{doc-apihelp-paramvalue|query+siteinfo|prop|languages}}",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "{{doc-apihelp-paramvalue|query+siteinfo|prop|languagevariants}}",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "{{doc-apihelp-paramvalue|query+siteinfo|prop|skins}}",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "{{doc-apihelp-paramvalue|query+siteinfo|prop|extensiontags}}",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "{{doc-apihelp-paramvalue|query+siteinfo|prop|functionhooks}}",
        "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name",
        "api-format-prettyprint-header-only-html": "{{technical}} Displayed as a header when API output is pretty-printed in HTML, but there is no non-html module.\n\nParameters:\n* $1 - Format name",
        "api-format-prettyprint-status": "{{technical}} Displayed as a header when API pretty-printed output is used for a response that uses an unusual HTTP status code.\n\nParameters:\n* $1 - HTTP status code (integer)\n* $2 - Standard English text for the status code.",
+       "api-login-fail-aborted": "{{technical}} Displayed as an error when API login fails due to AuthManager requiring user interaction.\n\nSee also:\n* {{msg-mw|api-login-fail-aborted-nobotpw}}",
+       "api-login-fail-aborted-nobotpw": "{{technical}} Displayed as an error when API login fails due to AuthManager requiring user interaction. Used when BotPasswords is disabled.\n\nSee also:\n* {{msg-mw|api-login-fail-aborted}}",
+       "api-login-fail-badsessionprovider": "{{technical}} Displayed as an error when API login is not possible due to a session provider that doesn't support login.\n\nParameters:\n* $1 - Session type in use that makes it not possible to log in, from a message like {{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.",
+       "api-login-fail-sameorigin": "{{technical}} Displayed as an error when API login is not possible because the request does not enforce the Same-Origin policy.",
        "api-pageset-param-titles": "{{doc-apihelp-param|pageset|titles|description=the \"titles\" parameter in pageset-using modules}}",
        "api-pageset-param-pageids": "{{doc-apihelp-param|pageset|pageids|description=the \"pageids\" parameter in pageset-using modules}}",
        "api-pageset-param-revids": "{{doc-apihelp-param|pageset|revids|description=the \"revids\" parameter in pageset-using modules}}",
        "api-help-permissions-granted-to": "Used to introduce the list of groups each permission is assigned to.\n\nParameters:\n* $1 - Number of groups\n* $2 - List of group names, comma-separated",
        "api-help-right-apihighlimits": "{{technical}}{{doc-right|apihighlimits|prefix=api-help}}\nThis message is used instead of {{msg-mw|right-apihighlimits}} in the API help to display the actual limits.\n\nParameters:\n* $1 - Limit for slow queries\n* $2 - Limit for fast queries",
        "api-help-open-in-apisandbox": "Text for the link to open an API example in [[Special:ApiSandbox]].",
-       "api-help-authmanager-general-usage": "Text giving a brief overview of how to use an AuthManager-using API module. Parameters:\n* $1 - Module parameter prefix, e.g. \"login\"\n* $2 - Module name, e.g. \"clientlogin\"\n* $3 - Module path, e.g. \"clientlogin\"\n* $4 - AuthManager action to use with this module.\n* $5 - Token type needed by the module.",
+       "api-help-authmanager-general-usage": "{{doc-important|Do not translate text that either quoted, or inside <nowiki><var></var></nowiki>, <nowiki><kbd></kbd></nowiki>, <nowiki><samp></samp></nowiki>, or <nowiki><code></code></nowiki> in this message.}}\nText giving a brief overview of how to use an AuthManager-using API module. Parameters:\n* $1 - Module parameter prefix, e.g. \"login\"\n* $2 - Module name, e.g. \"clientlogin\"\n* $3 - Module path, e.g. \"clientlogin\"\n* $4 - AuthManager action to use with this module.\n* $5 - Token type needed by the module.",
        "api-help-authmanagerhelper-requests": "{{doc-apihelp-param|description=the \"requests\" parameter for AuthManager-using API modules|params=* $1 - AuthManager action used by this module|paramstart=2|noseealso=1}}",
        "api-help-authmanagerhelper-request": "{{doc-apihelp-param|description=the \"request\" parameter for AuthManager-using API modules|params=* $1 - AuthManager action used by this module|paramstart=2|noseealso=1}}",
        "api-help-authmanagerhelper-messageformat": "{{doc-apihelp-param|description=the \"messageformat\" parameter for AuthManager-using API modules|noseealso=1}}",
        "apierror-revdel-mutuallyexclusive": "{{doc-apierror}}",
        "apierror-revdel-needtarget": "{{doc-apierror}}",
        "apierror-revdel-paramneeded": "{{doc-apierror}}",
+       "apierror-revisions-badid": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter in question, e.g. \"rvstartid\".",
        "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.",
index 007c9d7..5992b40 100644 (file)
                        "Kareyac",
                        "Mailman",
                        "Ping08",
-                       "Ivan-r"
+                       "Ivan-r",
+                       "Redredsonia",
+                       "Alexey zakharenkov",
+                       "Facenapalm"
                ]
        },
-       "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Документация]]\n* [[mw:Special:MyLanguage/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:Special:MyLanguage/API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\n<strong>Тестирование:</strong> для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Действие, которое следует выполнить.",
        "apihelp-main-param-format": "Формат вывода.",
-       "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": "УÑ\81Ñ\82анавливаеÑ\82 значение HTTP-заголовка Cache-Control <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
-       "apihelp-main-param-maxage": "УÑ\81Ñ\82анавливаеÑ\82 Ð·Ð½Ð°Ñ\87ение HTTP-заголовка Cache-Control <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
-       "apihelp-main-param-assert": "УдоÑ\81Ñ\82овеÑ\80иÑ\82Ñ\8cÑ\81Ñ\8f, Ñ\87Ñ\82о Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8c Ð°Ð²Ñ\82оÑ\80изован, ÐµÑ\81ли Ð·Ð°Ð´Ð°Ð½Ð¾ <kbd>user</kbd>, Ð¸Ð»Ð¸ Ñ\87Ñ\82о имеет права бота, если задано <kbd>bot</kbd>.",
-       "apihelp-main-param-assertuser": "УбедиÑ\82еÑ\81Ñ\8c, Ñ\87Ñ\82о Ñ\82екÑ\83Ñ\89ий Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8c Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8f.",
+       "apihelp-main-param-maxlag": "Ð\97наÑ\87ение Ð¼Ð°ÐºÑ\81ималÑ\8cного Ð¾Ñ\82Ñ\81Ñ\82аваниÑ\8f Ð¼Ð¾Ð¶ÐµÑ\82 Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f, ÐºÐ¾Ð³Ð´Ð° MediaWiki Ñ\83Ñ\81Ñ\82ановлена Ð½Ð° ÐºÐ»Ð°Ñ\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:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Ð¿Ð°Ñ\80амеÑ\82Ñ\80а Maxlag]].",
+       "apihelp-main-param-smaxage": "УÑ\81Ñ\82ановиÑ\82Ñ\8c значение HTTP-заголовка Cache-Control <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
+       "apihelp-main-param-maxage": "УÑ\81Ñ\82ановиÑ\82Ñ\8c Ð·Ð½Ð°Ñ\87ение HTTP-заголовка Cache-Control <code>max-age</code> в заданное число секунд. Ошибки никогда не кэшируются.",
+       "apihelp-main-param-assert": "Ð\9fÑ\80овеÑ\80иÑ\82Ñ\8c, Ñ\87Ñ\82о Ñ\83Ñ\87аÑ\81Ñ\82ник Ð°Ð²Ñ\82оÑ\80изован, ÐµÑ\81ли Ð·Ð°Ð´Ð°Ð½Ð¾ <kbd>user</kbd>, Ð¸Ð»Ð¸ Ñ\87Ñ\82о Ð¾Ð½ имеет права бота, если задано <kbd>bot</kbd>.",
+       "apihelp-main-param-assertuser": "Ð\9fÑ\80овеÑ\80иÑ\82Ñ\8c, Ñ\87Ñ\82о Ð½Ð¸Ðº Ñ\82екÑ\83Ñ\89его Ñ\83Ñ\87аÑ\81Ñ\82ника Ñ\81овпадаеÑ\82 Ñ\81 Ð·Ð°Ð´Ð°Ð½Ð½Ñ\8bм.",
        "apihelp-main-param-requestid": "Любое заданное здесь значение будет включено в ответ. Может быть использовано для различения запросов.",
        "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=languages</kbd>» возвращает список кодов языков; укажите «<kbd>user</kbd>», чтобы использовать текущие языковые настройки пользователя, или «<kbd>content</kbd>» для использования основного языка этой вики.",
+       "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://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=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: Формат, используемый до 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-адресов, которые вы хотите заблокировать. Нельзя использовать вместе с <var>$1userid</var>",
-       "apihelp-block-param-userid": "ID участника, которого вы хотите заблокировать. Нельзя использовать одновременно вместе с <var>$1user</var>.",
-       "apihelp-block-param-expiry": "Ð\92Ñ\80емÑ\8f Ð¸Ñ\81Ñ\82еÑ\87ениÑ\8f Ñ\81Ñ\80ока Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8f. Ð\9cогÑ\83Ñ\82 Ð±Ñ\8bÑ\82Ñ\8c Ð¾Ñ\82ноÑ\81иÑ\82елÑ\8cнÑ\8bми (напÑ\80имеÑ\80, <kbd>5 Ð¼ÐµÑ\81Ñ\8fÑ\86ев</kbd> Ð¸Ð»Ð¸ <kbd>2 Ð½ÐµÐ´ÐµÐ»Ð¸</kbd>) Ð¸Ð»Ð¸ Ð°Ð±Ñ\81олÑ\8eÑ\82нÑ\8bми (напÑ\80имеÑ\80, <kbd>2014-09-18T12:34:56Z</kbd>). Ð\95Ñ\81ли Ð·Ð°Ð´Ð°Ð½Ð¾ <kbd>беÑ\81Ñ\81Ñ\80оÑ\87но</kbd>, <kbd>беÑ\81Ñ\81Ñ\80оÑ\87но</kbd>, Ð¸Ð»Ð¸ <kbd>не</kbd>, Ð±Ð»Ð¾Ðº Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° Ð½Ðµ Ð¸Ñ\81Ñ\82екает.",
+       "apihelp-block-param-userid": "Идентификатор блокируемого участника. Нельзя использовать одновременно с <var>$1user</var>.",
+       "apihelp-block-param-expiry": "Ð\92Ñ\80емÑ\8f Ð¸Ñ\81Ñ\82еÑ\87ениÑ\8f Ñ\81Ñ\80ока Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8f. Ð\9cожеÑ\82 Ð±Ñ\8bÑ\82Ñ\8c Ð¾Ñ\82ноÑ\81иÑ\82елÑ\8cнÑ\8bми (напÑ\80имеÑ\80, <kbd>5 months</kbd> Ð¸Ð»Ð¸ <kbd>2 weeks</kbd>) Ð¸Ð»Ð¸ Ð°Ð±Ñ\81олÑ\8eÑ\82нÑ\8bми (напÑ\80имеÑ\80, <kbd>2014-09-18T12:34:56Z</kbd>). Ð\95Ñ\81ли Ð·Ð°Ð´Ð°Ð½Ð¾ <kbd>infinite</kbd>, <kbd>indefinite</kbd>, Ð¸Ð»Ð¸ <kbd>never</kbd>, Ð±Ð»Ð¾Ðº Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° Ð½Ðµ Ð¸Ñ\81Ñ\82еÑ\87Ñ\91т.",
        "apihelp-block-param-reason": "Причина блокировки.",
-       "apihelp-block-param-anononly": "Ð\91локиÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñ\8bÑ\85 Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елей (т. е. запретить анонимные правки для этого IP-адреса).",
+       "apihelp-block-param-anononly": "Ð\97аблокиÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñ\8bÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ников (т. е. запретить анонимные правки для этого IP-адреса).",
        "apihelp-block-param-nocreate": "Запретить создание учётных записей.",
        "apihelp-block-param-autoblock": "Автоматически блокировать последний использованный 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-allowusertalk": "Позволяет участникам редактировать их собственные страницы обсуждения (зависит от <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Если участник уже заблокирован, перезаписать существующую блокировку.",
-       "apihelp-block-param-watchuser": "Следить за страницей пользователя или IP-участника и страницей обсуждения.",
-       "apihelp-block-example-ip-simple": "Заблокировать IP-адрес <kbd>192.0.2.5</kbd> в течение трех дней с причиной <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=token]]</kbd>.",
-       "apihelp-checktoken-param-type": "Тип маркера проходит тестирование.",
-       "apihelp-checktoken-param-token": "токен для проверки",
+       "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-changeauthenticationdata-example-password": "Попытаться изменить текущий пароль участника на <kbd>ExamplePassword</kbd>.",
+       "apihelp-checktoken-description": "Проверить корректность токена из <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=token]]</kbd>.",
+       "apihelp-checktoken-param-type": "Тип проверяемого токена.",
+       "apihelp-checktoken-param-token": "Проверяемый токен.",
        "apihelp-checktoken-param-maxtokenage": "Максимально допустимый возраст токена (в секундах).",
-       "apihelp-checktoken-example-simple": "Ð\9fÑ\80овеÑ\80иÑ\82Ñ\8c Ð³Ð¾Ð´ность <kbd>csrf</kbd>-токена.",
-       "apihelp-clearhasmsg-description": "Ð\9eÑ\87иÑ\89аеÑ\82 флаг <code>hasmsg</code> для текущего участника.",
+       "apihelp-checktoken-example-simple": "Ð\9fÑ\80овеÑ\80иÑ\82Ñ\8c ÐºÐ¾Ñ\80Ñ\80екÑ\82ность <kbd>csrf</kbd>-токена.",
+       "apihelp-clearhasmsg-description": "Ð\9eÑ\87иÑ\81Ñ\82иÑ\82Ñ\8c флаг <code>hasmsg</code> для текущего участника.",
        "apihelp-clearhasmsg-example-1": "Очистить флаг <code>hasmsg</code> для текущего участника.",
-       "apihelp-clientlogin-description": "Войдите в вики с помощью интерактивного потока.",
-       "apihelp-clientlogin-example-login": "Ð\9dаÑ\87аÑ\82Ñ\8c Ð¿Ñ\80оÑ\86еÑ\81Ñ\81 Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86ии Ð² Ð²Ð¸ÐºÐ¸ Ð² ÐºÐ°Ñ\87еÑ\81Ñ\82ве Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8f <kbd>пÑ\80имеÑ\80</kbd> с паролем <kbd>ExamplePassword</kbd>.",
-       "apihelp-clientlogin-example-login2": "Продолжить ведение журнала в после <samp>интерфейс</samp> ответ для двухфакторной аутентификации, поставляя <var>OATHToken</var> из <kbd>987654</kbd>.",
-       "apihelp-compare-description": "СделаÑ\82Ñ\8c Ñ\80азниÑ\86Ñ\83 Ð¼ÐµÐ¶Ð´Ñ\83 2 Ñ\81Ñ\82Ñ\80аниÑ\86ами.\n\nÐ\9dомеÑ\80 Ñ\80едакÑ\86ии, Ð\97аголовок Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b, Ð¸Ð»Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ñ\81 ID Ð´Ð»Ñ\8f Ð¾Ð±Ð¾Ð¸Ñ\85 \"из\" Ð¸ \"в\" Ð´Ð¾Ð»Ð¶Ð½Ñ\8b Ð±Ñ\8bÑ\82Ñ\8c Ð¿ÐµÑ\80еданÑ\8b.",
-       "apihelp-compare-param-fromtitle": "Ð\9fеÑ\80вÑ\8bй Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Ð´Ð»Ñ\8f Ñ\81Ñ\80авнениÑ\8f.",
-       "apihelp-compare-param-fromid": "Ð\9fеÑ\80вÑ\8bй Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð´Ð»Ñ\8f Ñ\81Ñ\80авнениÑ\8f.",
-       "apihelp-compare-param-fromrev": "Ð\9fеÑ\80ваÑ\8f Ñ\80едакÑ\86иÑ\8f Ð´Ð»Ñ\8f Ñ\81Ñ\80авнения.",
-       "apihelp-compare-param-totitle": "Ð\92Ñ\82оÑ\80ой Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Ð´Ð»Ñ\8f Ñ\81Ñ\80авнениÑ\8f.",
-       "apihelp-compare-param-toid": "Ð\92Ñ\82оÑ\80ой Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð´Ð»Ñ\8f Ñ\81Ñ\80авнениÑ\8f",
-       "apihelp-compare-param-torev": "Вторая версия для сравнения",
-       "apihelp-compare-example-1": "Создание различий между версиями 1 и 2.",
-       "apihelp-createaccount-description": "СоздайÑ\82е Ð½Ð¾Ð²Ñ\83Ñ\8e Ñ\83Ñ\87Ñ\91Ñ\82нÑ\83Ñ\8e Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c.",
-       "apihelp-createaccount-param-preservestate": "Если <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> возвращается True для <samp>hasprimarypreservedstate</samp>, просит отмечен как <samp>основной-обязательно</samp> должен быть опущен. Если он возвращает непустое значение для <samp>preservedusername</samp>, что имя пользователя должно быть использовано для <var>пользователя</var> параметр.",
-       "apihelp-createaccount-example-create": "Ð\97апÑ\83Ñ\81Ñ\82иÑ\82Ñ\8c Ð¿Ñ\80оÑ\86еÑ\81Ñ\81 Ñ\81озданиÑ\8f Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8f <kbd>пÑ\80имеÑ\80</kbd> с паролем <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-description": "Вход в вики с помощью интерактивного потока.",
+       "apihelp-clientlogin-example-login": "Ð\9dаÑ\87аÑ\82Ñ\8c Ð²Ñ\85од Ð² Ð²Ð¸ÐºÐ¸ Ð² ÐºÐ°Ñ\87еÑ\81Ñ\82ве Ñ\83Ñ\87аÑ\81Ñ\82ника <kbd>Example</kbd> с паролем <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-example-login2": "Продолжить вход после ответа <samp>UI</samp> для двухфакторной авторизации, предоставив <kbd>987654</kbd> в качестве токена <var>OATHToken</var>.",
+       "apihelp-compare-description": "Ð\9fолÑ\83Ñ\87ение Ñ\80азниÑ\86Ñ\8b Ð¼ÐµÐ¶Ð´Ñ\83 Ð´Ð²Ñ\83мÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86ами.\n\nÐ\9dомеÑ\80 Ð²ÐµÑ\80Ñ\81ии, Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð¸Ð»Ð¸ ÐµÑ\91 Ð¸Ð´ÐµÐ½Ñ\82иÑ\84икаÑ\82оÑ\80 Ð´Ð¾Ð»Ð¶Ð½Ñ\8b Ð±Ñ\8bÑ\82Ñ\8c Ð¾Ð´Ð½Ð¾Ð²Ñ\80еменно Ð¸ Ð² Ð¿Ð¾Ð»Ðµ Â«from», Ð¸ Ð² Ð¿Ð¾Ð»Ðµ Â«to».",
+       "apihelp-compare-param-fromtitle": "Ð\97аголовок Ð¿ÐµÑ\80вой Ñ\81Ñ\80авниваемой Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.",
+       "apihelp-compare-param-fromid": "Ð\98денÑ\82иÑ\84икаÑ\82оÑ\80 Ð¿ÐµÑ\80вой Ñ\81Ñ\80авниваемой Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.",
+       "apihelp-compare-param-fromrev": "Ð\9fеÑ\80ваÑ\8f Ñ\81Ñ\80авниваемаÑ\8f Ð²ÐµÑ\80Ñ\81ия.",
+       "apihelp-compare-param-totitle": "Ð\97аголовок Ð²Ñ\82оÑ\80ой Ñ\81Ñ\80авниваемой Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.",
+       "apihelp-compare-param-toid": "Ð\98денÑ\82иÑ\84икаÑ\82оÑ\80 Ð²Ñ\82оÑ\80ой Ñ\81Ñ\80авниваемой Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b.",
+       "apihelp-compare-param-torev": "Вторая сравниваемая версия.",
+       "apihelp-compare-example-1": "Создать разницу между версиями 1 и 2.",
+       "apihelp-createaccount-description": "Создание Ð½Ð¾Ð²Ð¾Ð¹ Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и.",
+       "apihelp-createaccount-param-preservestate": "Если запрос <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> возвращает true для <samp>hasprimarypreservedstate</samp>, то запросы, отмеченные как <samp>primary-required</samp>, должны быть пропущены. Если запрос возвращает непустое значение поля <samp>preservedusername</samp>, то это значение должно быть использовано в параметре <samp>username</var>.",
+       "apihelp-createaccount-example-create": "Ð\9dаÑ\87аÑ\82Ñ\8c Ñ\81оздание Ñ\83Ñ\87аÑ\81Ñ\82ника <kbd>Example</kbd> с паролем <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Имя участника.",
-       "apihelp-createaccount-param-password": "Пароль (ignored if <var>$1mailpassword</var> is set).",
-       "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": "Используемые браузеры сообщать о нарушениях политики безопасности. Этот модуль никогда не должно использоваться, за исключением, когда автоматически используется совместимый КРИПТОПРОВАЙДЕР веб-браузер.",
-       "apihelp-cspreport-param-reportonly": "Отметить как доклад по мониторингу политики, а не принудительная политика",
-       "apihelp-cspreport-param-source": "Что генерируется Заголовок СКП, которые вызвали этот доклад",
-       "apihelp-delete-description": "Удалить страницу.",
-       "apihelp-delete-param-title": "Заголовок страницы удалить. Совместное использование с <var>$1страницы</var> невозможно.",
-       "apihelp-delete-param-pageid": "Идентификатор страницы для удаления. Нельзя использовать вместе с <var>$1титул</var>.",
-       "apihelp-delete-param-reason": "Причиной для удаления. Если не задано, автоматически сгенерированный причина будет использоваться.",
-       "apihelp-delete-param-tags": "Изменить теги для подачи заявки на запись в журнале удаления.",
-       "apihelp-delete-param-watch": "Добавить страницу к текущему списку наблюдения пользователя.",
-       "apihelp-delete-param-watchlist": "Безоговорочно добавить или удалить страницы из списка наблюдения текущего пользователя, используйте предпочтения или не менять часы.",
-       "apihelp-delete-param-unwatch": "Удалить страницу из списка наблюдения текущего пользователя.",
-       "apihelp-delete-example-simple": "удалить <kbd>Main Page</kbd>.",
-       "apihelp-delete-example-reason": "Удалить <kbd>Main Page</kbd> причина <kbd>Preparing for move</kbd>.",
+       "apihelp-createaccount-param-password": "Пароль (будет проигнорирован, если задан параметр <var>$1mailpassword</var>).",
+       "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). Этот модуль никогда не должен использоваться, за исключением случаев автоматического использования совместимыми с CSP браузерами.",
+       "apihelp-cspreport-param-reportonly": "Отметить как доклад от политики мониторинга, не от принудительной политики",
+       "apihelp-cspreport-param-source": "Что сгенерировало заголовок SCP, вызвавший этот доклад",
+       "apihelp-delete-description": "Удаление страницы.",
+       "apihelp-delete-param-title": "Заголовок удаляемой страницы. Нельзя использовать одновременно с <var>$1pageid</var>.",
+       "apihelp-delete-param-pageid": "Идентификатор удаляемой страницы. Нельзя использовать одновременно с <var>$1title</var>.",
+       "apihelp-delete-param-reason": "Причина удаления. Если не задана, будет использована автоматически сгенерированная причина.",
+       "apihelp-delete-param-tags": "Изменить метки записи в журнале удалений.",
+       "apihelp-delete-param-watch": "Добавить страницу в список наблюдения текущего участника.",
+       "apihelp-delete-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.",
+       "apihelp-delete-param-unwatch": "Удалить страницу из списка наблюдения текущего участника.",
+       "apihelp-delete-param-oldimage": "Название старого удаляемого изображения, предоставляемое [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
+       "apihelp-delete-example-simple": "Удалить <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Удалить <kbd>Main Page</kbd> с причиной <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Этот модуль был отключен.",
-       "apihelp-edit-description": "Создать и отредактировать страницы.",
-       "apihelp-edit-param-sectiontitle": "Заголовок для нового раздела.",
-       "apihelp-edit-param-text": "Содержание страницы.",
-       "apihelp-edit-param-tags": "Изменить теги для подачи заявки на пересмотр.",
-       "apihelp-edit-param-minor": "Незначительное изменение (малая правка).",
-       "apihelp-edit-param-notminor": "Значительное изменение (обычная, не «малая», правка).",
+       "apihelp-edit-description": "Создание и редактирование страниц.",
+       "apihelp-edit-param-title": "Название редактируемой страницы. Нельзя использовать одновременно с <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "Идентификатор редактируемой страницы. Нельзя использовать одновременно с <var>$1title</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, а $1sectiontitle не задано.",
+       "apihelp-edit-param-tags": "Изменить метки записи в истории изменений.",
+       "apihelp-edit-param-minor": "Малая правка.",
+       "apihelp-edit-param-notminor": "Не малая правка.",
        "apihelp-edit-param-bot": "Пометить правку как сделанную ботом.",
-       "apihelp-edit-param-recreate": "Возвращает сообщение об ошибке не, если страница тем временем был удален.",
+       "apihelp-edit-param-basetimestamp": "Временная метка редактируемой версии, используется для обнаружения конфликтов редактирования. Может быть получена посредством [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "Метка времени начала редактирования, используется для обнаружения конфликтов редактирования. Необходимое значение может быть получено с помощью <var>[[Special:ApiHelp/main|curtimestamp]]</var> в начале редактирования (то есть, после загрузки содержимого редактируемой страницы).",
+       "apihelp-edit-param-recreate": "Игнорировать предупреждение о том, что страница была удалена во время редактирования.",
        "apihelp-edit-param-createonly": "Не редактировать страницу, если она уже существует.",
        "apihelp-edit-param-nocreate": "Выбрасывать ошибку, если страницы не существует.",
-       "apihelp-edit-param-watch": "Ð\94обавиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ðº Ñ\82екÑ\83Ñ\89емÑ\83 Ñ\81пиÑ\81кÑ\83 Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8f.",
-       "apihelp-edit-param-unwatch": "Удалить страницу из списка наблюдения текущего пользователя.",
-       "apihelp-edit-param-watchlist": "Безоговорочно добавить или удалить страницы из списка наблюдения текущего пользователя, используйте предпочтения или не менять часы.",
-       "apihelp-edit-param-md5": "MD5-хеша $1текстовый параметр, или $1prependtext и $1appendtext параметры объединяются. Если установлен, то изменение не будет сделано, если хэш является правильным.",
-       "apihelp-edit-param-prependtext": "Добавьте этот текст в начале страницы. Переопределяет $1текст.",
-       "apihelp-edit-param-appendtext": "Добавьте этот текст внизу страницы. Переопределяет $1текст.\n\nИспользуйте вместо этого параметра $1раздел = new, чтобы добавить новый раздел.",
-       "apihelp-edit-param-undo": "Отменить это изменение. Переопределяет $1текст, $1prependtext и $1appendtext.",
-       "apihelp-edit-param-undoafter": "Отменить все изменения от $1, чтобы отменить это. Если не набор, просто отменить одну ревизию.",
-       "apihelp-edit-param-redirect": "Автоматически разрешать редиректы.",
-       "apihelp-edit-param-contentformat": "ФоÑ\80маÑ\82 Ñ\81еÑ\80иализаÑ\86ии Ñ\81одеÑ\80жимого, Ð¸Ñ\81полÑ\8cзÑ\83емÑ\8bй Ð´Ð»Ñ\8f Ð²Ð²Ð¾Ð´Ð° текста.",
-       "apihelp-edit-param-contentmodel": "Ð\9aонÑ\82енÑ\82наÑ\8f Ð¼одель нового содержимого.",
-       "apihelp-edit-param-token": "Ð\9cаÑ\80кеÑ\80 Ð²Ñ\81егда Ð´Ð¾Ð»Ð¶ÐµÐ½ Ð±Ñ\8bÑ\82Ñ\8c Ð¿Ð¾Ñ\81лан Ð² ÐºÐ°Ñ\87еÑ\81Ñ\82ве Ð¿Ð¾Ñ\81леднего Ð¿Ð°Ñ\80амеÑ\82Ñ\80а, Ð¸Ð»Ð¸, Ð¿Ð¾ ÐºÑ\80айней Ð¼ÐµÑ\80е, Ð¿Ð¾Ñ\81ле $1Ñ\82екÑ\81Ñ\82овÑ\8bй Ð¿Ð°Ñ\80амеÑ\82Ñ\80.",
-       "apihelp-edit-example-edit": "Редактировать страницу",
+       "apihelp-edit-param-watch": "Ð\94обавиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð² Ñ\81пиÑ\81ок Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f Ñ\82екÑ\83Ñ\89его Ñ\83Ñ\87аÑ\81Ñ\82ника.",
+       "apihelp-edit-param-unwatch": "Удалить страницу из списка наблюдения текущего участника.",
+       "apihelp-edit-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.",
+       "apihelp-edit-param-md5": "MD5-хеш параметра $1text, или конкатенации параметров $1prependtext и $1apendtext. Если задан, правка не будет выполнена, если хеш некорректен.",
+       "apihelp-edit-param-prependtext": "Добавить этот текст в начало страницы. Переопределяет $1text.",
+       "apihelp-edit-param-appendtext": "Добавить этот текст в конец страницы. Переопределяет $text.\n\nДля создания нового раздела, используйте $1section=new, а не этот параметр.",
+       "apihelp-edit-param-undo": "Отменить это изменение. Переопределяет $text, $1prependtext и $1appendtext.",
+       "apihelp-edit-param-undoafter": "Отменить все изменения от $1undo до данного. Если не задано, просто отменить одно изменение.",
+       "apihelp-edit-param-redirect": "Автоматически разрешать перенаправления.",
+       "apihelp-edit-param-contentformat": "ФоÑ\80маÑ\82 Ñ\81еÑ\80иализаÑ\86ии Ñ\81одеÑ\80жимого, Ð¸Ñ\81полÑ\8cзÑ\83емÑ\8bй Ð´Ð»Ñ\8f Ð²Ð²ÐµÐ´Ñ\91нного текста.",
+       "apihelp-edit-param-contentmodel": "Ð\9cодель нового содержимого.",
+       "apihelp-edit-param-token": "Токен Ð²Ñ\81егда Ð´Ð¾Ð»Ð¶ÐµÐ½ Ð±Ñ\8bÑ\82Ñ\8c Ð¿Ð¾Ñ\81лан Ð² ÐºÐ°Ñ\87еÑ\81Ñ\82ве Ð¿Ð¾Ñ\81леднего Ð¿Ð°Ñ\80амеÑ\82Ñ\80а, Ð¸Ð»Ð¸, Ð¿Ð¾ ÐºÑ\80айней Ð¼ÐµÑ\80е, Ð¿Ð¾Ñ\81ле Ð¿Ð°Ñ\80амеÑ\82Ñ\80а $1text.",
+       "apihelp-edit-example-edit": "Редактировать страницу.",
        "apihelp-edit-example-prepend": "Добавить магическое слово <kbd>_&#95;NOTOC_&#95;</kbd> в начало страницы.",
-       "apihelp-edit-example-undo": "Ð\9eÑ\82мениÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ñ\81 13579 Ð¿Ð¾ 13585 Ñ\81 Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81кого Ð¾Ð¿Ð¸Ñ\81аниÑ\8f правки.",
-       "apihelp-emailuser-description": "Ð\9fиÑ\81Ñ\8cмо Ñ\83Ñ\87аÑ\81Ñ\82никÑ\83",
-       "apihelp-emailuser-param-target": "Адресат электронного письма",
+       "apihelp-edit-example-undo": "Ð\9eÑ\82мениÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ñ\81 13579 Ð¿Ð¾ 13585 Ñ\81 Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ким Ð¾Ð¿Ð¸Ñ\81анием правки.",
+       "apihelp-emailuser-description": "Ð\9dапиÑ\81ание Ñ\8dлекÑ\82Ñ\80оннÑ\8bÑ\85 Ð¿Ð¸Ñ\81ем Ñ\83Ñ\87аÑ\81Ñ\82никÑ\83.",
+       "apihelp-emailuser-param-target": "Адресат электронного письма.",
        "apihelp-emailuser-param-subject": "Заголовок темы.",
-       "apihelp-emailuser-param-text": "Содержание письма",
+       "apihelp-emailuser-param-text": "Содержание письма.",
        "apihelp-emailuser-param-ccme": "Отправить копию этого сообщения мне.",
-       "apihelp-emailuser-example-email": "Отправить письмо пользователю <kbd>WikiSysop</kbd> с текстом <kbd>Content</kbd>.",
-       "apihelp-expandtemplates-description": "РазвоÑ\80аÑ\87иваеÑ\82 Ð²Ñ\81е Ñ\88аблонÑ\8b Ð² Ð²Ð¸ÐºÐ¸текст.",
+       "apihelp-emailuser-example-email": "Отправить письмо участнику <kbd>WikiSysop</kbd> с текстом <kbd>Content</kbd>.",
+       "apihelp-expandtemplates-description": "РазвоÑ\80аÑ\87ивание Ð²Ñ\81еÑ\85 Ñ\88аблонов Ð² Ð²Ð¸ÐºÐ¸-текст.",
        "apihelp-expandtemplates-param-title": "Заголовок страницы.",
-       "apihelp-expandtemplates-param-text": "Ð\92икиÑ\82екÑ\81Ñ\82 Ð´Ð»Ñ\8f ÐºÐ¾Ð½Ð²ÐµÑ\80Ñ\82иÑ\80ованиÑ\8f",
+       "apihelp-expandtemplates-param-text": "Ð\9aонвеÑ\80Ñ\82иÑ\80Ñ\83емÑ\8bй Ð²Ð¸ÐºÐ¸-Ñ\82екÑ\81Ñ\82.",
        "apihelp-expandtemplates-param-revid": "Номер версии, для <nowiki>{{REVISIONID}}</nowiki> и аналогичных переменных.",
-       "apihelp-expandtemplates-param-prop": "Какие фрагменты информации получить.\n\nОбратите внимание, что если ни одно из значений не выбрано, результат будет содержать викитекст, но вывод будет в устаревшем формате.",
-       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Расширенный викитекст",
-       "apihelp-expandtemplates-paramvalue-prop-categories": "Любой категории присутствуют во входных данных, которые не представлены в тексте вывод.",
-       "apihelp-expandtemplates-paramvalue-prop-properties": "Страница свойств определяются расширенные волшебные слова в тексте.",
-       "apihelp-expandtemplates-paramvalue-prop-volatile": "Ð\95Ñ\81Ñ\82Ñ\8c Ð»Ð¸ Ð²Ñ\8bÑ\85од Ð»ÐµÑ\82Ñ\83Ñ\87иÑ\85 Ð¸ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ\8b Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f Ð¿Ð¾Ð²Ñ\82оÑ\80но Ð² Ð´Ñ\80Ñ\83гом Ð¼ÐµÑ\81Ñ\82е на странице.",
+       "apihelp-expandtemplates-param-prop": "Какую информацию включить.\n\nОбратите внимание, что если ни одно из значений не выбрано, результат будет содержать вики-текст, но вывод будет в устаревшем формате.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Расширенный вики-текст.",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "Любые категории, присутствующие во входных данных, но не попавшие в вики-текстовый результат.",
+       "apihelp-expandtemplates-paramvalue-prop-properties": "Свойства страницы, определённые раскрытыми магическими словами в вики-тексте.",
+       "apihelp-expandtemplates-paramvalue-prop-volatile": "ЯвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð»Ð¸ Ð²Ñ\8bвод Ð½ÐµÑ\81Ñ\82абилÑ\8cнÑ\8bм Ð¸ Ñ\81ледÑ\83еÑ\82 Ð»Ð¸ Ð¾Ñ\82казаÑ\82Ñ\8cÑ\81Ñ\8f Ð¾Ñ\82 ÐµÐ³Ð¾ Ð¿Ð¾Ð²Ñ\82оÑ\80ного Ð¸Ñ\81полÑ\8cзованиÑ\8f Ð³Ð´Ðµ-либо на странице.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "Максимальное время, по прошествии которого кэш результата должен быть признан недействительным.",
-       "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Дает переменные конфигурации JavaScript конкретной странице.",
-       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Дает переменные конфигурации JavaScript, определенных на страницу в виде строки JSON.",
-       "apihelp-expandtemplates-paramvalue-prop-parsetree": "Дерево разбора XML входных данных.",
-       "apihelp-expandtemplates-param-includecomments": "Нужно ли включать комментарии HTML на выходе.",
-       "apihelp-expandtemplates-param-generatexml": "Создать XML-дерево разбора (заменить $1prop=parsetree).",
-       "apihelp-feedcontributions-description": "Возвращает список правок участника.",
-       "apihelp-feedcontributions-param-feedformat": "Биреү форматы",
-       "apihelp-feedcontributions-param-user": "Что пользователи, чтобы получить взносы.",
-       "apihelp-feedcontributions-param-namespace": "По какому пространству имён фильтровать вклад.",
+       "apihelp-expandtemplates-paramvalue-prop-modules": "Любые модули ResourceLoader, запрашиваемые функциями парсера на добавление в результат. Одновременно с <kbd>modules</kbd> должен быть запрошен либо <kbd>jsconfigvars</kbd>, либо <kbd>encodedjsconfigvars</kbd>.",
+       "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Возвращает переменные JavaScript с данными настроек для этой страницы",
+       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Возвращает переменные JavaScript с данными настроек для этой страницы в виде JSON-строки.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "Дерево парсинга XML входных данных.",
+       "apihelp-expandtemplates-param-includecomments": "Нужно ли включать комментарии HTML в результат.",
+       "apihelp-expandtemplates-param-generatexml": "Создать дерево парсинга XML (заменено $1prop=parsetree).",
+       "apihelp-expandtemplates-example-simple": "Развернуть вики-текст <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": "Ð\92зноÑ\81Ñ\8b Ñ\84илÑ\8cÑ\82Ñ\80а, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð¸Ð¼ÐµÑ\8eÑ\82 Ñ\8dÑ\82и Ñ\82еги.",
+       "apihelp-feedcontributions-param-tagfilter": "Ð\9fоказаÑ\82Ñ\8c Ð²ÐºÐ»Ð°Ð´, Ñ\81одеÑ\80жаÑ\89ий Ð´Ð°Ð½Ð½Ñ\8bе Ð¼ÐµÑ\82ки.",
        "apihelp-feedcontributions-param-deletedonly": "Показать только удалённые правки.",
        "apihelp-feedcontributions-param-toponly": "Показать только правки, являющиеся последними версиями.",
-       "apihelp-feedcontributions-param-newonly": "Показывать только правки, являющиеся созданием страниц.",
+       "apihelp-feedcontributions-param-newonly": "Показать только правки, являющиеся созданием страниц.",
        "apihelp-feedcontributions-param-hideminor": "Скрыть малые правки.",
-       "apihelp-feedcontributions-param-showsizediff": "Показать размер различия между версиями.",
+       "apihelp-feedcontributions-param-showsizediff": "Показать объём изменений между версиями.",
        "apihelp-feedcontributions-example-simple": "Показать вклад участника <kbd>Example</kbd>.",
+       "apihelp-feedrecentchanges-description": "Возвращает ленту последних изменений.",
+       "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": "СкÑ\80Ñ\8bÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f, Ð²Ð½ÐµÑ\81Ñ\91ннÑ\8bе Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñ\8bми Ñ\83Ñ\87аÑ\81Ñ\82никами.",
+       "apihelp-feedrecentchanges-param-hideanons": "СкÑ\80Ñ\8bÑ\82Ñ\8c Ð¿Ñ\80авки Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñ\8bÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ников.",
        "apihelp-feedrecentchanges-param-hideliu": "Скрыть правки зарегистрированных участников.",
-       "apihelp-feedrecentchanges-param-hidepatrolled": "Скрыть отпатруллированные правки.",
-       "apihelp-feedrecentchanges-param-hidemyself": "Скрыть изменения, сделанные текущим участником.",
-       "apihelp-feedrecentchanges-param-tagfilter": "Фильтр по тегам.",
+       "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-param-feedformat": "Биреү форматы.",
-       "apihelp-feedwatchlist-param-hours": "Был ваҡыттан алып үҙгәртелгән биттәр исемлеге",
+       "apihelp-feedrecentchanges-example-30days": "Список последних изменений за 30 дней.",
+       "apihelp-feedwatchlist-description": "Возвращает ленту списка наблюдения.",
+       "apihelp-feedwatchlist-param-feedformat": "Формат ленты.",
+       "apihelp-feedwatchlist-param-hours": "Список страниц, отредактированных столько часов назад.",
        "apihelp-feedwatchlist-param-linktosections": "Ссылаться прямо на разделы с изменениями, если возможно.",
-       "apihelp-feedwatchlist-example-default": "Күҙәтеү каналын күрһәтергә",
-       "apihelp-feedwatchlist-example-all6hrs": "Күҙәтелгән биттәрҙә һуңғы 6 сәғәт эсендәге үҙгәрештәрҙе күрһәтергә.",
-       "apihelp-filerevert-description": "Файлды иҫке версияға ҡайтарырға.",
-       "apihelp-filerevert-param-filename": "Целевое имя файла без префикса File:.",
-       "apihelp-filerevert-param-comment": "Загрузить комментарий.",
+       "apihelp-feedwatchlist-example-default": "Показать ленту списка наблюдения.",
+       "apihelp-feedwatchlist-example-all6hrs": "Показать все изменения на наблюдаемых страницах за последние 6 часов.",
+       "apihelp-filerevert-description": "Возвращение файла к старой версии.",
+       "apihelp-filerevert-param-filename": "Целевое имя файла без префикса «Файл:».",
+       "apihelp-filerevert-param-comment": "Комментарий загрузки.",
+       "apihelp-filerevert-param-archivename": "Архивное название возвращаемой версии.",
        "apihelp-filerevert-example-revert": "Откат <kbd>Wiki.png</kbd> к версии от <kbd>2011-03-05T15:27:40Z</kbd>.",
-       "apihelp-help-param-helpformat": "Белешмә яҙыу форматы.",
+       "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-recursive": "Вся справка в одном разделе.",
+       "apihelp-help-example-submodules": "Помощь по модулю <kbd>action=query</kbd> и его подмодулям.",
+       "apihelp-help-example-recursive": "Вся справка на одной странице.",
+       "apihelp-help-example-help": "Справка по самому модулю справки.",
+       "apihelp-help-example-query": "Справка по двум подмодулям 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-summary": "Описание записи журнала импорта.",
        "apihelp-import-param-xml": "Загруженный XML-файл.",
-       "apihelp-import-example-import": "Импортировать [[meta:Help:ParserFunctions]] с полной историей в пространство имён 100.",
+       "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>$1namespace</var>.",
+       "apihelp-import-param-tags": "Изменить метки записи в журнале импорта и нулевой правки в импортируемых страницах.",
+       "apihelp-import-example-import": "Импортировать [[meta:Help:ParserFunctions]] с полной историей правок в пространство имён 100.",
+       "apihelp-linkaccount-description": "Связать аккаунт третьей стороны с текущим участником.",
+       "apihelp-linkaccount-example-link": "Начать связывание аккаунта с <kbd>Example</kdb>.",
+       "apihelp-login-description": "Вход и получение аутентификационных cookie.\n\nЭто действие должно быть использовано только в комбинации со [[Special:BotPasswords]]; использование этого модуля для входа в основной аккаунт не поддерживается и может сбиться без предупреждения. Для безопасного входа в основной аккаунт, используйте <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "Вход и получение аутентификационных cookie.\n\nЭто действие не поддерживается и может сбиться без предупреждения. Для безопасного входа, используйте <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-mergehistory-description": "Объединение историй правок",
+       "apihelp-logout-example-logout": "Выйти из текущего участника.",
+       "apihelp-managetags-description": "Осуществление задач, связанных с изменением меток.",
+       "apihelp-managetags-param-operation": "Какую операцию выполнить:\n;create: Создать новую метку для ручного использования.\n;delete: Удалить метку из базы данных, что включает в себя удаление метки со всех версий и записей журналов, где она использовалось.\n;activate: Активировать изменение метки, позволив участникам устанавливать её вручную.\n;deactivate: Деактивировать изменение метки, запретив участникам устанавливать её вручную.",
+       "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-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-move-description": "Переместить страницу.",
-       "apihelp-move-param-to": "Заголовок, в который следует переименовать страницу.",
+       "apihelp-mergehistory-example-merge": "Переместить всю историю правок страницы <kbd>Oldpage</kbd> на страницу <kbd>Newpage</kdb>.",
+       "apihelp-mergehistory-example-merge-timestamp": "Переместить историю правок из <kbd>Oldpage</kbd>, совершённых до <kbd>2015-12-31T04:37:41Z</kbd>, на страницу <kbd>Newpage</kdb>.",
+       "apihelp-move-description": "Переименование страницы.",
+       "apihelp-move-param-from": "Название переименовываемой страницы. Нельзя использовать одновременно с <var>$1fromid</var>.",
+       "apihelp-move-param-fromid": "Идентификатор переименовываемой страницы. Нельзя использовать одновременно с <var>$1from</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-param-watch": "Добавить страницу и перенаправление в список наблюдения текущего участника.",
+       "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-opensearch-param-limit": "Максимальное число возвращаемых результатов.",
        "apihelp-opensearch-param-namespace": "Пространства имён для поиска.",
+       "apihelp-opensearch-param-suggest": "Ничего не делать, если <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> ложно.",
+       "apihelp-opensearch-param-redirects": "Как обрабатывать перенаправления:\n;return: Вернуть само перенаправление.\n;resolve: Вернуть целевую страницу. Может вернуть меньше $1limit результатов.\nПо историческим причинам значением по умолчанию является «return» для $1format=json и «resolve» для остальных форматов.",
        "apihelp-opensearch-param-format": "Формат вывода.",
+       "apihelp-opensearch-param-warningsaserror": "Если предупреждения возникают при <kbd>format=json</kbd>, вернуть ошибку API вместо того, чтобы игнорировать их.",
+       "apihelp-opensearch-example-te": "Найти страницы, начинающиеся с <kbd>Te</kbd>.",
+       "apihelp-options-description": "Смена настроек текущего участника.\n\nМенять можно только настройки, зарегистрированные в ядре или в одном из установленных расширений, а также настройки, чьи ключи начинаются с <code>userjs-</code> (предназначенные для использования в пользовательских скриптах).",
        "apihelp-options-param-reset": "Сбрасывает настройки на установленные по умолчанию.",
+       "apihelp-options-param-resetkinds": "Список типов сбрасываемых настроек, если задана опция <var>$1reset</var>.",
+       "apihelp-options-param-change": "Список изменений в формате название=значение (например, skin=vector). Если значения не даётся (нет даже знака равенства), например, названиенастройки|другаянастройка|, настройка будет возвращена в своё значение по умолчанию. Если какое-либо значение должно содержать знак пайпа (<kbd>|</kbd>), используйте [[Special:ApiHelp/main#main/datatypes|альтернативный разделитель значений]] для корректного проведения операции.",
+       "apihelp-options-param-optionname": "Название настройки, которая должна быть установлена в значение, переданное через <var>$1optionvalue</var>.",
+       "apihelp-options-param-optionvalue": "Значение настройки, заданной <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Сбросить все настройки.",
-       "apihelp-paraminfo-description": "Получить информацию о модулях API.",
+       "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-modules": "Список названий модулей (значения параметров <var>action</var> и <var>format</var>, или <kbd>main</kbd>). Можно указать подмодули с помощью <kbd>+</kbd>, все подмодули с помощью <kbd>+*</kbd>, или все подмодули рекурсивно с помощью <kbd>+**</kbd>.",
        "apihelp-paraminfo-param-helpformat": "Формат строк справки.",
-       "apihelp-parse-param-prop": "Какие части информации получить:",
-       "apihelp-parse-paramvalue-prop-text": "Дает разобранного текста в тексте.",
-       "apihelp-parse-paramvalue-prop-langlinks": "Возвращает язык ссылки в анализируемой wikitext.",
+       "apihelp-paraminfo-param-querymodules": "Список модулей query (значения параметров <var>prop</var>, <var>meta</var> или <var>list</var>). Используйте <kbd>$1modules=query+foo</kbd> вместо <kbd>$1querymodules=foo</kbd>.",
+       "apihelp-paraminfo-param-mainmodule": "Также получить информацию о главном модуле. Вместо этого используйте <kbd>$1modules=main</kbd>.",
+       "apihelp-paraminfo-param-pagesetmodule": "Также получить информацию о модуле pageset (предоставляющем titles= и синонимы).",
+       "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-description": "Парсит содержимое и возвращает результат парсинга.\n\nСм. различные prop-модули <kbd>[[Special:ApiHelp/query|action=query]]</kbd> для получения информации о текущей версии страницы.\n\nЕсть несколько способов указать текст для парсинга:\n# Указать страницы или версию, используя <var>$1page</var>, <var>$1pageid</var> или <var>$1oldid</var>.\n# Явно указать содержимое, используя <var>$1text</var>, <var>$1title</var> и <var>$1contentmodel</var>.\n# Указать описание правки. Параметру <var>$1prop</var> должно быть присвоено пустое значение.",
+       "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> и <var>$1title</var>.",
+       "apihelp-parse-param-pageid": "Анализировать содержимое этой страницы. Переопределяет <var>$1page</var>.",
+       "apihelp-parse-param-redirects": "Если значением <var>$1page</var> или <var>$1pageid</var> указано перенаправление, разрешить его.",
+       "apihelp-parse-param-oldid": "Распарсить содержимое этой версии. Переопределяет <var>$1page</var> и <var>$1pageid</var>.",
+       "apihelp-parse-param-prop": "Какую информацию включить:",
+       "apihelp-parse-paramvalue-prop-text": "Возвращает текст распарсенного вики-текста.",
+       "apihelp-parse-paramvalue-prop-langlinks": "Возвращает языковые ссылки из распарсенного вики-текста.",
+       "apihelp-parse-paramvalue-prop-categories": "Возвращает категории из проанализированного вики-текста.",
        "apihelp-parse-paramvalue-prop-categorieshtml": "Возвращает HTML-версию категорий.",
-       "apihelp-parse-param-disablepp": "Урынына <var>$1disablelimitreport</var> ҡулланырға.",
-       "apihelp-parse-param-preview": "Алдан ҡарау режимында синтаксик анализ",
-       "apihelp-parse-param-disabletoc": "Не включать в вывод таблицу содержания.",
-       "apihelp-parse-example-page": "анализ страницы",
-       "apihelp-parse-example-text": "Анализ wikitext.",
-       "apihelp-parse-example-summary": "Һығымтаны тикшереү.",
-       "apihelp-patrol-param-rcid": "Яңы үҙгәртеүҙәрҙе ҡарау идентификаторы.",
-       "apihelp-patrol-param-revid": "Ҡарау версияһы идентификаторы.",
-       "apihelp-patrol-example-rcid": "Һуңғы үҙгәрештәрҙе ҡарау.",
-       "apihelp-patrol-example-revid": "Яңынан ҡарау.",
-       "apihelp-protect-description": "Изменить уровень защиты страницы.",
-       "apihelp-protect-param-title": "Бит атамаһы. $1pageid менән бергә ҡулланылмай.",
-       "apihelp-protect-param-reason": "(ООН) һағы сәбәптәре.",
+       "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-revid": "Добавляет идентификатор версии распарсенной страницы.",
+       "apihelp-parse-paramvalue-prop-displaytitle": "Добавляет название проанализированного вики-текста.",
+       "apihelp-parse-paramvalue-prop-headitems": "<span class=\"apihelp-deprecated\">Не поддерживается.</span> Возвращает элементы, которые следует поместить в <code>&lt;head&gt;</code> страницы.",
+       "apihelp-parse-paramvalue-prop-headhtml": "Возвращает распарсенный <code>&lt;head&gt;</code> страницы.",
+       "apihelp-parse-paramvalue-prop-modules": "Возвращает использованные на странице модули ResourceLoader. Для загрузки, используйте <code>mw.loader.using()</code>. Одновременно с <kbd>modules</kbd> должно быть запрошено либо <kbd>jsconfigvars</kbd>, либо <kbd>encodedjsconfigvars</kbd>.",
+       "apihelp-parse-paramvalue-prop-jsconfigvars": "Возвращает переменные JavaScript с данными настроек для этой страницы. Для их применения используйте <code>mw.condig.set()</code>.",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Возвращает переменные JavaScript с данными настроек для этой страницы в виде 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-paramvalue-prop-parsewarnings": "Возвращает предупреждения, возникшие во время анализа.",
+       "apihelp-parse-param-wrapoutputclass": "CSS-класс, используемый для оборачивания вывода парсера.",
+       "apihelp-parse-param-pst": "Выполнить преобразование перед записью правки (PST) до того, как начать анализировать текст. Доступно только когда используется с текстом.",
+       "apihelp-parse-param-onlypst": "Выполнить преобразование перед записью правки (PST) входных данных, но не парсить их. Возвращает тот же вики-текст после применения PST. Доступно только при применении с <var>$1text</var>.",
+       "apihelp-parse-param-effectivelanglinks": "Включает языковые ссылки, обеспечиваемые расширениями (для использования с <kbd>$1prop=langlinks</kbd>).",
+       "apihelp-parse-param-section": "Распарсить содержимое только секции с заданным номером.\n\nЕсли задан <kbd>new</kbd>, распарсить <var>$1text</var> и <var>$1sectiontitle</var> так, как будто добавлена новая секция на страницу.\n\n<kbd>new</kbd> доступен только при заданном <var>text</var>.",
+       "apihelp-parse-param-sectiontitle": "Название новой секции, когда <var>section</var> имеет значение <kbd>new</kbd>.\n\nВ отличие от редактирования страницы, оно не примет значение параметра <var>summary</var>, если опустить его или оставить пустым.",
+       "apihelp-parse-param-disablelimitreport": "Опустить отчёт о лимите («NewPP limit report») из результата парсинга.",
+       "apihelp-parse-param-disablepp": "Вместо этого используйте <var>$1disablelimitreport</var>.",
+       "apihelp-parse-param-disableeditsection": "Опустить ссылки на редактирование разделов из результата парсинга.",
+       "apihelp-parse-param-disabletidy": "Не проводить очистку HTML (например, с помощью tidy) результатов парсинга.",
+       "apihelp-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-param-contentmodel": "Модель содержимого входного текста. Если пропущена, должен быть задан $1title, и значение по умолчанию будет взято в зависимости от указанного названия. Доступно только при использовании с $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": "Идентификатор (раз)защищаемой страницы. Не может использоваться одновременно с $1title.",
+       "apihelp-protect-param-protections": "Список уровней защиты в формате <kbd>действие=уровень</kbd> (например, <kbd>edit=sysop</kbd>). Уровень <kbd>all</kbd> означает, что кто угодно может осуществлять действие, то есть, нет ограничений.\n\n<strong>Примечания:</strong> Все неперечисленные действия потеряют уровни защиты.",
+       "apihelp-protect-param-expiry": "Временная метка истечения защиты. Если задана только одна метка, она будет использована для всех защит. Используйте <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> или <kbd>never</kbd> для бессрочных защит.",
+       "apihelp-protect-param-reason": "Причина (раз)защиты.",
+       "apihelp-protect-param-tags": "Изменить метки записи в журнале защиты.",
+       "apihelp-protect-param-cascade": "Активировать каскадную защиту (то есть, защитить включённые шаблоны и использованные изображения). Игнорируется, если ни один из заданных уровней не поддерживает каскадную защиту.",
+       "apihelp-protect-param-watch": "Если задан, добавить (раз)защищаемую страницу в список наблюдения текущего участника.",
+       "apihelp-protect-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.",
        "apihelp-protect-example-protect": "Защитить страницу.",
-       "apihelp-protect-example-unprotect": "Снять защиту страницы, установив ограничения <kbd>all</kbd> (т. е. любой желающий может принять меры).",
-       "apihelp-protect-example-unprotect2": "Бер ниндәй сикләүҙәр ҡуймай биттән һаҡлауҙы алырға.",
-       "apihelp-purge-param-forcelinkupdate": "Обновление связей таблиц.",
+       "apihelp-protect-example-unprotect": "Снять защиту страницы, установив ограничения <kbd>all</kbd> (то есть, позволив всем проводить действия над страницей).",
+       "apihelp-protect-example-unprotect2": "Снять защиту страницу, не указав ограничений.",
+       "apihelp-purge-description": "Очистка кэша заданных страниц.",
+       "apihelp-purge-param-forcelinkupdate": "Обновить таблицы ссылок.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Обновить таблицу ссылок для данной страницы, а также всех страниц, использующих данную как шаблон.",
-       "apihelp-purge-example-generator": "Продувка первые 10 страниц в основном пространстве имен.",
-       "apihelp-query-param-list": "Какие списки использовать",
-       "apihelp-query-param-meta": "Какие метаданные использовать",
-       "apihelp-query+allcategories-description": "Перечислить все категории.",
-       "apihelp-query+allcategories-param-prefix": "Был мәғәнәнән башланған бар атамаларҙы категориялар буйынса эҙләргә.",
-       "apihelp-query+allcategories-param-dir": "Сортлау йүнәлештәре.",
+       "apihelp-purge-example-simple": "Очистить кэш для страниц <kbd>Main Page</kbd> и <kbd>API</kbd>.",
+       "apihelp-purge-example-generator": "Очистить кэш первых 10 страниц в основном пространстве имен.",
+       "apihelp-query-description": "Получение данных из и о MediaWiki.\n\nВсе изменения данных потребуют предварительного использования модуля query для получения токена, чтобы предотвратить злоупотребление вредоносными сайтами.",
+       "apihelp-query-param-prop": "Какие использовать свойства для запрашиваемых страниц.",
+       "apihelp-query-param-list": "Какие списки использовать.",
+       "apihelp-query-param-meta": "Какие метаданные использовать.",
+       "apihelp-query-param-indexpageids": "Включить дополнительную секцию pageids, содержащую список идентификаторов всех возвращённых страниц.",
+       "apihelp-query-param-export": "Экспортировать текущую версию для всех данных или сгенерированных страниц.",
+       "apihelp-query-param-exportnowrap": "Вернуть экспортируемый XML без оборачивания его в XML-результат (тот же формат, что и в [[Special:Export]]). Можно использовать только одновременно с $1export.",
+       "apihelp-query-param-iwurl": "Возвращать ли полную ссылку, если названием является интервики-ссылка.",
+       "apihelp-query-param-rawcontinue": "Вернуть сырые данные в <samp>query-continue</samp> для продолжения.",
+       "apihelp-query-example-revisions": "Получить [[Special:ApiHelp/query+siteinfo|site info]] и [[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-min": "Вернуть только категории, в которых не меньше заданного числа страниц.",
+       "apihelp-query+allcategories-param-max": "Вернуть только категории, в которых не больше заданного числа страниц.",
        "apihelp-query+allcategories-param-limit": "Сколько категорий вернуть.",
        "apihelp-query+allcategories-param-prop": "Какие свойства получить:",
-       "apihelp-query+allcategories-paramvalue-prop-size": "Категорияларға биттәр һаны өҫтәү",
-       "apihelp-query+allcategories-example-size": "Биттәр һаны буйынса мәғлүмәтле категориялар исемлеге.",
-       "apihelp-query+allcategories-example-generator": "<kbd>исемлек</kbd> категориялар битенән мәғлүмәт алырға.",
-       "apihelp-query+alldeletedrevisions-description": "Бар мөхәррирләү исемлеге ҡулланыусы тарафынан юйылған.",
-       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "<var>$3ҡулланыусының</var> менән генә ҡулланыла ала.",
-       "apihelp-query+alldeletedrevisions-param-start": "Һанауҙы башлау ваҡытын билдәләү",
-       "apihelp-query+alldeletedrevisions-param-end": "Һанай башлау ваҡытын билдәләү.",
-       "apihelp-query+alldeletedrevisions-param-prefix": "Был мәғәнәнән башланған бар атамаларҙы категориялар буйынса эҙләргә.",
-       "apihelp-query+alldeletedrevisions-param-user": "Бары тик был ҡулланыусының үҙгәртеүҙәр исемлеге.",
-       "apihelp-query+alldeletedrevisions-param-excludeuser": "Был ҡулланыусының үҙгәртеүҙәр исемлеге түгел.",
-       "apihelp-query+alldeletedrevisions-param-namespace": "Бары тик был исемдәр арауығындағы биттәр исемлеге.",
-       "apihelp-query+alldeletedrevisions-example-ns-main": "Төп исемдәр арауығында юйылған тәүге 50 үҙгәртеү исемлеге.",
-       "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-title": "Файл атамаһына ҡуша.",
-       "apihelp-query+allfileusages-param-limit": "Нисә битте тергеҙергә?",
-       "apihelp-query+allfileusages-param-dir": "Һанау йүнәлеше.",
-       "apihelp-query+allfileusages-example-unique": "Атамаларҙың уҙенсәлекле файлдары исемлеге.",
-       "apihelp-query+allfileusages-example-unique-generator": "Төшөп ҡалғандарҙы айырып, барлыҡ исем-һылтанмаларҙы алырға.",
-       "apihelp-query+allfileusages-example-generator": "Файлдар менән биттәр бар.",
-       "apihelp-query+allimages-description": "Бер-бер артлы бөтә образдарҙы һанап сығырға.",
-       "apihelp-query+allimages-param-sort": "Сортировкалау үҙенсәлектәре.",
-       "apihelp-query+allimages-param-dir": "Һанау йүнәлеше.",
-       "apihelp-query+allimages-param-minsize": "Һүрәттәр лимиты (байттарҙа).",
-       "apihelp-query+allimages-param-maxsize": "Бар һүрәттәр лимиты (байттарҙа).",
-       "apihelp-query+allimages-param-limit": "Кире ҡайтыу өсөн образдар һаны.",
-       "apihelp-query+allimages-example-B": "<kbd>Б</kbd> хәрефенән башланған файлдар исемлеген күрһәтергә.",
+       "apihelp-query+allcategories-paramvalue-prop-size": "Добавляет количество страниц в категории.",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "Отмечает категории, скрытые магическим словом <code>_&#95;HIDDENCAT_&#95;</code>.",
+       "apihelp-query+allcategories-example-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-start": "Временная метка, с которой начать перечисление.",
+       "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-miser-user-namespace": "<strong>Примечание:</strong> Из-за [[mw:Special:MyLanguage/Manual:$wgMiserMode|жадного режима]] одновременное использование <var>$1user</var> и <var>$1namespace</var> может привести к меньшему, чем <var>$1limit</var>, числу результатов перед продолжением; в крайнем случае, может вернуться и ноль результатов.",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "При использовании в качестве генератора, генерирует названия страниц вместо идентификаторов версий.",
+       "apihelp-query+alldeletedrevisions-example-user": "Перечислить последние 50 удалённых правок участника <kbd>Example</kbd>.",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "Перечислить первые 50 удалённых правок в основном пространстве.",
+       "apihelp-query+allfileusages-description": "Перечисление всех использований файлов, в том числе несуществующих.",
+       "apihelp-query+allfileusages-param-from": "Название файла, с которого начать перечисление.",
+       "apihelp-query+allfileusages-param-to": "Название файла, на котором закончить перечисление.",
+       "apihelp-query+allfileusages-param-prefix": "Найти все названия файлов, начинающиеся с этого значения.",
+       "apihelp-query+allfileusages-param-unique": "Показывать только уникальные названия файлов. Не может быть использовано одновременно с $1prop=ids.\nПри использовании в качестве генератора, перечисляет целевые страницы вместо исходных.",
+       "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+allfileusages-param-dir": "Порядок перечисления.",
+       "apihelp-query+allfileusages-example-B": "Список названий файлов, включая несуществующих, с идентификаторами использующих их страниц, начиная с <kbd>B</kbd>.",
+       "apihelp-query+allfileusages-example-unique": "Список уникальных названий файлов.",
+       "apihelp-query+allfileusages-example-unique-generator": "Список всех названий файлов с отметкой несуществующих.",
+       "apihelp-query+allfileusages-example-generator": "Список страниц, содержащих файлы.",
+       "apihelp-query+allimages-description": "Перечисление всех файлов.",
+       "apihelp-query+allimages-param-sort": "Свойство для сортировки.",
+       "apihelp-query+allimages-param-dir": "Порядок перечисления.",
+       "apihelp-query+allimages-param-from": "Название изображения, с которого начать перечисление. Можно использовать только одновременно с $1sort=name.",
+       "apihelp-query+allimages-param-to": "Название изображения, на котором закончить перечисление. Можно использовать только одновременно с $1sort=name.",
+       "apihelp-query+allimages-param-start": "Временная метка, с которой начать перечисление. Можно использовать только одновременно с $1sort=timestamp.",
+       "apihelp-query+allimages-param-end": "Временная метка, на которой закончить перечисление. Можно использовать только одновременно с $1sort=timestamp.",
+       "apihelp-query+allimages-param-prefix": "Найти все названия файлов, начинающиеся с этого значения. Можно использовать только одновременно с $1sort=name.",
+       "apihelp-query+allimages-param-minsize": "Ограничить изображения этим числом байт снизу.",
+       "apihelp-query+allimages-param-maxsize": "Ограничить изображения этим числом байт сверху.",
+       "apihelp-query+allimages-param-sha1": "SHA1-хэш этого изображения. Переопределяет $1sha1base36.",
+       "apihelp-query+allimages-param-sha1base36": "SHA1-хэш этого изображения в base 36 (используется в MediaWiki).",
+       "apihelp-query+allimages-param-user": "Вернуть только файлы, загруженные этим участником. Может быть использовано только одновременно с $1sort=timestamp и не может одновременно с $1filterbots.",
+       "apihelp-query+allimages-param-filterbots": "Как отфильтровывать файлы, загруженные ботами. Может быть использовано только одновременно с $1sort=timestamp и не может одновременно с $1user.",
+       "apihelp-query+allimages-param-mime": "Какие типы MIME искать, например, <kbd>image/jpeg</kbd>.",
+       "apihelp-query+allimages-param-limit": "Сколько изображений вернуть.",
+       "apihelp-query+allimages-example-B": "Показать список файлов, начиная с буквы <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "Показать список недавно загруженных файлов, аналогично [[Special:NewFiles]].",
-       "apihelp-query+allimages-example-generator": "<kbd>Т</kbd> хәрефенән башланған 4 файл хаҡында мәғлүмәтте  күрһәтергә.",
-       "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-title": "Һылтанма атамаһын ҡуша.",
-       "apihelp-query+alllinks-param-namespace": "Һанау өсөн исемдәр арауығы.",
-       "apihelp-query+alllinks-param-limit": "Нисә элементты тергеҙергә?",
-       "apihelp-query+alllinks-param-dir": "Һанау йүнәлеше.",
-       "apihelp-query+alllinks-example-unique": "Атамаларҙың үҙенсәлекле исемдәре бәйләнгән.",
-       "apihelp-query+alllinks-example-unique-generator": "Получить все названия-ссылки, выделяя пропущенные.",
-       "apihelp-query+alllinks-example-generator": "Һылтанмалы биттәр бар.",
-       "apihelp-query+allmessages-description": "Был сайттан хәбәр ҡайтарыу.",
-       "apihelp-query+allmessages-param-prop": "Ниндәй үҙенсәлектәрҙе ҡайтарырға.",
-       "apihelp-query+allmessages-param-args": "Аргументтар Хәбәрҙәрҙә биреләсәк.",
+       "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-unique": "Показывать только уникальные названия ссылаемых страниц. Не может быть использовано одновременно с $1prop=ids.\nПри использовании в качестве генератора, перечисляет целевые страницы вместо исходных.",
+       "apihelp-query+alllinks-param-prop": "Какую информацию включить:",
+       "apihelp-query+alllinks-paramvalue-prop-ids": "Добавляет идентификатор ссылаемой страницы (не может быть использовано одновременно с <var>$1unique</var>).",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Добавляет название ссылки.",
+       "apihelp-query+alllinks-param-namespace": "Пространство имён для перечисления.",
+       "apihelp-query+alllinks-param-limit": "Сколько элементов вернуть.",
+       "apihelp-query+alllinks-param-dir": "Порядок перечисления.",
+       "apihelp-query+alllinks-example-B": "Список заголовков ссылаемых страниц, включая несуществующих, с идентификаторами страниц, ссылающихся на них, начиная с <kbd>B</kbd>.",
+       "apihelp-query+alllinks-example-unique": "Список уникальных названий ссылаемых страниц.",
+       "apihelp-query+alllinks-example-unique-generator": "Список всех ссылаемых страниц с отметкой несуществующих.",
+       "apihelp-query+alllinks-example-generator": "Список страниц, содержащих ссылки.",
+       "apihelp-query+allmessages-description": "Возвращает сообщения с этого сайта.",
+       "apihelp-query+allmessages-param-messages": "Какие сообщения выводить. <kbd>*</kbd> (по умолчанию) означает «все сообщения».",
+       "apihelp-query+allmessages-param-prop": "Какие свойства получить:",
+       "apihelp-query+allmessages-param-enableparser": "Установите, чтобы активировать парсер, который будет обрабатывать вики-текст сообщений (подставлять магические слова, обрабатывать шаблоны, и так далее).",
+       "apihelp-query+allmessages-param-nocontent": "Если установлен, ничего не делать с содержимым сообщений перед выводом.",
+       "apihelp-query+allmessages-param-includelocal": "Также включить локальные сообщения, то есть, сообщения, не существующие в программе, но существующие в пространстве имён {{ns:MediaWiki}}. Это перечислит все страницы из пространства {{ns:MediaWiki}}, поэтому в результат также могут попасть страницы, не являющимися сообщениями — например, [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-args": "Аргументы, подставляемые в сообщение.",
+       "apihelp-query+allmessages-param-filter": "Вернуть только сообщения, чьи названия содержат эту подстроку.",
+       "apihelp-query+allmessages-param-customised": "Вернуть только сообщения в этом состоянии кастомизации.",
        "apihelp-query+allmessages-param-lang": "Вернуть сообщения на этом языке.",
-       "apihelp-query+blocks-example-simple": "Список блоков.",
-       "apihelp-query+categories-param-limit": "Сколько категорий на возврат.",
+       "apihelp-query+allmessages-param-from": "Вернуть сообщения, начиная с данного.",
+       "apihelp-query+allmessages-param-to": "Вернуть сообщения, заканчивая на данном.",
+       "apihelp-query+allmessages-param-title": "Название страницы, используемой для контекста при анализе сообщения (для опции $1enableparser).",
+       "apihelp-query+allmessages-param-prefix": "Вернуть сообщения с заданным префиксом.",
+       "apihelp-query+allmessages-example-ipb": "Показать сообщения, начинающиеся с <kbd>ipb-</kbd>.",
+       "apihelp-query+allmessages-example-de": "Показать сообщения <kbd>august</kbd> и <kbd>mainpage</kbd> на немецком языке.",
+       "apihelp-query+allpages-description": "Перечисление всех страниц в данном пространстве имён.",
+       "apihelp-query+allpages-param-from": "Название страницы, с которой начать перечисление.",
+       "apihelp-query+allpages-param-to": "Название страницы, на которой закончить перечисление.",
+       "apihelp-query+allpages-param-prefix": "Найти все названия страниц, начинающиеся с этого значения.",
+       "apihelp-query+allpages-param-namespace": "Пространство имён для перечисления.",
+       "apihelp-query+allpages-param-filterredir": "Какие страницы перечислять.",
+       "apihelp-query+allpages-param-minsize": "Ограничить страницы этим числом байт снизу.",
+       "apihelp-query+allpages-param-maxsize": "Ограничить страницы этим числом байт сверху.",
+       "apihelp-query+allpages-param-prtype": "Перечислить только защищённые страницы.",
+       "apihelp-query+allpages-param-prlevel": "Отфильтровывать страницы, основываясь на уровне защиты (должно быть использовано одновременно с параметром $1prtype=).",
+       "apihelp-query+allpages-param-prfiltercascade": "Отфильтровывать страницы, основываясь на каскадности (игнорируется, если $1prtype не задан).",
+       "apihelp-query+allpages-param-limit": "Сколько страниц вернуть.",
+       "apihelp-query+allpages-param-dir": "Порядок перечисления.",
+       "apihelp-query+allpages-param-filterlanglinks": "Отфильтровывать страницы, основываясь на наличие на странице языковых ссылок. Обратите внимание: языковые ссылки, добавленные расширениями, могут не учитываться.",
+       "apihelp-query+allpages-param-prexpiry": "Отфильтровывать страницы, основываясь на длительности защиты:\n;indefinite: Получить только страницы с неограниченной защитой.\n;definite: Получить только страницы с заданной длительностью защиты.\n;all: Получить страницы с любой длительностью защиты.",
+       "apihelp-query+allpages-example-B": "Показать список страниц, начиная с буквы <kbd>B</kbd>.",
+       "apihelp-query+allpages-example-generator": "Получить информацию о четырёх страницах, начиная с буквы <kbd>T</kbd>.",
+       "apihelp-query+allpages-example-generator-revisions": "Показать содержимое первых двух страниц, не являющихся перенаправлениями, начиная с <kbd>Re</kbd>.",
+       "apihelp-query+allredirects-description": "Перечисление всех перенаправлений на заданное пространство имён.",
+       "apihelp-query+allredirects-param-from": "Название перенаправления, с которого начать перечисление.",
+       "apihelp-query+allredirects-param-to": "Название перенаправления, на котором закончить перечисление.",
+       "apihelp-query+allredirects-param-prefix": "Найти все названия целевых страниц, начинающихся с этого значения.",
+       "apihelp-query+allredirects-param-unique": "Показывать только уникальные целевые страницы. Не может быть использовано одновременно с $1prop=ids|fragment|interwiki. При использовании в качестве генератора, перечисляет целевые страницы вместо исходных.",
+       "apihelp-query+allredirects-param-prop": "Какую информацию включить:",
+       "apihelp-query+allredirects-paramvalue-prop-ids": "Добавляет идентификатор перенаправляемой страницы (не может быть использовано одновременно с <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Добавляет название перенаправления.",
+       "apihelp-query+allredirects-paramvalue-prop-fragment": "Добавляет фрагмент из перенаправления при наличии (не может быть использовано одновременно с <var>$1unique</var>).",
+       "apihelp-query+allredirects-paramvalue-prop-interwiki": "Добавляет префикс интервики к редиректу при наличии (не может быть использовано одновременно с <var>$1unique</var>).",
+       "apihelp-query+allredirects-param-namespace": "Пространство имён для перечисления.",
+       "apihelp-query+allredirects-param-limit": "Сколько элементов вернуть.",
+       "apihelp-query+allredirects-param-dir": "Порядок перечисления.",
+       "apihelp-query+allredirects-example-B": "Список целевых страниц, в включая несуществующих, с идентификаторами перенаправлений, начиная с буквы <kbd>B</kbd>.",
+       "apihelp-query+allredirects-example-unique": "Список уникальных целевых страниц.",
+       "apihelp-query+allredirects-example-unique-generator": "Список всех целевых страниц с отметкой несуществующих.",
+       "apihelp-query+allredirects-example-generator": "Список страниц, содержащих перенаправления.",
+       "apihelp-query+allrevisions-description": "Перечисление всех версий.",
+       "apihelp-query+allrevisions-param-start": "Временная метка, с которой начать перечисление.",
+       "apihelp-query+allrevisions-param-end": "Временная метка, на которой закончить перечисление.",
+       "apihelp-query+allrevisions-param-user": "Только правки данного участника.",
+       "apihelp-query+allrevisions-param-excludeuser": "Не перечислять правки данного участника.",
+       "apihelp-query+allrevisions-param-namespace": "Перечислять только страницы этого пространства имён.",
+       "apihelp-query+allrevisions-param-generatetitles": "При использовании в качестве генератора, генерирует названия страниц вместо идентификаторов версий.",
+       "apihelp-query+allrevisions-example-user": "Перечислить последние 50 правок участника <kbd>Example</kbd>.",
+       "apihelp-query+allrevisions-example-ns-main": "Перечислить первые 50 правок в основном пространстве.",
+       "apihelp-query+mystashedfiles-description": "Получить список файлов в тайнике (upload stash) текущего участника.",
+       "apihelp-query+mystashedfiles-param-prop": "Какие свойства файлов запрашивать.",
+       "apihelp-query+mystashedfiles-paramvalue-prop-size": "Запросить размер и разрешение изображения.",
+       "apihelp-query+mystashedfiles-paramvalue-prop-type": "Запросить MIME- и медиа-тип файла.",
+       "apihelp-query+mystashedfiles-param-limit": "Сколько файлов получить.",
+       "apihelp-query+mystashedfiles-example-simple": "Получить ключ, размер и разрешение файлов в тайнике текущего участника.",
+       "apihelp-query+alltransclusions-description": "Перечисление всех включений (страниц, вставленных с помощью &#123;&#123;x&#125;&#125;), включая несуществующие.",
+       "apihelp-query+alltransclusions-param-from": "Название включения, с которого начать перечисление.",
+       "apihelp-query+alltransclusions-param-to": "Название включения, на котором закончить перечисление.",
+       "apihelp-query+alltransclusions-param-prefix": "Найти все названия включений, начинающиеся с этого значения.",
+       "apihelp-query+alltransclusions-param-unique": "Показывать только уникальные названия включений. Не может быть использовано одновременно с $1prop=ids.\nПри использовании в качестве генератора, перечисляет целевые страницы вместо исходных.",
+       "apihelp-query+alltransclusions-param-prop": "Какую информацию включить:",
+       "apihelp-query+alltransclusions-paramvalue-prop-ids": "Добавляет идентификаторы включающих страниц (не может быть использовано одновременно с $1unique).",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "Добавляет название включения.",
+       "apihelp-query+alltransclusions-param-namespace": "Пространство имён для перечисления.",
+       "apihelp-query+alltransclusions-param-limit": "Сколько элементов вернуть.",
+       "apihelp-query+alltransclusions-param-dir": "Порядок перечисления.",
+       "apihelp-query+alltransclusions-example-B": "Списки заголовков включаемых страниц, в том числе несуществующих, с идентификаторами включающих их страниц, начиная с буквы <kbd>B</kbd>.",
+       "apihelp-query+alltransclusions-example-unique": "Список уникальных включаемых названий.",
+       "apihelp-query+alltransclusions-example-unique-generator": "Список всех включаемых страниц с отметкой несуществующих.",
+       "apihelp-query+alltransclusions-example-generator": "Список страниц, содержащих включения.",
+       "apihelp-query+allusers-description": "Перечисление всех зарегистрированных участников.",
+       "apihelp-query+allusers-param-from": "Ник, с которого начать перечисление.",
+       "apihelp-query+allusers-param-to": "Ник, на котором закончить перечисление.",
+       "apihelp-query+allusers-param-prefix": "Найти все ники, начинающиеся с этого значения.",
+       "apihelp-query+allusers-param-dir": "Порядок сортировки.",
+       "apihelp-query+allusers-param-group": "Включать участников только из данных групп.",
+       "apihelp-query+allusers-param-excludegroup": "Исключать участников из данных групп.",
+       "apihelp-query+allusers-param-rights": "Включать только участников с данными правами. Участники с правами, предоставляемыми автоматически присваиваемыми группами — такими, как *, user или autoconfirmed, — не включаются.",
+       "apihelp-query+allusers-param-prop": "Какую информацию включить:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "Добавляет информацию о текущих блокировках участника.",
+       "apihelp-query+allusers-paramvalue-prop-groups": "Перечисляет группы, в которые входит участник. Это значительно нагружает сервера, что может привести к возвращению меньшего числа результатов, чем указанный лимит.",
+       "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Перечисляет группы, в которые участник был включён автоматически.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "Перечисляет права, которые есть у участника.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "Добавляет счётчик правок участника.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "Добавляет метку времени, когда участник был зарегистрирован, если она доступна (может быть пустым).",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "Добавляет центральный идентификатор и статус прикрепления участника.",
+       "apihelp-query+allusers-param-limit": "Сколько ников вернуть.",
+       "apihelp-query+allusers-param-witheditsonly": "Перечислять только участников, совершавших правки.",
+       "apihelp-query+allusers-param-activeusers": "Перечислять только участников, которые были активны в последние $1 {{PLURAL:$1|день|дня|дней}}.",
+       "apihelp-query+allusers-param-attachedwiki": "С <kbd>$1prop=centralids</kbd>, также отображает, прикреплён ли к вики участник с этим идентификатором.",
+       "apihelp-query+allusers-example-Y": "Список участников, начиная с <kbd>Y</kbd>.",
+       "apihelp-query+authmanagerinfo-description": "Получение информации о текущем статусе аутентификации.",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Проверить, достаточен ли текущий статус для осуществления чувствительных к безопасности операций.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Получить информацию о аутентификационных запросах, необходимых для указанного действия аутентификации.",
+       "apihelp-query+authmanagerinfo-example-login": "Получить запросы, которые могут быть использованы на момент начала входа.",
+       "apihelp-query+authmanagerinfo-example-login-merged": "Получить запросы, которые могут быть использованы в момент начала авторизации с объединёнными полями формы.",
+       "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Проверить, необходима ли аутентификация для действия <kbd>foo</kbd>.",
+       "apihelp-query+backlinks-description": "Получение списка страниц, ссылающихся на данную страницу.",
+       "apihelp-query+backlinks-param-title": "Заголовок для поиска. Не может быть использован одновременно с <var>$1pageid</var>.",
+       "apihelp-query+backlinks-param-pageid": "Идентификатор страницы для поиска. Не может быть использован одновременно с <var>$1title</var>.",
+       "apihelp-query+backlinks-param-namespace": "Пространство имён для перечисления.",
+       "apihelp-query+backlinks-param-dir": "Порядок перечисления.",
+       "apihelp-query+backlinks-param-filterredir": "Как обрабатывать перенаправления. Если присвоено значение <kbd>nonredirects</kbd> при заданном <var>$1redirect</var>, это применяется только ко второму уровню.",
+       "apihelp-query+backlinks-param-limit": "Сколько страниц вернуть. Если задан <var>$1redirect</var>, лимит применяется к каждому уровню по отдельности (что означает, что всего может вернуться до 2 * <var>$1limit</var> результатов).",
+       "apihelp-query+backlinks-param-redirect": "Если ссылающаяся страница является перенаправлением, найти также все страницы, которые ссылаются на это перенаправление. Максимальный лимит становится в два раза меньше.",
+       "apihelp-query+backlinks-example-simple": "Показать ссылки на <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Получить информацию о страницах, ссылающихся на <kbd>Main page</kbd>.",
+       "apihelp-query+blocks-description": "Перечисление всех заблокированных участников и IP-адресов.",
+       "apihelp-query+blocks-param-start": "Временная метка, с которой начать перечисление.",
+       "apihelp-query+blocks-param-end": "Временная метка, на которой закончить перечисление.",
+       "apihelp-query+blocks-param-ids": "Список идентификаторов блокировки (необязательно).",
+       "apihelp-query+blocks-param-users": "Список искомых участников (необязательно).",
+       "apihelp-query+blocks-param-ip": "Получить все блокировки, применённые к этому IP-адресу или диапазону CIDR, включая блокировки диапазонов.\nНе может быть использовано одновременно с <var>$3users</var>. Диапазоны CIDR шире IPv4/$1 или IPv6/$2 не поддерживаются.",
+       "apihelp-query+blocks-param-limit": "Максимальное число блокировок в списке.",
+       "apihelp-query+blocks-param-prop": "Какие свойства получить:",
+       "apihelp-query+blocks-paramvalue-prop-id": "Добавляет идентификатор блокировки.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Добавляет ник заблокированного участника.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Добавляет идентификатор заблокированного участника.",
+       "apihelp-query+blocks-paramvalue-prop-by": "Добавляет ник заблокировавшего участника.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "Добавляет идентификатор заблокировавшего участника.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "Добавляет метку времени, когда была дана блокировка.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "Добавляет метку времени, когда блокировка истечёт.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "Добавляет причину блокировки.",
+       "apihelp-query+blocks-paramvalue-prop-range": "Добавляет диапазон IP-адресов, затронутых блокировкой.",
+       "apihelp-query+blocks-paramvalue-prop-flags": "Добавляет бану метку (autoblock, anonoly, и так далее).",
+       "apihelp-query+blocks-param-show": "Показать только элементы, удовлетворяющие этим критериям.\nНапример, чтобы отобразить только бессрочные блокировки IP-адресов, установите <kbd>$1show=ip|!temp</kbd>.",
+       "apihelp-query+blocks-example-simple": "Список блокировок.",
+       "apihelp-query+blocks-example-users": "Список блокировок участников <kbd>Alice</kbd> и <kbd>Bob</kbd>.",
+       "apihelp-query+categories-description": "Перечисление всех категорий, которым принадлежит страница.",
+       "apihelp-query+categories-param-prop": "Какие дополнительные свойства получить для каждой категории:",
+       "apihelp-query+categories-paramvalue-prop-sortkey": "Добавляет ключ сортировки (шестнадцатеричная строка) и префикс ключа сортировки (человеко-читаемая часть) для категории.",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "Добавляет метку времени, когда категория была добавлена.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "Отмечает категории, скрытые магическим словом <code>_&#95;HIDDENCAT_&#95;</code>.",
+       "apihelp-query+categories-param-show": "Какие типы категорий показать.",
+       "apihelp-query+categories-param-limit": "Сколько категорий вернуть.",
+       "apihelp-query+categories-param-categories": "Перечислять только данные категории. Полезно для проверки, включена ли конкретная страница в конкретную категорию.",
+       "apihelp-query+categories-param-dir": "Порядок перечисления.",
+       "apihelp-query+categories-example-simple": "Получить список категорий, в которые включена страница <kbd>Albert Einstein</kbd>.",
+       "apihelp-query+categories-example-generator": "Получить информацию о всех категориях, использованных на странице <kbd>Albert Einstein</kbd>.",
+       "apihelp-query+categoryinfo-description": "Возвращение информации о конкретных категориях.",
+       "apihelp-query+categoryinfo-example-simple": "Получить информацию о <kbd>Category:Foo</kbd> и <kbd>Category:Bar</kbd>.",
+       "apihelp-query+categorymembers-description": "Перечисление всех страниц в данной категории.",
+       "apihelp-query+categorymembers-param-title": "Страницы какой категории перечислять (обязательно). Префикс <kbd>{{ns:category}}:</kbd> должен быть включён. Не может быть использовано одновременно с <var>$1pageid</var>.",
+       "apihelp-query+categorymembers-param-pageid": "Идентификатор перечисляемой категории. Не может быть использовано одновременно с <var>$1title</var>.",
+       "apihelp-query+categorymembers-param-prop": "Какую информацию включить:",
+       "apihelp-query+categorymembers-paramvalue-prop-ids": "Добавляет идентификатор страницы.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Добавляет заголовок и идентификатор пространства имён страницы.",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Добавляет ключ, используемый для сортировки внутри категории (шестнадцатеричная строка).",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Добавляет префикс ключа, используемого для сортировки внутри категории (человеко-читаемая часть ключа).",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "Добавляет тип категоризованной страницы (<samp>page</samp>, <samp>subcat</samp> или <samp>file</samp>).",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Добавляет метку времени, когда страница была включена.",
+       "apihelp-query+categorymembers-param-namespace": "Включать только страница из этих пространств имён. Обратите внимание, что вместо <kbd>$1namespace=14</kbd> или <kbd>6</kbd> могут быть использованы <kbd>$1type=subcat</kbd> или <kbd>$1type=file</kbd>.",
+       "apihelp-query+categorymembers-param-type": "Какие типы страниц включать. Игнорируется при <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-limit": "Максимальное число возвращаемых страниц.",
        "apihelp-query+categorymembers-param-sort": "Свойство для сортировки.",
-       "apihelp-query+categorymembers-param-startsortkey": "Использовать $1starthexsortkey вместо.",
-       "apihelp-query+categorymembers-param-endsortkey": "Использовать $1endhexsortkey вместо.",
-       "apihelp-query+deletedrevs-param-limit": "Исемлектәге яҙмаларҙың иң күбе.",
-       "apihelp-query+deletedrevs-example-mode1": "Юҡ ителгән һуңғы биттәрҙең исемлеге, баш биттең<kbd>-һы </kbd> һәм<kbd>әйтергә:баш биттең /kbd>-һы,континент менән(режим 1).",
-       "apihelp-query+deletedrevs-example-mode3-talk": "Юҡ ителгән тәүге 50 биттең исемлеге {{НС:фекер алышыу}} исемдәр арауығы(режим 3).",
+       "apihelp-query+categorymembers-param-dir": "Порядок сортировки.",
+       "apihelp-query+categorymembers-param-start": "Временная метка, с которой начать перечисление. Может быть использовано только одновременно с <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-end": "Временная метка, на которой закончить перечисление. Может быть использовано только одновременно с <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-starthexsortkey": "Ключ сортировки, с которого начать перечисление, возвращённый <kbd>$1prop=sortkey</kbd>. Может быть использовано только одновременно с <kbd>$1sort=sortkey</kbd>.",
+       "apihelp-query+categorymembers-param-endhexsortkey": "Ключ сортировки, на котором закончить перечисление, возвращённый <kbd>$1prop=sortkey</kbd>. Может быть использовано только одновременно с <kbd>$1sort=sortkey</kbd>.",
+       "apihelp-query+categorymembers-param-startsortkeyprefix": "Префикс ключа сортировки, с которого начать перечисление. Может быть использовано только с <kbd>$1sort=sortkey</kbd>. Переопределяет <var>$1starthexsortkey</var>.",
+       "apihelp-query+categorymembers-param-endsortkeyprefix": "Префикс ключа сортировки, <strong>перед</strong> которым закончить перечисление (не <strong>на<strong> котором; если это значение существует, оно не будет включено!). Может быть использовано только одновременно с $1sort=sortkey. Переопределяет $1endhexsortkey.",
+       "apihelp-query+categorymembers-param-startsortkey": "Используйте вместо этого $1starthexsortkey.",
+       "apihelp-query+categorymembers-param-endsortkey": "Используйте вместо этого $1endhexsortkey.",
+       "apihelp-query+categorymembers-example-simple": "Получить первые 10 страниц в <kbd>Category:Physics</kbd>.",
+       "apihelp-query+categorymembers-example-generator": "Получить информацию о первых 10 страницах в <kbd>Category:Physics</kbd>.",
+       "apihelp-query+contributors-description": "Получение списка зарегистрированных и количества анонимных редакторов страницы.",
+       "apihelp-query+contributors-param-group": "Включать только участников из данных групп. Неявные или автоматически присваиваемые группы, вроде *, user или autoconfirmed, не считаются.",
+       "apihelp-query+contributors-param-excludegroup": "Исключать участников из заданных групп. Неявные или автоматически присваиваемые группы, вроде *, user или autoconfirmed, не считаются.",
+       "apihelp-query+contributors-param-rights": "Включать только участников с данными правами. Участники с правами, предоставляемыми неявными или автоматически присваиваемыми группами — такими, как *, user или autoconfirmed, — не считаются.",
+       "apihelp-query+contributors-param-excluderights": "Исключать участников с данными правами. Участники с правами, предоставляемыми неявными или автоматически присваиваемыми группами — такими, как *, user или autoconfirmed, — не считаются.",
+       "apihelp-query+contributors-param-limit": "Сколько редакторов вернуть.",
+       "apihelp-query+contributors-example-simple": "Показать редакторов страницы <kbd>Main Page</kbd>.",
+       "apihelp-query+deletedrevisions-description": "Получение информации об удалённых правках.\n\nМожет быть использовано несколькими способами:\n# Получение удалённых правок для набора страниц, заданного с помощью названий или идентификаторов. Сортируется по названиям и временным меткам.\n# Получение данных о наборе удалённых правок, заданных с помощью их revid. Сортируется по идентификаторам версий.",
+       "apihelp-query+deletedrevisions-param-start": "Временная метка, с которой начать перечисление. Игнорируется при обработке списка идентификаторов версий.",
+       "apihelp-query+deletedrevisions-param-end": "Временная метка, на которой закончить перечисление. Игнорируется при обработке списка идентификаторов версий.",
+       "apihelp-query+deletedrevisions-param-tag": "Только правки с заданной меткой.",
+       "apihelp-query+deletedrevisions-param-user": "Только правки данного участника.",
+       "apihelp-query+deletedrevisions-param-excludeuser": "Не перечислять правки данного участника.",
+       "apihelp-query+deletedrevisions-example-titles": "Список удалённых правок страниц <kbd>Main Page</kbd> и <kbd>Talk:Main Page</kbd> с содержимым.",
+       "apihelp-query+deletedrevisions-example-revids": "Список информации для удалённой правки <kbd>123456</kbd>.",
+       "apihelp-query+deletedrevs-description": "Перечисление удалённых правок.\n\nРаботает в трёх режимах:\n# Перечисление удалённых правок для заданных названий страниц, сортируется по временным меткам.\n# Перечисление удалённого вклада заданного участника, сортируется по временным меткам (названия страниц не указываются).\n# Перечисление удалённых правок в заданном пространстве имён, сортируется по названиям страниц и временным меткам (названия страниц и $1user не указываются).\n\nОпределённые параметры применяются только к некоторым режимам и игнорируются в других.",
+       "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Мод|Моды}}: $2",
+       "apihelp-query+deletedrevs-param-start": "Временная метка, с которой начать перечисление.",
+       "apihelp-query+deletedrevs-param-end": "Временная метка, на которой закончить перечисление.",
+       "apihelp-query+deletedrevs-param-from": "Начать перечисление на этом заголовке.",
+       "apihelp-query+deletedrevs-param-to": "Закончить перечисление на этом заголовке.",
+       "apihelp-query+deletedrevs-param-prefix": "Найти все названия страниц, начинающиеся с этого значения.",
+       "apihelp-query+deletedrevs-param-unique": "Перечислять только одну правку на каждую страницу.",
+       "apihelp-query+deletedrevs-param-tag": "Только правки с заданной меткой.",
+       "apihelp-query+deletedrevs-param-user": "Только правки данного участника.",
+       "apihelp-query+deletedrevs-param-excludeuser": "Не перечислять правки данного участника.",
+       "apihelp-query+deletedrevs-param-namespace": "Перечислять только страницы этого пространства имён.",
+       "apihelp-query+deletedrevs-param-limit": "Максимальное количество правок в списке.",
+       "apihelp-query+deletedrevs-param-prop": "Какие свойства возвращать:\n;revid: Добавляет идентификатор удалённой правки.\n;parentid: Добавляет идентификатор предыдущей версии страницы.\n;user: Добавляет ник участника, сделавшего правку.\n;userid: Добавляет идентификатор участника, сделавшего правку.\n;comment: Добавляет описание правки.\n;parsedcomment: Добавляет распарсенное описание правки.\n;minor: Отмечает, была ли правка малым.\n;len: Добавляет длину (в байтах) правки.\n;sha1: Добавляет хэш SHA-1 (base 16) правки.\n;content: Добавляет содержимое правки.\n;token: <span class=\"apihelp-deprecated\">Не поддерживается.</span> Возвращает токен редактирования.\n;tags: Теги правки.",
+       "apihelp-query+deletedrevs-example-mode1": "Список последних удалённых правок страниц <kbd>Main Page</kbd> и <kbd>Talk:Main Page</kbd> с содержимым (режим 1).",
+       "apihelp-query+deletedrevs-example-mode2": "Список последних 50 удалённых правок участника <kbd>Bob</kbd> (режим 2).",
+       "apihelp-query+deletedrevs-example-mode3-main": "Список последних 50 удалённых правок в основном пространстве имён (режим 3)",
+       "apihelp-query+deletedrevs-example-mode3-talk": "Список последних 50 удалённых страниц в пространстве имён {{ns:talk}} (режим 3).",
+       "apihelp-query+disabled-description": "Этот запрос-модуль был отключён.",
+       "apihelp-query+duplicatefiles-description": "Перечисление всех файлов, являющихся дубликатами данных, основываясь на сравнении хэш-сумм.",
+       "apihelp-query+duplicatefiles-param-limit": "Сколько дубликатов вернуть.",
+       "apihelp-query+duplicatefiles-param-dir": "Порядок перечисления.",
+       "apihelp-query+duplicatefiles-param-localonly": "Искать только файлы в локальном репозитории.",
+       "apihelp-query+duplicatefiles-example-simple": "Поиск дубликатов [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "Поиск дубликатов всех файлов.",
+       "apihelp-query+embeddedin-description": "Поиск всех страниц, встраивающих (включающих) данное название.",
+       "apihelp-query+embeddedin-param-title": "Искомое название. Не может использоваться вместе с $1pageid.",
+       "apihelp-query+embeddedin-param-pageid": "Искомый идентификатор страницы. Не может быть использован одновременно с $1title.",
+       "apihelp-query+embeddedin-param-namespace": "Пространство имён для перечисления.",
+       "apihelp-query+embeddedin-param-dir": "Порядок перечисления.",
+       "apihelp-query+embeddedin-param-filterredir": "Как фильтровать перенаправления.",
+       "apihelp-query+embeddedin-param-limit": "Сколько страниц вернуть.",
+       "apihelp-query+embeddedin-example-simple": "Показать включения <kbd>Template:Stub</kbd>.",
+       "apihelp-query+embeddedin-example-generator": "Получить информацию о страницах, включающих <kbd>Template:Stub</kbd>.",
+       "apihelp-query+extlinks-description": "Получение всех внешних ссылок (не интервик) для данной страницы.",
+       "apihelp-query+extlinks-param-limit": "Сколько ссылок вернуть.",
+       "apihelp-query+extlinks-param-protocol": "Протокол ссылки. Если оставлено пустым, а <var>$1query</var> задано, будут найдены ссылки с протоколом <kbd>http</kbd>. Оставьте пустым и <var>$1query</var>, и данный параметр, чтобы получить список всех внешних ссылок.",
+       "apihelp-query+extlinks-param-query": "Поисковый запрос без протокола. Полезно для проверки, содержит ли определённая страница определённую внешнюю ссылку.",
+       "apihelp-query+extlinks-param-expandurl": "Раскрыть зависимые от протокола ссылки с какноничным протоколом.",
+       "apihelp-query+extlinks-example-simple": "Получить внешние ссылки на странице <kbd>Main Page</kbd>.",
+       "apihelp-query+exturlusage-description": "Перечислить страницы, содержащие данную ссылку.",
+       "apihelp-query+exturlusage-param-prop": "Какую информацию включить:",
+       "apihelp-query+exturlusage-paramvalue-prop-ids": "Добавляет идентификатор страницы.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "Добавляет заголовок и идентификатор пространства имён страницы.",
+       "apihelp-query+exturlusage-paramvalue-prop-url": "Добавляет ссылку, использованную на этой странице.",
+       "apihelp-query+exturlusage-param-protocol": "Протокол ссылки. Если оставлено пустым, а <var>$1query</var> задано, будут найдены ссылки с протоколом <kbd>http</kbd>. Оставьте пустым и <var>$1query</var>, и данный параметр, чтобы получить список всех внешних ссылок.",
+       "apihelp-query+exturlusage-param-query": "Поисковый запрос без протокола. См. [[Special:LinkSearch]]. Оставьте пустым для получение списка всех внешних ссылок.",
+       "apihelp-query+exturlusage-param-namespace": "Пространства имён для перечисления.",
+       "apihelp-query+exturlusage-param-limit": "Сколько страниц вернуть.",
+       "apihelp-query+exturlusage-param-expandurl": "Раскрыть зависимые от протокола ссылки с какноничным протоколом.",
+       "apihelp-query+exturlusage-example-simple": "Показать страницы, ссылающиеся на <kbd>http://www.mediawiki.org</kbd>.",
+       "apihelp-query+filearchive-description": "Перечисление всех удалённых файлов.",
+       "apihelp-query+filearchive-param-from": "Название изображения, с которого начать перечисление.",
+       "apihelp-query+filearchive-param-to": "Название изображения, на котором закончить перечисление.",
+       "apihelp-query+filearchive-param-prefix": "Найти все названия файлов, начинающиеся с этого значения.",
+       "apihelp-query+filearchive-param-limit": "Сколько всего изображений вернуть.",
+       "apihelp-query+filearchive-param-dir": "Порядок перечисления.",
+       "apihelp-query+filearchive-param-sha1": "SHA1-хэш этого изображения. Переопределяет $1sha1base36.",
+       "apihelp-query+filearchive-param-sha1base36": "SHA1-хэш этого изображения в base 36 (используется в MediaWiki).",
+       "apihelp-query+filearchive-param-prop": "Какую информацию получить:",
+       "apihelp-query+filearchive-paramvalue-prop-sha1": "Добавляет SHA1-хэш изображения.",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Добавляет метку времени загрузки файловой версии.",
+       "apihelp-query+filearchive-paramvalue-prop-user": "Добавляет участника, загрузившего изображение.",
+       "apihelp-query+filearchive-paramvalue-prop-size": "Добавляет размер изображения в байтах, высоту, ширину и количество использующих страниц (если применимо).",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "Синоним для size.",
+       "apihelp-query+filearchive-paramvalue-prop-description": "Добавляет описание файловой версии.",
+       "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Распарсить описание файловой версии.",
+       "apihelp-query+filearchive-paramvalue-prop-mime": "Добавляет MIME-тип изображения.",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "Добавляет медиа-тип изображения.",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "Перечисляет метаданные Exif для файловой версии.",
+       "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Добавляет глубину цвета файловой версии.",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "Добавляет имя архивной версии файла.",
+       "apihelp-query+filearchive-example-simple": "Список всех удалённых файлов.",
+       "apihelp-query+filerepoinfo-description": "Возвращает мета-информацию о файловых репозиториях, настроенных в вики.",
+       "apihelp-query+filerepoinfo-param-prop": "Какие свойства хранилища получить (на некоторых вики может быть доступно больше):\n;apiutl: Ссылка на API хранилища — полезно для получения информации об изображении с хоста.\n;name: Ключ хранилища — используется, например, <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> и возвращаемых [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname: Человеко-читаемое название хранилища.\n;rooturl: Корневая ссылка для путей к файлам.\n;local: Определяет, является ли хранилище локальным, или нет.",
+       "apihelp-query+filerepoinfo-example-simple": "Получить информацию о файловых репозиториях.",
+       "apihelp-query+fileusage-description": "Поиск всех страниц, использующих данный файл.",
+       "apihelp-query+fileusage-param-prop": "Какие свойства получить:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "Идентификатор каждой страницы.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Заголовок каждой страницы.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Метка, является ли страница перенаправлением.",
+       "apihelp-query+fileusage-param-namespace": "Включить страницы только из данных пространств имён.",
+       "apihelp-query+fileusage-param-limit": "Сколько страниц вернуть.",
+       "apihelp-query+fileusage-param-show": "Показать только элементы, соответствующие этим критериям:\n;redirect: Показать только перенаправления.\n;!redirect: Показать только не перенаправления.",
+       "apihelp-query+fileusage-example-simple": "Получить список страниц, использующих [[:File:Example.jpg]].",
+       "apihelp-query+fileusage-example-generator": "Получить информацию о страницах, использующих [[:File:Example.jpg]].",
+       "apihelp-query+imageinfo-description": "Возвращает информацию о файле и историю загрузок.",
+       "apihelp-query+imageinfo-param-prop": "Какую информацию о файле получить:",
+       "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Добавляет метку времени загрузки файловой версии.",
+       "apihelp-query+imageinfo-paramvalue-prop-user": "Добавляет участников, загрузивших каждую файловую версию.",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "Добавляет идентификаторы участников, загрузивших каждую файловую версию.",
+       "apihelp-query+imageinfo-paramvalue-prop-comment": "Комментарий к версии.",
+       "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Распарсенный комментарий к версии.",
+       "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Добавляет каноничное название файла.",
+       "apihelp-query+imageinfo-paramvalue-prop-url": "Возвращает ссылку на файл и страницу описания.",
+       "apihelp-query+imageinfo-paramvalue-prop-size": "Добавляет размер файла в байтах, высоту, ширину и количество использующих страниц (если применимо).",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Синоним для size.",
+       "apihelp-query+imageinfo-paramvalue-prop-sha1": "Добавляет SHA1-хэш файла.",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "Добавляет MIME-тип файла.",
+       "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "Добавляет MIME-тип миниатюры файла (требуется url и параметр $1urlwidth).",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "Добавляет медиа-тип файла.",
+       "apihelp-query+imageinfo-paramvalue-prop-metadata": "Перечисляет метаданные Exif для файловой версии.",
+       "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "Перечисляет общие для данного формата метаданные для файловой версии.",
+       "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "Перечисляет структурированные метаданные, собранные из нескольких источников. Результат отдаётся в формате HTML.",
+       "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+logevents-description": "Получать события из журналов.",
-       "apihelp-query+logevents-example-simple": "Список последних зарегистрированных событий.",
-       "apihelp-query+pagepropnames-example-simple": "Получить первые 10 имен свойств.",
-       "apihelp-query+pageswithprop-param-limit": "Максимальное количество страниц для возврата",
-       "apihelp-query+pageswithprop-param-dir": "В каком направлении сортировать",
-       "apihelp-query+prefixsearch-param-search": "Строка поиска.",
-       "apihelp-query+prefixsearch-param-offset": "Количество результатов для пропуска",
+       "apihelp-query+imageinfo-param-limit": "Сколько версий каждого файла вернуть.",
+       "apihelp-query+imageinfo-param-start": "Временная метка, с которой начать перечисление.",
+       "apihelp-query+imageinfo-param-end": "Временная метка, на которой закончить перечисление.",
+       "apihelp-query+imageinfo-param-urlwidth": "Если задан $2prop=url, будет возвращена ссылка на изображение, масштабированное до указанной ширины. Из соображений производительности, при использовании этой опции будет возвращено не более $1 файлов.",
+       "apihelp-query+imageinfo-param-urlheight": "Аналогично $1urlwidth.",
+       "apihelp-query+imageinfo-param-metadataversion": "Какую версию метаданных использовать. Если указано <kbd>latest</kbd>, будет использована последняя версия. Для обратной совместимости, значение по умолчанию — <kbd>1</kbd>.",
+       "apihelp-query+imageinfo-param-extmetadatalanguage": "На каком языке запрашивать расширенные метаданные. Это затрагивает как переводы, если их доступно несколько, так и способ форматирования чисел и других значений.",
+       "apihelp-query+imageinfo-param-extmetadatamultilang": "Если для свойства расширенных метаданных доступны переводы, запросить их все.",
+       "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+images-description": "Возвращает все файлы, содержащиеся на данных страницах.",
+       "apihelp-query+images-param-limit": "Сколько файлов вернуть.",
+       "apihelp-query+images-param-images": "Перечислять только данные файлы. Полезно для проверки, включает ли конкретная страница конкретный файл.",
+       "apihelp-query+images-param-dir": "Порядок перечисления.",
+       "apihelp-query+images-example-simple": "Получить список файлов, использованных на [[Main Page]].",
+       "apihelp-query+images-example-generator": "Получить информацию о всех файлах, использованных на [[Main Page]].",
+       "apihelp-query+imageusage-description": "Поиск всех страниц, использующих данный файл.",
+       "apihelp-query+imageusage-param-title": "Искомое название. Не может использоваться вместе с $1pageid.",
+       "apihelp-query+imageusage-param-pageid": "Искомый идентификатор страницы. Не может быть использован одновременно с $1title.",
+       "apihelp-query+imageusage-param-namespace": "Пространство имён для перечисления.",
+       "apihelp-query+imageusage-param-dir": "Порядок перечисления.",
+       "apihelp-query+imageusage-param-filterredir": "Как обрабатывать перенаправления. Если присвоено значение nonredirects при заданном $1redirect, это применяется только ко второму уровню.",
+       "apihelp-query+imageusage-param-limit": "Сколько страниц вернуть. Если задан <var>$1redirect</var>, лимит применяется к каждому уровню по отдельности (что означает, что всего может вернуться до 2 * <var>$1limit</var> результатов).",
+       "apihelp-query+imageusage-param-redirect": "Если ссылающаяся страница является перенаправлением, найти также все страницы, которые ссылаются на это перенаправление. Максимальный лимит становится в два раза меньше.",
+       "apihelp-query+imageusage-example-simple": "Показать страницы, использующие [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageusage-example-generator": "Получить информацию о страницах, использующих [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+info-description": "Получение основной информации о страницах.",
+       "apihelp-query+info-param-prop": "Какие дополнительные свойства получить:",
+       "apihelp-query+info-paramvalue-prop-protection": "Перечисление уровней защиты каждой страницы.",
+       "apihelp-query+info-paramvalue-prop-talkid": "Идентификатор страницы обсуждения для каждой страницы не-обсуждения.",
+       "apihelp-query+info-paramvalue-prop-watched": "Перечислить статус наблюдения за каждой страницей.",
+       "apihelp-query+info-paramvalue-prop-watchers": "Количество наблюдающих, если разрешено.",
+       "apihelp-query+info-paramvalue-prop-visitingwatchers": "Количество наблюдающих за каждой страницей, просмотревших последние правки, если разрешено.",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "Временная метка уведомления для списка наблюдения для каждой страницы.",
+       "apihelp-query+info-paramvalue-prop-subjectid": "Идентификатор родительской страницы для каждой страницы обсуждения.",
+       "apihelp-query+info-paramvalue-prop-url": "Возвращает полную ссылку, ссылку на редактирование и каноничную ссылку для каждой страницы.",
+       "apihelp-query+info-paramvalue-prop-readable": "Может ли участник просматривать эту страницу.",
+       "apihelp-query+info-paramvalue-prop-preload": "Текст, возвращённый EditFormPreloadText.",
+       "apihelp-query+info-paramvalue-prop-displaytitle": "Возвращает стиль отображения заголовка страницы.",
+       "apihelp-query+info-param-testactions": "Проверить, может ли текущий участник провести указанные действия над страницей.",
+       "apihelp-query+info-param-token": "Вместо этого используйте [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-query+info-example-simple": "Получить информацию о странице <kbd>Main Page</kbd>.",
+       "apihelp-query+info-example-protection": "Получить основную информацию и информацию о защите страницы <kbd>Main Page</kbd>.",
+       "apihelp-query+iwbacklinks-description": "Поиск всех страниц, содержащих данную интервики-ссылку.\n\nМожет быть использовано для поиска всех ссылок с указанным префиксом или всех ссылок на название с указанным префиксом. Неиспользование этого параметра фактически вернёт список всех интервики-ссылок.",
+       "apihelp-query+iwbacklinks-param-prefix": "Префикс интервики.",
+       "apihelp-query+iwbacklinks-param-title": "Искомая интервики-ссылка. Должна быть использована вместе с <var>$1blprefix</var>.",
+       "apihelp-query+iwbacklinks-param-limit": "Сколько страниц вернуть.",
+       "apihelp-query+iwbacklinks-param-prop": "Какие свойства получить:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Добавляет префикс интервики.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Добавляет название интервики.",
+       "apihelp-query+iwbacklinks-param-dir": "Порядок перечисления.",
+       "apihelp-query+iwbacklinks-example-simple": "Получить список страниц, ссылающихся на [[wikibooks:Test]].",
+       "apihelp-query+iwbacklinks-example-generator": "Получить информацию о страницах, ссылающихся на [[wikibooks:Test]].",
+       "apihelp-query+iwlinks-description": "Возвращает все интервики-ссылки с данных страниц.",
+       "apihelp-query+iwlinks-param-url": "Следует ли возвращать полный URL (не может быть использовано одновременно с $1prop).",
+       "apihelp-query+iwlinks-param-prop": "Какие дополнительные свойства получить для каждой межъязыковой ссылки:",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Добавляет полный URL.",
+       "apihelp-query+iwlinks-param-limit": "Сколько интервики-ссылок вернуть.",
+       "apihelp-query+iwlinks-param-prefix": "Вернуть только интервики с этим префиксом.",
+       "apihelp-query+iwlinks-param-title": "Искомая интервики-ссылка. Должна быть использована вместе с <var>$1prefix</var>.",
+       "apihelp-query+iwlinks-param-dir": "Порядок перечисления.",
+       "apihelp-query+iwlinks-example-simple": "Получить интервики-ссылки со страницы <kbd>Main Page</kbd>.",
+       "apihelp-query+langbacklinks-description": "Поиск всех страниц, ссылающихся на заданную языковую ссылку.\n\nМожет быть использовано для поиска всех ссылок с языковым кодом, или всех ссылок на страницу с заданным языком. Неиспользование этого параметра фактически вернёт все языковые ссылки.\n\nОбратите внимания, что ссылки, добавляемые расширениями, могут не рассматриваться.",
+       "apihelp-query+langbacklinks-param-lang": "Язык ссылки.",
+       "apihelp-query+langbacklinks-param-title": "Искомая языковая ссылка. Должно быть использовано с $1lang.",
+       "apihelp-query+langbacklinks-param-limit": "Сколько страниц вернуть.",
+       "apihelp-query+langbacklinks-param-prop": "Какие свойства получить:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Добавляет языковой код ссылки.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Добавляет название ссылки.",
+       "apihelp-query+langbacklinks-param-dir": "Порядок перечисления.",
+       "apihelp-query+langbacklinks-example-simple": "Получить список страниц, ссылающихся на [[:fr:Test]].",
+       "apihelp-query+langbacklinks-example-generator": "Получить информацию о страницах, ссылающихся на [[:fr:Test]].",
+       "apihelp-query+langlinks-description": "Возвращает все межъязыковые ссылки с данных страниц.",
+       "apihelp-query+langlinks-param-limit": "Сколько ссылок вернуть.",
+       "apihelp-query+langlinks-param-url": "Следует ли вернуть полный URL (не может быть использовано одновременно с <var>$1prop</var>).",
+       "apihelp-query+langlinks-param-prop": "Какие дополнительные свойства получить для каждой межъязыковой ссылки:",
+       "apihelp-query+langlinks-paramvalue-prop-url": "Добавляет полный URL.",
+       "apihelp-query+langlinks-paramvalue-prop-langname": "Добавляет локализованное название языка (лучший вариант). Используйте <var>$1inlanguagecode</var> для указания языка.",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "Добавляет самоназвание языка.",
+       "apihelp-query+langlinks-param-lang": "Возвращает только ссылки с данным языковым кодом.",
+       "apihelp-query+langlinks-param-title": "Искомая ссылка. Должна быть использована вместе с <var>$1lang</var>.",
+       "apihelp-query+langlinks-param-dir": "Порядок перечисления.",
+       "apihelp-query+langlinks-param-inlanguagecode": "Языковой код для локализованных названий языков.",
+       "apihelp-query+langlinks-example-simple": "Получить межъязыковые ссылки со страницы <kbd>Main Page</kbd>.",
+       "apihelp-query+links-description": "Возвращает все ссылки с данных страниц.",
+       "apihelp-query+links-param-namespace": "Показывать ссылки только на данные пространства имён.",
+       "apihelp-query+links-param-limit": "Сколько ссылок вернуть.",
+       "apihelp-query+links-param-titles": "Перечислять только данные ссылки. Полезно для проверки, содержит ли конкретная страница конкретную ссылку.",
+       "apihelp-query+links-param-dir": "Порядок перечисления.",
+       "apihelp-query+links-example-simple": "Получить ссылки со страницы <kbd>Main Page</kbd>.",
+       "apihelp-query+links-example-generator": "Получить информацию о страницах, на которые ссылается <kbd>Main Page</kbd>.",
+       "apihelp-query+links-example-namespaces": "Получить ссылки с <kbd>Main Page</kbd> на пространства имён {{ns:user}} и {{ns:template}}.",
+       "apihelp-query+linkshere-description": "Поиск всех страниц, ссылающихся на данную.",
+       "apihelp-query+linkshere-param-prop": "Какие свойства получить:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "Идентификатор каждой страницы.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Заголовок каждой страницы.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Метка, является ли страница перенаправлением.",
+       "apihelp-query+linkshere-param-namespace": "Включить страницы только из данных пространств имён.",
+       "apihelp-query+linkshere-param-limit": "Сколько страниц вернуть.",
+       "apihelp-query+linkshere-param-show": "Показать только элементы, соответствующие этим критериям:\n;redirect: Показать только перенаправления.\n;!redirect: Показать только не перенаправления.",
+       "apihelp-query+linkshere-example-simple": "Получить список страниц, ссылающихся на [[Main Page]].",
+       "apihelp-query+linkshere-example-generator": "Получить информацию о страницах, ссылающихся на [[Main Page]].",
+       "apihelp-query+logevents-description": "Получение записей журналов.",
+       "apihelp-query+logevents-param-prop": "Какие свойства получить:",
+       "apihelp-query+logevents-paramvalue-prop-ids": "Добавляет идентификатор записи журнала.",
+       "apihelp-query+logevents-paramvalue-prop-title": "Добавляет заголовок страницы, связанной с записью журнала.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Добавляет тип записи журнала.",
+       "apihelp-query+logevents-paramvalue-prop-user": "Добавляет участника, ответственного за запись журнала.",
+       "apihelp-query+logevents-paramvalue-prop-userid": "Добавляет идентификатор участника, ответственного за запись журнала.",
+       "apihelp-query+logevents-paramvalue-prop-timestamp": "Добавляет временную метку записи журнала.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "Добавляет комментарий записи журнала.",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Добавляет распарсенный комментарий записи журнала.",
+       "apihelp-query+logevents-paramvalue-prop-details": "Перечисляет дополнительные сведения о записи в журнале.",
+       "apihelp-query+logevents-paramvalue-prop-tags": "Перечисляет метки записи журнала.",
+       "apihelp-query+logevents-param-type": "Вернуть только записи этого типа.",
+       "apihelp-query+logevents-param-action": "Вернуть только указанные действия журнала. Переопределяет <var>$1type</var>. В списке возможных значений можно использовать звёздочку, например, <kbd>action/*</kbd> найдёт различные подстроки после слэша (/).",
+       "apihelp-query+logevents-param-start": "Временная метка, с которой начать перечисление.",
+       "apihelp-query+logevents-param-end": "Временная метка, на которой закончить перечисление.",
+       "apihelp-query+logevents-param-user": "Вернуть записи, созданные указанным участником.",
+       "apihelp-query+logevents-param-title": "Вернуть записи, связанные с указанными страницами.",
+       "apihelp-query+logevents-param-namespace": "Вернуть записи, связанные с указанными пространствами имён.",
+       "apihelp-query+logevents-param-prefix": "Вернуть записи, начинающиеся с заданного префикса.",
+       "apihelp-query+logevents-param-tag": "Только записи с заданной меткой.",
+       "apihelp-query+logevents-param-limit": "Сколько записей вернуть.",
+       "apihelp-query+logevents-example-simple": "Список последних записей.",
+       "apihelp-query+pagepropnames-description": "Перечисление всех названий свойств, использованных в вики.",
+       "apihelp-query+pagepropnames-param-limit": "Максимальное число возвращаемых названий.",
+       "apihelp-query+pagepropnames-example-simple": "Получить первые 10 названий свойств.",
+       "apihelp-query+pageprops-description": "Получение различных свойств страниц, определённых в содержании страницы.",
+       "apihelp-query+pageprops-param-prop": "Перечислить только эти свойства страницы (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> возвращает список используемых названий свойств). Полезно для проверки, используют ли страницы конкретные свойства.",
+       "apihelp-query+pageprops-example-simple": "Получить свойства страниц <kbd>Main Page</kbd> и <kbd>MediaWiki</kbd>.",
+       "apihelp-query+pageswithprop-description": "Перечисление всех страниц, использующих заданное свойство.",
+       "apihelp-query+pageswithprop-param-propname": "Искомое свойство (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> возвращает список используемых названий свойств).",
+       "apihelp-query+pageswithprop-param-prop": "Какую информацию включить:",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Добавляет идентификатор страницы.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "Добавляет заголовок и идентификатор пространства имён страницы.",
+       "apihelp-query+pageswithprop-paramvalue-prop-value": "Добавляет значение свойства страницы.",
+       "apihelp-query+pageswithprop-param-limit": "Максимальное число возвращаемых страниц.",
+       "apihelp-query+pageswithprop-param-dir": "Порядок сортировки.",
+       "apihelp-query+pageswithprop-example-simple": "Список первых 10 страниц, использующих <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
+       "apihelp-query+pageswithprop-example-generator": "Получение дополнительной информации о первых десяти страницах, использующих <code>_&#95;NOTOC_&#95;</code>.",
+       "apihelp-query+prefixsearch-description": "Осуществление поиска по префиксу названий страниц.\n\nНе смотря на похожесть названий, этот модуль не является эквивалентом [[Special:PrefixIndex]]; если вы ищете его, см. <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> с параметром <kbd>apprefix</kbd>. Задача этого модуля близка к <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd>: получение пользовательского ввода и представление наиболее подходящих заголовков. В зависимости от поискового движка, используемого на сервере, сюда может включаться исправление опечаток, избегание перенаправлений и другие эвристики.",
+       "apihelp-query+prefixsearch-param-search": "Поисковый запрос.",
+       "apihelp-query+prefixsearch-param-namespace": "Пространства имён для поиска.",
+       "apihelp-query+prefixsearch-param-limit": "Максимальное число возвращаемых результатов.",
+       "apihelp-query+prefixsearch-param-offset": "Количество пропускаемых результатов.",
+       "apihelp-query+prefixsearch-example-simple": "Поиск названий страниц, начинающихся с <kbd>meaning</kbd>.",
+       "apihelp-query+prefixsearch-param-profile": "Используемый поисковый профиль.",
+       "apihelp-query+protectedtitles-description": "Перечисление всех названий, защищённых от создания.",
+       "apihelp-query+protectedtitles-param-namespace": "Перечислять только страницы этих пространств имён.",
+       "apihelp-query+protectedtitles-param-level": "Перечислять только названия с этим уровнем защиты.",
+       "apihelp-query+protectedtitles-param-limit": "Сколько страниц вернуть.",
+       "apihelp-query+protectedtitles-param-start": "Начать перечисление с этой метки времени защиты.",
+       "apihelp-query+protectedtitles-param-end": "Закончить перечисление на этой метке времени защиты.",
+       "apihelp-query+protectedtitles-param-prop": "Какие свойства получить:",
+       "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "Добавляет метку времени установки защиты.",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "Добавляет участника, установившего защиту.",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "Добавляет идентификатор участника, установившего защиту.",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "Добавляет описание защиты.",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "Добавляет распарсенное описание защиты.",
+       "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Добавляет метку времени снятия защиты.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Добавляет уровень защиты.",
        "apihelp-query+protectedtitles-example-simple": "Список защищенных заголовков",
+       "apihelp-query+protectedtitles-example-generator": "Поиск ссылок на защищённые заголовки в основном пространстве имён.",
+       "apihelp-query+querypage-description": "Получение списка, предоставляемого служебной страницей, основанной на QueryPage.",
+       "apihelp-query+querypage-param-page": "Название служебной страницы. Обратите внимание: чувствительно к регистру.",
        "apihelp-query+querypage-param-limit": "Количество возвращаемых результатов.",
-       "apihelp-query+recentchanges-param-limit": "Какое общее количество возвращать",
-       "apihelp-query+recentchanges-param-type": "Какие типы изменений показать.",
+       "apihelp-query+querypage-example-ancientpages": "Вернуть результаты [[Special:Ancientpages]].",
+       "apihelp-query+random-description": "Получение набора случайных страниц.\n\nСтраницы перечисляются в строгой последовательности, случайна только входная точка. Это означает, что если, например, <samp>Main Page</samp> — первая страница в списке, то <samp>List of fictional monkeys</samp> <em>всегда</em> будет второй, <samp>List of people on stamps of Vanuatu</samp> — третьей, и так далее.",
+       "apihelp-query+random-param-namespace": "Вернуть только страницы этих пространств имён.",
+       "apihelp-query+random-param-limit": "Ограничение на количество возвращаемых страниц.",
+       "apihelp-query+random-param-redirect": "Вместо этого, используйте <kbd>$1filterredir=redirects</kbd>.",
+       "apihelp-query+random-param-filterredir": "Как фильтровать перенаправления.",
+       "apihelp-query+random-example-simple": "Вернуть две случайные страницы из основного пространства имён.",
+       "apihelp-query+random-example-generator": "Вернуть информацию о двух случайных страницах из основного пространства имён.",
+       "apihelp-query+recentchanges-description": "Перечисление последних правок.",
+       "apihelp-query+recentchanges-param-start": "Временная метка, с которой начать перечисление.",
+       "apihelp-query+recentchanges-param-end": "Временная метка, на которой закончить перечисление.",
+       "apihelp-query+recentchanges-param-namespace": "Только правки в этих пространствах имён.",
+       "apihelp-query+recentchanges-param-user": "Только правки данного участника.",
+       "apihelp-query+recentchanges-param-excludeuser": "Не перечислять правки данного участника.",
+       "apihelp-query+recentchanges-param-tag": "Только правки с заданной меткой.",
+       "apihelp-query+recentchanges-param-prop": "Включить дополнительную информацию:",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Добавить анонимных участников, ответственных за правку или метку.",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "Добавить идентификатор ответственного за правку участника.",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "Добавляет описание правки.",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Добавляет распарсенное описание правки.",
+       "apihelp-query+recentchanges-paramvalue-prop-flags": "Добавляет метки правки.",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Добавляет временную метку правки.",
+       "apihelp-query+recentchanges-paramvalue-prop-title": "Добавляет заголовок отредактированной страницы.",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "Добавляет идентификаторы страницы, правки, старой и новой версии.",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "Добавляет старую и новую длину страницы в байтах.",
+       "apihelp-query+recentchanges-paramvalue-prop-redirect": "Отмечает правку, если страница является перенаправлением.",
+       "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Отмечает патрулируемые правки как отпатрулированные или неотпатрулированные.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Добавляет информацию о записи журнала (идентификатор записи, её тип, и так далее).",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Перечисляет теги записи.",
+       "apihelp-query+recentchanges-paramvalue-prop-sha1": "Добавляет значение контрольных сумм для записей, связанных с версией.",
+       "apihelp-query+recentchanges-param-token": "Вместо этого используйте <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-query+recentchanges-param-show": "Показать только элементы, удовлетворяющие данным критериям. Например, чтобы отобразить только малые правки, сделанные зарегистрированными участниками, установите $1show=minor|!anon.",
+       "apihelp-query+recentchanges-param-limit": "Сколько правок вернуть.",
+       "apihelp-query+recentchanges-param-type": "Какие типы правок показать.",
+       "apihelp-query+recentchanges-param-toponly": "Перечислять только последние правки страниц.",
+       "apihelp-query+recentchanges-param-generaterevisions": "При использовании в качестве генератора, генерировать идентификаторы версий вместо их названий. Записи последних изменений без привязанного идентификатора версии (например, большинство записей журналов) не сгенерируют ничего.",
        "apihelp-query+recentchanges-example-simple": "Список последних изменений.",
+       "apihelp-query+recentchanges-example-generator": "Получить информацию о последних страницах с неотпатрулированными изменениями.",
+       "apihelp-query+redirects-description": "Возвращает все перенаправления на данную страницу.",
+       "apihelp-query+redirects-param-prop": "Какие свойства получить:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "Идентификатор каждого перенаправления.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Название каждого перенаправления.",
+       "apihelp-query+redirects-paramvalue-prop-fragment": "Фрагемнт каждого перенаправления, если доступен.",
+       "apihelp-query+redirects-param-namespace": "Включить страницы только из данных пространств имён.",
        "apihelp-query+redirects-param-limit": "Сколько перенаправлений вернуть.",
+       "apihelp-query+redirects-param-show": "Показывать только элементы, удовлетворяющие данным критериям:\n;fragment: Показывать только перенаправления с фрагментами.\n;!fragment: Показывать только перенаправления без фрагментов.",
+       "apihelp-query+redirects-example-simple": "Получить список перенаправлений на [[Main Page]].",
+       "apihelp-query+redirects-example-generator": "Получить информацию о всех перенаправлениях на [[Main Page]].",
+       "apihelp-query+revisions-description": "Получение информации о версии страницы.\n\nМожет использоваться в трёх режимах:\n# Получение данных о наборе страниц (последних версий) с помощью передачи названий или идентификаторов страниц.\n# Получение версий одной данной страницы, используя названия или идентификаторы с началом, концом или лимитом.\n# Получение данных о наборе версий, передаваемых с помощью их идентификаторов.",
+       "apihelp-query+revisions-paraminfo-singlepageonly": "Может быть использовано только с одной страницей (режим №2).",
+       "apihelp-query+revisions-param-startid": "Начать перечисление с этой временной метки версии. Версия обязана существовать, но не обязана принадлежать этой странице.",
+       "apihelp-query+revisions-param-endid": "Закончить перечисление на этой временной метке версии. Версия обязана существовать, но не обязана принадлежать этой странице.",
+       "apihelp-query+revisions-param-start": "С какой временной метки начать перечисление.",
+       "apihelp-query+revisions-param-end": "Перечислять до данной временной метки.",
+       "apihelp-query+revisions-param-user": "Только версии данного участника.",
+       "apihelp-query+revisions-param-excludeuser": "Исключить версии данного участника.",
+       "apihelp-query+revisions-param-tag": "Только версии с заданной меткой.",
+       "apihelp-query+revisions-param-token": "Какие токены получить для каждой версии.",
+       "apihelp-query+revisions-example-content": "Получить данные с содержимым для последних версий страниц <kbd>API</kbd> и <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-last5": "Получить последние 5 версий <kbd>Main Page</kbd>.",
-       "apihelp-query+revisions-example-first5": "Получить 5 первых версий <kbd>Main Page</kbd>.",
-       "apihelp-query+revisions-example-first5-after": "Получить 5 первых версий <kbd>Main Page</kbd> созданных после 2006-05-01.",
-       "apihelp-query+revisions-example-first5-not-localhost": "Получить 5 первых версий <kbd>Main Page</kbd> которые не созданы анонимными пользователями <kbd>127.0.0.1</kbd>.",
-       "apihelp-query+revisions-example-first5-user": "Получить 5 первых версий <kbd>Main Page</kbd> которые созданы пользователями <kbd>MediaWiki default</kbd>.",
-       "apihelp-query+revisions+base-param-limit": "Ограничение на количество версий которое будут вовзращено",
-       "apihelp-query+search-description": "Выполнить полнотекстовый поиск.",
-       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Возвращает список расширений (типы файлов), которые доступны к загрузке",
-       "apihelp-query+tags-description": "Список изменерий тегов.",
-       "apihelp-query+tags-example-simple": "Лист доступных тегов",
-       "apihelp-query+templates-param-namespace": "Показывать шаблоны только из данного списка имен",
-       "apihelp-query+templates-param-limit": "Как много шаблонов для возврата",
-       "apihelp-query+transcludedin-param-limit": "Сколько возвращать",
-       "apihelp-query+usercontribs-description": "Получить все правки пользователя",
-       "apihelp-revisiondelete-description": "удалить и восстановить редакции",
+       "apihelp-query+revisions-example-first5": "Получить первые 5 версий <kbd>Main Page</kbd>.",
+       "apihelp-query+revisions-example-first5-after": "Получить первые 5 версий <kbd>Main Page</kbd> созданных после 2006-05-01.",
+       "apihelp-query+revisions-example-first5-not-localhost": "Получить первые 5 версий <kbd>Main Page</kbd>, сделанных не анонимным участником <kbd>127.0.0.1</kbd>.",
+       "apihelp-query+revisions-example-first5-user": "Получить первые 5 версий <kbd>Main Page</kbd>, сделанных участником <kbd>MediaWiki default</kbd>.",
+       "apihelp-query+revisions+base-param-prop": "Какие свойства каждой версии получить:",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "Идентификатор версии.",
+       "apihelp-query+revisions+base-paramvalue-prop-flags": "Флаги версии (малая правка).",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Временная метка версии.",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "Участник, создавший версию.",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "Идентификатор создателя версии.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "Длина версии (в байтах).",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1-хэш (base 16) версии.",
+       "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Идентификатор модели содержимого версии.",
+       "apihelp-query+revisions+base-paramvalue-prop-comment": "Описание правки.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Распарсенное описание правки.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Текст версии.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Метки версии.",
+       "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Дерево парсинга XML содержимого версии (требуется модель содержимого <code>$1</code>).",
+       "apihelp-query+revisions+base-param-limit": "Сколько версий вернуть.",
+       "apihelp-query+revisions+base-param-expandtemplates": "Раскрыть шаблоны в содержимом версии (требуется $1prop=content).",
+       "apihelp-query+revisions+base-param-generatexml": "Сгенерировать дерево парсинга XML содержимого версии (требуется $1prop=content; заменено на <kbd>$1prop=parsetree</kbd>).",
+       "apihelp-query+revisions+base-param-parse": "Распарсить содержимое версии (требуется $1prop=content). Из соображений производительности, при использовании этой опции, в качестве $1limit принудительно устанавливается 1.",
+       "apihelp-query+revisions+base-param-section": "Вернуть содержимое только секции с заданным номером.",
+       "apihelp-query+revisions+base-param-diffto": "Идентификатор версии, с которым сравнивать каждую версию. Используйте <kbd>prev</kbd>, <kbd>next</kbd> и <kbd>cur</kbd> для предыдущей, следующей и текущей версии соответственно.",
+       "apihelp-query+revisions+base-param-difftotext": "Текст, с которым сравнивать каждую версию. Сравнивает ограниченное число версий. Переопределяет <var>$1diffto</var>. Если задано <var>$1section</var>, сравнение будет произведено только с этой секцией.",
+       "apihelp-query+revisions+base-param-difftotextpst": "Выполнить преобразование перед записью правки до сравнения. Доступно только при использовании с <var>$1difftotext</var>.",
+       "apihelp-query+revisions+base-param-contentformat": "Формат серилиализации, использованный в <var>$1difftotext</var> и ожидаемый в результате.",
+       "apihelp-query+search-description": "Проведение полнотекстового поиска.",
+       "apihelp-query+search-param-search": "Искать страницы, названия или тексты которых содержат это значение. Вы можете использовать в поисковом запросе служебные функции в зависимости от того, какой поисковый движок используется на сервере.",
+       "apihelp-query+search-param-namespace": "Искать только в этих пространствах имён.",
+       "apihelp-query+search-param-what": "Какой тип поиска осуществить.",
+       "apihelp-query+search-param-info": "Какие метаданные вернуть.",
+       "apihelp-query+search-param-prop": "Какие свойства вернуть:",
+       "apihelp-query+search-param-qiprofile": "Используемый запросонезависимый профиль (затрагивает оценивающий алгоритм).",
+       "apihelp-query+search-paramvalue-prop-size": "Добавляет размер страницы в байтах.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Добавляет количество слов на странице.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Добавляет метку времени последнего редактирования страницы.",
+       "apihelp-query+search-paramvalue-prop-snippet": "Добавляет распарсенный фрагмент страницы.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "Добавляет распарсенный фрагмент названия страницы.",
+       "apihelp-query+search-paramvalue-prop-redirectsnippet": "Добавляет распарсенный фрагмент названия перенаправления.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Добавляет название найденного перенаправления.",
+       "apihelp-query+search-paramvalue-prop-sectionsnippet": "Добавляет распарсенный фрагмент заголовка найденного раздела.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "Добавляет заголовок найденного раздела.",
+       "apihelp-query+search-paramvalue-prop-categorysnippet": "Добавляет распарсенный фрагмент найденной категории.",
+       "apihelp-query+search-paramvalue-prop-isfilematch": "Добавляет логическое значение, обозначающее, удовлетворяет ли поисковому запросу содержимое файла.",
+       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Не поддерживается и игнорируется.</span>",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Не поддерживается и игнорируется.</span>",
+       "apihelp-query+search-param-limit": "Сколько страниц вернуть.",
+       "apihelp-query+search-param-interwiki": "Включить результаты из других вики, если доступны.",
+       "apihelp-query+search-param-backend": "Какой поисковый движок использовать, если не стандартный.",
+       "apihelp-query+search-param-enablerewrites": "Разрешить редактирование запроса. Некоторые поисковые движки могут отредактировать запрос, например, исправив опечатку, если посчитают, что это приведёт к лучшим результатам.",
+       "apihelp-query+search-example-simple": "Найти <kbd>meaning</kbd>.",
+       "apihelp-query+search-example-text": "Найти тексты, содержащие <kbd>meaning</kbd>.",
+       "apihelp-query+search-example-generator": "Получить информацию о страницах, возвращённых по поисковому запросу <kbd>meaning</kbd>.",
+       "apihelp-query+siteinfo-description": "Получение основной информации о сайте.",
+       "apihelp-query+siteinfo-param-prop": "Какую информацию получить:",
+       "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-fileextensions": "Список файловых расширений, разрешённых к загрузке.",
+       "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Возвращает правовую информацию (лицензию), если доступно.",
+       "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Возвращает информацию о доступных типах защиты страниц.",
+       "apihelp-query+siteinfo-paramvalue-prop-languages": "Возвращает список языков, поддерживаемых MediaWiki (опционально локализованных с помощью <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Возвращает список языковых кодов, для которых включён [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]], а также варианты, поддерживаемые для каждого языка.",
+       "apihelp-query+siteinfo-paramvalue-prop-skins": "Возвращает список доступных скинов (опционально локализованных с помощью <var>$1inlanguagecode</var>, в противном случае — на языке вики).",
+       "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Возвращает список тегов рашсирений парсера.",
+       "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Возвращает список перехватчиков функций парсера.",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Возвращает список всех подписанных перехватчиков (содержимое <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "Возвращает список идентификаторов переменных.",
+       "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+stashimageinfo-description": "Возвращает информацию о файлах в тайнике (upload stash).",
+       "apihelp-query+stashimageinfo-param-filekey": "Ключ, идентифицирующий предыдущую временную загрузку.",
+       "apihelp-query+stashimageinfo-param-sessionkey": "Синоним $1filekey для обратной совместимости.",
+       "apihelp-query+stashimageinfo-example-simple": "Вернуть информацию о файле в тайнике.",
+       "apihelp-query+stashimageinfo-example-params": "Вернуть эскизы двух файлов в тайнике.",
+       "apihelp-query+tags-description": "Список меток правок.",
+       "apihelp-query+tags-param-limit": "Максимальное количество меток в списке.",
+       "apihelp-query+tags-param-prop": "Какие свойства получить:",
+       "apihelp-query+tags-paramvalue-prop-name": "Добавляет название метки.",
+       "apihelp-query+tags-paramvalue-prop-displayname": "Добавляет системное сообщение метки.",
+       "apihelp-query+tags-paramvalue-prop-description": "Добавляет описание метки.",
+       "apihelp-query+tags-paramvalue-prop-hitcount": "Добавляет количество правок и записей в журналах, использующих эту метку.",
+       "apihelp-query+tags-paramvalue-prop-defined": "Показывает, определена ли метка.",
+       "apihelp-query+tags-paramvalue-prop-source": "Получить источники меток, которыми могут быть <samp>extension</samp> для меток, определённых расширениями, и <samp>manual</samp> для меток, определённых участниками вручную.",
+       "apihelp-query+tags-paramvalue-prop-active": "Применима ли метка до сих пор.",
+       "apihelp-query+tags-example-simple": "Список доступных меток.",
+       "apihelp-query+templates-description": "Возвращает все страницы, включённые в данную.",
+       "apihelp-query+templates-param-namespace": "Показать шаблоны только данного пространства имён.",
+       "apihelp-query+templates-param-limit": "Сколько шаблонов вернуть.",
+       "apihelp-query+templates-param-templates": "Перечислять только эти шаблоны. Полезно для проверки, включает ли конкретная страница конкретный шаблон.",
+       "apihelp-query+templates-param-dir": "Порядок перечисления.",
+       "apihelp-query+templates-example-simple": "Получить список шаблонов, использующихся на <kbd>Main Page</kbd>.",
+       "apihelp-query+templates-example-generator": "Получить информацию о шаблонах, использующихся на <kbd>Main Page</kbd>.",
+       "apihelp-query+templates-example-namespaces": "Получить страницы из пространств имён {{ns:user}} и {{ns:template}}, включённые в <kbd>Main Page</kbd>.",
+       "apihelp-query+tokens-description": "Получение токенов для действий, связанных с редактированием данных.",
+       "apihelp-query+tokens-param-type": "Типы запрашиваемых токенов.",
+       "apihelp-query+tokens-example-simple": "Получить csrf-токен (по умолчанию).",
+       "apihelp-query+tokens-example-types": "Получить токен наблюдения и токен патрулирования.",
+       "apihelp-query+transcludedin-description": "Поиск всех страниц, включающих данные страницы.",
+       "apihelp-query+transcludedin-param-prop": "Какие свойства получить:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "Идентификатор каждой страницы.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Заголовок каждой страницы.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Метка, является ли страница перенаправлением.",
+       "apihelp-query+transcludedin-param-namespace": "Включить страницы только из данных пространств имён.",
+       "apihelp-query+transcludedin-param-limit": "Сколько страниц вернуть.",
+       "apihelp-query+transcludedin-param-show": "Показать только элементы, соответствующие этим критериям:\n;redirect: Показать только перенаправления.\n;!redirect: Показать только не перенаправления.",
+       "apihelp-query+transcludedin-example-simple": "Получить список страниц, включающих <kbd>Main Page</kbd>.",
+       "apihelp-query+transcludedin-example-generator": "Получить информацию о страницах, включающих <kbd>Main Page</kbd>.",
+       "apihelp-query+usercontribs-description": "Получение всех правок участника.",
+       "apihelp-query+usercontribs-param-limit": "Максимальное количество возвращаемых правок.",
+       "apihelp-query+usercontribs-param-start": "Временная метка, с которой начать возврат.",
+       "apihelp-query+usercontribs-param-end": "Временная метка, на которой закончить возврат.",
+       "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": "Добавляет идентификатор страницы и версии.",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "Добавляет заголовок и идентификатор пространства имён страницы.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Добавляет временную метку правки.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Добавляет описание правки.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Добавляет распарсенное описание правки.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "Добавляет новый размер страницы.",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Добавляет разницу между размерами страницы до и после правки.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "Добавляет флаги правки.",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Отмечает отпатрулированные правки.",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "Перечисляет метки правки.",
+       "apihelp-query+usercontribs-param-show": "Показать только элементы, удовлетворяющие данным критериям, например, только не малые правки: <kbd>$2show=!minor</kbd>.\n\nЕсли установлено <kbd>$2show=patrolled</kbd> или <kbd>$2show=!patrolled</kbd>, правки старее <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|секунды|секунд}}) не будут показаны.",
+       "apihelp-query+usercontribs-param-tag": "Только правки с заданной меткой.",
+       "apihelp-query+usercontribs-param-toponly": "Перечислять только последние правки страниц.",
+       "apihelp-query+usercontribs-example-user": "Показать вклад участника <kbd>Example</kbd>.",
+       "apihelp-query+usercontribs-example-ipprefix": "Показать вклад со всех IP-адресов, начинающихся на <kbd>192.0.2.</kbd>.",
+       "apihelp-query+userinfo-description": "Получение информации о текущем участнике.",
+       "apihelp-query+userinfo-param-prop": "Какую информацию включить:",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Определяет, заблокирован ли текущий участник, кем и по какой причине.",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Добавляет метку <samp>messages</samp>, если у текущего участника есть непрочитанные сообщения.",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "Перечисляет все группы, в которые входит участник.",
+       "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "Возвращает группы, в которые участник был явно включён, включая дату окончания членства для каждой группы.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Перечисляет все группы, в которые участник был включён автоматически.",
+       "apihelp-query+userinfo-paramvalue-prop-rights": "Перечисляет все права текущего участника.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Перечисляет группы, в которые или из которых участник может добавить или удалить других участников.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "Перечисляет все настройки, установленные текущим участником.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Не поддерживается.</span> Возвращает токен для смены настроек текущего участника.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Добавляет счётчик правок текущего участника.",
+       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Добавляет все скоростные лимиты, применимые к текущему участнику.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "Добавляет настоящее имя участника.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "Добавляет электронный адрес участника и дату проверки его подлинности.",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Возвращает назад заголовок <code>Accept-Language</code>, отосланный клиентом, в структурированном формате.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Добавляет дату регистрации участника.",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Добавляет число непрочитанных страниц в странице наблюдения участника (максимум $1; возвращает <samp>$2</samp>, если их больше).",
+       "apihelp-query+userinfo-paramvalue-prop-centralids": "Добавляет центральный идентификатор и статус прикрепления участника.",
+       "apihelp-query+userinfo-param-attachedwiki": "Вместе с <kbd>$1prop=centralids</kbd> отображает, прикреплён ли к вики участник с этим идентификатором.",
+       "apihelp-query+userinfo-example-simple": "Получение информации о текущем участнике.",
+       "apihelp-query+userinfo-example-data": "Получение дополнительной информации о текущем участнике.",
+       "apihelp-query+users-description": "Получение информации о списке участников.",
+       "apihelp-query+users-param-prop": "Какую информацию включить:",
+       "apihelp-query+users-paramvalue-prop-blockinfo": "Определяет, заблокирован ли участник, кем и по какой причине.",
+       "apihelp-query+users-paramvalue-prop-groups": "Перечисляет все группы, в которые входит каждый участник.",
+       "apihelp-query+users-paramvalue-prop-groupmemberships": "Возвращает группы, в которые каждый участник был явно включён, включая дату окончания членства для каждой группы.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "Перечисляет группы, в которые участник был включён автоматически.",
+       "apihelp-query+users-paramvalue-prop-rights": "Перечисляет все права каждого участника.",
+       "apihelp-query+users-paramvalue-prop-editcount": "Добавляет счётчики правок участников.",
+       "apihelp-query+users-paramvalue-prop-registration": "Добавляет даты регистрации участников.",
+       "apihelp-query+users-paramvalue-prop-emailable": "Отмечает, может ли и хочет ли участник получать электронную почту посредством [[Special:Emailuser]].",
+       "apihelp-query+users-paramvalue-prop-gender": "Отмечает пол текущего участника. Возвращает «male», «female» или «unknown».",
+       "apihelp-query+users-paramvalue-prop-centralids": "Добавляет центральный идентификатор и статус прикрепления участника.",
+       "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-query+watchlist-param-allrev": "Включить несколько правок одной страницы из заданного временного промежутка.",
+       "apihelp-query+watchlist-param-start": "Временная метка, с которой начать перечисление.",
+       "apihelp-query+watchlist-param-end": "Временная метка, на которой закончить перечисление.",
+       "apihelp-query+watchlist-param-namespace": "Только правки в этих пространствах имён.",
+       "apihelp-query+watchlist-param-user": "Только правки данного участника.",
+       "apihelp-query+watchlist-param-excludeuser": "Не перечислять правки данного участника.",
+       "apihelp-query+watchlist-param-limit": "Сколько результатов возвращать за один запрос.",
+       "apihelp-query+watchlist-param-prop": "Какие дополнительные свойства получить:",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "Добавляет идентификаторы страницы и версии.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Добавляет заголовок страницы.",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "Добавляет флаги правки.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Добавляет участника, сделавшего правку.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "Добавляет идентификатор участника, сделавшего правку.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Добавляет описание правки.",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Добавляет распарсенное описание правки.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "Добавляет временную метку правки.",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "Определяет, была ли правка отпатрулирована.",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "Добавляет старую и новую длину страницы.",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Добавляет метку времени, когда участник был уведомлён о правке.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "Добавляет информацию о журнале, где уместно.",
+       "apihelp-query+watchlist-param-show": "Показать только элементы, удовлетворяющие данным критериям. Например, чтобы отобразить только малые правки, сделанные зарегистрированными участниками, установите $1show=minor|!anon.",
+       "apihelp-query+watchlist-param-type": "Какие типы правок показать:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Обычные правки страниц.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Внешние правки.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Создания страниц.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Записи журнала.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Правки категоризации.",
+       "apihelp-query+watchlist-param-owner": "Используется вместе с $1token для получения списка наблюдения другого участника.",
+       "apihelp-query+watchlist-param-token": "Токен безопасности (доступен в [[Special:Preferences#mw-prefsection-watchlist|настройках]] участника), предоставляющий доступ к списку наблюдения другого участника.",
+       "apihelp-query+watchlist-example-simple": "Список последних правок недавно отредактированных страниц из списка наблюдения текущего участника.",
+       "apihelp-query+watchlist-example-props": "Запросить дополнительную информацию о последних правках недавно отредактированных страниц из списка наблюдения текущего участника.",
+       "apihelp-query+watchlist-example-allrev": "Запросить информацию о всех недавних правках страниц из списка наблюдения текущего участника.",
+       "apihelp-query+watchlist-example-generator": "Запросить информацию о страницах для недавно отредактированных страниц из списка наблюдения текущего участника.",
+       "apihelp-query+watchlist-example-generator-rev": "Запросить информацию о версиях для последних правок страниц из списка наблюдения текущего участника.",
+       "apihelp-query+watchlist-example-wlowner": "Список последних правок недавно отредактированных страниц из списка наблюдения участника <kbd>Example</kbd>.",
+       "apihelp-query+watchlistraw-description": "Получение всех страниц из списка наблюдения текущего участника.",
+       "apihelp-query+watchlistraw-param-namespace": "Перечислять только страницы этих пространств имён.",
+       "apihelp-query+watchlistraw-param-limit": "Сколько результатов возвращать за один запрос.",
+       "apihelp-query+watchlistraw-param-prop": "Какие дополнительные свойства получить:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "Добавляет метку времени, когда участник был уведомлён о правке.",
+       "apihelp-query+watchlistraw-param-show": "Перечислять только элементы, соответствующие этим критериям.",
+       "apihelp-query+watchlistraw-param-owner": "Используется вместе с $1token для получения списка наблюдения другого участника.",
+       "apihelp-query+watchlistraw-param-token": "Токен безопасности (доступен в [[Special:Preferences#mw-prefsection-watchlist|настройках]] участника), предоставляющий доступ к списку наблюдения другого участника.",
+       "apihelp-query+watchlistraw-param-dir": "Порядок перечисления.",
+       "apihelp-query+watchlistraw-param-fromtitle": "Название (с префиксом пространства имён), с которого начать перечисление.",
+       "apihelp-query+watchlistraw-param-totitle": "Название (с префиксом пространства имён), на котором закончить перечисление.",
+       "apihelp-query+watchlistraw-example-simple": "Получение страниц из списка наблюдения текущего участника.",
+       "apihelp-query+watchlistraw-example-generator": "Запросить информацию о страницах из списка наблюдения текущего участника.",
+       "apihelp-removeauthenticationdata-description": "Удаление аутентификационных данных для текущего участника.",
+       "apihelp-removeauthenticationdata-example-simple": "Попытка удалить данные текущего участника для <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-description": "Отправить участнику письмо для сброса пароля.",
+       "apihelp-resetpassword-description-noroutes": "Маршруты смены пароля не доступны.\n\nВключите маршруты в <var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> для использования этого модуля.",
+       "apihelp-resetpassword-param-user": "Сбрасываемый участник.",
+       "apihelp-resetpassword-param-email": "Электронный адрес сбрасываемого участника.",
+       "apihelp-resetpassword-example-user": "Послать письмо для сброса пароля участнику <kbd>Example</kbd>.",
+       "apihelp-resetpassword-example-email": "Послать письмо для сброса пароля всем участникам с электронным адресом <kbd>user@example.com</kbd>.",
+       "apihelp-revisiondelete-description": "Удаление и восстановление версий страниц.",
+       "apihelp-revisiondelete-param-type": "Тип осуществляемого удаления версии.",
+       "apihelp-revisiondelete-param-target": "Название страницы удаляемой версии, если это требуется для выбранного типа.",
+       "apihelp-revisiondelete-param-ids": "Идентификаторы удаляемых версий.",
+       "apihelp-revisiondelete-param-hide": "Что скрыть для каждой версии.",
+       "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-rollback-param-title": "Заголовок откатываемой страницы. Не может быть использовано одновременно с <var>$1pageid</var>.",
+       "apihelp-rollback-param-pageid": "Идентификатор откатываемой страницы. Не может быть использовано одновременно с <var>$1title</var>.",
+       "apihelp-rollback-param-tags": "Метки, применяемые к откату.",
+       "apihelp-rollback-param-user": "Имя участника, чьи правки следует откатить.",
+       "apihelp-rollback-param-summary": "Пользовательское описание правки. При пустом значении будет использовано стандартное описание.",
+       "apihelp-rollback-param-markbot": "Отметить откатываемые правки и откат как правки бота.",
+       "apihelp-rollback-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.",
+       "apihelp-rollback-example-simple": "Откатить последние изменения страницы <kbd>Main Page</kbd> участника <kbd>Example</kbd>.",
+       "apihelp-rollback-example-summary": "Откатить последние правки страницы <kbd>Main Page</kbd> анонимного участника <kbd>192.0.2.5</kbd> с описанием <kbd>Reverting vandalism</kbd>, и отметить эти правки и их откат как правки ботов.",
+       "apihelp-rsd-description": "Экспорт схемы RSD (Really Simple Discovery).",
+       "apihelp-rsd-example-simple": "Экспортировать схему RSD.",
+       "apihelp-setnotificationtimestamp-description": "Обновляет временную метку уведомления для отслеживаемых страниц.\n\nЭто затрагивает подсвечивание изменённых страниц в списке наблюдения и истории, и отправляет письмо, если включена настройка «{{int:tog-enotifwatchlistpages}}».",
+       "apihelp-setnotificationtimestamp-param-entirewatchlist": "Работать над всеми отслеживаемыми страницами.",
+       "apihelp-setnotificationtimestamp-param-timestamp": "Новая временная метка уведомления.",
+       "apihelp-setnotificationtimestamp-param-torevid": "Версия, к временной метке которой приравнять временную метку уведомления (только для одной страницы).",
+       "apihelp-setnotificationtimestamp-param-newerthanrevid": "Версия, новее которой сделать временную метку уведомления (только для одной страницы).",
+       "apihelp-setnotificationtimestamp-example-all": "Сбросить статус уведомления для всего списка наблюдения.",
+       "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:Special:MyLanguage/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-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-undelete-param-title": "Заголовок страницы для восстановления.",
-       "apihelp-undelete-param-reason": "Причины восстановления.",
+       "apihelp-stashedit-param-text": "Содержимое страницы.",
+       "apihelp-stashedit-param-stashedtexthash": "Хэш содержимого страницы в кэше.",
+       "apihelp-stashedit-param-contentmodel": "Модель нового содержимого.",
+       "apihelp-stashedit-param-contentformat": "Формат сериализации содержимого, используемый для введённого текста.",
+       "apihelp-stashedit-param-baserevid": "Идентификатор предыдущей версии.",
+       "apihelp-stashedit-param-summary": "Описание правки.",
+       "apihelp-tag-description": "Добавление или удаление меток отдельных правок или записей журналов.",
+       "apihelp-tag-param-rcid": "Один или более идентификаторов правок, метки которых нужно добавить или удалить.",
+       "apihelp-tag-param-revid": "Один или более идентификаторов версий, метки которых нужно добавить или удалить.",
+       "apihelp-tag-param-logid": "Один или более идентификаторов записей журналов, метки которых нужно добавить или удалить.",
+       "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-param-type": "Типы запрашиваемых токенов.",
+       "apihelp-tokens-example-edit": "Получить токен редактирования (по умолчанию).",
+       "apihelp-tokens-example-emailmove": "Получить токен электронной почты и переименования.",
+       "apihelp-unblock-description": "Разблокировка участника.",
+       "apihelp-unblock-param-id": "Идентификатор снимаемой блокировки (получается с помощью <kbd>list=blocks</kbd>). Не может быть использовано одновременно с <var>$1user</var> или <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите разблокировать. Нельзя использовать одновременно с <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-unblock-example-user": "Разблокировать участника <kbd>Bob</kbd> по причине <kbd>Sorry Bob</kbd>.",
+       "apihelp-undelete-description": "Восстановление версий удалённой страницы.\n\nСписок удалённых версий с временными метками может быть получен с помощью [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], а список идентификаторов удалённых файлов может быть получен с помощью [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-param-title": "Заголовок восстанавливаемой страницы.",
+       "apihelp-undelete-param-reason": "Причина восстановления.",
+       "apihelp-undelete-param-tags": "Изменить метки записи в журнале удалений.",
+       "apihelp-undelete-param-timestamps": "Временные метки восстанавливаемых версий. Если и <var>$1timestamps</var>, и <var>$1fileids</var> пустые, все версии будут восстановлены.",
+       "apihelp-undelete-param-fileids": "Идентификаторы восстанавливаемых файловых версий. Если и <var>$1timestamps</var>, и <var>$1fileids</var> пустые, все версии будут восстановлены.",
+       "apihelp-undelete-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.",
        "apihelp-undelete-example-page": "Восстановить страницу <kbd>Main Page</kbd>.",
        "apihelp-undelete-example-revisions": "Восстановить две версии страницы <kbd>Main Page</kbd>.",
-       "apihelp-upload-param-filename": "целевое название файла",
-       "apihelp-upload-param-text": "Первоначальный текст страницы для новых файлов.",
+       "apihelp-unlinkaccount-description": "Удаление связанного стороннего аккаунта с текущим участником.",
+       "apihelp-unlinkaccount-example-simple": "Попытаться удалить связь между текущим участником и <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-upload-description": "Загрузка файла или получение статуса незавершённых загрузок.\n\nДоступно несколько режимов:\n* Прямо загрузить содержимое файла, используя параметр <var>$1file</var>.\n* Загрузить файл по кусочком, используя параметры <var>$1filesize</var>, <var>$1chunk</var> и <var>$1offset</var>.\n* Заставить сервер MediaWiki запросить файл по ссылке, используя параметр <var>$1url</var>.\n* Завершить старую загрузку, провалившуюся из-за предупреждений, используя параметр <var>$1filekey</var>.\nОбратите внимание, что запрос HTTP POST должен быть выполнен как загрузка файла (то есть, с использованием <code>multipart/form-data</code>) при отправке <var>$1file</var>.",
+       "apihelp-upload-param-filename": "Целевое название файла.",
+       "apihelp-upload-param-comment": "Описание загрузки. Также используется как начальный текст страницы при загрузке нового файла, если параметр <var>$1text</var> не задан.",
+       "apihelp-upload-param-tags": "Изменить метки записи в журнале загрузок и версии файловой страницы.",
+       "apihelp-upload-param-text": "Начальный текст страницы для новых файлов.",
        "apihelp-upload-param-watch": "Наблюдать за этой страницей",
-       "apihelp-upload-param-ignorewarnings": "Игнорируйте любые предупреждения.",
+       "apihelp-upload-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.",
+       "apihelp-upload-param-ignorewarnings": "Игнорировать все предупреждения.",
        "apihelp-upload-param-file": "Содержимое файла.",
-       "apihelp-upload-param-url": "URL-Адрес для извлечения файла из.",
+       "apihelp-upload-param-url": "Ссылка на запрашиваемый файл.",
+       "apihelp-upload-param-filekey": "Ключ, идентифицирующий предыдущую временную загрузку.",
+       "apihelp-upload-param-sessionkey": "Синоним $1filekey, обслуживаемый для обратной совместимости.",
+       "apihelp-upload-param-stash": "Если задано, сервер временно поместит файл в тайник вместо загрузки его в хранилище.",
+       "apihelp-upload-param-filesize": "Полны размер файла.",
        "apihelp-upload-param-offset": "Смещение блока в байтах.",
-       "apihelp-upload-param-chunk": "Кусок содержимого.",
-       "apihelp-upload-example-url": "Загрузить через URL",
-       "apihelp-userrights-description": "Изменить членство в группе пользователей.",
-       "apihelp-userrights-param-user": "Имя учётной записи.",
-       "apihelp-userrights-param-userid": "Идентификатор пользователя.",
-       "apihelp-userrights-param-add": "Добавить пользователя в эти группы.",
-       "apihelp-userrights-param-remove": "Удалить пользователя из этих групп.",
-       "apihelp-userrights-param-reason": "Причина изменений",
-       "apihelp-userrights-param-tags": "Изменить теги для подачи заявки на запись в журнале прав пользователей.",
+       "apihelp-upload-param-chunk": "Содержимое кусочка.",
+       "apihelp-upload-param-async": "Сделать операции над потенциально большими файлами асинхронными, когда это возможно.",
+       "apihelp-upload-param-checkstatus": "Только запросить статус загрузки для данного файлового ключа.",
+       "apihelp-upload-example-url": "Загрузка через URL.",
+       "apihelp-upload-example-filekey": "Завершение загрузки, провалившейся из-за предупреждений.",
+       "apihelp-userrights-description": "Изменение групп участника.",
+       "apihelp-userrights-param-user": "Имя участника.",
+       "apihelp-userrights-param-userid": "Идентификатор участника.",
+       "apihelp-userrights-param-add": "Добавить участника в эти группы, или, если они уже являются её членами, обновить дату истечения членства в этих группах.",
+       "apihelp-userrights-param-expiry": "Временная метка истечения. Может быть относительной (например, <kbd>5 months</kbd> или <kbd>2 weeks</kbd>) или абсолютной (например, <kbd>2014-09-18T12:34:56Z</kbd>). Если задана только одна временная метка, она будет использована для всех групп, переданных в параметре <var>$1add</var>. Используйте <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> или <kbd>never</kbd> для неистекаемой группы.",
+       "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-userrights-example-expiry": "Добавить участника <kbd>SometimeSysop</kbd> в группу <kbd>sysop</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>querty</kbd> для создаваемого участника <kbd>Example</kbd>.",
+       "apihelp-watch-description": "Добавление или удаление страниц из списка наблюдения текущего участника.",
+       "apihelp-watch-param-title": "Название страницы. Используйте <var>$1titles</var> вместо этого.",
+       "apihelp-watch-param-unwatch": "Если установлено, страницы будут удалены из списка наблюдения, а не добавлены в него.",
        "apihelp-watch-example-watch": "Следить за страницей <kbd>Main Page</kbd>.",
        "apihelp-watch-example-unwatch": "Не следить за страницей <kbd>Main Page</kbd>.",
-       "apihelp-json-description": "Выходные данные в формате json.",
-       "apihelp-jsonfm-description": "Выходные данные в JSON формате (pretty-print in HTML).",
-       "apihelp-none-description": "Нечего выводить",
-       "apihelp-php-description": "Выходные данные в сериализованном формате PHP.",
-       "apihelp-phpfm-description": "Выходные данные в сериализованном формате PHP (pretty-print in HTML).",
-       "apihelp-xml-description": "Выходные данные в формате XML.",
+       "apihelp-watch-example-generator": "Следить за первым несколькими страницами основного пространства имён.",
+       "apihelp-format-example-generic": "Вернуть результат запроса в формате $1.",
+       "apihelp-format-param-wrappedhtml": "Вернуть хорошо читаемый HTML со связанными модулями ResourceLoader  в виде объекта JSON.",
+       "apihelp-json-description": "Выводить данные в формате JSON.",
+       "apihelp-json-param-callback": "Если задано, оборачивает вывод в вызов данной функции. Из соображении безопасности, вся пользовательская информация будет удалена.",
+       "apihelp-json-param-utf8": "Если задано, кодирует большинство (но не все) не-ASCII символов в UTF-8 вместо замены их на шестнадцатеричные коды. Применяется по умолчанию, когда <var>formatversion</var> не равно <kbd>1</kbd>.",
+       "apihelp-json-param-ascii": "Если задано, заменяет все не-ASCII-символы на шестнадцатеричные коды. Применяется по умолчанию, когда <var>formatversion</var> равно <kbd>1</kbd>.",
+       "apihelp-json-param-formatversion": "Формат вывода:\n;1: Обратно совместимый формат (логические значения в стиле XML, ключи <samp>*</samp> для узлов данных, и так далее).\n;2: Экспериментальный современный формат. Детали могут меняться!\n;latest: Использовать последний формат (сейчас <kbd>2</kbd>), может меняться без предупреждения.",
+       "apihelp-jsonfm-description": "Выводить данные в JSON-формате (хорошо читаемом в HTML).",
+       "apihelp-none-description": "Ничего не выводить.",
+       "apihelp-php-description": "Выводить данные в сериализованном формате PHP.",
+       "apihelp-php-param-formatversion": "Формат вывода:\n;1: Обратно совместимый формат (логические значения в стиле XML, ключи <samp>*</samp> для узлов данных, и так далее).\n;2: Экспериментальный современный формат. Детали могут меняться!\n;latest: Использовать последний формат (сейчас <kbd>2</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-includexmlnamespace": "Если задано, добавляет пространство имён XML.",
+       "apihelp-xmlfm-description": "Выводить данные в формате XML (хорошо читаемом в HTML).",
        "api-format-title": "Результат MediaWiki API",
+       "api-format-prettyprint-header": "Это HTML-представление формата $1. HTML хорош для отладки, но неудобен для практического применения.\n\nУкажите параметр <var>format</var> для изменения формата вывода. Для отображения не-HTML-представления формата $1, присвойте <kbd>format=$2</kbd>.\n\nСм. [[mw:Special:MyLanguage/API|полную документацию]] или [[Special:ApiHelp/main|справку API]] для получения дополнительной информации.",
+       "api-format-prettyprint-header-only-html": "Это HTML-представление для отладки, не рассчитанное на практическое применение.\n\nСм. [[mw:Special:MyLanguage/API|полную документацию]] или [[Special:ApiHelp/main|справку API]] для получения дополнительной информации.",
+       "api-format-prettyprint-status": "Этот ответ будет возвращён HTTP статусом $1 $2.",
+       "api-login-fail-aborted": "Аутентификация требует взаимодействия с пользователем, что не поддерживается <kbd>action=login</kbd>. Чтобы авторизовываться через <kbd>action=login</kbd>, см. [[Special:BotPasswords]]. Для продолжения использования авторизации основного аккаунта см. <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-aborted-nobotpw": "Аутентификация требует взаимодействия с пользователем, что не поддерживается <kbd>action=login</kbd>. Для авторизации см. <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-badsessionprovider": "Авторизация при использовании $1 невозможна.",
+       "api-login-fail-sameorigin": "Авторизация при использовании правила ограничения домена невозможна.",
        "api-pageset-param-titles": "Список заголовков для работы.",
-       "api-pageset-param-pageids": "Список страниц идентификаторов для работы.",
+       "api-pageset-param-pageids": "Список идентификаторов страниц для работы.",
        "api-pageset-param-revids": "Список идентификаторов версий для работы.",
+       "api-pageset-param-generator": "Получить список страниц для работы, запустив указанный запрос-модуль.\n\n<strong>Примечание:</strong> названия параметров генераторов должны начинаться с «g», см. примеры.",
+       "api-pageset-param-redirects-generator": "Автоматически разрешать перенаправления в <var>$1titles</var>, <var>$1pageids</var> и <var>$1revids</var>, а также на страницах, возвращённых <var>$1generator</var>.",
+       "api-pageset-param-redirects-nogenerator": "Автоматически разрешать перенаправления в <var>$1titles</var>, <var>$1pageids</var> и <var>$1revids</var>.",
+       "api-pageset-param-converttitles": "Преобразовать заголовки в другой вариант, если это необходимо. Работает только если язык содержимого вики поддерживает преобразование вариантов. Языки, поддерживающие преобразование, включают в себя $1.",
        "api-help-title": "Справка MediaWiki API",
+       "api-help-lead": "Это автоматически сгенерированная страница документации MediaWiki API.\n\nДокументация и примеры: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Главный модуль",
-       "api-help-flag-deprecated": "Этот модуль устарел.",
+       "api-help-flag-deprecated": "Этот модуль не поддерживается.",
+       "api-help-flag-internal": "<strong>Этот модуль внутренний или нестабильный.</strong> Его операции могут измениться без предупреждения.",
        "api-help-flag-readrights": "Этот модуль требует прав на чтение.",
-       "api-help-flag-writerights": "Этот модуль требует права на запись.",
-       "api-help-flag-mustbeposted": "Этот модуль принимает только Post-запросы.",
+       "api-help-flag-writerights": "Этот модуль требует прав на запись.",
+       "api-help-flag-mustbeposted": "Этот модуль принимает только POST-запросы.",
        "api-help-flag-generator": "Этот модуль может быть использован в качестве генератора.",
        "api-help-source": "Источник: $1",
        "api-help-source-unknown": "Источник: <span class=\"apihelp-unknown\">unknown</span>",
        "api-help-license": "Лицензия: [[$1|$2]]",
-       "api-help-license-noname": "Лицензия: [[$1|See link]]",
+       "api-help-license-noname": "Лицензия: [[$1|см. ссылку]]",
        "api-help-license-unknown": "Лицензия: <span class=\"apihelp-unknown\">unknown</span>",
        "api-help-parameters": "Параметр{{PLURAL:$1||ы}}:",
-       "api-help-param-deprecated": "УÑ\81Ñ\82аÑ\80евÑ\88ий.",
+       "api-help-param-deprecated": "Ð\9dе Ð¿Ð¾Ð´Ð´ÐµÑ\80живаеÑ\82Ñ\81Ñ\8f.",
        "api-help-param-required": "Это обязательный параметр.",
        "api-help-datatypes-header": "Типы данных",
+       "api-help-datatypes": "Ввод в MediaWiki должен быть NFC-нормализованным UTF-8. MediaWiki может попытаться преобразовать другой ввод, но это приведёт к провалу некоторых операций (таких, как [[Special:ApiHelp/edit|редактирование]] со сверкой MD5).\n\nНекоторые типы параметров в запросах API требуют дополнительных пояснений:\n;логический\n:Логические параметры работают как флажки (checkboxes) в HTML: если параметр задан, независимо от его значения, он воспринимается за истину. Для передачи ложного значения просто опустите параметр.\n;временные метки\n:Временные метки могут быть заданы в нескольких форматах. Рекомендуемым является дата и время ISO 8601. Всё время считается в UTC, любые включённые часовые пояса игнорируются.\n:* Дата и время ISO 8601: <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (знаки препинания и <kbd>Z</kbd> необязательны)\n:* Дата и время ISO 8601 с (игнорируемой) дробной частью секунд: <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (дефисы, двоеточия и <kbd>Z</kbd> необязательны)\n:* Формат MediaWiki: <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Общий числовой формат: <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (необязательный часовой пояс <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd> или <kbd>-<var>##</var></kbd> игнорируется)\n:* Формат EXIF: <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Формат RFC 2822 (часовой пояс может быть опущен): <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Формат RFC 850 (часовой пояс может быть опущен): <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Формат ctime языка программирования C: <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Количество секунд, прошедших с 1970-01-01T00:00:00Z, в виде челого числа с от 1 до 13 знаками (исключая <kbd>0</kbd>)\n:* Строка <kbd>now</kbd>\n;альтернативный разделитель значений\n:Параметры, принимающие несколько значений, обычно отправляются со значениями, разделёнными с помощью символа пайпа, например, <kbd>param=value1|value2</kbd> или <kbd>param=value1%7Cvalue2</kbd>. Если значение должно содержать символ пайпа, используйте U+001F (Unit Separator) в качестве разделителя ''и'' добавьте в начало значения U+001F, например, <kbd>param=%1Fvalue1%1Fvalue2</kbd>.",
        "api-help-param-type-limit": "Тип: целое число или <kbd>max</kbd>",
-       "api-help-param-type-integer": "Тип: {{PLURAL:$1|1=integer|2=list of integers}}",
-       "api-help-param-type-boolean": "Тип: двоичный ([[Special:ApiHelp/main#main/datatypes|details]])",
-       "api-help-param-type-timestamp": "Тип: {{PLURAL:$1|1=timestamp|2=list of timestamps}} ([[Special:ApiHelp/main#main/datatypes|allowed formats]])",
-       "api-help-param-type-user": "Тип: {{PLURAL:$1|1=user name|2=list of user names}}",
-       "api-help-param-list": "{{PLURAL:$1|1=Одно из следующих значений|2=Значения (разделённые с помощью <kbd>{{!}}</kbd> или [[Special:ApiHelp/main#main/datatypes|альтернативного варианта]])}}: $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=value|2=values}} должен быть не меньше чем $2.",
-       "api-help-param-integer-max": "{{PLURAL:$1|1=value|2=values}} должен быть не больше чем $3.",
-       "api-help-param-integer-minmax": "{{PLURAL:$1|1=value|2=values}} должен быть между $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-type-integer": "Тип: {{PLURAL:$1|1=целое число|2=список целых чисел}}",
+       "api-help-param-type-boolean": "Тип: логический ([[Special:ApiHelp/main#main/datatypes|подробнее]])",
+       "api-help-param-type-timestamp": "Тип: {{PLURAL:$1|1=временная метка|2=список временных меток}} ([[Special:ApiHelp/main#main/datatypes|разрешённые форматы]])",
+       "api-help-param-type-user": "Тип: {{PLURAL:$1|1=имя участника|2=список имён участников}}",
+       "api-help-param-list": "{{PLURAL:$1|1=Одно из следующих значений|2=Значения (разделённые с помощью <kbd>{{!}}</kbd> или [[Special:ApiHelp/main#main/datatypes|альтернативного разделителя]])}}: $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-upload": "Должно быть отправлено как файл с использованием multipart/form-data.",
+       "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-multi-all": "Для указания всех значений, используйте <kbd>$1</kbd>.",
        "api-help-param-default": "По умолчанию: $1",
        "api-help-param-default-empty": "По умолчанию: <span class=\"apihelp-empty\">(пусто)</span>",
-       "api-help-param-continue": "Когда доступно больше результатов, использовать этот чтобы продолжить.",
+       "api-help-param-token": "Токен «$1», полученный из [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-token-webui": "Для обратной совместимости, токен, используемый в веб-интерфейсе, также применим.",
+       "api-help-param-disabled-in-miser-mode": "Отключено из-за [[mw:Special:MyLanguage/Manual:$wgMiserMode|жадного режима]].",
+       "api-help-param-limited-in-miser-mode": "<strong>Примечание:</strong> Из-за [[mw:Special:MyLanguage/Manual:$wgMiserMode|жадного режима]], использование этого может привести к меньшему, чем <var>$1limit</var>, числу результатов перед продолжением; в крайнем случае, может вернуться и ноль результатов.",
+       "api-help-param-direction": "В каком порядке перечислять:\n;newer: Начать с самых старых. Обратите внимание: $1start должно быть раньше $1end.\n;older: Начать с самых новых (по умолчанию). Обратите внимание: $1start должно быть позже $1end.",
+       "api-help-param-continue": "Когда доступно больше результатов, используйте это для продолжения.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(описание отсутствует)</span>",
        "api-help-examples": "Пример{{PLURAL:$1||ы}}:",
        "api-help-permissions": "{{PLURAL:$1|Разрешение|Разрешения}}:",
-       "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-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>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> с <kbd>amirequestsfor=$4</kbd>, и токена <kbd>$5</kbd> из <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Предоставление полей пользователю и получение его данных.\n# Запрос к этому модулю, содержащий <var>$1returnurl</var> или аналогичное поле.\n# Проверка поля <samp>status</samp> ответа.\n#* Если вы получили <samp>PASS</samp> или <samp>FAIL</samp>, вы закончили. Операция либо завершилась успехом, либо нет.\n#* Если вы получили <samp>UI</samp>, предоставьте новые поля польззователю и получите новые данные. Затем совершите новый запрос с параметром <var>$1continue</var> и новыми полями, после чего повторите пункт 4.\n#* Если вы получили <samp>REDIRECT</samp>, отправьте пользователя на <samp>redirecttarget</samp> и подождите возвращения на <var>$1returnurl</var>. Затем совершите запрос к этому модулю с параметром <var>$1continue</var> и всеми полями, содержащимися в возвращённой ссылке, и повторите пункт 4.\n#* Если вы получили <samp>RESTART</samp>, это означает, что аутентификация работает, но мы не привязали пользовательский аккаунт. Вы можете рассматривать это как <samp>UI</samp> или <samp>FAIL</samp>.",
+       "api-help-authmanagerhelper-requests": "Использовать только эти аутентификационные запросы, с <samp>id</samp>, возвращённом из <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> с <kbd>amirequestsfor=$1</kbd>, или из предыдущего ответа этого модуля.",
+       "api-help-authmanagerhelper-request": "Использовать этот аутентификационный запрос, с <samp>id</samp>, возвращённом из <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> с <kbd>amirequestsfor=$1</kbd>.",
+       "api-help-authmanagerhelper-messageformat": "Формат, используемый для возвращаемых сообщений.",
+       "api-help-authmanagerhelper-mergerequestfields": "Слить поля информации со всех аутентификационных запросов в один массив.",
+       "api-help-authmanagerhelper-preservestate": "Сохранить состояние с предыдущей провалившейся попытки авторизации, если возможно.",
+       "api-help-authmanagerhelper-returnurl": "Вернуть ссылку для стороннего процесса аутентификации, должна быть абсолютной. Либо этот параметр, либо <var>$1continue</var>, обязателен.\n\nПосле получения ответа <samp>REDIRECT</samp>, вы, как правило, должны открыть в браузере или вэб-просмотрщике указанную в <samp>redirecttarget</samp> ссылку для продолжения стороннего процесса аутентификации. По завершению, сторонний сервис отошлёт браузеру или веб-просмотрщику эту ссылку. Вы должны извлечь все параметры из ссылки и отослать их в параметр <var>$1continue</var> запроса к этому модулю.",
+       "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>$wgAPIMaxResultSize</code> этой вики слишком мало, чтобы вместить базовую информацию о результате.",
+       "apierror-badcontinue": "Некорректный параметр continue. Вы должны передать значение, возвращённое предыдущим запросом.",
+       "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» параметра ссылки <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-cannot-async-upload-file": "Параметры <var>async</var> и <var>file</var> не могут применяться вместе. Если вы хотите ассинхронно обработать загруженный файл, сначала загрузите его в тайник (используя параметр <var>stash</var>), а затем опубликуйте этот файл ассинхронно (используя параметры <var>filekey</var> и <var>async</var>).",
+       "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": "Загрузка по ссылке недоступна с этого домена.",
+       "apierror-copyuploadbadurl": "Загрузка по этой ссылке недоступна.",
+       "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> не может быть использован в третьем режиме.",
+       "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": "Параметр <var>oldimage</var> имеет недопустимый формат.",
+       "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": "Параметр <var>section</var> должен быть корректным идентификатором секции или <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": "Параметру <var>$1</var> может быть присвоено только {{PLURAL:$3|значение|одно из значений}} $2.",
+       "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": "Тайник загрузки (upload stash) доступен только для авторизованных участников.",
+       "apierror-mustbeloggedin": "Вы должны быть авторизованы в $1.",
+       "apierror-mustbeposted": "Модуль <kbd>$1</kbd> требует запроса POST.",
+       "apierror-mustpostparams": "{{PLURAL:$2|Следующий параметр был найден|Следующие параметры были найдены}} в строке запроса, но {{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-badid": "Не было найдено версий по параметру <var>$1</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": "Подсчёт разницы размеров отключён в жадном режиме.",
+       "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": "Нет такого ключа файла: $1.",
+       "apierror-stashpathinvalid": "Ключ файла относится к некорректному формату или сам некорректен: $1.",
+       "apierror-stashwrongowner": "Некорректный владелец: $1",
+       "apierror-stashzerolength": "Файл имеет нулевую длину и не может быть сохранён в тайник: $1",
+       "apierror-systemblocked": "Вы были заблокированы автоматически MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "Раскрытие шаблонов разрешено только для вики-текстового содержимого. $1 использует модель содержимого $2.",
+       "apierror-toofewexpiries": "Задано $1 {{PLURAL:$1|временная метка|временные метки|временных меток}} истечения, необходимо $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": "Невозможно распарсить $2 из <var>$1urlparam</var>. Используется только ширина и высота.",
+       "apiwarn-badutf8": "Значение, переданное <var>$1</var>, содержит некорректные или ненормализованные данные. Текстовые данные должны быть корректным NFC-нормализованным Юникодом без символов управления C0, кроме HT (\\t), LF (\\n) и CR (\\r).",
+       "apiwarn-checktoken-percentencoding": "Проверьте, что символы вроде «+» в токене корректно закодированы %-последовательностями в ссылке.",
+       "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>, см.\n[[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>, при этом запрошены распарсенные свойства страницы. Возможно, вы хотели использовать <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": "Значение ширины ($2), переданное в <var>$1urlparam</var>, было проигнорировано в пользу значения ($3), полученного из параметров <var>$1urlwidth</var>/<var>$1urlheight</var>.",
+       "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-credits-header": "Создатели"
+       "api-usage-docref": "См. $1 для использования API.",
+       "api-usage-mailinglist-ref": "Подпишитесь на электронную рассылку MediaWiki API на &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt;, чтобы получать информацию о неподдерживаемых функциях и ломающих изменениях.",
+       "api-exception-trace": "$1 в $2($3)\n$4",
+       "api-credits-header": "Создатели",
+       "api-credits": "Разработчики API:\n* Yuri Astrakhan (создатель, ведущий разработчик с сентября 2006 по сентябрь 2007)\n* Roan Kattouw (ведущий разработчик 2007—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 5498449..9e72a0a 100644 (file)
        "apihelp-query+protectedtitles-example-simple": "Lista skyddade titlar.",
        "apihelp-query+recentchanges-example-simple": "Lista de senaste ändringarna.",
        "apihelp-query+revisions-example-first5-not-localhost": "Hämta första 5 revideringarna av \"huvudsidan\" och som inte gjorts av anonym användare \"127.0.0.1\"",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Returnerar en lista över språkkoder som [[mw:LanguageConverter|LanguageConverter]] har aktiverat och de varianter som varje stöder.",
        "apihelp-query+siteinfo-example-simple": "Hämta information om webbplatsen.",
        "apihelp-query+stashimageinfo-description": "Returnerar filinformation för temporära filer.",
        "apihelp-query+stashimageinfo-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
        "apihelp-query+stashimageinfo-example-simple": "Returnerar information för en temporär fil",
        "apihelp-query+tags-example-simple": "Lista tillgängliga taggar.",
+       "apihelp-query+templates-param-namespace": "Visa mallar i endast denna namnrymd.",
        "apihelp-query+userinfo-example-simple": "Få information om den aktuella användaren.",
        "apihelp-query+userinfo-example-data": "Få ytterligare information om den aktuella användaren.",
        "apihelp-query+watchlist-description": "Hämta de senaste ändringarna på sidor i den nuvarande användarens bevakningslista.",
        "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-invalidoldimage": "Parametern <var>oldimage</var> har ett ogiltigt format.",
+       "apierror-invalidsection": "Parametern <var>section</var> måste vara ett giltigt avsnitts-ID eller <kbd>new</kbd>.",
        "apierror-nosuchuserid": "Det finns ingen användare med ID $1.",
        "apierror-protect-invalidaction": "Ogiltig skyddstyp \"$1\".",
+       "apierror-revisions-badid": "Ingen revision hittades för parametern <var>$1</var>.",
        "apierror-systemblocked": "Du har blockerats automatiskt av MediaWiki.",
        "apierror-unknownformat": "Okänt format \"$1\".",
        "api-feed-error-title": "Fel ($1)"
index e3dba0b..70aa3f4 100644 (file)
                        "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-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Документація]]\n* [[mw:Special:MyLanguage/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:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Тестування:</strong> Для зручності тестування запитів API, див. [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Яку дію виконати.",
        "apihelp-main-param-format": "Формат виводу.",
-       "apihelp-main-param-maxlag": "Максимальна затримка може використовуватися, коли MediaWiki інстальовано на реплікований кластер бази даних. Щоб зберегти дії, які спричиняють більшу затримку реплікації, цей параметр може змусити клієнт почекати, поки затримка реплікації не буде меншою за вказане значення. У випадку непомірної затримки, видається код помилки <samp>maxlag</samp> з повідомленням на зразок <samp>Очікування на $host: $lag секунд(и) затримки</samp>.<br />Див. [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] для детальнішої інформації.",
+       "apihelp-main-param-maxlag": "Максимальна затримка може використовуватися, коли MediaWiki інстальовано на реплікований кластер бази даних. Щоб зберегти дії, які спричиняють більшу затримку реплікації, цей параметр може змусити клієнт почекати, поки затримка реплікації не буде меншою за вказане значення. У випадку непомірної затримки, видається код помилки <samp>maxlag</samp> з повідомленням на зразок <samp>Очікування на $host: $lag секунд(и) затримки</samp>.<br />Див. [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]] для детальнішої інформації.",
        "apihelp-main-param-smaxage": "Встановити <code>s-maxage</code> HTTP кеш-контроль заголовок на стільки секунд. Помилки ніколи не кешуються.",
        "apihelp-main-param-maxage": "Встановити <code>max-age</code> HTTP кеш-контроль заголовок на стільки секунд. Помилки ніколи не кешуються.",
        "apihelp-main-param-assert": "Перевірити, що користувач увійшов у систему, якщо задано <kbd>user</kbd>, або має права бота, якщо задано <kbd>bot</kbd>.",
@@ -42,7 +42,7 @@
        "apihelp-block-param-autoblock": "Автоматично блокувати 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-allowusertalk": "Дозволити користувачу редагувати власну сторінку обговорення (залежить від <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Якщо користувач уже заблокований, переписати наявне блокування.",
        "apihelp-block-param-watchuser": "Спостерігати за сторінкою користувача чи IP-адреси і сторінкою обговорення.",
        "apihelp-block-param-tags": "Змінити теги для застосування їх до запису в журналі блокувань.",
        "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-suggest": "Нічого не робити, якщо <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> хибний.",
        "apihelp-opensearch-param-redirects": "Як обробляти перенаправлення:\n;return:Видати саме перенаправлення.\n;resolve:Видати цільову сторінку. Може видати менше, ніж $1limit результат{{PLURAL:$1limit||и|ів}}.\nЗ історичних причин, за замовчуванням стоїть «return» для $1format=json і «resolve» — для інших форматів.",
        "apihelp-opensearch-param-format": "Формат виводу.",
        "apihelp-opensearch-param-warningsaserror": "Якщо при <kbd>format=json</kbd> з'являються попередження, видати помилку API замість того, щоб їх ігнорувати.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Дає звіт по обмеженнях у структурованому вигляді. Не видає даних, якщо встановлено <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Дає HTML-версію звіту по обмеженнях. Не видає даних, якщо встановлено <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-parsetree": "Синтаксичне дерево XML вмісту версії (передбачає модель вмісту <code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "Виводить попередження, які з'явилися при обробці контенту.",
+       "apihelp-parse-param-wrapoutputclass": "CSS-клас для загортання в нього виводу парсера.",
        "apihelp-parse-param-pst": "Зробіть трансформацію вхідних даних перед збереженням і аналізом. Дійсне лише при використанні з текстом.",
        "apihelp-parse-param-onlypst": "Зробіть трансформацію вхідних даних перед збереженням (PST), але не аналізуйте. Видає той самий вікітекст, після застосування PST. Дійсне лише у разі використання з <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Включає мовні посилання, додані розширеннями (для використання з <kbd>$1prop=langlinks</kbd>).",
        "apihelp-query+alldeletedrevisions-param-user": "Перерахувати лише версії цього користувача.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Не перераховувати версії цього користувача.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Перерахувати сторінки лише в цьому просторі назв.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Примітка:</strong> через [[mw:Manual:$wgMiserMode|«скупий режим»]], використання <var>$1user</var> і <var>$1namespace</var> одночасно можуть вилитися у видачу результатів менше ніж <var>$1limit</var> перед продовженням; в особливих випадках можуть видаватися нульові результати.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Примітка:</strong> через [[mw:Special:MyLanguage/Manual:$wgMiserMode|«скупий режим»]], використання <var>$1user</var> і <var>$1namespace</var> одночасно можуть вилитися у видачу результатів менше ніж <var>$1limit</var> перед продовженням; в особливих випадках можуть видаватися нульові результати.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Коли використовується як генератор, генерувати заголовки замість ідентифікаторів версій.",
        "apihelp-query+alldeletedrevisions-example-user": "Перерахувати останні 50 вилучених редагувань користувача <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Перерахувати останні 50 вилучених версій у головному просторі назв.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Додає до імені версію архіву для неостаточного варіанту файлу.",
        "apihelp-query+filearchive-example-simple": "Показати список усіх вилучених файлів.",
        "apihelp-query+filerepoinfo-description": "Видати мета-інформацію про репозиторії зображень, налаштовані на вікі.",
-       "apihelp-query+filerepoinfo-param-prop": "Які властивості репозиторію отримати (на деяких вікі може бути більше):\n;apiurl:URL до репозиторію API — корисне для отримання інформації про зображення з хосту.\n;name:Ключ репозиторію — використано в e.g. <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> і значення [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Людиночита назва репозиторію вікі.\n;rooturl:Корінний URL для шляху зображення.\n;local:Чи репозиторій локальний, чи ні.",
+       "apihelp-query+filerepoinfo-param-prop": "Які властивості репозиторію отримати (на деяких вікі може бути більше):\n;apiurl:URL до репозиторію API — корисне для отримання інформації про зображення з хосту.\n;name:Ключ репозиторію — використано в e.g. <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> і значення [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Людиночита назва репозиторію вікі.\n;rooturl:Корінний URL для шляху зображення.\n;local:Чи репозиторій локальний, чи ні.",
        "apihelp-query+filerepoinfo-example-simple": "Отримати інформацію про репозиторії файлів.",
        "apihelp-query+fileusage-description": "Знайти всі сторінки, що використовують дані файли.",
        "apihelp-query+fileusage-param-prop": "Які властивості отримати:",
        "apihelp-query+redirects-example-generator": "Отримати інформацію про всі перенаправлення на [[Main Page]].",
        "apihelp-query+revisions-description": "Отримати інформацію про версію.\n\nМоже бути використано кількома способами:\n# Отримати дані про набір сторінок (останні версії), вказавши назви або ідентифікатори сторінок.\n# Отримати версії для однієї вказаної сторінки, використавши назви або ідентифікатори і початок, кінець чи ліміт.\n# Отримати дані про набір версій, встановивши їх ID й ідентифікатори версій.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "Може використовуватися тільки з однією сторінкою (режим #2).",
-       "apihelp-query+revisions-param-startid": "Ð\97 Ñ\8fкого ID Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97 Ð¿Ð¾Ñ\87аÑ\82и Ð¿ÐµÑ\80елÑ\96к.",
-       "apihelp-query+revisions-param-endid": "Ð\97Ñ\83пиниÑ\82и Ð¿ÐµÑ\80елÑ\96к Ð²ÐµÑ\80Ñ\81Ñ\96й Ð½Ð° Ñ\86Ñ\8cомÑ\83 ID Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97.",
+       "apihelp-query+revisions-param-startid": "Ð\9fоÑ\87аÑ\82и Ð½Ñ\83меÑ\80аÑ\86Ñ\96Ñ\8e Ð· Ð¼Ñ\96Ñ\82ки Ñ\87аÑ\81Ñ\83 Ñ\86Ñ\96Ñ\94Ñ\97 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97. Ð\92еÑ\80Ñ\81Ñ\96Ñ\8f Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° Ñ\96Ñ\81нÑ\83ваÑ\82и, Ð°Ð»Ðµ Ð½Ðµ Ð¾Ð±Ð¾Ð²'Ñ\8fзково Ð¼Ð°Ñ\94 Ð½Ð°Ð»ÐµÐ¶Ð°Ñ\82и Ð´Ð¾ Ñ\86Ñ\96Ñ\94Ñ\97 Ñ\81Ñ\82оÑ\80Ñ\96нки.",
+       "apihelp-query+revisions-param-endid": "Ð\97Ñ\83пиниÑ\82и Ð½Ñ\83меÑ\80аÑ\86Ñ\96Ñ\8e Ð½Ð° Ð¼Ñ\96Ñ\82Ñ\86Ñ\96 Ñ\87аÑ\81Ñ\83 Ñ\86Ñ\96Ñ\94Ñ\97 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97. Ð¦Ñ\8f Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\8f Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° Ñ\96Ñ\81нÑ\83ваÑ\82и, Ð°Ð»Ðµ Ð½Ðµ Ð¾Ð±Ð¾Ð²'Ñ\8fзково Ð¼Ñ\83Ñ\81иÑ\82Ñ\8c Ð½Ð°Ð»ÐµÐ¶Ð°Ñ\82и Ð´Ð¾ Ñ\86Ñ\96Ñ\94Ñ\97 Ñ\81Ñ\82оÑ\80Ñ\96нки.",
        "apihelp-query+revisions-param-start": "З якої часової мітки версії почати перелік.",
        "apihelp-query+revisions-param-end": "Перелічувати до цієї часової мітки.",
        "apihelp-query+revisions-param-user": "Включати лише версій, зроблені цим користувачем.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Видає інформацію щодо прав (ліцензії) вікі, якщо наявна.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Видає інформацію про наявні типи обмежень (захисту).",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Видає список мов, які підтримує MediaWiki (за бажанням локалізовані через <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Виводить список кодів мов, для яких увімкнено [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]], а також варіанти, підтримувані кожною з цих мов.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Видає список усіх доступних тем оформлення (опціонально локалізовані з використанням <var>$1inlanguagecode</var>, в іншому разі — мовою вмісту).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Видає список теґів розширення парсеру.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Видає список гуків парсерних функцій.",
-       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Видає список усіх підписаних гуків (вміст <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Видає список усіх підписаних гуків (вміст <var>[[mw:Special:MyLanguage/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+usercontribs-paramvalue-prop-flags": "Додає прапорці редагування.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Відзначає патрульовані редагування.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Перелічує мітки редагування.",
-       "apihelp-query+usercontribs-param-show": "Показати лише елементи, що відповідають цим критеріям, наприклад, лише не незначні редагування: <kbd>$2show=!minor</kbd>.\n\nЯкщо вказано <kbd>$2show=patrolled</kbd> або <kbd>$2show=!patrolled</kbd>, версії, старіші ніж <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|секунда|секунди|секунд}}) не будуть показуватися.",
+       "apihelp-query+usercontribs-param-show": "Показати лише елементи, що відповідають цим критеріям, наприклад, лише не незначні редагування: <kbd>$2show=!minor</kbd>.\n\nЯкщо вказано <kbd>$2show=patrolled</kbd> або <kbd>$2show=!patrolled</kbd>, версії, старіші ніж <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|секунда|секунди|секунд}}) не будуть показуватися.",
        "apihelp-query+usercontribs-param-tag": "Перерахувати лише версії, помічені цим теґом.",
        "apihelp-query+usercontribs-param-toponly": "Виводити лише зміни, які є останньою версією.",
        "apihelp-query+usercontribs-example-user": "Показати внесок користувача <kbd>Example</kbd>.",
        "apihelp-removeauthenticationdata-description": "Вилучити параметри автентифікації для поточного користувача.",
        "apihelp-removeauthenticationdata-example-simple": "Спроба вилучити дані поточного користувача для <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "Відправити користувачу лист для відновлення пароля.",
-       "apihelp-resetpassword-description-noroutes": "Немає доступних способів відновити пароль.\n\nУвімкніть способи у <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>, щоб використовувати цей модуль.",
+       "apihelp-resetpassword-description-noroutes": "Немає доступних способів відновити пароль.\n\nУвімкніть способи у <var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>, щоб використовувати цей модуль.",
        "apihelp-resetpassword-param-user": "Користувача відновлено.",
        "apihelp-resetpassword-param-email": "Адреса електронної пошти користувача відновлено.",
        "apihelp-resetpassword-example-user": "Надіслати лист для скидання пароля користувачу <kbd>Example</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-description-disabled": "Зміна мови сторінки заборонена в цій вікі. \n\nУвімкніть <var>[[mw:Special:MyLanguage/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-xml-param-includexmlnamespace": "Якщо вказано, додає простір назв XML.",
        "apihelp-xmlfm-description": "Вивести дані у форматі XML (вивід відформатованого коду за допомогою HTML).",
        "api-format-title": "Результат запиту до API MediaWiki",
-       "api-format-prettyprint-header": "Це HTML-представлення формату $1. HTML є гарним для налагодження, однак не придатний для прикладного використання.\n\nУкажіть значення для параметра <var>format</var>, для того щоб змінити формат. Для перегляду не-HTML-представлення формату, $1, вкажіть <kbd>format=$2</kbd>.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
-       "api-format-prettyprint-header-only-html": "Це HTML-представлення призначене для налагодження, однак не придатне для прикладного використання.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
+       "api-format-prettyprint-header": "Це HTML-представлення формату $1. HTML є гарним для налагодження, однак не придатний для прикладного використання.\n\nУкажіть значення для параметра <var>format</var>, для того щоб змінити формат. Для перегляду не-HTML-представлення формату, $1, вкажіть <kbd>format=$2</kbd>.\n\nДив. [[mw:Special:MyLanguage/API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
+       "api-format-prettyprint-header-only-html": "Це HTML-представлення призначене для налагодження, однак не придатне для прикладного використання.\n\nДив. [[mw:Special:MyLanguage/API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
        "api-format-prettyprint-status": "Відповідь повернеться із HTTP-статусом $1 $2.",
        "api-pageset-param-titles": "Список назв над якими працювати.",
        "api-pageset-param-pageids": "Список ідентифікаторів сторінок над якими працювати.",
        "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": "Для сумісності, приймається також токен, використаний у користувацькому веб-інтерфейсі.",
-       "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-disabled-in-miser-mode": "Вимкнено через [[mw:Special:MyLanguage/Manual:$wgMiserMode|скупий режим]].",
+       "api-help-param-limited-in-miser-mode": "<strong>Примітка:</strong> через [[mw:Special:MyLanguage/Manual:$wgMiserMode|«скупий режим»]], використання цього може вилитися у видачу результатів менше ніж <var>$1limit</var> перед продовженням; в особливих випадках можуть видаватися нульові результати.",
        "api-help-param-direction": "У якому напрямку перелічувати:\n;newer:Спочатку найстарші. Примітка: $1start має бути перед $1end.\n;older:Спочатку найновіші (за замовчуванням). Примітка: $1start має бути перед $1end.",
        "api-help-param-continue": "Коли доступно більше результатів, використовуйте це, щоб продовжити.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(без опису)</span>",
        "apierror-invalidexpiry": "Недійсний час завершення «$1».",
        "apierror-invalid-file-key": "Недійсний ключ файлу.",
        "apierror-invalidlang": "Недійсний код мови для параметра <var>$1</var>.",
-       "apierror-invalidoldimage": "Параметр «oldimage» має недійсний формат.",
+       "apierror-invalidoldimage": "Параметр <var>oldimage</var> має недійсний формат.",
        "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-invalidsection": "Параметр <var>section</var> має бути дійсним ідентифікатором розділу або <kbd>new</kbd>.",
        "apierror-invalidsha1base36hash": "Поданий хеш SHA1Base36 недійсний.",
        "apierror-invalidsha1hash": "Поданий хеш SHA1 недійсний.",
        "apierror-invalidtitle": "Погана назва «$1».",
        "apierror-revdel-mutuallyexclusive": "Одне й те ж поле не може використовуватись у <var>hide</var> і <var>show</var> водночас.",
        "apierror-revdel-needtarget": "Для цього типу RevDel необхідна цільова назва.",
        "apierror-revdel-paramneeded": "Щонайменше одне значення необхідне для <var>hide</var> та/або <var>show</var>.",
+       "apierror-revisions-badid": "Для параметра <var>$1</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.",
        "apiwarn-redirectsandrevids": "Вирішення перенаправлень не може використовуватись разом з параметром <var>revids</var>. Усі перенаправлення, на які вказує <var>revids</var>, не було вирішено.",
        "apiwarn-tokennotallowed": "Дія «$1» недозволена для поточного користувача.",
        "apiwarn-tokens-origin": "Токени не можна отримати, поки не застосована політика одного походження.",
-       "apiwarn-toomanyvalues": "Надто багато значень задано для параметра <var>$1</var>: ліміт становить $2.",
+       "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.",
index 36251d4..45cf709 100644 (file)
                        "D41D8CD98F"
                ]
        },
-       "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 header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[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:Special:MyLanguage/API:Main_page|文档]]\n* [[mw:Special:MyLanguage/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 header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:Special:MyLanguage/API:Errors_and_warnings|API: 错误与警告]]。\n\n<strong>测试中:</strong>测试API请求的易用性,请参见[[Special:ApiSandbox]]。",
        "apihelp-main-param-action": "要执行的操作。",
        "apihelp-main-param-format": "输出的格式。",
-       "apihelp-main-param-maxlag": "最大延迟可被用于MediaWiki安装于数据库复制集中。要保存导致更多网站复制延迟的操作,此参数可使客户端等待直到复制延迟少于指定值时。万一发生过多延迟,错误代码<samp>maxlag</samp>会返回消息,例如<samp>等待$host中:延迟$lag秒</samp>。<br />参见[[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]]以获取更多信息。",
+       "apihelp-main-param-maxlag": "最大延迟可被用于MediaWiki安装于数据库复制集中。要保存导致更多网站复制延迟的操作,此参数可使客户端等待直到复制延迟少于指定值时。万一发生过多延迟,错误代码<samp>maxlag</samp>会返回消息,例如<samp>等待$host中:延迟$lag秒</samp>。<br />参见[[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]]以获取更多信息。",
        "apihelp-main-param-smaxage": "设置<code>s-maxage</code> HTTP缓存控制头至这些秒。错误不会缓存。",
        "apihelp-main-param-maxage": "设置<code>max-age</code> HTTP缓存控制头至这些秒。错误不会缓存。",
        "apihelp-main-param-assert": "如果设置为<kbd>user</kbd>就验证用户是否登录,或如果设置为<kbd>bot</kbd>就验证是否有机器人用户权限。",
@@ -52,7 +52,7 @@
        "apihelp-block-param-autoblock": "自动封禁最近使用的IP地址,以及以后他们尝试登陆使用的IP地址。",
        "apihelp-block-param-noemail": "阻止用户通过wiki发送电子邮件。(需要<code>blockemail</code>权限)。",
        "apihelp-block-param-hidename": "从封禁日志中隐藏用户名。(需要<code>hideuser</code>权限)。",
-       "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页(取决于<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>)。",
+       "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页(取决于<var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>)。",
        "apihelp-block-param-reblock": "如果该用户已被封禁,则覆盖已有的封禁。",
        "apihelp-block-param-watchuser": "监视用户或该 IP 的用户页和讨论页。",
        "apihelp-block-param-tags": "要在封禁日志中应用到实体的更改标签。",
        "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-suggest": "如果<var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var>设置为false则不做任何事情。",
        "apihelp-opensearch-param-redirects": "如何处理重定向:\n;return:返回重定向本身。\n;resolve:返回目标页面。可能返回少于$1limit个结果。\n由于历史原因,$1format=json默认为\"return\",其他格式默认为\"resolve\"。",
        "apihelp-opensearch-param-format": "输出格式。",
        "apihelp-opensearch-param-warningsaserror": "如果警告通过<kbd>format=json</kbd>提升,返回一个API错误而不是忽略它们。",
        "apihelp-parse-paramvalue-prop-limitreportdata": "以结构化的方式提供限制报告。如果<var>$1disablelimitreport</var>被设定则不提供数据。",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "提供限制报告的HTML版本。当<var>$1disablelimitreport</var>被设置时不会提供数据。",
        "apihelp-parse-paramvalue-prop-parsetree": "修订内容的XML解析树(需要内容模型<code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "在解析内容时提供发生的警告",
+       "apihelp-parse-param-wrapoutputclass": "要用于包裹解析输出的CSS类。",
        "apihelp-parse-param-pst": "在解析输入前,对输入做一次保存前变换处理。仅当使用文本时有效。",
        "apihelp-parse-param-onlypst": "在输入内容中执行预保存转换(PST),但不解析它。在PST被应用后返回相同的wiki文本。只当与<var>$1text</var>一起使用时有效。",
        "apihelp-parse-param-effectivelanglinks": "包含由扩展提供的语言链接(用于与<kbd>$1prop=langlinks</kbd>一起使用)。",
        "apihelp-parse-param-preview": "在预览模式下解析。",
        "apihelp-parse-param-sectionpreview": "在段落预览模式下解析(同时要启用预览模式)。",
        "apihelp-parse-param-disabletoc": "在输出中省略目录。",
+       "apihelp-parse-param-useskin": "为解析器输出应用选择的皮肤。会影响以下属性:<kbd>langlinks</kbd>、<kbd>headitems</kbd>、<kbd>modules</kbd>、<kbd>jsconfigvars</kbd>和<kbd>indicators</kbd>。",
        "apihelp-parse-param-contentformat": "用于输入文本的内容序列化格式。只当与$1text一起使用时有效。",
        "apihelp-parse-param-contentmodel": "输入文本的内容模型。如果省略,$1title必须指定,并且默认将为指定标题的模型。只当与$1text一起使用时有效。",
        "apihelp-parse-example-page": "解析一个页面。",
        "apihelp-query+alldeletedrevisions-param-user": "只列出此用户做出的修订。",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+alldeletedrevisions-param-namespace": "只列出此名字空间的页面。",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>注意:</strong>由于[[mw:Manual:$wgMiserMode|miser模式]],同时使用<var>$1user</var>和<var>$1namespace</var>将导致继续前返回少于<var>$1limit</var>个结果,在极端条件下可能不返回任何结果。",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>注意:</strong>由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]],同时使用<var>$1user</var>和<var>$1namespace</var>将导致继续前返回少于<var>$1limit</var>个结果,在极端条件下可能不返回任何结果。",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。",
        "apihelp-query+alldeletedrevisions-example-user": "列出由<kbd>Example</kbd>作出的最近50次已删除贡献。",
        "apihelp-query+alldeletedrevisions-example-ns-main": "列出前50次已删除的主名字空间修订。",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "添加用于非最新版本的存档版本的文件名。",
        "apihelp-query+filearchive-example-simple": "显示已删除文件列表。",
        "apihelp-query+filerepoinfo-description": "返回有关wiki配置的图片存储库的元信息。",
-       "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(这在一些wiki上可能有更多可用选项):\n;apiurl:链接至API的URL - 对从主机获取图片信息有用。\n;name:存储库关键词 - 用于例如<var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var>,并且[[Special:ApiHelp/query+imageinfo|imageinfo]]会返回值。\n;displayname:人类可读的存储库wiki名称。\n;rooturl:图片路径的根URL。\n;local:存储库是否在本地。",
+       "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(这在一些wiki上可能有更多可用选项):\n;apiurl:链接至API的URL - 对从主机获取图片信息有用。\n;name:存储库关键词 - 用于例如<var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var>,并且[[Special:ApiHelp/query+imageinfo|imageinfo]]会返回值。\n;displayname:人类可读的存储库wiki名称。\n;rooturl:图片路径的根URL。\n;local:存储库是否在本地。",
        "apihelp-query+filerepoinfo-example-simple": "获得有关文件存储库的信息。",
        "apihelp-query+fileusage-description": "查找所有使用指定文件的页面。",
        "apihelp-query+fileusage-param-prop": "要获取的属性:",
        "apihelp-query+redirects-example-generator": "获取所有重定向至[[Main Page]]的信息。",
        "apihelp-query+revisions-description": "获取修订版本信息。\n\n可用于以下几个方面:\n# 通过设置标题或页面ID获取一批页面(最新修订)的数据。\n# 通过使用带start、end或limit的标题或页面ID获取给定页面的多个修订。\n# 通过revid设置一批修订的ID获取它们的数据。",
        "apihelp-query+revisions-paraminfo-singlepageonly": "可能只能与单一页面使用(模式#2)。",
-       "apihelp-query+revisions-param-startid": "从哪个修订版本ID开始列举。",
-       "apihelp-query+revisions-param-endid": "在此修订版本ID停止修订列举。",
+       "apihelp-query+revisions-param-startid": "从这个修订版本时间戳开始列举。修订版本必须存在,但未必与该页面相关。",
+       "apihelp-query+revisions-param-endid": "在这个修订版本时间戳停止列举。修订版本必须存在,但未必与该页面相关。",
        "apihelp-query+revisions-param-start": "从哪个修订版本时间戳开始列举。",
        "apihelp-query+revisions-param-end": "列举直至此时间戳。",
        "apihelp-query+revisions-param-user": "只包含由用户做出的修订。",
        "apihelp-query+search-param-limit": "返回的总计页面数。",
        "apihelp-query+search-param-interwiki": "搜索结果中包含跨wiki结果,如果可用。",
        "apihelp-query+search-param-backend": "要使用的搜索后端,如果没有则为默认。",
-       "apihelp-query+search-param-enablerewrites": "å\90¯ç\94¨å\86\85é\83¨æ\9f¥è¯¢é\87\8då\86\99ã\80\82ä¸\80äº\9bæ\90\9cç´¢å\90\8e端å\8f¯ä»¥é\87\8då\86\99æ\9f¥è¯¢å\88°å®\83认为ä¼\9aç»\99å\87ºæ\9b´å¥½ç»\93æ\9e\9cç\9a\84å\9c°æ\96¹,例如纠正拼写错误。",
+       "apihelp-query+search-param-enablerewrites": "å\90¯ç\94¨å\86\85é\83¨æ\9f¥è¯¢é\87\8då\86\99ã\80\82ä¸\80äº\9bæ\90\9cç´¢å\90\8e端å\8f¯ä»¥é\87\8då\86\99æ\9f¥è¯¢å\88°å\8f¦ä¸\80个被认为è\83½æ\8f\90ä¾\9bæ\9b´å¥½ç»\93æ\9e\9cç\9a\84ä½\8dç½®,例如纠正拼写错误。",
        "apihelp-query+search-example-simple": "搜索<kbd>meaning</kbd>。",
        "apihelp-query+search-example-text": "搜索文本<kbd>meaning</kbd>。",
        "apihelp-query+search-example-generator": "获取有关搜索<kbd>meaning</kbd>返回页面的页面信息。",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "当可用时返回wiki的版权(许可协议)信息。",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "返回可用的编辑限制(保护)类型信息。",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "返回MediaWiki支持的语言列表(可选择使用<var>$1inlanguagecode</var>本地化)。",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "当启用了[[mw:Special:MyLanguage/LanguageConverter|语言转换器]],并且每个语言变体都受支持时,返回语言代码列表。",
        "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-showhooks": "返回所有订阅的钩列表(<var>[[mw:Special:MyLanguage/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+usercontribs-paramvalue-prop-flags": "添加编辑标记。",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "标记已巡查编辑。",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "列举用于编辑的标签。",
-       "apihelp-query+usercontribs-param-show": "只显示符合这些标准的项目,例如只显示不是小编辑的编辑:<kbd>$2show=!minor</kbd>。\n\n如果<kbd>$2show=patrolled</kbd>或<kbd>$2show=!patrolled</kbd>被设定,早于<var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>($1秒)的修订不会被显示。",
+       "apihelp-query+usercontribs-param-show": "只显示符合这些标准的项目,例如只显示不是小编辑的编辑:<kbd>$2show=!minor</kbd>。\n\n如果<kbd>$2show=patrolled</kbd>或<kbd>$2show=!patrolled</kbd>被设定,早于<var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>($1秒)的修订不会被显示。",
        "apihelp-query+usercontribs-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+usercontribs-param-toponly": "只列举作为最新修订的更改。",
        "apihelp-query+usercontribs-example-user": "显示用户<kbd>Example</kbd>的贡献。",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "如果当前用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "如果当前用户有等待中的消息的话,添加标签<samp>messages</samp>。",
        "apihelp-query+userinfo-paramvalue-prop-groups": "列举当前用户隶属的所有群组。",
+       "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "列举明确分配给当前用户的用户组,包括每个用户组成员的过期时间。",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "列举当前用户的所有自动成为成员的用户组。",
        "apihelp-query+userinfo-paramvalue-prop-rights": "列举当前用户拥有的所有权限。",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "列举当前用户可以添加并移除的用户组。",
        "apihelp-query+users-param-prop": "要包含的信息束:",
        "apihelp-query+users-paramvalue-prop-blockinfo": "如果用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。",
        "apihelp-query+users-paramvalue-prop-groups": "列举每位用户属于的所有组。",
+       "apihelp-query+users-paramvalue-prop-groupmemberships": "列举明确分配给每位用户的用户组,包括每个用户组成员的过期时间。",
        "apihelp-query+users-paramvalue-prop-implicitgroups": "列举用户自动作为成员之一的所有组。",
        "apihelp-query+users-paramvalue-prop-rights": "列举每位用户拥有的所有权限。",
        "apihelp-query+users-paramvalue-prop-editcount": "添加用户的编辑计数。",
        "apihelp-removeauthenticationdata-description": "从当前用户移除身份验证数据。",
        "apihelp-removeauthenticationdata-example-simple": "尝试移除当前用户的<kbd>FooAuthenticationRequest</kbd>数据。",
        "apihelp-resetpassword-description": "向用户发送密码重置邮件。",
-       "apihelp-resetpassword-description-noroutes": "没有密码重置路由可用。\n\n在<var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>中启用路由以使用此模块。",
+       "apihelp-resetpassword-description-noroutes": "没有密码重置路由可用。\n\n在<var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>中启用路由以使用此模块。",
        "apihelp-resetpassword-param-user": "正在重置的用户。",
        "apihelp-resetpassword-param-email": "正在重置用户的电子邮件地址。",
        "apihelp-resetpassword-example-user": "向用户<kbd>Example</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-description-disabled": "此wiki不允许更改页面的语言。\n\n启用<var>[[mw:Special:MyLanguage/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-xml-param-includexmlnamespace": "如果指定,添加一个XML名字空间。",
        "apihelp-xmlfm-description": "输出数据为XML格式(HTML优质打印效果)。",
        "api-format-title": "MediaWiki API 结果",
-       "api-format-prettyprint-header": "这是$1格式的HTML表示。HTML对调试很有用,但不适合应用程序使用。\n\n指定<var>format</var>参数以更改输出格式。要查看$1格式的非HTML表示,设置<kbd>format=$2</kbd>。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API 帮助]]以获取更多信息。",
-       "api-format-prettyprint-header-only-html": "这是用来调试的HTML表现,不适合实际使用。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
+       "api-format-prettyprint-header": "这是$1格式的HTML实现。HTML对调试很有用,但不适合应用程序使用。\n\n指定<var>format</var>参数以更改输出格式。要查看$1格式的非HTML实现,设置<kbd>format=$2</kbd>。\n\n参见[[mw:Special:MyLanguage/API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
+       "api-format-prettyprint-header-only-html": "这是用来调试的HTML实现,不适合实际使用。\n\n参见[[mw:Special:MyLanguage/API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
        "api-format-prettyprint-status": "此响应将会返回HTTP状态$1 $2。",
+       "api-login-fail-aborted": "身份验证需要用户交互,而其不被<kbd>action=login</kbd>支持。要通过<kbd>action=login</kbd>登录,请参见[[Special:BotPasswords]]。要继续使用主账户登录,请参见<kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>。",
+       "api-login-fail-aborted-nobotpw": "身份验证需要用户交互,而其不被<kbd>action=login</kbd>支持。要登录,请参见<kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>。",
+       "api-login-fail-badsessionprovider": "当使用$1时不能登录。",
+       "api-login-fail-sameorigin": "当同源协议未应用时不能登录。",
        "api-pageset-param-titles": "要工作的标题列表。",
        "api-pageset-param-pageids": "要工作的页面ID列表。",
        "api-pageset-param-revids": "要工作的修订ID列表。",
        "api-help-param-default-empty": "默认:<span class=\"apihelp-empty\">(空)</span>",
        "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
        "api-help-param-token-webui": "出于兼容性考虑,web UI中使用的令牌也被接受。",
-       "api-help-param-disabled-in-miser-mode": "由于[[mw:Manual:$wgMiserMode|miser模式]]而禁用。",
-       "api-help-param-limited-in-miser-mode": "<strong>注意:</strong>由于[[mw:Manual:$wgMiserMode|miser模式]],使用这个可能导致继续前返回少于<var>$1limit</var>个结果;极端情况下可能不会返回任何结果。",
+       "api-help-param-disabled-in-miser-mode": "由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]]而禁用。",
+       "api-help-param-limited-in-miser-mode": "<strong>注意:</strong>由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]],使用这个可能导致继续前返回少于<var>$1limit</var>个结果;极端情况下可能不会返回任何结果。",
        "api-help-param-direction": "列举的方向:\n;newer:最早的优先。注意:$1start应早于$1end。\n;older:最新的优先(默认)。注意:$1start应晚于$1end。",
        "api-help-param-continue": "当更多结果可用时,使用这个继续。",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(没有说明)</span>",
        "api-help-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>,这意味着身份验证可以工作,但我们没有链接的用户账户。您可以将此看做<samp>UI</samp>或<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# 发送(POST)至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>(成功)或<samp>FAIL</samp>(失败),则认为操作结束。成功与否如上句所示。\n#* 如果您收到了<samp>UI</samp>,向用户显示新字段,并再次获取其提交的内容。然后再次使用<var>$1continue</var>,向本模块提交相关字段,并重复第四步。\n#* 如果您收到了<samp>REDIRECT</samp>,将用户指向<samp>redirecttarget</samp>中的目标,等待其返回<var>$1returnurl</var>。然后再次使用<var>$1continue</var>,向本模块提交返回URL中提供的一切字段,并重复第四步。\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": "返回消息使用的格式。",
        "apierror-invalidexpiry": "无效的过期时间“$1”。",
        "apierror-invalid-file-key": "不是有效的文件关键词。",
        "apierror-invalidlang": "用于参数<var>$1</var>的语言值无效。",
-       "apierror-invalidoldimage": "旧图片参数有无效格式。",
+       "apierror-invalidoldimage": "<var>oldimage</var>参数有无效格式。",
        "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-invalidsection": "<var>section</var>参数必须为有效的章节ID或<kbd>new</kbd>。",
        "apierror-invalidsha1base36hash": "提供的SHA1Base36哈希无效。",
        "apierror-invalidsha1hash": "提供的SHA1哈希无效。",
        "apierror-invalidtitle": "错误标题“$1”。",
        "apierror-revdel-mutuallyexclusive": "同一字段不能同时用于<var>hide</var>和<var>show</var>。",
        "apierror-revdel-needtarget": "此修订版本删除类型需要目标标题。",
        "apierror-revdel-paramneeded": "需要<var>hide</var>和/或<var>show</var>的至少一个值。",
+       "apierror-revisions-badid": "未找到参数<var>$1</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-stashzerolength": "文件长度为0,并且不能在暂存库中储存:$1。",
        "apierror-systemblocked": "您已被MediaWiki自动封禁。",
        "apierror-templateexpansion-notwikitext": "模板展开只支持wiki文本内容。$1使用内容模型$2。",
+       "apierror-toofewexpiries": "提供了$1个逾期{{PLURAL:$1|时间戳}},实际则需要$2个。",
        "apierror-unknownaction": "指定的操作<kbd>$1</kbd>不被承认。",
        "apierror-unknownerror-editpage": "未知的编辑页面错误:$1。",
        "apierror-unknownerror-nocode": "未知错误。",
        "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-redirectsandrevids": "重定向解决方案不能与<var>revids</var>参数一起使用。任何<var>revids</var>所指向的重定向都未被解决。",
        "apiwarn-tokennotallowed": "操作“$1”不允许当前用户使用。",
-       "apiwarn-toomanyvalues": "参数<var>$1</var>指定了太多的值上限为$2。",
+       "apiwarn-toomanyvalues": "参数<var>$1</var>指定了太多的值上限为$2。",
        "apiwarn-truncatedresult": "此结果被缩短,否则其将大于$1字节的限制。",
        "apiwarn-unclearnowtimestamp": "为时间戳参数<var>$1</var>传递“$2”已被弃用。如因某些原因您需要明确指定当前时间而不计算客户端,请使用<kbd>now</kbd>。",
        "apiwarn-unrecognizedvalues": "参数<var>$1</var>有无法识别的{{PLURAL:$3|值}}:$2。",
        "apiwarn-unsupportedarray": "参数<var>$1</var>使用未受支持的PHP数组语法。",
+       "apiwarn-urlparamwidth": "为了获得衍生自<var>$1urlwidth</var>/<var>$1urlheight</var>的宽度值($3),正在忽略<var>$1urlparam</var>的宽度值集($2)。",
        "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": "不能通过此模块设置。",
index 86ddc4c..6f2bcd6 100644 (file)
@@ -8,7 +8,9 @@
                        "Zhxy 519",
                        "Macofe",
                        "Jasonzhuocn",
-                       "Winstonyin"
+                       "Winstonyin",
+                       "Arthur2e5",
+                       "烈羽"
                ]
        },
        "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-expandtemplates-param-text": "要轉換的 Wikitext。",
        "apihelp-feedcontributions-description": "回傳使用者貢獻 Feed。",
        "apihelp-feedcontributions-param-feedformat": "Feed 的格式。",
+       "apihelp-feedcontributions-param-hideminor": "隱藏小修改。",
        "apihelp-feedcontributions-param-showsizediff": "顯示修訂版本之間的差異大小。",
        "apihelp-feedcontributions-example-simple": "返回使用者<kbd>Example</kbd>的貢獻。",
        "apihelp-feedrecentchanges-description": "返回最近變更摘要。",
        "api-help-examples": "{{PLURAL:$1|範例}}:",
        "api-help-permissions": "{{PLURAL:$1|權限}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|已授權給}}: $2",
+       "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# 提交(POST)至此模組,提供<var>$1returnurl</var>及任何相關欄位。\n# 在回应中檢查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>(成功)或<samp>FAIL</samp>(失敗),則認為操作結束。成功與否如上句所示。\n#* 如果您收到了<samp>UI</samp>,向用戶顯示新欄位,並再次獲取其提交的內容。然後再次使用<var>$1continue</var>,向本模組提交相關欄位,並重復第四步。\n#* 如果您收到了<samp>REDIRECT</samp>,將使用者指向<samp>redirecttarget</samp>中的目標,等待其返回<var>$1returnurl</var>。然後再次使用<var>$1continue</var>,向本模組提交返回URL中提供的一切欄位,並重復第四步。\n#* 如果您收到了<samp>RESTART</samp>,這意味著身份驗證正常運作,但我們沒有連結的使用者賬戶。您可以將此看做<samp>UI</samp>或<samp>FAIL</samp>。",
        "api-credits-header": "製作群",
        "api-credits": "API 開發人員:\n* Roan Kattouw (首席開發者 Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (創立者,首席開發者 Sep 2006–Sep 2007)\n* Brad Jorsch (首席開發者 2013–present)\n\n請傳送您的評論、建議以及問題至 mediawiki-api@lists.wikimedia.org\n或者回報問題至 https://phabricator.wikimedia.org/。"
 }
index e9a6edc..c3f798f 100644 (file)
@@ -1660,7 +1660,7 @@ class AuthManager implements LoggerAwareInterface {
                        }
                }
 
-               $backoffKey = wfMemcKey( 'AuthManager', 'autocreate-failed', md5( $username ) );
+               $backoffKey = $cache->makeKey( 'AuthManager', 'autocreate-failed', md5( $username ) );
                if ( $cache->get( $backoffKey ) ) {
                        $this->logger->debug( __METHOD__ . ': {username} denied by prior creation attempt failures', [
                                'username' => $username,
index 6d3b2f4..3125bd3 100644 (file)
@@ -127,10 +127,10 @@ class Throttler implements LoggerAwareInterface {
                                continue;
                        }
 
-                       $throttleKey = wfGlobalCacheKey( 'throttler', $this->type, $index, $ipKey, $userKey );
+                       $throttleKey = $this->cache->makeGlobalKey( 'throttler', $this->type, $index, $ipKey, $userKey );
                        $throttleCount = $this->cache->get( $throttleKey );
 
-                       if ( !$throttleCount ) {  // counter not started yet
+                       if ( !$throttleCount ) { // counter not started yet
                                $this->cache->add( $throttleKey, 1, $expiry );
                        } elseif ( $throttleCount < $count ) { // throttle limited not yet reached
                                $this->cache->incr( $throttleKey );
@@ -170,7 +170,7 @@ class Throttler implements LoggerAwareInterface {
                $userKey = $username ? md5( $username ) : null;
                foreach ( $this->conditions as $index => $specificThrottle ) {
                        $ipKey = isset( $specificThrottle['allIPs'] ) ? null : $ip;
-                       $throttleKey = wfGlobalCacheKey( 'throttler', $this->type, $index, $ipKey, $userKey );
+                       $throttleKey = $this->cache->makeGlobalKey( 'throttler', $this->type, $index, $ipKey, $userKey );
                        $this->cache->delete( $throttleKey );
                }
        }
index 9e6cf1e..3ee6330 100644 (file)
  * @copyright © 2011, Antoine Musso
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Class for fetching backlink lists, approximate backlink counts and
  * partitions. This is a shared cache.
@@ -139,7 +143,7 @@ class BacklinkCache {
        /**
         * Get the replica DB connection to the database
         * When non existing, will initialize the connection.
-        * @return Database
+        * @return IDatabase
         */
        protected function getDB() {
                if ( !isset( $this->db ) ) {
@@ -335,7 +339,11 @@ class BacklinkCache {
                        return min( $max, $this->fullResultCache[$table]->numRows() );
                }
 
-               $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table );
+               $memcKey = $cache->makeKey(
+                       'numbacklinks',
+                       md5( $this->title->getPrefixedDBkey() ),
+                       $table
+               );
 
                // 3) ... fallback to memcached ...
                $count = $cache->get( $memcKey );
@@ -389,7 +397,7 @@ class BacklinkCache {
                        return $cacheEntry['batches'];
                }
 
-               $memcKey = wfMemcKey(
+               $memcKey = $cache->makeKey(
                        'backlinks',
                        md5( $this->title->getPrefixedDBkey() ),
                        $table,
@@ -407,7 +415,7 @@ class BacklinkCache {
 
                // 4) ... finally fetch from the slow database :(
                $cacheEntry = [ 'numRows' => 0, 'batches' => [] ]; // final result
-               // Do the selects in batches to avoid client-side OOMs (bug 43452).
+               // Do the selects in batches to avoid client-side OOMs (T45452).
                // Use a LIMIT that plays well with $batchSize to keep equal sized partitions.
                $selectSize = max( $batchSize, 200000 - ( 200000 % $batchSize ) );
                $start = false;
@@ -432,7 +440,11 @@ class BacklinkCache {
                $cache->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
 
                // Save backlink count to memcached
-               $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table );
+               $memcKey = $cache->makeKey(
+                       'numbacklinks',
+                       md5( $this->title->getPrefixedDBkey() ),
+                       $table
+               );
                $cache->set( $memcKey, $cacheEntry['numRows'], self::CACHE_EXPIRY );
 
                wfDebug( __METHOD__ . ": got from database\n" );
index 6d5f8c3..f2da08a 100644 (file)
@@ -242,14 +242,14 @@ abstract class FileCacheBase {
                                : IP::sanitizeRange( "$ip/16" );
 
                        # Bail out if a request already came from this range...
-                       $key = wfMemcKey( get_class( $this ), 'attempt', $this->mType, $this->mKey, $ip );
+                       $key = $cache->makeKey( static::class, 'attempt', $this->mType, $this->mKey, $ip );
                        if ( $cache->get( $key ) ) {
                                return; // possibly the same user
                        }
                        $cache->set( $key, 1, self::MISS_TTL_SEC );
 
                        # Increment the number of cache misses...
-                       $key = $this->cacheMissKey();
+                       $key = $this->cacheMissKey( $cache );
                        if ( $cache->get( $key ) === false ) {
                                $cache->set( $key, 1, self::MISS_TTL_SEC );
                        } else {
@@ -265,13 +265,14 @@ abstract class FileCacheBase {
        public function getMissesRecent() {
                $cache = ObjectCache::getLocalClusterInstance();
 
-               return self::MISS_FACTOR * $cache->get( $this->cacheMissKey() );
+               return self::MISS_FACTOR * $cache->get( $this->cacheMissKey( $cache ) );
        }
 
        /**
+        * @param BagOStuff $cache Instance that the key will be used with
         * @return string
         */
-       protected function cacheMissKey() {
-               return wfMemcKey( get_class( $this ), 'misses', $this->mType, $this->mKey );
+       protected function cacheMissKey( BagOStuff $cache ) {
+               return $cache->makeKey( static::class, 'misses', $this->mType, $this->mKey );
        }
 }
index d773fff..57d4581 100644 (file)
@@ -22,6 +22,8 @@
  */
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class representing a list of titles
index b720dec..2d08895 100644 (file)
@@ -20,6 +20,9 @@
  * @file
  * @ingroup Cache
  */
+
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
 
index 90ad241..b076a08 100644 (file)
@@ -26,6 +26,7 @@
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
+use Wikimedia\Rdbms\Database;
 
 /**
  * This class generates message blobs for use by ResourceLoader modules.
@@ -110,9 +111,6 @@ class MessageBlobStore implements LoggerAwareInterface {
                foreach ( $modules as $name => $module ) {
                        $key = $cacheKeys[$name];
                        if ( !isset( $result[$key] ) || $curTTLs[$key] === null || $curTTLs[$key] < 0 ) {
-                               $this->logger->info( 'Message blob cache-miss for {module}',
-                                       [ 'module' => $name, 'cacheKey' => $key ]
-                               );
                                $blobs[$name] = $this->recacheMessageBlob( $key, $module, $lang );
                        } else {
                                // Use unexpired cache
@@ -241,6 +239,7 @@ class MessageBlobStore implements LoggerAwareInterface {
                }
 
                $json = FormatJson::encode( (object)$messages );
+               // @codeCoverageIgnoreStart
                if ( $json === false ) {
                        $this->logger->warning( 'Failed to encode message blob for {module} ({lang})', [
                                'module' => $module->getName(),
@@ -248,6 +247,7 @@ class MessageBlobStore implements LoggerAwareInterface {
                        ] );
                        $json = '{}';
                }
+               // codeCoverageIgnoreEnd
                return $json;
        }
 }
index 4facc20..ad1fffb 100644 (file)
@@ -23,6 +23,7 @@
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\Database;
 
 /**
  * MediaWiki message cache structure version.
@@ -191,11 +192,22 @@ class MessageCache {
                                // either.
                                $po = ParserOptions::newFromAnon();
                                $po->setEditSection( false );
+                               $po->setAllowUnsafeRawHtml( false );
+                               $po->setWrapOutputClass( false );
                                return $po;
                        }
 
                        $this->mParserOptions = new ParserOptions;
                        $this->mParserOptions->setEditSection( false );
+                       // Messages may take parameters that could come
+                       // from malicious sources. As a precaution, disable
+                       // the <html> parser tag when parsing messages.
+                       $this->mParserOptions->setAllowUnsafeRawHtml( false );
+                       // Wrapping messages in an extra <div> is probably not expected. If
+                       // they're outside the content area they probably shouldn't be
+                       // targeted by CSS that's targeting the parser output, and if
+                       // they're inside they already are from the outer div.
+                       $this->mParserOptions->setWrapOutputClass( false );
                }
 
                return $this->mParserOptions;
@@ -208,7 +220,7 @@ class MessageCache {
         * @return array|bool The cache array, or false if not in cache.
         */
        protected function getLocalCache( $code ) {
-               $cacheKey = wfMemcKey( __CLASS__, $code );
+               $cacheKey = $this->srvCache->makeKey( __CLASS__, $code );
 
                return $this->srvCache->get( $cacheKey );
        }
@@ -220,7 +232,7 @@ class MessageCache {
         * @param array $cache The cache array
         */
        protected function saveToLocalCache( $code, $cache ) {
-               $cacheKey = wfMemcKey( __CLASS__, $code );
+               $cacheKey = $this->srvCache->makeKey( __CLASS__, $code );
                $this->srvCache->set( $cacheKey, $cache );
        }
 
@@ -296,7 +308,7 @@ class MessageCache {
                }
 
                if ( !$success ) {
-                       $cacheKey = wfMemcKey( 'messages', $code ); # Key in memc for messages
+                       $cacheKey = $this->clusterCache->makeKey( 'messages', $code ); # Key in memc for messages
                        # Try the global cache. If it is empty, try to acquire a lock. If
                        # the lock can't be acquired, wait for the other thread to finish
                        # and then try the global cache a second time.
@@ -390,7 +402,7 @@ class MessageCache {
        protected function loadFromDBWithLock( $code, array &$where, $mode = null ) {
                # If cache updates on all levels fail, give up on message overrides.
                # This is to avoid easy site outages; see $saveSuccess comments below.
-               $statusKey = wfMemcKey( 'messages', $code, 'status' );
+               $statusKey = $this->clusterCache->makeKey( 'messages', $code, 'status' );
                $status = $this->clusterCache->get( $statusKey );
                if ( $status === 'error' ) {
                        $where[] = "could not load; method is still globally disabled";
@@ -404,7 +416,7 @@ class MessageCache {
                # This lock is non-blocking so stale cache can quickly be used.
                # Note that load() will call a blocking getReentrantScopedLock()
                # after this if it really need to wait for any current thread.
-               $cacheKey = wfMemcKey( 'messages', $code );
+               $cacheKey = $this->clusterCache->makeKey( 'messages', $code );
                $scopedLock = $this->getReentrantScopedLock( $cacheKey, 0 );
                if ( !$scopedLock ) {
                        $where[] = 'could not acquire main lock';
@@ -452,7 +464,11 @@ class MessageCache {
        protected function loadFromDB( $code, $mode = null ) {
                global $wgMaxMsgCacheEntrySize, $wgLanguageCode, $wgAdaptiveMessageCache;
 
-               $dbr = wfGetDB( ( $mode == self::FOR_UPDATE ) ? DB_MASTER : DB_REPLICA );
+               // (T164666) The query here performs really poorly on WMF's
+               // contributions replicas. We don't have a way to say "any group except
+               // contributions", so for the moment let's specify 'api'.
+               // @todo: Get rid of this hack.
+               $dbr = wfGetDB( ( $mode == self::FOR_UPDATE ) ? DB_MASTER : DB_REPLICA, 'api' );
 
                $cache = [];
 
@@ -480,7 +496,8 @@ class MessageCache {
                } else {
                        # Effectively disallows use of '/' character in NS_MEDIAWIKI for uses
                        # other than language code.
-                       $conds[] = 'page_title NOT' . $dbr->buildLike( $dbr->anyString(), '/', $dbr->anyString() );
+                       $conds[] = 'page_title NOT' .
+                               $dbr->buildLike( $dbr->anyString(), '/', $dbr->anyString() );
                }
 
                # Conditions to fetch oversized pages to ignore them
@@ -502,15 +519,18 @@ class MessageCache {
 
                # Conditions to load the remaining pages with their contents
                $smallConds = $conds;
-               $smallConds[] = 'page_latest=rev_id';
-               $smallConds[] = 'rev_text_id=old_id';
                $smallConds[] = 'page_len <= ' . intval( $wgMaxMsgCacheEntrySize );
 
                $res = $dbr->select(
                        [ 'page', 'revision', 'text' ],
-                       [ 'page_title', 'old_text', 'old_flags' ],
+                       [ 'page_title', 'old_id', 'old_text', 'old_flags' ],
                        $smallConds,
-                       __METHOD__ . "($code)-small"
+                       __METHOD__ . "($code)-small",
+                       [],
+                       [
+                               'revision' => [ 'JOIN', 'page_latest=rev_id' ],
+                               'text' => [ 'JOIN', 'rev_text_id=old_id' ],
+                       ]
                );
 
                foreach ( $res as $row ) {
@@ -546,7 +566,7 @@ class MessageCache {
        /**
         * Updates cache as necessary when message page is changed
         *
-        * @param string $title Message cache key with initial uppercase letter.
+        * @param string $title Message cache key with initial uppercase letter
         * @param string|bool $text New contents of the page (false if deleted)
         */
        public function replace( $title, $text ) {
@@ -576,7 +596,9 @@ class MessageCache {
                        function () use ( $title, $msg, $code ) {
                                global $wgContLang, $wgMaxMsgCacheEntrySize;
                                // Allow one caller at a time to avoid race conditions
-                               $scopedLock = $this->getReentrantScopedLock( wfMemcKey( 'messages', $code ) );
+                               $scopedLock = $this->getReentrantScopedLock(
+                                       $this->clusterCache->makeKey( 'messages', $code )
+                               );
                                if ( !$scopedLock ) {
                                        LoggerFactory::getInstance( 'MessageCache' )->error(
                                                __METHOD__ . ': could not acquire lock to update {title} ({code})',
@@ -591,9 +613,8 @@ class MessageCache {
                                $page->loadPageData( $page::READ_LATEST );
                                $text = $this->getMessageTextFromContent( $page->getContent() );
                                // Check if an individual cache key should exist and update cache accordingly
-                               $titleKey = $this->wanCache->makeKey(
-                                       'messages-big', $this->mCache[$code]['HASH'], $title );
                                if ( is_string( $text ) && strlen( $text ) > $wgMaxMsgCacheEntrySize ) {
+                                       $titleKey = $this->bigMessageCacheKey( $this->mCache[$code]['HASH'], $title );
                                        $this->wanCache->set( $titleKey, ' ' . $text, $this->mExpiry );
                                }
                                // Mark this cache as definitely being "latest" (non-volatile) so
@@ -609,7 +630,7 @@ class MessageCache {
 
                                // Relay the purge. Touching this check key expires cache contents
                                // and local cache (APC) validation hash across all datacenters.
-                               $this->wanCache->touchCheckKey( wfMemcKey( 'messages', $code ) );
+                               $this->wanCache->touchCheckKey( $this->wanCache->makeKey( 'messages', $code ) );
                                // Also delete cached sidebar... just in case it is affected
                                // @TODO: shouldn't this be $code === $wgLanguageCode?
                                if ( $code === 'en' ) {
@@ -620,7 +641,7 @@ class MessageCache {
                                        $codes = [ $code ];
                                }
                                foreach ( $codes as $code ) {
-                                       $this->wanCache->delete( wfMemcKey( 'sidebar', $code ) );
+                                       $this->wanCache->delete( $this->wanCache->makeKey( 'sidebar', $code ) );
                                }
 
                                // Purge the message in the message blob store
@@ -665,7 +686,7 @@ class MessageCache {
         */
        protected function saveToCaches( array $cache, $dest, $code = false ) {
                if ( $dest === 'all' ) {
-                       $cacheKey = wfMemcKey( 'messages', $code );
+                       $cacheKey = $this->clusterCache->makeKey( 'messages', $code );
                        $success = $this->clusterCache->set( $cacheKey, $cache );
                        $this->setValidationHash( $code, $cache );
                } else {
@@ -688,7 +709,7 @@ class MessageCache {
                $value = $this->wanCache->get(
                        $this->wanCache->makeKey( 'messages', $code, 'hash', 'v1' ),
                        $curTTL,
-                       [ wfMemcKey( 'messages', $code ) ]
+                       [ $this->wanCache->makeKey( 'messages', $code ) ]
                );
 
                if ( $value ) {
@@ -962,8 +983,8 @@ class MessageCache {
         * some callers require this behavior. LanguageConverter::parseCachedTable()
         * and self::get() are some examples in core.
         *
-        * @param string $title Message cache key with initial uppercase letter.
-        * @param string $code Code denoting the language to try.
+        * @param string $title Message cache key with initial uppercase letter
+        * @param string $code Code denoting the language to try
         * @return string|bool The message, or false if it does not exist or on error
         */
        public function getMsgFromNamespace( $title, $code ) {
@@ -990,8 +1011,8 @@ class MessageCache {
                        return false;
                }
 
-               // Try the individual message cache
-               $titleKey = $this->wanCache->makeKey( 'messages-big', $this->mCache[$code]['HASH'], $title );
+               // Individual message cache key
+               $titleKey = $this->bigMessageCacheKey( $this->mCache[$code]['HASH'], $title );
 
                if ( $this->mCacheVolatile[$code] ) {
                        $entry = false;
@@ -1000,6 +1021,7 @@ class MessageCache {
                                __METHOD__ . ': loading volatile key \'{titleKey}\'',
                                [ 'titleKey' => $titleKey, 'code' => $code ] );
                } else {
+                       // Try the individual message cache
                        $entry = $this->wanCache->get( $titleKey );
                }
 
@@ -1052,7 +1074,8 @@ class MessageCache {
                        $message = false; // negative caching
                }
 
-               if ( $message === false ) { // negative caching
+               if ( $message === false ) {
+                       // Negative caching in case a "too big" message is no longer available (deleted)
                        $this->mCache[$code][$title] = '!NONEXISTENT';
                        $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry, $cacheOpts );
                }
@@ -1191,7 +1214,7 @@ class MessageCache {
                $langs = Language::fetchLanguageNames( null, 'mw' );
                foreach ( array_keys( $langs ) as $code ) {
                        # Global and local caches
-                       $this->wanCache->touchCheckKey( wfMemcKey( 'messages', $code ) );
+                       $this->wanCache->touchCheckKey( $this->wanCache->makeKey( 'messages', $code ) );
                }
 
                $this->mLoadedLanguages = [];
@@ -1296,4 +1319,13 @@ class MessageCache {
 
                return $msgText;
        }
+
+       /**
+        * @param string $hash Hash for this version of the entire key/value overrides map
+        * @param string $title Message cache key with initial uppercase letter
+        * @return string
+        */
+       private function bigMessageCacheKey( $hash, $title ) {
+               return $this->wanCache->makeKey( 'messages-big', $hash, $title );
+       }
 }
index e7e2d10..c57145c 100644 (file)
@@ -18,6 +18,9 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBQueryError;
+
 /**
  * LCStore implementation which uses the standard DB functions to store data.
  * This will work on any MediaWiki installation.
index 90b3de1..d499340 100644 (file)
@@ -212,23 +212,21 @@ class LocalisationCache {
                                case 'detect':
                                        if ( !empty( $conf['storeDirectory'] ) ) {
                                                $storeClass = 'LCStoreCDB';
+                                       } elseif ( $wgCacheDirectory ) {
+                                               $storeConf['directory'] = $wgCacheDirectory;
+                                               $storeClass = 'LCStoreCDB';
                                        } else {
-                                               $cacheDir = $wgCacheDirectory ?: wfTempDir();
-                                               if ( $cacheDir ) {
-                                                       $storeConf['directory'] = $cacheDir;
-                                                       $storeClass = 'LCStoreCDB';
-                                               } else {
-                                                       $storeClass = 'LCStoreDB';
-                                               }
+                                               $storeClass = 'LCStoreDB';
                                        }
                                        break;
                                default:
                                        throw new MWException(
-                                               'Please set $wgLocalisationCacheConf[\'store\'] to something sensible.' );
+                                               'Please set $wgLocalisationCacheConf[\'store\'] to something sensible.'
+                                       );
                        }
                }
 
-               wfDebugLog( 'caches', get_class( $this ) . ": using store $storeClass" );
+               wfDebugLog( 'caches', static::class . ": using store $storeClass" );
                if ( !empty( $conf['storeDirectory'] ) ) {
                        $storeConf['directory'] = $conf['storeDirectory'];
                }
index 15a00c7..cffb59a 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Feed to Special:RecentChanges and Special:RecentChangesLiked
  *
@@ -152,7 +154,7 @@ class ChangesFeed {
                        if ( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix ) {
                                wfDebug( "RC: loading feed from cache ($key; $feedLastmod; $lastmod)...\n" );
                                if ( $feedLastmodUnix < $lastmodUnix ) {
-                                       $wgOut->setLastModified( $feedLastmod ); // bug 21916
+                                       $wgOut->setLastModified( $feedLastmod ); // T23916
                                }
                                return $cache->get( $key );
                        } else {
index bc7d721..92a3d3f 100644 (file)
  */
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 class ChangesList extends ContextSource {
+       const CSS_CLASS_PREFIX = 'mw-changeslist-';
+
        /**
         * @var Skin
         */
@@ -46,12 +49,18 @@ class ChangesList extends ContextSource {
         */
        protected $linkRenderer;
 
+       /**
+        * @var array
+        */
+       protected $filterGroups;
+
        /**
         * Changeslist constructor
         *
         * @param Skin|IContextSource $obj
+        * @param array $filterGroups Array of ChangesListFilterGroup objects (currently optional)
         */
-       public function __construct( $obj ) {
+       public function __construct( $obj, array $filterGroups = [] ) {
                if ( $obj instanceof IContextSource ) {
                        $this->setContext( $obj );
                        $this->skin = $obj->getSkin();
@@ -62,6 +71,7 @@ class ChangesList extends ContextSource {
                $this->preCacheMessages();
                $this->watchMsgCache = new HashBagOStuff( [ 'maxKeys' => 50 ] );
                $this->linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+               $this->filterGroups = $filterGroups;
        }
 
        /**
@@ -69,16 +79,19 @@ class ChangesList extends ContextSource {
         * Some users might want to use an enhanced list format, for instance
         *
         * @param IContextSource $context
+        * @param array $groups Array of ChangesListFilterGroup objects (currently optional)
         * @return ChangesList
         */
-       public static function newFromContext( IContextSource $context ) {
+       public static function newFromContext( IContextSource $context, array $groups = [] ) {
                $user = $context->getUser();
                $sk = $context->getSkin();
                $list = null;
                if ( Hooks::run( 'FetchChangesList', [ $user, &$sk, &$list ] ) ) {
                        $new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
 
-                       return $new ? new EnhancedChangesList( $context ) : new OldChangesList( $context );
+                       return $new ?
+                               new EnhancedChangesList( $context, $groups ) :
+                               new OldChangesList( $context, $groups );
                } else {
                        return $list;
                }
@@ -158,42 +171,40 @@ class ChangesList extends ContextSource {
        protected function getHTMLClasses( $rc, $watched ) {
                $classes = [];
                $logType = $rc->mAttribs['rc_log_type'];
-               $prefix = 'mw-changeslist-';
 
                if ( $logType ) {
-                       $classes[] = Sanitizer::escapeClass( $prefix . 'log-' . $logType );
+                       $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'log-' . $logType );
                } else {
-                       $classes[] = Sanitizer::escapeClass( $prefix . 'ns' .
+                       $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'ns' .
                                $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
                }
 
                // Indicate watched status on the line to allow for more
                // comprehensive styling.
                $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched
-                       ? $prefix . 'line-watched'
-                       : $prefix . 'line-not-watched';
+                       ? self::CSS_CLASS_PREFIX . 'line-watched'
+                       : self::CSS_CLASS_PREFIX . 'line-not-watched';
 
                $classes = array_merge( $classes, $this->getHTMLClassesForFilters( $rc ) );
 
                return $classes;
        }
 
+       /**
+        * Get an array of CSS classes attributed to filters for this row
+        *
+        * @param RecentChange $rc
+        * @return array Array of CSS classes
+        */
        protected function getHTMLClassesForFilters( $rc ) {
                $classes = [];
-               $prefix = 'mw-changeslist-';
-
-               $classes[] = $prefix . ( $rc->getAttribute( 'rc_bot' ) ? 'bot' : 'human' );
-               $classes[] = $prefix . ( $rc->getAttribute( 'rc_user' ) ? 'liu' : 'anon' );
-               $classes[] = $prefix . ( $rc->getAttribute( 'rc_minor' ) ? 'minor' : 'major' );
-               $classes[] = $prefix .
-                       ( $rc->getAttribute( 'rc_patrolled' ) ? 'patrolled' : 'unpatrolled' );
-               $classes[] = $prefix .
-                       ( $this->getUser()->equals( $rc->getPerformer() ) ? 'self' : 'others' );
-               $classes[] = $prefix . 'src-' . str_replace( '.', '-', $rc->getAttribute( 'rc_source' ) );
-
-               $performer = $rc->getPerformer();
-               if ( $performer && $performer->isLoggedIn() ) {
-                       $classes[] = $prefix . 'user-' . $performer->getExperienceLevel();
+
+               if ( $this->filterGroups !== null ) {
+                       foreach ( $this->filterGroups as $filterGroup ) {
+                               foreach ( $filterGroup->getFilters() as $filter ) {
+                                       $filter->applyCssClassIfNeeded( $this, $rc, $classes );
+                               }
+                       }
                }
 
                return $classes;
diff --git a/includes/changes/ChangesListBooleanFilter.php b/includes/changes/ChangesListBooleanFilter.php
new file mode 100644 (file)
index 0000000..73c0fb0
--- /dev/null
@@ -0,0 +1,228 @@
+<?php
+/**
+ * Represents a hide-based boolean filter (used on ChangesListSpecialPage and descendants)
+ *
+ * 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
+ * @license GPL 2+
+ * @author Matthew Flaschen
+ */
+
+use Wikimedia\Rdbms\IDatabase;
+
+/**
+ * An individual filter in a boolean group
+ *
+ * @since 1.29
+ */
+class ChangesListBooleanFilter extends ChangesListFilter {
+       // This can sometimes be different on Special:RecentChanges
+       // and Special:Watchlist, due to the double-legacy hooks
+       // (SpecialRecentChangesFilters and SpecialWatchlistFilters)
+
+       // but there will be separate sets of ChangesListFilterGroup and ChangesListFilter instances
+       // for those pages (it should work even if they're both loaded
+       // at once, but that can't happen).
+       /**
+        * Main unstructured UI i18n key
+        *
+        * @var string $showHide
+        */
+       protected $showHide;
+
+       /**
+        * Whether there is a feature designed to replace this filter available on the
+        * structured UI
+        *
+        * @var bool $isReplacedInStructuredUi
+        */
+       protected $isReplacedInStructuredUi;
+
+       /**
+        * Default
+        *
+        * @var bool $defaultValue
+        */
+       protected $defaultValue;
+
+       /**
+        * Callable used to do the actual query modification; see constructor
+        *
+        * @var callable $queryCallable
+        */
+       protected $queryCallable;
+
+       /**
+        * Create a new filter with the specified configuration.
+        *
+        * It infers which UI (it can be either or both) to display the filter on based on
+        * which messages are provided.
+        *
+        * If 'label' is provided, it will be displayed on the structured UI.  If
+        * 'showHide' is provided, it will be displayed on the unstructured UI.  Thus,
+        * 'label', 'description', and 'showHide' are optional depending on which UI
+        * it's for.
+        *
+        * @param array $filterDefinition ChangesListFilter definition
+        * * $filterDefinition['name'] string Name.  Used as URL parameter.
+        * * $filterDefinition['group'] ChangesListFilterGroup Group.  Filter group this
+        *     belongs to.
+        * * $filterDefinition['label'] string i18n key of label for structured UI.
+        * * $filterDefinition['description'] string i18n key of description for structured
+        *     UI.
+        * * $filterDefinition['showHide'] string Main i18n key used for unstructured UI.
+        * * $filterDefinition['isReplacedInStructuredUi'] bool Whether there is an
+        *     equivalent feature available in the structured UI; this is optional, defaulting
+        *     to true.  It does not need to be set if the exact same filter is simply visible
+        *     on both.
+        * * $filterDefinition['default'] bool Default
+        * * $filterDefinition['priority'] int Priority integer.  Higher value means higher
+        *     up in the group's filter list.
+        * * $filterDefinition['queryCallable'] callable Callable accepting parameters, used
+        *     to implement filter's DB query modification.  Required, except for legacy
+        *     filters that still use the query hooks directly.  Callback parameters:
+        *      * string $specialPageClassName Class name of current special page
+        *      * IContextSource $context Context, for e.g. user
+        *      * IDatabase $dbr Database, for addQuotes, makeList, and similar
+        *      * array &$tables Array of tables; see IDatabase::select $table
+        *      * array &$fields Array of fields; see IDatabase::select $vars
+        *      * array &$conds Array of conditions; see IDatabase::select $conds
+        *      * array &$query_options Array of query options; see IDatabase::select $options
+        *      * array &$join_conds Array of join conditions; see IDatabase::select $join_conds
+        */
+       public function __construct( $filterDefinition ) {
+               parent::__construct( $filterDefinition );
+
+               if ( isset( $filterDefinition['showHide'] ) ) {
+                       $this->showHide = $filterDefinition['showHide'];
+               }
+
+               if ( isset( $filterDefinition['isReplacedInStructuredUi'] ) ) {
+                       $this->isReplacedInStructuredUi = $filterDefinition['isReplacedInStructuredUi'];
+               } else {
+                       $this->isReplacedInStructuredUi = false;
+               }
+
+               if ( isset( $filterDefinition['default'] ) ) {
+                       $this->defaultValue = $filterDefinition['default'];
+               } else {
+                       throw new MWException( 'You must set a default' );
+               }
+
+               if ( isset( $filterDefinition['queryCallable'] ) ) {
+                       $this->queryCallable = $filterDefinition['queryCallable'];
+               }
+       }
+
+       /**
+        * Get the default value
+        *
+        * @param bool $structuredUI Are we currently showing the structured UI
+        * @return bool|null Default value
+        */
+       public function getDefault( $structuredUI = false ) {
+               return $this->isReplacedInStructuredUi && $structuredUI ?
+                       false :
+                       $this->defaultValue;
+       }
+
+       /**
+        * Sets default
+        *
+        * @param bool $defaultValue
+        */
+       public function setDefault( $defaultValue ) {
+               $this->defaultValue = $defaultValue;
+       }
+
+       /**
+        * @return string Main i18n key for unstructured UI
+        */
+       public function getShowHide() {
+               return $this->showHide;
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function displaysOnUnstructuredUi() {
+               return !!$this->showHide;
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function isFeatureAvailableOnStructuredUi() {
+               return $this->isReplacedInStructuredUi ||
+                       parent::isFeatureAvailableOnStructuredUi();
+       }
+
+       /**
+        * Modifies the query to include the filter.  This is only called if the filter is
+        * in effect (taking into account the default).
+        *
+        * @param IDatabase $dbr Database, for addQuotes, makeList, and similar
+        * @param ChangesListSpecialPage $specialPage Current special page
+        * @param array &$tables Array of tables; see IDatabase::select $table
+        * @param array &$fields Array of fields; see IDatabase::select $vars
+        * @param array &$conds Array of conditions; see IDatabase::select $conds
+        * @param array &$query_options Array of query options; see IDatabase::select $options
+        * @param array &$join_conds Array of join conditions; see IDatabase::select $join_conds
+        */
+       public function modifyQuery( IDatabase $dbr, ChangesListSpecialPage $specialPage,
+               &$tables, &$fields, &$conds, &$query_options, &$join_conds ) {
+
+               if ( $this->queryCallable === null ) {
+                       return;
+               }
+
+               call_user_func_array(
+                       $this->queryCallable,
+                       [
+                               get_class( $specialPage ),
+                               $specialPage->getContext(),
+                               $dbr,
+                               &$tables,
+                               &$fields,
+                               &$conds,
+                               &$query_options,
+                               &$join_conds
+                       ]
+               );
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function getJsData() {
+               $output = parent::getJsData();
+
+               $output['default'] = $this->defaultValue;
+
+               return $output;
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function isSelected( FormOptions $opts ) {
+               return !$opts[ $this->getName() ] &&
+                       array_filter( $this->getSiblings(), function ( $sibling ) use ( $opts ) {
+                               return $opts[ $sibling->getName() ];
+                       } );
+       }
+}
diff --git a/includes/changes/ChangesListBooleanFilterGroup.php b/includes/changes/ChangesListBooleanFilterGroup.php
new file mode 100644 (file)
index 0000000..951c407
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * If the group is active, any unchecked filters will
+ * translate to hide parameters in the URL.  E.g. if 'Human (not bot)' is checked,
+ * but 'Bot' is unchecked, hidebots=1 will be sent.
+ *
+ * @since 1.29
+ */
+class ChangesListBooleanFilterGroup extends ChangesListFilterGroup {
+       /**
+        * Type marker, used by JavaScript
+        */
+       const TYPE = 'send_unselected_if_any';
+
+       /**
+        * Create a new filter group with the specified configuration
+        *
+        * @param array $groupDefinition Configuration of group
+        * * $groupDefinition['name'] string Group name
+        * * $groupDefinition['title'] string i18n key for title (optional, can be omitted
+        *     only if none of the filters in the group display in the structured UI)
+        * * $groupDefinition['priority'] int Priority integer.  Higher means higher in the
+        *     group list.
+        * * $groupDefinition['filters'] array Numeric array of filter definitions, each of which
+        *     is an associative array to be passed to the filter constructor.  However,
+        *    'priority' is optional for the filters.  Any filter that has priority unset
+        *     will be put to the bottom, in the order given.
+        * * $groupDefinition['whatsThisHeader'] string i18n key for header of "What's
+        *     This" popup (optional).
+        * * $groupDefinition['whatsThisBody'] string i18n key for body of "What's This"
+        *     popup (optional).
+        * * $groupDefinition['whatsThisUrl'] string URL for main link of "What's This"
+        *     popup (optional).
+        * * $groupDefinition['whatsThisLinkText'] string i18n key of text for main link of
+        *     "What's This" popup (optional).
+        */
+       public function __construct( array $groupDefinition ) {
+               $groupDefinition['isFullCoverage'] = true;
+               $groupDefinition['type'] = self::TYPE;
+
+               parent::__construct( $groupDefinition );
+       }
+
+       /**
+        * @inheritdoc
+        */
+       protected function createFilter( array $filterDefinition ) {
+               return new ChangesListBooleanFilter( $filterDefinition );
+       }
+
+       /**
+        * Registers a filter in this group
+        *
+        * @param ChangesListBooleanFilter $filter ChangesListBooleanFilter
+        */
+       public function registerFilter( ChangesListBooleanFilter $filter ) {
+               $this->filters[$filter->getName()] = $filter;
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function isPerGroupRequestParameter() {
+               return false;
+       }
+}
diff --git a/includes/changes/ChangesListFilter.php b/includes/changes/ChangesListFilter.php
new file mode 100644 (file)
index 0000000..bd895bb
--- /dev/null
@@ -0,0 +1,502 @@
+<?php
+/**
+ * Represents a filter (used on ChangesListSpecialPage and descendants)
+ *
+ * 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
+ * @license GPL 2+
+ * @author Matthew Flaschen
+ */
+
+/**
+ * Represents a filter (used on ChangesListSpecialPage and descendants)
+ *
+ * @since 1.29
+ */
+abstract class ChangesListFilter {
+       /**
+        * Filter name
+        *
+        * @var string $name
+        */
+       protected $name;
+
+       /**
+        * CSS class suffix used for attribution, e.g. 'bot'.
+        *
+        * In this example, if bot actions are included in the result set, this CSS class
+        * will then be included in all bot-flagged actions.
+        *
+        * @var string|null $cssClassSuffix
+        */
+       protected $cssClassSuffix;
+
+       /**
+        * Callable that returns true if and only if a row is attributed to this filter
+        *
+        * @var callable $isRowApplicableCallable
+        */
+       protected $isRowApplicableCallable;
+
+       /**
+        * Group.  ChangesListFilterGroup this belongs to
+        *
+        * @var ChangesListFilterGroup $group
+        */
+       protected $group;
+
+       /**
+        * i18n key of label for structured UI
+        *
+        * @var string $label
+        */
+       protected $label;
+
+       /**
+        * i18n key of description for structured UI
+        *
+        * @var string $description
+        */
+       protected $description;
+
+       /**
+        * Array of associative arrays with conflict information.  See
+        * setUnidirectionalConflict
+        *
+        * @var array $conflictingGroups
+        */
+       protected $conflictingGroups = [];
+
+       /**
+        * Array of associative arrays with conflict information.  See
+        * setUnidirectionalConflict
+        *
+        * @var array $conflictingFilters
+        */
+       protected $conflictingFilters = [];
+
+       /**
+        * Array of associative arrays with subset information
+        *
+        * @var array $subsetFilters
+        */
+       protected $subsetFilters = [];
+
+       /**
+        * Priority integer.  Higher value means higher up in the group's filter list.
+        *
+        * @var string $priority
+        */
+       protected $priority;
+
+       const RESERVED_NAME_CHAR = '_';
+
+       /**
+        * Creates a new filter with the specified configuration, and registers it to the
+        * specified group.
+        *
+        * It infers which UI (it can be either or both) to display the filter on based on
+        * which messages are provided.
+        *
+        * If 'label' is provided, it will be displayed on the structured UI.  Thus,
+        * 'label', 'description', and sub-class parameters are optional depending on which
+        * UI it's for.
+        *
+        * @param array $filterDefinition ChangesListFilter definition
+        * * $filterDefinition['name'] string Name of filter; use lowercase with no
+        *     punctuation
+        * * $filterDefinition['cssClassSuffix'] string CSS class suffix, used to mark
+        *     that a particular row belongs to this filter (when a row is included by the
+        *     filter) (optional)
+        * * $filterDefinition['isRowApplicableCallable'] Callable taking two parameters, the
+        *     IContextSource, and the RecentChange object for the row, and returning true if
+        *     the row is attributed to this filter.  The above CSS class will then be
+        *     automatically added (optional, required if cssClassSuffix is used).
+        * * $filterDefinition['group'] ChangesListFilterGroup Group.  Filter group this
+        *     belongs to.
+        * * $filterDefinition['label'] string i18n key of label for structured UI.
+        * * $filterDefinition['description'] string i18n key of description for structured
+        *     UI.
+        * * $filterDefinition['priority'] int Priority integer.  Higher value means higher
+        *     up in the group's filter list.
+        */
+       public function __construct( array $filterDefinition ) {
+               if ( isset( $filterDefinition['group'] ) ) {
+                       $this->group = $filterDefinition['group'];
+               } else {
+                       throw new MWException( 'You must use \'group\' to specify the ' .
+                               'ChangesListFilterGroup this filter belongs to' );
+               }
+
+               if ( strpos( $filterDefinition['name'], self::RESERVED_NAME_CHAR ) !== false ) {
+                       throw new MWException( 'Filter names may not contain \'' .
+                               self::RESERVED_NAME_CHAR .
+                               '\'.  Use the naming convention: \'lowercase\''
+                       );
+               }
+
+               if ( $this->group->getFilter( $filterDefinition['name'] ) ) {
+                       throw new MWException( 'Two filters in a group cannot have the ' .
+                               "same name: '{$filterDefinition['name']}'" );
+               }
+
+               $this->name = $filterDefinition['name'];
+
+               if ( isset( $filterDefinition['cssClassSuffix'] ) ) {
+                       $this->cssClassSuffix = $filterDefinition['cssClassSuffix'];
+                       $this->isRowApplicableCallable = $filterDefinition['isRowApplicableCallable'];
+               }
+
+               if ( isset( $filterDefinition['label'] ) ) {
+                       $this->label = $filterDefinition['label'];
+                       $this->description = $filterDefinition['description'];
+               }
+
+               $this->priority = $filterDefinition['priority'];
+
+               $this->group->registerFilter( $this );
+       }
+
+       /**
+        * Marks that the given ChangesListFilterGroup or ChangesListFilter conflicts with this object.
+        *
+        * WARNING: This means there is a conflict when both things are *shown*
+        * (not filtered out), even for the hide-based filters.  So e.g. conflicting with
+        * 'hideanons' means there is a conflict if only anonymous users are *shown*.
+        *
+        * @param ChangesListFilterGroup|ChangesListFilter $other Other
+        *  ChangesListFilterGroup or ChangesListFilter
+        * @param string $globalKey i18n key for top-level conflict message
+        * @param string $forwardKey i18n key for conflict message in this
+        *  direction (when in UI context of $this object)
+        * @param string $backwardKey i18n key for conflict message in reverse
+        *  direction (when in UI context of $other object)
+        */
+       public function conflictsWith( $other, $globalKey, $forwardKey,
+               $backwardKey ) {
+
+               if ( $globalKey === null || $forwardKey === null ||
+                       $backwardKey === null ) {
+
+                       throw new MWException( 'All messages must be specified' );
+               }
+
+               $this->setUnidirectionalConflict(
+                       $other,
+                       $globalKey,
+                       $forwardKey
+               );
+
+               $other->setUnidirectionalConflict(
+                       $this,
+                       $globalKey,
+                       $backwardKey
+               );
+       }
+
+       /**
+        * Marks that the given ChangesListFilterGroup or ChangesListFilter conflicts with
+        * this object.
+        *
+        * Internal use ONLY.
+        *
+        * @param ChangesListFilterGroup|ChangesListFilter $other Other
+        *  ChangesListFilterGroup or ChangesListFilter
+        * @param string $globalDescription i18n key for top-level conflict message
+        * @param string $contextDescription i18n key for conflict message in this
+        *  direction (when in UI context of $this object)
+        */
+       public function setUnidirectionalConflict( $other, $globalDescription,
+               $contextDescription ) {
+
+               if ( $other instanceof ChangesListFilterGroup ) {
+                       $this->conflictingGroups[] = [
+                               'group' => $other->getName(),
+                               'groupObject' => $other,
+                               'globalDescription' => $globalDescription,
+                               'contextDescription' => $contextDescription,
+                       ];
+               } elseif ( $other instanceof ChangesListFilter ) {
+                       $this->conflictingFilters[] = [
+                               'group' => $other->getGroup()->getName(),
+                               'filter' => $other->getName(),
+                               'filterObject' => $other,
+                               'globalDescription' => $globalDescription,
+                               'contextDescription' => $contextDescription,
+                       ];
+               } else {
+                       throw new MWException( 'You can only pass in a ChangesListFilterGroup or a ChangesListFilter' );
+               }
+       }
+
+       /**
+        * Marks that the current instance is (also) a superset of the filter passed in.
+        * This can be called more than once.
+        *
+        * This means that anything in the results for the other filter is also in the
+        * results for this one.
+        *
+        * @param ChangesListFilter $other The filter the current instance is a superset of
+        */
+       public function setAsSupersetOf( ChangesListFilter $other ) {
+               if ( $other->getGroup() !== $this->getGroup() ) {
+                       throw new MWException( 'Supersets can only be defined for filters in the same group' );
+               }
+
+               $this->subsetFilters[] = [
+                       // It's always the same group, but this makes the representation
+                       // more consistent with conflicts.
+                       'group' => $other->getGroup()->getName(),
+                       'filter' => $other->getName(),
+               ];
+       }
+
+       /**
+        * @return string Name, e.g. hideanons
+        */
+       public function getName() {
+               return $this->name;
+       }
+
+       /**
+        * @return ChangesListFilterGroup Group this belongs to
+        */
+       public function getGroup() {
+               return $this->group;
+       }
+
+       /**
+        * @return string i18n key of label for structured UI
+        */
+       public function getLabel() {
+               return $this->label;
+       }
+
+       /**
+        * @return string i18n key of description for structured UI
+        */
+       public function getDescription() {
+               return $this->description;
+       }
+
+       /**
+        * Checks whether the filter should display on the unstructured UI
+        *
+        * @return bool Whether to display
+        */
+       abstract public function displaysOnUnstructuredUi();
+
+       /**
+        * Checks whether the filter should display on the structured UI
+        * This refers to the exact filter.  See also isFeatureAvailableOnStructuredUi.
+        *
+        * @return bool Whether to display
+        */
+       public function displaysOnStructuredUi() {
+               return $this->label !== null;
+       }
+
+       /**
+        * Checks whether an equivalent feature for this filter is available on the
+        * structured UI.
+        *
+        * This can either be the exact filter, or a new filter that replaces it.
+        */
+       public function isFeatureAvailableOnStructuredUi() {
+               return $this->displaysOnStructuredUi();
+       }
+
+       /**
+        * @return int Priority.  Higher value means higher up in the group list
+        */
+       public function getPriority() {
+               return $this->priority;
+       }
+
+       /**
+        * Gets the CSS class
+        *
+        * @return string|null CSS class, or null if not defined
+        */
+       protected function getCssClass() {
+               if ( $this->cssClassSuffix !== null ) {
+                       return ChangesList::CSS_CLASS_PREFIX . $this->cssClassSuffix;
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Add CSS class if needed
+        *
+        * @param IContextSource $ctx Context source
+        * @param RecentChange $rc Recent changes object
+        * @param array &$classes Non-associative array of CSS class names; appended to if needed
+        */
+       public function applyCssClassIfNeeded( IContextSource $ctx, RecentChange $rc, array &$classes ) {
+               if ( $this->isRowApplicableCallable === null ) {
+                       return;
+               }
+
+               if ( call_user_func( $this->isRowApplicableCallable, $ctx, $rc ) ) {
+                       $classes[] = $this->getCssClass();
+               }
+       }
+
+       /**
+        * Gets the JS data required by the front-end of the structured UI
+        *
+        * @return array Associative array Data required by the front-end.  messageKeys is
+        *  a special top-level value, with the value being an array of the message keys to
+        *  send to the client.
+        */
+       public function getJsData() {
+               $output = [
+                       'name' => $this->getName(),
+                       'label' => $this->getLabel(),
+                       'description' => $this->getDescription(),
+                       'cssClass' => $this->getCssClass(),
+                       'priority' => $this->priority,
+                       'subset' => $this->subsetFilters,
+                       'conflicts' => [],
+               ];
+
+               $output['messageKeys'] = [
+                       $this->getLabel(),
+                       $this->getDescription(),
+               ];
+
+               $conflicts = array_merge(
+                       $this->conflictingGroups,
+                       $this->conflictingFilters
+               );
+
+               foreach ( $conflicts as $conflictInfo ) {
+                       unset( $conflictInfo['filterObject'] );
+                       unset( $conflictInfo['groupObject'] );
+                       $output['conflicts'][] = $conflictInfo;
+                       array_push(
+                               $output['messageKeys'],
+                               $conflictInfo['globalDescription'],
+                               $conflictInfo['contextDescription']
+                       );
+               }
+
+               return $output;
+       }
+
+       /**
+        * Checks whether this filter is selected in the provided options
+        *
+        * @param FormOptions $opts
+        * @return bool
+        */
+       abstract public function isSelected( FormOptions $opts );
+
+       /**
+        * Get groups conflicting with this filter
+        *
+        * @return ChangesListFilterGroup[]
+        */
+       public function getConflictingGroups() {
+               return array_map(
+                       function ( $conflictDesc ) {
+                               return $conflictDesc[ 'groupObject' ];
+                       },
+                       $this->conflictingGroups
+               );
+       }
+
+       /**
+        * Get filters conflicting with this filter
+        *
+        * @return ChangesListFilter[]
+        */
+       public function getConflictingFilters() {
+               return array_map(
+                       function ( $conflictDesc ) {
+                               return $conflictDesc[ 'filterObject' ];
+                       },
+                       $this->conflictingFilters
+               );
+       }
+
+       /**
+        * Check if the conflict with a group is currently "active"
+        *
+        * @param ChangesListFilterGroup $group
+        * @param FormOptions $opts
+        * @return bool
+        */
+       public function activelyInConflictWithGroup( ChangesListFilterGroup $group, FormOptions $opts ) {
+               if ( $group->anySelected( $opts ) && $this->isSelected( $opts ) ) {
+                       /** @var ChangesListFilter $siblingFilter */
+                       foreach ( $this->getSiblings() as $siblingFilter ) {
+                               if ( $siblingFilter->isSelected( $opts ) && !$siblingFilter->hasConflictWithGroup( $group ) ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               }
+               return false;
+       }
+
+       private function hasConflictWithGroup( ChangesListFilterGroup $group ) {
+               return in_array( $group, $this->getConflictingGroups() );
+       }
+
+       /**
+        * Check if the conflict with a filter is currently "active"
+        *
+        * @param ChangesListFilter $filter
+        * @param FormOptions $opts
+        * @return bool
+        */
+       public function activelyInConflictWithFilter( ChangeslistFilter $filter, FormOptions $opts ) {
+               if ( $this->isSelected( $opts ) && $filter->isSelected( $opts ) ) {
+                       /** @var ChangesListFilter $siblingFilter */
+                       foreach ( $this->getSiblings() as $siblingFilter ) {
+                               if (
+                                       $siblingFilter->isSelected( $opts ) &&
+                                       !$siblingFilter->hasConflictWithFilter( $filter )
+                               ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               }
+               return false;
+       }
+
+       private function hasConflictWithFilter( ChangeslistFilter $filter ) {
+               return in_array( $filter, $this->getConflictingFilters() );
+       }
+
+       /**
+        * Get filters in the same group
+        *
+        * @return ChangesListFilter[]
+        */
+       protected function getSiblings() {
+               return array_filter(
+                       $this->getGroup()->getFilters(),
+                       function ( $filter ) {
+                               return $filter !== $this;
+                       }
+               );
+       }
+}
diff --git a/includes/changes/ChangesListFilterGroup.php b/includes/changes/ChangesListFilterGroup.php
new file mode 100644 (file)
index 0000000..3555158
--- /dev/null
@@ -0,0 +1,458 @@
+<?php
+/**
+ * Represents a filter group (used on ChangesListSpecialPage and descendants)
+ *
+ * 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
+ * @license GPL 2+
+ * @author Matthew Flaschen
+ */
+
+// TODO: Might want to make a super-class or trait to share behavior (especially re
+// conflicts) between ChangesListFilter and ChangesListFilterGroup.
+// What to call it.  FilterStructure?  That would also let me make
+// setUnidirectionalConflict protected.
+
+/**
+ * Represents a filter group (used on ChangesListSpecialPage and descendants)
+ *
+ * @since 1.29
+ */
+abstract class ChangesListFilterGroup {
+       /**
+        * Name (internal identifier)
+        *
+        * @var string $name
+        */
+       protected $name;
+
+       /**
+        * i18n key for title
+        *
+        * @var string $title
+        */
+       protected $title;
+
+       /**
+        * i18n key for header of What's This?
+        *
+        * @var string|null $whatsThisHeader
+        */
+       protected $whatsThisHeader;
+
+       /**
+        * i18n key for body of What's This?
+        *
+        * @var string|null $whatsThisBody
+        */
+       protected $whatsThisBody;
+
+       /**
+        * URL of What's This? link
+        *
+        * @var string|null $whatsThisUrl
+        */
+       protected $whatsThisUrl;
+
+       /**
+        * i18n key for What's This? link
+        *
+        * @var string|null $whatsThisLinkText
+        */
+       protected $whatsThisLinkText;
+
+       /**
+        * Type, from a TYPE constant of a subclass
+        *
+        * @var string $type
+        */
+       protected $type;
+
+       /**
+        * Priority integer.  Higher values means higher up in the
+        * group list.
+        *
+        * @var string $priority
+        */
+       protected $priority;
+
+       /**
+        * Associative array of filters, as ChangesListFilter objects, with filter name as key
+        *
+        * @var array $filters
+        */
+       protected $filters;
+
+       /**
+        * Whether this group is full coverage.  This means that checking every item in the
+        * group means no changes list (e.g. RecentChanges) entries are filtered out.
+        *
+        * @var bool $isFullCoverage
+        */
+       protected $isFullCoverage;
+
+       /**
+        * Array of associative arrays with conflict information.  See
+        * setUnidirectionalConflict
+        *
+        * @var array $conflictingGroups
+        */
+       protected $conflictingGroups = [];
+
+       /**
+        * Array of associative arrays with conflict information.  See
+        * setUnidirectionalConflict
+        *
+        * @var array $conflictingFilters
+        */
+       protected $conflictingFilters = [];
+
+       const DEFAULT_PRIORITY = -100;
+
+       const RESERVED_NAME_CHAR = '_';
+
+       /**
+        * Create a new filter group with the specified configuration
+        *
+        * @param array $groupDefinition Configuration of group
+        * * $groupDefinition['name'] string Group name; use camelCase with no punctuation
+        * * $groupDefinition['title'] string i18n key for title (optional, can be omitted
+        *     only if none of the filters in the group display in the structured UI)
+        * * $groupDefinition['type'] string A type constant from a subclass of this one
+        * * $groupDefinition['priority'] int Priority integer.  Higher value means higher
+        *     up in the group list (optional, defaults to -100).
+        * * $groupDefinition['filters'] array Numeric array of filter definitions, each of which
+        *     is an associative array to be passed to the filter constructor.  However,
+        *     'priority' is optional for the filters.  Any filter that has priority unset
+        *     will be put to the bottom, in the order given.
+        * * $groupDefinition['isFullCoverage'] bool Whether the group is full coverage;
+        *     if true, this means that checking every item in the group means no
+        *     changes list entries are filtered out.
+        * * $groupDefinition['whatsThisHeader'] string i18n key for header of "What's
+        *     This" popup (optional).
+        * * $groupDefinition['whatsThisBody'] string i18n key for body of "What's This"
+        *     popup (optional).
+        * * $groupDefinition['whatsThisUrl'] string URL for main link of "What's This"
+        *     popup (optional).
+        * * $groupDefinition['whatsThisLinkText'] string i18n key of text for main link of
+        *     "What's This" popup (optional).
+        */
+       public function __construct( array $groupDefinition ) {
+               if ( strpos( $groupDefinition['name'], self::RESERVED_NAME_CHAR ) !== false ) {
+                       throw new MWException( 'Group names may not contain \'' .
+                               self::RESERVED_NAME_CHAR .
+                               '\'.  Use the naming convention: \'camelCase\''
+                       );
+               }
+
+               $this->name = $groupDefinition['name'];
+
+               if ( isset( $groupDefinition['title'] ) ) {
+                       $this->title = $groupDefinition['title'];
+               }
+
+               if ( isset ( $groupDefinition['whatsThisHeader'] ) ) {
+                       $this->whatsThisHeader = $groupDefinition['whatsThisHeader'];
+                       $this->whatsThisBody = $groupDefinition['whatsThisBody'];
+                       $this->whatsThisUrl = $groupDefinition['whatsThisUrl'];
+                       $this->whatsThisLinkText = $groupDefinition['whatsThisLinkText'];
+               }
+
+               $this->type = $groupDefinition['type'];
+               if ( isset( $groupDefinition['priority'] ) ) {
+                       $this->priority = $groupDefinition['priority'];
+               } else {
+                       $this->priority = self::DEFAULT_PRIORITY;
+               }
+
+               $this->isFullCoverage = $groupDefinition['isFullCoverage'];
+
+               $this->filters = [];
+               $lowestSpecifiedPriority = -1;
+               foreach ( $groupDefinition['filters'] as $filterDefinition ) {
+                       if ( isset( $filterDefinition['priority'] ) ) {
+                               $lowestSpecifiedPriority = min( $lowestSpecifiedPriority, $filterDefinition['priority'] );
+                       }
+               }
+
+               // Convenience feature: If you specify a group (and its filters) all in
+               // one place, you don't have to specify priority.  You can just put them
+               // in order.  However, if you later add one (e.g. an extension adds a filter
+               // to a core-defined group), you need to specify it.
+               $autoFillPriority = $lowestSpecifiedPriority - 1;
+               foreach ( $groupDefinition['filters'] as $filterDefinition ) {
+                       if ( !isset( $filterDefinition['priority'] ) ) {
+                               $filterDefinition['priority'] = $autoFillPriority;
+                               $autoFillPriority--;
+                       }
+                       $filterDefinition['group'] = $this;
+
+                       $filter = $this->createFilter( $filterDefinition );
+                       $this->registerFilter( $filter );
+               }
+       }
+
+       /**
+        * Creates a filter of the appropriate type for this group, from the definition
+        *
+        * @param array $filterDefinition Filter definition
+        * @return ChangesListFilter Filter
+        */
+       abstract protected function createFilter( array $filterDefinition );
+
+       /**
+        * Marks that the given ChangesListFilterGroup or ChangesListFilter conflicts with this object.
+        *
+        * WARNING: This means there is a conflict when both things are *shown*
+        * (not filtered out), even for the hide-based filters.  So e.g. conflicting with
+        * 'hideanons' means there is a conflict if only anonymous users are *shown*.
+        *
+        * @param ChangesListFilterGroup|ChangesListFilter $other Other
+        *  ChangesListFilterGroup or ChangesListFilter
+        * @param string $globalKey i18n key for top-level conflict message
+        * @param string $forwardKey i18n key for conflict message in this
+        *  direction (when in UI context of $this object)
+        * @param string $backwardKey i18n key for conflict message in reverse
+        *  direction (when in UI context of $other object)
+        */
+       public function conflictsWith( $other, $globalKey, $forwardKey,
+               $backwardKey ) {
+
+               if ( $globalKey === null || $forwardKey === null ||
+                       $backwardKey === null ) {
+
+                       throw new MWException( 'All messages must be specified' );
+               }
+
+               $this->setUnidirectionalConflict(
+                       $other,
+                       $globalKey,
+                       $forwardKey
+               );
+
+               $other->setUnidirectionalConflict(
+                       $this,
+                       $globalKey,
+                       $backwardKey
+               );
+       }
+
+       /**
+        * Marks that the given ChangesListFilterGroup or ChangesListFilter conflicts with
+        * this object.
+        *
+        * Internal use ONLY.
+        *
+        * @param ChangesListFilterGroup|ChangesListFilter $other Other
+        *  ChangesListFilterGroup or ChangesListFilter
+        * @param string $globalDescription i18n key for top-level conflict message
+        * @param string $contextDescription i18n key for conflict message in this
+        *  direction (when in UI context of $this object)
+        */
+       public function setUnidirectionalConflict( $other, $globalDescription,
+               $contextDescription ) {
+
+               if ( $other instanceof ChangesListFilterGroup ) {
+                       $this->conflictingGroups[] = [
+                               'group' => $other->getName(),
+                               'groupObject' => $other,
+                               'globalDescription' => $globalDescription,
+                               'contextDescription' => $contextDescription,
+                       ];
+               } elseif ( $other instanceof ChangesListFilter ) {
+                       $this->conflictingFilters[] = [
+                               'group' => $other->getGroup()->getName(),
+                               'filter' => $other->getName(),
+                               'filterObject' => $other,
+                               'globalDescription' => $globalDescription,
+                               'contextDescription' => $contextDescription,
+                       ];
+               } else {
+                       throw new MWException( 'You can only pass in a ChangesListFilterGroup or a ChangesListFilter' );
+               }
+       }
+
+       /**
+        * @return string Internal name
+        */
+       public function getName() {
+               return $this->name;
+       }
+
+       /**
+        * @return string i18n key for title
+        */
+       public function getTitle() {
+               return $this->title;
+       }
+
+       /**
+        * @return string Type (TYPE constant from a subclass)
+        */
+       public function getType() {
+               return $this->type;
+       }
+
+       /**
+        * @return int Priority.  Higher means higher in the group list
+        */
+       public function getPriority() {
+               return $this->priority;
+       }
+
+       /**
+        * @return ChangesListFilter[] Associative array of ChangesListFilter objects, with
+        *   filter name as key
+        */
+       public function getFilters() {
+               return $this->filters;
+       }
+
+       /**
+        * Get filter by name
+        *
+        * @param string $name Filter name
+        * @return ChangesListFilter|null Specified filter, or null if it is not registered
+        */
+       public function getFilter( $name ) {
+               return isset( $this->filters[$name] ) ? $this->filters[$name] : null;
+       }
+
+       /**
+        * Check whether the URL parameter is for the group, or for individual filters.
+        * Defaults can also be defined on the group if and only if this is true.
+        *
+        * @return bool True if and only if the URL parameter is per-group
+        */
+       abstract public function isPerGroupRequestParameter();
+
+       /**
+        * Gets the JS data in the format required by the front-end of the structured UI
+        *
+        * @return array|null Associative array, or null if there are no filters that
+        *  display in the structured UI.  messageKeys is a special top-level value, with
+        *  the value being an array of the message keys to send to the client.
+        */
+       public function getJsData() {
+               $output = [
+                       'name' => $this->name,
+                       'type' => $this->type,
+                       'fullCoverage' => $this->isFullCoverage,
+                       'filters' => [],
+                       'priority' => $this->priority,
+                       'conflicts' => [],
+                       'messageKeys' => [ $this->title ]
+               ];
+
+               if ( isset ( $this->whatsThisHeader ) ) {
+                       $output['whatsThisHeader'] = $this->whatsThisHeader;
+                       $output['whatsThisBody'] = $this->whatsThisBody;
+                       $output['whatsThisUrl'] = $this->whatsThisUrl;
+                       $output['whatsThisLinkText'] = $this->whatsThisLinkText;
+
+                       array_push(
+                               $output['messageKeys'],
+                               $output['whatsThisHeader'],
+                               $output['whatsThisBody'],
+                               $output['whatsThisLinkText']
+                       );
+               }
+
+               usort( $this->filters, function ( $a, $b ) {
+                       return $b->getPriority() - $a->getPriority();
+               } );
+
+               foreach ( $this->filters as $filterName => $filter ) {
+                       if ( $filter->displaysOnStructuredUi() ) {
+                               $filterData = $filter->getJsData();
+                               $output['messageKeys'] = array_merge(
+                                       $output['messageKeys'],
+                                       $filterData['messageKeys']
+                               );
+                               unset( $filterData['messageKeys'] );
+                               $output['filters'][] = $filterData;
+                       }
+               }
+
+               if ( count( $output['filters'] ) === 0 ) {
+                       return null;
+               }
+
+               $output['title'] = $this->title;
+
+               $conflicts = array_merge(
+                       $this->conflictingGroups,
+                       $this->conflictingFilters
+               );
+
+               foreach ( $conflicts as $conflictInfo ) {
+                       $output['conflicts'][] = $conflictInfo;
+                       unset( $conflictInfo['filterObject'] );
+                       unset( $conflictInfo['groupObject'] );
+                       array_push(
+                               $output['messageKeys'],
+                               $conflictInfo['globalDescription'],
+                               $conflictInfo['contextDescription']
+                       );
+               }
+
+               return $output;
+       }
+
+       /**
+        * Get groups conflicting with this filter group
+        *
+        * @return ChangesListFilterGroup[]
+        */
+       public function getConflictingGroups() {
+               return array_map(
+                       function ( $conflictDesc ) {
+                               return $conflictDesc[ 'groupObject' ];
+                       },
+                       $this->conflictingGroups
+               );
+       }
+
+       /**
+        * Get filters conflicting with this filter group
+        *
+        * @return ChangesListFilter[]
+        */
+       public function getConflictingFilters() {
+               return array_map(
+                       function ( $conflictDesc ) {
+                               return $conflictDesc[ 'filterObject' ];
+                       },
+                       $this->conflictingFilters
+               );
+       }
+
+       /**
+        * Check if any filter in this group is selected
+        *
+        * @param FormOptions $opts
+        * @return bool
+        */
+       public function anySelected( FormOptions $opts ) {
+               return !!count( array_filter(
+                       $this->getFilters(),
+                       function ( ChangesListFilter $filter ) use ( $opts ) {
+                               return $filter->isSelected( $opts );
+                       }
+               ) );
+       }
+}
diff --git a/includes/changes/ChangesListStringOptionsFilter.php b/includes/changes/ChangesListStringOptionsFilter.php
new file mode 100644 (file)
index 0000000..6754d67
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * An individual filter in a ChangesListStringOptionsFilterGroup.
+ *
+ * This filter type will only be displayed on the structured UI currently.
+ *
+ * @since 1.29
+ */
+class ChangesListStringOptionsFilter extends ChangesListFilter {
+       /**
+        * @inheritdoc
+        */
+       public function displaysOnUnstructuredUi() {
+               return false;
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function isSelected( FormOptions $opts ) {
+               $values = explode(
+                       ChangesListStringOptionsFilterGroup::SEPARATOR,
+                       $opts[ $this->getGroup()->getName() ]
+               );
+               return in_array( $this->getName(), $values );
+       }
+}
diff --git a/includes/changes/ChangesListStringOptionsFilterGroup.php b/includes/changes/ChangesListStringOptionsFilterGroup.php
new file mode 100644 (file)
index 0000000..86b4a8b
--- /dev/null
@@ -0,0 +1,245 @@
+<?php
+/**
+ * Represents a filter group (used on ChangesListSpecialPage and descendants)
+ *
+ * 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
+ * @license GPL 2+
+ * @author Matthew Flaschen
+ */
+
+use Wikimedia\Rdbms\IDatabase;
+
+/**
+ * Represents a filter group with multiple string options. They are passed to the server as
+ * a single form parameter separated by a delimiter.  The parameter name is the
+ * group name.  E.g. groupname=opt1;opt2 .
+ *
+ * If all options are selected they are replaced by the term "all".
+ *
+ * There is also a single DB query modification for the whole group.
+ *
+ * @since 1.29
+ */
+
+class ChangesListStringOptionsFilterGroup extends ChangesListFilterGroup {
+       /**
+        * Type marker, used by JavaScript
+        */
+       const TYPE = 'string_options';
+
+       /**
+        * Delimiter
+        */
+       const SEPARATOR = ';';
+
+       /**
+        * Signifies that all options in the group are selected.
+        */
+       const ALL = 'all';
+
+       /**
+        * Signifies that no options in the group are selected, meaning the group has no effect.
+        *
+        * For full-coverage groups, this is the same as ALL if all filters are allowed.
+        * For others, it is not.
+        */
+       const NONE = '';
+
+       /**
+        * Defaul parameter value
+        *
+        * @var string $defaultValue
+        */
+       protected $defaultValue;
+
+       /**
+        * Callable used to do the actual query modification; see constructor
+        *
+        * @var callable $queryCallable
+        */
+       protected $queryCallable;
+
+       /**
+        * Create a new filter group with the specified configuration
+        *
+        * @param array $groupDefinition Configuration of group
+        * * $groupDefinition['name'] string Group name
+        * * $groupDefinition['title'] string i18n key for title (optional, can be omitted
+        *     only if none of the filters in the group display in the structured UI)
+        * * $groupDefinition['priority'] int Priority integer.  Higher means higher in the
+        *     group list.
+        * * $groupDefinition['filters'] array Numeric array of filter definitions, each of which
+        *     is an associative array to be passed to the filter constructor.  However,
+        *     'priority' is optional for the filters.  Any filter that has priority unset
+        *     will be put to the bottom, in the order given.
+        * * $groupDefinition['default'] string Default for group.
+        * * $groupDefinition['isFullCoverage'] bool Whether the group is full coverage;
+        *     if true, this means that checking every item in the group means no
+        *     changes list entries are filtered out.
+        * * $groupDefinition['queryCallable'] callable Callable accepting parameters:
+        *      * string $specialPageClassName Class name of current special page
+        *      * IContextSource $context Context, for e.g. user
+        *      * IDatabase $dbr Database, for addQuotes, makeList, and similar
+        *      * array &$tables Array of tables; see IDatabase::select $table
+        *      * array &$fields Array of fields; see IDatabase::select $vars
+        *      * array &$conds Array of conditions; see IDatabase::select $conds
+        *      * array &$query_options Array of query options; see IDatabase::select $options
+        *      * array &$join_conds Array of join conditions; see IDatabase::select $join_conds
+        *      * array $selectedValues The allowed and requested values, lower-cased and sorted
+        * * $groupDefinition['whatsThisHeader'] string i18n key for header of "What's
+        *     This" popup (optional).
+        * * $groupDefinition['whatsThisBody'] string i18n key for body of "What's This"
+        *     popup (optional).
+        * * $groupDefinition['whatsThisUrl'] string URL for main link of "What's This"
+        *     popup (optional).
+        * * $groupDefinition['whatsThisLinkText'] string i18n key of text for main link of
+        *     "What's This" popup (optional).
+        */
+       public function __construct( array $groupDefinition ) {
+               if ( !isset( $groupDefinition['isFullCoverage'] ) ) {
+                       throw new MWException( 'You must specify isFullCoverage' );
+               }
+
+               $groupDefinition['type'] = self::TYPE;
+
+               parent::__construct( $groupDefinition );
+
+               $this->queryCallable = $groupDefinition['queryCallable'];
+
+               if ( isset( $groupDefinition['default'] ) ) {
+                       $this->setDefault( $groupDefinition['default'] );
+               } else {
+                       throw new MWException( 'You must specify a default' );
+               }
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function isPerGroupRequestParameter() {
+               return true;
+       }
+
+       /**
+        * Sets default of filter group.
+        *
+        * @param string $defaultValue
+        */
+       public function setDefault( $defaultValue ) {
+               $this->defaultValue = $defaultValue;
+       }
+
+       /**
+        * Gets default of filter group
+        *
+        * @return string $defaultValue
+        */
+       public function getDefault() {
+               return $this->defaultValue;
+       }
+
+       /**
+        * @inheritdoc
+        */
+       protected function createFilter( array $filterDefinition ) {
+               return new ChangesListStringOptionsFilter( $filterDefinition );
+       }
+
+       /**
+        * Registers a filter in this group
+        *
+        * @param ChangesListStringOptionsFilter $filter ChangesListStringOptionsFilter
+        */
+       public function registerFilter( ChangesListStringOptionsFilter $filter ) {
+               $this->filters[$filter->getName()] = $filter;
+       }
+
+       /**
+        * Modifies the query to include the filter group.
+        *
+        * The modification is only done if the filter group is in effect.  This means that
+        * one or more valid and allowed filters were selected.
+        *
+        * @param IDatabase $dbr Database, for addQuotes, makeList, and similar
+        * @param ChangesListSpecialPage $specialPage Current special page
+        * @param array &$tables Array of tables; see IDatabase::select $table
+        * @param array &$fields Array of fields; see IDatabase::select $vars
+        * @param array &$conds Array of conditions; see IDatabase::select $conds
+        * @param array &$query_options Array of query options; see IDatabase::select $options
+        * @param array &$join_conds Array of join conditions; see IDatabase::select $join_conds
+        * @param string $value URL parameter value
+        */
+       public function modifyQuery( IDatabase $dbr, ChangesListSpecialPage $specialPage,
+               &$tables, &$fields, &$conds, &$query_options, &$join_conds, $value ) {
+
+               $allowedFilterNames = [];
+               foreach ( $this->filters as $filter ) {
+                       $allowedFilterNames[] = $filter->getName();
+               }
+
+               if ( $value === self::ALL ) {
+                       $selectedValues = $allowedFilterNames;
+               } else {
+                       $selectedValues = explode( self::SEPARATOR, strtolower( $value ) );
+
+                       // remove values that are not recognized or not currently allowed
+                       $selectedValues = array_intersect(
+                               $selectedValues,
+                               $allowedFilterNames
+                       );
+               }
+
+               // If there are now no values, because all are disallowed or invalid (also,
+               // the user may not have selected any), this is a no-op.
+
+               // If everything is unchecked, the group always has no effect, regardless
+               // of full-coverage.
+               if ( count( $selectedValues ) === 0 ) {
+                       return;
+               }
+
+               sort( $selectedValues );
+
+               call_user_func_array(
+                       $this->queryCallable,
+                       [
+                               get_class( $specialPage ),
+                               $specialPage->getContext(),
+                               $dbr,
+                               &$tables,
+                               &$fields,
+                               &$conds,
+                               &$query_options,
+                               &$join_conds,
+                               $selectedValues
+                       ]
+               );
+       }
+
+       /**
+        * @inheritdoc
+        */
+       public function getJsData() {
+               $output = parent::getJsData();
+
+               $output['separator'] = self::SEPARATOR;
+               $output['default'] = $this->getDefault();
+
+               return $output;
+       }
+}
index 3c76f32..b34a33f 100644 (file)
@@ -32,11 +32,17 @@ class EnhancedChangesList extends ChangesList {
         */
        protected $rc_cache;
 
+       /**
+        * @var TemplateParser
+        */
+       protected $templateParser;
+
        /**
         * @param IContextSource|Skin $obj
+        * @param array $filterGroups Array of ChangesListFilterGroup objects (currently optional)
         * @throws MWException
         */
-       public function __construct( $obj ) {
+       public function __construct( $obj, array $filterGroups = [] ) {
                if ( $obj instanceof Skin ) {
                        // @todo: deprecate constructing with Skin
                        $context = $obj->getContext();
@@ -49,7 +55,7 @@ class EnhancedChangesList extends ChangesList {
                        $context = $obj;
                }
 
-               parent::__construct( $context );
+               parent::__construct( $context, $filterGroups );
 
                // message is set by the parent ChangesList class
                $this->cacheEntryFactory = new RCCacheEntryFactory(
@@ -57,6 +63,7 @@ class EnhancedChangesList extends ChangesList {
                        $this->message,
                        $this->linkRenderer
                );
+               $this->templateParser = new TemplateParser();
        }
 
        /**
@@ -177,7 +184,6 @@ class EnhancedChangesList extends ChangesList {
                        && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
                ) {
                        $tableClasses[] = 'mw-changeslist-line-watched';
-                       $tableClasses = array_merge( $tableClasses, $this->getHTMLClassesForFilters( $block[0] ) );
                } else {
                        $tableClasses[] = 'mw-changeslist-line-not-watched';
                }
@@ -340,8 +346,7 @@ class EnhancedChangesList extends ChangesList {
 
                $this->rcCacheIndex++;
 
-               $templateParser = new TemplateParser();
-               return $templateParser->processTemplate(
+               return $this->templateParser->processTemplate(
                        'EnhancedChangesListGroup',
                        $templateParams
                );
@@ -367,7 +372,7 @@ class EnhancedChangesList extends ChangesList {
                if ( $rcObj->watched
                        && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
                ) {
-                       $classes[] = [ 'mw-enhanced-watched' ];
+                       $classes[] = 'mw-enhanced-watched';
                }
                $classes = array_merge( $classes, $this->getHTMLClassesForFilters( $rcObj ) );
 
@@ -532,7 +537,7 @@ class EnhancedChangesList extends ChangesList {
                                $links['total-changes'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
                                        new HtmlArmor( $nchanges[$n] ),
-                                       [],
+                                       [ 'class' => 'mw-changeslist-groupdiff' ],
                                        $queryParams + [
                                                'diff' => $currentRevision,
                                                'oldid' => $last->mAttribs['rc_last_oldid'],
@@ -542,7 +547,7 @@ class EnhancedChangesList extends ChangesList {
                                        $links['total-changes-since-last'] = $this->linkRenderer->makeKnownLink(
                                                        $block0->getTitle(),
                                                        new HtmlArmor( $sinceLastVisitMsg[$sinceLast] ),
-                                                       [],
+                                                       [ 'class' => 'mw-changeslist-groupdiff' ],
                                                        $queryParams + [
                                                                'diff' => $currentRevision,
                                                                'oldid' => $unvisitedOldid,
@@ -564,7 +569,7 @@ class EnhancedChangesList extends ChangesList {
                        $links['history'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
                                        new HtmlArmor( $this->message['enhancedrc-history'] ),
-                                       [],
+                                       [ 'class' => 'mw-changeslist-history' ],
                                        $params
                                );
                }
@@ -712,6 +717,11 @@ class EnhancedChangesList extends ChangesList {
                if ( $rc->getAttribute( 'rc_type' ) == RC_CATEGORIZE ) {
                        // For categorizations we must swap the category title with the page title!
                        $pageTitle = Title::newFromID( $rc->getAttribute( 'rc_cur_id' ) );
+                       if ( !$pageTitle ) {
+                               // The page has been deleted, but the RC entry
+                               // deletion job has not run yet. Just skip.
+                               return '';
+                       }
                }
 
                $retVal = ' ' . $this->msg( 'parentheses' )
@@ -719,7 +729,7 @@ class EnhancedChangesList extends ChangesList {
                                        . $this->linkRenderer->makeKnownLink(
                                                $pageTitle,
                                                new HtmlArmor( $this->message['hist'] ),
-                                               [],
+                                               [ 'class' => 'mw-changeslist-history' ],
                                                $query
                                        ) )->escaped();
                return $retVal;
index d862ef4..a5d5191 100644 (file)
@@ -34,7 +34,7 @@ class OldChangesList extends ChangesList {
        public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
 
                $classes = $this->getHTMLClasses( $rc, $watched );
-               // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
+               // use mw-line-even/mw-line-odd class only if linenumber is given (feature from T16468)
                if ( $linenumber ) {
                        if ( $linenumber & 1 ) {
                                $classes[] = 'mw-line-odd';
index 2c5c8b1..8ce21f5 100644 (file)
@@ -186,7 +186,7 @@ class RCCacheEntryFactory {
                        $curLink = $curMessage;
                } else {
                        $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
-                       $curLink = "<a href=\"$curUrl\">$curMessage</a>";
+                       $curLink = "<a class=\"mw-changeslist-diff-cur\" href=\"$curUrl\">$curMessage</a>";
                }
 
                return $curLink;
@@ -229,16 +229,18 @@ class RCCacheEntryFactory {
                                return $diffMessage;
                        }
                        $diffUrl = htmlspecialchars( $pageTitle->getLinkURL( $queryParams ) );
-                       $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
+                       $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
                } else {
                        $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
-                       $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
+                       $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
                }
 
                return $diffLink;
        }
 
        /**
+        * Builds the link to the previous version
+        *
         * @param RecentChange $cacheEntry
         * @param bool $showDiffLinks
         *
@@ -257,7 +259,7 @@ class RCCacheEntryFactory {
                        $lastLink = $this->linkRenderer->makeKnownLink(
                                $cacheEntry->getTitle(),
                                new HtmlArmor( $lastMessage ),
-                               [],
+                               [ 'class' => 'mw-changeslist-diff' ],
                                $this->buildDiffQueryParams( $cacheEntry )
                        );
                }
index dcab158..e8e35a3 100644 (file)
@@ -874,7 +874,7 @@ class RecentChange {
                        'rc_logid' => 0,
                        'rc_log_type' => null,
                        'rc_log_action' => '',
-                       'rc_params' =>  serialize( [
+                       'rc_params' => serialize( [
                                'hidden-cat' => WikiCategoryPage::factory( $categoryTitle )->isHidden()
                        ] )
                ];
@@ -911,7 +911,16 @@ class RecentChange {
        public function loadFromRow( $row ) {
                $this->mAttribs = get_object_vars( $row );
                $this->mAttribs['rc_timestamp'] = wfTimestamp( TS_MW, $this->mAttribs['rc_timestamp'] );
-               $this->mAttribs['rc_deleted'] = $row->rc_deleted; // MUST be set
+               // rc_deleted MUST be set
+               $this->mAttribs['rc_deleted'] = $row->rc_deleted;
+
+               if ( isset( $this->mAttribs['rc_ip'] ) ) {
+                       // Clean up CIDRs for Postgres per T164898. ("127.0.0.1" casts to "127.0.0.1/32")
+                       $n = strpos( $this->mAttribs['rc_ip'], '/' );
+                       if ( $n !== false ) {
+                               $this->mAttribs['rc_ip'] = substr( $this->mAttribs['rc_ip'], 0, $n );
+                       }
+               }
        }
 
        /**
index d2239eb..ff6a873 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup Change tagging
  */
 
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\Database;
+
 class ChangeTags {
        /**
         * Can't delete tags with more than this many uses. Similar in intent to
@@ -402,8 +405,8 @@ class ChangeTags {
                }
 
                // to be applied, a tag has to be explicitly defined
-               // @todo Allow extensions to define tags that can be applied by users...
                $allowedTags = self::listExplicitlyDefinedTags();
+               Hooks::run( 'ChangeTagsAllowedAdd', [ &$allowedTags, $tags, $user ] );
                $disallowedTags = array_diff( $tags, $allowedTags );
                if ( $disallowedTags ) {
                        return self::restrictedTagError( 'tags-apply-not-allowed-one',
@@ -658,7 +661,7 @@ class ChangeTags {
 
                        $tables[] = 'change_tag';
                        $join_conds['change_tag'] = [ 'INNER JOIN', $join_cond ];
-                       $conds['ct_tag'] = $filter_tag;
+                       $conds['ct_tag'] = explode( '|', $filter_tag );
                }
        }
 
@@ -922,6 +925,37 @@ class ChangeTags {
                return Status::newGood( $logId );
        }
 
+       /**
+        * Is the tag name valid?
+        *
+        * @param string $tag Tag that you are interested in creating
+        * @return Status
+        * @since 1.30
+        */
+       public static function isTagNameValid( $tag ) {
+               // no empty tags
+               if ( $tag === '' ) {
+                       return Status::newFatal( 'tags-create-no-name' );
+               }
+
+               // tags cannot contain commas (used as a delimiter in tag_summary table),
+               // pipe (used as a delimiter between multiple tags in
+               // modifyDisplayQuery), or slashes (would break tag description messages in
+               // MediaWiki namespace)
+               if ( strpos( $tag, ',' ) !== false || strpos( $tag, '|' ) !== false
+                       || strpos( $tag, '/' ) !== false ) {
+                       return Status::newFatal( 'tags-create-invalid-chars' );
+               }
+
+               // could the MediaWiki namespace description messages be created?
+               $title = Title::makeTitleSafe( NS_MEDIAWIKI, "Tag-$tag-description" );
+               if ( is_null( $title ) ) {
+                       return Status::newFatal( 'tags-create-invalid-title-chars' );
+               }
+
+               return Status::newGood();
+       }
+
        /**
         * Is it OK to allow the user to create this tag?
         *
@@ -940,21 +974,9 @@ class ChangeTags {
                        }
                }
 
-               // no empty tags
-               if ( $tag === '' ) {
-                       return Status::newFatal( 'tags-create-no-name' );
-               }
-
-               // tags cannot contain commas (used as a delimiter in tag_summary table) or
-               // slashes (would break tag description messages in MediaWiki namespace)
-               if ( strpos( $tag, ',' ) !== false || strpos( $tag, '/' ) !== false ) {
-                       return Status::newFatal( 'tags-create-invalid-chars' );
-               }
-
-               // could the MediaWiki namespace description messages be created?
-               $title = Title::makeTitleSafe( NS_MEDIAWIKI, "Tag-$tag-description" );
-               if ( is_null( $title ) ) {
-                       return Status::newFatal( 'tags-create-invalid-title-chars' );
+               $status = self::isTagNameValid( $tag );
+               if ( !$status->isGood() ) {
+                       return $status;
                }
 
                // does the tag already exist?
@@ -1156,8 +1178,9 @@ class ChangeTags {
                if ( !Hooks::isRegistered( 'ChangeTagsListActive' ) ) {
                        return $tags;
                }
-               return ObjectCache::getMainWANInstance()->getWithSetCallback(
-                       wfMemcKey( 'active-tags' ),
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'active-tags' ),
                        WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $tags ) {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) );
@@ -1167,7 +1190,7 @@ class ChangeTags {
                                return $tags;
                        },
                        [
-                               'checkKeys' => [ wfMemcKey( 'active-tags' ) ],
+                               'checkKeys' => [ $cache->makeKey( 'active-tags' ) ],
                                'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
                                'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
@@ -1210,8 +1233,9 @@ class ChangeTags {
        public static function listExplicitlyDefinedTags() {
                $fname = __METHOD__;
 
-               return ObjectCache::getMainWANInstance()->getWithSetCallback(
-                       wfMemcKey( 'valid-tags-db' ),
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'valid-tags-db' ),
                        WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_REPLICA );
@@ -1223,7 +1247,7 @@ class ChangeTags {
                                return array_filter( array_unique( $tags ) );
                        },
                        [
-                               'checkKeys' => [ wfMemcKey( 'valid-tags-db' ) ],
+                               'checkKeys' => [ $cache->makeKey( 'valid-tags-db' ) ],
                                'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
                                'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
@@ -1245,8 +1269,9 @@ class ChangeTags {
                if ( !Hooks::isRegistered( 'ListDefinedTags' ) ) {
                        return $tags;
                }
-               return ObjectCache::getMainWANInstance()->getWithSetCallback(
-                       wfMemcKey( 'valid-tags-hook' ),
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'valid-tags-hook' ),
                        WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $tags ) {
                                $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) );
@@ -1255,7 +1280,7 @@ class ChangeTags {
                                return array_filter( array_unique( $tags ) );
                        },
                        [
-                               'checkKeys' => [ wfMemcKey( 'valid-tags-hook' ) ],
+                               'checkKeys' => [ $cache->makeKey( 'valid-tags-hook' ) ],
                                'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
                                'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
@@ -1279,11 +1304,11 @@ class ChangeTags {
         * @since 1.25
         */
        public static function purgeTagCacheAll() {
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 
-               $cache->touchCheckKey( wfMemcKey( 'active-tags' ) );
-               $cache->touchCheckKey( wfMemcKey( 'valid-tags-db' ) );
-               $cache->touchCheckKey( wfMemcKey( 'valid-tags-hook' ) );
+               $cache->touchCheckKey( $cache->makeKey( 'active-tags' ) );
+               $cache->touchCheckKey( $cache->makeKey( 'valid-tags-db' ) );
+               $cache->touchCheckKey( $cache->makeKey( 'valid-tags-hook' ) );
 
                self::purgeTagUsageCache();
        }
@@ -1293,9 +1318,9 @@ class ChangeTags {
         * @since 1.25
         */
        public static function purgeTagUsageCache() {
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 
-               $cache->touchCheckKey( wfMemcKey( 'change-tag-statistics' ) );
+               $cache->touchCheckKey( $cache->makeKey( 'change-tag-statistics' ) );
        }
 
        /**
@@ -1310,8 +1335,9 @@ class ChangeTags {
         */
        public static function tagUsageStatistics() {
                $fname = __METHOD__;
-               return ObjectCache::getMainWANInstance()->getWithSetCallback(
-                       wfMemcKey( 'change-tag-statistics' ),
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'change-tag-statistics' ),
                        WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                $dbr = wfGetDB( DB_REPLICA, 'vslow' );
@@ -1334,7 +1360,7 @@ class ChangeTags {
                                return $out;
                        },
                        [
-                               'checkKeys' => [ wfMemcKey( 'change-tag-statistics' ) ],
+                               'checkKeys' => [ $cache->makeKey( 'change-tag-statistics' ) ],
                                'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
                                'pcTTL' => WANObjectCache::TTL_PROC_LONG
                        ]
index dd8bab9..a37f5f2 100644 (file)
@@ -49,8 +49,9 @@ abstract class ChangeTagsList extends RevisionListBase {
                                $className = 'ChangeTagsLogList';
                                break;
                        default:
-                               throw new Exception( "Class $className requested, but does not exist" );
+                               throw new Exception( "Class $typeName requested, but does not exist" );
                }
+
                return new $className( $context, $title, $ids );
        }
 
index 480aace..271005f 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Change tagging
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Stores a list of taggable log entries.
  * @since 1.25
index 8eae238..a0248c6 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Change tagging
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Stores a list of taggable revisions.
  * @since 1.25
diff --git a/includes/collation/BashkirUppercaseCollation.php b/includes/collation/BashkirUppercaseCollation.php
new file mode 100644 (file)
index 0000000..33ed9bc
--- /dev/null
@@ -0,0 +1,71 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.30
+ *
+ * @file
+ */
+
+class BashkirUppercaseCollation extends CustomUppercaseCollation {
+
+       public function __construct() {
+               parent::__construct( [
+                       'А',
+                       'Б',
+                       'В',
+                       'Г',
+                       'Ғ',
+                       'Д',
+                       'Ҙ',
+                       'Е',
+                       'Ё',
+                       'Ж',
+                       'З',
+                       'И',
+                       'Й',
+                       'К',
+                       'Ҡ',
+                       'Л',
+                       'М',
+                       'Н',
+                       'Ң',
+                       'О',
+                       'Ө',
+                       'П',
+                       'Р',
+                       'С',
+                       'Ҫ',
+                       'Т',
+                       'У',
+                       'Ү',
+                       'Ф',
+                       'Х',
+                       'Һ',
+                       'Ц',
+                       'Ч',
+                       'Ш',
+                       'Щ',
+                       'Ъ',
+                       'Ы',
+                       'Ь',
+                       'Э',
+                       'Ә',
+                       'Ю',
+                       'Я',
+               ], Language::factory( 'ba' ) );
+       }
+}
index d67bc7e..d009168 100644 (file)
@@ -65,6 +65,8 @@ abstract class Collation {
                                return new CollationEt;
                        case 'xx-uca-fa':
                                return new CollationFa;
+                       case 'uppercase-ba':
+                               return new BashkirUppercaseCollation;
                        default:
                                $match = [];
                                if ( preg_match( '/^uca-([A-Za-z@=-]+)$/', $collationName, $match ) ) {
index 5dc9fa2..ca7b765 100644 (file)
@@ -19,7 +19,7 @@
  */
 
 /**
- * Workaround for incorrect collation of Estonian language ('et') in ICU (bug 54168).
+ * Workaround for incorrect collation of Estonian language ('et') in ICU (T56168).
  *
  * 'W' and 'V' should not be considered the same letter for the purposes of collation in modern
  * Estonian. We work around this by replacing 'W' and 'w' with 'ᴡ' U+1D21 'LATIN LETTER SMALL
index 9cce087..f8506d7 100644 (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:
+ * Replace with other letters that appear in an okish spot in the alphabet
+ *
  *  - 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;
+
+       // Really hacky - replace with stuff from other blocks.
+       private $override = [
+               "\xd8\xa7" => "\u{0621}",
+               "\xd9\x88" => "\u{0649}",
+               "\xd9\xb2" => "\xF3\xB3\x80\x81",
+               "\xd9\xb3" => "\xF3\xB3\x80\x82",
+       ];
 
        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 );
+       public function getSortKey( $string ) {
+               $modified = strtr( $string, $this->override );
+               return parent::getSortKey( $modified );
+       }
+
+       public function getFirstLetter( $string ) {
+               if ( isset( $this->override[substr( $string, 0, 2 )] ) ) {
+                       return substr( $string, 0, 2 );
                }
-               return $primary;
+               return parent::getFirstLetter( $string );
        }
 }
diff --git a/includes/collation/CustomUppercaseCollation.php b/includes/collation/CustomUppercaseCollation.php
new file mode 100644 (file)
index 0000000..1b96bff
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.30
+ *
+ * @file
+ */
+
+/**
+ * Resort normal UTF-8 order by putting a bunch of stuff in PUA
+ *
+ * This takes a bunch of characters (The alphabet) that should,
+ * be together, and converts them all to private-use-area characters
+ * so that they are all sorted in the right order relative to each
+ * other.
+ *
+ * This renumbers characters starting at U+F3000 (Chosen to avoid
+ * conflicts with other people using private use area)
+ *
+ * This does not support fancy things like secondary differences, etc.
+ *
+ * It is expected most people will subclass this and just override the
+ * constructor to hard-code an alphabet.
+ */
+class CustomUppercaseCollation extends NumericUppercaseCollation {
+
+       /** @var array $alphabet Sorted array of letters */
+       private $alphabet;
+
+       /** @var array $puaSubset List of private use area codes */
+       private $puaSubset;
+
+       /**
+        * @note This assumes $alphabet does not contain U+F3000-U+F303F
+        *
+        * @param array $alphabet Sorted array of uppercase characters.
+        * @param Language $language What language for number sorting.
+        */
+       public function __construct( array $alphabet, Language $lang ) {
+               // It'd be trivial to extend this past 64, you'd just
+               // need a bit of bit-fiddling. Doesn't seem necessary right
+               // now.
+               if ( count( $alphabet ) < 1 || count( $alphabet ) >= 64 ) {
+                       throw new UnexpectedValueException( "Alphabet must be < 64 items" );
+               }
+               $this->alphabet = $alphabet;
+
+               $this->puaSubset = [];
+               $len = count( $alphabet );
+               for ( $i = 0; $i < $len; $i++ ) {
+                       $this->puaSubset[] = "\xF3\xB3\x80" . chr( $i + 128 );
+               }
+               parent::__construct( $lang );
+       }
+
+       private function convertToPua( $string ) {
+               return str_replace( $this->alphabet, $this->puaSubset, $string );
+       }
+
+       public function getSortKey( $string ) {
+               return $this->convertToPua( parent::getSortKey( $string ) );
+       }
+
+       public function getFirstLetter( $string ) {
+               // In case a title has a PUA code in it, make it sort
+               // under the header for the character it would replace
+               // to avoid inconsistent behaviour. This class mostly
+               // assumes that people will not use PUA codes.
+               return parent::getFirstLetter(
+                       str_replace( $this->puaSubset, $this->alphabet, $string )
+               );
+       }
+}
index bc5a209..e0eb1c1 100644 (file)
@@ -330,7 +330,7 @@ class IcuCollation extends Collation {
                        $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
                        $cacheKey = $cache->makeKey(
                                'first-letters',
-                               get_class( $this ),
+                               static::class,
                                $this->locale,
                                $this->digitTransformLanguage->getCode(),
                                self::getICUVersion(),
@@ -513,8 +513,12 @@ class IcuCollation extends Collation {
         * can't be determined.
         *
         * The constant INTL_ICU_VERSION this function refers to isn't really
-        * documented. It is available since PHP 5.3.7 (see PHP bug 54561).
-        * This function will return false on older PHPs.
+        * documented. It is available since PHP 5.3.7 (see PHP 54561
+        * https://bugs.php.net/bug.php?id=54561). This function will return
+        * false on older PHPs.
+        *
+        * TODO: Remove the backwards-compatibility as MediaWiki now requires
+        * higher levels of PHP.
         *
         * @since 1.21
         * @return string|bool
diff --git a/includes/compat/Timestamp.php b/includes/compat/Timestamp.php
new file mode 100644 (file)
index 0000000..bd25432
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+// This file is loaded by composer.json#autoload.files instead of autoload.php,
+// because PHP's class loader does not support autoloading an alias for a class that
+// isn't already loaded. See also AutoLoaderTest and ClassCollector.
+
+// By using an autoload file, this will trigger directly at runtime outside any class
+// loading context. This file will then register the alias and, as class_alias() does
+// by default, it will trigger a plain autoload for the destination class.
+
+// The below uses string concatenation for the alias to avoid being seen by ClassCollector,
+// which would insist on adding it to autoload.php, after which AutoLoaderTest will
+// complain about class_alias() not being in the target class file.
+
+/**
+ * @deprecated since 1.29
+ * @since 1.20
+ */
+class_alias( Wikimedia\Timestamp\TimestampException::class, 'Timestamp' . 'Exception' );
diff --git a/includes/config/EtcdConfig.php b/includes/config/EtcdConfig.php
new file mode 100644 (file)
index 0000000..ae3df49
--- /dev/null
@@ -0,0 +1,281 @@
+<?php
+/**
+ * Copyright 2017
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (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 Aaron Schulz
+ */
+
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Wikimedia\WaitConditionLoop;
+
+/**
+ * Interface for configuration instances
+ *
+ * @since 1.29
+ */
+class EtcdConfig implements Config, LoggerAwareInterface {
+       /** @var MultiHttpClient */
+       private $http;
+       /** @var BagOStuff */
+       private $srvCache;
+       /** @var array */
+       private $procCache;
+       /** @var LoggerInterface */
+       private $logger;
+
+       /** @var string */
+       private $host;
+       /** @var string */
+       private $protocol;
+       /** @var string */
+       private $directory;
+       /** @var string */
+       private $encoding;
+       /** @var integer */
+       private $baseCacheTTL;
+       /** @var integer */
+       private $skewCacheTTL;
+       /** @var integer */
+       private $timeout;
+
+       /**
+        * @param array $params Parameter map:
+        *   - host: the host address and port
+        *   - protocol: either http or https
+        *   - directory: the etc "directory" were MediaWiki specific variables are located
+        *   - encoding: one of ("JSON", "YAML"). Defaults to JSON. [optional]
+        *   - cache: BagOStuff instance or ObjectFactory spec thereof for a server cache.
+        *            The cache will also be used as a fallback if etcd is down. [optional]
+        *   - cacheTTL: logical cache TTL in seconds [optional]
+        *   - skewTTL: maximum seconds to randomly lower the assigned TTL on cache save [optional]
+        *   - timeout: seconds to wait for etcd before throwing an error [optional]
+        */
+       public function __construct( array $params ) {
+               $params += [
+                       'protocol' => 'http',
+                       'encoding' => 'JSON',
+                       'cacheTTL' => 10,
+                       'skewTTL' => 1,
+                       'timeout' => 2
+               ];
+
+               $this->host = $params['host'];
+               $this->protocol = $params['protocol'];
+               $this->directory = trim( $params['directory'], '/' );
+               $this->encoding = $params['encoding'];
+               $this->skewCacheTTL = $params['skewTTL'];
+               $this->baseCacheTTL = max( $params['cacheTTL'] - $this->skewCacheTTL, 0 );
+               $this->timeout = $params['timeout'];
+
+               if ( !isset( $params['cache'] ) ) {
+                       $this->srvCache = new HashBagOStuff();
+               } elseif ( $params['cache'] instanceof BagOStuff ) {
+                       $this->srvCache = $params['cache'];
+               } else {
+                       $this->srvCache = ObjectFactory::getObjectFromSpec( $params['cache'] );
+               }
+
+               $this->logger = new Psr\Log\NullLogger();
+               $this->http = new MultiHttpClient( [
+                       'connTimeout' => $this->timeout,
+                       'reqTimeout' => $this->timeout,
+                       'logger' => $this->logger
+               ] );
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+               $this->http->setLogger( $logger );
+       }
+
+       public function has( $name ) {
+               $this->load();
+
+               return array_key_exists( $name, $this->procCache['config'] );
+       }
+
+       public function get( $name ) {
+               $this->load();
+
+               if ( !array_key_exists( $name, $this->procCache['config'] ) ) {
+                       throw new ConfigException( "No entry found for '$name'." );
+               }
+
+               return $this->procCache['config'][$name];
+       }
+
+       /**
+        * @throws ConfigException
+        */
+       private function load() {
+               if ( $this->procCache !== null ) {
+                       return; // already loaded
+               }
+
+               $now = microtime( true );
+               $key = $this->srvCache->makeGlobalKey(
+                       __CLASS__,
+                       $this->host,
+                       $this->directory
+               );
+
+               // Get the cached value or block until it is regenerated (by this or another thread)...
+               $data = null; // latest config info
+               $error = null; // last error message
+               $loop = new WaitConditionLoop(
+                       function () use ( $key, $now, &$data, &$error ) {
+                               // Check if the values are in cache yet...
+                               $data = $this->srvCache->get( $key );
+                               if ( is_array( $data ) && $data['expires'] > $now ) {
+                                       $this->logger->debug( "Found up-to-date etcd configuration cache." );
+
+                                       return WaitConditionLoop::CONDITION_REACHED;
+                               }
+
+                               // Cache is either empty or stale;
+                               // refresh the cache from etcd, using a mutex to reduce stampedes...
+                               if ( $this->srvCache->lock( $key, 0, $this->baseCacheTTL ) ) {
+                                       try {
+                                               list( $config, $error, $retry ) = $this->fetchAllFromEtcd();
+                                               if ( is_array( $config ) ) {
+                                                       // Avoid having all servers expire cache keys at the same time
+                                                       $expiry = microtime( true ) + $this->baseCacheTTL;
+                                                       $expiry += mt_rand( 0, 1e6 ) / 1e6 * $this->skewCacheTTL;
+
+                                                       $data = [ 'config' => $config, 'expires' => $expiry ];
+                                                       $this->srvCache->set( $key, $data, BagOStuff::TTL_INDEFINITE );
+
+                                                       $this->logger->info( "Refreshed stale etcd configuration cache." );
+
+                                                       return WaitConditionLoop::CONDITION_REACHED;
+                                               } else {
+                                                       $this->logger->error( "Failed to fetch configuration: $error" );
+                                                       if ( !$retry ) {
+                                                               // Fail fast since the error is likely to keep happening
+                                                               return WaitConditionLoop::CONDITION_FAILED;
+                                                       }
+                                               }
+                                       } finally {
+                                               $this->srvCache->unlock( $key ); // release mutex
+                                       }
+                               }
+
+                               if ( is_array( $data ) ) {
+                                       $this->logger->info( "Using stale etcd configuration cache." );
+
+                                       return WaitConditionLoop::CONDITION_REACHED;
+                               }
+
+                               return WaitConditionLoop::CONDITION_CONTINUE;
+                       },
+                       $this->timeout
+               );
+
+               if ( $loop->invoke() !== WaitConditionLoop::CONDITION_REACHED ) {
+                       // No cached value exists and etcd query failed; throw an error
+                       throw new ConfigException( "Failed to load configuration from etcd: $error" );
+               }
+
+               $this->procCache = $data;
+       }
+
+       /**
+        * @return array (config array or null, error string, allow retries)
+        */
+       public function fetchAllFromEtcd() {
+               $dsd = new DnsSrvDiscoverer( $this->host );
+               $servers = $dsd->getServers();
+               if ( !$servers ) {
+                       return $this->fetchAllFromEtcdServer( $this->host );
+               }
+
+               do {
+                       // Pick a random etcd server from dns
+                       $server = $dsd->pickServer( $servers );
+                       $host = IP::combineHostAndPort( $server['target'], $server['port'] );
+                       // Try to load the config from this particular server
+                       list( $config, $error, $retry ) = $this->fetchAllFromEtcdServer( $host );
+                       if ( is_array( $config ) || !$retry ) {
+                               break;
+                       }
+
+                       // Avoid the server next time if that failed
+                       $servers = $dsd->removeServer( $server, $servers );
+               } while ( $servers );
+
+               return [ $config, $error, $retry ];
+       }
+
+       /**
+        * @param string $address Host and port
+        * @return array (config array or null, error string, whether to allow retries)
+        */
+       protected function fetchAllFromEtcdServer( $address ) {
+               // Retrieve all the values under the MediaWiki config directory
+               list( $rcode, $rdesc, /* $rhdrs */, $rbody, $rerr ) = $this->http->run( [
+                       'method' => 'GET',
+                       'url' => "{$this->protocol}://{$address}/v2/keys/{$this->directory}/",
+                       'headers' => [ 'content-type' => 'application/json' ]
+               ] );
+
+               static $terminalCodes = [ 404 => true ];
+               if ( $rcode < 200 || $rcode > 399 ) {
+                       return [
+                               null,
+                               strlen( $rerr ) ? $rerr : "HTTP $rcode ($rdesc)",
+                               empty( $terminalCodes[$rcode] )
+                       ];
+               }
+
+               $info = json_decode( $rbody, true );
+               if ( $info === null || !isset( $info['node']['nodes'] ) ) {
+                       return [ null, $rcode, "Unexpected JSON response; missing 'nodes' list.", false ];
+               }
+
+               $config = [];
+               foreach ( $info['node']['nodes'] as $node ) {
+                       if ( !empty( $node['dir'] ) ) {
+                               continue; // skip directories
+                       }
+
+                       $name = basename( $node['key'] );
+                       $value = $this->unserialize( $node['value'] );
+                       if ( !is_array( $value ) || !array_key_exists( 'val', $value ) ) {
+                               return [ null, "Failed to parse value for '$name'.", false ];
+                       }
+
+                       $config[$name] = $value['val'];
+               }
+
+               return [ $config, null, false ];
+       }
+
+       /**
+        * @param string $string
+        * @return mixed
+        */
+       private function unserialize( $string ) {
+               if ( $this->encoding === 'YAML' ) {
+                       return yaml_parse( $string );
+               } else { // JSON
+                       return json_decode( $string, true );
+               }
+       }
+}
index 58665bb..bccb147 100644 (file)
@@ -899,7 +899,7 @@ abstract class ContentHandler {
                        $onlyAuthor = $row->rev_user_text;
                        // Try to find a second contributor
                        foreach ( $res as $row ) {
-                               if ( $row->rev_user_text != $onlyAuthor ) { // Bug 22999
+                               if ( $row->rev_user_text != $onlyAuthor ) { // T24999
                                        $onlyAuthor = false;
                                        break;
                                }
@@ -1157,8 +1157,11 @@ abstract class ContentHandler {
         * @return array Map of name=>value for fields
         * @since 1.28
         */
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $output,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $output,
+               SearchEngine $engine
+       ) {
                $fieldData = [];
                $content = $page->getContent();
 
index 26f1190..3028dfd 100644 (file)
@@ -6,7 +6,7 @@
  * but instead manually called by WikitextHandler.
  * This should be fixed in the future.
  */
-class FileContentHandler extends WikitextContentHandler  {
+class FileContentHandler extends WikitextContentHandler {
 
        public function getFieldsForSearchIndex( SearchEngine $engine ) {
                $fields['file_media_type'] =
@@ -30,8 +30,11 @@ class FileContentHandler extends WikitextContentHandler  {
                return $fields;
        }
 
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $parserOutput,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $parserOutput,
+               SearchEngine $engine
+       ) {
                $fields = [];
 
                $title = $page->getTitle();
index 09cdcee..698a37b 100644 (file)
@@ -30,7 +30,7 @@
  */
 class TextContentHandler extends ContentHandler {
 
-       // @codingStandardsIgnoreStart bug 57585
+       // @codingStandardsIgnoreStart T59585
        public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = [ CONTENT_FORMAT_TEXT ] ) {
                parent::__construct( $modelId, $formats );
        }
@@ -150,8 +150,11 @@ class TextContentHandler extends ContentHandler {
                return $fields;
        }
 
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $output,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $output,
+               SearchEngine $engine
+       ) {
                $fields = parent::getDataForSearchIndex( $page, $output, $engine );
                $fields['language'] =
                        $this->getPageLanguage( $page->getTitle(), $page->getContent() )->getCode();
index f4a6dc6..afa03b8 100644 (file)
@@ -27,26 +27,35 @@ class WikiTextStructure {
         * @var string[] selectors to elements that are excluded entirely from search
         */
        private $excludedElementSelectors = [
-               'audio', 'video',       // "it looks like you don't have javascript enabled..."
-                                       // do not need to index
-               'sup.reference',        // The [1] for references
-               '.mw-cite-backlink',    // The ↑ next to references in the references section
-               'h1', 'h2', 'h3',       // Headings are already indexed in their own field.
-               'h5', 'h6', 'h4',
-               '.autocollapse',        // Collapsed fields are hidden by default so we don't want them
-                                                               // showing up.
+               // "it looks like you don't have javascript enabled..." – do not need to index
+               'audio', 'video',
+               // The [1] for references
+               'sup.reference',
+               // The ↑ next to references in the references section
+               '.mw-cite-backlink',
+               // Headings are already indexed in their own field.
+               'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
+               // Collapsed fields are hidden by default so we don't want them showing up.
+               '.autocollapse',
+               // Content explicitly decided to be not searchable by editors such
+               // as custom navigation templates.
+               '.navigation-not-searchable'
        ];
 
        /**
         * @var string[] selectors to elements that are considered auxiliary to article text for search
         */
        private $auxiliaryElementSelectors = [
-               '.thumbcaption',        // Thumbnail captions aren't really part of the text proper
-               'table',                // Neither are tables
-               '.rellink',             // Common style for "See also:".
-               '.dablink',             // Common style for calling out helpful links at the top
-                                                               // of the article.
-               '.searchaux',           // New class users can use to mark stuff as auxiliary to searches.
+               // Thumbnail captions aren't really part of the text proper
+               '.thumbcaption',
+               // Neither are tables
+               'table',
+               // Common style for "See also:".
+               '.rellink',
+               // Common style for calling out helpful links at the top of the article.
+               '.dablink',
+               // New class users can use to mark stuff as auxiliary to searches.
+               '.searchaux',
        ];
 
        /**
index 74b2f1a..9c26ae1 100644 (file)
@@ -128,16 +128,20 @@ class WikitextContentHandler extends TextContentHandler {
 
                $fields['opening_text'] =
                        $engine->makeSearchFieldMapping( 'opening_text', SearchIndexField::INDEX_TYPE_TEXT );
-               $fields['opening_text']->setFlag( SearchIndexField::FLAG_SCORING |
-                                                 SearchIndexField::FLAG_NO_HIGHLIGHT );
+               $fields['opening_text']->setFlag(
+                       SearchIndexField::FLAG_SCORING | SearchIndexField::FLAG_NO_HIGHLIGHT
+               );
                // Until we have full first-class content handler for files, we invoke it explicitly here
                $fields = array_merge( $fields, $this->getFileHandler()->getFieldsForSearchIndex( $engine ) );
 
                return $fields;
        }
 
-       public function getDataForSearchIndex( WikiPage $page, ParserOutput $parserOutput,
-                                              SearchEngine $engine ) {
+       public function getDataForSearchIndex(
+               WikiPage $page,
+               ParserOutput $parserOutput,
+               SearchEngine $engine
+       ) {
                $fields = parent::getDataForSearchIndex( $page, $parserOutput, $engine );
 
                $structure = new WikiTextStructure( $parserOutput );
index 829dd73..135c9b2 100644 (file)
@@ -19,6 +19,7 @@
  * @file
  */
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * The simplest way of implementing IContextSource is to hold a RequestContext as a
@@ -39,7 +40,7 @@ abstract class ContextSource implements IContextSource {
         */
        public function getContext() {
                if ( $this->context === null ) {
-                       $class = get_class( $this );
+                       $class = static::class;
                        wfDebug( __METHOD__ . " ($class): called and \$context is null. " .
                                "Using RequestContext::getMain() for sanity\n" );
                        $this->context = RequestContext::getMain();
@@ -172,7 +173,7 @@ abstract class ContextSource implements IContextSource {
         * @return StatsdDataFactory
         */
        public function getStats() {
-               return $this->getContext()->getStats();
+               return MediaWikiServices::getInstance()->getStatsdDataFactory();
        }
 
        /**
index ecd274b..3dfa456 100644 (file)
@@ -428,7 +428,7 @@ class RequestContext implements IContextSource, MutableContext {
                                }
 
                                // Normalize the key in case the user is passing gibberish
-                               // or has old preferences (bug 69566).
+                               // or has old preferences (T71566).
                                $normalized = Skin::normalizeKey( $userSkin );
 
                                // Skin::normalizeKey will also validate it, so
index da660bd..0f8d7f7 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\LoadBalancer;
 
 /**
index 2b394b6..809b660 100644 (file)
@@ -24,6 +24,7 @@
  * @ingroup Database
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 class CloneDatabase {
        /** @var string Table prefix for cloning */
@@ -79,7 +80,7 @@ class CloneDatabase {
                foreach ( $this->tablesToClone as $tbl ) {
                        if ( $wgSharedDB && in_array( $tbl, $wgSharedTables, true ) ) {
                                // Shared tables don't work properly when cloning due to
-                               // how prefixes are handled (bug 65654)
+                               // how prefixes are handled (T67654)
                                throw new RuntimeException( "Cannot clone shared table $tbl." );
                        }
                        # Clean up from previous aborted run.  So that table escaping
index 344aa3d..b728786 100644 (file)
  * @file
  * @ingroup Database
  */
+
+use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\DBConnectionError;
+use Wikimedia\Rdbms\DBUnexpectedError;
 
 /**
  * @ingroup Database
index fe063f2..464a918 100644 (file)
@@ -33,9 +33,12 @@ abstract class MWLBFactory {
        /**
         * @param array $lbConf Config for LBFactory::__construct()
         * @param Config $mainConfig Main config object from MediaWikiServices
+        * @param ConfiguredReadOnlyMode $readOnlyMode
         * @return array
         */
-       public static function applyDefaultConfig( array $lbConf, Config $mainConfig ) {
+       public static function applyDefaultConfig( array $lbConf, Config $mainConfig,
+               ConfiguredReadOnlyMode $readOnlyMode
+       ) {
                global $wgCommandLineMode;
 
                static $typesWithSchema = [ 'postgres', 'msssql' ];
@@ -55,8 +58,7 @@ abstract class MWLBFactory {
                        'errorLogger' => [ MWExceptionHandler::class, 'logException' ],
                        'cliMode' => $wgCommandLineMode,
                        'hostname' => wfHostname(),
-                       // TODO: replace the global wfConfiguredReadOnlyReason() with a service.
-                       'readOnlyReason' => wfConfiguredReadOnlyReason(),
+                       'readOnlyReason' => $readOnlyMode->getReason(),
                ];
 
                // When making changes here, remember to also specify MediaWiki-specific options
index 07c6fc7..fbbc962 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * The oci8 extension is fairly weak and doesn't support oci_num_rows, among
  * other things. We use a wrapper class to handle that and other
index 87656f2..e67a0b3 100644 (file)
@@ -370,7 +370,7 @@ class MWDebug {
                                | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start
                                | (?<=[\x0-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle
                                | (?<![\xC2-\xDF]|[\xE0-\xEF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4]
-                                  |[\xF0-\xF4][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF]{2})[\x80-\xBF] # Overlong Sequence
+                                       | [\xF0-\xF4][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF]{2})[\x80-\xBF] # Overlong Sequence
                                | (?<=[\xE0-\xEF])[\x80-\xBF](?![\x80-\xBF]) # Short 3 byte sequence
                                | (?<=[\xF0-\xF4])[\x80-\xBF](?![\x80-\xBF]{2}) # Short 4 byte sequence
                                | (?<=[\xF0-\xF4][\x80-\xBF])[\x80-\xBF](?![\x80-\xBF]) # Short 4 byte sequence (2)
diff --git a/includes/debug/logger/ConsoleLogger.php b/includes/debug/logger/ConsoleLogger.php
new file mode 100644 (file)
index 0000000..5a5e507
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+namespace MediaWiki\Logger;
+
+use Psr\Log\AbstractLogger;
+
+/**
+ * A logger which writes to the terminal. The output is supposed to be
+ * human-readable, and should be changed as necessary to better achieve that
+ * goal.
+ */
+class ConsoleLogger extends AbstractLogger {
+       public function __construct( $channel ) {
+               $this->channel = $channel;
+       }
+
+       public function log( $level, $message, array $context = [] ) {
+               fwrite( STDERR, "[$level] " .
+                       LegacyLogger::format( $this->channel, $message, $context ) );
+       }
+}
diff --git a/includes/debug/logger/ConsoleSpi.php b/includes/debug/logger/ConsoleSpi.php
new file mode 100644 (file)
index 0000000..e29b98d
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+namespace MediaWiki\Logger;
+
+class ConsoleSpi implements Spi {
+       public function __construct( $config = [] ) {
+       }
+
+       public function getLogger( $channel ) {
+               return new ConsoleLogger( $channel );
+       }
+}
index 432a9e1..6670fe9 100644 (file)
@@ -33,12 +33,12 @@ use Psr\Log\LoggerInterface;
  *
  * Constructor options array arguments:
  * * alias: map from monolog channel to kafka topic name. When no
- *       alias exists the topic "monolog_$channel" will be used.
+ *   alias exists the topic "monolog_$channel" will be used.
  * * swallowExceptions: Swallow exceptions that occur while talking to
- *    kafka. Defaults to false.
+ *   kafka. Defaults to false.
  * * logExceptions: Log exceptions talking to kafka here. Either null,
- *    the name of a channel to log to, or an object implementing
- *    FormatterInterface. Defaults to null.
+ *   the name of a channel to log to, or an object implementing
+ *   FormatterInterface. Defaults to null.
  *
  * Requires the nmred/kafka-php library, version >= 1.3.0
  *
index 6585575..8b62989 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Deferrable Update for closure/callback updates via IDatabase::doAtomicSection()
  * @since 1.27
index d61dec2..f9297af 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Deferrable Update for closure/callback updates that should use auto-commit mode
  * @since 1.28
index 000b526..bbe8687 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\LBFactory;
 use Wikimedia\Rdbms\LoadBalancer;
@@ -336,6 +337,21 @@ class DeferredUpdates {
                return count( self::$preSendUpdates ) + count( self::$postSendUpdates );
        }
 
+       /**
+        * @param integer $stage DeferredUpdates constant (PRESEND, POSTSEND, or ALL)
+        * @since 1.29
+        */
+       public static function getPendingUpdates( $stage = self::ALL ) {
+               $updates = [];
+               if ( $stage === self::ALL || $stage === self::PRESEND ) {
+                       $updates = array_merge( $updates, self::$preSendUpdates );
+               }
+               if ( $stage === self::ALL || $stage === self::POSTSEND ) {
+                       $updates = array_merge( $updates, self::$postSendUpdates );
+               }
+               return $updates;
+       }
+
        /**
         * Clear all pending updates without performing them. Generally, you don't
         * want or need to call this. Unit tests need it though.
index 7215696..ca29078 100644 (file)
@@ -21,6 +21,7 @@
  */
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Update object handling the cleanup of links tables after a page was deleted.
index 464c908..072c1e0 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
@@ -145,7 +146,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                        # If the sortkey is longer then 255 bytes,
                        # it truncated by DB, and then doesn't get
                        # matched when comparing existing vs current
-                       # categories, causing bug 25254.
+                       # categories, causing T27254.
                        # Also. substr behaves weird when given "".
                        if ( $sortkey !== '' ) {
                                $sortkey = substr( $sortkey, 0, 255 );
@@ -363,21 +364,24 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
        private function updateCategoryCounts( array $added, array $deleted ) {
                global $wgUpdateRowsPerQuery;
 
+               if ( !$added && !$deleted ) {
+                       return;
+               }
+
+               $wikiId = $this->getDB()->getWikiID();
                $wp = WikiPage::factory( $this->mTitle );
-               $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               $lbf = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               // T163801: try to release any row locks to reduce contention
+               $lbf->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'wiki' => $wikiId ] );
 
                foreach ( array_chunk( array_keys( $added ), $wgUpdateRowsPerQuery ) as $addBatch ) {
                        $wp->updateCategoryCounts( $addBatch, [], $this->mId );
-                       $factory->commitAndWaitForReplication(
-                               __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ]
-                       );
+                       $lbf->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'wiki' => $wikiId ] );
                }
 
                foreach ( array_chunk( array_keys( $deleted ), $wgUpdateRowsPerQuery ) as $deleteBatch ) {
                        $wp->updateCategoryCounts( [], $deleteBatch, $this->mId );
-                       $factory->commitAndWaitForReplication(
-                               __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ]
-                       );
+                       $lbf->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'wiki' => $wikiId ] );
                }
        }
 
@@ -398,7 +402,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
        private function incrTableUpdate( $table, $prefix, $deletions, $insertions ) {
                $services = MediaWikiServices::getInstance();
                $bSize = $services->getMainConfig()->get( 'UpdateRowsPerQuery' );
-               $factory = $services->getDBLoadBalancerFactory();
+               $lbf = $services->getDBLoadBalancerFactory();
 
                if ( $table === 'page_props' ) {
                        $fromField = 'pp_page';
@@ -408,7 +412,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
 
                $deleteWheres = []; // list of WHERE clause arrays for each DB delete() call
                if ( $table === 'pagelinks' || $table === 'templatelinks' || $table === 'iwlinks' ) {
-                       $baseKey =  ( $table === 'iwlinks' ) ? 'iwl_prefix' : "{$prefix}_namespace";
+                       $baseKey = ( $table === 'iwlinks' ) ? 'iwl_prefix' : "{$prefix}_namespace";
 
                        $curBatchSize = 0;
                        $curDeletionBatch = [];
@@ -450,7 +454,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
 
                foreach ( $deleteWheres as $deleteWhere ) {
                        $this->getDB()->delete( $table, $deleteWhere, __METHOD__ );
-                       $factory->commitAndWaitForReplication(
+                       $lbf->commitAndWaitForReplication(
                                __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ]
                        );
                }
@@ -458,7 +462,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
                $insertBatches = array_chunk( $insertions, $bSize );
                foreach ( $insertBatches as $insertBatch ) {
                        $this->getDB()->insert( $table, $insertBatch, __METHOD__, 'IGNORE' );
-                       $factory->commitAndWaitForReplication(
+                       $lbf->commitAndWaitForReplication(
                                __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ]
                        );
                }
index 5247e97..5b822af 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Deferrable Update for closure/callback
  */
index ab4a609..8c38d8b 100644 (file)
@@ -17,7 +17,9 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Assert\Assert;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class for handling updates to the site_stats table
@@ -92,7 +94,7 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
                global $wgSiteStatsAsyncFactor;
 
                $dbw = wfGetDB( DB_MASTER );
-               $lockKey = wfMemcKey( 'site_stats' ); // prepend wiki ID
+               $lockKey = wfWikiID() . ':site_stats'; // prepend wiki ID
                $pd = [];
                if ( $wgSiteStatsAsyncFactor ) {
                        // Lock the table so we don't have double DB/memcached updates
@@ -169,7 +171,7 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
        }
 
        protected function doUpdateContextStats() {
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                foreach ( [ 'edits', 'articles', 'pages', 'users', 'images' ] as $type ) {
                        $delta = $this->$type;
                        if ( $delta !== 0 ) {
@@ -205,12 +207,13 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
        }
 
        /**
+        * @param BagOStuff $cache
         * @param string $type
         * @param string $sign ('+' or '-')
         * @return string
         */
-       private function getTypeCacheKey( $type, $sign ) {
-               return wfMemcKey( 'sitestatsupdate', 'pendingdelta', $type, $sign );
+       private function getTypeCacheKey( BagOStuff $cache, $type, $sign ) {
+               return $cache->makeKey( 'sitestatsupdate', 'pendingdelta', $type, $sign );
        }
 
        /**
@@ -220,11 +223,11 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
         * @param int $delta Delta (positive or negative)
         */
        protected function adjustPending( $type, $delta ) {
-               $cache = ObjectCache::getMainStashInstance();
+               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
                if ( $delta < 0 ) { // decrement
-                       $key = $this->getTypeCacheKey( $type, '-' );
+                       $key = $this->getTypeCacheKey( $cache, $type, '-' );
                } else { // increment
-                       $key = $this->getTypeCacheKey( $type, '+' );
+                       $key = $this->getTypeCacheKey( $cache, $type, '+' );
                }
 
                $magnitude = abs( $delta );
@@ -236,7 +239,7 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
         * @return array Positive and negative deltas for each type
         */
        protected function getPendingDeltas() {
-               $cache = ObjectCache::getMainStashInstance();
+               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
 
                $pending = [];
                foreach ( [ 'ss_total_edits',
@@ -244,8 +247,8 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
                ) {
                        // Get pending increments and pending decrements
                        $flg = BagOStuff::READ_LATEST;
-                       $pending[$type]['+'] = (int)$cache->get( $this->getTypeCacheKey( $type, '+' ), $flg );
-                       $pending[$type]['-'] = (int)$cache->get( $this->getTypeCacheKey( $type, '-' ), $flg );
+                       $pending[$type]['+'] = (int)$cache->get( $this->getTypeCacheKey( $cache, $type, '+' ), $flg );
+                       $pending[$type]['-'] = (int)$cache->get( $this->getTypeCacheKey( $cache, $type, '-' ), $flg );
                }
 
                return $pending;
@@ -256,12 +259,12 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
         * @param array $pd Result of getPendingDeltas(), used for DB update
         */
        protected function removePendingDeltas( array $pd ) {
-               $cache = ObjectCache::getMainStashInstance();
+               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
 
                foreach ( $pd as $type => $deltas ) {
                        foreach ( $deltas as $sign => $magnitude ) {
                                // Lower the pending counter now that we applied these changes
-                               $cache->decr( $this->getTypeCacheKey( $type, $sign ), $magnitude );
+                               $cache->decr( $this->getTypeCacheKey( $cache, $type, $sign ), $magnitude );
                        }
                }
        }
index 25e8841..2411bef 100644 (file)
@@ -21,6 +21,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * @deprecated Since 1.28 Use DataUpdate directly, injecting the database
  */
index 33ddc59..b12af19 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use Psr\Log\LoggerInterface;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class for fixing stale WANObjectCache keys using a purge event source
index 5367199..b0ab244 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup DifferenceEngine
  */
+use MediaWiki\MediaWikiServices;
 
 /** @deprecated use class constant instead */
 define( 'MW_DIFF_VERSION', '1.11a' );
@@ -82,7 +83,7 @@ class DifferenceEngine extends ContextSource {
        /**
         * Set this to true to add debug info to the HTML output.
         * Warning: this may cause RSS readers to spuriously mark articles as "new"
-        * (bug 20601)
+        * (T22601)
         */
        public $enableDebugComment = false;
 
@@ -852,7 +853,7 @@ class DifferenceEngine extends ContextSource {
                        $result = $this->textDiff( $otext, $ntext );
 
                        $time = intval( ( microtime( true ) - $time ) * 1000 );
-                       $this->getStats()->timing( 'diff_time', $time );
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->timing( 'diff_time', $time );
                        // Log requests slower than 99th percentile
                        if ( $time > 100 && $this->mOldPage && $this->mNewPage ) {
                                wfDebugLog( 'diff',
index a26775f..ad80275 100644 (file)
@@ -46,11 +46,9 @@ class WordAccumulator {
        private function flushGroup( $new_tag ) {
                if ( $this->group !== '' ) {
                        if ( $this->tag == 'ins' ) {
-                               $this->line .= "<ins{$this->insClass}>" .
-                                                          htmlspecialchars( $this->group ) . '</ins>';
+                               $this->line .= "<ins{$this->insClass}>" . htmlspecialchars( $this->group ) . '</ins>';
                        } elseif ( $this->tag == 'del' ) {
-                               $this->line .= "<del{$this->delClass}>" .
-                                                          htmlspecialchars( $this->group ) . '</del>';
+                               $this->line .= "<del{$this->delClass}>" . htmlspecialchars( $this->group ) . '</del>';
                        } else {
                                $this->line .= htmlspecialchars( $this->group );
                        }
index 9b5a268..2bed87a 100644 (file)
@@ -39,7 +39,7 @@ class ErrorPageError extends MWException implements ILocalizedException {
                $this->msg = $msg;
                $this->params = $params;
 
-               // Bug 44111: Messages in the log files should be in English and not
+               // T46111: Messages in the log files should be in English and not
                // 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.
index e958c94..8c1f8dc 100644 (file)
@@ -63,17 +63,6 @@ class MWException extends Exception {
                return $wgLang instanceof Language;
        }
 
-       /**
-        * Run hook to allow extensions to modify the text of the exception
-        *
-        * @param string $name Class name of the exception
-        * @param array $args Arguments to pass to the callback functions
-        * @return string|null String to output or null if any hook has been called
-        */
-       public function runHooks( $name, $args = [] ) {
-               return MWExceptionRenderer::runHooks( $this, $name, $args );
-       }
-
        /**
         * Get a message from i18n
         *
@@ -112,7 +101,7 @@ class MWException extends Exception {
                        "</p>\n";
                } else {
                        $logId = WebRequest::getRequestId();
-                       $type = get_class( $this );
+                       $type = static::class;
                        return "<div class=\"errorbox\">" .
                        '[' . $logId . '] ' .
                        gmdate( 'Y-m-d H:i:s' ) . ": " .
@@ -164,12 +153,7 @@ class MWException extends Exception {
                if ( $this->useOutputPage() ) {
                        $wgOut->prepareErrorPage( $this->getPageTitle() );
 
-                       $hookResult = $this->runHooks( get_class( $this ) );
-                       if ( $hookResult ) {
-                               $wgOut->addHTML( $hookResult );
-                       } else {
-                               $wgOut->addHTML( $this->getHTML() );
-                       }
+                       $wgOut->addHTML( $this->getHTML() );
 
                        $wgOut->output();
                } else {
@@ -183,12 +167,7 @@ class MWException extends Exception {
                                '<style>body { font-family: sans-serif; margin: 0; padding: 0.5em 2em; }</style>' .
                                "</head><body>\n";
 
-                       $hookResult = $this->runHooks( get_class( $this ) . 'Raw' );
-                       if ( $hookResult ) {
-                               echo $hookResult;
-                       } else {
-                               echo $this->getHTML();
-                       }
+                       echo $this->getHTML();
 
                        echo "</body></html>\n";
                }
@@ -203,7 +182,7 @@ class MWException extends Exception {
 
                if ( defined( 'MW_API' ) ) {
                        // Unhandled API exception, we can't be sure that format printer is alive
-                       self::header( 'MediaWiki-API-Error: internal_api_error_' . get_class( $this ) );
+                       self::header( 'MediaWiki-API-Error: internal_api_error_' . static::class );
                        wfHttpError( 500, 'Internal Server Error', $this->getText() );
                } elseif ( self::isCommandLine() ) {
                        $message = $this->getText();
index 44ab0e4..433274e 100644 (file)
@@ -21,6 +21,7 @@
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 use Psr\Log\LogLevel;
+use Wikimedia\Rdbms\DBError;
 
 /**
  * Handler class for MWExceptions
@@ -342,7 +343,7 @@ TXT;
                                $text .= "{$pad}#{$level} {$frame['file']}({$frame['line']}): ";
                        } else {
                                // 'file' and 'line' are unset for calls via call_user_func
-                               // (bug 55634) This matches behaviour of
+                               // (T57634) This matches behaviour of
                                // Exception::getTraceAsString to instead display "[internal
                                // function]".
                                $text .= "{$pad}#{$level} [internal function]: ";
index a569bcd..bd43934 100644 (file)
  * @author Aaron Schulz
  */
 
+use Wikimedia\Rdbms\DBConnectionError;
+use Wikimedia\Rdbms\DBError;
+use Wikimedia\Rdbms\DBReadOnlyError;
+use Wikimedia\Rdbms\DBExpectedError;
+
 /**
  * Class to expose exceptions to the client (API bots, users, admins using CLI scripts)
  * @since 1.28
@@ -42,10 +47,10 @@ class MWExceptionRenderer {
                } elseif ( self::isCommandLine() ) {
                        self::printError( self::getText( $e ) );
                } elseif ( $mode === self::AS_PRETTY ) {
+                       self::statusHeader( 500 );
                        if ( $e instanceof DBConnectionError ) {
                                self::reportOutageHTML( $e );
                        } else {
-                               self::statusHeader( 500 );
                                self::header( "Content-Type: $wgMimeType; charset=utf-8" );
                                self::reportHTML( $e );
                        }
@@ -79,51 +84,6 @@ class MWExceptionRenderer {
                }
        }
 
-       /**
-        * Run hook to allow extensions to modify the text of the exception
-        *
-        * Called by MWException for b/c
-        *
-        * @param Exception|Throwable $e
-        * @param string $name Class name of the exception
-        * @param array $args Arguments to pass to the callback functions
-        * @return string|null String to output or null if any hook has been called
-        */
-       public static function runHooks( $e, $name, $args = [] ) {
-               global $wgExceptionHooks;
-
-               if ( !isset( $wgExceptionHooks ) || !is_array( $wgExceptionHooks ) ) {
-                       return null; // Just silently ignore
-               }
-
-               if ( !array_key_exists( $name, $wgExceptionHooks ) ||
-                       !is_array( $wgExceptionHooks[$name] )
-               ) {
-                       return null;
-               }
-
-               $hooks = $wgExceptionHooks[$name];
-               $callargs = array_merge( [ $e ], $args );
-
-               foreach ( $hooks as $hook ) {
-                       if (
-                               is_string( $hook ) ||
-                               ( is_array( $hook ) && count( $hook ) >= 2 && is_string( $hook[0] ) )
-                       ) {
-                               // 'function' or [ 'class', 'hook' ]
-                               $result = call_user_func_array( $hook, $callargs );
-                       } else {
-                               $result = null;
-                       }
-
-                       if ( is_string( $result ) ) {
-                               return $result;
-                       }
-               }
-
-               return null;
-       }
-
        /**
         * @param Exception|Throwable $e
         * @return bool Should the exception use $wgOut to output the error?
@@ -162,16 +122,11 @@ class MWExceptionRenderer {
                                $wgOut->prepareErrorPage( self::msg( 'internalerror', 'Internal error' ) );
                        }
 
-                       $hookResult = self::runHooks( $e, get_class( $e ) );
-                       if ( $hookResult ) {
-                               $wgOut->addHTML( $hookResult );
-                       } else {
-                               // Show any custom GUI message before the details
-                               if ( $e instanceof MessageSpecifier ) {
-                                       $wgOut->addHTML( Message::newFromSpecifier( $e )->escaped() );
-                               }
-                               $wgOut->addHTML( self::getHTML( $e ) );
+                       // Show any custom GUI message before the details
+                       if ( $e instanceof MessageSpecifier ) {
+                               $wgOut->addHTML( Message::newFromSpecifier( $e )->escaped() );
                        }
+                       $wgOut->addHTML( self::getHTML( $e ) );
 
                        $wgOut->output();
                } else {
@@ -186,12 +141,7 @@ class MWExceptionRenderer {
                                '<style>body { font-family: sans-serif; margin: 0; padding: 0.5em 2em; }</style>' .
                                "</head><body>\n";
 
-                       $hookResult = self::runHooks( $e, get_class( $e ) . 'Raw' );
-                       if ( $hookResult ) {
-                               echo $hookResult;
-                       } else {
-                               echo self::getHTML( $e );
-                       }
+                       echo self::getHTML( $e );
 
                        echo "</body></html>\n";
                }
@@ -288,7 +238,7 @@ class MWExceptionRenderer {
                        $vars[] = '$wgShowDBErrorBacktrace = true;';
                }
                $vars = implode( ' and ', $vars );
-               return "Set $vars at the bottom of LocalSettings.php to show detailed debugging information";
+               return "Set $vars at the bottom of LocalSettings.php to show detailed debugging information\n";
        }
 
        /**
index 43c5b09..6086d55 100644 (file)
@@ -32,7 +32,7 @@
  * @par Example:
  * @code
  * if( $user->isAnon() ) {
- *     throw new UserNotLoggedIn();
+ *   throw new UserNotLoggedIn();
  * }
  * @endcode
  *
  * @par Example:
  * @code
  * if( $user->isAnon() ) {
- *     throw new UserNotLoggedIn( 'action-require-loggedin' );
+ *   throw new UserNotLoggedIn( 'action-require-loggedin' );
  * }
  * @endcode
  *
- * @see bug 37627
+ * @see T39627
  * @since 1.20
  * @ingroup Exception
  */
index c1f2d59..a307468 100644 (file)
@@ -27,6 +27,9 @@
  * @defgroup Dump Dump
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * @ingroup SpecialPage Dump
  */
@@ -343,7 +346,7 @@ class WikiExporter {
                                # query optimization for history stub dumps
                                if ( $this->text == WikiExporter::STUB && $orderRevs ) {
                                        $tables = [ 'revision', 'page' ];
-                                       $opts[] = 'STRAIGHT_JOIN';
+                                       $opts[] = 'STRAIGHT_JOIN';
                                        $opts['ORDER BY'] = [ 'rev_page ASC', 'rev_id ASC' ];
                                        $opts['USE INDEX']['revision'] = 'rev_page_id';
                                        $join['page'] = [ 'INNER JOIN', 'rev_page=page_id' ];
index 52bf0f0..5a1f92c 100644 (file)
@@ -433,6 +433,9 @@ class XmlDumpWriter {
                global $wgContLang;
                $prefix = $wgContLang->getFormattedNsText( $title->getNamespace() );
 
+               // @todo Emit some kind of warning to the user if $title->getNamespace() !==
+               // NS_MAIN and $prefix === '' (viz. pages in an unregistered namespace)
+
                if ( $prefix !== '' ) {
                        $prefix .= ':';
                }
index d907c30..6bb1618 100644 (file)
@@ -21,6 +21,9 @@
  */
 
 use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBConnRef;
+use Wikimedia\Rdbms\MaintainableDBConnRef;
 
 /**
  * DB accessable external objects.
index 62e635d..aa97c9a 100644 (file)
@@ -23,6 +23,8 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
 
 /**
  * Version of FileJournal that logs to a DB table
index 5936e7d..2108aed 100644 (file)
@@ -1,4 +1,8 @@
 <?php
+
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
+
 /**
  * MySQL version of DBLockManager that supports shared locks.
  *
index 5bc60a0..856dc36 100644 (file)
@@ -23,6 +23,9 @@
  * @author Aaron Schulz
  */
 
+use Wikimedia\Rdbms\DBConnRef;
+use Wikimedia\Rdbms\MaintainableDBConnRef;
+
 /**
  * @brief Proxy backend that manages file layout rewriting for FileRepo.
  *
index 0e4b2f0..8edf81f 100644 (file)
@@ -1448,7 +1448,7 @@ class FileRepo {
                                'dst' => $archivePath,
                                // We may have 2+ identical files being deleted,
                                // all of which will map to the same destination file
-                               'overwriteSame' => true // also see bug 31792
+                               'overwriteSame' => true // also see T33792
                        ];
                }
 
index ca41718..43f1d21 100644 (file)
@@ -571,7 +571,7 @@ class ForeignAPIRepo extends FileRepo {
 
                $cache = ObjectCache::getMainWANInstance();
                return $cache->getWithSetCallback(
-                       $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) ),
+                       $this->getLocalCacheKey( static::class, $target, md5( $url ) ),
                        $cacheTTL,
                        function ( $curValue, &$ttl ) use ( $url, $cache ) {
                                $html = self::httpGet( $url, 'default', [], $mtime );
@@ -593,13 +593,13 @@ class ForeignAPIRepo extends FileRepo {
         * @throws MWException
         */
        function enumFiles( $callback ) {
-               throw new MWException( 'enumFiles is not supported by ' . get_class( $this ) );
+               throw new MWException( 'enumFiles is not supported by ' . static::class );
        }
 
        /**
         * @throws MWException
         */
        protected function assertWritableRepo() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+               throw new MWException( static::class . ': write operations are not supported.' );
        }
 }
index f49ef88..bce3005 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup FileRepo
  */
 
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A foreign repository with an accessible MediaWiki database
  *
@@ -138,7 +141,7 @@ class ForeignDBRepo extends LocalRepo {
        }
 
        protected function assertWritableRepo() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+               throw new MWException( static::class . ': write operations are not supported.' );
        }
 
        /**
index a9cd030..f83fd1c 100644 (file)
@@ -100,7 +100,7 @@ class ForeignDBViaLBRepo extends LocalRepo {
        }
 
        protected function assertWritableRepo() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+               throw new MWException( static::class . ': write operations are not supported.' );
        }
 
        public function getInfo() {
index d49ae7b..d91ab24 100644 (file)
  * @ingroup FileRepo
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A repository that stores files in the local filesystem and registers them
  * in the wiki's own database. This is the most commonly used repository class.
index f2b7395..1c12e02 100644 (file)
@@ -33,6 +33,6 @@ class NullRepo extends FileRepo {
        }
 
        protected function assertWritableRepo() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported.' );
+               throw new MWException( static::class . ': write operations are not supported.' );
        }
 }
index be78462..0ad0527 100644 (file)
@@ -5,6 +5,7 @@
  *
  * Represents files in a repository.
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Base code for files.
@@ -436,7 +437,7 @@ abstract class File implements IDBAccessObject {
                        $this->fsFile = $this->repo->getLocalReference( $this->getPath() );
 
                        $statTiming = microtime( true ) - $starttime;
-                       RequestContext::getMain()->getStats()->timing(
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
                                'media.thumbnail.generate.fetchoriginal', 1000 * $statTiming );
 
                        if ( !$this->fsFile ) {
@@ -919,7 +920,7 @@ abstract class File implements IDBAccessObject {
                        return $this->iconThumb();
                }
                $hp['width'] = $width;
-               // be sure to ignore any height specification as well (bug 62258)
+               // be sure to ignore any height specification as well (T64258)
                unset( $hp['height'] );
 
                return $this->transform( $hp );
@@ -1039,7 +1040,7 @@ abstract class File implements IDBAccessObject {
                                break; // not a bitmap or renderable image, don't try
                        }
 
-                       // Get the descriptionUrl to embed it as comment into the thumbnail. Bug 19791.
+                       // Get the descriptionUrl to embed it as comment into the thumbnail. T21791.
                        $descriptionUrl = $this->getDescriptionUrl();
                        if ( $descriptionUrl ) {
                                $params['descriptionUrl'] = wfExpandUrl( $descriptionUrl, PROTO_CANONICAL );
@@ -1117,7 +1118,7 @@ abstract class File implements IDBAccessObject {
        public function generateAndSaveThumb( $tmpFile, $transformParams, $flags ) {
                global $wgIgnoreImageErrors;
 
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
 
                $handler = $this->getHandler();
 
@@ -1227,7 +1228,7 @@ abstract class File implements IDBAccessObject {
                // this object exists
                $tmpFile->bind( $this );
 
-               RequestContext::getMain()->getStats()->timing(
+               MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
                        'media.thumbnail.generate.bucket', 1000 * $buckettime );
 
                return true;
@@ -1766,7 +1767,7 @@ abstract class File implements IDBAccessObject {
         * @throws MWException
         */
        function readOnlyError() {
-               throw new MWException( get_class( $this ) . ': write operations are not supported' );
+               throw new MWException( static::class . ': write operations are not supported' );
        }
 
        /**
@@ -2148,15 +2149,32 @@ abstract class File implements IDBAccessObject {
        }
 
        /**
-        * @return array HTTP header name/value map to use for HEAD/GET request responses
+        * @deprecated since 1.30, use File::getContentHeaders instead
         */
        function getStreamHeaders() {
+               wfDeprecated( __METHOD__, '1.30' );
+               return $this->getContentHeaders();
+       }
+
+       /**
+        * @return array HTTP header name/value map to use for HEAD/GET request responses
+        * @since 1.30
+        */
+       function getContentHeaders() {
                $handler = $this->getHandler();
                if ( $handler ) {
-                       return $handler->getStreamHeaders( $this->getMetadata() );
-               } else {
-                       return [];
+                       $metadata = $this->getMetadata();
+
+                       if ( $metadata ) {
+                               if ( is_string( $metadata ) ) {
+                                       $metadata = MediaWiki\quietCall( 'unserialize', $metadata );
+                               }
+
+                               return $handler->getContentHeaders( $metadata, $this->getWidth(), $this->getHeight() );
+                       }
                }
+
+               return [];
        }
 
        /**
index f6f44e6..cf21161 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup FileAbstraction
  */
 
+use Wikimedia\Rdbms\DBUnexpectedError;
+
 /**
  * Foreign file with an accessible MediaWiki database
  *
index 8c088b9..8514cc8 100644 (file)
@@ -21,7 +21,9 @@
  * @ingroup FileAbstraction
  */
 
-use \MediaWiki\Logger\LoggerFactory;
+use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class to represent a local file in the wiki's own database
@@ -391,7 +393,7 @@ class LocalFile extends File {
         * @param int $flags
         */
        function loadFromDB( $flags = 0 ) {
-               $fname = get_class( $this ) . '::' . __FUNCTION__;
+               $fname = static::class . '::' . __FUNCTION__;
 
                # Unconditionally set loaded=true, we don't want the accessors constantly rechecking
                $this->dataLoaded = true;
@@ -416,7 +418,7 @@ class LocalFile extends File {
         * This covers fields that are sometimes not cached.
         */
        protected function loadExtraFromDB() {
-               $fname = get_class( $this ) . '::' . __FUNCTION__;
+               $fname = static::class . '::' . __FUNCTION__;
 
                # Unconditionally set loaded=true, we don't want the accessors constantly rechecking
                $this->extraDataLoaded = true;
@@ -891,7 +893,7 @@ class LocalFile extends File {
                                $files[] = $file;
                        }
                } catch ( FileBackendError $e ) {
-               } // suppress (bug 54674)
+               } // suppress (T56674)
 
                return $files;
        }
@@ -1100,7 +1102,7 @@ class LocalFile extends File {
         */
        public function nextHistoryLine() {
                # Polymorphic function name to distinguish foreign and local fetches
-               $fname = get_class( $this ) . '::' . __FUNCTION__;
+               $fname = static::class . '::' . __FUNCTION__;
 
                $dbr = $this->repo->getReplicaDB();
 
@@ -1198,7 +1200,11 @@ class LocalFile extends File {
                $options = [];
                $handler = MediaHandler::getHandler( $props['mime'] );
                if ( $handler ) {
-                       $options['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+                       $metadata = MediaWiki\quietCall( 'unserialize', $props['metadata'] );
+
+                       $options['headers'] = $handler->getContentHeaders(
+                               $metadata, $props['width'], $props['height']
+                       );
                } else {
                        $options['headers'] = [];
                }
@@ -1353,7 +1359,7 @@ class LocalFile extends File {
                                }
                        }
 
-                       # (bug 34993) Note: $oldver can be empty here, if the previous
+                       # (T36993) Note: $oldver can be empty here, if the previous
                        # version of the file was broken. Allow registration of the new
                        # version to continue anyway, because that's better than having
                        # an image that's not fixable by user operations.
@@ -2007,7 +2013,7 @@ class LocalFile extends File {
                        $dbw = $this->repo->getMasterDB();
                        $makesTransaction = !$dbw->trxLevel();
                        $dbw->startAtomic( self::ATOMIC_SECTION_LOCK );
-                       // Bug 54736: use simple lock to handle when the file does not exist.
+                       // T56736: use simple lock to handle when the file does not exist.
                        // SELECT FOR UPDATE prevents changes, not other SELECTs with FOR UPDATE.
                        // Also, that would cause contention on INSERT of similarly named rows.
                        $status = $this->acquireFileLock(); // represents all versions of the file
@@ -3035,7 +3041,7 @@ class LocalFileMoveBatch {
                        $status->failCount++;
                }
                $status->successCount += $oldRowCount;
-               // Bug 34934: oldCount is based on files that actually exist.
+               // T36934: oldCount is based on files that actually exist.
                // There may be more DB rows than such files, in which case $affected
                // can be greater than $total. We use max() to avoid negatives here.
                $status->failCount += max( 0, $this->oldCount - $oldRowCount );
index 179f6af..399147b 100644 (file)
@@ -1259,7 +1259,7 @@ class HTMLForm extends ContextSource {
         *
         * @param string|array|Status $elements The set of errors/warnings to process.
         * @param string $elementsType Should warnings or errors be returned.  This is meant
-        *      for Status objects, all other valid types are always considered as errors.
+        *     for Status objects, all other valid types are always considered as errors.
         * @return string
         */
        public function getErrorsOrWarnings( $elements, $elementsType ) {
index 487d6f6..83a8023 100644 (file)
@@ -475,7 +475,7 @@ abstract class HTMLFormField {
        public function getTableRow( $value ) {
                list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
                $inputHtml = $this->getInputHTML( $value );
-               $fieldType = get_class( $this );
+               $fieldType = static::class;
                $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
                $cellAttributes = [];
                $rowAttributes = [];
@@ -533,7 +533,7 @@ abstract class HTMLFormField {
        public function getDiv( $value ) {
                list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
                $inputHtml = $this->getInputHTML( $value );
-               $fieldType = get_class( $this );
+               $fieldType = static::class;
                $helptext = $this->getHelpTextHtmlDiv( $this->getHelpText() );
                $cellAttributes = [];
                $label = $this->getLabelHtml( $cellAttributes );
@@ -601,7 +601,7 @@ abstract class HTMLFormField {
                        $infusable = false;
                }
 
-               $fieldType = get_class( $this );
+               $fieldType = static::class;
                $help = $this->getHelpText();
                $errors = $this->getErrorsRaw( $value );
                foreach ( $errors as &$error ) {
@@ -1145,6 +1145,9 @@ abstract class HTMLFormField {
         * @since 1.18
         */
        protected static function formatErrors( $errors ) {
+               // Note: If you change the logic in this method, change
+               // htmlform.Checker.js to match.
+
                if ( is_array( $errors ) && count( $errors ) === 1 ) {
                        $errors = array_shift( $errors );
                }
index 54bdf04..6650321 100644 (file)
@@ -191,15 +191,12 @@ class OOUIHTMLForm extends HTMLForm {
         * @return string
         */
        public function getErrorsOrWarnings( $elements, $elementsType ) {
-               if ( !in_array( $elementsType, [ 'error', 'warning' ] ) ) {
+               if ( !in_array( $elementsType, [ 'error', 'warning' ], true ) ) {
                        throw new DomainException( $elementsType . ' is not a valid type.' );
                }
-               if ( !$elements ) {
-                       $errors = [];
-               } elseif ( $elements instanceof Status ) {
-                       if ( $elements->isGood() ) {
-                               $errors = [];
-                       } else {
+               $errors = [];
+               if ( $elements instanceof Status ) {
+                       if ( !$elements->isGood() ) {
                                $errors = $elements->getErrorsByType( $elementsType );
                                foreach ( $errors as &$error ) {
                                        // Input:  [ 'message' => 'foo', 'errors' => [ 'a', 'b', 'c' ] ]
@@ -207,13 +204,12 @@ class OOUIHTMLForm extends HTMLForm {
                                        $error = array_merge( [ $error['message'] ], $error['params'] );
                                }
                        }
-               } elseif ( $elementsType === 'errors' )  {
-                       $errors = $elements;
-                       if ( !is_array( $errors ) ) {
-                               $errors = [ $errors ];
+               } elseif ( $elementsType === 'error' ) {
+                       if ( is_array( $elements ) ) {
+                               $errors = $elements;
+                       } elseif ( is_string( $elements ) ) {
+                               $errors = [ $elements ];
                        }
-               } else {
-                       $errors = [];
                }
 
                foreach ( $errors as &$error ) {
index 46172a5..fa18a3c 100644 (file)
@@ -189,7 +189,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
        public function getTableRow( $value ) {
                list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
                $inputHtml = $this->getInputHTML( $value );
-               $fieldType = get_class( $this );
+               $fieldType = static::class;
                $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
                $cellAttributes = [ 'colspan' => 2 ];
 
index 8fb840a..dd9184b 100644 (file)
@@ -46,7 +46,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
        protected $uniqueId;
 
        public function __construct( $params ) {
-               $this->uniqueId = get_class( $this ) . ++self::$counter . 'x';
+               $this->uniqueId = static::class . ++self::$counter . 'x';
                parent::__construct( $params );
 
                if ( empty( $this->mParams['fields'] ) || !is_array( $this->mParams['fields'] ) ) {
index 23044bd..2b6e066 100644 (file)
@@ -17,6 +17,11 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
        public function __construct( $params ) {
                parent::__construct( $params );
 
+               // If the disabled-options parameter is not provided, use an empty array
+               if ( isset( $this->mParams['disabled-options'] ) === false ) {
+                       $this->mParams['disabled-options'] = [];
+               }
+
                // For backwards compatibility, also handle the old way with 'cssclass' => 'mw-chosen'
                if ( isset( $params['dropdown'] ) || strpos( $this->mClass, 'mw-chosen' ) !== false ) {
                        $this->mClass .= ' mw-htmlform-dropdown';
@@ -75,6 +80,9 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                                        'id' => "{$this->mID}-$info",
                                        'value' => $info,
                                ];
+                               if ( in_array( $info, $this->mParams['disabled-options'], true ) ) {
+                                       $thisAttribs['disabled'] = 'disabled';
+                               }
                                $checked = in_array( $info, $value, true );
 
                                $checkbox = $this->getOneCheckbox( $checked, $attribs + $thisAttribs, $label );
@@ -112,6 +120,18 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                }
        }
 
+       /**
+        * Get options and make them into arrays suitable for OOUI.
+        * @return array Options for inclusion in a select or whatever.
+        */
+       public function getOptionsOOUI() {
+               $options = parent::getOptionsOOUI();
+               foreach ( $options as &$option ) {
+                       $option['disabled'] = in_array( $option['data'], $this->mParams['disabled-options'], true );
+               }
+               return $options;
+       }
+
        /**
         * Get the OOUI version of this field.
         *
index 8c1241d..8829f66 100644 (file)
@@ -72,7 +72,13 @@ class HTMLUsersMultiselectField extends HTMLUserTextField {
                        $params['default'] = $values;
                }
 
-               return new UsersMultiselectWidget( $params );
+               // Make the field auto-infusable when it's used inside a legacy HTMLForm rather than OOUIHTMLForm
+               $params['infusable'] = true;
+               $params['classes'] = [ 'mw-htmlform-field-autoinfuse' ];
+               $widget = new UsersMultiselectWidget( $params );
+               $widget->setAttributes( [ 'data-mw-modules' => implode( ',', $this->getOOUIModules() ) ] );
+
+               return $widget;
        }
 
        protected function shouldInfuseOOUI() {
index f958ff6..3da3eb3 100644 (file)
@@ -145,7 +145,7 @@ class CurlHttpRequest extends MWHttpRequest {
                $this->parseHeader();
                $this->setStatus();
 
-               return Status::wrap( $this->status );  // TODO B/C; move this to callers
+               return Status::wrap( $this->status ); // TODO B/C; move this to callers
        }
 
        /**
index 779d606..4f21ce2 100644 (file)
@@ -46,18 +46,21 @@ class Http {
         *    - caInfo              Provide CA information
         *    - maxRedirects        Maximum number of redirects to follow (defaults to 5)
         *    - followRedirects     Whether to follow redirects (defaults to false).
-        *                                  Note: this should only be used when the target URL is trusted,
-        *                                  to avoid attacks on intranet services accessible by HTTP.
+        *                          Note: this should only be used when the target URL is trusted,
+        *                          to avoid attacks on intranet services accessible by HTTP.
         *    - userAgent           A user agent, if you want to override the default
         *                          MediaWiki/$wgVersion
         *    - logger              A \Psr\Logger\LoggerInterface instance for debug logging
         *    - username            Username for HTTP Basic Authentication
         *    - password            Password for HTTP Basic Authentication
+        *    - originalRequest     Information about the original request (as a WebRequest object or
+        *                          an associative array with 'ip' and 'userAgent').
         * @param string $caller The method making this request, for profiling
         * @return string|bool (bool)false on failure or a string on success
         */
        public static function request( $method, $url, $options = [], $caller = __METHOD__ ) {
-               wfDebug( "HTTP: $method: $url\n" );
+               $logger = LoggerFactory::getInstance( 'http' );
+               $logger->debug( "$method: $url" );
 
                $options['method'] = strtoupper( $method );
 
@@ -75,7 +78,6 @@ class Http {
                        return $req->getContent();
                } else {
                        $errors = $status->getErrorsByType( 'error' );
-                       $logger = LoggerFactory::getInstance( 'http' );
                        $logger->warning( Status::wrap( $status )->getWikiText( false, false, 'en' ),
                                [ 'error' => $errors, 'caller' => $caller, 'content' => $req->getContent() ] );
                        return false;
@@ -162,4 +164,20 @@ class Http {
 
                return "";
        }
+
+       /**
+        * Get a configured MultiHttpClient
+        * @param array $options
+        */
+       public static function createMultiClient( $options = [] ) {
+               global $wgHTTPConnectTimeout, $wgHTTPTimeout, $wgHTTPProxy;
+
+               return new MultiHttpClient( $options + [
+                       'connTimeout' => $wgHTTPConnectTimeout,
+                       'reqTimeout' => $wgHTTPTimeout,
+                       'userAgent' => self::userAgent(),
+                       'proxy' => $wgHTTPProxy,
+                       'logger' => LoggerFactory::getInstance( 'http' )
+               ] );
+       }
 }
index fac052f..88cc510 100644 (file)
@@ -125,6 +125,9 @@ class MWHttpRequest implements LoggerAwareInterface {
                                'Basic ' . base64_encode( $options['username'] . ':' . $options['password'] )
                        );
                }
+               if ( isset( $options['originalRequest'] ) ) {
+                       $this->setOriginalRequest( $options['originalRequest'] );
+               }
 
                $members = [ "postData", "proxy", "noProxy", "sslVerifyHost", "caInfo",
                                "method", "followRedirects", "maxRedirects", "sslVerifyCert", "callback" ];
@@ -132,7 +135,7 @@ class MWHttpRequest implements LoggerAwareInterface {
                foreach ( $members as $o ) {
                        if ( isset( $options[$o] ) ) {
                                // ensure that MWHttpRequest::method is always
-                               // uppercased. Bug 36137
+                               // uppercased. T38137
                                if ( $o == 'method' ) {
                                        $options[$o] = strtoupper( $options[$o] );
                                }
@@ -580,7 +583,7 @@ class MWHttpRequest implements LoggerAwareInterface {
         *
         * Note that the multiple Location: headers are an artifact of
         * CURL -- they shouldn't actually get returned this way. Rewrite
-        * this when bug 29232 is taken care of (high-level redirect
+        * this when T31232 is taken care of (high-level redirect
         * handling rewrite).
         *
         * @return string
@@ -606,19 +609,17 @@ class MWHttpRequest implements LoggerAwareInterface {
                                }
                        }
 
-                       if ( $foundRelativeURI ) {
-                               if ( $domain ) {
-                                       return $domain . $locations[$countLocations - 1];
-                               } else {
-                                       $url = parse_url( $this->url );
-                                       if ( isset( $url['host'] ) ) {
-                                               return $url['scheme'] . '://' . $url['host'] .
-                                                       $locations[$countLocations - 1];
-                                       }
-                               }
-                       } else {
+                       if ( !$foundRelativeURI ) {
                                return $locations[$countLocations - 1];
                        }
+                       if ( $domain ) {
+                               return $domain . $locations[$countLocations - 1];
+                       }
+                       $url = parse_url( $this->url );
+                       if ( isset( $url['host'] ) ) {
+                               return $url['scheme'] . '://' . $url['host'] .
+                                       $locations[$countLocations - 1];
+                       }
                }
 
                return $this->url;
@@ -632,4 +633,34 @@ class MWHttpRequest implements LoggerAwareInterface {
        public function canFollowRedirects() {
                return true;
        }
+
+       /**
+        * Set information about the original request. This can be useful for
+        * endpoints/API modules which act as a proxy for some service, and
+        * throttling etc. needs to happen in that service.
+        * Calling this will result in the X-Forwarded-For and X-Original-User-Agent
+        * headers being set.
+        * @param WebRequest|array $originalRequest When in array form, it's
+        *   expected to have the keys 'ip' and 'userAgent'.
+        * @note IP/user agent is personally identifiable information, and should
+        *   only be set when the privacy policy of the request target is
+        *   compatible with that of the MediaWiki installation.
+        */
+       public function setOriginalRequest( $originalRequest ) {
+               if ( $originalRequest instanceof WebRequest ) {
+                       $originalRequest = [
+                               'ip' => $originalRequest->getIP(),
+                               'userAgent' => $originalRequest->getHeader( 'User-Agent' ),
+                       ];
+               } elseif (
+                       !is_array( $originalRequest )
+                       || array_diff( [ 'ip', 'userAgent' ], array_keys( $originalRequest ) )
+               ) {
+                       throw new InvalidArgumentException( __METHOD__ . ': $originalRequest must be a '
+                               . "WebRequest or an array with 'ip' and 'userAgent' keys" );
+               }
+
+               $this->reqHeaders['X-Forwarded-For'] = $originalRequest['ip'];
+               $this->reqHeaders['X-Original-User-Agent'] = $originalRequest['userAgent'];
+       }
 }
index 1769924..06b579a 100644 (file)
@@ -546,7 +546,7 @@ class WikiImporter {
        public function doImport() {
                // Calls to reader->read need to be wrapped in calls to
                // libxml_disable_entity_loader() to avoid local file
-               // inclusion attacks (bug 46932).
+               // inclusion attacks (T48932).
                $oldDisable = libxml_disable_entity_loader( true );
                $this->reader->read();
 
index 23db3e2..f6becb9 100644 (file)
  * Represents a revision, log entry or upload during the import process.
  * This class sticks closely to the structure of the XML dump.
  *
+ * @since 1.2
+ *
  * @ingroup SpecialPage
  */
 class WikiRevision {
-       /** @todo Unused? */
+
+       /**
+        * @since 1.17
+        * @deprecated in 1.29. Unused.
+        * @note Introduced in 9b3128eb2b654761f21fd4ca1d5a1a4b796dc912, unused there, unused now.
+        */
        public $importer = null;
 
-       /** @var Title */
+       /**
+        * @since 1.2
+        * @var Title
+        */
        public $title = null;
 
-       /** @var int */
+       /**
+        * @since 1.6.4
+        * @var int
+        */
        public $id = 0;
 
-       /** @var string */
+       /**
+        * @since 1.2
+        * @var string
+        */
        public $timestamp = "20010115000000";
 
        /**
+        * @since 1.2
         * @var int
-        * @todo Can't find any uses. Public, because that's suspicious. Get clarity. */
+        * @deprecated in 1.29. Unused.
+        * @note Introduced in 436a028086fb3f01c4605c5ad2964d56f9306aca, unused there, unused now.
+        */
        public $user = 0;
 
-       /** @var string */
+       /**
+        * @since 1.2
+        * @var string
+        */
        public $user_text = "";
 
-       /** @var User */
+       /**
+        * @since 1.27
+        * @var User
+        */
        public $userObj = null;
 
-       /** @var string */
+       /**
+        * @since 1.21
+        * @var string
+        */
        public $model = null;
 
-       /** @var string */
+       /**
+        * @since 1.21
+        * @var string
+        */
        public $format = null;
 
-       /** @var string */
+       /**
+        * @since 1.2
+        * @var string
+        */
        public $text = "";
 
-       /** @var int */
+       /**
+        * @since 1.12.2
+        * @var int
+        */
        protected $size;
 
-       /** @var Content */
+       /**
+        * @since 1.21
+        * @var Content
+        */
        public $content = null;
 
-       /** @var ContentHandler */
+       /**
+        * @since 1.24
+        * @var ContentHandler
+        */
        protected $contentHandler = null;
 
-       /** @var string */
+       /**
+        * @since 1.2.6
+        * @var string
+        */
        public $comment = "";
 
-       /** @var bool */
+       /**
+        * @since 1.5.7
+        * @var bool
+        */
        public $minor = false;
 
-       /** @var string */
+       /**
+        * @since 1.12.2
+        * @var string
+        */
        public $type = "";
 
-       /** @var string */
+       /**
+        * @since 1.12.2
+        * @var string
+        */
        public $action = "";
 
-       /** @var string */
+       /**
+        * @since 1.12.2
+        * @var string
+        */
        public $params = "";
 
-       /** @var string */
+       /**
+        * @since 1.17
+        * @var string
+        */
        public $fileSrc = '';
 
-       /** @var bool|string */
+       /**
+        * @since 1.17
+        * @var bool|string
+        */
        public $sha1base36 = false;
 
        /**
-        * @var bool
-        * @todo Unused?
+        * @since 1.17
+        * @var string
         */
-       public $isTemp = false;
-
-       /** @var string */
        public $archiveName = '';
 
+       /**
+        * @since 1.12.2
+        */
        protected $filename;
 
-       /** @var mixed */
+       /**
+        * @since 1.12.2
+        * @var mixed
+        */
        protected $src;
 
-       /** @todo Unused? */
+       /**
+        * @since 1.18
+        * @var bool
+        * @todo Unused?
+        */
+       public $isTemp = false;
+
+       /**
+        * @since 1.18
+        * @deprecated 1.29 use Wikirevision::isTempSrc()
+        * First written to in 43d5d3b682cc1733ad01a837d11af4a402d57e6a
+        * Actually introduced in 52cd34acf590e5be946b7885ffdc13a157c1c6cf
+        */
        public $fileIsTemp;
 
        /** @var bool */
@@ -121,10 +200,11 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.7 taking a Title object (string before)
         * @param Title $title
         * @throws MWException
         */
-       function setTitle( $title ) {
+       public function setTitle( $title ) {
                if ( is_object( $title ) ) {
                        $this->title = $title;
                } elseif ( is_null( $title ) ) {
@@ -136,142 +216,163 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.6.4
         * @param int $id
         */
-       function setID( $id ) {
+       public function setID( $id ) {
                $this->id = $id;
        }
 
        /**
+        * @since 1.2
         * @param string $ts
         */
-       function setTimestamp( $ts ) {
+       public function setTimestamp( $ts ) {
                # 2003-08-05T18:30:02Z
                $this->timestamp = wfTimestamp( TS_MW, $ts );
        }
 
        /**
+        * @since 1.2
         * @param string $user
         */
-       function setUsername( $user ) {
+       public function setUsername( $user ) {
                $this->user_text = $user;
        }
 
        /**
+        * @since 1.27
         * @param User $user
         */
-       function setUserObj( $user ) {
+       public function setUserObj( $user ) {
                $this->userObj = $user;
        }
 
        /**
+        * @since 1.2
         * @param string $ip
         */
-       function setUserIP( $ip ) {
+       public function setUserIP( $ip ) {
                $this->user_text = $ip;
        }
 
        /**
+        * @since 1.21
         * @param string $model
         */
-       function setModel( $model ) {
+       public function setModel( $model ) {
                $this->model = $model;
        }
 
        /**
+        * @since 1.21
         * @param string $format
         */
-       function setFormat( $format ) {
+       public function setFormat( $format ) {
                $this->format = $format;
        }
 
        /**
+        * @since 1.2
         * @param string $text
         */
-       function setText( $text ) {
+       public function setText( $text ) {
                $this->text = $text;
        }
 
        /**
+        * @since 1.2.6
         * @param string $text
         */
-       function setComment( $text ) {
+       public function setComment( $text ) {
                $this->comment = $text;
        }
 
        /**
+        * @since 1.5.7
         * @param bool $minor
         */
-       function setMinor( $minor ) {
+       public function setMinor( $minor ) {
                $this->minor = (bool)$minor;
        }
 
        /**
+        * @since 1.12.2
         * @param mixed $src
         */
-       function setSrc( $src ) {
+       public function setSrc( $src ) {
                $this->src = $src;
        }
 
        /**
+        * @since 1.17
         * @param string $src
         * @param bool $isTemp
         */
-       function setFileSrc( $src, $isTemp ) {
+       public function setFileSrc( $src, $isTemp ) {
                $this->fileSrc = $src;
                $this->fileIsTemp = $isTemp;
+               $this->isTemp = $isTemp;
        }
 
        /**
+        * @since 1.17
         * @param string $sha1base36
         */
-       function setSha1Base36( $sha1base36 ) {
+       public function setSha1Base36( $sha1base36 ) {
                $this->sha1base36 = $sha1base36;
        }
 
        /**
+        * @since 1.12.2
         * @param string $filename
         */
-       function setFilename( $filename ) {
+       public function setFilename( $filename ) {
                $this->filename = $filename;
        }
 
        /**
+        * @since 1.17
         * @param string $archiveName
         */
-       function setArchiveName( $archiveName ) {
+       public function setArchiveName( $archiveName ) {
                $this->archiveName = $archiveName;
        }
 
        /**
+        * @since 1.12.2
         * @param int $size
         */
-       function setSize( $size ) {
+       public function setSize( $size ) {
                $this->size = intval( $size );
        }
 
        /**
+        * @since 1.12.2
         * @param string $type
         */
-       function setType( $type ) {
+       public function setType( $type ) {
                $this->type = $type;
        }
 
        /**
+        * @since 1.12.2
         * @param string $action
         */
-       function setAction( $action ) {
+       public function setAction( $action ) {
                $this->action = $action;
        }
 
        /**
+        * @since 1.12.2
         * @param array $params
         */
-       function setParams( $params ) {
+       public function setParams( $params ) {
                $this->params = $params;
        }
 
        /**
+        * @since 1.18
         * @param bool $noupdates
         */
        public function setNoUpdates( $noupdates ) {
@@ -279,51 +380,58 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2
         * @return Title
         */
-       function getTitle() {
+       public function getTitle() {
                return $this->title;
        }
 
        /**
+        * @since 1.6.4
         * @return int
         */
-       function getID() {
+       public function getID() {
                return $this->id;
        }
 
        /**
+        * @since 1.2
         * @return string
         */
-       function getTimestamp() {
+       public function getTimestamp() {
                return $this->timestamp;
        }
 
        /**
+        * @since 1.2
         * @return string
         */
-       function getUser() {
+       public function getUser() {
                return $this->user_text;
        }
 
        /**
+        * @since 1.27
         * @return User
         */
-       function getUserObj() {
+       public function getUserObj() {
                return $this->userObj;
        }
 
        /**
+        * @since 1.2
         * @return string
         */
-       function getText() {
+       public function getText() {
                return $this->text;
        }
 
        /**
+        * @since 1.24
         * @return ContentHandler
         */
-       function getContentHandler() {
+       public function getContentHandler() {
                if ( is_null( $this->contentHandler ) ) {
                        $this->contentHandler = ContentHandler::getForModelID( $this->getModel() );
                }
@@ -332,9 +440,10 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.21
         * @return Content
         */
-       function getContent() {
+       public function getContent() {
                if ( is_null( $this->content ) ) {
                        $handler = $this->getContentHandler();
                        $this->content = $handler->unserializeContent( $this->text, $this->getFormat() );
@@ -344,9 +453,10 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.21
         * @return string
         */
-       function getModel() {
+       public function getModel() {
                if ( is_null( $this->model ) ) {
                        $this->model = $this->getTitle()->getContentModel();
                }
@@ -355,9 +465,10 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.21
         * @return string
         */
-       function getFormat() {
+       public function getFormat() {
                if ( is_null( $this->format ) ) {
                        $this->format = $this->getContentHandler()->getDefaultFormat();
                }
@@ -366,30 +477,34 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2.6
         * @return string
         */
-       function getComment() {
+       public function getComment() {
                return $this->comment;
        }
 
        /**
+        * @since 1.5.7
         * @return bool
         */
-       function getMinor() {
+       public function getMinor() {
                return $this->minor;
        }
 
        /**
+        * @since 1.12.2
         * @return mixed
         */
-       function getSrc() {
+       public function getSrc() {
                return $this->src;
        }
 
        /**
+        * @since 1.17
         * @return bool|string
         */
-       function getSha1() {
+       public function getSha1() {
                if ( $this->sha1base36 ) {
                        return Wikimedia\base_convert( $this->sha1base36, 36, 16 );
                }
@@ -397,65 +512,74 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.17
         * @return string
         */
-       function getFileSrc() {
+       public function getFileSrc() {
                return $this->fileSrc;
        }
 
        /**
+        * @since 1.17
         * @return bool
         */
-       function isTempSrc() {
+       public function isTempSrc() {
                return $this->isTemp;
        }
 
        /**
+        * @since 1.12.2
         * @return mixed
         */
-       function getFilename() {
+       public function getFilename() {
                return $this->filename;
        }
 
        /**
+        * @since 1.17
         * @return string
         */
-       function getArchiveName() {
+       public function getArchiveName() {
                return $this->archiveName;
        }
 
        /**
+        * @since 1.12.2
         * @return mixed
         */
-       function getSize() {
+       public function getSize() {
                return $this->size;
        }
 
        /**
+        * @since 1.12.2
         * @return string
         */
-       function getType() {
+       public function getType() {
                return $this->type;
        }
 
        /**
+        * @since 1.12.2
         * @return string
         */
-       function getAction() {
+       public function getAction() {
                return $this->action;
        }
 
        /**
+        * @since 1.12.2
         * @return string
         */
-       function getParams() {
+       public function getParams() {
                return $this->params;
        }
 
        /**
+        * @since 1.4.1
         * @return bool
         */
-       function importOldRevision() {
+       public function importOldRevision() {
                $dbw = wfGetDB( DB_MASTER );
 
                # Sneak a single revision into place
@@ -554,7 +678,11 @@ class WikiRevision {
                return true;
        }
 
-       function importLogItem() {
+       /**
+        * @since 1.12.2
+        * @return bool
+        */
+       public function importLogItem() {
                $dbw = wfGetDB( DB_MASTER );
 
                $user = $this->getUserObj() ?: User::newFromName( $this->getUser() );
@@ -611,9 +739,10 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @return bool
         */
-       function importUpload() {
+       public function importUpload() {
                # Construct a file
                $archiveName = $this->getArchiveName();
                if ( $archiveName ) {
@@ -682,9 +811,10 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @return bool|string
         */
-       function downloadSource() {
+       public function downloadSource() {
                if ( !$this->config->get( 'EnableUploads' ) ) {
                        return false;
                }
index 0305535..6113573 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 use Wikimedia\Rdbms\LBFactorySingle;
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Base class for DBMS-specific installation helper classes.
index 6a8a99f..e5cbb7c 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  * @ingroup Deployment
  */
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 
 require_once __DIR__ . '/../../maintenance/Maintenance.php';
@@ -59,6 +61,11 @@ abstract class DatabaseUpdater {
         */
        protected $db;
 
+       /**
+        * @var Maintenance
+        */
+       protected $maintenance;
+
        protected $shared = false;
 
        /**
@@ -387,7 +394,7 @@ abstract class DatabaseUpdater {
         * Writes the schema updates desired to a file for the DB Admin to run.
         * @param array $schemaUpdate
         */
-       private function writeSchemaUpdateFile( $schemaUpdate = [] ) {
+       private function writeSchemaUpdateFile( array $schemaUpdate = [] ) {
                $updates = $this->updatesSkipped;
                $this->updatesSkipped = [];
 
@@ -420,7 +427,7 @@ abstract class DatabaseUpdater {
         *
         * @param array $what What updates to perform
         */
-       public function doUpdates( $what = [ 'core', 'extensions', 'stats' ] ) {
+       public function doUpdates( array $what = [ 'core', 'extensions', 'stats' ] ) {
                $this->db->setSchemaVars( $this->getSchemaVars() );
 
                $what = array_flip( $what );
@@ -485,7 +492,7 @@ abstract class DatabaseUpdater {
        public function updateRowExists( $key ) {
                $row = $this->db->selectRow(
                        'updatelog',
-                       # Bug 65813
+                       # T67813
                        '1 AS X',
                        [ 'ul_key' => $key ],
                        __METHOD__
@@ -919,11 +926,41 @@ abstract class DatabaseUpdater {
                } elseif ( $this->updateRowExists( $updateKey ) ) {
                        $this->output( "...$field in table $table already modified by patch $patch.\n" );
                } else {
-                       $this->insertUpdateRow( $updateKey );
+                       $apply = $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
+                       if ( $apply ) {
+                               $this->insertUpdateRow( $updateKey );
+                       }
+                       return $apply;
+               }
+               return true;
+       }
 
-                       return $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
+       /**
+        * Modify an existing table, similar to modifyField. Intended for changes that
+        *  touch more than one column on a table.
+        *
+        * @param string $table Name of the table to modify
+        * @param string $patch Name of the patch file to apply
+        * @param string $fullpath Whether to treat $patch path as relative or not, defaults to false
+        * @return bool False if this was skipped because of schema changes being skipped
+        */
+       public function modifyTable( $table, $patch,  $fullpath = false ) {
+               if ( !$this->doTable( $table ) ) {
+                       return true;
                }
 
+               $updateKey = "$table-$patch";
+               if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
+                       $this->output( "...$table table does not exist, skipping modify table patch.\n" );
+               } elseif ( $this->updateRowExists( $updateKey ) ) {
+                       $this->output( "...table $table already modified by patch $patch.\n" );
+               } else {
+                       $apply = $this->applyPatch( $patch, $fullpath, "Modifying table $table" );
+                       if ( $apply ) {
+                               $this->insertUpdateRow( $updateKey );
+                       }
+                       return $apply;
+               }
                return true;
        }
 
index 9c87cf0..7028224 100644 (file)
@@ -216,7 +216,7 @@ abstract class Installer {
                '_UpgradeKeySupplied' => false,
                '_ExistingDBSettings' => false,
 
-               // $wgLogo is probably wrong (bug 48084); set something that will work.
+               // $wgLogo is probably wrong (T50084); set something that will work.
                // Single quotes work fine here, as LocalSettingsGenerator outputs this unescaped.
                'wgLogo' => '$wgResourceBasePath/resources/assets/wiki.png',
                'wgAuthenticationTokenVersion' => 1,
@@ -446,6 +446,8 @@ abstract class Installer {
                $this->parserTitle = Title::newFromText( 'Installer' );
                $this->parserOptions = new ParserOptions( $wgUser ); // language will be wrong :(
                $this->parserOptions->setEditSection( false );
+               // Don't try to access DB before user language is initialised
+               $this->setParserLanguage( Language::factory( 'en' ) );
        }
 
        /**
@@ -674,7 +676,7 @@ abstract class Installer {
                try {
                        $out = $wgParser->parse( $text, $this->parserTitle, $this->parserOptions, $lineStart );
                        $html = $out->getText();
-               } catch ( DBAccessError $e ) {
+               } catch ( MediaWiki\Services\ServiceDisabledException $e ) {
                        $html = '<!--DB access attempted during parse-->  ' . htmlspecialchars( $text );
 
                        if ( !empty( $this->debug ) ) {
@@ -722,6 +724,7 @@ abstract class Installer {
                                'ss_good_articles' => 0,
                                'ss_total_pages' => 0,
                                'ss_users' => 0,
+                               'ss_active_users' => 0,
                                'ss_images' => 0
                        ],
                        __METHOD__, 'IGNORE'
@@ -1013,7 +1016,7 @@ abstract class Installer {
                }
 
                # Try the most common ones.
-               $commonLocales = [ 'en_US.UTF-8', 'en_US.utf8', 'de_DE.UTF-8', 'de_DE.utf8' ];
+               $commonLocales = [ 'C.UTF-8', 'en_US.UTF-8', 'en_US.utf8', 'de_DE.UTF-8', 'de_DE.utf8' ];
                foreach ( $commonLocales as $commonLocale ) {
                        if ( isset( $candidatesByLocale[$commonLocale] ) ) {
                                $this->setVar( 'wgShellLocale', $commonLocale );
@@ -1431,7 +1434,7 @@ abstract class Installer {
                        );
                }
                // Unset everyone else's hooks. Lord knows what someone might be doing
-               // in ParserFirstCallInit (see bug 27171)
+               // in ParserFirstCallInit (see T29171)
                $GLOBALS['wgHooks'] = [ 'LoadExtensionSchemaUpdates' => $hooksWeWant ];
 
                return Status::newGood();
index 697188e..a9710eb 100644 (file)
@@ -69,7 +69,7 @@ class LocalSettingsGenerator {
                        $db->getGlobalNames()
                );
 
-               $unescaped = [ 'wgRightsIcon', 'wgLogo' ];
+               $unescaped = [ 'wgRightsIcon', 'wgLogo', '_Caches' ];
                $boolItems = [
                        'wgEnableEmail', 'wgEnableUserEmail', 'wgEnotifUserTalk',
                        'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons',
@@ -241,7 +241,7 @@ class LocalSettingsGenerator {
                }
 
                if ( !$this->values['wgShellLocale'] ) {
-                       $this->values['wgShellLocale'] = 'en_US.UTF-8';
+                       $this->values['wgShellLocale'] = 'C.UTF-8';
                        $locale = '#';
                } else {
                        $locale = '';
index d6efeb2..43d3574 100644 (file)
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DBQueryError;
+use Wikimedia\Rdbms\DBConnectionError;
+
 /**
  * Class for setting up the MediaWiki database using Microsoft SQL Server.
  *
@@ -573,7 +577,7 @@ class MssqlInstaller extends DatabaseInstaller {
                                        $grantableNames[] = $dbUser;
                                } catch ( DBQueryError $dqe ) {
                                        $this->db->rollback();
-                                       $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getText() );
+                                       $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getMessage() );
                                }
                        } elseif ( !$this->userExists( $dbUser ) ) {
                                try {
@@ -584,7 +588,7 @@ class MssqlInstaller extends DatabaseInstaller {
                                        $grantableNames[] = $dbUser;
                                } catch ( DBQueryError $dqe ) {
                                        $this->db->rollback();
-                                       $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getText() );
+                                       $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getMessage() );
                                }
                        } else {
                                $status->warning( 'config-install-user-alreadyexists', $dbUser );
@@ -616,7 +620,7 @@ class MssqlInstaller extends DatabaseInstaller {
                                        $this->db->commit();
                                } catch ( DBQueryError $dqe ) {
                                        $this->db->rollback();
-                                       $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getText() );
+                                       $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getMessage() );
                                }
                                // Also try to grant SHOWPLAN on the db, but don't fail if we can't
                                // (just makes a couple things in mediawiki run slower since
@@ -642,7 +646,7 @@ class MssqlInstaller extends DatabaseInstaller {
                                $this->db->query( "CREATE FULLTEXT INDEX ON $searchindex (si_title, si_text) "
                                        . "KEY INDEX si_page ON $schema" );
                        } catch ( DBQueryError $dqe ) {
-                               $status->fatal( 'config-install-tables-failed', $dqe->getText() );
+                               $status->fatal( 'config-install-tables-failed', $dqe->getMessage() );
                        }
                }
 
index 968ee15..1a9915d 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\DatabaseMssql;
+
 /**
  * Class for setting up the MediaWiki database using Microsoft SQL Server.
  *
@@ -97,6 +99,8 @@ class MssqlUpdater extends DatabaseUpdater {
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
+                       [ 'dropIndex', 'oldimage', 'oi_name_archive_name',
+                               'patch-alter-table-oldimage.sql' ],
                ];
        }
 
@@ -110,7 +114,9 @@ class MssqlUpdater extends DatabaseUpdater {
 
        /**
         * General schema update for a table that touches more than one field or requires
-        * destructive actions (such as dropping and recreating the table).
+        * destructive actions (such as dropping and recreating the table). NOTE: Usage of
+        * this function is highly discouraged, use it's successor DatabaseUpdater::modifyTable
+        * instead.
         *
         * @param string $table
         * @param string $updatekey
@@ -123,9 +129,11 @@ class MssqlUpdater extends DatabaseUpdater {
                } elseif ( $this->updateRowExists( $updatekey ) ) {
                        $this->output( "...$table already had schema updated by $patch.\n" );
                } else {
-                       $this->insertUpdateRow( $updatekey );
-
-                       return $this->applyPatch( $patch, $fullpath, "Updating schema of table $table" );
+                       $apply = $this->applyPatch( $patch, $fullpath, "Updating schema of table $table" );
+                       if ( $apply ) {
+                               $this->insertUpdateRow( $updatekey );
+                       }
+                       return $apply;
                }
 
                return true;
index 7269773..cbb79f8 100644 (file)
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DBQueryError;
+use Wikimedia\Rdbms\DBConnectionError;
+
 /**
  * Class for setting up the MediaWiki database using MySQL.
  *
@@ -175,8 +179,8 @@ class MysqlInstaller extends DatabaseInstaller {
 
                # Determine existing default character set
                if ( $conn->tableExists( "revision", __METHOD__ ) ) {
-                       $revision = $conn->buildLike( $this->getVar( 'wgDBprefix' ) . 'revision' );
-                       $res = $conn->query( "SHOW TABLE STATUS $revision", __METHOD__ );
+                       $revision = $this->escapeLikeInternal( $this->getVar( 'wgDBprefix' ) . 'revision', '\\' );
+                       $res = $conn->query( "SHOW TABLE STATUS LIKE '$revision'", __METHOD__ );
                        $row = $conn->fetchObject( $res );
                        if ( !$row ) {
                                $this->parent->showMessage( 'config-show-table-status' );
@@ -217,6 +221,16 @@ class MysqlInstaller extends DatabaseInstaller {
                $wgDBpassword = $this->getVar( '_InstallPassword' );
        }
 
+       /**
+        * @param string $s
+        * @return string
+        */
+       protected function escapeLikeInternal( $s, $escapeChar = '`' ) {
+               return str_replace( [ $escapeChar, '%', '_' ],
+                       [ "{$escapeChar}{$escapeChar}", "{$escapeChar}%", "{$escapeChar}_" ],
+                       $s );
+       }
+
        /**
         * Get a list of storage engines that are available and supported
         *
@@ -570,7 +584,7 @@ class MysqlInstaller extends DatabaseInstaller {
                                                        // If we couldn't create for some bizzare reason and the
                                                        // user probably doesn't exist, skip the grant
                                                        $this->db->rollback( __METHOD__ );
-                                                       $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getText() );
+                                                       $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getMessage() );
                                                }
                                        }
                                } else {
@@ -590,7 +604,7 @@ class MysqlInstaller extends DatabaseInstaller {
                                $this->db->commit( __METHOD__ );
                        } catch ( DBQueryError $dqe ) {
                                $this->db->rollback( __METHOD__ );
-                               $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getText() );
+                               $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getMessage() );
                        }
                }
 
index 49bfac1..70e790c 100644 (file)
@@ -294,11 +294,13 @@ 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' ],
+                       [ 'addIndex', 'archive', 'usertext_timestamp', 'patch-rename-ar_usertext_timestamp.sql' ],
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
                        [ 'dropIndex', 'user_groups', 'ug_user_group', 'patch-user_groups-primary-key.sql' ],
                        [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
+                       [ 'addIndex', 'image', 'img_user_timestamp', 'patch-image-user-index-2.sql' ],
                ];
        }
 
@@ -824,7 +826,7 @@ class MysqlUpdater extends DatabaseUpdater {
        /**
         * Set page_random field to a random value where it is equals to 0.
         *
-        * @see bug 3946
+        * @see T5946
         */
        protected function doPageRandomUpdate() {
                $page = $this->db->tableName( 'page' );
index b8fc4e7..14683d6 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\DBConnectionError;
+
 /**
  * Class for setting up the MediaWiki database using Oracle.
  *
index 79ae175..e262eda 100644 (file)
@@ -285,7 +285,7 @@ class OracleUpdater extends DatabaseUpdater {
         *
         * @param array $what
         */
-       public function doUpdates( $what = [ 'core', 'extensions', 'purge', 'stats' ] ) {
+       public function doUpdates( array $what = [ 'core', 'extensions', 'purge', 'stats' ] ) {
                parent::doUpdates( $what );
 
                $this->db->query( 'BEGIN fill_wiki_info; END;' );
index 906768f..b501cb3 100644 (file)
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DBQueryError;
+use Wikimedia\Rdbms\DBConnectionError;
+
 /**
  * Class for setting up the MediaWiki database using Postgres.
  *
index e041fdd..39cb89c 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\DatabasePostgres;
+
 /**
  * Class for handling updates to Postgres databases.
  *
@@ -496,8 +498,8 @@ class PostgresUpdater extends DatabaseUpdater {
                $q = <<<END
 SELECT attname, attnum FROM pg_namespace, pg_class, pg_attribute
        WHERE pg_class.relnamespace = pg_namespace.oid
-         AND attrelid=pg_class.oid AND attnum > 0
-         AND relname=%s AND nspname=%s
+               AND attrelid=pg_class.oid AND attnum > 0
+               AND relname=%s AND nspname=%s
 END;
                $res = $this->db->query( sprintf( $q,
                        $this->db->addQuotes( $table ),
@@ -523,9 +525,9 @@ END;
                $q = <<<END
 SELECT indkey, indrelid FROM pg_namespace, pg_class, pg_index
        WHERE nspname=%s
-         AND pg_class.relnamespace = pg_namespace.oid
-         AND relname=%s
-         AND indexrelid=pg_class.oid
+               AND pg_class.relnamespace = pg_namespace.oid
+               AND relname=%s
+               AND indexrelid=pg_class.oid
 END;
                $res = $this->db->query(
                        sprintf(
@@ -551,8 +553,8 @@ END;
                        $query = <<<END
 SELECT attname FROM pg_class, pg_attribute
        WHERE attrelid=$relid
-         AND attnum=%d
-         AND attrelid=pg_class.oid
+               AND attnum=%d
+               AND attrelid=pg_class.oid
 END;
                        $r2 = $this->db->query( sprintf( $query, $rid ) );
                        if ( !$r2 ) {
@@ -572,8 +574,8 @@ END;
                $q = <<<END
 SELECT confdeltype FROM pg_constraint, pg_namespace
        WHERE connamespace=pg_namespace.oid
-         AND nspname=%s
-         AND conname=%s;
+               AND nspname=%s
+               AND conname=%s;
 END;
                $r = $this->db->query(
                        sprintf(
@@ -594,8 +596,8 @@ END;
                $q = <<<END
 SELECT definition FROM pg_rules
        WHERE schemaname = %s
-         AND tablename = %s
-         AND rulename = %s
+               AND tablename = %s
+               AND rulename = %s
 END;
                $r = $this->db->query(
                        sprintf(
@@ -981,10 +983,10 @@ END;
 
        protected function rebuildTextSearch() {
                if ( $this->updateRowExists( 'patch-textsearch_bug66650.sql' ) ) {
-                       $this->output( "...bug 66650 already fixed or not applicable.\n" );
+                       $this->output( "...T68650 already fixed or not applicable.\n" );
                        return;
                };
                $this->applyPatch( 'patch-textsearch_bug66650.sql', false,
-                       'Rebuilding text search for bug 66650' );
+                       'Rebuilding text search for T68650' );
        }
 }
index c5c4a7c..3943374 100644 (file)
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DatabaseSqlite;
+use Wikimedia\Rdbms\DBConnectionError;
+
 /**
  * Class for setting up the MediaWiki database using SQLLite.
  *
@@ -244,9 +248,9 @@ class SqliteInstaller extends DatabaseInstaller {
                        $sql =
 <<<EOT
        CREATE TABLE IF NOT EXISTS objectcache (
-         keyname BLOB NOT NULL default '' PRIMARY KEY,
-         value BLOB,
-         exptime TEXT
+               keyname BLOB NOT NULL default '' PRIMARY KEY,
+               value BLOB,
+               exptime TEXT
        )
 EOT;
                        $conn->query( $sql );
index cdbbfd0..9c90283 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use Wikimedia\Rdbms\DatabaseSqlite;
+
 /**
  * Class for handling updates to Sqlite databases.
  *
@@ -162,6 +164,7 @@ class SqliteUpdater extends DatabaseUpdater {
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
                        [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
+                       [ 'addIndex', 'image', 'img_user_timestamp', 'patch-image-user-index-2.sql' ],
                ];
        }
 
index c08212e..c94f0bf 100644 (file)
@@ -1083,7 +1083,7 @@ class WebInstaller extends Installer {
 
                foreach ( $varNames as $name ) {
                        $value = $this->request->getVal( $prefix . $name );
-                       // bug 30524, do not trim passwords
+                       // T32524, do not trim passwords
                        if ( stripos( $name, 'password' ) === false ) {
                                $value = trim( $value );
                        }
index e6deed5..81a107d 100644 (file)
@@ -251,7 +251,7 @@ class WebInstallerName extends WebInstallerPage {
                        $retVal = false;
                }
                // If they asked to subscribe to mediawiki-announce but didn't give
-               // an e-mail, show an error. Bug 29332
+               // an e-mail, show an error. T31332
                if ( !$email && $this->getVar( '_Subscribe' ) ) {
                        $this->parent->showError( 'config-subscribe-noemail' );
                        $retVal = false;
index 62fe785..e4eb255 100644 (file)
@@ -299,9 +299,9 @@ class WebInstallerOutput {
 
 <div id="mw-panel">
        <div class="portal" id="p-logo">
-         <a style="background-image: url(images/installer-logo.png);"
-               href="https://www.mediawiki.org/"
-               title="Main Page"></a>
+               <a style="background-image: url(images/installer-logo.png);"
+                       href="https://www.mediawiki.org/"
+                       title="Main Page"></a>
        </div>
 <?php
        $message = wfMessage( 'config-sidebar' )->plain();
index 2ab0554..3aad6f8 100644 (file)
@@ -92,7 +92,7 @@ abstract class WebInstallerPage {
                }
 
                if ( $continue ) {
-                       // Fake submit button for enter keypress (bug 26267)
+                       // Fake submit button for enter keypress (T28267)
                        // Messages: config-continue, config-restart, config-regenerate
                        $s .= Xml::submitButton(
                                wfMessage( "config-$continue" )->text(),
@@ -133,7 +133,7 @@ abstract class WebInstallerPage {
         * @return string
         */
        public function getName() {
-               return str_replace( 'WebInstaller', '', get_class( $this ) );
+               return str_replace( 'WebInstaller', '', static::class );
        }
 
        /**
index 72973e7..bf732a4 100644 (file)
@@ -67,7 +67,7 @@ class WebInstallerUpgrade extends WebInstallerPage {
 
                        if ( $result ) {
                                // If they're going to possibly regenerate LocalSettings, we
-                               // need to create the upgrade/secret keys. Bug 26481
+                               // need to create the upgrade/secret keys. T28481
                                if ( !$this->getVar( '_ExistingDBSettings' ) ) {
                                        $this->parent->generateKeys();
                                }
index 84c580f..8ba3cef 100644 (file)
@@ -52,6 +52,7 @@
        "config-restart": "نعم، إعادة التشغيل",
        "config-welcome": "=== التحقق من البيئة ===\nسوف يتم الآن التحقق من أن البيئة مناسبة لتنصيب ميديا ويكي.\nتذكر تضمين هذه المعلومات اذا اردت طلب المساعدة عن كيفية إكمال التنصيب.",
        "config-copyright": "=== حقوق النسخ والشروط ===\n\n$1\n\nهذا البرنامج هو برنامج حر؛ يمكنك إعادة توزيعه و/أو تعديله تحت شروط رخصة جنو العامة على أن هذا البرنامج قد نُشر من قِبل مؤسسة البرمجيات الحرة؛ إما النسخة 2 من الرخصة، أو أي نسخة أخرى بعدها (من إختيارك)\n\nتم توزيع هذا البرنامج على أمل ان يكون مفيدًا ولكن <strong> دون أية ضمانات</strong>؛ دون حتى أية ضمانات مفهومة ضمنيًا أو رواجات أو أية أسباب محددة.\nأنظر رخصة جنو العامة لمزيد من المعلومات.\n\nمن المفترض أنك إستملت <doclink href=Copying> نسخة عن رخصة جنو العامة </doclink> مع هذا البرنامج؛ اذا لم تقعل إكتب رسالة إلى مؤسسة البرمجيات الحرة المحدودة، شارع 51 فرانكلين الطابق الخامس، بوسطن  MA 02110-1301 الولايات المتخدة أو [http://www.gnu.org/copyleft/gpl.html read it online].",
+       "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": "جرى التحقق من البيئة. يمكنك تنصيب ميدياويكي.",
        "config-env-bad": "جرى التحقق من البيئة. لا يمكنك تنصيب ميدياويكي.",
        "config-env-php": "بي إتش بي $1 مثبت.",
        "config-optional-continue": "اسألني المزيد من الأسئلة",
        "config-optional-skip": "إنني أشعر بالملل بالفعل، فقط قم بتثبيت الويكي",
        "config-profile": "ملف صلاحيات المستخدم:",
-       "config-profile-wiki": "افتح ويكي",
+       "config-profile-wiki": "ويكي مفتوحة",
        "config-profile-no-anon": "إنشاء الحساب مطلوب",
        "config-profile-fishbowl": "المحررون المخولون فقط",
        "config-profile-private": "ويكي خاص",
        "config-email-watchlist": "تمكين إشعارات قائمة المراقبة",
        "config-email-watchlist-help": "السماح للمستخدمين بالحصول على إشعارات حول صفحاتهم المراقبة إذا كانوا قد مكنوها في تفضيلاتهم.",
        "config-email-auth": "تمكين مصادقة البريد الإلكتروني",
-       "config-email-sender": "يرجع عنوان البريد الإلكتروني:",
+       "config-email-sender": "عنوان البريد الإلكتروني المُرسِل:",
        "config-upload-settings": "الصور وتحميل الملفات",
        "config-upload-enable": "تمكين تحميل الملفات",
        "config-upload-deleted": "المجلد للملفات المحذوفة:",
        "config-cc-not-chosen": "اختر أي ترخيص تريده ثم اضغط على \"متابعة\".",
        "config-advanced-settings": "ضبط متقدم",
        "config-cache-options": "إعدادات التخزين المؤقت الكائن:",
-       "config-cache-none": "Ù\84ا Ù\8aÙ\88جد ØªØ®Ø²Ù\8aÙ\86 Ù\85ؤÙ\82ت (Ù\84Ù\85 ØªØªÙ\85 Ø¥Ø²Ø§Ù\84Ø© Ø£Ù\8aØ© Ù\88ظÙ\8aÙ\81Ø©Ø\8c Ù\84Ù\83Ù\86 Ù\82د ØªØªØ£Ø«Ø± Ø§Ù\84سرعة Ø¹Ù\84Ù\89 Ù\85Ù\88اÙ\82ع Ù\88Ù\8aÙ\83Ù\8a Ø£Ù\83بر)",
+       "config-cache-none": "Ù\84ا Ù\8aÙ\88جد ØªØ®Ø²Ù\8aÙ\86 Ù\85ؤÙ\82ت (Ù\87ذا Ù\84ا Ù\8aزÙ\8aÙ\84 Ø£Ù\8aØ© Ù\88ظÙ\8aÙ\81Ø©Ø\8c Ù\84Ù\83Ù\86 Ù\82د ØªØªØ£Ø«Ø± Ø§Ù\84سرعة Ø¹Ù\84Ù\89 Ù\85Ù\88اÙ\82ع Ø§Ù\84Ù\88Ù\8aÙ\83Ù\8a Ø§Ù\84Ù\83بÙ\8aرة)",
        "config-cache-accel": "كائن التخزين المؤقت PHP (APC أو APCu أو  XCache أو WinCache)",
+       "config-cache-memcached": "استخدم Memcached (يتطلب إعدادت إضافية)",
+       "config-memcached-servers": "خوادم Memcached:",
        "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-done": "تم بنجاح",
        "config-install-step-failed": "فشل",
        "config-install-extensions": "متضمنا الامتدادات",
        "config-install-database": "إنشاء قاعدة البيانات",
        "config-install-subscribe-fail": "غير قادر على الاشتراك في ميدياويكي-إعلان: $1",
        "config-install-subscribe-notpossible": "لم يتم تثبيت cURL و <code>allow_url_fopen</code> غير متوفر.",
        "config-install-mainpage": "إنشاء صفحة رئيسية بالمحتوى الافتراضي",
+       "config-install-mainpage-exists": "الصفحة الرئيسية موجودة بالفعل، تم تجاهل هذا الأمر",
        "config-install-extension-tables": "إنشاء جداول للامتدادات المفعلة",
        "config-install-mainpage-failed": "لم يتمكن من إدراج الصفحة الرئيسية: $1",
+       "config-install-done": "<strong>مبروك!</strong>\nلقد قمت بتثبيت ميدياوكي.\n\nقام المثبت بتوليد ملف <code>LocalSettings.php</code>.\nيحتوي هذا الملف على كل تضبيطاتك.\n\nسيتطلب تشغيل الويكي منك تنزيل هذا الملف ووضعه في مجلد التثبيت الخاص بالويكي (نفس المجلد المحتوي على <code>index.php</code>). سيبدأ التنزيل تلقائيا.\n\nلو لم يُعرض عليك التنزيل أو قمت أنت بالغائه، يمكنك تنزيله بالضغط على الوصلة أدناه:\n\n$3\n\n<strong>تنبيه:</strong> لو لم تقم بهذا الآن، لن يكن ملف الضبط متاحا لك لاحقا إذا غادرت التثبيت بدون تنزيله.\n\nعندما تنتهي من وضع الملف بمكانه، يمكنك <strong>[$2 دخول الويكي]</strong>.",
+       "config-install-done-path": "<strong>مبروك!</strong>\nلقد قمت بتثبيت ميدياوكي.\n\nقام المثبت بتوليد ملف <code>LocalSettings.php</code>.\nيحتوي هذا الملف على كل تضبيطاتك.\n\nسيتطلب تشغيل الويكي منك تنزيل هذا الملف ووضعه في <code>$4</code> (نفس المجلد المحتوي على index.php). سيبدأ التنزيل تلقائيا.\n\nلو لم يُعرض عليك التنزيل أو قمت أنت بالغائه، يمكنك تنزيله بالضغط على الوصلة أدناه:\n\n$3\n\n<strong>تنبيه:</strong> لو لم تقم بهذا الآن، لن يكن ملف الضبط متاحا لك لاحقا إذا غادرت التثبيت بدون تنزيله.\n\nعندما تنتهي من وضع الملف بمكانه، يمكنك <code>[$2 دخول الويكي]</strong>.",
        "config-download-localsettings": "تنزيل <code>LocalSettings.php</code>",
        "config-help": "مساعدة",
        "config-help-tooltip": "اضغط للتوسيع",
        "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\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 القائمة البريدية الخاصة بإصدار ميدياويكي]"
 }
index b950420..7a03c87 100644 (file)
@@ -90,6 +90,7 @@
        "config-db-name": "Име на базата от данни:",
        "config-db-name-help": "Избира се име, което да идентифицира уикито.\nТо не трябва да съдържа интервали.\n\nАко се използва споделен хостинг, доставчикът на услугата би трябвало да е предоставил или име на базата от данни, която да бъде използвана, или да позволява създаването на бази от данни чрез контролния панел.",
        "config-db-name-oracle": "Схема на базата от данни:",
+       "config-db-account-oracle-warn": "Има три поддържани сценария за инсталиране на Oracle като бекенд база данни:\n\nАко искате да създадете профил в базата данни като част от процеса на инсталиране, моля, посочете профил със SYSDBA като профил в базата данни за инсталиране и посочете желаните данни за влизане (име и парола) за профил с уеб достъп; в противен случай можете да създадете профил с уеб достъп ръчно и предоставите само него (ако той има необходимите права за създаване на схематични обекти), или да предоставите два различни профила - един с привилегии за създаване на обекти, и друг - с ограничения за уеб достъп.\n\nСкрипт за създаването на профил с необходимите привилегии може да се намери в папката \"maintenance/oracle/\" на тази инсталация. Имайте в предвид, че използването на ограничен профил ще деактивира всички възможности за обслужване на профила по подразбиране.",
        "config-db-install-account": "Потребителска сметка за инсталацията",
        "config-db-username": "Потребителско име за базата от данни:",
        "config-db-password": "Парола за базата от данни:",
        "config-db-web-account": "Сметка за уеб достъп до базата от данни",
        "config-db-web-help": "Избиране на потребителско име и парола, които уеб сървърът ще използва да се свързва с базата от данни при обичайната работа на уикито.",
        "config-db-web-account-same": "Използване на същата сметка като при инсталацията.",
-       "config-db-web-create": "Създаване на сметката ако все още не съществува",
+       "config-db-web-create": "Създаване на сметката, ако все още не съществува",
        "config-db-web-no-create-privs": "Посочената сметка за инсталацията не разполага с достатъчно права за създаване на нова сметка.\nНеобходимо е посочената сметка вече да съществува.",
        "config-mysql-engine": "Хранилище на данни:",
        "config-mysql-innodb": "InnoDB",
index 4a54501..f38c769 100644 (file)
@@ -15,7 +15,7 @@
        "config-localsettings-upgrade": "Kavet ez eus bet ur restr <code>LocalSettings.php</code>.\nEvit hizivaat ar staliadur-se, merkit an talvoud <code>$wgUpgradeKey</code> er voest dindan.\nE gavout a rit e <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Dinoet ez eus bet ur restr <code>LocalSettings.php</code>.\nEvit lakaat ar staliadur-mañ a-live, implijit <code>update.php</code> e plas",
        "config-localsettings-key": "Alc'hwez hizivaat :",
-       "config-localsettings-badkey": "Direizh eo an alc'hwez merket ganeoc'h",
+       "config-localsettings-badkey": "Direizh eo an alc'hwez hizivaat lakaet ganeoc'h.",
        "config-upgrade-key-missing": "Kavet ez eus bet ur staliadur kent eus MediaWiki.\nEvit hizivaat ar staliadur-se, ouzhpennit al linenn da-heul e traoñ ho restr <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Diglok e seblant bezañ ar restr <code>LocalSettings.php</code> zo anezhi dija.\nAn argemmenn $1 n'eo ket termenet.\nKemmit <code>LocalSettings.php</code> evit ma vo termenet an argemmenn-se, ha klikit war « {{int:Config-continue}} ».",
        "config-localsettings-connection-error": "C'hoarvezet ez eus ur fazi en ur gevreañ ouzh an diaz roadennoù oc'h implijout an arventennoù diferet e <code>LocalSettings.php</code>. Reizhit an arventennoù-se hag esaeit en-dro.\n\n$1",
        "config-env-php": "Staliet eo PHP $1.",
        "config-env-hhvm": "HHVM $1 zo staliet.",
        "config-unicode-using-intl": "Oc'h implijout [http://pecl.php.net/intl an astenn PECL intl] evit ar reolata Unicode.",
-       "config-unicode-pure-php-warning": "'''Diwallit''' : N'haller ket kaout an [http://pecl.php.net/intl intl PECL astenn] evit merañ reoladur Unicode, a zistro d'ar stumm gorrek emplementet e-PHP.\nMa lakait da dreiñ ul lec'hienn darempredet-stank e vo mat deoc'h lenn un tammig bihan diwar-benn se war [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization]. (e saozneg)",
+       "config-unicode-pure-php-warning": "<strong>Diwallit</strong> : N'haller ket ober gant an [http://pecl.php.net/intl intl astenn PECL] evit merañ reoladur Unicode; distreiñ d'ar stumm gorrek emplementet e PHP-rik.\nMa rit war-dro ul lec'hienn darempredet-stank e vo mat deoc'h lenn un tammig bihan diwar-benn se war [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations reolennadur Unicode].",
        "config-unicode-update-warning": "'''Diwallit''': ober a ra stumm staliet endalc'her skoueriekaat Unicode gant ur stumm kozh eus [http://site.icu-project.org/ levraoueg meziantoù ar raktres ICU].\nDleout a rafec'h [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations hizivaat] ma seblant deoc'h bezañ pouezus ober gant Unicode.",
-       "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo an diazoù roadennoù da-heul : $1.\n\nMa rit gant un herberc'hiañ kenrannet, goulennit digant ho herberc'hier staliañ ur sturier diaz roadennoù azas.\nMa kempunit PHP c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant <code>./configure --mysql</code>.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ ar vodulenn php5-mysql ivez.",
+       "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo {{PLURAL:$2|ar seurt|ar seurtoù}} diazoù roadennoù da-heul : $1.\n\nMard eo bet kempunet PHP ganeoc'h-c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant <code>/configure --with-mysqli</code>.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ, da skouer, ar pakad <code>php5-mysql</code> ivez.",
+       "config-outdated-sqlite": "<strong>Taolit pled :</strong> ober a rit gant SQLite $1, hag a zo izeloc'h eget ar stumm $2 ret bihanañ. Ne vo ket posupl ober gant SQLite.",
        "config-no-fts3": "'''Diwallit ''': Kempunet eo SQLite hep ar [//sqlite.org/fts3.html vodulenn FTS3]; ne vo ket posupl ober gant an arc'hwelioù klask er staliadur-mañ",
+       "config-pcre-old": "<strong>Fazo groñs :</strong> rekis eo ober gant PCRE $1 pe nevesoc'h.\nLiammet eo ho PHP binarel gant PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Gouzout hiroc'h].",
        "config-pcre-no-utf8": "'''Fazi groñs ''': evit doare eo bet kempunet modulenn PCRE PHP hep ar skor PCRE_UTF8.\nEzhomm en deus MediaWiki eus UTF-8 evit mont plaen en-dro.",
        "config-memory-raised": "<code>memory_limit</code> ar PHP zo $1, kemmet e $2.",
        "config-memory-bad": "'''Diwallit :''' Da $1 emañ arventenn <code>memory_limit</code> PHP.\nRe izel eo moarvat.\nMarteze e c'hwito ar staliadenn !",
        "config-xcache": "Staliet eo [http://xcache.lighttpd.net/ XCache]",
        "config-apc": "Staliet eo [http://www.php.net/apc APC]",
+       "config-apcu": "Staliet eo [http://www.php.net/apcu APCu]",
        "config-wincache": "Staliet eo [http://www.iis.net/download/WinCacheForPhp WinCache]",
+       "config-no-cache-apcu": "<strong>Taolit pled :</strong> N'eus ket bet gallet kavout [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] pe [http://www.iis.net/download/WinCacheForPhp WinCache].\nN'eo ket gweredekaet ar c'hrubuilhañ traezoù.",
+       "config-mod-security": "<strong>Taolit pled :</strong> Gweredekaet eo [http://modsecurity.org/ mod_security]/mod_security2 gant ho servijer web. Ma n'eo ket kfluniet mat e c'hall tegas trubuilhoù da MediaWiki ha meziantoù all a aotre implijerien da ouzhpennañ danvez evel ma karont.\nE kement ha m'eo posupl e tlefe bezañ diweredekaet. A-hend-all, sellit ouzh [http://modsecurity.org/documentation/ mod_security an teuliadur] pe kit e darempred gant skoazell ho herberc'hier m'en em gavit gant fazioù dargouezhek.",
        "config-diff3-bad": "N'eo ket bet kavet GNU diff3.",
+       "config-git": "Kavet eo bet ar meziant kontrolliñ adstummoù Git : <code>$1</code>.",
+       "config-git-bad": "N'eo ket bet kavet ar meziant kontrolliñ stummoù Git.",
        "config-imagemagick": "ImageMagick kavet : <code>$1</code>.\nGweredekaet e vo ar bihanaat skeudennoù ma vez gweredekaet ganeoc'h ar pellgargañ restroù.",
        "config-gd": "Kavet eo bet al levraoueg c'hrafek GD enframmet.\nGweredekaet e vo ar bihanaat skeudennoù ma vez gweredekaet an enporzhiañ restroù.",
        "config-no-scaling": "N'eus ket bet gallet kavout al levraoueg GD pe ImageMagick.\nDiweredekaet e vo ar bihanaat skeudennoù.",
        "config-no-uri": "'''Fazi :''' N'eus ket tu da anavezout URI ar skript red.\nStaliadur nullet.",
+       "config-no-cli-uri": "<strong>Diwallit :</strong> N'eus bet spisaet <code>--scriptpath</code> ebet, graet e vo, dre ziouer, gant : <code>$1</code>.",
        "config-using-server": "Oc'h implijout an anv servijer \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Oc'h implijout ar servijour URL \"<nowiki>$1$2</nowiki>\".",
        "config-uploads-not-safe": "'''Diwallit :'''Bresk eo ho kavlec'h pellgargañ dre ziouer <code>$1</code> rak gallout a ra erounit ne vern pe skript.\nha pa vefe gwiriet gant MediaWiki an holl restroù pellgarget eo erbedet-groñs da [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security serriñ ar breskter surentez-mañ] a-rao gweredekaat ar pellgargañ.",
+       "config-no-cli-uploads-check": "<strong>Diwallit :</strong> N'eo ket bet gwiriet ho kavlec'h enporzhiañ dre ziouer (<code>$1</code>) e-keñver breskted erounezadur skriptoù tidek e-pad staliadur CLI.",
        "config-brokenlibxml": "Ur meskad stummoù PHP ha libxml2 dreinek a vez implijet gant ho reizhiad. Gallout a ra breinañ ar roadennoù e MediaWiki hag en arloadoù web all.\nHizivait da libxml2 2.7.3 pe nevesoc'h ([https://bugs.php.net/bug.php?id=45996 draen renablet gant PHP]).\nStaliadur c'hwitet.",
+       "config-suhosin-max-value-length": "Staliet eo Suhosin ha bevennin a ra <code>hirder</code> an arventenn GET da $1 okted.\nParzh ResourceLoader Mediawiki a zoujo d'ar vevenn-se met se a zisteray ar varregezh. \nMa c'hallit e tlefec'h spisaat <code>suhosin.get.max_value_length</code> da 1024 pe uheloc'h e <code>php.ini</code>, ha merkañ <code>$wgResourceLoaderMaxQueryLength</code> gant an hevelep talvoud e <code>LocalSettings.php</code>.",
        "config-db-type": "Doare an diaz roadennoù :",
        "config-db-host": "Anv implijer an diaz roadennoù :",
        "config-db-host-help": "M'emañ ho servijer roadennoù war ur servijer disheñvel, merkit amañ anv an ostiz pe ar chomlec'h IP.\n\nMa rit gant un herberc'hiañ kenrannet, e tlefe ho herberc'hier bezañ pourchaset deoc'h an anv ostiz reizh en teulioù titouriñ.\n\nM'emaoc'h o staliañ ur servijer Windows ha ma rit gant MySQL, marteze ne'z aio ket en-dro \"localhost\" evel anv servijer. Ma ne dro ket, klaskit ober gant \"127.0.0.1\" da chomlec'h IP lechel.",
        "config-db-host-oracle": "TNS an diaz roadennoù :",
+       "config-db-host-oracle-help": "Merkit un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm anv kevreañ lec'hel] reizh; dleout a ra ur restr tnsnames.ora bezañ hewel e-pad ar staliadur.<br /> Ma rit gant al levraouegoù arval 10g pe nevesoc'h e c'hallit ivez ober gant an hentenn envel [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Anavezout ar wiki-mañ",
        "config-db-name": "Anv an diaz roadennoù :",
        "config-db-name-help": "Dibabit un anv evit ho wiki.\nNa lakait ket a esaouennoù ennañ.\n\nMa ri gant un herberc'hiañ kenrannet e vo pourchaset deoc'h un anv diaz roadennoù dibar da vezañ graet gantañ gant ho herberc'hier pe e lezo ac'hanoc'h da grouiñ diazoù roadennoù dre ur banell gontrolliñ.",
        "config-db-name-oracle": "Brastres diaz roadennoù :",
+       "config-db-account-oracle-warn": "Skoret ez eus tri doare evit staliañ Oracle da v/backend diaz roadennoù :\n\nMar fell deoc'h krouiñ ur gont diaz roadennoù e-ser an argerzh staliañ eo rekis pourchas ur gont gant ur roll SYSDBA evel kont diaz roadennoù evit ar staliañ, ha spisaat an titouroù anaout a fell deoc'h evit ar gont moned ouzh ar web. A-hend-all, e c'hallit krouiñ ar gont moned ouzh ar web gant an dorn ha pourchas hepken ar gont-se (ma'z eus bet ranket diskouez aotreoù ret evit krouiñ traezoù ar brastres) pe pourveziñ div gont disheñvel, unan gant dreistwirioù krouiñ hag eben, gant gwirioù strishaet, evit moned ouzh ar web.\n\nGallout a reer kaout ar skript evit kouiñ ur gont a zo rekis dreistwirioù eviti e kavlec'h \"trezalc'h/oracle/\" ar staliadur-mañ. Na zisoñjit ket e vo diweredekaet holl varregezhioù trezalc'h ar gont dre ziouer ma rit gant ur gont strishaet he gwirioù.",
        "config-db-install-account": "Kont implijer evit ar staliadur",
        "config-db-username": "Anv implijer an diaz roadennoù :",
        "config-db-password": "Ger-tremen an diaz roadennoù :",
        "config-db-install-help": "Merkañ anv an implijer hag ar ger-tremen a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad an argerzh staliañ.",
        "config-db-account-lock": "Implijout ar memes anv implijer ha ger-tremen e-kerzh oberiadurioù boutin",
        "config-db-wiki-account": "Kont implijer evit oberiadurioù boutin",
+       "config-db-wiki-help": "Merkañ an anv-implijer hag ar ger-tremen a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad oberiadurioù normal ar wiki.\nMa n'eus ket eus ar gont ha ma'z eus gwirioù a-walc'h gant ar gont staliañ, e vo krouet ar gont implijer-mañ gant al live gwirioù rekis izelañ evit gallout lakaat ar wiki da vont en-dro.",
        "config-db-prefix": "Rakrann taolennoù an diaz roadennoù :",
+       "config-db-prefix-help": "Mard eo ret deoc'h rannañ un diaz roadennoù gant meur a wiki, pe etre MediaWiki hag un arload benak all e c'hallit dibab ouzhpennañ ur rakger da holl anvioù an taolennoù kuit na vije tabutoù.\nArabat ober gant esaouennoù.\n\nPeurliesañ e vez laosket goullo ar vaezienn-mañ.",
        "config-mysql-old": "Rekis eo MySQL $1 pe ur stumm nevesoc'h; ober a rit gant $2.",
        "config-db-port": "Porzh an diaz roadennoù :",
        "config-db-schema": "Brastres evit MediaWiki",
        "config-db-schema-help": "Peurliesañ e vo digudenn ar chema-mañ.\nArabat cheñch anezho ma n'hoc'h eus ket ezhomm d'en ober.",
        "config-pg-test-error": "N'haller ket kevreañ ouzh an diaz-titouroù '''$1''' : $2",
        "config-sqlite-dir": "Kavlec'h roadennoù SQLite :",
+       "config-sqlite-dir-help": "Stokañ a ra SQLite an holl roadennoù en ur restr nemetken.\n\nE-pad ar staliañ, rankout a ra ar servijer web gallout skrivañ er c'havlec'h pourchaset ganeoc'h.\n\nNe zlefe <strong>ket</strong> bezañ tizhadus dre ar web; setu perak ne lakaomp ket anezhañ el lec'h m'emañ ho restroù PHP.\n\nSkivañ a raio ar stalier ur restr <code>.htaccess</code> war un dro gantañ met ma c'hoarvez ur fazi e c'hallfe unan bennak tapout krog en ho roadennoù.\nKement-se a sell ouzh ar roadennoù implijer (chomlec'hioù postel, gerioù-tremen hachet) hag ouzh an adweladennoù diverket ha takadoù gwarzeet all eus ar wiki.\n\nEn em soñjit ha ne vefe ket gwelloc'h lakaat an diaz roadennoù en un tu bennak all, da skouer e <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Esaouenn stokañ (\"tablespace\") dre ziouer :",
        "config-oracle-temp-ts": "Esaouenn stokañ (''tablespace'') da c'hortoz :",
        "config-type-mysql": "MySQL (pe kenglotus)",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "Skoret eo ar reizhiadoù diaz titouroù da-heul gant MediaWiki :\n\n$1\n\nMa ne welit ket amañ dindan ar reizhiad diaz titouroù a fell deoc'h ober ganti, heuilhit an titouroù a-us (s.o. al liammoù) evit gweredekaat ar skorañ.",
-       "config-dbsupport-mysql": "* $1 eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ ([http://www.php.net/manual/en/mysql.installation.php penaos kempunañ PHP gant skor MySQL])",
-       "config-dbsupport-postgres": "* Ur reizhiad diaz titouroù brudet ha digor eo $1. Gallout a ra ober evit MySQL ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL]). Gallout a ra bezañ un nebeud drein bihan enni ha n'eo ket erbedet he implijout en un endro produiñ.",
-       "config-dbsupport-sqlite": "* $1 zo ur reizhiad diaz titouroù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
-       "config-dbsupport-oracle": "* $1 zo un diaz titouroù kenwerzhel. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ. Mont a ra MediaWiki en-dro gant [{{int:version-db-mariadb-url}} MariaDB] ha [{{int:version-db-percona-url}} Percona Server] ivez, kenglotus o-daou gant MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Penaos kempunañ PHP gant skor MySQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] zo anezhi ur reizhiad diaz roadennoù frank a wirioù brudet-mat a c'haller ober gantañ e plas MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] zo anezhi ur reizhiad diaz roadennoù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
+       "config-dbsupport-oracle": "* Un embregerezh kenwerzhel diaz roadennoù eo [{{int:version-db-oracle-url}} Oracle]. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])",
+       "config-dbsupport-mssql": "* Un embregerezh kenwerzhel diaz roadennoù evit Windows eo [{{int:version-db-mssql-url}} Microsoft SQL Server]. ([http://www.php.net/manual/en/sqlsrv.installation.php Penaos kempunañ PHP gant skor SQLSRV])",
        "config-header-mysql": "Arventennoù MySQL",
        "config-header-postgres": "Arventennoù PostgreSQL",
        "config-header-sqlite": "Arventennoù SQLite",
        "config-missing-db-name": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-name}}\".",
        "config-missing-db-host": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-host}}\"",
        "config-missing-db-server-oracle": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-host-oracle}}\".",
-       "config-invalid-db-server-oracle": "Direizh eo anv TNS an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha pikoù (.).",
+       "config-invalid-db-server-oracle": "Direizh eo anv TNS an diaz roadennoù \"$1\".\nOber gant an neudennad \"TNS Name\" pe c'hoazh gant \"Easy Connect ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Hentennoù envel Oracle]).",
        "config-invalid-db-name": "Direizh eo anv an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).",
        "config-invalid-db-prefix": "Direizh eo rakger an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).",
        "config-connection-error": "$1.\n\nGwiriit anv an ostiz, an anv implijer, ar ger-tremen ha klaskit en-dro.",
        "config-postgres-old": "Rekis eo PostgreSQL $1 pe ur stumm nevesoc'h; ober a rit gant $2.",
        "config-mssql-old": "Stumm $1 Microsoft SQL Server, pe unan nevesoc'h, zo rekis. Ganeoc'h emañ ar stumm $2.",
        "config-sqlite-name-help": "Dibabit un anv dibar d'ho wiki.\nArabat ober gant esaouennoù pe barrennigoù-stagañ.\nImplijet e vo evit ar restr roadennoù SQLite.",
+       "config-sqlite-parent-unwritable-group": "N'haller ket krouiñ ar c'havlec'h roadennoù <code><nowiki>$1</nowiki></code> peogwir n'hall ket ar servijer Web skrivañ war ar c'havlec'h kar <code><nowiki>$2</nowiki></code>.\n\nKavet eo bet gant ar stalier an anv implijer m'eo oberiant ar servijer drezañ. Evit gallout kenderc'hel, lakait ar c'havlec'h <code><nowiki>$3</nowiki></code> da vezañ tizhus evit ar skrivañ.\nWar ur reizhiad Unix/Linux system ober :\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "N'haller ket krouiñ ar c'havlec'h roadennoù <code><nowiki>$1</nowiki></code> peogwir n'hall ket ar servijer Web skrivañ war ar c'havlec'h kar <code><nowiki>$2</nowiki></code>.\n\nN'eo ket bet ar servijer evit kavout anv an implijer ma tro ar servijer. Evit kenderc'hel, lakaat ar c'havlec'h <code><nowiki>$3</nowiki></code> da vezañ tizhus evit ar skrivañ dre vras.\nWar ur reizhiad Unix/Linux merkañ :\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-sqlite-mkdir-error": "Ur fazi zo bet e-ser krouiñ ar c'havlec'h roadennoù \"$1\".\nGwiriañ al lec'hiadur ha klask en-dro.",
        "config-sqlite-dir-unwritable": "Dibosupl skrivañ er c'havlec'h \"$1\".\nCheñchit ar aotreoù evit ma c'hallfe ar servijer web skrivañ ennañ ha klaskit en-dro.",
        "config-sqlite-connection-error": "$1.\n\nGwiriañ ar c'havlec'h roadennoù hag anv an diaz roadennoù a-is ha klaskit en-dro.",
        "config-sqlite-cant-create-db": "N'haller ket krouiñ restr an diaz roadennoù <code>$1</code>.",
        "config-sqlite-fts3-downgrade": "N'eo ket kenglotus ar PHP gant FTS3, o lakaat an taolennoù da glotañ gant ur stumm koshoc'h",
        "config-can-upgrade": "Taolennoù MediaWiki zo en diaz titouroù.\nDa hizivaat anezho da VediaWiki $1, klikañ war '''Kenderc'hel'''.",
+       "config-upgrade-done": "Hizivadenn bet kaset da benn vat.\n\nGallout a rit [$1 kregiñ da implijout ho wiki].\n\nMar fell deoc'h adc'henel ho restr <code>LocalSettings.php</code>, klikit war ar bouton dindan.\n<strong>N'eo ket un dra erbedet</strong> nemet ho pefe kudennoù gant ho wiki.",
        "config-upgrade-done-no-regenerate": "Hizivadenn kaset da benn.\n\nGallout a rit [$1 kregiñ da implijout ho wiki].",
        "config-regenerate": "Adgenel LocalSettings.php →",
        "config-show-table-status": "C'hwitet ar reked <code>SHOW TABLE STATUS</code> !",
        "config-mysql-engine": "Lusker stokañ :",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-myisam-dep": "<strong>Diwallit :</strong> Diuzet eo bet ganeoc'h MyISAM evel keflusker stokañ evit MySQL, ar pezh n'eo ket erbedet evit implijout gant MediaWiki, rak :\n* a-boan m'eo skoret gantañ ober meur a dra war un dro peogwir eo prennet an taolennoù\n* techetoc'h eo d'ar gwastoù eget kefluskerioù all\n* kod diazez MediaWiki n'eo ket atav embreget MyISAM gantañ evel m'eo dleet\n\nM'eo skoret InnoDB gant ho staliadur MySQL, ez eo kuzuliet c'hwek deoc'h dibab hennezh kentoc'h.\nMa n'eo ket skoret InnoDB gant ho staliadur MySQL, e c'hallfe bezañ poent deoc'h ober un hizivadenn.",
+       "config-mysql-only-myisam-dep": "<strong>Taolit evezh :</strong> MyISAM eo ar c'heflusker stokañ nemetañ a c'haller ober gantañ war ar mekanik-mañ evit MySQL, padal n'eo ket erbedet e implij gant MediaWiki, rak :\n* a-boan ma skor ar c'hevezerezh abalamour m'eo prennet an taolennoù\n* aesoc'h eo e wastañ eget kefluskerioù all\n* n'eo ket atav embreget MyIsam evel ma tlefe bezañ gant kod diazez MediaWiki\n\nN'eo ket skoret InnoDB gant ho staliadur MySQL. Poent eo hizivaat anezhañ marteze.",
+       "config-mysql-engine-help": "<strong>InnoDB</strong> eo an dibab gwellañ koulz lavaret atav, kemer a ra e kont ar monedoù kevezus.\n\n<strong>MyISAM</strong> a c'hall bezañ fonnusoc'h evit ar staliadurioù unpost pe ar re lenn hepken.\nDiazoù roadennoù MyISAM zo techet da vezañ gwastet aliesoc'h eget re InnoDB.",
        "config-mysql-charset": "Strobad arouezennoù an diaz roadennoù :",
        "config-mysql-binary": "Binarel",
        "config-mysql-utf8": "UTF-8",
+       "config-mysql-charset-help": "Er <strong>mod binarel</strong> eo stoket an destenn UTF-8 gant MediaWiki en diaz roadennoù e maeziennoù binarel.\nEfedusoc'h eo an dra-se eget mod UTF-8 MySQL; leuskel a ra ac'hanoc'h da implijout skalfad klok arouezennoù Unicode.\n\nEr <strong>mod UTF-8</strong>, MySQL a ouio anavezout ar rikoù arouezennoù emañ ho roadennoù ennañ hag e c'hallo o c'hinnig hag o amdreiñ en doare a zere met ne aotreo ket ac'hanoc'h da stokañ arouezennoù a-us d'ar [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Steuñv liesyezhek diazez] (e saozneg).",
        "config-mssql-auth": "Seut anaoudadur :",
+       "config-mssql-install-auth": "Diuzañ ar seurt dilesa a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad ar staliañ.\nMa tibabit \"{{int:config-mssql-windowsauth}}\", e vo implijet titouroù anaout an implijer a laka ar servijer da dreiñ.",
+       "config-mssql-web-auth": "Diuzañ ar seurt dilesa a vo implijet gant ar servijer web evit kevreañ ouzh diaz roadennoù ar servijer e-pad oberiadennoù boas ar wiki.\nMa tibabit \"{{int:config-mssql-windowsauth}}\", e vo implijet titouroù anaout an implijer a laka ar servijer da dreiñ.",
        "config-mssql-sqlauth": "Anaoudadur SQL Server",
        "config-mssql-windowsauth": "Anaoudadur Windows",
        "config-site-name": "Anv ar wiki :",
        "config-admin-error-user": "Fazi diabarzh en ur grouiñ ur merer gant an anv \"<nowiki>$1</nowiki>\".",
        "config-admin-error-password": "Fazi diabarzh o lakaat ur ger-tremen evit ar merour « <nowiki>$1</nowiki> » : <pre>$2</pre>",
        "config-admin-error-bademail": "Ebarzhet hoc'h eus ur chomlec'h postel direizh.",
-       "config-subscribe": "Koumanantit da [https://lists.wikimedia.org/mailman/listinfo/mediawiki-listenn kemennadoù evit ar stummoù nevez].",
+       "config-subscribe": "Koumanantit d'ar [https://lists.wikimedia.org/mailman/listinfo/mediawiki-roll kemennoù evit ar stummoù nevez].",
+       "config-pingback": "Rannañ roadennoù diwar-benn ar staliadur-mañ gant diorroerien Mediawiki.",
        "config-almost-done": "Kazi echu eo !\nGellout a rit tremen ar c'hefluniadur nevez ha staliañ ar wiki war-eeun.",
        "config-optional-continue": "Sevel muioc'h a goulennoù ouzhin.",
        "config-optional-skip": "Aet on skuizh, staliañ ar wiki hepken.",
        "config-license-cc-by": "Creative Commons Deroadenn",
        "config-license-cc-by-nc-sa": "Creative Commons Deroadenn Angenwerzhel Kenrannañ heñvel",
        "config-license-cc-0": "Creative Commons Zero (Domani foran)",
+       "config-license-gfdl": "Aotre implijout teuliadur frank GNU 1.3 pe nevesoc'h",
        "config-license-pd": "Domani foran",
        "config-license-cc-choose": "Dibabit un aotre-implijout Creative Commons personelaet",
        "config-email-settings": "Arventennoù ar postel",
        "config-email-user": "Gweredekaat ar posteloù a implijer da implijer",
        "config-email-user-help": "Aotren a ra an holl implijerien da gas posteloù an eil d'egile mard eo bet gweredekaet an arc'hwel ganto en ho penndibaboù.",
        "config-email-usertalk": "Gweredekaat kemennadur pajennoù kaozeal an implijerien",
-       "config-email-usertalk-help": "Talvezout a ra d'an implijerien da resev kemennadennoù ma vez kemmet o fajennoù kaozeal, ma vez gweredekaet en o fenndibaboù.",
+       "config-email-usertalk-help": "Talvezout a ra d'an implijerien da resev kemennoù ma vez kemmet o fajennoù kaozeal, gant ma vo gweredekaet en o fenndibaboù.",
        "config-email-watchlist": "Gweredekaat ar c'hemenn listenn evezhiañ",
-       "config-email-watchlist-help": "Talvezout a ra d'an implijerien da resev kemennadennoù diwar-benn ar pajennoù evezhiet ganto, ma vez gweredekaet en o fenndibaboù.",
+       "config-email-watchlist-help": "Talvezout a ra d'an implijerien da resev kemennoù diwar-benn ar pajennoù evezhiet ganto, gant ma vo gweredekaet en o fenndibaboù.",
        "config-email-auth": "Gweredekaat an dilesadur dre bostel",
        "config-email-sender": "Chomlec'h postel respont :",
        "config-email-sender-help": "Merkit ar chomlec'h postel da vezañ implijet da chomlec'h distreiñ ar posteloù a ya er-maez.\nDi e vo kaset ar posteloù distaolet.\nNiverus eo ar servijerioù postel a c'houlenn da nebeutañ un [http://fr.wikipedia.org/wiki/Nom_de_domaine anv domani] reizh.",
        "config-cc-not-chosen": "Dibabit an aotre-implijout Creative Commons a fell deoc'h ober gantañ ha klikit war \"proceed\".",
        "config-advanced-settings": "Kefluniadur araokaet",
        "config-cache-options": "Arventennoù evit krubuilhañ traezoù :",
-       "config-cache-accel": "Krubuilhañ traezoù PHP (APC, XCache pe WinCache)",
+       "config-cache-accel": "Krubuilhañ traezoù PHP (APC, APCu, XCache pe WinCache)",
        "config-cache-memcached": "Implijout Memcached (en deus ezhomm bezañ staliet ha kefluniet)",
        "config-memcached-servers": "Servijerioù Memcached :",
        "config-memcached-help": "Roll ar chomlec'hioù IP da implijout evit Memcached.\nRet eo spisaat unan dre linenn ha spisaat ar porzh da vezañ implijet. Da skouer :\n127.0.0.1:11211\n192.168.1.25:1234",
        "config-memcache-needservers": "Diuzet hoc'h eus Memcached evel seurt krubuilh met n'hoc'h eus spisaet servijer ebet.",
        "config-memcache-badip": "Ur chomlec'h IP direizh hoc'h eus lakaet evit Memcached : $1.",
+       "config-memcache-noport": "N'eus ket bet spisaet porzh ebet ganeoc'h evit servijer Memcached : $1.\nMa n'anavezit ket ar porzh, setu an hini dre ziouer : 11211.",
        "config-memcache-badport": "Niverennoù porzh Memcached a zlefe bezañ etre $1 ha $2.",
        "config-extensions": "Astennoù",
        "config-extensions-help": "N'eo ket bet detektet an astennoù rollet a-us en ho kavlec'h <code>./astennoù</code>.\n\nMarteze e vo ezhomm kefluniañ pelloc'h met gallout a rit o gweredekaat bremañ.",
        "config-skins": "Gwiskadurioù",
+       "config-skins-help": "Kavet eo bet ar gwiskadurioù renablet a-us en ho kavlec'h <code>./skins</code>. Ret eo deoc'h gweredekaat unan da nebeutañ, ha dibab an hini dre ziouer.",
        "config-skins-use-as-default": "Implijout ar gwiskadur-mañ dre ziouer",
+       "config-skins-missing": "N'eus bet kavet gwiskadur ebet : ober a raio MediaWiki gant unan dre ziouer betek ma vo staliet reoù a zegouezh.",
        "config-skins-must-enable-some": "Ret eo deoc'h dibab da nebautañ ur gwiskadur da weredekaat.",
        "config-skins-must-enable-default": "Ar gwiskadur dre ziouer dibabet a rank bezañ gweredekaet.",
        "config-install-alreadydone": "'''Diwallit''': Staliet hoc'h eus MediaWiki dija war a seblant hag emaoc'h o klask e staliañ c'hoazh.\nKit d'ar bajenn war-lerc'h, mar plij.",
        "config-install-user-missing": "N'eus ket eus an implijer \"$1\"",
        "config-install-user-missing-create": "N'eus ket eus an implijer \"$1\".\nMa fell deoc'h krouiñ anezhañ, klikit war ar voest \"krouiñ ur gont\" amañ dindan.",
        "config-install-tables": "Krouiñ taolennoù",
-       "config-install-tables-exist": "<strong>Kemenn :</strong> An taolennoù MediaWiki zo anezho dija war a seblant.\nN'eo ket bet graet ar grouidigezh.",
+       "config-install-tables-exist": "<strong>Diwallit :</strong> An taolennoù MediaWiki zo anezho dija war a seblant.\nN'int ket bet adkrouet.",
        "config-install-tables-failed": "'''Fazi :''' c'hwitet eo krouidigezh an daolenn gant ar fazi-mañ : $1",
        "config-install-interwiki": "O leuniañ dre ziouer an daolenn etrewiki",
        "config-install-interwiki-list": "Ne c'haller ket kavout ar restr <code>interwiki.list</code>.",
        "config-help": "skoazell",
        "config-help-tooltip": "klikañ evit astenn",
        "config-nofile": "N'eus ket bet gallet kavout ar restr \"$1\". Daoust ha dilamet eo bet ?",
-       "mainpagetext": "'''Meziant MediaWiki staliet.'''",
+       "mainpagetext": "<strong>Staliet eo bet MediaWiki.</strong>",
        "mainpagedocfooter": "Sellit ouzh [https://meta.wikimedia.org/wiki/Help:Contents Sturlevr an implijerien] evit gouzout hiroc'h war an doare da implijout ar meziant wiki.\n\n== Kregiñ ganti ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Roll an arventennoù kefluniañ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAG MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Roll ar c'haozeadennoù diwar-benn dasparzhoù MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lec'hiañ MediaWiki en ho yezh"
 }
index c122b2a..a8abcec 100644 (file)
@@ -9,44 +9,45 @@
                ]
        },
        "config-desc": "Instalacija za MediaWiki",
-       "config-title": "MediaWiki $1 instalacija",
+       "config-title": "Instalacija MediaWikija $1",
        "config-information": "Informacija",
-       "config-localsettings-upgrade": "Otkrivena je datoteka <code>LocalSettings.php</code>.\nDa biste unaprijedili vaš softver, molimo vas upišite vrijednost od <code>$wgUpgradeKey</code> u okvir ispod.\nNaći ćete ga u <code>LocalSettings.php</code>.",
-       "config-localsettings-cli-upgrade": "Datoteka <code>LocalSettings.php</code> file je otkrivena.\nZa nadogradnju ove instalacije, molimo da pokrenete <code>update.php</code> umjesto toga",
-       "config-localsettings-key": "Ključ za nadgradnju:",
-       "config-localsettings-badkey": "Ključ koji ste dali je pogrešan.",
-       "config-upgrade-key-missing": "Postojeća instalacije MediaWiki je pronađena.\nZa nadogradnju ove instalacije, molimo da stavite sljedeće liniju na dno vašeg <code>LocalSettings.php</code>:\n\n$1",
-       "config-localsettings-incomplete": "Postojeći <code>LocalSettings.php</code> se čini da je nepotpun.\nVarijabla $1 nije podešena.\nMolimo da zamjenite <code>LocalSettings.php</code> tako da je varijabla podešena, i kliknite \"{{int:Config-continue}}\".",
+       "config-localsettings-upgrade": "Otkrivena je datoteka <code>LocalSettings.php</code>.\nDa biste nadogradili instalaciju, upišite vrijednost od <code>$wgUpgradeKey</code> u okvir ispod.\nNaći ćete ga u <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Otkrivena je datoteka <code>LocalSettings.php</code>.\nDa biste nadogradili instalaciju, pokrenite <code>update.php</code> umjesto toga",
+       "config-localsettings-key": "Ključ za nadogradnju:",
+       "config-localsettings-badkey": "Ključ za nadogradnju koji ste naveli je pogrešan.",
+       "config-upgrade-key-missing": "Pronađena je postojeća instalacija MediaWikija.\nDa biste je nadogradili, umetnite sljedeći red na dno datoteke <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "Postojeća datoteka <code>LocalSettings.php</code> djeluje nepotpuna.\nNije postavljena varijabla $1.\nIzmijenite datoteku <code>LocalSettings.php</code> tako što ćete varijabli zadati vrijednost, pa kliknite na \"{{int:Config-continue}}\".",
        "config-session-error": "Greška pri pokretanju sesije: $1",
-       "config-no-session": "Vaši podaci sesije su izgubljeni!\nProvjerite vaš php.ini i provjerite da li je <code>session.save_path</code> postavljen na pravilni direktorijum.",
+       "config-no-session": "Vaši podaci o sesiji su izgubljeni!\nProvjerite je li <code>session.save_path</code> postavljen na pravilni direktorijum u php.ini.",
        "config-your-language": "Vaš jezik:",
-       "config-your-language-help": "Odaberite jezik koji ćete koristiti tokom procesa instalacije.",
-       "config-wiki-language": "Wiki jezik:",
-       "config-wiki-language-help": "Odaberite jezik na kojem će wiki biti najvećim dijelim pisana.",
+       "config-your-language-help": "Izaberite jezik koji želite koristiti tokom instalacije.",
+       "config-wiki-language": "Jezik wikija:",
+       "config-wiki-language-help": "Izaberite jezik na kojem će biti sadržaj wikija.",
        "config-back": "← Nazad",
        "config-continue": "Nastavi →",
        "config-page-language": "Jezik",
-       "config-page-welcome": "Dobrodošli u MediaWiki!",
-       "config-page-dbconnect": "Poveži sa bazom podataka",
-       "config-page-upgrade": "Unaprijedi postojeću instalaciju",
+       "config-page-welcome": "Dobro došli na MediaWiki!",
+       "config-page-dbconnect": "Povezivanje s bazom podataka",
+       "config-page-upgrade": "Nadogradnja postojeće instalacije",
        "config-page-dbsettings": "Postavke baze podataka",
        "config-page-name": "Naziv",
        "config-page-options": "Opcije",
        "config-page-install": "Instaliraj",
        "config-page-complete": "Završeno!",
-       "config-page-restart": "Ponovi instalaciju ispočetka",
+       "config-page-restart": "Ponovno pokretanje instalacije",
        "config-page-readme": "Pročitaj me",
-       "config-page-releasenotes": "Napomene izdanja",
-       "config-page-copying": "Kopiram",
-       "config-page-upgradedoc": "Nadograđujem",
+       "config-page-releasenotes": "Napomene o izdanju",
+       "config-page-copying": "Kopiranje",
+       "config-page-upgradedoc": "Nadogradnja",
        "config-page-existingwiki": "Postojeća wiki",
-       "config-help-restart": "Da li želite očistiti sve spremljene podatke koje ste unijeli i da započnete ponovo proces instalacije?",
+       "config-help-restart": "Želite li obrisati sve sačuvane podatke koje ste unijeli i ponovo pokrenuti instalaciju?",
        "config-restart": "Da, pokreni ponovo",
-       "config-sidebar": "* [https://www.mediawiki.org MediaWiki Početna strana]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodič za korisnike]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodič za administratore]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ NPP]\n----\n* <doclink href=Readme>Pročitaj me</doclink>\n* <doclink href=ReleaseNotes>Napomene izdanja</doclink>\n* <doclink href=Copying>Kopiranje</doclink>\n* <doclink href=UpgradeDoc>Poboljšavanje</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org Početna strana MediaWikija]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodič za korisnike]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodič za administratore]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ČPP]\n----\n* <doclink href=Readme>Pročitaj me</doclink>\n* <doclink href=ReleaseNotes>Napomene o izdanju</doclink>\n* <doclink href=Copying>Kopiranje</doclink>\n* <doclink href=UpgradeDoc>Nadogradnja</doclink>",
        "config-env-good": "Okruženje je provjereno.\nMožete instalirati MediaWiki.",
+       "config-env-bad": "Okruženje je provjereno.\nNe možete instalirati MediaWiki.",
        "config-env-php": "PHP $1 je instaliran.",
        "config-env-hhvm": "HHVM $1 je instaliran.",
-       "config-no-db": "Nije mogao biti pronađen pogodan driver za bazu podataka! Morate instalirati driver baze podataka za PHP.\nSljedeće vrste baza podataka {{PLURAL:$2|type is|types are}}su podržane: $1.\n\nAko se sami kompajlirali PHP, podesite ga sa omogućenim klijentom baze podataka, koristeći naprimjer, <code>./configure --with-mysqli</code>.\nAko ste instalirali PHP iz Debian ili Ubuntu paketa, tada morate instalirati, naprimjer, i paket <code>php5-mysql</code>.",
+       "config-no-db": "Ne mogu pronaći pogodan upravljački program za bazu podataka! Morate ga instalirati za PHP-bazu.\n{{PLURAL:$2|Podržana je sljedeća vrsta|Podržane su sljedeće vrste}} baze podataka: $1.\n\nAko se sami kompajlirali PHP, omogućite klijent baze podataka u postavkama koristeći, naprimjer, <code>./configure --with-mysqli</code>.\nAko ste instalirali PHP iz paketa za Debian ili Ubuntu, onda također morate instalirati, naprimjer, paket <code>php5-mysql</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] je instaliran",
        "config-apc": "[http://www.php.net/apc APC] je instaliran",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] je instaliran",
        "config-db-username": "Korisničko ime baze podataka:",
        "config-db-password": "Lozinka baze podataka:",
        "config-db-port": "Port baze podataka:",
-       "config-header-mysql": "Postavke MySQL",
-       "config-header-postgres": "Postavke PostgreSQL",
-       "config-header-sqlite": "Postavke SQLite",
-       "config-header-oracle": "Postavke Oracle",
-       "config-header-mssql": "Postavke za Microsoft SQL Server",
-       "config-invalid-db-type": "Invalidna vrsta baze podataka.",
+       "config-db-schema": "Šema za MediaWiki:",
+       "config-oracle-def-ts": "Predodređeni tabelarni prostor:",
+       "config-oracle-temp-ts": "Privremeni tabelarni prostor:",
+       "config-header-mysql": "Postavke MySQL-a",
+       "config-header-postgres": "Postavke PostgreSQL-a",
+       "config-header-sqlite": "Postavke SQLite-a",
+       "config-header-oracle": "Postavke Oraclea",
+       "config-header-mssql": "Postavke Microsoft SQL Servera",
+       "config-invalid-db-type": "Nevažeća vrsta baze podataka.",
        "config-missing-db-name": "Morate unijeti vrijednost za \"{{int:config-db-name}}\".",
-       "config-upgrade-done": "Nadogradnja završena.\n\nSada možete [$1 početi koristiti vašu wiki].\n\nAko želite regenerisati vašu datoteku <code>LocalSettings.php</code>, kliknite na dugme ispod.\nOvo '''nije preporučeno''' osim ako nemate problema s vašom wiki.",
+       "config-missing-db-host": "Morate unijeti vrijednost za \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "Morate unijeti vrijednost za \"{{int:config-db-host-oracle}}\".",
+       "config-sqlite-readonly": "Datoteka <code>$1</code> nije zapisiva.",
+       "config-sqlite-fts3-downgrade": "PHP ne podržava FTS3, poništavam nadogradnju tabela.",
+       "config-upgrade-done": "Nadogradnja završena.\n\nSada možete [$1 početi koristiti Vaš wiki].\n\nAko želite regenerirati Vašu datoteku <code>LocalSettings.php</code>, kliknite na dugme ispod.\nOvo <strong>nije preporučeno</strong> osim ako nemate problema s Vašim wikijem.",
+       "config-upgrade-done-no-regenerate": "Nadogradnja završena.\n\nSad možete [$1 početi da koristite svoj wiki].",
+       "config-regenerate": "Regeneriraj LocalSettings.php →",
+       "config-unknown-collation": "<strong>Upozorenje:</strong> Baza podataka koristi nepoznatu kolaciju.",
+       "config-db-web-account": "Račun baze podataka za mrežni pristup",
+       "config-db-web-create": "Napravi račun ako već ne postoji",
+       "config-mysql-engine": "Skladišni pogon:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-binary": "Binarni",
-       "config-site-name": "Ime wiki:",
+       "config-mysql-utf8": "UTF-8",
+       "config-mssql-auth": "Vrsta autentifikacije:",
+       "config-site-name": "Ime wikija:",
+       "config-site-name-blank": "Upišite ime sajta.",
+       "config-project-namespace": "Imenski prostor projekta:",
+       "config-ns-generic": "Projekt",
+       "config-ns-other": "Drugo (navedite)",
        "config-ns-other-default": "MyWiki",
+       "config-admin-box": "Administratorski račun",
        "config-admin-name": "Vaše korisničko ime:",
        "config-admin-password": "Lozinka:",
-       "config-admin-password-confirm": "Ponovno unesite lozinku:",
+       "config-admin-password-confirm": "Ponovo unesite lozinku:",
+       "config-admin-help": "Ovdje upišite željeno korisničko ime; naprimjer, \"Petar Petrović\".\nOvo ćete ime koristiti za prijavu na wiki.",
+       "config-admin-name-blank": "Upišite administratorsko korisničko ime.",
+       "config-admin-name-invalid": "Navedeno korisničko ime \"<nowiki>$1</nowiki>\" nije ispravno.\nNavedite drugo.",
+       "config-admin-password-blank": "Upišite lozinku za administratorski račun.",
+       "config-admin-password-mismatch": "Lozinke koje ste upisali se ne poklapaju.",
        "config-admin-email": "Adresa e-pošte:",
-       "config-profile-wiki": "Otvori wiki",
-       "config-profile-private": "Privatna wiki",
+       "config-admin-error-bademail": "Upisali ste neispravnu adresu e-pošte.",
+       "config-optional-skip": "Već mi je dosadilo, daj samo instaliraj wiki.",
+       "config-profile-wiki": "Otvoren wiki",
+       "config-profile-private": "Privatni wiki",
+       "config-license": "Autorska prava i licenca:",
+       "config-license-none": "Bez podnožja za licencu",
        "config-license-pd": "Javno vlasništvo",
-       "config-logo": "Logo URL:",
-       "config-cc-again": "Odaberi ponovno...",
+       "config-logo": "URL logotipa:",
+       "config-cc-again": "Izaberite ponovo...",
+       "config-advanced-settings": "Napredna konfiguracija",
+       "config-extensions": "Proširenja",
        "config-skins": "Teme",
+       "config-install-alreadydone": "<strong>Upozorenje:</strong> Izgleda da već imate instaliran MediaWiki i da ga ponovo pokušavate instalirati.\nIdite na sljedeću stranicu.",
        "config-install-step-done": "završeno",
        "config-install-step-failed": "neuspješno",
-       "config-install-extensions": "Uključujući ekstenzije",
-       "config-install-tables": "Kreiranje tabela",
+       "config-install-extensions": "Uključujem proširenja",
+       "config-install-database": "Postavljam bazu podataka",
+       "config-install-schema": "Pravim šemu",
+       "config-install-user": "Pravim korisnika baze podataka",
+       "config-install-user-alreadyexists": "Korisnik \"$1\" već postoji",
+       "config-install-user-missing": "Navedeni korisnik \"$1\" ne postoji.",
+       "config-install-tables": "Pravim tabele",
+       "config-install-interwiki": "Popunjavam predodređenu međuprojektnu tabelu",
+       "config-install-stats": "Pokrećem statistiku",
+       "config-install-keys": "Stvaram tajne ključeve",
+       "config-install-sysop": "Pravim administratorski korisnički račun",
+       "config-install-mainpage": "Pravim početnu stranicu sa standardnim sadržajem",
+       "config-download-localsettings": "Preuzmi <code>LocalSettings.php</code>",
        "config-help": "pomoć",
-       "config-help-tooltip": "klikni za proširenje",
-       "mainpagetext": "'''MediaWiki softver je uspješno instaliran.'''",
-       "mainpagedocfooter": "Kontaktirajte [https://meta.wikimedia.org/wiki/Help:Sadržaj uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista postavki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]"
+       "config-help-tooltip": "kliknite da proširite",
+       "config-nofile": "Datoteka \"$1\" nije pronađena. Da nije obrisana?",
+       "mainpagetext": "<strong>MediaWiki je instaliran.</strong>",
+       "mainpagedocfooter": "Pogledajte [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents korisnički vodič] za uputstva o upotrebi wiki softvera.\n\n== Prvi koraci ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Spisak postavki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Često postavljana pitanja o MediaWikiju]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Dopisna lista o izdanjima MediaWikija]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalizirajte MediaWiki za svoj jezik]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Naučite kako se boriti protiv neželjenog sadržaja na svom wikiju]"
 }
index 559e7dd..c86b824 100644 (file)
@@ -62,6 +62,7 @@
        "config-memory-bad": "<strong>Avís:</strong> El <code>memory_limit</code> del PHP és $1.\nAixò és probablement massa baix.\nLa instal·lació pot fallar!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] està instal·lat",
        "config-apc": "L’[http://www.php.net/apc APC] està instal·lat",
+       "config-apcu": "[http://www.php.net/apcu APCu] està instal·lat",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] està instal·lat",
        "config-diff3-bad": "No s'ha trobat el GNU diff3.",
        "config-git": "S'ha trobat el programari de control de versions Git: <code>$1</code>.",
        "config-cache-options": "Configuració per a la memòria cau dels objectes:",
        "config-cache-help": "L'encauament d'objectes s'utilitza per a millorar la rapidesa del MediaWiki afegint a la memòria cau les dades que s'utilitzen de forma freqüent. És recomanable que els llocs web mitjans o grans ho habilitin. També els llocs web petits en veuran els beneficis.",
        "config-cache-none": "Sense encauament (no se suprimeix cap funcionalitat, però la velocitat pot veure's afectada en els llocs wiki més grans)",
+       "config-cache-accel": "Emmagatzemament en memòria cau d'objectes de PHP (APC, APCu, XCache o WinCache)",
        "config-cache-memcached": "Utilitza Memcached (requereix una instal·lació i configuració addicionals)",
        "config-memcached-servers": "Servidors de Memcache:",
        "config-memcache-badip": "Heu introduït una adreça IP no vàlida per al Memcached: $1.",
        "config-memcache-badport": "Els números de port de Memcached han de ser entre $1 i $2.",
        "config-extensions": "Extensions",
        "config-skins": "Aparences",
+       "config-skins-help": "S'han detectat els temes llistats a dalt en el directori <code>./skins</code>. Heu d'habilitar-ne com a mínim un i trieu-ne el predeterminat.",
        "config-skins-use-as-default": "Utilitza aquest tema per defecte",
        "config-skins-missing": "No s'ha trobat cap tema; MediaWiki utilitzarà el tema per defecte fins que hi instal·leu alguns adequats.",
        "config-skins-must-enable-some": "Heu de triar com a mínim un tema per habilitar.",
        "config-skins-must-enable-default": "Cal habilitar el tema triat per defecte.",
+       "config-install-alreadydone": "<strong>Avís:</strong> Sembla que ja havíeu instal·lat MediaWiki i esteu provant d'instal·lar-lo de nou.\nProcediu a la pàgina següent.",
        "config-install-begin": "En fer clic a «{{int:config-continue}}» s’iniciarà la instal·lació del MediaWiki. Si encara voleu fer canvis, feu clic a «{{int:config-back}}».",
        "config-install-step-done": "fet",
        "config-install-step-failed": "ha fallat",
        "config-help": "ajuda",
        "config-help-tooltip": "feu clic per ampliar",
        "config-nofile": "No s'ha pogut trobar el fitxer «$1». S'ha suprimit?",
+       "config-extension-link": "Sabíeu que el vostre wiki permet l'ús d'[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nPodeu navegar les [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions per categoria] o la [https://www.mediawiki.org/wiki/Extension_Matrix matriu d'extensions] per a veure'n una llista sencera.",
        "mainpagetext": "<strong>MediaWiki s'ha instal·lat.</strong>",
-       "mainpagedocfooter": "Consulteu la [https://meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar-lo.\n\n== Per a començar ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de característiques configurables]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ PMF del MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu (''listserv'') per a anuncis del MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traduïu MediaWiki en la vostra llengua]"
+       "mainpagedocfooter": "Consulteu la [https://meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar aquest programari wiki.\n\n== Primers passos ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de paràmetres configurables]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ PMF del MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu per a anuncis del MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducció de MediaWiki en la vostra llengua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprengueu com combatre la brossa que pot atacar el vostre wiki]"
 }
index 583b80c..3bfa8a6 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Asoxor",
                        "Calak",
-                       "Muhammed taha"
+                       "Muhammed taha",
+                       "Lost Whispers"
                ]
        },
        "config-desc": "دامەزرێنەرەکە بۆ میدیاویکی",
@@ -44,6 +45,8 @@
        "config-admin-password": "تێپەڕوشە:",
        "config-admin-password-confirm": "دووبارە تێپەڕوشە:",
        "config-admin-email": "ناونیشانی ئیمەیل:",
+       "config-admin-email-help": "ناونیشانی ئیمەیڵەکەت لێرەدا دابنێ بۆئەوەی بتوانیت ئیمەیڵت لە بەکارھێنەرانی ترەوە پێ بگات، تێپەڕ وشە ڕێک بخەیتەوە و ئاگادار بکرێیتەوە لەو گۆڕانکاریانەی کە لەو پەڕانەدا دەکرێن کە چاودێرییان دەکەیت. دەتوانیت ئەم بۆشاییە بە بەتاڵی جێبھێڵیت.",
+       "config-admin-error-bademail": "تۆ ناونیشانی ئیمەیڵێکی ھەڵەت داخڵ کردووە.",
        "config-profile-wiki": "ویکیی کراوە",
        "config-profile-no-anon": "دروستکردنی ھەژمارە پێویستە",
        "config-profile-fishbowl": "تەنھا دەستکاریکەری ڕێگەپێدراوە",
index 8c4914c..6ed903c 100644 (file)
@@ -45,7 +45,7 @@
        "config-localsettings-badkey": "La clave de actualización proporcionada es incorrecta.",
        "config-upgrade-key-missing": "Se ha detectado una instalación existente de MediaWiki.\nPara actualizar la instalación, añade la siguiente línea al final de tu  <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "El archivo <code>LocalSettings.php</code> existente parece estar incompleto.\nLa variable $1 no está definida.\nCambia <code>LocalSettings.php</code> para que esta variable quede establecida y haz clic en \"{{int:Config-continue}}\".",
-       "config-localsettings-connection-error": "Se ha producido un error al conectar a la base de datos utilizando la configuración especificada en <code>LocalSettings.php</code>. Corrige estos ajustes e inténtalo de nuevo.\n\n$1",
+       "config-localsettings-connection-error": "Se ha producido un error al conectar con la base de datos a través de la configuración especificada en <code>LocalSettings.php</code>. Corrige estos ajustes e inténtalo de nuevo.\n\n$1",
        "config-session-error": "Error al iniciar la sesión: $1",
        "config-session-expired": "Tus datos de sesión parecen haber expirado.\nLas sesiones están configuradas por una duración de $1.\nPuedes incrementar esto configurando <code>session.gc_maxlifetime</code> en php.ini.\nReiniciar el proceso de instalación.",
        "config-no-session": "Se han perdido los datos de sesión.\nVerifica tu php.ini y comprueba que <code>session.save_path</code> está establecido en un directorio apropiado.",
@@ -57,7 +57,7 @@
        "config-continue": "Continuar →",
        "config-page-language": "Idioma",
        "config-page-welcome": "Te damos la bienvenida a MediaWiki.",
-       "config-page-dbconnect": "Conectar a la base de datos",
+       "config-page-dbconnect": "Conectar con la base de datos",
        "config-page-upgrade": "Actualizar instalación existente",
        "config-page-dbsettings": "Configuración de la base de datos",
        "config-page-name": "Nombre",
        "config-db-port": "Puerto de la base de datos:",
        "config-db-schema": "Esquema para MediaWiki",
        "config-db-schema-help": "Este esquema usualmente estará bien.\nCámbialos solo si lo necesitas.",
-       "config-pg-test-error": "No se puede conectar a la base de datos <strong>$1</strong>: $2",
+       "config-pg-test-error": "No se puede conectar con la base de datos <strong>$1</strong>: $2",
        "config-sqlite-dir": "Directorio de datos SQLite:",
        "config-sqlite-dir-help": "SQLite almacena todos los datos en un único archivo.\n\nEl directorio que proporciones debe poder escribirse por el servidor web durante la instalación.\n\n'''No''' debería ser accesible a través de Internet. Por eso no vamos a ponerlo en el sitio donde están los archivos PHP.\n\nEl instalador escribirá un archivo <code>.htaccess</code> junto con él, pero si falla alguien podría tener acceso a la base de datos en bloque.\nEso incluye los datos de usuario en bloque (direcciones de correo electrónico, las contraseñas con hash) así como revisiones eliminadas y otros datos restringidos del wiki.\n\nConsidera poner la base de datos en algún otro sitio, por ejemplo en <code>/var/lib/mediawiki/tuwiki</code> .",
        "config-oracle-def-ts": "Espacio de tablas predeterminado:",
        "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-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es un sistema comercial de base de datos empresariales para Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Cómo compilar PHP con compatibilidad con SQLSRV])",
        "config-header-mysql": "Configuración de MySQL",
        "config-header-postgres": "Configuración de PostgreSQL",
        "config-header-sqlite": "Configuración de SQLite",
index 7690b01..430345e 100644 (file)
        "config-env-hhvm": "HHVM $1 instalatuta dago.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalatuta dago",
        "config-apc": "[http://www.php.net/apc APC] instalatuta dago",
+       "config-apcu": "[http://www.php.net/apcu APCu] instalatuta dago",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalatuta dago",
        "config-diff3-bad": "GNU diff3 ez da aurkitu.",
+       "config-using-server": "\"<nowiki>$1</nowiki>\" zerbitzari-izena erabiltzen.",
+       "config-using-uri": "\"<nowiki>$1$2</nowiki>\" zerbitzariaren URLa erabiltzen.",
        "config-db-type": "Datu-base mota:",
        "config-db-host": "Datu-basearen zerbitzaria:",
        "config-db-host-oracle": "Datu-baseko TNS:",
@@ -64,6 +67,8 @@
        "config-header-mssql": "Microsoft SQL Server-en ezarpenak",
        "config-invalid-db-type": "Datu-base mota baliogabea.",
        "config-db-sys-user-exists-oracle": "$1 erabiltzaile kontua dagoeneko existitzen da. SYSDBA kontu berri bat sortzeko erabili daiteke soilik!",
+       "config-sqlite-readonly": "Ezin da idatzi <code>$1</code> fitxategian.",
+       "config-regenerate": "Birsortu LocalSettings.php →",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-binary": "Bitarra",
        "config-download-localsettings": "Jaitsi <code>LocalSettings.php</code>",
        "config-help": "Laguntza",
        "config-help-tooltip": "sakatu zabaltzeko",
+       "config-nofile": "Ezin da \"$1\" fitxategia aurkitu. Ezabatua izan 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 5275548..6282ca1 100644 (file)
@@ -68,7 +68,7 @@
        "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-pcre-no-utf8": "'''مخرب:''' به‌ نظر می‌رسد ماژول پی‌سی‌آرایی پی‌اچ‌پی بدون پشتیبانی پی‌سی‌آرایی_یو‌تی‌اف۸ تهیه شده‌است.\nمدیاویکی برای درست عمل کردن نیازمند پشتیبانی یوتی‌اف-۸ است.",
+       "config-pcre-no-utf8": "<strong>مخرب:</strong> به‌ نظر می‌رسد پودمان پی‌سی‌آراییِ پی‌اچ‌پی بدون پشتیبانی پی‌سی‌آرایی_یو‌تی‌اف۸ تهیه شده‌است.\nمدیاویکی برای درست عمل کردن نیازمند پشتیبانی یوتی‌اف-۸ است.",
        "config-memory-raised": "PHP's <code>memory_limit</code>, نسخهٔ $1 است، به نسخهٔ $2 ارتقاء داده شده‌است.",
        "config-memory-bad": "'''هشدار:''' PHP's <code>memory_limit</code> نسخهٔ $1 است.\nاین ممکن است خیلی پایین باشد.\nممکن است نصب با مشکل رو‌به‌رو شود.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب شده‌است.",
        "config-install-subscribe-fail": "قادر تصدیق اعلام مدیاویکی نیست:$1",
        "config-install-subscribe-notpossible": "سی‌یوآر‌ال نصب نشده‌است و <code>allow_url_fopen</code> در دسترس نیست.",
        "config-install-mainpage": "ایجاد صفحهٔ اصلی با محتوای پیش‌فرض",
+       "config-install-mainpage-exists": "صفحهٔ اصلی موجود است، رها شد",
        "config-install-extension-tables": "ایجاد جداول برای افزونه‌های فعال",
        "config-install-mainpage-failed": "قادر به درج صفحهٔ اصلی نمی‌باشد:$1",
        "config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصب‌کننده پرونده <code>LocalSettings.php</code> را درست کرد.\nکه شامل تمام تنظیمات می‌باشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما می‌توانید '''[$2 وارد ویکی شوید]'''.",
        "config-nofile": "پروندهٔ «$1» یافت نشد. آیا حذف شده‌است؟",
        "config-extension-link": "آیا می‌دانستید که ویکی شما [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category]",
        "mainpagetext": "'''مدیاویکی با موفقیت نصب شد.'''",
-       "mainpagedocfooter": "از [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents]\nبرای اطلاعات بیشتر در مورد به‌کارگیری نرم‌افزار ویکی استفاده کنید.\n\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== آغاز به کار ==\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 953d427..293a153 100644 (file)
        "config-sqlite-connection-error": "$1.\n\nVérifier le répertoire des données et le nom de la base de données ci-dessous et réessayer.",
        "config-sqlite-readonly": "Le fichier <code>$1</code> n'est pas accessible en écriture.",
        "config-sqlite-cant-create-db": "Impossible de créer le fichier de base de données <code>$1</code>.",
-       "config-sqlite-fts3-downgrade": "PHP n'a pas trouvé le support FTS3, les tables sont restreintes.",
+       "config-sqlite-fts3-downgrade": "PHP n’a pas trouvé la prise en charge FTS3, les tables sont restreintes.",
        "config-can-upgrade": "Il y a des tables MediaWiki dans cette base de données.\nPour les mettre au niveau de MediaWiki $1, cliquez sur '''Continuer'''.",
        "config-upgrade-done": "Mise à jour terminée.\n\nVous pouvez maintenant [$1 commencer à utiliser votre wiki].\n\nSi vous souhaitez régénérer votre fichier <code>LocalSettings.php</code>, cliquez sur le bouton ci-dessous.\nCeci '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre wiki.",
        "config-upgrade-done-no-regenerate": "Mise à jour terminée.\n\nVous pouvez maintenant [$1 commencer à utiliser votre wiki].",
        "config-email-auth-help": "Si cette option est activée, les utilisateurs doivent confirmer leur adresse de courriel en utilisant l'hyperlien envoyé à chaque fois qu'ils la définissent ou la modifient.\nSeules les adresses authentifiées peuvent recevoir des courriels des autres utilisateurs ou lorsqu'il y a des notifications de modification.\nL'activation de cette option est '''recommandée''' pour les wikis publics en raison d'abus potentiels des fonctionnalités de courriels.",
        "config-email-sender": "Adresse de courriel de retour :",
        "config-email-sender-help": "Entrez l'adresse de courriel à utiliser comme adresse de retour des courriels sortant.\nLes courriels rejetés y seront envoyés.\nDe nombreux serveurs de courriels exigent au moins un [http://fr.wikipedia.org/wiki/Nom_de_domaine nom de domaine] valide.",
-       "config-upload-settings": "Téléchargement des images et des fichiers",
-       "config-upload-enable": "Activer le téléchargement des fichiers",
+       "config-upload-settings": "Téléversement des images et des fichiers",
+       "config-upload-enable": "Activer le téléversement des fichiers",
        "config-upload-help": "Le téléversement de fichiers expose votre serveur à des risques de sécurité.\nPour plus d'informations, lire la section [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security ''Security''] du manuel d'installation (en anglais).\n\nPour autoriser le téléversement de fichiers, modifier les permissions du sous-répertoire <code>images</code> qui se situe sous le répertoire racine de MediaWiki de sorte à ce que le serveur web puisse écrire dedans.\nEnsuite, activez cette option.",
        "config-upload-deleted": "Répertoire pour les fichiers supprimés :",
        "config-upload-deleted-help": "Choisissez un répertoire qui servira à archiver les fichiers supprimés.\nIdéalement, il ne devrait pas être accessible depuis le web.",
        "config-logo": "URL du logo :",
-       "config-logo-help": "L’habillage par défaut de MediaWiki comprend l’espace pour un logo de 135x160 pixels au-dessus de la barre de menu latérale.\nTéléchargez une image de la taille appropriée, et entrez son URL ici.\n\nVous pouvez utiliser <code>$wgStylePath</code> ou <code>$wgScriptPath</code> si votre logo est relatif à ces chemins.\n\nSi vous ne voulez pas de logo, laissez cette case vide.",
+       "config-logo-help": "L’habillage par défaut de MediaWiki comprend l’espace pour un logo de 135x160 pixels au-dessus de la barre de menu latérale.\nTéléversez une image de la taille appropriée, et entrez son URL ici.\n\nVous pouvez utiliser <code>$wgStylePath</code> ou <code>$wgScriptPath</code> si votre logo est relatif à ces chemins.\n\nSi vous ne voulez pas de logo, laissez cette case vide.",
        "config-instantcommons": "Activer ''InstantCommons''",
        "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons/fr InstantCommons] est un service qui permet d’utiliser les images, les sons et les autres médias disponibles sur le site [https://meta.wikimedia.org/wiki/Wikimedia_Commons/fr Wikimédia Commons].\nPour ce faire, il faut que MediaWiki accède à Internet.\n\nPour plus d’informations sur ce service, y compris les instructions sur la façon de le configurer pour d’autres wikis que Wikimedia Commons, consultez le [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos manuel].",
        "config-cc-error": "Le sélection d'une licence ''Creative Commons'' n'a donné aucun résultat.\nEntrez le nom de la licence manuellement.",
index e98988c..161c5db 100644 (file)
@@ -9,7 +9,8 @@
                        "Yona b",
                        "Rotemliss",
                        "Macofe",
-                       "Guycn2"
+                       "Guycn2",
+                       "שמזן"
                ]
        },
        "config-desc": "תכנית ההתקנה של מדיה־ויקי",
        "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 Server], שתואמים ל־MySQL. (ר׳ [http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. ייתכן שיש בתצורה הזאת באגים מסוימים והיא לא מומלצת לסביבות מבצעיות. (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] הוא מסד נתונים עסקי מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] הוא מסד נתונים עסקי מסחרי לחלונות. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
        "config-cache-options": "הגדרות למטמון עצמים (object caching):",
        "config-cache-help": "מטמון עצמים משמש לשיפור המהירות של מדיה־ויקי על־ידי שמירה של נתונים שהשימוש בהם נפוץ במטמון.\nלאתרים בינוניים וגדולים כדאי מאוד להפעיל את זה, וגם אתרים קטנים ייהנו מזה.",
        "config-cache-none": "ללא מטמון (שום יכולת אינה מוּסרת, אבל הביצועים באתרים גדולים ייפגעו)",
-       "config-cache-accel": "מטמון עצמים (object caching) של PHP&rlm; (APC&rlm;, XCache או WinCache)",
+       "config-cache-accel": "מטמון עצמים (object caching) של PHP&rlm; (APC,&rlm; APCu,&rlm; XCache או WinCache)",
        "config-cache-memcached": "להשתמש ב־Memcached (דורש התקנות והגדרות נוספות)",
        "config-memcached-servers": "שרתי Memcached:",
        "config-memcached-help": "רשימת כתובות IP ש־Memcached ישתמש בהן.\nיש לרשום כתובת אחת בכל שורה ולציין את הפִּתְחָה (port), למשל:\n 127.0.0.1:11211\n 192.168.1.25:1234",
        "config-install-subscribe-fail": "הרישום ל־mediawiki-announce לא הצליח: $1",
        "config-install-subscribe-notpossible": "cURL אינה מותקנת ו־<code>allow_url_fopen</code> אינה זמינה.",
        "config-install-mainpage": "יצירת דף ראשי עם תוכן התחלתי",
+       "config-install-mainpage-exists": "העמוד הראשי כבר קיים, לדלג",
        "config-install-extension-tables": "יצירת טבלאות להרחבות מופעלות",
        "config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
        "config-install-done": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקיית הבסיס שבה הותקן הוויקי שלך (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
        "config-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://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 e05b700..b443950 100644 (file)
@@ -5,7 +5,9 @@
                        "Vivek Rai",
                        "Phoenix303",
                        "संजीव कुमार",
-                       "Sahilrathod"
+                       "Sahilrathod",
+                       "Shyamal",
+                       "Sfic"
                ]
        },
        "config-desc": "साँचा लिए इंस्टॉलर",
        "config-localsettings-cli-upgrade": "<code>LocalSettings.php</code> फ़ाइल पाया गया है ।\nइस स्थापना को अपग्रेड करने के लिए, बदले में कृपया करके ये चलाए <code>update.php</code>",
        "config-localsettings-key": "नवीनीकरण कुंजी",
        "config-localsettings-badkey": "आपकी दी गई कुंजी ग़लत है।",
+       "config-session-error": "सत्र शुरू करने में त्रुटि: $1",
+       "config-session-expired": "लग रहा है कि आपका सत्र डाटा समाप्त हो चुका है।\n$1 हेतु आप इस डाटा को हमेशा के लिए भी कर सकते हैं।\nइसे बढ़ाने हेतु आपको php.ini में <code>session.gc_maxlifetime</code> को बढ़ाना होगा।\nउसके बाद आपको स्थापित करने का कार्य फिर से करना होगा।",
+       "config-no-session": "आपका सत्र डाटा गुम हो गया।\nअपने php.ini को देखें कि <code>session.save_path</code> ठीक तरीके से सही पते पर तो है ना?",
        "config-your-language": "आपकी भाषा:",
-       "config-wiki-language": "विकी भाषा:",
+       "config-your-language-help": "स्थापन के लिए भाषा चुनें",
+       "config-wiki-language": "विकि भाषा:",
+       "config-wiki-language-help": "भाषा चुनें जिस  में अधिकतर लेख लिखा जाएगा",
        "config-back": "← वापस",
        "config-continue": "आगे बढ़ें →",
        "config-page-language": "भाषा",
-       "config-page-welcome": "मà¥\80डियाविà¤\95à¥\80 à¤ªà¤° आपका स्वागत है!",
-       "config-page-dbconnect": "डà¥\87à¤\9fाबà¥\87स à¤¸à¥\87 à¤\9cà¥\81ड़ें",
+       "config-page-welcome": "मà¥\80डियाविà¤\95ि à¤®à¥\87à¤\82 आपका स्वागत है!",
+       "config-page-dbconnect": "डà¥\87à¤\9fाबà¥\87स à¤¸à¥\87 à¤\9cà¥\8bड़ें",
        "config-page-upgrade": "मौजूदा स्थापना का नवीनीकरण",
-       "config-page-dbsettings": "डà¥\87à¤\9fाबà¥\87स à¤µà¤°à¤¿à¤¯à¤¤à¤¾à¤¯à¥\87à¤\82",
+       "config-page-dbsettings": "डà¥\87à¤\9fाबà¥\87स à¤¸à¥\87à¤\9fिà¤\82à¤\97 (पसà¤\82द)",
        "config-page-name": "नाम",
        "config-page-options": "विकल्प",
        "config-page-install": "स्थापित करें",
        "config-page-copying": "अनुकरण",
        "config-page-upgradedoc": "उन्नयन",
        "config-page-existingwiki": "मौजूदा विकि",
+       "config-help-restart": "क्या आप अपने द्वारा दिये सभी डाटा को मिटाना चाहते हैं और फिर से स्थापित करना चाहते हैं?",
        "config-restart": "हाँ, इसे पुनः आरंभ करें",
        "config-env-php": "PHP $1 स्थापित किया गया है।",
+       "config-env-hhvm": "एचएचवीएम $1 स्थापित किया गया है।",
+       "config-memory-raised": "पीएचपी की <code>memory_limit</code> सीमा $1 है, जो $2 तक बढ़ गई है।",
+       "config-xcache": "[http://xcache.lighttpd.net/ एक्सकैश] स्थापित है।",
+       "config-apc": "[http://www.php.net/apc एपीसी] स्थापित है।",
+       "config-apcu": "[http://www.php.net/apcu एपीसीयू] स्थापित है।",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp विनकैश] स्थापित है।",
+       "config-db-type": "डेटाबेस प्रकार:",
+       "config-db-host": "डेटाबेस होस्ट:",
+       "config-db-host-oracle": "डेटाबेस टीएनएस:",
        "config-db-wiki-settings": "इस विकि को पहचानें",
-       "config-db-install-account": "इंस्टालेशन के लिए उपयोगकर्ता खाता",
+       "config-db-name": "डेटाबेस का नाम:",
+       "config-db-install-account": "इसे स्थापित करने हेतु सदस्य खाता",
+       "config-db-username": "डेटाबेस सदस्यनाम:",
+       "config-db-password": "डेटाबेस पासवर्ड:",
+       "config-db-port": "डेटाबेस पोर्ट:",
+       "config-type-mssql": "माइक्रोसॉफ़्ट एसक्यूएल सर्वर",
+       "config-invalid-db-type": "अमान्य डेटाबेस प्रकार",
+       "config-regenerate": "LocalSettings.php फिर से निर्मित करें →",
+       "config-db-web-account": "वेब पहुँच हेतु डेटाबेस खाता",
+       "config-mysql-innodb": "इनोडीबी",
+       "config-mysql-binary": "बाइनरी",
+       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "प्रमाणन प्रकार:",
        "config-mssql-sqlauth": "SQL सर्वर प्रमाणन",
        "config-site-name": "विकि का नाम:",
        "config-ns-other": "अन्य (निर्दिष्ट करें)",
        "config-ns-other-default": "मेरा विकि",
        "config-admin-box": "व्यवस्थापक खाता",
-       "config-admin-name": "à¤\86पà¤\95ा à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता नाम:",
+       "config-admin-name": "à¤\86पà¤\95ा à¤¸à¤¦à¤¸à¥\8dय नाम:",
        "config-admin-password": "कूटशब्द:",
        "config-admin-password-confirm": "फिर से कूटशब्द:",
+       "config-admin-name-blank": "प्रबन्धक का सदस्य नाम लिखें।",
        "config-admin-email": "ईमेल पता:",
        "config-optional-continue": "मुझसे और सवाल पूछें।",
        "config-optional-skip": "मैं पहले से ही ऊब चुका हूँ, बस विकि स्थापित करें।",
        "config-profile-fishbowl": "केवल प्रमाषित संपादक ही",
        "config-profile-private": "निजी विकि",
        "config-license-cc-by": "क्रिएटिव कॉमन्स ऍट्रीब्यूशन",
+       "config-license-pd": "सार्वजनिक डोमैन",
        "config-email-watchlist": "ध्यानसूची अधिसूचना को सक्षम करें",
+       "config-upload-enable": "फ़ाइल अपलोड सक्रिय करें",
+       "config-upload-help": "यदि आप अपने सर्वर में फ़ाइल अपलोड की सेवा दे रहे हैं तो आपको सुरक्षा से समझौता करना पड़ सकता है।\n\nअधिक जानकारी के लिए मार्गदर्शक में [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security सुरक्षा अनुभाग] देखें।\n\nयदि आप फ़ाइल अपलोड को सक्रिय करना चाहते हैं तो आपको मीडियाविकि के फोंल्डर के <code>images</code> फोंल्डर में जाने के बाद उसे सर्वर द्वारा लिखने लायक बनाना होगा।\nउसके बाद ही आप इस विकल्प को सक्रिय कर सकते हैं।",
+       "config-logo": "''लोगो'' का पता:",
+       "config-instantcommons": "''कॉमन्स'' सक्रिय करें",
+       "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons कॉमन्स] एक प्रकार की विशेषता प्रदान करता है, जिससे आप विकि में [https://commons.wikimedia.org/ विकिमीडिया कॉमन्स] साइट के किसी भी तस्वीर, आवाज या अन्य फ़ाइल का उपयोग अपने मीडियाविकि में कर सकते हैं। इसके लिए मीडियाविकि को इंटरनेट से जुड़ा होना चाहिए।\n\nइस विशेषता की अधिक जानकारी के लिए और इसे किस प्रकार आप अपने विकि में सक्रिय कर सकते हैं आदि जानने के लिए [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos मार्गदर्शक] देखें।",
        "config-extensions": "एक्सटेंशन",
+       "config-skins": "त्वचा",
+       "config-install-step-done": "पूरा हुआ",
+       "config-install-step-failed": "विफल हुआ",
+       "config-install-user-alreadyexists": "सदस्य \"$1\" पहले से उपस्थित है।",
+       "config-install-user-create-failed": "सदस्य \"$1\" का निर्माण विफल हुआ: $2",
+       "config-install-keys": "गुप्त कुंजी बना रहा",
+       "config-install-sysop": "प्रबन्धक सदस्य खाता बना रहा",
+       "config-download-localsettings": "<code>LocalSettings.php</code> को डाउनलोड करें।",
        "config-help": "सहायता",
+       "config-help-tooltip": "विस्तार हेतु क्लिक करें",
        "config-nofile": "फ़ाइल \"$1\" नहीं पाई जा सकी। क्या इसे हटा दिया गया है?",
-       "mainpagetext": "'''मीडियाविकिका इन्स्टॉलेशन पूरा हो गया हैं ।'''",
-       "mainpagedocfooter": "विà¤\95ि à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यरà¤\95à¥\87 à¤\87सà¥\8dतà¥\87माल à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 [https://meta.wikimedia.org/wiki/Help:Contents à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता à¤\97ाà¤\88ड] à¤¦à¥\87à¤\96à¥\87à¤\82 à¥¤\n\n== à¤¶à¥\81रà¥\81वात à¤\95रà¥\87à¤\82 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings à¤\95à¥\89नà¥\8dफिà¤\97रà¥\87शन à¤¸à¥\87à¤\9fà¥\80à¤\82à¤\97à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ à¤®à¥\80डियाविà¤\95िà¤\95à¥\87 à¤¬à¤¾à¤°à¥\87 à¤®à¥\87à¤\82 à¤ªà¥\8dराय: à¤ªà¥\82à¤\9bà¥\87 à¤\9cानà¥\87 à¤µà¤¾à¤²à¥\87 à¤¸à¤µà¤¾à¤²]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce à¤®à¥\80डियाविà¤\95ि à¤®à¥\87लिà¤\82à¤\97 à¤²à¤¿à¤¸à¥\8dà¤\9f]"
+       "mainpagetext": "<strong>मीडियाविकि का अब स्थापित हो चुका है।</strong>",
+       "mainpagedocfooter": "à¤\87स à¤µà¤¿à¤\95ि à¤¸à¥\89फà¥\8dà¤\9fवà¥\87यर à¤\95ा à¤\95िस à¤ªà¥\8dरà¤\95ार à¤\86प à¤\87सà¥\8dतà¥\87माल à¤\95र à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82, à¤\87सà¤\95à¥\80 à¤\9cानà¤\95ारà¥\80 à¤\95à¥\87 à¤²à¤¿à¤\8f [https://meta.wikimedia.org/wiki/Help:Contents à¤\89पयà¥\8bà¤\97 à¤®à¤¾à¤°à¥\8dà¤\97दरà¥\8dशà¤\95] à¤¦à¥\87à¤\96à¥\87à¤\82।\n== à¤¶à¥\81रà¥\81à¤\86त à¤\95रà¥\87à¤\82 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings à¤µà¤¿à¤\95ि à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ à¤®à¥\80डियाविà¤\95ि à¤\95à¥\87 à¤¬à¤¾à¤°à¥\87 à¤®à¥\87à¤\82 à¤ªà¥\8dराय: à¤ªà¥\82à¤\9bà¥\87 à¤\9cानà¥\87 à¤µà¤¾à¤²à¥\87 à¤¸à¤µà¤¾à¤²]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce à¤®à¥\80डियाविà¤\95ि à¤\95à¥\80 à¤®à¥\87ल à¤¸à¥\82à¤\9aà¥\80]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources à¤®à¥\80डियाविà¤\95ि à¤\95ा à¤\86पà¤\95à¥\87 à¤­à¤¾à¤·à¤¾ à¤®à¥\87à¤\82 à¤\85नà¥\81वाद]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam à¤\85पनà¥\87 à¤µà¤¿à¤\95ि à¤\95à¥\8b à¤\95िस à¤ªà¥\8dरà¤\95ार à¤¸à¥\87 à¤µà¤¿à¤\9cà¥\8dà¤\9eापन à¤¡à¤¾à¤²à¤¨à¥\87 à¤µà¤¾à¤²à¥\87 à¤\94र à¤¬à¤°à¥\8dबरता à¤\95रनà¥\87 à¤µà¤¾à¤²à¥\8bà¤\82 à¤¸à¥\87 à¤¬à¤\9aा à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82]"
 }
index 1c5c2ee..759b82d 100644 (file)
@@ -10,7 +10,8 @@
                        "Dorgan",
                        "Macofe",
                        "Máté",
-                       "Seb35"
+                       "Seb35",
+                       "Urbalazs"
                ]
        },
        "config-desc": "A MediaWiki telepítője",
        "config-env-php": "A PHP verziója: $1",
        "config-env-hhvm": "HHVM verziója: $1",
        "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-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-unicode-pure-php-warning": "<strong>Figyelmeztetés:</strong> A 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> A Unicode normalizáláshoz szükséges burkolókönyvtár [http://site.icu-project.org/ az 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-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 <code>php5-mysql</code> 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-no-fts3": "<strong>Figyelmeztetés:</strong> 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ó].",
-       "config-pcre-no-utf8": "'''Kritikus hiba''': Úgy tűnik, hogy a PHP PRCE modulja PRCE_UTF8 támogatás nélkül lett fordítva.\nA MediaWikinek UTF-8-támogatásra van szüksége a helyes működéshez.",
+       "config-pcre-no-utf8": "<strong>Kritikus hiba:</strong> Úgy tűnik, hogy a PHP PRCE modulja PRCE_UTF8 támogatás nélkül lett fordítva.\nA MediaWikinek UTF-8-támogatásra van szüksége a helyes működéshez.",
        "config-memory-raised": "A PHP <code>memory_limit</code> beállításának értéke: $1. Meg lett növelve a következő értékre: $2.",
-       "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-memory-bad": "<strong>Figyelmeztetés:</strong> 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-no-cache-apcu": "<strong>Figyelmeztetés:</strong> nem találhatók a következők: [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] vagy [http://www.iis.net/download/WinCacheForPhp WinCache].\nAz objektum gyorsítótárazása nincs engedélyezve.",
        "config-diff3-bad": "GNU diff3 nem található.",
        "config-git": "Megtaláltam a Git verziókezelő szoftvert: <code>$1</code>.",
        "config-git-bad": "A Git verziókezelő rendszer nem található.",
        "config-imagemagick": "Az ImageMagick megtalálható a rendszeren: <code>$1</code>.\nA bélyegképek készítése engedélyezve lesz a feltöltések engedélyezése esetén.",
        "config-gd": "A GD grafikai könyvtár elérhető.\nBélyegképek készítése működni fog, miután engedélyezted a fájlfeltöltést.",
        "config-no-scaling": "Nem található a GD könyvtár és az ImageMagick.\nA bélyegképek készítése le lesz tiltva.",
-       "config-no-uri": "'''Hiba:''' Nem sikerült megállapítani a jelenlegi URI-t.\nTelepítés megszakítva.",
+       "config-no-uri": "<strong>Hiba:</strong> Nem sikerült megállapítani a jelenlegi URI-t.\nA telepítés megszakítva.",
        "config-no-cli-uri": "<strong>Figyelmeztetés:</strong> Nincs <code>--scriptpath</code> megadva, használom az alapértelmezettet: <code>$1</code>.",
        "config-using-server": "A következő szervernév használata: „<nowiki>$1</nowiki>”.",
-       "config-using-uri": "A következő szerver URL-cím használata: „<nowiki>$1$2</nowiki>”.",
-       "config-uploads-not-safe": "'''Figyelmeztetés:''' a feltöltésekhez használt alapértelmezett könyvtárban (<code>$1</code>) tetszőleges külső szkript futtatható.\nHabár a MediaWiki ellenőrzi a feltöltött fájlokat az efféle biztonsági veszélyek megtalálása érdekében, a feltöltés engedélyezése előtt erősen ajánlott a [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security a sérülékenység megszüntetése].",
+       "config-using-uri": "A következő szerver-URL használata: „<nowiki>$1$2</nowiki>”.",
+       "config-uploads-not-safe": "<strong>Figyelmeztetés:</strong> a feltöltésekhez használt alapértelmezett könyvtárban (<code>$1</code>) tetszőleges külső szkript futtatható.\nHabár a MediaWiki ellenőrzi a feltöltött fájlokat az efféle biztonsági veszélyek megtalálása érdekében, a feltöltés engedélyezése előtt erősen ajánlott [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security a sérülékenység megszüntetése].",
        "config-brokenlibxml": "A rendszereden a PHP és libxml2 verziók olyan kombinációja található meg, ami hibásan működik, és észrevehetetlen adatkárosodást okoz a MediaWikiben és más webalkalmazásokban.\nFrissíts a libxml2 2.7.3 vgy újabb verziójára ([https://bugs.php.net/bug.php?id=45996 A hiba bejelentése a PHP-nél]).\nTelepítés megszakítva.",
        "config-suhosin-max-value-length": "A Suhosin telepítve van, és a GET <code>length</code> paraméterét $1 bájtra korlátozza.\nA MediaWiki ResourceLoader (erőforrásbetöltő) összetevője megkerüli a problémát, de így csökkenni fog a teljesítmény.\nHa lehetséges, állítsd be a <code>suhosin.get.max_value_length</code> értékét legalább 1024-re a <code>php.ini</code>-ben, és állítsd be a <code>$wgResourceLoaderMaxQueryLength</code> változót ugyanerre az értékre a <code>LocalSettings.php</code>-ban.",
        "config-db-type": "Adatbázis típusa:",
        "config-missing-db-name": "Meg kell adnod a(z) „{{int:config-db-name}}” értékét.",
        "config-missing-db-host": "Meg kell adnod az „{{int:config-db-host}}” értékét.",
        "config-missing-db-server-oracle": "Meg kell adnod az „{{int:config-db-host-oracle}}” értékét.",
-       "config-invalid-db-server-oracle": "Érvénytelen adatbázis TNS: „$1”\nCsak ASCII betűk (a-z, A-Z), számok (0-9), alulvonás (_) és pont (.) használható.",
+       "config-invalid-db-server-oracle": "Érvénytelen adatbázis TNS: „$1”\nHasználd a „TNS Name” vagy az Easy Connect” sztringet!\n([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
        "config-invalid-db-name": "Érvénytelen adatbázisnév: „$1”.\nCsak ASCII-karakterek (a-z, A-Z), számok (0-9), alulvonás (_) és kötőjel (-) használható.",
        "config-invalid-db-prefix": "Érvénytelen adatbázisnév-előtag: „$1”.\nCsak ASCII-karakterek (a-z, A-Z), számok (0-9), alulvonás (_) és kötőjel (-) használható.",
        "config-connection-error": "$1.\n\nEllenőrizd a hosztot, felhasználónevet és jelszót, majd próbáld újra.",
        "config-nofile": "\"$1\" fájl nem található. Törölve lett?",
        "config-extension-link": "Tudtad, hogy a wikid támogat [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions kiterjesztéseket]?\n\nBöngészhetsz [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category kiterjesztéseket kategóriánként] vagy válogathatsz a [https://www.mediawiki.org/wiki/Extension_Matrix kiterjesztésmátrixból] az összes kiterjesztés áttekintéséhez.",
        "mainpagetext": "<strong>A MediaWiki telepítése sikeresen befejeződött.</strong>",
-       "mainpagedocfooter": "Ha segítségre van szükséged a wikiszoftver használatához, akkor keresd fel a [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.\n\n== Alapok (angol nyelven) ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Beállítások listája]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki GyIK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources A MediaWiki fordítása a saját nyelvedre]"
+       "mainpagedocfooter": "Ha segítségre van szükséged a wikiszoftver használatához, akkor keresd fel a [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.\n\n== Alapok (angol nyelven) ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Beállítások listája]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki GyIK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources A MediaWiki fordítása a saját nyelvedre]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Tudd meg többet, hogyan küzdhetsz a kéretlen levelek ellen a wikiden]"
 }
index 3670744..c23e1f6 100644 (file)
        "config-unicode-using-intl": "Adoeuvia [http://pecl.php.net/intl l'estenscion PECL intl] pe-a normalizzaçion Unicode.",
        "config-unicode-pure-php-warning": "'''Attençion:''' [http://pecl.php.net/intl l'estenscion PECL intl] a no l'è disponibile pe gestî a normalizzaçion Unicode, quindi se torna a-a lenta implementaçion in PHP puo.\nSe ti esegui un scito a ato traffego, ti doviesci leze arcun-e conscidiaçioin in sciâ [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzaçion Unicode].",
        "config-unicode-update-warning": "'''Attençion:''' a verscion installaa do gestô pe-a normalizzaçion Unicode a l'adoeuvia una vegia verscion da libraia [http://site.icu-project.org/ do progetto ICU].\nTi doviesci [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aggiornâ] se ti voeu doeuviâ l'Unicode.",
-       "config-no-db": "Imposcibile trovâ un driver adatto pe-o database! L'è necessaio installâ un driver pe PHP.\n{{PLURAL:$2|O seguente formato de database o l'è supportou|I seguenti formati de database son supportæ}}: $1.\n\nSe ti compilli PHP aotonomamente, riconfiguilo attivando un client database, presempio utilizzando <code>./configure --with-mysqli</code>.\nQualoa t'avesci installou PHP pe mezo de 'n pacchetto Debian ò Ubuntu, alloa ti devi installâ o pacchetto <code>php5-mysql</code> ascì."
+       "config-no-db": "Imposcibile trovâ un driver adatto pe-o database! L'è necessaio installâ un driver pe PHP.\n{{PLURAL:$2|O seguente formato de database o l'è supportou|I seguenti formati de database son supportæ}}: $1.\n\nSe ti compilli PHP aotonomamente, riconfiguilo attivando un client database, presempio utilizzando <code>./configure --with-mysqli</code>.\nQualoa t'avesci installou PHP pe mezo de 'n pacchetto Debian ò Ubuntu, alloa ti devi installâ o pacchetto <code>php5-mysql</code> ascì.",
+       "config-outdated-sqlite": "'''Atençion''': ti g'hæ SQLite $1, ma te ghe voeu comme minnimo a verscion $2. SQLite o no saiâ disponibile.",
+       "config-no-fts3": "'''Atençion''': SQLite o l'è compilou sença o [//sqlite.org/fts3.html modulo FTS3], e fonçioin de çerchia no saian disponibile insce sto motô.",
+       "config-pcre-old": "<strong>Fatale:</strong> se richiede PCRE  $1 o succescivo.\nO to PHP binaio o l'è conligou con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Ciu informaçioin insce PCRE].",
+       "config-pcre-no-utf8": "'''Fatale''': o modulo PCRE de PHP pâ ch'o segge stæto compilou sença o supporto PCRE_UTF8. A MediaWiki a-o richiede pe fonçionâ corettamente.",
+       "config-memory-raised": "O valô <code>memory_limit</code> de PHP o l'è $1, aomentou a $2.",
+       "config-memory-bad": "''Atençion:''' O valô de <code>memory_limit</code> do PHP o l'è $1.\nFoscia o l'è troppo basso.\nL'installaçion a porriæ fallî!",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] o l'è installou",
+       "config-apc": "[http://www.php.net/apc APC] o l'è installou",
+       "config-apcu": "[http://www.php.net/apc APC] o l'è installou",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] o l'è installou",
+       "config-no-cache-apcu": "'''Atençion:''' [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] ò [http://www.iis.net/download/WinCacheForPhp WinCache] no son stæti trovæ.\nA caching di ogetti a no l'è attivâ.",
+       "config-mod-security": "<strong>Atençion:</strong> O to serviou web o g'ha o [http://modsecurity.org/ mod_security] abilitou. Gh'è tante configuaçioin che crean di problemi a-a MediaWiki ò a atro software ch'o permette a-i utenti de pubbricâ quâ-se-segge contegnuo. Se poscibbile o doviæ ese disabilitou.\nFanni rifeimento a-a [http://modsecurity.org/documentation/ documentaçion insce-o mod_security] ò contatta o supporto tecnico do to provider de hosting se se veifica di erroî.",
+       "config-diff3-bad": "GNU diff3 non trovou.",
+       "config-git": "Trovou software de controllo da verscion Git: <code>$1</code>.",
+       "config-git-bad": "Software de controllo da verscion Git non trovou.",
+       "config-imagemagick": "Trovou ImageMagick: <code>$1</code>.\nE miniatue de inmaggine saian presente se i upload vegnan abilitæ.",
+       "config-gd": "Trovou a libraja graffica GD integrâ.\nE miniatue de inmaggine saian presente se i upload vegnan abilitæ.",
+       "config-no-scaling": "Imposcibbile trovâ a libraja GD ò ImageMagick.\nE miniatue de inmaggine saian disabilitæ.",
+       "config-no-uri": "'''Errô:''' Imposcibbile determinâ l'URI attoale.\nInstallaçion interotta.",
+       "config-no-cli-uri": "'''Atençion''': <code>--scriptpath</code> non specificou, s'adoeuvia o valô predefinio: <code>$1</code>.",
+       "config-using-server": "Nomme do serviou in uso \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "URL do serviou in uso \"<nowiki>$1$2</nowiki>\".",
+       "config-uploads-not-safe": "<strong>Atençion:</strong> a directory predefinia pe-i caregamenti <code>$1</code> a l'è vulnerabile a l'execuçion arbitraia de script.\nSciben che, a difeisa da segueçça, a MediaWiki a controlla tutti i file caregæ, l'è fortemente racomandou de [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security serâ questa menaçça] primma d'abilitâ i caregamenti.",
+       "config-no-cli-uploads-check": "<strong>Atençion:</strong> a directory predefinia pe-i caregamenti (<code>$1</code>) a no l'è stæta veificâ pe-a vulnerabilitæ insce l'esecuçion arbitraia de script durante l'installaçion da linnia de comando.",
+       "config-brokenlibxml": "O to scistema o g'ha 'na combinaçion de verscioin de PHP e libxml2 ch'a l'è difettosa e ch'a poeu provocâ un danno ascozo a-i dæti da MediaWiki e d'atre apricaçioin web.\nAgiorna a libxml2 2.7.3 ò succescivo ([https://bugs.php.net/bug.php?id=45996 o babollo o l'è studiou da-o lao PHP]).\nInstallaçion interotta.",
+       "config-suhosin-max-value-length": "Suhosin o l'è installou e o limmita o parammetro GET <code>length</code> a $1 byte.\nO componente MediaWiki ResourceLoader o fonçioniâ inte sto limmite, ma questo o reduiâ e prestaçioin.\nSe poscibbile, ti doviesci impostâ <code>suhosin.get.max_value_length</code> a 1024 ò ciu in <code>php.ini</code>, e impostâ <code>$wgResourceLoaderMaxQueryLength</code> a-o mæximo valô in <code>LocalSettings.php</code>.",
+       "config-db-type": "Tipo de database:",
+       "config-db-host": "Host do database:",
+       "config-db-host-help": "Se o serviou do to database o l'è insce 'n serviou despægio, inmetti chì o nomme de l'host ò o so adresso IP.\n\nSe ti doeuvi un web hosting condiviso, o to hosting provider o doviæ fornite o nomme host corretto inta so documentaçion.\n\nSe t'ê aproeuvo a instalâ insce 'n serviou Windows con uso de MySQL, l'uso de \"localhost\" o porriæ no fonçionâ correttamente comme nomme do serviou. In caxo de problemi, proeuva a impostâ \"127.0.0.1\" comme adresso IP locale.\n\nSe ti t'adoeuvi PostgreSQL, lascia questo campo voeuo pe consentî de connettise trammite un socket Unix.",
+       "config-db-host-oracle": "TNS do database:",
+       "config-db-host-oracle-help": "Inseisci un vallido [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; un file tnsnames.ora o dev'ese vixibbile a questa installaçion.<br />Se ti t'adoeuvi a libraia cliente 10g o ciù reçente ti poeu ascì doeuviâ o mettodo de denominaçion [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
+       "config-db-wiki-settings": "Identiffica questo wiki",
+       "config-db-name": "Nomme do database:",
+       "config-db-name-help": "Çerni un nomme ch'o l'identiffiche o to wiki.\nO no deve contegnî de spaççi.\n\nSe ti doeuvi un web hosting condiviso, o to hosting provider o te fornisce un speciffico nomme de database da doeuviâ, opû o ti consentiâ de creâ o database trammite un panello de controllo.",
+       "config-db-name-oracle": "Schema do database:"
 }
index 23f3de1..671d073 100644 (file)
@@ -29,6 +29,7 @@
        "config-env-hhvm": "HHVM $1 ir uzstādīts.",
        "config-apcu": "[http://www.php.net/apcu APCu] ir uzstādīts",
        "config-diff3-bad": "GNU diff3 nav atrasts.",
+       "config-db-host-oracle": "Datubāzes TNS:",
        "config-db-name": "Datubāzes nosaukums:",
        "config-db-username": "Datubāzes lietotājvārds:",
        "config-db-password": "Datubāzes parole:",
index 70ef27a..b8dab21 100644 (file)
@@ -86,7 +86,7 @@
        "config-db-host-oracle-help": "Внесете важечко [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm месно име за поврзување]. На оваа воспоставка мора да ѝ биде видлива податотеката tnsnames.ora.<br />Ако користите клиентски библиотеки 10g или понови, тогаш можете да го користите и методот на иметнување на [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Идентификувај го викиво",
        "config-db-name": "Име на базата:",
-       "config-db-name-help": "Одберете име што ќе го претставува вашето вики.\nИмето не смее да содржи празни места.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител ќе ви даде конкретно име на база за користење, или пак ќе ви даде да создавате бази преку контролната табла.",
+       "config-db-name-help": "Одберете име што ќе го претставува вашето вики.\nИмето не смее да содржи празни места.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител ќе ви даде конкретно име на база за користење, или пак ќе ви даде да создавате бази преку управувачницата.",
        "config-db-name-oracle": "Шема на базата:",
        "config-db-account-oracle-warn": "Постојат три поддржани сценарија за воспоставка на Oracle како базен услужник:\n\nАко сакате да создадете сметка на базата како дел од постапката за воспоставка, наведете сметка со SYSDBA-улога како сметка за базата што ќе се воспостави и наведете ги саканите податоци за сметката за мрежен пристап. Во друг случај, можете да создадете сметка за мрежен пристап рачно и да ја наведете само таа сметка (ако има дозволи за создавање на шематски објекти) или пак да наведете две различни сметки, една со привилегии за создавање, а друга (ограничена) за мрежен пристап.\n\nСкриптата за создавање сметка со задолжителни привилегии ќе ја најдете во папката „maintenance/oracle/“ од оваа воспоставка. Имајте на ум дека ако користите ограничена сметка ќе ги оневозможите сите функции за одржување со основната сметка.",
        "config-db-install-account": "Корисничка смета за воспоставка",
        "config-logo-help": "Матичното руво на МедијаВики има простор за лого од 135x160 пиксели над страничникот.\n\nМожете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.\n\nАко не сакате да имате лого, тогаш оставете го ова поле празно.",
        "config-instantcommons": "Овозможи Instant Commons",
        "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] е функција која им овозможува на викијата да користат слики, звучни записи и други мултимедијални содржини од [https://commons.wikimedia.org/ Ризницата].\nЗа да може ова да работи, МедијаВики бара пристап до семрежјето.\n\nЗа повеќе информации за оваа функција и напатствија за нејзино поставување на вики (сите други освен Ризницата), коносултирајте го [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos прирачникот].",
-       "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде резултати.\nВнесете го името на лиценцата рачно.",
+       "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде лиценца.\nВнесете го името на лиценцата рачно.",
        "config-cc-again": "Одберете повторно...",
        "config-cc-not-chosen": "Одберете ја саканата лиценца од Криејтив комонс и стиснете на „proceed“.",
        "config-advanced-settings": "Напредни нагодувања",
index a499553..ca02841 100644 (file)
        "config-unknown-collation": "'''Waarschuwing:''' de database gebruikt een collatie die niet wordt herkend.",
        "config-db-web-account": "Databaseaccount voor webtoegang",
        "config-db-web-help": "Selecteer de gebruikersnaam en het wachtwoord die de webserver gebruikt om verbinding te maken met de databaseserver na de installatie.",
-       "config-db-web-account-same": "Dezelfde account gebruiken als voor de installatie",
+       "config-db-web-account-same": "Hetzelfde account gebruiken als voor de installatie",
        "config-db-web-create": "Maak de gebruiker aan als deze nog niet bestaat",
        "config-db-web-no-create-privs": "De gebruiker die u hebt opgegeven voor de installatie heeft niet voldoende rechten om een gebruiker aan te maken.\nDe gebruiker die u hier opgeeft moet al bestaan.",
        "config-mysql-engine": "Opslagmethode:",
index 13944ee..965c92d 100644 (file)
@@ -21,7 +21,8 @@
                        "Almondega",
                        "Luk3",
                        "Eduardo Addad de Oliveira",
-                       "Warley Felipe C."
+                       "Warley Felipe C.",
+                       "Felipe L. Ewald"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
@@ -69,7 +70,7 @@
        "config-env-hhvm": "HHVM $1 está instalado.",
        "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
        "config-unicode-pure-php-warning": "<strong>Aviso</strong>: A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode, abortando e passando para a lenta implementação de PHP puro.\nSe o seu site tem um alto volume de tráfego, informe-se sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalização Unicode].",
-       "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [//www.site.icu-project.org/projeto ICU].\nVocê deve [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
+       "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://www.site.icu-project.org/projeto ICU].\nVocê deve [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
        "config-no-db": "Não foi possível encontrar um driver apropriado para a banco de dados! Você precisa instalar um driver de banco de dados para PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de banco de dados: $1.\n\nSe compilou o PHP você mesmo, reconfigure-o com um cliente de banco 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 também precisa instalar, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.",
        "config-no-fts3": "<strong>Aviso</strong> O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-no-cli-uri": "<strong>Aviso:</strong> Nenhum <code>--scriptpath</code> foi especificado, usando o padrão: <code>$1</code>.",
        "config-using-server": "Utilizando o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Usando URL do servidor \"<nowiki>$1$2</nowiki>\".",
+       "config-uploads-not-safe": "<strong>Aviso:</strong> O seu diretório atual de envios <code>$1</code> está vulnerável a execuções de script arbitrárias.\nEmbora o MediaWiki verifique todos os arquivos enviados por ameaças de segurança, é altamente recomendável [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security evitar essa vulnerabilidade de segurança] antes de permitir envios.",
        "config-no-cli-uploads-check": "<strong>Atenção:</strong> O seu diretório padrão para envios (<code>$1</code>) não está marcado para vulnerabilidade\npara execução de script arbitrário durante a instalação do CLI.",
        "config-brokenlibxml": "O sistema tem uma combinação de PHP e libxml2 que é conflitante e pode causar corrupção de dados ocultos no MediaWiki e outros aplicativos da web.\nAtualize para o libxml2 2.7.3 ou mais recente ([https://bugs.php.net/bug.php?id=45996 bugs com o PHP]).\nInstalação abortada.",
+       "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET <code>length</code> para $1 bytes. O componente ResourceLoader trabalhará em torno deste limite, mas rebaixará a performance.\nSe possível, defina <code>suhosin.get.max_value_length</code> em <code>php.ini</code> para 1024 ou mais, e defina <code>$wgResourceLoaderMaxQueryLength</code> em <code>LocalSettings.php</code> para o mesmo valor.",
        "config-db-type": "Tipo de base de dados:",
        "config-db-host": "Servidor da base de dados:",
        "config-db-host-help": "Se a base de dados do seu servidor está em um servidor diferente, digite o nome do hospedeiro ou o endereço IP aqui.\n\nSe você está utilizando um hospedeiro web compartilhado, o seu provedor de hospedagem deverá fornecer o nome do hospedeiro correto na sua documentação.\n\nSe você está instalando em um servidor Windows e usando o MySQL, usar \"localhost\" pode não funcionar para o nome de servidor. Se não funcionar, tente \"127.0.01\" para o endereço de IP local.\n\nSe você está usando PostgreSQl, deixe este campo em branco para se conectar através de um socket Unix.",
        "config-db-host-oracle": "TNS da base de dados:",
+       "config-db-host-oracle-help": "Digite um  [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Nome de Conexão local] válido; o arquivo tnsnames.ora precisa estar visível para esta instalação.<br />Se você estiver usando bibliotecas cliente 10g ou mais recente,\n você também pode usar o método [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifique esta wiki",
        "config-db-name": "Nome da base de dados:",
        "config-db-name-help": "Escolha um nome que identifique a sua wiki.\nEle não deve conter espaços.\n\nSe você está utilizando um hospedeiro web compartilhado, o provedor de hospedagem lhe dará um nome especifico de base de dados para usar ou o deixará criar a partir do painel de controle.",
        "config-db-name-oracle": "Esquema de base de dados:",
+       "config-db-account-oracle-warn": "Há três cenários suportados para instalar o Oracle como backend do banco de dados:\n\nSe você deseja criar a conta do banco de dados como parte do processo de instalação, forneça uma conta com função SYSDBA como conta do banco de dados para instalação e especifique as credenciais desejadas para a conta de acesso pela web, caso contrário, você poderá criar a conta de acesso via web manualmente e fornecer apenas aquela conta (se tiver permissões necessárias para criar os objetos schema) ou fornecer duas contas diferentes, uma com privilégios de criação e uma restrita para acesso à web.\n\nO script para criar uma conta com os privilégios necessários pode ser encontrado no diretório \"maintenance/oracle/\" desta instalação. Lembre-se de que usar uma conta restrita desativará todos os recursos de manutenção com a conta padrão.",
        "config-db-install-account": "Conta de usuário para instalação",
        "config-db-username": "Nome de usuário do banco de dados:",
        "config-db-password": "Senha do banco de dados:",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "O MediaWiki suporta os sistemas de banco de dados a seguir:\n\n$1\n\nSe você não vê o sistema de banco de dados que você está tentando usar listados abaixo, siga as instruções relacionadas acima, para ativar o suporte.",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] é o principal alvo para MediaWiki e é melhor suportado. O MediaWiki também funciona com [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], que são compatíveis com MySQL.\n ([Http://www.php.net/manual/en/mysqli.installation.php Como compilar PHP com suporte a MySQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] é um popular sistema de banco de dados de código aberto como uma alternativa para o MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Como compilar o PHP com suporte PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] é um sistema de banco de dados leve que é muito bem suportado. ([http://www.php.net/manual/en/pdo.installation.php como compilar o PHP com suporte a SQLite], usa DOP)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] é um banco de dados comercial de empresas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar o PHP com suporte OCI8])",
+       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] é uma banco de dados comercial do Windows para empresas. ([http://www.php.net/manual/en/sqlsrv.installation.php Como compilar o PHP com suporte SQLSRV])",
        "config-header-mysql": "Configurações MySQL",
        "config-header-postgres": "Configurações PostgreSQL",
        "config-header-sqlite": "Configurações SQLite",
        "config-missing-db-name": "Você deve inserir um valor para \"{{int:config-db-name}}\".",
        "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-invalid-db-server-oracle": "Banco de dados TNS inválido \"$1\".\nUse \"TNS Name\" ou \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Métodos de nomeação da Oracle]).",
+       "config-invalid-db-name": "O nome do banco de dados é inválido \"$1\".\nUse apenas letras ASCII (a-z, A-Z), números (0-9), underscores (_) e hifens (-).",
+       "config-invalid-db-prefix": "O prefixo do banco de dados é inválido \"$1\".\nUse apenas letras ASCII (a-z, A-Z), números (0-9), underscores (_) e hifens (-).",
        "config-connection-error": "$1\n\nVerifique o servidor, nome de usuário e senha e tente novamente.",
+       "config-invalid-schema": "Schema inválido para o MediaWiki \"$1\".\nUse apenas letras ASCII (a-z, A-Z), números (0-9) e underscores (_).",
        "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-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-can-upgrade": "Este banco de dados contém tabelas do MediaWiki.\nPara atualizá-las para o MediaWiki $1, clique em <strong>Continuar</strong>.",
        "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-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-none": "Sem cache (nenhuma funcionalidade é removida, mas a velocidade pode ser afetada em wikis maiores)",
        "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-install-schema": "Criando esquema",
        "config-install-pg-schema-not-exist": "O esquema ''(schema)'' PostgreSQL não existe.",
        "config-install-pg-commit": "Enviando alterações",
+       "config-pg-no-create-privs": "A conta que você especificou para a instalação não tem privilégios suficientes para criar uma conta.",
        "config-install-user": "Criando usuário de banco de dados",
        "config-install-user-alreadyexists": "O usuário \"$1\" já existe!",
        "config-install-user-create-failed": "Criando usuário \"$1\" falhou: $2",
        "config-install-mainpage-exists": "A página principal já existe, pulando",
        "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ê 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-install-done": "<strong>Parabéns!</strong>\nVocê instalou o 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, você pode <strong>[$2 entrar na sua wiki]</strong>.",
+       "config-install-done-path": "<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 em <code>$4</code>. O download deve iniciar automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, você pode recomeçá-lo clicando no link abaixo:\n\n$3\n\n<strong>Nota:</strong> Se você não fizer isso, o arquivo de configuração que foi gerado não estará mais disponível se você sair da instalação sem fazer o download.\n\nQuando isso tiver sido feito, você 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.</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]"
+       "mainpagedocfooter": "Consulte o [https://www.mediawiki.org/wiki/Special:MyLanguage/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 198422a..1d4fc61 100644 (file)
@@ -8,7 +8,7 @@
        "config-title": "Installazzione de MediaUicchi $1",
        "config-information": "'Mbormaziune",
        "config-localsettings-key": "Chiave de aggiornamende:",
-       "config-localsettings-badkey": "'A chiave ca è date non g'è corrette.",
+       "config-localsettings-badkey": "'A chiave de aggiornamende ca è date non g'è corrette.",
        "config-session-error": "Errore facenne accumenzà 'a sessione: $1",
        "config-your-language": "'A lènga toje:",
        "config-your-language-help": "Scacchie 'na lènghe da ausà duranne 'u processe de installazzione:",
@@ -36,6 +36,8 @@
        "config-db-type": "Tipe de database:",
        "config-db-host-oracle": "Database TNS:",
        "config-db-name-oracle": "Scheme d'u database:",
+       "config-db-username": "Nome utende d'u database:",
+       "config-db-password": "Password d'u database:",
        "config-db-port": "Porte d'u database:",
        "config-db-schema": "Scheme pe MediaUicchi:",
        "config-type-mysql": "MySQL (o combatibbile)",
index 41884c6..02f6335 100644 (file)
@@ -87,5 +87,5 @@
        "config-help": "помоћ",
        "config-help-tooltip": "кликните да проширите",
        "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/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/Manual:Combating_spam Научите како да се борете против спама на Вашој вики]"
 }
index ecb8e87..b60f2a6 100644 (file)
                        "Korrawit",
                        "Horus",
                        "Octahedron80",
-                       "Aefgh39622"
+                       "Aefgh39622",
+                       "Ans"
                ]
        },
-       "config-desc": "ตัวติดตั้งสำหรับมีเดียวิกิ",
-       "config-title": "การติดตั้งมีเดียวิกิ $1",
-       "config-information": "สารสà¸\99à¹\80à¸\97ศ",
-       "config-localsettings-upgrade": "à¸\95รวà¸\88à¸\9eà¸\9aà¹\84à¸\9fลà¹\8c <code>LocalSettings.php</code>\nà¹\80à¸\9eืà¹\88ออัà¸\9bà¹\80à¸\81รà¸\94à¸\81ารà¸\95ิà¸\94à¸\95ัà¹\89à¸\87à¸\99ีà¹\89 à¸\81รุà¸\93าà¸\81รอà¸\81à¸\84à¹\88าà¸\82อà¸\87 <code>$wgUpgradeKey</code> à¹\83à¸\99à¸\81ลà¹\88อà¸\87à¸\94à¹\89าà¸\99ลà¹\88าà¸\87\nà¸\84ุà¸\93à¸\88ะà¸\9eà¸\9aมัà¸\99ได้ใน <code>LocalSettings.php</code>",
-       "config-localsettings-cli-upgrade": "à¸\95รวà¸\88à¸\9eà¸\9aà¹\84à¸\9fลà¹\8c <code>LocalSettings.php</code>\nà¹\80à¸\9eืà¹\88ออัà¸\9bà¹\80à¸\81รà¸\94à¸\81ารà¸\95ิà¸\94à¸\95ัà¹\89à¸\87à¸\99ีà¹\89 à¸\81รุà¸\93าà¸\94ำà¹\80à¸\99ิà¸\99à¸\87าà¸\99 <code>update.php</code> แทน",
-       "config-localsettings-key": "à¸\81ุà¸\8dà¹\81à¸\88อัปเกรด:",
-       "config-localsettings-badkey": "à¸\81ุà¸\8dà¹\81à¸\88à¸\97ีà¹\88à¸\84ุà¸\93à¸\81รอà¸\81ไม่ถูกต้อง",
-       "config-upgrade-key-missing": "ตรวจพบการติดตั้งมีเดียวิกิที่มีอยู่แล้ว\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": "à¸\84วามà¸\9cิà¸\94à¸\9eลาà¸\94à¹\80à¸\81ิà¸\94à¸\82ึà¹\89à¸\99à¹\80มืà¹\88อà¹\80à¸\8aืà¹\88อมà¸\95à¹\88อà¸\90าà¸\99à¸\82à¹\89อมูลà¹\82à¸\94ยà¹\83à¸\8aà¹\89à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\97ีà¹\88ระà¸\9aุà¹\83à¸\99 <code>LocalSettings.php</code> à¸\81รุà¸\93าà¹\81à¸\81à¹\89à¹\84à¸\82à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¹\80หลà¹\88าà¸\99ีà¹\89à¹\81ละลอà¸\87อีกครั้ง\n\n$1",
-       "config-session-error": "à¸\84วามผิดพลาดการเริ่มต้นช่วงเวลาสื่อสาร: $1",
-       "config-session-expired": "à¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารà¸\82อà¸\87à¸\84ุà¸\93à¸\94ูà¹\80หมือà¸\99วà¹\88าหมà¸\94อายุà¹\81ลà¹\89ว\nà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารà¸\96ูà¸\81à¸\95ัà¹\89à¸\87à¹\84วà¹\89à¹\83หà¹\89มีà¸\8aà¹\88วà¸\87อายุà¹\80à¸\9bà¹\87à¸\99 $1\nà¸\84ุà¸\93สามารà¸\96à¹\80à¸\9eิà¹\88มà¸\84à¹\88าสิà¹\88à¸\87à¸\99ีà¹\89à¹\82à¸\94ยà¸\81ำหà¸\99à¸\94 <code>session.gc_maxlifetime</code> à¹\83à¸\99 php.ini\nà¹\83หà¹\89à¹\80ริà¹\88มà¸\81ระà¸\9aวà¸\99à¸\81ารà¸\95ิà¸\94à¸\95ัà¹\89à¸\87อีกครั้ง",
-       "config-no-session": "à¸\82à¹\89อมูลà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารà¸\82อà¸\87à¸\84ุà¸\93สูà¸\8dหาย!\nà¹\83หà¹\89à¸\95รวà¸\88สอà¸\9a php.ini à¸\82อà¸\87à¸\84ุà¸\93à¹\81ละà¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88า <code>session.save_path</code> à¸\96ูà¸\81à¸\81ำหà¸\99à¸\94ไปยังไดเรกทอรีที่เหมาะสม",
+       "config-desc": "ตัวติดตั้ง MediaWiki",
+       "config-title": "การติดตั้ง MediaWiki $1",
+       "config-information": "à¸\82à¹\89อมูล",
+       "config-localsettings-upgrade": "à¸\95รวà¸\88à¸\9eà¸\9aà¹\84à¸\9fลà¹\8c <code>LocalSettings.php</code>\nà¹\80มืà¹\88อà¸\95à¹\89อà¸\87à¸\81ารอัà¸\9bà¹\80à¸\81รà¸\94à¸\81ารà¸\95ิà¸\94à¸\95ัà¹\89à¸\87à¸\99ีà¹\89 à¹\82à¸\9bรà¸\94à¸\9bà¹\89อà¸\99à¸\84à¹\88าà¸\82อà¸\87 <code>$wgUpgradeKey</code> à¹\83à¸\99à¸\81ลà¹\88อà¸\87à¸\94à¹\89าà¸\99ลà¹\88าà¸\87\nà¸\84ุà¸\93สามารà¸\96à¸\9eà¸\9aà¸\84à¹\88าà¸\99ีà¹\89ได้ใน <code>LocalSettings.php</code>",
+       "config-localsettings-cli-upgrade": "à¸\95รวà¸\88à¸\9eà¸\9aà¹\84à¸\9fลà¹\8c <code>LocalSettings.php</code>\nà¹\80มืà¹\88อà¸\95à¹\89อà¸\87à¸\81ารอัà¸\9bà¹\80à¸\81รà¸\94à¸\81ารà¸\95ิà¸\94à¸\95ัà¹\89à¸\87à¸\99ีà¹\89 à¹\82à¸\9bรà¸\94à¹\80รียà¸\81à¹\83à¸\8aà¹\89 <code>update.php</code> แทน",
+       "config-localsettings-key": "à¸\84ียà¹\8cอัปเกรด:",
+       "config-localsettings-badkey": "à¸\84ียà¹\8cอัà¸\9bà¹\80à¸\81รà¸\94à¸\97ีà¹\88à¸\84ุà¸\93ระà¸\9aุไม่ถูกต้อง",
+       "config-upgrade-key-missing": "ตรวจพบการติดตั้ง MediaWiki ที่มีอยู่แล้ว\nเมื่อต้องการอัปเกรดการติดตั้งนี้ โปรดใส่บรรทัดต่อไปนี้ที่ท้ายไฟล์\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": "à¹\80à¸\81ิà¸\94à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94à¸\82ึà¹\89à¸\99à¹\80มืà¹\88อà¹\80à¸\8aืà¹\88อมà¸\95à¹\88อà¸\90าà¸\99à¸\82à¹\89อมูลà¹\82à¸\94ยà¹\83à¸\8aà¹\89à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¸\97ีà¹\88ระà¸\9aุà¹\83à¸\99 <code>LocalSettings.php</code>\nà¹\82à¸\9bรà¸\94à¹\81à¸\81à¹\89à¹\84à¸\82à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าà¹\80หลà¹\88าà¸\99ีà¹\89à¹\81ลà¹\89วลอà¸\87à¹\83หมà¹\88อีกครั้ง\n\n$1",
+       "config-session-error": "à¸\82à¹\89อผิดพลาดการเริ่มต้นช่วงเวลาสื่อสาร: $1",
+       "config-session-expired": "à¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารà¸\82อà¸\87à¸\84ุà¸\93à¸\94ูà¹\80หมือà¸\99วà¹\88าหมà¸\94อายุà¹\81ลà¹\89ว\nà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารà¸\96ูà¸\81à¸\95ัà¹\89à¸\87à¹\84วà¹\89à¹\83หà¹\89มีà¸\8aà¹\88วà¸\87อายุà¹\80à¸\9bà¹\87à¸\99 $1\nà¸\84ุà¸\93สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82à¸\9bัà¸\8dหาà¸\99ีà¹\89à¹\84à¸\94à¹\89à¹\82à¸\94ยà¸\95ัà¹\89à¸\87à¸\84à¹\88า <code>session.gc_maxlifetime</code> à¹\83à¸\99 php.ini\nà¹\83หà¹\89à¹\80ริà¹\88มà¸\81ระà¸\9aวà¸\99à¸\81ารà¸\95ิà¸\94à¸\95ัà¹\89à¸\87à¹\83หมà¹\88อีกครั้ง",
+       "config-no-session": "à¸\82à¹\89อมูลà¸\8aà¹\88วà¸\87à¹\80วลาสืà¹\88อสารà¸\82อà¸\87à¸\84ุà¸\93สูà¸\8dหาย!\nà¹\83หà¹\89à¸\95รวà¸\88สอà¸\9a php.ini à¸\82อà¸\87à¸\84ุà¸\93à¹\81ละà¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88า <code>session.save_path</code> à¸\96ูà¸\81à¸\95ัà¹\89à¸\87à¸\84à¹\88าไปยังไดเรกทอรีที่เหมาะสม",
        "config-your-language": "ภาษาของคุณ:",
-       "config-your-language-help": "เลือกภาษาที่จะใช้ระหว่างกระบวนการติดตั้ง",
-       "config-wiki-language": "ภาษาวิกิ:",
-       "config-wiki-language-help": "เลือกภาษาที่จะใช้เขียนเป็นหลักในวิกิ",
+       "config-your-language-help": "à¹\82à¸\9bรà¸\94à¹\80ลือà¸\81ภาษาà¸\97ีà¹\88à¸\88ะà¹\83à¸\8aà¹\89ระหวà¹\88าà¸\87à¸\81ระà¸\9aวà¸\99à¸\81ารà¸\95ิà¸\94à¸\95ัà¹\89à¸\87",
+       "config-wiki-language": "ภาษาà¸\82อà¸\87วิà¸\81ิ:",
+       "config-wiki-language-help": "à¹\82à¸\9bรà¸\94à¹\80ลือà¸\81ภาษาà¸\97ีà¹\88à¸\88ะà¹\83à¸\8aà¹\89à¹\80à¸\82ียà¸\99à¹\80à¸\9bà¹\87à¸\99หลัà¸\81à¹\83à¸\99วิà¸\81ิ",
        "config-back": "← ย้อนกลับ",
        "config-continue": "ดำเนินการต่อ →",
        "config-page-language": "ภาษา",
-       "config-page-welcome": "ยินดีต้อนรับสู่มีเดียวิกิ!",
+       "config-page-welcome": "ยินดีต้อนรับสู่ MediaWiki!",
        "config-page-dbconnect": "เชื่อมต่อไปยังฐานข้อมูล",
        "config-page-upgrade": "อัปเกรดการติดตั้งที่มีอยู่",
        "config-page-dbsettings": "การตั้งค่าฐานข้อมูล",
        "config-page-name": "ชื่อ",
        "config-page-options": "ตัวเลือก",
        "config-page-install": "ติดตั้ง",
-       "config-page-complete": "สมบูรณ์!",
-       "config-page-restart": "เริ่มการติดตั้งอีกครั้ง",
+       "config-page-complete": "à¹\80สรà¹\87à¸\88สมà¸\9aูรà¸\93à¹\8c!",
+       "config-page-restart": "à¹\80ริà¹\88มà¸\81ารà¸\95ิà¸\94à¸\95ัà¹\89à¸\87à¹\83หมà¹\88อีà¸\81à¸\84รัà¹\89à¸\87",
        "config-page-readme": "อ่านเอกสารกำกับ",
        "config-page-releasenotes": "บันทึกการเผยแพร่",
        "config-page-copying": "การคัดลอก",
        "config-page-upgradedoc": "การอัปเกรด",
        "config-page-existingwiki": "วิกิที่มีอยู่",
-       "config-help-restart": "คุณต้องการล้างข้อมูลทั้งหมดที่คุณกรอกและเริ่มกระบวนการติดตั้งอีกครั้งหรือไม่?",
+       "config-help-restart": "à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารลà¹\89าà¸\87à¸\82à¹\89อมูลà¸\97ัà¹\89à¸\87หมà¸\94à¸\97ีà¹\88à¸\84ุà¸\93à¸\81รอà¸\81à¹\81ละà¹\80ริà¹\88มà¸\81ระà¸\9aวà¸\99à¸\81ารà¸\95ิà¸\94à¸\95ัà¹\89à¸\87à¹\83หมà¹\88อีà¸\81à¸\84รัà¹\89à¸\87หรือà¹\84มà¹\88?",
        "config-restart": "ใช่ เริ่มใหม่อีกครั้ง",
-       "config-welcome": "=== การตรวจสอบสภาพแวดล้อม ===\nการตรวจสอบเบื้องต้นจะกระทำขึ้นเพื่อดูว่าสภาพแวดล้อมนี้เหมาะสมสำหรับการติดตั้งมีเดียวิกิหรือไม่\nจำไว้ว่าให้รวบรวมสารสนเทศนี้ ถ้าคุณแสวงหาการสนับสนุนเพื่อที่จะติดตั้งให้สมบูรณ์",
-       "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คุณไม่สามารถติดตั้งมีเดียวิกิ",
-       "config-env-php": "PHP $1 ติดตั้งแล้ว",
-       "config-env-hhvm": "HHVM $1 ติดตั้งแล้ว",
+       "config-welcome": "=== การตรวจสอบสภาพแวดล้อม ===\nการตรวจสอบเบื้องต้นจะกระทำขึ้น เพื่อยืนยันว่าสภาพแวดล้อมปัจจุบันเหมาะสมสำหรับการติดตั้ง MediaWiki หรือไม่\nโปรดจำไว้ว่าให้รวบรวมผลลัพธ์การตรวจสอบนี้ ถ้าคุณต้องการแสวงหาการสนับสนุนเพื่อที่จะติดตั้งให้สมบูรณ์",
+       "config-copyright": "=== ลิขสิทธิ์และเงื่อนไข ===\n\n$1\n\nโปรแกรมนี้เป็นซอฟต์แวร์เสรี คุณสามารถนำโปรแกรมนี้มาเผยแพร่ซ้ำและ/หรือดัดแปลงได้ภายใต้เงื่อนไขของสัญญาอนุญาตสาธารณะทั่วไปของ GNU (GNU General Public License) ซึ่งเผยแพร่โดย Free Software Foundation (สัญญาอนุญาตรุ่น 2 ขึ้นไป)\n\nโปรแกรมนี้ถูกเผยแพร่โดยหวังว่าจะเป็นประโยชน์แก่ผู้ใช้ แต่<strong>จะไม่มีการรับประกันใด ๆ</strong> แม้แต่การรับประกันเกี่ยวกับ<strong>การนำไปใช้ในการซื้อขาย</strong> หรือ<strong>ความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ</strong>\nสำหรับรายละเอียดเพิ่มเติม โปรดดูที่สัญญาอนุญาตสาธารณะทั่วไปของ GNU\n\nคุณควรได้รับ<doclink href=Copying>สำเนาของสัญญาอนุญาตสาธารณะทั่วไปของ GNU</doclink> มาพร้อมกับโปรแกรมนี้ ถ้าไม่ได้รับ ให้ขอได้ที่ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, \nหรือ[http://www.gnu.org/copyleft/gpl.html อ่านออนไลน์ที่นี่]",
+       "config-sidebar": "* [https://www.mediawiki.org โฮมเพจของ MediaWiki]\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คุณสามารถติดตั้ง MediaWiki",
+       "config-env-bad": "ตรวจสอบสภาพแวดล้อมแล้ว\nคุณไม่สามารถติดตั้ง MediaWiki",
+       "config-env-php": "มี PHP $1 ติดตั้งอยู่",
+       "config-env-hhvm": "มี HHVM $1 ติดตั้งอยู่",
+       "config-unicode-using-intl": "ใช้[http://pecl.php.net/intl ส่วนขยาย intl PECL] สำหรับการปรับ Unicode เข้าสู่รูปปกติ (Unicode normalization)",
+       "config-unicode-pure-php-warning": "<strong>คำเตือน:</strong> [http://pecl.php.net/intl intl ส่วนขยาย PECL] ไม่พร้อมใช้งานสำหรับการจัดมาตรฐาน Unicode กำลังกลับไปใช้ PHP ที่แท้จริงแบบช้า\nถ้าคุณเปิดดำเนินการไซต์ที่มีปริมาณการใช้งานสูง คุณควรอ่านดูเกี่ยวกับ[https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations การจัดมาตรฐาน Unicode] สักเล็กน้อย",
+       "config-no-db": "ไม่พบไดรเวอร์ฐานข้อมูลที่เหมาะสม! คุณจำเป็นต้องติดตั้งไดรเวอร์ฐานข้อมูลสำหรับ PHP\nชนิดฐานข้อมูลต่อไปนี้ได้รับการสนับสนุน: $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": "<strong>คำเตือน:</strong> 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-pcre-no-utf8": "<strong>ข้อผิดพลาดร้ายแรง:</strong> โมดูล PCRE ของ PHP ดูเหมือนจะถูกคอมไพล์โดยไม่มีการรองรับ PCRE_UTF8\nMediaWiki ต้องการการรองรับ UTF-8 เพื่อให้ทำงานได้อย่างถูกต้อง",
        "config-memory-raised": "<code>memory_limit</code> ของ PHP คือ $1 ได้เพิ่มเป็น $2",
        "config-memory-bad": "<strong>คำเตือน:</strong> <code>memory_limit</code> ของ PHP คือ $1.\nเป็นไปได้ว่ามันอาจต่ำเกินไป\nการติดตั้งอาจล้มเหลวได้!",
-       "config-xcache": "[http://xcache.lighttpd.net/ XCache] ติดตั้งแล้ว",
-       "config-apc": "[http://www.php.net/apc APC] ติดตั้งแล้ว",
-       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ติดตั้งแล้ว",
-       "config-mod-security": "<strong>คำเตือน:</strong> เว็บเซิร์ฟเวอร์ของคุณมี [http://modsecurity.org/ mod_security]/mod_security2 เปิดใช้งานอยู่ การตั้งค่าทั่วไปหลายอย่างของสิ่งนี้จะก่อให้เกิดปัญหาสำหรับมีเดียวิกิ และซอฟต์แวร์อื่นที่อนุญาตให้ผู้ใช้สามารถโพสต์เนื้อหาได้ตามใจ\nหากเป็นไปได้ สิ่งนี้ควรปิดใช้งาน หรือมิฉะนั้นก็ อ้างไปยัง[http://modsecurity.org/documentation/ เอกสารกำกับการใช้งาน mod_security] หรือติดต่อการสนับสนุนจากโฮสต์ของคุณ ถ้าคุณพบความผิดพลาดโดยสุ่ม",
+       "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]\nการแคชวัตถุไม่ได้ถูกเปิดใช้งาน",
+       "config-mod-security": "<strong>คำเตือน:</strong> เว็บเซิร์ฟเวอร์ของคุณมี [http://modsecurity.org/ mod_security]/mod_security2 เปิดใช้งานอยู่ การตั้งค่าทั่วไปหลายอย่างของสิ่งนี้จะก่อให้เกิดปัญหาสำหรับ MediaWiki และซอฟต์แวร์อื่นที่อนุญาตให้ผู้ใช้สามารถโพสต์เนื้อหาได้ตามที่ผู้ใช้\nหากเป็นไปได้ ควรปิดใช้งานคุณลักษณะนี้ หรือมิฉะนั้นก็ อ้างไปยัง[http://modsecurity.org/documentation/ เอกสารกำกับการใช้งาน mod_security] หรือติดต่อการสนับสนุนจากโฮสต์ของคุณ ถ้าคุณพบข้อผิดพลาดโดยสุ่ม",
        "config-diff3-bad": "ไม่พบ GNU diff3",
        "config-git": "พบซอฟต์แวร์ควบคุมรุ่น Git: <code>$1</code>",
        "config-git-bad": "ไม่พบซอฟต์แวร์ควบคุมรุ่น Git",
        "config-imagemagick": "พบ ImageMagick: <code>$1</code>\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด",
-       "config-gd": "à¸\9eà¸\9aà¹\84ลà¸\9aรารีà¸\81ราà¸\9fิà¸\81 GD à¸ à¸²à¸¢à¹\83à¸\99\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด",
+       "config-gd": "à¸\9eà¸\9aà¹\84ลà¸\9aรารีà¸\81ราà¸\9fิà¸\81 GD à¹\83à¸\99à¸\95ัว\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด",
        "config-no-scaling": "ไม่พบไลบรารี GD หรือ ImageMagick\nการย่อรูปภาพจะถูกปิดใช้งาน",
+       "config-no-uri": "<strong>ข้อผิดพลาด:</strong> ไม่สามารถทำการตรวจสอบ URI ปัจจุบันได้\nการติดตั้งถูกยกเลิกแล้ว",
+       "config-no-cli-uri": "<strong>คำเตือน:</strong> ไม่ได้ระบุ <code>--scriptpath</code> กำลังใช้ค่าเริ่มต้น: <code>$1</code>",
        "config-using-server": "ใช้ชื่อเซิร์ฟเวอร์ \"<nowiki>$1</nowiki>\"",
        "config-using-uri": "ใช้ยูอาร์แอลของเซิร์ฟเวอร์ \"<nowiki>$1$2</nowiki>\"",
-       "config-mysql-innodb": "อินโนดีบี",
-       "config-mysql-myisam": "มายไอแซม",
+       "config-uploads-not-safe": "<strong>คำเตือน:</strong> ไดเรกทอรีเริ่มต้นของคุณสำหรับการอัปโหลด <code>$1</code> มีช่องโหว่ที่มีต่อการดำเนินการสคริปต์ด้วยตัวเอง\nถึงแม้ว่า MediaWiki จะมีการตรวจสอบช่องโหว่ด้านความปลอดภัยในไฟล์ที่อัปโหลดทั้งหมด แต่ขอแนะนำอย่างยิ่งว่าให้[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security ปิดช่องโหว่ด้านความปลอดภัยนี้]ก่อนเปิดใช้งานการอัปโหลด",
+       "config-no-cli-uploads-check": "<strong>คำเตือน:</strong> ไดเรกทอรีสำหรับอัปโหลดเริ่มต้นของคุณ (<code>$1</code>) ยังไม่ได้ถูกตรวจสอบช่องโหว่ด้านความปลอดภัย\nที่มีต่อการดำเนินการสคริปต์เองระหว่างการติดตั้ง CLI",
+       "config-brokenlibxml": "การใช้รุ่น PHP และ libxml2 ร่วมกันในระบบของคุณเป็นคู่รุ่นที่มีบักมากและอาจทำให้เกิดการเสียหายของข้อมูลแอบแฝงอยู่ใน MediaWiki และเว็บแอปพลิเคชั่นอื่นๆ ได้\nอัปเกรดเป็น libxml2 2.7.3 หรือสูงกว่า ([https://bugs.php.net/bug.php?id=45996 บักที่รายงานด้วย PHP])\nการติดตั้งถูกยกเลิกแล้ว",
+       "config-suhosin-max-value-length": "Suhosin ถูกติดตั้งแล้วและจำกัด<code>ความยาว</code>พารามิเตอร์ GET เป็น $1 ไบต์\nองค์ประกอบ ResourceLoader ของ MediaWiki จะยังคงทำงานภายใต้การจำกัดนี้ แต่อาจลดระดับประสิทธิภาพลงได้\nถ้าเป็นไปได้ คุณควรตั้ง <code>suhosin.get.max_value_length</code> เป็น 1024 หรือสูงกว่าใน <code>php.ini</code> และตั้งค่า <code>$wgResourceLoaderMaxQueryLength</code> ให้เป็นค่าเดียวกับใน <code>LocalSettings.php</code>",
+       "config-db-type": "ชนิดฐานข้อมูล:",
+       "config-db-host": "โฮสต์ฐานข้อมูล:",
+       "config-db-host-help": "ถ้าเซิร์ฟเวอร์ฐานข้อมูลของคุณอยู่บนเซิร์ฟเวอร์อื่น ให้ป้อนชื่อโฮสต์หรือที่อยู่ IP ที่นี่\n\nถ้าคุณกำลังใช้งานโฮสต์เว็บที่ใช้ร่วมกัน ผู้ให้บริการโฮสต์ควรให้ชื่อโฮสต์ที่ถูกต้องแก่คุณในเอกสารคู่มือ\n\nถ้าคุณกำลังติดตั้งบนเซิร์ฟเวอร์ Windows และกำลังใช้ MySQL การใช้ \"localhost\" อาจไม่สามารถใช้ได้สำหรับชื่อเซิร์ฟเวอร์ ถ้าไม่สามารถใช้ได้ ให้ลองใช้ \"127.0.0.1\" สำหรับที่อยู่ IP เฉพาะที่",
+       "config-db-host-oracle": "TNS ฐานข้อมูล:",
+       "config-db-host-oracle-help": "ป้อน [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] ที่ถูกต้อง; ไฟล์ tnsnames.ora ต้องสามารถมองเห็นได้โดยการติดตัั้งนี้<br />ถ้าคุณกำลังใช้ไลบรารีไคลเอนต์ 10g หรือใหม่กว่า คุณก็สามารถใช้วิธีการตั้งชื่อแบบ [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] ได้เช่นกัน",
+       "config-db-wiki-settings": "ระบุวิกินี้",
+       "config-db-name": "ชื่อฐานข้อมูล:",
+       "config-db-name-help": "เลือกชื่อที่ระบุวิกิของคุณ\nชื่อไม่ควรมีช่องว่าง\n\nถ้าคุณกำลังใช้โฮสต์เว็บที่ใช้ร่วมกัน ผู้ให้บริการโฮสต์ของคุณจะระบุชื่อฐานข้อมูลให้คุณ หรือให้คุณสร้างฐานข้อมูลโดยใช้แผงควบคุม",
+       "config-db-name-oracle": "แบบแผนฐานข้อมูล:",
+       "config-db-account-oracle-warn": "มีสถานการณ์สมมติสามสถานการณ์ที่สนับสนุนสำหรับการติดตั้ง Oracle เป็นแบ็กเอนด์ฐานข้อมูล:\n\nถ้าคุณต้องการสร้างบัญชีฐานข้อมูลเป็นส่วนหนึ่งของกระบวนการติดตั้ง โปรดจัดหาบัญชีที่มีบทบาท SYSDBA เป็นบัญชีฐานข้อมูลสำหรับการติดตั้งและระบุข้อมูลประจำตัวที่ต้องการสำหรับบัญชีการเข้าถึงเว็บ หรือคุณสามารถสร้างบัญชีการเข้าถึงเว็บด้วยตนเองและจัดหาเฉพาะบัญชีนั้น (ถ้ามีสิทธิ์ที่ต้องการในการสร้างวัตถุแบบแผน) หรือจัดหาบัญชีสองบัญชี โดยบัญชีหนึ่งใช้สร้างสิทธิ์ และบัญชีที่จำกัดอีกบัญชีหนึ่งสำหรับการเข้าถึงเว็บ\n\nสคริปต์ที่ใช้สำหรับการสร้างบัญชีพร้อมสิทธิ์ที่ต้องการสามารถพบได้ในไดเรกทอรี \"maintenance/oracle/\" ของการติดตั้งนี้\nอย่าลืมว่าการใช้บัญชีที่จำกัดจะเป็นการปิดใช้งานความสามารถในการบำรุงรักษาทั้งหมดด้วยบัญชีเริ่มต้น",
+       "config-db-install-account": "บัญชีผู้ใช้สำหรับการติดตั้ง",
+       "config-db-username": "ชื่อผู้ใช้ฐานข้อมูล:",
+       "config-db-password": "รหัสผ่านฐานข้อมูล:",
+       "config-db-install-username": "ป้อนชื่อผู้ใช้ที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างกระบวนการติดตั้ง\nชื่อผู้ใช้นี้ไม่ใช่ชื่อผู้ใช้สำหรับบัญชี MediaWiki แต่เป็นชื่อผู้ใช้สำหรับฐานข้อมูลของคุณ",
+       "config-db-install-password": "ป้อนรหัสผ่านที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างกระบวนการติดตั้ง\nรหัสผ่านนี้ไม่ใช่รหัสผ่านสำหรับบัญชี MediaWiki แต่เป็นรหัสผ่านสำหรับฐานข้อมูลของคุณ",
+       "config-db-install-help": "ป้อนชื่อผู้ใช้และรหัสผ่านที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างกระบวนการติดตั้ง",
+       "config-db-account-lock": "ใช้ชื่อผู้ใช้และรหัสผ่านเดียวกันในระหว่างการใช้งานปกติ",
+       "config-db-wiki-account": "บัญชีผู้ใช้สำหรับการใช้งานปกติ",
+       "config-db-wiki-help": "ป้อนชื่อผู้ใช้และรหัสผ่านที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างการใช้งานวิกิตามปกติ\nถ้าไม่มีบัญชีอยู่ และบัญชีการติดตั้งมีสิทธิ์เพียงพอ บัญชีผู้ใช้นี้จะถูกสร้างพร้อมสิทธิ์ขั้นต่ำที่จำเป็นต้องใช้ดำเนินการกับวิกิ",
+       "config-db-prefix": "คำนำหน้าตารางฐานข้อมูล:",
+       "config-db-prefix-help": "ถ้าคุณต้องการใช้ฐานข้อมูลเดียวร่วมกันระหว่างหลายวิกิ หรือระหว่าง MediaWiki กับเว็บแอปพลิเคชันอื่นๆ คุณอาจต้องเลือกเพิ่มคำนำหน้าให้กับชื่อตารางทั้งหมดเพื่อป้องกันความขัดแย้ง\nอย่าใช้ช่องว่าง\n\nโดยปกติ เขตข้อมูลนี้มักจะถูกปล่อยให้ว่างเปล่า",
+       "config-mysql-old": "จำเป็นต้องใช้ MySQL $1 หรือสูงกว่า คุณมี $2",
+       "config-db-port": "พอร์ตฐานข้อมูล:",
+       "config-db-schema": "แบบแผนสำหรับ MediaWiki:",
+       "config-db-schema-help": "โดยปกติ แบบแผนนี้จะไม่มีปัญหาใดๆ อยู่แล้ว\nเปลี่ยนเฉพาะก็ต่อเมื่อคุณรู้ว่าคุณจำเป็นต้องดำเนินการนี้",
+       "config-pg-test-error": "ไม่สามารถเชื่อมต่อไปยังฐานข้อมูล <strong>$1</strong>: $2",
+       "config-sqlite-dir": "ไดเรกทอรีข้อมูล SQLite:",
+       "config-sqlite-dir-help": "SQLite จัดเก็บข้อมูลทั้งหมดในไฟล์เดียว\n\nไดเรกทอรีที่คุณระบุจะต้องสามารถเขียนได้โดยเว็บเซิร์ฟเวอร์ระหว่างการติดตั้ง\n\nไดเรกทอรีดังกล่าว<strong>ไม่</strong>ควรสามารถเข้าถึงได้ผ่านเว็บ นี่คือเหตุผลที่เราไม่นำไฟล์ข้อมูลดังกล่าวไปไว้ในตำแหน่งที่มีไฟล์ PHP ของคุณอยู่\n\nโปรแกรมติดตั้งจะเขียนไฟล์ <code>.htaccess</code> ไปพร้อมกับไฟล์ข้อมูลดังกล่าว แต่ถ้าเกิดความล้มเหลว ทุกคนจะสามารถเข้าถึงฐานข้อมูลดิบของคุณได้\nซึ่งรวมถึงข้อมูลผู้ใช้ดิบ (ที่อยู่อีเมล ข้อมูลแฮช) รวมถึงรุ่นปรับปรุงที่ถูกลบไปแล้ว และข้อมูลที่ถูกจำกัดอื่นๆ บนวิกิ\n\nให้พิจารณานำฐานข้อมูลไปไว้ในตำแหน่งอื่น ตัวอย่างเช่น ใน <code>/var/lib/mediawiki/yourwiki</code>",
+       "config-oracle-def-ts": "พื้นที่ตารางเริ่มต้น:",
+       "config-oracle-temp-ts": "พื้นที่ตารางชั่วคราว:",
+       "config-type-mysql": "MySQL (หรือที่เข้ากันได้)",
+       "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 Server] ซึ่งเข้ากันได้กับ 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])",
+       "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] คือฐานข้อมูลสำหรับองค์กรพาณิชย์สำหรับ Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php วิธีการคอมไพล์ PHP ด้วยการสนับสนุน SQLSRV])",
+       "config-header-mysql": "การตั้งค่า MySQL",
+       "config-header-postgres": "การตั้งค่า PostgreSQL",
+       "config-header-sqlite": "การตั้งค่า SQLite",
+       "config-header-oracle": "การตั้งค่า Oracle",
+       "config-header-mssql": "การตั้งค่า Microsoft SQL Server",
+       "config-invalid-db-type": "ชนิดฐานข้อมูลไม่ถูกต้อง",
+       "config-missing-db-name": "คุณต้องป้อนค่าสำหรับ \"{{int:config-db-name}}\"",
+       "config-missing-db-host": "คุณต้องป้อนค่าสำหรับ \"{{int:config-db-host}}\"",
+       "config-missing-db-server-oracle": "คุณต้องป้อนค่าสำหรับ \"{{int:config-db-host-oracle}}\"",
+       "config-invalid-db-server-oracle": "TNS ฐานข้อมูล \"$1\" ไม่ถูกต้อง\nให้ใช้สตริง \"ชื่อ TNS\" หรือ \"Easy Connect\"\n ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm วิธีการตั้งชื่อของ Oracle])",
+       "config-invalid-db-name": "ชื่อฐานข้อมูล \"$1\" ไม่ถูกต้อง\nให้ใช้เฉพาะอักษร ASCII (a-z, A-Z) ตัวเลข (0-9) ขีดล่าง (_) และยัติภังค์ (-)",
+       "config-invalid-db-prefix": "คำนำหน้าฐานข้อมูล \"$1\" ไม่ถูกต้อง\nให้ใช้เฉพาะอักษร ASCII (a-z, A-Z) ตัวเลข (0-9) ขีดล่าง (_) และยัติภังค์ (-)",
+       "config-connection-error": "$1\n\nตรวจสอบโฮสต์ ชื่อผู้ใช้และรหัสผ่าน และลองอีกครั้ง",
+       "config-invalid-schema": "แบบแผนสำหรับ MediaWiki \"$1\" ไม่ถูกต้อง\nให้ใช้เฉพาะอักษร ASCII (a-z, A-Z) ตัวเลข (0-9) และขีดล่าง (_)",
+       "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 Server $1 หรือสูงกว่า คุณมี $2.",
+       "config-sqlite-name-help": "เลือกชื่อที่จะระบุวิกิของคุณ\nอย่าใช้ช่องว่างหรือยัติภังค์\nชื่อนี้จะถูกใช้สำหรับชื่อไฟล์ข้อมูล SQLite",
+       "config-sqlite-parent-unwritable-group": "ไม่สามารถสร้างไดเรกทอรีข้อมูล <code><nowiki>$1</nowiki></code> ได้ เนื่องจากไดเรกทอรีหลัก <code><nowiki>$2</nowiki></code> ไม่สามารถเขียนได้โดยเว็บเซิร์ฟเวอร์\n\nโปรแกรมติดตั้งได้ทำการตรวจสอบแล้วว่าเว็บเซิร์ฟเวอร์ของคุณกำลังทำงานในฐานะผู้ใช้ใด\nทำให้ไดเรกทอรี <code><nowiki>$3</nowiki></code> สามารถเขียนโดยผู้ใช้ดังกล่าวได้เพื่อดำเนินการต่อ\nถ้าคุณใช้ระบบ Unix/Linux ให้่ทำเช่นนี้:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "ไม่สามารถสร้างไดเรกทอรีข้อมูล <code><nowiki>$1</nowiki></code> ได้ เนื่องจากไดเรกทอรีหลัก <code><nowiki>$2</nowiki></code> ไม่สามารถเขียนได้โดยเว็บเซิร์ฟเวอร์\n\nโปรแกรมติดตั้งไม่สามารถทำการตรวจสอบได้ว่าเว็บเซิร์ฟเวอร์ของคุณกำลังทำงานในฐานะผู้ใช้ใด\nทำให้ไดเรกทอรี <code><nowiki>$3</nowiki></code> สามารถเขียนโดยส่วนกลาง (ุผู้ใช้ดังกล่าว รวมถึงคนอื่นๆ ด้วย!) ได้เพื่อดำเนินการต่อ\nถ้าคุณใช้ระบบ Unix/Linux ให้่ทำเช่นนี้:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-mkdir-error": "ไม่สามารถสร้างไดเรกทอรีข้อมูล \"$1\" ได้\nให้ตรวจสอบตำแหน่งที่ตั้ง และลองอีกครั้ง",
+       "config-sqlite-dir-unwritable": "ไม่สามารถเขียนข้อมูลลงในไดเรกทอรี \"$1\" ได้\nให้เปลี่ยนสิทธิ์ เพื่อให้เว็บเซิร์ฟเวอร์สามารถเขียนข้อมูลลงในไดเรกทอรีดังกล่าวได้ และลองอีกครั้ง",
+       "config-sqlite-connection-error": "$1\n\nตรวจสอบไดเรกทอรีข้อมูลและชื่อฐานข้อมูลด้านล่าง และลองอีกครั้ง",
+       "config-sqlite-readonly": "ไม่สามารถเขียนไฟล์ <code>$1</code> ได้",
+       "config-sqlite-cant-create-db": "ไม่สามารถสร้างไฟล์ฐานข้อมูล <code>$1</code> ได้",
+       "config-sqlite-fts3-downgrade": "PHP กำลังขาดการสนับสนุน FTS3 กำลังดาวน์เกรดตารางข้อมูล",
+       "config-can-upgrade": "มีตารางข้อมูล MediaWiki tables ในฐานข้อมูลนี้\nเมื่อต้องการอัปเกรดตารางข้อมูลเหล่านั้นไปเป็น MediaWiki $1 ให้คลิก <strong>ดำเนินการต่อ</strong>",
+       "config-upgrade-done": "การอัปเกรดเสร็จสมบูรณ์\n\nคุณสามารถ[$1 เริ่มใช้วิกิของคุณ]ได้ในขณะนี้\n\nถ้าคุณต้องการสร้างไฟล์ <code>LocalSettings.php</code> ของคุณใหม่ ให้คลิกปุ่มด้านล่างนี้\n<strong>ไม่แนะนำ</strong>ให้ดำเนินการนี้นอกจากว่าคุณกำลังมีปัญหากับวิกิของคุณ",
+       "config-upgrade-done-no-regenerate": "การอัปเกรดเสร็จสมบูรณ์\n\nคุณสามารถ[$1 เริ่มใช้วิกิของคุณ]ได้ในขณะนี้",
+       "config-regenerate": "สร้าง LocalSettings.php ใหม่ →",
+       "config-show-table-status": "คิวรี <code>SHOW TABLE STATUS</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-engine": "กลไกที่จัดเก็บข้อมูล:",
+       "config-mysql-innodb": "InnoDB",
+       "config-mysql-myisam": "MyISAM",
+       "config-mysql-myisam-dep": "<strong>คำเตือน:</strong> คุณได้เลือก MyISAM เป็นกลไกที่จัดเก็บข้อมูลสำหรับ MySQL ซึ่่งไม่แนะนำให้ใช้กับ MediaWiki เนื่องจาก:\n* ไม่ค่อยสนับสนุนกระบวนการทำงานพร้อมกันเนื่องจากการล็อกตารางข้อมูล\n* มีแนวโน้มที่จะเสียหายมากกว่ากลไกอื่น\n* Codebase ของ MediaWiki ไม่สามารถจัดการ MyISAM ได้ดีเท่าที่ควร\n\nถ้าการติดตั้ง MySQL ของคุณสนับสนุน InnoDB แนะนำอย่างยิ่งว่าให้คุณเลือก InnoDB แทน\nถ้าการติดตั้ง MySQL ของคุณไม่สนับสนุน InnoDB อาจถึงเวลาที่คุณต้องอัปเกรดแล้ว",
+       "config-mysql-only-myisam-dep": "<strong>คำเตือน:</strong> กลไกที่จัดเก็บข้อมูลสำหรับ MySQL ที่พร้อมใช้งานบนเครื่องนี้มีเพียง MyISAM ซึ่่งไม่แนะนำให้ใช้กับ MediaWiki เนื่องจาก:\n* ไม่ค่อยสนับสนุนกระบวนการทำงานพร้อมกันเนื่องจากการล็อกตารางข้อมูล\n* มีแนวโน้มที่จะเสียหายมากกว่ากลไกอื่น\n* Codebase ของ MediaWiki ไม่สามารถจัดการ MyISAM ได้ดีเท่าที่ควร\n\nการติดตั้ง MySQL ของคุณไม่สนับสนุน InnoDB อาจถึงเวลาที่คุณต้องอัปเกรดแล้ว",
+       "config-mysql-engine-help": "<strong>InnoDB</strong> เป็นตัวเลือกที่เกือบดีที่สุดเสมอ เนื่องจากมีการสนับสนุนกระบวนการทำงานพร้อมกัน\n\n<strong>MyISAM</strong> อาจทำงานได้เร็วกว่าในการติดตั้งแบบผู้ใช้คนเดียวหรือแบบอ่านอย่างเดียว\nฐานข้อมูล MyISAM มักจะได้รับความเสียหายบ่อยมากกว่าฐานข้อมูล InnoDB",
+       "config-mysql-charset": "ชุดอักขระของฐานข้อมูล:",
        "config-mysql-binary": "ไบนารี",
-       "config-mysql-utf8": "ยูทีเอฟ-8",
+       "config-mysql-utf8": "UTF-8",
+       "config-mysql-charset-help": "ใน<strong>โหมดไบนารี</strong> MediaWiki จะจัดเก็บข้อความ UTF-8 ไว้ในฐานข้อมูลในเขตข้อมูลไบนารี\nการใช้โหมดไบนารีจะมีประสิทธิภาพมากกว่าการใช้โหมด UTF-8 ของ MySQL และจะอนุญาตให้คุณสามารถใช้อักขระที่มีใน Unicode ได้หมดทุกช่วง\n\nใน<strong>โหมด UTF-8</strong> MySQL จะทราบว่าข้อมูลของคุณอยู่ในชุดอักขระได้ และจะสามารถเสนอและแปลงข้อมูลดังกล่าวได้อย่างเหมาะสม แต่จะไม่อนุญาตให้คุณจัดเก็บข้อมูลที่มีอักขระนอกเหนือจากในช่วง[https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes เพลนหลายภาษาพื้นฐาน]",
+       "config-mssql-auth": "ชนิดการยืนยันตัวตน:",
+       "config-mssql-install-auth": "เลือกชนิดการยืนยันตัวตนที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างกระบวนการติดตั้ง\nถ้าคุณเลือก \"{{int:config-mssql-windowsauth}}\" ข้อมูลประจำตัวที่ระบุว่าเว็บเซิร์ฟเวอร์กำลังทำงานในฐานะผู้ใช้ใดจะถูกใช้",
+       "config-mssql-web-auth": "เลือกชนิดการยืนยันตัวตนที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างการใช้งานวิกิตามปกติ\nถ้าคุณเลือก \"{{int:config-mssql-windowsauth}}\" ข้อมูลประจำตัวที่ระบุว่าเว็บเซิร์ฟเวอร์กำลังทำงานในฐานะผู้ใช้ใดจะถูกใช้",
+       "config-mssql-sqlauth": "การยืนยันตัวตนโดย SQL Server",
+       "config-mssql-windowsauth": "การยืนยันตัวตนโดย Windows",
        "config-site-name": "ชื่อของวิกิ:",
+       "config-site-name-help": "ชื่อนี้จะปรากฏในแถบชื่อเรื่องของเบราว์เซอร์และในที่อื่นๆ อีกหลายแห่ง",
+       "config-site-name-blank": "ป้อนชื่อไซต์",
+       "config-project-namespace": "เนมสเปซโครงการ:",
        "config-ns-generic": "โครงการ",
+       "config-ns-site-name": "เหมือนกับชื่อวิกิ: $1",
+       "config-ns-other": "อื่นๆ (ระบุ)",
        "config-ns-other-default": "วิกิของฉัน",
-       "config-admin-box": "บัญชีผู้ดูแลระบบ",
+       "config-project-namespace-help": "ตามตัวอย่างในวิกิพีเดีย วิกิหลายแห่งจะแยกหน้านโยบายออกจากหน้าเนื้อหาต่างๆ ใน '''เนมสเปซโครงการ'''\nชื่อเรื่องหน้าทั้งหมดในเนมสเปซนี้จะขึ้นต้นด้วยคำนำหน้าบางคำ ซึ่งคุณสามารถระบุได้ที่นี่\nโดยปกติ คำนำหน้านี้จะถูกสืบทอดมาจากชื่อของวิกิ แต่ไม่สามารถมีอักขระเครื่องหมายวรรคตอนได้ เช่น \"#\" หรือ \":\"",
+       "config-ns-invalid": "เนมสเปซ \"<nowiki>$1</nowiki>\" ที่ระบุไม่ถูกต้อง\nระบุเนมสเปซโครงการอื่น",
+       "config-ns-conflict": "เนมสเปซ \"<nowiki>$1</nowiki>\" ที่ระบุขัดแย้งกับเนมสเปซเริ่มต้นของ MediaWiki\nระบุเนมสเปซโครงการอื่น",
+       "config-admin-box": "บัญชีผู้ดูแล",
        "config-admin-name": "ชื่อผู้ใช้ของคุณ:",
        "config-admin-password": "รหัสผ่าน:",
        "config-admin-password-confirm": "รหัสผ่านอีกครั้ง:",
+       "config-admin-help": "ป้อนชื่อผู้ใช้ที่ต้องการของคุณที่นี่ ตัวอย่างเช่น \"Joe Bloggs\"\nชื่อนี้จะเป็นชื่อที่คุณจะใช้สำหรับเข้าสู่ระบบวิกิ",
+       "config-admin-name-blank": "ป้อนชื่อผู้ใช้ของผู้ดูแล",
+       "config-admin-name-invalid": "ชื่อผู้ใช้ \"<nowiki>$1</nowiki>\" ที่ระบุไม่ถูกต้อง\nระบุชื่อผู้ใช้อื่น",
+       "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-help": "รายชื่อนี้เป็นรายชื่อผู้รับจดหมายที่มีปริมาณต่ำสำหรับแจ้งข่าวเกี่ยวกับการประกาศการออกรุ่น รวมถึงการประกาศความปลอดภัยที่สำคัญ\nคุณควรสมัครรับข้อมูล และทำการอัปเดตการติดตั้ง MediaWiki ของคุณเมื่อมีรุ่นใหม่ออกมา",
+       "config-subscribe-noemail": "คุณได้พยายามสมัครรับข้อมูลกับรายชื่อผู้รับจดหมายการประกาศการออกรุ่นโดยไม่ได้ระบุที่อยู่อีเมล\nโปรดระบุที่อยู่อีเมล ถ้าคุณต้องการสมัครรับข้อมูลกับรายชื่อผู้รับจดหมาย",
+       "config-pingback": "แบ่งปันข้อมูลเกี่ยวกับการติดตั้งนี้ให้กับผู้พัฒนา MediaWiki",
+       "config-almost-done": "คุณใกล้จะเสร็จสมบูรณ์แล้ว!\nคุณสามารถข้ามการกำหนดค่าที่เหลืออยู่และติดตั้งวิกิได้ในขณะนี้",
        "config-optional-continue": "ถามคำถามฉันอีก",
+       "config-optional-skip": "ฉันเบื่อแล้ว ติดตั้งวิกิให้ฉันเถอะ",
+       "config-profile": "โปรไฟล์สิทธิ์ผู้ใช้:",
+       "config-profile-wiki": "วิกิเปิด",
+       "config-profile-no-anon": "จำเป็นต้องสร้างบัญชี",
+       "config-profile-fishbowl": "เฉพาะผู้แก้ไขที่ได้รับอนุญาตเท่านั้น",
+       "config-profile-private": "วิกิส่วนตัว",
+       "config-profile-help": "วิกิต่างๆ จะใช้งานได้ดีที่สุดถ้าคุณเปิดให้หลายๆ คนร่วมแก้ไขวิกิของคุณได้มากเท่าที่จะได้\nใน MediaWiki มันง่ายที่จะตรวจทานการแก้ไขล่าสุด และแปลงกลับความเสียหายใดๆ ที่ถูกกระทำโดยผู้ใช้ที่ไม่มีมารยาทหรือที่เป็นอันตราย\n\nอย่างไรก็ตาม หลายคนได้พบว่า MediaWiki to be useful มีประโยชน์ในหลากหลายบทบาท และในบางครั้งมันไม่ง่ายที่จะทำให้ทุกๆ คนเชื่อว่า MediaWiki นั้นมีประโยชน์ในทางวิกิ\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": "Creative Commons Attribution-ShareAlike",
+       "config-license-cc-by": "Creative Commons Attribution",
+       "config-license-cc-by-nc-sa": "Creative Commons Attribution-NonCommercial-ShareAlike",
+       "config-license-cc-0": "Creative Commons Zero (สาธารณสมบัติ)",
+       "config-license-gfdl": "GNU Free Documentation License 1.3 หรือสูงกว่า",
        "config-license-pd": "สาธารณสมบัติ",
+       "config-license-cc-choose": "เลือกสัญญาอนุญาต Creative Commons เอง",
        "config-extensions": "ส่วนขยาย",
        "config-install-step-done": "เสร็จสิ้น",
        "config-install-step-failed": "ล้มเหลว",
index 823b1ba..c3a7539 100644 (file)
@@ -16,7 +16,8 @@
                        "Meelo",
                        "HakanIST",
                        "McAang",
-                       "Elftrkn"
+                       "Elftrkn",
+                       "Vito Genovese"
                ]
        },
        "config-desc": "MediaWiki yükleyicisi",
@@ -57,7 +58,7 @@
        "config-restart": "Evet, yeniden başlat",
        "config-welcome": "===Ortam Kontrolleri===\nOrtamın Mediawiki kurulumuna uygun olup olmadığını anlamak için basit kontroller yapılacak.\nKurulumu nasıl tamamlayacağınız konusunda destek isterken bu bilgileri eklemeyi unutmayın.",
        "config-copyright": "=== Telif Hakları ve Koşulları ===\n\n$1\n\nBu program ücretsiz bir yazılımdır; yeniden dağıtabilir veya Özgür Yazılım Kuruluşu tarafından yayınlanan (GNU) Genel Kamu Lisansı koşulları altında değiştirebilirsiniz; isterseniz ikinci lisans sürümünü veya (sizin seçeneğiniz) herhangi bir sonraki lisans sürümünü kullanabilirsiniz.\n\nBu program, faydalı olacağı umuduyla dağıtılmaktadır, ancak ''' herhangi bir garantisi yoktur '''; ''' uygunluk ''' veya ''' belirli bir amaca uygunluk ''' gibi dolaylı garantileri bile yoktur.\nDaha fazla ayrıntı için (GNU) Genel Kamu Lisansına bakınız.\n\nBu program ile birlikte <doclink href=\"Copying\">bir (GNU) Genel Kamu Lisansının bir kopyasını </doclink> almış olmanız gerekir; bu program (GNU) Genel Kamu Lisansı ile dağıtılmadıysa, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ABD adresine yazın veya [http://www.gnu.org/copyleft/gpl.html online olarak okuyun].",
-       "config-sidebar": "* [https://www.mediawiki.org MediaWiki ana sayfa]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Kullanıcı Rehberi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Yetkili Rehberi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ SSS]\n----\n* <doclink href=Readme>Beni oku</doclink>\n* <doclink href=ReleaseNotes>Sürüm notları</doclink>\n* <doclink href=Copying>Kopyalama</doclink>\n* <doclink href=UpgradeDoc>Yükseltme</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org MediaWiki anasayfa]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Kullanıcı Kılavuzu]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Hizmetli Rehberi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ SSS]\n----\n* <doclink href=Readme>Beni oku</doclink>\n* <doclink href=ReleaseNotes>Sürüm notları</doclink>\n* <doclink href=Copying>Kopyalama</doclink>\n* <doclink href=UpgradeDoc>Yükseltme</doclink>",
        "config-env-good": "Ortam kontrol edildi.\nMediaWiki'yi kurabilirsiniz.",
        "config-env-bad": "Ortam kontrol edildi.\nMediaWiki'yi kuramazsınız.",
        "config-env-php": "PHP $1 kurulu.",
        "config-ns-conflict": "Belirtilen ad \"<nowiki> $1 </nowiki>\" varsayılan MediaWiki ad alanı ile çakışıyor.\nFarklı proje isim alanı belirtin.",
        "config-admin-box": "Yönetici hesabı",
        "config-admin-name": "Kullanıcı adınız:",
-       "config-admin-password": "Şifre:",
-       "config-admin-password-confirm": "Şifre tekrar:",
+       "config-admin-password": "Parola:",
+       "config-admin-password-confirm": "Yeniden parola:",
        "config-admin-help": "Buraya tercih ettiğiniz kullanıcı adını girin; örneğin \"Joe Bloggs\". Bu vikide oturum açmak için kullanacağınız addır.",
        "config-admin-name-blank": "Bir yönetici kullanıcı adını giriniz.",
        "config-admin-name-invalid": "Belirtilen ad \"<nowiki> $1 </nowiki>\" geçersiz.\nFarklı bir kullanıcı adı belirtin.",
        "config-admin-password-blank": "Yönetici hesabı için bir parola girin.",
-       "config-admin-password-mismatch": "Girdiğiniz şifreler birbirleriyle uyuşmuyor.",
+       "config-admin-password-mismatch": "Girdiğiniz iki parola eşleşmiyor.",
        "config-admin-email": "E-posta adresi:",
        "config-admin-email-help": "Wiki'de diğer kullanıcılardan e-posta almak, parolanızı sıfırlamak ve sizin izlediğiniz sayfalarda yapılan değişikliklerin bildirilmesini sağlamak için e-posta adresinizi girin. Bu alanı boş bırakabilirsiniz.",
        "config-admin-error-user": "Bir yönetici adı ile oluşturma sırasında iç hata \"<nowiki> $1 </nowiki>\".",
        "config-install-stats": "İstatistik başlatılıyor",
        "config-install-keys": "Gizli anahtar oluşturma",
        "config-install-subscribe-notpossible": "cURL yüklü değil ve <code>allow_url_fopen</code> kullanılamaz.",
-       "config-install-mainpage": "Varsayılan içerik ile ana sayfa oluşturma",
+       "config-install-mainpage": "Varsayılan içerik ile anasayfa oluşturma",
        "config-install-extension-tables": "Uzantılar için etkinleştirilmiş tablolar oluşturma",
-       "config-install-mainpage-failed": "Ana sayfa eklenemedi:$1",
+       "config-install-mainpage-failed": "Anasayfa eklenemedi: $1",
        "config-download-localsettings": "İndir <code>LocalSettings.php</code>",
        "config-help": "Yardım",
        "config-help-tooltip": "genişletmek için tıklayın",
index 4a24408..e89113c 100644 (file)
@@ -50,6 +50,7 @@
        "config-db-host-oracle": "דאטנבאזע־TNS:",
        "config-db-wiki-settings": "אידענטיפיצירן די דאזיקע וויקי",
        "config-db-name": "דאטנבאזע נאָמען:",
+       "config-db-name-oracle": "דאטנבאזע סכעמע:",
        "config-db-install-account": "באניצער־קאנטע פאר אינסטאלאציע",
        "config-db-username": "דאטנבאזע באניצער־נאָמען:",
        "config-db-password": "דאטנבאזע־פאסווארט:",
index faf5194..877740f 100644 (file)
        "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons 即時共享資源] 是允許 Wiki 使用來自 [https://commons.wikimedia.org/ Wikimedia Commons] 網站上的圖片、聲音以及其他媒體的一項功能。\n若要開啟此功能,您的 MediaWiki 必須能夠連線網際網路。\n更多有關此功能的訊息,包含如何存除了 Wikimedia Commons 之外其他網站的說明,請參考 \n[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 操作手冊]。",
        "config-cc-error": "查無該創作共用授權條款,\n請手動輸入您的授權條款名稱。",
        "config-cc-again": "請重新選取...",
-       "config-cc-not-chosen": "請選擇您要使用的創作共享授權條款,然後點選 \"proceed\"。",
+       "config-cc-not-chosen": "請選擇您要使用的創用CC授權條款,然後點選 \"proceed\"。",
        "config-advanced-settings": "進階設定",
        "config-cache-options": "物件快取設定:",
        "config-cache-help": "物件快取是用來增進 MediaWiki 速度的一項功能,透過快取經常使用的資料。\n中型到大型的網站我們會建議開啟這個選項,對小型的網站也有一定程度的效果。",
index 4ccca97..d9c0424 100644 (file)
@@ -23,7 +23,7 @@ namespace MediaWiki\Interwiki;
  */
 use \Cdb\Exception as CdbException;
 use \Cdb\Reader as CdbReader;
-use Database;
+use Wikimedia\Rdbms\Database;
 use Hooks;
 use Interwiki;
 use Language;
@@ -221,7 +221,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
                                }
                        }
 
-                       $value = $this->getCacheValue( wfMemcKey( $prefix ) );
+                       $value = $this->getCacheValue( wfWikiID() . ':' . $prefix );
                        // Site level
                        if ( $value == '' && $this->interwikiScopes >= 3 ) {
                                $value = $this->getCacheValue( "_{$this->thisSite}:{$prefix}" );
@@ -288,7 +288,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
 
                                $row = $dbr->selectRow(
                                        'interwiki',
-                                       ClassicInterwikiLookup::selectFields(),
+                                       self::selectFields(),
                                        [ 'iw_prefix' => $prefix ],
                                        __METHOD__
                                );
@@ -383,8 +383,6 @@ class ClassicInterwikiLookup implements InterwikiLookup {
                                . $e->getMessage() );
                }
 
-               ksort( $data );
-
                return array_values( $data );
        }
 
@@ -408,7 +406,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
                }
 
                $res = $db->select( 'interwiki',
-                       $this->selectFields(),
+                       self::selectFields(),
                        $where, __METHOD__, [ 'ORDER BY' => 'iw_prefix' ]
                );
 
index 558e32c..8dd6193 100644 (file)
@@ -92,12 +92,12 @@ class Interwiki {
        }
 
        /**
-        * Returns all interwiki prefixes
+        * Returns all interwiki prefix definitions.
         *
         * @deprecated since 1.28, unused. Use InterwikiLookup instead.
         *
         * @param string|null $local If set, limits output to local/non-local interwikis
-        * @return array List of prefixes
+        * @return array[] List of interwiki rows
         * @since 1.19
         */
        public static function getAllPrefixes( $local = null ) {
index d0a7719..697e39d 100644 (file)
@@ -47,10 +47,21 @@ interface InterwikiLookup {
        public function fetch( $prefix );
 
        /**
-        * Returns all interwiki prefixes
+        * Returns information about all interwiki prefixes, in the form of rows
+        * of the interwiki table. Each row may have the following keys:
+        *
+        * - iw_prefix: the prefix. Always present.
+        * - iw_url: the URL to use for linking, with $1 as a placeholder for the target page.
+        *           Always present.
+        * - iw_api: the URL of the API. Optional.
+        * - iw_wikiid: the wiki ID (usually the database name for local wikis). Optional.
+        * - iw_local: whether the wiki is local, and the "magic redirect" mechanism should apply.
+        *             Defaults to false.
+        * - iw_trans: whether "scary transclusion" is allowed for this site.
+        *             Defaults to false.
         *
         * @param string|null $local If set, limits output to local/non-local interwikis
-        * @return string[] List of prefixes
+        * @return array[] interwiki rows.
         */
        public function getAllPrefixes( $local = null );
 
index 60d6f43..3baea1a 100644 (file)
@@ -87,16 +87,20 @@ class InterwikiLookupAdapter implements InterwikiLookup {
         * See InterwikiLookup::getAllPrefixes
         *
         * @param string|null $local If set, limits output to local/non-local interwikis
-        * @return string[] List of prefixes
+        * @return array[] interwiki rows
         */
        public function getAllPrefixes( $local = null ) {
-               if ( $local === null ) {
-                       return array_keys( $this->getInterwikiMap() );
-               }
                $res = [];
                foreach ( $this->getInterwikiMap() as $interwikiId => $interwiki ) {
-                       if ( $interwiki->isLocal() === $local ) {
-                               $res[] = $interwikiId;
+                       if ( $local === null || $interwiki->isLocal() === $local ) {
+                               $res[] = [
+                                       'iw_prefix' => $interwikiId,
+                                       'iw_url' => $interwiki->getURL(),
+                                       'iw_api' => $interwiki->getAPI(),
+                                       'iw_wikiid' => $interwiki->getWikiID(),
+                                       'iw_local' => $interwiki->isLocal(),
+                                       'iw_trans' => $interwiki->isTranscludable(),
+                               ];
                        }
                }
                return $res;
index f814cee..703e485 100644 (file)
@@ -69,12 +69,22 @@ abstract class Job implements IJobSpecification {
                global $wgJobClasses;
 
                if ( isset( $wgJobClasses[$command] ) ) {
-                       $class = $wgJobClasses[$command];
-
-                       $job = new $class( $title, $params );
-                       $job->command = $command;
+                       $handler = $wgJobClasses[$command];
+
+                       if ( is_callable( $handler ) ) {
+                               $job = call_user_func( $handler, $title, $params );
+                       } elseif ( class_exists( $handler ) ) {
+                               $job = new $handler( $title, $params );
+                       } else {
+                               $job = null;
+                       }
 
-                       return $job;
+                       if ( $job instanceof Job ) {
+                               $job->command = $command;
+                               return $job;
+                       } else {
+                               throw new InvalidArgumentException( "Cannot instantiate job '$command': bad spec!" );
+                       }
                }
 
                throw new InvalidArgumentException( "Invalid job command '{$command}'" );
index 020a684..9701dd9 100644 (file)
@@ -21,6 +21,7 @@
  * @defgroup JobQueue JobQueue
  * @author Aaron Schulz
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class to handle enqueueing and running of background jobs
@@ -709,7 +710,7 @@ abstract class JobQueue {
        public static function incrStats( $key, $type, $delta = 1 ) {
                static $stats;
                if ( !$stats ) {
-                       $stats = RequestContext::getMain()->getStats();
+                       $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                }
                $stats->updateCount( "jobqueue.{$key}.all", $delta );
                $stats->updateCount( "jobqueue.{$key}.{$type}", $delta );
index 0a8ae7f..924aacc 100644 (file)
  * @file
  * @author Aaron Schulz
  */
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBConnRef;
+use Wikimedia\Rdbms\DBConnectionError;
+use Wikimedia\Rdbms\DBError;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
@@ -346,7 +350,7 @@ class JobQueueDB extends JobQueue {
                                        continue; // try the other direction
                                }
                        } else { // table *may* have >= MAX_OFFSET rows
-                               // Bug 42614: "ORDER BY job_random" with a job_random inequality causes high CPU
+                               // T44614: "ORDER BY job_random" with a job_random inequality causes high CPU
                                // in MySQL if there are many rows for some reason. This uses a small OFFSET
                                // instead of job_random for reducing excess claim retries.
                                $row = $dbw->selectRow( 'job', self::selectFields(), // find a random job
index 71d68d9..9f78404 100644 (file)
@@ -170,7 +170,7 @@ class JobQueueGroup {
         * @since 1.26
         */
        public function lazyPush( $jobs ) {
-               if ( PHP_SAPI === 'cli' ) {
+               if ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' ) {
                        $this->push( $jobs );
                        return;
                }
index 25a271c..eb91680 100644 (file)
@@ -75,6 +75,8 @@ class JobQueueRedis extends JobQueue {
        /** @var string Compression method to use */
        protected $compression;
 
+       const MAX_PUSH_SIZE = 25; // avoid tying up the server
+
        /**
         * @param array $params Possible keys:
         *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
@@ -212,7 +214,7 @@ class JobQueueRedis extends JobQueue {
                        if ( $flags & self::QOS_ATOMIC ) {
                                $batches = [ $items ]; // all or nothing
                        } else {
-                               $batches = array_chunk( $items, 100 ); // avoid tying up the server
+                               $batches = array_chunk( $items, self::MAX_PUSH_SIZE );
                        }
                        $failed = 0;
                        $pushed = 0;
@@ -793,9 +795,9 @@ LUA;
        private function getGlobalKey( $name ) {
                $parts = [ 'global', 'jobqueue', $name ];
                foreach ( $parts as $part ) {
-                   if ( !preg_match( '/[a-zA-Z0-9_-]+/', $part ) ) {
-                       throw new InvalidArgumentException( "Key part characters are out of range." );
-                   }
+                       if ( !preg_match( '/[a-zA-Z0-9_-]+/', $part ) ) {
+                               throw new InvalidArgumentException( "Key part characters are out of range." );
+                       }
                }
 
                return implode( ':', $parts );
index baff288..6415533 100644 (file)
@@ -28,6 +28,8 @@ use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Wikimedia\ScopedCallback;
 use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\DBError;
+use Wikimedia\Rdbms\DBReplicationWaitError;
 
 /**
  * Job queue runner utility methods
index d636dc6..d844795 100644 (file)
@@ -128,7 +128,7 @@ class JobSpecification implements IJobSpecification {
 
                $this->type = $type;
                $this->params = $params;
-               $this->title = $title ?: Title::makeTitle( NS_SPECIAL, 'Badtitle/' . get_class( $this ) );
+               $this->title = $title ?: Title::makeTitle( NS_SPECIAL, 'Badtitle/' . static::class );
                $this->opts = $opts;
        }
 
index 3cd3448..74c446f 100644 (file)
@@ -137,7 +137,7 @@ class DoubleRedirectJob extends Job {
                        wfDebug( __METHOD__ . " : skipping, already good\n" );
                }
 
-               // Preserve fragment (bug 14904)
+               // Preserve fragment (T16904)
                $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
                        $currentDest->getFragment(), $newTitle->getInterwiki() );
 
@@ -199,7 +199,7 @@ class DoubleRedirectJob extends Job {
                        $seenTitles[$titleText] = true;
 
                        if ( $title->isExternal() ) {
-                               // If the target is interwiki, we have to break early (bug 40352).
+                               // If the target is interwiki, we have to break early (T42352).
                                // Otherwise it will look up a row in the local page table
                                // with the namespace/page of the interwiki target which can cause
                                // unexpected results (e.g. X -> foo:Bar -> Bar -> .. )
index 37e80c2..e89812b 100644 (file)
@@ -128,7 +128,7 @@ class PublishStashedFileJob extends Job {
                        );
                        $this->setLastError( get_class( $e ) . ": " . $e->getMessage() );
                        // To prevent potential database referential integrity issues.
-                       // See bug 32551.
+                       // See T34551.
                        MWExceptionHandler::rollbackMasterChangesAndLog( $e );
 
                        return false;
index 5c73308..eb367af 100644 (file)
@@ -20,6 +20,7 @@
  * @ingroup JobQueue
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\DBReplicationWaitError;
 
 /**
  * Job for pruning recent changes
@@ -230,7 +231,6 @@ class RecentChangesUpdateJob extends Job {
                                        ],
                                        __METHOD__
                                );
-
                        },
                        __METHOD__
                );
index 651a332..02bb829 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup JobQueue
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\DBReplicationWaitError;
 
 /**
  * Job to update link tables for pages
@@ -29,7 +30,7 @@ use MediaWiki\MediaWikiServices;
  *   - a) Recursive jobs to update links for backlink pages for a given title.
  *        These jobs have (recursive:true,table:<table>) set.
  *   - b) Jobs to update links for a set of pages (the job title is ignored).
- *           These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
+ *        These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
  *   - c) Jobs to update links for a single page (the job title)
  *        These jobs need no extra fields set.
  *
@@ -86,7 +87,7 @@ class RefreshLinksJob extends Job {
                        // When the base job branches, wait for the replica DBs to catch up to the master.
                        // From then on, we know that any template changes at the time the base job was
                        // enqueued will be reflected in backlink page parses when the leaf jobs run.
-                       if ( !isset( $params['range'] ) ) {
+                       if ( !isset( $this->params['range'] ) ) {
                                try {
                                        $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
                                        $lbFactory->waitForReplication( [
@@ -112,7 +113,7 @@ class RefreshLinksJob extends Job {
                        JobQueueGroup::singleton()->push( $jobs );
                // Job to update link tables for a set of titles
                } elseif ( isset( $this->params['pages'] ) ) {
-                       foreach ( $this->params['pages'] as $pageId => $nsAndKey ) {
+                       foreach ( $this->params['pages'] as $nsAndKey ) {
                                list( $ns, $dbKey ) = $nsAndKey;
                                $this->runForTitle( Title::makeTitleSafe( $ns, $dbKey ) );
                        }
@@ -252,7 +253,7 @@ class RefreshLinksJob extends Job {
                // This avoids snapshot-clearing errors in LinksUpdate::acquirePageLock().
                $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket );
 
-               foreach ( $updates as $key => $update ) {
+               foreach ( $updates as $update ) {
                        // FIXME: This code probably shouldn't be here?
                        // Needed by things like Echo notifications which need
                        // to know which user caused the links update
index 081e114..cf3155d 100644 (file)
@@ -77,7 +77,7 @@ class ThumbnailRenderJob extends Job {
                }
        }
 
-       protected function hitThumbUrl( $file, $transformParams, &$thumbUrl ) {
+       protected function hitThumbUrl( LocalFile $file, $transformParams, &$thumbUrl ) {
                global $wgUploadThumbnailRenderHttpCustomHost, $wgUploadThumbnailRenderHttpCustomDomain;
 
                $thumbName = $file->thumbName( $transformParams );
index 7f50055..1c12a1c 100644 (file)
@@ -33,7 +33,7 @@
  * For example, if templates A and B are edited (at the same time) the queue will have:
  *     (A base, B base)
  * When these jobs run, the queue will have per-title and remnant partition jobs:
- *        (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
+ *     (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
  *
  * This works best when the queue is FIFO, for several reasons:
  *   - a) Since the remnant jobs are enqueued after the leaf jobs, the slower leaf jobs have to
@@ -133,7 +133,7 @@ class BacklinkJobUtils {
                                        'table'         => $params['table'],
                                        'range'         => [
                                                'start'     => $ranges[1][0],
-                                               'end'       => $ranges[count( $ranges ) - 1][1],
+                                               'end'       => $ranges[count( $ranges ) - 1][1],
                                                'batchSize' => $realBSize,
                                                'subranges' => array_slice( $ranges, 1 )
                                        ],
index d76d866..ba80c8e 100644 (file)
@@ -20,6 +20,7 @@
  *
  * @file
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 
 class PurgeJobUtils {
index bc99672..c504f35 100644 (file)
@@ -8,7 +8,7 @@
  * not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *             http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software distributed
  * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
@@ -38,7 +38,7 @@ class CSSMin {
         * Internet Explorer data URI length limit. See encodeImageAsDataURI().
         */
        const DATA_URI_SIZE_LIMIT = 32768;
-       const URL_REGEX = 'url\(\s*[\'"]?(?P<file>[^\?\)\'"]*?)(?P<query>\?[^\)\'"]*?|)[\'"]?\s*\)';
+
        const EMBED_REGEX = '\/\*\s*\@embed\s*\*\/';
        const COMMENT_REGEX = '\/\*.*?\*\/';
 
@@ -72,8 +72,9 @@ class CSSMin {
                $files = [];
 
                $rFlags = PREG_OFFSET_CAPTURE | PREG_SET_ORDER;
-               if ( preg_match_all( '/' . self::URL_REGEX . '/', $stripped, $matches, $rFlags ) ) {
+               if ( preg_match_all( '/' . self::getUrlRegex() . '/', $stripped, $matches, $rFlags ) ) {
                        foreach ( $matches as $match ) {
+                               self::processUrlMatch( $match, $rFlags );
                                $url = $match['file'][0];
 
                                // Skip fully-qualified and protocol-relative URLs and data URIs
@@ -176,6 +177,12 @@ class CSSMin {
         * @return bool|string
         */
        public static function getMimeType( $file ) {
+               // Infer the MIME-type from the file extension
+               $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) );
+               if ( isset( self::$mimeTypes[$ext] ) ) {
+                       return self::$mimeTypes[$ext];
+               }
+
                $realpath = realpath( $file );
                if (
                        $realpath
@@ -186,12 +193,6 @@ class CSSMin {
                        return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath );
                }
 
-               // Infer the MIME-type from the file extension
-               $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) );
-               if ( isset( self::$mimeTypes[$ext] ) ) {
-                       return self::$mimeTypes[$ext];
-               }
-
                return false;
        }
 
@@ -237,7 +238,7 @@ class CSSMin {
                //       * Otherwise remap the URL to work in generated stylesheets
 
                // Guard against trailing slashes, because "some/remote/../foo.png"
-               // resolves to "some/remote/foo.png" on (some?) clients (bug 27052).
+               // resolves to "some/remote/foo.png" on (some?) clients (T29052).
                if ( substr( $remote, -1 ) == '/' ) {
                        $remote = substr( $remote, 0, -1 );
                }
@@ -266,7 +267,7 @@ class CSSMin {
                // appears in the rule itself, e.g. in a quoted string. You are advised
                // not to use such characters in file names. We also match start/end of
                // the string to be consistent in edge-cases ('@import url(…)').
-               $pattern = '/(?:^|[;{])\K[^;{}]*' . CSSMin::URL_REGEX . '[^;}]*(?=[;}]|$)/';
+               $pattern = '/(?:^|[;{])\K[^;{}]*' . self::getUrlRegex() . '[^;}]*(?=[;}]|$)/';
 
                $source = preg_replace_callback(
                        $pattern,
@@ -290,13 +291,14 @@ class CSSMin {
 
                                // Build two versions of current rule: with remapped URLs
                                // and with embedded data: URIs (where possible).
-                               $pattern = '/(?P<embed>' . CSSMin::EMBED_REGEX . '\s*|)' . CSSMin::URL_REGEX . '/';
+                               $pattern = '/(?P<embed>' . CSSMin::EMBED_REGEX . '\s*|)' . self::getUrlRegex() . '/';
 
                                $ruleWithRemapped = preg_replace_callback(
                                        $pattern,
                                        function ( $match ) use ( $local, $remote ) {
-                                               $remapped = CSSMin::remapOne( $match['file'], $match['query'], $local, $remote, false );
+                                               self::processUrlMatch( $match );
 
+                                               $remapped = CSSMin::remapOne( $match['file'], $match['query'], $local, $remote, false );
                                                return CSSMin::buildUrlValue( $remapped );
                                        },
                                        $rule
@@ -309,6 +311,8 @@ class CSSMin {
                                        $ruleWithEmbedded = preg_replace_callback(
                                                $pattern,
                                                function ( $match ) use ( $embedAll, $local, $remote, &$mimeTypes ) {
+                                                       self::processUrlMatch( $match );
+
                                                        $embed = $embedAll || $match['embed'];
                                                        $embedded = CSSMin::remapOne(
                                                                $match['file'],
@@ -385,6 +389,69 @@ class CSSMin {
                return false;
        }
 
+       private static function getUrlRegex() {
+               static $urlRegex;
+               if ( $urlRegex === null ) {
+                       // Match these three variants separately to avoid broken urls when
+                       // e.g. a double quoted url contains a parenthesis, or when a
+                       // single quoted url contains a double quote, etc.
+                       // Note: PCRE doesn't support multiple capture groups with the same name by default.
+                       // - PCRE 6.7 introduced the "J" modifier (PCRE_INFO_JCHANGED for PCRE_DUPNAMES).
+                       //   https://secure.php.net/manual/en/reference.pcre.pattern.modifiers.php
+                       //   However this isn't useful since it just ignores all but the first one.
+                       //   Also, while the modifier was introduced in PCRE 6.7 (PHP 5.2+) it was
+                       //   not exposed to public preg_* functions until PHP 5.6.0.
+                       // - PCRE 8.36 fixed this to work as expected (e.g. merge conceptually to
+                       //   only return the one matched in the part that actually matched).
+                       //   However MediaWiki supports 5.5.9, which has PCRE 8.32
+                       //   Per https://secure.php.net/manual/en/pcre.installation.php:
+                       //   - PCRE 8.32 (PHP 5.5.0)
+                       //   - PCRE 8.34 (PHP 5.5.10, PHP 5.6.0)
+                       //   - PCRE 8.37 (PHP 5.5.26, PHP 5.6.9, PHP 7.0.0)
+                       //   Workaround by using different groups and merge via processUrlMatch().
+                       // - Using string concatenation for class constant or member assignments
+                       //   is only supported in PHP 5.6. Use a getter method for now.
+                       $urlRegex = '(' .
+                               // Unquoted url
+                               'url\(\s*(?P<file0>[^\'"][^\?\)]*?)(?P<query0>\?[^\)]*?|)\s*\)' .
+                               // Single quoted url
+                               '|url\(\s*\'(?P<file1>[^\?\']*?)(?P<query1>\?[^\']*?|)\'\s*\)' .
+                               // Double quoted url
+                               '|url\(\s*"(?P<file2>[^\?"]*?)(?P<query2>\?[^"]*?|)"\s*\)' .
+                               ')';
+               }
+               return $urlRegex;
+       }
+
+       private static function processUrlMatch( array &$match, $flags = 0 ) {
+               if ( $flags & PREG_SET_ORDER ) {
+                       // preg_match_all with PREG_SET_ORDER will return each group in each
+                       // match array, and if it didn't match, instead of the sub array
+                       // being an empty array it is `[ '', -1 ]`...
+                       if ( isset( $match['file0'] ) && $match['file0'][1] !== -1 ) {
+                               $match['file'] = $match['file0'];
+                               $match['query'] = $match['query0'];
+                       } elseif ( isset( $match['file1'] ) && $match['file1'][1] !== -1 ) {
+                               $match['file'] = $match['file1'];
+                               $match['query'] = $match['query1'];
+                       } else {
+                               $match['file'] = $match['file2'];
+                               $match['query'] = $match['query2'];
+                       }
+               } else {
+                       if ( isset( $match['file0'] ) && $match['file0'] !== '' ) {
+                               $match['file'] = $match['file0'];
+                               $match['query'] = $match['query0'];
+                       } elseif ( isset( $match['file1'] ) && $match['file1'] !== '' ) {
+                               $match['file'] = $match['file1'];
+                               $match['query'] = $match['query1'];
+                       } else {
+                               $match['file'] = $match['file2'];
+                               $match['query'] = $match['query2'];
+                       }
+               }
+       }
+
        /**
         * Remap or embed a CSS URL path.
         *
index 4c86757..6b3e4a7 100644 (file)
@@ -197,11 +197,11 @@ class CryptHKDF {
         * From http://eprint.iacr.org/2010/264.pdf:
         *
         * The scheme HKDF is specifed as:
-        *      HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
+        *   HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
         * where the values K(i) are defined as follows:
-        *      PRK = HMAC(XTS, SKM)
-        *      K(1) = HMAC(PRK, CTXinfo || 0);
-        *      K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
+        *   PRK = HMAC(XTS, SKM)
+        *   K(1) = HMAC(PRK, CTXinfo || 0);
+        *   K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
         * where t = [L/k] and the value K(t) is truncated to its first d = L mod k bits;
         * the counter i is non-wrapping and of a given fixed size, e.g., a single byte.
         * Note that the length of the HMAC output is the same as its key length and therefore
index 10088f2..0d3613a 100644 (file)
@@ -242,6 +242,21 @@ class CryptRand {
                        $this->strong = true;
                }
 
+               if ( strlen( $buffer ) < $bytes ) {
+                       // If available make use of PHP 7's random_bytes
+                       // On Linux, getrandom syscall will be used if available.
+                       // On Windows CryptGenRandom will always be used
+                       // On other platforms, /dev/urandom will be used.
+                       // All error situations will throw Exceptions and or Errors
+                       if ( function_exists( 'random_bytes' ) ) {
+                               $rem = $bytes - strlen( $buffer );
+                               $buffer .= random_bytes( $rem );
+                       }
+                       if ( strlen( $buffer ) >= $bytes ) {
+                               $this->strong = true;
+                       }
+               }
+
                if ( strlen( $buffer ) < $bytes ) {
                        // If available make use of mcrypt_create_iv URANDOM source to generate randomness
                        // On unix-like systems this reads from /dev/urandom but does it without any buffering
diff --git a/includes/libs/DnsSrvDiscoverer.php b/includes/libs/DnsSrvDiscoverer.php
new file mode 100644 (file)
index 0000000..ce8a204
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Service discovery using DNS SRV records
+ *
+ * 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
+ */
+
+/**
+ * @since 1.29
+ */
+class DnsSrvDiscoverer {
+       /**
+        * @var string
+        */
+       private $domain;
+
+       /**
+        * @param string $domain
+        */
+       public function __construct( $domain ) {
+               $this->domain = $domain;
+       }
+
+       /**
+        * Fetch the servers with a DNS SRV request
+        *
+        * @return array
+        */
+       public function getServers() {
+               $result = [];
+               foreach ( $this->getDnsRecords() as $record ) {
+                       $result[] = [
+                               'target' => $record['target'],
+                               'port' => $record['port'],
+                               'pri' => $record['pri'],
+                               'weight' => $record['weight'],
+                       ];
+               }
+
+               return $result;
+       }
+
+       /**
+        * Pick a server according to the priority fields.
+        * Note that weight is currently ignored.
+        *
+        * @param array $servers from getServers
+        * @return array|bool
+        */
+       public function pickServer( array $servers ) {
+               if ( !$servers ) {
+                       return false;
+               }
+
+               $srvsByPrio = [];
+               foreach ( $servers as $server ) {
+                       $srvsByPrio[$server['pri']][] = $server;
+               }
+
+               $min = min( array_keys( $srvsByPrio ) );
+               if ( count( $srvsByPrio[$min] ) == 1 ) {
+                       return $srvsByPrio[$min][0];
+               } else {
+                       // Choose randomly
+                       $rand = mt_rand( 0, count( $srvsByPrio[$min] ) - 1 );
+
+                       return $srvsByPrio[$min][$rand];
+               }
+       }
+
+       /**
+        * @param array $server
+        * @param array $servers
+        * @return array[]
+        */
+       public function removeServer( $server, array $servers ) {
+               foreach ( $servers as $i => $srv ) {
+                       if ( $srv['target'] === $server['target'] && $srv['port'] === $server['port'] ) {
+                               unset( $servers[$i] );
+                               break;
+                       }
+               }
+
+               return array_values( $servers );
+       }
+
+       /**
+        * @return array[]
+        */
+       protected function getDnsRecords() {
+               return dns_get_record( $this->domain, DNS_SRV );
+       }
+}
index 4a6e3fb..e55bebc 100644 (file)
@@ -63,8 +63,8 @@ class IEUrlExtension {
                // Check QUERY_STRING or REQUEST_URI
                if ( isset( $vars['SERVER_SOFTWARE'] )
                        && isset( $vars['REQUEST_URI'] )
-                       && self::haveUndecodedRequestUri( $vars['SERVER_SOFTWARE'] ) )
-               {
+                       && self::haveUndecodedRequestUri( $vars['SERVER_SOFTWARE'] )
+               {
                        $urlPart = $vars['REQUEST_URI'];
                } elseif ( isset( $vars['QUERY_STRING'] ) ) {
                        $urlPart = $vars['QUERY_STRING'];
@@ -79,8 +79,8 @@ class IEUrlExtension {
                // Some servers have PATH_INFO but not REQUEST_URI, so we check both
                // to be on the safe side.
                if ( isset( $vars['PATH_INFO'] )
-                       && self::isUrlExtensionBad( $vars['PATH_INFO'], $extWhitelist ) )
-               {
+                       && self::isUrlExtensionBad( $vars['PATH_INFO'], $extWhitelist )
+               {
                        return true;
                }
 
@@ -223,8 +223,8 @@ class IEUrlExtension {
                                // If the extension is NOT exe, dll or cgi, return it
                                $extension = substr( $url, $pos, $nextPos - $pos );
                                if ( strcasecmp( $extension, 'exe' ) && strcasecmp( $extension, 'dll' ) &&
-                                       strcasecmp( $extension, 'cgi' ) )
-                               {
+                                       strcasecmp( $extension, 'cgi' )
+                               {
                                        return $extension;
                                }
                                // Else continue looking
index 21203a4..a6aa0a3 100644 (file)
@@ -675,7 +675,7 @@ class IP {
         * @return string|null Valid dotted quad IPv4 address or null
         */
        public static function canonicalize( $addr ) {
-               // remove zone info (bug 35738)
+               // remove zone info (T37738)
                $addr = preg_replace( '/\%.*/', '', $addr );
 
                if ( self::isValid( $addr ) ) {
index f0b44a5..e9922b9 100644 (file)
  * @file
  */
 
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
 /**
  * Class to handle concurrent HTTP requests
  *
@@ -42,7 +46,7 @@
  * @author Aaron Schulz
  * @since 1.23
  */
-class MultiHttpClient {
+class MultiHttpClient implements LoggerAwareInterface {
        /** @var resource */
        protected $multiHandle = null; // curl_multi handle
        /** @var string|null SSL certificates path  */
@@ -59,6 +63,8 @@ class MultiHttpClient {
        protected $proxy;
        /** @var string */
        protected $userAgent = 'wikimedia/multi-http-client v1.0';
+       /** @var LoggerInterface */
+       protected $logger;
 
        /**
         * @param array $options
@@ -78,13 +84,17 @@ class MultiHttpClient {
                        }
                }
                static $opts = [
-                       'connTimeout', 'reqTimeout', 'usePipelining', 'maxConnsPerHost', 'proxy', 'userAgent'
+                       'connTimeout', 'reqTimeout', 'usePipelining', 'maxConnsPerHost',
+                       'proxy', 'userAgent', 'logger'
                ];
                foreach ( $opts as $key ) {
                        if ( isset( $options[$key] ) ) {
                                $this->$key = $options[$key];
                        }
                }
+               if ( $this->logger === null ) {
+                       $this->logger = new NullLogger;
+               }
        }
 
        /**
@@ -162,6 +172,7 @@ class MultiHttpClient {
                        } elseif ( !isset( $req['url'] ) ) {
                                throw new Exception( "Request has no 'url' field set." );
                        }
+                       $this->logger->debug( "{$req['method']}: {$req['url']}" );
                        $req['query'] = isset( $req['query'] ) ? $req['query'] : [];
                        $headers = []; // normalized headers
                        if ( isset( $req['headers'] ) ) {
@@ -235,6 +246,8 @@ class MultiHttpClient {
                                        if ( function_exists( 'curl_strerror' ) ) {
                                                $req['response']['error'] .= " " . curl_strerror( $errno );
                                        }
+                                       $this->logger->warning( "Error fetching URL \"{$req['url']}\": " .
+                                               $req['response']['error'] );
                                }
                        } else {
                                $req['response']['error'] = "(curl error: no status set)";
@@ -420,6 +433,15 @@ class MultiHttpClient {
                return $this->multiHandle;
        }
 
+       /**
+        * Register a logger
+        *
+        * @param LoggerInterface
+        */
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
        function __destruct() {
                if ( $this->multiHandle ) {
                        curl_multi_close( $this->multiHandle );
index db085da..e860ec4 100644 (file)
@@ -85,7 +85,7 @@ class StatusValue {
         * defined as:
         * [
         *     0 => object(StatusValue) # the StatusValue with error messages, only
-        *         1 => object(StatusValue) # The StatusValue with warning messages, only
+        *     1 => object(StatusValue) # The StatusValue with warning messages, only
         * ]
         *
         * @return StatusValue[]
@@ -154,7 +154,7 @@ class StatusValue {
        }
 
        /**
-        * Change operation resuklt
+        * Change operation result
         *
         * @param bool $ok Whether the operation completed
         * @param mixed $value
index 8afdce4..4f0805b 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup FileBackend
  * @author Aaron Schulz
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * @brief Class for a file system (FS) based file backend.
index 212e84f..53bce33 100644 (file)
@@ -167,7 +167,7 @@ class FileBackendMultiWrite extends FileBackend {
                // Do a consistency check to see if the backends are consistent...
                $syncStatus = $this->consistencyCheck( $relevantPaths );
                if ( !$syncStatus->isOK() ) {
-                       wfDebugLog( 'FileOperation', get_class( $this ) .
+                       wfDebugLog( 'FileOperation', static::class .
                                " failed sync check: " . FormatJson::encode( $relevantPaths ) );
                        // Try to resync the clone backends to the master on the spot...
                        if ( $this->autoResync === false
@@ -378,7 +378,7 @@ class FileBackendMultiWrite extends FileBackend {
                }
 
                if ( !$status->isOK() ) {
-                       wfDebugLog( 'FileOperation', get_class( $this ) .
+                       wfDebugLog( 'FileOperation', static::class .
                                " failed to resync: " . FormatJson::encode( $paths ) );
                }
 
index a7ceab2..e2f7886 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup FileBackend
  * @author Aaron Schulz
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * @brief Base class for all backends using particular storage medium.
@@ -359,7 +360,7 @@ abstract class FileBackendStore extends FileBackend {
                        $status->merge( $this->doConcatenate( $params ) );
                        $sec = microtime( true ) - $start_time;
                        if ( !$status->isOK() ) {
-                               $this->logger->error( get_class( $this ) . "-{$this->name}" .
+                               $this->logger->error( static::class . "-{$this->name}" .
                                        " failed to concatenate " . count( $params['srcs'] ) . " file(s) [$sec sec]" );
                        }
                }
@@ -1122,7 +1123,7 @@ abstract class FileBackendStore extends FileBackend {
                                $subStatus->success[$i] = false;
                                ++$subStatus->failCount;
                        }
-                       $this->logger->error( get_class( $this ) . "-{$this->name} " .
+                       $this->logger->error( static::class . "-{$this->name} " .
                                " stat failure; aborted operations: " . FormatJson::encode( $ops ) );
                }
 
@@ -1199,21 +1200,20 @@ abstract class FileBackendStore extends FileBackend {
         * to the order in which the handles where given.
         *
         * @param FileBackendStoreOpHandle[] $fileOpHandles
-        *
-        * @throws FileBackendError
         * @return StatusValue[] Map of StatusValue objects
+        * @throws FileBackendError
         */
        final public function executeOpHandlesInternal( array $fileOpHandles ) {
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
 
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) {
-                               throw new InvalidArgumentException( "Got a non-FileBackendStoreOpHandle object." );
+                               throw new InvalidArgumentException( "Expected FileBackendStoreOpHandle object." );
                        } elseif ( $fileOpHandle->backend->getName() !== $this->getName() ) {
-                               throw new InvalidArgumentException(
-                                       "Got a FileBackendStoreOpHandle for the wrong backend." );
+                               throw new InvalidArgumentException( "Expected handle for this file backend." );
                        }
                }
+
                $res = $this->doExecuteOpHandlesInternal( $fileOpHandles );
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        $fileOpHandle->closeResources();
@@ -1250,7 +1250,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return array
         */
        protected function sanitizeOpHeaders( array $op ) {
-               static $longs = [ 'content-disposition' ];
+               static $longs = [ 'content-disposition', 'x-content-dimensions' ];
 
                if ( isset( $op['headers'] ) ) { // op sets HTTP headers
                        $newHeaders = [];
index 800fdfa..a7d064b 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * Functions related to the output of file content
index d40e896..029f94c 100644 (file)
 class SwiftFileBackend extends FileBackendStore {
        /** @var MultiHttpClient */
        protected $http;
-
        /** @var int TTL in seconds */
        protected $authTTL;
-
        /** @var string Authentication base URL (without version) */
        protected $swiftAuthUrl;
-
+       /** @var string Override of storage base URL */
+       protected $swiftStorageUrl;
        /** @var string Swift user (account:user) to authenticate as */
        protected $swiftUser;
-
        /** @var string Secret key for user */
        protected $swiftKey;
-
        /** @var string Shared secret value for making temp URLs */
        protected $swiftTempUrlKey;
-
        /** @var string S3 access key (RADOS Gateway) */
        protected $rgwS3AccessKey;
-
        /** @var string S3 authentication key (RADOS Gateway) */
        protected $rgwS3SecretKey;
 
@@ -65,10 +60,8 @@ class SwiftFileBackend extends FileBackendStore {
 
        /** @var array */
        protected $authCreds;
-
        /** @var int UNIX timestamp */
        protected $authSessionTimestamp = 0;
-
        /** @var int UNIX timestamp */
        protected $authErrorTimestamp = null;
 
@@ -84,6 +77,8 @@ class SwiftFileBackend extends FileBackendStore {
         *   - swiftAuthTTL       : Swift authentication TTL (seconds)
         *   - swiftTempUrlKey    : Swift "X-Account-Meta-Temp-URL-Key" value on the account.
         *                          Do not set this until it has been set in the backend.
+        *   - swiftStorageUrl    : Swift storage URL (overrides that of the authentication response).
+        *                          This is useful to set if a TLS proxy is in use.
         *   - shardViaHashLevels : Map of container names to sharding config with:
         *                             - base   : base of hash characters, 16 or 36
         *                             - levels : the number of hash levels (and digits)
@@ -116,6 +111,9 @@ class SwiftFileBackend extends FileBackendStore {
                $this->swiftTempUrlKey = isset( $config['swiftTempUrlKey'] )
                        ? $config['swiftTempUrlKey']
                        : '';
+               $this->swiftStorageUrl = isset( $config['swiftStorageUrl'] )
+                       ? $config['swiftStorageUrl']
+                       : null;
                $this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
                        ? $config['shardViaHashLevels']
                        : '';
@@ -287,7 +285,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually write the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -348,10 +346,12 @@ class SwiftFileBackend extends FileBackendStore {
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
+               $opHandle->resourcesToClose[] = $handle;
+
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually write the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -399,7 +399,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually write the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -458,7 +458,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually move the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -498,7 +498,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually delete the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -554,7 +554,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually change the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -1089,7 +1089,7 @@ class SwiftFileBackend extends FileBackendStore {
                        // good
                } elseif ( $rcode === 404 ) {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
-                       // Per bug 41113, nasty things can happen if bad cache entries get
+                       // Per T43113, nasty things can happen if bad cache entries get
                        // stuck in cache. It's also possible that this error can come up
                        // with simple race conditions. Clear out the stat cache to be safe.
                        $this->clearCache( [ $params['src'] ] );
@@ -1672,8 +1672,11 @@ class SwiftFileBackend extends FileBackendStore {
                                if ( $rcode >= 200 && $rcode <= 299 ) { // OK
                                        $this->authCreds = [
                                                'auth_token' => $rhdrs['x-auth-token'],
-                                               'storage_url' => $rhdrs['x-storage-url']
+                                               'storage_url' => ( $this->swiftStorageUrl !== null )
+                                                       ? $this->swiftStorageUrl
+                                                       : $rhdrs['x-storage-url']
                                        ];
+
                                        $this->srvCache->set( $cacheKey, $this->authCreds, ceil( $this->authTTL / 2 ) );
                                        $this->authSessionTimestamp = time();
                                } elseif ( $rcode === 401 ) {
index fab5a37..79af194 100644 (file)
@@ -461,7 +461,7 @@ abstract class FileOp {
                $params = $this->params;
                $params['failedAction'] = $action;
                try {
-                       $this->logger->error( get_class( $this ) .
+                       $this->logger->error( static::class .
                                " failed (batch #{$this->batchId}): " . FormatJson::encode( $params ) );
                } catch ( Exception $e ) {
                        // bad config? debug log error?
index b17b1a0..26e25f9 100644 (file)
  * @ingroup LockManager
  */
 
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
+
 /**
  * Version of LockManager based on using named/row DB locks.
  *
index d6b1ce8..65c6993 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\DBError;
+
 /**
  * PostgreSQL version of DBLockManager that supports shared locks.
  * All locks are non-blocking, which avoids deadlocks.
index a89d864..1d2e21a 100644 (file)
@@ -127,6 +127,39 @@ abstract class QuorumLockManager extends LockManager {
         * @return StatusValue
         */
        final protected function doLockingRequestBucket( $bucket, array $pathsByType ) {
+               return $this->collectPledgeQuorum(
+                       $bucket,
+                       function ( $lockSrv ) use ( $pathsByType ) {
+                               return $this->getLocksOnServer( $lockSrv, $pathsByType );
+                       }
+               );
+       }
+
+       /**
+        * Attempt to release locks with the peers for a bucket
+        *
+        * @param int $bucket
+        * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
+        * @return StatusValue
+        */
+       final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) {
+               return $this->releasePledges(
+                       $bucket,
+                       function ( $lockSrv ) use ( $pathsByType ) {
+                               return $this->freeLocksOnServer( $lockSrv, $pathsByType );
+                       }
+               );
+       }
+
+       /**
+        * Attempt to acquire pledges with the peers for a bucket.
+        * This is all or nothing; if any key is already pledged then this totally fails.
+        *
+        * @param int $bucket
+        * @param callable $callback Pledge method taking a server name and yeilding a StatusValue
+        * @return StatusValue
+        */
+       final protected function collectPledgeQuorum( $bucket, callable $callback ) {
                $status = StatusValue::newGood();
 
                $yesVotes = 0; // locks made on trustable servers
@@ -141,7 +174,7 @@ abstract class QuorumLockManager extends LockManager {
                                continue; // server down?
                        }
                        // Attempt to acquire the lock on this peer
-                       $status->merge( $this->getLocksOnServer( $lockSrv, $pathsByType ) );
+                       $status->merge( $callback( $lockSrv ) );
                        if ( !$status->isOK() ) {
                                return $status; // vetoed; resource locked
                        }
@@ -162,13 +195,13 @@ abstract class QuorumLockManager extends LockManager {
        }
 
        /**
-        * Attempt to release locks with the peers for a bucket
+        * Attempt to release pledges with the peers for a bucket
         *
         * @param int $bucket
-        * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
+        * @param callable $callback Pledge method taking a server name and yeilding a StatusValue
         * @return StatusValue
         */
-       final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) {
+       final protected function releasePledges( $bucket, callable $callback ) {
                $status = StatusValue::newGood();
 
                $yesVotes = 0; // locks freed on trustable servers
@@ -180,7 +213,7 @@ abstract class QuorumLockManager extends LockManager {
                                $status->warning( 'lockmanager-fail-svr-release', $lockSrv );
                        } else {
                                // Attempt to release the lock on this peer
-                               $status->merge( $this->freeLocksOnServer( $lockSrv, $pathsByType ) );
+                               $status->merge( $callback( $lockSrv ) );
                                ++$yesVotes; // success for this peer
                                // Normally the first peers form the quorum, and the others are ignored.
                                // Ignore them in this case, but not when an alternative quorum was used.
index 0d1e527..badcb2b 100644 (file)
@@ -399,8 +399,8 @@ class IEContentAnalyzer {
                $proposedFormat = $this->getDataFormat( $version, $proposed );
                if ( $proposedFormat == 'unknown'
                        && $proposed != 'multipart/mixed'
-                       && $proposed != 'multipart/x-mixed-replace' )
-               {
+                       && $proposed != 'multipart/x-mixed-replace'
+               {
                        return $proposed;
                }
                if ( strval( $chunk ) === '' ) {
@@ -426,15 +426,15 @@ class IEContentAnalyzer {
                        return 'image/gif';
                }
                if ( ( $proposed == 'image/pjpeg' || $proposed == 'image/jpeg' )
-                       && $binaryType == 'image/pjpeg' )
-               {
+                       && $binaryType == 'image/pjpeg'
+               {
                        return $proposed;
                }
                // PNG check added in IE 7
                if ( $version >= 'ie07'
                        && ( $proposed == 'image/x-png' || $proposed == 'image/png' )
-                       && $binaryType == 'image/x-png' )
-               {
+                       && $binaryType == 'image/x-png'
+               {
                        return $proposed;
                }
 
@@ -450,8 +450,8 @@ class IEContentAnalyzer {
                }
                if ( isset( $sampleFound['rdf-tag'] )
                        && isset( $sampleFound['rdf-url'] )
-                       && isset( $sampleFound['rdf-purl'] ) )
-               {
+                       && isset( $sampleFound['rdf-purl'] )
+               {
                        return 'application/rss+xml';
                }
                if ( isset( $sampleFound['atom'] ) ) {
@@ -497,8 +497,8 @@ class IEContentAnalyzer {
                // Freaky heuristics to determine if the data is text or binary
                // The heuristic is of course broken for non-ASCII text
                if ( $counters['ctrl'] != 0 && ( $counters['ff'] + $counters['low'] )
-                       < ( $counters['ctrl'] + $counters['high'] ) * 16 )
-               {
+                       < ( $counters['ctrl'] + $counters['high'] ) * 16
+               {
                        $kindOfBinary = true;
                        $type = $binaryType ? $binaryType : $textType;
                        if ( $type === false ) {
@@ -599,13 +599,13 @@ class IEContentAnalyzer {
 
                if ( $chunk2 == 'BM'
                        && substr( $chunk, 6, 2 ) == "\000\000"
-                       && substr( $chunk, 8, 2 ) == "\000\000" )
-               {
+                       && substr( $chunk, 8, 2 ) == "\000\000"
+               {
                        return 'image/bmp'; // another non-standard MIME
                }
                if ( $chunk4 == 'RIFF'
-                       && substr( $chunk, 8, 4 ) == 'WAVE' )
-               {
+                       && substr( $chunk, 8, 4 ) == 'WAVE'
+               {
                        return 'audio/wav';
                }
                // These were integer literals in IE
@@ -613,8 +613,8 @@ class IEContentAnalyzer {
                if ( $chunk4 == ".sd\000"
                        || $chunk4 == ".snd"
                        || $chunk4 == "\000ds."
-                       || $chunk4 == "dns." )
-               {
+                       || $chunk4 == "dns."
+               {
                        return 'audio/basic';
                }
                if ( $chunk3 == "MM\000" ) {
@@ -648,8 +648,8 @@ class IEContentAnalyzer {
                        return 'video/mpeg';
                }
                if ( $chunk4 == "\001\000\000\000"
-                       && substr( $chunk, 40, 4 ) == ' EMF' )
-               {
+                       && substr( $chunk, 40, 4 ) == ' EMF'
+               {
                        return 'image/x-emf';
                }
                if ( $chunk4 == "\xd7\xcd\xc6\x9a" ) {
@@ -789,8 +789,8 @@ class IEContentAnalyzer {
                        if ( !strncasecmp( $remainder, $rdfUrl, strlen( $rdfUrl ) ) ) {
                                $found['rdf-url'] = true;
                                if ( isset( $found['rdf-tag'] )
-                                       && isset( $found['rdf-purl'] ) // [sic]
-                               {
+                                       && isset( $found['rdf-purl'] ) // [sic]
+                               {
                                        break;
                                }
                                continue;
@@ -798,8 +798,8 @@ class IEContentAnalyzer {
 
                        if ( !strncasecmp( $remainder, $rdfPurl, strlen( $rdfPurl ) ) ) {
                                if ( isset( $found['rdf-tag'] )
-                                       && isset( $found['rdf-url'] ) // [sic]
-                               {
+                                       && isset( $found['rdf-url'] ) // [sic]
+                               {
                                        break;
                                }
                                continue;
index 6ea3c21..565c157 100644 (file)
@@ -529,7 +529,7 @@ EOT;
                        // Formats we recognize magic numbers for
                        'djvu', 'ogx', 'ogg', 'ogv', 'oga', 'spx', 'opus',
                        'mid', 'pdf', 'wmf', 'xcf', 'webm', 'mkv', 'mka',
-                       'webp',
+                       'webp', 'mp3',
 
                        // XML formats we sure hope we recognize reliably
                        'svg',
@@ -670,6 +670,10 @@ EOT;
                        // Multimedia...
                        'MThd'             => 'audio/midi',
                        'OggS'             => 'application/ogg',
+                       'ID3'              => 'audio/mpeg',
+                       "\xff\xfb"         => 'audio/mpeg', // MPEG-1 layer 3
+                       "\xff\xf3"         => 'audio/mpeg', // MPEG-2 layer 3 (lower sample rates)
+                       "\xff\xe3"         => 'audio/mpeg', // MPEG-2.5 layer 3 (very low sample rates)
 
                        // Image formats...
                        // Note that WMF may have a bare header, no magic number.
@@ -735,8 +739,8 @@ EOT;
                        ( strpos( $head, "<\x00?\x00 " ) !== false ) ||
                        ( strpos( $head, "<\x00?\x00\n" ) !== false ) ||
                        ( strpos( $head, "<\x00?\x00\t" ) !== false ) ||
-                       ( strpos( $head, "<\x00?\x00=" ) !== false ) ) {
-
+                       ( strpos( $head, "<\x00?\x00=" ) !== false )
+               ) {
                        $this->logger->info( __METHOD__ . ": recognized $file as application/x-php\n" );
                        return 'application/x-php';
                }
@@ -1035,7 +1039,6 @@ EOT;
                // Special code for ogg - detect if it's video (theora),
                // else label it as sound.
                if ( $mime == 'application/ogg' && file_exists( $path ) ) {
-
                        // Read a chunk of the file
                        $f = fopen( $path, "rt" );
                        if ( !$f ) {
index 7f2bf5e..e48cf62 100644 (file)
@@ -73,19 +73,36 @@ class XmlTypeCheck {
         */
        private $parserOptions = [
                'processing_instruction_handler' => '',
+               'external_dtd_handler' => '',
+               'dtd_handler' => '',
+               'require_safe_dtd' => true
        ];
 
        /**
+        * Allow filtering an XML file.
+        *
+        * Filters should return either true or a string to indicate something
+        * is wrong with the file. $this->filterMatch will store if the
+        * file failed validation (true = failed validation).
+        * $this->filterMatchType will contain the validation error.
+        * $this->wellFormed will contain whether the xml file is well-formed.
+        *
+        * @note If multiple filters are hit, only one of them will have the
+        *  result stored in $this->filterMatchType.
+        *
         * @param string $input a filename or string containing the XML element
         * @param callable $filterCallback (optional)
         *        Function to call to do additional custom validity checks from the
         *        SAX element handler event. This gives you access to the element
         *        namespace, name, attributes, and text contents.
-        *        Filter should return 'true' to toggle on $this->filterMatch
+        *        Filter should return a truthy value describing the error.
         * @param bool $isFile (optional) indicates if the first parameter is a
         *        filename (default, true) or if it is a string (false)
         * @param array $options list of additional parsing options:
         *        processing_instruction_handler: Callback for xml_set_processing_instruction_handler
+        *        external_dtd_handler: Callback for the url of external dtd subset
+        *        dtd_handler: Callback given the full text of the <!DOCTYPE declaration.
+        *        require_safe_dtd: Only allow non-recursive entities in internal dtd (default true)
         */
        function __construct( $input, $filterCallback = null, $isFile = true, $options = [] ) {
                $this->filterCallback = $filterCallback;
@@ -186,6 +203,9 @@ class XmlTypeCheck {
                        if ( $reader->nodeType === XMLReader::PI ) {
                                $this->processingInstructionHandler( $reader->name, $reader->value );
                        }
+                       if ( $reader->nodeType === XMLReader::DOC_TYPE ) {
+                               $this->DTDHandler( $reader );
+                       }
                } while ( $reader->nodeType != XMLReader::ELEMENT );
 
                // Process the rest of the document
@@ -234,8 +254,13 @@ class XmlTypeCheck {
                                                $reader->value
                                        );
                                        break;
+                               case XMLReader::DOC_TYPE:
+                                       // We should never see a doctype after first
+                                       // element.
+                                       $this->wellFormed = false;
+                                       break;
                                default:
-                                       // One of DOC, DOC_TYPE, ENTITY, END_ENTITY,
+                                       // One of DOC, ENTITY, END_ENTITY,
                                        // NOTATION, or XML_DECLARATION
                                        // xml_parse didn't send these to the filter, so we won't.
                        }
@@ -339,4 +364,140 @@ class XmlTypeCheck {
                        $this->filterMatchType = $callbackReturn;
                }
        }
+       /**
+        * Handle coming across a <!DOCTYPE declaration.
+        *
+        * @param XMLReader $reader Reader currently pointing at DOCTYPE node.
+        */
+       private function DTDHandler( XMLReader $reader ) {
+               $externalCallback = $this->parserOptions['external_dtd_handler'];
+               $generalCallback = $this->parserOptions['dtd_handler'];
+               $checkIfSafe = $this->parserOptions['require_safe_dtd'];
+               if ( !$externalCallback && !$generalCallback && !$checkIfSafe ) {
+                       return;
+               }
+               $dtd = $reader->readOuterXML();
+               $callbackReturn = false;
+
+               if ( $generalCallback ) {
+                       $callbackReturn = call_user_func( $generalCallback, $dtd );
+               }
+               if ( $callbackReturn ) {
+                       // Filter hit!
+                       $this->filterMatch = true;
+                       $this->filterMatchType = $callbackReturn;
+                       $callbackReturn = false;
+               }
+
+               $parsedDTD = $this->parseDTD( $dtd );
+               if ( $externalCallback && isset( $parsedDTD['type'] ) ) {
+                       $callbackReturn = call_user_func(
+                               $externalCallback,
+                               $parsedDTD['type'],
+                               isset( $parsedDTD['publicid'] ) ? $parsedDTD['publicid'] : null,
+                               isset( $parsedDTD['systemid'] ) ? $parsedDTD['systemid'] : null
+                       );
+               }
+               if ( $callbackReturn ) {
+                       // Filter hit!
+                       $this->filterMatch = true;
+                       $this->filterMatchType = $callbackReturn;
+                       $callbackReturn = false;
+               }
+
+               if ( $checkIfSafe && isset( $parsedDTD['internal'] ) ) {
+                       if ( !$this->checkDTDIsSafe( $parsedDTD['internal'] ) ) {
+                               $this->wellFormed = false;
+                       }
+               }
+       }
+
+       /**
+        * Check if the internal subset of the DTD is safe.
+        *
+        * We whitelist an extremely restricted subset of DTD features.
+        *
+        * Safe is defined as:
+        *  * Only contains entity defintions (e.g. No <!ATLIST )
+        *  * Entity definitions are not "system" entities
+        *  * Entity definitions are not "parameter" (i.e. %) entities
+        *  * Entity definitions do not reference other entites except &amp;
+        *    and quotes. Entity aliases (where the entity contains only
+        *    another entity are allowed)
+        *  * Entity references aren't overly long (>255 bytes).
+        *  * <!ATTLIST svg xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink">
+        *    allowed if matched exactly for compatibility with graphviz
+        *  * Comments.
+        *
+        * @param string $internalSubset The internal subset of the DTD
+        * @return bool true if safe.
+        */
+       private function checkDTDIsSafe( $internalSubset ) {
+               $offset = 0;
+               $res = preg_match(
+                       '/^(?:\s*<!ENTITY\s+\S+\s+' .
+                               '(?:"(?:&[^"%&;]{1,64};|(?:[^"%&]|&amp;|&quot;){0,255})"' .
+                               '|\'(?:&[^"%&;]{1,64};|(?:[^\'%&]|&amp;|&apos;){0,255})\')\s*>' .
+                               '|\s*<!--(?:[^-]|-[^-])*-->' .
+                               '|\s*<!ATTLIST svg xmlns:xlink CDATA #FIXED ' .
+                               '"http:\/\/www.w3.org\/1999\/xlink">)*\s*$/',
+                       $internalSubset
+               );
+
+               return (bool)$res;
+       }
+
+       /**
+        * Parse DTD into parts.
+        *
+        * If there is an error parsing the dtd, sets wellFormed to false.
+        *
+        * @param $dtd string
+        * @return array Possibly containing keys publicid, systemid, type and internal.
+        */
+       private function parseDTD( $dtd ) {
+               $m = [];
+               $res = preg_match(
+                       '/^<!DOCTYPE\s*\S+\s*' .
+                       '(?:(?P<typepublic>PUBLIC)\s*' .
+                               '(?:"(?P<pubquote>[^"]*)"|\'(?P<pubapos>[^\']*)\')' . // public identifer
+                               '\s*"(?P<pubsysquote>[^"]*)"|\'(?P<pubsysapos>[^\']*)\'' . // system identifier
+                       '|(?P<typesystem>SYSTEM)\s*' .
+                               '(?:"(?P<sysquote>[^"]*)"|\'(?P<sysapos>[^\']*)\')' .
+                       ')?\s*' .
+                       '(?:\[\s*(?P<internal>.*)\])?\s*>$/s',
+                       $dtd,
+                       $m
+               );
+               if ( !$res ) {
+                       $this->wellFormed = false;
+                       return [];
+               }
+               $parsed = [];
+               foreach ( $m as $field => $value ) {
+                       if ( $value === '' || is_numeric( $field ) ) {
+                               continue;
+                       }
+                       switch ( $field ) {
+                       case 'typepublic':
+                       case 'typesystem':
+                               $parsed['type'] = $value;
+                               break;
+                       case 'pubquote':
+                       case 'pubapos':
+                               $parsed['publicid'] = $value;
+                               break;
+                       case 'pubsysquote':
+                       case 'pubsysapos':
+                       case 'sysquote':
+                       case 'sysapos':
+                               $parsed['systemid'] = $value;
+                               break;
+                       case 'internal':
+                               $parsed['internal'] = $value;
+                               break;
+                       }
+               }
+               return $parsed;
+       }
 }
index 5edd889..2468f38 100644 (file)
@@ -95,9 +95,9 @@ application/vnd.ms-powerpoint [OFFICE]
 application/x-director         [OFFICE]
 text/rtf                       [OFFICE]
 
-application/vnd.openxmlformats-officedocument.wordprocessingml.document        [OFFICE]
+application/vnd.openxmlformats-officedocument.wordprocessingml.document        [OFFICE]
 application/vnd.openxmlformats-officedocument.wordprocessingml.template                [OFFICE]
-application/vnd.ms-word.document.macroEnabled.12                               [OFFICE]
+application/vnd.ms-word.document.macroEnabled.12                               [OFFICE]
 application/vnd.ms-word.template.macroEnabled.12                               [OFFICE]
 application/vnd.openxmlformats-officedocument.presentationml.template          [OFFICE]
 application/vnd.openxmlformats-officedocument.presentationml.slideshow         [OFFICE]
index d0b68bc..77c4259 100644 (file)
@@ -679,7 +679,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        protected function debug( $text ) {
                if ( $this->debugMode ) {
                        $this->logger->debug( "{class} debug: $text", [
-                               'class' => get_class( $this ),
+                               'class' => static::class,
                        ] );
                }
        }
index 74bf4b5..c85a82e 100644 (file)
@@ -81,6 +81,22 @@ class CachedBagOStuff extends HashBagOStuff {
                $this->backend->setDebug( $bool );
        }
 
+       public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
+               parent::deleteObjectsExpiringBefore( $date, $progressCallback );
+               return $this->backend->deleteObjectsExpiringBefore( $date, $progressCallback );
+       }
+
+       public function makeKey() {
+               return call_user_func_array( [ $this->backend, __FUNCTION__ ], func_get_args() );
+       }
+
+       public function makeGlobalKey() {
+               return call_user_func_array( [ $this->backend, __FUNCTION__ ], func_get_args() );
+       }
+
+       // These just call the backend (tested elsewhere)
+       // @codeCoverageIgnoreStart
+
        public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
                return $this->backend->lock( $key, $timeout, $expiry, $rclass );
        }
@@ -89,21 +105,17 @@ class CachedBagOStuff extends HashBagOStuff {
                return $this->backend->unlock( $key );
        }
 
-       public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
-               parent::deleteObjectsExpiringBefore( $date, $progressCallback );
-               return $this->backend->deleteObjectsExpiringBefore( $date, $progressCallback );
-       }
-
        public function getLastError() {
                return $this->backend->getLastError();
        }
 
        public function clearLastError() {
-               $this->backend->clearLastError();
+               return $this->backend->clearLastError();
        }
 
        public function modifySimpleRelayEvent( array $event ) {
                return $this->backend->modifySimpleRelayEvent( $event );
        }
 
+       // @codeCoverageIgnoreEnd
 }
index c3fcab9..a94f86a 100644 (file)
@@ -1114,9 +1114,13 @@ class MemcachedClient {
                if ( $this->_debug ) {
                        $this->_debugprint( sprintf( "%s %s (%s)", $cmd, $key, $line ) );
                }
-               if ( $line == "STORED" ) {
+               if ( $line === "STORED" ) {
+                       return true;
+               } elseif ( $line === "NOT_STORED" && $cmd === "set" ) {
+                       // "Not stored" is always used as the mcrouter response with AllAsyncRoute
                        return true;
                }
+
                return false;
        }
 
index 5983c1b..c568e7b 100644 (file)
@@ -149,7 +149,12 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
        public function set( $key, $value, $exptime = 0, $flags = 0 ) {
                $this->debugLog( "set($key)" );
-               return $this->checkResult( $key, parent::set( $key, $value, $exptime ) );
+               $result = parent::set( $key, $value, $exptime );
+               if ( $result === false && $this->client->getResultCode() === Memcached::RES_NOTSTORED ) {
+                       // "Not stored" is always used as the mcrouter response with AllAsyncRoute
+                       return true;
+               }
+               return $this->checkResult( $key, $result );
        }
 
        protected function cas( $casToken, $key, $value, $exptime = 0 ) {
@@ -163,9 +168,8 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                if ( $result === false && $this->client->getResultCode() === Memcached::RES_NOTFOUND ) {
                        // "Not found" is counted as success in our interface
                        return true;
-               } else {
-                       return $this->checkResult( $key, $result );
                }
+               return $this->checkResult( $key, $result );
        }
 
        public function add( $key, $value, $exptime = 0 ) {
index ae91be5..730eed1 100644 (file)
@@ -63,9 +63,9 @@ class RESTBagOStuff extends BagOStuff {
        protected function doGet( $key, $flags = 0 ) {
                $req = [
                        'method' => 'GET',
-                   'url' => $this->url . rawurlencode( $key ),
-
+                       'url' => $this->url . rawurlencode( $key ),
                ];
+
                list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->client->run( $req );
                if ( $rcode === 200 ) {
                        if ( is_string( $rbody ) ) {
index d852f82..583ec37 100644 (file)
@@ -321,7 +321,7 @@ class RedisBagOStuff extends BagOStuff {
         */
        protected function serialize( $data ) {
                // Serialize anything but integers so INCR/DECR work
-               // Do not store integer-like strings as integers to avoid type confusion (bug 60563)
+               // Do not store integer-like strings as integers to avoid type confusion (T62563)
                return is_int( $data ) ? $data : serialize( $data );
        }
 
index 75c79a9..cb1be95 100644 (file)
@@ -44,15 +44,20 @@ use Psr\Log\NullLogger;
  *
  * The simplest purge method is delete().
  *
- * There are two supported ways to handle broadcasted operations:
+ * There are three supported ways to handle broadcasted operations:
  *   - a) Configure the 'purge' EventRelayer to point to a valid PubSub endpoint
- *        that has subscribed listeners on the cache servers applying the cache updates.
+ *         that has subscribed listeners on the cache servers applying the cache updates.
  *   - b) Ignore the 'purge' EventRelayer configuration (default is NullEventRelayer)
- *        and set up mcrouter as the underlying cache backend, using one of the memcached
- *        BagOStuff classes as 'cache'. Use OperationSelectorRoute in the mcrouter settings
- *        to configure 'set' and 'delete' operations to go to all DCs via AllAsyncRoute and
- *        configure other operations to go to the local DC via PoolRoute (for reference,
- *        see https://github.com/facebook/mcrouter/wiki/List-of-Route-Handles).
+ *         and set up mcrouter as the underlying cache backend, using one of the memcached
+ *         BagOStuff classes as 'cache'. Use OperationSelectorRoute in the mcrouter settings
+ *         to configure 'set' and 'delete' operations to go to all DCs via AllAsyncRoute and
+ *         configure other operations to go to the local DC via PoolRoute (for reference,
+ *         see https://github.com/facebook/mcrouter/wiki/List-of-Route-Handles).
+ *   - c) Ignore the 'purge' EventRelayer configuration (default is NullEventRelayer)
+ *         and set up dynomite as cache middleware between the web servers and either
+ *         memcached or redis. This will also broadcast all key setting operations, not just purges,
+ *         which can be useful for cache warming. Writes are eventually consistent via the
+ *         Dynamo replication model (see https://github.com/Netflix/dynomite).
  *
  * Broadcasted operations like delete() and touchCheckKey() are done asynchronously
  * in all datacenters this way, though the local one should likely be near immediate.
@@ -92,6 +97,8 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        private $callbackDepth = 0;
        /** @var mixed[] Temporary warm-up cache */
        private $warmupCache = [];
+       /** @var integer Key fetched */
+       private $warmupKeyMisses = 0;
 
        /** Max time expected to pass between delete() and DB commit finishing */
        const MAX_COMMIT_DELAY = 3;
@@ -293,10 +300,13 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                if ( $this->warmupCache ) {
                        $wrappedValues = array_intersect_key( $this->warmupCache, array_flip( $keysGet ) );
                        $keysGet = array_diff( $keysGet, array_keys( $wrappedValues ) ); // keys left to fetch
+                       $this->warmupKeyMisses += count( $keysGet );
                } else {
                        $wrappedValues = [];
                }
-               $wrappedValues += $this->cache->getMulti( $keysGet );
+               if ( $keysGet ) {
+                       $wrappedValues += $this->cache->getMulti( $keysGet );
+               }
                // Time used to compare/init "check" keys (derived after getMulti() to be pessimistic)
                $now = microtime( true );
 
@@ -1068,7 +1078,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *         // Time-to-live (in seconds)
         *         $cache::TTL_DAY,
         *         // Function that derives the new key value
-        *         return function ( $id, $oldValue, &$ttl, array &$setOpts ) {
+        *         function ( $id, $oldValue, &$ttl, array &$setOpts ) {
         *             $dbr = wfGetDB( DB_REPLICA );
         *             // Account for any snapshot/replica DB lag
         *             $setOpts += Database::getCacheSetOptions( $dbr );
@@ -1098,22 +1108,34 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        final public function getMultiWithSetCallback(
                ArrayIterator $keyedIds, $ttl, callable $callback, array $opts = []
        ) {
-               $keysWarmUp = iterator_to_array( $keyedIds, true );
                $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : [];
+
+               $keysWarmUp = [];
+               // Get all the value keys to fetch...
+               foreach ( $keyedIds as $key => $id ) {
+                       $keysWarmUp[] = self::VALUE_KEY_PREFIX . $key;
+               }
+               // Get all the check keys to fetch...
                foreach ( $checkKeys as $i => $checkKeyOrKeys ) {
                        if ( is_int( $i ) ) {
-                               $keysWarmUp[] = $checkKeyOrKeys;
+                               // Single check key that applies to all value keys
+                               $keysWarmUp[] = self::TIME_KEY_PREFIX . $checkKeyOrKeys;
                        } else {
-                               $keysWarmUp = array_merge( $keysWarmUp, $checkKeyOrKeys );
+                               // List of check keys that apply to value key $i
+                               $keysWarmUp = array_merge(
+                                       $keysWarmUp,
+                                       self::prefixCacheKeys( $checkKeyOrKeys, self::TIME_KEY_PREFIX )
+                               );
                        }
                }
 
                $this->warmupCache = $this->cache->getMulti( $keysWarmUp );
                $this->warmupCache += array_fill_keys( $keysWarmUp, false );
+               $this->warmupKeyMisses = 0;
 
                // Wrap $callback to match the getWithSetCallback() format while passing $id to $callback
                $id = null;
-               $func = function ( $oldValue, &$ttl, array $setOpts, $oldAsOf ) use ( $callback, &$id ) {
+               $func = function ( $oldValue, &$ttl, array &$setOpts, $oldAsOf ) use ( $callback, &$id ) {
                        return $callback( $id, $oldValue, $ttl, $setOpts, $oldAsOf );
                };
 
@@ -1311,6 +1333,14 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                return (int)min( $maxTTL, max( $minTTL, $factor * $age ) );
        }
 
+       /**
+        * @return integer Number of warmup key cache misses last round
+        * @since 1.30
+        */
+       public function getWarmupKeyMisses() {
+               return $this->warmupKeyMisses;
+       }
+
        /**
         * Do the actual async bus purge of a key
         *
index d84c959..98f44d1 100644 (file)
@@ -41,7 +41,7 @@ class WinCacheBagOStuff extends BagOStuff {
                $result = wincache_ucache_set( $key, serialize( $value ), $expire );
 
                /* wincache_ucache_set returns an empty array on success if $value
-                  was an array, bool otherwise */
+                * was an array, bool otherwise */
                return ( is_array( $result ) && $result === [] ) || $result;
        }
 
index fc00965..212ff31 100644 (file)
@@ -2,9 +2,6 @@
 
 namespace Wikimedia\Rdbms;
 
-use Database;
-use DBConnRef;
-use IDatabase;
 use InvalidArgumentException;
 
 /**
index fc3ebe0..b6167aa 100644 (file)
@@ -1,14 +1,14 @@
 <?php
 
-use Wikimedia\Rdbms\DatabaseDomain;
-use Wikimedia\Rdbms\ILoadBalancer;
-use Wikimedia\Rdbms\DBMasterPos;
+namespace Wikimedia\Rdbms;
+
+use InvalidArgumentException;
 
 /**
  * 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
+ * @note: proxy methods are defined explicitly to avoid interface errors
  * @ingroup Database
  * @since 1.22
  */
@@ -349,6 +349,10 @@ class DBConnRef implements IDatabase {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
+       public function databasesAreIndependent() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
        public function selectDB( $db ) {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
@@ -603,3 +607,5 @@ class DBConnRef implements IDatabase {
                }
        }
 }
+
+class_alias( DBConnRef::class, 'DBConnRef' );
index 1c5c77e..ee7644f 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Wikimedia\ScopedCallback;
-use Wikimedia\Rdbms\TransactionProfiler;
-use Wikimedia\Rdbms\LikeMatch;
-use Wikimedia\Rdbms\DatabaseDomain;
-use Wikimedia\Rdbms\DBMasterPos;
-use Wikimedia\Rdbms\Blob;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
+use MediaWiki;
+use BagOStuff;
+use HashBagOStuff;
+use InvalidArgumentException;
+use Exception;
+use RuntimeException;
 
 /**
  * Relational database abstraction object
@@ -335,6 +339,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        'oracle' => [],
                        'mssql' => [],
                ];
+               static $classAliases = [
+                       'DatabaseMssql' => DatabaseMssql::class,
+                       'DatabaseMysql' => DatabaseMysql::class,
+                       'DatabaseMysqli' => DatabaseMysqli::class,
+                       'DatabaseSqlite' => DatabaseSqlite::class,
+                       'DatabasePostgres' => DatabasePostgres::class
+               ];
 
                $driver = false;
                $dbType = strtolower( $dbType );
@@ -358,13 +369,18 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                } else {
                        $driver = $dbType;
                }
+
                if ( $driver === false || $driver === '' ) {
                        throw new InvalidArgumentException( __METHOD__ .
                                " no viable database extension found for type '$dbType'" );
                }
 
                $class = 'Database' . ucfirst( $driver );
-               if ( class_exists( $class ) && is_subclass_of( $class, 'IDatabase' ) ) {
+               if ( isset( $classAliases[$class] ) ) {
+                       $class = $classAliases[$class];
+               }
+
+               if ( class_exists( $class ) && is_subclass_of( $class, IDatabase::class ) ) {
                        // Resolve some defaults for b/c
                        $p['host'] = isset( $p['host'] ) ? $p['host'] : false;
                        $p['user'] = isset( $p['user'] ) ? $p['user'] : false;
@@ -400,6 +416,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                return $conn;
        }
 
+       /**
+        * Set the PSR-3 logger interface to use for query logging. (The logger
+        * interfaces for connection logging and error logging can be set with the
+        * constructor.)
+        *
+        * @param LoggerInterface $logger
+        */
        public function setLogger( LoggerInterface $logger ) {
                $this->queryLogger = $logger;
        }
@@ -560,6 +583,12 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                return $this->mTrxLevel ? $this->mTrxWriteCallers : [];
        }
 
+       /**
+        * Get the list of method names that have pending write queries or callbacks
+        * for this transaction
+        *
+        * @return array
+        */
        protected function pendingWriteAndCallbackCallers() {
                if ( !$this->mTrxLevel ) {
                        return [];
@@ -648,6 +677,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         */
        abstract function strencode( $s );
 
+       /**
+        * Set a custom error handler for logging errors during database connection
+        */
        protected function installErrorHandler() {
                $this->mPHPError = false;
                $this->htmlErrors = ini_set( 'html_errors', '0' );
@@ -655,6 +687,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        /**
+        * Restore the previous error handler and return the last PHP error for this DB
+        *
         * @return bool|string
         */
        protected function restoreErrorHandler() {
@@ -681,6 +715,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        /**
+        * Error handler for logging errors during database connection
         * This method should not be used outside of Database classes
         *
         * @param int $errno
@@ -801,7 +836,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        /**
         * @param string $sql A SQL query
-        * @return bool Whether $sql is SQL for creating/dropping a new TEMPORARY table
+        * @return bool Whether $sql is SQL for TEMPORARY table operation
         */
        protected function registerTempTableOperation( $sql ) {
                if ( preg_match(
@@ -817,9 +852,16 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $sql,
                        $matches
                ) ) {
+                       $isTemp = isset( $this->mSessionTempTables[$matches[1]] );
                        unset( $this->mSessionTempTables[$matches[1]] );
 
-                       return true;
+                       return $isTemp;
+               } elseif ( preg_match(
+                       '/^TRUNCATE\s+(?:TEMPORARY\s+)?TABLE\s+(?:IF\s+EXISTS\s+)?[`"\']?(\w+)[`"\']?/i',
+                       $sql,
+                       $matches
+               ) ) {
+                       return isset( $this->mSessionTempTables[$matches[1]] );
                } elseif ( preg_match(
                        '/^(?:INSERT\s+(?:\w+\s+)?INTO|UPDATE|DELETE\s+FROM)\s+[`"\']?(\w+)[`"\']?/i',
                        $sql,
@@ -835,8 +877,16 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $priorWritesPending = $this->writesOrCallbacksPending();
                $this->mLastQuery = $sql;
 
-               $isWrite = $this->isWriteQuery( $sql ) && !$this->registerTempTableOperation( $sql );
+               $isWrite = $this->isWriteQuery( $sql );
+               if ( $isWrite ) {
+                       $isNonTempWrite = !$this->registerTempTableOperation( $sql );
+               } else {
+                       $isNonTempWrite = false;
+               }
+
                if ( $isWrite ) {
+                       # In theory, non-persistent writes are allowed in read-only mode, but due to things
+                       # like https://bugs.mysql.com/bug.php?id=33669 that might not work anyway...
                        $reason = $this->getReadOnlyReason();
                        if ( $reason !== false ) {
                                throw new DBReadOnlyError( $this, "Database is read-only: $reason" );
@@ -845,8 +895,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $this->mLastWriteTime = microtime( true );
                }
 
-               // Add trace comment to the begin of the sql string, right after the operator.
-               // Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (bug 42598)
+               # Add trace comment to the begin of the sql string, right after the operator.
+               # Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (T44598)
                $commentedSql = preg_replace( '/\s|$/', " /* $fname {$this->agent} */ ", $sql, 1 );
 
                # Start implicit transactions that wrap the request if DBO_TRX is enabled
@@ -872,7 +922,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $this->assertOpen();
 
                # Send the query to the server
-               $ret = $this->doProfiledQuery( $sql, $commentedSql, $isWrite, $fname );
+               $ret = $this->doProfiledQuery( $sql, $commentedSql, $isNonTempWrite, $fname );
 
                # Try reconnecting if the connection was lost
                if ( false === $ret && $this->wasErrorReissuable() ) {
@@ -893,7 +943,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                        $this->reportQueryError( $lastError, $lastErrno, $sql, $fname );
                                } else {
                                        # Should be safe to silently retry the query
-                                       $ret = $this->doProfiledQuery( $sql, $commentedSql, $isWrite, $fname );
+                                       $ret = $this->doProfiledQuery( $sql, $commentedSql, $isNonTempWrite, $fname );
                                }
                        } else {
                                $msg = __METHOD__ . ": lost connection to {$this->getServer()} permanently";
@@ -922,6 +972,17 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                return $res;
        }
 
+       /**
+        * Helper method for query() that handles profiling and logging and sends
+        * the query to doQuery()
+        *
+        * @param string $sql Original SQL query
+        * @param string $commentedSql SQL query with debugging/trace comment
+        * @param bool $isWrite Whether the query is a (non-temporary) write operation
+        * @param string $fname Name of the calling function
+        * @return bool|ResultWrapper True for a successful write query, ResultWrapper
+        *     object for a successful read query, or false on failure
+        */
        private function doProfiledQuery( $sql, $commentedSql, $isWrite, $fname ) {
                $isMaster = !is_null( $this->getLBInfo( 'master' ) );
                # generalizeSQL() will probably cut down the query to reasonable
@@ -1003,6 +1064,16 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
        }
 
+       /**
+        * Determine whether or not it is safe to retry queries after a database
+        * connection is lost
+        *
+        * @param string $sql SQL query
+        * @param bool $priorWritesPending Whether there is a transaction open with
+        *     possible write queries or transaction pre-commit/idle callbacks
+        *     waiting on it to finish.
+        * @return bool True if it is safe to retry the query, false otherwise
+        */
        private function canRecoverFromDisconnect( $sql, $priorWritesPending ) {
                # Transaction dropped; this can mean lost writes, or REPEATABLE-READ snapshots.
                # Dropped connections also mean that named locks are automatically released.
@@ -1023,10 +1094,15 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                return true;
        }
 
+       /**
+        * Clean things up after transaction loss due to disconnection
+        *
+        * @return null|Exception
+        */
        private function handleSessionLoss() {
                $this->mTrxLevel = 0;
-               $this->mTrxIdleCallbacks = []; // bug 65263
-               $this->mTrxPreCommitCallbacks = []; // bug 65263
+               $this->mTrxIdleCallbacks = []; // T67263
+               $this->mTrxPreCommitCallbacks = []; // T67263
                $this->mSessionTempTables = [];
                $this->mNamedLocksHeld = [];
                try {
@@ -1141,12 +1217,6 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                $preLimitTail .= $this->makeOrderBy( $options );
 
-               // if (isset($options['LIMIT'])) {
-               //      $tailOpts .= $this->limitResult('', $options['LIMIT'],
-               //              isset($options['OFFSET']) ? $options['OFFSET']
-               //              : false);
-               // }
-
                if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE';
                }
@@ -1358,7 +1428,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        ) {
                $rows = 0;
                $sql = $this->selectSQLText( $tables, '1', $conds, $fname, $options, $join_conds );
-               $res = $this->query( "SELECT COUNT(*) AS rowcount FROM ($sql) tmp_count", $fname );
+               // The identifier quotes is primarily for MSSQL.
+               $rowCountCol = $this->addIdentifierQuotes( "rowcount" );
+               $tableName = $this->addIdentifierQuotes( "tmp_count" );
+               $res = $this->query( "SELECT COUNT(*) AS $rowCountCol FROM ($sql) $tableName", $fname );
 
                if ( $res ) {
                        $row = $this->fetchRow( $res );
@@ -1543,7 +1616,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $sql .= " WHERE " . $this->makeList( $conds, self::LIST_AND );
                }
 
-               return $this->query( $sql, $fname );
+               return (bool)$this->query( $sql, $fname );
        }
 
        public function makeList( $a, $mode = self::LIST_COMMA ) {
@@ -1677,6 +1750,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                return $field;
        }
 
+       public function databasesAreIndependent() {
+               return false;
+       }
+
        public function selectDB( $db ) {
                # Stub. Shouldn't cause serious problems if it's not overridden, but
                # if your database engine supports a concept similar to MySQL's
@@ -1950,7 +2027,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        /**
-        * Get the name of an index in a given table.
+        * Allows for index remapping in queries where this is not consistent across DBMS
         *
         * @param string $index
         * @return string
@@ -2006,8 +2083,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @param string $s
         * @return string
         */
-       protected function escapeLikeInternal( $s ) {
-               return addcslashes( $s, '\%_' );
+       protected function escapeLikeInternal( $s, $escapeChar = '`' ) {
+               return str_replace( [ $escapeChar, '%', '_' ],
+                       [ "{$escapeChar}{$escapeChar}", "{$escapeChar}%", "{$escapeChar}_" ],
+                       $s );
        }
 
        public function buildLike() {
@@ -2019,15 +2098,21 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                $s = '';
 
+               // We use ` instead of \ as the default LIKE escape character, since addQuotes()
+               // may escape backslashes, creating problems of double escaping. The `
+               // character has good cross-DBMS compatibility, avoiding special operators
+               // in MS SQL like ^ and %
+               $escapeChar = '`';
+
                foreach ( $params as $value ) {
                        if ( $value instanceof LikeMatch ) {
                                $s .= $value->toString();
                        } else {
-                               $s .= $this->escapeLikeInternal( $value );
+                               $s .= $this->escapeLikeInternal( $value, $escapeChar );
                        }
                }
 
-               return " LIKE {$this->addQuotes( $s )} ";
+               return ' LIKE ' . $this->addQuotes( $s ) . ' ESCAPE ' . $this->addQuotes( $escapeChar ) . ' ';
        }
 
        public function anyChar() {
@@ -2298,6 +2383,12 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                return $this->insert( $destTable, $rows, $fname, $insertOptions );
        }
 
+       /**
+        * Native server-side implementation of insertSelect() for situations where
+        * we don't want to select everything into memory
+        *
+        * @see IDatabase::insertSelect()
+        */
        protected function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds,
                $fname = __METHOD__,
                $insertOptions = [], $selectOptions = []
@@ -2942,7 +3033,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        /**
-        * @return bool
+        * Close existing database connection and open a new connection
+        *
+        * @return bool True if new connection is opened successfully, false if error
         */
        protected function reconnect() {
                $this->closeConnection();
@@ -3294,26 +3387,51 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                return false;
        }
 
+       public function tableLocksHaveTransactionScope() {
+               return true;
+       }
+
+       final public function lockTables( array $read, array $write, $method ) {
+               if ( $this->writesOrCallbacksPending() ) {
+                       throw new DBUnexpectedError( $this, "Transaction writes or callbacks still pending." );
+               }
+
+               if ( $this->tableLocksHaveTransactionScope() ) {
+                       $this->startAtomic( $method );
+               }
+
+               return $this->doLockTables( $read, $write, $method );
+       }
+
        /**
-        * Lock specific tables
+        * Helper function for lockTables() that handles the actual table locking
         *
         * @param array $read Array of tables to lock for read access
         * @param array $write Array of tables to lock for write access
         * @param string $method Name of caller
-        * @param bool $lowPriority Whether to indicate writes to be LOW PRIORITY
-        * @return bool
+        * @return true
         */
-       public function lockTables( $read, $write, $method, $lowPriority = true ) {
+       protected function doLockTables( array $read, array $write, $method ) {
                return true;
        }
 
+       final public function unlockTables( $method ) {
+               if ( $this->tableLocksHaveTransactionScope() ) {
+                       $this->endAtomic( $method );
+
+                       return true; // locks released on COMMIT/ROLLBACK
+               }
+
+               return $this->doUnlockTables( $method );
+       }
+
        /**
-        * Unlock specific tables
+        * Helper function for unlockTables() that handles the actual table unlocking
         *
-        * @param string $method The caller
-        * @return bool
+        * @param string $method Name of caller
+        * @return true
         */
-       public function unlockTables( $method ) {
+       protected function doUnlockTables( $method ) {
                return true;
        }
 
@@ -3416,7 +3534,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         */
        public function __clone() {
                $this->connLogger->warning(
-                       "Cloning " . get_class( $this ) . " is not recomended; forking connection:\n" .
+                       "Cloning " . static::class . " is not recomended; forking connection:\n" .
                        ( new RuntimeException() )->getTraceAsString()
                );
 
@@ -3467,4 +3585,5 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 }
 
-class_alias( Database::class, 'DatabaseBase' );
+class_alias( Database::class, 'DatabaseBase' ); // b/c for old name
+class_alias( Database::class, 'Database' ); // b/c global alias
index 7c82479..782727a 100644 (file)
  * @author Ryan Biesemeyer <v-ryanbi at microsoft dot com>
  * @author Ryan Schmidt <skizzerz at gmail dot com>
  */
-use Wikimedia\Rdbms\Blob;
-use Wikimedia\Rdbms\MssqlBlob;
-use Wikimedia\Rdbms\MssqlField;
+
+namespace Wikimedia\Rdbms;
+
+use MediaWiki;
+use Exception;
+use stdClass;
 
 /**
  * @ingroup Database
@@ -1107,27 +1110,11 @@ class DatabaseMssql extends Database {
         * @param string $s
         * @return string
         */
-       protected function escapeLikeInternal( $s ) {
-               return addcslashes( $s, '\%_[]^' );
-       }
-
-       /**
-        * MS SQL requires specifying the escape character used in a LIKE query
-        * or using Square brackets to surround characters that are to be escaped
-        * https://msdn.microsoft.com/en-us/library/ms179859.aspx
-        * Here we take the Specify-Escape-Character approach since it's less
-        * invasive, renders a query that is closer to other DB's and better at
-        * handling square bracket escaping
-        *
-        * @return string Fully built LIKE statement
-        */
-       public function buildLike() {
-               $params = func_get_args();
-               if ( count( $params ) > 0 && is_array( $params[0] ) ) {
-                       $params = $params[0];
-               }
-
-               return parent::buildLike( $params ) . " ESCAPE '\' ";
+       protected function escapeLikeInternal( $s, $escapeChar = '`' ) {
+               return str_replace( [ $escapeChar, '%', '_', '[', ']', '^' ],
+                       [ "{$escapeChar}{$escapeChar}", "{$escapeChar}%", "{$escapeChar}_",
+                               "{$escapeChar}[", "{$escapeChar}]", "{$escapeChar}^" ],
+                       $s );
        }
 
        /**
@@ -1358,3 +1345,5 @@ class DatabaseMssql extends Database {
                return $old;
        }
 }
+
+class_alias( DatabaseMssql::class, 'DatabaseMssql' );
index 9ab7c64..77e797d 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
 
 /**
  * Database abstraction object for PHP extension mysql.
@@ -202,3 +203,5 @@ class DatabaseMysql extends DatabaseMysqlBase {
                return mysql_real_escape_string( $s, $conn );
        }
 }
+
+class_alias( DatabaseMysql::class, 'DatabaseMysql' );
index 61ba498..50ead83 100644 (file)
  * @file
  * @ingroup Database
  */
-use Wikimedia\Rdbms\DBMasterPos;
-use Wikimedia\Rdbms\MySQLMasterPos;
-use Wikimedia\Rdbms\MySQLField;
+namespace Wikimedia\Rdbms;
+
+use DateTime;
+use DateTimeZone;
+use MediaWiki;
+use InvalidArgumentException;
+use Exception;
+use stdClass;
 
 /**
  * Database abstraction object for MySQL.
@@ -527,9 +532,11 @@ abstract class DatabaseMysqlBase extends Database {
                        return true; // already known to exist and won't show in SHOW TABLES anyway
                }
 
-               $encLike = $this->buildLike( $table );
+               // We can't use buildLike() here, because it specifies an escape character
+               // other than the backslash, which is the only one supported by SHOW TABLES
+               $encLike = $this->escapeLikeInternal( $table, '\\' );
 
-               return $this->query( "SHOW TABLES $encLike", $fname )->numRows() > 0;
+               return $this->query( "SHOW TABLES LIKE '$encLike'", $fname )->numRows() > 0;
        }
 
        /**
@@ -820,7 +827,8 @@ abstract class DatabaseMysqlBase extends Database {
 
                $row = $res ? $this->fetchRow( $res ) : false;
                if ( !$row ) {
-                       throw new DBExpectedError( $this, "Failed to query MASTER_POS_WAIT()" );
+                       throw new DBExpectedError( $this,
+                               "MASTER_POS_WAIT() or MASTER_GTID_WAIT() failed: {$this->lastError()}" );
                }
 
                // Result can be NULL (error), -1 (timeout), or 0+ per the MySQL manual
@@ -1052,36 +1060,26 @@ abstract class DatabaseMysqlBase extends Database {
                return true;
        }
 
-       /**
-        * @param array $read
-        * @param array $write
-        * @param string $method
-        * @param bool $lowPriority
-        * @return bool
-        */
-       public function lockTables( $read, $write, $method, $lowPriority = true ) {
-               $items = [];
+       public function tableLocksHaveTransactionScope() {
+               return false; // tied to TCP connection
+       }
 
+       protected function doLockTables( array $read, array $write, $method ) {
+               $items = [];
                foreach ( $write as $table ) {
-                       $tbl = $this->tableName( $table ) .
-                               ( $lowPriority ? ' LOW_PRIORITY' : '' ) .
-                               ' WRITE';
-                       $items[] = $tbl;
+                       $items[] = $this->tableName( $table ) . ' WRITE';
                }
                foreach ( $read as $table ) {
                        $items[] = $this->tableName( $table ) . ' READ';
                }
+
                $sql = "LOCK TABLES " . implode( ',', $items );
                $this->query( $sql, $method );
 
                return true;
        }
 
-       /**
-        * @param string $method
-        * @return bool
-        */
-       public function unlockTables( $method ) {
+       protected function doUnlockTables( $method ) {
                $this->query( "UNLOCK TABLES", $method );
 
                return true;
@@ -1333,4 +1331,40 @@ abstract class DatabaseMysqlBase extends Database {
        public function isView( $name, $prefix = null ) {
                return in_array( $name, $this->listViews( $prefix ) );
        }
+
+       /**
+        * Allows for index remapping in queries where this is not consistent across DBMS
+        *
+        * @param string $index
+        * @return string
+        */
+       protected function indexName( $index ) {
+               /**
+                * When SQLite indexes were introduced in r45764, it was noted that
+                * SQLite requires index names to be unique within the whole database,
+                * not just within a schema. As discussed in CR r45819, to avoid the
+                * need for a schema change on existing installations, the indexes
+                * were implicitly mapped from the new names to the old names.
+                *
+                * This mapping can be removed if DB patches are introduced to alter
+                * the relevant tables in existing installations. Note that because
+                * this index mapping applies to table creation, even new installations
+                * of MySQL have the old names (except for installations created during
+                * a period where this mapping was inappropriately removed, see
+                * T154872).
+                */
+               $renamed = [
+                       'ar_usertext_timestamp' => 'usertext_timestamp',
+                       'un_user_id' => 'user_id',
+                       'un_user_ip' => 'user_ip',
+               ];
+
+               if ( isset( $renamed[$index] ) ) {
+                       return $renamed[$index];
+               } else {
+                       return $index;
+               }
+       }
 }
+
+class_alias( DatabaseMysqlBase::class, 'DatabaseMysqlBase' );
index 2f27ff9..fcd29c3 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
+use mysqli;
+use IP;
 
 /**
  * Database abstraction object for PHP extension mysqli.
@@ -261,7 +265,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        }
 
        /**
-        * @param resource|ResultWrapper $res
+        * @param mysqli $res
         * @param int $n
         * @return mixed
         */
@@ -272,7 +276,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        }
 
        /**
-        * @param resource|ResultWrapper $res
+        * @param mysqli $res
         * @param int $n
         * @return mixed
         */
@@ -283,7 +287,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        }
 
        /**
-        * @param resource|ResultWrapper $res
+        * @param mysqli $res
         * @param int $row
         * @return mixed
         */
@@ -329,3 +333,5 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                }
        }
 }
+
+class_alias( DatabaseMysqli::class, 'DatabaseMysqli' );
index 109f848..2fe275b 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 use Wikimedia\WaitConditionLoop;
-use Wikimedia\Rdbms\Blob;
-use Wikimedia\Rdbms\PostgresBlob;
-use Wikimedia\Rdbms\PostgresField;
+use MediaWiki;
+use Exception;
 
 /**
  * @ingroup Database
@@ -103,7 +105,10 @@ class DatabasePostgres extends Database {
                $this->mDBname = $dbName;
 
                $connectVars = [
-                       'dbname' => $dbName,
+                       // pg_connect() user $user as the default database. Since a database is *required*,
+                       // at least pick a "don't care" database that is more likely to exist. This case
+                       // arrises when LoadBalancer::getConnection( $i, [], '' ) is used.
+                       'dbname' => strlen( $dbName ) ? $dbName : 'postgres',
                        'user' => $user,
                        'password' => $password
                ];
@@ -163,11 +168,16 @@ class DatabasePostgres extends Database {
                return $this->mConn;
        }
 
+       public function databasesAreIndependent() {
+               return true;
+       }
+
        /**
         * Postgres doesn't support selectDB in the same way MySQL does. So if the
         * DB name doesn't match the open connection, open a new one
         * @param string $db
         * @return bool
+        * @throws DBUnexpectedError
         */
        public function selectDB( $db ) {
                if ( $this->mDBname !== $db ) {
@@ -766,7 +776,7 @@ __INDEXATTR__;
                $safeseq = str_replace( "'", "''", $seqName );
                $res = $this->query( "SELECT nextval('$safeseq')" );
                $row = $this->fetchRow( $res );
-               $this->mInsertId = $row[0];
+               $this->mInsertId = is_null( $row[0] ) ? null : (int)$row[0];
 
                return $this->mInsertId;
        }
@@ -818,7 +828,7 @@ __INDEXATTR__;
                $oldName = $this->addIdentifierQuotes( $oldName );
 
                return $this->query( 'CREATE ' . ( $temporary ? 'TEMPORARY ' : '' ) . " TABLE $newName " .
-                       "(LIKE $oldName INCLUDING DEFAULTS)", $fname );
+                       "(LIKE $oldName INCLUDING DEFAULTS INCLUDING INDEXES)", $fname );
        }
 
        public function listTables( $prefix = null, $fname = __METHOD__ ) {
@@ -857,10 +867,10 @@ __INDEXATTR__;
         *
         * @since 1.19
         * @param string $text Postgreql array returned in a text form like {a,b}
-        * @param string $output
+        * @param string[] $output
         * @param int|bool $limit
         * @param int $offset
-        * @return string
+        * @return string[]
         */
        private function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
                if ( false === $limit ) {
@@ -985,7 +995,7 @@ __INDEXATTR__;
                                /**
                                 * Prepend our schema (e.g. 'mediawiki') in front
                                 * of the search path
-                                * Fixes bug 15816
+                                * Fixes T17816
                                 */
                                $search_path = $this->getSearchPath();
                                array_unshift( $search_path,
@@ -1026,7 +1036,7 @@ __INDEXATTR__;
                                // Normal client
                                $this->numericVersion = $versionInfo['server'];
                        } else {
-                               // Bug 16937: broken pgsql extension from PHP<5.3
+                               // T18937: broken pgsql extension from PHP<5.3
                                $this->numericVersion = pg_parameter_status( $conn, 'server_version' );
                        }
                }
@@ -1079,8 +1089,8 @@ __INDEXATTR__;
                $q = <<<SQL
        SELECT 1 FROM pg_class, pg_namespace, pg_trigger
                WHERE relnamespace=pg_namespace.oid AND relkind='r'
-                         AND tgrelid=pg_class.oid
-                         AND nspname=%s AND relname=%s AND tgname=%s
+                       AND tgrelid=pg_class.oid
+                       AND nspname=%s AND relname=%s AND tgname=%s
 SQL;
                $res = $this->query(
                        sprintf(
@@ -1252,12 +1262,6 @@ SQL;
 
                $preLimitTail .= $this->makeOrderBy( $options );
 
-               // if ( isset( $options['LIMIT'] ) ) {
-               //      $tailOpts .= $this->limitResult( '', $options['LIMIT'],
-               //              isset( $options['OFFSET'] ) ? $options['OFFSET']
-               //              : false );
-               // }
-
                if ( isset( $options['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE OF ' .
                                implode( ', ', array_map( [ $this, 'tableName' ], $options['FOR UPDATE'] ) );
@@ -1309,6 +1313,33 @@ SQL;
                return parent::streamStatementEnd( $sql, $newLine );
        }
 
+       public function doLockTables( array $read, array $write, $method ) {
+               $tablesWrite = [];
+               foreach ( $write as $table ) {
+                       $tablesWrite[] = $this->tableName( $table );
+               }
+               $tablesRead = [];
+               foreach ( $read as $table ) {
+                       $tablesRead[] = $this->tableName( $table );
+               }
+
+               // Acquire locks for the duration of the current transaction...
+               if ( $tablesWrite ) {
+                       $this->query(
+                               'LOCK TABLE ONLY ' . implode( ',', $tablesWrite ) . ' IN EXCLUSIVE MODE',
+                               $method
+                       );
+               }
+               if ( $tablesRead ) {
+                       $this->query(
+                               'LOCK TABLE ONLY ' . implode( ',', $tablesRead ) . ' IN SHARE MODE',
+                               $method
+                       );
+               }
+
+               return true;
+       }
+
        public function lockIsFree( $lockName, $method ) {
                // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
                $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
@@ -1360,6 +1391,8 @@ SQL;
         * @return string Integer
         */
        private function bigintFromLockName( $lockName ) {
-               return Wikimedia\base_convert( substr( sha1( $lockName ), 0, 15 ), 16, 10 );
+               return \Wikimedia\base_convert( substr( sha1( $lockName ), 0, 15 ), 16, 10 );
        }
 }
+
+class_alias( DatabasePostgres::class, 'DatabasePostgres' );
index 30bfcf8..60b6855 100644 (file)
  * @file
  * @ingroup Database
  */
-use Wikimedia\Rdbms\Blob;
-use Wikimedia\Rdbms\SQLiteField;
+namespace Wikimedia\Rdbms;
+
+use PDO;
+use PDOException;
+use LockManager;
+use FSLockManager;
+use InvalidArgumentException;
+use RuntimeException;
+use stdClass;
 
 /**
  * @ingroup Database
@@ -115,8 +122,10 @@ class DatabaseSqlite extends Database {
                $p['dbFilePath'] = $filename;
                $p['schema'] = false;
                $p['tablePrefix'] = '';
+               /** @var DatabaseSqlite $db */
+               $db = Database::factory( 'sqlite', $p );
 
-               return Database::factory( 'sqlite', $p );
+               return $db;
        }
 
        /**
@@ -803,18 +812,6 @@ class DatabaseSqlite extends Database {
                }
        }
 
-       /**
-        * @return string
-        */
-       function buildLike() {
-               $params = func_get_args();
-               if ( count( $params ) > 0 && is_array( $params[0] ) ) {
-                       $params = $params[0];
-               }
-
-               return parent::buildLike( $params ) . "ESCAPE '\' ";
-       }
-
        /**
         * @param string $field Field or column to cast
         * @return string
@@ -1047,3 +1044,6 @@ class DatabaseSqlite extends Database {
                return 'SQLite ' . (string)$this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION );
        }
 }
+
+class_alias( DatabaseSqlite::class, 'DatabaseSqlite' );
+
index f7bb6cf..bec26a6 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
 use Wikimedia\ScopedCallback;
-use Wikimedia\Rdbms\Blob;
-use Wikimedia\Rdbms\LikeMatch;
-use Wikimedia\Rdbms\DBMasterPos;
-use Wikimedia\Rdbms\Field;
+use Exception;
+use RuntimeException;
+use UnexpectedValueException;
+use stdClass;
 
 /**
  * Basic database interface for live and lazy-loaded relation database handles
@@ -363,7 +365,7 @@ interface IDatabase {
         * member variables.
         * If no more rows are available, false is returned.
         *
-        * @param ResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
+        * @param IResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
         * @return stdClass|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -374,7 +376,7 @@ interface IDatabase {
         * form. Fields are retrieved with $row['fieldname'].
         * If no more rows are available, false is returned.
         *
-        * @param ResultWrapper $res Result object as returned from IDatabase::query(), etc.
+        * @param IResultWrapper $res Result object as returned from IDatabase::query(), etc.
         * @return array|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -517,7 +519,7 @@ interface IDatabase {
         * @param bool $tempIgnore Whether to avoid throwing an exception on errors...
         *     maybe best to catch the exception instead?
         * @throws DBError
-        * @return bool|ResultWrapper True for a successful write query, ResultWrapper object
+        * @return bool|IResultWrapper True for a successful write query, IResultWrapper object
         *     for a successful read query, or false on failure if $tempIgnore set
         */
        public function query( $sql, $fname = __METHOD__, $tempIgnore = false );
@@ -731,7 +733,7 @@ interface IDatabase {
         *
         *    [ 'page' => [ 'LEFT JOIN', 'page_latest=rev_id' ] ]
         *
-        * @return ResultWrapper|bool If the query returned no rows, a ResultWrapper
+        * @return IResultWrapper|bool If the query returned no rows, a IResultWrapper
         *   with no rows in it will be returned. If there was a query error, a
         *   DBQueryError exception will be thrown, except if the "ignore errors"
         *   option was set, in which case false will be returned.
@@ -1027,11 +1029,25 @@ interface IDatabase {
         */
        public function buildStringCast( $field );
 
+       /**
+        * Returns true if DBs are assumed to be on potentially different servers
+        *
+        * In systems like mysql/mariadb, different databases can easily be referenced on a single
+        * connection merely by name, even in a single query via JOIN. On the other hand, Postgres
+        * treats databases as fully separate, only allowing mechanisms like postgres_fdw to
+        * effectively "mount" foreign DBs. This is true even among DBs on the same server.
+        *
+        * @return bool
+        * @since 1.29
+        */
+       public function databasesAreIndependent();
+
        /**
         * Change the current database
         *
         * @param string $db
         * @return bool Success or failure
+        * @throws DBConnectionError If databasesAreIndependent() is true and an error occurs
         */
        public function selectDB( $db );
 
@@ -1196,7 +1212,7 @@ interface IDatabase {
         *   for the format. Use $conds == "*" to delete all rows
         * @param string $fname Name of the calling function
         * @throws DBUnexpectedError
-        * @return bool|ResultWrapper
+        * @return bool|IResultWrapper
         */
        public function delete( $table, $conds, $fname = __METHOD__ );
 
@@ -1224,7 +1240,7 @@ interface IDatabase {
         * @param array $selectOptions Options for the SELECT part of the query, see
         *    IDatabase::select() for details.
         *
-        * @return ResultWrapper
+        * @return IResultWrapper
         */
        public function insertSelect( $destTable, $srcTable, $varMap, $conds,
                $fname = __METHOD__,
@@ -1260,7 +1276,7 @@ interface IDatabase {
        public function conditional( $cond, $trueVal, $falseVal );
 
        /**
-        * Returns a comand for str_replace function in SQL query.
+        * Returns a command for str_replace function in SQL query.
         * Uses REPLACE() in MySQL
         *
         * @param string $orig Column to modify
@@ -1801,3 +1817,5 @@ interface IDatabase {
         */
        public function setTableAliases( array $aliases );
 }
+
+class_alias( IDatabase::class, 'IDatabase' );
index 43cec28..fbc2774 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
+use Exception;
+use RuntimeException;
 
 /**
  * Advanced database interface for IDatabase handles that include maintenance methods
@@ -205,4 +209,73 @@ interface IMaintainableDatabase extends IDatabase {
        public function duplicateTableStructure(
                $oldName, $newName, $temporary = false, $fname = __METHOD__
        );
+
+       /**
+        * Checks if table locks acquired by lockTables() are transaction-bound in their scope
+        *
+        * Transaction-bound table locks will be released when the current transaction terminates.
+        * Table locks that are not bound to a transaction are not effected by BEGIN/COMMIT/ROLLBACK
+        * and will last until either lockTables()/unlockTables() is called or the TCP connection to
+        * the database is closed.
+        *
+        * @return bool
+        * @since 1.29
+        */
+       public function tableLocksHaveTransactionScope();
+
+       /**
+        * Lock specific tables
+        *
+        * Any pending transaction should be resolved before calling this method, since:
+        *   a) Doing so resets any REPEATABLE-READ snapshot of the data to a fresh one.
+        *   b) Previous row and table locks from the transaction or session may be released
+        *      by LOCK TABLES, which may be unsafe for the changes in such a transaction.
+        *   c) The main use case of lockTables() is to avoid deadlocks and timeouts by locking
+        *      entire tables in order to do long-running, batched, and lag-aware, updates. Batching
+        *      and replication lag checks do not work when all the updates happen in a transaction.
+        *
+        * Always get all relevant table locks up-front in one call, since LOCK TABLES might release
+        * any prior table locks on some RDBMes (e.g MySQL).
+        *
+        * For compatibility, callers should check tableLocksHaveTransactionScope() before using
+        * this method. If locks are scoped specifically to transactions then caller must either:
+        *   - a) Start a new transaction and acquire table locks for the scope of that transaction,
+        *        doing all row updates within that transaction. It will not be possible to update
+        *        rows in batches; this might result in high replication lag.
+        *   - b) Forgo table locks entirely and avoid calling this method. Careful use of hints like
+        *        LOCK IN SHARE MODE and FOR UPDATE and the use of query batching may be preferrable
+        *        to using table locks with a potentially large transaction. Use of MySQL and Postges
+        *        style REPEATABLE-READ (Snapshot Isolation with or without First-Committer-Rule) can
+        *        also be considered for certain tasks that require a consistent view of entire tables.
+        *
+        * If session scoped locks are not supported, then calling lockTables() will trigger
+        * startAtomic(), with unlockTables() triggering endAtomic(). This will automatically
+        * start a transaction if one is not already present and cause the locks to be released
+        * when the transaction finishes (normally during the unlockTables() call).
+        *
+        * In any case, avoid using begin()/commit() in code that runs while such table locks are
+        * acquired, as that breaks in case when a transaction is needed. The startAtomic() and
+        * endAtomic() methods are safe, however, since they will join any existing transaction.
+        *
+        * @param array $read Array of tables to lock for read access
+        * @param array $write Array of tables to lock for write access
+        * @param string $method Name of caller
+        * @return bool
+        * @since 1.29
+        */
+       public function lockTables( array $read, array $write, $method );
+
+       /**
+        * Unlock all tables locked via lockTables()
+        *
+        * If table locks are scoped to transactions, then locks might not be released until the
+        * transaction ends, which could happen after this method is called.
+        *
+        * @param string $method The caller
+        * @return bool
+        * @since 1.29
+        */
+       public function unlockTables( $method );
 }
+
+class_alias( IMaintainableDatabase::class, 'IMaintainableDatabase' );
index fa3ddf9..6c94eb9 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 /**
  * 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
@@ -65,4 +68,18 @@ class MaintainableDBConnRef extends DBConnRef implements IMaintainableDatabase {
        ) {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
+
+       public function tableLocksHaveTransactionScope() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function lockTables( array $read, array $write, $method ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function unlockTables( $method ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
 }
+
+class_alias( MaintainableDBConnRef::class, 'MaintainableDBConnRef' );
index 1a046cf..fd7af11 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use stdClass;
+
 /**
  * Overloads the relevant methods of the real ResultsWrapper so it
  * doesn't go anywhere near an actual database.
@@ -56,3 +61,6 @@ class FakeResultWrapper extends ResultWrapper {
                return $this->fetchObject();
        }
 }
+
+class_alias( FakeResultWrapper::class, 'FakeResultWrapper' );
+
index b591f4f..4e28397 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
+use stdClass;
+
 class MssqlResultWrapper extends ResultWrapper {
        /** @var integer|null */
        private $mSeekTo = null;
index 88e7cdd..df354af 100644 (file)
@@ -1,6 +1,9 @@
 <?php
 
-use Wikimedia\Rdbms\IResultWrapper;
+namespace Wikimedia\Rdbms;
+
+use stdClass;
+use RuntimeException;
 
 /**
  * Result wrapper for grabbing data queried from an IDatabase object
@@ -78,7 +81,7 @@ class ResultWrapper implements IResultWrapper {
         */
        private function getDB() {
                if ( !$this->db ) {
-                       throw new RuntimeException( get_class( $this ) . ' needs a DB handle for iteration.' );
+                       throw new RuntimeException( static::class . ' needs a DB handle for iteration.' );
                }
 
                return $this->db;
@@ -115,3 +118,5 @@ class ResultWrapper implements IResultWrapper {
                return $this->current() !== false;
        }
 }
+
+class_alias( ResultWrapper::class, 'ResultWrapper' );
index 8ae78e9..cf5060e 100644 (file)
@@ -18,6 +18,9 @@
  * @file
  * @ingroup Database
  */
+
+namespace Wikimedia\Rdbms;
+
 use Psr\Log\LoggerInterface;
 
 /**
index c3367e7..cbc8ca3 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use Wikimedia\Rdbms\ILoadBalancer;
+use Wikimedia\Rdbms\IDatabase;
 
 /**@{
  * Database related constants
index 864dea0..97e03b2 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * Exception class for attempted DB access
  * @ingroup Database
@@ -28,3 +30,5 @@ class DBAccessError extends DBUnexpectedError {
                parent::__construct( null, "Database access has been disabled." );
        }
 }
+
+class_alias( DBAccessError::class, 'DBAccessError' );
index 47f8c96..0091524 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
 
 /**
  * @ingroup Database
@@ -36,3 +37,5 @@ class DBConnectionError extends DBExpectedError {
                parent::__construct( $db, $msg );
        }
 }
+
+class_alias( DBConnectionError::class, 'DBConnectionError' );
index 526596d..d65e2d3 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use Exception;
+
 /**
  * Database error base class
  * @ingroup Database
@@ -37,3 +41,5 @@ class DBError extends Exception {
                parent::__construct( $error );
        }
 }
+
+class_alias( DBError::class, 'DBError' );
index 7d303b1..f6b9bd5 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
+use MessageSpecifier;
+use ILocalizedException;
+use Message;
+
 /**
  * Base class for the more common types of database errors. These are known to occur
  * frequently, so we try to give friendly error messages for them.
@@ -51,3 +57,5 @@ class DBExpectedError extends DBError implements MessageSpecifier, ILocalizedExc
                return Message::newFromSpecifier( $this );
        }
 }
+
+class_alias( DBExpectedError::class, 'DBExpectedError' );
index 002d253..bc2a865 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * @ingroup Database
  */
@@ -61,3 +63,5 @@ class DBQueryError extends DBExpectedError {
                $this->fname = $fname;
        }
 }
+
+class_alias( DBQueryError::class, 'DBQueryError' );
index d4dce1e..4393343 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * @ingroup Database
  */
 class DBReadOnlyError extends DBExpectedError {
 }
+
+class_alias( DBReadOnlyError::class, 'DBReadOnlyError' );
index c5e1ed7..457431e 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * Exception class for replica DB wait timeouts
  * @ingroup Database
  */
 class DBReplicationWaitError extends DBExpectedError {
 }
+
+class_alias( DBReplicationWaitError::class, 'DBReplicationWaitError' );
index a488667..fd79773 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * @ingroup Database
  */
 class DBTransactionError extends DBExpectedError {
 }
+
+class_alias( DBTransactionError::class, 'DBTransactionError' );
+
index 4e467b2..e45b9f3 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * @ingroup Database
  */
@@ -27,3 +29,5 @@ class DBTransactionSizeError extends DBTransactionError {
                return 'transaction-duration-limit-exceeded';
        }
 }
+
+class_alias( DBTransactionSizeError::class, 'DBTransactionSizeError' );
index 5a12671..9c67eb5 100644 (file)
  * @ingroup Database
  */
 
+namespace Wikimedia\Rdbms;
+
 /**
  * @ingroup Database
  */
 class DBUnexpectedError extends DBError {
 }
+
+class_alias( DBUnexpectedError::class, 'DBUnexpectedError' );
index c5819a3..600f34a 100644 (file)
@@ -2,8 +2,6 @@
 
 namespace Wikimedia\Rdbms;
 
-use DatabasePostgres;
-
 class PostgresField implements Field {
        private $name, $tablename, $type, $nullable, $max_length, $deferred, $deferrable, $conname,
                $has_default, $default;
index faf7fb1..ac79acc 100644 (file)
@@ -24,8 +24,6 @@
 namespace Wikimedia\Rdbms;
 
 use InvalidArgumentException;
-use DBTransactionError;
-use DBReplicationWaitError;
 
 /**
  * An interface for generating database load balancers
index c4229bc..53d5ef4 100644 (file)
@@ -30,9 +30,6 @@ use EmptyBagOStuff;
 use WANObjectCache;
 use Exception;
 use RuntimeException;
-use IDatabase;
-use DBTransactionError;
-use DBReplicationWaitError;
 
 /**
  * An interface for generating database load balancers
@@ -336,7 +333,7 @@ abstract class LBFactory implements ILBFactory {
                $masterPositions = array_fill( 0, count( $lbs ), false );
                foreach ( $lbs as $i => $lb ) {
                        if ( $lb->getServerCount() <= 1 ) {
-                               // Bug 27975 - Don't try to wait for replica DBs if there are none
+                               // T29975 - Don't try to wait for replica DBs if there are none
                                // Prevents permission error when getting master position
                                continue;
                        } elseif ( $opts['ifWritesSince']
@@ -508,7 +505,8 @@ abstract class LBFactory implements ILBFactory {
                        'errorLogger' => $this->errorLogger,
                        'hostname' => $this->hostname,
                        'cliMode' => $this->cliMode,
-                       'agent' => $this->agent
+                       'agent' => $this->agent,
+                       'chronologyProtector' => $this->getChronologyProtector()
                ];
        }
 
@@ -579,3 +577,5 @@ abstract class LBFactory implements ILBFactory {
                $this->destroy();
        }
 }
+
+class_alias( LBFactory::class, 'LBFactory' );
index 447b96f..0384588 100644 (file)
@@ -23,7 +23,6 @@
 
 namespace Wikimedia\Rdbms;
 
-use IDatabase;
 use InvalidArgumentException;
 
 /**
@@ -252,9 +251,7 @@ class LBFactoryMulti extends LBFactory {
        public function getMainLB( $domain = false ) {
                $section = $this->getSectionForDomain( $domain );
                if ( !isset( $this->mainLBs[$section] ) ) {
-                       $lb = $this->newMainLB( $domain );
-                       $this->getChronologyProtector()->initLB( $lb );
-                       $this->mainLBs[$section] = $lb;
+                       $this->mainLBs[$section] = $this->newMainLB( $domain );
                }
 
                return $this->mainLBs[$section];
@@ -283,7 +280,6 @@ class LBFactoryMulti extends LBFactory {
        public function getExternalLB( $cluster ) {
                if ( !isset( $this->extLBs[$cluster] ) ) {
                        $this->extLBs[$cluster] = $this->newExternalLB( $cluster );
-                       $this->getChronologyProtector()->initLB( $this->extLBs[$cluster] );
                }
 
                return $this->extLBs[$cluster];
index 15cd508..df0a806 100644 (file)
@@ -89,7 +89,6 @@ class LBFactorySimple extends LBFactory {
        public function getMainLB( $domain = false ) {
                if ( !isset( $this->mainLB ) ) {
                        $this->mainLB = $this->newMainLB( $domain );
-                       $this->getChronologyProtector()->initLB( $this->mainLB );
                }
 
                return $this->mainLB;
@@ -106,7 +105,6 @@ class LBFactorySimple extends LBFactory {
        public function getExternalLB( $cluster ) {
                if ( !isset( $this->extLBs[$cluster] ) ) {
                        $this->extLBs[$cluster] = $this->newExternalLB( $cluster );
-                       $this->getChronologyProtector()->initLB( $this->extLBs[$cluster] );
                }
 
                return $this->extLBs[$cluster];
index 5931d80..cd998c3 100644 (file)
@@ -23,7 +23,6 @@
 
 namespace Wikimedia\Rdbms;
 
-use IDatabase;
 use InvalidArgumentException;
 use BadMethodCallException;
 
index 4c277ff..79827a2 100644 (file)
  */
 namespace Wikimedia\Rdbms;
 
-use IDatabase;
-use Database;
-use DBConnRef;
-use MaintainableDBConnRef;
-use DBError;
-use DBAccessError;
-use DBTransactionError;
-use DBExpectedError;
 use Exception;
 use InvalidArgumentException;
 
@@ -105,6 +97,7 @@ interface ILoadBalancer {
         *  - srvCache : BagOStuff object for server cache [optional]
         *  - memCache : BagOStuff object for cluster memory cache [optional]
         *  - wanCache : WANObjectCache object [optional]
+        *  - chronologyProtector: ChronologyProtector object [optional]
         *  - hostname : The name of the current server [optional]
         *  - cliMode: Whether the execution context is a CLI script. [optional]
         *  - profiler : Class name or instance with profileIn()/profileOut() methods. [optional]
@@ -138,7 +131,11 @@ interface ILoadBalancer {
         * 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
+        * This only applies to connections to the generic replica DB for this request.
+        * If a timeout happens when waiting, then getLaggedReplicaMode()/laggedReplicaUsed()
+        * will return true.
+        *
+        * @param DBMasterPos|bool $pos Master position or false
         */
        public function waitFor( $pos );
 
@@ -147,7 +144,7 @@ interface ILoadBalancer {
         *
         * This can be used a faster proxy for waitForAll()
         *
-        * @param DBMasterPos $pos
+        * @param DBMasterPos|bool $pos Master position or false
         * @param int $timeout Max seconds to wait; default is mWaitTimeout
         * @return bool Success (able to connect and no timeouts reached)
         */
@@ -156,7 +153,7 @@ interface ILoadBalancer {
        /**
         * Set the master wait position and wait for ALL replica DBs to catch up to it
         *
-        * @param DBMasterPos $pos
+        * @param DBMasterPos|bool $pos Master position or false
         * @param int $timeout Max seconds to wait; default is mWaitTimeout
         * @return bool Success (able to connect and no timeouts reached)
         */
@@ -289,6 +286,8 @@ interface ILoadBalancer {
         * Return the server info structure for a given index, or false if the index is invalid.
         * @param int $i
         * @return array|bool
+        *
+        * @deprecated Since 1.30, no alternative
         */
        public function getServerInfo( $i );
 
@@ -297,6 +296,8 @@ interface ILoadBalancer {
         * is created if it doesn't exist
         * @param int $i
         * @param array $serverInfo
+        *
+        * @deprecated Since 1.30, construct new object
         */
        public function setServerInfo( $i, array $serverInfo );
 
@@ -443,13 +444,17 @@ interface ILoadBalancer {
        /**
         * @note This method will trigger a DB connection if not yet done
         * @param string|bool $domain Domain ID, or false for the current domain
-        * @return bool Whether the generic connection for reads is highly "lagged"
+        * @return bool Whether the database for generic connections this request is highly "lagged"
         */
        public function getLaggedReplicaMode( $domain = false );
 
        /**
+        * Checks whether the database for generic connections this request was both:
+        *   - a) Already choosen due to a prior connection attempt
+        *   - b) Considered highly "lagged"
+        *
         * @note This method will never cause a new DB connection
-        * @return bool Whether any generic connection used for reads was highly "lagged"
+        * @return bool
         */
        public function laggedReplicaUsed();
 
index 6878712..0fc00a8 100644 (file)
@@ -25,21 +25,10 @@ namespace Wikimedia\Rdbms;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use Wikimedia\ScopedCallback;
-use IDatabase;
-use Database;
-use DBConnRef;
-use MaintainableDBConnRef;
 use BagOStuff;
 use EmptyBagOStuff;
 use WANObjectCache;
 use ArrayUtils;
-use DBError;
-use DBAccessError;
-use DBExpectedError;
-use DBUnexpectedError;
-use DBTransactionError;
-use DBTransactionSizeError;
-use DBConnectionError;
 use InvalidArgumentException;
 use RuntimeException;
 use Exception;
@@ -52,7 +41,7 @@ use Exception;
 class LoadBalancer implements ILoadBalancer {
        /** @var array[] Map of (server index => server config array) */
        private $mServers;
-       /** @var \Database[][][] Map of local/foreignUsed/foreignFree => server index => IDatabase array */
+       /** @var Database[][][] Map of local/foreignUsed/foreignFree => server index => IDatabase array */
        private $mConns;
        /** @var float[] Map of (server index => weight) */
        private $mLoads;
@@ -69,6 +58,8 @@ class LoadBalancer implements ILoadBalancer {
 
        /** @var ILoadMonitor */
        private $loadMonitor;
+       /** @var ChronologyProtector|null */
+       private $chronProt;
        /** @var BagOStuff */
        private $srvCache;
        /** @var BagOStuff */
@@ -88,7 +79,7 @@ class LoadBalancer implements ILoadBalancer {
        /** @var LoggerInterface */
        protected $perfLogger;
 
-       /** @var \Database Database connection that caused a problem */
+       /** @var Database DB connection object that caused a problem */
        private $errorConnection;
        /** @var integer The generic (not query grouped) replica DB index (of $mServers) */
        private $mReadIndex;
@@ -124,6 +115,8 @@ class LoadBalancer implements ILoadBalancer {
 
        /** @var boolean */
        private $disabled = false;
+       /** @var boolean */
+       private $chronProtInitialized = false;
 
        /** @var integer Warn when this many connection are held */
        const CONN_HELD_WARN_THRESHOLD = 10;
@@ -222,6 +215,10 @@ class LoadBalancer implements ILoadBalancer {
                        : ( gethostname() ?: 'unknown' );
                $this->cliMode = isset( $params['cliMode'] ) ? $params['cliMode'] : PHP_SAPI === 'cli';
                $this->agent = isset( $params['agent'] ) ? $params['agent'] : '';
+
+               if ( isset( $params['chronologyProtector'] ) ) {
+                       $this->chronProt = $params['chronologyProtector'];
+               }
        }
 
        /**
@@ -272,11 +269,11 @@ class LoadBalancer implements ILoadBalancer {
                                $host = $this->getServerName( $i );
                                if ( $lag === false && !is_infinite( $maxServerLag ) ) {
                                        $this->replLogger->error(
-                                               "Server {host} (#$i) is not replicating?", [ 'host' => $host ] );
+                                               "Server {host} is not replicating?", [ 'host' => $host ] );
                                        unset( $loads[$i] );
                                } elseif ( $lag > $maxServerLag ) {
                                        $this->replLogger->warning(
-                                               "Server {host} (#$i) has {lag} seconds of lag (>= {maxlag})",
+                                               "Server {host} has {lag} seconds of lag (>= {maxlag})",
                                                [ 'host' => $host, 'lag' => $lag, 'maxlag' => $maxServerLag ]
                                        );
                                        unset( $loads[$i] );
@@ -307,60 +304,99 @@ class LoadBalancer implements ILoadBalancer {
 
        public function getReaderIndex( $group = false, $domain = false ) {
                if ( count( $this->mServers ) == 1 ) {
-                       # Skip the load balancing if there's only one server
+                       // Skip the load balancing if there's only one server
                        return $this->getWriterIndex();
                } elseif ( $group === false && $this->mReadIndex >= 0 ) {
-                       # Shortcut if generic reader exists already
+                       // Shortcut if the generic reader index was already cached
                        return $this->mReadIndex;
                }
 
-               # Find the relevant load array
                if ( $group !== false ) {
+                       // Use the server weight array for this load group
                        if ( isset( $this->mGroupLoads[$group] ) ) {
-                               $nonErrorLoads = $this->mGroupLoads[$group];
+                               $loads = $this->mGroupLoads[$group];
                        } else {
-                               # No loads for this group, return false and the caller can use some other group
+                               // No loads for this group, return false and the caller can use some other group
                                $this->connLogger->info( __METHOD__ . ": no loads for group $group" );
 
                                return false;
                        }
                } else {
-                       $nonErrorLoads = $this->mLoads;
+                       // Use the generic load group
+                       $loads = $this->mLoads;
                }
 
-               if ( !count( $nonErrorLoads ) ) {
-                       throw new InvalidArgumentException( "Empty server array given to LoadBalancer" );
+               // Scale the configured load ratios according to each server's load and state
+               $this->getLoadMonitor()->scaleLoads( $loads, $domain );
+
+               // Pick a server to use, accounting for weights, load, lag, and mWaitForPos
+               list( $i, $laggedReplicaMode ) = $this->pickReaderIndex( $loads, $domain );
+               if ( $i === false ) {
+                       // Replica DB connection unsuccessful
+                       return false;
+               }
+
+               if ( $this->mWaitForPos && $i != $this->getWriterIndex() ) {
+                       // Before any data queries are run, wait for the server to catch up to the
+                       // specified position. This is used to improve session consistency. Note that
+                       // when LoadBalancer::waitFor() sets mWaitForPos, the waiting triggers here,
+                       // so update laggedReplicaMode as needed for consistency.
+                       if ( !$this->doWait( $i ) ) {
+                               $laggedReplicaMode = true;
+                       }
                }
 
-               # Scale the configured load ratios according to the dynamic load if supported
-               $this->getLoadMonitor()->scaleLoads( $nonErrorLoads, $domain );
+               if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
+                       // Cache the generic reader index for future ungrouped DB_REPLICA handles
+                       $this->mReadIndex = $i;
+                       // Record if the generic reader index is in "lagged replica DB" mode
+                       if ( $laggedReplicaMode ) {
+                               $this->laggedReplicaMode = true;
+                       }
+               }
 
-               $laggedReplicaMode = false;
+               $serverName = $this->getServerName( $i );
+               $this->connLogger->debug( __METHOD__ . ": using server $serverName for group '$group'" );
 
-               # No server found yet
+               return $i;
+       }
+
+       /**
+        * @param array $loads List of server weights
+        * @param string|bool $domain
+        * @return array (reader index, lagged replica mode) or false on failure
+        */
+       private function pickReaderIndex( array $loads, $domain = false ) {
+               if ( !count( $loads ) ) {
+                       throw new InvalidArgumentException( "Empty server array given to LoadBalancer" );
+               }
+
+               /** @var $i int|bool Index of selected server */
                $i = false;
-               # First try quickly looking through the available servers for a server that
-               # meets our criteria
-               $currentLoads = $nonErrorLoads;
+               /** @var $laggedReplicaMode bool Whether server is considered lagged */
+               $laggedReplicaMode = false;
+
+               // Quickly look through the available servers for a server that meets criteria...
+               $currentLoads = $loads;
                while ( count( $currentLoads ) ) {
                        if ( $this->mAllowLagged || $laggedReplicaMode ) {
                                $i = ArrayUtils::pickRandom( $currentLoads );
                        } else {
                                $i = false;
                                if ( $this->mWaitForPos && $this->mWaitForPos->asOfTime() ) {
-                                       # ChronologyProtecter causes mWaitForPos to be set via sessions.
-                                       # This triggers doWait() after connect, so it's especially good to
-                                       # avoid lagged servers so as to avoid just blocking in that method.
+                                       // ChronologyProtecter sets mWaitForPos for session consistency.
+                                       // This triggers doWait() after connect, so it's especially good to
+                                       // avoid lagged servers so as to avoid excessive delay in that method.
                                        $ago = microtime( true ) - $this->mWaitForPos->asOfTime();
-                                       # Aim for <= 1 second of waiting (being too picky can backfire)
+                                       // Aim for <= 1 second of waiting (being too picky can backfire)
                                        $i = $this->getRandomNonLagged( $currentLoads, $domain, $ago + 1 );
                                }
                                if ( $i === false ) {
-                                       # Any server with less lag than it's 'max lag' param is preferable
+                                       // Any server with less lag than it's 'max lag' param is preferable
                                        $i = $this->getRandomNonLagged( $currentLoads, $domain );
                                }
                                if ( $i === false && count( $currentLoads ) != 0 ) {
-                                       # All replica DBs lagged. Switch to read-only mode
+                                       // All replica DBs lagged. Switch to read-only mode
                                        $this->replLogger->error( "All replica DBs lagged. Switch to read-only mode" );
                                        $i = ArrayUtils::pickRandom( $currentLoads );
                                        $laggedReplicaMode = true;
@@ -368,12 +404,12 @@ class LoadBalancer implements ILoadBalancer {
                        }
 
                        if ( $i === false ) {
-                               # pickRandom() returned false
-                               # This is permanent and means the configuration or the load monitor
-                               # wants us to return false.
+                               // pickRandom() returned false.
+                               // This is permanent and means the configuration or the load monitor
+                               // wants us to return false.
                                $this->connLogger->debug( __METHOD__ . ": pickRandom() returned false" );
 
-                               return false;
+                               return [ false, false ];
                        }
 
                        $serverName = $this->getServerName( $i );
@@ -382,8 +418,7 @@ class LoadBalancer implements ILoadBalancer {
                        $conn = $this->openConnection( $i, $domain );
                        if ( !$conn ) {
                                $this->connLogger->warning( __METHOD__ . ": Failed connecting to $i/$domain" );
-                               unset( $nonErrorLoads[$i] );
-                               unset( $currentLoads[$i] );
+                               unset( $currentLoads[$i] ); // avoid this server next iteration
                                $i = false;
                                continue;
                        }
@@ -394,85 +429,95 @@ class LoadBalancer implements ILoadBalancer {
                                $this->reuseConnection( $conn );
                        }
 
-                       # Return this server
+                       // Return this server
                        break;
                }
 
-               # If all servers were down, quit now
-               if ( !count( $nonErrorLoads ) ) {
+               // If all servers were down, quit now
+               if ( !count( $currentLoads ) ) {
                        $this->connLogger->error( "All servers down" );
                }
 
-               if ( $i !== false ) {
-                       # Replica DB connection successful.
-                       # Wait for the session master pos for a short time.
-                       if ( $this->mWaitForPos && $i > 0 ) {
-                               $this->doWait( $i );
-                       }
-                       if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
-                               $this->mReadIndex = $i;
-                               # Record if the generic reader index is in "lagged replica DB" mode
-                               if ( $laggedReplicaMode ) {
-                                       $this->laggedReplicaMode = true;
-                               }
-                       }
-                       $serverName = $this->getServerName( $i );
-                       $this->connLogger->debug(
-                               __METHOD__ . ": using server $serverName for group '$group'" );
-               }
-
-               return $i;
+               return [ $i, $laggedReplicaMode ];
        }
 
-       /**
-        * @param DBMasterPos|false $pos
-        */
        public function waitFor( $pos ) {
-               $this->mWaitForPos = $pos;
-               $i = $this->mReadIndex;
-
-               if ( $i > 0 ) {
-                       if ( !$this->doWait( $i ) ) {
-                               $this->laggedReplicaMode = true;
+               $oldPos = $this->mWaitForPos;
+               try {
+                       $this->mWaitForPos = $pos;
+                       // If a generic reader connection was already established, then wait now
+                       $i = $this->mReadIndex;
+                       if ( $i > 0 ) {
+                               if ( !$this->doWait( $i ) ) {
+                                       $this->laggedReplicaMode = true;
+                               }
                        }
+               } finally {
+                       // Restore the older position if it was higher since this is used for lag-protection
+                       $this->setWaitForPositionIfHigher( $oldPos );
                }
        }
 
        public function waitForOne( $pos, $timeout = null ) {
-               $this->mWaitForPos = $pos;
-
-               $i = $this->mReadIndex;
-               if ( $i <= 0 ) {
-                       // Pick a generic replica DB if there isn't one yet
-                       $readLoads = $this->mLoads;
-                       unset( $readLoads[$this->getWriterIndex()] ); // replica DBs only
-                       $readLoads = array_filter( $readLoads ); // with non-zero load
-                       $i = ArrayUtils::pickRandom( $readLoads );
-               }
+               $oldPos = $this->mWaitForPos;
+               try {
+                       $this->mWaitForPos = $pos;
+
+                       $i = $this->mReadIndex;
+                       if ( $i <= 0 ) {
+                               // Pick a generic replica DB if there isn't one yet
+                               $readLoads = $this->mLoads;
+                               unset( $readLoads[$this->getWriterIndex()] ); // replica DBs only
+                               $readLoads = array_filter( $readLoads ); // with non-zero load
+                               $i = ArrayUtils::pickRandom( $readLoads );
+                       }
 
-               if ( $i > 0 ) {
-                       $ok = $this->doWait( $i, true, $timeout );
-               } else {
-                       $ok = true; // no applicable loads
+                       if ( $i > 0 ) {
+                               $ok = $this->doWait( $i, true, $timeout );
+                       } else {
+                               $ok = true; // no applicable loads
+                       }
+               } finally {
+                       # Restore the old position, as this is not used for lag-protection but for throttling
+                       $this->mWaitForPos = $oldPos;
                }
 
                return $ok;
        }
 
        public function waitForAll( $pos, $timeout = null ) {
-               $this->mWaitForPos = $pos;
-               $serverCount = count( $this->mServers );
+               $oldPos = $this->mWaitForPos;
+               try {
+                       $this->mWaitForPos = $pos;
+                       $serverCount = count( $this->mServers );
 
-               $ok = true;
-               for ( $i = 1; $i < $serverCount; $i++ ) {
-                       if ( $this->mLoads[$i] > 0 ) {
-                               $ok = $this->doWait( $i, true, $timeout ) && $ok;
+                       $ok = true;
+                       for ( $i = 1; $i < $serverCount; $i++ ) {
+                               if ( $this->mLoads[$i] > 0 ) {
+                                       $ok = $this->doWait( $i, true, $timeout ) && $ok;
+                               }
                        }
+               } finally {
+                       # Restore the old position, as this is not used for lag-protection but for throttling
+                       $this->mWaitForPos = $oldPos;
                }
 
                return $ok;
        }
 
+       /**
+        * @param DBMasterPos|bool $pos
+        */
+       private function setWaitForPositionIfHigher( $pos ) {
+               if ( !$pos ) {
+                       return;
+               }
+
+               if ( !$this->mWaitForPos || $pos->hasReached( $this->mWaitForPos ) ) {
+                       $this->mWaitForPos = $pos;
+               }
+       }
+
        /**
         * @param int $i
         * @return IDatabase|bool
@@ -718,6 +763,13 @@ class LoadBalancer implements ILoadBalancer {
                        $domain = false; // local connection requested
                }
 
+               if ( !$this->chronProtInitialized && $this->chronProt ) {
+                       $this->connLogger->debug( __METHOD__ . ': calling initLB() before first connection.' );
+                       // Load CP positions before connecting so that doWait() triggers later if needed
+                       $this->chronProtInitialized = true;
+                       $this->chronProt->initLB( $this );
+               }
+
                if ( $domain !== false ) {
                        $conn = $this->openForeignConnection( $i, $domain );
                } elseif ( isset( $this->mConns['local'][$i][0] ) ) {
@@ -981,7 +1033,11 @@ class LoadBalancer implements ILoadBalancer {
                return ( $name != '' ) ? $name : 'localhost';
        }
 
+       /**
+        * @deprecated Since 1.30, no alternative
+        */
        public function getServerInfo( $i ) {
+               wfDeprecated( __METHOD__, '1.30' );
                if ( isset( $this->mServers[$i] ) ) {
                        return $this->mServers[$i];
                } else {
@@ -989,7 +1045,11 @@ class LoadBalancer implements ILoadBalancer {
                }
        }
 
+       /**
+        * @deprecated Since 1.30, construct new object
+        */
        public function setServerInfo( $i, array $serverInfo ) {
+               wfDeprecated( __METHOD__, '1.30' );
                $this->mServers[$i] = $serverInfo;
        }
 
index 5e92c33..d120b6f 100644 (file)
@@ -24,7 +24,6 @@ namespace Wikimedia\Rdbms;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use Wikimedia\ScopedCallback;
-use IDatabase;
 use BagOStuff;
 
 /**
index 613dac5..8bbf9e5 100644 (file)
@@ -28,14 +28,12 @@ class LoadMonitorNull implements ILoadMonitor {
        public function __construct(
                ILoadBalancer $lb, BagOStuff $sCache, BagOStuff $cCache, array $options = []
        ) {
-
        }
 
        public function setLogger( LoggerInterface $logger ) {
        }
 
        public function scaleLoads( array &$loads, $domain ) {
-
        }
 
        public function getLagTimes( array $serverIndexes, $domain ) {
@@ -43,6 +41,5 @@ class LoadMonitorNull implements ILoadMonitor {
        }
 
        public function clearCaches() {
-
        }
 }
index 7f43436..e3fc1a6 100644 (file)
@@ -49,6 +49,8 @@ class RedisConnectionPool implements LoggerAwareInterface {
        protected $persistent;
        /** @var int Serializer to use (Redis::SERIALIZER_*) */
        protected $serializer;
+       /** @var string ID for persistent connections */
+       protected $id;
 
        /** @var int Current idle pool size */
        protected $idlePoolSize = 0;
@@ -71,9 +73,10 @@ class RedisConnectionPool implements LoggerAwareInterface {
 
        /**
         * @param array $options
+        * @param string $id
         * @throws Exception
         */
-       protected function __construct( array $options ) {
+       protected function __construct( array $options, $id ) {
                if ( !class_exists( 'Redis' ) ) {
                        throw new RuntimeException(
                                __CLASS__ . ' requires a Redis client library. ' .
@@ -95,6 +98,7 @@ class RedisConnectionPool implements LoggerAwareInterface {
                } else {
                        throw new InvalidArgumentException( "Invalid serializer specified." );
                }
+               $this->id = $id;
        }
 
        /**
@@ -148,7 +152,7 @@ class RedisConnectionPool implements LoggerAwareInterface {
                $id = sha1( serialize( $options ) );
                // Initialize the object at the hash as needed...
                if ( !isset( self::$instances[$id] ) ) {
-                       self::$instances[$id] = new self( $options );
+                       self::$instances[$id] = new self( $options, $id );
                }
 
                return self::$instances[$id];
@@ -230,7 +234,7 @@ class RedisConnectionPool implements LoggerAwareInterface {
                $conn = new Redis();
                try {
                        if ( $this->persistent ) {
-                               $result = $conn->pconnect( $host, $port, $this->connectTimeout );
+                               $result = $conn->pconnect( $host, $port, $this->connectTimeout, $this->id );
                        } else {
                                $result = $conn->connect( $host, $port, $this->connectTimeout );
                        }
index dd1976c..a8af714 100644 (file)
@@ -69,7 +69,7 @@ class SamplingStatsdClient extends StatsdClient {
                return $data;
        }
 
-       /*
+       /**
         * Send the metrics over UDP
         * Sample the metrics according to their sample rate and send the remaining ones.
         *
diff --git a/includes/libs/time/ConvertibleTimestamp.php b/includes/libs/time/ConvertibleTimestamp.php
deleted file mode 100644 (file)
index c830b4e..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-<?php
-/**
- * Creation, parsing, and conversion of timestamps.
- *
- * 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
- * @since 1.20
- * @author Tyler Romeo, 2012
- */
-
-/**
- * Library for creating, parsing, and converting timestamps. Based on the JS
- * library that does the same thing.
- *
- * @since 1.28
- */
-class ConvertibleTimestamp {
-       /**
-        * Standard gmdate() formats for the different timestamp types.
-        */
-       private static $formats = [
-               TS_UNIX => 'U',
-               TS_MW => 'YmdHis',
-               TS_DB => 'Y-m-d H:i:s',
-               TS_ISO_8601 => 'Y-m-d\TH:i:s\Z',
-               TS_ISO_8601_BASIC => 'Ymd\THis\Z',
-               TS_EXIF => 'Y:m:d H:i:s', // This shouldn't ever be used, but is included for completeness
-               TS_RFC2822 => 'D, d M Y H:i:s',
-               TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500
-               TS_POSTGRES => 'Y-m-d H:i:s',
-       ];
-
-       /**
-        * The actual timestamp being wrapped (DateTime object).
-        * @var DateTime
-        */
-       public $timestamp;
-
-       /**
-        * Make a new timestamp and set it to the specified time,
-        * or the current time if unspecified.
-        *
-        * @param bool|string|int|float|DateTime $timestamp Timestamp to set, or false for current time
-        */
-       public function __construct( $timestamp = false ) {
-               if ( $timestamp instanceof DateTime ) {
-                       $this->timestamp = $timestamp;
-               } else {
-                       $this->setTimestamp( $timestamp );
-               }
-       }
-
-       /**
-        * Set the timestamp to the specified time, or the current time if unspecified.
-        *
-        * Parse the given timestamp into either a DateTime object or a Unix timestamp,
-        * and then store it.
-        *
-        * @param string|bool $ts Timestamp to store, or false for now
-        * @throws TimestampException
-        */
-       public function setTimestamp( $ts = false ) {
-               $m = [];
-               $da = [];
-               $strtime = '';
-
-               // We want to catch 0, '', null... but not date strings starting with a letter.
-               if ( !$ts || $ts === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ) {
-                       $uts = time();
-                       $strtime = "@$uts";
-               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
-                       # TS_DB
-               } elseif ( preg_match( '/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
-                       # TS_EXIF
-               } elseif ( preg_match( '/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/D', $ts, $da ) ) {
-                       # TS_MW
-               } elseif ( preg_match( '/^(-?\d{1,13})(\.\d+)?$/D', $ts, $m ) ) {
-                       # TS_UNIX
-                       $strtime = "@{$m[1]}"; // https://secure.php.net/manual/en/datetime.formats.compound.php
-               } elseif ( preg_match( '/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts ) ) {
-                       # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
-                       $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
-                               str_replace( '+00:00', 'UTC', $ts ) );
-               } elseif ( preg_match(
-                       '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_ISO_8601
-               } elseif ( preg_match(
-                       '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_ISO_8601_BASIC
-               } elseif ( preg_match(
-                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_POSTGRES
-               } elseif ( preg_match(
-                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/',
-                       $ts,
-                       $da
-               ) ) {
-                       # TS_POSTGRES
-               } elseif ( preg_match(
-               # Day of week
-                       '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' .
-                       # dd Mon yyyy
-                       '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .
-                       # hh:mm:ss
-                       '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S',
-                       $ts
-               ) ) {
-                       # TS_RFC2822, accepting a trailing comment.
-                       # See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
-                       # The regex is a superset of rfc2822 for readability
-                       $strtime = strtok( $ts, ';' );
-               } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) {
-                       # TS_RFC850
-                       $strtime = $ts;
-               } elseif ( preg_match( '/^[A-Z][a-z]{2} [A-Z][a-z]{2} +\d{1,2} \d\d:\d\d:\d\d \d{4}/', $ts ) ) {
-                       # asctime
-                       $strtime = $ts;
-               } else {
-                       throw new TimestampException( __METHOD__ . ": Invalid timestamp - $ts" );
-               }
-
-               if ( !$strtime ) {
-                       $da = array_map( 'intval', $da );
-                       $da[0] = "%04d-%02d-%02dT%02d:%02d:%02d.00+00:00";
-                       $strtime = call_user_func_array( "sprintf", $da );
-               }
-
-               try {
-                       $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
-               } catch ( Exception $e ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.', $e->getCode(), $e );
-               }
-
-               if ( $final === false ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timestamp format.' );
-               }
-
-               $this->timestamp = $final;
-       }
-
-       /**
-        * Convert a timestamp string to a given format.
-        *
-        * @param int $style Constant Output format for timestamp
-        * @param string $ts Timestamp
-        * @return string|bool Formatted timestamp or false on failure
-        */
-       public static function convert( $style = TS_UNIX, $ts ) {
-               try {
-                       $ct = new static( $ts );
-                       return $ct->getTimestamp( $style );
-               } catch ( TimestampException $e ) {
-                       return false;
-               }
-       }
-
-       /**
-        * Get the current time in the given format
-        *
-        * @param int $style Constant Output format for timestamp
-        * @return string
-        */
-       public static function now( $style = TS_MW ) {
-               return static::convert( $style, time() );
-       }
-
-       /**
-        * Get the timestamp represented by this object in a certain form.
-        *
-        * Convert the internal timestamp to the specified format and then
-        * return it.
-        *
-        * @param int $style Constant Output format for timestamp
-        * @throws TimestampException
-        * @return string The formatted timestamp
-        */
-       public function getTimestamp( $style = TS_UNIX ) {
-               if ( !isset( self::$formats[$style] ) ) {
-                       throw new TimestampException( __METHOD__ . ': Illegal timestamp output type.' );
-               }
-
-               $output = $this->timestamp->format( self::$formats[$style] );
-
-               if ( ( $style == TS_RFC2822 ) || ( $style == TS_POSTGRES ) ) {
-                       $output .= ' GMT';
-               }
-
-               if ( $style == TS_MW && strlen( $output ) !== 14 ) {
-                       throw new TimestampException( __METHOD__ . ': The timestamp cannot be represented in ' .
-                               'the specified format' );
-               }
-
-               return $output;
-       }
-
-       /**
-        * @return string
-        */
-       public function __toString() {
-               return $this->getTimestamp();
-       }
-
-       /**
-        * Calculate the difference between two ConvertibleTimestamp objects.
-        *
-        * @param ConvertibleTimestamp $relativeTo Base time to calculate difference from
-        * @return DateInterval|bool The DateInterval object representing the
-        *   difference between the two dates or false on failure
-        */
-       public function diff( ConvertibleTimestamp $relativeTo ) {
-               return $this->timestamp->diff( $relativeTo->timestamp );
-       }
-
-       /**
-        * Set the timezone of this timestamp to the specified timezone.
-        *
-        * @param string $timezone Timezone to set
-        * @throws TimestampException
-        */
-       public function setTimezone( $timezone ) {
-               try {
-                       $this->timestamp->setTimezone( new DateTimeZone( $timezone ) );
-               } catch ( Exception $e ) {
-                       throw new TimestampException( __METHOD__ . ': Invalid timezone.', $e->getCode(), $e );
-               }
-       }
-
-       /**
-        * Get the timezone of this timestamp.
-        *
-        * @return DateTimeZone The timezone
-        */
-       public function getTimezone() {
-               return $this->timestamp->getTimezone();
-       }
-
-       /**
-        * Format the timestamp in a given format.
-        *
-        * @param string $format Pattern to format in
-        * @return string The formatted timestamp
-        */
-       public function format( $format ) {
-               return $this->timestamp->format( $format );
-       }
-}
diff --git a/includes/libs/time/TimestampException.php b/includes/libs/time/TimestampException.php
deleted file mode 100644 (file)
index 36ffdee..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-/**
- * @since 1.20
- */
-class TimestampException extends Exception {
-}
diff --git a/includes/libs/time/defines.php b/includes/libs/time/defines.php
deleted file mode 100644 (file)
index ff4dde8..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-/**
- * Unix time - the number of seconds since 1970-01-01 00:00:00 UTC
- */
-define( 'TS_UNIX', 0 );
-
-/**
- * MediaWiki concatenated string timestamp (YYYYMMDDHHMMSS)
- */
-define( 'TS_MW', 1 );
-
-/**
- * MySQL DATETIME (YYYY-MM-DD HH:MM:SS)
- */
-define( 'TS_DB', 2 );
-
-/**
- * RFC 2822 format, for E-mail and HTTP headers
- */
-define( 'TS_RFC2822', 3 );
-
-/**
- * ISO 8601 format with no timezone: 1986-02-09T20:00:00Z
- *
- * This is used by Special:Export
- */
-define( 'TS_ISO_8601', 4 );
-
-/**
- * An Exif timestamp (YYYY:MM:DD HH:MM:SS)
- *
- * @see http://exif.org/Exif2-2.PDF The Exif 2.2 spec, see page 28 for the
- *       DateTime tag and page 36 for the DateTimeOriginal and
- *       DateTimeDigitized tags.
- */
-define( 'TS_EXIF', 5 );
-
-/**
- * Oracle format time.
- */
-define( 'TS_ORACLE', 6 );
-
-/**
- * Postgres format time.
- */
-define( 'TS_POSTGRES', 7 );
-
-/**
- * ISO 8601 basic format with no timezone: 19860209T200000Z.  This is used by ResourceLoader
- */
-define( 'TS_ISO_8601_BASIC', 9 );
index ccb14db..2f16078 100644 (file)
@@ -51,8 +51,7 @@ abstract class VirtualRESTService {
         * @return string The name of the service behind this VRS object.
         */
        public function getName() {
-               return isset( $this->params['name'] ) ? $this->params['name'] :
-                       get_class( $this );
+               return isset( $this->params['name'] ) ? $this->params['name'] : static::class;
        }
 
        /**
index 0d171f5..9d886bf 100644 (file)
@@ -272,7 +272,6 @@ class XMPReader implements LoggerAwareInterface {
                if ( isset( $data['xmp-exif']['GPSAltitudeRef'] )
                        && isset( $data['xmp-exif']['GPSAltitude'] )
                ) {
-
                        // Must convert to a real before multiplying by -1
                        // XMPValidate guarantees there will always be a '/' in this value.
                        list( $nom, $denom ) = explode( '/', $data['xmp-exif']['GPSAltitude'] );
@@ -647,7 +646,7 @@ class XMPReader implements LoggerAwareInterface {
        private function endElementNested( $elm ) {
 
                /* cur item must be the same as $elm, unless if in MODE_STRUCT
-                  in which case it could also be rdf:Description */
+                * in which case it could also be rdf:Description */
                if ( $this->curItem[0] !== $elm
                        && !( $elm === self::NS_RDF . ' Description'
                                && $this->mode[0] === self::MODE_STRUCT )
@@ -895,7 +894,7 @@ class XMPReader implements LoggerAwareInterface {
                if ( $elm === self::NS_RDF . ' Seq' ) {
                        array_unshift( $this->mode, self::MODE_LI );
                } elseif ( $elm === self::NS_RDF . ' Bag' ) {
-                       # bug 27105
+                       # T29105
                        $this->logger->info( __METHOD__ . ' Expected an rdf:Seq, but got an rdf:Bag. Pretending'
                                . ' it is a Seq, since some buggy software is known to screw this up.' );
                        array_unshift( $this->mode, self::MODE_LI );
@@ -1004,7 +1003,6 @@ class XMPReader implements LoggerAwareInterface {
         */
        private function startElementModeInitial( $ns, $tag, $attribs ) {
                if ( $ns !== self::NS_RDF ) {
-
                        if ( isset( $this->items[$ns][$tag] ) ) {
                                if ( isset( $this->items[$ns][$tag]['structPart'] ) ) {
                                        // If this element is supposed to appear only as
@@ -1066,7 +1064,6 @@ class XMPReader implements LoggerAwareInterface {
         */
        private function startElementModeStruct( $ns, $tag, $attribs ) {
                if ( $ns !== self::NS_RDF ) {
-
                        if ( isset( $this->items[$ns][$tag] ) ) {
                                if ( isset( $this->items[$ns][$this->ancestorStruct]['children'] )
                                        && !isset( $this->items[$ns][$this->ancestorStruct]['children'][$tag] )
index 052be33..5211a2c 100644 (file)
@@ -650,7 +650,7 @@ class XMPInfo {
                                'choices' => [ '1' => true, '2' => true ],
                        ],
                        /********
-                        * Disable extracting this property (bug 31944)
+                        * Disable extracting this property (T33944)
                         * Several files have a string instead of a Seq
                         * for this property. XMPReader doesn't handle
                         * mismatched types very gracefully (it marks
@@ -658,7 +658,7 @@ class XMPInfo {
                         * the relavent prop). Since this prop
                         * doesn't communicate all that useful information
                         * just disable this prop for now, until such
-                        * XMPReader is more graceful (bug 32172)
+                        * XMPReader is more graceful (T34172)
                         * 'YCbCrSubSampling'  => array(
                         *    'map_group' => 'exif',
                         *    'mode'      => XMPReader::MODE_SEQ,
index 31eaa3b..76ae279 100644 (file)
@@ -23,6 +23,7 @@
 
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerAwareInterface;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * This contains some static methods for
index 05973df..ceb0052 100644 (file)
@@ -39,6 +39,12 @@ class DeleteLogFormatter extends LogFormatter {
                                // logentry-suppress-event-legacy, logentry-suppress-revision-legacy
                                return "$key-legacy";
                        }
+               } elseif ( $this->entry->getSubtype() === 'restore' ) {
+                       $rawParams = $this->entry->getParameters();
+                       if ( !isset( $rawParams[':assoc:count'] ) ) {
+                               // Message: logentry-delete-restore-nocount
+                               return $key . '-nocount';
+                       }
                }
 
                return $key;
@@ -97,6 +103,19 @@ class DeleteLogFormatter extends LogFormatter {
                                $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
                                return $this->parsedParametersDeleteLog;
                        }
+               } elseif ( $subtype === 'restore' ) {
+                       $rawParams = $this->entry->getParameters();
+                       if ( isset( $rawParams[':assoc:count'] ) ) {
+                               $countList = [];
+                               foreach ( $rawParams[':assoc:count'] as $type => $count ) {
+                                       if ( $count ) {
+                                               // Messages: restore-count-revisions, restore-count-files
+                                               $countList[] = $this->context->msg( 'restore-count-' . $type )
+                                                       ->numParams( $count )->plain();
+                                       }
+                               }
+                               $params[3] = $this->context->getLanguage()->listToText( $countList );
+                       }
                }
 
                $this->parsedParametersDeleteLog = $params;
@@ -276,6 +295,11 @@ class DeleteLogFormatter extends LogFormatter {
                                $params[':assoc:old'][$key] = (bool)( $old & $bit );
                                $params[':assoc:new'][$key] = (bool)( $new & $bit );
                        }
+               } elseif ( $subtype === 'restore' ) {
+                       $rawParams = $entry->getParameters();
+                       if ( isset( $rawParams[':assoc:count'] ) ) {
+                               $params[':assoc:count'] = $rawParams[':assoc:count'];
+                       }
                }
 
                return $params;
index c9f1345..e7095f0 100644 (file)
@@ -28,6 +28,8 @@
  * @since 1.19
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Interface for log entries. Every log entry has these methods.
  *
@@ -632,7 +634,7 @@ class ManualLogEntry extends LogEntryBase {
                }
 
                $dbw->insert( 'logging', $data, __METHOD__ );
-               $this->id = !is_null( $id ) ? $id : $dbw->insertId();
+               $this->id = $dbw->insertId();
 
                $rows = [];
                foreach ( $relations as $tag => $values ) {
index 4382910..317652a 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 class LogEventsList extends ContextSource {
        const NO_ACTION_LINK = 1;
index b5af783..68404bf 100644 (file)
@@ -167,7 +167,7 @@ class LogFormatter {
 
        /**
         * Even uglier hack to maintain backwards compatibilty with IRC bots
-        * (bug 34508).
+        * (T36508).
         * @see getActionText()
         * @return string Text
         */
@@ -188,7 +188,7 @@ class LogFormatter {
 
        /**
         * Even uglier hack to maintain backwards compatibilty with IRC bots
-        * (bug 34508).
+        * (T36508).
         * @see getActionText()
         * @return string Text
         */
index 64102b7..f2b1670 100644 (file)
@@ -110,7 +110,7 @@ class LogPage {
                        'log_params' => $this->params
                ];
                $dbw->insert( 'logging', $data, __METHOD__ );
-               $newId = !is_null( $log_id ) ? $log_id : $dbw->insertId();
+               $newId = $dbw->insertId();
 
                # And update recentchanges
                if ( $this->updateRecentChanges ) {
index 68163c1..e02b8a6 100644 (file)
@@ -181,7 +181,7 @@ class LogPager extends ReverseChronologicalPager {
                } else {
                        $this->mConds['log_user'] = $userid;
                }
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                $user = $this->getUser();
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0';
@@ -256,7 +256,7 @@ class LogPager extends ReverseChronologicalPager {
                } else {
                        $this->mConds['log_title'] = $title->getDBkey();
                }
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                $user = $this->getUser();
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION ) . ' = 0';
@@ -305,14 +305,13 @@ class LogPager extends ReverseChronologicalPager {
                $options = $basic['options'];
                $joins = $basic['join_conds'];
 
-               $index = [];
                # Add log_search table if there are conditions on it.
                # This filters the results to only include log rows that have
                # log_search records with the specified ls_field and ls_value values.
                if ( array_key_exists( 'ls_field', $this->mConds ) ) {
                        $tables[] = 'log_search';
-                       $index['log_search'] = 'ls_field_val';
-                       $index['logging'] = 'PRIMARY';
+                       $options['IGNORE INDEX'] = [ 'log_search' => 'ls_log_id' ];
+                       $options['USE INDEX'] = [ 'logging' => 'PRIMARY' ];
                        if ( !$this->hasEqualsClause( 'ls_field' )
                                || !$this->hasEqualsClause( 'ls_value' )
                        ) {
@@ -322,9 +321,6 @@ class LogPager extends ReverseChronologicalPager {
                                $options[] = 'DISTINCT';
                        }
                }
-               if ( count( $index ) ) {
-                       $options['USE INDEX'] = $index;
-               }
                # Don't show duplicate rows when using log_search
                $joins['log_search'] = [ 'INNER JOIN', 'ls_log_id=log_id' ];
 
index 1d0bdf6..d66e7e3 100644 (file)
@@ -316,7 +316,7 @@ class EmailNotification {
                $pageTitle = $this->title->getPrefixedText();
 
                if ( $this->oldid ) {
-                       // Always show a link to the diff which triggered the mail. See bug 32210.
+                       // Always show a link to the diff which triggered the mail. See T34210.
                        $keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
                                        $this->title->getCanonicalURL( [ 'diff' => 'next', 'oldid' => $this->oldid ] ) )
                                        ->inContentLanguage()->text();
@@ -363,7 +363,7 @@ class EmailNotification {
                        Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() )
                );
 
-               # Replace this after transforming the message, bug 35019
+               # Replace this after transforming the message, T37019
                $postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
 
                // Now build message's subject and body
index 21effa0..3858f27 100644 (file)
@@ -103,9 +103,9 @@ class UserMailer {
         * @param string $subject Email's subject.
         * @param string $body Email's text or Array of two strings to be the text and html bodies
         * @param array $options:
-        *              'replyTo' MailAddress
-        *              'contentType' string default 'text/plain; charset=UTF-8'
-        *              'headers' array Extra headers to set
+        *     'replyTo' MailAddress
+        *     'contentType' string default 'text/plain; charset=UTF-8'
+        *     'headers' array Extra headers to set
         *
         * @throws MWException
         * @throws Exception
@@ -197,9 +197,9 @@ class UserMailer {
         * @param string $subject Email's subject.
         * @param string $body Email's text or Array of two strings to be the text and html bodies
         * @param array $options:
-        *              'replyTo' MailAddress
-        *              'contentType' string default 'text/plain; charset=UTF-8'
-        *              'headers' array Extra headers to set
+        *     'replyTo' MailAddress
+        *     'contentType' string default 'text/plain; charset=UTF-8'
+        *     'headers' array Extra headers to set
         *
         * @throws MWException
         * @throws Exception
index ac0564d..0f0b074 100644 (file)
@@ -150,7 +150,7 @@ class BitmapHandler extends TransformationalImageHandler {
                        if ( $params['interlace'] ) {
                                $animation_post = [ '-interlace', 'JPEG' ];
                        }
-                       # Sharpening, see bug 6193
+                       # Sharpening, see T8193
                        if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
                                / ( $params['srcWidth'] + $params['srcHeight'] )
                                < $wgSharpenReductionThreshold
@@ -178,10 +178,10 @@ class BitmapHandler extends TransformationalImageHandler {
                                // be a total drag. :P
                                $scene = 0;
                        } elseif ( $this->isAnimatedImage( $image ) ) {
-                               // Coalesce is needed to scale animated GIFs properly (bug 1017).
+                               // Coalesce is needed to scale animated GIFs properly (T3017).
                                $animation_pre = [ '-coalesce' ];
                                // We optimize the output, but -optimize is broken,
-                               // use optimizeTransparency instead (bug 11822)
+                               // use optimizeTransparency instead (T13822)
                                if ( version_compare( $this->getMagickVersion(), "6.3.5" ) >= 0 ) {
                                        $animation_post = [ '-fuzz', '5%', '-layers', 'optimizeTransparency' ];
                                }
@@ -211,7 +211,7 @@ class BitmapHandler extends TransformationalImageHandler {
                                && $xcfMeta['colorType'] === 'greyscale-alpha'
                                && version_compare( $this->getMagickVersion(), "6.8.9-3" ) < 0
                        ) {
-                               // bug 66323 - Greyscale images not rendered properly.
+                               // T68323 - Greyscale images not rendered properly.
                                // So only take the "red" channel.
                                $channelOnly = [ '-channel', 'R', '-separate' ];
                                $animation_pre = array_merge( $animation_pre, $channelOnly );
@@ -283,7 +283,7 @@ class BitmapHandler extends TransformationalImageHandler {
                        $im->readImage( $params['srcPath'] );
 
                        if ( $params['mimeType'] == 'image/jpeg' ) {
-                               // Sharpening, see bug 6193
+                               // Sharpening, see T8193
                                if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
                                        / ( $params['srcWidth'] + $params['srcHeight'] )
                                        < $wgSharpenReductionThreshold
@@ -312,7 +312,7 @@ class BitmapHandler extends TransformationalImageHandler {
                                        // be a total drag. :P
                                        $im->setImageScene( 0 );
                                } elseif ( $this->isAnimatedImage( $image ) ) {
-                                       // Coalesce is needed to scale animated GIFs properly (bug 1017).
+                                       // Coalesce is needed to scale animated GIFs properly (T3017).
                                        $im = $im->coalesceImages();
                                }
                                // GIF interlacing is only available since 6.3.4
index 7999bbb..c5f9cbb 100644 (file)
@@ -160,6 +160,7 @@ class BitmapMetadataHandler {
                $meta = new self();
 
                $seg = JpegMetadataExtractor::segmentSplitter( $filename );
+
                if ( isset( $seg['COM'] ) && isset( $seg['COM'][0] ) ) {
                        $meta->addMetadata( [ 'JPEGFileComment' => $seg['COM'] ], 'native' );
                }
@@ -182,9 +183,8 @@ class BitmapMetadataHandler {
                                $meta->addMetadata( $array, $type );
                        }
                }
-               if ( isset( $seg['byteOrder'] ) ) {
-                       $meta->getExif( $filename, $seg['byteOrder'] );
-               }
+
+               $meta->getExif( $filename, isset( $seg['byteOrder'] ) ? $seg['byteOrder'] : 'BE' );
 
                return $meta->getMetadataArray();
        }
index a852215..dcd276c 100644 (file)
@@ -304,11 +304,28 @@ class DjVuHandler extends ImageHandler {
                        return false;
                }
 
+               $trees = $this->extractTreesFromMetadata( $metadata );
+               $image->djvuTextTree = $trees['TextTree'];
+               $image->dejaMetaTree = $trees['MetaTree'];
+
+               if ( $gettext ) {
+                       return $image->djvuTextTree;
+               } else {
+                       return $image->dejaMetaTree;
+               }
+       }
+
+       /**
+        * Extracts metadata and text trees from metadata XML in string form
+        * @param string $metadata XML metadata as a string
+        * @return array
+        */
+       protected function extractTreesFromMetadata( $metadata ) {
                MediaWiki\suppressWarnings();
                try {
                        // Set to false rather than null to avoid further attempts
-                       $image->dejaMetaTree = false;
-                       $image->djvuTextTree = false;
+                       $metaTree = false;
+                       $textTree = false;
                        $tree = new SimpleXMLElement( $metadata, LIBXML_PARSEHUGE );
                        if ( $tree->getName() == 'mw-djvu' ) {
                                /** @var SimpleXMLElement $b */
@@ -316,23 +333,20 @@ class DjVuHandler extends ImageHandler {
                                        if ( $b->getName() == 'DjVuTxt' ) {
                                                // @todo File::djvuTextTree and File::dejaMetaTree are declared
                                                // dynamically. Add a public File::$data to facilitate this?
-                                               $image->djvuTextTree = $b;
+                                               $textTree = $b;
                                        } elseif ( $b->getName() == 'DjVuXML' ) {
-                                               $image->dejaMetaTree = $b;
+                                               $metaTree = $b;
                                        }
                                }
                        } else {
-                               $image->dejaMetaTree = $tree;
+                               $metaTree = $tree;
                        }
                } catch ( Exception $e ) {
-                       wfDebug( "Bogus multipage XML metadata on '{$image->getName()}'\n" );
+                       wfDebug( "Bogus multipage XML metadata\n" );
                }
                MediaWiki\restoreWarnings();
-               if ( $gettext ) {
-                       return $image->djvuTextTree;
-               } else {
-                       return $image->dejaMetaTree;
-               }
+
+               return [ 'MetaTree' => $metaTree, 'TextTree' => $textTree ];
        }
 
        function getImageSize( $image, $path ) {
@@ -394,30 +408,39 @@ class DjVuHandler extends ImageHandler {
                        $cache::TTL_INDEFINITE,
                        function () use ( $file ) {
                                $tree = $this->getMetaTree( $file );
-                               if ( !$tree ) {
-                                       return false;
-                               }
-
-                               $dimsByPage = [];
-                               $count = count( $tree->xpath( '//OBJECT' ) );
-                               for ( $i = 0; $i < $count; $i++ ) {
-                                       $o = $tree->BODY[0]->OBJECT[$i];
-                                       if ( $o ) {
-                                               $dimsByPage[$i] = [
-                                                       'width' => (int)$o['width'],
-                                                       'height' => (int)$o['height'],
-                                               ];
-                                       } else {
-                                               $dimsByPage[$i] = false;
-                                       }
-                               }
-
-                               return [ 'pageCount' => $count, 'dimensionsByPage' => $dimsByPage ];
+                               return $this->getDimensionInfoFromMetaTree( $tree );
                        },
                        [ 'pcTTL' => $cache::TTL_INDEFINITE ]
                );
        }
 
+       /**
+        * Given an XML metadata tree, returns dimension information about the document
+        * @param bool|SimpleXMLElement $metatree The file's XML metadata tree
+        * @return bool|array
+        */
+       protected function getDimensionInfoFromMetaTree( $metatree ) {
+               if ( !$metatree ) {
+                       return false;
+               }
+
+               $dimsByPage = [];
+               $count = count( $metatree->xpath( '//OBJECT' ) );
+               for ( $i = 0; $i < $count; $i++ ) {
+                       $o = $metatree->BODY[0]->OBJECT[$i];
+                       if ( $o ) {
+                               $dimsByPage[$i] = [
+                                       'width' => (int)$o['width'],
+                                       'height' => (int)$o['height'],
+                               ];
+                       } else {
+                               $dimsByPage[$i] = false;
+                       }
+               }
+
+               return [ 'pageCount' => $count, 'dimensionsByPage' => $dimsByPage ];
+       }
+
        /**
         * @param File $image
         * @param int $page Page number to get information for
@@ -438,4 +461,43 @@ class DjVuHandler extends ImageHandler {
                        return false;
                }
        }
+
+       /**
+       * Get useful response headers for GET/HEAD requests for a file with the given metadata
+       * @param $metadata Array Contains this handler's unserialized getMetadata() for a file
+       * @param $fallbackWidth int|null Width to fall back to if metadata doesn't have any
+       * @param $fallbackHeight int|null Height to fall back to if metadata doesn't have any
+       * @return Array
+       * @since 1.30
+       */
+       public function getContentHeaders( $metadata, $fallbackWidth = null, $fallbackHeight = null ) {
+               if ( !is_array( $metadata ) || !isset( $metadata['xml'] ) ) {
+                       return [];
+               }
+
+               $trees = $this->extractTreesFromMetadata( $metadata['xml'] );
+               $dimensionInfo = $this->getDimensionInfoFromMetaTree( $trees['MetaTree'] );
+
+               if ( !$dimensionInfo ) {
+                       return [];
+               }
+
+               $pagesByDimensions = [];
+               $count = $dimensionInfo['pageCount'];
+
+               for ( $i = 1; $i <= $count; $i++ ) {
+                       $dimensions = $dimensionInfo['dimensionsByPage'][ $i - 1 ];
+                       $dimensionString = $dimensions['width'] . 'x' . $dimensions['height'];
+
+                       if ( isset ( $pagesByDimensions[ $dimensionString ] ) ) {
+                               $pagesByDimensions[ $dimensionString ][] = $i;
+                       } else {
+                               $pagesByDimensions[ $dimensionString ] = [ $i ];
+                       }
+               }
+
+               $pageRangesByDimensions = MediaHandler::getPageRangesByDimensions( $pagesByDimensions );
+
+               return [ 'X-Content-Dimensions' => $pageRangesByDimensions ];
+       }
 }
index 5e8f8c8..57b5b36 100644 (file)
@@ -277,9 +277,9 @@ class DjVuImage {
                                $reg = <<<EOR
                                        /\(page\s[\d-]*\s[\d-]*\s[\d-]*\s[\d-]*\s*"
                                        ((?>    # Text to match is composed of atoms of either:
-                                         \\\\. # - any escaped character
-                                         |     # - any character different from " and \
-                                         [^"\\\\]+
+                                               \\\\. # - any escaped character
+                                               |     # - any character different from " and \
+                                               [^"\\\\]+
                                        )*?)
                                        "\s*\)
                                        | # Or page can be empty ; in this case, djvutxt dumps ()
index 7aeefa0..0e10abb 100644 (file)
@@ -30,7 +30,6 @@
 class ExifBitmapHandler extends BitmapHandler {
        const BROKEN_FILE = '-1'; // error extracting metadata
        const OLD_BROKEN_FILE = '0'; // outdated error extracting metadata.
-       const SRGB_ICC_PROFILE_NAME = 'IEC 61966-2.1 Default RGB colour space - sRGB';
 
        function convertMetadataVersion( $metadata, $version = 1 ) {
                // basically flattens arrays.
@@ -243,75 +242,4 @@ class ExifBitmapHandler extends BitmapHandler {
 
                return 0;
        }
-
-       protected function transformImageMagick( $image, $params ) {
-               global $wgUseTinyRGBForJPGThumbnails;
-
-               $ret = parent::transformImageMagick( $image, $params );
-
-               if ( $ret ) {
-                       return $ret;
-               }
-
-               if ( $params['mimeType'] === 'image/jpeg' && $wgUseTinyRGBForJPGThumbnails ) {
-                       // T100976 If the profile embedded in the JPG is sRGB, swap it for the smaller
-                       // (and free) TinyRGB
-
-                       $this->swapICCProfile(
-                               $params['dstPath'],
-                               self::SRGB_ICC_PROFILE_NAME,
-                               realpath( __DIR__ ) . '/tinyrgb.icc'
-                       );
-               }
-
-               return false;
-       }
-
-       /**
-        * Swaps an embedded ICC profile for another, if found.
-        * Depends on exiftool, no-op if not installed.
-        * @param string $filepath File to be manipulated (will be overwritten)
-        * @param string $oldProfileString Exact name of color profile to look for
-        *  (the one that will be replaced)
-        * @param string $profileFilepath ICC profile file to apply to the file
-        * @since 1.26
-        * @return bool
-        */
-       public function swapICCProfile( $filepath, $oldProfileString, $profileFilepath ) {
-               global $wgExiftool;
-
-               if ( !$wgExiftool || !is_executable( $wgExiftool ) ) {
-                       return false;
-               }
-
-               $cmd = wfEscapeShellArg( $wgExiftool,
-                       '-DeviceModelDesc',
-                       '-S',
-                       '-T',
-                       $filepath
-               );
-
-               $output = wfShellExecWithStderr( $cmd, $retval );
-
-               if ( $retval !== 0 || strcasecmp( trim( $output ), $oldProfileString ) !== 0 ) {
-                       // We can't establish that this file has the expected ICC profile, don't process it
-                       return false;
-               }
-
-               $cmd = wfEscapeShellArg( $wgExiftool,
-                       '-overwrite_original',
-                       '-icc_profile<=' . $profileFilepath,
-                       $filepath
-               );
-
-               $output = wfShellExecWithStderr( $cmd, $retval );
-
-               if ( $retval !== 0 ) {
-                       $this->logErrorForExternalProcess( $retval, $output, $cmd );
-
-                       return false;
-               }
-
-               return true;
-       }
 }
index 51a0135..69982c2 100644 (file)
@@ -24,6 +24,8 @@
  * @see http://exif.org/Exif2-2.PDF The Exif 2.2 specification
  * @file
  */
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Timestamp\TimestampException;
 
 /**
  * Format Image metadata values into a human readable form.
@@ -1580,14 +1582,14 @@ class FormatMetadata extends ContextSource {
         * @since 1.23
         */
        public function fetchExtendedMetadata( File $file ) {
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 
                // If revision deleted, exit immediately
                if ( $file->isDeleted( File::DELETED_FILE ) ) {
                        return [];
                }
 
-               $cacheKey = wfMemcKey(
+               $cacheKey = $cache->makeKey(
                        'getExtendedMetadata',
                        $this->getLanguage()->getCode(),
                        (int)$this->singleLang,
index de409e7..ac5fc81 100644 (file)
@@ -54,9 +54,9 @@ class GIFMetadataExtractor {
         * @return array
         */
        static function getMetadata( $filename ) {
-               self::$gifFrameSep = pack( "C", ord( "," ) );
-               self::$gifExtensionSep = pack( "C", ord( "!" ) );
-               self::$gifTerm = pack( "C", ord( ";" ) );
+               self::$gifFrameSep = pack( "C", ord( "," ) ); // 2C
+               self::$gifExtensionSep = pack( "C", ord( "!" ) ); // 21
+               self::$gifTerm = pack( "C", ord( ";" ) ); // 3B
 
                $frameCount = 0;
                $duration = 0.0;
@@ -82,8 +82,11 @@ class GIFMetadataExtractor {
                        throw new Exception( "Not a valid GIF file; header: $buf" );
                }
 
-               // Skip over width and height.
-               fread( $fh, 4 );
+               // Read width and height.
+               $buf = fread( $fh, 2 );
+               $width = unpack( 'v', $buf )[1];
+               $buf = fread( $fh, 2 );
+               $height = unpack( 'v', $buf )[1];
 
                // Read BPP
                $buf = fread( $fh, 1 );
index f93b1b5..b7ebfc9 100644 (file)
@@ -97,7 +97,7 @@ class IPTC {
                                case '2#025': /* keywords */
                                        $data['Keywords'] = self::convIPTC( $val, $c );
                                        break;
-                               case '2#101': /* Country (shown)*/
+                               case '2#101': /* Country (shown) */
                                        $data['CountryDest'] = self::convIPTC( $val, $c );
                                        break;
                                case '2#095': /* state/province (shown) */
@@ -115,7 +115,7 @@ class IPTC {
                                case '2#040': /* special instructions */
                                        $data['SpecialInstructions'] = self::convIPTC( $val, $c );
                                        break;
-                               case '2#105': /* headline*/
+                               case '2#105': /* headline */
                                        $data['Headline'] = self::convIPTC( $val, $c );
                                        break;
                                case '2#110': /* credit */
index 6c857a8..29f0d7c 100644 (file)
@@ -31,6 +31,8 @@
  * @ingroup Media
  */
 class JpegHandler extends ExifBitmapHandler {
+       const SRGB_EXIF_COLOR_SPACE = 'sRGB';
+       const SRGB_ICC_PROFILE_DESCRIPTION = 'sRGB IEC61966-2.1';
 
        function normaliseParams( $image, &$params ) {
                if ( !parent::normaliseParams( $image, $params ) ) {
@@ -112,8 +114,8 @@ class JpegHandler extends ExifBitmapHandler {
                        wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
 
                        /* This used to use 0 (ExifBitmapHandler::OLD_BROKEN_FILE) for the cases
-                        *      * No metadata in the file
-                        *      * Something is broken in the file.
+                        *   * No metadata in the file
+                        *   * Something is broken in the file.
                         * However, if the metadata support gets expanded then you can't tell if the 0 is from
                         * a broken file, or just no props found. A broken file is likely to stay broken, but
                         * a file which had no props could have props once the metadata support is improved.
@@ -171,4 +173,118 @@ class JpegHandler extends ExifBitmapHandler {
 
                return $params;
        }
+
+       /**
+        * {@inheritdoc}
+        */
+       protected function transformImageMagick( $image, $params ) {
+               global $wgUseTinyRGBForJPGThumbnails;
+
+               $ret = parent::transformImageMagick( $image, $params );
+
+               if ( $ret ) {
+                       return $ret;
+               }
+
+               if ( $wgUseTinyRGBForJPGThumbnails ) {
+                       // T100976 If the profile embedded in the JPG is sRGB, swap it for the smaller
+                       // (and free) TinyRGB
+
+                       /**
+                        * We'll want to replace the color profile for JPGs:
+                        * * in the sRGB color space, or with the sRGB profile
+                        *   (other profiles will be left untouched)
+                        * * without color space or profile, in which case browsers
+                        *   should assume sRGB, but don't always do (e.g. on wide-gamut
+                        *   monitors (unless it's meant for low bandwith)
+                        * @see https://phabricator.wikimedia.org/T134498
+                        */
+                       $colorSpaces = [ self::SRGB_EXIF_COLOR_SPACE, '-' ];
+                       $profiles = [ self::SRGB_ICC_PROFILE_DESCRIPTION ];
+
+                       // we'll also add TinyRGB profile to images lacking a profile, but
+                       // only if they're not low quality (which are meant to save bandwith
+                       // and we don't want to increase the filesize by adding a profile)
+                       if ( isset( $params['quality'] ) && $params['quality'] > 30 ) {
+                               $profiles[] = '-';
+                       }
+
+                       $this->swapICCProfile(
+                               $params['dstPath'],
+                               $colorSpaces,
+                               $profiles,
+                               realpath( __DIR__ ) . '/tinyrgb.icc'
+                       );
+               }
+
+               return false;
+       }
+
+       /**
+        * Swaps an embedded ICC profile for another, if found.
+        * Depends on exiftool, no-op if not installed.
+        * @param string $filepath File to be manipulated (will be overwritten)
+        * @param array $colorSpaces Only process files with this/these Color Space(s)
+        * @param array $oldProfileStrings Exact name(s) of color profile to look for
+        *  (the one that will be replaced)
+        * @param string $profileFilepath ICC profile file to apply to the file
+        * @since 1.26
+        * @return bool
+        */
+       public function swapICCProfile( $filepath, array $colorSpaces,
+                                                                       array $oldProfileStrings, $profileFilepath
+       ) {
+               global $wgExiftool;
+
+               if ( !$wgExiftool || !is_executable( $wgExiftool ) ) {
+                       return false;
+               }
+
+               $cmd = wfEscapeShellArg( $wgExiftool,
+                       '-EXIF:ColorSpace',
+                       '-ICC_Profile:ProfileDescription',
+                       '-S',
+                       '-T',
+                       $filepath
+               );
+
+               $output = wfShellExecWithStderr( $cmd, $retval );
+
+               // Explode EXIF data into an array with [0 => Color Space, 1 => Device Model Desc]
+               $data = explode( "\t", trim( $output ) );
+
+               if ( $retval !== 0 ) {
+                       return false;
+               }
+
+               // Make a regex out of the source data to match it to an array of color
+               // spaces in a case-insensitive way
+               $colorSpaceRegex = '/'.preg_quote( $data[0], '/' ).'/i';
+               if ( empty( preg_grep( $colorSpaceRegex, $colorSpaces ) ) ) {
+                       // We can't establish that this file matches the color space, don't process it
+                       return false;
+               }
+
+               $profileRegex = '/'.preg_quote( $data[1], '/' ).'/i';
+               if ( empty( preg_grep( $profileRegex, $oldProfileStrings ) ) ) {
+                       // We can't establish that this file has the expected ICC profile, don't process it
+                       return false;
+               }
+
+               $cmd = wfEscapeShellArg( $wgExiftool,
+                       '-overwrite_original',
+                       '-icc_profile<=' . $profileFilepath,
+                       $filepath
+               );
+
+               $output = wfShellExecWithStderr( $cmd, $retval );
+
+               if ( $retval !== 0 ) {
+                       $this->logErrorForExternalProcess( $retval, $output, $cmd );
+
+                       return false;
+               }
+
+               return true;
+       }
 }
index 2a735a2..ec4d372 100644 (file)
@@ -305,13 +305,11 @@ abstract class MediaHandler {
        }
 
        /**
-        * Get useful response headers for GET/HEAD requests for a file with the given metadata
-        *
-        * @param mixed $metadata Result of the getMetadata() function of this handler for a file
-        * @return array
-        */
+       * @deprecated since 1.30, use MediaHandler::getContentHeaders instead
+       */
        public function getStreamHeaders( $metadata ) {
-               return [];
+               wfDeprecated( __METHOD__, '1.30' );
+               return $this->getContentHeaders( $metadata );
        }
 
        /**
@@ -762,7 +760,7 @@ abstract class MediaHandler {
         * @param string $cmd
         */
        protected function logErrorForExternalProcess( $retval, $err, $cmd ) {
-               # Keep error output limited (bug 57985)
+               # Keep error output limited (T59985)
                $errMessage = trim( substr( $err, 0, self::MAX_ERR_LOG_SIZE ) );
 
                wfDebugLog( 'thumbnail',
@@ -868,4 +866,82 @@ abstract class MediaHandler {
        public function getWarningConfig( $file ) {
                return null;
        }
+
+       /**
+        * Converts a dimensions array about a potentially multipage document from an
+        * exhaustive list of ordered page numbers to a list of page ranges
+        * @param Array $pagesByDimensions
+        * @return String
+        * @since 1.30
+       */
+       public static function getPageRangesByDimensions( $pagesByDimensions ) {
+               $pageRangesByDimensions = [];
+
+               foreach ( $pagesByDimensions as $dimensions => $pageList ) {
+                       $ranges = [];
+                       $firstPage = $pageList[0];
+                       $lastPage = $firstPage - 1;
+
+                       foreach ( $pageList as $page ) {
+                               if ( $page > $lastPage + 1 ) {
+                                       if ( $firstPage != $lastPage ) {
+                                               $ranges[] = "$firstPage-$lastPage";
+                                       } else {
+                                               $ranges[] = "$firstPage";
+                                       }
+
+                                       $firstPage = $page;
+                               }
+
+                               $lastPage = $page;
+                       }
+
+                       if ( $firstPage != $lastPage ) {
+                               $ranges[] = "$firstPage-$lastPage";
+                       } else {
+                               $ranges[] = "$firstPage";
+                       }
+
+                       $pageRangesByDimensions[ $dimensions ] = $ranges;
+               }
+
+               $dimensionsString = [];
+               foreach ( $pageRangesByDimensions as $dimensions => $pageRanges ) {
+                       $dimensionsString[] = "$dimensions:" . implode( ',', $pageRanges );
+               }
+
+               return implode( '/', $dimensionsString );
+       }
+
+       /**
+       * Get useful response headers for GET/HEAD requests for a file with the given metadata
+       * @param $metadata Array Contains this handler's unserialized getMetadata() for a file
+       * @param $fallbackWidth int|null Width to fall back to if metadata doesn't have any
+       * @param $fallbackHeight int|null Height to fall back to if metadata doesn't have any
+       * @return Array
+       * @since 1.30
+       */
+       public function getContentHeaders( $metadata, $fallbackWidth = null, $fallbackHeight = null ) {
+               if ( !isset( $metadata['width'] ) ) {
+                       if ( is_null( $fallbackWidth ) ) {
+                               return [];
+                       }
+
+                       $metadata['width'] = $fallbackWidth;
+               }
+
+               if ( !isset( $metadata['height'] ) ) {
+                       if ( is_null( $fallbackHeight ) ) {
+                               return [];
+                       }
+
+                       $metadata['height'] = $fallbackHeight;
+               }
+
+               $dimensionString = $metadata['width'] . 'x' . $metadata['height'];
+               $pagesByDimensions = [ $dimensionString => [ 1 ] ];
+               $pageRangesByDimensions = MediaHandler::getPageRangesByDimensions( $pagesByDimensions );
+
+               return [ 'X-Content-Dimensions' => $pageRangesByDimensions ];
+       }
 }
index d0517d7..c12ca0b 100644 (file)
@@ -121,6 +121,8 @@ class PNGMetadataExtractor {
                                if ( !$buf || strlen( $buf ) < $chunk_size ) {
                                        throw new Exception( __METHOD__ . ": Read error" );
                                }
+                               $width = unpack( 'N', substr( $buf, 0, 4 ) )[1];
+                               $height = unpack( 'N', substr( $buf, 4, 4 ) )[1];
                                $bitDepth = ord( substr( $buf, 8, 1 ) );
                                // Detect the color type in British English as per the spec
                                // https://www.w3.org/TR/PNG/#11IHDR
index 6a974c7..2cf4d23 100644 (file)
@@ -86,13 +86,13 @@ class SVGReader {
                }
 
                // Expand entities, since Adobe Illustrator uses them for xmlns
-               // attributes (bug 31719). Note that libxml2 has some protection
+               // attributes (T33719). Note that libxml2 has some protection
                // against large recursive entity expansions so this is not as
                // insecure as it might appear to be. However, it is still extremely
                // insecure. It's necessary to wrap any read() calls with
                // libxml_disable_entity_loader() to avoid arbitrary local file
                // inclusion, or even arbitrary code execution if the expect
-               // extension is installed (bug 46859).
+               // extension is installed (T48859).
                $oldDisable = libxml_disable_entity_loader( true );
                $this->reader->setParserProperty( XMLReader::SUBST_ENTITIES, true );
 
@@ -307,12 +307,6 @@ class SVGReader {
                }
        }
 
-       // @todo FIXME: Unused, remove?
-       private function throwXmlError( $err ) {
-               $this->debug( "FAILURE: $err" );
-               wfDebug( "SVGReader XML error: $err\n" );
-       }
-
        private function debug( $data ) {
                if ( $this->mDebug ) {
                        wfDebug( "SVGReader: $data\n" );
index 60aec45..2a74e0d 100644 (file)
@@ -521,7 +521,7 @@ abstract class TransformationalImageHandler extends ImageHandler {
                                $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
                                wfDebug( $method . ": Running convert -version\n" );
                                $retval = '';
-                               $return = wfShellExec( $cmd, $retval );
+                               $return = wfShellExecWithStderr( $cmd, $retval );
                                $x = preg_match(
                                        '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches
                                );
@@ -569,7 +569,7 @@ abstract class TransformationalImageHandler extends ImageHandler {
         */
        public function rotate( $file, $params ) {
                return new MediaTransformError( 'thumbnail_error', 0, 0,
-                       get_class( $this ) . ' rotation not implemented' );
+                       static::class . ' rotation not implemented' );
        }
 
        /**
index 0a4f0ed..3370e5b 100644 (file)
@@ -246,8 +246,14 @@ class ObjectCache {
                global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
                $candidates = [ $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType ];
                foreach ( $candidates as $candidate ) {
+                       $cache = false;
                        if ( $candidate !== CACHE_NONE && $candidate !== CACHE_ANYTHING ) {
-                               return self::getInstance( $candidate );
+                               $cache = self::getInstance( $candidate );
+                               // CACHE_ACCEL might default to nothing if no APCu
+                               // See includes/ServiceWiring.php
+                               if ( !( $cache instanceof EmptyBagOStuff ) ) {
+                                       return $cache;
+                               }
                        }
                }
 
@@ -359,7 +365,7 @@ class ObjectCache {
         *
         * @since 1.26
         * @return WANObjectCache
-        * @deprecated Since 1.28 Use MediaWikiServices::getMainWANCache()
+        * @deprecated Since 1.28 Use MediaWikiServices::getMainWANObjectCache()
         */
        public static function getMainWANInstance() {
                return MediaWikiServices::getInstance()->getMainWANObjectCache();
index 7e8c2ba..a4a6ba8 100644 (file)
  * @ingroup Cache
  */
 
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
+use Wikimedia\Rdbms\DBQueryError;
+use Wikimedia\Rdbms\DBConnectionError;
 use \MediaWiki\MediaWikiServices;
 use \Wikimedia\WaitConditionLoop;
 use \Wikimedia\Rdbms\TransactionProfiler;
@@ -405,7 +410,7 @@ class SqlBagOStuff extends BagOStuff {
                                $exptime = $this->convertExpiry( $exptime );
                                $encExpiry = $db->timestamp( $exptime );
                        }
-                       // (bug 24425) use a replace if the db supports it instead of
+                       // (T26425) use a replace if the db supports it instead of
                        // delete/insert to avoid clashes with conflicting keynames
                        $db->update(
                                $tableName,
@@ -480,7 +485,7 @@ class SqlBagOStuff extends BagOStuff {
                                ], __METHOD__, 'IGNORE' );
 
                        if ( $db->affectedRows() == 0 ) {
-                               // Race condition. See bug 28611
+                               // Race condition. See T30611
                                $newValue = null;
                        }
                } catch ( DBError $e ) {
index 2787c1b..dd54232 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class for viewing MediaWiki article and history.
@@ -494,7 +495,7 @@ class Article implements Page {
                $useParserCache = $this->mPage->shouldCheckParserCache( $parserOptions, $oldid );
                wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
                if ( $user->getStubThreshold() ) {
-                       $this->getContext()->getStats()->increment( 'pcache_miss_stub' );
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->increment( 'pcache_miss_stub' );
                }
 
                $this->showRedirectedFromHeader();
@@ -652,7 +653,17 @@ class Article implements Page {
                $this->showViewFooter();
                $this->mPage->doViewUpdates( $user, $oldid );
 
-               $outputPage->addModules( 'mediawiki.action.view.postEdit' );
+               # Load the postEdit module if the user just saved this revision
+               # See also EditPage::setPostEditCookie
+               $request = $this->getContext()->getRequest();
+               $cookieKey = EditPage::POST_EDIT_COOKIE_KEY_PREFIX . $this->getRevIdFetched();
+               $postEdit = $request->getCookie( $cookieKey );
+               if ( $postEdit ) {
+                       # Clear the cookie. This also prevents caching of the response.
+                       $request->response()->clearCookie( $cookieKey );
+                       $outputPage->addJsConfigVars( 'wgPostEdit', $postEdit );
+                       $outputPage->addModules( 'mediawiki.action.view.postEdit' );
+               }
        }
 
        /**
@@ -726,7 +737,7 @@ class Article implements Page {
 
                $ns = $this->getTitle()->getNamespace();
 
-               # Don't index user and user talk pages for blocked users (bug 11443)
+               # Don't index user and user talk pages for blocked users (T13443)
                if ( ( $ns == NS_USER || $ns == NS_USER_TALK ) && !$this->getTitle()->isSubpage() ) {
                        $specificTarget = null;
                        $vagueTarget = null;
@@ -784,7 +795,7 @@ class Article implements Page {
                }
 
                if ( isset( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] ) ) {
-                       # (bug 14900) site config can override user-defined __INDEX__ or __NOINDEX__
+                       # (T16900) site config can override user-defined __INDEX__ or __NOINDEX__
                        $policy = array_merge(
                                $policy,
                                self::formatRobotPolicy( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] )
@@ -969,8 +980,8 @@ class Article implements Page {
                }
 
                // Check for cached results
-               $key = wfMemcKey( 'unpatrollable-page', $title->getArticleID() );
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $key = $cache->makeKey( 'unpatrollable-page', $title->getArticleID() );
                if ( $cache->get( $key ) ) {
                        return false;
                }
@@ -1110,8 +1121,8 @@ class Article implements Page {
         * @since 1.27
         */
        public static function purgePatrolFooterCache( $articleID ) {
-               $cache = ObjectCache::getMainWANInstance();
-               $cache->delete( wfMemcKey( 'unpatrollable-page', $articleID ) );
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $cache->delete( $cache->makeKey( 'unpatrollable-page', $articleID ) );
        }
 
        /**
@@ -1132,7 +1143,7 @@ class Article implements Page {
                        || $title->getNamespace() == NS_USER_TALK
                ) {
                        $rootPart = explode( '/', $title->getText() )[0];
-                       $user = User::newFromName( $rootPart, false /* allow IP users*/ );
+                       $user = User::newFromName( $rootPart, false /* allow IP users */ );
                        $ip = User::isIP( $rootPart );
                        $block = Block::newFromTarget( $user, $user );
 
@@ -1166,8 +1177,8 @@ class Article implements Page {
                # Show delete and move logs if there were any such events.
                # The logging query can DOS the site when bots/crawlers cause 404 floods,
                # so be careful showing this. 404 pages must be cheap as they are hard to cache.
-               $cache = ObjectCache::getMainStashInstance();
-               $key = wfMemcKey( 'page-recent-delete', md5( $title->getPrefixedText() ) );
+               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
+               $key = $cache->makeKey( 'page-recent-delete', md5( $title->getPrefixedText() ) );
                $loggedIn = $this->getContext()->getUser()->isLoggedIn();
                if ( $loggedIn || $cache->get( $key ) ) {
                        $logTypes = [ 'delete', 'move' ];
@@ -2042,16 +2053,20 @@ class Article implements Page {
        /**
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::doPurge
+        * @note In 1.28 (and only 1.28), this took a $flags parameter that
+        *  controlled how much purging was done.
         */
-       public function doPurge( $flags = WikiPage::PURGE_ALL ) {
-               return $this->mPage->doPurge( $flags );
+       public function doPurge() {
+               return $this->mPage->doPurge();
        }
 
        /**
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::getLastPurgeTimestamp
+        * @deprecated since 1.29
         */
        public function getLastPurgeTimestamp() {
+               wfDeprecated( __METHOD__, '1.29' );
                return $this->mPage->getLastPurgeTimestamp();
        }
 
index 58f1666..4785ef1 100644 (file)
@@ -31,10 +31,28 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
         */
        protected $mTitle;
 
+       /**
+        * @since 1.14
+        * @var ImagePage
+        */
+       public $mImagePage;
+
+       /**
+        * @since 1.14
+        * @var File[]
+        */
+       public $mHist;
+
+       /**
+        * @since 1.14
+        * @var int[]
+        */
+       public $mRange;
+
        /**
         * @param ImagePage $imagePage
         */
-       function __construct( $imagePage ) {
+       public function __construct( $imagePage ) {
                parent::__construct( $imagePage->getContext() );
                $this->mImagePage = $imagePage;
                $this->mTitle = clone $imagePage->getTitle();
@@ -53,18 +71,18 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        /**
         * @return Title
         */
-       function getTitle() {
+       public function getTitle() {
                return $this->mTitle;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return false;
        }
 
        /**
         * @return string
         */
-       function getIndexField() {
+       public function getIndexField() {
                return '';
        }
 
@@ -72,14 +90,14 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
         * @param object $row
         * @return string
         */
-       function formatRow( $row ) {
+       public function formatRow( $row ) {
                return '';
        }
 
        /**
         * @return string
         */
-       function getBody() {
+       public function getBody() {
                $s = '';
                $this->doQuery();
                if ( count( $this->mHist ) ) {
@@ -113,7 +131,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
                return $s;
        }
 
-       function doQuery() {
+       public function doQuery() {
                if ( $this->mQueryDone ) {
                        return;
                }
index 53d7e55..6a751ac 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Class for viewing MediaWiki file description pages
  *
@@ -213,7 +215,7 @@ class ImagePage extends Article {
                }
 
                $out->addModuleStyles( [
-                       'filepage', // always show the local local Filepage.css, bug 29277
+                       'filepage', // always show the local local Filepage.css, T31277
                        'mediawiki.action.view.filepage', // Add MediaWiki styles for a file page
                ] );
        }
@@ -432,7 +434,7 @@ class ImagePage extends Article {
                                        $count = $this->displayImg->pageCount();
 
                                        if ( $page > 1 ) {
-                                               $label = $out->parse( $this->getContext()->msg( 'imgmultipageprev' )->text(), false );
+                                               $label = $this->getContext()->msg( 'imgmultipageprev' )->text();
                                                // on the client side, this link is generated in ajaxifyPageNavigation()
                                                // in the mediawiki.page.image.pagination module
                                                $link = Linker::linkKnown(
@@ -492,6 +494,7 @@ class ImagePage extends Article {
                                                Xml::openElement( 'form', $formParams ) .
                                                Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
                                                $this->getContext()->msg( 'imgmultigoto' )->rawParams( $select )->parse() .
+                                               $this->getContext()->msg( 'word-separator' )->escaped() .
                                                Xml::submitButton( $this->getContext()->msg( 'imgmultigo' )->text() ) .
                                                Xml::closeElement( 'form' ) .
                                                "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
@@ -534,7 +537,7 @@ class ImagePage extends Article {
                                // this will get messy.
                                // The dirmark, however, must not be immediately adjacent
                                // to the filename, because it can get copied with it.
-                               // See bug 25277.
+                               // See T27277.
                                // @codingStandardsIgnoreStart Ignore long line
                                $out->addWikiText( <<<EOT
 <div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
diff --git a/includes/page/PageArchive.php b/includes/page/PageArchive.php
new file mode 100644 (file)
index 0000000..11e1a30
--- /dev/null
@@ -0,0 +1,790 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
+/**
+ * Used to show archived pages and eventually restore them.
+ */
+class PageArchive {
+       /** @var Title */
+       protected $title;
+
+       /** @var Status */
+       protected $fileStatus;
+
+       /** @var Status */
+       protected $revisionStatus;
+
+       /** @var Config */
+       protected $config;
+
+       public function __construct( $title, Config $config = null ) {
+               if ( is_null( $title ) ) {
+                       throw new MWException( __METHOD__ . ' given a null title.' );
+               }
+               $this->title = $title;
+               if ( $config === null ) {
+                       wfDebug( __METHOD__ . ' did not have a Config object passed to it' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
+               }
+               $this->config = $config;
+       }
+
+       public function doesWrites() {
+               return true;
+       }
+
+       /**
+        * List all deleted pages recorded in the archive table. Returns result
+        * wrapper with (ar_namespace, ar_title, count) fields, ordered by page
+        * namespace/title.
+        *
+        * @return ResultWrapper
+        */
+       public static function listAllPages() {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               return self::listPages( $dbr, '' );
+       }
+
+       /**
+        * List deleted pages recorded in the archive matching the
+        * given term, using search engine archive.
+        * Returns result wrapper with (ar_namespace, ar_title, count) fields.
+        *
+        * @param string $term Search term
+        * @return ResultWrapper
+        */
+       public static function listPagesBySearch( $term ) {
+               $title = Title::newFromText( $term );
+               if ( $title ) {
+                       $ns = $title->getNamespace();
+                       $termMain = $title->getText();
+                       $termDb = $title->getDBkey();
+               } else {
+                       // Prolly won't work too good
+                       // @todo handle bare namespace names cleanly?
+                       $ns = 0;
+                       $termMain = $termDb = $term;
+               }
+
+               // Try search engine first
+               $engine = MediaWikiServices::getInstance()->newSearchEngine();
+               $engine->setLimitOffset( 100 );
+               $engine->setNamespaces( [ $ns ] );
+               $results = $engine->searchArchiveTitle( $termMain );
+               if ( !$results->isOK() ) {
+                       $results = [];
+               } else {
+                       $results = $results->getValue();
+               }
+
+               if ( !$results ) {
+                       // Fall back to regular prefix search
+                       return self::listPagesByPrefix( $term );
+               }
+
+               $dbr = wfGetDB( DB_REPLICA );
+               $condTitles = array_unique( array_map( function ( Title $t ) {
+                       return $t->getDBkey();
+               }, $results ) );
+               $conds = [
+                       'ar_namespace' => $ns,
+                       $dbr->makeList( [ 'ar_title' => $condTitles ], LIST_OR ) . " OR ar_title " .
+                       $dbr->buildLike( $termDb, $dbr->anyString() )
+               ];
+
+               return self::listPages( $dbr, $conds );
+       }
+
+       /**
+        * List deleted pages recorded in the archive table matching the
+        * given title prefix.
+        * Returns result wrapper with (ar_namespace, ar_title, count) fields.
+        *
+        * @param string $prefix Title prefix
+        * @return ResultWrapper
+        */
+       public static function listPagesByPrefix( $prefix ) {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $title = Title::newFromText( $prefix );
+               if ( $title ) {
+                       $ns = $title->getNamespace();
+                       $prefix = $title->getDBkey();
+               } else {
+                       // Prolly won't work too good
+                       // @todo handle bare namespace names cleanly?
+                       $ns = 0;
+               }
+
+               $conds = [
+                       'ar_namespace' => $ns,
+                       'ar_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
+               ];
+
+               return self::listPages( $dbr, $conds );
+       }
+
+       /**
+        * @param IDatabase $dbr
+        * @param string|array $condition
+        * @return bool|ResultWrapper
+        */
+       protected static function listPages( $dbr, $condition ) {
+               return $dbr->select(
+                       [ 'archive' ],
+                       [
+                               'ar_namespace',
+                               'ar_title',
+                               'count' => 'COUNT(*)'
+                       ],
+                       $condition,
+                       __METHOD__,
+                       [
+                               'GROUP BY' => [ 'ar_namespace', 'ar_title' ],
+                               'ORDER BY' => [ 'ar_namespace', 'ar_title' ],
+                               'LIMIT' => 100,
+                       ]
+               );
+       }
+
+       /**
+        * List the revisions of the given page. Returns result wrapper with
+        * (ar_minor_edit, ar_timestamp, ar_user, ar_user_text, ar_comment) fields.
+        *
+        * @return ResultWrapper
+        */
+       public function listRevisions() {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $tables = [ 'archive' ];
+
+               $fields = [
+                       'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
+                       'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
+                       'ar_page_id'
+               ];
+
+               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
+               $conds = [ 'ar_namespace' => $this->title->getNamespace(),
+                       'ar_title' => $this->title->getDBkey() ];
+
+               $options = [ 'ORDER BY' => 'ar_timestamp DESC' ];
+
+               $join_conds = [];
+
+               ChangeTags::modifyDisplayQuery(
+                       $tables,
+                       $fields,
+                       $conds,
+                       $join_conds,
+                       $options,
+                       ''
+               );
+
+               return $dbr->select( $tables,
+                       $fields,
+                       $conds,
+                       __METHOD__,
+                       $options,
+                       $join_conds
+               );
+       }
+
+       /**
+        * List the deleted file revisions for this page, if it's a file page.
+        * Returns a result wrapper with various filearchive fields, or null
+        * if not a file page.
+        *
+        * @return ResultWrapper
+        * @todo Does this belong in Image for fuller encapsulation?
+        */
+       public function listFiles() {
+               if ( $this->title->getNamespace() != NS_FILE ) {
+                       return null;
+               }
+
+               $dbr = wfGetDB( DB_REPLICA );
+               return $dbr->select(
+                       'filearchive',
+                       ArchivedFile::selectFields(),
+                       [ 'fa_name' => $this->title->getDBkey() ],
+                       __METHOD__,
+                       [ 'ORDER BY' => 'fa_timestamp DESC' ]
+               );
+       }
+
+       /**
+        * Return a Revision object containing data for the deleted revision.
+        * Note that the result *may* or *may not* have a null page ID.
+        *
+        * @param string $timestamp
+        * @return Revision|null
+        */
+       public function getRevision( $timestamp ) {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $fields = [
+                       'ar_rev_id',
+                       'ar_text',
+                       'ar_comment',
+                       'ar_user',
+                       'ar_user_text',
+                       'ar_timestamp',
+                       'ar_minor_edit',
+                       'ar_flags',
+                       'ar_text_id',
+                       'ar_deleted',
+                       'ar_len',
+                       'ar_sha1',
+               ];
+
+               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
+               $row = $dbr->selectRow( 'archive',
+                       $fields,
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey(),
+                               'ar_timestamp' => $dbr->timestamp( $timestamp ) ],
+                       __METHOD__ );
+
+               if ( $row ) {
+                       return Revision::newFromArchiveRow( $row, [ 'title' => $this->title ] );
+               }
+
+               return null;
+       }
+
+       /**
+        * Return the most-previous revision, either live or deleted, against
+        * the deleted revision given by timestamp.
+        *
+        * May produce unexpected results in case of history merges or other
+        * unusual time issues.
+        *
+        * @param string $timestamp
+        * @return Revision|null Null when there is no previous revision
+        */
+       public function getPreviousRevision( $timestamp ) {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               // Check the previous deleted revision...
+               $row = $dbr->selectRow( 'archive',
+                       'ar_timestamp',
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey(),
+                               'ar_timestamp < ' .
+                               $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
+                       __METHOD__,
+                       [
+                               'ORDER BY' => 'ar_timestamp DESC',
+                               'LIMIT' => 1 ] );
+               $prevDeleted = $row ? wfTimestamp( TS_MW, $row->ar_timestamp ) : false;
+
+               $row = $dbr->selectRow( [ 'page', 'revision' ],
+                       [ 'rev_id', 'rev_timestamp' ],
+                       [
+                               'page_namespace' => $this->title->getNamespace(),
+                               'page_title' => $this->title->getDBkey(),
+                               'page_id = rev_page',
+                               'rev_timestamp < ' .
+                               $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
+                       __METHOD__,
+                       [
+                               'ORDER BY' => 'rev_timestamp DESC',
+                               'LIMIT' => 1 ] );
+               $prevLive = $row ? wfTimestamp( TS_MW, $row->rev_timestamp ) : false;
+               $prevLiveId = $row ? intval( $row->rev_id ) : null;
+
+               if ( $prevLive && $prevLive > $prevDeleted ) {
+                       // Most prior revision was live
+                       return Revision::newFromId( $prevLiveId );
+               } elseif ( $prevDeleted ) {
+                       // Most prior revision was deleted
+                       return $this->getRevision( $prevDeleted );
+               }
+
+               // No prior revision on this page.
+               return null;
+       }
+
+       /**
+        * Get the text from an archive row containing ar_text, ar_flags and ar_text_id
+        *
+        * @param object $row Database row
+        * @return string
+        */
+       public function getTextFromRow( $row ) {
+               if ( is_null( $row->ar_text_id ) ) {
+                       // An old row from MediaWiki 1.4 or previous.
+                       // Text is embedded in this row in classic compression format.
+                       return Revision::getRevisionText( $row, 'ar_' );
+               }
+
+               // New-style: keyed to the text storage backend.
+               $dbr = wfGetDB( DB_REPLICA );
+               $text = $dbr->selectRow( 'text',
+                       [ 'old_text', 'old_flags' ],
+                       [ 'old_id' => $row->ar_text_id ],
+                       __METHOD__ );
+
+               return Revision::getRevisionText( $text );
+       }
+
+       /**
+        * Fetch (and decompress if necessary) the stored text of the most
+        * recently edited deleted revision of the page.
+        *
+        * If there are no archived revisions for the page, returns NULL.
+        *
+        * @return string|null
+        */
+       public function getLastRevisionText() {
+               $dbr = wfGetDB( DB_REPLICA );
+               $row = $dbr->selectRow( 'archive',
+                       [ 'ar_text', 'ar_flags', 'ar_text_id' ],
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey() ],
+                       __METHOD__,
+                       [ 'ORDER BY' => 'ar_timestamp DESC' ] );
+
+               if ( $row ) {
+                       return $this->getTextFromRow( $row );
+               }
+
+               return null;
+       }
+
+       /**
+        * Quick check if any archived revisions are present for the page.
+        *
+        * @return bool
+        */
+       public function isDeleted() {
+               $dbr = wfGetDB( DB_REPLICA );
+               $n = $dbr->selectField( 'archive', 'COUNT(ar_title)',
+                       [ 'ar_namespace' => $this->title->getNamespace(),
+                               'ar_title' => $this->title->getDBkey() ],
+                       __METHOD__
+               );
+
+               return ( $n > 0 );
+       }
+
+       /**
+        * Restore the given (or all) text and file revisions for the page.
+        * Once restored, the items will be removed from the archive tables.
+        * The deletion log will be updated with an undeletion notice.
+        *
+        * This also sets Status objects, $this->fileStatus and $this->revisionStatus
+        * (depending what operations are attempted).
+        *
+        * @param array $timestamps Pass an empty array to restore all revisions,
+        *   otherwise list the ones to undelete.
+        * @param string $comment
+        * @param array $fileVersions
+        * @param bool $unsuppress
+        * @param User $user User performing the action, or null to use $wgUser
+        * @param string|string[] $tags Change tags to add to log entry
+        *   ($user should be able to add the specified tags before this is called)
+        * @return array|bool array(number of file revisions restored, number of image revisions
+        *   restored, log message) on success, false on failure.
+        */
+       public function undelete( $timestamps, $comment = '', $fileVersions = [],
+               $unsuppress = false, User $user = null, $tags = null
+       ) {
+               // If both the set of text revisions and file revisions are empty,
+               // restore everything. Otherwise, just restore the requested items.
+               $restoreAll = empty( $timestamps ) && empty( $fileVersions );
+
+               $restoreText = $restoreAll || !empty( $timestamps );
+               $restoreFiles = $restoreAll || !empty( $fileVersions );
+
+               if ( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
+                       $img = wfLocalFile( $this->title );
+                       $img->load( File::READ_LATEST );
+                       $this->fileStatus = $img->restore( $fileVersions, $unsuppress );
+                       if ( !$this->fileStatus->isOK() ) {
+                               return false;
+                       }
+                       $filesRestored = $this->fileStatus->successCount;
+               } else {
+                       $filesRestored = 0;
+               }
+
+               if ( $restoreText ) {
+                       $this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
+                       if ( !$this->revisionStatus->isOK() ) {
+                               return false;
+                       }
+
+                       $textRestored = $this->revisionStatus->getValue();
+               } else {
+                       $textRestored = 0;
+               }
+
+               // Touch the log!
+
+               if ( !$textRestored && !$filesRestored ) {
+                       wfDebug( "Undelete: nothing undeleted...\n" );
+
+                       return false;
+               }
+
+               if ( $user === null ) {
+                       global $wgUser;
+                       $user = $wgUser;
+               }
+
+               $logEntry = new ManualLogEntry( 'delete', 'restore' );
+               $logEntry->setPerformer( $user );
+               $logEntry->setTarget( $this->title );
+               $logEntry->setComment( $comment );
+               $logEntry->setTags( $tags );
+               $logEntry->setParameters( [
+                       ':assoc:count' => [
+                               'revisions' => $textRestored,
+                               'files' => $filesRestored,
+                       ],
+               ] );
+
+               Hooks::run( 'ArticleUndeleteLogEntry', [ $this, &$logEntry, $user ] );
+
+               $logid = $logEntry->insert();
+               $logEntry->publish( $logid );
+
+               return [ $textRestored, $filesRestored, $comment ];
+       }
+
+       /**
+        * This is the meaty bit -- It restores archived revisions of the given page
+        * to the revision table.
+        *
+        * @param array $timestamps Pass an empty array to restore all revisions,
+        *   otherwise list the ones to undelete.
+        * @param bool $unsuppress Remove all ar_deleted/fa_deleted restrictions of seletected revs
+        * @param string $comment
+        * @throws ReadOnlyError
+        * @return Status Status object containing the number of revisions restored on success
+        */
+       private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
+               if ( wfReadOnly() ) {
+                       throw new ReadOnlyError();
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->startAtomic( __METHOD__ );
+
+               $restoreAll = empty( $timestamps );
+
+               # Does this page already exist? We'll have to update it...
+               $article = WikiPage::factory( $this->title );
+               # Load latest data for the current page (T33179)
+               $article->loadPageData( 'fromdbmaster' );
+               $oldcountable = $article->isCountable();
+
+               $page = $dbw->selectRow( 'page',
+                       [ 'page_id', 'page_latest' ],
+                       [ 'page_namespace' => $this->title->getNamespace(),
+                               'page_title' => $this->title->getDBkey() ],
+                       __METHOD__,
+                       [ 'FOR UPDATE' ] // lock page
+               );
+
+               if ( $page ) {
+                       $makepage = false;
+                       # Page already exists. Import the history, and if necessary
+                       # we'll update the latest revision field in the record.
+
+                       # Get the time span of this page
+                       $previousTimestamp = $dbw->selectField( 'revision', 'rev_timestamp',
+                               [ 'rev_id' => $page->page_latest ],
+                               __METHOD__ );
+
+                       if ( $previousTimestamp === false ) {
+                               wfDebug( __METHOD__ . ": existing page refers to a page_latest that does not exist\n" );
+
+                               $status = Status::newGood( 0 );
+                               $status->warning( 'undeleterevision-missing' );
+                               $dbw->endAtomic( __METHOD__ );
+
+                               return $status;
+                       }
+               } else {
+                       # Have to create a new article...
+                       $makepage = true;
+                       $previousTimestamp = 0;
+               }
+
+               $oldWhere = [
+                       'ar_namespace' => $this->title->getNamespace(),
+                       'ar_title' => $this->title->getDBkey(),
+               ];
+               if ( !$restoreAll ) {
+                       $oldWhere['ar_timestamp'] = array_map( [ &$dbw, 'timestamp' ], $timestamps );
+               }
+
+               $fields = [
+                       'ar_id',
+                       'ar_rev_id',
+                       'rev_id',
+                       'ar_text',
+                       'ar_comment',
+                       'ar_user',
+                       'ar_user_text',
+                       'ar_timestamp',
+                       'ar_minor_edit',
+                       'ar_flags',
+                       'ar_text_id',
+                       'ar_deleted',
+                       'ar_page_id',
+                       'ar_len',
+                       'ar_sha1'
+               ];
+
+               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
+               /**
+                * Select each archived revision...
+                */
+               $result = $dbw->select(
+                       [ 'archive', 'revision' ],
+                       $fields,
+                       $oldWhere,
+                       __METHOD__,
+                       /* options */
+                       [ 'ORDER BY' => 'ar_timestamp' ],
+                       [ 'revision' => [ 'LEFT JOIN', 'ar_rev_id=rev_id' ] ]
+               );
+
+               $rev_count = $result->numRows();
+               if ( !$rev_count ) {
+                       wfDebug( __METHOD__ . ": no revisions to restore\n" );
+
+                       $status = Status::newGood( 0 );
+                       $status->warning( "undelete-no-results" );
+                       $dbw->endAtomic( __METHOD__ );
+
+                       return $status;
+               }
+
+               // We use ar_id because there can be duplicate ar_rev_id even for the same
+               // page.  In this case, we may be able to restore the first one.
+               $restoreFailedArIds = [];
+
+               // Map rev_id to the ar_id that is allowed to use it.  When checking later,
+               // if it doesn't match, the current ar_id can not be restored.
+
+               // Value can be an ar_id or -1 (-1 means no ar_id can use it, since the
+               // rev_id is taken before we even start the restore).
+               $allowedRevIdToArIdMap = [];
+
+               $latestRestorableRow = null;
+
+               foreach ( $result as $row ) {
+                       if ( $row->ar_rev_id ) {
+                               // rev_id is taken even before we start restoring.
+                               if ( $row->ar_rev_id === $row->rev_id ) {
+                                       $restoreFailedArIds[] = $row->ar_id;
+                                       $allowedRevIdToArIdMap[$row->ar_rev_id] = -1;
+                               } else {
+                                       // rev_id is not taken yet in the DB, but it might be taken
+                                       // by a prior revision in the same restore operation. If
+                                       // not, we need to reserve it.
+                                       if ( isset( $allowedRevIdToArIdMap[$row->ar_rev_id] ) ) {
+                                               $restoreFailedArIds[] = $row->ar_id;
+                                       } else {
+                                               $allowedRevIdToArIdMap[$row->ar_rev_id] = $row->ar_id;
+                                               $latestRestorableRow = $row;
+                                       }
+                               }
+                       } else {
+                               // If ar_rev_id is null, there can't be a collision, and a
+                               // rev_id will be chosen automatically.
+                               $latestRestorableRow = $row;
+                       }
+               }
+
+               $result->seek( 0 ); // move back
+
+               $oldPageId = 0;
+               if ( $latestRestorableRow !== null ) {
+                       $oldPageId = (int)$latestRestorableRow->ar_page_id; // pass this to ArticleUndelete hook
+
+                       // grab the content to check consistency with global state before restoring the page.
+                       $revision = Revision::newFromArchiveRow( $latestRestorableRow,
+                               [
+                                       'title' => $article->getTitle(), // used to derive default content model
+                               ]
+                       );
+                       $user = User::newFromName( $revision->getUserText( Revision::RAW ), false );
+                       $content = $revision->getContent( Revision::RAW );
+
+                       // NOTE: article ID may not be known yet. prepareSave() should not modify the database.
+                       $status = $content->prepareSave( $article, 0, -1, $user );
+                       if ( !$status->isOK() ) {
+                               $dbw->endAtomic( __METHOD__ );
+
+                               return $status;
+                       }
+               }
+
+               $newid = false; // newly created page ID
+               $restored = 0; // number of revisions restored
+               /** @var Revision $revision */
+               $revision = null;
+               $restoredPages = [];
+               // If there are no restorable revisions, we can skip most of the steps.
+               if ( $latestRestorableRow === null ) {
+                       $failedRevisionCount = $rev_count;
+               } else {
+                       if ( $makepage ) {
+                               // Check the state of the newest to-be version...
+                               if ( !$unsuppress
+                                       && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
+                               ) {
+                                       $dbw->endAtomic( __METHOD__ );
+
+                                       return Status::newFatal( "undeleterevdel" );
+                               }
+                               // Safe to insert now...
+                               $newid = $article->insertOn( $dbw, $latestRestorableRow->ar_page_id );
+                               if ( $newid === false ) {
+                                       // The old ID is reserved; let's pick another
+                                       $newid = $article->insertOn( $dbw );
+                               }
+                               $pageId = $newid;
+                       } else {
+                               // Check if a deleted revision will become the current revision...
+                               if ( $latestRestorableRow->ar_timestamp > $previousTimestamp ) {
+                                       // Check the state of the newest to-be version...
+                                       if ( !$unsuppress
+                                               && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
+                                       ) {
+                                               $dbw->endAtomic( __METHOD__ );
+
+                                               return Status::newFatal( "undeleterevdel" );
+                                       }
+                               }
+
+                               $newid = false;
+                               $pageId = $article->getId();
+                       }
+
+                       foreach ( $result as $row ) {
+                               // Check for key dupes due to needed archive integrity.
+                               if ( $row->ar_rev_id && $allowedRevIdToArIdMap[$row->ar_rev_id] !== $row->ar_id ) {
+                                       continue;
+                               }
+                               // Insert one revision at a time...maintaining deletion status
+                               // unless we are specifically removing all restrictions...
+                               $revision = Revision::newFromArchiveRow( $row,
+                                       [
+                                               'page' => $pageId,
+                                               'title' => $this->title,
+                                               'deleted' => $unsuppress ? 0 : $row->ar_deleted
+                                       ] );
+
+                               $revision->insertOn( $dbw );
+                               $restored++;
+
+                               Hooks::run( 'ArticleRevisionUndeleted',
+                                       [ &$this->title, $revision, $row->ar_page_id ] );
+                               $restoredPages[$row->ar_page_id] = true;
+                       }
+
+                       // Now that it's safely stored, take it out of the archive
+                       // Don't delete rows that we failed to restore
+                       $toDeleteConds = $oldWhere;
+                       $failedRevisionCount = count( $restoreFailedArIds );
+                       if ( $failedRevisionCount > 0 ) {
+                               $toDeleteConds[] = 'ar_id NOT IN ( ' . $dbw->makeList( $restoreFailedArIds ) . ' )';
+                       }
+
+                       $dbw->delete( 'archive',
+                               $toDeleteConds,
+                               __METHOD__ );
+               }
+
+               $status = Status::newGood( $restored );
+
+               if ( $failedRevisionCount > 0 ) {
+                       $status->warning(
+                               wfMessage( 'undeleterevision-duplicate-revid', $failedRevisionCount ) );
+               }
+
+               // Was anything restored at all?
+               if ( $restored ) {
+                       $created = (bool)$newid;
+                       // Attach the latest revision to the page...
+                       $wasnew = $article->updateIfNewerOn( $dbw, $revision );
+                       if ( $created || $wasnew ) {
+                               // Update site stats, link tables, etc
+                               $article->doEditUpdates(
+                                       $revision,
+                                       User::newFromName( $revision->getUserText( Revision::RAW ), false ),
+                                       [
+                                               'created' => $created,
+                                               'oldcountable' => $oldcountable,
+                                               'restored' => true
+                                       ]
+                               );
+                       }
+
+                       Hooks::run( 'ArticleUndelete',
+                               [ &$this->title, $created, $comment, $oldPageId, $restoredPages ] );
+                       if ( $this->title->getNamespace() == NS_FILE ) {
+                               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->title, 'imagelinks' ) );
+                       }
+               }
+
+               $dbw->endAtomic( __METHOD__ );
+
+               return $status;
+       }
+
+       /**
+        * @return Status
+        */
+       public function getFileStatus() {
+               return $this->fileStatus;
+       }
+
+       /**
+        * @return Status
+        */
+       public function getRevisionStatus() {
+               return $this->revisionStatus;
+       }
+}
index 1fa4bfa..66fadf5 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * Special handling for file pages
  *
@@ -162,9 +164,12 @@ class WikiFilePage extends WikiPage {
                return $this->mDupes;
        }
 
-       public function doPurge( $flags = self::PURGE_ALL ) {
+       /**
+        * Override handling of action=purge
+        * @return bool
+        */
+       public function doPurge() {
                $this->loadFile();
-
                if ( $this->mFile->exists() ) {
                        wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
                        DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->mTitle, 'imagelinks' ) );
@@ -180,8 +185,7 @@ class WikiFilePage extends WikiPage {
                        // Purge redirect cache
                        $this->mRepo->invalidateImageRedirect( $this->mTitle );
                }
-
-               return parent::doPurge( $flags );
+               return parent::doPurge();
        }
 
        /**
index bc936ab..7489f44 100644 (file)
 
 use \MediaWiki\Logger\LoggerFactory;
 use \MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
+use Wikimedia\Rdbms\DBUnexpectedError;
 
 /**
  * Class representing a MediaWiki article and history.
@@ -83,9 +87,10 @@ class WikiPage implements Page, IDBAccessObject {
         */
        protected $mLinksUpdated = '19700101000000';
 
-       const PURGE_CDN_CACHE = 1; // purge CDN cache for page variant URLs
-       const PURGE_CLUSTER_PCACHE = 2; // purge parser cache in the local datacenter
-       const PURGE_GLOBAL_PCACHE = 4; // set page_touched to clear parser cache in all datacenters
+       /** @deprecated since 1.29. Added in 1.28 for partial purging, no longer used. */
+       const PURGE_CDN_CACHE = 1;
+       const PURGE_CLUSTER_PCACHE = 2;
+       const PURGE_GLOBAL_PCACHE = 4;
        const PURGE_ALL = 7;
 
        /**
@@ -151,7 +156,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return WikiPage|null
         */
        public static function newFromID( $id, $from = 'fromdb' ) {
-               // page id's are never 0 or negative, see bug 61166
+               // page ids are never 0 or negative, see T63166
                if ( $id < 1 ) {
                        return null;
                }
@@ -257,7 +262,7 @@ class WikiPage implements Page, IDBAccessObject {
                $this->mTimestamp = '';
                $this->mIsRedirect = false;
                $this->mLatest = false;
-               // Bug 57026: do not clear mPreparedEdit since prepareTextForEdit() already checks
+               // T59026: do not clear mPreparedEdit since prepareTextForEdit() already checks
                // the requested rev ID and content against the cached one for equality. For most
                // content types, the output should not change during the lifetime of this cache.
                // Clearing it can cause extra parses on edit for no reason.
@@ -424,7 +429,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $this->mLinksUpdated = wfTimestampOrNull( TS_MW, $data->page_links_updated );
                        $this->mIsRedirect = intval( $data->page_is_redirect );
                        $this->mLatest = intval( $data->page_latest );
-                       // Bug 37225: $latest may no longer match the cached latest Revision object.
+                       // T39225: $latest may no longer match the cached latest Revision object.
                        // Double-check the ID of any cached latest Revision object for consistency.
                        if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
                                $this->mLastRevision = null;
@@ -573,35 +578,12 @@ class WikiPage implements Page, IDBAccessObject {
         * @return Revision|null
         */
        public function getOldestRevision() {
-
                // Try using the replica DB first, then try the master
-               $continue = 2;
-               $db = wfGetDB( DB_REPLICA );
-               $revSelectFields = Revision::selectFields();
-
-               $row = null;
-               while ( $continue ) {
-                       $row = $db->selectRow(
-                               [ 'revision' ],
-                               $revSelectFields,
-                               [
-                                       'rev_page' => $this->getId()
-                               ],
-                               __METHOD__,
-                               [
-                                       'ORDER BY' => 'rev_timestamp ASC'
-                               ]
-                       );
-
-                       if ( $row ) {
-                               $continue = 0;
-                       } else {
-                               $db = wfGetDB( DB_MASTER );
-                               $continue--;
-                       }
+               $rev = $this->mTitle->getFirstRevision();
+               if ( !$rev ) {
+                       $rev = $this->mTitle->getFirstRevision( Title::GAID_FOR_UPDATE );
                }
-
-               return $row ? Revision::newFromRow( $row ) : null;
+               return $rev;
        }
 
        /**
@@ -619,7 +601,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                if ( $this->mDataLoadedFrom == self::READ_LOCKING ) {
-                       // Bug 37225: if session S1 loads the page row FOR UPDATE, the result always
+                       // T39225: if session S1 loads the page row FOR UPDATE, the result always
                        // includes the latest changes committed. This is true even within REPEATABLE-READ
                        // transactions, where S1 normally only sees changes committed before the first S1
                        // SELECT. Thus we need S1 to also gets the revision row FOR UPDATE; otherwise, it
@@ -1118,10 +1100,11 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Perform the actions of a page purging
-        * @param integer $flags Bitfield of WikiPage::PURGE_* constants
         * @return bool
+        * @note In 1.28 (and only 1.28), this took a $flags parameter that
+        *  controlled how much purging was done.
         */
-       public function doPurge( $flags = self::PURGE_ALL ) {
+       public function doPurge() {
                // Avoid PHP 7.1 warning of passing $this by reference
                $wikiPage = $this;
 
@@ -1129,30 +1112,15 @@ class WikiPage implements Page, IDBAccessObject {
                        return false;
                }
 
-               if ( ( $flags & self::PURGE_GLOBAL_PCACHE ) == self::PURGE_GLOBAL_PCACHE ) {
-                       // Set page_touched in the database to invalidate all DC caches
-                       $this->mTitle->invalidateCache();
-               } elseif ( ( $flags & self::PURGE_CLUSTER_PCACHE ) == self::PURGE_CLUSTER_PCACHE ) {
-                       // Delete the parser options key in the local cluster to invalidate the DC cache
-                       ParserCache::singleton()->deleteOptionsKey( $this );
-                       // Avoid sending HTTP 304s in ViewAction to the client who just issued the purge
-                       $cache = ObjectCache::getLocalClusterInstance();
-                       $cache->set(
-                               $cache->makeKey( 'page', 'last-dc-purge', $this->getId() ),
-                               wfTimestamp( TS_MW ),
-                               $cache::TTL_HOUR
-                       );
-               }
+               $this->mTitle->invalidateCache();
 
-               if ( ( $flags & self::PURGE_CDN_CACHE ) == self::PURGE_CDN_CACHE ) {
-                       // Clear any HTML file cache
-                       HTMLFileCache::clearFileCache( $this->getTitle() );
-                       // Send purge after any page_touched above update was committed
-                       DeferredUpdates::addUpdate(
-                               new CdnCacheUpdate( $this->mTitle->getCdnUrls() ),
-                               DeferredUpdates::PRESEND
-                       );
-               }
+               // Clear file cache
+               HTMLFileCache::clearFileCache( $this->getTitle() );
+               // Send purge after above page_touched update was committed
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( $this->mTitle->getCdnUrls() ),
+                       DeferredUpdates::PRESEND
+               );
 
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        $messageCache = MessageCache::singleton();
@@ -1167,11 +1135,11 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @return string|bool TS_MW timestamp or false
         * @since 1.28
+        * @deprecated since 1.29. It will always return false.
         */
        public function getLastPurgeTimestamp() {
-               $cache = ObjectCache::getLocalClusterInstance();
-
-               return $cache->get( $cache->makeKey( 'page', 'last-dc-purge', $this->getId() ) );
+               wfDeprecated( __METHOD__, '1.29' );
+               return false;
        }
 
        /**
@@ -1209,7 +1177,7 @@ class WikiPage implements Page, IDBAccessObject {
                );
 
                if ( $dbw->affectedRows() > 0 ) {
-                       $newid = $pageId ?: $dbw->insertId();
+                       $newid = $pageId ? (int)$pageId : $dbw->insertId();
                        $this->mId = $newid;
                        $this->mTitle->resetArticleID( $newid );
 
@@ -1460,7 +1428,7 @@ class WikiPage implements Page, IDBAccessObject {
                                        $this->getContentHandler()->getModelID() );
                        }
 
-                       // Bug 30711: always use current version when adding a new section
+                       // T32711: always use current version when adding a new section
                        if ( is_null( $baseRevId ) || $sectionId === 'new' ) {
                                $oldContent = $this->getContent();
                        } else {
@@ -1695,7 +1663,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                        return $status;
                } elseif ( !$oldContent ) {
-                       // Sanity check for bug 37225
+                       // Sanity check for T39225
                        throw new MWException( "Could not find text for current revision {$oldid}." );
                }
 
@@ -1783,7 +1751,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $dbw->endAtomic( __METHOD__ );
                        $this->mTimestamp = $now;
                } else {
-                       // Bug 32948: revision ID must be set to page {{REVISIONID}} and
+                       // T34948: revision ID must be set to page {{REVISIONID}} and
                        // related variables correctly. Likewise for {{REVISIONUSER}} (T135261).
                        $revision->setId( $this->getLatest() );
                        $revision->setUserIdAndName(
@@ -2023,7 +1991,7 @@ class WikiPage implements Page, IDBAccessObject {
                $user = is_null( $user ) ? $wgUser : $user;
                // XXX: check $user->getId() here???
 
-               // Use a sane default for $serialFormat, see bug 57026
+               // Use a sane default for $serialFormat, see T59026
                if ( $serialFormat === null ) {
                        $serialFormat = $content->getContentHandler()->getDefaultFormat();
                }
@@ -2195,7 +2163,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Update the links tables and other secondary data
                if ( $content ) {
-                       $recursive = $options['changed']; // bug 50785
+                       $recursive = $options['changed']; // T52785
                        $updates = $content->getSecondaryDataUpdates(
                                $this->getTitle(), null, $recursive, $editInfo->output
                        );
@@ -2297,7 +2265,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( $options['created'] ) {
                        self::onArticleCreate( $this->mTitle );
-               } elseif ( $options['changed'] ) { // bug 50785
+               } elseif ( $options['changed'] ) { // T52785
                        self::onArticleEdit( $this->mTitle, $revision );
                }
 
@@ -2911,7 +2879,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                $dbw->onTransactionPreCommitOrIdle(
                        function () use ( $dbw, $logEntry, $logid ) {
-                               // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
+                               // T58776: avoid deadlocks (especially from FileDeleteForm)
                                $logEntry->publish( $logid );
                        },
                        __METHOD__
@@ -2933,8 +2901,8 @@ class WikiPage implements Page, IDBAccessObject {
                $status->value = $logid;
 
                // Show log excerpt on 404 pages rather than just a link
-               $cache = ObjectCache::getMainStashInstance();
-               $key = wfMemcKey( 'page-recent-delete', md5( $logTitle->getPrefixedText() ) );
+               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
+               $key = $cache->makeKey( 'page-recent-delete', md5( $logTitle->getPrefixedText() ) );
                $cache->set( $key, 1, $cache::TTL_DAY );
 
                return $status;
@@ -3191,7 +3159,7 @@ class WikiPage implements Page, IDBAccessObject {
                );
 
                // Set patrolling and bot flag on the edits, which gets rollbacked.
-               // This is done even on edit failure to have patrolling in that case (bug 62157).
+               // This is done even on edit failure to have patrolling in that case (T64157).
                $set = [];
                if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
                        // Mark all reverted edits as bot
@@ -3284,6 +3252,9 @@ class WikiPage implements Page, IDBAccessObject {
 
                MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 
+               // Invalidate caches of articles which include this page
+               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $title, 'templatelinks' ) );
+
                if ( $title->getNamespace() == NS_CATEGORY ) {
                        // Load the Category object, which will schedule a job to create
                        // the category table row if necessary. Checking a replica DB is ok
index 395cee5..0b867ef 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup Pager
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * IndexPager is an efficient pager which uses a (roughly unique) index in the
  * data set to implement paging, rather than a "LIMIT offset,limit" clause.
@@ -195,7 +198,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         */
        public function doQuery() {
                # Use the child class name for profiling
-               $fname = __METHOD__ . ' (' . get_class( $this ) . ')';
+               $fname = __METHOD__ . ' (' . static::class . ')';
                $section = Profiler::instance()->scopedProfileIn( $fname );
 
                // @todo This should probably compare to DIR_DESCENDING and DIR_ASCENDING constants
@@ -346,7 +349,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * @return string
         */
        function getSqlComment() {
-               return get_class( $this );
+               return static::class;
        }
 
        /**
diff --git a/includes/pager/RangeChronologicalPager.php b/includes/pager/RangeChronologicalPager.php
new file mode 100644 (file)
index 0000000..901d576
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Pager
+ */
+use Wikimedia\Timestamp\TimestampException;
+
+/**
+ * Pager for filtering by a range of dates.
+ * @ingroup Pager
+ */
+abstract class RangeChronologicalPager extends ReverseChronologicalPager {
+
+       protected $rangeConds = [];
+
+       /**
+        * Set and return a date range condition using timestamps provided by the user.
+        * We want the revisions between the two timestamps.
+        * Also supports only having a start or end timestamp.
+        * Assumes that the start timestamp comes before the end timestamp.
+        *
+        * @param string $startStamp Timestamp of the beginning of the date range (or empty)
+        * @param string $endStamp Timestamp of the end of the date range (or empty)
+        * @return array|null Database conditions to satisfy the specified date range
+        *     or null if dates are invalid
+        */
+       public function getDateRangeCond( $startStamp, $endStamp ) {
+               $this->rangeConds = [];
+
+               try {
+                       if ( $startStamp !== '' ) {
+                               $startTimestamp = MWTimestamp::getInstance( $startStamp );
+                               $startTimestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) );
+                               $startOffset = $this->mDb->timestamp( $startTimestamp->getTimestamp() );
+                               $this->rangeConds[] = $this->mIndexField . '>=' . $this->mDb->addQuotes( $startOffset );
+                       }
+
+                       if ( $endStamp !== '' ) {
+                               $endTimestamp = MWTimestamp::getInstance( $endStamp );
+                               $endTimestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) );
+                               $endOffset = $this->mDb->timestamp( $endTimestamp->getTimestamp() );
+                               $this->rangeConds[] = $this->mIndexField . '<=' . $this->mDb->addQuotes( $endOffset );
+
+                               // populate existing variables for compatibility with parent
+                               $this->mYear = (int)$endTimestamp->format( 'Y' );
+                               $this->mMonth = (int)$endTimestamp->format( 'm' );
+                               $this->mDay = (int)$endTimestamp->format( 'd' );
+                               $this->mOffset = $endOffset;
+                       }
+               } catch ( TimestampException $ex ) {
+                       return null;
+               }
+
+               return $this->rangeConds;
+       }
+
+       /**
+        * Takes ReverseChronologicalPager::getDateCond parameters and repurposes
+        * them to work with timestamp-based getDateRangeCond.
+        *
+        * @param int $year Year up to which we want revisions
+        * @param int $month Month up to which we want revisions
+        * @param int $day [optional] Day up to which we want revisions. Default is end of month.
+        * @return string|null Timestamp or null if year and month are false/invalid
+        */
+       public function getDateCond( $year, $month, $day = -1 ) {
+               // run through getDateRangeCond so rangeConds, mOffset, ... are set
+               $legacyTimestamp = self::getOffsetDate( $year, $month, $day );
+               // ReverseChronologicalPager uses strict inequality for the end date ('<'),
+               // but this class uses '<=' and expects extending classes to handle modifying the end date.
+               // Therefore, we need to subtract one second from the output of getOffsetDate to make it
+               // work with the '<=' inequality used in this class.
+               $legacyTimestamp->timestamp = $legacyTimestamp->timestamp->modify( '-1 second' );
+               $this->getDateRangeCond( '', $legacyTimestamp->getTimestamp( TS_MW ) );
+               return $this->mOffset;
+       }
+
+       /**
+        * Build variables to use by the database wrapper.
+        *
+        * @param string $offset Index offset, inclusive
+        * @param int $limit Exact query limit
+        * @param bool $descending Query direction, false for ascending, true for descending
+        * @return array
+        */
+       protected function buildQueryInfo( $offset, $limit, $descending ) {
+               if ( count( $this->rangeConds ) > 0 ) {
+                       // If range conditions are set, $offset is not used.
+                       // However, if range conditions aren't set, (such as when using paging links)
+                       // use the provided offset to get the proper query.
+                       $offset = '';
+               }
+
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = parent::buildQueryInfo(
+                       $offset,
+                       $limit,
+                       $descending
+               );
+
+               if ( $this->rangeConds ) {
+                       $conds = array_merge( $conds, $this->rangeConds );
+               }
+
+               return [ $tables, $fields, $conds, $fname, $options, $join_conds ];
+       }
+}
index 6f325c9..9eef728 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Efficient paging for SQL queries.
- *
  * 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
  * @file
  * @ingroup Pager
  */
+use Wikimedia\Timestamp\TimestampException;
 
 /**
- * IndexPager with a formatted navigation bar
+ * Efficient paging for SQL queries.
+ * IndexPager with a formatted navigation bar.
  * @ingroup Pager
  */
 abstract class ReverseChronologicalPager extends IndexPager {
@@ -31,7 +31,7 @@ abstract class ReverseChronologicalPager extends IndexPager {
        public $mMonth;
        public $mDay;
 
-       function getNavigationBar() {
+       public function getNavigationBar() {
                if ( !$this->isNavigationBarShown() ) {
                        return '';
                }
@@ -64,52 +64,79 @@ abstract class ReverseChronologicalPager extends IndexPager {
        /**
         * Set and return the mOffset timestamp such that we can get all revisions with
         * a timestamp up to the specified parameters.
+        *
         * @param int $year Year up to which we want revisions
         * @param int $month Month up to which we want revisions
         * @param int $day [optional] Day up to which we want revisions. Default is end of month.
         * @return string|null Timestamp or null if year and month are false/invalid
         */
-       function getDateCond( $year, $month, $day = -1 ) {
-               $year = intval( $year );
-               $month = intval( $month );
-               $day = intval( $day );
+       public function getDateCond( $year, $month, $day = -1 ) {
+               $year = (int)$year;
+               $month = (int)$month;
+               $day = (int)$day;
 
                // Basic validity checks for year and month
-               $this->mYear = $year > 0 ? $year : false;
-               $this->mMonth = ( $month > 0 && $month < 13 ) ? $month : false;
+               // If year and month are invalid, don't update the mOffset
+               if ( $year <= 0 && ( $month <= 0 || $month >= 13 ) ) {
+                       return null;
+               }
 
-               // If year and month are false, don't update the mOffset
-               if ( !$this->mYear && !$this->mMonth ) {
+               // Treat the given time in the wiki timezone and get a UTC timestamp for the database lookup
+               $timestamp = self::getOffsetDate( $year, $month, $day );
+               $timestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) );
+
+               try {
+                       $this->mYear = (int)$timestamp->format( 'Y' );
+                       $this->mMonth = (int)$timestamp->format( 'm' );
+                       $this->mDay = (int)$timestamp->format( 'd' );
+                       $this->mOffset = $this->mDb->timestamp( $timestamp->getTimestamp() );
+               } catch ( TimestampException $e ) {
+                       // Invalid user provided timestamp (T149257)
                        return null;
                }
 
+               return $this->mOffset;
+       }
+
+       /**
+        * Core logic of determining the mOffset timestamp such that we can get all items with
+        * a timestamp up to the specified parameters. Given parameters for a day up to which to get
+        * items, this function finds the timestamp of the day just after the end of the range for use
+        * in an database strict inequality filter.
+        *
+        * This is separate from getDateCond so we can use this logic in other places, such as in
+        * RangeChronologicalPager, where this function is used to convert year/month/day filter options
+        * into a timestamp.
+        *
+        * @param int $year Year up to which we want revisions
+        * @param int $month Month up to which we want revisions
+        * @param int $day [optional] Day up to which we want revisions. Default is end of month.
+        * @return MWTimestamp Timestamp or null if year and month are false/invalid
+        */
+       public static function getOffsetDate( $year, $month, $day = -1 ) {
                // Given an optional year, month, and day, we need to generate a timestamp
                // to use as "WHERE rev_timestamp <= result"
                // Examples: year = 2006      equals < 20070101 (+000000)
                // year=2005, month=1         equals < 20050201
                // year=2005, month=12        equals < 20060101
                // year=2005, month=12, day=5 equals < 20051206
-               if ( $this->mYear ) {
-                       $year = $this->mYear;
-               } else {
+               if ( $year <= 0 ) {
                        // If no year given, assume the current one
                        $timestamp = MWTimestamp::getInstance();
                        $year = $timestamp->format( 'Y' );
                        // If this month hasn't happened yet this year, go back to last year's month
-                       if ( $this->mMonth > $timestamp->format( 'n' ) ) {
+                       if ( $month > $timestamp->format( 'n' ) ) {
                                $year--;
                        }
                }
 
-               if ( $this->mMonth ) {
-                       $month = $this->mMonth;
-
+               if ( $month && $month > 0 && $month < 13 ) {
                        // Day validity check after we have month and year checked
-                       $this->mDay = checkdate( $month, $day, $year ) ? $day : false;
+                       $day = checkdate( $month, $day, $year ) ? $day : false;
 
-                       if ( $this->mDay ) {
+                       if ( $day && $day > 0 ) {
                                // If we have a day, we want up to the day immediately afterward
-                               $day = $this->mDay + 1;
+                               $day++;
 
                                // Did we overflow the current month?
                                if ( !checkdate( $month, $day, $year ) ) {
@@ -146,17 +173,6 @@ abstract class ReverseChronologicalPager extends IndexPager {
                        $ymd = 20320101;
                }
 
-               // Treat the given time in the wiki timezone and get a UTC timestamp for the database lookup
-               $timestamp = MWTimestamp::getInstance( "${ymd}000000" );
-               $timestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) );
-
-               try {
-                       $this->mOffset = $this->mDb->timestamp( $timestamp->getTimestamp() );
-               } catch ( TimestampException $e ) {
-                       // Invalid user provided timestamp (T149257)
-                       return null;
-               }
-
-               return $this->mOffset;
+               return MWTimestamp::getInstance( "${ymd}000000" );
        }
 }
index 770c1c6..70055da 100644 (file)
@@ -293,35 +293,36 @@ abstract class TablePager extends IndexPager {
                        return '';
                }
 
-               $labels = [
-                       'first' => 'table_pager_first',
-                       'prev' => 'table_pager_prev',
-                       'next' => 'table_pager_next',
-                       'last' => 'table_pager_last',
-               ];
-
-               $linkTexts = [];
-               $disabledTexts = [];
-               foreach ( $labels as $type => $label ) {
-                       $msgLabel = $this->msg( $label )->escaped();
-                       $linkTexts[$type] = "<div class='TablePager_nav-enabled'>$msgLabel</div>";
-                       $disabledTexts[$type] = "<div class='TablePager_nav-disabled'>$msgLabel</div>";
+               $this->getOutput()->enableOOUI();
+
+               $types = [ 'first', 'prev', 'next', 'last' ];
+
+               $queries = $this->getPagingQueries();
+               $links = [];
+
+               $buttons = [];
+
+               $title = $this->getTitle();
+
+               foreach ( $types as $type ) {
+                       $buttons[] = new \OOUI\ButtonWidget( [
+                               // Messages used here:
+                               // * table_pager_first
+                               // * table_pager_prev
+                               // * table_pager_next
+                               // * table_pager_last
+                               'label' => $this->msg( 'table_pager_' . $type )->text(),
+                               'href' => $queries[ $type ] ?
+                                       $title->getLinkURL( $queries[ $type ] + $this->getDefaultQuery() ) :
+                                       null,
+                               'icon' => $type === 'prev' ? 'previous' : $type,
+                               'disabled' => $queries[ $type ] === false
+                       ] );
                }
-               $links = $this->getPagingLinks( $linkTexts, $disabledTexts );
-
-               $s = Html::openElement( 'table', [ 'class' => $this->getNavClass() ] );
-               $s .= Html::openElement( 'tr' ) . "\n";
-               $width = 100 / count( $links ) . '%';
-               foreach ( $labels as $type => $label ) {
-                       // We want every cell to have the same width. We could use table-layout: fixed; in CSS,
-                       // but it only works if we specify the width of a cell or the table and we don't want to.
-                       // There is no better way. <https://www.w3.org/TR/CSS2/tables.html#fixed-table-layout>
-                       $s .= Html::rawElement( 'td',
-                               [ 'style' => "width: $width;", 'class' => "TablePager_nav-$type" ],
-                               $links[$type] ) . "\n";
-               }
-               $s .= Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n";
-               return $s;
+               return new \OOUI\ButtonGroupWidget( [
+                       'classes' => [ $this->getNavClass() ],
+                       'items' => $buttons,
+               ] );
        }
 
        /**
@@ -330,7 +331,7 @@ abstract class TablePager extends IndexPager {
         * @return string[]
         */
        public function getModuleStyles() {
-               return [ 'mediawiki.pager.tablePager' ];
+               return [ 'mediawiki.pager.tablePager', 'oojs-ui.styles.icons-movement' ];
        }
 
        /**
index 2ef599a..599fbf6 100644 (file)
@@ -286,20 +286,20 @@ class BlockLevelPass {
                                # @todo consider using a stack for nestable elements like span, table and div
                                $openMatch = preg_match(
                                        '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|'
-                                               . '<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS',
+                                               . '<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)\\b/iS',
                                        $t
                                );
                                $closeMatch = preg_match(
                                        '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'
                                                . '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|'
                                                . Parser::MARKER_PREFIX
-                                               . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS',
+                                               . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)\\b/iS',
                                        $t
                                );
 
                                if ( $openMatch || $closeMatch ) {
                                        $pendingPTag = false;
-                                       # @todo bug 5718: paragraph closed
+                                       # @todo T7718: paragraph closed
                                        $output .= $this->closeParagraph();
                                        if ( $preOpenMatch && !$preCloseMatch ) {
                                                $this->inPre = true;
@@ -353,7 +353,7 @@ class BlockLevelPass {
                                        }
                                }
                        }
-                       # somewhere above we forget to get out of pre block (bug 785)
+                       # somewhere above we forget to get out of pre block (T2785)
                        if ( $preCloseMatch && $this->inPre ) {
                                $this->inPre = false;
                        }
index 6aa3acc..e34d10b 100644 (file)
@@ -157,7 +157,7 @@ class CoreParserFunctions {
        }
 
        /**
-        * urlencodes a string according to one of three patterns: (bug 22474)
+        * urlencodes a string according to one of three patterns: (T24474)
         *
         * By default (for HTTP "query" strings), spaces are encoded as '+'.
         * Or to encode a value for the HTTP "path", spaces are encoded as '%20'.
index c943b7c..438603a 100644 (file)
@@ -79,12 +79,25 @@ class CoreTagHooks {
         * @param array $attributes
         * @param Parser $parser
         * @throws MWException
-        * @return array
+        * @return array|string Output of tag hook
         */
        public static function html( $content, $attributes, $parser ) {
                global $wgRawHtml;
                if ( $wgRawHtml ) {
-                       return [ $content, 'markerType' => 'nowiki' ];
+                       if ( $parser->getOptions()->getAllowUnsafeRawHtml() ) {
+                               return [ $content, 'markerType' => 'nowiki' ];
+                       } else {
+                               // In a system message where raw html is
+                               // not allowed (but it is allowed in other
+                               // contexts).
+                               return Html::rawElement(
+                                       'span',
+                                       [ 'class' => 'error' ],
+                                       // Using ->text() not ->parse() as
+                                       // a paranoia measure against a loop.
+                                       wfMessage( 'rawhtml-notallowed' )->escaped()
+                               );
+                       }
                } else {
                        throw new MWException( '<html> extension tag encountered unexpectedly' );
                }
index 76ee525..605a873 100644 (file)
@@ -107,7 +107,7 @@ class DateFormatter {
                $this->targets[self::ISO2] = '[[y-m-d]]';
 
                # Rules
-               #            pref    source       target
+               #            pref       source      target
                $this->rules[self::DMY][self::MD] = self::DM;
                $this->rules[self::ALL][self::MD] = self::MD;
                $this->rules[self::MDY][self::DM] = self::MD;
@@ -127,7 +127,7 @@ class DateFormatter {
         * Get a DateFormatter object
         *
         * @param Language|string|null $lang In which language to format the date
-        *              Defaults to the site content language
+        *     Defaults to the site content language
         * @return DateFormatter
         */
        public static function getInstance( $lang = null ) {
index 5e54615..ffc884e 100644 (file)
@@ -83,7 +83,7 @@ class MWTidy {
        /**
         * @return bool|\MediaWiki\Tidy\TidyDriverBase
         */
-       protected static function singleton() {
+       public static function singleton() {
                global $wgUseTidy, $wgTidyInternal, $wgTidyConf, $wgDebugTidy, $wgTidyConfig,
                        $wgTidyBin, $wgTidyOpts;
 
@@ -138,6 +138,9 @@ class MWTidy {
                        case 'Html5Internal':
                                $instance = new MediaWiki\Tidy\Html5Internal( $config );
                                break;
+                       case 'RemexHtml':
+                               $instance = new MediaWiki\Tidy\RemexDriver( $config );
+                               break;
                        case 'disabled':
                                return false;
                        default:
index 86aa06a..b3e37a4 100644 (file)
@@ -89,13 +89,15 @@ class Parser {
        # 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 T21052
-       const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F\p{Zs}]';
+       # \x{FFFD} is the Unicode replacement character, which Preprocessor_DOM
+       # uses to replace invalid HTML characters.
+       const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F\p{Zs}\x{FFFD}]';
        # Simplified expression to match an IPv4 or IPv6 address, or
        # at least one character of a host name (embeds EXT_LINK_URL_CLASS)
-       const EXT_LINK_ADDR = '(?:[0-9.]+|\\[(?i:[0-9a-f:.]+)\\]|[^][<>"\\x00-\\x20\\x7F\p{Zs}])';
+       const EXT_LINK_ADDR = '(?:[0-9.]+|\\[(?i:[0-9a-f:.]+)\\]|[^][<>"\\x00-\\x20\\x7F\p{Zs}\x{FFFD}])';
        # RegExp to make image URLs (embeds IPv6 part of EXT_LINK_ADDR)
        // @codingStandardsIgnoreStart Generic.Files.LineLength
-       const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)((?:\\[(?i:[0-9a-f:.]+)\\])?[^][<>"\\x00-\\x20\\x7F\p{Zs}]+)
+       const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)((?:\\[(?i:[0-9a-f:.]+)\\])?[^][<>"\\x00-\\x20\\x7F\p{Zs}\x{FFFD}]+)
                \\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sxu';
        // @codingStandardsIgnoreEnd
 
@@ -264,7 +266,7 @@ class Parser {
                $this->mUrlProtocols = wfUrlProtocols();
                $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')' .
                        self::EXT_LINK_ADDR .
-                       self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
+                       self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F\\x{FFFD}]*?)\]/Su';
                if ( isset( $conf['preprocessorClass'] ) ) {
                        $this->mPreprocessorClass = $conf['preprocessorClass'];
                } elseif ( defined( 'HPHP_VERSION' ) ) {
@@ -417,6 +419,8 @@ class Parser {
                        $text = strtr( $text, "\x7f", "?" );
                        $magicScopeVariable = $this->lock();
                }
+               // Strip U+0000 NULL (T159174)
+               $text = str_replace( "\000", '', $text );
 
                $this->startParse( $title, $options, self::OT_HTML, $clearState );
 
@@ -585,6 +589,14 @@ class Parser {
                                        $this->mTitle->getPrefixedDBkey() );
                        }
                }
+
+               # Wrap non-interface parser output in a <div> so it can be targeted
+               # with CSS (T37247)
+               $class = $this->mOptions->getWrapOutputClass();
+               if ( $class !== false && !$this->mOptions->getInterfaceMessage() ) {
+                       $text = Html::rawElement( 'div', [ 'class' => $class ], $text );
+               }
+
                $this->mOutput->setText( $text );
 
                $this->mRevisionId = $oldRevisionId;
@@ -1450,15 +1462,16 @@ class Parser {
                $spdash = "(?:-|$space)"; # a dash or a non-newline space
                $spaces = "$space++"; # possessive match of 1 or more spaces
                $text = preg_replace_callback(
-                       '!(?:                            # Start cases
-                               (<a[ \t\r\n>].*?</a>) |      # m[1]: Skip link text
-                               (<.*?>) |                    # m[2]: Skip stuff inside
-                                                            #       HTML elements' . "
-                               (\b(?i:$prots)($addr$urlChar*)) | # m[3]: Free external links
-                                                            # m[4]: Post-protocol path
-                               \b(?:RFC|PMID) $spaces       # m[5]: RFC or PMID, capture number
+                       '!(?:                        # Start cases
+                               (<a[ \t\r\n>].*?</a>) |    # m[1]: Skip link text
+                               (<.*?>) |                  # m[2]: Skip stuff inside HTML elements' . "
+                               (\b                        # m[3]: Free external links
+                                       (?i:$prots)
+                                       ($addr$urlChar*)         # m[4]: Post-protocol path
+                               ) |
+                               \b(?:RFC|PMID) $spaces     # m[5]: RFC or PMID, capture number
                                        ([0-9]+)\b |
-                               \bISBN $spaces (             # m[6]: ISBN, capture number
+                               \bISBN $spaces (           # m[6]: ISBN, capture number
                                        (?: 97[89] $spdash? )?   #  optional 13-digit ISBN prefix
                                        (?: [0-9]  $spdash? ){9} #  9 digits with opt. delimiters
                                        [0-9Xx]                  #  check digit
@@ -1605,9 +1618,7 @@ class Parser {
                                true, 'free',
                                $this->getExternalLinkAttribs( $url ), $this->mTitle );
                        # Register it in the output object...
-                       # Replace unnecessary URL escape codes with their equivalent characters
-                       $pasteurized = self::normalizeLinkUrl( $url );
-                       $this->mOutput->addExternalLink( $pasteurized );
+                       $this->mOutput->addExternalLink( $url );
                }
                return $text . $trail;
        }
@@ -1903,10 +1914,7 @@ class Parser {
                                $this->getExternalLinkAttribs( $url ), $this->mTitle ) . $dtrail . $trail;
 
                        # Register link in the output object.
-                       # Replace unnecessary URL escape codes with the referenced character
-                       # This prevents spammers from hiding links from the filters
-                       $pasteurized = self::normalizeLinkUrl( $url );
-                       $this->mOutput->addExternalLink( $pasteurized );
+                       $this->mOutput->addExternalLink( $url );
                }
 
                return $s;
@@ -3252,6 +3260,7 @@ class Parser {
                                $text = '<span class="error">'
                                        . wfMessage( 'parser-template-loop-warning', $titleText )->inContentLanguage()->text()
                                        . '</span>';
+                               $this->addTrackingCategory( 'template-loop-category' );
                                wfDebug( __METHOD__ . ": template loop broken at '$titleText'\n" );
                        }
                }
@@ -3475,7 +3484,7 @@ class Parser {
 
                if ( !$title->equals( $cacheTitle ) ) {
                        $this->mTplRedirCache[$cacheTitle->getPrefixedDBkey()] =
-                               [ $title->getNamespace(), $cdb = $title->getDBkey() ];
+                               [ $title->getNamespace(), $title->getDBkey() ];
                }
 
                return [ $dom, $title ];
@@ -4391,7 +4400,6 @@ class Parser {
                        $toc = Linker::tocList( $toc, $this->mOptions->getUserLangObj() );
                        $this->mOutput->setTOCHTML( $toc );
                        $toc = self::TOC_START . $toc . self::TOC_END;
-                       $this->mOutput->addModules( 'mediawiki.toc' );
                }
 
                if ( $isMain ) {
@@ -4462,6 +4470,9 @@ class Parser {
                $this->startParse( $title, $options, self::OT_WIKI, $clearState );
                $this->setUser( $user );
 
+               // Strip U+0000 NULL (T159174)
+               $text = str_replace( "\000", '', $text );
+
                // We still normalize line endings for backwards-compatibility
                // with other code that just calls PST, but this should already
                // be handled in TextContent subclasses
@@ -4966,7 +4977,7 @@ class Parser {
                $ig->setShowFilename( false );
                $ig->setParser( $this );
                $ig->setHideBadImages();
-               $ig->setAttributes( Sanitizer::validateTagAttributes( $params, 'table' ) );
+               $ig->setAttributes( Sanitizer::validateTagAttributes( $params, 'ul' ) );
 
                if ( isset( $params['showfilename'] ) ) {
                        $ig->setShowFilename( true );
@@ -5077,9 +5088,11 @@ class Parser {
                                                        }
                                                        if ( preg_match( "/^($prots)$addr$chars*$/u", $linkValue ) ) {
                                                                $link = $linkValue;
+                                                               $this->mOutput->addExternalLink( $link );
                                                        } else {
                                                                $localLinkTitle = Title::newFromText( $linkValue );
                                                                if ( $localLinkTitle !== null ) {
+                                                                       $this->mOutput->addLink( $localLinkTitle );
                                                                        $link = $localLinkTitle->getLinkURL();
                                                                }
                                                        }
@@ -5135,6 +5148,11 @@ class Parser {
                                $internalParamMap = [];
                                foreach ( $internalParamNames as $type => $names ) {
                                        foreach ( $names as $name ) {
+                                               // For grep: img_left, img_right, img_center, img_none,
+                                               // img_baseline, img_sub, img_super, img_top, img_text_top, img_middle,
+                                               // img_bottom, img_text_bottom,
+                                               // img_thumbnail, img_manualthumb, img_framed, img_frameless, img_upright,
+                                               // img_border, img_link, img_alt, img_class
                                                $magicName = str_replace( '-', '_', "img_$name" );
                                                $internalParamMap[$magicName] = [ $type, $name ];
                                        }
index 9e96540..76a7e1e 100644 (file)
@@ -67,7 +67,7 @@ class ParserCache {
                $pageid = $article->getId();
                $renderkey = (int)( $wgRequest->getVal( 'action' ) == 'render' );
 
-               $key = wfMemcKey( 'pcache', 'idhash', "{$pageid}-{$renderkey}!{$hash}" );
+               $key = $this->mMemc->makeKey( 'pcache', 'idhash', "{$pageid}-{$renderkey}!{$hash}" );
                return $key;
        }
 
@@ -76,7 +76,7 @@ class ParserCache {
         * @return mixed|string
         */
        protected function getOptionsKey( $page ) {
-               return wfMemcKey( 'pcache', 'idoptions', $page->getId() );
+               return $this->mMemc->makeKey( 'pcache', 'idoptions', $page->getId() );
        }
 
        /**
@@ -223,7 +223,7 @@ class ParserCache {
 
                // The edit section preference may not be the appropiate one in
                // the ParserOutput, as we are not storing it in the parsercache
-               // key. Force it here. See bug 31445.
+               // key. Force it here. See T33445.
                $value->setEditSectionTokens( $popts->getEditSection() );
 
                $wikiPage = method_exists( $article, 'getPage' )
index d0b66f8..353825a 100644 (file)
@@ -24,8 +24,7 @@
 /**
  * @ingroup Parser
  */
-class ParserDiffTest
-{
+class ParserDiffTest {
        public $parsers;
        public $conf;
        public $shortOutput = false;
index 2900f41..d097414 100644 (file)
@@ -243,6 +243,27 @@ class ParserOptions {
         */
        private $redirectTarget = null;
 
+       /**
+        * If the wiki is configured to allow raw html ($wgRawHtml = true)
+        * is it allowed in the specific case of parsing this page.
+        *
+        * This is meant to disable unsafe parser tags in cases where
+        * a malicious user may control the input to the parser.
+        *
+        * @note This is expected to be true for normal pages even if the
+        *  wiki has $wgRawHtml disabled in general. The setting only
+        *  signifies that raw html would be unsafe in the current context
+        *  provided that raw html is allowed at all.
+        * @var boolean
+        */
+       private $allowUnsafeRawHtml = true;
+
+       /**
+        * CSS class to use to wrap output from Parser::parse().
+        * @var string|false
+        */
+       private $wrapOutputClass = 'mw-parser-output';
+
        public function getInterwikiMagic() {
                return $this->mInterwikiMagic;
        }
@@ -409,7 +430,7 @@ class ParserOptions {
         * when the page is rendered based on the language of the user.
         *
         * @note When saving, this will return the default language instead of the user's.
-        * {{int: }} uses this which used to produce inconsistent link tables (bug 14404).
+        * {{int: }} uses this which used to produce inconsistent link tables (T16404).
         *
         * @return Language
         * @since 1.19
@@ -457,6 +478,25 @@ class ParserOptions {
        public function getMagicRFCLinks() {
                return $this->mMagicRFCLinks;
        }
+
+       /**
+        * @since 1.29
+        * @return bool
+        */
+       public function getAllowUnsafeRawHtml() {
+               return $this->allowUnsafeRawHtml;
+       }
+
+       /**
+        * Class to use to wrap output from Parser::parse()
+        * @since 1.30
+        * @return string|bool
+        */
+       public function getWrapOutputClass() {
+               $this->optionUsed( 'wrapclass' );
+               return $this->wrapOutputClass;
+       }
+
        public function setInterwikiMagic( $x ) {
                return wfSetVar( $this->mInterwikiMagic, $x );
        }
@@ -596,6 +636,28 @@ class ParserOptions {
                return wfSetVar( $this->mIsPrintable, $x );
        }
 
+       /**
+        * @param bool|null Value to set or null to get current value
+        * @return bool Current value for allowUnsafeRawHtml
+        * @since 1.29
+        */
+       public function setAllowUnsafeRawHtml( $x ) {
+               return wfSetVar( $this->allowUnsafeRawHtml, $x );
+       }
+
+       /**
+        * CSS class to use to wrap output from Parser::parse()
+        * @since 1.30
+        * @param string|bool $className Set false to disable wrapping.
+        * @return string|bool Current value
+        */
+       public function setWrapOutputClass( $className ) {
+               if ( $className === true ) { // DWIM, they probably want the default class name
+                       $className = 'mw-parser-output';
+               }
+               return wfSetVar( $this->wrapOutputClass, $className );
+       }
+
        /**
         * Set the redirect target.
         *
@@ -882,6 +944,10 @@ class ParserOptions {
                        $confstr .= '!printable=1';
                }
 
+               if ( $this->wrapOutputClass !== 'mw-parser-output' && in_array( 'wrapclass', $forOptions ) ) {
+                       $confstr .= '!wrapclass=' . $this->wrapOutputClass;
+               }
+
                if ( $this->mExtraKey != '' ) {
                        $confstr .= $this->mExtraKey;
                }
index 0c162b4..10ac192 100644 (file)
@@ -535,6 +535,10 @@ class ParserOutput extends CacheTime {
                # We don't register links pointing to our own server, unless... :-)
                global $wgServer, $wgRegisterInternalExternals;
 
+               # Replace unnecessary URL escape codes with the referenced character
+               # This prevents spammers from hiding links from the filters
+               $url = parser::normalizeLinkUrl( $url );
+
                $registerExternalLink = true;
                if ( !$wgRegisterInternalExternals ) {
                        $registerExternalLink = !self::isLinkInternal( $wgServer, $url );
@@ -704,12 +708,12 @@ class ParserOutput extends CacheTime {
         * @since 1.25
         */
        public function addTrackingCategory( $msg, $title ) {
-               if ( $title->getNamespace() === NS_SPECIAL ) {
+               if ( $title->isSpecialPage() ) {
                        wfDebug( __METHOD__ . ": Not adding tracking category $msg to special page!\n" );
                        return false;
                }
 
-               // Important to parse with correct title (bug 31469)
+               // Important to parse with correct title (T33469)
                $cat = wfMessage( $msg )
                        ->title( $title )
                        ->inContentLanguage()
index 426b550..24474d5 100644 (file)
@@ -51,9 +51,9 @@ abstract class Preprocessor {
                ],
                '-{' => [
                        'end' => '}-',
-                       'names' => [ 1 => null ],
-                       'min' => 1,
-                       'max' => 1,
+                       'names' => [ 2 => null ],
+                       'min' => 2,
+                       'max' => 2,
                ],
        ];
 
@@ -72,12 +72,12 @@ abstract class Preprocessor {
                        return false;
                }
 
-               $key = wfMemcKey(
+               $cache = ObjectCache::getLocalClusterInstance();
+               $key = $cache->makeKey(
                        defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : static::class,
                        md5( $text ), $flags );
                $value = sprintf( "%08d", static::CACHE_VERSION ) . $tree;
 
-               $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) );
                $cache->set( $key, $value, 86400 );
 
                LoggerFactory::getInstance( 'Preprocessor' )
@@ -101,9 +101,9 @@ abstract class Preprocessor {
                        return false;
                }
 
-               $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) );
+               $cache = ObjectCache::getLocalClusterInstance();
 
-               $key = wfMemcKey(
+               $key = $cache->makeKey(
                        defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : static::class,
                        md5( $text ), $flags );
 
index 661318b..7539307 100644 (file)
@@ -134,7 +134,7 @@ class Preprocessor_DOM extends Preprocessor {
         *                                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
@@ -223,8 +223,7 @@ class Preprocessor_DOM extends Preprocessor {
 
                $searchBase = "[{<\n"; # }
                if ( !$wgDisableLangConversion ) {
-                       // FIXME: disabled due to T153761
-                       // $searchBase .= '-';
+                       $searchBase .= '-';
                }
 
                // For fast reverse searches
@@ -277,6 +276,13 @@ class Preprocessor_DOM extends Preprocessor {
                                $search = $searchBase;
                                if ( $stack->top === false ) {
                                        $currentClosing = '';
+                               } elseif (
+                                       $stack->top->close === '}-' &&
+                                       $stack->top->count > 2
+                               ) {
+                                       # adjust closing for -{{{...{{
+                                       $currentClosing = '}';
+                                       $search .= $currentClosing;
                                } else {
                                        $currentClosing = $stack->top->close;
                                        $search .= $currentClosing;
@@ -333,11 +339,15 @@ class Preprocessor_DOM extends Preprocessor {
                                        } 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
+                                               # Some versions of PHP have a strcspn which stops on
+                                               # null characters; ignore these and continue.
+                                               # We also may get '-' and '}' characters here which
+                                               # don't match -{ or $currentClosing.  Add these to
+                                               # output and continue.
+                                               if ( $curChar == '-' || $curChar == '}' ) {
+                                                       $accum .= $curChar;
+                                               }
                                                ++$i;
                                                continue;
                                        }
@@ -615,7 +625,10 @@ class Preprocessor_DOM extends Preprocessor {
                        } elseif ( $found == 'open' ) {
                                # count opening brace characters
                                $curLen = strlen( $curChar );
-                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i );
+                               $count = ( $curLen > 1 ) ?
+                                       # allow the final character to repeat
+                                       strspn( $text, $curChar[$curLen-1], $i+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'] ) {
@@ -635,17 +648,25 @@ class Preprocessor_DOM extends Preprocessor {
                                        # Add literal brace(s)
                                        $accum .= htmlspecialchars( str_repeat( $curChar, $count ) );
                                }
-                               $i += $curLen * $count;
+                               $i += $count;
                        } elseif ( $found == 'close' ) {
                                $piece = $stack->top;
                                # lets check if there are enough characters for closing brace
                                $maxCount = $piece->count;
+                               if ( $piece->close === '}-' && $curChar === '}' ) {
+                                       $maxCount--; # don't try to match closing '-' as a '}'
+                               }
                                $curLen = strlen( $curChar );
-                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i, $maxCount );
+                               $count = ( $curLen > 1 ) ? $curLen :
+                                       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)
                                $rule = $this->rules[$piece->open];
+                               if ( $piece->close === '}-' && $piece->count > 2 ) {
+                                       # tweak for -{..{{ }}..}-
+                                       $rule = $this->rules['{'];
+                               }
                                if ( $count > $rule['max'] ) {
                                        # The specified maximum exists in the callback array, unless the caller
                                        # has made an error
@@ -663,14 +684,16 @@ class Preprocessor_DOM extends Preprocessor {
                                if ( $matchingCount <= 0 ) {
                                        # No matching element found in callback array
                                        # Output a literal closing brace and continue
-                                       $accum .= htmlspecialchars( str_repeat( $curChar, $count ) );
-                                       $i += $curLen * $count;
+                                       $endText = substr( $text, $i, $count );
+                                       $accum .= htmlspecialchars( $endText );
+                                       $i += $count;
                                        continue;
                                }
                                $name = $rule['names'][$matchingCount];
                                if ( $name === null ) {
                                        // No element, just literal text
-                                       $element = $piece->breakSyntax( $matchingCount ) . str_repeat( $rule['end'], $matchingCount );
+                                       $endText = substr( $text, $i, $matchingCount );
+                                       $element = $piece->breakSyntax( $matchingCount ) . $endText;
                                } else {
                                        # Create XML element
                                        # Note: $parts is already XML, does not need to be encoded further
@@ -703,7 +726,7 @@ class Preprocessor_DOM extends Preprocessor {
                                }
 
                                # Advance input pointer
-                               $i += $curLen * $matchingCount;
+                               $i += $matchingCount;
 
                                # Unwind the stack
                                $stack->pop();
@@ -719,7 +742,12 @@ class Preprocessor_DOM extends Preprocessor {
                                                $stack->push( $piece );
                                                $accum =& $stack->getAccum();
                                        } else {
-                                               $accum .= str_repeat( $piece->open, $piece->count );
+                                               $s = substr( $piece->open, 0, -1 );
+                                               $s .= str_repeat(
+                                                       substr( $piece->open, -1 ),
+                                                       $piece->count - strlen( $s )
+                                               );
+                                               $accum .= $s;
                                        }
                                }
                                $flags = $stack->getFlags();
@@ -924,7 +952,11 @@ class PPDStackElement {
                        if ( $openingCount === false ) {
                                $openingCount = $this->count;
                        }
-                       $s = str_repeat( $this->open, $openingCount );
+                       $s = substr( $this->open, 0, -1 );
+                       $s .= str_repeat(
+                               substr( $this->open, -1 ),
+                               $openingCount - strlen( $s )
+                       );
                        $first = true;
                        foreach ( $this->parts as $part ) {
                                if ( $first ) {
index 2666c93..597d1f2 100644 (file)
@@ -107,7 +107,7 @@ class Preprocessor_Hash extends Preprocessor {
         *                                 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
@@ -155,8 +155,7 @@ class Preprocessor_Hash extends Preprocessor {
 
                $searchBase = "[{<\n";
                if ( !$wgDisableLangConversion ) {
-                       // FIXME: disabled due to T153761
-                       // $searchBase .= '-';
+                       $searchBase .= '-';
                }
 
                // For fast reverse searches
@@ -208,6 +207,13 @@ class Preprocessor_Hash extends Preprocessor {
                                $search = $searchBase;
                                if ( $stack->top === false ) {
                                        $currentClosing = '';
+                               } elseif (
+                                       $stack->top->close === '}-' &&
+                                       $stack->top->count > 2
+                               ) {
+                                       # adjust closing for -{{{...{{
+                                       $currentClosing = '}';
+                                       $search .= $currentClosing;
                                } else {
                                        $currentClosing = $stack->top->close;
                                        $search .= $currentClosing;
@@ -264,11 +270,15 @@ class Preprocessor_Hash extends Preprocessor {
                                        } 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
+                                               # Some versions of PHP have a strcspn which stops on
+                                               # null characters; ignore these and continue.
+                                               # We also may get '-' and '}' characters here which
+                                               # don't match -{ or $currentClosing.  Add these to
+                                               # output and continue.
+                                               if ( $curChar == '-' || $curChar == '}' ) {
+                                                       self::addLiteral( $accum, $curChar );
+                                               }
                                                ++$i;
                                                continue;
                                        }
@@ -558,7 +568,10 @@ class Preprocessor_Hash extends Preprocessor {
                        } elseif ( $found == 'open' ) {
                                # count opening brace characters
                                $curLen = strlen( $curChar );
-                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i );
+                               $count = ( $curLen > 1 ) ?
+                                       # allow the final character to repeat
+                                       strspn( $text, $curChar[$curLen-1], $i+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'] ) {
@@ -577,17 +590,25 @@ class Preprocessor_Hash extends Preprocessor {
                                        # Add literal brace(s)
                                        self::addLiteral( $accum, str_repeat( $curChar, $count ) );
                                }
-                               $i += $curLen * $count;
+                               $i += $count;
                        } elseif ( $found == 'close' ) {
                                $piece = $stack->top;
                                # lets check if there are enough characters for closing brace
                                $maxCount = $piece->count;
+                               if ( $piece->close === '}-' && $curChar === '}' ) {
+                                       $maxCount--; # don't try to match closing '-' as a '}'
+                               }
                                $curLen = strlen( $curChar );
-                               $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i, $maxCount );
+                               $count = ( $curLen > 1 ) ? $curLen :
+                                       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)
                                $rule = $this->rules[$piece->open];
+                               if ( $piece->close === '}-' && $piece->count > 2 ) {
+                                       # tweak for -{..{{ }}..}-
+                                       $rule = $this->rules['{'];
+                               }
                                if ( $count > $rule['max'] ) {
                                        # The specified maximum exists in the callback array, unless the caller
                                        # has made an error
@@ -605,15 +626,17 @@ class Preprocessor_Hash extends Preprocessor {
                                if ( $matchingCount <= 0 ) {
                                        # No matching element found in callback array
                                        # Output a literal closing brace and continue
-                                       self::addLiteral( $accum, str_repeat( $curChar, $count ) );
-                                       $i += $curLen * $count;
+                                       $endText = substr( $text, $i, $count );
+                                       self::addLiteral( $accum, $endText );
+                                       $i += $count;
                                        continue;
                                }
                                $name = $rule['names'][$matchingCount];
                                if ( $name === null ) {
                                        // No element, just literal text
+                                       $endText = substr( $text, $i, $matchingCount );
                                        $element = $piece->breakSyntax( $matchingCount );
-                                       self::addLiteral( $element, str_repeat( $rule['end'], $matchingCount ) );
+                                       self::addLiteral( $element, $endText );
                                } else {
                                        # Create XML element
                                        $parts = $piece->parts;
@@ -648,7 +671,7 @@ class Preprocessor_Hash extends Preprocessor {
                                }
 
                                # Advance input pointer
-                               $i += $curLen * $matchingCount;
+                               $i += $matchingCount;
 
                                # Unwind the stack
                                $stack->pop();
@@ -664,7 +687,12 @@ class Preprocessor_Hash extends Preprocessor {
                                                $stack->push( $piece );
                                                $accum =& $stack->getAccum();
                                        } else {
-                                               self::addLiteral( $accum, str_repeat( $piece->open, $piece->count ) );
+                                               $s = substr( $piece->open, 0, -1 );
+                                               $s .= str_repeat(
+                                                       substr( $piece->open, -1 ),
+                                                       $piece->count - strlen( $s )
+                                               );
+                                               self::addLiteral( $accum, $s );
                                        }
                                }
 
@@ -762,7 +790,12 @@ class PPDStackElement_Hash extends PPDStackElement {
                        if ( $openingCount === false ) {
                                $openingCount = $this->count;
                        }
-                       $accum = [ str_repeat( $this->open, $openingCount ) ];
+                       $s = substr( $this->open, 0, -1 );
+                       $s .= str_repeat(
+                               substr( $this->open, -1 ),
+                               $openingCount - strlen( $s )
+                       );
+                       $accum = [ $s ];
                        $lastIndex = 0;
                        $first = true;
                        foreach ( $this->parts as $part ) {
index 534e86b..1f1add7 100644 (file)
@@ -129,7 +129,7 @@ class PoolWorkArticleView extends PoolCounterWork {
                        return false;
                }
 
-               // Reduce effects of race conditions for slow parses (bug 46014)
+               // Reduce effects of race conditions for slow parses (T48014)
                $cacheTime = wfTimestampNow();
 
                $time = - microtime( true );
index 088721c..2225e3f 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Profiler
  */
 
+use Wikimedia\Rdbms\DBError;
+
 /**
  * Logs profiling data into the local DB
  *
@@ -41,7 +43,7 @@ class ProfilerOutputDb extends ProfilerOutput {
        }
 
        public function canUse() {
-               # Do not log anything if database is readonly (bug 5375)
+               # Do not log anything if database is readonly (T7375)
                return !wfReadOnly();
        }
 
index 52aa54a..bb86551 100644 (file)
@@ -21,6 +21,7 @@
  * @file
  * @ingroup Profiler
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * ProfilerOutput class that flushes profiling data to the profiling
@@ -38,7 +39,7 @@ class ProfilerOutputStats extends ProfilerOutput {
         */
        public function log( array $stats ) {
                $prefix = isset( $this->params['prefix'] ) ? $this->params['prefix'] : '';
-               $contextStats = $this->collector->getContext()->getStats();
+               $contextStats = MediaWikiServices::getInstance()->getStatsdDataFactory();
 
                foreach ( $stats as $stat ) {
                        $key = "{$prefix}.{$stat['name']}";
index 1212f99..39a8a3d 100644 (file)
@@ -56,6 +56,16 @@ class ExtensionProcessor implements Processor {
                'ValidSkinNames',
        ];
 
+       /**
+        * Top-level attributes that come from MW core
+        *
+        * @var string[]
+        */
+       protected static $coreAttributes = [
+               'SkinOOUIThemes',
+               'TrackingCategories',
+       ];
+
        /**
         * Mapping of global settings to their specific merge strategies.
         *
@@ -160,6 +170,14 @@ class ExtensionProcessor implements Processor {
         */
        protected $attributes = [];
 
+       /**
+        * Extension attributes, keyed by name =>
+        *  settings.
+        *
+        * @var array
+        */
+       protected $extAttributes = [];
+
        /**
         * @param string $path
         * @param array $info
@@ -186,14 +204,47 @@ class ExtensionProcessor implements Processor {
                        $this->callbacks[$name] = $info['callback'];
                }
 
+               if ( $version === 2 ) {
+                       $this->extractAttributes( $path, $info );
+               }
+
                foreach ( $info as $key => $val ) {
+                       // If it's a global setting,
                        if ( in_array( $key, self::$globalSettings ) ) {
                                $this->storeToArray( $path, "wg$key", $val, $this->globals );
+                               continue;
+                       }
                        // Ignore anything that starts with a @
-                       } elseif ( $key[0] !== '@' && !in_array( $key, self::$notAttributes )
-                               && !in_array( $key, self::$creditsAttributes )
-                       ) {
-                               $this->storeToArray( $path, $key, $val, $this->attributes );
+                       if ( $key[0] === '@' ) {
+                               continue;
+                       }
+
+                       if ( $version === 2 ) {
+                               // Only whitelisted attributes are set
+                               if ( in_array( $key, self::$coreAttributes ) ) {
+                                       $this->storeToArray( $path, $key, $val, $this->attributes );
+                               }
+                       } else {
+                               // version === 1
+                               if ( !in_array( $key, self::$notAttributes )
+                                       && !in_array( $key, self::$creditsAttributes )
+                               ) {
+                                       // If it's not blacklisted, it's an attribute
+                                       $this->storeToArray( $path, $key, $val, $this->attributes );
+                               }
+                       }
+
+               }
+       }
+
+       /**
+        * @param string $path
+        * @param array $info
+        */
+       protected function extractAttributes( $path, array $info ) {
+               if ( isset( $info['attributes'] ) ) {
+                       foreach ( $info['attributes'] as $extName => $value ) {
+                               $this->storeToArray( $path, $extName, $value, $this->extAttributes );
                        }
                }
        }
@@ -206,6 +257,22 @@ class ExtensionProcessor implements Processor {
                        }
                }
 
+               // Merge $this->extAttributes into $this->attributes depending on what is loaded
+               foreach ( $this->extAttributes as $extName => $value ) {
+                       // Only set the attribute if $extName is loaded (and hence present in credits)
+                       if ( isset( $this->credits[$extName] ) ) {
+                               foreach ( $value as $attrName => $attrValue ) {
+                                       $this->storeToArray(
+                                               '', // Don't provide a path since it's impossible to generate an error here
+                                               $extName . $attrName,
+                                               $attrValue,
+                                               $this->attributes
+                                       );
+                               }
+                               unset( $this->extAttributes[$extName] );
+                       }
+               }
+
                return [
                        'globals' => $this->globals,
                        'defines' => $this->defines,
@@ -241,8 +308,15 @@ class ExtensionProcessor implements Processor {
        protected function extractNamespaces( array $info ) {
                if ( isset( $info['namespaces'] ) ) {
                        foreach ( $info['namespaces'] as $ns ) {
-                               $id = $ns['id'];
-                               $this->defines[$ns['constant']] = $id;
+                               if ( defined( $ns['constant'] ) ) {
+                                       // If the namespace constant is already defined, use it.
+                                       // This allows namespace IDs to be overwritten locally.
+                                       $id = constant( $ns['constant'] );
+                               } else {
+                                       $id = $ns['id'];
+                                       $this->defines[ $ns['constant'] ] = $id;
+                               }
+
                                if ( !( isset( $ns['conditional'] ) && $ns['conditional'] ) ) {
                                        // If it is not conditional, register it
                                        $this->attributes['ExtensionNamespaces'][$id] = $ns['name'];
index 344dd8f..0c5a67e 100644 (file)
@@ -31,7 +31,7 @@ class ExtensionRegistry {
        /**
         * Bump whenever the registration cache needs resetting
         */
-       const CACHE_VERSION = 5;
+       const CACHE_VERSION = 6;
 
        /**
         * Special key that defines the merge strategy
@@ -111,7 +111,7 @@ class ExtensionRegistry {
         *  be loaded then).
         */
        public function loadFromQueue() {
-               global $wgVersion;
+               global $wgVersion, $wgDevelopmentWarnings;
                if ( !$this->queued ) {
                        return;
                }
@@ -137,7 +137,7 @@ class ExtensionRegistry {
                        $cache = new EmptyBagOStuff();
                }
                // See if this queue is in APC
-               $key = wfMemcKey(
+               $key = $cache->makeKey(
                        'registration',
                        md5( json_encode( $this->queued + $versions ) )
                );
@@ -151,7 +151,10 @@ class ExtensionRegistry {
                        // did that, but it should be cached
                        $data['globals']['wgAutoloadClasses'] += $data['autoload'];
                        unset( $data['autoload'] );
-                       $cache->set( $key, $data, 60 * 60 * 24 );
+                       if ( !( $data['warnings'] && $wgDevelopmentWarnings ) ) {
+                               // If there were no warnings that were shown, cache it
+                               $cache->set( $key, $data, 60 * 60 * 24 );
+                       }
                }
                $this->queued = [];
        }
@@ -198,6 +201,7 @@ class ExtensionRegistry {
                $versionChecker = new VersionChecker( $wgVersion );
                $extDependencies = [];
                $incompatible = [];
+               $warnings = false;
                foreach ( $queue as $path => $mtime ) {
                        $json = file_get_contents( $path );
                        if ( $json === false ) {
@@ -209,6 +213,11 @@ class ExtensionRegistry {
                        }
 
                        if ( !isset( $info['manifest_version'] ) ) {
+                               wfDeprecated(
+                                       "{$info['name']}'s extension.json or skin.json does not have manifest_version",
+                                       '1.29'
+                               );
+                               $warnings = true;
                                // For backwards-compatability, assume a version of 1
                                $info['manifest_version'] = 1;
                        }
@@ -237,6 +246,7 @@ class ExtensionRegistry {
                        $processor->extractInfo( $path, $info, $version );
                }
                $data = $processor->getExtractedInfo();
+               $data['warnings'] = $warnings;
 
                // check for incompatible extensions
                $incompatible = array_merge(
index a4100bb..210deb1 100644 (file)
@@ -23,11 +23,11 @@ interface Processor {
 
        /**
         * @return array With following keys:
-        *              'globals' - variables to be set to $GLOBALS
-        *              'defines' - constants to define
-        *              'callbacks' - functions to be executed by the registry
-        *              'credits' - metadata to be stored by registry
-        *              'attributes' - registration info which isn't a global variable
+        *     'globals' - variables to be set to $GLOBALS
+        *     'defines' - constants to define
+        *     'callbacks' - functions to be executed by the registry
+        *     'credits' - metadata to be stored by registry
+        *     'attributes' - registration info which isn't a global variable
         */
        public function getExtractedInfo();
 
index 5aaaa1b..a31551c 100644 (file)
@@ -87,17 +87,17 @@ class VersionChecker {
         * installed extensions in the $credits array.
         *
         * Example $extDependencies:
-        *      {
-        *              'FooBar' => {
-        *                      'MediaWiki' => '>= 1.25.0',
-        *                      'extensions' => {
-        *                              'FooBaz' => '>= 1.25.0'
-        *                      },
-        *                      'skins' => {
-        *                              'BazBar' => '>= 1.0.0'
-        *                      }
-        *              }
-        *      }
+        *     {
+        *       '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
index 59c60df..0d12840 100644 (file)
@@ -27,6 +27,7 @@ use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use WrappedString\WrappedString;
+use Wikimedia\Rdbms\DBConnectionError;
 
 /**
  * Dynamic JavaScript and CSS resource loading system.
@@ -185,7 +186,7 @@ class ResourceLoader implements LoggerAwareInterface {
                        return self::applyFilter( $filter, $data );
                }
 
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
 
                $key = $cache->makeGlobalKey(
@@ -540,6 +541,10 @@ class ResourceLoader implements LoggerAwareInterface {
                        if ( isset( $info['object'] ) ) {
                                // Object given in info array
                                $object = $info['object'];
+                       } elseif ( isset( $info['factory'] ) ) {
+                               $object = call_user_func( $info['factory'], $info );
+                               $object->setConfig( $this->getConfig() );
+                               $object->setLogger( $this->logger );
                        } else {
                                if ( !isset( $info['class'] ) ) {
                                        $class = 'ResourceLoaderFileModule';
@@ -714,7 +719,7 @@ class ResourceLoader implements LoggerAwareInterface {
                        $module = $this->getModule( $name );
                        if ( $module ) {
                                // Do not allow private modules to be loaded from the web.
-                               // This is a security issue, see bug 34907.
+                               // This is a security issue, see T36907.
                                if ( $module->getGroup() === 'private' ) {
                                        $this->logger->debug( "Request for private module '$name' denied" );
                                        $this->errors[] = "Cannot show private module \"$name\"";
@@ -1217,7 +1222,7 @@ MESSAGE;
                        $styles = (array)$styles;
                        foreach ( $styles as $style ) {
                                $style = trim( $style );
-                               // Don't output an empty "@media print { }" block (bug 40498)
+                               // Don't output an empty "@media print { }" block (T42498)
                                if ( $style !== '' ) {
                                        // Transform the media type based on request params and config
                                        // The way that this relies on $wgRequest to propagate request params is slightly evil
@@ -1634,7 +1639,7 @@ MESSAGE;
         */
        public function getLessCompiler( $extraVars = [] ) {
                // When called from the installer, it is possible that a required PHP extension
-               // is missing (at least for now; see bug 47564). If this is the case, throw an
+               // is missing (at least for now; see T49564). If this is the case, throw an
                // exception (caught by the installer) to prevent a fatal error later on.
                if ( !class_exists( 'Less_Parser' ) ) {
                        throw new MWException( 'MediaWiki requires the less.php parser' );
index 29f8cfe..b8f2fa5 100644 (file)
@@ -170,7 +170,7 @@ class ResourceLoaderClientHtml {
 
                        if ( $module->getType() !== ResourceLoaderModule::LOAD_STYLES ) {
                                $logger = $rl->getLogger();
-                               $logger->debug( 'Unexpected general module "{module}" in styles queue.', [
+                               $logger->warning( 'Unexpected general module "{module}" in styles queue.', [
                                        'module' => $name,
                                ] );
                        } else {
@@ -417,7 +417,7 @@ class ResourceLoaderClientHtml {
                                // Special handling for the user group; because users might change their stuff
                                // on-wiki like user pages, or user preferences; we need to find the highest
                                // timestamp of these user-changeable modules so we can ensure cache misses on change
-                               // This should NOT be done for the site group (bug 27564) because anons get that too
+                               // This should NOT be done for the site group (T29564) because anons get that too
                                // and we shouldn't be putting timestamps in CDN-cached HTML
                                if ( $group === 'user' ) {
                                        // Must setModules() before makeVersionQuery()
index a1a89cb..8955b8c 100644 (file)
@@ -197,7 +197,7 @@ class ResourceLoaderContext {
                if ( $this->direction === null ) {
                        $this->direction = $this->getRequest()->getRawVal( 'dir' );
                        if ( !$this->direction ) {
-                               // Determine directionality based on user language (bug 6100)
+                               // Determine directionality based on user language (T8100)
                                $this->direction = Language::factory( $this->getLanguage() )->getDir();
                        }
                }
index 2503b22..19d5471 100644 (file)
@@ -67,23 +67,27 @@ class ResourceLoaderImage {
                                }
                        }
                }
+               // Remove 'deprecated' key
+               if ( is_array( $this->descriptor ) ) {
+                       unset( $this->descriptor[ 'deprecated' ] );
+               }
 
                // Ensure that all files have common extension.
                $extensions = [];
-               $descriptor = (array)$descriptor;
+               $descriptor = (array)$this->descriptor;
                array_walk_recursive( $descriptor, function ( $path ) use ( &$extensions ) {
                        $extensions[] = pathinfo( $path, PATHINFO_EXTENSION );
                } );
                $extensions = array_unique( $extensions );
                if ( count( $extensions ) !== 1 ) {
                        throw new InvalidArgumentException(
-                               "File type for different image files of '$name' not the same"
+                               "File type for different image files of '$name' not the same in module '$module'"
                        );
                }
                $ext = $extensions[0];
                if ( !isset( self::$fileTypes[$ext] ) ) {
                        throw new InvalidArgumentException(
-                               "Invalid file type for image files of '$name' (valid: svg, png, gif, jpg)"
+                               "Invalid file type for image files of '$name' (valid: svg, png, gif, jpg) in module '$module'"
                        );
                }
                $this->extension = $ext;
@@ -176,6 +180,7 @@ class ResourceLoaderImage {
                        'variant' => $variant,
                        'format' => $format,
                        'lang' => $context->getLanguage(),
+                       'skin' => $context->getSkin(),
                        'version' => $context->getVersion(),
                ];
 
index ff1b7b1..d26c961 100644 (file)
@@ -70,7 +70,8 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
         *         'selectorWithVariant' => [CSS selector template, variables: {prefix} {name} {variant}],
         *         // List of variants that may be used for the image files
         *         'variants' => [
-        *             [theme name] => [
+        *             // This level of nesting can be omitted if you use the same images for every skin
+        *             [skin name (or 'default')] => [
         *                 [variant name] => [
         *                     'color' => [color string, e.g. '#ffff00'],
         *                     'global' => [boolean, if true, this variant is available
@@ -82,7 +83,8 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
         *         ],
         *         // List of image files and their options
         *         'images' => [
-        *             [theme name] => [
+        *             // This level of nesting can be omitted if you use the same images for every skin
+        *             [skin name (or 'default')] => [
         *                 [icon name] => [
         *                     'file' => [file path string or array whose values are file path strings
         *                                    and whose keys are 'default', 'ltr', 'rtl', a single
@@ -315,11 +317,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                $selectors = $this->getSelectors();
 
                foreach ( $this->getImages( $context ) as $name => $image ) {
-                       $declarations = $this->getCssDeclarations(
-                               $image->getDataUri( $context, null, 'original' ),
-                               $image->getUrl( $context, $script, null, 'rasterized' )
-                       );
-                       $declarations = implode( "\n\t", $declarations );
+                       $declarations = $this->getStyleDeclarations( $context, $image, $script );
                        $selector = strtr(
                                $selectors['selectorWithoutVariant'],
                                [
@@ -331,11 +329,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                        $rules[] = "$selector {\n\t$declarations\n}";
 
                        foreach ( $image->getVariants() as $variant ) {
-                               $declarations = $this->getCssDeclarations(
-                                       $image->getDataUri( $context, $variant, 'original' ),
-                                       $image->getUrl( $context, $script, $variant, 'rasterized' )
-                               );
-                               $declarations = implode( "\n\t", $declarations );
+                               $declarations = $this->getStyleDeclarations( $context, $image, $script, $variant );
                                $selector = strtr(
                                        $selectors['selectorWithVariant'],
                                        [
@@ -352,6 +346,28 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                return [ 'all' => $style ];
        }
 
+       /**
+        * @param ResourceLoaderContext $context
+        * @param ResourceLoaderImage $image Image to get the style for
+        * @param string $script URL to load.php
+        * @param string|null $variant Variant to get the style for
+        * @return string
+        */
+       private function getStyleDeclarations(
+               ResourceLoaderContext $context,
+               ResourceLoaderImage $image,
+               $script,
+               $variant = null
+       ) {
+               $imageDataUri = $image->getDataUri( $context, $variant, 'original' );
+               $primaryUrl = $imageDataUri ?: $image->getUrl( $context, $script, $variant, 'original' );
+               $declarations = $this->getCssDeclarations(
+                       $primaryUrl,
+                       $image->getUrl( $context, $script, $variant, 'rasterized' )
+               );
+               return implode( "\n\t", $declarations );
+       }
+
        /**
         * SVG support using a transparent gradient to guarantee cross-browser
         * compatibility (browsers able to understand gradient syntax support also SVG).
index a3b059b..1704481 100644 (file)
@@ -43,9 +43,26 @@ class ResourceLoaderJqueryMsgModule extends ResourceLoaderFileModule {
                        )
                );
 
-               $dataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ $parserDefaults ] );
+               $mainDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ $parserDefaults ] );
 
-               return $fileScript . $dataScript;
+               // Associative array mapping magic words (e.g. SITENAME)
+               // to their values.
+               $magicWords = [
+                       'SITENAME' => $this->getConfig()->get( 'Sitename' ),
+               ];
+
+               Hooks::run( 'ResourceLoaderJqueryMsgModuleMagicWords', [ $context, &$magicWords ] );
+
+               $magicWordExtendData = [
+                       'magic' => $magicWords,
+               ];
+
+               $magicWordDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [
+                       $magicWordExtendData,
+                       /* deep= */ true
+               ] );
+
+               return $fileScript . $mainDataScript . $magicWordDataScript;
        }
 
        /**
index 6d2bc0d..3ad6a84 100644 (file)
@@ -147,8 +147,8 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                if ( $deprecationInfo ) {
                        $name = $this->getName();
                        $warning = 'This page is using the deprecated ResourceLoader module "' . $name . '".';
-                       if ( !is_bool( $deprecationInfo ) && isset( $deprecationInfo['message'] ) ) {
-                               $warning .= "\n" . $deprecationInfo['message'];
+                       if ( is_string( $deprecationInfo ) ) {
+                               $warning .= "\n" . $deprecationInfo;
                        }
                        return Xml::encodeJsCall(
                                'mw.log.warn',
@@ -624,7 +624,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         */
        final protected function buildContent( ResourceLoaderContext $context ) {
                $rl = $context->getResourceLoader();
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                $statStart = microtime( true );
 
                // Only include properties that are relevant to this context (e.g. only=scripts)
@@ -651,7 +651,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                                        && substr( rtrim( $scripts ), -1 ) !== ';'
                                ) {
                                        // Append semicolon to prevent weird bugs caused by files not
-                                       // terminating their statements right (bug 27054)
+                                       // terminating their statements right (T29054)
                                        $scripts .= ";\n";
                                }
                        }
@@ -662,7 +662,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                if ( $context->shouldIncludeStyles() ) {
                        $styles = [];
                        // Don't create empty stylesheets like [ '' => '' ] for modules
-                       // that don't *have* any stylesheets (bug 38024).
+                       // that don't *have* any stylesheets (T40024).
                        $stylePairs = $this->getStyles( $context );
                        if ( count( $stylePairs ) ) {
                                // If we are in debug mode without &only= set, we'll want to return an array of URLs
@@ -843,7 +843,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         */
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
                return [
-                       '_class' => get_class( $this ),
+                       '_class' => static::class,
                        '_cacheEpoch' => $this->getConfig()->get( 'CacheEpoch' ),
                ];
        }
@@ -931,36 +931,33 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         * @return string JS with the original, or a replacement error
         */
        protected function validateScriptFile( $fileName, $contents ) {
-               if ( $this->getConfig()->get( 'ResourceLoaderValidateJS' ) ) {
-                       // Try for cache hit
-                       $cache = ObjectCache::getMainWANInstance();
-                       $key = $cache->makeKey(
+               if ( !$this->getConfig()->get( 'ResourceLoaderValidateJS' ) ) {
+                       return $contents;
+               }
+               $cache = ObjectCache::getMainWANInstance();
+               return $cache->getWithSetCallback(
+                       $cache->makeGlobalKey(
                                'resourceloader',
                                'jsparse',
                                self::$parseCacheVersion,
-                               md5( $contents )
-                       );
-                       $cacheEntry = $cache->get( $key );
-                       if ( is_string( $cacheEntry ) ) {
-                               return $cacheEntry;
-                       }
-
-                       $parser = self::javaScriptParser();
-                       try {
-                               $parser->parse( $contents, $fileName, 1 );
-                               $result = $contents;
-                       } catch ( Exception $e ) {
-                               // We'll save this to cache to avoid having to validate broken JS over and over...
-                               $err = $e->getMessage();
-                               $result = "mw.log.error(" .
-                                       Xml::encodeJsVar( "JavaScript parse error: $err" ) . ");";
+                               md5( $contents ),
+                               $fileName
+                       ),
+                       $cache::TTL_WEEK,
+                       function () use ( $contents, $fileName ) {
+                               $parser = self::javaScriptParser();
+                               try {
+                                       $parser->parse( $contents, $fileName, 1 );
+                                       $result = $contents;
+                               } catch ( Exception $e ) {
+                                       // We'll save this to cache to avoid having to re-validate broken JS
+                                       $err = $e->getMessage();
+                                       $result = "mw.log.error(" .
+                                               Xml::encodeJsVar( "JavaScript parse error: $err" ) . ");";
+                               }
+                               return $result;
                        }
-
-                       $cache->set( $key, $result );
-                       return $result;
-               } else {
-                       return $contents;
-               }
+               );
        }
 
        /**
index 52aa392..14e5c26 100644 (file)
@@ -26,6 +26,7 @@
 class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule {
        protected function loadFromDefinition() {
                if ( $this->definition === null ) {
+                       // Do nothing if definition was already processed
                        return;
                }
 
@@ -38,39 +39,48 @@ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule {
 
                $definition = [];
                foreach ( $themes as $skin => $theme ) {
+                       // Find the path to the JSON file which contains the actual image definitions for this theme
                        // TODO Allow extensions to specify this path somehow
-                       $dataPath = $this->localBasePath . '/' . $rootPath . '/' . $theme . '/' . $name . '.json';
+                       $dataPath = $rootPath . '/' . strtolower( $theme ) . '/' . $name . '.json';
+                       $localDataPath = $this->localBasePath . '/' . $dataPath;
 
-                       if ( file_exists( $dataPath ) ) {
-                               $data = json_decode( file_get_contents( $dataPath ), true );
-                               $fixPath = function ( &$path ) use ( $rootPath, $theme ) {
-                                       // TODO Allow extensions to specify this path somehow
-                                       $path = $rootPath . '/' . $theme . '/' . $path;
-                               };
-                               array_walk( $data['images'], function ( &$value ) use ( $fixPath ) {
-                                       if ( is_string( $value['file'] ) ) {
-                                               $fixPath( $value['file'] );
-                                       } elseif ( is_array( $value['file'] ) ) {
-                                               array_walk_recursive( $value['file'], $fixPath );
-                                       }
-                               } );
-                       } else {
-                               $data = [];
+                       // If there's no file for this module of this theme, that's okay, it will just use the defaults
+                       if ( !file_exists( $localDataPath ) ) {
+                               continue;
                        }
+                       $data = json_decode( file_get_contents( $localDataPath ), true );
 
+                       // Expand the paths to images (since they are relative to the JSON file that defines them, not
+                       // our base directory)
+                       $fixPath = function ( &$path ) use ( $dataPath ) {
+                               $path = dirname( $dataPath ) . '/' . $path;
+                       };
+                       array_walk( $data['images'], function ( &$value ) use ( $fixPath ) {
+                               if ( is_string( $value['file'] ) ) {
+                                       $fixPath( $value['file'] );
+                               } elseif ( is_array( $value['file'] ) ) {
+                                       array_walk_recursive( $value['file'], $fixPath );
+                               }
+                       } );
+
+                       // Convert into a definition compatible with the parent vanilla ResourceLoaderImageModule
                        foreach ( $data as $key => $value ) {
                                switch ( $key ) {
+                                       // Images and color variants are defined per-theme, here converted to per-skin
                                        case 'images':
                                        case 'variants':
                                                $definition[$key][$skin] = $data[$key];
                                                break;
 
+                                       // Other options must be identical for each theme (or only defined in the default one)
                                        default:
                                                if ( !isset( $definition[$key] ) ) {
                                                        $definition[$key] = $data[$key];
                                                } elseif ( $definition[$key] !== $data[$key] ) {
                                                        throw new Exception(
-                                                               "Mismatched OOUI theme definitions are not supported: trying to load $key of $theme theme"
+                                                               "Mismatched OOUI theme images definition: " .
+                                                                       "key '$key' of theme '$theme' " .
+                                                                       "does not match other themes"
                                                        );
                                                }
                                                break;
@@ -78,7 +88,7 @@ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule {
                        }
                }
 
-               // Fields from definition silently override keys from JSON files
+               // Fields from module definition silently override keys from JSON files
                $this->definition += $definition;
 
                parent::loadFromDefinition();
index 91e63e7..5740925 100644 (file)
 
 class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
 
-       /* Methods */
-
        /**
         * @param ResourceLoaderContext $context
         * @return array
         */
        public function getStyles( ResourceLoaderContext $context ) {
-               $conf = $this->getConfig();
-               $logo = $conf->get( 'Logo' );
-               $logoHD = $conf->get( 'LogoHD' );
-
-               $logo1 = OutputPage::transformResourcePath( $conf, $logo );
-               $logo15 = OutputPage::transformResourcePath( $conf, $logoHD['1.5x'] );
-               $logo2 = OutputPage::transformResourcePath( $conf, $logoHD['2x'] );
-
+               $logo = $this->getLogo( $this->getConfig() );
                $styles = parent::getStyles( $context );
+
+               $default = !is_array( $logo ) ? $logo : $logo['1x'];
                $styles['all'][] = '.mw-wiki-logo { background-image: ' .
-                       CSSMin::buildUrlValue( $logo1 ) .
-                       '; }';
-               if ( $logoHD ) {
-                       if ( isset( $logoHD['1.5x'] ) ) {
+                               CSSMin::buildUrlValue( $default ) .
+                               '; }';
+
+               if ( is_array( $logo ) ) {
+                       if ( isset( $logo['1.5x'] ) ) {
                                $styles[
                                        '(-webkit-min-device-pixel-ratio: 1.5), ' .
                                        '(min--moz-device-pixel-ratio: 1.5), ' .
                                        '(min-resolution: 1.5dppx), ' .
                                        '(min-resolution: 144dpi)'
                                ][] = '.mw-wiki-logo { background-image: ' .
-                               CSSMin::buildUrlValue( $logo15 ) . ';' .
+                               CSSMin::buildUrlValue( $logo['1.5x'] ) . ';' .
                                'background-size: 135px auto; }';
                        }
-                       if ( isset( $logoHD['2x'] ) ) {
+                       if ( isset( $logo['2x'] ) ) {
                                $styles[
                                        '(-webkit-min-device-pixel-ratio: 2), ' .
                                        '(min--moz-device-pixel-ratio: 2),' .
                                        '(min-resolution: 2dppx), ' .
                                        '(min-resolution: 192dpi)'
                                ][] = '.mw-wiki-logo { background-image: ' .
-                               CSSMin::buildUrlValue( $logo2 ) . ';' .
+                               CSSMin::buildUrlValue( $logo['2x'] ) . ';' .
                                'background-size: 135px auto; }';
                        }
                }
+
                return $styles;
        }
 
+       /**
+        * @param Config $conf
+        * @return string|array Single url if no variants are defined
+        *  or array of logo urls keyed by dppx in form "<float>x".
+        *  Key "1x" is always defined.
+        */
+       public static function getLogo( Config $conf ) {
+               $logo = $conf->get( 'Logo' );
+               $logoHD = $conf->get( 'LogoHD' );
+
+               $logo1Url = OutputPage::transformResourcePath( $conf, $logo );
+
+               if ( !$logoHD ) {
+                       return $logo1Url;
+               }
+
+               $logoUrls = [
+                       '1x' => $logo1Url,
+               ];
+
+               // Only 1.5x and 2x are supported
+               if ( isset( $logoHD['1.5x'] ) ) {
+                       $logoUrls['1.5x'] = OutputPage::transformResourcePath(
+                               $conf,
+                               $logoHD['1.5x']
+                       );
+               }
+               if ( isset( $logoHD['2x'] ) ) {
+                       $logoUrls['2x'] = OutputPage::transformResourcePath(
+                               $conf,
+                               $logoHD['2x']
+                       );
+               }
+
+               return $logoUrls;
+       }
+
        /**
         * @param ResourceLoaderContext $context
         * @return bool
@@ -77,13 +109,12 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
                return false;
        }
 
-       /**
-        * @param ResourceLoaderContext $context
-        * @return string: Hash
-        */
-       public function getModifiedHash( ResourceLoaderContext $context ) {
-               $logo = $this->getConfig()->get( 'Logo' );
-               $logoHD = $this->getConfig()->get( 'LogoHD' );
-               return md5( parent::getModifiedHash( $context ) . $logo . json_encode( $logoHD ) );
+       public function getDefinitionSummary( ResourceLoaderContext $context ) {
+               $summary = parent::getDefinitionSummary( $context );
+               $summary[] = [
+                       'logo' => $this->getConfig()->get( 'Logo' ),
+                       'logoHD' => $this->getConfig()->get( 'LogoHD' ),
+               ];
+               return $summary;
        }
 }
index 44371bb..a0061e3 100644 (file)
@@ -93,6 +93,7 @@ class ResourceLoaderSpecialCharacterDataModule extends ResourceLoaderModule {
                        'special-characters-group-thai',
                        'special-characters-group-lao',
                        'special-characters-group-khmer',
+                       'special-characters-group-canadianaboriginal',
                        'special-characters-title-endash',
                        'special-characters-title-emdash',
                        'special-characters-title-minus'
index a99305c..d92dc0a 100644 (file)
@@ -82,7 +82,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgSearchType' => $conf->get( 'SearchType' ),
                        'wgVariantArticlePath' => $conf->get( 'VariantArticlePath' ),
                        // Force object to avoid "empty" associative array from
-                       // becoming [] instead of {} in JS (bug 34604)
+                       // becoming [] instead of {} in JS (T36604)
                        'wgActionPaths' => (object)$conf->get( 'ActionPaths' ),
                        'wgServer' => $conf->get( 'Server' ),
                        'wgServerName' => $conf->get( 'ServerName' ),
@@ -112,7 +112,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgIllegalFileChars' => Title::convertByteClassToUnicodeClass( $illegalFileChars ),
                        'wgResourceLoaderStorageVersion' => $conf->get( 'ResourceLoaderStorageVersion' ),
                        'wgResourceLoaderStorageEnabled' => $conf->get( 'ResourceLoaderStorageEnabled' ),
-                       'wgResourceLoaderLegacyModules' => self::getLegacyModules(),
                        'wgForeignUploadTargets' => $conf->get( 'ForeignUploadTargets' ),
                        'wgEnableUploads' => $conf->get( 'EnableUploads' ),
                ];
@@ -330,9 +329,11 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         */
        public static function getStartupModulesUrl( ResourceLoaderContext $context ) {
                $rl = $context->getResourceLoader();
-
                $derivative = new DerivativeResourceLoaderContext( $context );
-               $derivative->setModules( self::getStartupModules() );
+               $derivative->setModules( array_merge(
+                       self::getStartupModules(),
+                       self::getLegacyModules()
+               ) );
                $derivative->setOnly( 'scripts' );
                // Must setModules() before makeVersionQuery()
                $derivative->setVersion( $rl->makeVersionQuery( $derivative ) );
@@ -342,7 +343,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
        /**
         * @param ResourceLoaderContext $context
-        * @return string
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                global $IP;
index 6632045..b9dc098 100644 (file)
@@ -37,7 +37,7 @@ class ResourceLoaderUserDefaultsModule extends ResourceLoaderModule {
 
        /**
         * @param ResourceLoaderContext $context
-        * @return string
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                return Xml::encodeJsCall(
index b3b3f16..0c332cf 100644 (file)
@@ -48,7 +48,7 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
 
        /**
         * @param ResourceLoaderContext $context
-        * @return string
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                return Xml::encodeJsCall( 'mw.user.options.set',
index cea1f39..bfa7326 100644 (file)
@@ -57,7 +57,7 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
         * Add FILTER_NOMIN annotation to prevent needless minification and caching (T84960).
         *
         * @param ResourceLoaderContext $context
-        * @return string
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                return Xml::encodeJsCall(
index e8574f4..fd31eac 100644 (file)
@@ -22,6 +22,9 @@
  * @author Roan Kattouw
  */
 
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Abstraction for ResourceLoader modules which pull from wiki pages
  *
@@ -146,7 +149,16 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
        protected function getContent( $titleText ) {
                $title = Title::newFromText( $titleText );
                if ( !$title ) {
-                       return null;
+                       return null; // Bad title
+               }
+
+               // If the page is a redirect, follow the redirect.
+               if ( $title->isRedirect() ) {
+                       $content = $this->getContentObj( $title );
+                       $title = $content ? $content->getUltimateRedirectTarget() : null;
+                       if ( !$title ) {
+                               return null; // Dead redirect
+                       }
                }
 
                $handler = ContentHandler::getForTitle( $title );
@@ -155,9 +167,22 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                } elseif ( $handler->isSupportedFormat( CONTENT_FORMAT_JAVASCRIPT ) ) {
                        $format = CONTENT_FORMAT_JAVASCRIPT;
                } else {
-                       return null;
+                       return null; // Bad content model
                }
 
+               $content = $this->getContentObj( $title );
+               if ( !$content ) {
+                       return null; // No content found
+               }
+
+               return $content->serialize( $format );
+       }
+
+       /**
+        * @param Title $title
+        * @return Content|null
+        */
+       protected function getContentObj( Title $title ) {
                $revision = Revision::newKnownCurrent( wfGetDB( DB_REPLICA ), $title->getArticleID(),
                        $title->getLatestRevID() );
                if ( !$revision ) {
@@ -165,18 +190,16 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                }
                $revision->setTitle( $title );
                $content = $revision->getContent( Revision::RAW );
-
                if ( !$content ) {
                        wfDebugLog( 'resourceloader', __METHOD__ . ': failed to load content of JS/CSS page!' );
                        return null;
                }
-
-               return $content->serialize( $format );
+               return $content;
        }
 
        /**
         * @param ResourceLoaderContext $context
-        * @return string
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                $scripts = '';
@@ -268,7 +291,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        return true;
                }
 
-               // Bug 68488: For other modules (i.e. ones that are called in cached html output) only check
+               // T70488: For other modules (i.e. ones that are called in cached html output) only check
                // page existance. This ensures that, if some pages in a module are temporarily blanked,
                // we don't end omit the module's script or link tag on some pages.
                return count( $revisions ) === 0;
index ad9259b..9afaf40 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for archive table items, i.e. revisions deleted via action=delete
  */
index afee637..1d80d86 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for filearchive table items
  */
index 9beafc9..62bafe9 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Item class for an oldimage table row
  */
index 00cb2e1..77cf976 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for oldimage table items
  */
index ff1d2ed..1932778 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for logging table items
  */
index f0b1907..1ea6a38 100644 (file)
@@ -19,6 +19,9 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for revision table items
  *
index 7f41eb2..7812fb9 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Backend functions for suppressing and unsuppressing all references to a given user,
  * used when blocking with HideUser enabled.  This was spun out of SpecialBlockip.php
index 38c60d0..d51e525 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Search
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Base search engine base class for database-backed searches
  * @ingroup Search
index 9817b6c..4473bb2 100644 (file)
@@ -72,6 +72,21 @@ abstract class SearchEngine {
                return null;
        }
 
+       /**
+        * Perform a title search in the article archive.
+        * NOTE: these results still should be filtered by
+        * matching against PageArchive, permissions checks etc
+        * The results returned by this methods are only sugegstions and
+        * may not end up being shown to the user.
+        *
+        * @param string $term Raw search term
+        * @return Status<Title[]>
+        * @since 1.29
+        */
+       function searchArchiveTitle( $term ) {
+               return Status::newGood( [] );
+       }
+
        /**
         * Perform a title-only search query and return a result set.
         * If title searches are not supported or disabled, return null.
@@ -440,8 +455,8 @@ abstract class SearchEngine {
                        $title = Title::newFromText( $search . 'Dummy' );
                        if ( $title && $title->getText() == 'Dummy'
                                        && $title->getNamespace() != NS_MAIN
-                                       && !$title->isExternal() )
-                       {
+                                       && !$title->isExternal()
+                       {
                                $ns = [ $title->getNamespace() ];
                                $search = '';
                        } else {
index a767bc3..613d33c 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Factory class for SearchEngine.
  * Allows to create engine of the specific type.
index d0e3a24..cebdb40 100644 (file)
 class SearchHighlighter {
        protected $mCleanWikitext = true;
 
+       /**
+        * @warning If you pass false to this constructor, then
+        *  the caller is responsible for HTML escaping.
+        */
        function __construct( $cleanupWikitext = true ) {
                $this->mCleanWikitext = $cleanupWikitext;
        }
@@ -456,6 +460,10 @@ class SearchHighlighter {
                $text = preg_replace( "/('''|<\/?[iIuUbB]>)/", "", $text );
                $text = preg_replace( "/''/", "", $text );
 
+               // Note, the previous /<\/?[^>]+>/ is insufficient
+               // for XSS safety as the HTML tag can span multiple
+               // search results (T144845).
+               $text = Sanitizer::escapeHtmlAllowEntities( $text );
                return $text;
        }
 
index 8a06b65..04344fd 100644 (file)
@@ -33,6 +33,11 @@ abstract class SearchIndexFieldDefinition implements SearchIndexField {
         */
        protected $subfields = [];
 
+       /**
+        * @var callable
+        */
+       private $mergeCallback;
+
        /**
         * SearchIndexFieldDefinition constructor.
         * @param string $name Field name
@@ -91,9 +96,12 @@ abstract class SearchIndexFieldDefinition implements SearchIndexField {
         * @return SearchIndexField|false New definition or false if not mergeable.
         */
        public function merge( SearchIndexField $that ) {
+               if ( !empty( $this->mergeCallback ) ) {
+                       return call_user_func( $this->mergeCallback, $this, $that );
+               }
                // TODO: which definitions may be compatible?
                if ( ( $that instanceof self ) && $this->type === $that->type &&
-                    $this->flags === $that->flags && $this->type !== self::INDEX_TYPE_NESTED
+                       $this->flags === $that->flags && $this->type !== self::INDEX_TYPE_NESTED
                ) {
                        return $that;
                }
@@ -125,4 +133,11 @@ abstract class SearchIndexFieldDefinition implements SearchIndexField {
         */
        abstract public function getMapping( SearchEngine $engine );
 
+       /**
+        * Set field-specific merge strategy.
+        * @param callable $callback
+        */
+       public function setMergeCallback( $callback ) {
+               $this->mergeCallback = $callback;
+       }
 }
index c3985d1..53d09e8 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * This class is used for different SQL-based search engines shipped with MediaWiki
  * @ingroup Search
index bad0ef9..633cfc9 100644 (file)
@@ -303,7 +303,7 @@ class ServiceContainer implements DestructibleService {
 
                $instance = $this->peekService( $name );
 
-               if ( $destroy && $instance instanceof DestructibleService )  {
+               if ( $destroy && $instance instanceof DestructibleService ) {
                        $instance->destroy();
                }
 
index 8633715..d37b73b 100644 (file)
@@ -132,7 +132,7 @@ final class SessionBackend {
                $this->forceHTTPS = $info->forceHTTPS();
                $this->providerMetadata = $info->getProviderMetadata();
 
-               $blob = $store->get( wfMemcKey( 'MWSession', (string)$this->id ) );
+               $blob = $store->get( $store->makeKey( 'MWSession', (string)$this->id ) );
                if ( !is_array( $blob ) ||
                        !isset( $blob['metadata'] ) || !is_array( $blob['metadata'] ) ||
                        !isset( $blob['data'] ) || !is_array( $blob['data'] )
@@ -249,7 +249,7 @@ final class SessionBackend {
                        $this->autosave();
 
                        // Delete the data for the old session ID now
-                       $this->store->delete( wfMemcKey( 'MWSession', $oldId ) );
+                       $this->store->delete( $this->store->makeKey( 'MWSession', $oldId ) );
                }
        }
 
@@ -317,7 +317,7 @@ final class SessionBackend {
 
                        // Delete the session data, so the local cache-only write in
                        // self::save() doesn't get things out of sync with the backend.
-                       $this->store->delete( wfMemcKey( 'MWSession', (string)$this->id ) );
+                       $this->store->delete( $this->store->makeKey( 'MWSession', (string)$this->id ) );
 
                        $this->autosave();
                }
@@ -729,7 +729,7 @@ final class SessionBackend {
                $flags = $this->persist ? 0 : CachedBagOStuff::WRITE_CACHE_ONLY;
                $flags |= CachedBagOStuff::WRITE_SYNC; // write to all datacenters
                $this->store->set(
-                       wfMemcKey( 'MWSession', (string)$this->id ),
+                       $this->store->makeKey( 'MWSession', (string)$this->id ),
                        [
                                'data' => $this->data,
                                'metadata' => $metadata,
index 7cc8509..40a568f 100644 (file)
@@ -214,7 +214,7 @@ final class SessionManager implements SessionManagerInterface {
                }
 
                // Test if the session is in storage, and if so try to load it.
-               $key = wfMemcKey( 'MWSession', $id );
+               $key = $this->store->makeKey( 'MWSession', $id );
                if ( is_array( $this->store->get( $key ) ) ) {
                        $create = false; // If loading fails, don't bother creating because it probably will fail too.
                        if ( $this->loadSessionInfoFromStore( $info, $request ) ) {
@@ -255,7 +255,7 @@ final class SessionManager implements SessionManagerInterface {
                                throw new \InvalidArgumentException( 'Invalid session ID' );
                        }
 
-                       $key = wfMemcKey( 'MWSession', $id );
+                       $key = $this->store->makeKey( 'MWSession', $id );
                        if ( is_array( $this->store->get( $key ) ) ) {
                                throw new \InvalidArgumentException( 'Session ID already exists' );
                        }
@@ -545,7 +545,7 @@ final class SessionManager implements SessionManagerInterface {
         * @return bool Whether the session info matches the stored data (if any)
         */
        private function loadSessionInfoFromStore( SessionInfo &$info, WebRequest $request ) {
-               $key = wfMemcKey( 'MWSession', $info->getId() );
+               $key = $this->store->makeKey( 'MWSession', $info->getId() );
                $blob = $this->store->get( $key );
 
                // If we got data from the store and the SessionInfo says to force use,
@@ -934,7 +934,7 @@ final class SessionManager implements SessionManagerInterface {
        public function generateSessionId() {
                do {
                        $id = \Wikimedia\base_convert( \MWCryptRand::generateHex( 40 ), 16, 32, 32 );
-                       $key = wfMemcKey( 'MWSession', $id );
+                       $key = $this->store->makeKey( 'MWSession', $id );
                } while ( isset( $this->allSessionIds[$id] ) || is_array( $this->store->get( $key ) ) );
                return $id;
        }
index 3ab0f43..c6990fe 100644 (file)
@@ -91,9 +91,9 @@ interface SessionManagerInterface extends LoggerAwareInterface {
         *
         * The return value is such that someone could theoretically do this:
         * @code
-        *  foreach ( $provider->getVaryHeaders() as $header => $options ) {
-        *      $outputPage->addVaryHeader( $header, $options );
-        *  }
+        * foreach ( $provider->getVaryHeaders() as $header => $options ) {
+        *   $outputPage->addVaryHeader( $header, $options );
+        * }
         * @endcode
         *
         * @return array
index 61c7500..3cf69b7 100644 (file)
@@ -397,9 +397,9 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         *
         * The return value is such that someone could theoretically do this:
         * @code
-        *  foreach ( $provider->getVaryHeaders() as $header => $options ) {
-        *      $outputPage->addVaryHeader( $header, $options );
-        *  }
+        * foreach ( $provider->getVaryHeaders() as $header => $options ) {
+        *   $outputPage->addVaryHeader( $header, $options );
+        * }
         * @endcode
         *
         * @protected For use by \MediaWiki\Session\SessionManager only
@@ -455,7 +455,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         * @return string
         */
        public function __toString() {
-               return get_class( $this );
+               return static::class;
        }
 
        /**
@@ -475,7 +475,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         */
        protected function describeMessage() {
                return wfMessage(
-                       'sessionprovider-' . str_replace( '\\', '-', strtolower( get_class( $this ) ) )
+                       'sessionprovider-' . str_replace( '\\', '-', strtolower( static::class ) )
                );
        }
 
index a2f43f3..f3cd1e8 100644 (file)
@@ -90,7 +90,7 @@ class CachingSiteStore implements SiteStore {
        private function getCacheKey() {
                if ( $this->cacheKey === null ) {
                        $type = 'SiteList#' . SiteList::getSerialVersionId();
-                       $this->cacheKey = wfMemcKey( "sites/$type" );
+                       $this->cacheKey = $this->cache->makeKey( "sites/$type" );
                }
 
                return $this->cacheKey;
index 6a97a50..28f19f9 100644 (file)
@@ -463,6 +463,9 @@ class Site implements Serializable {
         * @param string $languageCode
         */
        public function setLanguageCode( $languageCode ) {
+               if ( !Language::isValidCode( $languageCode ) ) {
+                       throw new InvalidArgumentException( "$languageCode is not a valid language code." );
+               }
                $this->languageCode = $languageCode;
        }
 
index eef421c..5868904 100644 (file)
@@ -287,12 +287,31 @@ abstract class BaseTemplate extends QuickTemplate {
         * @param string $name
         */
        protected function renderAfterPortlet( $name ) {
+               echo $this->getAfterPortlet( $name );
+       }
+
+       /**
+        * Allows extensions to hook into known portlets and add stuff to them
+        *
+        * @param string $name
+        *
+        * @return string html
+        * @since 1.29
+        */
+       protected function getAfterPortlet( $name ) {
+               $html = '';
                $content = '';
                Hooks::run( 'BaseTemplateAfterPortlet', [ $this, $name, &$content ] );
 
                if ( $content !== '' ) {
-                       echo "<div class='after-portlet after-portlet-$name'>$content</div>";
+                       $html = Html::rawElement(
+                               'div',
+                               [ 'class' => [ 'after-portlet', 'after-portlet-' . $name ] ],
+                               $content
+                       );
                }
+
+               return $html;
        }
 
        /**
@@ -324,12 +343,12 @@ abstract class BaseTemplate extends QuickTemplate {
         *
         * If a "data" key is present, it must be an array, where the keys represent
         * the data-xxx properties with their provided values. For example,
-        *  $item['data'] = [
-        *       'foo' => 1,
-        *       'bar' => 'baz',
-        *  ];
+        *     $item['data'] = [
+        *       'foo' => 1,
+        *       'bar' => 'baz',
+        *     ];
         * will render as element properties:
-        *  data-foo='1' data-bar='baz'
+        *     data-foo='1' data-bar='baz'
         *
         * @param array $options Can be used to affect the output of a link.
         * Possible options are:
@@ -632,6 +651,69 @@ abstract class BaseTemplate extends QuickTemplate {
                return $footericons;
        }
 
+       /**
+        * Renderer for getFooterIcons and getFooterLinks
+        *
+        * @param string $iconStyle $option for getFooterIcons: "icononly", "nocopyright"
+        * @param string $linkStyle $option for getFooterLinks: "flat"
+        *
+        * @return string html
+        * @since 1.29
+        */
+       protected function getFooter( $iconStyle = 'icononly', $linkStyle = 'flat' ) {
+               $validFooterIcons = $this->getFooterIcons( $iconStyle );
+               $validFooterLinks = $this->getFooterLinks( $linkStyle );
+
+               $html = '';
+
+               if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) {
+                       $html .= Html::openElement( 'div', [
+                               'id' => 'footer-bottom',
+                               'role' => 'contentinfo',
+                               'lang' => $this->get( 'userlang' ),
+                               'dir' => $this->get( 'dir' )
+                       ] );
+                       $footerEnd = Html::closeElement( 'div' );
+               } else {
+                       $footerEnd = '';
+               }
+               foreach ( $validFooterIcons as $blockName => $footerIcons ) {
+                       $html .= Html::openElement( 'div', [
+                               'id' => 'f-' . Sanitizer::escapeId( $blockName ) . 'ico',
+                               'class' => 'footer-icons'
+                       ] );
+                       foreach ( $footerIcons as $icon ) {
+                               $html .= $this->getSkin()->makeFooterIcon( $icon );
+                       }
+                       $html .= Html::closeElement( 'div' );
+               }
+               if ( count( $validFooterLinks ) > 0 ) {
+                       $html .= Html::openElement( 'ul', [ 'id' => 'f-list', 'class' => 'footer-places' ] );
+                       foreach ( $validFooterLinks as $aLink ) {
+                               $html .= Html::rawElement(
+                                       'li',
+                                       [ 'id' => Sanitizer::escapeId( $aLink ) ],
+                                       $this->get( $aLink )
+                               );
+                       }
+                       $html .= Html::closeElement( 'ul' );
+               }
+
+               $html .= $this->getClear() . $footerEnd;
+
+               return $html;
+       }
+
+       /**
+        * Get a div with the core visualClear class, for clearing floats
+        *
+        * @return string html
+        * @since 1.29
+        */
+       protected function getClear() {
+               return Html::element( 'div', [ 'class' => 'visualClear' ] );
+       }
+
        /**
         * Get the suggested HTML for page status indicators: icons (or short text snippets) usually
         * displayed in the top-right corner of the page, outside of the main content.
@@ -648,7 +730,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * @since 1.25
         */
        public function getIndicators() {
-               $out = "<div class=\"mw-indicators\">\n";
+               $out = "<div class=\"mw-indicators mw-body-content\">\n";
                foreach ( $this->data['indicators'] as $id => $content ) {
                        $out .= Html::rawElement(
                                'div',
@@ -664,15 +746,25 @@ abstract class BaseTemplate extends QuickTemplate {
        }
 
        /**
-        * Output the basic end-page trail including bottomscripts, reporttime, and
+        * Output getTrail
+        */
+       function printTrail() {
+               echo $this->getTrail();
+       }
+
+       /**
+        * Get the basic end-page trail including bottomscripts, reporttime, and
         * debug stuff. This should be called right before outputting the closing
         * body and html tags.
+        *
+        * @return string
+        * @since 1.29
         */
-       function printTrail() {
-?>
-<?php echo MWDebug::getDebugHTML( $this->getSkin()->getContext() ); ?>
-<?php $this->html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?>
-<?php $this->html( 'reporttime' ) ?>
-<?php
+       function getTrail() {
+               $html = MWDebug::getDebugHTML( $this->getSkin()->getContext() );
+               $html .= $this->get( 'bottomscripts' );
+               $html .= $this->get( 'reporttime' );
+
+               return $html;
        }
 }
index 96812ea..ccb202e 100644 (file)
@@ -149,20 +149,30 @@ abstract class Skin extends ContextSource {
         * Defines the ResourceLoader modules that should be added to the skin
         * It is recommended that skins wishing to override call parent::getDefaultModules()
         * and substitute out any modules they wish to change by using a key to look them up
+        *
+        * For style modules, use setupSkinUserCss() instead.
+        *
         * @return array Array of modules with helper keys for easy overriding
         */
        public function getDefaultModules() {
                global $wgUseAjax, $wgEnableAPI, $wgEnableWriteAPI;
 
                $out = $this->getOutput();
+               $config = $this->getConfig();
                $user = $out->getUser();
                $modules = [
+                       // modules not specific to any specific skin or page
+                       'core' => [
+                               // Enforce various default modules for all pages and all skins
+                               // Keep this list as small as possible
+                               'site',
+                               'mediawiki.page.startup',
+                               'mediawiki.user',
+                       ],
                        // modules that enhance the page content in some way
                        'content' => [
                                'mediawiki.page.ready',
                        ],
-                       // modules that exist for legacy reasons
-                       'legacy' => ResourceLoaderStartUpModule::getLegacyModules(),
                        // modules relating to search functionality
                        'search' => [],
                        // modules relating to functionality relating to watching an article
@@ -171,6 +181,25 @@ abstract class Skin extends ContextSource {
                        'user' => [],
                ];
 
+               // Support for high-density display images if enabled
+               if ( $config->get( 'ResponsiveImages' ) ) {
+                       $modules['core'][] = 'mediawiki.hidpi';
+               }
+
+               // Preload jquery.tablesorter for mediawiki.page.ready
+               if ( strpos( $out->getHTML(), 'sortable' ) !== false ) {
+                       $modules['content'][] = 'jquery.tablesorter';
+               }
+
+               // Preload jquery.makeCollapsible for mediawiki.page.ready
+               if ( strpos( $out->getHTML(), 'mw-collapsible' ) !== false ) {
+                       $modules['content'][] = 'jquery.makeCollapsible';
+               }
+
+               if ( $out->isTOCEnabled() ) {
+                       $modules['content'][] = 'mediawiki.toc';
+               }
+
                // Add various resources if required
                if ( $wgUseAjax && $wgEnableAPI ) {
                        if ( $wgEnableWriteAPI && $user->isLoggedIn()
@@ -381,7 +410,7 @@ abstract class Skin extends ContextSource {
 
                if ( $title->isSpecialPage() ) {
                        $type = 'ns-special';
-                       // bug 23315: provide a class based on the canonical special page name without subpages
+                       // T25315: provide a class based on the canonical special page name without subpages
                        list( $canonicalName ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
                        if ( $canonicalName ) {
                                $type .= ' ' . Sanitizer::escapeClass( "mw-special-$canonicalName" );
@@ -433,6 +462,15 @@ abstract class Skin extends ContextSource {
                return $wgLogo;
        }
 
+       /**
+        * Whether the logo should be preloaded with an HTTP link header or not
+        * @since 1.29
+        * @return bool
+        */
+       public function shouldPreloadLogo() {
+               return false;
+       }
+
        /**
         * @return string HTML
         */
@@ -906,7 +944,10 @@ abstract class Skin extends ContextSource {
                                $html = htmlspecialchars( $icon["alt"] );
                        }
                        if ( $url ) {
-                               $html = Html::rawElement( 'a', [ "href" => $url ], $html );
+                               global $wgExternalLinkTarget;
+                               $html = Html::rawElement( 'a',
+                                       [ "href" => $url, "target" => $wgExternalLinkTarget ],
+                                       $html );
                        }
                }
                return $html;
@@ -1035,7 +1076,7 @@ abstract class Skin extends ContextSource {
                global $wgStylePath, $wgStyleVersion;
 
                if ( $this->stylename === null ) {
-                       $class = get_class( $this );
+                       $class = static::class;
                        throw new MWException( "$class::\$stylename must be set to use getSkinStylePath()" );
                }
 
@@ -1283,7 +1324,7 @@ abstract class Skin extends ContextSource {
                                        $line = array_map( 'trim', explode( '|', $line, 2 ) );
                                        if ( count( $line ) !== 2 ) {
                                                // Second sanity check, could be hit by people doing
-                                               // funky stuff with parserfuncs... (bug 33321)
+                                               // funky stuff with parserfuncs... (T35321)
                                                continue;
                                        }
 
@@ -1466,7 +1507,7 @@ abstract class Skin extends ContextSource {
                }
 
                // Use the extra hash appender to let eg SSL variants separately cache.
-               $key = wfMemcKey( $name . $wgRenderHashAppend );
+               $key = $parserMemc->makeKey( $name . $wgRenderHashAppend );
                $cachedNotice = $parserMemc->get( $key );
                if ( is_array( $cachedNotice ) ) {
                        if ( md5( $notice ) == $cachedNotice['hash'] ) {
@@ -1538,7 +1579,7 @@ abstract class Skin extends ContextSource {
 
                $attribs = [];
                if ( !is_null( $tooltip ) ) {
-                       # Bug 25462: undo double-escaping.
+                       # T27462: undo double-escaping.
                        $tooltip = Sanitizer::decodeCharReferences( $tooltip );
                        $attribs['title'] = wfMessage( 'editsectionhint' )->rawParams( $tooltip )
                                ->inLanguage( $lang )->text();
index bc6dfca..f49d46c 100644 (file)
@@ -269,11 +269,13 @@ class SkinTemplate extends Skin {
                # An ID that includes the actual body text; without categories, contentSub, ...
                $realBodyAttribs = [ 'id' => 'mw-content-text' ];
 
-               # Add a mw-content-ltr/rtl class to be able to style based on text direction
-               # when the content is different from the UI language, i.e.:
-               # not for special pages or file pages AND only when viewing
-               if ( !in_array( $title->getNamespace(), [ NS_SPECIAL, NS_FILE ] ) &&
-                       Action::getActionName( $this ) === 'view' ) {
+               # Add a mw-content-ltr/rtl class to be able to style based on text
+               # direction when the content is different from the UI language (only
+               # when viewing)
+               # Most information on special pages and file pages is in user language,
+               # rather than content language, so those will not get this
+               if ( Action::getActionName( $this ) === 'view' &&
+                       ( !$title->inNamespaces( NS_SPECIAL, NS_FILE ) || $title->isRedirect() ) ) {
                        $pageLang = $title->getPageViewLanguage();
                        $realBodyAttribs['lang'] = $pageLang->getHtmlCode();
                        $realBodyAttribs['dir'] = $pageLang->getDir();
@@ -344,7 +346,7 @@ class SkinTemplate extends Skin {
                $tpl->set( 'charset', 'UTF-8' );
                $tpl->setRef( 'wgScript', $wgScript );
                $tpl->setRef( 'skinname', $this->skinname );
-               $tpl->set( 'skinclass', get_class( $this ) );
+               $tpl->set( 'skinclass', static::class );
                $tpl->setRef( 'skin', $this );
                $tpl->setRef( 'stylename', $this->stylename );
                $tpl->set( 'printable', $out->isPrintable() );
@@ -582,7 +584,7 @@ class SkinTemplate extends Skin {
                /* set up the default links for the personal toolbar */
                $personal_urls = [];
 
-               # Due to bug 32276, if a user does not have read permissions,
+               # Due to T34276, if a user does not have read permissions,
                # $this->getTitle() will just give Special:Badtitle, which is
                # not especially useful as a returnto parameter. Use the title
                # from the request instead, if there was one.
@@ -663,7 +665,7 @@ class SkinTemplate extends Skin {
                                        'text' => $this->msg( 'pt-userlogout' )->text(),
                                        'href' => self::makeSpecialUrl( 'Userlogout',
                                                // userlogout link must always contain an & character, otherwise we might not be able
-                                               // to detect a buggy precaching proxy (bug 17790)
+                                               // to detect a buggy precaching proxy (T19790)
                                                $title->isSpecial( 'Preferences' ) ? 'noreturnto' : $returnto ),
                                        'active' => false
                                ];
@@ -720,7 +722,10 @@ class SkinTemplate extends Skin {
                        }
 
                        if ( $authManager->canAuthenticateNow() ) {
-                               $personal_urls['login'] = $login_url;
+                               $key = User::groupHasPermission( '*', 'read' )
+                                       ? 'login'
+                                       : 'login-private';
+                               $personal_urls[$key] = $login_url;
                        }
                }
 
@@ -1120,7 +1125,7 @@ class SkinTemplate extends Skin {
                        $content_navigation['namespaces']['special'] = [
                                'class' => 'selected',
                                'text' => $this->msg( 'nstab-special' )->text(),
-                               'href' => $request->getRequestURL(), // @see: bug 2457, bug 2510
+                               'href' => $request->getRequestURL(), // @see: T4457, T4510
                                'context' => 'subject'
                        ];
 
index 00439a1..09ed3c4 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Special page which uses a ChangesList to show query results.
@@ -38,6 +40,471 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        /** @var array */
        protected $customFilters;
 
+       // Order of both groups and filters is significant; first is top-most priority,
+       // descending from there.
+       // 'showHideSuffix' is a shortcut to and avoid spelling out
+       // details specific to subclasses here.
+       /**
+        * Definition information for the filters and their groups
+        *
+        * The value is $groupDefinition, a parameter to the ChangesListFilterGroup constructor.
+        * However, priority is dynamically added for the core groups, to ease maintenance.
+        *
+        * Groups are displayed to the user in the structured UI.  However, if necessary,
+        * all of the filters in a group can be configured to only display on the
+        * unstuctured UI, in which case you don't need a group title.  This is done in
+        * getFilterGroupDefinitionFromLegacyCustomFilters, for example.
+        *
+        * @var array $filterGroupDefinitions
+        */
+       private $filterGroupDefinitions;
+
+       // Same format as filterGroupDefinitions, but for a single group (reviewStatus)
+       // that is registered conditionally.
+       private $reviewStatusFilterGroupDefinition;
+
+       // Single filter registered conditionally
+       private $hideCategorizationFilterDefinition;
+
+       /**
+        * Filter groups, and their contained filters
+        * This is an associative array (with group name as key) of ChangesListFilterGroup objects.
+        *
+        * @var array $filterGroups
+        */
+       protected $filterGroups = [];
+
+       public function __construct( $name, $restriction ) {
+               parent::__construct( $name, $restriction );
+
+               $this->filterGroupDefinitions = [
+                       [
+                               'name' => 'registration',
+                               'title' => 'rcfilters-filtergroup-registration',
+                               'class' => ChangesListBooleanFilterGroup::class,
+                               'filters' => [
+                                       [
+                                               'name' => 'hideliu',
+                                               'label' => 'rcfilters-filter-registered-label',
+                                               'description' => 'rcfilters-filter-registered-description',
+                                               // rcshowhideliu-show, rcshowhideliu-hide,
+                                               // wlshowhideliu
+                                               'showHideSuffix' => 'showhideliu',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_user = 0';
+                                               },
+                                               'cssClassSuffix' => 'liu',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_user' );
+                                               },
+
+                                       ],
+                                       [
+                                               'name' => 'hideanons',
+                                               'label' => 'rcfilters-filter-unregistered-label',
+                                               'description' => 'rcfilters-filter-unregistered-description',
+                                               // rcshowhideanons-show, rcshowhideanons-hide,
+                                               // wlshowhideanons
+                                               'showHideSuffix' => 'showhideanons',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_user != 0';
+                                               },
+                                               'cssClassSuffix' => 'anon',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return !$rc->getAttribute( 'rc_user' );
+                                               },
+                                       ]
+                               ],
+                       ],
+
+                       [
+                               'name' => 'userExpLevel',
+                               'title' => 'rcfilters-filtergroup-userExpLevel',
+                               'class' => ChangesListStringOptionsFilterGroup::class,
+                               // Excludes unregistered users
+                               'isFullCoverage' => false,
+                               'filters' => [
+                                       [
+                                               'name' => 'newcomer',
+                                               'label' => 'rcfilters-filter-user-experience-level-newcomer-label',
+                                               'description' => 'rcfilters-filter-user-experience-level-newcomer-description',
+                                               'cssClassSuffix' => 'user-newcomer',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       $performer = $rc->getPerformer();
+                                                       return $performer && $performer->isLoggedIn() &&
+                                                               $performer->getExperienceLevel() === 'newcomer';
+                                               }
+                                       ],
+                                       [
+                                               'name' => 'learner',
+                                               'label' => 'rcfilters-filter-user-experience-level-learner-label',
+                                               'description' => 'rcfilters-filter-user-experience-level-learner-description',
+                                               'cssClassSuffix' => 'user-learner',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       $performer = $rc->getPerformer();
+                                                       return $performer && $performer->isLoggedIn() &&
+                                                               $performer->getExperienceLevel() === 'learner';
+                                               },
+                                       ],
+                                       [
+                                               'name' => 'experienced',
+                                               'label' => 'rcfilters-filter-user-experience-level-experienced-label',
+                                               'description' => 'rcfilters-filter-user-experience-level-experienced-description',
+                                               'cssClassSuffix' => 'user-experienced',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       $performer = $rc->getPerformer();
+                                                       return $performer && $performer->isLoggedIn() &&
+                                                               $performer->getExperienceLevel() === 'experienced';
+                                               },
+                                       ]
+                               ],
+                               'default' => ChangesListStringOptionsFilterGroup::NONE,
+                               'queryCallable' => [ $this, 'filterOnUserExperienceLevel' ],
+                       ],
+
+                       [
+                               'name' => 'authorship',
+                               'title' => 'rcfilters-filtergroup-authorship',
+                               'class' => ChangesListBooleanFilterGroup::class,
+                               'filters' => [
+                                       [
+                                               'name' => 'hidemyself',
+                                               'label' => 'rcfilters-filter-editsbyself-label',
+                                               'description' => 'rcfilters-filter-editsbyself-description',
+                                               // rcshowhidemine-show, rcshowhidemine-hide,
+                                               // wlshowhidemine
+                                               'showHideSuffix' => 'showhidemine',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $user = $ctx->getUser();
+                                                       $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() );
+                                               },
+                                               'cssClassSuffix' => 'self',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $ctx->getUser()->equals( $rc->getPerformer() );
+                                               },
+                                       ],
+                                       [
+                                               'name' => 'hidebyothers',
+                                               'label' => 'rcfilters-filter-editsbyother-label',
+                                               'description' => 'rcfilters-filter-editsbyother-description',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $user = $ctx->getUser();
+                                                       $conds[] = 'rc_user_text = ' . $dbr->addQuotes( $user->getName() );
+                                               },
+                                               'cssClassSuffix' => 'others',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return !$ctx->getUser()->equals( $rc->getPerformer() );
+                                               },
+                                       ]
+                               ]
+                       ],
+
+                       [
+                               'name' => 'automated',
+                               'title' => 'rcfilters-filtergroup-automated',
+                               'class' => ChangesListBooleanFilterGroup::class,
+                               'filters' => [
+                                       [
+                                               'name' => 'hidebots',
+                                               'label' => 'rcfilters-filter-bots-label',
+                                               'description' => 'rcfilters-filter-bots-description',
+                                               // rcshowhidebots-show, rcshowhidebots-hide,
+                                               // wlshowhidebots
+                                               'showHideSuffix' => 'showhidebots',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_bot = 0';
+                                               },
+                                               'cssClassSuffix' => 'bot',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_bot' );
+                                               },
+                                       ],
+                                       [
+                                               'name' => 'hidehumans',
+                                               'label' => 'rcfilters-filter-humans-label',
+                                               'description' => 'rcfilters-filter-humans-description',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_bot = 1';
+                                               },
+                                               'cssClassSuffix' => 'human',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return !$rc->getAttribute( 'rc_bot' );
+                                               },
+                                       ]
+                               ]
+                       ],
+
+                       // reviewStatus (conditional)
+
+                       [
+                               'name' => 'significance',
+                               'title' => 'rcfilters-filtergroup-significance',
+                               'class' => ChangesListBooleanFilterGroup::class,
+                               'priority' => -6,
+                               'filters' => [
+                                       [
+                                               'name' => 'hideminor',
+                                               'label' => 'rcfilters-filter-minor-label',
+                                               'description' => 'rcfilters-filter-minor-description',
+                                               // rcshowhideminor-show, rcshowhideminor-hide,
+                                               // wlshowhideminor
+                                               'showHideSuffix' => 'showhideminor',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_minor = 0';
+                                               },
+                                               'cssClassSuffix' => 'minor',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_minor' );
+                                               }
+                                       ],
+                                       [
+                                               'name' => 'hidemajor',
+                                               'label' => 'rcfilters-filter-major-label',
+                                               'description' => 'rcfilters-filter-major-description',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_minor = 1';
+                                               },
+                                               'cssClassSuffix' => 'major',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return !$rc->getAttribute( 'rc_minor' );
+                                               }
+                                       ]
+                               ]
+                       ],
+
+                       [
+                               'name' => 'lastRevision',
+                               'title' => 'rcfilters-filtergroup-lastRevision',
+                               'class' => ChangesListBooleanFilterGroup::class,
+                               'priority' => -7,
+                               'filters' => [
+                                       [
+                                               'name' => 'hidelastrevision',
+                                               'label' => 'rcfilters-filter-lastrevision-label',
+                                               'description' => 'rcfilters-filter-lastrevision-description',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+                                                       $conds[] = 'rc_this_oldid <> page_latest';
+                                               },
+                                               'cssClassSuffix' => 'last',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_this_oldid' ) === $rc->getAttribute( 'page_latest' );
+                                               }
+                                       ],
+                                       [
+                                               'name' => 'hidepreviousrevisions',
+                                               'label' => 'rcfilters-filter-previousrevision-label',
+                                               'description' => 'rcfilters-filter-previousrevision-description',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+                                                       $conds[] = 'rc_this_oldid = page_latest';
+                                               },
+                                               'cssClassSuffix' => 'previous',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_this_oldid' ) !== $rc->getAttribute( 'page_latest' );
+                                               }
+                                       ]
+                               ]
+                       ],
+
+                       // With extensions, there can be change types that will not be hidden by any of these.
+                       [
+                               'name' => 'changeType',
+                               'title' => 'rcfilters-filtergroup-changetype',
+                               'class' => ChangesListBooleanFilterGroup::class,
+                               'priority' => -8,
+                               'filters' => [
+                                       [
+                                               'name' => 'hidepageedits',
+                                               'label' => 'rcfilters-filter-pageedits-label',
+                                               'description' => 'rcfilters-filter-pageedits-description',
+                                               'default' => false,
+                                               'priority' => -2,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_EDIT );
+                                               },
+                                               'cssClassSuffix' => 'src-mw-edit',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_EDIT;
+                                               },
+                                       ],
+                                       [
+                                               'name' => 'hidenewpages',
+                                               'label' => 'rcfilters-filter-newpages-label',
+                                               'description' => 'rcfilters-filter-newpages-description',
+                                               'default' => false,
+                                               'priority' => -3,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_NEW );
+                                               },
+                                               'cssClassSuffix' => 'src-mw-new',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_NEW;
+                                               },
+                                       ],
+
+                                       // hidecategorization
+
+                                       [
+                                               'name' => 'hidelog',
+                                               'label' => 'rcfilters-filter-logactions-label',
+                                               'description' => 'rcfilters-filter-logactions-description',
+                                               'default' => false,
+                                               'priority' => -5,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_LOG );
+                                               },
+                                               'cssClassSuffix' => 'src-mw-log',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_LOG;
+                                               }
+                                       ],
+                               ],
+                       ],
+
+               ];
+
+               $this->reviewStatusFilterGroupDefinition = [
+                       [
+                               'name' => 'reviewStatus',
+                               'title' => 'rcfilters-filtergroup-reviewstatus',
+                               'class' => ChangesListBooleanFilterGroup::class,
+                               'priority' => -5,
+                               'filters' => [
+                                       [
+                                               'name' => 'hidepatrolled',
+                                               'label' => 'rcfilters-filter-patrolled-label',
+                                               'description' => 'rcfilters-filter-patrolled-description',
+                                               // rcshowhidepatr-show, rcshowhidepatr-hide
+                                               // wlshowhidepatr
+                                               'showHideSuffix' => 'showhidepatr',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_patrolled = 0';
+                                               },
+                                               'cssClassSuffix' => 'patrolled',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_patrolled' );
+                                               },
+                                       ],
+                                       [
+                                               'name' => 'hideunpatrolled',
+                                               'label' => 'rcfilters-filter-unpatrolled-label',
+                                               'description' => 'rcfilters-filter-unpatrolled-description',
+                                               'default' => false,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_patrolled = 1';
+                                               },
+                                               'cssClassSuffix' => 'unpatrolled',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return !$rc->getAttribute( 'rc_patrolled' );
+                                               },
+                                       ],
+                               ],
+                       ]
+               ];
+
+               $this->hideCategorizationFilterDefinition = [
+                       'name' => 'hidecategorization',
+                       'label' => 'rcfilters-filter-categorization-label',
+                       'description' => 'rcfilters-filter-categorization-description',
+                       // rcshowhidecategorization-show, rcshowhidecategorization-hide.
+                       // wlshowhidecategorization
+                       'showHideSuffix' => 'showhidecategorization',
+                       'default' => false,
+                       'priority' => -4,
+                       'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                               &$query_options, &$join_conds ) {
+
+                               $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE );
+                       },
+                       'cssClassSuffix' => 'src-mw-categorize',
+                       'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                               return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_CATEGORIZE;
+                       },
+               ];
+       }
+
+       /**
+        * Check if filters are in conflict and guaranteed to return no results.
+        *
+        * @return bool
+        */
+       protected function areFiltersInConflict() {
+               $opts = $this->getOptions();
+               /** @var ChangesListFilterGroup $group */
+               foreach ( $this->getFilterGroups() as $group ) {
+
+                       if ( $group->getConflictingGroups() ) {
+                               wfLogWarning(
+                                       $group->getName() .
+                                       " specifies conflicts with other groups but these are not supported yet."
+                               );
+                       }
+
+                       /** @var ChangesListFilter $conflictingFilter */
+                       foreach ( $group->getConflictingFilters() as $conflictingFilter ) {
+                               if ( $conflictingFilter->activelyInConflictWithGroup( $group, $opts ) ) {
+                                       return true;
+                               }
+                       }
+
+                       /** @var ChangesListFilter $filter */
+                       foreach ( $group->getFilters() as $filter ) {
+
+                               /** @var ChangesListFilter $conflictingFilter */
+                               foreach ( $filter->getConflictingFilters() as $conflictingFilter ) {
+                                       if (
+                                               $conflictingFilter->activelyInConflictWithFilter( $filter, $opts ) &&
+                                               $filter->activelyInConflictWithFilter( $conflictingFilter, $opts )
+                                       ) {
+                                               return true;
+                                       }
+                               }
+
+                       }
+
+               }
+
+               return false;
+       }
+
        /**
         * Main execution point
         *
@@ -55,6 +522,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                if ( $rows === false ) {
                        if ( !$this->including() ) {
                                $this->doHeader( $opts, 0 );
+                               $this->outputNoResults();
                                $this->getOutput()->setStatusCode( 404 );
                        }
 
@@ -74,7 +542,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        }
                }
                $batch->execute();
-
                $this->webOutput( $rows, $opts );
 
                $rows->free();
@@ -88,6 +555,17 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                }
        }
 
+       /**
+        * Add the "no results" message to the output
+        */
+       protected function outputNoResults() {
+               $this->getOutput()->addHTML(
+                       '<div class="mw-changeslist-empty">' .
+                       $this->msg( 'recentchanges-noresult' )->parse() .
+                       '</div>'
+               );
+       }
+
        /**
         * Get the database result for this special page instance. Used by ApiFeedRecentChanges.
         *
@@ -95,9 +573,15 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         */
        public function getRows() {
                $opts = $this->getOptions();
-               $conds = $this->buildMainQueryConds( $opts );
 
-               return $this->doMainQuery( $conds, $opts );
+               $tables = [];
+               $fields = [];
+               $conds = [];
+               $query_options = [];
+               $join_conds = [];
+               $this->buildQuery( $tables, $fields, $conds, $query_options, $join_conds, $opts );
+
+               return $this->doMainQuery( $tables, $fields, $conds, $query_options, $join_conds, $opts );
        }
 
        /**
@@ -114,17 +598,173 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        }
 
        /**
-        * Create a FormOptions object with options as specified by the user
+        * Register all filters and their groups (including those from hooks), plus handle
+        * conflicts and defaults.
+        *
+        * You might want to customize these in the same method, in subclasses.  You can
+        * call getFilterGroup to access a group, and (on the group) getFilter to access a
+        * filter, then make necessary modfications to the filter or group (e.g. with
+        * setDefault).
+        */
+       protected function registerFilters() {
+               $this->registerFiltersFromDefinitions( $this->filterGroupDefinitions );
+
+               // Make sure this is not being transcluded (we don't want to show this
+               // information to all users just because the user that saves the edit can
+               // patrol or is logged in)
+               if ( !$this->including() && $this->getUser()->useRCPatrol() ) {
+                       $this->registerFiltersFromDefinitions( $this->reviewStatusFilterGroupDefinition );
+               }
+
+               $changeTypeGroup = $this->getFilterGroup( 'changeType' );
+
+               if ( $this->getConfig()->get( 'RCWatchCategoryMembership' ) ) {
+                       $transformedHideCategorizationDef = $this->transformFilterDefinition(
+                               $this->hideCategorizationFilterDefinition
+                       );
+
+                       $transformedHideCategorizationDef['group'] = $changeTypeGroup;
+
+                       $hideCategorization = new ChangesListBooleanFilter(
+                               $transformedHideCategorizationDef
+                       );
+               }
+
+               Hooks::run( 'ChangesListSpecialPageStructuredFilters', [ $this ] );
+
+               $unstructuredGroupDefinition =
+                       $this->getFilterGroupDefinitionFromLegacyCustomFilters(
+                               $this->getCustomFilters()
+                       );
+               $this->registerFiltersFromDefinitions( [ $unstructuredGroupDefinition ] );
+
+               $userExperienceLevel = $this->getFilterGroup( 'userExpLevel' );
+
+               $registration = $this->getFilterGroup( 'registration' );
+               $anons = $registration->getFilter( 'hideanons' );
+
+               // This means there is a conflict between any item in user experience level
+               // being checked and only anons being *shown* (hideliu=1&hideanons=0 in the
+               // URL, or equivalent).
+               $userExperienceLevel->conflictsWith(
+                       $anons,
+                       'rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global',
+                       'rcfilters-filtergroup-user-experience-level-conflicts-unregistered',
+                       'rcfilters-filter-unregistered-conflicts-user-experience-level'
+               );
+
+               $categoryFilter = $changeTypeGroup->getFilter( 'hidecategorization' );
+               $logactionsFilter = $changeTypeGroup->getFilter( 'hidelog' );
+               $pagecreationFilter = $changeTypeGroup->getFilter( 'hidenewpages' );
+
+               $significanceTypeGroup = $this->getFilterGroup( 'significance' );
+               $hideMinorFilter = $significanceTypeGroup->getFilter( 'hideminor' );
+
+               // categoryFilter is conditional; see registerFilters
+               if ( $categoryFilter !== null ) {
+                       $hideMinorFilter->conflictsWith(
+                               $categoryFilter,
+                               'rcfilters-hideminor-conflicts-typeofchange-global',
+                               'rcfilters-hideminor-conflicts-typeofchange',
+                               'rcfilters-typeofchange-conflicts-hideminor'
+                       );
+               }
+               $hideMinorFilter->conflictsWith(
+                       $logactionsFilter,
+                       'rcfilters-hideminor-conflicts-typeofchange-global',
+                       'rcfilters-hideminor-conflicts-typeofchange',
+                       'rcfilters-typeofchange-conflicts-hideminor'
+               );
+               $hideMinorFilter->conflictsWith(
+                       $pagecreationFilter,
+                       'rcfilters-hideminor-conflicts-typeofchange-global',
+                       'rcfilters-hideminor-conflicts-typeofchange',
+                       'rcfilters-typeofchange-conflicts-hideminor'
+               );
+       }
+
+       /**
+        * Transforms filter definition to prepare it for constructor.
+        *
+        * See overrides of this method as well.
+        *
+        * @param array $filterDefinition Original filter definition
+        *
+        * @return array Transformed definition
+        */
+       protected function transformFilterDefinition( array $filterDefinition ) {
+               return $filterDefinition;
+       }
+
+       /**
+        * Register filters from a definition object
+        *
+        * Array specifying groups and their filters; see Filter and
+        * ChangesListFilterGroup constructors.
+        *
+        * There is light processing to simplify core maintenance.
+        */
+       protected function registerFiltersFromDefinitions( array $definition ) {
+               $autoFillPriority = -1;
+               foreach ( $definition as $groupDefinition ) {
+                       if ( !isset( $groupDefinition['priority'] ) ) {
+                               $groupDefinition['priority'] = $autoFillPriority;
+                       } else {
+                               // If it's explicitly specified, start over the auto-fill
+                               $autoFillPriority = $groupDefinition['priority'];
+                       }
+
+                       $autoFillPriority--;
+
+                       $className = $groupDefinition['class'];
+                       unset( $groupDefinition['class'] );
+
+                       foreach ( $groupDefinition['filters'] as &$filterDefinition ) {
+                               $filterDefinition = $this->transformFilterDefinition( $filterDefinition );
+                       }
+
+                       $this->registerFilterGroup( new $className( $groupDefinition ) );
+               }
+       }
+
+       /**
+        * Get filter group definition from legacy custom filters
+        *
+        * @param array $customFilters Custom filters from legacy hooks
+        * @return array Group definition
+        */
+       protected function getFilterGroupDefinitionFromLegacyCustomFilters( array $customFilters ) {
+               // Special internal unstructured group
+               $unstructuredGroupDefinition = [
+                       'name' => 'unstructured',
+                       'class' => ChangesListBooleanFilterGroup::class,
+                       'priority' => -1, // Won't display in structured
+                       'filters' => [],
+               ];
+
+               foreach ( $customFilters as $name => $params ) {
+                       $unstructuredGroupDefinition['filters'][] = [
+                               'name' => $name,
+                               'showHide' => $params['msg'],
+                               'default' => $params['default'],
+                       ];
+               }
+
+               return $unstructuredGroupDefinition;
+       }
+
+       /**
+        * Register all the filters, including legacy hook-driven ones.
+        * Then create a FormOptions object with options as specified by the user
         *
         * @param array $parameters
         *
         * @return FormOptions
         */
        public function setup( $parameters ) {
+               $this->registerFilters();
+
                $opts = $this->getDefaultOptions();
-               foreach ( $this->getCustomFilters() as $key => $params ) {
-                       $opts->add( $key, $params['default'] );
-               }
 
                $opts = $this->fetchOptionsFromRequest( $opts );
 
@@ -139,34 +779,33 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        }
 
        /**
-        * Get a FormOptions object containing the default options. By default returns some basic options,
-        * you might want to not call parent method and discard them, or to override default values.
+        * Get a FormOptions object containing the default options. By default, returns
+        * some basic options.  The filters listed explicitly here are overriden in this
+        * method, in subclasses, but most filters (e.g. hideminor, userExpLevel filters,
+        * and more) are structured.  Structured filters are overriden in registerFilters.
+        * not here.
         *
         * @return FormOptions
         */
        public function getDefaultOptions() {
                $config = $this->getConfig();
                $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 );
+               $structuredUI = $this->getUser()->getOption( 'rcenhancedfilters' );
+
+               // Add all filters
+               foreach ( $this->filterGroups as $filterGroup ) {
+                       // URL parameters can be per-group, like 'userExpLevel',
+                       // or per-filter, like 'hideminor'.
+                       if ( $filterGroup->isPerGroupRequestParameter() ) {
+                               $opts->add( $filterGroup->getName(), $filterGroup->getDefault() );
+                       } else {
+                               foreach ( $filterGroup->getFilters() as $filter ) {
+                                       $opts->add( $filter->getName(), $filter->getDefault( $structuredUI ) );
+                               }
+                       }
                }
-               $opts->add( 'hidepageedits', false );
-               $opts->add( 'hidenewpages', false );
-               $opts->add( 'hidelog', false );
 
-               $opts->add( 'namespace', '', FormOptions::INTNULL );
+               $opts->add( 'namespace', '', FormOptions::STRING );
                $opts->add( 'invert', false );
                $opts->add( 'associated', false );
 
@@ -174,14 +813,88 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        }
 
        /**
-        * Get custom show/hide filters
+        * Register a structured changes list filter group
+        *
+        * @param ChangesListFilterGroup $group
+        */
+       public function registerFilterGroup( ChangesListFilterGroup $group ) {
+               $groupName = $group->getName();
+
+               $this->filterGroups[$groupName] = $group;
+       }
+
+       /**
+        * Gets the currently registered filters groups
+        *
+        * @return array Associative array of ChangesListFilterGroup objects, with group name as key
+        */
+       protected function getFilterGroups() {
+               return $this->filterGroups;
+       }
+
+       /**
+        * Gets a specified ChangesListFilterGroup by name
+        *
+        * @param string $groupName Name of group
+        *
+        * @return ChangesListFilterGroup|null Group, or null if not registered
+        */
+       public function getFilterGroup( $groupName ) {
+               return isset( $this->filterGroups[$groupName] ) ?
+                       $this->filterGroups[$groupName] :
+                       null;
+       }
+
+       // Currently, this intentionally only includes filters that display
+       // in the structured UI.  This can be changed easily, though, if we want
+       // to include data on filters that use the unstructured UI.  messageKeys is a
+       // special top-level value, with the value being an array of the message keys to
+       // send to the client.
+       /**
+        * Gets structured filter information needed by JS
+        *
+        * @return array Associative array
+        * * array $return['groups'] Group data
+        * * array $return['messageKeys'] Array of message keys
+        */
+       public function getStructuredFilterJsData() {
+               $output = [
+                       'groups' => [],
+                       'messageKeys' => [],
+               ];
+
+               $context = $this->getContext();
+
+               usort( $this->filterGroups, function ( $a, $b ) {
+                       return $b->getPriority() - $a->getPriority();
+               } );
+
+               foreach ( $this->filterGroups as $groupName => $group ) {
+                       $groupOutput = $group->getJsData( $this );
+                       if ( $groupOutput !== null ) {
+                               $output['messageKeys'] = array_merge(
+                                       $output['messageKeys'],
+                                       $groupOutput['messageKeys']
+                               );
+
+                               unset( $groupOutput['messageKeys'] );
+                               $output['groups'][] = $groupOutput;
+                       }
+               }
+
+               return $output;
+       }
+
+       /**
+        * Get custom show/hide filters using deprecated ChangesListSpecialPageFilters
+        * hook.
         *
         * @return array Map of filter URL param names to properties (msg/default)
         */
        protected function getCustomFilters() {
                if ( $this->customFilters === null ) {
                        $this->customFilters = [];
-                       Hooks::run( 'ChangesListSpecialPageFilters', [ $this, &$this->customFilters ] );
+                       Hooks::run( 'ChangesListSpecialPageFilters', [ $this, &$this->customFilters ], '1.29' );
                }
 
                return $this->customFilters;
@@ -208,7 +921,37 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @param FormOptions $opts
         */
        public function parseParameters( $par, FormOptions $opts ) {
-               // nothing by default
+               $stringParameterNameSet = [];
+               $hideParameterNameSet = [];
+
+               // URL parameters can be per-group, like 'userExpLevel',
+               // or per-filter, like 'hideminor'.
+
+               foreach ( $this->filterGroups as $filterGroup ) {
+                       if ( $filterGroup->isPerGroupRequestParameter() ) {
+                               $stringParameterNameSet[$filterGroup->getName()] = true;
+                       } elseif ( $filterGroup->getType() === ChangesListBooleanFilterGroup::TYPE ) {
+                               foreach ( $filterGroup->getFilters() as $filter ) {
+                                       $hideParameterNameSet[$filter->getName()] = true;
+                               }
+                       }
+               }
+
+               $bits = preg_split( '/\s*,\s*/', trim( $par ) );
+               foreach ( $bits as $bit ) {
+                       $m = [];
+                       if ( isset( $hideParameterNameSet[$bit] ) ) {
+                               // hidefoo => hidefoo=true
+                               $opts[$bit] = true;
+                       } elseif ( isset( $hideParameterNameSet["hide$bit"] ) ) {
+                               // foo => hidefoo=false
+                               $opts["hide$bit"] = false;
+                       } elseif ( preg_match( '/^(.*)=(.*)$/', $bit, $m ) ) {
+                               if ( isset( $stringParameterNameSet[$m[1]] ) ) {
+                                       $opts[$m[1]] = $m[2];
+                               }
+                       }
+               }
        }
 
        /**
@@ -217,131 +960,168 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @param FormOptions $opts
         */
        public function validateOptions( FormOptions $opts ) {
-               // nothing by default
+               if ( $this->fixContradictoryOptions( $opts ) ) {
+                       $query = wfArrayToCgi( $this->convertParamsForLink( $opts->getChangedValues() ) );
+                       $this->getOutput()->redirect( $this->getPageTitle()->getCanonicalURL( $query ) );
+               }
        }
 
        /**
-        * Return an array of conditions depending of options set in $opts
+        * Fix invalid options by resetting pairs that should never appear together.
         *
         * @param FormOptions $opts
-        * @return array
+        * @return bool True if any option was reset
         */
-       public function buildMainQueryConds( FormOptions $opts ) {
-               $dbr = $this->getDB();
-               $user = $this->getUser();
-               $conds = [];
+       private function fixContradictoryOptions( FormOptions $opts ) {
+               $fixed = $this->fixBackwardsCompatibilityOptions( $opts );
 
-               // It makes no sense to hide both anons and logged-in users. When this occurs, try a guess on
-               // what the user meant and either show only bots or force anons to be shown.
-               $botsonly = false;
-               $hideanons = $opts['hideanons'];
-               if ( $opts['hideanons'] && $opts['hideliu'] ) {
-                       if ( $opts['hidebots'] ) {
-                               $hideanons = false;
-                       } else {
-                               $botsonly = true;
-                       }
-               }
+               foreach ( $this->filterGroups as $filterGroup ) {
+                       if ( $filterGroup instanceof ChangesListBooleanFilterGroup ) {
+                               $filters = $filterGroup->getFilters();
 
-               // Toggles
-               if ( $opts['hideminor'] ) {
-                       $conds[] = 'rc_minor = 0';
-               }
-               if ( $opts['hidemajor'] ) {
-                       $conds[] = 'rc_minor = 1';
-               }
-               if ( $opts['hidebots'] ) {
-                       $conds['rc_bot'] = 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 ( count( $filters ) === 1 ) {
+                                       // legacy boolean filters should not be considered
+                                       continue;
+                               }
+
+                               $allInGroupEnabled = array_reduce(
+                                       $filters,
+                                       function ( $carry, $filter ) use ( $opts ) {
+                                               return $carry && $opts[ $filter->getName() ];
+                                       },
+                                       /* initialValue */ count( $filters ) > 0
+                               );
+
+                               if ( $allInGroupEnabled ) {
+                                       foreach ( $filters as $filter ) {
+                                               $opts[ $filter->getName() ] = false;
+                                       }
+
+                                       $fixed = true;
+                               }
                        }
                }
-               if ( $botsonly ) {
-                       $conds['rc_bot'] = 1;
-               } else {
-                       if ( $opts['hideliu'] ) {
-                               $conds[] = 'rc_user = 0';
-                       }
-                       if ( $hideanons ) {
-                               $conds[] = 'rc_user != 0';
+
+               return $fixed;
+       }
+
+       /**
+        * Fix a special case (hideanons=1 and hideliu=1) in a special way, for backwards
+        * compatibility.
+        *
+        * This is deprecated and may be removed.
+        *
+        * @param FormOptions $opts
+        * @return bool True if this change was mode
+        */
+       private function fixBackwardsCompatibilityOptions( FormOptions $opts ) {
+               if ( $opts['hideanons'] && $opts['hideliu'] ) {
+                       $opts->reset( 'hideanons' );
+                       if ( !$opts['hidebots'] ) {
+                               $opts->reset( 'hideliu' );
+                               $opts['hidehumans'] = 1;
                        }
+
+                       return true;
                }
 
-               if ( $opts['hidemyself'] ) {
-                       if ( $user->getId() ) {
-                               $conds[] = 'rc_user != ' . $dbr->addQuotes( $user->getId() );
-                       } else {
-                               $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() );
+               return false;
+       }
+
+       /**
+        * Convert parameters values from true/false to 1/0
+        * so they are not omitted by wfArrayToCgi()
+        * Bug 36524
+        *
+        * @param array $params
+        * @return array
+        */
+       protected function convertParamsForLink( $params ) {
+               foreach ( $params as &$value ) {
+                       if ( $value === false ) {
+                               $value = '0';
                        }
                }
-               if ( $opts['hidebyothers'] ) {
-                       if ( $user->getId() ) {
-                               $conds[] = 'rc_user = ' . $dbr->addQuotes( $user->getId() );
+               unset( $value );
+               return $params;
+       }
+
+       /**
+        * Sets appropriate tables, fields, conditions, etc. depending on which filters
+        * the user requested.
+        *
+        * @param array &$tables Array of tables; see IDatabase::select $table
+        * @param array &$fields Array of fields; see IDatabase::select $vars
+        * @param array &$conds Array of conditions; see IDatabase::select $conds
+        * @param array &$query_options Array of query options; see IDatabase::select $options
+        * @param array &$join_conds Array of join conditions; see IDatabase::select $join_conds
+        * @param FormOptions $opts
+        */
+       protected function buildQuery( &$tables, &$fields, &$conds, &$query_options,
+               &$join_conds, FormOptions $opts ) {
+
+               $dbr = $this->getDB();
+               $user = $this->getUser();
+
+               $context = $this->getContext();
+               foreach ( $this->filterGroups as $filterGroup ) {
+                       // URL parameters can be per-group, like 'userExpLevel',
+                       // or per-filter, like 'hideminor'.
+                       if ( $filterGroup->isPerGroupRequestParameter() ) {
+                               $filterGroup->modifyQuery( $dbr, $this, $tables, $fields, $conds,
+                                       $query_options, $join_conds, $opts[$filterGroup->getName()] );
                        } else {
-                               $conds[] = 'rc_user_text = ' . $dbr->addQuotes( $user->getName() );
+                               foreach ( $filterGroup->getFilters() as $filter ) {
+                                       if ( $opts[$filter->getName()] ) {
+                                               $filter->modifyQuery( $dbr, $this, $tables, $fields, $conds,
+                                                       $query_options, $join_conds );
+                                       }
+                               }
                        }
                }
 
-               if ( $this->getConfig()->get( 'RCWatchCategoryMembership' )
-                       && $opts['hidecategorization'] === true
-               ) {
-                       $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'] !== '' ) {
-                       $selectedNS = $dbr->addQuotes( $opts['namespace'] );
-                       $operator = $opts['invert'] ? '!=' : '=';
-                       $boolean = $opts['invert'] ? 'AND' : 'OR';
-
-                       // Namespace association (bug 2429)
-                       if ( !$opts['associated'] ) {
-                               $condition = "rc_namespace $operator $selectedNS";
-                       } else {
-                               // Also add the associated namespace
-                               $associatedNS = $dbr->addQuotes(
-                                       MWNamespace::getAssociated( $opts['namespace'] )
+               if ( $opts[ 'namespace' ] !== '' ) {
+                       $namespaces = explode( ';', $opts[ 'namespace' ] );
+
+                       if ( $opts[ 'associated' ] ) {
+                               $associatedNamespaces = array_map(
+                                       function ( $ns ) {
+                                               return MWNamespace::getAssociated( $ns );
+                                       },
+                                       $namespaces
                                );
-                               $condition = "(rc_namespace $operator $selectedNS "
-                                       . $boolean
-                                       . " rc_namespace $operator $associatedNS)";
+                               $namespaces = array_unique( array_merge( $namespaces, $associatedNamespaces ) );
                        }
 
-                       $conds[] = $condition;
+                       if ( count( $namespaces ) === 1 ) {
+                               $operator = $opts[ 'invert' ] ? '!=' : '=';
+                               $value = $dbr->addQuotes( reset( $namespaces ) );
+                       } else {
+                               $operator = $opts[ 'invert' ] ? 'NOT IN' : 'IN';
+                               sort( $namespaces );
+                               $value = '(' . $dbr->makeList( $namespaces ) . ')';
+                       }
+                       $conds[] = "rc_namespace $operator $value";
                }
-
-               return $conds;
        }
 
        /**
         * Process the query
         *
-        * @param array $conds
+        * @param array $tables Array of tables; see IDatabase::select $table
+        * @param array $fields Array of fields; see IDatabase::select $vars
+        * @param array $conds Array of conditions; see IDatabase::select $conds
+        * @param array $query_options Array of query options; see IDatabase::select $options
+        * @param array $join_conds Array of join conditions; see IDatabase::select $join_conds
         * @param FormOptions $opts
         * @return bool|ResultWrapper Result or false
         */
-       public function doMainQuery( $conds, $opts ) {
-               $tables = [ 'recentchanges' ];
-               $fields = RecentChange::selectFields();
-               $query_options = [];
-               $join_conds = [];
+       protected function doMainQuery( $tables, $fields, $conds,
+               $query_options, $join_conds, FormOptions $opts ) {
+
+               $tables[] = 'recentchanges';
+               $fields = array_merge( RecentChange::selectFields(), $fields );
 
                ChangeTags::modifyDisplayQuery(
                        $tables,
@@ -455,7 +1235,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        /**
         * Get options to be displayed in a form
         * @todo This should handle options returned by getDefaultOptions().
-        * @todo Not called by anything, should be called by something… doHeader() maybe?
+        * @todo Not called by anything in this class (but is in subclasses), should be
+        * called by something… doHeader() maybe?
         *
         * @param FormOptions $opts
         * @return array
@@ -532,21 +1313,83 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        }
 
        /**
-        * 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.
+        * Filter on users' experience levels; this will not be called if nothing is
+        * selected.
         *
-        * @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)
+        * @param string $specialPageClassName Class name of current special page
+        * @param IContextSource $context Context, for e.g. user
+        * @param IDatabase $dbr Database, for addQuotes, makeList, and similar
+        * @param array &$tables Array of tables; see IDatabase::select $table
+        * @param array &$fields Array of fields; see IDatabase::select $vars
+        * @param array &$conds Array of conditions; see IDatabase::select $conds
+        * @param array &$query_options Array of query options; see IDatabase::select $options
+        * @param array &$join_conds Array of join conditions; see IDatabase::select $join_conds
+        * @param array $selectedExpLevels The allowed active values, sorted
+        * @param int $now Number of seconds since the UNIX epoch, or 0 if not given
+        *   (optional)
         */
-       protected function getRenderableCustomFilters( $allFilters ) {
-               return array_filter(
-                       $allFilters,
-                       function( $filter ) {
-                               return isset( $filter['msg'] ) && ( $filter['msg'] !== false );
-                       }
+       public function filterOnUserExperienceLevel( $specialPageClassName, $context, $dbr,
+               &$tables, &$fields, &$conds, &$query_options, &$join_conds, $selectedExpLevels, $now = 0 ) {
+
+               global $wgLearnerEdits,
+                       $wgExperiencedUserEdits,
+                       $wgLearnerMemberSince,
+                       $wgExperiencedUserMemberSince;
+
+               $LEVEL_COUNT = 3;
+
+               // If all levels are selected, all logged-in users are included (but no
+               // anons), so we can short-circuit.
+               if ( count( $selectedExpLevels ) === $LEVEL_COUNT ) {
+                       $conds[] = 'rc_user != 0';
+                       return;
+               }
+
+               $tables[] = 'user';
+               $join_conds['user'] = [ 'LEFT JOIN', 'rc_user = user_id' ];
+
+               if ( $now === 0 ) {
+                       $now = time();
+               }
+               $secondsPerDay = 86400;
+               $learnerCutoff = $now - $wgLearnerMemberSince * $secondsPerDay;
+               $experiencedUserCutoff = $now - $wgExperiencedUserMemberSince * $secondsPerDay;
+
+               $aboveNewcomer = $dbr->makeList(
+                       [
+                               'user_editcount >= ' . intval( $wgLearnerEdits ),
+                               'user_registration <= ' . $dbr->addQuotes( $dbr->timestamp( $learnerCutoff ) ),
+                       ],
+                       IDatabase::LIST_AND
+               );
+
+               $aboveLearner = $dbr->makeList(
+                       [
+                               'user_editcount >= ' . intval( $wgExperiencedUserEdits ),
+                               'user_registration <= ' .
+                                       $dbr->addQuotes( $dbr->timestamp( $experiencedUserCutoff ) ),
+                       ],
+                       IDatabase::LIST_AND
                );
+
+               if ( $selectedExpLevels === [ 'newcomer' ] ) {
+                       $conds[] = "NOT ( $aboveNewcomer )";
+               } elseif ( $selectedExpLevels === [ 'learner' ] ) {
+                       $conds[] = $dbr->makeList(
+                               [ $aboveNewcomer, "NOT ( $aboveLearner )" ],
+                               IDatabase::LIST_AND
+                       );
+               } elseif ( $selectedExpLevels === [ 'experienced' ] ) {
+                       $conds[] = $aboveLearner;
+               } elseif ( $selectedExpLevels === [ 'learner', 'newcomer' ] ) {
+                       $conds[] = "NOT ( $aboveLearner )";
+               } elseif ( $selectedExpLevels === [ 'experienced', 'newcomer' ] ) {
+                       $conds[] = $dbr->makeList(
+                               [ "NOT ( $aboveNewcomer )", $aboveLearner ],
+                               IDatabase::LIST_OR
+                       );
+               } elseif ( $selectedExpLevels === [ 'experienced', 'learner' ] ) {
+                       $conds[] = $aboveNewcomer;
+               }
        }
 }
index c4e53ee..59abefd 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Variant of QueryPage which uses a gallery to output results, thus
  * suited for reports generating images
index c3ee321..5c048a2 100644 (file)
@@ -177,7 +177,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
 
                # 1. When switching accounts, it sucks to get automatically logged out
                # 2. Do not return to PasswordReset after a successful password change
-               #    but goto Wiki start page (Main_Page) instead ( bug 33997 )
+               #    but goto Wiki start page (Main_Page) instead ( T35997 )
                $returnToTitle = Title::newFromText( $this->mReturnTo );
                if ( is_object( $returnToTitle )
                        && ( $returnToTitle->isSpecial( 'Userlogout' )
@@ -702,7 +702,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
         */
        protected function getFakeTemplate( $msg, $msgType ) {
                global $wgAuth, $wgEnableEmail, $wgHiddenPrefs, $wgEmailConfirmToEdit, $wgEnableUserEmail,
-                          $wgSecureLogin, $wgPasswordResetRoutes;
+                       $wgSecureLogin, $wgPasswordResetRoutes;
 
                // make a best effort to get the value of fields which used to be fixed in the old login
                // template but now might or might not exist depending on what providers are used
@@ -727,7 +727,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $user = $this->getUser();
                $template = new FakeAuthTemplate();
 
-               // Pre-fill username (if not creating an account, bug 44775).
+               // Pre-fill username (if not creating an account, T46775).
                if ( $data->mUsername == '' && $this->isSignup() ) {
                        if ( $user->isLoggedIn() ) {
                                $data->mUsername = $user->getName();
@@ -772,7 +772,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $resetLink = $this->isSignup()
                        ? null
                        : is_array( $wgPasswordResetRoutes )
-                         && in_array( true, array_values( $wgPasswordResetRoutes ), true );
+                               && in_array( true, array_values( $wgPasswordResetRoutes ), true );
 
                $template->set( 'header', '' );
                $template->set( 'formheader', '' );
index 3bb3f85..76b1535 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Variant of QueryPage which formats the result as a simple link to the page
  *
index 3592500..93873c0 100644 (file)
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBError;
+
 /**
  * This is a class for doing query pages; since they're almost all the same,
  * we factor out some of the functionality into a superclass, and let
@@ -302,7 +306,7 @@ abstract class QueryPage extends SpecialPage {
                        return 0;
                }
 
-               $fname = get_class( $this ) . '::recache';
+               $fname = static::class . '::recache';
                $dbw = wfGetDB( DB_MASTER );
                if ( !$dbw ) {
                        return false;
@@ -322,7 +326,7 @@ abstract class QueryPage extends SpecialPage {
                                                        $value = wfTimestamp( TS_UNIX,
                                                                $row->value );
                                                } else {
-                                                       $value = intval( $row->value ); // @bug 14414
+                                                       $value = intval( $row->value ); // T16414
                                                }
                                        } else {
                                                $value = 0;
@@ -387,7 +391,7 @@ abstract class QueryPage extends SpecialPage {
         * @since 1.18
         */
        public function reallyDoQuery( $limit, $offset = false ) {
-               $fname = get_class( $this ) . "::reallyDoQuery";
+               $fname = static::class . '::reallyDoQuery';
                $dbr = $this->getRecacheDB();
                $query = $this->getQueryInfo();
                $order = $this->getOrderFields();
@@ -405,7 +409,7 @@ abstract class QueryPage extends SpecialPage {
                        $options = isset( $query['options'] ) ? (array)$query['options'] : [];
                        $join_conds = isset( $query['join_conds'] ) ? (array)$query['join_conds'] : [];
 
-                       if ( count( $order ) ) {
+                       if ( $order ) {
                                $options['ORDER BY'] = $order;
                        }
 
@@ -455,30 +459,50 @@ abstract class QueryPage extends SpecialPage {
        public function fetchFromCache( $limit, $offset = false ) {
                $dbr = wfGetDB( DB_REPLICA );
                $options = [];
+
                if ( $limit !== false ) {
                        $options['LIMIT'] = intval( $limit );
                }
+
                if ( $offset !== false ) {
                        $options['OFFSET'] = intval( $offset );
                }
+
+               $order = $this->getCacheOrderFields();
                if ( $this->sortDescending() ) {
-                       $options['ORDER BY'] = 'qc_value DESC';
-               } else {
-                       $options['ORDER BY'] = 'qc_value ASC';
+                       foreach ( $order as &$field ) {
+                               $field .= " DESC";
+                       }
+               }
+               if ( $order ) {
+                       $options['ORDER BY'] = $order;
                }
-               return $dbr->select( 'querycache', [ 'qc_type',
+
+               return $dbr->select( 'querycache',
+                               [ 'qc_type',
                                'namespace' => 'qc_namespace',
                                'title' => 'qc_title',
                                'value' => 'qc_value' ],
                                [ 'qc_type' => $this->getName() ],
-                               __METHOD__, $options
+                               __METHOD__,
+                               $options
                );
        }
 
+       /**
+        * Return the order fields for fetchFromCache. Default is to always use
+        * "ORDER BY value" which was the default prior to this function.
+        * @return array
+        * @since 1.29
+        */
+       function getCacheOrderFields() {
+               return [ 'value' ];
+       }
+
        public function getCachedTimestamp() {
                if ( is_null( $this->cachedTimestamp ) ) {
                        $dbr = wfGetDB( DB_REPLICA );
-                       $fname = get_class( $this ) . '::getCachedTimestamp';
+                       $fname = static::class . '::getCachedTimestamp';
                        $this->cachedTimestamp = $dbr->selectField( 'querycache_info', 'qci_timestamp',
                                [ 'qci_type' => $this->getName() ], $fname );
                }
index ea7d783..9b5d5f4 100644 (file)
@@ -41,7 +41,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
                $query = $this->getRedirectQuery();
                // Redirect to a page title with possible query parameters
                if ( $redirect instanceof Title ) {
-                       $url = $redirect->getFullURL( $query );
+                       $url = $redirect->getFullUrlForRedirect( $query );
                        $this->getOutput()->redirect( $url );
 
                        return $redirect;
@@ -52,7 +52,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
 
                        return $redirect;
                } else {
-                       $class = get_class( $this );
+                       $class = static::class;
                        throw new MWException( "RedirectSpecialPage $class doesn't redirect!" );
                }
        }
index daabded..84d3b08 100644 (file)
@@ -96,6 +96,7 @@ class SpecialPageFactory {
                'Block' => 'SpecialBlock',
                'Unblock' => 'SpecialUnblock',
                'BlockList' => 'SpecialBlockList',
+               'AutoblockList' => 'SpecialAutoblockList',
                'ChangePassword' => 'SpecialChangePassword',
                'BotPasswords' => 'SpecialBotPasswords',
                'PasswordReset' => 'SpecialPasswordReset',
@@ -144,6 +145,7 @@ class SpecialPageFactory {
                'RandomInCategory' => 'SpecialRandomInCategory',
                'Randomredirect' => 'SpecialRandomredirect',
                'Randomrootpage' => 'SpecialRandomrootpage',
+               'GoToInterwiki' => 'SpecialGoToInterwiki',
 
                // High use pages
                'Mostlinkedcategories' => 'MostlinkedCategoriesPage',
@@ -346,7 +348,7 @@ class SpecialPageFactory {
                        return [ null, null ];
                }
 
-               if ( !isset( $bits[1] ) ) { // bug 2087
+               if ( !isset( $bits[1] ) ) { // T4087
                        $par = null;
                } else {
                        $par = $bits[1];
@@ -504,7 +506,7 @@ class SpecialPageFactory {
         * @param bool $including Bool output is being captured for use in {{special:whatever}}
         * @param LinkRenderer|null $linkRenderer (since 1.28)
         *
-        * @return bool
+        * @return bool|Title
         */
        public static function executePath( Title &$title, IContextSource &$context, $including = false,
                LinkRenderer $linkRenderer = null
@@ -512,7 +514,7 @@ class SpecialPageFactory {
                // @todo FIXME: Redirects broken due to this call
                $bits = explode( '/', $title->getDBkey(), 2 );
                $name = $bits[0];
-               if ( !isset( $bits[1] ) ) { // bug 2087
+               if ( !isset( $bits[1] ) ) { // T4087
                        $par = null;
                } else {
                        $par = $bits[1];
index 00fca12..d788f2b 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Class definition for a wanted query page like
  * WantedPages, WantedTemplates, etc
@@ -117,4 +120,37 @@ abstract class WantedQueryPage extends QueryPage {
                $label = $this->msg( 'nlinks' )->numParams( $result->value )->escaped();
                return Linker::link( $wlh, $label );
        }
+
+       /**
+        * Order by title for pages with the same number of links to them
+        *
+        * @return array
+        * @since 1.29
+        */
+       function getOrderFields() {
+               return [ 'value DESC', 'namespace', 'title' ];
+       }
+
+       /**
+        * Do not order descending for all order fields.  We will use DESC only on one field, see
+        * getOrderFields above. This overwrites sortDescending from QueryPage::getOrderFields().
+        * Do NOT change this to true unless you remove the phrase DESC in getOrderFiels above.
+        * If you do a database error will be thrown due to double adding DESC to query!
+        *
+        * @return bool
+        * @since 1.29
+        */
+       function sortDescending() {
+               return false;
+       }
+
+       /**
+        * Also use the order fields returned by getOrderFields when fetching from the cache.
+        * @return array
+        * @since 1.29
+        */
+       function getCacheOrderFields() {
+               return $this->getOrderFields();
+       }
+
 }
index 49ca9f4..4056709 100644 (file)
@@ -67,8 +67,6 @@ class SpecialAllMessages extends SpecialPage {
                        wfGetLangObj( $request->getVal( 'lang', $par ) )
                );
 
-               $this->langcode = $this->table->lang->getCode();
-
                $out->addHTML( $this->table->buildForm() );
                $out->addParserOutputContent( $this->table->getFullOutput() );
        }
index 4b8446a..17f6cca 100644 (file)
@@ -69,7 +69,11 @@ class SpecialAllPages extends IncludableSpecialPage {
                $from = $request->getVal( 'from', null );
                $to = $request->getVal( 'to', null );
                $namespace = $request->getInt( 'namespace' );
-               $hideredirects = $request->getBool( 'hideredirects', false );
+
+               $miserMode = (bool)$this->getConfig()->get( 'MiserMode' );
+
+               // Redirects filter is disabled in MiserMode
+               $hideredirects = $request->getBool( 'hideredirects', false ) && !$miserMode;
 
                $namespaces = $this->getLanguage()->getNamespaces();
 
@@ -100,6 +104,7 @@ class SpecialAllPages extends IncludableSpecialPage {
        protected function outputHTMLForm( $namespace = NS_MAIN,
                $from = '', $to = '', $hideRedirects = false
        ) {
+               $miserMode = (bool)$this->getConfig()->get( 'MiserMode' );
                $fields = [
                        'from' => [
                                'type' => 'text',
@@ -133,6 +138,11 @@ class SpecialAllPages extends IncludableSpecialPage {
                                'value' => $hideRedirects,
                        ],
                ];
+
+               if ( $miserMode ) {
+                       unset( $fields['hideredirects'] );
+               }
+
                $form = HTMLForm::factory( 'table', $fields, $this->getContext() );
                $form->setMethod( 'get' )
                        ->setWrapperLegendMsg( 'allpages' )
diff --git a/includes/specials/SpecialAutoblockList.php b/includes/specials/SpecialAutoblockList.php
new file mode 100644 (file)
index 0000000..dcb2444
--- /dev/null
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Implements Special:AutoblockList
+ *
+ * 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 SpecialPage
+ */
+
+/**
+ * A special page that lists autoblocks
+ *
+ * @since 1.29
+ * @ingroup SpecialPage
+ */
+class SpecialAutoblockList extends SpecialPage {
+
+       function __construct() {
+               parent::__construct( 'AutoblockList' );
+       }
+
+       /**
+        * Main execution point
+        *
+        * @param string $par Title fragment
+        */
+       public function execute( $par ) {
+               $this->setHeaders();
+               $this->outputHeader();
+               $out = $this->getOutput();
+               $lang = $this->getLanguage();
+               $out->setPageTitle( $this->msg( 'autoblocklist' ) );
+               $this->addHelpLink( 'Autoblock' );
+               $out->addModuleStyles( [ 'mediawiki.special' ] );
+
+               # setup BlockListPager here to get the actual default Limit
+               $pager = $this->getBlockListPager();
+
+               # Just show the block list
+               $fields = [
+                       'Limit' => [
+                               'type' => 'limitselect',
+                               'label-message' => 'table_pager_limit_label',
+                               'options' => [
+                                       $lang->formatNum( 20 ) => 20,
+                                       $lang->formatNum( 50 ) => 50,
+                                       $lang->formatNum( 100 ) => 100,
+                                       $lang->formatNum( 250 ) => 250,
+                                       $lang->formatNum( 500 ) => 500,
+                               ],
+                               'name' => 'limit',
+                               'default' => $pager->getLimit(),
+                       ]
+               ];
+
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getPageTitle() ); // Remove subpage
+               $form = HTMLForm::factory( 'ooui', $fields, $context );
+               $form->setMethod( 'get' )
+                       ->setFormIdentifier( 'blocklist' )
+                       ->setWrapperLegendMsg( 'autoblocklist-legend' )
+                       ->setSubmitTextMsg( 'autoblocklist-submit' )
+                       ->setSubmitProgressive()
+                       ->prepareForm()
+                       ->displayForm( false );
+
+               $this->showList( $pager );
+       }
+
+       /**
+        * Setup a new BlockListPager instance.
+        * @return BlockListPager
+        */
+       protected function getBlockListPager() {
+               $conds = [
+                       'ipb_parent_block_id IS NOT NULL'
+               ];
+               # Is the user allowed to see hidden blocks?
+               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+                       $conds['ipb_deleted'] = 0;
+               }
+
+               return new BlockListPager( $this, $conds );
+       }
+
+       /**
+        * Show the list of blocked accounts matching the actual filter.
+        * @param BlockListPager $pager The BlockListPager instance for this page
+        */
+       protected function showList( BlockListPager $pager ) {
+               $out = $this->getOutput();
+
+               # Check for other blocks, i.e. global/tor blocks
+               $otherAutoblockLink = [];
+               Hooks::run( 'OtherAutoblockLogLink', [ &$otherAutoblockLink ] );
+
+               # Show additional header for the local block only when other blocks exists.
+               # Not necessary in a standard installation without such extensions enabled
+               if ( count( $otherAutoblockLink ) ) {
+                       $out->addHTML(
+                               Html::element( 'h2', [], $this->msg( 'autoblocklist-localblocks',
+                                       $pager->getNumRows() )->parse() )
+                               . "\n"
+                       );
+               }
+
+               if ( $pager->getNumRows() ) {
+                       $out->addParserOutputContent( $pager->getFullOutput() );
+               } else {
+                       $out->addWikiMsg( 'autoblocklist-empty' );
+               }
+
+               if ( count( $otherAutoblockLink ) ) {
+                       $out->addHTML(
+                               Html::rawElement(
+                                       'h2',
+                                       [],
+                                       $this->msg( 'autoblocklist-otherblocks', count( $otherAutoblockLink ) )->parse()
+                               ) . "\n"
+                       );
+                       $list = '';
+                       foreach ( $otherAutoblockLink as $link ) {
+                               $list .= Html::rawElement( 'li', [], $link ) . "\n";
+                       }
+                       $out->addHTML(
+                               Html::rawElement(
+                                       'ul',
+                                       [ 'class' => 'mw-autoblocklist-otherblocks' ],
+                                       $list
+                               ) . "\n"
+                       );
+               }
+       }
+
+       protected function getGroupName() {
+               return 'users';
+       }
+}
index c18ae0e..04c04b2 100644 (file)
@@ -64,7 +64,7 @@ class SpecialBlock extends FormSpecialPage {
        protected function checkExecutePermissions( User $user ) {
                parent::checkExecutePermissions( $user );
 
-               # bug 15810: blocked admins should have limited access here
+               # T17810: blocked admins should have limited access here
                $status = self::checkUnblockSelf( $this->target, $user );
                if ( $status !== true ) {
                        throw new ErrorPageError( 'badaccess', $status );
@@ -275,7 +275,7 @@ class SpecialBlock extends FormSpecialPage {
                        }
 
                        // If the username was hidden (ipb_deleted == 1), don't show the reason
-                       // unless this user also has rights to hideuser: Bug 35839
+                       // unless this user also has rights to hideuser: T37839
                        if ( !$block->mHideName || $this->getUser()->isAllowed( 'hideuser' ) ) {
                                $fields['Reason']['default'] = $block->mReason;
                        } else {
@@ -744,7 +744,7 @@ class SpecialBlock extends FormSpecialPage {
                        $blockNotConfirmed = !$data['Confirm'] || ( array_key_exists( 'PreviousTarget', $data )
                                && $data['PreviousTarget'] !== $target );
 
-                       # Special case for API - bug 32434
+                       # Special case for API - T34434
                        $reblockNotAllowed = ( array_key_exists( 'Reblock', $data ) && !$data['Reblock'] );
 
                        # Show form unless the user is already aware of this...
@@ -824,7 +824,7 @@ class SpecialBlock extends FormSpecialPage {
                $logEntry->setComment( $data['Reason'][0] );
                $logEntry->setPerformer( $performer );
                $logEntry->setParameters( $logParams );
-               # Relate log ID to block IDs (bug 25763)
+               # Relate log ID to block IDs (T27763)
                $blockIds = array_merge( [ $status['id'] ], $status['autoIds'] );
                $logEntry->setRelations( [ 'ipb_id' => $blockIds ] );
                $logId = $logEntry->insert();
@@ -902,7 +902,7 @@ class SpecialBlock extends FormSpecialPage {
        }
 
        /**
-        * bug 15810: blocked admins should not be able to block/unblock
+        * T17810: blocked admins should not be able to block/unblock
         * others, and probably shouldn't be able to unblock themselves
         * either.
         * @param User|int|string $user
index b730ecd..cd9345d 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A special page listing redirects to non existent page. Those should be
  * fixed to point to an existing page.
index b81ca3d..970a2e2 100644 (file)
@@ -126,7 +126,27 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage {
                if ( !static::$loadUserData ) {
                        return [];
                } else {
-                       return parent::getAuthFormDescriptor( $requests, $action );
+                       $descriptor = parent::getAuthFormDescriptor( $requests, $action );
+
+                       $any = false;
+                       foreach ( $descriptor as &$field ) {
+                               if ( $field['type'] === 'password' && $field['name'] !== 'retype' ) {
+                                       $any = true;
+                                       if ( isset( $field['cssclass'] ) ) {
+                                               $field['cssclass'] .= ' mw-changecredentials-validate-password';
+                                       } else {
+                                               $field['cssclass'] = 'mw-changecredentials-validate-password';
+                                       }
+                               }
+                       }
+
+                       if ( $any ) {
+                               $this->getOutput()->addModules( [
+                                       'mediawiki.special.changecredentials.js'
+                               ] );
+                       }
+
+                       return $descriptor;
                }
        }
 
@@ -238,7 +258,7 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage {
                }
 
                $title = Title::newFromText( $returnTo );
-               return $title->getFullURL( $returnToQuery );
+               return $title->getFullUrlForRedirect( $returnToQuery );
        }
 
        protected function getRequestBlacklist() {
index 785447f..eb98fe7 100644 (file)
@@ -136,7 +136,7 @@ class SpecialChangeEmail extends FormSpecialPage {
                $query = $request->getVal( 'returntoquery' );
 
                if ( $this->status->value === true ) {
-                       $this->getOutput()->redirect( $titleObj->getFullURL( $query ) );
+                       $this->getOutput()->redirect( $titleObj->getFullUrlForRedirect( $query ) );
                } elseif ( $this->status->value === 'eauth' ) {
                        # Notify user that a confirmation email has been sent...
                        $this->getOutput()->wrapWikiMsg( "<div class='error' style='clear: both;'>\n$1\n</div>",
index 766de1b..167a025 100644 (file)
@@ -359,7 +359,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                [ 'page' => $userpage->getPrefixedText() ]
                        );
 
-                       # Suppression log link (bug 59120)
+                       # Suppression log link (T61120)
                        if ( $sp->getUser()->isAllowed( 'suppressionlog' ) ) {
                                $tools['log-suppression'] = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Log', 'suppress' ),
@@ -395,7 +395,7 @@ class SpecialContributions extends IncludableSpecialPage {
                if ( $userrightsPage->userCanChangeRights( $target ) ) {
                        $tools['userrights'] = $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Userrights', $username ),
-                               $sp->msg( 'sp-contributions-userrights' )->text()
+                               $sp->msg( 'sp-contributions-userrights', $username )->text()
                        );
                }
 
index 9140bf1..d7e99db 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A special page listing redirects to redirecting page.
  * The software will automatically not follow double redirects, to prevent loops.
@@ -75,7 +78,7 @@ class DoubleRedirectsPage extends QueryPage {
                        'conds' => [
                                'ra.rd_from = pa.page_id',
 
-                               // Filter out redirects where the target goes interwiki (bug 40353).
+                               // Filter out redirects where the target goes interwiki (T42353).
                                // This isn't an optimization, it is required for correct results,
                                // otherwise a non-double redirect like Bar -> w:Foo will show up
                                // like "Bar -> Foo -> w:Foo".
index b447271..e1ecfe8 100644 (file)
@@ -793,7 +793,7 @@ class EditWatchlistCheckboxSeriesField extends HTMLMultiSelectField {
         * HTMLMultiSelectField throws validation errors if we get input data
         * that doesn't match the data set in the form setup. This causes
         * problems if something gets removed from the watchlist while the
-        * form is open (bug 32126), but we know that invalid items will
+        * form is open (T34126), but we know that invalid items will
         * be harmless so we can override it here.
         *
         * @param string $value The value the field was submitted with
index 085b68d..830b438 100644 (file)
@@ -231,14 +231,15 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        return 'usermaildisabled';
                }
 
-               if ( !$user->isAllowed( 'sendemail' ) ) {
-                       return 'badaccess';
-               }
-
+               // Run this before $user->isAllowed, to show appropriate message to anons (T160309)
                if ( !$user->isEmailConfirmed() ) {
                        return 'mailnologin';
                }
 
+               if ( !$user->isAllowed( 'sendemail' ) ) {
+                       return 'badaccess';
+               }
+
                if ( $user->isBlockedFromEmailuser() ) {
                        wfDebug( "User is blocked from sending e-mail.\n" );
 
@@ -288,7 +289,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                                'text',
                                [
                                        'id' => 'emailusertarget',
-                                       'class' => 'mw-autocomplete-user',  // used by mediawiki.userSuggest
+                                       'class' => 'mw-autocomplete-user', // used by mediawiki.userSuggest
                                        'autofocus' => true,
                                        'size' => 30,
                                ]
index ca0d139..560d75a 100644 (file)
@@ -263,7 +263,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        $user = $this->getUser();
 
                        // To prevent cross-site scripting attacks, don't show the preview if raw HTML is
-                       // allowed and a valid edit token is not provided (bug 71111). However, MediaWiki
+                       // allowed and a valid edit token is not provided (T73111). However, MediaWiki
                        // does not currently provide logged-out users with CSRF protection; in that case,
                        // do not show the preview unless anonymous editing is allowed.
                        if ( $user->isAnon() && !$user->isAllowed( 'edit' ) ) {
index 2d6ba4a..f5e9e49 100644 (file)
@@ -361,7 +361,7 @@ class SpecialExport extends SpecialPage {
 
                        $pages = array_keys( $pageSet );
 
-                       // Normalize titles to the same format and remove dupes, see bug 17374
+                       // Normalize titles to the same format and remove dupes, see T19374
                        foreach ( $pages as $k => $v ) {
                                $pages[$k] = str_replace( " ", "_", $v );
                        }
@@ -394,7 +394,7 @@ class SpecialExport extends SpecialPage {
                        $exporter->allPages();
                } else {
                        foreach ( $pages as $page ) {
-                               # Bug 8824: Only export pages the user can read
+                               # T10824: Only export pages the user can read
                                $title = Title::newFromText( $page );
                                if ( is_null( $title ) ) {
                                        // @todo Perhaps output an <error> tag or something.
diff --git a/includes/specials/SpecialGoToInterwiki.php b/includes/specials/SpecialGoToInterwiki.php
new file mode 100644 (file)
index 0000000..809a14a
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Implements Special:GoToInterwiki
+ *
+ * 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 SpecialPage
+ */
+
+/**
+ * Landing page for non-local interwiki links.
+ *
+ * Meant to warn people that the site they're visiting
+ * is not the local wiki (In case of phishing tricks).
+ * Only meant to be used for things that directly
+ * redirect from url (e.g. Special:Search/google:foo )
+ * Not meant for general interwiki linking (e.g.
+ * [[google:foo]] should still directly link)
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialGoToInterwiki extends UnlistedSpecialPage {
+       public function __construct( $name = 'GoToInterwiki' ) {
+               parent::__construct( $name );
+       }
+
+       public function execute( $par ) {
+               $this->setHeaders();
+               $target = Title::newFromText( $par );
+               // Disallow special pages as a precaution against
+               // possible redirect loops.
+               if ( !$target || $target->isSpecialPage() ) {
+                       $this->getOutput()->setStatusCode( 404 );
+                       $this->getOutput()->addWikiMsg( 'gotointerwiki-invalid' );
+                       return;
+               }
+
+               $url = $target->getFullURL();
+               if ( !$target->isExternal() || $target->isLocal() ) {
+                       // Either a normal page, or a local interwiki.
+                       // just redirect.
+                       $this->getOutput()->redirect( $url, '301' );
+               } else {
+                       $this->getOutput()->addWikiMsg(
+                               'gotointerwiki-external',
+                               $url,
+                               $target->getFullText()
+                       );
+               }
+       }
+
+       /**
+        * @return bool
+        */
+       public function requiresWrite() {
+               return false;
+       }
+
+       /**
+        * @return String
+        */
+       protected function getGroupName() {
+               return 'redirects';
+       }
+}
index dc6a619..17c64c8 100644 (file)
@@ -134,14 +134,26 @@ class SpecialJavaScriptTest extends SpecialPage {
                // Catch exceptions (such as "dependency missing" or "unknown module") so that we
                // always start QUnit. Re-throw so that they are caught and reported as global exceptions
                // by QUnit and Karma.
-               $code .= '(function () {'
-                       . 'var start = window.__karma__ ? window.__karma__.start : QUnit.start;'
-                       . 'try {'
-                       . 'mw.loader.using( ' . Xml::encodeJsVar( $modules ) . ' )'
-                       . '.always( start )'
-                       . '.fail( function ( e ) { throw e; } );'
-                       . '} catch ( e ) { start(); throw e; }'
-                       . '}());';
+               $modules = Xml::encodeJsVar( $modules );
+               $code .= <<<CODE
+(function () {
+       var start = window.__karma__ ? window.__karma__.start : QUnit.start;
+       try {
+               mw.loader.using( $modules )
+                       .always( function () {
+                               start();
+                       } )
+                       .fail( function ( e ) {
+                               setTimeout( function () {
+                                       throw e;
+                               } );
+                       } );
+       } catch ( e ) {
+               start();
+               throw e;
+       }
+}());
+CODE;
 
                header( 'Content-Type: text/javascript; charset=utf-8' );
                header( 'Cache-Control: private, no-cache, must-revalidate' );
index a2fa844..dae6074 100644 (file)
@@ -22,6 +22,9 @@
  * @author Brion Vibber
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Special:LinkSearch to search the external-links table.
  * @ingroup SpecialPage
index dbe5c2f..d5fb001 100644 (file)
@@ -24,6 +24,9 @@
  * @author Brian Wolff
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Special:ListDuplicatedFiles Lists all files where the current version is
  *   a duplicate of the current version of some other file.
index d034a6c..5f38629 100644 (file)
@@ -24,6 +24,9 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Special:Listredirects - Lists all the redirects on the wiki.
  * @ingroup SpecialPage
index 533a331..195d08b 100644 (file)
@@ -96,7 +96,7 @@ class SpecialLog extends SpecialPage {
 
                # Some log types are only for a 'User:' title but we might have been given
                # only the username instead of the full title 'User:username'. This part try
-               # to lookup for a user by that name and eventually fix user input. See bug 1697.
+               # to lookup for a user by that name and eventually fix user input. See T3697.
                if ( in_array( $opts->getValue( 'type' ), self::getLogTypesOnUser() ) ) {
                        # ok we have a type of log which expect a user title.
                        $target = Title::newFromText( $opts->getValue( 'page' ) );
index 1cb6549..5192eb9 100644 (file)
@@ -22,6 +22,9 @@
  * @author Brian Wolff
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * @ingroup SpecialPage
  */
@@ -81,10 +84,6 @@ class MediaStatisticsPage extends QueryPage {
                                'namespace' => NS_MEDIA, /* needs to be something */
                                'value' => '1'
                        ],
-                       'conds' => [
-                               // WMF has a random null row in the db
-                               'img_media_type IS NOT NULL'
-                       ],
                        'options' => [
                                'GROUP BY' => [
                                        'img_media_type',
index 6095412..bebed12 100644 (file)
@@ -24,6 +24,9 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A special page that list pages that have highest category count
  *
index 210c4a2..c140ee9 100644 (file)
@@ -24,6 +24,9 @@
  * @author Umherirrender
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A special page that listed pages that have highest interwiki count
  *
index 712574c..fbfaa73 100644 (file)
@@ -25,6 +25,9 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A special page to show pages ordered by the number of pages linking to them.
  *
index 41678cb..956207f 100644 (file)
@@ -24,6 +24,9 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A querypage to show categories ordered in descending order by the pages in them
  *
index d102791..dee1c8e 100644 (file)
@@ -22,6 +22,9 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Special page lists templates with a large number of
  * transclusion links, i.e. "most used" templates
index 0281b15..a2b5be4 100644 (file)
@@ -77,7 +77,7 @@ class MovePageForm extends UnlistedSpecialPage {
                $request = $this->getRequest();
                $target = !is_null( $par ) ? $par : $request->getVal( 'target' );
 
-               // Yes, the use of getVal() and getText() is wanted, see bug 20365
+               // Yes, the use of getVal() and getText() is wanted, see T22365
 
                $oldTitleText = $request->getVal( 'wpOldTitle', $target );
                $this->oldTitle = Title::newFromText( $oldTitleText );
@@ -620,7 +620,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        // a redirect to the new title. This is not safe, but what we did before was
                        // even worse: we just determined whether a redirect should have been created,
                        // and reported that it was created if it should have, without any checks.
-                       // Also note that isRedirect() is unreliable because of bug 37209.
+                       // Also note that isRedirect() is unreliable because of T39209.
                        $msgName = 'movepage-moved-redirect';
                } else {
                        $msgName = 'movepage-moved-noredirect';
@@ -708,7 +708,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
                        $newPageName = preg_replace(
                                '#^' . preg_quote( $ot->getDBkey(), '#' ) . '#',
-                               StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
+                               StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # T23234
                                $oldSubpage->getDBkey()
                        );
 
@@ -721,7 +721,7 @@ class MovePageForm extends UnlistedSpecialPage {
                                $newNs = $nt->getSubjectPage()->getNamespace();
                        }
 
-                       # Bug 14385: we need makeTitleSafe because the new page names may
+                       # T16385: we need makeTitleSafe because the new page names may
                        # be longer than 255 characters.
                        $newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
                        if ( !$newSubpage ) {
@@ -776,6 +776,12 @@ class MovePageForm extends UnlistedSpecialPage {
                # Deal with watches (we don't watch subpages)
                WatchAction::doWatchOrUnwatch( $this->watch, $ot, $user );
                WatchAction::doWatchOrUnwatch( $this->watch, $nt, $user );
+
+               /**
+                * T163966
+                * Increment user_editcount during page moves
+                */
+               $user->incEditCount();
        }
 
        function showLogFragment( $title ) {
index 9e3a750..583d4f9 100644 (file)
@@ -34,15 +34,19 @@ class SpecialNewFiles extends IncludableSpecialPage {
                $this->outputHeader();
 
                $out = $this->getOutput();
+               $out->addModules( 'mediawiki.special.newFiles' );
                $this->addHelpLink( 'Help:New images' );
 
                $opts = new FormOptions();
 
                $opts->add( 'like', '' );
+               $opts->add( 'user', '' );
                $opts->add( 'showbots', false );
                $opts->add( 'hidepatrolled', false );
                $opts->add( 'limit', 50 );
                $opts->add( 'offset', '' );
+               $opts->add( 'start', '' );
+               $opts->add( 'end', '' );
 
                $opts->fetchValuesFromRequest( $this->getRequest() );
 
@@ -50,6 +54,19 @@ class SpecialNewFiles extends IncludableSpecialPage {
                        $opts->setValue( is_numeric( $par ) ? 'limit' : 'like', $par );
                }
 
+               // If start date comes after end date chronologically, swap them.
+               // They are swapped in the interface by JS.
+               $start = $opts->getValue( 'start' );
+               $end = $opts->getValue( 'end' );
+               if ( $start !== '' && $end !== '' && $start > $end ) {
+                       $temp = $end;
+                       $end = $start;
+                       $start = $temp;
+
+                       $opts->setValue( 'start', $start, true );
+                       $opts->setValue( 'end', $end, true );
+               }
+
                $opts->validateIntBounds( 'limit', 0, 500 );
 
                $this->opts = $opts;
@@ -75,6 +92,12 @@ class SpecialNewFiles extends IncludableSpecialPage {
                                'name' => 'like',
                        ],
 
+                       'user' => [
+                               'type' => 'text',
+                               'label-message' => 'newimages-user',
+                               'name' => 'user',
+                       ],
+
                        'showbots' => [
                                'type' => 'check',
                                'label-message' => 'newimages-showbots',
@@ -98,6 +121,18 @@ class SpecialNewFiles extends IncludableSpecialPage {
                                'default' => $this->opts->getValue( 'offset' ),
                                'name' => 'offset',
                        ],
+
+                       'start' => [
+                               'type' => 'date',
+                               'label-message' => 'date-range-from',
+                               'name' => 'start',
+                       ],
+
+                       'end' => [
+                               'type' => 'date',
+                               'label-message' => 'date-range-to',
+                               'name' => 'end',
+                       ],
                ];
 
                if ( $this->getConfig()->get( 'MiserMode' ) ) {
old mode 100755 (executable)
new mode 100644 (file)
index db05ebe..2943fd4 100644 (file)
@@ -136,7 +136,7 @@ class SpecialPageLanguage extends FormSpecialPage {
                }
 
                // Url to redirect to after the operation
-               $this->goToUrl = $title->getFullURL(
+               $this->goToUrl = $title->getFullUrlForRedirect(
                        $title->isRedirect() ? [ 'redirect' => 'no' ] : []
                );
 
index eee5b64..40b50ea 100644 (file)
@@ -148,7 +148,7 @@ class SpecialPreferences extends SpecialPage {
                // Set session data for the success message
                $this->getRequest()->getSession()->set( 'specialPreferencesSaveSuccess', 1 );
 
-               $url = $this->getPageTitle()->getFullURL();
+               $url = $this->getPageTitle()->getFullUrlForRedirect();
                $this->getOutput()->redirect( $url );
 
                return true;
index 4671591..34ffa07 100644 (file)
@@ -83,7 +83,7 @@ class SpecialPrefixindex extends SpecialAllPages {
                        $showme = $from;
                }
 
-               // Bug 27864: if transcluded, show all pages instead of the form.
+               // T29864: if transcluded, show all pages instead of the form.
                if ( $this->including() || $showme != '' || $ns !== null ) {
                        $this->showPrefixChunk( $namespace, $showme, $from );
                } else {
index 5bdae15..8e20d88 100644 (file)
@@ -21,8 +21,6 @@
  * @ingroup SpecialPage
  */
 
-use MediaWiki\Linker\LinkRenderer;
-
 /**
  * A special page that lists protected pages
  *
@@ -273,317 +271,3 @@ class SpecialProtectedpages extends SpecialPage {
                return 'maintenance';
        }
 }
-
-/**
- * @todo document
- * @ingroup Pager
- */
-class ProtectedPagesPager extends TablePager {
-       public $mForm, $mConds;
-       private $type, $level, $namespace, $sizetype, $size, $indefonly, $cascadeonly, $noredirect;
-
-       /**
-        * @var LinkRenderer
-        */
-       private $linkRenderer;
-
-       /**
-        * @param SpecialProtectedpages $form
-        * @param array $conds
-        * @param $type
-        * @param $level
-        * @param $namespace
-        * @param string $sizetype
-        * @param int $size
-        * @param bool $indefonly
-        * @param bool $cascadeonly
-        * @param bool $noredirect
-        * @param LinkRenderer $linkRenderer
-        */
-       function __construct( $form, $conds = [], $type, $level, $namespace,
-               $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false, $noredirect = false,
-               LinkRenderer $linkRenderer
-       ) {
-               $this->mForm = $form;
-               $this->mConds = $conds;
-               $this->type = ( $type ) ? $type : 'edit';
-               $this->level = $level;
-               $this->namespace = $namespace;
-               $this->sizetype = $sizetype;
-               $this->size = intval( $size );
-               $this->indefonly = (bool)$indefonly;
-               $this->cascadeonly = (bool)$cascadeonly;
-               $this->noredirect = (bool)$noredirect;
-               $this->linkRenderer = $linkRenderer;
-               parent::__construct( $form->getContext() );
-       }
-
-       function preprocessResults( $result ) {
-               # Do a link batch query
-               $lb = new LinkBatch;
-               $userids = [];
-
-               foreach ( $result as $row ) {
-                       $lb->add( $row->page_namespace, $row->page_title );
-                       // field is nullable, maybe null on old protections
-                       if ( $row->log_user !== null ) {
-                               $userids[] = $row->log_user;
-                       }
-               }
-
-               // fill LinkBatch with user page and user talk
-               if ( count( $userids ) ) {
-                       $userCache = UserCache::singleton();
-                       $userCache->doQuery( $userids, [], __METHOD__ );
-                       foreach ( $userids as $userid ) {
-                               $name = $userCache->getProp( $userid, 'name' );
-                               if ( $name !== false ) {
-                                       $lb->add( NS_USER, $name );
-                                       $lb->add( NS_USER_TALK, $name );
-                               }
-                       }
-               }
-
-               $lb->execute();
-       }
-
-       function getFieldNames() {
-               static $headers = null;
-
-               if ( $headers == [] ) {
-                       $headers = [
-                               'log_timestamp' => 'protectedpages-timestamp',
-                               'pr_page' => 'protectedpages-page',
-                               'pr_expiry' => 'protectedpages-expiry',
-                               'log_user' => 'protectedpages-performer',
-                               'pr_params' => 'protectedpages-params',
-                               'log_comment' => 'protectedpages-reason',
-                       ];
-                       foreach ( $headers as $key => $val ) {
-                               $headers[$key] = $this->msg( $val )->text();
-                       }
-               }
-
-               return $headers;
-       }
-
-       /**
-        * @param string $field
-        * @param string $value
-        * @return string HTML
-        * @throws MWException
-        */
-       function formatValue( $field, $value ) {
-               /** @var $row object */
-               $row = $this->mCurrentRow;
-
-               switch ( $field ) {
-                       case 'log_timestamp':
-                               // when timestamp is null, this is a old protection row
-                               if ( $value === null ) {
-                                       $formatted = Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-unknown' ],
-                                               $this->msg( 'protectedpages-unknown-timestamp' )->escaped()
-                                       );
-                               } else {
-                                       $formatted = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
-                                               $value, $this->getUser() ) );
-                               }
-                               break;
-
-                       case 'pr_page':
-                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-                               if ( !$title ) {
-                                       $formatted = Html::element(
-                                               'span',
-                                               [ 'class' => 'mw-invalidtitle' ],
-                                               Linker::getInvalidTitleDescription(
-                                                       $this->getContext(),
-                                                       $row->page_namespace,
-                                                       $row->page_title
-                                               )
-                                       );
-                               } else {
-                                       $formatted = $this->linkRenderer->makeLink( $title );
-                               }
-                               if ( !is_null( $row->page_len ) ) {
-                                       $formatted .= $this->getLanguage()->getDirMark() .
-                                               ' ' . Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-length' ],
-                                               Linker::formatRevisionSize( $row->page_len )
-                                       );
-                               }
-                               break;
-
-                       case 'pr_expiry':
-                               $formatted = htmlspecialchars( $this->getLanguage()->formatExpiry(
-                                       $value, /* User preference timezone */true ) );
-                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-                               if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
-                                       $changeProtection = $this->linkRenderer->makeKnownLink(
-                                               $title,
-                                               $this->msg( 'protect_change' )->text(),
-                                               [],
-                                               [ 'action' => 'unprotect' ]
-                                       );
-                                       $formatted .= ' ' . Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-actions' ],
-                                               $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped()
-                                       );
-                               }
-                               break;
-
-                       case 'log_user':
-                               // when timestamp is null, this is a old protection row
-                               if ( $row->log_timestamp === null ) {
-                                       $formatted = Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-unknown' ],
-                                               $this->msg( 'protectedpages-unknown-performer' )->escaped()
-                                       );
-                               } else {
-                                       $username = UserCache::singleton()->getProp( $value, 'name' );
-                                       if ( LogEventsList::userCanBitfield(
-                                               $row->log_deleted,
-                                               LogPage::DELETED_USER,
-                                               $this->getUser()
-                                       ) ) {
-                                               if ( $username === false ) {
-                                                       $formatted = htmlspecialchars( $value );
-                                               } else {
-                                                       $formatted = Linker::userLink( $value, $username )
-                                                               . Linker::userToolLinks( $value, $username );
-                                               }
-                                       } else {
-                                               $formatted = $this->msg( 'rev-deleted-user' )->escaped();
-                                       }
-                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
-                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
-                                       }
-                               }
-                               break;
-
-                       case 'pr_params':
-                               $params = [];
-                               // Messages: restriction-level-sysop, restriction-level-autoconfirmed
-                               $params[] = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
-                               if ( $row->pr_cascade ) {
-                                       $params[] = $this->msg( 'protect-summary-cascade' )->escaped();
-                               }
-                               $formatted = $this->getLanguage()->commaList( $params );
-                               break;
-
-                       case 'log_comment':
-                               // when timestamp is null, this is an old protection row
-                               if ( $row->log_timestamp === null ) {
-                                       $formatted = Html::rawElement(
-                                               'span',
-                                               [ 'class' => 'mw-protectedpages-unknown' ],
-                                               $this->msg( 'protectedpages-unknown-reason' )->escaped()
-                                       );
-                               } else {
-                                       if ( LogEventsList::userCanBitfield(
-                                               $row->log_deleted,
-                                               LogPage::DELETED_COMMENT,
-                                               $this->getUser()
-                                       ) ) {
-                                               $formatted = Linker::formatComment( $value !== null ? $value : '' );
-                                       } else {
-                                               $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
-                                       }
-                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
-                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
-                                       }
-                               }
-                               break;
-
-                       default:
-                               throw new MWException( "Unknown field '$field'" );
-               }
-
-               return $formatted;
-       }
-
-       function getQueryInfo() {
-               $conds = $this->mConds;
-               $conds[] = 'pr_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
-                       ' OR pr_expiry IS NULL';
-               $conds[] = 'page_id=pr_page';
-               $conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
-
-               if ( $this->sizetype == 'min' ) {
-                       $conds[] = 'page_len>=' . $this->size;
-               } elseif ( $this->sizetype == 'max' ) {
-                       $conds[] = 'page_len<=' . $this->size;
-               }
-
-               if ( $this->indefonly ) {
-                       $infinity = $this->mDb->addQuotes( $this->mDb->getInfinity() );
-                       $conds[] = "pr_expiry = $infinity OR pr_expiry IS NULL";
-               }
-               if ( $this->cascadeonly ) {
-                       $conds[] = 'pr_cascade = 1';
-               }
-               if ( $this->noredirect ) {
-                       $conds[] = 'page_is_redirect = 0';
-               }
-
-               if ( $this->level ) {
-                       $conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
-               }
-               if ( !is_null( $this->namespace ) ) {
-                       $conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
-               }
-
-               return [
-                       'tables' => [ 'page', 'page_restrictions', 'log_search', 'logging' ],
-                       'fields' => [
-                               'pr_id',
-                               'page_namespace',
-                               'page_title',
-                               'page_len',
-                               'pr_type',
-                               'pr_level',
-                               'pr_expiry',
-                               'pr_cascade',
-                               'log_timestamp',
-                               'log_user',
-                               'log_comment',
-                               'log_deleted',
-                       ],
-                       'conds' => $conds,
-                       'join_conds' => [
-                               'log_search' => [
-                                       'LEFT JOIN', [
-                                               'ls_field' => 'pr_id', 'ls_value = ' . $this->mDb->buildStringCast( 'pr_id' )
-                                       ]
-                               ],
-                               'logging' => [
-                                       'LEFT JOIN', [
-                                               'ls_log_id = log_id'
-                                       ]
-                               ]
-                       ]
-               ];
-       }
-
-       protected function getTableClass() {
-               return parent::getTableClass() . ' mw-protectedpages';
-       }
-
-       function getIndexField() {
-               return 'pr_id';
-       }
-
-       function getDefaultSort() {
-               return 'pr_id';
-       }
-
-       function isFieldSortable( $field ) {
-               // no index for sorting exists
-               return false;
-       }
-}
index 975e210..acfc1c0 100644 (file)
@@ -22,6 +22,8 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * A special page that lists last changes made to the wiki
@@ -29,9 +31,104 @@ use MediaWiki\MediaWikiServices;
  * @ingroup SpecialPage
  */
 class SpecialRecentChanges extends ChangesListSpecialPage {
+
+       private $watchlistFilterGroupDefinition;
+
        // @codingStandardsIgnoreStart Needed "useless" override to change parameters.
        public function __construct( $name = 'Recentchanges', $restriction = '' ) {
                parent::__construct( $name, $restriction );
+
+               $this->watchlistFilterGroupDefinition = [
+                       'name' => 'watchlist',
+                       'title' => 'rcfilters-filtergroup-watchlist',
+                       'class' => ChangesListStringOptionsFilterGroup::class,
+                       'priority' => -9,
+                       'isFullCoverage' => true,
+                       'filters' => [
+                               [
+                                       'name' => 'watched',
+                                       'label' => 'rcfilters-filter-watchlist-watched-label',
+                                       'description' => 'rcfilters-filter-watchlist-watched-description',
+                                       'cssClassSuffix' => 'watched',
+                                       'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                               return $rc->getAttribute( 'wl_user' );
+                                       }
+                               ],
+                               [
+                                       'name' => 'watchednew',
+                                       'label' => 'rcfilters-filter-watchlist-watchednew-label',
+                                       'description' => 'rcfilters-filter-watchlist-watchednew-description',
+                                       'cssClassSuffix' => 'watchednew',
+                                       'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                               return $rc->getAttribute( 'wl_user' ) &&
+                                                       $rc->getAttribute( 'rc_timestamp' ) &&
+                                                       $rc->getAttribute( 'wl_notificationtimestamp' ) &&
+                                                       $rc->getAttribute( 'rc_timestamp' ) >= $rc->getAttribute( 'wl_notificationtimestamp' );
+                                       },
+                               ],
+                               [
+                                       'name' => 'notwatched',
+                                       'label' => 'rcfilters-filter-watchlist-notwatched-label',
+                                       'description' => 'rcfilters-filter-watchlist-notwatched-description',
+                                       'cssClassSuffix' => 'notwatched',
+                                       'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                               return $rc->getAttribute( 'wl_user' ) === null;
+                                       },
+                               ]
+                       ],
+                       'default' => ChangesListStringOptionsFilterGroup::NONE,
+                       'queryCallable' => function ( $specialPageClassName, $context, $dbr,
+                               &$tables, &$fields, &$conds, &$query_options, &$join_conds, $selectedValues ) {
+                               sort( $selectedValues );
+                               $notwatchedCond = 'wl_user IS NULL';
+                               $watchedCond = 'wl_user IS NOT NULL';
+                               $newCond = 'rc_timestamp >= wl_notificationtimestamp';
+
+                               if ( $selectedValues === [ 'notwatched' ] ) {
+                                       $conds[] = $notwatchedCond;
+                                       return;
+                               }
+
+                               if ( $selectedValues === [ 'watched' ] ) {
+                                       $conds[] = $watchedCond;
+                                       return;
+                               }
+
+                               if ( $selectedValues === [ 'watchednew' ] ) {
+                                       $conds[] = $dbr->makeList( [
+                                               $watchedCond,
+                                               $newCond
+                                       ], LIST_AND );
+                                       return;
+                               }
+
+                               if ( $selectedValues === [ 'notwatched', 'watched' ] ) {
+                                       // no filters
+                                       return;
+                               }
+
+                               if ( $selectedValues === [ 'notwatched', 'watchednew' ] ) {
+                                       $conds[] = $dbr->makeList( [
+                                               $notwatchedCond,
+                                               $dbr->makeList( [
+                                                       $watchedCond,
+                                                       $newCond
+                                               ], LIST_AND )
+                                       ], LIST_OR );
+                                       return;
+                               }
+
+                               if ( $selectedValues === [ 'watched', 'watchednew' ] ) {
+                                       $conds[] = $watchedCond;
+                                       return;
+                               }
+
+                               if ( $selectedValues === [ 'notwatched', 'watched', 'watchednew' ] ) {
+                                       // no filters
+                                       return;
+                               }
+                       }
+               ];
        }
        // @codingStandardsIgnoreEnd
 
@@ -41,6 +138,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         * @param string $subpage
         */
        public function execute( $subpage ) {
+               global $wgStructuredChangeFiltersEnableSaving;
+
                // Backwards-compatibility: redirect to new feed URLs
                $feedFormat = $this->getRequest()->getVal( 'feed' );
                if ( !$this->including() && $feedFormat ) {
@@ -52,7 +151,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
 
                // 10 seconds server-side caching max
-               $this->getOutput()->setCdnMaxage( 10 );
+               $out = $this->getOutput();
+               $out->setCdnMaxage( 10 );
                // Check if the client has a cached version
                $lastmod = $this->checkLastModified();
                if ( $lastmod === false ) {
@@ -64,6 +164,81 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        true
                );
                parent::execute( $subpage );
+
+               if ( $this->isStructuredFilterUiEnabled() ) {
+                       $jsData = $this->getStructuredFilterJsData();
+
+                       $messages = [];
+                       foreach ( $jsData['messageKeys'] as $key ) {
+                               $messages[$key] = $this->msg( $key )->plain();
+                       }
+
+                       $out->addHTML(
+                               ResourceLoader::makeInlineScript(
+                                       ResourceLoader::makeMessageSetScript( $messages )
+                               )
+                       );
+
+                       $out->addJsConfigVars( 'wgStructuredChangeFilters', $jsData['groups'] );
+                       $out->addJsConfigVars(
+                               'wgStructuredChangeFiltersEnableSaving',
+                               $wgStructuredChangeFiltersEnableSaving
+                       );
+               }
+       }
+
+       /**
+        * @inheritdoc
+        */
+       protected function transformFilterDefinition( array $filterDefinition ) {
+               if ( isset( $filterDefinition['showHideSuffix'] ) ) {
+                       $filterDefinition['showHide'] = 'rc' . $filterDefinition['showHideSuffix'];
+               }
+
+               return $filterDefinition;
+       }
+
+       /**
+        * @inheritdoc
+        */
+       protected function registerFilters() {
+               parent::registerFilters();
+
+               if (
+                       !$this->including() &&
+                       $this->getUser()->isLoggedIn() &&
+                       $this->getUser()->isAllowed( 'viewmywatchlist' )
+               ) {
+                       $this->registerFiltersFromDefinitions( [ $this->watchlistFilterGroupDefinition ] );
+                       $watchlistGroup = $this->getFilterGroup( 'watchlist' );
+                       $watchlistGroup->getFilter( 'watched' )->setAsSupersetOf(
+                               $watchlistGroup->getFilter( 'watchednew' )
+                       );
+               }
+
+               $user = $this->getUser();
+
+               $significance = $this->getFilterGroup( 'significance' );
+               $hideMinor = $significance->getFilter( 'hideminor' );
+               $hideMinor->setDefault( $user->getBoolOption( 'hideminor' ) );
+
+               $automated = $this->getFilterGroup( 'automated' );
+               $hideBots = $automated->getFilter( 'hidebots' );
+               $hideBots->setDefault( true );
+
+               $reviewStatus = $this->getFilterGroup( 'reviewStatus' );
+               if ( $reviewStatus !== null ) {
+                       // Conditional on feature being available and rights
+                       $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
+                       $hidePatrolled->setDefault( $user->getBoolOption( 'hidepatrolled' ) );
+               }
+
+               $changeType = $this->getFilterGroup( 'changeType' );
+               $hideCategorization = $changeType->getFilter( 'hidecategorization' );
+               if ( $hideCategorization !== null ) {
+                       // Conditional on feature being available
+                       $hideCategorization->setDefault( $user->getBoolOption( 'hidecategorization' ) );
+               }
        }
 
        /**
@@ -79,20 +254,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $opts->add( 'limit', $user->getIntOption( 'rclimit' ) );
                $opts->add( 'from', '' );
 
-               $opts->add( 'hideminor', $user->getBoolOption( 'hideminor' ) );
-               $opts->add( 'hidebots', true );
-               $opts->add( 'hideanons', false );
-               $opts->add( 'hideliu', false );
-               $opts->add( 'hidepatrolled', $user->getBoolOption( 'hidepatrolled' ) );
-               $opts->add( 'hidemyself', false );
-               $opts->add( 'hidecategorization', $user->getBoolOption( 'hidecategorization' ) );
-
                $opts->add( 'categories', '' );
                $opts->add( 'categories_any', false );
                $opts->add( 'tagfilter', '' );
 
-               $opts->add( 'userExpLevel', 'all' );
-
                return $opts;
        }
 
@@ -117,36 +282,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         * @param FormOptions $opts
         */
        public function parseParameters( $par, FormOptions $opts ) {
+               parent::parseParameters( $par, $opts );
+
                $bits = preg_split( '/\s*,\s*/', trim( $par ) );
                foreach ( $bits as $bit ) {
-                       if ( 'hidebots' === $bit ) {
-                               $opts['hidebots'] = true;
-                       }
-                       if ( 'bots' === $bit ) {
-                               $opts['hidebots'] = false;
-                       }
-                       if ( 'hideminor' === $bit ) {
-                               $opts['hideminor'] = true;
-                       }
-                       if ( 'minor' === $bit ) {
-                               $opts['hideminor'] = false;
-                       }
-                       if ( 'hideliu' === $bit ) {
-                               $opts['hideliu'] = true;
-                       }
-                       if ( 'hidepatrolled' === $bit ) {
-                               $opts['hidepatrolled'] = true;
-                       }
-                       if ( 'hideanons' === $bit ) {
-                               $opts['hideanons'] = true;
-                       }
-                       if ( 'hidemyself' === $bit ) {
-                               $opts['hidemyself'] = true;
-                       }
-                       if ( 'hidecategorization' === $bit ) {
-                               $opts['hidecategorization'] = true;
-                       }
-
                        if ( is_numeric( $bit ) ) {
                                $opts['limit'] = $bit;
                        }
@@ -158,7 +297,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        if ( preg_match( '/^days=(\d+)$/', $bit, $m ) ) {
                                $opts['days'] = $m[1];
                        }
-                       if ( preg_match( '/^namespace=(\d+)$/', $bit, $m ) ) {
+                       if ( preg_match( '/^namespace=(.*)$/', $bit, $m ) ) {
                                $opts['namespace'] = $m[1];
                        }
                        if ( preg_match( '/^tagfilter=(.*)$/', $bit, $m ) ) {
@@ -173,14 +312,14 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        }
 
        /**
-        * Return an array of conditions depending of options set in $opts
-        *
-        * @param FormOptions $opts
-        * @return array
+        * @inheritdoc
         */
-       public function buildMainQueryConds( FormOptions $opts ) {
+       protected function buildQuery( &$tables, &$fields, &$conds,
+               &$query_options, &$join_conds, FormOptions $opts ) {
+
                $dbr = $this->getDB();
-               $conds = parent::buildMainQueryConds( $opts );
+               parent::buildQuery( $tables, $fields, $conds,
+                       $query_options, $join_conds, $opts );
 
                // Calculate cutoff
                $cutoff_unixtime = time() - ( $opts['days'] * 86400 );
@@ -195,28 +334,22 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
 
                $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes( $cutoff );
-
-               return $conds;
        }
 
        /**
-        * Process the query
-        *
-        * @param array $conds
-        * @param FormOptions $opts
-        * @return bool|ResultWrapper Result or false (for Recentchangeslinked only)
+        * @inheritdoc
         */
-       public function doMainQuery( $conds, $opts ) {
+       protected function doMainQuery( $tables, $fields, $conds, $query_options,
+               $join_conds, FormOptions $opts ) {
+
                $dbr = $this->getDB();
                $user = $this->getUser();
 
-               $tables = [ 'recentchanges' ];
-               $fields = RecentChange::selectFields();
-               $query_options = [];
-               $join_conds = [];
+               $tables[] = 'recentchanges';
+               $fields = array_merge( RecentChange::selectFields(), $fields );
 
                // JOIN on watchlist for users
-               if ( $user->getId() && $user->isAllowed( 'viewmywatchlist' ) ) {
+               if ( $user->isLoggedIn() && $user->isAllowed( 'viewmywatchlist' ) ) {
                        $tables[] = 'watchlist';
                        $fields[] = 'wl_user';
                        $fields[] = 'wl_notificationtimestamp';
@@ -227,11 +360,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        ] ];
                }
 
-               if ( $user->isAllowed( 'rollback' ) ) {
-                       $tables[] = 'page';
-                       $fields[] = 'page_latest';
-                       $join_conds['page'] = [ 'LEFT JOIN', 'rc_cur_id=page_id' ];
-               }
+               // JOIN on page, used for 'last revision' filter highlight
+               $tables[] = 'page';
+               $fields[] = 'page_latest';
+               $join_conds['page'] = [ 'LEFT JOIN', 'rc_cur_id=page_id' ];
 
                ChangeTags::modifyDisplayQuery(
                        $tables,
@@ -242,14 +374,16 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $opts['tagfilter']
                );
 
-               $this->filterOnUserExperienceLevel( $tables, $conds, $join_conds, $opts );
-
                if ( !$this->runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds,
                        $opts )
                ) {
                        return false;
                }
 
+               if ( $this->areFiltersInConflict() ) {
+                       return false;
+               }
+
                // array_merge() is used intentionally here so that hooks can, should
                // they so desire, override the ORDER BY / LIMIT condition(s); prior to
                // MediaWiki 1.26 this used to use the plus operator instead, which meant
@@ -330,7 +464,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $dbr = $this->getDB();
 
                $counter = 1;
-               $list = ChangesList::newFromContext( $this->getContext() );
+               $list = ChangesList::newFromContext( $this->getContext(), $this->filterGroups );
                $list->initChangesListRows( $rows );
 
                $userShowHiddenCats = $this->getUser()->getBoolOption( 'showhiddencats' );
@@ -380,11 +514,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $rclistOutput .= $list->endRecentChangesList();
 
                if ( $rows->numRows() === 0 ) {
-                       $this->getOutput()->addHTML(
-                               '<div class="mw-changeslist-empty">' .
-                               $this->msg( 'recentchanges-noresult' )->parse() .
-                               '</div>'
-                       );
+                       $this->outputNoResults();
                        if ( !$this->including() ) {
                                $this->getOutput()->setStatusCode( 404 );
                        }
@@ -455,14 +585,31 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $panel[] = $form;
                $panelString = implode( "\n", $panel );
 
-               $this->getOutput()->addHTML(
-                       Xml::fieldset(
-                               $this->msg( 'recentchanges-legend' )->text(),
-                               $panelString,
-                               [ 'class' => 'rcoptions' ]
-                       )
+               $rcoptions = Xml::fieldset(
+                       $this->msg( 'recentchanges-legend' )->text(),
+                       $panelString,
+                       [ 'class' => 'rcoptions' ]
                );
 
+               // Insert a placeholder for RCFilters
+               if ( $this->getUser()->getOption( 'rcenhancedfilters' ) ) {
+                       $rcfilterContainer = Html::element(
+                               'div',
+                               [ 'class' => 'rcfilters-container' ]
+                       );
+
+                       // Wrap both with rcfilters-head
+                       $this->getOutput()->addHTML(
+                               Html::rawElement(
+                                       'div',
+                                       [ 'class' => 'rcfilters-head' ],
+                                       $rcfilterContainer . $rcoptions
+                               )
+                       );
+               } else {
+                       $this->getOutput()->addHTML( $rcoptions );
+               }
+
                $this->setBottomText( $opts );
        }
 
@@ -478,7 +625,11 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                if ( !$message->isDisabled() ) {
                        $this->getOutput()->addWikiText(
                                Html::rawElement( 'div',
-                                       [ 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ],
+                                       [
+                                               'class' => 'mw-recentchanges-toplinks',
+                                               'lang' => $wgContLang->getHtmlCode(),
+                                               'dir' => $wgContLang->getDir()
+                                       ],
                                        "\n" . $message->plain() . "\n"
                                ),
                                /* $lineStart */ true,
@@ -519,6 +670,17 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                return $extraOpts;
        }
 
+       /**
+        * Check whether the structured filter UI is enabled
+        *
+        * @return bool
+        */
+       protected function isStructuredFilterUiEnabled() {
+               return $this->getUser()->getOption(
+                       'rcenhancedfilters'
+               );
+       }
+
        /**
         * Add page-specific modules.
         */
@@ -526,13 +688,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                parent::addModules();
                $out = $this->getOutput();
                $out->addModules( 'mediawiki.special.recentchanges' );
-               if ( $this->getUser()->getOption(
-                               'rcenhancedfilters',
-                               /*default=*/ null,
-                               /*ignoreHidden=*/ true
-                       )
-               ) {
+               if ( $this->isStructuredFilterUiEnabled() ) {
                        $out->addModules( 'mediawiki.rcfilters.filters.ui' );
+                       $out->addModuleStyles( 'mediawiki.rcfilters.filters.base.styles' );
                }
        }
 
@@ -653,7 +811,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                                $newrows[$k] = $rowsarr[$k];
                        }
                }
-               $rows = $newrows;
+               $rows = new FakeResultWrapper( array_values( $newrows ) );
        }
 
        /**
@@ -666,22 +824,16 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         * @return string
         */
        function makeOptionsLink( $title, $override, $options, $active = false ) {
-               $params = $override + $options;
-
-               // Bug 36524: false values have be converted to "0" otherwise
-               // wfArrayToCgi() will omit it them.
-               foreach ( $params as &$value ) {
-                       if ( $value === false ) {
-                               $value = '0';
-                       }
-               }
-               unset( $value );
+               $params = $this->convertParamsForLink( $override + $options );
 
                if ( $active ) {
                        $title = new HtmlArmor( '<strong>' . htmlspecialchars( $title ) . '</strong>' );
                }
 
-               return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [], $params );
+               return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [
+                       'data-params' => json_encode( $override ),
+                       'data-keys' => implode( ',', array_keys( $override ) ),
+               ], $params );
        }
 
        /**
@@ -705,6 +857,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $user = $this->getUser();
                $config = $this->getConfig();
                if ( $options['from'] ) {
+                       $resetLink = $this->makeOptionsLink( $this->msg( 'rclistfromreset' ),
+                               [ 'from' => '' ], $nondefaults );
+
                        $note .= $this->msg( 'rcnotefrom' )
                                ->numParams( $options['limit'] )
                                ->params(
@@ -713,7 +868,13 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                                        $lang->userTime( $options['from'], $user )
                                )
                                ->numParams( $numRows )
-                               ->parse() . '<br />';
+                               ->parse() . ' ' .
+                               Html::rawElement(
+                                       'span',
+                                       [ 'class' => 'rcoptions-listfromreset' ],
+                                       $this->msg( 'parentheses' )->rawParams( $resetLink )->parse()
+                               ) .
+                               '<br />';
                }
 
                # Sort data for display and make sure it's unique after we've added user data.
@@ -743,49 +904,45 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
                $dl = $lang->pipeList( $dl );
 
-               // show/hide links
-               $filters = [
-                       'hideminor' => 'rcshowhideminor',
-                       'hidebots' => 'rcshowhidebots',
-                       'hideanons' => 'rcshowhideanons',
-                       'hideliu' => 'rcshowhideliu',
-                       'hidepatrolled' => 'rcshowhidepatr',
-                       'hidemyself' => 'rcshowhidemine'
-               ];
-
-               if ( $config->get( 'RCWatchCategoryMembership' ) ) {
-                       $filters['hidecategorization'] = 'rcshowhidecategorization';
-               }
-
                $showhide = [ 'show', 'hide' ];
 
-               foreach ( $this->getRenderableCustomFilters( $this->getCustomFilters() ) as $key => $params ) {
-                       $filters[$key] = $params['msg'];
-               }
-
-               // Disable some if needed
-               if ( !$user->useRCPatrol() ) {
-                       unset( $filters['hidepatrolled'] );
-               }
-
                $links = [];
-               foreach ( $filters as $key => $msg ) {
-                       // The following messages are used here:
-                       // rcshowhideminor-show, rcshowhideminor-hide, rcshowhidebots-show, rcshowhidebots-hide,
-                       // rcshowhideanons-show, rcshowhideanons-hide, rcshowhideliu-show, rcshowhideliu-hide,
-                       // rcshowhidepatr-show, rcshowhidepatr-hide, rcshowhidemine-show, rcshowhidemine-hide,
-                       // rcshowhidecategorization-show, rcshowhidecategorization-hide.
-                       $linkMessage = $this->msg( $msg . '-' . $showhide[1 - $options[$key]] );
-                       // Extensions can define additional filters, but don't need to define the corresponding
-                       // messages. If they don't exist, just fall back to 'show' and 'hide'.
-                       if ( !$linkMessage->exists() ) {
-                               $linkMessage = $this->msg( $showhide[1 - $options[$key]] );
-                       }
 
-                       $link = $this->makeOptionsLink( $linkMessage->text(),
-                               [ $key => 1 - $options[$key] ], $nondefaults );
-                       $links[] = "<span class=\"$msg rcshowhideoption\">"
-                               . $this->msg( $msg )->rawParams( $link )->escaped() . '</span>';
+               $filterGroups = $this->getFilterGroups();
+
+               $context = $this->getContext();
+               foreach ( $filterGroups as $groupName => $group ) {
+                       if ( !$group->isPerGroupRequestParameter() ) {
+                               foreach ( $group->getFilters() as $key => $filter ) {
+                                       if ( $filter->displaysOnUnstructuredUi( $this ) ) {
+                                               $msg = $filter->getShowHide();
+                                               $linkMessage = $this->msg( $msg . '-' . $showhide[1 - $options[$key]] );
+                                               // Extensions can define additional filters, but don't need to define the corresponding
+                                               // messages. If they don't exist, just fall back to 'show' and 'hide'.
+                                               if ( !$linkMessage->exists() ) {
+                                                       $linkMessage = $this->msg( $showhide[1 - $options[$key]] );
+                                               }
+
+                                               $link = $this->makeOptionsLink( $linkMessage->text(),
+                                                       [ $key => 1 - $options[$key] ], $nondefaults );
+
+                                               $attribs = [
+                                                       'class' => "$msg rcshowhideoption",
+                                                       'data-filter-name' => $filter->getName(),
+                                               ];
+
+                                               if ( $filter->isFeatureAvailableOnStructuredUi( $this ) ) {
+                                                       $attribs['data-feature-in-structured-ui'] = true;
+                                               }
+
+                                               $links[] = Html::rawElement(
+                                                       'span',
+                                                       $attribs,
+                                                       $this->msg( $msg )->rawParams( $link )->escaped()
+                                               );
+                                       }
+                               }
+                       }
                }
 
                // show from this onward link
@@ -795,7 +952,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $datenow = $lang->userDate( $timestamp, $user );
                $pipedLinks = '<span class="rcshowhide">' . $lang->pipeList( $links ) . '</span>';
 
-               $rclinks = '<span class="rclinks">' . $this->msg( 'rclinks' )->rawParams( $cl, $dl, $pipedLinks )
+               $rclinks = '<span class="rclinks">' . $this->msg( 'rclinks' )->rawParams( $cl, $dl, '' )
                        ->parse() . '</span>';
 
                $rclistfrom = '<span class="rclistfrom">' . $this->makeOptionsLink(
@@ -804,7 +961,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $nondefaults
                ) . '</span>';
 
-               return "{$note}$rclinks<br />$rclistfrom";
+               return "{$note}$rclinks<br />$pipedLinks<br />$rclistfrom";
        }
 
        public function isIncludable() {
@@ -814,66 +971,4 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        protected function getCacheTTL() {
                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 aab0f6d..873285b 100644 (file)
@@ -46,7 +46,12 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                $opts['target'] = $par;
        }
 
-       public function doMainQuery( $conds, $opts ) {
+       /**
+        * @inheritdoc
+        */
+       protected function doMainQuery( $tables, $select, $conds, $query_options,
+               $join_conds, FormOptions $opts ) {
+
                $target = $opts['target'];
                $showlinkedto = $opts['showlinkedto'];
                $limit = $opts['limit'];
@@ -79,10 +84,8 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                $ns = $title->getNamespace();
                $dbkey = $title->getDBkey();
 
-               $tables = [ 'recentchanges' ];
-               $select = RecentChange::selectFields();
-               $join_conds = [];
-               $query_options = [];
+               $tables[] = 'recentchanges';
+               $select = array_merge( RecentChange::selectFields(), $select );
 
                // left join with watchlist table to highlight watched rows
                $uid = $this->getUser()->getId();
index b7356e7..e89dbc9 100644 (file)
@@ -146,6 +146,12 @@ class SpecialSearch extends SpecialPage {
                                $out->redirect( $url );
                                return;
                        }
+                       // No match. If it could plausibly be a title
+                       // run the No go match hook.
+                       $title = Title::newFromText( $term );
+                       if ( !is_null( $title ) ) {
+                               Hooks::run( 'SpecialSearchNogomatch', [ &$title ] );
+                       }
                }
 
                $this->setupPage( $term );
@@ -253,7 +259,7 @@ class SpecialSearch extends SpecialPage {
                        return null;
                }
 
-               return $url === null ? $title->getFullURL() : $url;
+               return $url === null ? $title->getFullUrlForRedirect() : $url;
        }
 
        /**
@@ -346,12 +352,16 @@ class SpecialSearch extends SpecialPage {
                        $out->addHTML( $dymWidget->render( $term, $textMatches ) );
                }
 
-               $out->addHTML( "<div class='searchresults'>" );
-
                $hasErrors = $textStatus && $textStatus->getErrors();
                $hasOtherResults = $textMatches &&
                        $textMatches->hasInterwikiResults( SearchResultSet::INLINE_RESULTS );
 
+               if ( $textMatches && $textMatches->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS ) ) {
+                       $out->addHTML( '<div class="searchresults mw-searchresults-has-iw">' );
+               } else {
+                       $out->addHTML( '<div class="searchresults">' );
+               }
+
                if ( $hasErrors ) {
                        list( $error, $warning ) = $textStatus->splitByErrorType();
                        if ( $error->getErrors() ) {
@@ -395,7 +405,8 @@ class SpecialSearch extends SpecialPage {
                                $this,
                                $sidebarResultWidget,
                                $linkRenderer,
-                               MediaWikiServices::getInstance()->getInterwikiLookup()
+                               MediaWikiServices::getInstance()->getInterwikiLookup(),
+                               $search->getFeatureData( 'show-multimedia-search-results' )
                        );
                } else {
                        $sidebarResultWidget = new SimpleSearchResultWidget( $this, $linkRenderer );
@@ -469,7 +480,9 @@ class SpecialSearch extends SpecialPage {
                        if ( $title->isKnown() ) {
                                $messageName = 'searchmenu-exists';
                                $linkClass = 'mw-search-exists';
-                       } elseif ( $title->quickUserCan( 'create', $this->getUser() ) ) {
+                       } elseif ( ContentHandler::getForTitle( $title )->supportsDirectEditing()
+                               && $title->quickUserCan( 'create', $this->getUser() )
+                       ) {
                                $messageName = 'searchmenu-new';
                        }
                }
index a78b082..3282a7a 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * SpecialShortpages extends QueryPage. It is used to return the shortest
  * pages in the database.
index a7a1c58..19850e6 100644 (file)
@@ -95,9 +95,11 @@ 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"
+                               );
                        }
                }
 
index 0d42e3f..01125fc 100644 (file)
@@ -186,7 +186,7 @@ class SpecialUnblock extends SpecialPage {
                        return [ [ 'ipb_cant_unblock', $target ] ];
                }
 
-               # bug 15810: blocked admins should have limited access here.  This
+               # T17810: blocked admins should have limited access here.  This
                # won't allow sysops to remove autoblocks on themselves, but they
                # should have ipblock-exempt anyway
                $status = SpecialBlock::checkUnblockSelf( $target, $performer );
index 4c6a593..eb4f0cc 100644 (file)
  * @file
  * @ingroup SpecialPage
  */
-use MediaWiki\MediaWikiServices;
-
-/**
- * Used to show archived pages and eventually restore them.
- *
- * @ingroup SpecialPage
- */
-class PageArchive {
-       /** @var Title */
-       protected $title;
-
-       /** @var Status */
-       protected $fileStatus;
-
-       /** @var Status */
-       protected $revisionStatus;
-
-       /** @var Config */
-       protected $config;
-
-       function __construct( $title, Config $config = null ) {
-               if ( is_null( $title ) ) {
-                       throw new MWException( __METHOD__ . ' given a null title.' );
-               }
-               $this->title = $title;
-               if ( $config === null ) {
-                       wfDebug( __METHOD__ . ' did not have a Config object passed to it' );
-                       $config = MediaWikiServices::getInstance()->getMainConfig();
-               }
-               $this->config = $config;
-       }
-
-       public function doesWrites() {
-               return true;
-       }
-
-       /**
-        * List all deleted pages recorded in the archive table. Returns result
-        * wrapper with (ar_namespace, ar_title, count) fields, ordered by page
-        * namespace/title.
-        *
-        * @return ResultWrapper
-        */
-       public static function listAllPages() {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               return self::listPages( $dbr, '' );
-       }
-
-       /**
-        * List deleted pages recorded in the archive table matching the
-        * given title prefix.
-        * Returns result wrapper with (ar_namespace, ar_title, count) fields.
-        *
-        * @param string $prefix Title prefix
-        * @return ResultWrapper
-        */
-       public static function listPagesByPrefix( $prefix ) {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $title = Title::newFromText( $prefix );
-               if ( $title ) {
-                       $ns = $title->getNamespace();
-                       $prefix = $title->getDBkey();
-               } else {
-                       // Prolly won't work too good
-                       // @todo handle bare namespace names cleanly?
-                       $ns = 0;
-               }
-
-               $conds = [
-                       'ar_namespace' => $ns,
-                       'ar_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
-               ];
-
-               return self::listPages( $dbr, $conds );
-       }
-
-       /**
-        * @param IDatabase $dbr
-        * @param string|array $condition
-        * @return bool|ResultWrapper
-        */
-       protected static function listPages( $dbr, $condition ) {
-               return $dbr->select(
-                       [ 'archive' ],
-                       [
-                               'ar_namespace',
-                               'ar_title',
-                               'count' => 'COUNT(*)'
-                       ],
-                       $condition,
-                       __METHOD__,
-                       [
-                               'GROUP BY' => [ 'ar_namespace', 'ar_title' ],
-                               'ORDER BY' => [ 'ar_namespace', 'ar_title' ],
-                               'LIMIT' => 100,
-                       ]
-               );
-       }
-
-       /**
-        * List the revisions of the given page. Returns result wrapper with
-        * (ar_minor_edit, ar_timestamp, ar_user, ar_user_text, ar_comment) fields.
-        *
-        * @return ResultWrapper
-        */
-       function listRevisions() {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $tables = [ 'archive' ];
-
-               $fields = [
-                       'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
-                       'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
-               ];
-
-               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
-                       $fields[] = 'ar_content_format';
-                       $fields[] = 'ar_content_model';
-               }
-
-               $conds = [ 'ar_namespace' => $this->title->getNamespace(),
-                       'ar_title' => $this->title->getDBkey() ];
-
-               $options = [ 'ORDER BY' => 'ar_timestamp DESC' ];
-
-               $join_conds = [];
-
-               ChangeTags::modifyDisplayQuery(
-                       $tables,
-                       $fields,
-                       $conds,
-                       $join_conds,
-                       $options,
-                       ''
-               );
-
-               return $dbr->select( $tables,
-                       $fields,
-                       $conds,
-                       __METHOD__,
-                       $options,
-                       $join_conds
-               );
-       }
-
-       /**
-        * List the deleted file revisions for this page, if it's a file page.
-        * Returns a result wrapper with various filearchive fields, or null
-        * if not a file page.
-        *
-        * @return ResultWrapper
-        * @todo Does this belong in Image for fuller encapsulation?
-        */
-       function listFiles() {
-               if ( $this->title->getNamespace() != NS_FILE ) {
-                       return null;
-               }
-
-               $dbr = wfGetDB( DB_REPLICA );
-               return $dbr->select(
-                       'filearchive',
-                       ArchivedFile::selectFields(),
-                       [ 'fa_name' => $this->title->getDBkey() ],
-                       __METHOD__,
-                       [ 'ORDER BY' => 'fa_timestamp DESC' ]
-               );
-       }
-
-       /**
-        * Return a Revision object containing data for the deleted revision.
-        * Note that the result *may* or *may not* have a null page ID.
-        *
-        * @param string $timestamp
-        * @return Revision|null
-        */
-       function getRevision( $timestamp ) {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $fields = [
-                       'ar_rev_id',
-                       'ar_text',
-                       'ar_comment',
-                       'ar_user',
-                       'ar_user_text',
-                       'ar_timestamp',
-                       'ar_minor_edit',
-                       'ar_flags',
-                       'ar_text_id',
-                       'ar_deleted',
-                       'ar_len',
-                       'ar_sha1',
-               ];
-
-               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
-                       $fields[] = 'ar_content_format';
-                       $fields[] = 'ar_content_model';
-               }
-
-               $row = $dbr->selectRow( 'archive',
-                       $fields,
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey(),
-                               'ar_timestamp' => $dbr->timestamp( $timestamp ) ],
-                       __METHOD__ );
-
-               if ( $row ) {
-                       return Revision::newFromArchiveRow( $row, [ 'title' => $this->title ] );
-               }
-
-               return null;
-       }
-
-       /**
-        * Return the most-previous revision, either live or deleted, against
-        * the deleted revision given by timestamp.
-        *
-        * May produce unexpected results in case of history merges or other
-        * unusual time issues.
-        *
-        * @param string $timestamp
-        * @return Revision|null Null when there is no previous revision
-        */
-       function getPreviousRevision( $timestamp ) {
-               $dbr = wfGetDB( DB_REPLICA );
-
-               // Check the previous deleted revision...
-               $row = $dbr->selectRow( 'archive',
-                       'ar_timestamp',
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey(),
-                               'ar_timestamp < ' .
-                                       $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
-                       __METHOD__,
-                       [
-                               'ORDER BY' => 'ar_timestamp DESC',
-                               'LIMIT' => 1 ] );
-               $prevDeleted = $row ? wfTimestamp( TS_MW, $row->ar_timestamp ) : false;
-
-               $row = $dbr->selectRow( [ 'page', 'revision' ],
-                       [ 'rev_id', 'rev_timestamp' ],
-                       [
-                               'page_namespace' => $this->title->getNamespace(),
-                               'page_title' => $this->title->getDBkey(),
-                               'page_id = rev_page',
-                               'rev_timestamp < ' .
-                                       $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ],
-                       __METHOD__,
-                       [
-                               'ORDER BY' => 'rev_timestamp DESC',
-                               'LIMIT' => 1 ] );
-               $prevLive = $row ? wfTimestamp( TS_MW, $row->rev_timestamp ) : false;
-               $prevLiveId = $row ? intval( $row->rev_id ) : null;
-
-               if ( $prevLive && $prevLive > $prevDeleted ) {
-                       // Most prior revision was live
-                       return Revision::newFromId( $prevLiveId );
-               } elseif ( $prevDeleted ) {
-                       // Most prior revision was deleted
-                       return $this->getRevision( $prevDeleted );
-               }
-
-               // No prior revision on this page.
-               return null;
-       }
-
-       /**
-        * Get the text from an archive row containing ar_text, ar_flags and ar_text_id
-        *
-        * @param object $row Database row
-        * @return string
-        */
-       function getTextFromRow( $row ) {
-               if ( is_null( $row->ar_text_id ) ) {
-                       // An old row from MediaWiki 1.4 or previous.
-                       // Text is embedded in this row in classic compression format.
-                       return Revision::getRevisionText( $row, 'ar_' );
-               }
-
-               // New-style: keyed to the text storage backend.
-               $dbr = wfGetDB( DB_REPLICA );
-               $text = $dbr->selectRow( 'text',
-                       [ 'old_text', 'old_flags' ],
-                       [ 'old_id' => $row->ar_text_id ],
-                       __METHOD__ );
-
-               return Revision::getRevisionText( $text );
-       }
-
-       /**
-        * Fetch (and decompress if necessary) the stored text of the most
-        * recently edited deleted revision of the page.
-        *
-        * If there are no archived revisions for the page, returns NULL.
-        *
-        * @return string|null
-        */
-       function getLastRevisionText() {
-               $dbr = wfGetDB( DB_REPLICA );
-               $row = $dbr->selectRow( 'archive',
-                       [ 'ar_text', 'ar_flags', 'ar_text_id' ],
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey() ],
-                       __METHOD__,
-                       [ 'ORDER BY' => 'ar_timestamp DESC' ] );
-
-               if ( $row ) {
-                       return $this->getTextFromRow( $row );
-               }
-
-               return null;
-       }
 
-       /**
-        * Quick check if any archived revisions are present for the page.
-        *
-        * @return bool
-        */
-       function isDeleted() {
-               $dbr = wfGetDB( DB_REPLICA );
-               $n = $dbr->selectField( 'archive', 'COUNT(ar_title)',
-                       [ 'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title' => $this->title->getDBkey() ],
-                       __METHOD__
-               );
-
-               return ( $n > 0 );
-       }
-
-       /**
-        * Restore the given (or all) text and file revisions for the page.
-        * Once restored, the items will be removed from the archive tables.
-        * The deletion log will be updated with an undeletion notice.
-        *
-        * This also sets Status objects, $this->fileStatus and $this->revisionStatus
-        * (depending what operations are attempted).
-        *
-        * @param array $timestamps Pass an empty array to restore all revisions,
-        *   otherwise list the ones to undelete.
-        * @param string $comment
-        * @param array $fileVersions
-        * @param bool $unsuppress
-        * @param User $user User performing the action, or null to use $wgUser
-        * @param string|string[] $tags Change tags to add to log entry
-        *   ($user should be able to add the specified tags before this is called)
-        * @return array(number of file revisions restored, number of image revisions
-        *   restored, log message) on success, false on failure.
-        */
-       function undelete( $timestamps, $comment = '', $fileVersions = [],
-               $unsuppress = false, User $user = null, $tags = null
-       ) {
-               // If both the set of text revisions and file revisions are empty,
-               // restore everything. Otherwise, just restore the requested items.
-               $restoreAll = empty( $timestamps ) && empty( $fileVersions );
-
-               $restoreText = $restoreAll || !empty( $timestamps );
-               $restoreFiles = $restoreAll || !empty( $fileVersions );
-
-               if ( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
-                       $img = wfLocalFile( $this->title );
-                       $img->load( File::READ_LATEST );
-                       $this->fileStatus = $img->restore( $fileVersions, $unsuppress );
-                       if ( !$this->fileStatus->isOK() ) {
-                               return false;
-                       }
-                       $filesRestored = $this->fileStatus->successCount;
-               } else {
-                       $filesRestored = 0;
-               }
-
-               if ( $restoreText ) {
-                       $this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
-                       if ( !$this->revisionStatus->isOK() ) {
-                               return false;
-                       }
-
-                       $textRestored = $this->revisionStatus->getValue();
-               } else {
-                       $textRestored = 0;
-               }
-
-               // Touch the log!
-
-               if ( $textRestored && $filesRestored ) {
-                       $reason = wfMessage( 'undeletedrevisions-files' )
-                               ->numParams( $textRestored, $filesRestored )->inContentLanguage()->text();
-               } elseif ( $textRestored ) {
-                       $reason = wfMessage( 'undeletedrevisions' )->numParams( $textRestored )
-                               ->inContentLanguage()->text();
-               } elseif ( $filesRestored ) {
-                       $reason = wfMessage( 'undeletedfiles' )->numParams( $filesRestored )
-                               ->inContentLanguage()->text();
-               } else {
-                       wfDebug( "Undelete: nothing undeleted...\n" );
-
-                       return false;
-               }
-
-               if ( trim( $comment ) != '' ) {
-                       $reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
-               }
-
-               if ( $user === null ) {
-                       global $wgUser;
-                       $user = $wgUser;
-               }
-
-               $logEntry = new ManualLogEntry( 'delete', 'restore' );
-               $logEntry->setPerformer( $user );
-               $logEntry->setTarget( $this->title );
-               $logEntry->setComment( $reason );
-               $logEntry->setTags( $tags );
-
-               Hooks::run( 'ArticleUndeleteLogEntry', [ $this, &$logEntry, $user ] );
-
-               $logid = $logEntry->insert();
-               $logEntry->publish( $logid );
-
-               return [ $textRestored, $filesRestored, $reason ];
-       }
-
-       /**
-        * This is the meaty bit -- It restores archived revisions of the given page
-        * to the revision table.
-        *
-        * @param array $timestamps Pass an empty array to restore all revisions,
-        *   otherwise list the ones to undelete.
-        * @param bool $unsuppress Remove all ar_deleted/fa_deleted restrictions of seletected revs
-        * @param string $comment
-        * @throws ReadOnlyError
-        * @return Status Status object containing the number of revisions restored on success
-        */
-       private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
-               if ( wfReadOnly() ) {
-                       throw new ReadOnlyError();
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->startAtomic( __METHOD__ );
-
-               $restoreAll = empty( $timestamps );
-
-               # Does this page already exist? We'll have to update it...
-               $article = WikiPage::factory( $this->title );
-               # Load latest data for the current page (bug 31179)
-               $article->loadPageData( 'fromdbmaster' );
-               $oldcountable = $article->isCountable();
-
-               $page = $dbw->selectRow( 'page',
-                       [ 'page_id', 'page_latest' ],
-                       [ 'page_namespace' => $this->title->getNamespace(),
-                               'page_title' => $this->title->getDBkey() ],
-                       __METHOD__,
-                       [ 'FOR UPDATE' ] // lock page
-               );
-
-               if ( $page ) {
-                       $makepage = false;
-                       # Page already exists. Import the history, and if necessary
-                       # we'll update the latest revision field in the record.
-
-                       # Get the time span of this page
-                       $previousTimestamp = $dbw->selectField( 'revision', 'rev_timestamp',
-                               [ 'rev_id' => $page->page_latest ],
-                               __METHOD__ );
-
-                       if ( $previousTimestamp === false ) {
-                               wfDebug( __METHOD__ . ": existing page refers to a page_latest that does not exist\n" );
-
-                               $status = Status::newGood( 0 );
-                               $status->warning( 'undeleterevision-missing' );
-                               $dbw->endAtomic( __METHOD__ );
-
-                               return $status;
-                       }
-               } else {
-                       # Have to create a new article...
-                       $makepage = true;
-                       $previousTimestamp = 0;
-               }
-
-               $oldWhere = [
-                       'ar_namespace' => $this->title->getNamespace(),
-                       'ar_title' => $this->title->getDBkey(),
-               ];
-               if ( !$restoreAll ) {
-                       $oldWhere['ar_timestamp'] = array_map( [ &$dbw, 'timestamp' ], $timestamps );
-               }
-
-               $fields = [
-                       'ar_id',
-                       'ar_rev_id',
-                       'rev_id',
-                       'ar_text',
-                       'ar_comment',
-                       'ar_user',
-                       'ar_user_text',
-                       'ar_timestamp',
-                       'ar_minor_edit',
-                       'ar_flags',
-                       'ar_text_id',
-                       'ar_deleted',
-                       'ar_page_id',
-                       'ar_len',
-                       'ar_sha1'
-               ];
-
-               if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
-                       $fields[] = 'ar_content_format';
-                       $fields[] = 'ar_content_model';
-               }
-
-               /**
-                * Select each archived revision...
-                */
-               $result = $dbw->select(
-                       [ 'archive', 'revision' ],
-                       $fields,
-                       $oldWhere,
-                       __METHOD__,
-                       /* options */
-                       [ 'ORDER BY' => 'ar_timestamp' ],
-                       [ 'revision' => [ 'LEFT JOIN', 'ar_rev_id=rev_id' ] ]
-               );
-
-               $rev_count = $result->numRows();
-               if ( !$rev_count ) {
-                       wfDebug( __METHOD__ . ": no revisions to restore\n" );
-
-                       $status = Status::newGood( 0 );
-                       $status->warning( "undelete-no-results" );
-                       $dbw->endAtomic( __METHOD__ );
-
-                       return $status;
-               }
-
-               // We use ar_id because there can be duplicate ar_rev_id even for the same
-               // page.  In this case, we may be able to restore the first one.
-               $restoreFailedArIds = [];
-
-               // Map rev_id to the ar_id that is allowed to use it.  When checking later,
-               // if it doesn't match, the current ar_id can not be restored.
-
-               // Value can be an ar_id or -1 (-1 means no ar_id can use it, since the
-               // rev_id is taken before we even start the restore).
-               $allowedRevIdToArIdMap = [];
-
-               $latestRestorableRow = null;
-
-               foreach ( $result as $row ) {
-                       if ( $row->ar_rev_id ) {
-                               // rev_id is taken even before we start restoring.
-                               if ( $row->ar_rev_id === $row->rev_id ) {
-                                       $restoreFailedArIds[] = $row->ar_id;
-                                       $allowedRevIdToArIdMap[$row->ar_rev_id] = -1;
-                               } else {
-                                       // rev_id is not taken yet in the DB, but it might be taken
-                                       // by a prior revision in the same restore operation. If
-                                       // not, we need to reserve it.
-                                       if ( isset( $allowedRevIdToArIdMap[$row->ar_rev_id] ) ) {
-                                               $restoreFailedArIds[] = $row->ar_id;
-                                       } else {
-                                               $allowedRevIdToArIdMap[$row->ar_rev_id] = $row->ar_id;
-                                               $latestRestorableRow = $row;
-                                       }
-                               }
-                       } else {
-                               // If ar_rev_id is null, there can't be a collision, and a
-                               // rev_id will be chosen automatically.
-                               $latestRestorableRow = $row;
-                       }
-               }
-
-               $result->seek( 0 ); // move back
-
-               $oldPageId = 0;
-               if ( $latestRestorableRow !== null ) {
-                       $oldPageId = (int)$latestRestorableRow->ar_page_id; // pass this to ArticleUndelete hook
-
-                       // grab the content to check consistency with global state before restoring the page.
-                       $revision = Revision::newFromArchiveRow( $latestRestorableRow,
-                               [
-                                       'title' => $article->getTitle(), // used to derive default content model
-                               ]
-                       );
-                       $user = User::newFromName( $revision->getUserText( Revision::RAW ), false );
-                       $content = $revision->getContent( Revision::RAW );
-
-                       // NOTE: article ID may not be known yet. prepareSave() should not modify the database.
-                       $status = $content->prepareSave( $article, 0, -1, $user );
-                       if ( !$status->isOK() ) {
-                               $dbw->endAtomic( __METHOD__ );
-
-                               return $status;
-                       }
-               }
-
-               $newid = false; // newly created page ID
-               $restored = 0; // number of revisions restored
-               /** @var Revision $revision */
-               $revision = null;
-
-               // If there are no restorable revisions, we can skip most of the steps.
-               if ( $latestRestorableRow === null ) {
-                       $failedRevisionCount = $rev_count;
-               } else {
-                       if ( $makepage ) {
-                               // Check the state of the newest to-be version...
-                               if ( !$unsuppress
-                                       && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
-                               ) {
-                                       $dbw->endAtomic( __METHOD__ );
-
-                                       return Status::newFatal( "undeleterevdel" );
-                               }
-                               // Safe to insert now...
-                               $newid = $article->insertOn( $dbw, $latestRestorableRow->ar_page_id );
-                               if ( $newid === false ) {
-                                       // The old ID is reserved; let's pick another
-                                       $newid = $article->insertOn( $dbw );
-                               }
-                               $pageId = $newid;
-                       } else {
-                               // Check if a deleted revision will become the current revision...
-                               if ( $latestRestorableRow->ar_timestamp > $previousTimestamp ) {
-                                       // Check the state of the newest to-be version...
-                                       if ( !$unsuppress
-                                               && ( $latestRestorableRow->ar_deleted & Revision::DELETED_TEXT )
-                                       ) {
-                                               $dbw->endAtomic( __METHOD__ );
-
-                                               return Status::newFatal( "undeleterevdel" );
-                                       }
-                               }
-
-                               $newid = false;
-                               $pageId = $article->getId();
-                       }
-
-                       foreach ( $result as $row ) {
-                               // Check for key dupes due to needed archive integrity.
-                               if ( $row->ar_rev_id && $allowedRevIdToArIdMap[$row->ar_rev_id] !== $row->ar_id ) {
-                                       continue;
-                               }
-                               // Insert one revision at a time...maintaining deletion status
-                               // unless we are specifically removing all restrictions...
-                               $revision = Revision::newFromArchiveRow( $row,
-                                       [
-                                               'page' => $pageId,
-                                               'title' => $this->title,
-                                               'deleted' => $unsuppress ? 0 : $row->ar_deleted
-                                       ] );
-
-                               $revision->insertOn( $dbw );
-                               $restored++;
-
-                               Hooks::run( 'ArticleRevisionUndeleted',
-                                       [ &$this->title, $revision, $row->ar_page_id ] );
-                       }
-
-                       // Now that it's safely stored, take it out of the archive
-                       // Don't delete rows that we failed to restore
-                       $toDeleteConds = $oldWhere;
-                       $failedRevisionCount = count( $restoreFailedArIds );
-                       if ( $failedRevisionCount > 0 ) {
-                               $toDeleteConds[] = 'ar_id NOT IN ( ' . $dbw->makeList( $restoreFailedArIds ) . ' )';
-                       }
-
-                       $dbw->delete( 'archive',
-                               $toDeleteConds,
-                               __METHOD__ );
-               }
-
-               $status = Status::newGood( $restored );
-
-               if ( $failedRevisionCount > 0 ) {
-                       $status->warning(
-                               wfMessage( 'undeleterevision-duplicate-revid', $failedRevisionCount ) );
-               }
-
-               // Was anything restored at all?
-               if ( $restored ) {
-                       $created = (bool)$newid;
-                       // Attach the latest revision to the page...
-                       $wasnew = $article->updateIfNewerOn( $dbw, $revision );
-                       if ( $created || $wasnew ) {
-                               // Update site stats, link tables, etc
-                               $article->doEditUpdates(
-                                       $revision,
-                                       User::newFromName( $revision->getUserText( Revision::RAW ), false ),
-                                       [
-                                               'created' => $created,
-                                               'oldcountable' => $oldcountable,
-                                               'restored' => true
-                                       ]
-                               );
-                       }
-
-                       Hooks::run( 'ArticleUndelete', [ &$this->title, $created, $comment, $oldPageId ] );
-                       if ( $this->title->getNamespace() == NS_FILE ) {
-                               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->title, 'imagelinks' ) );
-                       }
-               }
-
-               $dbw->endAtomic( __METHOD__ );
-
-               return $status;
-       }
-
-       /**
-        * @return Status
-        */
-       function getFileStatus() {
-               return $this->fileStatus;
-       }
-
-       /**
-        * @return Status
-        */
-       function getRevisionStatus() {
-               return $this->revisionStatus;
-       }
-}
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 /**
  * Special page allowing users with the appropriate permissions to view
@@ -767,6 +46,10 @@ class SpecialUndelete extends SpecialPage {
 
        /** @var Title */
        private $mTargetObj;
+       /**
+        * @var string Search prefix
+        */
+       private $mSearchPrefix;
 
        function __construct() {
                parent::__construct( 'Undelete', 'deletedhistory' );
@@ -957,6 +240,7 @@ class SpecialUndelete extends SpecialPage {
                        Xml::openElement( 'form', [ 'method' => 'get', 'action' => wfScript() ] ) .
                                Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
                                Html::hidden( 'title', $this->getPageTitle()->getPrefixedDBkey() ) .
+                               Html::hidden( 'fuzzy', $this->getRequest()->getVal( 'fuzzy' ) ) .
                                Html::rawElement(
                                        'label',
                                        [ 'for' => 'prefix' ],
@@ -967,15 +251,25 @@ class SpecialUndelete extends SpecialPage {
                                        20,
                                        $this->mSearchPrefix,
                                        [ 'id' => 'prefix', 'autofocus' => '' ]
-                               ) . ' ' .
-                               Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
+                               ) .
+                               ' ' .
+                               Xml::submitButton(
+                                       $this->msg( 'undelete-search-submit' )->text(),
+                                       [ 'id' => 'searchUndelete' ]
+                               ) .
                                Xml::closeElement( 'fieldset' ) .
                                Xml::closeElement( 'form' )
                );
 
                # List undeletable articles
                if ( $this->mSearchPrefix ) {
-                       $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix );
+                       // For now, we enable search engine match only when specifically asked to
+                       // by using fuzzy=1 parameter.
+                       if ( $this->getRequest()->getVal( "fuzzy", false ) ) {
+                               $result = PageArchive::listPagesBySearch( $this->mSearchPrefix );
+                       } else {
+                               $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix );
+                       }
                        $this->showList( $result );
                }
        }
@@ -999,7 +293,7 @@ class SpecialUndelete extends SpecialPage {
 
                $linkRenderer = $this->getLinkRenderer();
                $undelete = $this->getPageTitle();
-               $out->addHTML( "<ul>\n" );
+               $out->addHTML( "<ul id='undeleteResultsList'>\n" );
                foreach ( $result as $row ) {
                        $title = Title::makeTitleSafe( $row->ar_namespace, $row->ar_title );
                        if ( $title !== null ) {
@@ -1022,7 +316,7 @@ class SpecialUndelete extends SpecialPage {
                                );
                        }
                        $revs = $this->msg( 'undeleterevisions' )->numParams( $row->count )->parse();
-                       $out->addHTML( "<li>{$item} ({$revs})</li>\n" );
+                       $out->addHTML( "<li class='undeleteResult'>{$item} ({$revs})</li>\n" );
                }
                $result->free();
                $out->addHTML( "</ul>\n" );
index ec39ccf..1469742 100644 (file)
@@ -55,7 +55,7 @@ class UnusedCategoriesPage extends QueryPage {
        }
 
        /**
-        * A should come before Z (bug 30907)
+        * A should come before Z (T32907)
         * @return bool
         */
        function sortDescending() {
index 96878a3..fea7e21 100644 (file)
@@ -24,6 +24,9 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A special page that displays a list of pages that are not on anyones watchlist.
  *
index 8478e94..b0bb595 100644 (file)
@@ -327,7 +327,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                header( "Content-Type: $contentType", true );
                header( 'Content-Transfer-Encoding: binary', true );
                header( 'Expires: Sun, 17-Jan-2038 19:14:07 GMT', true );
-               // Bug 53032 - It shouldn't be a problem here, but let's be safe and not cache
+               // T55032 - It shouldn't be a problem here, but let's be safe and not cache
                header( 'Cache-Control: private' );
                header( "Content-Length: $size", true );
        }
index c067f44..a9b732e 100644 (file)
@@ -38,7 +38,7 @@ class SpecialUserLogout extends UnlistedSpecialPage {
        function execute( $par ) {
                /**
                 * Some satellite ISPs use broken precaching schemes that log people out straight after
-                * they're logged in (bug 17790). Luckily, there's a way to detect such requests.
+                * they're logged in (T19790). Luckily, there's a way to detect such requests.
                 */
                if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '&amp;' ) !== false ) {
                        wfDebug( "Special:UserLogout request {$_SERVER['REQUEST_URI']} looks suspicious, denying.\n" );
index 454d1e3..002b47c 100644 (file)
@@ -170,8 +170,8 @@ class UserrightsPage extends SpecialPage {
                        }
 
                        $targetUser = $this->mFetchedUser;
-                       if ( $targetUser instanceof User ) { // UserRightsProxy doesn't have this method (bug 61252)
-                               $targetUser->clearInstanceCache(); // bug 38989
+                       if ( $targetUser instanceof User ) { // UserRightsProxy doesn't have this method (T63252)
+                               $targetUser->clearInstanceCache(); // T40989
                        }
 
                        if ( $request->getVal( 'conflictcheck-originalgroups' )
@@ -215,7 +215,7 @@ class UserrightsPage extends SpecialPage {
         * @return bool
         */
        public function canProcessExpiries() {
-               return !$this->getConfig()->get( 'DisableUserGroupExpiry' );
+               return true;
        }
 
        /**
@@ -387,7 +387,8 @@ class UserrightsPage extends SpecialPage {
                $user->invalidateCache();
 
                // update groups in external authentication database
-               Hooks::run( 'UserGroupsChanged', [ $user, $add, $remove, $this->getUser(), $reason ] );
+               Hooks::run( 'UserGroupsChanged', [ $user, $add, $remove, $this->getUser(),
+                       $reason, $oldUGMs, $newUGMs ] );
                MediaWiki\Auth\AuthManager::callLegacyAuthPlugin(
                        'updateExternalDBGroups', [ $user, $add, $remove ]
                );
index 708eced..caa0e1f 100644 (file)
@@ -732,7 +732,9 @@ class SpecialVersion extends SpecialPage {
                                }
                        }
                        $cache = wfGetCache( CACHE_ANYTHING );
-                       $memcKey = wfMemcKey( 'specialversion-ext-version-text', $extension['path'], $this->coreId );
+                       $memcKey = $cache->makeKey(
+                               'specialversion-ext-version-text', $extension['path'], $this->coreId
+                       );
                        list( $vcsVersion, $vcsLink, $vcsDate ) = $cache->get( $memcKey );
 
                        if ( !$vcsVersion ) {
index 74d5e5d..6d481f8 100644 (file)
@@ -83,7 +83,7 @@ class WantedFilesPage extends WantedQueryPage {
         * KLUGE: The results may contain false positives for files
         * that exist e.g. in a shared repo.  Setting this at least
         * keeps them from showing up as redlinks in the output, even
-        * if it doesn't fix the real problem (bug 6220).
+        * if it doesn't fix the real problem (T8220).
         *
         * @note could also have existing links here from broken file
         * redirects.
index 85ac2de..e9d3f26 100644 (file)
@@ -22,6 +22,8 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that lists last changes made to the wiki,
@@ -79,6 +81,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                if ( ( $config->get( 'EnotifWatchlist' ) || $config->get( 'ShowUpdatedMarker' ) )
                        && $request->getVal( 'reset' )
                        && $request->wasPosted()
+                       && $user->matchEditToken( $request->getVal( 'token' ) )
                ) {
                        $user->clearAllNotifications();
                        $output->redirect( $this->getPageTitle()->getFullURL( $opts->getChangedValues() ) );
@@ -103,6 +106,58 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                ];
        }
 
+       /**
+        * @inheritdoc
+        */
+       protected function transformFilterDefinition( array $filterDefinition ) {
+               if ( isset( $filterDefinition['showHideSuffix'] ) ) {
+                       $filterDefinition['showHide'] = 'wl' . $filterDefinition['showHideSuffix'];
+               }
+
+               return $filterDefinition;
+       }
+
+       /**
+        * @inheritdoc
+        */
+       protected function registerFilters() {
+               parent::registerFilters();
+
+               $user = $this->getUser();
+
+               $significance = $this->getFilterGroup( 'significance' );
+               $hideMinor = $significance->getFilter( 'hideminor' );
+               $hideMinor->setDefault( $user->getBoolOption( 'watchlisthideminor' ) );
+
+               $automated = $this->getFilterGroup( 'automated' );
+               $hideBots = $automated->getFilter( 'hidebots' );
+               $hideBots->setDefault( $user->getBoolOption( 'watchlisthidebots' ) );
+
+               $registration = $this->getFilterGroup( 'registration' );
+               $hideAnons = $registration->getFilter( 'hideanons' );
+               $hideAnons->setDefault( $user->getBoolOption( 'watchlisthideanons' ) );
+               $hideLiu = $registration->getFilter( 'hideliu' );
+               $hideLiu->setDefault( $user->getBoolOption( 'watchlisthideliu' ) );
+
+               $reviewStatus = $this->getFilterGroup( 'reviewStatus' );
+               if ( $reviewStatus !== null ) {
+                       // Conditional on feature being available and rights
+                       $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
+                       $hidePatrolled->setDefault( $user->getBoolOption( 'watchlisthidepatrolled' ) );
+               }
+
+               $authorship = $this->getFilterGroup( 'authorship' );
+               $hideMyself = $authorship->getFilter( 'hidemyself' );
+               $hideMyself->setDefault( $user->getBoolOption( 'watchlisthideown' ) );
+
+               $changeType = $this->getFilterGroup( 'changeType' );
+               $hideCategorization = $changeType->getFilter( 'hidecategorization' );
+               if ( $hideCategorization !== null ) {
+                       // Conditional on feature being available
+                       $hideCategorization->setDefault( $user->getBoolOption( 'watchlisthidecategorization' ) );
+               }
+       }
+
        /**
         * Get a FormOptions object containing the default options
         *
@@ -114,18 +169,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $opts->add( 'days', $user->getOption( 'watchlistdays' ), FormOptions::FLOAT );
                $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) );
-               if ( $this->getRequest()->getVal( 'action' ) == 'submit' ) {
-                       // The user has submitted the form, so we dont need the default values
-                       return $opts;
-               }
-
-               $opts->add( 'hideminor', $user->getBoolOption( 'watchlisthideminor' ) );
-               $opts->add( 'hidebots', $user->getBoolOption( 'watchlisthidebots' ) );
-               $opts->add( 'hideanons', $user->getBoolOption( 'watchlisthideanons' ) );
-               $opts->add( 'hideliu', $user->getBoolOption( 'watchlisthideliu' ) );
-               $opts->add( 'hidepatrolled', $user->getBoolOption( 'watchlisthidepatrolled' ) );
-               $opts->add( 'hidemyself', $user->getBoolOption( 'watchlisthideown' ) );
-               $opts->add( 'hidecategorization', $user->getBoolOption( 'watchlisthidecategorization' ) );
 
                return $opts;
        }
@@ -171,6 +214,26 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        }
                }
 
+               if ( $this->getRequest()->getVal( 'action' ) == 'submit' ) {
+                       $allBooleansFalse = [];
+
+                       // If the user submitted the form, start with a baseline of "all
+                       // booleans are false", then change the ones they checked.  This
+                       // means we ignore the defaults.
+
+                       // This is how we handle the fact that HTML forms don't submit
+                       // unchecked boxes.
+                       foreach ( $this->filterGroups as $filterGroup ) {
+                               if ( $filterGroup instanceof ChangesListBooleanFilterGroup ) {
+                                       foreach ( $filterGroup->getFilters() as $filter ) {
+                                               $allBooleansFalse[$filter->getName()] = false;
+                                       }
+                               }
+                       }
+
+                       $params = $params + $allBooleansFalse;
+               }
+
                // Not the prettiest way to achieve this… FormOptions internally depends on data sanitization
                // methods defined on WebRequest and removing this dependency would cause some code duplication.
                $request = new DerivativeRequest( $this->getRequest(), $params );
@@ -180,32 +243,28 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        }
 
        /**
-        * Return an array of conditions depending of options set in $opts
-        *
-        * @param FormOptions $opts
-        * @return array
+        * @inheritdoc
         */
-       public function buildMainQueryConds( FormOptions $opts ) {
+       protected function buildQuery( &$tables, &$fields, &$conds, &$query_options,
+               &$join_conds, FormOptions $opts ) {
+
                $dbr = $this->getDB();
-               $conds = parent::buildMainQueryConds( $opts );
+               parent::buildQuery( $tables, $fields, $conds, $query_options, $join_conds,
+                       $opts );
 
                // Calculate cutoff
                if ( $opts['days'] > 0 ) {
                        $conds[] = 'rc_timestamp > ' .
                                $dbr->addQuotes( $dbr->timestamp( time() - intval( $opts['days'] * 86400 ) ) );
                }
-
-               return $conds;
        }
 
        /**
-        * Process the query
-        *
-        * @param array $conds
-        * @param FormOptions $opts
-        * @return bool|ResultWrapper Result or false (for Recentchangeslinked only)
+        * @inheritdoc
         */
-       public function doMainQuery( $conds, $opts ) {
+       protected function doMainQuery( $tables, $fields, $conds, $query_options,
+               $join_conds, FormOptions $opts ) {
+
                $dbr = $this->getDB();
                $user = $this->getUser();
 
@@ -230,19 +289,23 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $usePage = true;
                }
 
-               $tables = [ 'recentchanges', 'watchlist' ];
-               $fields = RecentChange::selectFields();
-               $query_options = [ 'ORDER BY' => 'rc_timestamp DESC' ];
-               $join_conds = [
-                       'watchlist' => [
-                               'INNER JOIN',
-                               [
-                                       'wl_user' => $user->getId(),
-                                       'wl_namespace=rc_namespace',
-                                       'wl_title=rc_title'
+               $tables = array_merge( [ 'recentchanges', 'watchlist' ], $tables );
+               $fields = array_merge( RecentChange::selectFields(), $fields );
+
+               $query_options = array_merge( [ 'ORDER BY' => 'rc_timestamp DESC' ], $query_options );
+               $join_conds = array_merge(
+                       [
+                               'watchlist' => [
+                                       'INNER JOIN',
+                                       [
+                                               'wl_user' => $user->getId(),
+                                               'wl_namespace=rc_namespace',
+                                               'wl_title=rc_title'
+                                       ],
                                ],
                        ],
-               ];
+                       $join_conds
+               );
 
                if ( $this->getConfig()->get( 'ShowUpdatedMarker' ) ) {
                        $fields[] = 'wl_notificationtimestamp';
@@ -360,7 +423,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $dbr->dataSeek( $rows, 0 );
 
-               $list = ChangesList::newFromContext( $this->getContext() );
+               $list = ChangesList::newFromContext( $this->getContext(), $this->filterGroups );
                $list->setWatchlistDivs();
                $list->initChangesListRows( $rows );
                $dbr->dataSeek( $rows, 0 );
@@ -447,31 +510,23 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $cutofflinks = $this->msg( 'wlshowtime' ) . ' ' . $this->cutoffselector( $opts );
 
                # Spit out some control panel links
-               $filters = [
-                       'hideminor' => 'wlshowhideminor',
-                       'hidebots' => 'wlshowhidebots',
-                       'hideanons' => 'wlshowhideanons',
-                       'hideliu' => 'wlshowhideliu',
-                       'hidemyself' => 'wlshowhidemine',
-                       'hidepatrolled' => 'wlshowhidepatr'
-               ];
-
-               if ( $this->getConfig()->get( 'RCWatchCategoryMembership' ) ) {
-                       $filters['hidecategorization'] = 'wlshowhidecategorization';
-               }
-
-               foreach ( $this->getRenderableCustomFilters( $this->getCustomFilters() ) as $key => $params ) {
-                       $filters[$key] = $params['msg'];
-               }
-
-               // Disable some if needed
-               if ( !$user->useRCPatrol() ) {
-                       unset( $filters['hidepatrolled'] );
-               }
-
                $links = [];
-               foreach ( $filters as $name => $msg ) {
-                       $links[] = $this->showHideCheck( $nondefaults, $msg, $name, $opts[$name] );
+               $context = $this->getContext();
+               $namesOfDisplayedFilters = [];
+               foreach ( $this->getFilterGroups() as $groupName => $group ) {
+                       if ( !$group->isPerGroupRequestParameter() ) {
+                               foreach ( $group->getFilters() as $filterName => $filter ) {
+                                       if ( $filter->displaysOnUnstructuredUi( $this ) ) {
+                                               $namesOfDisplayedFilters[] = $filterName;
+                                               $links[] = $this->showHideCheck(
+                                                       $nondefaults,
+                                                       $filter->getShowHide(),
+                                                       $filterName,
+                                                       $opts[$filterName]
+                                               );
+                                       }
+                               }
+                       }
                }
 
                $hiddenFields = $nondefaults;
@@ -480,8 +535,8 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                unset( $hiddenFields['invert'] );
                unset( $hiddenFields['associated'] );
                unset( $hiddenFields['days'] );
-               foreach ( $filters as $key => $value ) {
-                       unset( $hiddenFields[$key] );
+               foreach ( $namesOfDisplayedFilters as $filterName ) {
+                       unset( $hiddenFields[$filterName] );
                }
 
                # Create output
@@ -606,6 +661,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                                'id' => 'mw-watchlist-resetbutton' ] ) . "\n" .
                        Xml::submitButton( $this->msg( 'enotif_reset' )->text(),
                                [ 'name' => 'mw-watchlist-reset-submit' ] ) . "\n" .
+                       Html::hidden( 'token', $user->getEditToken() ) . "\n" .
                        Html::hidden( 'reset', 'all' ) . "\n";
                        foreach ( $nondefaults as $key => $value ) {
                                $form .= Html::hidden( $key, $value ) . "\n";
index 439b6ab..6f91c46 100644 (file)
@@ -21,6 +21,8 @@
  * @todo Use some variant of Pager or something; the pagination here is lousy.
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Implements Special:Whatlinkshere
  *
index f853f41..cfcbf65 100644 (file)
@@ -89,7 +89,7 @@ class LoginHelper extends ContextSource {
                }
 
                if ( $type === 'successredirect' ) {
-                       $redirectUrl = $returnToTitle->getFullURL( $returnToQuery, false, $proto );
+                       $redirectUrl = $returnToTitle->getFullUrlForRedirect( $returnToQuery, $proto );
                        $this->getOutput()->redirect( $redirectUrl );
                } else {
                        $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery, null, $options );
index 0d6f493..e2f4d4b 100644 (file)
@@ -101,9 +101,7 @@ class ActiveUsersPager extends UsersPager {
                        $tables[] = 'user_groups';
                        $conds[] = 'ug_user = user_id';
                        $conds['ug_group'] = $this->groups;
-                       if ( !$this->getConfig()->get( 'DisableUserGroupExpiry' ) ) {
-                               $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() );
-                       }
+                       $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() );
                }
                if ( $this->excludegroups !== [] ) {
                        foreach ( $this->excludegroups as $group ) {
@@ -111,9 +109,7 @@ class ActiveUsersPager extends UsersPager {
                                        'user_groups', '1', [
                                                'ug_user = user_id',
                                                'ug_group' => $group,
-                                               $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
-                                                       '1' :
-                                                       'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
+                                               'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
                                        ]
                                ) . ')';
                        }
index efc51ef..ca1b7dc 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Pager
  */
 
+use Wikimedia\Rdbms\FakeResultWrapper;
+
 /**
  * Use TablePager for prettified output. We have to pretend that we're
  * getting data from a table when in fact not all of it comes from the database.
index a4124db..9a447ef 100644 (file)
@@ -23,6 +23,7 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
 
 class BlockListPager extends TablePager {
 
index a4740a4..e583108 100644 (file)
@@ -24,6 +24,9 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 class ContribsPager extends ReverseChronologicalPager {
 
@@ -42,6 +45,11 @@ class ContribsPager extends ReverseChronologicalPager {
         */
        protected $mParentLens;
 
+       /**
+        * @var TemplateParser
+        */
+       protected $templateParser;
+
        function __construct( IContextSource $context, array $options ) {
                parent::__construct( $context );
 
@@ -77,6 +85,7 @@ class ContribsPager extends ReverseChronologicalPager {
                // queries should use a regular replica DB since the lookup pattern is not all by user.
                $this->mDbSecondary = wfGetDB( DB_REPLICA ); // any random replica DB
                $this->mDb = wfGetDB( DB_REPLICA, 'contributions' );
+               $this->templateParser = new TemplateParser();
        }
 
        function getDefaultQuery() {
@@ -160,7 +169,7 @@ class ContribsPager extends ReverseChronologicalPager {
                $user = $this->getUser();
                $conds = array_merge( $userCond, $this->getNamespaceCond() );
 
-               // Paranoia: avoid brute force searches (bug 17342)
+               // Paranoia: avoid brute force searches (T19342)
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0';
                } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
@@ -225,10 +234,8 @@ class ContribsPager extends ReverseChronologicalPager {
                                        'LEFT JOIN', [
                                                'ug_user = rev_user',
                                                'ug_group' => $groupsWithBotPermission,
-                                               $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
-                                                       '1' :
-                                                       'ug_expiry IS NULL OR ug_expiry >= ' .
-                                                               $this->mDb->addQuotes( $this->mDb->timestamp() )
+                                               'ug_expiry IS NULL OR ug_expiry >= ' .
+                                                       $this->mDb->addQuotes( $this->mDb->timestamp() )
                                        ]
                                ];
                        }
@@ -420,7 +427,7 @@ class ContribsPager extends ReverseChronologicalPager {
 
                        if ( $row->rev_parent_id === null ) {
                                // For some reason rev_parent_id isn't populated for this row.
-                               // Its rumoured this is true on wikipedia for some revisions (bug 34922).
+                               // Its rumoured this is true on wikipedia for some revisions (T36922).
                                // Next best thing is to have the total number of bytes.
                                $chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
                                $chardiff .= Linker::formatRevisionSize( $row->rev_len );
@@ -514,8 +521,7 @@ class ContribsPager extends ReverseChronologicalPager {
                                        $this->msg( 'rev-deleted-user-contribs' )->escaped();
                        }
 
-                       $templateParser = new TemplateParser();
-                       $ret = $templateParser->processTemplate(
+                       $ret = $this->templateParser->processTemplate(
                                'SpecialContributionsLine',
                                $templateParams
                        );
index 9ffcce9..78e1092 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 class DeletedContribsPager extends IndexPager {
 
@@ -59,7 +61,7 @@ class DeletedContribsPager extends IndexPager {
                list( $index, $userCond ) = $this->getUserCond();
                $conds = array_merge( $userCond, $this->getNamespaceCond() );
                $user = $this->getUser();
-               // Paranoia: avoid brute force searches (bug 17792)
+               // Paranoia: avoid brute force searches (T19792)
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0';
                } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
@@ -127,7 +129,7 @@ class DeletedContribsPager extends IndexPager {
                $condition = [];
 
                $condition['ar_user_text'] = $this->target;
-               $index = 'usertext_timestamp';
+               $index = 'ar_usertext_timestamp';
 
                return [ $index, $condition ];
        }
index 59dea02..47b059b 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 class ImageListPager extends TablePager {
 
@@ -191,7 +193,8 @@ class ImageListPager extends TablePager {
                }
                $sortable = [ 'img_timestamp', 'img_name', 'img_size' ];
                /* For reference, the indicies we can use for sorting are:
-                * On the image table: img_usertext_timestamp, img_size, img_timestamp
+                * On the image table: img_user_timestamp, img_usertext_timestamp,
+                * img_size, img_timestamp
                 * On oldimage: oi_usertext_timestamp, oi_name_timestamp
                 *
                 * In particular that means we cannot sort by timestamp when not filtering
@@ -449,7 +452,7 @@ class ImageListPager extends TablePager {
                                        $imgfile = $this->msg( 'imgfile' )->text();
                                }
 
-                               // Weird files can maybe exist? Bug 22227
+                               // Weird files can maybe exist? T24227
                                $filePage = Title::makeTitleSafe( NS_FILE, $value );
                                if ( $filePage ) {
                                        $link = $linkRenderer->makeKnownLink(
index 4bf5dff..cce0323 100644 (file)
@@ -24,7 +24,7 @@
  */
 use MediaWiki\MediaWikiServices;
 
-class NewFilesPager extends ReverseChronologicalPager {
+class NewFilesPager extends RangeChronologicalPager {
 
        /**
         * @var ImageGalleryBase
@@ -41,11 +41,20 @@ class NewFilesPager extends ReverseChronologicalPager {
         * @param FormOptions $opts
         */
        function __construct( IContextSource $context, FormOptions $opts ) {
-               $this->opts = $opts;
+               parent::__construct( $context );
 
+               $this->opts = $opts;
                $this->setLimit( $opts->getValue( 'limit' ) );
 
-               parent::__construct( $context );
+               $startTimestamp = '';
+               $endTimestamp = '';
+               if ( $opts->getValue( 'start' ) ) {
+                       $startTimestamp = $opts->getValue( 'start' ) . ' 00:00:00';
+               }
+               if ( $opts->getValue( 'end' ) ) {
+                       $endTimestamp = $opts->getValue( 'end' ) . ' 23:59:59';
+               }
+               $this->getDateRangeCond( $startTimestamp, $endTimestamp );
        }
 
        function getQueryInfo() {
@@ -55,6 +64,16 @@ class NewFilesPager extends ReverseChronologicalPager {
                $fields = [ 'img_name', 'img_user', 'img_timestamp' ];
                $options = [];
 
+               $user = $opts->getValue( 'user' );
+               if ( $user !== '' ) {
+                       $userId = User::idFromName( $user );
+                       if ( $userId ) {
+                               $conds['img_user'] = $userId;
+                       } else {
+                               $conds['img_user_text'] = $user;
+                       }
+               }
+
                if ( !$opts->getValue( 'showbots' ) ) {
                        $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
 
@@ -67,9 +86,7 @@ class NewFilesPager extends ReverseChronologicalPager {
                                        [
                                                'ug_group' => $groupsWithBotPermission,
                                                'ug_user = img_user',
-                                               $this->getConfig()->get( 'DisableUserGroupExpiry' ) ?
-                                                       '1' :
-                                                       'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
+                                               'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
                                        ]
                                ];
                        }
diff --git a/includes/specials/pagers/ProtectedPagesPager.php b/includes/specials/pagers/ProtectedPagesPager.php
new file mode 100644 (file)
index 0000000..45dced8
--- /dev/null
@@ -0,0 +1,335 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Pager
+ */
+
+use \MediaWiki\Linker\LinkRenderer;
+
+/**
+ * @todo document
+ */
+class ProtectedPagesPager extends TablePager {
+       public $mForm, $mConds;
+       private $type, $level, $namespace, $sizetype, $size, $indefonly, $cascadeonly, $noredirect;
+
+       /**
+        * @var LinkRenderer
+        */
+       private $linkRenderer;
+
+       /**
+        * @param SpecialProtectedpages $form
+        * @param array $conds
+        * @param $type
+        * @param $level
+        * @param $namespace
+        * @param string $sizetype
+        * @param int $size
+        * @param bool $indefonly
+        * @param bool $cascadeonly
+        * @param bool $noredirect
+        * @param LinkRenderer $linkRenderer
+        */
+       function __construct( $form, $conds = [], $type, $level, $namespace,
+               $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false, $noredirect = false,
+               LinkRenderer $linkRenderer
+       ) {
+               $this->mForm = $form;
+               $this->mConds = $conds;
+               $this->type = ( $type ) ? $type : 'edit';
+               $this->level = $level;
+               $this->namespace = $namespace;
+               $this->sizetype = $sizetype;
+               $this->size = intval( $size );
+               $this->indefonly = (bool)$indefonly;
+               $this->cascadeonly = (bool)$cascadeonly;
+               $this->noredirect = (bool)$noredirect;
+               $this->linkRenderer = $linkRenderer;
+               parent::__construct( $form->getContext() );
+       }
+
+       function preprocessResults( $result ) {
+               # Do a link batch query
+               $lb = new LinkBatch;
+               $userids = [];
+
+               foreach ( $result as $row ) {
+                       $lb->add( $row->page_namespace, $row->page_title );
+                       // field is nullable, maybe null on old protections
+                       if ( $row->log_user !== null ) {
+                               $userids[] = $row->log_user;
+                       }
+               }
+
+               // fill LinkBatch with user page and user talk
+               if ( count( $userids ) ) {
+                       $userCache = UserCache::singleton();
+                       $userCache->doQuery( $userids, [], __METHOD__ );
+                       foreach ( $userids as $userid ) {
+                               $name = $userCache->getProp( $userid, 'name' );
+                               if ( $name !== false ) {
+                                       $lb->add( NS_USER, $name );
+                                       $lb->add( NS_USER_TALK, $name );
+                               }
+                       }
+               }
+
+               $lb->execute();
+       }
+
+       function getFieldNames() {
+               static $headers = null;
+
+               if ( $headers == [] ) {
+                       $headers = [
+                               'log_timestamp' => 'protectedpages-timestamp',
+                               'pr_page' => 'protectedpages-page',
+                               'pr_expiry' => 'protectedpages-expiry',
+                               'log_user' => 'protectedpages-performer',
+                               'pr_params' => 'protectedpages-params',
+                               'log_comment' => 'protectedpages-reason',
+                       ];
+                       foreach ( $headers as $key => $val ) {
+                               $headers[$key] = $this->msg( $val )->text();
+                       }
+               }
+
+               return $headers;
+       }
+
+       /**
+        * @param string $field
+        * @param string $value
+        * @return string HTML
+        * @throws MWException
+        */
+       function formatValue( $field, $value ) {
+               /** @var $row object */
+               $row = $this->mCurrentRow;
+
+               switch ( $field ) {
+                       case 'log_timestamp':
+                               // when timestamp is null, this is a old protection row
+                               if ( $value === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               [ 'class' => 'mw-protectedpages-unknown' ],
+                                               $this->msg( 'protectedpages-unknown-timestamp' )->escaped()
+                                       );
+                               } else {
+                                       $formatted = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
+                                               $value, $this->getUser() ) );
+                               }
+                               break;
+
+                       case 'pr_page':
+                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+                               if ( !$title ) {
+                                       $formatted = Html::element(
+                                               'span',
+                                               [ 'class' => 'mw-invalidtitle' ],
+                                               Linker::getInvalidTitleDescription(
+                                                       $this->getContext(),
+                                                       $row->page_namespace,
+                                                       $row->page_title
+                                               )
+                                       );
+                               } else {
+                                       $formatted = $this->linkRenderer->makeLink( $title );
+                               }
+                               if ( !is_null( $row->page_len ) ) {
+                                       $formatted .= $this->getLanguage()->getDirMark() .
+                                               ' ' . Html::rawElement(
+                                                       'span',
+                                                       [ 'class' => 'mw-protectedpages-length' ],
+                                                       Linker::formatRevisionSize( $row->page_len )
+                                               );
+                               }
+                               break;
+
+                       case 'pr_expiry':
+                               $formatted = htmlspecialchars( $this->getLanguage()->formatExpiry(
+                                       $value, /* User preference timezone */true ) );
+                               $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+                               if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
+                                       $changeProtection = $this->linkRenderer->makeKnownLink(
+                                               $title,
+                                               $this->msg( 'protect_change' )->text(),
+                                               [],
+                                               [ 'action' => 'unprotect' ]
+                                       );
+                                       $formatted .= ' ' . Html::rawElement(
+                                                       'span',
+                                                       [ 'class' => 'mw-protectedpages-actions' ],
+                                                       $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped()
+                                               );
+                               }
+                               break;
+
+                       case 'log_user':
+                               // when timestamp is null, this is a old protection row
+                               if ( $row->log_timestamp === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               [ 'class' => 'mw-protectedpages-unknown' ],
+                                               $this->msg( 'protectedpages-unknown-performer' )->escaped()
+                                       );
+                               } else {
+                                       $username = UserCache::singleton()->getProp( $value, 'name' );
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_USER,
+                                               $this->getUser()
+                                       ) ) {
+                                               if ( $username === false ) {
+                                                       $formatted = htmlspecialchars( $value );
+                                               } else {
+                                                       $formatted = Linker::userLink( $value, $username )
+                                                               . Linker::userToolLinks( $value, $username );
+                                               }
+                                       } else {
+                                               $formatted = $this->msg( 'rev-deleted-user' )->escaped();
+                                       }
+                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
+                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
+                                       }
+                               }
+                               break;
+
+                       case 'pr_params':
+                               $params = [];
+                               // Messages: restriction-level-sysop, restriction-level-autoconfirmed
+                               $params[] = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
+                               if ( $row->pr_cascade ) {
+                                       $params[] = $this->msg( 'protect-summary-cascade' )->escaped();
+                               }
+                               $formatted = $this->getLanguage()->commaList( $params );
+                               break;
+
+                       case 'log_comment':
+                               // when timestamp is null, this is an old protection row
+                               if ( $row->log_timestamp === null ) {
+                                       $formatted = Html::rawElement(
+                                               'span',
+                                               [ 'class' => 'mw-protectedpages-unknown' ],
+                                               $this->msg( 'protectedpages-unknown-reason' )->escaped()
+                                       );
+                               } else {
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_COMMENT,
+                                               $this->getUser()
+                                       ) ) {
+                                               $formatted = Linker::formatComment( $value !== null ? $value : '' );
+                                       } else {
+                                               $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
+                                       }
+                                       if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
+                                               $formatted = '<span class="history-deleted">' . $formatted . '</span>';
+                                       }
+                               }
+                               break;
+
+                       default:
+                               throw new MWException( "Unknown field '$field'" );
+               }
+
+               return $formatted;
+       }
+
+       function getQueryInfo() {
+               $conds = $this->mConds;
+               $conds[] = 'pr_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
+                       ' OR pr_expiry IS NULL';
+               $conds[] = 'page_id=pr_page';
+               $conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
+
+               if ( $this->sizetype == 'min' ) {
+                       $conds[] = 'page_len>=' . $this->size;
+               } elseif ( $this->sizetype == 'max' ) {
+                       $conds[] = 'page_len<=' . $this->size;
+               }
+
+               if ( $this->indefonly ) {
+                       $infinity = $this->mDb->addQuotes( $this->mDb->getInfinity() );
+                       $conds[] = "pr_expiry = $infinity OR pr_expiry IS NULL";
+               }
+               if ( $this->cascadeonly ) {
+                       $conds[] = 'pr_cascade = 1';
+               }
+               if ( $this->noredirect ) {
+                       $conds[] = 'page_is_redirect = 0';
+               }
+
+               if ( $this->level ) {
+                       $conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
+               }
+               if ( !is_null( $this->namespace ) ) {
+                       $conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
+               }
+
+               return [
+                       'tables' => [ 'page', 'page_restrictions', 'log_search', 'logging' ],
+                       'fields' => [
+                               'pr_id',
+                               'page_namespace',
+                               'page_title',
+                               'page_len',
+                               'pr_type',
+                               'pr_level',
+                               'pr_expiry',
+                               'pr_cascade',
+                               'log_timestamp',
+                               'log_user',
+                               'log_comment',
+                               'log_deleted',
+                       ],
+                       'conds' => $conds,
+                       'join_conds' => [
+                               'log_search' => [
+                                       'LEFT JOIN', [
+                                               'ls_field' => 'pr_id', 'ls_value = ' . $this->mDb->buildStringCast( 'pr_id' )
+                                       ]
+                               ],
+                               'logging' => [
+                                       'LEFT JOIN', [
+                                               'ls_log_id = log_id'
+                                       ]
+                               ]
+                       ]
+               ];
+       }
+
+       protected function getTableClass() {
+               return parent::getTableClass() . ' mw-protectedpages';
+       }
+
+       function getIndexField() {
+               return 'pr_id';
+       }
+
+       function getDefaultSort() {
+               return 'pr_id';
+       }
+
+       function isFieldSortable( $field ) {
+               // no index for sorting exists
+               return false;
+       }
+}
index 12039aa..9aef9ad 100644 (file)
@@ -112,9 +112,7 @@ class UsersPager extends AlphabeticPager {
 
                if ( $this->requestedGroup != '' ) {
                        $conds['ug_group'] = $this->requestedGroup;
-                       if ( !$this->getConfig()->get( 'DisableUserGroupExpiry' ) ) {
-                               $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() );
-                       }
+                       $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() );
                }
 
                if ( $this->requestedUser != '' ) {
@@ -164,7 +162,7 @@ class UsersPager extends AlphabeticPager {
         * @return string
         */
        function formatRow( $row ) {
-               if ( $row->user_id == 0 ) { # Bug 16487
+               if ( $row->user_id == 0 ) { # T18487
                        return '';
                }
 
index 8da1553..3467b49 100644 (file)
@@ -1824,7 +1824,7 @@ class Balancer {
         * Regex borrowed from Tim Starling's "remex-html" project.
         */
        const VALID_COMMENT_REGEX = "~ !--
-               (                             # 1. Comment match detector
+               (                           # 1. Comment match detector
                        > | -> | # Invalid short close
                        (                         # 2. Comment contents
                                (?:
@@ -1839,15 +1839,15 @@ class Balancer {
                        (                         # 3. Comment close
                                --> |   # Normal close
                                --!> |  # Comment end bang
-                               (                     # 4. Indicate matches requiring EOF
-                                       --! |   # EOF in comment end bang state
-                                       -- |    # EOF in comment end state
-                                       -  |    # EOF in comment end dash state
-                                               # EOF in comment state
+                               (                       # 4. Indicate matches requiring EOF
+                                       --! |                   # EOF in comment end bang state
+                                       -- |                    # EOF in comment end state
+                                       -  |                    # EOF in comment end dash state
+                                       (?#nothing)             # EOF in comment state
                                )
                        )
                )
-               ([^<]*) \z                    # 5. Non-tag text after the comment
+               ([^<]*) \z                  # 5. Non-tag text after the comment
                ~xs";
 
        /**
diff --git a/includes/tidy/RemexCompatFormatter.php b/includes/tidy/RemexCompatFormatter.php
new file mode 100644 (file)
index 0000000..3dc727b
--- /dev/null
@@ -0,0 +1,71 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+use RemexHtml\HTMLData;
+use RemexHtml\Serializer\HtmlFormatter;
+use RemexHtml\Serializer\SerializerNode;
+use RemexHtml\Tokenizer\PlainAttributes;
+
+/**
+ * @internal
+ */
+class RemexCompatFormatter extends HtmlFormatter {
+       private static $markedEmptyElements = [
+               'li' => true,
+               'p' => true,
+               'tr' => true,
+       ];
+
+       public function __construct( $options = [] ) {
+               parent::__construct( $options );
+               $this->attributeEscapes["\xc2\xa0"] = '&#160;';
+               unset( $this->attributeEscapes["&"] );
+               $this->textEscapes["\xc2\xa0"] = '&#160;';
+               unset( $this->textEscapes["&"] );
+       }
+
+       public function startDocument( $fragmentNamespace, $fragmentName ) {
+               return '';
+       }
+
+       public function element( SerializerNode $parent, SerializerNode $node, $contents ) {
+               $data = $node->snData;
+               if ( $data && $data->isPWrapper ) {
+                       if ( $data->nonblankNodeCount ) {
+                               return "<p>$contents</p>";
+                       } else {
+                               return $contents;
+                       }
+               }
+
+               $name = $node->name;
+               $attrs = $node->attrs;
+               if ( isset( self::$markedEmptyElements[$name] ) && $attrs->count() === 0 ) {
+                       if ( strspn( $contents, "\t\n\f\r " ) === strlen( $contents ) ) {
+                               return "<{$name} class=\"mw-empty-elt\">$contents</{$name}>";
+                       }
+               }
+
+               $s = "<$name";
+               foreach ( $attrs->getValues() as $attrName => $attrValue ) {
+                       $encValue = strtr( $attrValue, $this->attributeEscapes );
+                       $s .= " $attrName=\"$encValue\"";
+               }
+               if ( $node->namespace === HTMLData::NS_HTML && isset( $this->voidElements[$name] ) ) {
+                       $s .= ' />';
+                       return $s;
+               }
+
+               $s .= '>';
+               if ( $node->namespace === HTMLData::NS_HTML
+                       && isset( $contents[0] ) && $contents[0] === "\n"
+                       && isset( $this->prefixLfElements[$name] )
+               ) {
+                       $s .= "\n$contents</$name>";
+               } else {
+                       $s .= "$contents</$name>";
+               }
+               return $s;
+       }
+}
diff --git a/includes/tidy/RemexCompatMunger.php b/includes/tidy/RemexCompatMunger.php
new file mode 100644 (file)
index 0000000..dbcf568
--- /dev/null
@@ -0,0 +1,474 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+use RemexHtml\HTMLData;
+use RemexHtml\Serializer\Serializer;
+use RemexHtml\Serializer\SerializerNode;
+use RemexHtml\Tokenizer\Attributes;
+use RemexHtml\Tokenizer\PlainAttributes;
+use RemexHtml\TreeBuilder\TreeBuilder;
+use RemexHtml\TreeBuilder\TreeHandler;
+use RemexHtml\TreeBuilder\Element;
+
+/**
+ * @internal
+ */
+class RemexCompatMunger implements TreeHandler {
+       private static $onlyInlineElements = [
+               "a" => true,
+               "abbr" => true,
+               "acronym" => true,
+               "applet" => true,
+               "b" => true,
+               "basefont" => true,
+               "bdo" => true,
+               "big" => true,
+               "br" => true,
+               "button" => true,
+               "cite" => true,
+               "code" => true,
+               "dfn" => true,
+               "em" => true,
+               "font" => true,
+               "i" => true,
+               "iframe" => true,
+               "img" => true,
+               "input" => true,
+               "kbd" => true,
+               "label" => true,
+               "legend" => true,
+               "map" => true,
+               "object" => true,
+               "param" => true,
+               "q" => true,
+               "rb" => true,
+               "rbc" => true,
+               "rp" => true,
+               "rt" => true,
+               "rtc" => true,
+               "ruby" => true,
+               "s" => true,
+               "samp" => true,
+               "select" => true,
+               "small" => true,
+               "span" => true,
+               "strike" => true,
+               "strong" => true,
+               "sub" => true,
+               "sup" => true,
+               "textarea" => true,
+               "tt" => true,
+               "u" => true,
+               "var" => true,
+       ];
+
+       private static $formattingElements = [
+               'a' => true,
+               'b' => true,
+               'big' => true,
+               'code' => true,
+               'em' => true,
+               'font' => true,
+               'i' => true,
+               'nobr' => true,
+               's' => true,
+               'small' => true,
+               'strike' => true,
+               'strong' => true,
+               'tt' => true,
+               'u' => true,
+       ];
+
+       /**
+        * Constructor
+        *
+        * @param Serializer $serializer
+        */
+       public function __construct( Serializer $serializer ) {
+               $this->serializer = $serializer;
+       }
+
+       public function startDocument( $fragmentNamespace, $fragmentName ) {
+               $this->serializer->startDocument( $fragmentNamespace, $fragmentName );
+               $root = $this->serializer->getRootNode();
+               $root->snData = new RemexMungerData;
+               $root->snData->needsPWrapping = true;
+       }
+
+       public function endDocument( $pos ) {
+               $this->serializer->endDocument( $pos );
+       }
+
+       private function getParentForInsert( $preposition, $refElement ) {
+               if ( $preposition === TreeBuilder::ROOT ) {
+                       return [ $this->serializer->getRootNode(), null ];
+               } elseif ( $preposition === TreeBuilder::BEFORE ) {
+                       $refNode = $refElement->userData;
+                       return [ $this->serializer->getParentNode( $refNode ), $refNode ];
+               } else {
+                       $refNode = $refElement->userData;
+                       $refData = $refNode->snData;
+                       if ( $refData->currentCloneElement ) {
+                               // Follow a chain of clone links if necessary
+                               $origRefData = $refData;
+                               while ( $refData->currentCloneElement ) {
+                                       $refElement = $refData->currentCloneElement;
+                                       $refNode = $refElement->userData;
+                                       $refData = $refNode->snData;
+                               }
+                               // Cache the end of the chain in the requested element
+                               $origRefData->currentCloneElement = $refElement;
+                       } elseif ( $refData->childPElement ) {
+                               $refElement = $refData->childPElement;
+                               $refNode = $refElement->userData;
+                       }
+                       return [ $refNode, $refNode ];
+               }
+       }
+
+       /**
+        * Insert a p-wrapper
+        *
+        * @param SerializerNode $parent
+        * @param integer $sourceStart
+        * @return SerializerNode
+        */
+       private function insertPWrapper( SerializerNode $parent, $sourceStart ) {
+               $pWrap = new Element( HTMLData::NS_HTML, 'mw:p-wrap', new PlainAttributes );
+               $this->serializer->insertElement( TreeBuilder::UNDER, $parent, $pWrap, false,
+                       $sourceStart, 0 );
+               $data = new RemexMungerData;
+               $data->isPWrapper = true;
+               $data->wrapBaseNode = $parent;
+               $pWrap->userData->snData = $data;
+               $parent->snData->childPElement = $pWrap;
+               return $pWrap->userData;
+       }
+
+       public function characters( $preposition, $refElement, $text, $start, $length,
+               $sourceStart, $sourceLength
+       ) {
+               $isBlank = strspn( $text, "\t\n\f\r ", $start, $length ) === $length;
+
+               list( $parent, $refNode ) = $this->getParentForInsert( $preposition, $refElement );
+               $parentData = $parent->snData;
+
+               if ( $preposition === TreeBuilder::UNDER ) {
+                       if ( $parentData->needsPWrapping && !$isBlank ) {
+                               // Add a p-wrapper for bare text under body/blockquote
+                               $refNode = $this->insertPWrapper( $refNode, $sourceStart );
+                               $parent = $refNode;
+                               $parentData = $parent->snData;
+                       } elseif ( $parentData->isSplittable && !$parentData->ancestorPNode ) {
+                               // The parent is splittable and in block mode, so split the tag stack
+                               $refNode = $this->splitTagStack( $refNode, true, $sourceStart );
+                               $parent = $refNode;
+                               $parentData = $parent->snData;
+                       }
+               }
+
+               if ( !$isBlank ) {
+                       // Non-whitespace characters detected
+                       $parentData->nonblankNodeCount++;
+               }
+               $this->serializer->characters( $preposition, $refNode, $text, $start,
+                       $length, $sourceStart, $sourceLength );
+       }
+
+       /**
+        * Insert or reparent an element. Create p-wrappers or split the tag stack
+        * as necessary.
+        *
+        * Consider the following insertion locations. The parent may be:
+        *
+        *   - A: A body or blockquote (!!needsPWrapping)
+        *   - B: A p-wrapper (!!isPWrapper)
+        *   - C: A descendant of a p-wrapper (!!ancestorPNode)
+        *     - CS: With splittable formatting elements in the stack region up to
+        *       the p-wrapper
+        *     - CU: With one or more unsplittable elements in the stack region up
+        *       to the p-wrapper
+        *   - D: Not a descendant of a p-wrapper (!ancestorNode)
+        *     - DS: With splittable formatting elements in the stack region up to
+        *       the body or blockquote
+        *     - DU: With one or more unsplittable elements in the stack region up
+        *       to the body or blockquote
+        *
+        * And consider that we may insert two types of element:
+        *   - b: block
+        *   - i: inline
+        *
+        * We handle the insertion as follows:
+        *
+        *   - A/i: Create a p-wrapper, insert under it
+        *   - A/b: Insert as normal
+        *   - B/i: Insert as normal
+        *   - B/b: Close the p-wrapper, insert under the body/blockquote (wrap
+        *     base) instead)
+        *   - C/i: Insert as normal
+        *   - CS/b: Split the tag stack, insert the block under cloned formatting
+        *     elements which have the wrap base (the parent of the p-wrap) as
+        *     their ultimate parent.
+        *   - CU/b: Disable the p-wrap, by reparenting the currently open child
+        *     of the p-wrap under the p-wrap's parent. Then insert the block as
+        *     normal.
+        *   - D/b: Insert as normal
+        *   - DS/i: Split the tag stack, creating a new p-wrapper as the ultimate
+        *     parent of the formatting elements thus cloned. The parent of the
+        *     p-wrapper is the body or blockquote.
+        *   - DU/i: Insert as normal
+        *
+        * FIXME: fostering ($preposition == BEFORE) is mostly done by inserting as
+        * normal, the full algorithm is not followed.
+        *
+        * @param integer $preposition
+        * @param Element|SerializerNode|null $refElement
+        * @param Element $element
+        * @param bool $void
+        * @param integer $sourceStart
+        * @param integer $sourceLength
+        */
+       public function insertElement( $preposition, $refElement, Element $element, $void,
+               $sourceStart, $sourceLength
+       ) {
+               list( $parent, $newRef ) = $this->getParentForInsert( $preposition, $refElement );
+               $parentData = $parent->snData;
+               $parentNs = $parent->namespace;
+               $parentName = $parent->name;
+               $elementName = $element->htmlName;
+
+               $inline = isset( self::$onlyInlineElements[$elementName] );
+               $under = $preposition === TreeBuilder::UNDER;
+
+               if ( $under && $parentData->isPWrapper && !$inline ) {
+                       // [B/b] The element is non-inline and the parent is a p-wrapper,
+                       // close the parent and insert into its parent instead
+                       $newParent = $this->serializer->getParentNode( $parent );
+                       $parent = $newParent;
+                       $parentData = $parent->snData;
+                       $pElement = $parentData->childPElement;
+                       $parentData->childPElement = null;
+                       $newRef = $refElement->userData;
+                       $this->endTag( $pElement, $sourceStart, 0 );
+               } elseif ( $under && $parentData->isSplittable
+                       && (bool)$parentData->ancestorPNode !== $inline
+               ) {
+                       // [CS/b, DS/i] The parent is splittable and the current element is
+                       // inline in block context, or if the current element is a block
+                       // under a p-wrapper, split the tag stack.
+                       $newRef = $this->splitTagStack( $newRef, $inline, $sourceStart );
+                       $parent = $newRef;
+                       $parentData = $parent->snData;
+               } elseif ( $under && $parentData->needsPWrapping && $inline ) {
+                       // [A/i] If the element is inline and we are in body/blockquote,
+                       // we need to create a p-wrapper
+                       $newRef = $this->insertPWrapper( $newRef, $sourceStart );
+                       $parent = $newRef;
+                       $parentData = $parent->snData;
+               } elseif ( $parentData->ancestorPNode && !$inline ) {
+                       // [CU/b] If the element is non-inline and (despite attempting to
+                       // split above) there is still an ancestor p-wrap, disable that
+                       // p-wrap
+                       $this->disablePWrapper( $parent, $sourceStart );
+               }
+               // else [A/b, B/i, C/i, D/b, DU/i] insert as normal
+
+               // An element with element children is a non-blank element
+               $parentData->nonblankNodeCount++;
+
+               // Insert the element downstream and so initialise its userData
+               $this->serializer->insertElement( $preposition, $newRef,
+                       $element, $void, $sourceStart, $sourceLength );
+
+               // Initialise snData
+               if ( !$element->userData->snData ) {
+                       $elementData = $element->userData->snData = new RemexMungerData;
+               } else {
+                       $elementData = $element->userData->snData;
+               }
+               if ( ( $parentData->isPWrapper || $parentData->isSplittable )
+                       && isset( self::$formattingElements[$elementName] )
+               ) {
+                       $elementData->isSplittable = true;
+               }
+               if ( $parentData->isPWrapper ) {
+                       $elementData->ancestorPNode = $parent;
+               } elseif ( $parentData->ancestorPNode ) {
+                       $elementData->ancestorPNode = $parentData->ancestorPNode;
+               }
+               if ( $parentData->wrapBaseNode ) {
+                       $elementData->wrapBaseNode = $parentData->wrapBaseNode;
+               } elseif ( $parentData->needsPWrapping ) {
+                       $elementData->wrapBaseNode = $parent;
+               }
+               if ( $elementName === 'body'
+                       || $elementName === 'blockquote'
+                       || $elementName === 'html'
+               ) {
+                       $elementData->needsPWrapping = true;
+               }
+       }
+
+       /**
+        * Clone nodes in a stack range and return the new parent
+        *
+        * @param SerializerNode $parentNode
+        * @param bool $inline
+        * @param integer $pos The source position
+        * @return SerializerNode
+        */
+       private function splitTagStack( SerializerNode $parentNode, $inline, $pos ) {
+               $parentData = $parentNode->snData;
+               $wrapBase = $parentData->wrapBaseNode;
+               $pWrap = $parentData->ancestorPNode;
+               if ( !$pWrap ) {
+                       $cloneEnd = $wrapBase;
+               } else {
+                       $cloneEnd = $parentData->ancestorPNode;
+               }
+
+               $serializer = $this->serializer;
+               $node = $parentNode;
+               $root = $serializer->getRootNode();
+               $nodes = [];
+               $removableNodes = [];
+               $haveContent = false;
+               while ( $node !== $cloneEnd ) {
+                       $nextParent = $serializer->getParentNode( $node );
+                       if ( $nextParent === $root ) {
+                               throw new \Exception( 'Did not find end of clone range' );
+                       }
+                       $nodes[] = $node;
+                       if ( $node->snData->nonblankNodeCount === 0 ) {
+                               $removableNodes[] = $node;
+                               $nextParent->snData->nonblankNodeCount--;
+                       }
+                       $node = $nextParent;
+               }
+
+               if ( $inline ) {
+                       $pWrap = $this->insertPWrapper( $wrapBase, $pos );
+                       $node = $pWrap;
+               } else {
+                       if ( $pWrap ) {
+                               // End the p-wrap which was open, cancel the diversion
+                               $wrapBase->snData->childPElement = null;
+                       }
+                       $pWrap = null;
+                       $node = $wrapBase;
+               }
+
+               for ( $i = count( $nodes ) - 1; $i >= 0; $i-- ) {
+                       $oldNode = $nodes[$i];
+                       $oldData = $oldNode->snData;
+                       $nodeParent = $node;
+                       $element = new Element( $oldNode->namespace, $oldNode->name, $oldNode->attrs );
+                       $this->serializer->insertElement( TreeBuilder::UNDER, $nodeParent,
+                               $element, false, $pos, 0 );
+                       $oldData->currentCloneElement = $element;
+
+                       $newNode = $element->userData;
+                       $newData = $newNode->snData = new RemexMungerData;
+                       if ( $pWrap ) {
+                               $newData->ancestorPNode = $pWrap;
+                       }
+                       $newData->isSplittable = true;
+                       $newData->wrapBaseNode = $wrapBase;
+                       $newData->isPWrapper = $oldData->isPWrapper;
+
+                       $nodeParent->snData->nonblankNodeCount++;
+
+                       $node = $newNode;
+               }
+               foreach ( $removableNodes as $rNode ) {
+                       $fakeElement = new Element( $rNode->namespace, $rNode->name, $rNode->attrs );
+                       $fakeElement->userData = $rNode;
+                       $this->serializer->removeNode( $fakeElement, $pos );
+               }
+               return $node;
+       }
+
+       /**
+        * Find the ancestor of $node which is a child of a p-wrapper, and
+        * reparent that node so that it is placed after the end of the p-wrapper
+        */
+       private function disablePWrapper( SerializerNode $node, $sourceStart ) {
+               $nodeData = $node->snData;
+               $pWrapNode = $nodeData->ancestorPNode;
+               $newParent = $this->serializer->getParentNode( $pWrapNode );
+               if ( $pWrapNode !== $this->serializer->getLastChild( $newParent ) ) {
+                       // Fostering or something? Abort!
+                       return;
+               }
+
+               $nextParent = $node;
+               do {
+                       $victim = $nextParent;
+                       $victim->snData->ancestorPNode = null;
+                       $nextParent = $this->serializer->getParentNode( $victim );
+               } while ( $nextParent !== $pWrapNode );
+
+               // Make a fake Element to use in a reparenting operation
+               $victimElement = new Element( $victim->namespace, $victim->name, $victim->attrs );
+               $victimElement->userData = $victim;
+
+               // Reparent
+               $this->serializer->insertElement( TreeBuilder::UNDER, $newParent, $victimElement,
+                       false, $sourceStart, 0 );
+
+               // Decrement nonblank node count
+               $pWrapNode->snData->nonblankNodeCount--;
+
+               // Cancel the diversion so that no more elements are inserted under this p-wrap
+               $newParent->snData->childPElement = null;
+       }
+
+       public function endTag( Element $element, $sourceStart, $sourceLength ) {
+               $data = $element->userData->snData;
+               if ( $data->childPElement ) {
+                       $this->endTag( $data->childPElement, $sourceStart, 0 );
+               }
+               $this->serializer->endTag( $element, $sourceStart, $sourceLength );
+               $element->userData->snData = null;
+               $element->userData = null;
+       }
+
+       public function doctype( $name, $public, $system, $quirks, $sourceStart, $sourceLength ) {
+               $this->serializer->doctype( $name, $public,  $system, $quirks,
+                       $sourceStart, $sourceLength );
+       }
+
+       public function comment( $preposition, $refElement, $text, $sourceStart, $sourceLength ) {
+               list( $parent, $refNode ) = $this->getParentForInsert( $preposition, $refElement );
+               $this->serializer->comment( $preposition, $refNode, $text,
+                       $sourceStart, $sourceLength );
+       }
+
+       public function error( $text, $pos ) {
+               $this->serializer->error( $text, $pos );
+       }
+
+       public function mergeAttributes( Element $element, Attributes $attrs, $sourceStart ) {
+               $this->serializer->mergeAttributes( $element, $attrs, $sourceStart );
+       }
+
+       public function removeNode( Element $element, $sourceStart ) {
+               $this->serializer->removeNode( $element, $sourceStart );
+       }
+
+       public function reparentChildren( Element $element, Element $newParent, $sourceStart ) {
+               $self = $element->userData;
+               $children = $self->children;
+               $self->children = [];
+               $this->insertElement( TreeBuilder::UNDER, $element, $newParent, false, $sourceStart, 0 );
+               $newParentNode = $newParent->userData;
+               $newParentId = $newParentNode->id;
+               foreach ( $children as $child ) {
+                       if ( is_object( $child ) ) {
+                               $child->parentId = $newParentId;
+                       }
+               }
+               $newParentNode->children = $children;
+       }
+}
diff --git a/includes/tidy/RemexDriver.php b/includes/tidy/RemexDriver.php
new file mode 100644 (file)
index 0000000..e02af88
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+use RemexHtml\Serializer\Serializer;
+use RemexHtml\Tokenizer\Tokenizer;
+use RemexHtml\TreeBuilder\Dispatcher;
+use RemexHtml\TreeBuilder\TreeBuilder;
+use RemexHtml\TreeBuilder\TreeMutationTracer;
+
+class RemexDriver extends TidyDriverBase {
+       private $trace;
+       private $pwrap;
+
+       public function __construct( array $config ) {
+               $config += [
+                       'treeMutationTrace' => false,
+                       'pwrap' => true
+               ];
+               $this->trace = $config['treeMutationTrace'];
+               $this->pwrap = $config['pwrap'];
+               parent::__construct( $config );
+       }
+
+       public function tidy( $text ) {
+               $formatter = new RemexCompatFormatter;
+               $serializer = new Serializer( $formatter );
+               if ( $this->pwrap ) {
+                       $munger = new RemexCompatMunger( $serializer );
+               } else {
+                       $munger = $serializer;
+               }
+               if ( $this->trace ) {
+                       $tracer = new TreeMutationTracer( $munger, function ( $msg ) {
+                               wfDebug( "RemexHtml: $msg" );
+                       } );
+               } else {
+                       $tracer = $munger;
+               }
+               $treeBuilder = new TreeBuilder( $tracer, [
+                       'ignoreErrors' => true,
+                       'ignoreNulls' => true,
+               ] );
+               $dispatcher = new Dispatcher( $treeBuilder );
+               $tokenizer = new Tokenizer( $dispatcher, $text, [
+                       'ignoreErrors' => true,
+                       'ignoreCharRefs' => true,
+                       'ignoreNulls' => true,
+                       'skipPreprocess' => true,
+               ] );
+               $tokenizer->execute( [
+                       'fragmentNamespace' => \RemexHtml\HTMLData::NS_HTML,
+                       'fragmentName' => 'body'
+               ] );
+               return $serializer->getResult();
+       }
+}
diff --git a/includes/tidy/RemexMungerData.php b/includes/tidy/RemexMungerData.php
new file mode 100644 (file)
index 0000000..d614a38
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+namespace MediaWiki\Tidy;
+
+/**
+ * @internal
+ */
+class RemexMungerData {
+       /**
+        * The Element for the mw:p-wrap which is a child of the current node. If
+        * this is set, inline insertions into this node will be diverted so that
+        * they insert into the p-wrap.
+        *
+        * @var \RemexHtml\TreeBuilder\Element|null
+        */
+       public $childPElement;
+
+       /**
+        * This tracks the mw:p-wrap node in the Serializer stack which is an
+        * ancestor of this node. If there is no mw:p-wrap ancestor, it is null.
+        *
+        * @var \RemexHtml\Serializer\SerializerNode|null
+        */
+       public $ancestorPNode;
+
+       /**
+        * The wrap base node is the body or blockquote node which is the parent
+        * of active p-wrappers. This is set if there is an ancestor p-wrapper,
+        * or if a p-wrapper was closed due to a block element being encountered
+        * inside it.
+        *
+        * @var \RemexHtml\Serializer\SerializerNode|null
+        */
+       public $wrapBaseNode;
+
+       /**
+        * Stack splitting (essentially our idea of AFE reconstruction) can clone
+        * formatting elements which are split over multiple paragraphs.
+        * TreeBuilder is not aware of the cloning, and continues to insert into
+        * the original element. This is set to the newer clone if this node was
+        * cloned, i.e. if there is an active diversion of the insertion location.
+        *
+        * @var \RemexHtml\TreeBuilder\Element|null
+        */
+       public $currentCloneElement;
+
+       /**
+        * Is the node a p-wrapper, with name mw:p-wrap?
+        *
+        * @var bool
+        */
+       public $isPWrapper = false;
+
+       /**
+        * Is the node splittable, i.e. a formatting element or a node with a
+        * formatting element ancestor which is under an active or deactivated
+        * p-wrapper.
+        *
+        * @var bool
+        */
+       public $isSplittable = false;
+
+       /**
+        * This is true if the node is a body or blockquote, which activates
+        * p-wrapping of child nodes.
+        */
+       public $needsPWrapping = false;
+
+       /**
+        * The number of child nodes, not counting whitespace-only text nodes or
+        * comments.
+        */
+       public $nonblankNodeCount = 0;
+
+       public function __set( $name, $value ) {
+               throw new \Exception( "Cannot set property \"$name\"" );
+       }
+}
index 96ee8c3..d3f9d48 100644 (file)
@@ -27,7 +27,7 @@ abstract class TidyDriverBase {
         * @return bool Whether the HTML is valid
         */
        public function validate( $text, &$errorStr ) {
-               throw new \MWException( get_class( $this ) . " does not support validate()" );
+               throw new \MWException( static::class . ' does not support validate()' );
        }
 
        /**
index 2d67a28..4d24cb8 100644 (file)
@@ -115,15 +115,23 @@ class NamespaceAwareForeignTitleFactory implements ForeignTitleFactory {
        protected function parseTitleWithNs( $title, $ns ) {
                $pieces = explode( ':', $title, 2 );
 
+               // Is $title of the form Namespace:Title (true), or just Title (false)?
+               $titleIncludesNamespace = ( $ns != '0' && count( $pieces ) === 2 );
+
                if ( isset( $this->foreignNamespaces[$ns] ) ) {
                        $namespaceName = $this->foreignNamespaces[$ns];
                } else {
-                       $namespaceName = $ns == '0' ? '' : $pieces[0];
+                       // If the foreign wiki is misconfigured, XML dumps can contain a page with
+                       // a non-zero namespace ID, but whose title doesn't contain a colon
+                       // (T114115). In those cases, output a made-up namespace name to avoid
+                       // collisions. The ImportTitleFactory might replace this with something
+                       // more appropriate.
+                       $namespaceName = $titleIncludesNamespace ? $pieces[0] : "Ns$ns";
                }
 
                // We assume that the portion of the page title before the colon is the
-               // namespace name, except in the case of namespace 0
-               if ( $ns != '0' ) {
+               // namespace name, except in the case of namespace 0.
+               if ( $titleIncludesNamespace ) {
                        $pageName = $pieces[1];
                } else {
                        $pageName = $title;
index 79166ef..0868ce6 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Upload
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * @defgroup Upload Upload related
@@ -297,7 +298,7 @@ abstract class UploadBase {
         * @param string $srcPath The source path
         * @return string|bool The real path if it was a virtual URL Returns false on failure
         */
-       function getRealPath( $srcPath ) {
+       public function getRealPath( $srcPath ) {
                $repo = RepoGroup::singleton()->getLocalRepo();
                if ( $repo->isVirtualUrl( $srcPath ) ) {
                        /** @todo Just make uploads work with storage paths UploadFromStash
@@ -560,7 +561,7 @@ abstract class UploadBase {
         *
         * @param array $entry
         */
-       function zipEntryCallback( $entry ) {
+       public function zipEntryCallback( $entry ) {
                $names = [ $entry['name'] ];
 
                // If there is a null character, cut off the name at it, because JDK's
@@ -797,7 +798,7 @@ abstract class UploadBase {
         * Returns the title of the file to be uploaded. Sets mTitleError in case
         * the name was illegal.
         *
-        * @return Title The title of the file or null in case the name was illegal
+        * @return Title|null The title of the file or null in case the name was illegal
         */
        public function getTitle() {
                if ( $this->mTitle !== false ) {
@@ -895,7 +896,7 @@ abstract class UploadBase {
                        return $this->mTitle;
                }
 
-               // Windows may be broken with special characters, see bug 1780
+               // Windows may be broken with special characters, see T3780
                if ( !preg_match( '/^[\x0-\x7f]*$/', $nt->getText() )
                        && !RepoGroup::singleton()->getLocalRepo()->backendSupportsUnicodePaths()
                ) {
@@ -1209,7 +1210,7 @@ abstract class UploadBase {
                }
 
                // Some browsers will interpret obscure xml encodings as UTF-8, while
-               // PHP/expat will interpret the given encoding in the xml declaration (bug 47304)
+               // PHP/expat will interpret the given encoding in the xml declaration (T49304)
                if ( $extension == 'svg' || strpos( $mime, 'image/svg' ) === 0 ) {
                        if ( self::checkXMLEncodingMissmatch( $file ) ) {
                                return true;
@@ -1358,11 +1359,14 @@ abstract class UploadBase {
                        $filename,
                        [ $this, 'checkSvgScriptCallback' ],
                        true,
-                       [ 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback' ]
+                       [
+                               'processing_instruction_handler' => 'UploadBase::checkSvgPICallback',
+                               'external_dtd_handler' => 'UploadBase::checkSvgExternalDTD',
+                       ]
                );
                if ( $check->wellFormed !== true ) {
-                       // Invalid xml (bug 58553)
-                       // But only when non-partial (bug 65724)
+                       // Invalid xml (T60553)
+                       // But only when non-partial (T67724)
                        return $partial ? false : [ 'uploadinvalidxml' ];
                } elseif ( $check->filterMatch ) {
                        if ( $this->mSVGNSError ) {
@@ -1382,7 +1386,7 @@ abstract class UploadBase {
         * @return bool (true if the filter identified something bad)
         */
        public static function checkSvgPICallback( $target, $data ) {
-               // Don't allow external stylesheets (bug 57550)
+               // Don't allow external stylesheets (T59550)
                if ( preg_match( '/xml-stylesheet/i', $target ) ) {
                        return [ 'upload-scripted-pi-callback' ];
                }
@@ -1390,6 +1394,34 @@ abstract class UploadBase {
                return false;
        }
 
+       /**
+        * Verify that DTD urls referenced are only the standard dtds
+        *
+        * Browsers seem to ignore external dtds. However just to be on the
+        * safe side, only allow dtds from the svg standard.
+        *
+        * @param string $type PUBLIC or SYSTEM
+        * @param string $publicId The well-known public identifier for the dtd
+        * @param string $systemId The url for the external dtd
+        */
+       public static function checkSvgExternalDTD( $type, $publicId, $systemId ) {
+               // This doesn't include the XHTML+MathML+SVG doctype since we don't
+               // allow XHTML anyways.
+               $allowedDTDs = [
+                       'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd',
+                       'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd',
+                       'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd',
+                       'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd'
+               ];
+               if ( $type !== 'PUBLIC'
+                       || !in_array( $systemId, $allowedDTDs )
+                       || strpos( $publicId, "-//W3C//" ) !== 0
+               ) {
+                       return [ 'upload-scripted-dtd' ];
+               }
+               return false;
+       }
+
        /**
         * @todo Replace this with a whitelist filter!
         * @param string $element
@@ -1401,7 +1433,7 @@ abstract class UploadBase {
                list( $namespace, $strippedElement ) = $this->splitXmlNamespace( $element );
 
                // We specifically don't include:
-               // http://www.w3.org/1999/xhtml (bug 60771)
+               // http://www.w3.org/1999/xhtml (T62771)
                static $validNamespaces = [
                        '',
                        'adobe:ns:meta/',
@@ -2081,9 +2113,10 @@ abstract class UploadBase {
         * @return Status[]|bool
         */
        public static function getSessionStatus( User $user, $statusKey ) {
-               $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
+               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
+               $key = $cache->makeKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
 
-               return ObjectCache::getMainStashInstance()->get( $key );
+               return $cache->get( $key );
        }
 
        /**
@@ -2097,9 +2130,9 @@ abstract class UploadBase {
         * @return void
         */
        public static function setSessionStatus( User $user, $statusKey, $value ) {
-               $key = wfMemcKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
+               $cache = MediaWikiServices::getInstance()->getMainObjectStash();
+               $key = $cache->makeKey( 'uploadstatus', $user->getId() ?: md5( $user->getName() ), $statusKey );
 
-               $cache = ObjectCache::getMainStashInstance();
                if ( $value === false ) {
                        $cache->delete( $key );
                } else {
index 865f630..2b13dd8 100644 (file)
@@ -225,7 +225,7 @@ class UploadFromUrl extends UploadBase {
                        // Well... that's not good!
                        wfDebugLog(
                                'fileupload',
-                               'Short write ' . $this->nbytes . '/' . strlen( $buffer ) .
+                               'Short write ' . $nbytes . '/' . strlen( $buffer ) .
                                        ' bytes, aborting with ' . $this->mFileSize . ' uploaded so far'
                        );
                        fclose( $this->mTmpHandle );
index 57610fc..9a955fb 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 use MediaWiki\Session\BotPasswordSessionProvider;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
  * Utility class for bot passwords
@@ -68,7 +69,7 @@ class BotPassword implements IDBAccessObject {
        /**
         * Get a database connection for the bot passwords database
         * @param int $db Index of the connection to get, e.g. DB_MASTER or DB_REPLICA.
-        * @return Database
+        * @return IMaintainableDatabase
         */
        public static function getDB( $db ) {
                global $wgBotPasswordsCluster, $wgBotPasswordsDatabase;
index c1aef22..4ee256c 100644 (file)
@@ -176,7 +176,7 @@ class PasswordReset implements LoggerAwareInterface {
                $firstUser = $users[0];
 
                if ( !$firstUser instanceof User || !$firstUser->getId() ) {
-                       // Don't parse username as wikitext (bug 65501)
+                       // Don't parse username as wikitext (T67501)
                        return StatusValue::newFatal( wfMessage( 'nosuchuser', wfEscapeWikiText( $username ) ) );
                }
 
@@ -192,7 +192,7 @@ class PasswordReset implements LoggerAwareInterface {
                                wfEscapeWikiText( $firstUser->getName() ) ) );
                }
 
-               // We need to have a valid IP address for the hook, but per bug 18347, we should
+               // We need to have a valid IP address for the hook, but per T20347, we should
                // send the user's name if they're logged in.
                $ip = $performingUser->getRequest()->getIP();
                if ( !$ip ) {
index d9c2a58..99610c3 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use IPSet\IPSet;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Session\SessionManager;
 use MediaWiki\Session\Token;
@@ -27,6 +28,8 @@ use MediaWiki\Auth\AuthManager;
 use MediaWiki\Auth\AuthenticationResponse;
 use MediaWiki\Auth\AuthenticationRequest;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DBExpectedError;
 
 /**
  * String Some punctuation to prevent editing from broken text-mangling proxies.
@@ -146,7 +149,6 @@ class User implements IDBAccessObject {
                'editmyuserjs',
                'editmywatchlist',
                'editsemiprotected',
-               'editusercssjs', # deprecated
                'editusercss',
                'edituserjs',
                'hideuser',
@@ -508,8 +510,18 @@ class User implements IDBAccessObject {
 
                                $ttl = $cache->adaptiveTTL( wfTimestamp( TS_UNIX, $this->mTouched ), $ttl );
 
-                               return $data;
+                               // if a user group membership is about to expire, the cache needs to
+                               // expire at that time (T163691)
+                               foreach ( $this->mGroupMemberships as $ugm ) {
+                                       if ( $ugm->getExpiry() ) {
+                                               $secondsUntilExpiry = wfTimestamp( TS_UNIX, $ugm->getExpiry() ) - time();
+                                               if ( $secondsUntilExpiry > 0 && $secondsUntilExpiry < $ttl ) {
+                                                       $ttl = $secondsUntilExpiry;
+                                               }
+                                       }
+                               }
 
+                               return $data;
                        },
                        [ 'pcTTL' => $cache::TTL_PROC_LONG, 'version' => self::VERSION ]
                );
@@ -949,7 +961,7 @@ class User implements IDBAccessObject {
 
                // Ensure that the username isn't longer than 235 bytes, so that
                // (at least for the builtin skins) user javascript and css files
-               // will work. (bug 23080)
+               // will work. (T25080)
                if ( strlen( $name ) > 235 ) {
                        wfDebugLog( 'username', __METHOD__ .
                                ": '$name' invalid due to length" );
@@ -1074,7 +1086,7 @@ class User implements IDBAccessObject {
                }
 
                // Clean up name according to title rules,
-               // but only when validation is requested (bug 12654)
+               // but only when validation is requested (T14654)
                $t = ( $validate !== false ) ?
                        Title::newFromText( $name, NS_USER ) : Title::makeTitle( NS_USER, $name );
                // Check for invalid titles
@@ -1664,7 +1676,7 @@ class User implements IDBAccessObject {
                        }
                }
 
-               // (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
+               // (T25343) Apply IP blocks to the contents of XFF headers, if enabled
                if ( !$block instanceof Block
                        && $wgApplyIpBlocksToXff
                        && $ip !== null
@@ -1745,11 +1757,12 @@ class User implements IDBAccessObject {
                                        $this->blockTrigger = 'cookie-block';
                                        return $tmpBlock;
                                } else {
-                                       // If the block is not valid, clear the block cookie (but don't delete it,
-                                       // because it needs to be cleared from LocalStorage as well and an empty string
-                                       // value is checked for in the mediawiki.user.blockcookie module).
-                                       $tmpBlock->setCookie( $this->getRequest()->response(), true );
+                                       // If the block is not valid, remove the cookie.
+                                       Block::clearCookie( $this->getRequest()->response() );
                                }
+                       } else {
+                               // If the block doesn't exist, remove the cookie.
+                               Block::clearCookie( $this->getRequest()->response() );
                        }
                }
                return false;
@@ -1787,7 +1800,7 @@ class User implements IDBAccessObject {
                $found = false;
                // @todo FIXME: IPv6 ???  (https://bugs.php.net/bug.php?id=33170)
                if ( IP::isIPv4( $ip ) ) {
-                       // Reverse IP, bug 21255
+                       // Reverse IP, T23255
                        $ipReversed = implode( '.', array_reverse( explode( '.', $ip ) ) );
 
                        foreach ( (array)$bases as $base ) {
@@ -1841,18 +1854,33 @@ class User implements IDBAccessObject {
                        $wgProxyList = array_map( 'trim', file( $wgProxyList ) );
                }
 
-               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;
+               $resultProxyList = [];
+               $deprecatedIPEntries = [];
+
+               // backward compatibility: move all ip addresses in keys to values
+               foreach ( $wgProxyList as $key => $value ) {
+                       $keyIsIP = IP::isIPAddress( $key );
+                       $valueIsIP = IP::isIPAddress( $value );
+                       if ( $keyIsIP && !$valueIsIP ) {
+                               $deprecatedIPEntries[] = $key;
+                               $resultProxyList[] = $key;
+                       } elseif ( $keyIsIP && $valueIsIP ) {
+                               $deprecatedIPEntries[] = $key;
+                               $resultProxyList[] = $key;
+                               $resultProxyList[] = $value;
+                       } else {
+                               $resultProxyList[] = $value;
                        }
                }
 
-               return false;
+               if ( $deprecatedIPEntries ) {
+                       wfDeprecated(
+                               'IP addresses in the keys of $wgProxyList (found the following IP addresses in keys: ' .
+                               implode( ', ', $deprecatedIPEntries ) . ', please move them to values)', '1.30' );
+               }
+
+               $proxyListIPSet = new IPSet( $resultProxyList );
+               return $proxyListIPSet->match( $ip );
        }
 
        /**
@@ -1913,11 +1941,12 @@ class User implements IDBAccessObject {
                $id = $this->getId();
                $userLimit = false;
                $isNewbie = $this->isNewbie();
+               $cache = ObjectCache::getLocalClusterInstance();
 
                if ( $id == 0 ) {
                        // limits for anons
                        if ( isset( $limits['anon'] ) ) {
-                               $keys[wfMemcKey( 'limiter', $action, 'anon' )] = $limits['anon'];
+                               $keys[$cache->makeKey( 'limiter', $action, 'anon' )] = $limits['anon'];
                        }
                } else {
                        // limits for logged-in users
@@ -1926,7 +1955,7 @@ class User implements IDBAccessObject {
                        }
                        // limits for newbie logged-in users
                        if ( $isNewbie && isset( $limits['newbie'] ) ) {
-                               $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $limits['newbie'];
+                               $keys[$cache->makeKey( 'limiter', $action, 'user', $id )] = $limits['newbie'];
                        }
                }
 
@@ -1963,7 +1992,7 @@ class User implements IDBAccessObject {
                if ( $userLimit !== false ) {
                        list( $max, $period ) = $userLimit;
                        wfDebug( __METHOD__ . ": effective user limit: $max in {$period}s\n" );
-                       $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $userLimit;
+                       $keys[$cache->makeKey( 'limiter', $action, 'user', $id )] = $userLimit;
                }
 
                // ip-based limits for all ping-limitable users
@@ -1990,8 +2019,6 @@ class User implements IDBAccessObject {
                        }
                }
 
-               $cache = ObjectCache::getLocalClusterInstance();
-
                $triggered = false;
                foreach ( $keys as $key => $limit ) {
                        list( $max, $period ) = $limit;
@@ -2500,8 +2527,9 @@ class User implements IDBAccessObject {
        public function touch() {
                $id = $this->getId();
                if ( $id ) {
-                       $key = wfMemcKey( 'user-quicktouched', 'id', $id );
-                       ObjectCache::getMainWANInstance()->touchCheckKey( $key );
+                       $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+                       $key = $cache->makeKey( 'user-quicktouched', 'id', $id );
+                       $cache->touchCheckKey( $key );
                        $this->mQuickTouched = null;
                }
        }
@@ -2528,8 +2556,8 @@ class User implements IDBAccessObject {
 
                if ( $this->mId ) {
                        if ( $this->mQuickTouched === null ) {
-                               $key = wfMemcKey( 'user-quicktouched', 'id', $this->mId );
-                               $cache = ObjectCache::getMainWANInstance();
+                               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+                               $key = $cache->makeKey( 'user-quicktouched', 'id', $this->mId );
 
                                $this->mQuickTouched = wfTimestamp( TS_MW, $cache->getCheckKeyTime( $key ) );
                        }
@@ -3215,7 +3243,7 @@ class User implements IDBAccessObject {
 
        /**
         * Get the permissions this user has.
-        * @return array Array of String permission names
+        * @return string[] permission names
         */
        public function getRights() {
                if ( is_null( $this->mRights ) ) {
@@ -3777,9 +3805,9 @@ class User implements IDBAccessObject {
         */
        public function getExperienceLevel() {
                global $wgLearnerEdits,
-                          $wgExperiencedUserEdits,
-                          $wgLearnerMemberSince,
-                          $wgExperiencedUserMemberSince;
+                       $wgExperiencedUserEdits,
+                       $wgLearnerMemberSince,
+                       $wgExperiencedUserMemberSince;
 
                if ( $this->isAnon() ) {
                        return false;
@@ -4125,7 +4153,7 @@ class User implements IDBAccessObject {
         *   }
         *   // do something with $user...
         *
-        * However, this was vulnerable to a race condition (bug 16020). By
+        * However, this was vulnerable to a race condition (T18020). By
         * initialising the user object if the user exists, we aim to support this
         * calling sequence as far as possible.
         *
@@ -4142,6 +4170,10 @@ class User implements IDBAccessObject {
                        $this->setToken(); // init token
                }
 
+               if ( !is_string( $this->mName ) ) {
+                       throw new RuntimeException( "User name field is not set." );
+               }
+
                $this->mTouched = $this->newTouchedTimestamp();
 
                $noPass = PasswordFactory::newInvalidPassword()->toString();
@@ -4238,7 +4270,7 @@ class User implements IDBAccessObject {
                        return $this->mBlock;
                }
 
-               # bug 13611: if the IP address the user is trying to create an account from is
+               # T15611: if the IP address the user is trying to create an account from is
                # blocked with createaccount disabled, prevent new account creation there even
                # when the user is logged in
                if ( $this->mBlockedFromCreateAccount === false && !$this->isAllowed( 'ipblock-exempt' ) ) {
@@ -4531,7 +4563,7 @@ class User implements IDBAccessObject {
         * @note Since these URLs get dropped directly into emails, using the
         * short English names avoids insanely long URL-encoded links, which
         * also sometimes can get corrupted in some browsers/mailers
-        * (bug 6957 with Gmail and Internet Explorer).
+        * (T8957 with Gmail and Internet Explorer).
         *
         * @param string $page Special page
         * @param string $token Token
@@ -5064,6 +5096,9 @@ class User implements IDBAccessObject {
 
        /**
         * Deferred version of incEditCountImmediate()
+        *
+        * This function, rather than incEditCountImmediate(), should be used for
+        * most cases as it avoids potential deadlocks caused by concurrent editing.
         */
        public function incEditCount() {
                wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle(
@@ -5265,6 +5300,13 @@ class User implements IDBAccessObject {
                                $this->mOptionOverrides = [];
                                $data = [];
                                foreach ( $res as $row ) {
+                                       // Convert '0' to 0. PHP's boolean conversion considers them both
+                                       // false, but e.g. JavaScript considers the former as true.
+                                       // @todo: T54542 Somehow determine the desired type (string/int/bool)
+                                       //  and convert all values here.
+                                       if ( $row->up_value === '0' ) {
+                                               $row->up_value = 0;
+                                       }
                                        $data[$row->up_property] = $row->up_value;
                                }
                        }
@@ -5391,7 +5433,7 @@ class User implements IDBAccessObject {
                # Note that the pattern requirement will always be satisfied if the
                # input is empty, so we need required in all cases.
 
-               # @todo FIXME: Bug 23769: This needs to not claim the password is required
+               # @todo FIXME: T25769: This needs to not claim the password is required
                # if e-mail confirmation is being used.  Since HTML5 input validation
                # is b0rked anyway in some browsers, just return nothing.  When it's
                # re-enabled, fix this code to not output required for e-mail
index dddc850..ab6683b 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 abstract class UserArray implements Iterator {
        /**
         * @param ResultWrapper $res
@@ -38,7 +40,7 @@ abstract class UserArray implements Iterator {
 
        /**
         * @param array $ids
-        * @return UserArrayFromResult
+        * @return UserArrayFromResult|ArrayIterator
         */
        static function newFromIDs( $ids ) {
                $ids = array_map( 'intval', (array)$ids ); // paranoia
@@ -59,7 +61,7 @@ abstract class UserArray implements Iterator {
        /**
         * @since 1.25
         * @param array $names
-        * @return UserArrayFromResult
+        * @return UserArrayFromResult|ArrayIterator
         */
        static function newFromNames( $names ) {
                $names = array_map( 'strval', (array)$names ); // paranoia
index fb533d0..527df7f 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 class UserArrayFromResult extends UserArray implements Countable {
        /** @var ResultWrapper */
        public $res;
@@ -27,7 +29,7 @@ class UserArrayFromResult extends UserArray implements Countable {
        /** @var int */
        public $key;
 
-       /** @var bool|stdClass */
+       /** @var bool|User */
        public $current;
 
        /**
index 59ca31c..cf05df3 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Represents a "user group membership" -- a specific instance of a user belonging
  * to a group. For example, the fact that user Mary belongs to the sysop group is a
@@ -47,11 +49,6 @@ class UserGroupMembership {
         * @param string|null $expiry Timestamp of expiry in TS_MW format, or null if no expiry
         */
        public function __construct( $userId = 0, $group = null, $expiry = null ) {
-               global $wgDisableUserGroupExpiry;
-               if ( $wgDisableUserGroupExpiry ) {
-                       $expiry = null;
-               }
-
                $this->userId = (int)$userId;
                $this->group = $group; // TODO throw on invalid group?
                $this->expiry = $expiry ?: null;
@@ -75,26 +72,15 @@ class UserGroupMembership {
         * @return string|null Timestamp of expiry in TS_MW format, or null if no expiry
         */
        public function getExpiry() {
-               global $wgDisableUserGroupExpiry;
-               if ( $wgDisableUserGroupExpiry ) {
-                       return null;
-               }
-
                return $this->expiry;
        }
 
        protected function initFromRow( $row ) {
-               global $wgDisableUserGroupExpiry;
-
                $this->userId = (int)$row->ug_user;
                $this->group = $row->ug_group;
-               if ( $wgDisableUserGroupExpiry ) {
-                       $this->expiry = null;
-               } else {
-                       $this->expiry = $row->ug_expiry === null ?
-                               null :
-                               wfTimestamp( TS_MW, $row->ug_expiry );
-               }
+               $this->expiry = $row->ug_expiry === null ?
+                       null :
+                       wfTimestamp( TS_MW, $row->ug_expiry );
        }
 
        /**
@@ -115,19 +101,11 @@ class UserGroupMembership {
         * @return array
         */
        public static function selectFields() {
-               global $wgDisableUserGroupExpiry;
-               if ( $wgDisableUserGroupExpiry ) {
-                       return [
-                               'ug_user',
-                               'ug_group',
-                       ];
-               } else {
-                       return [
-                               'ug_user',
-                               'ug_group',
-                               'ug_expiry',
-                       ];
-               }
+               return [
+                       'ug_user',
+                       'ug_group',
+                       'ug_expiry',
+               ];
        }
 
        /**
@@ -138,7 +116,6 @@ class UserGroupMembership {
         * @return bool Whether or not anything was deleted
         */
        public function delete( IDatabase $dbw = null ) {
-               global $wgDisableUserGroupExpiry;
                if ( wfReadOnly() ) {
                        return false;
                }
@@ -147,14 +124,10 @@ class UserGroupMembership {
                        $dbw = wfGetDB( DB_MASTER );
                }
 
-               if ( $wgDisableUserGroupExpiry ) {
-                       $dbw->delete( 'user_groups', $this->getDatabaseArray( $dbw ), __METHOD__ );
-               } else {
-                       $dbw->delete(
-                               'user_groups',
-                               [ 'ug_user' => $this->userId, 'ug_group' => $this->group ],
-                               __METHOD__ );
-               }
+               $dbw->delete(
+                       'user_groups',
+                       [ 'ug_user' => $this->userId, 'ug_group' => $this->group ],
+                       __METHOD__ );
                if ( !$dbw->affectedRows() ) {
                        return false;
                }
@@ -180,7 +153,6 @@ class UserGroupMembership {
         * @return bool Whether or not anything was inserted
         */
        public function insert( $allowUpdate = false, IDatabase $dbw = null ) {
-               global $wgDisableUserGroupExpiry;
                if ( $dbw === null ) {
                        $dbw = wfGetDB( DB_MASTER );
                }
@@ -204,7 +176,7 @@ class UserGroupMembership {
 
                // Don't collide with expired user group memberships
                // Do this after trying to insert, in order to avoid locking
-               if ( !$wgDisableUserGroupExpiry && !$affected ) {
+               if ( !$affected ) {
                        $conds = [
                                'ug_user' => $row['ug_user'],
                                'ug_group' => $row['ug_group'],
@@ -243,16 +215,11 @@ class UserGroupMembership {
         * @return array
         */
        protected function getDatabaseArray( IDatabase $db ) {
-               global $wgDisableUserGroupExpiry;
-
-               $a = [
+               return [
                        'ug_user' => $this->userId,
                        'ug_group' => $this->group,
+                       'ug_expiry' => $this->expiry ? $db->timestamp( $this->expiry ) : null,
                ];
-               if ( !$wgDisableUserGroupExpiry ) {
-                       $a['ug_expiry'] = $this->expiry ? $db->timestamp( $this->expiry ) : null;
-               }
-               return $a;
        }
 
        /**
@@ -260,8 +227,7 @@ class UserGroupMembership {
         * @return bool
         */
        public function isExpired() {
-               global $wgDisableUserGroupExpiry;
-               if ( $wgDisableUserGroupExpiry || !$this->expiry ) {
+               if ( !$this->expiry ) {
                        return false;
                } else {
                        return wfTimestampNow() > $this->expiry;
@@ -274,8 +240,7 @@ class UserGroupMembership {
         * @param IDatabase|null $dbw
         */
        public static function purgeExpired( IDatabase $dbw = null ) {
-               global $wgDisableUserGroupExpiry;
-               if ( $wgDisableUserGroupExpiry || wfReadOnly() ) {
+               if ( wfReadOnly() ) {
                        return;
                }
 
index d801fa0..4df73f7 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Cut-down copy of User interface for local-interwiki-database
  * user rights manipulation.
index 55e228a..54a8677 100644 (file)
@@ -152,7 +152,7 @@ class AutoloadGenerator {
                ksort( $json[$key] );
 
                // Return the whole JSON file
-               return FormatJson::encode( $json, true ) . "\n";
+               return FormatJson::encode( $json, "\t", FormatJson::ALL_OK ) . "\n";
        }
 
        /**
@@ -212,7 +212,6 @@ global \${$this->variableName};
 ];
 
 EOD;
-
        }
 
        /**
@@ -432,6 +431,15 @@ class ClassCollector {
                                        $this->classes[] = $this->alias['name'];
                                        $this->alias = null;
                                        $this->startToken = null;
+                               } elseif ( !is_array( $token ) || (
+                                       $token[0] !== T_STRING &&
+                                       $token[0] !== T_DOUBLE_COLON &&
+                                       $token[0] !== T_CLASS &&
+                                       $token[0] !== T_WHITESPACE
+                               ) ) {
+                                       // Ignore this call to class_alias() - compat/Timestamp.php
+                                       $this->alias = null;
+                                       $this->startToken = null;
                                }
                        }
                        break;
index ef2c14a..cab6a3d 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Allows iterating a large number of rows in batches transparently.
  * By default when iterated over returns the full query result as an
@@ -84,9 +87,9 @@ class BatchRowIterator implements RecursiveIterator {
 
        /**
         * @param IDatabase $db The database to read from
-        * @param string|array $table      The name or names of the table to read from
+        * @param string|array $table The name or names of the table to read from
         * @param string|array $primaryKey The name or names of the primary key columns
-        * @param integer      $batchSize  The number of rows to fetch per iteration
+        * @param integer $batchSize The number of rows to fetch per iteration
         * @throws InvalidArgumentException
         */
        public function __construct( IDatabase $db, $table, $primaryKey, $batchSize ) {
@@ -230,7 +233,7 @@ class BatchRowIterator implements RecursiveIterator {
         * `=` conditions while the final key uses a `>` condition
         *
         * Example output:
-        *        [ '( foo = 42 AND bar > 7 ) OR ( foo > 42 )' ]
+        *     [ '( foo = 42 AND bar > 7 ) OR ( foo > 42 )' ]
         *
         * @return array The SQL conditions necessary to select the next set
         *  of rows in the batched query
index a6e47c8..70afb91 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Maintenance
  */
+use Wikimedia\Rdbms\IDatabase;
 use \MediaWiki\MediaWikiServices;
 
 class BatchRowWriter {
index 3bddd77..1c8d486 100644 (file)
@@ -47,11 +47,11 @@ class MWCryptHKDF {
         * From http://eprint.iacr.org/2010/264.pdf:
         *
         * The scheme HKDF is specifed as:
-        *      HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
+        *   HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
         * where the values K(i) are defined as follows:
-        *      PRK = HMAC(XTS, SKM)
-        *      K(1) = HMAC(PRK, CTXinfo || 0);
-        *      K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
+        *   PRK = HMAC(XTS, SKM)
+        *   K(1) = HMAC(PRK, CTXinfo || 0);
+        *   K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
         * where t = [L/k] and the value K(t) is truncated to its first d = L mod k bits;
         * the counter i is non-wrapping and of a given fixed size, e.g., a single byte.
         * Note that the length of the HMAC output is the same as its key length and therefore
index 212f325..dd67fa8 100644 (file)
@@ -716,21 +716,3 @@ class ZipDirectoryReader {
        }
 }
 
-/**
- * Internal exception class. Will be caught by private code.
- */
-class ZipDirectoryReaderError extends Exception {
-       protected $errorCode;
-
-       function __construct( $code ) {
-               $this->errorCode = $code;
-               parent::__construct( "ZipDirectoryReader error: $code" );
-       }
-
-       /**
-        * @return mixed
-        */
-       function getErrorCode() {
-               return $this->errorCode;
-       }
-}
diff --git a/includes/utils/ZipDirectoryReaderError.php b/includes/utils/ZipDirectoryReaderError.php
new file mode 100644 (file)
index 0000000..592036e
--- /dev/null
@@ -0,0 +1,38 @@
+<?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
+ */
+
+/**
+ * Internal exception class. Will be caught by private code.
+ */
+class ZipDirectoryReaderError extends Exception {
+       protected $errorCode;
+
+       function __construct( $code ) {
+               $this->errorCode = $code;
+               parent::__construct( "ZipDirectoryReader error: $code" );
+       }
+
+       /**
+        * @return mixed
+        */
+       function getErrorCode() {
+               return $this->errorCode;
+       }
+}
index 0d71629..49510da 100644 (file)
@@ -31,7 +31,6 @@ class SearchInputWidget extends TitleInputWidget {
        public function __construct( array $config = [] ) {
                $config = array_merge( [
                        'maxLength' => null,
-                       'type' => 'search',
                        'icon' => 'search',
                ], $config );
 
@@ -56,6 +55,10 @@ class SearchInputWidget extends TitleInputWidget {
                $this->addClasses( [ 'mw-widget-searchInputWidget' ] );
        }
 
+       protected function getInputElement( $config ) {
+               return ( new \OOUI\Tag( 'input' ) )->setAttributes( [ 'type' => 'search' ] );
+       }
+
        protected function getJavaScriptClassName() {
                return 'mw.widgets.SearchInputWidget';
        }
diff --git a/includes/widget/SelectWithInputWidget.php b/includes/widget/SelectWithInputWidget.php
new file mode 100644 (file)
index 0000000..8faae82
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+/**
+ * MediaWiki Widgets – SelectWithInputWidget class.
+ *
+ * @copyright 2011-2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+namespace MediaWiki\Widget;
+
+use \OOUI\TextInputWidget;
+use \OOUI\DropdownInputWidget;
+
+/**
+ * Select and input widget.
+ */
+class SelectWithInputWidget extends \OOUI\Widget {
+
+       protected $textinput = null;
+       protected $dropdowninput = null;
+
+       /**
+        * A version of the SelectWithInputWidget, with `or` set to true.
+        *
+        * @param array $config Configuration options
+        * @param array $config['textinput'] Configuration for the TextInputWidget
+        * @param array $config['dropdowninput'] Configuration for the DropdownInputWidget
+        * @param boolean $config['or'] Configuration for whether the widget is dropdown AND input
+        *                              or dropdown OR input
+        */
+       public function __construct( array $config = [] ) {
+               // Configuration initialization
+               $config = array_merge(
+                       [
+                               'textinput' => [],
+                               'dropdowninput' => [],
+                               'or' => false
+                       ],
+                       $config
+               );
+
+               // Parent constructor
+               parent::__construct( $config );
+
+               // Properties
+               $this->config = $config;
+               $this->textinput = new TextInputWidget( $config['textinput'] );
+               $this->dropdowninput = new DropdownInputWidget( $config['dropdowninput'] );
+
+               // Initialization
+               $this
+                       ->addClasses( [ 'mw-widget-selectWithInputWidget' ] )
+                       ->appendContent( $this->dropdowninput, $this->textinput );
+       }
+
+       protected function getJavaScriptClassName() {
+               return 'mw.widgets.SelectWithInputWidget';
+       }
+
+       public function getConfig( &$config ) {
+               $config['textinput'] = $this->config['textinput'];
+               $config['dropdowninput'] = $this->config['dropdowninput'];
+               $config['or'] = $this->config['or'];
+               return parent::getConfig( $config );
+       }
+}
index 76b9b01..6d942de 100644 (file)
@@ -8,6 +8,7 @@ use SearchResultSet;
 use SpecialSearch;
 use Title;
 use Html;
+use OOUI;
 
 /**
  * Renders one or more SearchResultSets into a sidebar grouped by
@@ -27,23 +28,22 @@ class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
        protected $iwLookup;
        /** @var $output */
        protected $output;
-       /** @var $iwPrefixDisplayTypes */
-       protected $iwPrefixDisplayTypes;
+       /** @var bool $showMultimedia */
+       protected $showMultimedia;
 
        public function __construct(
                SpecialSearch $specialSearch,
                SearchResultWidget $resultWidget,
                LinkRenderer $linkRenderer,
-               InterwikiLookup $iwLookup
+               InterwikiLookup $iwLookup,
+               $showMultimedia = false
        ) {
                $this->specialSearch = $specialSearch;
                $this->resultWidget = $resultWidget;
                $this->linkRenderer = $linkRenderer;
                $this->iwLookup = $iwLookup;
                $this->output = $specialSearch->getOutput();
-               $this->iwPrefixDisplayTypes = $specialSearch->getConfig()->get(
-                       'InterwikiPrefixDisplayTypes'
-               );
+               $this->showMultimedia = $showMultimedia;
        }
        /**
         * @param string $term User provided search term
@@ -58,7 +58,9 @@ class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
 
                $this->loadCustomCaptions();
 
-               $this->output->addModules( 'mediawiki.special.search.commonsInterwikiWidget' );
+               if ( $this->showMultimedia ) {
+                       $this->output->addModules( 'mediawiki.special.search.commonsInterwikiWidget' );
+               }
                $this->output->addModuleStyles( 'mediawiki.special.search.interwikiwidget.styles' );
 
                $iwResults = [];
@@ -80,22 +82,17 @@ class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
                        $position = 0;
                        $iwResultItemOutput = '';
 
-                       $iwDisplayType = isset( $this->iwPrefixDisplayTypes[$iwPrefix] )
-                               ? $this->iwPrefixDisplayTypes[$iwPrefix]
-                               : "";
-
                        foreach ( $results as $result ) {
                                $iwResultItemOutput .= $this->resultWidget->render( $result, $term, $position++ );
                        }
 
-                       $headerHtml = $this->headerHtml( $term, $iwPrefix );
                        $footerHtml = $this->footerHtml( $term, $iwPrefix );
                        $iwResultListOutput .= Html::rawElement( 'li',
                                [
-                                       'class' => 'iw-resultset iw-resultset--' . $iwDisplayType,
+                                       'class' => 'iw-resultset',
                                        'data-iw-resultset-pos' => $iwResultSetPos
                                ],
-                               $headerHtml .
+
                                $iwResultItemOutput .
                                $footerHtml
                        );
@@ -117,34 +114,6 @@ class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
                );
        }
 
-       /**
-        * Generates an appropriate HTML header for the given interwiki prefix
-        *
-        * @param string $term User provided search term
-        * @param string $iwPrefix Interwiki prefix of wiki to show header for
-        * @return string HTML
-        */
-       protected function headerHtml( $term, $iwPrefix ) {
-
-               $iwDisplayType = isset( $this->iwPrefixDisplayTypes[$iwPrefix] )
-                       ? $this->iwPrefixDisplayTypes[$iwPrefix]
-                       : "";
-
-               if ( isset( $this->customCaptions[$iwPrefix] ) ) {
-                       /* customCaptions composed by loadCustomCaptions() with pre-escaped content.*/
-                       $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'] )->escaped();
-               }
-
-               return Html::rawElement( 'div', [ 'class' => 'iw-result__header' ],
-                       Html::rawElement( 'span', [ 'class' => 'iw-result__icon iw-result__icon--' . $iwDisplayType ] )
-                       . $caption
-               );
-       }
-
        /**
         * Generates an HTML footer for the given interwiki prefix
         *
@@ -158,13 +127,22 @@ class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
                        [ 'search' => $term, 'fulltext' => 1 ]
                );
 
-               $searchLink = Html::rawElement(
-                       'a',
-                       [ 'href' => $href ],
-                       $this->specialSearch->msg( 'search-interwiki-more' )->escaped()
+               $interwiki = $this->iwLookup->fetch( $iwPrefix );
+               $parsed = wfParseUrl( wfExpandUrl( $interwiki ? $interwiki->getURL() : '/' ) );
+
+               if ( isset( $this->customCaptions[$iwPrefix] ) ) {
+                       $caption = $this->customCaptions[$iwPrefix];
+               } else {
+                       $caption = $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->escaped();
+               }
+
+               $searchLink = Html::rawElement( 'em', null,
+                       Html::rawElement( 'a', [ 'href' => $href, 'target' => '_blank' ], $caption )
                );
 
-               return Html::rawElement( 'div', [ 'class' => 'iw-result__footer' ], $searchLink );
+               return Html::rawElement( 'div',
+                       [ 'class' => 'iw-result__footer' ],
+                       $this->iwIcon( $iwPrefix ) . $searchLink );
        }
 
        protected function loadCustomCaptions() {
@@ -181,4 +159,33 @@ class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
                        }
                }
        }
+
+       /**
+        * Generates a custom OOUI icon element with a favicon as the image.
+        * The favicon image URL is generated by parsing the interwiki URL
+        * and returning the default location of the favicon for that domain,
+        * which is assumed to be '/favicon.ico'.
+        *
+        * @param string $iwPrefix Interwiki prefix
+        * @return OOUI\IconWidget
+        **/
+       protected function iwIcon( $iwPrefix ) {
+
+               $interwiki = $this->iwLookup->fetch( $iwPrefix );
+               $parsed = wfParseUrl( wfExpandUrl( $interwiki ? $interwiki->getURL() : '/' ) );
+
+               $iwIconUrl = $parsed['scheme'] .
+                       $parsed['delimiter'] .
+                       $parsed['host'] .
+                       ( $parsed['port'] ? ':' . $parsed['port'] : '' ) .
+                       '/favicon.ico';
+
+               $iwIcon = new OOUI\IconWidget( [
+                       'icon' => 'favicon'
+                ] );
+
+                $iwIcon->setAttributes( [ 'style' => "background-image:url($iwIconUrl);" ] );
+
+               return $iwIcon;
+       }
 }
index 6b51db5..acd792d 100644 (file)
@@ -17,13 +17,10 @@ class InterwikiSearchResultWidget implements SearchResultWidget {
        protected $specialSearch;
        /** @var LinkRenderer */
        protected $linkRenderer;
-       /** @var $iwPrefixDisplayTypes */
-       protected $iwPrefixDisplayTypes;
 
        public function __construct( SpecialSearch $specialSearch, LinkRenderer $linkRenderer ) {
                $this->specialSearch = $specialSearch;
                $this->linkRenderer = $linkRenderer;
-               $this->iwPrefixDisplayTypes = $specialSearch->getConfig()->get( 'InterwikiPrefixDisplayTypes' );
        }
 
        /**
@@ -38,9 +35,6 @@ class InterwikiSearchResultWidget implements SearchResultWidget {
                $iwPrefix = $result->getTitle()->getInterwiki();
                $titleSnippet = $result->getTitleSnippet();
                $snippet = $result->getTextSnippet( $terms );
-               $displayType = isset( $this->iwPrefixDisplayTypes[$iwPrefix] )
-                       ? $this->iwPrefixDisplayTypes[$iwPrefix]
-                       : "";
 
                if ( $titleSnippet ) {
                        $titleSnippet = new HtmlArmor( $titleSnippet );
@@ -69,18 +63,7 @@ class InterwikiSearchResultWidget implements SearchResultWidget {
                        );
                }
 
-               switch ( $displayType ) {
-                       case 'definition':
-                               return "<div class='iw-result__content'>" .
-                                       "<span class='iw-result__title'>{$link} {$redirect}: </span>" .
-                                       $snippet .
-                               "</div>";
-                       case 'quotation':
-                               return "<div class='iw-result__content'>{$snippet}</div>" .
-                                       "<div class='iw-result__title'>{$link} {$redirect}</div>";
-                       default:
-                               return "<div class='iw-result__title'>{$link} {$redirect}</div>" .
-                                       "<div class='iw-result__content'>{$snippet}</div>";
-               }
+               return Html::rawElement( 'div', [ 'class' => 'iw-result__title' ], $link . ' ' . $redirect ) .
+                       Html::rawElement( 'div', [ 'class'=> 'iw-result__content' ], $snippet );
        }
 }
index b8d415f..008ed19 100644 (file)
@@ -103,7 +103,11 @@ class SearchFormWidget {
                if ( $totalResults > 0 && $offset < $totalResults ) {
                        $html .= Xml::tags(
                                'div',
-                               [ 'class' => 'results-info' ],
+                               [
+                                       'class' => 'results-info',
+                                       'data-mw-num-results-offset' => $offset,
+                                       'data-mw-num-results-total' => $totalResults
+                               ],
                                $this->specialSearch->msg( 'search-showingresults' )
                                        ->numParams( $offset + 1, $offset + $numResults, $totalResults )
                                        ->numParams( $numResults )
@@ -206,16 +210,13 @@ class SearchFormWidget {
         */
        protected function optionsHtml( $term, $isPowerSearch, $profile ) {
                $html = '';
-               $opts = [
-                       'profile' => $profile,
-               ];
 
                if ( $isPowerSearch ) {
-                       $html .= $this->powerSearchBox( $term, $opts );
+                       $html .= $this->powerSearchBox( $term, [] );
                } else {
                        $form = '';
                        Hooks::run( 'SpecialSearchProfileForm', [
-                               $this->specialSearch, &$form, $profile, $term, $opts
+                               $this->specialSearch, &$form, $profile, $term, []
                        ] );
                        $html .= $form;
                }
index 04e1e21..4df2eb5 100644 (file)
@@ -14,7 +14,7 @@ use Html;
  * interwiki prefix. Includes a per-wiki header indicating where
  * the results are from.
  */
-class SimpleSearchResultSetWidget implements SearchResultSetWidget{
+class SimpleSearchResultSetWidget implements SearchResultSetWidget {
        /** @var SpecialSearch */
        protected $specialSearch;
        /** @var SearchResultWidget */
index 228c5c4..f7771d1 100644 (file)
@@ -20,7 +20,6 @@
                "resources/src/mediawiki.toolbar",
                "resources/src/mediawiki.widgets",
                "resources/src/jquery/jquery.accessKeyLabel.js",
-               "resources/src/jquery/jquery.arrowSteps.js",
                "resources/src/jquery/jquery.autoEllipsis.js",
                "resources/src/jquery/jquery.badge.js",
                "resources/src/jquery/jquery.byteLength.js",
index 78019a7..0cddc99 100644 (file)
  */
 
 /**
- * A fake language converter
+ * A fake language variant converter. Languages which do not implement variant
+ * conversion, for example, English, should return a FakeConverter rather than a
+ * LanguageConverter when asked for their converter. The fake converter just
+ * returns text unchanged, i.e. it doesn't do any conversion.
+ *
+ * See https://www.mediawiki.org/wiki/Writing_systems#LanguageConverter.
  *
  * @ingroup Language
  */
@@ -64,6 +69,9 @@ class FakeConverter {
                return $this->mLang->getFormattedNsText( $ns );
        }
 
+       /**
+        * @return string[]
+        */
        function getVariants() {
                return [ $this->mLang->getCode() ];
        }
index a1cc4bc..fb45cf7 100644 (file)
@@ -415,10 +415,10 @@ class Language {
        function __construct() {
                $this->mConverter = new FakeConverter( $this );
                // Set the code to the name of the descendant
-               if ( get_class( $this ) == 'Language' ) {
+               if ( static::class === 'Language' ) {
                        $this->mCode = 'en';
                } else {
-                       $this->mCode = str_replace( '_', '-', strtolower( substr( get_class( $this ), 8 ) ) );
+                       $this->mCode = str_replace( '_', '-', strtolower( substr( static::class, 8 ) ) );
                }
                self::getLocalisationCache();
        }
@@ -725,7 +725,7 @@ class Language {
        }
 
        /**
-        * @return array
+        * @return string[]|bool List of date format preference keys, or false if disabled.
         */
        public function getDatePreferences() {
                return self::$dataCache->getItem( $this->mCode, 'datePreferences' );
@@ -2158,12 +2158,10 @@ class Language {
         * the date preference they're supposed to use, it should be used in
         * all children.
         *
-        *<code>
-        * function timeanddate([...], $format = true) {
-        *      $datePreference = $this->dateFormat($format);
-        * [...]
-        * }
-        *</code>
+        *     function timeanddate([...], $format = true) {
+        *       $datePreference = $this->dateFormat($format);
+        *       [...]
+        *     }
         *
         * @param int|string|bool $usePrefs If true, the user's preference is used
         *   if false, the site/language default is used
@@ -3286,14 +3284,14 @@ class Language {
        public function parseFormattedNumber( $number ) {
                $s = $this->digitTransformTable();
                if ( $s ) {
-                       // eliminate empty array values such as ''. (bug 64347)
+                       // eliminate empty array values such as ''. (T66347)
                        $s = array_filter( $s );
                        $number = strtr( $number, array_flip( $s ) );
                }
 
                $s = $this->separatorTransformTable();
                if ( $s ) {
-                       // eliminate empty array values such as ''. (bug 64347)
+                       // eliminate empty array values such as ''. (T66347)
                        $s = array_filter( $s );
                        $number = strtr( $number, array_flip( $s ) );
                }
@@ -3497,7 +3495,7 @@ class Language {
                                $string = $ellipsis . $string;
                        }
                }
-               # Do not truncate if the ellipsis makes the string longer/equal (bug 22181).
+               # Do not truncate if the ellipsis makes the string longer/equal (T24181).
                # This check is *not* redundant if $adjustLength, due to the single case where
                # LEN($ellipsis) > ABS($limit arg); $stringOriginal could be shorter than $string.
                if ( strlen( $string ) < strlen( $stringOriginal ) ) {
@@ -4129,7 +4127,7 @@ class Language {
         * Get the list of variants supported by this language
         * see sample implementation in LanguageZh.php
         *
-        * @return array An array of language codes
+        * @return string[] An array of language codes
         */
        public function getVariants() {
                return $this->mConverter->getVariants();
diff --git a/languages/LanguageCode.php b/languages/LanguageCode.php
new file mode 100644 (file)
index 0000000..7c9da77
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Language
+ */
+
+/**
+ * Methods for dealing with language codes.
+ * @todo Move some of the code-related static methods out of Language into this class
+ *
+ * @since 1.29
+ * @ingroup Language
+ */
+class LanguageCode {
+       /**
+        * Returns a mapping of deprecated language codes that were used in previous
+        * versions of MediaWiki to up-to-date, current language codes.
+        *
+        * This array is merged into $wgDummyLanguageCodes in Setup.php, along with
+        * the fake language codes 'qqq' and 'qqx', which are used internally by
+        * MediaWiki's localisation system.
+        *
+        * @return string[]
+        */
+       public static function getDeprecatedCodeMapping() {
+               return [
+                       // Note that als is actually a valid ISO 639 code (Tosk Albanian), but it
+                       // was previously used in MediaWiki for Alsatian, which comes under gsw
+                       'als' => 'gsw',
+                       'bat-smg' => 'sgs',
+                       'be-x-old' => 'be-tarask',
+                       'fiu-vro' => 'vro',
+                       'roa-rup' => 'rup',
+                       'zh-classical' => 'lzh',
+                       'zh-min-nan' => 'nan',
+                       'zh-yue' => 'yue',
+               ];
+       }
+}
index 06fec44..5382df4 100644 (file)
@@ -48,6 +48,10 @@ class LanguageConverter {
        ];
 
        public $mMainLanguageCode;
+
+       /**
+        * @var string[]
+        */
        public $mVariants;
        public $mVariantFallbacks;
        public $mVariantNames;
@@ -56,11 +60,6 @@ class LanguageConverter {
        // 'bidirectional' 'unidirectional' 'disable' for each variant
        public $mManualLevel;
 
-       /**
-        * @var string Memcached key name
-        */
-       public $mCacheKey;
-
        public $mLangObj;
        public $mFlags;
        public $mDescCodeSep = ':', $mDescVarSep = ';';
@@ -75,11 +74,9 @@ class LanguageConverter {
        const CACHE_VERSION_KEY = 'VERSION 7';
 
        /**
-        * Constructor
-        *
         * @param Language $langobj
         * @param string $maincode The main language code of this language
-        * @param array $variants The supported variants of this language
+        * @param string[] $variants The supported variants of this language
         * @param array $variantfallbacks The fallback language of each variant
         * @param array $flags Defining the custom strings that maps to the flags
         * @param array $manualLevel Limit for supported variants
@@ -93,19 +90,18 @@ class LanguageConverter {
                $this->mVariants = array_diff( $variants, $wgDisabledVariants );
                $this->mVariantFallbacks = $variantfallbacks;
                $this->mVariantNames = Language::fetchLanguageNames();
-               $this->mCacheKey = wfMemcKey( 'conversiontables', $maincode );
                $defaultflags = [
                        // 'S' show converted text
                        // '+' add rules for alltext
                        // 'E' the gave flags is error
                        // these flags above are reserved for program
-                       'A' => 'A',       // add rule for convert code (all text convert)
-                       'T' => 'T',       // title convert
-                       'R' => 'R',       // raw content
-                       'D' => 'D',       // convert description (subclass implement)
-                       '-' => '-',       // remove convert (not implement)
-                       'H' => 'H',       // add rule for convert code (but no display in placed code)
-                       'N' => 'N'        // current variant name
+                       'A' => 'A',   // add rule for convert code (all text convert)
+                       'T' => 'T',   // title convert
+                       'R' => 'R',   // raw content
+                       'D' => 'D',   // convert description (subclass implement)
+                       '-' => '-',   // remove convert (not implement)
+                       'H' => 'H',   // add rule for convert code (but no display in placed code)
+                       'N' => 'N',   // current variant name
                ];
                $this->mFlags = array_merge( $defaultflags, $flags );
                foreach ( $this->mVariants as $v ) {
@@ -122,7 +118,7 @@ class LanguageConverter {
         * Get all valid variants.
         * Call this instead of using $this->mVariants directly.
         *
-        * @return array Contains all valid variants
+        * @return string[] Contains all valid variants
         */
        public function getVariants() {
                return $this->mVariants;
@@ -357,10 +353,10 @@ class LanguageConverter {
                }
 
                /* we convert everything except:
-                  1. HTML markups (anything between < and >)
-                  2. HTML entities
-                  3. placeholders created by the parser
-               */
+                * 1. HTML markups (anything between < and >)
+                * 2. HTML entities
+                * 3. placeholders created by the parser
+                */
                $marker = '|' . Parser::MARKER_PREFIX . '[\-a-zA-Z0-9]+';
 
                // this one is needed when the text is inside an HTML markup
@@ -380,6 +376,7 @@ class LanguageConverter {
                $literalBlob = '';
 
                // Guard against delimiter nulls in the input
+               // (should never happen: see T159174)
                $text = str_replace( "\000", '', $text );
 
                $markupMatches = null;
@@ -489,7 +486,7 @@ class LanguageConverter {
        protected function applyManualConv( $convRule ) {
                // Use syntax -{T|zh-cn:TitleCN; zh-tw:TitleTw}- to custom
                // title conversion.
-               // Bug 24072: $mConvRuleTitle was overwritten by other manual
+               // T26072: $mConvRuleTitle was overwritten by other manual
                // rule(s) not for title, this breaks the title conversion.
                $newConvRuleTitle = $convRule->getTitle();
                if ( $newConvRuleTitle ) {
@@ -844,9 +841,8 @@ class LanguageConverter {
         * @throws MWException
         */
        function loadDefaultTables() {
-               $name = get_class( $this );
-
-               throw new MWException( "Must implement loadDefaultTables() method in class $name" );
+               $class = static::class;
+               throw new MWException( "Must implement loadDefaultTables() method in class $class" );
        }
 
        /**
@@ -864,13 +860,11 @@ class LanguageConverter {
                $this->mTablesLoaded = true;
                $this->mTables = false;
                $cache = ObjectCache::getInstance( $wgLanguageConverterCacheType );
+               $cacheKey = $cache->makeKey( 'conversiontables', $this->mMainLanguageCode );
                if ( $fromCache ) {
-                       wfProfileIn( __METHOD__ . '-cache' );
-                       $this->mTables = $cache->get( $this->mCacheKey );
-                       wfProfileOut( __METHOD__ . '-cache' );
+                       $this->mTables = $cache->get( $cacheKey );
                }
                if ( !$this->mTables || !array_key_exists( self::CACHE_VERSION_KEY, $this->mTables ) ) {
-                       wfProfileIn( __METHOD__ . '-recache' );
                        // not in cache, or we need a fresh reload.
                        // We will first load the default tables
                        // then update them using things in MediaWiki:Conversiontable/*
@@ -883,8 +877,7 @@ class LanguageConverter {
                        $this->postLoadTables();
                        $this->mTables[self::CACHE_VERSION_KEY] = true;
 
-                       $cache->set( $this->mCacheKey, $this->mTables, 43200 );
-                       wfProfileOut( __METHOD__ . '-recache' );
+                       $cache->set( $cacheKey, $this->mTables, 43200 );
                }
        }
 
@@ -1085,12 +1078,12 @@ class LanguageConverter {
                        // text should be splited by ";" only if a valid variant
                        // name exist after the markup, for example:
                        //  -{zh-hans:<span style="font-size:120%;">xxx</span>;zh-hant:\
-                       //      <span style="font-size:120%;">yyy</span>;}-
+                       //  <span style="font-size:120%;">yyy</span>;}-
                        // we should split it as:
                        //  [
-                       //        [0] => 'zh-hans:<span style="font-size:120%;">xxx</span>'
-                       //        [1] => 'zh-hant:<span style="font-size:120%;">yyy</span>'
-                       //        [2] => ''
+                       //    [0] => 'zh-hans:<span style="font-size:120%;">xxx</span>'
+                       //    [1] => 'zh-hant:<span style="font-size:120%;">yyy</span>'
+                       //    [2] => ''
                        //  ]
                        $pat = '/;\s*(?=';
                        foreach ( $this->mVariants as $variant ) {
index 858a7be..90e3751 100644 (file)
@@ -30,7 +30,7 @@
 class LanguageAr extends Language {
 
        /**
-        * Temporary hack for bug 9413: replace Arabic presentation forms with their
+        * Temporary hack for T11413: replace Arabic presentation forms with their
         * standard equivalents.
         *
         * @todo FIXME: This is language-specific for now only to avoid the negative
index b413ef9..bd42a12 100644 (file)
@@ -33,7 +33,7 @@ class LanguageAz extends Language {
         * @return mixed|string
         */
        public function ucfirst( $string ) {
-               if ( $string[0] == 'i' ) {
+               if ( substr( $string, 0, 1 ) === 'i' ) {
                        return 'İ' . substr( $string, 1 );
                }
                return parent::ucfirst( $string );
index 3605e8d..3a50987 100644 (file)
@@ -391,7 +391,7 @@ class LanguageKk extends LanguageKk_cyrl {
         * @return string
         */
        public function ucfirst( $string ) {
-               if ( $string[0] == 'i' ) {
+               if ( substr( $string, 0, 1 ) === 'i' ) {
                        $variant = $this->getPreferredVariant();
                        if ( $variant == 'kk-latn' || $variant == 'kk-tr' ) {
                                return 'İ' . substr( $string, 1 );
@@ -408,7 +408,7 @@ class LanguageKk extends LanguageKk_cyrl {
         * @return string
         */
        function lcfirst( $string ) {
-               if ( $string[0] == 'I' ) {
+               if ( substr( $string, 0, 1 ) === 'I' ) {
                        $variant = $this->getPreferredVariant();
                        if ( $variant == 'kk-latn' || $variant == 'kk-tr' ) {
                                return 'ı' . substr( $string, 1 );
index 76568c2..9ef53e5 100644 (file)
@@ -63,13 +63,11 @@ class LanguageKsh extends Language {
         *
         * Possible values for the type of genitive are:
         *      Sing, Iehr            prepositioned genitive = possessive dative
-        *      Vun, Fon, -omitted-   postpositioned genitive
-        *                                     = preposition "vun" with dative
+        *      Vun, Fon, -omitted-   postpositioned genitive = preposition "vun" with dative
         *
         * Values of case overrides & prepositions, in the order of preceedence:
         *      Sing, Iehr            possessive dative = prepositioned genitive
-        *      Vun, Fon              preposition "vun" with dative
-        *                                           = postpositioned genitive
+        *      Vun, Fon              preposition "vun" with dative = postpositioned genitive
         *      En, em                preposition "en" with dative
         *
         * Values for object gender specifiers of the possessive dative, or
index d1963e1..f4082af 100644 (file)
@@ -50,12 +50,12 @@ class LanguageLa extends Language {
                case 'genitive':
                        // only a few declensions, and even for those mostly the singular only
                        $in = [
-                               '/u[ms]$/',                     # 2nd declension singular
-                               '/ommunia$/',                   # 3rd declension neuter plural (partly)
-                               '/a$/',                         # 1st declension singular
+                               '/u[ms]$/',                          # 2nd declension singular
+                               '/ommunia$/',                        # 3rd declension neuter plural (partly)
+                               '/a$/',                              # 1st declension singular
                                '/libri$/', '/nuntii$/', '/datae$/', # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                               '/es$/'                         # 5th declension singular
+                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                               '/es$/'                              # 5th declension singular
                        ];
                        $out = [
                                'i',
@@ -69,12 +69,12 @@ class LanguageLa extends Language {
                case 'accusative':
                        // only a few declensions, and even for those mostly the singular only
                        $in = [
-                               '/u[ms]$/',                     # 2nd declension singular
-                               '/a$/',                         # 1st declension singular
-                               '/ommuniam$/',              # 3rd declension neuter plural (partly)
+                               '/u[ms]$/',                          # 2nd declension singular
+                               '/a$/',                              # 1st declension singular
+                               '/ommuniam$/',                       # 3rd declension neuter plural (partly)
                                '/libri$/', '/nuntii$/', '/datam$/', # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                               '/es$/'                         # 5th declension singular
+                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                               '/es$/'                              # 5th declension singular
                        ];
                        $out = [
                                'um',
@@ -88,12 +88,12 @@ class LanguageLa extends Language {
                case 'ablative':
                        // only a few declensions, and even for those mostly the singular only
                        $in = [
-                               '/u[ms]$/',                     # 2nd declension singular
-                               '/ommunia$/',                   # 3rd declension neuter plural (partly)
-                               '/a$/',                         # 1st declension singular
-                               '/libri$/', '/nuntii$/', '/data$/', # 2nd declension plural (partly)
-                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                               '/es$/'                         # 5th declension singular
+                               '/u[ms]$/',                          # 2nd declension singular
+                               '/ommunia$/',                        # 3rd declension neuter plural (partly)
+                               '/a$/',                              # 1st declension singular
+                               '/libri$/', '/nuntii$/', '/data$/',  # 2nd declension plural (partly)
+                               '/tio$/', '/ns$/', '/as$/',          # 3rd declension singular (partly)
+                               '/es$/'                              # 5th declension singular
                        ];
                        $out = [
                                'o',
index cd39378..df894a1 100644 (file)
@@ -31,8 +31,8 @@ class LanguageMl extends Language {
         * Temporary hack for the issue described at
         * http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/46396
         * Convert Unicode 5.0 style Malayalam input to Unicode 5.1. Similar to
-        * bug 9413. Also fixes miscellaneous problems due to mishandling of ZWJ,
-        * e.g. bug 11162.
+        * T11413. Also fixes miscellaneous problems due to mishandling of ZWJ,
+        * e.g. T13162.
         *
         * @todo FIXME: This is language-specific for now only to avoid the negative
         * performance impact of enabling it for all languages.
index 42ee44d..49ee88a 100644 (file)
@@ -27,8 +27,7 @@
  * Turkish has two different i, one with a dot and another without a dot. They
  * are totally different letters in this language, so we have to override the
  * ucfirst and lcfirst methods.
- * See https://en.wikipedia.org/wiki/Dotted_and_dotless_I
- * and @bug 28040
+ * See https://en.wikipedia.org/wiki/Dotted_and_dotless_I and T30040
  * @ingroup Language
  */
 class LanguageTr extends Language {
index 0557455..76ced3e 100644 (file)
@@ -60,7 +60,7 @@ class Names {
                'als' => 'Alemannisch', # Alemannic -- not a valid code, for compatibility. See gsw.
                'am' => 'አማርኛ', # Amharic
                'an' => 'aragonés', # Aragonese
-               'ang' => 'Ænglisc', # Old English, bug 23283
+               'ang' => 'Ænglisc', # Old English, T25283
                'anp' => 'अङ्गिका', # Angika
                'ar' => 'العربية', # Arabic
                'arc' => 'ܐܪܡܝܐ', # Aramaic
@@ -71,6 +71,7 @@ class Names {
                'as' => 'অসমীয়া', # Assamese
                'ase' => 'American sign language', # American sign language
                'ast' => 'asturianu', # Asturian
+               'atj' => 'Atikamekw', # Atikamekw
                'av' => 'авар', # Avar
                'avk' => 'Kotava', # Kotava
                'awa' => 'अवधी', # Awadhi
@@ -131,6 +132,7 @@ class Names {
                'de-at' => 'Österreichisches Deutsch', # Austrian German
                'de-ch' => 'Schweizer Hochdeutsch', # Swiss Standard German
                'de-formal' => "Deutsch (Sie-Form)\xE2\x80\x8E", # German - formal address ("Sie")
+               'din' => 'Thuɔŋjäŋ', # Dinka
                'diq' => 'Zazaki', # Zazaki
                'dsb' => 'dolnoserbski', # Lower Sorbian
                'dtp' => 'Dusun Bundu-liwan', # Central Dusun
@@ -220,6 +222,7 @@ class Names {
                'kab' => 'Taqbaylit', # Kabyle
                'kbd' => 'Адыгэбзэ', # Kabardian
                'kbd-cyrl' => 'Адыгэбзэ', # Kabardian (Cyrillic)
+               'kbp' => 'Kabɩyɛ', # Kabiyè
                'kg' => 'Kongo', # Kongo, (FIXME!) should probaly be KiKongo or KiKoongo
                'khw' => 'کھوار', # Khowar
                'ki' => 'Gĩkũyũ', # Gikuyu
@@ -274,7 +277,7 @@ class Names {
                'lus' => 'Mizo ţawng', # Mizo/Lushai
                'luz' => 'لئری دوٙمینی', # Southern Luri
                'lv' => 'latviešu', # Latvian
-               'lzh' => '文言', # Literary Chinese, bug 8217
+               'lzh' => '文言', # Literary Chinese, T10217
                'lzz' => 'Lazuri', # Laz
                'mai' => 'मैथिली', # Maithili
                'map-bms' => 'Basa Banyumasan', # Banyumasan
@@ -299,8 +302,8 @@ class Names {
                'mzn' => 'مازِرونی', # Mazanderani
                'na' => 'Dorerin Naoero', # Nauruan
                'nah' => 'Nāhuatl', # Nahuatl (not in ISO 639-3)
-               'nan' => 'Bân-lâm-gú', # Min-nan, bug 8217
-               'nap' => 'Napulitano', # Neapolitan, bug 43793
+               'nan' => 'Bân-lâm-gú', # Min-nan, T10217
+               'nap' => 'Napulitano', # Neapolitan, T45793
                'nb' => 'norsk bokmål', # Norwegian (Bokmal)
                'nds' => 'Plattdüütsch', # Low German ''or'' Low Saxon
                'nds-nl' => 'Nedersaksies', # aka Nedersaksisch: Dutch Low Saxon
@@ -321,7 +324,7 @@ class Names {
                'olo' => 'Livvinkarjala', # Livvi-Karelian
                'om' => 'Oromoo', # Oromo
                'or' => 'ଓଡ଼ିଆ', # Oriya
-               'os' => 'Ирон', # Ossetic, bug 29091
+               'os' => 'Ирон', # Ossetic, T31091
                'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (Gurmukhi script) (pan)
                'pag' => 'Pangasinan', # Pangasinan
                'pam' => 'Kapampangan', # Pampanga
@@ -456,17 +459,17 @@ class Names {
                'za' => 'Vahcuengh', # Zhuang
                'zea' => 'Zeêuws', # Zeeuws/Zeaws
                'zh' => '中文', # (Zhōng Wén) - Chinese
-               'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see bug 8217)
+               'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see T10217)
                'zh-cn' => "中文(中国大陆)\xE2\x80\x8E", # Chinese (PRC)
                'zh-hans' => "中文(简体)\xE2\x80\x8E", # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
                'zh-hant' => "中文(繁體)\xE2\x80\x8E", # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
                'zh-hk' => "中文(香港)\xE2\x80\x8E", # Chinese (Hong Kong)
-               'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see bug 8217)
+               'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see T10217)
                'zh-mo' => "中文(澳門)\xE2\x80\x8E", # Chinese (Macau)
                'zh-my' => "中文(马来西亚)\xE2\x80\x8E", # Chinese (Malaysia)
                'zh-sg' => "中文(新加坡)\xE2\x80\x8E", # Chinese (Singapore)
                'zh-tw' => "中文(台灣)\xE2\x80\x8E", # Chinese (Taiwan)
-               'zh-yue' => '粵語', # Cantonese -- (see bug 8217)
+               'zh-yue' => '粵語', # Cantonese -- (see T10217)
                'zu' => 'isiZulu' # Zulu
        ];
 }
index a3cd622..03ebe21 100644 (file)
@@ -3008,7 +3008,6 @@ public static $zh2Hant = [
 '0只支援' => '0只支援',
 '0周后' => '0周後',
 '0天后' => '0天後',
-'0年' => '0年',
 '0只' => '0隻',
 '0余' => '0餘',
 '0出' => '0齣',
@@ -3016,63 +3015,54 @@ public static $zh2Hant = [
 '1只支援' => '1只支援',
 '1周后' => '1周後',
 '1天后' => '1天後',
-'1年' => '1年',
 '1只' => '1隻',
 '1余' => '1餘',
 '2只支持' => '2只支持',
 '2只支援' => '2只支援',
 '2周后' => '2周後',
 '2天后' => '2天後',
-'2年' => '2年',
 '2只' => '2隻',
 '2余' => '2餘',
 '3只支持' => '3只支持',
 '3只支援' => '3只支援',
 '3周后' => '3周後',
 '3天后' => '3天後',
-'3年' => '3年',
 '3只' => '3隻',
 '3余' => '3餘',
 '4只支持' => '4只支持',
 '4只支援' => '4只支援',
 '4周后' => '4周後',
 '4天后' => '4天後',
-'4年' => '4年',
 '4只' => '4隻',
 '4余' => '4餘',
 '5只支持' => '5只支持',
 '5只支援' => '5只支援',
 '5周后' => '5周後',
 '5天后' => '5天後',
-'5年' => '5年',
 '5只' => '5隻',
 '5余' => '5餘',
 '6只支持' => '6只支持',
 '6只支援' => '6只支援',
 '6周后' => '6周後',
 '6天后' => '6天後',
-'6年' => '6年',
 '6只' => '6隻',
 '6余' => '6餘',
 '7只支持' => '7只支持',
 '7只支援' => '7只支援',
 '7周后' => '7周後',
 '7天后' => '7天後',
-'7年' => '7年',
 '7只' => '7隻',
 '7余' => '7餘',
 '8只支持' => '8只支持',
 '8只支援' => '8只支援',
 '8周后' => '8周後',
 '8天后' => '8天後',
-'8年' => '8年',
 '8只' => '8隻',
 '8余' => '8餘',
 '9只支持' => '9只支持',
 '9只支援' => '9只支援',
 '9周后' => '9周後',
 '9天后' => '9天後',
-'9年' => '9年',
 '9只' => '9隻',
 '9余' => '9餘',
 '·范' => '·范',
@@ -3080,7 +3070,6 @@ public static $zh2Hant = [
 '、面点' => '、麵點',
 '。个中' => '。箇中',
 '〇周后' => '〇周後',
-'〇年' => '〇年',
 '〇只' => '〇隻',
 '〇余' => '〇餘',
 '“' => '「',
@@ -3107,8 +3096,6 @@ public static $zh2Hant = [
 '一干弟兄' => '一干弟兄',
 '一干弟子' => '一干弟子',
 '一干部下' => '一干部下',
-'一年' => '一年',
-'一年里' => '一年裡',
 '一斗斗' => '一斗斗',
 '一树百获' => '一樹百穫',
 '一准' => '一準',
@@ -3137,7 +3124,6 @@ public static $zh2Hant = [
 '七个' => '七個',
 '七周后' => '七周後',
 '七天后' => '七天後',
-'七年' => '七年',
 '七情六欲' => '七情六慾',
 '七扎' => '七紮',
 '七只' => '七隻',
@@ -3147,7 +3133,6 @@ public static $zh2Hant = [
 '三个' => '三個',
 '三周后' => '三周後',
 '三天后' => '三天後',
-'三年' => '三年',
 '三征七辟' => '三徵七辟',
 '三准' => '三準',
 '三扎' => '三紮',
@@ -3175,7 +3160,6 @@ public static $zh2Hant = [
 '上课钟' => '上課鐘',
 '上面糊' => '上面糊',
 '下文里' => '下文裡',
-'下于' => '下於',
 '下梁' => '下樑',
 '下注解' => '下注解',
 '下签了' => '下簽了',
@@ -3231,7 +3215,6 @@ public static $zh2Hant = [
 '丑月' => '丑月',
 '丑表功' => '丑表功',
 '丑角' => '丑角',
-'且于' => '且於',
 '世界杯' => '世界盃',
 '世纪里' => '世紀裡',
 '世纪钟' => '世紀鐘',
@@ -3254,7 +3237,6 @@ public static $zh2Hant = [
 '中岳' => '中嶽',
 '中庄子' => '中庄子',
 '中文里' => '中文裡',
-'中于' => '中於',
 '中签了' => '中簽了',
 '中签名' => '中簽名',
 '中签字' => '中簽字',
@@ -3329,7 +3311,6 @@ public static $zh2Hant = [
 '九个' => '九個',
 '九周后' => '九周後',
 '九天后' => '九天後',
-'九年' => '九年',
 '九谷' => '九穀',
 '九扎' => '九紮',
 '九只' => '九隻',
@@ -3502,7 +3483,6 @@ public static $zh2Hant = [
 '二只得' => '二只得',
 '二周后' => '二周後',
 '二天后' => '二天後',
-'二年' => '二年',
 '二缶钟惑' => '二缶鐘惑',
 '二老板' => '二老板',
 '二虎相斗' => '二虎相鬥',
@@ -3728,7 +3708,6 @@ public static $zh2Hant = [
 '五天后' => '五天後',
 '五峰县' => '五峯縣',
 '五岳' => '五嶽',
-'五年' => '五年',
 '五谷' => '五穀',
 '五扎' => '五紮',
 '五脏' => '五臟',
@@ -3739,7 +3718,6 @@ public static $zh2Hant = [
 '五余' => '五餘',
 '井干' => '井幹',
 '井里' => '井裡',
-'亚于' => '亞於',
 '交托' => '交託',
 '交游' => '交遊',
 '交哄' => '交鬨',
@@ -3774,8 +3752,6 @@ public static $zh2Hant = [
 '价川' => '价川',
 '任何钟' => '任何鐘',
 '任何钟表' => '任何鐘錶',
-'任教于' => '任教於',
-'任于' => '任於',
 '仿制' => '仿製',
 '伊于湖底' => '伊于湖底',
 '伊府面' => '伊府麵',
@@ -3797,9 +3773,7 @@ public static $zh2Hant = [
 '休征' => '休徵',
 '伙头' => '伙頭',
 '伴游' => '伴遊',
-'似于' => '似於',
 '但云' => '但云',
-'位于' => '位於',
 '位准' => '位準',
 '低洼' => '低洼',
 '住扎' => '住紮',
@@ -3852,13 +3826,11 @@ public static $zh2Hant = [
 '并购' => '併購',
 '并骨' => '併骨',
 '使其斗' => '使其鬥',
-'来于' => '來於',
 '侍仆' => '侍僕',
 '依依不舍' => '依依不捨',
 '依托' => '依託',
 '侵并' => '侵併',
 '局促' => '侷促',
-'便于' => '便於',
 '系数' => '係數',
 '系为' => '係為',
 '保险柜' => '保險柜',
@@ -3898,7 +3870,6 @@ public static $zh2Hant = [
 '傲霜斗雪' => '傲霜鬥雪',
 '传位于四太子' => '傳位于四太子',
 '傳位于四太子' => '傳位于四太子',
-'传于' => '傳於',
 '债累累' => '債纍纍',
 '傻里傻气' => '傻裡傻氣',
 '仅余' => '僅餘',
@@ -3935,7 +3906,6 @@ public static $zh2Hant = [
 '亿个' => '億個',
 '亿周后' => '億周後',
 '亿天后' => '億天後',
-'亿年' => '億年',
 '亿只' => '億隻',
 '亿余' => '億餘',
 '俭仆' => '儉僕',
@@ -3957,7 +3927,6 @@ public static $zh2Hant = [
 '尽自' => '儘自',
 '尽速' => '儘速',
 '尽量' => '儘量',
-'优于' => '優於',
 '优游' => '優遊',
 '兀术' => '兀朮',
 '元凶' => '元兇',
@@ -4005,7 +3974,6 @@ public static $zh2Hant = [
 '两个' => '兩個',
 '两周后' => '兩周後',
 '两天后' => '兩天後',
-'两年' => '兩年',
 '两杆' => '兩桿',
 '两扎' => '兩紮',
 '两虎共斗' => '兩虎共鬥',
@@ -4017,7 +3985,6 @@ public static $zh2Hant = [
 '八周后' => '八周後',
 '八天后' => '八天後',
 '八字胡' => '八字鬍',
-'八年' => '八年',
 '八扎' => '八紮',
 '八蜡' => '八蜡',
 '八只' => '八隻',
@@ -4036,7 +4003,6 @@ public static $zh2Hant = [
 '六个' => '六個',
 '六周后' => '六周後',
 '六天后' => '六天後',
-'六年' => '六年',
 '六楼后座' => '六樓后座',
 '六樓后座' => '六樓后座',
 '六谷' => '六穀',
@@ -4088,7 +4054,6 @@ public static $zh2Hant = [
 '出乖弄丑' => '出乖弄醜',
 '出乖露丑' => '出乖露醜',
 '出征收' => '出征收',
-'出于' => '出於',
 '出游' => '出遊',
 '出丑' => '出醜',
 '函数里' => '函數裡',
@@ -4097,7 +4062,6 @@ public static $zh2Hant = [
 '分多钟' => '分多鐘',
 '分子钟' => '分子鐘',
 '分子云' => '分子雲',
-'分布于' => '分布於',
 '分钟' => '分鐘',
 '分钟里' => '分鐘裡',
 '刑余' => '刑餘',
@@ -4143,7 +4107,6 @@ public static $zh2Hant = [
 '判断发' => '判斷發',
 '别辟' => '別闢',
 '利欲' => '利慾',
-'利于' => '利於',
 '刮起来' => '刮起來',
 '刮胡' => '刮鬍',
 '到山里' => '到山裡',
@@ -4192,11 +4155,8 @@ public static $zh2Hant = [
 '力争上游' => '力爭上遊',
 '功勋' => '功勳',
 '加氢精制' => '加氫精制',
-'劣于' => '劣於',
-'助于' => '助於',
 '劫余' => '劫餘',
 '勃郁' => '勃鬱',
-'胜于' => '勝於',
 '勤仆' => '勤僕',
 '勤朴' => '勤樸',
 '勋劳' => '勳勞',
@@ -4218,7 +4178,6 @@ public static $zh2Hant = [
 '北回线' => '北迴線',
 '北回铁路' => '北迴鐵路',
 '匪干' => '匪幹',
-'匿于' => '匿於',
 '区里有' => '區裡有',
 '区里的' => '區裡的',
 '十个' => '十個',
@@ -4227,9 +4186,9 @@ public static $zh2Hant = [
 '十出生' => '十出生',
 '十出祁山' => '十出祁山',
 '十出头' => '十出頭',
+'十出頭' => '十出頭',
 '十周后' => '十周後',
 '十天后' => '十天後',
-'十年' => '十年',
 '十扎' => '十紮',
 '十只' => '十隻',
 '十余' => '十餘',
@@ -4244,7 +4203,6 @@ public static $zh2Hant = [
 '千只足夠' => '千只足夠',
 '千周后' => '千周後',
 '千天后' => '千天後',
-'千年' => '千年',
 '千扎' => '千紮',
 '千回百折' => '千迴百折',
 '千回百转' => '千迴百轉',
@@ -4255,7 +4213,6 @@ public static $zh2Hant = [
 '半制品' => '半制品',
 '半只可' => '半只可',
 '半只够' => '半只夠',
-'半于' => '半於',
 '半只' => '半隻',
 '协防' => '協防',
 '南京钟' => '南京鐘',
@@ -4275,7 +4232,6 @@ public static $zh2Hant = [
 '印累绶若' => '印纍綬若',
 '印制' => '印製',
 '印鉴' => '印鑑',
-'危于' => '危於',
 '卵与石斗' => '卵與石鬥',
 '卷须' => '卷鬚',
 '厂部' => '厂部',
@@ -4294,7 +4250,6 @@ public static $zh2Hant = [
 '反复' => '反覆',
 '反覆' => '反覆',
 '取舍' => '取捨',
-'取决于' => '取決於',
 '受雇' => '受僱',
 '受托' => '受託',
 '丛林里' => '叢林裡',
@@ -4400,7 +4355,6 @@ public static $zh2Hant = [
 '吊钟' => '吊鐘',
 '同人志' => '同人誌',
 '同伙' => '同夥',
-'同于' => '同於',
 '同余' => '同餘',
 '名单于' => '名單於',
 '后冠' => '后冠',
@@ -4498,7 +4452,6 @@ public static $zh2Hant = [
 '喂喲' => '喂喲',
 '喂!' => '喂!',
 '喂,' => '喂,',
-'善于' => '善於',
 '喜欢表' => '喜歡錶',
 '喜欢钟' => '喜歡鐘',
 '喜欢钟表' => '喜歡鐘錶',
@@ -4532,7 +4485,6 @@ public static $zh2Hant = [
 '向迩' => '嚮邇',
 '严云农' => '嚴云農',
 '嚴云農' => '嚴云農',
-'严于' => '嚴於',
 '嚼谷' => '嚼穀',
 '啰啰苏苏' => '囉囉囌囌',
 '啰苏' => '囉囌',
@@ -4544,7 +4496,6 @@ public static $zh2Hant = [
 '四分历史' => '四分歷史',
 '四周后' => '四周後',
 '四天后' => '四天後',
-'四年' => '四年',
 '四舍五入' => '四捨五入',
 '四舍六入' => '四捨六入',
 '四杆铁笔' => '四桿鐵筆',
@@ -4566,19 +4517,15 @@ public static $zh2Hant = [
 '回复邮件' => '回覆郵件',
 '回复:' => '回覆:',
 '回游' => '回遊',
-'因于' => '因於',
 '困倦起来' => '困倦起來',
-'困于' => '困於',
 '困兽之斗' => '困獸之鬥',
 '困兽犹斗' => '困獸猶鬥',
 '困斗' => '困鬥',
 '固定制' => '固定制',
 '固征' => '固徵',
-'囿于' => '囿於',
 '圈梁' => '圈樑',
 '圈里' => '圈裡',
 '国之桢干' => '國之楨榦',
-'国于' => '國於',
 '国历' => '國曆',
 '国历代' => '國歷代',
 '国历任' => '國歷任',
@@ -4597,22 +4544,21 @@ public static $zh2Hant = [
 '土制' => '土製',
 '在制品' => '在制品',
 '在山里' => '在山裡',
-'在于' => '在於',
 '地图里' => '地圖裡',
 '地心历表' => '地心曆表',
 '地志' => '地誌',
 '地丑德齐' => '地醜德齊',
-'å\9d\8fäº\8e' => 'å\9d\8fæ\96¼',
-'å\9d\8fæ\96¼' => 'å\9d\8fæ\96¼',
+'å\9d\90å\8f°é\90µ' => 'å\9d\90å\8f°é\90µ',
+'å\9d\90å\8f°é\93\81' => 'å\9d\90å\8f°é\90µ',
 '坐如钟' => '坐如鐘',
 '坐台' => '坐檯',
 '坐钟' => '坐鐘',
+'坑口里' => '坑口里',
 '坑里' => '坑裡',
 '坤范' => '坤範',
 '坦荡' => '坦蕩',
 '坦荡荡' => '坦蕩蕩',
 '坱郁' => '坱鬱',
-'垂于' => '垂於',
 '垂范' => '垂範',
 '垂发' => '垂髮',
 '型范' => '型範',
@@ -4626,7 +4572,6 @@ public static $zh2Hant = [
 '埔里社' => '埔裏社',
 '域里' => '域裡',
 '基干' => '基幹',
-'基于' => '基於',
 '基准' => '基準',
 '坚致' => '堅緻',
 '堙淀' => '堙澱',
@@ -4678,7 +4623,6 @@ public static $zh2Hant = [
 '多只须' => '多只須',
 '多周后' => '多周後',
 '多天后' => '多天後',
-'多于' => '多於',
 '多冲' => '多衝',
 '多丑' => '多醜',
 '多只' => '多隻',
@@ -4781,7 +4725,6 @@ public static $zh2Hant = [
 '好斗胆' => '好斗膽',
 '好斗膽' => '好斗膽',
 '好斗蓬' => '好斗蓬',
-'好于' => '好於',
 '好困' => '好睏',
 '好签' => '好籤',
 '好丑' => '好醜',
@@ -4791,7 +4734,6 @@ public static $zh2Hant = [
 '妖后' => '妖后',
 '妖气冲天' => '妖氣衝天',
 '妆台' => '妝檯',
-'始于' => '始於',
 '姓么' => '姓么',
 '委托' => '委託',
 '委托书' => '委託書',
@@ -4803,7 +4745,6 @@ public static $zh2Hant = [
 '奸淫' => '姦淫',
 '威棱' => '威稜',
 '婢仆' => '婢僕',
-'嫁祸于' => '嫁禍於',
 '嫌凶' => '嫌兇',
 '嫌好道丑' => '嫌好道醜',
 '嫩姜' => '嫩薑',
@@ -4819,7 +4760,6 @@ public static $zh2Hant = [
 '字码表' => '字碼表',
 '字里行间' => '字裡行間',
 '存折' => '存摺',
-'存于' => '存於',
 '孛里海' => '孛里海',
 '孝惠后' => '孝惠后',
 '孙杰' => '孫杰',
@@ -4827,7 +4767,6 @@ public static $zh2Hant = [
 '学家' => '學家',
 '学里' => '學裡',
 '宇宙志' => '宇宙誌',
-'安于' => '安於',
 '安沈铁路' => '安瀋鐵路',
 '宋王台' => '宋王臺',
 '宗周钟' => '宗周鐘',
@@ -4835,19 +4774,16 @@ public static $zh2Hant = [
 '官地为采' => '官地為寀',
 '官历' => '官曆',
 '官历史' => '官歷史',
-'定于' => '定於',
 '定准' => '定準',
 '定制' => '定製',
 '宜云' => '宜云',
 '宣泄' => '宣洩',
 '宦游' => '宦遊',
 '宫里' => '宮裡',
-'害于' => '害於',
 '宴游' => '宴遊',
 '家仆' => '家僕',
 '家里' => '家裡',
 '家丑' => '家醜',
-'容于' => '容於',
 '容范' => '容範',
 '宿舍' => '宿舍',
 '寄托在' => '寄托在',
@@ -4857,14 +4793,12 @@ public static $zh2Hant = [
 '寇仇' => '寇讎',
 '富余' => '富餘',
 '寒栗' => '寒慄',
-'寒于' => '寒於',
-'寓于' => '寓於',
+'寓禁于征' => '寓禁於徵',
 '寡欲' => '寡慾',
 '实干' => '實幹',
 '实累累' => '實纍纍',
 '实验里' => '實驗裡',
 '写字台' => '寫字檯',
-'宽于' => '寬於',
 '宽余' => '寬餘',
 '宽松' => '寬鬆',
 '宽松松' => '寬鬆鬆',
@@ -4886,7 +4820,6 @@ public static $zh2Hant = [
 '尊后' => '尊后',
 '对不准' => '對不準',
 '对折' => '對摺',
-'对于' => '對於',
 '对准' => '對準',
 '对准表' => '對準錶',
 '对准钟' => '對準鐘',
@@ -4946,9 +4879,7 @@ public static $zh2Hant = [
 '屋梁' => '屋樑',
 '屋里' => '屋裡',
 '屏风后' => '屏風後',
-'屑于' => '屑於',
 '屡顾尔仆' => '屢顧爾僕',
-'属于' => '屬於',
 '属托' => '屬託',
 '屯扎' => '屯紮',
 '屯里' => '屯裡',
@@ -4998,7 +4929,6 @@ public static $zh2Hant = [
 '巧历史' => '巧歷史',
 '巨制' => '巨製',
 '差之毫厘' => '差之毫厘',
-'差于' => '差於',
 '己丑' => '己丑',
 '已占卜' => '已占卜',
 '已占算' => '已占算',
@@ -5035,8 +4965,6 @@ public static $zh2Hant = [
 '并州' => '并州',
 '并日而食' => '并日而食',
 '并迭' => '并迭',
-'幸免于难' => '幸免於難',
-'幸于' => '幸於',
 '幸运胡' => '幸運鬍',
 '干上' => '幹上',
 '干下去' => '幹下去',
@@ -5123,7 +5051,6 @@ public static $zh2Hant = [
 '广舍' => '廣捨',
 '广播里' => '廣播裡',
 '延历' => '延曆',
-'建于' => '建於',
 '建筑前' => '建築前',
 '建筑后' => '建築後',
 '弄干' => '弄乾',
@@ -5168,7 +5095,6 @@ public static $zh2Hant = [
 '引斗' => '引鬥',
 '弘历' => '弘曆',
 '弘历史' => '弘歷史',
-'弱于' => '弱於',
 '弱水三千只取一瓢' => '弱水三千只取一瓢',
 '张三丰' => '張三丰',
 '張三丰' => '張三丰',
@@ -5183,7 +5109,6 @@ public static $zh2Hant = [
 '强制作用' => '強制作用',
 '强奸' => '強姦',
 '强干' => '強幹',
-'强于' => '強於',
 '别扭' => '彆扭',
 '别拗' => '彆拗',
 '别气' => '彆氣',
@@ -5194,11 +5119,9 @@ public static $zh2Hant = [
 '汇纂' => '彙纂',
 '汇辑' => '彙輯',
 '形单影只' => '形單影隻',
-'形于' => '形於',
 '彭于晏' => '彭于晏',
 '影后' => '影后',
 '影相吊' => '影相弔',
-'役于' => '役於',
 '往复式' => '往復式',
 '往日无仇' => '往日無讎',
 '往里' => '往裡',
@@ -5222,7 +5145,6 @@ public static $zh2Hant = [
 '从仆' => '從僕',
 '从图里' => '從圖裡',
 '从山里' => '從山裡',
-'从于' => '從於',
 '从里到外' => '從裡到外',
 '从里向外' => '從裡向外',
 '御岳山' => '御嶽山',
@@ -5279,7 +5201,6 @@ public static $zh2Hant = [
 '征风召雨' => '徵風召雨',
 '征验' => '徵驗',
 '心愿' => '心愿',
-'心于' => '心於',
 '心理' => '心理',
 '心细如发' => '心細如髮',
 '心系一' => '心繫一',
@@ -5406,18 +5327,14 @@ public static $zh2Hant = [
 '忙里偷闲' => '忙裡偷閒',
 '忠人之托' => '忠人之托',
 '忠仆' => '忠僕',
-'忠于' => '忠於',
 '快快当当' => '快快當當',
 '快冲' => '快衝',
 '怎么干' => '怎麼幹',
-'怒于' => '怒於',
 '怒气冲天' => '怒氣衝天',
 '怒火冲天' => '怒火衝天',
 '怒发冲冠' => '怒髮衝冠',
 '怜奈' => '怜奈',
 '思如泉涌' => '思如泉湧',
-'怠于' => '怠於',
-'急于' => '急於',
 '急冲而下' => '急衝而下',
 '性别扭曲' => '性別扭曲',
 '性征' => '性徵',
@@ -5463,7 +5380,6 @@ public static $zh2Hant = [
 '愛河里花子' => '愛河里花子',
 '爱河里花子' => '愛河里花子',
 '爱困' => '愛睏',
-'感于' => '感於',
 '愿朴' => '愿樸',
 '愿樸' => '愿樸',
 '愿而恭' => '愿而恭',
@@ -5508,13 +5424,11 @@ public static $zh2Hant = [
 '悬钟' => '懸鐘',
 '懿范' => '懿範',
 '恋恋不舍' => '戀戀不捨',
-'成于' => '成於',
 '成于思' => '成於思',
 '戬谷' => '戩穀',
 '截发' => '截髮',
 '战天斗地' => '戰天鬥地',
 '战栗' => '戰慄',
-'战于' => '戰於',
 '战斗' => '戰鬥',
 '戏里' => '戲裡',
 '戲院里' => '戲院里',
@@ -5621,14 +5535,10 @@ public static $zh2Hant = [
 '拉面部' => '拉面部',
 '拉面' => '拉麵',
 '拌面' => '拌麵',
-'拒人于' => '拒人於',
-'拒于' => '拒於',
 '拓朴' => '拓樸',
 '拔发' => '拔髮',
 '拔须' => '拔鬚',
 '拗别' => '拗彆',
-'拘于' => '拘於',
-'拙于' => '拙於',
 '拙朴' => '拙樸',
 '拼却' => '拚卻',
 '拼命' => '拚命',
@@ -5811,10 +5721,8 @@ public static $zh2Hant = [
 '提心吊胆' => '提心弔膽',
 '提摩太后书' => '提摩太後書',
 '提高后' => '提高後',
-'插于' => '插於',
 '换签' => '換籤',
 '换只' => '換隻',
-'换发' => '換髮',
 '握发' => '握髮',
 '揩干' => '揩乾',
 '揪采' => '揪採',
@@ -5824,7 +5732,6 @@ public static $zh2Hant = [
 '挥手表' => '揮手表',
 '揮手表' => '揮手表',
 '搋面' => '搋麵',
-'损于' => '損於',
 '搏斗' => '搏鬥',
 '捣鬼吊白' => '搗鬼弔白',
 '扼肮' => '搤肮',
@@ -5858,7 +5765,6 @@ public static $zh2Hant = [
 '撤并' => '撤併',
 '拨谷' => '撥穀',
 '撩斗' => '撩鬥',
-'播于' => '播於',
 '扑冬' => '撲鼕',
 '扑咚' => '撲鼕',
 '扑咚咚' => '撲鼕鼕',
@@ -5886,16 +5792,12 @@ public static $zh2Hant = [
 '放松' => '放鬆',
 '政斗' => '政鬥',
 '故云' => '故云',
-'敏于' => '敏於',
-'败于' => '敗於',
 '教学钟' => '教學鐘',
-'教于' => '教於',
 '教范' => '教範',
 '敢干' => '敢幹',
 '敢情欲' => '敢情欲',
 '敢斗了胆' => '敢斗了膽',
 '散伙' => '散夥',
-'散于' => '散於',
 '散荡' => '散蕩',
 '敦朴' => '敦樸',
 '敬挽' => '敬輓',
@@ -5946,15 +5848,15 @@ public static $zh2Hant = [
 '方便面' => '方便麵',
 '方向' => '方向',
 '方法里' => '方法裡',
-'äº\8eå\90\8e' => 'æ\96¼å¾\8c',
-'äº\8eå¾\81' => 'æ\96¼å¾µ',
+'äº\8eå±±ä¸\9c' => 'æ\96¼å±±æ\9d±',
+'äº\8e山西' => 'æ\96¼å±±è¥¿',
 '于海上' => '於海上',
+'于海拔' => '於海拔',
 '于海边' => '於海邊',
 '于震中' => '於震中',
 '于震前' => '於震前',
 '于震后' => '於震後',
 '施舍' => '施捨',
-'施于' => '施於',
 '施舍之道' => '施舍之道',
 '旁征博引' => '旁徵博引',
 '旁注' => '旁註',
@@ -5967,7 +5869,6 @@ public static $zh2Hant = [
 '日历史' => '日歷史',
 '日里' => '日裡',
 '日志' => '日誌',
-'早于' => '早於',
 '旱干' => '旱乾',
 '升州' => '昇州',
 '升平' => '昇平',
@@ -5978,7 +5879,6 @@ public static $zh2Hant = [
 '明窗净几' => '明窗淨几',
 '明范' => '明範',
 '明鉴' => '明鑑',
-'易于' => '易於',
 '昔人有云' => '昔人有云',
 '星历' => '星曆',
 '星期后' => '星期後',
@@ -5990,7 +5890,6 @@ public static $zh2Hant = [
 '时钟' => '時鐘',
 '时间不准' => '時間不準',
 '晃荡' => '晃蕩',
-'晚于' => '晚於',
 '晚钟' => '晚鐘',
 '晞发' => '晞髮',
 '晨钟' => '晨鐘',
@@ -6065,7 +5964,6 @@ public static $zh2Hant = [
 '有只' => '有隻',
 '有余' => '有餘',
 '有发头陀寺' => '有髮頭陀寺',
-'服于' => '服於',
 '望了望' => '望了望',
 '望后石' => '望后石',
 '朝乾夕惕' => '朝乾夕惕',
@@ -6135,7 +6033,6 @@ public static $zh2Hant = [
 '枯干' => '枯乾',
 '架钟' => '架鐘',
 '某只' => '某隻',
-'染指于' => '染指於',
 '染殿后' => '染殿后',
 '染发' => '染髮',
 '柜上' => '柜上',
@@ -6150,7 +6047,6 @@ public static $zh2Hant = [
 '校准' => '校準',
 '校舍' => '校舍',
 '核准' => '核准',
-'格于' => '格於',
 '格范' => '格範',
 '格里历' => '格里曆',
 '格里高利历' => '格里高利曆',
@@ -6193,7 +6089,6 @@ public static $zh2Hant = [
 '杠杆' => '槓桿',
 '乐器钟' => '樂器鐘',
 '乐游原' => '樂遊原',
-'樊于期' => '樊於期',
 '梁上' => '樑上',
 '梁柱' => '樑柱',
 '樗里子' => '樗里子',
@@ -6258,7 +6153,6 @@ public static $zh2Hant = [
 '歌后' => '歌后',
 '歌钟' => '歌鐘',
 '欧游' => '歐遊',
-'止于' => '止於',
 '正官庄' => '正官庄',
 '正文里' => '正文裡',
 '正杰' => '正杰',
@@ -6269,10 +6163,8 @@ public static $zh2Hant = [
 '歲聿云暮' => '歲聿云暮',
 '历史里' => '歷史裡',
 '归并' => '歸併',
-'归于' => '歸於',
 '归余' => '歸餘',
 '歹斗' => '歹鬥',
-'死于' => '死於',
 '死里求生' => '死裡求生',
 '死里逃生' => '死裡逃生',
 '殖谷' => '殖穀',
@@ -6282,8 +6174,8 @@ public static $zh2Hant = [
 '殷师牛斗' => '殷師牛鬥',
 '殷鉴' => '殷鑑',
 '壳里' => '殼裡',
+'殿里' => '殿裡',
 '殿钟自鸣' => '殿鐘自鳴',
-'毁于' => '毀於',
 '毁钟为铎' => '毀鐘為鐸',
 '殴斗' => '毆鬥',
 '母后' => '母后',
@@ -6323,7 +6215,6 @@ public static $zh2Hant = [
 '污蔑' => '污衊',
 '汤卤' => '汤滷',
 '汤滷' => '汤滷',
-'汲于' => '汲於',
 '决斗' => '決鬥',
 '沈淀' => '沈澱',
 '沈郁' => '沈鬱',
@@ -6354,7 +6245,6 @@ public static $zh2Hant = [
 '泡面' => '泡麵',
 '波棱菜' => '波稜菜',
 '波发藻' => '波髮藻',
-'泥于' => '泥於',
 '注云' => '注云',
 '注释' => '注釋',
 '泰山梁木' => '泰山梁木',
@@ -6379,7 +6269,6 @@ public static $zh2Hant = [
 '洪钟' => '洪鐘',
 '汹涌' => '洶湧',
 '流征' => '流徵',
-'流于' => '流於',
 '流荡' => '流蕩',
 '流风余俗' => '流風餘俗',
 '流风余韵' => '流風餘韻',
@@ -6387,7 +6276,6 @@ public static $zh2Hant = [
 '浩荡' => '浩蕩',
 '浪荡' => '浪蕩',
 '浪游' => '浪遊',
-'浮于' => '浮於',
 '浮荡' => '浮蕩',
 '浮夸' => '浮誇',
 '浮松' => '浮鬆',
@@ -6428,7 +6316,6 @@ public static $zh2Hant = [
 '淑范' => '淑範',
 '泪干' => '淚乾',
 '泪如泉涌' => '淚如泉湧',
-'淡于' => '淡於',
 '淡蒙蒙' => '淡濛濛',
 '净余' => '淨餘',
 '净发' => '淨髮',
@@ -6465,7 +6352,6 @@ public static $zh2Hant = [
 '汤下面' => '湯下麵',
 '汤团' => '湯糰',
 '汤面' => '湯麵',
-'源于' => '源於',
 '准不准' => '準不準',
 '准例' => '準例',
 '准保' => '準保',
@@ -6502,10 +6388,8 @@ public static $zh2Hant = [
 '沟大曲' => '溝大麯',
 '沟谷' => '溝谷',
 '溟蒙' => '溟濛',
-'溢于' => '溢於',
 '温洛克期' => '溫洛克期',
 '溲面' => '溲麵',
-'溺于' => '溺於',
 '滃郁' => '滃鬱',
 '滑借' => '滑藉',
 '汇丰' => '滙豐',
@@ -6548,7 +6432,6 @@ public static $zh2Hant = [
 '潜水钟表' => '潛水鐘錶',
 '潭里' => '潭裡',
 '潮涌' => '潮湧',
-'溃于' => '潰於',
 '涩谷区' => '澀谷區',
 '澄江县' => '澂江縣',
 '澄澹精致' => '澄澹精致',
@@ -6689,10 +6572,8 @@ public static $zh2Hant = [
 '犖确' => '犖确',
 '荦确' => '犖确',
 '狂并潮' => '狂併潮',
-'狃于' => '狃於',
 '狄志杰' => '狄志杰',
 '狐借虎威' => '狐藉虎威',
-'猛于' => '猛於',
 '猛冲' => '猛衝',
 '猜三划五' => '猜三划五',
 '犹如表' => '猶如錶',
@@ -6717,7 +6598,6 @@ public static $zh2Hant = [
 '王余鱼' => '王餘魚',
 '珍肴异馔' => '珍肴異饌',
 '班里' => '班裡',
-'现于' => '現於',
 '球台' => '球檯',
 '理一个发' => '理一個髮',
 '理一次发' => '理一次髮',
@@ -6734,13 +6614,11 @@ public static $zh2Hant = [
 '瓷制' => '瓷製',
 '甄后' => '甄后',
 '瓮安' => '甕安',
-'甚于' => '甚於',
 '甜、咸' => '甜、鹹',
 '甜水面' => '甜水麵',
 '甜咸' => '甜鹹',
 '甜面酱' => '甜麵醬',
 '生力面' => '生力麵',
-'生于' => '生於',
 '生物钟' => '生物鐘',
 '生发生' => '生發生',
 '生华发' => '生華髮',
@@ -6748,26 +6626,22 @@ public static $zh2Hant = [
 '生锈' => '生鏽',
 '生发' => '生髮',
 '苏醒' => '甦醒',
-'用于' => '用於',
 '用法里' => '用法裡',
 '甩发' => '甩髮',
 '田子里' => '田子里',
 '田庄英雄' => '田庄英雄',
 '田里' => '田裡',
+'田里穗' => '田里穗',
 '由余' => '由余',
-'由于' => '由於',
 '甲胄' => '甲冑',
 '甲后路' => '甲后路',
 '男仆' => '男僕',
 '界里' => '界裡',
-'畏于' => '畏於',
 '留发展' => '留發展',
 '留发生' => '留發生',
 '留发行' => '留發行',
 '留长发' => '留長髮',
 '留发' => '留髮',
-'毕于' => '畢於',
-'毕业于' => '畢業於',
 '毕生发展' => '畢生發展',
 '画里' => '畫裡',
 '当准' => '當準',
@@ -6777,7 +6651,6 @@ public static $zh2Hant = [
 '疏松' => '疏鬆',
 '疑系' => '疑係',
 '疑凶' => '疑兇',
-'疲于' => '疲於',
 '疲困' => '疲睏',
 '病征' => '病徵',
 '病愈' => '病癒',
@@ -6794,7 +6667,8 @@ public static $zh2Hant = [
 '症结' => '癥結',
 '癸丑' => '癸丑',
 '发干' => '發乾',
-'发呆' => '發獃',
+'发状态' => '發狀態',
+'发状况' => '發狀況',
 '发签' => '發籤',
 '发松' => '發鬆',
 '发面' => '發麵',
@@ -6819,7 +6693,6 @@ public static $zh2Hant = [
 '百周后' => '百周後',
 '百天后' => '百天後',
 '百子里' => '百子里',
-'百年' => '百年',
 '百拙千丑' => '百拙千醜',
 '百科里' => '百科裡',
 '百谷' => '百穀',
@@ -6855,7 +6728,6 @@ public static $zh2Hant = [
 '皱折' => '皺摺',
 '盆吊' => '盆弔',
 '盈余' => '盈餘',
-'益于' => '益於',
 '盒里' => '盒裡',
 '盛赞' => '盛讚',
 '盗采' => '盜採',
@@ -6866,14 +6738,12 @@ public static $zh2Hant = [
 '卢棱伽' => '盧稜伽',
 '荡气回肠' => '盪氣迴腸',
 '盲干' => '盲幹',
-'直于' => '直於',
 '直冲' => '直衝',
 '相并' => '相併',
 '相克制' => '相克制',
 '相克服' => '相克服',
 '相克' => '相剋',
 '相干' => '相干',
-'相于' => '相於',
 '相冲' => '相衝',
 '相斗' => '相鬥',
 '看法里' => '看法裡',
@@ -6889,8 +6759,6 @@ public static $zh2Hant = [
 '眼眶里' => '眼眶裡',
 '眼睛里' => '眼睛裡',
 '眼里' => '眼裡',
-'着眼于' => '着眼於',
-'着眼於' => '着眼於',
 '困乏' => '睏乏',
 '困倦' => '睏倦',
 '困觉' => '睏覺',
@@ -6913,7 +6781,6 @@ public static $zh2Hant = [
 '瞩托' => '矚託',
 '矜夸' => '矜誇',
 '短几' => '短几',
-'短于' => '短於',
 '短发生' => '短發生',
 '短发' => '短髮',
 '矮几' => '矮几',
@@ -6955,7 +6822,6 @@ public static $zh2Hant = [
 '祭吊' => '祭弔',
 '禁欲' => '禁慾',
 '禁欲主义' => '禁欲主義',
-'祸于' => '禍於',
 '御侮' => '禦侮',
 '御寇' => '禦寇',
 '御寒' => '禦寒',
@@ -6991,7 +6857,6 @@ public static $zh2Hant = [
 '秒钟' => '秒鐘',
 '秤杆' => '秤桿',
 '秦沈客运' => '秦瀋客運',
-'移祸于' => '移禍於',
 '稀松' => '稀鬆',
 '程十发' => '程十髮',
 '棱台' => '稜台',
@@ -7022,6 +6887,7 @@ public static $zh2Hant = [
 '谷旦' => '穀旦',
 '谷梁' => '穀梁',
 '谷壳' => '穀殼',
+'谷氨' => '穀氨',
 '谷物' => '穀物',
 '谷皮' => '穀皮',
 '谷神' => '穀神',
@@ -7029,6 +6895,7 @@ public static $zh2Hant = [
 '谷谷' => '穀穀',
 '谷米' => '穀米',
 '谷粒' => '穀粒',
+'谷胱' => '穀胱',
 '谷舱' => '穀艙',
 '谷苗' => '穀苗',
 '谷草' => '穀草',
@@ -7057,11 +6924,9 @@ public static $zh2Hant = [
 '窗帘' => '窗簾',
 '窝里' => '窩裡',
 '窝里斗' => '窩裡鬥',
-'穷于' => '窮於',
 '穷追不舍' => '窮追不捨',
 '穷发' => '窮髮',
 '窃钟掩耳' => '竊鐘掩耳',
-'立于' => '立於',
 '立范' => '立範',
 '童仆' => '童僕',
 '竞斗' => '競鬥',
@@ -7074,7 +6939,6 @@ public static $zh2Hant = [
 '笑里藏刀' => '笑裡藏刀',
 '笔杆' => '筆桿',
 '笔秃墨干' => '筆禿墨乾',
-'等于' => '等於',
 '笋干' => '筍乾',
 '筑前' => '筑前',
 '筑北' => '筑北',
@@ -7100,7 +6964,7 @@ public static $zh2Hant = [
 '个中翘楚' => '箇中翹楚',
 '个中道理' => '箇中道理',
 '个中高手' => '箇中高手',
-'个旧' => '箇舊',
+'个旧市' => '箇舊市',
 '算历' => '算曆',
 '算历史' => '算歷史',
 '算准' => '算準',
@@ -7144,7 +7008,6 @@ public static $zh2Hant = [
 '精制住' => '精制住',
 '精制服' => '精制服',
 '精干' => '精幹',
-'精于' => '精於',
 '精准' => '精準',
 '精致' => '精緻',
 '精制' => '精製',
@@ -7197,17 +7060,14 @@ public static $zh2Hant = [
 '细如发' => '細如髮',
 '细致' => '細緻',
 '细炼' => '細鍊',
-'终于' => '終於',
 '组里' => '組裡',
 '结伴同游' => '結伴同遊',
 '结伙' => '結夥',
 '结扎' => '結紮',
 '结余' => '結餘',
 '结发' => '結髮',
-'绝于' => '絕於',
 '绞干' => '絞乾',
 '络腮胡' => '絡腮鬍',
-'给于' => '給於',
 '丝恩发怨' => '絲恩髮怨',
 '丝制' => '絲製',
 '丝发' => '絲髮',
@@ -7301,15 +7161,12 @@ public static $zh2Hant = [
 '坛子' => '罈子',
 '坛坛罐罐' => '罈罈罐罐',
 '坛騞' => '罈騞',
-'置于' => '置於',
 '置言成范' => '置言成範',
-'罢于' => '罷於',
 '罗马历' => '羅馬曆',
 '罗马历代' => '羅馬歷代',
 '罗马历史' => '羅馬歷史',
 '羁系' => '羈繫',
 '美容美发' => '美容美髮',
-'美于' => '美於',
 '美丑' => '美醜',
 '美发学' => '美髮學',
 '美发师' => '美髮師',
@@ -7331,7 +7188,6 @@ public static $zh2Hant = [
 '老仆' => '老僕',
 '老干部' => '老幹部',
 '老懞' => '老懞',
-'老于' => '老於',
 '老爷钟' => '老爺鐘',
 '老白干' => '老白乾',
 '老姜' => '老薑',
@@ -7343,7 +7199,6 @@ public static $zh2Hant = [
 '耕获' => '耕穫',
 '耳余' => '耳餘',
 '耶律术烈' => '耶律朮烈',
-'耿于' => '耿於',
 '聊斋志异' => '聊齋志異',
 '圣人历' => '聖人曆',
 '圣后' => '聖后',
@@ -7355,7 +7210,6 @@ public static $zh2Hant = [
 '闻风后' => '聞風後',
 '联系' => '聯繫',
 '声母后' => '聲母後',
-'听于' => '聽於',
 '肉干' => '肉乾',
 '肉欲' => '肉慾',
 '肉丝面' => '肉絲麵',
@@ -7441,7 +7295,6 @@ public static $zh2Hant = [
 '自制服' => '自制服',
 '自制的能' => '自制的能',
 '自制能力' => '自制能力',
-'自于' => '自於',
 '自然数里' => '自然數裡',
 '自由钟' => '自由鐘',
 '自制' => '自製',
@@ -7450,11 +7303,8 @@ public static $zh2Hant = [
 '臭气冲天' => '臭氣衝天',
 '至多' => '至多',
 '至多只' => '至多只',
-'至于' => '至於',
-'致于' => '致於',
 '台佟' => '臺佟',
 '台静农' => '臺靜農',
-'臻于' => '臻於',
 '舂谷' => '舂穀',
 '举手表' => '舉手表',
 '舉手表' => '舉手表',
@@ -7493,7 +7343,6 @@ public static $zh2Hant = [
 '苑里' => '苑裡',
 '若干' => '若干',
 '苦干' => '苦幹',
-'苦于' => '苦於',
 '苦里' => '苦裡',
 '苦斗' => '苦鬥',
 '苧麻' => '苧麻',
@@ -7540,8 +7389,6 @@ public static $zh2Hant = [
 '万个' => '萬個',
 '万周后' => '萬周後',
 '万天后' => '萬天後',
-'万年' => '萬年',
-'万年历' => '萬年曆',
 '万年历表' => '萬年曆錶',
 '万历' => '萬曆',
 '万历史' => '萬歷史',
@@ -7550,7 +7397,6 @@ public static $zh2Hant = [
 '万象' => '萬象',
 '万只' => '萬隻',
 '万余' => '萬餘',
-'落于' => '落於',
 '落腮胡' => '落腮鬍',
 '落发' => '落髮',
 '叶叶琴' => '葉叶琴',
@@ -7562,7 +7408,6 @@ public static $zh2Hant = [
 '葡萄干' => '葡萄乾',
 '董氏封发' => '董氏封髮',
 '葫芦里卖甚么药' => '葫蘆裡賣甚麼藥',
-'葬于' => '葬於',
 '蒙雾露' => '蒙霧露',
 '蒜发' => '蒜髮',
 '蒲席' => '蒲蓆',
@@ -7639,7 +7484,6 @@ public static $zh2Hant = [
 '借箸代筹' => '藉箸代籌',
 '借资' => '藉資',
 '蓝淀' => '藍澱',
-'藏于' => '藏於',
 '藏历' => '藏曆',
 '藏历史' => '藏歷史',
 '藏蒙歌儿' => '藏矇歌兒',
@@ -7657,7 +7501,6 @@ public static $zh2Hant = [
 '萝卜干' => '蘿蔔乾',
 '虎须' => '虎鬚',
 '虎斗' => '虎鬥',
-'处于' => '處於',
 '虚夸' => '虛誇',
 '号志' => '號誌',
 '虫部' => '虫部',
@@ -7686,7 +7529,6 @@ public static $zh2Hant = [
 '行事历史' => '行事歷史',
 '行凶' => '行兇',
 '行家里手' => '行家裡手',
-'行于' => '行於',
 '卫后庄公' => '衛後莊公',
 '卫星钟' => '衛星鐘',
 '冲上' => '衝上',
@@ -7740,7 +7582,6 @@ public static $zh2Hant = [
 '冲风' => '衝風',
 '衡鉴' => '衡鑑',
 '表面包' => '表面包',
-'衷于' => '衷於',
 '袋杆' => '袋桿',
 '袋里' => '袋裡',
 '袋表' => '袋錶',
@@ -7762,7 +7603,6 @@ public static $zh2Hant = [
 '里海' => '裏海',
 '里白' => '裏白',
 '里运河' => '裏運河',
-'补于' => '補於',
 '补注' => '補註',
 '装折' => '裝摺',
 '里勾外连' => '裡勾外連',
@@ -7879,12 +7719,10 @@ public static $zh2Hant = [
 '要冲' => '要衝',
 '复信' => '覆信',
 '复核' => '覆核',
-'见于' => '見於',
 '见棱见角' => '見稜見角',
 '见素抱朴' => '見素抱樸',
 '见钟不打' => '見鐘不打',
 '规范' => '規範',
-'视于' => '視於',
 '观采' => '觀採',
 '角抵' => '角牴',
 '角落发' => '角落發',
@@ -7954,7 +7792,6 @@ public static $zh2Hant = [
 '词干' => '詞幹',
 '词汇' => '詞彙',
 '词余' => '詞餘',
-'询于' => '詢於',
 '试制' => '試製',
 '詩云' => '詩云',
 '诗云' => '詩云',
@@ -8134,7 +7971,6 @@ public static $zh2Hant = [
 '趙惠后' => '趙惠后',
 '赵治勋' => '趙治勳',
 '趱干' => '趲幹',
-'足于' => '足於',
 '足球台' => '足球台',
 '跌扑' => '跌扑',
 '路图里' => '路圖裡',
@@ -8147,10 +7983,8 @@ public static $zh2Hant = [
 '踡局' => '踡跼',
 '逾闲' => '踰閑',
 '蹒局' => '蹣跼',
-'蹪于' => '蹪於',
 '蹭棱子' => '蹭稜子',
 '躁郁' => '躁鬱',
-'身于' => '身於',
 '身体发肤' => '身體髮膚',
 '躯干' => '軀幹',
 '车库里' => '車庫裡',
@@ -8159,7 +7993,6 @@ public static $zh2Hant = [
 '车里雅宾斯克' => '車里雅賓斯克',
 '轨范' => '軌範',
 '轩辟' => '軒闢',
-'较于' => '較於',
 '挽曲' => '輓曲',
 '挽歌' => '輓歌',
 '挽联' => '輓聯',
@@ -8168,7 +8001,6 @@ public static $zh2Hant = [
 '挽车' => '輓車',
 '挽输' => '輓輸',
 '挽辞' => '輓辭',
-'轻于' => '輕於',
 '轻松' => '輕鬆',
 '轻松松' => '輕鬆鬆',
 '轮奸' => '輪姦',
@@ -8193,7 +8025,6 @@ public static $zh2Hant = [
 '近日无仇' => '近日無讎',
 '返朴' => '返樸',
 '迥然回异' => '迥然迴異',
-'迫于' => '迫於',
 '回光返照' => '迴光返照',
 '回圈' => '迴圈',
 '回廊' => '迴廊',
@@ -8221,7 +8052,6 @@ public static $zh2Hant = [
 '回銮' => '迴鑾',
 '回响' => '迴響',
 '回风' => '迴風',
-'迷于' => '迷於',
 '迷蒙' => '迷濛',
 '追凶' => '追兇',
 '退伙' => '退夥',
@@ -8265,7 +8095,6 @@ public static $zh2Hant = [
 '这出' => '這齣',
 '通奸' => '通姦',
 '通心面' => '通心麵',
-'通于' => '通於',
 '通历' => '通曆',
 '通历史' => '通歷史',
 '通鉴' => '通鑑',
@@ -8334,17 +8163,13 @@ public static $zh2Hant = [
 '游错' => '遊錯',
 '游骑兵' => '遊騎兵',
 '游魂' => '遊魂',
-'过于' => '過於',
 '过水面' => '過水麵',
 '遏制' => '遏制',
 '道范' => '道範',
-'逊于' => '遜於',
 '递回' => '遞迴',
 '远游' => '遠遊',
 '遨游' => '遨遊',
-'适于' => '適於',
 '遮丑' => '遮醜',
-'迁于' => '遷於',
 '选手表明' => '選手表明',
 '选手表决' => '選手表決',
 '选手表现' => '選手表現',
@@ -8386,7 +8211,6 @@ public static $zh2Hant = [
 '部落发' => '部落發',
 '郭后' => '郭后',
 '都市里' => '都市裡',
-'都于' => '都於',
 '乡愿' => '鄉愿',
 '鄉愿' => '鄉愿',
 '郑凯云' => '鄭凱云',
@@ -8404,7 +8228,6 @@ public static $zh2Hant = [
 '酸姜' => '酸薑',
 '腌制' => '醃製',
 '醇朴' => '醇樸',
-'醉于' => '醉於',
 '醋坛' => '醋罈',
 '丑丫头' => '醜丫頭',
 '丑事' => '醜事',
@@ -8431,7 +8254,6 @@ public static $zh2Hant = [
 '丑恶' => '醜惡',
 '丑态' => '醜態',
 '丑毙了' => '醜斃了',
-'丑于' => '醜於',
 '丑末' => '醜末',
 '丑样' => '醜樣',
 '丑死' => '醜死',
@@ -8470,7 +8292,6 @@ public static $zh2Hant = [
 '里海茨' => '里海茨',
 '里铺' => '里舖',
 '重回' => '重回',
-'重于' => '重於',
 '重罗面' => '重羅麵',
 '重制' => '重製',
 '重复' => '重複',
@@ -8513,6 +8334,7 @@ public static $zh2Hant = [
 '铜钟' => '銅鐘',
 '铯钟' => '銫鐘',
 '铝制' => '鋁製',
+'锌制' => '鋅製',
 '钢之炼金术师' => '鋼之鍊金術師',
 '钢梁' => '鋼樑',
 '钢制' => '鋼製',
@@ -8623,6 +8445,7 @@ public static $zh2Hant = [
 '钟点' => '鐘點',
 '钟鼎' => '鐘鼎',
 '钟鼓' => '鐘鼓',
+'铁制' => '鐵製',
 '铁锈' => '鐵鏽',
 '铁钟' => '鐵鐘',
 '铸钟' => '鑄鐘',
@@ -8632,16 +8455,15 @@ public static $zh2Hant = [
 '鉴察' => '鑑察',
 '鉴往知来' => '鑑往知來',
 '鉴戒' => '鑑戒',
+'鉴于' => '鑑於',
 '鉴湖' => '鑑湖',
 '鉴藏' => '鑑藏',
 '鉴谅' => '鑑諒',
 '鉴证' => '鑑證',
 '鉴识' => '鑑識',
 '鉴赏' => '鑑賞',
-'鉴于' => '鑒於',
 '長几' => '長几',
 '长几' => '長几',
-'长于' => '長於',
 '长历' => '長曆',
 '长历史' => '長歷史',
 '长发公主' => '長髮公主',
@@ -8672,7 +8494,6 @@ public static $zh2Hant = [
 '闯荡' => '闖蕩',
 '闯炼' => '闖鍊',
 '关系' => '關係',
-'关于' => '關於',
 '辟佛' => '闢佛',
 '辟作' => '闢作',
 '辟划' => '闢劃',
@@ -8686,13 +8507,12 @@ public static $zh2Hant = [
 '辟谣' => '闢謠',
 '辟辟' => '闢辟',
 '辟邪以律' => '闢邪以律',
+'防制法' => '防制法',
 '防水表' => '防水錶',
 '防御' => '防禦',
 '防范' => '防範',
 '防锈' => '防鏽',
-'阻于' => '阻於',
 '阿里' => '阿里',
-'附于' => '附於',
 '附注' => '附註',
 '限制' => '限制',
 '院里' => '院裡',
@@ -8717,11 +8537,10 @@ public static $zh2Hant = [
 '阳谷' => '陽穀',
 '隆准许' => '隆准許',
 '隆准' => '隆準',
-'é\9a\8fäº\8e' => 'é\9a¨æ\96¼',
+'é\98\9fé\87\8c' => 'é\9a\8a裡',
 '隐占' => '隱佔',
 '隐几' => '隱几',
 '隱几' => '隱几',
-'隐于' => '隱於',
 '只字' => '隻字',
 '只影' => '隻影',
 '只手遮天' => '隻手遮天',
@@ -8732,7 +8551,6 @@ public static $zh2Hant = [
 '雅范' => '雅範',
 '集团' => '集團',
 '集数里' => '集數裡',
-'集于' => '集於',
 '集里' => '集裡',
 '集游法' => '集遊法',
 '雕梁画栋' => '雕樑畫棟',
@@ -8752,15 +8570,14 @@ public static $zh2Hant = [
 '鸡腿面' => '雞腿麵',
 '鸡蛋里挑骨头' => '雞蛋裡挑骨頭',
 '鸡只' => '雞隻',
-'离于' => '離於',
 '难舍' => '難捨',
-'难于' => '難於',
 '雨蒙蒙' => '雨濛濛',
 '雪窗萤几' => '雪窗螢几',
 '雪窗螢几' => '雪窗螢几',
 '雪里' => '雪裡',
 '雪里红' => '雪裡紅',
 '雪里蕻' => '雪裡蕻',
+'云南个旧' => '雲南箇舊',
 '云吞' => '雲吞',
 '云吞面' => '雲吞麵',
 '云笈七签' => '雲笈七籤',
@@ -8770,7 +8587,6 @@ public static $zh2Hant = [
 '零个' => '零個',
 '零周后' => '零周後',
 '零天后' => '零天後',
-'零年' => '零年',
 '零只' => '零隻',
 '零余' => '零餘',
 '电子表格' => '電子表格',
@@ -8841,7 +8657,6 @@ public static $zh2Hant = [
 '頂多' => '頂多',
 '顶多' => '頂多',
 '项链' => '項鍊',
-'顺于' => '順於',
 '顺钟向' => '順鐘向',
 '顺风后' => '順風後',
 '须根据' => '須根據',
@@ -9364,7 +9179,6 @@ public static $zh2Hant = [
 '盐卤' => '鹽滷',
 '盐余' => '鹽餘',
 '鹿場里' => '鹿場里',
-'丽于' => '麗於',
 '麟游' => '麟遊',
 '曲酒' => '麯酒',
 '曲尘' => '麴塵',
@@ -14143,8 +13957,6 @@ public static $zh2TW = [
 '发达国家' => '已開發國家',
 '巴塞罗那' => '巴塞隆納',
 '巴塞隆拿' => '巴塞隆納',
-'巴布亚新几内亚' => '巴布亞紐幾內亞',
-'巴布亞新畿內亞' => '巴布亞紐幾內亞',
 '巴士拉' => '巴斯拉',
 '巴巴多斯' => '巴貝多',
 '佈' => '布',
@@ -14165,7 +13977,6 @@ public static $zh2TW = [
 '账' => '帳',
 '干着急' => '干著急',
 '干着' => '幹著',
-'畿內亞' => '幾內亞',
 '几内亚比绍' => '幾內亞比索',
 '幾內亞比紹' => '幾內亞比索',
 '比利牛斯' => '庇里牛斯',
@@ -14228,6 +14039,8 @@ public static $zh2TW = [
 '數碼電視' => '數位電視',
 '調制解調器' => '數據機',
 '调制解调器' => '數據機',
+'斯堪的納維亞' => '斯堪地那維亞',
+'斯堪的纳维亚' => '斯堪地那維亞',
 '斯洛文尼亚' => '斯洛維尼亞',
 '斯洛文尼亞' => '斯洛維尼亞',
 '新罕布什尔' => '新罕布夏',
@@ -14386,6 +14199,7 @@ public static $zh2TW = [
 '新奥尔良' => '紐奧良',
 '新奧爾良' => '紐奧良',
 '新几内亚' => '紐幾內亞',
+'新幾內亞' => '紐幾內亞',
 '新西兰' => '紐西蘭',
 '新西蘭' => '紐西蘭',
 '紙煙' => '紙菸',
@@ -14707,7 +14521,6 @@ public static $zh2HK = [
 '·威尔士' => '·威爾士',
 '·威爾士' => '·威爾士',
 '一地里' => '一地裏',
-'一年里' => '一年裏',
 '三十六著' => '三十六着',
 '三極體' => '三極管',
 '旧金山' => '三藩市',
@@ -15398,6 +15211,7 @@ public static $zh2HK = [
 '地占' => '地佔',
 '地图里' => '地圖裏',
 '堪培拉' => '坎培拉',
+'坐台铁' => '坐台鐵',
 '坐台' => '坐枱',
 '坐著' => '坐着',
 '坐著作' => '坐著作',
@@ -15565,7 +15379,6 @@ public static $zh2HK = [
 '巴塞罗那' => '巴塞隆拿',
 '巴塞隆納' => '巴塞隆拿',
 '巴貝多' => '巴巴多斯',
-'巴布亞紐幾內亞' => '巴布亞新畿內亞',
 '巴士拉' => '巴斯拉',
 '巷里' => '巷裏',
 '市占' => '市佔',
@@ -15602,6 +15415,7 @@ public static $zh2HK = [
 '賓士' => '平治',
 '年代里' => '年代裏',
 '年里' => '年裏',
+'年里约' => '年里約',
 '干着' => '幹着',
 '幹著' => '幹着',
 '幹著名' => '幹著名',
@@ -16043,9 +15857,11 @@ public static $zh2HK = [
 '斥著者' => '斥著者',
 '斥著述' => '斥著述',
 '斥著錄' => '斥著錄',
+'斯堪地那維亞' => '斯堪的納維亞',
 '史瓦濟蘭' => '斯威士蘭',
 '斯洛維尼亞' => '斯洛文尼亞',
 '紐澳良' => '新奧爾良',
+'紐幾內亞' => '新幾內亞',
 '紐西蘭' => '新西蘭',
 '方法里' => '方法裏',
 '族里' => '族裏',
@@ -16222,6 +16038,7 @@ public static $zh2HK = [
 '殺著述' => '殺著述',
 '殺著錄' => '殺著錄',
 '壳里' => '殼裏',
+'殿里' => '殿裏',
 '茅利塔尼亞' => '毛里塔尼亞',
 '模里西斯' => '毛里裘斯',
 '毛里求斯' => '毛里裘斯',
@@ -16511,8 +16328,6 @@ public static $zh2HK = [
 '過著述' => '當著述',
 '當著錄' => '當著錄',
 '過著錄' => '當著錄',
-'几内亚' => '畿內亞',
-'幾內亞' => '畿內亞',
 '迭代' => '疊代',
 '疑著' => '疑着',
 '疑著作' => '疑著作',
@@ -17507,6 +17322,7 @@ public static $zh2HK = [
 '陪著述' => '陪著述',
 '陪著錄' => '陪著錄',
 '阴沟里翻船' => '陰溝裏翻船',
+'队里' => '隊裏',
 '隔著' => '隔着',
 '隔著作' => '隔著作',
 '隔著名' => '隔著名',
@@ -18082,7 +17898,6 @@ public static $zh2CN = [
 '涼著者' => '凉著者',
 '涼著述' => '凉著述',
 '湊合著' => '凑合着',
-'畿內亞' => '几内亚',
 '幾內亞比索' => '几内亚比绍',
 '凱薩琳' => '凯瑟琳',
 '嘉芙蓮' => '凯瑟琳',
@@ -18515,7 +18330,6 @@ public static $zh2CN = [
 '巴斯拉' => '巴士拉',
 '帕邁拉環礁' => '巴尔米拉环礁',
 '巴貝多' => '巴巴多斯',
-'巴布亞紐幾內亞' => '巴布亚新几内亚',
 '布殊' => '布什',
 '布吉納法索' => '布基纳法索',
 '布隆泉' => '布隆方丹',
@@ -18997,6 +18811,7 @@ public static $zh2CN = [
 '斥著者' => '斥著者',
 '斥著述' => '斥著述',
 '史丹福大學' => '斯坦福大学',
+'斯堪地那維亞' => '斯堪的纳维亚',
 '史達林' => '斯大林',
 '史瓦濟蘭' => '斯威士兰',
 '斯洛維尼亞' => '斯洛文尼亚',
index 6512225..a741daa 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Gutsul",
-                       "Amir E. Aharoni (amir.aharoni@mail.huji.ac.il)"
+                       "Amir E. Aharoni (amir.aharoni@mail.huji.ac.il)",
+                       "Eugene Gvozdetsky (epgvozdet@gmail.com)"
                ],
                "comment": "These rules don't cover the whole grammar of the language, and are intended only for names of languages and Wikimedia projects."
        },
        ],
        "accusative": [
                [ "(.+)ія$", "$1ію" ]
+       ],
+       "languagegen": [
+               [ "@metadata", [
+                       "comment", "мова в родовому відмінку: '(з) української'"
+               ] ],
+               [ "(.+)ка$", "$1кої" ],
+               [ "іврит$", "івриту" ],
+               [ "їдиш$", "їдишу" ],
+               [ "(.+)$", "$1" ]
+       ],
+       "languageadverb": [
+               [ "@metadata", [
+                       "comment", "прислівник з назвою мови: 'українською'"
+               ] ],
+               [ "(.+)ка$", "$1кою" ],
+               [ "іврит$", "івритом" ],
+               [ "їдиш$", "їдишом" ],
+               [ "(.+)$", "мовою $1" ]
        ]
 }
index 9d10b51..726b170 100644 (file)
        "externaldberror": "Na seunalah bak peusahèh basis data luwa atawa droëneuh hana geubri idin keu neupeubarô akun luwa droëneuh",
        "login": "Tamöng",
        "nav-login-createaccount": "Tamöng / dapeuta",
-       "userlogin": "Tamöng / dapeuta",
-       "userloginnocreate": "Tamöng",
        "logout": "Teubiët",
        "userlogout": "Teubiët",
        "notloggedin": "Hana tamöng lom",
        "userlogin-noaccount": "Goh lom neudapeuta?",
        "userlogin-joinproject": "Neugabông ngön {{SITENAME}}",
-       "nologin": "Goh lom neudapeuta? $1.",
-       "nologinlink": "Peudapeuta nan barô",
        "createaccount": "Peudapeuta nan barô",
-       "gotaccount": "Ka lheuëh neudapeuta? $1.",
-       "gotaccountlink": "Tamöng",
-       "userlogin-resetlink": "Tuwo rincian tamöng droëneuh?",
        "userlogin-resetpassword-link": "Tuwö lageuëm rahsia?",
        "userlogin-helplink2": "Beunantu tamöng log",
        "userlogin-loggedin": "Droëneuh ka neutamöng seubagoë $1. Neungui blangko di yup keu neutamöng seubagoë ureuëng ngui la’én",
        "createacct-another-email-ph": "Pasoë alamat surat-e",
        "createaccountmail": "Neungui lageuëm rahsia beurangkapeuë keu si’at nyoë. Lheuëh nyan neupeu’et u surat-e nyang droëneuh meuh’eut",
        "createacct-realname": "Nan aseuli (hana wajéb)",
-       "createaccountreason": "Choë:",
        "createacct-reason": "Choë:",
        "createacct-reason-ph": "Pakön droëneuh neupeugöt nan ureuëng ngui la’én",
        "createacct-submit": "Peudapeuta nan barô",
        "rcshowhidemine": "$1 atra lôn andam",
        "rcshowhidemine-show": "Peuleumah",
        "rcshowhidemine-hide": "Peusom",
-       "rclinks": "Peudeuih $1 neuubah barô lam $2 uroë nyoë<br />$3",
+       "rclinks": "Peudeuih $1 neuubah barô lam $2 uroë nyoë",
        "diff": "bida",
        "hist": "riwayat",
        "hide": "Peusom",
index a5c7dd0..2e74379 100644 (file)
        "password-change-forbidden": "Мы виким и шъэфгущыIэхэр зэблэпхъун уфитэп.",
        "login": "Системэм хахь",
        "nav-login-createaccount": "Къыхахь / аккаунт къэубл",
-       "userlogin": "Къыхахь / аккаунт къэубл",
-       "userloginnocreate": "Системэм хахь",
        "logout": "ХэкӀыжь",
        "userlogout": "ХэкӀыжь",
        "notloggedin": "Системэм хэхьагъэп",
        "userlogin-noaccount": "Аккаунт уиӏэба?",
        "userlogin-joinproject": "{{SITENAME}} зигъэгъус",
-       "nologin": "Аккаунт уиӏэба? $1.",
-       "nologinlink": "Аккаунт къэубл",
        "createaccount": "Аккаунт къэубл",
-       "gotaccount": "Аккаунт уиӏаха? $1.",
-       "gotaccountlink": "Системэм хахь",
-       "userlogin-resetlink": "Уи хэхьан датэхэр пщыгъупшагъа?",
        "userlogin-resetpassword-link": "УишъэфгущыIэр пщыгъупшагъа?",
        "userlogin-helplink2": "Системэм сыхэхьанэу къыздеӏ",
        "userlogin-createanother": "НэмыкI аккаунт къэубл",
        "createacct-email-ph": "Игъахь уи емэйл адресыр",
        "createacct-another-email-ph": "Игъахь уи емэйл адресыр",
        "createacct-realname": "ЦIэ шъыпкъэр (егъэзыгъэп)",
-       "createaccountreason": "ЗыпкъырыкIырэр:",
        "createacct-reason": "ЗыпкъырыкIырэр:",
        "createacct-reason-ph": "Сыда пэмыкI аккаунт зэкIэублэрэр?",
        "createacct-submit": "Уи аккаунт бгъэпсын",
        "passwordreset-emaildisabled": "Мы виким емэйл-Iофыгъохэр щылажьэхэрэп.",
        "passwordreset-username": "НэбгырацIэ:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Къэхъурэ емэйлым уеплъыщта?",
        "passwordreset-email": "Емэйл адрес:",
        "passwordreset-emailtitle": "Аккаунт и гъэпсыкIэхэр, мий щыI {{SITENAME}}",
        "passwordreset-emailelement": "НэбгырацIэ: \n$1\n\nTemporary password: \n$2",
        "prefs-rendering": "Ышъотеплъэ",
        "saveprefs": "Игъэпытыхь",
        "prefs-editing": "ЕIэзэныгъэ",
-       "rows": "Сатырхэу:",
        "searchresultshead": "Лъыхъу",
        "stub-threshold-disabled": "ГъэкIуэсагъэ",
        "recentchangesdays-max": "Максимум $1 {{PLURAL:$1|маф|мафэхэр}}",
        "right-viewsuppressed": "ЗэкIэмэ ашIогъэбылъыгъэ версиемэ яплъ",
        "right-editcontentmodel": "НэкIубгъом и кIоцIырытым и модел зэблэхъун",
        "right-editinterface": "Нэбгырэ-интерфейсым еIэзэн",
-       "right-editusercssjs": "НэмыкI нэбгырэмэ я CSS, JavaScript файлэмэ яIэзэн",
        "right-editusercss": "НэмыкI нэбгырэмэ я CSS файлэмэ яIэзэн",
        "right-edituserjs": "НэмыкI нэбгырэмэ я JavaScript файлэмэ яIэзэн",
        "right-editmyusercss": "Уи CSS файлэмэ яIэзэн",
        "right-unwatchedpages": "Зылъымыплъэрэ нэкIубгъо купым еплъ",
        "right-mergehistory": "НэкIубгъомэ ятарихъхэр зэпыдзэх",
        "right-sendemail": "НэмыкIмэ емэйл афегъэхь",
-       "right-passwordreset": "ШъэфгущыIэм фэгъэхьыгъэ емэйлхэм яплъ",
        "newuserlogpage": "ХэлэжьакӀомэ яублэн лог",
        "action-read": "едж мы нэкIубгъом",
        "action-edit": "мы нэкIубгъом еIаз",
        "rcshowhidemine": "$1 си хэӀэзэнхэр",
        "rcshowhidemine-show": "Къэгъэлъагъу",
        "rcshowhidemine-hide": "Гъэбылъ",
-       "rclinks": "Ыужрэ $1 зэхъокIыныгъэ къэгъэлъагъу мэфэ $2 ыкIоцI<br />$3",
+       "rclinks": "Ыужрэ $1 зэхъокIыныгъэ къэгъэлъагъу мэфэ $2 ыкIоцI",
        "diff": "зэфэшъхь",
        "hist": "тар",
        "hide": "Гъэбылъ",
        "feedback-message": "Мессадж:",
        "searchsuggest-search": "Лъыхъу",
        "api-error-badtoken": "ЫкIоцI фыкъуагъэ: Токен дэй.",
-       "api-error-empty-file": "Ебгъэхьыгъэ файлыр нэкIы.",
        "expand_templates_input": "Ихьэрэ текст:",
        "expand_templates_output": "Резултат",
        "expand_templates_xml_output": "XML къикIырэр",
index 794eae2..a82018d 100644 (file)
        "editfont-monospace": "خط ثابت العرض",
        "editfont-sansserif": "خط بلا زوائد",
        "editfont-serif": "خط بزوائد",
+       "sunday": "الأحد",
+       "monday": "الإثنين",
+       "tuesday": "الثلاث",
+       "wednesday": "الأربعا",
+       "thursday": "الخميس",
+       "friday": "الجمعة",
+       "saturday": "السبت",
+       "sun": "الأحد",
+       "mon": "الإثنين",
+       "tue": "الثلاث",
+       "wed": "الأربعا",
+       "thu": "الخميس",
+       "fri": "الجمعة",
+       "sat": "السبت",
+       "january": "جانفي",
+       "february": "فيڥري",
+       "march": "مارس",
+       "april": "أڥريل",
+       "may_long": "ماي",
+       "june": "جوان",
+       "july": "جويلية",
+       "august": "أوت",
+       "september": "سبتمبر",
+       "october": "أكتوبر",
+       "november": "نوڥمبر",
+       "december": "ديسمبر",
+       "january-gen": "جانفي",
+       "february-gen": "فيڥري",
+       "march-gen": "مارس",
+       "april-gen": "أڥريل",
+       "may-gen": "ماي",
+       "june-gen": "جوان",
+       "july-gen": "جويلية",
+       "august-gen": "أوت",
+       "september-gen": "سبتمبر",
+       "october-gen": "أكتوبر",
+       "november-gen": "نوڥمبر",
+       "december-gen": "ديسمبر",
+       "jan": "جانفي",
+       "feb": "فيڥري",
+       "mar": "مارس",
+       "apr": "أڥريل",
+       "may": "ماي",
+       "jun": "جوان",
+       "jul": "جويلية",
+       "aug": "أوت",
+       "sep": "سبتمبر",
+       "oct": "أكتوبر",
+       "nov": "نوڥمبر",
+       "dec": "ديسمبر",
        "category_header": "صفحات تصنيف \"$1\"",
        "subcategories": "التصنيفات الفرعية",
        "category-media-header": "الوسائط في التصنيف \"$1\"",
        "broken-file-category": "صفحات تحتوي وصلات ملفات معطوبة",
        "about": "عن",
        "article": "صفحة محتوى",
-       "newwindow": "(تفتح في نافذة جديدة)",
+       "newwindow": "(تتحلّ في شبّاك جديد)",
+       "cancel": "بطّل",
        "mypage": "صفحتي",
        "mytalk": "نقاشي",
+       "qbedit": "بدّل",
+       "returnto": "إرجع لـ$1",
+       "tagline": "من {{SITENAME}}",
+       "help": "معاونة",
+       "search": "لوّج",
+       "searchbutton": "لوّج",
+       "searcharticle": "إمشي",
+       "history": "تاريخ الپاج",
+       "history_short": "التاريخ",
+       "view": "شوفة",
+       "view-foreign": "ورّي على $1",
+       "edit": "بدّل",
+       "talkpagelinktext": "پاج الحديث",
+       "talk": "حديث",
+       "views": "شوفات",
+       "otherlanguages": "في لغات أخرين",
+       "redirectto": "تحويل لـ:",
+       "lastmodifiedat": "آخر تبديل لهذي الپاج كان نهار $1 في $2.",
+       "jumpto": "إمشي لـ:",
+       "jumptosearch": "لوّج",
+       "aboutsite": "على {{SITENAME}}",
        "copyright": "المحتوى متوفر تحت $1.",
+       "edithelp": "معاونة باش تبدّل پاج",
+       "mainpage": "الپاج الأولانيّة",
+       "mainpage-description": "الپاج الأولانيّة",
        "badaccess": "خطأ في السماح",
        "badaccess-group0": "ليس من المسموح لك تنفيذ الفعل الذي طلبته.",
        "badaccess-groups": "الفعل الذي طلبته مقصور على المستخدمين في {{PLURAL:$2||مجموعة|واحدة من مجموعتي|واحدة من مجموعات}}: $1.",
        "versionrequiredtext": "تلزم النسخة $1 من ميدياويكي لاستعمال هذه الصفحة. انظر [[Special:Version|صفحة النسخة]]",
        "youhavenewmessages": "توجد لديك $1 ($2).",
        "youhavenewmessagesmulti": "لديك رسائل جديدة على $1",
+       "editsection": "بدّل",
+       "editold": "بدّل",
+       "editlink": "بدّل",
+       "viewsourcelink": "شوف المصدر",
+       "editsectionhint": "بدّل الطرف: $1",
        "viewdeleted": "أأعرض $1؟",
        "restorelink": "{{PLURAL:$1|$1 تعديل محذوف|تعديلا واحدا محذوفا|تعديلين محذوفين|$1 تعديلات محذوفة|$1 تعديلا محذوفا|$1 تعديلا محذوفا}}",
        "feedlinks": "التغذية:",
        "site-rss-feed": "$1 تلقيم أر إس إس",
        "page-rss-feed": "\"$1\" تلقيم أر إس إس",
        "page-atom-feed": "$1 تلقيم أتوم",
+       "red-link-title": "$1 (الپاج ما فمّاش)",
        "sort-descending": "ترتيب تنازلي",
        "sort-ascending": "ترتيب تصاعدي",
+       "nstab-main": "الپاج",
        "nstab-user": "صفحة مستخدم",
        "nstab-media": "صفحة وسيط",
-       "nstab-project": "صفحة مشروع",
+       "nstab-project": "پاج مشروع",
+       "nstab-image": "فيشياي",
        "nstab-template": "قالب",
        "nstab-help": "صفحة مساعدة",
        "nstab-category": "تصنيف",
+       "mainpage-nstab": "الپاج الأولانيّة",
        "nosuchaction": "لا يوجد فعل كهذا",
        "nosuchactiontext": "الفعل المحدد بواسطة المسار غير صحيح.\nربما تكون قد كتبت المسار بطريقة غير صحيحة، أو اتبعت وصلة غير صحيحة.\nهذا ربما يشير أيضا إلى علة في {{SITENAME}}.",
        "nosuchspecialpage": "لا توجد صفحة خاصة بهذا الاسم",
        "logouttext": "'''أنت الآن غير مسجل الدخول.'''\n\nتستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنفس الاسم أو باسم آخر.\nمن الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
        "yourname": "اسم المستخدم:",
        "yourpassword": "كلمة السر:",
+       "userlogin-yourpassword-ph": "دخّل كلمة السر",
+       "createacct-yourpassword-ph": "دخّل كلمة السر",
        "yourpasswordagain": "أعد كتابة كلمة السر:",
+       "createacct-yourpasswordagain-ph": "دخّل كلمة السر مرة أخرى",
        "yourdomainname": "نطاقك:",
        "externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.",
        "login": "ادخل",
-       "userlogin": "ادخل / أنشئ حسابا",
-       "userloginnocreate": "دخول",
        "logout": "اخرج",
        "userlogout": "خروج",
        "notloggedin": "غير مسجل الدخول",
-       "nologin": "ألا تمتلك حسابا؟ '''$1'''.",
-       "nologinlink": "أنشئ حسابا",
        "createaccount": "أنشئ حسابا",
-       "gotaccount": "تمتلك حسابا بالفعل؟ '''$1'''.",
-       "gotaccountlink": "ادخل",
-       "userlogin-resetlink": "أنسيت بيانات الولوج؟",
+       "createacct-emailoptional": "الإيمايل (إختياري)",
+       "createacct-email-ph": "دخّل الإيمايل متاعك",
        "createaccountmail": "بواسطة البريد الإلكتروني",
-       "createaccountreason": "السبب:",
+       "createacct-submit": "أعمل الحساب",
+       "createacct-benefit-heading": "{{SITENAME}} إتّعمل بعباد كيفك.",
+       "createacct-benefit-body1": "{{PLURAL:$1|تبديل|تبديلات|تبديلات|تبديلات|تبديلات|تبديلات|تبديلات|تبديلات|تبديلات|تبديلات|تبديل}}",
+       "createacct-benefit-body3": "آخر {{PLURAL:$1|مساهم|مساهمين}}",
        "badretype": "كلمات السر التي أدخلتها لا تتطابق.",
        "userexists": "اسم المستخدم الذي تم إدخاله مستعمل بالفعل.\nالرجاء اختيار اسم مختلف.",
        "loginerror": "خطأ في الدخول",
        "login-abort-generic": "لم ينجح ولوجك - إجهاض",
        "loginlanguagelabel": "اللغة: $1",
        "suspicious-userlogout": "رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.",
-       "pt-login": "Odkul",
+       "pt-login": "أدخل",
+       "pt-createaccount": "أعمل حساب",
+       "pt-userlogout": "أخرج",
        "php-mail-error-unknown": "خطأ غير معروف في وظيفة البريد PHP's mail()",
        "user-mail-no-addy": "لقد حاولت إرسال بريد إلكتروني دون عنوان بريد إلكتروني.",
        "resetpass_announce": "تم تسجيل دخولك بكلمة سر مؤقتة.\nللدخول بشكل نهائي، يجب عليك ضبط كلمة سر جديدة هنا:",
        "resetpass-submit-loggedin": "تغيير كلمة السر",
        "resetpass-wrong-oldpass": "كلمة سر حالية أو مؤقتة غير صحيحة.\nربما تكون غيرت كلمة السر الخاصة بك بنجاح أو طلبت كلمة سر مؤقتة جديدة.",
        "resetpass-temp-password": "كلمة سر مؤقتة:",
-       "passwordreset": "إعادة Ø¶Ø¨Ø· كلمة السر",
+       "passwordreset": "تبدÙ\8aÙ\84 كلمة السر",
        "passwordreset-disabled": "عُطّلت إعادة تعيين كلمة السر على هذه الويكي.",
        "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{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}\nمن الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .\nإذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.",
        "savearticle": "احفظ الصفحة",
        "preview": "معاينة",
        "showpreview": "أظهر معاينة",
-       "showdiff": "أظهر التغييرات",
-       "anoneditwarning": "'''تحذÙ\8aر:''' Ù\84Ù\85 ØªÙ\82Ù\85 Ø¨Ø§Ù\84دخÙ\88Ù\84.\nسÙ\8aسجÙ\84 Ø¹Ù\86Ù\88اÙ\86 Ø§Ù\84Ø¢Ù\8aبÙ\8a Ø®Ø§ØµØªÙ\83 Ù\81Ù\8a ØªØ§Ø±Ù\8aØ® Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة.",
+       "showdiff": "ورّي التبديلات",
+       "anoneditwarning": "'''ردÙ\91 Ø¨Ø§Ù\84Ù\83:''' Ø±Ø§Ù\83 Ù\85ا Ø¯Ø®Ù\84تش Ù\84Ù\84حساب Ù\85تاعÙ\83.\nإذا Ø¨Ø¯Ù\91Ù\84ت Ø­Ø§Ø¬Ø©Ø\8c Ù\8aÙ\86جÙ\91Ù\85Ù\88ا Ø§Ù\84عباد Ø§Ù\84Ù\83Ù\84Ù\91 Ù\8aعرÙ\81Ù\88ا Ø§Ù\84Ø¥Ù\8a Ù¾Ø§Ù\8a Ù\85تاعÙ\83. Ø£Ù\85ا Ø¥Ø°Ø§ <strong>[$1 Ø¯Ø®Ù\84ت Ù\84حسابÙ\83]</strong> Ù\88Ù\84Ù\91ا <strong>[$2 Ø¹Ù\85Ù\84ت Ø­Ø³Ø§Ø¨ Ø¬Ø¯Ù\8aد]</strong>Ø\8c Ø§Ù\84تبدÙ\8aÙ\84ات Ù\85تاعÙ\83 Ø§Ù\84Ù\83Ù\84 Ø¨Ø´ Ù\8aتÙ\86سبÙ\88ا Ù\84إسÙ\85 Ø§Ù\84Ù\85ستعÙ\85Ù\84 Ù\85تاعÙ\83Ø\8c Ù\88 Ø¨Ø®Ù\84اÙ\81 Ù\87ذا ØªÙ\86جÙ\91Ù\85 ØªØ¹Ù\85Ù\84 Ø¨Ø±Ø´Ø§ Ø­Ù\88اÙ\8aج Ù\85ا ØªÙ\86جÙ\91Ù\85Ø´ ØªØ¹Ù\85Ù\84Ù\87Ù\85 Ù\88Ù\82ت Ø¥Ù\84Ù\91Ù\8a ØªØ¨Ø¯Ù\91Ù\84 Ø­Ø§Ø¬Ø© Ø¨Ø§Ù\84Ø¥Ù\8a Ù¾Ø§Ù\8a Ù\85تاعÙ\83.",
        "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
        "missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
        "missingcommenttext": "من فضلك أدخل تعليقا في الأسفل.",
-       "missingcommentheader": "'''تنبيه:''' لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"{{int:savearticle}}\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
+       "missingcommentheader": "'''تنبيه:''' لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"$1\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
        "summary-preview": "معاينة الملخص:",
        "subject-preview": "معاينة للموضوع/العنوان:",
        "blockedtitle": "المستخدم ممنوع",
        "session_fail_preview_html": "'''عذرا! لم نستطع معالجة تعديلك بسبب فقدان بيانات الجلسة.'''\n\n''لأن {{SITENAME}} بها HTML الخام مفعلة، العرض المسبق مخفي كاحتياط ضد هجمات الجافا سكريبت.''\n\n'''إذا كانت هذه محاولة تعديل صادقة، من فضلك حاول مرة أخرى.\nإذا كانت مازالت لا تعمل، حاول [[Special:UserLogout|تسجيل الخروج]] ثم تسجيل الدخول مجددا.'''",
        "token_suffix_mismatch": "'''تعديلك تم رفضه لأن عميلك أخطأ في علامات الترقيم\nفي نص التعديل. تم رفض التعديل لمنع فساد نص المقالة.\nهذا يحدث أحيانا عندما تستخدم خدمة بروكسي مجهول معيبة مبنية على الوب.'''",
        "edit_form_incomplete": "'''بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.'''",
-       "editing": "تحرÙ\8aر $1",
-       "creating": "Ø¥Ù\86شاء «$1»",
-       "editingsection": "تحرÙ\8aر $1 (Ù\82سÙ\85)",
+       "editing": "تبدÙ\8aÙ\84 $1",
+       "creating": "عÙ\85Ù\84اÙ\86 «$1»",
+       "editingsection": "تبدÙ\8aÙ\84 $1 (طرÙ\81)",
        "editingcomment": "تعديل $1 (قسم جديد)",
        "editconflict": "تضارب في التحرير: $1",
        "explainconflict": "لقد عدل شخص آخر هذه الصفحة بعد أن بدأت أنت بتحريرها.\nصندوق النصوص العلوي يحتوي على النص الموجود حاليا في الصفحة.\nوالتغييرات التي قمت أنت بها موجودة في الصندوق في أسفل الصفحة.\nيجب أن تقوم بدمج تغييراتك في النص الموجود حاليا.\n'''فقط''' ما هو موجود في الصندوق العلوي هو ما سيتم حفظه عند الضغط على زر \"حفظ الصفحة\".",
        "semiprotectedpagewarning": "'''ملاحظة:''' تمت حماية هذه الصفحة بحيث يمكن للمستخدمين المسجلين فقط تعديلها.\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
        "cascadeprotectedwarning": "'''تحذير:''' تمت حماية هذه الصفحة بحيث يستطيع المستخدمون ذوو الصلاحيات الإدارية فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
        "titleprotectedwarning": "'''تحذير:  هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
-       "templatesused": "{{PLURAL:$1||اÙ\84Ù\82اÙ\84ب Ø§Ù\84Ù\85ستخدÙ\85|اÙ\84Ù\82اÙ\84باÙ\86 Ø§Ù\84Ù\85ستخدÙ\85اÙ\86|اÙ\84Ù\82Ù\88اÙ\84ب Ø§Ù\84Ù\85ستخدÙ\85Ø©}} Ù\81Ù\8a Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة:",
+       "templatesused": "{{PLURAL:$1||اÙ\84Ù\82اÙ\84ب Ø§Ù\84Ù\85ستعÙ\85Ù\84Ø©|اÙ\84Ù\82Ù\88اÙ\84ب Ø§Ù\84Ù\85ستعÙ\85Ù\84Ø©}} Ù\81Ù\8a Ù\87Ø°Ù\8a Ø§Ù\84پاج:",
        "templatesusedpreview": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه المعاينة:",
        "templatesusedsection": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذا القسم:",
+       "template-protected": "(محمي)",
        "template-semiprotected": "(حماية جزئية)",
        "hiddencategories": "{{PLURAL:$1|هذه الصفحة غير موجودة في أي تصنايف مخفية|هذه الصفحة موجودة في تصنيف مخفي واحد|هذه الصفحة موجودة في تصنيفين مخفيين|هذه الصفحة موجودة في $1 تصانيف مخفية|هذه الصفحة موجودة في $1 تصنيفا مخفيا|هذه الصفحة موجودة في $1 تصنيف مخفي}}:",
        "nocreatetext": "قام {{SITENAME}} بتحديد القدرة على إنشاء صفحات جديدة.\nيمكنك العودة وتحرير صفحة موجودة بالفعل، أو [[Special:UserLogin|الدخول أو تسجيل حساب]].",
        "sectioneditnotsupported-text": "تعديل الأقسام غير مدعوم في هذه الصفحة",
        "permissionserrors": "أخطاء السماحات",
        "permissionserrorstext": "لا تمتلك الصلاحية لفعل هذا، {{PLURAL:$1||للسبب التالي|للسببين التاليين|للأسباب التالية}}:",
-       "permissionserrorstext-withaction": "Ù\84ا ØªÙ\85Ù\84Ù\83 Ø§Ù\84صÙ\84احÙ\8aات Ù\84$2Ø\8c Ù\84Ù\84{{PLURAL:$1||سبب Ø§Ù\84تاÙ\84Ù\8a|سببÙ\8aÙ\86 Ø§Ù\84تاÙ\84Ù\8aÙ\8aÙ\86|أسباب Ø§Ù\84تاÙ\84Ù\8aØ©}}:",
+       "permissionserrorstext-withaction": "Ù\85ا Ø¹Ù\86دÙ\83Ø´ Ø§Ù\84Ø­Ù\82 Ø¨Ø´ $2Ø\8c Ø¹Ù\84Ù\89 Ø®Ø§Ø·Ø±{{PLURAL:$1||Ù\87ا Ø§Ù\84سبب|Ù\87ا Ø§Ù\84أسباب}}:",
        "recreate-moveddeleted-warn": "'''تحذير: أنت تقوم بإعادة إنشاء صفحة سبق حذفها.'''\n\nيجب عليك التيقن من أن الاستمرار بتحرير هذه الصفحة ملائم.\nسجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
-       "moveddeleted-notice": "Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة ØªÙ\85 Ø­Ø°Ù\81Ù\87ا.\nسجلا الحذف والنقل للصفحة معروضان بالأسفل كمرجع.",
+       "moveddeleted-notice": "Ù\87ا Ø§Ù\84پاج ØªÙ\81سخت.\nسجلا الحذف والنقل للصفحة معروضان بالأسفل كمرجع.",
        "log-fulllog": "أظهر السجل الكامل",
        "edit-hook-aborted": "التعديل تم تركه بواسطة الخطاف.\nلم يعط تفسيرا.",
        "edit-gone-missing": "لم يمكن تحديث الصفحة.\nيبدو أنه تم حذفها.",
        "currentrev-asof": "المراجعة الحالية بتاريخ $1",
        "revision-info": "مراجعة $1 بواسطة $2",
        "previousrevision": "→ مراجعة أقدم",
-       "nextrevision": "Ù\85راجعة Ø£Ø­Ø¯Ø« ←",
+       "nextrevision": "Ù\85راجعة Ø£Ø¬Ø¯Ø¯ ←",
        "currentrevisionlink": "المراجعة الحالية",
        "cur": "الحالي",
        "next": "التالي",
        "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}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
-       "rev-delundel": "أظÙ\87ر/أخÙ\81",
+       "rev-delundel": "ظÙ\87Ù\91ر/خبÙ\91Ù\8a",
        "rev-showdeleted": "أظهر",
        "revisiondelete": "حذف/استرجاع المراجعات",
        "revdelete-nooldid-title": "مراجعة هدف غير صحيحة",
        "revertmerge": "إلغاء الدمج",
        "mergelogpagetext": "بالأسفل قائمة بأحدث عمليات الدمج لتاريخ صفحة ما إلى أخرى.",
        "history-title": " «$1»: تاريخ المراجعة",
-       "difference-title": "«$1»: الفرق بين المراجعتين",
+       "difference-title": "«$1»: الفرق بينات المراجعتين",
        "difference-title-multipage": "«$1» و«$2»: الفرق بين الصفحتين",
        "difference-multipage": "(الفرق بين الصفحتين)",
-       "lineno": "Sţar $1:",
+       "lineno": "سطر $1:",
        "compareselectedversions": "قارن بين النسختين المختارتين",
        "showhideselectedversions": "أظهر/أخف المراجعات المختارة",
+       "editundo": "نحّي",
        "diff-multi-manyusers": "({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)",
-       "prevn": "{{PLURAL:$1|$1}} السابقة",
-       "nextn": "{{PLURAL:$1|$1}} التالية",
+       "searchresults": "نتايج التلويج",
+       "prevn": "{{PLURAL:$1|$1}} الفايتة",
+       "nextn": "{{PLURAL:$1|$1}} الجاية",
        "prevn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
        "nextn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
        "searchmenu-new": "'''أنشئ الصفحة \"[[:$1]]\" في هذا الويكي!'''",
+       "searchprofile-everything": "كلّ شي",
+       "searchprofile-articles-tooltip": "لوّج في $1",
+       "searchprofile-images-tooltip": "لوّج عالتصاور",
        "search-result-category-size": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوًا|$1 عضو}} ({{PLURAL:$2|لا تصانيف فرعية|تصنيف فرعي واحد|تصنيفان فرعيان|$2 تصنيفات فرعية|$2 تصنيفًا فرعيًا|$2 تصنيف فرعي}} و{{PLURAL:$3|لا ملفات|ملف واحد|ملفان|$3 ملفات|$3 ملفًا|$3 ملف}})",
        "search-redirect": "(تحويلة $1)",
-       "search-suggest": "Ù\87Ù\84 كنت تقصد: $1",
+       "search-suggest": "Ù\8aاخÙ\8a كنت تقصد: $1",
        "searchrelated": "مرتبطة",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "mypreferences": "تفضيلاتي",
        "prefs-help-email-others": "يمكنك أيضا اختيار للسماح للآخرين الاتصال بك عن طريق صفحة المستخدم أو نقاش المستخدم الخاص بك دون الحاجة إلى الكشف عن الهوية الخاصة بك.",
        "newuserlogpage": "سجل إنشاء المستخدمين",
        "nchanges": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
+       "enhancedrc-history": "تاريخ",
+       "recentchanges": "التبديلات الجدد",
        "recentchanges-legend": "خيارات أحدث التغييرات",
        "recentchanges-summary": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
        "recentchanges-feed-description": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
-       "recentchanges-label-newpage": "Ø£Ù\86شأ Ù\87ذا Ø§Ù\84تعدÙ\8aÙ\84 ØµÙ\81حة جديدة",
-       "recentchanges-label-minor": "Ù\87ذا ØªØ¹Ø¯Ù\8aÙ\84 Ø·Ù\81Ù\8aÙ\81",
-       "recentchanges-label-bot": "أجرÙ\89 Ù\87ذا Ø§Ù\84تعديل بوت",
+       "recentchanges-label-newpage": "عÙ\85Ù\84 Ù\87ذا Ø§Ù\84تبدÙ\8aÙ\84 Ù¾Ø§Ø¬ جديدة",
+       "recentchanges-label-minor": "Ù\87ذا ØªØ¨Ø¯Ù\8aÙ\84 ØµØºÙ\8aر",
+       "recentchanges-label-bot": "عÙ\85Ù\84 Ù\87ذا Ø§Ù\84تبديل بوت",
        "recentchanges-label-unpatrolled": "لم يراجع هذا التعديل إلى الآن",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (شوف زادة [[Special:NewPages|ليستة الپاجات الجدد]])",
        "rcnotefrom": "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
-       "rclistfrom": "أظهر التغييرات بدءا من $3 $2",
+       "rclistfrom": "ورّي التبديلات بدءا من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
+       "rcshowhideminor-hide": "خبّي",
        "rcshowhidebots": "$1 البوتات",
+       "rcshowhidebots-show": "ورّي",
        "rcshowhideliu": "$1 المستخدمين المسجلين",
+       "rcshowhideliu-hide": "خبّي",
        "rcshowhideanons": "$1 المستخدمين المجهولين",
+       "rcshowhideanons-hide": "خبّي",
        "rcshowhidepatr": "$1 التعديلات المراجعة",
        "rcshowhidemine": "$1 تعديلاتي",
-       "rclinks": "أظهر آخر $1 تعديل في آخر $2 يوم<br />$3",
+       "rcshowhidemine-hide": "خبّي",
+       "rclinks": "أظهر آخر $1 تعديل في آخر $2 يوم",
+       "diff": "فرق",
+       "hist": "تاريخ",
        "hide": "أخف",
-       "show": "اعرض",
+       "show": "ورّي",
+       "minoreditletter": "ص",
+       "newpageletter": "ج‌",
+       "boteditletter": "ب",
+       "rc-change-size-new": "$1 {{PLURAL:$1|أوكتاي|أوكتاي}} بعد التبديل",
        "rc-enhanced-expand": "عرض التفاصيل (يتطلب جافاسكريبت)",
        "rc-enhanced-hide": "أخفِ التفاصيل",
        "recentchangeslinked": "تغييرات ذات علاقة",
        "recentchangeslinked-title": "التغييرات المرتبطة ب \"$1\"",
-       "recentchangeslinked-summary": "Ù\87Ø°Ù\87 Ù\82ائÙ\85Ø© Ø¨Ø§Ù\84تغÙ\8aÙ\8aرات Ø§Ù\84تÙ\8a ØªÙ\85ت Ø­Ø¯Ù\8aثاÙ\8b Ù\84Ù\84صÙ\81حات Ø§Ù\84Ù\85Ù\88صÙ\88Ù\84Ø© Ù\85Ù\86 ØµÙ\81حة Ù\85عÙ\8aÙ\86Ø© (Ø£Ù\88 Ø¥Ù\84Ù\89 Ø§Ù\84أعضاء Ø¶Ù\85Ù\86 ØªØµÙ\86Ù\8aÙ\81 Ù\85عÙ\8aÙ\86).\nاÙ\84صÙ\81حات Ù\81Ù\8a [[Special:Watchlist|Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83]] '''عرÙ\8aضة'''",
-       "recentchangeslinked-page": "اسÙ\85 Ø§Ù\84صÙ\81حة:",
+       "recentchangeslinked-summary": "Ù\87Ø°Ù\8a Ù\84Ù\8aستة Ø¨Ø§Ù\84تبدÙ\8aÙ\84ات Ø¥Ù\84Ù\91Ù\8a ØµØ§Ø±Ù\88ا Ù\85ا ØµØ§Ø±Ù\84Ù\87Ù\85Ø´ Ø¨Ø±Ø´Ø§ Ù\84Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a Ù\85Ù\88جÙ\88د Ù\84Ù\8aاÙ\86 Ù\8aدÙ\91Ù\8a Ù\84Ù\8aÙ\87Ù\85 Ù\81Ù\8a Ù¾Ø§Ø¬ Ø¨Ø°Ø§ØªÙ\87ا (Ù\88Ù\84Ù\91ا Ù\81Ù\8a Ù¾Ø§Ø¬ Ù\85تاع ØªØµÙ\86Ù\8aÙ\81 Ù\85عÙ\8aÙ\86).\nاÙ\84پاجات Ù\81Ù\8a [[Special:Watchlist|Ù\84Ù\8aستة Ø§Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a ØªÙ\91بعÙ\87ا]] '''Ù\85Ù\83تÙ\88بÙ\8aÙ\86 Ø¨Ø§Ù\84غÙ\84Ù\8aظ'''",
+       "recentchangeslinked-page": "إسÙ\85 Ø§Ù\84پاج:",
        "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضاً عن ذلك",
+       "upload": "صبّ فشياي",
        "uploadlogpage": "سجل الرفع",
        "filedesc": "ملخص:",
        "license": "ترخيص:",
+       "file-anchor-link": "فيشياي",
+       "filehist": "تاريخ الپاج",
        "filehist-help": "اضغط على وقت/زمن لرؤية الملف كما بدا في هذا الزمن.",
        "filehist-revert": "استرجع",
        "filehist-current": "حالي",
        "filehist-thumbtext": "تصغير للنسخة بتاريخ $1",
        "filehist-user": "مستخدم",
        "filehist-dimensions": "الأبعاد",
-       "imagelinks": "استخدام الملف",
+       "filehist-comment": "تعليق",
+       "imagelinks": "استعمال الدوسي",
        "linkstoimage": "{{PLURAL:$1||الصفحة التالية تصل|الصفحتان التاليتان تصلان|ال$1 صفحات التالية تصل|ال$1 صفحة التالية تصل}} إلى هذا الملف:",
        "nolinkstoimage": "لا توجد صفحات تصل لهذا الملف.",
        "sharedupload-desc-here": "هذا الملف من $1 ويمكن استخدامه بواسطة المشاريع الأخرى.\nالوصف على [$2 صفحة وصف الملف] هناك معروض بالأسفل.",
+       "upload-disallowed-here": "ما تنجّمش تبدّل هذي التصويرة.",
+       "randompage": "پاج بالزهر",
        "statistics": "إحصاءات",
-       "nmembers": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}",
+       "brokenredirects-edit": "بدّل",
+       "nmembers": "{{PLURAL:$1|حتى عضو|عضو واحد||زوز أعضاء|$1 عضو}}",
        "prefixindex": "كل الصفحات بالبادئة",
        "usercreated": "{{GENDER:$3|أنشأه|أنشأته}} في $1 الساعة $2",
+       "newpages": "پاجات جدد",
        "move": "انقل",
        "pager-newer-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
        "pager-older-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
        "booksources": "مصادر كتاب",
-       "booksources-search-legend": "اÙ\84بحث Ø¹Ù\86 مصادر الكتب",
+       "booksources-search-legend": "اÙ\84تÙ\84Ù\88Ù\8aج Ø¹Ù\84Ù\89 مصادر الكتب",
        "log": "سجلات",
        "allpagessubmit": "اذهب",
        "categories": "تصنيفات",
        "listgrouprights-members": "(قائمة الأعضاء)",
        "emailuser": "إرسال رسالة لهذا المستخدم",
        "watchlist": "قائمة مراقبتي",
-       "mywatchlist": "Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\8a",
+       "mywatchlist": "Ù\84Ù\8aستة Ø§Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a Ù\86تبÙ\91عÙ\87ا",
        "watchlistfor2": "ل$1 $2",
        "watch": "راقب",
        "unwatch": "أوقف المراقبة",
        "actioncomplete": "انتهاء العملية",
        "actionfailed": "الفعل فشل",
        "dellogpage": "سجل الحذف",
+       "rollbacklink": "رجّع",
        "protectlogpage": "سجل الحماية",
        "protectedarticle": "حمى \"[[$1]]\"",
+       "restriction-edit": "تبديل",
        "undeletelink": "اعرض/استعد",
        "undeleteviewlink": "اعرض",
        "namespace": "النطاق",
        "invert": "اعكس الاختيار",
-       "contributions": "مساهماتي",
+       "blanknamespace": "(رئيسي)",
+       "contributions": "مساهمات {{GENDER:$1|المستعمل|المستعملة}}",
        "contributions-title": "مساهمات المستخدم $1",
        "mycontris": "مساهماتي",
+       "anoncontribs": "مساهمات",
        "contribsub2": "ل$1 ($2)",
-       "month": "Ù\85Ù\86 Ø³Ù\86Ø© (Ù\88أقدم):",
-       "year": "Ù\85Ù\86 Ø³Ù\86Ø© (Ù\88أقدم):",
+       "month": "Ù\85Ù\86 Ø´Ù\87ر (Ù\88 أقدم):",
+       "year": "Ù\85Ù\86 Ø¹Ø§Ù\85 (Ù\88 أقدم):",
        "sp-contributions-newbies": "اعرض مساهمات الحسابات الجديدة فقط",
        "sp-contributions-blocklog": "سجل المنع",
        "sp-contributions-uploads": "مرفوعات",
        "sp-contributions-username": "عنوان أيبي أو اسم مستخدم:",
        "sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
        "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
+       "whatlinkshere-page": "الپاج:",
        "linkshere": "الصفحات التالية تصل إلى '''[[:$1]]''':",
        "nolinkshere": "لا توجد صفحات تصل إلى '''[[:$1]]'''.",
        "isredirect": "صفحة تحويل",
        "isimage": "وصلة ملف",
        "whatlinkshere-next": "{{PLURAL:$1|التالية|ال$1 التالية}}",
        "whatlinkshere-links": "← وصلات",
-       "whatlinkshere-hideredirs": "$1 Ø§Ù\84تحÙ\88Ù\8aÙ\84ات",
+       "whatlinkshere-hideredirs": "$1 تحويلات",
        "whatlinkshere-hidetrans": "$1 التضمينات",
-       "whatlinkshere-hidelinks": "$1 الوصلات",
+       "whatlinkshere-hidelinks": "$1 ليانات",
        "whatlinkshere-hideimages": "$1 وصلة صورة",
        "whatlinkshere-filters": "مرشحات",
        "ipboptions": "ساعتين:2 hours,يوم واحد:1 day,3 أيام:3 days,أسبوع واحد:1 week,أسبوعين:2 weeks,شهر واحد:1 month,3 أشهر:3 months,6 أشهر:6 months,سنة واحدة:1 year,دائم:infinite",
        "ipblocklist": "المستخدمون الممنوعون",
+       "blocklink": "بلوكي",
        "unblocklink": "ارفع المنع",
        "change-blocklink": "تغيير المنع",
        "blocklogpage": "سجل المنع",
        "blocklogentry": "منع \"[[$1]]\" لفترة زمنية مدتها $2 $3",
        "block-log-flags-nocreate": "إنشاء الحسابات ممنوع",
-       "movelogpage": "سجل النقل",
+       "movelogpage": "سجل التحويل",
        "revertmove": "استرجع",
        "export": "تصدير صفحات",
        "allmessagesname": "الاسم",
        "tooltip-pt-preferences": "تفضيلاتي",
        "tooltip-pt-watchlist": "قائمة الصفحات التي تراقب التغييرات التي تحدث بها",
        "tooltip-pt-mycontris": "قائمة مساهماتك",
+       "tooltip-pt-login": "ماذابيك لوكان تدخل للويكي، أما موش لازمك تعمل هكّا",
        "tooltip-pt-logout": "خروج",
+       "tooltip-pt-createaccount": "ماذابيك لوكان تعمل حساب و تدخل للويكي، أما موش لازمك تعمل هكّا",
+       "tooltip-ca-edit": "بدّل الپاج",
        "tooltip-ca-addsection": "ابدأ قسما جديدا",
+       "tooltip-ca-viewsource": "هذه الپاج محمية.\nتنجّم تشوف مصدرها.",
        "tooltip-ca-protect": "احم هذه الصفحة",
        "tooltip-ca-delete": "احذف هذه الصفحة",
-       "tooltip-ca-move": "عÙ\84Ù\85 Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة",
-       "tooltip-ca-watch": "أضÙ\81 Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة Ø¥Ù\84Ù\89 Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83",
+       "tooltip-ca-move": "Ø­Ù\88Ù\91Ù\84 Ù\87Ø°Ù\8a Ø§Ù\84پاج",
+       "tooltip-ca-watch": "زÙ\8aد Ù\87ا Ø§Ù\84پاج Ù\84Ù\84Ù\8aستة Ø§Ù\84پاجات Ø¥Ù\84Ù\91Ù\8a ØªÙ\91بعÙ\87ا",
        "tooltip-ca-unwatch": "أزل هذه الصفحة من قائمة مراقبتك",
+       "tooltip-search": "لوّج في {{SITENAME}}",
+       "tooltip-search-go": "إمشي للپاج إلّي عندها هذا الإسم بالضبط إذا هي موجودة",
+       "tooltip-p-logo": "شوف الپاج الأولانيّة",
+       "tooltip-n-mainpage": "شوف الپاج الأولانيّة",
+       "tooltip-n-mainpage-description": "شوف الپاج الأولانيّة",
+       "tooltip-n-randompage": "خرّج پاج بالزهر",
        "tooltip-feed-atom": "تلقيم أتوم لهذه الصفحة",
-       "tooltip-t-contributions": "رؤية قائمة مساهمات هذا المستخدم",
+       "tooltip-t-contributions": "ليستة مساهمات ها {{GENDER:$1|المستعمل|المستعملة}}",
        "tooltip-t-emailuser": "أرسل رسالة لهذا المستخدم",
+       "tooltip-t-upload": "صبّ فيشيايات",
        "tooltip-ca-nstab-user": "اعرض صفحة المستخدم",
-       "tooltip-ca-nstab-special": "Ù\87Ø°Ù\87 ØµÙ\81حة Ø®Ø§ØµØ©Ø\8c Ù\84ا ØªØ³ØªØ·Ù\8aع Ø£Ù\86 ØªØ¹Ø¯Ù\84 Ø§Ù\84صÙ\81حة Ù\86Ù\81سÙ\87ا",
+       "tooltip-ca-nstab-special": "Ù\87Ø°Ù\8a Ù¾Ø§Ø¬ Ø³Ù¾Ø§Ø³Ù\8aاÙ\84Ø\8c Ù\88 Ù\85ا ØªÙ\86جÙ\91Ù\85Ø´ ØªØ¨Ø¯Ù\91Ù\84 Ù\81Ù\8aÙ\87ا Ø´Ù\8a",
        "tooltip-ca-nstab-project": "رؤية صفحة المحتوى",
        "tooltip-ca-nstab-image": "رؤية صفحة الملف",
        "tooltip-ca-nstab-template": "رؤية القالب",
        "tooltip-watch": "أضف هذه الصفحة إلى قائمة مراقبتك",
        "tooltip-undo": "\"رجوع\" تسترجع هذا التعديل وتفتح نافذة التعديل في نمط العرض المسبق. تسمح بإضافة سبب في الملخص.\n\"Annuler\" trajjeε eltabdila lekhra w tħel fenêtre mtaε  el tabdil mtaε elvue el msabqa. Tnajjem tqoul εlech f'ettalkhis.",
        "tooltip-summary": "أدخل ملخصا قصيرا",
-       "previousdiff": "â\86\92 Ø§Ù\84تعدÙ\8aÙ\84 Ø§Ù\84سابÙ\82",
-       "nextdiff": "اÙ\84تعدÙ\8aÙ\84 Ø§Ù\84Ù\84احÙ\82 ←",
+       "previousdiff": "â\86\92 Ø§Ù\84تبدÙ\8aÙ\84 Ø§Ù\84Ù\81اÙ\8aت",
+       "nextdiff": "اÙ\84تبدÙ\8aÙ\84 Ø§Ù\84جاÙ\8a ←",
        "file-info-size": "$1 × $2 بكسل حجم الملف: $3، نوع MIME: $4",
        "file-nohires": "لا توجد دقة أعلى متوفرة.",
        "svg-long-desc": "ملف SVG، أبعاده $1 × $2 بكسل، حجم الملف: $3",
+       "show-big-image": "الفيشياي الأصلي",
        "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-datetime": "نهار و وقت تبديل الفيشياي",
        "namespacesall": "الكل",
        "monthsall": "الكل",
        "watchlisttools-view": "اعرض التغييرات المرتبطة",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|حديث]])",
        "duplicate-defaultsort": "'''تحذير:''' مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
        "external_image_whitelist": " #<pre>اترك هذا السطر تماما كما هو\n#ضع منثورات التعبيرات المنتظمة (فقط الجزء الذي يذهب بين //) بالأسفل\n#هذه ستتم مطابقتها مع مسارات الصور الخرجية (الموصولة بشكل مباشر)\n#هذه التي تطابق سيتم عرضها كصور، غير ذلك فقط وصلة إلى الصورة سيتم عرضها\n#السطور التي تبدأ ب# تتم معاملتها كتعليقات\n#هذا لا يتأثر بحالة الحروف\n\n#ضع كل منثورات التعبيرات المنتظمة فوق هذا السطر. اترك هذا السطر تماما كما هو</pre>",
-       "tag-filter": "مرشح [[Special:Tags|الوسوم]]:"
+       "tag-filter": "مرشح [[Special:Tags|الوسوم]]:",
+       "tags-edit": "بدّل",
+       "logentry-newusers-create": "إتحلّ حساب {{GENDER:$2|المستعمل|المستعملة}} $1",
+       "searchsuggest-search": "لوّج في {{SITENAME}}"
 }
index d435dbb..38a665d 100644 (file)
@@ -27,7 +27,7 @@
                ]
        },
        "tog-underline": "Onderstreep skakels.",
-       "tog-hideminor": "Moenie klein wysigings in die onlangse wysigingslys wys nie.",
+       "tog-hideminor": "Versteek klein wysigings in die onlangse wysigingslys.",
        "tog-hidepatrolled": "Versteek gepatrolleerde wysigings in onlangse wysigingslys",
        "tog-newpageshidepatrolled": "Versteek gepatrolleerde wysigings van nuwe bladsy lys",
        "tog-extendwatchlist": "Brei dophoulys uit om alle wysigings te wys, nie slegs die nuutste nie",
@@ -62,9 +62,9 @@
        "tog-ccmeonemails": "Stuur my 'n kopie van die e-pos wat ek aan ander stuur",
        "tog-diffonly": "Moenie 'n bladsy se inhoud onder die wysigingsverskil wys nie",
        "tog-showhiddencats": "Wys versteekte kategorië",
-       "tog-norollbackdiff": "Laat verskille weg na terugrol",
+       "tog-norollbackdiff": "Moenie verskille wys as teruggerol word nie",
        "tog-useeditwarning": "Waarsku my as ek 'n gewysigde bladsy verlaat voordat dit gestoor is",
-       "tog-prefershttps": "Gebruik altyd 'n beveiligde verbinding wanneer aangemeld is",
+       "tog-prefershttps": "Gebruik altyd 'n beveiligde verbinding terwyl aangemeld is",
        "underline-always": "Altyd",
        "underline-never": "Nooit",
        "underline-default": "Omslag of webblaaier se verstekwaarde",
        "newwindow": "(verskyn in nuwe venster)",
        "cancel": "Kanselleer",
        "moredotdotdot": "Meer…",
-       "morenotlisted": "Die lys is nie volledig nie.",
+       "morenotlisted": "Dié lys is dalk onvolledig.",
        "mypage": "Gebruikersblad",
        "mytalk": "Bespreking",
        "anontalk": "Bespreking",
        "searcharticle": "Wys",
        "history": "Bladsygeskiedenis",
        "history_short": "Geskiedenis",
+       "history_small": "geskiedenis",
        "updatedmarker": "opgedateer sedert my laaste besoek",
        "printableversion": "Drukbare weergawe",
        "permalink": "Permanente skakel",
        "externaldberror": "'n Databasisfout het tydens aanmelding voorgekom of u het nie toestemming om u eksterne rekening op te dateer nie.",
        "login": "Meld aan",
        "nav-login-createaccount": "Meld aan / registreer",
-       "userlogin": "Meld aan / registreer",
-       "userloginnocreate": "Meld aan",
        "logout": "Teken uit",
        "userlogout": "Teken uit",
        "notloggedin": "Nie ingeteken nie",
        "userlogin-noaccount": "Nog nie geregistreer nie?",
        "userlogin-joinproject": "Word lid van {{SITENAME}}",
-       "nologin": "Nog nie geregistreer nie? $1.",
-       "nologinlink": "Skep gerus 'n gebruiker",
        "createaccount": "Skep nuwe rekening",
-       "gotaccount": "Het u reeds 'n rekening? $1.",
-       "gotaccountlink": "Meld aan",
-       "userlogin-resetlink": "U besonderhede vergeet?",
        "userlogin-resetpassword-link": "Wagwoord vergeet?",
        "userlogin-helplink2": "Hulp met aanmelding",
        "userlogin-loggedin": "U is reeds aangemeld as {{GENDER:$1|$1}}.\nGebruik die onderstaande vorm om as 'n ander gebruiker aan te meld.",
        "createacct-another-email-ph": "Verskaf e-posadres",
        "createaccountmail": "Gebruik 'n tydelike lukrake wagwoord en stuur dit na die e-posadres hier onder",
        "createacct-realname": "Regte naam (opsioneel)",
-       "createaccountreason": "Rede:",
        "createacct-reason": "Rede",
        "createacct-reason-ph": "Hoekom u nog 'n rekening skep",
        "createacct-submit": "Skep u rekening",
-       "createacct-another-submit": "Skep nog 'n rekening",
+       "createacct-another-submit": "Skep 'n rekening",
+       "createacct-continue-submit": "Gaan voort om 'n rekening te skep",
+       "createacct-another-continue-submit": "Gaan voort om 'n rekening te skep",
        "createacct-benefit-heading": "{{SITENAME}} word deur mense soos u geskep.",
        "createacct-benefit-body1": "{{PLURAL:$1|wysiging|wysigings}}",
        "createacct-benefit-body2": "{{PLURAL:$1|bladsy|bladsye}}",
        "nocookieslogin": "{{SITENAME}} gebruik koekies vir die aanmeld van gebruikers.\nU blaaier laat nie koekies toe nie.\nSkakel dit asseblief aan en probeer weer.",
        "nocookiesfornew": "Die gebruiker is nie geskep nie omdat die oorsprong nie bevestig kon word nie.\nMaak seker dat u koekies aangeskakel het, herlaai die bladsy en probeer dan weer.",
        "noname": "Ongeldige gebruikersnaam.",
-       "loginsuccesstitle": "Suksesvolle aanmelding",
+       "loginsuccesstitle": "Aangemeld",
        "loginsuccess": "U is nou by {{SITENAME}} as \"$1\" ingeteken.",
-       "nosuchuser": "Die gebruiker \"$1\" bestaan nie.\nGebruikersname is gevoelig vir hoofletters.\nMaak seker dit is reg gespel of [[Special:CreateAccount|skep 'n nuwe rekening]].",
+       "nosuchuser": "Die gebruikernaam \"$1\" bestaan nie.\nGebruikername is gevoelig vir hoofletters.\nMaak seker dit is reg gespel of [[Special:CreateAccount|skep 'n nuwe rekening]].",
        "nosuchusershort": "Daar is geen gebruikersnaam \"$1\" nie. Maak seker dit is reg gespel.",
        "nouserspecified": "U moet 'n gebruikersnaam spesifiseer.",
        "login-userblocked": "Hierdie gebruiker is geblokkeer.\nIntekening word verbied.",
        "anonpreviewwarning": "''U is nie aangeteken nie.''\n''As u die bladsy stoor sal u IP-adres in die bladsy se geskeidenis aangeteken word.''",
        "missingsummary": "'''Neem kennis''': Geen opsomming van die wysiging is verskaf nie. As \"Stoor\" weer gekliek word, word die wysiging sonder 'n opsomming gestoor.",
        "missingcommenttext": "Tik die opsomming onder.",
-       "missingcommentheader": "'''Let op:''' U het geen onderwerp/opskrif vir die opmerking verskaf nie. As u weer op \"{{int:savearticle}}\" klik, sal u wysiging sonder die onderwerp/opskrif gestoor word.",
+       "missingcommentheader": "'''Let op:''' U het geen onderwerp/opskrif vir die opmerking verskaf nie. As u weer op \"$1\" klik, sal u wysiging sonder die onderwerp/opskrif gestoor word.",
        "summary-preview": "Opsommingsvoorskou:",
        "subject-preview": "Onderwerp/opskrif voorskou:",
        "blockedtitle": "Gebruiker is geblokkeer",
        "editingsection": "Besig om $1 (onderafdeling) te wysig",
        "editingcomment": "Besig om $1 te wysig (nuwe opskrif)",
        "editconflict": "Wysigingskonflik: $1",
-       "explainconflict": "Iemand anders het hierdie bladsy gewysig sedert u dit begin wysig het.\nDie boonste invoerboks het die teks wat tans bestaan.\nU wysigings word in die onderste invoerboks gewys.\nU sal u wysigings moet saamsmelt met die huidige teks.\n'''Slegs''' die teks in die boonste invoerboks sal gestoor word wanneer u \"{{int:savearticle}}\" druk.",
+       "explainconflict": "Iemand anders het hierdie bladsy gewysig sedert u dit begin wysig het.\nDie boonste invoerboks het die teks wat tans bestaan.\nU wysigings word in die onderste invoerboks gewys.\nU sal u wysigings moet saamsmelt met die huidige teks.\n'''Slegs''' die teks in die boonste invoerboks sal gestoor word wanneer u \"$1\" druk.",
        "yourtext": "U teks",
        "storedversion": "Gestoorde weergawe",
        "nonunicodebrowser": "'''Waarskuwing: U webblaaier ondersteun nie Unikode nie.'''\nDie MediaWiki-sagteware hou hiermee rekening sodat u bladsye veilig kan wysig: nie-ASCII karakters word in die wysigingsvenster as heksadesimale kodes weergegee.",
        "showhideselectedversions": "Wys/versteek gekose weergawes",
        "editundo": "maak ongedaan",
        "diff-empty": "(Geen verskil)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur dieselfde gebruiker nie gewys nie)",
-       "diff-multi-manyusers": "({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur meer as $2 {{PLURAL:$2|gebruiker|gebruikers}} nie gewys nie)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Een wysiging tussenin|$1 wysigings tussenin}} deur dieselfde gebruiker nie gewys nie)",
+       "diff-multi-manyusers": "({{PLURAL:$1|Een wysiging tussenin|$1 wysigings tussenin}} deur meer as $2 {{PLURAL:$2|gebruiker|gebruikers}} nie gewys nie)",
        "difference-missing-revision": "{{PLURAL:$2|'n Weergawe|$2 weergawes}} van die verskil ($1) {{PLURAL:$2|is|is}} nie gevind nie.\n\nDit word meestal veroorsaak deur die volg van 'n verouderde verwysing na 'n bladsy wat verwyder is.\nDetails kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
        "searchresults": "Soekresultate",
        "searchresults-title": "Soekresultate vir \"$1\"",
        "searchprofile-advanced-tooltip": "Soek in spesifieke naamruimtes",
        "search-result-size": "$1 ({{PLURAL:$2|1 woord|$2 woorde}})",
        "search-result-category-size": "{{PLURAL:$1|1 kategorielid|$1 kategorielede}} ({{PLURAL:$2|1 subkategorie|$2 subkategorieë}}, {{PLURAL:$3|1 lêer|$3 lêers}})",
-       "search-redirect": "(aanstuur $1)",
+       "search-redirect": "(aangestuur vanaf $1)",
        "search-section": "(afdeling $1)",
        "search-category": "(kategorie $1)",
        "search-file-match": "(stem ooreen met die inhoud van die leêr)",
        "prefs-watchlist-token": "Dophoulys-sleutel:",
        "prefs-misc": "Allerlei",
        "prefs-resetpass": "Verander wagwoord",
-       "prefs-changeemail": "Wysig E-posadres",
+       "prefs-changeemail": "Wysig of verwyder e-posadres",
        "prefs-setemail": "Stel 'n e-posadres",
        "prefs-email": "E-posopsies",
        "prefs-rendering": "Voorkoms",
        "saveprefs": "Stoor voorkeure",
-       "restoreprefs": "Herstel voorkeure",
+       "restoreprefs": "Herstel alle verstekvoorkeure (in alle afdelings)",
        "prefs-editing": "Wysigings",
-       "rows": "Rye",
-       "columns": "Kolomme",
        "searchresultshead": "Soekresultate",
-       "stub-threshold": "Drempel vir merk as <a href=\"#\" class=\"stub\">saadjie</a> (grepe):",
+       "stub-threshold": "Drempel vir formatering van saadjies ($1):",
        "stub-threshold-sample-link": "voorbeeld",
        "stub-threshold-disabled": "Afgeskakel",
        "recentchangesdays": "Aantal dae wat in onlangse wysigings vertoon word:",
        "youremail": "E-posadres:",
        "username": "{{GENDER:$1|Gebruikersnaam}}:",
        "prefs-memberingroups": "{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepe}}:",
+       "group-membership-link-with-expiry": "$1 (tot $2)",
        "prefs-registration": "Registrasiedatum:",
        "yourrealname": "Regte naam:",
        "yourlanguage": "Taal:",
        "prefs-help-signature": "Kommentaar op besprekingsbladsye moet met \"<nowiki>~~~~</nowiki>\" onderteken word.\nDie tildes word in u handtekening omgeskakel en die datum en tyd word insluit.",
        "badsig": "Ongeldige handtekening; gaan HTML na.",
        "badsiglength": "U handtekening is te lank.\nDit mag nie meer as $1 {{PLURAL:$1|karakter|karakters}} bevat nie.",
-       "yourgender": "Geslag:",
-       "gender-unknown": "Ek wil nie sê nie",
+       "yourgender": "Hoe wil u beskryf word?",
+       "gender-unknown": "Die sagteware sal sover mootlik geslagneutrale woorde gebruik om na u te verwys",
        "gender-male": "Hy bewerk wikiblaaie",
        "gender-female": "Sy bewerk wikiblaaie",
        "prefs-help-gender": "Opsioneel: dit word gebruik om gebruikers korrek aan te spreek in die sagteware.\nDie inligting is vir ander gebruikers sigbaar.",
        "email": "E-pos",
-       "prefs-help-realname": "Regte naam is opsioneel.\nAs u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.",
+       "prefs-help-realname": "Regte naam is opsioneel.\nAs u dit verskaf, kan dit gebruik word om erkenning vir u werk te gee.",
        "prefs-help-email": "E-posadres is opsioneel, maar is nodig om u wagwoord aan u te stuur sou u dit vergeet.",
        "prefs-help-email-others": "U kan ook kies om ander toe te laat om u deur u gebruikers- en besprekingsbladsy te kontak sonder om u identiteit te openbaar.",
        "prefs-help-email-required": "E-pos adres word benodig.",
        "right-editprotected": "Wysig bladsye beskermd as \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Wysig bladsye wat as \"{{int:protect-level-autoconfirmed}}\" beskerm is",
        "right-editinterface": "Wysig die gebruikerskoppelvlak",
-       "right-editusercssjs": "Wysig ander gebruikers se CSS- en JS-lêers",
        "right-editusercss": "Wysig ander gebruikers se CSS-lêers",
        "right-edituserjs": "Wysig ander gebruikers se JS-lêers",
        "right-editmyusercss": "Wysig u persoonlike CSS-bladsy",
        "recentchanges-legend-heading": "<strong>Sleutel:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sien ook die [[Special:NewPages|lys van nuwe bladsye]])",
        "recentchanges-submit": "Wys",
+       "rcfilters-filter-registered-label": "Geregistreer",
+       "rcfilters-filter-registered-description": "Aangemelde redigeerders.",
+       "rcfilters-filter-unregistered-label": "Ongeregistreer",
+       "rcfilters-filter-unregistered-description": "Redigeerders wat nie aangemeld is nie.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nuwelinge",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Minder as 10 wysigings en 4 dae van aktiwiteit.",
        "rcnotefrom": "Wysigings sedert <strong>$2</strong> (maksimum van <strong>$1</strong> word gewys).",
        "rclistfrom": "Vertoon wysigings vanaf $3 $2",
        "rcshowhideminor": "$1 klein wysigings",
        "rcshowhidemine-hide": "Versteek",
        "rcshowhidecategorization-show": "Wys",
        "rcshowhidecategorization-hide": "Versteek",
-       "rclinks": "Vertoon die laaste $1 wysigings in die afgelope $2 dae<br />$3",
+       "rclinks": "Vertoon die laaste $1 wysigings in die afgelope $2 dae",
        "diff": "verskil",
        "hist": "geskiedenis",
        "hide": "Versteek",
        "sourcefilename": "Oorspronklike lêernaam:",
        "sourceurl": "Bron-URL:",
        "destfilename": "Teikenlêernaam:",
-       "upload-maxfilesize": "Maksimum lêer grootte: $1",
+       "upload-maxfilesize": "Maksimum-lêergrootte: $1",
        "upload-description": "Lêerbeskrywing",
        "upload-options": "Oplaai-opsies",
        "watchthisupload": "Hou die lêer dop",
        "apisandbox-submit": "Maak versoek",
        "apisandbox-reset": "Vee uit",
        "apisandbox-retry": "Herprobeer",
-       "apisandbox-examples": "Voorbeeld",
-       "apisandbox-results": "Resultaat",
+       "apisandbox-examples": "Voorbeelde",
+       "apisandbox-results": "Resultate",
        "apisandbox-request-url-label": "Versoek-URL:",
        "apisandbox-request-time": "Versoektyd: $1",
        "booksources": "Boekbronne",
        "undeleteviewlink": "bekyk",
        "undeleteinvert": "Omgekeerde seleksie",
        "undeletecomment": "Rede:",
-       "undeletedrevisions": "{{PLURAL:$1|1 weergawe|$1 weergawes}} herstel",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 weergawe|$1 weergawes}} en {{PLURAL:$2|1 lêer|$2 lêers}} herstel",
-       "undeletedfiles": "{{PLURAL:$1|1 lêer|$1 lêers}} herstel",
        "cannotundelete": "Terugplasing was onsuksesvol:\n$1",
        "undeletedpage": "'''$1 is teruggeplaas'''\n\nKonsulteer die [[Special:Log/delete|verwyderingslogboek]] vir 'n rekord van onlangse verwyderings en terugplasings.",
        "undelete-header": "Sien die [[Special:Log/delete|skraplogboek]] vir onlangs verwyderde bladsye.",
        "sp-contributions-blocked-notice-anon": "Hierdie IP-adres is tans geblokkeer.\nDie laaste inskrywing uit die blokkeerlogboek word hier ter inligting weergegee:",
        "sp-contributions-search": "Soek na bydraes",
        "sp-contributions-username": "IP-adres of gebruikersnaam:",
-       "sp-contributions-toponly": "Wys slegs die nuutste weergawes",
+       "sp-contributions-toponly": "Slegs die nuutste weergawes",
+       "sp-contributions-newonly": "Slegs nuwe bladsye",
+       "sp-contributions-hideminor": "Versteek klein wysigings",
        "sp-contributions-submit": "Soek",
        "whatlinkshere": "Skakels hierheen",
        "whatlinkshere-title": "Bladsye wat na \"$1\" skakel",
        "exif-compression-3": "CCITT Groep 3 fakskodering",
        "exif-compression-4": "CCITT Groep 4 fakskodering",
        "exif-copyrighted-true": "Onder kopiereg",
-       "exif-copyrighted-false": "Publieke Domein",
+       "exif-copyrighted-false": "Kopieregstatus nie gespesifiseer nie",
        "exif-unknowndate": "Datum onbekend",
        "exif-orientation-1": "Normaal",
        "exif-orientation-2": "Horisontaal gespieël",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|het}} 'n nuwe weergawe van $3 opgelaai",
        "logentry-upload-revert": "$1 het $3 {{GENDER:$2|opgelaai}}",
        "rightsnone": "(geen)",
-       "revdelete-summary": "redigeringsopsomming",
        "feedback-adding": "U terugvoer word op die bladsy geplaas...",
        "feedback-back": "Terug",
        "feedback-bugcheck": "Gaaf! Kontroleer of dit nie dalk een van die [$1 bekende foute] is nie.",
        "feedback-submit": "Dien in",
        "feedback-thanks": "Dankie! U terugvoer is op die bladsy \"[$2 $1]\" geplaas.",
        "feedback-thanks-title": "Baie dankie!",
-       "searchsuggest-search": "Soek",
+       "searchsuggest-search": "Deursoek {{SITENAME}}",
        "searchsuggest-containing": "bevat...",
-       "api-error-badaccess-groups": "U word nie toegelaat om lêers te laai op hierdie wiki.",
        "api-error-badtoken": "Interne fout: slegte teken.",
-       "api-error-copyuploaddisabled": "Oplaai via URL is gedeaktiveer op hierdie bediener.",
-       "api-error-duplicate": "Daar {{PLURAL:$1|is al 'n lêer|is al lêers}} met dieselfde inhoud op die wiki.",
-       "api-error-duplicate-archive": "Daar {{PLURAL:$1|was 'n ander lêer|was ander lêers}} op hierdie webtuiste met dieselfde inhoud, maar {{PLURAL:$1|dit is|dit is}} geskrap.",
-       "api-error-empty-file": "Die lêer wat u probeer oplaai is leeg.",
        "api-error-emptypage": "Die skep van leë nuwe bladsye word nie toegelaat nie.",
-       "api-error-fetchfileerror": "Interne fout: Iets het verkeerd gegaan met die haal van die lêer.",
-       "api-error-fileexists-forbidden": "Daar is reeds 'n lêer met die naam \"$1\" wat nie oorskryf kan word nie.",
-       "api-error-fileexists-shared-forbidden": "Daar is reeds 'n lêer met die naam \"$1\" in die gedeelde lêerstoor, en kan nie oorskryf word nie.",
-       "api-error-file-too-large": "Die lêer wat u probeer oplaai is te groot.",
-       "api-error-filename-tooshort": "Die lêernaam is te kort.",
-       "api-error-filetype-banned": "Hierdie tipe lêer is verban en word nie toegelaat nie.",
-       "api-error-filetype-banned-type": "Die {{PLURAL:$4|lêertipe|lêertipes}} $1 word nie toegelaat nie. Toelaatbare {{PLURAL:$3|lêertipes|lêertipes}} is $2.",
-       "api-error-filetype-missing": "Die lêer het nie 'n uitbreiding nie.",
-       "api-error-hookaborted": "Die wysiging wat jy probeer maak, is deur 'n uitbreiding haak geaborteer.",
-       "api-error-http": "Interne fout: Kan nie 'n verbinding met die bediener maak nie.",
-       "api-error-illegal-filename": "Die lêernaam word nie toegelaat nie.",
-       "api-error-internal-error": "Interne fout: daar is iets verkeerd gegaan het met die verwerking van die oplaai van die lêer op die wiki.",
-       "api-error-invalid-file-key": "Interne fout: die lêer is nie in tydelike berging gevind nie.",
-       "api-error-missingparam": "Interne fout: ontbrekende parameters op aanvraag.",
-       "api-error-missingresult": "Interne fout: Kon nie bepaal of die kopie daarin geslaag.",
-       "api-error-mustbeloggedin": "U moet ingeteken wees om lêers te kan laai.",
-       "api-error-mustbeposted": "Interne fout: Die versoek vereis 'n HTTP POST-metode.",
-       "api-error-noimageinfo": "Die oplaai daarin geslaag, maar die bediener het ons nie enige inligting oor die lêer.",
-       "api-error-nomodule": "Interne fout: daar is nie 'n uploadmodule ingestel nie.",
-       "api-error-ok-but-empty": "Interne fout: geen reaksie van die bediener.",
-       "api-error-overwrite": "'N bestaande lêer vervang word nie toegelaat nie.",
-       "api-error-stashfailed": "Interne fout: Server nie tydelike lêer te stoor.",
        "api-error-publishfailed": "Interne fout: bediener kon nie die tydelike lêer publiseer nie.",
-       "api-error-timeout": "Die bediener het nie reageer binne die verwagte tyd.",
-       "api-error-unclassified": "'n Onbekende fout het voorgekom.",
-       "api-error-unknown-code": "Onbekende fout: \"$1\"",
-       "api-error-unknown-error": "Interne fout: daar is iets verkeerd geloop het toe probeer om jou lêer te laai.",
+       "api-error-stashfailed": "Interne fout: Server nie tydelike lêer te stoor.",
        "api-error-unknown-warning": "Onbekende waarskuwing: $1",
        "api-error-unknownerror": "Onbekende fout: \"$1\"",
-       "api-error-uploaddisabled": "Oplaai is afgeskakel op hierdie wiki.",
-       "api-error-verification-error": "Hierdie lêer kan beskadig of het die verkeerde uitbreiding.",
        "duration-seconds": "$1 {{PLURAL:$1|sekonde|sekondes}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuut|minute}}",
        "duration-hours": "$1 {{PLURAL:$1|uur|ure}}",
        "expand_templates_generate_xml": "Wys XML-ontledingsboom",
        "expand_templates_generate_rawhtml": "Wys rou HTML",
        "expand_templates_preview": "Voorskou",
+       "pagelanguage": "Verander bladsytaal",
        "pagelang-name": "Bladsy",
        "pagelang-language": "Taal",
        "pagelang-use-default": "Gebruik standaard taal",
        "pagelang-select-lang": "Kies taal",
+       "pagelang-reason": "Rede",
        "pagelang-submit": "Dien in",
+       "pagelang-nonexistent-page": "Die bladsy $1 bestaan nie.",
        "right-pagelang": "Wysig die taal van die bladsy",
        "log-name-pagelang": "Logboek van taalwysigings",
        "log-description-pagelang": "Hierdie is 'n logboek van wysigings van die taal van bladsye.",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laosiaans",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "en-strepie",
+       "special-characters-title-emdash": "em-strepie",
        "special-characters-title-minus": "minusteken",
        "mw-widgets-dateinput-no-date": "Geen datum gekies nie",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "bladsy bestaan nog nie",
        "mw-widgets-titleinput-description-redirect": "aanstuur na $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Voeg 'n kategorie by...",
+       "mw-widgets-usersmultiselect-placeholder": "Voeg nog by...",
        "sessionprovider-generic": "$1-sessies",
        "log-action-filter-all": "Alle",
        "authmanager-email-label": "E-pos",
index 5f9ab04..6279c17 100644 (file)
        "externaldberror": "Ose pat gabim në databazën e autentifikimit, ose nuk lejoheni me ndryshue llogarinë tuej të jashtme.",
        "login": "Kyçu",
        "nav-login-createaccount": "Kyçu / çel llogari",
-       "userlogin": "Kyçu / çel llogari",
-       "userloginnocreate": "Kyçu",
        "logout": "Çkyçu",
        "userlogout": "Çkyçu",
        "notloggedin": "Nuk je i kyçun",
-       "nologin": "Nuk ke llogari? '''$1'''.",
-       "nologinlink": "Krijo llogari",
        "createaccount": "Krijo llogari",
-       "gotaccount": "Ke llogari? '''$1'''.",
-       "gotaccountlink": "Kyçu",
        "createaccountmail": "me email",
-       "createaccountreason": "Arsyeja:",
        "badretype": "Fjalëkalimet nuk janë të njêjta.",
        "userexists": "Nofka keni zgjedhë âsht në përdorim.\nZgjedh nji emën tjetër.",
        "loginerror": "Gabim në kyçje",
        "editingsection": "Tue redaktue (sekcionin) $1",
        "editingcomment": "Tue redaktue (sekcionin e ri) $1",
        "editconflict": "Konflikt redaktues: $1",
-       "explainconflict": "Dikush tjetër e ka ndryshue këtë faqe derisa e redaktojshit ju.\nKutia e sipërme tregon tekstin aktual të faqes.\nNdryshimet tueja gjinden në kutinë e poshtme redaktuese.\nJu duheni me i bashkue ndryshimet tueja në tekstin aktual.\n'''Vetëmse''' nëse shtypni \"{{int:savearticle}}\" ka me u ruejtë teksti në kutinë e sipërme redaktuese.",
+       "explainconflict": "Dikush tjetër e ka ndryshue këtë faqe derisa e redaktojshit ju.\nKutia e sipërme tregon tekstin aktual të faqes.\nNdryshimet tueja gjinden në kutinë e poshtme redaktuese.\nJu duheni me i bashkue ndryshimet tueja në tekstin aktual.\n'''Vetëmse''' nëse shtypni \"$1\" ka me u ruejtë teksti në kutinë e sipërme redaktuese.",
        "yourtext": "Teksti juej",
        "storedversion": "Rishikim i ruejtun",
        "nonunicodebrowser": "'''Kujdes: Shfletuesi juej nuk e përkrah unicodein.'''\nPër me ju lejue me redaktue faqen pa gabime aplikohet nji opcion shtesë: germat jashta ASCII kodit paraqiten me kod heksadecimal.",
        "saveprefs": "Regjistro",
        "restoreprefs": "Kthe tâna përcaktimet si në fillim",
        "prefs-editing": "Tue redaktue",
-       "rows": "Rreshta:",
-       "columns": "Kolona:",
        "searchresultshead": "Kërkimi",
        "stub-threshold": "Pragu për formatimin e <a href=\"#\" class=\"stub\">vegzave të cungueme</a> në (byte):",
        "recentchangesdays": "Numri i ditëve për me i tregue te ndryshimet e freskëta:",
        "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": "Llogaria juaj nuk ju lejon të ndryshoni privilegjet e përdoruesve.",
        "userrights-changeable-col": "Grupe që mund të ndryshoni",
        "userrights-unchangeable-col": "Grupe që s'mund të ndryshoni",
        "group": "Grupi:",
        "right-protect": "Ndrysho nivelin mbrojtës dhe redakto faqet e mbrojtura",
        "right-editprotected": "Redakto faqet e mbrojtura (pa ndryshuar mbrojtjen)",
        "right-editinterface": "Ndrysho parapamjen e përdoruesit",
-       "right-editusercssjs": "Redakto skedat CSS dhe JS të përdoruesve tjerë",
        "right-editusercss": "Redakto skedat CSS të përdoruesve tjerë",
        "right-edituserjs": "Redakto skedat JS të përdoruesve tjerë",
        "right-noratelimit": "Mos u prek nga kufizimet e vlerësimit",
        "right-unwatchedpages": "Shiko listën e faqeve të pa vëzhguara",
        "right-mergehistory": "Bashko historinë e faqeve",
        "right-userrights": "Redakto të gjitha të drejtat e përdoruesit",
-       "right-passwordreset": "Fjalëkalimi Reset e një përdoruesi ([[Special:PasswordReset|faqe veçantë]])",
        "newuserlogpage": "Regjistri i krijimit të përdoruesve",
        "rightslog": "Regjsitri i tagrit të përdoruesve",
        "rightslogtext": "Ky është një regjistër për ndryshimet e titujve të përdoruesve.",
        "rcshowhideanons": "$1 përdorues anonim",
        "rcshowhidepatr": "$1 redaktime të patrullueme",
        "rcshowhidemine": "$1 redaktimet e mija",
-       "rclinks": "Trego $1 ndryshime gjatë $2 ditëve<br />$3",
+       "rclinks": "Trego $1 ndryshime gjatë $2 ditëve",
        "diff": "ndrysh",
        "hist": "hist",
        "hide": "msheh",
        "revdelete-restricted": "u vendosën kufizime për administruesit",
        "revdelete-unrestricted": "u hoqën kufizimet për administruesit",
        "rightsnone": "(asgjë)",
-       "revdelete-summary": "përmbledhja redaktimit",
        "searchsuggest-search": "Kërkim",
        "searchsuggest-containing": "përmban ...",
        "special-characters-group-latin": "Latinisht",
index 0033e3e..cbcdc51 100644 (file)
@@ -10,7 +10,9 @@
                        "Teferra",
                        "아라",
                        "Matma Rex",
-                       "Macofe"
+                       "Macofe",
+                       "Stephanecbisson",
+                       "Yeniesil"
                ]
        },
        "tog-underline": "በመያያዣ ስር አስምር",
        "externaldberror": "ወይም አፍአዊ የማረጋገጫ መረጃ-ቤት ስኅተት ነበረ፣ ወይም አፍአዊ አባልነትዎን ማሳደስ አልተፈቀዱም።",
        "login": "ለመግባት",
        "nav-login-createaccount": "መግቢያ",
-       "userlogin": "ግባ / ተመዝገብ",
-       "userloginnocreate": "ለመግባት",
        "logout": "ከብዕር ስምዎ ለመውጣት",
        "userlogout": "መውጫ",
        "notloggedin": "አልገቡም",
-       "nologin": "የብዕር ስም ገና የለዎም? '''$1'''!",
-       "nologinlink": "አዲስ የብዕር ስም ያውጡ",
        "createaccount": "አዲስ አባል ለመሆን",
-       "gotaccount": "(አባልነት አሁን ካለዎ፥ '''$1''' ይግቡ)",
-       "gotaccountlink": "በዚህ",
-       "userlogin-resetlink": "የመግቢያ ዝርዝርዎን ረተዋልን?",
        "userlogin-resetpassword-link": "የይለፍ ቃልዎን አጡ?",
        "createacct-emailrequired": "ኢ-ሜይል አድራሻ",
        "createacct-email-ph": "ኢ-ሜይል አድራሻዎን ያስገቡ",
        "createaccountmail": "በኢ-ሜል",
-       "createaccountreason": "ምክንያት:",
        "createacct-reason": "ምክንያት",
        "createacct-reason-ph": "ለምን ሌላ የብዕር ስም ሊያወጡ እንደሆነ",
        "createacct-submit": "የብዕር ስም ለማውጣት",
        "prefs-rendering": " አቀራረብ",
        "saveprefs": "ይቆጠብ",
        "prefs-editing": "የማዘጋጀት ምርጫዎች",
-       "rows": "በማዘጋጀቱ ሰንጠረዥ ስንት ተርታዎች?",
-       "columns": "ስንት ዓምዶችስ?",
        "searchresultshead": "ፍለጋ",
        "recentchangesdays": "በቅርቡ ለውጦች ዝርዝር ስንት ቀን ይታይ?",
        "recentchangesdays-max": "(እስከ $1 {{PLURAL:$1|ቀን|ቀን}} ድረስ)",
        "userrights-reason": "ምክንያቱ፦",
        "userrights-no-interwiki": "ማዕረጎችን በሌላ ዊኪ ላይ ለማስተካከል ፈቃድ የለዎም።",
        "userrights-nodatabase": "መረጃ-ቤቱ $1 አይኖርም ወይም የቅርብ አካባቢ አይደለም።",
-       "userrights-nologin": "የአባል መብቶች ለመወሰን መጋቢ ሆነው [[Special:UserLogin|መግባት]] ያስፈልግዎታል።",
-       "userrights-notallowed": "የአባል መብቶች ለማስተካከል ፈቃድ የለዎም።",
        "userrights-changeable-col": "ሊቀይሩ የሚችሉት ስብስባዎች",
        "userrights-unchangeable-col": "ሊቀይሩ የማይችሉት ስብስባዎች፦",
        "group": "ደረጃ፦",
        "recentchanges-label-bot": "ይኸው ለውጥ በሎሌ ተደረገ።",
        "recentchanges-label-unpatrolled": "ይህ እርማት ገና አልተገመገመም",
        "recentchanges-legend-newpage": "$1 - አዲስ ገጽ",
+       "rcfilters-filtergroup-lastRevision": "የመጨረሻ ክለሳ",
        "rcnotefrom": "ከ'''$2''' ጀምሮ የተቀየሩት ገጾች (እስከ '''$1''' ድረስ) ክዚህ በታች ይታያሉ።",
        "rclistfrom": "(ከ $3 $2 ጀምሮ አዲስ ለውጦቹን ለማየት)",
        "rcshowhideminor": "ጥቃቅን ለውጦች $1",
        "rcshowhideanons": "የቁ. አድራሻ ለውጦች $1",
        "rcshowhidepatr": "የተቆጣጠሩ ለውጦች $1",
        "rcshowhidemine": "የኔ $1",
-       "rclinks": "ባለፉት $2 ቀን ውስጥ የወጡት መጨረሻ $1 ለውጦች ይታዩ።<br />($3)",
+       "rclinks": "ባለፉት $2 ቀን ውስጥ የወጡት መጨረሻ $1 ለውጦች ይታዩ።",
        "diff": "ለውጡ",
        "hist": "ታሪክ",
        "hide": "ይደበቁ",
        "undeleteviewlink": "ተመልከት",
        "undeleteinvert": "ምርጫውን ለመገልበጥ",
        "undeletecomment": "ማጠቃልያ፦",
-       "undeletedrevisions": "{{PLURAL:$1|1 ዕትም|$1 ዕትሞች}} መለሰ",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 ዕትም|$1 ዕትሞች}} እና {{PLURAL:$2|1 ፋይል|$2 ፋይሎች}} መለሰ",
-       "undeletedfiles": "{{PLURAL:$1|1 ፋይል|$1 ፋይሎች}} መለሰ",
        "cannotundelete": "መመለሱ አልተከናወነም፤ ምናልባት ሌላ ሰው ገጹን አስቀድሞ መልሶታል።",
        "undeletedpage": "'''$1 ተመልሷል'''\n\nበቅርብ የጠፉና የተመለሱ ገጾች ለማመልከት [[Special:Log/delete|የማጥፋቱን መዝገብ]] ይዩ።",
        "undelete-header": "በቅርብ ግዜ የተደለዙትን ገጾች ለማመልከት [[Special:Log/delete|የማጥፋቱን መዝገብ]] ይዩ።",
        "htmlform-selectorother-other": "ሌላ",
        "logentry-delete-delete": "$1 ገጹን $3 አጠፋ",
        "rightsnone": "(የለም)",
-       "revdelete-summary": "ማጠቃለያ",
        "feedback-cancel": "ይቅር",
        "searchsuggest-search": "ፈልግ",
        "searchsuggest-containing": "በመጣጥፎች ይዘት ለመፈልግ...",
-       "api-error-badaccess-groups": "እርስዎ በዚህ ውኪ ላይ ፋይል እንድሊኩ አልተፈቀደም።",
        "api-error-badtoken": "የውስጥ ስህተት: መጥፎ ጥቅል።",
-       "api-error-copyuploaddisabled": "በሰነድ አድራሻ መላክ በዚህ አቅራቢ ላይ አልተፈቀደም።",
-       "api-error-duplicate": "በዚህ ድረ ገጽ ላይ የዚህ ዓይነት ይዞታ {{PLURAL:$1| ያለው ፋይል አለ። | ያላቸው ፍይሎች አሉ።}}",
-       "api-error-empty-file": "የላኩት ፋይል ባዶ ነበር።",
-       "api-error-fetchfileerror": "የውስጥ ስህተት: ፍይሉ ሲመጣ ችግር ተፈጠረ።",
-       "api-error-file-too-large": "የላኩት ፋይል በጣም ትልቅ ነበር።",
-       "api-error-filename-tooshort": "የፋይሉ ስም በጣም ትንሽ ነው።",
-       "api-error-filetype-banned": "የዚህ ዓይነት ፋይል ተከልክሏል።",
-       "api-error-filetype-banned-type": "$1 ያልተፈቀደ ፋይል አይነት ነው። የተፈቀዱት ፋይል አይነቶች $2 ናቸው።",
-       "api-error-filetype-missing": "ፋይሉ ቅጥያ ይጎለዋል።",
-       "api-error-illegal-filename": "የፋይሉ ስም የተፈቀደ አይደለም።",
-       "api-error-invalid-file-key": "የውስጥ ስህተት: ፍይሉ የጊዜያዊ ማስቀመጫ ውስጥ አልተገኘም።",
-       "api-error-missingparam": "የውስጥ ስህተት: ጥያቄው ግቤቶች ይጎሉታል።",
-       "api-error-missingresult": "የውስጥ ስህተት: መቅዳቱ እንደተሳካ ማረጋገጥ አልተቻለም።",
-       "api-error-mustbeloggedin": "ፋይል ለመላክ ተዘግቦ መግባት ያስፈልጋል።",
-       "api-error-noimageinfo": "ፋይል መላኩ ተሳክቷል ግን አቅራቢው ምንም ዓይነት መረጃ ስለ ፋይሉ አልሰጠም።",
-       "api-error-overwrite": "እንድን ፋይል ደምስሶ መጻፍ አልተፈቀደም።",
        "api-error-stashfailed": "የውስጥ ስህተት: አቅራቢው ጊዜያዊ ፍይሉን አላስቀመጠም።",
-       "api-error-timeout": "በሚገባ ጊዜ ውስጥ አቅራቢው መልስ አልሰጠም።",
-       "api-error-unknown-code": "ያልታወቀ ስህተት: \"$1\"",
-       "api-error-unknown-error": "የውስጥ ስህተት: የእርስዎን ፋይል ለመላክ ሲሞከር ችግር ተፈጠረ።",
        "api-error-unknown-warning": "ያልታወቀ ማስጠንቀቂያ $1",
        "api-error-unknownerror": "ያልታወቀ ስህተት: \"$1\"",
-       "api-error-uploaddisabled": "ፋይል መላክ በዚህ ውኪ ላይ አልተፈቀደም።",
-       "api-error-verification-error": "ይህ ፋይል የተበላሸ ወይም ትክክል ያልሆነ ቅጥያ ያለው ሊሆን ይችላል።",
        "expand_templates_ok": "እሺ"
 }
index f3d19ec..be092be 100644 (file)
        "externaldberror": "Bi habió una error d'autenticación externa d'a base de datos u bien no tiene premisos ta esviellar a suya cuenta externa.",
        "login": "Encetar sesión",
        "nav-login-createaccount": "Encetar una sesión / creyar cuenta",
-       "userlogin": "Encetar una sesión / creyar cuenta",
-       "userloginnocreate": "Encetar una sesión",
        "logout": "Salir d'a sesión",
        "userlogout": "Salir",
        "notloggedin": "No ha dentrato en o sistema",
        "userlogin-noaccount": "No tiene garra cuenta?",
-       "nologin": "No tiene garra cuenta? '''$1'''.",
-       "nologinlink": "Creyar una nueva cuenta",
        "createaccount": "Creyar una nueva cuenta",
-       "gotaccount": "Tiene ya una cuenta? '''$1'''.",
-       "gotaccountlink": "Identificar-se y encetar sesión",
-       "userlogin-resetlink": "Ha xublidau os suyos datos d'acceso?",
        "createacct-another-email-ph": "Establir una adreza de correu-e",
        "createaccountmail": "por correu electronico",
-       "createaccountreason": "Razón:",
        "createacct-submit": "Creya a tuya cuenta",
        "createacct-another-submit": "Creya unatra cuenta",
        "createacct-benefit-body3": "{{PLURAL:$1|colaborador recient|colaboradors recients}}",
        "showdiff": "Amostrar cambeos",
        "anoneditwarning": "''Pare cuenta:'' No s'ha identificato con un nombre d'usuario. A suya adreza IP s'alzará en l'historial d'a pachina.",
        "anonpreviewwarning": "''No s'ha identificau con una cuenta d'usuario. A suya adreza IP quedará rechistrada en l'historial d'edicions d'ista pachina.\"",
-       "missingsummary": "'''Pare cuenta:''' No ha escrito garra resumen d'edición. Si puncha de nuevas en «{{int:savearticle}}» a suya edición se grabará sin resumen.",
+       "missingsummary": "'''Pare cuenta:''' No ha escrito garra resumen d'edición. Si puncha de nuevas en «$1» a suya edición se grabará sin resumen.",
        "missingcommenttext": "Por favor, escriba o texto astí baixo.",
-       "missingcommentheader": "'''Recordanza:''' No ha garra títol ta iste comentario. Si puncha de nuevas en \"{{int:savearticle}}\", a suya edición se grabará sin garra títol.",
+       "missingcommentheader": "'''Recordanza:''' No ha garra títol ta iste comentario. Si puncha de nuevas en \"$1\", a suya edición se grabará sin garra títol.",
        "summary-preview": "Veyer anvista previa d'o resumen:",
        "subject-preview": "Anvista previa d'o tema/títol:",
        "blockedtitle": "L'usuario ye bloqueyato",
        "editingsection": "Editando $1 (sección)",
        "editingcomment": "Editando $1 (nueva sección)",
        "editconflict": "Conflicto d'edición: $1",
-       "explainconflict": "Bel atro usuario ha cambiato ista pachina dende que vusté prencipió a editar-la.\nO quatrón de texto superior contiene o texto d'a pachina como ye actualment.\nOs suyos cambeos s'amuestran en o quatrón de texto inferior.\nHabrá d'incorporar os suyos cambeos en o texto existent.\n'''Nomás''' o texto en o quatrón superior s'alzará quan prete o botón \"{{int:savearticle}}\".",
+       "explainconflict": "Bel atro usuario ha cambiato ista pachina dende que vusté prencipió a editar-la.\nO quatrón de texto superior contiene o texto d'a pachina como ye actualment.\nOs suyos cambeos s'amuestran en o quatrón de texto inferior.\nHabrá d'incorporar os suyos cambeos en o texto existent.\n'''Nomás''' o texto en o quatrón superior s'alzará quan prete o botón \"$1\".",
        "yourtext": "O texto suyo",
        "storedversion": "Versión almadazenata",
        "nonunicodebrowser": "'''Pare cuenta: O suyo navegador no cumple a norma Unicode. S'ha activato un sistema d'edición alternativo que li premitirá d'editar articlos con seguridat: os carácters no ASCII aparixerán en a caixa d'edición como codigos hexadecimals.'''",
        "saveprefs": "Alzar preferencias",
        "restoreprefs": "Restaure todas as confeguracions por defecto",
        "prefs-editing": "Edición",
-       "rows": "Ringleras:",
-       "columns": "Columnas:",
        "searchresultshead": "Mirar",
        "stub-threshold": "Branquil superior ta o formateyo de <a href=\"#\" class=\"stub\">vinclos ta borradors</a> (en bytes):",
        "stub-threshold-disabled": "Desactivato",
        "right-protect": "Cambiar os livels de protección y editar pachinas protechitas",
        "right-editprotected": "Editar pachinas protechitas (sin de protección en cascada)",
        "right-editinterface": "Editar a interficie d'usuario",
-       "right-editusercssjs": "Editar os fichers CSS y JS d'atros usuarios",
        "right-editusercss": "Editar os fichers CSS d'atros usuarios",
        "right-edituserjs": "Editar os fichers JS d'atros usuarios",
        "right-rollback": "Desfer a escape as edicions d'o zaguer usuario que cambió una pachina",
        "rcshowhidepatr": "$1 edicions controlatas",
        "rcshowhidemine": "$1 as mías edicions",
        "rcshowhidemine-hide": "Amagar",
-       "rclinks": "Amostrar os zaguers $1 cambeos en os zaguers $2 días.<br />$3",
+       "rclinks": "Amostrar os zaguers $1 cambeos en os zaguers $2 días.",
        "diff": "dif",
        "hist": "hist",
        "hide": "Amagar",
        "undeleteviewlink": "veyer",
        "undeleteinvert": "Contornar selección",
        "undeletecomment": "Razón:",
-       "undeletedrevisions": "{{PLURAL:$1|Una edición restaurata|$1 edicions restauratas}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|revisón|revisions}} y $2 {{PLURAL:$2|fichero|fichers}} restauratos",
-       "undeletedfiles": "$1 {{PLURAL:$1|fichero restaurato|fichers restauratos}}",
        "cannotundelete": "No s'ha puesto desfer o borrau; belatro usuario puede haber desfeito antis o borrau.",
        "undeletedpage": "'''S'ha restaurato $1'''\n\nConsulte o [[Special:Log/delete|rechistro de borraus]] ta veyer una lista d'os zaguers borraus y restauracions.",
        "undelete-header": "En o [[Special:Log/delete|rechistro de borraus]] se listan as pachina borratas fa poco tiempo.",
        "logentry-newusers-create2": "$1 creyó una cuenta d'usuario $3",
        "logentry-newusers-autocreate": "S'ha creyau automaticament a cuenta $1",
        "rightsnone": "(garra)",
-       "revdelete-summary": "editar resumen",
        "feedback-adding": "Adhibindo comentarios ta la pachina...",
        "feedback-bugcheck": "Perfecto! Comprebe nomás que no sía un [$1 fallo conoixiu].",
        "feedback-bugnew": "L'he comprebau. Informar d'un nuevo fallo.",
        "feedback-thanks": "Gracias! O suyo comentario s'ha publicau en a pachina [$2  $1].",
        "searchsuggest-search": "Mirar",
        "searchsuggest-containing": "que contién...",
-       "api-error-badaccess-groups": "No puetz cargar fichers en iste wiki.",
        "api-error-badtoken": "Error interna: Simbolo incorrecto.",
-       "api-error-copyuploaddisabled": "A puyada por URL ye desactivada en iste servidor.",
-       "api-error-duplicate": "Ya existe {{PLURAL:$1|unatro fichero|belatros fichers}} en o puesto con o mesmo conteniu.",
-       "api-error-duplicate-archive": "Ya {{PLURAL:$1|existiba unatro fichero|existiban atros fichers}} en o puesto con o mesmo conteniu, pero {{PLURAL:$1|estió eliminau|estioron eliminaus}}.",
-       "api-error-empty-file": "O fichero que ninvió yera vuedo.",
        "api-error-emptypage": "No se permite a creyación de pachinas nuevas en blanco.",
-       "api-error-fetchfileerror": "Error interna: Bella cosa salió malament mientres s'obteneba o fichero.",
-       "api-error-file-too-large": "O fichero que ninvió yera masiau gran.",
-       "api-error-filename-tooshort": "O nombre de fichero ye masiau corto.",
-       "api-error-filetype-banned": "Iste tipo de fichero ye vedau.",
-       "api-error-filetype-banned-type": "{{PLURAL:$4|Os fichers de tipo $1|Os fichers d'os tipos $1}} no se permiten. {{PLURAL:$3|Nomás s'admeten os fichers d'o tipo|Nomás s'admeten os fichers d'os tipos}} $2.",
-       "api-error-filetype-missing": "O fichero no tiene extensión de fichero.",
-       "api-error-hookaborted": "A modificación que intentés fer estió cancelada por un gancho d'extensión.",
-       "api-error-http": "Error interna: No se puede connectar ta o servidor.",
-       "api-error-illegal-filename": "O nombre de fichero no ye permitiu.",
-       "api-error-internal-error": "Error interna: Bella cosa salió malament en procesar a tuya carga en o wiki.",
-       "api-error-invalid-file-key": "Error interna: No se trobó o fichero en l'almagazenamiento temporal.",
-       "api-error-missingparam": "Error interna: Faltan parametros en a demanda.",
-       "api-error-missingresult": "Error interna: No se podió determinar si la copia estió correcta.",
-       "api-error-mustbeloggedin": "Ha d'encetar una sesión ta cargar fichers.",
-       "api-error-mustbeposted": "Error interna: a suya demanda requiere HTTP POST.",
-       "api-error-noimageinfo": "La carga se realizó correctament, pero o servidor no nos dio garra información sobre o fichero.",
-       "api-error-nomodule": "Error interna: No i hai garra modulo de carga configurau.",
-       "api-error-ok-but-empty": "Error interna: No i hai garra respuesta d'o servidor.",
-       "api-error-overwrite": "No se premite de sobrescribir un fichero existent.",
        "api-error-stashfailed": "Error interna: O servidor no podió almagazenar o fichero temporal.",
-       "api-error-timeout": "O servidor no respondió en o plazo previsto.",
-       "api-error-unclassified": "Ocurrió una error desconoixida.",
-       "api-error-unknown-code": "Error desconoixida: «$1»",
-       "api-error-unknown-error": "Error interna: Bella cosa salió malament en intentar cargar o fichero.",
        "api-error-unknown-warning": "Alvertencia desconoixida: $1",
        "api-error-unknownerror": "Error desconoixida: «$1».",
-       "api-error-uploaddisabled": "As cargas de fichers son desactivadas en iste wiki.",
-       "api-error-verification-error": "Iste fichero puede estar danyau, u tiene una extensión incorrecta.",
        "expandtemplates": "Espandir plantillas",
        "expand_templates_intro": "Ista pachina especial prene bel testo y espande recursivament todas as plantillas que bi ha en el. Tamién espande as funcions parser como <nowiki>{{</nowiki>#language:...}}, y as variables como <nowiki>{{</nowiki>CURRENTDAY}}&mdash; en cheneral tot o que sía entre dobles claus.\nIsto lo fa clamando ta o parser correspondient dende o propio MediaWiki.",
        "expand_templates_title": "Títol ta contestualizar ({{FULLPAGENAME}} etz.):",
index 2da2b7f..1c60380 100644 (file)
@@ -16,7 +16,8 @@
                        "Macofe",
                        "WhatamIdoing",
                        "Hogweard",
-                       "Amire80"
+                       "Amire80",
+                       "Pyscowicz"
                ]
        },
        "tog-underline": "Mearc under hlencan:",
        "morenotlisted": "Þis getæl meaht bēon unfulfyled.",
        "mypage": "Mīn tramet",
        "mytalk": "Mīn mōtung",
-       "anontalk": "Þisses IP naman mōtung",
+       "anontalk": "Mōtung",
        "navigation": "Þurhfōr",
        "and": "&#32;and",
        "qbfind": "Findan",
        "searcharticle": "Gān",
        "history": "Trametes stǣr",
        "history_short": "Stǣr",
+       "history_small": "stǣr",
        "updatedmarker": "nīwod æfter mīnre lætestan sōcne",
        "printableversion": "Ūtmǣlendlicu fadung",
        "permalink": "Fæst hlenca",
        "talkpage": "Sprecan ymbe þisne tramet",
        "talkpagelinktext": "Mōtung",
        "specialpage": "Syndrig tramet",
-       "personaltools": "Āgne tōlas",
+       "personaltools": "Āgnu tōl",
        "articlepage": "Sēon innunge tramet",
        "talk": "Mōtung",
        "views": "Sihþa",
-       "toolbox": "Tōlas",
+       "toolbox": "Tōl",
        "userpage": "Sēon brūcendes tramet",
        "projectpage": "Sēon weorces tramet",
        "imagepage": "Sēon ymelan tramet",
        "nstab-template": "Bysen",
        "nstab-help": "Helpes tramet",
        "nstab-category": "Flocc",
+       "mainpage-nstab": "Hēafodtramet",
        "nosuchaction": "Swilc dǣd ne biþ nā",
        "nosuchactiontext": "Sēo þe se nettfrumfinded wile dōn nis genge.\nÞū wēninga miswrite þone nettfrumfindend, oþþe folgode unrihtne hlencan.\nÞis mæg ēac tācnian wōh on þǣre weorcwrithyrste þe is gebrocen fram {{SITENAME}}.",
        "nosuchspecialpage": "Swilc syndrig tramet ne biþ nā",
        "password-change-forbidden": "Þū ne canst awendan þafungword on þissum wiki.",
        "login": "Inmeldian",
        "nav-login-createaccount": "Inmeldian / wyrcan reccinge",
-       "userlogin": "Inmeldian / wyrcan reccinge",
-       "userloginnocreate": "Inmeldian",
        "logout": "Ūtmeldian",
        "userlogout": "Ūtmeldian",
        "notloggedin": "Nā ingemeldod",
        "userlogin-noaccount": "Næfst þu hordcleofan?",
        "userlogin-joinproject": "Ƿeorðan gylda of {{SITENAME}}",
-       "nologin": "Næfst þū reccinge? $1",
-       "nologinlink": "Scieppan reccinge",
        "createaccount": "Scieppan reccinge",
-       "gotaccount": "Hafast þū reccinge ǣr? $1.",
-       "gotaccountlink": "Inmeldian",
        "userlogin-resetpassword-link": "Forgēate þū þīn gelēafword?",
        "userlogin-helplink2": "Inmeldunge help",
        "createacct-emailrequired": "Spearcǣrenda nama",
        "createacct-another-email-ph": "Besettan spearcǣrenda naman",
        "createaccountmail": "Notian hwīlendlic hlīetlic þafungword and sendan hit tō þǣm genamodan spearcǣrendnaman",
        "createacct-realname": "Sōt nama (ungenēdedlic)",
-       "createaccountreason": "Racu:",
        "createacct-reason": "Racu",
        "createacct-reason-ph": "For hwȳ wyrcest þū ōðerne grīman",
        "createacct-submit": "Scieppan þīnne grīman",
        "oldpassword": "Eald þafungword:",
        "newpassword": "Nīwe þafungword:",
        "retypenew": "Wrīt nīwe þafungword eft:",
+       "botpasswords-label-create": "Scieppan",
+       "botpasswords-label-update": "Nīƿa",
        "resetpass-submit-loggedin": "Andwendan þafungword",
        "resetpass-submit-cancel": "Undōn",
        "passwordreset": "Settan þafungword eft",
        "searchprofile-everything-tooltip": "Sēcan geond ealla innunga (ēac mōtungum)",
        "searchprofile-advanced-tooltip": "Sēcan on mā namsteda",
        "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 worda}})",
-       "search-redirect": "(edlǣded fram \"$1\")",
+       "search-redirect": "(edlǣded fram $1)",
        "search-section": "(dǣl $1)",
        "search-suggest": "Mǣnst þū: $1",
        "search-interwiki-caption": "Sweostorweorc",
        "rcshowhidemine": "$1 mīna adihtunga",
        "rcshowhidemine-show": "Īwan",
        "rcshowhidemine-hide": "Hȳdan",
-       "rclinks": "Īwan þā nīwostan $1 andwendunga in þissum nīehstum $2 daga<br />$3",
+       "rclinks": "Īwan þā nīwostan $1 andwendunga in þissum nīehstum $2 daga",
        "diff": "scēad",
        "hist": "stǣr",
        "hide": "Hȳdan",
        "contributions": "{{GENDER:$1|Brūcendes}} forðunga",
        "contributions-title": "Brūcendes forðunga for $1",
        "mycontris": "Mīna forðunga",
+       "anoncontribs": "forðunga",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
        "uctop": "(genge)",
        "month": "Fram mōnþe (and ǣr)",
        "logentry-delete-delete": "$1 {{GENDER:$2|forlēas}} tramet $3",
        "logentry-move-move": "$1 {{GENDER:$2|wæg}} þone tramet $3 tō $4",
        "logentry-newusers-create": "Brūcendes grīma $1 wæs {{GENDER:$2|geworht}}",
-       "revdelete-summary": "ādihtscortnes",
-       "searchsuggest-search": "Sēcan",
+       "searchsuggest-search": "Sēcan {{SITENAME}}",
        "special-characters-group-latin": "Lǣden",
        "special-characters-group-latinextended": "Ēacnod Lǣden",
        "special-characters-group-symbols": "Tācnu",
index 56bbdfe..4734ca2 100644 (file)
        "userlogin-remembermypassword": "हमरा लॉगिन रखऽ",
        "login": "लॉग इन",
        "nav-login-createaccount": "सत्रारंभ / खाता खोलॊ",
-       "userlogin": "लॉग इन / खाता बनाबॊ",
        "logout": " सत्रांत (लॉग आउट)",
        "userlogout": "सत्रांत (लॉग आउट)",
        "userlogin-noaccount": "आपन॑ क॑ खाता नै छै?",
        "userlogin-joinproject": "{{SITENAME}} सं॑ जुड़ऽ",
-       "nologinlink": "एगो खाता बनाबॊ",
        "createaccount": "नवीन खाता बनाबऽ",
        "userlogin-resetpassword-link": "पासवर्ड भुलाय गेल्हो की ?",
        "userlogin-helplink2": "लॉग-इन सथें सहायता",
        "rcshowhidemine": "हमरऽ संपादन $1",
        "rcshowhidemine-show": "देखाबऽ",
        "rcshowhidemine-hide": "छुपाबऽ",
-       "rclinks": "पिछला $2 दिना मं॑ होलऽ $1 बदलाव देखियै.<br />$3",
+       "rclinks": "पिछला $2 दिना मं॑ होलऽ $1 बदलाव देखियै.",
        "diff": "अंतर",
        "hist": "इतिहास",
        "hide": "छुपाबऽ",
index 9bcb004..bd164ce 100644 (file)
        "viewyourtext": "يمكنك رؤية و نسخ مصدر <strong>تعديلاتك</strong> لهذه الصفحة.",
        "protectedinterface": "توفر هذه الصفحة نص الواجهة للبرنامج على هذا الويكي، وهي محمية لمنع سوء أستخدامها.\nلإضافة أو تغيير الترجمات لجميع مشاريع الويكي، رجاءً أستخدم [https://translatewiki.net/ translatewiki.net]، مشروع الترجمة الخاص بميدياويكي.",
        "editinginterface": "<strong>تنبيه:</strong> تعديل هذه الصفحة سيحفظ في هذا الويكي فقط. لتعميم التعديل على جميع مشاريع ميدياويكي، عدلها في [https://translatewiki.net/ مشروع ترجمة الويكي].",
-       "translateinterface": "من أجل إضافة أو تعديل ترجمات في كل مشاريع الويكي يرجى استخدم [https://translatewiki.net/ translatewiki.net]، مشروع ميدياويكي لترجمة الواجهة.",
+       "translateinterface": "من أجل إضافة أو تعديل ترجمات في كل مشاريع الويكي يرجى استخدام [https://translatewiki.net/ translatewiki.net]، مشروع ميدياويكي لترجمة الواجهة.",
        "cascadeprotected": "تمت حماية هذه الصفحة من التعديل لأنها مدمجة في {{PLURAL:$1||الصفحة التالية، والتي|الصفحتين التاليتين، واللتين|الصفحات التالية، والتي}} تم استعمال خاصية \"حماية الصفحات المدمجة\" {{PLURAL:$1||بها|بهما|بها}}:\n$2",
        "namespaceprotected": "لا تمتلك الصلاحية لتعديل الصفحات في نطاق '''$1'''.",
        "customcssprotected": "أنت لا تمتلك السماح لتعديل صفحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
        "login": "تسجيل الدخول",
        "login-security": "توكيد هويتك",
        "nav-login-createaccount": "دخول / إنشاء حساب",
-       "userlogin": "دخول / إنشاء حساب",
-       "userloginnocreate": "تسجيل الدخول",
        "logout": "تسجيل الخروج",
        "userlogout": "اخرج",
        "notloggedin": "غير مسجل للدخول",
        "userlogin-noaccount": "ليس لديك حساب؟",
        "userlogin-joinproject": "انضم إلى {{SITENAME}}",
-       "nologin": "ليس لديك حساب؟ '''$1'''.",
-       "nologinlink": "أنشئ حسابا",
        "createaccount": "أنشئ حسابا",
-       "gotaccount": "لديك حساب؟ '''$1'''.",
-       "gotaccountlink": "تسجيل الدخول",
-       "userlogin-resetlink": "نسيت تفاصيل الدخول؟",
        "userlogin-resetpassword-link": "نسيت كلمة مرورك؟",
        "userlogin-helplink2": "المساعدة في الدخول",
        "userlogin-loggedin": "أنت {{GENDER:$1|مسجل|مسجلة}} الدخول مسبقًا باسم $1. {{GENDER:$1|استخدم|استخدمي}} النموذج بالأسفل لتسجيل الدخول بحساب آخر.",
        "createaccountmail": "استخدم كلمة سر عشوائية مؤقتة وارسلها إلى عنوان البريد الإلكتروني المحدد أدناه",
        "createaccountmail-help": "يمكن استخدامه لإنشاء حساب لشخص آخر من دون معرفة كلمة المرور.",
        "createacct-realname": "الاسم الحقيقي (اختياري)",
-       "createaccountreason": "السبب:",
        "createacct-reason": "السبب",
        "createacct-reason-ph": "لماذا تقوم بإنشاء حساب آخر",
        "createacct-reason-help": "رسالة تظهر في سجل إنشاء الحسابات",
        "preview": "عرض مسبق",
        "showpreview": "أظهر معاينة",
        "showdiff": "عرض التغييرات",
-       "blankarticle": "<strong>تنبيه:</strong> الصفحة التي تريد إنشاءها فارغة. إذا نقرت \"{{int:savearticle}}\" ثانية فستنشأ الصفحة بدون محتوى.",
+       "blankarticle": "<strong>تنبيه:</strong> الصفحة التي تريد إنشاءها فارغة. إذا نقرت \"$1\" ثانية فستنشأ الصفحة بدون محتوى.",
        "anoneditwarning": "<strong>تحذير:</strong> أنت غير مسجل الدخول. عنوان الأيبي الخاص بك سيكون معروضا بشكل علني لو قمت بأي تعديلات. لو أنك <strong>[$1 سجلت الدخول]</strong> أو <strong>[$2 أنشأت حسابا]</strong>، فتعديلاتك ستنسب لاسم المستخدم الخاص بك، بالإضافة إلى فوائد أخرى.",
        "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
        "missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
-       "selfredirect": "<strong>تحذير:</strong> أنت تقوم بتحويل الصفحة إلى نفسها.\nربما حددت الهدف الخطأ للتحويلة أو أنك تقوم بتحرير الصفحة الخطأ.\n\nإذا نقرت على «{{int:savearticle}}» مرة أخرى، سيتم إنشاء التحويلة رغم الخطأ.",
+       "selfredirect": "<strong>تحذير:</strong> أنت تقوم بتحويل الصفحة إلى نفسها.\nربما حددت الهدف الخطأ للتحويلة أو أنك تقوم بتحرير الصفحة الخطأ.\n\nإذا نقرت على «$1» مرة أخرى، سيتم إنشاء التحويلة رغم الخطأ.",
        "missingcommenttext": "من فضلك أدخل تعليقا في الأسفل.",
-       "missingcommentheader": "<strong>تنبيه:</strong>  لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"{{int:savearticle}}\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
+       "missingcommentheader": "<strong>تنبيه:</strong>  لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"$1\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
        "summary-preview": "معاينة ملخص تحرير",
        "subject-preview": "معاينة الموضوع:",
        "previewerrortext": "حدث خطأ أثناء محاولة معاينة تغييراتك.",
        "readonlywarning": "<strong>تحذير: لقد أغلقت قاعدة البيانات للصيانة، لذلك لن تتمكن من حفظ التعديلات التي قمت بها حاليا.\nإذا رغبت بإمكانك أن تنسخ النص الذي تعمل عليه وتحفظه في ملف نصي إلى وقت لاحق.</strong>\n\nإداري النظام الذي أغلقها أعطى هذا التفسير: $1",
        "protectedpagewarning": "'''تحذير: تمت حماية هذه الصفحة حتى يمكن للمستخدمين ذوي الصلاحيات الإدارية فقط تعديلها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
        "semiprotectedpagewarning": "'''ملاحظة:''' هذه الصفحة محمية بحيث يمكن للمستخدمين المسجلين وحدهم تعديلها.",
-       "cascadeprotectedwarning": "<strong>تحذير:</strong> تمت حماية هذه الصفحة بحيث يستطيع المستخدمون ذوو الصلاحيات الإدارية فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
+       "cascadeprotectedwarning": "<strong>تحذير:</strong> تمت حماية هذه الصفحة بحيث يستطيع المستخدمون [[Special:ListGroupRights|ذوو صلاحيات محددة]] فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
        "titleprotectedwarning": "'''تحذير:  هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
        "templatesused": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه الصفحة:",
        "templatesusedpreview": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه المعاينة:",
        "post-expand-template-argument-warning": "'''تحذير:''' هذه الصفحة تحتوي على عامل قالب واحد على الأقل له حجم تمدد كبير جدا.\nهذه العوامل تم حذفها.",
        "post-expand-template-argument-category": "تجاوزات معطيات القوالب",
        "parser-template-loop-warning": "تم كشف حلقة قالب: [[$1]]",
+       "template-loop-category": "الصفحات بحلقات قالب",
+       "template-loop-category-desc": "الصفحة تحتوي على حلقة قالب، أي أن القالب يستدعي نفسه.",
        "parser-template-recursion-depth-warning": "تم تجاوز حد عمق فرد القوالب ($1)",
        "language-converter-depth-warning": "تم تخطي حد عمق محول اللغة ($1)",
        "node-count-exceeded-category": "تجاوزات تعداد العقد",
        "page_first": "الأولى",
        "page_last": "الأخيرة",
        "histlegend": "اختيار الفرق: علم على صناديق النسخ للمقارنة واضغط قارن بين النسخ المختارة أو الزر بالأسفل.<br />\nمفتاح: (الحالي) = الفرق مع النسخة الحالية\n(السابق) = الفرق مع النسخة السابقة، ط = تغيير طفيف",
-       "history-fieldset-title": "تصÙ\81Ø­ Ø§Ù\84تارÙ\8aØ®",
+       "history-fieldset-title": "اÙ\84بحث Ø¹Ù\86 Ø§Ù\84Ù\85راجعات",
        "history-show-deleted": "المحذوفة فقط",
        "histfirst": "الأقدم",
        "histlast": "الأحدث",
        "search-file-match": "(يطابق محتوى الملف)",
        "search-suggest": "أتقصد: $1",
        "search-rewritten": "نتائج البحث المشابه $1 معروضة. يمكنك بدل ذلك البحث عن $2.",
-       "search-interwiki-caption": "المشاريع الشقيقة",
+       "search-interwiki-caption": "نتائج من المشاريع الشقيقة",
        "search-interwiki-default": "نتائح من $1:",
        "search-interwiki-more": "(المزيد)",
        "search-interwiki-more-results": "المزيد من النتائج",
        "saveusergroups": "احفظ مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
        "userrights-groupsmember": "عضو في:",
        "userrights-groupsmember-auto": "عضو ضمني في:",
-       "userrights-groups-help": "يمكنك تغيير المجموعات التي ينتمي هذا المستخدم إليها:\n* يعني الصندوق المعلم أن المستخدم في هذه المجموعة.\n* يعني الصندوق غير المعلم أن المستخدم ليس في هذه المجموعة.\n* تعني علامة * عدم إمكانية إزالة المجموعة متى ما أضفتها، أو العكس.\n* تعن علامة # أنه يمكنك فقط تحديد تاريخ الانتهاء لهذه المجموعة؛ لكن لا يمكنك تقديمه بعد تحديده.",
+       "userrights-groups-help": "يمكنك تغيير المجموعات التي ينتمي هذا المستخدم إليها:\n* يعني الصندوق المعلم أن المستخدم ضمن هذه المجموعة.\n* يعني الصندوق غير المعلم أن المستخدم ليس في هذه المجموعة.\n* تعني علامة * عدم إمكانية إزالة المجموعة متى ما أضفتها أو العكس.\n* تعني علامة # أنه يمكنك فقط تحديد تاريخ الانتهاء لعضوية هذه المجموعة؛ لكن لا يمكنك تقديمه بعد تحديده.",
        "userrights-reason": "السبب:",
        "userrights-no-interwiki": "أنت لا تمتلك الصلاحية لتعديل صلاحيات المستخدمين على الويكيات الأخرى.",
        "userrights-nodatabase": "قاعدة البيانات $1 غير موجودة أو ليست محلية.",
        "userrights-expiry-options": "1 يوم:1 day,1 أسبوع:1 week,1 شهر:1 month,3 شهور:3 months,6 شهور:6 months,1 سنة:1 year",
        "userrights-invalid-expiry": "تاريخ انتهاء المجموعة \"$1\" غير صحيح.",
        "userrights-expiry-in-past": "تاريخ انتهاء المجموعة \"$1\" هو في الماضي.",
-       "userrights-cannot-shorten-expiry": "أنت لا يمكنك تقديم تاريخ الانتهاء للمجموعة \"$1\". فقط المستخدمون الذين يمتلكون السماح لإضافة وإزالة هذه المجموعة يمكنهم تقديم تواريخ الانتهاء.",
+       "userrights-cannot-shorten-expiry": "أنت لا يمكنك تقديم تاريخ الانتهاء لعضوية المجموعة \"$1\". فقط المستخدمون الذين يمتلكون السماح لإضافة وإزالة هذه المجموعة يمكنهم تقديم تواريخ الانتهاء.",
        "userrights-conflict": "تضارب في تغيير صلاحيات المستخدم! الرجاء مراجعة تغييراتك مجدّدا وتأكيدها.",
        "group": "المجموعة:",
        "group-user": "مستخدمون",
        "right-editsemiprotected": "تعديل الصفحات التي حمايتها \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "عدل طريقة محتوى صفحة",
        "right-editinterface": "تعديل واجهة المستخدم",
-       "right-editusercssjs": "تعديل ملفات CSS و JS للمستخدمين الآخرين",
        "right-editusercss": "تعديل ملفات CSS للمستخدمين الآخرين",
        "right-edituserjs": "تعديل ملفات جافاسكريبت للمستخدمين الآخرين",
        "right-editmyusercss": "تعديل ملفات CSS للمستخدم نفسه",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (راجع أيضا [[Special:NewPages|قائمة الصفحات الجديدة]])",
        "recentchanges-submit": "أظهر",
        "rcfilters-activefilters": "المرشحات النشطة",
+       "rcfilters-quickfilters": "وصلات سريعة",
+       "rcfilters-savedqueries-defaultlabel": "مرشحات محفوظة",
+       "rcfilters-savedqueries-rename": "أعد التسمية",
+       "rcfilters-savedqueries-setdefault": "حفظ كقيمة افتراضية",
+       "rcfilters-savedqueries-unsetdefault": "إزالة القيمة الافتراضية",
+       "rcfilters-savedqueries-remove": "أزل",
+       "rcfilters-savedqueries-new-name-label": "الاسم",
+       "rcfilters-savedqueries-apply-label": "أنشئ وصلة سريعة",
+       "rcfilters-savedqueries-cancel-label": "ألغ",
+       "rcfilters-savedqueries-add-new-title": "احفظ المتغيرات كوصلات سريعة",
        "rcfilters-restore-default-filters": "استرجاع المرشحات الافتراضية",
        "rcfilters-clear-all-filters": "مسح كل المرشحات",
        "rcfilters-search-placeholder": "رشح أحدث التغييرات (تصفح أو ابدأ الكتابة)",
        "rcfilters-invalid-filter": "مرشح غير صحيح",
        "rcfilters-empty-filter": "لا مرشحات فعالة. كل المساهمات معروضة.",
        "rcfilters-filterlist-title": "مرشحات",
+       "rcfilters-filterlist-whatsthis": "ما هذا؟",
+       "rcfilters-filterlist-feedbacklink": "تقديم مراجعات لمرشحات (بيتا) الجديدة",
        "rcfilters-highlightbutton-title": "التعليم على النتائج",
-       "rcfilters-highlightmenu-title": "اختر اللغة",
+       "rcfilters-highlightmenu-title": "اختر لونًا",
+       "rcfilters-highlightmenu-help": "اختر لونا للتعليم على هذه الخاصية",
        "rcfilters-filterlist-noresults": "لم يتم العثور على مرشحات",
+       "rcfilters-noresults-conflict": "لا نتائج تم العثور عليها لأن محددات البحث تعارض بعضها البعض",
+       "rcfilters-state-message-subset": "هذا المرشح ليس له تأثير لأن نتائجه متضمنة في {{PLURAL:$2|المرشح التالي|المرشحات التالية}} الأكثر عمومية (جرب التعليم لتمييزه): $1",
+       "rcfilters-state-message-fullcoverage": "اختيار كل المرشحات في مجموعة له نفس التأثير كاختيار لا شيء، لذا فهذا المرشح ليس له تأثير. المجموعة تتضمن: $1",
        "rcfilters-filtergroup-registration": "تسجيل المستخدم",
        "rcfilters-filter-registered-label": "مسجل",
        "rcfilters-filter-registered-description": "المحررون مسجلو الدخول.",
        "rcfilters-filter-unregistered-label": "غير مسجل",
        "rcfilters-filter-unregistered-description": "المحررون غير مسجلي الدخول.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "هذا المرشح يتعارض مع {{PLURAL:$2|مرشح الخبرة التالي|مرشحات الخبرة التالية}}، و {{PLURAL:$2|الذي يعطي|التي تعطي}} فقط المستخدمين المسجلين: $1",
        "rcfilters-filtergroup-authorship": "ملكية التعديلات",
        "rcfilters-filter-editsbyself-label": "تعديلاتك الشخصية",
-       "rcfilters-filter-editsbyself-description": "التعديلات بواسطتك.",
-       "rcfilters-filter-editsbyother-label": "اÙ\84تعدÙ\8aÙ\84ات بواسطة الآخرين",
-       "rcfilters-filter-editsbyother-description": "التعديلات المنشأة بواسطة المستخدمين الآخرين (ليس أنت).",
+       "rcfilters-filter-editsbyself-description": "مساهماتك الشخصية.",
+       "rcfilters-filter-editsbyother-label": "اÙ\84تغÙ\8aÙ\8aرات بواسطة الآخرين",
+       "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-user-experience-level-conflicts-unregistered": "مرشحات الخبرة تعطي فقط المستخدمين المسجلين، لذا فهذا المرشح يتعارض مع مرشح \"غير المسجلين\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "مرشح \"غير المسجلين\" يتعارض مع واحد أو أكثر من مرشحات الخبرة، والتي تعطي المستخدمين المسجلين فقط. المرشحات المتعارضة معلم عليها في مساحة المرشحات النشطة، بالأعلى.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "القادمون الجدد",
+       "rcfilters-filter-user-experience-level-newcomer-description": "أقل من 10 تعديلات و4 أيام من النشاط.",
+       "rcfilters-filter-user-experience-level-learner-label": "المتعلمون",
+       "rcfilters-filter-user-experience-level-learner-description": "خبرة أكثر من \"القادمين الجدد\" ولكن أقل من \"المستخدمين ذوي الخبرة\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "المستخدمون ذوو الخبرة",
+       "rcfilters-filter-user-experience-level-experienced-description": "أكثر من 30 يوما من النشاط و500 تعديل.",
        "rcfilters-filtergroup-automated": "المساهمات الأوتوماتيكية",
        "rcfilters-filter-bots-label": "بوت",
        "rcfilters-filter-bots-description": "التعديلات بواسطة الأدوات الأوتوماتيكية.",
        "rcfilters-filter-humans-label": "بشري (ليس بوت)",
        "rcfilters-filter-humans-description": "التعديلات بواسطة المحررين البشريين.",
+       "rcfilters-filtergroup-reviewstatus": "حالة المراجعة",
+       "rcfilters-filter-patrolled-label": "مراجعة",
+       "rcfilters-filter-patrolled-description": "التعديلات المعلم عليها كمراجعة.",
+       "rcfilters-filter-unpatrolled-label": "غير مراجعة",
+       "rcfilters-filter-unpatrolled-description": "التعديلات غير المعلم عليها كمراجعة.",
        "rcfilters-filtergroup-significance": "الأهمية",
        "rcfilters-filter-minor-label": "تعديلات طفيفة",
        "rcfilters-filter-minor-description": "التعديلات التي علم عليها المستخدم كطفيفة.",
        "rcfilters-filter-major-label": "التعديلات غير الطفيفة",
        "rcfilters-filter-major-description": "التعديلات غير المعلم عليها كطفيفة.",
+       "rcfilters-filtergroup-watchlist": "الصفحات في قائمة المراقبة",
+       "rcfilters-filter-watchlist-watched-label": "في قائمة المراقبة",
+       "rcfilters-filter-watchlist-watched-description": "التغييرات للصفحات في قائمة مراقبتك.",
+       "rcfilters-filter-watchlist-watchednew-label": "تغييرات قائمة المراقبة الجديدة",
+       "rcfilters-filter-watchlist-watchednew-description": "التغييرات التي حدثت على الصفحات التي تراقبها ولم تزرها منذ ذلك الحين.",
+       "rcfilters-filter-watchlist-notwatched-label": "ليس في قائمة المراقبة",
+       "rcfilters-filter-watchlist-notwatched-description": "كل شيء باستثناء التغييرات في صفحات قائمة مراقبتك.",
        "rcfilters-filtergroup-changetype": "نوع التغيير",
        "rcfilters-filter-pageedits-label": "تعديلات الصفحة",
        "rcfilters-filter-pageedits-description": "التعديلات لمحتوى الويكي، النقاشات، وصوفات التصنيفات....",
        "rcfilters-filter-categorization-description": "سجلات إضافة أو إزالة الصفحات من التصنيفات.",
        "rcfilters-filter-logactions-label": "الأفعال المسجلة",
        "rcfilters-filter-logactions-description": "الأفعال الإدارية، إنشاء الحسابات، حذف الصفحات، عمليات الرفع....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "مرشح \"التعديلات الطفيفة\" يتعارض مع مرشح واحد أو أكثر من مرشحات نوع التغيير، وذلك لأن بعض أنواع التغيير لا يمكن التعليم عليها ك\"طفيفة.\" المرشحات المتعارضة معلم عليها في مساحة المرشحات النشطة بالأعلى.",
+       "rcfilters-hideminor-conflicts-typeofchange": "بعض أنواع التغييرات لا يمكن التعليم عليها ك\"طفيفة،\" لذا فهذا المرشح يتعارض مع مرشحات نوع التغيير التالية: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "مرشح نوع التغيير هذا يتعارض مع مرشح \"التعديلات الطفيفة\". بعض أنواع التغييرات لا يمكن التعليم عليها ك\"طفيفة.\"",
+       "rcfilters-filtergroup-lastRevision": "آخر مراجعة",
+       "rcfilters-filter-lastrevision-label": "آخر مراجعة",
+       "rcfilters-filter-lastrevision-description": "أخر تعديل للصفحة.",
+       "rcfilters-filter-previousrevision-label": "نسخ سابقة",
+       "rcfilters-filter-previousrevision-description": "كل تعديلات الصفحة ما عدا التعديل الأخير.",
        "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
+       "rclistfromreset": "إعادة ضبط خيار التاريخ",
        "rclistfrom": "أظهر التغييرات بدء من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
        "rcshowhideminor-show": "أظهر",
        "rcshowhidecategorization": "$1 تصنيف الصفحات",
        "rcshowhidecategorization-show": "أظهر",
        "rcshowhidecategorization-hide": "أخف",
-       "rclinks": "أظهر آخر $1 تعديل في آخر $2 يوم<br />$3",
+       "rclinks": "أظهر آخر $1 تعديل في آخر $2 يوم",
        "diff": "فرق",
        "hist": "تاريخ",
        "hide": "أخف",
        "php-uploaddisabledtext": "رفع ملفات PHP معطل. من فضلك تحقق من إعدادات رفع الملفات.",
        "uploadscripted": "هذا الملف يضم كود HTML أو كود آخر يمكن أن يفسره متصفح الوب بطريقة خاطئة.",
        "upload-scripted-pi-callback": "لا يمكن رفع ملف يحتوي على تعليمة معالجة XML-stylesheet",
+       "upload-scripted-dtd": "لا يمكن رفع ملفات SVG التي تحتوي على إعلان DTD غير قياسي.",
        "uploaded-script-svg": "تم العثور على عنصر سكريبت \"$1\" في ملف الSVG المرفوع.",
        "uploaded-hostile-svg": "تم العثور على CSS غير آمن في عنصر الشكل في ملف الSVG المرفوع.",
        "uploaded-event-handler-on-svg": "ضبط سمات معالج الأحداث <code>$1=\"$2\"</code> غير مسموح به في ملفات SVG.",
        "enotif_body_intro_moved": "صفحة {{SITENAME}} $1 {{GENDER:$2|نقلها|نقلتها}} $2 في $PAGEEDITDATE. لمشاهدة النسخة الحالية راجع $3.",
        "enotif_body_intro_restored": "صفحة {{SITENAME}} $1 {{GENDER:$2|استرجعها|استرجعتها}} $2 في $PAGEEDITDATE. لمشاهدة النسخة الحالية راجع $3.",
        "enotif_body_intro_changed": "صفحة {{SITENAME}} $1 {{GENDER:$2|عدلها|عدلتها}} $2 في $PAGEEDITDATE. لمشاهدة النسخة الحالية راجع $3.",
-       "enotif_lastvisited": "انظر $1 لكل التغييرات منذ زيارتك الأخيرة.",
-       "enotif_lastdiff": "انظر $1 لرؤية هذا التغيير.",
+       "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",
        "created": "أنشئت",
        "editcomment": "ملخص التعديل كان:<em>$1</em>.",
        "revertpage": "استرجع تعديلات [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]]) حتى آخر مراجعة ل[[User:$1|$1]]",
        "revertpage-nouser": "استرجع تعديلات مستخدم مخفي حتى آخر مراجعة ل{{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "استرجع ØªØ¹Ø¯Ù\8aÙ\84ات {{GENDER:$3|$1}}Ø\9b\nاسترجع حتى آخر نسخة بواسطة {{GENDER:$4|$2}}.",
+       "rollback-success": "تÙ\85 Ø§Ø³ØªØ±Ø¬Ø§Ø¹ ØªØ¹Ø¯Ù\8aÙ\84ات {{GENDER:$3|$1}}Ø\8c حتى آخر نسخة بواسطة {{GENDER:$4|$2}}.",
        "rollback-success-notify": "تم استرجاع التعديلات بواسطة $1;\nتم التغيير إلى آخر مراجعة بواسطة $2. [$3 عرض التغييرات]",
        "sessionfailure-title": "فشل في الجلسة",
        "sessionfailure": "يبدو أنه هناك مشكلة في جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.",
        "undeleteviewlink": "اعرض",
        "undeleteinvert": "اعكس الاختيار",
        "undeletecomment": "السبب:",
-       "undeletedrevisions": "تم استرجاع {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلا|$1 تعديل}}",
-       "undeletedrevisions-files": "أسترجعت {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}}  و{{PLURAL:$2||ملف واحد|ملفان|$2 ملفات|$2 ملفًا|$2 ملف}}",
-       "undeletedfiles": "أسترجع {{PLURAL:$1||ملف واحد|ملفان|$1 ملفات|$1 ملفًا|$1 ملف}}",
        "cannotundelete": "بعض أو كل عملية الاسترجاع فشلت:\n$1",
        "undeletedpage": "'''تم استرجاع $1'''\n\nراجع [[Special:Log/delete|سجل الحذف]] لمعاينة عمليات الحذف والاسترجاعات الحديثة.",
        "undelete-header": "انظر الصفحات المحذوفة حديثا في [[Special:Log/delete|سجل الحذف]].",
        "sp-contributions-uploads": "مرفوعات",
        "sp-contributions-logs": "سجلات",
        "sp-contributions-talk": "نقاش",
-       "sp-contributions-userrights": "إدارة صلاحيات المستخدم",
+       "sp-contributions-userrights": "إدارة صلاحيات {{GENDER:$1|المستخدم|المستخدمة}}",
        "sp-contributions-blocked-notice": "هذا المستخدم ممنوع حاليا.\nإن آخر مدخلة في سجل المنع موجودة أدناه كمرجع:",
        "sp-contributions-blocked-notice-anon": "عنوان الأيبي هذا ممنوع حاليا.\nآخر مدخلة لسجل المنع معروضة هنا كمرجع:",
        "sp-contributions-search": "بحث عن مساهمات",
        "unblocked-id": "منع $1 تم رفعه",
        "unblocked-ip": "تم رفع المنع عن [[Special:Contributions/$1|$1]].",
        "blocklist": "المستخدمون الممنوعون",
+       "autoblocklist": "منع تلقائي",
+       "autoblocklist-submit": "بحث",
+       "autoblocklist-legend": "قائمة المنع التلقائي",
+       "autoblocklist-localblocks": "{{PLURAL:$1|المنع التلقائي المحلي|عمليات المنع التلقائي المحلية}}",
+       "autoblocklist-empty": "قائمة المنع التلقائي فارغة.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|المنع التلقائي الآخر|عمليات المنع التلقائي الأخرى}}",
        "ipblocklist": "المستخدمون الممنوعون",
        "ipblocklist-legend": "إيجاد مستخدم ممنوع",
        "blocklist-userblocks": "أخفِ منع الحسابات",
        "blocklist-timestamp": "الزمن",
        "blocklist-target": "الهدف",
        "blocklist-expiry": "ينتهي في",
-       "blocklist-by": "حظر Ø§Ù\84Ù\85شرÙ\81",
+       "blocklist-by": "اÙ\84إدارÙ\8a Ø§Ù\84Ù\85اÙ\86ع",
        "blocklist-params": "معطيات المنع",
        "blocklist-reason": "السبب",
        "ipblocklist-submit": "بحث",
        "export-download": "احفظ كملف",
        "export-templates": "ضمن القوالب",
        "export-pagelinks": "ضمن الصفحات الموصولة إلى عمق:",
-       "export-manual": "اضاÙ\81Ø© ØµÙ\81حة Ù\8aدÙ\88Ù\8a:",
+       "export-manual": "اضاÙ\81Ø© ØµÙ\81حات Ù\8aدÙ\88Ù\8aا:",
        "allmessages": "رسائل النظام",
        "allmessagesname": "الاسم",
        "allmessagesdefault": "النص الافتراضي",
        "tooltip-pt-anonuserpage": "صفحة المستخدم للأيبي الذي تقوم بالتحرير من خلاله",
        "tooltip-pt-mytalk": "صفحة {{GENDER:|نقاشك}}",
        "tooltip-pt-anontalk": "نقاش حول التعديلات من عنوان الأيبي هذا",
-       "tooltip-pt-preferences": "{{GENDER:|Your}} تفضيلاتي",
+       "tooltip-pt-preferences": "تفضيلاتك",
        "tooltip-pt-watchlist": "قائمة الصفحات التي تراقب التغييرات التي تحدث بها",
-       "tooltip-pt-mycontris": "قائمة{{GENDER:|your}}  مساهماتك",
+       "tooltip-pt-mycontris": "قائمة مساهمات{{GENDER:|ك}}",
        "tooltip-pt-anoncontribs": "قائمة بتعديلات قام بها عنوان الآي بي",
        "tooltip-pt-login": "يفضل أن تسجل الدخول، لكنه ليس إلزاميا.",
+       "tooltip-pt-login-private": "عليك تسجيل الدخول لاستخدام هذه الويكي.",
        "tooltip-pt-logout": "تسجيل الخروج",
        "tooltip-pt-createaccount": "نشجعك على عمل حساب وتسجيل دخولك; لكنه غير ضروري على اي حال",
        "tooltip-ca-talk": "نقاش عن صفحة المحتوى",
        "tooltip-t-recentchangeslinked": "أحدث التغييرات في الصفحات الموصولة من هذه الصفحة",
        "tooltip-feed-rss": "تلقيم أر إس إس لهذه الصفحة",
        "tooltip-feed-atom": "تلقيم أتوم لهذه الصفحة",
-       "tooltip-t-contributions": "رؤية قائمة مساهمات {{GENDER:$1|this user}}",
+       "tooltip-t-contributions": "رؤية قائمة مساهمات {{GENDER:$1|هذا المستخدم|هذه المستخدمة}}",
        "tooltip-t-emailuser": "أرسل رسالة {{GENDER:$1|لهذا المستخدم|لهذه المستخدمة}}",
        "tooltip-t-info": "المزيد من المعلومات عن هذه الصفحة",
        "tooltip-t-upload": "ارفع ملفات",
        "markedaspatrollederror": "لا يمكن التعليم بالمراجعة",
        "markedaspatrollederrortext": "يجب عليك اختيار المراجعة التي تريد أن تشير أنها مراجعة",
        "markedaspatrollederror-noautopatrol": "لا يجوز لك تعليم تغييراتك الشخصية بعلامة المراجعة.",
-       "markedaspatrollednotify": "هذا التغيير لـ $1  تم تعليمه كمراقب.",
+       "markedaspatrollednotify": "هذا التغيير لـ $1  تم تعليمه كمراجَع.",
        "markedaspatrollederrornotify": "لم ينجح وسم هذه النسخة بأنها مراجعة",
        "patrol-log-page": "سجل الخفر",
        "patrol-log-header": "هذا سجل بالمراجعات المراجعة.",
        "newimages-summary": "هذه الصفحة الخاصة تعرض آخر الملفات المرفوعة.",
        "newimages-legend": "المرشح",
        "newimages-label": "اسم الملف (أو جزء منه):",
+       "newimages-user": "عنوان الأيبي أو اسم المستخدم",
        "newimages-showbots": "أظهر التحميلات بواسطة البوتات",
        "newimages-hidepatrolled": "أخف المرفوعات المنظورة",
        "noimages": "لا شيء للعرض.",
        "confirmrecreate-noreason": "{{GENDER:$1|حذف المستخدم|حذفت المستخدمة}} [[User:$1|$1]] ([[User talk:$1|نقاش]]) هذه الصفحة بعد أن بدأت أنت بتحريرها. الرجاء التأكد من أنك تريد إعادة إنشاء هذه الصفحة.",
        "recreate": "إعادة إنشاء",
        "unit-pixel": "بك",
+       "confirm-purge-title": "مسح كاش هذه الصفحة",
        "confirm_purge_button": "موافق",
        "confirm-purge-top": "امسح مختزن هذه الصفحة؟",
        "confirm-purge-bottom": "إفراغ مختزن الصفحة يمحو المختزن ويجبر أحدث نسخة على الظهور.",
        "htmlform-user-not-valid": "اسم المستخدم <strong>$1</strong> غير صالح.",
        "logentry-delete-delete": "{{GENDER:$2|حذف|حذفت}} $1 صفحة $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|حذف|حذفت}} التحويلة $3 بواسطة إعادة الكتابة",
-       "logentry-delete-restore": "{{GENDER:$2|استرجع|استرجعت}} $1 صفحة $3",
+       "logentry-delete-restore": "{{GENDER:$2|استرجع|استرجعت}} $1 الصفحة $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|استرجع|استرجعت}} الصفحة $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 مراجعة|$1 مراجعة}}",
+       "restore-count-files": "{{PLURAL:$1||ملف واحد|ملفان|$1 ملفات|$1 ملفًا|$1 ملف}}",
        "logentry-delete-event": "{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} في سجل $3: $4",
        "logentry-delete-revision": "غيّر{{GENDER:$2||ت}} $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4",
        "logentry-delete-event-legacy": "{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية رؤية أحداث في سجل $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|حدث|حدثت}} الوسوم للمراجعة $4 للصفحة $3 ({{PLURAL:$7|أضاف}} $6; {{PLURAL:$9|أزال}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|حدث|حدثت}} الوسوم على مدخلة السجل $5 للصفحة $3 ({{PLURAL:$7|أضاف}} $6; {{PLURAL:$9|أزال}} $8)",
        "rightsnone": "(لا شيء)",
-       "revdelete-summary": "ملخص التعديل",
        "rightslogentry-temporary-group": "$1 (مؤقت، حتى $2)",
        "feedback-adding": "إضافة تعليقات إلى الصفحة...",
        "feedback-back": "رجوع",
        "mediastatistics": "إحصاءات الميديا",
        "mediastatistics-summary": "إحصاءات عن أنماط الملفات المرفوعة، وتشمل أحدث نسخة من الملف فقط، حيث تستبعد النسخ القديمة أو المحذوفة من الملفات.",
        "mediastatistics-nbytes": "{{PLURAL:$1|بايت واحد|بايتان اثنان|$1 بايتات|$1 بايتاً|$1 بايت}} ($2; $3%)",
-       "mediastatistics-bytespertype": "اÙ\84حجÙ\85 Ø§Ù\84Ù\83Ù\84Ù\8a Ù\84Ù\83Ù\84 Ø§Ù\84Ù\85Ù\84Ù\81ات: {{PLURAL:$1|باÙ\8aت$1|$1 Ø¨Ø§Ù\8aت}}($2; $3%).",
+       "mediastatistics-bytespertype": "إجÙ\85اÙ\84Ù\8a Ø­Ø¬Ù\85 Ø§Ù\84Ù\85Ù\84Ù\81ات Ù\84Ù\87ذا Ø§Ù\84Ù\82سÙ\85: {{PLURAL:$1|باÙ\8aت$1|$1 Ø¨Ø§Ù\8aت}} ($2; $3%).",
        "mediastatistics-allbytes": "الحجم الكلي لكل الملفات: {{PLURAL:$1|$1 بايت}} ($2).",
        "mediastatistics-table-mimetype": "نوع MIME",
        "mediastatistics-table-extensions": "الامتدادات الممكنة",
        "special-characters-group-thai": "تايلندية",
        "special-characters-group-lao": "لاوية",
        "special-characters-group-khmer": "خميرية",
+       "special-characters-group-canadianaboriginal": "كندي أصلي",
        "special-characters-title-endash": "واصلة قصيرة",
        "special-characters-title-emdash": "واصلة طويلة",
        "special-characters-title-minus": "علامة الطرح",
        "mw-widgets-titleinput-description-redirect": "تحويل إلى $1",
        "mw-widgets-categoryselector-add-category-placeholder": "أضف تصنيفا...",
        "mw-widgets-usersmultiselect-placeholder": "أضف المزيد...",
+       "date-range-from": "من تاريخ:",
+       "date-range-to": "حتى تاريخ:",
        "sessionmanager-tie": "لا يمكن جمع أنواع استيثاق متعددة: $1.",
        "sessionprovider-generic": "جلسات $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "جلسات قائمة على ملفات تعريف الارتباط (كوكيز)",
        "restrictionsfield-label": "نطاقات الأيبي المسموح بها:",
        "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم:\n<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "المراجعة $1",
-       "pageid": "معرف الصفحة $1"
+       "pageid": "معرف الصفحة $1",
+       "rawhtml-notallowed": "لا يمكن استخدام وسوم &lt;html&gt; خارج الصفحات العادية.",
+       "gotointerwiki": "ترك {{SITENAME}}",
+       "gotointerwiki-invalid": "العنوان المحدد كان غير صحيح.",
+       "gotointerwiki-external": "أنت على وشك ترك {{SITENAME}} لزيارة [[$2]] والذي هو موقع منفصل.\n\n[$1 اضغط هنا للاستمرار إلى $1].",
+       "undelete-cantedit": "أنت لا يمكنك استرجاع هذه الصفحة حيث أنه لا يمكنك تعديل هذه الصفحة.",
+       "undelete-cantcreate": "أنت لا يمكنك استرجاع هذه الصفحة حيث أنه لا توجد صفحة بهذا الاسم وأنت غير مسموح لك بإنشاء هذه الصفحة."
 }
index 8d20e95..d9d99e7 100644 (file)
        "userlogin-signwithsecure": "ܐܚܫܚ ܕܒܝܩܘܬܐ ܡܫܝܢܢܬܐ",
        "login": "ܥܘܠ",
        "nav-login-createaccount": "ܥܘܠ / ܒܪܝ ܚܘܫܒܢܐ",
-       "userlogin": "ܥܘܠ / ܒܪܝ ܚܘܫܒܢܐ",
-       "userloginnocreate": "ܥܘܠ",
        "logout": "ܦܠܘܛ",
        "userlogout": "ܦܠܘܛ",
        "notloggedin": "ܠܝܬܝܟ ܥܠܝܠܐ",
        "userlogin-noaccount": "ܠܝܬ ܠܟ ܚܘܫܒܢܐ؟",
        "userlogin-joinproject": "ܢܩܦ ܥܡ {{SITENAME}}",
-       "nologin": "ܠܝܬ ܠܟ ܚܘܫܒܢܐ؟ '''$1'''.",
-       "nologinlink": "ܒܪܝ ܚܘܫܒܢܐ",
        "createaccount": "ܒܪܝ ܚܘܫܒܢܐ",
-       "gotaccount": "ܐܝܬ ܠܟ ܚܘܫܒܢܐ؟ '''$1'''.",
-       "gotaccountlink": "ܥܘܠ",
-       "userlogin-resetlink": "ܐܬܢܫܝܬ ܝܕ̈ܥܬܐ ܕܥܠܠܐ؟",
        "userlogin-resetpassword-link": "ܢܫܬ ܡܠܬܐ ܕܥܠܠܐ؟",
        "createacct-emailrequired": "ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ",
        "createaccountmail": "ܐܦܠܚ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܢܝܬܐ ܘܫܕܪ ܠܗ ܥܠ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܬܘܚܡܐ ܠܬܚܬ",
-       "createaccountreason": "ܥܠܬܐ",
        "createacct-submit": "ܒܪܝ ܚܘܫܒܢܐ ܕܝܠܟ",
        "createacct-benefit-heading": "ܝܬܒܐ ܕ{{SITENAME}} ܐܣܬܝܡ ܒܝܕ ܐܢܫ̈ܐ ܐܟܘܬܟ.",
        "createacct-benefit-body1": "{{PLURAL:$1|ܫܘܚܠܦܐ|ܫܘܚܠܦ̈ܐ}}",
        "prefs-rendering": "ܐܣܟܝܡܐ",
        "saveprefs": "ܠܒܘܟ",
        "prefs-editing": "ܫܚܠܦܬܐ",
-       "rows": "ܨ̈ܦܐ",
-       "columns": "ܥܡܘܕ̈ܐ:",
        "searchresultshead": "ܒܨܝ",
        "recentchangesdays": "ܝܘܡܬ̈ܐ ܠܚܙܝܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ:",
        "recentchangescount": "ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ ܠܚܙܝܐ ܪܫܐܝܬ:",
        "rcshowhidemine": "$1 ܫܘܚܠܦ̈ܝ",
        "rcshowhidemine-show": "ܚܘܝ",
        "rcshowhidemine-hide": "ܛܫܝ",
-       "rclinks": "ܚܘܝ $1 ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ ܒ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ<br />$3",
+       "rclinks": "ܚܘܝ $1 ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ ܒ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ",
        "diff": "ܦܘܪܫܐ",
        "hist": "ܬܫܥܝܬܐ",
        "hide": "ܛܫܝ",
        "undeleteviewlink": "ܚܙܝ",
        "undeleteinvert": "ܐܗܦܟ ܠܓܘܒܝܐ",
        "undeletecomment": "ܥܠܬܐ:",
-       "undeletedrevisions": "{{PLURAL:$1|1 ܬܢܝܬܐ|$1 ܬܢܝܬ̈ܐ}} ܐܦܢܝܬ",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 ܬܢܝܬܐ|$1 ܬܢܝܬ̈ܐ}} and {{PLURAL:$2|1 ܠܦܦܐ|$2 ܠܦܦܐ}} ܐܦܢܝܬ",
-       "undeletedfiles": "{{PLURAL:$1|1 ܠܦܦܐ|$1 ܠܦܦ̈ܐ}} ܐܦܢܝܬ",
        "undelete-header": "ܚܙܝ [[Special:Log/delete|ܣܓܠܐ ܕܫܝܦܐ]] ܠܚܙܝܐ ܕܦܐܬܬ̈ܐ ܫܝܦܬ̈ܐ ܚܕ̈ܬܬܐ.",
        "undelete-search-title": "ܒܨܝ ܦܐܬܬ̈ܐ ܫܝܦܬ̈ܐ",
        "undelete-search-box": "ܒܨܝ ܦܐܬܬ̈ܐ ܫܝܦܬ̈ܐ",
        "logentry-newusers-create2": "ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $3 {{GENDER:$2|ܐܬܬܟܝܢ}} ܒܝܕ $1",
        "logentry-newusers-autocreate": "ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 {{GENDER:$2|ܐܬܬܣܝܡ}} ܝܬܐܝܬ",
        "rightsnone": "(ܠܐ ܡܕܡ)",
-       "revdelete-summary": "ܫܚܠܦ ܦܣܝܩܬ̈ܐ",
        "feedback-cancel": "ܒܛܘܠ",
        "feedback-message": "ܐܓܪܬܐ:",
        "feedback-subject": "ܡܠܘܐܐ:",
index 44b0f68..ad5a6d3 100644 (file)
        "yourpasswordagain": "Rüf feypinge nülawe:",
        "login": "Konkülen",
        "nav-login-createaccount": "konkülen/dewman konün",
-       "userlogin": "Konkülen/dewman konün",
-       "userloginnocreate": "Konün",
        "logout": "Tripan",
        "userlogout": "Tripan",
        "notloggedin": "Petu konlaymi.",
-       "nologin": "Nielaymi kiñe konün? $1.",
-       "nologinlink": "Dewmafinge konün",
        "createaccount": "Dewmafinge konün",
-       "gotaccount": "Dew nieymi konün? $1.",
-       "gotaccountlink": "Konün",
-       "userlogin-resetlink": "Ngoyüniengetuymi chumngechi konün?",
-       "createaccountreason": "Dungu:",
        "mailmypassword": "Amulün we nülawe werküwe mew",
        "loginlanguagelabel": "Cezugun: $1",
        "pt-login": "Konkülen",
        "rcshowhideanons": "$1 üyngenulu kellufe",
        "rcshowhidepatr": "$1 pukintulu kalekünun",
        "rcshowhidemine": "$1 tañi wirin",
-       "rclinks": "Adkintun doy we $1 kalekünun, tunte $2 antü mew<br />$3",
+       "rclinks": "Adkintun doy we $1 kalekünun, tunte $2 antü mew",
        "diff": "Kalelu",
        "hist": "rupañ",
        "hide": "Ellkan",
index 79fc096..3a68038 100644 (file)
@@ -6,7 +6,9 @@
                        "아라",
                        "Amire80",
                        "GeekEmad",
-                       "Macofe"
+                       "Macofe",
+                       "Mekakem",
+                       "Vikoula5"
                ]
        },
        "tog-underline": "تسطار الوصيلات:",
@@ -24,6 +26,7 @@
        "tog-watchdefault": "زيد الـصفحات و الـفيشيّات اللي نبدّلها فل قايمة تاع الـتتباع تاعي",
        "tog-watchmoves": "زيد الـصفحات و الـفيشيات اللي نحوّلها فل قايمة تاع الـتباع تاعي",
        "tog-watchdeletion": "زيد الـصفحات اللي نفصيها فل قايمة تاع التتباع تاعي",
+       "tog-watchuploads": "زيد الدوسيّات الجديدة الّي امبورتيتها لل ليستة تاعي تاع المتابعة",
        "tog-watchrollback": "بيّن فل ليستة تاع المتابعة تاعي، الصفحات الّي كنت أنا سترجعتها.",
        "tog-minordefault": "ماركي كل التبديلات بلي راهي خفيفه",
        "tog-previewontop": "ورّي نضرة قبليّة تاع واش يصرا، فوق الجيهة تاع التبدال",
@@ -33,7 +36,7 @@
        "tog-enotifminoredits": "ابعت لي بريه حتا يلا كانت تبدالات صغيرة فلباجات و الـفيشيّات",
        "tog-enotifrevealaddr": "بين لادريستي إلكترونيك في براوات الاعلام",
        "tog-shownumberswatching": "بين شحال كاين من مستعمل يتبع الباجه",
-       "tog-oldsig": "خطّ‘لـيدّ اللي كاين",
+       "tog-oldsig": "خطّ‘ اليدّ تاعك الي كاين:",
        "tog-fancysig": "اعتبر التوقيع كي كتيبه ويكي (بلا وصيله توماتيك)",
        "tog-uselivepreview": "استعمل الشوفة الخفيفة",
        "tog-forceeditsummary": "نبّهني كي تندخل كاش صفحة خاوية",
@@ -50,7 +53,7 @@
        "tog-showhiddencats": "ورّي الـفصلات الـمخبّيين",
        "tog-norollbackdiff": "ما تورّيش الـفروق كي تدير رجوع",
        "tog-useeditwarning": "نبّهني كي نخرج من صفحة كنت نكتب فيها بلا ما نعمّر الخدمة",
-       "tog-prefershttps": "نستعمل دايمن توصال مأمون كي ندخل",
+       "tog-prefershttps": "استعمل دايمن توصال مأمون كي تدخُل",
        "underline-always": "ديما",
        "underline-never": "ابدا",
        "underline-default": "الـقيمة الـعاديّة تاع الـواجهة و الـفلّاك",
        "category-file-count-limited": "{{PLURAL:$1|الملف التابع مصنّف|الملفات الـ $1 التابعة مصنّفة}} ب هاذ التصنيف.",
        "listingcontinuesabbrev": "يُتبع",
        "index-category": "صفحات مفهّرسة",
-       "noindex-category": "باجات Ù\85Ø´Ù\8a Ù\85Ù\81Ù\87رسÙ\87",
+       "noindex-category": "باجات Ù\85اشÙ\8a Ù\85Ù\81Ù\87رسة",
        "broken-file-category": "صفحات فيها وصيلات تاع ملفّات خاسرة",
        "about": "على هاذ الويكي",
        "article": "صفحة تاع محتوى",
        "newwindow": "(حل في تاقة جديدة)",
        "cancel": "انيلي",
        "moredotdotdot": "كتر...",
-       "morenotlisted": "هاد الليستة ما راهيش مكمولة",
+       "morenotlisted": "هاد الليستة بالاك ما راهيش مكمولة",
        "mypage": "باجه",
        "mytalk": "تقرعيج",
        "anontalk": "تقرعيج",
        "tagline": "من {{SITENAME}}",
        "help": "معاونة",
        "search": "فتّش",
+       "search-ignored-headings": " #<!-- خلّي هاد السطَر كيما راه --> <pre>\n# العلاون الّي غادي يتينيوراو ف` التفتاش.\n# التبدالات غادي يبانو غير كي تتفهرس الباجة الي فيها الترويسات.\n# تنجم تفورصي الباجة باش تعاود التفهريص، ل هاد الشي، تنجم تدير تبدال خاوي.\n# الكتيبة تكون كيما هاك:\n#   * كلّ حاجة تكون مكتوبة بعد حتا ل` السطر التالي غادي ينتعد بلّي تعليق.\n#   * كلّ سطر ما يكونش فارغ غادي يتعد هوّا ب` الدات العلوان الّي غادي يتّنسا، ب` الحرف و الشكل.\nمراجع\nوصلات برّانيّة\nشوف تاني\n #</pre> <!-- خلّي هاد السطر كيما راه -->",
        "searchbutton": "فتّش",
        "go": "شايع",
        "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": "شوف الباجة تاع الفيشي",
        "viewhelppage": "شوف الباجة تاع المعاونة",
        "categorypage": "شوف الباجة تاع الصنيف",
        "viewtalkpage": "شوف التقرعيج",
-       "otherlanguages": "ب لوغات اخرين",
+       "otherlanguages": "ب لوغات وحدخرين",
        "redirectedfrom": "(محول من $1)",
        "redirectpagesub": "باجة تاع التحوال",
        "redirectto": "حوّل لـ:",
        "missingarticle-rev": "(رقم الفرسيون: $1)",
        "missingarticle-diff": "(فرق بين: $1، $2)",
        "readonly_lag": "الدخيرة تاع الخبرات راهي مقفولة بيدما السربايات التوناويّة يلحقو التوخار الّي عندهم معا السرباي اللولاني",
+       "nonwrite-api-promise-error": "الرويصة HTTP 'Promise-Non-Write-API-Action' راهي انبعتت، بصّح المطلب راه ندار ل مودول تاع كتبة تاع الـ API.",
        "internalerror": "غلطة دخلانيّة",
        "internalerror_info": "غلطة دخلانيّة: $1",
        "internalerror-fatal-exception": "غلطة واعرة من الطبَع \"$1\"",
        "viewsource": "شوف الاصل",
        "viewsource-title": "شوف المصدر تاع $1",
        "actionthrottled": "الفعل راه محبّس",
-       "actionthrottledtext": "باش Ù\86حرزÙ\88 Ù\85Ù\86 Ø§Ù\84سباÙ\85Ø\8c Ù\85ا Ù\8aÙ\85Ù\83Ù\86Ø´ ØªØ¯Ù\8aر Ù\87اد Ø§Ù\84Ù\81عÙ\84 Ø¨Ø²Ù\91اÙ\81 Ø§Ù\84Ù\85رات Ù\81Ù\8a Ù\85دÙ\91Ø© ØªØ§Ø¹ Ù\88Ù\82ت Ù\82صÙ\8aرØ\8c Ù\88 Ø±Ø§Ù\83 Ø¶Ø±Ù\83ا فتّ هذا الحد.\nمن فضلك عاود سيّي منّا على شي دقايق.",
+       "actionthrottledtext": "باش Ù\86حرزÙ\88 Ù\85Ù\86 Ø§Ù\84تخسارØ\8c Ù\85ا Ù\8aÙ\85Ù\83Ù\86Ø´ Ù\8aÙ\86دار Ù\87اد Ø§Ù\84Ù\81عÙ\84 Ù\83تر Ù\85Ù\86 Ø´Ù\8a Ù\85رÙ\91ات Ù\81Ù\8a Ù\85دÙ\91Ø© ØªØ§Ø¹ Ù\88Ù\82ت Ù\82صÙ\8aرØ\8c Ù\88 Ø±Ø§Ù\83 Ù\86تا فتّ هذا الحد.\nمن فضلك عاود سيّي منّا على شي دقايق.",
        "protectedpagetext": "هاد الصفحة راهي تنحضات باش ما تتبدّلش ولا شي حاجاخرة.",
-       "viewsourcetext": "تنجم تشوف ولا تنسّح المصدر تاع هاد الصفحة:",
-       "viewyourtext": "تÙ\86جÙ\85 ØªØ´Ù\88Ù\81 Ù\88 ØªÙ\86سÙ\91Ø® Ø§Ù\84Ù\85صدر ØªØ§Ø¹ <strong>اÙ\84تبداÙ\84ات ØªØ§Ø¹Ù\83</strong> Ù\81 Ù\87اد Ø§Ù\84صÙ\81حة:",
+       "viewsourcetext": "تنجم تشوف و تنسّح المضمون تاع هاد الصفحة.",
+       "viewyourtext": "تÙ\86جÙ\85 ØªØ´Ù\88Ù\81 Ù\88 ØªÙ\86سÙ\91Ø® Ø§Ù\84Ù\85ضÙ\85Ù\88Ù\86 ØªØ§Ø¹ <strong>اÙ\84تبداÙ\84ات ØªØ§Ø¹Ù\83</strong> Ù\81 Ù\87اد Ø§Ù\84صÙ\81حة.",
        "protectedinterface": "هاد الباجة توفّر لك وريشة (interface) تاع كتابة مديورة لل صوفتوار الّي ف هاد الويكي، و راهي مأمّنة باش تنحضا من الضرارات.\nباش تزيد ولا تبدّل طرجمات ل كامل الويكيّات، من فضلك استعمل [https://translatewiki.net/ translatewiki.net] المشروع ميدياويكي تاع التبلادات.",
        "editinginterface": "<strong>ردّ بالك:</strong>راك تبدّل صفحة الّمديورة باش تصنع النصّ تاع الواجهة تاع اللوجيسيال. التبدالات على هاد الصفحة غادي يوتّرو على الشكَل تاع الواجهة حتا عند المستعمليين لخرين.",
        "translateinterface": "باش تزيد ولا تبدّل الطرجمات ل كامل الويكيّات، استعمل [https://translatewiki.net/ translatewiki.net]، المشروع تاع التبلاد تاع الميديويكي.",
-       "cascadeprotected": "الپاجة هادي راهي محضيّة من التبدال خاطرش راهي مضمونة فل {{PLURAL:$1|باجة|باجات}} هادي الّي بداتها محضيّة بل خاصيّة تاع \"احضي تاني الپاجات المضمونة\":$2.",
+       "cascadeprotected": "الپاجة هادي راهي محضيّة من التبدال خاطرش راهي مضمونة ف` {{PLURAL:$1|الباجة|الباجات}} هادي الّي بداتها محضيّة ب` الخاصيّة تاع \"احضي تاني الپاجات المضمونة\":$2.",
        "namespaceprotected": "ما عندكش الحقّ باش تبدّل الپاجات الّي بل وسَع تاع التسميّة <strong>$1</strong>.",
        "customcssprotected": "ما عندكش السراح باش تبدّل الپاجة css هادي خاطرش راه مكمون فيها شي توجادات شخصيّة تاع مستعملي وحداخُر.",
        "customjsprotected": "ما عندكش السراح باش تبدّل الپاجة جافاسكريبت هادي خاطرش راه مكمون فيها شي توجادات شخصيّة تاع مستعملي وحداخُر.",
        "mypreferencesprotected": "ما عندكش السراح باش تبدّل الإختيّارات ديالك.",
        "ns-specialprotected": "الپاجات الخصيصة ما تنجمش تتبدّل.",
        "titleprotected": "[[User:$1|$1]] {{GENDER:$1|حمى|حمات}} هاذ العنوان م الخلقان.\nالسبّة تاعو هيّ <em>$2</em>.",
-       "filereadonlyerror": "ماشي ممكن تبدال الفيشي \"$1\" خاطرش الزمّام \"$2\" راه مشغّلة فيه الخاصيّة \"اقرا برك\".\n\nالموسيّر الّي غلقهُ راه ماد التفسير هادا: \"$3\".",
+       "filereadonlyerror": "ماشي ممكن تبدال الفيشي \"$1\" خاطر الدوسي تاع الفيشيّات \"$2\" راه فيه الخاصيّة \"اقرا برك\".\n\nالموسيّر الّي غلقهُ راه ماد التفسير هادا: \"$3\".",
        "invalidtitle-knownnamespace": "علوان ماشي مقبول ب وسَع تاع تسميّة \"$2\" معا الكتيبة \"$3\".",
        "invalidtitle-unknownnamespace": "علوان ماشي مقبول ب نمرو ماشي معروف تاع الوسَع تاع تسميّة \"$1\" معا الكتيبة \"$2\".",
        "exception-nologin": "ماشي مسجّل الدخول",
        "virus-scanfailed": "التفتاش ما لحّقش (كود $1)",
        "virus-unknownscanner": "مضاد الفيروسات ماشي معروف:",
        "logouttext": "<strong>راك ضركا مسجّل الخروج.</strong>\n\nبالاك تنجم تشوف شي حاجات كلّي راك مازال داخل، حتا الّي يفرغ الكاش تاع البحّار تاعك.",
+       "cannotlogoutnow-title": "ما يمكنش قطيع` التوصال ضركا",
+       "cannotlogoutnow-text": "قطيع التوصال ما هوش ممكن كي $1 تكون مستعملة.",
        "welcomeuser": "مرحبا، $1!",
        "welcomecreation-msg": "الحساب تاعك راه ضركا مخلوق.\nتنجم تبدّل الـ[[Special:Preferences|تفضيلات]] تاع {{SITENAME}} تاعك يلا راك حاب.",
        "yourname": "اسم المستخدم:",
        "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": "بالاك كاشما صرات غلطة فل توتاق تاع داتاباز ولا ما عندكش السراح باش تبدّل الحساب تاعك الخرجاني.",
        "login": "تسجال الدخول",
+       "login-security": "وتّق الهوويّة تاعك",
        "nav-login-createaccount": "تسجل/ اصنع حساب",
-       "userlogin": "تسجل/ اصنع حساب",
-       "userloginnocreate": "مسجّل الدخول",
        "logout": "مسجّل الخروج",
        "userlogout": "سجل خروج",
        "notloggedin": "ماشي مسجّل داخل.",
        "userlogin-noaccount": "ما عندك حساب؟",
        "userlogin-joinproject": "انضم لـ {{SITENAME}}",
-       "nologin": "ما عندكش حساب مسجل؟ '''$1'''.",
-       "nologinlink": "اصنع حساب",
        "createaccount": "اصنع حساب",
-       "gotaccount": "عندك حساب مسجل؟ '''$1'''.",
-       "gotaccountlink": "كونكسيون",
-       "userlogin-resetlink": "نسيت تفاصيل الدخول؟",
        "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-another-submit": "اصنع حساب",
+       "createacct-continue-submit": "كمّل صنيع الحساب",
+       "createacct-another-continue-submit": "كمّل صنيع الحساب",
        "createacct-benefit-heading": "{{SITENAME}} مخلوق من عند شي ناس غير كيفك.",
        "createacct-benefit-body1": "{{PLURAL:$1|تحرير|تحريرات}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|صفحة|صفحات}}",
        "createacct-benefit-body3": "{{PLURAL:$1|مساهم|مساهمين}} توالا",
        "badretype": "كلمات` السرّ الّي دخّلتها ماشي متشابهة.",
+       "usernameinprogress": "الصنيع تاع الحساب تاع هاد المستعملي راه بادي. اصبر من فضلك.",
        "userexists": "السميّة تاع المستعملي المدخّل راه كاين مقبل.\nالله يحفضك اختار وحداخُر.",
        "loginerror": "غلطة ف تسجال الدخلة",
        "createacct-error": "غلطة فل خليق تاع الحساب",
        "nocookiesnew": "الحساب تاع المستعملي راه مخلوق بصّح ما راكش مسجّل داخل.\n{{SITENAME}} يستعمل كوكيزات ف تسجال` الدخول تاع المستعمليين.\nراه عندك الكوكيزات راه محبّسين.\nالله يحفضك، اشعلهم و عاود سيّي تسجّل الدخول ب` السميّة تاع المستعملي و كلمت` السرّ تاعك الحدُد.",
        "nocookieslogin": "{{SITENAME}} يستعمل الكوكيزات ف تسجال الدخول تاع المستعمليين.\nالكوكيزات عندك راهم محبّسين.\nالله يحفضك، مشّيهم و عاود سيّي.",
        "nocookiesfornew": "الحساب تاع المستعملي ما تنخلقش خاطر ما نجمناش نوتّقو المصدر تاعهُ.\nأكّد بلّي الكوكيزات راهم ممشّيين عندك، عاود عمّر الپاجة و سيّي مرّة جديدة.",
+       "createacct-loginerror": "الحساب راه ندار وحدو، لكن ما دخلتش أوتوماتيك، من فضلك روح [[Special:UserLogin|دخلة بيديك]]",
        "noname": "ما مدّيتش سميّت` مستعملي مقبولة.",
        "loginsuccesstitle": "التوصال راه نجَح.",
        "loginsuccess": "<strong>راك مسجّل داخل ف {{SITENAME}} ب`السميّة \"$1\".</strong>",
-       "nosuchuser": "Ù\85ا Ù\83اÙ\8aÙ\86 Ø­ØªØ§ Ù\85ستعÙ\85Ù\84Ù\8a Ø¨`اÙ\84سÙ\85Ù\8aÙ\91Ø© \"$1\".\nاÙ\84سÙ\85Ù\8aÙ\91Ø© ØªØ§Ø¹ Ø§Ù\84Ù\85ستعÙ\85Ù\84Ù\8a Ø±Ø§Ù\87 حسّاسة ف تكسار الحروف (majuscule - minuscule).\nعاود أكّد على كيفاش كتبت الكلمات ولا [[Special:CreateAccount|اخلق حساب جديد]].",
+       "nosuchuser": "Ù\85ا Ù\83اÙ\86Ø´ Ù\85ستعÙ\85Ù\84 Ø¨`اÙ\84سÙ\85Ù\8aÙ\91Ø© \"$1\".\nاÙ\84سÙ\85Ù\8aÙ\91Ø© ØªØ§Ø¹ Ø§Ù\84Ù\85ستعÙ\85Ù\84Ù\8aÙ\86 Ø±Ø§Ù\87ا حسّاسة ف تكسار الحروف (majuscule - minuscule).\nعاود أكّد على كيفاش كتبت الكلمات ولا [[Special:CreateAccount|اخلق حساب جديد]].",
        "nosuchusershort": "ما كاين حتا مستعملي ب` السميّة \"$1\".\nأكّد على الكتيبة تاعك.",
        "nouserspecified": "لازم لك تمدّ السميّة تاع المستعملي.",
        "login-userblocked": "هاد السميّة تاع المستعملي راهي مطرودة. تسجال` الدخول ماشي مسموح.",
        "wrongpasswordempty": "كلمت` السرّ كانت خاوية.\nالله يعيّشك عاود سيّي.",
        "passwordtooshort": "كلمت` السرّ لازم يكون فيها على القل {{PLURAL:$1|1 حرف واحد|$1 حروف}}.",
        "passwordtoolong": "كلمت` السرّ ما تنجمش تكون طويلة على {{PLURAL:$1|1 حرف واحد|$1 حرف}}.",
+       "passwordtoopopular": "كلمات المرور الشايعة ما يمكنش استخدامها. من فضلك  خيّر كلمة سر سبيسيال.",
        "password-name-match": "كلمت` السرّ تاعك لازم لها تكون مبدّلة على سميّت` المستعملي تاعك.",
        "password-login-forbidden": "الستعملية تاع هاد السميّة تاع المستعملي و كلمت` السرّ راهم ممنوعين.",
        "mailmypassword": "استرجع كلمت` السرّ",
        "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": "شي زايرين ل هاد الويكي كانو مستعملين الادريسة إيپي تاعك و خلقو {{PLURAL:$1|حساب|$1 حسابات}} ف` النهار هادا الّي فات، و هاد هوّا الحدّ القاصي المقبول ف هاد المدّة تاع الزمان.\nعلى هاد الشي، الزايرين من هاد الإيبي ما ينجمو يخلقو حتا حساب ف هاد الوقيتة.",
+       "acct_creation_throttle_hit": "شي زايرين تاع هاد الويكي كانو مستعملين الإيپي تاعك و خلقو {{PLURAL:$1|حساب|$1 حسابات}} ف` النهارات $2 هادو الّي فاتو، و هاد هوّا الحدّ القاصي المقبول ف هاد المدّة.\nعلى هاد الشي، الزايرين من هاد الإيبي ما ينجموش يصّنعو حساب وحداخر.",
        "emailauthenticated": "الادريسة تاع الإيمال تاعك راهي تكونفيرمات ف $2 على الـ $3.",
        "emailnotauthenticated": "الادريسة تاع الإيمال تاعك مازال ما راهيش مكونفيرمية.\nحتا إيمال ما غادي ينبعَت لك على الشغّالات هادي.",
        "noemailprefs": "خصّص كاش آدريسة تاع إيمال فل إختيارات ديالك باش تمشي لك هاد التشغيلة.",
        "createaccount-title": "خليق حساب ف {{SITENAME}}",
        "createaccount-text": "شي واحد راه خلَق حساب ف {{SITENAME}} ($4) ب`السميّة \"$2\"، و كلمت` السرّ \"$3\".\nلازم لك ضركا تتسجّل داخل ف` السيت و تبدّل كلمت` السرّ ديالك.\n\nيلا هاد الحساب راه نخلَق ب غلطة، غير فوت هاد الميساج.",
        "login-throttled": "راك درت مسيّات كتَر من المقبول باش تدخُل ف`السيت.\nالله يخلّيك، اصبَر $1 قبَل ما تسيّي عاود.",
-       "login-abort-generic": "الدخول تاعك ما نجَحش",
+       "login-abort-generic": "المحاولة ديال الدخول نتاعك ما نجَحتش",
        "login-migrated-generic": "الحساب تاعك راه تنقّل و سميّت` المستعملي ما بقاش كاين ف هاد الويكي.",
        "loginlanguagelabel": "اللوغه: $1",
        "suspicious-userlogout": "المطلب تاعك باش تسجّل خارج ما تسجّلش خاطر راه يبان مرسول من عند بحّار معطّل ولا  خزّان تاع وسّاط (proxy cache).",
        "createacct-another-realname-tip": "السميّة الحقّانيّة ماشي ملزومة.\nيلا تستعملها غادي تصلاح باش تنسّب ليك الخدمة الّي غادي تديرها.",
        "pt-login": "ادخل",
        "pt-login-button": "دخول",
+       "pt-login-continue-button": "واصل الدخول",
        "pt-createaccount": "اصنع حساب",
        "pt-userlogout": "الخروج",
        "php-mail-error-unknown": "غلطة مجهولة صرات فل وضيفة mail() تاع PHP.",
        "newpassword": "كلمت` السرّ الجديدة:",
        "retypenew": "عتود اكتب كلمت` السرّ:",
        "resetpass_submit": "اختار كلمت` السرّ و سجّل الدخول",
-       "changepassword-success": "كلمت` السرّ تاعك راهي تبدّلت!",
+       "changepassword-success": "كلمت السرّ نتاعك راها تبدّلت!",
        "changepassword-throttled": "راك درت مسيّات كتَر من المقبول باش تدخُل ف`السيت.\nالله يخلّيك، اصبَر $1 قبَل ما تسيّي عاود.",
+       "botpasswords": "كلمات سر البوت",
+       "botpasswords-summary": "<em>كلمات سر البوت</em> تسمح بالوصول لحساب مستخدم من خلال API بلا ما  تستخدام اعتمادات تسجيل الدخول الرئيسية للحساب. صلاحيات المستخدم المتوفرة عند تسجيل الدخول باستخدام كلمة سر بوت بالاك تكون مقيدة.\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-created-title": "كلمت` السرّ تاع البوت مصنوعة",
+       "botpasswords-updated-title": "كلمت` السرّ تاع البوت راهي ندارت لها الميزاجور",
+       "botpasswords-deleted-title": "كلمت` السرّ تاع البوت تفاصات",
        "resetpass_forbidden": "كلمت` السرّ ما تنجمش تتبدّل",
+       "resetpass_forbidden-reason": "كلمت` السرّ ما تنجمش تتبدّل",
        "resetpass-no-info": "لازم لك تكون مسجّل الدخول باش تلحق ل هاد الپاجة.",
        "resetpass-submit-loggedin": "بدّل كلمت` السرّ",
        "resetpass-submit-cancel": "بطّل",
        "passwordreset-emaildisabled": "الفعاليّات تاع الإيمال راهي محبّسة ف هاد الويكي.",
        "passwordreset-username": "سميّت` المستعملي:",
        "passwordreset-domain": "الدومان:",
-       "passwordreset-capture": "شوف الإيمال الناتج؟",
-       "passwordreset-capture-help": "يلا تقبش (cocher) هاد القويبسة، الإيمال (ب كلمت` السرّ المأقّتة) غادي يتورّا لك كلّي راه مبعوت لل مستعملي.",
        "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 إيّام}}.\nمليح لوكان تدخُل ل`السيت من ضركا و تبدّل كلمت` السرّ.\nيلا كاش ما وحداخُر دار هاد المطلب ولا راك تفكّرت كلمت` السرّ تاعك و ما بقيتش باغي تبدّلها، تنجم برك تنسا هاد الميساج و تستعمل كلمت` السرّ تاعك تاع مضاري.",
        "passwordreset-emailtext-user": "المستعملي $1 ف {{SITENAME}} راه طلب تبدال ف كلمت` السرّ تاعك ف {{SITENAME}}\n($4). {{PLURAL:$3|الحساب|الحسايات}} تاع المستعملي {{PLURAL:$3|راه مربوط|راهم مربوطين}} ب لادريسة تاع ليمال هادي:\n\n$2\n\n{{PLURAL:$3|هاد كلمت` السرّ المأقّتة|هادي كلمات` السرّ المأقّتة}} غادي يكمل صلوحها منّا على {{PLURAL:$5|نهار واحد|$5 إيّام}}.\nمادابيك تسجّل داخل ضركا و تختار كلمت` سرّ جديدة. يلا كان وحداخُر دار هاد المطلب، ولا راك ضركا تفكّرت كلمت` السرّ تاعك القديمة و ما بقيتش باغي تبدّلها، تنجم برك تتنسّا هاد الميساج و تدخُل ب كلمت` السرّ تاعك تاع مضاري.",
        "passwordreset-emailelement": "سميّت` المستعملي: \n$1\n\nكلمت` السرّ المأقّتة: \n$2",
-       "passwordreset-emailsentemail": "راه نبعَت إيمال تاع تبدال كلمت` السرّ.",
+       "passwordreset-emailsentemail": "يلا كان ليمال هادا موصّل معا الحساب تاعك، غادي ينبعَت لك إيمال تاع تبدال كلمت` السرّ.",
+       "passwordreset-invalidemail": "كاين غلطة فل ايمال",
        "changeemail": "بدّل لادريسة تاع الإيمال",
        "changeemail-header": "كمّل الكتبة ف` الجدوال هادا باش تبدّل لادريسة تاع الإيمال تاعك. يلزم لك تدخّل كلمت` السرّ تاعك باش تأكّد هاد التبدال.",
        "changeemail-no-info": "لازم لك تكون مسجّل داخل باش توصَل ل هاد الپاجة بسّراح.",
        "sig_tip": "سنياتورتك بالساعة و التاريخ",
        "hr_tip": "خط أفقي (ما تستعملوش بزاف)",
        "summary": "ملخص:",
-       "subject": "موضوع / علوان:",
+       "subject": "موضوع:",
        "minoredit": "هذي تبديلة صغيرة",
        "watchthis": "تبع الباجة",
        "savearticle": "سجل الباجة",
+       "savechanges": "سجّل التبدال",
+       "publishpage": "پوبليي الپاجة",
+       "publishchanges": "پوبليي واش تبدّل",
        "preview": "شوفه-قبلي",
        "showpreview": "بين معاينة",
        "showdiff": "عرض التبديلات",
-       "blankarticle": "<strong>ردّ البال:</strong> الپاجة الّي كريّيتها راهي خاوية.\nيلا تعاود تكليكي على {{int:savearticle}}\"، الپاجة غادي تنخلق بلا ما يكون فيها حتا محتاوا.",
+       "blankarticle": "<strong>ردّ البال:</strong> الپاجة الّي كريّيتها راهي خاوية.\nيلا تعاود تكليكي على $1\"، الپاجة غادي تنخلق بلا ما يكون فيها حتا محتاوا.",
        "anoneditwarning": "'''توليهة:''' راك ما دخلتش بل حساب تاعك.\nيلا تدير شي تبدال، غادي تتسجّل لادريسة آيبي تاعك فل متراخ تاع هاد الصفحة و تكون باينة ل كلّ واحد. يلا [$1 تتكونيكتا]</strong> ولا <strong>[$2 تخلق حساب]</strong>، التبدالات تاعك غادي يبانو تحت السميّة تاع المستعملي تاعك، و كاين تاني مزيّات وحدخرين.",
        "anonpreviewwarning": "<em>ما راكش مسجّل داخل. لوكان تحفّظ التبدالات ضركا غادي تتسجّل لادريسة إيپي تاعك فل تاريخ تاع هاد الپاجة.</em>",
-       "missingsummary": "<strong>تفكار:</strong> راك ما مدّيتش تلخيص على التبدال تاعك.\nيلا تكليكي على \"{{int:savearticle}}\" مجّديد، التبدال تاعك غادي يتسجّل بلاش.",
-       "selfredirect": "<strong>ردّ البال:</strong> راك توجّه هاد الپاجة على روحها.\nبالاك راك غلطت فل ختيّار تاع التقيان تاع الپاجة، ولا تاني ما راكش فل پاجة الّي راك حاب تإيديتيها.\nيلا تكليكي على \"{{int:savearticle}}\" مجّديد، هاد التوجاه غادي ينخلق كيما هاك.",
+       "missingsummary": "<strong>تفكار:</strong> راك ما مدّيتش تلخيص على التبدال تاعك.\nيلا تكليكي على \"$1\" مجّديد، التبدال تاعك غادي يتسجّل بلاش.",
+       "selfredirect": "<strong>ردّ البال:</strong> راك توجّه هاد الپاجة على روحها.\nبالاك راك غلطت فل ختيّار تاع التقيان تاع الپاجة، ولا تاني ما راكش فل پاجة الّي راك حاب تإيديتيها.\nيلا تكليكي على \"$1\" مجّديد، هاد التوجاه غادي ينخلق كيما هاك.",
        "missingcommenttext": "الله يحفضك حُطّ شي تعليق هنا لتحت.",
-       "missingcommentheader": "<strong>تفكار:</strong> راك ما حطّيتش علوان تاع الموضوع تاع التعليق تاعك.\nيلا تكليكي على \"{{int:savearticle}}\" مجّديد، التبدال تاعك غادي يتسجّل بلاش.",
+       "missingcommentheader": "<strong>تفكار:</strong> راك ما حطّيتش علوان فل موضوع تاع التعليق تاعك.\nيلا تكليكي على \"$1\" مل جديد، التبدال تاعك غادي يتسجّل بلاش.",
        "summary-preview": "شوفة خفيفة على التلخيص:",
        "subject-preview": "شوفة خفيفة على العلوان / الموضوع:",
        "previewerrortext": "صرات غلطة فل محاولة باش تشوف خفيف ف` التبدالات تاعك.",
        "continue-editing": "روح لصندوق التحرير",
        "previewconflict": "هاذ العرض يبين النص الموجود في صندوق التحرير الفوقاني اللي يبانلك إذا اختاريت النشر.",
        "session_fail_preview": "'''مانقدروش نسجلو التبديلات نتاوعك علا خاطر كاين معلومات تودرو في ما يخص القعدة .'''\nمن فضلت حاول مرة اخرى.\nإذا ما نجحتش مرة جديدة, حاول باش [[Special:UserLogout|تخرج]], و تدخل مرة اخرى",
-       "session_fail_preview_html": "'''مانقدروش نسجلو التبديلات نتاوعك علا خاطر كاين معلومات تودرو في ما يخص القعدة .'''\n\n''على خاطر {{SITENAME}} فعل HTML brut, الإستضهار تخبا باش نتوخاو الهجمات بالجافاسكريبت.''\n\n'''إذا كانت محاولة التبديل صادقة, حاول مرة اخرى.'''\nالا ما نجحتش مرة اخرى, [[Special:UserLogout|اخرج]], و ادخل مرة اخرى",
+       "session_fail_preview_html": "'''مانقدروش نسجلو التبديلات نتاوعك علا خاطر كاين معلومات تودرو في ما يخص القعدة.'''\n\n<em>على خاطر {{SITENAME}} فعل HTML brut, الإستضهار تخبا باش نتوخاو الهجمات بالجافاسكريبت.</em>\n\n<strong>إذا كانت محاولة التبديل صادقة, حاول مرة اخرى.</strong>\nالا ما نجحتش مرة اخرى, [[Special:UserLogout|اخرج]], و ادخل مرة اخرى",
        "editing": "تحرير $1",
        "creating": "خليق $1",
        "editingsection": "كتيبه $1 (قسم)",
+       "editconflict": "ڤيرة تاع التبدال:$1",
+       "yourtext": "التاكست تاعك",
+       "yourdiff": "ديفيرونس",
        "templatesused": "{{PLURAL:$1||القالب المستعمل|القوالب المستعمله}} في هذه الباجه:",
        "template-protected": "(محميه)",
        "template-semiprotected": "(نص حماية )",
        "permissionserrorstext-withaction": "ما راكش اوتوريزى ل$2، لل{{PLURAL:$1||سبب هاذا|اسباب هاذي}}:",
        "recreate-moveddeleted-warn": "'''توليه: راك تعاود تصنع باحه اتمحات من قبل.'''\n\nلازم تتأكد بلى الباجه الا نصنعت ماهوش مشكل الا كملت الكتبه فبها.\nريجيستر المحو و النقل معروض هنا باش تراقب :",
        "moveddeleted-notice": "هاذ الباجه تمحات .\nريجيستر المحو والتنقال للباجه معروضين التحت كريفيرونس.",
+       "edit-conflict": "ڤيرة تاع التبدال:$1",
        "post-expand-template-inclusion-warning": "'''توليه:''' الباجة داخل فيها قوالب بزاف.\nشي قوالب ما غاديش تدخل.",
        "post-expand-template-inclusion-category": "الباجات داخل فيها بزاف القوالب",
        "post-expand-template-argument-warning": "'''توليه:''' هذه الباجه فيها عامل قالب واحد على الأقل عندو حجم تمدد كبير بزاف.\nهاذالعوامل اتمحات.",
        "nextrevision": "فرسيون جايه←",
        "currentrevisionlink": "المراجعه الحاليه",
        "cur": "الحالي",
+       "next": "التابع",
        "last": "السابق",
+       "page_first": "اللوّل",
+       "page_last": "التالي",
        "histlegend": "تخيار الفرق: علم على صناديق النسخ للمقارنه و ادرك قارن بين النسخ المختارة والا القفلة التحت .<br />\nمفتاح: (الحالي) = الفرق مع النسخة تع دروك\n(الفايته) = الفرق مع النسخة اللي فاتت، ط = تبديل خفيف",
-       "history-fieldset-title": "نافيقي في التاريخ",
-       "history-show-deleted": "المماسكيه برك",
+       "history-fieldset-title": "ناڢيڤي في التاريخ",
+       "history-show-deleted": "التبدالات المفاصية برك",
        "histfirst": "اول باجه",
        "histlast": "باجه تاليه",
+       "historysize": "({{PLURAL:$1|1 بايت|$1 bytesبايت",
+       "historyempty": "(خاوي)",
        "history-feed-item-nocomment": "$1 إلى $2",
        "rev-delundel": "بين/خبي",
+       "rev-showdeleted": "ورّي",
+       "revdelete-show-file-submit": "إيه",
        "revdel-restore": "غير كيف راهي تبان",
        "revertmerge": "فرق",
        "history-title": " «$1»: تاريخ المراجعات",
        "search-showingresults": "{{PLURAL:$4|النتيج <strong>$1</strong> تاع <strong>$3</strong>|النتايج <strong>$1 - $2</strong> من أصل <strong>$3</strong>}}",
        "search-nonefound": "ما كانش نتائج تطابق المسقسية.",
        "mypreferences": "إختيارات",
+       "prefs-edits": "ڤداه نتبديلة",
+       "prefs-editing": "التبدال",
        "youremail": "البريه الالكترونيه:",
        "yourrealname": "الاسم الحقاني:",
        "prefs-help-email": "لادريس نتع البريه الإلكترونيه بالخاطر، ولكن هي لازمه في حال نسيت كلمت السر نتاعك.",
        "prefs-help-email-others": "تقدر تاني تخلي لوخرين يتاصلو بيك في باجت نقاشك ولا في وصيله في باجت مستخدم نتاعك, اذا ارسلك واحد ما يبانش لادريس نتاعك , حتى اذ رديت عليه باش يبان لادريس نتاعك.",
+       "right-edit": "تبدال الصفحات",
        "right-writeapi": "استعمل API للكتابه نتاع الويكي",
        "newuserlogpage": "ريجيستر صنعة حسابات المستخدمين",
        "action-edit": "عدل هاذ الباجه",
        "recentchanges-label-plusminus": "الحجَم تاع الصفحة راه تبدّل ب هاد العدّة تاع البايتات",
        "recentchanges-legend-heading": "<strong>تفسار:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (شوف تاني [[Special:NewPages|ليستة تاع صفحات جديدة]])",
+       "recentchanges-submit": "ورّي",
+       "rcfilters-filter-editsbyself-label": "التبدال نتاعك",
+       "rcfilters-filter-minor-label": "تبديلة خفيفة",
+       "rcfilters-filter-major-label": "ماشي تبديلة خفيفة",
        "rcnotefrom": "التحت التبديلات من <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
        "rclistfrom": "بين التبديلات البديه من $3 $2",
        "rcshowhideminor": "$1 التبديلات الصغير",
        "rcshowhidebots-show": "ورّي",
        "rcshowhidebots-hide": "خبّي",
        "rcshowhideliu": "$1 المستخدمين المسجلين",
+       "rcshowhideliu-show": "ورّي",
        "rcshowhideliu-hide": "خبّي",
        "rcshowhideanons": "$1 المستخدمين المجهولين",
        "rcshowhideanons-show": "ورّي",
        "rcshowhidemine": "$1 تبديلات نتاعي",
        "rcshowhidemine-show": "ورّي",
        "rcshowhidemine-hide": "خبّي",
-       "rclinks": "بين آخر $1 تبديل في آخر $2 يوم<br />$3",
+       "rcshowhidecategorization-show": "ورّي",
+       "rclinks": "بين آخر $1 تبديل في آخر $2 يوم",
        "diff": "إختلاف",
        "hist": "تاريخ",
        "hide": "خبي",
        "license": "ترخيص:",
        "license-header": "ترخيص:",
        "imgfile": "فيشي",
+       "listfiles-latestversion-yes": "إيه",
+       "listfiles-latestversion-no": "لالا",
        "file-anchor-link": "ملف",
        "filehist": "تاريخ الفيشيي",
        "filehist-help": "ادرك على وقت و تاريخ/باش تشوف الملف كما بان  في هاذ الوقت.",
        "upload-disallowed-here": "ما تنحمش تعدّل هاد التصويرة",
        "randompage": "صفحة ع الزهر",
        "statistics": "إحصائيّات",
+       "brokenredirects-edit": "تبديل",
+       "withoutinterwiki-submit": "ورّي",
        "nbytes": "{{PLURAL:$1|بايت 1|$1 بايت}}",
        "nmembers": "$1 اعضاء{{PLURAL:$1||s}}",
        "prefixindex": "كامل الباجات الباديه ب",
+       "prefixindex-submit": "ورّي",
+       "usereditcount": "{{PLURAL:$1|تبديلة|تبديلات}}",
        "usercreated": "{{GENDER:$3|صنعه|صنعته}} في $1 الساعة $2",
        "newpages": "باجه جديده",
+       "newpages-submit": "ورّي",
        "move": "عاود التسمية",
        "pager-newer-n": "{{PLURAL:$1|جديد بزاف 1|جديد بزاف $1}}",
        "pager-older-n": "{{PLURAL:$1|قديم بزاف 1|قديم بزاف $1}}",
+       "apisandbox-unfullscreen": "وري الصفحة",
        "booksources": "مصادر كتاب",
        "booksources-search-legend": "حوس ما بين مصادر الكتب",
        "booksources-search": "فتّش",
        "log": "ريجيسترات العمليات",
+       "logeventslist-submit": "ورّي",
        "allpages": "قاع الباجات",
        "allarticles": "قاع الباجات",
        "allpagessubmit": "روح",
        "categories": "تصنيفات",
+       "categories-submit": "ورّي",
        "linksearch-line": "$1 موصولة من $2",
+       "listusers-submit": "ورّي",
        "listgrouprights-members": "(ليسته الأعضاء)",
        "emailuser": "ابعث بريه لهاذ المستخدم",
        "watchlist": "ليستة تاع المتابعة",
        "unwatch": "ما تزيدش تعس",
        "watchlist-details": "{{PLURAL:$1||باجه وحده|باجتين|$1 باجات|$1 باجه}} في ليستت مراقبتك، من غير اعتبار باجات النقاش هي باجات منفصله.",
        "wlshowlast": "بين آخر $1 سوايع $2 يامات",
+       "watchlist-submit": "ورّي",
+       "wlshowhideminor": "تبديلة خفيفة",
+       "wlshowhidepatr": "$1 التبديلات المعسوسه",
        "watchlist-options": "ابسيون ليستت المراقبه",
+       "historyaction-submit": "ورّي",
        "actioncomplete": "العمليه اندارت",
        "actionfailed": "العمليه فشلت",
        "dellogpage": "ريجيستر محو الباجات",
        "rollbacklinkcount": "رجّع {{PLURAL:$1|تعديل واحد|$1 تعديلات}}",
        "protectlogpage": "ريجيستر الحمايه",
        "protectedarticle": "راه حمى \"[[$1]]\"",
+       "restriction-edit": "بدل",
        "undeletelink": "شوف/رجع",
        "undeleteviewlink": "شوف",
-       "namespace": "بلاصه تع أسموات",
+       "undelete-show-file-submit": "إيه",
+       "namespace": "بلاصة تاع أسماوات",
        "invert": "اعكس التخيار",
        "tooltip-invert": "علّم هاد المقّبسة باش تخبّي التبدالات تاع الصفحات الّي فيها وسَع` التسمية (و وسَع التسمية المربوط يلا كاين)",
        "namespace_association": "وسَع التسمية المربوط",
        "tooltip-search": " فتّش في {{SITENAME}}",
        "tooltip-search-go": "روح ل صفحة عندها نفس هاذ الاسم ايذا توجْدت",
        "tooltip-search-fulltext": "فتّش ع الپاجات الّي فيها هاذ النصّ",
-       "tooltip-p-logo": "زÙ\88ر ØµÙ\81حة Ø§Ù\84استÙ\82باÙ\84",
+       "tooltip-p-logo": "زÙ\88ر Ø§Ù\84باجة Ø§Ù\84Ù\84Ù\88Ù\84Ø©",
        "tooltip-n-mainpage": "زور الپاجة اللولانيّة",
        "tooltip-n-mainpage-description": "زور صفحة الاستقبال",
-       "tooltip-n-portal": "ع Ø§Ù\84Ù\85شرÙ\88عØ\8c Ø´Ù\86Ù\88Ù\91 ØªÙ\82در ØªØ¯Ù\8aرØ\8c Ù\81Ù\8aÙ\86 ØªÙ\84Ù\82Ù\89 Ø§Ù\84حاجات Ø§Ù\84Ù\91ي حاجتك بيها",
+       "tooltip-n-portal": "ب Ø®Ù\88صÙ\88ص Ø§Ù\84Ù\85شرÙ\88عØ\8c Ù\88اش ØªÙ\82در ØªØ¯Ù\8aرØ\8c Ù\88Ù\8aÙ\86 ØªÙ\84Ù\82Ù\89 Ø§Ù\84Ù\85عÙ\84Ù\88Ù\85Ø© Ù\84ي حاجتك بيها",
        "tooltip-n-currentevents": "شوف اش قاعد يصير",
        "tooltip-n-recentchanges": "ليستة تاع التبدالات الاخّرين ف الويكي",
        "tooltip-n-randompage": "شرجي صفحة ع الزهر",
        "tooltip-undo": "\"نحّي\" فاصي هاد الـمعاودة و حلّ تاقة تاع تبدال بشوفه قبلانيّه. تخلّي باش ترجع لل معاوده التاليه و تزيد الـسبّة علاش فل قابسه تاع الـحويصله.",
        "tooltip-summary": "دخل تلخيص صغير",
        "simpleantispam-label": "مسيّة ضدّ السبام.\nما تعمّرش هادا!",
+       "pageinfo-lastuser": "لخر لي كتب",
+       "pageinfo-lasttime": "تاريخ آخر تبديلة",
        "pageinfo-toolboxlink": "معلومات على هاد الصفحة",
+       "pageinfo-contentpage-yes": "إيه",
+       "pageinfo-protect-cascading-yes": "إيه",
        "previousdiff": "→ التعديل الي قبل",
        "nextdiff": "التبديل الجاي ←",
        "file-info-size": "$1 × $2 بكسل حجم الملف: $3، نوع MIME: $4",
        "show-big-image-preview": "حجم هذه المعاينه: $1.",
        "show-big-image-other": "{{PLURAL:$2||التدقاقة|التدقاقات}}: $1.",
        "show-big-image-size": "$1 × $2 بكسل",
+       "yesterday-at": "لبرح علا $1",
        "bad_image_list": "الفورمة راهي كيما واش يتبع:\nما كاين غير السطور الّي باديين بل *، الّي يكونو معدودين\nالـوصيل الـلوّل تاع سطر لازم كون تاع تصويرة ضايعة.\nكامل الوصيلات لخرين الّي فل سطر، يكونو معدودين كلّي تتنيّات، بل متال باجات وين الـتصويرة تنجم تبان.",
        "metadata": "بايان ميتا",
        "metadata-help": "هذا الملف راه فيه خبيرات زايدين، بالاك تكون انزادت من عند صواره نيميريك ولا سكانر مين صنع الملف.\nالأصلي، شي تفاصيل بالاك ما تعبرش على الملف المعدل.",
        "exif-xresolution": "التدقاق الأوفوقي",
        "exif-yresolution": "التدقاق العامودي",
        "exif-datetime": "تاريخ و وقت تاع تبدال الفيشي",
+       "exif-imagedescription": "عنوان التصويرة",
        "exif-make": "الصانع تاع الجهاز",
        "exif-model": "الطبّع تاع الجهاز",
        "exif-software": "البريمجات الّي مستعملة",
        "exif-datetimeoriginal": "التاريخ و الوقت تاع تولاد المعلومات",
        "exif-datetimedigitized": "التاريخ تاع التنمريل (numérisation)",
        "exif-orientation-1": "عادي",
+       "exif-contrast-0": "عادي",
+       "exif-saturation-0": "عادي",
+       "exif-sharpness-0": "عادي",
+       "exif-urgency-normal": "عادي ($1)",
        "namespacesall": "لكل",
        "monthsall": "لكل",
        "watchlisttools-view": "اعرض التبديلات المرتابطه",
        "watchlisttools-raw": "موديفي ليستت التبيعه الخام",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|تقرعيج]])",
        "duplicate-defaultsort": "'''توليه:''' مفتاح التستيف الافتراضي \"$2\" ديباسا مفتاح التستيف الافتراضي التالي\"$1\".",
+       "version-no-ext-name": "[بلا اسم]",
        "specialpages": "الپاجات الخاصّين",
        "external_image_whitelist": " #<pre>خلى هاذ السطر كيما راه\n#حط منثورات التعبيرات المنتظمة (برك الجزء الي يروح بين //) بالتحت\n#هاذ يكون مطابقتها مع مسارات التصاوير البرانيه (الموصولة بصفه مباشره)\n#هاذي الي تشبهغادي تنعرض  كتصاور، خلاف هذا برك وصيلة للتصويرة غادي تنعرض\n#السطور اللي تبدأا ب# تعتبر تعليقات\n#هذا لا يتأثر بحالة الحروف\n\n#حط كامل منثورات التعبيرات المنتظمة فوق هذا السطر. خلي هاذ السطر سواسوا كيما هو</pre>",
        "tag-filter": "صفاية[[Special:Tags|الوشام]]:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1||وسم|وسمان|وسوم}}]]: $2)",
+       "tags-active-yes": "إيه",
+       "tags-active-no": "لالا",
+       "tags-edit": "بدّل",
+       "htmlform-no": "لالا",
+       "htmlform-yes": "إيه",
        "logentry-delete-delete": "$1 {{GENDER:$2| راه محا|راهي محات}}الصفحة $3",
        "logentry-move-move": "{{GENDER:$2|نقّل|نقّلت}} $1 الصفحة $3 لـ $4",
        "logentry-newusers-create": "راه تفتح حساب {{GENDER:$2|المستخدم|المستخدمه}} $1",
        "logentry-upload-upload": " {{GENDER:$2|نزّل|نزّلت}} $1 $3",
-       "searchsuggest-search": "فتّش"
+       "feedback-error2": "غلطة: تبديلتك ما صلحتش",
+       "searchsuggest-search": "فتّش في {{SITENAME}}",
+       "mediastatistics-header-bitmap": "تصويرة Bitmap"
 }
index b490f27..7d81643 100644 (file)
        "externaldberror": "kayn imma ċi ĥata' f-doĥol qaĝidaṫ l-bayanaṫ wlla rah ma msmoḫ-likċ baċ ṫḫddṫ l-ḫisab l-ĥariji taĝk.",
        "login": "Dĥel",
        "nav-login-createaccount": "Ṫkonékta / Ĥṫareĝ ċi konṫ",
-       "userlogin": "Ṫkonnékta / Ṣayeb ċi ḫsab",
-       "userloginnocreate": "Ṫkonékta",
        "logout": "Ṫdékonékta",
        "userlogout": "Ĥrej",
        "notloggedin": "nta mamkoniktich",
-       "nologin": "maandkch  cont ? $1",
-       "nologinlink": "Ḫell ċi ḫsab",
        "createaccount": "Ḫell ċi ḫsab",
-       "gotaccount": "aandk deja cont ? $1",
-       "gotaccountlink": "Ṫkonékta",
-       "userlogin-resetlink": "yak-ma nsiṫi ṫ-ṫafaṣil dial d-doĥol taĝk?",
        "createaccountmail": "b l'email",
-       "createaccountreason": "sabab:",
        "badretype": "klmaṫ ṣ-ṣeṛṛ lli dĥĥalṫi maċi b-ḫal b-ḫal.",
        "userexists": "smiṫ l-mosṫĥdim lli ḍĥĥolṫi ĥddam bih ċi waḫd.\nċof lik ċi ṣmiya aĥra.",
        "loginerror": "khataa f dokhol",
        "showdiff": "Werri ṫ-ṫeġyiraṫ",
        "anoneditwarning": "'''Ĝendak:''' Ma mkonéktéċ.\nĠayṫċejjel l-ĝonwan IP dyalek fe ṫariĥ had ṣ-ṣefḫa.",
        "anonpreviewwarning": "''ṛak ma daĥlċ. l-ḫifḍ ġadi ysjjl ĝonwan l-IP dialk f-listorik dial had ṣ-ṣfḫa.''",
-       "missingsummary": "'''ma ṫnsaċ:''' ma ĝtiṫiċ ċi molĥaṣṣ dial ṫ-ṫĝdil.\nila ĝawd klikiṫi \"{{int:savearticle}}\", ġadi yṫsjjl ṫ-ṫĝdil dialk bla bih.",
+       "missingsummary": "'''ma ṫnsaċ:''' ma ĝtiṫiċ ċi molĥaṣṣ dial ṫ-ṫĝdil.\nila ĝawd klikiṫi \"$1\", ġadi yṫsjjl ṫ-ṫĝdil dialk bla bih.",
        "missingcommenttext": "afak dkhl taaliq ltaht",
-       "missingcommentheader": "'''ma ṫnsaċ:''' ĝtiṫi l-moḍoĝ/l-ĝonwan dial had ṫĝliq.\nila ĝawd klikiṫi \"{{int:savearticle}}\", ġadi yṫsjjl ṫ-ṫĝdil dialk bla bih.",
+       "missingcommentheader": "'''ma ṫnsaċ:''' ĝtiṫi l-moḍoĝ/l-ĝonwan dial had ṫĝliq.\nila ĝawd klikiṫi \"$1\", ġadi yṫsjjl ṫ-ṫĝdil dialk bla bih.",
        "summary-preview": "Prévizualizasyon dyal l-moleĥĥaṣ:",
        "subject-preview": "moĝayanat l-moḍoĝ/l-ĝonwan:",
        "blockedtitle": "had lmostakhdim tbloka",
        "editingsection": "Ṣayeb $1 (séksyon)",
        "editingcomment": "Ṣayeb $1 (séksyon jdida)",
        "editconflict": "mdarba f thrir: $1",
-       "explainconflict": "ċi hedd ḅddl had ṣfḫa mlli konti ka ṫwjjedha.\nmintaqaṫ n-nosos l-foqaniyya kaṫwrri n-naṣṣ kimma howa daba.\no-ṫĝdilaṫ mbyyna fl-mintaqa ṫ-ṫḫṫaniyya.\nġadi yĥṣṣak ṫ-dmj ṫ-ṫĝdilaṫ ṫaĝk f-naṣṣ lli mojod daba.\n'''ġir''' n-naṣṣ lli kayn fl-mintaqa l-foqaniyya howa lli ġadi yṫssjel ila wtiṫi ĝla \"{{int:savearticle}}\".",
+       "explainconflict": "ċi hedd ḅddl had ṣfḫa mlli konti ka ṫwjjedha.\nmintaqaṫ n-nosos l-foqaniyya kaṫwrri n-naṣṣ kimma howa daba.\no-ṫĝdilaṫ mbyyna fl-mintaqa ṫ-ṫḫṫaniyya.\nġadi yĥṣṣak ṫ-dmj ṫ-ṫĝdilaṫ ṫaĝk f-naṣṣ lli mojod daba.\n'''ġir''' n-naṣṣ lli kayn fl-mintaqa l-foqaniyya howa lli ġadi yṫssjel ila wtiṫi ĝla \"$1\".",
        "yourtext": "N-Neṣ dyalek",
        "storedversion": "noskha msjla",
        "nonunicodebrowser": "'''ṫḫdir: l-moṫaṣffiḫ ṫaĝk ma mwalm-ċ l-unicode.'''\nĝla had l-qibal o-baċ ṫqdr ṫĝddel ṣ-ṣfaḫi b-soholo: l-karakterat lli maċi ASCII ġadi ṫba f-ṣndoq ṫ-ṫĝdil b-ċkl kodat hexadecimal.",
        "saveprefs": "sjl",
        "restoreprefs": "rjaa kaml liadadat liftiradiya",
        "prefs-editing": "thrir",
-       "rows": "sofof:",
-       "columns": "aaamida:",
        "searchresultshead": "Qelleb",
        "stub-threshold": "l-ḫadd l-aqṣa ṫaĝ <a href=\"#\" class=\"stub\">wṣlaṫ l-bidraṫ</a> (ḅayṫaṫ):",
        "stub-threshold-disabled": "makhdamch",
        "right-protect": "taghyir mostawayat lhimaya wtadil sfahi li mhmiyin",
        "right-editprotected": "ṣfaḫi mḫmyya mn ṫĝdil (bla ḫimaya mṫslsla)",
        "right-editinterface": "ĝddel wajihaṫ l-mosṫĥdim",
-       "right-editusercssjs": "ĝddel milffaṫ CSS o-JavaScript ṫaĝ mosṫĥdimin aĥrin",
        "right-editusercss": "ĝddel milffaṫ CSS ṫaĝ mosṫĥdimin aĥrin",
        "right-edituserjs": "ĝddel milffaṫ JavaScript ṫaĝ mosṫĥdimin aĥrin",
        "right-rollback": "srtjaa taadilat akhr mostkhdim  adl sfha mayana",
        "rcshowhideanons": "$1 mosṫeĥdimin mĥebbyin",
        "rcshowhidepatr": "$1  taadilat lmorajaa",
        "rcshowhidemine": "$1 ṫ-ṫeĝdilaṫ dyawli",
-       "rclinks": "Werri l-$1 dyal ṫ-ṫeġyiraṫ l-leĥĥrin li ṫdaro fe had l-$2 l-iyam l-leĥĥrin<br />$3.",
+       "rclinks": "Werri l-$1 dyal ṫ-ṫeġyiraṫ l-leĥĥrin li ṫdaro fe had l-$2 l-iyam l-leĥĥrin",
        "diff": "ferq",
        "hist": "Ṫariĥ",
        "hide": "Ĥebbi",
        "undeleteviewlink": "ċof",
        "undeleteinvert": "Qleb dakċi li ĝzelṫi",
        "undeletecomment": "sabab:",
-       "undeletedrevisions": "{{PLURAL:$1|vérsyon weḫda rejĝaṫ ki kaneṫ|$1 de lé-vérsyon rejĝo ki kano}}",
-       "undeletedrevisions-files": "ṫreddaṫ {{PLURAL:$1|1 l-ṃoṛajaĝa|$1 dl-ṃoṛajaĝaṫ}} o-{{PLURAL:$2|1 l-milef|$2 dl-milffaṫ}}",
-       "undeletedfiles": "ṫredd {{PLURAL:$1|1 l-milef|$1 dl-melffaṫ}}",
        "undelete-search-box": "qlleb ĝla ċi ṣ-ṣfaḫi mḫdofa",
        "undelete-search-submit": "Qelleb",
        "undelete-cleanup-error": "ĥata' f-ḫdf milef arċiv ma mĥddem-ċ \"$1\".",
        "htmlform-selectorother-other": "okhra",
        "revdelete-restricted": "tḅḅq ḍ-ḍawaḅit ll-idariyyin",
        "revdelete-unrestricted": "ḫyyd ḍ-ḍawaḅit ll-idariyyin",
-       "rightsnone": "(walo)",
-       "revdelete-summary": "molkhass taadil"
+       "rightsnone": "(walo)"
 }
index 0120e9b..e10bd39 100644 (file)
@@ -10,7 +10,8 @@
                        "Ramsis II",
                        "아라",
                        "Oldstoneage",
-                       "Macofe"
+                       "Macofe",
+                       "Abdelrhaman Eid"
                ]
        },
        "tog-underline": "حط خط تحت اللينكات:",
        "externaldberror": "يا إما فى حاجة غلط فى الدخول على قاعدة البيانات الخارجية أو انت مش مسموح لك تعمل تحديث لحسابك الخارجي.",
        "login": "دخول",
        "nav-login-createaccount": "تسجيل دخول / فتح حساب",
-       "userlogin": "دخول / فتح حساب",
-       "userloginnocreate": "دخول",
        "logout": "خروج",
        "userlogout": "خروج",
        "notloggedin": "انت مش مسجل دخولك",
        "userlogin-noaccount": "معندكش حساب؟",
        "userlogin-joinproject": "انضم ل {{SITENAME}}",
-       "nologin": "معندكش حساب؟ '''$1'''.",
-       "nologinlink": "افتح حساب",
        "createaccount": "افتح حساب",
-       "gotaccount": "عندك حساب؟ '''$1'''.",
-       "gotaccountlink": "دخول",
-       "userlogin-resetlink": "نسيت تفاصيل الدخول؟",
        "userlogin-helplink2": "مساعده ف الدخول",
        "createacct-email-ph": "أكتب عنوان الإيميل بتاعك",
        "createaccountmail": "استخدم باسورد مؤقته و إبعتها ع الايميل المحدد ده",
-       "createaccountreason": "السبب:",
        "createacct-reason": "سبب:",
        "createacct-submit": "افتح حسابك",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|تعديل|تعديلات}}",
        "anoneditwarning": "<strong>تحذير:'</strong> انت ما عملتش لوجين. عنوان الاى  بى  بتاعك هايتسجل ف تاريخ الصفحه. لو  <strong>[$1 عملت لوجين ]</strong> او <strong>[$2 فتحت حساب ]</strong>,   اليوزرنيم بتاعك هايتسجل ف تاريخ الصفحه.",
        "missingsummary": "'''خد بالك:''' انت ما كتبتش ملخص للتعديل.\nلو دوست على سييڤ الصفحه مرة تانية التعديل بتاعك ح يتحفظ من غير ملخص.",
        "missingcommenttext": "لو سمحت اكتب تعليق تحت.",
-       "missingcommentheader": "'''.خد بالك:''' انت ما كتبتش عنوان\\موضوع للتعليق دا\nلو دوست على {{int:savearticle}} مرة تانيه، تعليقك ح يتحفظ من غير عنوان.",
+       "missingcommentheader": "<strong>خد بالك:</strong> انت ما كتبتش عنوان\\موضوع للتعليق دا\nلو دوست على $1 مرة تانيه، تعليقك ح يتحفظ من غير عنوان.",
        "summary-preview": "بروفه للملخص:",
        "subject-preview": "بروفة للعنوان/للموضوع",
        "blockedtitle": "اليوزر ممنوع",
        "right-protect": "تغيير مستويات الحماية وتعديل الصفحات المحمية",
        "right-editprotected": "تعديل الصفحات المحمية (من غير الحماية المتضمنة)",
        "right-editinterface": "تعديل الواجهة بتاعة اليوزر",
-       "right-editusercssjs": "تعديل ملفات CSS و JS لليوزرز التانيين",
        "right-editusercss": "تعديل ملفات CSS لليوزرز التانيين",
        "right-edituserjs": "تعديل ملفات JS لليوزرز التانيين",
        "right-rollback": "رجع بسرعه التعديلات بتاعة آخر يوزر عدل صفحة معينة",
        "undeleteviewlink": "عرض",
        "undeleteinvert": "اعكس الاختيار",
        "undeletecomment": "السبب:",
-       "undeletedrevisions": "رجع تانى {{PLURAL:$1|تعديل واحد|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديل}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 نسخة|$1 نسخة}} و {{PLURAL:$2|1 ملف|$2 ملف}} رجعو تاني",
-       "undeletedfiles": "{{PLURAL:$1|ملف|ملفات}} $1 رجعو تاني",
        "cannotundelete": "الترجيع مانفعش:\n$1",
        "undeletedpage": "'''اترجع $1'''\n\nبص على [[Special:Log/delete|سجل المسح]] علشان تشوف عمليات المسح و الترجيع الاخيرة.",
        "undelete-header": "شوف الصفحات الممسوحة قريب فى [[Special:Log/delete|سجل المسح]].",
        "logentry-newusers-create": "تم فتح حساب {{GENDER:$2|اليوزر|اليوزره}} $1",
        "logentry-upload-upload": " {{GENDER:$2|رفع|اترفعت}} $1 $3",
        "rightsnone": "(فاضى)",
-       "revdelete-summary": "ملخص التعديل",
        "searchsuggest-search": "تدوير",
        "searchsuggest-containing": "جوّاه...",
        "expandtemplates": "تكبير القوالب",
index 70a1442..60ed22d 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": "প্ৰকল্প পৃষ্ঠা চাওক",
        "protectedinterface": "এই পৃষ্ঠাই ৱিকি ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা প্ৰদান কৰে আৰু ইয়াক সুৰক্ষিত কৰি ৰখা হৈছে।\nসকলো ৱিকিৰ বাবে অনুবাদ যোগ কৰিবলৈ বা সলাবলৈ অনুগ্ৰহ কৰি মিডিয়াৱিকি স্থানীয়কৰণ প্ৰকল্প [https://translatewiki.net/ translatewiki.net] ব্যৱহাৰ কৰক।",
        "editinginterface": "<strong>সাৱধানবাণী:</strong> আপুনি সম্পাদনা কৰি থকা পৃষ্ঠাটো এই ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা দিবলৈ ব্যৱহাৰ হয়।\nএই পৃষ্ঠাৰ সাল-সলনিয়ে এই ৱিকিত আন ব্যৱহাৰকাৰীৰ বাবে ইণ্টাৰফে’চত প্ৰভাৱ পেলাব।",
        "translateinterface": "সকলো ৱিকিৰ বাবে অনুবাদ যোগ বা সালসলনি কৰিবৰ বাবে অনুগ্ৰহ কৰি মিডিয়াৱিকি স্থানীয়কৰণ প্ৰকল্প //translatewiki.net/ translatewiki.net] ব্যৱহাৰ কৰক।",
-       "cascadeprotected": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦¸à¦®à§\8dপাদনাৰ à¦ªà§°à¦¾ à¦¸à§\81ৰà¦\95à§\8dষিত à¦\95াৰণ à¦\8fà¦\87 {{PLURAL:$1|পà§\83ষà§\8dঠা, à¦¯à¦¿à¦\9fà§\8b|পà§\83ষà§\8dঠা, যিবোৰ}} \"প্ৰপাতাকাৰ\" (cascading) বিকল্পৰ সহযোগত সুৰক্ষিত কৰা হৈছে: \n$2",
+       "cascadeprotected": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦¸à¦®à§\8dপাদনাৰ à¦ªà§°à¦¾ à¦¸à§\81ৰà¦\95à§\8dষিত à¦\95াৰণ à¦\87 à¦¨à¦¿à¦®à§\8dনà§\8bà¦\95à§\8dত {{PLURAL:$1|পà§\83ষà§\8dঠাত|পà§\83ষà§\8dঠাবà§\8bৰত}} à¦\85নà§\8dতৰà§\8dভà§\81à¦\95à§\8dত, {{PLURAL:$1|যি|যিবোৰ}} \"প্ৰপাতাকাৰ\" (cascading) বিকল্পৰ সহযোগত সুৰক্ষিত কৰা হৈছে: \n$2",
        "namespaceprotected": "আপোনাৰ '''$1''' নামস্থানৰ পৃষ্ঠাসমূহ সম্পাদনা কৰাৰ অধিকাৰ নাই।",
        "customcssprotected": "এই CSS পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত পছন্দসমূহত আছে ।",
        "customjsprotected": "এই জাভালিপিৰ পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত পছন্দসমূহত আছে ।",
        "mypreferencesprotected": "পছন্দসমূহ সম্পাদনা কৰিবলৈ আপোনাৰ অনুমতি  নাই।",
        "ns-specialprotected": "বিশেষ পৃষ্ঠা সম্পাদিত কৰিব নোৱাৰি।",
        "titleprotected": "[[User:$1|$1]] সদস্যজনে এই শিৰোনাণমাৰ লিখনী লিখা ৰোধ কৰিছে ।\nইয়াৰ কাৰণ হৈছে <em>$2</em> ।",
-       "filereadonlyerror": "\"$1\" ফাইলটোক পৰিৱৰ্তন কৰিব পৰা নগ'ল কাৰণ ফাইল ভঁৰাল \"$2\" কেৱল পঢ়িব পৰা অৱস্থাত আছে।\nযিজন প্ৰশাসকে এইটো বন্ধ কৰিছে তেওঁ দৰ্শোৱা কাৰণ হৈছে: ''$3''।",
+       "filereadonlyerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fà§\8bà¦\95 à¦ªà§°à¦¿à§±à§°à§\8dতন à¦\95ৰিব à¦ªà§°à¦¾ à¦¨à¦\97'ল à¦\95াৰণ à¦«à¦¾à¦\87ল à¦­à¦\81ৰাল \"$2\" à¦\95à§\87ৱল à¦ªà¦¢à¦¼à¦¿à¦¬ à¦ªà§°à¦¾ à¦\85ৱসà§\8dথাত à¦\86à¦\9bà§\87।\nযিà¦\9cন à¦\9bà§\80ষà§\8dà¦\9fà§\87ম à¦ªà§\8dৰশাসà¦\95à§\87 à¦\8fà¦\87à¦\9fà§\8b à¦¬à¦¨à§\8dধ à¦\95ৰিà¦\9bà§\87 à¦¤à§\87à¦\93à¦\81 à¦¦à§°à§\8dশà§\8bৱা à¦\95াৰণ à¦¹à§\88à¦\9bà§\87: ''$3''।",
        "invalidtitle-knownnamespace": "নামস্থান \"$2\" আৰু পাঠ্য \"$3\" থকা অবৈধ শিৰোনাম",
        "invalidtitle-unknownnamespace": "অজ্ঞাত নামস্থান সংখ্যা $1 আৰু পাঠ্য \"$2\" থকা অবৈধ শিৰোনাম",
        "exception-nologin": "প্ৰৱেশ কৰা নাই",
        "cannotlogin-text": "প্ৰৱেশ কৰা সম্ভৱ নহয়",
        "cannotloginnow-title": "এতিয়া প্ৰৱেশ কৰিব নোৱাৰি",
        "cannotloginnow-text": "$1 ব্যৱহাৰ কৰাৰ সময়ত প্ৰৱেশ কৰিব নোৱাৰি।",
+       "cannotcreateaccount-title": "একাউণ্ট সৃষ্টি কৰিব নোৱাৰি",
+       "cannotcreateaccount-text": "পোনপটীয়া একাউণ্ট সৃষ্টি এই ৱিকিত সম্ভৱ নহয়।",
        "yourdomainname": "আপোনাৰ ডমেইন:",
        "password-change-forbidden": "আপুনি এই ৱিকিত গুপ্তশব্দ সলাব নোৱাৰে।",
        "externaldberror": "কোনো প্ৰামাণ্যকৰণ তথ্যকোষৰ ত্ৰুটি ঘটিছে নতুবা আপোনাৰ বৰ্হি-একাউণ্ট নৱীকৰণ কৰাৰ অনুমতি নাই ।",
        "login": "প্ৰৱেশ",
+       "login-security": "আপোনাৰ পৰিচয়ৰ প্ৰমাণ দিয়ক",
        "nav-login-createaccount": "প্ৰৱেশ/সদস্যভুক্তি",
-       "userlogin": "প্ৰৱেশ/সদস্যভুক্তি",
-       "userloginnocreate": "প্ৰৱেশ",
        "logout": "প্ৰস্থান",
        "userlogout": "প্ৰস্থান",
        "notloggedin": "প্ৰৱেশ কৰা নাই",
        "userlogin-noaccount": "কোনো একাউণ্ট নাই?",
        "userlogin-joinproject": "{{SITENAME}}ত যোগদান কৰক",
-       "nologin": "ৱিকিপিডিয়াত আপোনাৰ একাউণ্ট নাই নেকি? তেনে '''$1'''।",
-       "nologinlink": "নতুন একাউণ্ট খোলক",
        "createaccount": "সভ্যভুক্ত হবলৈ",
-       "gotaccount": "আপুনি সদস্য হয়নে? '''$1'''",
-       "gotaccountlink": "প্ৰৱেশ",
-       "userlogin-resetlink": "আপোনাৰ প্ৰৱেশ তথ্য পাহৰিছে?",
        "userlogin-resetpassword-link": "আপোনাৰ গুপ্তশব্দ পাহৰিছে?",
        "userlogin-helplink2": "প্ৰৱেশ সংক্ৰান্তীয় সাহায্য",
        "userlogin-loggedin": "আপুনি ইতিমধ্যে {{GENDER:$1|$1}} হিচাপে প্ৰৱেশ কৰিছে। তলৰ আন সদস্যৰূপে প্ৰৱেশ কৰিবলৈ তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰক।",
+       "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-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|পৃষ্ঠা|পৃষ্ঠাসমূহ}}",
        "nocookiesnew": "আপোনাৰ সদস্যভুক্তি হৈ গৈছে, কিন্তু আপুনি প্ৰৱেশ কৰা নাই।\n{{SITENAME}}ত প্ৰৱেশ কৰিবলৈ কুকি সক্ৰিয় থাকিব লাগিব।\nআপুনি কুকি নিষ্ক্ৰিয় কৰি থৈছে।\nঅনুগ্ৰহ কৰি কুকি সক্ৰিয় কৰক, আৰু তাৰ পাছত আপোনাৰ সদস্য নামেৰে প্ৰৱেশ কৰক।",
        "nocookieslogin": "{{SITENAME}} ত প্ৰৱেশ কৰিবলৈ কুকি সক্ৰিয় থাকিব লাগিব।\nআপুনি কুকি নিষ্ক্ৰিয় কৰি থৈছে।\nঅনুগ্ৰহ কৰি কুকি সক্ৰিয় কৰক, আৰু তাৰ পাছত চেষ্টা কৰক।",
        "nocookiesfornew": "সদস্য একাউন্ট সৃষ্টি কৰা নহল, কাৰণ তাৰ উৎস অনিশ্চিত ।\nআপোনাৰ কুকি সক্ৰিয় ৰাখক, এই পৃষ্ঠা ৰি-লোড কৰি পুনৰ চেষ্টা কৰক ।",
+       "createacct-loginerror": "একাউণ্ট সফলতাৰে সৃষ্টি কৰা হ'ল কিন্তু স্বয়ংক্ৰিয়ভাৱে আপোনাৰ প্ৰৱেশ সম্ভৱ নহয়। অনুগ্ৰহ কৰি [[Special:UserLogin|মেনুৱেল প্ৰৱেশ]] কৰক।",
        "noname": "আপুনি বৈধ সদস্যনাম এটা দিয়া নাই।",
-       "loginsuccesstitle": "পà§\8dৰৱà§\87শ à¦\85নà§\81মà§\8bদিত à¦¹'ল",
+       "loginsuccesstitle": "প্ৰৱেশ হ'ল",
        "loginsuccess": "''' আপুনি {{SITENAME}}ত \"$1\" নামেৰে প্ৰৱেশ কৰিলে '''",
-       "nosuchuser": "\"$1\" নামৰ কোনো সদস্য নাই।\nসদস্য নাম আকাৰ সংবেদনশীল।\nআপোনাৰ বানানতো চাওক, বা  [[Special:CreateAccount|নতুন সদস্যভুক্তি কৰক]]।",
+       "nosuchuser": "\"$1\" নামৰ কোনো সদস্য নাই।\nসদস্য নাম আকাৰ সংবেদনশীল।\nআপোনাৰ বানান পৰীক্ষা কৰক, বা  [[Special:CreateAccount|নতুন একাউণ্ট সৃষ্টি কৰক]]।",
        "nosuchusershort": "\"$1\" এই নামৰ কোনো সদস্য নাই ।\nবানানতো আকৌ এবাৰ ভালদৰে চাওক ।",
        "nouserspecified": "সদস্যনাম দিয়া বাধ্যতামূলক।",
        "login-userblocked": "এই সদস্যক নিষেধ কৰা হৈছে। প্ৰৱেশ অসম্ভৱ।",
        "wrongpasswordempty": "দিয়া গুপ্তশব্দতো খালী; অনুগ্ৰহ কৰি আকৌ এবাৰ চেষ্টা কৰক। ।",
        "passwordtooshort": "গুপ্তশব্দ কমেও {{PLURAL:$1|১ টা|$1 টা}} আখৰৰ হ'ব লাগিব ।",
        "passwordtoolong": "গুপ্তশব্দ {{PLURAL:$1|১ টা আখৰতকৈ|$1 টা আখৰতকৈ}} দীঘল হ'ব নোৱাৰে।",
+       "passwordtoopopular": "সাধাৰাণভাৱে নিৰ্বাচিত গুপ্তশব্দ ব্যৱহাৰ কৰিব নোৱাৰি। অনুগ্ৰহ কৰি এটা অনন্য গুপ্তশব্দ ব্যৱহাৰ কৰক।",
        "password-name-match": "আপোনাৰ গুপ্তশব্দ আৰু আপোনাৰ সদস্যনাম বেলেগ হ'ব লাগিব",
        "password-login-forbidden": "এই সদস্যনাম আৰু গুপ্তশব্দৰ ব্যৱহাৰ নিষিদ্ধ কৰা হৈছে ।",
        "mailmypassword": "গুপ্তশব্দ ন-কৈ বহুৱাওক",
        "noemail": "\"$1\" সদস্যজনৰ কোনো ই-মেইল ঠিকনা সঞ্চিত কৰা নাই।",
        "noemailcreate": "আপুনি এটা সঠিক ই-মেইল ঠিকনা দিব লাগিব",
        "passwordsent": "\"$1\" ৰ ই-মেইল ঠিকনাত নতুন গুপ্তশব্দ এটা পঠোৱা হৈছে। অনুগ্ৰহ কৰি সেয়া পোৱাৰ পাছত পুনৰ প্ৰৱেশ কৰক।",
-       "blocked-mailpassword": "à¦\86পà§\8bনাৰ à¦\86à¦\87পি à¦ à¦¿à¦\95নাৰ à¦ªà§°à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95ৰা à¦¬à¦¾à§°à¦£ à¦\95ৰা à¦¹à§\88à¦\9bà§\87, à¦\8fনà§\87 à¦\85ৱসà§\8dথাত à¦¦à§\81ৰà§\8dবà§\8dযৱহাৰ à§°à§\8bধ à¦\95ৰিবলà§\88 à¦\97à§\81পà§\8dতশবà§\8dদ à¦ªà§\81নà¦\83à¦\89দà§\8dধাৰ à¦\95ৰা à¦¸à§\81বিধাà¦\93 à¦¬à¦¾à¦¤à¦¿à¦² à¦\95ৰা à¦¹à§\88à¦\9bà§\87।",
+       "blocked-mailpassword": "à¦\86পà§\8bনাৰ à¦\86à¦\87পি à¦ à¦¿à¦\95নাৰ à¦ªà§°à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95ৰা à¦¬à¦¾à§°à¦£ à¦\95ৰা à¦¹à§\88à¦\9bà§\87, à¦\8fনà§\87 à¦\85ৱসà§\8dথাত à¦¦à§\81ৰà§\8dবà§\8dযৱহাৰ à§°à§\8bধ à¦\95ৰিবলà§\88 à¦\8fà¦\87 à¦\86à¦\87পি à¦ à¦¿à¦\95নাৰ à¦ªà§°à¦¾ à¦\97à§\81পà§\8dতশবà§\8dদ à¦ªà§\81নৰà§\81দà§\8dধাৰ à¦\95ৰা à¦\85নà§\81মতি à¦¦à¦¿à¦¯à¦¼à¦¾ à¦¹à§\8bৱা à¦¨à¦¾à¦\87।",
        "eauthentsent": "সঞ্চিত ই-মেইল ঠিকনালৈ নিশ্চিতকৰণ ই-মেইল এখন পঠিওৱা হৈছে।\nএকাউণ্টটোলৈ আন ই-মেইল পঠিওৱাৰ আগতে আপোনাৰ সদস্যতা নিশ্চিত কৰিবলৈ সেই ই-মেইলত দিয়া নিৰ্দেশনা আপুনি অনু্সৰণ কৰিব লাগিব।",
        "throttled-mailpassword": "যোৱা {{PLURAL:$1|এঘণ্টাত|$1 ঘণ্টাত}} এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হৈছে।\nঅবৈধ ব্যৱহাৰ ৰোধ কৰিবলৈ প্ৰতি {{PLURAL:$1|এঘণ্টাত|$1 ঘণ্টাত}} এবাৰহে গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হ'ব।",
        "mailerror": "ই-মেইল পঠিওৱাত সমস্যা হৈছে: $1",
        "resetpass_submit": "গুপ্তশব্দ বহুৱাওক আৰু প্ৰৱেশ কৰক",
        "changepassword-success": "আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে!",
        "changepassword-throttled": "আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে।\nঅনুগ্ৰহ কৰি $1 সময়ৰ পিছত আকৌ চেষ্টা কৰক।",
+       "botpasswords-label-create": "সৃষ্টি কৰক",
+       "botpasswords-label-update": "আপডেট কৰক",
+       "botpasswords-label-cancel": "বাতিল কৰক",
+       "botpasswords-label-delete": "বিলোপ কৰক",
+       "botpasswords-label-resetpassword": "গুপ্তশব্দ ন-কৈ বহুৱাওক",
+       "botpasswords-label-grants": "প্ৰয়োগযোগ্য অনুমোদন:",
+       "botpasswords-label-grants-column": "অনুমোদিত",
        "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) ৰ বাবে আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ অনুৰোধ জনাইছিল। ইমেইল ঠিকনাটোৰ লগত এই সদস্যৰ {{PLURAL:$3|একাউণ্ট|একাউণ্টবোৰ}} জড়িত হৈ আছে ।\n\n$2\n \n{{PLURAL:$3|এই অস্থায়ী গুপ্তশব্দ|এই অস্থায়ী গুপ্তশব্দবোৰ}} {{PLURAL:$5|এদিনত|$5 দিনত }} নাইকীয়া হ’ব । আপুনি লগ-ইন কৰি এটা নতুন গুপ্তশব্দ দিয়া উচিত । যদি আন কোনোবাই এই অনুৰোধ কৰিছিল, বা আপুনি নিজৰ পূৰ্বৰ গুপ্তশব্দ মনত পেলাইছে আৰু ইয়াক সলাব খোজা নাই, তেন্তে আপুনি এই বাৰ্তাক অগ্ৰাহ্য কৰি নিজৰ পূৰ্বৰ গুপ্তশব্দ ব্যৱহাৰ কৰি থাকিব পাৰে ।",
        "watchthis": "এই পৃষ্ঠাটো লক্ষ্য কৰক",
        "savearticle": "পৃষ্ঠা সাঁচক",
        "savechanges": "সাঁচি থওক",
+       "publishpage": "পৃষ্ঠা প্ৰকাশ কৰক",
+       "publishchanges": "সালসলনি প্ৰকাশ কৰক",
        "preview": "খচৰা",
        "showpreview": "খচৰা চাওক",
        "showdiff": "সালসলনিবোৰ দেখুৱাওক",
-       "blankarticle": "<strong>Warning:</strong>আপুনি সৃষ্টি কৰি থকা পৃষ্ঠাটো খালি।\nযদি আপুনি \"{{int:savearticle}}\" বুটামটোত আকৌ ক্লিক কৰে তেন্তে বিষয়বস্তু অবিহনেই পৃষ্ঠাটো সৃষ্টি হ'ব।",
+       "blankarticle": "<strong>Warning:</strong>আপুনি সৃষ্টি কৰি থকা পৃষ্ঠাটো খালি।\nযদি আপুনি \"$1\" বুটামটোত আকৌ ক্লিক কৰে তেন্তে বিষয়বস্তু অবিহনেই পৃষ্ঠাটো সৃষ্টি হ'ব।",
        "anoneditwarning": "<strong>সতৰ্কবাণী:</strong> আপুনি প্ৰৱেশ কৰা নাই। আপুনি কোনো সম্পাদনা কৰিলে আপোনাৰ আই পি ঠিকনা মুকলিকৈ দৃশ্যমান হ'ব। যদি আপুনি <strong>[$1 লগ্‌ ইন]</strong> বা <strong>[$2 এটা একাউণ্ট সৃষ্টি কৰে]</strong>, তেন্তে আন সুবিধা পোৱাৰ লগতে আপোনাৰ সম্পাদনাসমূহ আপোনাৰ ব্যৱহাৰকাৰী নামত সংৰক্ষিত হ'ব।",
        "anonpreviewwarning": "''আপুনি প্ৰৱেশ কৰা নাই। আপোনাৰ সম্পাদনা সাঁচিলে আপোনাৰ আই-পি ঠিকনা এই পৃষ্ঠাৰ ইতিহাসত সংৰক্ষিত হ'ব।\"",
        "missingsummary": "'''স্মাৰক:''' আপুনি সম্পাদনা সাৰাংশ দিয়া নাই।\nআপুনি আৰু এবাৰ সংৰক্ষণৰ বাবে ক্লিক কৰিলে সাৰাংশৰ অবিহনে সংৰক্ষিত হব।",
-       "selfredirect": "<strong>সতৰ্কবাণী:</strong> আপুনি একেটা নামলৈকে এই পৃষ্ঠাটো পুনঃনিৰ্দেশ কৰিব বিচাৰিছে। আপুনি হয়তো পুনঃনিৰ্দেশৰ বাবে ভুল লক্ষ্য নিৰ্ধাৰণ কৰিছে, বা ভুল পৃষ্ঠা সম্পাদনা কৰিছে।\nআপুনি আকৌ \"{{int:savearticle}}\" ক্লিক কৰিলে পুনঃনিৰ্দেশটো সৃষ্টি হ'ব।",
+       "selfredirect": "<strong>সতৰ্কবাণী:</strong> আপুনি একেটা নামলৈকে এই পৃষ্ঠাটো পুনঃনিৰ্দেশ কৰিব বিচাৰিছে। আপুনি হয়তো পুনঃনিৰ্দেশৰ বাবে ভুল লক্ষ্য নিৰ্ধাৰণ কৰিছে, বা ভুল পৃষ্ঠা সম্পাদনা কৰিছে।\nআপুনি আকৌ \"$1\" ক্লিক কৰিলে পুনঃনিৰ্দেশটো সৃষ্টি হ'ব।",
        "missingcommenttext": "অনুগ্ৰহ কৰি তলত মন্তব্য এটা দিয়ক।",
-       "missingcommentheader": "'''স্মাৰক:''' আপুনি এই মন্তব্যটোত শিৰোনামা দিয়া নাই।\nযদি আকৌ এবাৰ যদি \"{{int:savearticle}}\" টিপে, তেনেহলে সম্পাদনা শিৰোনামা অবিহনে সংৰক্ষিত হব।",
+       "missingcommentheader": "'''স্মাৰক:''' আপুনি এই মন্তব্যটোত শিৰোনামা দিয়া নাই।\nযদি আকৌ এবাৰ যদি \"$1\" টিপে, তেনেহলে সম্পাদনা শিৰোনামা অবিহনে সংৰক্ষিত হব।",
        "summary-preview": "সাৰাংশৰ খচৰা:",
        "subject-preview": "বিষয়/শিৰোনামাৰ খচৰা:",
        "previewerrortext": "আপোনাৰ সালসলনিৰ প্ৰাক্‌দৰ্শন কৰাত কিবা ত্ৰুটি হৈছে।",
        "editingsection": "$1 (অনুচ্ছেদ) সম্পাদনা কৰি আছে",
        "editingcomment": "$1 (নতুন অনুচ্ছেদ) সম্পাদনা কৰি আছে",
        "editconflict": "সম্পাদনা দ্বন্দ্ব: $1",
-       "explainconflict": "আপুনি সম্পাদনা আৰম্ভ কৰাৰ পাছত আন কোনোবাই এই পৃষ্ঠাটো সলনি কৰিলে।\nপাঠ্য-স্থানৰ উপৰ ভাগত এই পৃষ্ঠাৰ প্ৰচলিত পাঠ্য দিয়া হৈছে।\nআপোনাৰ সলনিসমূহ পাঠ্য-স্থানৰ তলৰ ভাগত দেখুওৱা হৈছে।\nআপুনি আপোনাৰ সালসলনিসমূহ প্ৰচলিত পাঠ্যত অন্তৰ্ভুক্ত কৰিব পাৰে।\nআপুনি \"{{int:savearticle}}\" টিপিলে '''কেৱল''' পাঠ্য-স্থানৰ উপৰ ভাগৰ অংশখিনিহে সংৰক্ষিত হ'ব ।",
+       "explainconflict": "আপুনি সম্পাদনা আৰম্ভ কৰাৰ পাছত আন কোনোবাই এই পৃষ্ঠাটো সলনি কৰিলে।\nপাঠ্য-স্থানৰ উপৰ ভাগত এই পৃষ্ঠাৰ প্ৰচলিত পাঠ্য দিয়া হৈছে।\nআপোনাৰ সলনিসমূহ পাঠ্য-স্থানৰ তলৰ ভাগত দেখুওৱা হৈছে।\nআপুনি আপোনাৰ সালসলনিসমূহ প্ৰচলিত পাঠ্যত অন্তৰ্ভুক্ত কৰিব পাৰে।\nআপুনি \"$1\" টিপিলে '''কেৱল''' পাঠ্য-স্থানৰ উপৰ ভাগৰ অংশখিনিহে সংৰক্ষিত হ'ব ।",
        "yourtext": "আপুনি লিখা পাঠ",
        "storedversion": "জমা সংস্কৰণ",
        "nonunicodebrowser": "'''সতৰ্কবাণী: আপোনাৰ ব্ৰাউজাৰ ইউনিক’ড-ভাৱাপন্ন নহয় ।'''\nআপুনি ঠিকমতে সম্পাদনা কৰিব পৰাকৈ সমাধান আছে: non-ASCII কেৰেক্টাৰবোৰ সম্পাদনা ক্ষেত্ৰত hexadecimal ক’ড হিছাপে দেখা যাব ।",
        "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-file-match": "(ফাইলৰ বিষয়বস্তুৰ লগত মিল পোৱা গৈছে)",
        "search-suggest": "আপুনি $1 বুজাব খুজিছে নেকি?",
        "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": "আপুনি সলনি কৰিব নোৱাৰা গোটসমূহ",
        "userrights-conflict": "সদস্য অধিকাৰ সালসলনিৰ দ্বন্দ্ব! অনুগ্ৰহ কৰি পুনৰাই চকু ফুৰাই আপোনাৰ সালসলনি নিশ্চিত কৰক।",
-       "userrights-removed-self": "আপুনি সফলতাৰে নিজৰ অধিকাৰসমূহ আঁতৰ কৰিলে। গতিকে আপুনি এতিয়া এই পৃষ্ঠা চাব নোৱাৰে।",
        "group": "গোট:",
        "group-user": "সদস্যসকল",
        "group-autoconfirmed": "স্বয়ংনিশ্চিত সদস্য",
        "right-editprotected": "\"{{int:protect-level-sysop}}\" হিচাপে সুৰক্ষিত পৃষ্ঠা সম্পাদনা কৰক",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" হিচাপে সুৰক্ষিত পৃষ্ঠা সম্পাদনা কৰক",
        "right-editinterface": "সদস্যৰ ইণ্টাৰফে’চ সম্পাদনা কৰক",
-       "right-editusercssjs": "আন সদস্যৰ CSS আৰু JavaScript  সম্পাদনা কৰক",
        "right-editusercss": "আন সদস্যৰ CSS ফাইল সম্পাদনা কৰক",
        "right-edituserjs": "আন সদস্যৰ JavaScript ফাইল  সম্পাদনা কৰক",
        "right-editmyusercss": "আপোনাৰ নিজৰ সদস্য CSS ফাইলসমূহ সম্পাদনা কৰক।",
        "right-siteadmin": "তথ্যকোষ বন্ধ কৰক বা খোলক",
        "right-override-export-depth": "৫ম স্তৰ পৰ্যন্ত সংযুক্ত পৃষ্ঠাসহ সকলো পৃষ্ঠা ৰপ্তানী কৰক",
        "right-sendemail": "আন সদস্যলৈ ই-পত্ৰ ঠিকনা পঠিয়াওক",
-       "right-passwordreset": "পাছৱৰ্ড ৰি-চেটৰ ই-মেইলসমূহ দেখুৱাওক",
        "newuserlogpage": "সদস্যৰ সৃষ্টি অভিলেখ",
        "newuserlogpagetext": "এইখন এখন সদস্য সৃষ্টিৰ ল’গ।",
        "rightslog": "সদস্যৰ অধিকাৰৰ লেখ",
        "rcshowhidemine-hide": "লুকুৱাওক",
        "rcshowhidecategorization-show": "দেখুৱাওক",
        "rcshowhidecategorization-hide": "লুকুৱাওক",
-       "rclinks": "যোৱা $2 দিনত হোৱা $1 টা সাল-সলনি চাওক ।<br />$3",
+       "rclinks": "যোৱা $2 দিনত হোৱা $1 টা সাল-সলনি চাওক ।",
        "diff": "পাৰ্থক্য",
        "hist": "ইতিবৃত্ত",
        "hide": "দেখুৱাব নালাগে",
        "undeleteviewlink": "দেখুৱাওক",
        "undeleteinvert": "নিৰ্বাচন ওলোটা কৰক",
        "undeletecomment": "কাৰণ:",
-       "undeletedrevisions": "{{PLURAL:$1|১টা সংশোধন|$1টা সংশোধন}} পুনৰুদ্ধাৰ কৰা হৈছে",
-       "undeletedrevisions-files": "{{PLURAL:$1|১টা সংশোধন|$1 টা সংশোধন}} আৰু {{PLURAL:$2|১ খন নথি|$2 খন নথি}} পুনৰুদ্ধাৰ কৰা হ’ল",
-       "undeletedfiles": "{{PLURAL:$1|১খন নথি|$1 খন নথি}} পুনৰুদ্ধাৰ কৰা হ’ল",
        "cannotundelete": "বিলোপ বাতিলকৰণ বিফল হৈছে;\n$1",
        "undeletedpage": "'''$1ক পুনৰুদ্ধাৰ কৰা হৈছে'''\nঅনুগ্ৰহ কৰি শেহতীয়া অৱলুপ্তি আৰু পুনৰুদ্ধাৰৰ বাবে [[Special:Log/delete|অৱলুপ্তি অভিলেখ]] চাওক ।",
        "undelete-header": "শেহতীয়াকৈ বিলোপ কৰা পৃষ্ঠাসমূহৰ বাবে [[Special:Log/delete|অৱলুপ্তি ল’গ]] চাওক ।",
        "whatlinkshere-prev": "{{PLURAL:$1|পিছৰ|পিছৰ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|আগৰ|আগৰ $1}}",
        "whatlinkshere-links": "← সংযোগকেইটা",
-       "whatlinkshere-hideredirs": "$1 পুননিৰ্দেশনাসমূহ",
-       "whatlinkshere-hidetrans": "$1 à¦\9fà§\8dৰà§\87নà§\8dসà¦\95à§\8dলà§\81সà§\8dবনসমà§\82হ",
+       "whatlinkshere-hideredirs": "$1টা পুনঃনিৰ্দেশ",
+       "whatlinkshere-hidetrans": "$1 à¦\85নà§\8dতৰà§\8dভà§\81à¦\95à§\8dতà¦\95ৰণ",
        "whatlinkshere-hidelinks": "$1 টা সংযোগ",
        "whatlinkshere-hideimages": "$1 ফাইল সংযোগসমূহ",
        "whatlinkshere-filters": "ছেকনী",
        "logentry-rights-autopromote": "$1ক  $4ৰ পৰা $5লৈ স্বয়ংক্ৰিয়ভাৱে পদোন্নীত কৰা হ’ল",
        "logentry-upload-upload": "$1 $3 {{GENDER:$2|আপল'ড কৰা হ'ল}}",
        "rightsnone": "(নাই)",
-       "revdelete-summary": "সম্পাদনাৰ সাৰমৰ্ম",
        "feedback-adding": "পৃষ্ঠাত প্ৰতিক্ৰিয়া যোগ কৰা হৈছে...",
        "feedback-bugcheck": "অতি উত্তম! কেৱল পৰীক্ষা কৰক যে ই ইতিমধ্যে [$1 জ্ঞাত বাগসমূহ]ৰ এটা নহয়।",
        "feedback-bugnew": "মই পৰীক্ষা কৰিলো। এটা নতুন বাগ সংবাদন কৰক",
        "feedback-subject": "বিষয়:",
        "feedback-submit": "দাখিল কৰক",
        "feedback-thanks": "ধন্যবাদ ! আপোনাৰ প্ৰতিক্ৰিয়া \"[$2 $1]\" পৃষ্ঠাত প্ৰকাশ কৰা হৈছে।",
-       "searchsuggest-search": "সন্ধান কৰক",
+       "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|অনুমোদিত ফাইল প্ৰকাৰ নহয়|সমূহ অনুমোদিত ফাইল প্ৰকাৰ নহয়}}। অনুমোদিত {{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-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 4f8b695..7d57520 100644 (file)
        "redirectedfrom": "(Redirixío dende $1)",
        "redirectpagesub": "Páxina de redireición",
        "redirectto": "Redirixe a:",
-       "lastmodifiedat": "L'últimu cambiu d'esta páxina foi el $1, a les $2.",
+       "lastmodifiedat": "La última edición d'esta páxina foi el $1, a les $2.",
        "viewcount": "Esta páxina visitóse {{PLURAL:$1|una vegada|$1 vegaes}}.",
        "protectedpage": "Páxina protexida",
        "jumpto": "Saltar a:",
        "login": "Entrar",
        "login-security": "Comprobación d'identidá",
        "nav-login-createaccount": "Entrar / crear cuenta",
-       "userlogin": "Entrar / crear cuenta",
-       "userloginnocreate": "Aniciar sesión",
        "logout": "Salir",
        "userlogout": "Salir",
        "notloggedin": "Nun anició sesión",
        "userlogin-noaccount": "¿Nun tien una cuenta?",
        "userlogin-joinproject": "Xunise a {{SITENAME}}",
-       "nologin": "¿Nun tienes una cuenta? $1.",
-       "nologinlink": "Crear una cuenta",
        "createaccount": "Crear una cuenta",
-       "gotaccount": "¿Yá tienes una cuenta? $1.",
-       "gotaccountlink": "Aniciar sesión",
-       "userlogin-resetlink": "¿Escaeció los datos d'accesu?",
        "userlogin-resetpassword-link": "¿Escaeció la contraseña?",
        "userlogin-helplink2": "Ayuda del aniciu de sesión",
        "userlogin-loggedin": "Yá anició sesión como {{GENDER:$1|$1}}.\nUtilice'l formulariu de más abaxo p'aniciar sesión como otru usuariu.",
        "createaccountmail": "Usar una contraseña al debalu temporal y unviala a la direición de corréu electrónicu conseñada",
        "createaccountmail-help": "Pue usase pa crear una cuenta pa otra persona ensin saber la contraseña.",
        "createacct-realname": "Nome real (opcional)",
-       "createaccountreason": "Motivu:",
        "createacct-reason": "Motivu",
        "createacct-reason-ph": "Por qué quier crear otra cuenta",
        "createacct-reason-help": "Mensaxe que s'amuesa nel rexistru de creación de cuentes",
        "preview": "Vista previa",
        "showpreview": "Amosar previsualización",
        "showdiff": "Amosar cambeos",
-       "blankarticle": "<strong>Atención:</strong> La páxina que tas a piques de crear ta balera.\nSi vuelves a facer click en «{{int:savearticle}}», crearáse la páxina ensin conteníu dengún.",
+       "blankarticle": "<strong>Atención:</strong> La páxina que tas a piques de crear ta balera.\nSi vuelves a facer click en «$1», crearáse la páxina ensin conteníu dengún.",
        "anoneditwarning": "<strong>Avisu:</strong> Nun aniciasti sesión. La direición IP sedrá visible en público si faes dalguna edición. Si <strong>[$1 anicies sesión]</strong> o <strong>[$2 crees una cuenta]</strong>, les ediciones atribuiránse al to nome d'usuariu, xunto con otros beneficios.",
        "anonpreviewwarning": "''Nun aniciasti sesión. Al guardar quedará rexistrada la to direición IP nel historial d'edición d'esta páxina.''",
-       "missingsummary": "'''Recordatoriu:''' Nun conseñasti un resume d'edición.\nSi calques nuevamente \"{{int:savearticle}}\", la to edición guardaráse ensin nengún resume.",
-       "selfredirect": "<strong>Atención:</strong> Tas redirixendo esta páxina a ella mesma.\nSeique conseñaras un oxetivu enquivocáu pa la redireición, o que teas editando una páxina enquivocada. Si vuelves a facer clic en «{{int:savearticle}}», crearáse la redireición de toles maneres.",
+       "missingsummary": "'''Recordatoriu:''' Nun conseñasti un resume d'edición.\nSi calques nuevamente \"$1\", la to edición guardaráse ensin nengún resume.",
+       "selfredirect": "<strong>Atención:</strong> Tas redirixendo esta páxina a ella mesma.\nSeique conseñaras un oxetivu enquivocáu pa la redireición, o que teas editando una páxina enquivocada. Si vuelves a facer clic en «$1», crearáse la redireición de toles maneres.",
        "missingcommenttext": "Por favor, escribi un comentariu abaxo.",
-       "missingcommentheader": "<strong>Recordatoriu:</strong> Nun conseñasti un asuntu pa esti comentariu.\nSi calques nuevamente «{{int:savearticle}}», la to edición guardaráse ensin nengunu.",
-       "summary-preview": "Vista previa del resume:",
+       "missingcommentheader": "<strong>Recordatoriu:</strong> Nun conseñasti un asuntu pa esti comentariu.\nSi calques nuevamente «$1», la to edición guardaráse ensin nengunu.",
+       "summary-preview": "Vista previa del resume d'edición:",
        "subject-preview": "Vista previa del asuntu:",
        "previewerrortext": "Hebo un error al intentar entever los cambios.",
        "blockedtitle": "L'usuariu ta bloquiáu",
        "editingsection": "Editando $1 (seición)",
        "editingcomment": "Editando $1 (seición nueva)",
        "editconflict": "Conflictu d'edición: $1",
-       "explainconflict": "Daquién más camudó esta páxina dende qu'empecipiasti a editala.\nL'área de testu d'arriba contien el testu de la páxina como ta nestos momentos.\nLos tos cambios s'amuesen nel área de testu d'abaxo.\nVas tener que fusionar los tos cambios dientro del testu esistente.\n'''Namái''' va guardase'l testu del área d'arriba cuando calques \"{{int:savearticle}}\".",
+       "explainconflict": "Daquién más camudó esta páxina dende qu'empecipiasti a editala.\nL'área de testu d'arriba contien el testu de la páxina como ta nestos momentos.\nLos tos cambios s'amuesen nel área de testu d'abaxo.\nVas tener que fusionar los tos cambios dientro del testu esistente.\n'''Namái''' va guardase'l testu del área d'arriba cuando calques \"$1\".",
        "yourtext": "El to testu",
        "storedversion": "Versión almacenada",
        "nonunicodebrowser": "'''Avisu: El to navegador nun cumple la norma Unicode.''' Hai un sistema alternativu que te permite editar páxines de forma segura: los caráuteres non-ASCII apaecerán nel cuadru d'edición como códigos hexadecimales.",
        "readonlywarning": "<strong>Avisu: La base de datos ta candada por mantenimientu, polo que nun vas poder guardar les tos ediciones nestos momentos.</strong>\nSeique habríes copiar y apegar el testu nun ficheru de testu y guardalu pa intentalo sero.\n\nL'alministrador del sistema que la candó dio esta esplicación: $1",
        "protectedpagewarning": "'''Avisu: Esta páxina ta candada pa que sólo los alministradores puean editala.'''\nLa cabera entrada del rexistru s'ufre darréu pa referencia:",
        "semiprotectedpagewarning": "'''Nota:''' Esta páxina ta candada pa que nun puean editala namái que los usuarios rexistraos.\nLa cabera entrada del rexistru s'ufre darréu pa referencia:",
-       "cascadeprotectedwarning": "<strong>Avisu:</strong> Esta páxina ta candada pa que namái los alministradores puedan editala porque ta trescluída {{PLURAL:$1|na siguiente páxina protexida|nes siguientes páxines protexíes}} en cascada:",
+       "cascadeprotectedwarning": "<strong>Avisu:</strong> Esta páxina ta candada pa que namái los usuarios con [[Special:ListGroupRights|determinaos permisos]] puedan editala porque ta trescluída {{PLURAL:$1|na siguiente páxina protexida|nes siguientes páxines protexíes}} en cascada:",
        "titleprotectedwarning": "'''Avisu: Esta páxina ta candada pa que necesite [[Special:ListGroupRights|permisos especiales]] pa creala.'''\nLa cabera entrada del rexistru s'ufre darréu pa referencia:",
        "templatesused": "{{PLURAL:$1|Plantía usada|Plantíes usaes}} nesta páxina:",
        "templatesusedpreview": "{{PLURAL:$1|Plantía usada|Plantíes usaes}} nesta vista previa:",
        "post-expand-template-argument-warning": "<strong>Avisu:</strong> Esta páxina contien polo menos un parámetru de plantía que tien un tamañu d'espansión demasiao llargu.\nEstos parámetros s'omitieron.",
        "post-expand-template-argument-category": "Páxines con parámetros de plantía omitíos",
        "parser-template-loop-warning": "Deteutóse un bucle de plantíes: [[$1]]",
+       "template-loop-category": "Páxines con bucles de plantíes",
+       "template-loop-category-desc": "Esta páxina contien un bucle de plantía, esto ye, una plantía que se llama ella mesma de mou recursivu.",
        "parser-template-recursion-depth-warning": "Se pasó la llende de fondura recursiva de les plantíes ($1)",
        "language-converter-depth-warning": "Se pasó la llende de fondura del convertidor de llingües ($1)",
        "node-count-exceeded-category": "Páxines onde se pasó la cuenta de noyos",
        "page_first": "primera",
        "page_last": "cabera",
        "histlegend": "Seleición de diferencies: marca los botones de les versiones que quies comparar y calca <i>enter</i> o al botón d'abaxo.<br />\nLleenda: '''({{int:cur}})''' = diferencies cola versión actual, '''({{int:last}})''' = diferencies cola versión anterior, '''{{int:minoreditletter}}''' = edición menor.",
-       "history-fieldset-title": "Navegar pel historial",
-       "history-show-deleted": "Sólo desaniciaes",
+       "history-fieldset-title": "Buscar revisiones",
+       "history-show-deleted": "Sólo desaniciaes por revisión",
        "histfirst": "lo más antiguo",
        "histlast": "lo más nuevo",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "search-file-match": "(casa col conteníu del ficheru)",
        "search-suggest": "Quixisti dicir: $1",
        "search-rewritten": "Amosando los resultaos pa $1. O meyor, buscar $2.",
-       "search-interwiki-caption": "Proyeutos hermanos",
+       "search-interwiki-caption": "Resultaos de proyeutos hermanos",
        "search-interwiki-default": "Resultaos de $1:",
        "search-interwiki-more": "(más)",
        "search-interwiki-more-results": "más resultaos",
        "prefs-help-prefershttps": "Esta preferencia aplicaráse nel siguiente aniciu de sesión.",
        "prefswarning-warning": "Ficisti cambios nes tos preferencies qu'inda nun se guardaron.\nSi abandones esta páxina ensin calcar \"$1\" les preferencies nun s'anovarán.",
        "prefs-tabs-navigation-hint": "Gabitu: pue usar les tecles de flecha izquierda y drecha pa navegar peles llingüetes de la llista.",
-       "userrights": "Xestión de permisos d'usuariu",
+       "userrights": "Permisos d'usuariu",
        "userrights-lookup-user": "Seleiciona un usuariu",
        "userrights-user-editname": "Escribe un nome d'usuariu:",
        "editusergroup": "Cargar 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:",
-       "userrights-groups-help": "Pues camudar los grupos a los que pertenez esti usuariu.\n* Un caxellu marcáu significa que l'usuariu ta nesi grupu.\n* Un caxellu non marcáu significa que l'usuariu nun ta nesi grupu.\n* Un * indica que nun pues desaniciar el grupu una vegada tea inxeríu, o viceversa.\n* Un # indica que namái puede atrasase la fecha de caducidá d'esti grupu; nun puede adelantase.",
+       "userrights-groups-help": "Pues camudar los grupos a los que pertenez esti usuariu.\n* Un caxellu marcáu significa que l'usuariu ta nesi grupu.\n* Un caxellu non marcáu significa que l'usuariu nun ta nesi grupu.\n* Un * indica que nun pues desaniciar el grupu una vegada tea inxeríu, o viceversa.\n* Un # indica que namái puede atrasase la fecha de caducidá de la pertenencia a esti grupu; nun puede adelantase.",
        "userrights-reason": "Motivu:",
        "userrights-no-interwiki": "Nun tienes permisu pa editar los derechos d'usuariu n'otres wikis.",
        "userrights-nodatabase": "La base de datos $1 nun esiste o nun ye llocal.",
        "userrights-expiry-options": "1 día:1 day,1 selmana:1 week,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 añu:1 year",
        "userrights-invalid-expiry": "La hora de caducidá del grupu «$1» nun ye válida.",
        "userrights-expiry-in-past": "La hora de caducidá del grupu «$1» ta nel pasáu",
-       "userrights-cannot-shorten-expiry": "Nun puedes adelantar la caducidá del grupu «$1». Sólo los usuarios con permisu p'amestar y desaniciar esti grupu pueden adelantar les dates de caducidá.",
+       "userrights-cannot-shorten-expiry": "Nun puedes adelantar la caducidá de la pertenencia al grupu «$1». Sólo los usuarios con permisu p'amestar y desaniciar esti grupu pueden adelantar les dates de caducidá.",
        "userrights-conflict": "¡Conflictu de cambiu de permisos d'usuariu! Por favor, revise y confirme los cambios.",
        "group": "Grupu:",
        "group-user": "Usuarios",
        "right-editsemiprotected": "Editar les páxines protexíes como \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Editar el modelu de conteníu d'una páxina",
        "right-editinterface": "Editar la interfaz d'usuariu",
-       "right-editusercssjs": "Editar los ficheros CSS y JavaScript d'otros usuarios",
        "right-editusercss": "Editar los ficheros CSS d'otros usuarios",
        "right-edituserjs": "Editar los ficheros JavaScript d'otros usuarios",
        "right-editmyusercss": "Editar los propios ficheros CSS d'usuariu",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Amosar",
        "rcfilters-activefilters": "Filtros activos",
+       "rcfilters-quickfilters": "Enllaces rápidos",
+       "rcfilters-quickfilters-placeholder-title": "Entá nun se guardaron enllaces",
+       "rcfilters-quickfilters-placeholder-description": "Pa guardar les preferencies del filtru y volver a usales sero, pulsia nel iconu del marcador del área de Filtru Activu más abaxo.",
+       "rcfilters-savedqueries-defaultlabel": "Filtros guardaos",
+       "rcfilters-savedqueries-rename": "Renomar",
+       "rcfilters-savedqueries-setdefault": "Guardar como predeterminao",
+       "rcfilters-savedqueries-unsetdefault": "Quitar predeterminao",
+       "rcfilters-savedqueries-remove": "Desaniciar",
+       "rcfilters-savedqueries-new-name-label": "Nome",
+       "rcfilters-savedqueries-apply-label": "Crear enllaz rápidu",
+       "rcfilters-savedqueries-cancel-label": "Encaboxar",
+       "rcfilters-savedqueries-add-new-title": "Guardar filtros como enllaz rápidu",
        "rcfilters-restore-default-filters": "Restaurar los filtros predeterminaos",
        "rcfilters-clear-all-filters": "Borrar tolos filtros",
        "rcfilters-search-placeholder": "Filtriar los cambeos recién (restola o empieza a escribir)",
        "rcfilters-invalid-filter": "Filtru inválidu",
        "rcfilters-empty-filter": "Nun hai filtros activos. Amuésense toles contribuciones.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "¿Qué ye esto?",
+       "rcfilters-filterlist-feedbacklink": "Comentar sobro los nuevos filtros (beta)",
+       "rcfilters-highlightbutton-title": "Resaltar resultaos",
+       "rcfilters-highlightmenu-title": "Seleiciona un color",
+       "rcfilters-highlightmenu-help": "Seleiciona un color pa resaltar esta propiedá",
        "rcfilters-filterlist-noresults": "Nun s'alcontraron filtros",
+       "rcfilters-noresults-conflict": "Nun s'alcontraron resultaos porque los criterios de gueta tán en conflictu",
+       "rcfilters-state-message-subset": "Esti filtru nun fai efeutu porque los resultaos inclúyense ente los {{PLURAL:$2|del siguiente filtru más ampliu|de los siguientes filtros más amplios}} (tenta resaltalu pa estremalu): $1",
+       "rcfilters-state-message-fullcoverage": "Seleicionar tolos filtros d'un grupu ye igual que nun seleicionar nengunu, de manera qu'esti filtru nun tien efeutu. El grupu incluye: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "Esti filtru fai conflictu {{PLURAL:$2|col siguiente filtru|colos siguientes filtros}} Experience, qu'{{PLURAL:$2|alcuentra|alcuentren}} sólo usuarios rexistraos: $1",
+       "rcfilters-filtergroup-authorship": "Autoría de la contribución",
+       "rcfilters-filter-editsbyself-label": "Cambios de to",
+       "rcfilters-filter-editsbyself-description": "Contribuciones de to.",
+       "rcfilters-filter-editsbyother-label": "Cambios d'otros",
+       "rcfilters-filter-editsbyother-description": "Tolos cambios menos los de to.",
        "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-user-experience-level-conflicts-unregistered": "Los filtros Experience alcuentren sólo usuarios rexistraos, de manera qu'esti filtru entra en conflictu col filtru «Sin rexistrar».",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "El filtru «Ensin rexistrar» tien un conflictu con un filtru Experience o más, qu'alcuentren sólo usuarios rexistraos. Los filtros que tienen un conflictu márquense nel área de Filtros activos, más arriba.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Recién llegaos",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Menos de 10 ediciones y 4 díes d'actividá.",
+       "rcfilters-filter-user-experience-level-learner-label": "Aprendices",
+       "rcfilters-filter-user-experience-level-learner-description": "Más esperiencia que los «Recién llegaos», pero menos que los «Usuarios espertos».",
+       "rcfilters-filter-user-experience-level-experienced-label": "Usuarios espertos",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Estáu de revisión",
+       "rcfilters-filter-patrolled-label": "Patrullaes",
+       "rcfilters-filter-patrolled-description": "Ediciones marcaes como patrullaes.",
+       "rcfilters-filter-unpatrolled-label": "Sin patrullar",
+       "rcfilters-filter-unpatrolled-description": "Ediciones sin marcar como patrullaes.",
        "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-watchlist": "Páxines vixilaes",
+       "rcfilters-filter-watchlist-watched-label": "Na llista de siguimientu",
+       "rcfilters-filter-watchlist-watched-description": "Cambios nes páxines de la llista de siguimientu.",
+       "rcfilters-filter-watchlist-watchednew-label": "Cambios recién na llista de siguimientu",
+       "rcfilters-filter-watchlist-watchednew-description": "Cambios nes páxines de la llista de siguimientu que nun visitasti desque asocedieron los cambios.",
+       "rcfilters-filter-watchlist-notwatched-label": "Nun ta na llista de siguimientu",
+       "rcfilters-filter-watchlist-notwatched-description": "Too menos los cambios nes páxines de la llista de siguimientu.",
        "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-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...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "El filtru «Ediciones menores» fai conflictu con un filtru «Tipu de cambiu» o más, porque dellos tipos de cambiu nun pueden designase como «menores». Los filtros que faen conflictu tan marcaos nel área de Filtros Activos, más arriba.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Dellos tipos de cambiu nun pueden designase como «menores», de manera qu'esti filtru fai conflictu colos siguientes filtros «Tipu de cambiu»: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Esti filtru de «Tipu de cambiu» fai conflictu col filtru «Ediciones menores». Dellos tipos de cambiu nun pueden designase como «menores».",
+       "rcfilters-filtergroup-lastRevision": "Última revisión",
+       "rcfilters-filter-lastrevision-label": "Última revisión",
+       "rcfilters-filter-lastrevision-description": "El cambio más recien d'una páxina.",
+       "rcfilters-filter-previousrevision-label": "Revisiones anteriores",
+       "rcfilters-filter-previousrevision-description": "Tolos cambios que nun son los más recien d'una páxina.",
        "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>).",
+       "rclistfromreset": "Reaniciar la seleición de data",
        "rclistfrom": "Amosar los nuevos cambios dende'l $3 a les $2",
        "rcshowhideminor": "$1 ediciones menores",
        "rcshowhideminor-show": "Amosar",
        "rcshowhidecategorization": "$1 la categorización de páxina",
        "rcshowhidecategorization-show": "Amosar",
        "rcshowhidecategorization-hide": "Tapecer",
-       "rclinks": "Amosar los caberos $1 cambeos de los caberos $2 díes <br />$3",
+       "rclinks": "Amosar los caberos $1 cambeos de los caberos $2 díes",
        "diff": "dif",
        "hist": "hist",
        "hide": "Anubrir",
        "php-uploaddisabledtext": "Les xubíes de ficheros tan desactivaes en PHP.\nPor favor, comprueba la configuración de file_uploads.",
        "uploadscripted": "Esti ficheru contien códigu HTML o scripts que pueden interpretase de mou equivocáu por un navegador.",
        "upload-scripted-pi-callback": "Nun puede xubise un ficheru que contien instrucciones de procesamientu XML de fueya d'estilu.",
+       "upload-scripted-dtd": "Nun pueden xubise ficheros SVG que contengan una declaración DTD non estándar.",
        "uploaded-script-svg": "Alcontróse l'elementu «$1» que puede recibir scripts nel ficheru SVG xubíu.",
        "uploaded-hostile-svg": "Alcontróse CSS inseguru nel elementu d'estilu del ficheru SVG xubíu.",
        "uploaded-event-handler-on-svg": "Nun se permite configurar los atributos de controladores de socesos <code>$1=\"$2\"</code> nos ficheros SVG.",
        "enotif_body_intro_moved": "{{GENDER:$2|$2}} treslladó la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.",
        "enotif_body_intro_restored": "{{GENDER:$2|$2}} restauró la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.",
        "enotif_body_intro_changed": "{{GENDER:$2|$2}} camudó la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.",
-       "enotif_lastvisited": "Mira en $1 pa ver tolos cambios dende la cabera visita.",
-       "enotif_lastdiff": "Mira en $1 pa ver esti cambéu.",
+       "enotif_lastvisited": "Pa ver tolos cambios dende la cabera visita, mira en $1",
+       "enotif_lastdiff": "Pa ver esti cambiu mira en $1",
        "enotif_anon_editor": "usuariu anónimu $1",
        "enotif_body": "Estimáu $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResume del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nPa comunicate col editor:\ncorréu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nEn casu de producise más actividá, nun habrá más notificaciones a nun ser que visites esta páxina teniendo sesión aniciada. Tamién podríes reaniciar na to llista de siguimientu los marcadores de notificación de toles páxines que sigues.\n\nEl to abertable sistema de notificación de {{SITENAME}}\n\n--\nPa camudar les preferencies d'avisos per corréu, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPa camudar la configuración de la to llista de siguimientu, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPa desaniciar la páxina de la to llista de siguimientu, visita\n$UNWATCHURL\n\nMás ayuda y sofitu:\n$HELPPAGE",
        "created": "creada",
        "editcomment": "El resume de la edición yera: <em>$1</em>.",
        "revertpage": "Revertíes les ediciones de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]]) hasta la cabera versión de [[User:$1|$1]]",
        "revertpage-nouser": "Revertíes les ediciones de (usuariu desaniciáu) a la cabera revisión de {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Revertíes les ediciones de $1; camudáu a la última versión de $2.",
+       "rollback-success": "Revertíes les ediciones de {{GENDER:$3|$1}}; devueltu a la última revisión de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertíes les ediciones de $1 a la última revisión de $2. [$3 Ver cambeos]",
        "sessionfailure-title": "Fallu de sesión",
        "sessionfailure": "Paez qu'hai un problema cola to sesión; por precaución\ncancelóse l'aición que pidisti. Da-y al botón \"Atrás\" del\nnavegador pa cargar otra vuelta la páxina y vuelve a intentalo.",
        "undeleteviewlink": "ver",
        "undeleteinvert": "Invertir seleición",
        "undeletecomment": "Motivu:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revisión restaurada|$1 revisiones restauraes}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivu|$2 archivos}} restauraos",
-       "undeletedfiles": "{{PLURAL:$1|1 archivu restauráu|$1 archivos restauraos}}",
        "cannotundelete": "Falló total o parcialmente la restauración:\n$1",
        "undeletedpage": "'''Restauróse $1'''\n\nConsulta'l [[Special:Log/delete|rexistru d'esborraos]] pa ver los esborraos y restauraciones de recién.",
        "undelete-header": "Mira nel [[Special:Log/delete|rexistru d'esborraos]] les páxines esborraes recién.",
        "sp-contributions-uploads": "xubes",
        "sp-contributions-logs": "rexistros",
        "sp-contributions-talk": "alderique",
-       "sp-contributions-userrights": "xestión de permisos d'usuariu",
+       "sp-contributions-userrights": "xestión de permisos d'{{GENDER:$1|usuariu|usuaria}}",
        "sp-contributions-blocked-notice": "Esti usuariu anguaño ta bloquiáu.\nLa cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
        "sp-contributions-blocked-notice-anon": "Esta IP anguaño ta bloquiada.\nLa cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
        "sp-contributions-search": "Buscar contribuciones",
        "unblocked-id": "Desaniciose'l bloquéu $1.",
        "unblocked-ip": "Desbloquióse a [[Special:Contributions/$1|$1]].",
        "blocklist": "Usuarios bloquiaos",
+       "autoblocklist": "Bloqueos automáticos",
+       "autoblocklist-submit": "Guetar",
+       "autoblocklist-legend": "Llista de bloqueos automáticos",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Bloquéu automáticu llocal|Bloqueos automáticos llocales}}",
+       "autoblocklist-empty": "La llista de bloqueos automáticos ta balera.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Otru bloquéu automáticu|Otros bloqueos automáticos}}",
        "ipblocklist": "Usuarios bloquiaos",
        "ipblocklist-legend": "Atopar un usuariu bloquiáu",
        "blocklist-userblocks": "Anubrir los bloqueos de cuenta",
        "tooltip-pt-mycontris": "Llista de les {{GENDER:|tos}} collaboraciones",
        "tooltip-pt-anoncontribs": "Una llista d'ediciones feches dende esta dirección IP",
        "tooltip-pt-login": "T'encamentamos que t'identifiques, anque nun ye obligatorio",
+       "tooltip-pt-login-private": "Tienes d'aniciar sesión pa usar esta wiki",
        "tooltip-pt-logout": "Salir",
        "tooltip-pt-createaccount": "Encamentámoste que crees una cuenta y qu'anicies sesión; sicasí, nun ye obligatorio",
        "tooltip-ca-talk": "Alderique tocante al conteníu de la páxina",
        "anonymous": "{{PLURAL:$1|Usuariu anónimu|Usuarios anónimos}} de {{SITENAME}}",
        "siteuser": "{{SITENAME}} usuariu $1",
        "anonuser": "usuariu anónimu de {{SITENAME}} $1",
-       "lastmodifiedatby": "L'últimu cambiu d'esta páxina foi el $1, a les $2, por $3.",
+       "lastmodifiedatby": "La última edición d'esta páxina foi el $1 a les $2, por $3.",
        "othercontribs": "Basao nel trabayu fechu por $1.",
        "others": "otros",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|usuariu|usuaria}}|usuarios}} $1",
        "newimages-summary": "Esta páxina especial amuesa los caberos archivos xubíos.",
        "newimages-legend": "Peñera",
        "newimages-label": "Nome d'archivu (o una parte d'él):",
+       "newimages-user": "Direición IP o nome d'usuariu",
        "newimages-showbots": "Ver les xubíes de los bots",
        "newimages-hidepatrolled": "Despintar les entraes patrullaes",
        "noimages": "Nun hai nada que ver.",
        "confirmrecreate": "{{GENDER:$1|L'usuariu|La usuaria}} [[User:$1|$1]] ([[User talk:$1|alderique]]) desanició esta páxina depués de qu'empecipiaras a editala pol siguiente motivu:\n: <em>$2</em>\nPor favor confirma que daveres quies volver a crear esta páxina.",
        "confirmrecreate-noreason": "{{GENDER:$1|L'usuariu|La usuaria}} [[User:$1|$1]] ([[User talk:$1|alderique]]) desanició esta páxina depués de que principiaras a editala.  Por favor confirma que daveres quies volver a crear esta páxina.",
        "recreate": "Volver a crear",
+       "confirm-purge-title": "Purgar esta páxina",
        "confirm_purge_button": "Aceutar",
        "confirm-purge-top": "¿Llimpiar la caché d'esta páxina?",
        "confirm-purge-bottom": "Purgar una páxina esborra la caché y fuercia a apaecer la versión actual más recién.",
        "htmlform-user-not-valid": "<strong>$1</strong> nun ye un nome d'usuariu válidu.",
        "logentry-delete-delete": "$1 {{GENDER:$2|desanició}} la páxina $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|desanició}} la redireición $3 sobreescribiéndola",
-       "logentry-delete-restore": "$1 {{GENDER:$2|restauró}} la páxina $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restauró}} la páxina $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|restauró}} la páxina $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 revisión|$1 revisiones}}",
+       "restore-count-files": "{{PLURAL: $1|1 ficheru|$1 ficheros}}",
        "logentry-delete-event": "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|camudó}} la visibilidá de los socesos del rexistru en $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|anovó}} etiquetes na revisión $4 de la páxina $3 ({{PLURAL:$7|amestó}} $6; {{PLURAL:$9|desanició}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|anovó}} etiquetes na entrada del rexistru $5 de la páxina $3 ({{PLURAL:$7|amestó}} $6; {{PLURAL:$9|desanició}} $8)",
        "rightsnone": "(nengún)",
-       "revdelete-summary": "editar resume",
        "rightslogentry-temporary-group": "$1 (temporal, ata $2)",
        "feedback-adding": "Amestando el comentariu a la páxina...",
        "feedback-back": "Anterior",
        "special-characters-group-thai": "Tailandés",
        "special-characters-group-lao": "Laosianu",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Aborixe canadiense",
        "special-characters-title-endash": "guión curtiu",
        "special-characters-title-emdash": "guión llargu",
        "special-characters-title-minus": "signu menos",
        "mw-widgets-titleinput-description-redirect": "redirixir a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Amestar una categoría...",
        "mw-widgets-usersmultiselect-placeholder": "Amestar más...",
+       "date-range-from": "Dende la data:",
+       "date-range-to": "Ata la data:",
        "sessionmanager-tie": "Nun puen combinase dellos tipos de solicitú d'identificación: $1.",
        "sessionprovider-generic": "sesiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basaes en cookies",
        "restrictionsfield-label": "Rangos d'IP permitíos:",
        "restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisión $1",
-       "pageid": "ID de páxina $1"
+       "pageid": "ID de páxina $1",
+       "rawhtml-notallowed": "Les etiquetes &lt;html&gt; nun pueden usase fuera de les páxines normales.",
+       "gotointerwiki": "Dexando {{SITENAME}}",
+       "gotointerwiki-invalid": "El títulu especificáu nun ye válidu.",
+       "gotointerwiki-external": "Tas a piques de dexar {{SITENAME}} pa visitar [[$2]], que ye un sitiu web distintu.\n\n'''[$1 Siguir a $1]'''",
+       "undelete-cantedit": "Nun puedes desfacer el borráu d'esta páxina porque nun tienes permisu pa editala.",
+       "undelete-cantcreate": "Nun puedes desfacer el borráu d'esta páxina porque nun existe nenguna páxina con esti nome y nun tienes permisu pa creala."
 }
diff --git a/languages/i18n/atj.json b/languages/i18n/atj.json
new file mode 100644 (file)
index 0000000..6599a10
--- /dev/null
@@ -0,0 +1,612 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Amqui",
+                       "Benoit Rochon",
+                       "Jean-paul echaquan",
+                       "Jeannette Coocoo",
+                       "Nehirowisiw",
+                       "Ninmeka",
+                       "Thibaut120094",
+                       "Catrope"
+               ]
+       },
+       "underline-always": "Mocak",
+       "underline-never": "Nama wiskat",
+       "sunday": "Manactakaniwon",
+       "monday": "ockorkananiwon",
+       "tuesday": "nicw kicikaw",
+       "wednesday": "nicto kicikaw",
+       "thursday": "new kicikaw",
+       "friday": "tcipaiatikw kicikaw",
+       "saturday": "mari kicikaw",
+       "sun": "Manactakaniwon",
+       "mon": "Ockorkananiwon",
+       "tue": "Nicw kicikaw",
+       "wed": "Nicto kicikaw",
+       "thu": "New kicikaw",
+       "fri": "Tcipaiatikw kicikaw",
+       "sat": "Mari kicikaw",
+       "january": "Kenositc pisimw",
+       "february": "Akokatcic pisimw",
+       "march": "Nikikw pisimw",
+       "april": "Ka wasikototc pisimw",
+       "may_long": "Wapikon pisimw",
+       "june": "Otehimin pisimw",
+       "july": "Mikomini pisimw",
+       "august": "Otatakon pisimw",
+       "september": "Kakone pisimw",
+       "october": "Namekosi pisimw",
+       "november": "Atikamekw pisimw",
+       "december": "Pitcipipon pisimw",
+       "january-gen": "Kenositc pisimw",
+       "february-gen": "Akokatcic pisimw",
+       "march-gen": "Nikikw pisimw",
+       "april-gen": "Ka wasikototc pisimw",
+       "may-gen": "Wapikon pisimw",
+       "june-gen": "Otehimin pisimw",
+       "july-gen": "Mikomini pisimw",
+       "august-gen": "Otatakon pisimw",
+       "september-gen": "Kakone pisimw",
+       "october-gen": "Namekosi pisimw",
+       "november-gen": "Atikamekw pisimw",
+       "december-gen": "Pitcipipon pisimw",
+       "jan": "Kenositc pisimw",
+       "feb": "Akokatcic pisimw",
+       "mar": "Nikikw pisimw",
+       "apr": "Ka wasikatotc pisimw",
+       "may": "Wapikon pisimw",
+       "jun": "Otehimin pisimw",
+       "jul": "Mikomini pisimw",
+       "aug": "Otatakon pisimw",
+       "sep": "Kakone pisimw",
+       "oct": "Namekosi pisimw",
+       "nov": "Atikamekw pisimw",
+       "dec": "Pitcipipon pisimw",
+       "january-date": "Kenositc pisimw $1",
+       "february-date": "Akokatcic pisimw $1",
+       "march-date": "Nikikw pisimw $1",
+       "april-date": "Ka wasikototc pisimw $1",
+       "may-date": "Wapikon pisimw $1",
+       "june-date": "Otehimin pisimw $1",
+       "july-date": "Mikomini pisimw $1",
+       "august-date": "Otatakon pisimw $1",
+       "september-date": "Kakone pisimw $1",
+       "october-date": "Namekosi pisimw $1",
+       "november-date": "Atikamekw pisimw $1",
+       "december-date": "Pitcipipon pisimw $1",
+       "period-am": "E pwamici apita kicikak",
+       "period-pm": "E ickwa apita kicikak",
+       "pagecategories": "{{PLURAL:$1|Ka ici arimotcikatek|Ka ici arimotcikateki}}",
+       "category_header": "Masinahikana ka ici arimotcikateki \"$1\"",
+       "subcategories": "Awocamec ke ici arimotcikateki",
+       "category-media-header": "Tipatcimoctakewin e ici actakaniwok \"$1\"",
+       "hidden-categories": "{{PLURAL:$1|Ka katcictek|Ka katcicteki}}",
+       "category-subcat-count": "Nohwe tipanictawin {{PLURAL:$2|0=nama takon e ki koski tipanictakaniwok|1=tepirak e ki koski tipanictakaniwok nta takon|takon $2 koski tipanictawina, nte {{PLURAL:$1|0=nama takon|1=nohwe|neki $1}}nta nitc}}.",
+       "category-article-count": "nohwe tipanictawin {{PLURAL:$2|0=nama takon paskickwemakan|1=Enkon nohwe tepirak paskickwemakan|takon $2 paskickwemakana,ohwe tca {{PLURAL:$1|0=nama takon|1=ohwi|nehi $1}} nihi nitc}}.",
+       "category-file-count": "Nohwe tipanictawin {{PLURAL:$2|0=nama takon mawtosinihikana|1= tec mawtosinihikan acotitin|acotitin $2 mawtosinihikana,  {{PLURAL:$1|0=nama takon|1=nohwe|nihi $1}} nta ka cekoctek}}.",
+       "listingcontinuesabbrev": "minawatc",
+       "about": "Taci we otciparik",
+       "newwindow": "(cepita kotak ocki osapwakan)",
+       "cancel": "Ponipata",
+       "mypage": "Masinhikan",
+       "mytalk": "Ka ici arimowaniwok",
+       "anontalk": "Ka ici arimowaniok",
+       "navigation": "Matcecikinikan",
+       "and": "&#32;kaie",
+       "qbbrowse": "Nantowepaha",
+       "qbedit": "Meckotcita",
+       "qbpageoptions": "Nohwe paskickwemakan",
+       "qbmyoptions": "Nipaskickwemakana",
+       "namespaces": "Ka ici masinasotcik",
+       "variants": "Pitoc",
+       "navigation-heading": "Matcecikinikana",
+       "errorpagetitle": "Oniparin",
+       "returnto": "Nte ica paskickwemakanik $1",
+       "tagline": "E pe otciparik {{SITENAME}}",
+       "help": "Witcihici",
+       "search": "Nantona",
+       "searchbutton": "Nantokiskeritcikatek",
+       "go": "Go",
+       "searcharticle": "Tapwata",
+       "history": "Ka ki pe icinakok ohwe masinahikan",
+       "history_short": "Isparik",
+       "history_small": "isparik",
+       "printableversion": "Wi orowipitamone",
+       "permalink": "Matakan pamikicikwepitcikanik",
+       "print": "Orowipitaman",
+       "view": "Tapwatcike",
+       "view-foreign": "Nta ici ntowapata$1",
+       "edit": "Meckotcita",
+       "create": "Ocita",
+       "create-local": "Arimota ke acotcictek",
+       "editthispage": "Mecikotona owe",
+       "delete": "Wepina",
+       "newpage": "Ocki matcecikinakanik",
+       "talkpagelinktext": "ka ici arimowaniwok",
+       "personaltools": "Kit irapatcitcikan",
+       "talk": "Ka ici arimowaniwok",
+       "views": "Ke icinakok",
+       "toolbox": "Irapitcitcikan",
+       "projectpage": "Kitci wapataman nehe masinihikan ocki otamirowinik otci",
+       "otherlanguages": "Kotakahi aiarimowewina",
+       "redirectedfrom": "(Taci e kiweckwemakak $1)",
+       "redirectto": "Nte ica:",
+       "lastmodifiedat": "Pamitcitc ka meckotcitakiniwok ni apitc $1, ka tato tipahikaneak $2.",
+       "jumpto": "Ica:",
+       "jumptonavigation": "matcetcicihikan",
+       "jumptosearch": "nantokiskeritcikatek",
+       "aboutsite": "Taci we otciparik {{SITENAME}}",
+       "aboutpage": "Project:Enko nehe",
+       "copyrightpage": "{{ns:project}}:Tiperitakon",
+       "currentevents": "Mekwata",
+       "currentevents-url": "Project:Mekwata",
+       "disclaimers": "Ke ekwamanictcikatek",
+       "disclaimerpage": "Project:Witamakaniwon orocowewin",
+       "edithelp": "Witcihewin e matcetcicihaman",
+       "helppage-top-gethelp": "Witcihici",
+       "mainpage": "Otitikowin",
+       "mainpage-description": "Otitikowin",
+       "portal": "Kaskina mamo awik",
+       "portal-url": "Project:Kaskina mamo awik",
+       "privacy": "Kekwan ke ki ici nitcictaman",
+       "privacypage": "Project:Kekwan ke ki ici nitcictaman",
+       "ok": "OK",
+       "retrievedfrom": "Neta pe otcipirin \"$1\"",
+       "editsection": "meckotcita",
+       "editold": "meckotcita",
+       "editlink": "meckotcita",
+       "viewsourcelink": "Nte ici nta kanawapata e otciparik",
+       "editsectionhint": "Meckotcita ota: $1",
+       "toc": "Tekaci e icinakok",
+       "showtoc": "Wapata",
+       "hidetoc": "Kata",
+       "confirmable-yes": "Ehe",
+       "confirmable-no": "Nama",
+       "site-atom-feed": "Flux Atom $1",
+       "page-atom-feed": "\"$1\" Atom feed",
+       "red-link-title": "$1 (nama takon kekwcic)",
+       "nstab-main": "Masinahikan",
+       "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Ka masinahiketc|Ka masinahiketc}}",
+       "nstab-special": "Ka ici wectakaniwok",
+       "nstab-project": "Nohwe ma",
+       "nstab-image": "Masinahikan",
+       "nstab-template": "Tapapitcikan",
+       "nstab-category": "Ka ici arimotcikatek",
+       "mainpage-nstab": "Otitikowin",
+       "error": "Oniparin",
+       "databaseerror-error": "Oniparin: $1",
+       "badtitle": "nama mia icinikatew",
+       "badtitletext": "Nama takon nohwe e icinikatek paskickwemikan, cikoctew,kekotc nama mia ki otci icinikatcikatew e itectamakaniwok nte arimwewinik kekotc nte otamirowinik.\nPotc osam nipira aitisinihikana actetikena nama tca ki actakaniwona tan e icinikatcikateki kekwan.",
+       "viewsource": "Nte ici nta kanawapata e otciparik",
+       "yourname": "Icinikasowin:",
+       "userlogin-yourname": "Icinikasowin",
+       "userlogin-yourname-ph": "Pitakesinaha kit icinikasowin",
+       "yourpassword": "Pitakesinahotiso:",
+       "userlogin-yourpassword": "Pitakesinahotiso",
+       "userlogin-yourpassword-ph": "Pitakesinihikan",
+       "createacct-yourpassword-ph": "Acta pitakesinihikan",
+       "createacct-yourpasswordagain": "Naskamowicta pitakesinihikan",
+       "createacct-yourpasswordagain-ph": "Minawatc acta pitakesinihikan",
+       "userlogin-remembermypassword": "Kitci cetik mekwact ka ici otamirohian",
+       "login": "Posi",
+       "logout": "Piskeapikenakan",
+       "userlogout": "Piskeapikenakan",
+       "userlogin-noaccount": " Nama takon ki mockinesinihikan?",
+       "userlogin-joinproject": "Pe natcipicta {{ohwe itipiwin}}",
+       "createaccount": "Masinahotiso",
+       "userlogin-resetpassword-link": "Ki onikan kipitakesinihikan?",
+       "userlogin-helplink2": "Witcihewin kata pitakeapikecinaniwok",
+       "createacct-emailrequired": "Pamikicikwepitcikan matcetcicihikan",
+       "createacct-emailoptional": "Pamikicikwepitcikan matcetcicihikan (kir kotc)",
+       "createacct-email-ph": "Pitakesinaha ki pamikicikwepitcikan matcetcicihikan",
+       "createacct-submit": "Masinahotiso",
+       "createacct-benefit-heading": "{{SITENAME}} iskwewok, iriniwok ka orisinihiketcik mitowi kir.",
+       "createacct-benefit-body1": "{{PLURAL:$1|ki meckotcitakiniwok|ki meckotcitakiniwoki}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|masinhikan|masinahikana}}",
+       "createacct-benefit-body3": "ocki {{PLURAL:$1|ka witcihietc|ka witcihietcik}}",
+       "loginlanguagelabel": "Arimwewin:$1",
+       "pt-login": "Posi",
+       "pt-login-button": "Posi",
+       "pt-createaccount": "Masinahotiso",
+       "pt-userlogout": "Piskeapikenakan",
+       "botpasswords-label-cancel": "Ponipita",
+       "botpasswords-label-delete": "Wepina",
+       "resetpass-submit-cancel": "Ponipita",
+       "passwordreset": "Ka ocehikaniin itewin koski masinaha",
+       "passwordreset-username": "Icinikasowin:",
+       "passwordreset-email": "Pamikicikwepitcikan matcetcicihikan:",
+       "bold_sample": "Atisokesinahikan e makatewasinatek",
+       "bold_tip": "Atisokesinahikan e makatewasinatek",
+       "italic_sample": "Atisokesinahikan ka kwectek",
+       "italic_tip": "Atisokesinahikan ka kwectek",
+       "link_sample": "Ka icinikatek takapikenikan",
+       "link_tip": "Pitc itapikesinikan",
+       "extlink_sample": "http://www.example.com ka icinikatek takapikenikan",
+       "extlink_tip": "Masinahikana ka ici tapitik kotakik masinahikanik",
+       "headline_sample": "Atisokesinahikan ke aicinikatek",
+       "headline_tip": "Icinikatamowinicic 2 ka iteritakok",
+       "nowiki_sample": "Acta atisokesinahikan aka moci ka ki otci nihipitcikatek ota",
+       "nowiki_tip": "Aka pamerita e itasinihak wiki",
+       "image_tip": "E pitakesinahikatek masinahikaniwoc",
+       "media_tip": "Ka ici tapitik onimiskimasinahikan",
+       "sig_tip": "Masinahotiso acit e tato konekisitc pisimw",
+       "hr_tip": "Ka mitaskosinatek(aka oraho)",
+       "summary": "Nosem:",
+       "minoredit": "Apicic meckotciparin",
+       "watchthis": "Wi nosinetaine ohwe masinahikan",
+       "savearticle": "Kinokepitcikanik acta",
+       "showpreview": "Tcockapita",
+       "showdiff": "Kanawapata ka meckotcipitcikateki",
+       "anoneditwarning": "<strong>Ekwa:</strong> nama kipitikeapikecinin. Nokon e tatosinatek kit irapitcikan ka pamikicikwakein kaskina wec ici nokon  kecpin e kweskisinihikein. Kecpin tca <strong>[$1 wi pitikeapikecinine]</strong> ou <strong>[$2 ocita kata pitakesinasowin]</strong>,nohwe ka kweskisinihikein ki ka masinason e icinikatitisowin, acit awacimec ki ka ici titamihikowin",
+       "loginreqlink": "posi",
+       "newarticletext": "Ki nanosinehen ntowapikepatcikan aka  e takok nohwe paskickwemakan kiapatc.\nWi ocitaine nohwe paskickwemakan, nta ici masinaha pwetek kit atisokesinihikan minawatc\n (matci kika nta kanawapaten [$1 ka witciwemakak paskickwemakan] awacimec wi nanto kiskeritamone). \nKecpin ota ka pe icawone{{GENDER:||e}} e ki onipiriin, ohwe makona <strong>kiweckawin</strong> taci e ici pamikicikwepitcikein",
+       "noarticletext": "Mekwatc nama takon atisokesinihikan nta paskickwemakanik.\nKe ki totaman [[Special:Search/{{PAGENAME}}|nantowapaha ohwe icinikatamowin]] kotakahikw paskickwemakanik, \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|paskickwemakan={{FULLPAGENAMEE}}}} nantowapata ka ici  mikowapihikemikak]\nkekotc [{{fullurl:{{FULLPAGENAME}}|tota=orocowata}} ocita paskickwemakan]</span>.",
+       "noarticletext-nopermission": "Mekwatc nama takon atisokesinihikan nta paskickwemakanik.\nKe ki totaman[[Special:Search/{{PAGENAME}}|nantowapaha ohwe icinikatamowin ]] kotakahikw paskickwemakanik,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|paskickwemakan={{FULLPAGENAMEE}}}} nantowapaha kotakihi wapatcikaniwoca ohwe ]</span>,nama aric ki mirikwin ohwe kata ocitain paskickwemakan.",
+       "editing": "Meckotcita $1",
+       "creating": "$1 Wir tipirowe ka ki ocitatc",
+       "editingsection": "Ka ki meckotcitatc $1 (tipanitakiniwok)",
+       "templatesused": "{{PLURAL:$1|tapapitcikan ka apatak |tapapitcikan ka apatak}} nta paskickwemakanik:",
+       "template-protected": "(nakataweritcikatew)",
+       "template-semiprotected": "(apita nakatoweritakon)",
+       "hiddencategories": "{{PLURAL:$1|tipanictawin katcitin|tipanictawina katcitano}} paskickwemakan tca nohwe nte ici actew:",
+       "permissionserrorstext-withaction": "Nama ki ki toten $2 osam {{PLURAL:$1|}} nohwe ka witcikatek kekotc nihi ka wawitcikateki:",
+       "moveddeleted-notice": "Paskickwemakan ka ki wepinikatek.\nOhwe wapatcikan nitc ici nokon paskickwemakanik ka ki wepinikateki acit ka ki atcipitcikateki.",
+       "content-model-javascript": "JavaScript",
+       "viewpagelogs": "Kinawapta kekwan kaki isparik ota masinhikanik",
+       "currentrev-asof": "Owe mekwatc ka icinakok ni apitc ka ocitakiniwokipan $1",
+       "revisionasof": "Kiwe kanawapata $1",
+       "revision-info": "E tato konekisitc ka koski kanawapatcikatek $1 nohwe {{GENDER:$6|$2}}$7",
+       "previousrevision": "← Nictam ka ki masinatek",
+       "nextrevision": "Tec aci ka ki otamirowitcikatek →",
+       "currentrevisionlink": "Mekwatc ka otamirowitcikatek",
+       "cur": "e otapekitikw",
+       "last": "pitoc",
+       "history-feed-title": "Kotakihi e itatcitcikatekai",
+       "rev-delundel": "Nokota/katcicta",
+       "rev-showdeleted": "wapata",
+       "revdelete-show-file-submit": "Ehe",
+       "pagehist": "Ka ki pe icinakok owe masinhikan",
+       "history-title": "Kotakihi e itatcitcikatekai \"$1\"",
+       "difference-title": "\"$1\" E ci papitoc icinakok",
+       "lineno": "E tatosinatek $1:",
+       "editundo": "nama ntwatc",
+       "diff-multi-sameuser": "({{PLURAL:$1|Nohwe ka ki koski kanawapatcikatek enkon nohwe peikon ka ki mockatcitatc nama aric nokon |$1 nohwe ka ki koski kanawapatcikateki enkon nohwe peikon ka mockatcitatc nama aric nokon }})",
+       "searchresults": "Ka ki nta kiskeritakok",
+       "searchresults-title": "Ka ki nta kiskeritakok \"$1\"",
+       "prevn": "{{PLURAL:$1|nictamictew|nictamictewa $1}}",
+       "nextn": "minawa {{PLURAL:$1|$1}}",
+       "nextn-title": "Minawa $1 {{PLURAL:$1|ke iti icinakok|ke iti icinakoki}}",
+       "shown-title": "Akwaskoha $1 {{PLURAL:$1|ke iti icinakok|ke iti icinakoki}} tatwa e matce paskickwemikein",
+       "viewprevnext": "Tapwatcike ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Ocita paskickwemakan « [[:$1|$1]] » ohwe ota wiki !</strong> {{PLURAL:$2|0Kanawapata  kirika nohwe paskickwemakan ka ki nantowapahaman.|Kanawapata kirina kekwan ka ki miskowapahaman e nanto kiskeritaman .}}",
+       "searchprofile-articles": "Masinahikana ka aicteki",
+       "searchprofile-images": "Mitcetowina",
+       "searchprofile-everything": "Kaskina",
+       "searchprofile-advanced": "Awocamec nantona",
+       "searchprofile-articles-tooltip": "Nantowapata $1",
+       "searchprofile-images-tooltip": "Ka nantopitcikatek nakwe masinahikan",
+       "searchprofile-everything-tooltip": "Nantona nta kitciwe natosinahikanik (acit nte paskickwemakanik taci e ici aiarimotcikatek)",
+       "searchprofile-advanced-tooltip": "Nantona taci e ici actek  ka mihakok",
+       "search-result-size": "$1 ({{PLURAL:$2|1 itewin e masinatek|$2 itewina e masinateki}})",
+       "search-redirect": "(taci e kiweckwemakak $1)",
+       "search-section": "(ke arimotcikatek $1)",
+       "search-suggest": "Ohwe kotcita e itasinatek: $1",
+       "searchall": "kaskina",
+       "search-showingresults": "{{PLURAL:$4|E ici miskatek <strong>$1</strong> nta neki<strong>$3</strong>|E ici miskatek <strong>$1 à $2</strong>nta neki<strong>$3</strong>}}",
+       "search-nonefound": "Nama miskwapahikatew ka nantowapahikatek.",
+       "powersearch-legend": "Awocamec nantona",
+       "powersearch-toggleall": "Kaskina",
+       "preferences": "Kirowe",
+       "mypreferences": "Mocak ka kinawapataman",
+       "saveprefs": "Kinokepitcikanik",
+       "searchresultshead": "Nantokaskeritcikatek",
+       "stub-threshold-disabled": "Manisinaha",
+       "prefs-searchoptions": "Nantokaskeritcikatek",
+       "youremail": "Matcetcicihikan:",
+       "email": "Matcetcicihikan",
+       "group-user": "Ka mitatc",
+       "right-writeapi": "Ohwe apitcita A.P.I meckotci aitotaman wikik",
+       "newuserlogpage": "E ici masinasotcik ka pitakesinahotisotcik",
+       "action-edit": "mecikotona owe",
+       "enhancedrc-history": "isparik",
+       "recentchanges": "Ka ki meckotcitakaniwoki",
+       "recentchanges-legend": " Ka meckotcitain matcenikana",
+       "recentchanges-summary": "Paskickwemikan ke ici nosanetain ka ki ocki meckotcisinihikatekai wikik.",
+       "recentchanges-label-newpage": "Ocki paskickwemikan ki ocitamakan",
+       "recentchanges-label-minor": "Apicic meckotciparin",
+       "recentchanges-label-bot": "Nicike ki meckotciparin",
+       "recentchanges-label-unpatrolled": "Nama moci koski tapwatcikatew ka ki meckotcipirik",
+       "recentchanges-label-plusminus": " Irikik e tacitcik bytes meckotcipirin e irikwak",
+       "recentchanges-legend-heading": "<strong>Itekesinihikan:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kirika kanawapata nohwe [[Special:NewPages|taci e ici masinihikatek ocki paskickwemakana]]).",
+       "recentchanges-submit": "Wapata",
+       "rclistfrom": "Nokota ka ki mameckotciparik nta e otci kitciparik $2, $3",
+       "rcshowhideminor": "$1 memantcic meckotcipirino",
+       "rcshowhideminor-show": "Wapata",
+       "rcshowhideminor-hide": "Kata",
+       "rcshowhidebots": "$1 meckotciparin",
+       "rcshowhidebots-show": "Wapata",
+       "rcshowhidebots-hide": "Kata",
+       "rcshowhideliu": "$1 ka notcitatcik e ici masinahotisotcik",
+       "rcshowhideliu-show": "Wapata",
+       "rcshowhideliu-hide": "Kata",
+       "rcshowhideanons": "$1 nama kiskeritakosiw ka ki masinahak",
+       "rcshowhideanons-show": "Wapata",
+       "rcshowhideanons-hide": "Kata",
+       "rcshowhidepatr-show": "Wapata",
+       "rcshowhidepatr-hide": "Kata",
+       "rcshowhidemine": "$1 ka meckotcipataman",
+       "rcshowhidemine-show": "Wapata",
+       "rcshowhidemine-hide": "Kata",
+       "rcshowhidecategorization-show": "Wapata",
+       "rcshowhidecategorization-hide": "Kata",
+       "rclinks": "Nokota nehi $1 ka ki mamitcit mameckotcipitcikatekai $2 nac nta  mamitcitc e kicikakai",
+       "diff": "pitoc",
+       "hist": "e itatisokatek",
+       "hide": "Kata",
+       "show": "Wapata",
+       "minoreditletter": "a",
+       "newpageletter": "O",
+       "boteditletter": "p",
+       "rc-change-size-new": "$1 {{PLURAL:$1|irik|irikw}} ke askowak",
+       "recentchangeslinked": "Nosineta masinahikana e mamowapiketik",
+       "recentchangeslinked-toolbox": "Nosineta masinahikana e mamowapiketik",
+       "recentchangeslinked-title": "E nosinehikatek paskickwemikana ka acotcictek\"$1\"",
+       "recentchangeslinked-summary": " Enkon ohwe ka ki meckotcisinihikateki paskickwemikana  e ici natcipitcikatek nta paskickemakanik kekwan ka arimotcikatek mia kekotc ma neki ka mamowisinasotcik taci ka ki ici aritisotcik mia.\nPaskickwemikina [[Special:Watchlist|masinihikan ka nakatcitain]] nehi<strong>makatewasinikan</strong>",
+       "recentchangeslinked-page": "Icinikatamowin Ickwemakinikan:",
+       "recentchangeslinked-to": "Kata nokok kaki kweskisinihikateki paskickwemikina ka acotcisinihikateki taci e ici ntowapekihikatek nohwe paskickwemakan patoc kweski e icinakok.",
+       "upload": "Natcipata masinahikan",
+       "filedesc": "Nosem",
+       "fileuploadsummary": "Nosem:",
+       "filesource": "Ite wetciparik:",
+       "upload-dialog-button-cancel": "Ponipita",
+       "upload-dialog-button-save": "Kinokepitcikanik",
+       "upload-form-label-infoform-description": "E witcikemakak",
+       "upload-form-label-infoform-categories": "Nakwe tipanictasinihikan",
+       "upload-form-label-infoform-date": "Tatokonakisitc",
+       "license-header": "orocowatcikan",
+       "listfiles-delete": "wepina",
+       "imgfile": "masinhikan",
+       "listfiles": "Ka ici tapitik onimiskimasinhikan",
+       "listfiles_thumb": "Masinasonic",
+       "listfiles_date": "Tatokonakisitc",
+       "listfiles_user": "Ka mitatc",
+       "listfiles_description": "E witcikemakak",
+       "listfiles-latestversion-yes": "Ehe",
+       "listfiles-latestversion-no": "Nama",
+       "file-anchor-link": "Masinahikaniwoc",
+       "filehist": "E itatisokemakak masinahikaniwoc",
+       "filehist-help": "Ota ici nta makona e tatokonikisitc acitc e tato tipahikaneak kitci wapataman apitc ka masinatek.",
+       "filehist-current": "mekwatc",
+       "filehist-datetime": "E tatokonakisitc acitc e tato tipahikaneak",
+       "filehist-thumb": "Masinasowinicic",
+       "filehist-thumbtext": "Masinasowinicic apitc ka meckotcipatakaniwitc $1",
+       "filehist-user": "Ka mitatc",
+       "filehist-dimensions": "E iskwaki",
+       "filehist-comment": "E iteritaman",
+       "imagelinks": "Ke irapatak masinahikaniwoc",
+       "linkstoimage": "{{PLURAL:$1|minawatc ka apatak paskickwemakan |Nehi $1 minawatc ka apataki paskickemakanik}} nohwe mawtockwemakan :",
+       "nolinkstoimage": "Nama tekaci apatan masinahikaniwoc.",
+       "sharedupload-desc-here": "Ohwe masinahikaniwoc ote otciparin $1. Matci kotakahik wec kata apatan.\nOta masinateriw $2 e irapatanik.",
+       "upload-disallowed-here": "Nama actew  kata meckotanaman.",
+       "filedelete": "Wepina $1",
+       "filedelete-submit": "Wepina",
+       "randompage": "Nakowepitaman",
+       "randomincategory-category": "Ka ici arimotcikatek:",
+       "randomincategory-submit": "Tapowata",
+       "statistics-pages": "Masinahikana",
+       "pageswithprop-submit": "Tapowata",
+       "brokenredirects-edit": "meckotcita",
+       "brokenredirects-delete": "wepina",
+       "withoutinterwiki-submit": "Wapata",
+       "nbytes": "$1 {{PLURAL:$1|irik}}",
+       "nmembers": "$1 {{PLURAL:$1|witciwetc|witciwetcik}}",
+       "prefixindex-submit": "Wapata",
+       "protectedpages-page": "Masinhikan",
+       "newpages": "Ocki matcecikinakanik",
+       "newpages-submit": "Wapata",
+       "newpages-username": "Icinikasowin:",
+       "pager-older-n": "{{PLURAL:$1|1 mawtci weckat|$1 mawtci weckat}}",
+       "booksources": "E otciparik",
+       "booksources-search-legend": "Nantowapata nta kotakahi wapatcikana",
+       "booksources-search": "Nanto kiskeritcikatek",
+       "log": "Pamikickwepitcikana masinihikana",
+       "logeventslist-submit": "Wapata",
+       "checkbox-all": "Kaskina",
+       "allpages": "Kaskina paskickwemikana",
+       "allarticles": "Kaskina paskickwemikana",
+       "allpagessubmit": "Tapwata",
+       "categories": "Ka ici arimotcikateki",
+       "categories-submit": "Wapata",
+       "sp-deletedcontributions-contribs": "E ki witcihehin",
+       "linksearch-ok": "Nantokaskeritcikatek",
+       "listusers-submit": "Wapata",
+       "listgrouprights-namespaceprotection-namespace": "Ka ici masinasotcik",
+       "emailusername": "Icinikasowin:",
+       "watchlist": "Ka masinateki",
+       "mywatchlist": "Ka masinateki",
+       "watch": "Nanakatcita",
+       "watchlist-hide": "Kata",
+       "watchlist-submit": "Wapata",
+       "wlshowhideanons": "nama kiskeritakosiw ka ki masinahak",
+       "enotif_anon_editor": "nama kiskeritakosiw ka ki masinahak $1",
+       "delete-confirm": "Wepina \"$1\"",
+       "delete-legend": "Wepina",
+       "historyaction-submit": "Wapata",
+       "dellogpage": " Nesitc ka wepinikatek kanaweritcikan",
+       "rollbacklink": "e maninakatek",
+       "rollbacklinkcount": " nesitc wepina $1 {{PLURAL:$1|kweskisinikan|kweskisinihikana}}",
+       "protectlogpage": "Nanakatisiwina wapatcikan",
+       "restriction-edit": "Meckotcita",
+       "undeleteviewlink": "tapwatcike",
+       "undelete-search-submit": "Nantokaskeritcikatek",
+       "undelete-show-file-submit": "Ehe",
+       "namespace": "Ka ici masinasotcik:",
+       "invert": "kweskisinaha nohwe",
+       "tooltip-invert": "Tcikisinaha taci e kikesinatek kata katcictain ka ki  koski kweskisihihikateki paskickwemikanan taci ka masinateki ke ki actakaniwoki.",
+       "namespace_association": "Taci e mamowisinasonaniwok",
+       "tooltip-namespace_association": "Tcikisinaha nohwe kikesinahikan kata acotcisinatek kirika taci e mamowisinasinaniwok e aimihitonaniwok kekotc kekwan,taci ka ki orapitcikateki icinikatewina",
+       "blanknamespace": "(Ka ici ocitakiniwok)",
+       "contributions": "Wir ka ki witcihietc {{GENDER:$1|User}}",
+       "mycontris": "Witcihewin",
+       "anoncontribs": "E ki witcihehin",
+       "uctop": "(mekwatc)",
+       "month": "Anotc pisimw ka akotcinitc (nac nte nictam):",
+       "year": "Taci e ici matce tato piponikak(acit nictam):",
+       "sp-contributions-talk": "ka ici arimowaniok",
+       "sp-contributions-submit": "Nantokaskeritcikatek",
+       "whatlinkshere": "Kaskina ickwemakina ka witci acteki",
+       "whatlinkshere-title": "Masinahikan nte mia ka ici tapitik \"$1\"",
+       "whatlinkshere-page": "Masinahikan:",
+       "linkshere": "Masinhikan ka ici tapitik <strong>[[:$1]]</strong>:",
+       "isredirect": "masinhikan ke kweskiticohemikok",
+       "istemplate": "ka ki acotcipitcikatek",
+       "isimage": "e ici tapitik masinahikaniwoc",
+       "whatlinkshere-prev": "{{PLURAL:$1|nictamictew|nictamictewa $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|minawa|minawa $1}}",
+       "whatlinkshere-links": "← ka patiki",
+       "whatlinkshere-hideredirs": "$1 itapahikana",
+       "whatlinkshere-hidetrans": "$1 pitcititawina",
+       "whatlinkshere-hidelinks": "$1 ka patiki",
+       "whatlinkshere-filters": "cikopesinikan",
+       "whatlinkshere-submit": "Tapowata",
+       "ipblocklist-submit": "Nantokaskeritcikatek",
+       "blocklink": "nokipita",
+       "contribslink": "Kaki witcihehin",
+       "movelogpage": "Tipatcimosanihikan ka ki meckotcicinikatcikateki",
+       "movesubpagetalktext": "Neta ka arimotcikatek tipatcimosanikanik $1 {{PLURAL:$1|Nota paskickwemakan|Nota paskickwemakana}} kita masinatewa ota.",
+       "export": "Matcetciciha masinahikana",
+       "allmessages-filter-all": "Kaskina",
+       "allmessages-filter-submit": "Tapowata",
+       "thumbnail-more": "Micata",
+       "tooltip-pt-userpage": "{{GENDER:|Ki masinahikan|Ki masinahikan}}",
+       "tooltip-pt-mytalk": "{{GENDER:|Kir}} paskickwemakanik taci e ici aiarimotcikatek",
+       "tooltip-pt-preferences": "{{GENDER:|Kir}} kirowe ka nahinaman",
+       "tooltip-pt-watchlist": "Enko ohwi ka masinateki kaskina ka ki meckotcisinahikateki",
+       "tooltip-pt-mycontris": "Masinatew ota {{GENDER:|kir}} ka ki ici witcihiweiin",
+       "tooltip-pt-login": "Arimatc ki ka witen e icikasoin: nama tatakatc kitci kiskeritakosiin.",
+       "tooltip-pt-logout": "Piskeapikenakan",
+       "tooltip-pt-createaccount": "A arimatc ki ka ocitan kitci cenaman: nama aric tatakatc otcitakotc.",
+       "tooltip-ca-talk": "Kecpin wi aimihate awik aniheriw otci",
+       "tooltip-ca-edit": "Meckotana ohwe",
+       "tooltip-ca-addsection": "Kitcipirin ocki aimihitosinahikan",
+       "tooltip-ca-viewsource": "Nakataweritakon paskickwemikan\n Taci e otcipirik",
+       "tooltip-ca-history": "Nictam ka ki itasinahikatek",
+       "tooltip-ca-move": "Orinkata owe masinhikan",
+       "tooltip-ca-watch": "E ici nosinehaman ici acotcicta paskickwemakan",
+       "tooltip-search": "Nanto kiskeritcikatek {{SITENAME}}",
+       "tooltip-search-go": "Ekota neta icakw ke apitc tanokwen itewin",
+       "tooltip-search-fulltext": "Nantona paskickwemakana atisokesinahikanik",
+       "tooltip-p-logo": "Nictam ka nokok",
+       "tooltip-n-mainpage": "Nictam ka nokok",
+       "tooltip-n-mainpage-description": "Nictam ka nokok",
+       "tooltip-n-portal": "Anihe otci ka tacikatek mia ke ki totaman tante ke otinaman ke kictapatak",
+       "tooltip-n-currentevents": "Ke ici miskaman ka wi nta kiskeritaman",
+       "tooltip-n-recentchanges": "Ka ki meckotonikatek",
+       "tooltip-n-randompage": "Kaskina kekwan",
+       "tooltip-n-help": "Witcihiwewin",
+       "tooltip-t-whatlinkshere": "Ka masinateki ite e ici itohikemakak",
+       "tooltip-t-recentchangeslinked": "Ka masinateki anihi ka ki atcitakaniwok",
+       "tooltip-feed-atom": "Atom itapihikan ohwe otci paskickwemikan",
+       "tooltip-t-contributions": "Ka masinasotcik ka witcihiwetcik{{GENDER:$1|ka ntotcitatc}}",
+       "tooltip-t-upload": "Matceticiha masinahikan",
+       "tooltip-t-specialpages": "Kotakahi masinahikana",
+       "tooltip-t-print": "Matci keki orowipitaman kitci masinatekipan",
+       "tooltip-t-permalink": "Taci mia e otcitik",
+       "tooltip-ca-nstab-main": "Kanawapata ka masinateki",
+       "tooltip-ca-nstab-user": "Kitci wapataman nihe masinahikan ka apatak",
+       "tooltip-ca-nstab-special": "Ohwe kitcickwemakinikan,nama actew kitci meckotciparik.",
+       "tooltip-ca-nstab-project": "Kitci wapataman nehe masinihikan ocki otamirowinik otci",
+       "tooltip-ca-nstab-image": "Kitci wapataman nihe masinahikan",
+       "tooltip-ca-nstab-template": "kanawapata orictawisinihikan",
+       "tooltip-ca-nstab-category": "Kitci wapataman nihe mia ka ici arimotcikatek",
+       "tooltip-save": "Kinokepita ka meckotcisinihaman",
+       "tooltip-preview": "Mikwetc pitaman e kanawapataman ka ki meckotcitain, epwomici actain pamikicikwepitcikanik.",
+       "tooltip-diff": "Nokota nohwe ka ki meckotcisinihaham  masinihikanik",
+       "tooltip-rollback": "\"Nakaha\" nikanikatew kotc peikwa e makohotc nohwe makonakan kaskina ka ki meckotcisinihikateki nta paskickwemakanik nohwe ka ki orisinihiketc mamitcit",
+       "tooltip-undo": "\"Nama ntowatc\"nihictamikan nictam meckotcisinihikan minawatc cepirihomikon taci e ici meckotcisinihikaniwok ke ici kanawapataman.Matci kaie ki ka acotcitan kekwan espirik  nta nosem masinihikanik.",
+       "tooltip-summary": "Acta e arimotaman masinihikan apicic",
+       "simpleantispam-label": "Ntokiskeritcike piciriwe masinihikan \n\nNte nota <strong>nama kekwan</strong> masinaha ota!",
+       "pageinfo-toolboxlink": "Tipatcimo masinahikan",
+       "pageinfo-contentpage-yes": "Ehe",
+       "pageinfo-protect-cascading-yes": "Ehe",
+       "confirm-markpatrolled-button": "OK",
+       "previousdiff": "Nictam meckotcisinihikan",
+       "nextdiff": "Tec meckotcisinihikan",
+       "file-info-size": "$1x$2pixels, e irikweckamikak mawtockwemikan:$3nohwe MIME:$4",
+       "file-nohires": "Nohwe e irikwactek nama takon kirowe e sokactek.",
+       "svg-long-desc": "SVG kinokewoc, erikokwactepirik $1 × $2 kawactecik, kinokewoc ehitakok: $3",
+       "show-big-image": "E otciparik masinahikaniwoc",
+       "show-big-image-preview": "E irikweckwemakisitc$1",
+       "show-big-image-other": "Kotak {{PLURAL:$2|erikokowactepirik|erikokowactepiriki}}: $1.",
+       "show-big-image-size": "$1 x $2 pixels",
+       "ilsubmit": "Nantokaskeritcikatek",
+       "monday-at": "ockorkananiwon $1",
+       "wednesday-at": "nicto kicikaw $1",
+       "thursday-at": "new kicikaw $1",
+       "friday-at": "tcipaiatikw kicikaw $1",
+       "saturday-at": "mari kicikaw $1",
+       "sunday-at": "manactakaniwon $1",
+       "metadata": "E ici tipatcitcikatek",
+       "metadata-help": "Nohwe mawtockwemikan ekota acteki awacimec tipatcimowina,nohwe masinapiskipitcikan ka ki actakwen kekotc otitapiskipitcikan ka ki ocitarikwen. Kecpin ka meckotisinihikatekwen nictam ka icinakok, nama kaskina kata nokona ka wi icinakotakaniwok nohwe masinasowin.",
+       "metadata-fields": "Nohwe e aitotwakaniwitc masinasowin nta kata ici actew paskickwemakanik ka ici tipatcimonaniwok ickwa atciwonikateke nta kitci tipatcimoniwocik. Minawatc kotakahi kata katcictakaniwona.\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": "Itactamictew",
+       "exif-xresolution": "E irikwactepirik mitaskosinihikan",
+       "exif-yresolution": "E irikwastepirik tcimiskisinihikan",
+       "exif-datetime": "Apitc ka meckotcitakaniwok",
+       "exif-make": "Ka ki ocitatatc masinapiskahikaniw",
+       "exif-model": "E icinakok masinapiskohowewin",
+       "exif-software": "Tipatcimocikimiwesinikan ka totcikatek",
+       "exif-exifversion": "Exif ka itasinatek",
+       "exif-colorspace": "Icipekahikanik",
+       "exif-datetimeoriginal": "E tato piponikak nictam ka masinahikaniwok",
+       "exif-datetimedigitized": "e tato konekisit pisimw ka capwapiskipitcikatek",
+       "exif-source": "Ite wetciparik",
+       "exif-iimcategory": "Ka ici arimotcikatek",
+       "exif-orientation-1": "Ekote mia",
+       "exif-contrast-0": "Ekote mia",
+       "exif-saturation-0": "Ekote mia",
+       "exif-sharpness-0": "Ekote mia",
+       "exif-dc-date": "Tatokonakisitc",
+       "namespacesall": "kaskina",
+       "monthsall": "kaskina",
+       "confirm_purge_button": "OK",
+       "confirm-watch-button": "OK",
+       "confirm-unwatch-button": "OK",
+       "confirm-rollback-button": "OK",
+       "quotation-marks": "\"$1\"",
+       "imgmultigo": "Tapowata!",
+       "img-lang-go": "Tapowata",
+       "table_pager_limit_submit": "Tapowata",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ka ici arimowaniwok]])",
+       "version-ext-colheader-description": "E witcikemakak",
+       "version-libraries-description": "E witcikemakak",
+       "redirect-submit": "Tapowata",
+       "fileduplicatesearch-submit": "Nantokaskeritcikatek",
+       "specialpages": "Ka ici wectakaniwok",
+       "tag-filter": "Nihipita nehi[[Special:Tags|balises]] :",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Kicawatcikanicic|Kicawatcikanica}}]] : $2)",
+       "tags-source-header": "Ite wetciparik",
+       "tags-active-yes": "Ehe",
+       "tags-active-no": "Nama",
+       "tags-edit": "meckotcita",
+       "tags-delete": "wepina",
+       "tags-create-submit": "Ocita",
+       "compare-page1": "Masinhikan 1",
+       "compare-page2": "Masinhikan 2",
+       "htmlform-no": "Nama",
+       "htmlform-yes": "Ehe",
+       "htmlform-cloner-delete": "Manina",
+       "logentry-delete-delete": "$1 {{GENDER:$2|ki maninam}} $3 ka arimotcikaterik",
+       "logentry-move-move": "$1 {{GENDER:$2| ki meckotcictaw}} paskickwemakan $3 nte itekera $4",
+       "logentry-newusers-create": "Anahwe $1 aci {{GENDER:$2|ickwa ocitakiniwon}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ki natapaham}} $3",
+       "feedback-cancel": "Ponipita",
+       "searchsuggest-search": "Nantona {{SITENAME}}",
+       "expand_templates_ok": "OK",
+       "pagelang-name": "Masinhikan",
+       "log-action-filter-all": "Kaskina",
+       "log-action-filter-block-block": "Nokipita",
+       "authmanager-email-label": "Matcetcicihikan"
+}
index c335429..17cf303 100644 (file)
        "password-change-forbidden": "Гьаб викиялда пароль хисизабун бажаруларо дуда.",
        "login": "Жаниве лъугьине",
        "nav-login-createaccount": "Жаниве лъугьине / аккаунт гьабизе",
-       "userlogin": "Жаниве лъугьине / аккаунт гьабизе",
-       "userloginnocreate": "Жаниве лъугьине",
        "logout": "КъватӀиве лъугьине",
        "userlogout": "КъватӀиве лъугьине",
        "notloggedin": "Мун жаниве лъугьун гьечӀо",
        "userlogin-noaccount": "Дур аккаунт гьечӀебищ?",
        "userlogin-joinproject": "Проекталда гӀахьаллъизе",
-       "nologin": "Дур аккаунт гьечӀебищ? $1.",
-       "nologinlink": "Аккаунт гьабизе",
        "createaccount": "Аккаунт гьабизе",
-       "gotaccount": "Дур аккаунт бугебищ? $1.",
-       "gotaccountlink": "Жаниве лъугьине",
-       "userlogin-resetlink": "Жаниве лъугьине рихьизарулел баяналищ кIочарал?",
        "userlogin-resetpassword-link": "Паролищ кIочараб?",
        "userlogin-helplink2": "Жаниве лъугьине кумек",
        "userlogin-loggedin": "Мун жаниве лъугьана {{GENDER:$1|$1}} хIисабалда.\nГъоркьехун бугеб форма хIалтIизабе, цоги цIаралда гъоркь жаниве лъугьине.",
        "createacct-email-ph": "Дурго электронияб почтаялъул адрес хъвай",
        "createacct-another-email-ph": "Электронияб почтаялъул адрес хъвай",
        "createacct-realname": "Унго-унгояб цIар (чара гьечIого къваригIунеб гуро)",
-       "createaccountreason": "ГIилла:",
        "createacct-reason": "ГIилла",
        "createacct-reason-ph": "Щай дуца цогияб аккаунт гIуцIулеб бугеб",
        "createacct-submit": "Аккаунт гIуцIизе",
        "rcshowhidemine-show": "Бихьизабизе",
        "rcshowhidemine-hide": "Бахчизе",
        "rcshowhidecategorization": "Гьумерал категориязде бикьи $1",
-       "rclinks": "$2 къояйида жаниб гьабураб, ахирисеб $1 хиса-баси бихьизабизе<br />$3",
+       "rclinks": "$2 къояйида жаниб гьабураб, ахирисеб $1 хиса-баси бихьизабизе",
        "diff": "батӀалъи",
        "hist": "тарих",
        "hide": "Бахчизе",
index 9e40aca..3dbda51 100644 (file)
        "externaldberror": "या तो प्रमाणिकरण डाटाबेस में त्रुटि होई गवा है या फिर आप कय आपन बहरेक खाता अपडेट करेक अनुमति नाई है।",
        "login": "लॉग इन",
        "nav-login-createaccount": "लाग इन / खाता खोला जाय",
-       "userlogin": "लाग इन / खाता खोला जाय",
-       "userloginnocreate": "लॉग इन",
        "logout": "बहरे निकरा जाय",
        "userlogout": "बहरे निकरा जाय",
        "notloggedin": "लॉग इन नाइ करा गा है",
        "userlogin-noaccount": "खाता नाइ है?",
        "userlogin-joinproject": "{{SITENAME}} से जुडव",
-       "nologin": "का आप सदस्यता नाई लीहे हव? '''$1'''।",
-       "nologinlink": "नवा खाता बनावा जाय",
        "createaccount": "खाता बनावा जाय",
-       "gotaccount": "पहिले से आप कय खाता है? '''$1''' करा जाय।",
-       "gotaccountlink": "लॉग इन",
-       "userlogin-resetlink": "आपन प्रवेश जानकारी भूलाई गवा गय?",
        "userlogin-resetpassword-link": "आपन गुप्त कुंजी भूलाई गवा गय?",
        "userlogin-helplink2": "लॉग इन करे में सहायता",
        "userlogin-loggedin": "आप {{GENDER:$1|$1}} कय रूप में पहीलवे से लॉग्ड इन होवा जात है।\nकवनो अउर सदस्य कय रूप में लॉग इन करय खरतिन निचे दिहा फ़ॉर्म कय प्रयोग करा जाय।",
        "createacct-another-email-ph": "ईमेल ठाँव दिहा जाय",
        "createaccountmail": "एकठु अस्थायी मनलागा (रैंडम) गुप्त कुंजी चुना जाय अउर ओका निर्दिष्ट ई-मेल ठहर पे भेजा जाय",
        "createacct-realname": "असली नावँ (वैकल्पिक)",
-       "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आप दुसर खाता काहे बनावा जात है",
        "createacct-submit": "आपन खाता बनावा जाय",
        "preview": "झलक",
        "showpreview": "झलक देखावा जाय",
        "showdiff": "बदलाव देखावा जाय",
-       "blankarticle": "<strong>चेतावनी:</strong>आप कय बनावा पन्ना खाली अहै ।\nअगर आप \"{{int:savearticle}}\" दबावा जाई तव,बिना कवनो पाठ कय पन्ना बनि जाई ।",
+       "blankarticle": "<strong>चेतावनी:</strong>आप कय बनावा पन्ना खाली अहै ।\nअगर आप \"$1\" दबावा जाई तव,बिना कवनो पाठ कय पन्ना बनि जाई ।",
        "anoneditwarning": "<strong>चेतावनी:</strong>आप लाग इन नाई करा गा है ।जब आप सम्पादन करा जाई तव आप कय IP address सब कय बिलगाइ। जब आप <strong>[$1 log in]</strong> या <strong>[$2 create an account]</strong> करा जाइ तब आप कय सम्पादन आप कय  सदस्यनाँव से जुडी जाई अव आप कय अउर सुविधओ मिली।",
        "anonpreviewwarning": "''आप लॉग्ड नाई होआ जात है। पन्ना सहेजे पे आप कय आइ॰पी ठाँव इ पन्ना कय इतिहास में दर्ज कइ जाई।''",
-       "missingsummary": "'''ध्यान दिहा जाय:''' आप  संपादन सारांश नाइ दिहा गा है।\nअगर आप दुबारा \"{{int:savearticle}}\" पे क्लिक करा जाई तव आप कय संपादन बिना सारांश कय सहेज जाई।",
-       "selfredirect": "<strong>चेतावनी:</strong> आप इ पन्नवा कय इहि से निर्देश करय जावा जात है.\nआप या तव गलत लक्ष्य पे पुनर्निर्देश करा गा है, या तव गलत पन्ना संपादन करा जात है ।\nअगर आप \"{{int:savearticle}}\" पे फिरसे क्लिक करा जाइ तो इ पुनर्निर्देश बनि जाइ ।",
+       "missingsummary": "'''ध्यान दिहा जाय:''' आप  संपादन सारांश नाइ दिहा गा है।\nअगर आप दुबारा \"$1\" पे क्लिक करा जाई तव आप कय संपादन बिना सारांश कय सहेज जाई।",
+       "selfredirect": "<strong>चेतावनी:</strong> आप इ पन्नवा कय इहि से निर्देश करय जावा जात है.\nआप या तव गलत लक्ष्य पे पुनर्निर्देश करा गा है, या तव गलत पन्ना संपादन करा जात है ।\nअगर आप \"$1\" पे फिरसे क्लिक करा जाइ तो इ पुनर्निर्देश बनि जाइ ।",
        "missingcommenttext": "कृपया नीचे टिप्पणी दिहा जाय।",
-       "missingcommentheader": "'''ध्यान दिहा जाय:''' आप इ टिप्पणी कय कवनो शिर्षक नाइ दिहा गा है।\nअगर आप दुबारा \"{{int:savearticle}}\" पे क्लिक करा जाई तव आप कय बदलाव बिना शिर्षक कय सहेज जाई।",
+       "missingcommentheader": "'''ध्यान दिहा जाय:''' आप इ टिप्पणी कय कवनो शिर्षक नाइ दिहा गा है।\nअगर आप दुबारा \"$1\" पे क्लिक करा जाई तव आप कय बदलाव बिना शिर्षक कय सहेज जाई।",
        "summary-preview": "सारांश कय झलक:",
        "subject-preview": "विषय/शीर्षक कय झलक:",
        "previewerrortext": "आपके परिवर्तनों का पूर्वावलोकन करने का प्रयास करते समय एक त्रुटि हुई।",
        "editingsection": "$1 सम्पादन करा जात है (अनुभाग)",
        "editingcomment": "$1 सम्पादन करा जात है (नँवा अनुभाग)",
        "editconflict": "संपादन अंतर्विरोध: $1",
-       "explainconflict": "आप कय द्वारा सम्पादन शुरू करय कय बाद से कवनो दुसर मनई इ पन्ना में बदलाव करे हैं।\nऊपरी पाठ सम्पादन क्षेत्र में अभिन कय पाठ देखाइ गा है।\nनिचला क्षेत्र में आप कय बदलाव देखाइ गा है।\nआप कय आपन बदलाव अबहिन कय पाठ में अपने से एकट्ठा करेक परि।\nआपके \"{{int:savearticle}}\" पर क्लिक करने पर '''केवल''' ऊपरी क्षेत्र में दिखने वाला पाठ संजोया जायेगा।",
+       "explainconflict": "आप कय द्वारा सम्पादन शुरू करय कय बाद से कवनो दुसर मनई इ पन्ना में बदलाव करे हैं।\nऊपरी पाठ सम्पादन क्षेत्र में अभिन कय पाठ देखाइ गा है।\nनिचला क्षेत्र में आप कय बदलाव देखाइ गा है।\nआप कय आपन बदलाव अबहिन कय पाठ में अपने से एकट्ठा करेक परि।\nआपके \"$1\" पर क्लिक करने पर '''केवल''' ऊपरी क्षेत्र में दिखने वाला पाठ संजोया जायेगा।",
        "yourtext": "आप कय पाठ",
        "storedversion": "सहेज़ल अवतरण",
        "nonunicodebrowser": "'''सावधान: आप कय ब्राउज़र युनिकोड कय स्वीकार नाइ करत है।'''\nआप से बढिया संपादन होएक लिये: ग़ैर-ASCII कैरैक्टर षट्‍पदी कोड (hexadecimal) में देखाइ जाई।",
        "right-editsemiprotected": "अइसन पन्नन् कय सम्पादन करा जाय जवने कय सुरक्षा स्तर होय \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "पन्ना कय सामग्री नमुना कय बदला जाय",
        "right-editinterface": "सॉफ़्टवेयर इंटरफ़ेस सम्पादित करा जाय",
-       "right-editusercssjs": "अउर सदस्यन् कय सी॰एस॰एस अव जावास्क्रिप्ट पन्ना कय सम्पादन करा जाय",
        "right-editusercss": "अउर सदस्यन् कय सी॰एस॰एस पन्ना सम्पादन करा जाय",
        "right-edituserjs": "अउर सदस्यन् कय जावास्क्रिप्ट पन्ना कय सम्पादन करा जाय",
        "right-editmyusercss": "आपन सदस्य स्तर कय सी॰एस॰एस फ़ाइल कय सम्पादन करा जाय",
        "rcshowhidemine": "हमार बदलाव $1",
        "rcshowhidemine-show": "देखावा जाय",
        "rcshowhidemine-hide": "लुकुआवा जाय",
-       "rclinks": "पिछला $2 दिन में करल $1 बदलाव देखावा जाय<br />$3",
+       "rclinks": "पिछला $2 दिन में करल $1 बदलाव देखावा जाय",
        "diff": "अंतर",
        "hist": "इतिहास",
        "hide": "लुकुआवा जाय",
        "undeleteviewlink": "देखा जाय",
        "undeleteinvert": "चुनाव उल्टा करा जाय",
        "undeletecomment": "कारण:",
-       "undeletedrevisions": "{{PLURAL:$1|अवतरण पहिले जइसन कै गय}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 अवतरण|$1 अवतरण}} औ {{PLURAL:$2|1 फ़ाइल}} पहिले जइसन कै गय",
-       "undeletedfiles": "{{PLURAL:$1|1 फ़ाइल|$1 फ़ाइल}} पहिले जइसन कै गय",
        "cannotundelete": "पहिले जइसन नाइ कै मिला : $1",
        "undeletedpage": "'''$1 कय पहिले जइसन कै गए'''\n\nहालिए में हटावल अव पुनर्स्थापित करल पन्नन् कय जानकारी कय खर्तीन [[Special:Log/delete|हटावे कय लॉग]] देखा जाय।",
        "undelete-header": "हालिए में हटावल पन्ना द़ेखयक खर्तीन [[Special:Log/delete|हटावे कय लॉग]] देखा जाय।",
        "logentry-rights-autopromote": "$1 के सदस्य समूह स्वतः $4 से बदलकर $5 {{GENDER:$2|किये}} गए",
        "logentry-upload-upload": "$1 {{GENDER:$2|ने}} $3 अपलोड किया",
        "rightsnone": "(कउनो नाहीं)",
-       "revdelete-summary": "संपादन सारांश",
        "feedback-adding": "पृष्ठ पे प्रतिक्रिया जोडत है ...",
        "feedback-back": "पीछे",
        "feedback-bugcheck": "शानदार! जांच ले कहीं ये [ $1 known bugs] पहले से ही न हो ।",
index 4aa597b..8911474 100644 (file)
        "externaldberror": "Verilənlər bazasının doğruluğunu yoxlamada xəta baş verib və yaxud sizin xarici istifadəçi qeydiyyatını yeniləmək hüququnuz yoxdur.",
        "login": "Daxil ol",
        "nav-login-createaccount": "Daxil ol / hesab yarat",
-       "userlogin": "Daxil ol və ya qeydiyyatdan keç",
-       "userloginnocreate": "Daxil ol",
        "logout": "Çıxış",
        "userlogout": "Çıxış",
        "notloggedin": "Daxil olmamısınız",
        "userlogin-noaccount": "İstifadəçi hesabınız yoxdur?",
        "userlogin-joinproject": "{{SITENAME}} layihəsinə qoşulun",
-       "nologin": "İstifadəçi hesabınız yoxdur? $1.",
-       "nologinlink": "Hesab yarat",
        "createaccount": "Hesab yarat",
-       "gotaccount": "İstifadəçi hesabınız varmı? '''$1'''.",
-       "gotaccountlink": "Daxil olun",
-       "userlogin-resetlink": "Daxilolma məlumatlarınızı unutmusunuz?",
        "userlogin-resetpassword-link": "Parolunuzu unutmusunuz?",
        "userlogin-helplink2": "Qeydiyyat barədə köməklik",
        "userlogin-loggedin": "Siz artıq {{GENDER:$1|$1}} kimi daxil olmusunuz.\nAşağıdakı formadan istifadə edərək, başqa bir istifadəçi kimi daxil ola bilərsiniz.",
        "createacct-another-email-ph": "E-poçt ünvanını daxil edin",
        "createaccountmail": "Müvəqqəti təsadüfi bir paroldan istifadə edə bilər və bu parolu göstərilən e-poçt ünvanına göndərə bilərsiniz",
        "createacct-realname": "Əsl adınız (məcburi deyil)",
-       "createaccountreason": "Səbəb:",
        "createacct-reason": "Səbəb",
        "createacct-reason-ph": "Niyə başqa bir hesab yaradırsınız",
        "createacct-submit": "İstifadəçi hesabı yarat",
        "password-login-forbidden": "Bu istifadəçi adından və paroldan istifadə qadağan olunub.",
        "mailmypassword": "E-mail ilə yeni parol göndər",
        "passwordremindertitle": "{{SITENAME}} parol xatırladıcı",
-       "passwordremindertext": "Birisi (yəqin ki siz, $1 IP ünvanından) {{SITENAME}} ($4) üçün yeni bir parol göndərilməsini istədi. \"$2\" istifadəçisinə müvəqqəti olaraq \"$3\" parolu yaradıldı. Əgər bu sizin istyinizdirsə, hesab açıb yeni bir parol yaratmağınız vacibdir. Müvəqqəti parolunuzun müddəti {{PLURAL:$5|1 gün|$5 gün}} içində dolacaqdır.\n\nParol dəyişdirməni siz istəməmisinizsə və ya parolunuzu xatırladınızsa və artıq parolunuzu dəyişdirmək isteəmirsinizsə; bu mesaja əhəmiyyət vermədən əski parolunuzdan istifadə etməyə davam edə bilərsiniz.",
+       "passwordremindertext": "Kimsə (ehtimal ki siz özünüz, $1 IP ünvanından) {{SITENAME}} ($4) layihəsi \nüçün yeni bir parol göndərilməsini istəyib. \"$2\" adlı istifadəçi üçün müvəqqəti \nolaraq \"$3\" parolu yaradılıb. Əgər bu sizin istəyiniz əsasında olubsa, \nhesabınıza daxil olaraq yeni bir parol yaratmağınız vacibdir. Müvəqqəti parolunuz\n{{PLURAL:$5|1 gün|$5 gün}} ərzində qüvvədə olacaqdır.\n\nParol dəyişdirməni siz istəməmisinizsə və ya parolunuzu xatırladınızsa \nvə artıq parolunuzu dəyişdirmək istəmirsinizsə, bu mesaja əhəmiyyət vermədən \nəvvəlki parolunuzdan istifadə etməyə davam edə bilərsiniz.",
        "noemail": "\"$1\" adlı istifadəçi e-poçt ünvanını qeyd etməmişdir.",
        "noemailcreate": "Düzgün e-poçt ünvanı qeyd etməlisiniz",
        "passwordsent": "Yeni parol \"$1\" üçün qeydiyyata alınan e-poçt ünvanına göndərilmişdir.\nXahiş edirik, e-məktubu aldıqdan sonra yenidən daxil olasınız.",
        "passwordreset-domain": "Domen:",
        "passwordreset-email": "E-mail ünvanı:",
        "passwordreset-emailtitle": "{{SITENAME}} hesabın yaradılması",
+       "passwordreset-emailtext-ip": "Kimsə, (ehtimal ki siz özünüz, $1 IP adresindən) {{SITENAME}} ($4) layihəsindəki hesabınızın \nparolunun yenilənməsini istəyib. Aşağıdakı istifadəçi {{PLURAL:$3|hesabı|hesabları}} bu e-poçt adresinə bağlıdır:\n\n$2\n\nBu müvəqqəti {{PLURAL:$3|parol|parollar}} {{PLURAL:$5|bir gün|$5 gün}} qüvvədə olacaqdır.\nSiz müvəqqəti parolla daxil olub yeni bir parol seçməlisiniz. Əgər parolun dəyişdirilməsini siz istəməmisinizsə və ya parolunuzu xatırladınızsa və artıq onu dəyişmək istəmirsinizsə, bu məktuba əhəmiyyət verməyərək köhnə parolunuzu istifadə etməyə davam edə bilərsiniz.",
        "passwordreset-emailelement": "İstifadəçi adı: \n$1\n\nMüvəqqəti parol: \n$2",
        "passwordreset-emailsentemail": "Xəbərdarlıq məktubu e-maillə göndərildi.",
        "changeemail": "E-məktub ünvanını dəyiş və ya sil",
        "subject": "Mövzu:",
        "minoredit": "Kiçik redaktə",
        "watchthis": "Bu səhifəni izlə",
-       "savearticle": "Səhifəni qeyd et",
+       "savearticle": "Səhifəni dərc et",
        "publishpage": "Səhifəni yayımla",
        "publishchanges": "Dəyişiklikləri yayımla",
        "preview": "Sınaq görüntüsü",
        "content-model-wikitext": "vikimətn",
        "content-model-text": "adi mətn",
        "content-model-javascript": "JavaScript",
+       "duplicate-args-warning": "<strong>Diqqət:</strong> [[:$1]] \"$3\" parametri üçün birdən artıq göstəricisi olan [[:$2]] şablonunu çağırır. Yalnız sonuncu göstərici istifadə ediləcək.",
        "expensive-parserfunction-category": "Kifayət qədər böyük sayda genişresurslu funksiyaların müraciət olunduğu səhifələr",
        "post-expand-template-inclusion-warning": "'''DİQQƏT!''' Daxil edilən şablonların həcmi həddindən artıq böyükdür.\nBəzi şablonlar əlavə olunmayacaq.",
        "post-expand-template-inclusion-category": "Şablonun daxil olduğu səhifələrin ölçüsü böyükdür.",
        "prefs-timeoffset": "Saat qurşağının fərqi",
        "prefs-advancedediting": "Ümumi parametrlər",
        "prefs-editor": "Redaktor",
+       "prefs-preview": "İlkin baxış",
        "prefs-advancedrc": "Ətraflı variantlar",
        "prefs-advancedrendering": "Ətraflı variantlar",
        "prefs-advancedsearchoptions": "Ətraflı variantlar",
        "right-protect": "Mühafizə səviyyəsinin dəyişilməsi və kaskad mühafizə olunan səhifələrin redaktə edilməsi",
        "right-editprotected": "\"{{int:protect-level-sysop}}\" mühafizə səviyyəsinə malik səhifələrin redaktə edilməsi",
        "right-editinterface": "İstifadəçi interfeysini dəyişmək",
-       "right-editusercssjs": "Digər istifadəçilərin CSS və JavaScript fayllarını redaktə",
        "right-editusercss": "Digər istifadəçilərin CSS faylını redaktə",
        "right-edituserjs": "Digər istifadəçilərin JavaScript faylını redaktə",
        "right-markbotedits": "Geri qaytarılan dəyişikliklərin bot dəyişiklikləri kimi işarələnməsi",
        "rcshowhidemine-hide": "Gizlət",
        "rcshowhidecategorization-show": "Göstər",
        "rcshowhidecategorization-hide": "Gizlət",
-       "rclinks": "Son $2 gün ərzindəki son $1 dəyişikliyi göstər <br />$3",
+       "rclinks": "Son $2 gün ərzindəki son $1 dəyişikliyi göstər",
        "diff": "fərq",
        "hist": "tarixçə",
        "hide": "Gizlə",
        "undeleteviewlink": "görünüş",
        "undeleteinvert": "Seçilən xaricindəkiləri",
        "undeletecomment": "Səbəb:",
-       "undeletedrevisions": "Cəmi {{PLURAL:$1|1 redaktə|$1 redaktə}} geri qaytarıldı.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 versiya|$1 versiya}} və {{PLURAL:$2|1 fayl|$2 fayl}} bərpa edildi",
-       "undeletedfiles": "{{PLURAL:$1|1 fayl|$1 fayl}} bərpa olundu",
        "cannotundelete": "Bərpaetmə xətası:\n$1",
        "undeletedpage": "'''$1 bərpa edildi'''\n\nMəqalələrin bərpa edilməsi və silinməsi haqqında son dəyişiklikləri nəzərdən keçirmək üçün [[Special:Log/delete|silmə qeydlərinə]] baxın.",
        "undelete-header": "Son silinmiş səhifələrə baxmaq üçün [[Special:Log/delete|silmə qeydlərinə]] bax.",
        "badipaddress": "Səhv IP",
        "blockipsuccesssub": "Bloklandı",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] bloklanıb.<br />\nBlokları yoxlamaq üçün [[Special:BlockList|bloklama siyahısına]] baxın.",
-       "ipb-blockingself": "Özünü bloklayacaqsınız.! Bunu etmək istədiyinizdən əminsinizmi?",
+       "ipb-blockingself": "Özünüzü bloklayacaqsınız! Bunu etmək istədiyinizdən əminsinizmi?",
        "ipb-confirmhideuser": "Siz \"istifadəçini gizlə\" bəndini aktiv edərək istifadəçini bloklamaq üzrəsiniz. Bu halda istifadəçinin adı bütün siyahılarda və qeydiyyat jurnallarında görünməyəcək. Bunu etmək istədiyinizdən əminsinizmi?",
        "ipb-edit-dropdown": "Bloklama səbəblərini redaktə et",
        "ipb-unblock-addr": "$1 üzərindəki blok götürüldü",
        "confirmemail_success": "E-poçt ünvanınız indi təsdiq edildi. Siz indi [[Special:UserLogin|hesab açaraq]] vikidən həzz ala bilərsiz.",
        "confirmemail_loggedin": "E-məktubunuz indi təsdiq edildi.",
        "confirmemail_subject": "{{SITENAME}} e-məktub təsdiq etmə",
+       "confirmemail_body": "Kimsə, ehtimal ki, siz özünüz, $1 IP adresindən \n{{SITENAME}} layihəsində bu e-poçt adresi ilə \"$2\" adlı istifadəçi hesabını qeydiyyatdan keçirib.\n\nBu hesabın həqiqətən sizə aid olduğunu təsdiq etmək və {{SITENAME}} saytındakı\ne-poçt əməliyyatlarını aktivləşdirmək üçün aşağıdakı linki brauzerinizdə açın:\n\n$3\n\nƏgər hesabı siz *açmamısınızsa*, e-poçt adresi təsdiqlənməsini ləğv etmək\nüçün aşağıdakı linkə daxil olun:\n\n$5\n\nBu təsdiq kodu $4 tarixinə qədər aktiv olacaqdır.",
+       "confirmemail_body_changed": "Kimsə, ehtimal ki, siz özünüz, $1 IP adresindən \n{{SITENAME}} layihəsindəki \"$2\" adlı istifadəçi hesabı üçün e-poçt adresini dəyişdirib.\n\nBu hesabın həqiqətən sizə aid olduğunu təsdiq etmək və {{SITENAME}} saytındakı\ne-poçt əməliyyatlarını yenidən aktivləşdirmək üçün aşağıdakı linki brauzerinizdə açın:\n\n$3\n\nƏgər hesab sizə aid *deyilsə*, e-poçt adresi təsdiqlənməsini ləğv etmək\nüçün aşağıdakı linkə daxil olun:\n\n$5\n\nBu təsdiq kodu $4 tarixinə qədər aktiv olacaqdır.",
+       "confirmemail_body_set": "Kimsə, ehtimal ki, siz özünüz, $1 IP adresindən \n{{SITENAME}} layihəsindəki \"$2\" adlı istifadəçi hesabı üçün e-poçt adresi olaraq bu adresi göstərib.\n\nBu hesabın həqiqətən sizə aid olduğunu təsdiq etmək və {{SITENAME}} saytındakı\ne-poçt əməliyyatlarını aktivləşdirmək üçün aşağıdakı linki brauzerinizdə açın:\n\n$3\n\nƏgər hesab sizə aid *deyilsə*, e-poçt adresi təsdiqlənməsini ləğv etmək\nüçün aşağıdakı linkə daxil olun:\n\n$5\n\nBu təsdiq kodu $4 tarixinə qədər aktiv olacaqdır.",
        "confirmemail_invalidated": "E-mail təsdiqlənməsi dayandırıldı",
        "invalidateemail": "E-mail təsdiqlənməsindən imtina",
+       "notificationemail_body_changed": "Kimsə, ehtimal ki, siz özünüz, $1 IP adresindən {{SITENAME}} layihəsindəki \n\"$2\" adlı istifadəçi hesabının e-poçt adresini \"$3\" ilə əvəz edib.\n\nƏgər bunu siz etməmisinizsə, o zaman dərhal saytın administratoru ilə əlaqə saxlayın.",
+       "notificationemail_body_removed": "Kimsə, ehtimal ki, siz özünüz, $1 IP adresindən {{SITENAME}} layihəsindəki \n\"$2\" adlı istifadəçi hesabının e-poçt adresini silib.\n\nƏgər bunu siz etməmisinizsə, o zaman dərhal saytın administratoru ilə əlaqə saxlayın.",
        "scarytranscludedisabled": "[«Interwiki transcluding»dən çıxılmışdır]",
        "scarytranscludetoolong": "[URL uzundur]",
        "deletedwhileediting": "'''Diqqət!''' Bu səhifə siz redaktə etməyə başladıqdan sonra silinmişdir!",
        "logentry-newusers-autocreate": "$1 istifadəçi hesabı avtomatik yaradıldı",
        "logentry-upload-upload": "$1 $3 faylını {{GENDER:$2|yüklədi}}.",
        "rightsnone": "(yoxdur)",
-       "revdelete-summary": "redaktə xülasəsi",
        "feedback-bugnew": "Mən yoxladım. Yeni xəta barədə xəbər ver",
        "feedback-cancel": "İmtina",
        "feedback-close": "Oldu",
        "duration-centuries": "$1 {{PLURAL:$1|əsr|əsr}}",
        "duration-millennia": "$1 {{PLURAL:$1|minillik|minillik}}",
        "limitreport-cputime": "CPU vaxt istifadəsi",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|saniyə|saniyə}}",
        "limitreport-walltime": "Real vaxt istifadəsi",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|saniyə|saniyə}}",
        "limitreport-postexpandincludesize-value": "$1/$2 bayt",
        "expand_templates_output": "Nəticə",
        "expand_templates_ok": "OK",
index fa43219..a65a7d1 100644 (file)
        "redirectedfrom": "($1-دن يوْل‌لاندیریلمیش)",
        "redirectpagesub": "یوْللاندیرما صفحه‌سی",
        "redirectto": "مسیزپرین دَییشیب:",
-       "lastmodifiedat": "بۇ صفحه‌‌ سوْن دفعه $1، $2 تاریخینده دَییشیلمیشدیر.",
+       "lastmodifiedat": "بۇ صفحه‌‌ سوْن دفعه $1، $2 تاریخینده دَییشدیریلمیشدیر.",
        "viewcount": "بۇ صحیفه {{PLURAL:$1|بیر|$1}} دفعه گؤرولوبدور.",
        "protectedpage": "قوْرونموش صفحه",
        "jumpto": "آتیل:",
        "login": "گیریش",
        "login-security": "کیملیگینیزی تائید ائدین",
        "nav-login-createaccount": "گیریش / حساب یارات",
-       "userlogin": "گیریش / حساب یارات",
-       "userloginnocreate": "گیریش",
        "logout": "چیخیش",
        "userlogout": "چیخیش",
        "notloggedin": "گیرمه‌میسینیز",
        "userlogin-noaccount": "حسابینیز یوخدورمو؟",
        "userlogin-joinproject": "{{SITENAME}}-ه قوشولون",
-       "nologin": "حسابینیز یوخدومو؟ $1.",
-       "nologinlink": "حساب یارات",
        "createaccount": "حساب یارات",
-       "gotaccount": "اؤنجه‌دن حسابینیز وارمی؟ $1.",
-       "gotaccountlink": "گیریش",
-       "userlogin-resetlink": "گیریش بیلگیلرینیزی اونوتموسونوز؟",
        "userlogin-resetpassword-link": "رمزینیزی اونوتموسوز مو؟",
        "userlogin-helplink2": "گیریش ایله کؤمک",
        "userlogin-loggedin": "سیر حال حاضیردا {{GENDER:$1|$1}} عونوانیندا گیریش ائدیب سیز.\nآشاغیداکی فورمودان بیر آیری ایشلدن عونوانیندا گیریش اوچون ایشلدین.",
        "createacct-another-email-ph": "ایمیل آدرسینیزی یازین",
        "createaccountmail": "بیر گئچیجی راست‌گله رمز ایشلت و اونو آشاغیدا بللندیرن ایمیل آدرسینه گؤندر",
        "createacct-realname": "دوغرو آد (ایستگه باغلی)",
-       "createaccountreason": "نَدَن‌لیک:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "ندن سیز باشقا حساب یارادیرسینیز",
        "createacct-reason-help": "حساب یاراتماق لیستینده گؤستریلن مساژ",
        "savearticle": "صفحه‌نی ذخیره ائت",
        "savechanges": "دَییشیکلیکلری ذخیره ائت",
        "publishpage": "صفحه‌نی یاییملا",
-       "publishchanges": "دَییشیک‌لیک‌لری یاییملا",
+       "publishchanges": "دَییشیک‌لیکلری یای",
        "preview": "اؤن‌گؤستریش",
        "showpreview": "سیناق گؤستریش",
        "showdiff": "دَییشیکلیکلری گؤستر",
-       "blankarticle": "<strong>دیققت:</strong>سیز بیر بوش صفحه نین یاراتماق حالیندا سیز .\nایر«{{int:savearticle}}» بیر ده باسایلا،بوش صفحه یاراناجاق.",
+       "blankarticle": "<strong>دیققت:</strong>سیز بیر بوش صفحه نین یاراتماق حالیندا سیز .\nایر«$1» بیر ده باسایلا،بوش صفحه یاراناجاق.",
        "anoneditwarning": "<strong>دیقت:</strong> سیز سیستمه گیرمه‌میسینیز. سیزین آی‌پی آدرسینیز بۇ صفحه‌نین دییشیک گئچمیشینده یازیلب و گؤروشه‌جک.هر دَییشدیرمه ائتسز.<strong>[$1 گیریش ائتسز]</strong> یا <strong>[$2 بیر ایشلدن حسابی آچاسیز]</strong>, دَییشدیرمه‌لرینیز سیزین ایشلدن حساب آدینیزا نیسبت وئریله‌جک و آرتیق مزیتلرله.",
        "anonpreviewwarning": "<em> سیستمه گیرمه‌میسینیز. ذخیره ائتمک‌له، سیزین آی‌پی آدرسینیز بو صفحه‌نین گئچمیشینده ثبت اولوناجاقدیر.</em>",
-       "missingsummary": "'''یادا سالما:''' سیز بیر دَییشیکلیک قیساسی یازمامیسینیز. «{{int:savearticle}}» دویمه‌سینی تیک‌لاسازسا، دَییشیکلیگینیز، قیسا شرح‌سیز اولاراق قئید اولوناجاق.",
-       "selfredirect": "<strong>دیققت:</strong>سیز صفحه نین یولون اوزونه دَییشدیریمک حالیندا سیز.\nایمکانی وار یانلیش سون بیر یئری یولون دَییشمک اوچون سئچیب سیز،یا دا صفحه نی یانلیش دَییشدیرسیز.\nایر\"{{int:savearticle}}\" اوستون یئنی دن باساسینیز یولون دَییشیکلیگی دوزلجک.",
+       "missingsummary": "'''یادا سالما:''' سیز بیر دَییشیکلیک قیساسی یازمامیسینیز. «$1» دویمه‌سینی تیک‌لاسازسا، دَییشیکلیگینیز، قیسا شرح‌سیز اولاراق قئید اولوناجاق.",
+       "selfredirect": "<strong>دیققت:</strong>سیز صفحه نین یولون اوزونه دَییشدیریمک حالیندا سیز.\nایمکانی وار یانلیش سون بیر یئری یولون دَییشمک اوچون سئچیب سیز،یا دا صفحه نی یانلیش دَییشدیرسیز.\nایر\"$1\" اوستون یئنی دن باساسینیز یولون دَییشیکلیگی دوزلجک.",
        "missingcommenttext": "لوطفاً آشاغی‌دا بیر یوروم یازین.",
-       "missingcommentheader": "<strong>یادا سالما:</strong> سیز یورومونوز اوچون بیر قونو یازمامیسینیز.\n«{{int:savearticle}}»-ی تیک‌لاسازسا، دَییشیکلیگینیز، قونوسوز قئید اولوناجاق‌دیر.",
+       "missingcommentheader": "<strong>یادا سالما:</strong> سیز یورومونوز اوچون بیر قونو یازمامیسینیز.\n«$1»-ی تیک‌لاسازسا، دَییشیکلیگینیز، قونوسوز قئید اولوناجاق‌دیر.",
        "summary-preview": "قیسا اؤن‌گؤستریش:",
        "subject-preview": "قونو اؤن‌گؤستریشی:",
        "previewerrortext": "سیزین دَییشدیرمه‌لرینیزین اؤن‌گؤسترمه‌سینده بیر خطا قاباغا گلدی.",
        "editingsection": "$1 دَییشدیریلیر (بؤلوم)",
        "editingcomment": "$1 دَییشدیریلیر (یئنی بؤلوم)",
        "editconflict": "عینی واختدا دییشدیرمک: $1",
-       "explainconflict": "سیز صحیفه‌‌نی رئداکته باشقا بیری ده ديَیشیکلیک ائتدی. \nيوخاریداکی يازی صحیفه‌‌نین بو آنکی حالینی گؤستریر. \nسیزین ديَیشیکلیکلری‌نین آلتا گؤستریلمیشدیر. سون دئغیشیکلئرینیزی يازی‌نین ایچینه داخیل ائتمه‌يینیز لازیم اولاجاق. \n«{{int:savearticle}}» ائ باسدیغینیزداع' ' يالنیزعع' يوخاریداکی يازی يازیلاجاق.",
+       "explainconflict": "سیز صحیفه‌‌نی رئداکته باشقا بیری ده ديَیشیکلیک ائتدی. \nيوخاریداکی يازی صحیفه‌‌نین بو آنکی حالینی گؤستریر. \nسیزین ديَیشیکلیکلری‌نین آلتا گؤستریلمیشدیر. سون دئغیشیکلئرینیزی يازی‌نین ایچینه داخیل ائتمه‌يینیز لازیم اولاجاق. \n«$1» ائ باسدیغینیزداع' ' يالنیزعع' يوخاریداکی يازی يازیلاجاق.",
        "yourtext": "یازینیز",
        "storedversion": "قئید ائدیلمیش نوسخه",
        "nonunicodebrowser": "' 'دیققت: آختاریش برنامه نیز اویغون دئییل.\nصحیفه‌لری اعتبارلا دییشدیرمیینیزه ایجازه وئرمک اوچون: آسجیی اولمایان کاراکتئرلر دییشدیرمه قوتوسوندا اونالتیلیک کودلار اولا‌راق گؤرونه‌جک.' '",
        "right-editsemiprotected": "«{{int:protect-level-autoconfirmed}}» جوره قورونموش صحیفه‌لری دَییشدیر",
        "right-editcontentmodel": "صفحه نین ایچریک مودلین دَییشدیر",
        "right-editinterface": "ایستیفاده‌چی آرا-اوزونو دَییشدیر",
-       "right-editusercssjs": "باشقا ایستیفاده‌چیلرین سی‌اس‌اس و جاوااسکریپت فایل‌لارینی دَییشدیر",
        "right-editusercss": "باشقا ایستفاده‌چیلرین سی‌اس‌اس فایل‌لارینی دَییشدیر",
        "right-edituserjs": "باشقا ایستیفاده‌چیلرین جاوااسکریپت فایل‌لارینی دَییشدیر",
        "right-editmyusercss": "اؤز ایستیفاده‌چی CSS فایل‌لارینی دَییشدیر",
        "rcshowhidemine-hide": "گیزلت",
        "rcshowhidecategorization": "صفحه‌لر بؤلمه‌لندیرمه‌سی $1",
        "rcshowhidecategorization-hide": "گیزلت",
-       "rclinks": "سون $2 گون عرضینده‌کی سون  $1 ديَیشیکلیگی گؤستر <br />$3",
+       "rclinks": "سون $2 گون عرضینده‌کی سون  $1 ديَیشیکلیگی گؤستر",
        "diff": "فرق",
        "hist": "گئچمیش",
        "hide": "گیزلت",
        "undeleteviewlink": "باخ",
        "undeleteinvert": "سئچیلنی دؤندر",
        "undeletecomment": "ندن:",
-       "undeletedrevisions": "جمعی {{PLURAL:$1|بیر دییش|$1 دییشدیر}} گئری قایتاریلدی.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 نوسخه|$1 نوسخه}} و {{PLURAL:$2|1 فایل|$2 فایل}} برپا ائدیلدی",
-       "undeletedfiles": "{{PLURAL:$1|1 فایل|$1 فایل}} برپا اولوندو",
        "cannotundelete": "برپا ائدیلمه اولمادی\n\n$1",
        "undeletedpage": "'$1 برپا ائدیلدی\n\nمقاله‌لرین برپا ائدیلمه‌سی و سیلینمه‌سی حاقیندا سون دییشیک‌لیک‌لری نظردن کئچیرمک اوچون [[Special:Log/delete|سیلمه قئیدلرینه]] باخین.",
        "undelete-header": "سون سیلینمیش صحیفه‌لره باخماق اوچون [[Special:Log/delete|سیلمه قئیدلرینه]] باخ.",
        "log-name-managetags": "اِتیکت ایداره گئچمیشی",
        "log-name-tag": "اِتیکت ژورنالی",
        "rightsnone": "(هئچ)",
-       "revdelete-summary": "دَییشدیرمه قیساسی",
        "feedback-adding": "صحیفه‌یه گئری-بیلدیریم آرتیریلیر...",
        "feedback-back": "دالی",
        "feedback-bugcheck": "گؤزل! فقط لوطفاً باخین او [$1 تانینمیش خطالار]دان اولماسین.",
index 5470783..2f759d6 100644 (file)
        "login": "Танылыу",
        "login-security": "Үҙ шәхесегеҙҙе раҫлағыҙ",
        "nav-login-createaccount": "Танылыу йәки теркәлеү",
-       "userlogin": "Танылыу йәки теркәлеү",
-       "userloginnocreate": "Танылыу",
        "logout": "Тамамлау",
        "userlogout": "Тамамлау",
        "notloggedin": "Танылмағанһығыҙ",
        "userlogin-noaccount": "Иҫәп яҙмағыҙ юҡмы?",
        "userlogin-joinproject": "Проектҡа ҡушылырға",
-       "nologin": "Һеҙ теркәлмәгәнһегеҙме әле? '''$1'''.",
-       "nologinlink": "Иҫәп яҙыуын булдырырға",
        "createaccount": "Яңы ҡатнашыусыны теркәү",
-       "gotaccount": "Әгәр Һеҙ теркәлеү үткән булһағыҙ? '''$1'''.",
-       "gotaccountlink": "Танылыу",
-       "userlogin-resetlink": "Танылыу мәғлүмәттәрен оноттоғоҙмо?",
        "userlogin-resetpassword-link": "Серһүҙҙе оноттоғоҙмо?",
        "userlogin-helplink2": "Танылыу буйынса ярҙам",
        "userlogin-loggedin": " Һеҙ {{GENDER:$1|$1}} булараҡ индегеҙ инде. Башҡа файҙаланыусы булып инер өсөн аҫтағы ҡалыпты ҡулланығыҙ.",
        "createaccountmail": "Осраҡлы рәүештә хасил ителгән ваҡытлыса серһүҙҙе файҙаланырға һәм уны миңә ошо электрон почтаһы адресына ебәрергә",
        "createaccountmail-help": "Серһүҙен һорамайынса, башҡа кешегә иҫәп яҙмаһын төҙөү өсөн ҡулланыла ала.",
        "createacct-realname": "Ысын исемегеҙ (мотлаҡ түгел)",
-       "createaccountreason": "Сәбәп:",
        "createacct-reason": "Сәбәп",
        "createacct-reason-ph": "Икенсе иҫәп яҙмаһы һеҙгә ни өсөн кәрәк?",
        "createacct-reason-help": "Иҫәп яҙмаһын төҙөү журналында күренгән хәбәр",
        "watchthis": "Күҙәтеү исемлегенә",
        "savearticle": "Яҙҙырып ҡуйырға",
        "savechanges": "Яҙҙырып ҡуйырға",
-       "publishpage": "Ð\91иÑ\82Ñ\82е Ð±Ð°Ò«Ñ\82Ñ\8bÑ\80ырға",
+       "publishpage": "ЯÒ\99Ò\99Ñ\8bÑ\80Ñ\8bп Ò¡Ñ\83йырға",
        "publishchanges": "Яҙҙырып ҡуйырға",
        "preview": "Ҡарап сығыу",
        "showpreview": "Ҡарап сығырға",
        "showdiff": "Индерелгән үҙгәрештәр",
-       "blankarticle": "<strong>Иҫкәртеү:</strong> Һеҙ булдырасаҡ бит буш.\nӘгәр тағы ла «{{int:savearticle}}» кнопкаға баҫһағыҙ, шул уҡ йөкмәткеле бит  яңынан барлыҡҡа киләсәк.",
+       "blankarticle": "<strong>Иҫкәртеү:</strong> Һеҙ булдырасаҡ бит буш.\nӘгәр тағы ла «$1» кнопкаға баҫһағыҙ, шул уҡ йөкмәткеле бит  яңынан барлыҡҡа киләсәк.",
        "anoneditwarning": "<strong>Иғтибар!</strong> Һеҙ сайтта теркәлмәнегеҙ. Әгәр ҙә һеҙ ниндәй ҙә булһа төҙәтмәләр  йәки үҙгәртүҙәр индерһәгеҙ, һеҙҙең IP-адрес башҡаларға ла күрһәтеләсәк. Сайтҡа <strong>[$1 керһәгеҙ]</strong> йәки <strong>[$2 ҡуллануысы яҙмаһын төҙөһәгеҙ]</strong>, һеҙ индергән үҙгәртеүҙәр һеҙҙең ҡулланыусы яҙмағыҙға бәйләнгән була, шулай уҡ башҡа мөмкинлектәр ҙә тыуасаҡ.",
        "anonpreviewwarning": "''Һеҙ танылмағанһығыҙ. Яҙҙырыу ваҡытында IP-адресығыҙ был биттең үҙгәртеүҙәр тарихына яҙыласаҡ.''",
        "missingsummary": "'''Иҫкәртеү.''' Һеҙ үҙгәртеүҙергә ҡыҫҡа тасуирлама яҙманығыҙ. Ҡабаттан «Битте һаҡларға» төймәһенә баҫһағыҙ, үҙгәртеүҙәрегеҙ тасуирламаһыҙ һаҡланасаҡ.",
-       "selfredirect": "<strong>Иғтибар:</strong> Һеҙ шул уҡ мәҡәләгә йүнәлтеү эшләйһегеҙ.\n «{{int:savearticle}}» төәмәһенә баҫһағыҙ тағы шул биткә йүнәлтеләсәк.",
+       "selfredirect": "<strong>Иғтибар:</strong> Һеҙ шул уҡ мәҡәләгә йүнәлтеү эшләйһегеҙ.\n «$1» төәмәһенә баҫһағыҙ тағы шул биткә йүнәлтеләсәк.",
        "missingcommenttext": "Зинһар, аҫҡа үҙ тасуирламағыҙҙы керетегеҙ.",
-       "missingcommentheader": "'''Иҫкәртеү:''' Һеҙ был комментарий өсөн тема/исем яҙманығыҙ.\n«{{int:savearticle}}» төймәһенә ҡабат баҫыу менән үҙгәртеүҙерегеҙ исемһеҙ яҙыласаҡ.",
+       "missingcommentheader": "'''Иҫкәртеү:''' Һеҙ был комментарий өсөн тема/исем яҙманығыҙ.\n«$1» төймәһенә ҡабат баҫыу менән үҙгәртеүҙерегеҙ исемһеҙ яҙыласаҡ.",
        "summary-preview": "Буласаҡ тасуирлама:",
        "subject-preview": "Тема/башлыҡты алдан ҡарау:",
        "previewerrortext": "Алдан ҡарау ваҡытында хата китте.",
        "editingsection": "Мөхәррирләү  $1 (секция)",
        "editingcomment": "$1 мөхәррирләнә (яңы бүлек)",
        "editconflict": "Мөхәррирләү конфликты: $1",
-       "explainconflict": "Һеҙ был битте мөхәррирләгән ваҡытта кемдер яңы үҙгәрештәр керетте.\nМөхәррирләү тәҙрәһенең өҫкө өлөшөндә биттең ағымдағы текстын күрәһегеҙ.\nАҫта, һеҙҙең вариант күрһәтелгән. Кереткән үҙгәрештерегеҙҙе аҫҡы тәҙрәнән өҫкә күсерегеҙ.\n«{{int:savearticle}}» төймәһенә баҫҡас өҫтәге тәҙрәнең тексты һаҡланасаҡ.",
+       "explainconflict": "Һеҙ был битте мөхәррирләгән ваҡытта кемдер яңы үҙгәрештәр керетте.\nМөхәррирләү тәҙрәһенең өҫкө өлөшөндә биттең ағымдағы текстын күрәһегеҙ.\nАҫта, һеҙҙең вариант күрһәтелгән. Кереткән үҙгәрештерегеҙҙе аҫҡы тәҙрәнән өҫкә күсерегеҙ.\n«$1» төймәһенә баҫҡас өҫтәге тәҙрәнең тексты һаҡланасаҡ.",
        "yourtext": "Һеҙҙең текст",
        "storedversion": "Һаҡланған версия",
        "nonunicodebrowser": "'''КИҪӘТЕҮ: Һеҙҙең браузер Юникод кодировкаһын танымай.'''\nМәҡәләләрҙе мөхәррирләгән ваҡытта ASCII булмаған символдар махсус уналтылы кодтарға әйләндереләсәк.",
        "userrights-nodatabase": "$1 базаһы юҡ йәки урындағы (локаль) база түгел.",
        "userrights-changeable-col": "Һеҙ үҙгәртә алған төркөмдәр",
        "userrights-unchangeable-col": "Һеҙ үҙгәртә алмаған төркөмдәр",
+       "userrights-expiry-options": "1 көн:1 day,1 аҙна:1 week,1 ай:1 mopnth, 3 ай:3 months,6 ай:6 months,1 йыл:1 year",
        "userrights-conflict": "Ҡатнашыусының хоҡуҡтарын үҙгәртеү яраманы! Зинһар, үҙгәрештәрҙе тикшерегеҙ һәм яңынан индерегеҙ.",
        "group": "Төркөм:",
        "group-user": "Ҡулланыусылар",
        "right-createtalk": "Фекер алышыу битен яһау",
        "right-createaccount": "Ҡатнашыусыларҙың яңы иҫәп яҙыуҙарын булдырыу",
        "right-autocreateaccount": "Ҡатнашыусының тышҡы иҫәп яҙмаһы менән инергә",
-       "right-minoredit": "Ò®ҙгәртеүҙәрҙе \"Әҙ үҙгәрештәр\" тип билдәләү",
+       "right-minoredit": "Ò¯ҙгәртеүҙәрҙе \"Әҙ үҙгәрештәр\" тип билдәләү",
        "right-move": "Биттәрҙең исемен үҙгәртеү",
        "right-move-subpages": "Ҡушымталары менән бергә биттәрҙең исемен алыштырыу",
        "right-move-rootuserpages": "Ҡулланыусыларҙың төп биттәренең исемен үҙгәртеү",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" булараҡ һаҡланған биттәрҙе төҙәтеү",
        "right-editcontentmodel": "Биттең контент моделен мөхәррирләү",
        "right-editinterface": "Ҡулланыусы интерфейсын үҙгәртеү",
-       "right-editusercssjs": "Башҡа ҡатнашыусыларҙың CSS һәм JS файлдарын мөхәррирләү",
        "right-editusercss": "Башҡа ҡатнашыусыларҙың CSS файлдарын мөхәррирләү",
        "right-edituserjs": "Башҡа ҡатнашыусыларҙың JS файлдарын мөхәррирләү",
        "right-editmyusercss": "Файҙаланыусының CSS файлдарын мөхәррирләү",
        "rcshowhidemine": "минең үҙгәртеүҙәремде $1",
        "rcshowhidemine-show": "Күрһәтергә",
        "rcshowhidemine-hide": "Йәшерергә",
-       "rcshowhidecategorization": "$1 биттәрҙе категориялаштырыу",
+       "rcshowhidecategorization": "Биттәр категориялаштырыуын $1",
        "rcshowhidecategorization-show": "Күрһәтергә",
        "rcshowhidecategorization-hide": "Йәшерелгән",
-       "rclinks": "Һуңғы $2 көн эсендәге һуңғы $1 үҙгәртеүҙе күрһәтергә<br />$3",
+       "rclinks": "Һуңғы $2 көн эсендәге һуңғы $1 үҙгәртеүҙе күрһәтергә",
        "diff": "айыр.",
        "hist": "тарих",
        "hide": "йәшер",
        "notargettext": "Һеҙ был ғәмәл өсөн кәрәкле битте йәки ҡатнашыусыны күрһәтмәгәнһегеҙ.",
        "nopagetitle": "Бындай бит юҡ",
        "nopagetext": "Һеҙ күрһәткән бит юҡ.",
-       "pager-newer-n": "$1{{PLURAL:$1|1=1 яңыраҡ|$1 яңыраҡ}}",
+       "pager-newer-n": "{{PLURAL:$1|1=1 яңыраҡ|$1 яңыраҡ}}",
        "pager-older-n": "{{PLURAL:$1|1=1 иҫкерәк|$1 иҫкерәк}}",
        "suppress": "Йәшереү",
        "querypage-disabled": "Был махсус бит һөҙөмтәлелекте арттырыу өсөн ябылған.",
        "listusers-blocked": "(бикләнгән)",
        "activeusers": "Әүҙем ҡатнашыусылар исемлеге",
        "activeusers-intro": "Был — һуңғы $1 {{PLURAL:$1|көн}} эсендә ниҙер башҡарған ҡатнашыусылар исемлеге.",
-       "activeusers-count": "Ò»Ñ\83Ò£Ò\93Ñ\8b $3 {{PLURAL:$3|1=көн}} Ñ\8dÑ\81ендÓ\99ге Ò»Ñ\83Ò£Ò\93Ñ\8b ÐºÓ©Ð½Ð´Ó\99 $1 {{PLURAL:$1|үҙгәртеү}}",
+       "activeusers-count": "ÒºÑ\83Ò£Ò\93Ñ\8b {{PLURAL:$3|$3 ÐºÓ©Ð½Ð´Ó\99}} $1 {{PLURAL:$1|үҙгәртеү}}",
        "activeusers-from": "Ошондай хәрефтәрҙән башланған ҡатнашыусыларҙы күрһәтергә:",
        "activeusers-noresult": "Ҡатнашыусылар табылманы",
        "activeusers-submit": "Әүҙем ҡулланыусыларҙы күрһәтергә",
        "wlshowhideanons": "Аноним ҡулланыусылар",
        "wlshowhidepatr": "Тикшерелгән төҙәтеүҙәр",
        "wlshowhidemine": "Минең үҙгәртеүҙәр",
-       "wlshowhidecategorization": "Ð\91иттәрҙе категориялаштырыу",
+       "wlshowhidecategorization": "биттәрҙе категориялаштырыу",
        "watchlist-options": "Күҙәтеү исемлеге көйләүҙәре",
        "watching": "Күҙәтеү исемлегенә өҫтәү...",
        "unwatching": "Күҙәтеү исемлегенән сығарыу...",
        "undeleteviewlink": "ҡарарға",
        "undeleteinvert": "Һайланғандарҙы әйләндерергә",
        "undeletecomment": "Сәбәп:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|өлгө}} тергеҙелде",
-       "undeletedrevisions-files": "{{PLURAL:$1|1=өлгө}} һәм {{PLURAL:$2|файл}} тергеҙелде",
-       "undeletedfiles": "{{PLURAL:$1|файл}} тергеҙелде",
        "cannotundelete": "Юйыуҙы кире алып булманы:\n$1",
        "undeletedpage": "'''$1 бите тергеҙелде'''\n\nҺуңғы юйыуҙарҙы һәм тергеҙеүҙәрҙе ҡарау өсөн, [[Special:Log/delete|юйыу яҙмалары журналын]] ҡарағыҙ.",
        "undelete-header": "Һуңғы юйылған биттәрҙе [[Special:Log/delete|юйыу яҙмалары журналында]] ҡарағыҙ.",
        "confirmemail": "Электрон почта адресын раҫлау",
        "confirmemail_noemail": "Һеҙҙең [[Special:Preferences|көйләүҙәрегеҙҙә]] дөрөҫ электрон почта адресы юҡ.",
        "confirmemail_text": "{{SITENAME}} проекты электрон почта мөмкинлектәрен ҡулланыр алдынан электрон почта адресының раҫланыуын талап итә.\nЭлектрон адресты раҫлау хаты һеҙҙең почтағыҙға ебәрелһен өсөн, түбәндәге төймәгә баҫығыҙ.\nХатта махсус биткә һылтанма буласаҡ, был һылтанманы браузерығыҙҙа асҡандан һуң, һеҙҙең электрон почта адресығыҙ раҫланған, тип һаналасаҡ.",
-       "confirmemail_pending": "ЭлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81Ñ\8bн Ñ\80аҫлаÑ\83 Ñ\85аÑ\82Ñ\8b Ò»ÐµÒ\99гÓ\99 ÐµÐ±Ó\99Ñ\80елгÓ\99н Ð¸Ð½Ðµ Ð¸Ð½Ð´Ðµ.\nÓ\98гÓ\99Ñ\80 Ò»ÐµÒ\99 Ð¸Ò«Ó\99п Ñ\8fÒ\99маһÑ\8bн Ñ\8fÒ£Ñ\8bÑ\80аҡ Ð±Ñ\83лдÑ\8bÑ\80һаÒ\93Ñ\8bÒ\99, Ò»ÐµÒ\99гÓ\99 Ð±Ñ\8bл Ñ\85аÑ\82Ñ\82Ñ\8b Ñ\8fÒ£Ñ\8bнан Ò»Ð¾Ñ\80аÑ\80 Ð°Ð»Ð´Ñ\8bнан, Ñ\85аÑ\82 ÐºÐ¸Ð»Ð³Ó\99нÑ\81е, Ð±ÐµÑ\80 Ð½Ð¸Ñ\81Ó\99 Ð¼Ð¸Ð½Ñ\83Ñ\82 ÐºÓ©Ñ\82Ó©Ñ\80гÓ\99 ÐºÓ\99Ñ\80Ó\99к.",
+       "confirmemail_pending": "ЭлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81Ñ\8bн Ñ\80аҫлаÑ\83 Ñ\85аÑ\82Ñ\8b Ò»ÐµÒ\99гÓ\99 ÐµÐ±Ó\99Ñ\80елгÓ\99йне.\nÓ\98гÓ\99Ñ\80 Ò»ÐµÒ\99 Ð¸Ò«Ó\99п Ñ\8fÒ\99маһÑ\8bн Ñ\8fÒ£Ñ\8bÑ\80аҡ Ð±Ñ\83лдÑ\8bÑ\80һаÒ\93Ñ\8bÒ\99, Ñ\80аҫлаÑ\83 Ñ\85аÑ\82Ñ\8bн Ò¡Ð°Ð±Ð°Ñ\82Ñ\82ан Ò»Ð¾Ñ\80аÑ\80 Ð°Ð»Ð´Ñ\8bнан, Ñ\8dлеккеһе ÐºÐ¸Ð»Ð³Ó\99нен Ð±ÐµÑ\80 Ð°Ò\99 ÐºÓ©Ñ\82өгөÒ\99.",
        "confirmemail_send": "Электрон почта адресын раҫлау хатын ебәрергә",
        "confirmemail_sent": "Электрон почта адресын раҫлау хаты ебәрелде.",
        "confirmemail_oncreate": "Электрон почта адресын раҫлау хаты һеҙ күрһәткән адрес буйынса ебәрелде.\nХатта күрһәтелгән һылтанма системала танылыу талап итмәй, ләкин элетрон почта мөмкинлектәрен вики проектта ҡулланыр өсөн, һеҙгә танылырға кәрәк.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2||яңыртты}}  $4 өлгөһөнөң тамғаларын $3 битендә ({{PLURAL:$7|өҫтәне}} $6; {{PLURAL:$9|юйылған}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2||а}}журналда билдәләнгән яҙмаларҙы яңыртты $5 биттәр $3 (өҫтәлгән{{PLURAL:$7|а|ы}} $6; юйылған{{PLURAL:$9|а|ы}} $8)",
        "rightsnone": "(юҡ)",
-       "revdelete-summary": "үҙгәртеүҙәр тасуирламаһы",
        "feedback-adding": "Биткә кире белдереү өҫтәлә",
        "feedback-back": "Артҡа",
        "feedback-bugcheck": "Шәп! Тик [$1 билдәле хаталар] исемлегендә оҡшаш белдереүҙең булмауына иғтибар итегеҙ.",
index 585cb1e..4c2c3c6 100644 (file)
        "rcshowhideanons": "$1 penganggo tan meadan",
        "rcshowhidepatr": "$1 suntingan sane kapatroli",
        "rcshowhidemine": "$1 uwahan titiang",
-       "rclinks": "edengang sane untat $1 gentosan anyar $2 dina kaping untat <br />$3",
+       "rclinks": "edengang sane untat $1 gentosan anyar $2 dina kaping untat",
        "diff": "bina",
        "hist": "kawentenan sane lian",
        "hide": "engkebang",
index 3808477..80da2ee 100644 (file)
@@ -17,7 +17,9 @@
                        "Matthias Klostermayr",
                        "Macofe",
                        "George Animal",
-                       "Lokal Profil"
+                       "Lokal Profil",
+                       "Joe Watzmo",
+                       "WhatamIdoing"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "returnto": "Zruck za da Seitn $1.",
        "tagline": "Aus {{SITENAME}}",
        "help": "Huif",
-       "search": "Suach",
+       "search": "Suach Boarisch oda Deutsch",
        "searchbutton": "Suacha",
        "go": "Ausfyrn",
        "searcharticle": "Artikl",
        "externaldberror": "Entweder es ligt a Feeler bai da externen Authentifiziarung vur oder du derfst dai externs Benytzerkonto ned aktualisirn.",
        "login": "Eilogga",
        "nav-login-createaccount": "Eilogga / Konto olegn",
-       "userlogin": "Eilogga / Konto olegn",
-       "userloginnocreate": "Åmöden",
        "logout": "Obmöden",
        "userlogout": "Auslogga",
        "notloggedin": "Ned ågmödt",
-       "nologin": "Du host koa Nutzakonto? $1.",
-       "nologinlink": "A neichs Nutzakonto olegn",
        "createaccount": "Nutzakonto olegn",
-       "gotaccount": "Hosd scho a Nutzakonto? '''$1'''.",
-       "gotaccountlink": "Eilogga",
-       "userlogin-resetlink": "Hosd de Datn zan Eilogga vagessn?",
        "createaccountmail": "per E-Mail",
-       "createaccountreason": "Grund",
        "badretype": "De zwoa Posswerter stimmer ned ywereih.",
        "userexists": "Der Benutzernaum do is schoh vageem. Bittscheh nimm an aundern her.",
        "loginerror": "Feeler bei da Åmödung",
        "minoredit": "Nua Kloanigkeidn san vaendat worn",
        "watchthis": "De Seitn beobochtn",
        "savearticle": "Seitn speichan",
+       "publishpage": "Seitn vaeffentlichn",
+       "publishchanges": "Endarunga vaeffentlichn",
        "preview": "Vorschau",
        "showpreview": "Vorschau zoagn",
        "showdiff": "Endarunga zoagn",
        "anoneditwarning": "Obocht: Du bist ned eigloggt.\nDei IP-Adress wead in da Versionsgschicht afzoachnet.",
-       "missingsummary": "'''Hiwais:''' du host koa Zåmmfossung ågeem. Wånn du ernait auf „{{int:savearticle}}“ druckst, werd dai Enderung one a Zåmmfossung ywernumma.",
+       "missingsummary": "'''Hiwais:''' du host koa Zåmmfossung ågeem. Wånn du ernait auf „$1“ druckst, werd dai Enderung one a Zåmmfossung ywernumma.",
        "missingcommenttext": "Bittschee gib a Zåmmfossung ai.",
        "summary-preview": "Voaschau vo da Zammfossung:",
        "subject-preview": "Vurschau vom Bedreff:",
        "editingsection": "Werkln ba $1 (Obschnitt)",
        "editingcomment": "Werkeln voh $1 (Neicher Obschnit)",
        "editconflict": "Konflikt baim Beorwaiten: $1",
-       "explainconflict": "Eppern ånderer hod de Saitn gendert, nochdem du ågfånga host de zum beorwaiten.\nDes owere Textföidl enthoit 'n aktuöin Stånd.\nDes untare Textföidl enthoit daine Enderungen.\nBittschee fiag daine Enderungen ins owere Textföidl ai.\n'''Netter''' da Inhoit vom owern Textföidl werd gspaichert, wånn du auf  „{{int:savearticle}}“ druckst!",
+       "explainconflict": "Eppern ånderer hod de Saitn gendert, nochdem du ågfånga host de zum beorwaiten.\nDes owere Textföidl enthoit 'n aktuöin Stånd.\nDes untare Textföidl enthoit daine Enderungen.\nBittschee fiag daine Enderungen ins owere Textföidl ai.\n'''Netter''' da Inhoit vom owern Textföidl werd gspaichert, wånn du auf  „$1“ druckst!",
        "yourtext": "Deih Text",
        "storedversion": "Gespeicherde Versión",
        "editingold": "'''Ochtung: Du beorwaitst a oide Version vo derer Saiten. Wånn du spaichertst, wern olle naichen Versionen ywerschriim!'''",
        "searchprofile-articles-tooltip": "Suacha in $1",
        "searchprofile-images-tooltip": "Noch Datein suacha",
        "searchprofile-everything-tooltip": "In gsamtn Inhoid duachsuacha (inkl. Dischkriaseitn)",
-       "searchprofile-advanced-tooltip": "Suach in weidna Namasramm",
+       "searchprofile-advanced-tooltip": "Suach in weidana Namasramm",
        "search-result-size": "$1 ({{PLURAL:$2|1 Wort|$2 Weata}})",
        "search-result-category-size": "{{PLURAL:$1|1 Seitn|$1 Seitn}} ({{PLURAL:$2|1 Untakategorie|$2 Untakategorina}}, {{PLURAL:$3|1 Datei|$3 Datein}})",
        "search-redirect": "(Weidaloatung vo „$1“)",
        "searchrelated": "vawandt",
        "searchall": "olle",
        "search-nonefound": "Fia dei Suachofrog gibts koa Ergebnis",
-       "powersearch-legend": "Daweiterde Suach",
-       "powersearch-ns": "Suach in Nåmensraim:",
+       "powersearch-legend": "Daweitade Suach",
+       "powersearch-ns": "Suach in Namasraum:",
        "search-external": "Externe Suach",
        "preferences": "Eihstellungen",
        "mypreferences": "Mei Preferenz",
        "prefs-editing": "Beorweiten",
-       "rows": "Zeiln:",
-       "columns": "Spoiten",
        "searchresultshead": "Suachen",
        "savedprefs": "Deine Eihstellungen san gspeicherd worn.",
        "timezonelegend": "Zaidzone:",
        "rcshowhidepatr": "Kontrolliade Endarunga $1",
        "rcshowhidemine": "Meine Beidreg $1",
        "rcshowhidemine-hide": "Ausblendn",
-       "rclinks": "De letztn Endarunga vo de letztn $2 Dog zoagn<br />$3",
+       "rclinks": "De letztn Endarunga vo de letztn $2 Dog zoagn",
        "diff": "Untaschied",
        "hist": "Versiona",
        "hide": "Ausblendn",
        "nolicense": "koah Vurauswoi",
        "license-nopreview": "(es gibt koah Vurschau)",
        "upload_source_file": " (a Daatei auf deim Computer)",
-       "listfiles_search_for": "Suach noch da Daatei:",
+       "listfiles_search_for": "Suach noch Datei:",
        "imgfile": "Daatei",
        "listfiles": "Daateilisten",
        "listfiles_thumb": "Vurschaubüdel",
        "undeletebtn": "Wiederherstön",
        "undeletelink": "oschaugn / wiadaheastejn",
        "undeleteviewlink": "oschaugn",
-       "undeletedfiles": "$1 {{PLURAL:$1|Datei|Dateien}} san wieda hergstellt worn",
-       "undelete-search-box": "Suach noch gléschde Seiten",
+       "undelete-search-box": "Suach noch gleschde Artiken",
        "undelete-search-submit": "Suach",
        "undelete-show-file-submit": "Jo",
        "namespace": "Namasramm:",
        "unblocked-id": "Sperr-ID $1 is fraigeem worn",
        "blocklist": "Gspeade Nutza",
        "ipblocklist": "Gsperrte Nutza",
-       "ipblocklist-legend": "Suach noch am gsperrden Benytzer",
+       "ipblocklist-legend": "Suach noch an gsperrdn Nutza",
        "createaccountblock": "'s erstön voh Benutzerkóntós is gsperrd",
        "emailblock": "E-Póst vaschicker is gsperrd",
        "blocklink": "Sperrn",
        "htmlform-selectorother-other": "Åndre",
        "logentry-move-move_redir": "$1 hod de Seitn $3 af $4 {{GENDER:$2|verschom}} und hod dabei a Weidaloatung ibaschriem",
        "logentry-move-move_redir-noredirect": "$1 hod de Seitn $3 af $4 {{GENDER:$2|verschom}} und dabei a Weidaloatung ibaschriem, ohne a neiche ozlegn",
-       "revdelete-summary": "Zåmmfossungskommentar",
-       "searchsuggest-search": "Suach",
+       "searchsuggest-search": "Suach (af Boarisch oda Deutsch)",
        "searchsuggest-containing": "Voitextsuach noch ..."
 }
index 6ecfcb3..9dc0959 100644 (file)
        "rcshowhideanons": "$1 pamarhaseang ndang margoar",
        "rcshowhidepatr": "$1 panotaan na dipamanat",
        "rcshowhidemine": "$1 na hupatota",
-       "rclinks": "Patuduhon $1 parubaan na imbaru dibagasan na $2 ari on<br />$3",
+       "rclinks": "Patuduhon $1 parubaan na imbaru dibagasan na $2 ari on",
        "diff": "duru",
        "hist": "turi",
        "hide": "Bunihon",
index 0fec39a..2ad7cc0 100644 (file)
        "externaldberror": "یک حطا دیتابیس تصدیق هویت دراییگی هست یا شما را اجازت نیست وتی حساب درایی په روچ کنیت.",
        "login": "ورود",
        "nav-login-createaccount": "ورود/شرکتن حساب",
-       "userlogin": "ورود/شرکتن حساب",
-       "userloginnocreate": "لاگین",
        "logout": "در بوتین",
        "userlogout": "در بوتین",
        "notloggedin": "وارد نهت",
        "userlogin-noaccount": "شما رء اکانت نه انت؟",
        "userlogin-joinproject": "مان {{SITENAME}} ناملکی بکن ات!",
-       "nologin": "حسابء  نیستن؟ '''$1'''.",
-       "nologinlink": "یک حسابی جوڑ کورتین",
        "createaccount": "حساب شرکن",
-       "gotaccount": "یک حساب الان هست؟'''$1'''.",
-       "gotaccountlink": "ورود",
-       "userlogin-resetlink": "وتی لاگینء جزئیاتء رء شموش کتگ ات؟",
        "userlogin-resetpassword-link": "وتی پسوردء رء شموش کتگ ات؟",
        "userlogin-helplink2": "کمک گون لاگین",
        "userlogin-loggedin": "شما انیگء {{GENDER:$1|$1}}ء حالتء مان بیتگ ات.\nچه جهلیگین فرم پر لاگین مان ادگر کاربرء حالتء کارمرز بکن ات.",
        "createacct-another-email-ph": "ایمیلء ادرسء بلک ات",
        "createaccountmail": "کارمرز چه وتکارین موقتین پسورد ءُ رندا آئی دیم داتن پر مالومین ایمیل",
        "createacct-realname": "شمئی اصلیگین نام (ایهتیاری)",
-       "createaccountreason": "دلیل:",
        "createacct-reason": "دلیل:",
        "createacct-reason-ph": "پرچا شما ادگر نوکین اکانتء اڈ کن ات",
        "createacct-submit": "وتی اکانتء اڈ کن ات",
        "preview": "دیستین",
        "showpreview": "بازبین پیش دار",
        "showdiff": "تغییرات پیش دار",
-       "blankarticle": "<strong>هشتار:</strong> شما بی یک هالی دیمی جوڑ\t کورتینا ئالاتا ویت.\nاگه \"{{int:savearticle}}\" ها پدا کلیک کنیت، بدون مئتواین دیمی جوڑ\tا بیت .",
+       "blankarticle": "<strong>هشتار:</strong> شما بی یک هالی دیمی جوڑ\t کورتینا ئالاتا ویت.\nاگه \"$1\" ها پدا کلیک کنیت، بدون مئتواین دیمی جوڑ\tا بیت .",
        "anoneditwarning": "<strong>هشتار:</strong> شما لوگین نه بوته ایت . شمی آی پی نشانی په موچان دیستینی وڑ\tا بیت اگه هر \tٹگلی جوڑ\t بداریت . اگه <strong>[$1 لوگین بئیت]</strong> یا <strong>[$2 یک کاربرین حسابی جوڑ بکنیت]</strong>، شمی ایڈیت بی شمی کاربرین نام نسبت داته آ بینت، لوڑ گون دیگرین مزایایان .",
        "anonpreviewwarning": "''شما مان سیستمء لاگین نکتگ. ذخیره کتنء حالت شمئی آی‌پیء نشانیگ مان ائ پیجء هاپزگ سبت بیت انت.''",
        "missingsummary": "'''یادآوری:''' شما یک خلاصه چه اصلاح وارد نه کرت.\nاگر دگه کلیک کنیت ذخیره آ، شمی اصلاح به بی آی ذخیره بنت.",
        "missingcommenttext": "لطفا یک نظری وارد کنیت جهل آ",
-       "missingcommentheader": "'''هالداری:'' شما یک موضوع/سرهت پر ائ کامنت نهشتگ ات.\nاگان دوبارگ بٹن «{{int:savearticle}}» سرء کلیک کن ات شمئی ویرایش گیر چه آئیء ذخیرگ بیت انت.",
+       "missingcommentheader": "'''هالداری:'' شما یک موضوع/سرهت پر ائ کامنت نهشتگ ات.\nاگان دوبارگ بٹن «$1» سرء کلیک کن ات شمئی ویرایش گیر چه آئیء ذخیرگ بیت انت.",
        "summary-preview": "خلاصه بازبینی:",
        "subject-preview": "بازبین موضوع/سرخط:",
        "blockedtitle": "کاربر محدود بوتت",
        "editingsection": "اصلاح $1(بخش)",
        "editingcomment": "اصلاح $1 (نوکین بخش)",
        "editconflict": "جنگ ورگ اصلاح: $1",
-       "explainconflict": "کسی دگه ای صفحه یا عوض کتت چه وهدی که شما اصلاح آیء شروع کتء.\nبالادی ناحیه متن شامل متن صفحه همی داب که هنگت هست.\nشمی تغییرات ته جهلیگین ناحیه متن جاه کیت.\nشما بایدن وتی تغییرات آن گون هنوکین متن چن و بند کنیت.\n'''فقط''' ناحیه بالادی متن وهدی که شما دکمه  \"{{int:savearticle}}\" ذخیره بنت.",
+       "explainconflict": "کسی دگه ای صفحه یا عوض کتت چه وهدی که شما اصلاح آیء شروع کتء.\nبالادی ناحیه متن شامل متن صفحه همی داب که هنگت هست.\nشمی تغییرات ته جهلیگین ناحیه متن جاه کیت.\nشما بایدن وتی تغییرات آن گون هنوکین متن چن و بند کنیت.\n'''فقط''' ناحیه بالادی متن وهدی که شما دکمه  \"$1\" ذخیره بنت.",
        "yourtext": "شمی متن",
        "storedversion": "نسخه ی ذخیره ای",
        "nonunicodebrowser": "'''هوژاری: شمی بروزر گون یونی کد تنظیم کار نکنت. یک اطراف-کار جاهینن که شما را اجازه دنت صفحات راحت اصلاح کنیت: non-ASCII کاراتران ته جعبه اصلاح په داب کدان hexadecimal جاه کاینت.",
        "right-editprotected": "ویرایش مهاپزت بیتگین پیج گون ای حالت \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "ویرایش مهاپزت بیتگین پیج گون ای حالت \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "دستبر کاربر اصلاح کن",
-       "right-editusercssjs": "دگر کابرانی فایلان  CSS  و JS اصلاح کن",
        "right-editusercss": "دگر کابرانی فایلان CSS اصلاح کن",
        "right-edituserjs": "دگر کابرانی فایلان JS اصلاح کن",
        "right-editmyusercss": "وتیگین سی اس اس فایلانء ویرایش بکن ات",
        "rcshowhidemine": "$1 اصلاحات من",
        "rcshowhidemine-show": "پیش دارگ",
        "rcshowhidemine-hide": "چیردارگ",
-       "rclinks": "پیش دار آهرین$1 تغییرات ته آهرین $2 روچان<br />$3",
+       "rclinks": "پیش دار آهرین$1 تغییرات ته آهرین $2 روچان",
        "diff": "تفاوت",
        "hist": "تاریخ",
        "hide": "پناه",
        "undeleteviewlink": "پیشدارگ",
        "undeleteinvert": "چپکایگ کتن انتخاب",
        "undeletecomment": "نظر:",
-       "undeletedrevisions": "{{PLURAL:$1|1 بازبینی|$1 بازبینی آن}} واترینگ بیت",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 بازبینی|$1بازبینی ان}} و {{PLURAL:$2|1 فایل|$2 فایلان}} برگردینگ بوتن",
-       "undeletedfiles": "{{PLURAL:$1|1 فایل|$1 فایلآن}} واترینگ بین",
        "cannotundelete": "حذف نه کتن پروشت؛\nیک نفری دگه شاید ای صفحهء  پیشتر حذفی ترینتت.",
        "undeletedpage": "'''$1 تررینگ بوتت'''\n\nشوهاز کن [[Special:Log/delete|آمار حذف]] په یک ثبتی چه نوکین حذفیات و بازتررینگان.",
        "undelete-header": "See [[Special:Log/delete|آمار حذف]] په نوکین حذفی صفحات..",
        "revdelete-restricted": "محدودیت آن په مدیران سیستم بوت",
        "revdelete-unrestricted": "به زور چه مدیران سیستم محدودیتان",
        "rightsnone": "(هچ یک)",
-       "revdelete-summary": "خلاصه اصلاح",
        "limitreport-templateargumentsize": "تراشوانِ ارگومینت اندازه",
        "expandtemplates": "پچ کن تمپلیت آنء",
        "expand_templates_intro": "ای تاک حاص لهتی متنء گریت و کل تمپلتان ته آییء برگشتی مزنش کنت.\nآیی هنچوش عمگر تجزیه کنوکء مزن کنت په داب\n<nowiki>{{</nowiki>#language:…}}, و متغییرانی په داب\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash; در حقیقت هر چیزی که ته دو براکتن.\nآیی ای کارء گون توار کنگ تجزیه کنوک مناسب چه مدیا وی کی وت انجام دنت.",
index 2fc4b3c..34b3de0 100644 (file)
        "externaldberror": "Igwa gayod sala sa arinman kan patunay sa datos-sarayan o ika dae pinagtugutan na bâgohon an saimong panluwas na panindog.",
        "login": "Maglaog",
        "nav-login-createaccount": "Maglaog / magmukna nin panindog",
-       "userlogin": "Maglaog / magmukna nin panindog",
-       "userloginnocreate": "Maglaog ka",
        "logout": "Magluwas",
        "userlogout": "Magluwas",
        "notloggedin": "Dae ka nakalaog",
        "userlogin-noaccount": "Mayo ka nin panindog?",
        "userlogin-joinproject": "Mag-ayon{{SITENAME}}",
-       "nologin": "Mayò ka pa nin panindog (account)? $1.",
-       "nologinlink": "Magmukna nin panindog",
        "createaccount": "Magmukna nin panindog",
-       "gotaccount": "Igwa ka na tabi nin panindog? $1.",
-       "gotaccountlink": "Maglaog",
-       "userlogin-resetlink": "Nakalingaw ka sa panlaog mong detalye?",
        "userlogin-resetpassword-link": "Nalingawan mo an saimong pasa-taramon?",
        "userlogin-helplink2": "Katabangan sa paglalaog",
        "userlogin-loggedin": "Ika nakalaog na tabi bilang si {{GENDER:$1|$1}}.\nGamita an porma sa ibaba sa paglaog bilang ibang paragamit.",
        "createacct-another-email-ph": "Ikaag an estada kan e-surat",
        "createaccountmail": "Gumamit nin sarong temporaryong pampurak na pasa-taramon asin ipadara ini sa pinagsambit na estada kan e-surat",
        "createacct-realname": "Totoong pangaran (opsyonal)",
-       "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-reason-ph": "Tadaw ta ika magmumukna nin ibang panindog",
        "createacct-submit": "Muknaon an saimong panindog",
        "passwordreset-emaildisabled": "E-surat na mga estima pinag-uruntok sa wiking ini.",
        "passwordreset-username": "Paragamit-ngaran:",
        "passwordreset-domain": "Kasakupan:",
-       "passwordreset-capture": "Hilngon an kinaluwasang e-koreo?",
-       "passwordreset-capture-help": "Kun saimong i-tsek ini box, an e-koreo (na igwang temporaryong sekretong panlaog) ipapahiling saimo siring na ini ipagpapadara sa paragamit.",
        "passwordreset-email": "E-koreong address:",
        "passwordreset-emailtitle": "Mga detalye kan panindog sa {{SITENAME}}",
        "passwordreset-emailtext-ip": "May sarong tawo (pwedeng ika gayod, gikan sa IP address na $1) naghahagad nin pagliliwat kan saimong sekretong panlaog para sa{{SITENAME}}($4). An minasunod na paragamit {{PLURAL:$3|panindog iyo an|mga panindog iyo an}} na asosyado kaining e-surat na adres:\n\n$2\n\n{{PLURAL:$3|Ining temporaryong sekretong panlaog|Ining mga temporaryong sekretong panlaog}} mapapaso sa laog nin {{PLURAL:$5|sarong aldaw|$5 mga aldaw}}.\nDapat kang maglaog asin magpili nin sarong baguhon na sekretong panlaog ngunyan. Kun ibang tawo an naghimo kaining kahagadan, o kun saimo nang nagiromdoman an saimong orihinal na sekretong panlaog, asin habo mo nang ribayan ini, ipasipara mo na sana ining mensahe asin ipagpadagos mo nang gamiton an luma mong sekretong panlaog.",
        "showdiff": "Ipahiling an mga kaliwatan",
        "anoneditwarning": "<strong>Patanid:</strong> Ika dae nakalaog. An saimong estada kan IP mahihiling kan publiko kun ika makahimo nin arinman na mga pagliliwat. Kun ika <strong>[$1 naglaog]</strong> o <strong>[$2 magmukna nin panindog]</strong>, an saimong mga pagliliwat ipagpapanungod sa saimong ngaran-paragamit, kaiba an iba pang mga benepisyo.",
        "anonpreviewwarning": "Dae ka tabi nakalaog. An pagtatagama matala kan saimong IP address sa historya nin pagliwat sa pahinang ini.",
-       "missingsummary": "<strong>Pagiromdom:</strong>Ika dae pa nakapagtao nin sumaryo sa pagliwat. Kun i-klik mo an \"{{int:savearticle}}\" giraray, an saimong pagliwat ipagtatagama na mayo kaiyan.",
+       "missingsummary": "<strong>Pagiromdom:</strong>Ika dae pa nakapagtao nin sumaryo sa pagliwat. Kun i-klik mo an \"$1\" giraray, an saimong pagliwat ipagtatagama na mayo kaiyan.",
        "missingcommenttext": "Pakikaag nin sarong komento sa ibaba.",
-       "missingcommentheader": "'''Pagiromdom:''' Ika dae tabi nagtao nin sarong panultol (subject)/Pamayong linya (headline) para kaining sinambit mo.\nKun saimong pinduton an \"{{int:savearticle}}\" giraray, an saimong pigliwat matatagama na mayo kaiyan.",
+       "missingcommentheader": "'''Pagiromdom:''' Ika dae tabi nagtao nin sarong panultol (subject)/Pamayong linya (headline) para kaining sinambit mo.\nKun saimong pinduton an \"$1\" giraray, an saimong pigliwat matatagama na mayo kaiyan.",
        "summary-preview": "Paenot na patanaw nin sumaryo:",
        "subject-preview": "Paenot na patanaw sa Subheto/kapamayuhan:",
        "blockedtitle": "An paragamit pinagbagat",
        "editingsection": "Pinagliliwat an $1 (seksyon)",
        "editingcomment": "Pigliliwat an $1 (bagong seksyon)",
        "editconflict": "Komplikto sa paghihira: $1",
-       "explainconflict": "May ibang parágamit na nagbàgo kaining pahina kan pagpoon mong paghirá kaini.\nNahihilíng ang pahina kan teksto sa parteng itaas kan teksto.\nAn mga pagbabàgo mo nahihilíng sa parteng ibabâ kan teksto.\nKaipuhan mong isalak an mga pagbabàgo mo sa presenteng teksto.\nAn teksto na nasa parteng itaas '''sana''' an maitatagama sa pagpindot mo kan \"{{int:savearticle}}\".",
+       "explainconflict": "May ibang parágamit na nagbàgo kaining pahina kan pagpoon mong paghirá kaini.\nNahihilíng ang pahina kan teksto sa parteng itaas kan teksto.\nAn mga pagbabàgo mo nahihilíng sa parteng ibabâ kan teksto.\nKaipuhan mong isalak an mga pagbabàgo mo sa presenteng teksto.\nAn teksto na nasa parteng itaas '''sana''' an maitatagama sa pagpindot mo kan \"$1\".",
        "yourtext": "Saimong teksto",
        "storedversion": "Itinagamang bersyon",
        "nonunicodebrowser": "'''PATANID: An browser mo bakong unicode complaint. Igwang temporariong sistema na nakaandar para makahirá ka kan mga pahina: mahihiling an mga karakter na non-ASCII sa kahon nin paghirá bilang mga kodang hexadecimal.'''",
        "saveprefs": "Itagama",
        "restoreprefs": "Balikon an gabos na panugmad na mga panuytoy (sa gabos na mga seksyon)",
        "prefs-editing": "Pighihira",
-       "rows": "Mga hilera:",
-       "columns": "Mga taytay:",
        "searchresultshead": "Hanápon",
        "stub-threshold": "Kasagkoran kan <a href=\"#\" class=\"stub\">takod kan tambô</a> pigpopormato:",
        "stub-threshold-disabled": "Pinagpundo",
        "userrights-reason": "Rason:",
        "userrights-no-interwiki": "Ika mayo tabing permkso na magliwat sa paragamit na karapatan sa ibang wikis.",
        "userrights-nodatabase": "An datos-sarayan $1 bakong eksistido o bakong lokal.",
-       "userrights-nologin": "Ika kaipuhan na [[Special:UserLogin|maglaog ka]] na igwa nin panindog na administrador bago ka makapagtao nin karapatan sa paragamit.",
-       "userrights-notallowed": "Ika mayo tabing permiso na magdugang o magtangkas nin mga katanosan kan paragamit.",
        "userrights-changeable-col": "Mga grupo na mapuwede mong baguhon",
        "userrights-unchangeable-col": "Mga grupo na dae mo mapuwedeng baguhon",
        "userrights-conflict": "Kumplikto sa mga kaliwatan nin mga katanosan kan paragamit! Tabi man pakirikisa asin kumpirmaron an saimong mga kaliwatan.",
-       "userrights-removed-self": "Saimong matrayumpong pinagtangkas an sadire mong mga katanosan. Sa siring, ika dae na tabi makakalaog sa pahinang ini.",
        "group": "Grupo:",
        "group-user": "Mga Paragamit",
        "group-autoconfirmed": "Paragamit na sadiring nagkonpirma",
        "right-editprotected": "Liwaton an mga pahina na protektado bilang \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Liwaton an mga pahina na protektado bilang \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "Liwaton an paragamit na olay-panlaog",
-       "right-editusercssjs": "Liwaton an CSS asin JavaScript na mga sagunson kan ibang mga paragamit",
        "right-editusercss": "Liwaton an CSS na mga sagunson kan ibang mga paragamit",
        "right-edituserjs": "Liwaton an JavaScript na mga sagunson kan ibang mga paragamit",
        "right-editmyusercss": "Liwaton an saimong sadireng paragamit na sagunson sa CSS",
        "right-siteadmin": "Kandaduhan asin dae pagkandaduhan an datos-sarayan",
        "right-override-export-depth": "Eksportaron an mga pahina kabali na an pinagkilyawan na mga pahina sagkod sa rarom na 5",
        "right-sendemail": "Magpadara nin e-koreo sa ibang mga paragamit",
-       "right-passwordreset": "Tanawon an e-koreo kan pagbabago nin sekretong panlaog",
        "grant-editmycssjs": "Liwaton an saimong paragamit CSS/JavaScript",
        "grant-editmyoptions": "Liwaton an saimong paragamit na mga kamuyahan",
        "grant-viewdeleted": "Tanawon an pinagpurang mga sagunson asin pahina",
        "rcshowhidemine": "$1 sakong mga pagliliwat",
        "rcshowhidemine-show": "Ipatanaw",
        "rcshowhidemine-hide": "Itago",
-       "rclinks": "Ipahilíng an $1 huring mga kaliwatan sa laog nin huring $2 na mga aldaw<br />$3",
+       "rclinks": "Ipahilíng an $1 huring mga kaliwatan sa laog nin huring $2 na mga aldaw",
        "diff": "kalaenan",
        "hist": "sagaysay",
        "hide": "Tagóon",
        "undeleteviewlink": "hilngon",
        "undeleteinvert": "Baliktada an pinilian",
        "undeletecomment": "An rason:",
-       "undeletedrevisions": "{{PLURAL:$1|1 rebisyon|$1 mga rebisyon}} ipinagbalik",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 rebisyon|$1 mga rebisyon}} asin {{PLURAL:$2|1 sagunson|$2 mga sagunson}} ipinagbalik",
-       "undeletedfiles": "{{PLURAL:$1|1 sagunson|$1 mga sagunson}} ipinagbalik",
        "cannotundelete": "An dae pagpura nagpalya:\n$1",
        "undeletedpage": "'''binalik na an $1 '''\n\nIkonsultar an [[Special:Log/delete|historial nin pagparâ]] para mahiling an lista nin mga kaaaging pagparâ asin pagbalik.",
        "undelete-header": "Hilingon an [[Special:Log/delete|historial kan pagparâ]] kan mga kaaagi pa sanang pinarang páhina.",
        "feedback-thanks": "Salamat! An saimong balik-simbag pinagposte sa pahina \"[$2 $1]\".",
        "searchsuggest-search": "Hanapa baya",
        "searchsuggest-containing": "may laog na...",
-       "api-error-badaccess-groups": "Ika daeng permiso na magkarga nin mga sagunson sa wiking ini.",
        "api-error-badtoken": "Panlaog na kasalaan: Raot na pangilip",
-       "api-error-copyuploaddisabled": "An pagkakarga sa paagi kan URL pinag-untok sa serbidor na ini.",
-       "api-error-duplicate": "Igwa {{PLURAL:$1|nin ibang sagunson|mga iba pang mga sagunson}} na yaon sa sityo na igwa nin kaparehong laog.",
-       "api-error-duplicate-archive": "Igwa {{PLURAL:$1|kaidto nin ibang sagunson|kaidto nin ibang mga sagunson}} na yaon sa sityo na igwa nin kaparehong laog, alagad {{PLURAL:$1|ini kaidto|sinda kaidto}} pinagpura na.",
-       "api-error-empty-file": "An sagunson na saimong pinagsumite daeng laog.",
        "api-error-emptypage": "Nagmumukna nin bago, mayong laog na mga pahina dae pinagtutugutan.",
-       "api-error-fetchfileerror": "Panlaog na kasalaan: May bagay na naging sala habang hinahakot an sagunson.",
-       "api-error-fileexists-forbidden": "Sarong sagunson na igwang ngaran na \"$1\" an yaon na, asin dae puwedeng masalambawan.",
-       "api-error-fileexists-shared-forbidden": "Sarong sagunson na igwang ngaran na \"$1\" an yaon na sa pinagheras na repositoryo nin sagunson, asin dae puwedeng masalambawan.",
-       "api-error-file-too-large": "An sagunson na saimong pinagsumite dakulaon na maray.",
-       "api-error-filename-tooshort": "An pangaran nin sagunson halipoton na maray.",
-       "api-error-filetype-banned": "An tipong ini nin sagunson pinagpangalad na.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|dae itinutugot na tipo nin sagunson|dae itinutugot na mga tipo nin mga sagunson}}. An pinagtutugutan na {{PLURAL:$3|sagunson iyo an tipo na|mga sagunson iyo an mga tipo na}} $2.",
-       "api-error-filetype-missing": "An pangaran nin sagunson nawawaraan nin ekstensyon.",
-       "api-error-hookaborted": "An modipikasyon na saimong pinagprubaran na hihimoon ipinag-untok nin sarong ekstensyon.",
-       "api-error-http": "Panlaog na kasalaan: Dae nakakakonekta sa serbidor.",
-       "api-error-illegal-filename": "An pangaran nin sagunson dae pinagtutugutan.",
-       "api-error-internal-error": "Panlaog na kasalaan: May bagay na napasala sa pagproseso kan saimong pagkakarga sa wiki.",
-       "api-error-invalid-file-key": "Panlaog na kasalaan: An sagunson dae natagboan sa temporaryong sarayan.",
-       "api-error-missingparam": "Panlaog na kasalaan: Nawawara an mga parametro sa kahagadan.",
-       "api-error-missingresult": "Panlaog na kasalaan: Dae madeterminaran kun an kopya naipadagos.",
-       "api-error-mustbeloggedin": "Ika dapat na nakalaog tanganing makapagkarga nin mga sagunson.",
-       "api-error-mustbeposted": "Panlaog na kasalaan: An kahagadan minakaipo nin HTTP POST.",
-       "api-error-noimageinfo": "An pagkarga nagdagos, alagad an serbidor dae nakapagtao samuya nin anuman na impormasyon manunungod sa sagunson.",
-       "api-error-nomodule": "Panlaog na kasalaan: Mayong pankargang modyul an naikaag.",
-       "api-error-ok-but-empty": "Panlaog na kasalaan: Mayong simbag gikan sa serbidor.",
-       "api-error-overwrite": "An salambawan na sarong eksistido nang sagunson dae pinagtutugutan.",
-       "api-error-stashfailed": "Panlaog na kasalaan: An serbidor nagpalya sa pagsaray kan temporaryong sagunson.",
        "api-error-publishfailed": "Panlaog na kasalaan: An serbidor nagpalya na ipublikar an temporaryong sagunson.",
-       "api-error-stasherror": "Nagkaigwa nin kasalaan mantang ikinakarga an sagunson sa sarayan.",
-       "api-error-timeout": "An serbidor dae nakapagsimbag sa laog kan pinaghunang panahon.",
-       "api-error-unclassified": "May dae midbid na kasalaan an nangyari.",
-       "api-error-unknown-code": "Dae midbid na kasalaan: \"$1\".",
-       "api-error-unknown-error": "Panlaog na kasalaan: May sarong bagay na napasala kan prubaran na ikarga an saimong sagunson.",
+       "api-error-stashfailed": "Panlaog na kasalaan: An serbidor nagpalya sa pagsaray kan temporaryong sagunson.",
        "api-error-unknown-warning": "Dae midbid na patanid: \"$1\".",
        "api-error-unknownerror": "Dae midbidon na kasalaan: \"$1\".",
-       "api-error-uploaddisabled": "An pagkakarga pinag-untok nguna kaining wiki.",
-       "api-error-verification-error": "Ining sagunson baka koraptu, o igwa nin salang ekstensyon.",
        "duration-seconds": "$1 {{PLURAL:$1|segundo|mga segundo}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutos}}",
        "duration-hours": "$1 {{PLURAL:$1|oras|mga oras}}",
index 0f4b6d7..36bd93a 100644 (file)
        "login": "Увайсьці",
        "login-security": "Пацьвердзіце вашую асобу",
        "nav-login-createaccount": "Уваход / стварэньне рахунку",
-       "userlogin": "Увайсьці ў сыстэму / стварыць рахунак",
-       "userloginnocreate": "Увайсьці",
        "logout": "Выйсьці",
        "userlogout": "Выйсьці",
        "notloggedin": "Вы не ўвайшлі ў сыстэму",
        "userlogin-noaccount": "Ня маеце рахунку?",
        "userlogin-joinproject": "Далучайцеся да {{GRAMMAR:родны|{{SITENAME}}}}",
-       "nologin": "Ня маеце рахунку? $1.",
-       "nologinlink": "Стварыце рахунак",
        "createaccount": "Стварэньне рахунку",
-       "gotaccount": "Ужо маеце рахунак? $1.",
-       "gotaccountlink": "Увайдзіце",
-       "userlogin-resetlink": "Забыліся на зьвесткі для ўваходу?",
        "userlogin-resetpassword-link": "Забылі пароль?",
        "userlogin-helplink2": "Дапамога з уваходам у сыстэму",
        "userlogin-loggedin": "Вы ўжо ўвайшлі як {{GENDER:$1|$1}}.\nДля ўваходу пад іншым удзельнікам скарыстайцеся формай унізе.",
        "createaccountmail": "Стварыць часовы адвольны пароль і даслаць яго на пазначаны адрас электроннай пошты",
        "createaccountmail-help": "Можа выкарыстоўвацца для стварэньня рахунку для іншага чалавека бязь веданьня паролю.",
        "createacct-realname": "Сапраўднае імя (неабавязкова)",
-       "createaccountreason": "Прычына:",
        "createacct-reason": "Прычына",
        "createacct-reason-ph": "Зь якой мэтай вы ствараеце іншы рахунак",
        "createacct-reason-help": "Паведамленьне, якое паказваецца ў журнале стварэньня рахункаў",
        "changeemail-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
        "changeemail-oldemail": "Цяперашні адрас электроннай пошты:",
        "changeemail-newemail": "Новы адрас электроннай пошты:",
-       "changeemail-newemail-help": "Ð\9fоле Ñ\82Ñ\80Ñ\8dба Ð¿Ð°ÐºÑ\96нÑ\83Ñ\86Ñ\8c Ð¿Ñ\83Ñ\81Ñ\82Ñ\8bм, ÐºÐ°Ð»Ñ\96 Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81вой Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b. Пасьля выдаленьня вы ня зможаце ануляваць забыты пароль і ня будзеце атрымліваць лісты электроннай пошты з гэтай вікі.",
+       "changeemail-newemail-help": "Ð\9aалÑ\96 Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81вой Ð°Ð´Ñ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b, Ð¿Ð°ÐºÑ\96нÑ\8cÑ\86е Ð³Ñ\8dÑ\82ае Ð¿Ð¾Ð»Ðµ Ð¿Ñ\83Ñ\81Ñ\82Ñ\8bм. Пасьля выдаленьня вы ня зможаце ануляваць забыты пароль і ня будзеце атрымліваць лісты электроннай пошты з гэтай вікі.",
        "changeemail-none": "(няма)",
        "changeemail-password": "Ваш пароль у {{GRAMMAR:месны|{{SITENAME}}}}:",
        "changeemail-submit": "Зьмяніць адрас электроннай пошты",
        "preview": "Папярэдні прагляд",
        "showpreview": "Праглядзець",
        "showdiff": "Паказаць зьмены",
-       "blankarticle": "<strong>Папярэджаньне:</strong> вы ствараеце пустую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, старонка будзе створаная без аніякага зьместу.",
+       "blankarticle": "<strong>Папярэджаньне:</strong> вы ствараеце пустую старонку.\nКалі вы націсьніце «$1» яшчэ раз, старонка будзе створаная без аніякага зьместу.",
        "anoneditwarning": "<strong>Папярэджаньне</strong>: вы не ўвайшлі ў сыстэму. Ваш IP-адрас будзе бачны ўсім, калі вы адрэдагуеце старонку. Калі вы <strong>[$1 ўвойдзеце]</strong> або <strong>[$2 створыце рахунак]</strong>, вашыя рэдагаваньні будуць зьвязаныя з вашым імем карыстальніка, а таксама вам будуць даступныя дадатковыя перавагі.",
        "anonpreviewwarning": "<em>Вы не ўвайшлі ў сыстэму. Па захаваньні старонкі ваш IP-адрас будзе дададзены ў яе гісторыю рэдагаваньняў.</em>",
        "missingsummary": "'''Напамін:''' Вы не пазначылі кароткае апісаньне зьменаў.\nКалі Вы націсьніце кнопку «Запісаць» яшчэ раз, Вашае рэдагаваньне будзе запісанае без апісаньня.",
-       "selfredirect": "<strong>Папярэджаньне:</strong> вы перанакіроўваеце старонку саму на сябе.\nМагчыма, вы пазначылі няслушную старонку для перанакіраваньня або вы рэдагуеце ня тую старонку.\nКалі вы націсьніце «{{int:savearticle}}» яшчэ раз, перанакіраваньне будзе створанае.",
+       "selfredirect": "<strong>Папярэджаньне:</strong> вы перанакіроўваеце старонку саму на сябе.\nМагчыма, вы пазначылі няслушную старонку для перанакіраваньня або вы рэдагуеце ня тую старонку.\nКалі вы націсьніце «$1» яшчэ раз, перанакіраваньне будзе створанае.",
        "missingcommenttext": "Калі ласка, увядзіце камэнтар ніжэй.",
-       "missingcommentheader": "<strong>Напамін:</strong> Вы не пазначылі загаловак камэнтара. Калі Вы націсьніце кнопку «{{int:savearticle}}» яшчэ раз, Вашая зьмена будзе захаваная без камэнтара.",
+       "missingcommentheader": "<strong>Напамін:</strong> Вы не пазначылі загаловак камэнтара. Калі Вы націсьніце кнопку «$1» яшчэ раз, Вашая зьмена будзе захаваная без камэнтара.",
        "summary-preview": "Папярэдні прагляд апісаньня зьменаў:",
        "subject-preview": "Папярэдні прагляд загалоўку:",
        "previewerrortext": "Адбылася памылка пры спробе папярэдняга прагляду вашых зьменаў.",
        "editingsection": "Рэдагаваньне $1 (разьдзел)",
        "editingcomment": "Рэдагаваньне $1 (новы разьдзел)",
        "editconflict": "Канфлікт рэдагаваньняў: $1",
-       "explainconflict": "Нехта зьмяніў старонку падчас вашага рэдагаваньня.\nУ верхнім тэкставым акне знаходзіцца цяперашні зьмест старонкі.\nВашыя зьмены паказаныя ў ніжнім акне.\nВам трэба перанесьці вашыя зьмены ў цяперашні тэкст.\nКалі вы націсьніце «{{int:savearticle}}», будзе захаваны <strong>толькі</strong> тэкст верхняга вакна.",
+       "explainconflict": "Нехта зьмяніў старонку падчас вашага рэдагаваньня.\nУ верхнім тэкставым акне знаходзіцца цяперашні зьмест старонкі.\nВашыя зьмены паказаныя ў ніжнім акне.\nВам трэба перанесьці вашыя зьмены ў цяперашні тэкст.\nКалі вы націсьніце «$1», будзе захаваны <strong>толькі</strong> тэкст верхняга вакна.",
        "yourtext": "Ваш тэкст",
        "storedversion": "Захаваная вэрсія",
        "nonunicodebrowser": "<strong>Папярэджаньне: ваш браўзэр не падтрымлівае Unicode-кадаваньне.</strong>\nУ выніку гэтага ўсе сымбалі ў полі рэдагаваньня, ня ўключаныя ў ASCII, будуць замененыя на іх шаснаццаткавыя коды.",
        "readonlywarning": "<strong>Папярэджаньне: База зьвестак была заблякаваная для тэхнічнага абслугоўваньня, таму немагчыма цяпер захаваць Вашыя зьмены.</strong>\nВы можаце скапіяваць тэкст у файл на Вашым кампутары, а пазьней захаваць сюды.\n\nСыстэмны адміністратар, які заблякаваў базу зьвестак, прапанаваў наступнае тлумачэньне: $1",
        "protectedpagewarning": "<strong>Папярэджаньне: гэтая старонка была абароненая, таму толькі адміністратары могуць рэдагаваць яе.</strong>\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
        "semiprotectedpagewarning": "<strong>Заўвага:</strong> гэтая старонка была абароненая, таму рэдагаваць яе могуць толькі зарэгістраваныя ўдзельнікі.\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
-       "cascadeprotectedwarning": "'''Папярэджаньне:''' гэтая старонка абароненая, толькі ўдзельнікі з правамі адміністратараў могуць рэдагаваць яе, таму што яна ўключаная ў {{PLURAL:$1|1=наступную старонку|наступныя старонкі}} з каскаднай абаронай:",
+       "cascadeprotectedwarning": "'''Папярэджаньне:''' гэтая старонка абароненая, толькі ўдзельнікі з [[Special:ListGroupRights|адмысловымі правамі]] могуць рэдагаваць яе, таму што яна ўключаная ў {{PLURAL:$1|1=наступную старонку|наступныя старонкі}} з каскаднай абаронай:",
        "titleprotectedwarning": "<strong>Папярэджаньне: гэтая старонка была абароненая і для яе стварэньня патрабуюцца [[Special:ListGroupRights|адпаведныя правы]].</strong>\nАпошні запіс з журнала пададзены ніжэй для даведкі:",
        "templatesused": "{{PLURAL:$1|Шаблён, які ўжываецца|Шаблёны, якія ўжываюцца}} на гэтай старонцы:",
        "templatesusedpreview": "У гэтым папярэднім праглядзе {{PLURAL:$1|1=выкарыстаны наступны шаблён|выкарыстаныя наступныя шаблёны}}:",
        "post-expand-template-argument-warning": "<strong>Увага</strong>: гэтая старонка ўтрымлівае прынамсі адзін парамэтар шаблёну, які мае занадта вялікі выгляд у разгорнутым выглядзе.\nГэтыя парамэтры былі прапушчаныя.",
        "post-expand-template-argument-category": "Старонкі, у якіх прапушчаныя парамэтры шаблёнаў",
        "parser-template-loop-warning": "Выяўлены цыкль у шаблёнах: [[$1]]",
+       "template-loop-category": "Старонкі з цыклямі шаблёнаў",
+       "template-loop-category-desc": "Старонка ўтрымлівае цыкль шаблёну, г. зн., шаблён уключае сам сябе рэкурсіўна.",
        "parser-template-recursion-depth-warning": "Перавышаны ліміт глыбіні рэкурсіі шаблёну ($1)",
        "language-converter-depth-warning": "Перавышанае абмежаваньне глыбіні канвэртару варыянтаў мовы ($1)",
        "node-count-exceeded-category": "Старонкі зь перавышанай колькасьцю вузлоў",
        "page_first": "першая",
        "page_last": "апошняя",
        "histlegend": "Параўнаньне: пазначце кропкамі дзьве вэрсіі для параўнаньня і націсьніце «ўвод» альбо кнопку ўнізе.<br />\nТлумачэньне: <strong>({{int:cur}})</strong> = адрозьненьні ад цяперашняй вэрсіі, <strong>({{int:last}})</strong> = адрозьненьні ад папярэдняй вэрсіі, <strong>{{int:minoreditletter}}</strong> = дробная праўка.",
-       "history-fieldset-title": "Пошук у гісторыі",
+       "history-fieldset-title": "Пошук вэрсіяў",
        "history-show-deleted": "Толькі выдаленыя",
        "histfirst": "найстарэйшыя",
        "histlast": "найноўшыя",
        "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": "Адна з вэрсіяў гэтай старонкі была '''выдаленая'''.\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-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}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
        "rev-delundel": "паказаць/схаваць",
        "rev-showdeleted": "паказаць",
        "revisiondelete": "Выдаліць/аднавіць вэрсіі",
        "revdelete-suppress-text": "Скрываньне можа выкарыстоўвацца '''толькі''' ў наступных выпадках:\n* патэнцыйна паклёпніцкая інфармацыя\n* раскрыцьцё асабістых зьвестак\n*: ''хатнія адрасы, тэлефонныя нумары, нумары пашпартоў і г. д.''",
        "revdelete-legend": "Усталяваць абмежаваньні бачнасьці",
        "revdelete-hide-text": "Тэкст вэрсіі",
-       "revdelete-hide-image": "Схаваць зьмест файла",
+       "revdelete-hide-image": "Схаваць зьмест файлу",
        "revdelete-hide-name": "Схаваць мэту і парамэтры",
        "revdelete-hide-comment": "Апісаньне зьменаў",
        "revdelete-hide-user": "Імя ўдзельніка/IP-адрас",
        "revdelete-log": "Прычына:",
        "revdelete-submit": "Ужыць для {{PLURAL:$1|1=выбранай вэрсіі|выбраных вэрсіяў}}",
        "revdelete-success": "Бачнасьць вэрсіі абноўленая.",
-       "revdelete-failure": "'''Немагчыма абнавіць бачнасьць вэрсіі:'''\n$1",
+       "revdelete-failure": "Немагчыма абнавіць бачнасьць вэрсіі:\n$1",
        "logdelete-success": "Бачнасьць падзеі ўсталяваная.",
-       "logdelete-failure": "'''Немагчыма ўстанавіць бачнасьць у журнале:'''\n$1",
-       "revdel-restore": "Ð\97ьмяніць бачнасьць",
+       "logdelete-failure": "Немагчыма ўсталяваць бачнасьць журнала:\n$1",
+       "revdel-restore": "зьмяніць бачнасьць",
        "pagehist": "Гісторыя старонкі",
        "deletedhist": "Выдаленая гісторыя",
        "revdelete-hide-current": "Памылка хаваньня запісу ад $2 $1: гэта цяперашняя вэрсія.\nЗапіс ня можа быць схаваны.",
        "revdelete-show-no-access": "Памылка паказу запісу ад $2 $1: гэты запіс быў пазначаны як «абмежаваны».\nВы ня маеце да яго доступу.",
        "revdelete-modify-no-access": "Памылка зьмены запісу ад $2 $1: гэты запіс быў пазначаны як «абмежаваны».\nВы ня маеце да яго доступу.",
        "revdelete-modify-missing": "Памылка мадыфікацыі запісу з ідэнтыфікатарам $1: запіс не існуе ў базе зьвестак!",
-       "revdelete-no-change": "'''Папярэджаньне:''' запіс ад $2 $1 ужо мае запатрабаваныя налады бачнасьці.",
+       "revdelete-no-change": "<strong>Папярэджаньне:</strong> запіс ад $2 $1 ужо мае запытаныя налады бачнасьці.",
        "revdelete-concurrent-change": "Памылка зьмены запісу ад $2 $1: яго статус быў зьменены кімсьці іншым, пакуль Вы спрабавалі яго зьмяніць.\nКалі ласка, праверце журналы.",
        "revdelete-only-restricted": "Памылка хаваньня запісаў элемэнтаў $2, $1: Вы ня можаце схаваць запісы ад прагляду адміністратарамі бяз выбару адной зь іншых наладаў хаваньня.",
        "revdelete-reason-dropdown": "* Агульныя прычыны выдаленьня\n** Парушэньне аўтарскіх правоў\n** Інфармацыя, якая парушае прыватнасьць\n** Недапушчальнае імя ўдзельніка\n** Патэнцыйна паклёпніцкія зьвесткі",
        "revdelete-reasonotherlist": "Іншая прычына",
        "revdelete-edit-reasonlist": "Рэдагаваць прычыны выдаленьня",
        "revdelete-offender": "Аўтар вэрсіі:",
-       "suppressionlog": "Ð\96Ñ\83Ñ\80нал Ñ\81Ñ\85аванÑ\8cнÑ\8fÑ\9e",
-       "suppressionlogtext": "Ð\9dÑ\96жÑ\8dй Ð¿Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ñ\8b Ñ\81Ñ\8cпÑ\96Ñ\81 Ð²Ñ\8bдаленÑ\8cнÑ\8fÑ\9e Ñ\96 Ð±Ð»Ñ\8fкаванÑ\8cнÑ\8fÑ\9e, Ñ\81Ñ\85аванÑ\8bÑ\85 Ð½Ð°Ð²Ð°Ñ\82 Ð°Ð´ Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80аÑ\9e.\nÐ\93лÑ\8fдзÑ\96Ñ\86е [[Special:BlockList|Ñ\81Ñ\8cпÑ\96Ñ\81 Ð±Ð»Ñ\8fкаванÑ\8cнÑ\8fÑ\9e]], ÐºÐ°Ð± Ð¿Ð°Ð³Ð»Ñ\8fдзець сьпіс цяперашніх блякаваньняў.",
+       "suppressionlog": "Журнал хаваньняў",
+       "suppressionlogtext": "Ð\9dÑ\96жÑ\8dй Ð¿Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ñ\8b Ñ\81Ñ\8cпÑ\96Ñ\81 Ð²Ñ\8bдаленÑ\8cнÑ\8fÑ\9e Ñ\96 Ð±Ð»Ñ\8fкаванÑ\8cнÑ\8fÑ\9e, Ñ\81Ñ\85аванÑ\8bÑ\85 Ð°Ð´ Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80аÑ\9e.\nÐ\93лÑ\8fдзÑ\96Ñ\86е [[Special:BlockList|Ñ\81Ñ\8cпÑ\96Ñ\81 Ð±Ð»Ñ\8fкаванÑ\8cнÑ\8fÑ\9e]], ÐºÐ°Ð± Ñ\83баÑ\87Ñ\8bць сьпіс цяперашніх блякаваньняў.",
        "mergehistory": "Аб’яднаць гісторыі старонак",
        "mergehistory-header": "Гэтая старонка дазваляе аб'яднаць гісторыю рэдагаваньняў адной старонкі з гісторыяй іншай, новай старонкі.\nУпэўніцеся, што гэтыя зьмены не парушаць пасьлядоўнасьць гісторыі старонкі.",
        "mergehistory-box": "Аб’яднаць гісторыі рэдагаваньняў дзьвюх старонак:",
        "mergehistory-from": "Крынічная старонка:",
        "mergehistory-into": "Мэтавая старонка:",
-       "mergehistory-list": "Гісторыя рэдагаваньняў, якую магчыма аб'яднаць",
+       "mergehistory-list": "Гісторыя рэдагаваньняў, якую магчыма абяднаць",
        "mergehistory-merge": "Наступныя вэрсіі [[:$1]] можна аб'яднаць у [[:$2]].\nКарыстайцеся кнопкамі для аб'яднаньня толькі выбранага дыяпазону рэдагаваньняў.\nЗаўважце, што выкарыстаньне навігацыйных спасылак выдаліць зьвесткі ў гэтым слупку.",
-       "mergehistory-go": "Ð\9fаказаÑ\86Ñ\8c Ð²Ñ\8dÑ\80Ñ\81Ñ\96Ñ\96, Ñ\8fкÑ\96Ñ\8f Ð¼Ð°Ð³Ñ\87Ñ\8bма Ð°Ð±'яднаць",
-       "mergehistory-submit": "Аб'яднаць гісторыі рэдагаваньняў",
-       "mergehistory-empty": "Ð\9dÑ\8fма Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\96 Ñ\80Ñ\8dдагаванÑ\8cнÑ\8fÑ\9e, Ñ\8fкÑ\83Ñ\8e Ð¼Ð°Ð³Ñ\87Ñ\8bма Ð°Ð±'яднаць.",
-       "mergehistory-done": "$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсіяў}} з $1 пасьпяхова аб’яднаныя ў [[:$2]].",
-       "mergehistory-fail": "Не атрымалася аб'яднаць гісторыі старонак. Калі ласка, праверце парамэтры старонкі і часу.",
+       "mergehistory-go": "Ð\9fаказаÑ\86Ñ\8c Ð¿Ñ\80аÑ\9eкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð¼Ð°Ð³Ñ\87Ñ\8bма Ð°Ð±â\80\99яднаць",
+       "mergehistory-submit": "Абяднаць гісторыі рэдагаваньняў",
+       "mergehistory-empty": "Ð\9dÑ\8fма Ð¿Ñ\80авак, Ñ\8fкÑ\96Ñ\8f Ð¼Ð°Ð³Ñ\87Ñ\8bма Ð°Ð±â\80\99яднаць.",
+       "mergehistory-done": "$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсіяў}} з $1 {{PLURAL:$3|1=была аб’яднаная|былі аб’яднаныя}} ў [[:$2]].",
+       "mergehistory-fail": "Не атрымалася аб’яднаць гісторыі старонак, калі ласка, праверце парамэтры старонкі і часу.",
        "mergehistory-fail-bad-timestamp": "Няслушная метка часу.",
        "mergehistory-fail-invalid-source": "Няслушная старонка-крыніца.",
        "mergehistory-fail-invalid-dest": "Няслушная мэтавая старонка.",
        "mergehistory-no-destination": "Не існуе мэтавай старонкі $1.",
        "mergehistory-invalid-source": "Крынічная старонка мусіць мець карэктную назву.",
        "mergehistory-invalid-destination": "Мэтавая старонка мусіць мець карэктную назву.",
-       "mergehistory-autocomment": "Гісторыя [[:$1]] аб'яднаная ў [[:$2]]",
-       "mergehistory-comment": "Гісторыя [[:$1]] аб'яднаная ў [[:$2]]: $3",
+       "mergehistory-autocomment": "Гісторыя [[:$1]] абяднаная ў [[:$2]]",
+       "mergehistory-comment": "Гісторыя [[:$1]] абяднаная ў [[:$2]]: $3",
        "mergehistory-same-destination": "Крынічная і мэтавая старонкі ня могуць супадаць",
        "mergehistory-reason": "Прычына:",
        "mergelog": "Журнал аб’яднаньняў",
        "mergelogpagetext": "Ніжэй знаходзіцца сьпіс апошніх аб'яднаньняў гісторыяў старонак.",
        "history-title": "$1 — гісторыя зьменаў",
        "difference-title": "Розьніца паміж вэрсіямі «$1»",
-       "difference-title-multipage": "«$1» і «$2» — розьніца паміж старонкамі",
+       "difference-title-multipage": "Розьніца паміж старонкамі «$1» і «$2»",
        "difference-multipage": "(Розьніца паміж старонкамі)",
        "lineno": "Радок $1:",
        "compareselectedversions": "Параўнаць выбраныя вэрсіі",
        "nextn-title": "{{PLURAL:$1|Наступны $1 вынік|Наступныя $1 вынікі|Наступныя $1 вынікаў}}",
        "shown-title": "Паказваць $1 {{PLURAL:$1|вынік|вынікі|вынікаў}} на старонцы",
        "viewprevnext": "Паказаць ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "* Старонка '''[[$1]]'''",
+       "searchmenu-exists": "<strong>У гэтай вікі ёсьць старонка з назвай «[[:$1]]».</strong> {{PLURAL:$2|0=|Глядзіце таксама іншыя знойдзеныя вынікі пошуку.}}",
        "searchmenu-new": "<strong>Стварыць старонку «[[:$1]]» у {{GRAMMAR:месны|{{SITENAME}}}}!</strong> {{PLURAL:$2|0=|Глядзіце таксама старонку, знойдзеную ў выніку пошуку.|Глядзіце таксама вынікі пошуку.}}",
        "searchprofile-articles": "Старонкі са зьместам",
        "searchprofile-images": "Мультымэдыя",
        "searchprofile-everything-tooltip": "Шукаць усюды (у тым ліку на старонках абмеркаваньня)",
        "searchprofile-advanced-tooltip": "Шукаць у дадатковых прасторах назваў",
        "search-result-size": "$1 ($2 {{PLURAL:$2|слова|словы|словаў}})",
-       "search-result-category-size": "$1 {{PLURAL:$1|элемэнт|элемэнты|элемэнтаў}} ($2 {{PLURAL:$2|падкатэгорыя|падкатэгорыі|падкатэгорыяў}}, $3 {{PLURAL:|файл|файлы|файлаў}})",
+       "search-result-category-size": "$1 {{PLURAL:$1|элемэнт|элемэнты|элемэнтаў}} ($2 {{PLURAL:$2|падкатэгорыя|падкатэгорыі|падкатэгорыяў}}, $3 {{PLURAL:$3|файл|файлы|файлаў}})",
        "search-redirect": "(перанакіраваньне $1)",
        "search-section": "(сэкцыя $1)",
        "search-category": "(катэгорыя $1)",
        "search-file-match": "(супадае зь зьмесьцівам файла)",
        "search-suggest": "Магчыма, вы мелі на ўвазе: $1",
        "search-rewritten": "Паказаныя вынікі для $1. Замест гэтага шукаць $2.",
-       "search-interwiki-caption": "СÑ\83межнÑ\8bÑ\8f Ð¿Ñ\80аекÑ\82Ñ\8b",
+       "search-interwiki-caption": "Ð\92Ñ\8bнÑ\96кÑ\96 Ð· Ñ\81Ñ\83межнÑ\8bÑ\85 Ð¿Ñ\80аекÑ\82аÑ\9e",
        "search-interwiki-default": "Вынікі з $1:",
        "search-interwiki-more": "(яшчэ)",
        "search-interwiki-more-results": "больш вынікаў",
        "prefs-help-prefershttps": "Гэтая налада набудзе моц пры наступным уваходзе ў сыстэму.",
        "prefswarning-warning": "Вы зрабілі зьмены ў вашых наладах, якія яшчэ не былі захаваныя.\nКалі вы закрыеце гэтую старонку і не націсьніце «$1», вашыя налады ня будуць абноўленыя.",
        "prefs-tabs-navigation-hint": "Падказка: вы можаце пераходзіць паміж укладкамі ў сьпісе ўкладак з дапамогай клявішаў налева і направа.",
-       "userrights": "Ð\9aÑ\96Ñ\80аванÑ\8cне Ð¿Ñ\80авамÑ\96 ўдзельнікаў і ўдзельніц",
+       "userrights": "Ð\9fÑ\80авÑ\8b ўдзельнікаў і ўдзельніц",
        "userrights-lookup-user": "Выбар удзельніка",
        "userrights-user-editname": "Увядзіце імя ўдзельніка:",
        "editusergroup": "Загрузіць групы ўдзельніка",
        "saveusergroups": "Захаваць групы {{GENDER:$1|ўдзельнікаў і ўдзельніц}}",
        "userrights-groupsmember": "Уваходзіць у:",
        "userrights-groupsmember-auto": "Няяўны чалец:",
-       "userrights-groups-help": "Тут можна зьмяняць групы, да якіх належыць гэты ўдзельнік:\n* Адзначанае поле побач з назвай групы пазначае прыналежнасьць удзельніка да групы.\n* Пустое поле азначае, што ўдзельнік не належыць да групы.\n* Знак * азначае, што вы ня зможаце выдаліць удзельніка з групы, калі дададзіце яго да яе, і наадварот.\n* Знак # азначае, што вы можаце толькі зьменшыць час сканчэньня тэрміну дзеяньня гэтай групы, вы ня можаце павялічыць яго.",
+       "userrights-groups-help": "Тут можна зьмяняць групы, да якіх належыць гэты ўдзельнік:\n* Адзначанае поле побач з назвай групы пазначае прыналежнасьць удзельніка да групы.\n* Пустое поле азначае, што ўдзельнік не належыць да групы.\n* Знак * азначае, што вы ня зможаце выдаліць удзельніка з групы, калі дададзіце яго да яе, і наадварот.\n* Знак # азначае, што вы можаце толькі зьменшыць час сканчэньня тэрміну дзеяньня сяброўства ў гэтай групе, вы ня можаце павялічыць яго.",
        "userrights-reason": "Прычына:",
        "userrights-no-interwiki": "Вы ня маеце дазволу зьмяняць правы ўдзельнікаў іншых вікаў.",
        "userrights-nodatabase": "Базы зьвестак $1 не існуе альбо яна не зьяўляецца лякальнай.",
        "userrights-expiry-options": "1 дзень:1 day,1 тыдзень:1 week,1 месяц:1 month,3 месяцы:3 months,6 месяцаў:6 months,1 год:1 year",
        "userrights-invalid-expiry": "Тэрмін заканчэньня для групы «$1» зьяўляецца няслушным.",
        "userrights-expiry-in-past": "Час заканчэньня для групы «$1» знаходзіцца ў мінулым.",
-       "userrights-cannot-shorten-expiry": "Вы ня можаце падоўжыць час дзеяньня групы «$1». Толькі ўдзельнікі з правамі на дадаваньне і выдаленьне гэтай групы могуць падаўжаць час дзеяньня.",
+       "userrights-cannot-shorten-expiry": "Вы ня можаце падоўжыць час сяброўства ў групе «$1». Толькі ўдзельнікі з правамі на дадаваньне і выдаленьне гэтай групы могуць падаўжаць час сяброўства.",
        "userrights-conflict": "Канфлікт пры зьмене правоў удзельнікаў! Калі ласка, праверце і захавайце вашыя зьмены.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "right-editsemiprotected": "рэдагаваньне старонак, абароненых у рэжыме «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "рэдагаваньне мадэлі зьместу старонкі",
        "right-editinterface": "рэдагаваньне інтэрфэйса карыстальніка",
-       "right-editusercssjs": "рэдагаваньне CSS і JS файлаў іншых удзельнікаў",
        "right-editusercss": "рэдагаваньне CSS файлаў іншых удзельнікаў",
        "right-edituserjs": "рэдагаваньне JS файлаў іншых удзельнікаў",
        "right-editmyusercss": "рэдагаваць уласныя карыстальніцкія CSS-файлы",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
        "recentchanges-submit": "Паказаць",
        "rcfilters-activefilters": "Актыўныя фільтры",
+       "rcfilters-quickfilters": "Хуткія спасылкі",
+       "rcfilters-quickfilters-placeholder-title": "Спасылкі яшчэ не захаваныя",
+       "rcfilters-savedqueries-defaultlabel": "Захаваныя фільтры",
+       "rcfilters-savedqueries-rename": "Перайменаваць",
+       "rcfilters-savedqueries-setdefault": "Усталяваць па змоўчаньні",
+       "rcfilters-savedqueries-unsetdefault": "Выдаліць пазнаку па змоўчаньні",
+       "rcfilters-savedqueries-remove": "Выдаліць",
+       "rcfilters-savedqueries-new-name-label": "Назва",
+       "rcfilters-savedqueries-apply-label": "Стварыць хуткую спасылку",
+       "rcfilters-savedqueries-cancel-label": "Адмяніць",
+       "rcfilters-savedqueries-add-new-title": "Захаваць фільтры як хуткую спасылку",
        "rcfilters-restore-default-filters": "Аднавіць фільтры па змоўчаньні",
        "rcfilters-clear-all-filters": "Ачысьціць усе фільтры",
        "rcfilters-search-placeholder": "Фільтар апошніх зьменаў (праглядзець або пачніце друкаваць)",
        "rcfilters-invalid-filter": "Няслушны фільтар",
        "rcfilters-empty-filter": "Няма актыўных фільтраў. Паказаны ўвесь унёсак.",
        "rcfilters-filterlist-title": "Фільтры",
+       "rcfilters-filterlist-whatsthis": "Што гэта?",
+       "rcfilters-filterlist-feedbacklink": "Пакінуць водгук пра новыя (бэта) фільтры",
        "rcfilters-highlightbutton-title": "Вылучыць вынікі",
+       "rcfilters-highlightmenu-title": "Абярыце колер",
+       "rcfilters-highlightmenu-help": "Абярыце колер для вылучэньня гэтай уласьцівасьці",
        "rcfilters-filterlist-noresults": "Фільтры ня знойдзеныя",
+       "rcfilters-noresults-conflict": "Няма вынікаў, бо крытэры пошуку супярэчаць адзін аднаму",
+       "rcfilters-state-message-subset": "Гэты фільтар ня мае эфэкту, бо яго вынікі ўключаныя ў вынікі больш {{PLURAL:$2|шырокага фільтру|шырокіх фільтраў}} (паспрабуйце вылучэньне, каб вызначыць яго): $1",
+       "rcfilters-state-message-fullcoverage": "Выбар усіх фільтраў у групе — тое ж самае, што і выбар ніводнага, адпаведна, гэты фільтар ня мае эфэкту. Група ўключае: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "Гэты фільтар канфліктуе з {{PLURAL:$2|1=наступным фільтрам|наступнымі фільтрамі}} дасьведчаных удзельнікаў, {{PLURAL:$2|1=які знаходзіць|якія знаходзяць}} толькі зарэгістраваных удзельнікаў: $1",
+       "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-user-experience-level-conflicts-unregistered": "Гэты фільтар досьведу знаходзіць толькі зарэгістраваных удзельнікаў, такім чынам фільтар канфліктуе зь фільтрам «Незарэгістраваныя».",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Фільтар «Незарэгістраваныя» канфліктуе з адным ці некалькімі фільтрамі ўзроўню досьведу, якія шукаюць толькі зарэгістраваных удзельнікаў. Канфліктныя фільтры пазначаныя ў разьдзеле актыўных фільтраў вышэй.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Навічкі",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Менш за 10 правак і 4 дні актыўнасьці.",
+       "rcfilters-filter-user-experience-level-learner-label": "Вучні",
+       "rcfilters-filter-user-experience-level-learner-description": "Больш досьведу, чым у «навічкоў», але меней чым у «дасьведчаных удзельнікаў».",
+       "rcfilters-filter-user-experience-level-experienced-label": "Дасьведчаныя ўдзельнікі",
+       "rcfilters-filter-user-experience-level-experienced-description": "Больш за 30 дзён актыўнасьці і 500 правак.",
        "rcfilters-filtergroup-automated": "Аўтаматычны ўнёсак",
        "rcfilters-filter-bots-label": "Робат",
        "rcfilters-filter-bots-description": "Праўкі, зробленыя з дапамогай аўтаматызаваных інструмэнтаў.",
        "rcfilters-filter-humans-label": "Чалавек (ня робат)",
        "rcfilters-filter-humans-description": "Праўкі, зробленыя людзьмі.",
+       "rcfilters-filtergroup-reviewstatus": "Статус праверкі",
+       "rcfilters-filter-patrolled-label": "Правераныя",
+       "rcfilters-filter-patrolled-description": "Праўкі, пазначаныя як правераныя.",
+       "rcfilters-filter-unpatrolled-label": "Неправераныя",
+       "rcfilters-filter-unpatrolled-description": "Рэдагаваньні, не пазначаныя як правераныя.",
        "rcfilters-filtergroup-significance": "Значэньне",
        "rcfilters-filter-minor-label": "Дробныя праўкі",
        "rcfilters-filter-minor-description": "Праўкі, якія аўтар пазначыў як дробныя.",
        "rcfilters-filter-major-label": "Звычайныя праўкі",
        "rcfilters-filter-major-description": "Праўкі, не пазначаныя як дробныя.",
+       "rcfilters-filtergroup-watchlist": "Старонкі ў сьпісах назіраньня",
+       "rcfilters-filter-watchlist-watched-label": "У сьпісе назіраньня",
+       "rcfilters-filter-watchlist-watched-description": "Зьмены старонак у вашым сьпісе назіраньня.",
+       "rcfilters-filter-watchlist-watchednew-label": "Новыя зьмены ў сьпісе назіраньня",
+       "rcfilters-filter-watchlist-watchednew-description": "Зьмены старонак у вашым сьпісе назіраньня, якія вы не наведвалі з моманту гэтых зьменаў.",
+       "rcfilters-filter-watchlist-notwatched-label": "Ня ў сьпісе назіраньня",
+       "rcfilters-filter-watchlist-notwatched-description": "Усё, за выключэньнем зьменаў старонак з вашага сьпісу назіраньня.",
        "rcfilters-filtergroup-changetype": "Тып зьмены",
        "rcfilters-filter-pageedits-label": "Рэдагаваньні старонкі",
        "rcfilters-filter-pageedits-description": "Рэдагаваньні вікізьместу, абмеркаваньняў, апісаньняў катэгорыяў…",
        "rcfilters-filter-categorization-description": "Запісы пра дадаваньне і выдаленьне старонак з катэгорыяў.",
        "rcfilters-filter-logactions-label": "Журнальныя дзеяньні",
        "rcfilters-filter-logactions-description": "Адміністрацыйныя дзеяньні, стварэньні рахункаў, выдаленьні старонак, загрузкі…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Фільтар «Дробныя праўкі» канфліктуе з адным ці некалькімі фільтрамі «Тыпаў зьменаў», бо некаторыя тыпы зьменаў ня могуць быць вызначаныя як «дробныя». Канфліктныя фільтры пазначаныя ў разьдзеле актыўных фільтраў вышэй.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Некаторыя тыпы зьменаў ня могуць быць вызначаныя як «дробныя», таму гэты фільтар канфліктуе з наступнымі фільтрамі «Тыпаў зьменаў»: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Гэты фільтар тыпаў зьменаў канфліктуе зь фільтрам «Дробныя праўкі». Некаторыя тыпы зьменаў ня могуць быць вызначаныя як «дробныя».",
+       "rcfilters-filtergroup-lastRevision": "Цяперашняя вэрсія",
+       "rcfilters-filter-lastrevision-label": "Апошняя вэрсія",
+       "rcfilters-filter-lastrevision-description": "Апошняя зьмена на старонцы.",
+       "rcfilters-filter-previousrevision-label": "Ранейшыя вэрсіі",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з <strong>$4 $3</strong> (да <strong>$1</strong> на старонку).",
+       "rclistfromreset": "Скінуць выбар даты",
        "rclistfrom": "Паказаць зьмены з $2 $3",
        "rcshowhideminor": "$1 дробныя праўкі",
        "rcshowhideminor-show": "Паказаць",
        "rcshowhidecategorization": "$1 катэгарызацыю старонак",
        "rcshowhidecategorization-show": "Паказаць",
        "rcshowhidecategorization-hide": "Схаваць",
-       "rclinks": "Паказаць апошнія $1 зьменаў за мінулыя $2 дзён<br />$3",
+       "rclinks": "Паказаць апошнія $1 зьменаў за мінулыя $2 дзён",
        "diff": "розьн",
        "hist": "гіст",
        "hide": "Схаваць",
        "php-uploaddisabledtext": "Загрузка файлаў была адключаная ў парамэтрах канфігурацыі PHP. Калі ласка, праверце значэньне парамэтра «file_uploads».",
        "uploadscripted": "Гэты файл утрымлівае HTML-код альбо скрыпт, які можа памылкова апрацоўвацца браўзэрам.",
        "upload-scripted-pi-callback": "Немагчыма загрузіць файл, які ўтрымлівае інструкцыі апрацоўкі табліцы стыляў XML.",
+       "upload-scripted-dtd": "Немагчыма загрузіць SVG-файлы, якія ўтрымліваюць нестандартнае DTD-абвяшчэньне.",
        "uploaded-script-svg": "У загружаным SVG-файле знойдзены небясьпечны элемэнт з падтрымкай сцэнароў «$1».",
        "uploaded-hostile-svg": "Знойдзены небясьпечны CSS у элемэнце стылю загружанага SVG-файла.",
        "uploaded-event-handler-on-svg": "Усталёўваць атрыбуты апрацоўніка падзеяў <code>$1=\"$2\"</code> не дазволена для SVG-файлаў.",
        "statistics-users-active-desc": "Удзельнікі, якія выканалі нейкае дзеяньне цягам {{PLURAL:$1|апошняга $1 дня|апошніх $1 дзён|апошніх $1 дзён}}",
        "pageswithprop": "Старонкі з уласьцівасьцямі старонак",
        "pageswithprop-legend": "Старонкі з уласьцівасьцямі старонак",
-       "pageswithprop-text": "Ð\9dа Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ð°Ð´Ð»Ñ\8eÑ\81Ñ\82Ñ\80оÑ\9eваÑ\8eÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\9eжÑ\8bваÑ\8eÑ\86Ñ\8c Ð¿Ñ\8dÑ\9eнÑ\8bÑ\8f Ñ\9eлаÑ\81Ñ\8cÑ\86Ñ\96ваÑ\81Ñ\8cÑ\86Ñ\96 Ñ\81Ñ\82аÑ\80онак",
+       "pageswithprop-text": "Ð\9dа Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b Ð°Ð´Ð»Ñ\8eÑ\81Ñ\82Ñ\80оÑ\9eваÑ\8eÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\9eжÑ\8bваÑ\8eÑ\86Ñ\8c Ð¿Ñ\8dÑ\9eнÑ\83Ñ\8e Ñ\9eлаÑ\81Ñ\8cÑ\86Ñ\96ваÑ\81Ñ\8cÑ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\96.",
        "pageswithprop-prop": "Імя ўласьцівасьці:",
        "pageswithprop-submit": "Паказаць",
        "pageswithprop-prophidden-long": "доўгае тэкставае значэньне ўласьцівасьці схавана ($1)",
        "enotif_body_intro_moved": "Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была перанесеная $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цяперашнюю вэрсію глядзіце $3.",
        "enotif_body_intro_restored": "Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была адноўленая $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цяперашнюю вэрсію глядзіце $3.",
        "enotif_body_intro_changed": "Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была зьмененая $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цяперашнюю вэрсію глядзіце $3.",
-       "enotif_lastvisited": "Ð\93лÑ\8fдзÑ\96Ñ\86е Ð½Ð° $1 Ñ\83Ñ\81е Ð°Ð¿Ð¾Ñ\88нÑ\96Ñ\8f Ð·Ñ\8cменÑ\8b, Ñ\8fкÑ\96Ñ\8f Ð°Ð´Ð±Ñ\8bлÑ\96Ñ\81Ñ\8f Ð¿Ð°Ñ\81Ñ\8cлÑ\8f Ð\92аÑ\88ага Ð°Ð¿Ð¾Ñ\88нÑ\8fга Ð½Ð°Ð²ÐµÐ´Ð²Ð°Ð½Ñ\8cнÑ\8f.",
+       "enotif_lastvisited": "Ð\94зелÑ\8f Ñ\9eÑ\81Ñ\96Ñ\85 Ð·Ñ\8cменаÑ\9e Ð· Ð²Ð°Ñ\88ага Ð°Ð¿Ð¾Ñ\88нÑ\8fга Ð½Ð°Ð²ÐµÐ´Ð²Ð°Ð½Ñ\8cнÑ\8f, Ð³Ð»Ñ\8fдзÑ\96Ñ\86е $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             Сыстэма паведамленьняў {{GRAMMAR:родны|{{SITENAME}}}}\n\n--\nКаб зьмяніць налады абвяшчэньня праз электронную пошту, наведайце:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКаб зьмяніць налады сьпісу назіраньня, наведайце:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКаб выдаліць старонку з Вашага сьпісу назіраньня, наведайце:\n$UNWATCHURL\n\nЗваротная сувязь і дапамога:\n$HELPPAGE",
        "undeleteviewlink": "паказаць",
        "undeleteinvert": "Адваротны выбар",
        "undeletecomment": "Прычына:",
-       "undeletedrevisions": "{{PLURAL:$1|адноўленая $1 вэрсія|адноўленыя $1 вэрсіі|адноўленыя $1 вэрсіяў}}",
-       "undeletedrevisions-files": "адноўленыя $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}} і $2 {{PLURAL:$2|файл|файлы|файлаў}}",
-       "undeletedfiles": "{{PLURAL:$1|адноўлены $1 файл|адноўленыя $1 файлы|адноўленыя $1 файлаў}}",
        "cannotundelete": "Некаторыя або ўсе аднаўленьні не былі выкананыя:\n$1",
        "undeletedpage": "'''Старонка $1 была адноўленая'''\n\nГлядзіце [[Special:Log/delete|журнал выдаленьняў]] для прагляду апошніх выдаленьняў і аднаўненьняў.",
        "undelete-header": "Глядзіце [[Special:Log/delete|журнал выдаленьняў]] для прагляду апошніх выдаленьняў.",
        "sp-contributions-uploads": "загрузкі",
        "sp-contributions-logs": "журналы падзеяў",
        "sp-contributions-talk": "гутаркі",
-       "sp-contributions-userrights": "кіраваньне правамі ўдзельнікаў і ўдзельніц",
+       "sp-contributions-userrights": "кіраваньне правамі {{GENDER:$1|ўдзельніка|ўдзельніцы}}",
        "sp-contributions-blocked-notice": "{{GENDER:$1|Гэты ўдзельнік у дадзены момант заблякаваны|Гэтая ўдзельніца ў дадзены момант заблякаваная}}. Апошні запіс з журнала блякаваньняў пададзены ніжэй для даведкі:",
        "sp-contributions-blocked-notice-anon": "Гэты IP-адрас у дадзены момант заблякаваны.\nАпошні запіс з журнала блякаваньняў пададзены ніжэй для даведкі:",
        "sp-contributions-search": "Пошук унёску",
        "unblocked-id": "Блякаваньне $1 зьнятае",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] быў разблякаваны.",
        "blocklist": "Заблякаваныя ўдзельнікі",
+       "autoblocklist": "Аўтаблякаваньні",
+       "autoblocklist-submit": "Шукаць",
+       "autoblocklist-legend": "Сьпіс аўтаблякаваньняў",
+       "autoblocklist-localblocks": "{{PLURAL:$1|1=Лякальнае аўтаблякаваньне|Лякальныя аўтаблякаваньні}}",
+       "autoblocklist-empty": "Сьпіс аўтаблякаваньняў пусты.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|1=Іншае аўтаблякаваньне|Іншыя аўтаблякаваньні}}",
        "ipblocklist": "Заблякаваныя ўдзельнікі",
        "ipblocklist-legend": "Пошук заблякаванага ўдзельніка",
        "blocklist-userblocks": "Схаваць блякаваньні рахункаў",
        "tooltip-pt-mycontris": "{{GENDER:|Ваш}} унёсак",
        "tooltip-pt-anoncontribs": "Сьпіс рэдагаваньняў, зробленых з гэтага IP-адрасу",
        "tooltip-pt-login": "Вас запрашаюць увайсьці, хаця гэта і неабавязкова.",
+       "tooltip-pt-login-private": "Каб карыстацца гэтай вікі, вам трэба ўвайсьці",
        "tooltip-pt-logout": "Выйсьці",
        "tooltip-pt-createaccount": "Мы прапануем вам стварыць рахунак і ўвайсьці, але гэта не абавязкова",
        "tooltip-ca-talk": "Абмеркаваньне зьместу старонкі",
        "anonymous": "{{PLURAL:$1|1=Ананімны ўдзельнік ці ўдзельніца|Ананімныя ўдзельнікі і ўдзельніцы}} {{GRAMMAR:родны|{{SITENAME}}}}",
        "siteuser": "Удзельнік/удзельніца {{GRAMMAR:родны|{{SITENAME}}}} $1",
        "anonuser": "Ананімны ўдзельнік {{GRAMMAR:родны|{{SITENAME}}}} $1",
-       "lastmodifiedatby": "Гэтую старонку апошні раз рэдагаваў $3 $2, $1.",
+       "lastmodifiedatby": "Гэтую старонку апошні раз {{GENDER:$4|рэдагаваў|рэдагавала}} $3 $2 $1.",
        "othercontribs": "На аснове працы $1.",
        "others": "іншыя",
        "siteusers": "{{PLURAL:$2|1={{GENDER:$1|Удзельнік|Удзельніца}}|Удзельнікі}} {{GRAMMAR:родны|{{SITENAME}}}} $1",
        "newimages-summary": "Гэтая спэцыяльная старонка паказвае нядаўна загружаныя файлы.",
        "newimages-legend": "Фільтар",
        "newimages-label": "Назва файла (альбо яе частка):",
+       "newimages-user": "IP-адрас ці імя ўдзельніка",
        "newimages-showbots": "Паказаць загружаныя робатамі",
        "newimages-hidepatrolled": "Схаваць патруляваныя загрузкі",
        "noimages": "Выявы адсутнічаюць.",
        "confirmrecreate-noreason": "{{GENDER:$1|Удзельнік|Удзельніца}} [[User:$1|$1]] ([[User talk:$1|гутаркі]]) {{GENDER:$1|выдаліў|выдаліла}} гэтую старонку, пасьля таго як Вы пачалі яе рэдагаваць. Калі ласка, пацьвердзіце, што Вы сапраўды жадаеце стварыць гэтую старонку ізноў.",
        "recreate": "Стварыць ізноў",
        "unit-pixel": "пкс",
+       "confirm-purge-title": "Ачысьціць кэш гэтай старонкі",
        "confirm_purge_button": "Добра",
        "confirm-purge-top": "Ачысьціць кэш гэтай старонкі?",
        "confirm-purge-bottom": "Ачыстка кэшу старонкі прывядзе да адлюстраваньня яе апошняй вэрсіі.",
        "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-restore": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3",
+       "restore-count-revisions": "$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}}",
+       "restore-count-files": "$1 {{PLURAL:$1|файл|файлы|файлаў}}",
        "logentry-delete-event": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|1=падзеі ў журнале|падзеяў у журнале}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|вэрсіі|вэрсіяў}} старонкі $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць падзеяў у журнале на $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|абнавіў|абнавіла}} цэтлікі на вэрсіі $4 старонкі $3 ({{PLURAL:$7|дададзена}} $6; {{PLURAL:$9|выдалена}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|абнавіў|абнавіла}} цэтлікі на запісе журналу $5 старонкі $3 ({{PLURAL:$7|дададзена}} $6; {{PLURAL:$9|выдалена}} $8)",
        "rightsnone": "(няма)",
-       "revdelete-summary": "кароткае апісаньне зьменаў",
        "rightslogentry-temporary-group": "$1 (часова, да $2)",
        "feedback-adding": "Даданьне водгуку на старонку…",
        "feedback-back": "Назад",
        "special-characters-group-thai": "Тайскія",
        "special-characters-group-lao": "Лаоскія",
        "special-characters-group-khmer": "Кхмэрскія",
+       "special-characters-group-canadianaboriginal": "Канадзкае складовае пісьмо",
        "special-characters-title-endash": "кароткі працяжнік",
        "special-characters-title-emdash": "доўгі працяжнік",
        "special-characters-title-minus": "мінус",
        "authmanager-authn-not-in-progress": "Аўтэнтыфікацыя не выконваецца або страчаныя зьвесткі пра сэсію. Калі ласка, пачніце зноў з самага пачатку.",
        "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: пасьпяхова далучаны.",
        "changecredentials": "Зьмена ўліковых зьвестак",
        "removecredentials": "Выдаленьне ўліковых зьвестак",
        "removecredentials-submit": "Выдаліць уліковыя зьвесткі",
index 5abee6a..49fd7e9 100644 (file)
@@ -29,7 +29,8 @@
                        "Nemo bis",
                        "SamGold",
                        "Liashko",
-                       "Mechanizatar"
+                       "Mechanizatar",
+                       "Artsiom91"
                ]
        },
        "tog-underline": "Падкрэсліваць спасылкі:",
        "jumpto": "Перайсці да:",
        "jumptonavigation": "рух",
        "jumptosearch": "знайсці",
-       "view-pool-error": "Ð\9dа Ð¶Ð°Ð»Ñ\8c, Ñ\83 Ð³Ñ\8dÑ\82Ñ\8b Ð¼Ð¾Ð¼Ð°Ð½Ñ\82 Ñ\81еÑ\80веÑ\80Ñ\8b Ð¿ÐµÑ\80агÑ\80Ñ\83жанÑ\8b.\nÐ\97анадÑ\82а Ð¼Ð½Ð¾Ð³Ñ\96Ñ\8f Ñ\87Ñ\8bÑ\82аÑ\87Ñ\8b Ñ\81пÑ\80абÑ\83Ñ\8eÑ\86Ñ\8c адкрыць гэтую старонку.\nКалі ласка, трохі пачакайце, перш чым адкрываць гэтую старонку ізноў.\n\n$1",
+       "view-pool-error": "Ð\9dа Ð¶Ð°Ð»Ñ\8c, Ñ\83 Ð³Ñ\8dÑ\82Ñ\8b Ð¼Ð¾Ð¼Ð°Ð½Ñ\82 Ñ\81еÑ\80веÑ\80Ñ\8b Ð¿ÐµÑ\80агÑ\80Ñ\83жанÑ\8b.\nÐ\92елÑ\8cмÑ\96 Ñ\88маÑ\82 Ñ\87Ñ\8bÑ\82аÑ\87оÑ\9e Ñ\81пÑ\80абÑ\83е адкрыць гэтую старонку.\nКалі ласка, трохі пачакайце, перш чым адкрываць гэтую старонку ізноў.\n\n$1",
        "generic-pool-error": "На жаль, у гэты момант серверы перагружаны.\nЗанадта многія карыстальнікі спрабуюць адкрыць гэты рэсурс.\nКалі ласка, трохі пачакайце, перш чым спрабаваць атрымаць доступ да гэтага рэсурсу ізноў.",
        "pool-timeout": "Выйшаў час чакання блакіроўкі",
        "pool-queuefull": "Чарга запытаў перапоўнена",
        "login": "Увайсці ў сістэму",
        "login-security": "Праверыць вашу асобу",
        "nav-login-createaccount": "Увайсці ў сістэму / стварыць рахунак",
-       "userlogin": "Увайсці ў сістэму / стварыць рахунак",
-       "userloginnocreate": "Увайсці",
        "logout": "Выйсці з сістэмы",
        "userlogout": "Выйсці з сістэмы",
        "notloggedin": "Не ўвайшоў",
        "userlogin-noaccount": "Не маеце ўліковага запісу?",
        "userlogin-joinproject": "Далучайцеся да {{GRAMMAR:родны|{{SITENAME}}}}",
-       "nologin": "Не маеце рахунка? $1.",
-       "nologinlink": "Завесці рахунак",
        "createaccount": "Стварыць рахунак",
-       "gotaccount": "Ужо маеце рахунак? '''$1'''.",
-       "gotaccountlink": "Увайсці ў сістэму",
-       "userlogin-resetlink": "Забыліся даныя для ўваходу?",
        "userlogin-resetpassword-link": "Забылі пароль?",
        "userlogin-helplink2": "Даведка па прадстаўленні сістэме",
        "userlogin-loggedin": "Вы ўжо ўвайшлі ў сістэму як {{GENDER:$1|$1}}.\nСкарыстайцеся формай ніжэй, каб прадставіцца сістэме як іншы ўдзельнік.",
        "createaccountmail": "Ужыць часовы выпадковы пароль і даслаць яго праз эл.пошту",
        "createaccountmail-help": "Можа быць выкарыстаны для стварэння ўліковага запісу для іншага чалавека без пазнання пароля.",
        "createacct-realname": "Сапраўднае імя (неабавязкова)",
-       "createaccountreason": "Прычына:",
        "createacct-reason": "Прычына",
        "createacct-reason-ph": "Чаму вы ствараеце іншы ўліковы запіс",
        "createacct-reason-help": "Паведамленне паказана ў логу стварэння ўліковага запісу",
        "preview": "Перадпаказ",
        "showpreview": "Як будзе",
        "showdiff": "Розніца",
-       "blankarticle": "<strong>Увага:</strong> Вы ствараеце пустую старонку.\nКалі вы націсніце \"{{int:savearticle}}\" яшчэ раз, будзе створана старонка без аніякага зместу.",
+       "blankarticle": "<strong>Увага:</strong> Вы ствараеце пустую старонку.\nКалі вы націсніце \"$1\" яшчэ раз, будзе створана старонка без аніякага зместу.",
        "anoneditwarning": "<strong>Увага!</strong> Вы не аўтарызаваліся на сайце. Ваш IP-адрас будзе публічна бачным, калі вы будзеце ўносіць любыя праўкі. Калі вы <strong>[$1 ўвойдзеце]</strong> ці <strong>[$2 створыце ўліковы запіс]</strong>, праўкі замест гэтага будуць звязаны з вашым імем карыстальніка, а таксама ў вас з'явяцца іншыя перавагі.",
        "anonpreviewwarning": "''Вы не прайшлі ідэнтыфікацыю Захаванне будзе запісана з вашым IP адрасам у гісторыі правак гэтай старонкі.''",
-       "missingsummary": "<strong>Нагадваем:</strong> вы не ўпісалі тлумачэння для сваёй праўкі. Калі націснуць \"{{int:savearticle}}\" яшчэ раз, праўка будзе замацавана без тлумачэння.",
-       "selfredirect": "<strong>Увага:</strong> Вы перанакіроўваеце старонку на самую сябе.\nМагчыма, вы ўказалі няправільную мэту перанакіравання, ці правіце не тую старонку.\nКалі націсніце \"{{int:savearticle}}\" ізноў, перанакіраванне ўсё ж будзе створана.",
+       "missingsummary": "<strong>Нагадваем:</strong> вы не ўпісалі тлумачэння для сваёй праўкі. Калі націснуць \"$1\" яшчэ раз, праўка будзе замацавана без тлумачэння.",
+       "selfredirect": "<strong>Увага:</strong> Вы перанакіроўваеце старонку на самую сябе.\nМагчыма, вы ўказалі няправільную мэту перанакіравання, ці правіце не тую старонку.\nКалі націсніце \"$1\" ізноў, перанакіраванне ўсё ж будзе створана.",
        "missingcommenttext": "Калі ласка, увядзіце ніжэй каментарый.",
-       "missingcommentheader": "'''Напамінанне:''' вы нічога не ўпісалі ў тэму/загаловак гэтай заўвагі.\nПры паўторным націсканні кнопкі '{{int:savearticle}}' ваша праўка будзе запісана з пустым загалоўкам.",
+       "missingcommentheader": "'''Напамінанне:''' вы нічога не ўпісалі ў тэму/загаловак гэтай заўвагі.\nПры паўторным націсканні кнопкі '$1' ваша праўка будзе запісана з пустым загалоўкам.",
        "summary-preview": "Перадпаказ апісання:",
        "subject-preview": "Перадпаказ тэмы/загалоўка:",
        "previewerrortext": "Здарылася памылка пры спробе папярэдняга прагляду вашых змяненняў.",
        "editingsection": "Правім $1 (раздзел)",
        "editingcomment": "Правім $1 (новы раздзел)",
        "editconflict": "Канфлікт правак: $1",
-       "explainconflict": "Нехта іншы змяніў старонку пасля таго, як вы пачалі працу з ёю.\nВерхняе тэкставае поле паказвае актуальны зыходны тэкст старонкі.\nВашы праўкі паказаны ў ніжнім тэкставым полі.\nВам трэба будзе далучыць іх да актуальнага зыходнага тэксту.\nКалі націснуць \"{{int:savearticle}}\", будзе запісаны '''толькі''' тэкст у верхнім полі.",
+       "explainconflict": "Нехта іншы змяніў старонку пасля таго, як вы пачалі працу з ёю.\nВерхняе тэкставае поле паказвае актуальны зыходны тэкст старонкі.\nВашы праўкі паказаны ў ніжнім тэкставым полі.\nВам трэба будзе далучыць іх да актуальнага зыходнага тэксту.\nКалі націснуць \"$1\", будзе запісаны '''толькі''' тэкст у верхнім полі.",
        "yourtext": "Свой тэкст",
        "storedversion": "Захаваная версія",
        "nonunicodebrowser": "<strong>Увага: ваш браўзер не працуе з Unicode-кадаваннем.</strong> Каб вы маглі карэктна правіць старонкі, усе знакі, не ўключаныя ў ASCII, паказваюцца ў рэдактарскім акне як шаснаццаткавыя коды.",
        "post-expand-template-argument-warning": "Увага: на гэтай старонцы ёсць прынамсі адзін параметр шаблона, які занадта доўгі ў разгорнутым выглядзе.\nТакія параметры былі прапушчаныя.",
        "post-expand-template-argument-category": "Старонкі, на якіх прапушчаны параметры шаблонаў",
        "parser-template-loop-warning": "Цыклічнае ўключэнне шаблона: [[$1]]",
+       "template-loop-category": "Старонкі з зацыкліваннем у шаблонах",
+       "template-loop-category-desc": "Старонка змяшчае зацыкліванне шаблона, гэта значыць уключае шаблон, які выклікае сам сябе рэкурсіўна",
        "parser-template-recursion-depth-warning": "Вычарпаны ліміт глыбіні ўключэння шаблонаў ($1)",
        "language-converter-depth-warning": "Перавышана глыбіня моўнага канвертэра ($1)",
        "node-count-exceeded-category": "Старонкі, якія перасягнулі колькасць вузлоў",
        "search-interwiki-caption": "Сумежныя праекты",
        "search-interwiki-default": "Вынікі з $1:",
        "search-interwiki-more": "(яшчэ)",
+       "search-interwiki-more-results": "больш вынікаў",
        "search-relatedarticle": "Дачыняюцца*",
        "searchrelated": "маюць дачыненне",
        "searchall": "усе",
        "right-editsemiprotected": "Правіць старонкі, што пад аховай \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Рэдагаваць мадэль змесціва старонкі",
        "right-editinterface": "Правіць карыстальніцкі інтэрфейс",
-       "right-editusercssjs": "Правіць файлы CSS і JS іншых удзельнікаў",
        "right-editusercss": "Правіць файлы CSS іншых удзельнікаў",
        "right-edituserjs": "Правіць файлы JS іншых удзельнікаў",
        "right-editmyusercss": "Правіць уласныя файлы CSS",
        "action-reupload-shared": "запісваць паўзверх гэтага файла ў супольным сховішчы",
        "action-upload_by_url": "загрузіць гэты файл з адраса URL",
        "action-writeapi": "ужываць API запісвання",
-       "action-delete": "сціраць гэтую старонку",
+       "action-delete": "выдаліць гэтую старонку",
        "action-deleterevision": "сціраць версіі старонак",
        "action-deletelogentry": "выдаленне запісаў у журнале",
        "action-deletedhistory": "бачыць сцёртую гісторыю гэтай старонкі",
        "recentchanges-label-minor": "Дробная па значэнні праўка",
        "recentchanges-label-bot": "Праўка зроблена праграмай-робатам",
        "recentchanges-label-unpatrolled": "Праўка яшчэ не атрымала адзнакі ўхваленасці (за ёй не сочыць \"патруль\")",
-       "recentchanges-label-plusminus": "Ð\90б'Ñ\91м Ñ\81Ñ\82аÑ\80онкÑ\96 Ð·Ð¼Ñ\8fнÑ\96Ñ\9eÑ\81Ñ\8f Ð½Ð° Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ð»Ñ\96Ñ\87бÑ\83 байтаў",
+       "recentchanges-label-plusminus": "Ð\90б'Ñ\91м Ñ\81Ñ\82аÑ\80онкÑ\96 Ð·Ð¼Ñ\8fнÑ\96Ñ\9eÑ\81Ñ\8f Ð½Ð° Ð³Ñ\8dÑ\82Ñ\8b Ð»Ñ\96к байтаў",
        "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 правак.",
+       "rcfilters-activefilters": "Актыўныя фільтры",
+       "rcfilters-restore-default-filters": "Аднавіць фільтры па змоўчанні",
+       "rcfilters-clear-all-filters": "Ачысціць усе фільтры",
+       "rcfilters-highlightmenu-title": "Выбраць колер",
+       "rcfilters-highlightmenu-help": "Выбраць колер для падсвечвання уласцівасці",
+       "rcfilters-filtergroup-registration": "Рэгістрацыя ўдзельніка",
+       "rcfilters-filter-registered-label": "Зарэгістраваны",
+       "rcfilters-filter-registered-description": "Залагіненыя рэдактары",
+       "rcfilters-filter-unregistered-label": "Незарэгістраваны",
+       "rcfilters-filter-editsbyself-label": "Вашыя змены",
+       "rcfilters-filter-editsbyself-description": "Ваш унёсак",
+       "rcfilters-filter-editsbyother-label": "Змены іншых удзельнікаў",
+       "rcfilters-filter-editsbyother-description": "Усе змены, акрамя Вашых",
+       "rcfilters-filtergroup-userExpLevel": "Вопыт (толькі для зарэгістраваных удзельнікаў)",
+       "rcfilters-filter-user-experience-level-learner-description": "Болей дзён актыўнасці і правак, чым у «навічкоў», але меней чым у «дасведчаных удзельнікаў».",
+       "rcfilters-filter-user-experience-level-experienced-description": "Больш за 30 дзён актыўнасці і 500 правак.",
        "rcfilters-filter-bots-label": "Бот",
+       "rcfilters-filter-humans-label": "Чалавек (не бот)",
+       "rcfilters-filter-humans-description": "Праўкі, зробленыя людзьмі",
+       "rcfilters-filter-patrolled-label": "Дагледжаны",
+       "rcfilters-filter-unpatrolled-label": "Недагледжаны",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|паказана змяненне|паказаны змены}} з <strong>$3, $4</strong> (не больш за <strong>$1</strong>).",
        "rclistfrom": "Паказаць змены з $3 $2",
        "rcshowhideminor": "$1 дробныя праўкі",
        "rcshowhidecategorization": "$1 катэгарызацыю старонак",
        "rcshowhidecategorization-show": "Паказаць",
        "rcshowhidecategorization-hide": "Схаваць",
-       "rclinks": "Паказаць апошнія $1 змен за мінулыя $2 дзён<br />$3",
+       "rclinks": "Паказаць апошнія $1 змен за мінулыя $2 дзён",
        "diff": "розн.",
        "hist": "гіст.",
        "hide": "Не ўлічваць",
        "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>, таму некаторыя шаблоны пакінуты неразгорнутымі.",
        "undeleteviewlink": "паказаць",
        "undeleteinvert": "Перавярнуць выбранае",
        "undeletecomment": "Прычына:",
-       "undeletedrevisions": "Адноўлен{{PLURAL:$1|а 1 версія|ы $1 версіі|ы $1 версій}}",
-       "undeletedrevisions-files": "Адноўлен{{PLURAL:$1|а 1 версія|ы $1 версіі|ыя $1 версій}} і {{PLURAL:$2|1 файл|$2 файлы|$2 файлаў}}",
-       "undeletedfiles": "Адноўлен{{PLURAL:$1|ы 1 файл|ы $1 файлы|ыя $1 файлаў}}",
        "cannotundelete": "Не ўдалося аднавіць:\n$1",
        "undeletedpage": "'''$1 была адноўлена'''\n\nПраверце пералік нядаўніх сціранняў і аднаўленняў у [[Special:Log/delete|журнале сціранняў]].",
        "undelete-header": "Нядаўна сцёртыя старонкі можна паглядзець у [[Special:Log/delete|журнале сціранняў]].",
        "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|дадаў|дадала}} {{PLURAL:$7|1=бірку|біркі}} $6 да запісу ў журнале $5 старонкі $3",
        "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|выдаліў|выдаліла}} {{PLURAL:$9|1=бірку|біркі}} $8 з версіі $4 старонкі $3",
        "rightsnone": "(няма)",
-       "revdelete-summary": "тлумачэнне праўкі",
        "feedback-adding": "Даданне водгуку на старонку…",
        "feedback-back": "Назад",
        "feedback-bugcheck": "Выдатна! Толькі праверце, што ў спісе [$1 вядомых памылак] яе няма падобнага запісу.",
        "default-skin-not-found-no-skins": "Упс! Прадвызначаная вокладка для вашай вікі (<code>$wgDefaultSkin</code>), <code>$1</code>, недаступна.\n\nВы не ўстанавілі вокладкі.\n\n; Калі вы толькі што ўстанавілі ці абнавілі MediaWiki:\n: Магчыма, вы ўстанавілі з git, ці наўпрост з зыходнага коду, выкарыстаўшы іншы метад. Гэта нармальна. MediaWiki 1.24 і навейшыя не ўключаюць вокладкі ў асноўнае сховішча. Паспрабуйце ўстанавіць некалькі вокладак з [https://www.mediawiki.org/wiki/Category:All_skins каталога вокладак mediawiki.org], такім чынам:\n:* Узяўшы [https://www.mediawiki.org/wiki/Download tarball-інсталятар], які ўтрымлівае некалькі вокладак і прыставак. Вы можаце скапіяваць і ўставіць каталог <code>skins/</code> адтуль.\n:* Зрабіўшы клон аднаго з сховішчаў <code>mediawiki/skins/*</code> праз git у каталог <code>skins/</code> вашай інсталяцыі MediaWiki.\n: Калі вы распрацоўшчык MediaWiki, гэта не павінна адбіцца на вашым git-сховішчы. Гл. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Інструкцыя: Настройка вокладак] дзеля інфармацыі па ўключэнні вокладак і выбары прадвызначэння.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (уключана)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>выключана</strong>)",
+       "mediastatistics-table-extensions": "Магчымыя прыстаўкі",
        "mediastatistics-table-count": "Колькасць файлаў",
        "mediastatistics-table-totalbytes": "Агульны памер",
        "mediastatistics-header-unknown": "Невядомыя",
index df6da1a..9c80b49 100644 (file)
@@ -55,7 +55,7 @@
        "tog-editondblclick": "Редактиране на страниците чрез двойно щракване",
        "tog-editsectiononrightclick": "Възможност за редактиране на раздел при щракване с десния бутон върху заглавието му",
        "tog-watchcreations": "Добавяне на създадените от мен страници и качените от мен файлове към списъка ми за наблюдение",
-       "tog-watchdefault": "Ð\94обавÑ\8fне Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\80едакÑ\82иÑ\80ам, Ð² списъка ми за наблюдение",
+       "tog-watchdefault": "Ð\94обавÑ\8fне Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\80едакÑ\82иÑ\80ам, ÐºÑ\8aм списъка ми за наблюдение",
        "tog-watchmoves": "Добавяне на преместените от мен страници и файлове към списъка ми за наблюдение",
        "tog-watchdeletion": "Добавяне на изтритите от мен страници и файлове към списъка ми за наблюдение",
        "tog-watchuploads": "Добавяне на новите качени от мен файлове към списъка ми за наблюдение",
@@ -81,9 +81,9 @@
        "tog-watchlisthidepatrolled": "Скриване на патрулираните редакции от списъка за наблюдение",
        "tog-watchlisthidecategorization": "Скриване на категоризацията на статии",
        "tog-ccmeonemails": "Получаване на копия на писмата, които пращам на другите потребители",
-       "tog-diffonly": "Ð\91ез Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ð½Ðµ Ð½а съдържанието на страницата при преглед на разлики",
+       "tog-diffonly": "Ð\94а Ð½Ðµ Ñ\81е Ð¿Ð¾ÐºÐ°Ð·Ð²а съдържанието на страницата при преглед на разлики",
        "tog-showhiddencats": "Показване на скритите категории",
-       "tog-norollbackdiff": "Ð\9dе Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ð¹ разликата между редакциите след отмяна на редакции",
+       "tog-norollbackdiff": "Ð\94а Ð½Ðµ Ñ\81е Ð¿Ð¾ÐºÐ°Ð·Ð²Ð° разликата между редакциите след отмяна на редакции",
        "tog-useeditwarning": "Предупреждаване при опит за напускане на страница, отворена в режим на редактиране, без да са запазени промените",
        "tog-prefershttps": "Да се използва винаги защитена връзка при влизане",
        "underline-always": "Винаги",
@@ -92,8 +92,8 @@
        "editfont-style": "Стил на шрифта в кутията за редактиране:",
        "editfont-default": "По подразбиране за браузъра",
        "editfont-monospace": "Равноширок шрифт",
-       "editfont-sansserif": "ШÑ\80иÑ\84Ñ\82 Ð±ÐµÐ· Ð¸Ð·Ð²Ð¸Ð²ÐºÐ¸",
-       "editfont-serif": "ШÑ\80иÑ\84Ñ\82 Ñ\81 Ð¸Ð·Ð²Ð¸Ð²ÐºÐ¸",
+       "editfont-sansserif": "Ð\9dеÑ\81еÑ\80иÑ\84ен Ñ\88Ñ\80иÑ\84Ñ\82",
+       "editfont-serif": "СеÑ\80иÑ\84ен Ñ\88Ñ\80иÑ\84Ñ\82",
        "sunday": "неделя",
        "monday": "понеделник",
        "tuesday": "вторник",
        "november-date": "$1 ноември",
        "december-date": "$1 декември",
        "period-am": "Преди обед",
-       "period-pm": "След обед",
+       "period-pm": "Следобед",
        "pagecategories": "{{PLURAL:$1|Категория|Категории}}",
        "category_header": "Страници в категория „$1“",
        "subcategories": "Подкатегории",
        "category-media-header": "Файлове в категория „$1“",
-       "category-empty": "''В момента тази категория не съдържа страници или файлове.''",
+       "category-empty": "<em>В момента тази категория не съдържа страници или файлове.</em>",
        "hidden-categories": "{{PLURAL:$1|Скрита категория|Скрити категории}}",
        "hidden-category-category": "Скрити категории",
        "category-subcat-count": "{{PLURAL:$2|Тази категория съдържа само една подкатегория.|{{PLURAL:$1|Показана е една|Показани са $1}} от общо $2 подкатегории на тази категория.}}",
        "navigation-heading": "Навигация",
        "errorpagetitle": "Грешка",
        "returnto": "Обратно към $1.",
-       "tagline": "от {{SITENAME}}",
+       "tagline": "Ð\9eт {{SITENAME}}",
        "help": "Помощ",
        "search": "Търсене",
        "searchbutton": "Търсене",
        "history": "История",
        "history_short": "История",
        "history_small": "история",
-       "updatedmarker": "има Ð¿Ñ\80омÑ\8fна (оÑ\82 Ð¿Ð¾Ñ\81ледноÑ\82о Ð²Ð¸ Ð²Ð»Ð¸Ð·Ð°Ð½Ðµ)",
+       "updatedmarker": "пÑ\80оменено Ð¾Ñ\82 Ð¿Ð¾Ñ\81ледноÑ\82о Ð¼Ð¸ Ð¿Ð¾Ñ\81еÑ\89ение",
        "printableversion": "Версия за печат",
        "permalink": "Постоянна препратка",
        "print": "Печат",
        "talk": "Беседа",
        "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.",
-       "viewcount": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ðµ Ð±Ð¸Ð»Ð° Ð¿Ñ\80еглеждана {{PLURAL:$1|един Ð¿Ñ\8aÑ\82|$1 Ð¿Ñ\8aÑ\82и}}.",
+       "lastmodifiedat": "Последна редакция на страницата: в $2, на $1.",
+       "viewcount": "Страницата е преглеждана {{PLURAL:$1|един път|$1 пъти}}.",
        "protectedpage": "Защитена страница",
        "jumpto": "Направо към:",
        "jumptonavigation": "навигация",
        "pool-timeout": "Изтичане на времето за заключване на страницата",
        "pool-queuefull": "Опашката за заявки е пълна",
        "pool-errorunknown": "Непозната грешка",
-       "poolcounter-usage-error": "Грешка при ползване $1",
+       "poolcounter-usage-error": "Грешка при употреба: $1",
        "aboutsite": "За {{SITENAME}}",
        "aboutpage": "Project:За {{SITENAME}}",
        "copyright": "Освен ако не е посочено друго, съдържанието е достъпно при условията на $1.",
        "currentevents-url": "Project:Текущи събития",
        "disclaimers": "Предупреждение",
        "disclaimerpage": "Project:Предупреждение",
-       "edithelp": "Ð\9fомоÑ\89 Ð¿Ñ\80и редактиране",
+       "edithelp": "Ð\9fомоÑ\89 Ð·Ð° редактиране",
        "helppage-top-gethelp": "Помощ",
        "mainpage": "Начална страница",
        "mainpage-description": "Начална страница",
        "portal-url": "Проект:Портал на общността",
        "privacy": "Поверителност",
        "privacypage": "Проект:Защита на личните данни",
-       "badaccess": "Грешка при достъп",
-       "badaccess-group0": "Ð\9dÑ\8fмаÑ\82е Ð¿Ñ\80ава Ð´Ð° Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88иÑ\82е Ð¸Ñ\81каното действие.",
-       "badaccess-groups": "Ð\98Ñ\81каното действие могат да изпълнят само потребители от {{PLURAL:$2|групата|някоя от следните групи:}} $1.",
+       "badaccess": "Ð\93Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¿Ñ\80аваÑ\82а Ð½Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aп",
+       "badaccess-group0": "Ð\9dÑ\8fмаÑ\82е Ð¿Ñ\80ава Ð´Ð° Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88иÑ\82е Ð·Ð°Ñ\8fвеното действие.",
+       "badaccess-groups": "Ð\97аÑ\8fвеното действие могат да изпълнят само потребители от {{PLURAL:$2|групата|някоя от следните групи:}} $1.",
        "versionrequired": "Изисква се версия $1 на МедияУики",
        "versionrequiredtext": "Използването на тази страница изисква версия $1 на софтуера МедияУики. Вижте [[Special:Version|текущата версия]].",
        "ok": "Добре",
        "nospecialpagetext": "<strong>Отправихте заявка за невалидна специална страница.</strong>\n\nСписък с валидните специални страници може да бъде видян на [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Грешка",
        "databaseerror": "Грешка при работа с базата от данни",
-       "databaseerror-text": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð·Ð°Ñ\8fвкаÑ\82а Ð·Ð° базата данни.\nТова може да означава бъг в софтуера.",
-       "databaseerror-textcl": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð·Ð°Ñ\8fвка Ð·Ð° базата данни.",
+       "databaseerror-text": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð·Ð°Ñ\8fвкаÑ\82а ÐºÑ\8aм базата данни.\nТова може да означава бъг в софтуера.",
+       "databaseerror-textcl": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð·Ð°Ñ\8fвка ÐºÑ\8aм базата данни.",
        "databaseerror-query": "Заявка: $1",
        "databaseerror-function": "Функция: $1",
        "databaseerror-error": "Грешка: $1",
-       "laggedslavemode": "Внимание: Страницата може да не съдържа последните обновявания.",
-       "readonly": "Базата от данни е затворена за промени",
-       "enterlockreason": "Посочете причина за затварянето, като дадете и приблизителна оценка кога базата от данни ще бъде отново отворена",
-       "readonlytext": "Базата данни е временно затворена за промени — вероятно за рутинна поддръжка, след която ще бъде отново достъпна.\nАдминистраторът, който я е затворил, дава следното обяснение:\n$1",
+       "laggedslavemode": "<strong>Внимание:</strong> Страницата може да не съдържа последните промени.",
+       "readonly": "Базата от данни е заключена",
+       "enterlockreason": "Посочете причина за заключването, като дадете и приблизителна оценка кога базата от данни ще бъде отключена",
+       "readonlytext": "Базата данни е временно заключена за промени — вероятно за рутинна поддръжка, след която ще бъде отново достъпна.\nАдминистраторът, който я е заключил, дава следното обяснение:\n$1",
        "missing-article": "В базата от данни не беше открит текста на страницата „$1“ $2.\n\nТова обикновено се случва при последване на остаряла разликова връзка или връзка към историята на междувременно изтрита страница.\n\nАко все пак случаят не е такъв, причината вероятно е софтуерен бъг.\nМоля, докладвайте на [[Special:ListUsers/sysop|администратор]] за проблема, като предоставите уеб адреса за връзка.",
        "missingarticle-rev": "(версия#: $1)",
        "missingarticle-diff": "(Разлика: $1, $2)",
-       "readonly_lag": "Базата от данни беше автоматично заключена, докато подчинените сървъри успеят да се съгласуват с основния сървър.",
+       "readonly_lag": "Базата от данни беше автоматично заключена, докато подчинените сървъри успеят да се синхронизират с основния сървър.",
        "internalerror": "Вътрешна грешка",
        "internalerror_info": "Вътрешна грешка: $1",
        "internalerror-fatal-exception": "Фатална грешка от тип „$1“",
        "filerenameerror": "Файлът „$1“ не можа да бъде преименуван на „$2“.",
        "filedeleteerror": "Файлът „$1“ не можа да бъде изтрит.",
        "directorycreateerror": "Невъзможно е да бъде създадена директория „$1“.",
-       "directoryreadonlyerror": "Директория \"$1\" е само за четене.",
-       "directorynotreadableerror": "Директория \"$1\" не може да бъде четена.",
+       "directoryreadonlyerror": "Директория „$1“ е само за четене.",
+       "directorynotreadableerror": "Директория „$1“ не може да бъде четена.",
        "filenotfound": "Файлът „$1“ не беше намерен.",
        "unexpected": "Неочаквана стойност: „$1“=„$2“.",
-       "formerror": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¸Ð·Ð¿Ñ\80аÑ\89ане Ð½Ð° Ñ\84оÑ\80мÑ\83лÑ\8fÑ\80а.",
+       "formerror": "Ð\93Ñ\80еÑ\88ка: Ð¤Ð¾Ñ\80мÑ\83лÑ\8fÑ\80Ñ\8aÑ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¸Ð·Ð¿Ñ\80аÑ\82ен.",
        "badarticleerror": "Действието не може да бъде изпълнено на тази страница.",
        "cannotdelete": "Указаната страница или файл \"$1\" не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от някой друг.",
        "cannotdelete-title": "Страницата „$1“ не може да бъде изтрита",
        "perfcachedts": "Данните са складирани и обновени за последно на $1. Най-много {{PLURAL:$4|един резултат е допустим и наличен|$4 резултата са допустими и налични}} в складираното копие.",
        "querypage-no-updates": "Обновяването на тази страница в момента е изключено. Засега данните тук няма да бъдат обновявани.",
        "viewsource": "Преглед на кода",
-       "viewsource-title": "Ð\9fÑ\80еглеждане на кода на $1",
+       "viewsource-title": "Ð\9fÑ\80еглед на кода на $1",
        "actionthrottled": "Ограничение в скоростта",
        "actionthrottledtext": "Като част от защитата против спам, многократното повтаряне на това действие за кратък период от време е ограничено и вие вече сте надвишили лимита. Моля опитайте отново след няколко минути.",
        "protectedpagetext": "Тази страница е защитена, за да се предотвратят редактиране или други действия.",
        "viewsourcetext": "Можете да разгледате и да копирате кодa на страницата.",
        "viewyourtext": "Можете да прегледате и копирате изходния код на <strong>вашите редакции</strong> на тази страница.",
        "protectedinterface": "Тази страница съдържа текст, нужен за работата на системата. Тя е защитена против редактиране, за да се предотвратят възможни злоупотреби.\nЗа извършване на промяна за всички уикита, посетете [https://translatewiki.net/ translatewiki.net], проектът за локализация на MediaWiki.",
-       "editinginterface": "<strong>Внимание:</strong> Редактирате страница, която се използва за текстовия интерфейс на софтуера. Промяната й ще повлияе на външния вид на уикито.",
+       "editinginterface": "<strong>Внимание:</strong> Редактирате страница, която се използва за текстовия интерфейс на софтуера. Промяната ѝ ще повлияе на външния вид на уикито.",
        "translateinterface": "За да добавите или промените преводи за всички уикита, моля, използвайте [https://translatewiki.net/ translatewiki.net], локализиращия проект на МедияУики.",
        "cascadeprotected": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} „каскадна“ защита:\n$2",
        "namespaceprotected": "Нямате права за редактиране на страници в именно пространство '''$1'''.",
        "customcssprotected": "Нямате права за редактиране на тази CSS страница, защото тя съдържа чужди потребителски настройки.",
-       "customjsprotected": "Нямате права за редактиране на тази JavaScript страница, защото тя съдържа чужди потребителски настройки.",
+       "customjsprotected": "Нямате права за редактиране на тази JavaScript страница, тъй като съдържа чужди потребителски настройки.",
        "mycustomcssprotected": "Нямате права за редактиране на тази CSS страница.",
        "mycustomjsprotected": "Нямате права за редактиране на тази JavaScript страница.",
        "myprivateinfoprotected": "Нямате права да редактирате личната си информация.",
        "exception-nologin": "Не сте влезли в системата",
        "exception-nologin-text": "За достъп до избраното действие или страница е необходимо влизане в системата.",
        "exception-nologin-text-manual": "За достъп до избраното действие или страница е необходимо $1 в системата.",
-       "virus-badscanner": "Лоша конфигурация: непознат скенер за вируси: ''$1''",
-       "virus-scanfailed": "сканирането не сполучи (код $1)",
+       "virus-badscanner": "Лоша конфигурация: непознат скенер за вируси: <em>$1</em>",
+       "virus-scanfailed": "неуспешно сканиране (код $1)",
        "virus-unknownscanner": "непознат антивирус:",
        "logouttext": "'''Излязохте от системата.'''\n\nОбърнете внимание, че някои страници все още ще се показват така, сякаш сте влезли, докато не изтриете кеша на браузъра.",
        "cannotlogoutnow-title": "Не може да излезете сега.",
        "cannotcreateaccount-title": "Невъзможно е да бъде създадена потребителска сметка",
        "yourdomainname": "Домейн:",
        "password-change-forbidden": "Не можете да променяте пароли в това уики.",
-       "externaldberror": "Ð\98ли Ðµ Ñ\81Ñ\82анала грешка в базата от данни при външното удостоверяване, или не ви е позволено да обновявате външната си сметка.",
+       "externaldberror": "Ð\92Ñ\8aзникна грешка в базата от данни при външното удостоверяване, или не ви е позволено да обновявате външната си сметка.",
        "login": "Влизане",
        "login-security": "Потвърдете идентичността си",
        "nav-login-createaccount": "Регистриране или влизане",
-       "userlogin": "Влизане / създаване на сметка",
-       "userloginnocreate": "Влизане",
        "logout": "Излизане",
        "userlogout": "Излизане",
        "notloggedin": "Не сте влезли в системата",
        "userlogin-noaccount": "Нямате сметка?",
        "userlogin-joinproject": "Присъединяване към {{SITENAME}}",
-       "nologin": "Нямате потребителско име? $1.",
-       "nologinlink": "Създаване на сметка",
        "createaccount": "Регистриране",
-       "gotaccount": "Имате ли вече сметка? '''$1'''.",
-       "gotaccountlink": "Влизане",
-       "userlogin-resetlink": "Забравени данни за влизане в системата?",
        "userlogin-resetpassword-link": "Забравена парола?",
        "userlogin-helplink2": "Помощ за влизане",
        "userlogin-loggedin": "Вече сте влезли в системата като {{GENDER:$1|$1}}.\nЧрез формуляра по-долу можете да влезете като друг потребител.",
+       "userlogin-reauth": "Трябва да влезете отново, за да потвърдите, че сте {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Създаване на друга сметка",
        "createacct-emailrequired": "Адрес за електронна поща",
        "createacct-emailoptional": "Адрес за електронна поща (незадължително)",
        "createacct-another-email-ph": "Въведете електронна поща",
        "createaccountmail": "Използване на случайна временна парола, която се изпраща на електронната поща, посочена по-долу",
        "createacct-realname": "Истинско име (незадължително)",
-       "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Защо създавате друга сметка",
        "createacct-submit": "Създаване на сметката",
        "throttled-mailpassword": "Функцията за напомняне на паролата е използвана през {{PLURAL:$1|последния един час|последните $1 часа}}.\nЗа предотвратяване на злоупотреби е разрешено да се изпраща не повече от едно напомняне в рамките на {{PLURAL:$1|един час|$1 часа}}.",
        "mailerror": "Грешка при изпращане на писмо: $1",
        "acct_creation_throttle_hit": "През последните $2, през този IP-адрес посетители на това уики са създали {{PLURAL:$1|1 сметка |$1 сметки}}, което е максималният допустим брой за този период.\nВ резултат, към момента не могат да създават повече потребителски сметки през този IP-адрес.",
-       "emailauthenticated": "Ð\90дÑ\80еÑ\81Ñ\8aÑ\82 Ð½Ð° ÐµÐ»ÐµÐºÑ\82Ñ\80оннаÑ\82а Ð²Ð¸ Ð¿Ð¾Ñ\89а Ð±ÐµÑ\88е потвърден на $2 в $3.",
+       "emailauthenticated": "Ð\90дÑ\80еÑ\81Ñ\8aÑ\82 Ð½Ð° ÐµÐ»ÐµÐºÑ\82Ñ\80оннаÑ\82а Ð¿Ð¾Ñ\89а e потвърден на $2 в $3.",
        "emailnotauthenticated": "Адресът на електронната ви поща все още не е потвърден.\nНяма да получавате писма за никоя от следните възможности.",
        "noemailprefs": "За да работят тези функционалности, трябва да посочите адрес на електронна поща в своите настройки.",
        "emailconfirmlink": "Потвърждаване на адреса за електронна поща",
        "accountcreated": "Потребителската сметка беше създадена",
        "accountcreatedtext": "Потребителската сметка [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|беседа]]) беше създадена.",
        "createaccount-title": "Създаване на сметка за {{SITENAME}}",
-       "createaccount-text": "Някой е създал сметка за $2 в {{SITENAME}} ($4) и е посочил този адрес за електронна поща. Паролата за „$2“ е „$3“. Необходимо е да влезете в системата и да смените паролата си.\n\nМожете да пренебрегнете това съобщение, ако сметката е създадена по грешка.",
+       "createaccount-text": "Ð\9dÑ\8fкой Ðµ Ñ\81Ñ\8aздал Ñ\81меÑ\82ка Ð·Ð° $2 Ð² {{SITENAME}} ($4) Ð¸ Ðµ Ð¿Ð¾Ñ\81оÑ\87ил Ñ\82ози Ð°Ð´Ñ\80еÑ\81 Ð·Ð° ÐµÐ»ÐµÐºÑ\82Ñ\80онна Ð¿Ð¾Ñ\89а. Ð\9fаÑ\80олаÑ\82а Ð·Ð° â\80\9e$2â\80\9c Ðµ â\80\9e$3â\80\9c. Ð\9dеобÑ\85одимо Ðµ Ð´Ð° Ð²Ð»ÐµÐ·ÐµÑ\82е Ð² Ñ\81иÑ\81Ñ\82емаÑ\82а Ð¸ Ð´Ð° Ñ\81мениÑ\82е Ð¿Ð°Ñ\80олаÑ\82а Ñ\81и.\n\nÐ\9cожеÑ\82е Ð´Ð° Ð¿Ñ\80енебÑ\80егнеÑ\82е Ñ\82ова Ñ\81Ñ\8aобÑ\89ение, Ð°ÐºÐ¾ Ñ\81меÑ\82каÑ\82а Ðµ Ñ\81Ñ\8aздадена Ð¿Ð¾ Ð¿Ð¾Ð³Ñ\80еÑ\88ка.",
        "login-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
        "login-abort-generic": "Влизането беше неуспешно - Прекратено",
        "login-migrated-generic": "Вашата сметка е бил преместена и потребителското Ви име вече не съществува в това уики.",
        "loginlanguagelabel": "Език: $1",
        "suspicious-userlogout": "Заявката ви за излизане от системата беше отхвърлена, тъй като изглежда е била изпратена погрешка от браузъра или кеширащото прокси.",
-       "createacct-another-realname-tip": "Ð\98Ñ\81Ñ\82инÑ\81коÑ\82о Ð¸Ð¼Ðµ Ðµ Ð½ÐµÐ·Ð°Ð´Ñ\8aлжиÑ\82елно.\nÐ\92 Ñ\81лÑ\83Ñ\87ай, Ñ\87е Ð±Ñ\8aде Ð¸Ð·Ð±Ñ\80або Ð´Ð° Ñ\81е Ð¿Ð¾Ð¿Ñ\8aлни, ще бъде използвано за да му се приписват приносите в уикито.",
+       "createacct-another-realname-tip": "Ð\98Ñ\81Ñ\82инÑ\81коÑ\82о Ð¸Ð¼Ðµ Ðµ Ð½ÐµÐ·Ð°Ð´Ñ\8aлжиÑ\82елно.\nÐ\92 Ñ\81лÑ\83Ñ\87ай, Ñ\87е Ð±Ñ\8aде Ð¸Ð·Ð±Ñ\80ано Ð´Ð° Ñ\81е Ð¿Ð¾Ð¿Ñ\8aлни, Ñ\82о ще бъде използвано за да му се приписват приносите в уикито.",
        "pt-login": "Влизане",
        "pt-login-button": "Влизане",
        "pt-createaccount": "Създаване на сметка",
        "pt-userlogout": "Излизане",
-       "php-mail-error-unknown": "Неизвестна грешка в mail() функцията на PHP",
+       "php-mail-error-unknown": "Неразпозната грешка във функция mail() на PHP.",
        "user-mail-no-addy": "Опитвате се да изпратите е-писмо без да е посочен адрес за електронна поща.",
        "user-mail-no-body": "Опитвате се да изпратите е-писмо с празно или изключително кратко съдържание.",
        "changepassword": "Смяна на парола",
        "oldpassword": "Стара парола:",
        "newpassword": "Нова парола:",
        "retypenew": "Повтори новата парола:",
-       "resetpass_submit": "Ð\98збиÑ\80ане на парола и влизане",
+       "resetpass_submit": "УÑ\81Ñ\82ановÑ\8fване на парола и влизане",
        "changepassword-success": "Паролата беше променена успешно!",
        "changepassword-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
-       "botpasswords-createnew": "Създаване на нова бот парола",
+       "botpasswords": "Пароли за ботове",
+       "botpasswords-createnew": "Създаване на нова парола за бота",
        "botpasswords-editexisting": "Редактиране на съществуваща бот парола",
        "botpasswords-label-appid": "Име на бота:",
        "botpasswords-label-create": "Създаване",
        "botpasswords-deleted-body": "Паролата на бот „$1“ на потребител „$2“ е премахната.",
        "resetpass_forbidden": "Не е разрешена смяна на паролата",
        "resetpass_forbidden-reason": "Паролите не могат да се променят: $1",
-       "resetpass-no-info": "Ð\97а Ð´Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aпваÑ\82е Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а Ð´Ð¸Ñ\80екÑ\82но, Ð½ÐµÐ¾Ð±Ñ\85одимо Ðµ да влезете в системата.",
+       "resetpass-no-info": "Ð\97а Ð´Ð° Ð¸Ð¼Ð°Ñ\82е Ð´Ð¸Ñ\80екÑ\82ен Ð´Ð¾Ñ\81Ñ\82Ñ\8aп Ð´Ð¾ Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо да влезете в системата.",
        "resetpass-submit-loggedin": "Промяна на паролата",
        "resetpass-submit-cancel": "Отказ",
        "resetpass-wrong-oldpass": "Невалидна временна или текуща парола.\nВъзможно е вече да сте сменили паролата си или да сте поискали нова временна парола.",
        "passwordreset-invalidemail": "Неправилен email адрес",
        "changeemail": "Промяна или премахване на адреса за е-поща",
        "changeemail-header": "Попълнете формуляра, за да промените адреса на електронната си поща. Ако искате да премахнете адреса на електронната си поща, при попълване на формуляра оставете полето за новия адрес празно.",
-       "changeemail-no-info": "Ð\97а Ð´Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aпваÑ\82е Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а Ð´Ð¸Ñ\80екÑ\82но, Ð½ÐµÐ¾Ð±Ñ\85одимо Ðµ да влезете в системата.",
+       "changeemail-no-info": "Ð\97а Ð´Ð° Ð¸Ð¼Ð°Ñ\82е Ð´Ð¸Ñ\80екÑ\82ен Ð´Ð¾Ñ\81Ñ\82Ñ\8aп Ð´Ð¾ Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а Ð´Ð¸Ñ\80екÑ\82но Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо да влезете в системата.",
        "changeemail-oldemail": "Текущ адрес за е-поща:",
        "changeemail-newemail": "Нов адрес за е-поща:",
        "changeemail-none": "(няма)",
        "changeemail-throttled": "Направили сте твърде много опити за влизане в системата. \nМоля, изчакайте $1 преди следващия опит.",
        "changeemail-nochange": "Моля, въведете различен нов адрес на електронна поща.",
        "resettokens": "Изчистване на маркерите",
+       "resettokens-text": "Можете да изчистите маркерите, които позволяват достъп до някои лични данни, свързани с вашия акаунт тук.\n\nТрябва да го направите, ако случайно сте ги споделили с някого или ако профилът ви е бил изложен на риск.",
        "resettokens-no-tokens": "Няма маркери за изчистване.",
        "resettokens-tokens": "Маркери:",
        "resettokens-token-label": "$1 (текуща стойност: $2)",
        "extlink_sample": "http://www.example.com Текст на външната препратка",
        "extlink_tip": "Външна препратка (не забравяйте http:// отпред)",
        "headline_sample": "Заглавие на раздел",
-       "headline_tip": "Заглавие",
+       "headline_tip": "Заглавие от 2-ро ниво",
        "nowiki_sample": "Тук въведете текст",
        "nowiki_tip": "Пренебрегване на форматиращите команди",
        "image_sample": "Пример.jpg",
        "preview": "Предварителен преглед",
        "showpreview": "Предварителен преглед",
        "showdiff": "Показване на промените",
-       "blankarticle": "<strong>Предупреждение:</strong> Статията, която създавате е празна.\nАко щракнете на „\"{{int:savearticle}}“ отново, статията ще бъде създадена без никакво съдържание.",
+       "blankarticle": "<strong>Предупреждение:</strong> Статията, която създавате е празна.\nАко щракнете на „$1“ отново, статията ще бъде създадена без никакво съдържание.",
        "anoneditwarning": "<strong>Внимание:</strong> Не сте влезли в системата. Ако направите редакция IP-адресът Ви ще бъде публично видим. Ако <strong>[$1 влезете]</strong> или си <strong>[$2 създадете акаунт]</strong>, редакциите Ви ще бъдат свързани с потребителското Ви име, заедно с други преимущества.",
        "anonpreviewwarning": "Внимание: Не сте влезли в системата. Ако съхраните редакцията си, тя ще бъде записана в историята на страницата с вашият IP-адрес.",
        "missingsummary": "'''Напомняне:''' Не е въведено кратко описание на промените. При повторно натискане на бутона „Съхраняване“, редакцията ще бъде съхранена без резюме.",
        "missingcommenttext": "По-долу въведете вашето съобщение.",
-       "missingcommentheader": "<strong>Напомняне:</strong> Не е въведено заглавие на коментара.\nПри повторно натискане на \"{{int:savearticle}}\", редакцията ще бъде записана без такова.",
+       "missingcommentheader": "<strong>Напомняне:</strong> Не е въведено заглавие на коментара.\nПри повторно натискане на „$1“, редакцията ще бъде записана без коментар.",
        "summary-preview": "Предварителен преглед на резюмето:",
        "subject-preview": "Предварителен преглед на заглавието:",
        "previewerrortext": "Възникна грешка при опита за преглед на промените.",
        "newarticletext": "Последвахте препратка към страница, която все още не съществува.\nЗа да я създадете, просто започнете да пишете в долната текстова кутия\n(вижте [$1 помощната страница] за повече информация).",
        "anontalkpagetext": "----\n<em>Това е дискусионната страница на анонимен потребител, който все още няма регистрирана сметка или не я използва</em>\nЗатова се налага да използваме IP-адрес, за да го идентифицираме.\nТакъв адрес може да се споделя от няколко потребители.\nАко сте анонимен потребител и мислите, че тези неуместни коментари са отправени към вас, [[Special:CreateAccount|регистрирайте се]] или [[Special:UserLogin|влезте в системата]], за да избегнете евентуално бъдещо объркване с други анонимни потребители.",
        "noarticletext": "Понастоящем няма текст на тази страница. Можете да [[Special:Search/{{PAGENAME}}|потърсите за заглавието на страницата]] в други страници, да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} да я създадете]</span>.",
-       "noarticletext-nopermission": "ТекÑ\83Ñ\89о в тази страница няма текст.\nМожете да [[Special:Search/{{PAGENAME}}|потърсите заглавието на тази страница ]] в други страници или да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници]</span>, но нямате права да създадете тази страница.",
+       "noarticletext-nopermission": "Ð\9fонаÑ\81Ñ\82оÑ\8fÑ\89ем в тази страница няма текст.\nМожете да [[Special:Search/{{PAGENAME}}|потърсите заглавието на тази страница ]] в други страници или да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници]</span>, но нямате права да създадете тази страница.",
        "missing-revision": "Версия #$1 на страницата „{{FULLPAGENAME}}“ не съществува.\n\nТова обикновено се дължи на препратка от историята на страницата, която е била изтрита.\nПодробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
-       "userpage-userdoesnotexist": "Няма регистрирана потребителска сметка за „<nowiki>$1</nowiki>“. Изисква се потвърждение, че желаете да създадете/редактирате тази страница?",
+       "userpage-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.\nМоля потвърдете, че желаете да създадете/редактирате тази страница.",
        "userpage-userdoesnotexist-view": "Не е регистрирана потребителска сметка на име „$1“.",
        "blocked-notice-logextract": "В момента този потребител е блокиран.\nПо-долу за справка е показан последният запис от Дневника на блокиранията:",
        "clearyourcache": "<strong>Забележка:</strong> За да се видят промените, необходимо е след съхраняване на страницата, кешът на браузъра да бъде изтрит.\n* <strong>Firefox / Safari:</strong> Задържа се клавиш <em>Shift</em> и се щраква върху <em>Презареждане</em> (<em>Reload</em>) или чрез клавишната комбинация <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> за Mac);\n* <strong>Google Chrome:</strong> клавишна комбинация <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> за Mac)\n* <strong>Internet Explorer:</strong> Задържа се клавиш <em>Ctrl</em> и се щраква върху <em>Refresh</em> или чрез клавишната комбинация <em>Ctrl-F5</em>;\n* <strong>Opera:</strong> кешът се изчиства през менюто <em>Tools → Settings</em> (<em>Opera → Preferences</em> за Mac) след което <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "sitejspreview": "'''Не забравяйте, че това е само предварителен преглед на този Джаваскрипт код.'''\n'''Той все още не е съхранен!'''",
        "userinvalidcssjstitle": "'''Внимание:''' Не съществува облик „$1“. Необходимо е да се знае, че имената на потребителските ви страници за CSS и Джаваскрипт трябва да се състоят от малки букви, например: „{{ns:user}}:Иван/vector.css“ (а не „{{ns:user}}:Иван/Vector.css“).",
        "updated": "(обновена)",
-       "note": "'''Забележка:'''",
+       "note": "<strong>Забележка:</strong>",
        "previewnote": "<strong>Обърнете внимание, че това е само предварителен преглед.</strong>\nПромените все още не са съхранени!",
        "continue-editing": "Продължаване към полето за редактиране",
        "previewconflict": "Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.",
        "session_fail_preview": "За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия.\n\nМоже би сте излезли от системата. <strong>Моля, уверете се, че сте влезли в профила си и опитайте отново.</strong>\nАко все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново, също така проверете дали браузърът ви позволява бисквитки от този сайт.",
-       "session_fail_preview_html": "Ð\97а Ñ\81Ñ\8aжаление Ñ\80едакÑ\86иÑ\8fÑ\82а Ð²Ð¸ Ð½Ðµ Ð±ÐµÑ\88е Ð·Ð°Ð¿Ð¸Ñ\81ана Ð¿Ð¾Ñ\80ади Ð¸Ð·Ñ\82иÑ\87анеÑ\82о Ð½Ð° Ñ\81еÑ\81иÑ\8fÑ\82а Ð²Ð¸.\n\n<em>Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез JavaScript.</em>\n\n<strong>Ако това е обикновен опит за редактиране, моля опитайте отново.</strong>\nАко все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново, и се уверете, че браузъра ви приема бисквитки от този сайт.",
-       "token_suffix_mismatch": "'''Редакцията ви беше отхвърлена, защото браузърът ви е развалил пунктуационните знаци в редакционната отметка. Евентуалното съхранение би унищожило съдържанието на страницата. Понякога това се случва при използването на грешно работещи анонимни междинни сървъри.'''",
-       "edit_form_incomplete": "'''Някои части от формуляра за редактиране не достигнаха до сървъра; проверете дали редакциите ви са непокътнати и опитайте отново.'''",
+       "session_fail_preview_html": "Ð\97а Ñ\81Ñ\8aжаление Ñ\80едакÑ\86иÑ\8fÑ\82а Ð²Ð¸ Ð½Ðµ Ð±ÐµÑ\88е Ð·Ð°Ð¿Ð¸Ñ\81ана Ð¿Ð¾Ñ\80ади Ð·Ð°Ð³Ñ\83ба Ð½Ð° Ð´Ð°Ð½Ð½Ð¸Ñ\82е Ð·Ð° Ñ\82екÑ\83Ñ\89аÑ\82а Ñ\81еÑ\81иÑ\8f.\n\n<em>Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез JavaScript.</em>\n\n<strong>Ако това е обикновен опит за редактиране, моля опитайте отново.</strong>\nАко все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново, и се уверете, че браузъра ви приема бисквитки от този сайт.",
+       "token_suffix_mismatch": "<strong>Редакцията ви беше отхвърлена, защото браузърът ви е развалил пунктуационните знаци в редакционната отметка.</strong>\nРедакцията беше отхвърлена с цел предотвратяване унищожаването на текста на страницата. \nПонякога това се случва при използването на грешно работещи анонимни междинни сървъри.",
+       "edit_form_incomplete": "<strong>Някои части от формуляра за редактиране не достигнаха до сървъра; проверете дали редакциите ви са непокътнати и опитайте отново.</strong>",
        "editing": "Редактиране на „$1“",
        "creating": "Създаване на $1",
        "editingsection": "Редактиране на „$1“ (раздел)",
        "editingcomment": "Редактиране на „$1“ (нов раздел)",
        "editconflict": "Различна редакция: $1",
-       "explainconflict": "Някой друг вече е променил тази страница, откакто започнахте да я редактирате.\nГорната текстова кутия съдържа текущия текст на страницата без вашите промени, които са показани в долната кутия.\nЗа да бъдат и те съхранени, е необходимо ръчно да ги преместите в горното поле, тъй като '''единствено''' текстът в него ще бъде съхранен при натискането на бутона „{{int:savearticle}}“.",
+       "explainconflict": "Някой друг вече е променил тази страница, откакто започнахте да я редактирате.\nГорната текстова кутия съдържа текущия текст на страницата без вашите промени, които са показани в долната кутия.\nЗа да бъдат и те съхранени, е необходимо ръчно да ги преместите в горното поле, тъй като <strong>единствено</strong> текстът в него ще бъде съхранен при натискането на бутона „$1“.",
        "yourtext": "Вашият текст",
        "storedversion": "Съхранена версия",
        "nonunicodebrowser": "'''ВНИМАНИЕ: Браузърът ви не поддържа Уникод. За да можете спокойно да редактирате страници, всички знаци, невключени в ASCII-таблицата, ще бъдат заменени с шестнадесетични кодове.'''",
-       "editingold": "'''ВНИМАНИЕ: Редактирате остаряла версия на страницата.\nАко съхраните, всякакви промени, направени след тази версия, ще бъдат изгубени.'''",
+       "editingold": "<strong>Внимание: Редактирате остаряла версия на страницата.</strong>\nАко я съхраните, всякакви промени, направени след тази версия, ще бъдат изгубени.",
        "yourdiff": "Разлики",
        "copyrightwarning": "Обърнете внимание, че всички приноси към {{SITENAME}} се публикуват при условията на $2 (за подробности вижте $1).\nАко не сте съгласни вашата писмена работа да бъде променяна и разпространявана без ограничения, не я публикувайте.<br />\n\nСъщо потвърждавате, че '''вие''' сте написали материала или сте използвали '''свободни ресурси''' — <em>обществено достояние</em> или друг свободен източник.\nАко сте ползвали чужди материали, за които имате разрешение, непременно посочете източника.\n\n<div style=\"font-variant:small-caps\">'''Не публикувайте произведения с авторски права без разрешение!'''</div>",
        "copyrightwarning2": "Обърнете внимание, че всички приноси към {{SITENAME}} могат да бъдат редактирани, променяни или премахвани от останалите сътрудници.\nАко не сте съгласни вашата писмена работа да бъде променяна без ограничения, не я публикувайте.<br />\nСъщо потвърждавате, че '''вие''' сте написали материала или сте използвали '''свободни ресурси''' — <em>обществено достояние</em> или друг свободен източник (за подробности вижте $1).\nАко сте ползвали чужди материали, за които имате разрешение, непременно посочете източника.\n\n<div style=\"font-variant:small-caps\">'''Не публикувайте произведения с авторски права без разрешение!'''</div>",
-       "longpageerror": "'''ГРЕШКА: Изпратеният текст е с големина {{PLURAL:$1|един килобайт|$1 килобайта}}, което надвишава позволения максимум от {{PLURAL:$2|един килобайт|$2 килобайта}}.'''\nПоради тази причина той не може да бъде съхранен.",
+       "longpageerror": "<strong>Грешка: Изпратеният текст е с големина {{PLURAL:$1|един килобайт|$1 килобайта}}, което надвишава позволения максимум от {{PLURAL:$2|един килобайт|$2 килобайта}}.</strong>\nПоради тази причина той не може да бъде съхранен.",
        "readonlywarning": "<strong>ВНИМАНИЕ: Базата данни беше затворена за поддръжка, затова в момента промените няма да могат да бъдат съхранени.</strong>\n\nАко желаете, можете да съхраните страницата като текстов файл и да се опитате да я публикувате по-късно.\n\nСистемният администратор, който е затворил базата данни, е посочил следната причина: $1",
        "protectedpagewarning": "'''Внимание: Страницата е защитена и само потребители със статут на администратори могат да я редактират.'''\nЗа справка по-долу е показан последният запис от дневниците.",
        "semiprotectedpagewarning": "'''Забележка:''' Тази страница е защитена и само регистрирани потребители могат да я редактират.\nЗа справка по-долу е показан последният запис от дневниците.",
-       "cascadeprotectedwarning": "<strong>Внимание:</strong> Страницата е защитена, като само потребители с администраторски права могат да я редактират. Тя е включена в {{PLURAL:$1|следната страница|следните страници}} с каскадна защита:",
-       "titleprotectedwarning": "'''Внимание: Тази страница е защитена и са необходими [[Special:ListGroupRights|специални права]], за да бъде създадена.'''\nЗа справка по-долу е показан последният запис от дневниците.",
+       "cascadeprotectedwarning": "<strong>Внимание:</strong> Страницата е защитена, като само потребители със [[Special:ListGroupRights|нужните права]] могат да я редактират, тъй като е включена в {{PLURAL:$1|следната страница|следните страници}} с каскадна защита:",
+       "titleprotectedwarning": "<strong>Внимание: Тази страница е защитена и са необходими [[Special:ListGroupRights|специални права]], за да бъде създадена.</strong>\nЗа справка по-долу е показан последният запис от дневниците.",
        "templatesused": "{{PLURAL:$1|Шаблон, използван|Шаблони, използвани}} на страницата:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон, използван|Шаблони, използвани}} в предварителния преглед:",
        "templatesusedsection": "{{PLURAL:$1|Шаблон, използван|Шаблони, използвани}} в този раздел:",
        "log-fulllog": "Преглеждане на пълния дневник",
        "edit-hook-aborted": "Редакцията беше прекъсната от кука.\nНе беше посочена причина за това.",
        "edit-gone-missing": "Страницата не можа да се обнови.\nВероятно междувременно е била изтрита.",
-       "edit-conflict": "РазлиÑ\87на Ñ\80едакÑ\86иÑ\8f",
+       "edit-conflict": "Ð\9aонÑ\84ликÑ\82 Ð¿Ñ\80и Ñ\80едакÑ\82иÑ\80анеÑ\82о.",
        "edit-no-change": "Редакцията ви беше пренебрегната, защото не съдържа промени по текста.",
        "postedit-confirmation-created": "Страницата е създадена.",
        "postedit-confirmation-restored": "Страницата е възстановена.",
        "content-failed-to-parse": "Неуспех при анализиране на съдържанието от тип $2 за модела $1: $3",
        "invalid-content-data": "Невалидни данни за съдържание",
        "content-not-allowed-here": "\nНа страницата [[$2]] не е позволено използването на $1",
-       "editwarning-warning": "Ако излезете от тази страница, може да загубите всички несъхранени промени, които сте направили. \nАко сте влезли в системата, можете да изключите това предупреждение чрез менюто \"Редактиране\" в личните ви настройки.",
+       "editwarning-warning": "Ако излезете от тази страница, може да загубите всички несъхранени промени, които сте направили.\nАко сте влезли в системата, можете да изключите това предупреждение чрез менюто „{{int:prefs-editing}}“ в личните ви настройки.",
+       "editpage-invalidcontentmodel-title": "Форматът на съдържанието не се поддържа",
        "editpage-notsupportedcontentformat-title": "Форматът на съдържанието не се поддържа",
        "content-model-wikitext": "уикитекст",
        "content-model-text": "обикновен текст",
        "content-model-css": "CSS",
        "content-json-empty-object": "Празен обект",
        "content-json-empty-array": "Празен масив",
-       "duplicate-args-category": "СÑ\82Ñ\80аниÑ\86и, ÐºÐ¾Ð¸Ñ\82о Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82 Ð¿Ð¾Ð²Ñ\82аÑ\80Ñ\8fÑ\89и Ñ\81е Ð°Ñ\80гÑ\83менÑ\82и Ð² Ð¿Ð¾викванията на шаблона",
-       "duplicate-args-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ñ\81Ñ\8aдÑ\8aÑ\80жа Ñ\88аблонни Ð¿Ð¾Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ\8f, ÐºÐ¾Ð¸Ñ\82о Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82 Ð¿Ð¾Ð²Ñ\82аÑ\80Ñ\8fÑ\89и Ñ\81е Ð°Ñ\80гÑ\83менÑ\82и, ÐºÐ°Ñ\82о Ð½Ð°Ð¿Ñ\80имеÑ\80 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
-       "expensive-parserfunction-warning": "Внимание: Тази страница прекалено много пъти използва ресурсоемки парсерни функции.\n\nВ момента има {{PLURAL:$1|$1 обръщение|$1 обръщения}} към такива функции, а трябва да {{PLURAL:$1|е|са}} по-малко от $2.",
-       "expensive-parserfunction-category": "СÑ\82Ñ\80аниÑ\86и, ÐºÐ¾Ð¸Ñ\82о Ð¿Ñ\80екалено Ð¼Ð½Ð¾Ð³Ð¾ Ð¿Ñ\8aÑ\82и Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81оемки Ð¿Ð°Ñ\80Ñ\81еÑ\80ни функции",
-       "post-expand-template-inclusion-warning": "Внимание: Размерът за включване на този шаблон е твърде голям.\nНякои шаблони няма да бъдат включени.",
-       "post-expand-template-inclusion-category": "Страници, съдържащи шаблони с превишени размери на включеното съдържание",
-       "post-expand-template-argument-warning": "Внимание: Тази страница съдържа поне един аргумент на шаблон, който има твърде голям размер при разгръщане. Тези аргументи бяха пропуснати.",
+       "duplicate-args-category": "СÑ\82Ñ\80аниÑ\86и, ÐºÐ¾Ð¸Ñ\82о Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82 Ð¿Ð¾Ð²Ñ\82аÑ\80Ñ\8fÑ\89и Ñ\81е Ð°Ñ\80гÑ\83менÑ\82и Ð² Ð¸Ð·викванията на шаблона",
+       "duplicate-args-category-desc": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ñ\81Ñ\8aдÑ\8aÑ\80жа Ñ\88аблонни Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ\8f, ÐºÐ¾Ð¸Ñ\82о Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82 Ð¿Ð¾Ð²Ñ\82аÑ\80Ñ\8fÑ\89и Ñ\81е Ð°Ñ\80гÑ\83менÑ\82и, ÐºÐ°Ñ\82о Ð½Ð°Ð¿Ñ\80имеÑ\80 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> Ð¸Ð»Ð¸ <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "<strong>Внимание:</strong> Тази страница прави твърде много ресурсоемки извиквания на анализиращи функции.\n\nВ момента има {{PLURAL:$1|$1 обръщение|$1 обръщения}} към такива функции, а трябва да {{PLURAL:$1|е|са}} по-малко от $2.",
+       "expensive-parserfunction-category": "СÑ\82Ñ\80аниÑ\86и, ÐºÐ¾Ð¸Ñ\82о Ð¿Ñ\80екалено Ð¼Ð½Ð¾Ð³Ð¾ Ð¿Ñ\8aÑ\82и Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ\82 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81оемки Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ\80аÑ\89и функции",
+       "post-expand-template-inclusion-warning": "<strong>Внимание:</strong> Размерът за включване на този шаблон е твърде голям.\nНякои шаблони няма да бъдат включени.",
+       "post-expand-template-inclusion-category": "Страници с превишен допустим размер на включените шаблони",
+       "post-expand-template-argument-warning": "<strong>Внимание:</strong> Тази страница съдържа поне един аргумент на шаблон, който има твърде голям размер при разгръщане.\nТези аргументи бяха пропуснати.",
        "post-expand-template-argument-category": "Страници, съдържащи шаблони с пропуснати аргументи",
        "parser-template-loop-warning": "Открито зацикляне на шаблон: [[$1]]",
+       "template-loop-category": "Страници със зацикляне в шаблона",
+       "template-loop-category-desc": "Тази страница съдържа зацикляне в шаблона, т.е. шаблон, който рекурсивно се самоизвиква.",
        "parser-template-recursion-depth-warning": "Надвишен лимит на дълбочината при шаблонна рекурсия ($1)",
        "language-converter-depth-warning": "Надвишени са възможностите за автоматичен превод ($1)",
        "node-count-exceeded-category": "Страници, където е превишен възел-граф",
        "node-count-exceeded-category-desc": "Страницата превишава максималния възел-граф.",
-       "node-count-exceeded-warning": "Страница превиши броя на възлите",
+       "node-count-exceeded-warning": "Страницата превиши броя на възлите",
        "expansion-depth-exceeded-category": "Страници, в които е превишена дълбочината на разгръщане",
        "expansion-depth-exceeded-category-desc": "Страницата превишава максимално допустимата дълбочина на разгръщане.",
        "expansion-depth-exceeded-warning": "Страницата е превишила разрешената дълбочина на разгръщане",
        "parser-unstrip-loop-warning": "Открито е ''unstrip'' зацикляне",
        "parser-unstrip-recursion-limit": "''Unstrip'' лимита на рекурсия превишава ($1)",
-       "undo-success": "Редакцията може да бъде върната. Прегледайте долното сравнение и се уверете, че наистина искате да го направите. След това съхранете страницата, за да извършите връщането.",
+       "undo-success": "Редакцията може да бъде върната.\nПрегледайте долното сравнение и се уверете, че наистина искате да го направите. След това съхранете страницата, за да извършите връщането.",
        "undo-failure": "Редакцията не може да бъде върната поради конфликтни междинни редакции.",
        "undo-norev": "Редакцията не може да бъде върната, тъй като не съществува или е била изтрита.",
        "undo-nochange": "Тази редакция изглежда вече е отменена.",
        "undo-summary": "Премахната редакция $1 на [[Special:Contributions/$2|$2]] ([[User talk:$2|беседа]])",
        "undo-summary-username-hidden": "Отмяна на редакция $1 от скрит потребител",
-       "cantcreateaccount-text": "[[User:$3|Потребител:$3]] е блокирал(а) създаването на сметки от този IP-адрес ('''$1''').\n\nПричината, изложена от $3, е ''$2''",
+       "cantcreateaccount-text": "[[User:$3|Потребител:$3]] е блокирал(а) създаването на сметки от този IP-адрес (<strong>$1</strong>).\n\nПричината, изложена от $3, е <em>$2</em>",
        "viewpagelogs": "Преглед на извършените административни действия по страницата",
        "nohistory": "Няма редакционна история за тази страница.",
        "currentrev": "Текуща версия",
        "revision-info": "Версия от $1 на {{GENDER:$6|$2}}$7",
        "previousrevision": "← По-стара версия",
        "nextrevision": "По-нова версия →",
-       "currentrevisionlink": "Ð\9fÑ\80еглед Ð½Ð° Ñ\82екÑ\83Ñ\89аÑ\82а версия",
+       "currentrevisionlink": "ТекÑ\83Ñ\89а версия",
        "cur": "тек",
        "next": "след",
        "last": "пред",
        "page_first": "първа",
        "page_last": "последна",
-       "histlegend": "<em>Разлики:</em> Изберете версиите, които желаете да сравните, чрез превключвателите срещу тях и натиснете &lt;Enter&gt; или бутона за сравнение.<br />\n<em>Легенда:</em> (<strong>тек</strong>) = разлика с текущата версия, (<strong>пред</strong>) = разлика с предишната версия, <strong>м</strong>&nbsp;=&nbsp;малка промяна",
-       "history-fieldset-title": "ТÑ\8aÑ\80Ñ\81ене Ð² Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а",
-       "history-show-deleted": "Само Ð¸Ð·Ñ\82Ñ\80иÑ\82иÑ\82е",
+       "histlegend": "Разлики: Изберете версиите, които желаете да сравните, чрез превключвателите срещу тях и натиснете Enter или бутона за сравнение.<br />\nЛегенда: <strong>({{int:cur}})</strong> = разлика с текущата версия, <strong>({{int:last}})</strong> = разлика с предишната версия, <strong>{{int:minoreditletter}}</strong> = малка промяна.",
+       "history-fieldset-title": "ТÑ\8aÑ\80Ñ\81ене Ð½Ð° Ð²ÐµÑ\80Ñ\81ии",
+       "history-show-deleted": "Само Ð·Ð° Ð¸Ð·Ñ\82Ñ\80иване Ð½Ð° Ð²ÐµÑ\80Ñ\81ии",
        "histfirst": "най-стари",
        "histlast": "най-нови",
        "historysize": "({{PLURAL:$1|1 байт|$1 байта}})",
        "history-feed-title": "Редакционна история",
        "history-feed-description": "Редакционна история на страницата в {{SITENAME}}",
        "history-feed-item-nocomment": "$1 в $2",
-       "history-feed-empty": "Исканата страница не съществува — може да е била изтрита или преименувана. Опитайте да [[Special:Search|потърсите]] нови страници, които биха могли да са ви полезни.",
+       "history-feed-empty": "Исканата страница не съществува.\nМоже да е била изтрита или преименувана.\nОпитайте да [[Special:Search|потърсите]] нови страници, които биха могли да са ви полезни.",
        "history-edit-tags": "Редактиране етикетите на избраните редакции",
        "rev-deleted-comment": "(резюмето е премахнато)",
        "rev-deleted-user": "(името на автора е изтрито)",
        "rev-deleted-event": "(записът е изтрит)",
        "rev-deleted-user-contribs": "[потребителското име или IP адрес са премахнати - редакцията е скрита от приносите]",
        "rev-deleted-text-permission": "Тази версия на страницата е била '''изтрита'''.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Дневника на изтриванията].",
+       "rev-suppressed-text-permission": "Тази редация на страницата е била <strong>прикрита</strong>.\nДопълнителна информация може да се съдържа в [{{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-suppressed-text-unhide": "Тази версия на страницата е била <strong>прикрита</strong>.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Дневника на прикриванията].\nМожете да [$1 прегледате версията], ако желаете да продължите.",
        "rev-deleted-text-view": "Тази редация на страницата е била '''изтрита'''.\nКато администратор на сайта, вие можете да я прегледате.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Дневника на изтриванията].",
-       "rev-suppressed-text-view": "Тази редация на страницата е била '''прикрита'''.\nКато администратор на сайта, вие можете да я прегледате.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Дневника на прикриванията].",
+       "rev-suppressed-text-view": "Тази редакция на страницата е била <strong>прикрита</strong>.\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 прегледате разликовата препратка], ако желаете.",
        "revdelete-show-file-confirm": "Необходимо е потвърждение, че желаете да прегледате изтритата версия на файла „<nowiki>$1</nowiki>“ от $2 $3.",
        "revdelete-show-file-submit": "Да",
        "revdelete-selected-text": "{{PLURAL:$1|Избрана версия|Избрани версии}} от [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Избрана версия|Избрани версии}} на файл от [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Избрано събитие|Избрани събития}}:",
        "revdelete-text-text": "Изтритите редакции ще продължат да се виждат в историята на страницата, но части от съдържанието ще бъдат публично недостъпни.",
        "revdelete-text-file": "Изтритите файлови редакции ще продължат да се виждат в историята на страницата, но части от съдържанието им ще бъдат публично недостъпни.",
        "mergehistory-empty": "Няма редакции, които могат да бъдат слети.",
        "mergehistory-done": "$3 {{PLURAL:$3|версия|версии}} от $1 {{PLURAL:$3|беше успешно слята|бяха успешно слети}} с редакционната история на [[:$2]].",
        "mergehistory-fail": "Невъзможно е да се извърши сливане на редакционните истории; проверете страницата и времевите параметри.",
+       "mergehistory-fail-bad-timestamp": "Времевата отметка е невалидна.",
        "mergehistory-fail-invalid-source": "Изходната страница е невалидна.",
        "mergehistory-fail-invalid-dest": "Целевата страница е невалидна.",
        "mergehistory-fail-permission": "Нямате права за обединяване на историята.",
        "search-section": "(раздел $1)",
        "search-category": "(категория $1)",
        "search-suggest": "Вероятно имахте предвид: $1",
-       "search-interwiki-caption": "Сродни проекти",
+       "search-rewritten": "Показани са резултати за $1. Вместо това търсете $2.",
+       "search-interwiki-caption": "Резултати от сродни проекти",
        "search-interwiki-default": "Резултати от $1:",
        "search-interwiki-more": "(още)",
        "search-interwiki-more-results": "повече резултати",
        "searchrelated": "свързани",
        "searchall": "всички",
        "showingresults": "Показване на до {{PLURAL:$1|'''1''' резултат|'''$1''' резултата}}, като се започва от номер '''$2'''.",
+       "showingresultsinrange": "Показване на до {{PLURAL:$1|<strong>1</strong> резултат|<strong>$1</strong> резултата}} в диапазона от #<strong>$2</strong> до #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Резултат <strong>$1</strong> от <strong>$3</strong>|Резултати <strong>$1 - $2</strong> от <strong>$3</strong>}}",
        "search-nonefound": "Няма резултати, които да отговарят на заявката.",
+       "search-nonefound-thiswiki": "Няма резултати, които да отговарят на заявката на този сайт.",
        "powersearch-legend": "Разширено търсене",
        "powersearch-ns": "Търсене в именни пространства:",
        "powersearch-togglelabel": "Избор:",
        "search-external": "Външно търсене",
        "searchdisabled": "Търсенето в {{SITENAME}} е временно изключено. Междувременно можете да търсите чрез Google. Обърнете внимание, че съхранените при тях страници най-вероятно са остарели.",
        "search-error": "Възникна грешка при търсене: $1",
+       "search-warning": "По време на търсенето беше генерирано предупреждение: $1",
        "preferences": "Настройки",
        "mypreferences": "Настройки",
        "prefs-edits": "Брой редакции:",
        "gender-unknown": "Когато ви споменава, софтуерът ще използва неутрални думи за пол, когато е възможно",
        "gender-male": "Той редактира уики страниците",
        "gender-female": "Тя редактира уики страниците",
-       "prefs-help-gender": "Ð\9fо Ð¶ÐµÐ»Ð°Ð½Ð¸Ðµ: Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° Ñ\81е Ð·Ð° ÐºÐ¾Ñ\80екÑ\82но Ð¾Ð±Ñ\80Ñ\8aÑ\89ение Ð¿Ð¾ Ñ\80од Ð² Ñ\81иÑ\81Ñ\82емниÑ\82е Ñ\81Ñ\8aобÑ\89ениÑ\8f Ð½Ð° Ñ\81оÑ\84Ñ\82Ñ\83еÑ\80а. Тази информация е публично достъпна.",
+       "prefs-help-gender": "УÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\82ази Ð½Ð°Ñ\81Ñ\82Ñ\80ойка Ð½Ðµ Ðµ Ð·Ð°Ð´Ñ\8aлжиÑ\82елно.\nСоÑ\84Ñ\82Ñ\83еÑ\80Ñ\8aÑ\82 Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° Ñ\81Ñ\82ойноÑ\81Ñ\82Ñ\82а Ñ\9d, Ð·Ð° Ð´Ð° Ñ\81е Ð¾Ð±Ñ\8aÑ\80не ÐºÑ\8aм Ð²Ð°Ñ\81 Ñ\81Ñ\8aобÑ\80азно Ð¿Ð¾Ð»Ð° Ð\92и.\nТази информация е публично достъпна.",
        "email": "Е-поща",
        "prefs-help-realname": "* Истинското име не е задължително. Ако го посочите, вашите приноси ще бъдат приписани на него.",
        "prefs-help-email": "Електронната поща е незадължителна, но позволява възстановяване на забравена или загубена парола.",
        "prefs-tokenwatchlist": "Маркер",
        "prefs-diffs": "Разлики",
        "prefs-help-prefershttps": "Това предпочитание ще бъде активирано при следващото влизане.",
-       "userrights": "УпÑ\80авление Ð½Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е права",
+       "userrights": "Ð\9fоÑ\82Ñ\80ебиÑ\82елÑ\81ки права",
        "userrights-lookup-user": "Изберете потребител",
        "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": "Преглед на {{GENDER:$1|потребителските}} групи",
        "saveusergroups": "Съхраняване на {{GENDER:$1|потребителските}} групи",
        "userrights-groupsmember": "Член на:",
-       "userrights-groupsmember-auto": "Ð\9fодÑ\80азбиÑ\80аÑ\89 Ñ\81е Ñ\87лен на:",
-       "userrights-groups-help": "Може да променяте групите, в които е потребителят:\n* Поставена отметка означава, че потребителят е член на групата.\n* Поле без отметка означава, че потребителят не е член на групата.\n* Знакът * показва, че не можете да премахнете групата, след като е вече добавена (или обратно).",
+       "userrights-groupsmember-auto": "Член Ð¿Ð¾ Ð¿Ð¾Ð´Ñ\80азбиÑ\80ане на:",
+       "userrights-groups-help": "Може да променяте групите, в които е потребителят:\n* Поставена отметка означава, че потребителят е член на групата.\n* Поле без отметка означава, че потребителят не е член на групата.\n* Знакът * показва, че не можете да премахнете групата, след като е вече добавена (или обратно).\n* Знакът # показва, че можете да удължите само срокът на членството; не може да го върнете на по-ранна дата.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "Нямате права да редактирате потребителските групи на други уикита.",
        "userrights-nodatabase": "Базата данни $1 не съществува или не е на локалния сървър.",
        "userrights-unchangeable-col": "Групи, които не можете да променяте",
        "userrights-expiry-current": "Изтича на $1",
        "userrights-expiry": "Изтича на:",
+       "userrights-expiry-existing": "Оставащо време: $2, $3",
        "userrights-expiry-othertime": "Друго време:",
        "userrights-expiry-options": "1 ден:1 day,1 седмица:1 week,1 месец:1 month,3 месеца:3 months,6 месеца:6 months,1 година:1 year",
        "group": "Потребителска група:",
        "right-reupload-own": "Презаписване на съществуващ файл, качен от същия потребител",
        "right-reupload-shared": "Предефиниране на едноименните файлове от общото мултимедийно хранилище с локални",
        "right-upload_by_url": "Качване на файл от URL адрес",
-       "right-purge": "изчистване на складираното съдържание на страниците без показване на страница за потвърждение",
+       "right-purge": "Ð\98зчистване на складираното съдържание на страниците без показване на страница за потвърждение",
        "right-autoconfirmed": "Редактиране на полузащитени страници",
        "right-bot": "Третиране като автоматизиран процес",
        "right-nominornewtalk": "Малките промени по дискусионните страници не предизвикват известието за ново съобщение",
        "right-apihighlimits": "Използване на крайните предели в API заявките",
        "right-writeapi": "Употреба на API за писане",
        "right-delete": "Изтриване на страници",
-       "right-bigdelete": "изтриване на страници с големи редакционни истории",
+       "right-bigdelete": "Ð\98зтриване на страници с големи редакционни истории",
        "right-deletelogentry": "Изтриване и възстановяване на отделни записи в дневника",
        "right-deleterevision": "Изтриване и възстановяване на отделни версии на страниците",
-       "right-deletedhistory": "преглеждане на записи от изтрити редакционни истории без асоциирания към тях текст",
+       "right-deletedhistory": "Ð\9fреглеждане на записи от изтрити редакционни истории без асоциирания към тях текст",
        "right-deletedtext": "Преглед на изтрития текст и промените между изтритите версии",
-       "right-browsearchive": "търсене на изтрити страници",
+       "right-browsearchive": "Търсене на изтрити страници",
        "right-undelete": "Възстановяване на страници",
        "right-suppressrevision": "Преглед и възстановяване на версии, скрити от администраторите",
        "right-viewsuppressed": "Преглеждане на версии, скрити от който и да е потребител",
-       "right-suppressionlog": "Ð\9fÑ\80еглеждане Ð½Ð° Ñ\82айните дневници",
-       "right-block": "спиране на достъпа до редактиране",
+       "right-suppressionlog": "Ð\9fÑ\80еглеждане Ð½Ð° Ñ\81кÑ\80иÑ\82ите дневници",
+       "right-block": "Спиране на достъпа до редактиране",
        "right-blockemail": "Блокиране на потребители да изпращат писма по е-поща",
        "right-hideuser": "Блокиране и скриване на потребителско име",
        "right-ipblock-exempt": "Пренебрегване на блокирания по IP blocks, автоматични блокирания и блокирани IP интервали",
        "right-unblockself": "Собствено отблокиране",
        "right-protect": "Променяне на нивото на защита и редактиране на каскадно-защитените страници",
        "right-editprotected": "Редактиране на страници защитени като „{{int:protect-level-sysop}}“",
+       "right-editsemiprotected": "Редактиране на страници защитени като „{{int:protect-level-autoconfirmed}}“",
+       "right-editcontentmodel": "Редактиране на модела на съдържанието на страница",
        "right-editinterface": "Редактиране на потребителския интерфейс",
-       "right-editusercssjs": "редактиране на CSS и JS файловете на други потребители",
-       "right-editusercss": "редактиране на CSS файловете на други потребители",
-       "right-edituserjs": "редактиране на JS файловете на други потребители",
+       "right-editusercss": "Редактиране на CSS файловете на други потребители",
+       "right-edituserjs": "Редактиране на JS файловете на други потребители",
        "right-editmyusercss": "Редактиране на собствените потребителски CSS файлове",
        "right-editmyuserjs": "Редактиране на собствените потребителски JavaScript файлове",
        "right-viewmywatchlist": "Преглеждане на собствения списък за наблюдение",
        "right-editmyprivateinfo": "Редактиране на собствените лични данни (например: адрес на електронната поща, истинско име)",
        "right-editmyoptions": "Редактиране на собствените настройки",
        "right-rollback": "Бърза отмяна на промените, направени от последния потребител, редактирал дадена страница",
-       "right-markbotedits": "оÑ\82белÑ\8fзване Ð½Ð° Ð²Ñ\8aзвърнатите редакции като редакции на ботове",
+       "right-markbotedits": "Ð\9eÑ\82белÑ\8fзване Ð½Ð° върнатите редакции като редакции на ботове",
        "right-noratelimit": "Пренебрегване на всякакви ограничения",
        "right-import": "Внасяне на страници от други уикита",
        "right-importupload": "Внасяне на страници от качен файл",
        "right-patrol": "Отбелязване на редакциите като проверени",
        "right-autopatrol": "Автоматично отбелязване на редакции като проверени",
        "right-patrolmarks": "Показване на отбелязаните като патрулирани последни промени",
-       "right-unwatchedpages": "преглеждане на списъка с ненаблюдаваните страници",
+       "right-unwatchedpages": "Ð\9fреглеждане на списъка с ненаблюдаваните страници",
        "right-mergehistory": "сливане на редакционни истории на страници",
        "right-userrights": "Редактиране на потребителските права",
        "right-userrights-interwiki": "редактиране на потребителски права на потребители в други уикита",
        "right-override-export-depth": "Изнасяне на страници, включително свързаните с тях в дълбочина до пето ниво",
        "right-sendemail": "Изпращане на е-писма до другите потребители",
        "grant-group-email": "Изпращане на е-писмо",
+       "grant-group-administration": "Извършване на административни действия",
        "grant-blockusers": "Блокиране и отблокиране на потребители",
        "grant-createaccount": "Създаване на сметки",
        "grant-createeditmovepage": "Създаване, редактиране и преместване на страници",
        "grant-delete": "Изтриване на страници, редакции и записи в дневника",
-       "grant-editinterface": "РедакÑ\82иÑ\80ане Ð½Ð° Ð¿Ñ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82воÑ\82о Ð½Ð°Ñ\80иÑ\87а Ð\9cедиÑ\8fУики Ð¸ CSS/JavaScript Ñ\83Ñ\87аÑ\81Ñ\82ник",
+       "grant-editinterface": "РедакÑ\82иÑ\80ане Ð½Ð° Ð\9cедиÑ\8fУики Ð¿Ñ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82воÑ\82о Ð¸ Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81киÑ\8f CSS/JavaScript",
        "grant-editmycssjs": "Редактиране на личния CSS/JavaScript",
        "grant-editmyoptions": "Редактиране на вашите потребителски настройки",
-       "grant-editmywatchlist": "редактиране на списъка ви за наблюдение",
+       "grant-editmywatchlist": "Редактиране на списъка ви за наблюдение",
        "grant-editpage": "Редактиране на съществуващи страници",
        "grant-editprotected": "Редактиране на защитени страници",
        "grant-highvolume": "Голям обем за редактиране",
        "grant-oversight": "Скриване на участниците и версия страници",
        "grant-patrol": "Патрулират промени страници",
-       "grant-privateinfo": "Ð\94оÑ\81Ñ\82Ñ\8aп Ð´Ð¾ Ð»Ð¸Ñ\87ни Ð¸Ð½Ñ\84оÑ\80маÑ\86ии",
-       "grant-protect": "Ð\97аÑ\89иÑ\82а Ð½Ð° Ð½ÐµÐ·Ð°Ñ\88Ñ\82иÑ\82ени страници",
-       "grant-rollback": "Ð\9eÑ\82каÑ\82Ñ\8bваÑ\82Ñ\8c Ð¿Ñ\80омени страници",
+       "grant-privateinfo": "Ð\94оÑ\81Ñ\82Ñ\8aп Ð´Ð¾ Ð»Ð¸Ñ\87на Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f",
+       "grant-protect": "Ð\97аÑ\89иÑ\82а Ð¸ Ð¿Ñ\80емаÑ\85ване Ð½Ð° Ð·Ð°Ñ\89иÑ\82а Ð½Ð° страници",
+       "grant-rollback": "Ð\92Ñ\80Ñ\8aÑ\89ане Ð½Ð° Ð¿Ñ\80омени Ð¿Ð¾ страници",
        "grant-sendemail": "Изпращане на имейл до други потребители",
        "grant-uploadeditmovefile": "Качване, заменяне и прехвърляне на файлове",
        "grant-uploadfile": "Качване на нови файлове",
        "grant-basic": "Основни права",
        "grant-viewdeleted": "Преглед на изтрити файлове и страници",
-       "grant-viewmywatchlist": "преглед на списъка ви за наблюдение",
+       "grant-viewmywatchlist": "Ð\9fреглед на списъка ви за наблюдение",
        "newuserlogpage": "Дневник на регистрациите",
        "newuserlogpagetext": "В този дневник се записват регистрациите на потребители.",
        "rightslog": "Дневник на потребителските права",
-       "rightslogtext": "Това е дневник на промените на потребителски права.",
+       "rightslogtext": "Това е дневник на промените на потребителските права.",
        "action-read": "четене на страницата",
        "action-edit": "редактиране на тази страница",
        "action-createpage": "създаване на страници",
        "action-userrights-interwiki": "редактиране на потребителските права на потребители от други уикита",
        "action-siteadmin": "заключване и отключване на базата от данни",
        "action-sendemail": "изпращане на е-писма",
+       "action-editmyoptions": "редактиране на собствените настройки",
        "action-editmywatchlist": "редактиране на списъка ви за наблюдение",
        "action-viewmywatchlist": "преглед на списъка ви за наблюдение",
        "action-viewmyprivateinfo": "преглеждане на личните данни",
        "action-editmyprivateinfo": "редактиране на личната си информация",
+       "action-editcontentmodel": "редактиране на модела на съдържанието на страница",
        "action-managechangetags": "създаване и (де)активиране на етикети",
        "action-applychangetags": "прилагане на етикетите заедно с промените ви",
        "action-purge": "почисти кеша на тази страница",
        "recentchanges-feed-description": "Проследяване на последните промени в {{SITENAME}}.",
        "recentchanges-label-newpage": "Нова страница",
        "recentchanges-label-minor": "Това е малка промяна",
-       "recentchanges-label-bot": "Тази Ñ\80едакÑ\86иÑ\8f Ðµ Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ена от бот",
+       "recentchanges-label-bot": "Тази Ñ\80едакÑ\86иÑ\8f Ðµ Ð½Ð°Ð¿Ñ\80авена от бот",
        "recentchanges-label-unpatrolled": "Тази редакция все още не е проверена",
        "recentchanges-label-plusminus": "Размерът на страницата е променен с този брой байтове",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (вижте също [[Special:NewPages|списъка с нови страници]])",
        "recentchanges-submit": "Покажи",
+       "rcfilters-activefilters": "Активни филтри",
+       "rcfilters-savedqueries-defaultlabel": "Съхранени филтри",
+       "rcfilters-savedqueries-rename": "Преименуване",
+       "rcfilters-savedqueries-setdefault": "Съхраняване по подразбиране",
+       "rcfilters-savedqueries-unsetdefault": "Премахване по подразбиране",
+       "rcfilters-savedqueries-remove": "Премахване",
+       "rcfilters-savedqueries-new-name-label": "Име",
+       "rcfilters-savedqueries-apply-label": "Създаване на бърза връзка",
+       "rcfilters-savedqueries-cancel-label": "Отказ",
+       "rcfilters-savedqueries-add-new-title": "Съхраняване на филтрите като бърза връзка",
+       "rcfilters-restore-default-filters": "Възстановяване на филтрите по подразбиране",
        "rcfilters-clear-all-filters": "Изчистване на всички филтри",
+       "rcfilters-search-placeholder": "Филтриране на последните промени (изберете или започнете да въвеждате)",
+       "rcfilters-invalid-filter": "Невалиден филтър",
+       "rcfilters-empty-filter": "Няма активни филтри. Показани са всички редакции.",
        "rcfilters-filterlist-title": "Филтри",
+       "rcfilters-filterlist-whatsthis": "Какво е това?",
+       "rcfilters-filterlist-feedbacklink": "Оставете коментар за новите (бета) филтри",
+       "rcfilters-highlightbutton-title": "Отбелязване на резултатите",
+       "rcfilters-highlightmenu-title": "Изберете цвят",
+       "rcfilters-highlightmenu-help": "Изберете цвят за отбелязване на свойството",
        "rcfilters-filterlist-noresults": "Не са намерени филтри",
        "rcfilters-filtergroup-registration": "Регистрация на потребители",
+       "rcfilters-filter-registered-label": "Регистрирани",
+       "rcfilters-filter-registered-description": "Влезли в системата редактори.",
        "rcfilters-filter-unregistered-label": "Нерегистрирани",
-       "rcfilters-filter-editsbyself-label": "Ваши собствени редакции",
+       "rcfilters-filter-unregistered-description": "Редактори, които не са влезли в системата.",
+       "rcfilters-filtergroup-authorship": "Авторство на редакциите",
+       "rcfilters-filter-editsbyself-label": "Ваши редакции",
        "rcfilters-filter-editsbyself-description": "Ваши редакции.",
        "rcfilters-filter-editsbyother-label": "Чужди редакции",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Новодошли",
+       "rcfilters-filter-editsbyother-description": "Всички редакции с изключение на вашите собствени.",
+       "rcfilters-filtergroup-userExpLevel": "Ниво на опита (само за регистрирани потребители)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Новодошли",
+       "rcfilters-filter-user-experience-level-newcomer-description": "По-малко от 10 редакции и 5 дни активност.",
+       "rcfilters-filter-user-experience-level-learner-label": "Учещи се",
+       "rcfilters-filter-user-experience-level-learner-description": "Повече опит от „Новодошли“, но по-малко от „Опитни потребители“.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Опитни потребители",
+       "rcfilters-filter-user-experience-level-experienced-description": "Повече от 30 дни активност и 500 редакции.",
+       "rcfilters-filtergroup-automated": "Автоматизирани приноси",
        "rcfilters-filter-bots-label": "Бот",
+       "rcfilters-filter-bots-description": "Редакции, направени с помощта на автоматизирани инструменти.",
        "rcfilters-filter-humans-label": "Човек (не бот)",
+       "rcfilters-filter-humans-description": "Редакции, направени от редактори.",
+       "rcfilters-filtergroup-reviewstatus": "Проверка на статуса",
+       "rcfilters-filter-patrolled-label": "Патрулирано",
+       "rcfilters-filter-patrolled-description": "Редакции, отбелязани като патрулирани.",
+       "rcfilters-filter-unpatrolled-label": "Непатрулирано",
+       "rcfilters-filter-unpatrolled-description": "Редакции, неотбелязани като патрулирани.",
+       "rcfilters-filtergroup-significance": "Значимост",
        "rcfilters-filter-minor-label": "Малки промени",
+       "rcfilters-filter-minor-description": "Редакции, които не са отбелязани като малки промени.",
        "rcfilters-filter-major-label": "Обикновени редакции",
+       "rcfilters-filter-major-description": "Редакции, които не са отбелязани като малки промени.",
+       "rcfilters-filtergroup-watchlist": "Страници от списъка за наблюдение",
+       "rcfilters-filter-watchlist-watched-label": "В списъка за наблюдение",
+       "rcfilters-filter-watchlist-watched-description": "Промени в страници от списъка за наблюдение.",
+       "rcfilters-filter-watchlist-watchednew-label": "Нови промени в списъка за наблюдение",
+       "rcfilters-filter-watchlist-watchednew-description": "Промени в страниците от списъка за наблюдение, които не сте посетили от извършването им.",
+       "rcfilters-filter-watchlist-notwatched-label": "Извън списъка за наблюдение",
+       "rcfilters-filter-watchlist-notwatched-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": "Административни действия, създавания на сметки, изтривания на страници, качвания...",
+       "rcfilters-filtergroup-lastRevision": "Текуща версия",
+       "rcfilters-filter-lastrevision-label": "Текуща версия",
+       "rcfilters-filter-lastrevision-description": "Последната промяна на страница.",
+       "rcfilters-filter-previousrevision-label": "По-ранни версии",
+       "rcfilters-filter-previousrevision-description": "Всички редакции, които не са последните на страница.",
        "rcnotefrom": "{{PLURAL:$5|Дадена е промяната|Дадени са промените}} от <strong>$3, $4</strong> (до <strong>$1</strong> показани).",
        "rclistfrom": "Показване на промени, като се започва от $3 $2",
        "rcshowhideminor": "$1 на малки промени",
        "rcshowhidecategorization": "$1 категоризации",
        "rcshowhidecategorization-show": "Показване на",
        "rcshowhidecategorization-hide": "Скриване на",
-       "rclinks": "Показване на последните $1 промени за последните $2 дни<br />$3",
+       "rclinks": "Показване на последните $1 промени за последните $2 дни",
        "diff": "разл",
        "hist": "ист",
        "hide": "Скриване",
        "filetype-mime-mismatch": "Файловото разширение \".$1\" не отговаря на MIME типа на файла ($2).",
        "filetype-badmime": "Не е разрешено качването на файлове с MIME-тип „$1“.",
        "filetype-bad-ie-mime": "Този файл не може да бъде качен, защото Internet Explorer го разпознава като „$1“, който е отхвърлен и потенциално опасен файлов формат.",
-       "filetype-unwanted-type": "'''â\80\9e.$1â\80\9c''' Ðµ Ð½ÐµÐ¶ÐµÐ»Ð°Ð½ Ñ\84айлов Ñ\84оÑ\80маÑ\82. {{PLURAL:$3|Ð\9fÑ\80еопръчителният файлов формат е|Препоръчителните файлови формати са}} $2.",
+       "filetype-unwanted-type": "'''â\80\9e.$1â\80\9c''' Ðµ Ð½ÐµÐ¶ÐµÐ»Ð°Ð½ Ñ\84айлов Ñ\84оÑ\80маÑ\82. {{PLURAL:$3|Ð\9fÑ\80епоръчителният файлов формат е|Препоръчителните файлови формати са}} $2.",
        "filetype-banned-type": "'''„.$1“''' не {{PLURAL:$4|е позволен файлов формат|са позволени файлови формати}}. {{PLURAL:$3|Позволеният файлов формат е|Позволените файлови формати са}} $2.",
        "filetype-missing": "Файлът няма разширение (напр. „.jpg“).",
        "empty-file": "Подаденият от вас файл беше празен.",
        "upload-options": "Настройки за качване",
        "watchthisupload": "Наблюдаване на файла",
        "filewasdeleted": "Файл в този име е съществувал преди време, но е бил изтрит. Проверете $1 преди да го качите отново.",
+       "filename-thumb-name": "Заглавието на този файл изглежда като заглавие на миниатюра (thumbnail). Не качвайте миниатюри на файлове, които вече съществуват в това същото уки. Освен това, променете заглавието на файла с някое по-съдържателно и без представката, която е характерна за миниатюрите.",
        "filename-bad-prefix": "Името на файла, който качвате, започва с '''„$1“''', което е неописателно име, типично задавано по автоматичен начин от цифровите камери или апарати. Изберете по-описателно име на файла.",
        "upload-proto-error": "Неправилен протокол",
        "upload-proto-error-text": "Изисква се адрес започващ с <code>http://</code> или <code>ftp://</code>.",
        "upload-form-label-infoform-date": "Дата",
        "upload-form-label-own-work-message-generic-local": "Потвърждавам, че качвам този файл в съответствие с правилата и лицензионната политика на сайта {{SITENAME}}.",
        "upload-form-label-not-own-work-message-generic-local": "Ако не можете да заредите този файл в съответствие с правилата на сайта {{SITENAME}}, моля, затворете този прозорец и опитайте друг метод.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Ако не можете да качите този файл в съответствие с правилата на споделеното хранилище, моля, затворете този прозорец и опитайте друг метод.",
        "backend-fail-notexists": "Файлът $1 не съществува.",
        "backend-fail-delete": "Файлът $1 не може да бъде изтрит.",
        "backend-fail-alreadyexists": "Файлът $1 вече съществува.",
        "img-auth-nopathinfo": "Липсва PATH_INFO.\nВашият сървър не е конфигуриран да предава тази информация.\nТой може да е базиран на CGI и да не може да поддържа img_auth.\nВижте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Търсеният път не е в настроената директория за качвания.",
        "img-auth-badtitle": "Грешка при изграждането на валидно заглавие от „$1“.",
-       "img-auth-nologinnWL": "Не сте влезли в системата и „$1“ не е в белия списък.",
+       "img-auth-nologinnWL": "Не сте влезли в системата и „$1“ не е в разрешения списък.",
        "img-auth-nofile": "Файлът „$1“ не съществува.",
        "img-auth-isdir": "Опитвате се да осъществите достъп до директорията „$1“.\nРазрешен е само достъп до файловете.",
        "img-auth-streaming": "Излъчване \"$1\"",
        "license": "Лицензиране:",
        "license-header": "Лицензиране",
        "nolicense": "Нищо не е избрано",
+       "licenses-edit": "Промяна на параметрите на лицензите",
        "license-nopreview": "(Не е наличен предварителен преглед)",
        "upload_source_url": "(избраният от вас файл от валиден, публично достъпен интернет-адрес)",
        "upload_source_file": "(файл на вашия компютър)",
        "sharedupload-desc-there": "Този файл е от $1 и може да се използва от други проекти.\nЗа повече информация вижте [$2 описателната му страница].",
        "sharedupload-desc-here": "Този файл е от $1 и може да се използва от други проекти.\nСледва информация за файла, достъпна през [$2 оригиналната му описателна страница].",
        "sharedupload-desc-edit": "Този файл е от $1 и може да бъде използван от други проекти.\nВероятно желаете да редактирате описанието му на [$2 неговата описателна страница].",
+       "sharedupload-desc-create": "Този файл е от $1 и може да бъде използван от други проекти.\nВероятно желаете да редактирате описанието му на [$2 неговата описателна страница].",
        "filepage-nofile": "Не съществува файл с това име.",
        "filepage-nofile-link": "Не съществува файл с това име, но можете [$1 да го качите].",
        "uploadnewversion-linktext": "Качване на нова версия на файла",
        "shared-repo-from": "от $1",
        "shared-repo": "споделено хранилище",
        "shared-repo-name-wikimediacommons": "Общомедия",
-       "upload-disallowed-here": "Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð¿Ñ\80езапиÑ\88ете файла.",
+       "upload-disallowed-here": "Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð¿Ñ\80епокÑ\80иете файла.",
        "filerevert": "Възвръщане на $1",
        "filerevert-legend": "Възвръщане на файла",
        "filerevert-intro": "Възвръщане на '''[[Media:$1|$1]]''' към [$4 версията от $3, $2].",
        "unwatchedpages": "Ненаблюдавани страници",
        "listredirects": "Списък на пренасочванията",
        "listduplicatedfiles": "Списък на повтарящи се файлове",
+       "listduplicatedfiles-summary": "Това е списък на файловете, за които последната версия е дубликат с последната версия на друг файл. Показани са само локалните файлове.",
        "unusedtemplates": "Неизползвани шаблони",
        "unusedtemplatestext": "Тази страница съдържа списък на страниците в именно пространство {{ns:template}}, които не са включени в друга страница. Проверявайте за препратки към отделните шаблони преди да ги изтриете или предложите за изтриване.",
        "unusedtemplateswlh": "други препратки",
        "statistics-pages-desc": "Всички страници в уикито, включително дискусионни, пренасочващи страници и т.н.",
        "statistics-files": "Качени файлове",
        "statistics-edits": "Брой редакции по страници от началото на {{SITENAME}}",
-       "statistics-edits-average": "СÑ\80едно редакции на страница",
+       "statistics-edits-average": "СÑ\80еден Ð±Ñ\80ой редакции на страница",
        "statistics-users": "Регистрирани [[Special:ListUsers|потребители]]",
        "statistics-users-active": "Активни потребители",
        "statistics-users-active-desc": "Потребители, направили редакция през {{PLURAL:$1|последния ден|последните $1 дни}}",
+       "pageswithprop": "Страници с page property",
+       "pageswithprop-legend": "Страници с page property",
+       "pageswithprop-text": "На тази страница са показани всички страници, които използват page property.",
        "pageswithprop-prop": "Име на свойството:",
        "pageswithprop-submit": "Отваряне",
        "doubleredirects": "Двойни пренасочвания",
        "wantedpages": "Желани страници",
        "wantedpages-badtitle": "Невалидно заглавие в резултатното множество: $1",
        "wantedfiles": "Желани файлове",
+       "wantedfiletext-cat": "Следните файлове се използват, но не съществуват. Файлове от външни хранилища могат да бъдат показани. Всички подобни неверни положителни резултати ще бъдат <del>зачеркнати</del>. Също така, страниците, които включват файлове, които не съществуват са включени в [[:$1]].",
        "wantedfiletext-nocat": "Следните файлове се използват, но не съществуват. Възможно е да са включени файлове от външни хранилища, въпреки че съществуват. Всички такива случаи на възможна фалшива тревога ще бъдат показвани <del>зачеркнати</del>.",
        "wantedtemplates": "Желани шаблони",
        "mostlinked": "Най-препращани страници",
        "deadendpagestext": "Следните страници нямат препратки към други страници от {{SITENAME}}.",
        "protectedpages": "Защитени страници",
        "protectedpages-indef": "Само безсрочни защити",
+       "protectedpages-summary": "Списък на страниците, които са защитени. За списък на заглавията, които са защитени от създаване, вижте [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Само каскадни защити",
        "protectedpages-noredirect": "Скриване на пренасочванията",
        "protectedpagesempty": "В момента няма защитени страници с тези параметри.",
        "protectedpages-unknown-timestamp": "Неизвестни",
        "protectedpages-unknown-performer": "Неизвестен потребител",
        "protectedtitles": "Защитени заглавия",
+       "protectedtitles-summary": "Списък на заглавията, които са защитени от създаване. За списък на съществуващите страници, които са защитени, вижте [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "В момента няма заглавия, защитени с тези параметри.",
        "protectedtitles-submit": "Показване на заглавията",
        "listusers": "Списък на потребителите",
        "log-title-wildcard": "Търсене на заглавия, започващи със",
        "showhideselectedlogentries": "Промяна на видимостта на избраните записи",
        "checkbox-select": "Избери: $1",
-       "checkbox-all": "всички",
+       "checkbox-all": "Ð\92сички",
        "checkbox-none": "никои",
        "checkbox-invert": "обърни избора",
        "allpages": "Всички страници",
        "allpagesbadtitle": "Зададеното име е невалидно. Възможно е да съдържа междуезикова или междупроектна представка или пък знаци, които не могат да се използват в заглавия.",
        "allpages-bad-ns": "В {{SITENAME}} не съществува именно пространство „$1“.",
        "allpages-hide-redirects": "Скриване на пренасочванията",
+       "cachedspecial-viewing-cached-ttl": "Преглеждате кеширана версия на страница, която за последно е обновена преди $1.",
        "cachedspecial-refresh-now": "Преглед на текущата.",
        "categories": "Категории",
        "categories-submit": "Показване",
        "activeusers-intro": "Това е списък на потребителите, които са демонстрирали някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.",
        "activeusers-count": "$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}",
        "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-grant": "Разрешение",
        "listgrants-rights": "Права",
        "emailccsubject": "Копие на писмото ви до $1: $2",
        "emailsent": "Писмото е изпратено",
        "emailsenttext": "Писмото ви беше изпратено.",
-       "emailuserfooter": "Това писмо беше изпратено от $1 на $2 чрез функцията „Изпращане на писмо до потребителя“ на {{SITENAME}}.",
+       "emailuserfooter": "Това писмо беше изпратено от $1 на {{GENDER:$2|$2}} чрез функцията „{{int:emailuser}}“ на {{SITENAME}}. Ако отговорите на писмото, вашето писмо ще бъде изпратено директно на {{GENDER:$1|първоначалния подател}}, показвайки адреса на ел. Ви поща на получателя.",
        "usermessage-summary": "Оставяне на системно съобщение.",
        "usermessage-editor": "Системни съобщения",
        "watchlist": "Списък за наблюдение",
        "watchlistanontext": "За преглеждане и редактиране на списъка за наблюдение се изисква влизане в системата.",
        "watchnologin": "Не сте влезли",
        "addwatch": "Добавяне към списъка за наблюдение",
-       "addedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e'''[[:$1]]'''â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ ÐºÑ\8aм [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение]].",
+       "addedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e'''[[:$1]]'''â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ ÐºÑ\8aм [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение]].",
        "addedwatchtext-short": "Страницата „$1“ беше добавена към списъка Ви за наблюдение.",
        "removewatch": "Премахване от списъка за наблюдение",
-       "removedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e[[:$1]]â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð¿Ñ\80емаÑ\85наÑ\82и Ð¾Ñ\82 [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение]].",
+       "removedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e[[:$1]]â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð¿Ñ\80емаÑ\85наÑ\82и Ð¾Ñ\82 [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение]].",
        "removedwatchtext-short": "Страницата „$1“ беше премахната от списъка Ви за наблюдение.",
        "watch": "Наблюдение",
        "watchthispage": "Наблюдаване на страницата",
        "unwatchthispage": "Спиране на наблюдение",
        "notanarticle": "Не е страница",
        "notvisiblerev": "Версията беше изтрита",
-       "watchlist-details": "{{PLURAL:$1|Ð\95дна Ð½Ð°Ð±Ð»Ñ\8eдавана Ñ\81Ñ\82Ñ\80аниÑ\86а|$1 Ð½Ð°Ð±Ð»Ñ\8eдавани Ñ\81Ñ\82Ñ\80аниÑ\86и}} Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение (без беседи).",
+       "watchlist-details": "{{PLURAL:$1|Ð\95дна Ð½Ð°Ð±Ð»Ñ\8eдавана Ñ\81Ñ\82Ñ\80аниÑ\86а|$1 Ð½Ð°Ð±Ð»Ñ\8eдавани Ñ\81Ñ\82Ñ\80аниÑ\86и}} Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение (без беседи).",
        "wlheader-enotif": "Известяването по е-поща е включено.",
        "wlheader-showupdated": "Страниците, които са били променени след последния път, когато сте ги посетили, са показани в '''получер'''.",
        "wlnote": "{{PLURAL:$1|Показана е последната промяна|Показани са последните '''$1''' промени}} през {{PLURAL:$2|последния час|последните '''$2''' часа}}, започвайки от от $3, $4.",
        "watchlist-options": "Опции на списъка за наблюдение",
        "watching": "Наблюдение…",
        "unwatching": "Спиране на наблюдение…",
-       "watcherrortext": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¿Ñ\80омÑ\8fна Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð·Ð° Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение за „$1“.",
+       "watcherrortext": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¿Ñ\80омÑ\8fна Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð·Ð° Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение за „$1“.",
        "enotif_reset": "Отбелязване на всички страници като посетени",
        "enotif_impersonal_salutation": "Потребител на {{SITENAME}}",
        "enotif_subject_deleted": "Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|изтрита}} от $2",
        "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\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\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": "Изтриване",
        "delete-legend": "Изтриване",
        "historywarning": "<strong>Внимание:</strong> Страницата, която възнамерявате да изтриете, има история с приблизително $1 {{PLURAL:$1|редакция|редакции}}:",
        "historyaction-submit": "Показване",
-       "confirmdeletetext": "Ð\9dа Ð¿Ñ\8aÑ\82 Ñ\81Ñ\82е Ð´Ð° Ð¸Ð·Ñ\82Ñ\80иеÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°ÐµÐ´Ð½Ð¾ Ñ\81 Ñ\86Ñ\8fлаÑ\82а Ñ\9d Ñ\80едакÑ\86ионна Ð¸Ñ\81Ñ\82оÑ\80иÑ\8f.\nÐ\9fоÑ\82вÑ\8aÑ\80деÑ\82е, Ñ\87е Ð¸Ñ\81каÑ\82е Ñ\82ова, Ñ\80азбиÑ\80аÑ\82е Ð¿Ð¾Ñ\81ледÑ\81Ñ\82виÑ\8fÑ\82а Ð¸ Ð¿Ñ\80авиÑ\82е Ñ\82ова Ð² Ñ\81Ñ\8aоÑ\82веÑ\82Ñ\81Ñ\82вие Ñ\81 [[{{MediaWiki:Policy-url}}|линиÑ\8fÑ\82а Ð½Ð° Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ]].",
+       "confirmdeletetext": "Ð\9dа Ð¿Ñ\8aÑ\82 Ñ\81Ñ\82е Ð´Ð° Ð¸Ð·Ñ\82Ñ\80иеÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°ÐµÐ´Ð½Ð¾ Ñ\81 Ñ\86Ñ\8fлаÑ\82а Ñ\9d Ñ\80едакÑ\86ионна Ð¸Ñ\81Ñ\82оÑ\80иÑ\8f.\nÐ\9fоÑ\82вÑ\8aÑ\80деÑ\82е, Ñ\87е Ð¸Ñ\81каÑ\82е Ñ\82ова, Ñ\80азбиÑ\80аÑ\82е Ð¿Ð¾Ñ\81ледÑ\81Ñ\82виÑ\8fÑ\82а Ð¸ Ð¿Ñ\80авиÑ\82е Ñ\82ова Ð² Ñ\81Ñ\8aоÑ\82веÑ\82Ñ\81Ñ\82вие Ñ\81 [[{{MediaWiki:Policy-url}}|полиÑ\82икаÑ\82а]].",
        "actioncomplete": "Действието беше изпълнено",
        "actionfailed": "Действието не сполучи",
        "deletedtext": "Страницата „$1“ беше изтрита. Вижте $2 за запис на последните изтривания.",
        "editcomment": "Резюмето на редакцията беше: <em>$1</em>.",
        "revertpage": "Премахване на [[Special:Contributions/$2|редакции на $2]] ([[User talk:$2|беседа]]); възвръщане към последната версия на [[User:$1|$1]]",
        "revertpage-nouser": "Премахнати редакции на (скрито потребителско име) и връщане към последната версия на [[User:$1|$1]]",
-       "rollback-success": "Отменени редакции на $1; възвръщане към последната версия на $2.",
+       "rollback-success": "Отменени редакции на {{GENDER:$3|$1}};\nвъзвръщане към последната версия на {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Прекъсната сесия",
        "sessionfailure": "Изглежда има проблем със сесията ви; действието беше отказано като предпазна мярка срещу крадене на сесията. Натиснете бутона за връщане на браузъра, презаредете страницата, от която сте дошли, и опитайте отново.",
+       "changecontentmodel": "Промяна на модела на съдържанието на страница",
+       "changecontentmodel-legend": "Промяна на модела на съдържанието",
        "changecontentmodel-title-label": "Заглавие на страницата",
+       "changecontentmodel-model-label": "Нов модел на съдържанието",
        "changecontentmodel-reason-label": "Причина:",
        "changecontentmodel-submit": "Променяне",
+       "changecontentmodel-success-title": "Моделът на съдържание бе променен",
        "changecontentmodel-success-text": "Типът на съдържанието на [[:$1]] е успешно променен.",
        "log-name-contentmodel": "Дневник на cъдържанието промяна модела",
-       "log-description-contentmodel": "СÑ\8aбиÑ\82иÑ\8f, Ð¾Ñ\82наÑ\81Ñ\8fÑ\89и Ñ\81е Ð´Ð¾ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а",
+       "log-description-contentmodel": "СÑ\82Ñ\80аниÑ\86аÑ\82а Ð¿Ð¾ÐºÐ°Ð·Ð²Ð° Ð¿Ñ\80омениÑ\82е Ð² Ð¼Ð¾Ð´ÐµÐ»Ð° Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е, Ñ\81Ñ\8aздадени Ñ\81 Ð¼Ð¾Ð´ÐµÐ» Ð½Ð° Ñ\81Ñ\8aдÑ\8aÑ\80жаниеÑ\82о Ñ\80азлиÑ\87ен Ð¾Ñ\82 Ñ\82ози Ð¿Ð¾ Ð¿Ð¾Ð´Ñ\80азбиÑ\80ане.",
        "logentry-contentmodel-change-revertlink": "връщане",
        "logentry-contentmodel-change-revert": "връщане",
        "protectlogpage": "Дневник на защитата",
        "protect-locked-blocked": "Не можете да променяте нивата на защита на страниците, докато сте блокиран(а). Текущите настройки за страницата „'''$1'''“ са:",
        "protect-locked-dblock": "Нивата на защита на страниците не могат да бъдат променяни, защото базата от данни е заключена. Ето текущите настройки за страницата „'''$1'''“:",
        "protect-locked-access": "Нямате правото да променяте нивата на защита на страниците. Ето текущите настройки за страницата „'''$1'''“:",
-       "protect-cascadeon": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита. Можете да промените нивото на защита на страницата, но това няма да повлияе върху каскадната защита.",
+       "protect-cascadeon": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита.\nМожете да промените нивото на защита на страницата, но това няма да повлияе върху каскадната защита.",
        "protect-default": "Позволяване за всички потребители",
        "protect-fallback": "Позволяване само за потребители с права на „$1“",
        "protect-level-autoconfirmed": "Позволено само за автоматично одобрени потребители",
        "protect-expiring-local": "срок на изтичане $1",
        "protect-expiry-indefinite": "безсрочно",
        "protect-cascade": "Каскадна защита — защита на всички страници, включени в настоящата страница.",
-       "protect-cantedit": "Не можете да промените нивото на защита на тази страницата, защото нямате права да я редактирате.",
+       "protect-cantedit": "Не можете да промените нивото на защита на тази страница, защото нямате права да я редактирате.",
        "protect-othertime": "Друг срок:",
        "protect-othertime-op": "друг срок",
        "protect-existing-expiry": "Оставащо време: $2, $3",
        "undeletepagetext": "{{PLURAL:$1|Следната страница беше изтрита, но все още се намира в архива и може да бъде възстановена|Следните $1 страници бяха изтрити, но все още се намират в архива и могат да бъдат възстановени}}. Архивът може да се почиства от време на време.",
        "undelete-fieldset-title": "Възстановяване на версии",
        "undeleteextrahelp": "За възстановяване на пълната история на страницата не се слагат отметки и се натиска '''''{{int:undeletebtn}}'''''.\nЗа частично възстановяване се поставят отметки на тези версии на страницата, които трябва да бъдат възстановени, след което се натиска '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|Една версия беше архивирана|$1 версии бяха архивирани}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|версия беше изтрита|версии бяха изтрити}}",
        "undeletehistory": "Ако възстановите страницата, всички версии ще бъдат върнати в историята.\nАко след изтриването е създадена страница със същото име, възстановените версии ще се появят като по-ранна история, а текущата версия на страницата няма да бъде заменена автоматично. Също така обърнете внимание, че ограниченията, приложени върху версиите, ще се загубят след възстановяването.",
        "undeleterevdel": "Възстановяването няма да бъде изпълнено, ако би довело до частично изтриване на актуалната версия. В такъв случай актуалната версия не трябва да бъде избирана или пък състоянието й трябва да бъде променено на нормална (нескрита) версия. Версиите на файлове, които нямате право да преглеждате, няма да бъдат възстановени.",
        "undeletehistorynoadmin": "Тази страница е била изтрита. В резюмето отдолу е посочена причината за това, заедно с информация за потребителите, редактирали страницата преди изтриването й. Конкретното съдържание на изтритите версии е достъпно само за администратори.",
        "undeleteviewlink": "преглеждане",
        "undeleteinvert": "Обръщане на избора",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "{{PLURAL:$1|Една версия беше възстановена|$1 версии бяха възстановени}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Една версия|$1 версии}} и {{PLURAL:$1|един файл|$2 файла}} бяха възстановени",
-       "undeletedfiles": "{{PLURAL:$1|Един файл беше възстановен|$1 файла бяха възстановени}}",
        "cannotundelete": "Една или повече операции по възстановяване се провалиха:\n$1",
        "undeletedpage": "'''Страницата „$1“ беше възстановена.'''\n\nМожете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].",
        "undelete-header": "Прегледайте [[Special:Log/delete|дневника на изтриванията]] за текущо изтритите страници.",
        "undelete-search-prefix": "Показване на страници, започващи със:",
        "undelete-search-submit": "Търсене",
        "undelete-no-results": "Не са намерени страници, отговарящи на търсения критерий.",
-       "undelete-filename-mismatch": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емеви Ð¾Ñ\82пеÑ\87аÑ\82Ñ\8aк $1: несъответствие в името на файла",
-       "undelete-bad-store-key": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емеви Ð¾Ñ\82пеÑ\87аÑ\82Ñ\8aк $1: файлът е липсвал преди изтриването.",
+       "undelete-filename-mismatch": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емева Ð¾Ñ\82меÑ\82ка $1: несъответствие в името на файла",
+       "undelete-bad-store-key": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емева Ð¾Ñ\82меÑ\82ка $1: файлът е липсвал преди изтриването.",
        "undelete-cleanup-error": "Грешка при изтриване на неизползвания архивен файл „$1“.",
        "undelete-missing-filearchive": "Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни. Вероятно вече е възстановен.",
        "undelete-error": "Грешка при възстановяване на страницата",
        "sp-contributions-uploads": "качвания",
        "sp-contributions-logs": "дневници",
        "sp-contributions-talk": "беседа",
-       "sp-contributions-userrights": "управление на потребителските права",
+       "sp-contributions-userrights": "управление на {{GENDER:$1|потребителските}} права",
        "sp-contributions-blocked-notice": "Потребителят понастоящем е блокиран.\nЗа справка по-долу е показан последния запис за него от дневника на блокиранията:",
        "sp-contributions-blocked-notice-anon": "Този IP адрес понастоящем е блокиран.\nЗа повече информация можете да прегледате последният запис в Дневника на блокиранията:",
        "sp-contributions-search": "Търсене на приноси",
        "unblock": "Отблокиране на потребител",
        "blockip": "Блокиране на {{GENDER:$1|потребител}}",
        "blockip-legend": "Блокиране на потребител",
-       "blockiptext": "Формулярът по-долу се използва, за да се забрани правото на писане\nна определен IP-адрес или потребител.\nТова трябва да се направи само за да се предотвратят прояви на вандализъм\nи в съответствие с [[{{MediaWiki:Policy-url}}|политиката за поведение]] в {{SITENAME}}.\nНеобходимо е да се посочи и причина за блокирането (например заглавия на страници, станали обект на вандализъм).",
+       "blockiptext": "Формулярът по-долу се използва, за да се забрани правото на писане на определен IP-адрес или потребителско име.\nТова трябва да се направи само за предотвратяване прояви на вандализъм\nи в съответствие с [[{{MediaWiki:Policy-url}}|политиката за поведение]].\nНеобходимо е да се посочи и причина за блокирането (например заглавия на страници, станали обект на вандализъм).\nМожете да блокирате диапазон от IP-адреси чрез синтаксиса на [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; максималният позволен диапазон е /$1 за IPv4 и /$2 за IPv6.",
        "ipaddressorusername": "IP-адрес или потребител:",
        "ipbexpiry": "Срок:",
        "ipbreason": "Причина:",
        "ipb-confirmhideuser": "На път сте да блокирате потребител, който е \"скрит потребител\". Това действие ще заличи потребителското име от всички списъци и дневници. Наистина ли желаете да направите това?",
        "ipb-edit-dropdown": "Причини за блокиране",
        "ipb-unblock-addr": "Отблокиране на $1",
-       "ipb-unblock": "Отблокиране на потребителско име IP-адрес",
+       "ipb-unblock": "Отблокиране на потребителско име или IP-адрес",
        "ipb-blocklist": "Преглед на текущите блокирания",
        "ipb-blocklist-contribs": "Приноси на {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "{{PLURAL:$1|остава още $1|остават още $1}}",
        "unblocked-id": "Блок № $1 беше премахнат",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] е отблокиран.",
        "blocklist": "Блокирани потребители",
+       "autoblocklist": "Автоматични блокирания",
+       "autoblocklist-submit": "Търсене",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Локално автоматично блокиране|Локални автоматични блокирания}}",
+       "autoblocklist-empty": "Списъкът на автоматичните блокирания е празен.",
        "ipblocklist": "Блокирани потребители",
        "ipblocklist-legend": "Търсене на блокиран потребител",
        "blocklist-userblocks": "Скриване на блокирани потребителски сметки",
-       "blocklist-tempblocks": "Скриване на срочни блокирания",
+       "blocklist-tempblocks": "Скриване на временни блокирания",
        "blocklist-addressblocks": "Скриване на отделни блокирани IP адреси",
        "blocklist-rangeblocks": "Скриване на блокиранията по IP диапазон",
        "blocklist-timestamp": "Дата и час",
        "blocklog-showsuppresslog": "Потребителят е бил блокиран и прикриван в миналото.\nЗа справка по-долу е дадено извлечение от дневника на прикриванията:",
        "blocklogentry": "блокира [[$1]] със срок на изтичане $2 $3",
        "reblock-logentry": "промени параметрите на блокирането на [[$1]] със срок на изтичане $2 $3",
-       "blocklogtext": "Тази страница съдържа дневник на блокиранията и отблокиранията.\nАвтоматично блокираните IP-адреси не са показани.\nВижте [[Special:BlockList|списъка на блокираните IP-адреси]] за текущото състояние на блокиранията.",
+       "blocklogtext": "Тази страница съдържа дневник на блокиранията и отблокиранията, извършени от потребителя.\nАвтоматично блокираните IP-адреси не са показани.\nВижте [[Special:BlockList|списъка на блокираните потребители]] за активните към момента блокирания.",
        "unblocklogentry": "отблокира $1",
        "block-log-flags-anononly": "само анонимни потребители",
        "block-log-flags-nocreate": "създаването на сметки е изключено",
        "lockedbyandtime": "(от $1 на $2 в $3)",
        "move-page": "Преместване на $1",
        "move-page-legend": "Преместване на страница",
-       "movepagetext": "Използването на формуляра по-долу ще преименува страница, като се премести цялата ѝ редакционна история история на новото име. Старото заглавие ще се превърне в пренасочваща страница.\nМоже да се избере възможност пренасочванията към оригиналното заглавие да бъдат обновени автоматично. В случай, че тази възможност не е избрана, препоръчително е да се провери за [[Special:DoubleRedirects|двойни]] или [[Special:BrokenRedirects|невалидни пренасочвания]].\nВие сами би трябвало да се убедите в това дали препратките продължават да сочат там, където се предполага.\n\nОбърнете внимание, че страницата '''няма''' да бъде преместена, ако вече съществува страница с новото име, освен ако е празна или пренасочване и няма редакционна история.\n\n'''ВНИМАНИЕ!'''\nТова може да е голяма и неочаквана промяна за известна страница. Уверете се, че разбирате последствията, преди да продължите.",
-       "movepagetext-noredirectfixer": "С помощта на формуляра по-долу се преименува страница, като цялата ѝ редакционна история се премества под новото име.\nСтарото име ще остане като пренасочваща страница към новото заглавие.\nЖелателно е преди преместването да се извърши проверка за [[Special:DoubleRedirects|двойни]] или [[Special:BrokenRedirects|невалидни пренасочвания]].\nДобре е да се направи проверка дали препратките продължават да сочат там, където се предполага.\n\nВажно е да се знае, че страницата '''няма''' да бъде преместена, ако вече съществува страница с новото име, освен ако не е празна или пренасочваща страница и няма налична редакционна история.\nТова означава, че ако една страница бъде преименувана по погрешка, тя може да се премести обратно със старото си заглавие, но не може да се замести съществуваща страница.\n\n'''Предупреждение!'''\nТова може да е драстична или неочаквана промяна за някоя популярна страница;\nнеобходимо е да се уверите, че разбирате последствията от това преди да предприемете действието.",
-       "movepagetalktext": "Ако съществува, съответната дискусионна страница ще бъде преместена автоматично заедно с нея, '''освен ако:'''\n* не местите страницата от едно именно пространство в друго,\n* вече съществува непразна дискусионна страница с това име или\n* не сте отметнали долната кутийка.\n\nВ тези случаи, ако желаете, ще е необходимо да преместите страницата ръчно.",
+       "movepagetext": "Използването на формуляра по-долу ще преименува страница, като се премести цялата ѝ редакционна история история на новото име. Старото заглавие ще се превърне в пренасочваща страница.\nМоже да се избере възможност пренасочванията към оригиналното заглавие да бъдат обновени автоматично. В случай, че тази възможност не е избрана, препоръчително е да се провери за [[Special:DoubleRedirects|двойни]] или [[Special:BrokenRedirects|невалидни пренасочвания]].\nВие сами би трябвало да се убедите в това дали препратките продължават да сочат там, където се предполага.\n\nОбърнете внимание, че страницата <strong>няма</strong> да бъде преместена, ако вече съществува страница с новото име, освен ако е празна или пренасочване и няма редакционна история.\n\n<strong>Забележка:</strong>\nТова може да е голяма и неочаквана промяна за известна страница. Уверете се, че разбирате последствията, преди да продължите.",
+       "movepagetext-noredirectfixer": "С помощта на формуляра по-долу се преименува страница, като цялата ѝ редакционна история се премества под новото име.\nСтарото име ще остане като пренасочваща страница към новото заглавие.\nЖелателно е преди преместването да се извърши проверка за [[Special:DoubleRedirects|двойни]] или [[Special:BrokenRedirects|невалидни пренасочвания]].\nДобре е да се направи проверка дали препратките продължават да сочат там, където се предполага.\n\nВажно е да се знае, че страницата <strong>няма</strong> да бъде преместена, ако вече съществува страница с новото име, освен ако не е празна или пренасочваща страница и няма налична редакционна история.\nТова означава, че ако една страница бъде преименувана по погрешка, тя може да се премести обратно със старото си заглавие, но не може да се замести съществуваща страница.\n\n<strong>Забележка:</strong>\nТова може да е драстична или неочаквана промяна за някоя популярна страница;\nнеобходимо е да се уверите, че разбирате последствията от това преди да предприемете действието.",
+       "movepagetalktext": "Ако поставите отметка, свързаната дискусионна страница ще бъде преместена автоматично към новото заглавие, освен ако под това име не съществува друга дискусионна страница със съдържание.\n\nВ този случай, ако желаете, ще е необходимо да преместите или да слеете страницата ръчно.",
        "moveuserpage-warning": "'''Внимание:''' Предприели сте опит да преместите потребителска страница. Забележете, че от преместването на страницата '''няма''' да последва преименуване на потребителя.",
        "movecategorypage-warning": "<strong>Внимание:</strong> На път сте да преместите категорийна страница. Моля, обърнете внимание, че ще бъде преместена само страницата на категорията. <em>Никоя</em> от страниците в старата категория <em>няма</em> да бъде прекатегоризирана.",
        "movenologintext": "Необходимо е да [[Special:UserLogin|влезете]], за да може да премествате страници.",
        "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-moved-noredirect": "Създаването на пренасочване беше спряно.",
        "articleexists": "Вече съществува страница с това име или името, което сте избрали, е невалидно. Изберете друго име.",
        "cantmove-titleprotected": "Страницата не може да бъде преместена под новото заглавие, тъй като то е защитено от създаване",
-       "movetalk": "Ð\9fÑ\80емеÑ\81Ñ\82ване Ð¸ Ð½Ð° Ð´Ð¸Ñ\81кÑ\83Ñ\81ионнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а, Ð°ÐºÐ¾ Ðµ Ð¿Ñ\80иложимо.",
+       "movetalk": "Ð\9fÑ\80емеÑ\81Ñ\82ване Ð¸ Ð½Ð° Ð±ÐµÑ\81едаÑ\82а, Ð°ÐºÐ¾ Ðµ Ð¿Ñ\80иложимо",
        "move-subpages": "Преместване на всички подстраници (до $1)",
        "move-talk-subpages": "Преместване на всички подстраници на беседата (до $1)",
        "movepage-page-exists": "Страницата $1 вече съществува и няма да бъде автоматично презаписана.",
        "move-leave-redirect": "Оставяне на пренасочваща страница от старото към новото заглавие",
        "protectedpagemovewarning": "'''Внимание:''' Тази страница е защитена и само потребители със статут на администратори могат да я преместят.\nЗа справка по-долу е показан последният запис от дневниците.",
        "semiprotectedpagemovewarning": "'''Внимание:''' Тази страница е защитена и само регистрирани потребители могат да я преместят.\nЗа справка по-долу е показан последният запис от дневниците.",
-       "move-over-sharedrepo": "== Файлът вече съществува ==\n[[:$1]] вече съществува в споделеното хранилище. Преместване на файл с това заглавие ще замени споделения файл.",
+       "move-over-sharedrepo": "[[:$1]] вече съществува в споделеното хранилище. Преместване на файл с това заглавие ще замени споделения файл.",
        "file-exists-sharedrepo": "Избраното име на файл вече се използва от файл в сопделеното хранилище.\nНеобходимо е да изберете друго име.",
        "export": "Изнасяне на страници",
        "exporttext": "Тук можете да изнесете като XML текста и историята на една или повече страници. Получените данни можете да вмъкнете в друг сайт, използващ софтуера МедияУики, чрез [[Special:Import|неговата страница за внaсяне]].\n\nЗа да изнесете няколко страници, въвеждайте всяко ново заглавие на '''нов ред'''. След това изберете дали искате само текущата версия (заедно с информация за последната редакция) или всички версии (заедно с текущата) на страницата.\n\nАко желаете само текущата версия, бихте могли да използвате препратка от вида [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за страницата [[{{MediaWiki:Mainpage}}]].",
        "import-nonewrevisions": "Не са импортирани версии (всички вече съществуват или са пропуснати поради грешки).",
        "xml-error-string": "$1 на ред $2, колона $3 (байт $4): $5",
        "import-upload": "Качване на XML данни",
-       "import-token-mismatch": "Ð\97агÑ\83бени Ñ\81а Ð´Ð°Ð½Ð½Ð¸Ñ\82е Ð·Ð° Ñ\81еÑ\81иÑ\8fÑ\82а. Ð\9eпиÑ\82айÑ\82е Ð¾Ñ\82ново.",
+       "import-token-mismatch": "Ð\97агÑ\83ба Ð½Ð° Ð´Ð°Ð½Ð½Ð¸Ñ\82е Ð·Ð° Ñ\82екÑ\83Ñ\89аÑ\82а Ñ\81еÑ\81иÑ\8f.\n\nÐ\9cоже Ð±Ð¸ Ñ\81Ñ\82е Ð¸Ð·Ð»ÐµÐ·Ð»Ð¸ Ð¾Ñ\82 Ñ\81иÑ\81Ñ\82емаÑ\82а. <strong>Ð\9cолÑ\8f, Ñ\83веÑ\80еÑ\82е Ñ\81е, Ñ\87е Ñ\81Ñ\82е Ð²Ð»ÐµÐ·Ð»Ð¸ Ð² Ð¿Ñ\80оÑ\84ила Ñ\81и Ð¸ Ð¾Ð¿Ð¸Ñ\82айÑ\82е Ð¾Ñ\82ново</strong>.\nÐ\90ко Ð²Ñ\81е Ð¾Ñ\89е Ð½Ðµ Ñ\80абоÑ\82и, Ð¾Ð¿Ð¸Ñ\82айÑ\82е Ð´Ð° [[Special:UserLogout|излезеÑ\82е]] Ð¸ Ð´Ð° Ð²Ð»ÐµÐ·ÐµÑ\82е Ð¾Ñ\82ново, Ñ\81Ñ\8aÑ\89о Ñ\82ака Ð¿Ñ\80овеÑ\80еÑ\82е Ð´Ð°Ð»Ð¸ Ð±Ñ\80аÑ\83зÑ\8aÑ\80Ñ\8aÑ\82 Ð²Ð¸ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñ\8fва Ð±Ð¸Ñ\81квиÑ\82ки Ð¾Ñ\82 Ñ\82ози Ñ\81айÑ\82.",
        "import-invalid-interwiki": "Не може да бъде извършено внасяне от посоченото уики.",
        "import-error-edit": "Страницата „$1“ не беше импортирана, тъй като нямате права да я редактирате.",
        "import-error-create": "Страницата „$1“ не беше импортирана, тъй като нямате права да я създадете.",
        "tooltip-t-recentchangeslinked": "Последните промени на страници, сочени от тази страница",
        "tooltip-feed-rss": "RSS feed за страницата",
        "tooltip-feed-atom": "Atom feed за страницата",
-       "tooltip-t-contributions": "Ð\9fоказване на приносите на {{GENDER:$1|потребителя}}",
+       "tooltip-t-contributions": "СпиÑ\81Ñ\8aк на приносите на {{GENDER:$1|потребителя}}",
        "tooltip-t-emailuser": "Изпращане на писмо до {{GENDER:$1|потребителя}}",
        "tooltip-t-info": "Повече за тази страница",
        "tooltip-t-upload": "Качи файлове",
        "anonymous": "{{PLURAL:$1|Анонимен потребител|Анонимни потребители}}на {{SITENAME}}",
        "siteuser": "потребител на {{SITENAME}} $1",
        "anonuser": "Анонимен потребител на {{SITENAME}} $1",
-       "lastmodifiedatby": "Ð\9fоÑ\81леднаÑ\82а Ð¿Ñ\80омÑ\8fна Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ðµ Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ена Ð¾Ñ\82 $3 Ð½Ð° $2, $1.",
+       "lastmodifiedatby": "Ð\9fоÑ\81леднаÑ\82а Ð¿Ñ\80омÑ\8fна Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ðµ Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ена Ð¾Ñ\82 $3 Ð² $2 Ñ\87. Ð½Ð° $1 Ð³.",
        "othercontribs": "Основаващо се върху работа на $1.",
        "others": "други",
        "siteusers": "{{PLURAL:$2|потребителят|потребителите}} на {{SITENAME}} $1",
        "pageinfo-header-properties": "Характеристики на страницата",
        "pageinfo-display-title": "Показвано заглавие",
        "pageinfo-default-sort": "Ключ за сортиране по подразбиране",
-       "pageinfo-length": "Ð\94Ñ\8aлжина на страницата (в байтове)",
+       "pageinfo-length": "РазмеÑ\80 на страницата (в байтове)",
        "pageinfo-article-id": "Номер на страницата",
        "pageinfo-language": "Език на съдържанието на страницата",
+       "pageinfo-language-change": "промяна",
        "pageinfo-content-model": "Модел на съдържанието на страницата",
        "pageinfo-content-model-change": "промяна",
        "pageinfo-robot-policy": "Индексиране от роботи",
        "pageinfo-user-id": "Потребителски номер",
        "markaspatrolleddiff": "Отбелязване като проверена редакция",
        "markaspatrolledtext": "Отбелязване на редакцията като проверена",
-       "markaspatrolledtext-file": "Ð\9cаÑ\80киÑ\80ай версията на файла като проверена",
+       "markaspatrolledtext-file": "Ð\9eÑ\82белÑ\8fзване Ð½Ð° версията на файла като проверена",
        "markedaspatrolled": "Проверена редакция",
        "markedaspatrolledtext": "Избраната редакция на [[:$1]] беше отбелязана като патрулирана.",
        "rcpatroldisabled": "Патрулът е деактивиран",
        "newimages-summary": "Тази специална страница показва последно качените файлове.",
        "newimages-legend": "Име на файл",
        "newimages-label": "Име на файл (или част от него):",
+       "newimages-user": "IP-адрес или потребителско име",
        "newimages-showbots": "Показване на качвания от ботове",
        "newimages-hidepatrolled": "Скрий проверените качвания",
        "noimages": "Няма нищо.",
        "exif-originalimageheight": "Височина на изображението преди намаляването",
        "exif-originalimagewidth": "Ширина на изображението преди намаляването",
        "exif-compression-1": "Некомпресиран",
-       "exif-copyrighted-true": "Заштитено со авторски права",
-       "exif-copyrighted-false": "Статута на авторските права не е указан",
+       "exif-copyrighted-true": "Заштитено с авторски права",
+       "exif-copyrighted-false": "Статутът на авторските права не е указан",
        "exif-unknowndate": "Неизвестна дата",
        "exif-orientation-1": "Нормално",
        "exif-orientation-2": "Отражение по хоризонталата",
        "version-poweredby-others": "други",
        "version-poweredby-translators": "преводачи в translatewiki.net",
        "version-credits-summary": "Бихме искали да изкажем признателност на следните хора за техните приноси към [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki е свободен софтуер, можете да го разпространявате и/или променяте съгласно условията на GNU General Public License, както е публикуван от Free Software Foundation, версия 2 на лиценза или (по ваше усмотрение) която и да е следваща версия.\n\nMediaWiki се разпространява с надеждата, че ще бъде полезен, но БЕЗ НИКАКВИ ГАРАНЦИИ, без дори косвена гаранция за ПРОДАВАЕМОСТ или ПРИГОДНОСТ ЗА КОНКРЕТНА УПОТРЕБА. Вижте GNU General Public License за повече подробности.\n\nТрябва да сте получили [{{SERVER}}{{SCRIPTPATH}}/COPYING копие на GNU General Public License] заедно с тази програма. Ако не сте, пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или го [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочетете в мрежата].",
+       "version-license-info": "МедияУики е свободен софтуер, можете да го разпространявате и/или променяте съгласно условията на GNU General Public License, както е публикуван от Free Software Foundation, версия 2 на лиценза или (по ваше усмотрение) която и да е следваща версия.\n\nМедияУики се разпространява с надеждата, че ще бъде полезен, но БЕЗ НИКАКВИ ГАРАНЦИИ, без дори косвена гаранция за ПРОДАВАЕМОСТ или ПРИГОДНОСТ ЗА КОНКРЕТНА УПОТРЕБА. Вижте GNU General Public License за повече подробности.\n\nТрябва да сте получили [{{SERVER}}{{SCRIPTPATH}}/COPYING копие на GNU General Public License] заедно с тази програма. Ако не сте, пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или го [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочетете в мрежата].",
        "version-software": "Инсталиран софтуер",
        "version-software-product": "Продукт",
        "version-software-version": "Версия",
        "version-libraries-license": "Лиценз",
        "version-libraries-description": "Описание",
        "version-libraries-authors": "Автори",
+       "redirect": "Пренасочване по идентификатор на файл, потребител, страница, версия или запис от дневника",
+       "redirect-summary": "Тази специална страница пренасочва към файл (като се има предвид името на файла), към страница (по зададена версия или номер на страницата), към потребителска страница (по зададен потребителски номер), или към запис от дневника (по зададен номер на записа). <br />\nИзползване: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], или [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Отваряне",
+       "redirect-lookup": "Параметър:",
        "redirect-value": "Стойност:",
        "redirect-user": "Потребителски номер",
        "redirect-page": "Номер на страницата",
        "redirect-revision": "Версия на страницата",
        "redirect-file": "Име на файл",
+       "redirect-logid": "Номер на записа",
        "redirect-not-exists": "Стойността не е намерена",
        "fileduplicatesearch": "Търсене на повтарящи се файлове",
        "fileduplicatesearch-summary": "Търсене на повтарящи се файлове на база хеш стойности.",
        "tags-edit-title": "Редактиране на етикетите",
        "tags-edit-manage-link": "Управление на етикетите",
        "tags-edit-revision-selected": "{{PLURAL:$1|Избрана версия|Избрани версии}} от [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Избрано събитие|Избрани събития}}:",
        "tags-edit-revision-legend": "Добавяне или премахване на етикети от {{PLURAL:$1|тази редакция|всичките $1 редакции}}",
        "tags-edit-existing-tags": "Съществуващи етикети:",
        "tags-edit-existing-tags-none": "<em>Няма</em>",
        "htmlform-time-placeholder": "ЧЧ:ММ:СС",
        "htmlform-datetime-placeholder": "ГГГГ-ММ-ДД ЧЧ:ММ:СС",
        "htmlform-date-invalid": "Избраната от вас стойност за дата не е разпозната. Опитайте да използвате формат ГГГГ-ММ-ДД.",
+       "htmlform-datetime-invalid": "Избраната от вас стойност за дата не е разпозната. Опитайте да използвате формат ГГГГ-ММ-ДД ЧЧ:ММ:СС.",
        "htmlform-title-badnamespace": "[[:$1]] не е в именното пространство \"{{ns:$2}}\".",
        "htmlform-title-not-exists": "$1 не съществува.",
        "htmlform-user-not-exists": "<strong>$1</strong> не съществува.",
        "htmlform-user-not-valid": "<strong>$1</strong> не е валидно потребителско име.",
        "logentry-delete-delete": "$1 {{GENDER:$2|изтри}} страницата $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|възстанови}} страницата $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|изтри}} пренасочване $3 чрез препокриване",
+       "logentry-delete-restore": "$1 {{GENDER:$2|възстанови}} страницата $3 ($4)",
        "logentry-delete-revision": "$1 {{GENDER:$2|промени}} видимостта на {{PLURAL:$5|една редакция|$5 редакции}} в страница $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|промени}} видимостта на събитията от дневниците за страница $3",
        "logentry-delete-revision-legacy": "$1 {{GENDER:$2|промени}} видимостта на версиите на страница $3",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|промени}} потребителската група на $3",
        "logentry-rights-autopromote": "$1 е автоматично {{GENDER:$2|повишен|повишена}} от $4 до $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|качи}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|качи}} нова версия на $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|качи}} $3",
+       "log-name-managetags": "Дневник на управлението на етикети",
+       "log-description-managetags": "На тази страница са изброени задачи, свързани с управлението на [[Special:Tags|етикети]]. Дневникът съдържа само действия, извършвани ръчно от администратор. Етикети могат да бъдат създавани или изтривани от уики софтуера без това да бъде отразено в този дневник.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|създаде}} етикета \"$4\"",
+       "log-name-tag": "Дневник на етикетите",
+       "log-description-tag": "Тази страница показва, кога потребителите са добавили или премахнали [[Special:Tags|етикети]] от отделни версии или записи. Списъкът не включва подобни действия, когато те се появяват, като част от процеса на редактиране, изтриване или подобни действия.",
        "rightsnone": "(никакви)",
-       "revdelete-summary": "резюме",
        "feedback-adding": "Добавяне на коментар към страницата...",
        "feedback-back": "Обратно",
        "feedback-bugcheck": "Страхотно! Само проверете дали това не сред вече [$1 докладваните грешки].",
        "api-error-emptypage": "Създаването на нови, празени страници, не е разрешено.",
        "api-error-publishfailed": "Вътрешна грешка: Сървърът не успя да съхрани временния файл.",
        "api-error-stashfailed": "Вътрешна грешка: Сървърът не успя да съхрани временния файл.",
-       "api-error-unknown-warning": "Непознато предупреждение: „$1“",
+       "api-error-unknown-warning": "Непознато предупреждение: „$1“.",
        "api-error-unknownerror": "Неизвестна грешка: „$1“.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунди}}",
        "duration-minutes": "$1 {{PLURAL:$1|минута|минути}}",
        "pagelang-select-lang": "Избиране на език",
        "pagelang-reason": "Причина",
        "pagelang-submit": "Изпращане",
+       "pagelang-nonexistent-page": "Страницата $1 не съществува.",
        "right-pagelang": "Промяна езика на страница",
        "action-pagelang": "промяна езика на страницата",
        "log-name-pagelang": "Дневник на езиковите промени",
        "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-bytespertype": "Пълен размер на файловете за този раздел: {{PLURAL:$1|$1 байт|$1 байта}} ($2; $3%).",
+       "mediastatistics-allbytes": "Общ размер на всички файлове: {{PLURAL:$1|$1 байт|$1 байта}} ($2).",
        "mediastatistics-table-mimetype": "MIME тип",
        "mediastatistics-table-extensions": "Възможни разширения",
        "mediastatistics-table-count": "Брой файлове",
        "mediastatistics-header-audio": "Аудио",
        "mediastatistics-header-video": "Видео",
        "mediastatistics-header-multimedia": "Мултимедия",
+       "mediastatistics-header-office": "Офис",
        "mediastatistics-header-total": "Всички файлове",
        "json-error-syntax": "Синтактична грешка",
        "headline-anchor-title": "Препратка към този раздел",
        "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": "Добавяне на категория...",
+       "date-range-from": "От дата:",
+       "date-range-to": "До дата:",
        "randomrootpage": "Случайна основна страница",
        "log-action-filter-block": "Вид на блокирането:",
        "log-action-filter-delete": "Вид на изтриването:",
        "log-action-filter-block-block": "Блокиране",
        "log-action-filter-block-reblock": "Промяна на блокирането",
        "log-action-filter-block-unblock": "Отблокиране",
+       "log-action-filter-contentmodel-change": "Промяна на модела на съдържанието",
        "log-action-filter-delete-delete": "Изтриване на страница",
        "log-action-filter-delete-restore": "Възстановяване на страница",
+       "log-action-filter-managetags-create": "Създаване на етикети",
        "log-action-filter-managetags-delete": "Премахване на етикет",
        "log-action-filter-managetags-activate": "Активиране на етикет",
        "log-action-filter-managetags-deactivate": "Деактивиране на етикет",
+       "log-action-filter-newusers-autocreate": "Автоматично създаване",
+       "log-action-filter-protect-protect": "Защита",
+       "log-action-filter-protect-unprotect": "Сваляне на защитата",
+       "log-action-filter-rights-rights": "Ръчна промяна",
+       "log-action-filter-rights-autopromote": "Автоматична промяна",
        "log-action-filter-upload-upload": "Ново качване",
        "log-action-filter-upload-overwrite": "Повторно качване",
+       "authmanager-create-disabled": "Създаването на сметки е изключено.",
        "authmanager-authplugin-setpass-bad-domain": "Невалиден домейн.",
+       "authmanager-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
        "authmanager-retype-help": "Парола (повторно) за потвърждение.",
        "authmanager-email-label": "Е-поща",
        "authmanager-email-help": "Електронна поща",
        "authmanager-realname-help": "Истинско име на потребителя",
        "authmanager-provider-temporarypassword": "Временна парола",
        "authprovider-resetpass-skip-label": "Пропусни",
+       "authform-notoken": "Липсва маркер",
        "specialpage-securitylevel-not-allowed-title": "Не е позволено",
-       "cannotauth-not-allowed-title": "Достъпът е отказан"
+       "cannotauth-not-allowed-title": "Достъпът е отказан",
+       "cannotauth-not-allowed": "Не ви е позволено да използвате тази страница",
+       "credentialsform-account": "Име на сметка:",
+       "linkaccounts": "Свързване на сметки",
+       "linkaccounts-success-text": "Сметката беше свързана.",
+       "linkaccounts-submit": "Свързване на сметки",
+       "restrictionsfield-badip": "Невалиден IP-адрес или интервал от адреси: $1",
+       "revid": "версия $1"
 }
index af8c1e1..2e64623 100644 (file)
        "externaldberror": "بئ مئلوماتین بانکی تا یک اوتوماتیکین خطا ئی رخ داته و یا ایکه شما وتئ خارجی ئین حسابئ شما اپڈیٹ کورتینی ئی اجازه ئا نداریت.",
        "login": "داخل بوتین",
        "nav-login-createaccount": "داخل بوتین  / کار زوروکین حسابي جوڑ کورتین",
-       "userlogin": "داخل بوتین  / کار زوروکین حسابي جوڑ کورتین",
-       "userloginnocreate": "داخل بوتین",
        "logout": "در بوتین",
        "userlogout": "در بوتین",
        "notloggedin": "لاگین نه بوته‌ئیت",
        "userlogin-noaccount": "شما کار زوروکین حسابئ نداریت؟",
        "userlogin-joinproject": "بی  {{SITENAME}} تا نام‌نویسی کنیت!",
-       "nologin": "شما کار زوروکین حسابئ نداریت ؟ $1.",
-       "nologinlink": "یک نوکین کار زوروکین حسابئ جوڑ کنیت",
        "createaccount": "نوکین کار زوروکین حسابئ جوڑ کورتین",
-       "gotaccount": "شما کار زوروکین حسابئ داریت ؟ $1.",
-       "gotaccountlink": "داخل بوتین",
-       "userlogin-resetlink": "وتئ داخل بوتینئ مئلوماتان شه هوشا بورته ئیت؟",
        "userlogin-resetpassword-link": "شمی پاسورد شه شمی دهوشا شُوته؟",
        "userlogin-helplink2": "کومک گو داخل بوتینا",
        "userlogin-loggedin": "شما انون بی ئنوان {{GENDER:$1|$1}} داخل بوته ئیت .\nشه جهلگین فورما په داخل بوتینا بی ئنوان دیگرین کار زوروکا استفاده بکنیت .",
        "createacct-another-email-ph": "ایمیل ادرسی داخل کورتین",
        "createaccountmail": "استفاده شه تصادفین پاسوردا و آیی دیم داتین بی مشخصین ایمیل ادرسیا",
        "createacct-realname": "واقئین نام (اختیاری)",
-       "createaccountreason": "دلیل:",
        "createacct-reason": "دلیل",
        "createacct-reason-ph": "پچی شما لوٹیت که دیگرین کار زوروکین حساب جوڑ کنیت؟",
        "createacct-submit": "وتي کار زوروکین حسابا جوڑ کنیت",
        "preview": "دیم دیست",
        "showpreview": "دیم دیست",
        "showdiff": "تغیراتانئ نشان داتین",
-       "blankarticle": "<strong>هشدار:</strong> شما انون یک خالین تاکدیمی جوڑ کورتینی حالا وَیت .\nاگر «{{int:savearticle}}» ئا پدا  کلیک کنیت، یک تاکدیمی بدون شه محتوائا جوڑ ئه بیئت.",
+       "blankarticle": "<strong>هشدار:</strong> شما انون یک خالین تاکدیمی جوڑ کورتینی حالا وَیت .\nاگر «$1» ئا پدا  کلیک کنیت، یک تاکدیمی بدون شه محتوائا جوڑ ئه بیئت.",
        "anoneditwarning": "<strong>هشدار:</strong> شما داخل نه بوته ئیت. شمی آی‌پی نشانگ ئا موچی ئه تواننت بگیندنت اگر شما هر تغیری بیاریت . اگر <strong>[$1 داخل بئیت]</strong> یا <strong>[$2 یک کار زوروکین حساب جوڑ بکنیت]</strong>، شمی ایڈیٹ\t بی شمی کار زوروکین ناما شینک ئه بیئنت و گون گو دیگرین مزایان .",
        "anonpreviewwarning": "<em>شما لوگین نه بوته ئیت. ذخیره کورتین باعث ئه بیئت که شمی آی پی ادرس بی ای تاکدیمی تاریخچه ئی تا ثبت بیئت.</em>",
        "missingcommenttext": "مهربانی بکنیت جهلگا توضیح دهیت.",
        "editingsection": "به $1 ئی دستکاری کورتینێ حالا (چونڑ)",
        "editingcomment": "بئ $1 ئی ایڈیٹ کورتینئ حالا (نوکین بخش)",
        "editconflict": "هجومین ایڈیٹ: $1",
-       "explainconflict": "شه وختی که شما ای دیمێ دستکاری ئا شرو کورتێت یک دیگه نپری آیرا ٹگل دات.\nبُرزگین متنین جاگه شامل ئه بیت شه اي دیمێ رقم، به انونین حالتێ تا.\nشمێ ٹگل به متنێ جهلگا نشان داته بوته انت.\nشما باید وتي ٹگل ئانه گۆ انونین متنا لۆڑ کنیت.\nگو \"{{int:savearticle}}\" کيلی ئی پرنچیتین ئا <strong>تانا</strong> بُرزگین متني ئین متنێ جاگه ذخیره ئه بیت.",
+       "explainconflict": "شه وختی که شما ای دیمێ دستکاری ئا شرو کورتێت یک دیگه نپری آیرا ٹگل دات.\nبُرزگین متنین جاگه شامل ئه بیت شه اي دیمێ رقم، به انونین حالتێ تا.\nشمێ ٹگل به متنێ جهلگا نشان داته بوته انت.\nشما باید وتي ٹگل ئانه گۆ انونین متنا لۆڑ کنیت.\nگو \"$1\" کيلی ئی پرنچیتین ئا <strong>تانا</strong> بُرزگین متني ئین متنێ جاگه ذخیره ئه بیت.",
        "yourtext": "شمی متن",
        "storedversion": "ذخیره بوته ئین نخسه",
        "editingold": "'''توجه: شما به ای تاکدیمێ کهنگین نخسه ئی جۆڑ کورتينێ حالا هستیت.'''\nاگه ایشیرا ذخیره‌بکنیت ، هر تغییری که پدا شه ای نخسه ئا بوته انت شه بێن ئه رونت.",
        "right-editsemiprotected": "ایڈیٹ کورتین قُلپ بوته ئین تاکدیمانی بئ ئنوانی \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "یک تاکدیمی محتوایی مدل یی ایڈیٹ کورتین",
        "right-editinterface": "ای\tڈیٹ کورتین کار زوروکانئ رابطه",
-       "right-editusercssjs": "ایڈیٹ کورتین دیگه کار زوروکانئ  CSS و JS ئی تاکدیمانئ",
        "right-editusercss": "ایڈیٹ کورتین دیگه کار زوروکانئ  CSS ئی تاکدیمانئ",
        "right-edituserjs": "ایڈیٹ کورتین دیگه کار زوروکانئ  JS ئی تاکدیمانئ",
        "right-editmyusercss": "وتئ  سی‌اس‌اس کار زوروکئ فایلانا ایڈیٹ بکینت",
        "rcshowhidecategorization": "$1 تاکدیمئ تهربندی",
        "rcshowhidecategorization-show": "نشان داتین",
        "rcshowhidecategorization-hide": "چیهر داتین",
-       "rclinks": "آ آخیرئین $1 تغیرانئ نشان داتین که به $2 اخیرئین روچانئ تا پیش بوته انت<br />$3",
+       "rclinks": "آ آخیرئین $1 تغیرانئ نشان داتین که به $2 اخیرئین روچانئ تا پیش بوته انت",
        "diff": "فرق",
        "hist": "تاریخچه",
        "hide": "چیهر داتین",
        "undeleteviewlink": "دیستین",
        "undeleteinvert": "انتخابئ سرچپي کورتین",
        "undeletecomment": "دلیل:",
-       "undeletedrevisions": "$1 ئی نخسه احیا {{PLURAL:$1|بوت}}",
-       "undeletedrevisions-files": "$1 نخسه و $2 فایل پداجۆڑ {{PLURAL:$1|بوت|بوتنت}}.",
-       "undeletedfiles": "$1 ئی فایل پدا جۆڑ {{PLURAL:$1|بوت|بوتنت}}.",
        "cannotundelete": "پدا جۆڑ کورتین ناکام ات:\n$1",
        "undeletedpage": "'''$1 پدا جۆڑ بوت'''\n\nپه پاک بوته ئین و پدا جۆڑ بوته ئین سیاهه ئی خاتیرا بئ [[Special:Log/delete|پاک بوته ئین ئانی سیاهه]] ئی تا برۆیت.",
        "undelete-header": "په آ دیما که بئ ای آخیرا پاک بوته انت بئ   [[Special:Log/delete|پاک بوته ئین ئانی سیاهه]] ئا بگیندیت.",
        "logentry-managetags-create": "$1 تگ «$4» ئا {{GENDER:$2|ج\tۆڑ کورت}}",
        "log-name-tag": "خالیجای ٹاپه",
        "rightsnone": "(هیچ)",
-       "revdelete-summary": "ایڈیتی خاصه",
        "feedback-back": "بیئرگشت",
        "feedback-bugnew": "دیستونئ . نوکین مشکل ئی راپور دیئ",
        "feedback-cancel": "کنسیل",
index f63d25e..2bc5256 100644 (file)
        "redirectedfrom": "($1 से अनुप्रेषित)",
        "redirectpagesub": "अनुप्रेषण पन्ना",
        "redirectto": "अनुप्रेषित:",
-       "lastmodifiedat": "$1 के $2 बजे ए पन्ना पर अंतिम बेर बदलाव भइल।",
+       "lastmodifiedat": "एह पन्ना पर आखिरी बेर संपादन $1 के $2 बजे भइल रहल।",
        "viewcount": "ई पन्ना {{PLURAL:$1|एक|$1}} बेर देखल गइल बा।",
        "protectedpage": "सुरक्षित पन्ना",
        "jumpto": "इहाँ जाईं:",
        "mainpage": "मुख्य पन्ना",
        "mainpage-description": "मुख्य पन्ना",
        "policy-url": "Project:नीति",
-       "portal": "सदसà¥\8dय-समाà¤\9c à¤®à¥\81à¤\96à¥\8dयपन्ना",
+       "portal": "समाà¤\9c पन्ना",
        "portal-url": "Project:सदस्य-समाज मुख्यपन्ना",
        "privacy": "गोपनीयता नीति",
        "privacypage": "Project:गोपनीयता नीति",
        "login": "लॉग इन",
        "login-security": "आपन पहिचान साबित करीं",
        "nav-login-createaccount": "खाता प्रवेश / खाता बनाईं",
-       "userlogin": "खाता प्रवेश / खाता बनाईं",
-       "userloginnocreate": "खाता में प्रवेश",
        "logout": "खाता से बाहर",
        "userlogout": "खाता से बाहर",
        "notloggedin": "खाता में प्रवेश नइखीं भइल",
        "userlogin-noaccount": "का एगो खाता नइखे?",
        "userlogin-joinproject": "{{SITENAME}} से जुड़ीं",
-       "nologin": "का एगो खाता नईखे? $1.",
-       "nologinlink": "एगो खाता बनाईं",
        "createaccount": "खाता बनाईं",
-       "gotaccount": "का पहिले से एगो खाता बा? $1.",
-       "gotaccountlink": "खाता में प्रवेश",
-       "userlogin-resetlink": "का रउआ आपन खाता में प्रवेश वाली जानकारी भुला गइल बानी?",
        "userlogin-resetpassword-link": "आपन गुप्तशब्द भुला गइनी का?",
        "userlogin-helplink2": "खाता में प्रवेश में मदद",
        "userlogin-loggedin": "रउआ {{GENDER:$1|$1}} के रूप में पहिले से खाता में प्रवेश क चुकल बानीं।\nकौनो अन्य सदस्य के रूप में खाता में प्रवेश करे खातिर नीचे दिहल फारम के प्रयोग करीं।",
        "createaccountmail": "एगो अस्थायी यादृच्छिक (रैन्डम) गुप्तशब्द के प्रयोग करीं आ दिहल गइल ईमेल पता पर भेजीं",
        "createaccountmail-help": "एकर इस्तेमाल केहू दुसरा खातिर खाता बनावे में कइल जा सके ला, बिना पासवर्ड जनले।",
        "createacct-realname": "असली नाम (वैकल्पिक)",
-       "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "रउआ एगो अन्य खाता काहें बना रहल बानी",
        "createacct-reason-help": "खाता बनवले के लॉग में देखाई पड़े वाला सनेसा",
        "botpasswords-label-delete": "मिटाईं",
        "botpasswords-label-resetpassword": "पासवर्ड रिसेट करीं",
        "botpasswords-label-grants": "लागू हो सके वाला अनुमोदन:",
+       "botpasswords-help-grants": "एह ग्रांट सभ से जवना काम ले पहुँच हो सके ला ऊ अधिकार राउर सदस्य खाता लगे पहिलहीं से बा। इहाँ कौनों ग्रांट के चालू करे से आपके खाता के कौनों अइसन अधिकार ना मिली जे पहिलहीं से न होखे। ढेर जानकारी खातिर [[Special:ListGrants|ग्रांट लिस्ट]] देखीं।",
        "botpasswords-label-grants-column": "मंजूर भइल",
        "botpasswords-bad-appid": "बॉट नाँव \"$1\" वैध नइखे।",
        "botpasswords-insert-failed": "बॉट नाँव $1 जोड़ल फेल हो गइल। का ई पहिलहीं जोड़ल जा चुकल बा?",
        "botpasswords-updated-body": "प्रयोगकर्ता \"$2\" के बॉट नाँव \"$1\" खातिर बॉट पासवर्ड अपडेट भइल।",
        "botpasswords-deleted-title": "बॉट पासवर्ड मिटावल गइल",
        "botpasswords-deleted-body": "प्रयोगकर्ता \"$2\" के बॉट नाँव \"$1\" खातिर बॉट पासवर्ड मिटावल गइल।",
+       "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) नइखे।",
+       "botpasswords-not-exist": "प्रयोगकर्ता \"$1\" के लगे \"$2\" नाँव के बॉटगुप्तशब्द नइखे।",
        "resetpass_forbidden": "गुप्तशब्द बदलल नइखे जा सकत",
        "resetpass_forbidden-reason": "गुप्तशब्द बदलल नइखे जा सकत:$1",
        "resetpass-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआँ के पहिले खाता में प्रवेश करे के पड़ी।",
        "preview": "झलक",
        "showpreview": "झलक देखीं",
        "showdiff": "बदलाव देखीं",
-       "blankarticle": "<strong>चेतावनी:</strong> आप एगो खाली पन्ना बनावे जा रहल बानी।\nयदि आप \"{{int:savearticle}}\" के फेर से दबायेब त पन्ना बिना कउनो सामग्री के बन जाई।",
+       "blankarticle": "<strong>चेतावनी:</strong> आप एगो खाली पन्ना बनावे जा रहल बानी।\nयदि आप \"$1\" के फेर से दबायेब त पन्ना बिना कउनो सामग्री के बन जाई।",
        "anoneditwarning": "<strong>चेतावनी:</strong> रउआँ आपन खाता में प्रवेश नइखीं कइले। अगर रउआँ कौनों बदलाव करब त राउर आईपी पता सभके लउकी। अगर रउआ <strong>[$1 खाता में प्रवेश करब]</strong> या <strong>[$2 नया खाता बनाइब]</strong> त, अउरी सुबिधा सब की संघे राउर संपादन के श्रेय भी राउर प्रयोगकर्तानाँव के मिली!",
        "anonpreviewwarning": "''रउआँ खाता में प्रवेश नइखीं भइल। सहेजब तब ए पन्ना के संपादन इतिहास में राउर आईपी पता दर्ज हो जाई।\"",
-       "missingsummary": "'''याद दियावल जात बा:'''रउआँ एगो संपादन सारांश नइखीं दिहले। अगर फिर \"{{int:savearticle}}\" पर क्लिक करब, त राउर संपादन एकरे बिना सहेजा जाई।",
-       "selfredirect": "<strong>चेतावनी:</strong> आप ई पन्ना के खुदे एही पर अनुप्रेषण क रहल बानी।\nया त आप अनुप्रेषण खातिर गलत लक्ष्य देत बानी, या आप गलत पन्ना के संपादन करत बानी।\nएक बेर अउरी \"{{int:savearticle}}\" क्लिक करब त, ओइसहूँ ई अनुप्रेषण बना दिहल जाई।",
+       "missingsummary": "'''याद दियावल जात बा:'''रउआँ एगो संपादन सारांश नइखीं दिहले। अगर फिर \"$1\" पर क्लिक करब, त राउर संपादन एकरे बिना सहेजा जाई।",
+       "selfredirect": "<strong>चेतावनी:</strong> आप ई पन्ना के खुदे एही पर अनुप्रेषण क रहल बानी।\nया त आप अनुप्रेषण खातिर गलत लक्ष्य देत बानी, या आप गलत पन्ना के संपादन करत बानी।\nएक बेर अउरी \"$1\" क्लिक करब त, ओइसहूँ ई अनुप्रेषण बना दिहल जाई।",
        "missingcommenttext": "नीचे एगो टिप्पणी भरीं।",
-       "missingcommentheader": "'''याद दियावल जात बा:''' रउआँ एह कमेंट खातिर कौनों बिसय नइखीं दिहले। अगर आप \"{{int:savearticle}}\" पर क्लिक करब तब राउर संपादन एकरे बिना सहेजा जाई।",
-       "summary-preview": "साराà¤\82श झलक:",
+       "missingcommentheader": "'''याद दियावल जात बा:''' रउआँ एह कमेंट खातिर कौनों बिसय नइखीं दिहले। अगर आप \"$1\" पर क्लिक करब तब राउर संपादन एकरे बिना सहेजा जाई।",
+       "summary-preview": "सà¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤\95 झलक:",
        "subject-preview": "बिसय के झलक:",
        "previewerrortext": "राउर बदलाव के झलक देखावे के कोसिस के समय कुछ गड़बड़ी हो गइल।",
        "blockedtitle": "प्रयोगकर्ता रोक दिहल गइल बा",
        "editingsection": "$1 संपादन (खंड)",
        "editingcomment": "$1 संपादन (नया खंड)",
        "editconflict": "संपादन अंतर्बिरोध: $1",
-       "explainconflict": "आपके द्वारा संपादन सुरू कइला के बाद से केहू अउरी ए पन्ना में बदलाव क चुकल बाटे।\nऊपर के पाठ हिस्सा में लेख के पाठ के वर्तमान स्थिति देखावल जात बा।\nराउर संपादन नीचे के पाठ हिस्सा में देखावल गइल बा।\nरउआँ के आपन बदलाव एह पहिले से मौजूद पाठ में मिलावे के परी।\n<strong>खाली</strong> ऊपर की पाठ हिस्सा में लउकत पाठ सहेजल जाई अगर आप \"{{int:savearticle}}\" बटन दबाइब।",
+       "explainconflict": "आपके द्वारा संपादन सुरू कइला के बाद से केहू अउरी ए पन्ना में बदलाव क चुकल बाटे।\nऊपर के पाठ हिस्सा में लेख के पाठ के वर्तमान स्थिति देखावल जात बा।\nराउर संपादन नीचे के पाठ हिस्सा में देखावल गइल बा।\nरउआँ के आपन बदलाव एह पहिले से मौजूद पाठ में मिलावे के परी।\n<strong>खाली</strong> ऊपर की पाठ हिस्सा में लउकत पाठ सहेजल जाई अगर आप \"$1\" बटन दबाइब।",
        "yourtext": "राउर पाठ",
        "storedversion": "सुरक्षित कइल गइल संशोधन",
        "nonunicodebrowser": "<strong>चेतावनी: राउर ब्राउसर युनिकोड समर्थ नइखे।</strong>\nपन्ना सभ के सुरक्षित संपादित करे के एगो तरीका सुझावल जात बा: गैर-ASCII अक्षर सभ संपादन बॉक्स में हेक्साडेसिमल कोड की रूप में देखावल जाई।",
        "readonlywarning": "<strong>चेतावनी: एह समय मरम्मत खातिर डेटाबेस लॉक कइल गइल बा, एही कारन आप तुरंते एही समय आपन संपादन ना सहेज पाइब।</strong>\nरउआँ अपनी पाठ (टेक्स्ट) के कौनों पाठ फाइल (टेक्स्ट फाइल) में बाद खातिर सहेज के रख लीं।\n\nजे सिस्टम प्रबंधक एकरा के लॉक कइले बा ऊ नीचे लिखल कारण दिहले बा: $1",
        "protectedpagewarning": "<strong>चेतावनी: ई पन्ना सुरक्षित कइल गइल बा जेवना से कि एकरा के खाली प्रबंधक (Admin) विशेषाधिकार वाला सदस्य लोग संपादित क सकत बा।</strong>\nप्रसंग बूझे खातिर सबसे नया लॉग एंट्री नीचे दिहल जात बा:",
        "semiprotectedpagewarning": "<strong>नोट:</strong> ई पन्ना सुरक्षित कइल गइल बा कि एकरा के खाली रजिस्टर्ड सदस्य लोग संपादित क सकत बा।\nसभसे नया लॉग एंट्री नीचे प्रसंग बतावे खातिर दिहल जात बा:",
-       "cascadeprotectedwarning": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\88 à¤ªà¤¨à¥\8dना à¤¸à¥\81रà¤\95à¥\8dषित à¤\95 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾ à¤\95ि à¤\8fà¤\95रा à¤\95à¥\87 à¤\96ालà¥\80 à¤ªà¥\8dरबà¤\82धà¤\95 (Admin) à¤µà¤¿à¤¶à¥\87षाधिà¤\95ार à¤µà¤¾à¤²à¤¾ à¤¸à¤¦à¤¸à¥\8dय à¤²à¥\8bà¤\97 à¤¸à¤\82पादित à¤\95 à¤¸à¤\95à¥\87ला à¤\95ाहà¥\87à¤\82 à¤¸à¥\87 à¤\95à¥\80 à¤\88 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤¬à¤¿à¤¸à¥\8dतारित(à¤\95à¥\88सà¥\8dà¤\95à¥\87डिà¤\82à¤\97)-सà¥\81रà¤\95à¥\8dषा à¤µà¤¾à¤²à¤¾ {{PLURAL:$1|पनà¥\8dना|पनà¥\8dनवन}} à¤®à¥\87à¤\82 à¤¸à¤®à¤¾à¤\87ल बाटे:",
+       "cascadeprotectedwarning": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\88 à¤ªà¤¨à¥\8dना à¤¸à¥\81रà¤\95à¥\8dषित à¤¬à¤¾ à¤\9cवना à¤¸à¥\87 à¤\95ि à¤\96ालà¥\80 [[Special:ListGroupRights|बिसà¥\87स à¤\85धिà¤\95ार]] à¤µà¤¾à¤²à¤¾ à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤²à¥\8bà¤\97 à¤¸à¤\82पादन à¤\95 à¤¸à¤\95à¥\87ला à¤\95ाहà¥\87à¤\82 à¤¸à¥\87 à¤\95à¥\80 à¤\88 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤\9bतनार-सà¥\81रà¤\95à¥\8dषा à¤µà¤¾à¤²à¤¾ {{PLURAL:$1|पनà¥\8dना|पनà¥\8dना à¤¸à¤­}} à¤®à¥\87à¤\82 à¤\9fà¥\8dराà¤\82सà¤\95à¥\8dलà¥\82ड à¤¹à¥\8b à¤°à¤¹ल बाटे:",
        "titleprotectedwarning": "<strong>चेतावनी: ई पन्ना सुरक्षित कइल गइल बा की एकरा के बनावे खातिर [[Special:ListGroupRights|विशेष अधिकार]] होखल जरूरी बा।</strong>\nसंदर्भ खातिर नीचे सबसे नया लॉग एंट्री दिहल जात बा:",
        "templatesused": "ए पन्ना पर इस्तेमाल {{PLURAL:$1|टेम्पलेट|टेम्पलेट कुल}}:",
        "templatesusedpreview": "इ पुर्वावलोकन में प्रयुक्त {{PLURAL:$1|टेम्पलेट|टेम्पलेट कुल}}:",
        "contentmodelediterror": "रउआँ एह अवतरण के संपादन नइखीं कर सकत काहें से कि एकर सामग्री मॉडल <code>$1</code> बा जवन पन्ना के के वर्तमान मॉडल <code>$2</code> से अलग बाटे।",
        "recreate-moveddeleted-warn": "<strong>चेतावनी: रउआँ एगो अइसन पन्ना दुबारा बनावे जा रहल बानी जेवन पहिले हटावल जा चुकल बा</strong>\n\nआपके ई बिचार क लेवे के चाहीं की आगे संपादन कइल ठीक बा की ना।\n\nसुविधा खातिर, ए पन्ना के हटवले आ स्थानांतरण के लॉग नीचे दिहल जात बा:",
        "moveddeleted-notice": "ई पन्ना हटा दिहल गइल बा।\nसंदर्भ खातिर हटावे आ स्थानांतरण के लॉग नीचे दिहल जात बाटे।",
+       "moveddeleted-notice-recent": "माफ करीं, ई पन्ना हाले में हटा दिहल गइल बा (पछिला 24 घंटा के भीतर)।\nहटवले आ स्थानांतरण के लॉग हवाला खातिर नीचे दिहल जा रहल बा।",
        "log-fulllog": "पूरा लॉग देखीं",
        "edit-hook-aborted": "संपादन के हुक निरस्त क दिहलस।\nई कौनों कारन ना बतवलस।",
        "edit-gone-missing": "पन्ना अपडेट ना हो पावल।\nबुझात बा कि ई हटा दिहल गइल बा।",
        "content-model-css": "सी॰एस॰एस",
        "content-json-empty-object": "खाली चीज (एम्प्टी ऑब्जेक्ट)",
        "content-json-empty-array": "खाली ऍरे",
+       "deprecated-self-close-category": "अबैध खुद-बंद एचटीएमएल टैग के इस्तमाल करत पन्ना",
        "deprecated-self-close-category-desc": "पन्ना में अवैध सेल्फ-क्लोज्ड ऍचटीऍमऍल टैग बाड़ें, जइसे कि <code>&lt;b/></code> या फिर <code>&lt;span/></code>। जल्दिये इनहन के बेहवार ऍचटीऍमऍल5 स्पेसिफिकेशन के साथ सामंजस्य वाला होखे खातिर बदल जाई, एही से इनहन के विकिपाठ में प्रयोग खाराबीयुक्त बाटे।",
        "duplicate-args-warning": "<strong>चेतावनी:</strong> [[:$1]], [[:$2]] के \"$3\" पैरामीटर खातिर एक से अधिका वैल्यू की संघे काल करत बाटे। दिहल गइल वैल्यू में से खाली सबसे आखिरी वैल्यू के प्रयोग कइल जाई।",
        "duplicate-args-category": "टेम्पलेट कॉल में डुप्लिकेट तर्क इस्तेमाल वाला पन्ना",
        "post-expand-template-argument-warning": "<strong>चेतावनी:</strong> ए पन्ना पर कम से कम एक ठो अइसन टेम्पलेट आर्गुमेंट बा जेवन बहुत बड़ खर्चीला साइज के बा।\nअइसन आर्गुमेंट के लोप कइ दिहल गइल बा।",
        "post-expand-template-argument-category": "पन्ना जिनहन में लोप कइल गइल टेम्पलेट आर्गुमेंट बा",
        "parser-template-loop-warning": "टेम्पलेट लूप पकड़ में आइल बा:[[$1]]",
+       "template-loop-category": "टेम्पलेट लूप वाला पन्ना",
+       "template-loop-category-desc": "पन्ना पर टेम्पलेट लूप बा, मने कि अइसन टेम्पलेट जे अपनहीं के दोहरा-दोहरा के काल क रहल बा।",
        "parser-template-recursion-depth-warning": "टेम्पलेट रिकरसन (recursion) के गहिराइ सीमा पार ($1)",
        "language-converter-depth-warning": "भाषा बदलावक (language converter) के गहिराइ सीमा पार ($1)",
        "node-count-exceeded-category": "पन्ना जहाँ नोड गिनती पार हो गइल बा",
        "page_first": "पहिलका",
        "page_last": "आखिरी",
        "histlegend": "अंतर बीछीं: तुलना देखे खातिर बदलावन के रेडियो बटन चिन्हित करीं आ एंटर या फिर नीचे दिहल बटन दबाईं।<br />\nसंकेत: <strong>({{int:cur}})</strong> = सभसे नया बदलाव के साथ अंतर, <strong>({{int:last}})</strong> = पछिला बदलाव के साथ अंतर, <strong>{{int:minoreditletter}}</strong> = छोट संपादन।",
-       "history-fieldset-title": "à¤\87तिहास à¤¦à¥\87à¤\96ीं",
-       "history-show-deleted": "à¤\96ालà¥\80 à¤®à¥\87à¤\9fावल",
+       "history-fieldset-title": "रिवà¥\80à¤\9cन à¤\96à¥\8bà¤\9cीं",
+       "history-show-deleted": "हà¤\9fावल à¤°à¤¿à¤µà¥\80à¤\9cन à¤­à¤°",
        "histfirst": "सबसे पुरान",
        "histlast": "सबसे नया",
        "historysize": "({{PLURAL:$1|1 बाइट|$1 बाइट}})",
        "revdelete-unsuppress": "दुबारा स्थापित बदलाव पर से प्रतिबन्ध हटाईं",
        "revdelete-log": "कारण:",
        "revdelete-submit": "चुनल गइल {{PLURAL:$1|बदलाव|बदलाव कुल}} पर लागू करीं",
-       "revdelete-success": "बदलाव à¤\95à¥\87 à¤¦à¥\87à¤\96ाà¤\88 à¤ªà¤¡à¤¼à¤²à¥\87 à¤\95à¥\87 à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤\85पडà¥\87à¤\9f à¤¹à¥\8b à¤\97à¤\87ल",
+       "revdelete-success": "रिवà¥\80à¤\9cन à¤²à¤\89à¤\95ाहà¤\9f à¤\85पडà¥\87à¤\9f à¤­à¤\87ल।",
        "revdelete-failure": "बदलाव के देखाई पड़ले के सेटिंग अपडेट ना हो पावल:$1",
-       "logdelete-success": "लà¥\89à¤\97 à¤\95à¥\87 à¤¦à¥\87à¤\96ाà¤\88 à¤ªà¤¡à¤¼à¤²à¥\87 à¤\95à¥\87 à¤¸à¥\87à¤\9fिà¤\82à¤\97 à¤ªà¥\82रा भइल।",
+       "logdelete-success": "लà¥\89à¤\97 à¤²à¤\89à¤\95ाहà¤\9f à¤¸à¥\87à¤\9f भइल।",
        "logdelete-failure": "लॉग के देखाई पड़ले के सेटिंग पूरा ना भइल:$1",
        "revdel-restore": "दूश्यता बदलीं",
        "pagehist": "पन्ना के इतिहास",
        "revdelete-modify-no-access": "तारीख $2, समय $1, के चीज में बदलाव करे में खराबी बा: ई चीज \"प्रतिबंधित\" चिन्हित कइल गइल बा।\nआप की लगे इहाँ ले पहुँच नइखे।",
        "revdelete-modify-missing": "आइटम ID $1 के बदलाव करे में खराबी: ई डेटाबेस से गायब बा!",
        "revdelete-no-change": "<strong>चेतावनी:</strong> तारीख $2 के $1 बजे के ई आइटम पहिलहीं से ओही देखावे के सेटिंग वाला बाटे जवन माँगल जाता।",
+       "revdelete-concurrent-change": "$1 $2 बजे के आइटम के बदले में खराबी आ रहल बा: बुझाता कि आप के कोसिस करे दौरान एकरा स्थिति के दूसर केहू बदल चुकल बा।\nलॉग चेक करीं।",
        "revdelete-otherreason": "अन्य/अतिरिक्त कारण:",
        "revdelete-reasonotherlist": "अन्य कारण",
        "revdelete-edit-reasonlist": "हटावे के कारण बदलीं",
        "mergehistory-empty": "कौनों अवतरण विलय नइखे कइल जा सकत।",
        "mergehistory-done": " $1 के $3 {{PLURAL:$3|अवतरण|अवतरण सभ}} सफलता से [[:$2]] में विलय भइल।",
        "mergehistory-fail": "इतिहास विलय करे में अक्षम, पन्ना आ एकर टाइम पैरामीटर चेक करीं।",
+       "mergehistory-autocomment": "[[:$1]] के [[:$2]] में विलय कइल गइल",
+       "mergehistory-comment": "[[:$1]] के [[:$2]] में विलय कइल गइल: $3",
+       "mergehistory-same-destination": "स्रोत आ लक्ष्य पन्ना एकही ना होखे सकत बा",
        "mergehistory-reason": "कारण:",
+       "mergelog": "विलय लॉग",
        "revertmerge": "अलग करीं",
        "mergelogpagetext": "एक पन्ना इतिहास के दुसर पन्ना इतिहास में तुरंत विलय भइले के एगो सूची नीचे दिहल बा।",
        "history-title": "''$1'' के संशोधन इतिहास",
        "prefs-help-variant": "ए विकि कि सामग्री पन्नवन के देखावे खातिर राउर पसंद वाला भाषारूप।",
        "yournick": "नया दसखत:",
        "yourgender": "रउआँ के का बोलावल जाय?",
-       "gender-unknown": "हम न बताइब",
+       "gender-unknown": "जहाँ भी संभव होखी, राउर जिकिर करत घरी सॉफ्टवेयर लिंग तटस्थ शब्दन के इस्तमाल करी",
+       "gender-male": "ई विकि पन्ना संपादित करे लें",
+       "gender-female": "ई विकि पन्ना संपादित करे लीं",
        "email": "ईमेल",
        "prefs-help-email-required": "ईमेल पता चाहत बाटे।",
        "prefs-info": "बेसिक जानकारी",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "अंतर",
        "prefs-help-prefershttps": "राउर ई पसंद के सेटिंग अगिला बेर लॉग इन कइले पर लागू होई।",
-       "userrights": "प्रयोगकर्ता अधिकार मैनेजमेंट",
+       "userrights": "प्रयोगकर्ता अधिकार",
        "userrights-lookup-user": "प्रयोगकर्ता चुनीं",
        "userrights-user-editname": "प्रयोगकर्ता नाँव लिखीं:",
        "editusergroup": "प्रयोगकर्ता मंडली लोड करीं",
        "right-undelete": "हटावल पन्ना वापस ले आईं",
        "right-protect": "सुरक्षा स्तर बदलीं आ कास्केड-सुरक्षित पन्ना के सम्पादन करीं",
        "right-unwatchedpages": "ध्यानसूची में जवन पन्ना नइखे ओकर सूची देखीं",
+       "grant-blockusers": "प्रयोगकर्ता लोग पर रोक लगाईं आ रोक हटाईं",
+       "grant-createaccount": "खाता बनाईं",
+       "grant-createeditmovepage": "पन्ना बनाईं, संपादित करीं आ स्थानांतरण करीं",
+       "grant-editmyoptions": "आपन पसंदीदा सेटिंग संपादित करीं",
+       "grant-editmywatchlist": "आपन धियानसूची संपादित करीं",
+       "grant-editpage": "पहिले से मौजूद पन्ना संपादित करीं",
+       "grant-editprotected": "सुरक्षित पन्ना संपादित करीं",
+       "grant-highvolume": "भारी-मात्रा में संपादन",
+       "grant-oversight": "प्रयोगकर्ता छिपाईं आ रिवीजन दबा देईं",
+       "grant-patrol": "पन्ना पर बदलाव सभ के गश्त करीं",
+       "grant-privateinfo": "निजी जानकारी तक पहुँचीं",
+       "grant-protect": "पन्ना सुरक्षित आ बिनासुरक्षित करीं",
+       "grant-rollback": "पन्ना पर बदलाव सभ के रोलबैक करीं",
        "newuserlogpage": "खाता बनवले के लॉग",
        "newuserlogpagetext": "ई खाता निर्माण के लॉग बा",
        "rightslog": "सदस्य अधिकार लॉग",
        "recentchanges-legend-heading": "<strong>संकेत:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (इहो देखीं [[Special:NewPages|नया पन्नवन के लिस्ट]])",
        "recentchanges-submit": "देखावल जाय",
+       "rcfilters-filter-bots-label": "बॉट",
+       "rcfilters-filter-bots-description": "ऑटोमेटिक औजार से कइल संपादन।",
+       "rcfilters-filter-humans-label": "मनुष्य (बॉट ना)",
+       "rcfilters-filter-humans-description": "मनुष्य संपादकन के कइल संपादन।",
+       "rcfilters-filtergroup-reviewstatus": "समीक्षा स्थिति",
+       "rcfilters-filter-patrolled-label": "जाँचल",
+       "rcfilters-filter-patrolled-description": "जाँचल निशानदेही वाला संपादन।",
+       "rcfilters-filter-unpatrolled-label": "बिनाजाँचल",
+       "rcfilters-filter-unpatrolled-description": "जाँचल निशानदेही के बिना वाला संपादन।",
+       "rcfilters-filtergroup-significance": "महत्व",
+       "rcfilters-filter-minor-label": "छोट संपादन",
+       "rcfilters-filter-minor-description": "लेखक द्वारा छोट चिन्हित कइल संपादन।",
+       "rcfilters-filter-major-label": "गैर-छोट संपादन",
+       "rcfilters-filter-major-description": "छोट ना चिन्हित कइल संपादन।",
+       "rcfilters-filtergroup-watchlist": "धियानसूची में शामिल पन्ना",
+       "rcfilters-filter-watchlist-watched-label": "धियानसूची में",
+       "rcfilters-filter-watchlist-watched-description": "राउर धियानसूची के पन्ना सभ में भइल बदलाव।",
+       "rcfilters-filter-watchlist-watchednew-label": "नया धियानसूची बदलाव",
+       "rcfilters-filter-watchlist-watchednew-description": "धियानसूची में शामिल पन्ना सभ के बदलाव, जिनहन के होखले के बाद से आप नइखीं पहुँचल।",
+       "rcfilters-filter-watchlist-notwatched-label": "धियानसूची में ना शामिल",
+       "rcfilters-filter-watchlist-notwatched-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": "प्रबंधक एक्शन, खाता निर्माण, पन्ना हटावल, अपलोड...",
+       "rcfilters-filtergroup-lastRevision": "अंतिम संसोधन",
        "rcnotefrom": "<strong>$3, $4</strong> से (<strong>$1</strong> तक ले के) {{PLURAL:$5|बदलाव|बदलाव सभ}} नीचे दिहल गइल बा।",
        "rclistfrom": "$2, $3 से शुरु होखे वाला नया बदलाव देखावल जाय",
        "rcshowhideminor": "$1 छोट संपादन",
        "rcshowhidecategorization": "$1 पन्ना श्रेणीकरण",
        "rcshowhidecategorization-show": "देखावल जाय",
        "rcshowhidecategorization-hide": "छिपावल जाय",
-       "rclinks": "पछिला $2 दिन में भइल $1 बदलाव देखावल जाय<br />$3",
+       "rclinks": "पछिला $2 दिन में भइल $1 बदलाव देखावल जाय",
        "diff": "अंतर",
        "hist": "इतिहास",
        "hide": "छिपावल जाय",
        "namespacesall": "सगरी",
        "monthsall": "सगरी",
        "confirmemail": "ईमेल पता कन्फर्म करीं",
+       "autoredircomment": "पन्ना [[$1]] पर अनुप्रेषित कइल गइल",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|बात करीं]])",
        "version-no-ext-name": "[अज्ञात नाम]",
        "fileduplicatesearch": "नकल प्रति फाइल खोजीं",
        "revdelete-unrestricted": "प्रबंधक पर से प्रतिबंध समाप्त",
        "logentry-move-move": "$1 पन्ना $3 के $4 पर {{GENDER:$2|स्थानांतरण कइलें}}",
        "logentry-newusers-create": "खाता $1 {{GENDER:$2|बनावल गइल}}",
-       "revdelete-summary": "सारांश संपादन",
        "searchsuggest-search": "खोजीं",
        "expandtemplates": "टेम्पलेट बिस्तार",
        "mediastatistics": "मीडिया सांख्यिकी"
index 3e79912..8b20569 100644 (file)
        "externaldberror": "Ada kasalahan apakah kacucukan basis data atawa Pian kada bulih mamutakhirakan akun luar.",
        "login": "Babuat",
        "nav-login-createaccount": "Babuat log / ulah akun",
-       "userlogin": "Babuat log / ulah akun",
-       "userloginnocreate": "Babuat log",
        "logout": "Kaluar",
        "userlogout": "Kaluar",
        "notloggedin": "Balum babuat log",
-       "nologin": "Balum baisi akun? '''$1'''.",
-       "nologinlink": "Ulah sabuting akun",
        "createaccount": "Ulah akun",
-       "gotaccount": "Hudah baisi sabuting akun? $1.",
-       "gotaccountlink": "Babuat log",
-       "userlogin-resetlink": "Kada ingat rarincian babuat log Pian?",
        "createaccountmail": "Malalui suril",
-       "createaccountreason": "Alasan:",
        "badretype": "Katasunduk nang Pian buati kada pas.",
        "userexists": "Ngaran pamakai nang dibuati hudah dipuruk urang lain.\nMuhun pilih sabuting ngaran lain.",
        "loginerror": "Kasalahan babuat log",
        "passwordreset-disabled": "Mambulikakan setelan katasunduk dipajahakan hagan wiki ngini.",
        "passwordreset-username": "Ngaran pamakai:",
        "passwordreset-domain": "Dumain:",
-       "passwordreset-capture": "Tiringikah kulihan suril?",
-       "passwordreset-capture-help": "Amun Pian cintang kutak ngini, suril (awan katasunduk pahadangan) akan ditampaiakan ka Pian bahwasa lagi dikirim ka pamakai.",
        "passwordreset-email": "Alamat suril:",
        "passwordreset-emailtitle": "Rarincian akun pada {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamakai barikut {{PLURAL:$3|akun|akun}}\ntarait awan suril:\n\n$2\n\n{{PLURAL:$3|katasunduk pahadangan ngini|kakatasunduk pahadangan ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.\nPian parlu babuat log wan mamilih katasunduk hanyar wayah ni jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamuruk katasunduk lawas Pian.",
        "showdiff": "Tampaiakan paubahan",
        "anoneditwarning": "'''Paringatan:''' Pian baluman babuat log.\nAlamat IP Pian akan dirakam dalam tungkaran babakan halam",
        "anonpreviewwarning": "''Pian baluman babuat log. Manyimpan akan tarakam alamat IP Pian pada sajarah bahari tungkaran ngini.''",
-       "missingsummary": "'''Pangingat:''' Pian kada manyadiakan sabuting kasimpulan babakan.\nAmun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada bakasimpulan.",
+       "missingsummary": "'''Pangingat:''' Pian kada manyadiakan sabuting kasimpulan babakan.\nAmun Pian klik \"$1\" pulang, babakan Pian tasimpan kada bakasimpulan.",
        "missingcommenttext": "Muhun buati sabuting kumintar di bawah ngini.",
-       "missingcommentheader": "'''Pangingat:''' Pian kada manyadiakan sabuting subjek/judul gasan kumin ngini.\nAmun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada basubjek/bajudul.",
+       "missingcommentheader": "'''Pangingat:''' Pian kada manyadiakan sabuting subjek/judul gasan kumin ngini.\nAmun Pian klik \"$1\" pulang, babakan Pian tasimpan kada basubjek/bajudul.",
        "summary-preview": "Tilikan kasimpulan:",
        "subject-preview": "Titilikan subyek/judul:",
        "blockedtitle": "Pamakai diblukir",
        "editingsection": "Mambabak $1 (hagian)",
        "editingcomment": "Mambabak $1 (hagian hanyar)",
        "editconflict": "Babakan bacakut: $1",
-       "explainconflict": "Ada urang lain nang sudah maubah tungkaran ini parhatan Pian bamula mambabak ngini.\nNaskah atas baisi naskah tungkaran wayah ini.\nPaubahan Pian ditampaiakan pada naskah di bawah.\nPinanya Pian harus manggabungakan paubahan Pian ka dalam naskah nang ada.\nNaskah nang di atas '''haja''' nang akan tasimpan lamun Pian manikin \"{{int:savearticle}}\".",
+       "explainconflict": "Ada urang lain nang sudah maubah tungkaran ini parhatan Pian bamula mambabak ngini.\nNaskah atas baisi naskah tungkaran wayah ini.\nPaubahan Pian ditampaiakan pada naskah di bawah.\nPinanya Pian harus manggabungakan paubahan Pian ka dalam naskah nang ada.\nNaskah nang di atas '''haja''' nang akan tasimpan lamun Pian manikin \"$1\".",
        "yourtext": "Naskah Pian",
        "storedversion": "Ralatan tasimpan",
        "nonunicodebrowser": "'''Paringatan: Panjalajah web Pian kada manyukung unicode.'''\nSabuah pambulatan gawian di wadah ini mambulihakan Pian aman mambabak tutungkaran: karaktir non-ASCII akan cungul pada kutak babakan sawagai kudi hiksadisimal.",
        "saveprefs": "Simpan",
        "restoreprefs": "Bulikakan samunyaan sesetélan default",
        "prefs-editing": "Pambabakan",
-       "rows": "Baris:",
-       "columns": "Kolom:",
        "searchresultshead": "Gagai",
        "stub-threshold": "Ambang watas gasan pormat <a href=\"#\" class=\"stub\">taautan rintisan</a>:",
        "stub-threshold-disabled": "Kada kawa-akan",
        "userrights-reason": "Alasan:",
        "userrights-no-interwiki": "Pian kada baisi ijin hagan mambabak hak pamuruk di wiki lain.",
        "userrights-nodatabase": "Basis data $1 kadada atawa lainan lukal.",
-       "userrights-nologin": "Pian musti [[Special:UserLogin|lbabuat log]] awan sabuah akun pambakal hagan mambari hak pamuruk.",
-       "userrights-notallowed": "Akun Pian kada baisi ijin hagan manambahi atawa malapas hak pamuruk.",
        "userrights-changeable-col": "Gagalambang nang Pian kawa ubah",
        "userrights-unchangeable-col": "Gagalambang nang Pian kada kawa ubah",
        "group": "Galambang:",
        "right-protect": "Ubah tingkat parlindungan wan babakan tutungkaran nang diindungi",
        "right-editprotected": "Babak tungkaran nang dilindungi (kada parlindungan barenteng)",
        "right-editinterface": "Babak antarmuha pamuruk ini",
-       "right-editusercssjs": "Babak pamuruk lain babarakas CSS wan JavaScript",
        "right-editusercss": "Babak pamruk lain babarakas CSS",
        "right-edituserjs": "Babak pamuruk lain babarakas JavaScript",
        "right-rollback": "Mambulikakan hancap bababakan matan pamuruk tauncit nang mambabak sabuah tungkaran tatantu",
        "right-siteadmin": "Sunduk wan buka sunduk basis data",
        "right-override-export-depth": "Ekspur tutungkaran tamasuk tutungkaran tataut sampai kadalaman 5",
        "right-sendemail": "Mangirim suril ka papamuruk lain",
-       "right-passwordreset": "Tiringi setelan-pulang katasunduk suril",
        "newuserlogpage": "Log pamakai hanyar",
        "newuserlogpagetext": "Ngini adalah sabuah log paulahan pamuruk.",
        "rightslog": "Log paubahan hak masuk",
        "rcshowhideanons": "$1 pamakai kada bangaran",
        "rcshowhidepatr": "$1 babakan ta'awasi",
        "rcshowhidemine": "$1 babakan ulun",
-       "rclinks": "Tampaiakan $1 paubahan pahanyarnya dalam $2 hari tauncit<br />$3",
+       "rclinks": "Tampaiakan $1 paubahan pahanyarnya dalam $2 hari tauncit",
        "diff": "bida",
        "hist": "halam",
        "hide": "Sungkupakan",
        "undeleteviewlink": "tiringi",
        "undeleteinvert": "Bulikakan pilihan",
        "undeletecomment": "Alasan:",
-       "undeletedrevisions": "{{PLURAL:$1|1 ralatan|$1 raralatan}} dibulikakan",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 ralatan|$1 raralatan}} and {{PLURAL:$2|1 barakas|$2 babarakas}} dibulikakan",
-       "undeletedfiles": "$1 {{PLURAL:$1|barakas|babarakas}} dibulikakan",
        "cannotundelete": "Walang mahapus gagal;\nada urang lain nang badahulu mawalangi pahapusan tungkaran ngini.",
        "undeletedpage": "'''$1 sudah dibulikakan'''\nJanaki [[Special:Log/delete|log pahapusan]] gasan sabuting rakaman matan pahapusan wan pambulikakan.",
        "undelete-header": "Janaki [[Special:Log/delete|log pahapusan]] gasan tutungkaran hanyar tahapus.",
        "logentry-newusers-create2": "$1 ma-ulah sabuting akun pamakai $3",
        "logentry-newusers-autocreate": "Akun $1 utumatis diulah",
        "rightsnone": "(kadada)",
-       "revdelete-summary": "Kasimpulan babakan",
        "feedback-adding": "Manambahi kitihanbalik ka tungkaran...",
        "feedback-bugcheck": "Harat! hanyar dipariksa bahwasa ngini lainan salah asa [$1 bug nang dipinandui].",
        "feedback-bugnew": "Ulun mamariksa. Malapurakan sabuah bug hanyar",
        "feedback-thanks": "Tarimakasih! jitihanbalik Pian sudah dipusakan ka si tungkaran \"[$2 $1]\".",
        "searchsuggest-search": "Gagai",
        "searchsuggest-containing": "isian ...",
-       "api-error-missingresult": "Kasalahan intarnal: kada kawa manantuakan napakah panyalinan tuntung.",
-       "api-error-mustbeloggedin": "Pian harus babuat ka log gasan maunggah barakas.",
-       "api-error-mustbeposted": "Ada bug di parangkat lamah naya; kada mamakai mituda HTTP nang bujur.",
-       "api-error-noimageinfo": "Paunggahan tuntung, tagal paladen kada mambarii inpurmasi napa haja masalah barakas.",
-       "api-error-nomodule": "Kasalahan intarnal: kada ada modul unggahan nang ditatapakan.",
-       "api-error-ok-but-empty": "Kasalahan intarnal: kada ada tanggapan matan paladen.",
-       "api-error-overwrite": "Kada dibariakan manindihi barakas nang sudah ada.",
        "api-error-stashfailed": "Kasalahan intarnal: server gagal manyimban barakas samantara.",
-       "api-error-timeout": "Peladen kada marispun di waktu nang diharapakan",
-       "api-error-unclassified": "Tajadi kasalahan nang kada dikatahui.",
-       "api-error-unknown-code": "Kasalahan kada dipinandui: \"$1\".",
-       "api-error-unknown-error": "Kasalahan intarnal: tajadi kasalahan pas mancuba maunggah barakas Pian.",
        "api-error-unknown-warning": "Paringatan kada dipinandui: \"$1\".",
        "api-error-unknownerror": "Kasalahan kada dipinandui: \"$1\".",
-       "api-error-uploaddisabled": "Paunggahan dinunaktipakan di wiki naya.",
-       "api-error-verification-error": "Barakas naya kira-kira rusak atawa baisi ikstinsi nang salah.",
        "special-characters-group-latin": "Latin",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Simbul",
index ddc5992..c85231d 100644 (file)
                        "আজিজ",
                        "Kayser Ahmad",
                        "NahidSultan",
-                       "Elias Ahmmad"
+                       "Elias Ahmmad",
+                       "Catrope"
                ]
        },
-       "tog-underline": "সà¦\82যà§\8bà¦\97à¦\97à§\81লির নিচে দাগ দেখানো হোক:",
-       "tog-hideminor": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¸à¦®à§\8dপাদনাà¦\97à§\81লà§\8b à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হà§\87 à¦\86ড়াল à¦\95রà§\8b",
-       "tog-hidepatrolled": "পরীক্ষিত সম্পাদনা গুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো",
-       "tog-newpageshidepatrolled": "পরীক্ষিত পাতা গুলো নতুন পাতার তালিকায় আড়াল করো",
-       "tog-hidecategorization": "পাতার à¦¶à§\8dরà§\87ণà§\80বদà§\8dধà¦\95রণ à¦²à§\81à¦\95ান",
-       "tog-extendwatchlist": "শà§\81ধà§\81 à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\87 à¦¨à¦¯à¦¼, à¦¸à¦\95ল à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦¦à§\87à¦\96তà§\87 à¦¨à¦\9cর à¦¤à¦¾à¦²à¦¿à¦\95া à¦¸à¦®à§\8dপà§\8dরসারণ à¦\95রà§\81ন",
-       "tog-usenewrc": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ à¦\8fবà¦\82 à¦¨à¦\9cরতালিà¦\95া à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লà§\8b à¦\8fà¦\95তà§\8dরà§\87 à¦ªà§\8dরদরà§\8dশন",
-       "tog-numberheadings": "শিরà§\8bনামà¦\97à§\81লà§\8bà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦\95à§\8dরমিà¦\95 à¦¨à¦®à§\8dবর à¦¦à¦¾à¦\93",
-       "tog-showtoolbar": "সমà§\8dপাদনা à¦¸à¦°à¦\9eà§\8dà¦\9cামদণà§\8dড à¦¦à§\87à¦\96াà¦\93",
-       "tog-editondblclick": "দুইবার ক্লিক করে পাতা সম্পাদনা",
-       "tog-editsectiononrightclick": "পরিচ্ছেদের শিরোনামে ডান ক্লিকের মাধ্যমে সম্পাদনা করার ক্ষমতা দেয়া হোক",
-       "tog-watchcreations": "à¦\86মার à¦¤à§\88রি à¦ªà¦¾à¦¤à¦¾ à¦\8fবà¦\82 à¦\86পলà§\8bড à¦\95রা à¦«à¦¾à¦\87লà¦\97à§\81ললà§\8b আমার নজরতালিকায় যোগ করা হোক",
-       "tog-watchdefault": "আমার সম্পাদিত পাতা এবং ফাইলগুলো আমার নজরতালিকায় যোগ করা হোক",
-       "tog-watchmoves": "à¦\86মার à¦¸à§\8dথানানà§\8dতরিত à¦ªà¦¾à¦¤à¦¾ à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লà§\8b আমার নজরতালিকায় যোগ করা হোক",
-       "tog-watchdeletion": "à¦\86মার à¦\85পসারিত à¦ªà¦¾à¦¤à¦¾ à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লà§\8b আমার নজর তালিকায় যোগ করা হোক",
-       "tog-watchuploads": "à¦\86মার à¦¨à¦\9cরতালিà¦\95ায় à¦\86মার à¦\86পলà§\8bড à¦\95রা à¦¨à¦¤à§\81ন à¦«à¦¾à¦\87ল à¦¯à§\8bà¦\97 à¦\95র",
-       "tog-watchrollback": "আমার দ্বারা রোলব্যাক করা পাতা আমার নজরতালিকায় যোগ করা হোক",
+       "tog-underline": "সà¦\82যà§\8bà¦\97à§\87র নিচে দাগ দেখানো হোক:",
+       "tog-hideminor": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
+       "tog-hidepatrolled": "পরীক্ষিত সম্পাদনাগুলি সাম্প্রতিক পরিবর্তন পাতায় লুকিয়ে রাখা হোক",
+       "tog-newpageshidepatrolled": "পরীক্ষিত পাতাগুলিকে নতুন পাতার তালিকায় লুকিয়ে রাখা হোক",
+       "tog-hidecategorization": "পাতাà¦\97à§\81লির à¦¶à§\8dরà§\87ণà§\80à¦\95রণ à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
+       "tog-extendwatchlist": "শà§\81ধà§\81 à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\87 à¦¨à¦¯à¦¼, à¦¸à¦\95ল à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦¦à§\87à¦\96তà§\87 à¦¨à¦\9cর à¦¤à¦¾à¦²à¦¿à¦\95া à¦¸à¦®à§\8dপà§\8dরসারণ à¦\95রা à¦¹à§\8bà¦\95",
+       "tog-usenewrc": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ à¦\8fবà¦\82 à¦¨à¦\9cরতালিà¦\95া à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦\8fà¦\95তà§\8dরà§\87 à¦ªà§\8dরদরà§\8dশন à¦\95রা à¦¹à§\8bà¦\95",
+       "tog-numberheadings": "শিরà§\8bনামà¦\97à§\81লিà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦\95à§\8dরমিà¦\95 à¦¨à¦®à§\8dবর à¦¦à§\87য়া à¦¹à§\8bà¦\95",
+       "tog-showtoolbar": "সমà§\8dপাদনা à¦¸à¦°à¦\9eà§\8dà¦\9cামদণà§\8dড à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95",
+       "tog-editondblclick": "দুইবার ক্লিক করে পাতা সম্পাদনা করা হোক",
+       "tog-editsectiononrightclick": "পরিচ্ছেদের শিরোনামে ডান ক্লিক করার মাধ্যমে পরিচ্ছেদ সম্পাদনা করার সুবিধাটি সক্রিয় করা হোক",
+       "tog-watchcreations": "à¦\86মার à¦¤à§\88রি à¦\95রা à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লি à¦\8fবà¦\82 à¦\86পলà§\8bড à¦\95রা à¦«à¦¾à¦\87লà¦\97à§\81লি আমার নজরতালিকায় যোগ করা হোক",
+       "tog-watchdefault": "আমার সম্পাদিত পাতাগুলি এবং ফাইলগুলি আমার নজরতালিকায় যোগ করা হোক",
+       "tog-watchmoves": "à¦\86মার à¦¦à§\8dবারা à¦¸à§\8dথানানà§\8dতরিত à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লি à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লি আমার নজরতালিকায় যোগ করা হোক",
+       "tog-watchdeletion": "à¦\86মার à¦¦à§\8dবারা à¦\85পসারিত à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লি à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লি আমার নজর তালিকায় যোগ করা হোক",
+       "tog-watchuploads": "à¦\86মার à¦\86পলà§\8bড à¦\95রা à¦¨à¦¤à§\81ন à¦«à¦¾à¦\87লà¦\97à§\81লি à¦\86মার à¦¨à¦\9cরতালিà¦\95ায় à¦¯à§\8bà¦\97 à¦\95রা à¦¹à§\8bà¦\95",
+       "tog-watchrollback": "আমার দ্বারা রোলব্যাক করা পাতাগুলি আমার নজরতালিকায় যোগ করা হোক",
        "tog-minordefault": "শুরুতেই সব সম্পাদনাকে অনুল্লেখ্য বলে চিহ্নিত করা হোক",
        "tog-previewontop": "সম্পাদনা বাক্সের আগে প্রাকদর্শন দেখানো হোক",
        "tog-previewonfirst": "প্রথম সম্পাদনার ক্ষেত্রে প্রাকদর্শন দেখানো হোক",
-       "tog-enotifwatchlistpages": "আমার নজর তালিকায় আছে এমন পাতা অথবা ফাইলে পরিবর্তন হলে আমাকে ই-মেইল করো",
+       "tog-enotifwatchlistpages": "আমার নজরতালিকায় আছে এমন কোন পাতা অথবা ফাইলে পরিবর্তন হলে আমাকে ই-মেইল করা হোক",
        "tog-enotifusertalkpages": "আমার ব্যবহারকারী আলোচনা পাতার পরিবর্তন হলে আমাকে ই-মেইল করা হোক",
-       "tog-enotifminoredits": "পাতা à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লà§\8bতে অনুল্লেখ্য সম্পাদনার জন্যও আমাকে ই-মেইল করা হোক",
-       "tog-enotifrevealaddr": "বিজ্ঞপ্তি মেইলে আমার ই-মেইল ঠিকানা প্রকাশ করা হোক",
-       "tog-shownumberswatching": "নজরদারী করছে, এমন ব্যবহারকারীর সংখ্যা দেখানো হোক",
+       "tog-enotifminoredits": "পাতা à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লিতে অনুল্লেখ্য সম্পাদনার জন্যও আমাকে ই-মেইল করা হোক",
+       "tog-enotifrevealaddr": "বিজ্ঞপ্তির ই-মেইলগুলিতে আমার ই-মেইল ঠিকানা প্রকাশ করা হোক",
+       "tog-shownumberswatching": "নজরদারী করছে এমন ব্যবহারকারীর সংখ্যা দেখানো হোক",
        "tog-oldsig": "আপনার বর্তমান স্বাক্ষর:",
-       "tog-fancysig": "সà§\8dবাà¦\95à§\8dষরà¦\95à§\87 à¦\89à¦\87à¦\95িà¦\9fà§\87à¦\95à§\8dসà¦\9f à¦¹à¦¿à¦¸à§\87বà§\87 à¦®à¦¨à§\87 à¦\95রà§\81ন (à¦\95à§\8bন à¦¸à¦¯à¦¼à¦\82à¦\95à§\8dরিয় à¦²à¦¿à¦\99à§\8dà¦\95 ছাড়া)",
-       "tog-uselivepreview": "তাà§\8eà¦\95à§\8dষণিà¦\95 à¦ªà§\8dরাà¦\95দরà§\8dশন à¦¬à§\8dযবহার à¦\95রà§\8b",
+       "tog-fancysig": "সà§\8dবাà¦\95à§\8dষরà¦\95à§\87 à¦\89à¦\87à¦\95িà¦\9fà§\87à¦\95à§\8dসà¦\9f à¦¹à¦¿à¦¸à§\87বà§\87 à¦®à¦¨à§\87 à¦\95রা à¦¹à§\8bà¦\95 (à¦\95à§\8bন à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয় à¦¸à¦\82যà§\8bà¦\97 ছাড়া)",
+       "tog-uselivepreview": "তাà§\8eà¦\95à§\8dষণিà¦\95 à¦ªà§\8dরাà¦\95দরà§\8dশন à¦¬à§\8dযবহার à¦\95রা à¦¹à§\8bà¦\95",
        "tog-forceeditsummary": "খালি সম্পাদনা সারাংশ প্রবেশ করানোর সময় আমাকে জানানো হোক",
-       "tog-watchlisthideown": "à¦\86মার à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦\86মার à¦¨à¦\9cরতালিà¦\95ায় à¦¨à¦¾ à¦¦à§\87à¦\96ানà§\8b হোক",
-       "tog-watchlisthidebots": "বà¦\9fà§\87র à¦\95রা à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¨à¦\9cরতালিà¦\95ায় à¦¨à¦¾ à¦¦à§\87à¦\96ানà§\8b হোক",
-       "tog-watchlisthideminor": "অনুল্লেখ্য সম্পাদনাগুলো নজর তালিকায় না দেখানো হোক",
-       "tog-watchlisthideliu": "নà¦\9cরতালিà¦\95াতà§\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦²à¦\97-à¦\87ন à¦\95রা à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¸à¦®à§\8dপাদনা à¦\86ড়ালে রাখা হোক",
-       "tog-watchlistreloadautomatically": "পà§\8dরতিবার à¦\8fà¦\95à¦\9fি à¦\9bাà¦\81à¦\95নি à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦¹à¦\93য়া à¦®à¦¾à¦¤à§\8dরà¦\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¨à¦\9cরতালিà¦\95ায় à¦ªà§\81নà¦\83লà§\8bড à¦\95রà§\8b (জাভাস্ক্রিপ্ট প্রয়োজন)",
-       "tog-watchlisthideanons": "নà¦\9cরতালিà¦\95াতà§\87 à¦¬à§\87নামà§\80 à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¸à¦®à§\8dপাদনা আড়ালে রাখা হোক",
-       "tog-watchlisthidepatrolled": "পরীক্ষিত সম্পাদনা গুলো নজরতালিকায় আড়াল করো",
-       "tog-watchlisthidecategorization": "পাতার à¦¶à§\8dরà§\87ণà§\80বদà§\8dধà¦\95রণ à¦²à§\81à¦\95ান",
-       "tog-ccmeonemails": "à¦\85নà§\8dয à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\95াà¦\9bà§\87 à¦\86মার à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦\87মà§\87à¦\87লà§\87র à¦\8fà¦\95à¦\9fি à¦\85নà§\81লিপি আমাকে পাঠানো হোক",
+       "tog-watchlisthideown": "à¦\86মার à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦\86মার à¦¨à¦\9cরতালিà¦\95ায় à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া হোক",
+       "tog-watchlisthidebots": "বà¦\9fà§\87র à¦\95রা à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¨à¦\9cরতালিà¦\95ায় à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া হোক",
+       "tog-watchlisthideminor": "অনুল্লেখ্য সম্পাদনাগুলো নজরতালিকায় লুকিয়ে রাখা হোক",
+       "tog-watchlisthideliu": "à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শà¦\95à§\83ত à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¨à¦\9cরতালিà¦\95ায় à¦²à§\81à¦\95িয়ে রাখা হোক",
+       "tog-watchlistreloadautomatically": "পà§\8dরতিবার à¦\8fà¦\95à¦\9fি à¦\9bাà¦\81à¦\95নি à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦¹à¦\93য়া à¦®à¦¾à¦¤à§\8dরà¦\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¨à¦\9cরতালিà¦\95াà¦\9fি à¦ªà§\81নà¦\83লà§\8bড à¦\95রা à¦¹à§\8bà¦\95 (জাভাস্ক্রিপ্ট প্রয়োজন)",
+       "tog-watchlisthideanons": "বà§\87নামà§\80 à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¨à¦\9cরতালিà¦\95ায় আড়ালে রাখা হোক",
+       "tog-watchlisthidepatrolled": "পরীক্ষিত সম্পাদনাগুলি নজরতালিকায় লুকিয়ে রাখা হোক",
+       "tog-watchlisthidecategorization": "পাতার à¦¶à§\8dরà§\87ণà§\80বদà§\8dধà¦\95রণ à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
+       "tog-ccmeonemails": "à¦\85নà§\8dয à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\95াà¦\9bà§\87 à¦\86মার à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦\87মà§\87à¦\87লà§\87র à¦\8fà¦\95à¦\9fি à¦ªà§\8dরতিলিপি আমাকে পাঠানো হোক",
        "tog-diffonly": "পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক",
-       "tog-showhiddencats": "লà§\81à¦\95ায়িত à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80সমà§\82হ à¦¦à§\87à¦\96াà¦\93",
-       "tog-norollbackdiff": "রà§\8bলবà§\8dযাà¦\95à§\87র à¦ªà¦°à§\87 à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয à¦¦à§\87à¦\96িà¦\93 à¦¨à¦¾",
-       "tog-useeditwarning": "à¦\85সà¦\82রà¦\95à§\8dষিত à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসহ à¦\95à§\8bনà§\8b à¦ªà¦¾à¦¤à¦¾ à¦¤à§\8dযাà¦\97à§\87র à¦¸à¦®à¦¯à¦¼ à¦¸à¦¾à¦¬à¦§à¦¾à¦¨ à¦\95রà§\8b",
-       "tog-prefershttps": "প্রবেশ করার সময় সবসময় নিরাপদ সংযোগ ব্যবহার করুন",
+       "tog-showhiddencats": "লà§\81à¦\95ায়িত à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80সমà§\82হ à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95",
+       "tog-norollbackdiff": "রà§\8bলবà§\8dযাà¦\95à§\87র à¦ªà¦°à§\87 à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লির à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয à¦¨à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95",
+       "tog-useeditwarning": "à¦\95à§\8bনà§\8b à¦¸à¦®à§\8dপাদনা à¦ªà¦¾à¦¤à¦¾ à¦¤à§\8dযাà¦\97à§\87র à¦¸à¦®à¦¯à¦¼ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¸à¦\82রà¦\95à§\8dষিত à¦¨à¦¾ à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95লà§\87 à¦\86মাà¦\95à§\87 à¦¸à¦¾à¦¬à¦§à¦¾à¦¨ à¦\95রা à¦¹à§\8bà¦\95",
+       "tog-prefershttps": "à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রার à¦¸à¦®à¦¯à¦¼ à¦¸à¦¬à¦¸à¦®à¦¯à¦¼ à¦¨à¦¿à¦°à¦¾à¦ªà¦¦ à¦¸à¦\82যà§\8bà¦\97 à¦¬à§\8dযবহার à¦\95রà§\81ন",
        "underline-always": "সব সময়",
        "underline-never": "কখনো নয়",
        "underline-default": "স্কিন অথবা ব্রাউজারে যেমনভাবে নির্দিষ্ট করা আছে",
-       "editfont-style": "সমà§\8dপাদনা à¦\8fলাà¦\95ার à¦«à¦¨à§\8dà¦\9f à¦¸à§\8dà¦\9fাà¦\87ল:",
-       "editfont-default": "ব্রাউজার পূর্বনির্ধারিত",
+       "editfont-style": "সমà§\8dপাদনা à¦\8fলাà¦\95ার à¦«à¦¨à§\8dà¦\9f à¦¶à§\88লà§\80:",
+       "editfont-default": "বà§\8dরাà¦\89à¦\9cার à¦¦à§\8dবারা à¦ªà§\82রà§\8dবনিরà§\8dধারিত",
        "editfont-monospace": "মনোস্পেস ফন্ট",
        "editfont-sansserif": "স্যান্স-সেরিফ ফন্ট",
        "editfont-serif": "সেরিফ ফন্ট",
        "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",
+       "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|লুকায়িত বিষয়শ্রেণী|লুকায়িত বিষয়শ্রেণীসমূহ}}",
+       "category-empty": "<em>এই বিষয়শ্রণীতে বর্তমানে কোন পাতা বা মিডিয়া ফাইল নেই।</em>",
+       "hidden-categories": "{{PLURAL:$1|লুকায়িত বিষয়শ্রেণী}}",
        "hidden-category-category": "লুকায়িত বিষয়শ্রেণীসমূহ",
-       "category-subcat-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবলমাত্র নিচের উপবিষয়শ্রেণীটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি উপবিষয়শ্রেণীর মধ্যে {{PLURAL:$1|টি উপবিষয়শ্রেণী|$1টি উপবিষয়শ্রেণী}} নিচে দেখানো হয়েছে।}}",
-       "category-subcat-count-limited": "à¦\8fà¦\87 à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80তà§\87 à¦¨à¦¿à¦\9aà§\87র {{PLURAL:$1|à¦\9fি à¦\89পবিষয়শà§\8dরà§\87ণà§\80|$1à¦\9fি à¦\89পবিষয়শà§\8dরà§\87ণà§\80 à¦\86à¦\9bà§\87}}।",
-       "category-article-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবল নিচের পাতাটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি পাতার মধ্যে {{PLURAL:$1|টি পাতা|$1টি পাতা}} নিচে দেখানো হল।}}",
-       "category-article-count-limited": "à¦\8fà¦\87 {{PLURAL:$1|পাতাà¦\9fি|$1 à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লà§\8b}} à¦\8f বিষয়শ্রেণীতে রয়েছে।",
-       "category-file-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবল নিচের পাতাটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি পাতার মধ্যে {{PLURAL:$1|টি পাতা|$1টি পাতা}} নিচে দেখানো হলো।}}",
+       "category-subcat-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবলমাত্র নিচের উপবিষয়শ্রেণীটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি উপবিষয়শ্রেণীর মধ্যে {{PLURAL:$1|$1টি উপবিষয়শ্রেণী}} নিচে দেখানো হয়েছে।}}",
+       "category-subcat-count-limited": "à¦\8fà¦\87 à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80তà§\87 à¦¨à¦¿à¦\9aà§\87র {{PLURAL:$1|à¦\89পবিষয়শà§\8dরà§\87ণà§\80|$1à¦\9fি à¦\89পবিষয়শà§\8dরà§\87ণà§\80}} à¦\86à¦\9bà§\87।",
+       "category-article-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবল নিচের পাতাটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি পাতার মধ্যে {{PLURAL:$1|$1টি পাতা}} নিচে দেখানো হল।}}",
+       "category-article-count-limited": "নিà¦\9aà§\87র {{PLURAL:$1|পাতাà¦\9fি|$1 à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লà§\8b}} à¦\8fà¦\87 বিষয়শ্রেণীতে রয়েছে।",
+       "category-file-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবল নিচের পাতাটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি পাতার মধ্যে {{PLURAL:$1|$1টি পাতা}} নিচে দেখানো হলো।}}",
        "category-file-count-limited": "নিচের {{PLURAL:$1|ফাইলটি|$1 ফাইলগুলো}} এই বিষয়শ্রেণীতে রয়েছে।",
        "listingcontinuesabbrev": "আরও আছে",
        "index-category": "নির্ঘণ্ট পাতা",
        "noindex-category": "নির্ঘণ্ট নয় এমন পাতা",
-       "broken-file-category": "à¦\85à¦\95ারà§\8dযà¦\95র à¦\9aিতà§\8dর সংযোগসহ পাতাসমূহ",
+       "broken-file-category": "à¦\85à¦\95ারà§\8dযà¦\95র à¦«à¦¾à¦\87ল সংযোগসহ পাতাসমূহ",
        "about": "পরিচিতি",
        "article": "বিষয়বস্তুর পাতা",
        "newwindow": "(নতুন উইন্ডোতে খুলবে)",
        "qbbrowse": "ব্রাউজ",
        "qbedit": "সম্পাদনা",
        "qbpageoptions": "এই পাতা",
-       "qbmyoptions": "à¦\86মার à¦ªà¦¾à¦¤à¦¾à¦¸à¦®à§\82হ",
+       "qbmyoptions": "à¦\86মার à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লি",
        "faq": "প্রাজিপ্র",
        "faqpage": "Project:প্রাজিপ্র",
        "actions": "কার্যক্রম",
        "namespaces": "নামস্থান",
        "variants": "বিকল্পসমূহ",
-       "navigation-heading": "পরিভà§\8dরমণ à¦®à§\87নà§\81",
+       "navigation-heading": "পরিভà§\8dরমণ à¦¬à¦¾à¦\9bাà¦\87তালিà¦\95া",
        "errorpagetitle": "ত্রুটি",
        "returnto": "$1 পাতায় ফেরত যান।",
        "tagline": "{{SITENAME}} থেকে",
        "help": "সাহায্য",
        "search": "অনুসন্ধান",
+       "search-ignored-headings": " #<!-- এই লাইনটিকে ঠিক যেমন আছে তেমনটি রেখে দিন --> <pre>\n# যেসব শিরোনাম অনুসন্ধানে অগ্রাহ্য করা হবে।\n# যখনই শিরোনামযুক্ত পাতাটি সূচীভুক্ত হবে, তখনই এখানকার কোন পরিবর্তন বাস্তবায়িত হবে।\n# আপনি একটি নাল/শূন্য সম্পাদনা করে পাতাটিকে বলপূর্বক পুনঃসূচীভুক্ত করতে পারেন।\n# সিনট্যাক্স বা পদক্রম/পদবিন্যাসের নিয়মগুলি নিম্নরূপ:\n#   * অক্ষর থেকে শুরু করে লাইনের শেষ পর্যন্ত সবকিছু হচ্ছে একটি মন্তব্য বা কমেন্ট।\n#   * প্রতিটি অশূন্য লাইন হচ্ছে যে শিরোনামটি অগ্রাহ্য করা হবে, বড় হাতের লেখা এবং অন্যান্য সবকিছু গণনায় ধরে।\nতথ্যসূত্র\nবহিঃসংযোগ\nআরও দেখুন\n#</pre> <!-- এই লাইনটিকে ঠিক যেমন আছে তেমনটি রেখে দিন -->",
        "searchbutton": "অনুসন্ধান",
        "go": "চলো",
        "searcharticle": "চলো",
        "printableversion": "ছাপার যোগ্য সংস্করণ",
        "permalink": "স্থায়ী সংযোগ",
        "print": "মুদ্রণ",
-       "view": "দà§\87à¦\96াà¦\93",
+       "view": "দà§\87à¦\96à§\81ন",
        "view-foreign": "$1-এ দেখুন",
        "edit": "সম্পাদনা",
        "edit-local": "স্থানীয় বিবরণ সম্পাদনা করুন",
-       "create": "তৈরি",
+       "create": "তৈরি করুন",
        "create-local": "স্থানীয় বিবরণ যোগ করুন",
        "editthispage": "এই পাতাটি সম্পাদনা করুন",
-       "create-this-page": "পাতাà¦\9fি à¦¤à§\88রি à¦\95রà§\8b",
+       "create-this-page": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¤à§\88রি à¦\95রà§\81ন",
        "delete": "অপসারণ",
-       "deletethispage": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লুন",
-       "undeletethispage": "পাতাà¦\9fি à¦ªà§\81নরà§\81দà§\8dধার à¦\95রà§\8b",
+       "deletethispage": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\85পসারণ à¦\95রুন",
+       "undeletethispage": "পাতাà¦\9fি à¦ªà§\81নরà§\81দà§\8dধার à¦\95রà§\81ন",
        "undelete_short": "{{PLURAL:$1|১টি সম্পাদনা|$1টি সম্পাদনা}} পুনঃস্থাপন করুন",
-       "viewdeleted_short": "{{PLURAL:$1|à¦\8fà¦\95à¦\9fি à¦\85পসারিত à¦¸à¦®à§\8dপাদনা|$1à¦\9fি à¦\85পসারিত à¦¸à¦®à§\8dপাদনা}} à¦¦à§\87à¦\96াà¦\93",
+       "viewdeleted_short": "{{PLURAL:$1|à¦\8fà¦\95à¦\9fি à¦\85পসারিত à¦¸à¦®à§\8dপাদনা|$1à¦\9fি à¦\85পসারিত à¦¸à¦®à§\8dপাদনা}} à¦¦à§\87à¦\96à§\81ন",
        "protect": "সুরক্ষা",
        "protect_change": "পরিবর্তন করুন",
-       "protectthispage": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\95à§\87 à¦¸à§\81রà¦\95à§\8dষিত à¦\95রà§\8b",
+       "protectthispage": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à§\81রà¦\95à§\8dষিত à¦\95রà§\81ন",
        "unprotect": "সুরক্ষা পরিবর্তন",
        "unprotectthispage": "এই পাতার সুরক্ষা পরিবর্তন করুন",
        "newpage": "নতুন পাতা",
        "tool-link-userrights": "{{GENDER:$1|ব্যবহারকারী}} দল পরিবর্তন করুন",
        "tool-link-userrights-readonly": "{{GENDER:$1|ব্যবহারকারী}} দল দেখুন",
        "tool-link-emailuser": "এই {{GENDER:$1|ব্যবহারকারী}}কে ইমেইল পাঠান",
-       "userpage": "বà§\8dযাবহারà¦\95ারà§\80র à¦ªà¦¾à¦¤à¦¾ à¦¦à§\87à¦\96à§\81ন",
-       "projectpage": "মà§\87à¦\9fা-পাতা দেখুন",
+       "userpage": "ব্যবহারকারীর পাতা দেখুন",
+       "projectpage": "পà§\8dরà¦\95লà§\8dপ à¦ªà¦¾à¦¤à¦¾à¦\9fি দেখুন",
        "imagepage": "ফাইল পাতা দেখুন",
        "mediawikipage": "বার্তার পাতা দেখুন",
        "templatepage": "টেমপ্লেট পাতা দেখুন",
        "redirectedfrom": "($1 থেকে পুনর্নির্দেশিত)",
        "redirectpagesub": "পুনর্নির্দেশ পাতা",
        "redirectto": "পুননির্দেশিত হয়েছে:",
-       "lastmodifiedat": "এ পাতায় শেষ পরিবর্তন হয়েছিল $2টার সময়, $1 তারিখে।",
-       "viewcount": "এ পাতাটি {{PLURAL:$1|বার|$1 বার}} দেখা হয়েছে।",
+       "lastmodifiedat": "এই পাতা শেষ সম্পাদিত হয়েছে $2টার সময়, $1 তারিখে।",
+       "viewcount": "এই পাতাটি {{PLURAL:$1|একবার|$1 বার}} দেখা হয়েছে।",
        "protectedpage": "সুরক্ষিত পাতা",
-       "jumpto": "à¦\9dাà¦\81প à¦¦াও:",
+       "jumpto": "সরাসরি à¦¯াও:",
        "jumptonavigation": "পরিভ্রমণ",
        "jumptosearch": "অনুসন্ধান",
        "view-pool-error": "দুঃখিত, সার্ভারে এ মূহুর্তে অতিরিক্ত চাপ রয়েছে।\nঅনেক বেশি সংখ্যক ব্যবহারকারী এই পাতাটি দেখার চেষ্টা করছেন।\nনতুন করে এ পাতাটি দেখার চেষ্টা করার আগে কিছুক্ষণ অপেক্ষা করুন।\n\n$1",
        "generic-pool-error": "দুঃখিত, সার্ভারে এ মূহুর্তে অতিরিক্ত চাপ রয়েছে।\nঅনেক বেশি সংখ্যক ব্যবহারকারী এই পাতাটি দেখার চেষ্টা করছেন।\nনতুন করে এ পাতাটি দেখার চেষ্টা করার আগে কিছুক্ষণ অপেক্ষা করুন।",
-       "pool-timeout": "সময় à¦\89তà§\8dতিরà§\8dণ à¦²à¦\95-à¦\8fর à¦\9cনà§\8dয à¦\85পà§\87à¦\95à§\8dষারত",
+       "pool-timeout": "à¦\85বরà§\8bধà§\87র à¦\9cনà§\8dয à¦\85পà§\87à¦\95à§\8dষা à¦\95রতà§\87 à¦\97িয়à§\87 à¦¸à¦®à¦¯à¦¼ à¦\89তà§\8dতà§\80রà§\8dণ",
        "pool-queuefull": "পুলের লাইন পূর্ণ",
        "pool-errorunknown": "অজানা ত্রুটি",
        "pool-servererror": "পুল কাউন্টার সার্ভিস নিষ্ক্রিয় ($1)।",
        "privacy": "গোপনীয়তার নীতি",
        "privacypage": "Project:গোপনীয়তার নীতি",
        "badaccess": "অনুমোদন ত্রুটি",
-       "badaccess-group0": "আপনি যে কাজের জন্য অনুরোধ করেছেন, যে কাজটি সম্পন্ন করার অনুমতি নেই।",
+       "badaccess-group0": "আপনি যে কাজের জন্য অনুরোধ করেছেন তা আপনার সম্পন্ন করার অনুমতি নেই।",
        "badaccess-groups": "আপনি যে কাজটি করতে চাচ্ছেন তা কেবল {{PLURAL:$2|এই দলের|এই দলগুলির যেকোন একটির}} একজন সদস্য ব্যবহারকারী সম্পাদন করতে পারেন: $1।",
        "versionrequired": "মিডিয়াউইকির $1 নং সংস্করণ প্রয়োজন",
        "versionrequiredtext": "এই পাতাটি ব্যবহার করার জন্য মিডিয়াউইকির $1 নং সংস্করণ প্রয়োজন। [[Special:Version|সংস্করণ পাতা]] দেখুন।",
        "youhavenewmessagesmulti": "আপনার $1টি নতুন বার্তা এসেছে",
        "editsection": "সম্পাদনা",
        "editold": "সম্পাদনা",
-       "viewsourceold": "à¦\89à§\8eস à¦¦à§\87à¦\96াà¦\93",
+       "viewsourceold": "à¦\89à§\8eস à¦¦à§\87à¦\96à§\81ন",
        "editlink": "সম্পাদনা",
        "viewsourcelink": "উৎস দেখুন",
        "editsectionhint": "অনুচ্ছেদ সম্পাদনা: $1",
        "toc": "পরিচ্ছেদসমূহ",
        "showtoc": "দেখাও",
-       "hidetoc": "à¦\86ড়ালà§\87 à¦°à¦¾à¦\96à§\8b",
+       "hidetoc": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96à§\81ন",
        "collapsible-collapse": "সংকোচন",
        "collapsible-expand": "প্রসারণ",
        "confirmable-confirm": "{{GENDER:$1|আপনি}} কি নিশ্চিত?",
        "confirmable-yes": "হ্যাঁ",
        "confirmable-no": "না",
-       "thisisdeleted": "$1 à¦¦à§\87à¦\96ানà§\8b à¦¬à¦¾ à¦ªà§\81নà¦\83সà§\83ষà§\8dà¦\9fি à¦\95রা à¦¹à§\8bà¦\95?",
-       "viewdeleted": "$1 à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95?",
+       "thisisdeleted": "$1 à¦¦à§\87à¦\96বà§\87ন à¦¬à¦¾ à¦ªà§\81নরà§\81দà§\8dধার à¦\95রবà§\87ন?",
+       "viewdeleted": "$1 à¦¦à§\87à¦\96বà§\87ন?",
        "restorelink": "{{PLURAL:$1|একটি মুছে ফেলা সম্পাদনা|$1টি মুছে ফেলা সম্পাদনা}}",
        "feedlinks": "ফিড:",
        "feed-invalid": "গ্রাহক ফিডের ধরন অবৈধ।",
        "page-atom-feed": "\"$1\" অ্যাটম ফিড",
        "feed-atom": "অ্যাটম",
        "red-link-title": "$1 (পাতার অস্তিত্ব নেই)",
-       "sort-descending": "à¦\89লà§\8dà¦\9fà§\8b à¦¬à¦°à§\8dণà¦\95à§\8dরমà§\87 à¦¸à¦¾à¦\9cাà¦\93",
-       "sort-ascending": "বরà§\8dণানà§\81à¦\95à§\8dরমà§\87 à¦¸à¦¾à¦\9cাà¦\93",
+       "sort-descending": "à¦\89লà§\8dà¦\9fà§\8b à¦¬à¦°à§\8dণà¦\95à§\8dরমà§\87 à¦¸à¦¾à¦\9cান",
+       "sort-ascending": "বরà§\8dণানà§\81à¦\95à§\8dরমà§\87 à¦¸à¦¾à¦\9cান",
        "nstab-main": "পাতা",
        "nstab-user": "ব্যবহারকারীর পাতা",
        "nstab-media": "মিডিয়া পাতা",
        "nosuchspecialpage": "এমন কোন বিশেষ পাতা নেই",
        "nospecialpagetext": "<strong>আপনি একটি অবৈধ বিশেষ পাতার অনুরোধ করেছেন।</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]]-এ বৈধ বিশেষ পাতাগুলির একটি তালিকা পাবেন।",
        "error": "ত্রুটি",
-       "databaseerror": "ডাà¦\9fাবà§\87স ত্রুটি",
-       "databaseerror-text": "ডাটাবেজ অনুসন্ধান ত্রুটি।\nএটি সফটওয়্যারের একটি ত্রুটি হতে পারে।",
-       "databaseerror-textcl": "ডাটাবেজ অনুসন্ধান ত্রুটি।",
+       "databaseerror": "ডাà¦\9fাবà§\87à¦\9c ত্রুটি",
+       "databaseerror-text": "ডাটাবেজ অনুসন্ধানে একটি ত্রুটি উৎপন্ন হয়েছে।\nএটি সফটওয়্যারের কোন ত্রুটির কারণে হতে পারে।",
+       "databaseerror-textcl": "ডাটাবেজ অনুসন্ধানে একটি ত্রুটি উৎপন্ন হয়েছে।",
        "databaseerror-query": "অনুসন্ধান: $1",
        "databaseerror-function": "ফাংশন: $1",
        "databaseerror-error": "ত্রুটি: $1",
-       "laggedslavemode": "সতর্কীকরণ: পাতাটি সম্ভবত সম্প্রতি হালনাগাদকৃত নয়।",
-       "readonly": "ডেটাবেজের ব্যবহার সীমাবদ্ধ",
-       "enterlockreason": "তালাবদ্ধ করার কারণ কি তা বলুন, সাথে কখন তালা খুলবেন তার আনুমানিক সময় উল্লখ্য করুন",
-       "readonlytext": "নতুন ভুক্তি এবং অন্যান্য সম্পাদনার জন্য ডাটাবেজ বর্তমানে বন্ধ করা আছে। সম্ভবত ডাটাবেজ রক্ষণাবেক্ষণের নিয়মিত কাজ চলছে। কিছুক্ষণ পরে এটি স্বাভাবিক অবস্থায় ফিরে আসবে।\n\nসিস্টেম প্রশাসক যিনি এটি বন্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
-       "missing-article": "\"$1\" $2 লেখাটি ডাটাবেসের কোন পাতায় খুজে পাওয়া যায়নি।\n\nমুছে ফেলা কোন পাতায় সংযোগ থাকার কারনেই সাধারণত এমনটি ঘটে।\n\nযদি এমনটি না হয়, তাহলে আপনি সফটওয়্যারে কোন ত্রুটি খুজে পেয়েছেন।\nদয়াকরে এ ব্যাপার সম্পর্কে ইউআরএল সহ কোন [[Special:ListUsers/sysop|প্রশাসককে]] জানান।",
+       "transaction-duration-limit-exceeded": "দীর্ঘ পুনঃসৃষ্টি বিলম্ব এড়ানোর জন্য এই ট্রানজাকশনটি বাতিল করা হল, কারণ লিখনের স্থায়িত্ব ($1) $2 সেকেন্ড সীমাটিকে অতিক্রম করে গিয়েছিল। \nযদি আপনি অনেকগুলি আইটেম একসাথে পরিবর্তন করতে চান, তাহলে একাধিক ক্ষুদ্রতর অপারেশন সম্পন্ন করার চেষ্টা করুন।",
+       "laggedslavemode": "<strong>সতর্ক বার্তা:</strong> পাতাটি সম্ভবত সম্প্রতি হালনাগাদ করা হয়নি।",
+       "readonly": "ডাটাবেজ অবরুদ্ধ",
+       "enterlockreason": "অবরুদ্ধ করার কারণ কী তা বলুন, সাথে কখন অবরোধ খুলবেন তার আনুমানিক সময় উল্লেখ করুন",
+       "readonlytext": "নতুন ভুক্তি এবং অন্যান্য সম্পাদনার জন্য ডাটাবেজ বর্তমানে অবরুদ্ধ করা আছে। সম্ভবত ডাটাবেজ রক্ষণাবেক্ষণের নিয়মিত কাজ চলছে। কাজ শেষ হলে এটি স্বাভাবিক অবস্থায় ফিরে আসবে।\n\nযে সিস্টেম প্রশাসক এটি অবরুদ্ধ করেছেন, তিনি এই ব্যাখ্যা দিয়েছেন: $1",
+       "missing-article": "\"$1\" পাতাটির $2 লেখাটি ডাটাবেজ খুঁজে পায়নি, যদিও খুঁজে পাওয়ার কথা ছিল।\n\nসাধারণত কোন মেয়াদোত্তীর্ণ সংশোধন পার্থক্য অনুসরণ করলে অথবা  \nমুছে ফেলা কোন পাতার ইতিহাসের সংযোগ অনুসরণ করলে এমনটি ঘটে।\n\nযদি এমনটি না হয়, তাহলে আপনি হয়ত সফটওয়্যারে কোন ত্রুটি খুঁজে পেয়েছেন।\n\nঅনুগ্রহ করে ইউআরএল-টি উল্লেখ করে এ ব্যাপারে কোন [[Special:ListUsers/sysop|প্রশাসককে]] অবহিত করুন।",
        "missingarticle-rev": "(সংস্করণ#: $1)",
        "missingarticle-diff": "(পার্থক্য: $1, $2)",
-       "readonly_lag": "ডাà¦\9fাবà§\87à¦\9c à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¬à¦¨্ধ করে দেয়া হয়েছে, যাতে অধীন ডাটাবেজ সার্ভারগুলি প্রধান ডাটাবেজ সার্ভারের অবস্থায় আসতে পারে।",
+       "readonly_lag": "ডাà¦\9fাবà§\87à¦\9c à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦\85বরà§\81দ্ধ করে দেয়া হয়েছে, যাতে অধীন ডাটাবেজ সার্ভারগুলি প্রধান ডাটাবেজ সার্ভারের অবস্থায় আসতে পারে।",
        "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' HTTP শিরলেখে পাঠানো হয়েছিল কিন্তু অনুরোধটি একটি API লিখন মডিউলে ছিল।",
-       "internalerror": "à¦\86ভ্যন্তরীণ ত্রুটি",
-       "internalerror_info": "à¦\86ভ্যন্তরীণ ত্রুটি: $1",
+       "internalerror": "à¦\85ভ্যন্তরীণ ত্রুটি",
+       "internalerror_info": "à¦\85ভ্যন্তরীণ ত্রুটি: $1",
        "internalerror-fatal-exception": "\"$1\" ধরনের মারাত্মক ব্যতিক্রম",
-       "filecopyerror": "\"$1\" à¦¥à§\87à¦\95à§\87 \"$2\" à¦«à¦¾à¦\87ল à¦\85নà§\81লিপি করা যায়নি।",
-       "filerenameerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fির à¦¨à¦¾à¦® à¦¬à¦¦à¦²à§\87 \"$2\" à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾।",
-       "filedeleteerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾।",
-       "directorycreateerror": "\"$1\" à¦¡à¦¾à¦\87রà§\87à¦\95à§\8dà¦\9fরি তৈরি করা যায়নি।",
-       "directoryreadonlyerror": "নির্দেশিকা \"$1\" শুধুমাত্র পাঠযোগ্য।",
-       "directorynotreadableerror": "নির্দেশিকা \"$1\" পাঠযোগ্য নয়।",
-       "filenotfound": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি à¦\96à§\81à¦\81à¦\9cà§\87 à¦ªà¦¾à¦\93য়া à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾।",
+       "filecopyerror": "\"$1\" à¦¨à¦¾à¦® à¦¥à§\87à¦\95à§\87 \"$2\" à¦¨à¦¾à¦®à§\87 à¦«à¦¾à¦\87ল à¦ªà§\8dরতিলিপি করা যায়নি।",
+       "filerenameerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fির à¦¨à¦¾à¦® à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রà§\87 \"$2\" à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦¯à¦¼à¦¨à¦¿।",
+       "filedeleteerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¸à¦®à§\8dভব à¦¹à¦¯à¦¼à¦¨à¦¿।",
+       "directorycreateerror": "\"$1\" à¦¨à¦¿à¦°à§\8dদà§\87শিà¦\95া তৈরি করা যায়নি।",
+       "directoryreadonlyerror": "\"$1\" নির্দেশিকাটি শুধুমাত্র পাঠযোগ্য।",
+       "directorynotreadableerror": "\"$1\" নির্দেশিকাটি পাঠযোগ্য নয়।",
+       "filenotfound": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি à¦\96à§\81à¦\81à¦\9cà§\87 à¦ªà¦¾à¦\93য়া à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿।",
        "unexpected": "অপ্রত্যাশিত মান: \"$1\"=\"$2\"।",
-       "formerror": "তà§\8dরà§\81à¦\9fি: à¦«à¦°à¦®à¦\9fি à¦\9cমা à¦¦à§\87à¦\93য়া à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿",
+       "formerror": "তà§\8dরà§\81à¦\9fি: à¦«à¦°à¦®à¦\9fি à¦\9cমা à¦¦à§\87à¦\93য়া à¦¸à¦®à§\8dভব à¦¹à¦¯à¦¼à¦¨à¦¿à¥¤",
        "badarticleerror": "এই পাতায় এই কাজটি করা সম্ভব নয়।",
-       "cannotdelete": "\"$1\" à¦ªà¦¾à¦¤à¦¾ à¦¬à¦¾ à¦«à¦¾à¦\87লà¦\9fি à¦®à§\8bà¦\9bা à¦¸à¦®à§\8dভব à¦¨à¦¾।\nসম্ভবত অন্য কেউ আগেই এটিকে মুছে ফেলেছেন।",
-       "cannotdelete-title": "\"$1\" à¦ªà§\83ষà§\8dঠা à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾à¥¤",
-       "delete-hook-aborted": "হà§\82à¦\95 à¦¦à§\8dবারা à¦¸à¦®à§\8dপাদনা à¦ªà¦°à¦¿à¦¤à§\8dযà¦\95à§\8dত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\8fর à¦\95à§\8bন à¦¬à§\8dযাà¦\96à§\8dযা à¦¨à¦¾à¦\87।",
+       "cannotdelete": "\"$1\" à¦ªà¦¾à¦¤à¦¾ à¦¬à¦¾ à¦«à¦¾à¦\87লà¦\9fি à¦®à§\8bà¦\9bা à¦¸à¦®à§\8dভব à¦¹à¦¯à¦¼à¦¨à¦¿।\nসম্ভবত অন্য কেউ আগেই এটিকে মুছে ফেলেছেন।",
+       "cannotdelete-title": "\"$1\" à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾",
+       "delete-hook-aborted": "হà§\81à¦\95à§\87র à¦\95ারণà§\87 à¦ªà¦¾à¦¤à¦¾ à¦®à§\8bà¦\9bার à¦\95াà¦\9cà¦\9fি à¦ªà¦°à¦¿à¦¤à§\8dযà¦\95à§\8dত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\95à§\8bন à¦¬à§\8dযাà¦\96à§\8dযা à¦¦à§\87য়া à¦¹à¦¯à¦¼à¦¨à¦¿।",
        "no-null-revision": "\"$1\" পাতার জন্য ফাঁকা সংস্করণ তৈরী করা যায়নি",
-       "badtitle": "শিরà§\8bনামà¦\9fি à¦\97à§\8dরহনযà§\8bà¦\97à§\8dয à¦¨à¦¯à¦¼à¥¤",
+       "badtitle": "ভà§\81ল à¦¶à¦¿à¦°à§\8bনাম",
        "badtitletext": "অনুরোধকৃত পাতার শিরোনামটি অবৈধ, খালি কিংবা কোন ভুল আন্তঃভাষা বা আন্তঃউইকি শিরোনাম সংযোগ ছিল। এটিতে সম্ভবত এমন এক (একাধিক) ক্যারেক্টার আছে, যা (যেগুলি) শিরোনামে ব্যবহারযোগ্য নয়।",
        "title-invalid-empty": "অনুরোধকৃত পাতার শিরোনামটি খালি বা শুধুমাত্র একটি নামস্থানের নাম ধারণ করে।",
        "title-invalid-utf8": "অনুরোধকৃত পাতার শিরোনামটিতে একটি অবৈধ ইউটিএফ-৮ অনুক্রম রয়েছে।",
        "title-invalid-interwiki": "অনুরোধকৃত পাতার শিরোনামে একটি আন্তঃউইকি সংযোগ উপস্থিত রয়েছে যা শিরোনামে ব্যবহার করা যাবে না।",
-       "title-invalid-talk-namespace": "অনুরোধকৃত পাতার শিরোনাম একটি আলাপ পাতা নির্দেশ করে যার অস্তিত্ব থাকতে পারে না।",
+       "title-invalid-talk-namespace": "à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦° à¦¶à¦¿à¦°à§\8bনাম à¦\8fমন à¦\8fà¦\95à¦\9fি à¦\86লাপ à¦ªà¦¾à¦¤à¦¾ à¦¨à¦¿à¦°à§\8dদà§\87শ à¦\95রà§\87 à¦¯à¦¾à¦° à¦\85সà§\8dতিতà§\8dব à¦¥à¦¾à¦\95তà§\87 à¦ªà¦¾à¦°à§\87 à¦¨à¦¾à¥¤",
        "title-invalid-characters": "অনুরোধকৃত পাতার শিরোনামে অবৈধ অক্ষর রয়েছে: \"$1\"।",
        "title-invalid-relative": "শিরনামে রিলেটিভ পাথ ব্যবহার করা হয়েছে (./, ../), রিলেটিভ পাথ ব্যবহার উপযোগী নয়, কারণ ব্যবহারকারীর ব্রাউজারে এটি সঠিকভাবে কাজ করে না।",
        "title-invalid-magic-tilde": "অনুরোধকৃত পাতার শিরোনামে অবৈধ জাদু টিল্ডা অনুক্রম (<nowiki>~~~</nowiki>) রয়েছে।",
-       "title-invalid-too-long": "পাতার à¦¶à¦¿à¦°à§\8bনামà¦\9fি à¦\85তà§\8dযাধিà¦\95 à¦¦à§\80রà§\8dà¦\98। à¦\87à¦\89à¦\9fিà¦\8fফ-৮ à¦\8fনà¦\95à§\8bডিà¦\82 à¦\85নà§\81যায়à§\80 à¦\8fà¦\9fি $1 {{PLURAL:$1|বাà¦\87à¦\9fà§\87র}} à¦¥à§\87à¦\95à§\87 à¦¦à§\80রà§\8dà¦\98 হতে পারবে না।",
-       "title-invalid-leading-colon": "à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦° à¦¶à¦¿à¦°à§\8bনামà§\87র à¦¶à§\81রà§\81তà§\87 à¦\8fà¦\95à¦\9fি à¦\85বà§\88ধ à¦\95à§\8bলন রয়েছে।",
+       "title-invalid-too-long": "à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦° à¦¶à¦¿à¦°à§\8bনামà¦\9fি à¦\85তà§\8dযধিà¦\95 à¦¦à§\80রà§\8dà¦\98। à¦\87à¦\89à¦\9fিà¦\8fফ-৮ à¦¸à¦¾à¦\82à¦\95à§\87তিà¦\95à§\80à¦\95রণ à¦\85নà§\81যায়à§\80 à¦\8fà¦\9fি $1 {{PLURAL:$1|বাà¦\87à¦\9fà§\87র}} à¦¥à§\87à¦\95à§\87 à¦¦à§\80রà§\8dà¦\98তর হতে পারবে না।",
+       "title-invalid-leading-colon": "à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦° à¦¶à¦¿à¦°à§\8bনামà¦\9fির à¦¶à§\81রà§\81তà§\87 à¦\8fà¦\95à¦\9fি à¦\85বà§\88ধ à¦\95à§\8bলন à¦\9aিহà§\8dন (:) রয়েছে।",
        "perfcached": "নিচের উপাত্তগুলো ক্যাশ থেকে নেয়া এবং সম্পূর্ণ হালনাগাদকৃত না-ও হতে পারে। সর্বোচ্চ {{PLURAL:$1|একটি ফলাফল|$1 টি ফলাফল}} ক্যাশে থাকতে পারে।",
-       "perfcachedts": "নিচের উপাত্তগুলো ক্যাশ থেকে নেয়া এবং $1 তারিখে হালনাগাদ করা হয়েছে। সর্বোচ্চ {{PLURAL:$4|একটি ফলাফল|$4 টি ফলাফল}} ক্যাশে থাকতে পারে।",
-       "querypage-no-updates": "এই পাতার জন্য হালনাগাদ নিষ্ক্রিয় করা হয়েছে। এখানে রাখা উপাত্ত এ মুহূর্তে রিফ্রেশ করা হবে না।",
+       "perfcachedts": "নিচের উপাত্তগুলো ক্যাশ থেকে নেয়া এবং সর্বশেষ $1 তারিখে হালনাগাদ করা হয়েছে। এতে সর্বোচ্চ {{PLURAL:$4|একটি ফলাফল|$4টি ফলাফল}} ক্যাশে থাকতে পারে।",
+       "querypage-no-updates": "এই পাতার জন্য হালনাগাদ নিষ্ক্রিয় করা হয়েছে। এখানে রাখা উপাত্তগুলি এ মুহূর্তে হালনাগাদ করা হবে না।",
        "viewsource": "উৎস দেখুন",
-       "viewsource-title": "$1 এর উৎস দেখুন",
+       "viewsource-title": "$1-এর উৎস দেখুন",
        "actionthrottled": "কাজের গতি ধীরকরণ",
-       "actionthrottledtext": "সà§\8dপà§\8dযাম-রà§\8bধà§\80 à¦¸à¦®à¦¾à¦§à¦¾à¦¨ à¦¹à¦¿à¦¸à§\87বà§\87 à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦\96à§\81ব à¦\95ম à¦¸à¦®à¦¯à¦¼à§\87 à¦\85নà§\87à¦\95 à¦¬à§\87শিবার à¦¸à¦®à§\8dপাদনা à¦\95রার সীমা বেঁধে দেওয়া হয়েছে, এবং আপনি সেই সীমা অতিক্রম করেছেন।\nঅনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
-       "protectedpagetext": "সমà§\8dপাদনা à¦\85থবা à¦¸à§\8dথানানà§\8dতর à¦\8fড়াতà§\87 à¦\8f à¦ªà¦¾à¦¤à¦¾à¦\9fির à¦¬à§\8dযবহার à¦¨à¦¿à¦¯à¦¼à¦¨à§\8dতà§\8dরণ করা হয়েছে।",
-       "viewsourcetext": "à¦\8f à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনি à¦¦à§\87à¦\96তà§\87 à¦\8fবà¦\82 à¦\89à§\8eসà§\87র à¦\85নà§\81লিপি à¦¨à¦¿তে পারবেন।",
-       "viewyourtext": "আপনি এই পাতায় <strong>আপনার সম্পাদনা</strong>দেখতে এবং অনুলিপি করতে পারেন।",
-       "protectedinterface": "এই পাতার বিষয়বস্তু এই উইকি সফটওয়্যারের একটি ইন্টারফেস বার্তা প্রদান করে, তাই এটিকে সুরক্ষিত করে রাখা হয়েছে।\nসকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে, অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করন প্রকল্প [https://translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
-       "editinginterface": "<strong>সতর্কীকরণ:</strong> আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস টেক্সট প্রদান করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির ব্যবহারকারীদের ইন্টারফেসে প্রভাব ফেলবে, যা অন্য ব্যবহারকারীরা দেখতে পাবেন।",
-       "translateinterface": "সকল উইকির জন্য অনুবাদ যোগ বা পরিবর্তন করতে, দয়া করে [https://translatewiki.net/ translatewiki.net], মিডিয়াউইকি স্থানীয়করণ প্রকল্প ব্যবহার করুন।",
-       "cascadeprotected": "এই পাতাটি সম্পাদনা থেকে সুরক্ষিত কারণ এটি নিম্নোক্ত {{PLURAL:$1|পাতায়|পাতাসমূহে}} অন্তর্ভুক্ত, যা \"প্রপাতাকার\" বৈশিষ্ট্য সহযোগে সুরক্ষিত করা আছে:\n$2",
-       "namespaceprotected": "'''$1''' নামস্থানে কোন পাতা আপনার সম্পাদনা করার অনুমতি নেই।",
+       "actionthrottledtext": "à¦\85পবà§\8dযবহার à¦ªà§\8dরতিরà§\8bধà¦\95 à¦¸à¦®à¦¾à¦§à¦¾à¦¨ à¦¹à¦¿à¦¸à§\87বà§\87 à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦\96à§\81ব à¦\95ম à¦¸à¦®à¦¯à¦¼à§\87 à¦\85নà§\87à¦\95 à¦¬à§\87শিবার à¦¸à¦®à§\8dপাদন à¦\95রার à¦\89পর সীমা বেঁধে দেওয়া হয়েছে, এবং আপনি সেই সীমা অতিক্রম করেছেন।\nঅনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
+       "protectedpagetext": "সমà§\8dপাদনা à¦\85থবা à¦\85নà§\8dযানà§\8dয à¦\95াà¦\9cà§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¤à§\87 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fিà¦\95à§\87 à¦¸à§\81রà¦\95à§\8dষিত করা হয়েছে।",
+       "viewsourcetext": "à¦\8f à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনি à¦¦à§\87à¦\96তà§\87 à¦\8fবà¦\82 à¦\89à§\8eসà§\87র à¦ªà§\8dরতিলিপি à¦\95রতে পারবেন।",
+       "viewyourtext": "আপনি এই পাতায় করা <strong>আপনার সম্পাদনাগুলি</strong> দেখতে এবং প্রতিলিপি করতে পারেন।",
+       "protectedinterface": "এই পাতার বিষয়বস্তু এই উইকি সফটওয়্যারের একটি ইন্টারফেস বার্তা প্রদান করে, তাই এটি যাতে অপব্যবহারে না করা হয়, সেজন্য এটিকে সুরক্ষিত করে রাখা হয়েছে।\nসকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করণ প্রকল্প [https://translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
+       "editinginterface": "<strong>সতর্ক বার্তা:</strong> আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস লেখা সরবরাহ করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির অন্যান্য ব্যবহারকারীদের জন্য দৃশ্যমান ইন্টারফেসে প্রভাব ফেলবে।",
+       "translateinterface": "সকল উইকির জন্য অনুবাদ যোগ বা পরিবর্তন করতে দয়া করে [https://translatewiki.net/ translatewiki.net], মিডিয়াউইকি স্থানীয়করণ প্রকল্প ব্যবহার করুন।",
+       "cascadeprotected": "এই পাতাটিকে সম্পাদনা করা থেকে সুরক্ষিত করা হয়েছে, কারণ এটি নিম্নোক্ত {{PLURAL:$1|পাতায়|পাতাগুলিতে}} অন্তর্ভুক্ত, {{PLURAL:$1|যেটি|যেগুলি}} \"প্রপাতাকার\" বৈশিষ্ট্য সহযোগে সুরক্ষিত করা আছে:\n$2",
+       "namespaceprotected": "<strong>$1</strong> নামস্থানের কোন পাতা আপনার সম্পাদনা করার অনুমতি নেই।",
        "customcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "customjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "mycustomcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "mypreferencesprotected": "আপনার পছন্দসমূহ সম্পাদনা করতে আপনার অনুমতি নেই",
        "ns-specialprotected": "বিশেষ পাতাসমূহ সম্পাদনা করা যাবে না।",
        "titleprotected": "[[User:$1|$1]] কর্তৃক এই শিরোনামটি সৃষ্টি করা থেকে সুরক্ষিত করা হয়েছে। কারণ: <em>$2</em>।",
-       "filereadonlyerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fিà¦\95à§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾ à¦\95ারণ \"$2\" à¦«à¦¾à¦\87ল à¦¸à¦\82à¦\97à§\8dরহসà§\8dথল à¦¶à§\81ধà§\81মাতà§\8dর-পঠন à¦®à§\8bডà§\87 à¦\86à¦\9bà§\87।\n\nসিসà§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fি à¦¬à¦¨্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: \"$3\"।",
+       "filereadonlyerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fিà¦\95à§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾ à¦\95ারণ \"$2\" à¦«à¦¾à¦\87ল à¦¸à¦\82à¦\97à§\8dরহশালাà¦\9fি à¦¶à§\81ধà§\81মাতà§\8dর-পঠন à¦®à§\8bডà§\87 à¦\86à¦\9bà§\87।\n\nসিসà§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦«à¦¾à¦\87লà¦\9fি à¦\85বরà§\81দ্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: \"$3\"।",
        "invalidtitle-knownnamespace": "অবৈধ শিরোনাম, যেখানে নামস্থান \"$2\" এবং লেখা হয়েছে \"$3\"",
        "invalidtitle-unknownnamespace": "অবৈধ শিরোনাম, যেখানে ব্যবহৃত হয়েছে অপরিচিত নামস্থান সংখ্যা $1 এবং লেখা হয়েছে \"$2\"",
        "exception-nologin": "প্রবেশ করেন নি",
        "exception-nologin-text": "এই কাজ করা বা পাতাটি দেখার জন্য অনুগ্রহ করে প্রবেশ করুন।",
        "exception-nologin-text-manual": "অনুগ্রহ করে এই পাতা দেখতে অথবা পরিবর্তন করতে $1 করুন।",
-       "virus-badscanner": "ভুল কনফিগারেশন: অজ্ঞাত ভাইরাস স্কেনার: ''$1''",
+       "virus-badscanner": "ভুল কনফিগারেশন: অজ্ঞাত ভাইরাস স্কেনার: <em>$1</em>",
        "virus-scanfailed": "স্ক্যান করা যাচ্ছে না (কোড $1)",
        "virus-unknownscanner": "অজানা এন্টিভাইরাস:",
        "logouttext": "'''আপনি এখন আপনার অ্যাকাউন্ট থেকে প্রস্থান করেছেন।'''\n\nনোট করুন যে কিছু পাতায় আপনাকে এখনও প্রবেশ অবস্থায় দেখাবে, যতক্ষণ না আপনি ব্রাউজার ক্যাশ পরিষ্কার করছেন।",
        "cannotloginnow-title": "এখন প্রবেশ করা যাবে না",
        "cannotloginnow-text": "$1 ব্যবহার করার সময় প্রবেশ করা সম্ভব নয়।",
        "cannotcreateaccount-title": "অ্যাকাউন্ট তৈরি করা যাবে না",
-       "cannotcreateaccount-text": "সরাসরি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¸à§\83ষà§\8dà¦\9fিà¦\95রণ à¦\8fà¦\87 à¦\89à¦\87à¦\95িতà§\87 à¦¸à¦\95à§\8dরিয় নয়।",
+       "cannotcreateaccount-text": "সরাসরি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¤à§\88রিà¦\95রণ à¦\8fà¦\87 à¦\89à¦\87à¦\95িতà§\87 à¦¸à¦®à§\8dভব নয়।",
        "yourdomainname": "আপনার ডোমেইন:",
        "password-change-forbidden": "আপনি এই উইকিতে পাসওয়ার্ড পরিবর্তন করতে পারবেন না।",
        "externaldberror": "হয় কোন বহিঃস্থ যাচাইকরণ ডাটাবেজ ত্রুটি ঘটেছে অথবা আপনার বহিঃস্থ অ্যাকাউন্ট হালনাগাদ করার অনুমতি নেই।",
        "login": "প্রবেশ",
        "login-security": "আপনার পরিচয় যাচাই করুন",
        "nav-login-createaccount": "প্রবেশ/নতুন অ্যাকাউন্ট",
-       "userlogin": "প্রবেশ/নতুন অ্যাকাউন্ট",
-       "userloginnocreate": "প্রবেশ",
        "logout": "প্রস্থান করুন",
        "userlogout": "প্রস্থান",
        "notloggedin": "আপনি সংযুক্ত নন",
        "userlogin-noaccount": "কোনও অ্যাকাউন্ট নেই?",
        "userlogin-joinproject": "{{SITENAME}}-এ যোগ দিন",
-       "nologin": "আপনার কি উইকিপিডিয়াতে অ্যাকাউন্ট নেই? তাহলে '''$1'''।",
-       "nologinlink": "অ্যাকাউন্ট তৈরি করুন",
        "createaccount": "নতুন অ্যাকাউন্ট খুলুন",
-       "gotaccount": "আপনার কি ইতিমধ্যে একটি অ্যাকাউন্ট তৈরি করা আছে? '''$1''' করুন।",
-       "gotaccountlink": "প্রবেশ",
-       "userlogin-resetlink": "আপনার প্রবেশকরণের তথ্যাদি ভুলে গেছেন?",
        "userlogin-resetpassword-link": "পাসওয়ার্ড ভুলে গেছেন?",
        "userlogin-helplink2": "প্রবেশ সংক্রান্ত সাহায্য",
        "userlogin-loggedin": "আপনি বর্তমানে {{GENDER:$1|$1}} হিসাবে প্রবেশরত আছেন।\nঅন্য ব্যবহারকারী নামে প্রবেশ করতে চাইলে নিচের ফর্মটি ব্যবহার করুন।",
        "createaccountmail": "একটি র‌্যান্ডম পাসওয়ার্ড নির্বাচন করুন এবং নির্ধারিত ইমেইল ঠিকানায় পাঠিয়ে দিন",
        "createaccountmail-help": "পাসওয়ার্ড জানা ছাড়াই অন্য ব্যক্তির জন্য অ্যাকাউন্ট তৈরি করতে ব্যবহার করা যেতে পারে।",
        "createacct-realname": "আসল নাম (ঐচ্ছিক)",
-       "createaccountreason": "কারণ:",
        "createacct-reason": "কারণ",
        "createacct-reason-ph": "কেন আপনি আরেকটি অ্যাকাউন্ট তৈরি করছেন",
        "createacct-reason-help": "অ্যাকাউন্ট তৈরির লগে দেখানো বার্তা",
        "usernameinprogress": "এই ব্যবহারকারী নামের জন্য একটি অ্যাকাউন্ট তৈরি আগে থেকেই চলছে। দয়া করে অপেক্ষা করুন।",
        "userexists": "এই ব্যবহারকারী নামটি ইতমধ্যে ব্যবহার করা হয়েছে।\nঅনুগ্রহ করে অন্য নাম বেছে নিন।",
        "loginerror": "প্রবেশ করতে সমস্যা হয়েছে",
-       "createacct-error": "অ্যাকাউন্ট তৈরি ত্রুটি",
+       "createacct-error": "অ্যাকাউন্ট তৈরিতে ত্রুটি",
        "createaccounterror": "অ্যাকাউন্ট তৈরি হয়নি: $1",
        "nocookiesnew": "ব্যবহারকারীর অ্যাকাউন্টটি সৃষ্টি করা হয়েছে, কিন্তু আপনি এখনও অ্যাকাউন্টে প্রবেশ করেননি। {{SITENAME}}-তে কুকি ব্যবহার করে ব্যবহারকারীদের অ্যাকাউন্টে প্রবেশ করানো হয়। আপনার ব্রাউজারে কুকিগুলি নিষ্ক্রিয় করা আছে। অনুগ্রহ করে কুকিগুলি সক্রিয় করুন এবং আপনার নতুন ব্যবহারকারী নাম ও পাসওয়ার্ড ব্যবহার করে অ্যাকাউন্টে প্রবেশ করুন।",
        "nocookieslogin": "ব্যবহারকারীদের প্রবেশ সম্পন্ন করতে {{SITENAME}} কুকি ব্যবহার করে। আপনার ব্রাউজারে কুকি নিষ্ক্রিয় করা আছে। কুকি চালু করে আবার চেষ্টা করুন।",
        "passwordremindertext": "কেউ একজন ($1 আইপি ঠিকানাটি থেকে সম্ভবত আপনি) অনুরোধ করেছেন যেন আমরা আপনাকে {{SITENAME}} ($4) এর জন্য একটি নতুন পাসওয়ার্ড পাঠাই।\n\"$2\" নামে অ্যাকাউন্ট খোলা হয়েছে এবং এর পাসওয়ার্ড \"$3\"। আপনি যদি এটাই চেয়ে থাকেন, তাহলে আপনাকে এখন অ্যাকাউন্টে প্রবেশ করতে হবে ও নতুন একটি পাসওয়ার্ড পছন্দ করতে হবে।\n{{PLURAL:$5|এক দিন|$5 দিন}} পরে আপনার এই অস্থায়ী পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়ে যাবে।\n\nযদি আপনি ছাড়া অন্য কেউ এই অনুরোধ করে থাকে, কিংবা যদি আপনার পুরনো পাসওয়ার্ড মনে পড়ে গিয়ে থাকে ও সেটি আর বদলাবার ইচ্ছা না থাকে, তাহলে এই বার্তাটি উপেক্ষা করতে পারেন এবং পুরনো পাসওয়ার্ডটিই ব্যবহার করে যেতে পারেন।",
        "noemail": "\"$1\" ব্যবহারকারীর জন্য কোন ই-মেইল ঠিকানা সংরক্ষিত নেই।",
        "noemailcreate": "আপনাকে অবশ্যই একটি সঠিক ইমেইল ঠিকানা দিতে হবে",
-       "passwordsent": "একটি নতুন পাসওয়ার্ড \"$1\" ব্যবহারকারীর ই-মেইল ঠিকানায় পাঠানো হয়েছে। দয়াকরে তা পাওয়ার পর আবার লগ-ইন করুন।",
+       "passwordsent": "একটি নতুন পাসওয়ার্ড \"$1\" ব্যবহারকারীর ই-মেইল ঠিকানায় পাঠানো হয়েছে। দয়া করে তা পাওয়ার পর আবার প্রবেশ করুন।",
        "blocked-mailpassword": "আপনার আইপি ঠিকানাটি থেকে সম্পাদনা করতে বাধা আছে। অপব্যবহার রোধ করার জন্য, এই আইপি ঠিকানা থেকে পাসওয়ার্ড পুনরুদ্ধার করার অনুমতি দেয়া হয়নি।",
        "eauthentsent": "মনোনীত ই-মেইল ঠিকানায় একটি নিশ্চিতকরণ ই-মেইল পাঠানো হয়েছে।\nঐ অ্যাকাউন্টটে অন্য কোন ই-মেইল পাঠানোর আগে আপনাকে ই-মেইলের নির্দেশগুলি অনুসরণ করতে হবে, যাতে অ্যাকাউন্টটি যে আসলেই আপনার, তা নিশ্চিত হয়।",
        "throttled-mailpassword": "বিগত {{PLURAL:$1|ঘণ্টার|$1 ঘণ্টার}} মধ্যে ইতিমধ্যেই একবার পাসওয়ার্ড বদলের তথ্য পাঠানো হয়েছে। অপব্যবহার রোধে প্রতি {{PLURAL:$1|ঘণ্টায়|$1 ঘণ্টায়}} কেবল একবার পাসওয়ার্ড বদলের তথ্য পাঠানো যাবে।",
        "emaildisabled": "এই সাইটটিতে ই-মেইল প্রদানের সুবিধা নেই।",
        "accountcreated": "অ্যাকাউন্ট তৈরি করা হয়েছে",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|আলাপ]]) এর জন্য ব্যবহারকারী অ্যাকাউন্ট তৈরি করা হয়েছে।",
-       "createaccount-title": "{{SITENAME}}-à¦\8fর à¦\9cনà§\8dয à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¸à§\83ষà§\8dà¦\9fি",
-       "createaccount-text": "à¦\95à§\87à¦\89 $2-à¦\8fর à¦\9cনà§\8dয {{SITENAME}}-à¦\8f à¦\8fà¦\95à¦\9fি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¸à§\83ষà§\8dà¦\9fি à¦\95রà§\87à¦\9bà§\87ন ($4)। \"$2\"-à¦\8fর à¦\9cনà§\8dয à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¹à¦² \"$3\"। à¦\86পনার à¦\8fà¦\96ন à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87 à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦\89à¦\9aিত।\n\nযদি à¦­à§\81ল à¦\95রà§\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà¦\9fি à¦¸à§\83ষà§\8dà¦\9fি হয়ে থাকে, তাহলে এই বার্তাটি উপেক্ষা করুন।",
+       "createaccount-title": "{{SITENAME}}-à¦\8fর à¦\9cনà§\8dয à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¤à§\88রিà¦\95রণ",
+       "createaccount-text": "à¦\95à§\87à¦\89 $2-à¦\8fর à¦\9cনà§\8dয {{SITENAME}}-à¦\8f à¦\8fà¦\95à¦\9fি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¤à§\88রি à¦\95রà§\87à¦\9bà§\87ন ($4)। \"$2\"-à¦\8fর à¦\9cনà§\8dয à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¹à¦² \"$3\"। à¦\86পনার à¦\8fà¦\96ন à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87 à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦\89à¦\9aিত।\n\nযদি à¦­à§\81ল à¦\95রà§\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà¦\9fি à¦¤à§\88রি হয়ে থাকে, তাহলে এই বার্তাটি উপেক্ষা করুন।",
        "login-throttled": "আপনি সাম্প্রতিক সময়ে পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন।\nপুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।",
        "login-abort-generic": "আপনার প্রবেশ ব্যর্থ হয়েছে - বাতিল করা হয়েছে",
        "login-migrated-generic": "আপনার অ্যাকাউন্ট স্থানান্তরিত করা হয়েছে, এবং আপনার ব্যবহারকারী নাম আর এই উইকিতে বিদ্যমান নয়।",
        "loginlanguagelabel": "ভাষা: $1",
-       "suspicious-userlogout": "à¦\86পনার à¦ªà§\8dরসà§\8dথানà§\87র à¦\85নà§\81রà§\8bধ à¦¬à¦¾à¦¤à¦¿à¦² à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\95ারণ à¦\85নà§\81মিত à¦¯à§\87 à¦\86পনার à¦¬à§\8dরাà¦\89à¦\9cার à¦\85সমà§\8dপà§\82রà§\8dণ à¦\85থবা à¦ªà§\82বরà§\8dবতà§\80 à¦¤à¦¥à§\8dয প্রেরণ করেছে।",
+       "suspicious-userlogout": "à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¥à§\87à¦\95à§\87 à¦\86পনার à¦ªà§\8dরসà§\8dথানà§\87র à¦\85নà§\81রà§\8bধ à¦ªà§\8dরতà§\8dযাà¦\96ান à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\95ারণ à¦®à¦¨à§\87 à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¯à§\87 à¦\85নà§\81রà§\8bধà¦\9fি à¦\8fà¦\95à¦\9fি à¦\85à¦\95ারà§\8dযà¦\95র à¦¬à§\8dরাà¦\89à¦\9cার à¦\85থবা à¦\95à§\8dযাশ à¦\95রà§\87 à¦\8fমন à¦ªà§\8dরà¦\95à§\8dসি à¦¸à¦¾à¦°à§\8dভার প্রেরণ করেছে।",
        "createacct-another-realname-tip": "আসল নাম ঐচ্ছিক।\nআপনি যদি তা দিতে চান, তাহলে তা ব্যবহারকারীকে তাদের কাজের জন্য স্বীকৃতিদানে ব্যবহার করা হবে।",
        "pt-login": "প্রবেশ",
        "pt-login-button": "প্রবেশ",
        "oldpassword": "পুরনো পাসওয়ার্ড:",
        "newpassword": "নতুন পাসওয়ার্ড:",
        "retypenew": "নতুন পাসওয়ার্ড আবার লিখুন:",
-       "resetpass_submit": "পাসà¦\93য়ারà§\8dড à¦¦à¦¾à¦\93 à¦\8fবà¦\82 à¦²à¦\97-à¦\87ন à¦\95রà§\8b",
+       "resetpass_submit": "পাসà¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারণ à¦\95রà§\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\81ন",
        "changepassword-success": "আপনার পাসওয়ার্ড পরিবর্তন করা হয়েছে!",
-       "changepassword-throttled": "আপনি সম্প্রতি পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন। পুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।",
+       "changepassword-throttled": "à¦\86পনি à¦¸à¦®à§\8dপà§\8dরতি à¦ªà¦°à¦ªà¦° à¦¬à§\87শ à¦\95য়à§\87à¦\95বার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শà§\87র à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রà§\87à¦\9bà§\87ন। à¦ªà§\81নরায় à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রার à¦ªà§\82রà§\8dবà§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 $1 à¦\85পà§\87à¦\95à§\8dষা à¦\95রà§\81ন।",
        "botpasswords": "বট পাসওয়ার্ড",
-       "botpasswords-disabled": "বট পাসওয়ার্ড নিষ্ক্রিয় করা।",
-       "botpasswords-no-central-id": "বট পাসওয়ার্ড ব্যবহার করার জন্য, আপনাকে একটি কেন্দ্রীভূত অ্যাকাউন্টে প্রবেশ করতে হবে।",
-       "botpasswords-existing": "বিদ্যমান বট শব্দচাবি",
+       "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-label-create": "তৈরি করুন",
+       "botpasswords-label-update": "হালনাগাদ করুন",
+       "botpasswords-label-cancel": "বাতিল করুন",
+       "botpasswords-label-delete": "অপসারণ করুন",
+       "botpasswords-label-resetpassword": "পাসওয়ার্ড পুনঃনির্ধারণ করা হোক",
+       "botpasswords-label-grants": "প্রয়োগযোগ্য অনুমোদন:",
+       "botpasswords-help-grants": "অনুমোদনগুলি সেইসব অধিকারের সুবিধা দেয়, যেগুলি ইতিমধ্যেই আপনার ব্যবহারকারী অ্যাকাউন্টে বিদ্যমান। এখানে একটি অনুমোদনকে সক্রিয় করলে এমন কোন অধিকারের সুবিধা পাওয়া যাবে না, যা আপনার অ্যাকাউন্টের অন্যথায় নেই। আরও তথ্যের জন্য [[Special:ListGrants|অনুমোদনসমূহের সারণী]] দেখুন।",
        "botpasswords-label-grants-column": "অনুমোদিত",
        "botpasswords-bad-appid": "\"$1\" বট নামটি সঠিক নয়।",
-       "botpasswords-insert-failed": "\"$1\" à¦¨à¦¾à¦®à§\87র à¦¬à¦\9f à¦¯à§\81à¦\95à§\8dত à¦\95রা à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿à¥¤ à¦\86à¦\97à§\87 à¦¥à§\87à¦\95à§\87à¦\87 তালিকায় রয়েছে?",
-       "botpasswords-update-failed": "\"$1\" নামের বট যুক্ত করা যায়নি। আগে অপসারণ করা হয়েছিল?",
+       "botpasswords-insert-failed": "\"$1\" à¦¨à¦¾à¦®à§\87র à¦¬à¦\9f à¦¯à§\81à¦\95à§\8dত à¦\95রা à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿à¥¤ à¦\8fà¦\9fি à¦\95ি à¦\86à¦\97à§\87 à¦¥à§\87à¦\95à§\87à¦\87 à¦¬à¦\9fà§\87র তালিকায় রয়েছে?",
+       "botpasswords-update-failed": "\"$1\" à¦¨à¦¾à¦®à§\87র à¦¬à¦\9f à¦¯à§\81à¦\95à§\8dত à¦\95রা à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿à¥¤ à¦\8fà¦\9fি à¦\95ি à¦\86à¦\97à§\87 à¦\85পসারণ à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bিল?",
        "botpasswords-created-title": "বট পাসওয়ার্ড তৈরী করা হয়েছে",
        "botpasswords-created-body": "ব্যবহারকারী \"$2\"-এর \"$1\" নামের বটের জন্য বট পাসওয়ার্ড তৈরী করা হয়েছে।",
-       "botpasswords-updated-title": "বà¦\9f à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦\86পডà§\87à¦\9f করা হয়েছে",
+       "botpasswords-updated-title": "বà¦\9f à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ করা হয়েছে",
        "botpasswords-updated-body": "ব্যবহারকারী \"$2\"-এর \"$1\" নামের বটের জন্য বট পাসওয়ার্ড হালনাগাদ করা হয়েছে।",
-       "botpasswords-deleted-title": "বà¦\9f à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦\85পসারণ à¦\95রা হয়েছে",
+       "botpasswords-deleted-title": "বà¦\9f à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦®à§\81à¦\9bà§\87 à¦«à§\87লা হয়েছে",
        "botpasswords-deleted-body": "ব্যবহারকারী \"$2\"-এর \"$1\" নামের বটের জন্য বট পাসওয়ার্ড মুছে ফেলা হয়েছিল।",
-       "botpasswords-no-provider": "BotPasswordsSessionProvider উপলব্ধ নয়।",
-       "botpasswords-restriction-failed": "বট পাসওয়ার্ডের সীমাবদ্ধতা এই প্রবেশ প্রতিরোধ করেছে।",
+       "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\") নেই।",
        "botpasswords-not-exist": "ব্যবহারকারী \"$1\"-এর \"$2\" নামক বট পাসওয়ার্ডটি নেই।",
        "resetpass_forbidden": "পাসওয়ার্ড পরিবর্তন করা সম্ভব নয়",
        "resetpass_forbidden-reason": "পাসওয়ার্ড পরিবর্তন করা যাবে না: $1",
-       "resetpass-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই প্রবেশ করতে হবে।",
-       "resetpass-submit-loggedin": "পাসওয়ার্ড পরিবর্তন",
+       "resetpass-no-info": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦ªà§\8dরবà§\87শাধিà¦\95ার à¦ªà§\87তà§\87 à¦\86পনাà¦\95à§\87 à¦\85বশà§\8dযà¦\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রতà§\87 à¦¹à¦¬à§\87।",
+       "resetpass-submit-loggedin": "পাসওয়ার্ড পরিবর্তন করুন",
        "resetpass-submit-cancel": "বাতিল",
        "resetpass-wrong-oldpass": "ভুল অস্থায়ী অথবা বর্তমান পাসওয়ার্ড।\nসম্ভবতঃ আপনি ইতোমধ্যেই আপনার পাসওয়ার্ডটি পরিবর্তন করেছেন অথবা একটি নতুন অস্থায়ী পাসওয়ার্ডের জন্য অনুরোধ করেছেন।",
-       "resetpass-recycled": "à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦¬à¦°à§\8dতমানà§\87 à¦¬à§\8dযবহার à¦\95রà¦\9bà§\87ন à¦\8fমন পাসওয়ার্ডের পরিবর্তে নতুন একটি পাসওয়ার্ড নির্ধারণ করুন।",
-       "resetpass-temp-emailed": "আপনি ইমেইলকৃত সাময়িক কোড দিয়ে প্রবেশ করেছেন।\nপ্রবেশ করার জন্য আপনাকে অবশ্যই একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে:",
+       "resetpass-recycled": "à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦¬à¦¿à¦¦à§\8dযমান পাসওয়ার্ডের পরিবর্তে নতুন একটি পাসওয়ার্ড নির্ধারণ করুন।",
+       "resetpass-temp-emailed": "আপনি ইমেইলকৃত সাময়িক কোড দিয়ে প্রবেশ করেছেন। অ্যাকাউন্টে\nপ্রবেশ সম্পন্ন করার জন্য আপনাকে অবশ্যই একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে:",
        "resetpass-temp-password": "অস্থায়ী পাসওয়ার্ড:",
        "resetpass-abort-generic": "পাসওয়ার্ড পরিবর্তন একটি এক্সটেনশনের কারণে স্থগিত করা হয়েছে।",
-       "resetpass-expired": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে। অনুগ্রহ করে নতুন পাসওয়ার্ড নির্ধারণ করুন।",
+       "resetpass-expired": "à¦\86পনার à¦ªà¦¾à¦¸à¦\93য়ারà§\8dডà§\87র à¦®à§\87য়াদ à¦\89তà§\8dতà§\80রà§\8dণ à¦¹à¦¯à¦¼à§\87à¦\9bà§\87। à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শà§\87র à¦\9cনà§\8dয à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারণ à¦\95রà§\81ন।",
        "resetpass-expired-soft": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে এবং আপনাকে একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে। অনুগ্রহ করে এখনই একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে পরিবর্তন করতে চাইলে \"{{int:authprovider-resetpass-skip-label}}\" বাটনে ক্লিক করুন।",
        "resetpass-validity-soft": "আপনার পাসওয়ার্ড বৈধ নয়: $1\n\nদয়া করে একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে করার জন্য \"{{int:authprovider-resetpass-skip-label}}\" ক্লিক করুন।",
        "passwordreset": "পাসওয়ার্ড রিসেট",
        "passwordreset-nosuchcaller": "আহ্বানকারীর অস্তিত্ব নেই: $1",
        "passwordreset-ignored": "পাসওয়ার্ড পুনঃধার্যকরণ করা যায়নি। হয়তো কোন প্রদানকারী কনফিগার করা হয়েনি?",
        "passwordreset-invalidemail": "ভুল ইমেইল ঠিকানা",
-       "passwordreset-nodata": "à¦\8fà¦\95à¦\9fি à¦¬à§\8dযবহারà¦\95ারà§\80র à¦¨à¦¾à¦® à¦¬à¦¾ à¦\8fà¦\95à¦\9fি à¦\87মà§\87ল à¦ à¦¿à¦\95ানা à¦¦à§\81à¦\9fির à¦\8fà¦\95à¦\9fিà¦\93 à¦¸à¦°à¦¬à¦°à¦¾ à¦¦à§\87য়া হয়নি",
+       "passwordreset-nodata": "বà§\8dযবহারà¦\95ারà§\80র à¦¨à¦¾à¦® à¦¬à¦¾ à¦\87মà§\87ল à¦ à¦¿à¦\95ানা à¦¦à§\81à¦\9fির à¦\8fà¦\95à¦\9fিà¦\93 à¦¸à¦°à¦¬à¦°à¦¾à¦¹ à¦\95রা হয়নি",
        "changeemail": "ই-মেইল ঠিকানা পরিবর্তন বা বাতিল",
-       "changeemail-header": "à¦\86পনার à¦\87মà§\87ল à¦ à¦¿à¦\95ানা à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦\8fà¦\87 à¦«à¦°à¦®à¦\9fি à¦ªà§\82রণ à¦\95রà§\81ন। à¦\86পনি à¦¯à¦¦à¦¿ à¦\86পনার à¦\8fà¦\95াà¦\89নà§\8dà¦\9f à¦¥à§\87à¦\95à§\87 à¦¯à§\87 à¦\95à§\8bন à¦\87মà§\87ল à¦ à¦¿à¦\95ানার à¦\8fসà§\8bসিয়à§\87শন à¦\85পসারণ à¦\95রতà§\87 চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
-       "changeemail-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই প্রবেশ করতে হবে।",
-       "changeemail-oldemail": "বর্তমান ই-মেইল ঠিকানা:",
-       "changeemail-newemail": "নতুন ই-মেইল ঠিকানা:",
-       "changeemail-newemail-help": "à¦\86পনার à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦\85পসরণ à¦\95রতà§\87 à¦\9aাà¦\87লà§\87 à¦\8fà¦\87 à¦\9cায়à¦\97াà¦\9fি à¦«à¦¾à¦\81à¦\95া à¦\9bà§\87ড়à§\87 à¦¦à§\87à¦\93য়া à¦\89à¦\9aিত। à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦\85পসরণ à¦\95রলà§\87 à¦\86পনি à¦­à§\81লà§\87 à¦¯à¦¾à¦\93য়া à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà§\81নà¦\83ধারà§\8dয করতে পারবেন না এবং এই উইকি থেকে আপনাকে কোন ইমেইল পাঠানো হবে না।",
-       "changeemail-none": "(à¦\95িà¦\9bà§\81 à¦¨à¦¾ই)",
+       "changeemail-header": "à¦\86পনার à¦\87মà§\87ল à¦ à¦¿à¦\95ানা à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦\8fà¦\87 à¦«à¦°à¦®à¦\9fি à¦ªà§\82রণ à¦\95রà§\81ন। à¦\86পনি à¦¯à¦¦à¦¿ à¦\86পনার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦¸à¦¾à¦¥à§\87 à¦\95à§\8bনà¦\93 à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানার à¦¸à¦\82শà§\8dলিষà§\8dà¦\9fতা à¦°à¦¾à¦\96তà§\87 à¦¨à¦¾ চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
+       "changeemail-no-info": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦ªà§\8dরবà§\87শাধিà¦\95ার à¦ªà§\87তà§\87 à¦\86পনাà¦\95à§\87 à¦\85বশà§\8dযà¦\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রতà§\87 à¦¹à¦¬à§\87।",
+       "changeemail-oldemail": "বর্তমান ইমেইল ঠিকানা:",
+       "changeemail-newemail": "নতুন ইমেইল ঠিকানা:",
+       "changeemail-newemail-help": "à¦\86পনার à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦\85পসারণ à¦\95রতà§\87 à¦\9aাà¦\87লà§\87 à¦\8fà¦\87 à¦\9cায়à¦\97াà¦\9fি à¦«à¦¾à¦\81à¦\95া à¦°à§\87à¦\96à§\87 à¦¦à§\87à¦\93য়া à¦\89à¦\9aিত। à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦\85পসারণ à¦\95রলà§\87 à¦\86পনি à¦­à§\81লà§\87 à¦¯à¦¾à¦\93য়া à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà§\81নà¦\83নিরà§\8dধারণ করতে পারবেন না এবং এই উইকি থেকে আপনাকে কোন ইমেইল পাঠানো হবে না।",
+       "changeemail-none": "(নà§\87ই)",
        "changeemail-password": "আপনার {{SITENAME}} পাসওয়ার্ড:",
-       "changeemail-submit": "ই-মেইল পরিবর্তন",
-       "changeemail-throttled": "আপনি পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন। পুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।",
-       "changeemail-nochange": "দয়া à¦\95রà§\87 à¦\8fà¦\95à¦\9fি à¦­à¦¿à¦¨à§\8dন à¦¨à¦¤à§\81ন à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦²à¦¿à¦\96à§\81ন।",
-       "resettokens": "টোকেন পুনঃস্থাপন করুন",
-       "resettokens-text": "à¦\86পনি à¦\9fà§\8bà¦\95à§\87ন à¦ªà§\81নà¦\83সà§\8dথাপন à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন, à¦¯à¦¾ à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦¸à¦¾à¦¥à§\87 à¦¸à¦®à§\8dপরà§\8dà¦\95িত à¦\86পনার à¦¬à§\8dযà¦\95à§\8dতিà¦\97ত à¦¤à¦¥à§\8dয à¦¦à§\87à¦\96ার à¦\95াà¦\9cà§\87 à¦¬à§\8dযবহার à¦\95রা à¦¹à¦¯à¦¼।",
-       "resettokens-no-tokens": "পà§\81নà¦\83সà§\8dথাপন করার মত কোনো টোকেন নেই।",
+       "changeemail-submit": "ইমেইল ঠিকানা পরিবর্তন",
+       "changeemail-throttled": "à¦\86পনি à¦ªà¦°à¦ªà¦° à¦¬à§\87শ à¦\95য়à§\87à¦\95বার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শà§\87র à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রà§\87à¦\9bà§\87ন। à¦ªà§\81নরায় à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রার à¦ªà§\82রà§\8dবà§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 $1 à¦\85পà§\87à¦\95à§\8dষা à¦\95রà§\81ন।",
+       "changeemail-nochange": "দয়া à¦\95রà§\87 à¦\8fà¦\95à¦\9fি à¦­à¦¿à¦¨à§\8dন à¦\93 à¦¨à¦¤à§\81ন à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦ªà§\8dরবà§\87শ à¦\95রান।",
+       "resettokens": "টোকেনগুলি পুনঃনির্ধারণ করুন",
+       "resettokens-text": "যà§\87 à¦\9fà§\8bà¦\95à§\87নà¦\97à§\81লি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦¸à¦¾à¦¥à§\87 à¦¸à¦®à§\8dপরà§\8dà¦\95িত à¦\86পনার à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f à¦\95িà¦\9bà§\81 à¦¬à§\8dযà¦\95à§\8dতিà¦\97ত à¦¤à¦¥à§\8dয à¦¦à§\87à¦\96ার à¦\95াà¦\9cà§\87 à¦¬à§\8dযবহার à¦\95রা à¦¹à¦¯à¦¼, à¦¸à§\87à¦\97à§\81লি à¦\86পনি à¦ªà§\81নà¦\83নিরà§\8dধারণ à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nযদি à¦¦à§\81রà§\8dà¦\98à¦\9fনাà¦\95à§\8dরমà§\87 à¦\9fà§\8bà¦\95à§\87নà¦\97à§\81লি à¦\95াà¦\89à¦\95à§\87 à¦¦à¦¿à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87ন à¦\85থবা à¦\86পনার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¯à¦¦à¦¿ à¦¬à¦¹à¦¿à¦\83à¦\86à¦\95à§\8dরমণà§\87র à¦¶à¦¿à¦\95ার à¦¹à¦¯à¦¼, à¦¤à¦¾à¦¹à¦²à§\87 à¦\86পনার à¦\8f à¦\95াà¦\9cà¦\9fি à¦\95রা à¦\89à¦\9aিত।",
+       "resettokens-no-tokens": "পà§\81নà¦\83নিরà§\8dধারণ করার মত কোনো টোকেন নেই।",
        "resettokens-tokens": "টোকেন:",
        "resettokens-token-label": "$1 (বর্তমান: $2)",
-       "resettokens-watchlist-token": "ওয়েব ফিড (Atom/RSS) টোকেন পরিবর্তনের জন্য [[Special:Watchlist|নজরতালিকায় থাকা পাতাগুলোতে পরিবর্তন এসেছে]]",
-       "resettokens-done": "টোকেন পুনঃস্থাপন।",
-       "resettokens-resetbutton": "নির্বাচিত টোকেন পুনঃস্থাপন করুন",
+       "resettokens-watchlist-token": "[[Special:Watchlist|নজরতালিকায় থাকা পাতাগুলোতে পরিবর্তন]] সংক্রান্ত ওয়েব ফিডের (Atom বা RSS) টোকেন",
+       "resettokens-done": "টোকেনগুলি সফলভাবে পুনঃনির্ধারিত হয়েছে।",
+       "resettokens-resetbutton": "নির্বাচিত টোকেনগুলি পুনঃনির্ধারণ করুন",
        "bold_sample": "গাঢ় লেখা",
        "bold_tip": "গাঢ় লেখা",
-       "italic_sample": "তà§\80র্যক লেখা",
-       "italic_tip": "তà§\80র্যক লেখা",
-       "link_sample": "সংযোগের শিরোনাম",
-       "link_tip": "à¦\86ভ্যন্তরীণ সংযোগ",
-       "extlink_sample": "http://www.example.com সংযোগ শিরোনাম",
-       "extlink_tip": "বহিঃসংযোগ (মনে রাখবেন http:// উপসর্গ)",
+       "italic_sample": "তির্যক লেখা",
+       "italic_tip": "তির্যক লেখা",
+       "link_sample": "à¦\85ভà§\8dযনà§\8dতরà§\80ণ à¦¸à¦\82যà§\8bà¦\97à§\87র à¦¶à¦¿à¦°à§\8bনাম",
+       "link_tip": "à¦\85ভ্যন্তরীণ সংযোগ",
+       "extlink_sample": "http://www.example.com à¦¬à¦¹à¦¿à¦\83সà¦\82যà§\8bà¦\97 à¦¶à¦¿à¦°à§\8bনাম",
+       "extlink_tip": "বহিঃসংযোগ (http:// উপসর্গটি যোগ করতে ভুলবেন না)",
        "headline_sample": "শিরোনাম",
        "headline_tip": "২য় স্তরের শিরোনাম",
-       "nowiki_sample": "অ-ফরম্যাটকৃত টেক্সট এখানে যোগ করুন",
-       "nowiki_tip": "à¦\89à¦\87à¦\95ি à¦«à¦°à¦®à§\8dযাà¦\9fিà¦\82 উপেক্ষা করা হোক",
+       "nowiki_sample": "অবিন্যাসকৃত পাঠ্য এখানে যোগ করুন",
+       "nowiki_tip": "à¦\89à¦\87à¦\95ি à¦¬à¦¿à¦¨à§\8dযাসন উপেক্ষা করা হোক",
        "image_sample": "উদাহরণ.jpg",
        "image_tip": "গ্রথিত ফাইল",
        "media_tip": "ফাইল সংযোগ",
        "preview": "প্রাকদর্শন",
        "showpreview": "প্রাকদর্শন",
        "showdiff": "পরিবর্তনসমূহ",
-       "blankarticle": "<strong>সতর্ক বার্তা:</strong> আপনি একটি খালি পাতা তৈরী করতে যাচ্ছেন।\nআপনি যদি পুনরায় \"{{int:savearticle}}\" à¦¬à¦¾à¦\9fন à¦\95à§\8dলিà¦\95 à¦\95রà§\87ন à¦¤à¦¾à¦¹à¦²à§\87, à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¤à§\88রà§\80 à¦¹à¦¬à§\87 à¦¯à§\87à¦\96ানà§\87 à¦\95à§\8bনà§\8b à¦¤à¦¥à§\8dয à¦²à§\87à¦\96া à¦¨à§\87à¦\87।",
-       "anoneditwarning": "<strong>সতর্কতা:</strong> আপনি বর্তমানে প্রবেশ করেননি। যদি আপনি সম্পাদনা করেন এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি ঠিকানা সার্বজনীনভাবে সংরক্ষিত হবে। যদি আপনি  <strong>[$1 প্রবেশ করেন]</strong> বা  <strong>[$2 একটি অ্যাকাউন্ট তৈরি করেন]</strong>, তাহলে আপনি আপনার আইপি ঠিকানা গোপন রাখতে পারবেন ও অন্যান্য অনেক কিছু সুবিধা পাবেন।",
-       "anonpreviewwarning": "<em>à¦\86পনি à¦ªà§\8dরবà§\87শ à¦\95রà§\87ননি। à¦¸à¦®à§\8dপাদনা করলে এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি ঠিকানা সংরক্ষিত হবে।</em>",
-       "missingsummary": "'''à¦\96à§\87য়াল à¦\95রà§\81ন''':  à¦\86পনি à¦\95িনà§\8dতà§\81 à¦¸à¦®à§\8dপাদনার à¦¸à¦¾à¦°à¦¾à¦\82শ à¦¦à§\87ননি। à¦\86বার à¦¯à¦¦à¦¿ \"সà¦\82রà¦\95à§\8dষণ\" বোতামে ক্লিক করেন, তাহলে ঐ সারাংশ বাক্যটি ছাড়াই আপনার সম্পাদনা সংরক্ষিত হবে।",
-       "selfredirect": "<strong>সতর্কতা:</strong> আপনি এই পাতাকে এর নিজের দিকে পুনঃনির্দেশিত করছেন।\nআপনাকে পুনঃনির্দেশিত করার জন্য হয় ভুল লক্ষ্য নির্দিষ্ট করেছেন, অথবা আপনি ভুল পাতা সম্পাদনা করছেন।\nআপনি যদি আবার \"{{int:savearticle}}\" ক্লিক করেন, পুনর্নির্দেশ যেকোনোভাবেই হোক তৈরি করা হবে।",
+       "blankarticle": "<strong>সতর্ক বার্তা:</strong> আপনি একটি খালি পাতা তৈরী করতে যাচ্ছেন।\nআপনি যদি পুনরায় \"$1\" à¦¬à§\8bতামà¦\9fি à¦\95à§\8dলিà¦\95 à¦\95রà§\87ন à¦¤à¦¾à¦¹à¦²à§\87 à¦\95à§\8bন à¦ªà¦¾à¦ à§\8dয à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\9bাড়াà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¤à§\88রà§\80 à¦¹à¦¬à§\87।",
+       "anoneditwarning": "<strong>সতর্ক বার্তা:</strong> আপনি বর্তমানে আপনার অ্যাকাউন্টে প্রবেশ করেননি। যদি এ অবস্থায় আপনি সম্পাদনা সংরক্ষণ করেন তাহলে এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি ঠিকানা জনসমক্ষে দৃশ্যমান হবে। যদি আপনি  <strong>[$1 অ্যাকাউন্টে প্রবেশ করেন]</strong> বা  <strong>[$2 একটি অ্যাকাউন্ট তৈরি করেন]</strong>, তাহলে আপনি আপনার আইপি ঠিকানা গোপন রাখতে পারবেন ও অন্যান্য বেশ কিছু সুবিধা পাবেন।",
+       "anonpreviewwarning": "<em>à¦\86পনি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87ননি। à¦¸à¦®à§\8dপাদনা à¦¸à¦\82রà¦\95à§\8dষণ করলে এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি ঠিকানা সংরক্ষিত হবে।</em>",
+       "missingsummary": "'''à¦\96à§\87য়াল à¦\95রà§\81ন''':  à¦\86পনি à¦\86পনার à¦¸à¦®à§\8dপাদনার à¦\95à§\8bনà¦\93 à¦¸à¦¾à¦°à¦¾à¦\82শ à¦¦à§\87ননি। à¦\86বার à¦¯à¦¦à¦¿ \"$1\" বোতামে ক্লিক করেন, তাহলে ঐ সারাংশ বাক্যটি ছাড়াই আপনার সম্পাদনা সংরক্ষিত হবে।",
+       "selfredirect": "<strong>সতর্কতা:</strong> আপনি এই পাতাকে এর নিজের দিকে পুনঃনির্দেশিত করছেন।\nআপনাকে পুনঃনির্দেশিত করার জন্য হয় ভুল লক্ষ্য নির্দিষ্ট করেছেন, অথবা আপনি ভুল পাতা সম্পাদনা করছেন।\nআপনি যদি আবার \"$1\" ক্লিক করেন, পুনর্নির্দেশ যেকোনোভাবেই হোক তৈরি করা হবে।",
        "missingcommenttext": "দয়া করে নিচে মন্তব্য যোগ করুন।",
-       "missingcommentheader": "<strong>খেয়াল করুন:</strong> আপনি এই মন্তব্যের জন্য কোন বিষয় প্রদান করেননি।আপনি যদি আবার \"{{int:savearticle}}\" বোতামে ক্লিক করেন, আপনার এই সম্পাদনা কোন বিষয় ছাড়াই সংরক্ষিত হবে।",
+       "missingcommentheader": "<strong>খেয়াল করুন:</strong> আপনি এই মন্তব্যের জন্য কোনও বিষয় প্রদান করেননি। আপনি যদি আবার \"$1\" বোতামে ক্লিক করেন, আপনার এই সম্পাদনা কোন বিষয় ছাড়াই সংরক্ষিত হবে।",
        "summary-preview": "সম্পাদনা সারাংশের প্রাকদর্শন:",
        "subject-preview": "বিষয়ের প্রাকদর্শন:",
        "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": "আপনার আইপি ঠিকানাকে স্বয়ংক্রিয়ভাবে বাধা দেয়া হয়েছে কারণ এটি আরেকজন ব্যবহারকারী দ্বারা ব্যবহৃত হয়েছে, যাকে $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যেকোন প্রশ্ন করার সময় উপরের সকল তথ্য উল্লেখ করুন।",
+       "blockedtext": "<strong>আপনার ব্যবহারকারী নাম বা আইপি ঠিকানাটিকে সম্পাদনায় বাধাদান করা হয়েছে।</strong>\n\n$1 এই বাধাটি প্রদান করেছেন। বাধার কারণ হিসেবে বলা হয়েছে:<em>$2</em>।\n\n* বাধা শুরুর সময়:$8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনি $1 অথবা [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকদের]] কারও সাথে এই বাধা সংক্রান্ত বিষয়ে আলোচনা করতে পারেন।\n\nআপনি \"(ব্যবহারকারীকে) ইমেইল করুন\" সুবিধাটি ব্যবহার করতে পারবেন না। তবে [[Special:Preferences|আপনার পছন্দ তালিকাতে]] যদি একটি বৈধ ইমেইল ঠিকানা নির্দিষ্ট করা হয়ে থাকে এবং সুবিধাটি ব্যবহারে যদি আপনাকে বাধা না দেওয়া হয়ে থাকে, তবে আপনি সুবিধাটি ব্যবহার করতে পারবেন।\n\nআপনার বর্তমান আইপি ঠিকানা হল $3, এবং আপনার বাধা নং হল #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
+       "autoblockedtext": "আপনার আইপি ঠিকানাটিকে স্বয়ংক্রিয়ভাবে সম্পাদনায় বাধাদান করা হয়েছে কারণ এমন আরেকজন ব্যবহারকারী এটি ব্যবহার করেছেন, যাকে $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আপনার বর্তমান আইপি ঠিকানা হচ্ছে $3, এবং বাধা নং হল #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
+       "systemblockedtext": "আপনার ব্যবহারকারী নাম অথবা আইপি ঠিকানাটিকে স্বয়ংক্রিয়ভাবে মিডিয়াউইকি দ্বারা বাধাদান করা হয়েছে। যে কারণটি দেওয়া হয়েছে, সেটি হল:\n\n:<em>$2</em>\n\n* বাধা শুরুর সময়: $8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনার বর্তমান আইপি ঠিকানাটি হল $3।\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
        "blockednoreason": "কোন কারণ দেওয়া হয়নি",
-       "whitelistedittext": "পাতায় à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦\86বশà§\8dযà¦\87 $1 à¦\95রতà§\87 à¦¹à¦¬à§\87।",
+       "whitelistedittext": "পাতায় à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 $1 à¦\95রà§\81ন।",
        "confirmedittext": "কোন সম্পাদনা করার আগে আপনার ই-মেইল ঠিকানাটি অবশ্যই নিশ্চিত করতে হবে। দয়া করে আপনার ই-মেইল ঠিকানাটি [[Special:Preferences|ব্যবহারকারীর পছন্দতালিকায়]] ঠিকমত দিন।",
        "nosuchsectiontitle": "অনুচ্ছেদ পাওয়া যায়নি",
        "nosuchsectiontext": "আপনি এমন একটি অনুচ্ছেদ সম্পাদনার চেষ্টা করেছেন, যার কোন অস্তিত্ব নেই।\nযখন এই পাতাটি দেখার চেষ্টা করছে, তখন হয়তো এটি সরিয়ে অথবা অপসারণ করা হয়েছে।",
        "accmailtitle": "পাসওয়ার্ড পাঠানো হয়েছে",
        "accmailtext": "[[User talk:$1|$1]] এর জন্য দৈব ভাবে উৎপন্ন শব্দ চাবি $2 এ পাঠানো হয়েছে।\nলগ-ইন করার পর ''[[Special:ChangePassword|পাসওয়ার্ড পরিবর্তন]]'' পাতা থেকে এটি পরিবর্তন করা যাব।",
        "newarticle": "(নতুন)",
-       "newarticletext": "à¦\86পনি à¦\8fমন à¦\8fà¦\95à¦\9fি à¦²à¦¿à¦\82à¦\95 à¦\85নà§\81সরণ à¦\95রà¦\9bà§\87ন, à¦¯à¦¾ à¦¨à§\87à¦\87।\nপাতাà¦\9fি à¦¤à§\88রি à¦\95রতà§\87, à¦¨à¦¿à¦\9aà§\87র à¦¬à¦¾à¦\95à§\8dসà§\87 à¦¤à¦¾ à¦\9fাà¦\87প à¦\95রা à¦¶à§\81রà§\81 à¦\95রà§\81ন (à¦\86রà¦\93 à¦¤à¦¥à§\8dয à¦\9cানতà§\87 [$1 à¦¸à¦¹à¦¾à¦¯à¦¼à¦¿à¦\95া à¦ªà¦¾à¦¤à¦¾] à¦¦à§\87à¦\96à§\81ন)।\nà¦\86পনি à¦¯à¦¦à¦¿ à¦­à§\81ল à¦\95রà§\87 à¦\8fà¦\96ানà§\87 à¦\8fসà§\87 à¦¥à¦¾à¦\95à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 à¦\86পনার à¦¬à§\8dরাà¦\89à¦\9cারà§\87র '''back''' à¦¬à§\8bতাম ক্লিক করুন।",
+       "newarticletext": "à¦\86পনি à¦\8fমন à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦° à¦¸à¦\82যà§\8bà¦\97 à¦\85নà§\81সরণ à¦\95রà¦\9bà§\87ন, à¦¯à¦¾à¦° à¦\85সà§\8dতিসà§\8dত à¦¨à§\87à¦\87।\nপাতাà¦\9fি à¦¤à§\88রি à¦\95রতà§\87, à¦¨à¦¿à¦\9aà§\87র à¦¬à¦¾à¦\95à§\8dসà§\87 à¦¤à¦¾ à¦\9fাà¦\87প à¦\95রা à¦¶à§\81রà§\81 à¦\95রà§\81ন (à¦\86রà¦\93 à¦¤à¦¥à§\8dয à¦\9cানতà§\87 [$1 à¦¸à¦¹à¦¾à¦¯à¦¼à¦¿à¦\95া à¦ªà¦¾à¦¤à¦¾] à¦¦à§\87à¦\96à§\81ন)।\nà¦\86পনি à¦¯à¦¦à¦¿ à¦­à§\81ল à¦\95রà§\87 à¦\8fà¦\96ানà§\87 à¦\8fসà§\87 à¦¥à¦¾à¦\95à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 à¦\86পনার à¦¬à§\8dরাà¦\89à¦\9cারà§\87র <strong>পিà¦\9bন</strong> à¦¬à§\8bতামà§\87 ক্লিক করুন।",
        "anontalkpagetext": "----\n<em>এটি একটি বেনামী ব্যবহারকারীর আলাপের পাতা, যিনি এখনও কোন অ্যাকাউন্ট তৈরি করেননি, কিংবা তিনি অ্যাকাউন্টটি ব্যবহার করছেন না।</em>\nআমরা তাই সাংখ্যিক আইপি ঠিকানা ব্যবহার করে তাঁকে শনাক্ত করছি।\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}}| শিরোনামটি অনুসন্ধান করতে পারেন]], অথবা <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পর্কিত লগ অনুসন্ধান করতে পারেন]</span>, কিন্তু আপনার এই পাতাটি তৈরী করার অনুমতি নেই।",
        "missing-revision": "\"{{FULLPAGENAME}}\" এর #$1তম সংস্করণটি প্রদর্শন সম্ভব নয়।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক ওপেন করার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" নামের কোন ব্যবহারকারী অ্যাকাউন্ট নিবন্ধিত হয়নি। অনুগ্রহ করে পরীক্ষা করে দেখুন আপনি এই পাতাটি সৃষ্টি/সম্পাদনা করতে চান কি না।",
        "userpage-userdoesnotexist-view": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
-       "blocked-notice-logextract": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¬à¦°à§\8dতমানà§\87 à¦¬à§\8dলà¦\95 à¦°à¦¯à¦¼à§\87à¦\9bà§\87।\nরà§\87ফারà§\87নà§\8dসà§\87র à¦\9cনà§\8dয à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦¬à§\8dলà¦\95 à¦²à¦\97 à¦­à§\81à¦\95à§\8dতি নিচে দেওয়া হল:",
+       "blocked-notice-logextract": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¬à¦°à§\8dতমানà§\87 à¦\85বরà§\81দà§\8dধ à¦°à¦¯à¦¼à§\87à¦\9bà§\87ন।\nসà§\82তà§\8dরà§\87র à¦\9cনà§\8dয à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦¬à¦¾à¦§à¦¾à¦¦à¦¾à¦¨ à¦²à¦\97à§\87র à¦­à§\81à¦\95à§\8dতিà¦\9fি নিচে দেওয়া হল:",
        "clearyourcache": "<strong>লক্ষ্য করুন:</strong> সংরক্ষণের পর, পরিবর্তনগুলো দেখতে আপনাকে আপনার ব্রাউজারের ক্যাশে পরিষ্কার করার প্রয়োজন হতে পারে।\n* <strong>ফায়ারফক্স / সাফারি:</strong> <em>Shift</em> ধরে রাখা অবস্থায়<em>পুনঃলোড করুন</em>-এ ক্লিক করুন, অথবা <em>Ctrl-F5</em> বা <em>Ctrl-R</em> (ম্যাক-এ <em>⌘-R</em>) চাপুন\n* <strong>গুগল ক্রোম:</strong> <em>Ctrl-Shift-R</em> (ম্যাক-এ <em>⌘-Shift-R</em>) চাপুন\n* <strong>ইন্টারনেট এক্সপ্লোরার:</strong> <em>Ctrl</em> ধরে রাখা অবস্থায় <em>Refresh</em>-এ ক্লিক করুন, অথবা <em>Ctrl-F5</em> চাপুন\n* <strong>অপেরা:</strong> <em>মেনু → ব্যবস্থাপনাসমূহ</em>-এ যান (ম্যাকে <em>অপেরা → পছন্দসমূহ</em>) এবং এরপর <em>গোপনীয়তা ও সুরক্ষা → ব্রাউজিং-এর তথ্য পরিষ্কার করুন → ক্যাশে করা ছবি ও ফাইলগুলি</em>।",
        "usercssyoucanpreview": "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন CSS পরীক্ষা করুন।",
        "userjsyoucanpreview": "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন JavaScript পরীক্ষা করুন।",
        "continue-editing": "সম্পাদনা করুন",
        "previewconflict": "এই প্রাকদর্শনটি সম্পাদনা ক্ষেত্রের উপরের অংশটির টেক্সট সংরক্ষণ করলে যেরকম দেখাবে, তা দেখাচ্ছে।",
        "session_fail_preview": "দুঃখিত! সেশন ডাটা হারিয়ে যাওয়ার কারণে আপনার সম্পাদনাটি সংরক্ষণ করা সম্ভব হয়নি।\n\nআপনি সম্ভবত সংযোগ হারিয়েছন। <strong>দয়া করে যাচাই করুন যে আপনি এখনও প্রবেশরত রয়েছেন এবং আবার চেষ্টা করুন</strong>। যদি এটি এখনও কাজ না করে, তাহলে দয়া করে [[Special:UserLogout|অ্যাকাউন্ট থেকে প্রস্থান করুন]] এবং আবার অ্যাকাউন্টে প্রবেশ করে চেষ্টা করুন এবং এবং পরীক্ষা করুন যে আপনার ব্রাউজার এই সাইটে কুকি ব্যবহারের অনুমতি দেয়।",
-       "session_fail_preview_html": "দুঃখিত! সেশন উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়া করতে পারিনি।\n\n<em>{{SITENAME}}-এ raw HTML সক্রিয় আছে বলে জাভাস্ক্রিপ্ট ভিত্তিক আক্রমণ থেকে প্রতিরক্ষার জন্য প্রাকদর্শনটি দেখানো হচ্ছে না।</em>\n\n<strong>যদি এটি সম্পাদনার একটি বৈধ প্রচেষ্টা হয়, তবে অনুগ্রহ করে আবার চেষ্টা করুন।</strong>\nযদি তারপরেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে [[Special:UserLogout|বেরিয়ে গিয়ে]] আবার প্রবেশ করুন, এবং পরীক্ষা করে দেখুন যে আপনার ব্রাউজারে এই সাইট থেকে কুকি অনুমতি দেয়।",
+       "session_fail_preview_html": "দুঃখিত! সেশনের উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়াভুক্ত করতে পারিনি।\n\n<em>{{SITENAME}}-এ raw HTML সক্রিয় আছে বলে জাভাস্ক্রিপ্ট ভিত্তিক আক্রমণ থেকে প্রতিরক্ষার জন্য প্রাকদর্শনটি দেখানো হচ্ছে না।</em>\n\n<strong>যদি এটি সম্পাদনার একটি বৈধ প্রচেষ্টা হয়, তবে অনুগ্রহ করে আবার চেষ্টা করুন।</strong>\nযদি তারপরেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে [[Special:UserLogout|বেরিয়ে গিয়ে]] আবার প্রবেশ করুন, এবং পরীক্ষা করে দেখুন যে আপনার ব্রাউজারে এই সাইট থেকে কুকি রাখার অনুমতি আছে কি না।",
        "token_suffix_mismatch": "'''আপনার সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে, কারণ আপনার ক্লায়েন্ট প্রোগ্রামটি সম্পাদনা টেক্সটের বিরামচিহ্নগুলি গুলিয়ে ফেলেছে। পাতাটির টেক্সটে যাতে ক্ষতি না হয় সেজন্য সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে। আপনি কোন ত্রুটিপূর্ণ ওয়েব-ভিত্তিক বেনামী প্রক্সি সেবা ব্যবহার করলে এরকম হতে পারে।'''",
        "edit_form_incomplete": "'''আপনার সম্পাদনার কিছু অংশ সার্ভারে পৌছায় নি; আপনার সম্পাদনা সম্পূর্ণরুপে আছে কিনা নিশ্চিত হয়ে আবার চেষ্টা করুন'''",
        "editing": "সম্পাদনা করছেন: $1",
        "editingsection": "সম্পাদনা করছেন $1 (অনুচ্ছেদ)",
        "editingcomment": "সম্পাদনা করছেন $1 (নতুন অনুচ্ছেদ)",
        "editconflict": "সম্পাদনা দ্বন্দ্ব: $1",
-       "explainconflict": "à¦\86পনি à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦®à§\8dপাদনা à¦¶à§\81রà§\81 à¦\95রার à¦ªà¦° à¦\85নà§\8dয à¦\95à§\87à¦\89 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\8fনà§\87à¦\9bà§\87।\nà¦\9fà§\87à¦\95à§\8dসà¦\9f à¦\8fলাà¦\95ার à¦\89পরà§\87র à¦\85à¦\82শà§\87 à¦¬à¦°à§\8dতমানà§\87 à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦¯à§\87ভাবà§\87 à¦\86à¦\9bà§\87, à¦¤à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦\8fলাà¦\95ার à¦¨à¦¿à¦\9aà§\87র à¦\85à¦\82শà§\87 à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনাà¦\95à§\87 à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¬à¦°à§\8dতমানà§\87 à¦¬à¦¿à¦¦à§\8dযমান à¦\9fà§\87à¦\95à§\8dসà¦\9fà§\87র à¦¸à¦¾à¦¥à§\87 à¦®à¦¿à¦²à¦¿à¦¯à¦¼à§\87 à¦¦à¦¿à¦¤à§\87 à¦¹à¦¬à§\87।\nà¦\86পনি \"সà¦\82রà¦\95à§\8dষণ\" à¦\9aাপলà§\87 '''শà§\81ধà§\81মাতà§\8dর''' à¦\9fà§\87à¦\95à§\8dসà¦\9f এলাকার উপরের অংশটি সংরক্ষিত হবে।",
+       "explainconflict": "à¦\86পনি à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦®à§\8dপাদনা à¦¶à§\81রà§\81 à¦\95রার à¦ªà¦° à¦\85নà§\8dয à¦\95à§\87à¦\89 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\8fনà§\87à¦\9bà§\87।\nপাঠà§\8dয à¦\8fলাà¦\95ার à¦\89পরà§\87র à¦\85à¦\82শà§\87 à¦¬à¦°à§\8dতমানà§\87 à¦ªà¦¾à¦  à¦¯à§\87ভাবà§\87 à¦\86à¦\9bà§\87 à¦¤à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦ªà¦¾à¦ à§\8dয à¦\8fলাà¦\95ার à¦¨à¦¿à¦\9aà§\87র à¦\85à¦\82শà§\87 à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনাà¦\95à§\87 à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¬à¦°à§\8dতমানà§\87 à¦¬à¦¿à¦¦à§\8dযমান à¦ªà¦¾à¦ à§\8dযà§\87র à¦¸à¦¾à¦¥à§\87 à¦®à¦¿à¦²à¦¿à¦¯à¦¼à§\87 à¦¦à¦¿à¦¤à§\87 à¦¹à¦¬à§\87।\nà¦\86পনি \"$1\" à¦\9aাপলà§\87 <strong>শà§\81ধà§\81মাতà§\8dর</strong> à¦ªà¦¾à¦ à§\8dয এলাকার উপরের অংশটি সংরক্ষিত হবে।",
        "yourtext": "আপনার লেখা বিষয়বস্তু",
        "storedversion": "সংরক্ষিত সংস্করণ",
        "nonunicodebrowser": "'''সতর্কীকরণ: আপনার ব্রাউজার ইউনিকোড-বন্ধুভাবাপন্ন নয়। আপনি যাতে বিপদ ছাড়াই পাতা সম্পাদনা করতে পারেন, সে জন্য সমাধান আছে: অ-আস্কি ক্যারেক্টারগুলি হেক্সাডেসিমাল কোড হিসেবে দেখানো হবে।'''",
        "copyrightwarning2": "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
        "editpage-cannot-use-custom-model": "এই পাতার বিষয়বস্তুর রূপ পরিবর্তন করা যাবে না।",
        "longpageerror": "'''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।'''\nএটি সংরক্ষণ করা সম্ভব নয়।",
-       "readonlywarning": "<strong>সতরà§\8dà¦\95à§\80à¦\95রণ: à¦°à¦\95à§\8dষণাবà§\87à¦\95à§\8dষণà§\87র à¦\9cনà§\8dয à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦°à¦¾à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦¤à¦¾à¦\87 à¦\8fà¦\87 à¦®à§\81হà§\82রà§\8dতà§\87 à¦\86পনি à¦\86পনার à¦¸à¦®à§\8dপাদনা à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾à¥¤</strong>\nà¦\86পনি à¦\9aাà¦\87লà§\87 à¦²à§\87à¦\96াà¦\9fি à¦\85নà§\81লিপি à¦\95রà§\87 à¦\93 à¦\95à§\8bন à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦«à¦¾à¦\87লà§\87 à¦ªà§\8dরতিলà§\87পন à¦\95রার à¦¦à§\8dবারা à¦­à¦¬à¦¿à¦·à§\8dযতà§\87র à¦\9cনà§\8dয à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nসিসà§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fি à¦¬à¦¨্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
+       "readonlywarning": "<strong>সতরà§\8dà¦\95বারà§\8dতা: à¦°à¦\95à§\8dষণাবà§\87à¦\95à§\8dষণà§\87র à¦\9cনà§\8dয à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦°à¦¾à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦¤à¦¾à¦\87 à¦\8fà¦\87 à¦®à§\81হà§\82রà§\8dতà§\87 à¦\86পনি à¦\86পনার à¦¸à¦®à§\8dপাদনা à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾à¥¤</strong>\nà¦\86পনি à¦\9aাà¦\87লà§\87 à¦²à§\87à¦\96াà¦\9fি à¦ªà§\8dরতিলিপি à¦\95রà§\87 à¦\95à§\8bন à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦«à¦¾à¦\87লà§\87 à¦¸à§\87à¦\81à¦\9fà§\87 à¦­à¦¬à¦¿à¦·à§\8dযতà§\87র à¦\9cনà§\8dয à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nযà§\87 à¦¸à¦¿à¦¸à§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¡à¦¾à¦\9fাবà§\87à¦\9cà¦\9fি  à¦\85বরà§\81দ্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
        "protectedpagewarning": "'''সতর্কীকরণ: এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি সম্পাদনা করতে পারবেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "semiprotectedpagewarning": "'''নোট:''' এই পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে তাই নিবন্ধনকৃত ব্যবহারকারী এটি সম্পাদনা করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
-       "cascadeprotectedwarning": "<strong>সতর্কীকরণ:</strong> এই পাতাটি সুরক্ষিত, ফলে এটি শুধুমাত্র প্রশাসক অধিকারপ্রাপ্ত ব্যবহারকারীগণ সম্পাদনা করতে পারেন, কারণ এটি নিচের প্রপাতাকার-সুরক্ষিত {{PLURAL:$1|পাতায়|পাতাসমূহে}} অন্তর্ভুক্ত আছে:",
+       "cascadeprotectedwarning": "<strong>সতর্কীকরণ:</strong> এই পাতাটি সুরক্ষিত, ফলে এটি শুধুমাত্র [[Special:ListGroupRights|নির্দিষ্ট অধিকারপ্রাপ্ত]] ব্যবহারকারীগণ সম্পাদনা করতে পারেন, কারণ এটি নিচের প্রপাতাকার-সুরক্ষিত {{PLURAL:$1|পাতায়|পাতাসমূহে}} অন্তর্ভুক্ত আছে:",
        "titleprotectedwarning": "'''সতর্কীকরণ: এই পাতাটির ব্যবহার সীমিত করা হয়েছে, যাতে কেবলমাত্র [[Special:ListGroupRights|এই নির্দিষ্ট অনুমতিপ্রাপ্ত]] ব্যবহারকারী এটি তৈরি করতে পারেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "templatesused": "এই পাতায় ব্যবহৃত {{PLURAL:$1|টেমপ্লেট|টেমপ্লেটসমূহ}}:",
        "templatesusedpreview": "এই প্রাকদর্শনে ব্যবহৃত {{PLURAL:$1|টেমপ্লেট|টেমপ্লেটসমূহ}}:",
        "edittools": "<!-- সম্পাদনা এবং আপলোড ফরমের নীচে এখানের লেখা দেখানো হবে। -->",
        "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}}-এ নতুন পাতা সৃষ্টি করার ক্ষমতা সীমাবদ্ধ করা হয়েছে।\nআপনি ফিরে গিয়ে ইতিমধ্যে বিদ্যমান কোন পাতা সম্পাদনা করতে পারেন, অথবা [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ কিংবা অ্যাকাউন্ট সৃষ্টি করতে পারেন]]।",
-       "nocreate-loggedin": "নতà§\81ন à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রিতà§\87 à¦\86পনাà¦\95à§\87 à¦\85নà§\81মà§\8bতি à¦¦à§\87à¦\93য়া à¦¹à¦¯à¦¼à¦¨à¦¿।",
+       "nocreate-loggedin": "à¦\86পনার à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রি à¦\95রার à¦\85নà§\81মà§\8bদন à¦¨à§\87à¦\87।",
        "sectioneditnotsupported-title": "অনুচ্ছেদ সম্পাদনা সমর্থন করে না",
        "sectioneditnotsupported-text": "এই সম্পাদনা পাতায় অনুচ্ছেদ সম্পাদনা সমর্থন করে না",
-       "permissionserrors": "অনুমতি ত্রুটিসমূহ",
-       "permissionserrorstext": "à¦\86পনার à¦\8fà¦\9fা à¦\95রার à¦\85নà§\81মতি à¦¨à§\87à¦\87, à¦¨à¦¿à¦\9aà§\87র {{PLURAL:$1|à¦\9fি à¦\95ারণà§\87র|à¦\9fি à¦\95ারণà§\87র}} à¦\9cনà§\8dয:",
-       "permissionserrorstext-withaction": "আপনার $2 অনুমতি নেই, যার {{PLURAL:$1|কারণ|কারণসমূহ}} হল:",
+       "permissionserrors": "অনুমতি ত্রুটি",
+       "permissionserrorstext": "নিনà§\8dমলিà¦\96িত {{PLURAL:$1|à¦\95ারণà¦\9fির|à¦\95ারণà¦\97à§\81লির}} à¦\9cনà§\8dয à¦\86পনার à¦\8fà¦\9fা à¦\95রার à¦\85নà§\81মতি à¦¨à§\87à¦\87:",
+       "permissionserrorstext-withaction": "আপনার $2 অনুমতি নেই, যার {{PLURAL:$1|কারণটি|কারণগুলি}} হল:",
        "contentmodelediterror": "আপনি এই পুনর্বিবেচনা সম্পাদনা করতে পারবেন না কারণ এর বিষয়বস্তু মডেল <code>$1</code>, যা বর্তমান বিষয়বস্তু মডেল <code>$2</code>-এর থেকে ভিন্ন।",
        "recreate-moveddeleted-warn": "'''সতর্কীকরণ: আপনি এমন একটি পাতা পুনরায় তৈরি করছেন যা পূর্বে অপসারণ করা হয়েছিল।'''\n\nআপনি পাতাটি সম্পাদনা চালিয়ে যাওয়া ঠিক হবে কিনা, তা বিবেচনা করুন।\nআপনার সুবিধার্থে পাতাটির অপলুপ্তি লগ এখানে দেয়া হলো:",
        "moveddeleted-notice": "এই পাতাটি অপসারণ করা হয়েছে।\nসূত্র হিসেবে নিচে এ পাতার অবলুপ্তি লগ দেওয়া হলো।",
        "moveddeleted-notice-recent": "দুঃখিত, এই পাতাটি সাম্প্রতি অপসারিত হয়েছে (সর্বশেষ ২৪ ঘণ্টায়)।\nসূত্র হিসেবে নিচে এই পাতা অপসারণ ও স্থানান্তর লগ দেয়া হয়েছে।",
-       "log-fulllog": "সমà§\8dপà§\82রà§\8dণ à¦²à¦\97 à¦¦à§\87à¦\96াà¦\93",
+       "log-fulllog": "সমà§\8dপà§\82রà§\8dণ à¦²à¦\97 à¦¦à§\87à¦\96à§\81ন",
        "edit-hook-aborted": "হূক দ্বারা সম্পাদনা পরিত্যক্ত হয়েছে।\nএর কোন ব্যাখ্যা নাই।",
        "edit-gone-missing": "পাতাটি হালনাগাদ হয়নি।\nসম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।",
        "edit-conflict": "সম্পাদনা সংঘাত।",
        "edit-no-change": "আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।",
-       "postedit-confirmation-created": "পাতাটি তৈরি হয়েছে।",
+       "postedit-confirmation-created": "পাতাà¦\9fি à¦¤à§\88রি à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।",
        "postedit-confirmation-restored": "পাতাটি পুনরুদ্ধার করা হয়েছে।",
        "postedit-confirmation-saved": "আপনার সম্পাদনা সংরক্ষিত হয়েছে।",
        "edit-already-exists": "নতুন পাতা সৃষ্টি করা যায়নি।\nপাতাটি ইতিমধ্যেই বিদ্যমান।",
        "post-expand-template-argument-warning": "' ' ' সাবধান: ' ' ' এই পাতাটিতে অন্তত একটি ফর্মা যুক্তি আছে যা একটি খুব বড় বিস্তার আকার ধারণ করেছে।\nতাই এই আর্গুমেন্টটি বাদ দেওয়া হয়েছে।",
        "post-expand-template-argument-category": "বাদ ফর্মা আর্গুমেন্ট ধারণকারী পাতা",
        "parser-template-loop-warning": "টেমপ্লেট লুপ সনাক্ত হয়েছে: [[$1]]",
-       "parser-template-recursion-depth-warning": "টেমপ্লেট পুনরাবৃত্তি (রিকার্শন) ডেপথ্‌ সীমা অতক্রম করেছে ($1)",
-       "language-converter-depth-warning": "ভাষা পরিবর্তন ডেপথ্‌ সীমা অতক্রম করেছে ($1)",
+       "template-loop-category": "টেমপ্লেট লুপসহ পাতা",
+       "template-loop-category-desc": "এই পাতায় একটি টেমপ্লেট লুপ আছে, অর্থাৎ এটি এমন একটি টেমপ্লেট যা নিজেকেই পুনরাবৃত্তভাবে আহ্বান করে।",
+       "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-warning": "পাতাটি এক্সেপশন সীমানা অতিক্রম করেছে",
        "parser-unstrip-loop-warning": "ত্রুটিপূর্ণ লুপ খুঁজে পাওয়া গিয়েছে",
        "parser-unstrip-recursion-limit": "লুপ রিকারশন সীমানা অতিক্রম করেছে ($1)",
-       "converter-manual-rule-error": "ভাষা à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦°à§\81লে ত্রুটি পাওয়া গিয়েছে",
+       "converter-manual-rule-error": "মà§\8dযানà§\81য়াল à¦­à¦¾à¦·à¦¾ à¦°à§\82পানà§\8dতর à¦¨à¦¿à¦¯à¦¼à¦®ে ত্রুটি পাওয়া গিয়েছে",
        "undo-success": "সম্পাদনাটি বাতিল করা যাবে। অনুগ্রহ করে নিচের তুলনাটি পরীক্ষা করে দেখুন ও নিশ্চিত করুন যে এটাই আপনি করতে চান, এবং তারপর নিচের সম্পাদনাগুলি সংরক্ষণ করে সম্পাদনাটির বাতিল প্রক্রিয়া সমাপ্ত করুন।",
        "undo-failure": "এ সম্পাদনা মধ্যবর্তী সম্পাদনাসমূহের কারণে পূর্বাবস্থায় ফিরিয়ে নেওয়া যাবে না।",
        "undo-norev": "সম্পাদনাটি বাতিল করা যাচ্ছেনা কারণ এটি আর নেই বা মুছে ফেলা হয়েছে।",
        "undo-nochange": "সম্পাদনাটি পূর্বেই বাতিল করা হয়েছে।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]])-এর সম্পাদিত $1 নম্বর সংশোধনটি বাতিল করা হয়েছে",
-       "undo-summary-username-hidden": "à¦\8fà¦\95à¦\9cন à¦²à§\81à¦\95ানà§\8b à¦¬à§\8dযবহারà¦\95ারà§\80 $1 à¦¸à¦\82শà§\8bধন à¦ªà§\81নরায় à¦«à¦¿à¦°à¦¿à¦¯à¦¼à§\87 à¦\8fনà§\87à¦\9bà§\87ন",
+       "undo-summary-username-hidden": "à¦\8fà¦\95à¦\9cন à¦²à§\81à¦\95ায়িত à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\95রা $1 à¦¨à¦\82 à¦¸à¦\82শà§\8bধনà¦\9fি à¦¬à¦¾à¦¤à¦¿à¦² à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87",
        "cantcreateaccount-text": "[[User:$3|$3]] এই আইপি ঠিকানা('''$1''') থেকে অ্যাকাউন্ট সৃষ্টিতে বাধা দিয়েছেন।\n\n$3-এর দেয়া কারণ হল ''$2''",
        "cantcreateaccount-range-text": "[[User:$3|$3]] কর্তৃক আইপি ঠিকানার ব্যাপ্তি <strong>$1</strong>-এর মধ্যে অ্যাকাউন্ট তৈরি করা অবরুদ্ধ করা হয়েছে। যাতে আপনার আইপি ঠিকানাও (<strong>$4</strong>) রয়েছে। \n\n$3 কর্তৃক <em>$2</em> কারণ দেখানো হয়েছে।",
        "viewpagelogs": "এই পাতার জন্য লগগুলো দেখুন",
        "nohistory": "এই পাতার কোন সম্পাদনার ইতিহাস নেই।",
        "currentrev": "সর্বশেষ সংস্করণ",
-       "currentrev-asof": "$1 à¦¤à¦¾à¦°à¦¿à¦\96à§\87 à¦¸à¦®à§\8dপাদিত à¦¬à¦°à§\8dতমান সংস্করণ",
-       "revisionasof": "$1 তারিখে সংস্করণ",
-       "revision-info": "$2 কর্তৃক $1 পর্যন্ত সংস্করণে $7",
-       "previousrevision": "←পুর্বের সংস্করণ",
-       "nextrevision": "পরবর্তী সংস্করণ→",
+       "currentrev-asof": "$1 à¦¤à¦¾à¦°à¦¿à¦\96à§\87 à¦¸à¦®à§\8dপাদিত à¦¸à¦°à§\8dবশà§\87ষ সংস্করণ",
+       "revisionasof": "$1 তারিখে সংশোধিত সংস্করণ",
+       "revision-info": "{{GENDER:$6|$2}} কর্তৃক $1 তারিখে সংশোধিত সংস্করণ$7",
+       "previousrevision": "← পূর্বের সংস্করণ",
+       "nextrevision": "পরবর্তী সংস্করণ →",
        "currentrevisionlink": "সর্বশেষ সংস্করণ",
        "cur": "বর্তমান",
        "next": "পরবর্তী",
        "last": "পূর্ববর্তী",
        "page_first": "প্রথম",
        "page_last": "শেষ",
-       "histlegend": "পারà§\8dথà¦\95à§\8dয à¦¨à¦¿à¦°à§\8dবাà¦\9aন: à¦¯à§\87 à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লà§\8b à¦¤à§\81লনা à¦\95রতà§\87 à¦\9aান, à¦¸à§\87à¦\97à§\81লà§\8b à¦\9aিহà§\8dনিত à¦\95রà§\87 à¦\8fনà§\8dà¦\9fার à¦¬à¦¾ à¦¨à¦¿à¦\9aà§\87র à¦¬à§\8bতামà¦\9fি à¦\9fিপà§\81ন।<br />\nনিরà§\8dদà§\87শিà¦\95া: (বরà§\8dতমান) = à¦¬à¦°à§\8dতমান à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦¸à¦¾à¦¥à§\87 à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয, (পà§\82রà§\8dববরà§\8dতà§\80) =  à¦ªà§\82রà§\8dবà§\87র à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦¸à¦¾à¦¥à§\87 à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয, à¦\85 = অনুল্লেখ্য সম্পাদনা।",
-       "history-fieldset-title": "বà§\8dরাà¦\89à¦\9c à¦\87তিহাস",
-       "history-show-deleted": "শà§\81ধà§\81মাতà§\8dর à¦\85পসারণ",
+       "histlegend": "পারà§\8dথà¦\95à§\8dয à¦¨à¦¿à¦°à§\8dবাà¦\9aন: à¦¯à§\87 à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লি à¦¤à§\81লনা à¦\95রতà§\87 à¦\9aান, à¦¸à§\87à¦\97à§\81লি à¦\9aিহà§\8dনিত à¦\95রà§\87 à¦\8fনà§\8dà¦\9fার à¦¬à¦¾ à¦¨à¦¿à¦\9aà§\87র à¦¬à§\8bতামà¦\9fি à¦\9fিপà§\81ন।<br />\nনিরà§\8dদà§\87শিà¦\95া: <strong>({{int:cur}})</strong> = à¦¬à¦°à§\8dতমান à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦¸à¦¾à¦¥à§\87 à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয, <strong>({{int:last}})</strong> = à¦ªà§\82রà§\8dবà§\87র à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦¸à¦¾à¦¥à§\87 à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয,  <strong>{{int:minoreditletter}}</strong> = অনুল্লেখ্য সম্পাদনা।",
+       "history-fieldset-title": "সà¦\82শà§\8bধিত à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦\9cনà§\8dয à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন",
+       "history-show-deleted": "শà§\81ধà§\81মাতà§\8dর à¦\85পসারিত à¦¸à¦\82শà§\8bধন",
        "histfirst": "সবচেয়ে পুরনো",
        "histlast": "সবচেয়ে নতুন",
        "historysize": "({{PLURAL:$1|১ বাইট|$1 বাইট}})",
        "historyempty": "(খালি)",
-       "history-feed-title": "সংশোধন ইতিহাস",
-       "history-feed-description": "এ উইকিতে এই পাতার সংশোধনের ইতিহাস",
+       "history-feed-title": "সংশোধনের ইতিহাস",
+       "history-feed-description": "এ উইকিতে এই পাতার সংশোধনের ইতিহাস",
        "history-feed-item-nocomment": "$2-এ $1",
        "history-feed-empty": "অনুরোধকৃত পাতাটির কোন অস্তিত্ব নেই।\nহয়ত পাতাটি উইকি থেকে মুছে ফেলা হয়েছে, কিংবা নতুন নামকরণ করা হয়েছে।\nপ্রাসঙ্গিক নতুন পাতাগুলির জন্য [[Special:Search|উইকি অনুসন্ধানের]] চেষ্টা করুন।",
        "history-edit-tags": "নির্বাচিত সংশোধনের ট্যাগ সম্পাদনা করুন",
        "rev-deleted-comment": "(সম্পাদনা সারাংশ অপসারিত)",
        "rev-deleted-user": "(ব্যবহারকারীর নাম সরিয়ে নেওয়া হয়েছে)",
        "rev-deleted-event": "(লগ তথ্য সরানো হয়েছে)",
-       "rev-deleted-user-contribs": "ব্যবহারকারীর নাম অথবা আইপি ঠিকানা অপসারিত হয়েছে - অবদান থেকে সম্পাদনা আড়াল করা হয়েছে",
+       "rev-deleted-user-contribs": "[ব্যবহারকারীর নাম অথবা আইপি ঠিকানা সরানো হয়েছে - অবদান থেকে সম্পাদনা লুকিয়ে রাখা হয়েছে]",
        "rev-deleted-text-permission": "পাতার এই সংস্করণটি '''অপসারিত''' হয়েছে।\nবিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।",
        "rev-suppressed-text-permission": "পাতার সংশোধনটি <strong>গোপন</strong> করা হয়েছে।\nবিস্তারিত বিবরণ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} গোপনকার্যের লগে] থাকতে পারে।",
        "rev-deleted-text-unhide": "পাতার এই সংস্করণটি '''অপসারিত''' হয়েছে।\nবিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।\nআপনি ইচ্ছা পোষণ করলে [$1 এই সংস্করণটি দেখতে পারেন]।",
        "rev-showdeleted": "দেখাও",
        "revisiondelete": "অবলুপ্ত/পুনঃস্থাপন সংশোধনসমূহ",
        "revdelete-nooldid-title": "বেঠিক লক্ষ্য সংশোধন",
-       "revdelete-nooldid-text": "à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦¸à¦®à§\8dপনà§\8dন à¦\95রার à¦\9cনà§\8dয à¦\86পনি à¦\95à§\8bন à¦²à¦\95à§\8dষà§\8dয à¦¸à¦\82শà§\8bধন à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦\95রà§\87ননি à¦¯à§\87à¦\96ানà§\87 à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦¸à¦®à§\8dপাদন à¦\95রা à¦¹à¦¬à§\87, à¦\85থবা à¦¨à¦¿à¦°à§\8dবাà¦\9aিত à¦¸à¦\82শà§\8bধনà¦\9fি à¦¨à§\87à¦\87, à¦\85থবা à¦\86পনি à¦¬à¦°à§\8dতমান à¦¸à¦\82শà§\8bধন à¦\86ড়াল à¦\95রার চেষ্টা করছেন।",
+       "revdelete-nooldid-text": "à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦¸à¦®à§\8dপনà§\8dন à¦\95রার à¦\9cনà§\8dয à¦\86পনি à¦\95à§\8bন à¦²à¦\95à§\8dষà§\8dয à¦¸à¦\82শà§\8bধন à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦\95রà§\87ননি à¦¯à§\87à¦\96ানà§\87 à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦¸à¦®à§\8dপাদন à¦\95রা à¦¹à¦¬à§\87, à¦\85থবা à¦¨à¦¿à¦°à§\8dবাà¦\9aিত à¦¸à¦\82শà§\8bধনà¦\9fি à¦¨à§\87à¦\87, à¦\85থবা à¦\86পনি à¦¬à¦°à§\8dতমান à¦¸à¦\82শà§\8bধন à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ার চেষ্টা করছেন।",
        "revdelete-no-file": "নির্ধারিত ফাইলটি নেই।",
        "revdelete-show-file-confirm": "আপনি কি নিশ্চিত যে \"<nowiki>$1</nowiki>\" ফাইলের $2 তারিখের $3 টার অপসারণ লগ দেখানো হবে?",
        "revdelete-show-file-submit": "হ্যাঁ",
        "revdelete-text-text": "অপসারিত সংস্করণসমূহ এখনও পাতা ইতিহাসে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারবে না।",
        "revdelete-text-file": "অপসারিত ফাইলের সংস্করণসমূহ এখনও ফাইল ইতিহাসে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারবে না।",
        "logdelete-text": "অপসারিত লগ ইভেন্টসমূহ এখনও লগে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারেবে না।",
-       "revdelete-text-others": "à¦\85নà§\8dযানà§\8dয à¦ªà§\8dরশাষà¦\95à¦\97ণ à¦\8fà¦\87 à¦²à§\81à¦\95ানà§\8b à¦¤à¦¥à§\8dয à¦\97à§\81লà§\8b দেখতে পারবেন এবং প্রয়োজনে সেগুলো ফিরিয়ে আনতে পারবেন, যদি অন্যান্য কোনো বাধা না থাকে।",
+       "revdelete-text-others": "à¦\85নà§\8dযানà§\8dয à¦ªà§\8dরশাসà¦\95à§\87রা à¦¤à¦¾à¦° à¦ªà¦°à§\87à¦\93 à¦\8fà¦\87 à¦²à§\81à¦\95ানà§\8b à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81à¦\97à§\81লি দেখতে পারবেন এবং প্রয়োজনে সেগুলো ফিরিয়ে আনতে পারবেন, যদি অন্যান্য কোনো বাধা না থাকে।",
        "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": "সà¦\82সà§\8dà¦\95রণের লেখা",
-       "revdelete-hide-image": "ফাà¦\87লà§\87র à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\86ড়াল à¦\95রà§\8b",
+       "revdelete-hide-text": "সà¦\82শà§\8bধনের লেখা",
+       "revdelete-hide-image": "ফাà¦\87লà§\87র à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
        "revdelete-hide-name": "লক্ষ্য ও প্যারামিটার আড়াল করো",
        "revdelete-hide-comment": "সম্পাদনা সারাংশ",
-       "revdelete-hide-user": "সম্পাদকে ব্যবহারকারীর নাম/আইপি",
+       "revdelete-hide-user": "সম্পাদকের ব্যবহারকারী নাম/আইপি ঠিকানা",
        "revdelete-hide-restricted": "প্রশাসকবৃন্দ এবং অন্যদের ক্ষেত্রে এই ডাটা রোধ করো",
-       "revdelete-radio-same": "পরিবর্তন নয়",
-       "revdelete-radio-set": "লà§\81à¦\95ানà§\8b",
+       "revdelete-radio-same": "(পরিবর্তন করবেন না)",
+       "revdelete-radio-set": "লà§\81à¦\95ায়িত",
        "revdelete-radio-unset": "দৃশ্যমান",
        "revdelete-suppress": "সব প্রশাসক ও অন্যান্যদের কাছ থেকে উপাত্ত লুকিয়ে রাখা হোক।",
        "revdelete-unsuppress": "সংশোধন পুনঃস্থাপনের উপর সীমাবদ্ধতা দূর করো",
        "revdel-restore": "দৃশ্যমানতা পরিবর্তন করো",
        "pagehist": "পাতার ইতিহাস",
        "deletedhist": "ইতিহাস মুছে ফেলো",
-       "revdelete-hide-current": "$2, $1 সময়ের বিষয়টি লুকানো যাচ্ছে না: এটি বর্তমান সংস্করণ।\nএটি লুকানো সম্ভব নয়।",
+       "revdelete-hide-current": "$2 সময় ও $1 তারিখের আইটেমটি লুকানো যাচ্ছে না: এটি বর্তমান সংস্করণ।\nএটি লুকানো সম্ভব নয়।",
        "revdelete-show-no-access": "$2, $1 তারিখের ছবিটি দেখাতে সমস্যা হচ্ছে: এটি ''রেসট্রিটেড'' হিসাবে চিহ্নিত করা রয়েছে।\nআপনার এটি দেখার অনুমতি নেই।",
        "revdelete-modify-no-access": "$2, $1 তারিখের ছবিটি সম্পাদনা করতে সমস্যা হচ্ছে: এটি ''রেসট্রিটেড'' হিসাবে চিহ্নিত করা রয়েছে।\nআপনার এটি দেখার অনুমতি নেই।",
        "revdelete-modify-missing": "$1 আইডি সম্বলিত তথ্যটি সম্পাদনা করা যাচ্ছে না: এটি ডাটাবেজ থেকে হারিয়ে গিয়েছে!",
        "revdelete-edit-reasonlist": "অপসারণের কারণ সম্পাদনা",
        "revdelete-offender": "সংশোধন লেখক:",
        "suppressionlog": "দমন লগ",
-       "suppressionlogtext": "নিà¦\9aà§\87র à¦¤à¦¾à¦²à¦¿à¦\95ায় à¦ªà§\8dরশাসà¦\95দà§\87র à¦¥à§\87à¦\95à§\87 à¦²à§\81à¦\95ানà§\8b à¦°à¦¯à¦¼à§\87à¦\9bà§\87 à¦\8fমন à¦¤à¦¥à§\8dযসহ à¦\85নà§\8dযনà§\8dয অপসারণ এবং বাধাদানের লগ রয়েছে।\nঅনুগ্রহ করে অস্থায়ী ব্যান এবং বাধাদানের লগ সম্পর্কে বিস্তারিত জানতে [[Special:BlockList|বাধাদানের লগ দেখুন]]।",
+       "suppressionlogtext": "নিà¦\9aà§\87র à¦¤à¦¾à¦²à¦¿à¦\95ায় à¦ªà§\8dরশাসà¦\95দà§\87র à¦\95াà¦\9b à¦¥à§\87à¦\95à§\87 à¦²à§\81à¦\95ানà§\8b à¦°à¦¯à¦¼à§\87à¦\9bà§\87 à¦\8fমন à¦¤à¦¥à§\8dযসহ অপসারণ এবং বাধাদানের লগ রয়েছে।\nঅনুগ্রহ করে অস্থায়ী ব্যান এবং বাধাদানের লগ সম্পর্কে বিস্তারিত জানতে [[Special:BlockList|বাধাদানের লগ দেখুন]]।",
        "mergehistory": "পাতার ইতিহাসগুলি একত্র করা হোক",
        "mergehistory-header": "এই পাতাটির মাধ্যমে আপনি একটি উৎস পাতার ইতিহাস একটি নতুনতর পাতার সাথে একত্র করতে পারবেন।\nপাতার ইতিহাসের পারম্পর্য যেন রক্ষা পায়, সে ব্যাপারটি নিশ্চিত করুন।",
        "mergehistory-box": "দুইটি পাতার একত্রীকরণ সংশোধনগুলি:",
        "mergehistory-list": "একীকরণযোগ্য সম্পাদনা ইতিহাস",
        "mergehistory-merge": "[[:$1]]-এর নিচের সংশোধনগুলি [[:$2]]-এর সাথে একত্র করা যাবে। রেডিও বোতাম কলামটি ব্যবহার করে কেবলমাত্র নির্দেশিত সময় ও তার আগের সমস্ত সংশোধন একত্র করুন। লক্ষ্য করুন, পরিভ্রমণ সংযোগ ব্যবহার করলে কলামটি আদি অবস্থায় ফেরত যাবে।",
        "mergehistory-go": "একত্রীকরণযোগ্য সম্পাদনাগুলি দেখানো হোক",
-       "mergehistory-submit": "সংশোধনগুলি একত্র করা হোক",
-       "mergehistory-empty": "কোন সংশোধন একত্র করা যাবে না.",
+       "mergehistory-submit": "সংশোধনগুলি একত্রীত করুন",
+       "mergehistory-empty": "কোন সংশোধন একত্র করা যাবে না",
        "mergehistory-done": "$1-এর $3{{PLURAL:$3|টি সংশোধন}} [[:$2]]-এর সাথে একত্রিত করা হয়েছে।",
        "mergehistory-fail": "ইতিহাস একত্র করা গেল না। অনুগ্রহ করে পাতাটি ও সময়ের প্যারামিটারগুলি আবার পরীক্ষা করে দেখুন।",
        "mergehistory-fail-bad-timestamp": "সময়তারিখ অবৈধ।",
        "mergehistory-fail-no-change": "ইতিহাস একত্রীকরণ কোন পুনর্বিবেচনা একত্রিত করে না। দয়া করে পাতা এবং সময় পরামিতি আবার পরীক্ষা করুন।",
        "mergehistory-fail-permission": "ইতিহাস একত্রীকরণের জন্য পর্যাপ্ত অনুমতি নেই।",
        "mergehistory-fail-self-merge": "উৎস এবং গন্তব্য পাতা একই।",
+       "mergehistory-fail-timestamps-overlap": "উৎসের সংশোধনগুলি হয় সম্পূর্ণ আলাদা নয় অথবা ঈপ্সিত সংশোধনগুলির পরে এসেছে।",
        "mergehistory-fail-toobig": "ইতিহাস থেকে আগের পাতাগুলো একীকরণ সম্ভব নয়, কারণ এর ফলে সর্বোচ্চ $1 টি {{PLURAL:$1|সংস্করণ}} স্থানান্তরের সীমানা অতিক্রম করবে।",
        "mergehistory-no-source": "$1 বলে কোন উৎস পাতার অস্তিত্ব নেই।",
        "mergehistory-no-destination": "$1 বলে কোন গন্তব্য পাতার অস্তিত্ব নেই।",
        "mergehistory-invalid-source": "উৎস পাতার অবশ্যই একটি বৈধ শিরোনাম থাকতে হবে।",
        "mergehistory-invalid-destination": "গন্তব্য পাতার একটি বৈধ শিরোনাম থাকতে হবে।",
-       "mergehistory-autocomment": "[[:$1]] à¦\95à§\87 [[:$2]] -à¦\8f à¦\8fà¦\95তà§\8dরà§\80ত করা হয়েছে",
-       "mergehistory-comment": "[[:$1]] à¦\95à§\87 [[:$2]] -à¦\8f à¦\8fà¦\95তà§\8dরà§\80ত করা হয়েছে: $3",
+       "mergehistory-autocomment": "[[:$1]] à¦ªà¦¾à¦¤à¦¾à¦\9fিà¦\95à§\87 [[:$2]] à¦ªà¦¾à¦¤à¦¾à¦\9fির à¦¸à¦¾à¦¥à§\87 à¦\8fà¦\95তà§\8dরিত করা হয়েছে",
+       "mergehistory-comment": "[[:$1]] à¦ªà¦¾à¦¤à¦¾à¦\9fিà¦\95à§\87 [[:$2]] à¦ªà¦¾à¦¤à¦¾à¦\9fির à¦¸à¦¾à¦¥à§\87 à¦\8fà¦\95তà§\8dরিত করা হয়েছে: $3",
        "mergehistory-same-destination": "উৎস এবং গন্তব্য পাতা একই হতে পারবে না",
        "mergehistory-reason": "কারণ:",
        "mergelog": "একত্রীকরণ লগ",
        "revertmerge": "একত্রীকরণ বাতিল",
        "mergelogpagetext": "নিচে সবচেয়ে সাম্প্রতিক ঘটা এক পাতার ইতিহাসের সাথে অন্য পাতার ইতিহাসের একত্রীকরণের একটি তালিকা দেওয়া হল।",
-       "history-title": "\"$1\" à¦\8fর সংশোধনের ইতিহাস",
-       "difference-title": "\"$1\"-এর বিভিন্ন সংস্করণের মধ্যে পার্থক্য",
-       "difference-title-multipage": "\"$1\" ও \"$2\"-পাতার মধ্যে পার্থক্য",
-       "difference-multipage": "পাতাগুলোর মধ্যে পার্থক্য",
+       "history-title": "\"$1\" à¦ªà¦¾à¦¤à¦¾à¦\9fির সংশোধনের ইতিহাস",
+       "difference-title": "\"$1\" পাতাটির দুইটি সংশোধিত সংস্করণের মধ্যে পার্থক্য",
+       "difference-title-multipage": "\"$1\" ও \"$2\" পাতাগুলির মধ্যে পার্থক্য",
+       "difference-multipage": "(পাতাগুলির মধ্যে পার্থক্য)",
        "lineno": "$1 নং লাইন:",
-       "compareselectedversions": "নিরà§\8dবাà¦\9aিত à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লà§\8b à¦¤à§\81লনা à¦\95রà§\8b",
-       "showhideselectedversions": "নিরà§\8dবাà¦\9aিত à¦¸à¦\82শà§\8bধনà¦\97à§\81লà§\8b দেখাও/লুকাও",
-       "editundo": "পà§\82রà§\8dবাবসà§\8dথায় à¦\86নà§\8b",
+       "compareselectedversions": "নিরà§\8dবাà¦\9aিত à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লি à¦¤à§\81লনা à¦\95রà§\81ন",
+       "showhideselectedversions": "নিরà§\8dবাà¦\9aিত à¦¸à¦\82শà§\8bধনà¦\97à§\81লি দেখাও/লুকাও",
+       "editundo": "পà§\82রà§\8dবাবসà§\8dথায় à¦«à§\87রত",
        "diff-empty": "(কোন পার্থক্য নেই)",
        "diff-multi-sameuser": "(একই ব্যবহারকারী দ্বারা সম্পাদিত {{PLURAL:$1|একটি মধ্যবর্তী সংশোধন|$1টি মধ্যবর্তী সংশোধন}} দেখানো হচ্ছে না)",
        "diff-multi-otherusers": "({{PLURAL:$2|একজন|$2 জন}} ব্যবহারকারী দ্বারা সম্পাদিত {{PLURAL:$1|একটি|$1টি}} মধ্যবর্তী সংশোধন দেখানো হচ্ছে না)",
-       "diff-multi-manyusers": "($2 জন {{PLURAL:$2|ব্যবহারাকারীর}} সম্পাদিত {{PLURAL:$1|একটি সাম্প্রতিক সংস্করণ|$1 টি সাম্প্রতিক সংস্করণ}} প্রদর্শিত হচ্ছে না)",
-       "difference-missing-revision": "$1 পার্থক্যের {{PLURAL:$2|একটি সংস্করণ|$2টি সংস্করণ}} খুঁজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক খোলার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।",
+       "diff-multi-manyusers": "($2 জনের বেশি {{PLURAL:$2|ব্যবহারকারীর}} সম্পাদিত {{PLURAL:$1|একটি মধ্যবর্তী সংশোধন|$1টি মধ্যবর্তী সংশোধন}} প্রদর্শিত হচ্ছে না)",
+       "difference-missing-revision": "এই পার্থক্যের ($1) অন্তর্গত {{PLURAL:$2|একটি সংশোধিত সংস্করণ|$2টি সংশোধিত সংস্করণ}} খুঁজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক খোলার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} পাতা অবলুপ্তি লগে] বিস্তারিত তথ্য জানা যাবে।",
        "searchresults": "অনুসন্ধানের ফলাফল",
        "searchresults-title": "\"$1\" অনুসন্ধানের ফলাফল",
        "titlematches": "নিবন্ধের শিরোনাম মিলেছে",
        "textmatches": "পাতার লেখার সাথে মিলেছে",
-       "notextmatches": "কোন পাতার লেখার সাথে মিলে নেই",
+       "notextmatches": "কোন পাতার লেখার সাথে মিলেনি",
        "prevn": "পূর্ববর্তী {{PLURAL:$1|$1}}টি",
        "nextn": "পরবর্তী {{PLURAL:$1|$1}}টি",
        "prev-page": "পূর্ববর্তী পাতা",
        "prevn-title": "পূর্ববর্তী $1{{PLURAL:$1|টি ফলাফল}}",
        "nextn-title": "পরবর্তী $1টি {{PLURAL:$1|ফলাফল}}",
        "shown-title": "প্রতি পাতায় $1টি {{PLURAL:$1|ফলাফল}} দেখাও",
-       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95।",
+       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) à¦¦à§\87à¦\96à§\81ন",
        "searchmenu-exists": "'''এই উইকিতে \"[[:$1]]\" নামে একটি পাতা রয়েছে'''",
-       "searchmenu-new": "<strong>\"[[:$1]]\" পাতাটি এই উইকিতে তৈরি করুন!</strong> {{PLURAL:$2|0=|এছাড়া আপনার অনুসন্ধানের সাথে পাওয়া পাতা দেখুন।|এছাড়া অনুসন্ধানে পাওয়া ফলাফলগুলি দেখুন।}}",
-       "searchprofile-articles": "বিষয়বসà§\8dতà§\81র পাতা",
+       "searchmenu-new": "<strong>\"[[:$1]]\" পাতাটি এই উইকিতে তৈরি করুন!</strong> {{PLURAL:$2|0=|এছাড়া আপনার অনুসন্ধানের সাথে পাওয়া পাতাটি দেখুন।|এছাড়া অনুসন্ধানে পাওয়া ফলাফলগুলিও দেখুন।}}",
+       "searchprofile-articles": "বিষয়বসà§\8dতà§\81সমà§\83দà§\8dধ পাতা",
        "searchprofile-images": "মাল্টিমিডিয়া",
        "searchprofile-everything": "সমস্তকিছু",
-       "searchprofile-advanced": "à¦\89à¦\9aà§\8dà¦\9aতর",
+       "searchprofile-advanced": "à¦\89নà§\8dনত",
        "searchprofile-articles-tooltip": "$1 এ অনুসন্ধান",
        "searchprofile-images-tooltip": "ফাইলের জন্য অনুসন্ধান",
-       "searchprofile-everything-tooltip": "সà¦\95ল à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\85নà§\81সনà§\8dধান à¦\95রà§\8b (à¦\86লাপà§\87র à¦ªà¦¾à¦¤à¦¾ সহ)",
-       "searchprofile-advanced-tooltip": "সà§\8dবনিরà§\8dধারিত à¦¨à¦¾à¦®à¦¸à§\8dথানà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\8b",
+       "searchprofile-everything-tooltip": "সà¦\95ল à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন (à¦\86লাপà§\87র à¦ªà¦¾à¦¤à¦¾সহ)",
+       "searchprofile-advanced-tooltip": "সà§\8dবনিরà§\8dধারিত à¦¨à¦¾à¦®à¦¸à§\8dথানà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন",
        "search-result-size": "$1 ({{PLURAL:$2|১টি শব্দ|$2টি শব্দ}})",
-       "search-result-category-size": "{{PLURAL:$1 |১টি সদস্য |$1টি সদস্য}} ({{PLURAL:$2 |১টি উপবিষয়শ্রেণী|$2টি উপবিষয়শ্রেণী}}, {{PLURAL:$3 |১টি ফাইল |$3টি ফাইল}})",
+       "search-result-category-size": "{{PLURAL:$1|১টি সদস্য|$1টি সদস্য}} ({{PLURAL:$2|১টি উপবিষয়শ্রেণী|$2টি উপবিষয়শ্রেণী}}, {{PLURAL:$3|১টি ফাইল |$3টি ফাইল}})",
        "search-redirect": "($1 থেকে পুনর্নির্দেশিত)",
-       "search-section": "(অনুচ্ছেদ $1)",
-       "search-category": "(বিষয়শ্রেণী $1)",
-       "search-file-match": "(নথির à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 মিলে যায়)",
-       "search-suggest": "à¦\86পনি à¦¸à¦®à§\8dভবত à¦¬à§\81à¦\9dাতà§\87 à¦\9aাà¦\87ছেন: $1",
-       "search-rewritten": "$1-এর জন্য ফলাফল দেখানো হচ্ছে। এর পরিবর্তে $2-এর জন্য অনুসন্ধান করুন।",
-       "search-interwiki-caption": "সহপ্রকল্পসমূহ",
-       "search-interwiki-default": "$1 থেকে ফলাফলসমূহ:",
+       "search-section": "($1 পরিচ্ছেদ)",
+       "search-category": "($1 বিষয়শ্রেণী)",
+       "search-file-match": "(ফাà¦\87লà§\87র à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦¸à¦¾à¦¥à§\87 মিলে যায়)",
+       "search-suggest": "à¦\86পনি à¦\95ি à¦¬à§\8bà¦\9dাতà§\87 à¦\9aাà¦\9aà§\8dছেন: $1",
+       "search-rewritten": "$1-à¦\8fর à¦\9cনà§\8dয à¦\85নà§\81সনà§\8dধানà§\87র à¦«à¦²à¦¾à¦«à¦² à¦¦à§\87à¦\96ানà§\8b à¦¹à¦\9aà§\8dà¦\9bà§\87। à¦\8fর à¦ªà¦°à¦¿à¦¬à¦°à§\8dতà§\87 $2-à¦\8fর à¦\9cনà§\8dয à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন।",
+       "search-interwiki-caption": "সহপ্রকল্পসমূহ থেকে ফলাফল",
+       "search-interwiki-default": "$1 à¦¥à§\87à¦\95à§\87 à¦ªà§\8dরাপà§\8dত à¦«à¦²à¦¾à¦«à¦²à¦¸à¦®à§\82হ:",
        "search-interwiki-more": "(আরও)",
        "search-interwiki-more-results": "আরও ফলাফল",
        "search-relatedarticle": "সম্পর্কিত",
        "searchall": "সমস্ত",
        "showingresults": "নিচে '''$2''' নং থেকে শুরু করে {{PLURAL:$1|'''1''' ফলাফল|'''$1''' ফলাফলসমূহ}} দেখানো হল।",
        "showingresultsinrange": "#<strong>$2</strong> থেকে #<strong>$3</strong> পরিসীমার মধ্যে {{PLURAL:$1|<strong>১টি</strong> ফলাফল|<strong>$1টি</strong> ফলাফল}} নিচে দেখানো হচ্ছে।",
-       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>-এর মধ্যে <strong>$1</strong>টি ফলাফল|<strong>$3</strong>-এর মধ্যে <strong>$1 - $2</strong>টি ফলাফল}}",
-       "search-nonefound": "à¦\96à§\8bà¦\81à¦\9cà¦\95à§\83ত à¦ªà¦¾à¦¤ার সাথে মিলে যায় এমন কোনো ফলাফল নেই।",
-       "search-nonefound-thiswiki": "à¦\96à§\8bà¦\81à¦\9c à¦\95রার সাথে মিলে যায় এমন কোনো ফলাফল এই সাইটে নেই।",
+       "search-showingresults": "মোট {{PLURAL:$4|<strong>$3</strong>টি ফলাফলের মধ্যে <strong>$1</strong>টি ফলাফল|<strong>$3</strong>টি ফলাফলের মধ্যে <strong>$1 - $2</strong>টি ফলাফল}}",
+       "search-nonefound": "à¦\85নà§\81সনà§\8dধানà¦\95à§\83ত à¦\9cিà¦\9cà§\8dà¦\9eাসার সাথে মিলে যায় এমন কোনো ফলাফল নেই।",
+       "search-nonefound-thiswiki": "à¦\85নà§\81সনà§\8dধানà¦\95à§\83ত à¦\9cিà¦\9cà§\8dà¦\9eাসার সাথে মিলে যায় এমন কোনো ফলাফল এই সাইটে নেই।",
        "powersearch-legend": "উন্নত অনুসন্ধান",
-       "powersearch-ns": "নামসà§\8dথানà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\8b:",
-       "powersearch-togglelabel": "পরà§\80à¦\95à§\8dষা:",
-       "powersearch-toggleall": "সà¦\95ল",
-       "powersearch-togglenone": "à¦\95িà¦\9bà§\81 নয়",
-       "powersearch-remember": "ভবিষà§\8dযত à¦\85নà§\81সনà§\8dধানà¦\97à§\81লির à¦\9cনà§\8dয à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦®à¦¨à§\87 à¦°à¦¾à¦\96à§\81ন",
+       "powersearch-ns": "নামসà§\8dথানà¦\97à§\81লিতà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন:",
+       "powersearch-togglelabel": "নিরà§\8dবাà¦\9aন à¦\95রà§\81ন:",
+       "powersearch-toggleall": "সবà¦\97à§\81লি",
+       "powersearch-togglenone": "à¦\95à§\8bনà¦\9fিà¦\87 নয়",
+       "powersearch-remember": "ভবিষà§\8dযত à¦\85নà§\81সনà§\8dধানà¦\97à§\81লির à¦\9cনà§\8dয à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦®à¦¨à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
        "search-external": "বহিঃস্থ অনুসন্ধান",
        "searchdisabled": "{{SITENAME}} অনুসন্ধান এখন নিষ্ক্রিয় আছে। আপনি গুগলের মাধ্যমে অনুসন্ধান চালাতে পারেন। লক্ষ্য করুন যে {{SITENAME}}-এর বিষয়বস্তুর উপর গুগলের ইন্ডেক্সগুলি হালনাগাদ না-ও করা থাকতে পারে।",
-       "search-error": "অনুসন্ধানের সময় একটি ত্রুটি হয়েছে: $1",
-       "search-warning": "অনুসন্ধানের সময় একটি সতর্কীকরণ দেখিয়েছে: $1",
+       "search-error": "à¦\85নà§\81সনà§\8dধানà§\87র à¦¸à¦®à¦¯à¦¼ à¦\8fà¦\95à¦\9fি à¦¤à§\8dরà§\81à¦\9fি à¦\89à§\8eপনà§\8dন à¦¹à¦¯à¦¼à§\87à¦\9bà§\87: $1",
+       "search-warning": "অনুসন্ধানের সময় একটি সতর্ক বার্তা উৎপন্ন হয়েছে: $1",
        "preferences": "আমার পছন্দ",
        "mypreferences": "পছন্দসমূহ",
        "prefs-edits": "সম্পাদনা সংখ্যা:",
-       "prefsnologintext2": "à¦\86পনার à¦ªà¦\9bনà§\8dদসমà§\82হ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতে প্রবেশ করুন।",
+       "prefsnologintext2": "à¦\86পনার à¦ªà¦\9bনà§\8dদà¦\97à§\81লি à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fে প্রবেশ করুন।",
        "prefs-skin": "আবরণ",
        "skin-preview": "প্রাকদর্শন",
        "datedefault": "কোন পছন্দ নেই",
-       "prefs-labs": "পরà§\80à¦\95à§\8dষাà¦\97ার à¦¬à§\88শিষà§\8dà¦\9fসমূহ",
+       "prefs-labs": "পরà§\80à¦\95à§\8dষাà¦\97ার à¦¸à§\81বিধাসমূহ",
        "prefs-user-pages": "ব্যবহারকারীর পাতা",
        "prefs-personal": "ব্যবহারকারীর বৃত্তান্ত",
        "prefs-rc": "সাম্প্রতিক পরিবর্তনসমূহ",
        "prefs-watchlist": "নজরতালিকা",
-       "prefs-editwatchlist": "নজরতালিকা সম্পাদনা করো",
+       "prefs-editwatchlist": "নজরতালিকা সম্পাদনা",
        "prefs-editwatchlist-label": "আপনার নজরতালিকার ভুক্তিসমূহ সম্পাদনা করুন:",
-       "prefs-editwatchlist-edit": "আপনার নজরতালিকায় থাকা শিরোনাম দেখুন ও সরান",
+       "prefs-editwatchlist-edit": "আপনার নজরতালিকায় থাকা শিরোনামগুলি দেখুন ও সরিয়ে ফেলুন",
        "prefs-editwatchlist-raw": "অশোধিত নজরতালিকা সম্পাদনা করুন",
-       "prefs-editwatchlist-clear": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦¸à§\8dà¦\95ার করুন",
-       "prefs-watchlist-days": "যত দিনের নজরতালিকা দেখানো হবে:",
+       "prefs-editwatchlist-clear": "নà¦\9cরতালিà¦\95া à¦\96ালি করুন",
+       "prefs-watchlist-days": "যতসংখ্যক দিনের নজরতালিকা দেখানো হবে:",
        "prefs-watchlist-days-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}",
-       "prefs-watchlist-edits": "সম্প্রসারিত নজর তালিকায় সর্বোচ্চ সংখ্যার পরিবর্তন দেখানোর জন্য:",
-       "prefs-watchlist-edits-max": "সরà§\8dবà§\8bà¦\9aà§\8dà¦\9a à¦¨à¦®à§\8dবর: ১০০০",
+       "prefs-watchlist-edits": "সম্প্রসারিত নজরতালিকায় প্রদর্শিত পরিবর্তনের সর্বোচ্চ সংখ্যা:",
+       "prefs-watchlist-edits-max": "সরà§\8dবà§\8bà¦\9aà§\8dà¦\9a à¦¸à¦\82à¦\96à§\8dযা: ১০০০",
        "prefs-watchlist-token": "নজরতালিকা টোকেন:",
        "prefs-misc": "বিবিধ",
        "prefs-resetpass": "পাসওয়ার্ড পরিবর্তন",
        "prefs-changeemail": "ইমেইল ঠিকানা পরিবর্তন বা বাতিল করুন",
-       "prefs-setemail": "একটি ই-মেইল ঠিকানা নির্ধারণ করুন",
-       "prefs-email": "ই-মেইল অপশন",
+       "prefs-setemail": "একটি ইমেইল ঠিকানা নির্ধারণ করুন",
+       "prefs-email": "ইমেইলের পছন্দগুলি",
        "prefs-rendering": "অবয়ব",
        "saveprefs": "সংরক্ষণ",
-       "restoreprefs": "সà¦\95ল à¦ªà§\82রà§\8dবনিরà§\8dধারিত à¦¸à§\87à¦\9fিà¦\82 à¦«à¦¿à¦°à¦¿à¦¯à¦¼à§\87 à¦\86নà§\8b (সà¦\95ল à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দে)",
+       "restoreprefs": "সà¦\95ল à¦ªà§\82রà§\8dবনিরà§\8dধারিত à¦¸à§\87à¦\9fিà¦\82 à¦«à¦¿à¦°à¦¿à¦¯à¦¼à§\87 à¦\86নà§\8b (সà¦\95ল à¦\85à¦\82শে)",
        "prefs-editing": "সম্পাদনা",
        "searchresultshead": "অনুসন্ধান",
-       "stub-threshold": "à¦\85সমà§\8dপà§\82রà§\8dণ à¦²à¦¿à¦\99à§\8dà¦\95 à¦¬à¦¿à¦¨à§\8dযাসà§\87র à¦\9cনà§\8dয à¦ªà§\8dরানà§\8dতিà¦\95 à¦®à¦¾à¦ª ($1):",
+       "stub-threshold": "à¦\85সমà§\8dপà§\82রà§\8dণ à¦¨à¦¿à¦¬à¦¨à§\8dধà§\87র à¦¸à¦\82যà§\8bà¦\97 à¦«à¦°à¦®à§\8dযাà¦\9fিà¦\82-à¦\8fর à¦\9cনà§\8dয à¦\8fরà¦\95ম à¦¨à¦¿à¦¬à¦¨à§\8dধà§\87র à¦\86à¦\95ারà§\87র à¦ªà§\8dরানà§\8dতসà§\80মা ($1):",
        "stub-threshold-sample-link": "নমুনা",
        "stub-threshold-disabled": "নিস্ক্রিয়",
-       "recentchangesdays": "সাম্প্রতিক পরিবর্তনে দিনসমূহ দেখানোর জন্য:",
-       "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}",
-       "recentchangescount": "সাম্প্রতিক পরিবর্তনে প্রদর্শিত সম্পাদনার সংখ্যা:",
-       "prefs-help-recentchangescount": "à¦\8fতà§\87 à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ, à¦ªà¦¾à¦¤à¦¾à¦° à¦\87তিহাস à¦\8fবà¦\82 à¦²à¦\97 অন্তর্ভুক্ত।",
-       "prefs-help-watchlist-token2": "à¦\8fà¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ার à¦\93য়à§\87ব à¦«à¦¿à¦¡à§\87র à¦\97à§\8bপন à¦\9aাবি। à¦¯à§\87 à¦\95à§\87à¦\89 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fা à¦\9cানà§\87ন তিনি আপনার নজরতালিকা পড়তে সক্ষম হবেন, তাই এটি প্রকাশ করবেন না। [[Special:ResetTokens|আপনার এটি পুনঃনির্ধারণ করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
-       "savedprefs": "à¦\86পনার à¦ªà¦\9bনà§\8dদà¦\97à§\81লà§\8b সংরক্ষণ করা হয়েছে।",
+       "recentchangesdays": "সাম্প্রতিক পরিবর্তন পাতায় প্রদর্শিত দিনের সংখ্যা:",
+       "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিনের}}",
+       "recentchangescount": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà§\87 à¦ªà§\8dরদরà§\8dশিত à¦¸à¦®à§\8dপাদনার à¦ªà§\82রà§\8dবনিরà§\8dধারিত à¦¸à¦\82à¦\96à§\8dযা:",
+       "prefs-help-recentchangescount": "à¦\8fতà§\87 à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি, à¦ªà¦¾à¦¤à¦¾à¦° à¦\87তিহাসà¦\97à§\81লি à¦\8fবà¦\82 à¦²à¦\97à¦\97à§\81লি অন্তর্ভুক্ত।",
+       "prefs-help-watchlist-token2": "à¦\8fà¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ার à¦\93য়à§\87ব à¦«à¦¿à¦¡à§\87র à¦\97à§\8bপন à¦\9aাবি। à¦\95à§\87à¦\89 à¦¯à¦¦à¦¿ à¦\8fà¦\9fি à¦\9cানতà§\87 à¦ªà¦¾à¦°à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 তিনি আপনার নজরতালিকা পড়তে সক্ষম হবেন, তাই এটি প্রকাশ করবেন না। [[Special:ResetTokens|আপনার এটি পুনঃনির্ধারণ করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
+       "savedprefs": "à¦\86পনার à¦ªà¦\9bনà§\8dদà¦\97à§\81লি সংরক্ষণ করা হয়েছে।",
        "savedrights": "{{GENDER:$1|$1}}-এর ব্যবহারকারী দল সংরক্ষিত হয়েছে।",
-       "timezonelegend": "সময়স্থান:",
+       "timezonelegend": "সময় অঞ্চল:",
        "localtime": "স্থানীয় সময়:",
        "timezoneuseserverdefault": "উইকির পূর্বনির্ধারিত সময় ব্যবহার করো ($1)",
        "timezoneuseoffset": "অন্য (অফসেট নির্দিষ্ট করুন)",
        "prefs-signature": "স্বাক্ষর",
        "prefs-dateformat": "তারিখ বিন্যাস",
        "prefs-timeoffset": "সময় অফসেট",
-       "prefs-advancedediting": "সাধারণ à¦\85পশন",
+       "prefs-advancedediting": "সাধারণ à¦ªà¦\9bনà§\8dদà¦\97à§\81লি",
        "prefs-editor": "সম্পাদক",
        "prefs-preview": "প্রাকদর্শন",
-       "prefs-advancedrc": "à¦\89à¦\9aà§\8dà¦\9aতর à¦\85পশন",
+       "prefs-advancedrc": "à¦\89à¦\9aà§\8dà¦\9aতর à¦ªà¦\9bনà§\8dদà¦\97à§\81লি",
        "prefs-advancedrendering": "উচ্চতর অপশন",
-       "prefs-advancedsearchoptions": "à¦\89à¦\9aà§\8dà¦\9aতর à¦\85পশন",
+       "prefs-advancedsearchoptions": "à¦\89à¦\9aà§\8dà¦\9aতর à¦ªà¦\9bনà§\8dদà¦\97à§\81লি",
        "prefs-advancedwatchlist": "উচ্চতর অপশন",
-       "prefs-displayrc": "প্রদর্শনী অপশন",
+       "prefs-displayrc": "প্রদর্শনীর পছন্দগুলি",
        "prefs-displaywatchlist": "প্রদর্শনী অপশন",
        "prefs-tokenwatchlist": "টোকেন",
        "prefs-diffs": "পার্থক্য",
        "prefs-help-prefershttps": "পরবর্তী প্রবেশের পর থেকে এই পরিবর্তনগুলো কার্যকর হবে।",
        "prefswarning-warning": "আপানি পছন্দসমূহ পাতায় পাতায় পরিবর্তন করেছেন যেগুলো সংরক্ষণ করা হয়নি। আপনি যদি এই পাতাটি ছেড়ে যাওয়ার আগে \"$1\" ক্লিক না করেন তবে পছন্দসমূহ হালনাগাদ হবে না।",
        "prefs-tabs-navigation-hint": "সাহায্য: আপনি ডান এবং বাম অ্যারো বাটন ব্যবহার করে বিভিন্ন ট্যাবগুলোতে যেতে পারবেন।",
-       "userrights": "ব্যবহারকারী অধিকার ব্যবস্থাপনা",
+       "userrights": "ব্যবহারকারী অধিকার",
        "userrights-lookup-user": "একজন ব্যবহারকারী নির্বাচন করুন",
        "userrights-user-editname": "ব্যবহারকারীর নাম লিখুন:",
        "editusergroup": "ব্যবহারকারী দল লোড করুন",
        "saveusergroups": "{{GENDER:$1|ব্যবহারকারীর}} দল সংরক্ষণ করো",
        "userrights-groupsmember": "সদস্য:",
        "userrights-groupsmember-auto": "শর্তহীন সদস্য",
-       "userrights-groups-help": "আপনি এই ব্যবহারকারীর বর্তমান দল পরিবর্তন করতে পারবেন:\n* টিক চিহ্ন দেওয়া ঘরের অর্থ ব্যবহারকারী ঐ দলের অন্তর্ভুক্ত।\n* টিক চিহ্ন বিহীন ঘরের অর্থ ব্যবহারকারী ঐ দলের অন্তর্ভুক্ত নন।\n* একটি তারকা চিহ্ন (*) দ্বারা বোঝানো হচ্ছে এই দলের অন্তর্ভুক্তির পর আপনি আর তা বাতিল করতে পারবেন না, বা তদ্বিপরীত।\n* একটি হ্যাশ চিহ্ন (#) দ্বারা বোঝানো হচ্ছে আপনি শুধুমাত্র এই দলের মেয়াদ শেষ হওয়ার সময় পিছনে নিতে পারবেন; কিন্তু সামনে নিতে পারবেন না।",
+       "userrights-groups-help": "à¦\86পনি à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80র à¦¬à¦°à§\8dতমান à¦¦à¦² à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন:\n* à¦\9fিà¦\95 à¦\9aিহà§\8dন à¦¦à§\87à¦\93য়া à¦\98রà§\87র à¦\85রà§\8dথ à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\90 à¦¦à¦²à§\87র à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত।\n* à¦\9fিà¦\95 à¦\9aিহà§\8dন à¦¬à¦¿à¦¹à§\80ন à¦\98রà§\87র à¦\85রà§\8dথ à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\90 à¦¦à¦²à§\87র à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত à¦¨à¦¨à¥¤\n* à¦\8fà¦\95à¦\9fি à¦¤à¦¾à¦°à¦\95া à¦\9aিহà§\8dন (*) à¦¦à§\8dবারা à¦¬à§\8bà¦\9dানà§\8b à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦\8fà¦\87 à¦¦à¦²à§\87র à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dতির à¦ªà¦° à¦\86পনি à¦\86র à¦¤à¦¾ à¦¬à¦¾à¦¤à¦¿à¦² à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾, à¦¬à¦¾ à¦¤à¦¦à§\8dবিপরà§\80ত।\n* à¦\8fà¦\95à¦\9fি à¦¹à§\8dযাশ à¦\9aিহà§\8dন (#) à¦¦à§\8dবারা à¦¬à§\8bà¦\9dানà§\8b à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦\86পনি à¦¶à§\81ধà§\81মাতà§\8dর à¦\8fà¦\87 à¦¦à¦²à§\87র à¦¸à¦¦à¦¸à§\8dযতার à¦®à§\87য়াদ à¦¶à§\87ষ à¦¹à¦\93য়ার à¦¸à¦®à¦¯à¦¼ à¦ªà¦¿à¦\9bনà§\87 à¦¨à¦¿à¦¤à§\87 à¦ªà¦¾à¦°à¦¬à§\87ন; à¦\95িনà§\8dতà§\81 à¦¸à¦¾à¦®à¦¨à§\87 à¦¨à¦¿à¦¤à§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾à¥¤",
        "userrights-reason": "কারণ (বাংলায় লিখুন):",
        "userrights-no-interwiki": "আপনার অন্য উইকিতে ব্যবহারকারী অধিকার সম্পাদনা করার অনুমতি নেই।",
        "userrights-nodatabase": "$1 ডাটাবেজটির হয় কোন অস্তিত্ব নেই অথবা এটি স্থানীয় ডাটাবেজ নয়।",
        "userrights-expiry-options": "১ দিন:1 day,১ সপ্তাহ:1 week,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year",
        "userrights-invalid-expiry": "\"$1\" দলের জন্য মেয়াদোত্তীর্ণের সময় অবৈধ।",
        "userrights-expiry-in-past": "\"$1\" দলের জন্য মেয়াদোত্তীর্ণের সময় অতীতে।",
+       "userrights-cannot-shorten-expiry": "\"$1\" দলটির সদস্যতার মেয়াদোত্তীর্ণ হবার সময় ও তারিখ আপনি পূর্ববর্তী কোন সময়ে এগিয়ে নিয়ে আসতে পারবেন না। যেসব ব্যবহারকারীর এই দলটি যোগ বা অপসারণ করার অনুমতি আছে, কেবল তারাই মেয়াদোত্তীর্ণ হবার সময় ও তারিখ এগিয়ে নিয়ে আসতে পারবেন।",
        "userrights-conflict": "ব্যবহারকারী অধিকার দ্বন্দ্ব! অনুগ্রহ করে নিশ্চিত হোন এবং পুনরায় চেষ্টা করুন।",
        "group": "দল:",
        "group-user": "ব্যবহারকারীগণ",
        "grouppage-sysop": "{{ns:project}}:প্রশাসক",
        "grouppage-bureaucrat": "{{ns:project}}:ব্যুরোক্র্যাট",
        "grouppage-suppress": "{{ns:project}}:দমনকারী",
-       "right-read": "পাতাসমà§\82হ à¦ªà¦¡à¦¼à§\81ন",
-       "right-edit": "পাতা à¦¸à¦®à§\8dপাদনা à¦\95রà§\81ন",
-       "right-createpage": "পাতা à¦¤à§\88রি à¦\95রà§\8b (à¦\86লাপà§\87র à¦ªà¦¾à¦¤à¦¾ à¦¨à¦¯à¦¼)",
-       "right-createtalk": "à¦\86লà§\8bà¦\9aনা à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রি à¦\95রà§\81ন",
+       "right-read": "যà§\87à¦\95à§\8bন à¦ªà¦¾à¦¤à¦¾ à¦ªà¦¡à¦¼à¦¾",
+       "right-edit": "পাতা à¦¸à¦®à§\8dপাদনা à¦\95রা",
+       "right-createpage": "à¦\86লাপ à¦ªà¦¾à¦¤à¦¾ à¦¨à¦¯à¦¼, à¦\8fমন à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রি à¦\95রা",
+       "right-createtalk": "à¦\86লাপ à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রি à¦\95রা",
        "right-createaccount": "নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করুন",
        "right-autocreateaccount": "স্বয়ংক্রিয়ভাবে একটি বাহ্যিক ব্যবহারকারী অ্যাকাউন্ট দিয়ে প্রবেশ করুন",
-       "right-minoredit": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¸à¦®à§\8dপাদনা à¦¹à¦¿à¦¸à§\87বà§\87 à¦\9aিহà§\8dনিত",
+       "right-minoredit": "à¦\95à§\8bনà¦\93 à¦¸à¦®à§\8dপাদনা à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¹à¦¿à¦¸à§\87বà§\87 à¦\9aিহà§\8dনিত à¦\95রা",
        "right-move": "পাতা সরান",
        "right-move-subpages": "পাতাগুলোকে তার উপপাতাসহ সরিয়ে নিন",
        "right-move-rootuserpages": "root ব্যবহারকারীর পাতাগুলো সরিয়ে ফেলুন",
        "right-suppressredirect": "পাতা স্থানান্তরের সময় মূল পাতা থেকে পুনর্নির্দেশ তৈরী করছে না",
        "right-upload": "ফাইল আপলোড করুন",
        "right-reupload": "বিদ্যমান ফাইল প্রতিস্থাপন করো",
-       "right-reupload-own": "à¦\95ারà¦\93 à¦\86পলà§\8bডà¦\95à§\83ত à¦«à¦¾à¦\87ল à¦\93ভাররাà¦\87à¦\9f à¦\95রà§\81ন",
+       "right-reupload-own": "নিà¦\9cà§\87র à¦¦à§\8dবারা à¦\86পলà§\8bডà¦\95à§\83ত à¦«à¦¾à¦\87ল à¦¯à¦¾ à¦\87তিমধà§\8dযà§\87à¦\87 à¦¬à¦¿à¦¦à§\8dযমান, à¦¸à§\87à¦\9fি à¦®à§\81à¦\9bà§\87 à¦ªà§\81নরায় à¦¨à¦¤à§\81ন à¦\95রà§\87 à¦\86পলà§\8bড à¦\95রা",
        "right-reupload-shared": "স্থানীয়ভাবে শেয়ার্ড মিডিয়া রিপোজিটরীর ফাইল ওভাররাইড",
        "right-upload_by_url": "URL থেকে ফাইল আপলোড",
-       "right-purge": "নিশà§\8dà¦\9aিতà¦\95রণ à¦\9bাড়াà¦\87 à¦¸à¦¾à¦\87à¦\9fà§\87র à¦\95à§\8dযাশ à¦ªà¦¾à¦°à§\8dà¦\9c à¦\95রà§\81ন",
+       "right-purge": "নিশà§\8dà¦\9aিতà¦\95রণ à¦\9bাড়াà¦\87 à¦¸à¦¾à¦\87à¦\9fà§\87র à¦\95à§\8dযাশ à¦¶à§\8bধন à¦\95রা",
        "right-autoconfirmed": "অর্ধ-সুরক্ষিত পাতা সম্পাদনা",
        "right-bot": "সয়ংক্রিয় পদ্ধতি হিসাবে চিহ্নিত করণ",
        "right-nominornewtalk": "বার্তা লেখার মত আলাপ পাতায় কোনো অনুল্লেখ্য সম্পাদনা নেই",
        "right-deletedtext": "অপরাসারিত সংশোধনের অপরাসারিত লেখা এবং পরিবর্তনসমূহ দেখাও",
        "right-browsearchive": "অপসারিত পাতা অনুসন্ধান করো",
        "right-undelete": "পাতাটি পুনরুদ্ধার করুন",
-       "right-suppressrevision": "যà§\87à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f à¦¸à¦\82শà§\8bধন à¦¦à§\87à¦\96à§\81ন, à¦\86ড়াল à¦\95রà§\81ন à¦\8fবà¦\82 à¦\85-à¦\86ড়াল à¦\95রুন",
-       "right-viewsuppressed": "সà¦\95ল à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\9cনà§\8dয à¦²à§\81à¦\95িয়াত à¦¸à¦\82শà§\8bধন à¦ªà§\8dরদরà§\8dশন à¦\95র",
+       "right-suppressrevision": "যà§\87à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f à¦¸à¦\82শà§\8bধন à¦¦à§\87à¦\96à§\81ন, à¦²à§\81à¦\95িয়à§\87  à¦°à¦¾à¦\96à§\81ন à¦\8fবà¦\82 à¦ªà§\8dরà¦\95াশà§\8dযà§\87 à¦\86নুন",
+       "right-viewsuppressed": "যà§\87à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\95াà¦\9b à¦¥à§\87à¦\95à§\87 à¦²à§\81à¦\95ায়িত à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লি à¦¦à§\87à¦\96à§\81ন",
        "right-suppressionlog": "ব্যক্তিগত লগ দেখাও",
        "right-block": "সম্পাদনা করতে কোনো ব্যবহারকারীকে বাঁধা দাও",
        "right-blockemail": "ই-মেইল পাঠাতে কোনো ব্যবহারকারীকে বাঁধা দাও",
        "right-protect": "পাতাটির সুরক্ষা সীমা পরিবর্তন করুন এবং সুরক্ষিত পাতটি সম্পাদনা করুন",
        "right-editprotected": "সুরক্ষিত পাতা সম্পাদনা (ক্যাসকাডিং সুরক্ষা ছাড়া)",
        "right-editsemiprotected": "পাতা সম্পাদনা সুরক্ষিত রয়েছে,  \"{{int:protect-level-autoconfirmed}}\"",
-       "right-editcontentmodel": "পাতার à¦¤à¦¥à§\8dযà§\87র à¦§à¦°à¦£ সম্পাদনা করুন",
+       "right-editcontentmodel": "পাতার à¦¤à¦¥à§\8dযà§\87র à¦§à¦°à¦¨ সম্পাদনা করুন",
        "right-editinterface": "ব্যবহারকারী ইন্টারফেস সম্পাদনা",
-       "right-editusercssjs": "অন্য ব্যবহারকারীগণের CSS এবং JS ফাইল সম্পাদনা",
        "right-editusercss": "অন্য ব্যবহারকারীগণের CSS ফাইল সম্পাদনা",
        "right-edituserjs": "অন্য ব্যবহারকারীগণের JS ফাইল সম্পাদনা",
        "right-editmyusercss": "আপনার নিজস্ব ব্যবহারকারী সিএসএস ফাইল সম্পাদনা করুন",
        "right-rollback": "একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন",
        "right-markbotedits": "ফেরত আনা সম্পাদনাসমূহকে বট সম্পাদনা হিসেবে চিহ্নিত করে",
        "right-noratelimit": "রেট লিমিটের ভিত্তিতে পরিবর্তন হবে না",
-       "right-import": "à¦\85নà§\8dয à¦\89à¦\87à¦\95ি à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানà§\80 à¦\95রà§\8b",
+       "right-import": "à¦\85নà§\8dয à¦\89à¦\87à¦\95ি à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানি à¦\95রা",
        "right-importupload": "ফাইল আপলোড থেকে এই পাতাগুলো আমদানী করো",
        "right-patrol": "অন্যের সম্পাদনা পরীক্ষিত বলে চিহ্নিত করো",
        "right-autopatrol": "কারও নিজের সম্পাদনা সয়ংক্রিয়ভাবে পরীক্ষাণ হিসাবে চিহ্নিত",
        "right-mergehistory": "পাতার ইতিহাস একীকরণ করুন।",
        "right-userrights": "সকল ব্যবহারকারী অধিকার সম্পাদনা করুন",
        "right-userrights-interwiki": "অন্যান্য উইকির ব্যবহারকারীদের অধিকারসমূহ সম্পাদনা করুন।",
-       "right-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\8fবà¦\82 à¦\96à§\81লà§\81ন",
+       "right-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রা à¦\8fবà¦\82 à¦\96à§\8bলা",
        "right-override-export-depth": "৫ম স্তর পর্যন্ত সংযুক্তিসহ একটি পাতা রপ্তানী করুন",
-       "right-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
+       "right-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
        "right-managechangetags": "[[Special:Tags|ট্যাগ]] তৈরি ও সক্রিয়/নিষ্ক্রিয় করুন",
-       "right-applychangetags": "সমà§\8dপাদনার à¦¸à¦¾à¦¥à§\87 [[Special:Tags|à¦\9fà§\8dযাà¦\97]] à¦¯à§\81à¦\95à§\8dত à¦\95রà§\81ন",
+       "right-applychangetags": "নিà¦\9cসà§\8dব à¦¸à¦®à§\8dপাদনার à¦¸à¦¾à¦¥à§\87 [[Special:Tags|à¦\9fà§\8dযাà¦\97]] à¦¯à§\81à¦\95à§\8dত à¦\95রা",
        "right-changetags": "নির্দিষ্ট সংস্করণ এবং দীর্ঘ সম্পাদনাগুলোতে [[Special:Tags|ট্যাগ]] সংযোজন ও অপসারণ করুন",
        "right-deletechangetags": "ডাটাবেজ থেকে [[Special:Tags|ট্যাগ]] অপসারণ করা",
        "grant-generic": "\"$1\" অধিকার স্তর",
        "grant-editpage": "বিদ্যমান পাতা সম্পাদনা করুন",
        "grant-editprotected": "সংরক্ষিত পাতা সম্পাদনা করুন",
        "grant-highvolume": "উচ্চ-মাত্রার সম্পাদনা",
-       "grant-oversight": "বà§\8dযবহারà¦\95ারà§\80 à¦²à§\81à¦\95ান à¦\93 à¦\87তিহাস à¦\85পসারণ",
+       "grant-oversight": "বà§\8dযবহারà¦\95ারà§\80 à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦\93 à¦¸à¦\82শà§\8bধন à¦¦à¦®à¦¨",
        "grant-patrol": "পাতার পরিবর্তনে টহল দেয়া",
        "grant-privateinfo": "ব্যক্তিগত তথ্যে প্রবেশাধিকার",
        "grant-protect": "পাতাসমূহ সুরক্ষা ও অরক্ষিত করুন",
        "action-autocreateaccount": "স্বয়ংক্রিয়ভাবে এই বাহ্যিক ব্যবহারকারী অ্যাকাউন্ট তৈরি করার",
        "action-history": "এই পাতার ইতিহাস দেখার",
        "action-minoredit": "এই সম্পাদনাটি অনুল্লেখ্য হিসেবে চিহ্নিত করার",
-       "action-move": "পাতাà¦\9fি à¦¸à¦°à¦¿à¦¯à¦¼à§\87 à¦«à§\87লà§\81ন",
-       "action-move-subpages": "পাতাà¦\9fি à¦\8fবà¦\82 à¦\8fর à¦\89পপাতাà¦\97à§\81লà§\8b à¦¸à¦°à¦¿à¦¯à¦¼à§\87 à¦«à§\87লà§\81ন",
+       "action-move": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à§\8dথানানà§\8dতর à¦\95রার",
+       "action-move-subpages": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\8fবà¦\82 à¦\8fর à¦\89পপাতাà¦\97à§\81লি à¦¸à§\8dথানানà§\8dতর à¦\95রার",
        "action-move-rootuserpages": "root ব্যবহারকারীর পাতাগুলো সরিয়ে ফেলুন",
-       "action-move-categorypages": "বিষয়শ্রেণী পাতাসমূহ স্থানান্তর করুন",
+       "action-move-categorypages": "বিষয়শ্রেণীর পাতা স্থানান্তর করার",
        "action-movefile": "এই ফাইল স্থানান্তর করার",
        "action-upload": "এই ফাইল আপলোড করার",
-       "action-reupload": "বিদà§\8dযমান à¦«à¦¾à¦\87ল à¦ªà§\8dরতিসà§\8dথাপন à¦\95রà§\8b",
+       "action-reupload": "à¦\8fà¦\87 à¦¬à¦¿à¦¦à§\8dযমান à¦«à¦¾à¦\87ল à¦ªà§\8dরতিসà§\8dথাপন à¦\95রার",
        "action-reupload-shared": "শেয়ার্ড রিপোজিটরীতে এই ফাইলটি হালনাগাদ করার",
-       "action-upload_by_url": "à¦\95à§\8bন à¦\87à¦\89à¦\86রà¦\8fল à¦¥à§\87à¦\95à§\87 à¦«à¦¾à¦\87লà¦\9fি à¦\86পলà§\8bড à¦\95রà§\8b",
-       "action-writeapi": "রাà¦\87à¦\9f à¦\8fপিà¦\86à¦\87 à¦¬à§\8dযবহার à¦\95রà§\81ন",
-       "action-delete": "পাতাà¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লà§\8b",
+       "action-upload_by_url": "à¦\8fà¦\95à¦\9fি à¦\87à¦\89à¦\86রà¦\8fল à¦¥à§\87à¦\95à§\87 à¦\8fà¦\87 à¦«à¦¾à¦\87লà¦\9fি à¦\86পলà§\8bড à¦\95রার",
+       "action-writeapi": "à¦\8fপিà¦\86à¦\87 à¦²à§\87à¦\96া à¦¬à§\8dযবহার à¦\95রার",
+       "action-delete": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\85পসারণ à¦\95রার",
        "action-deleterevision": "সংশোধনটি মুছে ফেলার",
        "action-deletelogentry": "লগের ভুক্তি অপসারণ করার",
        "action-deletedhistory": "পাতার অপসারিত ইতিহাস দেখার",
        "action-deletedtext": "অপসারিত সংশোধনের লেখা দেখার",
-       "action-browsearchive": "অপসারিত পাতায় অনুসন্ধান করুন",
+       "action-browsearchive": "অপসারিত পাতা অনুসন্ধান করার",
        "action-undelete": "পাতাটি পুনরুদ্ধার করার",
        "action-suppressrevision": "লুকানো সংস্করণগুলো পর্যালোচনা এবং পুনঃস্থাপন করার",
        "action-suppressionlog": "এই ব্যক্তিগত লগ দেখার",
        "action-block": "এই ব্যবহারকারীকে সম্পাদনা করতে বাঁধা দেয়ার",
        "action-protect": "এই পাতার সুরক্ষার মাত্রা পরিবর্তন করার",
        "action-rollback": "একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন",
-       "action-import": "à¦\85নà§\8dয à¦\89à¦\87à¦\95ি à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানà§\80 à¦\95রà§\8b",
-       "action-importupload": "ফাà¦\87ল à¦\86পলà§\8bড à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানà§\80 à¦\95রà§\8b",
-       "action-patrol": "à¦\85নà§\8dযদà§\87র à¦¸à¦®à§\8dপাদনা à¦ªà¦°à§\80à¦\95à§\8dষিত à¦¬à¦²à§\87 à¦\9aিহà§\8dনিত à¦\95রà§\8b",
+       "action-import": "à¦\85নà§\8dয à¦\89à¦\87à¦\95ি à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানি à¦\95রার",
+       "action-importupload": "ফাà¦\87ল à¦\86পলà§\8bড à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানি à¦\95রার",
+       "action-patrol": "à¦\85নà§\8dযদà§\87র à¦¸à¦®à§\8dপাদনা à¦ªà¦°à§\80à¦\95à§\8dষিত à¦¬à¦²à§\87 à¦\9aিহà§\8dনিত à¦\95রার",
        "action-autopatrol": "পরীক্ষিত বলে চিহ্নিত কি আপনি সম্পাদনা করেছেন",
-       "action-unwatchedpages": "নà¦\9cরতালিà¦\95া à¦¬à¦¹à¦¿à¦°à§\8dভà§\82ত à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লির à¦¤à¦¾à¦²à¦¿à¦\95া à¦¦à§\87à¦\96াà¦\93",
+       "action-unwatchedpages": "নà¦\9cরতালিà¦\95া à¦¬à¦¹à¦¿à¦°à§\8dভà§\82ত à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লির à¦¤à¦¾à¦²à¦¿à¦\95া à¦¦à§\87à¦\96ার",
        "action-mergehistory": "এই পাতার ইতিহাস একত্রিত করার",
-       "action-userrights": "সà¦\95ল à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\85ধিà¦\95ার à¦¸à¦®à§\8dপাদনা à¦\95রà§\81ন",
-       "action-userrights-interwiki": "অন্যান্য উইকির ব্যবহারকারীদের অধিকারসমূহ সম্পাদনা করুন",
-       "action-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\85থবা à¦\96à§\81লà§\81ন",
+       "action-userrights": "সà¦\95ল à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\85ধিà¦\95ার à¦¸à¦®à§\8dপাদনা à¦\95রার",
+       "action-userrights-interwiki": "অন্য উইকিতে ব্যবহারকারীদের অধিকার সম্পাদনা করার",
+       "action-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রার à¦\85থবা à¦\96à§\8bলার",
        "action-sendemail": "ই-মেইল পাঠাও",
        "action-editmyoptions": "নিজের পছন্দসমূহ সম্পাদনা করার",
        "action-editmywatchlist": "আপনার নজরতালিকা পরিবর্তন করুন",
        "action-editcontentmodel": "পাতার কন্টেন্ট মডেল সম্পাদনা করুন",
        "action-managechangetags": "ট্যাগ তৈরি ও সক্রিয়/নিষ্ক্রিয়",
        "action-applychangetags": "আপনার পরিবর্তনগুলোর সাথে ট্যাগ সংযোজন করুন",
-       "action-changetags": "নিরà§\8dদিষà§\8dà¦\9f à¦¸à¦\82সà§\8dà¦\95রণ à¦\8fবà¦\82 à¦¦à§\80রà§\8dà¦\98 à¦¸à¦®à§\8dপাদনাà¦\97à§\81লà§\8bতà§\87 à¦\9fà§\8dযাà¦\97 à¦¸à¦\82যà§\8bà¦\9cন à¦\93 à¦\85পসারণ à¦\95রà§\81ন",
+       "action-changetags": "নিরà§\8dদিষà§\8dà¦\9f à¦¸à¦\82সà§\8dà¦\95রণ à¦\8fবà¦\82 à¦²à¦\97 à¦­à§\81à¦\95à§\8dতিà¦\97à§\81লিতà§\87 à¦¯à¦¥à§\87à¦\9aà§\8dà¦\9bভাবà§\87 à¦\9fà§\8dযাà¦\97 à¦¸à¦\82যà§\8bà¦\9cন à¦\93 à¦\85পসারণ à¦\95রা",
        "action-deletechangetags": "ডাটাবেজ থেকে ট্যাগ অপসরণ করার",
        "action-purge": "এই পাতা হালনাগাদ করার",
        "nchanges": "$1টি {{PLURAL:$1|পরিবর্তন}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|সর্বশেষ প্রদর্শনের পর}} $1টি",
        "enhancedrc-history": "ইতিহাস",
        "recentchanges": "সাম্প্রতিক পরিবর্তন",
-       "recentchanges-legend": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà§\87র à¦ªà¦\9bনà§\8dদসমà§\82হ",
+       "recentchanges-legend": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà§\87র à¦ªà¦\9bনà§\8dদà¦\97à§\81লি",
        "recentchanges-summary": "এই পাতায় উইকিটির সবচেয়ে সাম্প্রতিক পরিবর্তনগুলি অনুসরণ করুন।",
        "recentchanges-noresult": "নির্ধারিত সময়ের মধ্যে কোনো পরিবর্তন পাওয়া যায়নি।",
        "recentchanges-feed-description": "এই ফিডে উইকিটির সবচেয়ে সাম্প্রতিক পরিবর্তনগুলি অনুসরণ করুন।",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (আরও দেখুন [[Special:NewPages|নতুন পাতার তালিকা]])",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
        "recentchanges-submit": "দেখাও",
-       "rcfilters-activefilters": "সক্রিয় ফিল্টার",
+       "rcfilters-activefilters": "সক্রিয় ছাঁকনিসমূহ",
+       "rcfilters-quickfilters": "দ্রুত সংযোগ",
+       "rcfilters-savedqueries-defaultlabel": "ছাঁকনি সংরক্ষণ",
+       "rcfilters-savedqueries-rename": "নামান্তর",
+       "rcfilters-savedqueries-remove": "সরান",
+       "rcfilters-savedqueries-new-name-label": "নাম",
+       "rcfilters-savedqueries-apply-label": "দ্রুত সংযোগ তৈরি করুন",
+       "rcfilters-savedqueries-cancel-label": "বাতিল",
        "rcfilters-restore-default-filters": "পূর্বনির্ধারিত ছাঁকনি পুনরুদ্ধার করুন",
-       "rcfilters-clear-all-filters": "সমসà§\8dত à¦«à¦¿à¦²à§\8dà¦\9fার à¦\85পসারণ",
+       "rcfilters-clear-all-filters": "সব à¦\9bাà¦\81à¦\95নি à¦ªà¦°à¦¿à¦·à§\8dà¦\95ার à¦\95রà§\81ন",
        "rcfilters-search-placeholder": "সাম্প্রতিক পরিবর্তনসমূহ ছাঁকুন (ব্রাউজ বা টাইপ করা শুরু করুন)",
-       "rcfilters-invalid-filter": "à¦\85à¦\95ারà§\8dযà¦\95র à¦«à¦¿à¦²à§\8dà¦\9fার",
+       "rcfilters-invalid-filter": "à¦\85à¦\95ারà§\8dযà¦\95র à¦\9bাà¦\81à¦\95নি",
        "rcfilters-empty-filter": "কোনো সক্রিয় ফিল্টার নেই। সমস্ত অবদান দেখানো হয়েছে।",
        "rcfilters-filterlist-title": "ছাঁকনি",
+       "rcfilters-filterlist-whatsthis": "এটি কী?",
+       "rcfilters-filterlist-feedbacklink": "নতুন (বিটা) ছাঁকনির উপর মতামত প্রদান করুন",
+       "rcfilters-highlightbutton-title": "ফলাফলে আলোকপাত করুন",
        "rcfilters-highlightmenu-title": "একটি রং নির্বাচন করুন",
-       "rcfilters-filterlist-noresults": "কোনও ফিল্টার পাওয়া যায়নি",
+       "rcfilters-highlightmenu-help": "এই বৈশিষ্ট্যটিতে আলোকপাত করতে একটি রঙ নির্বাচন করুন",
+       "rcfilters-filterlist-noresults": "কোনও ছাঁকনি পাওয়া যায়নি",
+       "rcfilters-noresults-conflict": "কোনও ফলাফল পাওয়া যায়নি কারণ অনুসন্ধানের মাপকাঠিগুলির মধ্যে সংঘর্ষ আছে",
+       "rcfilters-state-message-subset": "এই ছাঁকনিটির কোন প্রভাব নেই কারণ এর ফলাফলগুলি নিম্নোক্ত বৃহত্তর পরিধির {{PLURAL:$2|ছাঁকনিটির|ছাঁকনিগুলির}} মধ্যে অন্তর্ভুক্ত আছে (আলোকপাত করে এটিকে আলাদা করে দেখার চেষ্টা করুন): $1",
+       "rcfilters-state-message-fullcoverage": "কোন দলের সমস্ত ছাঁকনি নির্বাচন করা এবং কোন ছাঁকনিই নির্বাচন না করা একই কথা, তাই এই ছাঁকনিটির কোন প্রভাব নেই। এই দলে অন্তর্ভুক্ত ছাঁকনিগুলি হল: $1",
        "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-filter-unregistered-description": "যেসব সম্পাদক অ্যাকাউন্টে প্রবেশ করেননি।",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "এই ছাঁকনিটির সাথে নিম্নোক্ত ব্যবহারকারী অভিজ্ঞতা {{PLURAL:$2|ছাঁকনিটির|ছাঁকনিগুলির}} সংঘর্ষ আছে; যা কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে: $1",
+       "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-experienced-label": "অভিজ্ঞ ব্যবহারকারী",
-       "rcfilters-filter-userExpLevel-experienced-description": "৩০ দিনের বেশী কার্যকলাপ ও ৫০০টি সম্পাদনা।",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "অভিজ্ঞতা ছাঁকনিগুলি কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে, তাই এই ছাঁকনিটি \"অনিবন্ধিত\" ছাঁকনিটির সাথে সংঘর্ষে আছে।",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"অনিবন্ধিত\" ছাঁকনিটি এক বা তার অধিক অভিজ্ঞতা ছাঁকনির সাথে সংঘর্ষে আছে, যে ছাঁকনিগুলি কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে। সংঘর্ষরত ছাঁকনিগুলিকে উপরের \"সক্রিয় ছাঁকনিসমূহ\" এলাকাতে চিহ্নিত করা হয়েছে।",
+       "rcfilters-filter-user-experience-level-newcomer-label": "নতুন আগত",
+       "rcfilters-filter-user-experience-level-newcomer-description": "১০টির কমসংখ্যক সম্পাদনা করেছেন ও ৪ দিনের কম সময় ধরে সক্রিয় আছেন।",
+       "rcfilters-filter-user-experience-level-learner-label": "শিক্ষার্থী",
+       "rcfilters-filter-user-experience-level-learner-description": "\"নতুন আগতদের\" চেয়ে বেশি অভিজ্ঞ, কিন্তু \"অভিজ্ঞ ব্যবহারকারীদের\" চেয়ে কম।",
+       "rcfilters-filter-user-experience-level-experienced-label": "অভিজ্ঞ ব্যবহারকারী",
+       "rcfilters-filter-user-experience-level-experienced-description": "৩০ দিনের বেশি সক্রিয় আছেন ও ৫০০টির বেশি সম্পাদনা করেছেন।",
        "rcfilters-filtergroup-automated": "স্বয়ংক্রিয় অবদান",
        "rcfilters-filter-bots-label": "বট",
        "rcfilters-filter-bots-description": "স্বয়ংক্রিয় সরঞ্জাম দিয়ে করা সম্পাদনা।",
        "rcfilters-filter-humans-label": "মানুষ (বট নয়)",
-       "rcfilters-filter-humans-description": "মানব সম্পাদক দ্বারা করা সম্পাদনা।",
-       "rcfilters-filtergroup-significance": "তাত্পর্য",
+       "rcfilters-filter-humans-description": "মানুষের করা সম্পাদনা।",
+       "rcfilters-filtergroup-reviewstatus": "পর্যালোচনার অবস্থা",
+       "rcfilters-filter-patrolled-label": "পরীক্ষিত",
+       "rcfilters-filter-patrolled-description": "সম্পাদনা পরীক্ষিত হিসেবে চিহ্নিত করা হয়েছে।",
+       "rcfilters-filter-unpatrolled-label": "অপরীক্ষিত",
+       "rcfilters-filter-unpatrolled-description": "সম্পাদনা পরীক্ষিত হিসেবে চিহ্নিত করা হয় নি।",
+       "rcfilters-filtergroup-significance": "তাৎপর্য",
        "rcfilters-filter-minor-label": "অনুল্লেখ্য সম্পাদনা",
-       "rcfilters-filter-major-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-label": "পাতা তৈরিকরণ",
        "rcfilters-filter-newpages-description": "সম্পাদনা যা নতুন পাতা তৈরি করেছে।",
        "rcfilters-filter-categorization-label": "বিষয়শ্রেণীর পরিবর্তন",
+       "rcfilters-filter-categorization-description": "বিষয়শ্রেণী পাতা সংযোজন বা অপসারণের তালিকা",
        "rcfilters-filter-logactions-label": "প্রবেশকৃত কার্য",
        "rcfilters-filter-logactions-description": "প্রশাসনিক কর্ম, অ্যাকাউন্ট সৃষ্টিকরণ, পাতা অপসারণ, আপলোড....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "\"অনুল্লেখ্য সম্পাদনা\" ছাঁকনিটির সাথে এক বা ততোধিক \"পরিবর্তনের ধরন\"-সংক্রান্ত ছাঁকনির সংঘর্ষ আছে, কারণ কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়। সংঘর্ষে থাকা ছাঁকনিগুলিকে উপরের \"সক্রিয় ছাঁকনিসমূহ\" এলাকাতে চিহ্নিত করা হয়েছে।",
+       "rcfilters-hideminor-conflicts-typeofchange": "কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়, তাই এই ছাঁকনিটির সাথে নিম্নোক্ত পরিবর্তনের ধরন ছাঁকনিগুলির সংঘর্ষ আছে: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "এই \"পরিবর্তনের ধরন\"-সংক্রান্ত ছাঁকনিটির সাথে \"অনুল্লেখ্য সম্পাদনা\" ছাঁকনিটির সংঘর্ষ আছে। কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়।",
+       "rcfilters-filtergroup-lastRevision": "সর্বশেষ সংস্করণ",
+       "rcfilters-filter-lastrevision-label": "সর্বশেষ সংশোধন",
+       "rcfilters-filter-lastrevision-description": "একটি পাতার সর্বশেষ সাম্প্রতিক পরিবর্তন।",
+       "rcfilters-filter-previousrevision-label": "পূর্ববর্তী সংশোধন",
+       "rcfilters-filter-previousrevision-description": "সব পরিবর্তন যা একটি পাতার সর্বশেষ সাম্প্রতিক পরিবর্তন নয়।",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)।",
+       "rclistfromreset": "তারিখ নির্বাচন পুনঃস্থাপন করুন",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "rcshowhideminor": "অনুল্লেখ্য পরিবর্তনগুলো $1",
        "rcshowhideminor-show": "দেখাও",
-       "rcshowhideminor-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhideminor-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhidebots": "বটগুলো $1",
        "rcshowhidebots-show": "দেখাও",
-       "rcshowhidebots-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhidebots-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhideliu": "নিবন্ধিত ব্যবহারকারীদের $1",
        "rcshowhideliu-show": "দেখাও",
-       "rcshowhideliu-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhideliu-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhideanons": "বেনামী ব্যবহারকারীদের $1",
        "rcshowhideanons-show": "দেখাও",
-       "rcshowhideanons-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhideanons-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhidepatr": "পরীক্ষিত সম্পাদনা $1",
        "rcshowhidepatr-show": "দেখাও",
-       "rcshowhidepatr-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhidepatr-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhidemine": "আমার সম্পাদনাগুলো $1",
        "rcshowhidemine-show": "দেখাও",
-       "rcshowhidemine-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhidemine-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhidecategorization": "পাতা শ্রেণীবদ্ধকরণ $1",
        "rcshowhidecategorization-show": "দেখাও",
-       "rcshowhidecategorization-hide": "à¦\86ড়াল à¦\95রো",
-       "rclinks": "'''প্রদর্শনের ধরন'''<br />\n* বিগত ($2) দিনের শেষ ($1)টি পরিবর্তন দেখাও\n* $3",
+       "rcshowhidecategorization-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
+       "rclinks": "বিগত $2 দিনের শেষ $1টি পরিবর্তন দেখান",
        "diff": "পরিবর্তন",
        "hist": "ইতিহাস",
-       "hide": "দà§\87à¦\96িà¦\93 à¦¨à¦¾",
+       "hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96à§\8b",
        "show": "দেখাও",
        "minoreditletter": "অ",
        "newpageletter": "ন",
        "rc-change-size-new": "পরিবর্তনের পর $1 {{PLURAL:$1|বাইট}}",
        "newsectionsummary": "/* $1 */ নতুন অনুচ্ছেদ",
        "rc-enhanced-expand": "বিস্তারিত দেখাও",
-       "rc-enhanced-hide": "বিসà§\8dতারিত à¦²à§\81à¦\95াà¦\93",
+       "rc-enhanced-hide": "বিসà§\8dতারিত à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96à§\8b",
        "rc-old-title": "মূলত \"$1\" হিসাবে তৈরী করা হয়েছিল",
        "recentchangeslinked": "সম্পর্কিত পরিবর্তন",
        "recentchangeslinked-feed": "সম্পর্কিত পরিবর্তন",
        "uploadbtn": "ফাইল আপলোড করুন",
        "reuploaddesc": "আপলোড বাতিল করো এবং আপলোড ফর্মে ফেরত যাও।",
        "upload-tryagain": "পরিবর্তিত ফাইল বর্ণনা জমা দিন",
-       "uploadnologin": "à¦\86পনি à¦²à¦\97-à¦\87ন à¦\95রà§\87ননি।",
+       "uploadnologin": "à¦\86পনি à¦ªà§\8dরবà§\87শ à¦\95রà§\87ননি",
        "uploadnologintext": "ফাইল আপলোড করতে হলে আপনাকে অবশ্যই $1 করতে হবে।",
        "upload_directory_missing": "আপলোড ডাইরেক্টরি ($1) পাওয়া যাচ্ছে না এবং ওয়েব সার্ভার কর্তৃক তৈরি করা যাচ্ছে না।",
        "upload_directory_read_only": "আপলোড ডিরেক্টরিটি ($1) ওয়েবসার্ভার কর্তৃক লিখনযোগ্য নয়।",
        "fileexists-shared-forbidden": "অংশীদারী ফাইল ভাণ্ডারে এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান।\nআপনি যদি এখনো ফাইলটি আপলোড করতে চান, তবে অনুগ্রহপূর্বক পেছনে গিয়ে একটি নতুন নামে ফাইলটি আপলোড করুন।[[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "আপলোডটি <strong>[[:$1]]</strong>-এর বর্তমান সংস্করণের হুবহু প্রতিলিপি।",
        "fileexists-duplicate-version": "এই আপলোডটি <strong>[[:$1]]</strong>-এর একটি {{PLURAL:$2|পুরনো সংস্করণের}} হুবহু প্রতিলিপি।",
-       "file-exists-duplicate": "এই ফাইলটি নিচের {{PLURAL:$1|ফাইল|ফাইলগুলির}} অনুলিপি:",
+       "file-exists-duplicate": "এই ফাইলটি নিচের {{PLURAL:$1|ফাইলটির|ফাইলগুলির}} অবিকল প্রতিলিপি:",
        "file-deleted-duplicate": "এই ফাইলটির মত একটি ফাইল ([[:$1]]) পূর্বে অপসারণ করা হয়েছে।\nপুনরায় আপলোড করার পূর্বে আপনার উচিত আগের ফাইলটির অপসারণের কারণ জানা।",
+       "file-deleted-duplicate-notitle": "এই ফাইলটির মত হুবহু একটি ফাইল আগেই মুছে ফেলা হয়েছে, এবং শিরোনামটিও অবলোপন করা হয়েছে। \nএই ফাইলটিকে পুনরায় আপলোড করার আগে এমন কাউকে জিজ্ঞাসা করে নিন যিনি অবলুপ্ত ফাইল উপাত্তগুলি দেখার ক্ষমতা রাখেন বলে এই পরিস্থিতিটি পর্যালোচনা করতে পারেন।",
        "uploadwarning": "আপলোড সতর্কবাণী",
        "uploadwarning-text": "অনুগ্রহ করে নিচে ফাইলের বর্ণনা পরিবর্তন করে আবার চেষ্টা করুন।",
        "savefile": "সংরক্ষণ",
        "uploaddisabledtext": "ফাইল আপলোড নিষ্ক্রিয়।",
        "php-uploaddisabledtext": "পিএইপি -এ ফাইল আপলোড নিস্ক্রিয় রয়েছে।\nঅনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।",
        "uploadscripted": "এই ফাইলে এমন HTML বা স্ক্রিপ্ট কোড আছে যা একটি ওয়েব ব্রাউজার ভুল বুঝতে পারে।",
+       "upload-scripted-pi-callback": "এক্সএমএল-স্টাইলশিট প্রক্রিয়াকরণ নির্দেশনাবিশিষ্ট কোন ফাইল আপলোড করা সম্ভব নয়।",
+       "upload-scripted-dtd": "SVG ফাইল আপলোড করা যাবে না যা অ-মানক DTD ঘোষণা ধারণ করে।",
        "uploaded-script-svg": "আপলোডকৃত SVG ফাইলে স্ক্রিপ্টযোগ্য উপাদান \"$1\" পাওয়া গেছে।",
        "uploaded-hostile-svg": "আপলোড করা SVG ফাইলের শৈলী উপাদানে অনিরাপদ সিএসএস পাওয়া গেছে।",
+       "uploaded-event-handler-on-svg": "এসভিজি ফাইলের জন্য <code>$1=\"$2\"</code> ইভেন্ট-হ্যান্ডলার বৈশিষ্ট্যটি নির্ধারণ করা অনুমোদিত নয়।",
+       "uploaded-href-attribute-svg": "এসভিজি ফাইলের href বৈশিষ্ট্যগুলির জন্য কেবলমাত্র http:// বা https:// লক্ষ্যগুলি অনুমোদিত; কিন্তু <code>&lt;$1 $2=\"$3\"&gt;</code> পাওয়া গেছে।",
        "uploaded-href-unsafe-target-svg": "অনিরাপদ উপাত্তে href পাওয়া গেছে: আপলোডকৃত SVG ফাইলে URI লক্ষ্য ছিল <code>&lt;$1 $2=\"$3\"&gt;</code>।",
+       "uploaded-animate-svg": "\"animate\" ট্যাগটি পাওয়া গেছে যা আপলোডকৃত এসভিজি ফাইলের <code>&lt;$1 $2=\"$3\"&gt;</code> - এই \"from\" অ্যাট্রিবিউটটি ব্যবহার করে href পরিবর্তন করতে পারে।",
+       "uploaded-setting-event-handler-svg": "ইভেন্ট-হ্যান্ডলার অ্যাট্রিবিউট নির্ধারণ করতে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>&lt;$1 $2=\"$3\"&gt;</code> খুঁজে পাওয়া গেছে।",
+       "uploaded-setting-href-svg": "\"set\" ট্যাগটি ব্যবহার করে \"href\" অ্যাট্রিবিউট পিতৃ-উপাদানে যোগ করতে বাধাদান করা হয়েছে।",
+       "uploaded-wrong-setting-svg": "\"set\" ট্যাগটি ব্যবহার করে যেকোন অ্যাট্রিবিউটে কোন রিমোট/ডাটা/স্ক্রিপ্ট লক্ষ্য যোগ করতে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>&lt;set to=\"$1\"&gt;</code> খুঁজে পাওয়া গেছে।",
+       "uploaded-setting-handler-svg": "যে এসভিজি ফাইল রিমোট/ডাটা/স্ক্রিপ্ট দিয়ে \"handler\" অ্যাট্রিবিউটটি নির্ধারণ করে, সেটিকে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>$1=\"$2\"</code> খুঁজে পাওয়া গেছে।",
+       "uploaded-remote-url-svg": "যে এসভিজি ফাইল রিমোট ইউআরএল দিয়ে যেকোন শৈলী অ্যাট্রিবিউটট নির্ধারণ করে, সেটিকে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>$1=\"$2\"</code> খুঁজে পাওয়া গেছে।",
        "uploaded-image-filter-svg": "আপলোডকৃত SVG ফাইলে URL: <code>&lt;$1 $2=\"$3\"&gt;</code> সহ ছবি পরিশোধক পাওয়া গেছে।",
        "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"<nowiki>$1</nowiki>\" রয়েছে",
        "uploadinvalidxml": "আপলোডকৃত ফাইলে XML পার্স করা যাবে না।",
        "destfilename": "লক্ষ্য ফাইলের নাম:",
        "upload-maxfilesize": "ফাইলের সর্বোচ্চ আকার: $1",
        "upload-description": "ফাইলের বর্ণনা",
-       "upload-options": "আপলোড-অপশন",
+       "upload-options": "আপলোডের পছন্দগুলি",
        "watchthisupload": "এই ফাইলটি নজরে রাখুন",
        "filewasdeleted": "এই নামের একটি ফাইল পূর্বে আপলোড করা হয়েছিল এবং তারপর মুছে ফেলা হয়েছিল। আপনি ফাইলটি আবার আপলোড করার আগে $1 পরীক্ষা করে দেখুন।",
+       "filename-thumb-name": "এটিকে একটি ক্ষুদ্র প্রাকপ্রদর্শনকারী চিত্রের (thumbnail) শিরোনাম বলে মনে হচ্ছে। দয়া করে একই উইকিতে ক্ষুদ্র প্রাকপ্রদর্শনকারী চিত্র পুনরায় আপলোড করবেন না। অন্যথায় অনুগ্রহ করে ফাইলের নামটি ঠিক করুন যাতে এটির অর্থ আরও বেশি বোধগম্য হয়, এবং যাতে এটির সাথে কোন ক্ষুদ্র প্রাকপ্রদর্শনকারী চিত্রের উপসর্গ না থাকে।",
        "filename-bad-prefix": "আপনি যে ফাইলটি আপলোড করছেন, তার নাম '''\"$1\"''' দিয়ে শুরু হয়েছে। এ ধরনের নাম সাধারণত ডিজিটাল ক্যামেরাগুলি স্বয়ংক্রিয়ভাবে দিয়ে থাকে এবং এগুলি ব্যাখ্যামূলক নয়। অনুগ্রহ করে আপনার ফাইলের জন্য আরও ব্যাখ্যামূলক একটি নাম পছন্দ করুন।",
        "upload-proto-error": "ভুল প্রোটোকল",
        "upload-proto-error-text": "দূরবর্তী আপলোডের জন্য URLগুলি <code>http://</code> বা <code>ftp://</code> দিয়ে শুরু হওয়া আবশ্যক।",
        "upload-too-many-redirects": "এই ইউআরএলটিতে অনেক বেশি পুনর্নির্দেশনা রয়েছে",
        "upload-http-error": "একটি এইচটিটিপি ত্রুটি দেখা দিয়েছে: $1",
        "upload-copy-upload-invalid-domain": "এই ডোমেইন থেকে আপলোড সম্ভব নয়।",
+       "upload-foreign-cant-upload": "এই উইকি থেকে অনুরোধকৃত বহিঃস্থ ফাইল সংগ্রহশালাতে ফাইল আপলোড করার ক্ষমতা পূর্বসংজ্ঞায়িত নেই।",
+       "upload-foreign-cant-load-config": "বহিঃস্থ ফাইল সংগ্রহশালাতে ফাইল আপলোড করার জন্য পূর্বনির্ধারিত সংজ্ঞাগুলি লোড করা ব্যর্থ হয়েছে।",
        "upload-dialog-disabled": "এই ডায়ালগ ব্যবহার করে ফাইল আপলোড করা এই উইকিতে নিষ্ক্রিয় করা হয়েছে।",
        "upload-dialog-title": "ফাইল আপলোড করুন",
        "upload-dialog-button-cancel": "বাতিল",
        "upload-form-label-infoform-categories": "বিষয়শ্রেণীসমূহ",
        "upload-form-label-infoform-date": "তারিখ",
        "upload-form-label-own-work-message-generic-local": "আমি নিশ্চিত করছি যে আমি {{SITENAME}}-এর পরিষেবা এবং লাইসেন্সকরণ নীতির শর্তাবলী অনুসরণ করে এই ফাইল আপলোড করছি।",
+       "upload-form-label-not-own-work-message-generic-local": "{{SITENAME}}-এর নীতিমালা অনুযায়ী যদি আপনি এই ফাইলটি আপলোড করতে না পারেন, অনুগ্রহ করে এই কথোপকথনটি বন্ধ করুন এবং অন্য একটি পদ্ধতিতে চেষ্টা করুন।",
        "upload-form-label-not-own-work-local-generic-local": "এছাড়াও আপনি [[Special:Upload|ডিফল্ট আপলোডের পাতা]] চেষ্টা করতে পারেন।",
+       "upload-form-label-own-work-message-generic-foreign": "আমি বুঝেছি যে আমি একটি শেয়ারকৃত সংগ্রহশালায় এই ফাইলটি আপলোড করতে যাচ্ছি। আমি নিশ্চিত করছি যে আমি সেখানকার সেবা এবং লাইসেন্সের নীতিমালা মেনে কাজটি করছি।",
+       "upload-form-label-not-own-work-message-generic-foreign": "যদি আপনি শেয়ারকৃত সংগ্রহশালার নীতিমালা মেনে এই ফাইলটি আপলোড করতে না পারেন, তাহলে অনুগ্রহ করে এই কথোপকথনটি বন্ধ করুন এবং অন্য একটি উপায়ে চেষ্টা করুন।",
        "upload-form-label-not-own-work-local-generic-foreign": "এছাড়াও আপনি [[Special:Upload|{{SITENAME}}-এর আপলোডের পাতা]] ব্যবহার করার চেষ্টা করতে পারেন, যদি এই ফাইলটি তাদের নীতিমালা অধীনে সেখানে আপলোড করা যায়।",
        "backend-fail-stream": "\"$1\" ফাইলের স্ট্রিম দেখানো যাচ্ছে না।",
        "backend-fail-backup": "\"$1\" ফাইলের ব্যাকআপ তৈরী সম্ভব নয়।",
        "backend-fail-describe": "\"$1\" ফাইলের মেটাডাটা পরিবর্তন সম্ভব নয়।",
        "backend-fail-alreadyexists": "\"$1\" নামের একটি ফাইল আগে থেকেই রয়েছে।",
        "backend-fail-store": "\"$2\"-এ \"$1\" ফাইলটি সংরক্ষন করা সম্ভব নয়।",
-       "backend-fail-copy": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি \"$2\"-তà§\87 à¦\85নà§\81লিপি করা সম্ভব নয়।",
+       "backend-fail-copy": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি \"$2\"-à¦\8f à¦ªà§\8dরতিলিপি করা সম্ভব নয়।",
        "backend-fail-move": "\"$2\"-এ \"$1\" ফাইলটি স্থানান্তর করা সম্ভব নয়।",
        "backend-fail-opentemp": "অস্থায়ী ফাইলটি খোলা যাবে না।",
        "backend-fail-writetemp": "অস্থায়ী ফাইলটিতে লেখা যাচ্ছে না।",
        "backend-fail-usable": "\"$1\" ফাইলটিতে লেখা অথবা ফাইলটি পড়া যাচ্ছে না, কারণ সঠিক অনুমতি নেই অথবা ডিরেক্টরীটি নেই।",
        "filejournal-fail-dbconnect": "\"$1\" স্টোরেজ ব্যাকেন্ডের জার্নাল ডাটাবেজের সাথে যুক্ত হওয়া যাচ্ছে না।",
        "filejournal-fail-dbquery": "\"$1\" স্টোরেজ ব্যাকেন্ডের জার্নাল ডাটাবেজ হালনাগাদ করা যাচ্ছে না।",
-       "lockmanager-notlocked": "\"$1\" à¦\86নলà¦\95 à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾; à¦\8fà¦\9fি à¦²à¦\95 à¦\95রা à¦°à¦¯à¦¼à§\87à¦\9bà§\87।",
+       "lockmanager-notlocked": "\"$1\" à¦\96à§\8bলা à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿; à¦\8fà¦\9fিà¦\95à§\87 à¦\85বরà§\81দà§\8dধ à¦\95রা à¦¹à¦¯à¦¼à¦¨à¦¿।",
        "lockmanager-fail-closelock": "\"$1\" ফাইলটি লক করা তাই বন্ধ করা যাচ্ছে না।",
-       "lockmanager-fail-deletelock": "\"$1\" à¦²à¦\95 à¦\95রা ফাইলটি অপসারণ সম্ভব নয়।",
+       "lockmanager-fail-deletelock": "\"$1\" à¦\85বরà§\8bধনিরà§\8dদà§\87শà¦\95 ফাইলটি অপসারণ সম্ভব নয়।",
        "lockmanager-fail-acquirelock": "\"$1\" লক করা ফাইল খুজে পাওয়া যাচ্ছে না।",
-       "lockmanager-fail-openlock": "\"$1\" à¦²à¦\95 à¦\95রা ফাইলটি খোলা সম্ভব নয়।",
+       "lockmanager-fail-openlock": "\"$1\" à¦\8fà¦\87 à¦\85বরà§\8bধনিরà§\8dদà§\87শà¦\95 ফাইলটি খোলা সম্ভব নয়।",
        "lockmanager-fail-releaselock": "\"$1\" লক করা ফাইলটি ছাড়া যাচ্ছে না।",
-       "lockmanager-fail-db-bucket": "$1 à¦\8fর à¦²à¦\95 à¦\95রা ডাটাবেজের সাথে যোগাযোগ করা যাচ্ছে না।",
+       "lockmanager-fail-db-bucket": "$1 à¦¬à¦¾à¦\95à§\87à¦\9fà¦\9fিতà§\87 à¦¯à¦¥à§\87ষà§\8dà¦\9f à¦¸à¦\82à¦\96à§\8dযà¦\95 à¦\85বরà§\8bধ ডাটাবেজের সাথে যোগাযোগ করা যাচ্ছে না।",
        "lockmanager-fail-db-release": "$1 ডাটাবেজের লক খোলা যাচ্ছে না।",
-       "lockmanager-fail-svr-acquire": "$1 সার্ভারের লক পাওয়া যাচ্ছে না।",
+       "lockmanager-fail-svr-acquire": "$1 সার্ভারে অবরোধগুলি পাওয়া যায়নি।",
        "lockmanager-fail-svr-release": "$1 ডাটাবেজের লক খোলা যাচ্ছে না।",
        "zip-file-open-error": "ফাইলটির জিপ পরীক্ষা করার সময় একটি ত্রুটি দেখা দিয়েছে।",
        "zip-wrong-format": "চিহ্নিত ফাইলটি কোনো জিপ ফাইল নয়।",
        "license": "লাইসেন্সকরণ:",
        "license-header": "লাইসেন্স প্রদান",
        "nolicense": "কিছুই নির্বাচন করা হয়নি",
-       "licenses-edit": "লাইসেন্স অপশন সম্পাদনা করুন",
+       "licenses-edit": "লাইসেন্স-সংক্রান্ত পছন্দগুলি সম্পাদনা করুন",
        "license-nopreview": "(প্রাকদর্শন লভ্য নয়)",
        "upload_source_url": " (আপনি একটি বৈধ, উন্মুক্ত URL থেকে ফাইল চয়ন করেছেন)",
        "upload_source_file": "(আপনার কম্পিউটারের একটি ফাইল)",
        "duplicatesoffile": "নিচের {{PLURAL:$1|ফাইলটি|$1 ফাইলগুলো}} এই ফাইলের প্রতিলিপি ([[Special:FileDuplicateSearch/$2|বিস্তারিত দেখুন]]):",
        "sharedupload": "এই ফাইলটি $1 থেকে নেওয়া হয়েছে এবং এবং অন্যান্য প্রকল্পেও ব্যবহৃত হতে পারে।",
        "sharedupload-desc-there": "এই ফাইলটি $1 থেকে দেখানো হচ্ছে এবং হয়তো এটি অন্যান্য প্রকল্পতেও ব্যবহৃত হয়েছে।\nঅনুগ্রহ করে বিস্তারিত জানার জন্য [$2 ফাইলটির বর্ণনা পাতা] দেখুন।",
-       "sharedupload-desc-here": "à¦\8fà¦\87 à¦«à¦¾à¦\87লà¦\9fি $1 à¦¥à§\87à¦\95à§\87 à¦\8fবà¦\82 à¦\85নà§\8dযানà§\8dয à¦ªà§\8dরà¦\95লà§\8dপà§\87 à¦¬à§\8dযবহà§\83ত à¦¹à¦¤à§\87 à¦ªà¦¾à¦°à§\87।\nà¦\8fর [$2 à¦«à¦¾à¦\87ল à¦¬à¦¿à¦¬à¦°à¦£ à¦ªà§\83ষà§\8dঠা] à¦\89পর à¦¬à¦°à§\8dণনা à¦¨à¦¿à¦®à§\8dনে দেখানো হলো।",
+       "sharedupload-desc-here": "à¦\8fà¦\87 à¦«à¦¾à¦\87লà¦\9fি $1 à¦¥à§\87à¦\95à§\87 à¦\86à¦\97ত à¦\8fবà¦\82 à¦\85নà§\8dযানà§\8dয à¦ªà§\8dরà¦\95লà§\8dপà§\87 à¦¬à§\8dযবহà§\83ত à¦¹à¦¤à§\87 à¦ªà¦¾à¦°à§\87।\nসà§\87à¦\96ানà§\87 à¦¥à¦¾à¦\95া [$2 à¦«à¦¾à¦\87লà¦\9fির à¦¬à¦¿à¦¬à¦°à¦£ à¦ªà¦¾à¦¤à¦¾à¦°] à¦¬à¦¿à¦¬à¦°à¦£ à¦¨à¦¿à¦\9aে দেখানো হলো।",
        "sharedupload-desc-edit": "এই ফাইলটি $1 থেকে এবং অন্যান্য প্রকল্পে ব্যবহৃত হতে পারে।\n[$2 ফাইলটির বর্ণনা পাতা] থেকে আপনি ফাইলটি বর্ণনা সম্পাদনা করতে পারেন।",
-       "sharedupload-desc-create": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
+       "sharedupload-desc-create": "এই ফাইলটি $1 থেকে আগত এবং অন্যান্য প্রকল্পে ব্যবহৃত হতে পারে।\nআপনি সেখানে [$2 ফাইলটির বর্ণনা পাতায়] বর্ণনা সম্পাদনা করতে পারেন।",
        "filepage-nofile": "এই নামের কোন ফাইল নেই।",
        "filepage-nofile-link": "এই নামে কোনো ফাইল নেই, কিন্তু আপনি এটি [$1 আপলোড করতে পারেন]।",
        "uploadnewversion-linktext": "এই ফাইলটির একটি নতুন সংস্করণ আপলোড করুন",
        "shared-repo-from": "$1 থেকে",
        "shared-repo": "শেয়ার্ড রিপোজিটরী",
        "shared-repo-name-wikimediacommons": "উইকিমিডিয়া কমন্স",
+       "filepage.css": "/* এখানে সন্নিবেশিত সিএসএস ফাইলের বিবরণ পৃষ্ঠায় অন্তর্ভুক্ত হবে, এছাড়া বিদেশী ক্লায়েন্ট উইকিতেও অন্তর্ভুক্ত হবে */",
        "upload-disallowed-here": "আপনি এই ফাইলটি প্রতিস্থাপন করতে পারবেন না।",
        "filerevert": "$1 পূর্বাবস্থায় ফেরত নিন",
        "filerevert-legend": "ফাইল পূর্বাবস্থায় ফেরত নিন",
        "filerevert-submit": "ফেরত যাওয়া হোক",
        "filerevert-success": "'''[[Media:$1|$1]]''' ফাইলটি  [$3, $2-এর $4 সংস্করণে] ফেরত নেওয়া হয়েছে।",
        "filerevert-badversion": "প্রদত্ত তারিখ ও সময়ের জন্য এই ফাইলটির কোন স্থানীয় সংস্করণ নেই।",
-       "filedelete": "$1 মুছে ফেলা হোক",
-       "filedelete-legend": "ফাইল মুছে ফেলা হোক",
+       "filerevert-identical": "ফাইলটির বর্তমান সংস্করণের সাথে নির্বাচিত সংস্করণটির হুবহু মিল রয়েছে।",
+       "filedelete": "$1 অপসারণ করুন",
+       "filedelete-legend": "ফাইল অপসারণ করুন",
        "filedelete-intro": "আপনি '''[[Media:$1|$1]]''' ফাইলটি এর সমস্ত ইতিহাসহ অপসারণ করছেন।",
        "filedelete-intro-old": "আপনি '''[[Media:$1|$1]]''' ফাইলটির [$4 $3, $2] সংস্করণটি মুছে ফেলছেন।",
        "filedelete-comment": "কারণ:",
        "filedelete-nofile-old": "নির্দেশিত বৈশিষ্ট্যগুলির জন্য '''$1'''-এর কোন আর্কাইভ সংস্করণ নেই।",
        "filedelete-otherreason": "অন্য/বাড়তি কারণ:",
        "filedelete-reason-otherlist": "অন্য কারণ",
-       "filedelete-reason-dropdown": "*সাধারণ à¦\85পসারণà§\87র à¦\95ারণসমà§\82হ\n** à¦\95পিরাà¦\87à¦\9f à¦²à¦\99à§\8dà¦\98ন\n** à¦«à¦¾à¦\87লà§\87র à¦\85নà§\81লিপি",
+       "filedelete-reason-dropdown": "*à¦\85পসারণà§\87র à¦¸à¦¾à¦§à¦¾à¦°à¦£ à¦\95ারণসমà§\82হ\n** à¦\95পিরাà¦\87à¦\9f à¦²à¦\99à§\8dà¦\98ন\n** à¦\85বিà¦\95ল à¦ªà§\8dরতিলিপিà¦\95à§\83ত à¦«à¦¾à¦\87ল",
        "filedelete-edit-reasonlist": "অপসারণের কারণ সম্পাদনা",
        "filedelete-maintenance": "রক্ষণাবেক্ষণের সময় ফাইল অপরাসণ এবং পুনরুদ্ধার সাময়িকভাবে নিস্ক্রিয় রয়েছে।",
        "filedelete-maintenance-title": "ফাইলটি অপসারণ করা সম্ভব নয়",
        "statistics-users": "নিবন্ধিত [[Special:ListUsers|ব্যবহারকারী]]",
        "statistics-users-active": "সক্রিয় ব্যবহারকারী",
        "statistics-users-active-desc": "ব্যবহারকারী যারা বিগত {{PLURAL:$1|দিনে|$1 দিনে}} একটি কাজ করেছেন।",
-       "pageswithprop": "পাতার à¦\89পাদান à¦¸à¦®à§\8dবলিত à¦ªà§\83ষà§\8dঠাসমূহ",
+       "pageswithprop": "পাতার à¦¬à§\88শিষà§\8dà¦\9fà§\8dয à¦¸à¦®à§\8dবলিত à¦ªà¦¾à¦¤াসমূহ",
        "pageswithprop-legend": "পাতার উপাদান সম্বলিত পৃষ্ঠাসমূহ",
        "pageswithprop-text": "একটি নির্দিষ্ট পাতার বৈশিষ্ট রয়েছে এমন পাতাসমূহের তালিকা।",
        "pageswithprop-prop": "বৈশিষ্টের নাম:",
        "uncategorizedcategories": "যেসব বিষয়শ্রেণীর শ্রেণীকরণ প্রয়োজন",
        "uncategorizedimages": "যেসব ফাইলের শ্রেণীকরণ প্রয়োজন",
        "uncategorizedtemplates": "যেসব টেমপ্লেটের বিষয়শ্রেণী নেই",
+       "uncategorized-categories-exceptionlist": "# এখানে এমন কিছু বিষয়শ্রেণীর একটি তালিকা থাকবে, যেগুলি Special:UncategorizedCategories পাতায় উল্লেখ করা উচিত নয়। প্রতি লাইনে একটি করে থাকবে, প্রতিটি লাইন \"*\" অক্ষর দিয়ে শুরু করতে হবে। যেসব লাইন অন্য কোন অক্ষর (এমনকি ফাঁকা স্থান-ও) দিয়ে শুরু হলে সেটিকে অগ্রাহ্য করা হবে। মন্তব্যের জন্য \"#\" ব্যবহার করুন।",
        "unusedcategories": "অব্যবহৃত বিষয়শ্রেণীসমূহ",
        "unusedimages": "অব্যবহৃত ফাইলসমূহ",
        "wantedcategories": "বাঞ্ছনীয় বিষয়শ্রেণীগুলি",
        "wantedpages": "বাঞ্ছনীয় পাতাগুলি",
+       "wantedpages-summary": "অন্য পাতাগুলি থেকে সবচেয়ে বেশি সংযোগ দেওয়া কিন্তু অবর্তমান পাতাগুলির তালিকা। যেসব অবর্তমান পাতাতে কেবলমাত্র পুনর্নির্দেশ থেকে সংযোগ দেওয়া আছে, সেগুলি এই তালিকাতে অন্তর্ভুক্ত নয়। যেসব অবর্তমান পাতাতে পুনর্নির্দেশগুলি থেকে সংযোগ দেওয়া আছে, সেগুলির তালিকার জন্য [[{{#special:BrokenRedirects}}|অকার্যকর পুনর্নির্দেশনাগুলির তালিকা]] দেখুন।",
        "wantedpages-badtitle": "ফলাফলে ভুল শিরনাম: $1",
        "wantedfiles": "আবশ্যিক ফাইলসমূহ",
        "wantedfiletext-cat": "নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের কোন ফাইল খুজে পেলে <del>অপসারণ করুন</del>। এছাড়া অপসারিত হয়েছে এমন ছবির সংযোগ রয়েছে এমন পাতাসমূহের লিংক পাওয়া যাবে এখানে [[:$1]]।",
+       "wantedfiletext-cat-noforeign": "নিম্নোক্ত ফাইলগুলি ব্যবহৃত হচ্ছে কিন্তু এগুলির অস্তিত্ব নেই। এছাড়া, যেসব পাতাতে অস্তিত্বহীন ফাইল গ্রথিত আছে, সেগুলির তালিকা [[:$1]]-এ পাওয়া যাবে।",
        "wantedfiletext-nocat": "নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের ভূলগুলো শিঘ্রই <del>অপসারিত হবে</del>।",
        "wantedfiletext-nocat-noforeign": "নিম্নলিখিত ফাইলসমূহ ব্যবহৃত হয়েছে কিন্তু এর অস্তিত্ব নেই।",
        "wantedtemplates": "আবশ্যিক টেমপ্লেটসমূহ",
        "prefixindex": "উপসর্গ সহ সমস্ত পাতা",
        "prefixindex-namespace": "উপসর্গ সহ সকল পাতা ($1 নামস্থান)",
        "prefixindex-submit": "দেখাও",
-       "prefixindex-strip": "তালিà¦\95া à¦¥à§\87à¦\95à§\87 à¦ªà§\8dরিফিà¦\95à§\8dস à¦¸à¦°à¦¾à¦\93",
+       "prefixindex-strip": "তালিà¦\95া à¦¥à§\87à¦\95à§\87 à¦\89পসরà§\8dà¦\97 à¦²à§\81à¦\95ান",
        "shortpages": "সংক্ষিপ্ত পাতাসমূহ",
        "longpages": "দীর্ঘ পাতাসমূহ",
        "deadendpages": "যেসব পাতা থেকে কোনো সংযোগ নেই",
        "protectedpages-indef": "শুধুমাত্র অসীম সুরক্ষা",
        "protectedpages-summary": "এই পাতাটি বর্তমানে সুরক্ষিত থাকা বিদ্যমান পাতগুলির তালিকা। সৃষ্টি করা থেকে সুরক্ষিত রয়েছে এমন পাতার তালিকার জন্য, [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] দেখুন।",
        "protectedpages-cascade": "শুধুমাত্র প্রপাতাকার সুরক্ষা",
-       "protectedpages-noredirect": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95াà¦\93",
+       "protectedpages-noredirect": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95ান",
        "protectedpagesempty": "কোন পাতা বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।",
        "protectedpages-timestamp": "সময়বার্তা",
        "protectedpages-page": "পাতা",
        "apisandbox": "এপিআই খেলাঘর",
        "apisandbox-jsonly": "API খেলাঘর ব্যবহার করতে জাভাস্ক্রিপ্ট প্রয়োজন।",
        "apisandbox-api-disabled": "এপিআই এই সাইটে নিষ্ক্রিয় করা আছে।",
+       "apisandbox-intro": "<strong>মিডিয়াউইকি ওয়েব সেবা এপিআই</strong> নিয়ে পরীক্ষানিরীক্ষা চালাতে এই পাতাটি ব্যবহার করুন। \nএপিআই ব্যবহারের উপর বিস্তারিত জানতে [[mw:API:Main page|এপিআই নথিপত্র]] দেখুন।\nউদাহরণ: [https://www.mediawiki.org/wiki/API#A_simple_example প্রধান পাতার বিষয়বস্তু পান]। আরও উদাহরণ দেখার জন্য একটি কর্ম নির্বাচন করুন।\n\nলক্ষ করুন যে যদিও এটি একটি খেলাঘর, তা সত্ত্বেও এই পাতায় করা আপনার সম্পাদনাগুলি উইকিতে পরিবর্তন সাধন করতে পারে।",
        "apisandbox-fullscreen": "প্যানেল সম্প্রসারণ করুন",
        "apisandbox-fullscreen-tooltip": "ব্রাউজারের উইন্ডো পূরণ করতে খেলাঘরের প্যানেল প্রসারিত করুন।",
        "apisandbox-unfullscreen": "পাতা দেখাও",
        "apisandbox-unfullscreen-tooltip": "খেলাঘরের প্যানেল হ্রাস করুন, তাহলে মিডিয়াউইকি পরিভ্রমণ করার সংযোগগুলি পাওয়া যাবে।",
-       "apisandbox-submit": "à¦\85নà§\81রà§\8bধ à¦°à¦¾à¦\96ুন",
-       "apisandbox-reset": "পরিস্কার",
+       "apisandbox-submit": "à¦\85নà§\81রà§\8bধ à¦\95রুন",
+       "apisandbox-reset": "পরিষ্কার",
        "apisandbox-retry": "পুনঃচেষ্টা করুন",
        "apisandbox-loading": "\"$1\" এপিআই মডিউলের জন্য তথ্য লোড হচ্ছে...",
        "apisandbox-load-error": "\"$1\" এপিআই মডিউলের জন্য তথ্য লোড করার সময় একটি ত্রুটি ঘটেছে: $2",
        "apisandbox-alert-page": "এই পাতার ঘরগুলো বৈধ নয়।",
        "apisandbox-alert-field": "এই ক্ষেত্রের মান বৈধ নয়।",
        "apisandbox-continue": "অব্যাহত",
-       "apisandbox-continue-clear": "পরিস্কার",
+       "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": "বà¦\87য়à§\87র à¦\89à§\8eসà§\87র à¦\9cনà§\8dয à¦\85নà§\81সনà§\8dধান à¦\95রা à¦¹à§\8bà¦\95",
+       "booksources-search-legend": "বà¦\87য়à§\87র à¦\89à§\8eসà§\87র à¦\9cনà§\8dয à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন",
        "booksources-isbn": "আইএসবিএন:",
        "booksources-search": "অনুসন্ধান",
        "booksources-text": "নতুন ও পুরাতন ব্যবহৃত বই বিক্রি করে, এমন কতগুলি সাইটের সংযোগের তালিকা নিচে দেওয়া হল, যে সাইটগুলিতে আপনার অনুসন্ধানকৃত বইগুলির উপর আরও তথ্য থাকতে পারে:",
        "magiclink-tracking-isbn": "আইএসবিএন জাদু সংযোগ ব্যবহার করা পাতা",
        "magiclink-tracking-isbn-desc": "এই পাতাটি আইএসবিএন যাদু সংযোগ ব্যবহার করে। কিভাবে মাইগ্রেট করবেন জানতে [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] দেখুন।",
        "specialloguserlabel": "সম্পাদক:",
-       "speciallogtitlelabel": "লà¦\95à§\8dষà§\8dয (শিরà§\8bনাম à¦¬à¦¾ {{ns:user}}:বà§\8dযবহারà¦\95ারà§\80র à¦\9cনà§\8dয ব্যবহারকারী নাম):",
+       "speciallogtitlelabel": "লà¦\95à§\8dষà§\8dয (বà§\8dযবহারà¦\95ারà§\80র à¦\9cনà§\8dয à¦¶à¦¿à¦°à§\8bনাম à¦¬à¦¾ {{ns:user}}:ব্যবহারকারী নাম):",
        "log": "লগগুলি",
        "logeventslist-submit": "দেখাও",
        "all-logs-page": "সব প্রকাশ্য লগ",
        "allpagesprefix": "এই উপসর্গবিশিষ্ট পাতাগুলো দেখাও:",
        "allpagesbadtitle": "প্রদত্ত পাতার শিরোনামটি অবৈধ ছিল অথবা এটিতে কোন আন্তঃভাষা বা আন্তঃউইকি উপসর্গ ছিল। এটিতে এক বা একাধিক ক্যারেক্টার থাকতে পারে যা শিরোনামে ব্যবহার করা সম্ভব নয়।",
        "allpages-bad-ns": "{{SITENAME}}-এ \"$1\" নামের কোন নামস্থান নেই।",
-       "allpages-hide-redirects": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95াà¦\93",
+       "allpages-hide-redirects": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95ান",
        "cachedspecial-viewing-cached-ttl": "আপনি এই পৃষ্ঠায় একটি ক্যাশে সংস্করণ দেখছেন, যা $1 দিনের পুরানো হতে পারে।",
        "cachedspecial-viewing-cached-ts": "আপনি এই পৃষ্ঠায় একটি ক্যাশে সংস্করণ দেখছেন, যা সম্পূর্ণরূপে হালনাগাদকৃত নাও হতে পারে।",
        "cachedspecial-refresh-now": "সাম্প্রতিকগুলো প্রদর্শন করো।",
        "listusersfrom": "সেই সব ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:",
        "listusers-submit": "দেখাও",
        "listusers-noresult": "কোন ব্যবহারকারী খুঁজে পাওয়া যায়নি।",
-       "listusers-blocked": "(বà§\8dলà¦\95à¦\95à§\83ত)",
+       "listusers-blocked": "(বাধাপà§\8dরাপà§\8dত)",
        "activeusers": "সক্রিয় ব্যবহারকারী তালিকা",
        "activeusers-intro": "এটি ব্যবহারকারী তালিকা যাদের $1 {{PLURAL:$1|দিনে|দিনে}} যেকোন কর্মকান্ড রয়েছে।",
        "activeusers-count": "গত {{PLURAL:$3|কালে|$3 দিনে}} সর্বমোট {{PLURAL:$1|কর্মের}} সংখ্যা $1টি",
        "activeusers-excludegroups": "এই দলভুক্ত ব্যবহারকারী বাদ দিন:",
        "activeusers-noresult": "কোনো ব্যবহারকারী পাওয়া যায়নি।",
        "activeusers-submit": "সক্রিয় ব্যবহারকারী প্রদর্শন করুন",
-       "listgrouprights": "দলà¦\97ত à¦¬à§\8dযবহারà¦\95ারà§\80 অধিকার",
-       "listgrouprights-summary": "à¦\8fà¦\87 à¦\89à¦\87à¦\95ির à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦\8fà¦\95à¦\9fি à¦\97à§\8dরà§\81পà¦\97à§\81লà§\8bর à¦¤à¦¾à¦²à¦¿à¦\95া à¦¦à§\87à¦\96ানà§\8b à¦¹à¦\9aà§\8dà¦\9bà§\87, à¦¸à¦¾à¦¥à§\87 à¦\97à§\8dরà§\81পà§\87র à¦\95ারà§\8dযপরিধিà¦\93 à¦\89লà§\8dলà§\87à¦\96 à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nনিরà§\8dদিষà§\8dà¦\9f à¦\97à§\8dরà§\81পà§\87র à¦\95ারà§\8dযপরিধি à¦¸à¦®à§\8dপরà§\8dà¦\95à§\87 à¦\9cানতà§\87 [[{{MediaWiki:Listgrouprights-helppage}}|à¦\85তিরিà¦\95à§\8dত à¦¤à¦¥à§\8dয]] à¦¦à§\87à¦\96à§\81ন।",
-       "listgrouprights-key": "লিà¦\9cà§\87নà§\8dড:\n* <span class=\"listgrouprights-granted\">à¦\85নà§\81মà§\8bদিত à¦\85ধিà¦\95ার</span>\n* <span class=\"listgrouprights-revoked\">বাধাপà§\8dরাপà§\8dত অধিকার</span>",
+       "listgrouprights": "বà§\8dযবহারà¦\95ারà§\80র à¦¦à¦²à¦\97ত অধিকার",
+       "listgrouprights-summary": "à¦\8fà¦\87 à¦\89à¦\87à¦\95িতà§\87 à¦¸à¦\82à¦\9cà§\8dà¦\9eায়িত à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¦à¦²à¦\97à§\81লির à¦\8fà¦\95à¦\9fি à¦¤à¦¾à¦²à¦¿à¦\95া à¦¨à¦¿à¦\9aà§\87 à¦¦à§\87à¦\96ানà§\8b à¦¹à¦\9aà§\8dà¦\9bà§\87, à¦¸à¦¾à¦¥à§\87 à¦¦à¦²à§\87র à¦¸à¦¾à¦¥à§\87 à¦¸à¦\82শà§\8dলিষà§\8dà¦\9f à¦\85ধিà¦\95ারসমà§\82হà¦\93 à¦\89লà§\8dলà§\87à¦\96 à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nনিরà§\8dদিষà§\8dà¦\9f à¦¬à§\8dযà¦\95à§\8dতির à¦\85ধিà¦\95ারà¦\97à§\81লি à¦¸à¦®à§\8dপরà§\8dà¦\95à§\87 [[{{MediaWiki:Listgrouprights-helppage}}|à¦\85তিরিà¦\95à§\8dত à¦¤à¦¥à§\8dয]] à¦¥à¦¾à¦\95তà§\87 à¦ªà¦¾à¦°à§\87।",
+       "listgrouprights-key": "বà§\8dযাà¦\96à§\8dযা:\n* <span class=\"listgrouprights-granted\">à¦\85নà§\81মà§\8bদিত à¦\85ধিà¦\95ার</span>\n* <span class=\"listgrouprights-revoked\">পà§\8dরতà§\8dযাহারà¦\95à§\83ত অধিকার</span>",
        "listgrouprights-group": "দল",
        "listgrouprights-rights": "অধিকারসমূহ",
        "listgrouprights-helppage": "Help:দলের অধিকার",
        "listgrouprights-removegroup-self-all": "নিজের অ্যাকাউন্ট থেকে সকল দল অপসারণ",
        "listgrouprights-namespaceprotection-header": "নামস্থান নিষেধাজ্ঞাসমূহ",
        "listgrouprights-namespaceprotection-namespace": "নামস্থান",
-       "listgrouprights-namespaceprotection-restrictedto": "à¦\85ধিà¦\95ার à¦¯à¦¾ à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 সম্পাদনা করার অনুমতি দেয়",
+       "listgrouprights-namespaceprotection-restrictedto": "à¦\8fà¦\87 à¦\85ধিà¦\95ারà¦\9fি à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¯à¦¾ সম্পাদনা করার অনুমতি দেয়",
        "listgrants": "কার্যভার",
        "listgrants-summary": "নিম্নে ব্যবহারকারী অধিকারের সাথে যুক্ত প্রবেশাধিকারসহ তাদের কার্যভারের একটি তালিকা দেয়া হয়েছে। ব্যবহারকারীরা তাদের অ্যাকাউন্ট ব্যবহার করতে অ্যাপ্লিকেশনকে অনুমোদন দিতে পারে, কিন্তু কার্যভারের উপর ভিত্তি করে সীমিত অনুমতি ব্যবহারকারীরা অ্যাপ্লিকেশনকে দিতে পারবেন। মূলত, একটি অ্যাপ্লিকেশন একজন ব্যবহারকারীর দেয়া অধিকারের অতিরিক্ত অধিকার ব্যবহার করতে পারবে না। পৃথক অধিকার সম্পর্কে [[{{MediaWiki:Listgrouprights-helppage}}|অতিরিক্ত তথ্য]] দেখুন।",
        "listgrants-grant": "কার্যভার",
        "listgrants-rights": "অধিকারসমূহ",
        "trackingcategories": "বিষয়শ্রেণীসমূহ অনুসরণ করা হচ্ছে",
+       "trackingcategories-summary": "এই পাতাতে মিডিয়াউইকি সফটওয়্যার দ্বারা স্বয়ংক্রিয়ভাবে সৃষ্ট অনুসরণকারী বিষয়শ্রেণীগুলির তালিকা আছে। সংশ্লিষ্ট সিস্টেম বার্তাগুলিকে {{ns:8}} নামস্থানে পরিবর্তন করে এগুলির নাম পরিবর্তন করা যাবে।",
        "trackingcategories-msg": "বিষয়শ্রেণী অনুসরণ করা হচ্ছে",
        "trackingcategories-name": "বার্তা নাম",
        "trackingcategories-desc": "বিষয়শ্রেণী অন্তর্ভুক্তির মানদণ্ড",
        "restricted-displaytitle-ignored": "উপেক্ষিত প্রদর্শন শিরোনামসহ পাতা",
        "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>-এর চেয়ে বেশি হয়ে যায়, তাই কিছু টেমপ্লেট প্রসারিত করা হয়নি।",
+       "post-expand-template-argument-category-desc": "একটি টেমপ্লেট আর্গুমেন্ট সম্প্রসারণ করার পর (<code>{{{Foo}}}</code> এরকম করে তিনটি দ্বিতীয় বন্ধনীতে আবদ্ধ কোনওকিছু) পাতাটি <code>$wgMaxArticleSize</code>-এর চেয়ে বেশি বড় হয়ে গেছে।",
+       "expensive-parserfunction-category-desc": "পাতাটি অতিরিক্ত সংখ্যক ব্যয়বহুল পার্সার ফাংশন (<code>#ifexist</code>-এর মত) ব্যবহার করছে। [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] দেখুন।",
        "broken-file-category-desc": "এই পাতায় একটি ভাঙ্গা ফাইলের লিঙ্ক রয়েছে (একটি ফাইল এম্বেড করার জন্য একটি লিঙ্ক যখন ফাইলটির অস্তিত্ব নেই)",
        "hidden-category-category-desc": "এই বিষয়শ্রেণীটির পাতার বিষয়বস্তুর মধ্যে <code><nowiki>__HIDDENCAT__</nowiki></code> উপস্থিত রয়েছে, যা পূর্ব-নির্ধারিতভাবে পাতার বিষয়শ্রেণীর সংযোগে দেখায় না।",
        "trackingcategories-nodesc": "কোন বর্ণনা নেই।",
        "emailsubject": "বিষয়:",
        "emailmessage": "বার্তা:",
        "emailsend": "প্রেরণ করো",
-       "emailccme": "à¦\86মার à¦¬à¦¾à¦°à§\8dতার à¦\8fà¦\95à¦\9fি à¦\85নà§\81লিপি à¦\86মাà¦\95à§\87 à¦\87-মেইল করা হোক।",
-       "emailccsubject": "আপনার বার্তার অনুলিপি $1-কে: $2",
+       "emailccme": "à¦\86মার à¦¬à¦¾à¦°à§\8dতার à¦\8fà¦\95à¦\9fি à¦ªà§\8dরতিলিপি à¦\86মাà¦\95à§\87 à¦\87মেইল করা হোক।",
+       "emailccsubject": "$1-কে আপনার বার্তার প্রতিলিপি: $2",
        "emailsent": "ই-মেইল প্রেরণ করা হয়েছে",
        "emailsenttext": "আপনার ই-মেইল বার্তা প্রেরণ করা হয়েছে।",
        "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailuser}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে {{GENDER:$2|$2}}-এর নিকট {{GENDER:$1|পাঠানো হয়েছে}}। যদি {{GENDER:$2|আপনি}} এই ইমেইলটির উত্তর দেন, তাহলে {{GENDER:$2|আপনার}} উত্তরের ইমেইলটি সরাসরি {{GENDER:$1|মূল প্রেরকের}} কাছে পাঠানো হবে, সেই সাথে {{GENDER:$2|আপনার}} ইমেল ঠিকানা {{GENDER:$1|তাঁর}} কাছে প্রকাশ করা হবে।",
        "wlheader-showupdated": "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
        "wlnote": "নিচে $3, $4 তারিখ থেকে বিগত {{PLURAL:$2|১ ঘন্টায়|<strong>$2</strong> ঘন্টায়}} সংঘটিত {{PLURAL:$1|শেষ ১টি পরিবর্তন|শেষ <strong>$1টি</strong> পরিবর্তন}} দেখানো হল।",
        "wlshowlast": "সর্বশেষ $1 ঘণ্টা $2 দিনে দেখাও",
-       "watchlist-hide": "à¦\86ড়াল à¦\95রà§\8b",
+       "watchlist-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
        "watchlist-submit": "দেখাও",
        "wlshowtime": "প্রদর্শনের সময় কাল:",
        "wlshowhideminor": "অনুল্লেখ্য সম্পাদনা",
        "wlshowhidepatr": "পরীক্ষিত সম্পাদনা",
        "wlshowhidemine": "আমার সম্পাদনা",
        "wlshowhidecategorization": "পাতা শ্রেণীবদ্ধকরণ",
-       "watchlist-options": "নজর তালিকা পছন্দসমূহ",
+       "watchlist-options": "নজর তালিকার পছন্দগুলি",
        "watching": "নজর রাখা হচ্ছে...",
        "unwatching": "নজর তুলে নেওয়া হচ্ছে...",
        "watcherrortext": "\"$1\" এর নজরতালিকা পরিবর্তনের সময় একটি ত্রুটি হয়েছে।",
        "enotif_body_intro_moved": "{{SITENAME}} এর $1 পাতাটি {{gender:$2|$2}} $PAGEEDITDATE তারিখে স্থানান্তর করেছেন, বর্তমান সংস্করণ দেখুন এখানে $3।",
        "enotif_body_intro_restored": "{{SITENAME}} এর $1 পাতাটি {{gender:$2|$2}} $PAGEEDITDATE আগের অবস্থায় ফিরিয়ে এনেছেন, বর্তমান সংস্করণ দেখুন এখানে $3।",
        "enotif_body_intro_changed": "{{SITENAME}} এর $1 পাতাটি $PAGEEDITDATE তারিখে $2 কর্তৃক {{GENDER:$2|পরিবর্তিত}} হয়েছে, বর্তমান সংস্করণের দেখুন $3।",
-       "enotif_lastvisited": "আপনার শেষ আগমনের পরে সংঘটিত সমস্ত পরিবর্তনের জন্য $1 দেখুন।",
-       "enotif_lastdiff": "এই পরিবর্তনটি দেখার জন্য $1 দেখুন।",
+       "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",
        "created": "তৈরী হয়েছিল",
        "rollback-missingparam": "অনুরোধে প্রয়োজনীয় প্যারামিটারগুলি অনুপস্থিত।",
        "rollback-missingrevision": "সংশোধনের উপাত্ত লোড করতে অক্ষম।",
        "cantrollback": "পূর্বের সংস্করণে ফেরত যাওয়া সম্ভব হল না, সর্বশেষ সম্পাদনাকারী এই নিবন্ধটির একমাত্র লেখক।",
-       "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) দ্বারা সম্পাদিত সর্বশেষ [[:$1]] সম্পাদনাটি পুনর্বহাল করা যাচ্ছে না;\nঅন্য কোন ব্যবহারকারী এই পাতা ইতিমধ্যে সম্পাদনা বা পুনর্বহাল করেছেন।\n\nএই পাতায় সর্বোশেষে [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) দ্বারা সম্পাদিত।",
+       "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|আলাপ]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) দ্বারা সম্পাদিত [[:$1]]-এর সর্বশেষ সম্পাদনাটি পুনর্বহাল করা যাচ্ছে না;\nঅন্য কোন ব্যবহারকারী এই পাতা ইতিমধ্যে সম্পাদনা বা পুনর্বহাল করেছেন।\n\nএই পাতায় সর্বশেষ সম্পাদনা করেছেন [[User:$3|$3]] ([[User talk:$3|আলাপ]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])।",
        "editcomment": "সম্পাদনা সারাংশ ছিল: \"''$1''\"।",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]]) এর সম্পাদিত সংস্করণ হতে [[User:$1|$1]] এর সম্পাদিত সর্বশেষ সংস্করণে ফেরত যাওয়া হয়েছে।",
        "revertpage-nouser": "একজন গোপন ব্যবহারকারী কর্তৃক সম্পাদিত সম্পাদনাটি বাতিলপূর্বক {{GENDER:$1|[[User:$1|$1]]}}-এর সর্বশেষ সম্পাদনায় ফেরত যাওয়া হয়েছে।",
-       "rollback-success": "$1-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; $2-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।",
+       "rollback-success": "{{GENDER:$3|$1}}-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; {{GENDER:$4|$2}}-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।",
        "rollback-success-notify": "$1-এর সম্পাদনাগুলি বাতিল করা হয়েছে; \n$2-এর করা শেষ সংস্করণে ফেরত নেওয়া হয়েছে। [$3 পরিবর্তন দেখুন]",
        "sessionfailure-title": "সেশন পরিত্যক্ত",
        "sessionfailure": "আপনার প্রবেশ সেশনে একটি সমস্যা হয়েছে বলে মনে হচ্ছে;\nসেশন হাইজ্যাক প্রতিরোধের উপায় হিসেবে এই কাজটি বাতিল করা হয়েছে।\nঅনুগ্রহ ব্রাউজারের \"পিছনে\" বোতাম চাপুন এবং যে পাতা থেকে এসেছিলেন, তা পুনঃলোড করুন এবং আবার চেষ্টা করুন।",
        "changecontentmodel-reason-label": "কারণ:",
        "changecontentmodel-submit": "পরিবর্তন করুন",
        "changecontentmodel-success-title": "বিষয়বস্তুর প্রতিরূপ পরিবর্তিত হয়েছিলো",
-       "changecontentmodel-success-text": "[[:$1]]-এর বিষয়বস্তুর ধরণ পরিবর্তন হয়েছে।",
+       "changecontentmodel-success-text": "[[:$1]]-এর বিষয়বস্তুর ধরন পরিবর্তন হয়েছে।",
+       "changecontentmodel-cannot-convert": "[[:$1]] পাতার বিষয়বস্তু $2-এর ধরনে রূপান্তরিত করা সম্ভব নয়।",
        "changecontentmodel-nodirectediting": "$1 বিষয়বস্তুর রূপ সরাসরি সম্পাদনা করা সমর্থন করে না",
        "changecontentmodel-emptymodels-title": "কোন বিষয়বস্তুর রূপ উপলব্ধ নয়",
+       "changecontentmodel-emptymodels-text": "[[:$1]] পাতার বিষয়বস্তু কোন ধরনেই রূপান্তরিত করা সম্ভব নয়।",
        "log-name-contentmodel": "বিষয়বস্তুর রূপ পরিবর্তন লগ",
+       "log-description-contentmodel": "এই পাতাতে পাতাগুলির বিষয়বস্তুর মডেলের পরিবর্তনের একটি তালিকা আছে। এছাড়াও পূর্বনির্ধারিত মডেল ব্যতীত অন্য মডেলে তৈরি করা পাতাগুলিও তালিকাতে দেওয়া আছে।",
+       "logentry-contentmodel-new": "$1 পূর্বনির্ধারিত নয় এমন একটি বিষয়বস্তুর রূপ \"$5\" ব্যবহার $3 পাতাটি {{GENDER:$2|তৈরি করেছেন}}",
        "logentry-contentmodel-change": "$1 $3 পাতার বিষয়বস্তুর রূপ \"$4\" থেকে \"$5\"-এ {{GENDER:$2|পরিবর্তন করেছেন}}",
        "logentry-contentmodel-change-revertlink": "প্রত্যাবর্তন",
        "logentry-contentmodel-change-revert": "প্রত্যাবর্তন",
        "protectexpiry": "মেয়াদোত্তীর্ণ হবে:",
        "protect_expiry_invalid": "মেয়াদোত্তীর্ণ সময় অবৈধ।",
        "protect_expiry_old": "মেয়াদোত্তীর্ণ সময় অতীতে অবস্থিত।",
-       "protect-unchain-permissions": "সà§\81রà¦\95à§\8dষিত à¦\95রার à¦\85নà§\8dযনà§\8dয à¦\85পশনà¦\97à§\81লà§\8b à¦\86নলà¦\95 à¦\95রুন",
+       "protect-unchain-permissions": "সà§\81রà¦\95à§\8dষার à¦\85নà§\8dযানà§\8dয à¦ªà¦\9bনà§\8dদà¦\97à§\81লি à¦¦à§\87à¦\96ার à¦\9cনà§\8dয à¦¤à¦¾à¦²à¦¾ à¦\96à§\81লুন",
        "protect-text": "'''$1''' পাতাটির জন্য সুরক্ষার স্তর আপনি এখানে দেখতে ও পরিবর্তন করতে পারেন।",
        "protect-locked-blocked": "বাধাপ্রাপ্ত অবস্থায় আপনি পাতাটির সুরক্ষা স্তর পরিবর্তন করতে পারবেন না। এখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
-       "protect-locked-dblock": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨্ধ থাকায় সুরক্ষা স্তর পরিবর্তন করা যাবে না।\nএখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
+       "protect-locked-dblock": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ থাকায় সুরক্ষা স্তর পরিবর্তন করা যাবে না।\nএখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
        "protect-locked-access": "আপনার অ্যাকাউন্ট থেকে পাতার সুরক্ষা স্তর পরিবর্তন করার অনুমতি নেই।\nএখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
        "protect-cascadeon": "এই পাতাটি বর্তমানে সুরক্ষিত আছে, কারণ পাতাটি নিচের {{PLURAL:$1|পাতায়|পাতাগুলিতে}} অন্তর্ভুক্ত, {{PLURAL:$1|যাতে|যেগুলিতে}} প্রপাতাকার সুরক্ষা চালু আছে। আপনি এই পাতাটির সুরক্ষা স্তর পরিবর্তন করতে পারেন, তবে এটি প্রপাতাকার সুরক্ষাটিতে কোন পরিবর্তন সাধন করবে না।",
        "protect-default": "সমস্ত ব্যবহারকারীর জন্য",
        "pagesize": "(বাইট)",
        "restriction-edit": "সম্পাদনা",
        "restriction-move": "সরিয়ে নেওয়া",
-       "restriction-create": "সà§\83ষà§\8dà¦\9fি à¦\95রা à¦¹à§\8bà¦\95",
+       "restriction-create": "তà§\88রি à¦\95রà§\81ন",
        "restriction-upload": "আপলোড",
        "restriction-level-sysop": "সম্পূর্ণ সুরক্ষিত",
        "restriction-level-autoconfirmed": "অর্ধ-সুরক্ষিত",
        "undeletepage": "মুছে ফেলা পাতাগুলি দেখুন ও ফিরিয়ে আনুন",
        "undeletepagetitle": "'''[[:$1|$1]] এর অপসারিত সংস্করণগুলোর সমন্বয়ে দেখানো হচ্ছে'''।",
        "viewdeletedpage": "মুছে ফেলা হয়েছে, এমন পাতাগুলো দেখুন",
-       "undeletepagetext": "নিচের {{PLURAL:$1|পাতা মুছে ফেলা হয়েছে কিন্তু|$1 পাতাগুলি মুছে ফেলা হয়েছে কিন্তু}} এগুলি এখনও আর্কাইভে আছে ও পুনরুদ্ধার করা সম্ভব। আর্কাইভ পর্যায়ক্রমিকভাবে পরিস্কার করা হতে পারে।",
+       "undeletepagetext": "নিচের {{PLURAL:$1|পাতাটি মুছে ফেলা হয়েছে কিন্তু এটি|$1 পাতাগুলি মুছে ফেলা হয়েছে কিন্তু এগুলি}} এখনও আর্কাইভে আছে ও পুনরুদ্ধার করা সম্ভব। আর্কাইভ পর্যায়ক্রমিকভাবে পরিষ্কার করা হতে পারে।",
        "undelete-fieldset-title": "সংশোধন পুনরুদ্ধার",
        "undeleteextrahelp": "সম্পূর্ণ পাতাটি পুনরুদ্ধার করার জন্য সবগুলি টিকবাক্স অনির্বাচিত করুন এবং '''''{{int:undeletebtn}}''''' বোতামে ক্লিক করুন।\nনির্বাচিত পুনরুদ্ধারের জন্য যেসব সংশোধন পুনরুদ্ধার করতে চান, তার পাশের বাক্সে টিক দিন এবং '''''{{int:undeletebtn}}''''' বোতামে ক্লিক করুন।",
        "undeleterevisions": "$1{{PLURAL:$1|টি সংশোধন}} অপসারিত",
        "undeleteviewlink": "দেখাও",
        "undeleteinvert": "ব্যুত্ক্রমে নির্বাচন",
        "undeletecomment": "কারণ:",
-       "undeletedrevisions": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} পুনরুদ্ধার করা হয়েছে",
-       "undeletedrevisions-files": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} এবং {{PLURAL:$2|১টি ফাইল|$2টি ফাইল}} পুনরুদ্ধার করা হয়েছে",
-       "undeletedfiles": "{{PLURAL:$1|১টি ফাইল|$1টি ফাইল}} পুনরুদ্ধার করা হয়েছে",
        "cannotundelete": "কিছু বা সব পুনরুদ্ধার করা যায়নি:\n$1",
        "undeletedpage": "'''$1 পুনরুদ্ধার করা হয়েছে'''\n\nসাম্প্রতিক মুছে ফেলা ও পুনরুদ্ধারের ঘটনাগুলির জন্য [[Special:Log/delete|অবলুপ্তি লগ]] দেখুন।",
        "undelete-header": "সাম্প্রতিক সময়ে মুছে ফেলা পাতাগুলি দেখতে [[Special:Log/delete|অবলুপ্তি লগ]] দেখুন।",
        "undelete-show-file-submit": "হ্যাঁ",
        "namespace": "নামস্থান:",
        "invert": "বিপরীতক্রমে নির্বাচন",
-       "tooltip-invert": "যà§\87 à¦¸à¦\95ল à¦¨à¦¾à¦®à¦¸à§\8dথানà§\87র à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লà§\8bর à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হর à¦¦à§\87à¦\96তà§\87 à¦\9aাà¦\9aà§\8dà¦\9bà§\87ন à¦¨à¦¾ à¦¸à§\87à¦\97à§\81লà§\8bর à¦¨à¦¾à¦®à§\87র à¦ªà¦¾à¦¶à§\87 à¦\9fিà¦\95 à¦¦à¦¿à¦¨",
+       "tooltip-invert": "নিরà§\8dবাà¦\9aিত à¦¨à¦¾à¦®à¦¸à§\8dথানà¦\9fির (à¦\8fবà¦\82 à¦¸à¦\82শà§\8dলিষà§\8dà¦\9f à¦¨à¦¾à¦®à¦¸à§\8dথানà¦\9fি, à¦¯à¦¦à¦¿ à¦¨à¦¿à¦°à§\8dবাà¦\9aিত à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87) à¦\85নà§\8dতরà§\8dà¦\97ত à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লির à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96তà§\87 à¦\9aাà¦\87লà§\87 à¦\8fà¦\87 à¦¬à¦¾à¦\95à§\8dসà§\87 à¦\9fিà¦\95 à¦¦à¦¿à¦¨à¥¤",
        "tooltip-whatlinkshere-invert": "নির্বাচিত নামস্থানের পাতা থেকে লিঙ্ক আড়াল করতে এই বাক্সে টিক দিন।",
        "namespace_association": "সংশ্লিষ্ট নামস্থান",
        "tooltip-namespace_association": "এখানে টিক দেয়ার মাধ্যমে সংশ্লিষ্ট নামস্থান এবং আলাপপাতাসমূহ অন্তর্ভুক্ত করছেন",
        "sp-contributions-uploads": "আপলোডসমূহ",
        "sp-contributions-logs": "লগসমূহ",
        "sp-contributions-talk": "আলোচনা",
-       "sp-contributions-userrights": "ব্যবহারকারী অধিকার ব্যবস্থাপনা",
+       "sp-contributions-userrights": "{{GENDER:$1|ব্যবহারকারী}} অধিকার ব্যবস্থাপনা",
        "sp-contributions-blocked-notice": "এই ব্যবহারকারী বর্তমানে বাধাদানকৃত অবস্থায় রয়েছেন।\nতথ্যসূত্র হিসেবে সাম্প্রতিক বাধাদান লগের ভুক্তিটি নিচে দেওয়া হলো:",
        "sp-contributions-blocked-notice-anon": "এই আইপি ঠিকানাটি বর্তমানে বাধাদানকৃত অবস্থায় রয়েছে।\nতথ্যসূত্র হিসেবে সাম্প্রতিক বাধাদান লগের ভুক্তিটি নিচে দেওয়া হলো:",
        "sp-contributions-search": "অবদানসমূহের জন্য অনুসন্ধান",
        "sp-contributions-username": "আইপি (IP) ঠিকানা অথবা ব্যবহারকারীর নাম:",
        "sp-contributions-toponly": "শুধুমাত্র সেই সম্পাদনাগুলি দেখাও যেগুলো সাম্প্রতিক সংস্করণের অন্তর্ভুক্ত",
        "sp-contributions-newonly": "শুধুমাত্র পাতা সৃষ্টি করা সম্পাদনাগুলি দেখাও",
-       "sp-contributions-hideminor": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\86ড়াল à¦\95রà§\81ন",
+       "sp-contributions-hideminor": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
        "sp-contributions-submit": "অনুসন্ধান",
        "whatlinkshere": "সংযোগকারী পাতাসমূহ",
        "whatlinkshere-title": "যে পাতাগুলি থেকে \"$1\"-এর প্রতি সংযোগ আছে",
        "whatlinkshere-hidetrans": "অন্তর্ভুক্তকরণ $1",
        "whatlinkshere-hidelinks": "সংযোগ $1",
        "whatlinkshere-hideimages": "ফাইল সংযোগ $1",
-       "whatlinkshere-filters": "à¦\9bাà¦\95নà§\80",
+       "whatlinkshere-filters": "à¦\9bাà¦\81à¦\95নি",
        "whatlinkshere-submit": "চলো",
        "autoblockid": "স্বয়ংক্রিয় বাধা #$1",
        "block": "ব্যবহারকারীকে বাধা দাও",
        "unblock": "ব্যবহারকারীর উপর থেকে বাধা অপসারণ",
        "blockip": "{{GENDER:$1|ব্যবহারকারীকে}} বাধা দাও",
-       "blockip-legend": "বà§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87à¦\93য়া à¦¹à§\8bà¦\95",
-       "blockiptext": "কোন নির্দিষ্ট আইপি ঠিকানা বা ব্যবহারকারীর লেখার অধিকারে বাধা দিতে নিচের ফর্মটি ব্যবহার করুন।\nএটি কেবলমাত্র ধ্বংসপ্রবণতা প্রতিরোধে ও [[{{MediaWiki:Policy-url}}|নীতিমালা]] মেনে সম্পাদন করা উচিত।\nনিচে একটি নির্দিষ্ট কারণ দিন (উদাহরণস্বরূপ, যেসব পাতার ধ্বংসসাধন করা হয়েছে, সেগুলি উল্লেখ করতে পারেন)।",
+       "blockip-legend": "বà§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¨",
+       "blockiptext": "কোন নির্দিষ্ট আইপি ঠিকানা বা ব্যবহারকারীর লেখার অধিকারে বাধা দিতে নিচের ফর্মটি ব্যবহার করুন।\nএটি কেবলমাত্র ধ্বংসপ্রবণতা প্রতিরোধে ও [[{{MediaWiki:Policy-url}}|নীতিমালা]] মেনে সম্পাদন করা উচিত।\nনিচে একটি নির্দিষ্ট কারণ দিন (উদাহরণস্বরূপ, যেসব পাতার ধ্বংসসাধন করা হয়েছে, সেগুলি উল্লেখ করতে পারেন)।\nআপনি একটি নির্দিষ্ট সীমার অন্তর্গত একাধিক আইপি ঠিকানাকে বাধা দিতে পারেন; এজন্য [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] সিনট্যাক্স বা পদবিন্যাসবিধি ব্যবহার করুন; এরকম বৃহত্তম অনুমোদিত সীমা হচ্ছে IPv4-এর ক্ষেত্রে /$1 এবং IPv6-এর ক্ষেত্রে /$2।",
        "ipaddressorusername": "আইপি ঠিকানা বা ব্যবহারকারীর নাম:",
        "ipbexpiry": "যখন মেয়াদোত্তীর্ণ হবে:",
        "ipbreason": "কারণ:",
-       "ipbreason-dropdown": "*বাধা দানের সাধারণ কারণ\n** মিথ্যা তথ্য ঢোকানো\n** পাতা থেকে বিষয়বস্তু মুছে ফেলা\n** বাইরের কোন সাইটের সংযোগ স্প্যাম করা\n** পাতাগুলিতে অর্থহীন বিষয়বস্তু ঢোকানো\n** ভীতি উদ্রেককারী আচরণ/হয়রানি\n** একাধিক অ্যাকাউন্টের অপব্যবহার\n** ব্যবহারকারী নাম অ-গ্রহণযোগ্য",
+       "ipbreason-dropdown": "*বাধা দানের সাধারণ কারণগুলি\n** মিথ্যা তথ্য যোগ করা\n** পাতা থেকে বিষয়বস্তু মুছে ফেলা\n** অবাঞ্ছিত বহিঃস্থ কোন সাইটের প্রতি সংযোগ বারংবার যোগ করা\n** পাতাগুলিতে অর্থহীন বিষয়বস্তু যোগ করা\n** ভীতি উদ্রেককারী আচরণ/হয়রানি\n** একাধিক অ্যাকাউন্টের অপব্যবহার\n** ব্যবহারকারী নাম অগ্রহণযোগ্য",
        "ipb-hardblock": "এই আইপি ঠিকানা থেকে লগ-ইনকৃত ব্যবহারকারীদেরকে সম্পাদনায় বাধা দাও",
        "ipbcreateaccount": "অ্যাকাউন্ট সৃষ্টিতে বাধা দেওয়া হোক",
        "ipbemailban": "ব্যবহারকারীকে ই-মেইল পাঠাতে বাধা দেওয়া হোক",
-       "ipbenableautoblock": "এই ব্যবহারকারীর ব্যবহার করা সর্বশেষ আইপি ঠিকানা, এবং পরবর্তী যেসব আইপি ঠিকানা থেকে সম্পাদনার চেষ্টা করা হবে, সেগুলিকেও স্বয়ংক্রিয়ভাবে বাধা দেয়া হোক",
-       "ipbsubmit": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87য়া à¦¹à§\8bà¦\95",
+       "ipbenableautoblock": "এই ব্যবহারকারীর ব্যবহার করা সর্বশেষ আইপি ঠিকানা, এবং পরবর্তী যেসব আইপি ঠিকানা থেকে সম্পাদনার চেষ্টা করা হবে, সেগুলিকেও স্বয়ংক্রিয়ভাবে বাধা দেয়া হোক",
+       "ipbsubmit": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¨",
        "ipbother": "অন্য সময়:",
        "ipboptions": "২ ঘণ্টা:2 hours,১ দিন:1 day,৩ দিন:3 days,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
        "ipbhidename": "সম্পাদনা ও তালিকা থেকে ব্যবহারকারী নাম লুকিয়ে রাখা হোক",
        "ipbwatchuser": "এই ব্যবহাকারীর পাতা এবং আলাপের পাতা নজরতালিকায় রাখো",
        "ipb-disableusertalk": "এই ব্যবহারকারীকে বাধাদানকৃত অবস্থায় নিজের আলাপ পাতায় সম্পাদনা করা থেকে বিরত রাখো",
-       "ipb-change-block": "à¦\8fà¦\87 à¦\8fà¦\95à¦\87 à¦¸à§\87à¦\9fিà¦\82সসহ à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\86বারà¦\93 à¦¬à¦¾à¦§à¦¾ à¦ªà§\8dরদান à¦\95রà§\8b",
+       "ipb-change-block": "à¦\8fà¦\95à¦\87 à¦¸à§\87à¦\9fিà¦\82সসহ à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦ªà§\81নà¦\83বাধা à¦¦à¦¿à¦¨",
        "ipb-confirm": "বাধা নিশ্চিতকরণ",
        "badipaddress": "আইপি (IP) ঠিকানাটি অগ্রহনযোগ্য",
        "blockipsuccesssub": "বাধা সফল",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] কে বাধা দেয়া হয়েছে।<br />\nবাধা দেয়া পুনর্বিবেচনা করতে হলে [[Special:BlockList|বাধা দেয়া তালিকা]] দেখুন।",
        "ipb-blockingself": "আপনি নিজেকেই বাধাপ্রদান করতে যাচ্ছেন! আপনি কী নিশ্চিত যে আপনি এটি-ই করতে চান?",
-       "ipb-confirmhideuser": "\"hide user\" ক্ষমতার মাধ্যমে আপনি একজন ব্যবহারকারীকে বাধা দিতে যাচ্ছেন। এর মাধ্যমে এই ব্যবহারকারীর নাম সকল লিস্ট এবং লগএন্ট্রি থেকে সরিয়ে ফেলা হবে। আপনি কি নিশ্চিতভাবে এটি করতে চান?",
+       "ipb-confirmhideuser": "আপনি \"ব্যবহারকারী লুকানো\" অধিকার যুক্ত একজন ব্যবহারকারীকে বাধা দিতে যাচ্ছেন। এর মাধ্যমে এই ব্যবহারকারীর নাম সকল তালিকা এবং লগের ভুক্তি থেকে সরিয়ে ফেলা হবে। আপনি কি নিশ্চিতভাবে এটি করতে চান?",
        "ipb-confirmaction": "আপনি যদি নিশ্চিত হন আপনি এটি সত্যিকার অর্থেই করতে চান তাহলে অনুগ্রহ করে উপরের \"{{int:ipb-confirm}}\" ঘরটি দেখুন।",
        "ipb-edit-dropdown": "বাধাদানের কারণ সম্পাদনা করুন",
-       "ipb-unblock-addr": "$1-à¦\8fর à¦\89পর à¦¥à§\87à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¤à§\81লà§\87 à¦¨à§\87à¦\93য়া à¦¹à§\8bà¦\95",
+       "ipb-unblock-addr": "$1-à¦\8fর à¦¬à¦¾à¦§à¦¾ à¦¤à§\81লà§\87 à¦¨à¦¿à¦¨",
        "ipb-unblock": "ব্যবহারকারী বা আইপি ঠিকানার উপর থেকে বাধা তুলে নেওয়া হোক",
        "ipb-blocklist": "বিদ্যমান বাধাগুলি দেখুন",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}}-এর অবদানসমূহ",
        "ipb-blocklist-duration-left": "$1 বাকি",
        "unblockip": "ব্যবহারকারীর উপর থেকে বাধা তুলে নেওয়া হোক",
        "unblockiptext": "নিচের ফর্মটি ব্যবহার করে পূর্বে বাধা দেওয়া কোন আইপি ঠিকানা বা ব্যবহারকারীর সাইটে লেখার অধিকার পুনঃপ্রতিষ্ঠা করুন।",
-       "ipusubmit": "বাধা à¦¤à§\81লà§\87 à¦¨à§\87à¦\93য়া à¦¹à§\8bà¦\95",
+       "ipusubmit": "à¦\8fà¦\87 à¦¬à¦¾à¦§à¦¾ à¦¤à§\81লà§\87 à¦¨à¦¿à¦¨",
        "unblocked": "[[User:$1|$1]]-এর উপর বাধা তুলে নেওয়া হয়েছে",
        "unblocked-range": "$1 -এর থেকে বাধা সরিয়ে নেওয়া হয়েছে",
        "unblocked-id": "$1 বাধাটি তুলে নেওয়া হয়েছে",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] কে অবরোধমুক্ত করা হয়েছে।",
        "blocklist": "বাধাপ্রাপ্ত ব্যবহারকারী",
+       "autoblocklist": "স্বয়ংক্রিয়বাধা",
+       "autoblocklist-submit": "অনুসন্ধান",
+       "autoblocklist-legend": "স্বয়ংক্রিয়বাধার তালিকা",
+       "autoblocklist-localblocks": "স্থানীয় {{PLURAL:$1|স্বয়ংবাধা|স্বয়ংবাধাসমূহ}}",
+       "autoblocklist-empty": "স্বয়ংক্রিয়বাধার তালিকাটি খালি।",
+       "autoblocklist-otherblocks": "অন্য {{PLURAL:$1|স্বয়ংবাধা|স্বয়ংবাধাসমূহ}}",
        "ipblocklist": "বাধাপ্রাপ্ত ব্যবহারকারী",
        "ipblocklist-legend": "বাধা দেওয়া কোন ব্যবহারকারীকে অনুসন্ধান করুন",
-       "blocklist-userblocks": "à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¬à¦¾à¦§à¦¾ à¦²à§\81à¦\95াà¦\93",
+       "blocklist-userblocks": "à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¬à¦¾à¦§à¦¾ à¦²à§\81à¦\95ানà§\8b à¦¹à§\8bà¦\95",
        "blocklist-tempblocks": "অস্থায়ী বাধা লুকাও",
-       "blocklist-addressblocks": "à¦\8fà¦\95à¦\95 à¦\86à¦\87পি à¦¬à¦¾à¦§à¦¾ à¦²à§\81à¦\95াà¦\93",
+       "blocklist-addressblocks": "à¦\8fà¦\95à¦\95 à¦\86à¦\87পি à¦¬à¦¾à¦§à¦¾ à¦²à§\81à¦\95ানà§\8b à¦¹à§\8bà¦\95",
        "blocklist-rangeblocks": "রেঞ্জ ব্লকসমূহ লুকান",
        "blocklist-timestamp": "সময়বার্তা",
        "blocklist-target": "লক্ষ্য",
        "ipblocklist-empty": "বাধাতালিকা খালি।",
        "ipblocklist-no-results": "অনুরুদ্ধ আইপি ঠিকানা বা ব্যবহারকারী নামটির উপর কোন বাধা নেই।",
        "blocklink": "বাধা দাও",
-       "unblocklink": "বাধা à¦¤à§\81লà§\87 à¦¨à§\87à¦\93য়া à¦¹à§\8bà¦\95",
+       "unblocklink": "বাধা à¦¤à§\81লà§\81ন",
        "change-blocklink": "বাধা পরিবর্তন করুন",
        "contribslink": "অবদান",
        "emaillink": "ই-মেইল পাঠাও",
        "ipb_hide_invalid": "এই অ্যাকাউন্ট বাধা দেয়া সম্ভব নয়; এটি {{PLURAL:$1|একের অধিক|$1টি}} সম্পাদনা করেছে।",
        "ipb_already_blocked": "\"$1\" ইতিমধ্যে ব্লক",
        "ipb-needreblock": "$1 ইতিমধ্যেই বাধাপ্রাপ্ত আছেন। আপনি কি সেটিংস পরিবর্তন করতে চান?",
-       "ipb-otherblocks-header": "অন্যান্য {{PLURAL:$1|বাধাঁ|বাধাঁসমূহ}}",
+       "ipb-otherblocks-header": "অন্যান্য {{PLURAL:$1|বাধা|বাধাসমূহ}}",
        "unblock-hideuser": "আপনি এই ব্যবহারকারীকে বাধা মুক্ত করতে পারবেন না, কারণ এই ব্যবহারকারীদের ব্যবহারকারী নাম লুকানো রয়েছে।",
        "ipb_cant_unblock": "ত্রুটি: $1 ব্লক আইডি খুঁজে পাওয়া যায়নি। হয়ত ইতিমধ্যেই এটির উপর থেকে বাধা তুলে নেওয়া হয়েছে।",
        "ipb_blocked_as_range": "ত্রুটি: $1 আইপি ঠিকানাটিকে সরাসরি বাধা দেওয়া হয়নি এবং বাধা তুলে নেওয়া যাবে না। তবে ঠিকানাটি $2 সীমার অন্তর্ভুক্ত এবং সেটি থেকে বাধা তুলে নেওয়া সম্ভব।",
        "cant-see-hidden-user": "আপনি যে ব্যবহারকারীকে ব্লক বা লুকিয়ে রাখতে চাচ্ছেন তাকে আগে থেকেই ব্লক বা লুকিয়ে রাখা হয়েছে। এছাড়া আপনার Hideuser অধিকার নেই, তাই আপনি ব্যবহারকারীর অবস্থা পরিবর্তন করতে পারবেন না।",
        "ipbblocked": "আপনি অন্য কোন ব্যবহারকরীকে ব্লক বা আনব্লক করতে পারবেন না, কারণ আপনি নিজেই ব্লক রয়েছেন",
        "ipbnounblockself": "আপনি নিজেকে আনব্লক করতে পারবেন না",
-       "lockdb": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রà§\87 à¦¦à§\87à¦\93য়া হোক",
+       "lockdb": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রা হোক",
        "unlockdb": "ডাটাবেজ খুলে দেওয়া হোক",
-       "lockdbtext": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রà§\87 à¦¦à¦¿à¦²à§\87 à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦ªà¦¾à¦¤à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦ªà¦\9bনà§\8dদ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦¨à¦\9cরতালিà¦\95া à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87, এবং ডাটাবেজে পরিবর্তন আনে এমন কোন কিছু করতে পারবেন না।\nঅনুগ্রহ করে নিশ্চিত করুন যে আপনি এটাই করতে চান, এবং আপনার রক্ষণাবেক্ষণ শেষ হবার পর ডাটাবেজ আবার খুলে দেবেন।",
+       "lockdbtext": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রà§\87 à¦¦à¦¿à¦²à§\87 à¦\95à§\8bনà§\8b à¦¬à§\8dযবহারà¦\95ারà§\80à¦\87 à¦ªà¦¾à¦¤à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦ªà¦\9bনà§\8dদ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦¨à¦\9cরতালিà¦\95া à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 এবং ডাটাবেজে পরিবর্তন আনে এমন কোন কিছু করতে পারবেন না।\nঅনুগ্রহ করে নিশ্চিত করুন যে আপনি এটাই করতে চান, এবং আপনার রক্ষণাবেক্ষণ শেষ হবার পর ডাটাবেজ আবার খুলে দেবেন।",
        "unlockdbtext": "ডাটাবেজ খুলে দিলে সব ব্যবহারকারী পাতা সম্পাদনা করতে, তাদের পছন্দ পরিবর্তন করতে, তাদের নজরতালিকা সম্পাদনা করতে, এবং ডাটাবেজে পরিবর্তন সাধন করে, এমন অন্যান্য কাজ করতে পারবেন।\nঅনুগ্রহ করে নিশ্চিত করুন যে আপনি এটাই করতে চান।",
-       "lockconfirm": "হà§\8dযাà¦\81, à¦\86মি à¦\86সলà§\87à¦\87 à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রতে চাই।",
+       "lockconfirm": "হà§\8dযাà¦\81, à¦\86মি à¦\86সলà§\87à¦\87 à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রà§\87 à¦¦à¦¿তে চাই।",
        "unlockconfirm": "হ্যাঁ, আমি আসলেই ডাটাবেজ খুলে দিতে চাই।",
-       "lockbtn": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨্ধ করা হোক",
+       "lockbtn": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ করা হোক",
        "unlockbtn": "ডাটাবেজ খুলে দেওয়া হোক",
        "locknoconfirm": "আপনি নিশ্চিতকরণ বাক্সে টিক দেননি।",
-       "lockdbsuccesssub": "ডাà¦\9fাবà§\87à¦\9c à¦¸à¦«à¦²à¦­à¦¾à¦¬à§\87 à¦¬à¦¨্ধ করে দেওয়া হয়েছে",
+       "lockdbsuccesssub": "ডাà¦\9fাবà§\87à¦\9c à¦¸à¦«à¦²à¦­à¦¾à¦¬à§\87 à¦\85বরà§\81দ্ধ করে দেওয়া হয়েছে",
        "unlockdbsuccesssub": "ডাটাবেজ খুলে দেওয়া হয়েছে",
-       "lockdbsuccesstext": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87\n<br />আপনার রক্ষণাবেক্ষণ সম্পন্ন হবার পর [[Special:UnlockDB|ডাটাবেজ খুলে দিতে]] ভুলবেন না।",
+       "lockdbsuccesstext": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।<br />\nআপনার রক্ষণাবেক্ষণ সম্পন্ন হবার পর [[Special:UnlockDB|ডাটাবেজ খুলে দিতে]] ভুলবেন না।",
        "unlockdbsuccesstext": "ডাটাবেজ খুলে দেওয়া হয়েছে।",
-       "lockfilenotwritable": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রার à¦«à¦¾à¦\87লà¦\9fি à¦²à¦¿à¦\96নযà§\8bà¦\97à§\8dয à¦¨à¦¯à¦¼à¥¤ à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦¬à¦¨্ধ করতে বা খুলতে চাইলে ফাইলটিকে ওয়েব সার্ভার কর্তৃক লিখনযোগ্য হতে হবে।",
-       "databaselocked": "ডাà¦\9fাবà§\87সà¦\9fি à¦\87তিমধà§\8dযà§\87à¦\87 à¦¤à¦¾à¦²à¦¾à¦¬দ্ধ।",
+       "lockfilenotwritable": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\8bধনিরà§\8dদà§\87শà¦\95 à¦«à¦¾à¦\87লà¦\9fি à¦²à¦¿à¦\96নযà§\8bà¦\97à§\8dয à¦¨à¦¯à¦¼à¥¤ à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ করতে বা খুলতে চাইলে ফাইলটিকে ওয়েব সার্ভার কর্তৃক লিখনযোগ্য হতে হবে।",
+       "databaselocked": "ডাà¦\9fাবà§\87à¦\9cà¦\9fি à¦\87তিমধà§\8dযà§\87à¦\87 à¦\85বরà§\81দ্ধ।",
        "databasenotlocked": "ডাটাবেজ বন্ধ নয়।",
        "lockedbyandtime": "({{GENDER:$1|$1}} $2 এর $3 সময়ে)",
        "move-page": "$1 স্থানান্তর",
        "allmessagescurrent": "বর্তমান টেক্সট",
        "allmessagestext": "এটি মিডিয়াউইকি নামস্থানে অন্তর্ভুক্ত সিস্টেম বার্তাগুলোর একটি তালিকা।\nআপনি যদি সাধারণ মিডিয়াউইকির স্থানীয়করণে অবদান রাখতে আগ্রহী হন, অনুগ্রহ করে [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation মিডিয়াউইকি স্থানীয়করণ] এবং [https://translatewiki.net translatewiki.net] দেখুন।",
        "allmessagesnotsupportedDB": "এই পাতা ব্যবহার করা যাবে না কারণ '''$wgUseDatabaseMessages''' বন্ধ করে রাখা আছে।",
-       "allmessages-filter-legend": "à¦\9bাà¦\95নà§\80",
+       "allmessages-filter-legend": "à¦\9bাà¦\81à¦\95নি",
        "allmessages-filter": "Filter by customization state:",
        "allmessages-filter-unmodified": "অপরিবর্তিত",
        "allmessages-filter-all": "সমস্ত",
        "thumbnail_image-type": "চিত্রের ধরন সমর্থন করে না",
        "thumbnail_gd-library": "অসম্পূর্ণ জিডি লাইব্রেরী কনফিগারেশন: $1 ফাংশন নেই",
        "thumbnail_image-missing": "ফাইলটি খুজে পাওয়া যাচ্ছে না: $1",
+       "thumbnail_image-failure-limit": "সাম্প্রতিককালে এই ক্ষুদ্র প্রাকপ্রদর্শনমূলক চিত্রটিকে (thumbnail) রেন্ডার করার চেষ্টা অত্যধিকবার ($1 বা তার বেশিবার) ব্যর্থ হয়েছে। অনুগ্রহ করে কিছুক্ষণ পরে আবার চেষ্টা করুন।",
        "import": "পাতা আমদানি",
        "importinterwiki": "অন্য উইকি থেকে আমদানী",
        "import-interwiki-text": "আমদানির জন্য একটি উইকি ও পাতার শিরোনাম নির্বাচন করুন।\nসংশোধনের তারিখগুলি এবং সম্পাদকদের নামগুলি সংরক্ষণ করা হবে।\nঅন্যান্য উইকি থেকে সমস্ত আমদানি [[Special:Log/import|আমদানি লগে]] লিপিবদ্ধ আছে।",
        "import-interwiki-sourcewiki": "উত্স উইকি:",
        "import-interwiki-sourcepage": "উৎস পাতা:",
-       "import-interwiki-history": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¸à¦®à¦¸à§\8dত à¦\87তিহাসà§\87র à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦\85নà§\81লিপি করা হোক",
-       "import-interwiki-templates": "সà¦\95ল à¦\9fà§\87মà§\8dপলà§\87à¦\9f à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত",
+       "import-interwiki-history": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦\87তিহাসà§\87র à¦¸à¦®à¦¸à§\8dত à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦ªà§\8dরতিলিপি করা হোক",
+       "import-interwiki-templates": "সà¦\95ল à¦\9fà§\87মপà§\8dলà§\87à¦\9f à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত à¦\95রà§\81ন",
        "import-interwiki-submit": "আমদানি",
        "import-mapping-default": "পূর্বনির্ধারিত অবস্থানে আমদানি করুন",
        "import-mapping-namespace": "একটি নামস্থানে আমদানি করুন:",
        "import-error-special": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ এটি একটি বিশেষ নামস্থানকে নির্দেশ করে যেটি সম্পাদনার জন্য অনুমোদিত নয়।",
        "import-error-invalid": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ নামটি সঠিক নয়।",
        "import-error-unserialize": "$1 পাতার $2 সংস্করণটি সিরিয়ালাইজ করা যাচ্ছে না। এই রিভিশনে $4 হিসাবে $3 কন্টেন্ট মডেলে সিরিয়ালাইজ করা আছে।",
-       "import-options-wrong": "ভুল {{PLURAL:$2|অপশন|অপশনসমূহ}}: <nowiki>$1</nowiki>",
+       "import-error-bad-location": "বিষয়বস্তু মডেল $3 ব্যবহার করে সম্পাদিত $2 নং সংশোধনটি \"$1\" পাতায় সংরক্ষণ করা যাবে না, কারণ ঐ মডেলটি ঐ পাতাতে প্রযোজ্য নয়।",
+       "import-options-wrong": "{{PLURAL:$2|পছন্দ}} নির্বাচনে ভুল: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "মূল পাতার ভুল শিরনাম দেয়া হয়েছে।",
        "import-rootpage-nosubpage": "মূল পাতার \"$1\" নামস্থানে উপপাতা তৈরী অনুমোদিত নয়।",
        "importlogpage": "আমদানি লগ",
        "tooltip-pt-mycontris": "{{GENDER:|আপনার}} অবদানগুলোর একটি তালিকা",
        "tooltip-pt-anoncontribs": "এই আইপি ঠিকানা থেকে করা সম্পাদনার একটি তালিকা",
        "tooltip-pt-login": "আপনার প্রবেশ করাটা বাঞ্চনীয়, কিন্তু তা বাধ্যতামূলক নয়।",
+       "tooltip-pt-login-private": "এই উইকিতে ব্যবহার করতে আপনাকে প্রবেশ করতে হবে",
        "tooltip-pt-logout": "প্রস্থান",
        "tooltip-pt-createaccount": "আপনাকে একটি অ্যাকাউন্ট তৈরি করে প্রবেশ করার পরামর্শ দেওয়া হচ্ছে; তবে এটা বাধ্যতামূলক নয়",
        "tooltip-ca-talk": "বিষয়বস্তু পাতা সম্পর্কে আলোচনা",
        "tooltip-ca-protect": "এই পাতাকে সুরক্ষিত করো",
        "tooltip-ca-unprotect": "এই পাতার সুরক্ষা পরিবর্তন করো",
        "tooltip-ca-delete": "পাতাটি মুছে ফেলো",
-       "tooltip-ca-undelete": "পাতাà¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লার à¦\86à¦\97à§\87 à¦¯à§\87 à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bিল, à¦¸à§\87à¦\97à§\81লি à¦\89দà§\8dধার à¦\95রা à¦¹à§\8bà¦\95।",
+       "tooltip-ca-undelete": "পাতাà¦\9fি à¦\85পসারণà§\87র à¦\86à¦\97à§\87 à¦¯à§\87 à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bিল à¦¸à§\87à¦\97à§\81লি à¦\89দà§\8dধার à¦\95রা à¦¹à§\8bà¦\95",
        "tooltip-ca-move": "পাতাটি স্থানান্তর করুন",
        "tooltip-ca-watch": "এই পাতাটি আপনার নজরতালিকায় যোগ করুন",
        "tooltip-ca-unwatch": "এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলুন",
        "tooltip-search": "{{SITENAME}} অনুসন্ধান",
        "tooltip-search-go": "যদি থাকে, তবে ঠিক এই নামের পাতায় চলো",
-       "tooltip-search-fulltext": "à¦\8fà¦\87 à¦\9fà§\87à¦\95à§\8dসà¦\9fà§\87র à¦\9cনà§\8dয à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লিতà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রা à¦¹à§\8bà¦\95",
+       "tooltip-search-fulltext": "à¦\8fà¦\87 à¦²à§\87à¦\96ার à¦\9cনà§\8dয à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লিতà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন",
        "tooltip-p-logo": "প্রধান পাতা পরিদর্শন করুন",
        "tooltip-n-mainpage": "প্রধান পাতায় যান",
        "tooltip-n-mainpage-description": "প্রধান পাতা পরিদর্শন করুন",
        "tooltip-ca-nstab-help": "সাহায্য পাতাটি দেখুন",
        "tooltip-ca-nstab-category": "বিষয়শ্রেণী পাতাটি দেখুন",
        "tooltip-minoredit": "এটিকে অনুল্লেখ্য সম্পাদনা হিসেবে চিহ্নিত করা হোক",
-       "tooltip-save": "à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¸à¦\82রà¦\95à§\8dষিত à¦¹à§\8bà¦\95",
+       "tooltip-save": "à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¸à¦\82রà¦\95à§\8dষিত à¦\95রà§\81ন",
        "tooltip-publish": "আপনার পরিবর্তন প্রকাশ করুন",
        "tooltip-preview": "অনুগ্রহ করে সংরক্ষণের আগে আপনার পরিবর্তনগুলি প্রাকদর্শন করুন!",
-       "tooltip-diff": "à¦\86পনি à¦\9fà§\87à¦\95à§\8dসà¦\9fà§\87 à¦\95à§\80 à¦\95à§\80 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রà§\87à¦\9bà§\87ন, à¦¤à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95।",
+       "tooltip-diff": "লà§\87à¦\96ায় à¦\95à§\80 à¦\95à§\80 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রà§\87à¦\9bà§\87ন à¦¤à¦¾ à¦¦à§\87à¦\96à§\81ন",
        "tooltip-compareselectedversions": "এই পাতার দুইটি নির্বাচিত সংস্করণের মধ্যে তুলনা দেখুন।",
        "tooltip-watch": "এই পাতাটি আমার নজরতালিকায় যোগ করো",
        "tooltip-watchlistedit-normal-submit": "শিরোনাম অপসারণ",
        "tooltip-preferences-save": "পছন্দ সংরক্ষণ",
        "tooltip-summary": "একটি সংক্ষিপ্ত সারাংশ দিন",
        "interlanguage-link-title": "$1 - $2",
-       "common.css": "/* এখানে সিএসএস নিবেশিত করা হলে তা সব স্কিনে প্রয়োগ করা হবে */",
+       "common.css": "/* এখানে সন্নিবেশিত সিএসএস সব আবরণে প্রয়োগ করা হবে */",
+       "print.css": "/* এখানে সন্নিবেশিত সিএসএস মুদ্রণের আউটপুটকে প্রভাবিত করবে */",
+       "noscript.css": "/* এখানে সন্নিবেশিত সিএসএস জাভাস্ক্রিপ্ট নিষ্ক্রিয় করা ব্যবহারকারীদের প্রভাবিত করবে */",
+       "group-autoconfirmed.css": "/* এখানে সন্নিবেশিত সিএসএস শুধু স্বয়ংনিশ্চিতকৃত ব্যবহারকারীদের প্রভাবিত করবে */",
+       "group-user.css": "/* এখানে সন্নিবেশিত সিএসএস শুধু নিবন্ধিত ব্যবহারকারীদের প্রভাবিত করবে */",
+       "group-bot.css": "/* এখানে সন্নিবেশিত সিএসএস শুধু বটকে প্রভাবিত করবে */",
+       "group-sysop.css": "/* এখানে সন্নিবেশিত সিএসএস শুধু প্রশাসকদের প্রভাবিত করবে */",
+       "group-bureaucrat.css": "/* এখানে সন্নিবেশিত সিএসএস শুধু ব্যুরোক্র্যাটদের প্রভাবিত করবে */",
+       "common.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট সকল ব্যবহারকারীর জন্য সকল পাতায় লোড হবে। */",
+       "group-autoconfirmed.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট শুধু স্বয়ংনিশ্চিতকৃত ব্যবহারকারীদের জন্য লোড হবে */",
+       "group-user.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট শুধু নিবন্ধিত ব্যবহারকারীদের জন্য লোড হবে */",
+       "group-bot.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট শুধু বটের জন্য লোড হবে */",
+       "group-sysop.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট শুধু প্রশাসকদের জন্য লোড হবে */",
+       "group-bureaucrat.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট শুধু ব্যুরোক্র্যাটদের জন্য লোড হবে */",
        "anonymous": "{{SITENAME}} এর বেনামী {{PLURAL:$1|ব্যবহারকারী|ব্যবহারকারীবৃন্দ}}",
        "siteuser": "{{SITENAME}} ব্যবহারকারী $1",
        "anonuser": "{{SITENAME}} বেনামী ব্যবহারকারী $1",
-       "lastmodifiedatby": "$3 কর্তৃক $2, $1 তারিখে এই পাতাটিতে শেষ পরিবর্তন করা হয়েছিল।",
+       "lastmodifiedatby": "$3 কর্তৃক $2, $1 তারিখে এই পাতাটি শেষ সম্পাদিত হয়েছিল।",
        "othercontribs": "$1-এর কাজের উপর ভিত্তি করে।",
        "others": "অন্যান্য",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|ব্যবহারকারী}}|ব্যবহারকারী}} $1",
        "anonusers": "{{SITENAME}} বেনামী {{PLURAL:$2|ব্যবহারকারী|ব্যবহারকারীগণ}} $1",
        "creditspage": "পাতার স্বীকৃতি",
        "nocredits": "এই পাতাটির জন্য কোন কৃতিত্ব-সম্পর্কিত তথ্য নেই।",
-       "spamprotectiontitle": "সà§\8dপà§\8dযাম à¦ªà§\8dরতিরà¦\95à§\8dষা à¦«à¦¿à¦²à§\8dà¦\9fার",
-       "spamprotectiontext": "à¦\86পনি à¦¯à§\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦\9aà§\87য়à§\87à¦\9bà§\87ন, à¦¤à¦¾ à¦¸à§\8dপà§\8dযাম à¦«à¦¿à¦²à§\8dà¦\9fার à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¯à¦¼à§\87à¦\9bà§\87। à¦¸à¦®à§\8dভবত à¦\95ালà§\8b à¦¤à¦¾à¦²à¦¿à¦\95াভà§\81à¦\95à§\8dত à¦¬à¦¹à¦¿à¦\83সà§\8dথ à¦\95à§\8bন à¦¸à¦¾à¦\87à¦\9fà§\87র à¦¸à¦\82যà§\8bà¦\97à§\87র à¦\95ারণà§\87 à¦\8fমনà¦\9fা ঘটেছে।",
-       "spamprotectionmatch": "নিà¦\9aà§\87র à¦\9fà§\87à¦\95à§\8dসà¦\9fà¦\9fি à¦\86মাদà§\87র à¦¸à§\8dপà§\8dযাম à¦«à¦¿à¦²à§\8dà¦\9fারকে সক্রিয় করেছে: $1",
-       "spambot_username": "মিডিয়াà¦\89à¦\87à¦\95ি à¦¸à§\8dপà§\8dযাম à¦ªà¦°à¦¿à¦¸à§\8dà¦\95ার",
+       "spamprotectiontitle": "সà§\8dপà§\8dযাম à¦ªà§\8dরতিরà¦\95à§\8dষা à¦\9bাà¦\81à¦\95নি",
+       "spamprotectiontext": "à¦\86পনি à¦¯à§\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦\9aà§\87য়à§\87à¦\9bà§\87ন, à¦¤à¦¾ à¦¸à§\8dপà§\8dযাম à¦\9bাà¦\81à¦\95নি à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¯à¦¼à§\87à¦\9bà§\87। à¦¸à¦®à§\8dভবত à¦\95ালà§\8bতালিà¦\95াভà§\81à¦\95à§\8dত à¦¬à¦¹à¦¿à¦\83সà§\8dথ à¦\95à§\8bন à¦¸à¦¾à¦\87à¦\9fà§\87র à¦¸à¦\82যà§\8bà¦\97à§\87র à¦\95ারণà§\87 à¦\8fমনà¦\9fি ঘটেছে।",
+       "spamprotectionmatch": "নিà¦\9aà§\87র à¦²à§\87à¦\96াà¦\9fি à¦\86মাদà§\87র à¦¸à§\8dপà§\8dযাম à¦\9bাà¦\81à¦\95নিকে সক্রিয় করেছে: $1",
+       "spambot_username": "মিডিয়াà¦\89à¦\87à¦\95ি à¦¸à§\8dপà§\8dযাম à¦ªà¦°à¦¿à¦·à§\8dà¦\95ারà¦\95রণ",
        "spam_reverting": "$1-এর প্রতি কোন সংযোগ নেই, এমন সর্বশেষ সংস্করণে ফেরত নেওয়া হচ্ছে।",
        "spam_blanking": "$1-এর প্রতি সংযোগ অন্তর্ভুক্ত আছে এমন সমস্ত সংশোধন খালি করা হচ্ছে",
        "spam_deleting": "$1-এর প্রতি সংযোগ অন্তর্ভুক্ত আছে এমন সমস্ত সংশোধন অপসারণ করা হচ্ছে",
        "imagemaxsize": "ছবির আকারের সর্বোচ্চ সীমা:<br />''(ছবির বিবরণ পাতার জন্য)''",
        "thumbsize": "থাম্বনেইল আকার:",
        "widthheightpage": "$1 × $2, $3টি {{PLURAL:$1|পাতা}}",
-       "file-info": "ফাà¦\87লà§\87র à¦\86à¦\95ার: $1, MIME à¦§à¦°à¦£: $2",
-       "file-info-size": "$1 Ã\97 $2 à¦ªà¦¿à¦\95à§\8dসà§\87ল, à¦«à¦¾à¦\87লà§\87র à¦\86à¦\95ার: $3, à¦\8fমà¦\86à¦\87à¦\8fমà¦\87 à¦§à¦°à¦£: $4",
+       "file-info": "ফাà¦\87লà§\87র à¦\86à¦\95ার: $1, MIME à¦§à¦°à¦¨: $2",
+       "file-info-size": "$1 Ã\97 $2 à¦ªà¦¿à¦\95à§\8dসà§\87ল, à¦«à¦¾à¦\87লà§\87র à¦\86à¦\95ার: $3, à¦\8fমà¦\86à¦\87à¦\8fমà¦\87 à¦§à¦°à¦¨: $4",
        "file-info-size-pages": "$1 × $2 পিক্সেল, ফাইলের আকার: $3, MIME ধরন: $4, $5টি {{PLURAL:$5|পাতা}}",
        "file-nohires": "এর চেয়ে বেশি রেজোলিউশন লভ্য নয়।",
        "svg-long-desc": "এসভিজি ফাইল, সাধারণত $1 × $2 পিক্সেল, ফাইলের আকার: $3",
        "newimages": "নতুন ফাইলের গ্যালারি",
        "imagelisttext": "নিচে '''$1''' {{PLURAL:$1|ফাইলের|ফাইলের}} একটি তালিকা যা $2 এ সংরক্ষিত রয়েছে।",
        "newimages-summary": "এই বিশেষ পাতা সর্বশেষ আপলোডকৃত ফাইল দেখাবে।",
-       "newimages-legend": "à¦\9bাà¦\95নà§\80",
+       "newimages-legend": "à¦\9bাà¦\81à¦\95নি",
        "newimages-label": "ফাইলের নাম (অথবা এর কোন অংশ):",
+       "newimages-user": "আইপি ঠিকানা বা ব্যবহারকারী নাম",
        "newimages-showbots": "বটের আপলোড গুলো দেখাও।",
-       "newimages-hidepatrolled": "à¦\9fহলà¦\95à§\83ত à¦\86পলà§\8bড à¦\86ড়াল à¦\95রà§\8b",
+       "newimages-hidepatrolled": "à¦\9fহলà¦\95à§\83ত à¦\86পলà§\8bড à¦²à§\81à¦\95ানà§\8b à¦¹à§\8bà¦\95",
        "noimages": "দেখার মত কিছু নেই।",
        "gallery-slideshow-toggle": "থাম্বনেল ভাসান",
        "ilsubmit": "অনুসন্ধান",
        "metadata": "অধি-উপাত্ত",
        "metadata-help": "এই ফাইলে অতিরিক্ত কিছু তথ্য আছে। সম্ভবত যে ডিজিটাল ক্যামেরা বা স্ক্যানারের মাধ্যমে এটি তৈরি বা ডিজিটায়িত করা হয়েছিল, সেটি কর্তৃক তথ্যগুলি যুক্ত হয়েছে। যদি ফাইলটি তার আদি অবস্থা থেকে পরিবর্তিত হয়ে থাকে, কিছু কিছু বিবরণ পরিবর্তিত ফাইলটির জন্য প্রযোজ্য না-ও হতে পারে।",
        "metadata-expand": "সম্প্রসারিত সবিস্তারে দেখাও",
-       "metadata-collapse": "সমà§\8dপà§\8dরসারিত à¦¸à¦¬à¦¿à¦¸à§\8dতারà§\87 à¦¦à§\87à¦\96িà¦\93 à¦¨à¦¾",
-       "metadata-fields": "à¦\8fà¦\87 à¦¬à¦¾à¦°à§\8dতায় à¦¤à¦¾à¦²à¦¿à¦\95াভà§\81à¦\95à§\8dত à¦\9aিতà§\8dর à¦®à§\87à¦\9fাডাà¦\9fা à¦\95à§\8dষà§\87তà§\8dরà¦\97à§\81লি à¦\9bবির à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà§\8dরদরà§\8dশন à¦\95রা à¦¹à¦¬à§\87, à¦¯à¦\96ন à¦\85ধি-à¦\89পাতà§\8dত সারণিটি সংকুচিত করা হবে। অন্য ক্ষেত্রগুলি স্বাভাবিক অবস্থায় লুকায়িত থাকবে।\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-collapse": "সমà§\8dপà§\8dরসারিত à¦¬à¦¿à¦¬à¦°à¦£ à¦¦à§\87à¦\96ান",
+       "metadata-fields": "à¦\8fà¦\87 à¦¬à¦¾à¦°à§\8dতায় à¦¤à¦¾à¦²à¦¿à¦\95াভà§\81à¦\95à§\8dত à¦\9aিতà§\8dর à¦®à§\87à¦\9fাডাà¦\9fা à¦\95à§\8dষà§\87তà§\8dরà¦\97à§\81লি à¦\9bবির à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà§\8dরদরà§\8dশন à¦\95রা à¦¹à¦¬à§\87, à¦¯à¦\96ন à¦®à§\87à¦\9fাডাà¦\9fা সারণিটি সংকুচিত করা হবে। অন্য ক্ষেত্রগুলি স্বাভাবিক অবস্থায় লুকায়িত থাকবে।\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-copyrighted-false": "কপিরাইট সংক্রান্ত তথ্য নেই",
        "exif-photometricinterpretation-0": "কালো এবং সাদা (সাদা হল 0)",
        "exif-photometricinterpretation-1": "কালো এবং সাদা (কালো হল 0)",
+       "exif-photometricinterpretation-3": "প্যালেট",
+       "exif-photometricinterpretation-4": "স্বচ্ছতা মাস্ক",
+       "exif-photometricinterpretation-5": "পৃথকীকৃত (সম্ভবত CMYK)",
        "exif-unknowndate": "অজানা তারিখ",
        "exif-orientation-1": "সাধারণ",
        "exif-orientation-2": "অনুভূমিকভাবে উল্টানো",
        "exif-dc-relation": "সম্পর্কিত মিডিয়া",
        "exif-dc-rights": "অধিকার",
        "exif-dc-source": "উৎস মিডিয়া",
-       "exif-dc-type": "মিডিয়ার à¦§à¦°à¦£",
+       "exif-dc-type": "মিডিয়ার à¦§à¦°à¦¨",
        "exif-rating-rejected": "প্রত্যাখাত",
        "exif-isospeedratings-overflow": "৬৫৫৩৫ থেকে বড়",
        "exif-iimcategory-ace": "শিল্প, সংস্কৃতি এবং বিনোদন",
        "invalidateemail": "ইমেইল নিশ্চিতকরণ বাতিল করুন",
        "notificationemail_subject_changed": "{{SITENAME}}-এ নিবন্ধীকৃত ইমেল ঠিকানা পরিবর্তন করা হয়েছে",
        "notificationemail_subject_removed": "{{SITENAME}}-এ নিবন্ধীকৃত ইমেল ঠিকানা সরানো হয়েছে",
+       "notificationemail_body_changed": "কেউ, সম্ভবত আপনি-ই, $1 আইপি ঠিকানাটি থেকে {{SITENAME}}-এর \"$2\" নামক অ্যাাকাউন্টের সাথে সংশ্লিষ্ট ই-মেইল ঠিকানাটি \"$3\"-এ পরিবর্তন করেছেন।\n\nযদি এটি আপনি না করে থাকেন তাহলে, অবিলম্বে সাইট প্রশাসকের সাথে যোগাযোগ করুন।",
+       "notificationemail_body_removed": "কেউ, সম্ভবত আপনি-ই, $1 আইপি ঠিকানা থেকে  {{SITENAME}}-এর \"$2\" নামক অ্যাকাউন্টের সাথে সংশ্লিষ্ট ই-মেইল ঠিকানাটি মুছে দিয়েছেন।\n\nযদি এটি আপনি না করে থাকেন তাহলে, অবিলম্বে সাইট প্রশাসকের সাথে যোগাযোগ করুন।",
        "scarytranscludedisabled": "[আন্তঃউইকি আন্তঃভুক্তি নিষ্ক্রিয়]",
        "scarytranscludefailed": "[$1 এর জন্য টেমপ্লেট আনা অসফল হয়েছে]",
        "scarytranscludefailed-httpstatus": "[$1: HTTP $2 এর জন্য টেমপ্লেট আনা বিফল হয়েছে]",
        "confirmrecreate": "আপনি সম্পাদনা শুরু করার পর ব্যবহারকারী [[User:$1|$1]] ([[User talk:$1|আলাপ]]) এই পাতাটি মুছে দিয়েছেন, নিচের কারণ দেখিয়ে:\n: <em>$2</em>\nআপনি সত্যিই যে পাতাটি পুনরায় সৃষ্টি করতে চান, তা দয়া করে নিশ্চিত করুন।",
        "confirmrecreate-noreason": "আপনি সম্পাদনা শুরু করার পর ব্যবহারকারী [[User:$1|$1]] ([[User talk:$1|আলাপ]]) এই পাতাটি {{GENDER:$1|মুছে}} দিয়েছেন। আপনি সত্যিই যে পাতাটি পুনরায় সৃষ্টি করতে চান, তা দয়া করে নিশ্চিত করুন।",
        "recreate": "পুনরায় তৈরি করো",
+       "confirm-purge-title": "এই পাতাটি শোধন করুন",
        "confirm_purge_button": "ঠিক আছে",
        "confirm-purge-top": "এই পাতার ক্যাশে পরিষ্কার করতে চান?",
-       "confirm-purge-bottom": "à¦\95à§\8dযাশà§\87 à¦ªà¦°à¦¿à¦¸্কারের মাধ্যমে পাতাটির সবচেয়ে সাম্প্রতিক সংস্করণটি প্রদর্শিত হবে।",
+       "confirm-purge-bottom": "à¦\95à§\8dযাশà§\87 à¦ªà¦°à¦¿à¦·্কারের মাধ্যমে পাতাটির সবচেয়ে সাম্প্রতিক সংস্করণটি প্রদর্শিত হবে।",
        "confirm-watch-button": "ঠিক আছে",
        "confirm-watch-top": "এই পাতাটি আপনার নজরতালিকায় যুক্ত করা হবে?",
        "confirm-unwatch-button": "ঠিক আছে",
        "watchlistedit-normal-title": "নজরতালিকা সম্পাদনা করো",
        "watchlistedit-normal-legend": "নজর তালিকা থেকে শিরোনামসমূহ মুছে ফেলো",
        "watchlistedit-normal-explain": "আপনার নজরতালিকায় রাখা পাতার শিরোনামগুলি নিচে দেখানো হয়েছে।\nকোন শিরোনাম সরিয়ে নিতে চাইলে পাশের বাক্সে টিক দিন এবং \"{{int:Watchlistedit-normal-submit}}\"-এ ক্লিক করুন।\nআপনি [[Special:EditWatchlist/raw|মূল তালিকাটিও]] সম্পাদনা করতে পারেন।",
-       "watchlistedit-normal-submit": "শিরà§\8bনামà¦\97à§\81লি à¦¸à¦°à¦¿à¦¯à¦¼à§\87 à¦«à§\87লা à¦¹à§\8bà¦\95",
+       "watchlistedit-normal-submit": "শিরà§\8bনামà¦\97à§\81লি à¦¸à¦°à¦¾à¦¨",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 শিরোনাম|$1 শিরোনামসমূহ}} আপনার নজর তালিকা থেকে মুছে ফেলা হয়েছে:",
        "watchlistedit-raw-title": "অশোধিত নজর তালিকা সম্পাদনা করুন",
        "watchlistedit-raw-legend": "অশোধিত নজরতালিকা সম্পাদনা করুন",
        "watchlistedit-raw-explain": "আপনার নজরতালিকায় রাখা পাতার শিরোনামগুলি নিচে দেখানো হয়েছে, এই তালিকাতে নতুন শিরোনাম যোগ করা যাবে বা শিরোনাম সরিয়ে নেওয়া যাবে;\nপ্রতিটি লাইনে একটি করে শিরনাম দেখানো হচ্ছে।\nশেষ হলে \"{{int:Watchlistedit-raw-submit}}\"-এ ক্লিক করুন।\nআপনি [[Special:EditWatchlist|আদর্শ সম্পাদনা সরঞ্জাম]]-ও ব্যবহার করতে পারেন।",
        "watchlistedit-raw-titles": "শিরোনাম:",
-       "watchlistedit-raw-submit": "নà¦\9cরতালিà¦\95া à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ à¦\95রা à¦¹à§\8bà¦\95",
+       "watchlistedit-raw-submit": "নà¦\9cরতালিà¦\95া à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ à¦\95রà§\81ন",
        "watchlistedit-raw-done": "আপনার নজর তালিকা হালনাগাদ করা হয়েছে।",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 শিরোনাম|$1 শিরোনামসমূহ}} যোগ করা হয়েছে:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 শিরোনাম|$1 শিরোনামসমূহ}} মুছে ফেলা হয়েছে:",
        "watchlistedit-clear-title": "নজরতালিকা পরিষ্কার করুন",
-       "watchlistedit-clear-legend": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦¸্কার",
+       "watchlistedit-clear-legend": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦·্কার",
        "watchlistedit-clear-explain": "সকল শিরোনামসমূহ আপনার নজরতালিকা থেকে সরিয়ে নেয়া হয়েছে।",
        "watchlistedit-clear-titles": "শিরোনামসমূহ:",
        "watchlistedit-clear-submit": "নজরতালিকা পরিষ্কার করুন (এটি স্থায়ী!)",
        "watchlistedit-clear-done": "আপনার নজরতালিকা পরিষ্কার করা হয়েছে।",
        "watchlistedit-clear-removed": "{{PLURAL:$1|১টি শিরোনাম|$1টি শিরোনাম}} সরিয়ে ফেলা হয়েছে:",
        "watchlistedit-too-many": "এখানে প্রদর্শনের জন্য অনেক পাতা রয়েছে।",
-       "watchlisttools-clear": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦¸্কার করুন",
+       "watchlisttools-clear": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦·্কার করুন",
        "watchlisttools-view": "সম্পর্কিত পরিবর্তনসমূহ দেখুন",
        "watchlisttools-edit": "নজর তালিকা দেখুন এবং সম্পাদনা করুন",
        "watchlisttools-raw": "অশোধিত নজরতালিকা সম্পাদনা করুন",
        "timezone-utc": "ইউটিসি",
        "timezone-local": "স্থানীয়",
        "duplicate-defaultsort": "<strong>সতর্কীকরণ:</strong> পূর্বনির্ধারিত সাজানোর চাবি \"$2\" পূর্বের পূর্বনির্ধারিত সাজানোর চাবি \"$1\" কে অগ্রাহ্য করে।",
-       "duplicate-displaytitle": "<strong>সতরà§\8dà¦\95à§\80à¦\95রণ:</strong> à¦ªà§\8dরদরà§\8dশন à¦¶à¦¿à¦°à§\8bনাম \"$2\" à¦\86à¦\97à§\87র à¦ªà§\8dরদরà§\8dশন à¦¶à¦¿à¦°à§\8bনাম \"$1\" à¦\85à¦\97à§\8dরাহà§\8dয করবে।",
+       "duplicate-displaytitle": "<strong>সতরà§\8dà¦\95à§\80à¦\95রণ:</strong> à¦ªà§\8dরদরà§\8dশন à¦¶à¦¿à¦°à§\8bনাম \"$2\" à¦\86à¦\97à§\87র à¦ªà§\8dরদরà§\8dশন à¦¶à¦¿à¦°à§\8bনাম \"$1\" à¦\95à§\87 à¦ªà§\8dরতিসà§\8dথাপিত করবে।",
        "restricted-displaytitle": "<strong>সতর্কবার্তা:</strong> প্রদর্শন শিরোনাম \"$1\" উপেক্ষা করা হয়েছে যেহেতু এটি পাতার আসল শিরোনামের সাথে সমতুল্য নয়।",
        "invalid-indicator-name": "<strong>ত্রুটি:</strong> পাতার অবস্থা নির্দেশক <code>name</code> অ্যাট্রিবিউট খালি হতে পারবে না।",
        "version": "সংস্করণ",
        "version-license-not-found": "এই এক্সটেনশনের জন্য কোনো বিস্তারিত লাইসেন্স তথ্য পাওয়া যায়নি।",
        "version-credits-title": "$1-এর জন্য কৃতিত্ব",
        "version-credits-not-found": "এই এক্সটেনশনটির জন্য কোনো বিস্তারিত কৃতিত্ব তথ্য পাওয়া যায়নি।",
-       "version-poweredby-credits": "এই উইকিটি পরিচালিত হচ্ছে <strong>[https://www.mediawiki.org/ মিডিয়াউইকি]</strong> -এর মাধ্যমে, কপিরাইট © ২০০১-$1 $2।",
+       "version-poweredby-credits": "এই উইকিটি <strong>[https://www.mediawiki.org/ মিডিয়াউইকির]</strong> মাধ্যমে পরিচালিত হচ্ছে, কপিরাইট © ২০০১-$1 $2।",
        "version-poweredby-others": "অন্যান্য",
        "version-poweredby-translators": "translatewiki.net অনুবাদকগণ",
        "version-credits-summary": "[[Special:Version|মিডিয়াউইকি]] সফটওয়্যারে অবদানের জন্য আমরা এই ব্যক্তিকে স্বীকৃতি দিতে চাই।",
-       "version-license-info": "মিডিয়াà¦\89à¦\87à¦\95ি à¦\8fà¦\95à¦\9fি à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার; à¦\86পনি à¦\8fà¦\9fি à¦¬à¦¿à¦¤à¦°à¦£ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦\8fবà¦\82/à¦\85থবা à¦¸à¦®à§\8dপদানা à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন, à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà§\87র à¦ªà§\8dরà¦\95াশিত à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à§¨à¦¯à¦¼ à¦\85থবা à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95তম à¦\95à§\8bনà§\8b à¦¸à¦\82সà§\8dà¦\95রণ à¦®à§\87নà§\87 à¦\9aলতà§\87 à¦¹à¦¬à§\87। \n\nসà¦\95লà§\87র à¦\89পà¦\95ারà§\87র à¦²à¦\95à§\8dষà§\8dযà§\87 à¦\8fà¦\9fি à¦¬à¦¿à¦¤à¦°à¦£ à¦\95রা à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87, à¦\95িনà§\8dতà§\81 à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦\95à§\8bনà§\8b à¦\93য়ারà§\87নà§\8dà¦\9fি à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾, à¦\8fমনà¦\95ি à¦¬à¦¿à¦¶à§\87ষ à¦\95à§\8bনà§\8b à¦\95ারà§\8dযà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦¬à§\8dযবহারà§\87র à¦\9cনà§\8dযà¦\93 à¦¤à¦¥à¦¾à¦\95থিত à¦\93য়ারà§\87নà§\8dà¦\9fি à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾à¥¤ à¦¬à¦¿à¦¸à§\8dতারিত à¦\9cানতà§\87 à¦¦à§\87à¦\96à§\81ন à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dস। \n\nà¦\8fà¦\87 à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦¸à¦¾à¦¥à§\87 [{{SERVER}}{{SCRIPTPATH}}/COPYING à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à¦\8fà¦\95à¦\9fি à¦\85নà§\81লিপি] à¦¥à¦¾à¦\95ার à¦\95থা; à¦¯à¦¦à¦¿ à¦\86পনি à¦¨à¦¾ à¦ªà§\87য়à§\87 à¦¥à¦¾à¦\95à§\87ন à¦¤à¦¾à¦¹à¦²à§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà¦\95à§\87 à¦\9cানান à¦\8fà¦\87 à¦ à¦¿à¦\95ানায়, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA à¦\85থবা [//www.gnu.org/licenses/old-licenses/gpl-2.0.html à¦\85নলাà¦\87নà§\87 à¦¦à§\87à¦\96ুন]।",
+       "version-license-info": "মিডিয়াà¦\89à¦\87à¦\95ি à¦\8fà¦\95à¦\9fি à¦\89নà§\8dমà§\81à¦\95à§\8dত à¦¸à¦«à¦\9fà¦\93য়à§\8dযার; à¦\86পনি à¦\8fà¦\9fি à¦ªà§\81নà¦\83বিতরণ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦\8fবà¦\82/à¦\85থবা à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন, à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà§\87র à¦ªà§\8dরà¦\95াশিত à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à§¨à¦¯à¦¼ à¦\85থবা à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95তম à¦\95à§\8bনà§\8b à¦¸à¦\82সà§\8dà¦\95রণ à¦®à§\87নà§\87 à¦\9aলতà§\87 à¦¹à¦¬à§\87। \n\nমিডিয়াà¦\89à¦\87à¦\95ি à¦\8fà¦\87 à¦\86শায় à¦¬à¦¿à¦¤à¦°à¦£ à¦\95রা à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87 à¦¯à§\87 à¦\8fà¦\9fি à¦¸à¦\95লà§\87র à¦\89পà¦\95ারà§\87 à¦\86সবà§\87, à¦\95িনà§\8dতà§\81 à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦\95à§\8bনà§\8b à¦²à¦¿à¦\96িত à¦\85à¦\99à§\8dà¦\97à§\80à¦\95ার à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾, à¦\8fমনà¦\95ি à¦¬à§\8dযবসাযà§\8bà¦\97à§\8dযতা à¦¬à¦¾ à¦¬à¦¿à¦¶à§\87ষ à¦\95à§\8bনà§\8b à¦\95ারà§\8dযà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦¬à§\8dযবহারà§\87র à¦\9cনà§\8dয à¦\8fà¦\9fি à¦\89পযà§\81à¦\95à§\8dত à¦\95ি à¦¨à¦¾, à¦\8f à¦¨à¦¿à¦¯à¦¼à§\87 à¦ªà¦°à§\8bà¦\95à§\8dষ à¦\85à¦\99à§\8dà¦\97à§\80à¦\95ারà¦\93 à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾à¥¤ à¦¬à¦¿à¦¸à§\8dতারিত à¦\9cানতà§\87 à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dস à¦¦à§\87à¦\96à§\81ন। \n\nà¦\8fà¦\87 à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦¸à¦¾à¦¥à§\87 [{{SERVER}}{{SCRIPTPATH}}/COPYING à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à¦\8fà¦\95à¦\9fি à¦ªà§\8dরতিলিপি] à¦¥à¦¾à¦\95ার à¦\95থা; à¦¯à¦¦à¦¿ à¦\86পনি à¦¨à¦¾ à¦ªà§\87য়à§\87 à¦¥à¦¾à¦\95à§\87ন à¦¤à¦¾à¦¹à¦²à§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà¦\95à§\87 à¦\9cানান à¦\8fà¦\87 à¦ à¦¿à¦\95ানায়, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA à¦\85থবা [//www.gnu.org/licenses/old-licenses/gpl-2.0.html à¦²à¦¾à¦\87সà§\87নà§\8dসà¦\9fি à¦\87নà§\8dà¦\9fারনà§\87à¦\9fà§\87 à¦ªà¦¡à¦¼ুন]।",
        "version-software": "ইনস্টলকৃত সফটওয়্যার",
        "version-software-product": "পণ্য",
        "version-software-version": "সংস্করণ",
        "fileduplicatesearch-submit": "অনুসন্ধান",
        "fileduplicatesearch-info": "$1 × $2 পিক্সেল<br />ফাইলের আকার: $3<br />এমআইএমই প্রকার: $4",
        "fileduplicatesearch-result-1": " \"$1\" ফাইলের কোন ডুপ্লেকেট ফাইল নাই।",
-       "fileduplicatesearch-result-n": "\"$1\" à¦\8fà¦\87 à¦«à¦¾à¦\87লà§\87র {{PLURAL:$2|1 à¦\8fà¦\95à¦\87রà¦\95ম à¦\85নà§\81লিপি|$2 à¦\8fà¦\95à¦\87রà¦\95ম à¦\85নà§\81লিপি}} রয়েছে।",
+       "fileduplicatesearch-result-n": "\"$1\" à¦«à¦¾à¦\87লà¦\9fির {{PLURAL:$2|১à¦\9fি à¦\85বিà¦\95ল à¦ªà§\8dরতিলিপি|$2à¦\9fি à¦\85বিà¦\95ল à¦ªà§\8dরতিলিপি}} রয়েছে।",
        "fileduplicatesearch-noresults": "\"$1\" নামের কোনো ফাইল খুঁজে পাওয়া যায়নি।",
        "specialpages": "বিশেষ পাতাসমূহ",
-       "specialpages-note-top": "লিà¦\9cà§\87নà§\8dড",
+       "specialpages-note-top": "বà§\8dযাà¦\96à§\8dযা",
        "specialpages-note": "* সাধারণ বিশেষ পাতাসমূহ।\n* <span class=\"mw-specialpagerestricted\">সীমাবদ্ধ বিশেষ পাতা।</span>",
        "specialpages-group-maintenance": "রক্ষণাবেক্ষণের কার্যবিবরণীসমূহ",
        "specialpages-group-other": "অন্যান্য বিশেষ পাতাসমূহ",
        "specialpages-group-pagetools": "পাতা সংক্রান্ত সরঞ্জাম",
        "specialpages-group-wiki": "উপাত্ত এবং সরঞ্জামসমূহ",
        "specialpages-group-redirects": "বিশেষ পাতাগুলি পুনর্নির্দেশ করা হচ্ছে",
-       "specialpages-group-spam": "স্প্যামরোধী হাতিয়ার",
+       "specialpages-group-spam": "স্প্যাম সরঞ্জামসমূহ",
        "specialpages-group-developer": "ডেভলপারের সরঞ্জাম",
        "blankpage": "খালি পাতা",
        "intentionallyblankpage": "এই পাতাটি ইচ্ছা করে খালি রাখা হয়েছে",
        "external_image_whitelist": "  #এই লাইন ঠিক যেমন আছে<প্রাক> তেমন রাখুন<pre>\n #রেগুলার এক্সপ্রেশনের টুকরা নীচে (শুধুমাত্র অংশ / / মধ্যে যে যায়) বসান\n#এইগুলি এক্সটার্নাল (hotlinked) ইমেজের URL-এর সাথে মেলানো হবে\n#যেগুলি মিলবে, সেগুলি চিত্র হিসাবে প্রদর্শিত হবে, অন্যথায় শুধুমাত্র ইমেজ লিঙ্ক প্রদর্শিত হবে\n#যে লাইনের প্রারম্ভে # আছে সেই লাইনগুলি মন্তব্যসমূহ হিসাবে ব্যবহার করা হয়\n#এটি কেস-অসংবেদী\n\n#এই রেখার উপরের regex টুকরা বসান. এই লাইন ঠিক যেমন আছে তেমন রাখুন</pre>",
        "tags": "বৈধ পরিবর্তন ট্যাগ",
-       "tag-filter": "[[Special:Tags|à¦\9fà§\8dযাà¦\97]] à¦\9bাà¦\95নà§\80:",
-       "tag-filter-submit": "à¦\9bাà¦\95নà§\80",
+       "tag-filter": "[[Special:Tags|à¦\9fà§\8dযাà¦\97]] à¦\9bাà¦\81à¦\95নি:",
+       "tag-filter-submit": "à¦\9bাà¦\81à¦\95নি",
        "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-deactivate": "নিষ্ক্রিয়",
        "tags-hitcount": "$1টি {{PLURAL:$1|পরিবর্তন}}",
        "tags-manage-no-permission": "আপনার ট্যাগ পরিবর্তন পরিচালনা করার অনুমতি নেই।",
+       "tags-manage-blocked": "বাধাপ্রাপ্ত থাকাকালীন সময়ে {{GENDER:$1|আপনি}} ট্যাগ পরিবর্তন ব্যবস্থাপনা করতে পারবেন না।",
        "tags-create-heading": "নতুন ট্যাগ তৈরি করুন",
        "tags-create-explanation": "পূর্বনির্ধারিতরূপে, নব নির্মিত ট্যাগ ব্যবহারকারী এবং বট দ্বারা ব্যবহারের জন্য উপলব্ধ করা হবে।",
        "tags-create-tag-name": "ট্যাগের নাম:",
        "tags-create-reason": "কারণ:",
        "tags-create-submit": "তৈরি করুন",
        "tags-create-no-name": "আপনাকে একটি ট্যাগের নাম অবশ্যই উল্লেখ করতে হবে।",
+       "tags-create-invalid-chars": "ট্যাগের নামে কমা (<code>,</code>) বা ফরোয়ার্ড স্ল্যাশ (<code>/</code>) থাকতে পারবে না।",
+       "tags-create-invalid-title-chars": "ট্যাগের নাম এমন অক্ষর থাকতে পারবে না যা পাতার শিরোনামে ব্যবহার করা যায় না।",
        "tags-create-already-exists": "\"$1\" ট্যাগ ইতিমধ্যেই বিদ্যমান।",
+       "tags-create-warnings-above": "\"$1\" ট্যাগটি তৈরির প্রচেষ্টার সময় নিম্নোক্ত {{PLURAL:$2|সতর্ক বার্তা|সতর্ক বার্তাগুলি}} উৎপন্ন হয়েছে:",
        "tags-create-warnings-below": "আপনি কি ট্যাগটি তৈরি করা চালিয়ে যেতে চান?",
        "tags-delete-title": "ট্যাগ অপসারণ",
+       "tags-delete-explanation-initial": "আপনি ডাটাবেজ থেকে \"$1\" ট্যাগটি অপসারণ করতে চলেছেন।",
+       "tags-delete-explanation-in-use": "ট্যাগটি বর্তমানে যে {{PLURAL:$2|$2 টি সংশোধন এবং/বা লগ ভুক্তিতে}} প্রয়োগ হয়েছে, সেগুলি থেকে এটিকে অপসারণ করা হবে।",
+       "tags-delete-explanation-warning": "এই কাজটি <strong>অপরিবর্তনযোগ্য</strong> এবং এটিকে ভবিষ্যতে <strong>বাতিল করা সম্ভব নয়</strong>, এমনকি ডাটাবেজ প্রশাসকরাও এটি বাতিল করতে পারবেন না। এই ট্যাগটিই মুছে ফেলতে চাচ্ছেন কি না, সে ব্যাপারে সুনিশ্চিত হোন।",
+       "tags-delete-explanation-active": "<strong>\"$1\" ট্যাগটি এখনও সক্রিয় এবং ভবিষ্যতে এটিকে প্রয়োগ করা যাবে।</strong> এই ব্যাপারটি ঘটা বন্ধ করার জন্য যেসব স্থানে ট্যাগটিকে প্রয়োগ করার জন্য নির্ধারণ করা হয়েছে, সেসব স্থানে গিয়ে সেটিকে নিষ্ক্রিয় করুন।",
        "tags-delete-reason": "কারণ:",
        "tags-delete-submit": "অপরিবর্তনীয় এই ট্যাগ অপসারন করো",
+       "tags-delete-not-allowed": "এক্সটেনশন দ্বারা সংজ্ঞায়িত ট্যাগ অপসারণ করা সম্ভব নয়, যদি না এক্সটেনশনটি বিশেষভাবে এটি করার অনুমতি দিয়ে থাকে।",
        "tags-delete-not-found": "\"$1\" ট্যাগ বিদ্যমান নয়।",
        "tags-delete-too-many-uses": "\"$1\" ট্যাগটি $2টিরও অধিক {{PLURAL:$2|সংশোধনে}} প্রয়োগ করা হয়েছে, যার অর্থ এটি অপসারণ করা যাবে না।",
+       "tags-delete-warnings-after-delete": "\"$1\" ট্যাগটি মুছে ফেলা হয়েছে, কিন্তু নিম্নোক্ত {{PLURAL:$2|সতর্ক বার্তাটি|সতর্ক বার্তাগুলি}} উৎপন্ন হয়েছে:",
        "tags-delete-no-permission": "আপনার পরিবর্তন ট্যাগ মুছে ফেলার অনুমতি নেই।",
        "tags-activate-title": "সক্রিয় ট্যাগ",
        "tags-activate-question": "আপনি ট্যাগ \"$1\" সক্রিয় করতে চলেছেন।",
        "tags-deactivate-not-allowed": "ট্যাগ \"$1\" নিষ্ক্রিয় করা সম্ভব নয়।",
        "tags-deactivate-submit": "নিষ্ক্রিয়",
        "tags-apply-no-permission": "আপনার পরিবর্তনসহ আপনার ট্যাগ পরিবর্তন প্রয়োগ করার অনুমতি নেই।",
+       "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": "বাধাপ্রাপ্ত থাকাকালীন সময়ে {{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-manage-link": "ট্যাগ পরিচালনা করুন",
        "tags-edit-revision-selected": "[[:$2]] পাতার {{PLURAL:$1|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|নির্বাচিত লগ ইভেন্ট}}:",
+       "tags-edit-revision-legend": "{{PLURAL:$1|এই সংশোধন|$1টি সংশোধনের সবগুলি}} থেকে ট্যাগ যোগ বা অপসারণ করুন",
        "tags-edit-logentry-legend": "{{PLURAL:$1|এই লগের ভুক্তি|$1টি লগের ভুক্তি}} থেকে ট্যাগ যোগ বা বাতিল করুন",
        "tags-edit-existing-tags": "বিদ্যমান ট্যাগ:",
        "tags-edit-existing-tags-none": "<em>কোনটি নয়</em>",
        "tags-edit-success": "পরিবর্তন প্রয়োগ করা হয়েছে।",
        "tags-edit-failure": "পরিবর্তন প্রয়োগ করা যায়নি: $1",
        "tags-edit-nooldid-title": "লক্ষ্য সংশোধন অবৈধ",
+       "tags-edit-nooldid-text": "আপনি হয় কোন লক্ষ্য সংশোধনটিতে এই ফাংশনটি সম্পাদন করতে হবে তা নির্দিষ্ট করে দেননি, অথবা নির্দিষ্টকৃত সংশোধনটির অস্তিত্ব নেই।",
        "tags-edit-none-selected": "যোগ করতে অথবা অপসারণ করতে অন্ততপক্ষে একটি ট্যাগ দয়া করে নির্বাচন করুন।",
        "comparepages": "পাতার তুলনা",
        "compare-page1": "পাতা ১",
        "dberr-info-hidden": "(ডেটাবেজ প্রবেশ করা সম্ভব হয়নি)",
        "dberr-usegoogle": "এই পরিস্থিতিতে আপনি গুগলের মাধ্যমে অনুসন্ধান করার চেষ্টা করতে পারেন।",
        "dberr-outofdate": "খেয়াল করুন যে, আমাদের বিষয়বস্তু সম্পর্কিত তাদের সূচি মেয়াদ উত্তীর্ণ হতে পারে।",
-       "dberr-cachederror": "à¦\8fà¦\9fি à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦° à¦\95à§\8dযাশà§\87 à¦²à¦¿à¦ªà¦¿, à¦¯à¦¾ à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াতà¦\95à§\83ত à¦¨à¦¾ও হতে পারে।",
+       "dberr-cachederror": "à¦\8fà¦\9fি à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦\9fির à¦\95à§\8dযাশ à¦ªà§\8dরতিলিপি, à¦¯à¦¾ à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াতà¦\95à§\83ত à¦¨à¦¾-ও হতে পারে।",
        "htmlform-invalid-input": "আপনার প্রদানকৃত ইনপুটে সমস্যা রয়েছে",
        "htmlform-select-badoption": "যে মান আপনি উল্লেখ করেছেন তা গ্রহণযোগ্য অপশন নয়।",
        "htmlform-int-invalid": "আপনার পরিবর্তীত সংখ্যাটি ইন্টিজার(পূর্ণসংখ্যা) নয়।",
        "htmlform-user-not-valid": "<strong>$1</strong> একটি বৈধ ব্যবহারকারীর নাম নয়।",
        "logentry-delete-delete": "$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে",
        "logentry-delete-delete_redir": "$1 পুনর্লিখনের দ্বারা $3 পুনর্নির্দেশ {{GENDER:$2|অপসারণ করেছেন}}",
-       "logentry-delete-restore": "$1 কর্তৃক $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে",
+       "logentry-delete-restore": "$1 $3 পাতাটি {{GENDER:$2|পুনরুদ্ধার করেছেন}} ($4)",
+       "logentry-delete-restore-nocount": "$1 $3 পাতাটি {{GENDER:$2|পুনরুদ্ধার করেছেন}}",
+       "restore-count-revisions": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}}",
+       "restore-count-files": "{{PLURAL:$1|১টি ফাইল|$1টি ফাইল}}",
        "logentry-delete-event": "$1 {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
        "logentry-delete-revision": "$1 {{PLURAL:$5|একটি সংস্করণের|$5টি সংস্করণের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
        "logentry-delete-event-legacy": "$1 $3টায় লগ ইভেন্টসমূহের দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন",
        "logentry-import-interwiki": "$1 অন্য একটি উইকিতে থেকে $3 {{GENDER:$2|আমদানি করেছে}}",
        "logentry-import-interwiki-details": "$1 $5 থেকে $3 {{GENDER:$2|আমদানি করেছেন}} ($4টি {{PLURAL:$4|সংশোধন}})",
        "logentry-merge-merge": "$1 $4-এ $3 {{GENDER:$2|একত্রীকরণ করেছেন}} ($5 তারিখের সংশোধন পর্যন্ত)",
-       "logentry-move-move": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে {{GENDER:$2|স্থানান্তর}} করেছেন",
-       "logentry-move-move-noredirect": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
-       "logentry-move-move_redir": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার মাধ্যমে {{GENDER:$2|স্থানান্তর}} করেছেন",
-       "logentry-move-move_redir-noredirect": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
+       "logentry-move-move": "$1 $3 কে $4 শিরোনামে {{GENDER:$2|স্থানান্তর}} করেছেন",
+       "logentry-move-move-noredirect": "$1 $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
+       "logentry-move-move_redir": "$1 $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার মাধ্যমে {{GENDER:$2|স্থানান্তর}} করেছেন",
+       "logentry-move-move_redir-noredirect": "$1 $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
        "logentry-patrol-patrol": "$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন",
        "logentry-patrol-patrol-auto": "$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন",
        "logentry-newusers-newusers": "$1 ব্যবহারকারী অ্যাকাউন্টটি {{GENDER:$2|তৈরি করা}} হয়েছে",
        "logentry-protect-protect-cascade": "$1 $3 {{GENDER:$2|সুরক্ষিত করেছেন}} $4 [প্রপাতাকার]",
        "logentry-protect-modify": "$1 $3-এর জন্য সুরক্ষা স্তর {{GENDER:$2|পরিবর্তন করেছেন}} $4",
        "logentry-protect-modify-cascade": "$1 $3-এর জন্য সুরক্ষা স্তর {{GENDER:$2|পরিবর্তন করেছেন}} $4 [প্রপাতাকার]",
-       "logentry-rights-rights": "$1 ব্যবহারকারী, {{GENDER:$6|$3}}-এর দলগত সদস্যপদ $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন",
+       "logentry-rights-rights": "$1 {{GENDER:$6|$3}}-এর দলীয় সদস্যপদ $4 থেকে $5-এ {{GENDER:$2|পরিবর্তন}} করেছেন",
        "logentry-rights-rights-legacy": "$1 দলের সদস্যপদ পরিবর্তন করেছেন {{GENDER:$2|changed}} এর জন্য $3",
        "logentry-rights-autopromote": "$1 স্বয়ংক্রিয়ভাবে $4 থেকে $5-এ {{GENDER:$2|উন্নীত}} হয়েছেন",
        "logentry-upload-upload": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
        "logentry-upload-overwrite": "$1 $3-এর একটি নতুন সংস্করণ {{GENDER:$2|আপলোড করেছেন}}",
        "logentry-upload-revert": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
        "log-name-managetags": "ট্যাগ ব্যবস্থাপনা লগ",
+       "log-description-managetags": "এই পাতাতে [[Special:Tags|ট্যাগ]] ব্যবস্থাপনা কার্যাবলির একটি তালিকা আছে। এই লগে কেবলমাত্র সেইসব কর্মের তালিকা আছে, যেগুলি একজন প্রশাসক নিজ হাতে সম্পাদন করেছেন; উইকি সফটওয়্যার দিয়ে ট্যাগ সৃষ্টি বা অপসারণ করা সম্ভব, যার কোন ভুক্তি এই লগে সংরক্ষিত হবে না।",
        "logentry-managetags-create": "$1 \"$4\" ট্যাগটি {{GENDER:$2|তৈরি করেছেন}}",
        "logentry-managetags-delete": "$1 \"$4\" ট্যাগটি {{GENDER:$2|অপসারণ করেছেন}} ($5টি {{PLURAL:$5|সংস্করণ বা লগ ভুক্তি|সংস্করণ ও/বা লগ ভুক্তি}} সরানো হয়েছে)",
+       "logentry-managetags-activate": "$1 \"$4\" ট্যাগটি ব্যবহারকারী ও বট দ্বারা ব্যবহারের জন্য {{GENDER:$2|সক্রিয়}} করেছেন",
        "logentry-managetags-deactivate": "$1 \"$4\" ট্যাগটি ব্যবহারকারী ও বট দ্বারা ব্যবহারের জন্য {{GENDER:$2|নিষ্ক্রিয়}} করেছেন",
        "log-name-tag": "ট্যাগ লগ",
+       "log-description-tag": "এই পাতাতে দেখানো হয়েছে কখন কখন ব্যবহারকারীরা নির্দিষ্ট সংশোধন বা লগ ভুক্তিতে [[Special:Tags|ট্যাগ]] যোগ বা সেখান থেকে ট্যাগ অপসারণ করেছেন। যখন কোন সম্পাদনা, অপসারণ বা এই জাতীয় কর্মের অংশ হিসেবে ট্যাগ করা হয়, সেই ট্যাগগুলি এই লগে তালিকাভুক্ত করা হয় না।",
+       "logentry-tag-update-add-revision": "$1 $3 পাতার $4 নং সংস্করণে $6 {{PLURAL:$7|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|যোগ করেছেন}}",
+       "logentry-tag-update-add-logentry": "$1 $3 পাতার $5 নং লগ ভুক্তিতে $6 {{PLURAL:$7|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|যোগ করেছেন}}",
+       "logentry-tag-update-remove-revision": "$1 $3 পাতার $4 নং লগ সংস্করণ থেকে $8 {{PLURAL:$9|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|সরিয়েছেন}}",
+       "logentry-tag-update-remove-logentry": "$1 $3 পাতার $5 নং লগ ভুক্তি থেকে $8 {{PLURAL:$9|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|সরিয়েছেন}}",
+       "logentry-tag-update-revision": "$1 $3 পাতার $4 নং সংস্করণের ট্যাগগুলি {{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": "সম্পাদনা সারাংশ",
        "rightslogentry-temporary-group": "$1 (সাময়িক, $2 পর্যন্ত)",
        "feedback-adding": "পাতায় প্রতিক্রিয়া যোগ হচ্ছে...",
        "feedback-back": "পিছনে",
        "pagelang-reason": "কারণ",
        "pagelang-submit": "জমা দাও",
        "pagelang-nonexistent-page": "$1 শিরোনামে কোন পাতা নেই।",
-       "pagelang-db-failed": "ডাটাবেস পৃষ্ঠার ভাষা পরিবর্তন করতে ব্যর্থ হয়েছে।",
+       "pagelang-unchanged-language": "$1 পাতাটি ইতিমধ্যে $2 ভাষায় নির্ধারণ করা আছে।",
+       "pagelang-unchanged-language-default": "$1 পাতাটি ইতিমধ্যেই উইকির পূর্বনির্ধারিত বিষয়বস্তুর ভাষায় নির্ধারণ করা আছে।",
+       "pagelang-db-failed": "ডাটাবেস পাতার ভাষা পরিবর্তন করতে ব্যর্থ হয়েছে।",
        "right-pagelang": "পাতার ভাষা পরিবর্তন করুন",
        "action-pagelang": "পাতার ভাষা পরিবর্তন করুন",
        "log-name-pagelang": "ভাষা পরিবর্তন লগ",
        "log-description-pagelang": "এটি পাতার ভাষা পরিবর্তনের লগ।",
        "logentry-pagelang-pagelang": "$1 $3-এর ভাষা $4 থেকে $5-এ {{GENDER:$2|পরিবর্তন}} করেছেন",
+       "default-skin-not-found": "ওহো! আপনার উইকির পূর্বনির্ধারিত আবরণ, যেটি <code dir=\"ltr\">$wgDefaultSkin</code>-এ <code>$1</code> হিসেবে সংজ্ঞায়িত, সেটি পাওয়া যাচ্ছে না।\n\nআপনার ইনস্টলেশনে মনে হচ্ছে নিম্নোক্ত {{PLURAL:$4|আবরণ|আবরণগুলি}} অন্তর্ভুক্ত আছে। কী করে {{PLURAL:$4।|এটি|এগুলি}} সক্রিয় করতে হবে এবং পূর্বনির্ধারিতটি নির্বাচন করতে হবে, তার জন্য [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] দেখুন। \n\n$2\n\n; যদি আপনি খুব সম্প্রতি মিডিয়াউইকি ইন্সটল করে থাকেন:\n: আপনি সম্ভবত গিট থেকে অথবা সরাসরি উৎস কোড থেকে অন্য কোন পদ্ধতি অনুসরণ করে ইন্সটল করেছেন। এমনটাই প্রত্যাশিত।  [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 গিট ব্যবহার করে বহিরাবরণ ডাউনলোড করতে পারেন]\n: আপনি যদি মিডিয়াউইকি ডেভেলপার হয়ে থাকেন, তাহলে এ কাজটি করলে আপনার গিট সংগ্রহশালার সাথে এটির সংঘাত হবে না।\n; আপনি যদি খুব সম্প্রতি মিডিয়াউইকির সর্বশেষ সংস্করণে হালনাগাদ করে থাকেন:\n: মিডিয়াউইকির ১.২৪ এবং নতুনতর সংস্করণগুলি ইন্সটলকৃত আবরণগুলি আর স্বয়ংক্রিয়ভাবে সক্রিয় করে না। ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery] দেখুন)। আপনি <code>LocalSettings.php</code> ফাইলটির ভেতরে নিম্নোক্ত  {{PLURAL:$5|লাইন|লাইনগুলি}} সেঁটে ইন্সটলকৃত {{PLURAL:$5|আবরণ|আবরণগুলি}} সক্রিয় করতে পারেন:\n\n<pre dir=\"ltr\">$3</pre>\n\n; আপনি যদি খুব সম্প্রতি <code>LocalSettings.php</code> পরিবর্তন করে থাকেন:\n: বানান ত্রুটির জন্য বহিরাবরণের নামগুলি পুনরায় পরীক্ষা করুন।",
+       "default-skin-not-found-no-skins": "ওহো! আপনার উইকির পূর্বনির্ধারিত, যেটি <code dir=\"ltr\">$wgDefaultSkin</code>-এ <code>$1</code> হিসেবে সংজ্ঞায়িত, সেটি পাওয়া যাচ্ছে না।\n\nআপনার কোন আবরণ ইন্সটল করা হয়নি।\n\n; যদি আপনি খুব সম্প্রতি মিডিয়াউইকি ইন্সটল করে থাকেন বা মিডিয়াউইকির সর্বশেষ সংস্করণে হালনাগাদ করে থাকেন:\n: আপনি সম্ভবত গিট থেকে অথবা সরাসরি উৎস কোড থেকে অন্য কোন পদ্ধতি অনুসরণ করে ইন্সটল করেছেন। এমনটাই প্রত্যাশিত। মিডিয়াউইকির ১.২৪ এবং নতুনতর সংস্করণগুলি মূল সংগ্রহশালাতে এখন আর কোন আবরণ অন্তর্ভুক্ত থাকে না। আর স্বয়ংক্রিয়ভাবে সক্রিয় করে না।  [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 গিট ব্যবহার করে বহিরাবরণ ডাউনলোড করতে পারেন]\n: আপনি যদি মিডিয়াউইকি ডেভেলপার হয়ে থাকেন, তাহলে এ কাজটি করলে আপনার গিট সংগ্রহশালার সাথে এটির সংঘাত হবে না।([https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration]-এ দেখুন) কীভাবে বহিরাবরণগুলি সক্রিয় করতে হয় এবং কোন আবরণটি পুনর্নির্ধারিত হবে, তা কীভাবে নির্বাচন করতে হয়।",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (সক্রিয় করা)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>নিষ্ক্রিয় করা</strong>)",
        "mediastatistics": "মিডিয়া পরিসংখ্যান",
        "json-error-ctrl-char": "অক্ষর নিয়ন্ত্রণ ত্রুটি, সম্ভবত ভুল এনকোডকৃত",
        "json-error-syntax": "সিনট্যাক্স ত্রুটি",
        "json-error-utf8": "ত্রুটিপূর্ণ ইউটিএফ-৮ অক্ষর, সম্ভবত ভুল এনকোডকৃত",
+       "json-error-recursion": "যে মানটি এনকোড করা হবে সেটিতে এক বা তার অধিক রিকার্সিভ সূত্র আছে",
+       "json-error-inf-or-nan": "এনকোড করার জন্য মানে এক বা একাধিক NAN অথবা INF মান বিদ্যমান",
        "json-error-unsupported-type": "এনকোড করা যাবে না এমন একটি মানের ধরন দেয়া হয়েছে",
        "headline-anchor-title": "এই অনুচ্ছেদে সংযোগ",
        "special-characters-group-latin": "লাতিন",
        "special-characters-group-thai": "থাই",
        "special-characters-group-lao": "লাও",
        "special-characters-group-khmer": "খেমার",
+       "special-characters-group-canadianaboriginal": "কানাডীয় আদিবাসী",
        "special-characters-title-endash": "en ড্যাশ",
        "special-characters-title-emdash": "em ড্যাশ",
        "special-characters-title-minus": "বিয়োগ চিহ্ন",
        "mw-widgets-titleinput-description-redirect": "$1-এ পুনঃনির্দেশিত",
        "mw-widgets-categoryselector-add-category-placeholder": "একটি বিষয়শ্রেণী যোগ করুন...",
        "mw-widgets-usersmultiselect-placeholder": "আরও যোগ করুন...",
+       "date-range-from": "এ তারিখ থেকে:",
+       "date-range-to": "এ তারিখ পর্যন্ত:",
        "sessionmanager-tie": "একাধিক অনুরোধের প্রমাণীকরণের ধরন একত্রিত করা যাবে না: $1।",
        "sessionprovider-generic": "$1টি সেশন",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "কুকি-ভিত্তিক সেশন",
        "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-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-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-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-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",
        "restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
        "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে ব্যবহার করুন: :<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "সংশোধন $1",
-       "pageid": "পাতার আইডি $1"
+       "pageid": "পাতার আইডি $1",
+       "rawhtml-notallowed": "&lt;html&gt; ট্যাগ স্বাভাবিক পৃষ্ঠাগুলির বাহিরে ব্যবহার করা যাবে না।",
+       "gotointerwiki": "{{SITENAME}} ছেড়ে যাচ্ছেন",
+       "gotointerwiki-invalid": "নিদিষ্টকৃত শিরোনামটি অবৈধ ছিল।",
+       "gotointerwiki-external": "আপনি [[$2]] পরিদর্শন করতে {{SITENAME}} ছাড়তে চলেছেন যা একটি ভিন্ন ওয়েবসাইট।\n\n'''[$1 $1-এ চলুন]'''",
+       "undelete-cantedit": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ আপনার এই পাতাটি সম্পাদনা করার অনুমতি নেই।",
+       "undelete-cantcreate": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ এই নামে কোন পাতা বিদ্যমান নেই ও আপনার এই পাতাটি তৈরি করার অনুমতি নেই।"
 }
index f1b084d..d989014 100644 (file)
        "externaldberror": "ডাটেবেজর মা বেসেপ আহান ইসে নাইলে তরতা বারেদের একাউন্ট বদালানির য়্যাথাং নেই।",
        "login": "হমানি",
        "nav-login-createaccount": "লগইন / একাউন্ট খুল",
-       "userlogin": "হমানি / নৱা একাউন্ট খুলানি",
-       "userloginnocreate": "লগইন",
        "logout": "নিকুলানি",
        "userlogout": "নিকুলানি",
        "notloggedin": "তি লগ-ইন নাকরিসত",
-       "nologin": "তরতা একাউন্টহান নেই থাং? $1",
-       "nologinlink": "একাউন্ট আহান খুল",
        "createaccount": "একাউন্ট খুল",
-       "gotaccount": "মান্নাপা একাউন্ট আহান আগেত্তর আসে? '''$1'''।",
-       "gotaccountlink": "লগইন",
-       "userlogin-resetlink": "তর লগইন করানির পৌ পাহুরলেথাঙ?",
        "createaccountmail": "ই-মেইলন",
-       "createaccountreason": "কারণ:",
        "badretype": "খন্তাচাবি (password) দ্বিয়গি না মিলের।",
        "userexists": "এরে আতাকুরার নাঙ এহান আরাক আগই আগে ব্যবহার করিসে। \nতি আরাক নাঙ আহান বাছ।",
        "loginerror": "লগইনে লালুইসে",
        "prefs-resetpass": "খন্তাচাবি সিলকর",
        "prefs-email": "ই-মেইল অপশনহানি",
        "saveprefs": "ইতু",
-       "columns": "দুরগিঃ",
        "timezoneregion-africa": "আফ্রিকা",
        "timezoneregion-america": "আমেরিকা",
        "timezoneregion-antarctica": "এন্টার্টিকা",
        "rcshowhideanons": "$1 হারানাপাসি আতাকুরা",
        "rcshowhidepatr": "$1 পাহারাত আসে পতানি",
        "rcshowhidemine": "$1 মর পাতানিহানি",
-       "rclinks": "গেলগা $1 হান পতানি দেখাদে $2 দিনরতা <br />$3",
+       "rclinks": "গেলগা $1 হান পতানি দেখাদে $2 দিনরতা",
        "diff": "ফারাক",
        "hist": "ইতিহাসহান",
        "hide": "আরুম",
        "revdelete-restricted": "ডান্ডিকরেকুরাগরাঙ সীমাবদ্ধতাহানি ফলা",
        "revdelete-unrestricted": "ডান্ডিকরেকুরাগরাঙ সীমাবদ্ধতাহানি নেইকর",
        "rightsnone": "(নেই)",
-       "revdelete-summary": "সারাংশ পতানি",
        "searchsuggest-search": "বিসারা",
        "searchsuggest-containing": "আসেতা...",
        "special-characters-group-latin": "লাতিন",
index c1a13dd..1ecfc7e 100644 (file)
@@ -31,8 +31,9 @@
        "tog-enotifminoredits": "امیل به مو سی صفحات ناقص اصلاح شده",
        "tog-enotifrevealaddr": "نشودادن امیل مو درامیلهای آگاهی-خبری",
        "tog-shownumberswatching": "نشودادن شماره کاربران درحال کار یاتماشا",
-       "tog-fancysig": "امضاهای ناتمام - بدون لینکهای اتوماتیک",
-       "tog-uselivepreview": "استفاده زه پیش نمایش زنده(جاوااسکریپ) (تجربی )",
+       "tog-oldsig": "امضا ایسنی",
+       "tog-fancysig": "امضایل ناتموم",
+       "tog-uselivepreview": "پیش سئیل زندە ڤن ڤا کار",
        "tog-forceeditsummary": "یادآوری سریع به مو هنگام اصلاح عقیم وخلاصه",
        "tog-watchlisthideown": "قایم کردن اصلاحات مو  زه لیست پیگیریها",
        "tog-watchlisthidebots": "قایم کردن اصلاحات بوت زه لیست پیگیریها",
        "yourdomainname": "پوشگر ايسا:",
        "login": "اویدن به سیستم",
        "nav-login-createaccount": "اویدن به سیستم",
-       "userlogin": "اویدن به سیستم / درست کردن حساب کاربری",
-       "userloginnocreate": "ڤامین اوڤیڌن",
        "logout": "رهدن زه سیستم",
        "userlogout": "رهدن زه سیستم",
        "userlogin-noaccount": "یأ هساڤ کارياري دارين؟",
        "userlogin-joinproject": "أندوم ديارگأ {{SITENAME}} ڤابۈین",
-       "nologin": "آیا ایسا حساب کاربری ندارین? '''$1'''.",
-       "nologinlink": "درست کردن یه حساب کاربری",
        "createaccount": "درست کردن حساب کاربری",
-       "gotaccount": "آیا تقریبا یه حساب کاربری دارین? '''$1'''.",
-       "gotaccountlink": "اویدن به",
        "userlogin-resetpassword-link": "رازینإ گوڤأرتن تۈ ز ڤيرتۈن رأهڌإ",
        "userlogin-helplink2": "هومياري کردن سي ڤامإن أڤوڌن",
+       "createacct-emailrequired": "تيرنشۈن أنجومانامأ",
        "createacct-emailoptional": "تيرنشۈن أنجومانامأ",
        "createacct-email-ph": "تيرنشۈن أنجومانامأ تۈنأ بزنين",
-       "createaccountreason": "دلیل:",
+       "createacct-another-email-ph": "تيرنشۈن أنجومانامأ تۈنأ بزنين",
        "createacct-reason": "دلیل",
        "createacct-submit": "هساڤ خوتۈنإ راسد کونين",
        "createacct-another-submit": "راسد کردن هساڤ کارياري",
+       "createacct-benefit-heading": "{{SITENAME}}  ڤئ دسد خلکي چي ايسا رأڤأندیاری ڤابيڌإ.",
        "createacct-benefit-body1": "{{PLURAL:$1|ڤيرایشد|ڤيرایشدا}}",
        "createacct-benefit-body2": "{{PLURAL:$1|بألگأ|بألگإ آ}}",
        "createacct-benefit-body3": "تازأ{{PLURAL:$1|هوميار|هوميارا}}",
        "noemail": "وجود نداره نشانی امیل ضبط وابده زه کاریر \"$1\".",
        "passwordsent": "یه رمز تازه ارسال وابید به نشانی امیل ثبت وابده سی \"$1\".\nلطفا بعد از دریافت آن داخل سیستم بوین.",
        "eauthentsent": "یه ایمیل سی تایید آدرس ایمیل به آدرس مورنظر ارسال وابید. قبل زه یو که ایمیل دیگری قابل ارسال به این آدرس بوه، وا دستورهایی که در آن ایمیل اویده را جهت تأیید ای مساله که ای آدرس مال ایسانه اجرا کنین.",
+       "emaildisabled": "اي ديارگأ نترإ إنجومانامإ سيتۈن بفرشنإ",
        "accountcreated": "هساڤ راسد ڤابي",
+       "createaccount-title": "هساڤ سي {{SITENAME}} راسد ڤابي",
        "loginlanguagelabel": "زۈن:$1",
        "pt-login": "ڤامین اوڤیڌن",
        "pt-login-button": "ڤامین اوڤیڌن",
        "passwordreset-username": "نوم کارياري",
        "passwordreset-domain": "پوشگر",
        "passwordreset-email": "تيرنشۈن أنجومانامأ",
+       "passwordreset-emailtitle": "جوزيات هساڤ مإن{{SITENAME}}",
+       "passwordreset-invalidemail": "تيرنشۈن أنجومانامأ نادوروسد",
+       "changeemail-oldemail": "تيرنشۈن أنجومانامإ ايسني",
+       "changeemail-newemail": "تيرنشۈن أنجومانامإ تازأ:",
        "changeemail-none": "(هيش كوم)",
+       "changeemail-password": "رازينإ گوڤأرتن {{SITENAME}} ایسا:",
+       "changeemail-submit": "آلشد کردن أنجومانامأ",
+       "resettokens": "ز نۉ کردن نشۈنإیل",
+       "resettokens-tokens": "نشۈنإیل:",
+       "resettokens-token-label": "$1 (أرزایشت تازأ: $2)",
        "bold_sample": "متن گپ نما",
        "bold_tip": "متن گپ نما",
        "italic_sample": "متن شکسته",
        "preview": "پیش نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "نشودادن تغییرات",
-       "anoneditwarning": "'''توجه:''' ایسا داخل سیستم نوابیدین.\nآی پی آدرستو درگزارش اصلاح صفحه ضبط ابوه.",
+       "anoneditwarning": "<strong>زئنار:</strong> شوما هأنی نیوٙمایتە ڤامین. تیرنئشوٙن آی پی شوما سی هأر گاتی کئ آلئشتکاری بأکیت سی کول خألک دیاری می کە. أر <strong>[$1 روئیت ڤامین]</strong> یا <strong>[$2 یئ گئل حئساڤ کاریاری راس بأکیت]</strong>، ڤیرایئشتیا شوما ڤئ نوم کاریاری خوتوٙ دیاری می کە و سی شوما بیتأرە.",
        "summary-preview": "پیش نمایش - خلاصه:",
        "blockedtext": " \"'''دسترسی نام کاربری یا نشانی اینترنتی ایسا بسته وابیده.'''\nای کار توسط $1 انجام شده‌است.\nدلیلی که گده اینه: $2''\n* آغاز قطع دسترسی: $8\n* زمان اتمام ای قطع دسترسی: $6\n* کاربری که قطع دسترسی‌اش در نظر بیده: $7\nایساترین با $1 یا یکی از [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرین و در ای باره صحبت کنین.\nتوجه کنین که ایسا نترین زه امکان «ارسال پست الکترونیکی به ای کاربر» استفاده کنین مگر این که نشانی پست الکترونیکی معتبری در [[Special:Preferences|اولویتهای کاربری]]خود ثبت کرده بوین.\nنشانی IP ایسا $3 و شماره قطع دسترسی ایسا $5 است. لطفاً ای شماره‌ها را در همه کاوشهاتون ذکر کنین.\nایسا ترین با $1 یا یکی دیه زه [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرین، تا در باره ای قطع دسترسی صحبت کنین.\nدقت کنین که سی ارسال پست الکترونیکی در ویکی، وا پست الکترونیکی خود را زه طریق صفحه[[Special:Preferences|تنظیمات]] فعال کرده بوین، و نیز، وا امکان استفاده زه ای ویژگی سی ایساقطع نبوه.\nنشانی اینترنتی الان ایسا $3 است و شماره قطع دسترسی $5 است.\nلطفاً ای شماره را در هر درخواستی که در ای مورد مطرح اکنین ذکر کنین",
        "loginreqtitle": "ڤامإن إڤوڌن لازومإ",
        "newarticle": "(تازه)",
        "newarticletext": "ايسا ز دين یأ هومپیڤأندي هڌين کإ نيڌس. سي رأڤأندياري بألگإ شورۈ کونين مإن اي جأڤإ دإڤۈني بنڤيسين(سي دونسدن بیشدر سإیل [$1]کونین).\nأر ايسا سي إشتڤاکاري ايچونين، دوگمإ رأهڌن ڤاپوشد نأ بپۈرنين.",
        "noarticletext": " ايسإ اي بألگإ نإڤشدإیي نارإ، ايسا تإرين [[Special:Search/{{PAGENAME}}داسۈن اي بألگإ نإ مإن بألگإآ ديأري پی جۈري کونين]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اي بألگإ نأ ڤيرایشد کونين].",
+       "noarticletext-nopermission": " ايسإ اي بألگإ نإڤشدإیي نارإ، ايسا تإرين [[Special:Search/{{PAGENAME}}داسۈن اي بألگإ نإ مإن بألگإآ ديأري پی جۈري کونين]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اي بألگإ نأ ڤيرایشد کونين].",
        "previewnote": "'''ای فقط یه پیش نمایشه;\nتغییراتی که ایسا دادین هنی ضبط نوابیده!'''",
        "editing": "درحال اصلاح $1",
        "creating": "راسد کردن $1",
        "templatesusedpreview": "قالبها  یا الگوهای استفاده وابیده در ای پیش نمایش:",
        "template-protected": "(تحت حمایت)",
        "template-semiprotected": "(نیمه حمایت وابیده)",
+       "hiddencategories": "اي بلگأ یکي ز أندوما {{PLURAL:$1|1 hidden category|$1 hidden categories}} إ:",
        "nocreatetext": "{{SITENAME}}قابلیت درست کردن صفحات تازه را محدود کرده‌. ترین برگردین و صفحه‌ موجود را اصلاح کنین یا اینکه  [[Special:UserLogin|به سیستم داخل بوین یا حساب کاربری درست کنین]].",
        "permissionserrorstext-withaction": "ايسا سی نياگري $2 سإلا\nنارين {{PLURAL:$1|دلیل|دليلا}}:",
        "recreate-moveddeleted-warn": "'''هشدار: ایسا در حال درست کردن دوباره صفحه‌ای هدین که قبلاً حذف وابیده '''در نظر داشته بوین که ادامه اصلاح ای صفحه کار درستی هده یا نه. نمایه حذف مربوط به ای صفحه سی راحتی کار در ادامه اویده",
        "lineno": "سطر $1:",
        "compareselectedversions": "مقایسه نسخه‌های انتخاب‌ وابیده",
        "editundo": "لغو اصلاح آخر",
+       "diff-multi-sameuser": "({{PLURAL:$1|یه دۈنإ نسقه مینجایی|$1 نسقه یل مینجایی}} ب دسد{{PLURAL:$2|کاریاری ديأ|$2 کاريارا}} نشۈن داڌإ نڤابيڌإ)",
        "searchresults": "نتيجأ آ پی جۈري سي",
        "searchresults-title": "نتيجإ آ پی جوري سي \"$1\"",
        "prevn": "قبلی {{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=|See also the page found with your search.|See also the search results found.}}",
        "searchprofile-articles": "بلگه آ مینونه دار",
        "searchprofile-images": "ڤارسگرا خلکمند",
        "searchprofile-everything": "همه چی",
        "search-suggest": "منزۈرت یو بي:$1",
        "search-interwiki-more": "(بيشدر)",
        "searchall": "همه",
+       "search-showingresults": "{{PLURAL:$4|نتیجه یل<strong>$1</strong> د <strong>$3</strong>|نتیجه یل<strong>$1 - $2</strong د <strong>$3</strong>}}",
        "search-nonefound": "هیژ نتیجه یی وا پی جست تو یکی نئ.",
        "powersearch-toggleall": "همأ",
        "powersearch-togglenone": "هيش کوم",
        "enhancedrc-history": "ڤیرگار",
        "recentchanges": "تغییرات اخیر",
        "recentchanges-legend": "گزينإ آ آلشدا ايسإني",
+       "recentchanges-summary": "دو بیشتر آلشدا تازباو نه د ویکی نه د ای بلگه پیگری کو.",
        "recentchanges-feed-description": "ردیابی آخرین تغییرات  ویکی در ای خورد",
        "recentchanges-label-newpage": "ای ويرايشت يه بلگه تازه راس كرده",
        "recentchanges-label-minor": "یو یه ويرايشت کوچيره",
        "recentchangeslinked-title": "تغییرهای مرتبط با $1",
        "recentchangeslinked-summary": " ای صفحه خاص تغییرات اخیر در صفحه‌های لینک داده شده به این صفحه را نشو اده.\nصفحه‌هایی که در لیست پی‌گیریهای ایسا بون به شکل '''سیاه''' نشو داده ابون.",
        "recentchangeslinked-page": "نوم بألگە:",
+       "recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
        "upload": "آپلود فایل",
        "uploadbtn": "آپلود فایل",
        "uploadlogpage": "نمایه آپلود",
        "tooltip-recreate": "دوباره درست کردن صفحه ای که زه رو کینه وغرض پاک وابیده",
        "tooltip-upload": "شروع آپلود",
        "tooltip-rollback": "\"اعاده\" برگرداندن به وضع اولیه سی ای صفحه که بخاطر مشارکت  آخر اصلاح وابیده بایک کلیک",
+       "tooltip-undo": "انجوم نگرتن ای ویرایشت ورگن و همه فرمیا ویرایشت تانه که حالت پیش سیل واکو.یه اجازه میئه سی اضاف کردن یه دلیل د چکسته.",
        "tooltip-summary": "یأ چکسدأ کۈچير ڤارڌ کونين",
        "simpleantispam-label": "Anti-spam check.\nپور<strong>نکنين</strong> ايچو نأ!",
        "pageinfo-toolboxlink": "دونسمندیا بلگه",
        "exif-software": "نرم افزار ب کارگرهڌني",
        "exif-exifversion": "نوسقإ Exif",
        "exif-colorspace": "رنگ ڤأرگأ",
+       "exif-datetimeoriginal": "گات و ڤخت راسد ڤابيإن دۈنسمنديا",
        "exif-datetimedigitized": "گات و وخت دیجیتالی کردن",
        "exif-orientation-1": "عادي",
        "namespacesall": "همه",
        "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",
index 9a1df69..4803927 100644 (file)
@@ -43,7 +43,7 @@
        "tog-previewonfirst": "Rakwelet tres ar bajenn kerkent hag an aozadenn gentañ",
        "tog-enotifwatchlistpages": "Kas ur postel din pa vez kemmet ur bajenn zo war ma roll evezhiañ",
        "tog-enotifusertalkpages": "Kas ur postel din pa vez kemmet ma fajenn gaozeal",
-       "tog-enotifminoredits": "Kas ur postel din, ha pa vije evit kemenn kemmoù dister",
+       "tog-enotifminoredits": "Kas ur postel din, ha pa vije evit kemenn kemmoù dister war pajennoù pe restroù",
        "tog-enotifrevealaddr": "Lakaat ma chomlec'h postel war wel er posteloù kemenn-diwall",
        "tog-shownumberswatching": "Diskouez an niver a lennerien",
        "tog-oldsig": "Ho sinadur evit poent :",
        "redirectedfrom": "(Adkaset eus $1)",
        "redirectpagesub": "Pajenn adkas",
        "redirectto": "Adkas da :",
-       "lastmodifiedat": "Kemmoù diwezhañ degaset d'ar bajenn-mañ, d'an/ar $1 da $2.",
+       "lastmodifiedat": "Kemmoù diwezhañ degaset d'ar bajenn-mañ d'an $1, da $2.",
        "viewcount": "Sellet ez eus bet {{PLURAL:$1|$1 wezh|$1 gwezh}} ouzh ar bajenn-mañ.",
        "protectedpage": "Pajenn warezet",
        "jumpto": "Mont da :",
        "ok": "Mat eo",
        "retrievedfrom": "Adtapet diwar « $1 »",
        "youhavenewmessages": "$1 zo ganeoc'h ($2).",
-       "youhavenewmessagesfromusers": "$1 ho peus eus {{PLURAL:$3|un implijer all|$3 implijer}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Bez' hoc'h eus}} $1 a-berzh {{PLURAL:$3|un implijer all|$3 implijer}} ($2).",
        "youhavenewmessagesmanyusers": " $1 ho peus implijerien a-leizh  ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|ur gemennad nevez|999=kemennadoù nevez}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|kemennad diwezhañ|999=kemennadoù diwezhañ}}",
-       "youhavenewmessagesmulti": "Kemennoù nevez zo ganeoc'h war $1",
+       "newmessageslinkplural": "{{PLURAL:$1|ur gemennadenn nevez|999=kemennadennoù nevez}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|kemm diwezhañ|999=kemmoù diwezhañ}}",
+       "youhavenewmessagesmulti": "Kemennadennoù nevez zo ganeoc'h war $1",
        "editsection": "kemmañ",
        "editold": "kemmañ",
        "viewsourceold": "sellet ouzh tarzh an destenn",
        "missingarticle-rev": "(adweladenn # : $1)",
        "missingarticle-diff": "(Dif : $1, $2)",
        "readonly_lag": "Stanket eo bet ar bank roadennoù ent emgefre p'emañ an eilservijerioù oc'h adpakañ o dale e-keñver ar pennservijer",
+       "nonwrite-api-promise-error": "Kaset e oa bet an talbenn HTTP 'Promise-Non-Write-API-Action' met savet e oa bet ar reked ouzh ur vodulenn skrivañ API.",
        "internalerror": "Fazi diabarzh",
        "internalerror_info": "Fazi diabarzh : $1",
+       "internalerror-fatal-exception": "Fazi groñs a seurt \"$1\"",
        "filecopyerror": "Dibosupl eilañ \"$1\" war-du \"$2\".",
        "filerenameerror": "Dibosupl da adenvel « $1 » e « $2 ».",
        "filedeleteerror": "Dibosupl eo diverkañ « $1 ».",
        "cannotdelete": "Dibosupl diverkañ ar bajenn pe ar restr \"$1\".\nMarteze e o bet diverket gant unan bennak all dija.",
        "cannotdelete-title": "N'haller ket diverkañ ar bajenn \"$1\"",
        "delete-hook-aborted": "Nullet ar c'hemmañ gant un astenn.\nAbeg dianav.",
+       "no-null-revision": "N'eus ket bet gallet krouiñ un adweladenn nevez c'houllo evit ar bajenn \"$1\"",
        "badtitle": "Titl fall",
        "badtitletext": "Faziek pe c'houllo eo titl ar bajenn goulennet; pe neuze eo faziek al liamm etreyezhel pe etrewiki.\nMarteze ez eus ennañ arouezennoù n'haller ket degemer en titloù.",
+       "title-invalid-empty": "Pe eo goullo titl ar bajenn c'houlennet pe n'eus ennañ nemet anv an esaouenn anv.",
+       "title-invalid-utf8": "Titl ar bajenn c'houlennet zo ennañ un heuliad UTF-8 direizh.",
+       "title-invalid-interwiki": "Titl ar bajenn c'houlennet zo ennañ ul liamm etrewiki n'haller ket ober gantañ en titloù.",
+       "title-invalid-talk-namespace": "Titl ar bajenn c'houlennet a ra dave d'ur bajenn gaozeal n'eus ket anezhi.",
+       "title-invalid-characters": "Titl ar bajenn c'houlennet zo ennañ arouezennoù direizh : \"$1\".",
+       "title-invalid-relative": "Un hent amvat zo gant an titl. Direizh eo titloù ar pajennoù amvat (./, ../) peogwir e vint dibosupl da dizhout dre merdeerioù implijet gant tud zo.",
+       "title-invalid-magic-tilde": "Titl ar bajenn c'houlennet zo ennañ un heuliad tildennoù burzhudus direizh (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Re hir eo titl ar bajenn c'houlennet. N'hall ket bezañ hiroc'h eget $1 {{PLURAL:$1|okted}} er c'hod UTF-8.",
+       "title-invalid-leading-colon": "Titl ar bajenn c'houlennet zo ennañ un daoubik direizh er penn-kentañ.",
        "perfcached": "Krubuilhet eo ar roadennoù da-heul ha marteze n'int ket bet hizivaet. D'ar muiañ e c'haller kaout {{PLURAL:$1|un disoc'h|$1 disoc'h}} er grubuilh.",
        "perfcachedts": "Krubuilhet eo ar roadennoù da-heul hag hizivaet int bet da ziwezhañ d'an $1. D'ar muiañ e c'haller kaout {{PLURAL:$4|un disoc'h|$4 disoc'h}} er grubuilh.",
        "querypage-no-updates": "Diweredekaet eo an hizivaat evit ar bajenn-mañ. Evit poent ne vo ket nevesaet ar roadennoù amañ.",
        "viewsource": "Sellet ouzh tarzh an destenn",
        "viewsource-title": "Gwelet an tarzh evit $1",
        "actionthrottled": "Ober daleet",
-       "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ù.",
+       "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 nebeudig 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ñ",
+       "viewsourcetext": "Gallout a rit gwelet hag eilañ mammenn 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",
+       "translateinterface": "Evit ouzhpennañ pe cheñch troidigezhioù en holl wikioù, grit gant [https://translatewiki.net/ translatewiki.net], anezhañ raktres lec'helaat MediaWiki.",
+       "cascadeprotected": "Gwarezet eo ar bajenn-mañ ; n'haller ket kemmañ anezhi ken p'he c'haver treuzkludet {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :\n$2",
        "namespaceprotected": "N'oc'h ket aotreet da gemmañ pajennoù an esaouenn anv '''$1'''.",
        "customcssprotected": "N'oc'h ket aotreet da gemmañ ar bajenn CSS-mañ rak kavout a reer enni arventennoù personel un implijer all.",
        "customjsprotected": "N'oc'h ket aotreet da gemmañ ar bajenn JavaScript-mañ rak kavout a reer enni arventennoù personel un implijer all.",
        "mypreferencesprotected": "N'ho peus ket ar gwirioù evit kemmañ ho Penndibaboù.",
        "ns-specialprotected": "N'haller ket kemmañ ar pajennoù en esaouenn anv {{ns:special}}.",
        "titleprotected": "Gwarezet eo bet an titl-mañ p'eo bet krouet gant [[User:$1|$1]].\nSetu amañ perak <em>$2</em>.",
-       "filereadonlyerror": "Dibosupl kemmañ ar restr \"$1\" abalamour m'emañ ar c'havlec'h restroù \"$2\" e mod lenn nemetken.\n\n\"''$3''\" eo an abeg roet gant ar merour en deus prennet anezhi.",
+       "filereadonlyerror": "Dibosupl kemmañ ar restr \"$1\" abalamour m'emañ ar c'havlec'h restroù \"$2\" e mod lenn nemetken.\n\n\"$3\" eo an abeg roet gant merour ar reizhiad en deus prennet anezhi.",
        "invalidtitle-knownnamespace": "Titl direizh gant an esaouenn anv \"$2\" hag an destenn \"$3\"",
        "invalidtitle-unknownnamespace": "Titl direizh gant an niverenn esaouenn anv $1 hag an destenn \"$2\" dianav",
        "exception-nologin": "N'oc'h ket kevreet",
        "login": "Kevreañ",
        "login-security": "Gwiriit hoc'h identelezh",
        "nav-login-createaccount": "Krouiñ ur gont pe kevreañ",
-       "userlogin": "Kevreañ / krouiñ ur gont",
-       "userloginnocreate": "Kevreañ",
        "logout": "Digevreañ",
        "userlogout": "Digevreañ",
        "notloggedin": "Digevreet",
        "userlogin-noaccount": "Kont ebet ganeoc'h c'hoazh ?",
        "userlogin-joinproject": "Kemer perzh e {{SITENAME}}",
-       "nologin": "N'hoc'h eus kont ebet ? $1.",
-       "nologinlink": "Krouiñ ur gont",
        "createaccount": "Krouiñ ur gont nevez",
-       "gotaccount": "Ur gont zo ganeoc'h dija ? '''$1'''.",
-       "gotaccountlink": "Kevreañ",
-       "userlogin-resetlink": "Ha disoñjet eo bet ho titouroù kevreañ ganeoc'h ?",
        "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.",
        "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ù",
        "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.",
+       "passwordtoolong": "N'hall ket ar gerioù-tremen bezañ enno ouzhpenn $1 {{PLURAL:$1|1 arouezenn|$1 arouezenn}}.",
+       "passwordtoopopular": "N'haller ket ober gant gerioù-ter boutin betek re. Grit gant ur ger-tremen raloc'h.",
        "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",
        "noemail": "N'eus bet enrollet chomlec'h postel ebet evit an implijer \"$1\".",
        "noemailcreate": "Ret eo deoc'h merkañ ur chomlec'h postel reizh",
        "passwordsent": "Kaset ez eus bet ur ger-tremen nevez da chomlec'h postel an implijer \"$1\".\nTrugarez deoc'h da gevreañ kerkent ha ma vo bet resevet ganeoc'h.",
-       "blocked-mailpassword": "N'haller ket kemmañ pajennoù gant ar chomlec'h IP-mañ ken rak stanket eo bet. Gant se n'hallit ket implijout an arc'hwel adtapout gerioù-tremen, kuit m'en em ledfe gwallimplijoù.",
+       "blocked-mailpassword": "N'haller ket kemmañ pajennoù gant ar chomlec'h IP-mañ ken rak stanket eo bet. Kuit m'en em ledfe gwallimplijoù n'hallit ket implijout an arc'hwel adtapout gerioù-tremen adalek ar chomlec'h IP-mañ.",
        "eauthentsent": "Kaset ez eus bet ur postel kadarnaat war-du ar chomlec'h postel spisaet.\nA-raok na vije kaset postel ebet d'ar gont-se e vo ret deoc'h heuliañ ar c'huzulioù merket er postel resevet evit kadarnaat ez eo mat ho kont deoc'h.",
        "throttled-mailpassword": "Kaset ez eus bet deoc'h ur postel adderaouekaat e-kerzh an\n{{PLURAL:$1|eurvezh|$1 eurvezh}} tremenet. Evit mirout ouzh nep gaou ne gaser ket ouzhpenn ur postel a seurt-se bep {{PLURAL:$1|eurvezh|$1 eurvezh}}.",
        "mailerror": "Fazi en ur gas ar postel : $1",
-       "acct_creation_throttle_hit": "{{PLURAL:$1|1 gont|$1 kont}} zo bet krouet c'hoazh nevez zo dre ho chomlec'h IP gant gweladennerien d'ar wiki-mañ, ar pezh zo an niver brasañ aotreet. Dre se, n'hall ket ket ar weladennerien a implij an IP-mañ krouiñ kontoù mui evit ar mare.",
+       "acct_creation_throttle_hit": "Gweladennerien zo o deus implijet ho chomlec'h IP evit krouiñ {{PLURAL:$1|1 gont|$1 kont}} e-kerzh an $2 diwezhañ, ar pezh zo an niver brasañ aotreet. Dre se, n'hall ket ket ar weladennerien a implij an IP-mañ krouiñ kontoù mui evit ar mare.",
        "emailauthenticated": "Gwiriet eo bet ho chomlec'h postel d'an $2 da $3.",
        "emailnotauthenticated": "N'eo ket bet gwiriekaet ho chomlec'h postel evit c'hoazh.\nNe vo ket tu da gas postel ebet deoc'h evit hini ebet eus an dezverkoù dindan.",
        "noemailprefs": "Merkit ur chomlec'h postel mar fell deoc'h ez afe an arc'hwelioù-mañ en-dro.",
        "botpasswords-label-delete": "Dilemel",
        "botpasswords-label-resetpassword": "Adderaouekaat ar ger-tremen",
        "botpasswords-label-grants": "Aotreoù a c'haller ober ganto :",
+       "botpasswords-help-grants": "Gant an aotreoù e c'haller kaout ar gwirioù grataet d'ho kont implijer. N'eo ket peogwir e vo gweredekaet un aotre amañ e vo digoret gwirioù ouzhpenn deoc'h estreget ar re zo stag ouzh ho kont implijer. Kit da welet [[Special:ListGrants|taolenn an aotreoù]] evit gouzout hiroc'h.",
        "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-created-title": "Ger-tremen robotoù krouet",
-       "botpasswords-created-body": "Krouet mat eo bet ar ger-tremen « $1 ».",
+       "botpasswords-created-body": "Krouet eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
        "botpasswords-updated-title": "Ger-tremen robotoù hizivaet",
-       "botpasswords-updated-body": "Hizivaet mat eo bet ar ger-tremen « $1 ».",
+       "botpasswords-updated-body": "Hizivaet mat eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
        "botpasswords-deleted-title": "Ger-tremen robotoù dilamet",
-       "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-deleted-body": "Dilamet eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
+       "botpasswords-newpassword": "<strong>\"$2\"</strong> eo ar ger-tremen nevez evit kevreañ ouzh <strong>$1</strong>. Enrollit anezhañ evit ober dave dezhañ diwezhatoc'h.</em>(Evit ar robotoù kozh zo rekis evito e vefe heñvel an anv kevreañ ouzh hini an implijer a c'hall bezañ, e c'hallit ober gant <strong>$3</strong> da anv implijer ha gant <strong>$4</strong> evel ger-tremen).",
        "botpasswords-no-provider": "N'eo ket hegerz BotPasswordsSessionProvider.",
+       "botpasswords-restriction-failed": "N'hallit ket kevreañ abalamour d'ar strishadurioù war gerioù-tremen ar robotoù.",
+       "botpasswords-invalid-name": "N'eus ket a zispartier gerioù-tremen robot en anv implijer spisaet (\"$1\").",
        "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-temp-password": "Ger-tremen da c'hortoz :",
        "resetpass-abort-generic": "Nullet eo bet kemm ar ger-tremen gant un astenn.",
        "resetpass-expired": "Deuet eo ho ker-tremen d'e dermen. Lakait ur ger-tremen nevez, mar plij, evit kevreañ.",
+       "resetpass-expired-soft": "Aet eo ho ker-tremen d'e dermen, ret eo adderaouekaat anezhañ. Dibabit ur ger-tremen nevez diouzhtu pe klikit war \"{{int:authprovider-resetpass-skip-label}}\" evit ober war-dro diwezhatoc'h.",
+       "resetpass-validity-soft": "Direizh eo ho ker-tremen : $1\n\nDibabit ur ger-tremen nevez diouzhtu, pe klikit war \"{{int:authprovider-resetpass-skip-label}}\" evit ober war-dro diwezhatoc'h.",
        "passwordreset": "Adderaouekaat ar ger-tremen",
        "passwordreset-text-one": "Leugnit ar furmskrid-mañ evit adderaouekaat ho ker-tremen.",
        "passwordreset-text-many": "{{PLURAL:$1|Leugnit unan eus ar maeziennoù da adderaouekaat ho ker-tremen.}}",
        "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.",
+       "passwordreset-emailsentemail": "Mard eo liammet ar chomlec'h postel-mañ ouzh ho kont, neuze e vo kaset ur postel deoc'h da adderaouekaat ho ker-tremen.",
+       "passwordreset-emailsentusername": "Mard eo liammet ar chomlec'h postel-mañ gant an anv implijer-mañ, neuze e vo kaset ur postel deoc'h da adderaouekaat ho ker-tremen.",
        "passwordreset-nocaller": "Ret eo merkañ anv ur galver",
        "passwordreset-nosuchcaller": "N'eus ket eus ar galver : $1",
+       "passwordreset-ignored": "N'eus ket bet gallet adderaouekaat ar ger-termen. Marteze a-walc'h peogwir n'eus ket bet kefluniet pourvezer ebet ?",
        "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-header": "Leuniit ar furmskrid-mañ evit cheñch ho chomlec'h postel. Mar fell deoc'h distagañ ur chomlec'h postel bennak diouzh ho kont, lezit goullo lec'h ar chomlec'h postel nevez a-raok kadarnaat ar furmskrid.",
        "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-newemail": "Chomlec'h postel nevez :",
+       "changeemail-newemail-help": "Goullo e tlefe chom ar vaezienn-mañ mar fell deoc'h lemel kuit ho chomlec'h postel. Ne viot ket gouest da adderaouekaat ur ger-tremen ankouaet ganeoc'h ken ha ne resevot postel ebet a-berzh ar wiki-mañ ma lamit kuit ar chomlec'h postel.",
        "changeemail-none": "(hini ebet)",
        "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-text": "Gallout a ri adderaouekaat amañ ar jedoueroù a aotre ac'hanoc'h da vont war roadennoù prevez zo hag a zo staget ouzh ho kont.\n\nMat e vefe deoc'h en ober m'hoc'h eus rannet anezho gant unan bennak dre fazi pe mard eo bet implijet ho kont gant unan bennak all mod pe vod.",
        "resettokens-no-tokens": "N'eus jedouer ebet da adderaouekaat.",
        "resettokens-tokens": "Jedoueroù :",
        "resettokens-token-label": "$1 (talvoud bremañ : $2)",
+       "resettokens-watchlist-token": "Jedouer evit lanvad web (Atom/RSS) [[Special:Watchlist|kemmañ pajennoù eus ho roll evezhiañ]]",
        "resettokens-done": "Jedoueroù adderaouekaet.",
        "resettokens-resetbutton": "Adderaouekaat ar jedoueroù diuzet",
        "bold_sample": "Testenn dev",
        "preview": "Rakwelet",
        "showpreview": "Rakwelet",
        "showdiff": "Diskouez ar c'hemmoù",
+       "blankarticle": "<strong>Taolit evezh :</strong> Goullo eo ar bajenn emaoc'h o krouiñ.\nMar klikit war \"$1\" en-dro e vo krouet hep netra ebet e-barzh.",
        "anoneditwarning": "</strong>Diwallit :</strong> N'oc'h ket kevreet.\nGallout a raio an holl dud gwelet ho chomlec'h IP ma rit kemmoù. Ma <strong>[$1kevreit]</strong>pe<strong>[$2 krouit ur gont]</strong>, e vo deroet ho kemmoù d'hoc'h anv-implijer, e-touez spletoù all.",
        "anonpreviewwarning": "''N'oc'h ket kevreet. Enrollañ a lakao war-wel ho chomlec'h IP e istor kemmoù ar bajenn.''",
        "missingsummary": "'''Taolit evezh:''' N'hoc'h eus ket lakaet tamm testenn diverrañ ebet evit ho kemmoù. Mar klikit war enrollañ en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
+       "selfredirect": "<strong>Taolit evezh :</strong> Emaoc'h oc'h adkas ar bajenn-mañ warni hec'h-unan.\nPe hoc'h eus spisaet ur pal a-dreuz evit an adkas pe emaoc'h o cheñch ur bajenn n'emañ ket da vezañ cheñchet evel-se.\nMar klikit war \"$1\" en-dro, e vo krouet an adkas forzh penaos.",
        "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.",
+       "missingcommentheader": "<strong>Taolit evezh :</strong> N'hoc'h eus lakaet tamm danvez/titl ebet d'hoc'h evezhiadenn.\nMar klikit war \"$1\" en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
        "summary-preview": "Rakwelet un diverrañ eus ar c'hemmoù :",
        "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ù.",
+       "systemblockedtext": "Stanket eo bet hoc'h anv implijer pe ho chomlec'h IP ent emgefre gant MediaWiki.\nSetu perak :\n\n:<em>$2</em>\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Hinienn a sell ar stankadenn outi : $7\n\n$3 eo ho chomlec'h IP diouzhtu.\nMerkit mat ar munudoù skrivet a-us er c'hlemmoù a c'halljec'h ober.",
        "blockednoreason": "n'eus bet roet abeg ebet",
        "whitelistedittext": "Ret eo deoc'h en em $1 evit gallout skridaozañ.",
        "confirmedittext": "Rankout a ri bezañ kadarnaet ho chomlec'h postel a-raok gallout kemmañ pajennoù. Skrivit ha kadarnait ho chomlec'h postel en ho [[Special:Preferences|penndibaboù implijer]] mar plij.",
        "accmailtext": "Kaset ez eus bet ur ger-tremen dargouezhek evit [[User talk:$1|$1]] da $2. Cheñchet e c'hall ar ger-tremen evit ar gont nevez-mañ bezañ war ar bajenn ''[[Special:ChangePassword|cheñch ger-tremen]]'', ur wezh kevreet.",
        "newarticle": "(Nevez)",
        "newarticletext": "Heuliet hoc'h eus ul liamm a gas d'ur bajenn n'eo ket bet savet evit c'hoazh.\nA-benn krouiñ ar bajenn-se, krogit da skrivañ er prenestr skridaozañ dindan (gwelet ar [$1 bajenn skoazell] evit gouzout hiroc'h).\nM'emaoc'h en em gavet amañ dre fazi, klikit war bouton '''kent''' ho merdeer evit mont war ho kiz.",
-       "anontalkpagetext": "---- ''Homañ eo ar bajenn gaozeal evit un implijer(ez) dizanv n'eus ket krouet kont ebet evit c'hoazh pe na implij ket anezhi.\nSetu perak e rankomp ober gant ar chomlec'h IP niverel evit anavezout anezhañ/i.\nGallout a ra ur chomlec'h a seurt-se bezañ rannet etre meur a implijer(ez).\nMa'z oc'h un implijer(ez) dizanv ha ma stadit ez eus bet kaset deoc'h kemennadennoù na sellont ket ouzhoc'h, gallout a rit [[Special:CreateAccount|krouiñ ur gont]]pe [[Special:UserLogin|kevreañ]] kuit a vagañ muioc'h a gemmesk gant implijerien dizanv all.",
+       "anontalkpagetext": "<em>Homañ eo ar bajenn gaozeal evit un implijer dizanv n'en deus ket krouet kont ebet evit c'hoazh pe na implij ket anezhi</em>.\nSetu perak e rankomp ober gant ar chomlec'h IP niverel evit anavezout anezhañ.\nGallout a ra ur chomlec'h a seurt-se bezañ rannet etre meur a implijer.\nMa'z oc'h un implijer dizanv ha ma stadit ez eus bet kaset deoc'h kemennadennoù na sellont ket ouzhoc'h, gallout a rit [[Special:CreateAccount|krouiñ ur gont]] pe [[Special:UserLogin|kevreañ]] kuit a vagañ muioc'h a gemmesk gant implijerien dizanv all.",
        "noarticletext": "N'eus tamm skrid ebet war ar bajenn-mañ evit poent.\nGallout a rit [[Special:Search/{{PAGENAME}}|klask an titl anezhi]] e pajennoù all,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask en oberiadennoù liammet], pe [{{fullurl:{{FULLPAGENAME}}|action=edit}} krouiñ ar bajenn]</span>.",
        "noarticletext-nopermission": "N'eus, evit ar mare, tamm testenn ebet war ar bajenn-mañ.\nGallout a rit [[Special:Search/{{PAGENAME}}|klask titl ar bajenn-mañ]] war pajennoù all,\npe <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask er marilhoù kar]</span>, met n'oc'h ket aotreet da grouiñ ar bajenn-mañ.",
        "missing-revision": "N'eus ket eus adwel niv. $1 eus ar bajenn anvet « {{FULLPAGENAME}} ».\n\nC'hoarvezout a ra peurliesañ pa vez heuliet ul liamm istorel dispredet war-zu ur bajenn zo bet dilamet.\nGallout a reot kavout muioc'h a vunudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
        "userpage-userdoesnotexist": "N'eo ket enrollet ar gont \"<nowiki>$1</nowiki>\". Merkit ma fell deoc'h krouiñ/kemmañ ar bajenn-mañ.",
        "userpage-userdoesnotexist-view": "N'eo ket enrollet ar gont implijer \"$1\".",
        "blocked-notice-logextract": "Stanket eo an implijer-mañ evit poent.\nDindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
-       "clearyourcache": "Notenn :''' Goude bezañ enrollet ho pajenn e rankot freskaat krubuilh ho merdeer a-benn gwelet ar c'hemmoù.\n* '''Firefox / Safari:''' Derc'hel da bouezañ war ''Pennlizherenn'' en ur glikañ war ''Adkargañ'', pe pouezañ war ''Ctrl-F5'' pe ''Ctrl-R'' (''⌘-R'' war ur Mac); \n* ''''Google Chrome:''' Pouezañ war ''Ctrl-Pennlizh-R'' (''⌘-Shift-R'' war ur Mac)\n* '''Internet Explorer:''' Derc'hel da bouezañ war ''Ctrl'' en ur glikañ war ''Freskaat,'' pe pouezañ war ''Ctrl-F5''\n* ''''Konqueror: '''Klikañ war ''Adkargañ'' pe pouezañ war ''F5;'' \n* '''Opera:''' Riñsañ ar grubuilh e ''Ostilhoù → Penndibaboù''",
+       "clearyourcache": "<strong>Notenn :</strong> Goude bezañ enrollet ho pajenn e rankot freskaat krubuilh ho merdeer a-benn gwelet ar c'hemmoù.\n* <strong>Firefox / Safari:</strong> Derc'hel da bouezañ war <em>Pennlizherenn</em> en ur glikañ war <em>Adkargañ</em>, pe pouezañ war <em>Ctrl-F5</em> pe <em>Ctrl-R</em> (<em>⌘-R</em> war ur Mac); \n* <strong>Google Chrome:</strong> Pouezañ war <em>Ctrl-Pennlizh-R</em> (<em>⌘-Shift-R</em> war ur Mac)\n* <strong>Internet Explorer :</strong> Derc'hel da bouezañ war <em>Ctrl</em> en ur glikañ war <em>Freskaat</em>, pe pouezañ war <em>Ctrl-F5</em>\n* <strong>Konqueror :</strong> Klikañ war <em>Adkargañ</em> pe pouezañ war <em>F5</em>\n* <strong>Opera :</strong> Mont da <em>Arventennoù → lañser</em> (<em>Opera → Penndibaboù</em> war ur Mac) ha goude mont da <em>Prevezded & surentez → Riñsañ roadennoù ar grubuilh → Skeudennoù krubuilhet ha restroù</em>.",
        "usercssyoucanpreview": "'''Tun :''' Grit gant ar bouton \"{{int:showpreview}}\" evit testiñ ho follenn CSS nevez a-raok enrollañ anezhi.",
        "userjsyoucanpreview": "'''Tun :''' Grit gant ar bouton \"{{int:showpreview}}\" evit testiñ ho follenn JS nevez a-raok enrollañ anezhi.",
        "usercsspreview": "'''Dalc'hit soñj n'emaoc'h ken nemet o rakwelet ho follenn CSS deoc'h.'''\n'''N'eo ket bet enrollet evit c'hoazh!'''",
        "previewnote": "'''Diwallit mat, n'eus ken ur rakweled eus an destenn-mañ.'''\nN'eo ket bet enrollet ho kemmoù evit c'hoazh !",
        "continue-editing": "Mont d'an takad kemmañ",
        "previewconflict": "Gant ar rakweled e teu testenn ar bajenn war wel evel ma vo pa vo bet enrollet.",
-       "session_fail_preview": "'''Ho tigarez! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.'''\nKlaskit en-dro mar plij.\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ war-lerc'h.",
-       "session_fail_preview_html": "'''Ho tigarez! N'omp ket bet gouest da enrollañ ho kemmoù rak kollet ez eus bet roadennoù e-kerzh an dalc'h.'''\n\n''Gweredekaet eo al linennoù HTML e {{SITENAME}}. Rak-se eo kuzh ar rakweledoù a-benn en em zifenn diouzh an tagadennoù JavaScript.''\n\n'''Mard e oa onest ar c'hemmoù hoc'h eus klasket degas, klaskit en-dro. '''\nMar ned a ket en-dro, klaskit [[Special:UserLogout|digevreañ]] ha kevreañ en-dro.",
+       "session_fail_preview": "Ho tigarez ! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.\n\nMarteze n'oc'h ket kevreet ken. <strong>Gwiriit emaoc'h mat kevreet ha klaskit en-dro</strong>.\n\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ war-lerc'h. Gwiriit mat e asant ho merdeer resev toupinoù a-berzh al lec'hienn-mañ ivez.",
+       "session_fail_preview_html": "Ho tigarez ! N'omp ket bet gouest da enrollañ ho kemmoù rak kollet ez eus bet roadennoù e-kerzh an dalc'h.\n\n<em>Gweredekaet eo al linennoù HTML e {{SITENAME}}. Rak-se eo kuzh ar rakweledoù a-benn en em zifenn diouzh an tagadennoù JavaScript.</em>\n\n<strong>Ma oa reizh ar c'hemmoù hoc'h eus klasket degas, klaskit en-dro.</strong>\nMa ned a ket en-dro, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ goude. Gwiriit e asant mat ho merdeer degemer toupinoù a-berzh al lec'hienn-mañ ivez.",
        "token_suffix_mismatch": "'''Distaolet eo bet ar c'hemmoù degaset ganeoc'h abalamour ma oa bet kemmesket an arouezennoù poentadur gant ho merdeer en daveer kemmañ. Distaolet eo bet ar c'hemmoù kuit na vije breinet ar bajennad skrid.\nC'hoarvezout a ra a-wechoù pa implijit ur servijer proksi dreinek dizanav.'''",
        "edit_form_incomplete": "'''Darn eus ar furmskrid kemmañ zo chomet hep tizhout ar servijer ; gwiriit ervat emañ mat ho kemmoù tre evel m'int bet graet ganeoc'h ha klaskit en-dro.'''",
        "editing": "Oc'h aozañ $1",
        "editingsection": "Oc'h aozañ $1 (rann)",
        "editingcomment": "Oc'h aozañ $1 (rann nevez)",
        "editconflict": "tabut kemmañ : $1",
-       "explainconflict": "Enrollet eo bet ar bajenn-mañ war-lerc'h m'ho pefe kroget d'he c'hemmañ.\nE-krec'h an takad aozañ emañ an destenn evel m'emañ enrollet bremañ er bank roadennoù.\nHo kemmoù deoc'h a zeu war wel en takad aozañ traoñ.\nRet e vo deoc'h degas ho kemmoù d'an destenn zo evit poent.\nN'eus '''nemet''' an destenn zo en takad krec'h a vo saveteet pa klikot war \"{{int:savearticle}}\".",
+       "explainconflict": "Enrollet eo bet ar bajenn-mañ war-lerc'h m'ho pefe kroget d'he c'hemmañ.\nE-krec'h an takad aozañ emañ an destenn evel m'emañ enrollet bremañ er bank roadennoù.\nHo kemmoù deoc'h a zeu war wel en takad aozañ traoñ.\nRet e vo deoc'h degas ho kemmoù d'an destenn zo evit poent.\nN'eus '''nemet''' an destenn zo en takad krec'h a vo saveteet pa klikot war \"$1\".",
        "yourtext": "Ho testenn",
        "storedversion": "Stumm enrollet",
        "nonunicodebrowser": "'''DIWALLIT: N'eo ket skoret an Unicode gant ho merdeer. Un diskoulm da c'hortoz zo bet kavet evit ma c'hallfec'h kemmañ pennadoù : dont a raio war wel an arouezennoù an-ASCII er prenestr skridaozañ evel kodoù eizhdekvedennel.'''",
        "yourdiff": "Diforc'hioù",
        "copyrightwarning": "Sellet e vez ouzh an holl degasadennoù graet war {{SITENAME}} evel ouzh degasadennoù a zouj da dermenoù ar $2 (Sellet ouzh $1 evit gouzout hiroc'h). Mar ne fell ket deoc'h e vefe embannet ha skignet ho skridoù, arabat kas anezho.<br />\nHeñveldra, prometiñ a rit kemer perzh dre zegas skridoù savet ganeoc'h hepken pe tennet eus ur vammenn frank a wirioù.\n'''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER (COPYRIGHT) HEP AOTRE D'OBER KEMENT-SE!'''",
        "copyrightwarning2": "Notit mat e c'hall kement degasadenn graet ganeoc'h war {{SITENAME}} bezañ kemmet, adaozet pe lamet kuit gant an implijerien all. Mar ne fell ket deoc'h e vije kemmet-digemmet ar pezh hoc'h eus skrivet na gemerit ket perzh er raktres-mañ.<br /> Gouestlañ a rit ivez eo bet savet ar boued spered ganeoc'h pe eilet diwar ur vammenn frank a wirioù pe en domani foran (gwelet $1 evit gouzout hiroc'h). '''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER HEP AOTRE D'OBER KEMENT-SE!'''",
+       "editpage-cannot-use-custom-model": "N'haller ket cheñch patrom danvez ar bajenn-mañ.",
        "longpageerror": "'''FAZI : {{PLURAL:$1|Ur c'hilookted|$1 kilookted}} hir eo an destenn lakaet ganeoc'h, ar pezh zo hiroc'h eget {{PLURAL:$2|ur c'hilookted|$2 kilookted}}, ar vent vrasañ aotreet. N'haller ket enrollañ.'''",
-       "readonlywarning": "'''KEMENN DIWALL : prennet eo bet an diaz titouroù evit bezañ trezalc'het; setu ne viot ket evit enrollañ ho kemmoù diouzhtu-diouzhtu eta.'''\n\nGallout a rit eilañ ha pegañ ho testenn en ur restr skrid all hag enrollañ anezhi a-benn diwezhatoc'hik.'''\n\nSetu an displegadenn lakaet gant ar merour eo bet prennet an traoù gantañ : $1",
+       "readonlywarning": "<strong>Diwallit : prennet eo bet an diaz roadennoù evit bezañ trezalc'het; setu ne viot ket evit enrollañ ho kemmoù diouzhtu-diouzhtu eta.</strong>\n\nGallout a rit eilañ ha pegañ ho skrid en ur restr testenn all hag enrollañ anezhañ a-benn diwezhatoc'hik.\n\nSetu an displegadenn lakaet gant ar merour reizhiad eo bet prennet an traoù gantañ : $1",
        "protectedpagewarning": "'''KEMENN DIWALL: Gwarezet eo bet ar bajenn-mañ. N'eus nemet an implijerien ganto ar statud merour a c'hall kemmañ anezhi.'''\nEnmont diwezhañ ar marilh a ziskouezer amañ a-is evel dave :",
        "semiprotectedpagewarning": "''Notenn :''' Gwarezet eo ar bajenn-mañ; n'eus nemet an implijerien bet krouet ur gont ganto a kemmañ anezhi. Kasadenn ziwezhañ ar marilh zo diskouezet amañ a-is evel dave :",
-       "cascadeprotectedwarning": "'''Diwallit :''' Prennet eo ar bajenn-mañ. N'eus nemet ar verourien a c'hall kemmañ anezhi peogwir he c'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :",
+       "cascadeprotectedwarning": "<strong>Diwallit :</strong> Prennet eo bet ar bajenn-mañ. N'eus nemet an implijerien ganto [[Special:ListGroupRights|gwirioù dibar]] a c'hall kemmañ anezhi peogwir emañ treuzkludet {{PLURAL:$1|er bajenn|er pajennoù}} da-heul gwarezet dre skalierad :",
        "titleprotectedwarning": "'''DIWALLIT :  Gwarezet eo bet ar bajenn-mañ e doare ma ranker kaout [[Special:ListGroupRights|gwirioù dibar]] a-benn krouiñ anezhi.''' Kasadenn ziwezhañ ar marilh a zo diskouezet amañ a-is evel dave :",
        "templatesused": "{{PLURAL:$1|Patrom|Patromoù}} implijet war ar bajenn-mañ :",
        "templatesusedpreview": "{{PLURAL:$1|Patrom|Patromoù}} implijet er rakweladenn-mañ :",
        "permissionserrors": "Fazi aotre",
        "permissionserrorstext": "N'oc'h ket aotreet d'ober kement-mañ evit {{PLURAL:$1|an abeg-mañ|an abegoù-mañ}} :",
        "permissionserrorstext-withaction": "N'oc'h ket aotreet da $2, evit an {{PLURAL:$1|abeg-mañ|abeg-mañ}} :",
+       "contentmodelediterror": "N'hallit ket kemmañ an adweladenn-mañ peogwir ez eo par he fatrom danvez da <code>$1</code>, ar pezh zo disheñvel diouzh ar patrom danvez implijet bremañ war ar bajenn <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Diwallit : Emaoc'h o krouiñ ur bajenn zo bet diverket c'hoazh.'''\n\nEn em soñjit ervat ha talvoudus eo kenderc'hel krouiñ ar bajenn.\nDeoc'h da c'houzout, aze emañ ar marilhoù diverkañ hag adenvel :",
        "moveddeleted-notice": "Diverket eo bet ar bajenn-mañ.\nDindan emañ ar marilh diverkañ hag adenvel.",
+       "moveddeleted-notice-recent": "Ho tigarez, nevez ziverket eo bet ar bajenn-mañ (e-kerzh an 24 eurvezh tremenet).\nDindan emañ ar marilhoù diverkañ hag adenvel evit ho kelaouiñ.",
        "log-fulllog": "Gwelet ar marilh klok",
        "edit-hook-aborted": "C'hwitet ar c'hemmañ gant un astenn.\nAbeg dianav.",
        "edit-gone-missing": "Dibosupl hizivaat ar bajenn.\nDiverket eo bet evit doare.",
        "invalid-content-data": "n'eo ket mat roadennoù an endalc'had",
        "content-not-allowed-here": "N'eo ket aotreet an endalc'had \"$1\" er bajenn [[$2]]",
        "editwarning-warning": "Mar kuitait ar bajenn-mañ e c'hallit koll ar c'hemmoù degaset ganeoc'h.\nMa'z oc'h kevreet e c'hallit diweredekaat ar c'hemenn-diwall-mañ e rann \"{{int:prefs-editing}}\" en ho penndibaboù.",
+       "editpage-invalidcontentmodel-title": "N'eo ket skoret ar patrom danvez",
+       "editpage-invalidcontentmodel-text": "N'eo ket skoret ar patrom danvez \"$1\".",
        "editpage-notsupportedcontentformat-title": "Furmad endalc'had ha n'eo ket kemeret e karg",
+       "editpage-notsupportedcontentformat-text": "N'eo ket skoret ar patrom $1 gant ar patrom danvez $2.",
        "content-model-wikitext": "wikitestenn",
        "content-model-text": "testenn blaen",
        "content-model-javascript": "Javascript",
        "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.",
+       "deprecated-self-close-category-desc": "Er bajenn-mañ ez eus tikedennoù HTML emserriñ, evel <code>&lt;b/></code> pe <code>&lt;span/></code>.  Cheñch a raio o emzalc'h a-raok pell evit bezañ diouzh an erbedadennoù HTML5. Gant se eo dispredet implijout anezho er wikitestenn.",
+       "duplicate-args-warning": "<strong>Taolit evezh : Emañ </strong> [[:$1]] o c'hervel [[:$2]] gant muioc'h eget un talvoud evit an arventenn \"$3\". N'eus nemet an talvoud pourchaset da ziwezhañ a vo implijet.",
+       "duplicate-args-category": "Pajennoù a ra gant arguzennoù eilet er galvoù patrom",
+       "duplicate-args-category-desc": "Er bajenn-mañ ez eus galvoù patroù a ra gant arguzennoù eilet, evel <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> pe <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "<strong>Diwallit :</strong>: Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo er bajenn-mañ.\n\nDleout a rafe bezañ nebeutoc'h eget $2 {{PLURAL:$2|galv}}, ha {{PLURAL:$1|$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.",
        "post-expand-template-inclusion-category": "Pajennoù enno re a batromoù",
        "post-expand-template-argument-warning": "Diwallit : war ar bajenn-mañ ez eus eus da nebeutañ un arventenn eus ur patrom zo re vras.\nA-gostez eo bet lezet an arventenn-se.",
        "post-expand-template-argument-category": "Pajennoù enno arventennoù patrom bet lezet a-gostez",
        "parser-template-loop-warning": "Patrom e kelc'h detektet : [[$1]]",
-       "parser-template-recursion-depth-warning": "Tizhet bevenn donder galvoù ar patromoù ($1)",
+       "template-loop-category": "Pajennoù enno lagadennoù patrom",
+       "template-loop-category-desc": "Ul lagadenn batrom zo er bajenn, d.l.e. ur patrom en em c'halv e-unan en ur mod rekursivel.",
+       "parser-template-recursion-depth-warning": "Tizhet bevenn donder galvoù rekursivek ar patromoù ($1)",
        "language-converter-depth-warning": "Aet eur en tu all d'ar vevenn amdreiñ yezhoù ($1)",
        "node-count-exceeded-category": "Pajennoù m'eur aet en tu all d'an niver a skoulmoù",
        "node-count-exceeded-category-desc": "Mont a ra ar bajenn-mañ en tu all da gont uhelañ ar skoulmoù.",
        "undo-summary": "Dizober kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])",
        "undo-summary-username-hidden": "Dizober ar reizhadenn $1 gant un implijer kuzhet",
        "cantcreateaccount-text": "Stanket eo bet ar c'hrouiñ kontoù adal ar chomlec'h IP ('''$1''') gant [[User:$3|$3]].\n\nAn abeg roet gant $3 zo ''$2''",
+       "cantcreateaccount-range-text": "Berzet eo bet gant [[User:$3|$3]] ar c'hrouiñ kontoù adalek ar chomlec'hioù IP el lijorennoù <strong>$1</strong> m'emañ ho chomlec'h IP (<strong>$4</strong>), \n\n<em>$2</em> eo an abeg roet gant $3",
        "viewpagelogs": "Gwelet ar marilhoù evit ar bajenn-mañ",
        "nohistory": "Ar bajenn-mañ n'he deus tamm istor ebet.",
        "currentrev": "Stumm a-vremañ pe stumm red",
        "page_first": "kentañ",
        "page_last": "diwezhañ",
        "histlegend": "Sellet ouzh an diforc'hioù : lakait un ask adal d'ar stummoù a fell deoc'h keñveriañ ha pouezit war kadarnaat pe war ar bouton en traoñ.<br />\nAlc'hwez : (red) = diforc'hioù gant ar stumm a-vremañ,\n(diwez) = diforc'hioù gant ar stumm kent, D = kemm dister",
-       "history-fieldset-title": "Furchal en istor",
-       "history-show-deleted": "Diverket hepken",
+       "history-fieldset-title": "Klask adweladennoù",
+       "history-show-deleted": "Stumm diverket hepken",
        "histfirst": "koshañ",
        "histlast": "nevezañ",
        "historysize": "({{PLURAL:$1|$1 okted|$1 okted}})",
        "history-feed-description": "Istor ar c'hemmoù degaset war ar bajenn-mañ eus ar wiki",
        "history-feed-item-nocomment": "$1 d'an $2",
        "history-feed-empty": "Ar bajenn goulennet n'eus ket anezhi.\nMarteze eo bet diverket eus ar wiki, pe adanvet.\nImplijit [[Special:Search|klaskit er wiki]] evit kavout pajennoù all a c'hallfe klotañ.",
+       "history-edit-tags": "Kemmañ tikedennoù ar stummoù diuzet",
        "rev-deleted-comment": "(diverradenn ar c'hemm diverket)",
        "rev-deleted-user": "(anv implijer diverket)",
-       "rev-deleted-event": "(elfenn dilamet)",
+       "rev-deleted-event": "(munudoù ar marilh bet dilamet)",
        "rev-deleted-user-contribs": "[anv implijer pe chomlec'h IP diverket - kemm kuzhet diouzh an degasadennoù]",
        "rev-deleted-text-permission": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nMarteze e kavot munudoù war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} roll ar pajennoù diverket].",
+       "rev-suppressed-text-permission": "<strong>Diverket</strong> eo bet ar stumm-mañ eus ar bajenn.\nGallout a reot kavout ar munudoù e [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} marilh an diverkadennoù].",
        "rev-deleted-text-unhide": "!'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nMarteze e kavot munudoù war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].\nGallout a rit [$1 gwelet ar stumm-se] c'hoazh mar fell deoc'h kenderc'hel.",
        "rev-suppressed-text-unhide": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nTitouroù zo da gaout war [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].\nGallout a rit [$1 gwelet ar stumm-se] c'hoazh mar fell deoc'h kenderc'hel.",
        "rev-deleted-text-view": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nGallout a rit sellet outañ ; titouroù all a gavot war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].",
        "rev-showdeleted": "diskouez",
        "revisiondelete": "Diverkañ/diziverkañ stummoù",
        "revdelete-nooldid-title": "N'eus stumm pal ebet evit an degasadennoù",
-       "revdelete-nooldid-text": "Pe n'eo ket bet spisaet ganeoc'h ar stumm(où) pal da implijout an arc'hwel-mañ evito. pe n'eus ket eus ar stummoù spisaet, pe emaoc'h o klask kuzhat ar stumm red.",
+       "revdelete-nooldid-text": "Pe n'eus ket bet spisaet ganeoc'h stumm pal ebet da lakaat an arc'hwel-mañ da vont en-dro warnañ, pe n'eus ket eus ar stummoù spisaet, pe emaoc'h o klask kuzhat ar stumm red.",
        "revdelete-no-file": "N'eus ket eus ar restr spisaet ganeoc'h.",
        "revdelete-show-file-confirm": "Ha sur oc'h e fell deoc'h gwelet stumm diverket ar restr \"<nowiki>$1</nowiki>\" deiziataet eus an $2 da $3?",
        "revdelete-show-file-submit": "Ya",
+       "revdelete-selected-text": "{{PLURAL:$1|Stumm diuzet}} eus [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Stumm eus ar restr diuzet}} evit [[:$2]] :",
        "logdelete-selected": "{{PLURAL:$1|Darvoud eus ar marilh diuzet}} :",
+       "revdelete-text-text": "Dont a raio c'hoazh war wel ar stummoù diverket en istor ar bajenn met ne c'hallo ket an dud gwelet darn eus an danvez ken.",
        "revdelete-text-file": "Dalc'het e vo da welet stummoù restroù dilamet en istor ar restr, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
        "logdelete-text": "Gwelet e vo c'hoazh dilamadennoù er marilhoù, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
        "revdelete-text-others": "Ar verourien a c'hallo c'hoazh mont da welet petra zo e-barzh, hag eilpennañ an dilamadenn, nemet ha reolennoù strishoc'h ouzhpenn a vefe.",
        "revdelete-legend": "Lakaat strishadurioù gwelet",
        "revdelete-hide-text": "Testenn ar stumm",
        "revdelete-hide-image": "Kuzhat danvez ar restr",
-       "revdelete-hide-name": "Kuzhat an ober hag ar vukadenn",
+       "revdelete-hide-name": "Kuzhat ar pal hag an arventennoù",
        "revdelete-hide-comment": "Notenn ar c'hemm",
        "revdelete-hide-user": "Anv implijer pe chomlec'h IP an aozer",
        "revdelete-hide-restricted": "Diverkañ ar roadennoù kement d'ar verourien ha d'ar re all",
        "revdelete-unsuppress": "Lemel ar strishadurioù war ar stummoù assavet",
        "revdelete-log": "Abeg :",
        "revdelete-submit": "Lakaat da dalvezout evit an {{PLURAL:$1|adweladenn|adweladennoù}} diuzet",
-       "revdelete-success": "''Gweluster ar stummoù hizivaet mat.'''",
+       "revdelete-success": "Gweluster ar stummoù hizivaet.",
        "revdelete-failure": "''Dibosupl hizivaat gweluster ar stumm :'''\n$1",
-       "logdelete-success": "'''Gweluster ar marilh arventennet evel m'eo dleet.'''",
+       "logdelete-success": "Kemmet eo bet gweluster ar marilh.",
        "logdelete-failure": "'''N'eus ket bet gallet termeniñ gweluster ar marilh :'''\n$1",
        "revdel-restore": "Cheñch ar gweluster",
        "pagehist": "Istor ar bajenn",
        "mergehistory-go": "Diskouez ar stummoù a c'haller kendeuziñ",
        "mergehistory-submit": "Kendeuziñ ar stummoù",
        "mergehistory-empty": "N'haller ket kendeuziñ stumm ebet.",
-       "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm|stumm}} eus $1 e [[:$2]].",
+       "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|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-no-change": "N'eus ket bet kendeuzet stumm ebet p'eo bet kendeuzet an istor. Gwiriit en-dro ar bajenn hag an arventennoù amzer.",
+       "mergehistory-fail-permission": "Re izel eo ho kwirioù evit gallout kendeuziñ an istor.",
+       "mergehistory-fail-self-merge": "Mammenn ha pal ar bajenn n'hall ket bezañ heñvel.",
+       "mergehistory-fail-timestamps-overlap": "En em frikañ a ra stummoù ar vammenn pe dont a reont war-lerc'h stummoù pal.",
        "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.",
        "search-category": "(rummad $1)",
        "search-file-match": "(klotañ a ra gant endalc'had ar restr)",
        "search-suggest": "N'hoc'h eus ket soñjet kentoc'h e : $1",
-       "search-interwiki-caption": "Raktresoù kar",
+       "search-rewritten": "O tiskouez disoc'hoù evit $1. Klask $2 kentoc'h.",
+       "search-interwiki-caption": "Disoc'hoù diwar raktresoù kar",
        "search-interwiki-default": "Disoc'hoù eus $1 :",
        "search-interwiki-more": "(muioc'h)",
        "search-interwiki-more-results": "Muioc'h a zisoc'hoù",
        "prefs-tokenwatchlist": "Jedouer",
        "prefs-diffs": "Diforc'hioù",
        "prefs-help-prefershttps": "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
+       "prefswarning-warning": "Kemmet eo bet ho penndibaboù ganeoc'h, met enrollet n'int ket bet avat.\nMar kuitait ar bajenn-mañ hep klikañ war \"$1\" ne vo ket nevesaet ho penndibaboù",
        "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": "Gwirioù an implijer",
        "userrights-lookup-user": "Diuzañ un implijer",
        "userrights-user-editname": "Lakait un anv implijer :",
        "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",
-       "userrights-viewusergroup": "Gwelet ar strolladoù implijerien",
+       "viewinguserrights": "Gwelet gwirioù an {{GENDER:$1|implijer|implijerez}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Kemmañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
+       "userrights-viewusergroup": "Gwelet strolladoù an {{GENDER:$1|implijer|implijerez}}",
        "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-groups-help": "Cheñch strolladoù 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 ganeoc'h, pe ar c'hontrol.\n* Ur # a verk e c'hallit astenn termen an emezelañ er strollad hepken ; n'hallit ket berraat anezhañ.",
        "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-expiry-options": "1 deiz:1 day,1 sizhun:1 week,1 miz:1 month,3 miz:3 months,6 miz:6 months, bloaz:1 year",
        "userrights-invalid-expiry": "Direizh eo termen echuiñ ar strollad \"$1\".",
        "userrights-expiry-in-past": "Re gozh eo termen echuiñ ar strollad \"$1\".",
+       "userrights-cannot-shorten-expiry": "N'hallit ket astenn an termen emezelañ er strollad \"$1\". N'eus nemet an implijerien aotreet da ouzhpennañ pe lemel ar strollad-mañ a c'hall astenn an termen.",
        "userrights-conflict": "Bec'h zo abalamour da gemmoù e gwirioù an implijerien. Adwelit an traoù, mar plij, ha kadarnait ho kemmoù.",
        "group": "Strollad :",
        "group-user": "Implijerien",
        "right-reupload-shared": "Gwaskañ restroù ent lec'hel war an diellaoueg vedia rannet",
        "right-upload_by_url": "Enporzhiañ ur restr adal ur chomlec'h URL",
        "right-purge": "Spujañ krubuilh ar pajennoù hep kadarnaat",
-       "right-autoconfirmed": "Kemmañ ar pajennoù damwarezet",
+       "right-autoconfirmed": "Na vezañ trubuilhet gant ar bevennoù kas liammet ouzh ar chomlec'hioù IP",
        "right-bot": "Plediñ ganti evel gant un argerzh emgefre",
        "right-nominornewtalk": "Arabat diskouez ar c'hemenn \"Kemennoù nevez zo ganeoc'h\" pa vez lakaet kemmoù dister e pajenn gaozeal un implijer",
        "right-apihighlimits": "Kreskiñ ar bevennoù er goulennoù API",
        "right-deletedtext": "Gwelet ar skrid diverket hag an diforc'hioù etre ar stummoù diverket",
        "right-browsearchive": "Klask pajennoù bet diverket",
        "right-undelete": "Assevel ur bajenn",
-       "right-suppressrevision": "Teuler ur sell war ar stummoù kuzhet ouzh ar verourien hag assevel anezho",
+       "right-suppressrevision": "Gwelet, kuzhat ha diguzhat stummoù resis pajennoù zo diouzh selloù an implijerien all",
+       "right-viewsuppressed": "Gwelet ar stummoù kuzhet diouzh an implijerien all",
        "right-suppressionlog": "Gwelet ar marilhoù prevez",
        "right-block": "Mirout ouzh an implijerien all a gemmañ pajennoù pelloc'h",
        "right-blockemail": "Mirout ouzh un implijer a gas posteloù",
        "right-hideuser": "Stankañ un implijer, en ur guzhat anezhañ diouzh ar re all",
        "right-ipblock-exempt": "Tremen dreist an IPoù stanket, ar stankadennoù emgefre hag ar bloc'hadennoù IP stanket",
        "right-unblockself": "En em zistankañ",
-       "right-protect": "Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet",
+       "right-protect": "Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet dre skalierad",
        "right-editprotected": "Aozañ ar pajennoù gwarezet evel \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Aozañ ar pajennoù gwarezet evel \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Kemmañ patrom danvez ur bajenn bennak",
        "right-editinterface": "Kemmañ an etrefas implijer",
-       "right-editusercssjs": "Kemmañ restroù CSS ha JS implijerien all",
        "right-editusercss": "Kemmañ restroù CSS implijerien all",
        "right-edituserjs": "Kemmañ restroù JS implijerien all",
        "right-editmyusercss": "Aozañ ho restroù implijer CSS deoc'h-c'hwi",
        "right-editmyuserjs": "Aoazañ ho restroù JavaScript implijer deoc'h-c'hwi",
        "right-viewmywatchlist": "Gwelet ho roll-evezhiañ deoc'h-c'hwi",
+       "right-editmywatchlist": "Kemmañ ho roll evezhiañ deoc'h-c'hwi. Notit mat e vo c'hoazh ouzhpennet pajennoù hep ar gwir-mañ gant obererezhioù zo.",
        "right-viewmyprivateinfo": "Gwelet ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
        "right-editmyprivateinfo": "Aozañ ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
        "right-editmyoptions": "Kemmañ ho penndibaboù",
        "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-managechangetags": "Krouiñ ha gweredekaat/diweredekaat [[Special:Tags|tikedennoù]]",
+       "right-applychangetags": "Lakaat [[Special:Tags|an tikedennoù]] e pleustr asambles gant kemmoù an-unan",
+       "right-changetags": "Ouzhpennañ ha dilemel [[Special:Tags|tikedennoù]], diwar ziviz, war adweladennoù hiniennel pe monedoù marilh.",
+       "right-deletechangetags": "Diverkañ[[Special:Tags|tikedennoù]] a-ziwar an diaz roadennoù",
+       "grant-generic": "Pakad aotreoù \"$1\"",
+       "grant-group-page-interaction": "Etreober gant pajennoù",
+       "grant-group-file-interaction": "Etreober gant mediaoù",
+       "grant-group-watchlist-interaction": "Etreober gant ho roll evezhiañ",
        "grant-group-email": "Kas ur postel",
+       "grant-group-high-volume": "Seveniñ ur pikol obererezh",
+       "grant-group-customization": "Personeladur ha penndibaboù",
+       "grant-group-administration": "Seveniñ oberoù melestradurel",
+       "grant-group-private-information": "Gwelet ar roadennoù prevez diwar ho penn",
        "grant-group-other": "Obererezh liesseurt",
        "grant-blockusers": "Stankañ ha distankañ implijerien",
        "grant-createaccount": "Krouiñ kontoù",
        "action-editcontentmodel": "Kemmañ patrom danvez ur bajenn",
        "action-managechangetags": "krouiñ ha gweredekaat/diweredekaat tikedennoù",
        "action-applychangetags": "lakaat e pleustr an tikedennoù a-gevret gant ho kemmoù",
+       "action-changetags": "ouzhpennañ ha dilemel tikedennoù diwar ziviz diouzh adweladennoù hiniennel pe monedoù marilh",
        "action-deletechangetags": "Diverkañ tikedennoù a-ziwar an diaz-roadennoù",
        "action-purge": "spurjañ ar bajenn-mañ",
        "nchanges": "$1 {{PLURAL:$1|kemm|kemm}}",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])",
        "recentchanges-submit": "Diskouez",
        "rcfilters-activefilters": "Siloù oberiant",
+       "rcfilters-quickfilters": "Liammoù prim",
+       "rcfilters-quickfilters-placeholder": "Enrollit arventennoù hoc'h ostilh karetañ evit gallout adimplijout anezho diwezhatoc'h.",
+       "rcfilters-savedqueries-defaultlabel": "Siloù enrollet",
+       "rcfilters-savedqueries-rename": "Adenvel",
+       "rcfilters-savedqueries-setdefault": "Gweredekaat dre ziouer",
+       "rcfilters-savedqueries-unsetdefault": "Diweredekaat dre ziouer",
+       "rcfilters-savedqueries-remove": "Dilemel",
+       "rcfilters-savedqueries-new-name-label": "Anv",
+       "rcfilters-savedqueries-apply-label": "Krouiñ ul liamm prim",
+       "rcfilters-savedqueries-cancel-label": "Nullañ",
+       "rcfilters-savedqueries-add-new-title": "Enrollañ ar siloù evel liammoù prim",
        "rcfilters-restore-default-filters": "Assevel ar siloù dre ziouer",
        "rcfilters-clear-all-filters": "Riñsañ an holl siloù",
        "rcfilters-search-placeholder": "Silañ ar c'hemmoù diwezhañ (merdeiñ pe kregiñ da skrivañ)",
        "rcfilters-invalid-filter": "Sil direizh",
        "rcfilters-empty-filter": "Sil oberiant ebet. War wel emañ an holl gemmoù.",
        "rcfilters-filterlist-title": "Siloù",
+       "rcfilters-filterlist-whatsthis": "Petra eo se ?",
+       "rcfilters-filterlist-feedbacklink": "Reiñ ho soñj diwar-benn ar siloù (beta) nevez",
+       "rcfilters-highlightbutton-title": "Lakaat an disoc'hoù war wel",
        "rcfilters-highlightmenu-title": "Dibabit ul liv",
+       "rcfilters-highlightmenu-help": "Diuzañ ul liv evit lakaat ar perzh-mañ war wel",
        "rcfilters-filterlist-noresults": "N'eus bet kavet sil ebet",
+       "rcfilters-noresults-conflict": "N'eus bet kavet disoc'h ebet rak dezverkoù klask kontrol zo",
+       "rcfilters-state-message-subset": "Ar sil-mañ ne ra netra rak kavet e vez e zisoc'hoù e-mesk ar {{PLURAL:$2|sil|siloù}} klask da heul (klaskit e lakaat war wel evit diforc'han anezhañ) : $1",
+       "rcfilters-state-message-fullcoverage": "Diuzañ an holl siloù en ur strollad zo evel diuzañ netra, setu ne raio ket netra ar sil-mañ. Er strollad emañ : $1",
        "rcfilters-filtergroup-registration": "Enskrivadur an implijer",
        "rcfilters-filter-registered-label": "Marilhet",
        "rcfilters-filter-registered-description": "Aozerien gevreet.",
        "rcfilters-filter-unregistered-label": "Divarilh",
        "rcfilters-filter-unregistered-description": "Aozerien n'int ket kevreet.",
-       "rcfilters-filtergroup-authorship": "Kemmañ anv an aozer",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Tabut zo etre ar sil-mañ hag ar {{PLURAL:$2|sil|siloù}} Arroutet, na {{PLURAL:$2|gav|gavont}} nemet an implijerien enrollet : $1",
+       "rcfilters-filtergroup-authorship": "Aozer ar c'hemmoù",
        "rcfilters-filter-editsbyself-label": "Kemmet ganeoc'h",
-       "rcfilters-filter-editsbyself-description": "Kemmet ganeoc'h",
+       "rcfilters-filter-editsbyself-description": "Ar c'hemmoù graet ganeoc'h.",
        "rcfilters-filter-editsbyother-label": "Kemmet gant tud all",
-       "rcfilters-filter-editsbyother-description": "Kemmoù graet gant implijerien all (ket ganeoc'h).",
+       "rcfilters-filter-editsbyother-description": "An holl gemmoù nemet ar re graet ganeoc'h.",
        "rcfilters-filtergroup-userExpLevel": "Live skiant-prenañ (evit an implijer enrollet hepken)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Tud nevez-deuet",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Nebeutoc'h eget 10 kemm ha 4 devezh obererezh.",
-       "rcfilters-filter-userExpLevel-learner-label": "Deskarded",
-       "rcfilters-filter-userExpLevel-learner-description": "Muioc'h a zeizioù obererezh hag a gemmoù eget \"deraouidi\" hogen nebeutoc'h eget an \"implijerien arroutet\".",
-       "rcfilters-filter-userExpLevel-experienced-label": "Implijerien arroutet",
-       "rcfilters-filter-userExpLevel-experienced-description": "Ouzhpenn 30 devezh oberiantiz ha 500 kemm.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ar siloù Arroutet ne gavont nemet implijerien enrollet, se zo kaoz zo tabut etre ar sil-mañ hag ar sil \"Dienroll\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Emañ ar sil \"Dienroll\" o tabutal gant gant ur sil Arroutet pe gant meur a hini. Ar siloù Arroutet a gav implijerien enrollet hepken. Ar siloù o tabutal zo merket en takad Siloù oberiant a-us.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Tud nevez-deuet",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Nebeutoc'h eget 10 kemm ha 4 devezh obererezh.",
+       "rcfilters-filter-user-experience-level-learner-label": "Deskarded",
+       "rcfilters-filter-user-experience-level-learner-description": "Muioc'h a skiant-prenet eget an \"deraouidi\" hogen nebeutoc'h eget an \"implijerien arroutet\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Implijerien arroutet",
+       "rcfilters-filter-user-experience-level-experienced-description": "Ouzhpenn 30 devezh oberiantiz ha 500 kemm.",
        "rcfilters-filtergroup-automated": "Degasadennoù emgefre",
        "rcfilters-filter-bots-label": "Robot",
        "rcfilters-filter-bots-description": "Kemmoù graet gant ostilhoù emgefre.",
        "rcfilters-filter-humans-label": "Den (ket ur robot)",
        "rcfilters-filter-humans-description": "Kemmoù graet gant tud kig-hag-eskern.",
+       "rcfilters-filtergroup-reviewstatus": "Adwelet ar statud",
+       "rcfilters-filter-patrolled-label": "Gwiriet",
+       "rcfilters-filter-patrolled-description": "Merkañ ar c'hemmoù evel gwiriet.",
+       "rcfilters-filter-unpatrolled-label": "Anwiriet",
+       "rcfilters-filter-unpatrolled-description": "Kemmoù n'int ket merket evit gwiriet.",
        "rcfilters-filtergroup-significance": "Talvoudegezh",
        "rcfilters-filter-minor-label": "Kemmoù dister",
        "rcfilters-filter-minor-description": "Kemmoù merket evel dister gant an aozer.",
        "rcfilters-filter-major-label": "Kemmoù n'int ket dister",
        "rcfilters-filter-major-description": "Kemmoù n'int ket bet merket evel dister",
+       "rcfilters-filtergroup-watchlist": "Pajennoù evezhiet",
+       "rcfilters-filter-watchlist-watched-label": "War ar roll evezhiañ",
+       "rcfilters-filter-watchlist-watched-description": "Kemmoù graet war pajennoù ho roll evezhiañ.",
+       "rcfilters-filter-watchlist-watchednew-label": "Kemmoù nevez er roll evezhiañ",
        "rcfilters-filtergroup-changetype": "Seurt kemm",
        "rcfilters-filter-pageedits-label": "Kemmoù pajennoù",
        "rcfilters-filter-pageedits-description": "Kemmoù da danvez ar wiki, d'ar c'haozeadennoù, da zeskrivadurioù rummadoù...",
        "rcfilters-filter-categorization-label": "Kemmoù rummad",
        "rcfilters-filter-categorization-description": "Roll ar pajennoù ouzhpennet da rummadoù zo pe dilamet diouto.",
        "rcfilters-filter-logactions-label": "Obererezhioù enrollet",
+       "rcfilters-filter-logactions-description": "Obererezhioù melestradurel, krouiñ kontoù, diverkañ pajennoù, enporzhiañ...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Tabut zo etre ar sil \"Kemmoù dister\" hag unan pe meur a sil a Seurt kemmoù peogwir n'haller merkañ kemmoù zo evel \"dister\". Kavet e vo ar siloù o tabutal e takad ar siloù gweredekaet, a-us.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Seurtoù kemmoù zo n'hallont ket bezañ merket evel \"dister,\", rak se ez eus tabut etre ar sil-mañ ha siloù ar Seurtoù kemmoù da heul : $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Tabut zo etre ar sil-mañ Seurt kemmoù gant sil ar \"c'hemmoù dister\". Kemmoù zo n'hallont ket bezañ merket evel \"dister\".",
+       "rcfilters-filtergroup-lastRevision": "Stumm diwezhañ",
+       "rcfilters-filter-lastrevision-label": "Stumm diwezhañ",
+       "rcfilters-filter-lastrevision-description": "Kemm diwezhañ graet ouzh ur bajenn.",
+       "rcfilters-filter-previousrevision-label": "Stummoù koshoc'h",
+       "rcfilters-filter-previousrevision-description": "An holl gemmoù nemet ar c'hemm diwezhañ graet ouzh ur bajenn.",
        "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ñ).",
+       "rclistfromreset": "adderaouekaat dibab an deiziad",
        "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an/ar $3 $2",
        "rcshowhideminor": "$1 ar c'hemmoù dister",
        "rcshowhideminor-show": "Diskouez",
        "rcshowhidecategorization": "$1 rummatadur ar bajenn",
        "rcshowhidecategorization-show": "Diskouez",
        "rcshowhidecategorization-hide": "Kuzhat",
-       "rclinks": "Diskouez an/ar $1 kemm diwezhañ c'hoarvezet e-pad an/ar $2 devezh diwezhañ.<br />$3",
+       "rclinks": "Diskouez an/ar $1 kemm diwezhañ c'hoarvezet e-pad an/ar $2 devezh diwezhañ.",
        "diff": "diforc'h",
        "hist": "ist",
        "hide": "Kuzhat",
        "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",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ouzhpennet d'ar rummad, [[Special:WhatLinksHere/$1|emañ ensoc'het ar bajenn-mañ e diabarzh pajennoù all]]",
+       "recentchanges-page-removed-from-category": "Diverket eo bet [[:$1]] diouzh ar rummad",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] dilamet diouzh ar rummad, [[Special:WhatLinksHere/$1|emañ ensoc'het ar bajenn-mañ e diabarzh pajennoù all]]",
        "autochange-username": "Kemm emgefre gant MediaWiki",
        "upload": "Kargañ war ar servijer",
        "uploadbtn": "Kargañ ur restr",
        "uploaderror": "Fazi enporzhiañ",
        "upload-recreate-warning": "'''Diwallit''' : Diverket pe dilec'hiet ez eus bet ur restr gant an anv-se.'''\n\nDeoc'h da c'houzout, setu aze marilh an diverkañ hag an dilec'hiañ evit ar bajenn-mañ.",
        "uploadtext": "Grit gant ar furmskrid a-is evit enporzhiañ restroù war ar servijer.\nEvit sellet pe klask skeudennoù bet enporzhiet a-raok sellit ouzh [[Special:FileList|roll ar skeudennoù]]. Kavet e vo ar skeudennoù enporzhiet war [[Special:Log/upload|marilh ar pajennoù enporzhiet]] hag an diverkadennoù war [[Special:Log/delete|istor an diverkadennoù]].\n\nEvit enklozañ ur skeudenn en ur pennad, lakait er pennad-se ul liamm skrivet evel-henn :\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:anv_ar_restr.jpg]]</nowiki></code>''' evit diskouez ar restr en he spider brasañ ;\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:anv_ar_restr.png|deskrivadenn]]</nowiki></code>''' evit ober gant ur munud 200 piksel ledander er ur voest a-gleiz enni \"testenn zeskrivañ\" da zeskrivadenn\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:anv_ar_restr.ogg]]</nowiki></code>''' evit sevel ul liamm war-eeun war-du ar restr hep diskouez anezhi.",
-       "upload-permitted": "Seurtoù restroù aotreet : $1.",
-       "upload-preferred": "Seurtoù restroù gwellañ : $1.",
-       "upload-prohibited": "Seurtoù restroù berzet : $1.",
+       "upload-permitted": "{{PLURAL:$2|Seurt|Seurtoù}} restr aotreet : $1.",
+       "upload-preferred": "{{PLURAL:$2|Seurt|Seurtoù}} restr karetañ : $1.",
+       "upload-prohibited": "{{PLURAL:$2|Seurt|Seurtoù}} restr berzet : $1.",
        "uploadlogpage": "Marilh ar pajennoù enporzhiet",
        "uploadlogpagetext": "Setu a-is marilh ar restroù diwezhañ bet karget war ar servijer.\nS.o [[Special:NewFiles|rann ar skeudennoù nevez]] evit kaout ur sell gwiroc'h",
        "filename": "Anv ar restr",
        "largefileserver": "Brasoc'h eo ar restr-mañ eget ar pezh a c'hall ar servijer aotren.",
        "emptyfile": "Evit doare eo goullo ar restr bet karget ganeoc'h. Moarvat eo abalamour d'an tipo en anv ar restr. Gwiriit mat e fell deoc'h pellgargañ ar restr-mañ.",
        "windows-nonascii-filename": "N'eo ket skoret anvioù ar restroù enno arouezennoù dibar gant ar wiki-mañ.",
-       "fileexists": "Ur restr all gant an anv-se zo c'hoazh.\nTrugarez da wiriañ <strong>[[:$1]]</strong> ma n'oc'h ket sur e fell deoc'h kemmañ anezhi.\n[[$1|thumb]]",
+       "fileexists": "Ur restr all gant an anv-mañ zo c'hoazh.\nTrugarez da wiriañ <strong>[[:$1]]</strong> ma n'{{GENDER:|oc'h}} ket sur e fell deoc'h kemmañ anezhi.\n[[$1|thumb]]",
        "filepageexists": "Amañ <strong>[[:$1]]</strong> eo bet krouet ar bajenn zeskrivañ evit ar restr-mañ, padal n'eus restr ebet dezhi an anv-se evit c'hoazh.\nAn diverradenn skrivet ganeoc'h ne vo ket gwelet war ar bajenn zeskrivañ.\nMar fell deoc'h e teufe ho tiverradenn war wel eno eo ret deoc'h-c'hwi kemmañ anezhi hoc'h-unan.\n[[$1|thumb]]",
-       "fileexists-extension": "Bez' ez eus dija ur restr gant an anv-se war-bouez nebeut : [[$2|thumb]]\n* Anv ar restr emeur oc'h enporzhiañ : <strong>[[:$1]]</strong>\n* Anv ar restr zo anezhi dija : <strong>[[:$2]]</strong>\nDibabit un anv all mar plij.",
+       "fileexists-extension": "Bez' ez eus ur restr gant an hevelep anv koulz lavaret : [[$2|thumb]]\n* Anv ar restr emeur oc'h enporzhiañ : <strong>[[:$1]]</strong>\n* Anv ar restr zo anezhi c'hoazh : <strong>[[:$2]]</strong>\nDibab un anv all a fell deoc'h kentoc'h marteze ?",
        "fileexists-thumbnail-yes": "Evit doare ez eus ur skeudenn krennet he ment eus ar restr ''(thumbnail)''. [[$1|thumb]]\nGwiriit ar restr <strong>[[:$1]]</strong>.\nMard eo an hevelep skeudenn ha hini ar restr orin, ha heñvel he ment, n'eo ket dav pellgargañ ur stumm krennet ouzhpenn.",
        "file-thumbnail-no": "Kregiñ a ra anv ar restr gant <strong>$1</strong>.\nEvit doare eo ur skeudenn krennet he ment ''(thumbnail)''.\nMa'z eus ganeoc'h ur skeudenn uhel he fizhder, pellgargit anezhi; a-hend-all cheñchit anv ar restr.",
        "fileexists-forbidden": "Ur restr all gant an anv-se zo c'hoazh ha n'hall ket bezan diverket.\nMar fell deoc'h enporzhiañ ho restr memes tra, kit war ho kiz ha grit gant un anv all [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ur restr all dezhi an hevelep anv zo c'hoazh er c'havlec'h eskemm restroù.\nMar fell deoc'h enporzhiañ ar restr-mañ da vat, kit war ho kiz hag enporzhiit anezhi adarre dindan un anv all. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Rik-heñvel ouzh ar stumm a-vremañ eus <strong>[[:$1]]</strong> eo an enporzhiadenn-mañ.",
+       "fileexists-duplicate-version": "Rik-heñvel ouzh {{PLURAL:$2|ur stumm koshoc'h|stummoù koshoc'h}} eus <strong>[[:$1]]</strong> eo an enporzhiadenn-mañ.",
        "file-exists-duplicate": "Un eil eus ar {{PLURAL:$1|restr|restroù}} da-heul eo ar restr-mañ :",
        "file-deleted-duplicate": "Diverket ez eus bet c'hoazh ur restr heñvel-poch ouzh ar restr-mañ ([[:$1]]). Gwelloc'h e vefe deoc'h teuler ur sell war istor diverkadenn ar bajenn-se a-raok hec'h enporzhiañ en-dro.",
+       "file-deleted-duplicate-notitle": "Ur restr rik-heñvel ouzh homañ zo bet dilamet c'hoazh, hag an titl zo bet diverket. Gwelloc'h e vefe deoc'h gwelet gant unan bennak a c'hall gwelet roadennoù ar restroù diverket evit gwiriañ an traoù a-raok mont da adenporzhiañ anezhi.",
        "uploadwarning": "Kemenn diwall en ur ezporzhiañ",
        "uploadwarning-text": "Cheñchit deskrivadur ar restr a-is ha klaskit en-dro.",
        "savefile": "Enrollañ ar restr",
        "uploaddisabledtext": "Diweredekaet eo an enporzhiañ restroù.",
        "php-uploaddisabledtext": "Diweredekaet eo bet ar pellgargañ e PHP. Gwiriit an dibarzh arventennoù file_uploads.",
        "uploadscripted": "Er restr-mañ ez eus kodoù HTML pe skriptoù a c'hallfe bezañ kammgomprenet gant ur merdeer Kenrouedad.",
+       "upload-scripted-pi-callback": "Dibosupl eo enporzhiañ ur restr enni kemennoù plediñ gant ur follenn stil XML.",
+       "upload-scripted-dtd": "Dibosupl eo enporzhiañ restroù SVG enno un disklêriadur DTD n'eo ket standart.",
+       "uploaded-script-svg": "Kavet ez eus bet ul elfenn skriptadus \"$1\" er restr SVG enporzhiet.",
+       "uploaded-hostile-svg": "Kavet ez eus bet ur CSS diasur en elfenn stil ur restr SVG.",
+       "uploaded-event-handler-on-svg": "N'eo ket aotreet spisaat perzhioù merañ darvoudoù <code>$1=\"$2\"</code> er restroù SVG.",
+       "uploaded-href-attribute-svg": "N'eo aotreet ar perzhioù href ere restroù SVG nemet evit liammañ ouzh palioù http:// pe https://, <code>&lt;$1 $2=\"$3\"&gt;</code> kavet.",
+       "uploaded-href-unsafe-target-svg": "Kavet ez eus bet un href war-zu roadennoù diasur er restr SVG bet enporzhiet : URI pal <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-animate-svg": "Kavet ez eus bet un dikedenn \"vevaet\" a c'hallfe cheñch an href, en ur ober gant ar perzh \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> er restr SVG enporzhiet.",
+       "uploaded-setting-event-handler-svg": "Stanket eo kefluniañ perzhioù dre ar merer darvoudoù, <code>&lt;$1 $2=\"$3\"&gt;</code> kavet er restr SVG bet enporzhiet.",
+       "uploaded-setting-href-svg": "Difennet eo ober gant an dikedenn \"set\" evit ouzhpennañ ur perzh \"href\" d'an elfenn kar.",
+       "uploaded-wrong-setting-svg": "Difennet eo ober gant an dikedenn \"set\" evit ouzhpennañ ur pal a-bell/roadenn/skript d'ur perzh bennak. Kavet eo bet <code>&lt;set to=\"$1\"&gt;</code> er restr SVG enporzhiet.",
+       "uploaded-setting-handler-svg": "Stanket eo an SVG a spisa ar perzh \"handler\" gant a-bell/roadennoù/skript. Kavet eo bet <code>$1=\"$2\"</code> er restr SVG enporzhiet.",
+       "uploaded-remote-url-svg": "Stanket eo an SVG a spisa ur perzh stil gant un URL a-bell. Kavet eo bet <code>$1=\"$2\"</code> er restr SVG enporzhiet.",
+       "uploaded-image-filter-svg": "Kavet ez eus bet ur sil skeudennoù gant un URL : <code>&lt;$1 $2=\"$3\"&gt;</code> er restr SVG enporzhiet.",
+       "uploadscriptednamespace": "Un anv esaouenn berzet zo er restr SVG \"<nowiki>$1</nowiki>\".",
        "uploadinvalidxml": "N'eus ket bet gallet dielfennañ an XML er restr ezporzhiet.",
        "uploadvirus": "Viruzet eo ar restr! Titouroù : $1",
        "uploadjava": "Ur restr ZIP a ra gant Java .class eo homañ.\nN'haller ket enporzhiañ restroù Java peogwir e c'haller mont dreist da vevennoù surentez ganto.",
        "upload-options": "Dibaboù kargañ",
        "watchthisupload": "Evezhiañ ar bajenn-mañ",
        "filewasdeleted": "Ur restr gant an anv-mañ zo bet enporzhiet dija ha diverket goude-se. Mat e vefe deoc'h gwiriañ an $1 a-raok hec'h enporzhiañ en-dro.",
+       "filename-thumb-name": "Tennañ a ra da ditl ur munud. Na enpotzhiit ket munudoù skeudennoù zo er wiki dija. Ma n'eo ket unan, cheñchit anv ar restr evit ma vefe splannoc'h ha na grogfe ket evel titl ur munud.",
        "filename-bad-prefix": "Anv ar restr emaoc'h oc'h enporzhiañ a grog gant '''\"$1\"''', da lavaret eo un anv dizeskrivus roet alies ent emgefre gant luc'hskeudennerezioù niverel. Dibabit un anv splannoc'h evit deskrivañ ar restr.",
        "filename-prefix-blacklist": " #<!-- lezel al linenn-mañ tre ha tre evel m'emañ --> <pre>\n# Setu penaos emañ an ereadur :\n#   * Pep tra adal un arouezenn \"#\" betek dibenn al linenn a ya d'ober un notenn\n#   * Pep linenn n'eo ket goullo zo ur rakger evit anvioù restroù heverk roet ent emgefre gant luc'hskeudennerezioù niverel\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # pellgomzerioù hezoug zo\nIMG # jenerik\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
        "upload-proto-error": "Protokol direizh",
        "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-foreign-cant-upload": "N'eo ket kefluniet ar wiki-mañ evit enporzhiañ restroù d'ar c'havlec'h diellaouiñ diavaez goulennet.",
+       "upload-foreign-cant-load-config": "N'eus ket bet gallet kargañ ar c'hefluniadur enporzhiañ restroù diavaez d'ar c'havlec'h diellaouiñ.",
+       "upload-dialog-disabled": "Diweredekaet eo enporzhiañ restroù dre ar prenestr kaozeal-mañ war ar wiki-mañ.",
        "upload-dialog-title": "Kargañ ar restr",
        "upload-dialog-button-cancel": "Nullañ",
        "upload-dialog-button-back": "Kent",
        "upload-dialog-button-upload": "Enporzhiañ",
        "upload-form-label-infoform-title": "Munudoù",
        "upload-form-label-infoform-name": "Anv",
+       "upload-form-label-infoform-name-tooltip": "Un anv deskrivus nemetken evit ar restr a servijo da anv restr. Gallout a rit implijout ur yezh plaen gant esaouennoù. Arabat lakaat astenn ar restr.",
        "upload-form-label-infoform-description": "Deskrivadur",
+       "upload-form-label-infoform-description-tooltip": "Grit un tamm diverrañ eus perzhioù heverkañ al labour.\nEvit ur skeudenn, merkit ar pep pouezusañ eus ar pezh a weler, an degouezh pe al lec'h.",
        "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",
+       "upload-form-label-own-work-message-generic-local": "Kadarnaat a ran emaon oc'h enporzhiañ ar restr-mañ en ur zoujañ d'an termenoù implijout ha d'ar reolennoù perc'henniezh a dalvez war {{SITENAME}}.",
+       "upload-form-label-not-own-work-message-generic-local": "Ma n'oc'h ket gouest da enporzhiañ ar restr-mañ en ur zoujañ da reolennoù implij {{SITENAME}}, serrit ar prenestr-mañ ha klaskit un doare all.",
+       "upload-form-label-not-own-work-local-generic-local": "Gallout a ri klask gant [[Special:Upload|ar bajenn enporzhiañ dre ziouer]] ivez.",
+       "upload-form-label-own-work-message-generic-foreign": "Kompren mat a ran emaon oc'h enporzhiañ ar restr-mañ en ur c'havlec'h rannet. Kadarnaat a ran e ran se en ur zoujañ d'an termenoù servij hag ar reolennoù war ar berc'henniezh.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Ma n'oc'h ket gouest da enporzhiañ ar restr-mañ en ur zoujañ da reolennoù ar c'havlec'h rannet, serrit ar prenestr-mañ ha klaskit un doare all.",
+       "upload-form-label-not-own-work-local-generic-foreign": "Marteze hoc'h eus c'hoazh da glask en ur implijout [[Special:Upload|ar bajenn enporzhiañ war {{SITENAME}}]], ma c'hall ar restr-mañ bezañ enporzhiet eno en ur zoujañ d'o reolennoù implijout.",
        "backend-fail-stream": "Dibosupl eo lenn ar restr $1.",
        "backend-fail-backup": "Dibosupl enrollañ ar restr $1.",
        "backend-fail-notexists": "N'eus ket eus ar restr $1.",
        "backend-fail-read": "Dibosupl lenn ar restr $1.",
        "backend-fail-create": "Dibosupl eo krouiñ ar restr $1.",
        "backend-fail-maxsize": "Dibosupl skrivañ er restr $1 peogwir eo brasoc'h eget {{PLURAL:$2|un okted|$2 okted}}.",
-       "backend-fail-readonly": "Emañ an dermenell stokañ \"$1\" e mod lenn hepken. Setu aze an abeg a oa bet roet : \"$2\".",
+       "backend-fail-readonly": "Emañ an dermenell stokañ \"$1\" e mod lenn hepken. Setu aze an abeg a oa bet roet : <em>$2</em>.",
        "backend-fail-synced": "Emañ ar restr \"$1\" en ur stad direizhet en termenelloù stokañ diabarzh",
        "backend-fail-connect": "Dibosupl kevreañ ouzh termenell stokañ ar restr \"$1\".",
        "backend-fail-internal": "C'hoarvezet ez eus ur fazi dianav e termenell stokañ ar restr \"$1\".",
        "uploadstash-errclear": "N'eus ket bet gallet riñsañ ar restroù.",
        "uploadstash-refresh": "Freskaat roll ar restroù",
        "uploadstash-thumbnail": "gwelet ar munud",
+       "uploadstash-exception": "Dibosupl stokañ an enporzhiadenn er sanailh ($1) : \"$2\".",
        "invalid-chunk-offset": "Direizh eo offset ar rannad",
        "img-auth-accessdenied": "Moned nac'het",
        "img-auth-nopathinfo": "Mankout a ra ar PATH_INFO.\nN'eo ket kefluniet ho servijer evit reiñ an titour-mañ.\nMarteze eo diazezet war CGI ha n'hall ket skorañ img_auth.\nGwelet https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "filerevert-submit": "Disteuler",
        "filerevert-success": "'''Distroet eo bet [[Media:$1|$1]]''' da [stumm $4 an $3, $2].",
        "filerevert-badversion": "N'eus stumm lec'hel kent ebet eus ar restr-mañ d'ar mare spisaet.",
+       "filerevert-identical": "Heñvel-mik eo stumm a-vremañ ar restr ouzh an hini zo bet diuzet.",
        "filedelete": "Diverkañ $1",
        "filedelete-legend": "Diverkañ ar restr",
        "filedelete-intro": "War-nes diverkañ '''[[Media:$1|$1]]''' a-gevret gant e istor emaoc'h.",
        "filedelete-maintenance": "Evit ar mare eo diweredekaet an diverkañ hag an assevel restroù, amzer d'ober un tamm trezalc'h.",
        "filedelete-maintenance-title": "Dibosupl diverkañ ar restr",
        "mimesearch": "Klask MIME",
-       "mimesearch-summary": "Aotren a ra ar bajenn-mañ ar silañ restroù evit ar seurt restroù MIME. Enmont : seurt/isseurt, evel <code>skeudenn/jpeg</code>.",
+       "mimesearch-summary": "Aotren a ra ar bajenn-mañ silañ restroù dre o seurt MIME. Enmont : seurt danvez/isseurt pe seurt danvez, evel <code>skeudenn/jpeg</code>.",
        "mimetype": "Seurt MIME :",
        "download": "pellgargañ",
        "unwatchedpages": "Pajennoù n'int ket evezhiet",
        "listredirects": "Roll an adkasoù",
        "listduplicatedfiles": "Roll restroù gant doublennoù",
+       "listduplicatedfiles-summary": "Hemañ zo ur roll restroù m'eo stumm diwezhañ ur restr un eilad eus stumm diwezhañ ur restr bennak all. Ne vez kemeret e kont nemet ar restroù lec'hel.",
+       "listduplicatedfiles-entry": "[[$3|{{PLURAL:$2|un doubl|$2 doubl}}]] en deus [[:File:$1|$1]].",
        "unusedtemplates": "Patromoù dizimplij",
        "unusedtemplatestext": "Rollet eo amañ an holl bajennoù zo en esaouenn anv \"{{ns:template}}\" ha n'int ket implijet war pajenn ebet. Ho pet soñj da wiriañ mat hag-eñ n'eus ket liammoù all war-du ar patromoù-se a-raok diverkañ anezho.",
        "unusedtemplateswlh": "liammoù all",
        "statistics-users-active-desc": "Implijerien o deus degaset da nebeutañ ur c'hemm {{PLURAL:$1|an deiz paseet|e-kerzh an $1 deiz diwezhañ}}",
        "pageswithprop": "Pajennoù gant ur perzh pajenn",
        "pageswithprop-legend": "Pajennoù gant ur perzh pajenn",
+       "pageswithprop-text": "Rollañ a ra ar bajenn-mañ ar pajennoù a ra gant ur perzh pajenn dibar",
        "pageswithprop-prop": "Anv ar perzh :",
        "pageswithprop-submit": "Mont",
        "pageswithprop-prophidden-long": "talvoud perzh testenn hir kuzhet ($1)",
+       "pageswithprop-prophidden-binary": "Talvoud perzh binarel kuzhet ($1)",
        "doubleredirects": "Adkasoù doubl",
        "doubleredirectstext": "Rollañ a ra ar bajenn-mañ ar pajennoù a adkas da bajennoù adkas all.\nWar bep linenn ez eus liammoù war-du pajennoù an adkas kentañ hag en eil adkas, hag ivez war-du pajenn-dal an eil adkas zo sañset bezañ ar pal \"gwirion\" a zlefe an adkas kentañ kas di.\nDiskoulmet eo bet an enmontoù <del>barrennet</del>.",
        "double-redirect-fixed-move": "Dilec'hiet eo [[$1]].\nHizivaet eo bet ent emgefre ha bremañ ez adkas da [[$2]].",
        "uncategorizedcategories": "Rummadoù dirumm",
        "uncategorizedimages": "Restroù hep rummad",
        "uncategorizedtemplates": "Patromoù hep rummad",
+       "uncategorized-categories-exceptionlist": " # Ur roll rummadoù zo ennañ na zlefent ket bezañ meneget war Special:UncategorizedCategories. Unan dre linenn, en ur gregiñ gant \"*\". Ne vez ket kemeret e kont al linennoù a grog gant un arouezenn all (zoken gant esaouennoù c'houllo). Ober gant \"#\" evit ouzhpennañ evezhiadennoù.",
        "unusedcategories": "Rummadoù dizimplij",
        "unusedimages": "Skeudennoù en o-unan",
        "wantedcategories": "Rummadoù goulennet a vank",
        "wantedpages": "Pajennoù goulennet ar muiañ",
+       "wantedpages-summary": "Roll ar pajennoù a vank, gant ar muiañ a liammoù o kas war o zu, hep kontañ ar pajennoù n'eus nemet adkasoù o kas war o zu. Evit kaout roll ar pajennoù a vank gant adkasoù o kas war o zu, sellet ouzh [[{{#special:BrokenRedirects}}|roll an adkasoù a-dreuz]].",
        "wantedpages-badtitle": "Titl direizh er strollad disoc'hoù : $1",
        "wantedfiles": "Restroù a vank",
        "wantedfiletext-cat": "Ober a reer gant ar restroù da-heul koulskoude n'eus ket anezho. Gallout a reer rollañ kavlec'hioù diavaez ha pa vefe anezho. <del>Barrennet</del> e vo an holl falspozitivoù-se. Ouzhpenn-se emañ renablet an holl bajennoù zo enno restroù n'eus ket anezho e [[:$1]].",
        "deadendpagestext": "Ar pajennoù da-heul n'int ket liammet ouzh pajenn ebet all eus {{SITENAME}}.",
        "protectedpages": "Pajennoù gwarezet",
        "protectedpages-indef": "Gwarezoù da badout hepken",
+       "protectedpages-summary": "Rollañ a ra ar bajenn-mañ ar pajennoù zo gwarezet evit ar mare. Evit kaout roll ar pajennoù n'haller ket krouiñ, sellet ouzh [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Gwarez dre skalierad hepken",
        "protectedpages-noredirect": "Kuzhat an adkasoù",
        "protectedpagesempty": "N'eus pajenn gwarezet ebet gant an arventennoù-mañ evit poent.",
        "protectedpages-unknown-timestamp": "Dianav",
        "protectedpages-unknown-performer": "Implijer dianav",
        "protectedtitles": "Titloù gwarezet",
+       "protectedtitles-summary": "Rollañ a ra ar bajenn-mañ an titloù n'haller ket implijout evit krouiñ pajennoù. Evit kaout roll ar pajennoù krouet gwarezet, sellet ouzh [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "N'eus bet gwarezet titl ebet dezhañ an arventennoù-se evit poent.",
        "protectedtitles-submit": "Diskwel an titloù",
        "listusers": "Roll an implijerien",
        "apihelp": "Skoazell an API",
        "apihelp-no-such-module": "N'eo ket bet kavet ar vodulenn \"$1\".",
        "apisandbox": "Poull-traezh API",
+       "apisandbox-jsonly": "Rekis eo JavaScript evit implijout poull-traezh an API.",
        "apisandbox-api-disabled": "Diweredekaet eo API war al lec'hienn-mañ.",
-       "apisandbox-intro": "Grit gant ar bajenn-mañ evit amprouiñ '''servij Web API MediaWiki'''.\nKit da deuler ur sell war [https://www.mediawiki.org/wiki/API:Main_page titouroù an API] evit gouzout hiroc'h war an doare da embreger API. Da skouer :\n[https://www.mediawiki.org/wiki/API#A_simple_example gwelet danvez ur bennbajenn]. Dibabit un oberiadenn bennak evit gwelet skouerioù all",
+       "apisandbox-intro": "Grit gant ar bajenn-mañ evit amprouiñ <strong>servij Web API MediaWiki</strong>.\nKit da deuler ur sell war [[mw:API:Main page|teuliadur API]] evit gouzout hiroc'h war an doare da embreger API. Da skouer :\n[https://www.mediawiki.org/wiki/API#A_simple_example gwelet danvez ur bajenn zegemer]. Dibabit un oberiadenn bennak evit gwelet skouerioù all.\n\nNotit mat : ha pa vefe ar bajenn-mañ ur poull-traezh, an oberiadennoù a rit amañ a c'hall kemmañ ar wiki.",
+       "apisandbox-fullscreen": "Dispakañ ar banell",
+       "apisandbox-fullscreen-tooltip": "Brasaat panell ar poull-traezh evit leuniañ prenestr ar merdeer.",
        "apisandbox-unfullscreen": "Diskouez ar bajenn",
+       "apisandbox-unfullscreen-tooltip": "Bihanaat panell ar poull-traezh evit ma vefe hegerz liammoù merdeiñ MediaWiki.",
        "apisandbox-submit": "Sevel ar goulenn",
        "apisandbox-reset": "Riñsañ",
        "apisandbox-retry": "Klask en-dro",
+       "apisandbox-loading": "O kargañ titouroù modulenn \"$1\" an API...",
+       "apisandbox-load-error": "C'hoarvezet ez eus ur fazi en ur gargañ modulenn \"$1\" an API : $2",
+       "apisandbox-no-parameters": "N'eus arventenn ebet d'ar vodulenn API-mañ.",
        "apisandbox-helpurls": "Liammoù skoazell",
        "apisandbox-examples": "Skouerioù",
        "apisandbox-dynamic-parameters": "Arventenn ouzhpenn",
        "apisandbox-dynamic-parameters-add-label": "Ouzhpennañ un arventenn:",
        "apisandbox-dynamic-parameters-add-placeholder": "Anv an arventenn",
+       "apisandbox-dynamic-error-exists": "Bez' ez eus c'hoazh eus un arventenn anvet \"$1\".",
+       "apisandbox-deprecated-parameters": "Arventennoù dispredet",
+       "apisandbox-fetch-token": "Leuniañ emgefre ar jedouer",
+       "apisandbox-submit-invalid-fields-title": "Direizh eo maeziennoù zo",
+       "apisandbox-submit-invalid-fields-message": "Reizhit ar maeziennoù merket ha klaskit en-dro.",
        "apisandbox-results": "Disoc'hoù",
+       "apisandbox-sending-request": "O kas ur reked API...",
+       "apisandbox-loading-results": "O resev ur reked API...",
+       "apisandbox-results-error": "C'hoarvezet ez eus ur fazi en ur gargañ respont ar reked API : $1.",
+       "apisandbox-request-selectformat-label": "Diskouez roadennoù ar reked evel :",
+       "apisandbox-request-format-url-label": "Neudennad reked an URL",
        "apisandbox-request-url-label": "Goulenn URL :",
-       "apisandbox-request-time": "Pad ar goulenn: $1",
+       "apisandbox-request-json-label": "Goulenn JSON :",
+       "apisandbox-request-time": "Pad ar goulenn : {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Reizhañ ar jedouer ha kas en-dro",
+       "apisandbox-results-fixtoken-fail": "N'eus ket bet gallet adtapout ar jedouer \"$1\".",
+       "apisandbox-alert-page": "Direizh eo maeziennoù ar bajenn-mañ.",
        "apisandbox-alert-field": "Talvoud ar vaezienn-mañ n'eo ket reizh.",
        "apisandbox-continue": "Kenderc'hel",
        "apisandbox-continue-clear": "Riñsañ",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} a [https://www.mediawiki.org/wiki/API:Query#Continuing_queries gendalc'ho] ar reked diwezhañ ; {{int:apisandbox-continue-clear}} a ziverko an arventennoù a denn d'ar c'hendalc'h.",
+       "apisandbox-param-limit": "Merkañ <kbd>max</kbd> evit ober gant ar vevenn vrasañ.",
        "apisandbox-multivalue-all-namespaces": "$1 (An holl esaouennoù anv)",
        "apisandbox-multivalue-all-values": "$1 (An holl dalvoudoù)",
        "booksources": "Oberennoù dave",
        "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-rfc": "Pajennoù a ra gant liammoù hud RFC",
+       "magiclink-tracking-rfc-desc": "Ober a ra ar bajenn-mañ gant liammoù hud RFC. Gwelet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] evit an doare da dreuzlec'hiañ.",
+       "magiclink-tracking-pmid": "Pajennoù a ra gant liammoù hud PMID",
+       "magiclink-tracking-pmid-desc": "Ober a ra ar bajenn-mañ gant liammoù hud PMID. Gwelet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] evit an doare da dreuzlec'hiañ.",
        "magiclink-tracking-isbn": "Pajennoù a ra gant liammoù burzhudus ISBN",
+       "magiclink-tracking-isbn-desc": "Ober a ra ar bajenn-mañ gant liammoù hud ISBN. Gwelet [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] evit an doare da dreuzlec'hiañ.",
        "specialloguserlabel": "Implijer :",
-       "speciallogtitlelabel": "Bukadenn (titl pe implijer) :",
+       "speciallogtitlelabel": "Pal (titl pe {{ns:user}}:anv implijer) :",
        "log": "Marilhoù",
        "logeventslist-submit": "Diskouez",
        "all-logs-page": "An holl varilhoù foran",
        "logempty": "Goullo eo istor ar bajenn-mañ.",
        "log-title-wildcard": "Klask an titloù a grog gant an destenn-mañ",
        "showhideselectedlogentries": "Diskouez/kuzhat penngerioù ar marilh bet diuzet",
+       "log-edit-tags": "Kemmañ tikedennoù an enmontoù marilh diuzet",
        "checkbox-select": "Diuzañ : $1",
        "checkbox-all": "An holl",
        "checkbox-none": "Hini ebet",
        "activeusers-intro": "Setu aze ur roll eus an implijerien zo bet oberiant mui pe vui e-pad an $1 {{PLURAL:$1|deiz|deiz}} diwezhañ.",
        "activeusers-count": "$1 {{PLURAL:$1|oberiadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ",
        "activeusers-from": "Diskouez an implijerien adal :",
+       "activeusers-groups": "Diskouez an implijerien zo ezel eus ar strolladoù :",
+       "activeusers-excludegroups": "Skarzhañ an implijerien ezel eus ar strolladoù :",
        "activeusers-noresult": "N'eus bet kavet implijer ebet.",
        "activeusers-submit": "Diskouez an implijerien oberiant",
        "listgrouprights": "Gwirioù ar strolladoù implijer",
        "listgrouprights-removegroup-self": "Gallout a ra tennañ {{PLURAL:$2|ar strollad|strolladoù}} eus kont an-unan : $1",
        "listgrouprights-addgroup-self-all": "Gallout a ra ouzhpennañ an holl strolladoù da gont an-unan",
        "listgrouprights-removegroup-self-all": "Gallout a ra tennañ kuit an holl strolladoù eus kont an-unan.",
+       "listgrouprights-namespaceprotection-header": "Strishadurioù esaouennoù anv",
        "listgrouprights-namespaceprotection-namespace": "Esaouenn anv",
        "listgrouprights-namespaceprotection-restrictedto": "Gwir(ioù) hag a aotre an implijer da aozañ",
        "listgrants": "Aotreoù",
+       "listgrants-summary": "Setu aze ur roll eus an aotreoù gant ar gwirioù moned stag ouzh ar gwirioù implijer. Gallout a ra an implijerien aotren an arloadoù da implijout o c'hont gant aotreoù strishaet diazezet war ar gwirioù bet grataet d'an arload gant an implijer. Un arload a ra en anv un implijer n'hall ket ober gant gwirioù n'int ket bet roet d'an implijer da gentañ. Gallout a ra bezañ tammoù [[{{MediaWiki:Listgrouprights-helppage}}|titouroù ouzhpenn]] diwar-benn ar gwirioù hiniennel.",
        "listgrants-grant": "Aotren",
        "listgrants-rights": "Gwirioù",
        "trackingcategories": "Rummadoù evezhiañ",
+       "trackingcategories-summary": "Rollañ a ra ar bajenn-mañ ar rummadoù heuliañ leuniet ent emgefre gant MediaWiki. Gallout a ra o anvioù bezañ cheñchet en ur gemmañ ar c'hemennadennoù reizhiad a glot ganto en esaouenn anv {{ns:8}}.",
        "trackingcategories-msg": "Rummad evezhiañ",
        "trackingcategories-name": "Anv ar gemennadenn",
        "trackingcategories-desc": "Dezverkoù evit degemer rummadoù",
+       "restricted-displaytitle-ignored": "Pajennoù gant titloù diskwel lezet a-gostez",
+       "restricted-displaytitle-ignored-desc": "Ar bajenn-mañ zo dezhi un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> zo bet laosket a-gostez peogwir n'eo ket kevatal d'an titl zo d'ar bajenn bremañ.",
+       "noindex-category-desc": "Ar bajenn-mañ n'eo ket menegeret gant ar robotoù rak ar ger hud <code><nowiki>__NOINDEX__</nowiki></code> zo enni hag emañ en un esaouenn anv m'eo aotreet ar merkañ.",
+       "index-category-desc": "Un <code><nowiki>__INDEX__</nowiki></code> zo er bajenn (hag emañ en un esaouenn anv m'eo aotreet ober gant ar merk-se). Abalamour da se e vo menegeret gant robotoù pa ne vije ket bet a-hend-all.",
+       "post-expand-template-inclusion-category-desc": "Brasoc'h eo ment ar bajenn eget <code>$wgMaxArticleSize</code> ur wech dispaket he holl batromoù. Gant se n'eus ket bet gallet dispakañ patromoù zo.",
+       "post-expand-template-argument-category-desc": "Brasoc'h eo ar bajenn eget <code>$wgMaxArticleSize</code> ur wech dispaket arguzenn ur patrom (un dra bennak etre un triad briataennoù, evel <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Ur re implij eus arc'hwelioù koustus an dielfenner a vez graet gant ar bajenn (evel <code>#ifexist</code>). Gwelet [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "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).",
+       "hidden-category-category-desc": "E pajenn ar rummad emañ <code><nowiki>__HIDDENCAT__</nowiki></code>, ar pezh a vir outi a zont war wel e takad al liammoù rummad dre ziouer.",
        "trackingcategories-nodesc": "N'eus deskrivadur ebet.",
        "trackingcategories-disabled": "Diweredekaet eo ar rummad",
        "mailnologin": "Chomlec'h ebet",
        "emailccsubject": "Eilenn eus ho kemennadenn da $1: $2",
        "emailsent": "Postel kaset",
        "emailsenttext": "Kaset eo bet ho postel.",
-       "emailuserfooter": "Kaset eo bet ar postel-mañ gant $1 da $2 dre an arc'hwel \"Kas ur postel d'an implijer\" war {{SITENAME}}.",
+       "emailuserfooter": "{{GENDER:$1|Kaset}} eo bet ar postel-mañ gant $1 da {{GENDER:$2|$2}} dre an arc'hwel \"{{int:emailuser}}\" war {{SITENAME}}. Ma {{GENDER:$2|respontit}} d'ar postel-mañ e vo kaset {{GENDER:$2|ho}} postel war-eeun d'ar {{GENDER:$1|c'haser|gaserez}} orin a {{GENDER:$1|c'hallo}} gwelet {{GENDER:$2|ho}} chomlec'h postel .",
        "usermessage-summary": "En deus laosket ur gemennadenn sistem.",
        "usermessage-editor": "Kemennerezh ar reizhiad",
        "watchlist": "Roll evezhiañ",
        "watchlistanontext": "Ret eo deoc'h kevreañ evit gwelet pe aozañ an elfennoù a zo en ho roll evezhiañ.",
        "watchnologin": "Digevreet",
        "addwatch": "Ouzhpennañ d'ar roll evezhiañ",
-       "addedwatchtext": "Ouzh ho [[Special:Watchlist|rollad evezhiañ]] eo bet ouzhpennet ar bajenn \"[[:$1]]\".\nAmañ e vo rollet ar c'hemmoù da zont evit ar bajenn-mañ hag ar bajenn gaozeal stag outi.",
+       "addedwatchtext": "Ouzh ho [[Special:Watchlist|rollad evezhiañ]] eo bet ouzhpennet ar bajenn \"[[:$1]]\" hag ar bajenn gaozeal stag outi.",
+       "addedwatchtext-talk": "Ouzhpennet eo bet \"[[:$1]]\" hag ar bajenn stag outi ouzh ho [[Special:Watchlist|roll evezhiañ]].",
        "addedwatchtext-short": "Ouzhpennet eo bet ar bajenn \"$1\" d'ho roll-evezhiañ.",
        "removewatch": "Lemel a-ziwar ar roll evezhiañ",
-       "removedwatchtext": "Lamet eo bet ar bajenn \"[[:$1]]\" a-ziwar ho [[Special:Watchlist|roll evezhiañ]].",
+       "removedwatchtext": "Lamet eo bet ar bajenn \"[[:$1]]\" hag ar bajenn gaozeal stag outi a-ziwar ho [[Special:Watchlist|roll evezhiañ]].",
+       "removedwatchtext-talk": "Lamet eo bet \"[[:$1]]\" hag ar bajenn stag outi a-ziwar ho [[Special:Watchlist|roll evezhiañ]].",
        "removedwatchtext-short": "Lamet eo bet ar bajenn \"$1\" eus ho roll-evezhiañ.",
        "watch": "Evezhiañ",
        "watchthispage": "Evezhiañ ar bajenn-mañ",
        "wlshowlast": "Diskouez an $1 eurvezh $2 devezh diwezhañ",
        "watchlist-hide": "Kuzhat",
        "watchlist-submit": "Diskouez",
+       "wlshowtime": "Prantad amzer war wel :",
        "wlshowhideminor": "kemmoù dister",
        "wlshowhidebots": "robotoù",
        "wlshowhideliu": "implijerien enrollet",
        "wlshowhideanons": "implijerien dizanv",
+       "wlshowhidepatr": "kemmoù gwiriet",
        "wlshowhidemine": "ma c'hemmoù",
        "wlshowhidecategorization": "rummatadur ar bajenn",
        "watchlist-options": "Dibarzhioù ar roll evezhiañ",
        "enotif_lastvisited": "Sellet ouzh $1 evit gwelet an holl gemmoù abaoe ho selladenn ziwezhañ.",
        "enotif_lastdiff": "Gwelet $1 evit sellet ouzh ar c'hemm-mañ.",
        "enotif_anon_editor": "implijer dizanv $1",
-       "enotif_body": "$WATCHINGUSERNAME ker,\n\n$CHANGEDORCREATED eo bet pajenn $PAGETITLE {{SITENAME}} gant $PAGEEDITOR d'an $PAGEEDITDATE gwelet $PAGETITLE_URL evit gwelet ar stumm red.\n\n$NEWPAGE\n\nDiverrañ an aozer : $PAGESUMMARY $PAGEMINOREDIT\n\nMont e darempred gant an aozer :\npostel: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNemet ez afec'h da welet ar bajenn end-eeun, ne vo kemenn all ebet ma vez kemmet pelloc'h.\nGallout a rit nevesaat doare ar pennadoù evezhiet ganeoc'h en ho rollad evezhiañ ivez.\n\n            Ho reizhiad kemenn {{SITENAME}} muiañ karet\n\n--\nEvit kemmañ arventennoù ho kemennoù dre bostel, sellit ouzh\n{{canonicalurl:{{#special:Preferences}}}}\n\nEvit kemmañ doare ho rollad evezhiañ, sellit ouzh\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nEvit dilemel ar bajenn eus ho rollad evezhiañ, sellit ouzh\n$UNWATCHURL\n\nEvezhiadennoù ha skoazell pelloc'h :\n$HELPPAGE",
+       "enotif_body": "$WATCHINGUSERNAME ker,\n\n$PAGEINTRO $NEWPAGE\n\nDiverrañ an aozer : $PAGESUMMARY $PAGEMINOREDIT\n\nMont e darempred gant an aozer :\npostel: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNemet ez afec'h da welet ar bajenn end-eeun en ur vezañ kevreet, ne vo kemenn all ebet ma vez un tamm obererezh pelloc'h.\n\n\n            Ho reizhiad kemenn {{SITENAME}} muiañ karet\n\n--\nEvit kemmañ arventennoù ho kemennoù dre bostel, sellit ouzh\n{{canonicalurl:{{#special:Preferences}}}}\n\nEvit kemmañ doare ho rollad evezhiañ, sellit ouzh\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nEvit dilemel ar bajenn eus ho rollad evezhiañ, sellit ouzh\n$UNWATCHURL\n\nEvezhiadennoù ha skoazell pelloc'h :\n$HELPPAGE",
        "created": "Krouet",
        "changed": "kemmet",
        "deletepage": "Diverkañ ur bajenn",
        "confirm": "Kadarnaat",
        "excontent": "endalc'had '$1'",
-       "excontentauthor": "an danvez a oa : '$1' (ha '[[Special:Contributions/$2|$2]]' a oa bet an implijer nemetañ)",
+       "excontentauthor": "an danvez a oa : ''$1'' ha ''[[Special:Contributions/$2|$2]]'' ([[User talk:$2|kaozeal]]) a oa bet an implijer nemetañ",
        "exbeforeblank": "A-raok diverkañ e oa an endalc'had : '$1'",
        "delete-confirm": "Diverkañ \"$1\"",
        "delete-legend": "Diverkañ",
        "delete-toobig": "Bras eo istor ar bajenn-mañ, ouzhpenn $1 {{PLURAL:$1|stumm|stumm}} zo. Bevennet eo bet an diverkañ pajennoù a-seurt-se kuit da zegas reuz war {{SITENAME}} dre fazi .",
        "delete-warning-toobig": "Bras eo istor ar bajenn-mañ, ouzhpenn {{PLURAL:$1|stumm|stumm}} zo.\nDiverkañ anezhi a c'hallo degas reuz war mont en-dro diaz titouroù {{SITENAME}};\ntaolit evezh bras.",
        "deleteprotected": "Ne c'hallit ket dilemel ar bajenn-mañ rak gwarezet eo bet.",
+       "deleting-backlinks-warning": "<strong>Taolit pled :</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Pajennoù all]] zo enno liammoù war-zu ar bajenn emaoc'h o vont da zilemel pe a zo treuzkludet ar bajenn enno.",
        "rollback": "disteuler ar c'hemmoù",
        "rollbacklink": "disteuler",
        "rollbacklinkcount": "disteurel $1 {{PLURAL:$1|kemm}}",
        "rollbacklinkcount-morethan": "disteurel ouzhpenn $1 {{PLURAL:$1|kemm}}",
        "rollbackfailed": "C'hwitet eo bet an distaoladenn",
+       "rollback-missingparam": "Arventennoù rekis d'ar reked a vank.",
+       "rollback-missingrevision": "Dibosupl kargañ roadennoù ar stumm.",
        "cantrollback": "Dibosupl da zisteuler: an aozer diwezhañ eo an hini nemetañ da vezañ kemmet ar pennad-mañ",
        "alreadyrolled": "Dibosupl eo disteuler ar c'hemm diwezhañ graet d'ar bajenn [[:$1]] gant [[User:$2|$2]] ([[User talk:$2|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nkemmet pe distaolet eo bet c'hoazh gant unan bennak all.\n\nAr c'hemm diwezhañ d'ar bajenn-mañ a oa bet graet gant [[User:$3|$3]] ([[User talk:$3|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Diverradenn ar c'hemm a oa : <em>$1</em>.",
        "revertpage": "Kemmoù distaolet gant [[Special:Contributions/$2|$2]] ([[User talk:$2|Kaozeal]]); adlakaet d'ar stumm diwezhañ a-gent gant [[User:$1|$1]]",
        "revertpage-nouser": "Disteuler kemmoù un implijer kuzhet ha distreiñ d'ar stumm diwezhañ gant an {{GENDER:$1|[[implijer :$1|$1]]}}",
-       "rollback-success": "Disteuler kemmoù $1; distreiñ da stumm diwezhañ $2.",
+       "rollback-success": "Nullet ar c'hemmoù gant {{GENDER:$3|$1}};\nadlakaet diouzh ar stumm diwezhañ gant {{GENDER:$4|$2}}.",
+       "rollback-success-notify": "Nullet ar c'hemmoù gant $1;\nadlakaet diouzh ar stumm diwezhañ gant $2. [$3 Diskouez ar c'hemmoù]",
        "sessionfailure-title": "Fazi dalc'h",
        "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": "Cheñch patrom danvez ur bajenn",
+       "changecontentmodel-legend": "Cheñch ar patrom danvez",
        "changecontentmodel-title-label": "Anv ar bajenn",
+       "changecontentmodel-model-label": "Patrom danvez nevez",
        "changecontentmodel-reason-label": "Abeg :",
        "changecontentmodel-submit": "Kemmañ",
+       "changecontentmodel-success-title": "Cheñchet eo bet ar patrom danvez",
+       "changecontentmodel-success-text": "Kemmet eo bet patrom danvez [[:$1]].",
+       "changecontentmodel-cannot-convert": "N'hall ket danvez [[:$1]] bezañ troet en ur seurt $2.",
+       "changecontentmodel-nodirectediting": "N'haller ket ober kemmoù ar-eeun gant ar patrom danvez $1",
+       "changecontentmodel-emptymodels-title": "N'eus patrom danvez hegerz ebet",
+       "changecontentmodel-emptymodels-text": "N'haller ket amdreiñ danvez [[:$1]] e doare ebet.",
+       "log-name-contentmodel": "Marilh kemmañ patrom danvez",
+       "log-description-contentmodel": "Rollañ a ra ar bajenn-mañ ar c'hemmoù graet e patrom danvez ar pajennoù hag ar pajennoù a oa bet krouet gant ur patrom danvez all estreget an hini a zeu dre ziouer.",
+       "logentry-contentmodel-new": "{{GENDER:$2|Krouet eo bet}} ar bajenn $3 gant $1 en ur ober gant ur patrom danvez \"$5\" disheñvel diouzh an hini dre ziouer",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|Kemmet eo bet}} patrom danvez ar bajenn $3 gant $1, eus \"$4\" da \"$5\"",
        "logentry-contentmodel-change-revertlink": "disteuler",
        "logentry-contentmodel-change-revert": "disteuler",
        "protectlogpage": "Log_gwareziñ",
        "modifiedarticleprotection": "Kemmañ live gwareziñ \"[[$1]]\"",
        "unprotectedarticle": "diwarezet eo bet ''[[$1]]''",
        "movedarticleprotection": "en deus adkaset an arventennoù gwareziñ eus \"[[$2]]\" da \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|En deus gwarezet|He deus gwarezet}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|En deus kemmet live gwareziñ|He deus kemmet live gwareziñ}} \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|En deus lamet gwarez|He deus lamet gwarez}} \"[[$1]]\"",
        "protect-title": "Kemmañ al live gwareziñ evit \"$1\"",
        "protect-title-notallowed": "Gwelet al live gwareziñ evit \"$1\"",
        "prot_1movedto2": "[[$1]] adkaset war-du [[$2]]",
        "protect-locked-blocked": "E-keit ha ma viot stanket ne viot ket evit cheñch al live gwareziñ. Setu aze arventennoù a-vremañ ar bajenn '''$1''':",
        "protect-locked-dblock": "N'haller ket cheñch al liveoù gwareziñ rak prennet eo an diaz titouroù.\nSetu doare a-vremañ ar bajenn '''$1''' :",
        "protect-locked-access": "N'eo ket aotreet ho kont da zegas kemmoù e live gwareziñ ur bajenn.\nSetu an doare a-vremañ evit ar bajenn-mañ '''$1''':",
-       "protect-cascadeon": "Gwarezet eo ar bajenn-mañ peogwir he c'haver er {{PLURAL:$1|bajenn|pajennoù}} da-heul zo gweredekaet enno ar gwareziñ dre skalierad. Gallout a rit kemmañ al live gwareziñ met ne cheñcho ket ar gwareziñ dre skalierad.",
+       "protect-cascadeon": "Gwarezet eo ar bajenn-mañ peogwir emañ treuzkludet er {{PLURAL:$1|bajenn|pajennoù}} da-heul zo gweredekaet enno ar gwareziñ dre skalierad. Ma kemmit live gwareziñ ar bajenn-mañ ne cheñcho ket ar gwareziñ dre skalierad.",
        "protect-default": "Aotren an holl implijerien",
        "protect-fallback": "Degemer hepken an implijerien gant an aotre \"$1\"",
        "protect-level-autoconfirmed": "Degemer hepken an implijerien emgadarnaet",
        "protect-othertime": "Termen all :",
        "protect-othertime-op": "termen all",
        "protect-existing-expiry": "Termen echuiñ merket : $3, $2",
+       "protect-existing-expiry-infinity": "Termen echuiñ merket : difin",
        "protect-otherreason": "Abeg all/ouzhpenn :",
        "protect-otherreason-op": "Abeg all",
        "protect-dropdown": "*Abegoù gwareziñ boutin\n** Vandalerezh betek re\n** Stroberezh betek re\n** Tabutoù toull war kemmoù zo\n** Pajenn kemmet alies-tre",
        "undeletepagetext": "Diverket eo bet {{PLURAL:$1|ar bajenn da-heul; emañ|ar pajennoù da-heul; emaint}} e bank roadennoù an dielloù, ma c'hallont bezañ assavet.\nIngal e c'hall an diell bezañ goullonderet.",
        "undelete-fieldset-title": "Assevel ar stummoù",
        "undeleteextrahelp": "Evit assevel istor klok ar bajenn, laoskit goullo an holl logoù ha klikit war '''''{{int:undeletebtn}}'''''.\nEvit assevel stummoù zo hepken, askit ar logoù a glot gant ar stummoù da vezañ assavet, ha klikit war '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|stumm|stumm}} diellaouet",
+       "undeleterevisions": "$1 {{PLURAL:$1|adweladenn}} diverket",
        "undeletehistory": "Ma tiziverkit ar bajenn e vo erlec'hiet an holl gemmoù bet degaset enni er roll istor.\n\nMa'z eus bet krouet ur bajenn nevez dezhi an hevelep anv abaoe an diverkadenn, e teuio war wel ar c'hemmoù assavet er roll istor kent ha ne vo ket erlec'hiet ar stumm red en un doare emgefre ken.",
        "undeleterevdel": "Ne vo ket adsavet ar stumm-se eus ar bajenn ma talvez kement ha diverkañ evit darn an doare diwezhañ anezhi. En degouezh-mañ e rankit diaskañ pe diguzhat ar stummoù diverket da ziwezhañ.",
        "undeletehistorynoadmin": "Diverket eo bet ar pennad-mañ. Displeget eo perak en diverradenn a-is, war un dro gant munudoù an implijerien o deus kemmet ar bajenn a-raok na vije diverket. N'eus nemet ar verourien a c'hall tapout krog en destenn bet diverket.",
        "undelete-revision": "Stumm diverket eus $1, (gwiriadenn eus $4 da $5) gant $3 :",
        "undeleterevision-missing": "Stumm fall pe diank. Pe hoc'h eus heuliet ul liamm fall, pe eo bet diziverket ar stumm pe c'hoazh eo bet lamet diouzh an dielloù.",
+       "undeleterevision-duplicate-revid": "N'eus ket bet gallet assevel {{PLURAL:$1|ur stumm|$1 stumm}} peogwir e oa en implij {{PLURAL:$1|e|o}} <code>rev_id</code> c'hoazh.",
        "undelete-nodiff": "N'eus bet kavet stumm kent ebet.",
        "undeletebtn": "Assevel",
        "undeletelink": "gwelet/assevel",
        "undeleteviewlink": "gwelet",
        "undeleteinvert": "Eilpennañ an diuzadenn",
        "undeletecomment": "Abeg :",
-       "undeletedrevisions": "Adsavet {{PLURAL:$1|1 stumm|$1 stumm}}",
-       "undeletedrevisions-files": "Adsavet ez ez eus bet {{PLURAL:$1|1 stumm|$1 stumm}} ha {{PLURAL:$2|1 restr|$2 restr}}",
-       "undeletedfiles": "{{PLURAL:$1|1 restr|$1 restr}} adsavet",
-       "cannotundelete": "Dibosupl eo diziverkañ:\n$1",
+       "cannotundelete": "Dibosupl eo bet nullañ diziverkadennoù zo pe an holl anezho :\n$1",
        "undeletedpage": "'''Diziverket eo bet $1'''\n\nSellit ouzh [[Special:Log/delete|marilh an diverkadennoù]] evit teuler ur sell ouzh an diverkadennoù diwezhañ.",
        "undelete-header": "Gwelet [[Special:Log/delete|al log diverkañ]] evit ar pajennoù diverket nevez zo.",
        "undelete-search-title": "Klask pajennoù bet diverket",
        "namespace": "Esaouenn anv :",
        "invert": "Eilpennañ an dibab",
        "tooltip-invert": "Askañ ar voest-mañ da guzhat ar c'hemmoù er pajennoù stag ouzh an esaouenn anv diuzet (hag an esaouenn anv stag, m'emañ asket)",
+       "tooltip-whatlinkshere-invert": "Askañ ar log-mañ evit kuzhat liammoù ar pajennoù en esaouenn anv diuzet.",
        "namespace_association": "Esaouennoù anv liammet",
        "tooltip-namespace_association": "Askañ ar voest-mañ da lakaat ivez e-barzh ar gaozeadenn pe danvez an esaouenn anv liammet ouzh an esaouenn anv diuzet",
        "blanknamespace": "(Pennañ)",
        "sp-contributions-newbies-sub": "Evit an implijerien nevez",
        "sp-contributions-newbies-title": "Degasadennoù implijer evit ar c'hontoù nevez",
        "sp-contributions-blocklog": "Roll ar stankadennoù",
-       "sp-contributions-suppresslog": "degasadennoù diverket un implijer",
-       "sp-contributions-deleted": "Degasadennoù diverket",
+       "sp-contributions-suppresslog": "degasadennoù diverket {{GENDER:$1|an implijer|an implijerez}}",
+       "sp-contributions-deleted": "degasadennoù diverket {{GENDER:$1|an implijer|an implijerez}}",
        "sp-contributions-uploads": "Enporzhiadennoù",
        "sp-contributions-logs": "marilhoù",
        "sp-contributions-talk": "kaozeal",
-       "sp-contributions-userrights": "Merañ ar gwirioù",
+       "sp-contributions-userrights": "merañ gwirioù {{GENDER:$1|an implijer|an implijerez}}",
        "sp-contributions-blocked-notice": "Stanket eo an implijer-mañ evit poent. Dindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
        "sp-contributions-blocked-notice-anon": "Stanket eo ar chomlec'h IP-mañ evit ar mare.\nDindan emañ merket enmont diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
        "sp-contributions-search": "Klask degasadennoù",
        "unblock": "Distankañ an implijer",
        "blockip": "Stankañ an {{GENDER:$1|implijer|implijerez}}",
        "blockip-legend": "Stankañ an implijer",
-       "blockiptext": "Grit gant ar furmskrid a-is evit stankañ ar moned skrivañ ouzh ur chomlec'h IP pe un implijer bennak.\nSeurt diarbennoù n'hallont bezañ kemeret nemet evit mirout ouzh ar vandalerezh hag a-du gant an [[{{MediaWiki:Policy-url}}|erbedadennoù ha reolennoù da heuliañ]].\nRoit a-is an abeg resis (o verkañ, da skouer, roll ar pajennoù bet graet gaou outo).",
+       "blockiptext": "Grit gant ar furmskrid a-is evit stankañ ar moned skrivañ ouzh ur chomlec'h IP pe un implijer bennak.\nSeurt diarbennoù n'hallont bezañ kemeret nemet evit mirout ouzh ar vandalerezh hag a-du gant ar [[{{MediaWiki:Policy-url}}|reolennoù da vezañ heuliet]].\nRoit a-is an abeg resis (o verkañ, da skouer, roll ar pajennoù bet graet gaou outo).\nGallout a rit stankañ lijorennoù chomlec'hioù IP en ur ober gant an ereadur [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] syntax; /$1 eo al lijorenn hirañ aotreet evit IPv4 ha /$2 evit IPv6.",
        "ipaddressorusername": "Chomlec'h IP pe anv implijer",
        "ipbexpiry": "Pad ar stankadenn",
        "ipbreason": "Abeg :",
        "unblocked-id": "Distanket eo bet $1",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] zo bet distanket.",
        "blocklist": "Implijerien stanket",
+       "autoblocklist": "Stankadennoù emgefre",
+       "autoblocklist-submit": "Klask",
+       "autoblocklist-legend": "Rollañ ar stankadennoù emgefre",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Stankadenn emgefre|Stankadennoù emgefre}} lec'hel",
+       "autoblocklist-empty": "Goullo eo roll ar stankadennoù emgefre",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Stankadenn emgefre|Stankadennoù emgefre}} all",
        "ipblocklist": "Implijerien stanket",
        "ipblocklist-legend": "Kavout un implijer stanket",
        "blocklist-userblocks": "Kuzhat ar stankadennoù kont",
        "block-log-flags-hiddenname": "anv implijer kuzhet",
        "range_block_disabled": "Diweredekaet eo bet ar stankañ stuc'hadoù IP.",
        "ipb_expiry_invalid": "amzer termen direizh.",
+       "ipb_expiry_old": "Tremenet eo an termen echuiñ.",
        "ipb_expiry_temp": "Peurbadus e rank bezañ bloc'hadoù an implijerien guzh.",
        "ipb_hide_invalid": "Ne c'haller ket dilemel ar gont-mañ : Ouzhpenn {{PLURAL:$1|ur c'hemm|$1 kemm}} zo enni.",
        "ipb_already_blocked": "Stanket eo \"$1\" dija",
        "proxyblockreason": "Stanket eo bet hoc'h IP rak ur proksi digor eo. Trugarez da gelaouiñ ho pourvezer moned ouzh ar Genrouedad pe ho skoazell deknikel eus ar gudenn surentez-mañ.",
        "sorbsreason": "Rollet eo ho chomlec'h IP evel ur proksi digor en DNSBL implijet gant {{SITENAME}}.",
        "sorbs_create_account_reason": "Rollet eo ho chomlec'h IP evel ur proksi digor war an DNSBL implijet gant {{SITENAME}}. N'hallit ket krouiñ ur gont",
+       "softblockrangesreason": "N'eo ket aotreet kemmañ netra ebet gan tho chomlec'h IP ($1). Kevreit mar plij.",
+       "xffblockreason": "Stanket ez eus bet ur chomlec'h IP en talbenn X-Forwarded-For, ho hini pe hini ur servijer proksi implijet ganeoc'h. Setu aze abeg ar stankadenn : $1",
        "cant-see-hidden-user": "Stanket ha kuzhet eo bet dija an implijer emaoc'h o klask stankañ. Dre ma n'emañ ket ganeoc'h ar gwir hideuser, n'hallit ket gwelet pe kemmañ stankadenn an implijer.",
        "ipbblocked": "Ne c'hellit ket stankañ pe distankañ implijerien all, dre ma 'z oc'h stanket",
        "ipbnounblockself": "N'oc'h ket aotreet d'en em zistankañ ho unan",
        "lockedbyandtime": "(gant $1 d'an $2 da $3)",
        "move-page": "Dilec'hiañ $1",
        "move-page-legend": "Adenvel ur pennad",
-       "movepagetext": "Grit gant ar furmskrid a-is evit adenvel ur pennad hag adkas an holl stummoù kent anezhañ war-zu an anv nevez.\nDont a raio an titl kozh da vezañ ur bajenn adkas war-zu an titl nevez.\nGallout a rit nevesaat ent emgefre an adkasoù a-vremañ a gas d'an titl orin.\nNe vo ket kemmet liammoù an titl kozh ha ne vo ket dilec'hiet ar bajenn gaozeal, ma'z eus anezhi.\n\nMa rit ho soñj chom hep en ober, gwiriit mat an holl [[Special:DoubleRedirects|adkasoù doubl]] pe [[Special:BrokenRedirects|adkasoù torret]].\nC'hwi eo zo karget da wiriañ e kas mat al liammoù d'al lec'h int sañset kas.\n\nNotit mat '''ne vo ket''' dilec'hiet ma'z eus dija ur bajenn ganti an anv nevez, nemet e vefe un adkas ha ne vefe tamm istor ebet stag outi.\nDre se e c'haller adkas ur bajenn war-zu he lec'h orin ma oa kamm an adkas.\n\n'''DIWALLIT!'''\nGallout a ra kement-se bezañ ur c'hemm bras ha dic'hortoz evit ur pennad a vez sellet outi alies;\nbezit sur e komprenit mat an heuliadoù a-raok kenderc'hel ganti.",
-       "movepagetext-noredirectfixer": "Grit gant ar furmskrid a-is evit adenvel ur bajenn hag adkas an istor anezhi war-zu an anv nevez.\nDont a raio an titl kozh da vezañ ur bajenn adkas war-zu an titl nevez.\nGwiriit mat an [[Special:DoubleRedirects|adkasoù doubl]] hag an [[Special:BrokenRedirects|adkasoù torr]].\nEnnoc'h emañ fiziet gwiriañ e kendalc'h al liammoù da gas war-zu ar bajenn a rankont kas daveti.\n\nNotit mat ne vo '''ket''' dilec'hiet ar bajenn ma'z eus dija unan gant an titl nevez nemet e vefe goullo istor ar c'hemmoù degaset enni hag e vefe pe goullo ar bajenn pe e vefe un adkas anezhi. Gant se e c'haller adenvel ur bajenn war-zu he lec'h orin mard eo faziek an dilec'hiañ ha dibosupl eo frikañ ur bajenn zo anezhi c'hoazh. \n\n'''Diwallit !'''\nUr c'hemm bras ha dic'hortoz e c'hall bezañ evit ur bajenn a vez sellet outi alies ; bezit sur hoc'h eus komprenet mat an heuliadoù a-raok kenderc'hel ganti.",
-       "movepagetalktext": "Gant se e vo adanvet ent emgefre ar bajenn gaozeal stag, ma'z eus anezhi '''nemet ma:'''\n*ec'h adanvit ur bajenn war-du ul lec'h all,\n*ez eus ur bajenn gaozeal c'hoazh gant an anv nevez, pe\n*diweredekaet hoc'h eus ar bouton a-is.\n\nEn degouezh-se e rankot adenvel pe gendeuziñ ar bajenn c'hwi hoc'h-unan ma karit.",
+       "movepagetext": "Grit gant ar furmskrid a-is evit adenvel ur pennad hag adkas an holl stummoù kent anezhañ war-zu an anv nevez.\nDont a raio an titl kozh da vezañ ur bajenn adkas war-zu an titl nevez.\nGallout a rit nevesaat ent emgefre an adkasoù a-vremañ a gas d'an titl orin.\nMa rit ho soñj chom hep en ober, gwiriit mat an holl [[Special:DoubleRedirects|adkasoù doubl]] pe [[Special:BrokenRedirects|adkasoù torr]].\nC'hwi eo zo karget da wiriañ e kas mat al liammoù d'al lec'h int sañset kas.\n\nNotit mat <strong>ne vo ket</strong> dilec'hiet ar bjenn ma'z eus dija ur unan ganti an anv nevez, nemet e vefe un adkas ha ne vefe tamm istor ebet stag outi.\nDre se e c'haller adkas ur bajenn war-zu he lec'h orin ma oa kamm an adkas ha ne c'hallit ket frikañ ur bajenn zo anezhi c'hoazh.\n\n<strong>NOTENN :</strong>\nGallout a ra kement-se bezañ ur c'hemm bras ha dic'hortoz evit ur pennad a vez sellet outi alies;\nbezit sur e komprenit mat an heuliadoù a-raok kenderc'hel ganti.",
+       "movepagetext-noredirectfixer": "Grit gant ar furmskrid a-is evit adenvel ur bajenn hag adkas an istor anezhi war-zu an anv nevez.\nDont a raio an titl kozh da vezañ ur bajenn adkas war-zu an titl nevez.\nGwiriit mat an [[Special:DoubleRedirects|adkasoù doubl]] hag an [[Special:BrokenRedirects|adkasoù torr]].\nEnnoc'h emañ fiziet gwiriañ e kendalc'h al liammoù da gas war-zu ar bajenn a rankont kas daveti.\n\nNotit mat <strong>ne vo ket</strong> dilec'hiet ar bajenn ma'z eus dija unan gant an titl nevez nemet e vefe goullo istor ar c'hemmoù degaset enni hag e vefe pe goullo ar bajenn pe e vefe un adkas anezhi. Gant se e c'haller adenvel ur bajenn war-zu he lec'h orin mard eo faziek an dilec'hiañ ha dibosupl eo frikañ ur bajenn zo anezhi c'hoazh. \n\n<strong>'''Diwallit !</strong>\nUr c'hemm bras ha dic'hortoz e c'hall bezañ evit ur bajenn a vez sellet outi alies ; bezit sur hoc'h eus komprenet mat an heuliadoù a-raok kenderc'hel ganti.",
+       "movepagetalktext": "Ma askit al log-mañ e vo adkaset ent emgefre ar bajenn gaozeal stag outi d'an titl nevez nemet e vefe ur bajenn gaozeal na vefe ket goullo. \n\nEn degouezh-se e rankot adenvel pe gendeuziñ ar bajenn c'hwi hoc'h-unan ma karit.",
        "moveuserpage-warning": "'''Diwallit : ''' War-nes dilec'hiañ ur bajenn implijer emaoc'h. Notit mat n'eus nemet ar bajenn a vo dilec'hiet ha ne vo ''ket'' adanvet an implijer.",
+       "movecategorypage-warning": "<strong>Diwallit :</strong> Emaoc'h o vont da zilec'hiañ ur bajenn rummad. Taolit pled ne vo dilec'hiet nemet ar rummad ha ne vo ket treuzkaset <em>pajenn ebet</em> eus ar rummad kozh er rummad nevez.",
        "movenologintext": "A-benn gellout adenvel ur pennad e rankit bezañ un implijer enrollet ha bezañ [[Special:UserLogin|kevreet]].",
        "movenotallowed": "N'oc'h ket aotreet da zilec'hiañ pajennoù.",
        "movenotallowedfile": "N'oc'h ket aoteret da adenvel restroù.",
        "cant-move-to-user-page": "Noc'h ket aotreet da adenvel ur bajenn gant anv hini un implijer all (nemet un ispajenn e vefe).",
        "cant-move-category-page": "N'oc'h ket aotreet da zilec'hiañ pajennoù rummad.",
        "cant-move-to-category-page": "N'oc'h ket aotreet da zilec'hiañ ur bajenn d'ur bajenn rummad.",
+       "cant-move-subpages": "N'oc'h ket aotreet da zilec'hiañ ispajennoù.",
+       "namespace-nosubpages": "N'eo ket aotreet ober gant ispajennoù gant an esaouenn anv \"$1\".",
        "newtitle": "Titl nevez :",
        "move-watch": "Evezhiañ ar bajenn-mañ",
        "movepagebtn": "Adenvel ar pennad",
        "movelogpagetext": "Setu roll ar pajennoù bet savet un adkas evito.",
        "movesubpage": "{{PLURAL:$1|Ispajenn}}",
        "movesubpagetext": "Bez' ez eus $1 {{PLURAL:$1|ispajenn|ispajenn}} diskouezet a-is d'ar bajenn-mañ.",
+       "movesubpagetalktext": "Ar bajenn gaozeal stag he deus $1 {{PLURAL:$1|ispajenn}} diskouezet a-is.",
        "movenosubpage": "Ispajenn ebet d'ar bajenn-mañ.",
        "movereason": "Abeg :",
        "revertmove": "nullañ",
-       "delete_and_move_text": "==Ezhomm diverkañ==\n\nSavet eo ar pennad tal \"[[:$1]]\" c'hoazh.\nDiverkañ anezhañ a fell deoc'h ober evit reiñ lec'h d'an adkas ?",
+       "delete_and_move_text": "Savet eo ar bajenn dal \"[[:$1]]\" c'hoazh.\nDiverkañ anezhi a fell deoc'h ober evit reiñ lec'h d'an adkas ?",
        "delete_and_move_confirm": "Ya, diverkañ ar bajenn",
        "delete_and_move_reason": "Diverket evit ober lec'h d'an adkas \"[[$1]]\"",
        "selfmove": "Heñvel eo titl ar poent loc'hañ ha hini ar pal; n'haller ket adkas ur bajenn war-du he lec'h orin.",
        "immobile-target-namespace-iw": "N'eo ket ur pal mat al liammoù Interwiki evit adenvel pajennoù.",
        "immobile-source-page": "N'haller ket adenvel ar bajenn-mañ.",
        "immobile-target-page": "N'haller ket kas ar bajenn-mañ war-du an titl-se.",
+       "bad-target-model": "Ar pal c'hoantaet a ra gant ur patrom danvez disheñvel. N'haller ket treiñ e $2 adalek $1.",
        "imagenocrossnamespace": "N'haller ket dilec'hiañ ur skeudenn war-du un esaouenn anv n'eo ket hini ur skeudenn.",
        "nonfile-cannot-move-to-file": "N'haller ket dilec'hiañ un dra ha n'eo ket ur restr war-du an esaouenn anv restr",
        "imagetypemismatch": "Ne glot ket astenn nevez ar restr gant ar furmad-mañ.",
        "move-leave-redirect": "Lezel un adkas war-du an titl nevez",
        "protectedpagemovewarning": "'''DIWALLIT :''' Prennet eo bet ar bajenn-mañ, setu n'eus nemet an implijerien ganto gwrioù merañ a c'hall adenvel anezhi. Kasadenn ziwezhañ ar marilh a zo diskouezet amañ a-is evel dave :",
        "semiprotectedpagemovewarning": "'''NOTENN :''' Prennet eo bet ar bajenn-mañ, setu n'hall bezañ adanvet nemet gant an implijerien enskrivet. Kasadenn ziwezhañ ar marilh a zo diskouezet amañ a-is evel dave :",
-       "move-over-sharedrepo": "== Bez' ez eus eus ar restr-se dija ==\nBez' ez eus eus [[:$1]] war ur sanailh kenrannet dija. Ma cheñchit anv ar restr ne viot ket mui evit tizhout ar restr zo er sanailh kenrannet.",
+       "move-over-sharedrepo": "Bez' ez eus eus [[:$1]] war ur sanailh kenrannet dija. Ma cheñchit anv ar restr e vo friket ar restr kenrannet.",
        "file-exists-sharedrepo": "Implijet c'hoazh eo an anv dibabet gant ur restr zo war ur sanailh kenrannet.\nGrit gant un anv all.",
        "export": "Ezporzhiañ pajennoù",
        "exporttext": "Gallout a rit ezporzhiañ en XML an destenn ha pennad istor ur bajenn pe ur strollad pajennoù;\na-benn neuze e c'hall an disoc'h bezañ enporzhiet en ur wiki all a ya en-dro gant ar meziant MediaWiki dre [[Special:Import|ar bajenn enporzhiañ]].\n\nA-benn ezporzhiañ pajennoù, merkit an titloù anezho er voest skrid a-is, un titl dre linenn. Diuzit mar fell deoc'h kaout, pe get, ar stumm a-vremañ gant an holl stummoù kozh, gant linennoù itor ar bajenn, pe just ar bajenn red gant titouroù diwar-benn ar c'hemm diwezhañ.\n\nMard eo se e c'hallit ivez implijout ul liamm a seurt gant [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] evit ar bajenn [[{{MediaWiki:Mainpage}}]].",
        "thumbnail-temp-create": "Dibosupl krouiñ ur restr vunut padennek",
        "thumbnail-dest-create": "Dibosupl enrollañ ar munud.",
        "thumbnail_invalid_params": "Arventennoù direizh evit ar munud",
+       "thumbnail_toobigimagearea": "Restr brasoc'h e ventoù eget $1",
        "thumbnail_dest_directory": "Dibosupl krouiñ ar c'havlec'h pal",
        "thumbnail_image-type": "N'eo ket skoret ar seurt skeudennoù",
        "thumbnail_gd-library": "Kefluniadur diglok al levraoueg GD : dibosupl kavout an arc'hwel $1",
        "thumbnail_image-missing": "Evit doare n'eus ket eus ar restr : $1",
+       "thumbnail_image-failure-limit": "Re a daolioù-esae ($1 pe muioc'h) zo bet evit rentañ ar munud-mañ. Klaskit en-dro diwezhatoc'hik.",
        "import": "Enporzhiañ pajennoù",
-       "importinterwiki": "enporzhiadenn etrewiki",
-       "import-interwiki-text": "Diuzit ur wiki hag ur bajenn da enporzhiañ.\nMiret e vo deiziadoù ar stummmoù hag anvioù an aozerien.\nMiret eo an holl enporzhiadennoù etrewiki e-barzh [[Special:Log/import|log an enporzhiadennoù]].",
+       "importinterwiki": "Enporzhiadenn diwar ur wiki all",
+       "import-interwiki-text": "Diuzit ur wiki hag ur bajenn da enporzhiañ.\nMiret e vo deiziadoù ar stummoù hag anvioù an aozerien.\nMiret eo an holl enporzhiadennoù diwar wikioù all e-barzh [[Special:Log/import|istor an enporzhiadennoù]].",
        "import-interwiki-sourcewiki": "Wiki mammenn :",
        "import-interwiki-sourcepage": "Pajenn orin :",
        "import-interwiki-history": "Eilañ holl stummoù istor ar bajenn-mañ",
        "import-interwiki-templates": "Lakaat e-barzh an holl batromoù",
        "import-interwiki-submit": "Enporzhiañ",
+       "import-mapping-default": "Enporzhiañ d'al lec'hiadurioù dre ziouer",
+       "import-mapping-namespace": "Enporzhiañ d'un esaouenn anv :",
+       "import-mapping-subpage": "Enporzhiañ evel ispajennoù eus ar bajenn da-heul :",
        "import-upload-filename": "Anv ar restr :",
        "import-comment": "Notenn :",
        "importtext": "Ezporzhiit ar restr adal ar wiki orin en ur ober gant an arc'hwel [[Special:Export|ezporzhiañ]].\nEnrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
        "importcantopen": "N'eus ket bet gallet digeriñ ar restr enporzhiet",
        "importbadinterwiki": "Liamm etrewiki fall",
        "importsuccess": "Deuet eo an enporzhiadenn da benn vat!",
-       "importnosources": "N'eus bet spisaet tamm mammenn etrewiki ebet ha diweredekaet eo enporzhiañ an Istor war-eeun.",
+       "importnosources": "N'eus bet spisaet wiki ebet da enporzhiañ diwarnañ ha diweredekaet eo enporzhiañ an istorioù war-eeun.",
        "importnofile": "N'eus bet enporzhiet restr ebet.",
        "importuploaderrorsize": "C'hwitet eo bet enporzhiañ ar restr. Brasoc'h eo ar restr eget ar vent aotreet.",
        "importuploaderrorpartial": "C'hwitet eo vet enporzhiañ ar restr. Enporzhiet evit darn eo bet hepken.",
        "import-nonewrevisions": "N'eus bet enporzhiet degasadenn ebet (aze e oant dija, pe distaolet e oant bet abalamour da fazioù).",
        "xml-error-string": "$1 war al linenn $2, bann $3 (okted $4) : $5",
        "import-upload": "Enporzhiañ roadennoù XML",
-       "import-token-mismatch": "Kollet eo bet roadennoù an dalc'h. Klaskit en-dro.",
+       "import-token-mismatch": "Kollet eo bet roadennoù an dalc'h.\n\nMarteze oc'h bet digevreet. <strong>Gwiriit emaoc'h mat kevreet ha klaskit en-dro</strong>.\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ en-dro, ha gwiriit mat ec'h asant ho merdeer degemer toupinoù digant al lec'hienn-mañ.",
        "import-invalid-interwiki": "Dibosupl enporzhiañ adal ar wiki spisaet.",
        "import-error-edit": "N'eo ket bet enporzhiet ar bajenn \"$1\" peogwir n'oc'h ket aotreet da zegas kemmoù enni.",
        "import-error-create": "N'eo ket bet enporzhiet ar bajenn \"$1\" peogwir n'oc'h ket aotreet da grouiñ anezhi.",
        "import-error-interwiki": "Ne vez ket enporzhiet ar bajenn \"$1\" rak miret eo an anv evit liammoù diavaez (etrewiki).",
-       "import-error-special": "Ne vez ket enporzhiet ar bajenn \"$1\" rak stag eo ouzh un esaouenn anv dibar na aotre ket pajennoù.",
+       "import-error-special": "N'eo ket bet enporzhiet ar bajenn \"$1\" rak stag eo ouzh un esaouenn anv dibar na aotre ket pajennoù.",
        "import-error-invalid": "N'eo ket bet enporzhiet ar bajenn \"$1\" rak direizh e vefe hec'h anv er wiki-mañ.",
+       "import-error-unserialize": "N'eus ket bet gallet distiradekaat stumm $2 ar bajenn \"$1\". Merket eo ar stumm evel unan a ra gant ar patrom danvez $3 stiradekaat evel $4.",
+       "import-error-bad-location": "N'eus ket bet gallet stokañ war \"$1\" ar wiki-mañ ar stumm $2 a ra gant ar patrom danvez $3. N'eo ket skoret ar patrom-se er bajenn-se.",
        "import-options-wrong": "{{PLURAL:$2|Dibab fall|Dibaboù fall}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Pourchas a ra ar bennbajenn un titl n'eo ket reizh.",
        "import-rootpage-nosubpage": "Esaouenn anvioù \"$1\" eus ar bennpajenn ne aotre ket an ispajennoù.",
        "tooltip-pt-mycontris": "Roll ho tegasadennoù",
        "tooltip-pt-anoncontribs": "Ur roll eus ar c'hemmoù graet adalek ar chomlec'h IP-mañ",
        "tooltip-pt-login": "Daoust ma n'eo ket ret, ec'h aliomp deoc'h kevreañ",
+       "tooltip-pt-login-private": "Ret eo deoc'h kevreañ evit gallout ober gant ar wiki-mañ",
        "tooltip-pt-logout": "Digevreañ",
        "tooltip-pt-createaccount": "Erbedet eo deoc'h krouiñ ur gont ha kevreañ ; n'eo ket ret koulskoude.",
        "tooltip-ca-talk": "Kaozeadennoù diwar-benn ar pennad",
        "anonymous": "{{PLURAL:$1|Implijer|Implijerien}} dizanv war {{SITENAME}}",
        "siteuser": "Implijer(ez) $1 eus {{SITENAME}}",
        "anonuser": "implijer dizanv $1 eus {{SITENAME}}",
-       "lastmodifiedatby": "Kemmet eo bet ar bajenn-mañ da ziwezhañ da $2, d'an $1 gant $3",
+       "lastmodifiedatby": "Kemmet eo bet ar bajenn-mañ da ziwezhañ da $2, d'an $1 gant $3.",
        "othercontribs": "Diazezet war labour $1.",
        "others": "re all",
        "siteusers": "{{PLURAL:$2|{{GENDER:$1|An implijer|An implijerez}}|{{GENDER:$1|An implijerien|An implijerezed}}}} $1 eus {{SITENAME}}",
        "pageinfo-watchers": "Niver a dud o heuliañ",
        "pageinfo-visiting-watchers": "Niver a dud oc'h evezhiañ ar bajenn-mañ o deus sellet ouzh ar c'hemmoù diwezhañ bet graet enni",
        "pageinfo-few-watchers": "Nebeutoc'h eget $1 {{PLURAL:$1|lenner}}",
+       "pageinfo-few-visiting-watchers": "Gallout a ra bezañ, pe get, un implijer o teurel ur sell ouzh ar c'hemmoù diwezhañ",
        "pageinfo-redirects-name": "Niver a adkasoù war-zu ar bajenn-mañ",
        "pageinfo-subpages-name": "Ispajennoù eus ar bajenn-mañ",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|kasadur|kasadurioù}}; $3 {{PLURAL:$3|nann kasaduri|nann kasadurioù}})",
        "pageinfo-toolboxlink": "Titouroù ar bajenn",
        "pageinfo-redirectsto": "Adkas a ra da",
        "pageinfo-redirectsto-info": "Titouroù",
+       "pageinfo-contentpage": "Kontet evel ur bajenn danvez enni",
        "pageinfo-contentpage-yes": "Ya",
+       "pageinfo-protect-cascading": "Gwarezioù a-skalieradoù adalek amañ",
        "pageinfo-protect-cascading-yes": "Ya",
+       "pageinfo-protect-cascading-from": "Emañ ar gwarezioù o skalieradiñ adalek",
        "pageinfo-category-info": "Titouroù ar rummad",
        "pageinfo-category-total": "Niver hollek a izili",
        "pageinfo-category-pages": "Niver a bajennoù",
        "pageinfo-user-id": "ID an implijer",
        "markaspatrolleddiff": "Merkañ evel gwiriet",
        "markaspatrolledtext": "Merkañ ar pennad-mañ evel gwiriet",
+       "markaspatrolledtext-file": "Merkañ ar stumm-mañ eus ar restr evel gwiriet",
        "markedaspatrolled": "Merkañ evel gwiriet",
        "markedaspatrolledtext": "Merket eo bet ar stumm diuzet eus [[:$1]] evel gwiriet.",
        "rcpatroldisabled": "Diweredekaet ar gwiriañ ar C'hemmoù diwezhañ",
        "markedaspatrollederrortext": "Ret eo deoc'h spisaat ur stumm a-benn e verkañ evel gwiriet.",
        "markedaspatrollederror-noautopatrol": "N'oc'h ket aotreet da verkañ evel gwiriet ar c'hemmoù degaset ganeoc'h.",
        "markedaspatrollednotify": "Ar c'hemm-mañ da $1 zo bet merket evel gwiriet.",
+       "markedaspatrollederrornotify": "N'eus ket bet gallet 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",
+       "log-show-hide-tag": "$1 marilh an dikedenn",
        "confirm-markpatrolled-button": "Mat eo",
+       "confirm-markpatrolled-top": "Merkañ adweladenn $3 eus $2 evel gwiriet ?",
        "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",
        "svg-long-error": "Restr SVG direizh : $1",
        "show-big-image": "Restr orin",
        "show-big-image-preview": "Ment ar rakweled-mañ : $1.",
+       "show-big-image-preview-differ": "Ment rakwel $3 ar restr $2 : $1.",
        "show-big-image-other": "{{PLURAL:$2|pizhder all|pizhderioù all}} : $1.",
        "show-big-image-size": "$1 × $2 piksel",
        "file-info-gif-looped": "e kelc'h",
        "newimages-summary": "Diskouez a ra ar bajenn dibar-mañ roll ar restroù diwezhañ bet enporzhiet.",
        "newimages-legend": "Sil",
        "newimages-label": "Anv ar restr (pe darn anezhi) :",
+       "newimages-user": "Chomlec'h IP pe anv implijer",
        "newimages-showbots": "Diskouez an ezporzhiadennoù graet gant robotoù",
+       "newimages-hidepatrolled": "Kuzhat ar enporzhiadennoù gwiriet",
        "noimages": "Netra da welet.",
+       "gallery-slideshow-toggle": "Gwintañ ar munudoù",
        "ilsubmit": "Klask",
        "bydate": "dre an deiziad anezho",
        "sp-newimages-showfrom": "Diskouez ar restroù nevez adal $1, $2",
        "invalidateemail": "Nullañ kadarnaat ar postel",
        "notificationemail_subject_changed": "Cheñchet eo bet ar chomlec'h postel enrollet e {{SITENAME}}",
        "notificationemail_subject_removed": "Lamet eo bet ar chomlec'h postel enrollet e {{SITENAME}}",
+       "notificationemail_body_changed": "Unan bennak, c'hwi moarvat, gant ar chomlec'h IP $1,\nen deus cheñchet chomlec'h postel ar gont \"$2\" da \"$3\" war {{SITENAME}}.\n\nMa n'eo ket bet graet ganeoc'h, kit e darempred gant unan eus merourien al lec'hienn raktal.",
+       "notificationemail_body_removed": "Unan bennak, c'hwi moarvat, gant ar chomlec'h IP $1,\nen deus dilamet chomlec'h postel ar gont \"$2\" war {{SITENAME}}.\n\nMa n'eo ket bet graet ganeoc'h, kit e darempred gant unan eus merourien al lec'hienn raktal.",
        "scarytranscludedisabled": "[Diweredekaet eo an treuzkludañ etrewiki]",
        "scarytranscludefailed": "[N'eus ket bet gallet tapout ar patrom evit $1]",
        "scarytranscludefailed-httpstatus": "[c'hwitet adtapout ar patrom evit $1: HTTP $2]",
        "scarytranscludetoolong": "[URL re hir]",
        "deletedwhileediting": "'''Diwallit''' : Diverket eo bet ar bajenn-mañ bremañ ha krog e oac'h da zegas kemmoù enni!",
-       "confirmrecreate": "Diverket eo bet ar pennad-mañ gant [[User:$1|$1]] ([[User talk:$1|kaozeal]]) goude ma vije bet kroget ganeoc'h kemmañ anezhañ :\n: ''$2''\nKadarnait mar plij e fell deoc'h krouiñ ar pennad-mañ da vat.",
-       "confirmrecreate-noreason": "Diverket eo bet ar pennad-mañ gant [[User:$1|$1]] ([[User talk:$1|kaozeal]]) goude ma vije bet kroget ganeoc'h kemmañ anezhañ. Kadarnait e fell deoc'h adkrouiñ ar pennad-mañ e gwirionez.",
+       "confirmrecreate": "{{GENDER:$1|Diverket}} eo bet ar bajenn-mañ gant [[User:$1|$1]] ([[User talk:$1|kaozeal]]) goude ma vije bet kroget ganeoc'h kemmañ anezhi :\n: ''$2''\nKadarnait mar plij e fell deoc'h krouiñ ar pennad-mañ en-dro.",
+       "confirmrecreate-noreason": "{{GENDER:$1|Diverket}} eo bet ar bajenn-mañ gant [[User:$1|$1]] ([[User talk:$1|kaozeal]]) goude ma vije bet kroget ganeoc'h kemmañ anezhi. Kadarnait e fell deoc'h adkrouiñ ar pennad-mañ e gwirionez.",
        "recreate": "Adkrouiñ",
+       "confirm-purge-title": "Spurjañ ar bajenn-mañ.",
        "confirm_purge_button": "Mat eo",
        "confirm-purge-top": "Spurjañ krubuilh ar bajenn-mañ?",
        "confirm-purge-bottom": "Spurjañ ur bajenn a a naeta ar grubuilh hag a redi ar stumm nevesañ da zont war wel.",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kaozeal]])",
        "timezone-local": "Lec'hel",
        "duplicate-defaultsort": "Diwallit : Frikañ a ra an alc'hwez dre ziouer \"$2\" an hini a oa a-raok \"$1\".",
+       "duplicate-displaytitle": "<strong>Diwallit :</strong> An titl da ziskwel \"$2\" a friko an hini a oa a oa betek-henn \"$1\".",
+       "restricted-displaytitle": "<strong>Diwallit :</strong> Lezet eo bet an titl da ziskwel \"$1\" a-gostez peogwir ne glot ket gant titl ar bajenn evel m'emañ bremañ.",
+       "invalid-indicator-name": "<strong>Fazi :</strong> Ne c'hall ket perzh <code>name</code> merkerioù statud ar bajenn bezañ goullo.",
        "version": "Stumm",
        "version-extensions": "Astennoù staliet",
        "version-skins": "Gwiskadurioù staliet",
        "version-specialpages": "Pajennoù dibar",
-       "version-parserhooks": "Galvoù dielfennañ",
+       "version-parserhooks": "Astennoù an dielfenner",
        "version-variables": "Argemmennoù",
        "version-antispam": "Mirout ouzh ar strob",
        "version-other": "Diseurt",
        "version-mediahandlers": "Merer danvez liesvedia",
-       "version-hooks": "Galvoù",
-       "version-parser-extensiontags": "Balizenn dielfennañ o tont eus an astennoù",
-       "version-parser-function-hooks": "Galv an arc'hwelioù dielfennañ",
+       "version-hooks": "Krogoù",
+       "version-parser-extensiontags": "Tikedenn astennet an dielfenner ereadurel",
+       "version-parser-function-hooks": "Arc'hwelioù astennet an dielfenner ereadurel",
        "version-hook-name": "Anv ar galv",
        "version-hook-subscribedby": "Termenet gant",
        "version-version": "($1)",
        "version-ext-colheader-description": "Deskrivadur",
        "version-ext-colheader-credits": "Aozerien",
        "version-license-title": "Aotre-implijout evit $1",
+       "version-license-not-found": "N'eus bet kavet tamm titour pizh ebet diwar-benn an astenn-mañ.",
        "version-credits-title": "Kredoù evit $1",
+       "version-credits-not-found": "N'eus bet kavet tamm titour trukarekaat pizh ebet evit an astenn-mañ",
        "version-poweredby-credits": "Mont a ra ar wiki-mañ en-dro a-drugarez da '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "re all",
        "version-poweredby-translators": "troerien translatewiki.net",
        "version-libraries-license": "Aotre-implijout",
        "version-libraries-description": "Deskrivadur",
        "version-libraries-authors": "Aozerien",
+       "redirect": "Adkas dre restroù, implijerien, pajennoù, stummoù pe ID marilhañ",
+       "redirect-summary": "Adkas a ra ar bajenn dibar-mañ war-zu ur restr (anv ar restr roet), ur bajenn (ID ar stumm pe ar bajenn roet), ur bajenn implijer (ID niverel an implijer roet), pe ur moned en ur marilh (ID ar marilh roet). Implij : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Mont",
        "redirect-lookup": "Klask :",
        "redirect-value": "Talvoud :",
        "blankpage": "Pajenn c'houllo",
        "intentionallyblankpage": "A-ratozh e leusker gwenn ar bajenn-mañ",
        "external_image_whitelist": "  #Lezel al linenn-mañ tre evel m'emañ<pre>\n#Merkañ an tammoù bommoù reoliek (ar rann zo etre ar // nemetken) a-is\n#Klotañ a raint gant URLoù ar skeudennoù diavaez (gourliammet)\n#En em ziskwel evel skeudennoù a raio ar re a glot, evit ar re all e vo diskwelet ul liamm war-du ar skeudenn nemetken\n#Sellet e vo ouzh a linennoù a grog gant # evel ouzh notennoù\n#Kizidik eo ar roll-mañ ouzh an diforc'h etre lizherennoù bihan ha lizherennoù bras\n\n#Merkit holl rannoù ar bommoù reoliek a-us d'al linenn-mañ. Lezit al linenn ziwezhañ-mañ tre evel m'emañ</pre>",
-       "tags": "Balizennoù ar c'hemmoù reizh",
-       "tag-filter": "Silañ ar [[Special:Tags|balizennoù]] :",
+       "tags": "Tikedennoù ar c'hemmoù reizh",
+       "tag-filter": "Silañ an [[Special:Tags|tikedennoù]] :",
        "tag-filter-submit": "Silañ",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Balizenn}}]]: $2)",
-       "tags-title": "Balizennoù",
-       "tags-intro": "Rollañ a ra ar bajenn-mañ ar balizennoù a c'hall ar meziant implijout da verkañ kemmoù hag an dalvoudegezh anezho.",
-       "tags-tag": "Anv ar valizenn",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Dikedenn|Tikedenn}}]] : $2)",
+       "tag-mw-contentmodelchange": "cheñch ar patrom danvez",
+       "tag-mw-contentmodelchange-description": "KEmmoù a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel cheñch patrom danvez] ur bajenn",
+       "tags-title": "Tikedennoù",
+       "tags-intro": "Rollañ a ra ar bajenn-mañ an tikedennoù a c'hall ar meziant implijout da verkañ kemmoù hag o zalvoudegezh.",
+       "tags-tag": "Anv an dikedenn",
        "tags-display-header": "Neuz e rolloù ar c'hemmoù",
-       "tags-description-header": "Deskrivadur klok ar valizenn",
+       "tags-description-header": "Deskrivadur klok an dalvoudegezh",
        "tags-source-header": "Mammenn",
        "tags-active-header": "Oberiant ?",
        "tags-hitcount-header": "Kemmoù balizennet",
        "tags-active-yes": "Ya",
        "tags-active-no": "Ket",
        "tags-source-extension": "Termenet gant ar meziant",
+       "tags-source-manual": "Lakaet e pleustr gant an dorn gant an implijerien hag ar robotoù",
        "tags-source-none": "N'emañ ket en implij ken",
        "tags-edit": "aozañ",
        "tags-delete": "diverkañ",
        "tags-activate": "gweredekaat",
        "tags-deactivate": "diweredekaat",
        "tags-hitcount": "$1 {{PLURAL:$1|kemm|kemm}}",
+       "tags-manage-no-permission": "N'oc'h ket aotreet da verañ ar c'hemmañ tikedennoù.",
+       "tags-manage-blocked": "N'hallit ket merañ ar c'hemmañ tikedennoù e-keit hag {{GENDER:$1|emaoc'h}} stanket.",
        "tags-create-heading": "Krouiñ un dikedenn nevez",
+       "tags-create-explanation": "Dre ziouer e c'hallo an implijerien hag ar robotoù ober gant an tikedennoù nevez krouet.",
        "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-create-invalid-chars": "Ne c'hall ket bezañ skejoù (<code>,</code>) pe beskelloù (<code>/</code>) en anvioù an tikedennoù.",
+       "tags-create-invalid-title-chars": "Ne c'hall ket anvioù an tikedennoù ober gant arouezennoù na c'hallont ket bezañ implijet e titloù ar pajennoù .",
+       "tags-create-already-exists": "Bez' ez eus eus an tikedenn \"$1\" c'hoazh.",
+       "tags-create-warnings-above": "Setu aze ar {{PLURAL:$2|c'hemenn-diwall zo|c'hemennoù-diwall zo}} deuet war wel p'eo bet klasket krouiñ an dikedenn \"$1\" :",
+       "tags-create-warnings-below": "Kenderc'hel da grouiñ an dikedenn a fell deoc'h ?",
        "tags-delete-title": "Diverkañ an dikedenn",
+       "tags-delete-explanation-initial": "Emaoc'h o vont da ziverkañ an dikedenn \"$1\" a-ziwar an diaz roadennoù.",
+       "tags-delete-explanation-in-use": "Dilamet e vo diouzh an {{PLURAL:$2|$2 stumm pe moned marilh|holl $2 stumm ha/pe monedoù marilh}} m'emañ bet lakaet evit ar mare.",
+       "tags-delete-explanation-warning": "<strong>Ne vo ket posupl distreiñ</strong> war an ober-mañ <strong>n'haller ket nullañ</strong>, ha pa vefe gant merourien an diaz roadennoù zoken. Bezit peursur eo homañ an dikedenn a fell deoc'h diverkañ.",
+       "tags-delete-explanation-active": "Oberiant eo c'hoazh <strong>an dikedenn \"$1\" ha kenderc'hel a raio da vezañ kemeret e kont en dazont.</strong> Evit mirout na c'hoarvezfe, mont d'al lec'h(ioù) m'emañ an dikedenn da vezañ lakaet da dalvezout ha diweredekaat anezhi eno.",
        "tags-delete-reason": "Abeg :",
+       "tags-delete-submit": "Diverkañ an dikedenn-mañ da viken",
+       "tags-delete-not-allowed": "N'haller ket diverkañ an tikedennoù termenet gant un astenn nemet e vefe aotreet en un doare sklaer d'en ober gant an astenn.",
        "tags-delete-not-found": "N'eus ket eus an dikedenn \"$1\".",
+       "tags-delete-too-many-uses": "Talvezout a ra an dikedenn \"$1\" evit muioc'h eget $2 {{PLURAL:$2|stumm}}, ar pezh a dalvez ne c'hall ket bezañ diverket.",
+       "tags-delete-warnings-after-delete": "Diverket eo bet an dikedenn \"$1\" met kavet eo bet ar {{PLURAL:$2|c'hemenn|c'hemennoù}} da-heul :",
+       "tags-delete-no-permission": "N'oc'h ket aotreet da ziverkañ an dikedennoù kemmañ.",
        "tags-activate-title": "Gweredekaat an dikedenn",
+       "tags-activate-question": "Emaoc'h o vont da weredekaat an dikedenn \"$1\".",
        "tags-activate-reason": "Abeg :",
+       "tags-activate-not-allowed": "N'haller ket gweredekaat an dikedenn \"$1\".",
+       "tags-activate-not-found": "N'eus ket eus an dikedenn \"$1\".",
        "tags-activate-submit": "Gweredekaat",
        "tags-deactivate-title": "Diweredekaat an dikedenn",
+       "tags-deactivate-question": "Emaoc'h o vont da ziweredekaat an dikedenn \"$1\".",
        "tags-deactivate-reason": "Abeg :",
+       "tags-deactivate-not-allowed": "N'haller ket diweredekaat an dikedenn \"$1\".",
        "tags-deactivate-submit": "Diweredekaat",
+       "tags-apply-no-permission": "N'oc'h ket aotreet da lakaat tikedennoù kemmañ da dalvezout a-gevret gant ho kemmoù.",
+       "tags-apply-blocked": "N'hallit ket lakaat da dalvezout ar c'hemmañ tikedennoù hag ho kemmoù e-keit hag {{GENDER:$1|emaoc'h}} stanket.",
+       "tags-apply-not-allowed-one": "N'haller ket lakaat an dikedenn \"$1\" da dalvezout gant an dorn.",
+       "tags-apply-not-allowed-multi": "N'eo ket aotreet lakaat an {{PLURAL:$2|dikedenn}} da heul da dalvezout gant an dorn : $1",
+       "tags-update-no-permission": "N'oc'h ket aotreet da ouzhpennañ pe da lemel kuit tikedennoù kemmañ diwar stummoù hiniennel pe monedoù marilh.",
+       "tags-update-blocked": "N'hallit ket ouzhpennañ pe dilemel tikedennoù kemmañ e-keit hag {{GENDER:$1|emaoc'h}} stanket.",
+       "tags-update-add-not-allowed-one": "N'haller ket ouzhpennañ an dikedenn \"$1\" gant an dorn.",
+       "tags-update-add-not-allowed-multi": "N'eo ket aotreet ouzhpennañ an {{PLURAL:$2|dikedenn}} da heul gant an dorn : $1",
+       "tags-update-remove-not-allowed-one": "N'haller dilemel an dikedenn \"$1\".",
+       "tags-update-remove-not-allowed-multi": "N'haller ket dilemel an {{PLURAL:$2|dikedenn}} gant an dorn : $1",
        "tags-edit-title": "Kemmañ an tikedennoù",
        "tags-edit-manage-link": "Merañ an tikedennoù",
+       "tags-edit-revision-selected": "{{PLURAL:$1|stumm diuzet}} eus [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Darvoud eus ar marilh diuzet}} :",
+       "tags-edit-revision-legend": "Ouzhpennañ pe lemel tikedennoù a-ziwar {{PLURAL:$1|ar stumm-mañ|an $1 stumm zo}}",
+       "tags-edit-logentry-legend": "Ouzhpennañ pe dilemel tikedennoù a-ziwar {{PLURAL:$1|ar moned marilh-mañ|ar $1 moned marilh zo}}",
        "tags-edit-existing-tags": "Tikedennoù zo anezho :",
        "tags-edit-existing-tags-none": "<em>Hini ebet</em>",
        "tags-edit-new-tags": "Tikedennoù nevez :",
        "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-chosen-no-results": "N'eus bet kavet tikedenn ebet o klotañ",
        "tags-edit-reason": "Abeg :",
+       "tags-edit-revision-submit": "Lakaat ar c'hemmoù da dalvezout evit {{PLURAL:$1|ar stumm-mañ|$1 stumm}}",
+       "tags-edit-logentry-submit": "Lakaat ar c'hemmoù da dalvezout evit {{PLURAL:$1|ar moned marilh-mañ|$1 moned marilh}}",
        "tags-edit-success": "Lakaet eo bet ar c'hemmoù da dalvezout",
+       "tags-edit-failure": "N'eus ket bet gallet lakaat ar c'hemmoù da dalvezout :\n$1",
+       "tags-edit-nooldid-title": "Stumm pal direizh",
+       "tags-edit-nooldid-text": "Pe n'eus ket bet spisaet ganeoc'h stumm pal resis ebet da lakaat an arc'hwel-mañ da oberiañ warnañ, pe n'eus ket eus ar stumm spisaet.",
+       "tags-edit-none-selected": "Diuzit da nebeutañ un dikedenn da vezañ ouzhpennet pe dilamet.",
        "comparepages": "Keñveriañ pajennoù",
        "compare-page1": "Pajenn 1",
        "compare-page2": "Pajenn 2",
        "compare-revision-not-exists": "N'eus ket eus an adweladenn spisaet ganeoc'h.",
        "dberr-problems": "Ho tigarez ! Kudennoù teknikel zo gant al lec'hienn-mañ.",
        "dberr-again": "Gortozit un nebeud munutennoù a-raok adkargañ.",
-       "dberr-info": "(Dibosupl kevreañ ouzh servijer an diaz roadennoù: $1)",
-       "dberr-info-hidden": "(Ne c'haller ket mont da servijer an diaz roadennoù)",
+       "dberr-info": "(Dibosupl kevreañ ouzh an diaz roadennoù : $1)",
+       "dberr-info-hidden": "(Ne c'haller ket mont d'an diaz roadennoù)",
        "dberr-usegoogle": "E-keit-se esaeit klask dre c'hGoogle.",
        "dberr-outofdate": "Notit mat e c'hall o menegerioù dezho bezañ dispredet e-keñver ar boued zo ganeomp.",
        "dberr-cachederror": "Un eilstumm memoret eus ar bajenn goulennet eo hemañ, gallout a ra bezañ dispredet.",
        "htmlform-date-placeholder": "BBBB-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "BBBB-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "An talvoud lakaet ganeoc'h n'eo ket un deiziad anavezet. Klaskit gant ar furmad BBBB-MM-DD.",
+       "htmlform-time-invalid": "An talvoud lakaet ganeoc'h n'eo ket un eur anavezet. Klaskit gant ar furmad HH:MM:SS.",
+       "htmlform-datetime-invalid": "An talvoud lakaet ganeoc'h n'eo ket un deiziad nag un eur anavezet. Klaskit gant ar furmad BBBB-MM-DD HH:MM:SS.",
+       "htmlform-date-toolow": "An talvoud lakaet ganeoc'h zo a-raok an deiziad aotreet abretañ hag a zo $1.",
+       "htmlform-date-toohigh": "An talvoud lakaet ganeoc'h zo war-lerc'h an deiziad aotreet diwezhañ hag a zo $1.",
+       "htmlform-time-toolow": "An talvoud lakaet ganeoc'h zo a-raok an eur aotreet abretañ hag a zo $1.",
+       "htmlform-time-toohigh": "An talvoud lakaet ganeoc'h zo war-lerc'h an eur aotreet diwezhañ hag a zo $1.",
+       "htmlform-datetime-toolow": "An talvoud lakaet ganeoc'h zo a-raok an deiziad hag eur aotreet abretañ hag a zo $1.",
+       "htmlform-datetime-toohigh": "An talvoud lakaet ganeoc'h zo war-lerc'h an deiziad hag eur aotreet diwezhañ hag a zo $1.",
+       "htmlform-title-badnamespace": "N'emañ ket [[:$1]] en esaouenn anv \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "N'haller ket reiñ an titl \"$1\" d'ur bajenn bennak",
        "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-delete_redir": "{{GENDER:$2|Friket}} eo bet an adkas $3 gant $1",
+       "logentry-delete-restore": "{{GENDER:$2|Assavet eo bet}} ar bajenn $3 ($4) gant $1",
+       "logentry-delete-restore-nocount": "{{GENDER:$2|Asavet eo bet}} ar bajenn $3 gant $1",
+       "restore-count-revisions": "{{PLURAL:$1|1 stumm|$1 stumm}}",
+       "restore-count-files": "{{PLURAL:$1|1 restr|$1 restr}}",
        "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",
        "logentry-delete-revision": "{{GENDER:$2|Kemmet}} eo bet gwelusted {{PLURAL:$5|reizhadenn|$5 reizhadenn}} war ar bajenn $3 gant $1 : $4",
        "logentry-delete-event-legacy": "{{GENDER:$2|Kemmet}} eo bet gwelusted darvoudoù ar marilh $3 gant $1",
        "logentry-suppress-event-legacy": "{{GENDER:$2|Kemmet}} eo bet dre guzh gwelusted darvoudoù ar marilh d'an $3 gant $1",
        "logentry-suppress-revision-legacy": "{{GENDER:$2|Kemmet}} eo bet dre guzh gwelusted ar reizhadennoù war ar bajenn $3 gant $1",
        "revdelete-content-hid": "danvez kuzet",
-       "revdelete-summary-hid": "kemmañ an diverrañ kuzhet",
+       "revdelete-summary-hid": "kuzhet diverradenn ar c'hemmoù",
        "revdelete-uname-hid": "anv implijer kuzhet",
        "revdelete-content-unhid": "danvez war wel",
        "revdelete-summary-unhid": "kemmañ an diverrañ zo war wel",
        "revdelete-uname-unhid": "anv implijer war wel",
        "revdelete-restricted": "Lakaat ar strishadurioù da dalvezout evit ar verourien",
        "revdelete-unrestricted": "dilemel ar strishadurioù evit ar verourien",
+       "logentry-block-block": "$1 {{GENDER:$2|Stanket}} eo bet {{GENDER:$4|$3}} gant $1 e-pad $5 $6",
+       "logentry-block-unblock": "{{GENDER:$2|Distanket}} eo bet {{GENDER:$4|$3}} gant $1",
+       "logentry-block-reblock": "{{GENDER:$2|Kemmet}} eo bet gant $1 doareoù stankañ {{GENDER:$4|$3}} gant ur pad kevatal da $5 $6",
+       "logentry-suppress-block": "{{GENDER:$2|Stanket}} eo bet {{GENDER:$4|$3}} gant $1 e-pad $5 $6",
+       "logentry-suppress-reblock": "{{GENDER:$2|Kemmet}} eo bet gant $1 doareoù stankañ {{GENDER:$4|$3}} e-pad $5 $6",
+       "logentry-import-upload": "{{GENDER:$2|Enporzhiet}} eo bet $3 dre bellgargañ gant $1",
+       "logentry-import-upload-details": "{{GENDER:$2|Enporzhiet}} eo bet $3 gant $1 dre bellgargañ restroù ($4 {{PLURAL:$4|adweladenn}})",
+       "logentry-import-interwiki": "{{GENDER:$2|Enporzhiet}} eo bet $3 gant $1 adalek ur wiki all",
+       "logentry-import-interwiki-details": "{{GENDER:$2|Enporzhiet}} eo bet $3 adalek $5 gant $1 ($4 {{PLURAL:$4|adweladenn}})",
+       "logentry-merge-merge": "$1 {{GENDER:$2|en deus lakaet|he deus lakaet}} $3 da gendeuziñ e $4 (adweladennoù betek $5)",
        "logentry-move-move": "$1 en deus kaset ar bajenn $3 da $4",
        "logentry-move-move-noredirect": "kaset ar bajenn $3 da $4 gant $1 hep adkas",
        "logentry-move-move_redir": "kaset ar bajenn $3 da $4 gant $1 dreist un adkas",
        "logentry-newusers-create2": "Gant $1 eo bet krouet ar gont implijer $3",
        "logentry-newusers-byemail": "Krouet eo bet ar gont implijer $3 gant $1 ha kaset eo bet ar ger-tremen dre bostel",
        "logentry-newusers-autocreate": "{{GENDER:$2|Krouet}} eo bet kont $1 ent emgefre",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|en deus|he deus}} cheñchet an arventennoù gwarez eus $4 da $3",
+       "logentry-protect-unprotect": "{{GENDER:$2|Lamet eo bet}} gwarez $3 gant $1",
        "logentry-protect-protect": "$1 {{GENDER:$2|en|he}} deus gwarezet $3 $4",
+       "logentry-protect-protect-cascade": "{{GENDER:$2|Gwarezet eo bet}} $3 $4 [dre skalierad] gant $1",
+       "logentry-protect-modify": "{{GENDER:$2|KEmmet eo bet}} live gwareziñ $3 $4 gant $1",
+       "logentry-protect-modify-cascade": "{{GENDER:$2|Kemmet eo bet}} live gwareziñ $3 $4 [dre skalierad] gant $1",
+       "logentry-rights-rights": "{{GENDER:$2|Kemmet eo bet}} gant $1 emezeladur {{GENDER:$6|$3}} er strollad eus $4 da $5",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|Kemmet eo bet}} gant $1 emezeladur $3 er strollad",
        "logentry-rights-autopromote": "$1 zo bet {{GENDER:$2|anvet}} ent emgefre a $4 da $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet ur stumm nevez eus $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
+       "log-name-managetags": "Marilh merañ an tikedennoù",
+       "log-description-managetags": "Rollañ a ra ar bajenn-mañ an trevelloù liammet ouzh an [[Special:Tags|tikedennoù]]. N'eus er marilh nemet an oberoù bet kaset da benn dre zorn gant ur merour ; gallout a rafe ar meziant wiki bezañ bet krouet tikedennoù hep na vefent bet enrollet er marilh-mañ.",
+       "logentry-managetags-create": "{{GENDER:$2|Krouet eo bet}} an dikedenn \"$4\" gant $1",
+       "logentry-managetags-delete": "{{GENDER:$2|Diverket eo bet}} an dikedenn \"$4\" gant $1 (lamet diouzh $5 {{PLURAL:$5|adweladenn pe ur marilh moned}})",
+       "logentry-managetags-activate": "{{GENDER:$2|Gweredekaet eo bet}} an dikedenn \"$4\" gant $1 a dalvez evit an implijerien hag ar robotoù",
+       "logentry-managetags-deactivate": "{{GENDER:$2|Diweredekaet eo bet}} an dikedenn \"$4\" gant $1 a dalvez evit an implijerien hag ar robotoù",
+       "log-name-tag": "Marilh tikedennoù",
+       "log-description-tag": "Diskouez a ra ar bajenn-mañ pegoulz ez eus bet ouzhpennet pe dilamet [[Special:Tags|tikedennoù]] gant implijerien diouzh adweladennoù hiniennel pe monedoù marilh. N'eo ket rollet gant ar marilh an oberoù tikedenniñ pa'z int bet graet en ur gemmañ, diverkañ pe en ur ober un dra bennak all damheñvel",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|en deus ouzhpennet|he deus ouzhpennet}} {{PLURAL:$7|an dikedenn|an tikedennoù}} $6 da adweladennn $4 ar bajenn $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|end eus ouzhpennet|he deus ouzhpennet}}  {{PLURAL:$7|an dikedenn|an tikedennoù}} $6 da voned ar marilh $5 eus ar bajenn $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|en deus lamet kuit|he deus lamet kuit}} {{PLURAL:$9|an dikedenn|an tikedennoù}} $8 diouzh adweladenn $4 ar bajenn $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|en deus lamet kuit|he deus lamet kuit}}  {{PLURAL:$9|an dikedenn|an tikedennoù}} $8 diouzh moned marilh $5 ar bajenn $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|en deus hizivaet|he deus hizivaet}} tikedennoù en adweladenn $4 ar bajenn $3 ({{PLURAL:$7|ouzhpennet}} $6; {{PLURAL:$9|dilamet}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|en deus hizivaet|he deus hizivaet}} tikedennoù e moned ar marilh $5 eus ar bajenn $3 ({{PLURAL:$7|ouzhpennet}} $6; {{PLURAL:$9|dilamet}} $8)",
        "rightsnone": "(netra)",
-       "revdelete-summary": "diverradenn eus ar c'hemmoù",
        "rightslogentry-temporary-group": "$1 (da c'hortoz, betek $2)",
        "feedback-adding": "Oc'h ouzhpennañ ho soñj war ar bajenn...",
        "feedback-back": "Distreiñ",
        "feedback-bugornote": "Ma'z oc'h prest da zeskrivañ ur gudenn deknikel dre ar munud e c'hallit [$1 kemenn un draen].\nA-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc'h evezhiadenn d'ar bajenn \"[$3 $2]\", a-gevret gant hoc'h anv implijer hag anv ar merdeer a rit gantañ.",
        "feedback-cancel": "Nullañ",
        "feedback-close": "Graet",
+       "feedback-external-bug-report-button": "Kas un trevell teknikel",
+       "feedback-dialog-title": "Kas evezhiadennoù",
+       "feedback-dialog-intro": "Gallout a rit ober gant ar furmskrid eeun dindan evit kas hoc'h evezhiadennoù. Ouzhpennet e vo ho soñj d'ar bajenn \"$1\", a-gevret gant hoc'h anv implijer.",
        "feedback-error1": "Fazi : disoc'h dianav a-berzh an API",
        "feedback-error2": "Fazi : N'eus ket bet gallet degemer ar c'hemmoù",
        "feedback-error3": "Fazi : respont ebet a-berzh an API",
+       "feedback-error4": "Fazi : dibosupl eo embann gant an titl zo bet lakaet d'an evezhiadenn",
        "feedback-message": "Kemennadenn :",
        "feedback-subject": "Danvez :",
        "feedback-submit": "Kas",
+       "feedback-terms": "Kompren a ran ervat emañ e-barzh titouroù ma gwazour implijer titouroù diwar-benn ma merdeer ha stumm ma reizhiad korvoiñ hag a vo rannet gant an holl asambles gant ma evezhiadennoù.",
+       "feedback-termsofuse": "A-du emaon da gas evezhiadennoù diouzh an termenoù implij.",
        "feedback-thanks": "Ho trugarekaat ! Postet eo bet hoc'h evezhiadenn d'ar bajenn \"[$2 $1]\".",
        "feedback-thanks-title": "Trugarez !",
+       "feedback-useragent": "Gwazour timplijer :",
        "searchsuggest-search": "Klask e {{SITENAME}}",
        "searchsuggest-containing": "ennañ...",
        "api-error-badtoken": "Fazi diabarzh : \"jedouer\" fall.",
        "api-error-emptypage": "N'eo ket aotreet krouiñ pajennoù goullo.",
        "api-error-publishfailed": "Fazi diabarzh : dibosupl d'ar servijer embann ar restr padennek.",
        "api-error-stashfailed": "Fazi diabarzh : dibosupl d'ar servijer enrollañ ar restr padennek.",
-       "api-error-unknown-warning": "Kemenn diwall dianav : $1",
+       "api-error-unknown-warning": "Kemenn-diwall dianav : \"$1\".",
        "api-error-unknownerror": "Fazi dianav : \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|eilenn|eilenn}}",
        "duration-minutes": "$1 {{PLURAL:$1|munut|munut}}",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|eiladenn}}",
        "limitreport-ppvisitednodes": "Niver a skoulmoù rakprosesor gweladennet",
        "limitreport-ppgeneratednodes": "Niver a skoulmoù rakprosesor ganet",
+       "limitreport-postexpandincludesize": "Ment ensoc'hañ goude an emled",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|okted}}",
        "limitreport-templateargumentsize": "Ment arguzenn ar patrom",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|okted}}",
        "expand_templates_html_output": "Disoc'h HTML kriz",
        "expand_templates_ok": "Mat eo",
        "expand_templates_remove_comments": "Lemel an notennoù kuit",
-       "expand_templates_remove_nowiki": "Diverkañ a ra ar balizennoù <nowiki> en disoc'h",
+       "expand_templates_remove_nowiki": "Diverkañ a ra an tikedennoù <nowiki> en disoc'h",
        "expand_templates_generate_xml": "Gwelet ar gwezennadur XML",
        "expand_templates_generate_rawhtml": "Diskouez an HTML kriz",
        "expand_templates_preview": "Rakwelet",
+       "expand_templates_preview_fail_html": "<em>Dre m'eo gweredekaet HTML kriz {{SITENAME}} ha dre ma'z eus bet kollet roadennoù e-pad an dalc'h eo kuzhet ar rakwel abalamour d'en em wareziñ diouzh tagadennoù JavaScript.</em>\n\n<strong>Klaskit en-dro m'eo dinoaz ho koulenn rakwel.</strong>\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ goude-se, goude bezañ gwiriet mat eo digor ho merdeer d'an toupinoù evit al lec'hienn-mañ.",
+       "expand_templates_preview_fail_html_anon": "<em>Dre m'eo gweredekaet HTML kriz {{SITENAME}} ha dre ma n'oc'h ket kevreet eo kuzhet ar rakwel abalamour d'en em wareziñ diouzh tagadennoù JavaScript.</em>\n\n<strong>M'eo dinoaz ho koulenn rakwel, [[Special:UserLogin|kevreit]] ha klaskit en-dro.</strong>",
+       "expand_templates_input_missing": "Ret eo deoc'h lakaat da nebeutañ un tamm testenn moned.",
        "pagelanguage": "Kemmañ yezh ar bajenn",
        "pagelang-name": "Pajenn",
        "pagelang-language": "Yezh",
        "pagelang-submit": "Kas",
        "pagelang-nonexistent-page": "N'eus ket eus ar bajenn $1.",
        "pagelang-unchanged-language": "Kefluniet eo c'hoazh ar bajenn $1 e $2.",
+       "pagelang-unchanged-language-default": "Arventennet eo ar bajenn $1 evit bezañ e yezh dre ziouer danvez ar wiki dija.",
+       "pagelang-db-failed": "N'en deus ket gallet an diaz roadennoù cheñch yezh ar bajenn",
        "right-pagelang": "Cheñch yezh ar bajenn",
        "action-pagelang": "cheñch yezh ar bajenn",
        "log-name-pagelang": "Marilh ar cheñchamantoù yezh",
        "log-description-pagelang": "Hemañ zo ur marilh eus ar c'hemmoù e pajenn ar yezhoù.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|en deus|he deus}} cheñchet yezh ar bajenn $3 eus $4 da $5.",
+       "default-skin-not-found": "Hopala ! N'haller ket tizhout gwiskadur dre ziouer ho wiki termenet gant <code dir=\"ltr\">$wgDefaultSkin</code> evel <code>$1</code>.\n\nEvit doare emañ ar {{PLURAL:$4|gwiskadur|gwiskadurioù}} da heul en ho staliadur. Sellit ouzh [https://www.mediawiki.org/wiki/Manual:Skin_configuration dornlevr kefluniañ ar gwiskadurioù] evit gouzout penaos gweredekaat {{PLURAL:$4|anezhañ|anezho}} ha dibab an hini dre ziouer.\n\n$2\n\n; M'emaoc'h o paouez staliañ MediaWiki :\n: eo bet staliet ganeoc'h adalek git moarvat, pe war-eeun adalek ar c'hod tarzh gant un doare bennak all. Normal eo. Klaskit staliañ ar gwiskadurioù adalek [https://www.mediawiki.org/wiki/Category:All_skins kavlec'h gwiskadurioù mediawiki.org], dre :\n:* Pellgargañ [https://www.mediawiki.org/wiki/Download restr tar ar stalier], zo ennañ meus a wiskadur hag astennoù. Gallout a rit eilañ pegañ ar c'havlec'h <code>skins/</code> alese.\n:* Pellgargañ restroù tar ar gwiskadurioù hiniennel adalek [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Pellgargañ gwiskadurioù gant Git].\n: Ma rit evel-se ne zlefe ket trubuilhañ ho sanailh git ma'z oc'h un diorroer eus MediaWiki.\n\n; M'emaoc'h o paouez hizivaat MediaWiki :\n: Ne vez ket mui gweredekaet ent emgefre ar gwiskadurioù stalier gant MediaWiki 1.24 ha pelloc'h (gwelet [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery dornlevr dizoleiñ ar gwiskadurioù ent emgefre]). Pegañ {{PLURAL:$5|al linenn da heul|al linennoù da heul}} a c'hallit e <code>LocalSettings.php</code> evit gweredekaat {{PLURAL:$5|ar gwiskadur zo staliet c'hoazh|an holl wiskadurioù staliet evit poent}} :\n\n<pre dir=\"ltr\">$3</pre>\n\n; M'emaoc'h o paouez cheñch <code>LocalSettings.php</code> :\n: gwiriit div wech anv ar gwiskadurioù kuit na vije vioù-koukoug.",
+       "default-skin-not-found-no-skins": "Hopala ! N'hallet ket tizhout gwiskadur dre ziouer ho wiki termenet gant <code>$wgDefaultSkin</code> comme <code>$1</code>.\n\nN'eus bet staliet gwiskadur ebet.\n\n; M'emaoc'h o paouez staliañ pe hizivaat MediaWiki :\n: Eo bet graet ganeoc'h adalek git moarvat, pe war-eeun adalek ar c'hod tarzh gant un doare bennak all. Normal eo. Abaoe MediaWiki 1.24 ha pelloc'h n'eus mui gwiskadur ebet er sanailh pennañ. Klaski staliañ gwiskadurioù adalek [https://www.mediawiki.org/wiki/Category:All_skins kavlec'h gwiskadurioù mediawiki.org], dre :\n:* Pellgargañ [https://www.mediawiki.org/wiki/Download restr tar ar stalier] zo ennañ meus a seurt gwiskadur hag astennoù. Gallout a rit eilan-pegañ ar c'havlec'h <code>skins/</code> alese.\n:* Pellgargañ restroù tar ar gwiskadurioù hiniennel adalek [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Ober gant Git evit pellgargañ gwiskadurioù].\n: Ma rit evel-se ne zlefe ket trubuilhañ ho sanailh git ma'z oc'h un diorroer eus MediaWiki. Gwelet [https://www.mediawiki.org/wiki/Manual:Skin_configuration dornlevr kefluniañ ar gwiskadurioù] evit gouzout an doare da weredekaat ar gwiskadurioù ha da zibab an hini dre ziouer.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (gweredekaet)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>diweredekaet</strong>)",
        "mediastatistics": "Stadegoù ar media",
+       "mediastatistics-summary": "Stadegoù diwar-benn ar seurt restroù enporzhiet. Ne gemer e kont nemet stumm nevesañ ar restroù. A-gostez e vez laosket ar stummoù kozh pe diverket.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 okted|$1 a oktedoù}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Ment hollek ar restr evit ar rann-mañ : {{PLURAL:$1|$1 okted}} ($2; $3%).",
+       "mediastatistics-allbytes": "Ment hollek evit an holl restrom : {{PLURAL:$1|$1 okted}} ($2).",
        "mediastatistics-table-mimetype": "Seurt MIME",
        "mediastatistics-table-extensions": "Astennoù hag a c'haller lakaat",
        "mediastatistics-table-count": "Niver a restroù",
        "mediastatistics-header-drawing": "Tresadennoù (skeudennoù vektorel)",
        "mediastatistics-header-audio": "Kleved",
        "mediastatistics-header-video": "Videoioù",
+       "mediastatistics-header-multimedia": "Media fonnus",
        "mediastatistics-header-office": "Burev",
        "mediastatistics-header-text": "Testenn",
+       "mediastatistics-header-executable": "Parzhioù erounezadus",
        "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-ctrl-char": "Fazi arouezenn gontrolliñ. Enkodet eo bet fall marteze.",
        "json-error-syntax": "Fazi ereadur",
        "json-error-utf8": "Arouezennoù UTF-8 stummet fall, enkodet en un doare direizh marteze",
+       "json-error-recursion": "Bez' ez eus unan pe meur a zaveenn rekursivel en talvoud da enkodiñ",
+       "json-error-inf-or-nan": "Bez' ez eus unan pe meur a dalvoud NAN pe INF en talvoud da enkodiñ",
+       "json-error-unsupported-type": "Lakaet ez eus bet ur seurt talvoud n'hall ket bezañ enkodet.",
        "headline-anchor-title": "Liamm war-zu ar rannbennad-mañ",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Latin astennet",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laoseg",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Aborijen kanadian",
+       "special-characters-title-endash": "tired berr",
+       "special-characters-title-emdash": "tired hir",
+       "special-characters-title-minus": "arouezenn nemet",
+       "mw-widgets-dateinput-no-date": "N'eus bet diuzet deiziad ebet",
+       "mw-widgets-mediasearch-input-placeholder": "Klask mediaoù",
        "mw-widgets-mediasearch-noresults": "N'eus bet kavet disoc'h ebet.",
        "mw-widgets-titleinput-description-new-page": "N'eus ket eus ar bajenn-se c'hoazh",
        "mw-widgets-titleinput-description-redirect": "adkas war-zu $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Ouzhpennañ ur rummad...",
        "mw-widgets-usersmultiselect-placeholder": "Ouzhpennañ muioc'h...",
+       "date-range-from": "Adalek deiziañ an :",
+       "date-range-to": "Betek deiziad an :",
+       "sessionmanager-tie": "N'hallet ket kevrediñ meur a seurt reked dilesañ : $1.",
        "sessionprovider-generic": "$1 estez",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "Eztez diazezet war toupinoù",
+       "sessionprovider-nocookies": "Marteze eo diweredekaet an toupinoù. Bezit sur eo gweredekaet an toupinoù ha klaskit en-dro.",
        "randomrootpage": "Pajenn wrizienn dargouezhek",
        "log-action-filter-block": "Seurt bloc'had :",
+       "log-action-filter-contentmodel": "Mod kemmañ ar patrom danvez :",
+       "log-action-filter-delete": "Mod diverkañ :",
        "log-action-filter-import": "Seurt enporzhiadur :",
+       "log-action-filter-managetags": "Mod embreger ar merañ tikedennoù :",
+       "log-action-filter-move": "Mod dilec'hiañ :",
        "log-action-filter-newusers": "Seurt krouidigezh kont :",
+       "log-action-filter-patrol": "Mod evezhiañ :",
+       "log-action-filter-protect": "Mod gwareziñ :",
+       "log-action-filter-rights": "Mod kemmañ ar gwirioù :",
+       "log-action-filter-suppress": "Mod dilemel :",
+       "log-action-filter-upload": "Mod enporzhiañ :",
        "log-action-filter-all": "An holl",
        "log-action-filter-block-block": "Stankañ",
+       "log-action-filter-block-reblock": "Stankañ ar c'hemm",
        "log-action-filter-block-unblock": "Distankañ",
+       "log-action-filter-contentmodel-change": "Cheñch ar patrom danvez",
+       "log-action-filter-contentmodel-new": "Krouiñ pajennoù gant ur patrom danvez n'eo ket raktermenet",
+       "log-action-filter-delete-delete": "Diverkañ pajennoù",
+       "log-action-filter-delete-delete_redir": "Adkas ar frikañ",
+       "log-action-filter-delete-restore": "Diziverkañ pajennoù",
+       "log-action-filter-delete-event": "Diverkañ ar marilh",
+       "log-action-filter-delete-revision": "Diverkañ an adweladennoù",
+       "log-action-filter-import-interwiki": "Enporzh Treuzwiki",
+       "log-action-filter-import-upload": "Enporzh dre bellgarg XML",
        "log-action-filter-managetags-create": "Krouiñ tikedenn",
        "log-action-filter-managetags-delete": "Diverkañ tikedenn",
        "log-action-filter-managetags-activate": "Gweredekaat tikedenn",
        "log-action-filter-newusers-create2": "Krouiñ gant un implijer enrollet",
        "log-action-filter-newusers-autocreate": "Krouiñ ent emgefre",
        "log-action-filter-newusers-byemail": "Krouiñ gant ur ger-tremen kaset dre bostel",
+       "log-action-filter-patrol-patrol": "Gwiriet gant an dorn",
+       "log-action-filter-patrol-autopatrol": "Gwiriet ent emgefre",
        "log-action-filter-protect-protect": "Gwarez",
+       "log-action-filter-protect-modify": "Cheñchamant er gwarez",
        "log-action-filter-protect-unprotect": "Diwarez",
+       "log-action-filter-protect-move_prot": "Gwarez dilec'hiañ",
+       "log-action-filter-rights-rights": "Cheñchamant graet gant an dorn",
        "log-action-filter-rights-autopromote": "Kemm emgefre",
+       "log-action-filter-suppress-event": "Diverkañ marilhoù",
+       "log-action-filter-suppress-revision": "Diverkañ adweladennoù",
+       "log-action-filter-suppress-delete": "Diverkañ pajennoù",
+       "log-action-filter-suppress-block": "Diverkañ implijerien dre stankadennoù",
+       "log-action-filter-suppress-reblock": "Diverkañ implijerien dre stankadennoù lies",
        "log-action-filter-upload-upload": "Enporzhiadenn nevez",
        "log-action-filter-upload-overwrite": "Adenporzhiañ",
+       "authmanager-authn-not-in-progress": "Ne'z a ket war-raok an dilesadur pe kollet ez eus bet roadennoù dalc'h marteze. Adkrogit adalek ar penn-kentañ.",
        "authmanager-authn-no-primary": "N'eus ket bet gallet gwiriañ an titouroù kred lakaet.",
+       "authmanager-authn-no-local-user": "An titouroù anaout pourchaset n'int ket liammet gant implijer ebet er wiki-mañ.",
        "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-authn-autocreate-failed": "C'hwitet eo bet krouidigezh ur gont lec'hel ent emgefre : $1",
        "authmanager-change-not-supported": "N'haller ket cheñch an titouroù kred rak netra na rafe ganto.",
        "authmanager-create-disabled": "Diweredekaet eo ar c'hrouiñ kontoù.",
        "authmanager-create-from-login": "Evit krouiñ ho kont, leuniit ar maeziennoù.",
+       "authmanager-create-not-in-progress": "Ne'z a ket war-raok krouidigezh ar gont pe kollet ez eus bet roadennoù dalc'h marteze. Adkrogit adalek ar penn-kentañ.",
        "authmanager-create-no-primary": "N'eus ket bet gallet implijout an titouroù kred lakaet evit krouiñ ur gont.",
+       "authmanager-link-no-primary": "Ne c'hallomp ket liammañ ur gont gant an titouroù anaout pourchaset.",
+       "authmanager-link-not-in-progress": "Ne'z a ket war-raok al liammañ kontoù pe kollet ez eus bet roadennoù dalc'h marteze. Adkrogit adalek ar penn-kentañ.",
        "authmanager-authplugin-setpass-failed-title": "C'hwitet eo bet ar cheñchamant ger-tremen",
+       "authmanager-authplugin-setpass-failed-message": "Nac'het eo bet cheñch ar ger-tremen gant an adveziant dilesa.",
+       "authmanager-authplugin-create-fail": "Nac'het eo bet krouiñ ar gont gant an adveziant dilesa.",
+       "authmanager-authplugin-setpass-denied": "N'eo ket aotreet cheñch gerioù-tremen gant an adveziant dilesa.",
        "authmanager-authplugin-setpass-bad-domain": "Domani direizh.",
+       "authmanager-autocreate-noperm": "N'haller ket krouiñ kontoù ent emgefre.",
+       "authmanager-autocreate-exception": "Diweredekaet eo bet ar c'hrouiñ kontoù evit ar mare abalamour da fazioù kent.",
        "authmanager-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
+       "authmanager-userlogin-remembermypassword-help": "Daoust ha rankout a reer derc'hel soñj eus ar ger-tremen pelloc'h eget pad an dalc'h.",
+       "authmanager-username-help": "Anv implijer evit ar gwiriekaat.",
+       "authmanager-password-help": "Ger-tremen evit ar gwiriekaat.",
+       "authmanager-domain-help": "Domani evit ar gwiriekaat diavaez.",
        "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-password-domain": "Dilesadur diazezet war ur ger-tremen hag an domani",
        "authmanager-provider-temporarypassword": "Ger-tremen da c'hortoz",
+       "authprovider-confirmlink-message": "Diwar an taolioù-esae diwezhañ graet ganeoc'h evit kevreañ e c'haller liammañ ar c'hontoù da heul ouzh ho kont wiki. Ur wech liammet e c'hallit kevreañ dre ar c'hontoù-se. Diuzit ar re zo da vezañ liammet.",
+       "authprovider-confirmlink-request-label": "Kontoù a zlefe bezañ liammet",
        "authprovider-confirmlink-success-line": "$1: bet liammet ervat.",
+       "authprovider-confirmlink-failed": "N'omp ket deuet a-benn da liamm ar gont : $1",
+       "authprovider-confirmlink-ok-help": "Kenderc'hel goude bezañ diskwelet kemennadennoù c'hwitadenn al liammañ.",
        "authprovider-resetpass-skip-label": "Lammat",
        "authprovider-resetpass-skip-help": "Lammat adderaouekaat ar ger-tremen.",
+       "authform-nosession-login": "Mat eo bet an dilesadur met ho merdeer n'eo ket evit \"kaout soñj\" eo bet kevreet.\n\n$1",
+       "authform-nosession-signup": "Krouet eo bet ar gont ervat met ho merdeer n'eo ket evit \"kaout soñj\" eo bet kevreet.\n\n$1",
        "authform-newtoken": "Jedouer a vank. $1",
        "authform-notoken": "Jedouer a vank",
        "authform-wrongtoken": "Jedouer fall",
        "specialpage-securitylevel-not-allowed-title": "Berzet",
+       "specialpage-securitylevel-not-allowed": "Ho tigarez, n'oc'h ket aotreet d'ober gant ar bajenn-mañ rak n'eus ket bet gallet gwiriañ piv oc'h.",
        "authpage-cannot-login": "N'haller ket kregiñ da gevreañ",
+       "authpage-cannot-login-continue": "Dibosupl kenderc'hel gant ar gevreadenn. Echu eo an dalc'h evit doare.",
        "authpage-cannot-create": "N'haller ket kregiñ da grouiñ ar gont.",
+       "authpage-cannot-create-continue": "Dibosupl eo kenderc'hel da grouiñ ar gont. Echu eo an dalc'h evit doare.",
+       "authpage-cannot-link": "Dibosupl kregiñ da liammañ ar gont.",
+       "authpage-cannot-link-continue": "Dibosupl kenderc'hel da liammañ ar gont. Aet eo an eztez d'he zermen moarvat.",
        "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.",
+       "changecredentials-success": "Cheñchet eo bet ho titouroù anaout.",
        "removecredentials": "Lemel an titouroù kred",
        "removecredentials-submit": "Lemel an aotreoù",
        "removecredentials-invalidsubpage": "N'eo ket $1 ur seurt titour kred reizh.",
+       "removecredentials-success": "Lamet kuit eo bet ho titouroù anaout.",
        "credentialsform-provider": "Seurt titouroù kred :",
        "credentialsform-account": "Anv ar gont :",
        "cannotlink-no-provider-title": "N'eus kont ebet da liammañ",
        "linkaccounts-submit": "Liammañ ar c'hontoù",
        "unlinkaccounts": "Diliammañ ar c'hontoù",
        "unlinkaccounts-success": "Diliammet eo bet ar gont.",
+       "authenticationdatachange-ignored": "N'eus ket bet gallet cheñch ho roadennoù anaout. Marteze a-wac'h peogwir ne oa ket bet kefluniet pourvezer ebet.",
+       "userjsispublic": "Notit mat : ne zlefe ket bezañ roadennoù personel en ispajennoù JavaScript rak an implijerien all a c'hall gwelet anezho.",
+       "usercssispublic": "Notit mat : ne zlefe ket bezañ roadennoù personel en ispajennoù CSS rak an implijerien all a c'hall gwelet anezho.",
+       "restrictionsfield-badip": "Chomlec'h IP pe lijorenn direizh : $1",
+       "restrictionsfield-label": "Lijorennoù IP aotreet :",
        "restrictionsfield-help": "Ur chomlec'h IP pe un esaouenn CIDR dre linenn. Evit gweredekaat pep tra, ober gant <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "Adweladenn $1",
-       "pageid": "ID ar bajenn $1"
+       "pageid": "ID ar bajenn $1",
+       "rawhtml-notallowed": "N'hall an tikedennoù &lt;html&gt; bezañ implijet nemet er pajennoù normal.",
+       "gotointerwiki": "Kuitaat {{SITENAME}}",
+       "gotointerwiki-invalid": "Direizh eo an titl merket",
+       "gotointerwiki-external": "Emaoc'h war-nes kuitaat {{SITENAME}} evit mont da welet [[$2]] hag a zo ul lec'hienn all a-ziforc'h.\n\n[$1 Klikañ amañ evit kenderc'hel war $1].",
+       "undelete-cantedit": "N'hallit ket diziverkañ ar bajenn-mañ rak n'oc'h ket aotreet da gemmañ anezhi.",
+       "undelete-cantcreate": "N'hallit ket diziverkañ ar bajenn-mañ rak n'eus pajenn ebet gant an anv-mañ ha n'oc'h ket aotreet da grouiñ ar bajenn-mañ."
 }
index bac1f15..da9b6d7 100644 (file)
        "rcshowhideliu": "Drustírástí kárband áte $1",
        "rcshowhideanons": "Bidar kárband áte $1",
        "rcshowhidemine": "Kaná radbadal áte $1",
-       "rclinks": "Guđđíko $2 de teŧí maroká guđđíko $1 radbadal e nişán et<br />$3",
+       "rclinks": "Guđđíko $2 de teŧí maroká guđđíko $1 radbadal e nişán et",
        "diff": "fark",
        "hist": "lekav",
        "hide": "aodem kar",
index f765098..4354ed6 100644 (file)
                        "Srdjan m",
                        "Semso98",
                        "Matma Rex",
-                       "Сербијана"
+                       "Сербијана",
+                       "Asmen",
+                       "Obsuser"
                ]
        },
-       "tog-underline": "Podvuci veze:",
+       "tog-underline": "Podvlačenje linkova:",
        "tog-hideminor": "Sakrij manje izmjene u spisku nedavnih izmjena",
        "tog-hidepatrolled": "Sakrij patrolirane izmjene u nedavnim promjenama",
        "tog-newpageshidepatrolled": "Sakrij patrolirane stranice sa spiska novih stranica",
        "thursday": "četvrtak",
        "friday": "petak",
        "saturday": "subota",
-       "sun": "Ned",
-       "mon": "Pon",
-       "tue": "Uto",
-       "wed": "Sri",
-       "thu": "Ä\8cet",
-       "fri": "Pet",
-       "sat": "Sub",
+       "sun": "ned",
+       "mon": "pon",
+       "tue": "uto",
+       "wed": "sri",
+       "thu": "Ä\8det",
+       "fri": "pet",
+       "sat": "sub",
        "january": "januar",
        "february": "februar",
        "march": "mart",
        "category_header": "Stranice u kategoriji \"$1\"",
        "subcategories": "Potkategorije",
        "category-media-header": "Datoteke u kategoriji \"$1\"",
-       "category-empty": "''Ova kategorija trenutno ne sadrži članke ni medije.''",
+       "category-empty": "<em>Ova kategorija trenutno ne sadrži članke ni medije.</em>",
        "hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
        "hidden-category-category": "Skrivene kategorije",
        "category-subcat-count": "{{PLURAL:$2|Ova kategorija samo ima sljedeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeću potkategoriju|sljedeće $1 potkategorije|sljedećih $1 potkategorija}}, od $2 ukupno.}}",
        "about": "O",
        "article": "Članak",
        "newwindow": "(otvara se u novom prozoru)",
-       "cancel": "Odustani",
+       "cancel": "Otkaži",
        "moredotdotdot": "Više...",
        "morenotlisted": "Ovaj spisak možda nije potpun.",
        "mypage": "Stranica",
        "anontalk": "Razgovor",
        "navigation": "Navigacija",
        "and": "&#32;i",
-       "qbfind": "Pronađite",
+       "qbfind": "Pronađi",
        "qbbrowse": "Potraži",
        "qbedit": "Uredi",
        "qbpageoptions": "Opcije stranice",
        "tagline": "Izvor: {{SITENAME}}",
        "help": "Pomoć",
        "search": "Pretraga",
+       "search-ignored-headings": " #<!-- ne mijenjajte ništa u ovom redu --> <pre>\n# Zaglavlja koja će biti zanemarena pri pretrazi.\n# Izmjene koje ovdje napravite stupit će na snagu čim se stranica sa zaglavljem indeksira.\n# Možete forsirati da se stranica indeksira tako što ćete izvršiti prazno uređivanje.\n# Sintaksa je sljedeća:\n#   * Sve od znaka \"#\" pa do kraja reda je komentar.\n#   * Svaki red koji nije prazan jest tačan naziv koji će biti zanemaren, s tim da se razlikuju mala i velika slova i sve ostalo.\nReference\nVanjski linkovi\nTakođer pogledajte\n #</pre> <!-- ne mijenjajte ništa u ovom redu -->",
        "searchbutton": "Traži",
        "go": "Idi",
        "searcharticle": "Idi",
        "permalink": "Trajni link",
        "print": "Štampaj",
        "view": "Pogled",
-       "view-foreign": "Vidi na $1",
+       "view-foreign": "Vidi na {{GRAMMAR:dativ|$1}}",
        "edit": "Uredi",
        "edit-local": "Uredi lokalni opis",
        "create": "Napravi",
        "viewdeleted_short": "Pogledaj {{PLURAL:$1|jednu obrisanu izmjenu|$1 obrisane izmjene|$1 obrisanih izmjena}}",
        "protect": "Zaštiti",
        "protect_change": "promijeni",
-       "protectthispage": "Zaštitite ovu stranicu",
+       "protectthispage": "Zaštiti ovu stranicu",
        "unprotect": "Promijeni zaštitu",
        "unprotectthispage": "Promijeni zaštitu ove stranice",
        "newpage": "Nova stranica",
        "tool-link-emailuser": "Pošalji e-poruku {{GENDER:$1|korisniku|korisnici}}",
        "userpage": "Pogledaj korisničku stranicu",
        "projectpage": "Pogledaj stranicu projekta",
-       "imagepage": "Pogledajte stranicu datoteke",
+       "imagepage": "Pogledaj stranicu datoteke",
        "mediawikipage": "Pogledaj stranicu sa porukama",
-       "templatepage": "Pogledajte stranicu za šablone",
+       "templatepage": "Pogledaj stranicu za šablone",
        "viewhelppage": "Pogledajte stranicu za pomoć",
        "categorypage": "Pogledaj stranicu kategorije",
        "viewtalkpage": "Pogledaj razgovor",
        "redirectedfrom": "(Preusmjereno sa $1)",
        "redirectpagesub": "Preusmjerenje",
        "redirectto": "Preusmjerenje na:",
-       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena u $2 na $1.",
+       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena na datum $1 u $2.",
        "viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "jumpto": "Idi na:",
-       "jumptonavigation": "navigacija",
-       "jumptosearch": "traži",
+       "jumptonavigation": "navigaciju",
+       "jumptosearch": "pretragu",
        "view-pool-error": "Žao nam je, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da pregleda ovu stranicu.\nMolimo pričekajte trenutak prije nego što ponovno pokušate pristupiti ovoj stranici.\n\n$1",
        "generic-pool-error": "Nažalost, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da vidi ovaj resurs.\nMolimo pričekajte trenutak prije nego što ponovo pokušate da mu pristupite.",
        "pool-timeout": "Zaustavi čekanje na zaključavanje",
        "pool-servererror": "Usluga brojača poola nije dostupna ($1).",
        "poolcounter-usage-error": "Greška pri upotrebi: $1",
        "aboutsite": "O {{GRAMMAR:dativ|{{SITENAME}}}}",
-       "aboutpage": "Project:O_projektu_{{SITENAME}}",
+       "aboutpage": "Project:O {{GRAMMAR:dativ|{{SITENAME}}}}",
        "copyright": "Sadržaj je dostupan pod licencom $1 osim ako je navedeno drugačije.",
-       "copyrightpage": "{{ns:project}}:Autorska_prava",
+       "copyrightpage": "{{ns:project}}:Autorska prava",
        "currentevents": "Novosti",
        "currentevents-url": "Project:Novosti",
        "disclaimers": "Odricanje odgovornosti",
        "privacypage": "Project:Pravila o anonimnosti",
        "badaccess": "Greška pri odobrenju",
        "badaccess-group0": "Nije vam dozvoljeno izvršiti akciju koju ste zahtjevali.",
-       "badaccess-groups": "Akcija koju ste zahtjevali je ograničena na korisnike iz {{PLURAL:$2|ove grupe|jedne od grupa}}: $1.",
+       "badaccess-groups": "Radnja koju ste zahtijevali ograničena je samo korisnicima u {{PLURAL:$2|ovoj grupi|jednoj od ovih grupa}}: $1.",
        "versionrequired": "Potrebna je verzija $1 MediaWikija",
        "versionrequiredtext": "Potrebna je verzija $1 MediaWikija da bi se koristila ova strana. Pogledaj [[Special:Version|verziju]].",
        "ok": "U redu",
        "databaseerror-query": "Upit: $1",
        "databaseerror-function": "Funkcija: $1",
        "databaseerror-error": "Greška: $1",
-       "laggedslavemode": "'''Upozorenje''': Stranica, možda, nije ažurirana.",
+       "laggedslavemode": "<strong>Upozorenje:</strong> Moguće je da stranica nije ažurirana.",
        "readonly": "Baza je zaključana",
        "enterlockreason": "Unesite razlog za zaključavanje, uključujući procjenu vremena otključavanja",
        "readonlytext": "Baza podataka trenutno je zaključana za nove unose i druge izmjene, vjerovatno zbog rutinskog održavanja, nakon čega će biti vraćena u uobičajeno stanje.\n\nSistemski administrator koji ju je zaključao naveo je sljedeće objašnjenje: $1",
        "internalerror": "Unutrašnja greška",
        "internalerror_info": "Interna greška: $1",
        "internalerror-fatal-exception": "Fatalna greška tipa \"$1\"",
-       "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
-       "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
+       "filecopyerror": "Ne mogu kopirati datoteku \"$1\" na \"$2\".",
+       "filerenameerror": "Ne mogu preimenovati datoteku \"$1\" u \"$2\".",
        "filedeleteerror": "Ne mogu obrisati datoteku \"$1\".",
        "directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
        "directoryreadonlyerror": "Direktorij \"$1\" je samo za čitanje.",
        "directorynotreadableerror": "Direktorij \"$1\" nije čitljiv.",
-       "filenotfound": "Ne može se naći datoteka \"$1\".",
+       "filenotfound": "Ne mogu pronaći datoteku \"$1\".",
        "unexpected": "Neočekivana vrijednost: \"$1\"=\"$2\".",
-       "formerror": "Greška: ne može se poslati upitnik",
-       "badarticleerror": "Ova akcija ne može biti izvršena na ovoj stranici.",
-       "cannotdelete": "Ne može se obrisati stranica ili datoteka \"$1\".\nMoguće je da ju je neko već obrisao.",
+       "formerror": "Greška: ne mogu poslati upitnik.",
+       "badarticleerror": "Ova radnja se ne može izvršiti na ovoj stranici.",
+       "cannotdelete": "Ne mogu obrisati stranicu ili datoteku \"$1\".\nMoguće je da ju je neko već obrisao.",
        "cannotdelete-title": "Ne mogu obrisati stranicu \"$1\"",
        "delete-hook-aborted": "Brisanje je prekinuo softverski priključak.\nNije ponuđeno nikakvo objašnjenje.",
        "no-null-revision": "Ne mogu napraviti novu ništavnu reviziju za stranicu \"$1\"",
        "virus-unknownscanner": "nepoznati anti-virus program:",
        "logouttext": "'''Sad ste odjavljeni.'''\n\nObratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još uvijek prijavljeni, dok ne očistite keš svog preglednika.",
        "cannotlogoutnow-title": "Odjava trenutno nije moguća",
+       "cannotlogoutnow-text": "Ne možete se odjaviti kad se koriste $1.",
        "welcomeuser": "Dobro došli, $1",
        "welcomecreation-msg": "Vaš nalog je napravljen.\nNe zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} podešavanja]].",
        "yourname": "Korisničko ime:",
        "cannotlogin-title": "Prijava nije moguća",
        "cannotlogin-text": "Prijava nija moguća.",
        "cannotloginnow-title": "Prijava trenutno nije moguća",
+       "cannotloginnow-text": "Ne možete se prijaviti kad se koriste $1.",
        "cannotcreateaccount-title": "Pravljenje računa nije moguće",
        "cannotcreateaccount-text": "Direktno pravljenje računa nije omogućeno na ovom wikiju.",
        "yourdomainname": "Vaš domen:",
        "login": "Prijavi me",
        "login-security": "Potvrdite svoj identitet",
        "nav-login-createaccount": "Prijavi se / Registruj se",
-       "userlogin": "Prijavi se / Registruj se",
-       "userloginnocreate": "Prijavi se",
        "logout": "Odjavi me",
        "userlogout": "Odjavi me",
        "notloggedin": "Niste prijavljeni",
        "userlogin-noaccount": "Nemate korisnički račun?",
        "userlogin-joinproject": "Pridružite se {{GRAMMAR:dativ|{{SITENAME}}}}",
-       "nologin": "Nemate korisničko ime? $1.",
-       "nologinlink": "Otvorite račun",
        "createaccount": "Napravi korisnički račun",
-       "gotaccount": "Već imate korisnički račun? $1.",
-       "gotaccountlink": "Prijavite se",
-       "userlogin-resetlink": "Zaboravili ste detalje vaše prijave?",
        "userlogin-resetpassword-link": "Zaboravili ste lozinku?",
        "userlogin-helplink2": "Pomoć pri prijavljivanju",
        "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
        "createaccountmail": "Koristite privremenu, slučajno stvorenu lozinku i pošaljite na navedenu adrеsu e-pošte",
        "createaccountmail-help": "Može se koristiti da se nekome napravi račun bez da se sazna lozinka.",
        "createacct-realname": "Pravo ime (opcionalno)",
-       "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto pravite još jedan korisnički račun?",
        "createacct-reason-help": "Poruka koja se prikazuje u zapisniku stvaranja korisničkih računa",
        "userexists": "Korisničko ime je već u upotrebi.\nIzaberite drugo.",
        "loginerror": "Greška pri prijavljivanju",
        "createacct-error": "Došlo je do greške pri otvaranju naloga",
-       "createaccounterror": "Ne može se napraviti račun: $1",
-       "nocookiesnew": "Korisnički nalog je napravljen, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće (cookies) da bi se korisnici prijavili.\nVi ste isključili kolačiće na Vašem računaru.\nMolimo Vas da ih uključite, a onda se prijavite sa svojim novim korisničkim imenom i lozinkom.",
-       "nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.  Vi ste onemogućili kolačiće na Vašem kompjuteru.  Molimo Vas da ih omogućite i da pokušate ponovo sa prijavom.",
+       "createaccounterror": "Ne mogu napraviti račun: $1",
+       "nocookiesnew": "Korisnički račun je napravljen, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće (cookies) za prijavu korisnika.\nVama su kolačići onemogućeni.\nOmogućite ih pa se onda prijavite s novim korisničkim imenom i lozinkom.",
+       "nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') za prijavu korisnika.\nVama su kolačići onemogućeni.\nOmogućite ih i pokušajte ponovo.",
        "nocookiesfornew": "Korisnički račun nije napravljen, jer nismo mogli da potvrdimo njegov izvor.\nProvjerite da li su cookies omogućeni, ponovo učitajte ovu stranicu i pokušajte ponovo.",
        "createacct-loginerror": "Račun je uspješno napravljen, ali Vas nije bilo moguće automatski prijaviti. Prijavite se [[Special:UserLogin|ručno]].",
        "noname": "Niste izabrali ispravno korisničko ime.",
-       "loginsuccesstitle": "Prijavljen",
+       "loginsuccesstitle": "Prijava uspješna",
        "loginsuccess": "<strong>Prijavili ste se na {{GRAMMAR:akuzativ|{{SITENAME}}}} kao \"$1\".</strong>",
        "nosuchuser": "Ne postoji korisnik s imenom \"$1\".\nKorisnička imena razlikuju velika i mala slova.\nProvjerite jeste li ga tačno upisali ili [[Special:CreateAccount|otvorite novi račun]].",
        "nosuchusershort": "Ne postoji korisnik s imenom \"$1\".\nProvjerite jeste li dobro ukucali.",
        "nouserspecified": "Morate izabrati korisničko ime.",
        "login-userblocked": "Ovaj korisnik je blokiran. Prijava nije dopuštena.",
        "wrongpassword": "Lozinka koju ste unijeli je netačna.\nPokušate ponovno.",
-       "wrongpasswordempty": "Lozinka koju ste unijeli je bila prazna.\nMolimo Vas da pokušate ponovno.",
+       "wrongpasswordempty": "Niste upisali lozinku.\nPokušajte ponovo.",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
        "passwordtoolong": "Lozinke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
        "passwordtoopopular": "Ovo je često korištena lozinka i ne može se koristiti. Molimo Vas da izaberete jaču lozinku.",
        "emailauthenticated": "Vaša adresa e-pošte potvrđena je $2 u $3.",
        "emailnotauthenticated": "Vaša adresa e-pošte još nije potvrđena.\nNijedna e-poruka neće biti poslana za bilo koju uslugu od sljedećih.",
        "noemailprefs": "Unesite e-mail adresu za osposobljavanje slijedećih usluga.",
-       "emailconfirmlink": "Potvrdite Vašu e-mail adresu",
+       "emailconfirmlink": "Potvrdite svoju adresu e-pošte",
        "invalidemailaddress": "Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.\nMolimo vas da unesete ispravnu adresu ili ostavite prazno polje.",
        "cannotchangeemail": "Na ovom wikiju ne možete promijeniti e-mail adresu računa.",
        "emaildisabled": "Ova web-stranica ne može da šalje e-poruke.",
        "botpasswords-updated-title": "Ažurirana lozinka bota",
        "botpasswords-updated-body": "Ažurirana lozinka za bota \"$1\" korisnika \"$2\".",
        "botpasswords-deleted-title": "Obrisana lozinka bota",
+       "botpasswords-deleted-body": "Lozinka za bota \"$1\" korisnika \"$2\" je obrisana.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider nije dostupan.",
+       "botpasswords-restriction-failed": "Ne možete se prijaviti zbog ograničenja lozinki za botove.",
+       "botpasswords-invalid-name": "Navedeno korisničko ime ne sadrži rastavni znak (\"$1\") za lozinke botova.",
+       "botpasswords-not-exist": "Korisnik \"$1\" nema lozinku bota \"$2\".",
        "resetpass_forbidden": "Lozinke ne mogu biti promijenjene",
        "resetpass_forbidden-reason": "Lozinke ne mogu biti promijenjene: $1",
        "resetpass-no-info": "Morate biti prijavljeni da biste pristupili ovoj stranici direktno.",
        "resetpass-submit-loggedin": "Promijeni lozinku",
-       "resetpass-submit-cancel": "Odustani",
+       "resetpass-submit-cancel": "Otkaži",
        "resetpass-wrong-oldpass": "Privremena ili trenutna lozinka nije validna.\nMožda ste već promijenili Vašu lozinku ili ste tražili novu privremenu lozinku.",
        "resetpass-recycled": "Molimo resetirajte vašu lozinku u nešto drugo od vaše trenutne lozinke.",
        "resetpass-temp-emailed": "Prijavili ste se sa privremenim kodom iz e-pošte.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovdje:",
        "passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima Vašeg računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše originalne šifre, a ne želite je više promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
        "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena šifra: \n$2",
        "passwordreset-emailsentemail": "Ako je ova adresa e-pošte povezana s Vašim računom, podsjetnik o lozinci bit će Vam poslan na adresu e-pošte.",
+       "passwordreset-emailsentusername": "Ako je adresa e-pošte povezana s ovim korisničkim imenom, primit ćete e-poruku za resetiranje lozinke.",
        "passwordreset-nocaller": "Mora se navesti pozivalac",
        "passwordreset-nosuchcaller": "Pozivalac ne postoji: $1",
+       "passwordreset-ignored": "Resetiranje lozinke nije uspjelo. Možda poslužilac nije konfiguriran?",
        "passwordreset-invalidemail": "Neispravna adresa e-pošte",
+       "passwordreset-nodata": "Niste naveli ni korisničko ime, a ni adresu e-pošte",
        "changeemail": "Promjena ili uklanjanje e-adrese",
        "changeemail-header": "Ispunite sljedeći formular da biste promijenili adresu e-pošte. Ako želite ukloniti postojeću adresu e-pošte s vašeg korisničkog računa, pri ispunjavanju formulara, polje nove adrese e-pošte ostavite prazno.",
        "changeemail-no-info": "Morate biti prijavljeni za direktan pristup ovoj stranici.",
        "headline_sample": "Naslov",
        "headline_tip": "Podnaslov",
        "nowiki_sample": "Dodaj neformatirani tekst ovdje",
-       "nowiki_tip": "Ignoriši viki formatiranje teksta",
+       "nowiki_tip": "Zanemari wikiformatiranje",
        "image_sample": "ime_slike.jpg",
        "image_tip": "Uklopljena slika",
        "media_sample": "ime_medija_fajla.ogg",
        "media_tip": "Putanja ka multimedijalnoj datoteci",
-       "sig_tip": "Vaš potpis sa trenutnim vremenom",
+       "sig_tip": "Vaš potpis s trenutnim vremenom",
        "hr_tip": "Horizontalna linija (koristite oskudno)",
        "summary": "Sažetak:",
        "subject": "Tema:",
        "preview": "Pregled stranice",
        "showpreview": "Prikaži izgled",
        "showdiff": "Prikaži izmjene",
-       "blankarticle": "<strong>Upozorenje:</strong> Napravili ste praznu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", napravit ćete praznu stranicu bez sadržaja.",
-       "anoneditwarning": "<strong>Upozorenje:</strong> Niste prijavljeni. \nVaša IP adresa će biti javno vidljiva ako napravite neku izmjenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 napravite račun]</strong>, vaše izmjene će biti pripisane vašem korisničkom imenu, zajedno sa drugim pogodnostima.",
+       "blankarticle": "<strong>Upozorenje:</strong> Napravili ste praznu stranicu.\nAko ponovno kliknete \"$1\", napravit ćete praznu stranicu bez sadržaja.",
+       "anoneditwarning": "<strong>Upozorenje:</strong> Niste prijavljeni. Vaša IP-adresa bit će javno vidljiva ako napravite neku izmjenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 napravite račun]</strong>, Vaše izmjene bit će pripisane Vašem korisničkom imenu, pored drugih pogodnosti.",
        "anonpreviewwarning": "''Niste prijavljeni. Nakon spremanja izmjena vaša IP adresa će biti zapisana u historiji uređivanja ove stranice.''",
-       "missingsummary": "'''Napomena:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj, Vaša izmjena će biti sačuvana bez sažetka.",
-       "selfredirect": "<strong>Upozorenje:</strong> Preusmjerili ste stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", ipak će nastati preusmjerenje.",
-       "missingcommenttext": "Molimo unesite komentar ispod.",
-       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
+       "missingsummary": "<strong>Napomena:</strong> Niste unijeli sažetak izmjene.\nAko ponovo kliknete na \"$1\", Vaša izmjena će biti sačuvana bez sažetka.",
+       "selfredirect": "<strong>Upozorenje:</strong> Preusmjerili ste stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"$1\", ipak će nastati preusmjerenje.",
+       "missingcommenttext": "Unesite komentar ispod.",
+       "missingcommentheader": "<strong>Napomena:</strong> Niste napisali naslov ovog komentara.\nAko ponovo kliknete na \"$1\", Vaša izmjena će biti sačuvana bez naslova.",
        "summary-preview": "Pregled sažetka:",
        "subject-preview": "Pregled teme:",
        "previewerrortext": "Dogodila se greška prilikom prikazivanja vaših izmjena.",
        "blockedtitle": "Korisnik je blokiran",
        "blockedtext": "'''Vaše korisničko ime ili IP-adresa je blokirana.'''\n\nBlokada izvršena od strane $1.\nDati razlog je sljedeći: ''$2''.\n\n*Početak blokade: $8\n*Kraj perioda blokade: $6\n*Ime blokiranog korisnika: $7\n\nMožete kontaktirati sa $1 ili nekim drugim [[{{MediaWiki:Grouppage-sysop}}|administratorom]] da biste razgovarali o blokadi.\n\nNe možete koristiti opciju ''Pošalji e-mail korisniku'' osim ako niste unijeli e-mail adresu u [[Special:Preferences|Vaše postavke]].\nVaša trenutna IP-adresa je $3, a oznaka blokade je #$5.\nMolimo Vas da navedete gornje podatke pri zahtjevu za deblokadu.",
        "autoblockedtext": "Vaša IP-adresa automatski je blokirana jer ju je koristio drugi korisnik, a blokirao ju je $1.\nNaveden je sljedeći razlog:\n\n:''$2''\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Blokirani korisnik: $7\n\nMožete kontaktirati sa $1 ili nekim drugim iz grupe [[{{MediaWiki:Grouppage-sysop}}|administratora]] i zahtijevati da Vas deblokira.\n\nZapamtite da ne možete koristiti opciju \"pošalji e-mail ovom korisniku\" sve dok ne unesete validnu e-mail adresu pri registraciji u Vašim [[Special:Preferences|korisničkim postavkama]] i dok niste spriječeni (blokadom) da je koristite.\n\nVaša trenutna IP-adresa je $3, a ID blokade je $5.\nMolimo da navedete sve gore navedene detalje u zahtjevu za deblokadu.",
+       "systemblockedtext": "MediaWiki je automatski blokirao Vaše korisničko ime ili IP-adresu.\nDat je sljedeći razlog:\n\n:<em>$2</em>\n\n* Početak blokade: $8\n* Istek blokade: $6\n* Blokada je namijenjena za: $7\n\nVaša trenutna IP-adresa je $3.\nAko imate pitanja u vezi s blokadom, priložite sve gorenavedene pojedinosti.",
        "blockednoreason": "razlog nije naveden",
        "whitelistedittext": "Morate biti $1 da biste uređivali stranice.",
-       "confirmedittext": "Morate potvrditi Vašu e-mail adresu prije nego počnete mijenjati stranice.\nMolimo da postavite i verifikujete Vašu e-mail adresu putem Vaših [[Special:Preferences|korisničkih opcija]].",
+       "confirmedittext": "Morate potvrditi svoju adresu e-pošte prije nego počnete mijenjati stranice.\nPostavite i potvrdite svoju adresu e-pošte u [[Special:Preferences|korisničkim postavkama]].",
        "nosuchsectiontitle": "Ne mogu pronaći sekciju",
        "nosuchsectiontext": "Pokušali ste uređivati sekciju koja ne postoji.\nMožda je premještena ili obrisana dok ste pregledavali stranicu.",
        "loginreqtitle": "Potrebna je prijava",
        "loginreqlink": "prijavljeni",
        "loginreqpagetext": "Morate biti $1 da biste vidjeli druge stranice.",
        "accmailtitle": "Šifra poslana.",
-       "accmailtext": "Nasumično odabrana šifra za [[User talk:$1|$1]] je poslata na adresu $2.\n\nŠifra/lozinka za ovaj novi račun može biti promijenjena na stranici ''[[Special:ChangePassword|izmjene šifre]]'' nakon prijave.",
+       "accmailtext": "Nasumično odabrana lozinka za [[User talk:$1|$1]] poslana je na $2. Lozinka se <em>[[Special:ChangePassword|može promijeniti]]</em> nakon prijave.",
        "newarticle": "(Novi)",
        "newarticletext": "Došli ste na stranicu koja još nema sadržaja.\n*Ako želite unijeti sadržaj, počnite tipkati u prozor ispod ovog teksta.\n*Ako Vam treba pomoć, idite na [$1 stranicu za pomoć].\n*Ako ste ovamo dospjeli slučajno, kliknite na dugme \"Nazad\" (''Back'') u Vašem internetskom pregledniku.",
        "anontalkpagetext": "----\n<em>Ovo je stranica za razgovor s anonimnim korisnikom koji još nije napravio račun ili ga ne koristi.</em>\nZbog toga moramo koristiti brojčanu IP-adresu kako bismo ga prepoznali.\nTakvu adresu može dijeliti više korisnika.\nAko ste anonimni korisnik i smatrate da su Vam upućene nebitne primjedbe, molimo Vas da [[Special:CreateAccount|napravite račun]] ili se [[Special:UserLogin|prijavite]] da biste izbjegli buduću zabunu s ostalim anonimnim korisnicima.",
        "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!'''",
-       "userjspreview": "'''Zapamtite ovo je samo izgled vaše JavaScript-e, još uvijek nije sačuvan!'''",
+       "usercsspreview": "<strong>Zapamtite da je ovo samo pregled Vašeg CSS-a.\nStranica još nije sačuvana!</strong>",
+       "userjspreview": "<strong>Zapamtite da je ovo samo pregled Vašeg JavaScripta.\nStranica još nije sačuvana!</strong>",
        "sitecsspreview": "'''Zapamtite ovo je samo izgled ovog CSS-a.'''\n'''Još uvijek nije sačuvan!'''",
        "sitejspreview": "'''Zapamtite ovo je samo izgled ovog koda JavaScripte.'''\n'''Još uvijek nije sačuvan!'''",
-       "userinvalidcssjstitle": "'''Upozorenje:''' Ne postoji interfejs pod imenom \"$1\".\nNe zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr, {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
+       "userinvalidcssjstitle": "<strong>Upozorenje:</strong> Ne postoji tema \"$1\".\nNe zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr, {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
        "updated": "(Osvježeno)",
        "note": "'''Pažnja:'''",
        "previewnote": "<strong>Ne zaboravite da je ovo samo pregled.</strong>\nVaše izmjene još nisu sačuvane!",
        "continue-editing": "Idi na područje uređivanja",
-       "previewconflict": "Ovaj pregled prikazuje kako će tekst u gornjem polju\nizgledati ako kliknete \"Sačuvaj članak\".",
+       "previewconflict": "Ovaj pregled prikazuje kako će tekst u gornjem polju izgledati ako odlučite sačuvati stranicu.",
        "session_fail_preview": "Izvinjavamo se! Nismo mogli obraditi Vašu izmjenu zbog gubitka podataka o prijavi.\n\nMožda ste odjavljeni. <strong>Provjerite jeste li prijavljeni i pokušajte ponovo</strong>.\nAko i dalje ne radi, pokušajte se [[Special:UserLogout|odjaviti]] i ponovo prijaviti i provjerite dozvoljava li Vaš preglednik kolačiće s ovog sajta.",
-       "session_fail_preview_html": "'''Žao nam je! Nismo mogli da obradimo vašu izmjenu zbog gubitka podataka.'''\n\n''Zbog toga što {{SITENAME}} ima omogućen izvorni HTML, predpregled je sakriven kao predostrožnost protiv JavaScript napada.''\n\n'''Ako ste pokušali da napravite pravu izmjenu, molimo pokušajte ponovo. Ako i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite.'''",
+       "session_fail_preview_html": "Izvinjavamo se! Nismo mogli obraditi Vašu izmjenu zbog gubitka podataka sesije.\n\n<em>Budući da {{SITENAME}} ima omogućen izvorni HTML, pretpregled je sakriven kao mjera predostrožnosti protiv napada preko JavaScripta.</em>\n\n<strong>Ako ste pokušali napraviti pravu izmjenu, pokušajte ponovo.</strong>\nAko i dalje ne radi, pokušajte se [[Special:UserLogout|odjaviti]] i ponovo prijaviti i provjerite dozvoljava li Vaš preglednik kolačiće s ovog sajta.",
        "token_suffix_mismatch": "'''Vaša izmjena nije prihvaćena jer je Vaš web preglednik ubacio znakove interpunkcije u token uređivanja.\nIzmjena je odbačena da bi se spriječilo uništavanje teksta stranice.\nTo se događa ponekad kad korisite problematični anonimni proxy koji je baziran na web-u.'''",
        "edit_form_incomplete": "'''Neki dijelovi uređivačkog obrasca nisu došli do servera; dvaput provjerite da su vaše izmjene nepromjenjene i pokušajte ponovno.'''",
        "editing": "Uređujete $1",
        "creating": "Pravljenje stranice $1",
        "editingsection": "Uređujete $1 (dio)",
-       "editingcomment": "Uređujete $1 (nova sekcija)",
+       "editingcomment": "Uređujete $1 (novi odlomak)",
        "editconflict": "Sukob izmjena: $1",
-       "explainconflict": "Neko drugi je promijenio ovu stranicu otkad ste je Vi počeli mijenjati.\nGornje tekstualno polje sadrži tekst stranice koji trenutno postoji.\nVaše izmjene prikazane su u donjem tekstu.\nMorat ćete unijeti svoje promjene u postojeći tekst.\n'''Samo''' tekst u gornjem tekstualnom polju bit će sačuvan kad\nkliknete \"{{int:savearticle}}\".",
+       "explainconflict": "Neko drugi je promijenio ovu stranicu otkad ste je Vi počeli mijenjati.\nGornje tekstualno polje sadrži tekst stranice koji trenutno postoji.\nVaše izmjene prikazane su u donjem tekstu.\nMorat ćete unijeti svoje promjene u postojeći tekst.\n<strong>Samo</strong> tekst u gornjem tekstualnom polju bit će sačuvan kad\nkliknete \"$1\".",
        "yourtext": "Vaš tekst",
        "storedversion": "Sačuvana verzija",
        "nonunicodebrowser": "'''UPOZORENJE: Vaš preglednik ne podržava Unicode zapis znakova.\nMolimo Vas promijenite ga prije sljedećeg uređivanja članaka. Znakovi koji nisu po ASCII standardu će se u prozoru za izmjene pojaviti kao heksadecimalni kodovi.'''",
        "readonlywarning": "<strong>Upozorenje: Baza je zaključana zbog održavanja, tako da nećete moći da sačuvate svoje izmjene za sada.</strong>\nMožda želite da kopirate i nalijepite tekst u tekst editor i sačuvate ga za kasnije.\n\nAdministrator koji je zaključao bazu je naveo sljedeće objašnjenje: $1",
        "protectedpagewarning": "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''\nPosljednja stavka u zapisniku je prikazana ispod kao referenca:",
        "semiprotectedpagewarning": "'''Pažnja:''' Ova stranica je zaključana tako da je samo registrovani korisnici mogu uređivati.\nPosljednja stavka zapisnika je prikazana ispod kao referenca:",
-       "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, prenosivo povezane, zaštićene stranice}}:",
+       "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaključana tako da je samo korisnici sa [[Special:ListGroupRights|specifičnim pravima]] mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, prenosivo povezane, zaštićene stranice}}:",
        "titleprotectedwarning": "'''UPOZORENJE: Ova stranica je zaključana tako da su potrebna [[Special:ListGroupRights|posebna prava]] da se ona napravi.'''\nPosljednja stavka zapisnika je prikazana ispod kao referenca:",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} koji su upotrebljeni na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} prikazani u ovom pregledu:",
        "templatesusedsection": "{{PLURAL:$1|Šablon|Šabloni}} korišteni u ovoj sekciji:",
        "template-protected": "(zaštićeno)",
-       "template-semiprotected": "(polu-zaštićeno)",
+       "template-semiprotected": "(poluzaštićeno)",
        "hiddencategories": "Ova stranica pripada u {{PLURAL:$1|$1 skrivenu kategoriju|$1 skrivene kategorije|$1 skrivenih kategorija}}:",
        "edittools": "<!-- Ovaj tekst će biti prikazan ispod formi za uređivanje i postavljanje. -->",
        "nocreatetext": "Na {{SITENAME}} je zabranjeno postavljanje novih stranica.\nMožete se vratiti i uređivati već postojeće stranice ili se [[Special:UserLogin|prijaviti ili otvoriti korisnički račun]].",
        "permissionserrors": "Greška pri odobrenju",
        "permissionserrorstext": "Nemate dopuštenje za ovu radnju iz {{PLURAL:$1|sljedećeg razloga|sljedećih razloga}}:",
        "permissionserrorstext-withaction": "Nemate dopuštenje da $2, iz {{PLURAL:$1|sljedećeg|sljedećih}} razloga:",
-       "contentmodelediterror": "Ne možete urediti ovu izmjenu jer je njen model sadržaja <code>$1</code>, a trenutni model sadržaja stranice je <code>$2</code>.",
+       "contentmodelediterror": "Ne možete urediti ovu izmjenu jer je njen model sadržaja <code>$1</code>, što se razlikuje od trenutnog modela sadržaja stranice <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Upozorenje: Ponovo pravite stranicu koja je prethodno obrisana.</strong>\n\nRazmotrite je li prikladno nastaviti s uređivanjem ove stranice.\nOvdje je naveden zapisnik brisanja i premještanja:",
        "moveddeleted-notice": "Ova stranica je obrisana.\nZapisnik brisanja i premještanja stranice je prikazan ispod kao referenca.",
        "moveddeleted-notice-recent": "Žao nam je, ova stranica je nedavno obrisana (u prethodna 24 sata).\nNiže su navedeni zapisnici brisanja i premještanja.",
        "content-json-empty-object": "Prazan objekat",
        "content-json-empty-array": "Prazan niz",
        "deprecated-self-close-category": "Stranice s neispravnim samozatvorenim HTML oznakama",
+       "deprecated-self-close-category-desc": "Stranica sadrži neispravne samozatvorene HTML oznake, kao što su <code>&lt;b/></code> ili <code>&lt;span/></code>. Njihovo funkcioniranje uskoro će se promijeniti da bude u skladu sa specifikacijama za HTML5, što znači da su zastarjeli i ne bi se trebali upotrebljavati u wikitekstu.",
        "duplicate-args-warning": "<strong>Upozorenje:</strong> [[:$1]] poziva na [[:$2]] sa više od jedne vrijednosti za parametar \"$3\". Koristit će se samo posljednja navedena vrijednost.",
        "duplicate-args-category": "Stranice sa istim argumentima kod poziva šablona",
        "duplicate-args-category-desc": "Stranica sadrži pozive šablona koji koriste argumente dvojnike, kao što su <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ili <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "nextrevision": "Novija izmjena →",
        "currentrevisionlink": "Trenutna verzija",
        "cur": "tren",
-       "next": "slijed",
+       "next": "sljed",
        "last": "preth",
        "page_first": "prva",
        "page_last": "posljednja",
        "histlegend": "Odabir razlika: označite radio dugme verzija koje uspoređujete i pritistnite enter ili dugme na dnu. <br />\nObjašnjenje: <strong>({{int:cur}})</strong> = razlika sa trenutnom verzijom, <strong>({{int:last}})</strong> = razlika sa prethodnom verzijom, <strong>{{int:minoreditletter}}</strong> = mala izmjena.",
-       "history-fieldset-title": "Pretraga historije",
+       "history-fieldset-title": "Pretraga izmjena",
        "history-show-deleted": "Samo obrisane",
        "histfirst": "najstarije",
        "histlast": "najnovije",
        "historysize": "({{PLURAL:$1|1 bajt|$1 bajta|$1 bajtova}})",
        "historyempty": "(prazno)",
        "history-feed-title": "Historija izmjena",
-       "history-feed-description": "Historija promjena ove stranice na wikiju",
+       "history-feed-description": "Historija izmjena ove stranice na wikiju",
        "history-feed-item-nocomment": "$1 u $2",
        "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je obrisana s wikija ili je preimenovana.\nPokušajte [[Special:Search|pretražiti wiki]] za slične stranice.",
        "history-edit-tags": "Uredi oznake izabranih verzija",
        "rev-suppressed-unhide-diff": "Jedna od izmjena u ovom pregledu razlika je <strong>sakrivena</strong>.\nDetalje možete pronaći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku sakrivanja].\nIpak možete [$1 vidjeti ovaj pregled razlika] ako želite nastaviti.",
        "rev-deleted-diff-view": "Jedna od izmjena u ovom pregledu razlika je <strong>obrisana</strong>.\nMožete pogledati razliku izmjena; detalje možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
        "rev-suppressed-diff-view": "Jedna od izmjena u ovom pregledu razlika je <strong>sakrivena</strong>.\nMožete pogledati razliku izmjena; detalje možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku sakrivanja].",
-       "rev-delundel": "pokaži/sakrij",
+       "rev-delundel": "promijeni vidljivost",
        "rev-showdeleted": "prikaži",
        "revisiondelete": "Obriši/vrati izmjene",
        "revdelete-nooldid-title": "Nije unesena tačna revizija",
        "revertmerge": "Vrati spajanje",
        "mergelogpagetext": "Ispod je spisak nedavnih spajanja historija stranica.",
        "history-title": "$1: Historija izmjena",
-       "difference-title": "Razlike između verzija stranice \"$1\"",
-       "difference-title-multipage": "Razlika između stranica \"$1\" i \"$2\"",
+       "difference-title": "$1: Razlike između izmjena",
+       "difference-title-multipage": "$1 i $2: Razlike između stranica",
        "difference-multipage": "(Razlika između stranica)",
        "lineno": "Red $1:",
        "compareselectedversions": "Uporedi označene verzije",
-       "showhideselectedversions": "Prikaži/sakrij izabrane izmjene",
+       "showhideselectedversions": "Promijeni vidljivost izabranih izmjena",
        "editundo": "poništi",
        "diff-empty": "(Nema razlike)",
        "diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međuizmjena|Nisu prikazane $1 međuizmjene|Nije prikazano $1 međuizmjena}} istog korisnika)",
        "search-file-match": "(podudara se sadržaj datoteke)",
        "search-suggest": "Jeste li mislili: $1",
        "search-rewritten": "Prikazujem rezultate za $1. Umjesto toga potraži $2.",
-       "search-interwiki-caption": "Srodni projekti",
+       "search-interwiki-caption": "Rezultati s bratskih projekata",
        "search-interwiki-default": "$1 rezultati:",
        "search-interwiki-more": "(više)",
        "search-interwiki-more-results": "više rezultata",
        "prefs-watchlist-edits": "Najveći broj izmjena za prikaz u proširenom spisku praćenja:",
        "prefs-watchlist-edits-max": "Najveći broj: 1000",
        "prefs-watchlist-token": "Žeton praćenih članaka:",
-       "prefs-misc": "Ostala podešavanja",
+       "prefs-misc": "Razno",
        "prefs-resetpass": "Promijeni lozinku",
        "prefs-changeemail": "Promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite e-mail adresu",
        "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.",
-       "email": "E-mail",
+       "email": "E-pošta",
        "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje vašem radu.",
        "prefs-help-email": "Adresa e-pošte nije obavezna, ali je potrebna u slučaju ponovnog postavljanja šifre, ako je zaboravite.",
        "prefs-help-email-others": "Također možete dopustiti drugim korisnicima da vas kontaktiraju preko linka na lijevoj strani vaše stranice ili stranice za razgovor.\nVaša adresa e-pošte neće biti prikazana drugim korisnicima koji vas kontaktiraju.",
        "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sljedećoj prijavi.",
        "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": "Korisnička prava",
        "userrights-lookup-user": "Izaberi korisnika",
        "userrights-user-editname": "Upišite korisničko ime:",
        "editusergroup": "Učitaj korisničke grupe",
        "saveusergroups": "Sačuvaj {{GENDER:$1|korisničke}} grupe",
        "userrights-groupsmember": "Član:",
        "userrights-groupsmember-auto": "Uključeni član od:",
-       "userrights-groups-help": "Možete promijeniti grupe kojima ovaj korisnik pripada:\n* Označeni kvadratić znači da je korisnik u toj grupi.\n* Neoznačeni kvadratić znači da korisnik nije u toj grupi.\n* Zvjezdica (*) označava da ne možete ukloniti grupu nakon što je dodate i obrnuto.\n* Taraba (#) označava da jedino možete odložiti vrijeme isteka ove grupe; ne možete ga ubrzati.",
+       "userrights-groups-help": "Možete promijeniti grupe kojima ovaj korisnik pripada:\n* Označeni kvadratić znači da je korisnik u toj grupi.\n* Neoznačeni kvadratić znači da korisnik nije u toj grupi.\n* Zvjezdica (*) označava da ne možete ukloniti grupu nakon što je dodate i obrnuto.\n* Taraba (#) označava da jedino možete odložiti vrijeme isteka članstva u ovoj grupi; ne možete ga ubrzati.",
        "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-expiry-options": "1 dan:1 day,1 sedmica:1 week,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godina:1 year",
        "userrights-invalid-expiry": "Vrijeme isticanja grupe \"$1\" nije ispravno.",
        "userrights-expiry-in-past": "Vrijeme isticanja grupe \"$1\" je u prošlosti.",
-       "userrights-cannot-shorten-expiry": "Ne možete ubrzati vrijeme isteka grupe \"$1\". Jedino je mogu ubrzati korisnici koji mogu dodavati i uklanjati ovu grupu.",
+       "userrights-cannot-shorten-expiry": "Ne možete ubrzati vrijeme isteka članstva u grupi \"$1\". Jedino je mogu ubrzati korisnici koji mogu dodavati i uklanjati ovu grupu.",
        "userrights-conflict": "Sukob u izmjeni korisničkih prava! Molimo da razmotrite i potvrdite Vaše promjene.",
        "group": "Grupa:",
        "group-user": "Korisnici",
        "right-createpage": "Pravljenje stranica (izuzev stranica za razgovor)",
        "right-createtalk": "Pravljenje stranica za razgovor",
        "right-createaccount": "Pravljenje novih korisničkih računa",
+       "right-autocreateaccount": "Automatska prijava s vanjskim korisničkim računom",
        "right-minoredit": "Označavanje izmjena manjim",
        "right-move": "Premještanje stranica",
        "right-move-subpages": "Premještanje stranica s njihovim podstranicama",
        "right-editsemiprotected": "Uređivanje stranica pod zaštitom \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Uređivanje modela sadržaja stranice",
        "right-editinterface": "Uređivanje korisničkog interfejsa",
-       "right-editusercssjs": "Uređivanje CSS i JS datoteka drugih korisnika",
        "right-editusercss": "Uređivanje tuđih CSS datoteka",
        "right-edituserjs": "Uređivanje tuđih JavaScript datoteka",
        "right-editmyusercss": "Uređivanje vlastitih CSS datoteka",
        "right-applychangetags": "Primjenjivanje [[Special:Tags|oznaka]] na nečije izmjene",
        "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima u zapisnicima",
        "right-deletechangetags": "Brisanje [[Special:Tags|oznaka]] iz baze podataka",
+       "grant-generic": "Zbir prava \"$1\"",
        "grant-group-page-interaction": "Upravljanje stranicama",
        "grant-group-file-interaction": "Rad s medijskim datotekama",
        "grant-group-watchlist-interaction": "Upravljanje Vašim spiskom praćenja",
        "action-createpage": "napravite ovu stranicu",
        "action-createtalk": "napravite ovu stranicu za razgovor",
        "action-createaccount": "napravite ovaj korisnički račun",
+       "action-autocreateaccount": "automatski napravite ovaj vanjski korisnički račun",
        "action-history": "gledate historiju ove stranice",
        "action-minoredit": "označite ovu izmjenu manjom",
        "action-move": "premjestite ovu stranicu",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
        "recentchanges-submit": "Prikaži",
        "rcfilters-activefilters": "Aktivni filteri",
+       "rcfilters-quickfilters": "Brzi linkovi",
+       "rcfilters-savedqueries-defaultlabel": "Sačuvani filteri",
+       "rcfilters-savedqueries-rename": "Preimenuj",
+       "rcfilters-savedqueries-setdefault": "Postavi kao predodređeno",
+       "rcfilters-savedqueries-remove": "Ukloni",
+       "rcfilters-savedqueries-new-name-label": "Naziv",
+       "rcfilters-savedqueries-apply-label": "Napravi brzi link",
+       "rcfilters-savedqueries-cancel-label": "Otkaži",
+       "rcfilters-savedqueries-add-new-title": "Sačuvaj filtere kao brzi link",
        "rcfilters-restore-default-filters": "Vrati predodređene filtere",
        "rcfilters-clear-all-filters": "Ukloni sve filtere",
+       "rcfilters-search-placeholder": "Filtriraj nedavne izmjene (prelistajte mogućnosti ili počnite kucati)",
        "rcfilters-invalid-filter": "Neispravan filter",
-       "rcfilters-empty-filter": "Nema aktivnih filtera. Svi doprinosi su prikazani.",
+       "rcfilters-empty-filter": "Nema aktivnih filtera. Prikazani su svi doprinosi.",
        "rcfilters-filterlist-title": "Filteri",
+       "rcfilters-filterlist-whatsthis": "Šta je ovo?",
+       "rcfilters-filterlist-feedbacklink": "Pružite povratne informacije o novim (beta) filterima",
+       "rcfilters-highlightbutton-title": "Istakni rezultate",
+       "rcfilters-highlightmenu-title": "Izaberite boju",
+       "rcfilters-highlightmenu-help": "Izaberite boju da biste istaknuli ovo svojstvo",
        "rcfilters-filterlist-noresults": "Nema filtera",
+       "rcfilters-state-message-fullcoverage": "Izabiranje svih filtera u grupi isto je kao da niste izabrali nijedan, tako da ovaj filter nema nikakvog efekta. Grupa sadrži: $1",
+       "rcfilters-filtergroup-registration": "Registracija korisnika",
        "rcfilters-filter-registered-label": "Registrirani",
        "rcfilters-filter-registered-description": "Prijavljeni korisnici.",
        "rcfilters-filter-unregistered-label": "Anonimni",
        "rcfilters-filter-unregistered-description": "Neprijavljeni korisnici.",
-       "rcfilters-filtergroup-authorship": "Autorstvo izmjena",
-       "rcfilters-filter-editsbyself-label": "Vlastite izmjene",
-       "rcfilters-filter-editsbyself-description": "Izmjene koje ste Vi napravili.",
+       "rcfilters-filtergroup-authorship": "Autorstvo doprinosa",
+       "rcfilters-filter-editsbyself-label": "Ve izmjene",
+       "rcfilters-filter-editsbyself-description": "Vaši vlastiti doprinosi.",
        "rcfilters-filter-editsbyother-label": "Tuđe izmjene",
-       "rcfilters-filter-editsbyother-description": "Izmjene koje su napravili drugi korisnici (ne Vi).",
+       "rcfilters-filter-editsbyother-description": "Sve izmjene osim Vaših.",
        "rcfilters-filtergroup-userExpLevel": "Korisničko iskustvo (samo za registrirane)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Novajlije",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Manje od 10 izmjena i 4 dana aktivnosti.",
-       "rcfilters-filter-userExpLevel-learner-label": "Učenici",
-       "rcfilters-filter-userExpLevel-learner-description": "Više dana aktivnosti i izmjena od \"novajlija\", ali manje od \"iskusnih korisnika\".",
-       "rcfilters-filter-userExpLevel-experienced-label": "Iskusni korisnici",
-       "rcfilters-filter-userExpLevel-experienced-description": "Preko 30 dana aktivnosti i 500 izmjena.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novajlije",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Manje od 10 izmjena i 4 dana aktivnosti.",
+       "rcfilters-filter-user-experience-level-learner-label": "Učenici",
+       "rcfilters-filter-user-experience-level-learner-description": "Više iskustva od \"novajlija\", ali manje od \"iskusnih korisnika\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Iskusni korisnici",
+       "rcfilters-filter-user-experience-level-experienced-description": "Preko 30 dana aktivnosti i 500 izmjena.",
        "rcfilters-filtergroup-automated": "Automatski doprinosi",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Izmjene napravljene automatiziranim alatima.",
        "rcfilters-filter-humans-label": "Čovjek (ne bot)",
        "rcfilters-filter-humans-description": "Izmjene koje su napravili ljudi.",
+       "rcfilters-filtergroup-reviewstatus": "Pregledanost",
+       "rcfilters-filter-patrolled-label": "Patrolirano",
+       "rcfilters-filter-patrolled-description": "Izmjene označene patroliranim.",
+       "rcfilters-filter-unpatrolled-label": "Nepatrolirano",
+       "rcfilters-filter-unpatrolled-description": "Izmjene koje nisu označene patroliranim.",
        "rcfilters-filtergroup-significance": "Značaj",
        "rcfilters-filter-minor-label": "Manje izmjene",
        "rcfilters-filter-minor-description": "Izmjene koje je njihov autor označio manjim.",
        "rcfilters-filter-major-label": "Obične izmjene",
        "rcfilters-filter-major-description": "Izmjene koje nisu označene manjim.",
+       "rcfilters-filtergroup-watchlist": "Stranice na spisku praćenja",
+       "rcfilters-filter-watchlist-watched-label": "Na spisku praćenja",
+       "rcfilters-filter-watchlist-watched-description": "Izmjene na stranicama na Vašem spisku praćenja.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nove izmjene na spisku praćenja",
+       "rcfilters-filter-watchlist-watchednew-description": "Izmjene na stranicama koje se nalaze na spisku praćenja, a koje još niste posjetili otkako su izmijenjene.",
+       "rcfilters-filter-watchlist-notwatched-label": "Nije na spisku praćenja",
+       "rcfilters-filter-watchlist-notwatched-description": "Sve osim izmjena na stranicama koje pratite.",
        "rcfilters-filtergroup-changetype": "Vrsta izmjene",
        "rcfilters-filter-pageedits-label": "Izmjene stranica",
        "rcfilters-filter-pageedits-description": "Izmjene wiki sadržaja, rasprava, opisa kategorija....",
        "rcfilters-filter-newpages-label": "Stvaranje stranica",
        "rcfilters-filter-newpages-description": "Izmjene kojima se stvaraju nove stranice.",
        "rcfilters-filter-categorization-label": "Izmjene kategorija",
-       "rcfilters-filter-categorization-description": "Izmjene kojima se dodavaju ili uklanjaju kategorije.",
+       "rcfilters-filter-categorization-description": "Izmjene kojima se dodavaju ili uklanjaju stranice iz kategorija.",
        "rcfilters-filter-logactions-label": "Zapisane radnje",
        "rcfilters-filter-logactions-description": "Administrativne radnje, pravljenje računa, brisanje stranica, postavljenje datoteka....",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ovaj filter za vrstu izmjene u sukobu je s filterom za \"manje izmjene\". Izvjesne vrste izmjena ne mogu se označiti kao \"manje\".",
+       "rcfilters-filtergroup-lastRevision": "Posljednja izmjena",
+       "rcfilters-filter-lastrevision-label": "Posljednja izmjena",
+       "rcfilters-filter-lastrevision-description": "Najnovija izmjena na stranici.",
+       "rcfilters-filter-previousrevision-label": "Ranije izmjene",
+       "rcfilters-filter-previousrevision-description": "Sve izmjene koje nisu najnovije na stranici.",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
+       "rclistfromreset": "Resetiraj izbor datuma",
        "rclistfrom": "Prikaži nove izmjene počev od $3 u $2",
        "rcshowhideminor": "$1 manje izmjene",
        "rcshowhideminor-show": "Prikaži",
        "rcshowhidecategorization": "$1 kategorizaciju stranica",
        "rcshowhidecategorization-show": "Prikaži",
        "rcshowhidecategorization-hide": "Sakrij",
-       "rclinks": "Prikaži posljednjih $1 izmjena u posljednjih $2 dana<br />$3",
+       "rclinks": "Prikaži posljednjih $1 izmjena u posljednjih $2 dana",
        "diff": "razl",
        "hist": "hist",
        "hide": "Sakrij",
        "unknown-error": "Desila se nepoznata greška.",
        "tmp-create-error": "Nije moguće napraviti privremenu datoteku.",
        "tmp-write-error": "Greška pri pisanju privremene datoteke.",
-       "large-file": "Preporučeno je da datoteke nisu veće od $1;\nOva datoteka je velika $2.",
+       "large-file": "Preporučeno je da datoteke ne budu veće od $1;\nova datoteka je velika $2.",
        "largefileserver": "Ova datoteka je veća nego što je dozvoljeno u postavkama servera.",
        "emptyfile": "Datoteka koju ste poslali je prazna. Ovo je moguće zbog greške u imenu datoteke. Molimo Vas da provjerite da li stvarno želite da pošaljete ovu datoteku.",
        "windows-nonascii-filename": "Ova wiki ne podržava imena datoteka sa posebnim znacima.",
        "uploadwarning": "Upozorenje pri postavljanju",
        "uploadwarning-text": "Molimo izmijeniti opis datoteke ispod i pokušajte kasnije.",
        "savefile": "Sačuvaj datoteku",
-       "uploaddisabled": "Slanje fajlova je isključeno",
+       "uploaddisabled": "Postavljanje datoteka je onemogućeno.",
        "copyuploaddisabled": "Postavljanje putem URL nije omogućeno.",
        "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. Molimo provjerite postavku file_uploads.",
        "uploaded-script-svg": "Pronađen skriptni element \"$1\" u postavljenoj SVG datoteci.",
        "uploaded-hostile-svg": "Pronađen nesiguran CSS u stilskom elementu postavljene SVG datoteke.",
        "uploaded-event-handler-on-svg": "Nije dozvoljeno postavljanje atributa koji kontroliraju događaje <code>$1=\"$2\"</code> u SVG datotekama.",
-       "uploaded-href-unsafe-target-svg": "Pronađen href sa nesigurnom metom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-href-unsafe-target-svg": "Pronađen href s nesigurnim podacima: URI-meta <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
        "uploaded-animate-svg": "Pronađena \"animate\" oznaka koja možda mijenja href koristeći se \"from\" atributom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
        "uploaded-setting-event-handler-svg": "Postavljanje kontrole događaja je blokirano, pronađeno <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
        "uploaded-setting-href-svg": "Blokirano je korištenje \"set\" oznake kako bi se dodao \"href\" atribut glavnom elementu.",
        "upload-copy-upload-invalid-domain": "Kopije postavljenih datoteka nisu dostupne sa ove domene.",
        "upload-dialog-disabled": "Onemogućeno je postavljanje datoteka pomoću ovog dijaloga.",
        "upload-dialog-title": "Postavi datoteku",
-       "upload-dialog-button-cancel": "Odustani",
+       "upload-dialog-button-cancel": "Otkaži",
        "upload-dialog-button-back": "Nazad",
        "upload-dialog-button-done": "Gotovo",
        "upload-dialog-button-save": "Sačuvaj",
        "backend-fail-read": "Ne mogu čitati datoteku $1.",
        "backend-fail-create": "Ne mogu napraviti datoteku $1.",
        "backend-fail-maxsize": "Ne mogu zapisati datoteku \"$1\" jer je veća od {{PLURAL:$2|$2 bajta|$2 bajta|$2 bajtova}}.",
-       "backend-fail-readonly": "Skladišna osnova \"$1\" je trenutno samo za čitanje. Navedeni razlog je: \"$2\"",
+       "backend-fail-readonly": "Skladišna osnova \"$1\" trenutno je samo za čitanje. Navedeni razlog je: <em>$2</em>",
        "backend-fail-synced": "Datoteka \"$1\" je u nekonzistentnom stanju u internom skladištu",
        "backend-fail-connect": "Ne mogu se povezati sa pozadinskim spremištem \"$1\".",
        "backend-fail-internal": "Došlo je do nepoznate greške u skladišnoj osnovi \"$1\".",
        "uploadstash-summary": "Ova stranica daje pristup datotekama koje su postavljene (ili su u postupku postavljanja) ali još nisu objavljene na wiki. Ove datoteke nisu vidljive nikom osim korisniku koji ih je postavio.",
        "uploadstash-clear": "Očisti sakrivene datoteke",
        "uploadstash-nofiles": "Nemate sakrivenih datoteka.",
-       "uploadstash-badtoken": "Izvršavanje ove akcije je bilo neuspješno, možda zato što su vaša uređivačka odobrenja istekla. Pokušajte ponovo.",
+       "uploadstash-badtoken": "Izvršavanje ove radnje nije uspjelo, možda zato što su Vaša uređivačka odobrenja istekla. Pokušajte ponovo.",
        "uploadstash-errclear": "Brisanje datoteka nije uspjelo.",
        "uploadstash-refresh": "Osvježi spisak datoteka",
        "invalid-chunk-offset": "Neispravna polazna tačka",
        "listduplicatedfiles": "Spisak duplih datoteka",
        "listduplicatedfiles-summary": "Ovo je spisak datoteka koje su duplikat nekih drugih datoteka. Prikazane su samo lokalne datoteke.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] ima [[$3|{{PLURAL:$2|jedan duplikat|$2 duplikata}}]].",
-       "unusedtemplates": "Nekorišteni šabloni",
+       "unusedtemplates": "Neiskorišteni šabloni",
        "unusedtemplatestext": "Ova stranica prikazuje sve stranice u imenskom prostoru {{ns:template}} koji se ne koriste.\nPrije brisanja provjerite da li druge stranice vode na te šablone.",
        "unusedtemplateswlh": "ostali linkovi",
        "randompage": "Slučajna stranica",
        "brokenredirectstext": "Sljedeća preusmjerenja vode na nepostojeće stranice:",
        "brokenredirects-edit": "uredi",
        "brokenredirects-delete": "obriši",
-       "withoutinterwiki": "Članci bez interwiki linkova",
+       "withoutinterwiki": "Stranice bez jezičkih linkova",
        "withoutinterwiki-summary": "Slijedeće stranice nemaju linkove prema verzijama na drugim jezicima.",
        "withoutinterwiki-legend": "Prefiks",
        "withoutinterwiki-submit": "Prikaži",
-       "fewestrevisions": "Stranice sa najmanje izmjena",
+       "fewestrevisions": "Stranice s najmanje izmjena",
        "nbytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
-       "ncategories": "$1 {{PLURAL:$1|kategorija|kategorije}}",
+       "ncategories": "$1 {{PLURAL:$1|kategorija|kategorije|kategorija}}",
        "ninterwikis": "$1 {{PLURAL:$1|međujezična veza|međujezične veze}}",
-       "nlinks": "$1 {{PLURAL:$1|veza|veze}}",
-       "nmembers": "$1 {{PLURAL:$1|član|članova}}",
+       "nlinks": "$1 {{PLURAL:$1|linka|linka|linkova}}",
+       "nmembers": "$1 {{PLURAL:$1|član|člana|članova}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|član|člana|članova}}",
        "nrevisions": "$1 {{PLURAL:$1|verzija|verzije|verzija}}",
        "nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "specialpage-empty": "Nema rezultata za ovaj izvještaj.",
        "lonelypages": "Siročad",
        "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",
-       "uncategorizedtemplates": "Šabloni bez kategorije",
+       "uncategorizedpages": "Nekategorizirane stranice",
+       "uncategorizedcategories": "Nekategorizirane kategorije",
+       "uncategorizedimages": "Nekategorizirane datoteke",
+       "uncategorizedtemplates": "Nekategorizirani šabloni",
        "unusedcategories": "Neiskorištene kategorije",
        "unusedimages": "Nekorištene slike",
        "wantedcategories": "Tražene kategorije",
-       "wantedpages": "Najpotrebnije stranice",
+       "wantedpages": "Tražene stranice",
        "wantedpages-summary": "Spisak nepostojećih stranica sa najviše veza ka njima. Na spisku se ne nalaze stranice do kojih vode preusmjerenja. Za spisak nepostojećih stranica na koje su povezana preumsjerenja, pogledajte [[{{#special:BrokenRedirects}}|spisak pokvarenih preusmerenja]].",
        "wantedpages-badtitle": "Nevaljan naslov u setu rezultata: $1",
        "wantedfiles": "Tražene datoteke",
        "wantedfiletext-cat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje. Dodatno, stranice koje ugrađuju datoteke koje ne postoje prikazane su u [[:$1]].",
        "wantedfiletext-nocat": "Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako postoje. Takve datoteke će biti <del>precrtane</del> sa spiska.",
        "wantedfiletext-nocat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje.",
-       "wantedtemplates": "Potrebni šabloni",
-       "mostlinked": "Članci sa najviše linkova",
-       "mostlinkedcategories": "Kategorije sa najviše linkova",
+       "wantedtemplates": "Traženi šabloni",
+       "mostlinked": "Stranice s najviše linkova",
+       "mostlinkedcategories": "Kategorije s najviše linkova",
        "mostlinkedtemplates": "Najviše uključene stranice",
-       "mostcategories": "Članci sa najviše kategorija",
+       "mostcategories": "Stranice s najviše kategorija",
        "mostimages": "Datoteke s najviše veza",
        "mostinterwikis": "Stranice sa najviše međuwikija",
-       "mostrevisions": "Članci sa najviše izmjena",
-       "prefixindex": "Sve stranice sa prefiksom",
+       "mostrevisions": "Stranice s najviše izmjena",
+       "prefixindex": "Sve stranice s prefiksom",
        "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
        "prefixindex-submit": "Prikaži",
        "prefixindex-strip": "Sakrij prefiks u spisku",
        "shortpages": "Kratke stranice",
-       "longpages": "Dugačke stranice",
-       "deadendpages": "Stranice bez unutrašnjih veza",
-       "deadendpagestext": "Slijedeće stranice nisu povezane s drugim stranicama na {{SITENAME}}.",
+       "longpages": "Duge stranice",
+       "deadendpages": "Stranice bez unutrašnjih linkova",
+       "deadendpagestext": "Sljedeće stranice nisu povezane s drugim stranicama na {{GRAMMAR:dativ|{{SITENAME}}}}.",
        "protectedpages": "Zaštićene stranice",
        "protectedpages-indef": "Samo neograničena zaštićenja",
        "protectedpages-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih stranica. Za spisak zaštićenih naslova vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "apihelp": "API pomoć",
        "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
        "apisandbox-unfullscreen": "Prikaži stranicu",
+       "apisandbox-submit": "Postavi zahtjev",
        "apisandbox-reset": "Očisti",
        "apisandbox-retry": "Pokušaj ponovo",
        "apisandbox-loading": "Učitavam podatke o API modulu \"$1\"...",
        "apisandbox-submit-invalid-fields-title": "Neka polja nisu ispravna",
        "apisandbox-submit-invalid-fields-message": "Ispravite naznačena polja i pokušajte ponovo.",
        "apisandbox-results": "Rezultati",
+       "apisandbox-request-url-label": "URL zahtjeva:",
        "apisandbox-continue": "Nastavi",
        "apisandbox-continue-clear": "Očisti",
+       "apisandbox-multivalue-all-namespaces": "$1 (svi imenski prostori)",
        "apisandbox-multivalue-all-values": "$1 (sve vrijednosti)",
        "booksources": "Književni izvori",
        "booksources-search-legend": "Traži književne izvore",
        "alllogstext": "Skupni prikaz svih dostupnih zapisnika sa {{GRAMMAR:genitiv|{{SITENAME}}}}.\nMožete suziti prikaz izabiranjem specifičnog zapisnika, korisničkog imena (razlikovati velika i mala slova) ili izmijenjenog članka (također treba razlikovati velika i mala slova).",
        "logempty": "Nema zatraženih stavki u zapisniku.",
        "log-title-wildcard": "Traži naslove koji počinju ovim tekstom",
-       "showhideselectedlogentries": "Pokaži/sakrij izabrane unose u zapisniku",
+       "showhideselectedlogentries": "Promijeni vidljivost izabranih unosa u zapisniku",
        "log-edit-tags": "Uredi oznake izabranih zapisničkih unosa",
        "checkbox-select": "Izaberi: $1",
        "checkbox-all": "Sve",
        "cachedspecial-refresh-now": "Pogledaj najnoviju.",
        "categories": "Kategorije",
        "categories-submit": "Prikaži",
-       "categoriespagetext": "{{PLURAL:$1|Slijedeća kategorija sadrži|Slijedeće kategorije sadrže}} stranice ili multimedijalne datoteke.\n[[Special:UnusedCategories|Nekorištene kategorije]] nisu prikazane ovdje.\nVidi također [[Special:WantedCategories|zatražene kategorije]].",
+       "categoriespagetext": "{{PLURAL:$1|Sljedeća kategorija sadrži|Sljedeće kategorije sadrže}} stranice ili multimedijalne datoteke.\n[[Special:UnusedCategories|Nekorištene kategorije]] nisu prikazane ovdje.\nTakođer pogledajte [[Special:WantedCategories|zatražene kategorije]].",
        "categoriesfrom": "Prikaži kategorije počev od:",
-       "deletedcontributions": "Obrisani doprinosi korisnika",
+       "deletedcontributions": "Obrisani korisnički doprinosi",
        "deletedcontributions-title": "Obrisani doprinosi korisnika",
        "sp-deletedcontributions-contribs": "doprinosi",
        "linksearch": "Pretraga vanjskih linkova",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
        "listgrouprights-namespaceprotection-restrictedto": "Prava kojima se dozvoljava korisniku da uređuje",
        "listgrants": "Dozvole",
-       "listgrants-summary": "Ovo je spisak OAuth dozvola s odgovarajućim pravima uz svaku dozvolu s desne strane. Korisnici aplikacijama mogu odobriti da koriste njihov korisnički račun ali uz ograničena prava u zavisnosti od tog koju dozvolu im korisnik omogući. Međutim, aplikacija koja se koristi korisničkim računom ne može koristiti prava koja korisnik ne posjeduje. Moguće je da postoje [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]] o pojedinim pravima.",
+       "listgrants-summary": "Ovo je spisak dozvola s odgovarajućim pravima uz svaku dozvolu s desne strane. Korisnici aplikacijama mogu odobriti da koriste njihov korisnički račun, ali uz ograničena prava u zavisnosti od tog koju dozvolu im korisnik omogući. Međutim, aplikacija koja se koristi korisničkim računom ne može koristiti prava koja korisnik ne posjeduje. Moguće je da postoje [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]] o pojedinim pravima.",
        "listgrants-grant": "Dozvola",
        "listgrants-rights": "Prava",
-       "trackingcategories": "Praćenje kategorija",
-       "trackingcategories-summary": "Ova stranica prikazuje prateće kategorije koje MediaWiki softver automatski popunjava. Njihovi nazivi se mogu promijeniti izmjenom odgovarajućih sistemskih poruka u imenskom prostoru {{ns:8}}.",
+       "trackingcategories": "Kategorije za praćenje",
+       "trackingcategories-summary": "Ova stranica prikazuje kategorije za praćenje koje softver MediaWiki automatski popunjava. Njihovi nazivi mogu se promijeniti izmjenom odgovarajućih sistemskih poruka u imenskom prostoru {{ns:8}}.",
        "trackingcategories-msg": "Praćenje kategorije",
        "trackingcategories-name": "Ime poruke",
        "trackingcategories-desc": "Kriterij uključenja kategorije",
        "mywatchlist": "Spisak praćenja",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
-       "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
+       "watchlistanontext": "Morate biti prijavljeni da biste vidjeli ili uređivali svoj spisak praćenih članaka.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak praćenja",
        "addedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor dodani su na Vaš [[Special:Watchlist|spisak praćenja]].",
        "removedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor uklonjeni su s Vašeg [[Special:Watchlist|spiska praćenja]].",
        "removedwatchtext-talk": "\"[[:$1]]\" i njoj pridružena stranica uklonjene su s Vašeg [[Special:Watchlist|spiska praćenja]].",
        "removedwatchtext-short": "Stranica \"$1\" je uklonjena sa vašeg spiska praćenja.",
-       "watch": "Prati članak",
+       "watch": "Prati",
        "watchthispage": "Prati ovu stranicu",
        "unwatch": "Prestani pratiti",
        "unwatchthispage": "Prestani pratiti",
-       "notanarticle": "Nije članak",
+       "notanarticle": "Nije stranica sa sadržajem",
        "notvisiblerev": "Obrisana je posljednja izmjena drugog korisnika",
        "watchlist-details": "Imate {{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} na Vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "wlheader-enotif": "Uključeno je obavještenje e-poštom.",
        "wlheader-showupdated": "Stranice koje su izmijenjene otkad ste ih posljednji put posjetili prikazane su <strong>podebljanim slovima</strong>.",
-       "wlnote": "Ispod {{PLURAL:$1|je najskorija izmjena|su <strong>$1</strong> najskorije izmjene|<strong>$1</strong> najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
+       "wlnote": "Ispod {{PLURAL:$1|je posljednja izmjena|su <strong>$1</strong> posljednje izmjene|su <strong>$1</strong> posljednjih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-hide": "Sakrij",
        "watchlist-submit": "Prikaži",
        "enotif_body_intro_moved": "Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|premjestio|premjestila}} je $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3 za trenutnu verziju.",
        "enotif_body_intro_restored": "Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|vratio|vratila}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3 za trenutnu verziju.",
        "enotif_body_intro_changed": "Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|promijenio|promijenila}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3 za trenutnu verziju.",
-       "enotif_lastvisited": "Pogledajte $1 za sve izmjene od vaše posljednje posjete.",
-       "enotif_lastdiff": "Vidi $1 da pregledate ovu promjenu.",
+       "enotif_lastvisited": "Za sve izmjene od Vaše posljednje posjete, pogledajte $1",
+       "enotif_lastdiff": "Da vidite ovu izmjenu, pogledajte $1",
        "enotif_anon_editor": "anonimni korisnik $1",
        "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osim ako prijavljeni ponovno posjetite stranicu. Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\nVaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki email obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
        "created": "napravljena",
-       "changed": "promijenjena",
+       "changed": "izmijenjena",
        "deletepage": "Obriši stranicu",
-       "confirm": "Potvrdite",
+       "confirm": "Potvrdi",
        "excontent": "sadržaj je bio: \"$1\"",
        "excontentauthor": "sadržaj je bio: \"$1\", a jedini urednik \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj prije brisanja je bio: \"$1\"",
        "editcomment": "Sažetak izmjene je bio: <em>$1</em>.",
        "revertpage": "Vraćene izmjene {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
        "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]",
-       "rollback-success": "Vraćene izmjene {{GENDER:$2|korisnika|korisnice}} $1 na posljednju verziju {{GENDER:$2|korisnika|korisnice}} $2.",
+       "rollback-success": "Vraćene izmjene {{GENDER:$3|korisnika|korisnice}} $1 na posljednju verziju {{GENDER:$4|korisnika|korisnice}} $2.",
+       "rollback-success-notify": "Vraćenje izmjene korisnika $1;\nvraćeno na posljednju izmjenu korisnika $2. [$3 Prikaži izmjene]",
        "sessionfailure-title": "Greška u sesiji",
        "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
        "changecontentmodel": "Promijeni model sadržaja stranice",
        "changecontentmodel-emptymodels-title": "Nema dostupnih modela sadržaja",
        "changecontentmodel-emptymodels-text": "Model sadržaja stranice [[:$1]] ne može se pretvoriti ni u jednu drugu vrstu.",
        "log-name-contentmodel": "Zapisnik promjene modela sadržaja",
-       "log-description-contentmodel": "Događaji koji su povezani s modelom sadržaja stranice",
+       "log-description-contentmodel": "Ova stranica navodi izmjene modela sadržaja stranica, kao i stranice napravljene s modelom sadržaja koji se razlikuje od predodređenog.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|napravio|napravila}} je stranicu $3 s nestandardnim modelom sadržaja \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|promijenio|promijenila}} je model sadržaja stranice $3 iz \"$4\" u \"$5\"",
        "logentry-contentmodel-change-revertlink": "vrati",
        "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju}} uključenu prenosivu zaštitu.\nPromjene stepena zaštite ove stranice neće utjecati na prenosnu zaštitu.",
        "protect-default": "Dopušteno svim korisnicima",
        "protect-fallback": "Dozvolite samo korisnicima sa \"$1\" ovlastima/privilegijama",
-       "protect-level-autoconfirmed": "dopušteno samo automatski potvrđenim korisnicima",
-       "protect-level-sysop": "dopušteno samo administratorima",
+       "protect-level-autoconfirmed": "Dopušteno samo automatski potvrđenim korisnicima",
+       "protect-level-sysop": "Dopušteno samo administratorima",
        "protect-summary-desc": "[$1=$2] ($3)",
        "protect-summary-cascade": "prenosna zaštita",
        "protect-expiring": "ističe $1 (UTC)",
        "minimum-size": "Najmanja veličina",
        "maximum-size": "Najveća veličina:",
        "pagesize": "(bajta)",
-       "restriction-edit": "uređivanje",
-       "restriction-move": "premještanje",
+       "restriction-edit": "Uređivanje",
+       "restriction-move": "Premještanje",
        "restriction-create": "pravljenje",
        "restriction-upload": "Postavljanje",
        "restriction-level-sysop": "potpuno zaštićeno",
        "undeletepagetext": "{{PLURAL:$1|Slijedeća $1 stranica je obrisana|Slijedeće $1 stranice su obrisane|Slijedećih $1 je obrisano}} ali su još uvijek u arhivi i mogu biti vraćene.\nArhiva moše biti periodično čišćena.",
        "undelete-fieldset-title": "Vraćanje izmjena",
        "undeleteextrahelp": "Da biste vratili cijelu historiju stranice, ostavite sve kućice neoznačene i kliknite na <strong><em>{{int:undeletebtn}}</em></strong>.\nDa biste vratili određene izmjene, označite ih i kliknite na <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "$1 {{PLURAL:$1|izmjena je obrisana|izmjena je obrisano}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|izmjena je obrisana|izmjene su obrisane|izmjena je obrisano}}",
        "undeletehistory": "Ako vratite stranicu, sve će izmjene biti vraćene u njenu historiju.\nAko je u međuvremenu napravljena nova izmjena s istim nazivom, vraćene izmjene pojavit će se u njenoj ranijoj historiji.",
        "undeleterevdel": "Vraćanje neće biti izvršeno ako je rezultat toga djelomično brisanje posljednje izmjene.\nU takvim slučajevima morate isključiti ili otkriti najnoviju obrisanu izmjenu.",
        "undeletehistorynoadmin": "Ova stranica je obrisana.\nRazlog za brisanje se nalazi ispod, zajedno s detaljima o korisniku koji je mijenjao stranicu prije brisanja.\nTekst obrisanih verzija dostupan je samo administratorima.",
        "undeleteviewlink": "pogledaj",
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|vraćena $1 verzija|vraćene $1 verzije|vraćeno $1 verzija}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 verzija|$1 verzije|$1 verzija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno",
-       "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
        "cannotundelete": "Vraćanje jedne ili svih stavki nije uspjelo:\n$1",
        "undeletedpage": "<strong>Stranica $1 je vraćena</strong>\n\nProvjerite [[Special:Log/delete|zapisnik brisanja]] za zapise nedavnih brisanja i vraćanja.",
        "undelete-header": "Pogledajte [[Special:Log/delete|zapisnik brisanja]] za nedavno obrisane stranice.",
        "namespace_association": "Povezan imenski prostor",
        "tooltip-namespace_association": "Označite ovu kutiju da također uključite razgovor ili imenski prostor teme koja je povezana sa odabranim imenskim prostorom",
        "blanknamespace": "(glavni)",
-       "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
+       "contributions": "{{GENDER:$1|Korisnički}} doprinosi",
        "contributions-title": "Doprinosi korisnika $1",
        "mycontris": "Doprinosi",
        "anoncontribs": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registriran.",
-       "nocontribs": "Nisu nađene promjene koje zadovoljavaju ove uslove.",
+       "nocontribs": "Nema izmjena koje odgovaraju navedenim kriterijima.",
        "uctop": "(trenutno)",
        "month": "Od mjeseca (i ranije):",
        "year": "Od godine (i ranije):",
        "sp-contributions-uploads": "postavljanja",
        "sp-contributions-logs": "zapisnici",
        "sp-contributions-talk": "razgovor",
-       "sp-contributions-userrights": "postavke korisničkih prava",
+       "sp-contributions-userrights": "postavke {{GENDER:$1|korisničkih}} prava",
        "sp-contributions-blocked-notice": "{{GENDER:$1|Ovaj korisnik|Ova korisnica}} je trenutno {{GENDER:$1|blokiran|blokirana}}.\nPosljednju stavku zapisnika blokiranja možete pogledati ispod:",
        "sp-contributions-blocked-notice-anon": "Ova IP adresa je trenutno blokirana.\nPosljednje stavke zapisnika blokiranja možete pogledati ispod:",
        "sp-contributions-search": "Pretraži doprinose",
        "whatlinkshere": "Šta vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na \"$1\"",
        "whatlinkshere-page": "Stranica:",
-       "linkshere": "Sljedeći članci vode na '''[[:$1]]''':",
+       "linkshere": "Sljedeće stranice vode na <strong>[[:$1]]</strong>:",
        "nolinkshere": "Nijedna stranica nije povezana sa <strong>[[:$1]]</strong>.",
        "nolinkshere-ns": "Nijedna stranica nije povezana sa <strong>[[:$1]]</strong> u izabranom imenskom prostoru.",
        "isredirect": "preusmjerenje",
-       "istemplate": "šablon",
+       "istemplate": "uključivanje",
        "isimage": "veza na datoteku",
        "whatlinkshere-prev": "{{PLURAL:$1|prethodni|prethodna|prethodnih}} $1",
        "whatlinkshere-next": "{{PLURAL:$1|sljedeći|sljedeća|sljedećih}} $1",
        "unblock": "Odblokiraj korisnika",
        "blockip": "Blokiraj {{GENDER:$1|korisnika|korisnicu}}",
        "blockip-legend": "Blokiranje korisnika",
-       "blockiptext": "Upotrebite donji upitnik da biste uklonili prava pisanja sa određene IP adrese ili korisničkog imena.  Ovo bi trebalo da bude urađeno samo da bi se spriječio vandalizam, i u skladu sa [[{{MediaWiki:Policy-url}}|smjernicama]]. Unesite konkretan razlog ispod (na primjer, navodeći koje stranice su vandalizovane).",
-       "ipaddressorusername": "IP adresa ili korisničko ime:",
+       "blockiptext": "Koristite donji obrazac da biste uklonili prava pisanja određenoj IP-adresi ili korisničkom imenu.\nOvo bi se trebalo raditi samo da bi se spriječio vandalizam, i u skladu sa [[{{MediaWiki:Policy-url}}|smjernicama]].\nIspod upišite konkretan razlog (naprimjer, navedite koje su stranice vandalizirane).\nMožete blokirati IP-opsege koristeći sintaksu [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR-a]; najveći dozvoljeni opseg za IPv4 je /$1, a za IPv6 /$2.",
+       "ipaddressorusername": "IP-adresa ili korisničko ime:",
        "ipbexpiry": "Ističe:",
        "ipbreason": "Razlog:",
        "ipbreason-dropdown": "*Najčešći razlozi blokiranja\n**Netačne informacije\n**Uklanjanje sadržaja stranica\n**Postavljanje spam vanjskih linkova\n**Ubacivanje gluposti/grafita\n**Osobni napadi (ili napadačko ponašanje)\n**Čarapare (zloupotreba više korisničkih računa)\n**Neprihvatljivo korisničko ime",
-       "ipb-hardblock": "Onemogući prijavljene korisnike da uređuju sa ove IP adrese",
+       "ipb-hardblock": "Spriječi prijavljene korisnike da uređuju s ove IP-adrese",
        "ipbcreateaccount": "Spriječi pravljenje računa",
-       "ipbemailban": "Onemogući korisnika da šalje e-mail",
+       "ipbemailban": "Spriječi korisnika da šalje e-poštu",
        "ipbenableautoblock": "Automatski blokiraj posljednju IP-adresu koju je koristio ovaj korisnik i sve druge IP-adrese s kojih je pokušao uređivati",
        "ipbsubmit": "Blokiraj ovog korisnika",
        "ipbother": "Drugo vrijeme:",
        "ipboptions": "2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 sedmica:1 week,2 sedmice:2 weeks,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godine:1 year,beskonačno:infinite",
        "ipbhidename": "Sakrij korisničko ime iz uređivanja i spiskova",
        "ipbwatchuser": "Prati korisničku stranicu i stranicu za razgovor ovog korisnika",
-       "ipb-disableusertalk": "Onemogući ovog korisnika da uređuje svoju stranicu za razgovor dok je blokiran",
+       "ipb-disableusertalk": "Spriječi ovog korisnika da uređuje svoju stranicu za razgovor dok je blokiran",
        "ipb-change-block": "Ponovno blokiraj korisnika sa novim postavkama",
        "ipb-confirm": "Potvrdite blokiranje",
        "badipaddress": "Pogrešna IP adresa",
        "unblocked-id": "Blokada ID oznake $1 je uklonjena",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] je deblokiran.",
        "blocklist": "Blokirani korisnici",
+       "autoblocklist": "Autoblokovi",
+       "autoblocklist-submit": "Pretraži",
+       "autoblocklist-legend": "Ispis autoblokova",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Lokalni autoblok|Lokalni autoblokovi}}",
+       "autoblocklist-empty": "Spisak autoblokova je prazan.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Drugi autoblok|Drugi autoblokovi}}",
        "ipblocklist": "Blokirani korisnici",
        "ipblocklist-legend": "Traži blokiranog korisnika",
        "blocklist-userblocks": "Sakrij blokade računa",
        "block-log-flags-hiddenname": "korisničko ime sakriveno",
        "range_block_disabled": "Administratorska mogućnost da blokira grupe je isključena.",
        "ipb_expiry_invalid": "Neispravno vrijeme isteka.",
+       "ipb_expiry_old": "Vrijeme isteka je u prošlosti.",
        "ipb_expiry_temp": "Sakrivene blokade korisničkih imena moraju biti stalne.",
        "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; on ima više od {{PLURAL:$1|jedne izmjene|$1 izmjena}}.",
        "ipb_already_blocked": "\"$1\" je već blokiran",
        "unblock-hideuser": "Ne možete deblokirati ovog korisnika jer je njegovo korisničko ime sakriveno.",
        "ipb_cant_unblock": "Greška: Blokirani ID $1 nije pronađen. Možda je korisnik već deblokiran.",
        "ipb_blocked_as_range": "Greška: IP adresa $1 nije direktno blokirana i ne može se deblokirati.\nMeđutim, možda je blokirana kao dio bloka $2, koji se ne može deblokirati.",
-       "ip_range_invalid": "Netačan raspon IP adresa.",
+       "ip_range_invalid": "Netačan opseg IP-adresa.",
        "ip_range_toolarge": "Nisu dopuštene blokade veće od /$1.",
        "proxyblocker": "Zaštita od proxya",
        "proxyblockreason": "Vaša IP adresa je blokirana jer je ona otvoreni proxy.\nMolimo vas da kontaktirate vašeg davatelja internetskih usluga ili tehničku podršku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.",
        "sorbsreason": "Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.",
        "sorbs_create_account_reason": "Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL korišten od {{SITENAME}}.\nNe možete napraviti račun",
+       "softblockrangesreason": "Anonimni doprinosi nisu dozvoljeni s Vaše IP-adrese ($1). Prijavite se.",
        "xffblockreason": "Blokirana je vaša ili IP adresa proxy servera koga koristite, koja se nalazi u zaglavlju X-Forwarded-For. Razlog za blokiranje je bio: $1",
        "cant-see-hidden-user": "Korisnik kojeg pokušavate blokirati je već blokiran i sakriven. Pošto nemate prava hideuser (sakrivanje korisnika), ne možete vidjeti ni urediti korisnikovu blokadu.",
        "ipbblocked": "Ne možete blokirati ili deblokirati druge korisnike, jer ste i sami blokirani",
        "ipbnounblockself": "Nije Vam dopušteno da deblokirate samog sebe",
-       "lockdb": "Zaključajte bazu",
-       "unlockdb": "Otključaj bazu",
-       "lockdbtext": "Zaključavanje baze će svim korisnicima ukinuti mogućnost izmjene stranica,\npromjene korisničkih podešavanja, izmjene praćenih članaka, i svega ostalog\nšto zahtjeva promjene u bazi.\nMolimo Vas da potvrdite da je ovo zaista ono što namjeravate da uradite, i da ćete\notkučati bazu kad završite posao oko njenog održavanja.",
+       "lockdb": "Zaključavanje baze podataka",
+       "unlockdb": "Otključavanje baze podataka",
+       "lockdbtext": "Zaključavanje baze će svim korisnicima ukinuti mogućnost izmjene stranica,\nkorisničkih postavki, praćenih članaka i svega ostalog\nšto zahtijeva izmjenu u bazi.\nPotvrdite da je ovo zaista ono što namjeravate uraditi i da ćete\notkučati bazu kad završite posao oko njenog održavanja.",
        "unlockdbtext": "Otključavanje baze će svim korisnicima vratiti mogućnost\nizmjene stranica, promjene korisničkih stranica, izmjene spiska praćenih članaka,\ni svega ostalog što zahtjeva promjene u bazi.\nMolimo Vas da potvrdite da je ovo zaista ono što namijeravate da uradite.",
-       "lockconfirm": "Da, zaista želim da zaključam bazu.",
-       "unlockconfirm": "Da, zaista želim da otključam bazu.",
-       "lockbtn": "Zaključajte bazu",
+       "lockconfirm": "Da, zaista želim zaključati bazu.",
+       "unlockconfirm": "Da, zaista želim otključati bazu.",
+       "lockbtn": "Zaključaj bazu",
        "unlockbtn": "Otključaj bazu",
        "locknoconfirm": "Niste potvrdili svoju namjeru.",
        "lockdbsuccesssub": "Baza je zaključana",
        "unlockdbsuccesssub": "Baza je otključana",
-       "lockdbsuccesstext": "{{SITENAME}} baza podataka je zaključana. <br /> Sjetite se da je otključate kad završite sa održavanjem.",
+       "lockdbsuccesstext": "Baza podataka je zaključana.<br />\nNe zaboravite je [[Special:UnlockDB|otključati]] nakon što završite s održavanjem.",
        "unlockdbsuccesstext": "{{SITENAME}} baza podataka je otključana.",
        "lockfilenotwritable": "Datoteka zaključavanja baze je zaštićena za pisanje.\nAko želite otključati ili zaključati bazu, ova datoteka mora biti omogućena za pisanje od strane web servera.",
+       "databaselocked": "Baza podataka već je zaključana.",
        "databasenotlocked": "Baza podataka nije zaključana.",
        "lockedbyandtime": "(od $1 dana $2 u $3)",
        "move-page": "Premjesti $1",
        "move-page-legend": "Premjesti stranicu",
-       "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom postat će stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmijeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti premješten ako već postoji članak pod imenom na koje ga namjeravate preusmjeriti osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice.\nMolimo da dobro razmislite prije no što premjestite stranicu.",
+       "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom postat će stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmijeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak <strong>neće</strong> biti premješten ako već postoji članak pod imenom na koje ga namjeravate preusmjeriti osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n<strong>Napomena:</strong>\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice.\nMolimo da dobro razmislite prije no što premjestite stranicu.",
        "movepagetext-noredirectfixer": "Koristeći donji obrazac, preimenovat ćete stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv postat će preusmjerenje na novi naziv.\nMolimo da provjerite postoje li [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti jesu li linkovi ispravni i vode li tamo kamo bi trebali voditi.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znači da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili, ali ne možete ponovo preimenovati postojeću stranicu.\n\n<strong>Napomena:</strong>\nImajte na umu da premještanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo da budete sigurni da ste shvatili posljedice prije no što nastavite.",
        "movepagetalktext": "Ako označite ovu kutijicu, odgovarajuća stranica za razgovor, ako postoji, automatski će biti premještena na novi naziv, osim ako već postoji sadržaj na odredišnoj stranici za razgovor.\n\nU tom slučaju, morat ćete ručno premjestiti ili prekopirati stranicu ako to želite.",
        "moveuserpage-warning": "<strong>Upozorenje:</strong> Premještate korisničku stranicu. Imajte u vidu da će samo stranica biti premještena, a sam korisnik <em>neće</em> biti preimenovan.",
        "semiprotectedpagemovewarning": "'''Napomena:''' Ova stranica je zaključana tako da je mogu uređivati samo registrovani korisnici.\nPosljednja stavka zapisnika je prikazana ispod kao referenca:",
        "move-over-sharedrepo": "[[:$1]] postoji na dijeljenom skladištu. Premještanje datoteke na ovaj naslov zamijenit će dijeljenu datoteku.",
        "file-exists-sharedrepo": "Ime datoteke koje ste odabrali je već korišteno u dijeljenom repozitorijumu.\nMolimo odaberite drugo ime.",
-       "export": "Izvezite stranice",
+       "export": "Izvoz stranica",
        "exporttext": "Možete izvesti tekst i historiju jedne ili više stranica uklopljene u XML kod.\nOvo se može uvesti u drugi wiki koristeći MediaWiki preko [[Special:Import|stranice uvoza]].\n\nZa izvoz stranica unesite njihove naslove u polje ispod, jedan naslov po retku, i označite želite li trenutnu verziju zajedno sa svim ranijim, ili samo trenutnu verziju sa informacijom o zadnjoj promjeni.\n\nU drugom slučaju možete koristiti i vezu, npr. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].",
        "exportall": "Izvezi sve stranice",
-       "exportcuronly": "Uključite samo trenutnu reviziju, ne cijelu historiju",
+       "exportcuronly": "Uključi samo trenutnu verziju, ne cijelu historiju",
        "exportnohistory": "----\n'''Pažnja:''' Izvoz cjelokupne historije stranica preko ovog obrasca je onemogućeno iz tehničkih razloga.",
        "exportlistauthors": "Uključi cjelokupan spisak doprinosilaca za svaku stranicu",
        "export-submit": "Izvezi",
        "export-manual": "Ručno dodaj stranice:",
        "allmessages": "Sve sistemske poruke",
        "allmessagesname": "Naziv",
-       "allmessagesdefault": "Uobičajeni tekst",
+       "allmessagesdefault": "Predodređeni tekst",
        "allmessagescurrent": "Trenutni tekst",
-       "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u MediaWiki imenskom prostoru.\nMolimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki lokalizaciju] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
+       "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u imenskom prostoru MediaWiki.\nPosjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWikija] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
        "allmessagesnotsupportedDB": "Ova stranica ne može biti korištena jer je <i>wgUseDatabaseMessages</i> isključen.",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filter po stanju podešavanja:",
        "thumbnail-dest-create": "Ne mogu da sačuvam smanjenu sliku (\"thumbnail\") na destinaciju",
        "thumbnail_invalid_params": "Pogrešne postavke smanjenog prikaza",
        "thumbnail_toobigimagearea": "Datoteka sa dimenzijama većim od $1",
-       "thumbnail_dest_directory": "Ne može se napraviti odredišni folder",
+       "thumbnail_dest_directory": "Ne mogu napraviti odredišni folder",
        "thumbnail_image-type": "Tip slike nije podržan",
        "thumbnail_gd-library": "Nekompletna konfiguracija GD biblioteke: nedostaje funkcija $1",
        "thumbnail_image-missing": "Datoteka ne dostaje: $1",
        "import-mapping-subpage": "Uvezi kao podstranice sljedeće stranice:",
        "import-upload-filename": "Naziv datoteke:",
        "import-comment": "Komentar:",
-       "importtext": "Molimo Vas da izvezete datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].\nSačuvajte je na Vašem računaru i pošaljite ovdje.",
-       "importstart": "Uvoz stranica...",
+       "importtext": "Izvezite datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].\nSačuvajte je na svoj računar i postavite je ovdje.",
+       "importstart": "Uvozim stranice...",
        "import-revision-count": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "importnopages": "Nema stranica za uvoz.",
        "imported-log-entries": "{{PLURAL:$1|Uvezena $1 stavka zapisnika|Uvezene $1 stavke zapisnika|Uvezeno $1 stavki zapisnika}}.",
-       "importfailed": "Uvoz nije uspjeo: $1",
+       "importfailed": "Uvoz nije uspio: $1",
        "importunknownsource": "Nepoznat izvorni tip uvoza",
-       "importcantopen": "Ne može se otvoriti uvozna datoteka",
+       "importcantopen": "Ne mogu otvoriti datoteku za uvoz",
        "importbadinterwiki": "Loš interwiki link",
        "importsuccess": "Uspješno ste uvezli stranicu!",
-       "importnosources": "Nije definisan međuwiki izvor za uvoz i direktna postavljanja historije su isključena.",
+       "importnosources": "Nije definiran međuwiki izvor za uvoz i direktna postavljanja historije su isključena.",
        "importnofile": "Uvozna datoteka nije postavljena.",
        "importuploaderrorsize": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je veća nego što je dopušteno.",
        "importuploaderrorpartial": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je samo djelimično postavljena.",
        "import-nonewrevisions": "Nijedna revizija nije uvezena (ili su sve već prisutne ili su preskočene zbog greške).",
        "xml-error-string": "$1 na liniji $2, kolona $3 (bajt $4): $5",
        "import-upload": "Postavljanje XML podataka",
-       "import-token-mismatch": "Izgubljeni podaci sesije. Molimo pokušajte ponovno.",
-       "import-invalid-interwiki": "Ne može se uvesti iz navedenog wikija.",
+       "import-token-mismatch": "Izgubljeni podaci sesije.\n\nMožda ste odjavljeni. <strong>Provjerite jeste li još uvijek prijavljeni i pokušajte ponovo</strong>.\nAko i dalje ne radi, pokušajte se [[Special:UserLogout|odjaviti]] i ponovo prijaviti i provjerite dozvoljava li Vaš preglednik kolačiće s ovog sajta.",
+       "import-invalid-interwiki": "Ne mogu uvesti iz navedenog wikija.",
        "import-error-edit": "Stranica \"$1\" nije uvezena jer vam nije dopušteno da je uređujete.",
        "import-error-create": "Stranica \"$1\" nije uvezena jer vam nije dozvoljeno da je napravite.",
        "import-error-interwiki": "Stranica \"$1\" nije uvezena jer je njen naziv rezerviran za vanjsko povezivanje (interwiki).",
        "tooltip-pt-preferences": "{{GENDER:|Vaše}} postavke",
        "tooltip-pt-watchlist": "Spisak stranica koje pratite",
        "tooltip-pt-mycontris": "Spisak {{GENDER:|Vaših}} doprinosa",
+       "tooltip-pt-anoncontribs": "Spisak izmjena napravljenih s ove IP-adrese",
        "tooltip-pt-login": "Predlažemo da se prijavite, ali nije obvezno.",
+       "tooltip-pt-login-private": "Morate se prijaviti da biste koristili ovaj wiki",
        "tooltip-pt-logout": "Odjavi me",
        "tooltip-pt-createaccount": "Ohrabrujemo vas da otvorite nalog i prijavite se, međutim to nije obavezno",
        "tooltip-ca-talk": "Razgovor o sadržaju",
        "tooltip-search": "Pretraži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
        "tooltip-search-go": "Idi na stranicu s tačno ovim imenom ako postoji",
        "tooltip-search-fulltext": "Pretražite stranice s ovim tekstom",
-       "tooltip-p-logo": "Glavna stranica",
+       "tooltip-p-logo": "Posjetite početnu stranicu",
        "tooltip-n-mainpage": "Posjetite početnu stranicu",
        "tooltip-n-mainpage-description": "Posjetite početnu stranicu",
        "tooltip-n-portal": "O projektu, šta možete da uradite, gdje se šta nalazi",
        "print.css": "/* CSS umetnut ovdje uticat će na izgled isprintane stranice */",
        "common.js": "/* Bilo koja JavaScript će biti učitana za sve korisnike pri svakom učitavanju stranice. */",
        "anonymous": "{{PLURAL:$1|Anonimni korisnik|$1 anonimna korisnika|$1 anonimnih korisnika}} projekta {{SITENAME}}",
-       "siteuser": "{{SITENAME}} korisnik $1",
+       "siteuser": "{{SITENAME}} {{GENDER:$2|korisnik|korisnica}} $1",
        "anonuser": "{{SITENAME}} anonimni korisnik $1",
-       "lastmodifiedatby": "Ovu stranicu posljednji je put {{GENDER:$4|izmijenio|izmijenila}} $3 dana $1 u $2.",
+       "lastmodifiedatby": "Ovu stranicu posljednji je put {{GENDER:$4|uredio|uredila}} $3 na datum $1 u $2.",
        "othercontribs": "Bazirano na radu od strane korisnika $1.",
        "others": "ostali",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|korisnik|korisnika}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|korisnik|korisnica}}|korisnici}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|anonimni korisnik|anonimni korisnici}} $1",
        "creditspage": "Autori stranice",
        "nocredits": "Autori ove stranice nisu navedeni.",
        "markedaspatrolledtext": "Izabrana izmjena stranice [[:$1]] označena je patroliranom.",
        "rcpatroldisabled": "Patroliranje nedavnih izmjena onemogućeno",
        "rcpatroldisabledtext": "Funkcija patroliranja nedavnih izmjena je trenutno isključena.",
-       "markedaspatrollederror": "Ne može se označiti kao patrolirano",
+       "markedaspatrollederror": "Ne mogu označiti kao patrolirano",
        "markedaspatrollederrortext": "Morate izabrati izmjenu koju želite označiti patroliranom.",
        "markedaspatrollederror-noautopatrol": "Nije Vam dopušteno da vlastite izmjene označavate patroliranim.",
-       "markedaspatrollednotify": "Ova izmjena na stranici „$1“ je označena kao pregledana.",
+       "markedaspatrollednotify": "Ova izmjena na stranici $1 označena je kao patrolirana.",
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Zapisnik patroliranja",
        "patrol-log-header": "Ovo je zapisnik patroliranih izmjena.",
        "previousdiff": "← Starija izmjena",
        "nextdiff": "Novija izmjena →",
        "mediawarning": "'''Upozorenje''': Ova datoteka sadrži loš kod, njegovim izvršavanjem možete da ugrozite Vaš sistem.",
-       "imagemaxsize": "Ograničenje veličine slike:<br />''(za stranice opisa datoteke)''",
+       "imagemaxsize": "Ograničenje veličine slike:<br /><em>(za stranice opisa datoteke)</em>",
        "thumbsize": "Veličina umanjenog prikaza:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|stranica|stranice|stranica}}",
        "file-info": "veličina datoteke: $1, MIME tip: $2",
        "file-no-thumb-animation": "'''Napomena: Zbog tehničkih ograničenja minijature ove datoteke neće biti animirane.'''",
        "file-no-thumb-animation-gif": "'''Napomena: Zbog tehničkih ograničenja, minijature GIF slika visoke rezolucije kao što je ova neće biti animirane.'''",
        "newimages": "Galerija novih slika",
-       "imagelisttext": "Ispod je spisak od '''$1''' {{PLURAL:$1|datoteke|datoteke|datoteka}} poredanih $2.",
+       "imagelisttext": "Ispod je spisak od <strong>$1</strong> {{PLURAL:$1|datoteke|datoteke|datoteka}} poredanih $2.",
        "newimages-summary": "Ova posebna stranica prikazuje nedavno postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
-       "newimages-showbots": "Pokaži datoteke koje su poslali botovi",
+       "newimages-user": "IP-adresa ili korisničko ime",
+       "newimages-showbots": "Prikaži datoteke koje su postavili botovi",
        "newimages-hidepatrolled": "Sakrij patrolirana postavljanja",
        "noimages": "Nema ništa.",
        "gallery-slideshow-toggle": "Uključi/isključi sličice",
        "hours": "{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}",
        "days": "{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}",
        "weeks": "{{PLURAL:$1|$1 sedmica}}",
-       "months": "{{PLURAL:$1|$1 mjesec|$1 mjeseci}}",
+       "months": "{{PLURAL:$1|$1 mjesec|$1 mjeseca|$1 mjeseci}}",
        "years": "{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}",
        "ago": "prije $1",
        "just-now": "upravo sad",
        "bad_image_list": "Koristi se sljedeći format:\n\nRazmatraju se samo stavke u spisku (linije koje počinju sa *).\nPrvi link u liniji mora biti povezan sa lošom slikom.\nSvi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje se slike pojavljuju ''inline''.",
        "metadata": "Metapodaci",
        "metadata-help": "Ova datoteka sadržava dodatne podatke koje je vjerovatno dodala digitalna kamera ili skener u procesu snimanja, odnosno digitalizacije. Ako je datoteka mijenjana, podaci možda nisu u skladu sa stvarnim stanjem.",
-       "metadata-expand": "Pokaži sve detalje",
-       "metadata-collapse": "Sakrij dodatne podatke",
+       "metadata-expand": "Prikaži detalje",
+       "metadata-collapse": "Sakrij detalje",
        "metadata-fields": "Polja metapodataka slika su prikazani ispod slike će biti uključeni u prikaz stranice slike kada je sakrivena tabela metapodataka. U suprotnom će biti sakrivena po postavkama.\n\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Širina",
        "exif-imagelength": "Visina",
        "exif-spectralsensitivity": "Spektralna osjetljivost",
        "exif-isospeedratings": "Rejting ISO brzine",
        "exif-shutterspeedvalue": "Brzina APEX okidača",
-       "exif-aperturevalue": "APEX otvor",
-       "exif-brightnessvalue": "APEX osvijetljenost",
+       "exif-aperturevalue": "Otvor blende",
+       "exif-brightnessvalue": "Osvijetljenost",
        "exif-exposurebiasvalue": "Kompozicija ekspozicije",
        "exif-maxaperturevalue": "Najveći broj otvora blende",
        "exif-subjectdistance": "Udaljenost objekta",
        "exif-gpslongituderef": "Istočna ili zapadna dužina",
        "exif-gpslongitude": "Dužina",
        "exif-gpsaltituderef": "Referenca visine",
-       "exif-gpsaltitude": "Nadmorska visina",
+       "exif-gpsaltitude": "Visina",
        "exif-gpstimestamp": "GPS vrijeme (atomski sat)",
        "exif-gpssatellites": "Sateliti korišteni pri mjerenju",
        "exif-gpsstatus": "Status prijemnika",
        "exif-gpsdop": "Preciznost mjerenja",
        "exif-gpsspeedref": "Jedinica brzine",
        "exif-gpsspeed": "Brzina GPS prijemnika",
-       "exif-gpstrackref": "Referenca za smijer kretanja",
-       "exif-gpstrack": "Smijer kretanja",
-       "exif-gpsimgdirectionref": "Referenca za smijer slike",
-       "exif-gpsimgdirection": "Smijer slike",
+       "exif-gpstrackref": "Referenca za pravac kretanja",
+       "exif-gpstrack": "Pravac kretanja",
+       "exif-gpsimgdirectionref": "Referenca za pravac slike",
+       "exif-gpsimgdirection": "Pravac slike",
        "exif-gpsmapdatum": "Upotrijebljeni podaci geoloških mjerenja",
        "exif-gpsdestlatituderef": "Referenca za širinu odredišta",
        "exif-gpsdestlatitude": "Širina odredišta",
        "exif-objectcycle-p": "Samo navečer",
        "exif-objectcycle-b": "I ujutro i navečer",
        "exif-gpsdirection-t": "Stvarni pravac",
-       "exif-gpsdirection-m": "Magnetski smijer",
+       "exif-gpsdirection-m": "Magnetski pravac",
        "exif-ycbcrpositioning-1": "Centrirano",
        "exif-ycbcrpositioning-2": "Uporedo",
        "exif-dc-contributor": "Autori",
        "monthsall": "sve",
        "confirmemail": "Potvrdite adresu e-pošte",
        "confirmemail_noemail": "Niste unijeli tačnu e-mail adresu u Vaše [[Special:Preferences|korisničke postavke]].",
-       "confirmemail_text": "Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. Aktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu. Pošta uključuje link koji sadrži kod; učitajte link u Vaš preglednik da bi ste potvrdili da je adresa Vaše e-pošte validna.",
+       "confirmemail_text": "{{SITENAME}} zahtijeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte.\nAktivirajte dugme ispod kako biste poslali poštu za potvrdu na Vašu adresu.\nPošta uključuje link koji sadrži kod;\nučitajte link u Vaš preglednik da biste potvrdili da je adresa Vaše e-pošte validna.",
        "confirmemail_pending": "Potvrdni kod Vam je već poslan e-poštom;\nako ste nedavno otvorili račun, trebali biste pričekati nekoliko minuta da poslana pošta stigne, prije nego što ponovo zahtijevate novi kod.",
        "confirmemail_send": "Pošaljite kod za potvrdu",
        "confirmemail_sent": "E-pošta za potvrđivanje poslata.",
        "confirmemail_oncreate": "Kod za potvrđivanje Vam je poslat na Vašu e-mail adresu.\nTaj kod nije neophodan za prijavljivanje, ali Vam ne potreban kako bi ste omogućili funkcije wikija zasnovane na e-mailu.",
-       "confirmemail_sendfailed": "{{SITENAME}} Vam ne može poslati poštu za potvrđivanje. Provjerite adresu zbog nepravilnih karaktera.\n\nPovratna pošta: $1",
+       "confirmemail_sendfailed": "{{SITENAME}} Vam ne može poslati potvrdnu e-poruku.\nProvjerite sadrži li adresa nedopuštene znakove.\n\nGreška: $1",
        "confirmemail_invalid": "Netačan kod za potvrdu. Moguće je da je kod istekao.",
        "confirmemail_needlogin": "Morate biti $1 da biste potvrdili adresu vaše e-pošte.",
        "confirmemail_success": "Adresa vaše e-pošte je potvrđena. Možete sad da se prijavite i uživate u viki.",
        "confirmemail_loggedin": "Adresa Vaše e-pošte je potvrđena.",
-       "confirmemail_subject": "{{SITENAME}} – adresa e-pošte za potvrđivanje",
+       "confirmemail_subject": "Potvrda adrese e-pošte na {{GRAMMAR:dativ|{{SITENAME}}}}",
        "confirmemail_body": "Neko, vjerovatno Vi, je sa IP adrese $1 registrovao nalog \"$2\" sa ovom adresom e-pošte na {{SITENAME}}.\n\nDa potvrdite da ovaj nalog stvarno pripada vama i da aktivirate mogućnost e-pošte na {{SITENAME}}, otvorite ovaj link u vašem pregledniku:\n\n$3\n\nAko ovo niste vi, pratite ovaj link da prekinete prijavu:\n$5\n\nOvaj kod za potvrdu će isteći u $4.",
        "confirmemail_body_changed": "Neko, vjerovatno Vi, je sa IP adrese $1\nje promijenio adresu e-pošte računa \"$2\" na ovu adresu za {{SITENAME}}.\n\nDa potvrdite da ovaj nalog stvarno pripada Vama i da reaktivirate mogućnosti e-pošte na {{SITENAME}}, otvorite ovaj link u Vašem pregledniku:\n\n$3\n\nAko ovaj račun *ne* pripada Vama, pratite ovaj link da prekinete odobravanje adrese e-pošte:\n\n$5\n\nOvaj kod za potvrdu će isteći u $4.",
        "confirmemail_body_set": "Neko, vjerovatno Vi, je sa IP adrese $1\npostavio adresu e-pošte računa \"$2\" na ovu adresu za {{SITENAME}}.\n\nDa potvrdite da ovaj račun stvarno pripada Vama i da aktivirate mogućnosti e-pošte na {{SITENAME}}, otvorite ovaj link u Vašem pregledniku:\n\n$3\n\nAko ovaj račun *ne* pripada Vama, pratite ovaj link da prekinete odobravanje adrese e-pošte:\n\n$5\n\nOvaj kôd za potvrdu će isteći u $4.",
        "confirmemail_invalidated": "Potvrda e-mail adrese otkazana",
-       "invalidateemail": "Odustani od e-mail potvrde",
+       "invalidateemail": "Otkazivanje potvrde e-pošte",
+       "notificationemail_subject_changed": "Registrirana adresa e-pošte na {{GRAMMAR:dativ|{{SITENAME}}}} je promijenjena",
+       "notificationemail_subject_removed": "Registrirana adresa e-pošte na {{GRAMMAR:dativ|{{SITENAME}}}} je uklonjena",
+       "notificationemail_body_changed": "Neko, vjerovatno Vi, s IP-adrese $1,\npromijenio je adresu e-pošte računa \"$2\" na \"$3\" na {{GRAMMAR:dativ|{{SITENAME}}}}.\n\nAko ovo niste bili Vi, odmah se obratite administratoru sajta.",
+       "notificationemail_body_removed": "Neko, vjerovatno Vi, s IP-adrese $1,\nuklonio je adresu e-pošte računa \"$2\" na {{GRAMMAR:dativ|{{SITENAME}}}}.\n\nAko ovo niste bili Vi, odmah se obratite administratoru sajta.",
        "scarytranscludedisabled": "[Međuwiki umetanje je isključeno]",
        "scarytranscludefailed": "[Neuspješno preusmjerenje šablona na $1]",
        "scarytranscludefailed-httpstatus": "[Preuzimanje šablona nije uspjelo za $1: HTTP $2]",
        "scarytranscludetoolong": "[URL je predugačak]",
-       "deletedwhileediting": "'''Upozorenje''': Ova stranica je obrisana prije nego što ste počeli uređivati!",
+       "deletedwhileediting": "<strong>Upozorenje:</strong> Ova stranica je obrisana prije nego što ste počeli uređivati!",
        "confirmrecreate": "{{GENDER:$1|Korisnik|Korisnica}} [[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|obrisao|obrisala}} je ovu stranicu nakon što ste je počeli uređivati iz sljedećeg razloga:\n: <em>$2</em>\n\nPotvrdite da stvarno želite ponovo napraviti ovu stranicu.",
        "confirmrecreate-noreason": "{{GENDER:$1|Korisnik|Korisnica}} [[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|obrisao|obrisala}} je ovu stranicu nakon što ste je počeli uređivati. Potvrdite da stvarno želite ponovo napraviti ovu stranicu.",
        "recreate": "Ponovno napravi",
        "unit-pixel": "px",
+       "confirm-purge-title": "Osvježi ovu stranicu",
        "confirm_purge_button": "U redu",
        "confirm-purge-top": "Da li želite obrisati keš ove stranice?",
        "confirm-purge-bottom": "Ispražnjava keš stranice i prikazuje najsvježiju verziju.",
        "hebrew-calendar-m6": "Adar",
        "hebrew-calendar-m6a": "Adar I",
        "hebrew-calendar-m6b": "Adar II",
-       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m7": "Nisane",
        "hebrew-calendar-m8": "Iyar",
        "hebrew-calendar-m9": "Sivan",
        "hebrew-calendar-m10": "Tamuz",
        "version-libraries-description": "Opis",
        "version-libraries-authors": "Autori",
        "redirect": "Preusmjerenje na datoteku, korisnika, stranicu, izmjenu ili zapisnik",
-       "redirect-summary": "Ova posebna stranica preusmjerava na datoteku (datog imena), stranicu (date oznake izmjene) ili korisničku stranicu (datog numeričkog identifikatora korisnika). Oznake se koriste na sljedeći način: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ili [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Ova posebna stranica preusmjerava na datoteku (datog imena), stranicu (date oznake izmjene), korisničku stranicu (datog numeričkog identifikatora korisnika) ili unos u zapisniku (datog numeričkog identifikatora zapisnika). Oznake se koriste na sljedeći način: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] ili [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Idi",
        "redirect-lookup": "Tip vrijednosti:",
        "redirect-value": "Vrijednost:",
        "redirect-page": "ID stranice",
        "redirect-revision": "Verzija stranice",
        "redirect-file": "Naziv datoteke",
+       "redirect-logid": "ID unosa",
        "redirect-not-exists": "Vrijednost nije pronađena",
        "fileduplicatesearch": "Pretraga duplikata",
        "fileduplicatesearch-summary": "Pretraga za duplim datotekama na bazi njihove haš vrijednosti.",
        "tag-filter-submit": "Filter",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|oznaka|oznake}}]]: $2)",
        "tag-mw-contentmodelchange": "promjena modela sadržaja",
+       "tag-mw-contentmodelchange-description": "Izmjena kojom se [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel mijenja model sadržaja] stranice",
        "tags-title": "Oznake",
        "tags-intro": "Ova stranica prikazuje spisak oznaka koje softver može staviti na svaku izmjenu i njihovo značenje.",
        "tags-tag": "Naziv oznake",
        "tags-source-extension": "Definirano softverom",
        "tags-source-manual": "Ručno postavili korisnici ili botovi",
        "tags-source-none": "Više se ne koristi",
-       "tags-edit": "uređivanje",
+       "tags-edit": "uredi",
        "tags-delete": "obriši",
        "tags-activate": "aktiviraj",
        "tags-deactivate": "dekativiraj",
        "tags-deactivate-not-allowed": "Nije moguće deaktivirati oznaku \"$1\".",
        "tags-deactivate-submit": "Deaktiviraj",
        "tags-apply-no-permission": "Nemate dopuštenja da dodate izmjenske oznake zajedno s vašim promjenama.",
-       "tags-apply-not-allowed-one": "Oznaka \"$1\" se ne može ručno dodati.",
+       "tags-apply-blocked": "Ne možete primjenjivati oznake za promjenu uz svoje izmjene dok {{GENDER:$1|ste}} blokirani.",
+       "tags-apply-not-allowed-one": "Nije dozvoljeno da se oznaka \"$1\" ručno dodaje.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno doda|Sljedeće oznake ne dozvoljavaju da se ručno dodaju}}: $1",
        "tags-update-no-permission": "Nemate dopuštenje da dodate ili uklonite izmjenske oznake sa zasebnih verzija ili zapisničkih unosa.",
-       "tags-update-add-not-allowed-one": "Oznaka \"$1\" se ne može ručno dodati.",
+       "tags-update-blocked": "Ne možete dodavati niti uklanjati oznake za promjenu dok {{GENDER:$1|ste}} blokirani.",
+       "tags-update-add-not-allowed-one": "Nije dozvoljeno da se oznaka \"$1\" ručno dodaje.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno doda|Sljedeće oznake ne dozvoljavaju da se ručno dodaju}}: $1",
        "tags-update-remove-not-allowed-one": "Oznaka \"$1\" se ne može ručno ukloniti.",
        "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Sljedeća oznaka ne dozvoljava da se ručno ukloni|Sljedeće oznake ne dozvoljavaju da se ručno uklone}}: $1",
        "htmlform-user-not-valid": "<strong>$1</strong> nije ispravno korisničko ime.",
        "logentry-delete-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je stranicu $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|obrisao|obrisala}} je preusmjerenje $3 prepisivanjem",
-       "logentry-delete-restore": "$1 {{GENDER:$2|vratio|vratila}} je stranicu $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|vratio|vratila}} je stranicu $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|vratio|vratila}} je stranicu $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 izmjena|$1 izmjene|$1 izmjena}}",
+       "restore-count-files": "{{PLURAL:$1|1 datoteka|$1 datoteke|$1 datoteka}}",
        "logentry-delete-event": "$1 {{GENDER:$2|promijenio|promijenila}} je vidljivost {{PLURAL:$5|unosa|$5 unosa}} u zapisniku na $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|promijenio|promijenila}} je vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost događaja u evidenciji na $3",
        "revdelete-uname-unhid": "korisničko ime je otkriveno",
        "revdelete-restricted": "primijenjena ograničenja za administratore",
        "revdelete-unrestricted": "uklonjena ograničenja za administratore",
-       "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|deblokirao|deblokirala}} je {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke za blokiranje {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|ažurirao|ažurirala}} je oznake na verziji $4 strane $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|uklonjeno}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|ažurirao|ažurirala}} je oznake na zapisničkom unosu $5 strane $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|uklonjeno}} $8)",
        "rightsnone": "(nema)",
-       "revdelete-summary": "sažetak",
        "rightslogentry-temporary-group": "$1 (privremeno, do $2)",
        "feedback-adding": "Dodajem povratne informacije na stranicu...",
        "feedback-back": "Nazad",
        "feedback-bugcheck": "Odlično! Molimo provjerite da se ne radi o nekom [$1 poznatom \"bugu\"].",
        "feedback-bugnew": "Provjereno. Prijavi novu grešku",
        "feedback-bugornote": "Ako ste spremni detaljno opisati tehnički problem, molimo [$1 prijavite \"bug\" (grešku)].\nInače, možete ispuniti jednostavan obrazac ispod. Vaš komentar bit će dodan na stranicu \"[$3 $2]\" zajedno s Vašim korisničkim imenom.",
-       "feedback-cancel": "Odustani",
+       "feedback-cancel": "Otkaži",
        "feedback-close": "Završeno",
        "feedback-external-bug-report-button": "Podnesi tehnički zadatak",
        "feedback-dialog-title": "Pošalji povratne informacije",
        "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\"",
-       "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunde}}",
+       "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minute|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|sat|sata|sati}}",
        "duration-days": "$1 {{PLURAL:$1|dan|dana}}",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}",
        "limitreport-ppvisitednodes": "Broj predprocesiranih posjećenih nodova",
        "limitreport-ppgeneratednodes": "Broj predprocesiranih generiranih nodova",
-       "limitreport-postexpandincludesize": "Nakon proširenja navedi i veličinu",
+       "limitreport-postexpandincludesize": "Uključena veličina nakon proširenja",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
-       "limitreport-templateargumentsize": "Veličina stavke šablona",
+       "limitreport-templateargumentsize": "Veličina argumenata šablona",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
        "limitreport-expansiondepth": "Najveća dubina proširenja",
-       "limitreport-expensivefunctioncount": "Broj funkcije ekspenzivnog analizatora",
+       "limitreport-expensivefunctioncount": "Broj složenih funkcija raščlanjivača",
        "expandtemplates": "Proširi šablone",
        "expand_templates_intro": "Ova posebna stranica uzima neki tekst i proširuje sve šablone u njemu rekurzivno.\nOna također proširuje parserske funkcije poput\n<code><nowiki>{{</nowiki>#language:…}}</code> i varijable poput\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. U principu proširuje gotovo sve između dvostrukih zagrada.",
        "expand_templates_title": "Naslov konteksta, za {{FULLPAGENAME}} itd.:",
        "expand_templates_generate_xml": "Prikaži XML stablo parsera",
        "expand_templates_generate_rawhtml": "Pokaži izvorni HTML",
        "expand_templates_preview": "Pregled",
-       "expand_templates_preview_fail_html": "<em>Pošto stranica {{SITENAME}} ima uključen sirov HTML prikaz, te je bilo gubitka u podacima sesije, pregled je sakriven kao mjera predostrožnosti protiv JavaScript napada.</em>\n\n<strong>Ako je ovo ispravan pokušaj pretpregleda, molim da ponovo pokušate.</strong>\nAko i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]], pa ponovo prijaviti.",
+       "expand_templates_preview_fail_html": "<em>Budući da {{SITENAME}} ima uključen sirov HTML, te je bilo gubitka u podacima sesije, pregled je sakriven kao mjera predostrožnosti protiv napada preko JavaScripta.</em>\n\n<strong>Ako je ovo ispravan pokušaj pretpregleda, pokušajte ponovo.</strong>\nAko i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]], pa ponovo prijaviti i provjerite dozvoljava li Vaš preglednik kolačiće s ovog sajta.",
        "expand_templates_preview_fail_html_anon": "<em>Pošto stranica {{SITENAME}} ima uključen sirov HTML prikaz, a vi se niste prijavili, pregled je sakriven kao mjera predostrožnosti protiv JavaScript napada.</em>\n\n<strong>Ako je ovo ispravan pokušaj pretpregleda, molim da se [[Special:UserLogin|prijavite]] i pokušate ponovo.</strong>",
        "pagelanguage": "Promijeni jezik stranice",
        "pagelang-name": "Stranica",
        "json-error-inf-or-nan": "Jedna ili više NAN ili INF vrijednosti u iznosu koga treba enkodirati",
        "json-error-unsupported-type": "Data je vrijednost vrste koja se ne može enkodirati",
        "headline-anchor-title": "Veza do ovog odjeljka",
-       "special-characters-group-latin": "latinica",
-       "special-characters-group-latinextended": "proširena latinica",
+       "special-characters-group-latin": "Latinica",
+       "special-characters-group-latinextended": "Proširena latinica",
        "special-characters-group-ipa": "IPA",
-       "special-characters-group-symbols": "simboli",
-       "special-characters-group-greek": "grčki",
-       "special-characters-group-greekextended": "prošireni grčki",
-       "special-characters-group-cyrillic": "Ä\87irilica",
-       "special-characters-group-arabic": "arapski",
-       "special-characters-group-arabicextended": "prošireni arapski",
+       "special-characters-group-symbols": "Simboli",
+       "special-characters-group-greek": "Grčki",
+       "special-characters-group-greekextended": "Prošireni grčki",
+       "special-characters-group-cyrillic": "Ä\86irilica",
+       "special-characters-group-arabic": "Arapski",
+       "special-characters-group-arabicextended": "Prošireni arapski",
        "special-characters-group-persian": "Perzijski",
-       "special-characters-group-hebrew": "hebrejski",
-       "special-characters-group-bangla": "bengalski",
-       "special-characters-group-tamil": "tamilski",
-       "special-characters-group-telugu": "telugu",
-       "special-characters-group-sinhala": "sinhalski",
-       "special-characters-group-gujarati": "gudžarati",
-       "special-characters-group-devanagari": "devanagari",
-       "special-characters-group-thai": "tajlandski",
-       "special-characters-group-lao": "laoski",
-       "special-characters-group-khmer": "kmerski",
+       "special-characters-group-hebrew": "Hebrejski",
+       "special-characters-group-bangla": "Bengalski",
+       "special-characters-group-tamil": "Tamilski",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhalski",
+       "special-characters-group-gujarati": "Gudžarati",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Tajlandski",
+       "special-characters-group-lao": "Laoski",
+       "special-characters-group-khmer": "Kmerski",
+       "special-characters-group-canadianaboriginal": "Kanadski domorodni",
        "special-characters-title-endash": "crtica",
        "special-characters-title-emdash": "duga crta",
        "special-characters-title-minus": "minus",
        "mw-widgets-dateinput-no-date": "Nikakav datum nije izabran",
+       "mw-widgets-mediasearch-input-placeholder": "Pretraži multimediju",
        "mw-widgets-mediasearch-noresults": "Nema rezultata.",
        "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategoriju...",
        "mw-widgets-usersmultiselect-placeholder": "Dodaj više...",
+       "date-range-from": "Od datuma:",
+       "date-range-to": "Do datuma:",
        "sessionmanager-tie": "Ne možete istovremeno koristiti nekoliko vrsta provjera autentičnosti: $1.",
+       "sessionprovider-generic": "$1 sesije",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "sesije s kolačićima",
+       "sessionprovider-nocookies": "Moguće je da su kolačići isključeni. Ako je tako, uključite ih i počnite ponovo.",
        "randomrootpage": "Slučajna korijenska stranica",
        "log-action-filter-block": "Vrsta blokiranja:",
        "log-action-filter-contentmodel": "Vrsta izmjene modela sadržaja:",
        "log-action-filter-suppress-reblock": "Skrivanje korisnika ponovnim blokiranjem",
        "log-action-filter-upload-upload": "Nova datoteka",
        "log-action-filter-upload-overwrite": "Izmjena postojeće datoteke",
+       "authmanager-authn-not-in-progress": "Verifikacija nije u toku ili je došlo do gubitka podataka o sesiji. Počnite ispočetka.",
+       "authmanager-authn-no-primary": "Pruženi akreditivi ne mogu se verificirati.",
+       "authmanager-authn-no-local-user": "Pruženi akreditivi nisu povezani ni s jednim korisnikom na ovom wikiju.",
+       "authmanager-authn-no-local-user-link": "Pruženi su ispravni akreditivi, ali nisu povezani ni s jednim korisnikom na ovom wikiju. Prijavite se na neki drugi način ili napravite novi korisnički račun, što će Vam dati mogućnost da povežete prethodne akreditive na novi račun.",
+       "authmanager-authn-autocreate-failed": "Automatsko stvaranje lokalnog računa nije uspjelo: $1",
        "authmanager-create-disabled": "Onemogućeno pravljenje računa.",
        "authmanager-create-from-login": "Popunite polja da biste napravili račun.",
        "authmanager-create-not-in-progress": "Pravljenje računa nije u toku ili su podaci o sesiji izgubljeni. Počnite ispočetka.",
        "authmanager-autocreate-noperm": "Automatsko pravljenje računa nije dozvoljeno.",
        "authmanager-autocreate-exception": "Automatsko pravljenje računa privremeno je onemogućeno zbog prijašnjih greški.",
        "authmanager-userdoesnotexist": "Korisnički račun \"$1\" nije registriran.",
+       "authmanager-username-help": "Korisničko ime za verifikaciju.",
+       "authmanager-password-help": "Lozinka za verifikaciju.",
+       "authmanager-domain-help": "Domen za vanjsku verifikaciju.",
+       "authmanager-retype-help": "Ponovite lozinku (za potvrdu).",
+       "authmanager-email-label": "E-pošta",
        "authmanager-email-help": "Adresa e-pošte",
        "authmanager-realname-label": "Pravo ime",
        "authmanager-realname-help": "Korisnikovo pravo ime",
+       "authmanager-provider-password": "Verifikacija lozinkom",
+       "authmanager-provider-password-domain": "Verifikacija lozinkom i domenom",
        "authmanager-provider-temporarypassword": "Privremena lozinka",
+       "authprovider-confirmlink-request-label": "Računi koji se trebaju povezati",
+       "authprovider-confirmlink-success-line": "$1: Uspješno povezano.",
+       "authprovider-confirmlink-failed": "Povezivanje računa nije uspjelo u potpunosti: $1",
        "authprovider-resetpass-skip-label": "Preskoči",
+       "authprovider-resetpass-skip-help": "Preskoči resetiranje lozinke.",
+       "authform-nosession-login": "Verifikacija je uspješna, ali Vaš preglednik ne može \"zapamtiti\" da ste prijavljeni.\n\n$1",
+       "authform-nosession-signup": "Račun je napravljen, ali Vaš preglednik ne može \"zapamtiti\" da ste prijavljeni.\n\n$1",
+       "authform-wrongtoken": "Pogrešan žeton",
        "specialpage-securitylevel-not-allowed-title": "Nije dozvoljeno",
        "specialpage-securitylevel-not-allowed": "Žao nam je, nije Vam dozvoljeno korištenje ove stranice jer ne možemo potvrditi Vaš identitet.",
+       "authpage-cannot-login": "Ne mogu započeti prijavu.",
+       "authpage-cannot-login-continue": "Ne mogu nastaviti s prijavom. Najvjerovatnije Vam je istekla sesija.",
+       "authpage-cannot-create": "Ne mogu započeti stvaranje računa.",
+       "authpage-cannot-create-continue": "Ne mogu nastaviti s stvaranjem računa. Najvjerovatnije Vam je istekla sesija.",
+       "authpage-cannot-link": "Ne mogu započeti spajanje računa.",
+       "authpage-cannot-link-continue": "Ne mogu nastaviti sa spajanjem računa. Najvjerovatnije Vam je istekla sesija.",
        "cannotauth-not-allowed-title": "Pristup odbijen",
        "cannotauth-not-allowed": "Nije Vam dozvoljeno da koristite ovu stranicu",
        "changecredentials": "Promjena akreditiva",
        "changecredentials-submit": "Promijeni akreditive",
        "changecredentials-invalidsubpage": "$1 nije ispravna vrsta akreditiva.",
+       "changecredentials-success": "Vaši akreditivi su promijenjeni.",
+       "removecredentials": "Uklanjanje akreditiva",
+       "removecredentials-submit": "Ukloni akreditive",
+       "removecredentials-invalidsubpage": "$1 nije ispravna vrsta akreditiva.",
+       "removecredentials-success": "Vaši akreditivi su uklonjeni.",
+       "credentialsform-provider": "Vrsta akreditiva:",
        "credentialsform-account": "Naziv računa:",
        "cannotlink-no-provider-title": "Nema spojivih računa",
        "cannotlink-no-provider": "Nema spojivih računa.",
        "linkaccounts-submit": "Spoji račune",
        "unlinkaccounts": "Razdvajanje računa",
        "unlinkaccounts-success": "Račun je razdvojen.",
+       "userjsispublic": "Napomena: Podstranice s JavaScriptom ne bi trebale sadržavati povjerljive podatke budući da ih drugi korisnici mogu vidjeti.",
+       "usercssispublic": "Napomena: Podstranice s CSS-om ne bi trebale sadržavati povjerljive podatke budući da ih drugi korisnici mogu vidjeti.",
        "restrictionsfield-badip": "Neispravna IP-adresa ili opseg: $1",
        "restrictionsfield-label": "Dozvoljeni IP-opsezi:",
        "revid": "izmjena $1",
-       "pageid": "ID stranice $1"
+       "pageid": "ID stranice $1",
+       "rawhtml-notallowed": "&lt;html&gt; oznake ne mogu se koristiti van normalnih stranica.",
+       "gotointerwiki": "Napuštate {{GRAMMAR:akuzativ|{{SITENAME}}}}",
+       "gotointerwiki-invalid": "Navedeni naslov nije ispravan.",
+       "gotointerwiki-external": "Napuštate {{GRAMMAR:akuzativ|{{SITENAME}}}} da biste posjetili zasebni veb-sajt [[$2]].\n\n<strong>[$1 Idi na $1]</strong>",
+       "undelete-cantedit": "Ne možete vratiti ovu stranicu jer Vam nije dozvoljeno da je uređujete."
 }
index 8171411..97f68c2 100644 (file)
@@ -55,7 +55,8 @@
                        "KRLS",
                        "Jaumeortola",
                        "Kippelboy",
-                       "Syum90"
+                       "Syum90",
+                       "Xð"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "unprotectthispage": "Desprotegeix aquesta pàgina",
        "newpage": "Pàgina nova",
        "talkpage": "Discussió",
-       "talkpagelinktext": "Discussió",
+       "talkpagelinktext": "discussió",
        "specialpage": "Pàgina especial",
        "personaltools": "Eines de l'usuari",
        "articlepage": "Mostra la pàgina",
        "redirectedfrom": "(S'ha redirigit des de: $1)",
        "redirectpagesub": "Pàgina de redirecció",
        "redirectto": "Redirigeix a:",
-       "lastmodifiedat": "Darrera modificació de la pàgina: $1 a les $2.",
+       "lastmodifiedat": "La pàgina va ser modificada per darrera vegada el $1 a les $2.",
        "viewcount": "S'ha visitat aquesta pàgina {{PLURAL:$1|una vegada|$1 vegades}}.",
        "protectedpage": "Pàgina protegida",
        "jumpto": "Dreceres ràpides:",
        "login": "Inici de sessió",
        "login-security": "Verificació de la identitat",
        "nav-login-createaccount": "Inicia una sessió / crea un compte",
-       "userlogin": "Inicia una sessió / crea un compte",
-       "userloginnocreate": "Inici de sessió",
        "logout": "Finalitza la sessió",
        "userlogout": "Finalitza la sessió",
        "notloggedin": "Sense sessió iniciada",
        "userlogin-noaccount": "No teniu cap compte?",
        "userlogin-joinproject": "Uniu-vos a {{SITENAME}}",
-       "nologin": "No teniu un compte? '''$1'''.",
-       "nologinlink": "Crea un compte",
        "createaccount": "Crea un compte",
-       "gotaccount": "Ja teniu un compte? $1.",
-       "gotaccountlink": "Inicia una sessió",
-       "userlogin-resetlink": "Heu oblidat les vostres dades d'accés?",
        "userlogin-resetpassword-link": "Heu oblidat la contrasenya?",
        "userlogin-helplink2": "Ajuda amb el registre",
        "userlogin-loggedin": "Heu iniciat una sessió com {{GENDER:$1|$1}}.\nFeu servir el formulari de sota per iniciar la sessió com un altre usuari.",
        "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",
        "createacct-reason-ph": "Per què creeu un altre compte",
        "createacct-reason-help": "Missatge mostrat en el registre de creació de comptes",
        "changepassword-success": "S'ha canviat la vostra contrasenya!",
        "changepassword-throttled": "Heu realitzat massa intents d'inici de sessió.\nEspereu $1 abans de tornar-ho a provar.",
        "botpasswords": "Contrasenyes de bot",
+       "botpasswords-summary": "Les <em>contrasenyes de bot</em> permeten accedir a un compte d'usuari a través de l'API sense utilitzar les credencials de sessió principals del compte. Els permisos d'usuari disponibles quan s'ha iniciat una sessió amb una contrasenya de bot poden estar restringits.\n\nSi no sabeu perquè ho hauríeu de menester, segurament no us cal. Ningú mai no us hauria de demanar que genereu una contrasenya o l'hi doneu.",
        "botpasswords-disabled": "S'han inhabilitat les contrasenyes dels bots",
        "botpasswords-no-central-id": "Per a utilitzar contrasenyes de bots heu d'haver iniciat una sessió en un compte centralitzat.",
        "botpasswords-existing": "Contrasenyes de bot existents",
        "preview": "Previsualització",
        "showpreview": "Mostra una previsualització",
        "showdiff": "Mostra els canvis",
-       "blankarticle": "<strong>Avís:</strong> La pàgina que esteu creant és en blanc.\nSi feu clic a «{{int:savearticle}}» un altre cop, la pàgina es crearà sense cap contingut.",
+       "blankarticle": "<strong>Avís:</strong> La pàgina que esteu creant és en blanc.\nSi feu clic a «$1» un altre cop, la pàgina es crearà sense cap contingut.",
        "anoneditwarning": "<strong>Avís</strong>: No heu iniciat cap sessió. Per tant, la vostra adreça IP serà visible públicament si feu qualsevol modificació. Si <strong>[$1 inicieu una sessió]</strong> o <strong>[$2 creeu un compte]</strong>, les vostres edicions s'atribuiran al vostre nom d'usuari, juntament amb altres beneficis.",
        "anonpreviewwarning": "''No us heu identificat amb un compte d'usuari. La vostra adreça IP quedarà registrada a l'historial d'aquesta pàgina.''",
        "missingsummary": "'''Recordatori''': Heu deixat en blanc el resum de l'edició. Si torneu a clicar al botó de desar, l'edició es guardarà sense resum.",
-       "selfredirect": "<strong>Avís:</strong> Esteu redirigint la pàgina a si mateixa.\nPodeu haver especificat un objectiu erroni per a la redirecció, o potser esteu modificant una pàgina incorrecta.\nSi feu clic a «{{int:savearticle}}» una vegada més, la redirecció es crearà de totes maneres.",
+       "selfredirect": "<strong>Avís:</strong> Esteu redirigint la pàgina a si mateixa.\nPodeu haver especificat un objectiu erroni per a la redirecció, o potser esteu modificant una pàgina incorrecta.\nSi feu clic a «$1» una vegada més, la redirecció es crearà de totes maneres.",
        "missingcommenttext": "Introduïu un comentari a continuació.",
-       "missingcommentheader": "<strong>Recordatori:</strong> no heu proporcionat un assumpte/encapçalament per al comentari.\nSi feu clic de nou al botó «{{int:savearticle}}», la vostra contribució es desarà sense cap.",
-       "summary-preview": "Previsualització del resum:",
+       "missingcommentheader": "<strong>Recordatori:</strong> no heu proporcionat un assumpte/encapçalament per al comentari.\nSi feu clic de nou al botó «$1», la vostra contribució es desarà sense cap.",
+       "summary-preview": "Previsualització del resum de modificació:",
        "subject-preview": "Previsualització de l’assumpte:",
        "previewerrortext": "S'ha produït un error quan es provava de previsualitzar els canvis.",
        "blockedtitle": "L'usuari està blocat",
        "editingsection": "Edició de la pàgina «$1» (secció)",
        "editingcomment": "Edició de la pàgina «$1» (secció nova)",
        "editconflict": "Conflicte d'edició: $1",
-       "explainconflict": "Algú més ha canviat aquesta pàgina des que l'heu editada.\nL'àrea de text superior conté el text de la pàgina com existeix actualment.\nEls vostres canvis es mostren en l'àrea de text inferior.\nHaureu de fusionar els vostres canvis en el text existent.\n'''Només''' el text de l'àrea superior es desarà quan premeu el botó «{{int:savearticle}}».",
+       "explainconflict": "Algú més ha canviat aquesta pàgina des que l'heu editada.\nL'àrea de text superior conté el text de la pàgina com existeix actualment.\nEls vostres canvis es mostren en l'àrea de text inferior.\nHaureu de fusionar els vostres canvis en el text existent.\n'''Només''' el text de l'àrea superior es desarà quan premeu el botó «$1».",
        "yourtext": "El vostre text",
        "storedversion": "Versió emmagatzemada",
        "nonunicodebrowser": "<strong>Alerta: El vostre navegador no és compatible amb Unicode.</strong>\nS'ha activat una alternativa que us permetrà modificar pàgines amb seguretat: els caràcters que no són ASCII us apareixeran en la caixa d'edició com a codis hexadecimals.",
        "post-expand-template-argument-warning": "Avís: Aquesta pàgina conté com a mínim un argument de plantilla que té una mida d'expansió massa gran.\nSe n'han omès els arguments.",
        "post-expand-template-argument-category": "Pàgines que contenen arguments de plantilla que s'han omès",
        "parser-template-loop-warning": "S'ha detectat un bucle de plantilla: [[$1]]",
+       "template-loop-category": "Pàgines amb bucles de plantilla",
        "parser-template-recursion-depth-warning": "S'ha excedit el límit de recursivitat de plantilles ($1)",
        "language-converter-depth-warning": "S'ha excedit el límit de profunditat del convertidor d'idiomes ($1)",
        "node-count-exceeded-category": "Pàgines on s'ha excedit el recompte de nodes",
        "page_first": "primera",
        "page_last": "última",
        "histlegend": "Simbologia: (act) = diferència amb la versió actual,\n(prev) = diferència amb la versió anterior, m = modificació menor",
-       "history-fieldset-title": "Cerca a l'historial",
-       "history-show-deleted": "Només esborrats",
+       "history-fieldset-title": "Cerca revisions",
+       "history-show-deleted": "Només revisions esborrades",
        "histfirst": "més antigues",
        "histlast": "més noves",
        "historysize": "({{PLURAL:$1|1 octet|$1 octets}})",
        "prefs-help-prefershttps": "Aquesta preferència tindrà efecte quan inicieu una nova sessió.",
        "prefswarning-warning": "Heu fet canvis a les preferències que encara no s'han desat.\nSi abandoneu la pàgina sense fer clic a «$1», les preferències no s'actualitzaran.",
        "prefs-tabs-navigation-hint": "Consell: Podeu utilitzar les tecles de cursor de dreta i esquerra per a navegar entre les pestanyes.",
-       "userrights": "Gestió dels permisos d’usuari",
+       "userrights": "Permisos d'usuari",
        "userrights-lookup-user": "Seleccioneu un usuari",
        "userrights-user-editname": "Introduïu un nom d'usuari:",
        "editusergroup": "Carrega els grups d'usuari",
        "userrights-groupsmember": "Membre de:",
        "userrights-groupsmember-auto": "Membre implícit de:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "Podeu modificar els grups als quals pertany {{GENDER:$1|aquest usuari|aquesta usuària}}.\n* Una casella marcada significa que {{GENDER:$1|l’usuari|la usuària}} pertany a aquest grup.\n* Una casella no marcada significa que {{GENDER:$1|l’usuari|la usuària}} no pertany a aquest grup.\n* Un asterisc (*) indica que no {{GENDER:$1|el|la}} podreu treure del grup una vegada l'hàgiu afegit o viceversa.",
+       "userrights-groups-help": "Podeu modificar els grups als quals pertany {{GENDER:$1|aquest usuari|aquesta usuària}}.\n* Una casella marcada significa que {{GENDER:$1|l’usuari|la usuària}} pertany a aquest grup.\n* Una casella no marcada significa que {{GENDER:$1|l’usuari|la usuària}} no pertany a aquest grup.\n* Un asterisc (*) indica que no {{GENDER:$1|el|la}} podreu treure del grup una vegada l'hàgiu afegit o viceversa.\n* Un coixinet (#) indica que només podeu retardar la data d'expiració d'aquest grup i que no la podeu avançar.",
        "userrights-reason": "Motiu:",
        "userrights-no-interwiki": "No teniu permisos per a editar els permisos d'usuari d'altres wikis.",
        "userrights-nodatabase": "La base de dades $1 no existeix o no és local.",
        "userrights-expiry-existing": "Temps de venciment actual: $3, $2",
        "userrights-expiry-othertime": "Altre temps:",
        "userrights-expiry-options": "1 dia:1 day,1 setmana:1 week,1 mes:1 month,3 mesos:3 months,6 mesos:6 months,1 any:1 year",
+       "userrights-invalid-expiry": "La data d'expiració per al grup «$1» no és vàlida.",
        "userrights-conflict": "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
        "group": "Grup:",
        "group-user": "Usuaris",
        "right-editsemiprotected": "Edita les pàgines protegides com «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "Editar el model de contingut d'una pàgina",
        "right-editinterface": "Editar la interfície d'usuari",
-       "right-editusercssjs": "Modificar els fitxers CSS i JavaScript d'altres usuaris",
        "right-editusercss": "Modificar els fitxers CSS d'altres usuaris",
        "right-edituserjs": "Modificar els fitxers JavaScript d'altres usuaris",
        "right-editmyusercss": "Modificar els vostres fitxers d'usuari CSS",
        "rcfilters-invalid-filter": "Filtre no vàlid",
        "rcfilters-empty-filter": "No hi ha cap filtre actiu. Es mostren totes les contribucions.",
        "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filterlist-whatsthis": "Què és això?",
+       "rcfilters-highlightbutton-title": "Ressalta els resultats",
+       "rcfilters-highlightmenu-title": "Selecciona un color",
+       "rcfilters-highlightmenu-help": "Seleccioneu un color per ressaltar la propietat",
        "rcfilters-filterlist-noresults": "No s'ha trobat cap filtre",
+       "rcfilters-noresults-conflict": "No s'ha trobat cap resultat perquè els criteris de cerca són en conflicte",
+       "rcfilters-state-message-fullcoverage": "Seleccionant tots els filtres en un grup és el mateix que no seleccionar-ne cap, de manera que aquest filtre no té cap efecte. El grup inclou: $1",
        "rcfilters-filtergroup-registration": "Registre d'usuari",
        "rcfilters-filter-registered-label": "Registrats",
        "rcfilters-filter-registered-description": "Editors que han iniciat sessió",
        "rcfilters-filter-unregistered-label": "No registrats",
        "rcfilters-filter-unregistered-description": "Editors que no han iniciat una sessió.",
-       "rcfilters-filtergroup-authorship": "Modifica l'autoria",
+       "rcfilters-filtergroup-authorship": "Autoria de les contribucions",
        "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-filter-editsbyself-description": "Les vostres pròpies contribucions.",
+       "rcfilters-filter-editsbyother-label": "Canvis d'altres",
+       "rcfilters-filter-editsbyother-description": "Tots els canvis excepte els vostres.",
        "rcfilters-filtergroup-userExpLevel": "Nivell d'experiència (només per a usuaris registrats)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Novells",
-       "rcfilters-filter-userExpLevel-newcomer-description": "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.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novells",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Menys de 10 edicions i 4 dies d'activitat.",
+       "rcfilters-filter-user-experience-level-learner-label": "Aprenents",
+       "rcfilters-filter-user-experience-level-learner-description": "Més dies d'activitat i més edicions que els 'novells' però menys que els 'usuaris experimentats'.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Usuaris experimentats",
+       "rcfilters-filter-user-experience-level-experienced-description": "Més de 30 dies d'activitat i més de 500 edicions.",
        "rcfilters-filtergroup-automated": "Contribucions automatitzades",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Modificacions fetes per eines automatitzades.",
        "rcfilters-filter-humans-label": "Humà (no bot)",
        "rcfilters-filter-humans-description": "Modificacions fetes per editors humans.",
+       "rcfilters-filtergroup-reviewstatus": "Estat de revisió",
+       "rcfilters-filter-patrolled-label": "Patrullat",
+       "rcfilters-filter-patrolled-description": "Modificacions marcades com a patrullades.",
+       "rcfilters-filter-unpatrolled-label": "No patrullat",
+       "rcfilters-filter-unpatrolled-description": "Modificacions no marcades com a patrullades.",
        "rcfilters-filtergroup-significance": "Significació",
        "rcfilters-filter-minor-label": "Modificacions menors",
        "rcfilters-filter-minor-description": "Modificacions que l'autor va etiquetar com a menors.",
        "rcfilters-filter-categorization-label": "Canvis de categoria",
        "rcfilters-filter-categorization-description": "Registres de pàgines afegides o suprimides de les categories.",
        "rcfilters-filter-logactions-label": "Accions registrades",
+       "rcfilters-filter-logactions-description": "Accions administratives, creacions de comptes, eliminacions de pàgines, càrregues...",
        "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",
        "rcshowhidecategorization": "$1 categoritzacions de pàgina",
        "rcshowhidecategorization-show": "Mostra",
        "rcshowhidecategorization-hide": "Amaga",
-       "rclinks": "Mostra els darrers $1 canvis en els darrers $2 dies<br />$3",
+       "rclinks": "Mostra els darrers $1 canvis dels darrers $2 dies",
        "diff": "dif",
        "hist": "hist",
        "hide": "Amaga",
        "upload-too-many-redirects": "L'URL conté massa redireccions",
        "upload-http-error": "Ha ocorregut un error HTTP: $1",
        "upload-copy-upload-invalid-domain": "Les càrregues de còpia no són disponibles des d'aquest domini.",
+       "upload-foreign-cant-upload": "Aquest wiki no està configurat per pujar fitxers al repositori extern sol·licitat.",
        "upload-dialog-disabled": "La càrrega de fitxers utilitzant aquest quadre de diàleg està desactivada en aquest wiki.",
        "upload-dialog-title": "Carrega un fitxer",
        "upload-dialog-button-cancel": "Cancel·la",
        "unusedimages": "Fitxers no utilitzats",
        "wantedcategories": "Categories demanades",
        "wantedpages": "Pàgines demanades",
+       "wantedpages-summary": "Llista de pàgines no existents amb el major nombre d'enllaços cap a elles, excloent-ne les pàgines que només hi enllacen amb redireccions. Per a una llista de pàgines no existents que tenen redireccions que hi enllacen, vegeu la [[{{#special:BrokenRedirects}}|llista de redireccions trencades]].",
        "wantedpages-badtitle": "Títol invàlid al conjunt de resultats: $1",
        "wantedfiles": "Fitxers demanats",
        "wantedfiletext-cat": "Els fitxers següents s'utilitzen per no existeixen. Els fitxers de repositoris aliens poden ser llistats encara que existeixin. Aquells que siguin fals positius es <del>ratllaran</del>. A més, les pàgines que tinguin fitxers incrustats que no existeixin es llistaran a [[:$1]].",
        "apisandbox-reset": "Neteja",
        "apisandbox-retry": "Torna a provar",
        "apisandbox-loading": "S'està carregant la informació del mòdul d'API «$1»...",
+       "apisandbox-no-parameters": "Aquest mòdul API no té paràmetres.",
        "apisandbox-helpurls": "Enllaços d'ajuda",
        "apisandbox-examples": "Exemples",
        "apisandbox-dynamic-parameters": "Paràmetres adicionals",
        "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-selectformat-label": "Mostra les dades de sol·licitud com:",
+       "apisandbox-request-format-url-label": "Cadena de consulta de l'URL",
        "apisandbox-request-url-label": "Sol·licita URL:",
        "apisandbox-request-json-label": "JSON de sol·licitud:",
        "apisandbox-request-time": "Temps de sol·licitud: {{PLURAL:$1|$1 ms}}",
        "editcomment": "El resum d'edició és: <em>$1</em>.",
        "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": "Revertides les edicions de {{GENDER:$3|$1}}; recuperant la darrera versió de {{GENDER:$4|$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.",
        "undeleteviewlink": "veure",
        "undeleteinvert": "Invertir selecció",
        "undeletecomment": "Motiu:",
-       "undeletedrevisions": "{{PLURAL:$1|Una revisió restaurada|$1 revisions restaurades}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Una revisió|$1 revisions}} i {{PLURAL:$2|un fitxer|$2 fitxers}} restaurats",
-       "undeletedfiles": "$1 {{PLURAL:$1|fitxer restaurat|fitxers restaurats}}",
-       "cannotundelete": "Hi ha hagut un error en el procés de restauració:\n$1",
+       "cannotundelete": "Hi ha hagut un error en algunes o totes les restauracions:\n$1",
        "undeletedpage": "'''S'ha restaurat «$1»'''\n\nConsulteu el [[Special:Log/delete|registre d'esborraments]] per a veure els esborraments i els restauraments més recents.",
        "undelete-header": "Vegeu [[Special:Log/delete|el registre d'eliminació]] per a veure les pàgines eliminades recentment.",
        "undelete-search-title": "Cerca de pàgines esborrades",
        "sp-contributions-uploads": "càrregues",
        "sp-contributions-logs": "registres",
        "sp-contributions-talk": "discussió",
-       "sp-contributions-userrights": "gestió de drets d'usuari",
+       "sp-contributions-userrights": "gestió de drets d'{{GENDER:$1|usuari|usuària}}",
        "sp-contributions-blocked-notice": "En aquests moments aquest compte d'usuari està blocat.\nPer a més informació, a continuació es mostra l'última entrada del registre:",
        "sp-contributions-blocked-notice-anon": "En aquests moments, aquesta adreça IP es troba blocada.\nPer més detalls, l'última entrada del registre es mostra a continuació:",
        "sp-contributions-search": "Cerca les contribucions",
        "unblocked-id": "S'ha eliminat el bloqueig de $1",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] ha estat desbloquejat.",
        "blocklist": "Usuaris blocats",
+       "autoblocklist-submit": "Cerca",
        "ipblocklist": "Usuaris blocats",
        "ipblocklist-legend": "Cerca un usuari blocat",
        "blocklist-userblocks": "Amaga bloquejos de compte",
        "unblock-hideuser": "No podeu desblocar aquest usuari, perquè el seu nom d'usuari està ocult.",
        "ipb_cant_unblock": "Errada: No s'ha trobat el núm. ID de bloqueig $1. És possible que ja s'haguera desblocat.",
        "ipb_blocked_as_range": "Error: L'adreça IP $1 no està blocada directament i per tant no pot ésser desbloquejada. Ara bé, sí que ho està per formar part del rang $2 que sí que pot ser desblocat.",
-       "ip_range_invalid": "Rang d'IP no vàlid.",
+       "ip_range_invalid": "L’interval d’adreces IP no és vàlid.",
        "ip_range_toolarge": "No són permesos els bloquejos de rangs més grans que /$1.",
        "proxyblocker": "Bloqueig de proxy",
        "proxyblockreason": "S'ha blocat la vostra adreça IP perquè és un proxy obert. Contactau el vostre proveïdor d'Internet o servei tècnic i informau-los d'aquest seriós problema de seguretat.",
        "sorbsreason": "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert dins la llista negra de DNS que fa servir el projecte {{SITENAME}}.",
        "sorbs_create_account_reason": "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert a la llista negra de DNS que utilitza el projecte {{SITENAME}}. No podeu crear-vos-hi un compte",
+       "softblockrangesreason": "Les aportacions anònimes no són admeses des de la vostra adreça IP ($1). Inicieu una sessió.",
        "xffblockreason": "Una adreça IP present en la capçalera X-Forwarded-For, sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1",
        "cant-see-hidden-user": "L'usuari que esteu intentant blocar ja ha estat blocat i ocultat. Com que no teniu el permís hideuser no podeu veure ni modificar el seu blocatge.",
        "ipbblocked": "No podeu blocar o desblocar altres usuaris, perquè vós {{GENDER:|mateix|mateixa|mateix}} esteu {{GENDER:|blocat|blocada|blocat}}.",
        "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": "Model de contingut de la pàgina",
        "pageinfo-content-model-change": "canvia",
        "pageinfo-robot-policy": "Indexació per robots",
        "pageinfo-robot-index": "Permès",
        "svg-long-error": "El fitxer SVG no és vàlid: $1",
        "show-big-image": "Fitxer original",
        "show-big-image-preview": "Mida d'aquesta previsualització: $1.",
+       "show-big-image-preview-differ": "Mida d'aquesta previsualització $3 del fitxer $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Altra resolució|Altres resolucions}}: $1.",
        "show-big-image-size": "$1 × $2 píxels",
        "file-info-gif-looped": "en bucle",
        "newimages-summary": "Aquesta pàgina especial mostra els darrers fitxers carregats.",
        "newimages-legend": "Nom del fitxer",
        "newimages-label": "Nom de fitxer (o part d'ell):",
+       "newimages-user": "Adreça IP o nom d'usuari",
        "newimages-showbots": "Mostra les càrregues dels bots",
        "newimages-hidepatrolled": "Amaga les càrregues patrullades",
        "noimages": "Res per veure.",
        "invalidateemail": "Cancel·lació d'adreça electrònica",
        "notificationemail_subject_changed": "L'adreça registrada de {{SITENAME}} ha canviat",
        "notificationemail_subject_removed": "L'adreça registrada de {{SITENAME}} ha estat suprimida",
+       "notificationemail_body_changed": "Algú des de l'adreça IP $1, probablement vós, ha canviat l'adreça de correu electrònic del compte a {{SITENAME}} de «$2» a «$3».\n\nSi no heu estat vós mateix, contacteu immediatament amb un administrador del lloc.",
+       "notificationemail_body_removed": "Algú des de l'adreça IP $1, probablement vós, ha eliminat l'adreça de correu electrònic «$2» del compte a {{SITENAME}}.\n\nSi no heu estat vós mateix, contacteu immediatament amb un administrador del lloc.",
        "scarytranscludedisabled": "[S'ha inhabilitat la transclusió interwiki]",
        "scarytranscludefailed": "[Ha fallat la recuperació de la plantilla per a $1]",
        "scarytranscludefailed-httpstatus": "[Ha fallat la recuperació de la plantilla per a $1: HTTP $2]",
        "scarytranscludetoolong": "[L'URL és massa llarg]",
        "deletedwhileediting": "'''Avís''': S'ha eliminat aquesta pàgina després que haguéssiu començat a modificar-la!",
-       "confirmrecreate": "L'usuari [[User:$1|$1]] ([[User talk:$1|discussió]]) va eliminar aquesta pàgina que havíeu creat donant-ne el següent motiu:\n: ''$2''\nConfirmeu que realment voleu tornar-la a crear.",
-       "confirmrecreate-noreason": "L'{{GENDER:$1|usuari|usuària}} [[User:$1|$1]] ([[User talk:$1|discussió]]) va esborrar aquesta pàgina després que la comencéssiu a modificar. Si us plau, confirmeu que realment voleu tornar-la a crear.",
+       "confirmrecreate": "{{GENDER:$1|L'usuari|La usuària}} [[User:$1|$1]] ([[User talk:$1|discussió]]) va eliminar aquesta pàgina que havíeu creat donant-ne el següent motiu:\n: <em>$2</em>\nConfirmeu que realment voleu tornar-la a crear.",
+       "confirmrecreate-noreason": "{{GENDER:$1|L'usuari|La usuària}} [[User:$1|$1]] ([[User talk:$1|discussió]]) va esborrar aquesta pàgina després que la comencéssiu a modificar. Confirmeu que realment voleu tornar-la a crear.",
        "recreate": "Torna a crear",
+       "confirm-purge-title": "Purga la pàgina",
        "confirm_purge_button": "D'acord",
        "confirm-purge-top": "Voleu buidar la memòria cau d'aquesta pàgina?",
        "confirm-purge-bottom": "En refrescar una pàgina es neteja de la memòria cau i es força que hi aparegui la versió més actual.",
        "timezone-local": "Local",
        "duplicate-defaultsort": "Atenció: La clau d'ordenació per defecte \"$2\" invalida l'anterior clau \"$1\".",
        "duplicate-displaytitle": "<strong>Avís:</strong> El títol a mostrar «$2» sobreescriu l'anterior títol a mostrar «$1».",
+       "restricted-displaytitle": "<strong>Avís:</strong> El títol a mostrar «$1» ha estat ignorat ja que no és equivalent al títol real de la pàgina.",
        "invalid-indicator-name": "<strong>Error:</strong> No pot estar buit l'atribut <code>name</code> dels indicadors d'estat de la pàgina.",
        "version": "Versió",
        "version-extensions": "Extensions instal·lades",
        "version-libraries-license": "Llicència",
        "version-libraries-description": "Descripció",
        "version-libraries-authors": "Autors",
-       "redirect": "Redirigeix per fitxer, usuari, pàgina o ID de la revisió",
-       "redirect-summary": "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), una pàgina (donats un ID de la revisió o un ID de pàgina), o a una pàgina d'usuari (donat un ID numèric d'usuari). Ús: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect": "Redirigeix per identificador de fitxer, usuari, pàgina, revisió o registre",
+       "redirect-summary": "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), a una pàgina (donats un ID de la revisió o un ID de pàgina), a una pàgina d'usuari (donat un ID numèric d'usuari) o a una entrada de registre (donat l'ID de registre). Ús: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] o [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Vés-hi",
        "redirect-lookup": "Consulta:",
        "redirect-value": "Valor:",
        "tags-delete-not-allowed": "Les etiquetes definides per una extensió no es poden esborrar tret que l'extensió ho permeti específicament.",
        "tags-delete-not-found": "L'etiqueta «$1» no existeix.",
        "tags-delete-too-many-uses": "L'etiqueta «$1» s'aplica a més {{PLURAL:$2|d'$2 revisió|de $2 revisions}} i, per tant, no pot eliminar-se.",
-       "tags-delete-warnings-after-delete": "L'etiqueta \"$1\" ha estat esborrada satisfactòriament, però {{PLURAL:$2|s'ha registrat l'advertència següent|s'han registrat les advertències següents}}:",
+       "tags-delete-warnings-after-delete": "L'etiqueta «$1» ha estat esborrada, però {{PLURAL:$2|s'ha registrat l'advertència següent|s'han registrat les advertències següents}}:",
+       "tags-delete-no-permission": "No teniu permisos per a eliminar les etiquetes de canvis.",
        "tags-activate-title": "Activa l'etiqueta",
        "tags-activate-question": "Esteu a punt d'activar l'etiqueta «$1».",
        "tags-activate-reason": "Motiu:",
        "tags-deactivate-not-allowed": "No és possible desactivar l'etiqueta «$1».",
        "tags-deactivate-submit": "Desactiva",
        "tags-apply-no-permission": "No teniu permís per canviar etiquetes juntament amb altres canvis.",
+       "tags-apply-blocked": "No podeu aplicar etiquetes de canvis amb els vostres canvis mentre estigueu {{GENDER:$1|blocat|blocada}}.",
        "tags-apply-not-allowed-one": "No es permet aplicar l'etiqueta «$1» manualment.",
        "tags-apply-not-allowed-multi": "No es permet aplicar manualment {{PLURAL:$2|l'etiqueta següent|les etiquetes següents}}: $1",
        "tags-update-no-permission": "No teniu permisos per a afegir o suprimir etiquetes de canvi de revisions individuals o entrades de registre.",
+       "tags-update-blocked": "No podeu afegir o suprimir etiquetes de canvis mentre estigueu {{GENDER:$1|blocat|blocada}}.",
        "tags-update-add-not-allowed-one": "No es permet afegir manualment l'etiqueta «$1».",
        "tags-update-add-not-allowed-multi": "No es permet afegir manualment {{PLURAL:$2|l'etiqueta següent|les etiquetes següents}}: $1",
        "tags-update-remove-not-allowed-one": "No es permet treure l’etiqueta «$1».",
        "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-restore": "$1 {{GENDER:$2|ha restaurat}} la pàgina $3 ($4)",
        "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-delete-event-legacy": "$1 {{GENDER:$2|ha canviat}} la visibilitat d'esdeveniments al registre de $3",
        "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",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ha canviat}} el nivell de protecció de $3 $4 [en cascada]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3 de $4 a $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per {{GENDER:$6|$3}} de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3",
        "logentry-rights-autopromote": "$1 ha estat {{GENDER:$2|promogut}} automàticament de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ha carregat}} $3",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|ha desactivat}} l'etiqueta \"$4\" per a ser utilitzada en usuaris i bots",
        "log-name-tag": "Registre d'etiquetes",
        "rightsnone": "(cap)",
-       "revdelete-summary": "el resum d'edició",
+       "rightslogentry-temporary-group": "$1 (temporal, fins a $2)",
        "feedback-adding": "S'està afegint el comentari a la pàgina...",
        "feedback-back": "Enrere",
        "feedback-bugcheck": "Fantàstic! Comproveu que no sigui un dels [$1 problemes ja coneguts].",
        "api-error-emptypage": "No es permet la creació de pàgines noves en blanc.",
        "api-error-publishfailed": "Error intern: el servidor no ha pogut publicar el fitxer temporal.",
        "api-error-stashfailed": "Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.",
-       "api-error-unknown-warning": "Avís desconegut: $1",
+       "api-error-unknown-warning": "Avís desconegut: «$1».",
        "api-error-unknownerror": "Error desconegut: «$1».",
        "duration-seconds": "$1 {{PLURAL:$1|segon|segons}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuts}}",
        "log-name-pagelang": "Registre de canvi de llengua",
        "log-description-pagelang": "Aquest és un registre dels canvis en les llengües de les pàgines.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha canviat}} la llengua de $3 de $4 a $5",
-       "default-skin-not-found": "Òndia! L'aparença per defecte per al wiki, definit en <code dir=\"ltr\">$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nLa vostra instal·lació sembla que inclou les següents aparences. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuració d'aparences] per a la informació de com habilitar-les i triar-ne el valor per defecte.\n\n$2\n\n; Si heu acabat d'instal·lar MediaWiki:\n: Probablement l'instal·làveu des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Intenteu instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org], per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador tarball], que ve amb diverses aparences i ampliacions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Clonar un dels repositoris <code>mediawiki/skins/*</code> a través de git en el directori <code dir=\"ltr\">skins/</code> de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre dipòsit git si sou un desenvolupador de MediaWiki.\n\n; Si només heu actualitzat MediaWiki:\n: Per MediaWiki 1.24 i posteriors ja no permet aparences instal·lades automàticament (consulteu [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Aparences autodiscovery]). Podeu enganxar les línies següents en <code>LocalSettings.php</code> per permetre totes les aparences instal·lades actualment:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si només heu modificat <code>LocalSettings.php</code>:\n: Reviseu els noms de l'aparença per errors tipogràfics.",
-       "default-skin-not-found-no-skins": "Òndia! L'aparença per defecte pel vostre wiki, definida a <code>$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nNo teniu cap aparença instal·lada.\n\n\n; Si heu acabat d'instal·lar o actualitzar MediaWiki:\n: Probablement l'heu instal·lat des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Per MediaWiki 1.24 i posteriors ja no s'inclouen aparences en el repositori principal. Proveu d'instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org] per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador ''tarball''], que ve amb diverses aparences i extensions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Clonar un dels repositoris <code>mediawiki/skins/*</code> a través de git en el directori <code dir=\"ltr\">skins/</code> de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre repositori de git si sou un desenvolupador de MediaWiki. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] per a més informació sobre com permetre aparences i triar-ne per defecte.",
+       "default-skin-not-found": "Vaja! L'aparença per defecte per al wiki, definit en <code dir=\"ltr\">$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nLa vostra instal·lació sembla que inclou {{PLURAL:$4|la següent aparença|les següents aparences}}. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuració d'aparences] per a la informació de com habilitar-{{PLURAL:$4|la|les i triar-ne una per defecte}}.\n\n$2\n\n; Si heu acabat d'instal·lar MediaWiki:\n: Probablement l'instal·làveu des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Intenteu instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org], per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador tarball], que ve amb diverses aparences i ampliacions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Descarregar tarballs de skin individuals 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 Usar Git per a descarregar skins].\n: Fent això no s'hauria d'interferir amb el vostre dipòsit git si sou un desenvolupador de MediaWiki.\n\n; Si només heu actualitzat MediaWiki:\n: Per MediaWiki 1.24 i posteriors ja no permet aparences instal·lades automàticament (consulteu [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Aparences autodiscovery]). Podeu enganxar {{PLURAL:$5|la línia següent|les línies següents}} en <code>LocalSettings.php</code> per permetre {{PLURAL:$5|l'aparença instal·lada|totes les aparences instal·lades}} actualment:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si només heu modificat <code>LocalSettings.php</code>:\n: Assegureu-vos que no hi hagi errors tipogràfics en els noms de l'aparença.",
+       "default-skin-not-found-no-skins": "Vaja! L'aparença per defecte pel vostre wiki, definida a <code>$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nNo teniu cap aparença instal·lada.\n\n\n; Si heu acabat d'instal·lar o actualitzar MediaWiki:\n: Probablement l'heu instal·lat des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Per MediaWiki 1.24 i posteriors ja no s'inclouen aparences en el repositori principal. Proveu d'instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org] per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador ''tarball''], que ve amb diverses aparences i extensions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Usar Git per a descarregar aparences].\n: Fent això no s'hauria d'interferir amb el vostre repositori de git si sou un desenvolupador de MediaWiki. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] per a més informació sobre com permetre aparences i triar-ne per defecte.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (habilitat)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>inhabilitat</strong>)",
        "mediastatistics": "Estadístiques dels multimèdia",
        "mediastatistics-summary": "Les estadístiques sobre els tipus de fitxers pujats. Això només inclou la versió més recent d'un fitxer. S'exclouen les versions antigues o eliminades dels fitxers.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-allbytes": "Mida de fitxer total de tots els fitxers {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "Tipus MIME",
        "mediastatistics-table-extensions": "Extensions possibles",
        "mediastatistics-table-count": "Nombre de fitxers",
        "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-contentmodel-new": "Creació de pàgina amb un model de contingut no per defecte",
        "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-interwiki": "Importació de Transwiki",
        "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",
        "log-action-filter-managetags-deactivate": "Desactivació d'etiquetes",
+       "log-action-filter-move-move": "Reanomena sense sobreescriure les redireccions",
+       "log-action-filter-move-move_redir": "Reanomena sobreescrivint les redireccions",
+       "log-action-filter-newusers-create": "Creació per usuari anònim",
        "log-action-filter-newusers-create2": "Creació per usuari registrat",
        "log-action-filter-newusers-autocreate": "Creació automàtica",
+       "log-action-filter-newusers-byemail": "Creació amb una contrasenya enviada per correu electrònic",
        "log-action-filter-patrol-patrol": "Patrullatge manual",
        "log-action-filter-patrol-autopatrol": "Patrullatge automàtic",
        "log-action-filter-protect-protect": "Protecció",
        "authmanager-create-from-login": "Per crear un compte, ompliu els camps.",
        "authmanager-authplugin-setpass-failed-title": "El canvi de contrasenya ha fallat",
        "authmanager-authplugin-setpass-bad-domain": "Domini invàlid.",
+       "authmanager-autocreate-noperm": "No es permet la creació automàtica de comptes.",
        "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-provider-temporarypassword": "Contrasenya temporal",
        "authprovider-confirmlink-request-label": "Comptes que caldrien enllaçar-se",
        "authprovider-confirmlink-success-line": "$1: s'ha enllaçat satisfactòriament.",
+       "authprovider-confirmlink-failed": "L'enllaçament de comptes no ha funcionat satisfactòriament: $1",
        "authprovider-resetpass-skip-label": "Omet",
        "authprovider-resetpass-skip-help": "Omet el restabliment de contrasenya.",
        "specialpage-securitylevel-not-allowed-title": "No permès",
+       "specialpage-securitylevel-not-allowed": "Ho sentim, no podeu utilitzar la pàgina perquè no es pot verificar la vostra identitat.",
        "authpage-cannot-login": "No s'ha pogut iniciar la sessió.",
        "authpage-cannot-login-continue": "No es pot continuar amb l'inicio de sessió. Probablement la vostra sessió ha expirat.",
        "authpage-cannot-create": "No s'ha pogut iniciar la creació del compte.",
        "authpage-cannot-create-continue": "No es pot prosseguir la creació del compte. Probablement la vostra sessió ha expirat.",
        "authpage-cannot-link": "No s'ha pogut iniciar l'enllaç del compte.",
+       "authpage-cannot-link-continue": "No es pot continuar amb l'enllaç del compte. Possiblement s'ha esgotat el temps de la vostra sessió.",
        "cannotauth-not-allowed-title": "S'ha denegat el permís",
        "cannotauth-not-allowed": "No teniu permisos per utilitzar la pàgina",
        "changecredentials": "Canvi de dades credencials",
        "changecredentials-submit": "Canvia les dades credencials",
+       "changecredentials-invalidsubpage": "$1 no és tipus de credencial vàlid.",
        "changecredentials-success": "Les vostres credencials han estat canviades.",
        "removecredentials": "Suprimeix les credencials",
        "removecredentials-submit": "Suprimeix les credencials",
        "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"
+       "pageid": "ID de pàgina $1",
+       "gotointerwiki-invalid": "El títol especificat no és vàlid."
 }
index e4ed07f..8b8e77f 100644 (file)
        "externaldberror": "可能是驗證數據庫綻咯,或者是汝𣍐使升級汝其外部賬戶。",
        "login": "躒入",
        "nav-login-createaccount": "登錄/開賬戶",
-       "userlogin": "躒入/開新賬號",
-       "userloginnocreate": "躒入",
        "logout": "躒出",
        "userlogout": "躒出",
        "notloggedin": "固未躒入",
        "userlogin-noaccount": "汝無賬戶?",
        "userlogin-joinproject": "加入{{SITENAME}}",
-       "nologin": "汝固無賬號?$1",
-       "nologinlink": "開蜀隻賬戶",
        "createaccount": "開賬戶",
-       "gotaccount": "已經有賬戶了?'''$1'''。",
-       "gotaccountlink": "躒入",
-       "userlogin-resetlink": "躒入其資料𣍐記去是伓是?",
        "userlogin-resetpassword-link": "密碼𣍐記?",
        "userlogin-helplink2": "對手汝躒入",
        "userlogin-loggedin": "汝已經使$1躒入過了。\n儷是卜想挈其他用戶來躒入,起動汝使下底其表格來躒入。",
        "createacct-another-email-ph": "拍入電批地址",
        "createaccountmail": "使臨時其隨機密碼,共伊送遘指定其電子郵件地址",
        "createacct-realname": "實際其名字(愛寫就寫)",
-       "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "汝奚勢復想開另外蜀隻賬戶?",
        "createacct-submit": "開賬戶",
        "editingsection": "修改$1(段)",
        "editingcomment": "修改$1(新其蜀部分)",
        "editconflict": "修改對衝:$1",
-       "explainconflict": "敆汝開始修改茲蜀頁之前,已經有其他人改變茲蜀頁去了。懸頂文本區域包括原底存在其頁面文本。汝其改變敆下底文本區域顯示。汝必須合併汝其改變遘已經存在其文本。敆汝擪「{{int:savearticle}}」以後,'''囇有'''敆懸頂文本區域其文本會保存。",
+       "explainconflict": "敆汝開始修改茲蜀頁之前,已經有其他人改變茲蜀頁去了。懸頂文本區域包括原底存在其頁面文本。汝其改變敆下底文本區域顯示。汝必須合併汝其改變遘已經存在其文本。敆汝擪「$1」以後,'''囇有'''敆懸頂文本區域其文本會保存。",
        "yourtext": "汝其文字",
        "editingold": "'''警告:汝現在𡅏修改已經過時其版本。'''\n如果汝保存伊,趁茲以後其任何改變都變無了。",
        "yourdiff": "差別",
        "prefs-misc": "其它",
        "saveprefs": "保存",
        "prefs-editing": "編輯",
-       "rows": "行數:",
        "searchresultshead": "尋討",
        "recentchangescount": "這般改變其條目:",
        "savedprefs": "汝其設定已經乞保存了。",
        "rcshowhideliu": "$1 ī dĕng-gé gì ê̤ṳng-hô",
        "rcshowhideanons": "$1 ù-mìng-sê",
        "rcshowhidemine": "$1 nguāi gì siŭ-gāi",
-       "rclinks": "Hiēng-sê có̤i-gê̤ṳng $2 gĕ̤ng ī-nô̤i gì $1 huòi gāi-biéng<br />$3",
+       "rclinks": "Hiēng-sê có̤i-gê̤ṳng $2 gĕ̤ng ī-nô̤i gì $1 huòi gāi-biéng",
        "diff": "chă",
        "hist": "sṳ̄",
        "hide": "掩",
index 1533127..da35321 100644 (file)
        "login": "Системин довзийтар",
        "login-security": "Хьой хилар бакъде",
        "nav-login-createaccount": "Довзийтар / дӀаяздар кхоллар",
-       "userlogin": "Довзийтар я декъашхочун дӀаяздар кхоллар",
-       "userloginnocreate": "Довзийта",
        "logout": "Болх дӀаберзор",
        "userlogout": "Болх дӀаберзор",
        "notloggedin": "ЦӀарца доцуш",
        "userlogin-noaccount": "Декъашхочун дӀаяздар дац хьа?",
        "userlogin-joinproject": "Проектехь дӀаяздар кхоллар",
-       "nologin": "Декъашхочун дӀаяздар дац хьа? '''$1'''.",
-       "nologinlink": "Кхолла декъашхочун дӀаяздар",
        "createaccount": "Кхолла декъашхочун дӀаяздар",
-       "gotaccount": "ДӀаяздар кхоьллин ахь? '''$1'''.",
-       "gotaccountlink": "Довзийта",
-       "userlogin-resetlink": "Чуволу/йолу хаам биц бела?",
        "userlogin-resetpassword-link": "Пароль кхоссар?",
        "userlogin-helplink2": "Системин чудахаран гӀодар",
        "userlogin-loggedin": "Хьо {{GENDER:$1|$1}} цӀарца чохь ву/ю.\nЛахара форманца кхин цӀарца чугӀо.",
        "createacct-another-email-ph": "ДӀаязде электронан поштан адрес",
        "createaccountmail": "Лелае цахууш нисйина хана пароль, кхин язйинчу электронан адрес тӀе яийта и.",
        "createacct-realname": "Хьан цӀе (ца язйича мега)",
-       "createaccountreason": "Бахьана:",
        "createacct-reason": "Бахьана",
        "createacct-reason-ph": "Стен кхуллуш ду ахьа керла декъашхочун дӀаяздар",
        "createacct-submit": "Кхолла декъашхочун дӀаяздар",
        "preview": "Хьалххе хьажар",
        "showpreview": "Хьалха хьажар",
        "showdiff": "Бина болу хийцамашка хьажар",
-       "blankarticle": "<strong>ДӀахьедар:</strong> Ахьа кхуллуш йолу агӀо еса ю.\nЮху кнопка «{{int:savearticle}}» тӀетаӀаяхь, агӀо цхьа чулацам боцуш кхуллур ю.",
+       "blankarticle": "<strong>ДӀахьедар:</strong> Ахьа кхуллуш йолу агӀо еса ю.\nЮху кнопка «$1» тӀетаӀаяхь, агӀо цхьа чулацам боцуш кхуллур ю.",
        "anoneditwarning": "'''Тергам бе''': Ахьа хьай цӀарца тадарш деш дац. Хьан IP-адрес дӀаяздина хира ду хӀокху агӀон истори чу.",
        "anonpreviewwarning": "''Системин чу цагӀахь хьан IP-адрес агӀона истори чу дӀаяз лур ду.''",
-       "missingsummary": "'''Дагадаийтар.''' Ахьа хийцамаш лаьцна доца яздина дац. Кнопка «{{int:savearticle}}» юху тӀетаӀича хийцамах лаьцна хӀума доцуш Ӏалашбира бу.",
-       "selfredirect": "<strong>Тергам бе:</strong> Ахьа кхуллуш ю из-за цӀе йолу агӀонан тӀе дӀасхьажорг.\nХийла мега, ДӀасхьажорг кхолла я таян ахьа хаьржина нийса йоцу агӀо.\nАхьа «{{int:savearticle}}» кнопка юха а тӀетаӀа яхь агӀо кхуллура ю.",
+       "missingsummary": "'''Дагадаийтар.''' Ахьа хийцамаш лаьцна доца яздина дац. Кнопка «$1» юху тӀетаӀича хийцамах лаьцна хӀума доцуш Ӏалашбира бу.",
+       "selfredirect": "<strong>Тергам бе:</strong> Ахьа кхуллуш ю из-за цӀе йолу агӀонан тӀе дӀасхьажорг.\nХийла мега, ДӀасхьажорг кхолла я таян ахьа хаьржина нийса йоцу агӀо.\nАхьа «$1» кнопка юха а тӀетаӀа яхь агӀо кхуллура ю.",
        "missingcommenttext": "Дехар до дӀаязбе хайн хаам лахахь.",
-       "missingcommentheader": "'''Дагадаийтар.''' Ахьа хӀокху къамелан дӀахьедар/корта билгал бина бац. Кнопка «{{int:savearticle}}» юху тӀетаӀича хийцамах лаьцна хӀума доцуш Ӏалашбира бу.",
+       "missingcommentheader": "'''Дагадаийтар.''' Ахьа хӀокху къамелан дӀахьедар/корта билгал бина бац. Кнопка «$1» юху тӀетаӀича хийцамах лаьцна хӀума доцуш Ӏалашбира бу.",
        "summary-preview": "Цуьнах лаьцна хирду:",
        "subject-preview": "Коьрта могӀа хира бу:",
        "previewerrortext": "Хьан хийцамашка хьалха хьажа гӀертачу хенахь гӀалат даьлла.",
        "editingsection": "Тадар $1 (дакъа)",
        "editingcomment": "Тадар $1 (керла дакъа)",
        "editconflict": "Тадарна дойнаш: $1",
-       "explainconflict": "Ахьа хӀара агӀо тоечу хенахь, цхьам хийцамаш бина.\nЛакхарчу таяран корехь хьона гуш ду хӏинца агӏона чохь долу йоза.\nЛахарчу корехь ахь бина хийцам бу.\nХьой бина хийцам лахарчу корера лакхарчу коре баккха.\nКнопкан «{{int:savearticle}}» тӏетаӏича лакхара корера йоза дӏаязлурду.",
+       "explainconflict": "Ахьа хӀара агӀо тоечу хенахь, цхьам хийцамаш бина.\nЛакхарчу таяран корехь хьона гуш ду хӏинца агӏона чохь долу йоза.\nЛахарчу корехь ахь бина хийцам бу.\nХьой бина хийцам лахарчу корера лакхарчу коре баккха.\nКнопкан «$1» тӏетаӏича лакхара корера йоза дӏаязлурду.",
        "yourtext": "Хьан йоза",
        "storedversion": "Ӏалашйина верси",
        "editingold": "'''ДӀахьедар. Ахь таеш ю хӀокху агӀонан шира елла верси.'''\nАгӀо Ӏалаш йинчул тӀаьхьа, хьалхо бина хийцамаш дӀабевра бу.",
        "userrights-no-interwiki": "Хьан бакъо яц декъашхой бакъо хийца кхечу википеди чохь.",
        "userrights-changeable-col": "Хьоьга хийцалун бакъонаш",
        "userrights-unchangeable-col": "Хьоьга хийцалун бакъонаш",
+       "userrights-expiry-none": "Цкъа а",
+       "userrights-expiry": "Бакъо дӀайолу:",
+       "userrights-expiry-othertime": "Кхин хан:",
        "group": "Тоба:",
        "group-user": "Декъашхой",
        "group-autoconfirmed": "АвтотӀелаьцна декъашхой",
        "right-editprotected": "«{{int:protect-level-sysop}}» бахьанца ларйина агӀонаш нисъяр",
        "right-editsemiprotected": "«{{int:protect-level-autoconfirmed}}» бахьанца ларйина агӀонаш нисъяр",
        "right-editinterface": "лелош йолу интерфейсан хийцам бар",
-       "right-editusercssjs": "кхечу декъашхойн CSS- а, JS- а файлаш нисяр",
        "right-editusercss": "кхечу декъашхойн CSS-файлаш нсяр",
        "right-edituserjs": "кхечу декъашхойн JavaScript-файлаш нисяр",
        "right-editmyusercss": "Декъашхочун CSS файлаш таяр",
        "recentchanges-noresult": "Билгал йинчу хенахь цхьа хийцамаш бина бац.",
        "recentchanges-feed-description": "Тергам бе тӀаьххьара вики хийцаман хӀокху ларца.",
        "recentchanges-label-newpage": "Оцу нисдарца кхоьллина керла агӀо.",
-       "recentchanges-label-minor": "Ð¥Ó\80аÑ\80а Ð¿Ð°Ð¹Ð´Ð° боцу хийцам бу",
+       "recentchanges-label-minor": "Ð¥Ó\80аÑ\80а Ð»Ð°Ð´Ð°Ð¼ боцу хийцам бу",
        "recentchanges-label-bot": "ХӀара нисдар бото дина",
        "recentchanges-label-unpatrolled": "ХӀара нисдар хӀинца цхьано патрулировать дина дац",
        "recentchanges-label-plusminus": "байташкахь барам хийцар",
        "rcfilters-filter-editsbyself-label": "Хьан дисдарш",
        "rcfilters-filter-editsbyself-description": "Хьан нисдарш.",
        "rcfilters-filter-editsbyother-label": "Кхечу декъашхойн нисдарш",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Керланиш",
-       "rcfilters-filter-userExpLevel-learner-label": "Доьшуш берш",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Керланиш",
+       "rcfilters-filter-user-experience-level-learner-label": "Доьшуш берш",
        "rcnotefrom": "Лахахь гайтина тӀера <strong>$2</strong> (хийцамаш <strong>$1</strong> кӀезиг).",
        "rclistfrom": "Гайта хийцам {{CURRENTYEAR}} шеран {{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTTIME}} бина болу",
        "rcshowhideminor": "$1 кегийра нисдарш",
        "rcshowhidecategorization": "$1 категореш тӀетохар",
        "rcshowhidecategorization-show": "Гайта",
        "rcshowhidecategorization-hide": "Къайлаяккха",
-       "rclinks": "Гайта тӀаьххьарлерачу $2 дийнахь бина болу $1 хийцамаш\n<br />$3",
+       "rclinks": "Гайта тӀаьххьарлерачу $2 дийнахь бина болу $1 хийцамаш",
        "diff": "башхалла",
        "hist": "истори",
        "hide": "Къайлаяккха",
        "uploadnologintext": "Серверан чу файлаш яха ахьа дан дезарг ду $1.",
        "uploaderror": "Файл чуяккхаран гӀалат",
        "upload-recreate-warning": "'''Тегам бе: иштта цӀе йолу файл дӀаяьккхина я цӀе хийцина.'''\n\nЛахахьа гойтуш ю хӀокху агӀона тептар:",
-       "uploadtext": "Ð\9bелайе Ñ\85Ó\80аÑ\80а Ð°Ð³Ó\80о Ñ\81еÑ\80веÑ\80 Ñ\87Ñ\83 Ñ\84айлаÑ\88 Ð¹Ð¾Ñ\85Ñ\83Ñ\88.\nÐ¥Ñ\8cалÑ\85о Ñ\87Ñ\83Ñ\8fÑ\8cÑ\85на Ñ\84айлаÑ\88 Ñ\85Ñ\8cажа,  [[Special:FileList|кÑ\85Ñ\83заÑ\85Ñ\8c]]. Ð\9aÑ\85ин Ñ\87Ñ\83Ñ\8fÑ\8cÑ\85на Ñ\84айлаÑ\88 Ð´Ó\80аÑ\8fзло [[Special:Log/upload|Ñ\87Ñ\83Ñ\8fÑ\85аÑ\80ан Ñ\82епÑ\82аÑ\80 Ñ\87оÑ\85Ñ\8c]], Ð´Ó\80аÑ\8fÑ\8cÑ\85на Ñ\84айлаÑ\88 ÐºÐ°Ñ\80о Ð¹Ð¸Ñ\88 Ñ\8e [[Special:Log/delete|кÑ\85Ñ\83заÑ\85Ñ\8c]].\n\nФайл Ð°Ð³Ó\80она Ñ\87Ñ\83йилла Ð»ÐµÐ»Ð°Ð±Ðµ Ð»Ð°Ñ\85аÑ\80а Ð¼Ð¾Ð³Ó\80анаÑ\88:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' Ñ\84айла Ð¤Ð°Ð¹Ð»Ð°Ð½ Ñ\8eÑ\8cззина Ð²ÐµÑ\80Ñ\81и Ñ\87Ñ\83йиллÑ\83Ñ\88;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|Ñ\86Ñ\83наÑ\85Ñ\8c Ð»Ð°Ñ\8cÑ\86на Ñ\85аам]]</nowiki></code>''' 200 Ð¿Ð¸ÐºÑ\81елÑ\8c Ð±Ð°Ñ\80амеÑ\85Ñ\8c Ñ\84айл Ñ\87Ñ\83йилаÑ\80 Ð±Ñ\83Ñ\85аÑ\85Ñ\8c Ñ\86Ñ\83наÑ\85Ñ\8c лаьцна могӀа а болуш;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' файлан тӀе хьажорг хӀотайо файл агӀонгахь ца гуш.",
+       "uploadtext": "Ð\9bелайе Ñ\85Ó\80аÑ\80а Ð°Ð³Ó\80о Ñ\81еÑ\80веÑ\80 Ñ\87Ñ\83 Ñ\84айлаÑ\88 Ð¹Ð¾Ñ\85Ñ\83Ñ\88.\nÐ¥Ñ\8cалÑ\85о Ñ\87Ñ\83Ñ\8fÑ\8cÑ\85на Ñ\84айлаÑ\88 Ñ\85Ñ\8cажа,  [[Special:FileList|кÑ\85Ñ\83заÑ\85Ñ\8c]]. Ð\9aÑ\85ин Ñ\87Ñ\83Ñ\8fÑ\8cÑ\85на Ñ\84айлаÑ\88 Ð´Ó\80аÑ\8fзло [[Special:Log/upload|Ñ\87Ñ\83Ñ\8fÑ\85аÑ\80ан Ñ\82епÑ\82аÑ\80 Ñ\87оÑ\85Ñ\8c]], Ð´Ó\80аÑ\8fÑ\8cÑ\85на Ñ\84айлаÑ\88 ÐºÐ°Ñ\80о Ð¹Ð¸Ñ\88 Ñ\8e [[Special:Log/delete|кÑ\85Ñ\83заÑ\85Ñ\8c]].\n\nФайл Ð°Ð³Ó\80она Ñ\87Ñ\83йилла Ð»ÐµÐ»Ð°Ð±Ðµ Ð»Ð°Ñ\85аÑ\80а Ð¼Ð¾Ð³Ó\80анаÑ\88:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' Ñ\84айла Ð¤Ð°Ð¹Ð»Ð°Ð½ Ñ\8eÑ\8cззина Ð²ÐµÑ\80Ñ\81и Ñ\87Ñ\83йиллÑ\83Ñ\88;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|Ñ\86Ñ\83наÑ\85Ñ\8c Ð»Ð°Ñ\8cÑ\86на Ñ\85аам]]</nowiki></code>''' 200 Ð¿Ð¸ÐºÑ\81елÑ\8c Ð±Ð°Ñ\80амеÑ\85Ñ\8c Ñ\84айл Ñ\87Ñ\83йиллаÑ\80 Ð±Ñ\83Ñ\85аÑ\85Ñ\8c Ñ\86Ñ\83Ñ\8cнаÑ\85 лаьцна могӀа а болуш;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' файлан тӀе хьажорг хӀотайо файл агӀонгахь ца гуш.",
        "upload-permitted": "Магийна файлийн тайпанаш: $1.",
        "upload-preferred": "Магийна файлийн тайпанаш: $1.",
        "upload-prohibited": "Магийна доцу файлийн тайпанаш: $1.",
        "showhideselectedlogentries": "Гайта/къайлаяха хаьржина башхонаш",
        "checkbox-select": "Харжар: $1",
        "checkbox-all": "Массо",
-       "checkbox-none": "ХӀума а",
+       "checkbox-none": "ХӀума",
        "checkbox-invert": "Инверт ян",
        "allpages": "Массо агӀонаш",
        "nextpage": "ТӀаьхьа йогӀу агӀо ($1)",
        "emailccsubject": "$1: $2 бохьуьтучу хааман копи",
        "emailsent": "Кехат дӀадахьийтина",
        "emailsenttext": "Хьан электроннан хаам дӏабахьийтина.",
-       "emailuserfooter": "Ð¥Ó\80аÑ\80а Ñ\85аам Ð±Ð°Ñ\85ийÑ\82инеÑ\80а $1 {{GENDER:$1|декÑ\8aаÑ\89Ñ\85оÑ\87о}} $2 {{GENDER:$2|декÑ\8aаÑ\89хочунга}} «декъашхочунга хаам» олучу функцин гӀоьнца {{SITENAME}} проектан.",
+       "emailuserfooter": "Ð¥Ó\80аÑ\80а Ñ\85аам Ð±Ð°Ñ\85ийÑ\82инеÑ\80а $1 {{GENDER:$1|декÑ\8aаÑ\88Ñ\85оÑ\87о}} $2 {{GENDER:$2|декÑ\8aаÑ\88хочунга}} «декъашхочунга хаам» олучу функцин гӀоьнца {{SITENAME}} проектан.",
        "usermessage-summary": "Битта системан хаам.",
        "usermessage-editor": "Системан дӀакхачор",
        "watchlist": "Тергаме могӀам",
        "undeleteviewlink": "хьажа",
        "undeleteinvert": "Къастае массо",
        "undeletecomment": "Бахьана:",
-       "undeletedrevisions": "{{PLURAL:$1|меттахӀоьттина}} $1 {{PLURAL:$1|хийцам}}",
-       "undeletedrevisions-files": "меттахӀоьттина $1 {{PLURAL:$1|верси}} а, $2 {{PLURAL:$2|файл}} а",
-       "undeletedfiles": "$1 {{PLURAL:$1|файл меттахӀоттайина|файлаш меттахӀоттайина}}",
        "cannotundelete": "ГӀалат меттахӀоттайина:\n$1",
        "undeletedpage": "'''МеттахӀоттайина агӀо «$1».'''\n\nДӀадяхнарш долу могӀане [[Special:Log/delete|тéптаре хьажа]].",
        "undelete-header": "Дукху хан йоцуш дӀаяхна агӀонаш хьажа мега [[Special:Log/delete|дӀадаьхьнарш долу тептар чохь]].",
        "newimages": "Керлачу файлийн галерей",
        "newimages-summary": "ХӀокху белхан агӀона чохь гойтуш ю дукха хан йоццуш чуяьхна файлаш.",
        "newimages-legend": "Луьттург",
+       "newimages-user": "Декъашхочун цӀе я IP-адрес",
        "newimages-showbots": "Гайта боташ чуяьхна файлаш",
        "newimages-hidepatrolled": "Къайлаяха патруль йина файлаш",
        "noimages": "Суьрташ дац.",
        "logentry-managetags-create": "$1 {{GENDER:$2|Кхоьллина}} билгало «$4»",
        "log-name-tag": "Билгалонийн тептар",
        "rightsnone": "(яц)",
-       "revdelete-summary": "хийцамах лаьцна",
        "feedback-adding": "АгӀона хетарг тӀетохар...",
        "feedback-back": "ЮхагӀо",
        "feedback-bugornote": "Хьайн техникин халонах лаьцна яздан хӀума делахь, дехар до, [$1 хаам бе тхоьга].\nДацахь хьан йиш ю хӀокху атта кепаца «[$3 $2]» агӀонг къамел тӀетоха хьан декъашхочун цӀарца, кхин лелош йолу браузер билгал еш.",
index 2a9ecd5..a0cc596 100644 (file)
@@ -11,7 +11,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Leeheonjin",
-                       "Macofe"
+                       "Macofe",
+                       "Bentong Isles"
                ]
        },
        "tog-underline": "Binadlisan nga mga sumpay:",
        "actions": "Mga lihok",
        "namespaces": "Mga ngalang espasyo",
        "variants": "Mga baryant",
+       "navigation-heading": "Menu sa nabigasyon",
        "errorpagetitle": "Sayop",
        "returnto": "Balik sa $1.",
        "tagline": "Gikan sa {{SITENAME}}",
        "searcharticle": "Sige",
        "history": "Kaagi ning panid",
        "history_short": "Kaagi",
+       "history_small": "kaagi",
        "updatedmarker": "na-update sugod sa akong kataposang bisita",
        "printableversion": "Mapatik nga bersiyon",
        "permalink": "Permanenteng sumpay",
        "print": "I-print",
+       "view": "Tan-awa",
+       "view-foreign": "Tan-awa sa $1",
        "edit": "Usba",
        "create": "Himoa",
+       "create-local": "Pagpuno og lokal nga deskripsyon",
        "editthispage": "Usba kining panid",
        "create-this-page": "Himoa kining panid",
        "delete": "Papasa",
        "unprotectthispage": "Ayaw na kini protektahi",
        "newpage": "Bag-ong panid",
        "talkpage": "Hisgoti kining panid",
-       "talkpagelinktext": "Hisgot",
+       "talkpagelinktext": "hisgot",
        "specialpage": "Espesyal nga panid",
        "personaltools": "Personal nga galamiton",
        "articlepage": "Tan-awa ang panid sa sulod",
        "otherlanguages": "Sa ubang pinulongan",
        "redirectedfrom": "(Naredirek gikan sa $1)",
        "redirectpagesub": "Panid sa redirekta",
+       "redirectto": "Iadto sa:",
        "lastmodifiedat": "Kini nga panid kataposang giusab niadtong $2, $1.",
        "viewcount": "Naablihan na sa {{PLURAL:$1|maka-usa|$1 ka higayon}} ang kining panid.",
        "protectedpage": "Giprotektahang panid",
        "viewsourceold": "tan-awa ang ginikanan",
        "editlink": "usba",
        "viewsourcelink": "tan-awa ang ginikanan",
-       "editsectionhint": "Usba ang seksyong: $1",
+       "editsectionhint": "Usba ang seksyon: $1",
        "toc": "Mga sulod",
        "showtoc": "ipakita",
        "hidetoc": "tagoa",
        "nstab-template": "Plantilya",
        "nstab-help": "Panid sa tabang",
        "nstab-category": "Kategoriya",
+       "mainpage-nstab": "Unang Panid",
        "nosuchaction": "Walay maong aksyon",
        "nosuchactiontext": "Ang aksyon nga anaa sa URL wala gi-ila sa wiki",
        "nosuchspecialpage": "Walay maong espesyal nga panid",
        "externaldberror": "May nahitabong authentication database error o kaha wala ka tugoti nga mag-update sa imong eksternal nga akawnt.",
        "login": "Sulod",
        "nav-login-createaccount": "Rehistro / Dayon",
-       "userlogin": "Rehistro / Dayon",
        "logout": "Biya",
        "userlogout": "Bıveciye",
        "notloggedin": "Wala ka pa masulod",
-       "nologin": "Wala pay akawnt? '''$1'''.",
-       "nologinlink": "Paghimo og akawnt",
+       "userlogin-noaccount": "Wala pay akawnt?",
+       "userlogin-joinproject": "Apil sa {{SITENAME}}",
        "createaccount": "Paghimo'g akawnt",
-       "gotaccount": "Naa ka nay akawnt? '''$1'''.",
-       "gotaccountlink": "Dayon",
+       "createacct-emailoptional": "Adres sa email (opsyonal)",
        "createaccountmail": "sa e-mail",
+       "createacct-benefit-heading": "Ang {{SITENAME}} hinimo sa mga tawo sama kanimo.",
+       "createacct-benefit-body3": "labing bag-ong {{PLURAL:$1|ka tampo|ka mga tampo}}",
        "badretype": "Ang mga pasword nga imong gientra wala mag-match.",
        "userexists": "Ang ngalan sa tiggamit nga imong gisulat nagamit na.\nPalihug pagpili og lain nga ngalan.",
        "loginerror": "Sayop sa pagdayon",
        "wrongpassword": "Sayop nga pasword ang naentra.\nPalihog sulayi'g usab.",
        "mailmypassword": "I-email ang bag-ong pasword",
        "loginlanguagelabel": "Pinulongan: $1",
+       "pt-login": "Sulod",
+       "pt-createaccount": "Paghimo og akawnt",
        "changepassword": "Usba ang pasword",
+       "passwordreset": "Usba ang password",
        "bold_sample": "Gilugom nga teksto",
        "bold_tip": "Gilugom nga teksto",
        "italic_sample": "Gitakilid nga teksto",
        "preview": "Paunang tan-aw",
        "showpreview": "Paunang tan-aw",
        "showdiff": "Ipakita ang kalainan",
-       "anoneditwarning": "'''Pahibalo:''' Wala ikaw maka-login.\nAng imong ''IP address'' maoy itala sa kaagi niini nga panid.",
+       "anoneditwarning": "<strong>Pahimangno:</strong> Wala ka mailhi sa balayan. Ang imong <i>IP adress</i> makita sa publiko kon mohimo ka og mga pag-usab. Kon <strong>mo-<i>[$1 log in]</i></strong> ka o <strong>[$2 mohimo og akawnt]</strong>, ang imong mga pag-usab ingalan sa imong <i>username</i>, lakip na ang uban pang kaayohan.",
        "summary-preview": "Paunang tan-aw sa mubong sugid:",
+       "loginreqlink": "sulod",
        "newarticle": "(Bag-o)",
        "newarticletext": "Mitulpok ka sa sumpay ngadto sa usa ka wala pa masulat nga panid.\nAron mahimo ang maong panid, pagtayp sa kahon sa ubos (tan-awa ang [$1 panid sa tabang] alang sa dugang impormasyon).\nKon miabot ka dinhi pinaagi sa usa ka sayop, palihog tuploka ang back nga tuplokanan sa imong brawser.",
-       "noarticletext": "Sa kasamtangan walay sulod nga teksto ang kining panid.\nPuyde nimong  [[Special:Search/{{PAGENAME}}|pangitaon kining titulo sa panid]] sa ubang mga panid, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pangitaa ang related nga mga log],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} usba kining panid]</span>.",
+       "noarticletext": "Sa kasamtangan walay sulod nga teksto kining panid.\nPuyde nimong [[Special:Search/{{PAGENAME}}|pangitaon kining titulo sa panid]] sa ubang mga panid, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pangitaa ang mga may kalabotan nga log],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} mugnaa kining panid]</span>.",
+       "noarticletext-nopermission": "Sa kasamtangan walay sulod nga teksto kining panid.\nPuyde nimong [[Special:Search/{{PAGENAME}}|pangitaon kining titulo sa panid]] sa ubang mga panid, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pangitaa ang mga may kalabotan nga log]</span>, apan wala kay katungod nga mohimo ning maong panid.",
        "userpage-userdoesnotexist": "Ang akawnt sa tiggamit nga \"<nowiki>$1</nowiki>\" wala marehistro. Palihug tan-awa kon buot nimong himoon/usbon ang kining panid.",
        "previewnote": "'''Hinumdomi nga kini usa lang ka paunang tan-aw; wala pa matipigi ang imong giusab!'''",
        "editing": "Nagausab sa $1",
        "notextmatches": "Walay misaktong teksto sa panid",
        "prevn": "miaging {{PLURAL:$1|$1}}",
        "nextn": "sunod {{PLURAL:$1|$1}}",
+       "nextn-title": "Sunod nga $1 {{PLURAL:$1|resulta|mga resulta}}",
+       "shown-title": "Pagpakita og $1 {{PLURAL:$1|ka resulta|ka mga resulta}} matag panid",
        "viewprevnext": "Tan-awa sa ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchprofile-everything": "Tanan ng bagay",
+       "searchmenu-new": "<strong>Mugnaa ang panid nga \"[[:$1]]\" dinhi ning maong wiki!</strong> {{PLURAL:$2|0=|Tan-awa usab ang panid nga nakit-an sa imong pagpangita.|Tan-awa usab ang mga resulta sa pagpangita.}}",
+       "searchprofile-articles": "Mga panid sa sulod",
+       "searchprofile-images": "Multimedia",
+       "searchprofile-everything": "Tanan",
+       "searchprofile-advanced": "Abanse",
+       "searchprofile-articles-tooltip": "Pangita sa $1",
+       "searchprofile-images-tooltip": "Pangita og mga payl",
+       "searchprofile-everything-tooltip": "Pangita sa tanang sulod (lakip ang mga panid sa hisgot)",
+       "searchprofile-advanced-tooltip": "Pangita sa mga espesyal nga <i>namespaces</i>",
        "search-result-size": "$1 ({{PLURAL:$2|1 pulong|$2 ka mga pulong}})",
-       "search-redirect": "(redirek $1)",
+       "search-redirect": "(redirek gikan sa $1)",
        "search-section": "(bahin $1)",
        "search-suggest": "Imo bang buot ipasabot: $1",
        "search-interwiki-caption": "Mga kaubang proyekto",
        "saveprefs": "Tipigi",
        "restoreprefs": "Ibalik ang tanang default settings",
        "prefs-editing": "Nagausab",
-       "rows": "Mga row:",
-       "columns": "Mga kolum:",
        "searchresultshead": "Pangitaa",
        "stub-threshold": "Threshold para sa <a href=\"#\" class=\"stub\">stub link</a> formatting (bytes):",
        "recentchangesdays": "Mga adlaw nga ipakita sa bag-ong giusab:",
        "prefs-signature": "Pirma",
        "group-sysop": "Mga tagdumala",
        "grouppage-sysop": "{{ns:project}}:Mga tigdumala",
+       "right-writeapi": "Paggamit sa write API",
        "newuserlogpage": "Log sa paghimo'g gumagamit",
        "newuserlogpagetext": "Kini mao ang ''log'' sa bag-ong namugnang mga gumagamit.",
        "rightslog": "Log sa mga katungod sa gumagamit",
        "action-undelete": "ayaaw papasa ang kining panid",
        "action-suppressrevision": "i-rebyu ug ibalik ang kining nakatagong rebisyon",
        "nchanges": "$1 {{PLURAL:$1|ka pag-usab|ka mga pag-usab}}",
+       "enhancedrc-history": "kaagi",
        "recentchanges": "Mga bag-ong giusab",
        "recentchanges-legend": "Mga opsyon sa bag-ong pag-usab",
+       "recentchanges-summary": "Bantayi ang kinabag-ohang mga pag-usab sa wiki dinhi niining panid.",
        "recentchanges-feed-description": "Bantayi ang kinabag-ohang mga pag-usab sa wiki niining feed.",
+       "recentchanges-label-newpage": "Kining pag-usab nagmugna og bag-ong panid",
+       "recentchanges-label-minor": "Ginagmay nga pag-usab",
+       "recentchanges-label-bot": "Kining pag-usab ginamit ang <i>bot</i>",
+       "recentchanges-label-unpatrolled": "Kining maong pag-usab wala pa masuhid",
+       "recentchanges-label-plusminus": "Ang gidak-on sa panid nausab ning gidaghanona sa byte",
+       "recentchanges-legend-heading": "<strong>Pagpasabot:</strong>",
        "rclistfrom": "Ipakita ang mga bag-ong pag-usab gikan $3 $2",
        "rcshowhideminor": "$1 menor nga pag-usab",
+       "rcshowhideminor-hide": "Tagoa",
        "rcshowhidebots": "$1 mga bot",
-       "rcshowhideliu": "$1 mga gumagamit nga naka-log-in",
+       "rcshowhidebots-show": "Tagoa",
+       "rcshowhideliu": "$1 ka mga gumagamit ang natala",
+       "rcshowhideliu-hide": "Tagoa",
        "rcshowhideanons": "$1 mga wala mailhing gumagamit",
+       "rcshowhideanons-show": "Ipakita",
+       "rcshowhideanons-hide": "Tagoa",
        "rcshowhidemine": "$1 akong mga pag-usab",
-       "rclinks": "Ipakita ang miaging $1 ka kausaban sa miaging $2 ka mga adlaw<br />$3",
+       "rcshowhidemine-hide": "Tagoa",
+       "rclinks": "Ipakita ang miaging $1 ka kausaban sa miaging $2 ka mga adlaw",
        "diff": "kalainan",
        "hist": "kaagi",
        "hide": "Tagoi",
        "minoreditletter": "m",
        "newpageletter": "B",
        "boteditletter": "b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|mga byte}} human sa pag-usab",
        "rc-enhanced-expand": "Ipakita ang mga detalye (JavaScript kinahanglan)",
        "rc-enhanced-hide": "Tagoa ang mga detalye",
        "recentchangeslinked": "Mga may kalabotang kausaban",
        "recentchangeslinked-to": "Ipakita na lang ang mga pag-usab sa mga panid nga nakasumpay sa nahatag nga panid",
        "upload": "Pagsumiter og payl",
        "uploadlogpage": "Log sa upload",
+       "filedesc": "Mubong sugid:",
        "license": "Paglilisensya:",
-       "license-header": "Paglilisensya",
+       "license-header": "Pagtugot",
        "file-anchor-link": "Payl",
        "filehist": "Kaagi sa payl",
        "filehist-help": "I-klik ang petsa/oras aron makit-an ang hulagway sa payl niadtong panahona.",
        "filehist-user": "Tiggamit",
        "filehist-dimensions": "Mga dimensyon",
        "filehist-comment": "Komento",
-       "imagelinks": "Mga sumpay sa payl",
+       "imagelinks": "Mga paggamit sa payl",
        "linkstoimage": "Ang mosunod nga {{PLURAL:$1|mga panid misumpay|$1 panid misumpay}} niining payl:",
        "sharedupload": "Ang kining payl gikan sa $1 ug mahimong gigamit sa ubang mga proyekto.",
+       "sharedupload-desc-here": "Kining maong payl gikan sa $1 ug mahimong gigamit sa ubang proyekto.\nAng [$2 deskripsyon] niini didto gipakita sa ubos.",
        "uploadnewversion-linktext": "Pag-upload og bag-ong bersyon niining payl",
+       "upload-disallowed-here": "Dili mo mahimong pulihan kining maong payl.",
        "randompage": "Bisan unsang panid",
        "statistics": "Estadistika",
        "nbytes": "$1 {{PLURAL:$1|byte|mga byte}}",
        "pager-older-n": "{{PLURAL:$1|mas daan1|mas daan $1}}",
        "booksources": "Mga reperensiyang libro",
        "booksources-search-legend": "Pangitaa ang mga reperensiyang libro",
+       "booksources-search": "Pangita",
        "log": "Mga log",
        "allpages": "Tanang panid",
        "prevpage": "Miaging panid ($1)",
        "undeletelink": "tan-awa/ibalik",
        "namespace": "Ngalang espasyo:",
        "invert": "Baliha ang gipili",
+       "tooltip-invert": "I-tsek kini nga kahon aron tagoon ang mga kausaban sa mga panid sa gipili nga <i>namespace</i> (ug sa <i>associated namespace</i> kon gi-tsekan)",
+       "tooltip-namespace_association": "I-tsek kini nga kahon aron iapil ang mga panid sa hisgot o <i>subject namespace</i> nga may kalabotan sa gipili nga <i>namespace</i>",
        "blanknamespace": "(Meyn)",
-       "contributions": "Mga tampo ning gumagamit",
+       "contributions": "Mga tampo ning {{GENDER:$1|gumagamit}}",
        "contributions-title": "Mga tampo sa gumagamit para kang $1",
        "mycontris": "Akong tampo",
+       "anoncontribs": "Mga tampo",
        "contribsub2": "Para $1 ($2)",
        "uctop": "(hitaas)",
        "month": "Gikan sa bulan (ug mas sayo pa):",
        "tooltip-pt-mycontris": "Talaan sa akong mga tampo",
        "tooltip-pt-login": "Gihangyo ka namo sa pag-''log-in'', apan wala kini gikinahanglan aron makausab ka sa mga panid.",
        "tooltip-pt-logout": "Biya",
+       "tooltip-pt-createaccount": "Gidasig ka sa paghimo og akawnt ug sa pagpaila; apan dili kini kinahanglanon",
        "tooltip-ca-talk": "Panaghisgot kabahin sa panid",
-       "tooltip-ca-edit": "Mahimo mong usbon ang kining panid. Palihog gamita ang ''Paunang tan-aw'' nga tuplokanan bag-o nimotipigan ang panid.",
+       "tooltip-ca-edit": "Usba kining panid",
        "tooltip-ca-addsection": "Paghimo'g bag-ong seksyon",
        "tooltip-ca-viewsource": "Giprotektahan kining panid.\nPwede nimong tan-awon ang ginikanan.",
        "tooltip-ca-history": "Mga miaging rebisyon ning panid",
        "tooltip-n-mainpage-description": "Bisitaha ang Unang Panid",
        "tooltip-n-portal": "Kabahin sa proyekto, unsay imong mahimo, asa mangita sa mga impormasyon",
        "tooltip-n-currentevents": "Pangita og nahaunang impormasyon sa mga bag-ong panghitabo",
-       "tooltip-n-recentchanges": "Ang talaan sa mga bag-ong giusab sa wiki.",
+       "tooltip-n-recentchanges": "Ang talaan sa mga bag-ong giusab sa wiki",
        "tooltip-n-randompage": "Pag-abli og bisan unsang panid",
        "tooltip-n-help": "Ang dapit nga angay mong pangitaan.",
        "tooltip-t-whatlinkshere": "Talaan sa mga wiki nga panid nga misumpay dinhi",
        "tooltip-t-recentchangeslinked": "Mga bag-ong pag-usab sa mga panid gikan ning panid",
        "tooltip-feed-rss": "Feed nga RSS niining panid",
        "tooltip-feed-atom": "Feed nga Atom niining panid",
-       "tooltip-t-contributions": "Tan-awa ang talaan sa mga tampo niining gumagamit",
+       "tooltip-t-contributions": "Talaan sa mga tampo {{GENDER:$1|niining gumagamit}}",
        "tooltip-t-emailuser": "Padalhi og e-mail ang kaning gumagamit",
        "tooltip-t-upload": "Pagsumiter og mga payl",
        "tooltip-t-specialpages": "Talaan sa mga espesyal nga panid",
        "tooltip-watch": "Ipuno kining maong panid sa imong mga gibantayan",
        "tooltip-rollback": "\"Rollback\" mo-revert sa (mga) pag-usab niining panid ngadto sa kinaulhing mitampo sa usa lang ka klik",
        "tooltip-undo": "Ang \"undo\" mo-revert niining pag-usab ug moabli sa edit form sa paunang tan-aw nga mode.\nPuyde dugangan og rason sa mubong sugid.",
+       "tooltip-summary": "Mubong sugid",
+       "simpleantispam-label": "Pagkontra sa <i>spam</i>.\n<strong>Ayaw</stong> ni sudli!",
+       "pageinfo-toolboxlink": "Impormasyon kabahin sa panid",
        "previousdiff": "Mas daang pag-usab",
        "nextdiff": "Mas bag-ong pag-usab →",
        "file-info-size": "$1 × $2 pixels, size sa payl: $3, MIME type: $4",
        "file-nohires": "Walay mas taas nga resolusyon.",
        "svg-long-desc": "SVG nga payl, nominally $1 × $2 pixels, size sa payl: $3",
        "show-big-image": "Tibuok resolusyon",
+       "show-big-image-preview": "Gidak-on ning maong paunang tan-aw: $1.",
+       "show-big-image-other": "Uban pang {{PLURAL:$2|resolusyon|mga resoluyon}}: $1.",
+       "show-big-image-size": "$1 x $2 ka mga piksel",
        "bad_image_list": "Ang pormat mao ang mosunod:\n\nAng mga list items (mga linya nga nagsugod sa*) ang gikonsiderar.\nAng unang sumpay sa linya kinahanglang sumpay sa payl nga daot.\nAng bisan unsang mosunod nga mga sumpay sa parehong linya gikonsiderar nga mga eksepsyon, i.e. mga panid diin ang payl mahimong inline.",
        "metadata": "Metadata",
        "metadata-help": "Ang kining payl adunay dugang nga impormasyon, mahimong nadugang gikan sa digital camera o scanner nga gigamit sa paghimo o pag-digitize niini.\nKon ang payl namodipikar gikan sa orihinal nga estado, ang ubang detalye mamahimong dili moreplek sa namodipikar nga payl.",
        "metadata-expand": "Ipakita ang mas daghang detalye",
        "metadata-collapse": "Tagoa ang mga ekstended nga detalye",
-       "metadata-fields": "Ang XIF metadata fields nga nakatala niining mensahe iapil sa display sa panid sa imahen kon gi-collapse ang metadata table.\nAng uban default nga nakatago.\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": "Ang <i>XIF metadata fields</i> nga nakatala niining mensahe iapil sa panid sa hulagway kon gi-<i>collapse</i> ang han-ay sa <i>metadata</i>.\n\nAng uban nakatago gawas kon ipakita.\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": "Oryentasyon",
+       "exif-xresolution": "Resolusyon (pahigda)",
+       "exif-yresolution": "Resolusyon (pabarog)",
+       "exif-datetime": "Petsa ug oras sa pagkausab sa payl",
+       "exif-make": "Tighimo sa kamera",
+       "exif-model": "Model sa kamera",
+       "exif-software": "Programa nga gigamit",
+       "exif-exifversion": "Bersyon sa Exif",
+       "exif-colorspace": "<i>Color space</i>",
+       "exif-datetimeoriginal": "Petsa ug oras sa pag-<i>generate</i> sa <i>data</i>",
+       "exif-datetimedigitized": "Petsa ug oras sa pag-<i>digitize</i>",
+       "exif-orientation-1": "Normal",
        "namespacesall": "tanan",
        "monthsall": "tanan",
        "watchlisttools-view": "Tan-awa ang may kalabotan nga mga pag-usab",
        "watchlisttools-edit": "Tan-awa ug usba ang mga gibantayan",
        "watchlisttools-raw": "Usba ang hilaw nga talaan sa gibantayan",
        "specialpages": "Espesyal nga mga panid",
+       "tag-filter": "[[Special:Tags|Tag]] nga pilter:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Mga tag}}]]: $2)",
+       "logentry-delete-delete": "Si $1 {{GENDER:$2|mipapas}} sa panid nga $3",
        "revdelete-restricted": "mga na-aplay nga restriksyon sa mga tagdumala",
        "revdelete-unrestricted": "gitangtang ang mga restriksyon alang sa mga tagdumala",
+       "logentry-newusers-create": "Ang akawnt nga $1 {{GENDER:$2|namugna}}",
        "rightsnone": "(wala)",
-       "revdelete-summary": "mubong sugid sa pag-usab"
+       "searchsuggest-search": "Pangitaa {{SITENAME}}"
 }
index b104745..9f94630 100644 (file)
        "yourdomainname": "Lugat-mu:",
        "login": "Log in",
        "nav-login-createaccount": "Hålom / fa'tinas kuenta-mu",
-       "userlogin": "Hålom / fa'tinas kuenta-mu",
        "logout": "Log out",
        "userlogout": "Log out",
        "notloggedin": "Ti malogin",
-       "nologin": "Tåya' iyo-mu login? '''$1'''.",
-       "nologinlink": "Fama'tinas kuenta",
        "createaccount": "Fa'tinas kuenta-hu",
-       "gotaccount": "Guåha esta kuenta-mu? '''$1'''.",
-       "gotaccountlink": "Log in",
        "createaccountmail": "gi e-mail",
        "badretype": "Ti parehu i password siha ni un po'lo.",
        "userexists": "Esta guåha na u'usa enao na nå'an muna'sesetbi.\nAyek fan otru na nå'an.",
        "editingsection": "Tumulaika $1 (patte)",
        "editingcomment": "Tulalaika $1 (komentu)",
        "editconflict": "Tulaika i problema: $1",
-       "explainconflict": "Guåha otru na tinilaika gi påhina ginen i tiempon tumutuhon hao tumulaika.\nMa'annok i tinige' gi hilo' komu på'go.\nMa'annok i tinilaika-mu gi papa'.\nPara un nesita muna'daña i tinilaika-mu yan i guinaha.\n'''I tinige' gi hilo' ha'''' para u såtba annai un yemme' \"{{int:savearticle}}\".",
+       "explainconflict": "Guåha otru na tinilaika gi påhina ginen i tiempon tumutuhon hao tumulaika.\nMa'annok i tinige' gi hilo' komu på'go.\nMa'annok i tinilaika-mu gi papa'.\nPara un nesita muna'daña i tinilaika-mu yan i guinaha.\n'''I tinige' gi hilo' ha'''' para u såtba annai un yemme' \"$1\".",
        "yourtext": "Tinige'-mu",
        "storedversion": "Tinilaika masåtba",
        "editingold": "'''ADAHI: Un tulalaika un ribision påhina gus bihu.\nYanggen un såtba ha', para u fana'malingu i tinilaika siha despues di enao na ribision.'''",
        "prefs-misc": "Misc",
        "saveprefs": "Såtba",
        "prefs-editing": "Tumulaika",
-       "rows": "Fila siha:",
-       "columns": "Kolumna siha:",
        "searchresultshead": "Aligao",
        "recentchangesdays": "Diha siha na para u na'annok gi i tinilaika gi halacha:",
        "recentchangescount": "Kunatu na tinilaika para u na'annok gi i tinilaika gi halacha:",
        "rcshowhideliu": "$1 na muna'sesetbi ni ma log in",
        "rcshowhideanons": "$1 i muna'sesetbi taina'an",
        "rcshowhidemine": "$1 na tinilaika-hu",
-       "rclinks": "Na'annok na $1 tinilaika siha ginen $2 na dihas manmaloffan<br />$3",
+       "rclinks": "Na'annok na $1 tinilaika siha ginen $2 na dihas manmaloffan",
        "diff": "dif",
        "hist": "hist",
        "hide": "Nå'na'",
        "version": "Tinilaika",
        "version-specialpages": "Manespesiat na påhina",
        "fileduplicatesearch-submit": "Aligao",
-       "specialpages": "Manespesiat na påhina",
-       "revdelete-summary": "tulaika i sumaria"
+       "specialpages": "Manespesiat na påhina"
 }
index 2ae2a77..c3c2109 100644 (file)
        "tog-editondblclick": "دەستکاریی پەڕە بە دووکرتە",
        "tog-editsectiononrightclick": "دەستکاریی بەشەکان بە کرتەی ڕاست لەسەر سەردێڕی بەشەکان",
        "tog-watchcreations": "ئەو پەڕانەی من دروستم کردوون و ئەو پەڕگانە من بارم کردوون زیاد بکە بە لیستی چاودێڕییەکەم",
-       "tog-watchdefault": "ئەو پەڕانە  و ئەو پەڕگانە من دەستکاریان دەکەم زیاد بکە بە لیستی چاودێڕییەکەم",
+       "tog-watchdefault": "ئەو پەڕانە و ئەو پەڕگانە من دەستکاریان دەکەم زیاد بکە بە لیستی چاودێڕییەکەم",
        "tog-watchmoves": "ئەو پەڕانە و ئەو پەڕگانە کە من گواستومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم",
        "tog-watchdeletion": "ئەو پەڕانە و ئەو پەڕگانە من سڕیومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم",
+       "tog-watchuploads": "ئەو پەڕگە نوێیانەی باریان دەکەم زیاد بکە ناو پێڕستی چاودێرییەکەمەوە",
+       "tog-watchrollback": "ئەو پەڕانەی کە کرداری گەڕاندنەوەم لەسەر ئەنجام داون زیاد بکە ناو پێڕستی چاودێرییەکەمەوە",
        "tog-minordefault": "ھەموو دەستکارییەکان بە ورد نیشان بکە لە حاڵەتی دیفاڵت",
        "tog-previewontop": "پێشبینین بەرلە چوارچێوەی دەستکاری نیشان بدە‌",
        "tog-previewonfirst": "لە یەکەم دەستکاری دا پێشبینین نیشان بدە",
        "newwindow": "(لە پەڕەیەکی نوێدا دەکرێتەوە)",
        "cancel": "ھەڵوەشاندنەوە",
        "moredotdotdot": "زیاتر",
-       "morenotlisted": "ئەم لیستەیە تەواو نییە",
+       "morenotlisted": "ئەم لیستە لەوانەیە تەواو نەبێت",
        "mypage": "پەڕە",
        "mytalk": "لێدوان",
        "anontalk": "لێدوان",
        "searcharticle": "بڕۆ",
        "history": "مێژووی پەڕە",
        "history_short": "مێژووی پەڕە",
+       "history_small": "مێژوو",
        "updatedmarker": "لە دوایین سەردانمدا نوێ کراوەتەوە",
        "printableversion": "وەشانی ئامادەی چاپ",
        "permalink": "بەستەری ھەمیشەیی",
        "view": "بینین",
        "view-foreign": "لە $1دا بیبینە",
        "edit": "دەستکاری",
+       "edit-local": "دەستکاریکردنی زانیارییە ناوخۆییەکان",
        "create": "دروستکردن",
        "create-local": "وەسفی ناوچەیی زۆر بکە",
        "editthispage": "دەستکاری ئەم پەڕەیە بکە‌",
        "talk": "وتووێژ",
        "views": "بینینەکان",
        "toolbox": "ئامرازەکان",
+       "tool-link-userrights": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
+       "tool-link-userrights-readonly": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
+       "tool-link-emailuser": "ئیمەیلی ئەم {{GENDER:$1|بەکارھێنەر}}ە",
        "userpage": "بینینی پەڕەی بەکارھێنەر",
        "projectpage": "پەڕەی پرۆژە نیشان بدە",
        "imagepage": "پەڕەی پەڕگە نیشان بدە",
        "jumptonavigation": "ڕێدۆزی",
        "jumptosearch": "گەڕان",
        "view-pool-error": "ببورە، لەم کاتەدا ڕاژەکارەکان زیادەباریان لە سەرە.\nژمارەیەکی زۆر لە بەکارھێنەران ھاوکات ھەوڵی دیتنی ئەم پەڕەیان داوە.\nتکایە پێش ھەوڵی دووبارە بۆ دیتنی ئەم پەڕە، نەختێک بوەستە.\n\n$1",
+       "generic-pool-error": "ببورە، لەم کاتەدا ڕاژەکارەکان زیادەباریان لە سەرە.\nژمارەیەکی زۆر لە بەکارھێنەران ھاوکات ھەوڵی دیتنی ئەم پەڕەیان داوە.\nتکایە پێش ھەوڵی دووبارە بۆ دیتنی ئەم پەڕە، کەمێک بووەستە.",
        "pool-timeout": "لەکات دەرچوون ڕوویدا لەکاتی چاوەڕوانکردنی داخستندا",
        "pool-errorunknown": "هەڵەی نەزانراو",
        "aboutsite": "دەربارەی {{SITENAME}}",
        "no-null-revision": "نەتوانرا پێداچوونەوەی خاڵیی بۆ پەڕەی \"$1\" درووست بکرێت",
        "badtitle": "سەرناوی خراپ",
        "badtitletext": "سەرناوی پەڕەی داواکراو بەتاڵە، واڵایە یان سەرناوێکی نێوان-زمانی یان نێوانی-ویکییە کە بە شێوەیەکی ھەڵە بەستەری بۆ دراوە.\nڕەنگە یەک یان چەند کاراکتەری تێدا بێت کە ناکرێت لە سەرناوەکاندا بەکار بھێنرێت.",
+       "title-invalid-empty": "ئەو پەڕەیەی داواکراوە بەتاڵە یان تەنھا لە بۆشایی-ناو پێکھاتووە.",
+       "title-invalid-talk-namespace": "ئەو ناوی پەڕەیەی داواکراوە ئاماژە بۆ پەڕەیەکی وتووێژ دەکات کە نابێت ھەبێت.",
+       "title-invalid-characters": "سەرناوی ئەو پەڕەیەی داواکراوە کارەکتەرێکی ھەڵەی تێدا بەکارھاتووە: «$1».",
        "perfcached": "داتای خوارەوە پاشەکەوتکراوەیە و لەوانەیە بەڕۆژنەکرابێتەوە. لانی زۆر {{PLURAL:$1|یەک ئەنجام|$1 ئەنجام}} لە cacheدا لەبەردەستدایە.",
        "perfcachedts": "داتای خوارەوە cacheکراوە و دوایین جار لە $1 نوێ کراوەتەوە. لە cacheدا لانی زۆر {{PLURAL:$4|یەک ئەنجام|$4 ئەنجام}} لەبەردەستە.",
        "querypage-no-updates": "تازەکردنەوەکان بۆ ئەم پەڕە لە حاڵی ئێستادا ناچالاک کراوەتەوە.\nداتای ئێرە دەسبەجێ تازە ناکرێتەوە.",
        "viewsource": "بینینی سەرچاوە",
        "viewsource-title": "سەرچاوەی $1 ببینە",
        "actionthrottled": "چالاکی پێشی پێ گیرا",
-       "actionthrottledtext": "بÛ\95 Ù\85Û\95بÛ\95ستÛ\8c Ù¾Û\8eشگرÛ\8cÛ\8c Ù\84Û\95 Ø³Ù¾Û\95Ù\85Ø\8c Ú\95Û\8eÚ¯Û\95 Ù\86ادرÛ\8eت ØªÛ\86 Ù\84Û\95 Ù\85اÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ú©Ù\88رت Ø¯Ø§ Ù\84Û\95 Ø³Û\95ر Û\8cÛ\95Ú© Ø¦Û\95Ù\85Û\95 Ø²Û\86ر Ø¬Ø§Ø± Ø¦Û\95Ù\86جاÙ\85 Ø¨Ø¯Û\95Û\8cØ\8c Ù\88Û\95 ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
+       "actionthrottledtext": "بÛ\95 Ù\85Û\95بÛ\95ستÛ\8c Ù¾Û\8eشگرÛ\8cÛ\8c Ù\84Û\95 Ø®Ø±Ø§Ù¾Ú©Ø§Ø±Û\8cØ\8c Ú\95Û\8eÚ¯Û\95 Ù\86ادرÛ\8eت ØªÛ\86 Ù\84Û\95 Ù\85اÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ú©Ù\88رت Ø¯Ø§ Ù\84Û\95 Ø³Û\95ر Û\8cÛ\95Ú© Ø¦Û\95Ù\85Û\95 Ø²Û\86ر Ø¬Ø§Ø± Ø¦Û\95Ù\86جاÙ\85 Ø¨Ø¯Û\95Û\8cØ\8c ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
        "protectedpagetext": "بۆ بەرگری لە دەستکاریکردن یان چالاکییەکانی تر ئەم پەڕەیە پارێزراوە.",
        "viewsourcetext": "دەتوانی سەرچاوەی ئەم پەڕە ببینی و کۆپیی بکەی٫",
        "viewyourtext": "دەتوانی ژێدەری <strong>دەستکارییەکەت</strong> لەم پەڕەیەدا ببینی و کۆپی بکەی.",
        "virus-scanfailed": "سکەن ئەنجام نەدرا(کۆد $1)",
        "virus-unknownscanner": "دژەڤایرس نەناسراوە:",
        "logouttext": "'''ئێستا چوویتە دەرەوە.'''\n\nئاگادار بە ھەتا ئەو کاتەی کەشی وێبگەڕەکەت پاک دەکەیتەوە، لەوانەیە ھەندێک لە پەڕەکان وا پێشان بدرێن کە ھێشتا لە ژوورەوە بیت.",
+       "cannotlogoutnow-title": "ناتوانیت لە ئێستادا بچیتە دەرەوە",
+       "cannotlogoutnow-text": "توانای چوونە دەرەوەت نییە لەکاتی بەکارھێنانی $1",
        "welcomeuser": "بەخێربێیت، $1!",
        "welcomecreation-msg": "ھەژمارەکەت دروست کرا.\nلە بیرت نەچێت [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ت بگۆڕی.",
        "yourname": "ناوی بەکارھێنەری:",
        "createacct-yourpasswordagain-ph": "تێپەروشە دیسان بنووسەوە",
        "userlogin-remembermypassword": "چوونەژوورەوەکەم ڕابگرە",
        "userlogin-signwithsecure": "پەیوەندیی دڵنیا بەکاربھێنە",
+       "cannotlogin-title": "ناتوانیت بچیتە ژوورەوە",
+       "cannotlogin-text": "توانای چوونەژوورەوەت نییە",
+       "cannotloginnow-title": "ناتوانیت لە ئێستادا بچیتە ناوەوە",
+       "cannotloginnow-text": "توانای چوونەژوورەوەت نییە لەکاتی بەکارھێنانی $1",
+       "cannotcreateaccount-title": "ناتوانرێت ھەژمار دروست بکرێت",
        "yourdomainname": "دۆمەینەکەت:",
        "password-change-forbidden": "ناتوانیت تێپەڕوشەکانت لەم ویکییەدا بگۆڕیت.",
        "externaldberror": "یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.",
        "login": "بچۆ ژوورەوە",
+       "login-security": "شوناست دڵنیا بکەرەوە",
        "nav-login-createaccount": "بچۆ ژوورەوە / ھەژمار دروست بکە",
-       "userlogin": "بچۆ ژوورەوە / ھەژمار دروست بکە",
-       "userloginnocreate": "بچۆ ژوورەوە",
        "logout": "بچۆ دەرەوە",
        "userlogout": "بچۆ دەرەوە",
        "notloggedin": "لە ژوورەوە نیت",
        "userlogin-noaccount": "ھەژمارت نییە؟",
        "userlogin-joinproject": "ببە بە ئەندامی {{SITENAME}}",
-       "nologin": "ھەژمارت نییە؟  $1.",
-       "nologinlink": "ھەژمارێک دروست بکە",
        "createaccount": "ھەژمار دروست بکە",
-       "gotaccount": "ھەژمارت ھەیە لێرە؟ $1.",
-       "gotaccountlink": "بچۆ ژوورەوە",
-       "userlogin-resetlink": "وردەکارییەکانی چوونەژوورەوەتت لە بیر کردووە؟",
        "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-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": "ھەڵە لە دروستکردنی ھەژمار",
        "nocookiesnew": "ھەژماری بەکارھێنەری دروست کرا، بەڵام نەچوویتەوە ژوورەوە.\n{{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر کوکی بەکاردەھێنێت.\nتۆ کوکییەکەکەت لەکارخستووە.\nتکایە کوکییەکە کارا بکە، پاشان بە ناوی بەکارھێنەری و تێپەڕوشەکەت بچۆ ژوورەوە.",
        "nocookieslogin": "{{SITENAME}} بۆ چوونەژوورەوە لە کووکی‌یەکان کەڵک وەرئەگرێت.\nڕێگەت نەداوە بە کووکی‌یەکان.\nڕێگەیان پێ بدەو و دیسان تێبکۆشە.",
        "nocookiesfornew": "ھەژماری بەکارھێنەری دروست نەکرا، چون ناتوانین سەرچاوەکەی پشتڕاست بکەینەوە.\nدڵنیا بە کوکییەکانت چالاک کردووە، پەڕەکە بار بکەوە و دیسان ھەوڵ بدە.",
+       "createacct-loginerror": "ھەژمارەکە بە سەرکەوتوانە دروست کرا، بەڵام ناتوانرێت بە شێوەیەکی ئۆتۆماتیکی بکرێیتە ژوورەوە. تکایە سەردانی [[Special:UserLogin|ڕێنماییەکانی چوونەژوورەوە]] بکە.",
        "noname": "ناوی بەکارهێنەرییەکی گۆنجاوت دیاری نەکردووه.",
        "loginsuccesstitle": "چوویە ناوەوە",
        "loginsuccess": "'''ئێستا بە ناوی «$1»ەوە لە {{SITENAME}} چوویتەتەژوورەوە.'''",
-       "nosuchuser": "بەکارھێنەرێک بە ناوی «$1» نیە.\nناوی بەکارھێنەر بە گەورە و بچووک بوونی پیتەکان ھەستیارە.\nڕێنووسەکەت چاولێکەرەوە، یان [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]].",
+       "nosuchuser": "بÛ\95کارھÛ\8eÙ\86Û\95رÛ\8eÚ© Ø¨Û\95 Ù\86اÙ\88Û\8c Â«$1» Ù\86Û\8cÛ\8cÛ\95.\nÙ\86اÙ\88Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر Ø¨Û\95 Ú¯Û\95Ù\88رÛ\95 Ù\88 Ø¨Ú\86Ù\88Ù\88Ú© Ø¨Ù\88Ù\88Ù\86Û\8c Ù¾Û\8cتÛ\95کاÙ\86 Ú¾Û\95ستÛ\8cارÛ\95.\nÚ\95Û\8eÙ\86Ù\88Ù\88سÛ\95Ú©Û\95ت Ú\86اÙ\88Ù\84Û\8eÚ©Û\95رÛ\95Ù\88Û\95Ø\8c Û\8cاÙ\86 [[Special:CreateAccount|Ú¾Û\95Ú\98Ù\85ارÛ\8eÚ©Û\8c Ù\86Ù\88Û\8e Ø¯Ø±Ù\88ست Ø¨Ú©Û\95]].",
        "nosuchusershort": "بەکارھێنەرێک بە ناوی «$1»ەوە نیە.\nبە نووسراوەکەتدا بچۆرەوە.",
        "nouserspecified": "دەبێت ناوێکی بەکارھێنەری دەستنیشان بکەیت.",
        "login-userblocked": "ئەم بەکارهێنەرە بڵۆک کراوە. چوونەژوورەوە ڕێگەپێنەدراوە.",
        "wrongpassword": "تێپەڕوشەی ھەڵە.\nتکایە دووبارە تێبکۆشە.",
        "wrongpasswordempty": "تێپەڕەوشەی لێدراو بەتاڵبوو.\nتکایە هەوڵ بدەوە.",
        "passwordtooshort": "تێپەڕوشەکەت لانی کەم دەبێ {{PLURAL:$1|١ پیت|$1 پیت}} بێت.",
+       "passwordtoolong": "تێپەڕ وشەکان ناتوانرێت لە {{PLURAL:$1|١ کارەکتەر|$1 کارەکتەر}} درێژتر بێت.",
+       "passwordtoopopular": "تێپەڕ وشە باوەکان ناتواندرێت دابنرێن. تکایە تێپەڕ وشەیەکی دەگمەنتر ھەڵبژێرە.",
        "password-name-match": "تێپەڕوشەکەت ئەبێ جیاواز بێت لە ناوی بەکارهێنەریت.",
        "password-login-forbidden": "بەکارهێنانی ئەم ناوی بەکارهێنەر و تێپەڕەووشەیە قەدەغەکراوە.",
        "mailmypassword": "تێپەڕوشەکە ڕێک بخەوە",
        "noemail": "ھیچ ئەدرەسێکی ئیمەیل تۆمار نەکراوە بۆ بەکارھێنەر « $1 ».",
        "noemailcreate": "دەبێ ناونیشانێکی دروستی ئیمەیل بنووسی",
        "passwordsent": "تێپەڕوشەیەکی نوێ نێررا بۆ ئەدرەسی ئیمێلی تۆمارکراوی «$1».\nتکایە دوای وەرگرتنی، دیسان بچۆ ژوورەوە.",
-       "blocked-mailpassword": "ئادرەسی ئای‌پی تۆ بۆ دەستکاری کردن بەستراوه بۆیە بۆ بەرگری لە بەکارهێنانی نابەجێ ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە.",
+       "blocked-mailpassword": "ناونیشانی ئای پی تۆ بۆ دەستکاری کردن بەستراوه. بۆ بەرگری لە بەکارهێنانی نابەجێ، ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە لەسەر ئەم ناونیشانە ئای پییە.",
        "eauthentsent": "ئیمێلێکی پشتڕاستکردنەوە بۆ ناونیشانی ئیمێلی دیاریکراو نێررا.\nپێش ئەوەی ئیمەیلی تر بۆ ئەم ھەژمارە بنێررێت، دەبێت پەیڕەوی ڕێکارەکانی ناو ئیمێلەکە بکەیت بۆ پشتڕاستکردنەوەی ئەوەی کە ئەم هەژمارە بە ڕاستی ھی تۆیە.",
        "throttled-mailpassword": "ئیمەیلێکی ڕیکخستنەوەی تێپەڕوشە لە ماوەی {{PLURAL:$1|ساعەت}}ی ڕابردوودا نێردراوە.\nبۆ ڕێگری لە بەکارھێنانی خراپ، ھەر {{PLURAL:$1|ساعەت}} تاکە یەک ئیمەیلی ڕیکخستنەوەی تێپەڕوشە دەنێردرێت.",
        "mailerror": "هەڵە ڕوویدا لە ناردنی ئیمەیل: $1",
-       "acct_creation_throttle_hit": "بینەرانی ویکی بەکەڵک وەرگرتن لەم ئای‌پی ئەدرەسەی تۆ لە ڕۆژانی ڕابردوودا، دەستیان کردە بە درووست‌کردنی {{PLURAL:$1|هەژمارە}}، کە زۆرینە ڕیگەپێدان لە یەک ماوە‌دایە.\nوەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئای‌پی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووست‌بکەن.",
+       "acct_creation_throttle_hit": "بینەرانی ویکی بەکەڵک وەرگرتن لەم ناونیشانی ئای-پییەی تۆ لە ڕۆژانی ڕابردوودا، دەستیان کردە بە درووست‌کردنی {{PLURAL:$1|هەژمارە}}، کە زۆرینە ڕیگەپێدان لە یەک ماوە‌دایە.\nوەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئای‌پی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووست‌بکەن.",
        "emailauthenticated": "ناونیشانی ئیمەیلەکەت پشتڕاست کرایەوە لە $3ی $2دا.",
        "emailnotauthenticated": "ناونیشانی ئیمەیلەکەت ھێشتا پشتڕاست نەکراوتەوە.\nھیچ ئیمەیلێک بۆ ئەم تایبەتمەندییانەی ژێرەوە نانێردرێت.",
        "noemailprefs": "بۆ کەوتنە کاری ئەو تایبەتمەندیانە، لە هەڵبژاردەکانت ئەدرەسەکی ئی‌مێڵ دابین بکە.",
        "createaccount-title": "درووست کردنی ھەژمار بۆ {{SITENAME}}",
        "createaccount-text": "کەسێک ھەژمارێکی بۆ ناونیشانی ئیمێلی تۆ لە {{SITENAME}}دا ($4) بە ناوی «$2»ـەوە و بە تێپەڕوشەی  «$3»ـەوە دروست کردووە.\nدەبێت ھەر ئێستا بچیتە چوورەوە و تێپەڕوشەیەکەت بگۆڕیت.\n\nئەگەر ئەم ھەژمارە بە ھەڵە دروست کراوە، دەکرێت گوێ بەم پەیامە نەدەیت.",
        "login-throttled": "زۆر زۆر ھەوڵت داوە بۆ چوونە ژوورەوە.\nتکایە $1 بوەستە پێش ھەوڵی دووبارە.",
+       "login-abort-generic": "چوونەژوورەوەکەت شکستی ھێنا - بەجێ ھێڵدرا",
+       "login-migrated-generic": "ھەژمارەکەت گوازراوەتەوە و ناوی بەکارھێنەرەکەت چی تر لەسەر ئەم ویکیپیدیایە بوونی نییە.",
        "loginlanguagelabel": "زمان: $1",
+       "suspicious-userlogout": "داواکارییەکەت بۆ چوونە دەرەوە ڕەت کرایەوە لەبەر ئەوەی وا دیارە داواکارییەکە لەلایەن براوسەرێکی شکاوەوە نێردراوە.",
+       "createacct-another-realname-tip": "ناوی ڕاستیت پێویست نییە.\nئەگەر ھەڵت بژارد کە دایبنێیت، ئەوا بەکار دەھێندرێت بۆ ئاماژە کردن بە بەکارھێنەر بۆ بەشدارییەکانیان.",
        "pt-login": "بچۆ ژوورەوە",
        "pt-login-button": "بچۆ ژوورەوە",
+       "pt-login-continue-button": "بەردەوامبوونی چوونەژوورەوە",
        "pt-createaccount": "ھەژمار دروست بکە",
        "pt-userlogout": "بچۆ دەرەوە",
+       "user-mail-no-addy": "ھەوڵی ناردنی ئیمەڵ درا بەبێ ھەبوونی ناونیشانێکی ئیمەیڵ.",
+       "user-mail-no-body": "ھەوڵی ناردنی پۆستی ئەلیکترۆنی درا بە ناوەڕۆکێکی بەتاڵ یان زۆر کورت.",
        "changepassword": "تێپەڕوشە بگۆڕە",
        "resetpass_announce": "بۆ کۆتایی چوونە ژوورەوە، دەبێت تێپەڕوشەیەکی نوێ دابنێیت.",
        "resetpass_text": "<!-- تێپه‌ڕه‌وشه‌ی هه‌ژماره‌كه‌ سفر بكه‌ره‌وه‌ -->",
        "retypenew": "تێپەڕوشەی نوێ دوبارە بنووسەوە:",
        "resetpass_submit": "تێپەڕوشە رێکخە و بچۆ ژوورەوە",
        "changepassword-success": "تێپەڕەوشەکەت  گۆڕدرا!",
+       "changepassword-throttled": "تۆ ھەوڵی زۆری چوونەژوورەوەت داوە. \nتکایە $1 چاوەڕوان بە پێش دووبارە ھەوڵدانەوە.",
+       "botpasswords": "تێپەڕ وشەی بۆت",
+       "botpasswords-disabled": "تێپەڕ وشەی بۆتەکان کوژێنرانەوە.",
+       "botpasswords-no-central-id": "بۆ بەکارھێنانی تێپەڕوشەی بۆت، دەبێت بە ھەژمارێکی جێگیر بچیتە ژوورەوە.",
+       "botpasswords-createnew": "تێپەڕوشەیەکی بۆتی نوێ دروست بکە",
+       "botpasswords-editexisting": "تێپەڕوشەیەک کە ھەیە دەستکاری بکە",
+       "botpasswords-label-appid": "ناوی بۆت",
        "botpasswords-label-create": "دروستکردن",
        "botpasswords-label-update": "نوێکردنەوە",
        "botpasswords-label-cancel": "ھەڵوەشاندنەوە",
        "botpasswords-label-delete": "سڕینەوە",
        "botpasswords-label-resetpassword": "ڕێکخستنەوەی تێپەڕوشە",
+       "botpasswords-bad-appid": "ناوی بۆت «$1» دروست نییە.",
+       "botpasswords-insert-failed": "نەتواندرا ناوی بۆت «$1» زیاد بکرێت. ئایا پێشووتر زیاد کراوە؟",
+       "botpasswords-update-failed": "نەتواندرا ناوی بۆت «$1» نوێ بکرێتەوە. ئایا سڕدراوەتەوە؟",
+       "botpasswords-created-title": "تێپەڕ وشەی بۆت دروست کرا",
+       "botpasswords-created-body": "تێپەڕوشەی بۆت بۆ بۆتی «$1» بەکارھێنەر «$2» دروست کرا.",
+       "botpasswords-updated-title": "تێپەڕ وشەی بۆتەکە نوێ کرایەوە",
+       "botpasswords-updated-body": "تێپەڕ وشەی بۆت بۆ «$1»ی بەکارھێنەر «$2» نوێ کرایەوە.",
+       "botpasswords-deleted-title": "تێپەڕ وشەی بۆت سڕدرایەوە",
        "resetpass_forbidden": "تێپەڕوشەکە ناگۆڕدرێت",
        "resetpass-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.",
        "resetpass-submit-loggedin": "تێپەڕوشە بگۆڕە",
        "resetpass-submit-cancel": "ھەڵوەشاندنەوە",
        "resetpass-wrong-oldpass": "تێپەڕوشەی ھەنووکەیی یان تێپەڕوشەی کاتی ھەڵەیە.\nوا دیارە تێپەڕوشەکەت بە سەرکەوتوویی گۆڕدراوە یان داوای تێپەڕوشەیەکی نوێت کردووە.",
+       "resetpass-recycled": "تکایە تێپەڕوشەکەت بگۆڕە بە دانەیەکی جیاواز لەوەی ئێستا.",
+       "resetpass-temp-emailed": "تۆ بە تێپەڕوشەیەکی کاتیی ھاتوویتە ژوورەوە. بۆ تەواوکردنی چوونە ژوورەوە تێپەڕوشەیەکی نوێ لێرە دابنێ.",
        "resetpass-temp-password": "تێپەڕوشەی کاتی:",
+       "resetpass-expired": "تێپەڕ وشەکەت بەسەر چووە، تکایە تێپەڕ وشەیەکی نوێ دابنێ بۆ چوونە ژوورەوە",
+       "resetpass-validity-soft": "تێپەڕ وشەکەت دروست نییە: $1",
        "passwordreset": "ڕێکخستنەوەی تێپەڕوشە",
+       "passwordreset-text-one": "ئەم فۆرمە تەواو بکە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ",
+       "passwordreset-text-many": "{{PLURAL:$1|یەکێک لەم بۆشاییانە بڕ بکەرەوە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ}}",
        "passwordreset-username": "ناوی بەکارھێنەری:",
        "passwordreset-domain": "پاوان:",
        "passwordreset-email": "ناونیشانی ئیمەیل:",
        "passwordreset-emailtext-ip": "‫کەسێک (لەوانەیە خۆت، بە ناونیشانی ئایپیی $1) داوای ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە،\nیان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، دەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailtext-user": "‫بەکارھێنەر $1 لە {{SITENAME}} ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە، یان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، \nدەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailelement": "ناوی بەکارھێنەری: \n$1\n\nتێپەڕوشەی کاتی: \n$2",
-       "passwordreset-emailsentemail": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.",
-       "changeemail": "گۆڕینی ناونیشانی ئیمەیل",
-       "changeemail-header": "ناونیشانی ئیمەیلی ھەژمار بگۆڕە",
+       "passwordreset-emailsentemail": "ئەگەر ناونیشانی ئەم ئیمەیڵە بەستراوەتەوە بە ھەژمارەکەتەوە، ئەوا ڕێکخستنەوەی تێپەڕ وشەت بە ئیمەیڵ پێ دەگات.",
+       "passwordreset-emailsentusername": "ئەگەر ناونیشانی ئەم ئیمەیڵە بەستراوەتەوە بە ناوی بەکارھێنەرتەوە، ئەوا ڕێکخستنەوەی تێپەڕ وشەت بە ئیمەیڵ پێ دەگات.",
+       "passwordreset-invalidemail": "ناونیشانی ئیمەیڵی نەگونجاو",
+       "passwordreset-nodata": "نە ئیمەیڵێک یان ناوی بەکارھێنەرێک ھەڵبژێردرا",
+       "changeemail": "گۆڕین یان لابردنی ناونیشانی ئیمەیل",
+       "changeemail-header": "ئەم فۆرمە تەواو بکە بۆ گۆڕینی ناونیشانی ئیمەیڵەکەت. ئەگەر ئارەزووی ئەوە دەکەیت کە ھەر ئیمەیڵێک لە ھەژمارەکەت بکەیتەوە، بۆشایی ئیمەیڵی نوێ بە بەتاڵی بەجێ بھێڵە لەکاتی پاشەکەوتکردنی فۆرمەکە.",
        "changeemail-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە دەبێت بچیتە ژوورەوە.",
        "changeemail-oldemail": "ئەدرەسی ئیمەیڵی ئێستا:",
        "changeemail-newemail": "ناونیشانی ئیمەیلی نوێ:",
+       "changeemail-newemail-help": "ئەم بۆشاییە دەبێت خاڵی بێت ئەگەر دەتەوێت ناونیشانی ئیمەیڵەکەت لابەریت. تۆ ناتوانیت ئیمەیڵی ڕێکخستنەوەی تێپەڕە وشە یاخود ھەر ئیمەیڵێکی تری ئەم ویکییەت پێ بگات ئەگەر ناونیشانی پۆستە ئەلیکترۆنییەکە لاببرێت.",
        "changeemail-none": "(ھیچ)",
        "changeemail-password": "تێپەڕوشەکەت لە {{SITENAME}}:",
        "changeemail-submit": "ئەمەیل بگۆڕە",
+       "changeemail-nochange": "تکایە ناونیشانی ئیمەیڵێکی جیاواز بەکار بھێنە.",
        "bold_sample": "دەقی ئەستوور",
        "bold_tip": "دەقی ئەستوور",
        "italic_sample": "دەقی لار",
        "sig_tip": "واژووەکەت بە مۆری ڕێکەوتەوە",
        "hr_tip": "هێڵی ئاسۆیی (دەگمەن بەکاری بێنە)",
        "summary": "کورتەی دەستکاری:",
-       "subject": "بابەت/سەردێڕ:",
+       "subject": "بابەت:",
        "minoredit": "ئەمە دەستکارییەکی بچووکە",
        "watchthis": "ئەم پەڕەیە بخە ژێر چاودێری",
        "savearticle": "پەڕەکە پاشەکەوت بکە",
        "savechanges": "پاشەکەوتکردنی گۆڕانکارییەکان",
+       "publishpage": "بڵاوکردنەوەی پەڕە",
+       "publishchanges": "پاشەکەوتکردنی گۆڕانکارییەکان",
        "preview": "پێشبینین",
        "showpreview": "پێشبینین نیشان بدە",
        "showdiff": "گۆڕانکارییەکان نیشان بدە",
+       "blankarticle": "<strong>ئاگاداری:</strong> ئەو پەڕەیەی کە ھەوڵی دروستکردنی دەدەیت واڵایە. ئەگەر کرتە لەسەر «$1» بکەیت دووبارە، پەڕەکە بەبێ ھیچ ناوەڕۆکێک دروست دەبێت.",
        "anoneditwarning": "<strong>ھۆشیار بە:</strong> نەڕۆیشتووتەتە ژوورەوە. ھەر دەستکارییەک بکەیت ناونیشانی IPیەکەت بۆ ھەموو کەسێک دیار دەبێت. بەڵام ئەگەر <strong>[$1 بچیتە ژوورەوە]</strong> یان <strong>[$2 ھەژمارێک دروست بکەیت]</strong>، دەستکارییەکانت بە ناوی بەکارھێنەرییەکەتەوە بڵاو دەبێتەوە و لە چەند قازانجی تریشی ھەیە.",
        "anonpreviewwarning": "«نەڕۆشتوویتە ژوورەوە. پاشەکەوتکردن، ئەدرەسی IPەکەت لە مێژووی دەستکاریی ئەم پەڕە تۆمار دەکات.»",
        "missingsummary": "'''وە بیر خستنەوە:''' پوختەیەکت نەنووسیوە بۆ چۆنیەتی گۆڕانکارییەکەت.\nئەگەر جارێکی تر پاشکەوت کردن لێبدەی، بێ پوختە تۆمار دەکرێ.",
+       "selfredirect": "<strong>ئاگاداری:</strong> تۆ خەریکی گواستنەوەی ئەم پەڕەیەیت بۆ سەر خۆی. لەوانەیە خەریکی گواستنەوەی پەڕەیەکی ھەڵە بیت یان ھەوڵی گواستنەوە دەدەیت بۆ ئامانجێکی ھەڵە. \nئەگەر دووبارە کرتە لەسەر «$1» بکەیتەوە، ڕەوانەکەرەکە دروست دەکرێت بەھەرحاڵ.",
        "missingcommenttext": "تکایە لە خوارەوە شرۆڤەیەک بنووسە.",
-       "missingcommentheader": "'''بیرهێنانەوە:''' بۆ ئەم بۆچوونەت سەردێڕ\\بابەت ڕاچاو نەکردووە.\nئەگەر دیسان «{{int:savearticle}}» لێبدەی، دەستکاریەکەت بێ سەردێڕ یان بابەت پاشەکەوت دەبێ.",
+       "missingcommentheader": "'''بیرهێنانەوە:''' بۆ ئەم بۆچوونەت سەردێڕ\\بابەت ڕاچاو نەکردووە.\nئەگەر دیسان «$1» لێبدەی، دەستکاریەکەت بێ سەردێڕ یان بابەت پاشەکەوت دەبێ.",
        "summary-preview": "پێشبینینی کورتە:",
-       "subject-preview": "پێشبینینی بابەت/سەردێڕ:",
+       "subject-preview": "پێشبینینی بابەت:",
+       "previewerrortext": "ھەڵەیەک دروست بوو لەکاتی ھەوڵدان بۆ بینینی دەستکارییەکانت.",
        "blockedtitle": "بەکارھێنەر بەربەست کراوە",
        "blockedtext": "'''ناوی بەکارهێنەری یان ئای‌پی ئەدرەسی تۆ بەربەست‌ کراوە.'''\n\nبەربەست لە لایەن $1 کراوە.\nهۆکاری بەربەست کردن ''$2''ە.\n\n* دەستپێکی بەربەست‌کران: $8\n* کۆتایی هاتنی بەربەست‌کران: $6\n* بابەتی بەربەست: $7\n\nبۆ وتووێژ سەبارەت بە بەربەست‌کرانەکە دەبێ پەیوەندی بکەی بە $1 یان یەکێ دی لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوبەران]].\nلە بیرت بێ تاکوو ئیمەیل ئەدرەسێکی بڕوا پێ‌کراو لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ڕاچاو نەکەی، نابێت لە هەلی «ئیمەیل ناردن بۆ ئەم بەکارهێنەرە» کەڵک وەر بگری؛ کەڵک وەرگرتن لەوە بەربەست نەکراوە بۆت.\n\nئای‌پی ئەدرەسی ئێستای تۆ $3 و پێناسەی بەربەست‌کراو #$5.\nتکایە لە هەر پرس و داواکاریەکت‌دا هەموو وردەکاریەکانی سەرەوە بگونجێنە.",
        "autoblockedtext": "ناونیشانی IPی تۆ بە شێوەی خۆکارانە بەرگیری لێ کراوە چوونکە بەکارھێنەرێکی دیکە بە خراپی بە کاری ھێناوە و بە دەستی $1 بەرگیری لێ کراوە.\nبەم ھۆکارەوە:\n\n:<em>$2</em>\n\n* دەست پێ کردنی بەرگیری: $8\n* بە سەر چوونی بەرگیری: $6\n* Intended blockee: $7\n\nدەتوانیت پەیوەندی بکەیت بە $1 یان یەکێکی دیکە لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوەبەران]] بۆ وتووێژ لە سەر بەرگیرییەکە.\n\nتێ بگە کە ناتوانیت ئامرازی «ئیمێل بنێرە بۆ ئەم بەکارھێنەرە» بە کار بھێنیت مەگەر ئەوەی کە پێشتر لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]]تدا ناونیشانێکی گونجاوی ئیمێلت تۆمار کردبێت و بەرگیریت لێ نەکرابێت لە بەکارھێنانی ئەو ئامرازەش.\n\nناونیشانی IPی ئێستای تۆ $3ـە و پێناسەی یەرگیرییەکە #$5ـە.\nتکایە ھەموو وردەکارییەکانی سەرەوە ھەبێت لە ھەر پرس و داوایک کە دەیکەیت.",
        "accmailtext": "تێپەڕوشەیەک کە بە هەڕەمەکی بۆ [[User talk:$1|$1]] دروست کرا، نێررا بۆ $2. دەتوانیت لە پەڕەی <em>[[Special:ChangePassword|گۆڕینی تێپەڕوشەدا]]</em> لە کاتی چوونەژوورەوەدا بیگۆڕی.",
        "newarticle": "(نوێ)",
        "newarticletext": "بە دوای بەستەری پەڕەیەک کەوتووی کە ھێشتا دروست نەکراوە.\nبۆ دروست کردنی پەڕەکە، لە چوارچێوەکەی خوارەوە دەست بکە بە تایپ کردن. (بۆ زانیاری زورتر\n[$1 یارمەتی] ببینە).\nئەگەر بە ھەڵەوە ھاتویتە ئێرە، لە سەر دوگمەی '''back'''ی وێبگەڕەکەت کلیک بکە.",
-       "anontalkpagetext": "----''ئەمە لاپەڕەی وتووێژە بۆ بەکارهێنەرێکی نەناسراوە کە هێشتا هەژمارەی درووست‌نەکردووه یان کەڵکی‌ لێ وەرناگرێ .\nلەبەر ئەوە مەجبوورین ئای‌پی ئەدرەسەکی ژمارەیی بۆ ناساندنی بەکار بێنین.\nئای‌پی ئەدرەسی وا لەوانەیه لە لایەن چەندین بەکارهێنەروە بەکاربێت.\nئەگەر تۆ بەکارهێنەرێکی نەناسراوی و هەست ئەکەی ئەم لێدوانە پەیوەندی بە تۆوە نیە تکایە [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]] یان [[Special:UserLogin|بچۆ ژوورەوە]] لەبەر ئەوەی لەداهاتوودا دەگەڵ بەکارهێنەرانی‌ نەناسراوی دی تێکەڵ نەکرێیت. ''",
+       "anontalkpagetext": "----\n<em>ئەمە لاپەڕەی وتووێژە بۆ بەکارهێنەرێکی نەناسراوە کە هێشتا هەژمارەی درووست نەکردووه یان کەڵکی‌ لێ وەرناگرێ.</em>\nلەبەر ئەوە ناچارین ناونیشانی ئای پی ژمارەیی بۆ ناساندنی بەکار بێنین.\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}}|بۆ ئەم ناوە بگەڕێی]]، یان <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لە لۆگە پەیوەندیدارەکاندا بگەڕێی]</span>، بەڵام ناتوانی ئەم پەڕەیە دروست بکەی.",
+       "missing-revision": "بەسەرداچوونەوەی #$1 پەڕەی «{{FULLPAGENAME}}» بوونی نییە.\n\nئەمە ھەندێک جار ھۆکاری ئەوەیە کە مێژووەکەی بەسەرچووە یاخود پەڕەکە سڕدراوەتە.\nوردەکارییەکان دەتوانرێن ببینرێن لە [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوەدا].",
        "userpage-userdoesnotexist": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.\nتکایە دڵنیا ببەرەوە ئەگەر دەتھەوێت ئەم پەڕەیە دروست یان دەستکاری بکەیت.",
        "userpage-userdoesnotexist-view": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.",
        "blocked-notice-logextract": "ھەنووکە ئەم بەکارھێنەرە بەربەست کراوە.\nدوایین بابەتی لۆگی بەربەستن لە ژێرەوە ھاتووە:",
-       "clearyourcache": "تێبینی:''' لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ cacheی وێبگەڕەکەت پاکبکەیتەوە.\n* '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)\n* '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە  (''⌘-Shift-R'' لەسەر Mac دا)\n* '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر  ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە\n* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
+       "clearyourcache": "<strong>تێبینی:</strong> لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ کاشی وێبگەڕەکەت پاکبکەیتەوە.\n* '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)\n* '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە  (''⌘-Shift-R'' لەسەر Mac دا)\n* '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر  ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە\n* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
        "usercssyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی CSS نوێ‌کەت، پێش پاشەکەوت‌کردن.",
        "userjsyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقی‌کردنەوەی جاڤاسکریپتە نوێ‌کەت، پێش پاشەکەوت‌کردن.",
        "usercsspreview": "<strong>لە بیرت ببێت کە تەنھا خەریکی پێشبینینی CSSـەکەت دەبینیت.\nھێشتا پاشەکەوەت نەکراوە!</strong>",
        "previewnote": "'''لە بیرت نەچێت ئەمە تەنیا پێشبینینە.'''\nگۆڕانکارییەکانت ھێشتا پاشەکەوت نەکراون!",
        "continue-editing": "چوونە سەر بەشی دەستکاریکردن",
        "previewconflict": "ئەم پێشبینینە بە تۆ نیشان ئەدات ئەو دەقەی لە شوێنی دەستکاری سەرەوە داتناوە چۆن بەرچاو ئەکەوێت ئەگەر پاشەکەوتی بکەیت.",
-       "session_fail_preview": "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''\nتکایە دیسان ھەوڵبدەوە.\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونەدەرەوە]] و گەڕانەوەژوورەوە تاقی بکەوە.",
+       "session_fail_preview": "ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی زانیاری و داتاکانی ئەم کۆرسە.\nلەوانەیە ھەژمارەکەت کرابێتە دەرەوە. <strong>تکایە دڵنیا بکەرەوە کە ھێشتا لە ژوورەوەیت و دووبارە ھەوڵ بدەرەوە.</strong>\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونەدەرەوە]] و گەڕانەوەژوورەوە تاقی بکەوە، دواتریش ئەگەر ھێشتا ڕێگەت نەداوە، ڕێگە بە براوسەرەکەت بدە کە ''کوکی'' لەم سایەتەوە وەربگرێت.",
        "session_fail_preview_html": "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''\n\n''لەبەر ئەوەی {{SITENAME}} ڕێگەی داوە بە raw HTML، بۆ بەرگری بەرامبەر بە هێرشەکانی جاڤاسکریپت، پێشبینین شاردراوەتەوە.''\n\n'''ئەگەر ئەمە ھەوڵێکی دەستکاریکردنی ڕەوایە، تکایە دیسان ھەوڵبدەوە.'''\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونە دەرەوە]] گەڕانەوەژوورەوە تاقی بکەوە.",
        "token_suffix_mismatch": "'''دەستکاریەکەت پەسەند نەکرا لەبەر ئەوەی ڕاژەخواز یان وێبگەڕەکەت نووسەکانی خاڵبەندی لەیەک پچڕاندوە.'''<br />\nدەستکاریەکەت بۆ بەرگری لە تێکەڵ‌بوونی دەقی لاپەڕەکە وەر نەگیرا.<br />\nئەمە بڕێ‌جار کاتێ ڕوو ئەدات کە لە خزمەتی پرۆکسی سەر وێب کەڵک وەر بگریت.",
+       "edit_form_incomplete": "<strong>ھەندێک بەشی دەستکارییەکانت بە سێرڤەرەکەمان نەگەیشت. دووبارە سەیری دەستکارییەکانت بکە بۆ دڵنیا بوون لە تەواوییان و دووبارە ھەوڵ بدەرەوە.</strong>",
        "editing": "دەستکاریکردنی $1",
        "creating": "دروستکردنی $1",
        "editingsection": "دەستکاریکردنی $1 (بەش)",
        "editingcomment": "دەستکاریکردنی $1 (بەشی نوێ)",
        "editconflict": "کێشەی دەستکاری: $1",
-       "explainconflict": "کەسێکی تر ئەم پەڕەیە گۆڕیوە لەو کاتەوە تۆ دەستکاریکردنیت دەستپێکردووە.\nبەشی سەرەوەی دەق، شێوازی ئێستای پەڕەکە لە خۆ ئەگرێت.\nگۆڕانکاریەکانی تۆش لە بەشی خوارەوەی دەق نیشان‌دراوە.\nدەبێ گۆڕانکاریەکانی خۆت لەگەڵ ئێستەی پەڕەکەدا تێکەڵبکەی.\n'''تەنیا''' ئەو دەقەی بەشی سەرەوە پاشەکەوت دەبێت، کاتێ «{{int:savearticle}}\" لێدەدەی.",
+       "explainconflict": "کەسێکی تر ئەم پەڕەیە گۆڕیوە لەو کاتەوە تۆ دەستکاریکردنیت دەستپێکردووە.\nبەشی سەرەوەی دەق، شێوازی ئێستای پەڕەکە لە خۆ ئەگرێت.\nگۆڕانکاریەکانی تۆش لە بەشی خوارەوەی دەق نیشان‌دراوە.\nدەبێ گۆڕانکاریەکانی خۆت لەگەڵ ئێستەی پەڕەکەدا تێکەڵبکەی.\n'''تەنیا''' ئەو دەقەی بەشی سەرەوە پاشەکەوت دەبێت، کاتێ «$1\" لێدەدەی.",
        "yourtext": "دەقی تۆ",
        "storedversion": "پیاچوونەوەی ھەڵگیراو",
        "nonunicodebrowser": "'''ئاگاداری:  وێبگەڕەکەت لە یوونی‌کۆد پاڵپشتی ناکات .'''<br />\nپرۆسەی چارەسەرکردن لە کاردایە بۆ ئەوەی ڕیگەت پێ بدا بە پاراوی دەستکاری لاپەڕەکان بکەیت: ئەو پیتانەی وا ASCII نین لە چوارچێوەی دەستکاری‌کردن‌دا وەک کۆدی ژمارە‌شازدەیی(hexadecimal) نیشان ئەدرێن.",
        "copyrightwarning": "تکایە ئاگادار بە کە هەموو بەشدارییەکان لە {{SITENAME}} وا فەرز دەکرێت کە لە ژێر  $2دا بڵاودەبنەوە (سەیری $1 بکە بۆ وردەکاریەکان).\nئەگەر ناتەوێ نووسراوەکانت بە بێبەزەیی دەستکاری بکرێن و بە دڵخواز دابەشبکرێنەوە، مەینێرە بۆ ئێرە.<br />\nھەروەھا تۆ بەڵێنمان پێدەدەی کە خۆت ئەمەت نووسیوە یان لە پاوانێکی گشتی (public domain) یان سەرچاوە ئازادەکانی وەک ئەو وەرتگرتووە.\n'''ئەو کارانە کە مافی لەبەرگرتنەوەیان پارێزراوەکان بە بێ وەرگرتنی ئیجازە مەنێرە!'''",
        "copyrightwarning2": "ئاگادار بە کە هەموو بەشدارییەکان لە {{SITENAME}} لەوانەیە بەدەستی بەشداربووانی دیکەوە دەستکاری بکرێن، بگۆڕدرێن یا بسڕێنەوە.\nئەگەر ناتەوێ نووسراوەکانت بێبەزەیی دەستکاری بکرێن، ھەر مەینێرە بۆ ئێرە.<br />\nھەروەھا تۆ بەڵێنمان پێدەدەی کە خۆت ئەمەت نووسیوە یان لە پاوانێکی گشتی (public domain) یان سەرچاوە ئازادەکانی وەک ئەو وەرتگرتووە (سەیری $1 بکە بۆ وردەکاریەکان).\n'''ئەو کارانە کە مافی لەبەرگرتنەوەیان پارێزراوەکان بە بێ وەرگرتنی ئیجازە مەنێرە!'''",
        "longpageerror": "'''ھەڵە: ئەو دەقە تۆ ناردووتە {{PLURAL:$1|یەک کیلۆبایت|$1 کیلۆبایت}} درێژە، کە درێژترە لە زۆرینەی {{PLURAL:$2|یەک کیلۆبایت|$2 کیلۆبایت}}.'''\nئەمە پاشەکەوت ناکرێت.",
-       "readonlywarning": "<strong>ئاگادارÛ\8c: Ø¯Ø§ØªØ§Ø¨Û\95Û\8cس Ø¨Û\86 Ú\86اکسازÛ\8c Ø¯Ø§Ø®Ø±Ø§Ù\88Û\95Ø\8c Ø¨Û\86Û\8cÛ\95 Ø¦Û\8eستا Ù\86اتÙ\88اÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86ت Ù¾Ø§Ø´Û\95Ú©Û\95Ù\88ت Ø¨Ú©Û\95Û\8cت.</strong>\nدÛ\95تÙ\88اÙ\86Û\8cت Ø¯Û\95Ù\82Û\95Ú©Û\95ت Ú©Û\86Ù¾Û\8c Ø¨Ú©Û\95Û\8cت Ø¨Û\86 Ù\81اÛ\8cÙ\84Û\8eک و ھەڵی بگریت بۆ دوایی.\nئەو بەڕێوەبەرەی کە دای خستووە، ئەم هۆکارەی دەستنیشان کردووە: $1",
+       "readonlywarning": "<strong>ئاگادارÛ\8c: Ø¨Ù\86Ú©Û\95Û\8c Ø²Ø§Ù\86Û\8cارÛ\8c Ø¨Û\86 Ú\86اکسازÛ\8c Ø¯Ø§Ø®Ø±Ø§Ù\88Û\95Ø\8c Ø¨Û\86Û\8cÛ\95 Ø¦Û\8eستا Ù\86اتÙ\88اÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86ت Ù¾Ø§Ø´Û\95Ú©Û\95Ù\88ت Ø¨Ú©Û\95Û\8cت.</strong>\nدÛ\95تÙ\88اÙ\86Û\8cت Ø¯Û\95Ù\82Û\95Ú©Û\95ت Ù\84Û\95بÛ\95ر Ø¨Ú¯Ø±Û\8cتÛ\95Ù\88Û\95 Ø¨Û\86 Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95ک و ھەڵی بگریت بۆ دوایی.\nئەو بەڕێوەبەرەی کە دای خستووە، ئەم هۆکارەی دەستنیشان کردووە: $1",
        "protectedpagewarning": "'''وشیار بە: ئەم پەڕە پارێزراوە بۆ ئەوی تەنیا ئەو بەکارھێنەرانە کە مافەکانی بەڕێوەبەرایەتییان ھەیە بتوانن دەستکاریی بکەن.'''\nدوایین لۆگ بۆ ژێدەر لە خوارەوەدا ھاتووە:",
        "semiprotectedpagewarning": "'''ئاگاداری:''' ئەم پەڕە داخراوە بۆ ئەوی تەنھا بەکارھێنەرە تۆمارکراوەکان بتوانن دەستکاریی بکەن.\nدوایین لۆگ بۆ ژێدەر لە خوارەوەدا ھاتووە:",
-       "cascadeprotectedwarning": "'''ئاگاداری:''' ئەم لاپەڕە داخراوە بۆیە تەنها ئەو کەسانەی مافی بەڕێوبەرایەتی‌یان هەیە ئەتوانن دەستکاری بکەن، چۆنکا ئەمە {{PLURAL:$1|لاپه‌ڕه‌|لاپه‌ڕانه‌}} لە زنجیرەی پارێزراوەکانی لە خۆ گرتووە‌:",
+       "cascadeprotectedwarning": "'''ئاگاداری:''' ئەم لاپەڕە داخراوە بۆ ئەوەی تەنھا ئەو کەسانەی کە مافی بەڕێوبەرایەتییان هەیە بتوانن دەستکاری بکەن، چوونکە ئەم {{PLURAL:$1|لاپه‌ڕه‌|لاپه‌ڕانه‌}} لە زنجیرەی پارێزراوەکانی لە خۆ گرتووە‌:",
        "titleprotectedwarning": "'''ئاگاداری: ئەم پەڕە داخراوە، بۆئەوەی بۆ درووست‌کردنی [[Special:ListGroupRights|مافە تایبەتەکانت]] پێویستن.'''\nبۆ چاوانە دوایین لۆگ لە خوارەوەدا ھاتووە:",
        "templatesused": "ئەو {{PLURAL:$1|داڕێژەیە کە لەم پەڕەیەدا بە کارھێنراوە|داڕێژانە کە لەم پەڕەیەدا بە کارھێنراون}}:",
        "templatesusedpreview": "ئەو {{PLURAL:$1|داڕێژەیە کە لەم پێشبینینەدا بە کارھێنراوە|داڕێژانە کە لەم پێشبینینەدا بە کارھێنراون}}:",
        "nocreate-loggedin": "ئیجازەی دروست کردنی پەڕەی نوێت نیە.",
        "sectioneditnotsupported-title": "بەش دەستکاریکردنی پشتیوانی ناکرێ",
        "sectioneditnotsupported-text": "دەستکاریکردنی بەش لە پەڕەدا پشتیوانی ناکرێ.",
-       "permissionserrors": "ھەڵەی ئیجازەکان",
+       "permissionserrors": "ھەڵە لە بە دەست ھێنان",
        "permissionserrorstext": "مافی ئەنجامی ئەوەت نیە لەبەر ئەم {{PLURAL:$1|هۆکار|هۆکارانە}} :",
        "permissionserrorstext-withaction": "دەسەڵاتت نییە بۆ $2، لەبەر ئەم {{PLURAL:$1|ھۆکارە|ھۆکارانە}}ی خوارەوە:",
        "recreate-moveddeleted-warn": "'''ھۆشیار بە: خەریکی پەڕەیەک دروست‌ دەکەیتەوە کە لە پێشدا سڕاوەتەوە.'''\n\nئەمە لەبەر چاو بگرە کە دەستکاریکردنی ئەم پەڕەیە بەقازانجە یان نا.\nلۆگی سڕینەوە و گواستنەوەی ئەم پەڕەیە بۆ سانایی لێرەدا ھاتووە:",
        "moveddeleted-notice": "ئەم پەڕەیە سڕاوەتەوە.\nلۆگی سڕینەوە و گواستنەوە بۆ پەڕەکە لە ژێرەوە دابین کراوە.",
+       "moveddeleted-notice-recent": "ببورە، ئەم پەڕەیە بەم زووانە سڕدراوەتەوە (لە ماوەی ٢٤ کاتژمێری پێشوودا). \nلۆگی سڕینەوە و ڕەوانەکردنی پەڕەکە بەردەستن لە خوارەوە لە پەڕاوێزەکاندا.",
        "log-fulllog": "لۆگی تەواو ببینە",
        "edit-hook-aborted": "دەستکاری لە لایەن قولاپەوە ھەڵوەشێنرایەوە.\nھۆکارەکەی لەبەر دەست نییە.",
        "edit-gone-missing": "توانای نوێ‌کردنەوەی لاپەڕەکە نیە.<br />\nلەوە دەچی سڕدرابێتەوه.‌",
        "edit-conflict": "کێشەی دەستکاری.",
        "edit-no-change": "دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.",
+       "postedit-confirmation-created": "پەڕەکە دروست کرا.",
+       "postedit-confirmation-restored": "پەڕەکە ھێنرایەوە.",
        "postedit-confirmation-saved": "دەستکارییەکەت پاشەکەوت کرا.",
        "edit-already-exists": "تواناییی دروستکردنی پەڕەی نوێ نییە.\nئەمە پەڕەیە پێشتر هەبووە.",
        "defaultmessagetext": "دەقی پەیامی هەمیشەیی",
        "invalid-content-data": "دراوەی ناوەرۆکی نادروست",
-       "editwarning-warning": "بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.",
+       "content-not-allowed-here": "«$1» ڕێگە پێنەدراوە لەسەر پەڕەی [[$2]]",
+       "editwarning-warning": "بەجێھێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەستدانی هەموو ئەو گۆڕانکاریانەی کە ئەنجامت داون. ئەگەر لە ژوورەوەیت، دەتوانیت ئەم ئاگادارییە لابەریت لە ھەڵبژاردەی بەکارھێنەرت.",
        "content-model-wikitext": "ویکیدەق",
        "content-model-text": "دەقی ساکار",
        "content-model-javascript": "جاڤاسکریپت",
        "content-model-css": "سی ئێس ئێس",
+       "deprecated-self-close-category": "ئەو پەڕانەی کە تاگی ئێچ تی ئێم ئێڵی خۆ-داخراوی ھەڵە بەکاردەھێنن",
+       "duplicate-args-warning": "<strong>ئاگاداری:</strong> ن [[:$1]] بانگی [[:$2]] دەکات بە بەکارھێنانی زیاتر لە یەک بەھا بۆ پارامەتری «$3.» تەنھا کۆتا بەھای کە پێشکەش کراوە بەکار دەھێندرێت.",
        "expensive-parserfunction-warning": "'''ئاگاداری:''' ئەم لاپەڕە ژمارەیەکی زۆر بانگ‌کەری فەنکشێنی لێک‌کەرەوەی لەخۆ گرتوو.<br /><br />\nئەوە دەبێ کەمتر بێت لە $2 {{PLURAL:$2|بانگ‌کەردن|بانگ‌کەردن}} کە ئێستا {{PLURAL:$1|بانگ‌کردنی|بانگ‌کردنی}} تێدایە.",
        "expensive-parserfunction-category": "ئەو لاپەڕانەی  ژمارەیەکی زۆر بانگ‌کەری فەنکشێنی لێک‌کەرەوەیان لەخۆ گرتووە.",
        "post-expand-template-inclusion-warning": "'''ئاگاداری:''' قەبارەی داڕێژەکە زۆر گەورەیە.\nلەوانەیە ھەندێک لە داڕێژەکان لەخۆنەگرێتەوە.",
        "undo-success": "دەکرێ دەستکاریەکە پووچەڵبکرێتەوە.\nتکایە چاو لەو هەڵسەنگاندنەی خوارەوە بکە تا دڵنیا بیت ئەمە ئەوەیە کە‌ دەتویست بیکەی و دواتر گۆڕانکارییەکانی خوارەوە پاشەکەوت بکە بۆ تەواوکردنی پووچەڵکردنەوەکە.",
        "undo-failure": "لەبەر کێشەی دەست‌تێ‌وەردان، ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەیت.",
        "undo-norev": "ناتوانی دەستکاریەکە ئەنجام‌نەدراو بکەی لەبەر ئەوەی بوونی نیە یا سڕدراوەتەوە.",
+       "undo-nochange": "وا دیارە دەستکارییەکە پووچەڵ کراوەتەوە.",
        "undo-summary": "گەڕاندنەوەی پێداچوونەوەی $1 لە لایەن [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]])",
+       "undo-summary-username-hidden": "پوچەڵکردنەوەی دەستکاری $1 لەلایەن بەکارھێنەرێکی شاردراوەوە.",
        "cantcreateaccount-text": "درووست‌کردنی هەژمارە بۆ ناونیشانی ئای‌پی ('''$1''') لە لایەن [[User:$3|$3]] داخراوە.<br /><br />\n$3 هۆکاری \"$2\" خستوەتەڕوو",
+       "cantcreateaccount-range-text": "دروستکردنی ھەژمار لە مەودای ناونیشانی ئای-پی <strong>$1</strong>، کە ئای-پییەکەی تۆش لەخۆ دەگرێت (<strong>$4</strong>)، بەربەست کراوە لەلایەن [[User:$3|$3]]. \n\nھۆکاری بەربەستنکردنەکەی کە دراوە لەلایەن $3 ئەمەیە: <em>$2</em>",
        "viewpagelogs": "لۆگەکانی ئەم پەڕەیە ببینە",
        "nohistory": "هیچ مێژوویەکی دەستکاری نییە بۆ ئەم پەڕەیە.",
        "currentrev": "دوایین پێداچوونەوە",
        "showhideselectedversions": "دیاریکردنی پێداچوونەوە ھەڵبژێردراوەکان بگۆڕە",
        "editundo": "پووچەڵکردنەوە",
        "diff-empty": "(بەبێ جیاوازی)",
+       "diff-multi-sameuser": "({{PLURAL:$1|یەک دەستکاری مامناوەند|$1 دەستکاری}} لەلایەن ھەمان بەکارھێنەرەوە بیشاننادرێت.",
        "searchresults": "ئاکامەکانی گەڕان",
        "searchresults-title": "ئاکامەکانی گەڕان بۆ «$1»",
        "titlematches": "ئەو سەرناوانەی دەگونجن",
        "search-interwiki-caption": "پرۆژە خوشکەکان",
        "search-interwiki-default": "ئاکام لە $1:",
        "search-interwiki-more": "(زیاتر)",
+       "search-interwiki-more-results": "ئەنجامی زیاتر",
        "search-relatedarticle": "پەیوەست",
        "searchrelated": "پەیوەست",
        "searchall": "ھەموو",
        "prefs-editing": "دەستکاریکردن",
        "searchresultshead": "گەڕان",
        "stub-threshold": "سنوور بۆ شێوازی <a href=\"#\" class=\"stub\">بەستەری کۆڵکە</a> (بایت):",
+       "stub-threshold-sample-link": "نموونە",
        "stub-threshold-disabled": "ناچالاک",
        "recentchangesdays": "ژمارە ڕۆژە نیشاندراوەکان لە دوایین گۆڕانکارییەکان:",
        "recentchangesdays-max": "(ئەوپەڕی $1 {{PLURAL:$1|ڕۆژە|ڕۆژە}})",
        "badsiglength": "واژووەکەت زۆر درێژە.\nواژوو نابێ لە $1 {{PLURAL:$1|نووسە}} درێژتر بێت.",
        "yourgender": "پێت خۆشە چۆن وەسف بکرێیت؟",
        "gender-unknown": "پێم خۆشە باسی نەکەم",
-       "gender-male": "Ù¾Û\8cاÙ\88",
-       "gender-female": "ژن",
-       "prefs-help-gender": "دڵخÙ\88از: Ø¨Û\86 Ø¨Ø§Ù\86Ú¯ Ú©Ø±Ø¯Ù\86Û\8c Ø¯Ø±Ù\88ست Ø¨Û\95 Ø¯Û\95ستÛ\8c Ù\86Û\95رÙ\85اÙ\85Û\8eر.\nئÛ\95Ù\85 Ø²Ø§Ù\86Û\8cارÛ\8cÛ\8cÛ\95 Ú¯Ø´ØªÛ\8c Ø¦Û\95بÛ\8e.",
+       "gender-male": "Ù\86Û\8eر",
+       "gender-female": "مێ",
+       "prefs-help-gender": "ئÛ\95Ù\85 Ú¾Û\95ڵبÚ\98اردÛ\95Û\8cÛ\95 Ø¯ÚµØ®Ù\88ازاÙ\86Û\95Û\8cÛ\95.\nبÛ\86 Ø¨Ø§Ù\86گکردÙ\86 Ù\88 Ø¦Ø§Ù\85اÚ\98Û\95Ù¾Û\8eکردÙ\86 Ø¨Û\95 Ø´Û\8eÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ø¯Ø±Ù\88ست Ù\84Û\95Ù\84اÛ\8cÛ\95Ù\86 Ù\86Û\95رÙ\85اÙ\85Û\8eرÛ\95Ù\88Û\95 Ø¨Û\95کاردÛ\8eت.\nئÛ\95Ù\85 Ø²Ø§Ù\86Û\8cارÛ\8cÛ\8cÛ\95 Ú¯Ø´ØªÛ\8c Ø¯Û\95بÛ\8eت.",
        "email": "ئیمەیل",
        "prefs-help-realname": "ناوی ڕاستەقینە دڵخوازە.\nئەگەر بنووسرێت، لەوانەیە بۆ ئاماژەدان بەرھەمەکەت بە کار بھێنرێت.",
        "prefs-help-email": "دانانی ناونیشانی ئیمەیل دڵخوازانەیە، بەڵام ئەگەر تێپەڕوشەکەت لەیادکرد، بۆ نوێ‌کردنەوەی تێپەڕوشە پێویست دەبێت.",
        "prefs-tokenwatchlist": "نیشانە",
        "prefs-diffs": "جیاوازییەکان",
        "prefs-help-prefershttps": "بەکارخستنی ئەم تایبەتمەندییە کاریگەری لەسەر چوونەژوورەوەی داھاتووت دروست دەکات",
-       "userrights": "بەڕێوەبردنی مافەکانی بەکارھێنەر",
-       "userrights-lookup-user": "بەڕێوەبردنی گرووپەکانی بەکارھێنەر",
+       "prefswarning-warning": "تۆ گۆڕانکاریت ئەنجامداوە لە ھەڵبژاردەکانتدا کە ھێشتا پاشەکەوتت نەکردوون. ئەگەر ئەم پەڕەیە بەجێبێڵیت بەبێ کرتەکردن لەسەر «$1» ھەڵبژاردەکانت پاشەکەوت نابن و نوێ نابنەوە.",
+       "prefs-tabs-navigation-hint": "زانیاری: دەتوانیت تیری چەپ و ڕاست بەکاربھێنیت بۆ گەڕان بە ناو تابەکان لە پێڕستی تابەکاندا.",
+       "userrights": "مافەکانی بەکارھێنەر",
+       "userrights-lookup-user": "بەکارھێنەرێک ھەڵبژێرە",
        "userrights-user-editname": "ناوی بەکارهێنەرێک بنووسە:",
-       "editusergroup": "گرÙ\88Ù\88Ù¾Û\95کاÙ\86Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر Ø¯Û\95ستکارÛ\8c Ø¨Ú©ە",
+       "editusergroup": "گرÙ\88Ù\88Ù¾Û\95کاÙ\86Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر Ø¨Ø¨Û\8cÙ\86ە",
        "editinguser": "گۆڕینی مافە بەکارھێنەرییەکانی {{GENDER:$1|بەکارھێنەر}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "گرووپە بەکارھێنەرییەکان دەستکاری بکە",
+       "viewinguserrights": "تۆ مافەکانی بەکارھێنەر {{GENDER:$1|بەکارھێنەر}} <strong>[[User:$1|$1]]</strong> $2 دەبینیت",
+       "userrights-editusergroup": "گرووپەکانی {{{{GENDER:$1|بەکارھێنەر}} دەستکاری بکە",
+       "userrights-viewusergroup": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
        "saveusergroups": "گرووپەکانی بەکارھێنەر پاشەکەوت بکە",
        "userrights-groupsmember": "ئەندامە لە:",
        "userrights-groupsmember-auto": "ئەندامی ناڕاشکاوە لە:",
-       "userrights-groups-help": "دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە ئاڵوگۆڕ بکەی:\n* چوارچێوەی نیشان‌کراو یانی بەکارھێنەر لەو گرووپەدا هەیە.\n* چوارچێوەی نیشان‌نەکراو یانی بەکارھێنەر لەو گرووپەدا نییە.\n* ئەستێرەیەک (*) نیشان دەدا ناتوانی ئەو گرووپەی جارێکی تر زیادت کردووە لای‌بەری، و بە پێچەوانە.",
+       "userrights-groups-help": "دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە ئاڵوگۆڕ بکەی:\n* چوارچێوەی نیشانکراو واتە بەکارھێنەر لەو گرووپەدا هەیە.\n* چوارچێوەی نیشاننەکراو واتە بەکارھێنەر لەو گرووپەدا نییە.\n* ئەستێرەیەک (*) نیشان دەدات ناتوانی ئەو گرووپەی جارێکی تر زیادت کردووە لایبەریت، و بە پێچەوانە.",
        "userrights-reason": "هۆکار:",
        "userrights-no-interwiki": "دەسەڵاتی گۆڕینی مافەکانی بەکارهێنەر لە ویکی‌یەکانی دیکەت نیە.",
        "userrights-nodatabase": "بنکەدراوی $1 بوونی نیە یا لەم شوێنە نیە.",
        "userrights-changeable-col": "ئەو گرووپانەی دەتوانی بیگۆڕی",
        "userrights-unchangeable-col": "ئەو گرووپانەی ناتوانی بیگۆڕی",
+       "userrights-expiry-current": "بەسەردەچێ لە $1",
+       "userrights-expiry-none": "بەسەرناچێت",
+       "userrights-expiry": "بەسەردەچێت:",
+       "userrights-expiry-othertime": "کاتی تر:",
+       "userrights-invalid-expiry": "کاتی بەسەرچوون بۆ گرووپی «$1» ھەڵەیە.",
+       "userrights-expiry-in-past": "کاتی بەسەرچوون بۆ گرووپی «$1» لە ڕابردوودایە.",
        "group": "گرووپ:",
        "group-user": "بەکارھێنەران",
        "group-autoconfirmed": "بەکارھێنەرە خۆبەخۆ پەسندکراوەکان",
        "right-editprotected": "دەستکاریی پەڕە پارێزراوەکانی وەک «{{int:protect-level-sysop}}»",
        "right-editsemiprotected": "دەستکاریی پەڕە پارێزراوەکانی وەک «{{int:protect-level-autoconfirmed}}»",
        "right-editinterface": "دەستکاریی ڕووکاری بەکارھێنەر",
-       "right-editusercssjs": "دەستکاریی پەڕگەکانی جاڤاسکریپت و CSSی بەکارھێنەرانی تر",
        "right-editusercss": "دەستکاریی پەڕگەکانی CSSی بەکارھێنەرانی تر",
        "right-edituserjs": "دەستکاریی پەڕگەکانی جاڤاسکریپتی بەکارھێنەرانی تر",
        "right-editmyusercss": "دەستکاریی پەڕگەکانی CSSی بەکارھێنەریی خۆی",
        "right-override-export-depth": "هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت",
        "right-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
        "right-managechangetags": "دروستکردن و سڕینەوەی [[Special:Tags|تاگەکان]] لە بنکەدراوە",
+       "right-deletechangetags": "سڕینەوەی [[Special:Tags|tags]] لە بنکەی زانیاری",
+       "grant-group-file-interaction": "مامەڵەکردن لەگەڵ میدیا",
+       "grant-group-email": "ناردنی ئیمەیل",
+       "grant-blockusers": "بەربەستکردن و بەربەستنەکردنی بەکارھێنەران",
+       "grant-createaccount": "دروستکردنی ھەژمار",
+       "grant-createeditmovepage": "دروستکردن، دەستکاریکردن و گواستنەوەی پەڕەکان",
+       "grant-editmyoptions": "دەستکاریی ھەڵبژاردەکانی خۆت",
+       "grant-editmywatchlist": "دەستکاریکردنی لیستی چاودێرییەکەت",
+       "grant-editpage": "پەڕە ھەبووەکان دەستکاری بکە",
+       "grant-editprotected": "پەڕە پارێزراوەکان دەستکاری بکە",
+       "grant-privateinfo": "بینینی زانیارییە تایبەتییەکان",
+       "grant-protect": "پاراستن و نەپاراستنی پەڕەکان",
+       "grant-rollback": "گۆڕانکارییە گەڕاندنەوەییەکانی پەڕەکان",
+       "grant-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
+       "grant-uploadfile": "بەڕگەی نوێ بار بکە",
+       "grant-basic": "مافی سەرەکی",
+       "grant-viewdeleted": "بینینی پەڕگە و پەڕە سڕدراوەکان",
+       "grant-viewmywatchlist": "دیتنی پێرستی چاودێریت",
        "newuserlogpage": "لۆگی دروستکردنی بەکارھێنەر",
        "newuserlogpagetext": "ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.",
        "rightslog": "لۆگی مافەکانی بەکارھێنەر",
        "rightslogtext": "ئەمە لۆگی دەستکاری مافەکانی بەکار‌هێنەرە.",
        "action-read": "خوێندنەوەی ئەم پەڕەیە",
        "action-edit": "دەستکاریی ئەم پەڕەیە",
-       "action-createpage": "درÙ\88ستکردÙ\86Û\8c Ù¾Û\95Ú\95Û\95کاÙ\86",
-       "action-createtalk": "درÙ\88ستکردÙ\86Û\8c Ù¾Û\95Ú\95Û\95کاÙ\86Û\8c Ù\88تÙ\88Ù\88Û\8eÚ\98",
+       "action-createpage": "ئÛ\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ø¯Ø±Ù\88ست Ø¨Ú©Û\95",
+       "action-createtalk": "ئÛ\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8c Ù\88تÙ\88Ù\88Û\8eÚ\98Û\95 Ø¯Ø±Ù\88ست Ø¨Ú©Û\95",
        "action-createaccount": "دروست کردنی ئەم ھەژماری بەکارھێنەرییە",
        "action-history": "بینینی مێژووی ئەم پەڕەیە",
        "action-minoredit": "نیشان‌کردنی ئەم دەستکاریە وەک بچووک",
        "action-deletedhistory": "دیتنی مێژووی سڕاوەی ئەم پەڕەیە",
        "action-browsearchive": "گەران لە نێو لاپەڕە سڕاوەکان",
        "action-undelete": "گەڕاندنەوەی ئەم پەڕەیە",
-       "action-suppressrevision": "چاوپێداخشان و هاردنوەی ئەم لاپەڕە شاراوە",
+       "action-suppressrevision": "چاوپێداخشان و هاوردنەوەی ئەم لاپەڕە شاراوە",
        "action-suppressionlog": "دیتنی ئەم لۆگە ئەهلیە",
        "action-block": "بەربەست کردنی ئەم بەکارهێنەرە بۆ دەستکاری‌کردن",
        "action-protect": "گۆڕینی ئاستی پاراستن بۆ ئەم پەڕەیە",
        "action-userrights-interwiki": "دەستکاری مافەکانی بەکارهێنەریی بەکارهێنەران لە ویکی‌یەکانی دیکە‌دا",
        "action-siteadmin": "داخستن یا کردنەوەی بنکەدراو",
        "action-sendemail": "ناردنی ئیمەیلەکان",
+       "action-editmyoptions": "دەستکاریی ھەڵبژاردەکانی خۆت",
        "action-editmywatchlist": "دیتنی پێرستی چاودێریت",
        "action-viewmywatchlist": "دیتنی پێرستی چاودێریت",
        "action-viewmyprivateinfo": "زانیارییە تایبەتییەکانت ببینە",
        "action-editmyprivateinfo": "دەستکاری زانیارییە تایبەتییەکانت بکە",
+       "action-purge": "پاکسازی ئەم پەڕەیە بکە",
        "nchanges": "$1 {{PLURAL:$1|گۆڕانکاری}}",
        "enhancedrc-history": "مێژوو",
        "recentchanges": "دوایین گۆڕانکارییەکان",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])",
        "recentchanges-legend-plusminus": "(''±۱٢٣'')",
        "recentchanges-submit": "نیشانی بدە",
+       "rcfilters-activefilters": "پاڵێوەرە چالاکەکان",
+       "rcfilters-clear-all-filters": "ھەموو فیلتەرەکان بسڕەوە",
+       "rcfilters-search-placeholder": "پاڵاوتنی گۆڕانکارییە نوێیەکان (بگەڕێ یان دەست بە نووسین بکە)",
+       "rcfilters-filterlist-title": "فیلتەرەکان",
+       "rcfilters-filterlist-whatsthis": "ئەمە چییە؟",
+       "rcfilters-highlightmenu-title": "ڕەنگێکی نوێ ھەڵبژێرە",
+       "rcfilters-filter-registered-label": "تۆمارکراو",
+       "rcfilters-filter-registered-description": "ئەو بەکارھێنەرانەی لە ژوورەوەن",
+       "rcfilters-filter-unregistered-label": "تۆمارنەکراوەکان",
+       "rcfilters-filter-unregistered-description": "ئەو بەکارھێنەرانەی لە ژوورەوە نین",
+       "rcfilters-filter-editsbyself-label": "مافەکانی خۆت",
+       "rcfilters-filter-editsbyself-description": "دەستکارییەکانی خۆت.",
+       "rcfilters-filter-editsbyother-label": "دەستکارییەکانی کەسانی تر",
+       "rcfilters-filter-editsbyother-description": "ھەموو گۆڕانکارییەکان بێجگە لەوەی خۆت",
+       "rcfilters-filter-user-experience-level-newcomer-label": "تازەکاران",
+       "rcfilters-filter-user-experience-level-newcomer-description": "کەمتر لە ١٠ دەستکاری و ٤ ڕۆژ لە چالاک بوون",
+       "rcfilters-filter-user-experience-level-experienced-label": "بەکارھێنەرانی پێشکەوتوو",
+       "rcfilters-filter-user-experience-level-experienced-description": "زیاتر لە ٣٠ ڕۆژ لە چالاکی و ٥٠٠ دەستکاری",
+       "rcfilters-filter-bots-label": "بۆت",
+       "rcfilters-filter-humans-label": "مرۆڤ (بۆت نییە)",
+       "rcfilters-filter-humans-description": "دەستکارییەکانی لەلایەن مرۆڤەکانەوە ئەنجام دراون",
+       "rcfilters-filter-patrolled-label": "پاسدراو",
+       "rcfilters-filter-patrolled-description": "ئەو دەستکارییانەی وەک پاسدراو دیاریکراون",
+       "rcfilters-filter-unpatrolled-label": "پاسنەدراوەکان",
+       "rcfilters-filter-unpatrolled-description": "ئەو دەستکارییانەی وەک پاسدراو دیارینەکراون",
+       "rcfilters-filter-minor-label": "دەستکارییە بچووکەکان",
+       "rcfilters-filter-minor-description": "ئەو دەستکارییانەی کە دەستکاریکەر وەک بچووک ناوی بردووە",
+       "rcfilters-filter-major-label": "دەستکارییە نا-بچووکەکان",
+       "rcfilters-filter-major-description": "دەستکارییەکانی کە بە بچووک دیاری نەکراون.",
+       "rcfilters-filtergroup-watchlist": "پەڕەکانی لە پێڕستی چاودێریتن",
+       "rcfilters-filter-watchlist-watched-label": "لە پێرستی چاودێری",
+       "rcfilters-filter-watchlist-watched-description": "گۆڕانکاری لە پەڕەکانی کە لە پێڕستی چاودێریتن.",
+       "rcfilters-filter-watchlist-notwatched-label": "لە پێڕستی چاودێریت نییە",
+       "rcfilters-filtergroup-changetype": "جۆری گۆڕانکاری",
+       "rcfilters-filter-pageedits-label": "دەستکارییەکانی پەڕە",
+       "rcfilters-filter-newpages-label": "دروستکردنی پەڕەکان",
+       "rcfilters-filter-categorization-label": "گۆڕانکاری پۆلەکان",
        "rcnotefrom": "ژێرەوە {{PLURAL:$5|گۆڕانکارییەکەیە|گۆڕانکارییەکانە}} لە strong>$3، $4</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
        "rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $3 $2",
        "rcshowhideminor": "دەستکارییە بچووکەکان $1",
        "rcshowhidecategorization": "$1 پۆلێنکردنی پەڕە",
        "rcshowhidecategorization-show": "نیشانی بدە",
        "rcshowhidecategorization-hide": "شاردراوە",
-       "rclinks": "دوایین $1 گۆڕانکاریی $2 ڕۆژی ڕابردوو نیشان بدە<br />$3",
+       "rclinks": "دوایین $1 گۆڕانکاریی $2 ڕۆژی ڕابردوو نیشان بدە",
        "diff": "جیاوازی",
        "hist": "مێژوو",
        "hide": "بشارەوە",
        "newpageletter": "ن",
        "boteditletter": "بۆت",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|بەکارھێنەر}}ی چاودێر]",
-       "rc_categories": "بەرتەسککردنەوە بە هاوپۆلەکان (به «|» جیای بکەوە‌)",
-       "rc_categories_any": "هەرکام",
+       "rc_categories": "بەرتەسککردنەوە بە هاوپۆلەکان (به «|» جیای بکەوە‌)",
+       "rc_categories_any": "هەرکامێک بێت",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پاش گۆڕانکاری",
        "newsectionsummary": "/* $1 */ بەشی نوێ",
        "rc-enhanced-expand": "وردەکارییەکان نیشان بدە",
        "recentchangeslinked-summary": "ئەمە لیستێکی گۆڕانکارییەکانی ئەم دوایییانەی ئەو پەڕانەیە کە بەستەریان ھەیە لە پەڕەیەکی دیاریکراو (یان بۆ ئەندامەکانی پۆلێکی دیاریکراو)\nپەڕەکانی [[Special:Watchlist|لیستی چاودێرییەکەت]] '''ئەستوورن'''.",
        "recentchangeslinked-page": "ناوی پەڕە:",
        "recentchangeslinked-to": "بەجێگەی ئەوە گۆڕانکارییەکانی ئەو پەڕانە نیشانبدە کە بەستەریان ھەیە بۆ پەڕەی دیاریکراو",
+       "recentchanges-page-added-to-category": "[[:$1]] زیادکرا بۆ پۆل",
+       "recentchanges-page-removed-from-category": "[[:$1]] لابرا لە پۆل",
        "upload": "پەڕگەیەک بار بکە",
        "uploadbtn": "پەڕگە بار بکە",
        "reuploaddesc": "هەڵوەشانەوەی بارکردن و گەڕانەوە بۆ فۆرمی بارکردن",
        "illegalfilename": "ناوی‌پەڕگەی \"$1\" پیتێکی تێدایە کە ڕێگەنەدراوە بۆ سەردێڕی لاپەڕە بەکاربێت.\nتکایە ناوی پەڕگەکە بگۆڕە و دیسان باری بکەوە.",
        "filename-toolong": "ناوی پەڕگە ناتوانێ لە ٢٤٠ بایت درێژتر بێت.",
        "badfilename": "ناوی پەڕگە بە \"$1\" گۆڕا .",
+       "filetype-mime-mismatch": "فۆرماتی پەڕگە «$1» نەگونجێت لەگەڵ MIMEی دیاریکراوی پەڕگە ($2).",
        "filetype-badmime": "ڕێگە نەدراوە پەڕگەی \"$1\" جۆری MIME بار بکرێت.",
        "filetype-bad-ie-mime": "ناتوانین ئەم پەڕگە باربکەین لەبەر ئەوەی وێبگەڕی Internet Explore ئەوە وەک \"$1\" دەناسێت کە ڕێگەنەدراوەیە و جۆرە پەڕگەیەکی مەترسی‌دارە.",
        "filetype-unwanted-type": "'''\".$1\"''' جۆرە پەڕگەی نەخوازراوە.\n$2، ئەو جۆرە {{PLURAL:$3|پەڕگەیە|پەڕگانەیە}} وا بە باش‌ دازاندرێت.",
        "file-too-large": "ئەو پەڕگەیە ناردووتە زۆر گەورەیە.",
        "filename-tooshort": "ناوی پەڕگە زۆر کورتە.",
        "filetype-banned": "ئەم جۆرە پەڕگەیە قەدەغەیە.",
+       "verification-error": "ئەم پەڕگەیە شکسی ھێنا لە پڕۆسەی پەسەندکردنی پەڕگە.",
        "illegal-filename": "ناوی پەڕگە رێگەپێ‌نەدراوە.",
+       "overwrite": "بەسەردانانی پەڕگەی ئێستا ڕێگە پێنەدراوە.",
        "unknown-error": "ھەڵەیەکی نەزانراو ڕوویداوە.",
+       "tmp-create-error": "نەتوانرا پەڕگەی کاتیی دروست بکرێت.",
        "large-file": "پێشنیار دەکرێت قەبارەی پەڕگەکان زیاتر لە $1 نەبێت؛\nقەبارەی ئەم پەڕگە $2.",
        "largefileserver": "ئەم پەڕگە گەورەتر لەوەیە کە ڕاژەکار ڕێگەدەدات.",
        "emptyfile": "ئەو پەڕگەیەی بارت کردووە لەوە دەچێ واڵا بێت.\nلەوانەیە بە ھۆی هەڵەیەک لە تایپی ناوی پەڕگەکە بێت.\nتکایە تاوتوێی بکە ئەگەر بە ڕاستی دەتەوێ ئەم پەڕگەیە بار بکەی.",
-       "fileexists": "پەڕگەیەک هەر بەو ناوە‌ لە پێش‌دا هەیە، تکایە گەر ئەرخەیان نیت بۆ گۆڕینی، چاوێک لە <strong>[[:$1]]</strong> بکە.\n[[$1|thumb]]",
+       "windows-nonascii-filename": "ئەم ویکییە ڕێگە نادات بە بەکارھێنانی نووسینی تایبەتیی لە سەرناوی پەڕگەکاندا.",
+       "fileexists": "پەڕگەیەک هەر بەو ناوە‌ هەیە، تکایە گەر ئەرخەیان نیت بۆ گۆڕینی، چاوێک لە <strong>[[:$1]]</strong> بکە.\n[[$1|thumb]]",
        "filepageexists": "پەڕەی ناساندن بۆ ئەم پەڕگە پێشتر لە <strong>[[:$1]]</strong> درووستکراوە، بەڵام پەڕگەیەک بەو ناوەوە ئێستا نادۆزرێتەوە.\nئەو پوختەی کە نووسیوتە لە پەڕەی ناساندن بەرچاو ناکەوێت.\nگەر دەتەوێ پوختەکەت بەرچاو کەوێت دەبێ خۆت دەستی دەستکاری بکەی.\n[[$1|thumb]]",
-       "fileexists-extension": "Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95Ú© Ù\87Û\95ر Ø¨Û\95Ù\88 Ù\86اÙ\88Û\95 Ù\87Û\95Û\8cÛ\95: [[$2|thumb]]\n* Ù\86اÙ\88Û\8c Ø¦Û\95Ù\88 Ù¾Û\95Ú\95Ú¯Û\95Û\8c Ø¨Ø§Ø±Û\8c Ø¦Û\95Ú©Û\95Û\8c:<strong>[[:$1]]</strong>\n* Ù\86اÙ\88Û\8c Ø¦Û\95Ù\88 Ù¾Û\95Ú\95Ú¯ەی ئێستا هەیە:<strong>[[:$2]]</strong>\nتکایە ناوێکی دیکە هەڵبژێرە.",
+       "fileexists-extension": "Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95Ú© Ù\87Û\95ر Ø¨Û\95Ù\88 Ù\86اÙ\88Û\95 Ù\87Û\95Û\8cÛ\95: [[$2|thumb]]\n* Ù\86اÙ\88Û\8c Ø¦Û\95Ù\88 Ù¾Û\95Ú\95Ú¯Û\95Û\8c Ø¨Ø§Ø±Û\8c Ø¯Û\95Ú©Û\95Û\8cت:<strong>[[:$1]]</strong>\n* Ù\86اÙ\88Û\8c Ø¦Û\95Ù\88 Ù¾Û\95Ú\95Ú¯Û\95Û\8cەی ئێستا هەیە:<strong>[[:$2]]</strong>\nتکایە ناوێکی دیکە هەڵبژێرە.",
        "fileexists-thumbnail-yes": "لەوە دەچێ ئەم پەڕگە وێنەیەکی بچووک‌کراوە بێت ''(هێما)''. [[$1|thumb]]\nتکایە چاو لە پەڕگەی <strong>[[:$1]]</strong> بکه.‌\nگەر ئەوەی چاوت لێ‌کرد قەبارەی ڕەسەنی هەر ئەو وێنەیە، پێویست ناکات دیسان هێماکەی باربکەی.",
        "file-thumbnail-no": "دەستپێکی ناوی ئەم پەڕگە ئەوەیە: <strong>$1</strong>\nلەوە دەچێ ئەم پەڕگە وێنەیەکی بچووک‌کراوە بێت ''(هێما)''.\nگەر ئەو وێنەت لە قەبارەی ڕەسەنی‌ خۆی‌دا هەیه،‌ تکایە ئەوە بار بکه،‌ دەنا ناوی پەڕگەکە بگۆڕە.",
        "fileexists-forbidden": "پەڕگەیەک بەو ناوە لە پێش‌دا هەیە و سەرنووسین ناکرێت.\nگەر هێشتا دەتەوێ پەڕگەکەت باربکەی، تکایە بگەڕێ دواوە و ناوێکی نوێ بەکاربهێنە.\n[[File:$1|thumb|center|$1]]",
        "uploadwarning": "ئاگادارییەکانی بارکردن",
        "savefile": "پەڕگە پاشەکەوت بکە",
        "uploaddisabled": "بارکردن قەدەخە کراوە",
+       "copyuploaddisabled": "بارکردن بە URL لابرا.",
        "uploaddisabledtext": "بارکردنی پەڕگەکان لە کار خستراوە.",
        "php-uploaddisabledtext": "بارکردنی پەڕگەکان لە PHPدا لە کار خستراوە.\nتکایە چاو لە هەڵبژاردەکانی بارکردنی_پەڕگەکان بکە.",
        "uploadscripted": "ئەم پەڕگە HTML یان کۆدی سکریپتی لەخۆگرتووە کە لەوانەیە ببێتە هۆی هەڵە تێگەیشتنی هێندێ وێبگەڕەکان.",
        "upload-misc-error-text": "هەڵەیەکی نەناسراو لە کاتی بارکردن ڕووی‌دا.\nتکایە لە درووست‌بوون و دەست‌پێ گەیشتنی URL ئەرخەیان ببە و دیسان تاقی‌بکەوە.\nگەر کێشەکە هەر بەردەوام بوو پەیوەندی بکە بە [[Special:ListUsers/sysop|بەڕێوبەر]].",
        "upload-too-many-redirects": "URL ڕەوانەکەری زۆری لەخۆ گرتووە",
        "upload-http-error": "هەڵەیەکی HTTP ڕووئ داوە: $1",
+       "upload-dialog-title": "بارکردنی پەڕگە",
        "upload-dialog-button-cancel": "ھەڵوەشاندنەوە",
+       "upload-dialog-button-back": "گەڕانەوە",
+       "upload-dialog-button-done": "کرا",
+       "upload-dialog-button-save": "پاشەکەوتکردن",
        "upload-dialog-button-upload": "بارکردن",
+       "upload-form-label-infoform-title": "وردەکارییەکان",
+       "upload-form-label-infoform-name": "ناو",
+       "upload-form-label-infoform-description": "شیکردنەوە",
+       "upload-form-label-usage-title": "بەکارھێنان",
+       "upload-form-label-usage-filename": "ناوی پەڕگە",
        "upload-form-label-own-work": "ئەمە کاری خۆمە",
+       "upload-form-label-infoform-categories": "پۆلەكان",
+       "upload-form-label-infoform-date": "ڕێکەوت",
+       "upload-form-label-own-work-message-generic-local": "من دڵنیا دەکەمەوە کە ئەم پەڕگەیە باردەکەم بە گوێڕایەڵیکردنی مەرجەکانی بەکارھێنان و سیاسەتەکانی بەڵگەنامەکانی {{SITENAME}}.",
        "backend-fail-stream": "نەکرا پەڕگەی $1 بنێردرێت.",
        "backend-fail-notexists": "پەڕگەی $1 بوونی نییە.",
        "backend-fail-delete": "نەکرا پەڕگەی $1 بسڕدرێتەوە.",
        "uploadstash": "ئەمباری بارکردن",
        "uploadstash-errclear": "سڕینەوەی پەڕگەکان سەرکەوتوو نەبوو.",
        "uploadstash-refresh": "نوێکردنەوەی پێرستی پەڕگەکان",
+       "uploadstash-thumbnail": "بینینی وێنۆک",
        "img-auth-accessdenied": "تێپه‌ربوون ره‌تکرایه‌وه‌",
        "img-auth-nofile": "فایلی \"$1\" بوونی نیه‌",
        "img-auth-isdir": "هه‌وڵ ده‌ده‌ی بۆ کردنه‌وه‌ی بوخچه‌ی \"$1\" له‌ کاتێکدا ته‌نیا کردنه‌وه‌ی فایل رێپێدراوه‌",
+       "img-auth-noread": "بەکارھێنەر مۆڵەتی نییە بۆ خوێندنەوەی «$1».",
+       "http-invalid-url": "URLـی ھەڵە: $1",
        "upload-curl-error6": "توانای دەست‌پێ‌گەیشتنی URL نیە",
        "upload-curl-error6-text": "ئەو URL کە ڕاچاوت کردووە توانای دەست‌پێ‌گەیشتنی نییە.\nتکایە دیسان سەرنجی بدەوە کە URL درووست‌ نووسراوە و ماڵپەڕەکە بەردەوام کار دەکات.",
        "upload-curl-error28": "کات‌بەسەرچوونی بارکردن",
        "license": "مۆڵەتنامە:",
        "license-header": "مۆڵەتنامە",
        "nolicense": "ھیچ ھەڵنەبژێردراوە",
+       "licenses-edit": "دەستکاریکردنی ھەڵبژاردەکانی مۆڵەت",
        "license-nopreview": "(پێشبینین ئامادەی کەڵک وەرگرتن نییە)",
        "upload_source_url": " (URLـی بەکار، بۆ دەست‌پێگەیشتنی  گشتی)",
        "upload_source_file": "(پەڕگەی ھەڵبژێرراوت لەسەر کۆمپیوتەرەکەت)",
        "listfiles-delete": "سڕینەوە",
        "listfiles-summary": "ئەم پەڕە تایبەتە ھەموو پەڕگە بارکراوەکان نیشان دەدات.",
        "listfiles_search_for": "بگەڕێ بۆ ناوی میدیای:",
+       "listfiles-userdoesnotexist": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.",
        "imgfile": "پەڕگە",
        "listfiles": "پێرستی پەڕگەکان",
        "listfiles_thumb": "وێنۆک",
        "randompage": "پەڕەی ھەڕەمەکی",
        "randompage-nopages": "ھیچ پەڕەیەک لە {{PLURAL:$2|بۆشایی ناو|بۆشایی ناوەکان}}ی خوارەوەدا نییە: $1.",
        "randomincategory": "پەڕەیەک بە ھەڵکەوت لە پۆلدا",
+       "randomincategory-invalidcategory": "«$1» ناوی پۆلێکی دروست نییە.",
+       "randomincategory-nopages": "ھیچ پەڕەیەک لە پۆلی [[:Category:$1|$1]]دا نییە.",
+       "randomincategory-category": "پۆل:",
+       "randomincategory-legend": "پەڕەیەک بە ھەڵکەوت لە پۆلدا",
        "randomincategory-submit": "بڕۆ",
        "randomredirect": "ڕەوانەکەری ھەڕەمەکی",
        "randomredirect-nopages": "لە ناوبۆشایی \"$1\" هیچ ڕەوانکەرێک نییە.",
        "wantedfiles": "پەڕگە داواکراوەکان",
        "wantedfiletext-cat": "پەڕگەکانی خوارەوە بەکارھێنراون بەڵام بوونیان نییە. پەڕگەکانی ئەمارەکانی دەرەوە لەوانەیە لەم لیستەدا بن ئەگەرچی بوونیان ھەیە. ھەر باشییەکی درۆی وەھا ھێڵی بەسەردا دەکێشرێ. ھەروەھا، ئەو پەڕانە کە پەڕگەیەکیان بەکارھێناوە کە بوونی نییە لە [[:$1]]دا بە ڕیز کراون.",
        "wantedfiletext-nocat": "پەڕگەکانی خوارەوە بەکارھێنراون بەڵام بوونیان نییە. پەڕگەکانی ئەمارەکانی دەرەوە لەوانەیە لەم لیستەدا بن ئەگەرچی بوونیان ھەیە. ھەر باشییەکی درۆی وەھا <del>ھێڵی بەسەردا دەکێشرێ</del>.",
+       "wantedfiletext-nocat-noforeign": "ئەم پەڕگانە بەکارھاتوون بەڵام دروست نەکراون.",
        "wantedtemplates": "داڕێژە داواکراوەکان",
        "mostlinked": "پەڕەکان بە زۆرترین بەستەری پێدراو",
        "mostlinkedcategories": "پۆلەکان بە زۆرترین بەستەری پێدراو",
        "protectedpages-noredirect": "ڕەوانەکەرەکان بشارەوە",
        "protectedpagesempty": "هیچ لاپەڕەیک ئێستا بەم دیاریکراوانە نەپارێزراوە.",
        "protectedpages-page": "پەڕە",
+       "protectedpages-expiry": "بەسەردەچێت",
+       "protectedpages-performer": "پاراستنی بەکارھێنەر",
        "protectedpages-params": "پارامەترەکانی پاراستن",
        "protectedpages-reason": "ھۆکار",
+       "protectedpages-submit": "پەڕەکان پیشان بدە",
+       "protectedpages-unknown-timestamp": "نەزانراو",
+       "protectedpages-unknown-performer": "بەکارھێنەرێکی نەناسراو",
        "protectedtitles": "سەرناوە پارێزراوەکان",
        "protectedtitlesempty": "ھیچ سەرناوێک بەم سنوورانەوە ئێستا نەپارێزراوە.",
        "listusers": "پێرستی بەکارھێنەران",
        "pager-older-n": "{{PLURAL:$1|یەکێک کۆنتر|$1ی کۆنتر}}",
        "suppress": "چاودێری",
        "apisandbox-unfullscreen": "نیشاندانی پەڕە",
+       "apisandbox-submit": "داواکاری",
+       "apisandbox-reset": "سڕینەوە",
+       "apisandbox-retry": "ھەوڵداناوە",
+       "apisandbox-helpurls": "بەستەرەکانی یارمەتی",
+       "apisandbox-examples": "نموونەکان",
+       "apisandbox-dynamic-parameters-add-label": "زیادکردنی پارامەتر",
+       "apisandbox-dynamic-parameters-add-placeholder": "ناوی پارامەتر",
+       "apisandbox-dynamic-error-exists": "پارامەترێک بە ناوی «$1» ھەیە.",
+       "apisandbox-submit-invalid-fields-message": "تکایە بەشە دیاریکراوەکان ڕاست بکەرەوە و دووبارە ھەوڵ بدەرەوە.",
+       "apisandbox-results": "ئاکامەکان",
+       "apisandbox-continue": "بەردەوامبوون",
+       "apisandbox-continue-clear": "سڕینەوە",
        "booksources": "سەرچاوەکانی کتێب",
        "booksources-search-legend": "گەڕان بۆ سەرچاوەکانی کتێب",
        "booksources-search": "بگەڕێ",
        "logempty": "هیچ بابەتێکی هاوتا لە لۆگەکاندا نەدۆزرایەوە.",
        "log-title-wildcard": "گەڕانی ئەو سەرناوانە بەم دەقەوە دەست پێدەکەن",
        "showhideselectedlogentries": "دیاریکردنی بابەتە ھەڵبژێردراوەکانی لۆگ بگۆڕە",
+       "checkbox-select": "ھەڵبژاردنی: $1",
        "checkbox-all": "ھەموو",
        "checkbox-none": "هیچ",
+       "checkbox-invert": "پێچەوانەکردنەوە",
        "allpages": "ھەموو پەڕەکان",
        "nextpage": "پەڕەی پاشەوە ($1)",
        "prevpage": "پەڕەی پێشەوە ($1)",
        "allpages-bad-ns": "{{SITENAME}} ناوبۆشایی نیە \"$1\".",
        "allpages-hide-redirects": "ڕەوانەکەرەکان بشارەوە",
        "cachedspecial-viewing-cached-ttl": "خەریکیت وەشانێکی حەشارکراوی ئەم پەڕەیە دەبینی کە دەتوانێت ھی $1 لەمەوبەر بێت.",
+       "cachedspecial-viewing-cached-ts": "تۆ وەشانێکی کاشکراوی ئەم پەڕەیە دەبینیت، لەوانەیە زانیارییەکان گۆڕانکارییان بەسەردا ھاتبێت.",
        "cachedspecial-refresh-now": "دواترین پیشانبدە",
        "categories": "پۆلەكان",
        "categories-submit": "نیشاندان",
        "linksearch-pat": "گەڕان بۆ نواندن:",
        "linksearch-ns": "بۆشاییی ناو:",
        "linksearch-ok": "گەڕان",
-       "linksearch-text": "Wildcardی وەک \"*.wikipedia.org\" بەکاردێت.\nلانی کەم پێویستی بە پاوانێکی ئاست-بان ھەیە، بۆ نموونە «*.org» .<br />\nپرۆتۆکۆلە پشتیوانی لێکراوەکان: $1 (ھیچ کام لەمانە بە گەڕانەکەت زێدە مەکە).",
+       "linksearch-text": "Wildcardی وەک \"*.wikipedia.org\" بەکاردێت.\nلانی کەم پێویستی بە پاوانێکی ئاست بەرز ھەیە، بۆ نموونە «*.org» .<br />\nپرۆتۆکۆلە پشتیوانی لێکراوەکان: $1 (ھیچ کام لەمانە بە گەڕانەکەت زێدە مەکە).",
        "linksearch-line": "$1 بەستەرپێ‌دراو لە $2",
        "listusersfrom": "نیشاندانی بەکارھێنەران بە دەستپێکردن لە:",
        "listusers-submit": "نیشان بدە",
        "activeusers-count": "$1 {{PLURAL:$1|کردەوە}} لە دوایین {{PLURAL:$3|ڕۆژ|$3 ڕۆژ}}دا",
        "activeusers-from": "نیشاندانی بەکارھێنەران بە دەستپێکردن لە:",
        "activeusers-noresult": "هیچ بەکارهێنەرێک نەدۆزرایەوە",
+       "activeusers-submit": "بەکارھێنەرە چالاکەکان نیشان بدە",
        "listgrouprights": "مافەکانی گرووپی بەکارھێنەر",
        "listgrouprights-summary": "ئەمە لیستێکە لە گرووپەکانی بەکارهێنەر لەسەر ئەم ویکی‌یە، دەگەڵ مافەکانی دەست‌پێ‌گەیشتنی هاوپەیوەندیان.\nلێرەدا لەوانەیە [[{{MediaWiki:Listgrouprights-helppage}}|زانیاری زیاترت]] دەست‌کەوێت سەبارەت بە مافە تاکەکەسیەکان.",
        "listgrouprights-key": "تێبینی:\n* <span class=\"listgrouprights-granted\">مافی دراوە</span>\n* <span class=\"listgrouprights-revoked\">مافی سەنراوە</span>",
        "listgrouprights-namespaceprotection-header": "سنوورداریی بۆشایی ناو",
        "listgrouprights-namespaceprotection-namespace": "بۆشایی ناو",
        "listgrouprights-namespaceprotection-restrictedto": "مافی رێ‌پێدراوی بەکارھێنەر بۆ دەستکاری",
+       "listgrants-rights": "مافەکان",
        "trackingcategories": "پۆلەکانی شوێنکەوتن",
        "trackingcategories-name": "ناوی پەیام",
+       "restricted-displaytitle-ignored": "پەڕەکان بە ناونیشانی بینینی پشتگوێخراوەوە",
+       "trackingcategories-nodesc": "ھیچ وردەکارییەک بەردەست نییە",
        "mailnologin": "ناونیشان بۆ ناردن نییە",
        "mailnologintext": "ده‌بێ له‌ [[Special:UserLogin|ژووره‌وه‌]] بیت و ناونیشانێکی بڕواپێ‌کراوی ئی‌مه‌یلت له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کان]] دیاری کردبێت تا بتوانی ئی‌مه‌یل بنێریت بۆ به‌کارهێنه‌رانی دیکه‌.",
        "emailuser": "ئیمەیل بنێرە بۆ ئەم بەکارھێنەرە",
        "emailpagetext": "دەتوانی لەم فۆرمەی ژێرەوە بۆ ناردنی ئیمەیلێک بۆ ئەم {{GENDER:$1|بەکارھێنەر}}ە کەڵک وەربگریت.\nئەو ناونیشانە ئیمەیلە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر‌یتدا]] نووسیوتە، لە ناونیشانی «لەلایەن»ی (From) ئیمەیلەکەدا نیشان دەدرێت، کە وایە بەکارھێنەری وەرگر دەتوانێ ڕاستەوخۆ وەڵامت بداتەوە.",
        "defemailsubject": "ئیمەیلی {{SITENAME}} لە بەکارھێنەر «$1»ەوە",
        "usermaildisabled": "ئیمەیڵی بەکارهێنەر لەکاردانیە",
+       "usermaildisabledtext": "ناتوانیت ئیمەیڵ بۆ بەکارھێنەرانی تر بنێریت لەسەر ئەم ویکیپیدیایە",
        "noemailtitle": "هیچ ناونیشانێکی ئی‌مەیل نییە",
        "noemailtext": "ئەم بەکارھێنەرە ناونێشانێکی گونجاوی ئیمێلی دەستنیشان نەکردووە.",
        "nowikiemailtext": "ئەم بەکارهێنەرە تایبەتمەندیی وەرنەگرتنی ئی‌مەیل لە بەکارهێنەرانی دیکەی هەلبژاردووە.",
        "addedwatchtext": "پەڕەی «[[:$1]]» خرایە ژێر [[Special:Watchlist|پێرستی چاودێری]]یەکەت.\nگۆڕانکارییەکانی داھاتووی ئەم پەڕەیە و پەڕەی وتووێژەکەی، لەوێدا پێرست دەکرێت.",
        "removewatch": "لەلیستی چاودێری لایبە",
        "removedwatchtext": "پەڕەی «[[:$1]]» لە [[Special:Watchlist|لیستی چاودێریەکەت]] لابرا.",
+       "removedwatchtext-short": "پەڕەی «$1» لە پێڕستی چاودێریت لابرا.",
        "watch": "چاودێری بکە",
        "watchthispage": "ئەم پەڕەیە بخە ژێر چاودێری",
        "unwatch": "لابردنی چاودێری",
        "wlshowtime": "ماوەی کات بۆ نیشاندان:",
        "wlshowhideminor": "دەستکارییە بچووکەکان",
        "wlshowhidebots": "بۆتەکان",
+       "wlshowhideliu": "بەکارھێنەرە تۆمارکراوەکان",
        "wlshowhideanons": "بەکارھێنەرە نەناسراوەکان",
+       "wlshowhidepatr": "دەستکارییە پاسدراوەکان",
        "wlshowhidemine": "دەستکارییەکانم",
        "wlshowhidecategorization": "پۆلێنکردنی پەڕە",
        "watchlist-options": "ھەڵبژاردەکانی لیستی چاودێری",
        "watching": "چاودێری...",
        "unwatching": "لابردنی چاودێری...",
+       "watcherrortext": "کێشەیەک دروست بوو لەکاتی گۆڕینی پێڕستی چاودێریت بۆ «$1».",
        "enotif_reset": "ھەموو پەڕەکان وەک بینراو دیاری بکە",
        "enotif_impersonal_salutation": "بەکارهێنەری \t{{SITENAME}}",
        "enotif_subject_deleted": "پەڕەی {{SITENAME}} $1 بە دەستی {{gender:$2|$2}} سڕایەوە.",
        "enotif_lastvisited": "بۆ بینینی ھەموو گۆرانکارییەکانی پاش دوایین سەردانت $1 ببینە.",
        "enotif_lastdiff": "بۆ بینینی ئەم گۆڕانکارییە $1 ببینە.",
        "enotif_anon_editor": "بەکارھێنەری نەناسراو $1",
-       "enotif_body": "â\80«$WATCHINGUSERNAMEÛ\8c Ø¨Û\95Ú\95Û\8eزØ\8c\n\n$PAGEINTRO $NEWPAG\n\nÚ©Ù\88رتÛ\95Û\8c Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95Ú©Û\95Û\8c: $PAGESUMMARY $PAGEMINOREDIT\n\nÙ¾Û\95Û\8cÙ\88Û\95Ù\86دÛ\8c Ù\84Û\95Ú¯Û\95Úµ Ø¯Û\95ستکارÛ\8cÚ©Û\95ر:\nÙ\86اÙ\85Û\95: $PAGEEDITOR_EMAIL\nÙ\88Û\8cÚ©Û\8c: $PAGEEDITOR_WIKI\n\nتا Ø³Û\95رداÙ\86Û\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ù\86Û\95Ú©Û\95Û\8cتØ\8c Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c Ø¯Ø§Ú¾Ø§ØªÙ\88Ù\88Û\8c Ù¾Û\95Ú\95Û\95Ú©Û\95ت Ù¾Û\8e Ú\95اÙ\86اگÛ\95Û\8cÛ\8eÙ\86درÛ\8eت. Ù\87Û\95رÙ\88Û\95ھا Ø¯Û\95تÙ\88اÙ\86Û\8c Ø¦Ø§ÚµØ§Ú©Ø§Ù\86Û\8c Ú\95اگÛ\95Û\8cاÙ\86دÙ\86 Ù\84Û\95 Ù¾Û\95Ú\95Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\8cÛ\95Ú©Û\95تدا Ù\84Û\95 Ø³Û\95رÛ\95تاÙ\88Û\95 Ú\95Û\8eÚ© Ø¨Ø®Û\95Û\8cتÛ\95Ù\88Û\95.\n\nبÛ\95 Ø³Ù¾Ø§Ø³Û\95Ù\88Û\95Ø\8c Ø³Û\8cستÛ\95می ڕاگەیاندنی {{SITENAME}}\n\n--\nبۆ گۆڕینی رێکخستنەکانی ڕاگەیاندن بە ئیمەیل، بڕوانە\n{{canonicalurl:{{#special:Preferences}}}}\n\nبۆ گۆڕینی ڕێکخستنەکانی پێرستی چاودێرییەکەت، بڕوانە\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nبۆ سڕینەوەی پەڕەکە لە پێرستی چاودێرییەکەت، بڕوانە\n$UNWATCHURL\n\nکاردانەوە و یارمەتیی زۆرتر:\n$HELPPAGE",
+       "enotif_body": "â\80«$WATCHINGUSERNAMEÛ\8c Ø¨Û\95Ú\95Û\8eزØ\8c\n\n$PAGEINTRO $NEWPAG\n\nÚ©Ù\88رتÛ\95Û\8c Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95Ú©Û\95Û\8c: $PAGESUMMARY $PAGEMINOREDIT\n\nÙ¾Û\95Û\8cÙ\88Û\95Ù\86دÛ\8c Ù\84Û\95Ú¯Û\95Úµ Ø¯Û\95ستکارÛ\8cÚ©Û\95ر:\nÙ\86اÙ\85Û\95: $PAGEEDITOR_EMAIL\nÙ\88Û\8cÚ©Û\8c: $PAGEEDITOR_WIKI\n\nتا Ø³Û\95رداÙ\86Û\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ù\86Û\95Ú©Û\95Û\8cتØ\8c Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c Ø¯Ø§Ú¾Ø§ØªÙ\88Ù\88Û\8c Ù¾Û\95Ú\95Û\95Ú©Û\95ت Ù¾Û\8e Ú\95اÙ\86اگÛ\95Û\8cÛ\8eÙ\86درÛ\8eت. Ù\87Û\95رÙ\88Û\95ھا Ø¯Û\95تÙ\88اÙ\86Û\8c Ø¦Ø§ÚµØ§Ú©Ø§Ù\86Û\8c Ú\95اگÛ\95Û\8cاÙ\86دÙ\86 Ù\84Û\95 Ù¾Û\95Ú\95Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\8cÛ\95Ú©Û\95تدا Ù\84Û\95 Ø³Û\95رÛ\95تاÙ\88Û\95 Ú\95Û\8eÚ© Ø¨Ø®Û\95Û\8cتÛ\95Ù\88Û\95.\n\nبÛ\95 Ø³Ù\88پاسÛ\95Ù\88Û\95Ø\8c Ø³Û\8cستمی ڕاگەیاندنی {{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": "پەڕە بسڕەوە",
        "delete-edit-reasonlist": "دەستکاری کردنی ھۆکارەکانی سڕینەوە",
        "delete-toobig": "ئەم لاپەڕە مێژوویەکی دەستکاری زۆر گەورەی هەیە، زیاتر لە $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}.\nبۆ بەرگری لە خراپ‌بوونی چاوەڕوان نەکراوی {{SITENAME}}، سڕینەوەی لاپەڕەی وا بەربەست‌کراوە.",
        "delete-warning-toobig": "ئەم پەڕەیە مێژوویەکی دەستکاریی زۆر گەورەی ھەیە، زۆرتر لە $1 {{PLURAL:$1|پێداچوونەوە}}.\nسڕینەوەی ئەو پەڕەیە لەوانەی کارەکانی بنکەدراوەی {{SITENAME}} تووشی کێشە بکات؛\nبە سەرنجەوە بچۆ پێشەوە.",
-       "deleting-backlinks-warning": "'''ھۆشدار:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|پەڕەکانی تر]] بەم پەڕەیەی دەتەوێ بیسڕییەوە بەستەر دراوە.",
+       "deleteprotected": "تۆ ناتوانیت ئەم پەڕەیە بسڕیتەوە لەبەرئەوەی پارێزراوە.",
+       "deleting-backlinks-warning": "'''ئاگاداری:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|پەڕەکانی تر]] بەم پەڕەیەی دەتەوێ بیسڕییەوە بەستەر دراوە.",
        "rollback": "گەڕاندنەوەی دەستکارییەکان",
        "rollbacklink": "گەڕاندنەوە",
        "rollbacklinkcount": "گەڕاندنەوەی $1 {{PLURAL:$1|دەستکاری}}",
        "alreadyrolled": "دوایین گۆڕانکارییەکان لەسەر [[:$1]] لە لایەن [[User:$2|$2]] ناگەڕێندرێنەوە ([[User talk:$2|لێدوان]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])؛ کەسێکی تر لە پێشدا دەستکاریی کردووە یان گەڕاندوویەتەوە.\n\nدوایین دەستکاری ئەم پەڕە [[User:$3|$3]] کردوویە ([[User talk:$3|لێدوان]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "پوختەی دەستکاری <em>$1</em> بوو.",
        "revertpage": "گەڕاندنەوەی دەستکارییەکانی [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین پێداچوونەوەی [[User:$1|$1]]",
-       "revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاڕدراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
+       "revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاردراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
        "rollback-success": "دەستکارییەکانی $1 وەرگێرایەوە؛<br />\nگۆڕدرا بۆ دوایین پێداچوونەوەی $2.",
        "sessionfailure": "لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.\nئەم کردەوە هەڵوەشێندرایەوە بۆ بەرگری لە دزینی دراوەکانی دانیشتن.\nتکایە بگەڕێوە بۆ پەڕەی پێشوو و نوێی بکەوە، ئینجا دیسان تاقیی بکەوە.",
        "changecontentmodel-title-label": "سەرناوی پەڕە",
        "changecontentmodel-reason-label": "هۆکار:",
+       "changecontentmodel-submit": "گۆڕین",
+       "logentry-contentmodel-change-revertlink": "گەڕاندنەوە",
+       "logentry-contentmodel-change-revert": "گەڕاندنەوە",
        "protectlogpage": "لۆگی پاراستن",
        "protectlogtext": "لە ژێرەوە پێرستێک لە گۆڕانکارییەکانی پەڕە پارێزراوەکان دەبینی.\nبۆ پێرستی ئەو پەڕانەی ئێستا پاراستنیان لە ئارادایە بڕوانە [[Special:ProtectedPages|پێرستی پەڕە پارێزراوەکان]].",
        "protectedarticle": "«[[$1]]»ی پاراست",
        "modifiedarticleprotection": "ئاستی پاراستنی «[[$1]]»ی گۆڕی",
        "unprotectedarticle": "پاراستنی لەسەر «[[$1]]» لابرد",
        "movedarticleprotection": "ڕێککارییەکانی پاراستن لە  «[[$2]]» گوازرایەوە بۆ «[[$1]]»",
+       "protectedarticle-comment": "«[[$1]]»ی {{GENDER:$2|پاراست}}",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|ئاستی پاراستنی گۆڕی}} بۆ «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|پاراستنی}} لەسەر ''[[$1]]'' لابرد",
        "protect-title": "گۆڕینی ئاستی پاراستنی \"$1\"",
        "protect-title-notallowed": "دیتنی ئاستی پاراستنی «$1»",
        "prot_1movedto2": "[[$1]] گوازرایەوە بۆ [[$2]]",
+       "protect-badnamespace-text": "ئەو پەڕانەی لەم بۆشایی ناوەدان ناتواندرێت بپارێزرێن.",
+       "protect-norestrictiontypes-text": "ئەم پەڕەیە ناتواندرێت بپارێزرێت چوونکە ھیچ جۆرێکی پاراستن بەردەست نییە.",
+       "protect-norestrictiontypes-title": "ئەو پەڕانەی کە ناپارێزرێن",
        "protect-legend": "پاراستن تەیید بکە",
        "protectcomment": "ھۆکار:",
        "protectexpiry": "ھەتا:",
        "protect-othertime": "کاتی تر:",
        "protect-othertime-op": "کاتی تر",
        "protect-existing-expiry": "ئەم کاتی بەسەرچوونی ماوە کە هەیە: $3، $2",
+       "protect-existing-expiry-infinity": "کاتی بەسەرچوون: بێ کۆتا",
        "protect-otherreason": "ھۆکاری تر/زیاتر:",
        "protect-otherreason-op": "ھۆکاری تر",
        "protect-dropdown": "*ھۆکارە باوەکانی پاراستن\n** خراپکاریی لەڕادەبەدەر\n** سپامی لەڕادەبەدەر\n** شەڕە دەستکاریی بێ‌سوود\n** پەڕەی زۆربینەردار",
        "undeletepagetext": "ئەم {{PLURAL:$1|سڕاوەتەوە|$1 لاپەڕە سڕاونەتەوە}} بەڵام لەبەر ئەوەی لە ئەرشیڤ‌دا هەن هێشتا دەتوانی بیانهێنیتەوە.\nئەرشیڤ چەن‌وەخت جارێ لە کاتی دیاری‌کراودا خاوێن‌دەکرێتەوە.",
        "undelete-fieldset-title": "هێنانەوەی پێداچوونەوەکان",
        "undeleteextrahelp": "بۆ ھێنانەوەی گشت مێژووی پەڕەکە، ھەموو چوارچێوەکانی نیشانکردن ھەڵنەبژێردراو بھێڵەوە و لە سەر '''''{{int:undeletebtn}}''''' کرتە بکە.\nبۆ ھێنانەوەی ھەڵبژێردراو، چوارچێوەی بەرامبەر بەو پێداچوونەویەی دەتەوێ بیھێنیتەوە، نیشان بکە و لە سەر '''''{{int:undeletebtn}}''''' کرتە بکە.",
-       "undeleterevisions": "$1 {{PLURAL:$1|Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95|Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95}} Ø¦Û\95رشÛ\8cÚ¤â\80\8cکرا",
+       "undeleterevisions": "$1 {{PLURAL:$1|Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95|Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95}} Ø³Ú\95دراÛ\8cÛ\95Ù\88Û\95",
        "undeletehistory": "ئەگەر پەڕەیەک بھێنیتەوە، ھەموو پێداچوونەوەکان دەگەڕێنەوە بۆ مێژووی پەڕە.\nئەگەر لە کاتی سڕانەوەی پەڕەکەوە، پەڕەیەک هەر بەو ناوەوە دروست کرابێت، پێداچوونەوە گەرێنراوەکان لە مێژووی پێشووەکەدا دەدرەکەوێت.",
        "undeletehistorynoadmin": "ئەم پەڕەیە سڕاوەتەوە.\nھۆکاری سڕینەوە و وردەکارییەکانی ئەو بەکارھێنەرانەی کە پێش سڕینەوەی دەستکارییان کردووە لە پۆختەی خوارەوەدا نیشان دراوە.\nدەقی ڕاستەقینەی ئەم پێداچوونەوە سڕراوانە تەنھا لەبەر دەستی بەڕێوەبەراندایە.",
        "undelete-revision": "پێداچوونەوەی سڕاوەی $1 (لە $4،  $5) لەلایەن $3:",
        "undeleteviewlink": "دیتن",
        "undeleteinvert": "ھەڵبژاردەکان پێچەوانە بکە",
        "undeletecomment": "هۆکار:",
-       "undeletedrevisions": "{{PLURAL:$1|$1 پێداچوونەوە}} هێنرایەوە",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 پێداچوونەوە|$1 پێداچوونەوە}} و {{PLURAL:$2|1 پەڕگە|$2 پەڕگە}} هێنرایەوە",
-       "undeletedfiles": "{{PLURAL:$1|1 پەڕگە|$1 پەڕگە}} هێنرایەوه",
        "cannotundelete": "ھێنانەوە سەرکەوتوو نەبوو:\n$1",
        "undeletedpage": "'''$1 هێنراوەتەوە'''\n\nبۆ دیتنی پێشینەی دوایین سڕینەوەکان و هێنانەوەکان سەرنجی [[Special:Log/delete|لۆگی سڕینەوە]] بدە.",
        "undelete-header": "بۆ دیتنی ئەو لاپەڕانەی لەم داییانەدا سڕاونەتەوە چاو لە [[Special:Log/delete|لۆگی سڕینەوە]] بکە.",
        "undelete-no-results": "لە ئەرشیڤی سڕاوەکانی لاپەڕەیەکی هاوتا نەدۆزرایەوە.",
        "undelete-cleanup-error": "هەڵە لە سڕینەوەی ئەرشیڤی بەکەڵک نەهاتووی پەڕگە \"$1\".",
        "undelete-missing-filearchive": "ناکرێ ئەرشیڤی پەڕگە بە پێناسەی $1 بهێنیتەوە لەبەر ئەوەی لە ناو بنکەی دراوە‌دا نییە.\nلەوانەیە لە‌پێش‌دا هێنرابێتەوە.",
+       "undelete-error": "کێشە دروست بوو لەکاتی ھەوڵدان بۆ ھێنانەوەی پەڕەکە",
        "undelete-error-short": "هەڵە لە گەڕاندنەوەی سڕینەوەی پەڕگە: $1",
        "undelete-error-long": "هەڵەیەک لە کاتی گەڕاندنەوەی سڕینەوەی پەڕگە ڕووی‌دا:\n\n$1",
        "undelete-show-file-confirm": "ئایا ئەرخەیانی کە دەتەوێ پێداچوونەوە سراوەکەی پەڕگەی \"<nowiki>$1</nowiki>\" لە $2 لە $3 ببینی؟",
        "undelete-show-file-submit": "بەڵێ",
        "namespace": "بۆشاییی ناو:",
        "invert": "ھەڵبژاردەکان پێچەوانە بکە",
+       "tooltip-invert": "نیشانە لەم بۆکسە بدە بۆ شاردنەوەی گۆڕانکارییەکانی ئەو پەڕانەی کە لە بۆشایی ناوی ھەڵبژێردراو و پەیوەندیدارەکاندا ئەنجام دراون.",
        "namespace_association": "بۆشاییی ناوی پەیوەندیدار",
+       "tooltip-namespace_association": "ھەروەھا نیشانە لەم بۆکسەش بدە بۆ شاردنەوەی پەڕەی لێدوانەکانیان",
        "blanknamespace": "(سەرەکی)",
        "contributions": "بەشدارییەکانی {{GENDER:$1|بەکارھێنەر}}",
        "contributions-title": "بەشدارییەکانی بەکارھێنەر $1",
        "mycontris": "بەشدارییەکان",
        "anoncontribs": "بەشدارییەکان",
        "contribsub2": "بۆ {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.",
        "nocontribs": "هیچ گۆڕانکاریەکی هاوتای ئەم پێوەرانە نودۆزرایەوە",
        "uctop": "(ھەنووکە)",
        "month": "لە مانگی (و پێشترەوە):",
        "whatlinkshere-hideimages": "$1 بەستەرەکانی پەڕگە",
        "whatlinkshere-filters": "پاڵێوکەکان",
        "whatlinkshere-submit": "بڕۆ",
+       "autoblockid": "بەربەستی ئۆتۆماتیکی #$1",
        "block": "بەربەستنی بەکارھێنەر",
        "unblock": "لە بەربەست‌دەرهێنانی بەکارهێنەر",
        "blockip": "بەربەستنی {{GENDER:$1|بەکارھێنەر}}",
        "ipbwatchuser": "پەڕەکانی بەکارھێنەر و لێدوانی ئەم بەکارهێنەرە بخە ژێر چاودێری",
        "ipb-disableusertalk": "بەرگری ئەم بەکارھێنەرە بکە لە دستکاریکردنی پەڕەی لێدوانەکەی کاتێک بەربەست کراوە",
        "ipb-change-block": "دیسان بەربەست‌کردنەوەی ئەم بەکارهێنەرە بەم هەڵبژاردانە",
+       "ipb-confirm": "بەربەست کردن دڵنیا بکەرەوە",
        "badipaddress": "ناونیشانی ئای‌پی نەگونجاو",
        "blockipsuccesssub": "بەربەست کردن سەرکەوتوو بوو",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] بەربەست کرا.<br />\nبڕوانە [[Special:BlockList|پێرستی بەربەستن]] بۆ بەسەرداچوونەوەی بەربەستنەکان.",
+       "ipb-blockingself": "تۆ خەریکە خۆت بەربەست دەکەیت! دڵنیایت کە دەتەوێت ئەم کارە بکەیت؟",
        "ipb-edit-dropdown": "دەستکاری هۆکارەکانی بەربەست",
        "ipb-unblock-addr": "لە بەربەست‌دەرهێنانی $1",
        "ipb-unblock": "لە بەربەست‌دەرهێنانی ناوی بەکارهێنەریەک یا ناونیشانێکی ئای‌پی",
        "ipb-blocklist": "دیتنی ئەو بەربەستانەی وا هەیە",
        "ipb-blocklist-contribs": "بەشدارییەکانی {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "$1 ماوە",
        "unblockip": "لە بەربەست‌دەرهێنانی بەکارهێنەر",
        "unblockiptext": "بۆ گەڕاندنەوەی دەست‌پی‌گەیشتنی نووسین بۆ ئەو دوایین ئای‌پی یان بەکارهێنەری بەربەست کراوە، لەو فۆرمەی خوارەوە کەڵک وەرگرە.",
        "ipusubmit": "لابردنی ئەم بەربەستە",
        "unblocked": "[[User:$1|$1]] لە بەربەست دەرهێنرا",
+       "unblocked-range": "بەربەست لەسەر $1 لابرا.",
        "unblocked-id": "بەربەستی $1 لابرا",
+       "unblocked-ip": "بەربەست لەسەر [[Special:Contributions/$1|$1]] لابرا.",
        "blocklist": "بەکارھێنەرە بەربەستکراوەکان",
+       "autoblocklist": "بەربەستی ئۆتۆماتیکی",
+       "autoblocklist-submit": "گەڕان",
        "ipblocklist": "بەکارھێنەرە بەربەستکراوەکان",
        "ipblocklist-legend": "دۆزینەوەی بەکارهێنەرێکی بەربەست‌کراو",
        "blocklist-userblocks": "ھەژمارە بەربەستکراوەکان بشارەوە",
+       "blocklist-tempblocks": "بەربەستە کاتییەکان بشارەوە",
+       "blocklist-addressblocks": "بەربەستی تاک ئای-پییەکان بشارەوە",
        "blocklist-target": "مەبەست",
        "blocklist-expiry": "ھەتا:",
        "blocklist-by": "بەڕێوەبەری بەربەستکەر",
        "proxyblockreason": "ناونیشانی ئای‌پی تۆ بەربەست‌کراوە لەبەر ئەوەی پرۆکسیەکی کراوەیە.\nتکایە پەیوەندی بکە بە دابینکەری خزمەتی ئینتەرنەتی خۆت یان پاڵپشتی تەکنیکی و ئاگادریان کەوە لەو کێشە ئەمنیە گرینگە.",
        "sorbsreason": "ناونیشانی ئای‌پی تۆ لە DNSBLدا کە {{SITENAME}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە.",
        "sorbs_create_account_reason": "ناونیشانی ئای‌پی تۆ لە DNSBLدا کە {{SITENAME}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە.\nبۆیە ناتوانی هەژمارە درووست‌بکەی.",
+       "cant-see-hidden-user": "ئەو بەکارھێنەرەی تۆ ھەوڵی بەربەستکردنی دەدەیت پێشووتر بەربەست کراوە و شاردراوەتەوە. لەبەر ئەوەی تۆ مافی شاردنەوەی بەکارھێنەرت نییە، تۆ ناتوانیت بەربەستی بەکارھێنەرەکە ببیبیت یان دەستکاری بکەیت.",
        "ipbblocked": "ناتوانی بەکارھێنەرانی تر بەربەست بکەیت یان بکەیتەوە، چونکوو خۆت بەربەست کراوی.",
+       "ipbnounblockself": "تۆ ڕێگە پێ نەدراویت کە بەربەست لەسەر خۆت لابەریت.",
        "lockdb": "داخستنی بنکەدراوە",
        "unlockdb": "کردنەوەی بنکەدراوە",
        "lockdbtext": "داخستنی بنکەدراوە ئەبێتە هۆی ڕاگرتنی توانای هەموو بەکارهێنەران بۆ دەستکاری لاپەڕەکان، گۆڕانی هەڵبژاردەکانیان، دەستکاری لیستی چاودێرییەکانیان و هەموو ئەموو ئەو شتانە وا پێویستی بە گۆرانکاری لە بنکەدراوە هەیە.\nتکایە ئەرخەیان بە ئەمە هەر ئەوەیە کە دەتەوێ بیکەی و دوای چاکسازیەکەت لەیادت بێ کە بنکەدراوەکە بکەیتەوە.",
        "lockdbsuccesstext": "بنکەدراو داخرا.<br />\nلەیادت بێ دوای تەواوبوونی چاکسازی [[Special:UnlockDB|بنکەدراو بکەیتەوە]].",
        "unlockdbsuccesstext": "بنکەدراو کرایەوە.",
        "lockfilenotwritable": "پەڕگەی داخستنی بنکەدراو سەرنووس ناکرێت.\nبۆ کردنەوە یا داخستنی بنکەدراو، پێویستە ڕاژەکار بتوانێ ئەو پەڕگە سەرنووس بکات.",
+       "databaselocked": "بنکەدراوەکە پێشووتر داخراوە.",
        "databasenotlocked": "بنکەدراو دانەخراوە.",
+       "lockedbyandtime": "(لەلایەن {{GENDER:$1|$1}} لە $2 لە $3)",
        "move-page": "$1 بگوازەوە",
        "move-page-legend": "گواستنەوەی پەڕە",
        "movepagetext": "بەکارھێنانی ئەم فۆرمەی خوارەوە ناوی پەڕەیەک دەگۆڕێت، بە گواستنەوەی ھەموو مێژووەکەی بۆ ناوی نوێ.\nناوە کۆنەکە دەبێتە پەڕەیەکی ئاڕاستەکردنەوە بۆ ناوە نوێکە.\nدەتوانی ئاڕاستەکان بۆ پەڕەی سەرەکی بەشێوەی خۆکار نوێ بکەیتەوە.\nدڵنیا بە کە [[Special:DoubleRedirects|دووجار ڕەوانەکراوەکان]] یان [[Special:BrokenRedirects|ڕەوانەکراوە شکاوەکان]] تاقی بکەیتەوە.\nتۆ بەرپرسیاری لەوەی کە دڵنیا ببیتەوە بەستەرەکان ھەر پێوەندییان ھەیە بەو شوێنە کە چاوەڕوان دەکرێت.\n\nدەبێت بزانی کە پەڕەکە '''ناگوازرێتەوە''' ئەگەر پێشتر پەڕەیەک بە ناوە نوێکەوە ھەبێت، مەگەر ئەوەی کە پەڕەکە واڵا یان ڕەوانەکراوەیەک بێت و ھیچ مێژووی گۆڕاندنی پێشووی نەبێت.\nئەمە بەو واتایە کە ئەگەر ھەڵەیەک بکەی دەتوانی ناوی پەڕەکە دیسانەوە بگۆڕی بۆ ناوی پێشووی، و ناتوانی بیخەیتە جێگەی پەڕەیەک کە ھەنووکە ھەیە.\n\n'''ھۆشیار بە!'''\nئەمە دەتوانێت گۆڕانێکی زۆر نابەجێ و چاوەڕێنەکراو بێت بۆ پەڕەیەکی بەناوبانگ؛\nتکایە پێش گۆڕینی ناو باش بیر لە ئاکامەکەی بکەوە.",
        "movenotallowedfile": "ڕێگەت پێ‌نەدراوە بۆ گواستنەوەی پەڕگەکان.",
        "cant-move-user-page": "ڕێگەت پێ‌نەدراوە بۆ گواستنەوەی لاپەڕەکانی بەکارهێنەر (جیاواز لە ژێرلاپەڕەکان).",
        "cant-move-to-user-page": "مافی ئەوەت نییە کە پەڕەیەک بگوێزیتەوە بۆ پەڕەیەکی بەکارھێنەری (بەڵام بۆ ژێرپەڕەیەکی بەکارھێنەری دەتوانیت).",
+       "cant-move-category-page": "تۆ مۆڵەتت نییە بۆ گواستناوەی پۆلەکان.",
+       "cant-move-to-category-page": "تۆ مۆڵەتت نییە بۆ گواستنەوەی پەڕەیەک بۆ پۆلێک.",
        "newtitle": "بۆ ناوی نوێی:",
        "move-watch": "پەڕەی سەرچاوە و مەبەست بخە ژێر چاودێری",
        "movepagebtn": "ئەم پەڕەیە بگوازەوە",
        "immobile-source-namespace": "پەڕەکان لە بۆشاییی ناوی \"$1\"دا ناگوێزرێنەوە.",
        "immobile-target-namespace": "گواستنەوەی لاپەڕە بۆناو بۆشایی‌ناو \"$1\" ناکرێت.",
        "immobile-target-namespace-iw": "بەستەرێکی نێوان‌ویکی ئامانجێکی گونجاو نیە بۆ گواستنەوەی لاپەڕە.",
-       "immobile-source-page": "ئەمە لاپەڕە بۆ گواستنەوە نابێت.",
+       "immobile-source-page": "ئەم لاپەڕەیە بۆ گواستنەوە نابێت.",
        "immobile-target-page": "بۆ ئەم سەردێڕی ئامانجە جێگۆڕ ناکرێ.",
        "imagenocrossnamespace": "گواستنەوەی پەڕگە بۆ بۆشایی‌نوێکی غەیری پەڕگە گونجاو نیە.",
        "nonfile-cannot-move-to-file": "گواستنەوەی پەڕگە بۆ بۆشایی‌نوێکی غەیری پەڕگە گونجاو نیە.",
        "exportall": "ھەموو پەڕەکان ھەناردە بکە",
        "exportcuronly": "تەنها پێداچوونەوەی ئێستا لەخۆ بگرێت نەک هەموو مێژوو",
        "exportnohistory": "----\n'''ئاگاداربە: '''ھەناردنی ھەموو مێژووی پەڕەکان لەم فۆرمەوە لەبەر ھۆکاری ڕێخستن، داخراوە.",
+       "exportlistauthors": "پێڕستێکی تەواوی بەشداربووان بۆ ھەر پەڕەیەک پیشان بدە",
        "export-submit": "هەناردن",
        "export-addcattext": "پەڕەکان زێدەبکە لە پۆلی:",
        "export-addcat": "زیاد بکە",
        "export-download": "وەک پەڕگە پاشەکەوتی بکە",
        "export-templates": "داڕێژەکانیش لە خۆگرێت",
        "export-pagelinks": "لەخۆگرتنی لاپەڕەکانی بەستەر پێ‌دراو هەتا قووڵایی:",
+       "export-manual": "پەڕەکان بە دەست زیاد بکە:",
        "allmessages": "پەیامەکانی سیستەم",
        "allmessagesname": "ناو",
        "allmessagesdefault": "دەقی بنەڕەتی",
        "allmessages-prefix": "پاڵێو بە پێشگر:",
        "allmessages-language": "زمان:",
        "allmessages-filter-submit": "بڕۆ",
+       "allmessages-filter-translate": "وەرگێڕان",
        "thumbnail-more": "گەورە کردنەوە",
        "filemissing": "ون‌بوونی پەڕگە",
        "thumbnail_error": "هەڵە کاتی درووست‌کردنی هێما: $1",
        "tooltip-pt-preferences": "{{GENDER:|هەڵبژاردەکانت}}",
        "tooltip-pt-watchlist": "پێڕستی ئەو پەڕانەی کە چاودێریی گۆڕانکارییەکانیان دەکەیت",
        "tooltip-pt-mycontris": "پێڕستی بەشدارییەکان",
+       "tooltip-pt-anoncontribs": "پێڕستی ئەو دەستکارییانەی لەم ناونیشانی ئای-پییەوە کراوە",
        "tooltip-pt-login": "پێشنیارت پێدەکرێ بچیتە ژوورەوە؛ ھەرچەندە زۆرت لێناکرێ",
+       "tooltip-pt-login-private": "پێویستە بچیتە ژوورەوە بۆ بەکارھێنانی ئەم ویکیپیدیایە",
        "tooltip-pt-logout": "دەرچوون",
        "tooltip-pt-createaccount": "تۆ ھان دەدرێیت کە ھەژمارێک دروست بکەیت و بچیتە ژوورەوە، ئەمە سەرەکی نییە بەھەرحاڵ",
        "tooltip-ca-talk": "وتووێژ سەبارەت بە پەڕەی ناوەڕۆک",
        "tooltip-feed-atom": "Atom feed بۆ ئەم پەڕە",
        "tooltip-t-contributions": "پێڕستی بەشدارییەکانی {{GENDER:$1|ئەم بەکارھێنەرە}}",
        "tooltip-t-emailuser": "ئیمەیڵێک بنێرە بۆ {{GENDER:$1|ئەم بەکارھێنەرە}}",
+       "tooltip-t-info": "زانیاری زیاتر لەبارەی ئەم پەڕەیەوە",
        "tooltip-t-upload": "پەڕگە بار بکە",
        "tooltip-t-specialpages": "پێڕستی ھەموو پەڕە تایبەتەکان",
        "tooltip-t-print": "وەشانی چاپی ئەم پەڕەیە",
        "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-hidden-categories": "{{PLURAL:$1|پۆلی شاردراوە|پۆلە شاردراوەکان}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|داڕێژەی|داڕێژە}} {{PLURAL:$1|بەکارگیراو|بەکارگیراوەکان}} ($1)",
        "pageinfo-toolboxlink": "زانیاریی پەڕە",
+       "pageinfo-redirectsto": "ڕەوانە دەکرێت بۆ",
        "pageinfo-redirectsto-info": "زانیاری",
        "pageinfo-contentpage": "ھەژمارکراو وەک پەڕەی بەناوەرۆک",
        "pageinfo-contentpage-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",
        "newimages-summary": "ئەم پەڕە تایبەتە دوایین پەڕگە بارکراوەکان نیشان دەدات.",
        "newimages-legend": "پاڵاوتن",
        "newimages-label": "ناوی پەڕگە (یان بەشێکیی):",
+       "newimages-user": "ناونیشانی ئای-پی یان ناوی‌ بەکارھێنەر",
+       "newimages-showbots": "بارکردنی بۆتەکان پیشان بدە",
+       "newimages-hidepatrolled": "شاردنەوەی بارکردنە پاسدراوەکان",
        "noimages": "هیچ بۆ بینین نییە.",
        "ilsubmit": "بگەڕێ",
        "bydate": "بەپێی ڕێکەوت",
        "exif-imagelength": "بەرزی",
        "exif-orientation": "ئاڕاستە",
        "exif-ycbcrpositioning": "شوێنی Y و C",
+       "exif-xresolution": "شێوازی ئاسۆیی",
+       "exif-yresolution": "شێوازی ستوونی",
        "exif-datetime": "ڕێکەوتی و کاتی گۆڕانی پەڕگە",
        "exif-imagedescription": "ناونیشانی وێنە",
        "exif-make": "بەرھەمھێنەری کامێرا",
        "exif-model": "جۆری کامێرا",
        "exif-software": "نەرمەواڵەی بەکارهاتوو",
        "exif-artist": "نووسەر",
+       "exif-copyright": "ھەڵگری مۆڵەتنامە",
        "exif-exifversion": "وەشانی exif",
        "exif-colorspace": "بۆشایی ره‌نگ",
        "exif-pixelxdimension": "پانی وێنە",
        "exif-cameraownername": "خاوەنی کامێرا",
        "exif-rating": "تازیاری (لە ٥)",
        "exif-copyrighted": "ڕەوشی مافی لەبەرگرتنەوە",
+       "exif-copyrightowner": "خاوەنی مافی بڵاوکردنەوە",
+       "exif-usageterms": "مەرجەکانی بەکارھێنان",
+       "exif-attributionurl": "لەکاتی بەکارھێنانی ئەم کارە، تکایە بەستەر بدە بۆ",
+       "exif-preferredattributionname": "لەکاتی بەکارھێنانی ئەم کارە، تکایە ئاماژە بکە بە",
        "exif-pngfilecomment": "تێبینیی پەڕگەی PNG",
+       "exif-disclaimer": "نابەرپرسییەکان",
        "exif-contentwarning": "ھۆشداری ناوەرۆک",
        "exif-giffilecomment": "تێبینیی پەڕگەی GIF",
        "exif-intellectualgenre": "جۆری بابەت",
        "exif-compression-1": "نەپەستێنراو",
        "exif-copyrighted-true": "خاوەنی مافی بڵاوکردنەوە",
        "exif-copyrighted-false": "ڕەوشی مافی لەبەرگرتنەوە دیاری نەکراوە",
+       "exif-photometricinterpretation-1": "ڕەش و سپی (ڕەش ٠)",
        "exif-unknowndate": "ڕێکەوتی نەزانراو",
        "exif-orientation-1": "ئاسایی",
        "exif-orientation-2": "ئاسۆیی هەڵگێڕدراوەتەوە",
        "exif-orientation-3": "١٨٠° سوڕاوەتەوە",
        "exif-orientation-4": "ستوونی هەڵگێڕدراوەتەوە",
        "exif-componentsconfiguration-0": "بوونی نییە",
+       "exif-exposureprogram-0": "پێناسە نەکراوە",
        "exif-exposureprogram-1": "دەستکار",
        "exif-exposureprogram-2": "بەرنامەی ئاسایی",
        "exif-subjectdistance-value": "$1 مەتر",
        "exif-gpsdestdistance-k": "کیلۆمەتر",
        "exif-gpsdestdistance-m": "میل",
        "exif-gpsdestdistance-n": "میکی دەریایی",
+       "exif-gpsdop-excellent": "نایابە ($1)",
        "exif-gpsdop-good": "چاک ($1)",
+       "exif-gpsdop-moderate": "مامناوەندە ($1)",
+       "exif-gpsdop-fair": "ئاساییە ($1)",
+       "exif-gpsdop-poor": "ھەژارە ($1)",
        "exif-objectcycle-a": "تەنیا بەیانان",
        "exif-objectcycle-p": "تەنیا ئێواران",
        "exif-objectcycle-b": "بەیانان و ئێواران",
        "confirmemail_body_set": "کەسێک، لەوانەیە خۆت، لە ناونیشانی IPی $1 ـەوە،\nلە {{SITENAME}}دا، ناونیشانیی ئیمێلی ھەژماری «$2»ی کردووە بەم ناونیشانە.\n\nبۆ پشتڕاستکردنەوەی ئەوەی کە ئەم ھەژمارە بە ڕاستی ھی تۆیە و بۆ چالاککردنەوەی ئامرازە ئیمێلییەکانی {{SITENAME}}، ئەم لینکە لە وێبگەڕەکەتدا بکەرەوە:\n\n$3\n\nئەگەر ھەژمارەکە ھی تۆ *نییە*، بۆ هەڵوەشاندنەوەی پشتڕاستکردنەوەی ناونیشانی ئیمێل، شوێنی ئەم لینکە بکەوە:\n\n$5\n\nماوەی ئەم کۆدی پشتڕاستکردنەوەیە لە $4دا بە سەر دەچێت.",
        "confirmemail_invalidated": "بڕواپی‌کردنی ناونیشانی ئی‌مەیل هەڵوەشێندراوە",
        "invalidateemail": "هەڵوەشاندنەوەی بڕواپێ‌کردنی ئی‌مەیل",
+       "notificationemail_body_changed": "کەسێک، کە لەوانەیە خۆت بووبێت، لە ناونیشانی IPی $1، ناونیشانی پۆستی ئەلیکترۆنی لە $2ەوە گۆڕی بە $3 لە {{SITENAME}}.\n\nئەگەر ئەمە تۆ نەبوویت، ھەر ئێستا پەیوەندی بە بەڕێوەبەرێکی سایتەکەوە بکە.",
+       "notificationemail_body_removed": "کەسێک، کە لەوانەیە خۆت بووبێت، لە ناونیشانی ئای-پی $1، ناونیشانی پۆستی ئەلیکترۆنی ھەژماری $2 لابرد لە {{SITENAME}}.\n\nئەگەر ئەمە تۆ نەبوویت، ھەر ئێستا پەیوەندی بە بەڕێوەبەرێکی سایتەکەوە بکە.",
        "scarytranscludetoolong": "[URL زۆر درێژە]",
        "deletedwhileediting": "'''ھۆشیار بە''': ئەم پەڕە دوای ئەوە تۆ دەستکاریکردنیت دەستپێکرد سڕاوەتەوە!",
        "confirmrecreate-noreason": "بەکارھێنەر [[User:$1|$1]] ([[User talk:$1|talk]]) پەڕەکەی سڕییەوە پاش ئەوەی تۆ دەستکاریکردنی پەڕەکەت دەستپێکرد. تکایە پشتڕاستی بکەوە کە بە ڕاستی دەتەوێ دیسان ئەم پەڕە دروست بکەیتەوە.",
        "recreate": "درووست‌کردنەوە",
+       "confirm-purge-title": "ئەم پەڕەیە پاک بکەرەوە",
        "confirm_purge_button": "باشە",
+       "confirm-purge-top": "کاشی ئەم پەڕەیە پاکبکرێتەوە؟",
+       "confirm-purge-bottom": "پاکسازیکردنی پەڕەیەک کاشەکەی پاکدەکاتەوە و نوێترین وەشانی دەردەخات.",
        "confirm-watch-button": "باشە",
        "confirm-watch-top": "زێدەکردنی ئەم پەڕە بە لیستی چاودێریت؟",
        "confirm-unwatch-button": "باشه‌",
        "confirm-unwatch-top": "ئەم پەڕە لە لیستی چاودێریت لاببرێت؟",
+       "confirm-rollback-button": "باشە",
        "semicolon-separator": "؛&#32;",
        "comma-separator": "،&#32;",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← پەڕەی پێشوو",
        "imgmultipagenext": "پەڕەی داهاتوو →",
        "imgmultigo": "بڕۆ!",
        "watchlistedit-raw-done": "لیستی چاودێریەکەت نوێ‌کرایەوە",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 سەردێڕ|$1 سەردێڕ}} زیادکرا:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 سەردێڕ|$1 سەردێڕ}} لابرا:",
+       "watchlistedit-clear-title": "خاوێنکردنی پێڕستی چاودێری",
+       "watchlistedit-clear-legend": "خاوێنکردنی پێڕستی چاودێری",
+       "watchlistedit-clear-explain": "ھەموو پەڕەکان لە پێڕستی چاودێریت لادەبرێن",
        "watchlistedit-clear-titles": "ناونیشانەکان :",
+       "watchlistedit-clear-submit": "خاوێنکردنی پێڕستی چاودێری (ئەمە ھەمیشەییە!)",
+       "watchlistedit-clear-done": "پێڕستی چاودێریت خاوێن کرایەوە",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 سەردێڕ|$1 سەردێڕ}} لابرا:",
+       "watchlistedit-too-many": "پەڕەکان زۆرن بۆ پیشاندانیان لێرەدا.",
        "watchlisttools-clear": "لیستی چاودێری پاک بکەرەوە",
        "watchlisttools-view": "گۆڕانکارییە پەیوەندیدارەکان ببینە",
        "watchlisttools-edit": "لیستی چاودێری ببینە و دەستکاری بکە",
        "hebrew-calendar-m7-gen": "نیسان",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|لێدوان]])",
        "timezone-utc": "UTC",
+       "timezone-local": "ناوخۆیی",
        "duplicate-defaultsort": "'''ئاگاداری''' کلیلی پۆلێنکردنی \"$2'' چووەتە شوێنی کلیلی پۆلێنکردنی  \"$1\"",
        "version": "وەشان",
        "version-extensions": "پێوەکراوە دامەزراوەکان",
        "version-hook-name": "ناوی قولاپ",
        "version-hook-subscribedby": "بەشداربوو لە لایەن",
        "version-version": "($1)",
+       "version-no-ext-name": "[بێ ناو]",
        "version-license": "مۆڵەتنامە",
+       "version-ext-license": "مۆڵەتنامە",
        "version-ext-colheader-version": "وەشان",
+       "version-ext-colheader-license": "مۆڵەتنامە",
        "version-ext-colheader-description": "وەسف",
+       "version-ext-colheader-credits": "بەرھەمھێنەر",
        "version-poweredby-others": "دیکە",
        "version-software": "نەرمەکاڵای دامەزراو",
        "version-software-product": "بەرهەم",
        "version-software-version": "وەشان",
        "version-entrypoints-header-url": "ناونیشانی ئینتەرنێتی",
+       "version-libraries-version": "وەشان",
        "version-libraries-license": "مۆڵەت",
        "version-libraries-description": "وەسف",
        "version-libraries-authors": "نووسەر",
        "tags-tag": "ناوی تاگ",
        "tags-display-header": "دەرکەوتنی لە پێرستەکانی گۆڕانکاری",
        "tags-description-header": "وەسفی ماناکەی بە تەواوی",
+       "tags-source-header": "سەرچاوە",
+       "tags-active-header": "چالاک؟",
        "tags-hitcount-header": "گۆڕانکاریە تاگ‌کراوەکان",
+       "tags-actions-header": "کردەوەکان",
        "tags-active-yes": "بەڵێ",
        "tags-active-no": "نا",
        "tags-edit": "دەستکاری",
        "tags-delete": "سڕینەوە",
+       "tags-activate": "کارپێکردن",
+       "tags-deactivate": "لەکارخستن",
        "tags-hitcount": "$1 {{PLURAL:$1|گۆڕان|گۆڕانکاری}}",
+       "tags-create-heading": "تاگی نوێ دروست بکە",
+       "tags-create-tag-name": "ناوی تاگ:",
+       "tags-create-reason": "هۆکار:",
+       "tags-create-submit": "دروستکردن",
+       "tags-create-no-name": "پێویستە ئامژە بە ناوی تاگ بدەیت.",
+       "tags-create-invalid-chars": "تاگەکان نابێت بۆر (<code>،</code>) یان سلاش (<code>/</code>)یان تێدابێت.",
+       "tags-delete-reason": "هۆکار:",
        "comparepages": "پەڕەکان ھەڵسەنگێنە",
        "compare-page1": "پەڕەی ١",
        "compare-page2": "پەڕەی ٢",
        "htmlform-title-not-creatable": "«$1» سەرناوێک نییە کە بکرێت پەڕەی بۆ دروست بکرێت",
        "htmlform-title-not-exists": "$1 بوونی نیە.",
        "logentry-delete-delete": "$1 پەڕەی $3ی {{GENDER:$2|سڕییەوە}}",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|ڕەوانەکەری}} $3 سڕیەوە",
        "logentry-delete-restore": "$1 پەڕەی $3ی {{GENDER:$2|ھێنایەوە}}",
        "logentry-delete-revision": "$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3ی {{GENDER:$2|گۆڕیی}}: $4",
        "logentry-suppress-delete": "$1 پەڕەی $3 {{GENDER:$2|بەرگری کرد}}.",
        "logentry-newusers-create2": "ھەژماری بەکارھێنەریی $3 لە لایەن $1 {{GENDER:$2|دروست کرا}}",
        "logentry-newusers-byemail": "ھەژماری بەکارھێنەریی $3 لە لایەن $1 {{GENDER:$2|دروست کرا}} و تێپەڕوشە بە ئیمەیل نێردرا",
        "logentry-newusers-autocreate": "ھەژماری بەکارھێنەریی $1 بە شێوەی خۆگەڕ {{GENDER:$2|دروست کرا}}",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2}} ڕێکخستنەکانی پاراستنی گۆڕی لە $4 بۆ $3",
        "logentry-protect-protect": "$1 $3ی {{GENDER:$2|پاراست}} $4",
        "logentry-protect-modify": "$1 ئاستی پاراستنی $3ی {{GENDER:$2|گۆڕی}} $4",
        "logentry-rights-rights": "$1 ئەندامێتیی {{GENDER:$6|$3}}ی لە $4 بۆ $5 {{GENDER:$2|گۆڕی}}",
        "logentry-upload-upload": "$1 $3ی {{GENDER:$2|بار کرد}}",
        "logentry-upload-overwrite": "$1 وەشانێکی نوێی $3ی {{GENDER:$2|بار کرد}}",
        "rightsnone": "(ھیچ)",
-       "revdelete-summary": "پوختەی دەستکاری",
        "feedback-back": "گەڕانەوە",
        "feedback-cancel": "ھەڵوەشاندنەوە",
        "feedback-close": "کرا",
        "special-characters-group-thai": "تایلەندی",
        "special-characters-group-khmer": "خمێری",
        "log-action-filter-all": "ھەموو",
-       "log-action-filter-upload-upload": "بارکردنی نوێ"
+       "log-action-filter-upload-upload": "بارکردنی نوێ",
+       "authmanager-email-label": "ئیمەیڵ"
 }
index 457ee31..d7ea238 100644 (file)
        "yourdomainname": "U to duminiu:",
        "login": "Cunnessione",
        "nav-login-createaccount": "Cunnessione / registramentu",
-       "userlogin": "Cunnessione / registramentu",
        "logout": "Scunnessione",
        "userlogout": "Scunnessione",
-       "nologin": "Ùn ha ancu un accessu? $1.",
-       "nologinlink": "Registramentu",
        "createaccount": "Registramentu",
-       "gotaccount": "Ùn ha ancu un accessu? $1.",
-       "gotaccountlink": "Cunnessione",
-       "createaccountreason": "Mutivu:",
        "createacct-reason": "Mutivu",
        "loginsuccesstitle": "Cunnessione fatta",
        "acct_creation_throttle_hit": "Desulatu, ai digià fattu $1 registramenti. Ùn ne poi micca fà d'altri.",
        "mypreferences": "Preferenze",
        "prefs-rc": "Ultimi cambiamenti",
        "prefs-watchlist": "Articuli seguitati",
-       "columns": "Culonne:",
        "searchresultshead": "Ricerca",
        "localtime": "Ora lucale",
        "allowemail": "Abilità a ricezzione di e-mail da altri utilizatori",
        "rcshowhideanons": "$1 i cuntributori anonimi",
        "rcshowhidepatr": "$1 e mudifiche verificate",
        "rcshowhidemine": "$1 e mo cuntribuzioni",
-       "rclinks": "Mustrà l'ultime $1 mudifiche in i $2 ghjorni scorsi<br />$3",
+       "rclinks": "Mustrà l'ultime $1 mudifiche in i $2 ghjorni scorsi",
        "hist": "cron",
        "hide": "piattà",
        "show": "mustrà",
index 0899e65..e4376c2 100644 (file)
@@ -5,7 +5,8 @@
                        "Oxyzen",
                        "Reedy",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "Kuritan sa idalum ang mga link",
        "yourdomainname": "Imo domain:",
        "login": "Mag sulod",
        "nav-login-createaccount": "Magsulod / mag-ubra sang account",
-       "userlogin": "Mag sulod / mag-ubra account",
-       "userloginnocreate": "Magsulod",
        "logout": "Maggwa",
        "userlogout": "Maggwa",
        "notloggedin": "Wala nakasulod",
-       "nologin": "Wala ka account? '''$1'''.",
-       "nologinlink": "Mag-ubra account",
        "createaccount": "Mag-ubra account",
-       "gotaccount": "May account ka na bala? '''$1'''.",
-       "gotaccountlink": "Magsulod",
        "createaccountmail": "Paagi sa email",
        "badretype": "Wala gasanto ang password nga imo ginsulod",
        "userexists": "May naga-usar na sang ginpasulod nga ngalan manug-usar.\nMagpili sang iban nga ngalan.",
        "rcshowhideliu": "$1 ka mga gagamit nga naka-sulod",
        "rcshowhideanons": "$1 ang wala nakilal-an nga mga ga-usar",
        "rcshowhidemine": "$1 akon mga na-islan",
-       "rclinks": "Ipakita ang nagligad ka $1 nga nabag-o lang gid sang $2 ka adlaw<br  />$3",
+       "rclinks": "Ipakita ang nagligad ka $1 nga nabag-o lang gid sang $2 ka adlaw",
        "diff": "ginkala-in",
        "hist": "kasaysayan",
        "hide": "Itago",
index 3e1aa18..f62c64f 100644 (file)
@@ -9,7 +9,8 @@
                        "Исмаил Садуев",
                        "Умар",
                        "Macofe",
-                       "Danvintius Bookix"
+                       "Danvintius Bookix",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "Багълантыларнынъ тюбюни сызув:",
        "externaldberror": "Сайткъа киргенде бир хата олды. Бу тыш эсабынъызны денъиштирмек акъкъынъыз олмагъанындан себеп мейдангъа келип ола.",
        "login": "Кириш",
        "nav-login-createaccount": "Кириш / Къайд олув",
-       "userlogin": "Кириш / Къайд олув",
-       "userloginnocreate": "Кириш",
        "logout": "Чыкъыш",
        "userlogout": "Чыкъыш",
        "notloggedin": "Системагъа кирмединъиз.",
        "userlogin-noaccount": "Аккаунтынъыз ёкъмы?",
        "userlogin-joinproject": "{{SITENAME}} лейхасына къошулынъыз",
-       "nologin": "Даа эсап ачмадынъызмы? '''$1'''.",
-       "nologinlink": "Къайд ол",
        "createaccount": "Къайд олув",
-       "gotaccount": "Даа эвель сайтта къайд олгъан эдинъизми? '''$1'''.",
-       "gotaccountlink": "Системагъа киринъиз",
-       "userlogin-resetlink": "Кириш малюматыны унуттынъызмы?",
        "createacct-emailrequired": "E-mail adresi",
        "createacct-emailoptional": "E-mail адреси (меджбурий дегиль)",
        "createacct-email-ph": "E-mail адресинъизни язынъыз",
        "createacct-another-email-ph": "E-mail адресинъизни язынъыз",
        "createaccountmail": "Автоматик оларакъ мейдангъа кетирильген мувакъкъат бир пароль къуллана билир ве бу парольни бильдирильген e-mail адресине ёллай билирсинъиз",
        "createacct-realname": "Акъикъий адынъыз (меджбурий дегиль)",
-       "createaccountreason": "Себеп:",
        "createacct-reason": "Себеп",
        "createacct-reason-ph": "Башкъа бир эсап язысы неден себеп яратасынъыз",
        "createacct-submit": "Эсап язынъызны яратынъыз",
        "watchthis": "Саифени козет",
        "savearticle": "Саифени сакъла",
        "savechanges": "Денъиштирмелерни сакъла",
+       "publishpage": "Саифени ярат",
+       "publishchanges": "Денъиштиргенлеримни сакъла",
        "preview": "Бакъып чыкъув",
        "showpreview": "Бакъып чыкъ",
        "showdiff": "Денъиштирмелерни косьтер",
        "anonpreviewwarning": "Сайткъа кирмединъиз. Саифени сакъласанъыз, денъиштирмелер тарихына сизинъ IP адресинъиз язылыр.",
        "missingsummary": "'''Хатырлатма.''' Денъиштирмелеринъизни къыскъадан тариф этмединъиз. «Саифени сакъла» дёгмесине текрар басув иле денъиштирмелеринъиз тефсирсиз сакъланаджакълар.",
        "missingcommenttext": "Лютфен, ашагъыда тефсир язынъыз.",
-       "missingcommentheader": "'''Хатырлатма:''' Тефсир мевзусыны/серлевасыны язмадынъыз. «{{int:savearticle}}» дёгмесине текрар баскъан сонъ тефсиринъиз серлевасыз сакъланыр.",
+       "missingcommentheader": "'''Хатырлатма:''' Тефсир мевзусыны/серлевасыны язмадынъыз. «$1» дёгмесине текрар баскъан сонъ тефсиринъиз серлевасыз сакъланыр.",
        "summary-preview": "Бакъып чыкъув тасвири:",
        "subject-preview": "Бакъып чыкъув серлевасы:",
        "blockedtitle": "Къулланыджы блок этильди.",
        "editingsection": "«$1» саифесинде болюк денъиштиреятасыз",
        "editingcomment": "«$1» саифесини денъиштиреятасыз (янъы болюк)",
        "editconflict": "Денъиштирмелер чатышмасы: $1",
-       "explainconflict": "Сиз саифени денъиштиргенде башкъа бири де денъиштирме япты.\nЮкъарыдаки язы саифенинъ шимдики алыны косьтере.\nСизинъ денъиштирмелеринъиз астында косьтерильди.\nШимди япкъан денъиштирмелеринъизни ашагъы пенджереден юкъары пенджереге авуштырмакъ керексинъиз.\n\"{{int:savearticle}}\"гъа баскъанда '''тек''' юкъарыдаки язы сакъланаджакъ.",
+       "explainconflict": "Сиз саифени денъиштиргенде башкъа бири де денъиштирме япты.\nЮкъарыдаки язы саифенинъ шимдики алыны косьтере.\nСизинъ денъиштирмелеринъиз астында косьтерильди.\nШимди япкъан денъиштирмелеринъизни ашагъы пенджереден юкъары пенджереге авуштырмакъ керексинъиз.\n\"$1\"гъа баскъанда '''тек''' юкъарыдаки язы сакъланаджакъ.",
        "yourtext": "Сизинъ метнинъиз",
        "storedversion": "Сакълангъан метин",
        "nonunicodebrowser": "'''ТЕНБИ: Браузеринъизде Unicode кодламасы танылмаз. Саифелер денъиштиргенде бутюн ASCII олмагъан ишаретлернинъ ерине оларнынъ оналтылыкъ коду язылыр.'''",
        "rcshowhidemine": "меним япкъан денъиштирмелеримни $1",
        "rcshowhidemine-show": "косьтер",
        "rcshowhidemine-hide": "гизле",
-       "rclinks": "Сонъки $2 куньде япылгъан сонъки $1 денъиштирмени косьтер;<br /> $3",
+       "rclinks": "Сонъки $2 куньде япылгъан сонъки $1 денъиштирмени косьтер;",
        "diff": "фаркъ",
        "hist": "кечмиш",
        "hide": "гизле",
        "undeletebtn": "Кери кетир!",
        "undeletelink": "косьтер/кери кетир",
        "undeletecomment": "Себеп:",
-       "undeletedrevisions": "Топлам {{PLURAL:$1|1=1 къайд|$1 къайд}} кери кетирильди.",
        "undelete-header": "Кеченлерде ёкъ этильген саифелерни корьмек ичюн [[Special:Log/delete|ёкъ этюв журналына]] бакъынъыз.",
        "undelete-search-submit": "Къыдыр",
        "namespace": "Исим фезасы:",
index 3054c1b..74d3655 100644 (file)
@@ -5,7 +5,8 @@
                        "Don Alessandro",
                        "Urhixidur",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "Bağlantılarnıñ tübüni sızuv:",
        "externaldberror": "Saytqa kirgende bir hata oldı. Bu tış esabıñıznı deñiştirmek aqqıñız olmağanından sebep meydanğa kelip ola.",
        "login": "Kiriş",
        "nav-login-createaccount": "Kiriş / Qayd oluv",
-       "userlogin": "Kiriş / Qayd oluv",
-       "userloginnocreate": "Kiriş",
        "logout": "Çıqış",
        "userlogout": "Çıqış",
        "notloggedin": "Sistemağa kirmediñiz.",
        "userlogin-noaccount": "Akkauntıñız yoqmı?",
        "userlogin-joinproject": "{{SITENAME}} leyhasına qoşulıñız",
-       "nologin": "Daa esap açmadıñızmı? '''$1'''.",
-       "nologinlink": "Qayd ol",
        "createaccount": "Qayd oluv",
-       "gotaccount": "Daa evel saytta qayd olğan ediñizmi? '''$1'''.",
-       "gotaccountlink": "Sistemağa kiriñiz",
-       "userlogin-resetlink": "Kiriş malümatını unuttıñızmı?",
        "createacct-emailrequired": "E-mail adresi",
        "createacct-emailoptional": "E-mail adresi (mecburiy degil)",
        "createacct-email-ph": "E-mail adresiñizni yazıñız",
        "createacct-another-email-ph": "E-mail adresiñizni yazıñız",
        "createaccountmail": "Avtomatik olaraq meydanğa ketirilgen muvaqqat bir parol qullana bilir ve bu parolni bildirilgen e-mail adresine yollay bilirsiñiz",
        "createacct-realname": "Aqiqiy adıñız (mecburiy degil)",
-       "createaccountreason": "Sebep:",
        "createacct-reason": "Sebep",
        "createacct-reason-ph": "Başqa bir esap yazısı neden sebep yaratasıñız",
        "createacct-submit": "Esap yazıñıznı yaratıñız",
        "watchthis": "Saifeni közet",
        "savearticle": "Saifeni saqla",
        "savechanges": "Deñiştirmelerni saqla",
+       "publishpage": "Saifeni yarat",
+       "publishchanges": "Deñiştirgenlerimni saqla",
        "preview": "Baqıp çıquv",
        "showpreview": "Baqıp çıq",
        "showdiff": "Deñiştirmelerni köster",
        "anonpreviewwarning": "Saytqa kirmediñiz. Saifeni saqlasañız deñiştirmeler tarihına siziñ IP adresiñiz yazılır.",
        "missingsummary": "'''Hatırlatma.''' Deñiştirmeleriñizni qısqadan tarif etmediñiz. \"Saifeni saqla\" dögmesine tekrar basuv ile deñiştirmeleriñiz tefsirsiz saqlanacaqlar.",
        "missingcommenttext": "Lütfen, aşağıda tefsir yazıñız.",
-       "missingcommentheader": "'''Hatırlatma:''' Tefsir mevzusını/serlevasını yazmadıñız. \"{{int:savearticle}}\" dögmesine tekrar basqan soñ tefsiriñiz serlevasız saqlanır.",
+       "missingcommentheader": "'''Hatırlatma:''' Tefsir mevzusını/serlevasını yazmadıñız. \"$1\" dögmesine tekrar basqan soñ tefsiriñiz serlevasız saqlanır.",
        "summary-preview": "Baqıp çıquv tasviri:",
        "subject-preview": "Baqıp çıquv serlevası:",
        "blockedtitle": "Qullanıcı blok etildi.",
        "editingsection": "“$1” saifesinde bölük deñiştireyatasız",
        "editingcomment": "“$1” saifesini deñiştireyatasız (yañı bölük)",
        "editconflict": "Deñiştirmeler çatışması: $1",
-       "explainconflict": "Siz saifeni deñiştirgende başqa biri de deñiştirme yaptı.\nYuqarıdaki yazı saifeniñ şimdiki alını köstere.\nSiziñ deñiştirmeleriñiz astında kösterildi. Şimdi yapqan deñiştirmeleriñizni aşağı pencereden yuqarı pencerege avuştırmaq kereksiñiz.\n\"{{int:savearticle}}\"ğa basqanda '''tek''' yuqarıdaki yazı saqlanacaq.",
+       "explainconflict": "Siz saifeni deñiştirgende başqa biri de deñiştirme yaptı.\nYuqarıdaki yazı saifeniñ şimdiki alını köstere.\nSiziñ deñiştirmeleriñiz astında kösterildi. Şimdi yapqan deñiştirmeleriñizni aşağı pencereden yuqarı pencerege avuştırmaq kereksiñiz.\n\"$1\"ğa basqanda '''tek''' yuqarıdaki yazı saqlanacaq.",
        "yourtext": "Siziñ metniñiz",
        "storedversion": "Saqlanğan metin",
        "nonunicodebrowser": "'''TENBİ: Brauzeriñizde Unicode kodlaması tanılmaz. Saifeler deñiştirgende bütün ASCII olmağan işaretlerniñ yerine olarnıñ onaltılıq kodu yazılır.'''",
        "rcshowhidemine": "menim yapqan deñiştirmelerimni $1",
        "rcshowhidemine-show": "köster",
        "rcshowhidemine-hide": "gizle",
-       "rclinks": "Soñki $2 künde yapılğan soñki $1 deñiştirmeni köster;<br /> $3",
+       "rclinks": "Soñki $2 künde yapılğan soñki $1 deñiştirmeni köster;",
        "diff": "farq",
        "hist": "keçmiş",
        "hide": "gizle",
        "undeletebtn": "Keri ketir!",
        "undeletelink": "köster/keri ketir",
        "undeletecomment": "Sebep:",
-       "undeletedrevisions": "Toplam {{PLURAL:$1|1 qayd|$1 qayd}} keri ketirildi.",
        "undelete-header": "Keçenlerde yoq etilgen saifelerni körmek içün [[Special:Log/delete|yoq etüv jurnalına]] baqıñız.",
        "undelete-search-submit": "Qıdır",
        "namespace": "İsim fezası:",
index d8e1bb9..4c446f5 100644 (file)
@@ -34,7 +34,8 @@
                        "Dvorapa",
                        "Walter Klosse",
                        "Martin Urbanec",
-                       "Marek Pavlica"
+                       "Marek Pavlica",
+                       "Asmen"
                ]
        },
        "tog-underline": "Podtrhávat odkazy:",
        "login": "Přihlaste se",
        "login-security": "Ověřte svou identitu",
        "nav-login-createaccount": "Přihlášení / vytvoření účtu",
-       "userlogin": "Přihlášení / vytvoření účtu",
-       "userloginnocreate": "Přihlášení",
        "logout": "Odhlásit se",
        "userlogout": "Odhlášení",
        "notloggedin": "Nejste přihlášen(a)",
        "userlogin-noaccount": "Nemáte účet?",
        "userlogin-joinproject": "Přidejte se k {{grammar:3sg|{{SITENAME}}}}",
-       "nologin": "Dosud nemáte účet? $1.",
-       "nologinlink": "Zaregistrujte se",
        "createaccount": "Vytvořit účet",
-       "gotaccount": "Už jste registrováni? $1.",
-       "gotaccountlink": "Přihlaste se",
-       "userlogin-resetlink": "Zapomněli jste přihlašovací údaje?",
        "userlogin-resetpassword-link": "Zapomněli jste heslo?",
        "userlogin-helplink2": "Nápověda k přihlašování",
        "userlogin-loggedin": "Již jste {{GENDER:$1|přihlášen|přihlášena}} jako $1.\nPomocí formuláře níže se můžete přihlásit jako jiný uživatel.",
        "createaccountmail": "Použít dočasné náhodné heslo a odeslat ho na uvedenou e-mailovou adresu",
        "createaccountmail-help": "Lze využít k založení účtu pro jinou osobu bez prozrazení hesla.",
        "createacct-realname": "Skutečné jméno (nepovinné)",
-       "createaccountreason": "Důvod:",
        "createacct-reason": "Důvod",
        "createacct-reason-ph": "Proč si vytváříte další účet",
        "createacct-reason-help": "Zpráva zobrazená v knize nových uživatelů",
        "preview": "Náhled",
        "showpreview": "Ukázat náhled",
        "showdiff": "Ukázat změny",
-       "blankarticle": "<strong>Upozornění:</strong> Stránka, kterou se chystáte založit, je prázdná. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude založena zcela bez obsahu.",
+       "blankarticle": "<strong>Upozornění:</strong> Stránka, kterou se chystáte založit, je prázdná. Pokud ještě jednou kliknete na „$1“, bude založena zcela bez obsahu.",
        "anoneditwarning": "<strong>Varování:</strong> Nejste přihlášen(a). Pokud uložíte jakoukoli editaci, vaše IP adresa bude zveřejněna v historii této stránky. Pokud se <strong>[$1 přihlásíte]</strong> nebo si <strong>[$2 vytvoříte účet]</strong>, vaše editace budou připsány vašemu uživatelskému jménu a získáte i další výhody.",
        "anonpreviewwarning": "<em>Nejste přihlášen(a). Uložením zveřejníte svou IP adresu v historii této stránky.</em>",
-       "missingsummary": "<strong>Připomenutí:</strong> Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace zapsána bez shrnutí.",
-       "selfredirect": "<strong>Upozornění:</strong> Pokoušíte se tuto stránku přesměrovat na sebe samu.\nMožná jste zadali chybný cíl přesměrování, nebo editujete špatnou stránku.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude i přesto přesměrování vytvořeno.",
+       "missingsummary": "<strong>Připomenutí:</strong> Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na „$1“, bude vaše editace zapsána bez shrnutí.",
+       "selfredirect": "<strong>Upozornění:</strong> Pokoušíte se tuto stránku přesměrovat na sebe samu.\nMožná jste zadali chybný cíl přesměrování, nebo editujete špatnou stránku.\nPokud ještě jednou kliknete na „$1“, bude i přesto přesměrování vytvořeno.",
        "missingcommenttext": "Zadejte komentář",
-       "missingcommentheader": "<strong>Připomenutí:</strong> Nezadali jste předmět pro tento komentář.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace uložena bez něj.",
+       "missingcommentheader": "<strong>Připomenutí:</strong> Nezadali jste předmět pro tento komentář.\nPokud ještě jednou kliknete na „$1“, bude vaše editace uložena bez něj.",
        "summary-preview": "Náhled shrnutí:",
        "subject-preview": "Náhled předmětu:",
        "previewerrortext": "Při pokusu o zobrazení náhledu vašich změn došlo k chybě.",
        "editingsection": "Editace stránky $1 (část)",
        "editingcomment": "Editace stránky $1 (nová sekce)",
        "editconflict": "Editační konflikt: $1",
-       "explainconflict": "Někdo změnil stránku po započetí vaší editace.\nVýše vidíte aktuální text stránky.\nVaše změny jsou uvedeny dole.\nMusíte sloučit své změny se stávajícím textem.\n<strong>Pouze</strong> výše uvedený text zůstane uchován po kliknutí na „{{int:savearticle}}“.",
+       "explainconflict": "Někdo změnil stránku po započetí vaší editace.\nVýše vidíte aktuální text stránky.\nVaše změny jsou uvedeny dole.\nMusíte sloučit své změny se stávajícím textem.\n<strong>Pouze</strong> výše uvedený text zůstane uchován po kliknutí na „$1“.",
        "yourtext": "Váš text",
        "storedversion": "Uložená verze",
        "nonunicodebrowser": "<strong>UPOZORNĚNÍ: Váš prohlížeč není schopen pracovat se znaky Unicode.</strong>\nAbyste mohli tuto stránku bezpečně editovat, je použita pomůcka: všechny znaky mimo ASCII jsou v editačním poli zobrazeny v hexadecimálních kódech.",
        "readonlywarning": "<strong>Varování: Databáze byla uzamčena kvůli údržbě, takže momentálně nebudete moci uložit své změny.</strong>\nMůžete si okopírovat text do souboru a uložit si ho na později.\n\nSprávce serveru, který databázi zamkl, poskytl toto zdůvodnění: $1",
        "protectedpagewarning": "'''Varování: Tato stránka byla zamčena, takže ji mohou editovat pouze správci.'''\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
        "semiprotectedpagewarning": "'''Poznámka:''' Tato stránka byla zamčena, takže ji mohou editovat pouze registrovaní uživatelé.\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
-       "cascadeprotectedwarning": "<strong>Varování:</strong> Tato stránka byla zamčena, takže ji mohou editovat pouze správci, protože je vložena na následující, kaskádovým zámkem {{PLURAL:$1|zamčenou, stránku|zamčené, stránky}}:",
+       "cascadeprotectedwarning": "<strong>Varování:</strong> Tato stránka byla zamčena, takže ji mohou editovat pouze uživatelé s [[Special:ListGroupRights|určitými oprávněními]], protože je vložena na následující, kaskádovým zámkem {{PLURAL:$1|zamčenou, stránku|zamčené, stránky}}:",
        "titleprotectedwarning": "'''Varování: Tato stránka byla uzamčena, takže k jejímu založení jsou potřeba [[Special:ListGroupRights|zvláštní oprávnění]].'''\nNíže je pro přehled zobrazen nejnovější protokolovací záznam:",
        "templatesused": "{{PLURAL:$1|Šablona použitá|Šablony použité}} na této stránce:",
        "templatesusedpreview": "{{PLURAL:$1|Šablona použitá|Šablony použité}} v tomto náhledu:",
        "post-expand-template-argument-warning": "Varování: Tato stránka obsahuje alespoň jeden argument šablony, který je po rozbalení příliš velký.\nTyto argumenty byly vynechány.",
        "post-expand-template-argument-category": "Stránky obsahující vynechané argumenty šablon",
        "parser-template-loop-warning": "Nalezena smyčka šablon: [[$1]]",
+       "template-loop-category": "Stránky se smyčkami šablon",
+       "template-loop-category-desc": "Stránka obsahuje smyčku šablon, tj. šablonu, která je vložená sama do sebe.",
        "parser-template-recursion-depth-warning": "Překročen limit hloubky rekurzivního vkládání šablon ($1)",
        "language-converter-depth-warning": "Překročen limit vnoření u jazykové konverze ($1)",
        "node-count-exceeded-category": "Stránky překračující počet uzlů",
        "page_first": "první",
        "page_last": "poslední",
        "histlegend": "(teď) = rozdíly oproti nynější verzi, (předchozí) = rozdíly oproti předchozí verzi, <b>m</b> = malá editace",
-       "history-fieldset-title": "Procházení historie",
+       "history-fieldset-title": "Hledat revize",
        "history-show-deleted": "Pouze smazané",
        "histfirst": "nejstarší",
        "histlast": "nejnovější",
        "search-file-match": "(odpovídá obsahu souboru)",
        "search-suggest": "Mysleli jste: $1",
        "search-rewritten": "Zobrazeny výsledky pro $1. Místo toho hledat $2.",
-       "search-interwiki-caption": "Sesterské projekty",
+       "search-interwiki-caption": "Výsledky ze sesterských projektů",
        "search-interwiki-default": "Výsledky z $1:",
        "search-interwiki-more": "(více)",
        "search-interwiki-more-results": "další výsledky",
        "prefs-help-prefershttps": "Toto nastavení se projeví při příštím přihlášení.",
        "prefswarning-warning": "Provedli jste změny nastavení, které dosud nejsou uloženy. Pokud tuto stránku opustíte, aniž byste klikli na „$1“, vaše nastavení se nezmění.",
        "prefs-tabs-navigation-hint": "Tip: Pro přepínání mezi záložkami můžete používat šipky vlevo a vpravo.",
-       "userrights": "Správa uživatelských skupin",
+       "userrights": "Uživatelská práva",
        "userrights-lookup-user": "Vybrat uživatele",
        "userrights-user-editname": "Zadejte uživatelské jméno:",
        "editusergroup": "Načíst 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}}:",
-       "userrights-groups-help": "Můžete měnit skupiny, do nichž je {{GENDER:$1|uživatel zařazen|uživatelka zařazena}}.\n* Zaškrtnuté políčko znamená, že {{GENDER:$1|uživatel|uživatelka}} je v dané skupině.\n* Nezaškrtnuté políčko značí, že {{GENDER:$1|uživatel|uživatelka}} v dané skupině není.\n* Hvězdička (*) znamená, že nemůžete danou skupinu odstranit, jakmile ji přidáte, nebo naopak.\n* Křížek (#) znamená, že čas do vypršení dané skupiny můžete pouze prodloužit, ne zkrátit.",
+       "userrights-groups-help": "Můžete měnit skupiny, do nichž je {{GENDER:$1|uživatel zařazen|uživatelka zařazena}}.\n* Zaškrtnuté políčko znamená, že {{GENDER:$1|uživatel|uživatelka}} je v dané skupině.\n* Nezaškrtnuté políčko značí, že {{GENDER:$1|uživatel|uživatelka}} v dané skupině není.\n* Hvězdička (*) znamená, že nemůžete danou skupinu odstranit, jakmile ji přidáte, nebo naopak.\n* Křížek (#) znamená, že čas do vypršení členství v dané skupině můžete pouze prodloužit, ne zkrátit.",
        "userrights-reason": "Důvod:",
        "userrights-no-interwiki": "Nemáte povoleno měnit uživatelská práva na jiných wiki.",
        "userrights-nodatabase": "Databáze $1 neexistuje nebo není místní.",
        "userrights-expiry-options": "1 den:1 day,1 týden:1 week,1 měsíc:1 month,3 měsíce:3 months,6 měsíců:6 months,1 rok:1 rok",
        "userrights-invalid-expiry": "Čas vypršení pro skupinu „$1“ je neplatný.",
        "userrights-expiry-in-past": "Čas vypršení pro skupinu „$1“ je v minulosti.",
-       "userrights-cannot-shorten-expiry": "Čas do vypršení skupiny „$1“ nemůžete zkrátit. To mohou provést pouze uživatelé oprávnění k jejímu přiřazení nebo odstranění.",
+       "userrights-cannot-shorten-expiry": "Čas do vypršení členství ve skupině „$1“ nemůžete zkrátit. To mohou provést pouze uživatelé oprávnění k jejímu přiřazení nebo odstranění.",
        "userrights-conflict": "Konflikt změn uživatelských práv! Zkontrolujte a potvrďte požadované změny.",
        "group": "Skupina:",
        "group-user": "Uživatelé",
        "right-editsemiprotected": "Editace stránek zamčených na „{{int:protect-level-autoconfirmed}}“",
        "right-editcontentmodel": "Editace modelu obsahu stránky",
        "right-editinterface": "Editace zpráv uživatelského rozhraní",
-       "right-editusercssjs": "Editace CSS a JS souborů jiných uživatelů",
        "right-editusercss": "Editace CSS souborů jiných uživatelů",
        "right-edituserjs": "Editace JavaScriptových souborů jiných uživatelů",
        "right-editmyusercss": "Editace vlastních uživatelských CSS souborů",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Zobrazit",
        "rcfilters-activefilters": "Aktivní filtry",
-       "rcfilters-filtergroup-authorship": "Autorství editace",
+       "rcfilters-quickfilters": "Od data:",
+       "rcfilters-savedqueries-defaultlabel": "Uložené filtry",
+       "rcfilters-savedqueries-rename": "Přejmenovat",
+       "rcfilters-savedqueries-setdefault": "Nastavit jako výchozí",
+       "rcfilters-savedqueries-unsetdefault": "Nemít jako výchozí",
+       "rcfilters-savedqueries-remove": "Odstranit",
+       "rcfilters-savedqueries-new-name-label": "Název",
+       "rcfilters-savedqueries-apply-label": "Vytvořit rychlý odkaz",
+       "rcfilters-savedqueries-cancel-label": "Zrušit",
+       "rcfilters-savedqueries-add-new-title": "Uložit filtry jako rychlý odkaz",
+       "rcfilters-restore-default-filters": "Obnovit výchozí filtry",
+       "rcfilters-clear-all-filters": "Zrušit všechny filtry",
+       "rcfilters-search-placeholder": "Filtrovat nedávné změny (prohlížejte nebo začněte psát)",
+       "rcfilters-invalid-filter": "Neplatný filtr",
+       "rcfilters-empty-filter": "Žádné aktivní filtry. Zobrazeny jsou všechny příspěvky.",
+       "rcfilters-filterlist-title": "Filtry",
+       "rcfilters-filterlist-whatsthis": "Co to je?",
+       "rcfilters-filterlist-feedbacklink": "Poskytnout novým (beta) filtrům zpětnou vazbu",
+       "rcfilters-highlightbutton-title": "Zvýraznit výsledky",
+       "rcfilters-highlightmenu-title": "Vybrat barvu",
+       "rcfilters-highlightmenu-help": "Vyberte barvu pro zvýraznění této vlastnosti",
+       "rcfilters-filterlist-noresults": "Nenalezeny žádné filtry",
+       "rcfilters-noresults-conflict": "Nenalezeny žádné výsledky, protože vyhledávací kritéria jsou v konfliktu",
+       "rcfilters-state-message-subset": "Tento filtr nemá žádný vliv, protože jeho výsledky jsou již zahrnuty {{PLURAL:$2|následujícím, širším filtrem|následujícími, širšími filtry}} (pro odlišení zkuste zvýraznění): $1",
+       "rcfilters-state-message-fullcoverage": "Výběr všech filtrů ve skupině odpovídá výběru žádného, proto tento filtr nemá žádný vliv. Skupina zahrnuje: $1",
+       "rcfilters-filtergroup-registration": "Registrace uživatele",
+       "rcfilters-filter-registered-label": "Registrovaní",
+       "rcfilters-filter-registered-description": "Přihlášení editoři.",
+       "rcfilters-filter-unregistered-label": "Neregistrovaní",
+       "rcfilters-filter-unregistered-description": "Editoři, kteří nejsou přihlášení",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Tento filtr je v konfliktu s {{PLURAL:$2|následujícím filtrem|následujícími filtry}} podle zkušeností, {{PLURAL:$2|vyhledávajícím|vyhledávajícími}} pouze registrované uživatele: $1",
+       "rcfilters-filtergroup-authorship": "Autorství příspěvku",
+       "rcfilters-filter-editsbyself-label": "Vaše změny",
+       "rcfilters-filter-editsbyself-description": "Vaše vlastní příspěvky.",
+       "rcfilters-filter-editsbyother-label": "Změny ostatních",
+       "rcfilters-filter-editsbyother-description": "Všechny změny kromě vašich.",
+       "rcfilters-filtergroup-userExpLevel": "Úroveň zkušeností (pouze registrovaných uživatelů)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Filtr podle zkušeností vyhledává pouze registrované uživatele, tento filtr je tedy v konfliktu s filtrem „Neregistrovaní“.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filtr „Neregistrovaní“ je v konfliktu s jedním nebo více filtry podle zkušeností, vyhledávajícími pouze registrované uživatele. Dotyčné filtry jsou označeny nahoře, v prostoru „Aktivní filtry“.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nováčci",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Méně než 10 editací a 4 dny činnosti.",
+       "rcfilters-filter-user-experience-level-learner-label": "Začátečníci",
+       "rcfilters-filter-user-experience-level-learner-description": "Více zkušeností než „Nováčci“, ale méně než „Zkušení uživatelé“.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Zkušení uživatelé",
+       "rcfilters-filter-user-experience-level-experienced-description": "Více než 30 dní činnosti a 500 editací.",
+       "rcfilters-filtergroup-automated": "Automatizované příspěvky",
+       "rcfilters-filter-bots-label": "Robot",
+       "rcfilters-filter-bots-description": "Editace provedené pomocí automatizovaných nástrojů.",
+       "rcfilters-filter-humans-label": "Člověk (ne robot)",
+       "rcfilters-filter-humans-description": "Editace provedené lidmi.",
+       "rcfilters-filtergroup-reviewstatus": "Stav prověření",
+       "rcfilters-filter-patrolled-label": "Prověřené",
+       "rcfilters-filter-patrolled-description": "Editace označené jako prověřené.",
+       "rcfilters-filter-unpatrolled-label": "Neprověřené",
+       "rcfilters-filter-unpatrolled-description": "Editace označené jako neprověřené.",
+       "rcfilters-filtergroup-significance": "Důležitost",
+       "rcfilters-filter-minor-label": "Malé editace",
+       "rcfilters-filter-minor-description": "Editace, které autor označil jako malé.",
+       "rcfilters-filter-major-label": "Nemalé editace",
+       "rcfilters-filter-major-description": "Editace neoznačené jako malé.",
+       "rcfilters-filtergroup-watchlist": "Sledované stránky",
+       "rcfilters-filter-watchlist-watched-label": "Na seznamu sledovaných stránek",
+       "rcfilters-filter-watchlist-watched-description": "Změny stránek z vašeho seznamu sledovaných.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nové změny sledovaných stránek",
+       "rcfilters-filter-watchlist-watchednew-description": "Změny stránek z vašeho seznamu sledovaných, které jste od jejich změny nenavštívili.",
+       "rcfilters-filter-watchlist-notwatched-label": "Nesledované stránky",
+       "rcfilters-filter-watchlist-notwatched-description": "Vše kromě změn vašich sledovaných stránek.",
+       "rcfilters-filtergroup-changetype": "Typ změny",
+       "rcfilters-filter-pageedits-label": "Editace stránek",
+       "rcfilters-filter-pageedits-description": "Editace obsahu wiki, diskusí, popisů kategorií...",
+       "rcfilters-filter-newpages-label": "Založení stránek",
+       "rcfilters-filter-newpages-description": "Editace, které vytvářejí nové stránky.",
+       "rcfilters-filter-categorization-label": "Změny kategorií",
+       "rcfilters-filter-categorization-description": "Záznamy stránek zařazených do nebo vyřazených z kategorií.",
+       "rcfilters-filter-logactions-label": "Zaznamenané činnosti",
+       "rcfilters-filter-logactions-description": "Administrativní úkony, založení účtů, mazání stránek, načtení souborů...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filtr „Malé editace“ je v konfliktu s jedním nebo více filtry podle typu změny, protože určité typy změn nelze označit jako malé. Dotyčné filtry jsou označeny nahoře, v prostoru „Aktivní filtry“.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Určité typy změn nelze označit jako malé, tento filtr je proto v konfliktu s následujícími filtry podle typu změny: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Tento filtr podle typu změny je v konfliktu s filtrem „Malé editace“. Určité typy změn nelze označit jako malé.",
+       "rcfilters-filtergroup-lastRevision": "Aktuální verze",
+       "rcfilters-filter-lastrevision-label": "Aktuální verze",
+       "rcfilters-filter-lastrevision-description": "Poslední změna stránky.",
+       "rcfilters-filter-previousrevision-label": "Dřívější verze",
+       "rcfilters-filter-previousrevision-description": "Všechny změny, které nejsou nejnovější úpravou stránky.",
        "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>).",
+       "rclistfromreset": "Obnovit výběr data",
        "rclistfrom": "Ukázat nové změny, počínaje od $2, $3",
        "rcshowhideminor": "$1 malé editace",
        "rcshowhideminor-show": "Zobrazit",
        "rcshowhidecategorization": "$1 kategorizaci stránek",
        "rcshowhidecategorization-show": "Zobrazit",
        "rcshowhidecategorization-hide": "Skrýt",
-       "rclinks": "Ukázat $1 posledních změn během posledních $2 dnů<br />\n$3",
+       "rclinks": "Ukázat $1 posledních změn během posledních $2 dnů",
        "diff": "rozdíl",
        "hist": "historie",
        "hide": "skrýt",
        "php-uploaddisabledtext": "V PHP je vypnuto načítání souborů. Prosím, zkontrolujte nastavení file_uploads.",
        "uploadscripted": "Tento soubor obsahuje HTML nebo kód skriptu, který by mohl být prohlížečem chybně interpretován.",
        "upload-scripted-pi-callback": "Nelze načíst soubor, který obsahuje instrukci xml-stylesheet.",
+       "upload-scripted-dtd": "Nelze načíst SVG soubory, které obsahují nestandardní DTD deklaraci.",
        "uploaded-script-svg": "V načteném SVG souboru byl nalezen skriptovatelný element „$1“.",
        "uploaded-hostile-svg": "V načteném SVG souboru bylo v elementu se styly nalezeno nebezpečné CSS.",
        "uploaded-event-handler-on-svg": "Nastavování atributů pro obsluhu událostí <code>$1=\"$2\"</code> není v SVG souborech dovoleno.",
        "enotif_body_intro_moved": "V $PAGEEDITDATE {{gender:$2|přesunul|přesunula}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .",
        "enotif_body_intro_restored": "V $PAGEEDITDATE {{gender:$2|obnovil|obnovila}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .",
        "enotif_body_intro_changed": "V $PAGEEDITDATE {{gender:$2|změnil|změnila}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .",
-       "enotif_lastvisited": "Vizte $1 pro seznam všech změn od minulé návštěvy.",
-       "enotif_lastdiff": "Na $1 si tuto změnu můžete prohlédnout.",
+       "enotif_lastvisited": "Pro všechny změny od vaší minulé návštěvy vizte $1",
+       "enotif_lastdiff": "Tuto změnu si můžete prohlédnout na $1",
        "enotif_anon_editor": "anonymní uživatel $1",
        "enotif_body": "Vážený uživateli $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nShrnutí editace: $PAGESUMMARY $PAGEMINOREDIT\n\nUživatele, který změnu provedl, můžete kontaktovat:\ne-mailem: $PAGEEDITOR_EMAIL\nna wiki: $PAGEEDITOR_WIKI\n\nDo doby, než stránku navštívíte jako přihlášený uživatel, vám další oznámení k této stránce nebudou zasílána. Případně si můžete vynulovat příznaky ve svém seznamu sledovaných stránek.\n\nS pozdravem váš zasílač hlášení {{grammar:2sg|{{SITENAME}}}}\n\n--\nZměnit nastavení e-mailových oznámení můžete na\n{{canonicalurl:{{#special:Preferences}}}}\n\nNastavení sledovaných stránek může změnit na\n{{canonicalurl:Special:Watchlist/edit}}\n\nStránku můžete ze svých sledovaných vyřadit na\n$UNWATCHURL\n\nRady a kontakt:\n$HELPPAGE",
        "created": "vytvořil",
        "editcomment": "Shrnutí editace bylo: <em>$1</em>.",
        "revertpage": "Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“",
        "revertpage-nouser": "Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“",
-       "rollback-success": "Editace uživatele $1 byly vráceny na poslední verzi od uživatele $2.",
+       "rollback-success": "Editace {{GENDER:$3|uživatele|uživatelky}} $1 byly vráceny na poslední verzi od {{GENDER:$4|uživatele|uživatelky}} $2.",
        "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.",
        "undeleteviewlink": "prohlédnout",
        "undeleteinvert": "Invertovat výběr",
        "undeletecomment": "Důvod:",
-       "undeletedrevisions": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}} a {{PLURAL:$2|jeden soubor|$2 soubory|$2 souborů}}.",
-       "undeletedfiles": "{{PLURAL:$1|Obnoven jeden soubor|Obnoveny $1 soubory|Obnoveno $1 souborů}}",
        "cannotundelete": "Některá nebo všechna obnovení se nezdařila:\n$1",
        "undeletedpage": "<strong>Stránka „$1“ byla obnovena</strong>\n\nZáznam o posledních mazáních a obnoveních najdete v [[Special:Log/delete|knize smazaných stránek]].",
        "undelete-header": "Vizte nedávno smazané stránky v [[Special:Log/delete|knize smazaných stránek]].",
        "sp-contributions-uploads": "načtené soubory",
        "sp-contributions-logs": "protokolovací záznamy",
        "sp-contributions-talk": "diskuse",
-       "sp-contributions-userrights": "správa uživatelských práv",
+       "sp-contributions-userrights": "správa {{GENDER:$1|uživatelských}} práv",
        "sp-contributions-blocked-notice": "Tento uživatel je momentálně zablokován. Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:",
        "sp-contributions-blocked-notice-anon": "Tato IP adresa je momentálně zablokována.\nZde je pro přehled zobrazen nejnovější záznam z knihy zablokování:",
        "sp-contributions-search": "Zobrazení příspěvků",
        "unblocked-id": "Blok $1 byl zrušen.",
        "unblocked-ip": "Adresa [[Special:Contributions/$1|$1]] byla odblokována.",
        "blocklist": "Zablokovaní uživatelé",
+       "autoblocklist": "Automatická blokování",
+       "autoblocklist-submit": "Hledat",
+       "autoblocklist-legend": "Seznam automatických blokování",
+       "autoblocklist-localblocks": "Místní {{PLURAL:$1|automatické|automatická}} blokování",
+       "autoblocklist-empty": "Seznam automatických blokování je prázdný.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Jiné automatické|Jiná automatická}} blokování",
        "ipblocklist": "Zablokovaní uživatelé",
        "ipblocklist-legend": "Hledat zablokovaného uživatele",
        "blocklist-userblocks": "Skrýt zablokované účty",
        "tooltip-pt-mycontris": "Seznam {{GENDER:|vašich}} příspěvků",
        "tooltip-pt-anoncontribs": "Seznam editací provedených z této IP adresy",
        "tooltip-pt-login": "Doporučujeme vám přihlásit se, ovšem není to povinné.",
+       "tooltip-pt-login-private": "Pro používání této wiki se musíte přihlásit",
        "tooltip-pt-logout": "Odhlásit se",
        "tooltip-pt-createaccount": "Doporučujeme vytvořit si účet a přihlásit se, ovšem není to povinné",
        "tooltip-ca-talk": "Diskuse ke stránce",
        "anonymous": "{{PLURAL:$1|anonymního uživatele|anonymních uživatelů}} {{GRAMMAR:2sg|{{SITENAME}}}}",
        "siteuser": "{{GENDER:$2|uživatel|uživatelka}} {{GRAMMAR:2sg|{{SITENAME}}}} $1",
        "anonuser": "anonymní uživatel {{grammar:2sg|{{SITENAME}}}} $1",
-       "lastmodifiedatby": "Tuto stránku naposledy {{GENDER:$4|změnil|změnila|změnil}} $3 v $2, $1.",
+       "lastmodifiedatby": "Tuto stránku naposledy {{GENDER:$4|editoval|editoval(a)}} $3 v $2, $1.",
        "othercontribs": "Založeno na práci $1.",
        "others": "další",
        "siteusers": "{{PLURAL:$2|{{GENDER:$1|uživatele|uživatelky}}|uživatelů}} {{grammar:2sg|{{SITENAME}}}} $1",
        "newimages-summary": "Na této speciální stránce se zobrazují poslední načtené soubory.",
        "newimages-legend": "Filtr",
        "newimages-label": "Název souboru (nebo jeho část):",
+       "newimages-user": "IP adresa nebo uživatelské jméno",
        "newimages-showbots": "Zobrazit soubory načtené roboty",
        "newimages-hidepatrolled": "Skrýt prověřená načtení souborů",
        "noimages": "Není co zobrazit.",
        "confirmrecreate": "{{GENDER:$1|Uživatel|Uživatelka}} [[User:$1|$1]] ([[User talk:$1|diskuse]]) tuto stránku {{GENDER:$1|smazal|smazala}} poté, co jste {{GENDER:|začal|začala|začali}} editovat, s odůvodněním:\n: „$2“\nOpravdu si přejete znovu tuto stránku založit?",
        "confirmrecreate-noreason": "{{GENDER:$1|Uživatel|Uživatelka}} [[User:$1|$1]] ([[User talk:$1|diskuse]]) {{GENDER:$1|smazal|smazala}} tuto stránku poté, co jste {{GENDER:|začal|začala|začali}} s editací. Potvrďte, zda chcete stránku skutečně znovu založit.",
        "recreate": "Založit znovu",
+       "confirm-purge-title": "Vymazat cache této stránky",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Aktualizovat cachovanou verzi této stránky?",
        "confirm-purge-bottom": "Aktualizace stránky vymaže cache a vynutí zobrazení nejaktuálnější verze.",
        "hebrew-calendar-m6": "adar",
        "hebrew-calendar-m6a": "adar I",
        "hebrew-calendar-m6b": "adar II",
-       "hebrew-calendar-m7": "nisan",
+       "hebrew-calendar-m7": "Nisan",
        "hebrew-calendar-m8": "ijar",
        "hebrew-calendar-m9": "sivan",
        "hebrew-calendar-m10": "tamuz",
        "htmlform-user-not-valid": "<strong>$1</strong> není platné uživatelské jméno.",
        "logentry-delete-delete": "$1 {{GENDER:$2|smazal|smazala}} stránku $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|smazal|smazala}} přesunem přesměrování $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3",
+       "restore-count-revisions": "{{PLURAL:$1|jedna revize|$1 revize|$1 revizí}}",
+       "restore-count-files": "{{PLURAL:$1|jeden soubor|$1 soubory|$1 souborů}}",
        "logentry-delete-event": "$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} stránky $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|změnil|změnila}} značky na revizi $4 stránky $3 ({{PLURAL:$7|přidáno}} $6; {{PLURAL:$9|odebráno}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|změnil|změnila}} značky na protokolovacím záznamu $5 k stránce $3 ({{PLURAL:$7|přidáno}} $6; {{PLURAL:$9|odebráno}} $8)",
        "rightsnone": "(žádné)",
-       "revdelete-summary": "shrnutí editace",
        "rightslogentry-temporary-group": "$1 (dočasně, do $2)",
        "feedback-adding": "Komentář se přidává na stránku…",
        "feedback-back": "Zpět",
        "special-characters-group-thai": "Thajština",
        "special-characters-group-lao": "Laoština",
        "special-characters-group-khmer": "Khmerština",
+       "special-characters-group-canadianaboriginal": "Původní obyvatelé Kanady",
        "special-characters-title-endash": "krátká pomlčka",
        "special-characters-title-emdash": "dlouhá pomlčka",
        "special-characters-title-minus": "znaménko minus",
        "mw-widgets-titleinput-description-redirect": "přesměrování na $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Přidat kategorii…",
        "mw-widgets-usersmultiselect-placeholder": "Přidat další…",
+       "date-range-from": "Od data:",
+       "date-range-to": "Do data:",
        "sessionmanager-tie": "Nelze kombinovat několik typů autentizace požadavků: $1.",
        "sessionprovider-generic": "relace pomocí $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "relace pomocí cookies",
        "restrictionsfield-label": "Povolené rozsahy IP adres:",
        "restrictionsfield-help": "Jedna IP adresa nebo CIDR rozsah na řádek. Všechno povolíte pomocí:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revize $1",
-       "pageid": "Stránka s ID $1"
+       "pageid": "Stránka s ID $1",
+       "rawhtml-notallowed": "Značky &lt;html&gt; nelze používat mimo běžné stránky.",
+       "gotointerwiki": "Opustit {{GENDER:4sg|{{SITENAME}}}}",
+       "gotointerwiki-invalid": "Zadaný název je neplatný.",
+       "gotointerwiki-external": "Chystáte se opustit {{GRAMMAR:4sg|{{SITENAME}}}} a navštívit [[$2]], což je jiná webová stránka.\n\n'''[$1 Pokračovat na $1].'''",
+       "undelete-cantedit": "Tuto stránku nemůžete obnovit, protože ji nejste oprávněni editovat.",
+       "undelete-cantcreate": "Tuto stránku nemůžete obnovit, protože stránka s tímto názvem neexistuje a vy ji nejste oprávněni vytvořit."
 }
index daebbc1..a4f1d8f 100644 (file)
@@ -10,7 +10,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Kirsan",
-                       "Ankry"
+                       "Ankry",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Pòdsztrëchiwùjë lënczi:",
        "aboutsite": "Ò {{SITENAME}}",
        "aboutpage": "Project:Ò_{{SITENAME}}",
        "copyright": "Zamkłosc hewòtny starnë je ùprzëstãpnianô wedle reglów $1, jeżlë nie pòdóno jinaczi.",
-       "copyrightpage": "{{ns:project}}:Ùsôdzkòwé_prawa",
+       "copyrightpage": "{{ns:project}}:Ùsôdzkòwé prawa",
        "currentevents": "Aktualné wëdarzenia",
        "currentevents-url": "Project:Aktualné wëdarzenia",
        "disclaimers": "Prawné zastrzedżi",
        "yourdomainname": "Twòjô domena",
        "login": "Wlogùjë mie",
        "nav-login-createaccount": "Logòwanié",
-       "userlogin": "Logòwanié",
-       "userloginnocreate": "Wlogùjë mie",
        "logout": "Wëlogùj mie",
        "userlogout": "Wëlogòwanié",
        "notloggedin": "Felëje logòwóniô",
        "userlogin-noaccount": "Ni môsz kònta?",
-       "nologin": "Ni môsz kònta? '''$1'''.",
-       "nologinlink": "Ùsadzë kònto",
        "createaccount": "Założë nowé kònto",
-       "gotaccount": "Masz ju kònto? '''$1'''.",
-       "gotaccountlink": "Wlogùjë",
        "userlogin-resetpassword-link": "Zabôcził jes hasło?",
        "userlogin-helplink2": "Pòmòc przë logòwaniu",
        "createacct-emailoptional": "Adres e-mail (òptacëjno)",
        "createacct-email-ph": "Pòdôj swój adres e-mail.",
        "createaccountmail": "Ùżij timczasowégò hasła i wësli je na pòdóny adres e-mail.",
-       "createaccountreason": "Przëczëna:",
        "createacct-reason": "Przëczëna",
        "createacct-submit": "Ùsadzë kònto",
        "badretype": "Wprowadzone parole jinaczą sã midze sobą.",
        "continue-editing": "Przeńdzë do pòla edicje.",
        "editing": "Edicëjô $1",
        "editingsection": "Edicëjô $1 (dzél)",
-       "explainconflict": "Chtos sfórtowôł wprowadzëc swòją wersëjã artikla òbczôs Twòji edicëji.\nGórné pòle edicëji zamëkô w se tekst starnë aktualno zapisóny w pòdôwkòwi baze.\nTwòje zmianë są w dólnym pòlu edicëji.\nBë wprowadzëc swòje zmianë mùszisz zmòdifikòwac tekst z górnégò pòla.\n'''Blós''' tekst z górnégò pòla mdze zapisóny w baze czej wcësniesz \"{{int:savearticle}}\".",
+       "explainconflict": "Chtos sfórtowôł wprowadzëc swòją wersëjã artikla òbczôs Twòji edicëji.\nGórné pòle edicëji zamëkô w se tekst starnë aktualno zapisóny w pòdôwkòwi baze.\nTwòje zmianë są w dólnym pòlu edicëji.\nBë wprowadzëc swòje zmianë mùszisz zmòdifikòwac tekst z górnégò pòla.\n'''Blós''' tekst z górnégò pòla mdze zapisóny w baze czej wcësniesz \"$1\".",
        "yourtext": "Twój tekst",
        "yourdiff": "Zjinaczi",
        "copyrightwarning": "Bôczë, że wszëtczé edicëje w {{SITENAME}} są wprowadzané pòd zastrzégą $2 (òb. $1 dlô detalów). Jeżlë nie chcesz bë to co napiszesz bëło editowóné czë kòpijowóné, tedë nie zacwierdzôj nëch edicëjów.<br />Zacwierdzając zmianë dôwôsz parolã, że to co môsz napisóné je Twòjégò aùtorstwa, abò skòpijowóné z dostónków public domain abò jinëch wòlnëch licencëjów. '''NIE DODÔWÔJ CËZËCH TEKSTÓW BEZ ZEZWÒLENIÔ!'''",
        "rcshowhidemine": "$1 mòje edicje",
        "rcshowhidemine-hide": "Zatacë",
        "rcshowhidecategorization": "$1 kategòrizacjã strón",
-       "rclinks": "Pòkażë slédnëch $1 zmianów zrobionëch òb slédné $2 dniów<br />$3",
+       "rclinks": "Pòkażë slédnëch $1 zmianów zrobionëch òb slédné $2 dniów",
        "diff": "jinosc",
        "hist": "hist.",
        "hide": "zatacë",
        "confirm_purge_button": "Jo!",
        "imgmultigo": "Biéj!",
        "autoredircomment": "Przeczérowanié do [[$1]]",
+       "autosumm-new": "Pòwsta nowô starna:",
        "watchlisttools-view": "Òbaczë wôżnészé zmianë",
        "watchlisttools-edit": "Òbaczë a editëjë lëstã ùzérónëch artiklów",
        "watchlisttools-raw": "Editëjë sërą lëstã",
        "revdelete-restricted": "nastôwi ògrańczenia dlô sprôwników",
        "revdelete-unrestricted": "rëmôj ògrańczenia dlô sprôwników",
        "logentry-protect-protect": "$1 {{GENDER:$2|zazychrowôł|zazychrowała}} $3 $4",
-       "revdelete-summary": "òpisënk zjinaczi",
        "pagelang-reason": "Przëczëna",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Céchë",
index 70fbb4b..5cad6ca 100644 (file)
@@ -7,7 +7,8 @@
                        "Wolliger Mensch",
                        "ОйЛ",
                        "아라",
-                       "Илья Драконов"
+                       "Илья Драконов",
+                       "Vvs-dm"
                ]
        },
        "tog-oldsig": "нꙑнѣшьн҄ь аѵтографъ :",
        "createacct-yourpasswordagain-ph": "опакꙑ жє таино слово напьши",
        "login": "въниди",
        "nav-login-createaccount": "въниди / съꙁижди си мѣсто",
-       "userlogin": "въниди / съꙁижди си мѣсто",
-       "userloginnocreate": "въниди",
        "logout": "ис̾ходъ",
        "userlogout": "ис̾ходъ",
        "notloggedin": "тꙑ нє въшьлъ ѥси",
        "userlogin-noaccount": "мѣсто ти нѣстъ ли ?",
        "userlogin-joinproject": "въ {{grammar:locative|{{SITENAME}}}} чѧсть прими",
-       "nologin": "мѣсто ти нѣстъ ли ? $1",
-       "nologinlink": "съꙁижди си мѣсто",
        "createaccount": "съꙁижди си мѣсто",
-       "gotaccount": "мѣсто ти ѥстъ ли? $1",
-       "gotaccountlink": "въниди",
        "userlogin-resetpassword-link": "таино слово ꙁабꙑлъ ли ;",
        "userlogin-helplink2": "помощь въниждєниꙗ дѣлꙗ",
-       "createaccountreason": "какъ съмꙑслъ :",
        "createacct-reason": "какъ съмꙑслъ",
        "createacct-reason-ph": "чєсо дѣлꙗ ино польꙃєватєльско мѣсто сътворити хощєши ;",
        "createacct-submit": "съꙁижди си мѣсто",
        "creating": "сътворѥниѥ ⁖ $1 ⁖",
        "editingsection": "исправлѥниѥ ⁖ $1 ⁖ (чѧсть)",
        "editingcomment": "исправлѥниѥ ⁖ $1 ⁖ (нова чѧсть)",
-       "explainconflict": "нѣкъто сѭ страницѫ иꙁмѣнилъ въ врѣмѧ ѥгда тꙑ ѥѩжє исправлꙗти почѧашє ⁙\nврьхоу нꙑнѣщьн҄ь страницѧ обраꙁъ авлѥнъ ѥстъ ⁙\nниꙁоу жє твоꙗ мѣна авлѥна ѥстъ ⁙\nсъѥдинити твоѭ мѣноу съ новомь обраꙁомь страницѧ длъжєнъ ѥси ⁙\nащє жє ⁖ {{int:savearticle}} ⁖ жьмєши · <strong>тъкъмо</strong> напьсаниѥ ижє врьхоу ѥстъ съхранѥно бѫдєтъ",
+       "explainconflict": "нѣкъто сѭ страницѫ иꙁмѣнилъ въ врѣмѧ ѥгда тꙑ ѥѩжє исправлꙗти почѧашє ⁙\nврьхоу нꙑнѣщьн҄ь страницѧ обраꙁъ авлѥнъ ѥстъ ⁙\nниꙁоу жє твоꙗ мѣна авлѥна ѥстъ ⁙\nсъѥдинити твоѭ мѣноу съ новомь обраꙁомь страницѧ длъжєнъ ѥси ⁙\nащє жє ⁖ $1 ⁖ жьмєши · <strong>тъкъмо</strong> напьсаниѥ ижє врьхоу ѥстъ съхранѥно бѫдєтъ",
        "yourtext": "твоѥ напьсаниѥ",
        "templatesused": "сѥѩ страницѧ {{PLURAL:$1|сь обраꙁьць польꙃоуѥтъ сѧ ѥстъ|с҄и обраꙁьца польꙃоуѭтъ сѧ ѥстє|с҄и обраꙁьци польꙃоуѭтъ сѧ сѫтъ}} :",
        "template-protected": "(ꙁабранєно ѥстъ)",
        "prefs-resetpass": "таина словєсє иꙁмѣнѥниѥ",
        "saveprefs": "съхранѥниѥ",
        "prefs-editing": "исправлѥниѥ",
-       "rows": "рѧдꙑ :",
        "searchresultshead": "исканиѥ",
        "savedprefs": "твои строи иꙁмѣнєнъ ѥстъ",
        "localtime": "мѣстьно врѣмѧ :",
        "rcshowhidemine": "$1 моѩ мѣнъ",
        "rcshowhidemine-show": "каꙁаниѥ",
        "rcshowhidemine-hide": "съкрꙑтиѥ",
-       "rclinks": "$1 послѣдьн҄ь  мѣнъ · ѩжє $2 послѣдьни дьни створѥнꙑ сѫтъ · каꙁаниѥ<br />$3",
+       "rclinks": "$1 послѣдьн҄ь  мѣнъ · ѩжє $2 послѣдьни дьни створѥнꙑ сѫтъ · каꙁаниѥ",
        "diff": "ра҃ꙁн",
        "hist": "їс҃т",
        "hide": "съкрꙑи",
        "sourcefilename": "источьна дѣла имꙗ :",
        "watchthisupload": "си дѣла блюдєниѥ",
        "upload-dialog-button-cancel": "отъмѣтаниѥ",
+       "upload-form-label-infoform-categories": "Катигории",
        "license": "прощєниѥ :",
        "license-header": "прощєниѥ",
        "imgfile": "дѣло",
        "logentry-move-move_redir": "$1 {{GENDER:$2|нарєчє}} страницѧ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖ врьхоу прѣнаправлѥниꙗ",
        "logentry-newusers-create": "польꙃєватєльско мѣсто ⁖ $1 ⁖ {{GENDER:$2|сътворѥно}} ѥстъ",
        "logentry-upload-upload": "$1 {{GENDER:$2|положишє}} $3",
-       "revdelete-summary": "мѣнꙑ опьсаниѥ",
        "feedback-cancel": "отъмѣтаниѥ",
-       "searchsuggest-search": "исканиѥ",
+       "searchsuggest-search": "{{SITENAME}} : исканиѥ",
        "searchsuggest-containing": "сѥ дрьжащи···",
        "api-error-unknownerror": "нєвѣдома блаꙁна : ⁖ $1 ⁖",
        "duration-seconds": "$1 {{PLURAL:$1|дєѵтєролєпто|дєѵтєролєпта|дєѵтєролєптъ}}",
index 7b44e84..5cbc556 100644 (file)
        "yourdomainname": "Сирĕн доменă:",
        "login": "Кĕрĕр",
        "nav-login-createaccount": "Сайта кĕр / регистрацилен",
-       "userlogin": "Кĕр / аккаунт ту",
-       "userloginnocreate": "Кĕмелли",
        "logout": "Сеансне пĕтерни",
        "userlogout": "Тухрăр",
        "notloggedin": "Кĕмен",
-       "nologin": "Аккаунт çук-и? $1.",
-       "nologinlink": "Çĕнĕ хутшăнакана регистрацилесси",
        "createaccount": "Аккаунт ту",
-       "gotaccount": "Аккаунт пур-и? $1.",
-       "gotaccountlink": "Кĕрĕр",
        "createaccountmail": "эл. почта тăрăх",
        "createacct-realname": "Чăн-чăн ят (пулсан)",
        "createacct-submit": "Аккаунт ту",
        "prefs-misc": "Ытти ĕнерлевсем",
        "saveprefs": "Çырса хур",
        "prefs-editing": "Тӳрлетни",
-       "rows": "Йĕркесем:",
-       "columns": "Юпасем:",
        "searchresultshead": "Шырамалли",
        "recentchangesdays": "Çак кунсен хушшинчи юлашки улшăнусене кăтартмалла:",
        "recentchangescount": "Списокра çакăн чухлĕ тӳрлетӳ кăтартмалла:",
        "rcshowhidemine-show": "кăтартмалла",
        "rcshowhidemine-hide": "кăтартмалла мар",
        "rcshowhidecategorization-show": "Кăтарт",
-       "rclinks": "Юлашки $2 кун хушшинче тунă $1 улшăнусене кăтартмалла<br />$3",
+       "rclinks": "Юлашки $2 кун хушшинче тунă $1 улшăнусене кăтартмалла",
        "diff": "танл.",
        "hist": "ист",
        "hide": "кăтартмалла мар",
        "undeleterevisions": "$1 {{PLURAL:$1|верси|версисене}} пăса утнă",
        "undeletebtn": "Каялла тавăр!",
        "undeleteviewlink": "пăх",
-       "undeletedrevisions": "{{PLURAL:$1|1 улăштарни|$1 улăштарнисене}} тавăрнă.",
-       "undeletedfiles": "{{PLURAL:$1|1 файл|$1 файлсене}} тавăрнă",
        "undelete-search-box": "Кăларса пăрахнă страницăсен хушшинчи шырав",
        "undelete-search-submit": "Шыра",
        "namespace": "Ят хушши:",
index 455195f..936e38c 100644 (file)
@@ -47,7 +47,7 @@
        "tog-enotifminoredits": "Gyrru e-bost ataf hefyd ar gyfer golygiadau bychain i dudalennau a ffeiliau",
        "tog-enotifrevealaddr": "Datguddio fy nghyfeiriad e-bost mewn e-byst hysbysu",
        "tog-shownumberswatching": "Dangos y nifer o ddefnyddwyr sy'n gwylio",
-       "tog-oldsig": "Y llofnod cyfredol:",
+       "tog-oldsig": "Eich llofnod cyfredol:",
        "tog-fancysig": "Trin y llofnod fel testun wici (heb gyswllt wici awtomatig)",
        "tog-uselivepreview": "Defnyddio rhagolwg byw",
        "tog-forceeditsummary": "Tynnu fy sylw pan adawaf flwch crynodeb golygu yn wag",
@@ -64,7 +64,7 @@
        "tog-showhiddencats": "Dangos categorïau cuddiedig",
        "tog-norollbackdiff": "Hepgor dangos cymhariaeth ar ôl gwrthdroi golygiad",
        "tog-useeditwarning": "Tynnu fy sylw pan wyf ar fin gadael tudalen olygu heb roi'r newidiadau ar gadw",
-       "tog-prefershttps": "Defnyddio cysylltiad diogel bob amser tra fy mod wedi mewngofnodi",
+       "tog-prefershttps": "Defnyddio cysylltiad diogel bob amser tra'ch bod wedi mewngofnodi",
        "underline-always": "Bob amser",
        "underline-never": "Byth",
        "underline-default": "Rhagosodyn y porwr neu'r wedd",
        "newwindow": "(yn agor mewn ffenest newydd)",
        "cancel": "Diddymu",
        "moredotdotdot": "Rhagor...",
-       "morenotlisted": "Nid yw'r rhestr hon yn llawn.",
+       "morenotlisted": "Efallai nad yw'r rhestr hon yn gyflawn.",
        "mypage": "Tudalen defnyddiwr",
        "mytalk": "Sgwrs",
        "anontalk": "Sgwrs",
        "searcharticle": "Mynd",
        "history": "Hanes y dudalen",
        "history_short": "Hanes",
+       "history_small": "hanes",
        "updatedmarker": "diwygiwyd ers i mi ymweld ddiwethaf",
        "printableversion": "Fersiwn argraffu",
        "permalink": "Dolen barhaol",
        "talk": "Sgwrs",
        "views": "Golygon",
        "toolbox": "Offer",
+       "tool-link-userrights": "Newid {{GENDER:$1|grwpiau defnyddwyr}}",
+       "tool-link-userrights-readonly": "Cip ar {{GENDER:$1|grwpiau defnyddwyr}}",
+       "tool-link-emailuser": "Ebostiwch y {{GENDER:$1|defnyddiwr}}",
        "userpage": "Gweld tudalen y defnyddiwr",
        "projectpage": "Gweld tudalen y wici",
        "imagepage": "Gweld tudalen y ffeil",
        "redirectedfrom": "(Ailgyfeiriad oddi wrth $1)",
        "redirectpagesub": "Tudalen ailgyfeirio",
        "redirectto": "Ailgyfeirio i:",
-       "lastmodifiedat": "Newidiwyd y dudalen hon ddiwethaf $2, $1.",
+       "lastmodifiedat": "Newidiwyd y dudalen hon ddiwethaf ar $1, am $2.",
        "viewcount": "{{PLURAL:$1|Ni chafwyd dim|Cafwyd $1|Cafwyd $1|Cafwyd $1|Cafwyd $1|Cafwyd $1}} ymweliad â'r dudalen hon.",
        "protectedpage": "Tudalen a ddiogelwyd",
        "jumpto": "Neidio i:",
        "pool-timeout": "Cafwyd goroedi wrth aros am y clo",
        "pool-queuefull": "Mae cwt y gronfa brosesu yn llawn",
        "pool-errorunknown": "Gwall anhysbys",
+       "pool-servererror": "Nid yw'r gwasanaeth ''pool counter'' ar gael ($1).",
        "poolcounter-usage-error": "Gwall defnydd: $1",
        "aboutsite": "Ynglŷn â {{SITENAME}}",
        "aboutpage": "Project:Amdanom",
        "databaseerror-query": "Ymholiad: $1",
        "databaseerror-function": "Ffwythiant: $1",
        "databaseerror-error": "Gwall: $1",
+       "transaction-duration-limit-exceeded": "Oherwydd y 'lag' hirach nag arfer, daethpwyd a'r cais hwn i ben, gan fod yr amser sgwennu ($1) yn hirach na $2 - yr ail gyfnod hiraf a ganiateir.\n\nOs ydych yn newid llawer o bethau ar yr un pryd yna, beth am geisio newid llai o bethau?",
        "laggedslavemode": "Rhybudd: hwyrach nad yw'r dudalen yn cynnwys diwygiadau diweddar.",
        "readonly": "Databas ar glo",
        "enterlockreason": "Rhowch eglurhad dros gloi'r databas, ac amcangyfrif hyd at pa bryd y bydd y databas dan glo",
        "missingarticle-rev": "(#golygiad: $1)",
        "missingarticle-diff": "(Gwahaniaeth: $1, $2)",
        "readonly_lag": "Mae'r databas wedi'i gloi'n awtomatig tra bod y gwas-weinyddion yn asio gyda'r prif weinydd",
+       "nonwrite-api-promise-error": "Mae'r pennawd  'Promise-Non-Write-API-Action' HTTP wedi'i ddanfon ond roedd y cais i fodiwl-sgwennu API (''API write module'').",
        "internalerror": "Gwall mewnol",
        "internalerror_info": "Gwall mewnol: $1",
        "internalerror-fatal-exception": "Cafwyd nam difrifol o fath \"$1\"",
        "filerenameerror": "Wedi methu ail-enwi'r ffeil '$1' yn '$2'.",
        "filedeleteerror": "Wedi methu dileu'r ffeil \"$1\".",
        "directorycreateerror": "Wedi methu creu'r cyfeiriadur \"$1\".",
+       "directoryreadonlyerror": "Mae cyfeirlyfr \"$1\" yn ddarllen-yn-unig.",
+       "directorynotreadableerror": "Ni ellir darllen cyfeirlyfr \"$1\".",
        "filenotfound": "Heb gael hyd i'r ffeil '$1'.",
        "unexpected": "Gwerth annisgwyl: \"$1\"=\"$2\".",
        "formerror": "Gwall: Wedi methu danfon y ffurflen",
        "no-null-revision": "Ni lwyddwyd i wneud diwygiad newydd heb unrhyw newid ynddo, i'r dudalen \"$1\"",
        "badtitle": "Teitl gwael",
        "badtitletext": "Mae'r teitl a ofynnwyd amdano yn annilys, yn wag, neu cysylltu'n anghywir rhwng ieithoedd neu wicïau. Gall fod ynddo un nod neu ragor na ellir eu defnyddio mewn teitlau.",
+       "title-invalid-empty": "Mae'r ddalen a geisiwch yn wag, neu'n cynnwys enw defnyddenw (''namespace'') yn unig.",
+       "title-invalid-utf8": "Mae'r ddalen a geisiwch yn cynnwys dilyniant UTF-8 annilys.",
+       "title-invalid-interwiki": "Mae'r cais yn cynnwys dolen rhyngwici na ellir ei defnyddio mewn teitlau.",
+       "title-invalid-talk-namespace": "Mae teitl ddalen a gesiwch yn cyfeirio at ddalen Sgwrs na all fodoli.",
+       "title-invalid-characters": "Mae'r ddalen a geisiwch yn cynnwys symbloau na ellir eu derbyn: \"$1\".",
+       "title-invalid-relative": "Mae gan y teitl lwybr perthnasol. Mae cynnwys (./, ../) yn annilys, gan eu bod yn bygro'r porwr.",
+       "title-invalid-magic-tilde": "Mae'r ddalen a geisiwch yn cynnwys symbolau annilys: (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Mae teitl y ddalen a geisiwch yn rhy hir o lawer. Rhaid iddi fod yn llai na $1 {{PLURAL:$1|beit|beit}} mewn cod UTF-8.",
+       "title-invalid-leading-colon": "Mae teitl y ddalen a geisiwch yn cynnwys colon annilys, ar y dechrau.",
        "perfcached": "Mae'r wybodaeth ganlynol yn gopi cadw; mae'n bosib nad y fersiwn diweddaraf ydyw. Cedwir hyd at {{PLURAL:$1||un canlyniad yn unig|ddau ganlyniad|dri canlyniad|$1 chanlyniad|$1 canlyniad}} yn y copi cadw.",
        "perfcachedts": "Rhoddwyd y data canlynol ar gadw mewn celc a ddiweddarwyd ddiwethaf am $1. Cedwir hyd at {{PLURAL:$4||un canlyniad yn unig|ddau ganlyniad|dri canlyniad|$4 chanlyniad|$4 canlyniad}} yn y celc.",
        "querypage-no-updates": "Ar hyn o bryd, nid yw'r meddalwedd wedi ei osod i ddiweddaru data'r dudalen hon.",
        "viewsource": "Dangos côd y dudalen",
        "viewsource-title": "Gweld cod y dudalen $1",
        "actionthrottled": "Tagwyd y weithred",
-       "actionthrottledtext": "Mae camau gwrth-sbam y wici yn cyfyngu ar ba mor aml y gall defnyddwyr ailwneud y weithred hon mewn byr amser, ac rydych chi wedi croesi'r terfyn.\nCeisiwch eto ymhen rhai munudau.",
+       "actionthrottledtext": "Mae camau gwrth-sbam y wici yn cyfyngu ar ba mor aml y gall defnyddwyr ail-wneud y weithred hon mewn byr amser, ac rydych chi wedi croesi'r terfyn hwn.\nCeisiwch eto ymhen rhai munudau.",
        "protectedpagetext": "Mae'r dudalen hon wedi'i diogelu rhag cael ei thrin a'i thrafod.",
        "viewsourcetext": "Cewch weld a chopïo côd y ddalen:",
-       "viewyourtext": "Cewch weld a copïo ffynhonnell ''eich golygiadau'' i'r dudalen hon:",
+       "viewyourtext": "Cewch weld a chopïo ffynhonnell <strong>your edits</strong> i'r ddalen hon.",
        "protectedinterface": "Testun ar gyfer rhyngwyneb y wici yw cynnwys y dudalen hon. Clowyd y dudalen er mwyn ei diogeli. Os am gyfieithu'r neges neu ei newid ym mhob wici yn hytrach nag yn hwn yn unig, defnyddiwch [https://translatewiki.net/ translatewiki.net], y prosiect MediaWiki sy'n hyrwyddo'r gwaith cyfieithu.",
        "editinginterface": "<strong>Dalier sylw:</strong> Rydych yn golygu tudalen sy'n rhan o destun rhyngwyneb y meddalwedd. Bydd newidiadau i'r dudalen hon yn effeithio ar y rhyngwyneb a ddefnyddir ar y wici hwn yn unig.",
        "translateinterface": "I ychwanegu neu newid y cyfieithiad ar gyfer pob wici, defnyddiwch [https://translatewiki.net/ translatewiki.net], sef prosiect lleol MediaWiki.",
-       "cascadeprotected": "Diogelwyd y dudalen hon rhag ei newid, oherwydd ei bod wedi ei chynnwys yn y {{PLURAL:$1|dudalen ganlynol|dudalen ganlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol}}, a {{PLURAL:$1|honno yn ei thro wedi ei|honno yn ei thro wedi ei|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu}} diogelu, a'r dewisiad 'sgydol' ynghynn:\n$2",
+       "cascadeprotected": "Diogelwyd y ddalen hon rhag ei newid, oherwydd ei bod wedi ei chynnwys yn y {{PLURAL:$1|ddalen ganlynol|ddalen ganlynol|dalennau canlynol|dalennau canlynol|dalennau canlynol|dalennau canlynol}}, a ddiogelwyd, a'r dewisiad hwn yn weithredol: $2",
        "namespaceprotected": "Nid oes caniatâd gennych i olygu tudalennau yn y parth '''$1'''.",
        "customcssprotected": "Nid oes caniatâd ganddoch i olygu'r dudalen CSS hon oherwydd bod gosodiadau personol defnyddiwr arall arno.",
        "customjsprotected": "Nid oes caniatâd ganddoch i olygu'r dudalen JavaScript hon oherwydd bod gosodiadau personol defnyddiwr arall arno.",
        "virus-scanfailed": "methodd y sgan (côd $1)",
        "virus-unknownscanner": "gwrthfirysydd anhysbys:",
        "logouttext": "'''Rydych wedi allgofnodi.'''\n\nSylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddech wedi mewngofnodi hyd nes i chi glirio celc eich porwr.",
+       "cannotlogoutnow-title": "Ni ellir allgofnodi ar hyn o bryd",
+       "cannotlogoutnow-text": "Ni ellir allgofnodi tra'n defnyddio $1.",
        "welcomeuser": "Croeso, $1!",
        "welcomecreation-msg": "Peidiwch ag anghofio newid eich [[Special:Preferences|{{SITENAME}} preferences]].",
        "yourname": "Eich enw defnyddiwr:",
        "createacct-yourpasswordagain-ph": "Rhowch eich cyfrinair eto",
        "userlogin-remembermypassword": "Cadw'r sesiwn yn fyw tan i mi allgofnodi",
        "userlogin-signwithsecure": "Defnyddio cysylltiad diogel",
+       "cannotlogin-title": "Methwyd mewngofnodi",
+       "cannotlogin-text": "Mae mewngofnodi'n amhosibl.",
+       "cannotloginnow-title": "Ni ellir mewngofnodi ar hyn o bryd.",
+       "cannotloginnow-text": "Ni ellir mewngofnodi tra defnyddir $1.",
        "cannotcreateaccount-title": "Yn methu creu cyfrif",
+       "cannotcreateaccount-text": "Ni ellir creu cyfrif ar y wici hon.",
        "yourdomainname": "Eich parth:",
        "password-change-forbidden": "Ni allwch newid cyfrineiriau ar y wici hwn.",
        "externaldberror": "Naill ai: cafwyd gwall dilysu allanol ar databas neu: ar y llaw arall efallai nad oes hawl gennych chi i ddiwygio'ch cyfrif allanol.",
        "login": "Mewngofnodi",
+       "login-security": "Gwirwch eich ID.",
        "nav-login-createaccount": "Mewngofnodi",
-       "userlogin": "Mewngofnodi / creu cyfrif",
-       "userloginnocreate": "Mewngofnodi",
        "logout": "Allgofnoder",
        "userlogout": "Allgofnodi",
        "notloggedin": "Nid ydych wedi mewngofnodi",
        "userlogin-noaccount": "Dim cyfrif gennych?",
        "userlogin-joinproject": "Ymuno â {{SITENAME}}",
-       "nologin": "Dim cyfrif gennych? $1.",
-       "nologinlink": "Crëwch gyfrif",
        "createaccount": "Creu cyfrif newydd",
-       "gotaccount": "Oes cyfrif gennych eisoes? $1.",
-       "gotaccountlink": "Mewngofnodi",
-       "userlogin-resetlink": "Ydych chi wedi anghofio eich manylion mewngofnodi?",
        "userlogin-resetpassword-link": "Wedi anghofio eich cyfrinair?",
        "userlogin-helplink2": "Cymorth wrth fewngofnodi",
        "userlogin-loggedin": "Rydych eisoes wedi mewngofnodi wrth yr enw {{GENDER:$1|$1}}.\nDefnyddiwch y ffurflen isod i fewngofnodi wrth rhyw enw arall.",
+       "userlogin-reauth": "Mae'n rhaid i chi fewngofnodi eto er mwyn gwiro eich bod yn {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Creu cyfrif ychwanegol",
        "createacct-emailrequired": "Cyfeiriad ebost",
        "createacct-emailoptional": "Cyfeiriad ebost (dewisol)",
        "createacct-another-email-ph": "Rhowch y cyfeiriad e-bost",
        "createaccountmail": "Defnyddio cyfrinair ar hap dros dro a'i anfon i'r cyfeiriad e-bost a roddwyd",
        "createacct-realname": "Enw cywir (dewisiol)",
-       "createaccountreason": "Rheswm:",
        "createacct-reason": "Rheswm",
        "createacct-reason-ph": "Pam ydych yn creu cyfrif arall?",
+       "createacct-reason-help": "Dangosir y neges yn y log creu cyfri.",
        "createacct-submit": "Creer y cyfrif",
        "createacct-another-submit": "Creu cyfrif",
        "createacct-continue-submit": "Parhau i greu cyfrif",
+       "createacct-another-continue-submit": "Parhau i greu cyfrif",
        "createacct-benefit-heading": "Ffrwyth llafur pobl fel chi yw {{SITENAME}}.",
        "createacct-benefit-body1": "{{PLURAL:$1|golygiad|golygiad|olygiad|golygiad}}",
        "createacct-benefit-body2": "{{PLURAL:$1|tudalen|dudalen|dudalen|tudalen|thudalen|tudalen}}",
        "createacct-benefit-body3": "{{PLURAL:$1|cyfranwyr yn|wedi cyfrannu'n}} ddiweddar",
        "badretype": "Nid yw'r cyfrineiriau'n union yr un fath.",
+       "usernameinprogress": "Mae creu cyfrif i'r enw-defnyddiwr hwn wrthi'n cael ei brosesu. Daliwch eich gafael!",
        "userexists": "Mae rhywun arall wedi dewis yr enw defnyddiwr hwn. \nDewiswch un arall os gwelwch yn dda.",
        "loginerror": "Problem mewngofnodi",
        "createacct-error": "Nam wrth greu cyfrif",
        "nocookiesnew": "Mae'r cyfrif defnyddiwr wedi cael ei greu, ond nid ydych wedi mewngofnodi. Mae {{SITENAME}} yn defnyddio cwcis wrth i ddefnyddwyr fewngofnodi. Rydych chi wedi analluogi cwcis. Mewngofnodwch eto gyda'ch enw defnyddiwr a'ch cyfrinair newydd os gwelwch yn dda, ar ôl galluogi cwcis.",
        "nocookieslogin": "Mae {{SITENAME}} yn defnyddio cwcis wrth i ddefnyddwyr fewngofnodi. Rydych chi wedi analluogi cwcis. Trïwch eto os gwelwch yn dda, ar ôl galluogi cwcis.",
        "nocookiesfornew": "Ni chrëwyd cyfrif defnyddiwr newydd, oherwydd na allem gadarnhau ei ffynhonnell.\nSicrhewch eich bod wedi galluogi cwcis, yna ail-lwythwch y dudalen hon a cheisiwch eto.",
+       "createacct-loginerror": "Crewyd y cyfrif yn llwyddiannus, ond nid oedd yn bosibl i chi fewngofnodi'n otomatig. Ewch i [[Special:UserLogin|fewngofnodi drwy law a llygad]].",
        "noname": "Dydych chi ddim wedi cynnig enw defnyddiwr dilys.",
        "loginsuccesstitle": "Llwyddodd y mewngofnodi",
        "loginsuccess": "'''Yr ydych wedi mewngofnodi i {{SITENAME}} fel \"$1\".'''",
        "wrongpassword": "Nid yw'r cyfrinair a deipiwyd yn gywir. Rhowch gynnig arall arni, os gwelwch yn dda.",
        "wrongpasswordempty": "Roedd y cyfrinair yn wag. Rhowch gynnig arall arni.",
        "passwordtooshort": "Mae'n rhaid fod gan gyfrinair o leia $1 {{PLURAL:$1|nod}}.",
+       "passwordtoolong": "Ni chaiff cyfrinair fod yn hirach na {{PLURAL:$1|1 llythyren|$1 llythyren}}.",
+       "passwordtoopopular": "Chewch chi ddim defnyddio cyfreinair rhy syml, rhy gyffredin. Dewisiwch un unigryw!",
        "password-name-match": "Rhaid i'ch cyfrinair a'ch enw defnyddiwr fod yn wahanol i'w gilydd.",
        "password-login-forbidden": "Gwaharddwyd defnyddio'r enw defnyddiwr a'r cyfrinair hwn.",
        "mailmypassword": "Ailosoder y cyfrinair",
        "createacct-another-realname-tip": "Gallwch ddewis roi eich enw go iawn.\nOs y gwnewch, fe gaiff yr enw go iawn ei defnyddio wrth dadogi'ch gwaith.",
        "pt-login": "Mewngofnodi",
        "pt-login-button": "Mewngofnoder",
+       "pt-login-continue-button": "Parhau i fewngofnodi",
        "pt-createaccount": "Crëwch gyfrif",
        "pt-userlogout": "Allgofnodi",
        "php-mail-error-unknown": "Gwall anhysbys yng ngweithrediad post() PHP",
        "resetpass_submit": "Gosod y cyfrinair a mewngofnodi",
        "changepassword-success": "Newidiwyd eich cyfrinair!",
        "changepassword-throttled": "Rydych wedi ceisio logio mewn yn rhy aml.\nArhoswch am $1 cyn trio eto.",
+       "botpasswords": "Cyfrineiriau bots",
+       "botpasswords-label-appid": "Enw bot:",
        "botpasswords-label-create": "Dechrau",
        "botpasswords-label-update": "Diweddaru",
        "botpasswords-label-cancel": "Canslo",
        "passwordreset-emailtext-ip": "Mae rhywun (chi yn ôl pob tebyg, o'r cyfeiriad IP $1) wedi gofyn am ailosod eich cyfrinair ar {{SITENAME}} ($4). Mae'r {{PLURAL:$3|cyfrif|cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:\n\n$2\n\nBydd y {{PLURAL:$3||cyfrinair dros dro hwn|cyfrineiriau dros dro hyn}} yn dod i ben ymhen {{PLURAL:$5||diwrnod |deuddydd|tridiau|$5 diwrnod}}. Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
        "passwordreset-emailtext-user": "Gofynodd y defnyddiwr $1 ar {{SITENAME}} am gael ailosod ei gyfrinair ar {{SITENAME}}\n($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:\n\n$2\n\nBydd y {{PLURAL:$3||cyfrinair|cyfrineiriau}} dros dro hyn yn dod i ben ymhen {{PLURAL:$5||diwrnod|deuddydd|tridiau|$5 diwrnod}}.\nDylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd am ailosod y cyfrinair, neu os ydych wedi cofio eich cyfrinair gwreiddiol, neu os nad ydych am ei newid bellach, gallwch anwybyddu'r neges hon a pharhau i ddefnyddio eich hen gyfrinair.",
        "passwordreset-emailelement": "Enw'r defnyddiwr: \n$1\n\nY cyfrinair dros dro: \n$2",
-       "passwordreset-emailsentemail": "Anfonwyd e-bost i ailosod eich cyfrinair atoch.",
+       "passwordreset-emailsentemail": "Os yw'r ebost hwn ynghlwm wrth eich cyfrif, yna anfonir e-bost i ailosod eich cyfrinair atoch.",
+       "passwordreset-emailsentusername": "Os oes ebost ynghlwm wrth eich cyfrif, yna anfonir e-bost i ailosod eich cyfrinair atoch.",
+       "passwordreset-nocaller": "Rhaid darparu'r wybodaeth wreiddiol",
+       "passwordreset-nosuchcaller": "Nid yw'r ffynhonnell yn bodoli: $1",
        "passwordreset-ignored": "Ailosod y cyfrinair nad ymdriniwyd â. Efallai y nid y darparwr yn osod?",
        "passwordreset-invalidemail": "Cyfeiriad e-bost annilys",
+       "passwordreset-nodata": "Ni wnaethoch ddarparu ebost na chyfeiriad",
        "changeemail": "Newid y cyfeiriad e-bost",
        "changeemail-header": "Cwbwlhewch y ffurflen hon i newid cyfeiriad e-bost y cyfrifi. I ddileu pob cysylltiad i bob cyfeiriad ebost, gadewch e'n wag.",
        "changeemail-no-info": "Ni allwch fynd at y dudalen hon heblaw eich bod wedi mewngofnodi.",
        "changeemail-password": "Eich cyfrinair ar {{SITENAME}}:",
        "changeemail-submit": "Newidier y cyfeiriad e-bost",
        "changeemail-throttled": "'Da chi wedi trio mewngofnodi gormod o weithiau.\nDaliwch eich gafael am $1 cyn ceisio eto.",
+       "changeemail-nochange": "Darparwch cyfeiriad ebost newydd a gwahanol.",
        "resettokens": "Ailosod tocynnau",
        "resettokens-text": "Gallwch ailosod tocynnau sy'n galluogi mynediad at rai manylion preifat sydd ynghlwm wrth y cyfrif yma.\n\nDylech wneud hyn os wnaethoch rannu'r manylion hyn gyda rhywun ar ddamwain neu os oes problem wedi codi gyda diogelwch eich cyfrif.",
        "resettokens-no-tokens": "Nid oes unrhyw docynnau i'w hailosod.",
        "preview": "Rhagolwg",
        "showpreview": "Dangos rhagolwg",
        "showdiff": "Dangos newidiadau",
-       "blankarticle": "<strong>Gan bwyll:</strong> Mae'r dudalen rydych yn ei chreu'n wag. Os cliciwch \"{{int:savearticle}}\" eto, yna caiff y dudalen ei chreu heb unrhyw gynnwys ynddi.",
+       "blankarticle": "<strong>Gan bwyll:</strong> Mae'r dudalen rydych yn ei chreu'n wag. Os cliciwch \"$1\" eto, yna caiff y dudalen ei chreu heb unrhyw gynnwys ynddi.",
        "anoneditwarning": "<strong>Dalier sylw</strong>: Nid ydych wedi mewngofnodi. Fe fydd eich cyfeiriad IP yn ymddangos ar hanes golygu'r dudalen hon. Gallwch ddewis cuddio'ch cyfeiriad IP drwy greu cyfrif (a mewngofnodi) cyn golygu.",
        "anonpreviewwarning": "''Nid ydych wedi mewngofnodi. Os y cadwch eich newidiadau caiff eich cyfeiriad IP ei gofnodi yn hanes golygu'r dudalen hon.''",
        "missingsummary": "'''Sylwer:''' Nid ydych wedi gosod nodyn yn y blwch 'Crynodeb'.\nOs y pwyswch eto ar 'Cadw'r dudalen' caiff y golygiad ei gadw heb nodyn.",
-       "selfredirect": "<strong>Gofal:</strong> Rydych yn ailgyfeirio'r dudalen hon ati hi ei hun!  Gwirwch yr hyn rydych yn ceisio'i wneud. Os cliciwch \"{{int:savearticle}}\" eto yna caiff y dudalen ailgyfeirio (wallus!) ei chreu beth bynnag.",
+       "selfredirect": "<strong>Gofal:</strong> Rydych yn ailgyfeirio'r dudalen hon ati hi ei hun!  Gwirwch yr hyn rydych yn ceisio'i wneud. Os cliciwch \"$1\" eto yna caiff y dudalen ailgyfeirio (wallus!) ei chreu beth bynnag.",
        "missingcommenttext": "Rhowch eich sylwadau isod.",
-       "missingcommentheader": "<strong>Nodyn atgoffa:</strong> \nNid ydych wedi cynnig unrhywbeth yn y blwch 'Pwnc:'. Os y cliciwch \"{{int:savearticle}}\" eto fe gedwir y golygiad heb bennawd.",
+       "missingcommentheader": "<strong>Nodyn atgoffa:</strong> \nNid ydych wedi cynnig unrhywbeth yn y blwch 'Pwnc:'. Os y cliciwch \"$1\" eto fe gedwir y golygiad heb bennawd.",
        "summary-preview": "Rhagolwg o'r crynodeb:",
        "subject-preview": "Rhagolwg pwnc:",
+       "previewerrortext": "Cafwyd nam tra'n ceisio creu rhagolwg o'r newidiadau.",
        "blockedtitle": "Mae'r defnyddiwr hwn wedi cael ei flocio",
        "blockedtext": "'''Mae eich enw defnyddiwr neu gyfeiriad IP wedi cael ei flocio.'''\n\n$1 a osododd y bloc.\nY rheswm a roddwyd dros y blocio yw: ''$2''.\n\n*Dechreuodd y bloc am: $8\n*Bydd y bloc yn dod i ben am: $6\n*Bwriadwyd blocio: $7\n\nGallwch gysylltu â $1 neu un arall o'r [[{{MediaWiki:Grouppage-sysop}}|gweinyddwyr]] i drafod y bloc.\nSylwch mai dim ond y rhai sydd wedi gosod cyfeiriad e-bost yn eu [[Special:Preferences|dewisiadau defnyddiwr]], a hwnnw heb ei flocio, sydd yn gallu 'anfon e-bost at ddefnyddiwr' trwy'r wici.\n$3 yw eich cyfeiriad IP presennol. Cyfeirnod y bloc yw #$5.\nPan yn ysgrifennu at weinyddwr, cofiwch gynnwys yr holl fanylion uchod, os gwelwch yn dda.",
        "autoblockedtext": "Rhoddwyd bloc yn awtomatig ar eich cyfeiriad IP oherwydd iddo gael ei ddefnyddio gan ddefnyddiwr arall, a bod bloc wedi ei roi ar hwnnw gan $1.\nY rheswm a roddwyd dros y bloc oedd:\n\n:''$2''\n\n*Dechreuodd y bloc am: $8\n*Daw'r bloc i ben am: $6\n*Bwriadwyd blocio: $7\n\nGallwch gysylltu â $1 neu un arall o'r [[{{MediaWiki:Grouppage-sysop}}|gweinyddwyr]] i drafod y bloc.\n\nSylwch mai dim ond y rhai sydd wedi gosod cyfeiriad e-bost yn eu [[Special:Preferences|dewisiadau defnyddiwr]], a hwnnw heb ei flocio, sydd yn gallu 'anfon e-bost at ddefnyddiwr' trwy'r wici.\n\nEich cyfeiriad IP presennol yw $3. Cyfeirnod y bloc yw $5. Nodwch y manylion hyn wrth drafod y bloc.",
        "userpage-userdoesnotexist": "Nid oes defnyddiwr a'r enw \"<nowiki>$1</nowiki>\" yn bod. Gwnewch yn siwr eich bod am greu/golygu'r dudalen hon.",
        "userpage-userdoesnotexist-view": "Nid yw'r cyfrif defnyddiwr \"$1\" wedi ei gofrestri.",
        "blocked-notice-logextract": "Mae'r defnyddiwr hwn wedi ei flocio ar hyn o bryd.\nDyma'r cofnod lòg diweddaraf, er gwybodaeth:",
-       "clearyourcache": "'''Sylwer - Wedi i chi roi'r dudalen ar gadw, efallai y bydd angen mynd heibio celc eich porwr er mwyn gweld y newidiadau.'''\n*'''Firefox / Safari:''' Pwyswch ar ''Shift'' tra'n clicio ''Ail-lwytho/Reload'', neu gwasgwch ''Ctrl-F5'' neu ''Ctrl-R'' (''⌘-R'' ar Mac);\n*'''Google Chrome:'''Pwyswch ar Ctrl-Shift-R'' (''⌘-Shift-R'' ar Mac)\n*'''Internet Explorer:''' Pwyswch ar ''Ctrl'' tra'n clicio ''Adnewyddu/Refresh'', neu gwasgwch ''Ctrl-F5''. \n*'''Opera:''' gwacewch y celc yn llwyr trwy ''Offer → Dewisiadau / Tools→Preferences'';",
+       "clearyourcache": "'''Sylwer - Wedi i chi roi'r dudalen ar gadw, efallai y bydd angen mynd heibio celc eich porwr er mwyn gweld y newidiadau.'''\n*'''Firefox / Safari:''' Pwyswch ''Shift'' tra'n clicio ''Ail-lwytho/Reload'', neu bwyswch ''Ctrl-F5'' neu ''Ctrl-R'' (''⌘-R'' ar Mac);\n*'''Google Chrome:'''Pwyswch ar Ctrl-Shift-R'' (''⌘-Shift-R'' ar Mac)\n*'''Internet Explorer:''' Pwyswch ''Ctrl'' tra'n clicio ''Adnewyddu/Refresh'', neu bwyswch ''Ctrl-F5''. \n*'''Opera:''' gwagiwch y celc yn llwyr trwy ''Offer → Dewisiadau / Tools→Preferences'';",
        "usercssyoucanpreview": "'''Tip:''' Defnyddiwch y botwm \"{{int:showpreview}}\" er mwyn profi eich CSS newydd cyn ei gadw.",
        "userjsyoucanpreview": "'''Tip:''' Defnyddiwch y botwm \"{{int:showpreview}}\" er mwyn profi eich JS newydd cyn ei gadw.",
        "usercsspreview": "'''Cofiwch - dim ond rhagolwg o'ch CSS defnyddiwr yw hwn.'''\n'''Nid yw wedi'i gadw eto!'''",
        "editingsection": "Yn golygu $1 (adran)",
        "editingcomment": "Yn golygu $1 (adran newydd)",
        "editconflict": "Cyd-ddigwyddiad golygu: $1",
-       "explainconflict": "Mae rhywun arall wedi newid y dudalen hon ers i chi ddechrau ei golygu hi.\nMae'r blwch testun uchaf yn cynnwys testun y dudalen fel y mae hi rwan.\nMae eich newidiadau chi yn ymddangos yn y blwch testun isaf.\nBydd yn rhaid i chi gyfuno eich newidiadau chi a'r testun sydd yn bodoli eisoes.\n'''Dim ond''' y testun yn y blwch testun '''uchaf''' fydd yn cael ei roi ar gadw pan wasgwch y botwm \"{{int:savearticle}}\".",
+       "explainconflict": "Mae rhywun arall wedi newid y dudalen hon ers i chi ddechrau ei golygu hi.\nMae'r blwch testun uchaf yn cynnwys testun y dudalen fel y mae hi rwan.\nMae eich newidiadau chi yn ymddangos yn y blwch testun isaf.\nBydd yn rhaid i chi gyfuno eich newidiadau chi a'r testun sydd yn bodoli eisoes.\n'''Dim ond''' y testun yn y blwch testun '''uchaf''' fydd yn cael ei roi ar gadw pan wasgwch y botwm \"$1\".",
        "yourtext": "Eich testun",
        "storedversion": "Y golygiad diweddaraf yn y storfa",
        "nonunicodebrowser": "'''RHYBUDD: Nid yw eich porwr yn cydymffurfio ag Unicode. Serch hyn, mae modd i chi olygu tudalennau: bydd nodau sydd ddim yn rhan o ASCII yn ymddangos yn y blwch golygu fel codau hecsadegol.'''",
        "yourdiff": "Gwahaniaethau",
        "copyrightwarning": "Mae pob cyfraniad i {{SITENAME}} yn cael ei ryddhau o dan termau'r Drwydded Ddogfen Rhydd ($2) (gwelwch $1 am fanylion). Os nad ydych chi'n fodlon i'ch gwaith gael ei olygu heb drugaredd, neu i gopïau ymddangos ar draws y we, peidiwch a'i gyfrannu yma.<br />\nRydych chi'n cadarnhau mai chi yw awdur y cyfraniad, neu eich bod chi wedi'i gopïo o'r parth cyhoeddus (''public domain'') neu rywle rhydd tebyg. '''Nid''' yw'r mwyafrif o wefannau yn y parth cyhoeddus.\n\n'''PEIDIWCH Â CHYFRANNU GWAITH O DAN HAWLFRAINT HEB GANIATÂD!'''",
        "copyrightwarning2": "Sylwch fod pob cyfraniad i {{SITENAME}} yn cael ei ryddhau o dan termau'r Drwydded Ddogfen Rhydd (gwelwch $1 am fanylion).\nOs nad ydych chi'n fodlon i'ch gwaith gael ei olygu heb drugaredd, neu i gopïau ymddangos ar draws y we, peidiwch a'i gyfrannu yma.<br />\nRydych chi'n cadarnhau mai chi yw awdur y cyfraniad, neu eich bod chi wedi'i gopïo o'r parth cyhoeddus (''public domain'') neu rywle rhydd tebyg.<br />\n'''PEIDIWCH Â CHYFRANNU GWAITH O DAN HAWLFRAINT HEB GANIATÂD!'''",
+       "editpage-cannot-use-custom-model": "Ni ellir newid cynnwys y ddalen.",
        "longpageerror": "'''GWALL: Mae'r testun yr ydych wedi ei osod yma yn {{PLURAL:$1|$1 cilobeit}} o hyd, ac yn hwy na'r hyd eithaf o {{PLURAL:$2|$2}} cilobeit.\nNi ellir ei roi ar gadw.'''",
-       "readonlywarning": "'''RHYBUDD: Mae'r gronfa ddata wedi'i chloi am gyfnod er mwyn cynnal a chadw, felly fyddwch chi ddim yn gallu cadw'ch golygiadau ar hyn o bryd.''' \nGallwch gopïo'r testun a'i gludo i ffeil destun er mwyn ei gadw tan yn hwyrach.\n\nCynigiodd y gweinyddwr a glodd y gronfa ddata y rheswm hwn dros ei chloi: $1",
+       "readonlywarning": "<strong>Rhybudd: Mae'r gronfa ddata wedi'i chloi am gyfnod er mwyn cynnal a chadw, felly fyddwch chi ddim yn gallu cadw'ch golygiadau ar hyn o bryd.</strong>\nGallwch gopïo'r testun a'i gludo i ffeil destun er mwyn ei gadw tan yn hwyrach.\n\nCynigiodd y gweinyddwr a glodd y gronfa ddata y rheswm hwn dros ei chloi: $1",
        "protectedpagewarning": "'''RHYBUDD: Mae'r dudalen hon wedi'i diogelu. Dim ond gweinyddwyr sydd yn gallu ei golygu.'''\nDyma'r cofnod lòg diweddaraf, er gwybodaeth:",
        "semiprotectedpagewarning": "'''Sylwer:''' Mae'r dudalen hon wedi ei chloi; dim ond defnyddwyr cofrestredig a allant ei golygu.\nDyma'r cofnod lòg diweddaraf, er gwybodaeth:",
-       "cascadeprotectedwarning": "'''Dalier sylw:''' Mae'r dudalen hon wedi ei diogelu fel nad ond defnyddwyr â galluoedd gweinyddwyr sy'n gallu ei newid, oherwydd ei bod yn rhan o'r {{PLURAL:$1|dudalen ganlynol|dudalen ganlynol|tudalennau canlynol}} sydd wedi {{PLURAL:$1|ei sgydol-ddiogelu|ei sgydol-ddiogelu|eu sgydol-diogelu}}.",
+       "cascadeprotectedwarning": "<strong>Dalier sylw:</strong> Mae'r dudalen hon wedi ei chloi fel mai dim ond defnyddwyr â galluoedd 'Gweinyddwyr' all ei newid, oherwydd ei bod yn rhan o'r {{PLURAL:$1|dudalen ganlynol|dudalen ganlynol|tudalennau canlynol}} sydd wedi {{PLURAL:$1|ei sgydol-ddiogelu|ei diogelu|eu diogelu}}.",
        "titleprotectedwarning": "'''RHYBUDD:  Mae'r dudalen hon wedi ei chloi; dim ond rhai defnyddwyr sydd â'r [[Special:ListGroupRights|gallu]] i'w chreu.'''\nDyma'r cofnod lòg diweddaraf, er gwybodaeth:",
        "templatesused": "Defnyddir y {{PLURAL:$1|nodyn hwn|nodyn hwn|nodiadau hyn|nodiadau hyn|nodiadau hyn|nodiadau hyn}} yn y dudalen hon:",
        "templatesusedpreview": "Defnyddir y {{PLURAL:$1|nodyn hwn|nodyn hwn|nodiadau hyn|nodiadau hyn|nodiadau hyn|nodiadau hyn}} yn y rhagolwg hwn:",
        "permissionserrorstext-withaction": "Nid yw'r gallu hwn ($2) ganddoch, am y {{PLURAL:$1|rheswm|rheswm|rhesymau|rhesymau|rhesymau|rhesymau}} canlynol:",
        "recreate-moveddeleted-warn": "'''Dalier sylw: Rydych yn ail-greu tudalen a ddilewyd rhywdro.'''\n\nYstyriwch a fyddai'n dda o beth i barhau i olygu'r dudalen hon.\nDyma'r logiau dileu a symud ar gyfer y dudalen, er gwybodaeth:",
        "moveddeleted-notice": "Dilëwyd y dudalen hon.\nDangosir y logiau dileu a symud ar gyfer y dudalen isod.",
+       "moveddeleted-notice-recent": "Ymddiheurwn! Dilewyd y ddalen hon yn ddiweddar (yn y 24 awr diwethaf).\nEr gwybodaeth, darperir isod yr holl wybodaeth berthnasol.",
        "log-fulllog": "Gweld y lòg cyflawn",
        "edit-hook-aborted": "Terfynwyd y golygiad cyn pryd gan fachyn.\nNi roddodd eglurhad.",
        "edit-gone-missing": "Ni ellid diweddaru'r dudalen.\nYmddengys iddi gael ei dileu.",
        "invalid-content-data": "Data annilys i'r cynnwys",
        "content-not-allowed-here": "Nid yw cynnwys ar ffurf \"$1\" yn cael ei ganiatau ar y dudalen [[$2]]",
        "editwarning-warning": "Os y gadewch y dudalen hon mae'n bosib y collwch eich newidiadau iddi.\nOs ydych wedi mewngofnodi gallwch ddiddymu'r rhybudd hwn yn yr adran \"{{int:prefs-editing}}\" yn eich dewisiadau.",
+       "editpage-invalidcontentmodel-title": "Nid yw'r model yma ar gael.",
+       "editpage-invalidcontentmodel-text": "Nid yw'r model \"$1\" ar gael.",
        "editpage-notsupportedcontentformat-title": "Dydy fformat y cynnwys hwn ddim yn cael ei gefnogi gennym.",
        "editpage-notsupportedcontentformat-text": "Dydy'r fformat $1 ar y cynnwys ddim yn cael ei gefnogi gan y model $2.",
        "content-model-wikitext": "cystrawen wici",
        "content-model-css": "CSS",
        "content-json-empty-object": "Dim gwrthrych",
        "content-json-empty-array": "Rhesi gwag",
+       "duplicate-args-warning": "<strong>Rhybudd:</strong> Mae [[:$1]] yn galw [[:$2]] gyda mwy nag un gwerthrif (''value'') i baramedr \"$3\". Dim ond y gwerthrif diwethaf gaiff ei ddefnyddio.",
        "duplicate-args-category": "Tudalennau gyda meysydd deublyg yn y Nodion",
        "duplicate-args-category-desc": "Mae'r dudalen hon yn cynnwys meysydd yn y Nodion, ddwy waith e.e.  <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> neu <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Rhybudd:''' Mae gormod o alwadau ar ffwythiannau dosrannu sy'n dreth ar adnoddau yn y dudalen hon.\n\nDylai fod llai na $2 {{PLURAL:$2|galwad|alwad|alwad|galwad}} yn y dudalen, ond ar hyn o bryd mae $1 {{PLURAL:$1|galwad|alwad|alwad|galwad}} ynddi.",
        "history-feed-description": "Hanes diwygio'r dudalen hon ar y wici",
        "history-feed-item-nocomment": "$1 am $2",
        "history-feed-empty": "Nid yw'r dudalen a ofynwyd amdani'n bod.\nGall fod iddi gael ei dileu neu ei hailenwi.\nGallwch [[Special:Search|chwilio'r]] wici am dudalennau eraill perthnasol.",
+       "history-edit-tags": "Tagiau golygu y fersiynau a ddewisiwyd",
        "rev-deleted-comment": "(dilëwyd crynodeb y golygiad)",
        "rev-deleted-user": "(enw defnyddiwr wedi ei ddiddymu)",
        "rev-deleted-event": "(tynnwyd manylion y lòg)",
        "rev-showdeleted": "dangos",
        "revisiondelete": "Dileu/dad-ddileu diwygiadau",
        "revdelete-nooldid-title": "Anelwyd at olygiad annilys",
-       "revdelete-nooldid-text": "Naill ai; nid ydych wedi dynodi diwygiad yn darged y weithred, neu nid yw'r diwygiad penodedig yn bod, neu rydych wedi ceisio cuddio'r diwygiad presennol.",
+       "revdelete-nooldid-text": "Naill ai nid ydych wedi dynodi diwygiad yn darged y weithred, neu nid yw'r diwygiad penodedig yn bod, neu rydych wedi ceisio cuddio'r diwygiad presennol.",
        "revdelete-no-file": "Nid yw'r ffeil a nodwyd yn bod.",
        "revdelete-show-file-confirm": "Ydych chi'n sicr eich bod am weld y diwygiad dilëedig o'r ffeil \"<nowiki>$1</nowiki>\" a roddwyd ar gadw am $3 ar $2?",
        "revdelete-show-file-submit": "Ydw",
        "revdelete-unsuppress": "Tynnu'r cyfyngiadau ar y golygiadau a adferwyd",
        "revdelete-log": "Rheswm:",
        "revdelete-submit": "Rhoi ar waith ar y {{PLURAL:$1|golygiad|golygiad|golygiadau|golygiadau|golygiadau|golygiadau}} dewisedig",
-       "revdelete-success": "'''Diweddarwyd y gallu i weld golygiadau.'''",
+       "revdelete-success": "Diweddarwyd y golygiad.",
        "revdelete-failure": "'''Ni ellid newid y cyfyngiadau ar y gallu i weld y golygiad:'''\n$1",
-       "logdelete-success": "'''Llwyddwyd i guddio neu i ddatguddio'r digwyddiad rhag y lòg.'''",
+       "logdelete-success": "Cuddiwyd/datguddiwyd y digwyddiad rhag y lòg.",
        "logdelete-failure": "'''Ni ellid gosod cyfyngiadau ar y gallu i weld y cofnod lòg:'''\n$1",
        "revdel-restore": "Newid gwelededd",
        "pagehist": "Hanes y dudalen",
        "mergehistory-go": "Dangos y golygiadau y gellir eu cyfuno",
        "mergehistory-submit": "Cyfuner y diwygiadau",
        "mergehistory-empty": "Ni ellir cyfuno unrhyw ddiwygiadau.",
-       "mergehistory-done": "Cyfunwyd $3 {{PLURAL:$3|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}} o $1 yn llwyddiannus i'r dudalen [[:$2]].",
+       "mergehistory-done": "Cyfunwyd $3 {{PLURAL:$3|diwygiad}} o $1 a [[:$2]].",
        "mergehistory-fail": "Methodd y cyfuno hanes; a wnewch wirio paramedrau'r dudalen a'r amser unwaith eto.",
+       "mergehistory-fail-bad-timestamp": "Mae'r stamp-amser yn annilys.",
+       "mergehistory-fail-invalid-source": "Mae'r ddalen wreiddiol (y ''source page'') yn annilys.",
+       "mergehistory-fail-invalid-dest": "Mae'r ddalen-darged (y ''destination page'') yn annilys.",
+       "mergehistory-fail-no-change": "Ni chyfunwyd hanes yr adolygiadau. Gwirwch y ddalen a pharamedrau amser, os yw'n bodoli.",
+       "mergehistory-fail-permission": "Nid oes gennych yr hawliau digonol i gyfuno yr hanes.",
+       "mergehistory-fail-self-merge": "Mae'r dalennau gwreiddiol a tharged yr un! (''Source and destination pages are the same.'')",
        "mergehistory-no-source": "Nid yw'r dudalen gwreiddiol $1 yn bod.",
        "mergehistory-no-destination": "Nid yw'r dudalen cyrchfan $1 yn bod.",
        "mergehistory-invalid-source": "Rhaid bod teitl dilys gan y dudalen gwreiddiol.",
        "searchprofile-advanced-tooltip": "Chwilio drwy parthau dewisol",
        "search-result-size": "$1 ({{PLURAL:$2|dim geiriau|$2 gair|$2 air|$2 gair|$2 gair|$2 gair|}})",
        "search-result-category-size": "{{PLURAL:$1|$1 aelod}} ({{PLURAL:$2|$2 is-gategori}}, {{PLURAL:$3|$3 ffeil}})",
-       "search-redirect": "(ailgyfeiriad $1)",
+       "search-redirect": "(ailgyfeiriad $1)",
        "search-section": "(adran $1)",
        "search-category": "(categori $1)",
        "search-file-match": "(yn cyfateb i gynnwys y ffeil)",
        "search-suggest": "Ai am hyn y chwiliwch: $1",
+       "search-rewritten": "Dangosir canlyniadauar gyfer $1. Chwiliwch am $2.",
        "search-interwiki-caption": "Chwaer-brosiectau",
        "search-interwiki-default": "Y canlyniadau o $1:",
        "search-interwiki-more": "(rhagor)",
+       "search-interwiki-more-results": "rhagor o ganlyniadau",
        "search-relatedarticle": "Erthyglau eraill tebyg",
        "searchrelated": "erthyglau eraill tebyg",
        "searchall": "oll",
        "showingresultsinrange": "Yn dangos hyd at {{PLURAL:$1||<strong>1</strong> canlyniad|<strong>$1</strong> ganlyniad|$1 o ganlyniadau}} isod yn yr ystod #<strong>$2</strong> i #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|Canlyniadau: <strong>$1 - $2</strong> o <strong>$3</strong>}}",
        "search-nonefound": "Ni chafwyd dim canlyniadau i'r ymholiad.",
+       "search-nonefound-thiswiki": "Doedd dim un canlyniad er chwilio'r wefan gyfan.",
        "powersearch-legend": "Chwiliad uwch",
        "powersearch-ns": "Chwilio yn y parthau:",
        "powersearch-togglelabel": "Dewis:",
        "search-external": "Chwiliad allanol",
        "searchdisabled": "Mae'r teclyn chwilio ar {{SITENAME}} wedi'i analluogi dros dro.\nYn y cyfamser gallwch chwilio drwy Google.\nCofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
        "search-error": "Cafwyd gwall wrth chwilio: $1",
+       "search-warning": "Cafwyd rhybudd tra'n chwilio: $1",
        "preferences": "Dewisiadau",
        "mypreferences": "Dewisiadau",
        "prefs-edits": "Nifer y golygiadau:",
        "prefs-personal": "Data personol",
        "prefs-rc": "Newidiadau diweddar",
        "prefs-watchlist": "Rhestr wylio",
+       "prefs-editwatchlist": "Golygu'r rhestr wylio",
+       "prefs-editwatchlist-label": "Golygiadau ar eich rhestr wylio:",
+       "prefs-editwatchlist-edit": "Gosod a dileu teitlau o'ch rhestr wylio",
+       "prefs-editwatchlist-raw": "Golygu cod eich rhestr wylio",
+       "prefs-editwatchlist-clear": "Clirio eich rhestr wylio",
        "prefs-watchlist-days": "Nifer y diwrnodau i'w dangos yn y rhestr wylio:",
        "prefs-watchlist-days-max": "Hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}}",
        "prefs-watchlist-edits": "Nifer y golygiadau i'w dangos wrth ehangu'r rhestr wylio:",
        "youremail": "Eich cyfeiriad e-bost",
        "username": "{{GENDER:$1|Enw defnyddiwr}}:",
        "prefs-memberingroups": "Yn {{GENDER:$2|aelod}} o'r {{PLURAL:$1|grŵp|grŵp|grwpiau}} canlynol:",
+       "group-membership-link-with-expiry": "$1 (gyd at $2)",
        "prefs-registration": "Amser dechrau'r cyfrif:",
        "yourrealname": "Eich enw cywir*",
        "yourlanguage": "Iaith y rhyngwyneb",
        "prefswarning-warning": "Rydych wedi newid eich Dewisiadau, ac nid ydynt eto wedi'u cadw.\nOs gadewch y dudalen hon heb glicio \"$1\" yna fe gollwch y newidiadau hyn.",
        "prefs-tabs-navigation-hint": "Awgrym: Gallwch ddefnyddio'r allweddellau sy'n saethau i'r chwith neu i'r dde i lywio rhwng y tabiau ar restr y tabiau.",
        "userrights": "Rheoli galluoedd defnyddwyr",
-       "userrights-lookup-user": "Rheoli grwpiau defnyddiwr",
+       "userrights-lookup-user": "Dewisiwch ddefnyddiwr",
        "userrights-user-editname": "Rhowch enw defnyddiwr:",
-       "editusergroup": "Golygu Grwpiau {{GENDER:$1|Defnyddwyr}}",
+       "editusergroup": "Golygu grwpiau defnyddwyr",
        "editinguser": "Newid galluoedd {{GENDER:$1|y defnyddiwr}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Golygu grwpiau defnyddwyr",
+       "viewinguserrights": "Gweld galluoedd {{GENDER:$1|y defnyddiwr}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Golygu grwpiau {{GENDER:$1|defnyddwyr}}",
+       "userrights-viewusergroup": "Gweld {{GENDER:$1|grwpiau defnyddwyr}}",
        "saveusergroups": "Cadw'r Grwpiau {{GENDER:$1|Defnyddwyr}}",
        "userrights-groupsmember": "Yn aelod o:",
        "userrights-groupsmember-auto": "Ac ynghlwm wrth aelodaeth y grwpiau uchod, yn aelod o:",
        "userrights-nodatabase": "Nid yw'r bas data $1 yn bod neu nid yw'n un lleol.",
        "userrights-changeable-col": "Grwpiau y gallwch eu newid",
        "userrights-unchangeable-col": "Grwpiau na allwch eu newid",
+       "userrights-expiry-current": "Daw i ben $1",
+       "userrights-expiry-none": "Diderfyn, o ran amser",
+       "userrights-expiry": "Daw i ben:",
+       "userrights-expiry-existing": "Amser dod i ben: $3, $2",
+       "userrights-expiry-othertime": "Cyfnod arall:",
+       "userrights-expiry-options": "1 dydd:1 day,1 wythnos:1 week,1 mis:1 month,3 mis:3 months,6 mis:6 months,1 blynedd:1 year",
        "userrights-conflict": "Gwrthdaro oherwydd newid i hawliau defnyddiwr! Adolygwch eich newidiadau a'u cadarnhau.",
        "group": "Grŵp:",
        "group-user": "Defnyddwyr",
        "right-editsemiprotected": "Golygu tudalennau sydd wedi eu diogelu, ond \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Golygu cynnwys y ddalen",
        "right-editinterface": "Golygu'r rhyngwyneb",
-       "right-editusercssjs": "Golygu ffeiliau CSS a JS yn perthyn i ddefnyddwyr eraill",
        "right-editusercss": "Golygu ffeiliau CSS yn perthyn i ddefnyddwyr eraill",
        "right-edituserjs": "Golygu ffeiliau JS yn perthyn i ddefnyddwyr eraill",
        "right-editmyusercss": "Golygu eich ffeiliau defnyddiwr CSS eich hunan.",
        "right-siteadmin": "Cloi a datgloi'r databas",
        "right-override-export-depth": "Allforio tudalennau gan gynnwys tudalennau cysylltiedig hyd at ddyfnder o 5",
        "right-sendemail": "Anfon e-bost at ddefnyddwyr eraill",
-       "right-managechangetags": "Creu a dileu [[Special:Tags|tagiau]] o'r gronfa ddata",
+       "right-managechangetags": "Creu a dileu [[Special:Tags|tagiau]]",
+       "right-applychangetags": "Gosodwch y [[Special:Tags|tagiau]] gyda'r newidiadau",
+       "grant-generic": "Bwdel hawliau \"$1\"",
+       "grant-group-page-interaction": "Rhyngweithiwch gyda'r dalennau",
+       "grant-group-watchlist-interaction": "Rhyngweithiwch gyda'ch rhestr wylio",
        "grant-group-email": "Danfon ebost",
+       "grant-group-customization": "Eich dewisiadau chi",
+       "grant-group-administration": "Rhoi materion gweinyddol ar waith",
+       "grant-blockusers": "Blociwch a dadflociwch defnyddwyr",
+       "grant-createaccount": "Crewch gyfri",
+       "grant-createeditmovepage": "Creu, golygu a symud dalennau",
+       "grant-delete": "Dileu dalennau, adolygiadau a chofnodion y log",
+       "grant-editinterface": "Golygwch ''namespace'' MediaWiki a CSS/JavaScript y defnyddiwr",
+       "grant-editmycssjs": "Golygwch eich CSS/JavaScript",
+       "grant-editmyoptions": "Golygwch eich dewisiadau",
+       "grant-editmywatchlist": "Golygwch eich rhestr wylio",
+       "grant-editpage": "Golygwch dudalennau sy'n bodoli",
+       "grant-editprotected": "Golygwch dalennau sydd wedi'u cloi",
+       "grant-highvolume": "Golygu nifer ar yr un pryd",
+       "grant-oversight": "Cuddiwch y defnyddwyr a'u golygiadau",
+       "grant-patrol": "Newidiadau patrol y dalennau",
+       "grant-protect": "Cloi a datgloi dalennau",
+       "grant-rollback": "Dadwneud newidiadau dalennau",
+       "grant-sendemail": "Danfonwch ebost i ddefnyddwyr",
+       "grant-uploadeditmovefile": "Uwchlwythwch, ailosodwch a symudwch ffeiliau",
+       "grant-uploadfile": "Uwchlwythwch ffeiliau newydd",
        "grant-basic": "Hawliau sylfaenol",
        "grant-viewdeleted": "Gweld ffeiliau a ddilewyd",
        "grant-viewmywatchlist": "Gweld eich Rhestr Wylio",
+       "grant-viewrestrictedlogs": "Gweld cofnodion log cuddiedig",
        "newuserlogpage": "Lòg creu cyfrifon defnyddwyr newydd",
        "newuserlogpagetext": "Dyma restr o'r defnyddwyr newydd sydd wedi ymuno â'r wici.",
        "rightslog": "Lòg galluoedd defnyddiwr",
        "action-upload_by_url": "uwchlwytho'r ffeil o gyfeiriad URL",
        "action-writeapi": "defnyddio'r API i ysgrifennu a thrin y tudalennau",
        "action-delete": "dileu'r dudalen",
-       "action-deleterevision": "dileu'r golygiad",
-       "action-deletedhistory": "gweld hanes dilëedig y dudalen hon",
+       "action-deleterevision": "dileu'r newidiadau",
+       "action-deletelogentry": "dileu cofnodion log",
+       "action-deletedhistory": "gweld hanes dilëedig un ddalen",
+       "action-deletedtext": "Gweld newidiadau testun dalen a ddilewyd",
        "action-browsearchive": "chwilio drwy tudalennau dilëedig",
-       "action-undelete": "dad-ddileu'r dudalen",
+       "action-undelete": "dad-ddileu'r ddalen",
        "action-suppressrevision": "gweld ac adfer y golygiad cudd hwn",
        "action-suppressionlog": "gweld y lòg preifat hwn",
        "action-block": "atal y defnyddiwr hwn rhag golygu",
        "action-userrights-interwiki": "golygu galluoedd y defnyddwyr ar wicïau eraill",
        "action-siteadmin": "cloi neu ddatgloi'r databas",
        "action-sendemail": "anfon e-bost",
+       "action-editmyoptions": "golygwch eich dewisiadau",
        "action-editmywatchlist": "golygu eich rhestr wylio",
        "action-viewmywatchlist": "gweld eich rhestr wylio",
        "action-viewmyprivateinfo": "gweld eich manylion personol preifat",
        "action-editmyprivateinfo": "golygu eich manylion personol preifat",
        "action-editcontentmodel": "golygwch y cynnwys",
+       "action-managechangetags": "crewch a throwch y tagiau'n weithredol",
+       "action-applychangetags": "rhowch y tagiau ar waith, gyda'ch newidiadau",
+       "action-deletechangetags": "dilewch tagiau o'r gronfa ddata",
+       "action-purge": "carthwch y ddalen",
        "nchanges": "$1 {{PLURAL:$1|newid|newid|newid|newid|newid|o newidiadau}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ers eich ymweliad diwethaf}}",
        "enhancedrc-history": "hanes",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gweler hefyd [[Special:NewPages|restr y tudalennau newydd]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Dangos",
+       "rcfilters-activefilters": "Hidlau sydd ar waith",
+       "rcfilters-restore-default-filters": "Ailosodwch y ffiltrau di-ofyn",
+       "rcfilters-clear-all-filters": "Cliriwch yr holl hidlau (ffiltrau)",
+       "rcfilters-search-placeholder": "Ffiltrwch y newidiadau diweddaraf",
+       "rcfilters-invalid-filter": "Hidl annilys",
+       "rcfilters-empty-filter": "Dim hidlau ar waith",
+       "rcfilters-filterlist-title": "Hidlau (ffiltrau)",
+       "rcfilters-filterlist-feedbacklink": "Rhowch adborth ar yr hidlau beta",
+       "rcfilters-highlightbutton-title": "Amlygwch y canlyniadau",
+       "rcfilters-highlightmenu-title": "Dewisiwch liw",
+       "rcfilters-highlightmenu-help": "Dewisiwch liw sy'n cyd-fynd gyda'r nodwedd hon",
+       "rcfilters-filterlist-noresults": "Dim hidl ar gael",
+       "rcfilters-filtergroup-registration": "Defnyddiwch y gofrestr",
+       "rcfilters-filter-registered-label": "Cofrestr",
+       "rcfilters-filter-registered-description": "Golygyddion sydd wedi mewngofnodi.",
+       "rcfilters-filter-unregistered-label": "Heb gofrestru",
+       "rcfilters-filter-unregistered-description": "Golygyddion nad ydynt wedi cofrestru.",
+       "rcfilters-filter-editsbyself-label": "Eich golygiadau chi",
+       "rcfilters-filter-editsbyself-description": "Golygiadau gennych chi.",
+       "rcfilters-filter-editsbyother-label": "Golygiadau gan eraill",
+       "rcfilters-filter-editsbyother-description": "Golygiadau a grewyd gan eraill (nid gennych chi).",
+       "rcfilters-filtergroup-userExpLevel": "Lefel profiad (defnyddwyr cofrestredig yn unig)",
+       "rcfilters-filter-patrolled-label": "Wedi derbyn patrol",
+       "rcfilters-filter-patrolled-description": "Marciwyd y golygiadau fel rhai sydd wedi derbyn patrol.",
+       "rcfilters-filter-unpatrolled-description": "Ni farciwyd y golygiadau fel rhai sydd wedi derbyn patrol.",
        "rcnotefrom": "Isod rhestrir pob newid er <strong>$3, $4</strong> (ymddengys <strong>$1</strong> ohonynt).",
        "rclistfrom": "Dangos newidiadau newydd, gan ddechrau ers $3 $2",
        "rcshowhideminor": "$1 golygiadau bychain",
        "rcshowhidecategorization": "Categoreiddio tudalen $1",
        "rcshowhidecategorization-show": "Dangos",
        "rcshowhidecategorization-hide": "Cuddio",
-       "rclinks": "Dangos y $1 newid diweddaraf yn ystod y(r) $2 diwrnod diwethaf<br />$3",
+       "rclinks": "Dangos y $1 newid diweddaraf yn ystod y(r) $2 diwrnod diwethaf",
        "diff": "gwahan",
        "hist": "hanes",
        "hide": "Cuddier",
        "upload-copy-upload-invalid-domain": "Ni ellir uwchlwytho ffeiliau o'r parth hwn.",
        "upload-dialog-title": "Uwchlwytho ffeil",
        "upload-dialog-button-cancel": "Canslo",
+       "upload-dialog-button-back": "Ewch nôl",
        "upload-dialog-button-done": "Wedi cwbwlhau",
        "upload-dialog-button-save": "Wedi ei gadw",
        "upload-dialog-button-upload": "Uwchlwytho",
        "uploadstash-badtoken": "Ni lwyddodd y weithred. Efallai oherwydd bod eich cymwysterau golygu wedi dod i ben. Ceisiwch eto.",
        "uploadstash-errclear": "Ni lwyddwyd i glirio'r ffeiliau.",
        "uploadstash-refresh": "Adnewyddu rhestr y ffeiliau",
+       "uploadstash-thumbnail": "gweld y ciplun",
        "invalid-chunk-offset": "Atred annilys i'r talpiau",
        "img-auth-accessdenied": "Ni chaniatawyd mynediad",
        "img-auth-nopathinfo": "PATH_INFO yn eisiau.\nNid yw'ch gweinydd wedi ei osod i fedru pasio'r wybodaeth hon.\nEfallai ei fod wedi ei seilio ar CGI, ac heb fod yn gallu cynnal img_auth.\nGweler https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "apisandbox-helpurls": "Dolennau cymorth",
        "apisandbox-examples": "Engreifftiau",
        "apisandbox-results": "Canlyniadau",
+       "apisandbox-continue": "Parhau",
+       "apisandbox-continue-clear": "Clirio",
+       "apisandbox-multivalue-all-namespaces": "$1 (Pob ''namespace'')",
+       "apisandbox-multivalue-all-values": "$1 (Pob gwerth)",
        "booksources": "Ffynonellau llyfrau",
        "booksources-search-legend": "Chwilier am lyfrau",
        "booksources-search": "Chwilio",
        "undeleteviewlink": "gweld",
        "undeleteinvert": "Gwrthdroi'r dewis",
        "undeletecomment": "Rheswm:",
-       "undeletedrevisions": "wedi adfer $1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}}",
-       "undeletedrevisions-files": "Adferwyd $1 {{PLURAL:$1|fersiwn|fersiwn|fersiwn|fersiwn|fersiwn|fersiwn}} a $2 {{PLURAL:$2|ffeil|ffeil|ffeil|ffeil|ffeil|ffeil}}",
-       "undeletedfiles": "Adferwyd $1 {{PLURAL:$1|ffeil|ffeil|ffeil|ffeil|ffeil|ffeil}}",
        "cannotundelete": "Mae'r cais i ddad-ddileu wedi methu:\n$1",
        "undeletedpage": "'''Adferwyd $1'''\n\nCeir cofnod o'r tudalennau a ddilëwyd neu a adferwyd yn ddiweddar ar y [[Special:Log/delete|lòg ddileuon]].",
        "undelete-header": "Ewch i'r [[Special:Log/delete|lòg ddileuon]] i weld tudalennau a ddilëwyd yn ddiweddar.",
        "confirm-watch-top": "Ychwaneger y dudalen hon at eich rhestr wylio?",
        "confirm-unwatch-button": "Iawn",
        "confirm-unwatch-top": "Tynner y dudalen hon oddi ar eich rhestr wylio?",
+       "confirm-rollback-top": "Dadwneud golygiadau'r ddalen hon?",
        "quotation-marks": "'$1'",
        "imgmultipageprev": "← i'r dudalen gynt",
        "imgmultipagenext": "i'r dudalen nesaf →",
        "watchlistedit-raw-done": "Diweddarwyd eich rhestr wylio.",
        "watchlistedit-raw-added": "Ychwanegwyd {{PLURAL:$1|1 teitl|$1 teitl|$1 deitl|$1 theitl|$1 theitl|$1 o deitlau}}:",
        "watchlistedit-raw-removed": "Tynnwyd {{PLURAL:$1|1 teitl|$1 teitl|$1 deitl|$1 theitl|$1 theitl|$1 o deitlau}}:",
-       "watchlistedit-clear-title": "Cliriwyd y rhestr wylio",
+       "watchlistedit-clear-title": "Clirio'r rhestr wylio",
        "watchlistedit-clear-legend": "Clirier y rhestr wylio",
        "watchlistedit-clear-explain": "Bydd holl deitlau eich rhestr wylio'n cael eu tynnu oddi yno",
        "watchlistedit-clear-titles": "Teitlau:",
        "watchlisttools-edit": "Gweld a golygu'r rhestr wylio",
        "watchlisttools-raw": "Golygu'r rhestr wylio syml",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|sgwrs]])",
+       "timezone-local": "Lleol",
        "duplicate-defaultsort": "Rhybudd: Mae'r allwedd trefnu diofyn \"$2\" yn gwrthwneud yr allwedd trefnu diofyn blaenorol \"$1\".",
        "duplicate-displaytitle": "<strong>Gofal:</strong> Mae arddangos \"$2\" yn clirio'r arddangosiadau cynharach \"$1\".",
        "invalid-indicator-name": "<strong>Gan bwyll:</strong> Ni ddylid gadael y man nodi statws  <code>name</code> yn wag.",
        "logentry-upload-overwrite": "Mae $1 {{GENDER:$2|wedi uwchlwytho}} fersiwn newydd o $3",
        "logentry-upload-revert": "Mae $1 {{GENDER:$2|wedi uwchlwytho}} $3",
        "rightsnone": "(dim)",
-       "revdelete-summary": "crynodeb golygu",
        "feedback-adding": "Wrthi'n ychwanegu adborth i'r dudalen...",
        "feedback-bugcheck": "Iawn! Gwnewch yn siwr yn gyntaf nag ydy hwn yn un o'r [$1 bygiau hysbys].",
        "feedback-bugnew": "Edrychais ar y bygiau hysbys. Mae byg newydd gennyf i'w adrodd",
index 351ac32..07040d7 100644 (file)
@@ -59,7 +59,9 @@
                        "Jens Jensen",
                        "Nemo bis",
                        "Anders Feder",
-                       "Jhertel"
+                       "Jhertel",
+                       "IBDJ",
+                       "SimmeD"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
        "tog-newpageshidepatrolled": "Skjul patruljerede sider på listen over nye sider",
        "tog-hidecategorization": "Skjul kategorisering af sider",
        "tog-extendwatchlist": "Udvid overvågningslisten til at vise alle ændringer og ikke kun den nyeste",
-       "tog-usenewrc": "Gruppér ændringer per side i listen over seneste ændringer og i overvågningslisten",
+       "tog-usenewrc": "Gruppér ændringer efter side i listen over seneste ændringer og i overvågningslisten",
        "tog-numberheadings": "Automatisk nummerering af overskrifter",
        "tog-showtoolbar": "Vis værktøjslinje til redigering",
        "tog-editondblclick": "Redigér sider med dobbeltklik",
        "tog-editsectiononrightclick": "Redigér afsnit ved at højreklikke på deres titler",
-       "tog-watchcreations": "Tilføj sider, jeg opretter, og filer, jeg lægger op, til min overvågningsliste",
-       "tog-watchdefault": "Tilføj sider og filer, jeg redigerer, til min overvågningsliste",
-       "tog-watchmoves": "Tilføj sider og filer, jeg flytter, til min overvågningsliste",
-       "tog-watchdeletion": "Tilføj sider og filer, jeg sletter, til min overvågningsliste",
-       "tog-watchuploads": "Tilføj nye filer jeg uploader til min overvågningsliste",
-       "tog-watchrollback": "Tilføj sider, hvor jeg har udført en tilbagerulning til min overvågningsliste",
+       "tog-watchcreations": "Føj sider, jeg opretter, og filer, jeg lægger op, til min overvågningsliste",
+       "tog-watchdefault": "Føj sider og filer, jeg redigerer, til min overvågningsliste",
+       "tog-watchmoves": "Føj sider og filer, jeg flytter, til min overvågningsliste",
+       "tog-watchdeletion": "Føj sider og filer, jeg sletter, til min overvågningsliste",
+       "tog-watchuploads": "Føj nye filer, jeg uploader, til min overvågningsliste",
+       "tog-watchrollback": "Føj sider, hvor jeg har udført en tilbagerulning, til min overvågningsliste",
        "tog-minordefault": "Markér som standard alle redigeringer som mindre",
        "tog-previewontop": "Vis forhåndsvisning over redigeringsboksen",
        "tog-previewonfirst": "Vis forhåndsvisning ved første redigering",
        "tog-enotifrevealaddr": "Vis min e-mailadresse i e-mails med besked om ændringer",
        "tog-shownumberswatching": "Vis antal brugere, der overvåger",
        "tog-oldsig": "Din nuværende signatur:",
-       "tog-fancysig": "Behandl signatur som wikitekst uden automatisk henvisning",
+       "tog-fancysig": "Behandl signatur som wikitekst (uden automatisk henvisning)",
        "tog-uselivepreview": "Benyt løbende forhåndsvisning",
-       "tog-forceeditsummary": "Advar mig hvis jeg ikke udfylder beskrivelsesfeltet",
+       "tog-forceeditsummary": "Advar mig, hvis jeg ikke udfylder beskrivelsesfeltet",
        "tog-watchlisthideown": "Skjul egne ændringer i overvågningslisten",
        "tog-watchlisthidebots": "Skjul ændringer fra botter i overvågningslisten",
        "tog-watchlisthideminor": "Skjul mindre ændringer i overvågningslisten",
        "tog-watchlisthideliu": "Skjul indloggede brugeres redigeringer i overvågningslisten",
-       "tog-watchlistreloadautomatically": "Opdater overvågningslisten automatisk, når et filter er ændret (JavaScript påkrævet)",
+       "tog-watchlistreloadautomatically": "Opdater overvågningslisten automatisk, når et filter ændres (kræver JavaScript)",
        "tog-watchlisthideanons": "Skjul anonyme brugeres redigeringer i overvågningslisten",
-       "tog-watchlisthidepatrolled": "Skjul patruljerede ændringer fra overvågningslisten",
+       "tog-watchlisthidepatrolled": "Skjul patruljerede ændringer i overvågningslisten",
        "tog-watchlisthidecategorization": "Skjul kategorisering af sider",
-       "tog-ccmeonemails": "Send mig kopier af e-mails som jeg sender til andre brugere",
+       "tog-ccmeonemails": "Send mig kopier af e-mails jeg sender til andre brugere",
        "tog-diffonly": "Vis ikke sideindhold neden under versionssammenligninger",
        "tog-showhiddencats": "Vis skjulte kategorier",
-       "tog-norollbackdiff": "Vis ikke forskel efter tilbagerulning",
+       "tog-norollbackdiff": "Vis ikke forskel efter udførelse af en tilbagerulning",
        "tog-useeditwarning": "Advar mig, hvis jeg forlader en redigeringsside med ændringer, der ikke er gemt.",
-       "tog-prefershttps": "Brug altid en sikker forbindelse, når du er logget ind",
+       "tog-prefershttps": "Brug altid en sikker forbindelse, når jeg er logget ind",
        "underline-always": "Altid",
        "underline-never": "Aldrig",
-       "underline-default": "Brug browserens indstilling eller standarden for det valgte udseende",
+       "underline-default": "Standard for browseren eller udseendet",
        "editfont-style": "Skriftstil ved redigering:",
        "editfont-default": "Brug browserens indstilling",
        "editfont-monospace": "Fastbreddeskrift",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategorier}}",
        "category_header": "Sider i kategorien \"$1\"",
        "subcategories": "Underkategorier",
-       "category-media-header": "Medier i kategorien „$1“",
-       "category-empty": "''Denne kategori indeholder for øjeblikket hverken sider eller medie-filer.''",
+       "category-media-header": "Medier i kategorien \"$1\"",
+       "category-empty": "<em>Denne kategori indeholder for øjeblikket hverken sider eller medie-filer.</em>",
        "hidden-categories": "{{PLURAL:$1|Skjult kategori|Skjulte kategorier}}",
        "hidden-category-category": "Skjulte kategorier",
-       "category-subcat-count": "{{PLURAL:$2|Denne kategori har en underkategori.|Denne kategori indeholder nedenstående {{PLURAL:$1|underkategori|$1 underkategorier}}, af i alt $2.}}",
-       "category-subcat-count-limited": "Denne kategori indeholder {{PLURAL:$1|underkategori|$1 underkategorier}}.",
-       "category-article-count": "Denne kategori indeholder {{PLURAL:$2|kun den nedenstående side|{{PLURAL:$1|den nedenstående side|de nedenstående $1 sider}} af i alt $2.}}",
-       "category-article-count-limited": "Kategorien indeholder {{PLURAL:$1|den nedenstående side|de nedenstående $1 sider}}.",
-       "category-file-count": "Denne kategori indeholder {{PLURAL:$2|kun den nedenstående fil.|{{PLURAL:$1|den nedenstående fil|de nedenstående $1 filer}} af i alt $2.}}",
-       "category-file-count-limited": "Kategorien indeholder {{PLURAL:$1|den nedenstående fil|de nedenstående $1 filer}}.",
+       "category-subcat-count": "{{PLURAL:$2|Denne kategori har kun den nedenstående underkategori.|Denne kategori har nedenstående {{PLURAL:$1|underkategori|$1 underkategorier}}, af i alt $2.}}",
+       "category-subcat-count-limited": "Denne kategori har nedenstående {{PLURAL:$1|underkategori|$1 underkategorier}}.",
+       "category-article-count": "{{PLURAL:$2|Denne kategori indeholder kun den nedenstående side.|{{PLURAL:$1|Den nedenstående side|De nedenstående $1 sider}} er i denne kategori, ud af i alt $2.}}",
+       "category-article-count-limited": "{{PLURAL:$1|Den nedenstående side|De nedenstående $1 sider}} er i denne kategori.",
+       "category-file-count": "{{PLURAL:$2|Denne kategori indeholder kun den nedenstående fil.|{{PLURAL:$1|Den nedenstående fil|De nedenstående $1 filer}} er i denne kategori, ud af i alt $2.}}",
+       "category-file-count-limited": "{{PLURAL:$1|Den nedenstående fil|De nedenstående $1 filer}} er i denne kategori.",
        "listingcontinuesabbrev": "forts.",
        "index-category": "Indekserede sider",
        "noindex-category": "Ikke-indekserede sider",
        "broken-file-category": "Sider med brudte filhenvisninger",
        "about": "Om",
-       "article": "Artikel",
+       "article": "Indholdsside",
        "newwindow": "(åbner i et nyt vindue)",
        "cancel": "Afbryd",
        "moredotdotdot": "Mere...",
        "qbfind": "Søg",
        "qbbrowse": "Gennemse",
        "qbedit": "Redigér",
-       "qbpageoptions": "Indstillinger for side",
-       "qbmyoptions": "Mine indstillinger",
+       "qbpageoptions": "Denne side",
+       "qbmyoptions": "Mine sider",
        "faq": "OSS",
        "faqpage": "Project:OSS",
        "actions": "Handlinger",
        "tagline": "Fra {{SITENAME}}",
        "help": "Hjælp",
        "search": "Søg",
-       "search-ignored-headings": " #<!-- lad denne linje være præcis som den er --> <pre>\n# Overskrifter, der vil blive ignoreret af søgning.\n# Ændringer til dette træder i kraft så snart siden med overskriften er indekseret.\n# Du kan tvinge siden til genindeksering ved at lave en nul redigering.\n# syntaksen er som følger:\n#   * Alt fra en tegnet \"#\" til slutningen af linjen er en kommentar\n#   * Hver ikke-tomme linje er den nøjagtige titel der skal ignoreres, der skelnes også mellem store og små bogstaver\nReferencer\nEksterne henvisninger\nSe også\nKilder og henvisninger\nEksterne kilder/henvisninger\nKilder\n #</pre> <!-- lad denne linje være præcis som den er -->",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Overskrifter, der vil blive ignoreret af søgning.\n# Ændringer til dette træder i kraft så snart siden med overskriften er indekseret.\n# Du gennemtvinge genindeksering af siden ved at lave en tom redigering.\n# Syntaksen er som følger:\n#   * Alt fra et \"#\"-tegn til slutningen af linjen er en kommentar.\n#   * Hver ikke-tom linje er den nøjagtige titel der skal ignoreres; der skelnes mellem store og små bogstaver.\nReferencer\nEksterne henvisninger\nSe også\nKilder og henvisninger\nEksterne kilder/henvisninger\nKilder\n #<!-- leave this line exactly as it is --> <pre>",
        "searchbutton": "Søg",
        "go": "Gå til",
        "searcharticle": "Gå til",
        "delete": "Slet",
        "deletethispage": "Slet side",
        "undeletethispage": "Gendan denne side",
-       "undelete_short": "Fortryd sletning af {{PLURAL:$1|én version|$1 versioner}}",
-       "viewdeleted_short": "Vis {{PLURAL:$1|en slettet redigering|$1 slettede redigeringer}}",
+       "undelete_short": "Gendan {{PLURAL:$1|én redigering|$1 redigeringer}}",
+       "viewdeleted_short": "Vis {{PLURAL:$1|én slettet redigering|$1 slettede redigeringer}}",
        "protect": "Beskyt",
        "protect_change": "ændr",
        "protectthispage": "Beskyt side",
        "unprotect": "Ændr beskyttelse",
-       "unprotectthispage": "Ændre beskyttelsen af denne side",
+       "unprotectthispage": "Ændr beskyttelsen af denne side",
        "newpage": "Ny side",
        "talkpage": "Diskussion",
        "talkpagelinktext": "diskussion",
        "tool-link-userrights": "Ændre {{GENDER:$1|bruger}}grupper",
        "tool-link-userrights-readonly": "Se {{GENDER:$1|bruger}}grupper",
        "tool-link-emailuser": "Send e-mail til denne {{GENDER:$1|bruger}}",
-       "userpage": "Se brugersiden",
-       "projectpage": "Se projektsiden",
-       "imagepage": "Se filside",
-       "mediawikipage": "Vise indholdsside",
-       "templatepage": "Vise skabelonside",
-       "viewhelppage": "Vise hjælpeside",
-       "categorypage": "Vise kategoriside",
-       "viewtalkpage": "Se diskussion",
-       "otherlanguages": "Andre sprog",
+       "userpage": "Vis brugerside",
+       "projectpage": "Vis projektside",
+       "imagepage": "Vis filside",
+       "mediawikipage": "Vis beskedside",
+       "templatepage": "Vis skabelonside",
+       "viewhelppage": "Vis hjælpeside",
+       "categorypage": "Vis kategoriside",
+       "viewtalkpage": "Vis diskussion",
+       "otherlanguages": "På andre sprog",
        "redirectedfrom": "(Omdirigeret fra $1)",
        "redirectpagesub": "Omdirigeringsside",
        "redirectto": "Omdiriger til:",
-       "lastmodifiedat": "Denne side blev senest ændret $1 kl. $2.",
-       "viewcount": "Siden er vist {{PLURAL:$1|en gang|$1 gange}}.",
+       "lastmodifiedat": "Denne side blev senest redigeret $1 kl. $2.",
+       "viewcount": "Siden er vist {{PLURAL:$1|én gang|$1 gange}}.",
        "protectedpage": "Beskyttet side",
        "jumpto": "Skift til:",
        "jumptonavigation": "navigering",
        "jumptosearch": "søgning",
-       "view-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent et øjeblik, før du prøver at besøge denne side igen.\n\n$1",
-       "generic-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent et øjeblik før du prøver at besøge denne side igen.",
-       "pool-timeout": "Timeout mens man venter på låsningen",
-       "pool-queuefull": "Pool køen er fuld",
+       "view-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent venligst lidt, før du igen prøver at besøge denne side.\n\n$1",
+       "generic-pool-error": "Beklager, men serverne er i øjeblikket overbelastede.\nFor mange brugere prøver at se denne side.\nVent venligst lidt, før du igen prøver at besøge denne side.",
+       "pool-timeout": "Timeout mens der blev ventet på låsen",
+       "pool-queuefull": "Puljekøen er fuld",
        "pool-errorunknown": "Ukendt fejl",
-       "pool-servererror": "Pool-counter servicen er ikke til rådighed ($1).",
+       "pool-servererror": "Puljetæller-tjenesten er ikke til rådighed ($1).",
        "poolcounter-usage-error": "Brugsfejl: $1",
        "aboutsite": "Om {{SITENAME}}",
        "aboutpage": "Project:Om",
        "privacy": "Behandling af personlige oplysninger",
        "privacypage": "Project:Behandling af personlige oplysninger",
        "badaccess": "Manglende rettigheder",
-       "badaccess-group0": "Du har ikke de nødvendige rettigheder til denne handling.",
-       "badaccess-groups": "Denne handling kan kun udføres af brugere som tilhører {{PLURAL:$2|gruppen|en af grupperne:}} $1.",
+       "badaccess-group0": "Du har ikke de nødvendige rettigheder til at udføre den handling, du har anmodet om.",
+       "badaccess-groups": "Denne handling kan kun udføres af brugere i {{PLURAL:$2|gruppen|disse grupper:}} $1.",
        "versionrequired": "Kræver version $1 af MediaWiki",
-       "versionrequiredtext": "Version $1 af MediaWiki er påkrævet, for at bruge denne side. Se [[Special:Version|Versionssiden]]",
+       "versionrequiredtext": "Version $1 af MediaWiki er nødvendig for at bruge denne side. Se [[Special:Version|Versionssiden]]",
        "ok": "OK",
        "retrievedfrom": "Hentet fra \"$1\"",
        "youhavenewmessages": "Du har $1 ($2).",
-       "youhavenewmessagesfromusers": "Du har $1 fra {{PLURAL:$3|en anden bruger| $3 brugere}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Du har}} $1 fra {{PLURAL:$3|en anden bruger|$3 brugere}} ($2).",
        "youhavenewmessagesmanyusers": "Du har $1 fra mange brugere ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|en ny besked|999=nye beskeder}}",
        "newmessagesdifflinkplural": "seneste {{PLURAL:$1|ændring|999=ændringer}}",
        "confirmable-confirm": "Er {{GENDER:$1|du}} sikker?",
        "confirmable-yes": "Ja",
        "confirmable-no": "Nej",
-       "thisisdeleted": "Se eller gendan $1?",
+       "thisisdeleted": "Vis eller gendan $1?",
        "viewdeleted": "Vis $1?",
-       "restorelink": "{{PLURAL:$1|en slettet ændring|$1 slettede ændringer}}",
+       "restorelink": "{{PLURAL:$1|én slettet redigering|$1 slettede redigeringer}}",
        "feedlinks": "Feed:",
        "feed-invalid": "Ugyldig abonnementstype.",
        "feed-unavailable": "Der er ingen syndikeringsfeeds tilgængelige",
        "site-atom-feed": "$1 Atom-feed",
        "page-rss-feed": "\"$1\" RSS-feed",
        "page-atom-feed": "\"$1\" Atom-feed",
-       "red-link-title": "$1 (siden er ikke skrevet endnu)",
+       "red-link-title": "$1 (siden findes ikke)",
        "sort-descending": "Sorter faldende",
        "sort-ascending": "Sorter stigende",
        "nstab-main": "Side",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Forside",
        "nosuchaction": "Funktionen findes ikke",
-       "nosuchactiontext": "Handlingen som er angivet i URL'en er ugyldig.\nDu kan have skrevet URL'en forkert, eller fulgt en ukorrekt henvisning.\nDet kan også skyldes en fejl i programmellet som bruges af {{SITENAME}}.",
+       "nosuchactiontext": "Handlingen som er angivet i URL'en er ugyldig.\nDu har måske skrevet URL'en forkert eller fulgt en ukorrekt henvisning.\nDet kan også skyldes en fejl i programmellet som bruges af {{SITENAME}}.",
        "nosuchspecialpage": "En sådan specialside findes ikke",
-       "nospecialpagetext": "<strong>Du har bedt om en specialside, der ikke kan genkendes af MediaWiki-softwaren.</strong>\nEn liste over gyldige specialsider findes på [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Du har bedt om en specialside, som ikke findes.</strong>\n\nEn liste over gyldige specialsider kan findes på [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Fejl",
        "databaseerror": "Databasefejl",
-       "databaseerror-text": "Der opstod fejl i en forespørgsel til databasen.\nDette kan indikere en fejl i softwaren.",
-       "databaseerror-textcl": "Der opstod fejl i en forespørgsel til databasen.",
+       "databaseerror-text": "Der opstod en fejl i en forespørgsel til databasen.\nDette kan skyldes en programmeringsfejl i softwaren.",
+       "databaseerror-textcl": "Der opstod en fejl i en forespørgsel til databasen.",
        "databaseerror-query": "Forespørgsel: $1",
        "databaseerror-function": "Funktion: $1",
        "databaseerror-error": "Fejl: $1",
-       "transaction-duration-limit-exceeded": "For at undgå høje replikationsforsinkelser blev denne transaktion afbrudt fordi tiden det tog at lagre ($1) oversteg maksimumsgrænsen på $2 {{PLURAL:$2|sekund|sekunder}}.\nHvis du er ved at ændre mange emner på en gang, så prøv at udføre flere mindre operationer i stedet.",
-       "laggedslavemode": "'''Bemærk:''' Den viste side indeholder muligvis ikke de nyeste ændringer.",
-       "readonly": "Databasen er skrivebeskyttet",
-       "enterlockreason": "Skriv en begrundelse for skrivebeskyttelsen, med samt en vurdering af, hvornår skrivebeskyttelsen ophæves igen",
-       "readonlytext": "Databasen er i øjeblikket låst for nye poster og andre ændringer, formentlig pga. rutinemæssig databasevedligeholdelse, hvorefter den vil være tilbage til normalen.\n\nSystemadministratoren som låste den, gav denne forklaring: $1",
-       "missing-article": "Databasen burde indeholde siden \"$1\" $2, men det gør den ikke.\n\nDen sandsynlige årsag er at du har fulgt et forældet link til en forskel eller en gammel version af en side der er blevet slettet.\n\nHvis det ikke er tilfældet, har du muligvis fundet en software-fejl.\nGør venligst en [[Special:ListUsers/sysop|administrator]] opmærksom på det, og husk at fortælle hvilken URL du har fulgt.",
+       "transaction-duration-limit-exceeded": "For at undgå høj replikationsforsinkelse blev denne transaktion afbrudt, fordi tiden det tog at lagre ($1) oversteg grænsen på $2 {{PLURAL:$2|sekund|sekunder}}.\nHvis du er ved at ændre mange emner på en gang, så prøv at udføre flere mindre operationer i stedet.",
+       "laggedslavemode": "<strong>Advarsel:</strong> Siden indeholder muligvis ikke de nyeste ændringer.",
+       "readonly": "Databasen er låst",
+       "enterlockreason": "Skriv en begrundelse for låsningen, inklusive en vurdering af hvornår den vil blive ophævet igen",
+       "readonlytext": "Databasen er i øjeblikket låst for nye poster og andre ændringer, formentlig pga. rutinemæssig databasevedligeholdelse, hvorefter den vil være tilbage til normalen.\n\nDen systemadministrator, som låste den, gav denne forklaring: $1",
+       "missing-article": "Databasen burde indeholde siden \"$1\" $2, men det gør den ikke.\n\nDette skyldes normalt at du har fulgt et forældet link til en forskel eller til en gammel version af en side der er blevet slettet.\n\nHvis det ikke er tilfældet, har du muligvis fundet en programmeringsfejl i softwaren.\nGør venligst en [[Special:ListUsers/sysop|administrator]] opmærksom på det, og sørg for at fortælle vedkommende hvilken URL, du har fulgt.",
        "missingarticle-rev": "(versionsnummer: $1)",
-       "missingarticle-diff": "(Forskel: $1, $2)",
-       "readonly_lag": "Databasen er automatisk blevet låst mens slave database serverne synkronisere med master databasen",
-       "nonwrite-api-promise-error": "HTTP-headeren 'Promise-Non-Write-API-Action' blev sendt, men forespørgslen var til et API skrivemodul.",
+       "missingarticle-diff": "(forskel: $1, $2)",
+       "readonly_lag": "Databasen er automatisk blevet låst mens slavedatabaseserverne synkroniserer med masterdatabasen",
+       "nonwrite-api-promise-error": "HTTP-headeren 'Promise-Non-Write-API-Action' blev sendt, men forespørgslen var til et API-skrivemodul.",
        "internalerror": "Intern fejl",
        "internalerror_info": "Intern fejl: $1",
-       "internalerror-fatal-exception": "Alvorlig undtagelse af typen \"$1\"",
+       "internalerror-fatal-exception": "Fatal undtagelse af typen \"$1\"",
        "filecopyerror": "Kunne ikke kopiere filen \"$1\" til \"$2\".",
        "filerenameerror": "Kunne ikke omdøbe filen \"$1\" til \"$2\".",
        "filedeleteerror": "Kunne ikke slette filen \"$1\".",
        "directorycreateerror": "Kunne ikke oprette mappen \"$1\".",
-       "directoryreadonlyerror": "Folderen \"$1\" er skrivebeskyttet.",
-       "directorynotreadableerror": "Folderen \"$1\" er ikke læsbar.",
+       "directoryreadonlyerror": "Mappen \"$1\" er skrivebeskyttet.",
+       "directorynotreadableerror": "Mappen \"$1\" er ikke læsbar.",
        "filenotfound": "Kunne ikke finde filen \"$1\".",
        "unexpected": "Uventet værdi: \"$1\"=\"$2\".",
-       "formerror": "Fejl: Kunne ikke afsende formular",
+       "formerror": "Fejl: Kunne ikke afsende formular.",
        "badarticleerror": "Denne funktion kan ikke udføres på denne side.",
        "cannotdelete": "Kunne ikke slette siden eller filen \"$1\".\nDen kan være blevet slettet af en anden.",
        "cannotdelete-title": "Kan ikke slette siden \"$1\"",
-       "delete-hook-aborted": "Sletningen blev afbrudt af en programfunktion.\nDer var ikke nogen forklaring.",
+       "delete-hook-aborted": "Sletningen blev afbrudt af en programfunktion.\nDer blev ikke givet nogen forklaring.",
        "no-null-revision": "Kunne ikke oprette nye tom revision for side \"$1\"",
        "badtitle": "Ugyldig titel",
        "badtitletext": "Den ønskede sides titel var ikke tilladt, tom eller siden er forkert henvist fra {{SITENAME}} på et andet sprog.\nDen kan indeholde et eller flere tegn, som ikke må anvendes i titler.",
        "login": "Log på",
        "login-security": "Bekræft din identitet",
        "nav-login-createaccount": "Opret en konto eller log på",
-       "userlogin": "Opret en konto eller log på",
-       "userloginnocreate": "Log på",
        "logout": "Log af",
        "userlogout": "Log af",
        "notloggedin": "Ikke logget på",
        "userlogin-noaccount": "Har du ikke en konto?",
        "userlogin-joinproject": "Slut dig til {{SITENAME}}",
-       "nologin": "Har du ingen konto? $1.",
-       "nologinlink": "Opret en ny brugerkonto",
        "createaccount": "Opret en ny brugerkonto",
-       "gotaccount": "Har du allerede en konto? $1.",
-       "gotaccountlink": "Log på",
-       "userlogin-resetlink": "Har du glemt dine login oplysninger?",
        "userlogin-resetpassword-link": "Glemt din adgangskode?",
        "userlogin-helplink2": "Hjælp med at logge på",
        "userlogin-loggedin": "Du er allerede logget på som {{GENDER:$1|$1}}.\nBrug formularen nedenfor til at logge på som en anden bruger.",
        "createaccountmail": "Brug en midlertidig tilfældig adgangskode og send den til den angivne e-mailadresse",
        "createaccountmail-help": "Kan bruges til at oprette konto til en anden person uden at lære deres adgangskode.",
        "createacct-realname": "Dit rigtige navn (valgfrit)",
-       "createaccountreason": "Begrundelse:",
        "createacct-reason": "Årsag",
        "createacct-reason-ph": "Hvorfor du vil oprette endnu en konto",
        "createacct-reason-help": "Besked vist i kontooprettelsesloggen.",
        "noname": "Du har ikke angivet et gyldigt brugernavn.",
        "loginsuccesstitle": "Logget ind",
        "loginsuccess": "'''Du er nu logget på {{SITENAME}} som \"$1\".'''",
-       "nosuchuser": "Der er ingen bruger med navnet \"$1\".\nDer skelnes mellem store og bogstaver i brugernavne.\nKontrollér stavemåden, eller [[Special:CreateAccount|opret en ny konto]].",
+       "nosuchuser": "Der er ingen bruger med navnet \"$1\".\nDer skelnes mellem store og små bogstaver i brugernavne.\nKontrollér stavningen, eller [[Special:CreateAccount|opret en ny konto]].",
        "nosuchusershort": "Der er ingen bruger ved navn \"$1\". Tjek din stavning.",
        "nouserspecified": "Angiv venligst et brugernavn.",
        "login-userblocked": "Denne bruger er blokeret. Det er ikke tilladt at logge på.",
        "noemail": "Der er ikke oplyst en e-mailadresse for bruger \"$1\".",
        "noemailcreate": "Du skal angive en gyldig e-mailadresse",
        "passwordsent": "En ny adgangskode er sendt til e-mailadressen, som er registreret for \"$1\".\nDu bør logge på og ændre din adgangskode straks efter du har modtaget e-mailen.",
-       "blocked-mailpassword": "Din IP-adresse er blokeret fra at redigere sider. For at forhindre misbrug, er det heller ikke muligt, at bestille en ny adgangskode.",
+       "blocked-mailpassword": "Din IP-adresse er blokeret fra at redigere sider. For at forhindre misbrug er det heller ikke muligt at bestille en ny adgangskode fra denne IP-adresse.",
        "eauthentsent": "En e-mailbekræftelse er sendt til den angivne e-mailadresse.\n\nFør flere e-mails bliver sendt til kontoen, skal du følge instruktionerne i e-mailen, for at bekræfte at kontoen rent faktisk er din.",
        "throttled-mailpassword": "Indenfor {{PLURAL:$1|den sidste time|de sidste $1 timer}} er der allerede sendt en ny adgangskode. For at forhindre misbrug af funktionen, kan der kun bestilles en ny adgangskode én gang for hver {{PLURAL:$1|time|$1 timer}}.",
        "mailerror": "Fejl ved afsendelse af e-mail: $1",
-       "acct_creation_throttle_hit": "Besøgende med samme IP-adresse som dig har oprettet {{PLURAL:$1|en konto|$1 kontoer}} det sidste døgn, og det er ikke tilladt at oprette flere.\nDerfor kan besøgende ikke oprette flere kontoer fra denne IP-adresse i øjeblikket.",
+       "acct_creation_throttle_hit": "Besøgende med samme IP-adresse som dig har oprettet {{PLURAL:$1|1 konto|$1 kontoer}} inden for den/det/de seneste $2, hvilket er det maksimalt tilladte inden for denne tidsperiode.\nDerfor kan besøgende, som bruger denne IP-adresse, ikke oprette flere kontoer fra denne IP-adresse for øjeblikket.",
        "emailauthenticated": "Din e-mailadresse blev bekræftet den $2 kl. $3.",
        "emailnotauthenticated": "Din e-mailadresse er endnu ikke bekræftet.\nIngen e-mail vil blive sendt for de følgende funktioner.",
        "noemailprefs": "Angiv en e-mailadresse, så følgende funktioner er til rådighed.",
        "createaccount-title": "Opret brugerkonto på {{SITENAME}}",
        "createaccount-text": "Nogen har oprettet en konto for din e-mailadresse på {{SITENAME}} ($4) med navnet \"$2\". Adgangskoden er \"$3\".\nDu opfordres til at logge på og ændre adgangskoden med det samme.\n\nDu kan ignorere denne besked hvis kontoen blev oprettet ved en fejl.",
        "login-throttled": "Du har forsøgt at logge på for mange gange.\nVent venligst $1, før du prøver igen.",
-       "login-abort-generic": "Det lykkedes dig ikke at logge på - afbrudt",
+       "login-abort-generic": "Det lykkedes ikke at logge dig på - Afbrudt",
        "login-migrated-generic": "Din konto er blevet globaliseret, og dit brugernavn eksisterer ikke længere på denne wiki.",
        "loginlanguagelabel": "Sprog: $1",
        "suspicious-userlogout": "Din anmodning om at logge af blev nægtet, fordi det ser ud som den blev sendt af en ødelagt browser eller caching proxy.",
        "createacct-another-realname-tip": "Angivelse af rigtigt navn er valgfrit.\nHvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit arbejde.",
        "pt-login": "Log på",
        "pt-login-button": "Log på",
+       "pt-login-continue-button": "Fortsæt login",
        "pt-createaccount": "Opret konto",
        "pt-userlogout": "Log af",
        "php-mail-error-unknown": "Ukendt fejl i PHP funktionen mail()",
        "newpassword": "Ny adgangskode:",
        "retypenew": "Gentag ny adgangskode:",
        "resetpass_submit": "Gem adgangskode og log på",
-       "changepassword-success": "Din adgangskode er nu ændret!",
+       "changepassword-success": "Din adgangskode er blevet ændret!",
        "changepassword-throttled": "Du har forsøgt at logge på for mange gange for nylig.\nVent venligst $1, før du prøver igen.",
        "botpasswords": "Bot adgangskoder",
        "botpasswords-summary": "<em>Bot adgangskoder</em> giver adgang til en brugerkonto via API'en, uden at bruge kontoens normale login-legitimationsoplysninger. Brugerrettighederne kan være begrænset, når du er logget på med et bot password,.\n\nHvis du ikke ved, hvorfor du måske ønsker at gøre dette, bør du nok ikke gøre det. Ingen bør nogensinde bede dig om at generere et af disse, og give det til dem.",
        "botpasswords-label-delete": "Slet",
        "botpasswords-label-resetpassword": "Nulstil adgangskode",
        "botpasswords-label-grants": "Tilgængelige bevillinger:",
+       "botpasswords-updated-title": "Bot kodeord opdateret",
+       "botpasswords-deleted-title": "Bot kodeord slettet",
        "resetpass_forbidden": "Adgangskoder kan ikke ændres",
+       "resetpass_forbidden-reason": "Adgangskoder kan ikke ændres: $1",
        "resetpass-no-info": "Du skal være logget på for at komme direkte til denne side.",
        "resetpass-submit-loggedin": "Skift adgangskode",
        "resetpass-submit-cancel": "Annuller",
-       "resetpass-wrong-oldpass": "Ugyldig midlertidig eller gældende adgangskode.\nDu har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlertidig kode.",
+       "resetpass-wrong-oldpass": "Ugyldig midlertidig eller gældende adgangskode.\nDu har muligvis allerede ændret din adgangskode eller bedt om en ny midlertidig kode.",
        "resetpass-recycled": "Vær venlig at ændre din adgangskode til noget andet end din nuværende adgangskode.",
        "resetpass-temp-emailed": "Du loggede på med en midlertidig kode tilsendt på e-mail.\nFor at afslutte indlogning skal du angive en ny adgangskode her:",
        "resetpass-temp-password": "Midlertidig adgangskode",
        "passwordreset-emailelement": "Brugernavn: \n$1\n\nMidlertidig adgangskode: \n$2",
        "passwordreset-emailsentemail": "Hvis denne e-mailadresse er knyttet til din konto, så vil en e-mail om nulstilling af adgangskoden blive sendt.",
        "passwordreset-emailsentusername": "Hvis der er en e-mailadresse forbundet med dette brugernavn, så vil en e-mail om nulstilling af adgangskoden blive sendt.",
+       "passwordreset-invalidemail": "Ugyldig e-mailadresse",
+       "passwordreset-nodata": "Hverken et brugernavn eller en e-mailadresse blev angivet",
        "changeemail": "Ændr eller fjern e-mailadresse",
        "changeemail-header": "Udfyld denne formular for at ændre din e-mailadresse. Hvis du gerne vil fjerne forbindelsen af en e-mailadresse fra din konto, så lad den nye e-mailadresse være blank, når du sender formularen.",
        "changeemail-no-info": "Du skal være logget på for at komme direkte til denne side.",
        "preview": "Forhåndsvisning",
        "showpreview": "Forhåndsvisning",
        "showdiff": "Vis ændringer",
-       "blankarticle": "<strong>Advarsel:</strong> Siden du opretter er tom.\nHvis du klikker på \"{{int:savearticle}}\" igen, vil siden blive oprettet uden indhold.",
+       "blankarticle": "<strong>Advarsel:</strong> Siden du opretter er tom.\nHvis du klikker på \"$1\" igen, vil siden blive oprettet uden indhold.",
        "anoneditwarning": "<strong>Advarsel:</strong> Du er ikke logget på. Din IP-adresse vil blive offentligt tilgængelig, hvis du foretager nogen ændringer. Hvis du <strong>[$1 logger på]</strong> eller <strong>[$2 opretter en konto]</strong> vil dine redigeringer blive tilskrevet dit brugernavn, og du vil få flere andre fordele.",
        "anonpreviewwarning": "''Du er ikke logget på. Hvis du gemmer, registreres din IP-adresse i versionshistorikken.''",
-       "missingsummary": "'''Bemærk:''' Du har ikke angivet en redigeringsbeskrivelse. Hvis du igen trykker på \"{{int:savearticle}}\", gemmes ændringerne uden en beskrivelse.",
-       "selfredirect": "<strong>Advarsel:</strong> Du er ved at omdirigere denne side til sig selv.\nDu kan have angivet det forkerte mål for omdirigeringen, eller du kan være ved at redigere den forkerte side.\nHvis du klikker på \"{{int:savearticle}}\" igen, vil omdirigeringen blive oprettet uanset dette.",
+       "missingsummary": "'''Bemærk:''' Du har ikke angivet en redigeringsbeskrivelse. Hvis du igen trykker på \"$1\", gemmes ændringerne uden en beskrivelse.",
+       "selfredirect": "<strong>Advarsel:</strong> Du er ved at omdirigere denne side til sig selv.\nDu kan have angivet det forkerte mål for omdirigeringen, eller du kan være ved at redigere den forkerte side.\nHvis du klikker på \"$1\" igen, vil omdirigeringen blive oprettet uanset dette.",
        "missingcommenttext": "Skriv venligst en kommentar nedenfor.",
-       "missingcommentheader": "<strong>Bemærk:</strong> Du har ikke angivet en overskrift/emne for denne kommentar. Hvis du trykker \"{{int:savearticle}}\" én gang til, gemmes dine ændringer uden overskrift/emne.",
-       "summary-preview": "Forhåndsvisning af beskrivelsen:",
+       "missingcommentheader": "<strong>Bemærk:</strong> Du har ikke angivet en overskrift/emne for denne kommentar. Hvis du trykker \"$1\" én gang til, gemmes dine ændringer uden overskrift/emne.",
+       "summary-preview": "Forhåndsvisning af sammenfatning:",
        "subject-preview": "Forhåndsvisning af emne/overskrift:",
        "previewerrortext": "Der opstod en fejl under forsøget på at lave en forhåndsvisning af dine ændringer.",
        "blockedtitle": "Du eller din IP-adresse er blokeret",
        "blockedtext": "'''Dit brugernavn eller din IP-adresse er blevet blokeret.'''\n\nBlokeringen er foretaget af $1.\nDen anførte grund er ''$2''.\n\nBlokeringen starter: $8\nBlokeringen udløber: $6\nBlokeringen er rettet mod: $7\n\nDu kan kontakte $1 eller en af de andre [[{{MediaWiki:Grouppage-sysop}}|administratorer]] for at diskutere blokeringen.\nDu kan ikke bruge funktionen 'e-mail til denne bruger' medmindre der er angivet en gyldig e-mailadresse i dine\n[[Special:Preferences|kontoindstillinger]], og du ikke er blevet blokeret fra at bruge den.\n\nDin nuværende IP-adresse er $3, og blokerings-id er #$5.\nAngiv venligst alle ovenstående detaljer ved henvendelser om blokeringen.",
        "autoblockedtext": "Din IP-adresse er blevet blokeret automatisk fordi den blev brugt af en anden bruger som er blevet blokeret af $1.\nBegrundelsen for det er:\n\n:''$2''\n\n* Blokeringsperiodens start: $8\n* Blokeringen udløber: $6\n* Blokeringen er ment for: $7\n\nDu kan kontakte $1 eller en af de andre [[{{MediaWiki:Grouppage-sysop}}|administratorer]] for at diskutere blokeringen.\n\nBemærk at du ikke kan bruge funktionen \"e-mail til denne bruger\" medmindre du har en gyldig e-mailadresse registreret i din [[Special:Preferences|brugerindstilling]], og du ikke er blevet blokeret fra at bruge den.\n\nDin nuværende IP-adresse er $3, og blokerings-id'et er #$5.\nAngiv venligst alle de ovenstående detaljer ved eventuelle henvendelser.",
+       "systemblockedtext": "Dit brugernavn eller din IP-adresse er automatisk blokeret af MediaWiki.\nBegrundelsen for det er:\n\n:<em>$2</em>\n\n* Blokeringsperiodens start: $8\n* Blokeringen udløber: $6\n* Blokeringen er ment for: $7\n\nDin nuværende IP-adresse er $3.\nAngiv venligst alle de ovenstående detaljer ved eventuelle henvendelser.",
        "blockednoreason": "ingen begrundelse givet",
        "whitelistedittext": "Du skal $1 for at kunne redigere sider.",
        "confirmedittext": "Du skal først bekræfte din e-mailadresse, før du kan redigere sider. Udfyld og bekræft din e-mailadresse i dine [[Special:Preferences|indstillinger]].",
        "editingsection": "Redigerer $1 (afsnit)",
        "editingcomment": "Redigerer $1 (nyt afsnit)",
        "editconflict": "Redigeringskonflikt: $1",
-       "explainconflict": "Nogen har ændret denne side, efter du startede på at redigere den.\nDen øverste tekstboks indeholder den nuværende tekst.\nDine ændringer er vist i den nederste tekstboks.\nDu er nødt til at sammenflette dine ændringer med den eksisterende tekst.\n'''Kun''' teksten i den øverste tekstboks vil blive gemt når du trykker \"{{int:savearticle}}\".",
+       "explainconflict": "Nogen har ændret denne side, efter du startede på at redigere den.\nDen øverste tekstboks indeholder den nuværende tekst.\nDine ændringer er vist i den nederste tekstboks.\nDu er nødt til at sammenflette dine ændringer med den eksisterende tekst.\n'''Kun''' teksten i den øverste tekstboks vil blive gemt når du trykker \"$1\".",
        "yourtext": "Din tekst",
        "storedversion": "Den gemte version",
        "nonunicodebrowser": "'''Advarsel: Din browser er ikke unicode-kompatibel, skift eller opdater din browser før du redigerer en artikel.'''",
        "page_first": "Starten",
        "page_last": "Enden",
        "histlegend": "Forklaring: (nuværende) = forskel til den nuværende\nversion, (forrige) = forskel til den forrige version, M = mindre ændring",
-       "history-fieldset-title": "Bladr i historikken efter dato",
+       "history-fieldset-title": "Søg efter versioner",
        "history-show-deleted": "Kun slettede",
        "histfirst": "ældste",
        "histlast": "nyeste",
        "revdelete-unsuppress": "Ophæv begrænsninger for gendannede versioner",
        "revdelete-log": "Begrundelse:",
        "revdelete-submit": "Udfør på {{PLURAL:$1|den udvalgte version|de udvalgte versioner}}",
-       "revdelete-success": "'''Versionsvisningen er ændret.'''",
+       "revdelete-success": "Versionssynligheden blev opdateret.",
        "revdelete-failure": "'''Kunne ikke ændre versionssynligheden:'''\n$1",
-       "logdelete-success": "'''Synlighed ændret med success.'''",
+       "logdelete-success": "Log-synligheden blev ændret.",
        "logdelete-failure": "'''Kunne ikke ændre logsynligheden.'''\n$1",
        "revdel-restore": "ændre synlighed",
        "pagehist": "Sidehistorik",
        "search-category": "(kategorien $1)",
        "search-file-match": "(svarer til filens indhold)",
        "search-suggest": "Mente du: $1",
-       "search-interwiki-caption": "Søsterprojekter",
+       "search-interwiki-caption": "Resultater fra søsterprojekter",
        "search-interwiki-default": "Resultater fra $1:",
        "search-interwiki-more": "(mere)",
        "search-interwiki-more-results": "flere resultater",
        "prefs-help-prefershttps": "Denne indstilling træder i kraft næste gang du logger på.",
        "prefswarning-warning": "Du har foretaget ændringer af dine indstillinger, som ikke er gemt endnu.\nHvis du forlader denne side uden at klikke \"$1\", vil dine indstillinger ikke blive opdateret.",
        "prefs-tabs-navigation-hint": "Tip: Du kan bruge venstre og højre piletasterne til at navigere mellem fanerne i fanelisten.",
-       "userrights": "Håndtering af brugerrettigheder",
+       "userrights": "Brugerrettigheder",
        "userrights-lookup-user": "Vælg en bruger",
        "userrights-user-editname": "Skriv et brugernavn:",
        "editusergroup": "Indlæs brugergrupper",
        "userrights-unchangeable-col": "Uredigerbare grupper",
        "userrights-expiry-current": "Udløber $1",
        "userrights-expiry-none": "Udløber ikke",
+       "userrights-expiry": "Udløber:",
+       "userrights-expiry-existing": "Nugældende udløbstid: $2 $3",
+       "userrights-expiry-othertime": "Anden tid:",
+       "userrights-expiry-options": "1 dag:1 day,1 uge:1 week,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year",
+       "userrights-invalid-expiry": "Udløbstiden for gruppen \"$1\" er ugyldig.",
+       "userrights-expiry-in-past": "Udløbstiden for gruppen \"$1\" er i fortiden.",
        "userrights-conflict": "Konflikt i ændringer af brugerrettigheder!\nVær venlig at gennemse og bekræft dine ændringer.",
        "group": "Gruppe:",
        "group-user": "Brugere",
        "group-all": "(alle)",
        "group-user-member": "{{GENDER:$1|bruger}}",
        "group-autoconfirmed-member": "{{GENDER:$1|registreret bruger}}",
-       "group-bot-member": "{{GENDER:$1|robot}}",
+       "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|bureaukrat}}",
        "group-suppress-member": "{{GENDER:$1|undertrykker}}",
        "right-editsemiprotected": "Rediger sider, der er beskyttet som \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Redigere indholdsmodellen for en side",
        "right-editinterface": "Ændre brugergrænsefladens tekster",
-       "right-editusercssjs": "Ændre andre brugeres JS og CSS filer",
        "right-editusercss": "Ændre andre brugeres CSS filer",
        "right-edituserjs": "Ændre andre brugeres JS filer",
        "right-editmyusercss": "Redigere dine egne CSS-filer",
        "action-writeapi": "bruge skrive-API'et",
        "action-delete": "slette denne side",
        "action-deleterevision": "slette siderevisioner",
+       "action-deletelogentry": "slet logposter",
        "action-deletedhistory": "se en sides slettede historik",
+       "action-deletedtext": "se slettet revisionstekst",
        "action-browsearchive": "søge i slettede sider",
        "action-undelete": "gendanne sider",
        "action-suppressrevision": "se og gendanne skjulte siderevisioner",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Vis",
        "rcfilters-activefilters": "Aktive filtre",
+       "rcfilters-savedqueries-defaultlabel": "Gemte filtre",
+       "rcfilters-savedqueries-rename": "Omdøb",
+       "rcfilters-savedqueries-setdefault": "Vælg som grundindstilling",
+       "rcfilters-savedqueries-unsetdefault": "Fravælg som grundindstilling",
+       "rcfilters-savedqueries-remove": "Fjern",
+       "rcfilters-savedqueries-new-name-label": "Navn",
+       "rcfilters-savedqueries-cancel-label": "Annullér",
+       "rcfilters-restore-default-filters": "Gendan standardfiltre",
+       "rcfilters-clear-all-filters": "Ryd alle filtre",
+       "rcfilters-search-placeholder": "Filtrer seneste ændringer (gennemse eller begynd at taste)",
        "rcfilters-invalid-filter": "Ugyldigt filter",
+       "rcfilters-empty-filter": "Ingen aktive filtre. All bidrag vises.",
        "rcfilters-filterlist-title": "Filtre",
-       "rcfilters-filter-userExpLevel-experienced-label": "Erfarne brugere",
+       "rcfilters-filterlist-whatsthis": "Hvad er dette?",
+       "rcfilters-highlightbutton-title": "Fremhæv resultater",
+       "rcfilters-highlightmenu-title": "Vælg en farve",
+       "rcfilters-highlightmenu-help": "Vælg en farve for at fremhæve denne egenskab",
+       "rcfilters-filterlist-noresults": "Ingen filtre fundet",
+       "rcfilters-filtergroup-registration": "Brugerregistrering",
+       "rcfilters-filter-registered-label": "Registreret",
+       "rcfilters-filter-registered-description": "Indloggede brugere",
+       "rcfilters-filter-unregistered-label": "Uregistreret",
+       "rcfilters-filter-unregistered-description": "Redaktører, der ikke er logget ind.",
+       "rcfilters-filter-editsbyself-label": "Ændringer af dig",
+       "rcfilters-filter-editsbyself-description": "Dine egne bidrag.",
+       "rcfilters-filter-editsbyother-label": "Ændringer af andre",
+       "rcfilters-filter-editsbyother-description": "Alle ændringer undtagen din egen.",
+       "rcfilters-filtergroup-userExpLevel": "Erfaringsniveau (kun for registrerede brugere)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nybegyndere",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Færre end 10 redigeringer og 4 dages aktivitet",
+       "rcfilters-filter-user-experience-level-learner-description": "Mere erfaring end \"nybegyndere\" men mindre end \"erfarne brugere\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Erfarne brugere",
+       "rcfilters-filter-user-experience-level-experienced-description": "Mere end 30 dages aktivitet og 500 redigeringer.",
+       "rcfilters-filtergroup-automated": "Automatiserede bidrag",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Redigeringer udført af automatiserede værktøjer.",
+       "rcfilters-filter-humans-label": "Menneske (ikke bot)",
+       "rcfilters-filter-humans-description": "Redigeringer udført af mennesker.",
+       "rcfilters-filter-patrolled-label": "Patruljerede",
+       "rcfilters-filter-patrolled-description": "Redigeringer markerede som patruljerede.",
+       "rcfilters-filter-unpatrolled-label": "Upatruljerede",
+       "rcfilters-filter-unpatrolled-description": "Redigeringer ikke markerede som patruljerede.",
+       "rcfilters-filter-minor-label": "Mindre redigeringer",
+       "rcfilters-filter-minor-description": "Redigeringer som ophavsmanden har markeret som mindre.",
        "rcnotefrom": "Nedenfor er op til '''$1''' {{PLURAL:$5|ændring|ændringer}} siden '''$2''' vist.",
+       "rclistfromreset": "Nulstil datovalg",
        "rclistfrom": "Vis nye ændringer startende fra den $3 kl. $2",
        "rcshowhideminor": "$1 mindre ændringer",
        "rcshowhideminor-show": "Vis",
        "rcshowhidecategorization": "$1 kategorisering af sider",
        "rcshowhidecategorization-show": "Vis",
        "rcshowhidecategorization-hide": "Skjul",
-       "rclinks": "Vis seneste $1 ændringer i de sidste $2 dage<br />$3",
+       "rclinks": "Vis seneste $1 ændringer i de sidste $2 dage",
        "diff": "forskel",
        "hist": "historik",
        "hide": "Skjul",
        "apisandbox": "API-sandkassen",
        "apisandbox-api-disabled": "API er deaktiveret på dette websted.",
        "apisandbox-intro": "Brug denne side til at eksperimentere med '''MediaWiki web service API'''.\nVi henviser til [https://www.mediawiki.org/wiki/API:Main_page dokumentationen af API] for yderligere oplysninger om brug af API.  Eksempel: [https://www.mediawiki.org/wiki/API#A_simple_example få indholdet af en forside]. Vælg en handling at se flere eksempler.\n\nBemærk, at selv om dette er en sandkasse, vil handlinger du udfører på denne side redigere wikien.",
+       "apisandbox-fullscreen": "Udvid panel",
+       "apisandbox-fullscreen-tooltip": "Udvid sandkassepanelet, så det udfylder browservinduet.",
        "apisandbox-unfullscreen": "Vis side",
+       "apisandbox-unfullscreen-tooltip": "Formindsk sandkassepanelet, så MediaWiki-navigationslink er tilgængelige.",
        "apisandbox-submit": "Lav forespørgsel",
        "apisandbox-reset": "Ryd",
        "apisandbox-retry": "Forsøg igen",
        "modifiedarticleprotection": "ændrede beskyttelsen af \"[[$1]]\"",
        "unprotectedarticle": "fjernede beskyttelse af \"[[$1]]\"",
        "movedarticleprotection": "flyttede beskyttelsesindstillinger fra \"[[$2]]\" til \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|beskyttede}} \"[[$1]]\"",
        "protect-title": "Ændre beskyttelse af \"$1\"",
        "protect-title-notallowed": "Få vist beskyttelsesniveauet af \"$1\"",
        "prot_1movedto2": "$1 flyttet til $2",
        "undeleteviewlink": "vis",
        "undeleteinvert": "Omvend valget af versioner",
        "undeletecomment": "Begrundelse:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|version|versioner}} gendannet",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|version|versioner}} og $2 {{PLURAL:$2|fil|filer}} gendannet",
-       "undeletedfiles": "$1 {{PLURAL:$1|fil|filer}} gendannet",
        "cannotundelete": "Gendannelse mislykkedes:\n$1",
        "undeletedpage": "'''$1''' blev gendannet.\n\nI [[Special:Log/delete|slette-loggen]] findes en oversigt over de nyligt slettede og gendannede sider.",
        "undelete-header": "Se [[Special:Log/delete|slette-loggen]] for nyligt slettede og gendannede sider.",
        "unblocked-range": "$1 er fjernet fra blokering",
        "unblocked-id": "Blokering $1 er blevet fjernet",
        "blocklist": "Blokerede brugere",
+       "autoblocklist": "Autoblokeringer",
+       "autoblocklist-submit": "Søg",
+       "autoblocklist-legend": "Vis autoblokeringer",
+       "autoblocklist-empty": "Autoblokeringslisten er tom.",
+       "autoblocklist-otherblocks": "Andre {{PLURAL:$1|autoblokering|autoblokeringer}}",
        "ipblocklist": "Blokerede brugere",
        "ipblocklist-legend": "Find en blokeret bruger",
        "blocklist-userblocks": "Skjul blokeringer af kontoer",
        "block-log-flags-hiddenname": "brugernavnet er skjult",
        "range_block_disabled": "Sysop-muligheden for at oprette blokeringsklasser er slået fra.",
        "ipb_expiry_invalid": "Udløbstiden er ugyldig.",
+       "ipb_expiry_old": "Udløbstiden ligger i fortiden.",
        "ipb_expiry_temp": "Brugernavnet kan kun skjules ved permanente blokeringer.",
        "ipb_hide_invalid": "Kan ikke skjule denne konto; den har mere end {{PLURAL:$1|en redigering|$1 redigeringer}}.",
        "ipb_already_blocked": "„$1“ er allerede blokeret",
        "proxyblockreason": "Din IP-adresse er blevet blokeret fordi den er en såkaldt ''åben proxy''. Kontakt din Internet-udbyder eller tekniske hotline og oplyse dem om dette alvorlige sikkerhedsproblem.",
        "sorbsreason": "IP-adressen er opført i DNSBL på {{SITENAME}} som åben PROXY.",
        "sorbs_create_account_reason": "IP-adressen er opført i DNSBL på {{SITENAME}} som åben PROXY. Oprettelse af nye brugere er ikke mulig.",
+       "softblockrangesreason": "Anonyme bidrag er ikke tilladt fra din ip-adresse ($1). Log venligst ind.",
        "xffblockreason": "En IP-adresse der er indeholdt i X-Fremsendt-Til hovedet, enten din egen eller en på en proxy-server, du bruger, er blevet blokeret. Den oprindelige grund til blokeringen var:$1",
        "cant-see-hidden-user": "Brugeren du prøver at blokerer er allerede blokeret og skjult. Siden du ikke har rettigheden til at skjule brugere, kan du ikke se eller ændre brugerens blokering.",
        "ipbblocked": "Du kan ikke ændre blokeringer, da du selv er blokeret",
        "lockdbsuccesstext": "Mediawikidatabasen er låst. <br />Husk at fjerne låsen når du er færdig med din vedligeholdelse.",
        "unlockdbsuccesstext": "Mediawikidatabasen er låst op.",
        "lockfilenotwritable": "Database-spærrefilen kan ikke ændres. Hvis databasen skal spærres eller frigives, skal webserveren kunne skrive i denne fil.",
+       "databaselocked": "Databasen er allerede låst.",
        "databasenotlocked": "Databasen er ikke spærret.",
        "lockedbyandtime": "(af $1 den $2 kl. $3)",
        "move-page": "Flyt $1",
        "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).",
+       "cant-move-category-page": "Du har ikke tilladelse til at flytte kategorisider.",
+       "cant-move-to-category-page": "Du har ikke tilladelse til at flytte en side til en kategoriside.",
+       "cant-move-subpages": "Du har ikke tilladelse til at flytte undersider.",
        "namespace-nosubpages": "Navnerummet \"$1\" tillader ikke undersider.",
        "newtitle": "Ny titel:",
        "move-watch": "Overvåg siden",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versioner}} importeret",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|version|versioner}} importeret fra $2",
        "javascripttest": "Test af JavaScript",
+       "javascripttest-pagetext-unknownaction": "Ukendt handling \"$1\".",
        "javascripttest-qunit-intro": "Se [$1 testdokumentationen] på mediawiki.org.",
        "tooltip-pt-userpage": "{{GENDER:|Din}} brugerside",
        "tooltip-pt-anonuserpage": "Brugersiden for den ip-adresse du redigerer som",
        "tooltip-pt-preferences": "{{GENDER:|Dine}} indstillinger",
        "tooltip-pt-watchlist": "Listen over sider du overvåger for ændringer.",
        "tooltip-pt-mycontris": "Liste over {{GENDER:|dine}} bidrag",
+       "tooltip-pt-anoncontribs": "Liste over redigeringer fra denne ip-adresse",
        "tooltip-pt-login": "Du opfordres til at logge på, men det er ikke obligatorisk.",
+       "tooltip-pt-login-private": "Du skal logge ind for at bruge denne wiki",
        "tooltip-pt-logout": "Log af",
        "tooltip-pt-createaccount": "Du opfordres til at oprette en konto og logge på, men det er ikke obligatorisk",
        "tooltip-ca-talk": "Diskussion om indholdet på siden",
        "tooltip-feed-rss": "RSS-feed for denne side",
        "tooltip-feed-atom": "Atom-feed for denne side",
        "tooltip-t-contributions": "En liste over bidrag fra {{GENDER:$1|denne bruger}}",
-       "tooltip-t-emailuser": "Send en e-mail til denne bruger",
+       "tooltip-t-emailuser": "Send en email til {{GENDER:$1|denne bruger}}",
        "tooltip-t-info": "Yderligere oplysninger om denne side",
        "tooltip-t-upload": "Upload et billede eller anden mediafil",
        "tooltip-t-specialpages": "Liste over alle specialsider",
        "lastmodifiedatby": "Denne side blev senest ændret $2, $1 af $3.",
        "othercontribs": "Baseret på arbejde af $1.",
        "others": "andre",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|bruger|brugere}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|bruger}}|brugere}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|anonym bruger|anonyme brugere}} $1",
        "creditspage": "Sidens forfattere",
        "nocredits": "Der er ingen forfatteroplysninger om denne side.",
        "pageinfo-length": "Sidelængde (i bytes)",
        "pageinfo-article-id": "Side-ID",
        "pageinfo-language": "Sprog for sideindholdet",
+       "pageinfo-language-change": "ændr",
        "pageinfo-content-model": "Sidens indhold er",
+       "pageinfo-content-model-change": "ændr",
        "pageinfo-robot-policy": "Indeksering af robotter",
        "pageinfo-robot-index": "Tilladt",
        "pageinfo-robot-noindex": "Ikke tilladt",
        "pageinfo-category-pages": "Antal sider",
        "pageinfo-category-subcats": "Antal underkategorier",
        "pageinfo-category-files": "Antal filer",
+       "pageinfo-user-id": "Bruger-id",
        "markaspatrolleddiff": "Markér som patruljeret",
        "markaspatrolledtext": "Markér denne side som patruljeret",
+       "markaspatrolledtext-file": "Markér denne filversion som patruljeret",
        "markedaspatrolled": "Markeret som patruljeret",
        "markedaspatrolledtext": "Den valgte redigering af [[:$1]] er nu markeret som patruljeret.",
        "rcpatroldisabled": "Seneste ændringer-patruljeringen er slået fra",
        "patrol-log-page": "Kontrollog",
        "patrol-log-header": "Patruljerede versioner.",
        "log-show-hide-patrol": "$1 patruljeringslog",
+       "log-show-hide-tag": "$1 taglog",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marker version $3 af $2 som patruljeret?",
        "deletedrevision": "Slettede gammel version $1",
        "newimages-summary": "Denne specialside viser de senest oplagte filer.",
        "newimages-legend": "Filter",
        "newimages-label": "Filnavn (eller en del af det):",
+       "newimages-user": "IP-adresse eller brugernavn",
        "newimages-showbots": "Vis oplægninger af robotter",
+       "newimages-hidepatrolled": "Skjul patruljerede uploads",
        "noimages": "Ingen filer fundet.",
+       "gallery-slideshow-toggle": "Til- eller fravælg thumbnails",
        "ilsubmit": "Søg",
        "bydate": "efter dato",
        "sp-newimages-showfrom": "Vis nye filer startende fra $1 $2",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|lagde}} en ny udgave af $3 op",
        "logentry-upload-revert": "$1 {{GENDER:$2|lagde}} $3 op",
        "rightsnone": "(-)",
-       "revdelete-summary": "redigeringsbeskrivelse",
        "rightslogentry-temporary-group": "$1 (midlertidig, indtil $2)",
        "feedback-adding": "Tilføjer kommentar til side...",
        "feedback-back": "Tilbage",
index db62e1a..c4c6984 100644 (file)
                        "Tim Bartel (avatar) <wikipedia@computerkultur.org> formal addressing",
                        "Tischbeinahe",
                        "Umherirrender",
-                       "Urhixidur"
+                       "Urhixidur",
+                       "Florian",
+                       "Tiin"
                ]
        },
+       "tog-hideminor": "Kleine Änderungen in den „Letzten Änderungen“ ausblenden",
+       "tog-hidepatrolled": "Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden",
+       "tog-newpageshidepatrolled": "Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden",
+       "tog-extendwatchlist": "In der Beobachtungsliste alle Änderungen anzeigen, nicht nur die aktuellsten",
+       "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
+       "tog-numberheadings": "Überschriften automatisch nummerieren",
+       "tog-showtoolbar": "Bearbeiten-Werkzeugleiste aktivieren",
+       "tog-editondblclick": "Seiten mit Doppelklick bearbeiten",
+       "tog-editsectiononrightclick": "Einzelne Abschnitte per Rechtsklick bearbeiten",
        "tog-enotifrevealaddr": "Ihre E-Mail-Adresse in Benachrichtigungs-E-Mails anzeigen",
        "view-pool-error": "Entschuldigung, die Server sind im Moment überlastet.\nZu viele Benutzer versuchen, diese Seite zu besuchen.\nBitte warten Sie einige Minuten, bevor Sie es noch einmal versuchen.\n\n$1",
+       "generic-pool-error": "Leider sind die Server derzeit überlastet.\nZu viele Benutzer wollen diese Ressource ansehen.\nBitte warten Sie einen Moment, bevor Sie sie erneut aufrufen.",
        "badaccess-group0": "Sie haben nicht die erforderlichen Benutzerrechte für diese Aktion.",
+       "versionrequiredtext": "Version $1 von MediaWiki ist erforderlich, um diese Seite zu nutzen.\nSehen Sie auf die [[Special:Version|Versionsseite]]",
        "youhavenewmessages": "Sie haben $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Sie haben}} $1 von {{PLURAL:$3|einem anderen Benutzer|$3 Benutzern}} ($2).",
+       "youhavenewmessagesmanyusers": "Sie haben $1 von vielen Benutzern ($2).",
        "youhavenewmessagesmulti": "Sie haben neue Nachrichten: $1",
+       "confirmable-confirm": "Sind {{GENDER:$1|Sie}} sicher?",
        "enterlockreason": "Bitte geben Sie einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung",
        "readonlytext": "Die Datenbank ist vorübergehend für Neueinträge und Änderungen gesperrt. Bitte versuchen Sie es später noch einmal.\n\nGrund der Sperrung: $1",
        "missing-article": "Der Text von „$1“ $2 wurde nicht in der Datenbank gefunden.\n\nDie Seite ist möglicherweise gelöscht oder verschoben worden.\n\nFalls dies nicht der Fall ist, haben Sie eventuell einen Fehler in der Software gefunden. Bitte melden Sie dies einem [[Special:ListUsers/sysop|Administrator]] unter Nennung der URL.",
        "viewyourtext": "Sie können den Quelltext '''Ihrer Bearbeitung''' dieser Seite betrachten und kopieren:",
        "protectedinterface": "Diese Seite enthält Text für die Benutzeroberfläche der Software auf diesem Wiki und ist geschützt, um Missbrauch vorzubeugen.\nNutzen Sie bitte [https://translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
        "editinginterface": "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.\nÄnderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.\nNutzen Sie bitte [https://translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
+       "translateinterface": "Um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern, verwenden Sie bitte [//translatewiki.net/ translatewiki.net], das MediaWiki-Lokalisierungsprojekt.",
        "namespaceprotected": "Sie haben nicht die erforderliche Berechtigung, um Seiten im Namensraum '''$1''' bearbeiten zu können.",
        "customcssprotected": "Sie haben nicht die Berechtigung, diese CSS enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.",
        "customjsprotected": "Sie haben nicht die Berechtigung, diese JavaScript enthaltende Seite zu bearbeiten, da es sich hierbei um die persönlichen Einstellungen eines anderen Benutzers handelt.",
+       "mycustomcssprotected": "Sie haben keine Berechtigung, diese CSS-Seite zu bearbeiten.",
        "mycustomjsprotected": "Sie haben keine Berechtigung, diese JavaScript-Seite zu bearbeiten.",
        "myprivateinfoprotected": "Sie haben keine Berechtigung, Ihre privaten Informationen zu bearbeiten.",
-       "mypreferencesprotected": "Sie haben keine Berechtigung, Ihre Einstellungen zu bearbeiten.",
-       "exception-nologin-text": "Sie müssen sich [[Special:Userlogin|anmelden]], um auf diese Seite oder Aktion zugreifen zu können.",
+       "mypreferencesprotected": "Sie sind nicht berechtigt, Ihre Einstellungen zu ändern.",
+       "exception-nologin-text": "Sie müssen sich anmelden, um auf diese Seite oder Aktion zugreifen zu können.",
        "exception-nologin-text-manual": "Sie müssen sich $1, um auf diese Seite oder Aktion zugreifen zu können.",
        "logouttext": "'''Sie sind nun abgemeldet.'''\n\nBeachten Sie, dass einige Seiten noch anzeigen können, dass Sie angemeldet sind, solange Sie nicht Ihren Browsercache geleert haben.",
        "welcomecreation-msg": "Ihr Benutzerkonto wurde erstellt.\nVergessen Sie nicht, Ihre [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ändern.",
        "password-change-forbidden": "Sie können auf diesem Wiki keine Passwörter ändern.",
        "externaldberror": "Entweder liegt ein Fehler bei der externen Authentifizierung vor oder Sie dürfen Ihr externes Benutzerkonto nicht aktualisieren.",
        "userlogin-noaccount": "Sie haben noch kein Benutzerkonto?",
-       "nologin": "Sie haben kein Benutzerkonto? $1.",
-       "gotaccount": "Haben Sie bereits ein Benutzerkonto? '''$1'''.",
        "userlogin-loggedin": "Sie sind bereits als {{GENDER:$1|$1}} angemeldet.\nBenutzen Sie das unten stehende Formular, um sich unter einem anderen Benutzernamen anzumelden.",
        "createacct-email-ph": "Geben Sie Ihre E-Mail-Adresse ein",
        "createacct-reason-ph": "Warum erstellen Sie ein anderes Benutzerkonto?",
-       "createacct-imgcaptcha-ph": "Geben Sie den Text ein, den Sie oben sehen.",
        "createacct-benefit-heading": "{{SITENAME}} wird von Menschen wie Ihnen geschaffen.",
        "userexists": "Dieser Benutzername ist schon vergeben.\nBitte wählen Sie einen anderen.",
        "nocookiesnew": "Der Benutzerzugang wurde erstellt, aber Sie sind nicht angemeldet.\n{{SITENAME}} benötigt für diese Funktion Cookies, bitte aktivieren Sie diese und melden sich dann mit Ihrem neuen Benutzernamen und dem zugehörigen Passwort an.",
@@ -68,7 +83,7 @@
        "nocookiesfornew": "Das Benutzerkonto wurde nicht erstellt, da die Datenherkunft nicht ermittelt werden konnte.\nBitte stellen Sie sicher, dass Sie Cookies aktiviert haben. Laden Sie diese Seite danach erneut und versuchen Sie es noch einmal.",
        "noname": "Sie müssen einen gültigen Benutzernamen angeben.",
        "loginsuccess": "Sie sind jetzt als „$1“ bei {{SITENAME}} angemeldet.",
-       "nosuchuser": "Der Benutzername „$1“ existiert nicht.\nÜberprüfen Sie die Schreibweise (Groß-/Kleinschreibung beachten) oder [[Special:UserLogin/signup|melden Sie sich als neuer Benutzer an]].",
+       "nosuchuser": "Der Benutzername „$1“ existiert nicht.\nÜberprüfen Sie die Schreibweise (Groß-/Kleinschreibung beachten) oder [[Special:CreateAccount|melden Sie sich als neuer Benutzer an]].",
        "nosuchusershort": "Der Benutzername „$1“ ist nicht vorhanden. Bitte überprüfen Sie die Schreibweise.",
        "nouserspecified": "Bitte geben Sie einen Benutzernamen an.",
        "wrongpassword": "Das Passwort ist falsch. Bitte versuchen Sie es erneut.",
        "createaccount-text": "Es wurde für Sie ein Benutzerkonto „$2“ auf {{SITENAME}} ($4) erstellt. Das automatisch generierte Passwort für „$2“ ist „$3“. Sie sollten sich nun anmelden und das Passwort ändern.\n\nFalls das Benutzerkonto irrtümlich angelegt wurde, können Sie diese Nachricht ignorieren.",
        "login-throttled": "Sie haben zu oft versucht, sich anzumelden.\nBitte warten Sie $1, bevor Sie es erneut probieren.",
        "login-abort-generic": "Ihre Anmeldung war nicht erfolgreich – Abgebrochen",
+       "login-migrated-generic": "Ihr Benutzerkonto wurde migriert. Ihr Benutzername ist auf diesem Wiki nicht mehr vorhanden.",
        "suspicious-userlogout": "Ihre Abmeldeanfrage wurde verweigert, da sie vermutlich von einem defekten Browser oder einem Cache-Proxy gesendet wurde.",
        "createacct-another-realname-tip": "Der bürgerliche Name ist optional.\nWenn Sie ihn angeben, wird er für die Zuordnung der Beiträge verwendet.",
        "resetpass_announce": "Um die Anmeldung abzuschließen, müssen Sie ein neues Passwort festlegen.",
        "resetpass_text": "<!-- Ergänzen Sie den Text hier -->",
        "changepassword-success": "Ihr Passwort wurde erfolgreich geändert.",
+       "changepassword-throttled": "Sie haben zu viele Anmeldeversuche unternommen.\nBitte warten Sie $1, bevor Sie es erneut versuchen.",
        "resetpass-no-info": "Sie müssen sich anmelden, um auf diese Seite direkt zuzugreifen.",
        "resetpass-wrong-oldpass": "Ungültiges temporäres oder aktuelles Passwort.\nMöglicherweise haben Sie Ihr Passwort bereits erfolgreich geändert oder ein neues temporäres Passwort beantragt.",
-       "passwordreset-capture-help": "Wenn Sie dieses Kästchen ankreuzen, wird die E-Mail-Nachricht mit dem temporären Passwort sowohl Ihnen angezeigt als auch dem Benutzer zugesandt.",
+       "resetpass-recycled": "Bitte setzen Sie Ihr Passwort auf ein anderes Passwort als Ihr aktuelles fest.",
+       "resetpass-temp-emailed": "Sie haben sich mit einem temporären E-Mail-Code angemeldet. Um die Anmeldung abzuschließen, müssen Sie jetzt ein neues Passwort festlegen:",
+       "resetpass-expired": "Ihr Passwort ist abgelaufen. Bitte legen Sie ein neues Passwort zur Anmeldung fest.",
+       "resetpass-expired-soft": "Ihr Passwort ist abgelaufen und muss zurückgesetzt werden. Bitte wählen Sie jetzt ein neues Passwort aus oder klicken Sie auf „{{int:authprovider-resetpass-skip-label}}“, um es später zurückzusetzen.",
+       "resetpass-validity-soft": "Ihr Passwort ist nicht gültig: $1\n\nBitte wählen Sie jetzt ein neues Passwort oder klicken Sie auf „{{int:authprovider-resetpass-skip-label}}“, um es später zurückzusetzen.",
+       "passwordreset-text-one": "Füllen Sie dieses Formular aus, um Ihr Passwort zurückzusetzen.",
+       "passwordreset-text-many": "{{PLURAL:$1|Füllen Sie eines der Felder aus, um ein temporäres Passwort per E-Mail zugesandt zu bekommen.}}",
        "passwordreset-emailtext-ip": "Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat eine Zurücksetzung Ihres\nPassworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}}\nmit dieser E-Mail-Adresse verknüpft:\n\n$2\n\n{{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab.\nSie sollten sich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese\nAnfrage getätigt hat oder Sie sich wieder an Ihr ursprüngliches Passwort erinnern können und es nicht länger\nändern möchten, können Sie diese Nachricht ignorieren und weiterhin Ihr altes\nPasswort benutzen.",
        "passwordreset-emailtext-user": "Benutzer $1 bei {{SITENAME}} hat eine Zurücksetzung Ihres Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:\n\n$2\n\n{{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab. Sie sollten sich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder Sie sich wieder an Ihr ursprüngliches Passwort erinnern können und es nicht ändern möchten, können Sie diese Nachricht ignorieren und weiterhin Ihr altes Passwort benutzen.",
-       "changeemail-text": "Füllen Sie dieses Formular vollständig aus, um Ihre E-Mail-Adresse zu ändern. Sie müssen Ihr Passwort angeben, um diese Änderung zu bestätigen.",
+       "changeemail-header": "Füllen Sie dieses Formular vollständig aus, um Ihre E-Mail-Adresse zu ändern. Sie müssen Ihr Passwort angeben, um diese Änderung zu bestätigen.",
        "changeemail-no-info": "Sie müssen angemeldet sein, um direkt auf diese Seite zugreifen zu können.",
+       "changeemail-password": "Ihr {{SITENAME}}-Passwort:",
+       "changeemail-throttled": "Sie haben zu viele Anmeldeversuche unternommen.\nBitte warten Sie $1, bevor Sie es erneut versuchen.",
        "resettokens-text": "Sie können Tokens zurücksetzen, welche Ihnen den Zugriff auf bestimmte private Daten ermöglichen, die mit Ihrem Benutzerkonto hier verknüpft sind.\n\nSie sollten dies nur machen, wenn Sie die Tokens versehentlich mit jemandem geteilt haben oder Ihr Konto gefährdet ist.",
        "sig_tip": "Ihre Signatur mit Zeitstempel",
-       "anoneditwarning": "Sie bearbeiten diese Seite unangemeldet. Wenn Sie sie abspeichern, wird Ihre aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
-       "missingsummary": "'''Hinweis:''' Sie haben keine Zusammenfassung angegeben. Wenn Sie erneut auf „{{int:savearticle}}“ klicken, wird Ihre Änderung ohne Zusammenfassung übernommen.",
+       "blankarticle": "<strong>Warnung:</strong> Die Seite, die Sie erstellen, ist leer.\nWenn Sie erneut auf „$1“ klicken, wird die Seite ohne Inhalt erstellt.",
+       "anoneditwarning": "<strong>Warnung:</strong> Sie sind nicht angemeldet. Ihre IP-Adresse wird öffentlich sichtbar, falls Sie Bearbeitungen durchführst. Sofern Sie sich <strong>[$1 anmelden]</strong> oder <strong>[$2 ein Benutzerkonto erstellen]</strong>, werden Ihre Bearbeitungen zusammen mit anderen Beiträgen Ihrem Benutzernamen zugeordnet.",
+       "anonpreviewwarning": "<em>Sie sind nicht angemeldet. Beim Speichern wird Ihre IP-Adresse in der Versionsgeschichte aufgezeichnet.</em>",
+       "missingsummary": "<strong>Hinweis:</strong> Sie haben keine Zusammenfassung angegeben. Wenn Sie erneut auf „$1“ klicken, wird Ihre Änderung ohne Zusammenfassung übernommen.",
+       "selfredirect": "<strong>Warnung:</strong> Sie leiten auf diese Seite selbst weiter.\nSie haben vermutlich das falsche Weiterleitungsziel angegeben oder Sie bearbeiten die falsche Seite.\nWenn Sie erneut auf „$1“ klicken, wird die Weiterleitung dennoch erstellt.",
        "missingcommenttext": "Ihr Abschnitt enthält keinen Text.",
-       "missingcommentheader": "'''Achtung:''' Sie haben kein Betreff/Überschrift eingegeben. Wenn Sie erneut auf „{{int:savearticle}}“ klicken, wird Ihre Bearbeitung ohne Überschrift gespeichert.",
+       "missingcommentheader": "'''Achtung:''' Sie haben kein Betreff/Überschrift eingegeben. Wenn Sie erneut auf „$1“ klicken, wird Ihre Bearbeitung ohne Überschrift gespeichert.",
+       "previewerrortext": "Beim Versuch, eine Vorschau Ihrer Änderungen anzuzeigen, ist ein Fehler aufgetreten.",
        "blockedtext": "'''Ihr Benutzername oder Ihre 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\nSie könnten $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.\nSie können die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in Ihren [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für Sie gesperrt wurde.\nIhre aktuelle IP-Adresse ist $3 und die Sperrkennung lautet $5.\nBitte fügen Sie alle Informationen jeder Anfrage hinzu, die Sie stellen.",
        "autoblockedtext": "Ihre 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\nSie können $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.\n\nSie können die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in Ihren [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für Sie gesperrt wurde.\n\nIhre aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.\nBitte fügen Sie alle Informationen jeder Anfrage hinzu, die Sie stellen.",
        "whitelistedittext": "Sie müssen sich $1, um Seiten bearbeiten zu können.",
        "nosuchsectiontext": "Sie haben versucht, einen Abschnitt zu bearbeiten, der nicht existiert.\nVermutlich wurde er verschoben oder gelöscht, nachdem Sie die Seite aufgerufen haben.",
        "loginreqpagetext": "Sie müssen sich $1, um Seiten lesen zu können.",
        "newarticletext": "Sie sind einem Link zu einer Seite gefolgt, die nicht vorhanden ist.\nUm diese Seite anzulegen, tragen Sie Ihren Text in das untenstehende Bearbeitungsfeld ein (weitere Informationen auf der [$1 Hilfeseite]).\nSofern Sie fälschlicherweise hier sind, klicken Sie auf die Schaltfläche '''Zurück''' Ihres Browsers.",
-       "anontalkpagetext": "----''Diese Seite dient dazu, einem nicht angemeldeten Benutzer Nachrichten zu hinterlassen. Es wird seine IP-Adresse zur Identifizierung verwendet. IP-Adressen können von mehreren Benutzern gemeinsam verwendet werden. Wenn Sie mit den Kommentaren auf dieser Seite nichts anfangen können, richten sie sich vermutlich an einen früheren Inhaber Ihrer IP-Adresse und Sie können sie ignorieren. Sie können sich auch ein [[Special:UserLogin/signup|Benutzerkonto erstellen]] oder sich [[Special:UserLogin|anmelden]], um künftig Verwechslungen mit anderen anonymen Benutzern zu vermeiden.''",
+       "anontalkpagetext": "----''Diese Seite dient dazu, einem nicht angemeldeten Benutzer Nachrichten zu hinterlassen. Es wird seine IP-Adresse zur Identifizierung verwendet. IP-Adressen können von mehreren Benutzern gemeinsam verwendet werden. Wenn Sie mit den Kommentaren auf dieser Seite nichts anfangen können, richten sie sich vermutlich an einen früheren Inhaber Ihrer IP-Adresse und Sie können sie ignorieren. Sie können sich auch ein [[Special:CreateAccount|Benutzerkonto erstellen]] oder sich [[Special:UserLogin|anmelden]], um künftig Verwechslungen mit anderen anonymen Benutzern zu vermeiden.''",
        "noarticletext": "Diese Seite enthält momentan noch keinen Text.\nSie können diesen Titel auf den anderen Seiten [[Special:Search/{{PAGENAME}}|suchen]],\n<span class=\"plainlinks\">in den zugehörigen [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} Logbüchern suchen] oder diese Seite [{{fullurl:{{FULLPAGENAME}}|action=edit}} bearbeiten]</span>.",
-       "noarticletext-nopermission": "Diese Seite enthält momentan noch keinen Text.\nSie können ihren Titel auf anderen Seiten [[Special:Search/{{PAGENAME}}|suchen]] oder die zugehörigen <span class=\"plainlinks\">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} Logbücher betrachten].</span>. Sie sind allerdings nicht berechtigt diese Seite zu erstellen.",
+       "noarticletext-nopermission": "Diese Seite enthält momentan noch keinen Text und Sie sind auch nicht berechtigt diese Seite zu erstellen.\nSie können ihren Titel auf anderen Seiten [[Special:Search/{{PAGENAME}}|suchen]] oder die zugehörigen <span class=\"plainlinks\">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} Logbücher betrachten].</span>",
        "userpage-userdoesnotexist": "Das Benutzerkonto „<nowiki>$1</nowiki>“ ist nicht vorhanden. Bitte prüfen Sie, ob Sie diese Seite wirklich erstellen/bearbeiten möchten.",
        "clearyourcache": "'''Hinweis:''' Leeren Sie nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.\n* '''Firefox/Safari:''' ''Umschalttaste'' drücken und gleichzeitig ''Aktualisieren'' anklicken oder entweder ''Strg+F5'' oder ''Strg+R'' (''⌘+R'' auf dem Mac) drücken\n* '''Google Chrome:''' ''Umschalttaste+Strg+R'' (''⌘+Umschalttaste+R'' auf dem Mac) drücken\n* '''Internet Explorer:''' ''Strg+F5'' drücken oder ''Strg'' drücken und gleichzeitig ''Aktualisieren'' anklicken\n* '''Opera:''' ''Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen''",
        "usercssyoucanpreview": "'''Tipp:''' Benutzen Sie den „{{int:showpreview}}“-Button, um Ihr neues CSS vor dem Speichern zu testen.",
        "session_fail_preview_html": "'''Ihre Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.'''\n\n''Da in {{SITENAME}} das Speichern von reinem HTML aktiviert ist, wurde die Vorschau ausgeblendet, um JavaScript-Attacken vorzubeugen.''\n\n'''Bitte versuchen Sie es erneut, indem Sie unter der folgenden Textvorschau nochmals auf „Seite speichern“ klicken.\nSollte das Problem bestehen bleiben, [[Special:UserLogout|melden Sie sich ab]] und danach wieder an.'''",
        "token_suffix_mismatch": "'''Ihre Bearbeitung wurde zurückgewiesen, da Ihr Browser Zeichen im Bearbeiten-Token verstümmelt hat.\nEine Speicherung kann den Seiteninhalt zerstören. Dies geschieht bisweilen durch die Benutzung eines anonymen Proxy-Dienstes, der fehlerhaft arbeitet.'''",
        "edit_form_incomplete": "'''Der Inhalt des Bearbeitungsformulars hat den Server nicht vollständig erreicht. Bitte prüfen Sie Ihre Bearbeitungen auf Vollständigkeit und versuchen Sie es erneut.'''",
-       "explainconflict": "Jemand anders hat diese Seite geändert, nachdem Sie angefangen haben, sie zu bearbeiten.\nDas obere Textfeld enthält den aktuellen Bearbeitungsstand der Seite.\nDas untere Textfeld enthält Ihre Änderungen.\nBitte fügen Sie Ihre Änderungen in das obere Textfeld ein.\n'''Nur''' der Inhalt des oberen Textfeldes wird gespeichert, wenn Sie auf „{{int:savearticle}}“ klicken.",
+       "explainconflict": "Jemand anders hat diese Seite geändert, nachdem Sie angefangen haben, sie zu bearbeiten.\nDas obere Textfeld enthält den aktuellen Bearbeitungsstand der Seite.\nDas untere Textfeld enthält Ihre Änderungen.\nBitte fügen Sie Ihre Änderungen in das obere Textfeld ein.\n'''Nur''' der Inhalt des oberen Textfeldes wird gespeichert, wenn Sie auf „$1“ klicken.",
        "yourtext": "Ihr Text",
        "nonunicodebrowser": "'''Achtung: Ihr Browser kann Unicode-Zeichen nicht richtig verarbeiten.''' Es wird eine Hilfsroutine eingesetzt, um Ihnen zu erlauben, Seiten sicher zu bearbeiten: Nicht-ASCII-Zeichen werden dabei im Bearbeitungsfenster als hexadezimale Codes angezeigt.",
        "editingold": "'''Achtung: Sie bearbeiten eine alte Version dieser Seite. Sofern Sie sie speichern, werden alle neueren Versionen überschrieben.'''",
        "rev-suppressed-unhide-diff": "Eine der Versionen dieses Versionsunterschieds wurde '''unterdrückt'''.\nNähere Angaben stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Unterdrückungs-Logbuch].\nSie können [$1 diesen Versionsunterschied einsehen], sofern Sie möchten.",
        "rev-deleted-diff-view": "Eine Version dieses Versionsunterschieds wurde '''gelöscht'''.\nSie können diesen Versionsunterschied einsehen, sofern Sie möchten. Nähere Angaben stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].",
        "rev-suppressed-diff-view": "Eine der Versionen dieses Versionsunterschiedes wurde '''unterdrückt'''.\nSie können diesen Versionsunterschied einsehen, sofern Sie möchten. Nähere Angaben stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unterdrückungs-Logbuch].",
-       "revdelete-nooldid-text": "Sie haben entweder keine Version angegeben, auf die diese Aktion ausgeführt werden soll, die gewählte Version ist nicht vorhanden oder Sie versuchen, die aktuelle Version zu entfernen.",
+       "revdelete-nooldid-text": "Sie haben entweder keine Zielversion angegeben, auf die diese Funktion ausgeführt werden soll, die gewählte Version ist nicht vorhanden oder Sie versuchen, die aktuelle Version zu verstecken.",
        "revdelete-show-file-confirm": "Sind Sie sicher, dass Sie die gelöschte Version der Datei „<nowiki>$1</nowiki>“ vom $2 um $3 Uhr ansehen wollen?",
        "revdelete-confirm": "Bitte bestätigen Sie, dass Sie beabsichtigen, dies zu tun, die Konsequenzen verstehen und es in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]] tun.",
        "revdelete-show-no-access": "Fehler beim Anzeigen des Eintrags vom $1, $2 Uhr: Dieser Eintrag wurde als „eingeschränkt“ markiert.\nSie haben darauf keinen Zugriff.",
        "revdelete-modify-no-access": "Fehler beim Bearbeiten des Eintrags vom $1, $2 Uhr: Dieser Eintrag wurde als „eingeschränkt“ markiert.\nSie haben darauf keinen Zugriff.",
        "revdelete-concurrent-change": "Fehler beim Bearbeiten des Eintrags vom $1, $2 Uhr: Es scheint, als ob der Status von jemandem geändert wurde, bevor Sie vorhatten, ihn zu bearbeiten.\nBitte prüfen Sie die Logbücher.",
        "revdelete-only-restricted": "Fehler beim Verstecken des Eintrags vom $1, $2 Uhr: Sie können keinen Eintrag vor Administratoren verstecken, ohne eine der anderen Ansichtsoptionen gewählt zu haben.",
+       "suppressionlogtext": "Dies ist das Logbuch der Oversight-Aktionen (Änderungen der Sichtbarkeit von Versionen, Bearbeitungskommentaren, Benutzernamen und Benutzersperren). Sehen Sie in die [[Special:BlockList|Liste der gesperrten IP-Adressen und Benutzernamen]] für aktuelle Sperren.",
        "mergehistory-header": "Mit dieser Spezialseite können Sie die Versionsgeschichte einer Ursprungsseite mit der Versionsgeschichte einer Zielseite vereinen.\nStellen Sie sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.",
        "mergehistory-merge": "Die folgenden Versionen von „[[:$1]]“ können nach „[[:$2]]“ übertragen werden. Markieren Sie die Version, bis zu der (einschließlich) die Versionen übertragen werden sollen. Bitte beachten Sie, dass die Nutzung der Navigationslinks die Auswahl zurücksetzt.",
        "mergehistory-fail": "Versionsvereinigung nicht möglich, bitte prüfen Sie die Seite und die Zeitangaben.",
+       "searchmenu-exists": "<strong>Es gibt eine Seite, die den Namen „[[:$1]]“ hat.</strong> {{PLURAL:$2|0=|Weitere Suchergebnisse anzeigen.}}",
        "searchmenu-new": "<strong>Erstellen Sie die Seite „[[:$1]]“ in diesem Wiki.</strong> {{PLURAL:$2|0=|Siehe auch die über Ihre Suche gefundene Seite.|Siehe auch die gefundenen Suchergebnisse.}}",
        "search-suggest": "Meinten Sie „$1“?",
        "search-nonefound": "Für Ihre Suchanfrage wurden keine Ergebnisse gefunden.",
        "searchdisabled": "Die {{SITENAME}} Suche wurde deaktiviert. Sie können unterdessen mit Google suchen. Bitte bedenken Sie, dass der Suchindex von {{SITENAME}} veraltet sein kann.",
-       "prefsnologintext2": "Sie müssen sich $1, um Ihre Benutzereinstellungen festzulegen.",
+       "prefsnologintext2": "Sie müssen sich einloggen, um Ihre Benutzereinstellungen zu ändern.",
        "prefs-help-watchlist-token2": "Dies ist der geheime Schlüssel zum Webfeed Ihrer Beobachtungsliste.\nJeder, der ihn kennt, kann Ihre Beobachtungsliste lesen. Teilen Sie ihn deshalb nicht Anderen mit.\nSofern notwendig, [[Special:ResetTokens|können Sie ihn zurücksetzen]].",
        "savedprefs": "Ihre Einstellungen wurden gespeichert.",
        "prefs-reset-intro": "Sie können diese Seite verwenden, um die Einstellungen auf die Standards zurückzusetzen.\nDies kann nicht mehr rückgängig gemacht werden.",
        "prefs-help-prefershttps": "Diese Einstellung wird bei Ihrer nächsten Anmeldung wirksam.",
        "userrights-groups-help": "Sie können die Gruppenzugehörigkeit dieses Benutzers ändern:\n* Ein markiertes Kästchen bedeutet, dass der Benutzer Mitglied dieser Gruppe ist.\n* Ein nichtmarkiertes Kästchen bedeutet, dass der Benutzer nicht Mitglied dieser Gruppe ist.\n* Ein * bedeutet, dass Sie das Benutzerrecht nach Erteilung nicht wieder zurücknehmen können (oder umgekehrt).",
        "userrights-no-interwiki": "Sie haben nicht die erforderliche Berechtigung, um Benutzerrechte in anderen Wikis ändern zu können.",
-       "userrights-nologin": "Sie müssen sich mit einem Administrator-Benutzerkonto [[Special:UserLogin|anmelden]], um Benutzerrechte zu ändern.",
-       "userrights-notallowed": "Sie verfügen nicht über die erforderlichen Berechtigungen, um Benutzerrechte vergeben oder entziehen zu können.",
        "userrights-changeable-col": "Gruppenzugehörigkeit, die Sie ändern dürfen",
        "userrights-unchangeable-col": "Gruppenzugehörigkeit, die Sie nicht ändern dürfen",
        "recentchanges-summary": "Auf dieser Seite können Sie die letzten Änderungen in diesem Wiki nachverfolgen.",
        "recentchanges-feed-description": "Verfolgen Sie mit diesem Feed die letzten Änderungen in {{SITENAME}}.",
-       "recentchangeslinked-summary": "Diese Spezialseite listet die letzten Änderungen an den verlinkten Seiten auf (bzw. bei Kategorien an den Mitgliedern dieser Kategorie).\nSeiten auf Ihrer [[Special:Watchlist|Beobachtungsliste]] sind '''fett''' dargestellt.",
+       "recentchangeslinked-summary": "Diese Spezialseite listet die letzten Änderungen an den verlinkten Seiten auf (bzw. an in dieser Kategorie enthaltenen Kategorien).\nSeiten auf Ihrer [[Special:Watchlist|Beobachtungsliste]] sind <strong>fett</strong> dargestellt.",
        "uploadnologintext": "Sie müssen sich $1 um Dateien hochladen zu können.",
        "uploadtext": "Benutzen Sie dieses Formular, um neue Dateien hochzuladen.\n\nGehen Sie zu der [[Special:FileList|Liste hochgeladener Dateien]], um vorhandene Dateien zu suchen und anzuzeigen. Siehe auch das [[Special:Log/upload|Datei-]] und [[Special:Log/delete|Lösch-Logbuch]].\n\nUm ein '''Bild''' in einer Seite zu verwenden, nutzen Sie einen Link in der folgenden Form:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.jpg]]</nowiki></code>''' – für ein Vollbild\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.png|200px|thumb|left|Alternativer Text]]</nowiki></code>''' – für ein 200px breites Bild innerhalb einer Box, mit „Alternativer Text“ als Bildbeschreibung\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datei.ogg]]</nowiki></code>''' – für einen direkten Link auf die Datei, ohne Darstellung der Datei",
        "illegalfilename": "Der Dateiname „$1“ enthält mindestens ein nicht erlaubtes Zeichen. Bitte benennen Sie die Datei um und versuchen Sie, sie erneut hochzuladen.",
        "img-auth-isdir": "Sie versuchen, auf ein Verzeichnis „$1“ zuzugreifen.\nNur Dateizugriff ist erlaubt.",
        "upload-curl-error6-text": "Die angegebene URL ist nicht erreichbar. Prüfen Sie sowohl die URL auf Fehler als auch den Online-Status der Seite.",
        "upload-curl-error28-text": "Die Seite braucht zu lange, um zu antworten. Prüfen Sie, ob die Seite online ist, warten Sie einen kurzen Moment und versuchen Sie es dann erneut. Es kann sinnvoll sein, es zu einem anderen Zeitpunkt erneut zu versuchen.",
-       "upload_source_file": " (eine Datei auf Ihrem Computer)",
+       "upload_source_file": "(die von Ihnen auf Ihrem Computer ausgewählte Datei)",
        "filehist-help": "Klicken Sie auf einen Zeitpunkt, um diese Version zu laden.",
        "sharedupload-desc-edit": "Diese Datei stammt aus $1 und kann auf anderen Projekten verwendet werden.\nVielleicht möchten Sie die Beschreibung auf der dortigen [$2 Dateibeschreibungsseite] bearbeiten.",
        "sharedupload-desc-create": "Diese Datei stammt aus $1 und kann von anderen Projekten verwendet werden.\nVielleicht möchten Sie die Beschreibung auf der dortigen [$2 Dateibeschreibungsseite] bearbeiten.",
        "unusedtemplatestext": "Diese Seite listet alle Seiten im {{ns:template}}-Namensraum auf, die nicht in anderen Seiten eingebunden sind.\nÜberprüfen Sie andere Links zu den Vorlagen, bevor Sie diese löschen.",
        "unusedimagestext": "Bitte beachten Sie, dass andere Webseiten eine Datei mit einer direkten URL verlinken können. Sie könnte daher hier aufgelistet sein, obwohl sie in aktiver Verwendung ist.",
        "notargettext": "Sie haben nicht angegeben, auf welche Seite diese Funktion angewendet werden soll.",
+       "apisandbox-intro": "Diese Seite können Sie für Versuche mit der '''MediaWiki-API''' verwenden.\nDie [//www.mediawiki.org/wiki/API:Main_page/de Dokumentation zur API] enthält weitere Hinweise zu ihrer Nutzung. Beispiel: [//www.mediawiki.org/wiki/API:Main_page/de#Ein_einfaches_Beispiel Den Inhalt auf einer Seite abrufen]. Für weitere Beispiele eine der verfügbaren Aktionen auswählen.",
        "booksources-invalid-isbn": "Vermutlich ist die ISBN ungültig.\nBitte prüfen Sie, ob sie korrekt von der Quelle übertragen wurde.",
        "cachedspecial-viewing-cached-ttl": "Sie sehen die gecachte Version dieser Seite, die bis zu $1 alt sein kann.",
        "cachedspecial-viewing-cached-ts": "Sie sehen die gecachte Version dieser Seite, die möglicherweise nicht aktuell ist.",
        "blockiptext": "Mit diesem Formular sperren Sie eine IP-Adresse oder einen Benutzernamen, so dass von dort keine Änderungen mehr vorgenommen werden können.\nDies sollte nur erfolgen, um Vandalismus zu verhindern und in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]].\nBitte geben Sie den Grund für die Sperre an.",
        "ipb-blockingself": "Sie sind gerade dabei, sich selbst zu sperren! Möchten Sie das wirklich tun?",
        "ipb-confirmhideuser": "Sie sind gerade dabei, einen Benutzer im Modus „Benutzer verstecken“ zu sperren. Dies führt dazu, dass der Benutzername in allen Listen und Logbüchern unterdrückt wird. Möchten Sie das wirklich tun?",
+       "ipb-confirmaction": "Wenn Sie sich sicher sind, dass Sie dies wirklich tun möchten, kreuzen Sie bitte unten das Feld „{{int:ipb-confirm}}“ an.",
        "unblockiptext": "Mit diesem Formular können Sie eine IP-Adresse oder einen Benutzer freigeben.",
        "autoblocker": "Automatische Sperre, da Sie eine gemeinsame IP-Adresse mit [[User:$1|$1]] benutzen. Der bei der Sperren von „$1“ angegebene Grund lautet: „$2“.",
        "ipb-needreblock": "„$1“ ist bereits gesperrt. Möchten Sie die Sperrparameter ändern?",
        "movepagetext": "Mit untenstehendem Formular können Sie eine Seite umbenennen, indem Sie sie mitsamt allen Versionen auf einen neuen Titel verschieben.\nDer alte Titel wird danach zum neuen weiterleiten.\nSie können Weiterleitungen, die auf den Originaltitel verlinken, automatisch korrigieren lassen.\nStellen Sie sicher, dass Sie im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfen.\nSie sind dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, letztere ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass Sie die Umbenennung rückgängig machen können, sofern Sie einen Fehler gemacht haben. Sie können hingegen keine existierende Seite überschreiben.\n\n'''Warnung!'''\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nSie sollten daher die Konsequenzen verstanden haben, bevor Sie jetzt fortfahren.",
        "movepagetext-noredirectfixer": "Mit untenstehendem Formular können Sie eine Seite umbenennen, indem Sie sie mitsamt allen Versionen auf einen neuen Titel verschieben.\nDer alte Titel wird danach zum neuen weiterleiten.\nStellen Sie sicher, dass Sie im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfen.\nSie sind dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass Sie die Umbenennung rückgängig machen können, sofern Sie einen Fehler gemacht haben. Sie können hingegen keine existierende Seite überschreiben.\n\n'''Warnung!'''\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nSie sollten daher die Konsequenzen verstanden haben, bevor Sie jetzt fortfahren.",
        "movepagetalktext": "Die dazugehörige Diskussionsseite wird, sofern vorhanden, mitverschoben, '''es sei denn:'''\n*Es existiert bereits eine Diskussionsseite mit diesem Namen, oder\n*Sie wählen die unten stehende Option ab.\n\nIn diesen Fällen müssen Sie, falls gewünscht, den Inhalt der Seite von Hand verschieben oder zusammenführen.\n\nBitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung bitte '''begründen.'''",
-       "moveuserpage-warning": "'''Warnung:''' Sie sind dabei, eine Benutzerseite zu verschieben. Bitte bedenken Sie, dass dadurch nur die Benutzerseite verschoben, '''nicht''' aber der Benutzer umbenannt wird.",
+       "moveuserpage-warning": "<strong>Warnung:</strong> Sie sind dabei, eine Benutzerseite zu verschieben. Bitte bedenken Sie, dass dadurch nur die Benutzerseite verschoben, <em>nicht</em> aber der Benutzer umbenannt wird.",
+       "movecategorypage-warning": "<strong>Warnung:</strong> Sie sind gerade dabei, eine Kategorieseite zu verschieben. Bitte seien Sie sich bewusst, dass nur die Seite verschoben wird. Alle der alten Kategorie zugeordneten Seiten werden <em>nicht</em> neu kategorisiert.",
        "movenologintext": "Sie müssen ein registrierter Benutzer und [[Special:UserLogin|angemeldet]] sein, um eine Seite zu verschieben.",
        "movenotallowed": "Sie haben nicht die erforderliche Berechtigung, um Seiten verschieben zu können.",
        "movenotallowedfile": "Sie haben nicht die erforderliche Berechtigung, um Dateien verschieben zu können.",
        "import-token-mismatch": "Verlust der Sessiondaten. Bitte versuchen Sie es erneut.",
        "import-error-edit": "Die Seite „$1“ wurde nicht importiert, da Sie nicht berechtigt sind, sie zu bearbeiten.",
        "import-error-create": "Die Seite „$1“ wurde nicht importiert, da Sie nicht berechtigt sind, sie zu erstellen.",
-       "javascripttest-pagetext-frameworks": "Bitte wählen Sie eine der folgenden Prüfumgebungen aus: $1",
-       "javascripttest-pagetext-skins": "Wählen Sie eine Benutzeroberfläche zur Durchführung der Tests aus:",
        "tooltip-pt-userpage": "Ihre Benutzerseite",
        "tooltip-pt-anonuserpage": "Benutzerseite der IP-Adresse, von der aus Sie Änderungen durchführen",
        "tooltip-pt-mytalk": "Ihre Diskussionsseite",
+       "tooltip-pt-preferences": "Ihre Einstellungen",
+       "tooltip-pt-watchlist": "Liste der von Ihnen beobachteten Seiten",
        "tooltip-pt-mycontris": "Liste Ihrer Beiträge",
+       "tooltip-pt-createaccount": "Wir ermutigen Sie ein Benutzerkonto zu erstellen und sich anzumelden. Es ist jedoch nicht zwingend erforderlich.",
+       "tooltip-ca-edit": "Sie können diese Seite bearbeiten. Bitte nutzen Sie auch die Vorschaufunktion vor dem Speichern.",
+       "tooltip-ca-watch": "Diese Seite zu Ihrer Beobachtungsliste hinzufügen",
        "tooltip-n-mainpage": "Besuchen Sie die Hauptseite",
        "tooltip-n-mainpage-description": "Besuchen Sie die Hauptseite",
        "tooltip-n-portal": "Über das Projekt, was Sie tun können, wo was zu finden ist",
        "tooltip-watch": "Diese Seite zu Ihrer Beobachtungsliste hinzufügen",
        "tooltip-summary": "Geben Sie eine kurze Zusammenfassung ein.",
-       "spamprotectiontext": "Der Text, die Sie speichern wollen, wurde vom Spamschutzfilter blockiert.\nDas liegt wahrscheinlich an einem Link auf eine externe Seite.",
+       "spamprotectiontext": "Der Text, den Sie speichern möchten, wurde vom Spamschutzfilter blockiert.\nDas liegt wahrscheinlich an einem Link auf eine externe Seite.",
        "markedaspatrollederrortext": "Sie müssen eine Seitenänderung auswählen.",
-       "mediawarning": "'''Warnung:''' Dieser Dateityp kann böswilligen Programmcode enthalten.\nDurch das Herunterladen und Öffnen der Datei kann Ihr Computer beschädigt werden.",
+       "mediawarning": "<strong>Warnung:</strong> Dieser Dateityp kann böswilligen Programmcode enthalten.\nDurch das Herunterladen und Öffnen der Datei kann Ihr Computer beschädigt werden.",
        "confirmemail_noemail": "Sie haben keine gültige E-Mail-Adresse in Ihren [[Special:Preferences|persönlichen Einstellungen]] eingetragen.",
        "confirmemail_text": "{{SITENAME}} erfordert, dass Sie Ihre E-Mail-Adresse bestätigen (authentifizieren), bevor Sie die erweiterten E-Mail-Funktionen benutzen können. Klicken Sie bitte auf die unten stehende, mit „Bestätigungscode zuschicken“ beschriftete Schaltfläche, damit eine automatisch erstellte E-Mail an die angegebene Adresse geschickt wird. Diese E-Mail enthält eine Web-Adresse mit einem Bestätigungscode. Indem Sie diese Webseite in Ihrem Webbrowser öffnen, bestätigen Sie, dass die angegebene E-Mail-Adresse korrekt und gültig ist.",
        "confirmemail_pending": "Es wurde Ihnen bereits ein Bestätigungscode per E-Mail zugeschickt.\nWenn Sie Ihr Benutzerkonto erst vor kurzem erstellt haben, warten Sie bitte noch ein paar Minuten auf die E-Mail, bevor Sie einen neuen Code anfordern.",
        "watchlistedit-normal-done": "{{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} von Ihrer Beobachtungsliste entfernt:",
        "watchlistedit-raw-explain": "Dies sind die Einträge Ihrer Beobachtungsliste im Listenformat. Die Einträge können zeilenweise gelöscht oder hinzugefügt werden.\nPro Zeile ist ein Eintrag erlaubt.\nSobald Sie fertig sind, klicken Sie auf „{{int:Watchlistedit-raw-submit}}“.\nSie können auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutzen.",
        "watchlistedit-raw-done": "Ihre Beobachtungsliste wurde gespeichert.",
+       "watchlistedit-clear-explain": "Alle Seiten werden ausnahmslos von Ihrer Beobachtungsliste entfernt.",
        "dberr-again": "Warten Sie einige Minuten und versuchen Sie dann neu zuladen.",
        "dberr-usegoogle": "Sie könnten in der Zwischenzeit mit Google suchen.",
        "dberr-outofdate": "Beachten Sie, dass der Suchindex unserer Inhalte bei Google veraltet sein kann.",
-       "feedback-bugornote": "Sofern Sie detailliert ein technisches Problem beschreiben möchten, melden Sie bitte [$1 einen Fehler].\nAnderenfalls können Sie auch das untenstehende einfache Formular nutzen. Ihr Kommentar wird, zusammen mit Ihrem Benutzernamen und der Version des von Ihnen verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.",
-       "feedback-thanks": "Vielen Dank. Ihre Rückmeldung wurde auf der Seite „[$2 $1]“ gespeichert.",
        "feedback-bugcheck": "Super! Bitte überprüfen Sie noch, ob es sich hierbei nicht um einen bereits [$1 bekannten Fehler] handelt.",
-       "api-error-badaccess-groups": "Sie haben nicht die Berechtigung Dateien in dieses Wiki hochzuladen.",
-       "api-error-hookaborted": "Die von Ihnen vorgesehene Anpassung kann nicht durchgeführt werden (Unterbrechung durch eine Programmschnittstelle).",
-       "api-error-mustbeloggedin": "Um Dateien hochladen zu können, müssen Sie angemeldet sein."
+       "feedback-bugornote": "Sofern Sie detailliert ein technisches Problem beschreiben möchten, melden Sie bitte [$1 einen Fehler].\nAnderenfalls können Sie auch das untenstehende einfache Formular nutzen. Ihr Kommentar wird, zusammen mit Ihrem Benutzernamen und der Version des von Ihnen verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.",
+       "feedback-thanks": "Vielen Dank. Ihre Rückmeldung wurde auf der Seite „[$2 $1]“ gespeichert."
 }
index 22aa69e..5b9ec8a 100644 (file)
        "redirectedfrom": "(Weitergeleitet von $1)",
        "redirectpagesub": "Weiterleitung",
        "redirectto": "Weiterleitung nach:",
-       "lastmodifiedat": "Diese Seite wurde zuletzt am $1 um $2 Uhr geändert.",
+       "lastmodifiedat": "Diese Seite wurde zuletzt am $1 um $2 Uhr bearbeitet.",
        "viewcount": "Diese Seite wurde bisher {{PLURAL:$1|einmal|$1 mal}} abgerufen.",
        "protectedpage": "Geschützte Seite",
        "jumpto": "Wechseln zu:",
        "login": "Anmelden",
        "login-security": "Verifiziere deine Identität",
        "nav-login-createaccount": "Anmelden / Benutzerkonto erstellen",
-       "userlogin": "Anmelden / Benutzerkonto anlegen",
-       "userloginnocreate": "Anmelden",
        "logout": "Abmelden",
        "userlogout": "Abmelden",
        "notloggedin": "Nicht angemeldet",
        "userlogin-noaccount": "Du hast noch kein Benutzerkonto?",
        "userlogin-joinproject": "Bei {{SITENAME}} anmelden",
-       "nologin": "Du hast kein Benutzerkonto? $1.",
-       "nologinlink": "Neues Benutzerkonto anlegen",
        "createaccount": "Benutzerkonto anlegen",
-       "gotaccount": "Du hast bereits ein Benutzerkonto? $1.",
-       "gotaccountlink": "Anmelden",
-       "userlogin-resetlink": "Die Anmeldedaten vergessen?",
        "userlogin-resetpassword-link": "Passwort vergessen?",
        "userlogin-helplink2": "Hilfe beim Anmelden",
        "userlogin-loggedin": "Du bist bereits als {{GENDER:$1|$1}} angemeldet.\nBenutze das unten stehende Formular, um dich unter einem anderen Benutzernamen anzumelden.",
        "createaccountmail": "Ein temporäres Zufallspasswort verwenden und an die angegebene E-Mail-Adresse versenden",
        "createaccountmail-help": "Kann verwendet werden, um für eine andere Person ein Benutzerkonto zu erstellen, ohne das Passwort zu erfahren.",
        "createacct-realname": "Bürgerlicher Name (optional)",
-       "createaccountreason": "Grund:",
        "createacct-reason": "Begründung",
        "createacct-reason-ph": "Warum erstellst du ein anderes Benutzerkonto?",
        "createacct-reason-help": "Im Neuanmeldungs-Logbuch angezeigte Nachricht",
        "preview": "Vorschau",
        "showpreview": "Vorschau zeigen",
        "showdiff": "Änderungen zeigen",
-       "blankarticle": "<strong>Warnung:</strong> Die Seite, die du erstellst, ist leer.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Seite ohne Inhalt erstellt.",
+       "blankarticle": "<strong>Warnung:</strong> Die Seite, die du erstellst, ist leer.\nWenn du erneut auf „$1“ klickst, wird die Seite ohne Inhalt erstellt.",
        "anoneditwarning": "<strong>Warnung:</strong> Du bist nicht angemeldet. Deine IP-Adresse wird öffentlich sichtbar, falls du Bearbeitungen durchführst. Sofern du dich <strong>[$1 anmeldest]</strong> oder <strong>[$2 ein Benutzerkonto erstellst]</strong>, werden deine Bearbeitungen zusammen mit anderen Beiträgen deinem Benutzernamen zugeordnet.",
        "anonpreviewwarning": "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
-       "missingsummary": "<strong>Hinweis:</strong> Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
-       "selfredirect": "<strong>Warnung:</strong> Du leitest auf diese Seite selbst weiter.\nDu hast vermutlich das falsche Weiterleitungsziel angegeben oder du bearbeitest die falsche Seite.\nWenn du erneut auf „{{int:savearticle}}“ klickst, wird die Weiterleitung dennoch erstellt.",
+       "missingsummary": "<strong>Hinweis:</strong> Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „$1“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
+       "selfredirect": "<strong>Warnung:</strong> Du leitest auf diese Seite selbst weiter.\nDu hast vermutlich das falsche Weiterleitungsziel angegeben oder du bearbeitest die falsche Seite.\nWenn du erneut auf „$1“ klickst, wird die Weiterleitung dennoch erstellt.",
        "missingcommenttext": "Bitte gib unten einen Kommentar ein.",
-       "missingcommentheader": "<strong>Achtung:</strong> Du hast keinen Betreff eingegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
+       "missingcommentheader": "<strong>Achtung:</strong> Du hast keinen Betreff eingegeben. Wenn du erneut auf „$1“ klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
        "summary-preview": "Vorschau der Zusammenfassungszeile:",
        "subject-preview": "Vorschau der Zusammenfassungszeile:",
        "previewerrortext": "Beim Versuch, eine Vorschau deiner Änderungen anzuzeigen, ist ein Fehler aufgetreten.",
        "editingsection": "Bearbeiten von „$1“ (Abschnitt)",
        "editingcomment": "Bearbeiten von „$1“ (Neuer Abschnitt)",
        "editconflict": "Bearbeitungskonflikt: $1",
-       "explainconflict": "Jemand anders hat diese Seite geändert, nachdem du angefangen hast, sie zu bearbeiten.\nDas obere Textfeld enthält den aktuellen Bearbeitungsstand der Seite.\nDas untere Textfeld enthält deine Änderungen.\nBitte füge deine Änderungen in das obere Textfeld ein.\n'''Nur''' der Inhalt des oberen Textfeldes wird gespeichert, wenn du auf „{{int:savearticle}}“ klickst.",
+       "explainconflict": "Jemand anders hat diese Seite geändert, nachdem du angefangen hast, sie zu bearbeiten.\nDas obere Textfeld enthält den aktuellen Bearbeitungsstand der Seite.\nDas untere Textfeld enthält deine Änderungen.\nBitte füge deine Änderungen in das obere Textfeld ein.\n<strong>Nur</strong> der Inhalt des oberen Textfeldes wird gespeichert, wenn du auf „$1“ klickst.",
        "yourtext": "Dein Text",
        "storedversion": "Gespeicherte Version",
        "nonunicodebrowser": "'''Achtung: Dein Browser kann Unicode-Zeichen nicht richtig verarbeiten.''' Es wird eine Hilfsroutine eingesetzt, um dir zu erlauben, Seiten sicher zu bearbeiten: Nicht-ASCII-Zeichen werden dabei im Bearbeitungsfenster als hexadezimale Codes angezeigt.",
        "readonlywarning": "<strong>Achtung: Die Datenbank wurde für Wartungsarbeiten gesperrt, so dass deine Änderungen derzeit nicht gespeichert werden können.\nSichere den Text bitte lokal auf deinem Computer und versuche zu einem späteren Zeitpunkt, die Änderungen zu übertragen.</strong>\n\nGrund für die Sperre: $1",
        "protectedpagewarning": "<strong>Achtung: Diese Seite wurde geschützt. Nur Benutzer mit Administratorrechten können die Seite bearbeiten.</strong>\nZur Information folgt der aktuelle Logbucheintrag:",
        "semiprotectedpagewarning": "'''Halbsperrung:''' Die Seite wurde so geschützt, dass nur registrierte Benutzer diese ändern können.\nZur Information folgt der aktuelle Logbucheintrag:",
-       "cascadeprotectedwarning": "<strong>Achtung:</strong> Diese Seite wurde so geschützt, dass sie nur durch Benutzer mit Administratorrechten bearbeitet werden kann. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:",
+       "cascadeprotectedwarning": "<strong>Achtung:</strong> Diese Seite wurde so geschützt, dass sie nur durch Benutzer mit [[Special:ListGroupRights|besonderen Rechten]] bearbeitet werden kann. Sie ist in {{PLURAL:$1|der folgenden Seite|den folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:",
        "titleprotectedwarning": "'''Achtung: Die Seitenerstellung wurde so geschützt, dass nur Benutzer mit [[Special:ListGroupRights|speziellen Rechten]] diese Seite erstellen können.'''\nZur Information folgt der aktuelle Logbucheintrag:",
        "templatesused": "{{PLURAL:$1|Die folgende Vorlage wird|Folgende Vorlagen werden}} auf dieser Seite verwendet:",
        "templatesusedpreview": "{{PLURAL:$1|Die folgende Vorlage wird|Folgende Vorlagen werden}} von dieser Seitenvorschau verwendet:",
        "post-expand-template-argument-warning": "'''Warnung:''' Diese Seite enthält mindestens einen Parameter in einer Vorlage, der expandiert zu groß ist. Diese Parameter werden ignoriert.",
        "post-expand-template-argument-category": "Seiten mit ignorierten Vorlagenparametern",
        "parser-template-loop-warning": "Vorlagenschleife entdeckt: [[$1]]",
+       "template-loop-category": "Seiten mit Vorlagenschleifen",
+       "template-loop-category-desc": "Die Seite enthält eine Vorlagenschleife, z.&nbsp;B. eine Vorlage, die sich selbst rekursiv aufruft.",
        "parser-template-recursion-depth-warning": "Vorlagenrekursionstiefengrenze überschritten ($1)",
        "language-converter-depth-warning": "Sprachkonvertertiefenlimit überschritten ($1)",
        "node-count-exceeded-category": "Seiten, die die Knotenanzahl überschritten haben",
        "page_first": "Anfang",
        "page_last": "Ende",
        "histlegend": "Zur Anzeige der Änderungen einfach die zu vergleichenden Versionen auswählen und die Schaltfläche „{{int:compareselectedversions}}“ klicken.<br />\n* ({{int:cur}}) = Unterschied zur aktuellen Version, ({{int:last}}) = Unterschied zur vorherigen Version\n* Uhrzeit/Datum = Version zu dieser Zeit, Benutzername/IP-Adresse des Bearbeiters, {{int:minoreditletter}} = Kleine Änderung",
-       "history-fieldset-title": "In der Versionsgeschichte suchen",
+       "history-fieldset-title": "Nach Versionen suchen",
        "history-show-deleted": "Nur gelöschte Versionen zeigen",
        "histfirst": "älteste",
        "histlast": "neueste",
        "search-file-match": "(treffende Dateiinhalte)",
        "search-suggest": "Meintest du „$1“?",
        "search-rewritten": "Es werden die Ergebnisse für $1 angezeigt. Stattdessen nach $2 suchen.",
-       "search-interwiki-caption": "Schwesterprojekte",
+       "search-interwiki-caption": "Ergebnisse von Schwesterprojekten",
        "search-interwiki-default": "Ergebnisse von $1:",
        "search-interwiki-more": "(weitere)",
        "search-interwiki-more-results": "Weitere Ergebnisse",
        "prefs-help-prefershttps": "Diese Einstellung wird bei deiner nächsten Anmeldung wirksam.",
        "prefswarning-warning": "Du hast Änderungen an deinen Einstellungen durchgeführt, die noch nicht gespeichert wurden.\nWenn du diese Seite verlässt ohne auf „$1“ zu klicken, werden deine Einstellungen nicht aktualisiert.",
        "prefs-tabs-navigation-hint": "Tipp: Du kannst die linke und rechte Pfeiltasten benutzen, um zwischen den Registerkarten in der Reiterliste zu navigieren.",
-       "userrights": "Benutzerrechte verwalten",
+       "userrights": "Benutzerrechte",
        "userrights-lookup-user": "Einen Benutzer auswählen",
        "userrights-user-editname": "Benutzername:",
        "editusergroup": "Benutzergruppen laden",
        "userrights-groupsmember": "Mitglied von:",
        "userrights-groupsmember-auto": "Automatisch Mitglied von:",
        "userrights-groupsmember-type": "$2",
-       "userrights-groups-help": "Du kannst die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:\n* Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.\n* Ein nicht markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht Mitglied dieser Gruppe ist.\n* Ein * bedeutet, dass du das Benutzerrecht nach Erteilung nicht wieder zurücknehmen kannst (oder umgekehrt).\n* Ein # bedeutet, dass du den Zeitpunkt des Ablaufs dieser Gruppe nur nach hinten verschieben kannst. Du kannst ihn nicht vorverlegen.",
+       "userrights-groups-help": "Du kannst die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:\n* Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.\n* Ein nicht markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht Mitglied dieser Gruppe ist.\n* Ein * bedeutet, dass du das Benutzerrecht nach Erteilung nicht wieder zurücknehmen kannst (oder umgekehrt).\n* Ein # bedeutet, dass du den Zeitpunkt des Ablaufs dieser Gruppenmitgliedschaft nur nach hinten verschieben kannst. Du kannst ihn nicht vorverlegen.",
        "userrights-reason": "Grund:",
        "userrights-no-interwiki": "Du hast nicht die erforderliche Berechtigung, um Benutzerrechte in anderen Wikis ändern zu können.",
        "userrights-nodatabase": "Die Datenbank $1 ist nicht vorhanden oder nicht lokal.",
        "userrights-expiry-options": "1 Tag:1 day,1 Woche:1 week,1 Monat:1 month,3 Monate:3 months,6 Monate:6 months,1 Jahr:1 year",
        "userrights-invalid-expiry": "Die Ablaufzeit für die Gruppe „$1“ ist ungültig.",
        "userrights-expiry-in-past": "Die Ablaufzeit für die Gruppe „$1“ liegt in der Vergangenheit.",
-       "userrights-cannot-shorten-expiry": "Du kannst den Ablauf der Gruppe „$1“ nicht vorverlegen. Nur Benutzer mit der Berechtigung, diese Gruppe hinzuzufügen und zu entfernen, können Ablaufzeiten vorverlegen.",
+       "userrights-cannot-shorten-expiry": "Du kannst den Ablauf der Mitgliedschaft in der Gruppe „$1“ nicht vorverlegen. Nur Benutzer mit der Berechtigung, diese Gruppe hinzuzufügen und zu entfernen, können Ablaufzeiten vorverlegen.",
        "userrights-conflict": "Benutzerrechteänderungskonflikt! Bitte überprüfe und bestätige deine Änderungen.",
        "group": "Gruppe:",
        "group-user": "Benutzer",
        "right-editsemiprotected": "Seiten bearbeiten, die als „{{int:protect-level-autoconfirmed}}“ geschützt sind",
        "right-editcontentmodel": "Das Inhaltsmodell einer Seite bearbeiten",
        "right-editinterface": "Systemnachrichten und Benutzeroberflächen bearbeiten",
-       "right-editusercssjs": "Fremde CSS- und JavaScript-Dateien bearbeiten",
        "right-editusercss": "Fremde CSS-Dateien bearbeiten",
        "right-edituserjs": "Fremde JavaScript-Dateien bearbeiten",
        "right-editmyusercss": "Eigene Benutzer-CSS-Dateien bearbeiten",
        "recentchanges-legend-plusminus": "''(±123)''",
        "recentchanges-submit": "Anzeigen",
        "rcfilters-activefilters": "Aktive Filter",
+       "rcfilters-quickfilters": "Schnell-Links",
+       "rcfilters-quickfilters-placeholder-title": "Noch keine Links gespeichert",
+       "rcfilters-quickfilters-placeholder-description": "Um deine Filtereinstellungen zu speichern und später erneut zu verwenden, klicke unten auf das Lesezeichensymbol im Bereich der aktiven Filter.",
+       "rcfilters-savedqueries-defaultlabel": "Gespeicherte Filter",
+       "rcfilters-savedqueries-rename": "Umbenennen",
+       "rcfilters-savedqueries-setdefault": "Als Standard festlegen",
+       "rcfilters-savedqueries-unsetdefault": "Als Standard entfernen",
+       "rcfilters-savedqueries-remove": "Entfernen",
+       "rcfilters-savedqueries-new-name-label": "Name",
+       "rcfilters-savedqueries-apply-label": "Schnell-Link erstellen",
+       "rcfilters-savedqueries-cancel-label": "Abbrechen",
+       "rcfilters-savedqueries-add-new-title": "Filter als Schnell-Link speichern",
        "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-whatsthis": "Was ist das?",
+       "rcfilters-filterlist-feedbacklink": "Rückmeldung zu den neuen (Beta-)Filtern hinterlassen",
        "rcfilters-highlightbutton-title": "Ergebnisse hervorheben",
        "rcfilters-highlightmenu-title": "Eine Farbe auswählen",
+       "rcfilters-highlightmenu-help": "Eine Farbe auswählen, um diese Eigenschaft hervorzuheben.",
        "rcfilters-filterlist-noresults": "Keine Filter gefunden",
+       "rcfilters-noresults-conflict": "Keine Ergebnisse gefunden, da sich die Suchkriterien in Konflikt befinden.",
+       "rcfilters-state-message-subset": "Dieser Filter hat keinen Effekt, da seine Ergebnisse mit denen {{PLURAL:$2|des folgenden breiteren Filters|der folgenden breiteren Filter}} einbezogen sind (versuche die Hervorhebung, um sie zu unterscheiden): $1",
+       "rcfilters-state-message-fullcoverage": "Das Auswählen aller Filter in einer Gruppe ist das Gleiche wie das Auswählen keines Filters. Deshalb hat dieser Filter keinen Effekt. Die Gruppe enthält: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "Dieser Filter befindet sich in Konflikt mit {{PLURAL:$2|dem folgenden Erfahrungsfilter, der nur angemeldete Benutzer finden kann|den folgenden Erfahrungsfiltern, die nur angemeldete Benutzer finden können}}: $1",
+       "rcfilters-filtergroup-authorship": "Beitrags-Autorenschaft",
+       "rcfilters-filter-editsbyself-label": "Änderungen von dir",
+       "rcfilters-filter-editsbyself-description": "Deine eigenen Beiträge.",
+       "rcfilters-filter-editsbyother-label": "Änderungen von anderen",
+       "rcfilters-filter-editsbyother-description": "Alle Änderungen außer deine eigenen.",
        "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-user-experience-level-conflicts-unregistered": "Erfahrungsfilter finden nur angemeldete Benutzer. Deshalb befindet sich dieser Filter in Konflikt mit dem Filter „Unangemeldet“.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Der Filter „Unangemeldet“ befindet sich in Konflikt mit einem oder mehreren Erfahrungsfiltern, die nur angemeldete Benutzer finden können. Die kollidierenden Filter sind oben im Bereich der aktiven Filter markiert.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Neulinge",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Weniger als 10 Bearbeitungen und eine Aktivität von weniger als 4 Tagen.",
+       "rcfilters-filter-user-experience-level-learner-label": "Anfänger",
+       "rcfilters-filter-user-experience-level-learner-description": "Mehr Erfahrung als „Neulinge“, aber weniger als „Erfahrene Benutzer“.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Erfahrene Benutzer",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Überprüfungsstatus",
+       "rcfilters-filter-patrolled-label": "Kontrolliert",
+       "rcfilters-filter-patrolled-description": "Bearbeitungen, die als kontrolliert markiert sind.",
+       "rcfilters-filter-unpatrolled-label": "Unkontrolliert",
+       "rcfilters-filter-unpatrolled-description": "Bearbeitungen, die nicht als kontrolliert markiert sind.",
        "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-watchlist": "Beobachtete Seiten",
+       "rcfilters-filter-watchlist-watched-label": "Auf der Beobachtungsliste",
+       "rcfilters-filter-watchlist-watched-description": "Änderungen an Seiten auf deiner Beobachtungsliste.",
+       "rcfilters-filter-watchlist-watchednew-label": "Neue Beobachtungslisten-Änderungen",
+       "rcfilters-filter-watchlist-watchednew-description": "Änderungen an beobachteten Seiten, die du nicht besucht hast, seitdem die Änderungen auftraten.",
+       "rcfilters-filter-watchlist-notwatched-label": "Nicht auf der Beobachtungsliste",
+       "rcfilters-filter-watchlist-notwatched-description": "Alle außer Änderungen an deinen beobachteten Seiten.",
        "rcfilters-filtergroup-changetype": "Typ der Änderung",
        "rcfilters-filter-pageedits-label": "Seitenbearbeitungen",
        "rcfilters-filter-pageedits-description": "Änderungen am Wikiinhalt oder an Diskussionen, Kategoriebeschreibungen …",
        "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 …",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Der Filter „Kleine Bearbeitungen“ kollidiert mit einem oder mehreren Änderungstypfiltern, da bestimmte Änderungstypen nicht als „klein“ festgelegt werden können. Die kollidierenden Filter sind oben im Bereich der aktiven Filter markiert.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Bestimmte Änderungstypen können nicht als „klein“ festgelegt werden, so dass dieser Filter mit den folgenden Änderungstypfiltern kollidiert: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Dieser Änderungstypfilter kollidiert mit dem Filter „Kleine Bearbeitungen“. Bestimmte Änderungstypen können nicht als „klein“ festgelegt werden.",
+       "rcfilters-filtergroup-lastRevision": "Letzte Version",
+       "rcfilters-filter-lastrevision-label": "Letzte Version",
+       "rcfilters-filter-lastrevision-description": "Die aktuellste Änderung an einer Seite.",
+       "rcfilters-filter-previousrevision-label": "Frühere Versionen",
+       "rcfilters-filter-previousrevision-description": "Alle Änderungen, die nicht die aktuellste Änderung an einer Seite sind.",
        "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit <strong>$3, $4</strong> (max. <strong>$1</strong> Einträge).",
+       "rclistfromreset": "Datumsauswahl zurücksetzen",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "rcshowhideminor": "Kleine Änderungen $1",
        "rcshowhideminor-show": "anzeigen",
        "rcshowhidecategorization": "Seitenkategorisierungen $1",
        "rcshowhidecategorization-show": "anzeigen",
        "rcshowhidecategorization-hide": "ausblenden",
-       "rclinks": "Zeige die letzten $1 Änderungen der letzten $2 Tage.<br />$3",
+       "rclinks": "Zeige die letzten $1 Änderungen der letzten $2 Tage.",
        "diff": "Unterschied",
        "hist": "Versionen",
        "hide": "ausblenden",
        "php-uploaddisabledtext": "Das Hochladen von Dateien wurde in PHP deaktiviert.\nBitte überprüfe die <code>file_uploads</code>-Einstellung.",
        "uploadscripted": "Diese Datei enthält HTML- oder Scriptcode, der irrtümlich von einem Webbrowser ausgeführt werden könnte.",
        "upload-scripted-pi-callback": "Es kann keine Datei hochgeladen werden, die XML-Stylesheet-Verarbeitungsbefehle enthält.",
+       "upload-scripted-dtd": "Es können keine SVG-Dateien hochgeladen werden, die keine Standard-DTD-Deklaration enthalten.",
        "uploaded-script-svg": "Skriptelement „$1“ in der hochgeladenen SVG-Datei gefunden.",
        "uploaded-hostile-svg": "Unsicheres CSS im Styleelement der hochgeladenen SVG-Datei gefunden.",
        "uploaded-event-handler-on-svg": "Das Festlegen von Ereignis-Handler-Attributen <code>$1=\"$2\"</code> ist in SVG-Dateien nicht erlaubt.",
        "enotif_body_intro_moved": "Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} verschoben. Siehe $3 für deren aktuelle Version.",
        "enotif_body_intro_restored": "Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} wiederhergestellt. Siehe $3 für deren aktuelle Version.",
        "enotif_body_intro_changed": "Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} geändert. Siehe $3 für deren aktuelle Version.",
-       "enotif_lastvisited": "Alle Änderungen auf einen Blick: $1",
-       "enotif_lastdiff": "Siehe $1 für diese Änderung.",
+       "enotif_lastvisited": "Für alle Änderungen seit deinem letzten Besuch, siehe $1",
+       "enotif_lastdiff": "Um diese Änderung anzusehen, siehe $1",
        "enotif_anon_editor": "Anonymer Benutzer $1",
        "enotif_body": "Hallo $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nZusammenfassung des Bearbeiters: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt zum Bearbeiter:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nBei weiterer Aktivität auf der Seite werden dir so lange keine weiteren Benachrichtigungs-E-Mails gesendet, bis du die Seite wieder angemeldet besucht hast. Auf deiner Beobachtungsliste kannst du alle Benachrichtigungsmarkierungen zusammen zurücksetzen.\n\nDein freundliches {{SITENAME}}-Benachrichtigungssystem\n\n--\nUm die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuche {{canonicalurl:{{#special:Preferences}}}}.\n\nUm die Einstellungen deiner Beobachtungsliste anzupassen, besuche {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nUm die Seite von deiner Beobachtungsliste herunterzunehmen, besuche $UNWATCHURL.\n\nRückmeldungen und weitere Hilfe: $HELPPAGE",
        "created": "erstellt",
        "rollback-missingparam": "In der Anfrage fehlen erforderliche Parameter.",
        "rollback-missingrevision": "Die Versionsdaten konnten nicht geladen werden.",
        "cantrollback": "Die Änderung kann nicht zurückgesetzt werden, da es keine früheren Autoren gibt.",
-       "alreadyrolled": "Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da in der Zwischenzeit ein anderer Benutzer die Seite geändert hat.\n\nDie letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da bereits ein anderer Benutzer die Seite geändert hat.\n\nDie letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Die Änderungszusammenfassung lautet: <em>$1</em>.",
        "revertpage": "Änderungen von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
        "revertpage-nouser": "Änderungen von einem versteckten Benutzer rückgängig gemacht und letzte Version von {{GENDER:$1|[[User:$1|$1]]}} wiederhergestellt",
        "undeleteviewlink": "ansehen",
        "undeleteinvert": "Auswahl umkehren",
        "undeletecomment": "Grund:",
-       "undeletedrevisions": "{{PLURAL:$1|1 Version wurde|$1 Versionen wurden}} wiederhergestellt",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Version|$1 Versionen}} und {{PLURAL:$2|1 Datei|$2 Dateien}} wurden wiederhergestellt",
-       "undeletedfiles": "{{PLURAL:$1|1 Datei wurde|$1 Dateien wurden}} wiederhergestellt",
        "cannotundelete": "Einige oder alle Wiederherstellungen sind fehlgeschlagen:\n$1",
        "undeletedpage": "'''„$1“''' wurde wiederhergestellt.\n\nIm [[Special:Log/delete|Lösch-Logbuch]] findest du eine Übersicht der gelöschten und wiederhergestellten Seiten.",
        "undelete-header": "Siehe das [[Special:Log/delete|Lösch-Logbuch]] für kürzlich gelöschte Seiten.",
        "sp-contributions-uploads": "Hochgeladene Dateien",
        "sp-contributions-logs": "Logbücher",
        "sp-contributions-talk": "Diskussion",
-       "sp-contributions-userrights": "Benutzerrechte­verwaltung",
+       "sp-contributions-userrights": "{{GENDER:$1|Benutzerrechte­verwaltung}}",
        "sp-contributions-blocked-notice": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} ist derzeit gesperrt. Es folgt der aktuelle Eintrag aus dem Benutzersperr-Logbuch:",
        "sp-contributions-blocked-notice-anon": "Diese IP-Adresse ist zurzeit gesperrt.\nZur Information folgt der aktuelle Auszug aus dem Sperr-Logbuch:",
        "sp-contributions-search": "Suche nach Benutzerbeiträgen",
        "unblocked-id": "Sperr-ID $1 wurde freigegeben",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] wurde freigegeben.",
        "blocklist": "Gesperrte Benutzer",
+       "autoblocklist": "Automatische Sperren",
+       "autoblocklist-submit": "Suchen",
+       "autoblocklist-legend": "Automatische Sperren auflisten",
+       "autoblocklist-localblocks": "Lokale automatische {{PLURAL:$1|Sperre|Sperren}}",
+       "autoblocklist-empty": "Die Liste der automatischen Sperren ist leer.",
+       "autoblocklist-otherblocks": "Andere automatische {{PLURAL:$1|Sperre|Sperren}}",
        "ipblocklist": "Gesperrte Benutzer",
        "ipblocklist-legend": "Suche nach einem gesperrten Benutzer",
        "blocklist-userblocks": "Benutzersperren ausblenden",
        "tooltip-pt-mycontris": "Liste {{GENDER:|eigener}} Beiträge",
        "tooltip-pt-anoncontribs": "Eine Liste der Bearbeitungen, die von dieser IP-Adresse gemacht wurden",
        "tooltip-pt-login": "Sich anzumelden wird gerne gesehen, ist jedoch nicht zwingend erforderlich.",
+       "tooltip-pt-login-private": "Du musst dich anmelden, um dieses Wiki zu nutzen.",
        "tooltip-pt-logout": "Abmelden",
        "tooltip-pt-createaccount": "Wir ermutigen dich dazu, ein Benutzerkonto zu erstellen und dich anzumelden. Es ist jedoch nicht zwingend erforderlich.",
        "tooltip-ca-talk": "Diskussion zum Seiteninhalt",
        "anonymous": "{{PLURAL:$1|Unangemeldeter Benutzer|Unangemeldete Benutzer}} auf {{SITENAME}}",
        "siteuser": "{{SITENAME}}-{{GENDER:$2|Benutzer|Benutzerin}} $1",
        "anonuser": "Anonymer {{SITENAME}}-Benutzer $1",
-       "lastmodifiedatby": "Diese Seite wurde zuletzt am $1 um $2 Uhr von $3 geändert.",
+       "lastmodifiedatby": "Diese Seite wurde zuletzt am $1 um $2 Uhr von $3 bearbeitet.",
        "othercontribs": "Basierend auf der Arbeit von $1.",
        "others": "anderen",
        "siteusers": "{{SITENAME}}-{{PLURAL:$2|{{GENDER:$1|Benutzer|Benutzerin}}|Benutzer}} $1",
        "newimages-summary": "Diese Spezialseite zeigt die zuletzt hochgeladenen Dateien an.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateiname (oder ein Teil davon):",
+       "newimages-user": "IP-Adresse oder Benutzername",
        "newimages-showbots": "Von Bots hochgeladene Dateien anzeigen",
        "newimages-hidepatrolled": "Kontrollierte Dateien ausblenden",
        "noimages": "Keine Dateien gefunden.",
        "confirmrecreate": "{{GENDER:$1|Der Benutzer|Die Benutzerin}} [[User:$1|$1]] ([[User talk:$1|Diskussion]]) hat diese Seite gelöscht, nachdem du angefangen hast, sie zu bearbeiten. Die Begründung lautete:\n: <em>$2</em>\nBitte bestätige, dass du diese Seite wirklich neu erstellen möchtest.",
        "confirmrecreate-noreason": "{{GENDER:$1|Der Benutzer|Die Benutzerin}} [[User:$1|$1]] ([[User talk:$1|Diskussion]]) hat diese Seite gelöscht, nachdem du mit der Bearbeitung begonnen hast. Bitte bestätige, dass du die Seite wirklich erneut erstellen möchtest.",
        "recreate": "Neu erstellen",
+       "confirm-purge-title": "Diese Seite aktualisieren",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Diese Seite aus dem Server-Cache löschen?",
        "confirm-purge-bottom": "Leert den Cache einer Seite und erzwingt die Anzeige der aktuellen Version.",
        "table_pager_first": "Erste Seite",
        "table_pager_last": "Letzte Seite",
        "table_pager_limit": "Zeige $1 Einträge pro Seite",
-       "table_pager_limit_label": "Positionen pro Seite:",
+       "table_pager_limit_label": "Einträge pro Seite:",
        "table_pager_limit_submit": "Los",
        "table_pager_empty": "Keine Ergebnisse",
        "autosumm-blank": "Die Seite wurde geleert.",
        "htmlform-user-not-valid": "<strong>$1</strong> ist kein gültiger Benutzername.",
        "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seite $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|löschte}} die Weiterleitung $3 durch Überschreiben",
-       "logentry-delete-restore": "$1 {{GENDER:$2|stellte}} Seite $3 wieder her",
+       "logentry-delete-restore": "$1 {{GENDER:$2|stellte}} die Seite „$3“ wieder her ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|stellte}} die Seite „$3“ wieder her",
+       "restore-count-revisions": "{{PLURAL:$1|Eine Version|$1 Versionen}}",
+       "restore-count-files": "{{PLURAL:$1|Eine Datei|$1 Dateien}}",
        "logentry-delete-event": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|einer Version|von $5 Versionen}} der Seite $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit von Logbucheinträgen auf $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|aktualisierte}} Markierungen der Version $4 der Seite $3 ($6 {{PLURAL:$7|hinzugefügt}}; $8 {{PLURAL:$9|entfernt}})",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|aktualisierte}} Markierungen des Logbucheintrags $5 der Seite $3 ($6 {{PLURAL:$7|hinzugefügt}}; $8 {{PLURAL:$9|entfernt}})",
        "rightsnone": "(–)",
-       "revdelete-summary": "Zusammenfassungskommentar",
        "rightslogentry-temporary-group": "$1 (temporär, bis $2)",
        "feedback-adding": "Rückmeldung wird zur Seite hinzugefügt …",
        "feedback-back": "Zurück",
        "special-characters-group-thai": "Thailändisch",
        "special-characters-group-lao": "Laotisch",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Kanadische Silbenschrift",
        "special-characters-title-endash": "Halbgeviertstrich",
        "special-characters-title-emdash": "Geviertstrich",
        "special-characters-title-minus": "Minus",
        "mw-widgets-titleinput-description-redirect": "Weiterleitung nach $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Eine Kategorie hinzufügen …",
        "mw-widgets-usersmultiselect-placeholder": "Weitere hinzufügen …",
+       "date-range-from": "Von Datum:",
+       "date-range-to": "Bis Datum:",
        "sessionmanager-tie": "Mehrere Anfrageauthentifikationstypen konnten nicht kombiniert werden: $1.",
        "sessionprovider-generic": "$1-Sitzungen",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebasierten Sitzungen",
        "restrictionsfield-label": "Erlaubte IP-Adressbereiche:",
        "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
        "revid": "Version $1",
-       "pageid": "Seitenkennung $1"
+       "pageid": "Seitenkennung $1",
+       "rawhtml-notallowed": "&lt;html&gt;-Tags können nicht außerhalb von normalen Seiten verwendet werden.",
+       "gotointerwiki": "{{SITENAME}} verlassen",
+       "gotointerwiki-invalid": "Der angegebene Titel ist ungültig.",
+       "gotointerwiki-external": "Du bist dabei, {{SITENAME}} zu verlassen, um [[$2]] zu besuchen, was eine externe Website ist.\n\n'''[$1 Auf $1 fortfahren]'''",
+       "undelete-cantedit": "Du kannst diese Seite nicht wiederherstellen, da du nicht berechtigt bist, diese Seite zu bearbeiten.",
+       "undelete-cantcreate": "Du kannst diese Seite nicht wiederherstellen, da es keine vorhandene Seite mit diesem Namen gibt und du nicht berechtigt bist, diese Seite zu erstellen."
 }
diff --git a/languages/i18n/din.json b/languages/i18n/din.json
new file mode 100644 (file)
index 0000000..e88d6a9
--- /dev/null
@@ -0,0 +1,515 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Amire80",
+                       "Dinkawiki",
+                       "Kumkumuk",
+                       "Mawanmuortat"
+               ]
+       },
+       "sunday": "Nïnëdhorou",
+       "monday": "Nïnëtök",
+       "tuesday": "Nïnërou",
+       "wednesday": "Nïnëdiäk",
+       "thursday": "Nïnëŋuan",
+       "friday": "Nïnëdhiëc",
+       "saturday": "Nïnëdhetem",
+       "sun": "Ndhr",
+       "mon": "Ntö",
+       "tue": "Nro",
+       "wed": "Ndi",
+       "thu": "Nŋu",
+       "fri": "Ndhi",
+       "sat": "Ndhe",
+       "january": "Pɛnëtök",
+       "february": "Pɛnërou",
+       "march": "Pɛnëdiäk",
+       "april": "Pɛnëŋuan",
+       "may_long": "Pɛnëdhiëc",
+       "june": "Pɛnëdhetem",
+       "july": "Pɛnëdhorou",
+       "august": "Pɛnëbɛ̈t",
+       "september": "Pɛnëdhoŋuan",
+       "october": "Pɛnëthiäär",
+       "november": "Pɛnëthiäärkutök",
+       "december": "Pɛnëthiäärkurou",
+       "january-gen": "Pɛnëtök",
+       "february-gen": "Pɛnërou",
+       "march-gen": "Pɛnëdiäk",
+       "april-gen": "Pɛnëŋuan",
+       "may-gen": "Pɛnëdhiëc",
+       "june-gen": "Pɛnëdhetem",
+       "july-gen": "Pɛnëdhorou",
+       "august-gen": "Pɛnëbɛ̈t",
+       "september-gen": "Pɛnëdhoŋuan",
+       "october-gen": "Pɛnëthiäär",
+       "november-gen": "Pɛnëthiäärkutök",
+       "december-gen": "Pɛnëthiäärkurou",
+       "jan": "Ptö",
+       "feb": "Pro",
+       "mar": "Pdi",
+       "apr": "Pŋu",
+       "may": "Pdhi",
+       "jun": "Pdhe",
+       "jul": "Pdhr",
+       "aug": "Pbɛ̈",
+       "sep": "Pdhŋ",
+       "oct": "Pthi",
+       "nov": "Ptht",
+       "dec": "Pthr",
+       "pagecategories": "{{PLURAL:$1|atëkthok|atëkthuɔk}}",
+       "category_header": "Apääm në atëkthok \"$1\"ic",
+       "subcategories": "Tëktëëkor",
+       "category-media-header": "Kuat në alëk $1 yic",
+       "hidden-categories": "{{PLURAL:$1|Atëkthok cï thiaan|Atëkthuɔk cï thiaan}}",
+       "category-subcat-count": "{{PLURAL:$2|Akuutkäŋë anɔŋ akutkäŋ-thiikɛ̈ kepɛ̈c.|Akuutkäŋë anɔŋ \n{{PLURAL:$1|akuutkäŋë|$1 akuutkäŋkɛ̈}}, në $2 yic̈;}}",
+       "category-article-count": "{{PLURAL:$2|Bekätakthookë anɔŋic yärë yetök.|{{PLURAL:$1|Yärë atɔ̈|$1 yɔ̈rkɛ̈ aatɔ̈}} bekätakthook thiöökë yic, në $2 yic.}}",
+       "category-file-count": "{{PLURAL:$2|Bekätakthook kän anɔŋic wëtmät kän etök.|{{PLURAL:|Wëtmät de $1 thiöökë atɔ̈ |wëlmäät ke $1 thiookkɛ̈ aa tɔ̈}} në bekätakthook känic, në $2 yiic ëbɛ̈n.}}",
+       "listingcontinuesabbrev": "ɣäthtueŋ",
+       "about": "Biäk",
+       "newwindow": "(aliɛp adhɛɛr yam thïn)",
+       "cancel": "Tɛmkɔ̈u",
+       "mypage": "Apam",
+       "mytalk": "Jam",
+       "anontalk": "Jam",
+       "navigation": "Äden",
+       "and": "&#32;ku",
+       "qbedit": "Cokic",
+       "namespaces": "Rinɣɔnläu",
+       "variants": "Aalelthook",
+       "navigation-heading": "Dentënëɔ̈ɔ̈tu",
+       "returnto": "Dhuk lɔ $1.",
+       "tagline": "Jɔk {{SITENAME}}",
+       "help": "Kuɔny",
+       "search": "Yiɔ̈ɔ̈p",
+       "searchbutton": "Yiɔ̈ɔ̈p",
+       "go": "Lɔ",
+       "searcharticle": "Lɔ",
+       "history": "Käthɛɛr ë apäm",
+       "history_short": "Käthɛɛr",
+       "history_small": "käthɛɛr",
+       "printableversion": "Alelgäär",
+       "permalink": "Anuɛ̈t ciedɔ̈kic",
+       "view": "Ɣoi",
+       "view-foreign": "Ɣoi në $1ic",
+       "edit": "Cokic",
+       "create": "Cak",
+       "create-local": "Matë tɛ̈ɛ̈tëyic ë  ɣänthiök thïn",
+       "editthispage": "Cok apamë-yic",
+       "newpage": "Apam yam",
+       "talkpagelinktext": "jam",
+       "personaltools": "Kakëluɔi ke ŋɛk",
+       "talk": "Abëjaamic",
+       "views": "Cïtiŋna",
+       "toolbox": "Käkluɔi",
+       "otherlanguages": "Në thook kɔ̈kiic",
+       "redirectedfrom": "(Cï bɛn wel në $1ic)",
+       "redirectto": "Bɛnwel lɔ:",
+       "lastmodifiedat": "Apam kënë acï apuɔc dac waaric në pɛinïn $1, në $2.",
+       "jumpto": "Kɛɛcthïn:",
+       "jumptonavigation": "äden",
+       "jumptosearch": "yiɔ̈ɔ̈p",
+       "aboutsite": "Wɛ̈t ë {{SITENAME}}",
+       "aboutpage": "Project:Biäk",
+       "copyrightpage": "{{ns:project}}:Yicaagɛ̈ɛ̈t",
+       "currentevents": "Kä cë röt piac looi",
+       "currentevents-url": "Project:Kä cë röt piac looi",
+       "disclaimers": "Acëkakuɔ",
+       "disclaimerpage": "Project:Acëkëda ëbɛ̈n",
+       "edithelp": "Kuɔny bë comic",
+       "helppage-top-gethelp": "Kony",
+       "mainpage": "Apam këdït",
+       "mainpage-description": "Apam këdït",
+       "portal": "Tëlɔthïn wut",
+       "portal-url": "Project:Tëlɔthïn wut",
+       "privacy": "Löŋ këcïthiaan",
+       "privacypage": "Project:Löŋ këcïthiaan",
+       "retrievedfrom": "Cïdhuk në \"$1\"",
+       "editsection": "cokic",
+       "editold": "cokic",
+       "editlink": "cokic",
+       "viewsourcelink": "Ɣoi tënëyök",
+       "editsectionhint": "Cokic akut: $1",
+       "toc": "Kätɔ̈",
+       "showtoc": "nyooth",
+       "hidetoc": "thaan",
+       "site-atom-feed": "$1 Atɛ̈unyinmot thïn",
+       "page-atom-feed": "\"$1\" Atɛ̈unyinmot thïn",
+       "red-link-title": "$1 (apam cïï tɔ̈)",
+       "nstab-main": "Apam",
+       "nstab-user": "Apam dului",
+       "nstab-special": "Apam lel",
+       "nstab-project": "Apam kälooi",
+       "nstab-image": "Apamduööt",
+       "nstab-template": "Macuëc",
+       "nstab-category": "Atëkthok",
+       "mainpage-nstab": "Apam këdït",
+       "badtitle": "Rin awäc",
+       "badtitletext": "Këjiɛmë ca thiëëcë acïï lɔcök, tëdɛ̈ ka cïn kë tɔ̈u thïn, tëdɛ̈ ka këjiɛmë de thuɔkmɛ̈t wälä de wikimɛ̈t aa këcëkɛ nyiɛc nuet apath. Tëkdɛ̈ kä nɔŋic cït cïï lëu bïke luööi në käjiɛmëkeyiic.",
+       "viewsource": "Ɣoi tënëyök",
+       "yourname": "Rinduloi:",
+       "userlogin-yourname": "Rinduloi",
+       "userlogin-yourname-ph": "Tɔ̈ɔ̈u rinduloiku",
+       "yourpassword": "Wɛ̈tëŋääny:",
+       "userlogin-yourpassword": "Wɛ̈tëŋääny",
+       "userlogin-yourpassword-ph": "Tɔ̈ɔ̈u wëtëŋaany",
+       "createacct-yourpassword-ph": "Tɔ̈ɔ̈u wëtëŋaany",
+       "createacct-yourpasswordagain": "Yiclajiik wɛ̈tëŋaany",
+       "createacct-yourpasswordagain-ph": "Bɛn tɔ̈ɔ̈u wɛ̈tëŋaany",
+       "userlogin-remembermypassword": "Cɔk ya rɛ̈ɛ̈r keya cï liɛp ɣöt",
+       "login": "Ŋaanythïn",
+       "logout": "Ŋaanyaɣeer",
+       "userlogout": "Ŋaanyaɣeer",
+       "userlogin-noaccount": "Cïï nɔŋ cinakuën?",
+       "userlogin-joinproject": "Röm {{SITENAME}}",
+       "createaccount": "Cak cinakuën",
+       "userlogin-resetpassword-link": "Määrnhom wɛ̈tëŋaanyku?",
+       "userlogin-helplink2": "Kuɔny bë ŋaanythïn",
+       "createacct-emailrequired": "Thoŋëmanywëëth",
+       "createacct-emailoptional": "Thoŋëmanywëëth (cïïdhilëwïc)",
+       "createacct-email-ph": "Gɔ̈t tëcieng de thoŋëmanywëëthdu",
+       "createacct-submit": "Cak cinakuënku",
+       "createacct-benefit-heading": "{{SITENAME}} acï looi në kɔc cïmëndu.",
+       "createacct-benefit-body1": "{{PLURAL:$1|käcïcokic|këcïcokic}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|apäm|apääm}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|dujuër|dujuëër}} kathiöökwɛ̈r",
+       "loginlanguagelabel": "Thok: $1",
+       "pt-login": "Ŋaanythïn",
+       "pt-login-button": "Ŋaanythïn",
+       "pt-createaccount": "Cak cinakuën",
+       "pt-userlogout": "Ŋaanyaɣeer",
+       "botpasswords-label-create": "Cak",
+       "botpasswords-label-cancel": "Tɛmkɔ̈u",
+       "resetpass-submit-cancel": "Tɛmkɔ̈u",
+       "passwordreset": "Bentɔ̈ɔ̈u wɛ̈tëŋaany",
+       "passwordreset-username": "Rinduloi:",
+       "passwordreset-email": "Thoŋëmanywëëth:",
+       "bold_sample": "Gɔ̈t dïtnyin",
+       "bold_tip": "Gɔ̈t dïtnyin",
+       "italic_sample": "Rïugäät",
+       "italic_tip": "Gɔ̈t cïrïu",
+       "link_sample": "Nuɛ̈të rinënyooth",
+       "link_tip": "Nuɛ̈t akenythïn",
+       "extlink_sample": "http://www.example.com ruk rin",
+       "extlink_tip": "Nuɛ̈t akenybaai (tauë http:// adöttueeŋ)",
+       "headline_sample": "Gäättueŋ",
+       "headline_tip": "Kuëën ë rou tueŋ",
+       "nowiki_sample": "Tɔ̈ɔ̈uë këcïgɔ̈t cinajuɛɛr thïn",
+       "nowiki_tip": "Dhölë yic ajuɛɛr ë wiki",
+       "image_tip": "Apamduööt cïtɔ̈ɔ̈uthïn",
+       "media_tip": "Nuɛ̈t ë makec",
+       "sig_tip": "Thanygɔ̈tdu kekë gutatiitik",
+       "hr_tip": "Ajït temrɔt (looië tëgöörye)",
+       "summary": "Cuutyic:",
+       "minoredit": "Kën ee acökic thiin",
+       "watchthis": "Ɣoi apamë",
+       "savearticle": "Tɔ̈ɔ̈u apam",
+       "showpreview": "Nyooth këkoŋtiŋ",
+       "showdiff": "Nyoothë käcëwaar",
+       "anoneditwarning": "<strong>Nyïïn:</strong> Yin akɛ̈cë ŋaanythïn.  IP de tëcieŋdu abë tïc tënë jäŋ ëbɛ̈n të gɛ̈t yïn ke waar käŋ. Të <strong>[$1 bɛk yïn ɣöt]</strong> tëdɛ̈ <strong>[$2 të ciɛk yïn cinakuɛ̈n]</strong>, ka kä gɔ̈tke ku kä waarke (ku kä kɔ̈k nɔŋ kony ayɛ) aabï ke gät rinëduluuiku.",
+       "loginreqlink": "Ŋaanythïn",
+       "newarticletext": "Yïn acë anuët lɔ apam liu buɔɔthcök.\nTë wïc yin ba apam kënë cak, ka jɔk ba gɔ̈t në akeer  tɔ̈ piinyic (tïŋ [$1 apamëkuɔny] të wic yin ba wëlëŋïc yök).\nTë tɔ̈ yïn ëtɛ̈n ke kɛ̈ce ŋuun, kayï tuany gakyeethany de <strong>ciëën</strong> në akuenarekwëldu-yic.",
+       "noarticletext": "Amɛn, acïn gɔ̈t tɔ̈ ee apam thiöökë-yic.\nYïn alëu ba [[Special:Search/{{PAGENAME}}|wɛ̈tnhom thiööke göör]] në apam kɔ̈kiic,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} göör cökthɛɛr nɔŋkaariic],\nnadëk [{{fullurl:{{FULLPAGENAME}}|action=edit}} cak apamë]</span>.",
+       "noarticletext-nopermission": "Amɛn, acïn gär ee apam kënë yic.  Yïn alëu ba  [[Special:Search/{{PAGENAME}}|këjiɛɛmë de apam thööke göör]]  këjiɛɛmë de apam thööke göör në apɛmkɔ̈k yiic, tëdɛ̈ ka <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}] yïn alëu ba athörtɔ̈ɔ̈uke nɔŋ kar ke apam thiöökë gööric ayɛ. Lakin, yïn acï  nɔŋ yic ba apam yam cak.",
+       "editing": "Ee cokic $1",
+       "creating": "Ee cak $1",
+       "editingsection": "Ee cok $1 (akut)ic",
+       "templatesused": "{{PLURAL:$1|Macuëc|Mïcuëc}} ee luööi në apam känic",
+       "template-protected": "(cïtiit)",
+       "template-semiprotected": "(gëlamääth)",
+       "hiddencategories": "Apamkën ee rem ë {{PLURAL:$1|1 bekätakthook cï thiaan |$1 bekäŋtakthook cï  thiaan}}:",
+       "permissionserrorstext-withaction": "Yïn acïï nɔŋ nhomlääu ba $2, \n{{PLURAL:$1|wɛ̈t de kän|wët de käk}}:",
+       "moveddeleted-notice": "Apam acï cuɔthwei. Athörtɔ̈ɔ̈u de cothëwei ku nyiɛɛi në apamë aa cïke gam piiny ëtɛ̈n tɔŋ raan wïc bë ke kueen",
+       "content-model-javascript": "JavaScript",
+       "viewpagelogs": "Ɣoi athörtɔ̈ɔ̈u në apamkën",
+       "currentrev-asof": "Dhuɔ̈kic yambëtɛɛm ee bɔ̈bei pɛinïn $1",
+       "revisionasof": "Dhokic tɛ̈cït $1",
+       "revision-info": "Dhuɔ̈kic agut $1 në {{GENDER:$6|$2}}$7",
+       "previousrevision": "← Bïebei thɛɛr",
+       "nextrevision": "Dhuɔ̈k yam tënë kɔ̈k →",
+       "currentrevisionlink": "Dhuɔ̈kic yambëtɛɛm",
+       "cur": "ŋär",
+       "last": "käciën",
+       "rev-delundel": "wak daai",
+       "rev-showdeleted": "nyooth",
+       "pagehist": "Käthɛɛr ë apäm",
+       "history-title": "Dhuɔ̈kic käthɛɛr de \"$1\"",
+       "difference-title": "Käwääc kɛmke dhuɔ̈ɔ̈k ke \"$1\"",
+       "lineno": "Giɛɛt $1:",
+       "editundo": "berëpiny",
+       "diff-multi-sameuser": "({{PLURAL:$1|dhukic ciɛl|$1 dhukiic ciɛl}} në duluui tök̈̈, acie nyuɔɔth)",
+       "searchresults": "Yiɔ̈ɔ̈p käcïyiök",
+       "searchresults-title": "Yiööp \"$1\" në käcïyökic",
+       "prevn": "këcëwan {{PLURAL:$1|$1}}",
+       "nextn": "këböth {{PLURAL:$1|$1}}",
+       "nextn-title": "{{PLURAL:$1|käcïyök|këcïyök}} bɔ̈ $1",
+       "shown-title": "Show $1 {{PLURAL:$1|këcïtuöl|kacïtuöl}} gun yär",
+       "viewprevnext": "Ɣoi ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Cak apam \"[[:$1]]\" në yee wiki känic!</strong> {{PLURAL:$2|0=|Tïŋ apam ee yök kekë göördu ayɛ|Tïŋ käcïyök në göördu ayɛ}}",
+       "searchprofile-articles": "Abɛ̈ɛ̈k kätɔ̈",
+       "searchprofile-images": "Ciɛ̈liicjuëc",
+       "searchprofile-everything": "Ëbɛ̈n",
+       "searchprofile-advanced": "Cï lɔ tueŋ",
+       "searchprofile-articles-tooltip": "Yiɔ̈ɔ̈p $1ic",
+       "searchprofile-images-tooltip": "Apamduööt yiɔ̈ɔ̈p",
+       "searchprofile-everything-tooltip": "Gör kathïn abɛ̈n (agut yɔ̈r jam)",
+       "searchprofile-advanced-tooltip": "Yiɔ̈ɔ̈p në rinlääu këŋiɛcic",
+       "search-result-size": "$1 ({{PLURAL:$2|1 wët|$2 wël}})",
+       "search-redirect": "(bɛnwel $1)",
+       "search-section": "(akut $1)",
+       "search-suggest": "Ee $1 yen ca ŋuun?",
+       "searchall": "ëbɛ̈n",
+       "search-showingresults": "{{PLURAL:$4|Käcïyök <riɛl>$1</riɛl> de <riɛl>$3</riɛl>|Këcïyök <riɛl>$1 - $2</riɛl> de <riɛl>$3</riɛl>}}",
+       "search-nonefound": "Acin këcïbenbei ë thɔ̈ŋ ke thiëc",
+       "preferences": "Känyaar",
+       "mypreferences": "Känyaar",
+       "prefs-watchlist": "Abërtït",
+       "searchresultshead": "Yiɔ̈ɔ̈p",
+       "prefs-searchoptions": "Yiɔ̈ɔ̈p",
+       "prefs-namespaces": "Rinɣɔnläu",
+       "right-writeapi": "Luuië API ë gɔ̈t",
+       "newuserlogpage": "Athörtɔ̈ɔ̈u cäk ë duloi",
+       "enhancedrc-history": "käthɛɛr",
+       "recentchanges": "Kärötdäcwäär",
+       "recentchanges-legend": "Tek cë röt piac waar",
+       "recentchanges-summary": "Buɔɔthë wäär kathiöökwɛ̈rbëtɛɛm në wiki në apaamkën.",
+       "recentchanges-label-newpage": "Cokicë acë apam yam cak",
+       "recentchanges-label-minor": "Kën ee acökic thiin",
+       "recentchanges-label-bot": "Acökic kënë acï looi në bot",
+       "recentchanges-label-unpatrolled": "Cökic kënë akëcë kɔc ruu ë cath",
+       "recentchanges-label-plusminus": "Themdït ë yär acë rat war në kolook ka lɛ̈",
+       "recentchanges-legend-heading": "<riɛl>Atekkït:</riɛl>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (tïŋ ayɛ [[Special:NewPages|marec de yɔ̈r yam]])",
+       "recentchanges-submit": "Nyooth",
+       "rclistfrom": "Nyoothë weer yam jɔɔk $2, $3",
+       "rcshowhideminor": "$1 käcïcökic thiin",
+       "rcshowhideminor-show": "Nyooth",
+       "rcshowhideminor-hide": "Thaan",
+       "rcshowhidebots": "$1 boot",
+       "rcshowhidebots-show": "Nyooth",
+       "rcshowhidebots-hide": "Thaan",
+       "rcshowhideliu": "$1 dulooi cïgɔ̈t",
+       "rcshowhideliu-show": "Nyooth",
+       "rcshowhideliu-hide": "Thaan",
+       "rcshowhideanons": "$1 duluɔɔi cierin",
+       "rcshowhideanons-show": "Nyooth",
+       "rcshowhideanons-hide": "Thaan",
+       "rcshowhidepatr-show": "Nyooth",
+       "rcshowhidepatr-hide": "Thaan",
+       "rcshowhidemine": "$1 acökicdië",
+       "rcshowhidemine-show": "Nyooth",
+       "rcshowhidemine-hide": "Thaan",
+       "rcshowhidecategorization-show": "Nyooth",
+       "rcshowhidecategorization-hide": "Thaan",
+       "rclinks": "Nyoothë weer $1 thök në nïn $2 thök",
+       "diff": "këdä",
+       "hist": "käth",
+       "hide": "Thaan",
+       "show": "Nyooth",
+       "minoreditletter": "th",
+       "newpageletter": "Y",
+       "boteditletter": "b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|kɛ̈c|kɛ̈ɛ̈c}} ciën ë wɛ̈r",
+       "recentchangeslinked": "Wɛ̈r nɔŋkar",
+       "recentchangeslinked-toolbox": "Kaceyiicwar nɔŋ kar",
+       "recentchangeslinked-title": "Weer thöŋ kekë \"$1\"",
+       "recentchangeslinked-summary": "Kän areny de wɛ̈r cïloi wɛ̈ramɛn tënɔŋ apam nuɛtke apam nhic (nadëk ka nuɛtke kɔcakuut de bekätakthook nhic).\nApam tɔ̈ [[Special:Watchlist|abërtïtdu]] aa <strong>gɔ̈tdïtnyin</strong>.",
+       "recentchangeslinked-page": "Rin ë akap",
+       "recentchangeslinked-to": "Nyuɔɔthë kä cï ke waar në apɛ̈m cï nuɛ̈ɛ̈t ke apam tiöökë, ku acie kä cï ke waar në yen apam thiöökë yic",
+       "upload": "Wälë apamduööt",
+       "filedesc": "Cuutyic",
+       "fileuploadsummary": "Cuutyic:",
+       "upload-dialog-title": "Wälë apamduööt",
+       "upload-dialog-button-cancel": "Tɛmkɔ̈u",
+       "upload-form-label-infoform-description": "Lëkcäät",
+       "upload-form-label-infoform-date": "Aköl",
+       "license-header": "Gɛmluɔ̈ɔ̈i",
+       "imgfile": "apamduööt",
+       "listfiles_date": "Aköl",
+       "listfiles_user": "Dului",
+       "listfiles_description": "Lëkcäät",
+       "file-anchor-link": "Apamduööt",
+       "filehist": "Käthɛɛr ë makec",
+       "filehist-help": "Tuenyë në aköl/akɔ̈licic apamduööt ɣoi kecit rɔt nyuɔɔth në akölic.",
+       "filehist-current": "ee mënë",
+       "filehist-datetime": "Aköl/Akɔ̈lic",
+       "filehist-thumb": "riöpbundït",
+       "filehist-thumbtext": "Alelthook ë riöpcök, tɛ̈cït $1",
+       "filehist-user": "Dului",
+       "filehist-dimensions": "Thëmthëm",
+       "filehist-comment": "Këcïjaamic",
+       "imagelinks": "Luɔi ë apamduööt",
+       "linkstoimage": "{{PLURAL:$1|Apam thöökë anuɛ̈tke|$1 apamkɛ̈ aanuɛ̈tke}} apamduöötë:",
+       "nolinkstoimage": "Cin apaam ye nuët lɔ wëtmätkën.",
+       "sharedupload-desc-here": "Ɣɔ̈c apamduööt kënë ee rat jɔɔk ë $1 ku alëu bï luöi ë loiloilɔtueŋ kɔ̈kyiic.\nLëkcäät ë [$2 yär ë lëkcäät apamduööt de] denë atɔ̈ piiny ëtɛ̈n.",
+       "upload-disallowed-here": "Yïn acïï lëu bä apamduööt kënë gɔ̈t arët.",
+       "randompage": "Apam räŋräŋ",
+       "randomincategory-submit": "Lɔ",
+       "pageswithprop-submit": "Lɔ",
+       "brokenredirects-edit": "cokic",
+       "withoutinterwiki-submit": "Nyooth",
+       "nbytes": "$1 {{PLURAL:$1|kɛ̈c|kɛ̈ɛ̈c}}",
+       "nmembers": "$1 {{PLURAL:$1|raanalɔŋthïn|kɔcalɔŋthïn}}",
+       "prefixindex-submit": "Nyooth",
+       "protectedpages-page": "Apam",
+       "newpages": "Abɛ̈ɛ̈k yam",
+       "newpages-submit": "Nyooth",
+       "newpages-username": "Rinduloi:",
+       "move": "Laar",
+       "pager-older-n": "{{PLURAL:$1|thɛɛr 1|thɛɛr $1}}",
+       "booksources": "Ɣɔnnëyök athör",
+       "booksources-search-legend": "Yiööp ɣɔnnëyök athör",
+       "booksources-search": "Yiɔ̈ɔ̈p",
+       "log": "Athörtɔ̈ɔ̈u",
+       "logeventslist-submit": "Nyooth",
+       "allarticles": "Abɛ̈ɛ̈k ëbɛ̈n",
+       "allpagessubmit": "Lɔ",
+       "categories": "Atëkthuɔk",
+       "categories-submit": "Nyooth",
+       "sp-deletedcontributions-contribs": "amöc",
+       "linksearch-ns": "Rinɣɔnläu",
+       "linksearch-ok": "Yiɔ̈ɔ̈p",
+       "listusers-submit": "Nyooth",
+       "watchlist": "Abërtït",
+       "mywatchlist": "Abërtït",
+       "watch": "Ɣoi",
+       "watchlist-hide": "Thaan",
+       "watchlist-submit": "Nyooth",
+       "historyaction-submit": "Nyooth",
+       "dellogpage": "Athörtɔ̈ɔ̈u cöthwei",
+       "rollbacklink": "dhuɔ̈kciɛ̈ɛ̈n",
+       "rollbacklinkcount": "dhuɔ̈kcïɛ̈n $1 {{PLURAL:$1|käcïcokic|këcïcokic}}",
+       "protectlogpage": "Athörtɔ̈ɔ̈u tïït",
+       "restriction-edit": "Cokic",
+       "restriction-move": "Laar",
+       "undeleteviewlink": "ɣoi",
+       "undelete-search-submit": "Yiɔ̈ɔ̈p",
+       "namespace": "Rinɣɔnläu",
+       "invert": "Yalic kuɛ̈nykuɛ̈ny",
+       "tooltip-invert": "Kuany rök thiöökë ba wɛ̈r tööu, wɛ̈r cïke luööi apam tɔ̈ rindɔ̈r cïï locë yic (ku rindɔ̈rkɔ̈k nɔŋ kar ke ye, të cïneke kuay ayɛ)",
+       "namespace_association": "Rinlääu tɔ̈ɔ̈ŋic",
+       "tooltip-namespace_association": "Gɔtë ye akeerë-yic bä tääu pɔ̈rderin ë këjiɛɛmë tëdɛ̈t kedejɔ̈k aya cï mat kenë pɔ̈rderin cï lɔc",
+       "blanknamespace": "(Këdït)",
+       "contributions": "{{GENDER:$1|Dulooi}} amöc",
+       "mycontris": "Amöc",
+       "anoncontribs": "Amöc",
+       "month": "Jäl ee penë (ku lɔ ciën):",
+       "year": "Jäl ee ruɔ̈ɔ̈n (ku lɔ ciën):",
+       "sp-contributions-talk": "jam",
+       "sp-contributions-submit": "Yiɔ̈ɔ̈p",
+       "whatlinkshere": "Këkerɛkthïn",
+       "whatlinkshere-title": "apääm aanyuët tënë \"$1\"",
+       "whatlinkshere-page": "Apam:",
+       "linkshere": "Apɛ̈m bɔ̈ anuët në <riɛl>[[:$1]]</riɛl>:",
+       "isredirect": "bɛnwel apam",
+       "istemplate": "tɛ̈wë anuët në athööric ku bë athöördɛ̈ nyooth",
+       "isimage": "Nuɛ̈t ë apamduööt",
+       "whatlinkshere-prev": "{{PLURAL:$1|ketueŋ|ketueŋ $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|la|la $1}}",
+       "whatlinkshere-links": "← anyuët",
+       "whatlinkshere-hideredirs": "$1 benwel",
+       "whatlinkshere-hidetrans": "$1 tɛ̈wë anuët në athööric ku bë athöördɛ̈ nyooth",
+       "whatlinkshere-hidelinks": "$1 anyuët",
+       "whatlinkshere-filters": "Thiic",
+       "whatlinkshere-submit": "Lɔ",
+       "autoblocklist-submit": "Yiɔ̈ɔ̈p",
+       "ipblocklist-submit": "Yiɔ̈ɔ̈p",
+       "blocklink": "gël",
+       "contribslink": "aamioc",
+       "movelogpage": "Laar athörtɔ̈ɔ̈u",
+       "export": "Kɛ̈ŋbɛ̈ɛ̈i abɛ̈ɛ̈k",
+       "allmessages-filter-submit": "Lɔ",
+       "thumbnail-more": "Wëric",
+       "tooltip-pt-userpage": "{{GENDER:|Apamdu}} de dulooi",
+       "tooltip-pt-mytalk": "Jam apam {{GENDER:|du}}",
+       "tooltip-pt-preferences": "Kaŋuɛ̈ɛ̈n {{GENDER:|ku}}",
+       "tooltip-pt-watchlist": "Arec de athör ee ke tiit lɔn bïneke waar",
+       "tooltip-pt-mycontris": "Abëër ë {{GENDER:|ajuëërku}}",
+       "tooltip-pt-login": "Yïn aye dɛtpuöu ba rat gätpiny balɔɣöt; ku yen ace këthɛnyëkoɔthïn",
+       "tooltip-pt-logout": "Ŋaanyaɣeer",
+       "tooltip-pt-createaccount": "Yïn adetkupuöu ba akuɛ̈n cak ku ba gɛ̈tëpiny de lɔɣöt loi; ku töŋtɔ̈thïn acïn thɛnyëthïn tɔ̈u thïn",
+       "tooltip-ca-talk": "Abëjaamic wɛ̈t ë apamkëtɔ̈thïn",
+       "tooltip-ca-edit": "Cok apamë-yic",
+       "tooltip-ca-addsection": "Cak akut yam",
+       "tooltip-ca-viewsource": "Apäm kënë acï gël.\nKu alëu bä tënëyök tïŋcök",
+       "tooltip-ca-history": "Dhuɔ̈kic cïlooi apamë-yic",
+       "tooltip-ca-move": "Laar apamë",
+       "tooltip-ca-watch": "Mät apamë në abërtïtku-yic",
+       "tooltip-search": "Yiɔ̈ɔ̈p {{SITENAME}}",
+       "tooltip-search-go": "Lɔ apam man nɔŋ rinë kot, na tɔ̈",
+       "tooltip-search-fulltext": "Yiööp cïgɔtë në abɛ̈kic",
+       "tooltip-p-logo": "Lɔneem apam këdït",
+       "tooltip-n-mainpage": "Lɔneem apam këdït",
+       "tooltip-n-mainpage-description": "Lɔneem apam këdït",
+       "tooltip-n-portal": "Wɛ̈t ë këlooi, kë lëu bä luɔi, bä kɛ̈ŋ yök tëno",
+       "tooltip-n-currentevents": "Lɔ deet wël ë kä cë röt piac looi cök",
+       "tooltip-n-recentchanges": "Aber rötdäcwäär wikiyic",
+       "tooltip-n-randompage": "Dhɛ̈th apam räŋräŋ",
+       "tooltip-n-help": "Tëlɔdeet",
+       "tooltip-t-whatlinkshere": "Abër ë apäämwiki aa rɛkthïn ëbɛ̈n",
+       "tooltip-t-recentchangeslinked": "Kë cë röt piac waar apääm cï nuɛt kekë apäm kënë yiic",
+       "tooltip-feed-atom": "Bïï de Atom tënë apam känic",
+       "tooltip-t-contributions": "Abëër ë ajuëër në  {{GENDER:$1dulooikën}}",
+       "tooltip-t-upload": "Wälë apamduööt",
+       "tooltip-t-specialpages": "Wat apɛ̈m lel ëbɛ̈n",
+       "tooltip-t-print": "Alelgäär ë apäm kënë",
+       "tooltip-t-permalink": "Anuɛ̈t ciedɔ̈kic kë cï dhuɔ̈kic apämë-yic",
+       "tooltip-ca-nstab-main": "Ɣoi apam kätɔ̈",
+       "tooltip-ca-nstab-user": "Ɣoi apam duloi",
+       "tooltip-ca-nstab-special": "Kënë ee apam lel ku cïï lëu bë cokic",
+       "tooltip-ca-nstab-project": "Ɣoi apam kätɔ̈",
+       "tooltip-ca-nstab-image": "Ɣoië apäm ë makec",
+       "tooltip-ca-nstab-template": "Tïŋ macuëc",
+       "tooltip-ca-nstab-category": "Ɣoië apäm atëkthok",
+       "tooltip-save": "Tɔ̈ɔ̈uë weerdu",
+       "tooltip-preview": "Tiɛ̈ŋë tueŋ weerdu. Yïn looië yen këcë guor tɔ̈ɔ̈u.",
+       "tooltip-diff": "Nyoothë weer ɣo cä looi këcïgɔ̈tic",
+       "tooltip-rollback": "\"Duɔlëciën\" ee gɛ̈t ë raankuny puɔc thök dhuöktëdɛn në apamë të cïnye tuaany na tök",
+       "tooltip-undo": "\"Cuɔthëwei\", ee këpuɔc gɔ̈t nyaai, ku liep apam gɔ̈t yïn thïn thok në kuer cï lëu bï käŋ waar thïn. Kän ee kɔc puöl bïk wɛ̈tciekic gätpiny, bïk lueel ee wɛ̈tŋu coth kek wël wei",
+       "tooltip-summary": "Lɔthïn wëlcekic cony",
+       "simpleantispam-label": "Thiöökëtïŋ wëlpuɔliic. <riɛl>Duk</riɛl> kän thiɛ̈ŋ thïn!",
+       "pageinfo-toolboxlink": "Lëkapam",
+       "previousdiff": "← Cokic thɛɛr",
+       "nextdiff": "Cökic yam →",
+       "file-info-size": "$1 × $2 kolook, thëndït de aduötyɔ̈r: $3, MIME kuat: $4",
+       "file-nohires": "Acïn kuerdɛ̈ tɔ̈thïn wär kän lëu bë atïïp tïc.",
+       "svg-long-desc": "Apamduööt SVG, yee kolookë ke aayee $1 x $2, dït de apamduööt: $3",
+       "show-big-image": "Makec tueŋ",
+       "show-big-image-preview": "Thöŋ ë këkoŋtiŋë: $1",
+       "show-big-image-other": "{{PLURAL:$2|Tïckëtïŋ dɛ̈t|Tïckatïŋ kɔ̈k}}: $1.",
+       "show-big-image-size": "$1 × $2 kolook",
+       "ilsubmit": "Yiɔ̈ɔ̈p",
+       "metadata": "Leekmeta",
+       "metadata-help": "Yär thiöögë anɔŋic lëk juëc kɔ̈k, tɛkdɛ̈ eke mɛtëke thïn në ajötatïïp ë yit ka ye atɔuatïïp ye luööi bëye cak ka bëye yiɛt.\nTë cïnë yär war tëden thɛric, ka kajuëëckɔ̈k tɔ̈thïn tɛkdɛ̈ aacë bë tïc në yär ciiwar yic.",
+       "metadata-fields": "Tuɔc ke lëëkmeta ë këcïkäär cï ke rɛcpiny ee thong kënë yic aa bï ke mat yär ë nyuuth ë kacïkäär yic.\nTë ler kör ë lëëkmeta ŋɛɛrpiny.\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": "Cök",
+       "exif-xresolution": "Wëtcïmat piny",
+       "exif-yresolution": "Wëtcïmat nhial",
+       "exif-datetime": "Akölnïn ku akölic ë wär ë wëtmät",
+       "exif-make": "Duluɔi adɔmtïïp",
+       "exif-model": "Këcëkäär adɔmtïïp",
+       "exif-software": "Yöökkɔ̈c cïlooi",
+       "exif-artist": "Agɔ̈t",
+       "exif-exifversion": "Bïïbei Exif",
+       "exif-colorspace": "Tëlääu kiit",
+       "exif-datetimeoriginal": "Akölnïn ku akölic ë cäk ë akutëyith",
+       "exif-datetimedigitized": "Akölnïn ku akölic ë cɔkakuënnhialkupiny",
+       "exif-iimcategory": "Atëkthok",
+       "exif-disclaimer": "Acëkakuɔ",
+       "exif-orientation-1": "Epath",
+       "namespacesall": "ëbɛ̈n",
+       "monthsall": "ëbɛ̈n",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|jam]])",
+       "version-ext-colheader-description": "Lëkcäät",
+       "version-libraries-description": "Lëkcäät",
+       "specialpages": "Apɛ̈m lel",
+       "tag-filter": "[[Special:Tags|Dhïïm]] wɛ̈ttɛ̈kkɔcde:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Dhïïm|Dhïm}}]]: $2)",
+       "tags-edit": "cokic",
+       "logentry-delete-delete": "$1 {{GENDER:$2|cuɔthwei}} apam $3",
+       "logentry-move-move": "$1 {{GENDER:$2|cï riɛt}} apam $3 lɔ $4",
+       "logentry-newusers-create": "Cinakuën ë dukui $1 acï {{GENDER:$2|cak}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|cï jatnhial}} $3",
+       "feedback-cancel": "Tɛmkɔ̈u",
+       "searchsuggest-search": "Yiɔ̈ɔ̈p {{SITENAME}}"
+}
index c791ecf..9994f62 100644 (file)
@@ -98,9 +98,9 @@
        "fri": "Yen",
        "sat": "Şem",
        "january": "Çele",
-       "february": "Sıbat",
+       "february": "Gucige",
        "march": "Adar",
-       "april": "Lisan",
+       "april": "Nisane",
        "may_long": "Gulan",
        "june": "Heziran",
        "july": "Temuz",
        "january-gen": "Çele",
        "february-gen": "Sıbat",
        "march-gen": "Adar",
-       "april-gen": "Lisan",
+       "april-gen": "Nisane",
        "may-gen": "Gulan",
        "june-gen": "Heziran",
        "july-gen": "Temuz",
        "january-date": "$1 Çele",
        "february-date": "$1 Sıbat",
        "march-date": "$1 Adar",
-       "april-date": "$1 Lisan",
+       "april-date": "$1 Nisane",
        "may-date": "$1 Gulan",
        "june-date": "$1 Heziran",
        "july-date": "$1 Temuze",
        "and": "&#32;u",
        "qbfind": "Bıvin",
        "qbbrowse": "Çım ra viyarne",
-       "qbedit": "Bıvurne",
+       "qbedit": "Bıvırne",
        "qbpageoptions": "Na perrer",
        "qbmyoptions": "Perrê mı",
        "faq": "PVP",
        "undelete_short": "{{PLURAL:$1|Yew vırnayışi|$1 Vırnayışan}} mestere",
        "viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
        "protect": "Bıstarnê",
-       "protect_change": "bıvurne",
-       "protectthispage": "Ena perer bıpawe",
+       "protect_change": "bıvırne",
+       "protectthispage": "Ena perre şeveknê",
        "unprotect": "Starnayışi bıvurne",
-       "unprotectthispage": "Starnayışê ena perer bıvurne",
+       "unprotectthispage": "Şeveknayışê ena perre bıvırne",
        "newpage": "Perra newi",
        "talkpage": "Na per dı vatan kew",
        "talkpagelinktext": "Mesac",
        "newmessageslinkplural": "{{PLURAL:$1|yew mesaco newe|999=mesacê newey}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|vurnayışo peyên|999=vurnayışê peyêni}}",
        "youhavenewmessagesmulti": "$1 mesaco newe esto",
-       "editsection": "bıvurne",
+       "editsection": "bıvırne",
        "editold": "bıvurne",
        "viewsourceold": "çımey cı bıvinê",
-       "editlink": "bıvurne",
+       "editlink": "bıvırne",
        "viewsourcelink": "çımey bıvêne",
        "editsectionhint": "Leteyo ke bıvuriyo: $1",
        "toc": "Zerreki",
        "badtitletext": "Sernameyê pela ke şıma waşt, nêvêrd, vengo ya zi zıwano miyanêno ğelet gırêdaye ya zi sernameyê wiki.\nBeno ke, tede yew ya zi zêdê işareti estê ke sernameyan de nêxebetiyenê.",
        "title-invalid-empty": "Waziyaye sernamey perrer  venonyana teyna canamey nami sero esto.",
        "title-invalid-utf8": "Sernamey perre ke şıma wazenê, yew rêza UTF-8iya ke nêvêrene xo sero kırışeno.",
+       "title-invalid-talk-namespace": "Ena perra ke waziyena yew perrê werênayışa ke nêşena bıbo aye ra bestiyena.",
+       "title-invalid-characters": "Ena perra karakterê ke nêvêrenê inan gêna xo miyan.",
        "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-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.",
-       "protectedpagetext": "Na per qey nêvuriyayiş ho pawyeno ya zi kerdışe bini.",
-       "viewsourcetext": "To şikinay çımey na pele bıvêne u kopya kerê:{{MediaWiki Wesiqe malumat}}",
+       "protectedpagetext": "Ena perre vırnayış u kerdışanê binan rê şevekniyaya.",
+       "viewsourcetext": "Şıma şenê çımey ena perre bıvênê u kopya kerê {{MediaWiki Wesiqe malumat}}",
        "viewyourtext": "Na pela '''Vurnayışê ke kerdê''' re şıma şenê kopya kerê:",
        "protectedinterface": "Na pela qandê nusnerin destegê verri dana u kes xırabin nêqero deye kerda kılit.",
        "editinginterface": "'''İqaz:''' Şıma yew perra ke softwarei rê nuştey miyan-bestoği dana cı, aye vırnenê.\nVırnayışê ena perre do eno wiki sero asayışê miyan-bestoğê karberanê binan de bıaso.\n\nTadayışi (çarnayışi) rê , yardımê [https://translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra haydarê procêdoşkerdışi de vınderê.",
-       "cascadeprotected": "No pel de vurnayiş qedexe biyo, çunke şıma tuşa \"kademeyın\" aqtif kerdo u no {{PLURAL:$1|pele|pelo}} pawıteyo de xebıtyeno:\n$2",
+       "cascadeprotected": "Ena perre vırnayışan rê akerde niya, çunke a {{PLURAL:$1|perre|perranê}} bınênan de zi yew be yew ravêrdeya, gırweniyena:\n$2",
        "namespaceprotected": "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
-       "customcssprotected": "Mısadeyê şıma çıniyo ke na pela CSSi bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.",
-       "customjsprotected": "Mısadeyê şıma çıniyo ke na pela Java Scripti bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.",
+       "customcssprotected": "İzına şıma çıniya ke ena perra CSSi bıvırnên, çıke ena perra xısusiye eyaranê karberan gêna xo miyan.",
+       "customjsprotected": "İzına şıma çıniya ke ena perra Java Scripti bıvırnên, çıke ena perra xısusiye eyaranê karberan gêna xo miyan.",
        "mycustomcssprotected": "Desturê şıma çıniyo ke na pela CSSi bıvurnê.",
        "mycustomjsprotected": "Desturê şıma çıniyo ke na pela JavaScripti bıvurnê.",
        "myprivateinfoprotected": "Ğısusi malumatana ğo timar kerdışire icazeta şıma çıniya.",
        "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ı kewê",
        "createacct-another-username-ph": "Nameyê karberi cı kewe",
        "yourpassword": "Parola",
        "userlogin-yourpassword": "Parola",
-       "userlogin-yourpassword-ph": "Parolay xo cı kewe",
+       "userlogin-yourpassword-ph": "Parolay xo cı kewê",
        "createacct-yourpassword-ph": "Parola cıkewe",
        "yourpasswordagain": "Parola reyna bınusne:",
        "createacct-yourpasswordagain": "Parola tesdiq ke",
        "login": "Cı kewe",
        "login-security": "Kamiya xo araşt kerê",
        "nav-login-createaccount": "Dekew de / hesab vıraze",
-       "userlogin": "Cıkewtış / hesab vıraze",
-       "userloginnocreate": "Dekewtış",
        "logout": "Bıveciye",
        "userlogout": "Bıveciye",
        "notloggedin": "Şıma cıkewtış nêvıraşto",
        "userlogin-noaccount": "Hesabê şıma çıniyo?",
        "userlogin-joinproject": "Cıkewe {{SITENAME}}",
-       "nologin": "Hesabê şıma çıniyo? '''$1'''.",
-       "nologinlink": "Yew hesab ake",
        "createaccount": "Hesab vıraze",
-       "gotaccount": "Hesabê şıma esto? '''$1'''.",
-       "gotaccountlink": "Cıkewtış",
-       "userlogin-resetlink": "Melumatê cıkewtışi xo vira kerdê?",
        "userlogin-resetpassword-link": "Parola xo kerda xo vira?",
-       "userlogin-helplink2": "Heqa qeydbiyayışi de peşti bıgêrên",
+       "userlogin-helplink2": "Qeydbiyayışi sero peşti bıgêrên",
        "userlogin-loggedin": "Tı xora namey {{GENDER:$1|$1}} ra kewtê/kewtay cı.\nFormê cêrêni bıgureyne ke namey karberio bin ra cı kewê.",
        "userlogin-reauth": "Eger ke {{GENDER:$1|$1}} şımayê se xo araşt kerdışirê fına ronıştış akerê.",
        "userlogin-createanother": "Zewbi hesab vıraz",
        "createacct-another-email-ph": "Adresa e-posta de fi",
        "createaccountmail": "Yew parolaya rastameyiya ravêrdiye bıgurene û parola ena adresa e-postey rê bırışe",
        "createacct-realname": "Nameyo raştıkên (mecburi niyo)",
-       "createaccountreason": "Sebeb:",
        "createacct-reason": "Sebeb",
        "createacct-reason-ph": "Şımaye çı xo re zewbi hesab vırazeni?",
        "createacct-submit": "Hesabê xo vıraze",
        "minoredit": "No yew vırnayışo werdiyo",
        "watchthis": "Şıma bewnê ena perre",
        "savearticle": "Perre qeyd ke",
-       "savechanges": "Vırnayışan qeyd ke",
-       "publishpage": "Perer bıhesırne",
-       "publishchanges": "Vurnayışa vıla ke",
+       "savechanges": "Vırnayışan qeyd ke",
+       "publishpage": "Riperri bare ke",
+       "publishchanges": "Vırnayışan qeyd ke",
        "preview": "Verqayt",
        "showpreview": "Verasayışi bımocne",
        "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.",
+       "missingsummary": "'''DİQET:''' Şıma jû xulasa nênuşte.\nEke şıma \"$1\" reyna bıtıknê, vırnayışê şıma bê xulasa qeyd beno.",
        "missingcommenttext": "Cêr de jû fıkır bınusên, şıma rê zehmet.",
-       "missingcommentheader": "'''Diqet:''' Şıma seba nê fıkrvaci yew mewzu/sernuşte nênuşt.\nEke şıma reyna \"{{int:savearticle}}\" bıtıknê, vırnayışê şıa bê mewzu/sernuşte do qeyd bo.",
+       "missingcommentheader": "'''Diqet:''' Şıma seba nê fıkrvaci yew mewzu/sernuşte nênuşt.\nEke şıma reyna \"$1\" bıtıknê, vırnayışê şıa bê mewzu/sernuşte do qeyd bo.",
        "summary-preview": "Verasayışê xulasa:",
        "subject-preview": "Verqaytê mewzu:",
        "previewerrortext": "Verasayışê vırnayışê şıma de yew xeta veciya miyan.",
        "editingsection": "Per da $1 de şımaye kenê ke leti bıvurnê",
        "editingcomment": "$1 vuryeno (qısmo newe)",
        "editconflict": "Têverabiyayışê vurnayışi: $1",
-       "explainconflict": "Wexta ke şıma pel vurneyene yewna ten zi pel vurna.\nNuşteyo corin; halê pelo nıkayin mocneno.\nVurnayişê şıma cêr de mocya ( musya).\nVurnayişanê peyinan şıma gani qayd bıkeri.\nWexta ke şıma butonê \"{{int:savearticle}}\" tıkna '''teyna''' nuşteyo corin qayd beno.",
+       "explainconflict": "Wexta ke şıma pel vurneyene yewna ten zi pel vurna.\nNuşteyo corin; halê pelo nıkayin mocneno.\nVurnayişê şıma cêr de mocya ( musya).\nVurnayişanê peyinan şıma gani qayd bıkeri.\nWexta ke şıma butonê \"$1\" tıkna '''teyna''' nuşteyo corin qayd beno.",
        "yourtext": "nuşteyê şıma",
        "storedversion": "Nuşteyo qaydbiyaye",
        "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.'''",
        "sectioneditnotsupported-text": "Destekê vurnayışiê qısımi ena pela vurnayışi de çıniyo.",
        "permissionserrors": "İdari xeta",
        "permissionserrorstext": "Qey {{PLURAL:$1|sebeb|sebebê}} cêrini ra icazetê şıma çıniyo:",
-       "permissionserrorstext-withaction": "{{PLURAL:$1|Sebeba|Sebeb da}} cêri ra icazetê $2 çıniyo:",
-       "recreate-moveddeleted-warn": "'''Hişyari: no pel o ke şıma vırazeni vere cû vırazyayo.'''\n\nDiqet bıkeri no vurnayişê şıma re gerek esto:",
+       "permissionserrorstext-withaction": "{{PLURAL:$1|Sebebê|Sebebê}} cêri ra icazetê $2y çıniyo:",
+       "recreate-moveddeleted-warn": "'''Hişyari: Şıma yew nuşteyo ke veri de esteriyao, ey vırazenê.'''\n\nHetê bınêni de qeydê esterıtışi u kırıştışi esto:",
        "moveddeleted-notice": "Ena pela esteriya ya.\nQeydé  esternayışi u wedarnayışi cér dé deya yo.",
        "log-fulllog": "Temamê rocaneyi bıvine",
        "edit-hook-aborted": "Vurnayiş vınderiya.\nYew sebeb beyan nibı.",
        "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": "Vırnayışê to qeyd bi.",
+       "postedit-confirmation-saved": "Vırnayışê şıma qeyd bi.",
        "edit-already-exists": "Pelo newe nêvıraziyeno.\nPel ca ra esto.",
        "defaultmessagetext": "Metnê mesacê hesabiyayey",
        "content-failed-to-parse": "Qandê madela $3 zereyê $1, $2 sero nêagozyayo",
        "undo-success": "No vurnayiş tepeye geryeno. pêverronayişêyê cêrıni kontrol bıkeri.",
        "undo-failure": "Poxta pëverameyişa vurnayişan ra  peyd grotışë kari në bı",
        "undo-norev": "Vurnayiş tepêya nêgeryeno çunke ya vere cû hewna biyo ya zi ca ra çino.",
-       "undo-summary": "Vırnayışê $1'i [[Special:Contributions/$2|$2i]] ([[User talk:$2|Werênayış]]) peyser gırot",
+       "undo-summary": "Vırnayışê $1'i [[Special:Contributions/$2|$2i]] ([[User talk:$2|Werênayış]]) peyser gırewt",
        "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 perrer bımotne",
        "page_first": "verên",
        "page_last": "peyên",
        "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> = vırnayışo werdiyo.",
-       "history-fieldset-title": "Çımberz verori",
+       "history-fieldset-title": "Çım ra viyarnayışan cı geyre",
        "history-show-deleted": "Tenya esterıtey",
        "histfirst": "Verênêr",
        "histlast": "Peyênêr",
        "rev-deleted-text-permission": "Çımraviyarnayışê ena pele '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
        "rev-suppressed-text-permission": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
        "rev-deleted-text-unhide": "Çım ra viyarnayışê enê riperri <strong>esteriya</strong>.\nTeferruati [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qeydê esterıtışi] yenê diyene.\nŞıma hewna şenê [$1 nê vırnayışi bıvênê], eke wazenê dewam kerê.",
-       "rev-suppressed-text-unhide": "Çımra viyarnayışê ena pele '''Degusneyayo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degustış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımraviyarnayışi bıvênê], eke wazenê dewam kerê.",
-       "rev-deleted-text-view": "Çımra viyarnayışê ena pele '''besternêno'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] de teferruat esto.",
+       "rev-suppressed-text-unhide": "Çım ra viyarnayışê ena perre <strong>dewesnaeyê</strong>.\nEtıya [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dewesnayış] de teferruat esto.\nŞıma pê idarekerina xo hewna şenê [$1 nê çım ra viyarnayışi bıvênê], eke wazenê dewam kerê.",
+       "rev-deleted-text-view": "Çım ra viyarnayışê enê riperri '''vındarnao'''.\nŞıma şenê bıvênê; teferruat nao naca [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış].",
        "rev-suppressed-text-view": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
        "rev-deleted-no-diff": "Şıma nêşenê nê ferqi bıvênê, çıke çımraviyarnayışan ra  yew '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
        "rev-suppressed-no-diff": "Revizyon '''esteriyayo\"' aye ra ti nieşkeno ena diff bivine.",
-       "rev-deleted-unhide-diff": "Çımra viyarnayışanê na ferqi ra  yew '''besterneyayo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] dı teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê ferqi bıvênê], eke wazenê dewam kerê.",
+       "rev-deleted-unhide-diff": "Çım ra viyarnayışanê nê ferqi ra  yew '''esterdeo'''.\nEtıya [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} esterey] de teferruat esto.\nŞıma pê idarekerina xo hewna şenê [$1 nê ferqi bıvênê], eke wazenê dewam kerê.",
        "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.",
        "notextmatches": "tekê (zewcê) nuştey pele çıniyê",
        "prevn": "{{PLURAL:$1|$1}} verên",
        "nextn": "{{PLURAL:$1|$1}} peyên",
-       "prev-page": "Pela verên",
+       "prev-page": "Perra verêne",
        "next-page": "Pela peyên",
        "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ı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ê.}}",
+       "searchmenu-new": "<strong>Ena wiki de perra \"[[:$1]]\" vıraze!</strong> {{PLURAL:$2|0=|Sewbina pela ke şıma geyrayê cı aye bıvênê.|Yew zi peyniyanê cıgeyrayışê xo bıvênê.}}",
        "searchprofile-articles": "Perrê zerreki",
        "searchprofile-images": "Multimedya",
        "searchprofile-everything": "Pêro çi",
        "search-error": "Cıgeyrayış de yew xeta emê meydan: $1",
        "preferences": "Tercihi",
        "mypreferences": "Tercihi",
-       "prefs-edits": "Amarê vurnayışan:",
+       "prefs-edits": "Amarê vırnayışan:",
        "prefsnologintext2": "Kerem ke, seba vurnayışê tercihanê xo cı kewe.",
        "prefs-skin": "Çerme",
        "skin-preview": "Verqayt",
        "right-editsemiprotected": "Xısusi pera timaryayış \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Modelê zerrekê pele bıvurne",
        "right-editinterface": "Interfaceê karberi sero bıgureye",
-       "right-editusercssjs": "CSS u dosyanê JSiê karberanê binan sero bıgureye",
        "right-editusercss": "Dosyanê CSSiê karberanê binan sero bıgureye",
        "right-edituserjs": "Dosyanê JSiê karberanê binan sero bıgureye",
        "right-editmyusercss": "CSS dosyaya karberinda ğo timar ke",
        "action-deletelogentry": "roceka dekerdan bestern",
        "action-deletedhistory": "verora esteriya perrer bıvin",
        "action-browsearchive": "pelanê esterıteyan bıgeyre",
-       "action-undelete": "ena perer mestern",
+       "action-undelete": "Ena perre mesterê",
        "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-patrol": "vurnayîşê karberanê binî nişan bike patrol biye",
        "action-autopatrol": "vurnayîşê xoye nişan bike ke belli biyo patrol biye",
        "action-unwatchedpages": "listeyê pelanê seyirnibiya bivîne",
-       "action-mergehistory": "tarixê ena pele yew ke",
+       "action-mergehistory": "tarixê ena perre yew ke",
        "action-userrights": "heqqa karberanê hemî bivurne",
        "action-userrights-interwiki": "heqqa karberanê ke wikiyê binî de hemî bivurne",
-       "action-siteadmin": "database kilit bike ya zi a bike",
+       "action-siteadmin": "Databasei kılit ke ya zi a ke",
        "action-sendemail": "e-posta bırşe",
        "action-editmyoptions": "Tercihanê xo bıvurne",
-       "action-editmywatchlist": "Listeyseyran de xo bıvırne",
+       "action-editmywatchlist": "Lista xoya ewniyayışi bıvırnê",
        "action-viewmywatchlist": "Listeyseyran de xo bıvin",
        "action-viewmyprivateinfo": "Xısusi tercihane xo bıvin",
        "action-editmyprivateinfo": "Xısusi malumate xo bıvurne",
        "recentchanges": "Vırnayışê peyêni",
        "recentchanges-legend": "Tercihê vırnayışanê peyênan",
        "recentchanges-summary": "Wiki sero vırnayışê peyêni asenê.",
-       "recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.",
+       "recentchanges-noresult": "Demê periyodi de vırnayış be enê kriteran çıniyo.",
        "recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
        "recentchanges-label-newpage": "Enê vırnayışi yew perra newiye vıraşta.",
        "recentchanges-label-minor": "No yew vırnayışo werdiyo",
        "recentchangeslinked-feed": "Vırnayışê bestiyaey",
        "recentchangeslinked-toolbox": "Vırnayışê bestiyaey",
        "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-summary": "Ena liste, perra spesifike rê (ya zi karberanê kategoriya spesifike rê) perranê gırêdayoğan de lista de vırnayışê peyênana.\n[[Special:Watchlist|Lista şımaya seyrkedışi de]] perri be nuşteyo '''qolınd''' bêli kerdê.",
        "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",
        "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics": "İstatistiki",
        "statistics-header-pages": "İstatistikê perer",
-       "statistics-header-edits": "İstatistikê vurnayışan",
+       "statistics-header-edits": "İstatistikê vırnayışan",
        "statistics-header-users": "İstatistikê karberi",
        "statistics-header-hooks": "Yewbina istatistiki",
        "statistics-articles": "Perê zerreki",
        "double-redirect-fixer": "Fixerî redirek bike",
        "brokenredirects": "Serşıkıtışê xırabeyi",
        "brokenredirectstext": "Redireksiyonê ey ki pelanê hama çiniyeno ra link dano:",
-       "brokenredirects-edit": "bıvurne",
+       "brokenredirects-edit": "bıvırne",
        "brokenredirects-delete": "bestere",
        "withoutinterwiki": "Perrê ke zıwananê binan rê gıreyê cı çıni yo",
        "withoutinterwiki-summary": "Enê pelî ke versiyonê ziwanî binî ra link nidano.",
        "wantedtemplates": "Şablonê ke waziyenê",
        "mostlinked": "Pelî ke tewr zafî lînk bîy.",
        "mostlinkedcategories": "Kategoriyê ke tewr zehf meqaley tede estê",
-       "mostlinkedtemplates": "Pelê ke zêdêr gureniyenê",
+       "mostlinkedtemplates": "Perrê ke vêşêr gırweniyenê",
        "mostcategories": "Pelan ke tewr zaf kategorî estê.",
        "mostimages": "Dosyayan ke tewr zaf link estê.",
        "mostinterwikis": "Pelan ke tewr zaf interwiki biyê.",
        "checkbox-select": "Weçinaye: $1",
        "checkbox-all": "Pêro",
        "checkbox-none": "Temam",
-       "checkbox-invert": "Dimlaşt ke (verdindayış)",
+       "checkbox-invert": "Verdindayış",
        "allpages": "Pêro peli",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
        "changecontentmodel-title-label": "Sernameyê pele",
        "changecontentmodel-model-label": "Modelê zerrekiyo newe",
        "changecontentmodel-reason-label": "Sebeb:",
-       "changecontentmodel-submit": "Bıvurne",
+       "changecontentmodel-submit": "Bıvırne",
        "log-name-contentmodel": "Qeydê vurnayışanê modelê zerreki",
        "logentry-contentmodel-change-revertlink": "peyser biya",
        "logentry-contentmodel-change-revert": "peyser biya",
        "undeleteviewlink": "bıvin",
        "undeleteinvert": "Weçinayışi dimlaşt ke",
        "undeletecomment": "Sebeb:",
-       "undeletedrevisions": "pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revizyon|$1 revizyon}} u {{PLURAL:$2|1 dosya|$2 dosya}} ameyê halê xo yê verıni",
-       "undeletedfiles": "{{PLURAL:$1|1 dosya|$1 dosya}} tepiya anciyayi.",
        "cannotundelete": "Besternayışonhemembyana tayno nêbeno:\n$1",
        "undeletedpage": "'''$1 pel tepiya anciya'''\n\nqey karê tepiya ardışi u qey karê hewn a kerdışê verıni bıewnê [[Special:Log/delete|qeydê hewn a kerdışi]].",
        "undelete-header": "Peleyê ke veror de besterneyayê êna bıvinê: [[Special:Log/delete|qeydê esterneya]].",
        "block": "Karberi vındarne",
        "unblock": "Hesabê karberi akerê",
        "blockip": "{{GENDER:$1|Karberi}} kılit ke",
-       "blockip-legend": "Karber blok bike",
+       "blockip-legend": "Karberi blok ke",
        "blockiptext": "pê şuxulnayişê formê cêrıni, şıma eşkeni verniyê vurnayişkerdışê yew karberi ya zi yew IPyi bıgêrî. No têna qey verni-gırewtışê vandalizmiyo u gani şıma [[{{MediaWiki:Policy-url}}|qaydeyan]] re diqqet bıkeri. cêr de muheqqeq sebebê verni-grewtışi bınusi. (mesela: -nê- pelani de vandalizm kerdo)",
        "ipaddressorusername": "Adresa IPy ya zi nameyê karberi:",
        "ipbexpiry": "Qedyayış:",
        "ipbsubmit": "Nê karberi kılit ke",
        "ipbother": "Waxtê bini:",
        "ipboptions": "2 saeti:2 hours,1 roce:1 day,3 roci:3 days,1 hefte:1 week,2 heftey:2 weeks,1 aşme:1 month,3 aşmi:3 months,6 aşmi:6 months,1 serre:1 year,ebedi:infinite",
-       "ipbhidename": "Nameyê karberî listeyan u vurnayîşan ra binumne",
-       "ipbwatchuser": "Pela miniqaşe u pela ena karberî seyr bike",
+       "ipbhidename": "Namey karberi vırnayış u listan ra bınımne",
+       "ipbwatchuser": "Perra karberanê karberi u werênayışi cı ewne.",
        "ipb-disableusertalk": "No karber wexto ke bloqedeyo wa pela da xodı vurnayış kerdışi rê izin medı",
-       "ipb-change-block": "Pê ena ayaran, karberî reyna bloke bike",
+       "ipb-change-block": "Karberi be enê eyaran reyna piya bloke ke.",
        "ipb-confirm": "Bloke kerdışi tesdik ke",
        "badipaddress": "Adresê IPî raşt niyo",
        "blockipsuccesssub": "Blok biyo",
        "ipb-confirmhideuser": "Wexto ke \"karberi bınımnê\" nışandeyo se şıma ye kenê karberi bloke kerê. No, Namey karberi lista pêron dı u dekewtışê rocekan dı aktiv bo.Şıma qayıli ney bıkerê?",
        "ipb-edit-dropdown": "Sebebê blokî bivurne",
        "ipb-unblock-addr": "$1 a bik",
-       "ipb-unblock": "Yew adresê IPî ya zi nameyê karberî blok bike",
+       "ipb-unblock": "Yew adresê IPy ya zi namey karberi bloke ke",
        "ipb-blocklist": "Blokî ke hama estê ey bivîne",
        "ipb-blocklist-contribs": "İştirakê {{GENDER:$1|$1}}`i",
        "ipb-blocklist-duration-left": "$1 vet",
-       "unblockip": "Hesabê karberî a bike",
+       "unblockip": "Hesabê karberi a ke",
        "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ılit kerdışi wedarnê",
        "unblocked": "[[User:$1|$1]] blok biyo",
        "block-log-flags-nocreate": "akerdışê hesabi kılit bi",
        "block-log-flags-noautoblock": "Oto-wedariye terkneyayo",
        "block-log-flags-noemail": "e-poste kılit bi",
-       "block-log-flags-nousertalk": "pela werênayışê xo nêşeno ke bıvurno",
+       "block-log-flags-nousertalk": "perra werênayışê xo nêşeno ke bıvırno",
        "block-log-flags-angry-autoblock": "oto-wedariye amayen aktivo",
        "block-log-flags-hiddenname": "nameyê karberi nımteyo",
        "range_block_disabled": "Desturê administorî ke viraştişê blokê rangeyî kefiliyo.",
        "move-page": "$1 Bıkırış",
        "move-page-legend": "Pele bere",
        "movepagetext": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|double]] ya zi [[Special:BrokenRedirects|broken redirects]] qontrol bıki.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''Teme!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
-       "movepagetext-noredirectfixer": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|raçarnayışo dılet]] ya zi [[Special:BrokenRedirects|raçarnayışo xırab]]i qontrol bıke.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İkaz!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
+       "movepagetext-noredirectfixer": " Gırwenayışê formê bınêni do namey perre newe vırazo, pêro vêrorê cı bıkırışo namey newe ser.\nMa namey kıhanêri keni perra serşıkıtışi ser nameyo newe.\nŞıma şenê perra serşıkıtışı zi berê namey raştıkên bıvırnên.\n\nEger şıma nêwazenê, ma şıma ra reca keni şıma [[Special:DoubleRedirects|açarnayışo (tadayışo) dılet]] ya zi [[Special:BrokenRedirects|açarnayışo (tadayışon) çewt]]i kontrol kerên.\nŞıma gani kontrol kerên eger linki şınê perranê raştan ser.\n\nTeme eger ser yew name de yew nuşte esto, sistemê wiki '''nêşeno''' nuştey şıma bıkırışo. Eger ser enê namey de yew perra venge esta, sistemê wiki şeno nuştey şıma bıkırışo.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İqaz!'''\nNo kırıştış şeno yew perra populere rê wışkên u nêpawiyay bo. Ma şıma ra reca kenime, kerdışê xo ra ver peyniyê cı bıvênên.",
        "movepagetalktext": "Ma peleyê mınaqeşeyê ena pele otomatik beno, '''ma nıeşken ber, eg:'''\n*Yew peleyê mınaqeşeyê ser ena name rona esto, ya zi\n*Tı quti check nıkerd.\n\nOturse, tı gani peleyê mınaqeşeyê manually beri.",
        "moveuserpage-warning": "'''Diqet:''' Ti eka yew pelê karberi beni. Diqet bike teyna pel beni feqat ena pele reyna nameyê newi \"nebeno''.",
        "movenologintext": "qey vurnayişê nameyê peli şıma gani qeyd kerde u cıkewteyê [[Special:UserLogin|sistemi]] bıbiy.",
        "cant-move-user-page": "desturê şıma çino, şıma pelanê karberani bıkırışi (bê pelê cerıni).",
        "cant-move-to-user-page": "desturê şıma çino, şıma yew peli bıkırışi pelê yew karberi.",
        "newtitle": "Sernameyo newe:",
-       "move-watch": "Pela çıme u meqsedi seyr ke",
+       "move-watch": "Perra çımey u kırıştışi pıro bıdê",
        "movepagebtn": "Pele bere",
        "pagemovedsub": "Berdışi kerd temam",
        "movepage-moved": "'''\"$1\" berd \"$2\"'''",
        "tooltip-pt-anonuserpage": "pelê karberê IPyi",
        "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-preferences": "Tercihê {{GENDER:|şıma}}",
        "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-ca-delete": "Ena pele bestere",
        "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-watch": "Ena perre 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": "Şo pela seri",
-       "tooltip-n-mainpage": "Şo pela seri",
-       "tooltip-n-mainpage-description": "Şo pela seri",
+       "tooltip-p-logo": "Şo perra seri",
+       "tooltip-n-mainpage": "Şo perra seri",
+       "tooltip-n-mainpage-description": "Şo perra seri",
        "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 dı yew lista vurnayışanê peyênan",
        "tooltip-ca-nstab-category": "Pela kategoriye bıvêne",
        "tooltip-minoredit": "Ney vırnayışo werdi nışan bıkerê",
        "tooltip-save": "Vurnayışanê xo qeyd ke",
-       "tooltip-publish": "Vurnayışê xo vıla kı",
+       "tooltip-publish": "Vırnayışê xo aşkera ke",
        "tooltip-preview": "Vurnayışanê xo çım ra bıviyarnê. Qeydkerdış ra ver bıgurê cı!",
        "tooltip-diff": "Kamci vırnayışê ke şıma nuştey sero kerdê, inan bıvênê.",
        "tooltip-compareselectedversions": "Ena per de ferqê rewziyonan de dı weçinaya bıvinê",
        "unit-pixel": "px",
        "confirm_purge_button": "Temam",
        "confirm-purge-top": "Vervirê na pele bestere?",
-       "confirm-purge-bottom": "Purge kerdişê yew pel cacheyî estereno u revizyonê penîyî mucneno.",
+       "confirm-purge-bottom": "Pakkerdışê yew perre virê verêni estereno u çımraviyarnayışê peyêni gêno ver.",
        "confirm-watch-button": "TEMAM",
        "confirm-watch-top": "Ena pele lista xoya seyrkerdışi ke",
        "confirm-unwatch-button": "TEMAM",
        "hebrew-calendar-m6": "Adar",
        "hebrew-calendar-m6a": "Adar I",
        "hebrew-calendar-m6b": "Adar II",
-       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m7": "Nisane",
        "hebrew-calendar-m8": "Iyar",
        "hebrew-calendar-m9": "Sivan",
        "hebrew-calendar-m10": "Tamuz",
        "hebrew-calendar-m6-gen": "Adar",
        "hebrew-calendar-m6a-gen": "Adar I",
        "hebrew-calendar-m6b-gen": "Adar II",
-       "hebrew-calendar-m7-gen": "Nisan",
+       "hebrew-calendar-m7-gen": "Nisane",
        "hebrew-calendar-m8-gen": "Iyar",
        "hebrew-calendar-m9-gen": "Sivan",
        "hebrew-calendar-m10-gen": "Tamuz",
        "htmlform-chosen-placeholder": "Opsiyon weçine",
        "htmlform-cloner-create": "Tayêna cı ke",
        "htmlform-cloner-delete": "Wedare",
-       "logentry-delete-delete": "$1 pela $3 {{GENDER:$2|esterıte}}",
+       "logentry-delete-delete": "$1 perra $3 {{GENDER:$2|esterıte}}",
        "logentry-delete-restore": "$1 pela $3 {{GENDER:$2|peyser arde}}",
        "logentry-delete-event": "$1 $3: $4 de asayışê {{PLURAL:$5|cıkerdışi|cıkerdışan}} {{GENDER:$2|vurna}}",
        "logentry-delete-revision": "$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} {{GENDER:$2|vurna}}",
        "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": "{| 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": "$1 perra $3 {{GENDER:$2|kırışt}} $4",
        "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-move-move_redir": "$1 {{GENDER:$2|kırışna}} riperr $3 be $4 weçarnayış sera.",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|berd}} riperrê $3 be $4 weçarnayış sera, weçarnayış nêverda.",
        "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",
        "logentry-newusers-newusers": "Hesabê karberê $1 {{GENDER:$2|vıraziya}}",
        "log-name-managetags": "Qeydê idareyê etiketi",
        "log-name-tag": "Qeydê etiketi",
        "rightsnone": "(çıniyo)",
-       "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ı kontrol kı. Xetay newi xeber kı.",
        "expand_templates_generate_xml": "Dara XML arêdayoği bımocne",
        "expand_templates_generate_rawhtml": "Xam HTML'i bıvin",
        "expand_templates_preview": "Verqayt",
-       "pagelanguage": "Zıwanê perer bıvırnê",
+       "pagelanguage": "Zıwanê perre bıvırnê",
        "pagelang-name": "Pele",
        "pagelang-language": "Zıwan",
        "pagelang-use-default": "Zıwanê hesabiyayeyi bıgurene",
index 00c1e20..2209b3a 100644 (file)
        "externaldberror": "Abo jo wustupiła eksterna zmólka awtentifikacije datoweje banki, abo njesmějoš swójo eksterne wužywarske konto aktualizěrowaś.",
        "login": "Pśizjawiś se",
        "nav-login-createaccount": "Pśizjawiś se/Konto załožyś",
-       "userlogin": "Pśizjawiś se/Konto załožyś",
-       "userloginnocreate": "Pśizjawiś",
        "logout": "wótzjawiś se",
        "userlogout": "wótzjawiś se",
        "notloggedin": "Njepśizjawjony(a)",
        "userlogin-noaccount": "Njamaš wužywarske konto?",
        "userlogin-joinproject": "Konto za {{GRAMMAR:akuzatiw|{{SITENAME}}}} załožyś",
-       "nologin": "Njamaš wužywarske konto? $1.",
-       "nologinlink": "Nowe wužywarske konto załožyś",
        "createaccount": "Wužywarske konto załožyś",
-       "gotaccount": "Maš južo wužywarske konto? '''$1'''.",
-       "gotaccountlink": "Pśizjawiś se",
-       "userlogin-resetlink": "Sy pśizjawjeńske daty zabył?",
        "userlogin-resetpassword-link": "Sy swójo gronidło zabył?",
        "userlogin-helplink2": "Pomoc pśi pśizjawjenju",
        "userlogin-loggedin": "Sy južo ako {{GENDER:$1|$1 pśizjawjony|$1 pśizjawjona}}. Wužyj slědujucy formular, aby se ako drugi wužywaŕ pśizjawił.",
        "createacct-another-email-ph": "E-mailowu adresu zapódaś",
        "createaccountmail": "Nachylne pśipadne gronidło wužywaś a jo na pódanu e-mailowu adresu pósłaś",
        "createacct-realname": "Napšawdne mě (opcionalny)",
-       "createaccountreason": "Pśicyna:",
        "createacct-reason": "Pśicyna",
        "createacct-reason-ph": "Cogodla załožujoš druge konto?",
        "createacct-submit": "Twójo konto załožyś",
        "anonpreviewwarning": "''Njejsy pśizjawjony. Składowanje pśenosujo twóju IP-adresu do wobźěłowańskeje historije toś togo boka.''",
        "missingsummary": "'''Pokazka:''' Njejsy žedno zespominanje zapódał. Gaž kliknjoš na \"Składowaś\" składujo se bok bźez zespominanja.",
        "missingcommenttext": "Pšosym zespominanje zapódaś.",
-       "missingcommentheader": "'''Glědaj:''' Njejsy temu/ nadpismo za toś ten komentar pódał. Gaž kliknjoš na \"{{int:savearticle}}\" znowego, składujo se twójo wobźěłanje mimo temy/nadpisma.",
+       "missingcommentheader": "'''Glědaj:''' Njejsy temu/ nadpismo za toś ten komentar pódał. Gaž kliknjoš na \"$1\" znowego, składujo se twójo wobźěłanje mimo temy/nadpisma.",
        "summary-preview": "Pśeglěd zespominanja:",
        "subject-preview": "Pśeglěd nadpisma:",
        "blockedtitle": "Wužywaŕ jo se blokěrował",
        "editingsection": "Wobźěłanje boka $1 (wótrězk)",
        "editingcomment": "$1 (nowy wótrězk) se wobźěłujo",
        "editconflict": "Wobźěłański konflikt: $1",
-       "explainconflict": "Něchten drugi jo bok změnił, pó tym, až sy zachopił jen wobźěłaś.\nGórjejcne tekstowe pólo wopśimjejo tekst boka, ako tuchylu eksistěrujo.\nTwóje změny pokazuju se w dołojcnem tekstowem pólu.\nPšosym zapódaj twóje změny do górjejcnego tekstowego póla.\n'''Jano''' wopśimjeśe górjejcnego tekstowego póla se składujo, gaž tłocyš na \"{{int:savearticle}}\".",
+       "explainconflict": "Něchten drugi jo bok změnił, pó tym, až sy zachopił jen wobźěłaś.\nGórjejcne tekstowe pólo wopśimjejo tekst boka, ako tuchylu eksistěrujo.\nTwóje změny pokazuju se w dołojcnem tekstowem pólu.\nPšosym zapódaj twóje změny do górjejcnego tekstowego póla.\n'''Jano''' wopśimjeśe górjejcnego tekstowego póla se składujo, gaž tłocyš na \"$1\".",
        "yourtext": "Twój tekst",
        "storedversion": "Składowana wersija",
        "nonunicodebrowser": "'''Glědaj:''' Twój browser njamóžo unicodowe znamuška pšawje pśeźěłaś. Pšosym wužywaj hynakšy browser.",
        "right-editprotected": "Boki wobźěłaś, kótarež su pśez \"{{int:protect-level-sysop}}\" šćitane",
        "right-editsemiprotected": "Boki wobźěłaś, kótarež su pśez \"{{int:protect-level-autoconfirmed}}\" šćitane",
        "right-editinterface": "Wužywański pówjerch wobźěłaś",
-       "right-editusercssjs": "Dataje CSS a JS drugich wužywarjow wobźěłaś",
        "right-editusercss": "Dataje CSS drugich wužywarjow wobźěłaś",
        "right-edituserjs": "Dataje JS drugich wužywarjow wobźěłaś",
        "right-editmyusercss": "Twóje swójske wužywarske CSS-dataje wobźěłaś",
        "rcshowhidemine": "móje pśinoski $1",
        "rcshowhidemine-show": "Pokazaś",
        "rcshowhidemine-hide": "Schowaś",
-       "rclinks": "Slědne $1 změny slědnych $2 dnjow pokazaś<br />$3",
+       "rclinks": "Slědne $1 změny slědnych $2 dnjow pokazaś",
        "diff": "rozdźěl",
        "hist": "wersije",
        "hide": "schowaś",
        "undeleteviewlink": "woglědaś se",
        "undeleteinvert": "Wuběrk pśewobrośiś",
        "undeletecomment": "Pśicyna:",
-       "undeletedrevisions": "{{PLURAL:$1|1 wersija jo se nawrośiła|$1 wersiji stej se nawrośiłej|$1 wersije su se nawrośili}}.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 wersija|$1 wersiji|$1 wersije}} a {{PLURAL:$2|1 dataja|$2 dataji|$2 dataje}} {{PLURAL:$2|jo se nawrośiła|stej se nawrośiłej|su se nawrośili}}.",
-       "undeletedfiles": "{{PLURAL:$1|1 dataja jo se nawrośiła|$1 dataji stej se nawrośiłej|$1 dataje su se nawrośili}}.",
        "cannotundelete": "Wótnowjenje njejo se raźiło:\n$1",
        "undeletedpage": "Bok '''$1''' jo se nawrośił.\n\nW [[Special:Log/delete|log-lisćinje wulašowanjow]] namakajoš pśeglěd wulašowanych a nawrośonych bokow.",
        "undelete-header": "Gano wulašowane boki wiźiš w [[Special:Log/delete|log-lisćinje wulašowanjow]].",
        "logentry-rights-rights-legacy": "$1 jo kupkowe cłonkojstwo za $3 {{GENDER:$2|změnił|změniła}}",
        "logentry-rights-autopromote": "$1 jo se awtomatiski wót $4 do $5 {{GENDER:$2|pśirědował|pśirědowała}}",
        "rightsnone": "(nic)",
-       "revdelete-summary": "Zespominanje wobźěłanja",
        "feedback-adding": "Komentar pśidawa se bokoju...",
        "feedback-bugcheck": "Wjelicnje! Pśekontrolěruj jano, lěc to njejo jadna z [$1 znatych zmólkow].",
        "feedback-bugnew": "Som pśekontrolěrował. Nowu zmólku k wěsći daś",
index 68ce13c..bb6e9db 100644 (file)
        "externaldberror": "Haro nokosilap pongintutunan bingdata toi awu ko pasagaon monginwagu takaun poinsoliwannu.",
        "login": "Sumuang log",
        "nav-login-createaccount": "Sumuang log / pomonsoi  do takaun",
-       "userlogin": "Sumuang log / pomonsoi  do takaun",
-       "userloginnocreate": "Sumuang log",
        "logout": "Lumabus log",
        "userlogout": "Lumabus log",
        "notloggedin": "Amu nokolog sumuang",
        "userlogin-noaccount": "Ingaa poh takaun?",
        "userlogin-joinproject": "Tanud {{SITENAME}}",
-       "nologin": "Ingaa akaun? $1",
-       "nologinlink": "Pomonsoi do akaun",
        "createaccount": "Pomonsoi do takaun",
-       "gotaccount": "Kitakaun? $1",
-       "gotaccountlink": "Sumuang log",
-       "userlogin-resetlink": "Nolihuan ahal loginnu?",
        "userlogin-resetpassword-link": "Nolihuan borospanalibnu?",
        "userlogin-helplink2": "Sokodung do sumuang log",
        "createaccountmail": "Gunoo nunu nopo kaatalib om pootodo id surat-i ii poinsurat id siriba diti",
-       "createaccountreason": "Sabab:",
        "badretype": "Kaatalib pinosuang awu kopisangai.",
        "userexists": "Ngaranmoguno pinosuang noguno no.\nMaai alanai do suai ngaran.",
        "loginerror": "Nokosilap sumuang log",
        "passwordreset-disabled": "Pomudolian kawagu do kaatalib kitaantob id wiki diti.",
        "passwordreset-username": "Ngarandait:",
        "passwordreset-domain": "Sumanganu:",
-       "passwordreset-capture": "Intaai surat-i dii nowonsoi?",
-       "passwordreset-capture-help": "Nung goritannu id kutak diti, surat-i (ii ki-kaa-talib daamot) mangan pokitanai montok dia om nogi porikoton montok momomoguno diti.",
        "passwordreset-email": "Porikatan surat-i:",
        "passwordreset-emailtitle": "Kointalangan takaun id {{SITENAME}}",
        "passwordreset-emailelement": "Ngaranmoguno: \n$1\n\nKaatalib daamot: \n$2",
        "showdiff": "Pokitono nokowolion",
        "anoneditwarning": "'''Woning:''' Awu ko poinlog sumuang.\nNantadon IPnu maan podolino id susuyan bolikon nidit do hiti.",
        "anonpreviewwarning": "''Awu ko poinsuang log. Popogompi do sinuratan koponurat do kinoyonon IPnu id bobolikon susuyan niditan.''",
-       "missingsummary": "'''Panansarahan:''' Awu nu nosuratan hilo id koinibaan niditan.\nNung todosonnu \"{{int:savearticle}}\" kawagu, kogompi niditannu nga ingaa koinibaan.",
+       "missingsummary": "'''Panansarahan:''' Awu nu nosuratan hilo id koinibaan niditan.\nNung todosonnu \"$1\" kawagu, kogompi niditannu nga ingaa koinibaan.",
        "missingcommenttext": "Mangai gia posuango pason id siriba.",
-       "missingcommentheader": "'''Panansarahan:''' Awu nu nokosuang ahal/tuluhon montok pason diti.\nNung todosonnu \"{{int:savearticle}}\" kawagu, kogompi niditannu nga ingaa aha//tuluhon.",
+       "missingcommentheader": "'''Panansarahan:''' Awu nu nokosuang ahal/tuluhon montok pason diti.\nNung todosonnu \"$1\" kawagu, kogompi niditannu nga ingaa aha//tuluhon.",
        "summary-preview": "Pongitanan koinibaan:",
        "subject-preview": "Pongitanan ahal/tuluhon:",
        "blockedtitle": "Nantaban momoguno",
        "rcshowhideanons": "$1 momomoguno awu popointutun",
        "rcshowhidepatr": "$1 niditan nosimak",
        "rcshowhidemine": "$1 niditanku",
-       "rclinks": "Popokito soginumu $1 kaalanai id suang $2 tadau<br />$3",
+       "rclinks": "Popokito soginumu $1 kaalanai id suang $2 tadau",
        "diff": "pisuai",
        "hist": "susui",
        "hide": "Popolisok",
        "external_image_whitelist": " #Pologoson baris diti<pre>\n#Suangai do boros koubasanan (guas boros id pialatan //) ponongsiriba\n#Noputan di kaagal pojodion do toput poinsuang (toput koubasanan) do tangagambar\n#Toput di kaagal no silihon do gambar, nung awu nga okito o noputan sinuratan\n#Baris di kisimbol do # nopo nga ointutunan sobaagi do bolotok\n#Tumanud do pisuaian A om a\n\n#Posurato toinsanan id sawat do garis diti. Pologoson iti garis miagal diti</pre>",
        "tag-filter": "[[Special:Tags|Pananda]] gagan:",
        "revdelete-restricted": "pinokogos pogoduhan montok momuruan",
-       "revdelete-unrestricted": "pinoidu pogoduhan montok momuruan",
-       "revdelete-summary": "idito koinibaan"
+       "revdelete-unrestricted": "pinoidu pogoduhan montok momuruan"
 }
index cb1e286..be955da 100644 (file)
@@ -53,9 +53,9 @@
        "tog-norollbackdiff": "पैलास्थितिमी फर्काएपछा भिन्नता हटाउन्या",
        "tog-useeditwarning": "सम्पादनहरू सङ्ग्रह नगरिएका अवस्थामी अर्को पानामी जान खोज्या चेतावनी धेखाउन्या",
        "tog-prefershttps": "प्रवेश गरन्ज्या जबलै सुरक्षित जडानको प्रयोग गर्न्या",
-       "underline-always": "सधà¥\88à¤\82",
+       "underline-always": "à¤\9cबलà¥\88",
        "underline-never": "कभैई नाई",
-       "underline-default": "à¤\96à¥\8bल à¤\85थवा à¤¬à¥\8dराà¤\89à¤\9cर à¤ªà¥\88लà¥\80à¤\95ाà¤\9cसà¥\8b",
+       "underline-default": "à¤\96à¥\8bल à¤\94र à¤¬à¥\8dराà¤\89à¤\9cर à¤¨à¤¿à¤°à¥\8dधारित",
        "editfont-style": "फन्ट प्रकार क्षेत्र सम्पादन गर:",
        "editfont-default": "ब्राउजर पूर्वस्थिति",
        "editfont-monospace": "मोनोस्पेस्ड फन्ट",
@@ -64,7 +64,7 @@
        "sunday": "आइतबार",
        "monday": "सौउबार",
        "tuesday": "माङलबार",
-       "wednesday": "बà¥\81धबार",
+       "wednesday": "बà¥\8bबार",
        "thursday": "बीपैबार",
        "friday": "शुकबार",
        "saturday": "छन्चरबार",
        "redirectedfrom": "($1 बठेइ पुन:निर्देशित)",
        "redirectpagesub": "अनुप्रेषित पानो",
        "redirectto": "पठाएको पाना:",
-       "lastmodifiedat": "यà¥\88 à¤ªà¤¨à¥\8dनालाà¤\88 à¤\9bाडà¥\8dडà¥\80बाऱ $2 à¤¬à¤\9cà¥\87, $1 à¤®à¥\80 à¤¹à¥\87रफà¥\87र गरियाऽ थ्यो।",
+       "lastmodifiedat": "यà¥\88 à¤ªà¤¨à¥\8dनालाà¤\88 à¤\9bाडà¥\8dडà¥\80बार $1मà¥\80 $2 à¤¬à¤\9cà¥\87 à¤¸à¤®à¥\8dपादन गरियाऽ थ्यो।",
        "viewcount": "यो पाना हेरियाको थियो {{PLURAL:$1|एकपटक|$1 पटक}}",
        "protectedpage": "सुरक्षित गर्याका पानाहरू",
        "jumpto": "यैमी फट्टाक:",
        "login": "प्रवेश (लगईन)",
        "login-security": "तमरो पहिचान जाचँ गर",
        "nav-login-createaccount": "प्रवेश गर्ने/नयाँ खाता बनाउन्या",
-       "userlogin": "प्रवेश गर्ने / नयाँ खाता बनाउन्या",
-       "userloginnocreate": "प्रवेश",
        "logout": "बाहिर निस्कन्या",
        "userlogout": "बाहिर निस्कन्या",
        "notloggedin": "प्रवेश (लग ईन) नगरिएको",
        "userlogin-noaccount": "के खाता छैन ?",
        "userlogin-joinproject": "{{SITENAME}} मी खाता खोल ।",
-       "nologin": "तमरो खाता छैन? $1।",
-       "nologinlink": "नयाँ खाता खोल",
        "createaccount": "खाता खोल",
-       "gotaccount": "तमरो खाता छनोई छ? $1।",
-       "gotaccountlink": "प्रवेश",
-       "userlogin-resetlink": "प्रवेश सम्बन्धी विवरणहरू बिसरया भयो?",
        "userlogin-resetpassword-link": "पासवर्ड भुलिगया?",
        "userlogin-helplink2": "प्रवेश गद्दलाई सहयोग",
        "userlogin-loggedin": "तमी {{GENDER:$1|$1}}को रूपमी प्रवेश (लग इन) भइ सक्यौ ।\nअर्को प्रयोगकर्ताको रूपमी प्रवेश (लग इन) गर्न तलको फारम प्रयोग गर ।",
        "createacct-email-ph": "तमरो इमेल ठेगाना भरऽ",
        "createacct-another-email-ph": "इमेल ठेगाना भर",
        "createacct-realname": "वास्तविक नाम (ऐच्छिक)",
-       "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "क्याई तम नयाँ खाता खोल्ला छौ?",
        "createacct-submit": "तमरो खाता बनाऽ",
        "noname": "तमीले सही प्रयोगकर्ता नाम दिएनौ।",
        "loginsuccesstitle": "प्रवेश सफल",
        "loginsuccess": "'''तमले {{SITENAME}}मी  \"$1\" को रुपमी प्रवेश गरया छौ।'''",
+       "nosuchuser": "\"$1\" नाउँ भयाः कोइलै प्रयोगकर्ता नाइथिन।\nप्रयोगकर्ता नाउँ वर्णसंवेदनशील हुनान।\nतमरो हिज्जे जाँचः, या [[Special:CreateAccount|नौलो खाता बनाः]]।",
+       "nosuchusershort": " \"$1\" नाउँ भयाः कोइलै प्रयोगकर्ता नाइथिन।\n तमरो हिज्जे जाँचः।",
        "nouserspecified": "प्रयोगकर्ता नाम दिनु अनिवार्य छ।",
        "login-userblocked": "ये प्रयोगकर्तालाई रोक लगाया छ। प्रवेश गददु अनुमति छैन।",
        "wrongpassword": "पासवर्ड गलत हालियो।\nकृपया आजी प्रयास गरया।",
        "wrongpasswordempty": "हालिएया पासवर्ड खालि थ्यो।\nकृपया आजी प्रयास गरया।",
+       "passwordtooshort": "पासवर्ड कम्तिमालै {{PLURAL:$1|१ अक्षर|$1 अक्षरन}}को हुनुपडन्छ।",
+       "passwordtoolong": "पासवर्ड {{PLURAL:$1|१ अक्षर|$1 अक्षरन}} है लामो हुननाइसक्दो।",
        "password-name-match": "तमरो प्रवेशशव्द प्रयोगकर्ता नाम है फरक हुनपडन्छ ।",
        "password-login-forbidden": "ये प्रयोगकर्ता नाम र प्रवेश शब्द वर्जित गरिया छ।",
        "mailmypassword": "पासवर्ड पूर्वनिर्धारित गर",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वालोकन धेकाउन्या",
        "showdiff": "परिवर्तन धेकाउन्या",
-       "blankarticle": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤¤à¤® à¤\8fà¤\95 à¤\96ालि à¤ªà¤¾à¤¨à¤¾à¤\95à¥\8b à¤¨à¤¿à¤°à¥\8dमाण à¤\97दà¥\8dद à¤²à¤¾à¤\97à¥\8dयाà¤\9bà¥\8c à¥¤\nयदि à¤¤à¤®à¤²à¥\87 \"{{int:savearticle}}\" à¤²à¤¾à¤\88 à¤ªà¥\81नà¤\83 à¤¥à¤¿à¤\9aà¥\8dयà¥\8c à¤­à¤£à¥\8dया à¤ªà¤¾à¤¨à¥\8b à¤¬à¤¿à¤¨à¤¾ à¤\95à¥\81नà¥\88 à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤¨à¥\88 à¤¨à¤¿à¤°à¥\8dमित à¤\97रिनà¥\8dयाà¤\9b ।",
+       "blankarticle": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤¤à¤® à¤\8fà¤\95 à¤\96ालि à¤ªà¤¨à¥\8dâ\80\8dना à¤¬à¤¨à¤¾à¤\89नà¥\8dâ\80\8dनाà¤\9bà¥\8c।\nयदि à¤¤à¤®à¤²à¥\87 \"$1\" à¤²à¤¾à¤\88 à¤\86à¤\81à¤\9cि à¤¥à¤¿à¤\9aà¥\8dयà¥\8c à¤­à¤£à¥\8dया à¤¬à¤¿à¤¨ à¤\95à¥\87à¤\87 à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤ªà¤¾à¤¨à¥\8b à¤¬à¤¨à¤¾à¤\8fलà¥\8b।",
        "anoneditwarning": "<strong>चेतावनी:</strong> तमले प्रवेश अरेको नाइथिन । तमरो आइपि ठेगाना पाना सम्पादन इतिहासमि दर्ता गरिन्या छ र यो सब्बैले हेद्द सक्कान । यदि तमलाईँ <strong>[$1 लगईन]</strong> वा <strong>[$2 नयाँ खाता बनाउन्या] गर्याभण्या तमबठे गरियाको सम्पादन तमरो प्रयोगकर्तानाममि जोडिन्याछ ।",
-       "missingsummary": "'''यादगर्या :''' तमीले सम्पादन सारांश दियाका छैनौ ।\nयदि तमीले \"{{int:savearticle}}\"  थिच्यौ भण्या , सारांश बिना नै सङ्ग्रहित गरिन्या छ ।",
-       "selfredirect": "<strong>चेतावनी:</strong> तम यै पानालाई आफुमी पुनः निर्देशित गद्द लाग्याछौ ।\nहुनसक्छ तम अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गद्द लाग्याछौ, वा गलत पानाको सम्पादन गद्द लाग्याछौ ।\nतम पुनः एकपल्ट \"{{int:savearticle}}\" क्लिक गद्दाछौ, पुनः निर्देशित तसै लै बनाइन्याछ।",
+       "missingsummary": "'''यादगर्या :''' तमीले सम्पादन सारांश दियाका छैनौ ।\nयदि तमीले \"$1\"  थिच्यौ भण्या , सारांश बिना नै सङ्ग्रहित गरिन्या छ ।",
+       "selfredirect": "<strong>चेतावनी:</strong> तम यै पानालाई आफुमी पुनः निर्देशित गद्द लाग्याछौ ।\nहुनसक्छ तम अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गद्द लाग्याछौ, वा गलत पानाको सम्पादन गद्द लाग्याछौ ।\nतम पुनः एकपल्ट \"$1\" क्लिक गद्दाछौ, पुनः निर्देशित तसै लै बनाइन्याछ।",
        "missingcommenttext": "कृपया तलतिर टिप्पणी राख ।",
-       "missingcommentheader": "'''याद गर :''' तमले टिप्पणीमी विषय /शीर्ष पंक्ति  दियाका छैनौ ।\nतमले फेरि \"{{int:savearticle}}\"  थिच्यौ भण्या , तमरो सम्पादन यसै रुपमी संग्रहित हुन्याछ ।",
-       "summary-preview": "साराà¤\82श पूर्वालोकन:",
-       "subject-preview": "विषय पूर्वरुप:",
+       "missingcommentheader": "'''याद गर :''' तमले टिप्पणीमी विषय /शीर्ष पंक्ति  दियाका छैनौ ।\nतमले फेरि \"$1\"  थिच्यौ भण्या , तमरो सम्पादन यसै रुपमी संग्रहित हुन्याछ ।",
+       "summary-preview": "समà¥\8dपादन à¤¸à¤¾à¤°à¤¾à¤\82शà¥\8bà¤\83 पूर्वालोकन:",
+       "subject-preview": "विषयोः पूर्वरुप:",
        "previewerrortext": "तमरो परिवर्तनको पूर्वावलोकन बनाउन खोज्दा समस्या आयाको छ ।",
        "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कृपया तमरा प्रश्नमी सबै जानकारी खुलाया ।",
        "page_first": "पैल्लो",
        "page_last": "छाड्डीबारको",
        "histlegend": "अन्तर चयन:संशोधनहरूको तुलनाको लागि रेडियो बाकसमी क्लिक गरिबर इण्टर गर अथवा तल दियाको बटनमी थिच <br />\nलिजेंड: (चालू): '''({{int:cur}})''' = अवतरणको बीचमी अन्तर, '''({{int:last}})''' = पैल्लीका अवतरणको बीचमी अन्तर, '''{{int:minoreditletter}}''' = नानो परिवर्तन।",
-       "history-fieldset-title": "à¤\87तिहासà¤\95à¥\8b à¤µà¤¿à¤\9aरण à¤\97रà¥\8dनà¥\87",
-       "history-show-deleted": "मà¥\87à¤\9fिà¤\8fà¤\95ा à¤®à¤¾à¤¤à¥\8dर",
+       "history-fieldset-title": "सà¤\82शà¥\8bधनà¤\85न à¤\96िलाà¤\87 à¤\96à¥\8bà¤\9cऽ",
+       "history-show-deleted": "सà¤\82शà¥\8bधन à¤®à¥\87à¤\9fियाà¤\95à¥\8b à¤®à¤¾à¤¤à¥\8dतरà¥\88",
        "histfirst": "सबहै पुरानो",
        "histlast": "नयाँ",
        "historysize": "({{PLURAL:$1|१ अक्षर|$1 अक्षरहरू}})",
        "search-category": "(श्रेणी $1)",
        "search-file-match": "(भेटिईया फाइल सामाग्री)",
        "search-suggest": "काहीं तमले खोज्याको : $1 त होइन ?",
-       "search-interwiki-caption": "बà¥\88ना à¤\86यà¥\8bà¤\9cना",
+       "search-interwiki-caption": "भà¥\8dरातà¥\83परियà¥\8bà¤\9cनाà¤\85न à¤¬à¤ à¥\87 à¤¨à¤¤à¤¿à¤\9cाà¤\85न",
        "search-interwiki-default": "$1बठेका नतिजाहरू:",
        "search-interwiki-more": "(आजी)",
        "search-relatedarticle": "सम्बन्धित",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "फरक",
        "prefs-help-prefershttps": "यो रोजाई तमरो अर्को  लग इन बठे लागु हुन्याछ ।",
-       "userrights": "प्रयोगकर्ता अधिकार व्यवस्थापन",
+       "userrights": "प्रयोगकर्ता अधिकारन",
        "userrights-lookup-user": "यक प्रयोगकर्ता छानऽ",
        "userrights-user-editname": "प्रयोगकर्ता नाम दिय:",
        "editusergroup": "प्रयोगकर्ता समूहअन लोड अरऽ",
-       "userrights-editusergroup": "प्रयोगकर्ता समूह सम्पादन गर",
+       "userrights-editusergroup": "{{GENDER:$1|प्रयोगकर्ता}} समूहअन सम्पादन गरऽ",
        "saveusergroups": "सुरक्षित {{GENDER:$1|प्रयोगकर्ता}} समूहहरू",
        "userrights-groupsmember": "को सदस्य:",
        "userrights-groupsmember-auto": "अंतर्निहित सदस्य:",
        "right-block": "अरु प्रयोगकर्तानलाई सम्पादन गद्दाकी ब्लक गर",
        "right-unblockself": "आफुलाई खुल्ला गर ।",
        "right-editprotected": "\"{{int:protect-level-sysop}}\" को हैसियतले सुरक्षित पानाहरू सम्पादन गद्या",
-       "right-editusercssjs": "अन्य प्रयोगकर्ताको सी.एस.एस. रे जाभास्क्रिप्ट फाइलहरू सम्पादन गद्या",
        "right-editusercss": "अन्य प्रयोगकर्ताको सी. एस. एस. फाइलहरू सम्पादन गद्या",
        "right-edituserjs": "अरु प्रयोकर्ताका जाभास्क्रिप्ट फाइलहरू सम्पादन गर्न्या",
        "right-rollback": "पछिल्लो प्रयोगकर्ताको सम्पादनहरूलाई छरितो रुपमी पछाडि पर्काउन्या",
        "recentchanges-label-plusminus": "यति बाइटहरू संख्याले पानाको आकार फेरबदल  भयाको छ",
        "recentchanges-legend-heading": "<strong>आदर्श वाक्य:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नौला पानाको सूची]] यैलाई लै हेरिदिय)",
+       "rcfilters-quickfilters-placeholder": "दोबरा प्रयोग अद्दाइ तमरा पसन्दीदा औजार मिलानअन सञ्‍चय अरऽ।",
+       "rcfilters-savedqueries-rename": "पुनर्नामकरण",
+       "rcfilters-savedqueries-remove": "हटाऽ",
+       "rcfilters-savedqueries-new-name-label": "नाउँ",
+       "rcfilters-savedqueries-cancel-label": "रद्द",
+       "rcfilters-filter-editsbyself-label": "तम हताँ अरियाऽ फेरबदेलाअन",
+       "rcfilters-filter-editsbyself-description": "तमरा आफ्फुनाइ योगदानन",
+       "rcfilters-filter-editsbyother-label": "अउर हताँ अरियाऽ फेरबदेलाअन",
+       "rcfilters-filter-editsbyother-description": "तमरा आफ्फुनाइ बाहेक अउर सप्पै फेरबदेलाअन।",
+       "rcfilters-filtergroup-lastRevision": "छाड्डीबारोः संशोधन",
+       "rcfilters-filter-lastrevision-label": "छाड्डीबारोः संशोधन",
        "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउन्या",
        "rcshowhideminor": "$1 सानतिनो सम्पादन",
        "rcshowhideminor-show": "धेकाइदिय",
        "rcshowhidemine-hide": "लुकाऽ",
        "rcshowhidecategorization-show": "धेकाउन्या",
        "rcshowhidecategorization-hide": "लुकाउन्या",
-       "rclinks": "पà¤\9bिलà¥\8dला $1 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82 à¤ªà¤\9bाडिà¤\95ा $2 à¤¦à¤¿à¤¨à¤¹à¤°à¥\82मà¥\80<br />$3",
+       "rclinks": "à¤\97याà¤\83 $2 à¤¦à¤¿à¤¨à¤¨à¤®à¥\80 à¤­à¤¯à¤¾à¤\83 à¤\9bाडà¥\8dडà¥\80à¤\9aालाà¤\83 $1 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनन à¤§à¥\87à¤\95ाà¤\83",
        "diff": "फरक",
        "hist": "इतिहास",
        "hide": "लुकाइदिय",
        "upload-form-label-usage-title": "रिती",
        "upload-form-label-usage-filename": "फाइल नाउ",
        "uploadstash-nofiles": "तमरा कोइ पनि स्टाश गर्याका फाइलहरू नाइथिन् ।",
-       "uploadstash-badtoken": "तà¥\8dयà¥\8b à¤\95ारà¥\8dय à¤\85सफलभयà¥\8b , à¤¸à¤¾à¤¯à¤¦ à¤¤à¤®à¤°à¥\8b à¤¸à¤®à¥\8dपादन à¤\85धिà¤\95ार à¤¸à¤®à¤¾à¤ªà¥\8dत à¤­à¤¯à¥\8b à¥¤ à¤ªà¥\81न: à¤ªà¥\8dरयास à¤\97र ।",
+       "uploadstash-badtoken": "तà¥\8b à¤\95ारà¥\8dय à¤\85दà¥\8dदाà¤\87 à¤\85सफल, à¤¸à¤¾à¤¯à¤¦ à¤¤à¤®à¤°à¥\8b à¤¸à¤®à¥\8dपादन à¤\85धिà¤\95ार à¤¸à¤®à¤¾à¤ªà¥\8dत à¤¹à¥\8bà¤\87à¤\97à¥\8dयà¥\8b। à¤\95à¥\83पया à¤¦à¥\8bसरà¥\8dयाà¤\82 à¤ªà¥\8dरयास à¤\97रऽ।",
        "uploadstash-refresh": "फाइलहरूको सूची ताजा गर्न्या",
        "license-header": "आज्ञापत्र दिन्नाछ़",
        "listfiles-summary": "यै खास पानाले अपलोड गर्याका सबै फाइलहरू धेकाउन्छ ।",
        "filehist-user": "प्रयोगकर्ता",
        "filehist-dimensions": "आयाम",
        "filehist-comment": "टिप्पणी",
-       "imagelinks": "फाइलको प्रयोगहरु",
+       "imagelinks": "फाइल उपयोग",
        "linkstoimage": "यै चित्रमी निम्न{{PLURAL:$1|पाना जोडिनान{{PLURAL:$1|}}|$1 पानाहरू जोडिनान्}}:",
        "nolinkstoimage": "यो चित्रसित लिंकभयाकि कोइ पाना नाइथी",
        "morelinkstoimage": "यै फाइलको [[Special:WhatLinksHere/$1|थप लिंकहरू]] हेर ।",
        "undeletehistory": "यदि कुनै पानालाई पुन: स्थापन गरायौ भण्या सम्पूर्ण संस्करणहरू इतिहासमी पुन:स्थापन हुन्याछन् ।\nयदि यै नामबठे  नयाँ पानो निर्माण भैसक्याको छ भण्या पुन: स्थापित संस्करणहरू पूर्व इतिहासको रुपमी स्थापित हुन्याछन् ।",
        "undeleterevdel": "यदि यो मल्लो पानो बणन्छ  या फाइल संस्करणहरू आंशिक मेटियाका छन् भण्या मेट्न्या काम रद्द गरिन्या छैन।\nत्यै अवस्थामी तमीले छनौटमी अन्तिम मेटियाको नयाँ संस्करण नलुकाउन्यामी चिनो लगाउनु पडन्छ ।",
        "undelete-revision": "$3द्वारा $1को ($4को  समय $5 मी) मेट्याका संशोधनहरू :",
-       "undeletedrevisions": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} पुनर्स्थापित गरियो",
-       "undeletedrevisions-files": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} र {{PLURAL:$2|एउटा फाइल|$2 फाइलहरू}} पुनर्स्थापित गरियो",
-       "undeletedfiles": "{{PLURAL:$1|१ फाइल|$1 फाइलहरू }} पूर्वस्थितिमी ल्याइयो",
        "undelete-header": "भर्खरै मेटायाका पानाहरू हेद्दाकीलाई [[Special:Log/delete|मेटायाका लग]]मी जाओ।",
        "undelete-search-prefix": "सुरुवाती शब्द अनुसार पानाहरू खोज",
        "undelete-no-results": "मेटियाका पानाहरूको अभिलेखमी क्वै पन मिल्दा पानाहरू नाइभेटिया ।",
        "tooltip-n-mainpage-description": "खास पन्नामी झाऽ",
        "tooltip-n-portal": "आयोजनाका बारेमी , तम कि अद्द सकन्छौ , समान काखाइ  भेटौन्या",
        "tooltip-n-currentevents": "हालैका घटनाको बारेमी पृष्ठभूमि जानकारी पत्ता लागाइदिय",
-       "tooltip-n-recentchanges": "विà¤\95िमà¥\80 à¤¹à¤¾à¤²à¥\88 à¤\85रियाà¤\95ा à¤«à¥\87रबदलà¥\88 à¤¶à¥\81à¤\9aि à¥¤",
+       "tooltip-n-recentchanges": "विà¤\95िमà¥\80 à¤\86à¤\9cभà¥\8bलà¥\88 à¤\85रियाà¤\95ा à¤«à¥\87रबदलà¥\88 à¤¸à¥\82à¤\9aà¥\80",
        "tooltip-n-randompage": "क्रमरहित पन्ना खोलऽ",
        "tooltip-n-help": "खोज्जु पड्ड्या ठौर ।",
        "tooltip-t-whatlinkshere": "सप्पै विकि पन्नाअनै शुचि जो याँखाइ जोणीजान",
        "newimages": "नौला फाइलहरूको ग्यालरी",
        "imagelisttext": " '''$1''' {{PLURAL:$1|फाइल|फाइलहरू}} को निम्न सुची ,क्रमवद्ध $2.",
        "newimages-summary": "यै खास पानाले अन्तिम अपलोड गर्याका फाइलहरू धेकाउँन्छ ।",
+       "newimages-user": "आइपी(IP) ठेगाना या प्रयोगकर्ता नाउँ",
        "days": "{{PLURAL:$1|$1 दिन|$1 दिनहरू}}",
        "metadata": "मेटाडेटा",
        "metadata-help": "यै फाइलमि अतिरिक्त जानकारीहरू छन्, यैलाई बणुउन सम्भवतः डिजिटल क्यामरा और स्क्यानर प्रयोग गरियाको हुनसकन्छ । यदि यै फाइललाई खास अवस्थाबठे फेरबदल गरियाको हो भण्या यै फाइलले  सब्बै विवरण प्रतिबिम्बित गद्द सक्यानाइथी ।",
        "searchsuggest-search": "{{SITENAME}} खोजऽ",
        "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: खोल नामहरूको अगाडी डबल-क्लिक गर जसले तमलाई विभिन्न प्रकारहरूको विकल्प दिन्छ।"
+       "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: खोल नामहरूको अगाडी डबल-क्लिक गर जसले तमलाई विभिन्न प्रकारहरूको विकल्प दिन्छ।",
+       "date-range-from": "मिति बठेः"
 }
index 0c81529..a15fb87 100644 (file)
        "rcshowhideanons": "$1 མིང་མེད་ལག་ལེན་པ།",
        "rcshowhidepatr": "$1 པེ་ཌོལཊི་ཞུན་དག་ཚུ།",
        "rcshowhidemine": "$1 ངེ་གི་ཞུན་དག།",
-       "rclinks": "མཇུག་མཐའི་ $1 བསྒྱུར་བཅོས་ཚུ་ ཉིནམ་ $2 ནང་ལུ་སྟོན་<br />$3",
+       "rclinks": "མཇུག་མཐའི་ $1 བསྒྱུར་བཅོས་ཚུ་ ཉིནམ་ $2 ནང་ལུ་སྟོན་",
        "diff": "ཁྱད་པར།",
        "hist": "སྤྱོད་ཤུལ",
        "hide": "སྦ།",
index 6a9db68..613f8f5 100644 (file)
        "rcshowhideliu": "$1 ezãla siwo ŋlɔ ŋkɔ",
        "rcshowhideanons": "$1 ŋkɔ maŋlɔlawo",
        "rcshowhidemine": "$1 nyeƒe tɔtrɔwo",
-       "rclinks": "Fia tɔtrɔ $1 mamleawo le ŋkeke $2 siwo vayi me<br />$3",
+       "rclinks": "Fia tɔtrɔ $1 mamleawo le ŋkeke $2 siwo vayi me",
        "diff": "tɔtrɔ",
        "hist": "xoxo",
        "hide": "Ɣla",
index c22982f..5fc6cc6 100644 (file)
        "externaldberror": "È sucès un erōr cun al terminêl ed certificasiòun ed validitê d'ed fōra, opór an 's gh'à mìa al j autorişasiòun necesâri per arnuvêr l' ingrès d'ed fōra.",
        "login": "Và dèinter",
        "nav-login-createaccount": "Và dèinter / Fà la tó inscrisiòun",
-       "userlogin": "Và dèinter / Fà la tó inscrisiòun",
-       "userloginnocreate": "Và dèinter",
        "logout": "Và fōra",
        "userlogout": "Và fōra",
        "notloggedin": "An t'é mìa gnû dèinter",
        "userlogin-noaccount": "Ét mìa incòra fât la registrasiòun?",
        "userlogin-joinproject": "Da {{SITENAME}}",
-       "nologin": "An gh'èt mìa incòra un ingrès? $1",
-       "nologinlink": "Fà la tó inscrisiòun",
        "createaccount": "Fà la tó inscrisiòun",
-       "gotaccount": "Gh'èt bèle un ingrès? $1",
-       "gotaccountlink": "Và dèinter",
-       "userlogin-resetlink": "T'ét e-scurdê la cêva p'r al tó ingrès?",
        "userlogin-resetpassword-link": "T' ét scurdê la cêva 'd ingrès?",
        "userlogin-helplink2": "Ajót per l'ingrès",
        "userlogin-loggedin": "T'ét bèle coleghê {{GENDER:$1|$1}}. \nDrōva al mōdul ché sòta cme un êter utèint.",
        "createacct-another-email-ph": "Scrév l'indirés ed pôsta eletrônica",
        "createaccountmail": "Drōva 'na cêva 'd ingrès a chêş pruvişôria e spidésla a l'indirés ed pôsta eletrônica sgnê.",
        "createacct-realname": "Al nòm vèira (se 's vōl)",
-       "createaccountreason": "Mutîv:",
        "createacct-reason": "Mutîv",
        "createacct-reason-ph": "Perchè ét drē fêr 'n' êtra utèinsa",
        "createacct-submit": "Fà la tó utèinsa",
        "preview": "Guêrda préma",
        "showpreview": "Guêrda préma 'd salvêr",
        "showdiff": "Guêrda i cambiamèint",
-       "blankarticle": "<strong>Atèinti:</strong>la pàgina che t'é drē fêr la gh'à gnînto dèinter. S' ét tōren a schisêr in sém a \"{{int:savearticle}}\", la pàgina la srà fât sèinsa gnînto dèinter.",
+       "blankarticle": "<strong>Atèinti:</strong>la pàgina che t'é drē fêr la gh'à gnînto dèinter. S' ét tōren a schisêr in sém a \"$1\", la pàgina la srà fât sèinsa gnînto dèinter.",
        "anoneditwarning": "<strong>Atèinti:</strong> An n'é mìa stê fât l'ingrès. S' ét farê dal mudéfichi al tó indirés IP al srà vést da tót. Se <strong>[$1 và dèinter]</strong> o <strong>[$2 fà 'n' utèinsa]</strong>, al tô mudéfichi a srân sgnêdi al tó nòm utèint, insèm a êter benefési.",
        "anonpreviewwarning": "\"An n'é mìa stê fât l'ingrès. Mèinter es sêlva la pàgina, l'indirés IP al srà sgnê int la stòria 'd la pàgina.\"",
-       "missingsummary": "'''Atensiòun:''' an n'é mìa stê precişê al mutîv de sté mudéfica. S'es tōrna a clichêr insém a \"{{int:savearticle}}\" la mudéfica la gnirà salvêda cun al mutîv vōd.",
-       "selfredirect": "<strong>Ateinti:</strong>t'é drē fêr un rinvéi a l'istèsa pàgina. Ét prés avèir şbaliê sgnêr al pôst dal rinvéi o t'é drē mudifichêr la pàgina şbaliêda. S'ét fê cléch incòra in sém a \"{{int:savearticle}}\", al rinvéi al gnirà fât in tót' al manēri.",
+       "missingsummary": "'''Atensiòun:''' an n'é mìa stê precişê al mutîv de sté mudéfica. S'es tōrna a clichêr insém a \"$1\" la mudéfica la gnirà salvêda cun al mutîv vōd.",
+       "selfredirect": "<strong>Ateinti:</strong>t'é drē fêr un rinvéi a l'istèsa pàgina. Ét prés avèir şbaliê sgnêr al pôst dal rinvéi o t'é drē mudifichêr la pàgina şbaliêda. S'ét fê cléch incòra in sém a \"$1\", al rinvéi al gnirà fât in tót' al manēri.",
        "missingcommenttext": "Scréver un cumèint ché sòta.",
-       "missingcommentheader": "<strong>Atensiòun:<strong> an n'é mìa stê precişê l'argumèint de sté mudéfica. S'es tōrna a clichêr insém a \"{{int:savearticle}}\" la mudéfica la gnirà salvêda sèinsa.",
+       "missingcommentheader": "<strong>Atensiòun:<strong> an n'é mìa stê precişê l'argumèint de sté mudéfica. S'es tōrna a clichêr insém a \"$1\" la mudéfica la gnirà salvêda sèinsa.",
        "summary-preview": "Guêrda préma sûnt:",
        "subject-preview": "Guêrda préma l'argumèint:",
        "previewerrortext": "A gh'é stê 'n erōr mèinter a s'é serchê ed guardêr al lavōr préma 'd salvêrel.",
        "editingsection": "Mudéfica ed $1 (sesiòun)",
        "editingcomment": "Mudéfica e $1 (sesiòun nōva)",
        "editconflict": "Cuntrâst 'd edisiòun só $1",
-       "explainconflict": "Un êter utèint l'à salvê 'na nōva versiòun ed la pàgina mèinter t'ēr adrē fêr dal mudéfichi. Int la caşèla 'd mudéfica ché 'd sōver a gh'é al tèst ed la pàgina che adès l'é in lénia, acsé cme l'é stêda salvêda da cl'êter utèint. La versiòun cun al tō mudéfichi invēci l'é int la caşèla dal mudéfichi ché sòta. S' ét vō cunfermêri, ét dēv purtêr al tō mudéfichi int al tèst che gh'é bèle (caşèla ché 'd sōver). Se té schés al ptòun '{{int:savearticle}}', a gnirà salvê '''sōl''' al tèst dèinter a la caşèla 'd mudéfica ché 'd sōver.",
+       "explainconflict": "Un êter utèint l'à salvê 'na nōva versiòun ed la pàgina mèinter t'ēr adrē fêr dal mudéfichi. Int la caşèla 'd mudéfica ché 'd sōver a gh'é al tèst ed la pàgina che adès l'é in lénia, acsé cme l'é stêda salvêda da cl'êter utèint. La versiòun cun al tō mudéfichi invēci l'é int la caşèla dal mudéfichi ché sòta. S' ét vō cunfermêri, ét dēv purtêr al tō mudéfichi int al tèst che gh'é bèle (caşèla ché 'd sōver). Se té schés al ptòun '$1', a gnirà salvê '''sōl''' al tèst dèinter a la caşèla 'd mudéfica ché 'd sōver.",
        "yourtext": "Al tó tèst",
        "storedversion": "La versiòun in memôria",
        "nonunicodebrowser": "'''Atèinti: a s'é drē druvêr un navigadōr ch' al và mìa d' acôrdi cun i carâter ''Unicode''. Per permèter la mudéfica dal pàgini sèinsa fêr d' incunveniĵnt, int la caşèla ed mudéfica i carâter mia ASCII a vînen fât vèder cme côdis eşadecimêl.'''",
        "right-editsemiprotected": "Mudéfica 'l pàgini prutèti cun \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Mudéfica al mudèl ed còl ché dèinter int 'na pàgina.",
        "right-editinterface": "Mudéfica al colegamèint tra sistēma e utèint",
-       "right-editusercssjs": "Mudéfica i file CSS e JS 'd êter utèint",
        "right-editusercss": "Mudéfica i file CSS 'd êter utèint",
        "right-edituserjs": "Mudéfica i file JS 'd êter utèint",
        "right-editmyusercss": "Mudéfica i file CSS dal só utèint",
        "rcshowhidemine": "$1 al mē mudéfichi",
        "rcshowhidemine-show": "Fà vèder",
        "rcshowhidemine-hide": "Lōga",
-       "rclinks": "Fà vèder al $1 ûltmi mudéfichi fâti int j ûltem $2 dé<br />$3",
+       "rclinks": "Fà vèder al $1 ûltmi mudéfichi fâti int j ûltem $2 dé",
        "diff": "dif",
        "hist": "stòria",
        "hide": "Lōga",
index 93c33eb..eabd0d6 100644 (file)
                        "Nemo bis",
                        "Αντιγόνη",
                        "Matma Rex",
-                       "Ανώνυμος Βικιπαιδιστής"
+                       "Ανώνυμος Βικιπαιδιστής",
+                       "GR",
+                       "Thodoris",
+                       "Ftsalamp"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
-       "tog-hideminor": "Απόκρυψη μικροεπεξεργασιών στις πρόσφατες αλλαγές",
+       "tog-hideminor": "Απόκρυψη μικροεπεξεργασιών από τις πρόσφατες αλλαγές",
        "tog-hidepatrolled": "Απόκρυψη ελεγμένων επεξεργασιών στις πρόσφατες αλλαγές",
        "tog-newpageshidepatrolled": "Απόκρυψη ελεγμένων σελίδων από τον κατάλογο νέων σελίδων",
        "tog-hidecategorization": "Απόκρυψη κατηγοριοποίησης σελίδων",
        "views": "Προβολές",
        "toolbox": "Εργαλεία",
        "tool-link-userrights": "Αλλαγή ομάδων {{GENDER:$1|χρήστη}}",
+       "tool-link-userrights-readonly": "Εμφάνιση {{GENDER:$1|ομάδων}}  χρηστών",
        "tool-link-emailuser": "Αποστολή e-mail {{GENDER:$1|στο|στη}} χρήστη",
        "userpage": "Προβολή σελίδας χρήστη",
        "projectpage": "Προβολή σελίδας εγχειρήματος",
        "login": "Είσοδος",
        "login-security": "Επαληθεύστε την ταυτότητά σας",
        "nav-login-createaccount": "Είσοδος / δημιουργία λογαριασμού",
-       "userlogin": "Είσοδος / δημιουργία λογαριασμού",
-       "userloginnocreate": "Είσοδος",
        "logout": "Έξοδος",
        "userlogout": "Έξοδος",
        "notloggedin": "Δεν έχετε συνδεθεί",
        "userlogin-noaccount": "Δεν έχετε λογαριασμό;",
        "userlogin-joinproject": "Συνδεθείτε σε {{SITENAME}}",
-       "nologin": "Δεν έχετε λογαριασμό; $1.",
-       "nologinlink": "Δημιουργήστε έναν λογαριασμό",
        "createaccount": "Δημιουργία λογαριασμού",
-       "gotaccount": "Έχετε ήδη λογαριασμό; $1.",
-       "gotaccountlink": "Είσοδος",
-       "userlogin-resetlink": "Ξεχάσατε τα στοιχεία εισόδου σας;",
        "userlogin-resetpassword-link": "Ξεχάσατε τον κωδικό πρόσβασης;",
        "userlogin-helplink2": "Βοήθεια για τη σύνδεση",
        "userlogin-loggedin": "Είστε ήδη {{GENDER:$1|συνδεδεμένος|συνδεδεμένη}} ως $1.\nΧρησιμοποιήστε την παρακάτω φόρμα για να συνδεθείτε ως άλλος χρήστης.",
        "createaccountmail": "Χρήση τυχαίου προσωρινού κωδικού πρόσβασης και αποστολή του στην καθοριζόμενη διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "createaccountmail-help": "Μπορεί να χρησιμοποιηθεί για την δημιουργία λογαριασμού τρίτων χωρίς την γνωστοποίηση των κωδικών πρόσβασής τους.",
        "createacct-realname": "Πραγματικό όνομα (προαιρετικό)",
-       "createaccountreason": "Αιτία:",
        "createacct-reason": "Λόγος",
        "createacct-reason-ph": "Γιατί δημιουργείτε έναν άλλο λογαριασμό",
        "createacct-reason-help": "Εμφανιζόμενο μήνυμα στο μητρώο δημιουργίας λογαριασμών",
        "botpasswords-label-delete": "Διαγραφή",
        "botpasswords-label-resetpassword": "Επαναφορά του συνθηματικού",
        "botpasswords-label-grants": "Ισχύουσες άδειες:",
-       "botpasswords-help-grants": "Î\9aάθε Ï\80αÏ\81αÏ\87Ï\8eÏ\81ηÏ\83η Î´Î¯Î½ÎµÎ¹ Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83Ï\84α Î¿Ï\81ιÏ\83μένα Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η Ï\80οÏ\85 Ï\80οÏ\85 Î®Î´Î· Î­Ï\87ει Î­Î½Î±Ï\82 Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84η. Î\94είÏ\84ε Ï\84η [[Special:ListGrants|Ï\80ίνακαÏ\82 παραχωρήσεων]] για περισσότερες πληροφορίες.",
+       "botpasswords-help-grants": "ΠαÏ\81αÏ\87Ï\89Ï\81εί Ï\84ην Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\80οÏ\85 Î®Î´Î· ÎºÎ±Ï\84έÏ\87ονÏ\84αι Î±Ï\80Ï\8c Ï\84ο Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c Ï\87Ï\81ήÏ\83Ï\84η Ï\83αÏ\82. Î\95νεÏ\81γοÏ\80οίηÏ\83η Î¼Î¹Î±Ï\82 Ï\80αÏ\81αÏ\87Ï\8eÏ\81ηÏ\83ηÏ\82 ÎµÎ´Ï\8e Î´ÎµÎ½ Ï\80αÏ\81έÏ\87ει Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\80οÏ\85 Î¿ Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84ηÏ\82 Ï\83αÏ\82 Î´Î¹Î±Ï\86οÏ\81εÏ\84ικά Î´ÎµÎ½ Î¸Î± ÎµÎ¯Ï\87ε. Î\94είÏ\84ε Ï\84ον [[Special:ListGrants|Ï\80ίνακα παραχωρήσεων]] για περισσότερες πληροφορίες.",
        "botpasswords-label-grants-column": "Χορηγήθηκε",
        "botpasswords-bad-appid": "Το όνομα του ρομπότ «$1» δεν είναι έγκυρο.",
        "botpasswords-insert-failed": "Αποτυχία να προστεθεί το όνομα bot \"$1\". Έχει ήδη προστεθεί;",
        "passwordreset-emailsentemail": "Αν αυτή η διεύθυνση ηλεκτρονικού ταχυδρομείου συνδέεται με το  λογαριασμό σας, τότε  θα σας αποσταλεί μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
        "passwordreset-emailsentusername": "Αν υπάρχει μια διεύθυνση ηλεκτρονικού ταχυδρομείου που συνδέεται με αυτό το όνομα χρήστη, τότε θα σας αποσταλεί ένα μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
        "passwordreset-invalidemail": "Μη έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
+       "passwordreset-nodata": "Δεν δόθηκε όνομα χρήστη ή διεύθυνση email.",
        "changeemail": "Αλλαγή ή αφαίρεση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "changeemail-header": "Συμπληρώστε αυτήν τη φόρμα για να αλλάξετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν θέλετε να καταργήσετε τη σύνδεση οποιασδήποτε διεύθυνσης ηλεκτρονικού ταχυδρομείου με το λογαριασμό σας, αφήστε τη νέα διεύθυνση ηλεκτρονικού ταχυδρομείου κενή κατά την υποβολή της φόρμας.",
        "changeemail-no-info": "Πρέπει να έχετε συνδεθεί για άμεση πρόσβαση σε αυτήν τη σελίδα.",
        "preview": "Προεπισκόπηση",
        "showpreview": "Εμφάνιση προεπισκόπησης",
        "showdiff": "Εμφάνιση αλλαγών",
-       "blankarticle": "<strong>Προειδοποίηση:</strong> Η σελίδα που πάτε να δημιουργήσετε είναι κενή.\nΕάν ξανακάνετε κλικ στο κουμπί «{{int:savearticle}}» η σελίδα θα δημιουργηθεί χωρίς περιεχόμενο.",
+       "blankarticle": "<strong>Προειδοποίηση:</strong> Η σελίδα που προσπαθείτε να δημιουργήσετε είναι κενή.\nΕάν ξανακάνετε κλικ στο κουμπί «$1» η σελίδα θα δημιουργηθεί χωρίς περιεχόμενο.",
        "anoneditwarning": "<strong>Προειδοποίηση:</strong> Δεν έχετε συνδεθεί. Η διεύθυνση IP σας θα είναι ορατή δημόσια αν κάνετε κάποια επεξεργασία. Αν <strong>[$1 συνδεθείτε]</strong> ή <strong>[$2 δημιουργήσετε λογαριασμό]</strong>, οι επεξεργασίες σας θα αποδοθούν στο όνομά χρήστη σας, μαζί με άλλα οφέλη.",
        "anonpreviewwarning": "''Δεν έχετε συνδεθεί. Η αποθήκευση θα καταγράψει την διεύθυνσή IP σας στο ιστορικό επεξεργασίας αυτής της σελίδας.''",
        "missingsummary": "'''Υπενθύμιση:''' Δεν έχετε συμπληρώσει τη σύνοψη επεξεργασίας. Αν κάνετε κλικ στο κουμπί Αποθήκευση πάλι, η επεξεργασία σας θα αποθηκευτεί χωρίς σύνοψη.",
-       "selfredirect": "<strong>Προσοχή:</strong> Ανακατευθύνετε αυτή τη σελίδα στον εαυτό της. Μπορεί να δώσατε λάθος στόχο για την ανακατεύθυνση, ή μπορεί να επεξεργάζεστε λάθος σελίδα.\nΑν κάνε κλίκ στο \"{{int:savearticle}}\" ξανά, η ανακατεύθυνση θα δημιουργηθεί ούτως ή άλλως.",
+       "selfredirect": "<strong>Προσοχή:</strong> Ανακατευθύνετε αυτή τη σελίδα στον εαυτό της. Μπορεί να δώσατε λάθος στόχο για την ανακατεύθυνση, ή μπορεί να επεξεργάζεστε λάθος σελίδα.\nΑν κάνε κλίκ στο \"$1\" ξανά, η ανακατεύθυνση θα δημιουργηθεί ούτως ή άλλως.",
        "missingcommenttext": "Παρακαλούμε εισαγάγετε σχόλιο παρακάτω.",
-       "missingcommentheader": "<strong>Υπενθύμιση:</strong> δεν έχετε δώσει ένα θέμα γι' αυτό το σχόλιο.\nΕάν κάνετε κλικ στο κουμπί \"{{int:savearticle}}\" ξανά, η επεξεργασία σας θα αποθηκευτεί χωρίς αυτό.",
-       "summary-preview": "Προεπισκόπηση σύνοψης:",
+       "missingcommentheader": "<strong>Υπενθύμιση:</strong> δεν έχετε δώσει ένα θέμα γι' αυτό το σχόλιο.\nΕάν κάνετε κλικ στο κουμπί \"$1\" ξανά, η επεξεργασία σας θα αποθηκευτεί χωρίς αυτό.",
+       "summary-preview": "Προεπισκόπηση σύνοψης επεξεργασίας:",
        "subject-preview": "Προεπισκόπηση θέματος:",
        "previewerrortext": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια για να κάνετε προεπισκόπηση των αλλαγών σας.",
        "blockedtitle": "Ο χρήστης έχει υποστεί φραγή.",
        "blockedtext": "'''Το όνομα χρήστη σας ή η διεύθυνση IP σας έχει υποστεί φραγή.'''\n\nΗ φραγή έγινε από τον/την $1.\nΗ αιτιολογία που δόθηκε είναι: ''$2''.\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Η φραγή προορίζεται για το χρήστη: $7\n\nΜπορείτε να απευθυνθείτε στον/στην $1 ή σε κάποιον άλλον [[{{MediaWiki:Grouppage-sysop}}|διαχειριστή]] για να συζητήσετε τη φραγή.\nΔεν μπορείτε να χρησιμοποιήσετε την δυνατότητα «αποστολή e-mail σε αυτό το χρήστη» εκτός αν μια έγκυρη ηλεκτρονική διεύθυνση έχει οριστεί στις [[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. Παρακαλούμε συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
+       "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|προτιμήσεων χρήστη]] σας.",
        "userpage-userdoesnotexist": "Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος. Παρακαλούμε ελέγξτε αν θα θέλατε να δημιουργήσετε/επεξεργαστείτε αυτήν τη σελίδα.",
        "userpage-userdoesnotexist-view": "Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος.",
        "blocked-notice-logextract": "Επί του παρόντος, αυτός ο χρήστης έχει υποστεί φραγή. Παρακάτω παρέχεται για αναφορά η πιο πρόσφατη καταχώρηση του αρχείου φραγών.",
-       "clearyourcache": "''' Σημείωση:''' μετά την αποθήκευση, ίσως χρειαστεί να παρακάμψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας για να δείτε τις αλλαγές.\n * '''Firefox / Safari:''' Κρατήστε πατημένο το ''Shift'' κάνοντας ταυτόχρονα κλικ στο κουμπί ''Ανανέωση'' ή πιέστε ''Ctrl-F5'' ή ''Ctrl-R'' ('' ⌘-R'' σε Mac)\n * '''Google Chrome:''' Πιέστε ''Ctrl-Shift-R'' (''⌘-Shift-R'' σε Mac)\n * '''Internet Explorer:''' Κρατήστε πατημένο το ''Ctrl'' κάνοντας ταυτόχρονα κλικ στο κουμπί ''Ανανέωση'', ή πιέστε ''Ctrl-F5'' \n * '''Opera:''' Εκκαθαρίστε την προσωρινή μνήμη από το μενού ''Εργαλεία → Προτιμήσεις''",
+       "clearyourcache": "<strong>Σημείωση:</strong> μετά την αποθήκευση, ίσως χρειαστεί να παρακάμψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας για να δείτε τις αλλαγές.\n* <strong>Firefox / Safari:</strong> Κρατήστε πατημένο το <em>Shift</em> κάνοντας ταυτόχρονα κλικ στο κουμπί <em>Ανανέωση</em> ή πιέστε <em>Ctrl-F5</em> ή <em>Ctrl-R</em> (<em>⌘-R</em> σε Mac)\n* <strong>Google Chrome:</strong> Πιέστε <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> σε Mac)\n* <strong>Internet Explorer:</strong> Κρατήστε πατημένο το <em>Ctrl</em> κάνοντας ταυτόχρονα κλικ στο κουμπί <em>Ανανέωση</em>, ή πιέστε <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Εκκαθαρίστε την προσωρινή μνήμη από το μενού <em>Εργαλεία → Προτιμήσεις</em>",
        "usercssyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τα νέα σας CSS πριν τα αποθηκεύσετε.",
        "userjsyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τη νέα σας JS πριν την αποθηκεύσετε.",
        "usercsspreview": "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση του CSS του χρήστη -δεν το έχετε ακόμα αποθηκεύσει! '''",
        "editingsection": "Επεξεργασία $1 (ενότητα)",
        "editingcomment": "Επεξεργασία $1 (νέο τμήμα)",
        "editconflict": "Σύγκρουση επεξεργασίας: $1",
-       "explainconflict": "Κάποιος άλλος χρήστης έχει αλλάξει αυτή τη σελίδα από τότε που αρχίσατε να την επεξεργάζεστε.\nΣτο επάνω τμήμα βρίσκεται το τρέχον κείμενο της σελίδας.\nΟι δικές σας αλλαγές εμφανίζονται στο κάτω τμήμα.\nΘα πρέπει να ενσωματώσετε τις αλλαγές σας στο τρέχον κείμενο.\n'''Μόνο''' το επάνω τμήμα θα αποθηκευθεί όταν πατήσετε \"{{int:savearticle}}\".",
+       "explainconflict": "Κάποιος άλλος χρήστης έχει αλλάξει αυτή τη σελίδα από τότε που αρχίσατε να την επεξεργάζεστε.\nΣτο επάνω τμήμα βρίσκεται το τρέχον κείμενο της σελίδας.\nΟι δικές σας αλλαγές εμφανίζονται στο κάτω τμήμα.\nΘα πρέπει να ενσωματώσετε τις αλλαγές σας στο τρέχον κείμενο.\n'''Μόνο''' το επάνω τμήμα θα αποθηκευθεί όταν πατήσετε \"$1\".",
        "yourtext": "Το κείμενό σας",
        "storedversion": "Αποθηκευμένη έκδοση",
        "nonunicodebrowser": "'''ΠΡΟΣΟΧΗ! Ο περιηγητής σας δεν είναι συμβατός με κωδικοποίηση Unicode.'''\nΓια την ασφαλή επεξεργασία των σελίδων έχει βρεθεί ένας εναλλακτικός τρόπος: Όσοι χαρακτήρες δεν είναι ASCII θα φαίνονται στο πλαίσιο επεξεργασίας ως δεκαεξαδικοί κωδικοί.",
        "readonlywarning": "'''Προειδοποίηση: Η βάση δεδομένων έχει κλειδωθεί για συντήρηση, έτσι δεν θα μπορέσετε να αποθηκεύσετε τις επεξεργασίες σας αυτή τη στιγμή.'''\nΜπορείτε αν θέλετε να μεταφέρετε με αντιγραφή-επικόλληση το κείμενό σας σε αρχείο κειμένου και να το αποθηκεύσετε για αργότερα.\n\nΟ διαχειριστής που την κλείδωσε έδωσε την εξής εξήγηση: $1",
        "protectedpagewarning": "'''Προειδοποίηση: Αυτή η σελίδα έχει κλειδωθεί ώστε μόνο χρήστες με δικαιώματα διαχειριστή μπορούν να την επεξεργαστούν.'''\nΗ πιο πρόσφατη καταχώρηση στο αρχείο καταγραφής παρέχεται παρακάτω για αναφορά:",
        "semiprotectedpagewarning": "'''Σημείωση:''' Αυτή η σελίδα έχει κλειδωθεί ώστε μόνο εγγεγραμμένοι χρήστες μπορούν να την επεξεργαστούν.\nΗ πιο πρόσφατη καταχώρηση στο αρχείο καταγραφής παρέχεται παρακάτω για αναφορά:",
-       "cascadeprotectedwarning": "'''Προσοχή:''' Αυτή η σελίδα έχει κλειδωθεί ώστε μόνο χρήστες με δικαιώματα διαχειριστή συστήματος να μπορούν να την επεξεργαστούν, επειδή περιλαμβάνεται {{PLURAL:$1|στην ακόλουθη|στις ακόλουθες}} διαδοχικά (cascaded) {{PLURAL:$1|προστατευμένη σελίδα|προστατευμένες σελίδες}}:",
+       "cascadeprotectedwarning": "<strong>Προσοχή:</strong> Αυτή η σελίδα έχει κλειδωθεί ώστε μόνο χρήστες με [[Special:ListGroupRights|συγκεκριμένα δικαιώματα]] να μπορούν να την επεξεργαστούν, επειδή περιλαμβάνεται {{PLURAL:$1|στην ακόλουθη|στις ακόλουθες}} διαδοχικά (cascaded) {{PLURAL:$1|προστατευμένη σελίδα|προστατευμένες σελίδες}}:",
        "titleprotectedwarning": "'''Προειδοποίηση: Αυτή η σελίδα έχει κλειδωθεί ώστε χρειάζονται [[Special:ListGroupRights|ειδικά δικαιώματα]] για να δημιουργηθεί.'''\nΗ πιο πρόσφατη καταχώρηση στο αρχείο καταγραφής παρέχεται παρακάτω για αναφορά:",
        "templatesused": "{{PLURAL:$1|Πρότυπο που χρησιμοποιείται|Πρότυπα που χρησιμοποιούνται}} στη σελίδα αυτή:",
        "templatesusedpreview": "{{PLURAL:$1|Πρότυπο που χρησιμοποιείται|Πρότυπα που χρησιμοποιούνται}} σε αυτήν την προεπισκόπηση:",
        "page_first": "πρώτη",
        "page_last": "τελευταία",
        "histlegend": "Επιλογή διαφορών: Μαρκάρετε τα κουτάκια επιλογής των εκδόσεων που θέλετε να συγκρίνετε και πατήστε το enter ή το κουμπί στο κάτω μέρος.<br />\nΥπόμνημα: '''({{int:cur}})''' = διαφορά από την τελευταία έκδοση, '''({{int:last}})''' = διαφορά από την προηγούμενη έκδοση, '''{{int:minoreditletter}}''' = μικροαλλαγή.",
-       "history-fieldset-title": "Περιήγηση στο ιστορικό",
+       "history-fieldset-title": "Περιήγηση στο ιστορικό αλλαγών",
        "history-show-deleted": "Διαγεγραμμένες μόνο",
        "histfirst": "η πιο παλιά",
        "histlast": "η πιο πρόσφατη",
        "prefs-help-prefershttps": "Αυτή η προτίμηση θα τεθεί σε ισχύ στην επόμενή σας σύνδεση.",
        "prefswarning-warning": "Έχετε κάνει αλλαγές στις προτιμήσεις σας που δεν έχουν αποθηκευτεί ακόμα.\nΕάν αφήσετε αυτή τη σελίδα χωρίς να κάνετε κλικ στο \"$1\" οι προτιμήσεις σας δεν θα ενημερωθούν.",
        "prefs-tabs-navigation-hint": "Συμβουλή: Μπορείτε να χρησιμοποιήσετε τα πλήκτρα διευθύνσεων αριστερά και δεξιά για να πλοηγηθείτε μεταξύ των καρτελών στη λίστα καρτελών.",
-       "userrights": "Î\94ιαÏ\87είÏ\81ιÏ\83η Î´Î¹ÎºÎ±Î¹Ï\89μάÏ\84Ï\89ν χρηστών",
+       "userrights": "Î\94ικαιÏ\8eμαÏ\84α χρηστών",
        "userrights-lookup-user": "Επιλέξτε χρήστη",
        "userrights-user-editname": "Δηλώστε όνομα χρήστη:",
        "editusergroup": "Φόρτωση ομάδων χρηστών",
        "saveusergroups": "Αποθήκευση {{GENDER:$1|ομάδων}}  χρηστών",
        "userrights-groupsmember": "Μέλος της ομάδας:",
        "userrights-groupsmember-auto": "Αυτονόητο μέλος του:",
-       "userrights-groups-help": "Î\9cÏ\80οÏ\81είÏ\84ε Î½Î± Î¼ÎµÏ\84αβάλεÏ\84ε Ï\84ιÏ\82 Î¿Î¼Î¬Î´ÎµÏ\82 Ï\83Ï\84ιÏ\82 Î¿Ï\80οίεÏ\82 Î±Î½Î®ÎºÎµÎ¹ {{GENDER:$1|αÏ\85Ï\84Ï\8cÏ\82 Î¿ Ï\87Ï\81ήÏ\83Ï\84ηÏ\82|αÏ\85Ï\84ή Î· Ï\87Ï\81ήÏ\83Ï\84Ï\81ια}}:\n* Î¤Ï\83εκαÏ\81ιÏ\83μένο ÎºÎ¿Ï\85Ï\84άκι Ï\83ημαίνει Ï\8cÏ\84ι {{GENDER:$1|ο Ï\87Ï\81ήÏ\83Ï\84ηÏ\82|η Ï\87Ï\81ήÏ\83Ï\84Ï\81ια}} Î±Î½Î®ÎºÎµÎ¹ Ï\83ε Î±Ï\85Ï\84ήν Ï\84ην Î¿Î¼Î¬Î´Î±.\n* Î\9cη Ï\84Ï\83εκαÏ\81ιÏ\83μένο ÎºÎ¿Ï\85Ï\84άκι Ï\83ημαίνει Ï\8cÏ\84ι {{GENDER:$1|ο Ï\87Ï\81ήÏ\83Ï\84ηÏ\82|η Ï\87Ï\81ήÏ\83Ï\84Ï\81ια}} Î´ÎµÎ½ Î±Î½Î®ÎºÎµÎ¹ Ï\83ε Î±Ï\85Ï\84ήν Ï\84ην Î¿Î¼Î¬Î´Î±.\n* Î\91Ï\83Ï\84εÏ\81ίÏ\83κοÏ\82 (*) Ï\83ημαίνει Ï\8cÏ\84ι Î´ÎµÎ½ Î¼Ï\80οÏ\81είÏ\84ε Î½Î± Î±Ï\86αιÏ\81έÏ\83εÏ\84ε Ï\84ην Î¿Î¼Î¬Î´Î± Î¬Ï\80αξ ÎºÎ±Î¹ Ï\84ην Ï\80Ï\81οÏ\83θέÏ\83εÏ\84ε, Î® Ï\84ο Î±Î½Î¬Ï\80οδο.",
+       "userrights-groups-help": "Î\9cÏ\80οÏ\81είÏ\84ε Î½Î± Î¼ÎµÏ\84αβάλεÏ\84ε Ï\84ιÏ\82 Î¿Î¼Î¬Î´ÎµÏ\82 Ï\83Ï\84ιÏ\82 Î¿Ï\80οίεÏ\82 Î±Î½Î®ÎºÎµÎ¹ {{GENDER:$1|αÏ\85Ï\84Ï\8cÏ\82 Î¿ Ï\87Ï\81ήÏ\83Ï\84ηÏ\82|αÏ\85Ï\84ή Î· Ï\87Ï\81ήÏ\83Ï\84Ï\81ια}}:\n* Î¤Ï\83εκαÏ\81ιÏ\83μένο ÎºÎ¿Ï\85Ï\84άκι Ï\83ημαίνει Ï\8cÏ\84ι {{GENDER:$1|ο Ï\87Ï\81ήÏ\83Ï\84ηÏ\82|η Ï\87Ï\81ήÏ\83Ï\84Ï\81ια}} Î±Î½Î®ÎºÎµÎ¹ Ï\83ε Î±Ï\85Ï\84ήν Ï\84ην Î¿Î¼Î¬Î´Î±.\n* Î\9cη Ï\84Ï\83εκαÏ\81ιÏ\83μένο ÎºÎ¿Ï\85Ï\84άκι Ï\83ημαίνει Ï\8cÏ\84ι {{GENDER:$1|ο Ï\87Ï\81ήÏ\83Ï\84ηÏ\82|η Ï\87Ï\81ήÏ\83Ï\84Ï\81ια}} Î´ÎµÎ½ Î±Î½Î®ÎºÎµÎ¹ Ï\83ε Î±Ï\85Ï\84ήν Ï\84ην Î¿Î¼Î¬Î´Î±.\n* Î\9f Î±Ï\83Ï\84εÏ\81ίÏ\83κοÏ\82 (*) Î´Î·Î»Ï\8eνει Ï\8cÏ\84ι Î´ÎµÎ½ Î¼Ï\80οÏ\81είÏ\84ε Î½Î± Î±Ï\86αιÏ\81έÏ\83εÏ\84ε Ï\84ην Î¿Î¼Î¬Î´Î± Î¬Ï\80αξ ÎºÎ±Î¹ Ï\84ην Ï\80Ï\81οÏ\83θέÏ\83εÏ\84ε, Î® Ï\84ο Î±Î½Î¬Ï\80οδο.\n* Î\97 Î´Î¯ÎµÏ\83η (#) Î´Î·Î»Ï\8eνει Ï\8cÏ\84ι Ï\84η Î»Î®Î¾Î· Î¹Ï\83Ï\87Ï\8dοÏ\82 Ï\84ηÏ\82 Î­Î½Ï\84αξηÏ\82 Ï\83ε Î±Ï\85Ï\84ήν Ï\84ην Î¿Î¼Î¬Î´Î± Î¼Ï\80οÏ\81είÏ\84ε Î½Î± Ï\84η Î¼ÎµÏ\84αθέÏ\83εÏ\84ε Î¼Ï\8cνο Ï\83ε Î¼ÎµÏ\84αγενέÏ\83Ï\84εÏ\81η Ï\87Ï\81ονική Ï\83Ï\84ιγμή ÎºÎ±Î¹ Ï\8cÏ\87ι Ï\83ε Ï\80Ï\81ογενέÏ\83Ï\84εÏ\81η.",
        "userrights-reason": "Αιτία:",
        "userrights-no-interwiki": "Δεν έχετε άδεια να επεξεργαστείτε τα δικαιώματα χρηστών σε άλλα wiki.",
        "userrights-nodatabase": "Η βάση δεδομένων $1 δεν υπάρχει ή δεν είναι τοπική.",
        "right-editsemiprotected": "Επεξεργασία προστατευμένων σελίδων ως \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Επεξεργασίας του μοντέλου περιεχόμενου σελίδας",
        "right-editinterface": "Επεξεργασία της διασύνδεσης χρήστη",
-       "right-editusercssjs": "Μεταγραφή των αρχείων CSS και JS άλλων χρηστών",
        "right-editusercss": "Μεταγραφή των αρχείων CSS άλλων χρηστών",
        "right-edituserjs": "Μεταγραφή των αρχείων JS άλλων χρηστών",
        "right-editmyusercss": "Επεξεργασία των ιδιωτικών αρχείων CSS χρήστη",
        "right-applychangetags": "Εφαρμογή [[Special:Tags|ετικετών]] παράλληλα με τις όποιες αλλαγές κάνει κάποιος",
        "right-changetags": "Προσθέστε και αφαιρέστε αυθαίρετες [[Special:Tags|ετικέτες]] σε μεμονωμένες εκδόσεις και καταχωρήσεις καταγραφών",
        "right-deletechangetags": "Διαγραφή [[Special:Tags|ετικετών]] από τη βάση δεδομένων",
+       "grant-generic": "Πακέτο δικαιωμάτων \"$1\"",
        "grant-group-page-interaction": "Αλληλεπίδραση με σελίδες",
        "grant-group-file-interaction": "Αλληλεπίδραση με πολυμέσα",
        "grant-group-watchlist-interaction": "Αλληλεπίδραση με τη λίστα παρακολούθησής σου",
        "rcfilters-invalid-filter": "Μη έγκυρο φίλτρο",
        "rcfilters-empty-filter": "Χωρίς ενεργά φίλτρα. Εμφανίζονται όλες οι συνεισφορές.",
        "rcfilters-filterlist-title": "Φίλτρα",
+       "rcfilters-filterlist-whatsthis": "Τι είναι αυτό;",
+       "rcfilters-filterlist-feedbacklink": "Δώστε ανατροφοδότηση για τα νέα φίλτρα (beta)",
+       "rcfilters-highlightbutton-title": "Επισήμανση αποτελεσμάτων",
+       "rcfilters-highlightmenu-title": "Επιλέξτε ένα χρώμα",
+       "rcfilters-highlightmenu-help": "Επιλέξτε ένα χρώμα για να επισημάνετε αυτή την ιδιότητα",
        "rcfilters-filterlist-noresults": "Δεν βρέθηκαν φίλτρα",
+       "rcfilters-noresults-conflict": "Δε βρέθηκαν αποτελέσματα γιατί τα κριτήρια αναζήτησης είναι σε διένεξη.",
+       "rcfilters-state-message-subset": "Αυτό το φίλτρο δεν έχει επιρροή επειδή τα αποτελέσματά του περιλαμβάνονται σε αυτά {{PLURAL:$2|ευρύτερου φίλτρου|ευρύτερων φίλτρων}} (δοκιμάστε την επισήμανση για να τα ξεχωρήσετε): $1",
        "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": "Î\9fι Î´Î¹ÎºÎ­Ï\82 Ï\83αÏ\82 ÎµÏ\80εξεÏ\81γαÏ\83ίες",
-       "rcfilters-filter-editsbyself-description": "Î\95Ï\80εξεÏ\81γαÏ\83ίεÏ\82 Î±Ï\80Ï\8c ÎµÏ\83άς.",
-       "rcfilters-filter-editsbyother-label": "Î\95Ï\80εξεÏ\81γαÏ\83ίες από άλλους",
-       "rcfilters-filter-editsbyother-description": "Î\95Ï\80εξεÏ\81γαÏ\83ίεÏ\82 Ï\80οÏ\85 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκαν Î±Ï\80Ï\8c Î¬Î»Î»Î¿Ï\85Ï\82 Ï\87Ï\81ήÏ\83Ï\84εÏ\82 (Ï\8cÏ\87ι ÎµÏ\83άÏ\82).",
+       "rcfilters-filter-editsbyself-label": "Î\95Ï\80εξεÏ\81γαÏ\83ίεÏ\82 Î±Ï\80Ï\8c ÎµÏ\83άς",
+       "rcfilters-filter-editsbyself-description": "Î\9fι Î´Î¹ÎºÎ­Ï\82 Ï\83αÏ\82 Ï\83Ï\85νειÏ\83Ï\86οÏ\81ές.",
+       "rcfilters-filter-editsbyother-label": "Î\91λλαγές από άλλους",
+       "rcfilters-filter-editsbyother-description": "Î\8cλεÏ\82 Î¿Î¹ Î±Î»Î»Î±Î³Î­Ï\82 ÎµÎºÏ\84Ï\8cÏ\82 Î±Ï\80Ï\8c Ï\84ιÏ\82 Î´Î¹ÎºÎ­Ï\82 Ï\83αÏ\82.",
        "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-user-experience-level-conflicts-unregistered": "Τα φίλτρα εμπειρίας βρίσκουν μόνο εγγεγραμμένους χρήστες, οπότε αυτό το φίλτρο αντικρούει το φίλτρο \"μη εγγεγραμμένοι\".",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Νεοφερμένοι",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Λιγότερες από 10 επεξεργασίες και 4 ημέρες δραστηριότητας.",
+       "rcfilters-filter-user-experience-level-learner-label": "Μαθητευόμενοι",
+       "rcfilters-filter-user-experience-level-learner-description": "Περισσότερες ημέρες δραστηριότητας και επεξεργασίες από τους «νεοφερμένους» αλλά λιγότερες από τους «έμπειρους χρήστες».",
+       "rcfilters-filter-user-experience-level-experienced-label": "Έμπειροι χρήστες",
+       "rcfilters-filter-user-experience-level-experienced-description": "Περισσότερες από 30 ημέρες δραστηριότητας και 500 αλλαγές.",
        "rcfilters-filtergroup-automated": "Αυτοματοποιημένες συνεισφορές",
        "rcfilters-filter-bots-label": "Ρομπότ",
        "rcfilters-filter-bots-description": "Επεξεργασίες που έγιναν από αυτοματοποιημένα εργαλεία.",
        "rcshowhidecategorization": "$1 κατηγοριοποίησης σελίδας",
        "rcshowhidecategorization-show": "Εμφάνιση",
        "rcshowhidecategorization-hide": "Απόκρυψη",
-       "rclinks": "Εμφάνιση των τελευταίων $1 αλλαγών στο διάστημα των τελευταίων $2 ημερών<br />$3",
+       "rclinks": "Εμφάνιση των τελευταίων $1 αλλαγών στο διάστημα των τελευταίων $2 ημερών",
        "diff": "διαφορά",
        "hist": "ιστορικό",
        "hide": "Απόκρυψη",
        "backend-fail-read": "Αδύνατη η ανάγνωση αρχείου $1.",
        "backend-fail-create": "Αδύνατη η δημιουργία αρχείου $1.",
        "backend-fail-maxsize": "Δεν ήταν δυνατή η εγγραφή του αρχείου «$1» γιατί είναι μεγαλύτερο από {{PLURAL:$2|ένα byte|$2 bytes}}.",
-       "backend-fail-readonly": "Το αντικείμενο αποθήκευσης \"$1\" αυτή τη στιγμή είναι μόνο για ανάγνωση. Η αιτία που δόθηκε ήταν: \"$2\"",
+       "backend-fail-readonly": "Το σύστημα αποθήκευσης «$1» αυτή τη στιγμή είναι διαθέσιμο μόνο για ανάγνωση. Η αιτιολόγηση που δόθηκε ήταν: «$2»",
        "backend-fail-synced": "Το αρχείο \"$1\" είναι σε κατάσταση ασυνέπειας εντός του εσωτερικού χώρου αποθήκευσης",
        "backend-fail-connect": "Δεν ήταν δυνατή η σύνδεση στο αντικείμενο αποθήκευσης \"$1\".",
        "backend-fail-internal": "Παρουσιάστηκε ένα άγνωστο σφάλμα στην αποθήκευση παρασκηνίου \"$1\".",
        "apihelp-no-such-module": "Το Module \"$1\" δεν βρέθηκε.",
        "apisandbox": "Αμμοδοχείο API",
        "apisandbox-api-disabled": "Η Διεπαφή Προγραμματισμού Εφαρμογών (API) είναι απενεργοποιημένη σε αυτήν την τοποθεσία.",
-       "apisandbox-intro": "Χρησιμοποιήστε αυτήν τη σελίδα για να πειραματιστείτε με το '''API της υπηρεσίας ιστού του MediaWiki'''.\nΑνατρέξτε στην [https://www.mediawiki.org/wiki/API:Main_page τεκμηρίωση του API] για περισσότερες πληροφορίες πάνω στη χρήση του API. Παράδειγμα: [https://www.mediawiki.org/wiki/API#A_simple_example λήψη του περιεχομένου της Αρχικής Σελίδας]. Επιλέξτε μια ενέργεια για να δείτε περισσότερα παραδείγματα.\n\nΝα σημειωθεί ότι, παρόλο που αυτό εδώ είναι αμμοδοχείο, οι ενέργειες που εκτελείτε σε αυτήν τη σελίδα μπορούν να τροποποιήσουν το wiki.",
+       "apisandbox-intro": "Χρησιμοποιήστε αυτήν τη σελίδα για να πειραματιστείτε με το <strong>API της υπηρεσίας ιστού του MediaWiki</strong>.\nΑνατρέξτε στην [[mw:API:Main page|τεκμηρίωση του API]] για περισσότερες πληροφορίες πάνω στη χρήση του API. \nΠαράδειγμα: [https://www.mediawiki.org/wiki/API#A_simple_example λήψη του περιεχομένου της Αρχικής Σελίδας]. Επιλέξτε κάποια ενέργεια για να δείτε περισσότερα παραδείγματα.\n\nΝα σημειωθεί ότι, παρόλο που αυτό εδώ είναι αμμοδοχείο, οι ενέργειες που εκτελείτε σε αυτήν τη σελίδα μπορούν να τροποποιήσουν το wiki.",
        "apisandbox-unfullscreen": "Εμφάνιση της σελίδας",
        "apisandbox-submit": "Υποβολή του αιτήματος",
        "apisandbox-reset": "Εκκαθάριση",
        "watchlistanontext": "Παρακαλούμε συνδεθείτε για να δείτε ή να επεξεργαστείτε αντικείμενα στη λίστα παρακολούθησής σας.",
        "watchnologin": "Δεν έχετε συνδεθεί.",
        "addwatch": "Προσθήκη στη λίστα παρακολούθησης",
-       "addedwatchtext": "Το Î»Î®Î¼Î¼Î± Â«[[:$1]]» ÎºÎ±Î¹ Î· Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84οÏ\85 Î­Ï\87οÏ\85ν Ï\80Ï\81οÏ\83Ï\84εθεί Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82]] Ï\83αÏ\82.",
+       "addedwatchtext": "Î\97 Ï\83ελίδα Â«[[:$1]]» ÎºÎ±Î¹ Î· Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84ηÏ\82 Ï\80Ï\81οÏ\83Ï\84έθηκαν Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82 Ï\83αÏ\82]].",
        "addedwatchtext-short": "Η σελίδα «$1» έχει προστεθεί στην λίστα παρακολούθησής σας.",
        "removewatch": "Αφαίρεση από τη λίστα παρακολούθησης",
        "removedwatchtext": "Το λήμμα «[[:$1]]» και η σελίδα συζήτησής του έχουν αφαιρεθεί από τη [[Special:Watchlist|λίστα παρακολούθησής]] σας.",
        "changecontentmodel-cannot-convert": "Το περιεχόμενο του [[:$1]] δεν μπορεί να μετατραπεί σε τύπο $2.",
        "changecontentmodel-nodirectediting": "Το μοντέλο περιεχομένου $1 δεν υποστηρίζει την άμεση επεξεργασία",
        "log-name-contentmodel": "Αρχείο καταγραφής αλλαγών μοντέλου περιεχομένου",
-       "log-description-contentmodel": "ΣÏ\85μβάνÏ\84α Ï\80οÏ\85 Ï\83Ï\87εÏ\84ίζονÏ\84αι Î¼Îµ Ï\84α Î¼Î¿Î½Ï\84έλα Ï\80εÏ\81ιεÏ\87ομένοÏ\85 Î¼Î¹Î±Ï\82 Ï\83ελίδαÏ\82",
+       "log-description-contentmodel": "Î\91Ï\85Ï\84ή Î· Ï\83ελίδα Ï\80εÏ\81ιέÏ\87ει Î±Î»Î»Î±Î³Î­Ï\82 Ï\83Ï\84ο Î¼Î¿Î½Ï\84έλο Ï\80εÏ\81ιεÏ\87ομένοÏ\85 Ï\84Ï\89ν Ï\83ελίδÏ\89ν, ÎºÎ±Î¹ Ï\84ιÏ\82 Ï\83ελίδεÏ\82 Ï\80οÏ\85 Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκαν Î¼Îµ Î¼Î¿Î½Ï\84έλο Ï\80εÏ\81ιεÏ\87ομένοÏ\85 Î´Î¹Î±Ï\86οÏ\81εÏ\84ικÏ\8c Î±Ï\80Ï\8c Ï\84ο Ï\80Ï\81οεÏ\80ιλεγμένο.",
        "logentry-contentmodel-change": "{{GENDER:$2|Ο|Η}} $1 άλλαξε το πρότυπο περιεχομένου της σελίδας $3 από «$4» σε «$5»",
        "logentry-contentmodel-change-revertlink": "αναστροφή",
        "logentry-contentmodel-change-revert": "αναστροφή",
        "undeleteviewlink": "προβολή",
        "undeleteinvert": "Ανατροπή επιλογής",
        "undeletecomment": "Αιτία:",
-       "undeletedrevisions": "{{PLURAL:$1|τροποποίηση|τροποποιήσεις}} αποκαταστάθηκαν",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} και $2 {{PLURAL:$2|αρχείο|αρχεία}} επαναφέρθηκαν",
-       "undeletedfiles": "$1 {{PLURAL:$1|αρχείο|αρχεία}} επαναφέρθηκαν",
        "cannotundelete": "Μερικές ή όλες οι  αναιρέσεις διαγραφής απέτυχαν: $1",
        "undeletedpage": "'''Η $1 έχει επαναφερθεί'''\n\nΣυμβουλευτείτε το [[Special:Log/delete|αρχείο καταγραφής διαγραφών]] για ένα μητρώο των πρόσφατων διαγραφών και επαναφορών.",
        "undelete-header": "Δείτε [[Special:Log/delete|το αρχείο καταγραφής διαγραφών]] για πρόσφατα διαγεγραμμένες σελίδες.",
        "anonymous": "{{PLURAL:$1|Ανώνυμος χρήστης|Ανώνυμοι χρήστες}} του {{SITENAME}}",
        "siteuser": "{{SITENAME}} χρήστης $1",
        "anonuser": "ανώνυμος χρήστης $1 του {{SITENAME}}",
-       "lastmodifiedatby": "Η σελίδα αυτή τροποποιήθηκε τελευταία φορά στις  $2, $1 από το χρήστη $3.",
+       "lastmodifiedatby": "Η σελίδα αυτή τροποποιήθηκε τελευταία φορά στις $2, στις $1 από το χρήστη $3.",
        "othercontribs": "Βασισμένο στη δουλειά του/των $1",
        "others": "άλλοι",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|χρηστής|χρήστες}} του ιστοχώρου $1",
        "newimages-summary": "Αυτή η ειδική σελίδα δείχνει τα πιο πρόσφατα ανεβασμένα αρχεία.",
        "newimages-legend": "Φίλτρο",
        "newimages-label": "Όνομα αρχείου (ή μέρος αυτού):",
+       "newimages-user": "Διεύθυνση IP ή όνομα χρήστη",
        "newimages-showbots": "Εμφάνιση αρχείων ανεβασμένων από ρομπότ",
        "newimages-hidepatrolled": "Απόκρυψη ελεγμένων αρχείων.",
        "noimages": "Δεν υπάρχουν εικόνες.",
        "confirmrecreate": "{{GENDER:$1|Ο χρήστης|Η χρήστρια}} [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτήν τη σελίδα αφότου ξεκινήσατε την επεξεργασία με αιτιολόγηση:\n: <em>$2</em>\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτήν τη σελίδα.",
        "confirmrecreate-noreason": "{{GENDER:$1|Ο χρήστης|Η χρήστρια}} [[User:$1|$1]] ([[User talk:$1|συζήτηση]]) διέγραψε αυτήν τη σελίδα αφότου ξεκινήσατε την επεξεργασία.\nΠαρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να ξαναδημιουργήσετε αυτήν τη σελίδα.",
        "recreate": "Αναδημιουργία",
+       "confirm-purge-title": "Καθάρισε αυτή την σελίδα",
        "confirm_purge_button": "Εντάξει",
        "confirm-purge-top": "Να απαλειφθεί η προσωρινή μνήμη αυτής της σελίδας;",
        "confirm-purge-bottom": "Ο καθαρισμός σελίδας απαλείφει την προσωρινή μνήμη και εξαναγκάζει την πλέον πρόσφατη αναθεώρηση να εμφανιστεί.",
        "htmlform-user-not-valid": "Το <strong>$1</strong> δεν είναι έγκυρο όνομα χρήστη.",
        "logentry-delete-delete": "{{GENDER:$2|Ο|Η}} $1 διέγραψε τη σελίδα $3",
        "logentry-delete-delete_redir": "{{GENDER:$2|Ο|Η}} $1 διέγραψε την ανακατεύθυνση $3 με αντικατάσταση",
-       "logentry-delete-restore": "Ο/Η $1 αποκατέστησε τη σελίδα $3",
+       "logentry-delete-restore": "{{GENDER:$1|Ο|Η}} $1 αποκατέστησε τη σελίδα $3 ($4)",
        "logentry-delete-event": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ορατότητα {{PLURAL:$5|ενός καταγραφόμενου συμβάντος|$5 καταγραφόμενων συμβάντων}} στο $3: $4",
        "logentry-delete-revision": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ορατότητα {{PLURAL:$5|μίας αναθεώρησης|$5 αναθεωρήσεων}} στη σελίδα $3: $4",
        "logentry-delete-event-legacy": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ορατότητα των καταγραφόμενων συμβάντων στη σελίδα $3",
        "logentry-tag-update-revision": "{{GENDER:$2|Ο|Η}} $1 ενημέρωσε ετικέτες στην αναθεώρηση $4 της σελίδας $3 (πρόσθεσε {{PLURAL:$7|την|τις}} $6• αφαίρεσε {{PLURAL:$9|την|τις}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|ενημερώθηκαν}} ετικέτες για την καταχώριση αρχείου καταγραφής $5  της σελίδας $3 ({{PLURAL:$7|προστέθηκαν}} $6; {{PLURAL:$9|αφαιρέθηκαν}} $8)",
        "rightsnone": "(κανένα)",
-       "revdelete-summary": "επεξεργασία σύνοψης",
        "feedback-adding": "Προσθήκη σχολίων στην σελίδα...",
        "feedback-back": "Πίσω",
        "feedback-bugcheck": "Ωραία! Ελέγξτε μόνο ότι δεν είναι ήδη ένα από τα [$1 γνωστά σφάλματα].",
index 8957b4c..53f98f9 100644 (file)
                        "SamanthaNguyen",
                        "Usandaru555",
                        "Aefgh39622",
-                       "Anomie"
+                       "Anomie",
+                       "Dr. Shikha Jaggi",
+                       "Xð",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Link underlining:",
        "unprotectthispage": "Change protection of this page",
        "newpage": "New page",
        "talkpage": "Discuss this page",
-       "talkpagelinktext": "Talk",
+       "talkpagelinktext": "talk",
        "specialpage": "Special page",
        "personaltools": "Personal tools",
        "articlepage": "View content page",
        "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",
+       "rclinks": "Show last $1 changes in last $2 days",
        "diff": "diff",
        "hist": "hist",
        "minoreditletter": "m",
index abee4a9..22f2745 100644 (file)
        "redirectpagesub": "Redirect page",
        "redirectto": "Redirect to:",
        "talkpageheader": "-",
-       "lastmodifiedat": "This page was last modified on $1, at $2.",
+       "lastmodifiedat": "This page was last edited on $1, at $2.",
        "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.",
        "protectedpage": "Protected page",
        "jumpto": "Jump to:",
        "login-security": "Verify your identity",
        "nav-login-createaccount": "Log in / create account",
        "loginprompt": "",
-       "userlogin": "Log in / create account",
-       "userloginnocreate": "Log in",
        "logout": "Log out",
        "userlogout": "Log out",
        "userlogout-summary": "",
        "notloggedin": "Not logged in",
        "userlogin-noaccount": "Don't have an account?",
        "userlogin-joinproject": "Join {{SITENAME}}",
-       "nologin": "Don't have an account? $1.",
-       "nologinlink": "Create an account",
        "createaccount": "Create account",
-       "gotaccount": "Already have an account? $1.",
-       "gotaccountlink": "Log in",
-       "userlogin-resetlink": "Forgotten your login details?",
        "userlogin-resetpassword-link": "Forgot your password?",
        "helplogin-url": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Logging_in",
        "userlogin-helplink2": "Help with logging in",
        "createaccountmail": "Use a temporary random password and send it to the specified email address",
        "createaccountmail-help": "Can be used to create account for another person without learning the password.",
        "createacct-realname": "Real name (optional)",
-       "createaccountreason": "Reason:",
        "createacct-reason": "Reason",
        "createacct-reason-ph": "Why you are creating another account",
        "createacct-reason-help": "Message shown in the account creation log",
        "preview": "Preview",
        "showpreview": "Show preview",
        "showdiff": "Show changes",
-       "blankarticle": "<strong>Warning:</strong> The page you are creating is blank.\nIf you click \"{{int:savearticle}}\" again, the page will be created without any content.",
+       "blankarticle": "<strong>Warning:</strong> The page you are creating is blank.\nIf you click \"$1\" again, the page will be created without any content.",
        "anoneditwarning": "<strong>Warning:</strong> You are not logged in. Your IP address will be publicly visible if you make any edits. If you <strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
        "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
-       "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
-       "selfredirect": "<strong>Warning:</strong> You are redirecting this page to itself.\nYou may have specified the wrong target for the redirect, or you may be editing the wrong page.\nIf you click \"{{int:savearticle}}\" again, the redirect will be created anyway.",
+       "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"$1\" again, your edit will be saved without one.",
+       "selfredirect": "<strong>Warning:</strong> You are redirecting this page to itself.\nYou may have specified the wrong target for the redirect, or you may be editing the wrong page.\nIf you click \"$1\" again, the redirect will be created anyway.",
        "missingcommenttext": "Please enter a comment below.",
-       "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
+       "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject for this comment.\nIf you click \"$1\" again, your edit will be saved without one.",
        "summary-preview": "Preview of edit summary:",
        "subject-preview": "Preview of subject:",
        "previewerrortext": "An error occurred while attempting to preview your changes.",
        "editingcomment": "Editing $1 (new section)",
        "editconflict": "Edit conflict: $1",
        "editnotice-notext": "-",
-       "explainconflict": "Someone else has changed this page since you started editing it.\nThe upper text area contains the page text as it currently exists.\nYour changes are shown in the lower text area.\nYou will have to merge your changes into the existing text.\n<strong>Only</strong> the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
+       "explainconflict": "Someone else has changed this page since you started editing it.\nThe upper text area contains the page text as it currently exists.\nYour changes are shown in the lower text area.\nYou will have to merge your changes into the existing text.\n<strong>Only</strong> the text in the upper text area will be saved when you press \"$1\".",
        "yourtext": "Your text",
        "storedversion": "Stored revision",
        "nonunicodebrowser": "<strong>Warning: Your browser is not Unicode compliant.</strong>\nA workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
        "readonlywarning": "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>\nYou may wish to copy and paste your text into a text file and save it for later.\n\nThe system administrator who locked it offered this explanation: $1",
        "protectedpagewarning": "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>\nThe latest log entry is provided below for reference:",
        "semiprotectedpagewarning": "<strong>Note:</strong> This page has been protected so that only registered users can edit it.\nThe latest log entry is provided below for reference:",
-       "cascadeprotectedwarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is transcluded in the following cascade-protected {{PLURAL:$1|page|pages}}:",
+       "cascadeprotectedwarning": "<strong>Warning:</strong> This page has been protected so that only users with [[Special:ListGroupRights|specific rights]] can edit it because it is transcluded in the following cascade-protected {{PLURAL:$1|page|pages}}:",
        "titleprotectedwarning": "<strong>Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.</strong>\nThe latest log entry is provided below for reference:",
        "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} used in this preview:",
        "post-expand-template-argument-warning": "<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.\nThese arguments have been omitted.",
        "post-expand-template-argument-category": "Pages containing omitted template arguments",
        "parser-template-loop-warning": "Template loop detected: [[$1]]",
+       "template-loop-category": "Pages with template loops",
+       "template-loop-category-desc": "The page contains a template loop, ie. a template which calls itself recursively.",
        "parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)",
        "language-converter-depth-warning": "Language converter depth limit exceeded ($1)",
        "node-count-exceeded-category": "Pages where node count is exceeded",
        "page_first": "first",
        "page_last": "last",
        "histlegend": "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.",
-       "history-fieldset-title": "Browse history",
-       "history-show-deleted": "Deleted only",
+       "history-fieldset-title": "Search for revisions",
+       "history-show-deleted": "Revision deleted only",
        "history_copyright": "-",
        "histfirst": "oldest",
        "histlast": "newest",
        "search-file-match": "(matches file content)",
        "search-suggest": "Did you mean: $1",
        "search-rewritten": "Showing results for $1. Search instead for $2.",
-       "search-interwiki-caption": "Sister projects",
+       "search-interwiki-caption": "Results from sister projects",
        "search-interwiki-default": "Results from $1:",
        "search-interwiki-custom": "",
        "search-interwiki-more": "(more)",
        "prefs-help-prefershttps": "This preference will take effect on your next login.",
        "prefswarning-warning": "You've made changes to your preferences that have not been saved yet.\nIf you leave this page without clicking \"$1\" your preferences will not be updated.",
        "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.",
-       "userrights": "User rights management",
+       "userrights": "User rights",
        "userrights-summary": "",
        "userrights-lookup-user": "Select a user",
        "userrights-user-editname": "Enter a username:",
        "userrights-groupsmember": "Member of:",
        "userrights-groupsmember-auto": "Implicit member of:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "You may alter the groups this user is in:\n* A checked box means the user is in that group.\n* An unchecked box means the user is not in that group.\n* A * indicates that you cannot remove the group once you have added it, or vice versa.\n* A # indicates that you can only put back the expiration time of this group; you cannot bring it forward.",
+       "userrights-groups-help": "You may alter the groups this user is in:\n* A checked box means the user is in that group.\n* An unchecked box means the user is not in that group.\n* A * indicates that you cannot remove the group once you have added it, or vice versa.\n* A # indicates that you can only put back the expiration time of this group membership; you cannot bring it forward.",
        "userrights-reason": "Reason:",
        "userrights-no-interwiki": "You do not have permission to edit user rights on other wikis.",
        "userrights-nodatabase": "Database $1 does not exist or is not local.",
        "userrights-expiry-options": "1 day:1 day,1 week:1 week,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year",
        "userrights-invalid-expiry": "The expiry time for group \"$1\" is invalid.",
        "userrights-expiry-in-past": "The expiry time for group \"$1\" is in the past.",
-       "userrights-cannot-shorten-expiry": "You cannot bring forward the expiry of group \"$1\". Only users with permission to add and remove this group can bring forward expiry times.",
+       "userrights-cannot-shorten-expiry": "You cannot bring forward the expiry of membership in group \"$1\". Only users with permission to add and remove this group can bring forward expiry times.",
        "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
        "group": "Group:",
        "group-user": "Users",
        "right-editsemiprotected": "Edit pages protected as \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Edit the content model of a page",
        "right-editinterface": "Edit the user interface",
-       "right-editusercssjs": "Edit other users' CSS and JavaScript files",
        "right-editusercss": "Edit other users' CSS files",
        "right-edituserjs": "Edit other users' JavaScript files",
        "right-editmyusercss": "Edit your own user CSS files",
        "recentchanges-legend": "Recent changes options",
        "recentchanges-summary": "Track the most recent changes to the wiki on this page.",
        "recentchangestext": "-",
-       "recentchanges-noresult": "No changes during the given period matching these criteria.",
+       "recentchanges-noresult": "No changes during the given period match these criteria.",
        "recentchanges-feed-description": "Track the most recent changes to the wiki in this feed.",
        "recentchanges-label-newpage": "This edit created a new page",
        "recentchanges-label-minor": "This is a minor edit",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Show",
        "rcfilters-activefilters": "Active filters",
+       "rcfilters-quickfilters": "Quick links",
+       "rcfilters-quickfilters-placeholder-title": "No links saved yet",
+       "rcfilters-quickfilters-placeholder-description": "To save your filter settings and reuse them later, click the bookmark icon in the Active Filter area, below.",
+       "rcfilters-savedqueries-defaultlabel": "Saved filters",
+       "rcfilters-savedqueries-rename": "Rename",
+       "rcfilters-savedqueries-setdefault": "Set as default",
+       "rcfilters-savedqueries-unsetdefault": "Remove as default",
+       "rcfilters-savedqueries-remove": "Remove",
+       "rcfilters-savedqueries-new-name-label": "Name",
+       "rcfilters-savedqueries-apply-label": "Create quick link",
+       "rcfilters-savedqueries-cancel-label": "Cancel",
+       "rcfilters-savedqueries-add-new-title": "Save filters as a quick link",
        "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-whatsthis": "What's this?",
+       "rcfilters-filterlist-feedbacklink": "Provide feedback on the new (beta) filters",
        "rcfilters-highlightbutton-title": "Highlight results",
        "rcfilters-highlightmenu-title": "Select a color",
+       "rcfilters-highlightmenu-help": "Select a color to highlight this property",
        "rcfilters-filterlist-noresults": "No filters found",
+       "rcfilters-noresults-conflict": "No results found because the search criteria are in conflict",
+       "rcfilters-state-message-subset": "This filter has no effect because its results are included with those of the following, broader {{PLURAL:$2|filter|filters}} (try highlighting to distinguish it): $1",
+       "rcfilters-state-message-fullcoverage": "Selecting all filters in a group is the same as selecting none, so this filter has no effect. Group includes: $1",
        "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-filter-unregistered-description": "Editors who aren’t logged in.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "This filter conflicts with the following Experience {{PLURAL:$2|filter|filters}}, which {{PLURAL:$2|finds|find}} only registered users: $1",
+       "rcfilters-filtergroup-authorship": "Contribution authorship",
+       "rcfilters-filter-editsbyself-label": "Changes by you",
+       "rcfilters-filter-editsbyself-description": "Your own contributions.",
+       "rcfilters-filter-editsbyother-label": "Changes by others",
+       "rcfilters-filter-editsbyother-description": "All changes except your own.",
        "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-user-experience-level-conflicts-unregistered": "Experience filters find only registered users, so this filter conflicts with the “Unregistered” filter.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "The \"Unregistered\" filter conflicts with one or more Experience filters, which find registered users only. The conflicting filters are marked in the Active Filters area, above.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Newcomers",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Fewer than 10 edits and 4 days of activity.",
+       "rcfilters-filter-user-experience-level-learner-label": "Learners",
+       "rcfilters-filter-user-experience-level-learner-description": "More experience than \"Newcomers\" but less than \"Experienced users\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Experienced users",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Review status",
+       "rcfilters-filter-patrolled-label": "Patrolled",
+       "rcfilters-filter-patrolled-description": "Edits marked as patrolled.",
+       "rcfilters-filter-unpatrolled-label": "Unpatrolled",
+       "rcfilters-filter-unpatrolled-description": "Edits not marked as patrolled.",
        "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-watchlist": "Watchlisted pages",
+       "rcfilters-filter-watchlist-watched-label": "On Watchlist",
+       "rcfilters-filter-watchlist-watched-description": "Changes to pages on your Watchlist.",
+       "rcfilters-filter-watchlist-watchednew-label": "New Watchlist changes",
+       "rcfilters-filter-watchlist-watchednew-description": "Changes to Watchlisted pages you haven't visited since the changes occurred.",
+       "rcfilters-filter-watchlist-notwatched-label": "Not on Watchlist",
+       "rcfilters-filter-watchlist-notwatched-description": "Everything except changes to your Watchlisted pages.",
        "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-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....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "The \"Minor edits\" filter conflicts with one or more Type of Change filters, because certain types of change cannot be designated as \"minor.\" The conflicting filters are marked in the Active Filters area, above.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Certain types of change cannot be designated as \"minor,\" so this filter conflicts with the following Type of Change filters: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "This Type of Change filter conflicts with the \"Minor Edits\" filter. Certain types of change cannot be designated as \"minor.\"",
+       "rcfilters-filtergroup-lastRevision": "Last revision",
+       "rcfilters-filter-lastrevision-label": "Last revision",
+       "rcfilters-filter-lastrevision-description": "The most recent change to a page.",
+       "rcfilters-filter-previousrevision-label": "Earlier revisions",
+       "rcfilters-filter-previousrevision-description": "All changes that are not the most recent change to a page.",
        "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
+       "rclistfromreset": "Reset date selection",
        "rclistfrom": "Show new changes starting from $2, $3",
        "rcshowhideminor": "$1 minor edits",
        "rcshowhideminor-show": "Show",
        "rcshowhidecategorization": "$1 page categorization",
        "rcshowhidecategorization-show": "Show",
        "rcshowhidecategorization-hide": "Hide",
-       "rclinks": "Show last $1 changes in last $2 days<br />$3",
+       "rclinks": "Show last $1 changes in last $2 days",
        "diff": "diff",
        "hist": "hist",
        "hide": "Hide",
        "php-uploaddisabledtext": "File uploads are disabled in PHP.\nPlease check the file_uploads setting.",
        "uploadscripted": "This file contains HTML or script code that may be erroneously interpreted by a web browser.",
        "upload-scripted-pi-callback": "Cannot upload a file that contains XML-stylesheet processing instruction.",
+       "upload-scripted-dtd": "Cannot upload SVG files that contain a non-standard DTD declaration.",
        "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.",
        "enotif_body_intro_moved": "The {{SITENAME}} page $1 has been {{GENDER:$2|moved}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
        "enotif_body_intro_restored": "The {{SITENAME}} page $1 has been {{GENDER:$2|restored}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
        "enotif_body_intro_changed": "The {{SITENAME}} page $1 has been {{GENDER:$2|changed}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-       "enotif_lastvisited": "See $1 for all changes since your last visit.",
-       "enotif_lastdiff": "See $1 to view this change.",
+       "enotif_lastvisited": "For all changes since your last visit, see $1",
+       "enotif_lastdiff": "To view this change, see $1",
        "enotif_anon_editor": "anonymous user $1",
        "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE",
        "created": "created",
        "undeleteviewlink": "view",
        "undeleteinvert": "Invert selection",
        "undeletecomment": "Reason:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisions}} restored",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored",
-       "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
        "cannotundelete": "Some or all of the undeletion failed:\n$1",
        "undeletedpage": "<strong>$1 has been restored</strong>\n\nConsult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
        "undelete-header": "See [[Special:Log/delete|the deletion log]] for recently deleted pages.",
        "sp-contributions-uploads": "uploads",
        "sp-contributions-logs": "logs",
        "sp-contributions-talk": "talk",
-       "sp-contributions-userrights": "user rights management",
+       "sp-contributions-userrights": "{{GENDER:$1|user}} rights management",
        "sp-contributions-blocked-notice": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
        "sp-contributions-blocked-notice-anon": "This IP address is currently blocked.\nThe latest block log entry is provided below for reference:",
        "sp-contributions-search": "Search for contributions",
        "unblocked-id": "Block $1 has been removed.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] has been unblocked.",
        "blocklist": "Blocked users",
+       "autoblocklist": "Autoblocks",
+       "autoblocklist-submit": "Search",
+       "autoblocklist-legend": "List autoblocks",
+       "autoblocklist-localblocks": "Local {{PLURAL:$1|autoblock|autoblocks}}",
+       "autoblocklist-empty": "The autoblock list is empty.",
+       "autoblocklist-otherblocks": "Other {{PLURAL:$1|autoblock|autoblocks}}",
        "ipblocklist": "Blocked users",
        "ipblocklist-legend": "Find a blocked user",
        "blocklist-userblocks": "Hide account blocks",
        "accesskey-pt-mycontris": "y",
        "accesskey-pt-anoncontribs": "y",
        "accesskey-pt-login": "o",
+       "accesskey-pt-login-private": "o",
        "accesskey-pt-logout": "",
        "accesskey-pt-createaccount": "",
        "accesskey-ca-talk": "t",
        "tooltip-pt-mycontris": "A list of {{GENDER:|your}} contributions",
        "tooltip-pt-anoncontribs": "A list of edits made from this IP address",
        "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
+       "tooltip-pt-login-private": "You need to log in to use this wiki",
        "tooltip-pt-logout": "Log out",
        "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",
        "anonymous": "Anonymous {{PLURAL:$1|user|users}} of {{SITENAME}}",
        "siteuser": "{{SITENAME}} user $1",
        "anonuser": "{{SITENAME}} anonymous user $1",
-       "lastmodifiedatby": "This page was last modified $2, $1 by $3.",
+       "lastmodifiedatby": "This page was last edited $2, $1 by $3.",
        "othercontribs": "Based on work by $1.",
        "others": "others",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|user}}|users}} $1",
        "newimages-summary": "This special page shows the last uploaded files.",
        "newimages-legend": "Filter",
        "newimages-label": "Filename (or a part of it):",
+       "newimages-user": "IP address or username",
        "newimages-showbots": "Show uploads by bots",
        "newimages-hidepatrolled": "Hide patrolled uploads",
        "noimages": "Nothing to see.",
        "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": "Recreate",
        "unit-pixel": "px",
+       "confirm-purge-title": "Purge this page",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Clear the cache of this page?",
        "confirm-purge-bottom": "Purging a page clears the cache and forces the most current revision to appear.",
        "autoredircomment": "Redirected page to [[$1]]",
        "autosumm-new": "Created page with \"$1\"",
        "autosumm-newblank": "Created blank page",
-       "autoblock_whitelist": "AOL http://webmaster.info.aol.com/proxyinfo.html\n*64.12.96.0/19\n*149.174.160.0/20\n*152.163.240.0/21\n*152.163.248.0/22\n*152.163.252.0/23\n*152.163.96.0/22\n*152.163.100.0/23\n*195.93.32.0/22\n*195.93.48.0/22\n*195.93.64.0/19\n*195.93.96.0/19\n*195.93.16.0/20\n*198.81.0.0/22\n*198.81.16.0/20\n*198.81.8.0/23\n*202.67.64.128/25\n*205.188.192.0/20\n*205.188.208.0/23\n*205.188.112.0/20\n*205.188.146.144/30\n*207.200.112.0/21",
+       "autoblock_whitelist": "",
        "size-bytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "size-kilobytes": "$1 KB",
        "size-megabytes": "$1 MB",
        "rawmessage": "$1",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|deleted}} redirect $3 by overwriting",
-       "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|restored}} page $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 revision|$1 revisions}}",
+       "restore-count-files": "{{PLURAL:$1|1 file|$1 files}}",
        "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}} on page $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|changed}} visibility of log events on $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": "(none)",
-       "revdelete-logentry": "changed revision visibility of \"[[$1]]\"",
-       "logdelete-logentry": "changed event visibility of \"[[$1]]\"",
-       "revdelete-content": "content",
-       "revdelete-summary": "edit summary",
-       "revdelete-uname": "username",
-       "revdelete-hid": "hid $1",
-       "revdelete-unhid": "unhid $1",
-       "revdelete-log-message": "$1 for $2 {{PLURAL:$2|revision|revisions}}",
-       "logdelete-log-message": "$1 for $2 {{PLURAL:$2|event|events}}",
        "deletedarticle": "deleted \"[[$1]]\"",
        "suppressedarticle": "suppressed \"[[$1]]\"",
        "undeletedarticle": "restored \"[[$1]]\"",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Canadian Aboriginal",
        "special-characters-title-endash": "en dash",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "minus sign",
        "mw-widgets-titleinput-description-redirect": "redirect to $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Add a category...",
        "mw-widgets-usersmultiselect-placeholder": "Add more...",
+       "date-range-from": "From date:",
+       "date-range-to": "To date:",
        "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
        "sessionprovider-generic": "$1 sessions",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions",
        "restrictionsfield-label": "Allowed IP ranges:",
        "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revision $1",
-       "pageid": "page ID $1"
+       "pageid": "page ID $1",
+       "rawhtml-notallowed": "&lt;html&gt; tags cannot be used outside of normal pages.",
+       "gotointerwiki": "Leaving {{SITENAME}}",
+       "gotointerwiki-invalid": "The specified title is invalid.",
+       "gotointerwiki-external": "You are about to leave {{SITENAME}} to visit [[$2]], which is a separate website.\n\n'''[$1 Continue to $1]'''",
+       "undelete-cantedit": "You cannot undelete this page as you are not allowed to edit this page.",
+       "undelete-cantcreate": "You cannot undelete this page as there is no existing page with this name and you are not allowed to create this page."
 }
index d5c5258..a594a39 100644 (file)
        "login": "Ensaluti",
        "login-security": "Kontrolu vian identecon",
        "nav-login-createaccount": "Ensaluti / Krei novan konton",
-       "userlogin": "Ensaluti / Krei novan konton",
-       "userloginnocreate": "Ensaluti",
        "logout": "Elsaluti",
        "userlogout": "Elsaluti",
        "notloggedin": "Ne ensalutinta",
        "userlogin-noaccount": "Ĉu vi ne havas konton?",
        "userlogin-joinproject": "Aliĝu al {{SITENAME}}",
-       "nologin": "Ĉu vi ne havas konton? $1.",
-       "nologinlink": "Krei konton",
        "createaccount": "Krei konton",
-       "gotaccount": "Ĉu vi jam havas konton? $1.",
-       "gotaccountlink": "Ensaluti",
-       "userlogin-resetlink": "Ĉu vi forgesis ensalutajn detalojn?",
        "userlogin-resetpassword-link": "Ĉu vi forgesis vian pasvorton?",
        "userlogin-helplink2": "Helpo pri ensaluto",
        "userlogin-loggedin": "Vi jam estas ensalutita kiel {{GENDER:$1|$1}}.\nUzu la formularon suben por ensaluti kiel alia uzanto.",
        "createaccountmail": "Uzi provizoran hazardsignan pasvorton kaj sendi ĝin al la retpoŝta adreso ĉi-suba",
        "createaccountmail-help": "Uzebla por krei konton de alia persono sen lerni la pasvorton.",
        "createacct-realname": "Vera nomo (nedeviga)",
-       "createaccountreason": "Kialo:",
        "createacct-reason": "Kialo",
        "createacct-reason-ph": "Kial vi kreas plian konton",
        "createacct-reason-help": "Mesaĝo vidigita en la protokolo pri kreado de konto",
        "savearticle": "Konservi paĝon",
        "savechanges": "Konservi ŝanĝojn",
        "publishpage": "Eldoni paĝon",
-       "publishchanges": "Eldoni ŝanĝojn",
+       "publishchanges": "Publikigi ŝanĝojn",
        "preview": "Antaŭrigardo",
        "showpreview": "Antaŭrigardo",
        "showdiff": "Montri ŝanĝojn",
-       "blankarticle": "<strong>Atentigo:</strong>La paĝo kiun vi kreas estas malplena.\nSe vi denove klakos al \"{{int:savearticle}}\" la paĝo estos konservita sen enhavo.",
+       "blankarticle": "<strong>Atentigo:</strong>La paĝo kiun vi kreas estas malplena.\nSe vi denove klakos al \"$1\" la paĝo estos konservita sen enhavo.",
        "anoneditwarning": "<strong>Averto:</strong> Vi ne estas ensalutinta.\nVia IP-adreso enregistriĝos en la redakta historio de tiu ĉi paĝo. Se vi <strong>[$1 ensalutas]</strong> aŭ <strong>[$2 kreas konton]</strong>, viaj redaktoj estos atribuitaj al via salutnomo, kune kun aliaj bonaĵoj.",
        "anonpreviewwarning": "''Vi ne estas ensalutita. La konservo de la paĝo registros vian IP-adreson en redakta historio de ĉi tiu paĝo.''",
        "missingsummary": "'''Rememorigilo:''' Vi ne provizis redaktan resumon. Se vi alklakos denove la konservan butonon, via redaktaĵo estos konservita sen resumo.",
-       "selfredirect": "<strong>Atentigo:</strong> Ve alidirektas tiun ĉi paĝon al ĝi mem. Vi eble volas difini alian celan paĝon aŭ vi volas redakti alian paĝon.\nSe vi denove klakos al \"{{int:savearticle}}\", la alidirektilo estos ĉiuokaze kreita.",
+       "selfredirect": "<strong>Atentigo:</strong> Ve alidirektas tiun ĉi paĝon al ĝi mem. Vi eble volas difini alian celan paĝon aŭ vi volas redakti alian paĝon.\nSe vi denove klakos al \"$1\", la alidirektilo estos ĉiuokaze kreita.",
        "missingcommenttext": "Bonvolu entajpi komenton malsupre.",
        "missingcommentheader": "<strong>Atenton:</strong> Vi ne provizis temon aŭ subtitolon por ĉi tiu komento.\nSe vi klakos \"Konservi\" denove, via redakto estos konservita sen ĝi.",
        "summary-preview": "Resuma antaŭrigardo:",
        "editingsection": "Redaktante $1 (sekcion)",
        "editingcomment": "Redaktante $1 (nova sekcio)",
        "editconflict": "Redakta konflikto: $1",
-       "explainconflict": "Iu alia ŝanĝis la paĝon post kiam vi ekredaktis.\nLa supra tekstujo enhavas la aktualan tekston de la artikolo.\nViaj ŝanĝoj estas en la malsupra tekstujo.\nVi devas mem kunfandi viajn ŝanĝojn kaj la jaman tekston.\n'''Nur''' la teksto en la supra tekstujo estos konservita kiam vi alklakos \"{{int:savearticle}}\".",
+       "explainconflict": "Iu alia ŝanĝis la paĝon post kiam vi ekredaktis.\nLa supra tekstujo enhavas la aktualan tekston de la artikolo.\nViaj ŝanĝoj estas en la malsupra tekstujo.\nVi devas mem kunfandi viajn ŝanĝojn kaj la jaman tekston.\n'''Nur''' la teksto en la supra tekstujo estos konservita kiam vi alklakos \"$1\".",
        "yourtext": "Via teksto",
        "storedversion": "Registrita versio",
        "nonunicodebrowser": "'''ATENTU: Via foliumilo ne eltenas unikodon, bonvolu ŝanĝi ĝin antaŭ ol redakti artikolon.'''",
        "post-expand-template-argument-warning": "Averto: Ĉi tiu paĝo enhavas almenaŭ unu ŝablonan argumenton, kiu havas tro grandan etendan pezon.\nĈi tiuj argumentoj estis forlasitaj.",
        "post-expand-template-argument-category": "Paĝoj enhavantaj forlasitajn argumentojn de ŝablonoj",
        "parser-template-loop-warning": "Rekursiva ŝablono estis trovita: [[$1]]",
+       "template-loop-category": "Paĝoj kun ŝablonaj iteracioj",
        "parser-template-recursion-depth-warning": "Ŝablona profundeco transpasis limon ($1)",
        "language-converter-depth-warning": "Profundo de lingvo-konvertilo preterpasis limon ($1)",
        "node-count-exceeded-category": "Paĝoj kie la nombro da nodoj estas preterpasita",
        "right-editsemiprotected": "Redakti paĝojn protektitajn kiel \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Redakti paĝan enhavmodelon",
        "right-editinterface": "Redakti la uzantointerfacon",
-       "right-editusercssjs": "Redaktu CSS- kaj JS-dosierojn de aliaj uzantoj",
        "right-editusercss": "Redaktu CSS-dosierojn de aliaj uzantoj",
        "right-edituserjs": "Redaktu JS-dosierojn de aliaj uzantoj",
        "right-editmyusercss": "Redakti viajn proprajn CSS-dosierojn",
        "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-filter-user-experience-level-newcomer-label": "Novuloj",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Malpli ol 10 redaktoj kaj 4 tagoj de aktiveco.",
+       "rcfilters-filter-user-experience-level-learner-label": "Lernantoj",
+       "rcfilters-filter-user-experience-level-learner-description": "Pliaj tagoj da aktiveco kaj redaktoj ol \"Novuloj\" sed malpli ol \"Spertaj uzantoj\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Spertaj uzantoj",
+       "rcfilters-filter-user-experience-level-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.",
        "rcshowhidecategorization": "$1 kategoriigon de paĝoj",
        "rcshowhidecategorization-show": "Montri",
        "rcshowhidecategorization-hide": "Kaŝi",
-       "rclinks": "Montri $1 lastajn ŝanĝojn dum la $2 lastaj tagoj.<br />$3",
+       "rclinks": "Montri $1 lastajn ŝanĝojn dum la $2 lastaj tagoj.",
        "diff": "malsamoj",
        "hist": "historio",
        "hide": "Kaŝi",
        "undeleteviewlink": "vidi",
        "undeleteinvert": "Inversigi selektaĵon",
        "undeletecomment": "Kialo:",
-       "undeletedrevisions": "{{PLURAL:$1|1 versio restarigita|$1 versioj restarigitaj}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 versio|$1 versioj}} kaj {{PLURAL:$2|1 dosiero|$2 dosieroj}} restarigitaj",
-       "undeletedfiles": "{{PLURAL:$1|1 dosiero restarigita|$1 dosieroj restarigitaj}}",
        "cannotundelete": "Iu aŭ ĉiuj restarigoj malsukcesis: \n$1",
        "undeletedpage": "'''$1 estis restarigita'''\n\nKonsultu la [[Special:Log/delete|deletion log]] por protokolo pri la lastatempaj forigoj kaj restarigoj.",
        "undelete-header": "Konsulti la [[Special:Log/delete|protokolo de forigoj]] por lastatempaj forigoj.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|ĝisdatigis}} etikedojn de la revizio $4 de la paĝo $3 ({{PLURAL:$7|aldonita|aldonitaj}} $6; {{PLURAL:$9|forigita|forigitaj}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|ĝisdatigis}} etikedojn de la protokolero $5 de la paĝo $3 ({{PLURAL:$7|aldonita|aldonitaj}} $6; {{PLURAL:$9|forigita|forigitaj}} $8)",
        "rightsnone": "(nenia)",
-       "revdelete-summary": "redaktoresumon",
        "feedback-adding": "Aldonanta respondon al la paĝo...",
        "feedback-back": "Reen",
        "feedback-bugcheck": "Bonega! Nur konfirmu ke ĝi ne jam ekzistas inter la [$1 konataj cimoj].",
diff --git a/languages/i18n/es-formal.json b/languages/i18n/es-formal.json
new file mode 100644 (file)
index 0000000..fe7026c
--- /dev/null
@@ -0,0 +1,333 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Baffo",
+                       "Dalton2",
+                       "Fitoschido",
+                       "Macofe",
+                       "MarcoAurelio",
+                       "XanaG"
+               ]
+       },
+       "tog-underline": "Subrayado de enlaces:",
+       "tog-hideminor": "Ocultar ediciones menores de los cambios recientes",
+       "tog-hidepatrolled": "Ocultar ediciones patrulladas de los cambios recientes",
+       "tog-newpageshidepatrolled": "Ocultar páginas patrulladas de la lista de páginas nuevas",
+       "tog-showtoolbar": "Mostrar barra de edición",
+       "tog-ccmeonemails": "Enviarme una copia de los correos electrónicos que yo envíe a otros usuarios",
+       "sunday": "domingo",
+       "monday": "lunes",
+       "tuesday": "martes",
+       "wednesday": "miércoles",
+       "thursday": "jueves",
+       "friday": "viernes",
+       "saturday": "sábado",
+       "sun": "dom.",
+       "mon": "lun.",
+       "tue": "mar.",
+       "wed": "mié.",
+       "thu": "jue.",
+       "fri": "vie.",
+       "sat": "sáb.",
+       "january": "enero",
+       "february": "febrero",
+       "march": "marzo",
+       "april": "abril",
+       "may_long": "mayo",
+       "june": "junio",
+       "july": "julio",
+       "august": "agosto",
+       "september": "septiembre",
+       "october": "octubre",
+       "november": "noviembre",
+       "december": "diciembre",
+       "january-gen": "enero",
+       "february-gen": "febrero",
+       "march-gen": "marzo",
+       "april-gen": "abril",
+       "may-gen": "mayo",
+       "june-gen": "junio",
+       "july-gen": "julio",
+       "august-gen": "agosto",
+       "september-gen": "septiembre",
+       "october-gen": "octubre",
+       "november-gen": "noviembre",
+       "december-gen": "diciembre",
+       "jan": "enero",
+       "feb": "febrero",
+       "mar": "marzo",
+       "apr": "abril",
+       "may": "mayo",
+       "jun": "junio",
+       "jul": "julio",
+       "aug": "agosto",
+       "sep": "septiembre",
+       "oct": "octubre",
+       "nov": "noviembre",
+       "dec": "diciembre",
+       "january-date": "$1 de enero",
+       "february-date": "$1 de febrero",
+       "march-date": "$1 de marzo",
+       "april-date": "$1 de abril",
+       "may-date": "$1 de mayo",
+       "june-date": "$1 de junio",
+       "july-date": "$1 de julio",
+       "august-date": "$1 de agosto",
+       "september-date": "$1 de septiembre",
+       "october-date": "$1 de octubre",
+       "november-date": "$1 de noviembre",
+       "december-date": "$1 de diciembre",
+       "pagecategories": "{{PLURAL:$1|Categoría|Categorías}}",
+       "category_header": "Páginas en la categoría «$1»",
+       "subcategories": "Subcategorías",
+       "category-media-header": "Archivos multimedia en la categoría «$1»",
+       "about": "Acerca de",
+       "article": "Página de contenido",
+       "newwindow": "(se abre en una ventana nueva)",
+       "cancel": "Cancelar",
+       "moredotdotdot": "Más…",
+       "morenotlisted": "Esta lista no está completa.",
+       "mypage": "Página",
+       "mytalk": "Discusión",
+       "anontalk": "Discusión para esta IP",
+       "navigation": "Navegación",
+       "and": "&#32;y",
+       "qbfind": "Buscar",
+       "qbbrowse": "Examinar",
+       "qbedit": "Editar",
+       "qbpageoptions": "Esta página",
+       "qbmyoptions": "Mis páginas",
+       "faq": "PP. FF.",
+       "faqpage": "Project:Preguntas frecuentes",
+       "actions": "Acciones",
+       "namespaces": "Espacios de nombres",
+       "variants": "Variantes",
+       "navigation-heading": "Menú de navegación",
+       "errorpagetitle": "Error",
+       "returnto": "Volver a $1.",
+       "tagline": "De {{SITENAME}}",
+       "help": "Ayuda",
+       "search": "Buscar",
+       "searchbutton": "Buscar",
+       "go": "Ir",
+       "searcharticle": "Ir",
+       "history": "Historial de página",
+       "history_short": "Historial",
+       "printableversion": "Versión para imprimir",
+       "permalink": "Enlace permanente",
+       "print": "Imprimir",
+       "view": "Ver",
+       "view-foreign": "Ver en $1",
+       "edit": "Editar",
+       "edit-local": "Editar descripción local",
+       "create": "Crear",
+       "create-local": "Añadir descripción local",
+       "editthispage": "Editar esta página",
+       "create-this-page": "Crear esta página",
+       "talkpagelinktext": "Discusión",
+       "personaltools": "Herramientas personales",
+       "talk": "Discusión",
+       "views": "Vistas",
+       "toolbox": "Herramientas",
+       "otherlanguages": "Otros idiomas",
+       "lastmodifiedat": "Esta página fue modificada por última vez el $1, a las $2.",
+       "protectedpage": "Página protegida",
+       "jumpto": "Saltar a:",
+       "jumptonavigation": "navegación",
+       "jumptosearch": "buscar",
+       "view-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nDemasiados usuarios están intentando ver esta página.\nPor favor espere unos instantes antes de reintentar acceder nuevamente a esta página.\n\n$1",
+       "aboutsite": "Acerca de {{SITENAME}}",
+       "aboutpage": "Project:Acerca de",
+       "currentevents": "Actualidad",
+       "currentevents-url": "Project:Actualidad",
+       "disclaimers": "Avisos legales",
+       "disclaimerpage": "Project:Limitación general de responsabilidad",
+       "helppage-top-gethelp": "Ayuda",
+       "mainpage": "Página Principal",
+       "mainpage-description": "Página principal",
+       "policy-url": "Project:Política",
+       "portal": "Portal de la comunidad",
+       "portal-url": "Project:Portal de la comunidad",
+       "privacy": "Política de protección de datos",
+       "privacypage": "Project:Política de protección de datos",
+       "badaccess": "Error de permisos",
+       "badaccess-group0": "No tiene permiso para ejecutar la acción que ha solicitado.",
+       "badaccess-groups": "La acción que ha solicitado está limitada {{PLURAL:$2|al grupo|a uno de estos $2 grupos}}: $1.",
+       "versionrequired": "Se necesita por lo menos la versión $1 de MediaWiki",
+       "ok": "Aceptar",
+       "retrievedfrom": "Obtenido de «$1»",
+       "youhavenewmessages": "Tiene usted $1 ($2).",
+       "youhavenewmessagesmulti": "Tienes mensajes nuevos en $1",
+       "editsection": "editar",
+       "editold": "editar",
+       "viewsourceold": "ver código",
+       "editlink": "editar",
+       "viewsourcelink": "ver código",
+       "editsectionhint": "Editar sección: $1",
+       "toc": "Contenido",
+       "showtoc": "mostrar",
+       "hidetoc": "ocultar",
+       "collapsible-collapse": "Contraer",
+       "collapsible-expand": "Expandir",
+       "confirmable-confirm": "¿Está {{GENDER:$1|seguro|segura}}?",
+       "confirmable-yes": "Sí",
+       "confirmable-no": "No",
+       "site-atom-feed": "Feed Atom de $1",
+       "page-rss-feed": "Canal RSS «$1»",
+       "page-atom-feed": "Canal Atom «$1»",
+       "red-link-title": "$1 (la página no existe)",
+       "nstab-main": "Página",
+       "nstab-special": "Página especial",
+       "nstab-image": "Archivo",
+       "nstab-mediawiki": "Mensaje",
+       "nstab-template": "Plantilla",
+       "nstab-help": "Página de ayuda",
+       "nstab-category": "Categoría",
+       "nosuchactiontext": "La acción especificada en la dirección es inválida.\nEs posible que haya escrito mal la URL o que haya seguido un enlace incorrecto. \nEsto también podría indicar un error en el software utilizado en {{SITENAME}}.",
+       "nospecialpagetext": "<strong>Ha solicitado una página especial inexistente.</strong>\n\nPuede usted ver una lista de las páginas especiales en [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "Error",
+       "databaseerror": "Error en la base de datos",
+       "databaseerror-query": "Consulta: $1",
+       "databaseerror-function": "Función: $1",
+       "databaseerror-error": "Error: $1",
+       "laggedslavemode": "<strong>Aviso:</strong> la página puede no contener las actualizaciones más recientes.",
+       "enterlockreason": "Proporcione el motivo del bloqueo, así como una estimación de cuándo se producirá el desbloqueo",
+       "readonlytext": "La base de datos se encuentra actualmente bloqueada y no permite la creación de páginas nuevas y otras modificaciones, probablemente de forma temporal debido al mantenimiento rutinario de la base de datos. Después de esas operaciones el sitio se encontrará nuevamente disponible.\n\nLa razón dada por el administrador que bloqueó la base de datos es la que sigue: $1",
+       "missing-article": "La base de datos no encuentra el texto de una página que debería hallarse, llamada \"$1\" $2.\n\nLa causa de esto suele deberse a un ''diff'' anacrónico o un enlace al historial de una página que ha sido borrada.\n\nSi no fuera el caso, usted puede haber encontrado un fallo en el sistema.\n\nPor favor, avise a un [[Special:ListUsers/sysop|administrador]], tomando nota de la URL.",
+       "internalerror": "Error interno",
+       "internalerror_info": "Error interno: $1",
+       "viewsource": "Ver código",
+       "actionthrottledtext": "Como medida de protección contra el ''spam'', la acción que está realizando está limitada a un número determinado de veces en un periodo corto de tiempo. Usted ha excedido ese límite. Por favor pruebe de nuevo en unos minutos.",
+       "viewsourcetext": "Puede ver y copiar el código fuente de esta página:",
+       "editinginterface": "'''Aviso:''' Está usted editando una página usada para proporcionar texto de interfaz para el software. Los cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios. Para traducciones, por favor considere usar [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], el proyecto de traducción de MediaWiki.",
+       "welcomeuser": "Le damos la bienvenida, $1.",
+       "welcomecreation-msg": "Se ha creado su cuenta.\nPuede cambiar las [[Special:Preferences|preferencias]] de {{SITENAME}} si lo desea.",
+       "yourname": "Nombre de usuario:",
+       "userlogin-yourname": "Nombre de usuario",
+       "userlogin-yourname-ph": "Escriba su nombre de usuario",
+       "createacct-another-username-ph": "Escriba el nombre de usuario",
+       "yourpassword": "Contraseña:",
+       "userlogin-yourpassword": "Contraseña",
+       "userlogin-yourpassword-ph": "Escriba su contraseña",
+       "createacct-yourpassword-ph": "Escriba una contraseña",
+       "yourpasswordagain": "Escriba la contraseña otra vez:",
+       "createacct-yourpasswordagain": "Confirme la contraseña",
+       "createacct-yourpasswordagain-ph": "Escriba la contraseña otra vez",
+       "login": "Acceder",
+       "nav-login-createaccount": "Iniciar sesión / crear cuenta",
+       "logout": "Desconectar",
+       "userlogout": "Salir",
+       "userlogin-noaccount": "¿No tiene una cuenta?",
+       "userlogin-joinproject": "Únase a {{SITENAME}}",
+       "userlogin-resetpassword-link": "¿Olvidó su contraseña?",
+       "createacct-emailrequired": "Dirección de correo electrónico",
+       "createacct-emailoptional": "Dirección de correo electrónico (opcional)",
+       "anoneditwarning": "'''Aviso:''' No ha iniciado sesión con una cuenta de usuario.\nSu dirección IP se almacenará en el historial de ediciones de la página.",
+       "newarticletext": "Ha seguido usted un enlace a una página que aún no existe.\nPara crear esta página, escriba en el campo a continuación. Para más información, consulte la [$1 página de ayuda].\nSi ha llegado aquí por error, vuelva a la página anterior.",
+       "noarticletext": "En este momento no hay texto en esta página.\nPuede [[Special:Search/{{PAGENAME}}|buscar el título de esta página]] en otras páginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta página]</span>.",
+       "copyrightwarning": "Por favor observe que todas las contribuciones realizadas en {{SITENAME}} serán consideradas como liberadas bajo $2 (véase $1 para más detalles).\nSi no desea que sus escritos sean editados o redistribuídos a voluntad, entonces no contribuya aquí.<br />\nAl mismo tiempo está usted prometiendo que lo que usted va a enviar lo ha escrito usted, o copiado de una fuente de dominio público.\n'''¡No envíe textos con derechos de autor sin el debido permiso!'''",
+       "permissionserrorstext-withaction": "No tiene permiso para $2 por {{PLURAL:$1|la|las}} {{PLURAL:$1|siguiente|siguientes}} {{PLURAL:$1|razón|razones}}:",
+       "rev-deleted-text-permission": "Esta revisión de la página ha sido '''borrada'''.\nPuede encontrar detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
+       "rev-deleted-text-unhide": "Esta revisión de página ha sido '''borrada'''.\nPuede haber detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].\nComo administrador todavía puede [$1 ver esta revisión] si así lo desea.",
+       "rev-suppressed-text-unhide": "Esta revisión de la página ha sido '''suprimida'''.\nPuede haber detalles en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].\nComo administrador podrá seguir [$1 viendo esta revisión] si desea continuar.",
+       "rev-deleted-text-view": "Esta revisión de la página ha sido '''borrada'''.\nComo administrador puede verla; puede haber detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
+       "rev-suppressed-text-view": "Esta revisión de la página ha sido '''suprimida'''.\nComo administrador puede verla; puede haber detalles en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supresiones].",
+       "rev-deleted-no-diff": "No puede visualizarse este cambio debido a que las revisiones han sido '''borradas'''.\nPuede haber detalles en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrados].",
+       "revdelete-nooldid-text": "No se ha especificado una revisión o revisiones destino sobre las que realizar esta función.",
+       "revdelete-show-file-confirm": "¿Está seguro de que desea ver la revisión borrada del archivo \"<nowiki>$1</nowiki>\" del $2 a las $3?",
+       "revdelete-confirm": "Confirme que quiere realizar la operación, que entiende las consecuencias y que está ejecutando dicha acción acorde con [[{{MediaWiki:Policy-url}}|las políticas]].",
+       "lineno": "Línea $1:",
+       "editundo": "deshacer",
+       "searchresults": "Resultados de la búsqueda",
+       "searchresults-title": "Resultados de la búsqueda de «$1»",
+       "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
+       "search-result-size": "$1 ({{PLURAL:$2|1 palabra|$2 palabras}})",
+       "search-section": "(sección $1)",
+       "search-suggest": "¿Quiso decir: $1?",
+       "newuserlogpage": "Altas de usuarios",
+       "rightslog": "Registro de cambios de permisos de usuarios",
+       "recentchanges": "Cambios recientes",
+       "recentchangeslinked-toolbox": "Cambios relacionados",
+       "recentchangeslinked-summary": "Esta es una lista de cambios efectuados recientemente a páginas enlazadas desde una página dada (o de miembros de una categoría dada).\nLas páginas que se encuentran en tu [[Special:Watchlist|lista de seguimiento]] están en <strong>negritas</strong>.",
+       "upload": "Subir archivo",
+       "filehist-help": "Haga clic sobre una fecha/hora para ver el archivo a esa fecha.",
+       "randompage": "Página aleatoria",
+       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "emailuser": "Enviar un correo electrónico a este usuario",
+       "addedwatchtext": "La página «[[:$1]]» ha sido añadida a su [[Special:Watchlist|lista de seguimiento]]. Los cambios futuros en esta página y en su página de discusión asociada se indicarán ahí, y la página aparecerá '''en negritas''' en la [[Special:RecentChanges|lista de cambios recientes]] para hacerla más fácil de detectar.\n\nCuando quiera eliminar la página de su lista de seguimiento, presione «Dejar de vigilar» en el menú.",
+       "removedwatchtext": "La página «[[:$1]]» ha sido eliminada de su [[Special:Watchlist|lista de seguimiento]].",
+       "confirmdeletetext": "Está a punto de borrar una página junto con su historial.\nPor favor confirme que desea realizar esto, que entiende las consecuencias y que está realizando esta acción de acuerdo con las [[{{MediaWiki:Policy-url}}|políticas]]",
+       "deletedtext": "\"$1\" ha sido borrado.\nVea $2 para un registro de los borrados recientes.",
+       "rollbacklink": "revertir",
+       "protect-text": "Puede ver y modificar el nivel de protección de la página '''$1'''.",
+       "protect-locked-access": "Su cuenta no tiene permiso para cambiar los niveles de protección de una página.\nA continuación se muestran las opciones actuales de la página '''$1''':",
+       "protect-cascadeon": "Actualmente esta página está protegida porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que tienen activada la opción de protección en cascada. Puede cambiar el nivel de protección de esta página, pero no afectará a la protección en cascada.",
+       "protect-cantedit": "No puede cambiar el nivel de protección porque no tiene permiso para editarla.",
+       "blanknamespace": "(Principal)",
+       "whatlinkshere": "Lo que enlaza aquí",
+       "ipblocklist": "Usuarios bloqueados",
+       "contribslink": "contribs",
+       "articleexists": "Ya existe una página con ese nombre, o el nombre que ha escogido no es válido.\nPor favor, elija otro nombre.",
+       "thumbnail-more": "Aumentar",
+       "tooltip-pt-userpage": "Su página de usuario",
+       "tooltip-pt-mytalk": "Su página de discusión",
+       "tooltip-pt-preferences": "Sus preferencias",
+       "tooltip-pt-watchlist": "La lista de páginas cuyos cambios usted vigila",
+       "tooltip-pt-mycontris": "Lista de sus contribuciones",
+       "tooltip-pt-login": "Le invitamos a que se registre, aunque no es obligatorio",
+       "tooltip-pt-createaccount": "Le invitamos a que cree una cuenta de usuario e inicie sesión, aunque ello no es obligatorio.",
+       "tooltip-ca-talk": "Discusión acerca del artículo",
+       "tooltip-ca-edit": "Usted puede editar esta página. Por favor, use el botón de previsualización antes de grabar.",
+       "tooltip-ca-history": "Versiones anteriores de esta página y sus autores",
+       "tooltip-ca-watch": "Añadir esta página a tu lista de seguimiento",
+       "tooltip-ca-unwatch": "Borrar esta página de su lista de seguimiento",
+       "tooltip-search": "Buscar en {{SITENAME}}",
+       "tooltip-search-fulltext": "Busca este texto en las páginas",
+       "tooltip-p-logo": "Visitar la página principal",
+       "tooltip-n-mainpage": "Visitar la página principal",
+       "tooltip-n-mainpage-description": "Visitar la página principal",
+       "tooltip-n-portal": "Acerca del proyecto, lo que usted puede hacer, dónde encontrar las cosas",
+       "tooltip-n-currentevents": "Información básica sobre acontecimientos actuales",
+       "tooltip-n-recentchanges": "Lista de cambios recientes en el wiki",
+       "tooltip-n-randompage": "Cargar una página al azar",
+       "tooltip-n-help": "El lugar para aprender",
+       "tooltip-t-whatlinkshere": "Lista de todas las páginas del wiki que enlazan aquí",
+       "tooltip-t-recentchangeslinked": "Cambios recientes en las páginas que enlazan con ésta",
+       "tooltip-t-upload": "Subir imágenes o archivos multimedia",
+       "tooltip-t-specialpages": "Lista de todas las páginas especiales",
+       "tooltip-t-print": "Versión imprimible de esta página",
+       "tooltip-t-permalink": "Enlace permanente a esta versión de la página",
+       "tooltip-ca-nstab-main": "Ver el artículo",
+       "tooltip-ca-nstab-special": "Esta es una página especial, usted no puede modificar la página en sí",
+       "tooltip-save": "Guarde sus cambios",
+       "tooltip-preview": "Vista previa de sus cambios, por favor use esto antes de guardar",
+       "tooltip-diff": "Mostrar los cambios que ha introducido en el texto.",
+       "tooltip-rollback": "«Revertir» revierte todas las ediciones del último usuario con un solo clic.",
+       "bad_image_list": "El formato es el siguiente:\n\nSolo se reconocen elementos de lista (líneas que comienzan con «*»).\nEl primer enlace de cada línea debe ser un enlace al archivo que se quiere bloquear.\nTodos los demás enlaces en la misma línea se tomarán como excepciones (es decir, páginas donde sí se puede usar el archivo).",
+       "confirmemail_body": "Alguien, probablemente usted mismo, ha registrado desde la dirección IP $1 la cuenta \"$2\" en {{SITENAME}}, utilizando esta dirección de correo.\n\nPara confirmar que esta cuenta realmente le pertenece y activar el correo en {{SITENAME}}, siga este enlace:\n\n$3\n\nSi la cuenta *no* es suya, siga este otro enlace para cancelar la confirmación de la dirección de correo:\n\n$5\n\nEl código de confirmación expirará en $4.",
+       "confirmemail_body_changed": "Alguien, probablemente usted,\nha modificado la dirección de correo electrónico asociado a la cuenta \"$2\" hacia esta en {{SITENAME}}, desde la dirección IP $1.\n\nPara confirmar que esta cuenta realmente le pertenece y reactivar las funciones de correo electrónico en {{SITENAME}}, abra este enlace en su navegador:\n\n$3\n\nSi la cuenta *no* le pertenece, sigua el siguiente enlace para cancelar la confirmación:\n\n$5\n\nEste código de confirmación expirará el $4.",
+       "deletedwhileediting": "'''Aviso''': ¡Esta página fue borrada después de que usted empezara a editar!",
+       "confirmrecreate": "El usuario [[User:$1|$1]] ([[User talk:$1|discusión]]) borró este artículo después de que usted empezara a editarlo y dio esta razón:\n: ''$2'' \nPor favor, confirme que realmente desea crear de nuevo esta página.",
+       "watchlistedit-normal-explain": "Los títulos de su lista de seguimiento se muestran debajo.\nPara eliminar un título, marque la casilla junto a él, y haga clic en ''{{int:Watchlistedit-normal-submit}}''.\nTambién puede [[Special:EditWatchlist/raw|editar la lista de en crudo]].",
+       "watchlistedit-raw-explain": "Los títulos de su lista de seguimiento se muestran debajo. Esta lista puede ser editada añadiendo o eliminando líneas de la lista;\nun título por línea.\nCuando acabe, haga clic en \"{{int:Watchlistedit-raw-submit}}\".\nTambién puede [[Special:EditWatchlist|usar el editor estándar]].",
+       "watchlistedit-raw-done": "Su lista de seguimiento ha sido actualizada.",
+       "version-license-info": "MediaWiki es software libre; usted puede redistribuírlo y/o modificarlo bajo los términos de la Licencia General Pública GNU publicada por la Fundación del Software Libre; ya sea la versión 2 de la licencia, o (a su elección) cualquier versión posterior.\n\nMediaWiki es distribuído con la esperanza de que será útil, pero SIN NINGUNA GARANTÍA; ni siquiera con la garantía implícita de COMERCIALIZACIÓN ó ADAPTACIÓN A UN PROPÓSITO PARTICULAR. Véase la Licencia Pública General GNU para mayores detalles.\n\nHa usted recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública General GNU] junto a este programa; si no es así, escriba usted a la Fundación del Software Libre, Inc., Calle Franklin 51, Quinto Piso, Boston, MA 02110-1301, EE.UU. ó [//www.gnu.org/licenses/old-licenses/gpl-2.0.html léala usted en línea].",
+       "fileduplicatesearch-summary": "Búsqueda de archivos duplicados en base a su valor hash.",
+       "specialpages": "Páginas especiales",
+       "dberr-usegoogle": "Mientras tanto puede usted probar buscando a través de Google.",
+       "htmlform-invalid-input": "Existen problemas con alguno de los datos que usted ha introducido",
+       "htmlform-select-badoption": "El valo que usted ha especificado no es una opción válida.",
+       "htmlform-int-invalid": "El valor que usted ha especificado no es un entero.",
+       "htmlform-float-invalid": "El valor que usted ha especificado no es un número.",
+       "htmlform-int-toolow": "El valor que usted ha especificado está por debajo del mínimo de $1",
+       "htmlform-int-toohigh": "El valor que usted ha especificado está por encima del máximo de $1",
+       "json-warn-trailing-comma": "$1 posterior {{PLURAL:$1|comma was|comas fueron }} retirado de JSON",
+       "json-error-unknown": "Ocurrió un problema con el código JSON. Error: $1",
+       "json-error-depth": "La profundidad máxima de la pila (en inglés stack) ha sido excedida.",
+       "json-error-ctrl-char": "Errores de caracteres de control, posiblemente codificado en manera incorrecta",
+       "json-error-syntax": "Error sintáctico",
+       "json-error-utf8": "Los caracteres UTF-8 tienen errores de formato, puede ser que la codificación es incorrecta.",
+       "json-error-recursion": "Uno o más recursiva de las referencias en valor de codificar",
+       "json-error-inf-or-nan": "Uno o más valores NAN o INF en el valor de ser codificado",
+       "json-error-unsupported-type": "Fue dado un valor de un tipo que no puede ser codificado"
+}
index 5e31873..44e43f6 100644 (file)
                        "Sophivorus",
                        "Pompilos",
                        "Igv",
-                       "Juanpabl"
+                       "Juanpabl",
+                       "AlimanRuna",
+                       "Luzcaru"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "redirectedfrom": "(Redirigido desde «$1»)",
        "redirectpagesub": "Página de redirección",
        "redirectto": "Redirige a:",
-       "lastmodifiedat": "Esta página fue modificada por última vez el $1 a las $2.",
+       "lastmodifiedat": "Se editó esta página por última vez el $1 a las $2.",
        "viewcount": "Esta página ha recibido {{PLURAL:$1|una visita|$1 visitas}}.",
        "protectedpage": "Página protegida",
        "jumpto": "Saltar a:",
        "editlink": "editar",
        "viewsourcelink": "ver código",
        "editsectionhint": "Editar sección: $1",
-       "toc": "Contenido",
+       "toc": "Sumario",
        "showtoc": "mostrar",
        "hidetoc": "ocultar",
        "collapsible-collapse": "Contraer",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Error: $1",
-       "transaction-duration-limit-exceeded": "Para evitar la creación de lentitud alta de respuesta, la transacción fue abortada porque la duración de escritura ($1) excedió el límite de $2 {{PLURAL:$2|segundo|segundos}}.\nSi estás cambiando muchos elementos a la vez, trata de hacer operaciones similares más pequeñas.",
+       "transaction-duration-limit-exceeded": "Con el fin de evitar un aumento excesivo del retardo de replicación, se anuló esta transacción porque la duración de escritura ($1) excedió el límite de $2 {{PLURAL:$2|segundo|segundos}}.\nSi estás cambiando muchos elementos a la vez, trata de hacer operaciones similares más pequeñas.",
        "laggedslavemode": "<strong>Advertencia:</strong> puede que falten las actualizaciones más recientes en esta página.",
        "readonly": "Base de datos bloqueada",
-       "enterlockreason": "Explica el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo",
+       "enterlockreason": "Proporciona el motivo del bloqueo, así como una estimación de cuándo se producirá el desbloqueo",
        "readonlytext": "Actualmente la base de datos no permite nuevas entradas u otras modificaciones, probablemente por mantenimiento rutinario, tras lo cual volverá a la normalidad.\n\nLa explicación dada por el administrador que la bloqueó fue: $1",
        "missing-article": "La base de datos no ha encontrado el texto de la página «$1» $2, cuando debería haberse hallado.\n\nLa causa de esto suele ser un ''diff'' anacrónico o un enlace al historial de una página que ha sido borrada.\n\nSi no fuera el caso, puede que hayas encontrado un fallo en el software.\n\nPor favor, informa de esto a [[Special:ListUsers/sysop|administrador]], y anota la URL actual.",
        "missingarticle-rev": "(revisión: $1)",
        "missingarticle-diff": "(diferencia: $1, $2)",
        "readonly_lag": "La base de datos se ha bloqueado automáticamente mientras sus servidores esclavos se sincronizan con el maestro.",
-       "nonwrite-api-promise-error": "El encabezado HTTP 'Promise-Non-Write-API-Action' ha sido enviado pero la petición fue hacia un módulo de escritura de la API.",
+       "nonwrite-api-promise-error": "La cabecera HTTP «Promise-Non-Write-API-Action» se ha enviado pero la petición se realizó a un módulo de escritura de la API.",
        "internalerror": "Error interno",
        "internalerror_info": "Error interno: $1",
        "internalerror-fatal-exception": "Excepción grave de tipo \"$1\"",
-       "filecopyerror": "No se ha podido copiar el archivo «$1» a «$2».",
-       "filerenameerror": "No se ha podido renombrar el archivo «$1» a «$2».",
+       "filecopyerror": "No se ha podido copiar el archivo «$1» en «$2».",
+       "filerenameerror": "No se pudo cambiar el nombre del archivo «$1» a «$2».",
        "filedeleteerror": "No se ha podido borrar el archivo «$1».",
        "directorycreateerror": "No se ha podido crear el directorio «$1».",
        "directoryreadonlyerror": "El directorio «$1» es de solo lectura.",
        "login": "Acceder",
        "login-security": "Verifica tu identidad",
        "nav-login-createaccount": "Acceder/crear cuenta",
-       "userlogin": "Acceder/crear cuenta",
-       "userloginnocreate": "Acceder",
        "logout": "Salir",
        "userlogout": "Salir",
        "notloggedin": "No has iniciado sesión",
        "userlogin-noaccount": "¿No tienes una cuenta?",
        "userlogin-joinproject": "Únete a {{SITENAME}}",
-       "nologin": "¿No tienes una cuenta? $1.",
-       "nologinlink": "Crear una cuenta",
        "createaccount": "Crear una cuenta",
-       "gotaccount": "¿Ya tienes una cuenta? $1.",
-       "gotaccountlink": "Acceder",
-       "userlogin-resetlink": "¿Olvidaste tus datos de acceso?",
        "userlogin-resetpassword-link": "¿Has olvidado tu contraseña?",
        "userlogin-helplink2": "Ayuda con el acceso",
        "userlogin-loggedin": "Ya estás {{GENDER:$1|conectado|conectada}} como $1.\nUsa el formulario de abajo para iniciar sesión como otro usuario.",
        "createaccountmail": "Utilizar una contraseña aleatoria temporal y enviarla a la dirección de correo electrónico especificada",
        "createaccountmail-help": "Puede usarse para crear una cuenta para otra persona sin revelar la contraseña.",
        "createacct-realname": "Nombre real (opcional)",
-       "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por qué estás creando otra cuenta",
        "createacct-reason-help": "Mensaje que se muestra en el registro de creación de cuentas",
        "noname": "No se ha especificado un nombre de usuario válido.",
        "loginsuccesstitle": "Has accedido",
        "loginsuccess": "<strong>Has accedido a {{SITENAME}} como «$1».</strong>",
-       "nosuchuser": "No existe ningún usuario llamado «$1».\nLos nombres de usuario son sensibles a las mayúsculas.\nRevisa tu ortografía, o [[Special:CreateAccount|crea una cuenta nueva]].",
+       "nosuchuser": "No existe ninguna cuenta llamada «$1».\nLos nombres de usuario distinguen mayúsculas y minúsculas.\nComprueba tu escritura o [[Special:CreateAccount|crea una cuenta nueva]].",
        "nosuchusershort": "No existe ningún usuario llamado «$1». Comprueba que lo has escrito correctamente.",
        "nouserspecified": "Debes especificar un nombre de usuario.",
        "login-userblocked": "No puedes iniciar sesión porque tu cuenta está bloqueada.",
        "extlink_sample": "http://www.ejemplo.com Título del enlace",
        "extlink_tip": "Enlace externo (recuerda añadir el prefijo http://)",
        "headline_sample": "Texto de encabezado",
-       "headline_tip": "Encabezado de nivel 2",
+       "headline_tip": "Título de 2.º nivel",
        "nowiki_sample": "Insertar aquí texto sin formato",
        "nowiki_tip": "Ignorar el formato wiki",
        "image_sample": "Ejemplo.jpg",
        "preview": "Previsualizar",
        "showpreview": "Mostrar previsualización",
        "showdiff": "Mostrar los cambios",
-       "blankarticle": "<strong>Aviso:</strong> estás a punto de crear una página vacía.\nSi pulsas en «{{int:savearticle}}» de nuevo, se creará la página sin ningún contenido.",
+       "blankarticle": "<strong>Aviso:</strong> estás a punto de crear una página vacía.\nSi haces clic en «$1» de nuevo, se creará la página sin ningún contenido.",
        "anoneditwarning": "<strong>Advertencia:</strong> no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición en estas condiciones. Si <strong>[$1 inicias sesión]</strong> o <strong>[$2 creas una cuenta]</strong>, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.",
        "anonpreviewwarning": "<em>No has iniciado sesión. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de esta página.</em>",
-       "missingsummary": "<strong>Atención:</strong> No has escrito un resumen de edición.\nSi haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
-       "selfredirect": "<strong>Advertencia:</strong> estás redirigiendo esta página a sí misma.\nPuede que hayas especificado erróneamente el destino de la redirección, o quizá estés editando la página equivocada. En cualquier caso, si haces clic de nuevo en \"{{int:savearticle}}\", se creará la redirección.",
+       "missingsummary": "<strong>Atención:</strong> no has escrito un resumen de edición.\nSi haces clic de nuevo en «$1» tu edición se grabará sin él.",
+       "selfredirect": "<strong>Advertencia:</strong> estás redirigiendo esta página a sí misma.\nPuede que hayas especificado erróneamente el destino de la redirección, o quizá estés editando la página equivocada. En cualquier caso, si haces clic de nuevo en \"$1\", se creará la redirección.",
        "missingcommenttext": "Escribe un comentario a continuación.",
-       "missingcommentheader": "<strong>Atención:</strong> no has escrito un asunto para este comentario.\nSi haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
+       "missingcommentheader": "<strong>Atención:</strong> no has escrito un asunto para este comentario.\nSi haces clic nuevamente en \"$1\" tu edición se grabará sin él.",
        "summary-preview": "Previsualización del resumen de edición:",
        "subject-preview": "Previsualización del asunto:",
        "previewerrortext": "Se ha producido un error al intentar la vista previa de los cambios.",
        "editingsection": "Edición de «$1» (sección)",
        "editingcomment": "Edición de «$1» (sección nueva)",
        "editconflict": "Conflicto de edición: $1",
-       "explainconflict": "Alguien ha realizado cambios en esta página desde que empezaste a editarla.\nEl cuadro de texto superior contiene el texto de la página tal como está guardado en este momento.\nTus cambios sobre la versión que editaste se muestran en el cuadro de texto inferior.\nSi quieres guardar tus cambios, has de trasladarlos al cuadro superior.\nAl pulsar «{{int:savearticle}}», se guardará <strong>solo</strong> el texto del cuadro superior.",
+       "explainconflict": "Alguien ha realizado cambios en esta página desde que empezaste a editarla.\nEl cuadro de texto superior contiene el texto de la página tal como está guardado en este momento.\nTus cambios sobre la versión que editaste se muestran en el cuadro de texto inferior.\nSi quieres guardar tus cambios, has de trasladarlos al cuadro superior.\nAl pulsar «$1», se guardará <strong>solamente</strong> el texto del cuadro superior.",
        "yourtext": "Tu texto",
        "storedversion": "Versión guardada",
        "nonunicodebrowser": "<strong>Advertencia: tu navegador no es compatible con los caracteres Unicode.</strong>\nSe ha activado un sistema de edición alternativo que te permitirá editar artículos con seguridad: los caracteres no pertenecientes al estándar ASCII aparecerán como códigos hexadecimales en el cuadro de edición.",
        "readonlywarning": "<strong>Advertencia: La base de datos ha sido bloqueada por labores de mantenimiento, así que en este momento no puedes guardar tus ediciones.</strong>\nQuizás quieras copiar y pegar tu texto en un archivo de texto y guardarlo para después.\n\nEl administrador que la bloqueó ha dado esta explicación: $1",
        "protectedpagewarning": "<strong>Advertencia: Esta página ha sido protegida para que solo puedan editarla los usuarios con permisos de administrador.</strong>\nA continuación se muestra la última entrada de registro para más información:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Esta página ha sido protegida para que solo puedan editarla los usuarios registrados.\nA continuación se muestra la última entrada de registro para más información:",
-       "cascadeprotectedwarning": "<strong>Aviso:</strong> esta página está protegida y solo los administradores pueden editarla porque está transcluida en {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} en cascada:",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> esta página está protegida y solo pueden editarla usuarios con [[Special:ListGroupRights|permisos específicos]] porque está transcluida en {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} en cascada:",
        "titleprotectedwarning": "<strong>Aviso: esta página está protegida de modo que se necesitan [[Special:ListGroupRights|permisos específicos]] para crearla.</strong>\nA continuación se muestra la última entrada del registro como referencia:",
        "templatesused": "{{PLURAL:$1|Plantilla usada|Plantillas usadas}} en esta página:",
        "templatesusedpreview": "{{PLURAL:$1|Plantilla usada|Plantillas usadas}} en esta previsualización:",
        "post-expand-template-argument-warning": "Aviso: Esta página contiene al menos un parámetro de plantilla con un tamaño de expansión demasiado grande.\nSe han descartado esos parámetros.",
        "post-expand-template-argument-category": "Páginas que contienen plantillas con parámetros descartados",
        "parser-template-loop-warning": "Se ha detectado un bucle de plantilla: [[$1]]",
+       "template-loop-category": "Páginas con bucles de plantillas",
+       "template-loop-category-desc": "Esta página contiene un bucle de plantillas, es decir, una plantilla que se llama a sí misma recursivamente.",
        "parser-template-recursion-depth-warning": "Se ha superado el límite de profundidad de la recursividad de plantillas ($1)",
        "language-converter-depth-warning": "Se ha superado el límite de profundidad del convertidor de idioma ($1)",
        "node-count-exceeded-category": "Páginas que sobrepasan la cantidad de nodos",
        "page_first": "primeras",
        "page_last": "últimas",
        "histlegend": "Selección de diferencias: marca las casillas correspondientes a las versiones a comparar y pulsa Intro o el botón de abajo.<br />\nLeyenda: <strong>({{int:cur}})</strong> = diferencias con la versión actual,\n<strong>({{int:last}})</strong> = diferencias con la versión anterior, <strong>{{int:minoreditletter}}</strong> = edición menor.",
-       "history-fieldset-title": "Buscar en el historial",
-       "history-show-deleted": "Solo eliminadas",
+       "history-fieldset-title": "Buscar revisiones",
+       "history-show-deleted": "Solo revisiones eliminadas",
        "histfirst": "primeras",
        "histlast": "últimas",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "searchprofile-advanced": "Avanzado",
        "searchprofile-articles-tooltip": "Buscar en $1",
        "searchprofile-images-tooltip": "Buscar archivos",
-       "searchprofile-everything-tooltip": "Buscar en todo el contenido (incluyendo páginas de discusión)",
+       "searchprofile-everything-tooltip": "Buscar en todo el contenido (incluidas las páginas de discusión)",
        "searchprofile-advanced-tooltip": "Buscar en espacios de nombres personalizados",
        "search-result-size": "$1 ({{PLURAL:$2|1 palabra|$2 palabras}})",
        "search-result-category-size": "{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 subcategoría|$2 subcategorías}}, {{PLURAL:$3|1 archivo|$3 archivos}})",
        "search-file-match": "(coincide con el contenido del archivo)",
        "search-suggest": "Quizás quieres buscar: $1",
        "search-rewritten": "Se muestran los resultados de $1. O busca $2.",
-       "search-interwiki-caption": "Proyectos hermanos",
+       "search-interwiki-caption": "Resultados de proyectos hermanos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(más)",
        "search-interwiki-more-results": "más resultados",
        "prefs-watchlist-edits": "Número máximo de ediciones que mostrar en la lista expandida:",
        "prefs-watchlist-edits-max": "Cantidad máxima: 1000",
        "prefs-watchlist-token": "Clave de lista de seguimiento:",
-       "prefs-misc": "Miscelánea",
+       "prefs-misc": "Varias",
        "prefs-resetpass": "Cambiar contraseña",
        "prefs-changeemail": "Cambiar o eliminar la dirección de correo electrónico",
        "prefs-setemail": "Establecer una dirección de correo electrónico",
        "prefs-help-prefershttps": "Los cambios surtirán efecto en tu próximo inicio de sesión.",
        "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": "Permisos de usuario",
        "userrights-lookup-user": "Selecciona una cuenta de usuario",
        "userrights-user-editname": "Escribe un nombre de usuario:",
        "editusergroup": "Cargar grupos de usuarios",
        "saveusergroups": "Guardar grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "userrights-groupsmember": "Miembro de:",
        "userrights-groupsmember-auto": "Miembro implícito de:",
-       "userrights-groups-help": "Usted puede alterar los grupos en que está este usuario:\n* Una casilla marcada significa que el usuario está en ese grupo.\n* Una casilla sin marcar significa que el usuario no está en ese grupo.\n* Un * indica que no se puede eliminar el grupo una vez que se han añadido o viceversa.\n* Un # indica que sólo se puede volver a poner la fecha de caducidad de este grupo; no se pueden llevar adelante.",
+       "userrights-groups-help": "Puedes cambiar los grupos en que está este usuario:\n* Una casilla marcada significa que el usuario está en ese grupo.\n* Una casilla sin marcar significa que el usuario no está en ese grupo.\n* Un * indica que no se puede eliminar el grupo una vez que se ha añadido o viceversa.\n* Un # indica que sólo se puede volver a poner la fecha de caducidad de membresía de este grupo; no se pueden llevar adelante.",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "No tienes permiso para editar permisos de usuario en otros wikis.",
        "userrights-nodatabase": "La base de datos $1 no existe o no es local.",
        "userrights-changeable-col": "Grupos que puedes cambiar",
        "userrights-unchangeable-col": "Grupos que no puedes cambiar",
+       "userrights-expiry-current": "Caduca el $1",
+       "userrights-expiry-none": "No caduca",
+       "userrights-expiry": "Caduca:",
+       "userrights-expiry-existing": "Fecha de caducidad actual: $2 a las $3",
+       "userrights-expiry-othertime": "Otro tiempo:",
        "userrights-expiry-options": "1 día:1 day,1 semana:1 week,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 año:1 year",
+       "userrights-invalid-expiry": "El tiempo de caducidad del grupo \"$1\" no es válido.",
+       "userrights-expiry-in-past": "El tiempo de caducidad del grupo \"$1\" está en el pasado.",
+       "userrights-cannot-shorten-expiry": "No puedes acortar la caducidad de las membresías del grupo «$1». Únicamente los usuarios con permisos para añadir y quitar el grupo pueden hacerlo.",
        "userrights-conflict": "¡Conflicto de cambio de los permisos de usuario! Por favor, revisa y confirma tus cambios.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "right-suppressredirect": "Trasladar páginas sin dejar redirección",
        "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-own": "Subir una nueva versión de un archivo propio",
        "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-editsemiprotected": "Editar páginas protegidas como «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "Editar el modelo de contenido de una página",
        "right-editinterface": "Editar la interfaz de usuario",
-       "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 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-viewmyprivateinfo": "Ver tu información privada (ej. correo electrónico, nombre real)",
-       "right-editmyprivateinfo": "Editar tu información privada (ej: correo electrónico, nombre real)",
+       "right-viewmywatchlist": "Ver su propia lista de seguimiento",
+       "right-editmywatchlist": "Editar su propia lista de seguimiento (algunas acciones seguirán añadiendo páginas aun sin este permiso).",
+       "right-viewmyprivateinfo": "Ver su propia información privada (ej.: correo electrónico, nombre real)",
+       "right-editmyprivateinfo": "Editar su propia información privada (ej.: correo electrónico, nombre real)",
        "right-editmyoptions": "Editar tus preferencias",
        "right-rollback": "Revertir rápidamente las ediciones del último usuario que modificó una página en particular",
        "right-markbotedits": "Marcar ediciones revertidas como ediciones de bot",
        "right-userrights": "Modificar todos los permisos de usuario",
        "right-userrights-interwiki": "Modificar los permisos de usuario en otros wikis",
        "right-siteadmin": "Bloquear y desbloquear la base de datos",
-       "right-override-export-depth": "Exportar páginas, incluyendo aquellas enlazadas hasta una profundidad de 5",
+       "right-override-export-depth": "Exportar páginas, incluidas aquellas enlazadas hasta una profundidad de 5",
        "right-sendemail": "Enviar correo electrónico a otros usuarios",
        "right-managechangetags": "Crear y (des)activar [[Special:Tags|etiquetas]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] junto con los cambios propios",
        "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-quickfilters": "Enlaces rápidos",
+       "rcfilters-savedqueries-defaultlabel": "Filtros guardados",
+       "rcfilters-savedqueries-rename": "Cambiar nombre",
+       "rcfilters-savedqueries-setdefault": "Activar por defecto",
+       "rcfilters-savedqueries-unsetdefault": "Eliminar por defecto",
+       "rcfilters-savedqueries-remove": "Eliminar",
+       "rcfilters-savedqueries-new-name-label": "Nombre",
+       "rcfilters-savedqueries-apply-label": "Crear enlace rápido",
+       "rcfilters-savedqueries-cancel-label": "Cancelar",
+       "rcfilters-savedqueries-add-new-title": "Guardar filtros como enlace rápido",
        "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-whatsthis": "¿Qué es esto?",
+       "rcfilters-filterlist-feedbacklink": "Comparte tus comentarios sobre los filtros (beta) nuevos",
+       "rcfilters-highlightbutton-title": "Resaltar los resultados",
+       "rcfilters-highlightmenu-title": "Selecciona un color",
+       "rcfilters-highlightmenu-help": "Selecciona un color para resaltar esta propiedad",
        "rcfilters-filterlist-noresults": "No se encontraron filtros",
+       "rcfilters-noresults-conflict": "No se encontraron resultados porque los criterios de búsqueda están en conflicto.",
+       "rcfilters-state-message-subset": "Este filtro no tiene ningún efecto debido a que sus resultados se incluyen con los de los siguientes: {{PLURAL:$2|filtro|filtros}} (intente destacarlo para distinguirlo): $1",
+       "rcfilters-state-message-fullcoverage": "Seleccionar todos los filtros de un grupo es lo mismo que seleccionar ninguno, por lo que este filtro no tiene efecto. El grupo incluye: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "Este filtro entra en conflicto con el siguiente nivel de Experiencia {{PLURAL:$2|filtro|filtros}}, que {{PLURAL:$2 |encuentra|encontrar}} sólo usuarios registrados: $1",
+       "rcfilters-filtergroup-authorship": "Autoría de la contribución",
+       "rcfilters-filter-editsbyself-label": "Cambios tuyos",
+       "rcfilters-filter-editsbyself-description": "Tus propias contribuciones",
+       "rcfilters-filter-editsbyother-label": "Cambios de otros",
+       "rcfilters-filter-editsbyother-description": "Todos los cambios, excepto los tuyos.",
        "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-user-experience-level-conflicts-unregistered": "Los filtros de nivel de experiencia sólo encuentran usuarios registrados, por lo que este filtro entra en conflicto con el filtro \"No registrado\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "El filtro \"No registrado\" está en conflicto con uno o más filtros de nivel de Experiencia, que solo encuentran usuarios registrados. Los filtros en conflicto están marcados en el área Filtros Activos, anterior.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Recién llegados",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Menos de 10 ediciones y 4 días de actividad.",
+       "rcfilters-filter-user-experience-level-learner-label": "Aprendices",
+       "rcfilters-filter-user-experience-level-learner-description": "Más experiencia que los «recién llegados», pero menos que los «usuarios experimentados».",
+       "rcfilters-filter-user-experience-level-experienced-label": "Usuarios experimentados",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Estado de revisión",
+       "rcfilters-filter-patrolled-label": "Patrulladas",
+       "rcfilters-filter-patrolled-description": "Ediciones marcadas como patrulladas.",
+       "rcfilters-filter-unpatrolled-label": "No patrulladas",
+       "rcfilters-filter-unpatrolled-description": "Ediciones no marcadas como patrulladas.",
        "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-watchlist": "Páginas vigiladas",
+       "rcfilters-filter-watchlist-watched-label": "En mi lista de seguimiento",
+       "rcfilters-filter-watchlist-watched-description": "Cambios en las páginas de tu lista de seguimiento.",
+       "rcfilters-filter-watchlist-watchednew-label": "Cambios nuevos en tu lista de seguimiento",
+       "rcfilters-filter-watchlist-watchednew-description": "Cambios en las páginas de tu lista de seguimiento que no has visitado desde que se produjeron los cambios.",
+       "rcfilters-filter-watchlist-notwatched-label": "No en mi lista de seguimiento",
+       "rcfilters-filter-watchlist-notwatched-description": "Todos, excepto los cambios en las páginas de tu lista de seguimiento.",
        "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-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>).",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "El filtro \"Ediciones menores\" está en conflicto con uno o más Tipos de filtros de Cambio, ya que ciertos tipos de cambio no pueden ser designados como \"menores\". Los filtros en conflicto están marcados en el área Filtros activos, anterior.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Ciertos tipos de cambio no pueden ser designados como \"menores\", por lo que este filtro entra en conflicto con los siguientes  Tipos de filtros de Cambio: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Este filtro «Tipo de cambio» entra en conflicto con el filtro «Ediciones menores». Hay ciertos tipos de cambios que no pueden denominarse «menores».",
+       "rcfilters-filtergroup-lastRevision": "Revisión actual",
+       "rcfilters-filter-lastrevision-label": "Revisión actual",
+       "rcfilters-filter-lastrevision-description": "El cambio más reciente a una página.",
+       "rcfilters-filter-previousrevision-label": "Revisiones anteriores",
+       "rcfilters-filter-previousrevision-description": "Todos los cambios que no son los más recientes cambian a una página.",
+       "rcnotefrom": "Debajo {{PLURAL:$5|aparece el cambio|aparecen los cambios}} desde <strong>$3, $4</strong> (se muestran hasta <strong>$1</strong>).",
+       "rclistfromreset": "Restablecer selección de fecha",
        "rclistfrom": "Mostrar cambios nuevos desde las $2 del $3",
        "rcshowhideminor": "$1 ediciones menores",
        "rcshowhideminor-show": "Mostrar",
        "rcshowhidecategorization": "$1 categorización de páginas",
        "rcshowhidecategorization-show": "Mostrar",
        "rcshowhidecategorization-hide": "Ocultar",
-       "rclinks": "Ver los últimos $1 cambios en los últimos $2 días.<br />$3",
+       "rclinks": "Ver los últimos $1 cambios en los últimos $2 días.",
        "diff": "dif",
        "hist": "hist",
        "hide": "Ocultar",
        "php-uploaddisabledtext": "La subida de archivos está deshabilitada en PHP.\nComprueba la opción <code>file_uploads</code>.",
        "uploadscripted": "Este archivo contiene script o código HTML que puede ser interpretado erróneamente por un navegador web.",
        "upload-scripted-pi-callback": "No se pueden cargar archivos que contengan instrucciones de procesamiento en forma de hojas de estilo XML.",
+       "upload-scripted-dtd": "No se pueden cargar archivos SVG que contengan una declaración DTD no estándar.",
        "uploaded-script-svg": "Se encontró el elemento habilitado para secuencias de órdenes «$1» en el archivo SVG cargado.",
        "uploaded-hostile-svg": "Se encontró código CSS no seguro en el elemento de estilo del archivo SVG cargado.",
        "uploaded-event-handler-on-svg": "No está permitido configurar atributos controladores de eventos <code>$1=\"$2\"</code> en los archivos SVG.",
        "backend-fail-describe": "No se pudieron cambiar los metadatos del archivo \"$1\".",
        "backend-fail-alreadyexists": "El archivo \"$1\" ya existe.",
        "backend-fail-store": "No se pudo almacenar el archivo \"$1\" en \"$2\".",
-       "backend-fail-copy": "No se pudo copiar el archivo \"$1\" a \"$2\".",
+       "backend-fail-copy": "No se ha podido copiar el archivo «$1» en «$2».",
        "backend-fail-move": "No se pudo trasladar el archivo \"$1\" a \"$2\".",
        "backend-fail-opentemp": "No se pudo crear archivo temporal.",
        "backend-fail-writetemp": "No se pudo escribir en el archivo temporal.",
        "backend-fail-closetemp": "No se pudo cerrar el archivo temporal.",
        "backend-fail-read": "No se pudo leer el archivo «$1».",
        "backend-fail-create": "No se pudo escribir el archivo \"$1\".",
-       "backend-fail-maxsize": "No se pudo escribir el archivo \"$1\" porque es mayor a {{PLURAL:$2|un byte|$2 bytes}}.",
-       "backend-fail-readonly": "El servidor (back-end) de almacenamiento \"$1\" está actualmente en estado de sólo lectura. La razón aducida es: <em>$2</em>",
-       "backend-fail-synced": "El archivo \"$1\" se encuentra en un estado incoherente dentro de los servidores (backends) de almacenamiento interno",
-       "backend-fail-connect": "No se pudo conectar al servidor (backend) de almacenamiento \"$1\".",
-       "backend-fail-internal": "Se ha producido un error desconocido en el servidor (backend) de almacenamiento \"$1\".",
-       "backend-fail-contenttype": "No se pudo determinar el tipo de contenido del archivo a guardar en \" $1 \".",
-       "backend-fail-batchsize": "El servidor (back-end) de almacenamiento ha suministrado un lote de $1 {{PLURAL:$1|operación|operaciones}} de archivo; el límite es de $2 {{PLURAL:$2|operación|operaciones}}.",
+       "backend-fail-maxsize": "No se pudo escribir el archivo «$1» porque es mayor que {{PLURAL:$2|un byte|$2 bytes}}.",
+       "backend-fail-readonly": "El sistema de almacenamiento «$1» está actualmente en modo de solo lectura. La razón aducida es: <em>$2</em>",
+       "backend-fail-synced": "El archivo «$1» se encuentra en un estado incoherente dentro de los sistemas de almacenamiento interno",
+       "backend-fail-connect": "No se pudo conectar con el sistema de almacenamiento «$1».",
+       "backend-fail-internal": "Se ha producido un error desconocido en el sistema de almacenamiento «$1».",
+       "backend-fail-contenttype": "No se pudo determinar el tipo de contenido del archivo que se debe guardar en «$1».",
+       "backend-fail-batchsize": "Se ha proporcionado al sistema de almacenamiento un lote de $1 {{PLURAL:$1|operación|operaciones}} de archivos; el límite es de $2 {{PLURAL:$2|operación|operaciones}}.",
        "backend-fail-usable": "No se pudo leer o escribir el archivo \"$1\" debido a permisos insuficientes o directorios/contenedores desaparecidos.",
-       "filejournal-fail-dbconnect": "No se pudo conectar a la base de datos del registro del sistema de almacenamiento \"$1\".",
+       "filejournal-fail-dbconnect": "No se pudo conectar con la base de datos del registro del sistema de almacenamiento «$1».",
        "filejournal-fail-dbquery": "No se pudo actualizar la base de datos del registro del sistema de almacenamiento \"$1\".",
        "lockmanager-notlocked": "No se pudo desbloquear \"$1\": no se encontraba bloqueado.",
        "lockmanager-fail-closelock": "No se pudo cerrar la referencia para el archivo de bloqueo de \"$1\".",
        "statistics-header-hooks": "Otras estadísticas",
        "statistics-articles": "Páginas de contenido",
        "statistics-pages": "Páginas",
-       "statistics-pages-desc": "Todas las páginas en el wiki, incluyendo páginas de discusión, redirecciones, etc.",
+       "statistics-pages-desc": "Todas las páginas del wiki, incluidas las páginas de discusión, redirecciones, etc.",
        "statistics-files": "Archivos subidos",
        "statistics-edits": "Ediciones en páginas desde que {{SITENAME}} fue instalado",
        "statistics-edits-average": "Promedio de ediciones por página",
        "apisandbox-request-selectformat-label": "Mostrar los datos de la petición como:",
        "apisandbox-request-format-url-label": "Cadena de consulta de la URL",
        "apisandbox-request-url-label": "URL solicitante:",
+       "apisandbox-request-json-label": "JSON de la solicitud:",
        "apisandbox-request-time": "Tiempo de solicitud: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Corrige el token y vuelve a enviar",
        "apisandbox-results-fixtoken-fail": "No fue posible recuperar el token \"$1\".",
        "listgrouprights-removegroup": "Eliminar {{PLURAL:$2|grupo|grupos}}: $1",
        "listgrouprights-addgroup-all": "Agregar todos los grupos",
        "listgrouprights-removegroup-all": "Eliminar todos los grupos",
-       "listgrouprights-addgroup-self": "Agregar {{PLURAL:$2|grupo|grupos}} a tu propia cuenta: $1",
-       "listgrouprights-removegroup-self": "Eliminar {{PLURAL:$2|grupo|grupos}} de tu propia cuenta: $1",
+       "listgrouprights-addgroup-self": "Agregar {{PLURAL:$2|grupo|grupos}} a su propia cuenta: $1",
+       "listgrouprights-removegroup-self": "Eliminar {{PLURAL:$2|grupo|grupos}} de su propia cuenta: $1",
        "listgrouprights-addgroup-self-all": "Agregar todos los grupos a tu propia cuenta",
        "listgrouprights-removegroup-self-all": "Eliminar todos los grupos de tu propia cuenta",
        "listgrouprights-namespaceprotection-header": "Restricciones del espacio de nombres",
        "enotif_body_intro_moved": "La página $1 de {{SITENAME}} ha sido trasladada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.",
        "enotif_body_intro_restored": "La página $1 de {{SITENAME}} ha sido restaurada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.",
        "enotif_body_intro_changed": "La página $1 de {{SITENAME}} ha sido cambiada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.",
-       "enotif_lastvisited": "Consulta $1 para ver todos los cambios desde tu última visita.",
-       "enotif_lastdiff": "Consulta $1 para ver este cambio.",
+       "enotif_lastvisited": "Consulta $1 para ver todos los cambios desde tu última visita",
+       "enotif_lastdiff": "Consulta $1 para ver este cambio",
        "enotif_anon_editor": "usuario anónimo $1",
        "enotif_body": "Hola, $WATCHINGUSERNAME:\n\n$PAGEINTRO $NEWPAGE\n\nResumen del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacta al editor:\ncorreo: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNo enviaremos más notificaciones si ocurre más actividad, a menos que visites esta página con la sesión iniciada. También puedes restablecer los estados de notificación para todas las páginas en tu lista de seguimiento.\n\nAtentamente, el sistema de notificaciones de {{SITENAME}}\n\n--\nPara cambiar tus ajustes de notificación por correo, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara cambiar los ajustes de tu lista de seguimiento, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara quitar la página de tu lista de seguimiento, visita\n$UNWATCHURL\n\nPara ayuda y comentarios:\n$HELPPAGE",
        "created": "creada",
        "editcomment": "El resumen de la edición fue: <em>$1</em>.",
        "revertpage": "Revertidos los cambios de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]]) a la última edición de [[User:$1|$1]]",
        "revertpage-nouser": "Revertidas las ediciones hechas por un usuario oculto a la última revisión hecha por {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Revertidas las ediciones de $1; recuperada la última versión de $2.",
+       "rollback-success": "Revertidas las ediciones de {{GENDER:$3|$1}};\nrecuperada la última versión de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertidas las ediciones de $1 hasta la última revisión de $2. [$3 Ver cambios]",
        "sessionfailure-title": "Error de sesión",
        "sessionfailure": "Parece que hay un problema con tu sesión;\nse ha cancelado esta acción como medida de precaución contra el robo de sesiones.\nVuelve a la página anterior, recárgala e inténtalo de nuevo.",
        "protect-cascadeon": "Actualmente esta página está protegida porque está transcluida en {{PLURAL:$1|la siguiente página, que tiene|las siguientes páginas, que tienen}} activada la opción de protección de cascada.\nPuedes cambiar el nivel de protección de esta página, pero no afectará a la protección de cascada.",
        "protect-default": "Permitir todos los usuarios",
        "protect-fallback": "Solo permitir usuarios con el permiso «$1»",
-       "protect-level-autoconfirmed": "Solo permitir usuarios autoconfirmados",
-       "protect-level-sysop": "Solo permitir administradores",
+       "protect-level-autoconfirmed": "Solo usuarios autoconfirmados",
+       "protect-level-sysop": "Solo administradores",
        "protect-summary-cascade": "en cascada",
        "protect-expiring": "caduca el $1 (UTC)",
        "protect-expiring-local": "caduca el $1",
        "undeleteviewlink": "ver",
        "undeleteinvert": "Invertir selección",
        "undeletecomment": "Razón:",
-       "undeletedrevisions": "{{PLURAL:$1|Una revisión restaurada|$1 revisiones restauradas}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivo|$2 archivos}} restaurados",
-       "undeletedfiles": "$1 {{PLURAL:$1|archivo restaurado|archivos restaurados}}",
        "cannotundelete": "Hubo un error en la totalidad o en parte del proceso de la restauración:\n$1",
        "undeletedpage": "<strong>Se ha restaurado $1</strong>\n\nConsulta el [[Special:Log/delete|registro de borrados]] para ver una lista de los últimos borrados y restauraciones.",
        "undelete-header": "En el [[Special:Log/delete|registro de borrados]] se listan las páginas eliminadas.",
        "sp-contributions-uploads": "subidas",
        "sp-contributions-logs": "registros",
        "sp-contributions-talk": "discusión",
-       "sp-contributions-userrights": "gestión de permisos de usuario",
+       "sp-contributions-userrights": "gestión de permisos {{GENDER:$1|del usuario|de la usuaria}}",
        "sp-contributions-blocked-notice": "Este usuario está actualmente bloqueado. La última entrada del registro de bloqueos es presentada debajo para mayor referencia:",
        "sp-contributions-blocked-notice-anon": "Esta dirección IP se encuentra actualmente bloqueada.\nA continuación se muestra la última entrada del registro de bloqueos para mayor referencia.",
        "sp-contributions-search": "Buscar contribuciones",
        "sp-contributions-username": "Dirección IP o nombre de usuario:",
-       "sp-contributions-toponly": "Solo mostrar últimas ediciones de página",
+       "sp-contributions-toponly": "Mostrar solo últimas ediciones de página",
        "sp-contributions-newonly": "Mostrar solo ediciones que son creaciones de páginas",
        "sp-contributions-hideminor": "Ocultar ediciones menores",
        "sp-contributions-submit": "Buscar",
        "unblocked-id": "Se ha eliminado el bloqueo $1",
        "unblocked-ip": "Se ha desbloqueado a [[Special:Contributions/$1|$1]].",
        "blocklist": "Usuarios bloqueados",
+       "autoblocklist": "Bloqueos automáticos",
+       "autoblocklist-submit": "Buscar",
+       "autoblocklist-legend": "Mostrar bloqueos automáticos",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Bloqueo automático local|Bloqueos automáticos locales}}",
+       "autoblocklist-empty": "La lista de bloqueos automáticos está vacía.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Otro bloqueo automático|Otros bloqueos automáticos}}",
        "ipblocklist": "Usuarios bloqueados",
        "ipblocklist-legend": "Encontrar a un usuario bloqueado",
        "blocklist-userblocks": "Ocultar bloqueos de cuenta",
        "reblock-logentry": "cambió el bloqueo para  [[$1]] con una caducidad de $2 $3",
        "blocklogtext": "Esto es un registro de acciones de bloqueo y desbloqueo de usuarios.\nLas direcciones IP bloqueadas automáticamente no aparecen aquí.\nConsulta la [[Special:BlockList|lista de bloqueos]] para ver la lista de bloqueos y prohibiciones de operar en vigor.",
        "unblocklogentry": "desbloqueó a $1",
-       "block-log-flags-anononly": "sólo anónimos",
+       "block-log-flags-anononly": "solo usuarios anónimos",
        "block-log-flags-nocreate": "desactivada la creación de cuentas",
        "block-log-flags-noautoblock": "bloqueo automático desactivado",
        "block-log-flags-noemail": "correo electrónico desactivado",
        "unblock-hideuser": "No puedes desbloquear a este usuario porque su nombre ha sido ocultado.",
        "ipb_cant_unblock": "Error: no se encuentra el identificador de bloque $1. Pudo haber sido desbloqueado ya.",
        "ipb_blocked_as_range": "Error: la dirección IP $1 no está bloqueada directamente y no puede ser desbloqueada.\nSin embargo, está bloqueada como parte del rango $2, que puede ser desbloqueado.",
-       "ip_range_invalid": "El rango de IP no es válido.",
+       "ip_range_invalid": "El intervalo de IP no es válido.",
        "ip_range_toolarge": "Los bloqueos de rango superiores a /$1 no están permitidos.",
        "proxyblocker": "Bloqueador de proxies",
        "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.",
        "tooltip-pt-mycontris": "Una lista de {{GENDER:|tus}} contribuciones",
        "tooltip-pt-anoncontribs": "Una lista de modificaciones hechas desde esta dirección IP",
        "tooltip-pt-login": "Te recomendamos iniciar sesión, aunque no es obligatorio",
+       "tooltip-pt-login-private": "Es necesario acceder a una cuenta para utilizar este wiki",
        "tooltip-pt-logout": "Salir de la sesión",
        "tooltip-pt-createaccount": "Te recomendamos crear una cuenta e iniciar sesión; sin embargo, no es obligatorio",
        "tooltip-ca-talk": "Discusión acerca de la página de contenido",
        "anonymous": "{{PLURAL:$1|Usuario anónimo|Usuarios anónimos}} de {{SITENAME}}",
        "siteuser": "{{GENDER:$1|el usuario|la usuaria}} $1 de {{SITENAME}}",
        "anonuser": "el usuario anónimo $1 de {{SITENAME}}",
-       "lastmodifiedatby": "Esta página fue modificada por última vez el $1 a las $2 por $3.",
+       "lastmodifiedatby": "$3 editó por última vez esta página el $1 a las $2.",
        "othercontribs": "Basado en el trabajo de $1.",
        "others": "otros",
        "siteusers": "{{PLURAL:$2|{{GENDER:$1|el usuario|la usuaria}}|los usuarios}} $1 de {{SITENAME}}",
        "newimages-summary": "Esta página especial muestra una galería de los últimos archivos subidos.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nombre del archivo (o una parte):",
+       "newimages-user": "Dirección IP o nombre de usuario",
        "newimages-showbots": "Mostrar cargas de bots",
        "newimages-hidepatrolled": "Ocultar las subidas verificadas",
        "noimages": "No hay nada que ver.",
-       "gallery-slideshow-toggle": "Alternar las miniaturas",
+       "gallery-slideshow-toggle": "Activar o desactivar las miniaturas",
        "ilsubmit": "Buscar",
        "bydate": "por fecha",
        "sp-newimages-showfrom": "Mostrar archivos nuevos empezando desde $2, $1",
        "confirmrecreate": "{{GENDER:$1|El usuario|La usuaria}} [[User:$1|$1]] ([[User talk:$1|discusión]]) borró esta página después de que comenzaras a editarla, por este motivo:\n: <em>$2</em>\nConfirma que realmente quieres volver a crear esta página.",
        "confirmrecreate-noreason": "{{GENDER:$1|El usuario|La usuaria}} [[User:$1|$1]] ([[User talk:$1|discusión]]) borró esta página después de que comenzaras a editarla. Confirma que realmente quieres recrear esta página.",
        "recreate": "Recrear",
+       "confirm-purge-title": "Purgar esta página",
        "confirm_purge_button": "Aceptar",
        "confirm-purge-top": "¿Limpiar la caché de esta página?",
-       "confirm-purge-bottom": "Purgar una página limpia la caché y fuerza a que aparezca la versión más actual.",
+       "confirm-purge-bottom": "Purgar una página limpia la antememoria y fuerza a que aparezca la versión más actual.",
        "confirm-watch-button": "Aceptar",
        "confirm-watch-top": "¿Añadir esta página a tu lista de seguimiento?",
        "confirm-unwatch-button": "Aceptar",
        "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-restore": "$1 {{GENDER:$2|restauró}} la página $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|restauró}} la página $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 revisión|$1 revisiones}}",
+       "restore-count-files": "{{PLURAL:$1|1 archivo|$1 archivos}}",
        "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",
        "logentry-delete-event-legacy": "$1 ha {{GENDER:$2|cambiado}} la visibilidad de eventos del registro en $3",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de los eventos del registro en $3",
        "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de las revisiones en la página $3",
        "revdelete-content-hid": "contenido ocultado",
-       "revdelete-summary-hid": "resumen de edición oculto",
+       "revdelete-summary-hid": "resumen de edición ocultado",
        "revdelete-uname-hid": "nombre de usuario ocultado",
        "revdelete-content-unhid": "contenido mostrado",
        "revdelete-summary-unhid": "resumen de edición mostrado",
        "revdelete-restricted": "restricciones para administradores aplicadas",
        "revdelete-unrestricted": "restricciones para administradores eliminadas",
        "logentry-block-block": "$1 {{GENDER:$2|bloqueó}} a {{GENDER:$4|$3}} durante un plazo de $5 $6",
-       "logentry-block-unblock": "$1 {{GENDER:$2|desbloqueó}} {{GENDER:$4|$3}}",
+       "logentry-block-unblock": "$1 {{GENDER:$2|desbloqueó}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloqueo de {{GENDER:$4|$3}} durante un plazo de $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|bloqueó}} {{GENDER:$4|$3}} durante un plazo de $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|bloqueó}} {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloqueo de {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importó}} $3 subiendo un archivo",
        "logentry-import-upload-details": "$1 {{GENDER:$2|importó}} $3 subiendo un archivo ($4 {{PLURAL:$4|revisión|revisiones}})",
        "logentry-newusers-autocreate": "Se ha {{GENDER:$2|creado}} automáticamente la cuenta de {{GENDER:$4|usuario|usuaria}} $1",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|trasladó}} las preferencias de protección de $4 a $3",
        "logentry-protect-unprotect": "$1 {{GENDER:$2|eliminó}} la protección de $3",
-       "logentry-protect-protect": "$1 {{GENDER:$2|protegió}} $3 $4",
-       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegió}} a $3 $4 [en cascada]",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protegió}} la página $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegió}} la página $3 $4 [en cascada]",
        "logentry-protect-modify": "$1 {{GENDER:$2|cambió}} el nivel de protección de $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cambió}} el nivel de protección de $3 $4 [en cascada]",
        "logentry-rights-rights": "$1 {{GENDER:$2|modificó}} los grupos a los que pertenece {{GENDER:$6|$3}}: de $4 a $5",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|actualizó}} etiquetas de la revisión $4 de la página $3 ({{PLURAL:$7|agregó}} $6; {{PLURAL:$9|eliminó}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|actualizó}} etiquetas de la entrada del registro $5 de la página $3 ({{PLURAL:$7|agregó}} $6; {{PLURAL:$9|eliminó}} $8)",
        "rightsnone": "(ninguno)",
-       "revdelete-summary": "resumen de edición",
-       "rightslogentry-temporary-group": "$1 (provisional, hasta $2)",
+       "rightslogentry-temporary-group": "$1 (temporal, hasta $2)",
        "feedback-adding": "Añadiendo comentarios a la página...",
        "feedback-back": "Volver",
        "feedback-bugcheck": "¡Perfecto! Únicamente comprueba que no sea un [$1 fallo conocido].",
        "json-error-inf-or-nan": "Hay uno o más valores «NAN» o «INF» en el valor que se codificará",
        "json-error-unsupported-type": "Se proporcionó un valor en un tipo que no se puede codificar",
        "headline-anchor-title": "Enlace a esta sección",
-       "special-characters-group-latin": "Latín",
-       "special-characters-group-latinextended": "Latín extendido",
+       "special-characters-group-latin": "Latino",
+       "special-characters-group-latinextended": "Latino ampliado",
        "special-characters-group-ipa": "AFI",
        "special-characters-group-symbols": "Símbolos",
        "special-characters-group-greek": "Griego",
-       "special-characters-group-greekextended": "Griego extendido",
+       "special-characters-group-greekextended": "Griego ampliado",
        "special-characters-group-cyrillic": "Cirílico",
        "special-characters-group-arabic": "Árabe",
-       "special-characters-group-arabicextended": "Arábico extendido",
+       "special-characters-group-arabicextended": "Árabe ampliado",
        "special-characters-group-persian": "Persa",
        "special-characters-group-hebrew": "Hebreo",
        "special-characters-group-bangla": "Bengalí",
        "special-characters-group-tamil": "Tamil",
        "special-characters-group-telugu": "Telugú",
-       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-sinhala": "Cingalés",
        "special-characters-group-gujarati": "Guyaratí",
        "special-characters-group-devanagari": "Devanagari",
        "special-characters-group-thai": "Tailandés",
-       "special-characters-group-lao": "Lao",
-       "special-characters-group-khmer": "Jemer",
+       "special-characters-group-lao": "Laosiano",
+       "special-characters-group-khmer": "Camboyano",
+       "special-characters-group-canadianaboriginal": "Silabario aborigen canadiense",
        "special-characters-title-endash": "semirraya",
        "special-characters-title-emdash": "raya",
        "special-characters-title-minus": "signo de resta",
        "mw-widgets-titleinput-description-redirect": "redirigir a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Agregar una categoría...",
        "mw-widgets-usersmultiselect-placeholder": "Agregar más...",
+       "date-range-from": "Desde la fecha:",
+       "date-range-to": "Hasta la fecha:",
        "sessionmanager-tie": "No se pueden combinar múltiples tipos de autenticación de solicitudes: $1.",
        "sessionprovider-generic": "sesiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basadas en cookies",
        "restrictionsfield-label": "Intervalos de IP permitidos:",
        "restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activarlo todo, utiliza <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisión $1",
-       "pageid": "ID de página $1"
+       "pageid": "ID de página $1",
+       "rawhtml-notallowed": "No se pueden emplear las etiquetas &lt;html&gt; si no es en las páginas normales.",
+       "gotointerwiki": "Salir de {{SITENAME}}",
+       "gotointerwiki-invalid": "El título especificado no es válido.",
+       "gotointerwiki-external": "Estás a punto de abandonar {{SITENAME}} para visitar [[$2]], un sitio web diferente.\n\n'''[$1 Continuar a $1]'''",
+       "undelete-cantedit": "No puedes deshacer el borrado de esta página porque no tienes permisos para editarla.",
+       "undelete-cantcreate": "No puedes deshacer el borrado de esta página porque no existe ninguna página con este nombre y no tienes permisos para crearla."
 }
index eb89f59..9ff9778 100644 (file)
@@ -77,9 +77,9 @@
        "tog-prefershttps": "Kasuta sisselogimisel alati turvalist ühendust",
        "underline-always": "Alati",
        "underline-never": "Mitte kunagi",
-       "underline-default": "Kujunduse või veebilehitseja vaikeväärtus",
+       "underline-default": "Kujunduse või brauseri vaikeväärtus",
        "editfont-style": "Redigeerimisala kirjatüüp:",
-       "editfont-default": "Veebilehitseja vaikesäte",
+       "editfont-default": "Brauseri vaikesäte",
        "editfont-monospace": "Püsisammuga font",
        "editfont-sansserif": "Seriifideta kiri",
        "editfont-serif": "Seriifidega kiri",
        "redirectedfrom": "(Ümber suunatud leheküljelt $1)",
        "redirectpagesub": "Ümbersuunamisleht",
        "redirectto": "Ümber suunatud lehekülje:",
-       "lastmodifiedat": "Viimane muutmine: $2, $1",
+       "lastmodifiedat": "Selle lehekülje viimane muutmine: $2, $1.",
        "viewcount": "Seda lehekülge on külastatud {{PLURAL:$1|üks kord|$1 korda}}.",
        "protectedpage": "Kaitstud lehekülg",
        "jumpto": "Mine:",
        "nstab-media": "Meedia",
        "nstab-special": "Eri",
        "nstab-project": "Projektileht",
-       "nstab-image": "Pilt",
+       "nstab-image": "Fail",
        "nstab-mediawiki": "Sõnum",
        "nstab-template": "Mall",
        "nstab-help": "Juhend",
        "virus-badscanner": "Viga konfiguratsioonis: tundmatu viirusetõrje: ''$1''",
        "virus-scanfailed": "skaneerimine ebaõnnestus (veakood $1)",
        "virus-unknownscanner": "tundmatu viirusetõrje:",
-       "logouttext": "<strong>Oled nüüd välja loginud.</strong>\n\nPane tähele, et seni, kuni sa pole veebilehitseja puhvrit tühjendanud, võidakse mõni lehekülg endiselt kuvada nii nagu oleksid ikka sisse logitud.",
+       "logouttext": "<strong>Oled nüüd välja logitud.</strong>\n\nPane tähele, et seni, kuni sa pole brauseri puhvrit tühjendanud, võidakse mõni lehekülg endiselt kuvada nii nagu oleksid ikka sisse logitud.",
        "cannotlogoutnow-title": "Praegu ei saa välja logida",
        "cannotlogoutnow-text": "Väljalogimine pole võimalik, kui kasutad $1.",
        "welcomeuser": "Tere tulemast, $1!",
        "cannotlogin-title": "Ei saa sisse logida",
        "cannotlogin-text": "Sisselogimine pole võimalik.",
        "cannotloginnow-title": "Praegu ei saa sisse logida",
-       "cannotloginnow-text": "Sisselogimine pole võimalik, kui kasutad $1.",
+       "cannotloginnow-text": "Sisselogimine pole võimalik, kui kasutusel on $1.",
        "cannotcreateaccount-title": "Ei saa kontosid luua",
        "cannotcreateaccount-text": "Kontode käsitsi loomine pole selles vikis lubatud.",
        "yourdomainname": "Sinu domeen:",
        "login": "Sisselogimine",
        "login-security": "Identsuskontroll",
        "nav-login-createaccount": "Logi sisse või registreeru kasutajaks",
-       "userlogin": "Sisselogimine või kasutajakonto loomine",
-       "userloginnocreate": "Sisselogimine",
        "logout": "Logi välja",
        "userlogout": "Väljalogimine",
        "notloggedin": "Sisse logimata",
        "userlogin-noaccount": "Kas sul pole kontot?",
        "userlogin-joinproject": "Ühine projektiga {{SITENAME}}",
-       "nologin": "Kas sul pole kontot? $1.",
-       "nologinlink": "Registreeru siin",
        "createaccount": "Konto loomine",
-       "gotaccount": "Kui sul on juba konto, '''$1'''.",
-       "gotaccountlink": "logi sisse",
-       "userlogin-resetlink": "Kas oled unustanud oma sisselogimisandmed?",
        "userlogin-resetpassword-link": "Kas unustasid parooli?",
        "userlogin-helplink2": "Sisselogimisabi",
        "userlogin-loggedin": "Oled juba sisse logitud nimega {{GENDER:$1|$1}}.\nKasuta allolevat vormi, et logida sisse teise kasutajaga.",
        "createaccountmail": "Kasuta juhuslikku parooli ja saada see määratud e-posti aadressile",
        "createaccountmail-help": "Saab kasutada konto loomiseks teisele kasutajale ilma parooli teada saamata.",
        "createacct-realname": "Pärisnimi (valikuline)",
-       "createaccountreason": "Põhjus:",
        "createacct-reason": "Põhjus",
        "createacct-reason-ph": "Miks lood teist kontot?",
        "createacct-reason-help": "Sõnum, mida näidatakse konto loomise logis",
        "login-abort-generic": "Sisselogimine ebaõnnestus – Katkestatud",
        "login-migrated-generic": "Sinu konto on migreeritud ja sinu kasutajanime pole enam selles vikis.",
        "loginlanguagelabel": "Keel: $1",
-       "suspicious-userlogout": "Sinu väljalogimiskatse nurjus, sest see näis olevat katkise veebilehitseja või puhverserveri saadetud.",
+       "suspicious-userlogout": "Sinu väljalogimiskatse nurjus, sest see näis olevat katkise brauseri või puhverserveri saadetud.",
        "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",
        "nowiki_sample": "Sisesta vormindamata tekst",
        "nowiki_tip": "Ignoreeri vikivormindust",
        "image_sample": "Näidis.jpg",
-       "image_tip": "Pilt",
+       "image_tip": "Manusfail",
        "media_sample": "Näidis.ogg",
        "media_tip": "Link failile",
        "sig_tip": "Sinu allkiri ajatempliga",
        "preview": "Eelvaade",
        "showpreview": "Näita eelvaadet",
        "showdiff": "Näita muudatusi",
-       "blankarticle": "<strong>Hoiatus:</strong> Lehekülg, mida alustad, on tühi.\nKui klõpsad uuesti \"{{int:savearticle}}\", luuakse lehekülg ilma sisuta.",
+       "blankarticle": "<strong>Hoiatus:</strong> Lehekülg, mida alustad, on tühi.\nKui klõpsad uuesti \"$1\", luuakse lehekülg ilma sisuta.",
        "anoneditwarning": "<strong>Hoiatus:</strong> Sa pole sisse logitud. Sinu IP-aadress on kõigile nähtav, kui muudatusi teed. Kui <strong>[$1 logid sisse]</strong> või <strong>[$2 lood konto]</strong>, siis teiste eeliste seas omistatakse sinu muudatused sulle kasutajanime järgi.",
        "anonpreviewwarning": "''Sa pole sisse logitud. Selle lehe redigeerimislogisse salvestatakse su IP-aadress.''",
        "missingsummary": "'''Meeldetuletus:''' Sa ei ole lisanud muudatuse resümeed.\nKui vajutad uuesti salvestamise nupule, salvestatakse muudatus ilma resümeeta.",
-       "selfredirect": "<strong>Hoiatus:</strong> Suunad selle lehekülje iseeneda juurde.\nVõimalik, et oled määranud ümbersuunamise jaoks vale sihtleheküljeks või redigeerid vale lehekülge.\nÜmbersuunamine luuakse sellest hoolimata, kui klõpsad uuesti \"{{int:savearticle}}\".",
+       "selfredirect": "<strong>Hoiatus:</strong> Suunad selle lehekülje iseeneda juurde.\nVõimalik, et oled määranud ümbersuunamise jaoks vale sihtleheküljeks või redigeerid vale lehekülge.\nÜmbersuunamine luuakse sellest hoolimata, kui klõpsad uuesti \"$1\".",
        "missingcommenttext": "Palun sisesta siit allapoole kommentaar.",
-       "missingcommentheader": "<strong>Meeldetuletus:</strong> Sa pole kirjutanud kommentaarile teemat.\nKui klõpsad uuesti \"{{int:savearticle}}\", salvestatakse su kommentaar ilma teemata.",
+       "missingcommentheader": "<strong>Meeldetuletus:</strong> Sa pole kirjutanud kommentaarile teemat.\nKui klõpsad uuesti \"$1\", salvestatakse su kommentaar ilma teemata.",
        "summary-preview": "Resümee eelvaade:",
        "subject-preview": "Resümee eelvaade:",
        "previewerrortext": "Sinu muudatuste eelvaatluse juures esines tõrge.",
        "accmailtitle": "Parool saadetud",
        "accmailtext": "Kasutajale [[User talk:$1|$1]] genereeritud juhuslik parool saadeti aadressile $2.\n\nSeda saab pärast sisselogimist muuta ''[[Special:ChangePassword|parooli muutmise]]'' leheküljel.",
        "newarticle": "(Uus)",
-       "newarticletext": "Lehekülge, kuhu link sind suunas, pole veel.\nEt lehekülg luua, alusta allolevas kastis kirjutamist (lisateave [$1 juhendist]).\nKui sattusid siia kogemata, klõpsa veebilehitseja ''tagasi''-nupule.",
+       "newarticletext": "Lehekülge, kuhu link sind suunas, pole veel.\nEt lehekülg luua, alusta allolevas kastis kirjutamist (lisateave [$1 juhendist]).\nKui sattusid siia kogemata, klõpsa brauseri ''tagasi''-nupule.",
        "anontalkpagetext": "----''See on anonüümse kasutaja arutelulehekülg. See kasutaja pole kontot loonud või ei kasuta seda. Sellepärast tuleb meil kasutaja tuvastamiseks kasutada tema IP-aadressi. Sellist IP-aadressi võib kasutada mitu kasutajat. Kui oled osutatud IP-aadressi kasutaja ning leiad, et siinsed kommentaarid ei puutu kuidagi sinusse, [[Special:CreateAccount|loo palun kasutajakonto]] või [[Special:UserLogin|logi sisse]], et sind edaspidi teiste anonüümsete kasutajatega segi ei aetaks.''",
        "noarticletext": "Käesoleval leheküljel hetkel teksti ei ole.\nVõid [[Special:Search/{{PAGENAME}}|otsida pealkirjaks olevat fraasi]] teistelt lehtedelt,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} uurida asjassepuutuvaid logisid] või [{{fullurl:{{FULLPAGENAME}}|action=edit}} puuduva lehekülje ise luua]</span>.",
        "noarticletext-nopermission": "Sellel leheküljel pole praegu teksti.\nSaad [[Special:Search/{{PAGENAME}}|otsida selle lehekülje pealkirja]] teistelt lehekülgedelt või <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} otsida seonduvatest logidest]</span>, aga sul pole õigust seda lehekülge alustada.",
        "userpage-userdoesnotexist": "Kasutajakontot \"<nowiki>$1</nowiki>\" pole olemas.\nPalun mõtle järele, kas soovid seda lehte luua või muuta.",
        "userpage-userdoesnotexist-view": "Kasutajakonto \"$1\" pole registreeritud.",
        "blocked-notice-logextract": "See kasutaja on praegu blokeeritud.\nAllpool on toodud viimane blokeerimislogi sissekanne:",
-       "clearyourcache": "<strong>Märkus:</strong> Võimalik, et pärast salvestamist tuleb muudatuste nägemiseks veebilehitseja puhver tühjendada.\n* <strong>Firefox / Safari:</strong> Hoia all <em>Shift</em>-klahvi ja klõpsa <em>Laadi uuesti</em> või vajuta kas <em>Ctrl-F5</em> või <em>Ctrl-R</em> (Macis <em>⌘-R</em>).\n* <strong>Google Chrome:</strong> Vajuta <em>Ctrl-Shift-R</em> (Macis <em>⌘-Shift-R</em>).\n* <strong>Internet Explorer:</strong> Hoia all <em>Ctrl</em>-klahvi ja klõpsa <em>Värskenda</em> või vajuta <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Mine asukohta <em>Menüü → Seaded</em> (Macis <em>Opera → Eelistused</em>) ja seejärel <em>Privaatsus ja turvalisus → Tühjenda sirvimisandmed → Puhverdatud pildid ja failid</em>.",
+       "clearyourcache": "<strong>Märkus:</strong> Võimalik, et pärast salvestamist tuleb muudatuste nägemiseks brauseri puhver tühjendada.\n* <strong>Firefox / Safari:</strong> Hoia all <em>Shift</em>-klahvi ja klõpsa <em>Laadi uuesti</em> või vajuta kas <em>Ctrl-F5</em> või <em>Ctrl-R</em> (Macis <em>⌘-R</em>).\n* <strong>Google Chrome:</strong> Vajuta <em>Ctrl-Shift-R</em> (Macis <em>⌘-Shift-R</em>).\n* <strong>Internet Explorer:</strong> Hoia all <em>Ctrl</em>-klahvi ja klõpsa <em>Värskenda</em> või vajuta <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Mine asukohta <em>Menüü → Seaded</em> (Macis <em>Opera → Eelistused</em>) ja seejärel <em>Privaatsus ja turvalisus → Tühjenda sirvimisandmed → Puhverdatud pildid ja failid</em>.",
        "usercssyoucanpreview": "'''Vihje:''' Enne salvestamist kasuta oma uue CSSi proovimiseks nuppu \"{{int:showpreview}}\".",
        "userjsyoucanpreview": "'''Vihje:''' Enne salvestamist kasuta oma uue JavaScripti proovimiseks nuppu \"{{int:showpreview}}\".",
        "usercsspreview": "'''Ära unusta, et seda versiooni sinu isiklikust stiililehest pole veel salvestatud!'''",
        "editingsection": "Muutmisel on osa leheküljest \"$1\"",
        "editingcomment": "Muutmisel on $1 (uus alaosa)",
        "editconflict": "Redigeerimiskonflikt: $1",
-       "explainconflict": "Keegi teine on muutnud seda lehekülge pärast seda, kui sina seda redigeerima hakkasid.\nÜlemine toimetamiskast sisaldab teksti viimast versiooni.\nSinu muudatused on alumises kastis.\nSul tuleb need viimasesse versiooni üle viia.\nKui klõpsad nupule \"{{int:savearticle}}\", salvestub '''ainult''' ülemises toimetamiskastis olev tekst.",
+       "explainconflict": "Keegi teine on muutnud seda lehekülge pärast seda, kui sina seda redigeerima hakkasid.\nÜlemine toimetamiskast sisaldab teksti viimast versiooni.\nSinu muudatused on alumises kastis.\nSul tuleb need viimasesse versiooni üle viia.\nKui klõpsad nupule \"$1\", salvestub '''ainult''' ülemises toimetamiskastis olev tekst.",
        "yourtext": "Sinu tekst",
        "storedversion": "Salvestatud redaktsioon",
        "nonunicodebrowser": "'''Hoiatus: Sinu brauser ei toeta Unicode'i.'''\nProbleemist möödahiilimiseks, selleks et saaksid lehekülgi turvaliselt redigeerida, näidatakse mitte-ASCII märke toimetuskastis kuueteistkümnendsüsteemi koodidena.",
        "readonlywarning": "<strong>Hoiatus: Andmebaas on lukustatud hooldustöödeks, nii et praegu ei saa parandusi salvestada.</strong>\nVõid teksti hilisemaks kasutamiseks alles hoida tekstifailina.\n\nSüsteemiadministraator, kes andmebaasi lukustas, andis järgmise selgituse: $1",
        "protectedpagewarning": "'''Hoiatus: See lehekülg on lukustatud, nii et ainult administraatori õigustega kasutajad saavad seda redigeerida.'''\nAllpool on toodud uusim logisissekanne:",
        "semiprotectedpagewarning": "'''Märkus:''' See lehekülg on lukustatud, nii et üksnes registreeritud kasutajad saavad seda muuta.\nAllpool on toodud uusim logisissekanne:",
-       "cascadeprotectedwarning": "<strong>Hoiatus:</strong> See lehekülg on nii lukustatud, et ainult administraatori õigustega kasutajad saavad seda redigeerida, sest lehekülg on osa {{PLURAL:$1|järgmisest|järgmistest}} kaskaadkaitsega {{PLURAL:$1|leheküljest|lehekülgedest}}:",
+       "cascadeprotectedwarning": "<strong>Hoiatus:</strong> See lehekülg on nii kaitstud, et ainult [[Special:ListGroupRights|teatud õigustega]] kasutajad saavad seda redigeerida, sest lehekülg on osa {{PLURAL:$1|järgmisest|järgmistest}} kaskaadkaitsega {{PLURAL:$1|leheküljest|lehekülgedest}}:",
        "titleprotectedwarning": "'''Hoiatus: See lehekülg on nii lukustatud, et selle loomiseks on tarvis [[Special:ListGroupRights|eriõigusi]].'''\nAllpool on toodud uusim logisissekanne:",
        "templatesused": "Sellel leheküljel on kasutusel {{PLURAL:$1|järgmine mall|järgmised mallid}}:",
        "templatesusedpreview": "Eelvaates {{PLURAL:$1|kasutatav mall|kasutatavad mallid}}:",
        "post-expand-template-argument-warning": "'''Hoiatus:''' See lehekülg sisaldab argumendina vähemalt üht malli, mille määratud maht on liiga suur.\nNeed argumendid on välja jäetud.",
        "post-expand-template-argument-category": "Leheküljed, kus malli argumendid on välja jäänud",
        "parser-template-loop-warning": "Mallid moodustavad tsükli: [[$1]]",
+       "template-loop-category": "Mallisilmusega leheküljed",
+       "template-loop-category-desc": "Leheküljel on mallisilmus ehk mall kutsub rekursiivselt iseend.",
        "parser-template-recursion-depth-warning": "Malli rekursiivse kasutamise limiit on ületatud ($1)",
        "language-converter-depth-warning": "Keeleteisendaja sügavuspiir ületatud ($1)",
        "node-count-exceeded-category": "Ületatud sõlmemääraga leheküljed",
        "page_first": "esimene",
        "page_last": "viimane",
        "histlegend": "Märgi versioonid, mida tahad võrrelda ja vajuta võrdlemisnupule.\nLegend: (viim) = erinevused võrreldes viimase redaktsiooniga,\n(eel) = erinevused võrreldes eelmise redaktsiooniga, P = pisimuudatus",
-       "history-fieldset-title": "Ajaloo sirvimine",
-       "history-show-deleted": "Üksnes kustutatud",
+       "history-fieldset-title": "Redaktsioonide otsimine",
+       "history-show-deleted": "Üksnes kustutatud redaktsioonid",
        "histfirst": "vanimad",
        "histlast": "uusimad",
        "historysize": "({{PLURAL:$1|1 bait|$1 baiti}})",
        "search-file-match": "(vastab faili sisule)",
        "search-suggest": "Kas mõtlesid: $1",
        "search-rewritten": "Vasted otsingule $1. Otsi selle asemel teksti $2.",
-       "search-interwiki-caption": "Sõsarprojektid",
+       "search-interwiki-caption": "Tulemused sõsarprojektidest",
        "search-interwiki-default": "Tulemused asukohast $1:",
        "search-interwiki-more": "(veel)",
        "search-interwiki-more-results": "veel tulemusi",
        "timezoneuseserverdefault": "Kasuta serveri vaikesätet ($1)",
        "timezoneuseoffset": "Muu (määra ajavahe)",
        "servertime": "Serveri aeg:",
-       "guesstimezone": "Loe aeg veebilehitsejast",
+       "guesstimezone": "Loe aeg brauserist",
        "timezoneregion-africa": "Aafrika",
        "timezoneregion-america": "Ameerika",
        "timezoneregion-antarctica": "Antarktika",
        "prefs-help-prefershttps": "See eelistus jõustub pärast järgmist sisselogimist.",
        "prefswarning-warning": "Oled teinud eelistustes muudatusi, mida pole veel salvestatud.\nKui lahkud sellelt leheküljelt ilma nupul \"$1\" klõpsamata, jäävad kehtima senised eelistused.",
        "prefs-tabs-navigation-hint": "Spikker: Kaardiloendis toodud kaartide vahel liikumiseks saad kasutada vasakut ja paremat nooleklahvi.",
-       "userrights": "Kasutajaõiguste haldus",
+       "userrights": "Kasutajaõigused",
        "userrights-lookup-user": "Kasutaja valimine",
        "userrights-user-editname": "Sisesta kasutajanimi:",
        "editusergroup": "Laadi kasutajarühmad",
        "userrights-expiry-options": "1 päev:1 day,1 nädal:1 week,1 kuu:1 month,3 kuud:3 months,6 kuud:6 months,1 aasta:1 year",
        "userrights-invalid-expiry": "Rühma \"$1\" aegumistähtaeg on vigane.",
        "userrights-expiry-in-past": "Rühma \"$1\" aegumistähtaeg on minevikus.",
-       "userrights-cannot-shorten-expiry": "Rühma \"$1\" aegumistähtaega ei saa varasemale ajale tuua. Ainult kasutajad, kellel on õigus seda rühma lisada ja eemaldada, saavad aegumistähtaegu varsemale ajale tuua.",
+       "userrights-cannot-shorten-expiry": "Rühma \"$1\" kuulumise aegumistähtaega ei saa varasemale ajale tuua. Ainult kasutajad, kellel on õigus seda rühma lisada ja eemaldada, saavad aegumistähtaegu varsemale ajale tuua.",
        "userrights-conflict": "Kasutajaõiguste muutmise konflikt! Palun vaata oma muudatused üle ja kinnita need.",
        "group": "Rühm:",
        "group-user": "Kasutajad",
        "right-createpage": "Luua lehekülgi (mis pole aruteluleheküljed)",
        "right-createtalk": "Luua arutelulehekülgi",
        "right-createaccount": "Luua uusi kasutajakontosid",
+       "right-autocreateaccount": "Automaatselt välise kasutajakontoga sisse logida",
        "right-minoredit": "Märkida muudatusi pisimuudatusteks",
        "right-move": "Teisaldada lehekülgi",
        "right-move-subpages": "Teisaldada lehekülgi koos nende alamlehtedega",
        "right-editsemiprotected": "Muuta lehekülgi kaitsetasemega \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Muuta lehekülje sisumudelit",
        "right-editinterface": "Muuta kasutajaliidest",
-       "right-editusercssjs": "Redigeerida teiste kasutajate CSS- ja JS-faile",
        "right-editusercss": "Redigeerida teiste kasutajate CSS-faile",
        "right-edituserjs": "Redigeerida teiste kasutajate JS-faile",
        "right-editmyusercss": "Redigeerida oma CSS-kasutajafaile",
        "action-createpage": "seda lehekülge luua",
        "action-createtalk": "seda arutelulehekülge luua",
        "action-createaccount": "seda kasutajakontot luua",
+       "action-autocreateaccount": "välise kasutajakontoga automaatselt sisse logida",
        "action-history": "vaadata selle lehekülje ajalugu",
        "action-minoredit": "seda muudatust pisimuudatuseks märkida",
        "action-move": "seda lehekülge teisaldada",
        "action-move-rootuserpages": "teisaldada kasutajalehekülgi",
        "action-move-categorypages": "teisaldada kategoorialehekülgi",
        "action-movefile": "seda faili teisaldada",
-       "action-upload": "seda faili üles laadida",
+       "action-upload": "faile üles laadida",
        "action-reupload": "seda olemasolevat faili üle kirjutada",
        "action-reupload-shared": "seda jagatud varamus asuvat faili üle kirjutada",
        "action-upload_by_url": "seda faili internetiaadressilt üles laadida",
        "recentchanges-legend-heading": "<strong>Seletus:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vaata ka [[Special:NewPages|uute lehekülgede loendit]])",
        "recentchanges-submit": "Näita",
+       "rcfilters-activefilters": "Aktiivsed filtrid",
+       "rcfilters-quickfilters": "Kiirlingid",
+       "rcfilters-quickfilters-placeholder": "Salvesta tööriista lemmiksätted, et neid hiljem uuesti kasutada.",
+       "rcfilters-savedqueries-defaultlabel": "Salvestatud filtrid",
+       "rcfilters-savedqueries-rename": "Nimeta ümber",
+       "rcfilters-savedqueries-setdefault": "Määra vaikefiltriteks",
+       "rcfilters-savedqueries-unsetdefault": "Tühista vaikevalik",
+       "rcfilters-savedqueries-remove": "Eemalda",
+       "rcfilters-savedqueries-new-name-label": "Nimi",
+       "rcfilters-savedqueries-apply-label": "Koosta kiirlink",
+       "rcfilters-savedqueries-cancel-label": "Loobu",
+       "rcfilters-savedqueries-add-new-title": "Salvesta filtrid kiirlingina",
+       "rcfilters-restore-default-filters": "Taasta vaikefiltrid",
+       "rcfilters-clear-all-filters": "Eemalda kõik filtrid",
+       "rcfilters-search-placeholder": "Filtri viimaseid muudatusi (sirvi või alusta tippimist)",
+       "rcfilters-invalid-filter": "Vigane filter",
+       "rcfilters-empty-filter": "Aktiivsed filtrid puuduvad. Näidatakse kogu kaastööd.",
+       "rcfilters-filterlist-title": "Filtrid",
+       "rcfilters-filterlist-whatsthis": "Mis see on?",
+       "rcfilters-filterlist-feedbacklink": "Anna uute filtrite beetaversiooni kohta tagasisidet",
+       "rcfilters-highlightbutton-title": "Tulemuste esiletõst",
+       "rcfilters-highlightmenu-title": "Vali värvus",
+       "rcfilters-highlightmenu-help": "Vali värvus, et see atribuut esile tõsta",
+       "rcfilters-filterlist-noresults": "Ei leitud ühtegi filtrit.",
+       "rcfilters-noresults-conflict": "Tulemusi ei leitud, sest otsikriteeriumid on konfliktsed.",
+       "rcfilters-state-message-subset": "See filter ei tee midagi, sest selle tulemused on kaasatud {{PLURAL:$2|järgmise laiema filtri|järgmiste laiemate filtrite}} tulemustes (tulemuste eristamiseks proovi esiletõstu): $1",
+       "rcfilters-state-message-fullcoverage": "Ühe rühma kõigi filtrite valimine on samaväärne mitte ühegi filtri valimisega, mistõttu ei tee see filter midagi. Rühmas on: $1",
+       "rcfilters-filtergroup-registration": "Registreerumine",
+       "rcfilters-filter-registered-label": "Registreerunud",
+       "rcfilters-filter-registered-description": "Sisse logitud kasutajad.",
+       "rcfilters-filter-unregistered-label": "Registreerumata",
+       "rcfilters-filter-unregistered-description": "Kasutajad, kes pole sisse logitud.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "See filter on konfliktis {{PLURAL:$2|järgmise kogemustaseme filtriga|järgmiste kogemustasemete filtritega}}, mis {{PLURAL:$2|leiab|leiavad}} ainult registreerunud kasutajaid: $1",
+       "rcfilters-filtergroup-authorship": "Kaastöö autorsus",
+       "rcfilters-filter-editsbyself-label": "Enda muudatused",
+       "rcfilters-filter-editsbyself-description": "Sinu enda muudatused.",
+       "rcfilters-filter-editsbyother-label": "Teiste muudatused",
+       "rcfilters-filter-editsbyother-description": "Kõik muudatused peale sinu enda omade.",
+       "rcfilters-filtergroup-userExpLevel": "Kogemustase (ainult registreerunud kasutajate puhul)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Kogemustaseme filtrid leiavad ainult registreerunud kasutajaid, mistõttu on see filter konfliktis filtriga \"{{int:rcfilters-filter-unregistered-label}}\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filter \"{{int:rcfilters-filter-unregistered-label}}\" on konfliktis vähemalt ühe kogemustaseme filtriga, mis leiab ainult registreerunud kasutajaid. Konfliktsed filtrid on ära märgitud ülal aktiivsete filtrite loendis.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Äsjaalustanud",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Alla 10 muudatuse või tegutsenud alla 4 päeva.",
+       "rcfilters-filter-user-experience-level-learner-label": "Tutvujad",
+       "rcfilters-filter-user-experience-level-learner-description": "Rohkem kogemust kui äsjaalustanutel, aga vähem kui kogenud kasutajatel.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Kogenud kasutajad",
+       "rcfilters-filter-user-experience-level-experienced-description": "Üle 500 muudatuse ja tegutsenud üle 30 päeva.",
+       "rcfilters-filtergroup-automated": "Automaatne kaastöö",
+       "rcfilters-filter-bots-label": "Robot",
+       "rcfilters-filter-bots-description": "Automaattööriistade tehtud muudatused.",
+       "rcfilters-filter-humans-label": "Pole robot",
+       "rcfilters-filter-humans-description": "Vahetult inimese tehtud muudatused.",
+       "rcfilters-filtergroup-reviewstatus": "Ülevaatuse seis",
+       "rcfilters-filter-patrolled-label": "Kontrollitud",
+       "rcfilters-filter-patrolled-description": "Kontrollituks märgitud muudatused.",
+       "rcfilters-filter-unpatrolled-label": "Kontrollimata",
+       "rcfilters-filter-unpatrolled-description": "Muudatused, mida pole märgitud kontrollituks.",
+       "rcfilters-filtergroup-significance": "Olulisus",
+       "rcfilters-filter-minor-label": "Pisimuudatused",
+       "rcfilters-filter-minor-description": "Muudatused, mille autor märkis pisimuudatuseks.",
+       "rcfilters-filter-major-label": "Pole pisimuudatused",
+       "rcfilters-filter-major-description": "Muudatused, mida pole märgitud pisimuudatuseks.",
+       "rcfilters-filtergroup-watchlist": "Jälgimisloendi leheküljed",
+       "rcfilters-filter-watchlist-watched-label": "Jälgimisloendis",
+       "rcfilters-filter-watchlist-watched-description": "Sinu jälgimisloendi lehekülgedel tehtud muudatused.",
+       "rcfilters-filter-watchlist-watchednew-label": "Jälgimisloendis (uued muudatused)",
+       "rcfilters-filter-watchlist-watchednew-description": "Muudatused jälgimisloendi lehekülgedel, mida sa pole pärast muudatuse tegemist külastanud.",
+       "rcfilters-filter-watchlist-notwatched-label": "Pole jälgimisloendis",
+       "rcfilters-filter-watchlist-notwatched-description": "Kõik muu peale sinu jälgimisloendi lehekülgedel tehtud muudatuste.",
+       "rcfilters-filtergroup-changetype": "Muudatuse tüüp",
+       "rcfilters-filter-pageedits-label": "Lehekülgede muutmine",
+       "rcfilters-filter-pageedits-description": "Näiteks viki sisu, arutelude ja kategooriate kirjelduste muutmine.",
+       "rcfilters-filter-newpages-label": "Lehekülgede alustamine",
+       "rcfilters-filter-newpages-description": "Muudatused, millega alustati uut lehekülge.",
+       "rcfilters-filter-categorization-label": "Kategooriamuudatused",
+       "rcfilters-filter-categorization-description": "Kirjed lehekülgede kategooriatesse lisamise ja kategooriatest eemaldamise kohta.",
+       "rcfilters-filter-logactions-label": "Logitoimingud",
+       "rcfilters-filter-logactions-description": "Näiteks administraatoritoimingud, kontode loomine, lehekülgede kustutamine ja failide üleslaadimine.",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filter \"{{int:rcfilters-filter-minor-label}}\" on konfliktis vähemalt ühe muudatuste tüübifiltriga, sest teatud tüüpi muudatusi ei saa märkida pisimuudatusteks. Konfliktsed filtrid on ära märgitud ülal aktiivsete filtrite loendis.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Teatud tüüpi muudatusi ei saa märkida pisimuudatusteks. Seetõttu on see filter konfliktis järgmiste tüübifiltritega: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "See muudatuste tüübifilter on konfliktis filtriga \"{{int:rcfilters-filter-minor-label}}\". Teatud tüüpi muudatusi ei saa märkida pisimuudatusteks.",
+       "rcfilters-filtergroup-lastRevision": "Viimane redaktsioon",
+       "rcfilters-filter-lastrevision-label": "Viimane redaktsioon",
+       "rcfilters-filter-lastrevision-description": "Muudatus, mis on leheküljel kõige viimane.",
+       "rcfilters-filter-previousrevision-label": "Varasemad redaktsioonid",
+       "rcfilters-filter-previousrevision-description": "Kõik muudatused, mis pole leheküljel kõige viimased.",
        "rcnotefrom": "Allpool on toodud {{PLURAL:$5|muudatus|muudatused}} alates: <strong>$3, kell $4</strong> (näidatakse kuni <strong>$1</strong> muudatust)",
+       "rclistfromreset": "Lähtesta kuupäeva valik",
        "rclistfrom": "Näita muudatusi alates: $3, kell $2",
        "rcshowhideminor": "Pisiparandused ($1)",
        "rcshowhideminor-show": "näita",
        "rcshowhidecategorization": "Kategoriseerimine ($1)",
        "rcshowhidecategorization-show": "näita",
        "rcshowhidecategorization-hide": "peida",
-       "rclinks": "Näita viimast $1 muudatust viimase $2 päeva jooksul<br />$3",
+       "rclinks": "Näita viimast $1 muudatust viimase $2 päeva jooksul",
        "diff": "erin",
        "hist": "ajal",
        "hide": "peida",
        "minlength1": "Failinimes peab olema vähemalt üks täht.",
        "illegalfilename": "Failinimi \"$1\" sisaldab märke, mis pole pealkirjades lubatud. Palun nimeta fail ümber ja proovi uuesti.",
        "filename-toolong": "Failinimed ei või olla pikemad kui 240 baiti.",
-       "badfilename": "Pildi nimi on muudetud. Uus nimi on \"$1\".",
+       "badfilename": "Failinimi on muudetud. Uus nimi on \"$1\".",
        "filetype-mime-mismatch": "Faililaiend \".$1\" ei vasta faili ($2) MIME tüübile.",
        "filetype-badmime": "MIME tüübiga \"$1\" faile ei ole lubatud üles laadida.",
        "filetype-bad-ie-mime": "Seda faili ei saa üles laadida, sest Internet Explorer avastaks, et selle MIME tüüp on \"$1\", mis on keelatud või võimalik ohtlik failitüüp.",
        "copyuploaddisabled": "Internetiaadressilt üleslaadimine on keelatud.",
        "uploaddisabledtext": "Faili üleslaadimine on keelatud.",
        "php-uploaddisabledtext": "Failide üleslaadmine on PHP seadetes keelatud.\nPalun vaata <code>file_uploads</code> sätet.",
-       "uploadscripted": "See fail sisaldab HTML- või skriptikoodi, mida veebilehitseja võib valesti kuvada.",
+       "uploadscripted": "See fail sisaldab HTML- või skriptikoodi, mida brauser võib valesti kuvada.",
        "upload-scripted-pi-callback": "Üles ei saa laadida faili, mis sisaldab XML-laadilehe töötluskäsku.",
+       "upload-scripted-dtd": "Üles ei saa laadida SVG-faili, mis sisaldab ebastandardset DTD-määrangut.",
        "uploaded-script-svg": "Üleslaaditud SVG-failist leiti skriptitav element \"$1\".",
        "uploaded-hostile-svg": "Üleslaaditud SVG-faili laadielemendist leiti ebaturvaline CSS.",
        "uploaded-event-handler-on-svg": "Sündmuse halduse atribuutide <code>$1=\"$2\"</code> seadmine pole SVG-failis lubatud.",
        "listfiles_search_for": "Nimeotsing:",
        "listfiles-userdoesnotexist": "Kasutajakonto \"$1\" pole registreeritud.",
        "imgfile": "fail",
-       "listfiles": "Piltide loend",
+       "listfiles": "Failide loend",
        "listfiles_thumb": "Pisipilt",
        "listfiles_date": "Kuupäev",
        "listfiles_name": "Nimi",
        "listfiles-latestversion": "Praegune versioon",
        "listfiles-latestversion-yes": "Jah",
        "listfiles-latestversion-no": "Ei",
-       "file-anchor-link": "Pilt",
+       "file-anchor-link": "Fail",
        "filehist": "Faili ajalugu",
        "filehist-help": "Klõpsa kuupäeva ja kellaaega, et näha sel ajahetkel kasutusel olnud failiversiooni.",
        "filehist-deleteall": "kustuta kõik",
        "imagelinks": "Failikasutus",
        "linkstoimage": "Sellele failile {{PLURAL:$1|viitab järgmine lehekülg|viitavad järgmised $1 leheküljed}}:",
        "linkstoimage-more": "Sellele failile viitab enam kui {{PLURAL:$1|üks lehekülg|$1 lehekülge}}.\nJärgmises loendis on näidatud ainult {{PLURAL:$1|esimene viitav lehekülg|esimesed $1 viitavat lehekülge}}.\n[[Special:WhatLinksHere/$2|Kogu loetelu]] on saadaval.",
-       "nolinkstoimage": "Sellele pildile ei viita ükski lehekülg.",
+       "nolinkstoimage": "Sellele failile ei viita ükski lehekülg.",
        "morelinkstoimage": "Vaata [[Special:WhatLinksHere/$1|veel linke]], mis sellele failile viitavad.",
        "linkstoimage-redirect": "$1 (failiümbersuunamine) $2",
        "duplicatesoffile": "{{PLURAL:$1|Järgmine fail|Järgmised $1 faili}} on selle faili {{PLURAL:$1|duplikaat|duplikaadid}} ([[Special:FileDuplicateSearch/$2|üksikasjad]]):",
        "booksources-text": "Allpool on linke teistele lehekülgedele, kus müüakse uusi ja kasutatud raamatuid. Lehekülgedel võib olla ka lisainfot raamatute kohta:",
        "booksources-invalid-isbn": "Antud ISBN-number ei ole korrektne; kontrolli algallikast kopeerides vigu.",
        "magiclink-tracking-rfc": "RFC-võlulingiga leheküljed",
+       "magiclink-tracking-rfc-desc": "Sellel leheküljel on RFC-võlulinke. Ülemineku kohta loe saidilt [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "magiclink-tracking-pmid": "PMID-võlulingiga leheküljed",
+       "magiclink-tracking-pmid-desc": "Sellel leheküljel on PMID-võlulinke. Ülemineku kohta loe saidilt [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "magiclink-tracking-isbn": "ISBN-võlulingiga leheküljed",
+       "magiclink-tracking-isbn-desc": "Sellel leheküljel on ISBN-võlulinke. Ülemineku kohta loe saidilt [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "specialloguserlabel": "Täitja:",
        "speciallogtitlelabel": "Objekt (pealkiri või {{ns:user}}:kasutajanimi):",
        "log": "Logid",
        "post-expand-template-inclusion-category-desc": "Kõigi mallide hõrendamise järel on lehekülg suurem kui <code>$wgMaxArticleSize</code>, mistõttu jäid mõned mallid hõrendamata.",
        "post-expand-template-argument-category-desc": "Malli argumendi (midagi kolmekordsete looksulgude vahel, näiteks <code>{{{Foo}}}</code>) hõrendamise järel on lehekülg suurem kui <code>$wgMaxArticleSize</code>.",
        "expensive-parserfunction-category-desc": "Lehekülg kasutab liiga palju kulukaid parserifunktsioone nagu <code>#ifexist</code>. Vaata [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit dokumentatsiooni].",
-       "broken-file-category-desc": "Leheküljel on katkine pildilink, millega manustatakse fail, mida pole olemas.",
+       "broken-file-category-desc": "Leheküljel on katkine faililink, millega manustatakse fail, mida pole olemas.",
        "hidden-category-category-desc": "Selle kategooria leheküljel on <code><nowiki>__HIDDENCAT__</nowiki></code>, mis vaikimisi ei lase näidata seda kategooriat lehekülgedel kategoorialinkide kastis.",
        "trackingcategories-nodesc": "Kirjeldus puudub.",
        "trackingcategories-disabled": "Kategooria on keelatud.",
        "emailtarget": "Saaja kasutajanime sisestamine",
        "emailusername": "Kasutajanimi:",
        "emailusernamesubmit": "Sobib",
-       "email-legend": "Saada e-kiri {{GRAMMAR:genitive|{{SITENAME}}}} kasutajale",
+       "email-legend": "E-kirja saatmine teisele {{GRAMMAR:genitive|{{SITENAME}}}} kasutajale",
        "emailfrom": "Kellelt:",
        "emailto": "Kellele:",
        "emailsubject": "Teema:",
        "emailmessage": "Sõnum:",
        "emailsend": "Saada",
-       "emailccme": "Saada mulle koopia.",
+       "emailccme": "Saada mulle selle e-kirja koopia",
        "emailccsubject": "Koopia sinu sõnumist kasutajale $1: $2",
        "emailsent": "E-kiri saadetud",
        "emailsenttext": "Sinu teade on e-kirjaga saadetud.",
        "enotif_body_intro_restored": "$2 taastas {{GRAMMAR:genitive|{{SITENAME}}}} lehekülje $1 kuupäeval $PAGEEDITDATE. Vaata lehekülje praegust redaktsiooni aadressil $3.",
        "enotif_body_intro_changed": "$2 muutis {{GRAMMAR:genitive|{{SITENAME}}}} lehekülge $1 kuupäeval $PAGEEDITDATE. Vaata lehekülje praegust redaktsiooni aadressil $3.",
        "enotif_lastvisited": "Kõigi sinu viimase külastuse järel tehtud muudatuste nägemiseks vaata: $1.",
-       "enotif_lastdiff": "Muudatus on leheküljel $1.",
+       "enotif_lastdiff": "Et seda muudatust näha, vaata: $1.",
        "enotif_anon_editor": "anonüümne kasutaja $1",
        "enotif_body": "Lugupeetud $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nRedigeerija resümee: $PAGESUMMARY $PAGEMINOREDIT\n\nRedigeerijaga ühenduse võtmine:\ne-post: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nSeni kuni sa sisselogituna seda lehekülge ei külasta, selle leheküljega seotud toimingute kohta sulle uusi teavituse e-kirju ei saadeta. Jälgimisloendis saaksid kõigi jälgitavate lehekülgedega seotud teavitussätted ka lähtestada.\n\nAbivalmilt\n{{GRAMMAR:genitive|{{SITENAME}}}} teavitussüsteem\n\n--\nE-kirjatsi saabuvate teavituste sätteid saad muuta leheküljel\n{{canonicalurl:{{#special:Preferences}}}}.\n\nOma jälgimisloendi sätete muutmiseks mine leheküljele\n{{canonicalurl:Special:Watchlist/edit}}.\n\nLehekülje kustutamiseks jälgimisloendist mine leheküljele $UNWATCHURL.\n\nTagasiside ja abi:\n$HELPPAGE",
        "created": "loonud lehekülje",
        "editcomment": "Redaktsiooni resümee oli: <em>$1</em>.",
        "revertpage": "Tühistati kasutaja [[Special:Contributions/$2|$2]] ([[User talk:$2|arutelu]]) tehtud muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].",
        "revertpage-nouser": "Tühistati peidetud kasutaja muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].",
-       "rollback-success": "Tühistati muudatused, mille tegi $1;\npöörduti tagasi viimasele muudatusele, mille tegi $2.",
+       "rollback-success": "Tühistati muudatused, mille tegi {{GENDER:$3|$1}};\npöörduti tagasi viimasele muudatusele, mille tegi {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Tühistatud kasutaja $1 tehtud muudatused;\npöördutud tagasi kasutaja $2 viimase redaktsiooni juurde. [$3 Näita muudatusi]",
        "sessionfailure-title": "Seansiviga",
        "sessionfailure": "Sinu sisselogimisseansiga näib probleem olevat.\nSee toiming on seansiärandamise vastase ettevaatusabinõuna tühistatud.\nMine tagasi eelmisele leheküljele ja taaslaadi see, seejärel proovi uuesti.",
        "undeleteviewlink": "vaata",
        "undeleteinvert": "Pööra valik teistpidi",
        "undeletecomment": "Põhjus:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|redaktsioon|redaktsiooni}} taastatud",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 redaktsioon|$1 redaktsiooni}} ja {{PLURAL:$2|1 fail|$2 faili}} taastatud",
-       "undeletedfiles": "{{PLURAL:$1|1 fail|$1 faili}} taastatud",
        "cannotundelete": "Taastamine ebaõnnestus osaliselt või täielikult:\n$1",
        "undeletedpage": "'''$1 on taastatud'''\n\n[[Special:Log/delete|Kustutamise logist]] võib leida loendi viimastest kustutamistest ja taastamistest.",
        "undelete-header": "Hiljuti kustutatud leheküljed leiad [[Special:Log/delete|kustutamislogist]].",
        "sp-contributions-uploads": "üleslaadimised",
        "sp-contributions-logs": "logid",
        "sp-contributions-talk": "arutelu",
-       "sp-contributions-userrights": "kasutajaõiguste muutmine",
+       "sp-contributions-userrights": "{{GENDER:$1|kasutajaõiguste}} haldus",
        "sp-contributions-blocked-notice": "See kasutaja on parajasti blokeeritud. Allpool on toodud kõige hilisem blokeerimislogi sissekanne:",
        "sp-contributions-blocked-notice-anon": "See IP-aadress on parajasti blokeeritud.\nAllpool on toodud viimane blokeerimislogi sissekanne:",
        "sp-contributions-search": "Kaastöö otsimine",
        "unblocked-id": "Blokeerimine $1 on lõpetatud",
        "unblocked-ip": "IP-aadressi [[Special:Contributions/$1|$1]] blokeering on eemaldatud.",
        "blocklist": "Blokeeritud kasutajad",
+       "autoblocklist": "Automaatblokeeringud",
+       "autoblocklist-submit": "Otsi",
+       "autoblocklist-legend": "Automaatblokeeringute loend",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Kohalik automaatblokeering|Kohalikud automaatblokeeringud}}",
+       "autoblocklist-empty": "Automaatblokeeringute loend on tühi.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Muu automaatblokeering|Muud automaatblokeeringud}}",
        "ipblocklist": "Blokeeritud kasutajad",
        "ipblocklist-legend": "Leia blokeeritud kasutaja",
        "blocklist-userblocks": "Peida kontod",
        "tooltip-t-permalink": "Püsilink lehekülje sellele redaktsioonile",
        "tooltip-ca-nstab-main": "Vaata sisulehekülge",
        "tooltip-ca-nstab-user": "Näita kasutaja lehte",
-       "tooltip-ca-nstab-media": "Näita pildi lehte",
+       "tooltip-ca-nstab-media": "Vaata meediafaili lehekülge",
        "tooltip-ca-nstab-special": "See on erilehekülg ja seda ei saa redigeerida.",
        "tooltip-ca-nstab-project": "Näita projekti lehte",
-       "tooltip-ca-nstab-image": "Näita pildi lehte",
+       "tooltip-ca-nstab-image": "Vaata faili lehekülge",
        "tooltip-ca-nstab-mediawiki": "Näita süsteemi sõnumit",
        "tooltip-ca-nstab-template": "Näita malli",
        "tooltip-ca-nstab-help": "Näita abilehte",
        "anonymous": "{{GRAMMAR:genitive|{{SITENAME}}}} {{PLURAL:$1|anonüümne kasutaja|anonüümsed kasutajad}}",
        "siteuser": "{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1",
        "anonuser": "{{GRAMMAR:genitive|{{SITENAME}}}} anonüümne kasutaja $1",
-       "lastmodifiedatby": "Viimati muutis lehekülge $3 $2 kell $1.",
+       "lastmodifiedatby": "Seda lehekülge muutis viimati $3 ($2, $1).",
        "othercontribs": "Põhineb järgmiste kasutajate kaastööl: $1.",
        "others": "teiste",
        "siteusers": "{{GRAMMAR:genitive|{{SITENAME}}}} {{PLURAL:$2|kasutaja|kasutajad}} $1",
        "newimages-summary": "Sellel erilehel on viimati üles laaditud failid.",
        "newimages-legend": "Filter",
        "newimages-label": "Failinimi (või selle osa):",
+       "newimages-user": "IP-aadress või kasutajanimi",
        "newimages-showbots": "Näita robotite üles laaditud faile",
        "newimages-hidepatrolled": "Peida kontrollitud failid",
-       "noimages": "Uusi pilte ei ole.",
+       "noimages": "Uued failid puuduvad.",
        "gallery-slideshow-toggle": "Lülita pisipildid ümber",
        "ilsubmit": "Otsi",
        "bydate": "kuupäeva järgi",
        "confirmemail_success": "Sinu e-posti aadress on kinnitatud\nVõid nüüd [[Special:UserLogin|sisse logida]].",
        "confirmemail_loggedin": "Sinu e-posti aadress on nüüd kinnitatud.",
        "confirmemail_subject": "{{GRAMMAR:genitive|{{SITENAME}}}} e-posti aadressi kinnitamine",
-       "confirmemail_body": "Keegi IP-aadressilt $1, ilmselt sa ise, registreeris selle e-posti aadressiga {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\".\n\nKinnitamaks, et kasutajakonto tõepoolest kuulub sulle ning et aktiveerida e-posti teenused, ava veebilehitsejas järgmine link:\n\n$3\n\nKui sa *pole* kontot registreerinud, ava järgmine link kinnituse tühistamiseks:\n\n$5\n\nKinnituskoodi aegumistähtaeg: $4.",
-       "confirmemail_body_changed": "Keegi IP-aadressilt $1, ilmselt sa ise,\nmuutis {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\" e-posti aadressiks selle aadressi.\n\nKinnitamaks, et see konto tõepoolest kuulub sulle ja e-posti teenuste taasaktiveerimiseks, ava oma veebilehitsejas järgmine link:\n\n$3\n\nKui see *pole* sinu konto, ava järgmine link\nkinnituse tühistamiseks:\n\n$5\n\nKinnituskood aegub kuupäeval $4.",
+       "confirmemail_body": "Keegi IP-aadressilt $1, ilmselt sa ise,\nregistreeris selle e-posti aadressiga {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\".\n\nKinnitamaks, et kasutajakonto tõepoolest kuulub sulle ning et aktiveerida e-posti teenused, ava brauseris järgmine link:\n\n$3\n\nKui sa *pole* kontot registreerinud, ava järgmine link,\net e-posti aadressi kinnitus tühistada:\n\n$5\n\nKinnituskoodi aegumistähtaeg: $4.",
+       "confirmemail_body_changed": "Keegi IP-aadressilt $1, ilmselt sa ise,\nmuutis {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\" e-posti aadressiks selle aadressi.\n\nKinnitamaks, et see konto tõepoolest kuulub sulle ja et e-posti teenused taasaktiveerida, ava brauseris järgmine link:\n\n$3\n\nKui see *pole* sinu konto, ava järgmine link,\net kinnitus tühistada:\n\n$5\n\nKinnituskood aegub kuupäeval $4.",
        "confirmemail_body_set": "Keegi IP-aadressilt $1, arvatavasti sina ise, on {{GRAMMAR:genitive|{{SITENAME}}}} konto \"$2\" e-posti aadressiks määranud selle aadressi.\n\nKinnitamaks, et see konto kuulub tõesti sulle ja et aktiveerida e-posti teenused, ava võrgulehitsejas järgmine link:\n\n$3\n\nKui konto *ei* kuulu sulle, kasuta e-posti aadressi kinnituse tühistamiseks järgmist linki:\n\n$5\n\nSelle kinnituskoodi aegumistähtaeg on $4.",
        "confirmemail_invalidated": "E-posti aadressi kinnitamine tühistati",
        "invalidateemail": "E-posti aadressi kinnituse tühistamine",
        "confirmrecreate": "Kasutaja [[User:$1|$1]] ([[User talk:$1|arutelu]]) kustutas lehekülje sellel ajal, kui sina seda redigeerisid. Põhjus:\n: ''$2''\nPalun kinnita, et soovid tõesti selle lehekülje taasluua.",
        "confirmrecreate-noreason": "Kasutaja [[User:$1|$1]] ([[User talk:$1|arutelu]]) kustutas selle lehekülje, pärast seda kui redigeerimist alustasid. Palun kinnita, et tahad tõesti selle lehekülje uuesti luua.",
        "recreate": "Loo uuesti",
+       "confirm-purge-title": "Lehekülje vahemälu tühjendamine",
        "confirm_purge_button": "Sobib",
        "confirm-purge-top": "Tühjenda selle lehekülje vahemälu?",
        "confirm-purge-bottom": "Toiming puhastab lehekülje vahemälu ja kuvab uusima versiooni.",
        "htmlform-date-placeholder": "AAAA-KK-PP",
        "htmlform-time-placeholder": "TT:MM:SS",
        "htmlform-datetime-placeholder": "AAAA-KK-PP TT:MM:SS",
+       "htmlform-date-invalid": "Väärtus, mille ette andsid, pole äratuntav kuupäev. Proovi kasutada vormingut AAAA-KK-PP.",
+       "htmlform-time-invalid": "Väärtus, mille ette andsid, pole äratuntav kellaaeg. Proovi kasutada vormingut TT:MM:SS.",
+       "htmlform-datetime-invalid": "Väärtus, mille ette andsid, pole äratuntav kuupäev ja kellaaeg. Proovi kasutada vormingut AAAA-KK-PP TT:MM:SS.",
+       "htmlform-date-toolow": "Väärtus, mille ette andsid, on enne varaseimat lubatud kuupäeva $1.",
+       "htmlform-date-toohigh": "Väärtus, mille ette andsid, on pärast hiliseimat lubatud kuupäeva $1.",
+       "htmlform-time-toolow": "Väärtus, mille ette andsid, on enne varaseimat lubatud kellaaega $1.",
+       "htmlform-time-toohigh": "Väärtus, mille ette andsid, on pärast hiliseimat lubatud kellaaega $1.",
+       "htmlform-datetime-toolow": "Väärtus, mille ette andsid, on enne varaseimat lubatud kuupäeva ja kellaaega $1.",
+       "htmlform-datetime-toohigh": "Väärtus, mille ette andsid, on pärast hiliseimat lubatud kuupäeva ja kellaaega $1.",
        "htmlform-title-badnamespace": "[[:$1]] pole nimeruumis \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "Pealkirja \"$1\" all ei saa lehekülge alustada.",
        "htmlform-title-not-exists": "Lehekülge $1 pole olemas.",
        "htmlform-user-not-valid": "<strong>$1</strong> pole sobiv kasutajanimi.",
        "logentry-delete-delete": "$1 {{GENDER:$2|kustutas}} lehekülje $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|kustutas}} ülekirjutamise teel ümbersuunamise $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|taastas}} lehekülje $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|taastas}} lehekülje $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|taastas}} lehekülje $3",
+       "restore-count-revisions": "{{PLURAL:$1|üks redaktsioon|$1 redaktsiooni}}",
+       "restore-count-files": "{{PLURAL:$1|üks fail|$1 faili}}",
        "logentry-delete-event": "$1 {{GENDER:$2|muutis}} leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|muutis}} leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|muutis}} leheküljel $3 logisündmuste nähtavust",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|uuendas}} leheküljel \"$3\" redaktsiooni $4 märgiseid ({{PLURAL:$7|lisatud}} $6; {{PLURAL:$9|eemaldatud}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|uuendas}} leheküljel \"$3\" logisissekande $5 märgiseid ({{PLURAL:$7|lisatud}} $6; {{PLURAL:$9|eemaldatud}} $8)",
        "rightsnone": "(puudub)",
-       "revdelete-summary": "resümee",
+       "rightslogentry-temporary-group": "$1 (ajutine, tähtaeg $2)",
        "feedback-adding": "Tagasiside lisamine leheküljele...",
        "feedback-back": "Tagasi",
        "feedback-bugcheck": "Hästi! Kontrolli vaid, ega tegu pole juba [$1 teada oleva veaga].",
        "feedback-message": "Sõnum:",
        "feedback-subject": "Teema:",
        "feedback-submit": "Saada",
-       "feedback-terms": "Mõistan, et minu kasutajaagendi andmed sisaldavad teavet minu veebilehitseja ja operatsioonisüsteemi täpse versiooni kohta ning need andmed tehakse minu tagasiside juures avalikuks.",
+       "feedback-terms": "Mõistan, et minu kasutajaagendi andmed sisaldavad teavet minu brauseri ja operatsioonisüsteemi täpse versiooni kohta ning need andmed tehakse minu tagasiside juures avalikuks.",
        "feedback-termsofuse": "Olen nõus andma tagasisidet vastavalt kasutustingimustele.",
        "feedback-thanks": "Aitäh! Sinu tagasiside on postitatud leheküljele \"[$2 $1]\".",
        "feedback-thanks-title": "Aitäh!",
        "expand_templates_preview": "Eelvaade",
        "expand_templates_preview_fail_html": "<em>Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud ja osa seansiandmeid läks kaotsi, siis on JavaScripti põhiste rünnakute vastase abinõuna eelvaade peidetud.</em>\n\n<strong>Kui see eelvaatekatse on õigustatud, proovi palun uuesti.</strong>\nKui see ikka ei tööta, proovi [[Special:UserLogout|logida välja]] ja tagasi sisse ning kontrolli, kas brauser lubab sellest võrgukohast küpsiseid.",
        "expand_templates_preview_fail_html_anon": "<em>Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud ja sa pole sisse logitud, siis on JavaScripti põhiste rünnakute vastase abinõuna eelvaade peidetud.</em>\n\n<strong>Kui see eelvaatekatse on õigustatud, [[Special:UserLogin|logi]] palun sisse ja proovi uuesti.</strong>",
+       "expand_templates_input_missing": "Sul tuleb tekst sisestada.",
        "pagelanguage": "Lehekülje keele valik",
        "pagelang-name": "Lehekülg",
        "pagelang-language": "Keel",
        "pagelang-use-default": "Kasuta vaikekeelt",
        "pagelang-select-lang": "Vali keel",
+       "pagelang-reason": "Põhjus",
+       "pagelang-submit": "Saada",
+       "pagelang-nonexistent-page": "Lehekülge $1 pole olemas.",
+       "pagelang-unchanged-language": "Lehekülje $1 keeleks on juba määratud \"$2\".",
+       "pagelang-unchanged-language-default": "Lehekülje $1 keeleks on juba määratud viki sisu vaikekeel.",
+       "pagelang-db-failed": "Andmebaasis ei õnnestunud lehekülje keelt muuta.",
        "right-pagelang": "Muuta lehekülje keelt",
        "action-pagelang": "muuta lehekülje keelt",
        "log-name-pagelang": "Keele muutmise logi",
        "special-characters-group-thai": "Tai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmeeri",
+       "special-characters-group-canadianaboriginal": "Silpmärgid (Kanada)",
        "special-characters-title-endash": "mõttekriips",
        "special-characters-title-emdash": "pikk mõttekriips",
        "special-characters-title-minus": "miinusmärk",
        "mw-widgets-dateinput-no-date": "Kuupäev valimata",
        "mw-widgets-dateinput-placeholder-day": "AAAA-KK-PP",
        "mw-widgets-dateinput-placeholder-month": "AAAA-KK",
+       "mw-widgets-mediasearch-input-placeholder": "Otsi meediafaile",
+       "mw-widgets-mediasearch-noresults": "Tulemusi ei leitud.",
        "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...",
+       "mw-widgets-usersmultiselect-placeholder": "Lisa veel...",
+       "date-range-from": "Kuupäevast:",
+       "date-range-to": "Kuupäevani:",
+       "sessionmanager-tie": "Ei saa ühitada mitut päringu autentimise tüüpi: $1.",
        "sessionprovider-generic": "klassi $1 seansse",
-       "sessionprovider-mediawiki-session-cookiesessionprovider": "küpsisepõhiseid seansse",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "küpsisepõhised seansid",
+       "sessionprovider-nocookies": "Võimalik, et küpsised on keelatud. Veendu, et sul on küpsised lubatud ja alusta uuesti.",
        "randomrootpage": "Juhuslik juurlehekülg",
        "log-action-filter-block": "Blokeeringu tüüp:",
        "log-action-filter-contentmodel": "Sisumudeli muudatuse tüüp:",
        "log-action-filter-suppress-reblock": "Kasutaja varjamine taasblokeerimise teel",
        "log-action-filter-upload-upload": "Uus üleslaadimine",
        "log-action-filter-upload-overwrite": "Uuesti üleslaadimine",
+       "authmanager-authn-not-in-progress": "Autentimine pole teoksil või seansiandmed läksid kaduma. Palun alusta uuesti.",
+       "authmanager-authn-no-primary": "Ette antud autentimisandmeid ei õnnestunud autentida.",
+       "authmanager-authn-no-local-user": "Ette antud autentimisandmed pole selles vikis seotud ühegi kasutajaga.",
+       "authmanager-authn-no-local-user-link": "Ette antud autentimisandmeid on kehtivad, aga pole selles vikis seotud ühegi kasutajaga. Logi sisse muul viisil või loo uus kasutajakonto, et saaksid siduda oma varasemad autentimisandmed selle kontoga.",
+       "authmanager-authn-autocreate-failed": "Kohaliku konto automaatne loomine ebaõnnestus: $1",
+       "authmanager-change-not-supported": "Ette antud autentimisandmeid ei õnnestunud muuta, kuna neil poleks edaspidi ühtegi kasutajat.",
+       "authmanager-create-disabled": "Kontode loomine on keelatud.",
+       "authmanager-create-from-login": "Et luua konto, täida palun väljad.",
+       "authmanager-create-not-in-progress": "Konto loomine pole teoksil või läksid seansiandmed kaduma. Palun alusta uuesti.",
+       "authmanager-create-no-primary": "Ette antud autentimisandmetega ei õnnestunud kontot luua.",
+       "authmanager-link-no-primary": "Ette antud autentimisandmetega ei õnnestunud kontot linkida.",
+       "authmanager-link-not-in-progress": "Konto linkimine pole teoksil või läksid seansiandmed kaduma. Palun alusta uuesti.",
+       "authmanager-authplugin-setpass-failed-title": "Parooli muutmine ebaõnnestus",
+       "authmanager-authplugin-setpass-failed-message": "Autentimise tarkvaralisa keeldus parooli muutmast.",
+       "authmanager-authplugin-create-fail": "Autentimise tarkvaralisa keeldus kontot loomast.",
+       "authmanager-authplugin-setpass-denied": "Autentimise tarkvaralisa ei luba paroole muuta.",
+       "authmanager-authplugin-setpass-bad-domain": "Vigane domeen.",
+       "authmanager-autocreate-noperm": "Kontode automaatne loomine pole lubatud.",
+       "authmanager-autocreate-exception": "Kontode automaatne loomine on varasemate tõrgete tõttu ajutiselt keelatud.",
+       "authmanager-userdoesnotexist": "Kasutajakonto \"$1\" pole registreeritud.",
+       "authmanager-userlogin-remembermypassword-help": "Kas parooli tuleks meeles pidada kauem kui seansi kestel.",
+       "authmanager-username-help": "Autentitav kasutajanimi.",
+       "authmanager-password-help": "Autentitav parool.",
+       "authmanager-domain-help": "Väliselt autentitav domeen.",
+       "authmanager-retype-help": "Uuesti parool, mida kinnitada.",
+       "authmanager-email-label": "E-post",
+       "authmanager-email-help": "E-posti aadress",
+       "authmanager-realname-label": "Pärisnimi",
+       "authmanager-realname-help": "Kasutaja pärisnimi",
        "authmanager-provider-password": "Paroolipõhine autentimine",
        "authmanager-provider-password-domain": "Parooli- ja domeenipõhine autentimine",
        "authmanager-provider-temporarypassword": "Ajutine parool",
+       "authprovider-confirmlink-message": "Sinu viimaste sisselogimiskatsete põhjal saab sinu vikikontoga linkida järgmiseid kontosid. Linkimine võimaldab sisse logida nende kontode kaudu. Palun vali, millised kontod tuleks linkida.",
+       "authprovider-confirmlink-request-label": "Kontod, mis tuleks linkida",
+       "authprovider-confirmlink-success-line": "$1: Edukalt lingitud.",
+       "authprovider-confirmlink-failed": "Konto linkimine ei õnnestunud täielikult: $1",
+       "authprovider-confirmlink-ok-help": "Jätka pärast linkimise nurjumissõnumite kuvamist.",
+       "authprovider-resetpass-skip-label": "Jäta vahele",
+       "authprovider-resetpass-skip-help": "Jäta parooli lähtestamine vahele.",
+       "authform-nosession-login": "Autentimine oli edukas, aga brauseril ei õnnestunud meeles pidada, et oled sisse logitud.\n\n$1",
+       "authform-nosession-signup": "Konto on loodud, aga brauseril ei õnnestunud meeles pidada, et oled sisse logitud.\n\n$1",
+       "authform-newtoken": "Luba puudub. $1",
+       "authform-notoken": "Luba puudub",
+       "authform-wrongtoken": "Vale luba",
+       "specialpage-securitylevel-not-allowed-title": "Pole lubatud",
+       "specialpage-securitylevel-not-allowed": "Kahjuks ei lubata sul seda lehekülge kasutada, kuna sinu identiteeti ei õnnestunud tõestada.",
+       "authpage-cannot-login": "Sisselogimisega ei õnnestu alustada.",
+       "authpage-cannot-login-continue": "Sisselogimisega ei õnnestu jätkata. Suure tõenäosusega on sinu seansi ajalõpp möödunud.",
+       "authpage-cannot-create": "Konto loomisega ei õnnestu alustada.",
+       "authpage-cannot-create-continue": "Konto loomisega ei õnnestu jätkata. Suure tõenäosusega on sinu seansi ajalõpp möödunud.",
+       "authpage-cannot-link": "Konto linkimisega ei õnnestu alustada.",
+       "authpage-cannot-link-continue": "Konto linkimisega ei õnnestu jätkata. Suure tõenäosusega on sinu seansi ajalõpp möödunud.",
        "changecredentials": "Autentimisandmete muutmine",
        "changecredentials-submit": "Muuda autentimisandmed",
        "changecredentials-success": "Sinu autentimisandmed on muudetud.",
        "removecredentials-success": "Sinu autentimisandmed on eemaldatud.",
        "credentialsform-provider": "Andmete tüüp:",
        "credentialsform-account": "Konto nimi:",
+       "authenticationdatachange-ignored": "Autentimisandmete muutmine jäi rahuldamata. Võimalik, et ühtegi pakkujat polnud häälestatud.",
        "userjsispublic": "Pea silmas, et JavaScripti alamleheküljed ei tohiks sisaldada konfidentsiaalseid andmeid, kuna neid näevad teised kasutajad.",
+       "usercssispublic": "Palun pane tähele: CSS-alamleheküljel ei peaks olema konfidentsiaalseid andmeid, kuna teised kasutajad näevad seda.",
        "restrictionsfield-badip": "Vigane IP-aadress või -aadressivahemik: $1",
        "restrictionsfield-label": "Lubatud IP-aadressivahemikud:",
-       "restrictionsfield-help": "Üks IP-aadress või CIDR-vahemik rea kohta. Et lubada kõik, kasuta järgmist süntaksit:<pre>0.0.0.0/0\n::/0</pre>"
+       "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>",
+       "revid": "redaktsioon $1",
+       "pageid": "lehekülje identifikaator $1",
+       "undelete-cantedit": "Sa ei saa seda lehekülge taastada, sest sul pole lubatud seda lehekülge redigeerida.",
+       "undelete-cantcreate": "Sa ei saa seda lehekülge taastada, sest sellise pealkirjaga lehekülg puudub ja sul pole lubatud seda lehekülge alustada."
 }
index f9eb200..7e9005c 100644 (file)
@@ -27,7 +27,8 @@
                        "Asierog",
                        "Matma Rex",
                        "Gorkaazk",
-                       "Vriullop"
+                       "Vriullop",
+                       "Osoitz"
                ]
        },
        "tog-underline": "Azpimarratu loturak:",
        "redirectedfrom": "($1(e)tik birzuzenduta)",
        "redirectpagesub": "Birbideratze orria",
        "redirectto": "Hona birzuzentzen du:",
-       "lastmodifiedat": "Orrialdearen azken aldaketa: $2, $1.",
+       "lastmodifiedat": "Orrialdearen azken aldaketa: $1, $2.",
        "viewcount": "Orrialde hau {{PLURAL:$1|behin|$1 aldiz}} bisitatu da.",
        "protectedpage": "Babestutako orrialdea",
        "jumpto": "Hona jo:",
        "no-null-revision": "Ezin izan da \"$1\" orrialdearen berrikuspen huts bat sortu",
        "badtitle": "Izenburu ezegokia",
        "badtitletext": "Eskatutako orri izenburua ez da baliozkoa, hutsik dago, edo gaizki lotutako hizkuntzen arteko lotura da. Baliteke izenburuetan erabili ezin den karaktereren bat edukitzea.",
+       "title-invalid-talk-namespace": "Eskatutako orriaren izenburuak agian existitzen ez den eztabaida-orri bati egiten dio erreferentzia.",
+       "title-invalid-characters": "Eskatutako orriaren izenburuak baliagarri ez diren karaktereak ditu: \"$1\".",
        "perfcached": "Hurrengo datuak katxean gordeta daude eta litekeena da guztiz eguneratuta ez egotea. Gehienez {{PLURAL:$1|emaitza 1 dago|$1 emaitza daude}} eskuragarri katxean.",
        "perfcachedts": "Hurrengo datuak katxean daude, $1 eguneratu zen azkenekoz. {{PLURAL:$4|emaitza 1 dago|$4 emaitza daude}} eskuragarri katxean.",
        "querypage-no-updates": "Orrialde honen berritzeak ez dira baimentzen. Hemen dagoen data ez da zuzenean berrituko.",
        "cannotloginnow-title": "Ezin da saioa hasi orain",
        "cannotloginnow-text": "Saioa ezin da hasi $1 erabiltzean.",
        "cannotcreateaccount-title": "Kontuak ezin dira sortu",
+       "cannotcreateaccount-text": "Wiki honetan ezin da zuzenean kontu berri bat 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": "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",
        "userlogout": "Saioa itxi",
        "notloggedin": "Saioa hasi gabe",
        "userlogin-noaccount": "Ez al duzu konturik?",
        "userlogin-joinproject": "Batu {{SITENAME}}(r)ekin",
-       "nologin": "Ez duzu erabiltzaile konturik? '''$1'''.",
-       "nologinlink": "Kontua sortu",
        "createaccount": "Kontua sortu",
-       "gotaccount": "Baduzu erabiltzaile kontua? '''$1'''.",
-       "gotaccountlink": "Hasi saioa",
-       "userlogin-resetlink": "Saioa hasteko datuak ahaztu dituzu?",
        "userlogin-resetpassword-link": "Zure pasahitza ahaztu duzu?",
        "userlogin-helplink2": "Saioa hasteko laguntza",
        "userlogin-loggedin": "Dagoeneko izena emana zaude {{GENDER:$1|$1}}.\nBeheko formularioa erabil ezazu beste erabiltzaile baten izenean sartzeko.",
+       "userlogin-reauth": "Saioa berriro hasi beharko duzu {{GENDER:$1|$1}} zarela baieztatzeko.",
        "userlogin-createanother": "Beste kontu bat sortu",
        "createacct-emailrequired": "E-posta helbidea",
        "createacct-emailoptional": "E-posta helbidea (hautazkoa)",
        "createacct-email-ph": "Sartu zure e-posta helbidea",
        "createacct-another-email-ph": "Posta elektronikoaren helbidea sartu",
        "createaccountmail": "Erabili behin-behineko pasahitz ausazko bat eta bidali agertzen den e-posta helbidera",
+       "createaccountmail-help": "Beste pertsona batentzat kontu berri bat sortzeko erabil daiteke, pasahitza ikasi gabe.",
        "createacct-realname": "Benetako izena (hautazkoa)",
-       "createaccountreason": "Arrazoia:",
        "createacct-reason": "Arrazoia",
        "createacct-reason-ph": "Zergatik ari zaren beste erabiltzaile kontu bat",
        "createacct-submit": "Kontua sortu",
        "wrongpassword": "Pasahitza ez da zuzena. Saiatu berriz.",
        "wrongpasswordempty": "Pasahitza hutsik dago. Saiatu berriz.",
        "passwordtooshort": "Pasahitzek {{PLURAL:$1|karaktere 1|$1 karaktere}} gutxienez eduki behar dituzte.",
+       "passwordtoolong": "Pasahitzak ezin dira {{PLURAL:$1|karaktere bat|$1 karaktere}} baino luzeagoak izan.",
+       "passwordtoopopular": "Ezin dira arrunki aukeratutako pasahitzak erabili. Aukera ezazu pasahitz originalago bat, mesedez.",
        "password-name-match": "Zure pasahitza ezin da zure erabiltzaile-izen bera izan.",
        "password-login-forbidden": "Erabiltzaile izen eta pasahitz hau erabiltzea debekaturik dago.",
        "mailmypassword": "Pasahitza berrezarri",
        "changepassword-throttled": "Saioa hasteko saiakera gehiegi egin berri dituzu.\nBerriro saiatu aurretik $1 itxoin, mesedez.",
        "botpasswords": "Bot pasahitzak",
        "botpasswords-disabled": "Bot pasahitzak desgaituak daude.",
+       "botpasswords-existing": "Dauden bot-en pasahitzak",
        "botpasswords-label-appid": "Bot izena:",
        "botpasswords-label-create": "Sortu",
        "botpasswords-label-update": "Eguneratu",
        "botpasswords-label-cancel": "Utzi",
        "botpasswords-label-delete": "Ezabatu",
        "botpasswords-label-resetpassword": "Pasahitza berrezarri",
+       "botpasswords-label-grants-column": "Baimenduta",
+       "botpasswords-bad-appid": "Bot horren \"$1\" izen hori ez da baliagarria.",
+       "botpasswords-insert-failed": "Ezin izan da bot \"$1\" izen hori gehitu. Dagoeneko gehituta zegoen?",
+       "botpasswords-created-title": "Botaren pasahitza sortu da",
+       "botpasswords-updated-title": "Botaren pasahitza eguneratu da",
+       "botpasswords-deleted-title": "Botaren pasahitza ezabatu da",
        "resetpass_forbidden": "Ezin dira pasahitzak aldatu",
+       "resetpass_forbidden-reason": "Ezin dira pasahitzak aldatu: $1",
        "resetpass-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
        "resetpass-submit-loggedin": "Pasahitza aldatu",
        "resetpass-submit-cancel": "Utzi",
        "changeemail-none": "(bat ere ez)",
        "changeemail-password": "Zure {{SITENAME}}ko pasahitza:",
        "changeemail-submit": "E-posta aldatu",
+       "changeemail-throttled": "Saioa hasteko saiakera gehiegi egin dituzu. Mesedez, itxaron $1 berriro saiatu aurretik.",
+       "changeemail-nochange": "Mesedez, sar ezazu beste helbide elektroniko berri bat.",
        "resettokens": "Tokenak berrezarri",
        "resettokens-no-tokens": "Ez dago tokenik berrezartzeko.",
        "resettokens-tokens": "Tokenak:",
        "search-redirect": "(«$1» orritik birbideratua)",
        "search-section": "($1 atala)",
        "search-category": "($1 kategoria)",
+       "search-file-match": "(fitxategiaren edukiarekin bat dator)",
        "search-suggest": "$1 esan nahi zenuen",
+       "search-rewritten": "\"$1\" bilaketaren emaitzak erakusten. Bestela, bila ezazu \"$2\".",
        "search-interwiki-caption": "Beste proiektuak",
        "search-interwiki-default": "$1(r)en emaitzak:",
        "search-interwiki-more": "(gehiago)",
+       "search-interwiki-more-results": "emaitza gehiago",
        "search-relatedarticle": "Erlazionatua",
        "searchrelated": "erlazionatua",
        "searchall": "guztia",
        "prefs-diffs": "Ezberdintasunak",
        "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": "Erabiltzaile-baimenak",
        "userrights-lookup-user": "Erabiltzailea aukeratu",
        "userrights-user-editname": "Erabiltzaile izena idatzi:",
        "editusergroup": "Erabiltzaile taldeak kargatu",
        "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|lankidearen}} erabiltzaile-eskubideak aldatzen",
        "userrights-editusergroup": "{{GENDER:$1|Erabiltzaile}} taldeak editatu",
+       "userrights-viewusergroup": "{{GENDER:$1|Erabiltzaile}} taldeak ikusi",
        "saveusergroups": "Erabiltzaile {{GENDER:$1|taldeak}} gorde",
        "userrights-groupsmember": "Ondorengo talde honetako kide da:",
        "userrights-groupsmember-auto": "Honen kide inplizitua:",
        "userrights-nodatabase": "$1 datubasea ez da existitzen edo ez dago lokalki.",
        "userrights-changeable-col": "Alda ditzakezun taldeak",
        "userrights-unchangeable-col": "Aldatu ezin ditzakezun taldeak",
+       "userrights-expiry-none": "Ez da iraungitzen",
+       "userrights-expiry-options": "Egun 1:Egun 1,Aste 1:Aste 1,Hilabete 1:Hilabete 1,3 hilabete:3 hilabete,6 hilabete:6 hilabete,Urte 1:Urte 1",
        "userrights-conflict": "Gatazka gertatu da erabiltzaile eskubideak aldatzean. Mesedez, berrikusi eta baieztatu zure aldaketak.",
        "group": "Taldea:",
        "group-user": "Erabiltzaileak",
        "right-editprotected": "Babestutako orrialdeak aldatu (babes jauzirik gabe)",
        "right-editsemiprotected": "Aldatu \"{{int:protect-level-autoconfirmed}}\" babesa duten orrialdeak",
        "right-editinterface": "Erabiltzailearen interfazea aldatu",
-       "right-editusercssjs": "Beste lankideen CSS eta JS fitxategiak aldatu",
        "right-editusercss": "Beste lankideen CSS fitxategiak aldatu",
        "right-edituserjs": "Beste lankideen JS fitxategiak aldatu",
        "right-editmyusercss": "Aldatu zure CSS fitxategi propioak",
        "right-sendemail": "Beste erabiltzaileei e-posta bidali",
        "grant-group-email": "E-posta bidali",
        "grant-createaccount": "Kontuak sortu",
+       "grant-createeditmovepage": "Orrialdeak sortu, aldatu eta mugitu",
        "grant-editmycssjs": "Zure CSS/JavaScript aldatu",
        "grant-editmyoptions": "Aldatu zure hobespenak",
        "grant-editmywatchlist": "Zure jarraipen zerrenda aldatu",
+       "grant-editpage": "Aldatu dauden orrialdeak",
        "grant-editprotected": "Babestutako orriak aldatu",
        "grant-patrol": "Orrietako aldaketa patruilatu",
        "grant-protect": "Orriak babestu eta babesgabetu",
+       "grant-sendemail": "Bidali mezu elektronikoa beste erabiltzailei",
+       "grant-uploadeditmovefile": "Fitxategiak igo, ordeztu eta mugitu",
        "grant-uploadfile": "Fitxategi berriak igo",
        "grant-basic": "Oinarrizko baimenak",
        "grant-viewdeleted": "Ikusi ezabatutako fitxategiak eta orriak",
        "action-viewmyprivateinfo": "zure informazio pribatua ikusi",
        "action-editmyprivateinfo": "zure informazio pribatua aldatu",
        "action-managechangetags": "Etiketak sortu eta (des)aktibatu",
+       "action-deletechangetags": "ezabatu etiketak datu-basetik",
        "nchanges": "{{PLURAL:$1|aldaketa 1|$1 aldaketa}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|azkeneko bisitatik}}",
        "enhancedrc-history": "historia",
        "recentchanges-legend-heading": "<strong>Azalpenak:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ikus, gainera, [[Special:NewPages|orri berrien zerrenda]])",
        "recentchanges-submit": "Erakutsi",
+       "rcfilters-activefilters": "Iragazki aktiboak",
+       "rcfilters-quickfilters": "Lotura azkarrak",
+       "rcfilters-savedqueries-defaultlabel": "Gordetako iragazkiak",
+       "rcfilters-savedqueries-remove": "Kendu",
+       "rcfilters-savedqueries-new-name-label": "Izena",
+       "rcfilters-savedqueries-apply-label": "Sortu lotura azkarra",
+       "rcfilters-savedqueries-cancel-label": "Utzi",
+       "rcfilters-savedqueries-add-new-title": "Gorde iragazkiak lotura azkarra gisa",
+       "rcfilters-restore-default-filters": "Leheneratu iragazki lehenetsiak",
+       "rcfilters-clear-all-filters": "Iragazki guztiak garbitu",
+       "rcfilters-search-placeholder": "Aldaketa berriak iragazi (nabigatu ala idatzi)",
        "rcfilters-filterlist-title": "Iragazkiak",
-       "rcfilters-filtergroup-authorship": "Edizioaren egiletza",
+       "rcfilters-filterlist-whatsthis": "Zer da hau?",
+       "rcfilters-highlightbutton-title": "Nabarmendu emaitzak",
+       "rcfilters-highlightmenu-title": "Hautatu kolore bat",
+       "rcfilters-filterlist-noresults": "Ez da iragazkirik aurkitu",
+       "rcfilters-filter-registered-label": "Erregistratuak",
+       "rcfilters-filter-unregistered-label": "Ez erregistratuak",
+       "rcfilters-filtergroup-authorship": "Ekarpenaren egiletza",
+       "rcfilters-filter-editsbyself-label": "Zuk egindako aldaketak",
+       "rcfilters-filter-editsbyother-label": "Besteek egindako aldaketak",
+       "rcfilters-filter-editsbyother-description": "Aldaketa guztiak norberarenak izan ezik.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Iritsiberriak",
+       "rcfilters-filter-user-experience-level-learner-label": "Ikasleak",
+       "rcfilters-filter-user-experience-level-experienced-label": "Erabiltzaile trebatuak",
+       "rcfilters-filter-user-experience-level-experienced-description": "30 eguneko jarduera eta 500 aldaketa baino gehiago.",
+       "rcfilters-filtergroup-automated": "Automatizatutako ekarpenak",
        "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Tresna automatizatuekin egindako aldaketak.",
+       "rcfilters-filter-humans-label": "Gizaki (ez bot)",
+       "rcfilters-filter-humans-description": "Gizaki editoreek egindako aldaketak.",
+       "rcfilters-filtergroup-reviewstatus": "Berrikuspenaren egoera",
+       "rcfilters-filtergroup-significance": "Munta",
        "rcfilters-filter-minor-label": "Aldaketa txikiak",
+       "rcfilters-filter-major-label": "Aldaketa ez Txikiak",
+       "rcfilters-filter-watchlist-watched-label": "Jarraipen-zerrendan",
+       "rcfilters-filtergroup-changetype": "Aldaketa mota",
+       "rcfilters-filter-pageedits-label": "Orrialde aldaketak",
+       "rcfilters-filter-newpages-label": "Orrialde berriak",
+       "rcfilters-filter-categorization-label": "Kategoria aldaketak",
+       "rcfilters-filter-logactions-label": "Erregistratutako ekintzak",
+       "rcfilters-filtergroup-lastRevision": "Azken berrikuspena",
+       "rcfilters-filter-lastrevision-label": "Azken berrikuspena",
+       "rcfilters-filter-lastrevision-description": "Orrialde bati eginiko aldaketarik berriena.",
+       "rcfilters-filter-previousrevision-label": "Aurreko berrikuspenak",
        "rcnotefrom": "Jarraian azaltzen diren {{PLURAL:$5|aldaketak}} data honetatik aurrerakoak dira: <strong>$3,$4</strong> (gehienez <b>$1</b> erakusten dira).",
        "rclistfrom": "Erakutsi $3 $2 ondorengo aldaketa berriak",
        "rcshowhideminor": "$1 aldaketa txikiak",
        "rcshowhidecategorization": "orrialde baten kategorizazioa $1",
        "rcshowhidecategorization-show": "Erakutsi",
        "rcshowhidecategorization-hide": "Ezkutatu",
-       "rclinks": "Erakutsi azken $2 egunetako $1 aldaketak<br />$3",
+       "rclinks": "Erakutsi azken $2 egunetako $1 aldaketak",
        "diff": "ezb",
        "hist": "hist",
        "hide": "Ezkutatu",
        "recentchangeslinked-page": "Orriaren izena:",
        "recentchangeslinked-to": "Lotutako orrietarako aldaketak erakutsi emandako orriaren ordez",
        "recentchanges-page-added-to-category": "[[:$1]] Kategoriara gehitua",
+       "recentchanges-page-removed-from-category": "[[:$1]] kategoriatik kendu da",
        "autochange-username": "MediaWiki aldaketa automatikoa",
        "upload": "Fitxategia igo",
        "uploadbtn": "Fitxategia igo",
        "uploaddisabledtext": "Fitxategiak igotzea ezgaituta dago.",
        "php-uploaddisabledtext": "Fitxategi igoerak PHP-n ezinduta daude. Ikusi fitxategi_igoerak mesedez.",
        "uploadscripted": "Fitxategi honek web zerbitzariak modu ezegokian interpretatu lezakeen HTML edo script kodea dauka.",
+       "uploadinvalidxml": "Ezin izan da analizatu XMLa igotako fitxategian.",
        "uploadvirus": "Fitxategiak birusa dauka! Xehetasunak: $1",
        "uploadjava": "Fitxategia ZIP bat da eta Java .class fitxategi bat du.\nJava fitxategiak igotzea ez dago baimendua, segurtasun muga batzuk hausteko aukera ematen duelako.",
        "upload-source": "Jatorrizko fitxategia",
        "protectedpages-performer": "Erabiltzailea babesten",
        "protectedpages-params": "Babesaren parametroak",
        "protectedpages-reason": "Arrazoia",
+       "protectedpages-submit": "Erakutsi orriak",
        "protectedpages-unknown-timestamp": "Ezezaguna",
        "protectedpages-unknown-performer": "Erabiltzaile ezezaguna",
        "protectedtitles": "Babestutako tituluak",
        "apihelp": "API laguntza",
        "apihelp-no-such-module": "Ez da \"$1\" modulua aurkitu.",
        "apisandbox": "API proba orria",
+       "apisandbox-fullscreen": "Zabaldu panela",
        "apisandbox-unfullscreen": "Erakutsi orria",
        "apisandbox-submit": "Egin eskaera",
        "apisandbox-reset": "Garbitu",
        "apisandbox-retry": "Saiatu berriro",
+       "apisandbox-no-parameters": "API modulu honek ez du parametrorik.",
        "apisandbox-helpurls": "Laguntza estekak",
        "apisandbox-examples": "Adibideak",
        "apisandbox-dynamic-parameters": "Parametro gehigarriak",
        "apisandbox-dynamic-parameters-add-placeholder": "Parametroaren izena",
        "apisandbox-dynamic-error-exists": "$1 parametro izena dagoeneko existitzen da",
        "apisandbox-results": "Emaitzak",
+       "apisandbox-sending-request": "APIari eskaera bidaltzen...",
+       "apisandbox-loading-results": "APIaren emaitzak jasotzen...",
        "apisandbox-continue": "Jarraitu",
        "apisandbox-continue-clear": "Garbitu",
+       "apisandbox-multivalue-all-values": "$1 (balio guztiak)",
        "booksources": "Iturri liburuak",
        "booksources-search-legend": "Liburuen bilaketa",
        "booksources-search": "Bilatu",
        "booksources-text": "Jarraian liburu berri eta erabiliak saltzen dituzten guneetarako loturen zerrenda bat ikus dezakezu, bilatzen ari zaren liburu horientzako informazio gehigarria aurkitzeko lagungarria izan daitekeena:",
        "booksources-invalid-isbn": "Badirudi emandako ISBNa ez dela baliagarria; egiazta ezazu ea akatsik egin duzun jatorrizko iturritik kopiatzean.",
+       "magiclink-tracking-rfc": "RFC lotura magikoak dituzten orrialdeak",
+       "magiclink-tracking-pmid": "PMID lotura magikoak dituzten orrialdeak",
+       "magiclink-tracking-isbn": "ISBN lotura magikoak dituzten orrialdeak",
        "specialloguserlabel": "Egilea:",
        "speciallogtitlelabel": "Helburua (izenburua edo {{ns:user}}: lankidea):",
        "log": "Erregistroak",
        "checkbox-select": "Aukeratu:$1",
        "checkbox-all": "Denak",
        "checkbox-none": "Bat ere ez",
+       "checkbox-invert": "Alderantzikatu",
        "allpages": "Orri guztiak",
        "nextpage": "Hurrengo orrialdea ($1)",
        "prevpage": "Aurreko orrialdea ($1)",
        "activeusers": "Lankide aktiboen zerrenda",
        "activeusers-count": "{{PLURAL:$1|Ekintza berri bat|$1 ekintza berri}} azken {{PLURAL:$3|egunean|$3 egunetan}}",
        "activeusers-from": "Bilatu honela hasten diren lankideak:",
+       "activeusers-groups": "Erakutsi kategoria hauetako erabiltzaileak:",
+       "activeusers-excludegroups": "Alde batera utzi kategoria hauetako erabiltzaileak:",
        "activeusers-noresult": "Ez da lankiderik aurkitu.",
+       "activeusers-submit": "Erakutsi erabiltzaile aktiboak",
        "listgrouprights": "Erabiltzaile talde eskumenak",
        "listgrouprights-summary": "Ondorengo zerrendak wikian dauden lankide taldeak agertzen dira, beraien eskubideekin.\nBadago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako eskubideei buruz.",
        "listgrouprights-key": "Legenda\n* <span class=\"listgrouprights-granted\">Eskubidea emanda</span>\n* <span class=\"listgrouprights-revoked\">Eskubidea kenduta</span>",
        "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.",
+       "enotif_lastdiff": "Aldaketa hau ikusteko, ikus $1.",
        "enotif_anon_editor": "$1 erabiltzaile anonimoa",
        "enotif_body": "Kaixo $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n\nEgilearen laburpena: $PAGESUMMARY $PAGEMINOREDIT\n\nEgilearekin harremanetan jarri:\nposta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nEz dira oharpen gehiago bidaliko orrialde hau berriz bisitatzen ez baduzu izena emanda zaudela.\nHorrez gain, orrialdeen oharpen konfigurazioa leheneratu dezakezu jarraipen zerrendatik.\n\n             Adeitasunez {{SITENAME}}(e)ko oharpen sistema\n\n--\nZure epostaren jakinarazpenen konfigurazioa aldatzeko, ikus\n{{canonicalurl:{{#special:Preferences}}}}\n\nZure jarraipen zerrendako konfigurazioa aldatzeko, ikus\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nOrrialdea zure jarraipen zerrendatik ezabatzeko, ikus\n$UNWATCHURL\n\nLaguntza:\n$HELPPAGE",
        "created": "sortu",
        "deletepage": "Orrialdea ezabatu",
        "confirm": "Baieztatu",
        "excontent": "edukia hau zen: '$1'",
-       "excontentauthor": "edukia hau zen: \"$1\" (parte hartu duen lankide bakarra: \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
+       "excontentauthor": "edukia hau zen: \"$1\", eta parte hartu duen lankide bakarra: \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|eztabaida]])",
        "exbeforeblank": "hustu aurreko edukiera: '$1'",
        "delete-confirm": "\"$1\" ezabatu",
        "delete-legend": "Ezabatu",
-       "historywarning": "'''Oharra:''' Ezabatzera zoazen orrialdeak $1 {{PLURAL:$1|berrikuspen du|berrikuspen ditu}} gutxi gorabehera:",
+       "historywarning": "<strong>Oharra:</strong> Ezabatzera zoazen orrialdeak {{PLURAL:$1|berrikuspen bateko|$1 berrikuspeneko}} historia du:",
        "historyaction-submit": "Erakutsi",
        "confirmdeletetext": "Orrialde edo irudi bat eta beste historia guztia datu-basetik ezabatzear zaude. Mesedez, egiaztatu hori egin nahi duzula, ondorioak zeintzuk diren badakizula, eta [[{{MediaWiki:Policy-url}}|politikak]] errespetatuz egingo duzula.",
        "actioncomplete": "Ekintza burutu da",
        "undeleteviewlink": "ikusi",
        "undeleteinvert": "Alderanztu aukera",
        "undeletecomment": "Arrazoia:",
-       "undeletedrevisions": "{{PLURAL:$1|Berrikuspen 1 leheneratu da|$1 berrikuspen leheneratu dira}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|berrikuspen|berrikuspen}} eta {{PLURAL:$2|fitxategi|fitxategi}} leheneratu dira",
-       "undeletedfiles": "{{PLURAL:$1|fitxategi|fitxategi}} leheneratu dira",
        "cannotundelete": "Ezabatutako birgaitze betean edo hainbatetan akatsa: $1",
        "undeletedpage": "'''«$1» leheneratu da'''\n\nAzken ezabatze eta leheneratzeak ikusteko, jo ezazu [[Special:Log/delete|ezabaketa erregistrora]].",
        "undelete-header": "Berriki ezabatutako orriak ikusteko, jo ezazu [[Special:Log/delete|ezabaketa erregistrora]].",
        "unblocked-id": "$1 blokeaketa ezabatu da",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] desblokeatua izan da.",
        "blocklist": "Blokeatutako erabiltzaileak",
+       "autoblocklist": "Blokeo automatikoak",
+       "autoblocklist-submit": "Bilatu",
+       "autoblocklist-legend": "Blokeo automatikoen zerrenda erakutsi",
+       "autoblocklist-empty": "Blokeo automatikoen zerrenda hutsik dago.",
        "ipblocklist": "Blokeatutako erabiltzaileak",
        "ipblocklist-legend": "Blokeatutako erabiltzaile bat bilatu",
        "blocklist-userblocks": "Ezkutatu kontu-blokeatzeak",
        "movenotallowedfile": "Ez duzu fitxategiak mugitzeko eskumenik.",
        "cant-move-user-page": "Ez duzu lankide orrialdeak mugitzeko eskumenik (azpiorrialdeetatik at).",
        "cant-move-to-user-page": "Ez duzu orrialde bat lankide orrialde batera mugitzeko eskumenik (lankide azpiorrialde batera izan ezik).",
+       "cant-move-category-page": "Ez duzu kategoria orrialdeak mugitzeko baimenik.",
        "cant-move-to-category-page": "Ez duzu baimenik orrialde bat kategoria-orrialde batera mugitzeko.",
+       "cant-move-subpages": "Ez duzu azpiorrialdeak mugitzeko baimenik.",
        "newtitle": "Izenburu berria:",
        "move-watch": "Orrialde hau jarraitu",
        "movepagebtn": "Mugitu orria",
        "export-download": "Gorde fitxategitzat",
        "export-templates": "Txantiloiak barneratu",
        "export-pagelinks": "Sartu lotutako orriak honako sakoneran:",
+       "export-manual": "Gehitu orrialdeak eskuz:",
        "allmessages": "Sistemako mezu guztiak",
        "allmessagesname": "Izena",
        "allmessagesdefault": "Testu lehenetsia",
        "tooltip-pt-mycontris": "{{GENDER:|Nire}} ekarpenen zerrenda",
        "tooltip-pt-anoncontribs": "IP helbide honetatik egindako aldaketen zerrenda",
        "tooltip-pt-login": "Izen ematera gonbidatzen zaitugu.",
+       "tooltip-pt-login-private": "Ez duzu saioa hasi behar wiki hau erabiltzeko",
        "tooltip-pt-logout": "Saioa itxi",
        "tooltip-pt-createaccount": "Kontu bat sortu eta horrekin saioa hastea eskatu nahi genizuke; ez da ezinbestekoa, ordea.",
        "tooltip-ca-talk": "Artikuluari buruzko eztabaida",
        "pageinfo-length": "Orriaren neurria (byteak)",
        "pageinfo-article-id": "Orriaren identifikazio zenbakia",
        "pageinfo-language": "Orriaren edukiaren hizkuntza",
+       "pageinfo-language-change": "aldatu",
        "pageinfo-content-model": "Orrialde edukiaren eredua",
+       "pageinfo-content-model-change": "aldatu",
        "pageinfo-robot-policy": "Errobotak indexatzea egiten",
        "pageinfo-robot-index": "Baimendua",
        "pageinfo-robot-noindex": "Debekatua",
        "newimages-summary": "Orrialde berezi honek igotako azkeneko fitxategiak erakusten ditu.",
        "newimages-legend": "Iragazkia",
        "newimages-label": "Fitxategia (edo bere zati bat):",
+       "newimages-user": "IP helbidea edo erabiltzaile-izena",
        "newimages-showbots": "Erakutsi botek igotako fitxategiak",
        "noimages": "Ez dago ezer ikusteko.",
        "ilsubmit": "Bilatu",
        "confirmemail_body": "Norbaitek, ziurrenik zuk $1 IP helbidetik, \"$2\" kontua erregistratu du {{SITENAME}}(e)n e-posta helbide honekin.\n\nIzen hori zuri dagokizula eta {{SITENAME}}(e)n zure e-posta egiaztatzeko, hurrengo lotura hau zure nabigatzailean ireki behar duzu:\n\n$3\n\nZu *ez* bazara, ez jo lotura horretara, jarraitu beste lotura hau e-posta bidezko helbide egiaztatzea ezeztatzeko:\n\n$5\n\nEgiaztapen kode hau $4 iraungiko da.",
        "confirmemail_invalidated": "E-mail bidezko ziurtatzea kantzelatu da",
        "invalidateemail": "E-mail bidezko ziurtatzea deuseztu",
+       "notificationemail_body_changed": "Norbaitek, beharbada zuk, $1 IP helbidetik, kontuari lotutako helbide elektronikoa aldatu du \"$2\"-tik \"$3\"-ra {{SITENAME}} gunean.\n\nZu izan ez bazara, jar zaitez berehala harremanetan guneko administratzaile batekin.",
+       "notificationemail_body_removed": "Norbaitek, beharbada zuk, $1 IP helbidetik, kontuari lotutako \"$2\" helbide elektronikoa ezabatu du {{SITENAME}} gunean.\n\nZu izan ez bazara, jar zaitez berehala harremanetan guneko administratzaile batekin.",
        "scarytranscludedisabled": "[Interwikien transklusioa ezgaituta dago]",
        "scarytranscludefailed": "[Arazoa $1 txantiloia eskuratzerakoan]",
        "scarytranscludetoolong": "[URLa luzeegia da]",
        "confirm-unwatch-button": "Ados",
        "confirm-unwatch-top": "Orrialde hau zure jarraipen-zerrendatik kendu?",
        "confirm-rollback-button": "Ados",
+       "confirm-rollback-top": "Orrialde honen edizioak leheneratu?",
        "word-separator": "&#32;",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "&larr; aurreko orrialdea",
        "tags-active-yes": "Bai",
        "tags-active-no": "Ez",
        "tags-source-extension": "Softwareak definitua",
+       "tags-source-manual": "Erabiltzaileek eta botek eskuz ezarrita",
        "tags-source-none": "Ez da gehiago erabiltzen",
        "tags-edit": "aldatu",
        "tags-delete": "ezabatu",
        "tags-edit-remove-all-tags": "(kendu etiketa guztiak)",
        "tags-edit-chosen-placeholder": "Hautatu etiketa batzuk",
        "tags-edit-reason": "Arrazoia:",
+       "tags-edit-success": "Aldaketak ezarri dira.",
+       "tags-edit-failure": "Ezin izan dira aldaketak ezarri:\n$1",
        "comparepages": "Orrialdeak alderatu",
        "compare-page1": "1. orrialdea",
        "compare-page2": "2. orrialdea",
        "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 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",
+       "restore-count-files": "{{PLURAL:$1|Fitxategi 1|$1 fitxategi}}",
+       "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",
+       "logentry-suppress-delete": "$1 erabiltzaileak $3 orria {{GENDER:$2|ezabatu}} du",
        "logentry-suppress-event": "$1 wikilariak ezkutuan ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, «$3» orrian: $4",
        "revdelete-content-hid": "edukia ezkutatu da",
        "revdelete-summary-hid": "edizioaren laburpena ezkutatu da",
        "logentry-block-reblock": "$1 administratzaileak {{GENDER:$4|$3}} wikilariaren blokeoa {{GENDER:$2|aldatu du}}. Blokeoaldia: $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|administratzaileak}} {{GENDER:$4|$3}} blokeatu du. Iraupena: $5 $6",
        "logentry-suppress-reblock": "$1 administratzaileak {{GENDER:$4|$3}} wikilariaren blokeoa {{GENDER:$2|aldatu du}}. Blokeoaldia: $5 $6",
+       "logentry-import-upload": "$1(e)k $3 {{GENDER:$2|inportatu du}} fitxategi-igoera bidez",
        "logentry-move-move": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketarik utzi gabe",
        "logentry-move-move_redir": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik",
        "logentry-patrol-patrol": "$1(e)k $3 orrialdearen $4 berrikuspena patruilatutzat {{GENDER:$2|markatu}} du",
        "logentry-newusers-newusers": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
        "logentry-newusers-create": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
-       "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua sortu du",
+       "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua {{GENDER:$2|sortu}} du",
        "logentry-newusers-byemail": "$1(e)k $3 erabiltzaile kontua {{GENDER:$2|sortu du}} eta pasahitza emailez bidali da",
        "logentry-newusers-autocreate": "$1 erabiltzaile kontua automatikoki {{GENDER:$2|sortu da}}",
        "logentry-upload-upload": "$1(e)k $3 {{GENDER:$2|igo du}}",
+       "logentry-upload-overwrite": "$1(e)k $3(r)en bertsio berria {{GENDER:$2|igo du}}",
+       "logentry-upload-revert": "$1(e)k $3 {{GENDER:$2|igo du}}",
+       "logentry-managetags-create": "$1 lankideak \"$4\" etiketa {{GENDER:$2|sortu du}}",
        "log-name-tag": "Etiketen erregistroa",
        "rightsnone": "(bat ere ez)",
-       "revdelete-summary": "aldaketaren laburpena",
        "feedback-adding": "Orriari feedbacka gehitzen...",
        "feedback-back": "Atzera",
        "feedback-bugnew": "Txekeatu dut. Bug berria bidaliko",
        "pagelang-use-default": "Hizkuntza lehenetsia erabili",
        "pagelang-select-lang": "Hizkuntza aukeratu",
        "pagelang-submit": "Bidali",
+       "pagelang-unchanged-language": "$1 orrialdea jada $2 hizkuntzan dago.",
        "right-pagelang": "Aldatu orrialdearen hizkuntza",
        "action-pagelang": "orrialdearen hizkuntza aldatu",
        "log-name-pagelang": "Hizkuntza aldatu:",
        "special-characters-title-emdash": "em lerroa",
        "special-characters-title-minus": "minus zeinua",
        "mw-widgets-dateinput-no-date": "Ez duzu datarik aukeratu",
+       "mw-widgets-mediasearch-noresults": "Ez da emaitzarik aurkitu.",
        "mw-widgets-titleinput-description-new-page": "orri hori oraindik ez da existitzen",
        "mw-widgets-titleinput-description-redirect": "$1ra birzuzendu",
+       "mw-widgets-categoryselector-add-category-placeholder": "Gehitu kategoria bat...",
+       "mw-widgets-usersmultiselect-placeholder": "Gehitu gehiago...",
+       "date-range-from": "Data honetatik aurrera:",
+       "date-range-to": "Data honetara arte:",
        "sessionprovider-generic": "$1 sesio",
        "log-action-filter-block": "Blokeatze mota:",
        "log-action-filter-delete": "Ezabatze mota:",
        "log-action-filter-block-unblock": "blokeoa kendu",
        "log-action-filter-delete-revision": "Berrikuspen ezabaketa",
        "log-action-filter-import-interwiki": "Transwiki inportazioa",
+       "log-action-filter-import-upload": "Inportatu XML igoera bidez",
        "log-action-filter-managetags-create": "Etiketa sorkuntza",
        "log-action-filter-managetags-delete": "Etiketa ezabaketa",
        "log-action-filter-managetags-activate": "Etiketa aktibazioa",
        "log-action-filter-managetags-deactivate": "Etiketa desaktibazioa",
+       "log-action-filter-newusers-autocreate": "Sorrera automatikoa",
+       "log-action-filter-protect-protect": "Babesa",
+       "log-action-filter-rights-rights": "Eskuzko aldaketa",
+       "log-action-filter-rights-autopromote": "Aldaketa automatikoa",
+       "log-action-filter-upload-upload": "Igoera berria",
        "authmanager-userdoesnotexist": "\"$1\" erabiltzaile kontua ez dago erregistratua.",
        "authmanager-email-label": "Emaila",
        "authmanager-email-help": "Helbide elektronikoa",
        "authmanager-realname-label": "Benetako izena",
        "authmanager-realname-help": "Erabiltzailearen benetako izena",
+       "authmanager-provider-temporarypassword": "Behin-behineko pasahitza",
        "authprovider-resetpass-skip-label": "Utzi",
        "authform-wrongtoken": "Token okerra",
-       "credentialsform-account": "Kontuaren izena:"
+       "credentialsform-account": "Kontuaren izena:",
+       "gotointerwiki": "{{SITENAME}}(e)tik irteten"
 }
index 1953747..fc9b706 100644 (file)
        "externaldberror": "Marru d'autentificación esterna e la basi e datus, u bien nu t'alcuentras autorizau p'atualizal la tu cuenta esterna.",
        "login": "Entral",
        "nav-login-createaccount": "Entral/Crial cuenta",
-       "userlogin": "Entral/Crial cuenta",
-       "userloginnocreate": "Entral",
        "logout": "Salil",
        "userlogout": "Salil",
        "notloggedin": "Nu t'alcuentras rustriu",
-       "nologin": "Entovia nu gastas una cuenta? $1.",
-       "nologinlink": "Cria una",
        "createaccount": "Crial cuenta",
-       "gotaccount": "Ya tiinis una cuenta? '''$1'''.",
-       "gotaccountlink": "Entral",
        "createaccountmail": "pol e-mail",
        "badretype": "Las consínias nu conciin.",
        "userexists": "El nombri d'usuáriu ya s'alcuentra rustriu, pol favol, escrebi otru nombri.",
        "showpreview": "Previsoreal",
        "showdiff": "Muestral chambus",
        "anoneditwarning": "'''Avisu:''' Nu t'alcuentras rustriu, razón pola que s'emburacará la tu IP nel estorial d'esta páhina.",
-       "missingsummary": "'''Atención:''' Nu as escrebiu una síntesis al tentu la tu eición. Si pursas otra vezi sobri «{{int:savearticle}}» la tu eición s´emburacará sin él.",
+       "missingsummary": "'''Atención:''' Nu as escrebiu una síntesis al tentu la tu eición. Si pursas otra vezi sobri «$1» la tu eición s´emburacará sin él.",
        "missingcommenttext": "Pol favol, escrebi un testu embahu.",
        "missingcommentheader": "'''Atención:''' Nu as escrebiu un entítulu pal tu comentáriu. Si güervis a pursal sobri \"Emburacal\", s'emburacará sin él.",
        "summary-preview": "Previsoreal síntesis:",
        "editingsection": "Eitandu $1 (seción)",
        "editingcomment": "Eitandu $1 (nueva seción)",
        "editconflict": "Conflitu d'eición: $1",
-       "explainconflict": "Alguien á hechu chambus nesta páhina dendi que prencipiasti a eitala.\nEl cuairu e testu superiol endica el testu que desisti atualmenti ena páhina.\nLos tus chambus se muestran nel cuairu e testu inferiol.\nPa emburacal los tus chambus, ebis tresladalus al cuairu superiol.\n'''Solu''' s'emburacará el testu el cuairu superiol cuandu pursis \"{{int:savearticle}}\".",
+       "explainconflict": "Alguien á hechu chambus nesta páhina dendi que prencipiasti a eitala.\nEl cuairu e testu superiol endica el testu que desisti atualmenti ena páhina.\nLos tus chambus se muestran nel cuairu e testu inferiol.\nPa emburacal los tus chambus, ebis tresladalus al cuairu superiol.\n'''Solu''' s'emburacará el testu el cuairu superiol cuandu pursis \"$1\".",
        "yourtext": "El tu testu",
        "storedversion": "Velsión emburacá",
        "nonunicodebrowser": "'''Atención: El tu escrucaol nu cumpri la norma Unicode. S'á ativau un sistema d'eición alternativu que te premitirá eital artículus con seguráncia, inque los carateris que nu seyan ASCII apaicirán nel cuairu d'eición cumu cóigus esadecimalis.'''",
        "rcshowhidepatr": "$1 eicionis patrullás",
        "rcshowhidemine": "$1 las mis eicionis",
        "rcshowhidemine-hide": "Açonchal",
-       "rclinks": "Muestral los $1 úrtimus chambus enus $2 úrtimus dias<br />$3",
+       "rclinks": "Muestral los $1 úrtimus chambus enus $2 úrtimus dias",
        "diff": "def",
        "hist": "estor",
        "hide": "Açonchal",
        "undeletebtn": "Restaural",
        "undeletelink": "Guipal/arrecuperal",
        "undeletecomment": "Comentáriu:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revisión|$1 revisionis}} restaurás",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revisión|$1 revisionis}} i {{PLURAL:$2|1 archivu|$2 archivus}} restauraus",
-       "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.",
        "revdelete-restricted": "las restricionis a los çahorilis án siu apricás",
        "revdelete-unrestricted": "las restricionis a los çahorilis án siu esborrás",
        "rightsnone": "(dengunu)",
-       "revdelete-summary": "eital sumáriu",
        "searchsuggest-search": "Buscal",
        "expand_templates_preview": "Previsoreal"
 }
index dcc7244..9e71a7a 100644 (file)
@@ -57,7 +57,8 @@
                        "4nn1l2",
                        "Namo",
                        "Alifakoor",
-                       "Dejavu"
+                       "Dejavu",
+                       "AzorAhai"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
@@ -84,7 +85,7 @@
        "tog-enotifusertalkpages": "هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من ایمیلی فرستاده شود",
        "tog-enotifminoredits": "برای تغییرات جزئی در صفحه‌ها و پرونده‌ها هم به من ایمیلی فرستاده شود",
        "tog-enotifrevealaddr": "نشانی پست الکترونیکی من در ایمیل‌های اطلاع‌رسانی هویدا گردد",
-       "tog-shownumberswatching": "نمایشِ شمار کاربران پی‌گیری کننده",
+       "tog-shownumberswatching": "شمار کاربران پی‌گیری‌کننده نمایش داده شود",
        "tog-oldsig": "امضای کنونی شما:",
        "tog-fancysig": "امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)",
        "tog-uselivepreview": "از پیش‌نمایش زنده استفاده شود",
        "qbbrowse": "مرور",
        "qbedit": "ویرایش",
        "qbpageoptions": "این صفحه",
-       "qbmyoptions": "صفحات من",
+       "qbmyoptions": "صفحه‌های من",
        "faq": "پرسش‌های متداول",
        "faqpage": "Project:پرسش‌های متداول",
        "actions": "عملکردها",
        "tagline": "از {{SITENAME}}",
        "help": "راهنما",
        "search": "جستجو",
-       "search-ignored-headings": "#<!-- این صفحه را درست همانطور که هست رها کنید --> <pre>\n#سر‌فصل‌هایی که توسط تحقیق نادیده گرفته خواهندشد.‌\n#به محض اینکه صفحه با سرفصل، فهرست شده‌است،تغییرات متاثر می‌شود.\n#شما می‌توانید با انجام یک ویرایش پوچ صفحه را وادار به دوباره فهرست کردن کنید.\n#نحو به شرح زیر است:\n#  *همه چیز از یک خصیصهٔ \"#\" گرفته تا آخر خط، یک نظر است\n#  *هر خط بدون فاصله، عنوان دقیق برای نادیده گرفتن،موضوع و همه چیز منابع است\nاتصالات خارجی\nهمچنین مشاهده کنید\n#</pre> <!-- leave this line exactly as it is -->",
+       "search-ignored-headings": "#<!-- این صفحه را درست همانطور که هست رها کنید --> <pre>\n# سر‌فصل‌هایی که توسط جستجو نادیده گرفته خواهندشد.‌\n# تأثیر تغییرات زمانی رخ می‌دهد که صفحهٔ حاوی آن سرفصل، نمایه شود.\n# شما می‌توانید با انجام یک ویرایش پوچ صفحه را وادار به دوباره نمایه‌شدن کنید.\n# نحو به شرح زیر است:\n#  *هر چه از یک نویسهٔ «#» تا آخر خط بیاید، یک توضیح است.\n#  *هر خط بدون فاصله، دقیقاً عنوانی است که نادیده گرفته می‌شود (با رعایت بزرگی و کوچکی حروف).\nمنابع\nپیوند به بیرون\nهمچنین ببینید\n#</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "جستجو",
        "go": "برو",
        "searcharticle": "برو",
        "redirectedfrom": "(تغییرمسیر از $1)",
        "redirectpagesub": "صفحهٔ تغییرمسیر",
        "redirectto": "تغییرمسیر به:",
-       "lastmodifiedat": "این صفحه آخرین‌بار در $1 ساعت $2 تغییر یافته‌است.",
+       "lastmodifiedat": "این صفحه آخرین‌بار در $1 ساعت $2 ویرایش شده‌است.",
        "viewcount": "از این صفحه {{PLURAL:$1|یک‌بار|$1بار}} بازدید شده‌است.",
        "protectedpage": "صفحهٔ محافظت‌شده",
        "jumpto": "پرش به:",
        "pool-timeout": "اتمام مهلت انتظار برای قفل",
        "pool-queuefull": "صف مخزن پر است",
        "pool-errorunknown": "خطای ناشناخته",
-       "pool-servererror": "پول سنتر سرویس در دسترس نیست ( $1 ).",
+       "pool-servererror": "سرویس شمارندهٔ انباره در دسترس نیست ($1).",
        "poolcounter-usage-error": "خطای استفاده: $1",
        "aboutsite": "دربارهٔ {{SITENAME}}",
        "aboutpage": "Project:درباره",
        "youhavenewmessages": "$1 دارید ($2).",
        "youhavenewmessagesfromusers": "شما از {{PLURAL:$3|یک کاربر دیگر|$3  کاربر}} $1 دارید ($2).",
        "youhavenewmessagesmanyusers": "شما از تعدادی کاربر $1 دارید ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|Ù¾Û\8cاÙ\85 Ø¬Ø¯Û\8cد|999=پیام‌های تازه}}",
-       "newmessagesdifflinkplural": "{{formatnum:$1}} {{PLURAL:$1|تغییر|999=تغییر}} اخیر",
+       "newmessageslinkplural": "{{PLURAL:$1|Ù¾Û\8cاÙ\85 ØªØ§Ø²Ù\87|999=پیام‌های تازه}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|تغییر|999=تغییر}} اخیر",
        "youhavenewmessagesmulti": "پیام‌های جدیدی در $1 دارید.",
        "editsection": "ویرایش",
        "editold": "ویرایش",
        "hidetoc": "نهفتن",
        "collapsible-collapse": "نهفتن",
        "collapsible-expand": "گسترش",
-       "confirmable-confirm": "{{GENDER:$1|شما}} مطمئن هستید؟",
+       "confirmable-confirm": "آیا مطمئن {{GENDER:$1|هستید}}؟",
        "confirmable-yes": "بله",
        "confirmable-no": "خیر",
        "thisisdeleted": "نمایش یا احیای $1؟",
        "nospecialpagetext": "<strong>شما یک صفحهٔ ویژهٔ نامجاز را درخواست کرده‌اید.</strong>\n\nفهرستی از صفحه‌های ویژهٔ مجاز در [[Special:SpecialPages|{{int:specialpages}}]] وجود دارد.",
        "error": "خطا",
        "databaseerror": "خطای پایگاه داده",
-       "databaseerror-text": "مشکلی در پایگاه‌داده‌ها رخ داده است. \nاین ممکن است نشان‌دهندهٔ ایرادی در نرم‌افزار باشد.",
-       "databaseerror-textcl": "یک خطای پرس‌وجوی پایگاه داده‌های رخ داده است.",
-       "databaseerror-query": "پرس‌وجو: $1",
+       "databaseerror-text": "مشکلی در پایگاه‌داده‌ها رخ داد. \nاین ممکن است نشان‌دهندهٔ ایرادی در نرم‌افزار باشد.",
+       "databaseerror-textcl": "یک خطا در پرسمان پایگاه داده رخ داد.",
+       "databaseerror-query": "پرسمان: $1",
        "databaseerror-function": "تابع: $1",
        "databaseerror-error": "خطا: $1",
        "transaction-duration-limit-exceeded": "برای پرهیز از ایجاد تاخیر بالا در نسخه‌برداری، این تراکنش لغو شد چرا که مدت زمان نوشتن ($1) از حد $2 {{PLURAL:$2|ثانیه|ثانیه}} بیشتر بود.\nاگر در حال تغییر چیزهای زیادی به طور همزمان هستید، سعی کنید به جایش چند عمل را در گروه‌های کوچکتر انجام بدهید.",
        "nonwrite-api-promise-error": "سرآیند اچ‌تی‌تی‌پی 'Promise-Non-Write-API-Action' ارسال شد ولی درخواست به یک رابط برنامه‌نویسی پودمان نوشتن بود.",
        "internalerror": "خطای داخلی",
        "internalerror_info": "خطای داخلی: $1",
-       "internalerror-fatal-exception": "نوع استثنای مخرب \"$1\"",
+       "internalerror-fatal-exception": "استثنای مخرب از نوع «$1»",
        "filecopyerror": "نشد از پروندهٔ «$1» روی «$2» نسخه‌برداری شود.",
        "filerenameerror": "نشد پروندهٔ «$1» به «$2» تغییر نام یابد.",
        "filedeleteerror": "نشد پروندهٔ «$1» حذف شود.",
        "directorycreateerror": "نشد مسیر $1 را ایجاد کرد.",
-       "directoryreadonlyerror": "داÛ\8cرکتÙ\88رÛ\8c \"$1\" فقط خواندنی است.",
-       "directorynotreadableerror": "داÛ\8cرکتÙ\88رÛ\8c \"$1\" قابل خواندن نیست.",
+       "directoryreadonlyerror": "شاخÙ\87Ù\94 Â«$1» فقط خواندنی است.",
+       "directorynotreadableerror": "شاخÙ\87Ù\94 Â«$1» قابل خواندن نیست.",
        "filenotfound": "پروندهٔ «$1» یافت نشد.",
        "unexpected": "مقدار غیرمنتظره: «$1»=«$2».",
        "formerror": "خطا: نمی‌توان فرم را فرستاد.",
        "cannotdelete": "امکان حذف صفحه یا تصویر «$1» وجود ندارد.\nممکن است قبلاً فرد دیگری آن را حذف کرده باشد.",
        "cannotdelete-title": "نمی‌توان صفحهٔ «$1» را حذف کرد",
        "delete-hook-aborted": "حذف توسط قلاب لغو شد.\nتوضیحی در این مورد داده نشد.",
-       "no-null-revision": "امکان ایجاد نسخهٔ پوچ برای صفحهٔ «$1» وجود نداشت",
+       "no-null-revision": "اÙ\85کاÙ\86 Ø§Û\8cجاد Ù\86سخÙ\87Ù\94 Ù¾Ù\88Ú\86 ØªØ§Ø²Ù\87 Ø¨Ø±Ø§Û\8c ØµÙ\81Ø­Ù\87Ù\94 Â«$1» Ù\88جÙ\88د Ù\86داشت",
        "badtitle": "عنوان بد",
        "badtitletext": "عنوان درخواستی نامعتبر، خالی، یا عنوانی میان‌زبانی یا میان‌ویکی‌ای با پیوند نادرست بود.\nممکن است حاوی یک یا چند نویسه باشد که نمی‌توانند در عنوان‌ها استفاده شوند.",
-       "title-invalid-empty": "عنوان صفحهٔ مورد درخواست خالی است یا فقط عنوان فضای نام ذکر شده‌است.",
-       "title-invalid-utf8": "عنوان صفحهٔ مورد نظر دارای نویسهٔ نادرست یونیکد است.",
+       "title-invalid-empty": "عنوان صفحهٔ درخواست‌شده خالی است یا فقط عنوان فضای نام ذکر شده‌است.",
+       "title-invalid-utf8": "عنوان صفحهٔ درخواست‌شده دارای نویسهٔ نادرست یونیکد است.",
        "title-invalid-interwiki": "صفحهٔ درخواست شده دارای پیوند میان‌ویکی است که نمی‌تواند در عنوان‌ها استفاده شود.",
-       "title-invalid-talk-namespace": "صÙ\81Ø­Ù\87Ù\94 Ù\85Ù\88رد Ø¯Ø±Ø®Ù\88است Ø¨Ù\87 Ø¹Ù\86Ù\88اÙ\86 ØµÙ\81Ø­Ù\87Ù\94 Ø¨Ø­Ø«Û\8c Ú©Ù\87 Ù\88جÙ\88د Ù\86داردØ\8c Ø§Ø±Ø¬Ø§Ø¹ Ù\85Û\8câ\80\8cÚ©Ù\86د",
-       "title-invalid-characters": "عنوان صفحهٔ مورد درخواست نویسهٔ نادرست «$1» دارد.",
-       "title-invalid-relative": "عنوان دارای نشانی است. عنوان نشانی‌ها (./, ../) بی‌اعتبار هستند چون معمولاً توسط مرورگر کاربران غیرقابل دسترس هستند.",
-       "title-invalid-magic-tilde": "عنوان صفحهٔ مورد درخواست دارای عبارت جادوئی بی‌اعتبار است (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "عنوان صفحهٔ مورد درخواست خیلی طولانی است. نباید از $1 {{PLURAL:$1|بایت|بایت}} نویسهٔ یونیکد باشد.",
-       "title-invalid-leading-colon": "صÙ\81Ø­Ù\87Ù\94 Ø¯Ø±Ø®Ù\88استÛ\8c Ø¯Ø§Ø±Ø§Û\8c : Ø¨Û\8câ\80\8cاعتبار Ø¯Ø± Ø§Ø¨ØªØ¯Ø§Û\8c Ø¹Ù\86Ù\88اÙ\86ش است.",
+       "title-invalid-talk-namespace": "عÙ\86Ù\88اÙ\86 ØµÙ\81Ø­Ù\87Ù\94 Ø¯Ø±Ø®Ù\88استâ\80\8cشدÙ\87 Ø¨Ù\87 ØµÙ\81Ø­Ù\87Ù\94 Ø¨Ø­Ø«Û\8c Ú©Ù\87 Ù\88جÙ\88د Ù\86داردØ\8c Ø§Ø±Ø¬Ø§Ø¹ Ù\85Û\8câ\80\8cÚ©Ù\86د.",
+       "title-invalid-characters": "عنوان صفحهٔ درخواست‌شده نویسهٔ نامجاز دارد: «$1».",
+       "title-invalid-relative": "عنوان دارای نشانی است. عنوان‌های دارای نشانی نسبی (نظیر ‎./‎ یا ‎../‎) نامجاز هستند چون معمولاً توسط مرورگر کاربران غیرقابل دسترس هستند.",
+       "title-invalid-magic-tilde": "عنوان صفحهٔ درخواست‌شده دارای مدک‌های جادوئی نامجاز است (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "عنوان صفحهٔ درخواست‌شده خیلی طولانی است. نباید از $1 {{PLURAL:$1|بایت|بایت}} در رمزگذاری یوتی‌اف-۸ بیشتر باشد.",
+       "title-invalid-leading-colon": "عÙ\86Ù\88اÙ\86 ØµÙ\81Ø­Ù\87Ù\94 Ø¯Ø±Ø®Ù\88استÛ\8c Ø¯Ø§Ø±Ø§Û\8c Ø¯Ù\88Ù\86Ù\82Ø·Ù\87Ù\94 Ù\86اÙ\85جاز Ø¯Ø± Ø§Ø¨ØªØ¯Ø§Û\8cش است.",
        "perfcached": "داده‌های زیر از حافظهٔ نهانی فراخوانی شده‌اند و ممکن است کاملاً به‌روز نباشند. حداکثر {{PLURAL:$1|یک نتیجه| $1 نتیجه}} در حافظهٔ نهانی قابل دسترس است.",
        "perfcachedts": "داده‌های زیر از حافظهٔ نهانی فراخوانی شده‌اند و آخرین بار در $1 به‌روزرسانی شدند. حداکثر {{PLURAL:$4|یک نتیجه|$4 نتیجه}} در حافظهٔ نهانی قابل دسترس است.",
        "querypage-no-updates": "امکان به‌روزرسانی این صفحه فعلاً غیرفعال شده‌است.\nاطلاعات این صفحه ممکن است به‌روز نباشد.",
        "login": "ورود به سامانه",
        "login-security": "هویتتان را تائید کنید",
        "nav-login-createaccount": "ورود به سامانه / ایجاد حساب کاربری",
-       "userlogin": "ورود به سامانه / ایجاد حساب کاربری",
-       "userloginnocreate": "ورود به سامانه",
        "logout": "خروج از سامانه",
        "userlogout": "خروج از سامانه",
        "notloggedin": "به سامانه وارد نشده‌اید",
        "userlogin-noaccount": "حساب کاربری ندارید؟",
        "userlogin-joinproject": "در {{SITENAME}} نام‌نویسی کنید!",
-       "nologin": "حساب کاربری ندارید؟ $1.",
-       "nologinlink": "یک حساب کاربری تازه بسازید",
        "createaccount": "ایجاد حساب کاربری",
-       "gotaccount": "حساب کاربری دارید؟ $1.",
-       "gotaccountlink": "به سامانه وارد شوید",
-       "userlogin-resetlink": "جزئیات ورود را فراموش کرده‌اید؟",
        "userlogin-resetpassword-link": "گذرواژه‌تان را فراموش کردید؟",
        "userlogin-helplink2": "کمک با ورود",
        "userlogin-loggedin": "شما در حال حاضر به عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به عنوان یک کاربر دیگر استفاده کنید.",
        "createaccountmail": "استفاده از رمز عبور موقت تصادفی و ارسال آن به آدرس ایمیل مشخص شده",
        "createaccountmail-help": "جهت ايجاد حساب برای شخص ديگری بدون دانستن گذرواژهٔ آن کاربرد دارد.",
        "createacct-realname": "نام واقعی (اختیاری)",
-       "createaccountreason": "دلیل:",
        "createacct-reason": "دلیل",
        "createacct-reason-ph": "چرا شما حساب دیگری می‌سازید؟",
        "createacct-reason-help": "پیامی که در سياههٔ ایجاد حساب نمایش داده می‌شود",
        "botpasswords-label-grants": "اعطاهای اجرا شدنی:",
        "botpasswords-help-grants": "هر اجازه به ربات اجازه دسترسی به اختیاراتی را که حساب شما دارد می‌دهد. فعال کردن یک اجازه در اینجا هیچ دسترسی جدیدی که حساب شما همینک دارا نیست را به آن نمی‌بخشد. [[Special:ListGrants|table of grants]] را برای اطلاعات بیشتر مشاهده کنید.",
        "botpasswords-label-grants-column": "اعطا شد",
-       "botpasswords-bad-appid": "نام ربات \"$1\" معتبر نیست.",
+       "botpasswords-bad-appid": "نام ربات «$1» معتبر نیست.",
        "botpasswords-insert-failed": "شکست در افزودن نام ربات «$1». در حال حاضر اضافه شده است؟",
        "botpasswords-update-failed": "شکست در به‌روزرسانی نام رباتی «$1». حذف شده است؟",
        "botpasswords-created-title": "گذرواژه ربات ایجاد شد",
        "botpasswords-newpassword": "<strong>$2</strong> گذرواژهٔ جدید برای ورود با حساب <strong>$1</strong> است. <em>لطفاً آن را برای ارجاع در آینده ذخیره کنید.</em> <br> (برای ربات‌های قدیمی که نیاز به نام کاربری مطابق با حساب کاربری‌شان دارد، شما می‌توانید از <strong>$3</strong> به عنوان نام کاربری و از <strong>$4</strong> به عنوان گذرواژه استفاده کنید.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider موجود نیست.",
        "botpasswords-restriction-failed": "محدودیت‌های گذرواژهٔ ربات از این ورود جلوگیری می‌کند.",
-       "botpasswords-invalid-name": "نام کاربری مشخص شده دارای جداکنندهٔ گذرواژهٔ رباتی نیست (\"$1\").",
+       "botpasswords-invalid-name": "نام کاربری مشخص شده دارای جداکنندهٔ گذرواژهٔ رباتی نیست («$1»).",
        "botpasswords-not-exist": "کاربر «$1» گذرواژهٔ رباتی نام‌دهی شدهٔ «$2» ندارد.",
        "resetpass_forbidden": "نمی‌توان گذرواژه‌ها را تغییر داد",
        "resetpass_forbidden-reason": "نمی‌توانید گذرواژه‌ها را تغییر داد: $1",
        "resetpass-temp-password": "گذرواژهٔ موقت:",
        "resetpass-abort-generic": "تغییر گذرواژه به دست یکی از افزونه‌ها لغو شده است.",
        "resetpass-expired": "رمز عبور شما منقضی شده‌است. لطفاً برای ورود رمز عبور جدیدی را تنظیم کنید.",
-       "resetpass-expired-soft": "رمز عبور شما منقضی شده‌است، و نیاز به تنظیم مجدد دارد. لطفاً اکنون رمز عبور جدیدی را انتخاب کنید، یا برای تنظیم مجدد آن بعدآً، دکمه \"{{int:authprovider-resetpass-skip-label}}\" را کلیک کنید.",
+       "resetpass-expired-soft": "رمز عبور شما منقضی شده‌است و نیاز به تنظیم مجدد دارد. لطفاً اکنون رمز عبور جدیدی را انتخاب کنید، یا برای تنظیم مجدد آن در آینده، دکمهٔ «{{int:authprovider-resetpass-skip-label}}» را کلیک کنید.",
        "resetpass-validity-soft": "گذرواهٔ شما صحیح نیست: $1\n\nلطفاً یک گذرواژهٔ تازه الآن انتخاب کنید یا بر «{{int:authprovider-resetpass-skip-label}}» کلیک کنید که دوباره آن را بعداً انتخاب کنید.",
        "passwordreset": "بازنشانی گذرواژه",
        "passwordreset-text-one": "برای بازنشانی گذرواژه‌تان این فرم را کامل کنید.",
        "preview": "پیش‌نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "نمایش تغییرات",
-       "blankarticle": "<strong>هشدار:</strong> شما در حال ایجاد صفحه خالی هستید.\nاگر «{{int:savearticle}}» را دوباره کلیک کنید، صفحه بدون محتوا ایجاد می‌شود.",
+       "blankarticle": "<strong>هشدار:</strong> شما در حال ایجاد صفحه خالی هستید.\nاگر «$1» را دوباره کلیک کنید، صفحه بدون محتوا ایجاد می‌شود.",
        "anoneditwarning": "<strong>هشدار:</strong> شما وارد نشده‌اید. نشانی آی‌پی شما برای عموم قابل مشاهده خواهد بود اگر هر تغییری ایجاد کنید. اگر <strong>[$1 وارد شوید]</strong> یا <strong>[$2 یک حساب کاربری بسازید]</strong>، ویرایش‌هایتان به نام کاربری‌تان نسبت داده خواهد شد، همراه با مزایای دیگر.",
        "anonpreviewwarning": "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.''",
-       "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
-       "selfredirect": "<strong>هشدار:</strong> شما در حال تغییرمسیر صفحه به خودش هستید.\nامکان دارد هدف اشتباهی را برای تغییرمسیر انتخاب کردید، یا ممکن است صفحهٔ اشتباهی را ویرایش می‌کنید.\n\nاگر بر روی \"{{int:savearticle}}\" دوباره کلیک کنید، تغییرمسیر ساخته خواهد شد.",
+       "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «$1» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
+       "selfredirect": "<strong>هشدار:</strong> شما در حال تغییرمسیر صفحه به خودش هستید.\nامکان دارد هدف اشتباهی را برای تغییرمسیر انتخاب کردید، یا ممکن است صفحهٔ اشتباهی را ویرایش می‌کنید.\n\nاگر بر روی «$1» دوباره کلیک کنید، تغییرمسیر ساخته خواهد شد.",
        "missingcommenttext": "لطفاً توضیحی در زیر بیفزایید.",
-       "missingcommentheader": "<strong>یادآوری:</strong> شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
+       "missingcommentheader": "<strong>یادآوری:</strong> شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «$1» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "summary-preview": "پیش‌نمایش خلاصه:",
        "subject-preview": "پیش‌نمایش موضوع:",
        "previewerrortext": "در زمان تلاش برای نمایش دادن تغییرات شما، خطایی رخ داد.",
        "blockedtitle": "کاربر بسته شده‌است",
        "blockedtext": "<strong>دسترسی حساب کاربری یا نشانی آی‌پی شما بسته شده‌است.</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نشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
        "autoblockedtext": "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.\nدلیل ارائه‌شده چنین است:\n\n:''$2''\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «ایمیل به این کاربر» استفاده کنید مگر آنکه نشانی ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\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": "شما باید، پیش از ویرایش صفحات، آدرس ایمیل خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.",
        "editingsection": "در حال ویرایش $1 (بخش)",
        "editingcomment": "در حال ویرایش $1 (بخش تازه)",
        "editconflict": "تعارض ویرایشی: $1",
-       "explainconflict": "از وقتی ویرایش این صفحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده است.\nناحیهٔ متنی بالایی شامل متن صفحه به شکل کنونی آن است.\nتغییرات شما در ناحیهٔ متنی پایینی نشان داده شده‌است.\nشما باید تغییراتتان را با متن کنونی ترکیب کنید.\nبا فشردن دکمهٔ «{{int:savearticle}}» <strong>فقط</strong> متن ناحیهٔ متنی بالایی ذخیره خواهد شد.",
+       "explainconflict": "از وقتی ویرایش این صفحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده است.\nناحیهٔ متنی بالایی شامل متن صفحه به شکل کنونی آن است.\nتغییرات شما در ناحیهٔ متنی پایینی نشان داده شده‌است.\nشما باید تغییراتتان را با متن کنونی ترکیب کنید.\nبا فشردن دکمهٔ «$1» <strong>فقط</strong> متن ناحیهٔ متنی بالایی ذخیره خواهد شد.",
        "yourtext": "متن شما",
        "storedversion": "نسخهٔ ذخیره شده",
        "nonunicodebrowser": "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.'''\nراه حلی به کار گرفته شده تا شما بتوانید صفحات را با امنیت ویرایش کنید: کاراکترهای غیر ASCII به صورت کدهایی در مبنای شانزده به شما نشان داده می‌شوند.",
        "readonlywarning": "<strong>هشدار: پایگاه داده برای نگهداری قفل شده‌است، به همین علت هم‌اکنون نمی‌توانید ویرایش‌هایتان را ذخیره کنید.</strong>\nاگر می‌خواهید متن را در یک پروندهٔ متنی کپی کنید و برای آینده ذخیره‌اش کنید.\n\nمدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1",
        "protectedpagewarning": "'''هشدار: این صفحه قفل شده‌است تا فقط کاربران با دسترسی مدیریت بتوانند ویرایشش کنند.'''\nآخرین موارد سیاهه در زیر آمده‌است:",
        "semiprotectedpagewarning": "'''توجه:''' این صفحه قفل شده‌است تا تنها کاربران ثبت‌نام‌کرده قادر به ویرایش آن باشند.\nآخرین موارد سیاهه در زیر آمده‌است:",
-       "cascadeprotectedwarning": "<strong>هشدار:</strong> این صفحه به علت قرارگرفتن در {{PLURAL:$1|صفحهٔ|صفحه‌های}} آبشاری-محافظت‌شدهٔ زیر قفل شده‌است تا فقط مدیران بتوانند ویرایشش کنند.",
+       "cascadeprotectedwarning": "<strong>هشدار:</strong> این صفحه به علت قرارگرفتن در {{PLURAL:$1|صفحهٔ|صفحه‌های}} آبشاری-محافظت‌شدهٔ زیر قفل شده‌است تا فقط [[Special:ListGroupRights|گروه خاصی از کاربران]] بتوانند ویرایشش کنند.",
        "titleprotectedwarning": "'''هشدار: این صفحه به شکلی قفل شده‌است که برای ایجاد آن [[Special:ListGroupRights|اختیارات خاصی]] لازم است.'''\nآخرین موارد سیاهه در زیر آمده است:",
        "templatesused": "{{PLURAL:$1|الگوی|الگوهای}} به‌کاررفته در این صفحه:",
        "templatesusedpreview": "{{PLURAL:$1|الگوی|الگوهای}} استفاده شده در این پیش‌نمایش:",
        "content-model-css": "سی‌اس‌اس",
        "content-json-empty-object": "ابجکت خالی",
        "content-json-empty-array": "آرایهٔ خالی",
-       "deprecated-self-close-category": "صفحه از برچسب اچ‌تی‌ام‌ال self-closed غیرمجاز استفاده می‌کند",
+       "deprecated-self-close-category": "صفحه از برچسب اچ‌تی‌ام‌ال بسته‌شدهٔ نامجاز استفاده می‌کند",
        "deprecated-self-close-category-desc": "صفحه دارای برچسب اچ‌تی‌ام‌ال self-closed است مانند <code>&lt;b/></code> یا <code>&lt;span/></code>. عملکرد این برچسب‌ها در اچ‌تی‌ام‌ال۵ تغییر می‌کند در نتیجه استفاده از آنها در ویکی‌متن منسوخ و بی‌اثر است.",
        "duplicate-args-warning": "<strong>هشدار:</strong> [[:$1]] [[:$2]] را با بیش از یک مقدار برای پارامتر «$3» صدا می‌زند. فقط آخرین مقدار داده شده استفاده خواهد شد.",
        "duplicate-args-category": "صفحه‌های دارای آرگومان تکراری در فراخوانی الگو",
        "post-expand-template-argument-warning": "'''هشدار:''' این صفحه شامل دست کم یک پارامتر الگو است که بیش از اندازه بزرگ است.\nاین پارامترها نادیده گرفته شدند.",
        "post-expand-template-argument-category": "صفحه‌های حاوی الگوهایی با پارامترهای نادیده‌گرفته‌شده",
        "parser-template-loop-warning": "حلقه در الگو پیدا شد: [[$1]]",
+       "template-loop-category": "صفحه‌های دارای حلقه در الگو",
+       "template-loop-category-desc": "صفحه دارای حلقه در الگو، مثلا الگویی که از خودش درون خودش استفاده‌کرده‌است.",
        "parser-template-recursion-depth-warning": "محدودیت عمق بازگشت الگو رد شد ($1)",
        "language-converter-depth-warning": "محدودیت عمق مبدل زبانی رد شد ($1)",
        "node-count-exceeded-category": "صفحه‌هایی که از حداکثر تعداد گره تجاوز کرده‌اند",
        "page_first": "نخست",
        "page_last": "واپسین",
        "histlegend": "انتخاب تفاوت: دکمه‌های گرد کنار ویرایش‌هایی که می‌خواهید با هم مقایسه کنید را علامت بزنید و دکمهٔ Enter را بزنید یا دکمهٔ پایین را فشار دهید.<br />\nاختصارات: '''({{int:cur}})''' = تفاوت با نسخهٔ فعلی، '''({{int:last}})''' = تفاوت با نسخهٔ قبلی، '''({{int:minoreditletter}})''' = ویرایش جزئی.",
-       "history-fieldset-title": "مرور تاریخچه",
-       "history-show-deleted": "فقط حذف‌شده",
+       "history-fieldset-title": "جستجو برای نسخه‌ها",
+       "history-show-deleted": "فقط نسخه‌های حذف شده",
        "histfirst": "قدیمی‌ترین",
        "histlast": "جدیدترین",
        "historysize": "({{PLURAL:$1|۱ بایت|$1 بایت}})",
        "search-file-match": "(تشابه محتوی پرونده)",
        "search-suggest": "آیا منظورتان این بود: $1",
        "search-rewritten": "نمایش نتایج $1. جستجوی به جای $2.",
-       "search-interwiki-caption": "پروژه‌های خواهر",
+       "search-interwiki-caption": "Ù\86تاÛ\8cج Ø§Ø² Ù¾Ø±Ù\88Ú\98Ù\87â\80\8cÙ\87اÛ\8c Ø®Ù\88اÙ\87ر",
        "search-interwiki-default": "نتایج از $1:",
        "search-interwiki-more": "(بیشتر)",
        "search-interwiki-more-results": "نتایج بیشتر",
        "youremail": "ایمیل:",
        "username": "{{GENDER:$1|نام کاربری}}:",
        "prefs-memberingroups": "{{GENDER:$2|عضو}} {{PLURAL:$1|گروه|گروه}}:",
+       "group-membership-link-with-expiry": "$1 (تا $2)",
        "prefs-registration": "زمان ثبت‌نام:",
        "yourrealname": "نام واقعی:",
        "yourlanguage": "زبان:",
        "prefs-help-prefershttps": "تأثیر این ترجیح بعد از ورود بعدی شما اعمال خواهد شد.",
        "prefswarning-warning": "تغییراتتان به ترجیحات هنوز ذحیره نشده است.\nاگر این صفحه بدون کلیک بر «$1» ترک کنید ترجیحاتتان ذخیره نخواهد شد.",
        "prefs-tabs-navigation-hint": "نکته: شما می توانید از کلیدهای جهت‌نمای چپ و راست برای حرکت بین زبانه‌ها در فهرست زبانه‌ها استفاده کنید.",
-       "userrights": "مدیریت اختیارات کاربر",
+       "userrights": "اختیارات کاربر",
        "userrights-lookup-user": "انتخاب یک کاربر",
        "userrights-user-editname": "یک نام کاربری وارد کنید:",
        "editusergroup": "بارگیری گروه‌های کاربر",
        "editinguser": "تغییر اختیارات کاربری کاربر {{GENDER:$1|کاربر}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "ویرایش گروه‌های کاربری",
+       "viewinguserrights": "دیدن دسترسی {{GENDER:$1|کاربری}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "ویرایش گروه‌های {{GENDER:$1|کاربر}}",
+       "userrights-viewusergroup": "مشاهدهٔ گروه‌های {{GENDER:$1|کاربر}}",
        "saveusergroups": "ثبت گروه‌های {{GENDER:$1|کاربری}}",
        "userrights-groupsmember": "عضو:",
        "userrights-groupsmember-auto": "عضو ضمنی:",
-       "userrights-groups-help": "شما می‌توانید گروه‌هایی را که کاربر در آن قرار دارد تغییر دهید:\n* جعبهٔ علامت‌خورده نشانهٔ بودن کاربر در آن گروه است.\n* جعبهٔ خالی نشانهٔ نبودن کاربر در آن گروه است.\n* علامت * به این معنی‌است که اگر آن گروه را بیفزایید نمی‌توانید بعداً برش دارید، و برعکس.",
+       "userrights-groups-help": "شما می‌توانید گروه‌هایی را که کاربر در آن قرار دارد تغییر دهید:\n* جعبهٔ علامت‌خورده نشانهٔ بودن کاربر در آن گروه است.\n* جعبهٔ خالی نشانهٔ نبودن کاربر در آن گروه است.\n* علامت * به این معنی‌است که اگر آن گروه را بیفزایید نمی‌توانید بعداً برش دارید، و برعکس.\n* علامت # را فقط می‌توانید پیش از تاریخ انقضای گروه قرار دهید؛ نمی‌توانید آن را جلو بیاورید.",
        "userrights-reason": "دلیل:",
        "userrights-no-interwiki": "شما اجازهٔ تغییر اختیارات کاربران دیگر ویکی‌ها را ندارید.",
        "userrights-nodatabase": "پایگاه دادهٔ $1 وجود ندارد یا محلی نیست.",
        "userrights-expiry": "زمان سرآمدن:",
        "userrights-expiry-existing": "زمان انقضای موجود: $2، $3",
        "userrights-expiry-othertime": "زمانی دیگر:",
+       "userrights-expiry-options": "۱ روز:1 day,۱ هفته:1 week,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year",
+       "userrights-invalid-expiry": "زمان انقضای گروه «$1» نادرست است.",
+       "userrights-expiry-in-past": "زمان انقضای گروه «$1» گذشته‌است.",
+       "userrights-cannot-shorten-expiry": "امکان جلو آوردن تاریخ انقضای گروه  «$1» را ندارید. تنها کاربرانی که دسترسی اضافه و حذف این گروه را دارند می‌توانند تاریخ انقضا را جلو بیاورند.",
        "userrights-conflict": "تعارض دسترسی‌های کاربری! لطفاً بررسی کنید و تغییرات را تأیید کنید.",
        "group": "گروه:",
        "group-user": "کاربران",
        "right-autoconfirmed": "از محدودیت‌های سرعت آی‌پی‌-محور تاثیر نمی‌گیرد",
        "right-bot": "تلقی‌شده به عنوان یک فرآیند خودکار",
        "right-nominornewtalk": "ویرایش جزئی صفحه‌های بحث به شکلی که باعث اعلان پیغام تازه نشود",
-       "right-apihighlimits": "سÙ\82Ù\81 Ø¨Ø§Ù\84اتر Ø§Ø³ØªÙ\81ادÙ\87 Ø§Ø² API",
-       "right-writeapi": "استفاده از API مربوط به نوشتن",
+       "right-apihighlimits": "اÙ\81زاÛ\8cØ´ Ù\85حدÙ\88دÛ\8cتâ\80\8cÙ\87ا Ø¨Ø±Ø§Û\8c Ù¾Ø±Ø³Ù\85اÙ\86â\80\8cÙ\87اÛ\8c Ø±Ø§Ø¨Ø· Ø¨Ø±Ù\86اÙ\85Ù\87â\80\8cÙ\86Ù\88Û\8cسÛ\8c",
+       "right-writeapi": "استفاده از رابط برنامه‌نویسی نوشتن",
        "right-delete": "حذف صفحات",
        "right-bigdelete": "حذف صفحه‌های دارای تاریخچهٔ بزرگ",
        "right-deletelogentry": "حذف و احیای مدخل‌های خاصی از سیاهه",
        "right-unblockself": "بازکردن دسترسی خود",
        "right-protect": "تغییر میزان محافظت صفحات و ویرایش صفحات محافظت‌شده آبشاری",
        "right-editprotected": "ویرایش صفحه‌های محافظت‌شده به عنوان «{{int:protect-level-sysop}}»",
-       "right-editsemiprotected": "ویرایش صفحه حفاظت‌شده به عنوان \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editsemiprotected": "ویرایش صفحه محافظت‌شده به عنوان «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "ویرایش مدل محتوای یک صفحه",
        "right-editinterface": "ویرایش واسط کاربری",
-       "right-editusercssjs": "ویرایش صفحه‌های CSS و JS دیگر کاربرها",
        "right-editusercss": "ویرایش صفحه‌های CSS دیگر کاربرها",
        "right-edituserjs": "ویرایش صفحه‌های JS دیگر کاربرها",
        "right-editmyusercss": "پرونده‌های سی‌اس‌اس کاربری خود را ویرایش کنید",
        "right-applychangetags": "تائید [[Special:Tags|برچسب]] بر روی تغییرات یک نفر",
        "right-changetags": "افزودن یا حذف [[Special:Tags|برچسب]] قراردادی بر روی نسخه یا سیاهه ورودی‌ها",
        "right-deletechangetags": "حذف [[Special:Tags|برچسب‌ها]] از پایگاه داده",
-       "grant-generic": "\" $1 \" حقوق بسته",
+       "grant-generic": "بستهٔ اختیارات «$1»",
        "grant-group-page-interaction": "تعامل با صفحات",
        "grant-group-file-interaction": "تعامل با رسانه",
        "grant-group-watchlist-interaction": "تعامل با فهرست پیگیری‌های شما",
        "grant-editmyoptions": "اولویت‌های کاربری را ویرایش کنید",
        "grant-editmywatchlist": "ویرایش فهرست پی‌گیری‌هایتان",
        "grant-editpage": "ویرایش صفحات موجود",
-       "grant-editprotected": "ویرایش صفحه حفاظت شده",
+       "grant-editprotected": "ویرایش صفحه محافظت شده",
        "grant-highvolume": "ویرایش با حجم بالا",
        "grant-oversight": "پنهان کردن ویرایش‌ها",
        "grant-patrol": "تغییرات گشت صفحات",
        "grant-privateinfo": "دسترسی به اطلاعات محرمانه",
-       "grant-protect": "حفاظت و عدم حفاظت صفحات",
-       "grant-rollback": "واگردانی  تغییرات صفحات",
+       "grant-protect": "محافظت و عدم محافظت صفحات",
+       "grant-rollback": "واگردانی تغییرات صفحه‌ها",
        "grant-sendemail": "ارسال ایمیل به دیگر کاربران",
        "grant-uploadeditmovefile": "بارگذاری، جایگزینی و انتقال پرونده‌ها",
-       "grant-uploadfile": "بازگذاری پرونده‌های جدید",
+       "grant-uploadfile": "بارگذاری پرونده‌های جدید",
        "grant-basic": "دسترسی‌های اولیه",
        "grant-viewdeleted": "مشاهدهٔ پرونده و صفحات حذف شده",
        "grant-viewmywatchlist": "مشاهدۀ فهرست پیگیری‌هایتان",
        "action-reupload": "نوشتن روی این پرونده موجود",
        "action-reupload-shared": "باطل کردن این پرونده روی یک مخزن مشترک",
        "action-upload_by_url": "بارگذاری این پرونده از یک نشانی اینترنتی",
-       "action-writeapi": "استفاده از API نوشتن",
+       "action-writeapi": "استفاده از رابط برنامه‌نویسی نوشتن",
        "action-delete": "حذف این صفحه",
-       "action-deleterevision": "حذف این نسخه",
+       "action-deleterevision": "حذف نسخه‌ها",
+       "action-deletelogentry": "حذف سیاههٔ ورودی‌ها",
        "action-deletedhistory": "مشاهدهٔ تاریخچهٔ حذف شدهٔ این صفحه",
+       "action-deletedtext": "مشاهدهٔ متن نسخهٔ حذف‌شده",
        "action-browsearchive": "جستجوی صفحه‌های حذف‌شده",
-       "action-undelete": "احÛ\8cاÛ\8c Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87",
+       "action-undelete": "احÛ\8cاÛ\8c ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا",
        "action-suppressrevision": "مشاهده و احیای ویرایش‌های حذف شده",
        "action-suppressionlog": "مشاهدهٔ این سیاههٔ خصوصی",
        "action-block": "قطع دسترسی این کاربر از ویرایش‌کردن",
        "action-userrights-interwiki": "ویرایش اختیارات کاربری کاربران یک ویکی دیگر",
        "action-siteadmin": "قفل‌کردن و بازکردن پایگاه داده‌ها",
        "action-sendemail": "ارسال ایمیل",
+       "action-editmyoptions": "ویرایش ترجیحاتتان",
        "action-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید",
        "action-viewmywatchlist": "فهرست پیگیری‌های خود را ببینید",
        "action-viewmyprivateinfo": "اطلاعات خصوصی خود را ببینید",
        "recentchanges": "تغییرات اخیر",
        "recentchanges-legend": "گزینه‌های تغییرات اخیر",
        "recentchanges-summary": "آخرین تغییرات ویکی را در این صفحه پی‌گیری کنید.",
-       "recentchanges-noresult": "هیچ تغییری در طول دورهٔ تعیین‌شده با این معیارها هم‌خوانی نداشت.",
+       "recentchanges-noresult": "در فاصله زمانی ارائه شده هیچ تغییری با این معیارهای صورت نگرفته است",
        "recentchanges-feed-description": "آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.",
        "recentchanges-label-newpage": "این ویرایش صفحه‌ای تازه ایجاد کرد",
        "recentchanges-label-minor": "این یک ویرایش جزئی است",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
        "recentchanges-legend-plusminus": "(<em>±۱۲۳</em>)",
        "recentchanges-submit": "نمایش",
+       "rcfilters-activefilters": "پالایه‌های فعال",
+       "rcfilters-quickfilters": "پیوندهای سریع",
+       "rcfilters-savedqueries-defaultlabel": "پالایه‌های ذخیره‌شده",
+       "rcfilters-savedqueries-rename": "تغییر نام",
+       "rcfilters-savedqueries-setdefault": "تنظیم به عنوان پیش‌فرض",
+       "rcfilters-savedqueries-unsetdefault": "حذف از پیش‌فرض",
+       "rcfilters-savedqueries-remove": "حذف",
+       "rcfilters-savedqueries-new-name-label": "نام",
+       "rcfilters-savedqueries-apply-label": "ایجاد پیوند سریع",
+       "rcfilters-savedqueries-cancel-label": "لغو",
+       "rcfilters-savedqueries-add-new-title": "ذخیرهٔ پالایه‌ها به عنوان پیوند سریع",
+       "rcfilters-restore-default-filters": "بازگردانی پالایه‌های پیش‌فرض",
+       "rcfilters-clear-all-filters": "پاک‌کردن تمام پالایه‌ها",
+       "rcfilters-search-placeholder": "پالایش تغییرات اخیر (جستجو یا شروع به تایپ)",
+       "rcfilters-invalid-filter": "پالایهٔ نامعتبر",
+       "rcfilters-empty-filter": "پالایه‌ای فعال نیست. همهٔ مشارکت‌های دیده می‌شوند.",
+       "rcfilters-filterlist-title": "پالایه‌ها",
+       "rcfilters-filterlist-whatsthis": "این چیست؟",
+       "rcfilters-filterlist-feedbacklink": "ارسال بازخورد برای پالایه‌های جدید (آزمایشی)",
+       "rcfilters-highlightbutton-title": "پررنگ کردن نتایج",
+       "rcfilters-highlightmenu-title": "انتخاب رنگ",
+       "rcfilters-highlightmenu-help": "یک رنگ انتخاب کنید تا این خصوصیت پر رنگ شود",
+       "rcfilters-filterlist-noresults": "پالایه‌ای یافت نشد",
+       "rcfilters-noresults-conflict": "نتیجه‌ای یافت نشد چون محدودهٔ جستجو دارای تعارض است",
+       "rcfilters-state-message-subset": "این پالایه تاثیری ندارد چون نتایج آن توسط {{PLURAL:$2|پالایهٔ|پالایه‌های}} گسترده‌تری که در ادامه {{PLURAL:$2|آمده‌است|آمده‌اند}} شامل می‌شود (از پررنگ‌کننده برای تمایز استفاده کنید): $1",
+       "rcfilters-state-message-fullcoverage": "انتخاب تمام پالایه‌ها در یک گروه مثل این است که هیچ‌کدام را انتخاب نکنید، بنابراین پالایه‌ها اثری نداشتند. گروه شامل این موارد است: $1",
+       "rcfilters-filtergroup-registration": "ثبت نام کاربر",
+       "rcfilters-filter-registered-label": "ثبت شده",
+       "rcfilters-filter-registered-description": "ویرایشگران وارد شده به سامانه.",
+       "rcfilters-filter-unregistered-label": "ثبت‌نام نکرده",
+       "rcfilters-filter-unregistered-description": "ویرایشگرانی که به سامانه وارد نشده‌اند.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "این پالایه با {{PLURAL:$2|پالایه|پالایه‌های}} تجربهٔ زیر که فقط کاربران ثبت‌نام شده را {{PLURAL:$2|می‌یابد|می‌یابند}} تعارض دارد: $1",
+       "rcfilters-filtergroup-authorship": "ویرایشگر",
+       "rcfilters-filter-editsbyself-label": "تغییریافته توسط شما",
+       "rcfilters-filter-editsbyself-description": "ویرایش‌های شما.",
+       "rcfilters-filter-editsbyother-label": "تغییریافته توسط دیگران",
+       "rcfilters-filter-editsbyother-description": "همهٔ تغییرات به جز تغییرات شما.",
+       "rcfilters-filtergroup-userExpLevel": "درجهٔ تجربه (فقط برای کاربران ثبت‌نام کرده)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "پالایه‌های تجربه فقط کاربران ثبت‌نام کرده را پیدا می‌کنند، در نتیجه با پالایهٔ «کاربران ثبت‌نام نکرده» تعارض دارند.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "پالایه «کاربران ثبت‌نام نکرده» با یک یا چند مورد از پالایه‌های تجربه در تعارض است. پالایه‌های دیگر در قسمت «پالایه‌های فعال» در بالا نشان داده شده‌اند.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "تازه‌واردها",
+       "rcfilters-filter-user-experience-level-newcomer-description": "کمتر از ۱۰ ویرایش یا ۴ روز فعالیت.",
+       "rcfilters-filter-user-experience-level-learner-label": "آموزندگان",
+       "rcfilters-filter-user-experience-level-learner-description": "تجربهٔ بیشتر از تازه‌واردان ولی کمتر از کاربران باتجریه.",
+       "rcfilters-filter-user-experience-level-experienced-label": "کاربران باتجربه",
+       "rcfilters-filter-user-experience-level-experienced-description": "بیشتر از ۳۰ روز فعالیت و ۵۰۰ ویرایش.",
+       "rcfilters-filtergroup-automated": "ویرایش‌های خودکار",
+       "rcfilters-filter-bots-label": "ربات",
+       "rcfilters-filter-bots-description": "ویرایش توسط ابزارهای خودکار.",
+       "rcfilters-filter-humans-label": "انسان (ربات نه)",
+       "rcfilters-filter-humans-description": "ویرایش توسط انسان.",
+       "rcfilters-filtergroup-reviewstatus": "وضعیت بازبینی",
+       "rcfilters-filter-patrolled-label": "گشت‌خورده",
+       "rcfilters-filter-patrolled-description": "ویرایش‌های گشت‌خورده.",
+       "rcfilters-filter-unpatrolled-label": "گشت‌نخورده",
+       "rcfilters-filter-unpatrolled-description": "ویرایش‌های گشت‌نخورده.",
+       "rcfilters-filtergroup-significance": "اهمیت",
+       "rcfilters-filter-minor-label": "ویرایش‌های جزئی",
+       "rcfilters-filter-minor-description": "ویرایش‌هایی که به عنوان جزئی برچسب خورده‌اند.",
+       "rcfilters-filter-major-label": "ویرایش‌های غیرجزئی",
+       "rcfilters-filter-major-description": "ویرایش‌هایی که برچسب جزئی نخوردند.",
+       "rcfilters-filtergroup-watchlist": "صفحه‌های پی‌گیری‌شده",
+       "rcfilters-filter-watchlist-watched-label": "پی‌گیری‌شده",
+       "rcfilters-filter-watchlist-watched-description": "تغییرات در صفحه‌هایی که در فهرست پی‌گیری شما هستند.",
+       "rcfilters-filter-watchlist-watchednew-label": "تغییرات اخیر در فهرست پی‌گیری",
+       "rcfilters-filter-watchlist-watchednew-description": "تغییرات در صفحه‌هایی در فهرست پی‌گیری شما که از زمان تغییرشان آن‌ها را بازدید نکرده‌اید.",
+       "rcfilters-filter-watchlist-notwatched-label": "پی‌گیری‌نشده",
+       "rcfilters-filter-watchlist-notwatched-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": "فعالیت‌های مدیریتی، ایجاد حساب، حذف صفحه، بارگذاری‌ها ....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "پالایهٔ «ویرایش جزئی» با یک یا چند تا از پالایه‌های «نوع تغییرات» تعارض دارد چرا که برخی از انواع تغییرات را نمی‌توان به عنوان «جزئی» علامت زد. پالایه‌های دیگر در قسمت «پالایه‌های فعال» در بالا نشان داده شده‌اند.",
+       "rcfilters-hideminor-conflicts-typeofchange": "برخی از انواع تغییرات را نمی‌توان به عنوان «جزئی» علامت زد، به همین خاطر این پالایه با پالایه‌های «نوع تغییرات» که در ادامه آمده در تعارض است: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "این پالایهٔ «نوع تغییرات» با پالایهٔ «تغییرات جزئی» در تعارض است. برخی از انواع تغییرات را نمی‌توان به عنوان «جزئی» علامت زد.",
+       "rcfilters-filtergroup-lastRevision": "آخرین نسخه",
+       "rcfilters-filter-lastrevision-label": "آخرین نسخه",
+       "rcfilters-filter-lastrevision-description": "جدیدترین تغییر در یک صفحه.",
+       "rcfilters-filter-previousrevision-label": "نسخه‌های قبلی",
+       "rcfilters-filter-previousrevision-description": "تمام تغییراتی که تازه‌ترین تغییر در یک صفحه نیستند.",
        "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
+       "rclistfromreset": "از نو کردن انتخاب تاریخ",
        "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
        "rcshowhidecategorization": "$1 رده‌بندی صفحه‌ها",
        "rcshowhidecategorization-show": "نمایش",
        "rcshowhidecategorization-hide": "نهفتن",
-       "rclinks": "نمایش آخرین $1 تغییر در $2 روز اخیر<br />$3",
+       "rclinks": "نمایش آخرین $1 تغییر در $2 روز اخیر",
        "diff": "تفاوت",
        "hist": "تاریخچه",
        "hide": "نهفتن",
        "php-uploaddisabledtext": "بارگذاری پرونده‌های پی‌اچ‌پی غیرفعال است.\nلطفاً تنظیمات file_uploads را بررسی کنید.",
        "uploadscripted": "این صفحه حاوی کد اچ‌تی‌ام‌ال یا اسکریپتی است که ممکن است به‌نادرست توسط مرورگر وب تفسیر شود.",
        "upload-scripted-pi-callback": "نمی‌توان یک پرونده شامل دستورالعمل پردازش استایل‌شیت اکس‌ام‌ال بارگذاری کرد.",
+       "upload-scripted-dtd": "امکان بارگذاری پرونده‌های اس‌وی‌جی که حاوی تعارف دی‌تی‌دی غیر استاندارد باشند وجود ندارد.",
        "uploaded-script-svg": "عنصر قابل برنامه‌ریزی «$1» در پرونده بارگذاری اس‌وی‌جی یافت شد.",
        "uploaded-hostile-svg": "سی‌اس‌اس نا امن در عنصر سبک پروندهٔ بارگذاری شدهٔ اس‌وی‌جی یافت شد.",
        "uploaded-event-handler-on-svg": "قرار دادن ویژگی‌های مدیریت رویداد <code>$1=\"$2\"</code> در پرونده‌های اس‌وی‌جی مجاز نیست.",
        "filejournal-fail-dbconnect": "امکان وصل شدن به پایگاه داده دفترخانه برای پشتیبان ذخیره‌سازی «$1» وجود نداشت.",
        "filejournal-fail-dbquery": "امکان به روز کردن پایگاه داده دفترخانه برای پشتیبان ذخیره‌سازی «$1» وجود نداشت.",
        "lockmanager-notlocked": "نمی‌توان قفل «$1» را گشود؛ چون قفل نشده‌است.",
-       "lockmanager-fail-closelock": "امکان بستن پرونده قفل شده \"$1\" وجود ندارد.",
-       "lockmanager-fail-deletelock": "امکان حذف پرونده قفل شده \"$1\" وجود ندارد.",
+       "lockmanager-fail-closelock": "امکان بستن پروندهٔ قفل‌شدهٔ «$1» وجود ندارد.",
+       "lockmanager-fail-deletelock": "امکان حذف پروندهٔ قفل‌شدهٔ «$1» وجود ندارد.",
        "lockmanager-fail-acquirelock": "نمی‌توان قفل «$1» را کسب کرد.",
-       "lockmanager-fail-openlock": "امکان باز کردن پرونده قفل شده \"$1\" وجود ندارد.",
+       "lockmanager-fail-openlock": "امکان باز کردن پروندهٔ قفل‌شدهٔ «$1» وجود ندارد.",
        "lockmanager-fail-releaselock": "نمی‌توان قفل «$1» را گشود.",
        "lockmanager-fail-db-bucket": "امکان ارتباط با تعداد کافی پایگاه داده قفل‌ها در محفظه $1 وجود نداشت.",
        "lockmanager-fail-db-release": "بازکردن قفل‌های پایگاه دادهٔ $1 ممکن نیست.",
        "uncategorizedcategories": "رده‌های رده‌بندی‌نشده",
        "uncategorizedimages": "پرونده‌های رده‌بندی‌نشده",
        "uncategorizedtemplates": "الگوهای رده‌بندی‌نشده",
+       "uncategorized-categories-exceptionlist": "# شامل فهرست رده‌هایی که باید در ویژه:رده‌های_رده‌بندی‌نشده اصلاح شوند. هر خطی که با \"*\" شروع شده‌است. خطوطی که با نویسه‌های دیگر شروع شده‌اند در نظر گرفته نمی‌شوند (حتی فاصله). برای توضیحات از \"#\" استفاده کنید.",
        "unusedcategories": "رده‌های استفاده‌نشده",
        "unusedimages": "پرونده‌های استفاده‌نشده",
        "wantedcategories": "رده‌های مورد نیاز",
        "protectedpages-timestamp": "برچسب زمان",
        "protectedpages-page": "صفحه",
        "protectedpages-expiry": "انقضا",
-       "protectedpages-performer": "کاربر حفاظت‌کننده",
-       "protectedpages-params": "پارامترهای حفاظت",
+       "protectedpages-performer": "کاربر محافظت‌کننده",
+       "protectedpages-params": "پارامترهای محافظت",
        "protectedpages-reason": "دلیل",
        "protectedpages-submit": "نمایش صفحه‌ها",
        "protectedpages-unknown-timestamp": "ناشناس",
        "pager-older-n": "{{PLURAL:$1|یک مورد قدیمی‌تر|$1 مورد قدیمی‌تر}}",
        "suppress": "سرکوب",
        "querypage-disabled": "این صفحه ویژه به دلایل عملکردی غیرفعال شده‌است.",
-       "apihelp": "راهنمای API",
-       "apihelp-no-such-module": "پودمان \" $1 \" یافت نشد.",
+       "apihelp": "راهنمای رابط برنامه‌نویسی",
+       "apihelp-no-such-module": "پودمان «$1» یافت نشد.",
        "apisandbox": "گودال ماسه‌بازی رابط برنامه‌نویسی",
-       "apisandbox-jsonly": "برای استفاده از صفحهٔ تمرین API به جاوااسکریپت نیاز دارید.",
+       "apisandbox-jsonly": "برای استفاده از صفحهٔ تمرین رابط برنامه‌نویسی به جاوااسکریپت نیاز دارید.",
        "apisandbox-api-disabled": "رابط برنامه‌نویسی در این تارنما غیرفعال شده‌است.",
-       "apisandbox-intro": "از این صفحه برای آزمایش <strong>خدمات وب API مدیاویکی</strong> استفاده کنید.\nبرای جزئیات بیشتر دربارهٔ نحوهٔ استفاده از API به [[mw:API:Main page|مستندات API]] رجوع کنید. مثال: [https://www.mediawiki.org/wiki/API#A_simple_example دریافت محتوای صفحهٔ اصلی]. برای دیدن مثال‌های بیشتر عملکردی را انتخاب کنید.",
+       "apisandbox-intro": "از این صفحه برای آزمایش <strong>خدمات وب رابط برنامه‌نویسی مدیاویکی</strong> استفاده کنید.\nبرای جزئیات بیشتر دربارهٔ نحوهٔ استفاده از رابط برنامه‌نویسی به [[mw:API:Main page|مستندات رابط برنامه‌نویسی]] رجوع کنید. مثال: [https://www.mediawiki.org/wiki/API#A_simple_example دریافت محتوای صفحهٔ اصلی]. برای دیدن مثال‌های بیشتر عملکردی را انتخاب کنید.",
        "apisandbox-fullscreen": "گسترش پنل",
        "apisandbox-fullscreen-tooltip": "بازکردن صفحهٔ تمرین برای پر کردن پنجرهٔ مرورگر.",
        "apisandbox-unfullscreen": "نمایش صفحه",
        "apisandbox-submit": "ایجاد درخواست",
        "apisandbox-reset": "پاک‌کردن",
        "apisandbox-retry": "تلاش مجدد",
-       "apisandbox-loading": "بارگÛ\8cرÛ\8c Ø§Ø·Ù\84اعات Ø¨Ø±Ø§Û\8c Ù\85اÚ\98Ù\88Ù\84 \"$1\" ...",
-       "apisandbox-load-error": "در Ø²Ù\85اÙ\86 Ø¨Ø§Ø±Ú¯Û\8cرÛ\8c Ø§Ø·Ù\84اعات Ø¨Ø±Ø§Û\8c Ù\85اÚ\98Ù\88Ù\84 \"$1\" Ø®Ø·Ø§Û\8cÛ\8c Ø±Ø® Ø¯Ø§Ø¯Ù\87â\80\8cاست: $2",
-       "apisandbox-no-parameters": "اÛ\8cÙ\86 Ù\85اÚ\98Ù\88Ù\84 API پارامتری ندارد.",
+       "apisandbox-loading": "بارگÛ\8cرÛ\8c Ø§Ø·Ù\84اعات Ø¨Ø±Ø§Û\8c Ù¾Ù\88دÙ\85اÙ\86 Ø±Ø§Ø¨Ø· Ø¨Ø±Ù\86اÙ\85Ù\87â\80\8cÙ\86Ù\88Û\8cسÛ\8c Â«$1» ...",
+       "apisandbox-load-error": "در Ø²Ù\85اÙ\86 Ø¨Ø§Ø±Ú¯Û\8cرÛ\8c Ø§Ø·Ù\84اعات Ø¨Ø±Ø§Û\8c Ù¾Ù\88دÙ\85اÙ\86 Ø±Ø§Ø¨Ø· Ø¨Ø±Ù\86اÙ\85Ù\87â\80\8cÙ\86Ù\88Û\8cسÛ\8c Â«$1» Ø®Ø·Ø§Û\8cÛ\8c Ø±Ø® Ø¯Ø§Ø¯: $2",
+       "apisandbox-no-parameters": "اÛ\8cÙ\86 Ù¾Ù\88دÙ\85اÙ\86 Ø±Ø§Ø¨Ø· Ø¨Ø±Ù\86اÙ\85Ù\87â\80\8cÙ\86Ù\88Û\8cسÛ\8c پارامتری ندارد.",
        "apisandbox-helpurls": "پیوندهای راهنمایی",
        "apisandbox-examples": "مثال‌ها",
        "apisandbox-dynamic-parameters": "پارامترهای بیشتر",
        "apisandbox-results": "نتیجه‌ها",
        "apisandbox-sending-request": "ارسال درخواست ای‌پی‌آی...",
        "apisandbox-loading-results": "دریافت درخواست‌های ای‌پی‌آی...",
-       "apisandbox-results-error": "در زمان بارگیری پاسخ کوئری API خطایی رخ داده‌است: $1.",
+       "apisandbox-results-error": "در زمان بارگیری پاسخ پرسمان از رابط برنامه‌نویسی خطایی رخ داد: $1.",
+       "apisandbox-request-selectformat-label": "نمایش داده‌های درخواست به عنوان:",
+       "apisandbox-request-format-url-label": "آدرس اینترنتی متن پرسمان",
        "apisandbox-request-url-label": "درخواست آدرس:",
+       "apisandbox-request-json-label": "درخواست JSON:",
        "apisandbox-request-time": "زمان درخواست: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "توکن را اصلاح کنید و از نو ارسال کنید",
        "apisandbox-results-fixtoken-fail": "خطا در دریافت توکن \"$1\"",
        "emailccsubject": "رونوشت پیغام شما به $1: $2",
        "emailsent": "ایمیل ارسال شد",
        "emailsenttext": "پیام ایمیل شما فرستاده شد.",
-       "emailuserfooter": "این ایمیل با استفاده از ویژگی «{{int:emailuser}}» {{SITENAME}} توسط $1 به {{GENDER:$2|$2}} {{GENDER:$1|ارسال شد}}.",
+       "emailuserfooter": "این ایمیل با استفاده از ویژگی «{{int:emailuser}}» {{SITENAME}} توسط $1 به {{GENDER:$2|$2}} {{GENDER:$1|ارسال شد}}.\n\nاگر {{GENDER:$2|شما}} به این ایمیل پاسخ دهید، به {{GENDER:$2|فرستنده}} ایمیل اصلی را ارسال {{GENDER:$1|کنید}}، آدرس ایمیل شما برای {{GENDER:$1|آنها}} ارسال می‌شود.",
        "usermessage-summary": "گذاشتن پیغام سامانه.",
        "usermessage-editor": "پیغام رسان سامانه",
        "watchlist": "فهرست پی‌گیری",
        "editcomment": "خلاصهٔ ویرایش این بود:  <em>«$1»</em>.",
        "revertpage": "ویرایش [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]]) به آخرین تغییری که [[User:$1|$1]] انجام داده بود واگردانده شد",
        "revertpage-nouser": "ویرایش‌های انجام‌شده توسط (نام کاربری حذف شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.",
-       "rollback-success": "ویرایش‌های $1 واگردانی شد؛\nصفحه به آخرین ویرایش $2 برگردانده شد.",
+       "rollback-success": "ویرایش‌های {{GENDER:$3|$1}} واگردانی شد؛\nصفحه به آخرین ویرایش {{GENDER:$4|$2}} برگردانده شد.",
        "rollback-success-notify": "ویرایش‌های توسط $1 واگردانی شد؛\nبه آخرین نسخه توسط $2 بازگردانی شد. [$3 نمایش تغییرات]",
        "sessionfailure-title": "خطای نشست کاربری",
        "sessionfailure": "به نظر می‌رسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربوده‌شدن اطلاعات نشست کاربری، لغو شد.\nلطفاً دکمهٔ «بازگشت» را در مرورگر خود بفشارید و صفحه‌ای که از آن به اینجا رسیده‌اید را دوباره فراخوانی کنید، سپس مجدداً سعی کنید.",
        "changecontentmodel-emptymodels-title": "هيچ مدل محتوایی در دسترس نيست",
        "changecontentmodel-emptymodels-text": "محتوای موجود در [[:$1]] به هيچ نوعی نمی‌تواند تبديل شود.",
        "log-name-contentmodel": "سیاهه تغییر نمونه محتوی",
-       "log-description-contentmodel": "رÙ\88Û\8cدادÙ\87اÛ\8c Ù\85رتبط Ø¨Ø§ Ù\86Ù\85Ù\88Ù\86Ù\87 Ù\85حتÙ\88Û\8câ\80\8cÙ\87اÛ\8c Û\8cÚ© ØµÙ\81Ø­Ù\87",
+       "log-description-contentmodel": "اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87 ØªØºÛ\8cÛ\8cرات Ù\85حتÙ\88Û\8c ØµÙ\81حاتÛ\8c Ú©Ù\87 Ø¨Ø§ Ù\85حتÙ\88Û\8c ØºÛ\8cر Ø§Ø² Ù¾Û\8cØ´â\80\8cÙ\81رض Ø§Û\8cجاد Ø´Ø¯Ù\87â\80\8cاÙ\86دØ\8c Ø±Ø§ Ù\81Ù\87رست Ù\85Û\8câ\80\8cÚ©Ù\86د.",
        "logentry-contentmodel-new": "صفحهٔ $3 با استفاده از مدل‌های محتوایی غیر پیش‌فرض «$5» توسط $1 {{GENDER:$2|ساخته شد}}",
        "logentry-contentmodel-change": "نمونه محتوای صفحهٔ $3 از \"$4\" به \"$5\" توسط $1 {{GENDER:$2|تغییر داده شد}}",
        "logentry-contentmodel-change-revertlink": "واگردانی",
        "modifiedarticleprotection-comment": "سطح محاظفت «[[$1]]» را {{GENDER:$2|تغییر داد}}",
        "unprotectedarticle-comment": "«[[$1]]» را از محافظت {{GENDER:$2|در آورد}}",
        "protect-title": "تغییر وضعیت محافظت «$1»",
-       "protect-title-notallowed": "مشاهده سطح حفاظت  \" $1 \"",
+       "protect-title-notallowed": "مشاهدهٔ سطح محافظت «$1»",
        "prot_1movedto2": "[[$1]] به [[$2]] منتقل شد",
        "protect-badnamespace-title": "فضای نام بدون محافظت",
        "protect-badnamespace-text": "صفحه‌های موجود در این فضای نام، نمی‌توانند محافظت شوند.",
        "undeleteviewlink": "نمایش",
        "undeleteinvert": "وارونه کردن انتخاب",
        "undeletecomment": "دلیل:",
-       "undeletedrevisions": "$1 نسخه احیا {{PLURAL:$1|شد}}",
-       "undeletedrevisions-files": "$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
-       "undeletedfiles": "$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
        "cannotundelete": "تمام یا بخشی از احیا ناموفق بود:\n$1",
        "undeletedpage": "'''$1 احیا شد'''\n\nبرای دیدن سیاههٔ حذف‌ها و احیاهای اخیر به  [[Special:Log/delete|سیاههٔ حذف]] رجوع کنید.",
        "undelete-header": "برای دیدن صفحه‌های حذف‌شدهٔ اخیر [[Special:Log/delete|سیاههٔ حذف]] را ببینید.",
        "sp-contributions-uploads": "بارگذاری‌ها",
        "sp-contributions-logs": "سیاهه‌ها",
        "sp-contributions-talk": "بحث",
-       "sp-contributions-userrights": "مدیریت اختیارات کاربر",
+       "sp-contributions-userrights": "مدیریت اختیارات {{GENDER:$1|کاربر}}",
        "sp-contributions-blocked-notice": "این کاربر در حال حاضر بسته شده‌است.\nآخرین سیاههٔ بسته شدن در زیر آمده‌است:",
        "sp-contributions-blocked-notice-anon": "این نشانی آی‌پی در حال حاضر بسته است.\nآخرین سیاههٔ بسته شدن در زیر آمده‌است:",
        "sp-contributions-search": "جستجوی مشارکت‌ها",
        "unblocked-id": "قطع دسترسی شماره $1 خاتمه یافت",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] رفع قطع دسترسی شد.",
        "blocklist": "کاربران بسته‌شده",
+       "autoblocklist": "قطع دسترسی‌های خودکار",
+       "autoblocklist-submit": "جستجو کن",
+       "autoblocklist-legend": "فهرست قطع دسترسی‌های خودکار",
+       "autoblocklist-localblocks": "{{PLURAL:$1|قطع دسترسی خودکار|قطع دسترسی‌های خودکار}} به صورت محلی",
+       "autoblocklist-empty": "فهرست قطع دسترسی‌های خودکار خالی‌ست.",
+       "autoblocklist-otherblocks": "سایر {{PLURAL:$1|قطع دسترسی خودکار|قطع دسترسی‌های خودکار}}",
        "ipblocklist": "کاربران بسته‌شده",
        "ipblocklist-legend": "جستجوی کاربر بسته شده",
        "blocklist-userblocks": "پنهان کردن بسته‌شدن‌های حساب",
        "proxyblockreason": "نشانی آی‌پی شما بسته شده است چون متعلق به یک پروکسی باز است.\nلطفاً با ارائه دهندهً خدمات اینترنت خود یا پشتیبانی فنی تماس بگیرید و آنها را از این مشکل امنیتی جدی آگاه کنید.",
        "sorbsreason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده است.",
        "sorbs_create_account_reason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.\nشما اجازهٔ ساختن حساب کاربری ندارید.",
+       "softblockrangesreason": "کاربران ثبت‌نام نکرده نمی‌توانند از IP شما ($1) برای ویرایش استفاده کنند. لطفاً به سامانه وارد شوید.",
        "xffblockreason": "نشانی آی‌پی در X-Forwarded-For header موجود است و پروکسی شما یا سروری که از آن استفاده می‌کنید بسته‌شده‌است. دلیل بسته‌شدن: $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": "صفحه منتقل شود",
        "tooltip-pt-mycontris": "فهرست مشارکت‌های {{GENDER:|شما}}",
        "tooltip-pt-anoncontribs": "فهرست ویرایش‌ها انجام شده از این نشانی آی‌پی",
        "tooltip-pt-login": "توصیه می‌شود که به سامانه وارد شوید، گرچه اجباری نیست",
+       "tooltip-pt-login-private": "برای استفاده از این ویکی نیاز است که به سامانه وارد شوید",
        "tooltip-pt-logout": "خروج از سامانه",
        "tooltip-pt-createaccount": "از شما دعوت می‌شود که حساب کاربری بسازید و به سامانه وارد شوید؛ هرچند که ساخت حساب کاربری اختیاری است.",
        "tooltip-ca-talk": "گفتگو پیرامون محتوای صفحه",
        "pageinfo-not-current": "متأسفانه تهیه اطلاعات ویرایش‌های قدیمی غیرممکن است.",
        "pageinfo-header-basic": "اطلاعات اولیه",
        "pageinfo-header-edits": "ویرایش تاریخچه",
-       "pageinfo-header-restrictions": "حفاظت از صفحه",
+       "pageinfo-header-restrictions": "محافظت از صفحه",
        "pageinfo-header-properties": "ويژگی‌های صفحه",
        "pageinfo-display-title": "نمایش عنوان",
        "pageinfo-default-sort": "کلید مرتب‌سازی پیش‌فرض",
        "pageinfo-length": "حجم صفحه  (بایت)",
        "pageinfo-article-id": "شناسهٔ صفحه",
        "pageinfo-language": "زبان محتوای صفحه",
+       "pageinfo-language-change": "تغییر",
        "pageinfo-content-model": "ساختار محتوای صفحه",
        "pageinfo-content-model-change": "تغییر",
        "pageinfo-robot-policy": "‌فهرست‌کردن توسط ربات‌ها",
        "newimages-summary": "این صفحهٔ ویژه آخرین پرونده‌های بارگذاری شده را نمایش می‌دهد",
        "newimages-legend": "پالودن",
        "newimages-label": "نام پرونده (یا قسمتی از آن):",
+       "newimages-user": "نشانی آی‌پی یا نام کاربری",
        "newimages-showbots": "نمایش بارگذاری‌ها توسط ربات‌ها",
        "newimages-hidepatrolled": "مخفی کردن بارگذاری گشت‌زن‌ها",
        "noimages": "چیزی برای دیدن نیست.",
        "confirmrecreate": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این مقاله را پس از اینکه شما آغاز به ویرایش آن نموده‌اید به دلیل زیر حذف کرده است :\n: ''$2'' \nلطفاً تأیید کنید که مجدداً می‌خواهید این مقاله را بسازید.",
        "confirmrecreate-noreason": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این صفحه را پس از شروع ویرایش‌تان {{GENDER:$1|پاک}} کرده‌است.  لطفاً تأیید کنید که شما واقعاً می‌خواهید آن را دوباره ایجاد کنید.",
        "recreate": "باز ایجاد",
+       "confirm-purge-title": "خالی کردن کاشه این صفحه",
        "confirm_purge_button": "تأیید",
        "confirm-purge-top": "پاک کردن نسخهٔ حافظهٔ نهانی (Cache) این صفحه را تأیید می‌کنید؟",
        "confirm-purge-bottom": "خالی کردن میانگیر یک صفحه باعث می‌شود که آخرین نسخهٔ آن نمایش یابد.",
        "htmlform-user-not-valid": "حساب کاربری <strong>$1</strong> معتبر نیست.",
        "logentry-delete-delete": "$1 صفحهٔ $3 را {{GENDER:$2|حذف کرد}}",
        "logentry-delete-delete_redir": "$1 تغییرمسیر $3 را با رونویسی {{GENDER:$2|حذف کرد}}",
-       "logentry-delete-restore": "$1 صفحهٔ $3 را {{GENDER:$2|احیا کرد}}",
+       "logentry-delete-restore": "$1 صفحهٔ $3 را {{GENDER:$2|احیا کرد}} ($4)",
+       "logentry-delete-restore-nocount": "$1 صفحهٔ $3 را {{GENDER:$2|احیا کرد}}",
+       "restore-count-revisions": "{{PLURAL:$1|یک نسخه|$1 نسخه}}",
+       "restore-count-files": "{{PLURAL:$1|یک پرونده|$1 پرونده}}",
        "logentry-delete-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاهه|$5 مورد سیاهه}} را در $3 {{GENDER:$2|تغییر داد}}: $4",
        "logentry-delete-revision": "$1 پیدایی {{PLURAL:$5|یک نسخه|$5 نسخه}} صفحه $3 را {{GENDER:$2|تغییر داد}}: $4",
        "logentry-delete-event-legacy": "$1 پیدایی موارد سیاهه را در $3 {{GENDER:$2|تغییر داد}}",
        "logentry-protect-protect": "$1 $3 را {{GENDER:$2|محافظت کرد}} $4",
        "logentry-protect-protect-cascade": "$1 $3 $4 {{GENDER:$2|محافظت کرد}} [آبشاری]",
        "logentry-protect-modify": "$1 سطح محافظت $3 را {{GENDER:$2|تغییر داد}} $4",
-       "logentry-protect-modify-cascade": "$1 سطح حفاظت برای $3 $4 را {{GENDER:$2|تغییر داد}}[آبشاری]",
+       "logentry-protect-modify-cascade": "$1 سطح محافظت $3 را {{GENDER:$2|تغییر داد}} به $4 [آبشاری]",
        "logentry-rights-rights": "$1 دسترسی $3 را از گروه $4 به $5 تغییر داد",
        "logentry-rights-rights-legacy": "$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}",
        "logentry-rights-autopromote": "$1 به طور خودکار از $4 به $5 {{GENDER:$2|ارتقاء یافت}}",
        "logentry-tag-update-revision": "$1 برچسب نسخهٔ $4 صفحهٔ $3 را {{GENDER:$2|به‌روز کرد}} ($6 {{PLURAL:$7|افزوده‌شد}}؛ $8 {{PLURAL:$9|حذف شد}})",
        "logentry-tag-update-logentry": "$1 برچسب سیاههٔ $5 صفحهٔ $3 را {{GENDER:$2|به‌روز کرد}} ($6 {{PLURAL:$7|افزوده‌شد}}؛ $8 {{PLURAL:$9|حذف شد}})",
        "rightsnone": "(هیچ)",
-       "revdelete-summary": "خلاصه ویرایش",
+       "rightslogentry-temporary-group": "$1 (موقت، تا $2)",
        "feedback-adding": "افزودن بازخورد به صفحه...",
        "feedback-back": "بازگشت",
        "feedback-bugcheck": "عالی‌است! فقط بررسی کنید که از [$1 ایرادهای شناخته‌شده] نباشد.",
        "feedback-external-bug-report-button": "پرونده‌سازی یک عمل فنی",
        "feedback-dialog-title": "ارسال یک بازخورد",
        "feedback-dialog-intro": "شما می توانید از فرم زیر برای بازخورد استفاده کنید. متن شما همراه با نام کاربریتان به صفحهٔ \"$1\" افزوده خواهد شد.",
-       "feedback-error1": "خطا: پاسخ‌های ناشناخته از رابط برنامه‌نویسی نرم‌افزار",
+       "feedback-error1": "خطا: پاسخ‌های ناشناخته از رابط برنامه‌نویسی",
        "feedback-error2": "خطا: شکست در ویرایش",
-       "feedback-error3": "خطا: عدم پاسخ از رابط برنامه‌نویسی نرم‌افزار",
+       "feedback-error3": "خطا: عدم پاسخ از رابط برنامه‌نویسی",
        "feedback-error4": "خطا:امکان ارسال به عنوان بازخورد داده‌شده، نیست",
        "feedback-message": "پیغام:",
        "feedback-subject": "موضوع:",
        "api-error-emptypage": "ایجاد صفحه‌های خالی مجاز نیست.",
        "api-error-publishfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
-       "api-error-unknown-warning": "اخطار ناشناخته: $1",
+       "api-error-unknown-warning": "اخطار ناشناخته: \"$1\".",
        "api-error-unknownerror": "خطای ناشناخته: «$1».",
        "duration-seconds": "$1 ثانیه",
        "duration-minutes": "$1 دقیقه",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بایت|بایت}}",
        "limitreport-expansiondepth": "بیشترین عمق گسترش",
        "limitreport-expensivefunctioncount": "تعداد تابع تجزیه‌گر پرمصرف",
-       "expandtemplates": "بسطدادن الگوها",
+       "expandtemplates": "بسط دادن الگوها",
        "expand_templates_intro": "این صفحهٔ ویژه متنی را دریافت کرده و تمام الگوهای به‌کاررفته در آن را به طور بازگشتی بسط می‌دهد. همچنین تابع‌های تجزیه چون <code><nowiki>{{</nowiki>#language:…}}</code> و متغیرهایی چون  <code><nowiki>{{</nowiki>CURRENTDAY}}</code> را هم بسط می‌دهد — در واقع تقریباً هرچه را که داخل دوآکولاد باشد. این کار با صدازدن مرحلهٔ تجزیهٔ مربوط در خود مدیاویکی صورت می‌گیرد.",
        "expand_templates_title": "عنوان موضوع، برای {{FULLPAGENAME}} و غیره:",
        "expand_templates_input": "متن ورودی:",
        "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": "سیاههٔ تغییر زبان",
        "special-characters-group-thai": "تایلندی",
        "special-characters-group-lao": "لائو",
        "special-characters-group-khmer": "خمر",
+       "special-characters-group-canadianaboriginal": "بومی کانادا",
        "special-characters-title-endash": "خط فاصله",
        "special-characters-title-emdash": "خط فاسله کشیده",
        "special-characters-title-minus": "علامت منفی",
        "mw-widgets-titleinput-description-new-page": "این صفحه هنوز وجود ندارد",
        "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
        "mw-widgets-categoryselector-add-category-placeholder": "در حال افزودن رده ...",
+       "mw-widgets-usersmultiselect-placeholder": "افزودن بیشتر...",
+       "date-range-from": "از تاریخ:",
+       "date-range-to": "تا تاریخ:",
        "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-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": "ایجاد صفحه با contentmodel غیر استاندارد",
+       "log-action-filter-contentmodel-new": "ایجاد صفحه با مدل محتوای غیر استاندارد",
        "log-action-filter-delete-delete": "حذف صفحه",
        "log-action-filter-delete-delete_redir": "رونویسی تغییرمسیر",
        "log-action-filter-delete-restore": "احیای صفحه",
        "log-action-filter-patrol-patrol": "گشت غیرخودکار",
        "log-action-filter-patrol-autopatrol": "گشت خودکار",
        "log-action-filter-protect-protect": "محافظت",
-       "log-action-filter-protect-modify": "اصلاح حفاظت",
+       "log-action-filter-protect-modify": "اصلاح محافظت",
        "log-action-filter-protect-unprotect": "خروج از محافظت",
        "log-action-filter-protect-move_prot": "حرکت محافظت شده",
        "log-action-filter-rights-rights": "تغیبر دستی",
        "usercssispublic": "لطفاً توجه کنید: زیرصفحه‌های سی‌اس‌اس نباید حاوی اطلاعات محرمانه باشند چون توسط دیگران قابل مشاهده هستند.",
        "restrictionsfield-badip": "نشانی یا بازهٔ آی‌پی نامعتبر: $1",
        "restrictionsfield-label": "بازه‌های آی‌پی مجاز:",
-       "restrictionsfield-help": "یک نشانی آی‌پی یا بازهٔ سی‌آی‌دی‌ار در هر خط وارد کنید. برای فعال کردن همه‌چیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br><code>::/0</code>"
+       "restrictionsfield-help": "یک نشانی آی‌پی یا بازهٔ سی‌آی‌دی‌ار در هر خط وارد کنید. برای فعال کردن همه‌چیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br /><code>::/0</code>",
+       "revid": "نسخهٔ $1",
+       "pageid": "شناسهٔ صفحهٔ $1",
+       "rawhtml-notallowed": "برچسب‌های &lt;html&gt; را نمی‌توان خارج از صفحه‌های معمولی استفاده کرد.",
+       "gotointerwiki": "در حال ترک {{SITENAME}}",
+       "gotointerwiki-invalid": "عنوان مشخص شده نامجاز است.",
+       "gotointerwiki-external": "شما در حال ترک {{SITENAME}} هستید تا [[$2]] را ببینید که یک وب‌گاه مجزا است.\n\n'''[$1 ادامه تا $1]'''",
+       "undelete-cantedit": "شما نمی‌توانید این صفحه را احیا کنید چون مجاز به ویرایش این صفحه نیستید.",
+       "undelete-cantcreate": "شما نمی‌توانید این صفحه را احیا کنید چرا که صفحه‌ای به این نام همینک وجود ندارد و شما مجاز به ساختن آن نیستید."
 }
index 78fa818..fe362a7 100644 (file)
        "recentchanges-label-bot": "Ngoo taƴto waɗi ɗum ko botol",
        "recentchanges-label-unpatrolled": "Ngoo taƴto suwaa tawo ƴeewteede",
        "rclistfrom": "Hollu bayle kese puɗɗiiɗe gila $3 $2",
-       "rclinks": "Hollu bayle $1 cakkitiiɗe baɗaaɗe e balɗe $2 ɓannuɗe ɗee<br />$3",
+       "rclinks": "Hollu bayle $1 cakkitiiɗe baɗaaɗe e balɗe $2 ɓannuɗe ɗee",
        "diff": "ceer",
        "hist": "aslol",
        "hide": "Suuɗ",
index 1e72167..dc08992 100644 (file)
@@ -53,7 +53,8 @@
                        "Matma Rex",
                        "BiscuitMan",
                        "Alluk.",
-                       "Tumm1"
+                       "Tumm1",
+                       "4shadoww"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "login": "Kirjaudu sisään",
        "login-security": "Varmista henkilöllisyytesi",
        "nav-login-createaccount": "Kirjaudu sisään tai luo tunnus",
-       "userlogin": "Kirjaudu sisään tai luo tunnus",
-       "userloginnocreate": "Kirjaudu sisään",
        "logout": "Kirjaudu ulos",
        "userlogout": "Kirjaudu ulos",
        "notloggedin": "Et ole kirjautunut",
        "userlogin-noaccount": "Eikö sinulla vielä ole käyttäjätunnusta?",
        "userlogin-joinproject": "Liity {{GRAMMAR:illative|{{SITENAME}}}}",
-       "nologin": "Jos sinulla ei ole vielä käyttäjätunnusta, $1.",
-       "nologinlink": "voit luoda sellaisen",
        "createaccount": "Luo uusi käyttäjätunnus",
-       "gotaccount": "Jos sinulla on jo tunnus, voit '''$1'''.",
-       "gotaccountlink": "kirjautua sisään",
-       "userlogin-resetlink": "Unohditko salasanasi?",
        "userlogin-resetpassword-link": "Unohditko salasanasi?",
        "userlogin-helplink2": "Apua sisäänkirjautumiseen",
        "userlogin-loggedin": "Olet jo kirjautunut sisään tunnuksella {{GENDER:$1|$1}}.\nKäytä alla olevaa lomaketta kirjautuaksesi sisään toisena käyttäjänä.",
        "createaccountmail": "Käytä satunnaista väliaikaissalasanaa ja lähetä se alla olevaan sähköpostiosoitteeseen",
        "createaccountmail-help": "Voidaan käyttää luomaan tunnus toiselle käyttäjälle ilman salasanan tietämistä.",
        "createacct-realname": "Oikea nimi (vapaaehtoinen tieto)",
-       "createaccountreason": "Syy:",
        "createacct-reason": "Syy",
        "createacct-reason-ph": "Miksi olet luomassa toista käyttäjätunnusta",
        "createacct-reason-help": "Tunnustenluontilokissa näytetty viesti",
        "password-login-forbidden": "Tämän käyttäjänimen ja salasanan käyttö on estetty.",
        "mailmypassword": "Hanki uusi salasana",
        "passwordremindertitle": "Uusi väliaikainen salasana {{GRAMMAR:elative|{{SITENAME}}}}",
-       "passwordremindertext": "Joku IP-osoitteesta $1 pyysi {{GRAMMAR:partitive|{{SITENAME}}}} ($4) lähettämään uuden salasanan. Väliaikainen salasana käyttäjälle $2 on nyt $3. Kirjaudu sisään ja vaihda salasana. Väliaikainen salasana vanhenee {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.\n\nJos joku muu on tehnyt tämän pyynnön, tai jos olet muistanut salasanasi ja et halua vaihtaa sitä, voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.",
+       "passwordremindertext": "Joku IP-osoitteesta $1 pyysi {{GRAMMAR:partitive|{{SITENAME}}}} ($4) lähettämään uuden salasanan. Väliaikainen salasana käyttäjälle $2 on nyt $3. Kirjaudu sisään ja vaihda salasana. Väliaikainen salasana vanhentuu {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.\n\nJos joku muu on tehnyt tämän pyynnön, tai jos olet muistanut salasanasi ja et halua vaihtaa sitä, voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.",
        "noemail": "Käyttäjälle $1 ei ole määritelty sähköpostiosoitetta.",
        "noemailcreate": "Sinun on annettava voimassa oleva sähköpostiosoite",
        "passwordsent": "Uusi salasana on lähetetty käyttäjän <b>$1</b> sähköpostiosoitteeseen.\nOle hyvä ja kirjaudu sisään kun olet saanut sen.",
        "resetpass-expired": "Salasanasi on vanhentunut. Valitse uusi salasana, jotta pääset kirjautumaan sisään.",
        "resetpass-expired-soft": "Salasanasi on vanhentunut ja se pitää uudistaa. Valitse uusi salasana nyt tai paina \"{{int:authprovider-resetpass-skip-label}}\", niin voit uudistaa salasanan myöhemmin.",
        "resetpass-validity-soft": "Salasanasi ei ole kelvollinen: $1\n\nValitse nyt uusi salasana tai paina \"{{int:authprovider-resetpass-skip-label}}\", niin voit vaihtaa sen myöhemmin.",
-       "passwordreset": "Salasanan palauttaminen",
+       "passwordreset": "Salasanan uusiminen",
        "passwordreset-text-one": "Täytä tämä lomake uudistaaksesi salasanasi.",
        "passwordreset-text-many": "{{PLURAL:$1|Täytä yksi seuraavista kentistä, jolloin saat väliaikaisen salasanan sähköpostitse.}}",
        "passwordreset-disabled": "Salasanojen uudistaminen ei ole mahdollista tässä wikissä.",
        "preview": "Esikatselu",
        "showpreview": "Esikatsele",
        "showdiff": "Näytä muutokset",
-       "blankarticle": "<strong>Varoitus:</strong> Sivu, jota olet luomassa, on tyhjä.\nJos napsautat \"{{int:savearticle}}\" uudelleen, sivu luodaan ilman sisältöä.",
+       "blankarticle": "<strong>Varoitus:</strong> Sivu, jota olet luomassa on tyhjä.\nJos napsautat \"$1\" uudelleen, sivu luodaan ilman sisältöä.",
        "anoneditwarning": "<strong>Varoitus:</strong> Et ole kirjautunut sisään. IP-osoitteesi näkyy julkisesti kaikille, jos muokkaat. Jos <strong>[$1 kirjaudut sisään]</strong> tai <strong>[$2 luot tunnuksen]</strong>, muokkauksesi kirjataan käyttäjätunnuksesi tekemiksi ja samalla saat käyttöösi hyödyllisiä välineitä.",
        "anonpreviewwarning": "''Et ole kirjautunut sisään. Tallentaminen kirjaa IP-osoitteesi tämän sivun muutoshistoriaan.''",
        "missingsummary": "Et ole antanut yhteenvetoa. Jos valitset Tallenna uudelleen, niin muokkauksesi tallennetaan ilman yhteenvetoa.",
-       "selfredirect": "<strong>Varoitus:</strong> Olet tekemässä uudelleenohjausta, joka johtaa tästä sivusta tähän samaan sivuun. \n\nOlet ehkä määrittänyt ohjauksen kohteen väärin tai kenties muokkaat parhaillaan väärää sivua.\n\nJos painat toimintoa \"{{int:savearticle}}\" uudestaan, tämä ohjaussivu luodaan joka tapauksessa.",
+       "selfredirect": "<strong>Varoitus:</strong> Olet tekemässä uudelleenohjausta, joka johtaa tästä sivusta tähän samaan sivuun. \n\nOlet ehkä määrittänyt ohjauksen kohteen väärin tai kenties muokkaat parhaillaan väärää sivua.\n\nJos painat toimintoa \"$1\" uudestaan, tämä ohjaussivu luodaan joka tapauksessa.",
        "missingcommenttext": "Kirjoita viesti alle.",
-       "missingcommentheader": "<strong>Muistutus:</strong> Et ole antanut aiheotsikkoa tälle kommentille. Napsauta ”{{int:savearticle}}”, jos haluat tallentaa kommenttisi ilman sellaista.",
+       "missingcommentheader": "<strong>Muistutus:</strong> Et ole antanut aiheotsikkoa tälle kommentille. Napsauta ”$1”, jos haluat tallentaa kommenttisi ilman sellaista.",
        "summary-preview": "Yhteenvedon esikatselu:",
        "subject-preview": "Aiheotsikon esikatselu:",
        "previewerrortext": "Muokkaustesi esikatselun toteuttamisessa on tapahtunut virhe.",
        "readonlywarning": "<strong>Varoitus: Tietokanta on lukittu huoltoa varten, joten et pysty tallentamaan muokkauksiasi juuri nyt.</strong>\nSaattaa olla paras leikata ja liimata tekstisi omaan tekstitiedostoosi ja tallentaa se tänne myöhemmin.\n\nPalvelinjärjestelmän ylläpitäjä, joka lukitsi tietokannan, antoi seuraavan perustelun: $1",
        "protectedpagewarning": "'''Varoitus: Tämä sivu on suojattu niin, että vain ylläpitäjät voivat muokata sitä.'''\nAlla on viimeisin lokitapahtuma:",
        "semiprotectedpagewarning": "<strong>Huomaa:</strong> Tämä sivu on suojattu niin, että vain rekisteröityneet käyttäjät voivat muokata sitä.\nAlla on viimeisin lokitapahtuma:",
-       "cascadeprotectedwarning": "<strong>Varoitus:</strong> Vain ylläpitäjät voivat muokata tätä sivua, koska se on sisällytetty {{PLURAL:$1|seuraavaan tarttuvasti suojattuun sivuun|seuraaviin tarttuvasti suojattuihin sivuihin}}:",
+       "cascadeprotectedwarning": "<strong>Varoitus:</strong> Vain käyttäjät, joilla on [[Special:ListGroupRights|erityisoikeuksia]], voivat muokata tätä sivua, koska se on sisällytetty {{PLURAL:$1|seuraavaan tarttuvasti suojattuun sivuun|seuraaviin tarttuvasti suojattuihin sivuihin}}:",
        "titleprotectedwarning": "'''Varoitus: Tämä sivunimi on suojattu niin, että sivun luomiseen tarvitaan [[Special:ListGroupRights|erityisiä oikeuksia]].'''\nAlla on viimeisin lokitapahtuma:",
        "templatesused": "Tällä sivulla {{PLURAL:$1|käytetty malline|käytetyt mallineet}}:",
        "templatesusedpreview": "Esikatselussa mukana {{PLURAL:$1|oleva malline|olevat mallineet}}:",
        "page_first": "ensimmäinen sivu",
        "page_last": "viimeinen sivu",
        "histlegend": "Eroavaisuuksien valinta: Merkitse niiden versioiden valintaympyrät, joita haluat vertailla, ja paina enter tai alhaalla olevaa nappia.<br />\nSelitys: '''({{int:cur}})''' = eroavaisuudet uusimpaan versioon, '''({{int:last}})''' = eroavaisuudet edeltävään versioon, '''{{int:minoreditletter}}''' = pieni muutos.",
-       "history-fieldset-title": "Selaa muutoshistoriaa",
-       "history-show-deleted": "Vain poistetut",
+       "history-fieldset-title": "Etsi versioita",
+       "history-show-deleted": "Vain poistetut versiot",
        "histfirst": "vanhimmat",
        "histlast": "uusimmat",
        "historysize": "({{PLURAL:$1|1 tavu|$1 tavua}})",
        "prefs-help-prefershttps": "Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.",
        "prefswarning-warning": "Olet tehnyt asetuksiisi muutoksia, joita ei ole vielä tallennettu.\nJos poistut sivulta klikkaamatta \"$1\", asetuksiasi ei päivitetä.",
        "prefs-tabs-navigation-hint": "Vihje: Voit käyttää vasenta ja oikeata nuolinäppäintä liikkumiseen välilehtien välillä.",
-       "userrights": "Käyttöoikeuksien hallinta",
+       "userrights": "Käyttäjän oikeudet",
        "userrights-lookup-user": "Valitse käyttäjä",
        "userrights-user-editname": "Käyttäjätunnus:",
        "editusergroup": "Lataa 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ä:",
-       "userrights-groups-help": "Voit muuttaa ryhmiä, joissa tämä käyttäjä on.\n* Merkattu valintaruutu tarkoittaa, että käyttäjä on kyseisessä ryhmässä.\n* Merkkaamaton valintaruutu tarkoittaa, että käyttäjä ei ole kyseisessä ryhmässä.\n* <nowiki>*</nowiki> tarkoittaa, että et pysty poistamaan ryhmää, kun olet sen lisännyt tai päinvastoin.\n* # tarkoittaa että voit vain asettaa tämän ryhmän päättymisajan takaisin; et voi tuoda sitä eteenpäin.",
+       "userrights-groups-help": "Voit muuttaa ryhmiä, joissa tämä käyttäjä on.\n* Merkattu valintaruutu tarkoittaa, että käyttäjä on kyseisessä ryhmässä.\n* Merkkaamaton valintaruutu tarkoittaa, että käyttäjä ei ole kyseisessä ryhmässä.\n* <nowiki>*</nowiki> tarkoittaa, että et pysty poistamaan ryhmää, kun olet sen lisännyt tai päinvastoin.\n* # tarkoittaa että voit vain siirtää tämän ryhmän jäsenten vanhentumisaikaa menneisyyttä kohti etkä lisätä aikaa.",
        "userrights-reason": "Syy:",
        "userrights-no-interwiki": "Sinulla ei ole oikeutta muokata käyttöoikeuksia muissa wikeissä.",
        "userrights-nodatabase": "Tietokantaa $1 ei ole tai se ei ole paikallinen.",
        "userrights-changeable-col": "Ryhmät, joita voit muuttaa",
        "userrights-unchangeable-col": "Ryhmät, joita et voi muuttaa",
        "userrights-expiry-current": "Vanhentuu $1",
-       "userrights-expiry-none": "Ei vanhene",
+       "userrights-expiry-none": "Ei vanhennu",
        "userrights-expiry": "Vanhentuu:",
-       "userrights-expiry-existing": "Nykyinen vanhentumisaika: $3, $2",
+       "userrights-expiry-existing": "Nykyinen vanhentumisaika: $2 kello $3",
        "userrights-expiry-othertime": "Muu aika:",
        "userrights-expiry-options": "1 päivä:1 day,1 viikko:1 week,1 kuukausi:1 month,3 kuukautta:3 months,6 kuukautta:6 months,1 vuosi:1 year",
        "userrights-conflict": "Päällekkäinen käyttöoikeuksien muutos! Tarkista tekemäsi muutokset ja vahvista ne.",
        "right-editsemiprotected": "Muokata sivuja, jotka on suojattu tasolle \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Muokata sivun sisältömallia (content model)",
        "right-editinterface": "Muokata käyttöliittymätekstejä",
-       "right-editusercssjs": "Muokata toisten käyttäjien CSS- ja JavaScript-tiedostoja",
        "right-editusercss": "Muokata toisten käyttäjien CSS-tiedostoja",
        "right-edituserjs": "Muokata toisten käyttäjien JavaScript-tiedostoja",
        "right-editmyusercss": "Muokata omia CSS-tiedostoja",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Näytä",
        "rcfilters-activefilters": "Aktiiviset suodattimet",
+       "rcfilters-quickfilters": "Pikalinkit",
+       "rcfilters-savedqueries-defaultlabel": "Tallennetut suodattimet",
+       "rcfilters-savedqueries-rename": "Nimeä uudelleen",
+       "rcfilters-savedqueries-setdefault": "Aseta oletukseksi",
+       "rcfilters-savedqueries-remove": "Poista",
+       "rcfilters-savedqueries-new-name-label": "Nimi",
+       "rcfilters-savedqueries-apply-label": "Luo pikalinkki",
+       "rcfilters-savedqueries-cancel-label": "Peru",
+       "rcfilters-savedqueries-add-new-title": "Tallenna suodattimet pikalinkkinä",
+       "rcfilters-restore-default-filters": "Palauta oletussuodattimet",
        "rcfilters-clear-all-filters": "Tyhjennä kaikki suodattimet",
-       "rcfilters-search-placeholder": "Suodattimen viimeaikaiset muutokset (selaa tai aloita kirjoittaa)",
-       "rcfilters-invalid-filter": "Suodatin on epäkelpo",
+       "rcfilters-search-placeholder": "Suodata tuoreita muutoksia (selaa tai ala kirjoittaa)",
+       "rcfilters-invalid-filter": "Virheellinen suodatin",
        "rcfilters-empty-filter": "Ei aktiivisia suodattimia. Kaikki muutokset näytetään.",
        "rcfilters-filterlist-title": "Suodattimet",
+       "rcfilters-filterlist-whatsthis": "Mikä tämä on?",
+       "rcfilters-filterlist-feedbacklink": "Anna palautetta uusista (beta) suodattimista",
+       "rcfilters-highlightbutton-title": "Korosta tulokset",
+       "rcfilters-highlightmenu-title": "Valitse väri",
+       "rcfilters-highlightmenu-help": "Valitse korostusväri tälle ominaisuudelle",
        "rcfilters-filterlist-noresults": "Ei löytynyt suodattimia",
+       "rcfilters-noresults-conflict": "Tuloksia ei löytynyt, koska hakuehdot ovat ristiriidassa",
+       "rcfilters-state-message-subset": "Tällä suodattimella ei ole vaikutusta, koska sen tulokset sisältyvät seuraaviin laajempiin suodattimiin (kokeile korostusta sen erottamiseksi): $1",
+       "rcfilters-state-message-fullcoverage": "Ryhmän kaikkien suodattimien valitseminen on sama, kuin ei valitse mitään, joten tällä suodattimella ei ole vaikutusta. Ryhmään sisältyy: $ 1",
+       "rcfilters-filtergroup-registration": "Käyttäjän rekisteröinti",
        "rcfilters-filter-registered-label": "Rekisteröitynyt",
-       "rcfilters-filter-registered-description": "Kirjautuneet muokkaukset.",
+       "rcfilters-filter-registered-description": "Sisäänkirjautuneiden muokkaukset.",
+       "rcfilters-filter-unregistered-label": "Rekisteröimätön",
        "rcfilters-filter-unregistered-description": "Muokkaajat, jotka eivät ole kirjautuneet sisään.",
-       "rcfilters-filter-editsbyself-label": "Omat muokkauksesi",
-       "rcfilters-filter-editsbyself-description": "Muokkauksesi",
-       "rcfilters-filter-editsbyother-label": "Muiden muokkaukset",
-       "rcfilters-filter-editsbyother-description": "Muutokset jotka tehneet muut käyttäjät (et sinä).",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Tulokkaat",
-       "rcfilters-filter-userExpLevel-learner-label": "Oppijat",
-       "rcfilters-filter-userExpLevel-experienced-label": "Kokeneet käyttäjät",
-       "rcfilters-filter-userExpLevel-experienced-description": "Enemmän kuin 30 päivää aktiivisena ja 500 muokkausta.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Tämä suodatin on ristiriidassa seuraavien kokemustaso {{PLURAL:$2|suodattimen|suodattimien}} kanssa,  {{PLURAL:$2|joka|jotka}} löytävät vain rekisteröityneitä käyttäjiä: $1",
+       "rcfilters-filtergroup-authorship": "Muutoksen tekijä",
+       "rcfilters-filter-editsbyself-label": "Muutoksesi",
+       "rcfilters-filter-editsbyself-description": "Tekemäsi muutokset.",
+       "rcfilters-filter-editsbyother-label": "Muiden muutokset",
+       "rcfilters-filter-editsbyother-description": "Muiden käyttäjien tekemät muutokset.",
+       "rcfilters-filtergroup-userExpLevel": "Kokemustaso (vain rekisteröityneet käyttäjät)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Kokemustaso suodattimet löytävät vain rekisteröityneitä käyttäjiä, joten tämä suodatin on ristiriidassa \"Rekisteröimätön\" -suodattimen kanssa.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"Rekisteröimätön\" -suodatin on ristiriidassa yhden tai useamman kokemustaso suodattimen kanssa, joka löytää vain rekisteröityneitä käyttäjiä.  Ristiriidassa oleva suodatin on merkittynä Aktiivisissa suodattimissa, yläpuolella.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Tulokkaat",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Vähemmän kuin 10 muokkausta ja 4 päivää aktiivisuutta.",
+       "rcfilters-filter-user-experience-level-learner-label": "Oppijat",
+       "rcfilters-filter-user-experience-level-learner-description": "Useamman päivän aktiivisina ja enemmän muokkauksia kuin \"tulokkailla\", mutta vähemmän kuin \"kokeneilla käyttäjillä\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Kokeneet käyttäjät",
+       "rcfilters-filter-user-experience-level-experienced-description": "Enemmän kuin 30 päivää aktiivisuutta ja 500 muokkausta.",
        "rcfilters-filtergroup-automated": "Automatisoidut muutokset",
        "rcfilters-filter-bots-label": "Botti",
-       "rcfilters-filter-bots-description": "Muokkaukset jotka tehty automaattisilla työkaluilla.",
+       "rcfilters-filter-bots-description": "Automaattisilla työkaluilla tehdyt muokkaukset.",
        "rcfilters-filter-humans-label": "Ihminen (ei botti)",
+       "rcfilters-filter-humans-description": "Ihmisten tekemät muokkaukset.",
+       "rcfilters-filtergroup-reviewstatus": "Tarkistuksen tila",
+       "rcfilters-filter-patrolled-label": "Tarkastetut",
+       "rcfilters-filter-patrolled-description": "Tarkastetut muokkaukset",
+       "rcfilters-filter-unpatrolled-label": "Ei tarkastetut",
+       "rcfilters-filter-unpatrolled-description": "Muutokset, joita ei ole tarkastettu",
        "rcfilters-filtergroup-significance": "Merkitys",
        "rcfilters-filter-minor-label": "Pienet muutokset",
+       "rcfilters-filter-minor-description": "Muokkaukset, jotka on merkitty pieniksi.",
        "rcfilters-filter-major-label": "Ei-pienet muutokset",
-       "rcfilters-filter-major-description": "Muokkauksia ei ole merkitty kuin pieniksi.",
+       "rcfilters-filter-major-description": "Muokkaukset, joita ei ole merkitty pieniksi.",
+       "rcfilters-filtergroup-watchlist": "Tarkkailulistalla olevat sivut",
+       "rcfilters-filter-watchlist-watched-label": "Tarkkailulistalla",
+       "rcfilters-filter-watchlist-watched-description": "Muutokset tarkkailulistalla oleviin sivuihin.",
+       "rcfilters-filter-watchlist-notwatched-label": "Ei tarkkailulistalla",
        "rcfilters-filtergroup-changetype": "Muutoksen tyyppi",
        "rcfilters-filter-pageedits-label": "Sivun muokkaukset",
-       "rcfilters-filter-pageedits-description": "Muokkaukset wikin sisältöön, keskusteluihin, luokkakuvauksiin....",
-       "rcfilters-filter-newpages-description": "Muokkaukset jotka luovat uusia sivuja.",
+       "rcfilters-filter-pageedits-description": "Muokkaukset wikin sisältöön, keskusteluihin, luokkakuvauksiin...",
+       "rcfilters-filter-newpages-label": "Sivujen luonnit",
+       "rcfilters-filter-newpages-description": "Muokkaukset, joilla on luotu uusia sivuja.",
        "rcfilters-filter-categorization-label": "Luokkamuutokset",
+       "rcfilters-filter-categorization-description": "Tulokset sivuista, joita on lisätty tai poistettu luokista.",
        "rcfilters-filter-logactions-label": "Kirjatut toimet",
+       "rcfilters-filter-logactions-description": "Hallinnolliset toimet, tunnusten luonnit, sivujen poistot, tiedostojen lähetykset...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "\"Pienet muutokset\" -suodatin on ristiriidassa yhden tai useamman Muutoksen tyyppi suodattimen kanssa, koska joitain muutostyyppejä ei voida pitää \"pieninä\". Ristiriidassa oleva suodatin on merkittynä Aktiivisissa suodattimissa, yläpuolella.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Joitain muutostyyppejä ei voida määrittää \"pieneksi\", joten tämä suodatin on ristiriidassa seuraavien Muutoksen tyyppi suodattimien kanssa: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "\"Muutoksen tyyppi\" on ristiriidassa \"Pienet muutokset\" -suodattimen kanssa. Joitain muutostyyppejä ei voida merkitä \"pieniksi\".",
+       "rcfilters-filtergroup-lastRevision": "Viimeisin versio",
+       "rcfilters-filter-lastrevision-label": "Viimeisin versio",
+       "rcfilters-filter-previousrevision-label": "Aikaisemman versiot",
        "rcnotefrom": "Alla ovat muutokset <strong>$3, $4</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
        "rclistfrom": "Näytä uudet muutokset $3 kello $2 alkaen",
        "rcshowhideminor": "$1 pienet muutokset",
        "rcshowhidecategorization": "$1 sivujen luokkien muutokset",
        "rcshowhidecategorization-show": "Näytä",
        "rcshowhidecategorization-hide": "Piilota",
-       "rclinks": "Näytä $1 tuoretta muutosta viimeisten $2 päivän ajalta.<br />$3",
+       "rclinks": "Näytä $1 muutosta viimeisten $2 päivän ajalta.",
        "diff": "ero",
        "hist": "historia",
        "hide": "Piilota",
        "apisandbox-sending-request": "API-pyyntöä lähetetään...",
        "apisandbox-loading-results": "API-tuloksia vastaanotetaan...",
        "apisandbox-results-error": "Tapahtui virhe ladattaessa API-kyselyn vastausta: $1",
+       "apisandbox-request-format-url-label": "URL-kyselymerkkijono",
        "apisandbox-request-url-label": "Pyynnön URL",
        "apisandbox-request-time": "Pyyntöön kulunut aika: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Korjaa \"token\" ja lähetä uudelleen",
        "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}}}}. 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}}.",
+       "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}}}}. Jos vastaat tähän sähköpostiin, 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",
        "enotif_body_intro_moved": "{{GENDER:$2|$2}} siirsi {{GRAMMAR:inessive|{{SITENAME}}}} sivun $1 $PAGEEDITDATE. Sivun nykyinen versio on osoitteessa $3.",
        "enotif_body_intro_restored": "{{GENDER:$2|$2}} palautti {{GRAMMAR:inessive|{{SITENAME}}}} sivun $1 $PAGEEDITDATE. Sivun nykyinen versio on osoitteessa $3.",
        "enotif_body_intro_changed": "{{GENDER:$2|$2}} muutti {{GRAMMAR:inessive|{{SITENAME}}}} sivua $1 $PAGEEDITDATE. Sivun nykyinen versio on osoitteessa $3.",
-       "enotif_lastvisited": "Osoitteessa $1 on kaikki muutokset viimeisen käyntisi jälkeen.",
+       "enotif_lastvisited": "Kaikki muutokset viimeisimmän vierailusi jälkeen näet täältä $1",
        "enotif_lastdiff": "Muutos on osoitteessa $1.",
        "enotif_anon_editor": "kirjautumaton käyttäjä $1",
        "enotif_body": "$WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nMuokkaajan yhteenveto: $PAGESUMMARY $PAGEMINOREDIT\n\nOta yhteyttä muokkaajaan:\nsähköposti: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nUusia ilmoituksia tästä sivusta ei tule kunnes vierailet sivulla sisään kirjautuneena. Voit myös nollata ilmoitukset kaikille tarkkailemillesi sivuille tarkkailulistallasi.\n\n             {{GRAMMAR:genitive|{{SITENAME}}}} ilmoitusjärjestelmä\n\n--\nVoit muuttaa sähköpostimuistutusten asetuksia osoitteessa:\n{{canonicalurl:{{#special:Preferences}}}}\n\nVoit muuttaa tarkkailulistasi asetuksia osoitteessa:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nVoit poistaa sivun tarkkailulistalta osoitteessa:\n$UNWATCHURL\n\nPalaute ja lisäapu osoitteessa:\n$HELPPAGE",
        "editcomment": "Muokkauksen yhteenveto oli: <em>$1</em>.",
        "revertpage": "Käyttäjän [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]]) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän [[User:$1|$1]] tekemään versioon.",
        "revertpage-nouser": "Käyttäjän (käyttäjänimi poistettu) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän {{GENDER:$1|[[User:$1|$1]]}} tekemään versioon",
-       "rollback-success": "Käyttäjän $1 tekemät muokkaukset kumottiin ja sivu palautettiin käyttäjän $2 versioon.",
+       "rollback-success": "Käyttäjän {{GENDER:$3|$1}} tekemät muokkaukset kumottiin ja sivu palautettiin käyttäjän {{GENDER:$4|$2}} versioon.",
        "rollback-success-notify": "Kumottiin käyttäjän $1 muokkaukset; palautettiin viimeiseen käyttäjän $2 versioon. [$3 Näytä muutokset]",
        "sessionfailure-title": "Istuntovirhe",
        "sessionfailure": "Istuntosi kanssa on ongelma. Muutosta ei toteutettu varotoimena istuntokaappauksien takia. Käytä selaimen paluutoimintoa ja päivitä sivu, jolta tulit, ja yritä uudelleen.",
        "changecontentmodel-emptymodels-title": "Mitään sisältömallia ei ole saatavilla",
        "changecontentmodel-emptymodels-text": "Sisältöä sivulla [[:$1]] ei voida muuntaa mihinkään muotoon.",
        "log-name-contentmodel": "Sisältömallin muutosloki",
-       "log-description-contentmodel": "Tapahtumat, jotka liittyvät sivun sisältömalleihin",
+       "log-description-contentmodel": "Tällä sivulla on lueteltu muutokset sivujen sisältömalliin, ja sivut, jotka on luotu muulla kuin oletussisältömallilla.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|loi}} sivun $3 käyttäen normaalista poikkeavaa sisältömallia \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|muutti}} sivun $3 sisältömallia muodosta \"$4\" muotoon \"$5\"",
        "logentry-contentmodel-change-revertlink": "kumoa",
        "undeleteviewlink": "näytä",
        "undeleteinvert": "Käänteinen valinta",
        "undeletecomment": "Syy:",
-       "undeletedrevisions": "{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin",
-       "undeletedrevisions-files": "{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin",
-       "undeletedfiles": "{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin",
        "cannotundelete": "Palauttaminen epäonnistui osittain tai kokonaan:\n$1",
        "undeletedpage": "'''$1 on palautettu.'''\n\n[[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.",
        "undelete-header": "[[Special:Log/delete|Poistolokissa]] on lista viimeisimmistä poistoista.",
        "unblocked-id": "Esto $1 on poistettu",
        "unblocked-ip": "Käyttäjän [[Special:Contributions/$1|$1]] esto on poistettu.",
        "blocklist": "Estetyt käyttäjät",
+       "autoblocklist": "Automaattiset estot",
+       "autoblocklist-submit": "Hae",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Paikallinen automaattinen esto|Paikalliset automaattiset estot}}",
+       "autoblocklist-empty": "Automaattisten estojen lista on tyhjä.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Muu automaattinen esto|Muut automaattiset estot}}",
        "ipblocklist": "Estetyt käyttäjät",
        "ipblocklist-legend": "Haku",
        "blocklist-userblocks": "Piilota tunnusten estot",
        "newimages-summary": "Tällä toimintosivulla on viimeisimmät tallennetut tiedostot.",
        "newimages-legend": "Suodatin",
        "newimages-label": "Tiedostonimi (tai osa siitä)",
+       "newimages-user": "IP-osoite tai käyttäjänimi:",
        "newimages-showbots": "Näytä bottien tekemät tallennukset",
        "newimages-hidepatrolled": "Piilota tarkastetut tiedostotallennukset",
        "noimages": "Ei uusia tiedostoja.",
        "confirmrecreate-noreason": "Käyttäjä [[User:$1|$1]] ([[User talk:$1|keskustelu]]) {{GENDER:$1|on poistanut}} tämän sivun sen jälkeen, kun aloit muokata. Varmista, että haluat tosiaan luoda sivun uudelleen.",
        "recreate": "Luo uudelleen",
        "unit-pixel": " px",
+       "confirm-purge-title": "Tyhjennä välimuistista",
        "confirm_purge_button": "Poista",
        "confirm-purge-top": "Poistetaanko tämän sivun välimuistikopiot?",
        "confirm-purge-bottom": "Välimuistikopioiden poistaminen tyhjentää välimuistin ja pakottaa sivun uusimman version näkyviin.",
        "htmlform-user-not-valid": "<strong>$1</strong> ei ole kelvollinen käyttäjänimi.",
        "logentry-delete-delete": "$1 {{GENDER:$2|poisti}} sivun $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|poisti}} ohjaussivun $3 korvaamalla",
-       "logentry-delete-restore": "$1 {{GENDER:$2|palautti}} sivun $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|palautti}} sivun $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|palautti}} sivun $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 versio|$1 versiota}}",
+       "restore-count-files": "{{PLURAL:$1|1 tiedosto|$1 tiedostoa}}",
        "logentry-delete-event": "$1 {{GENDER:$2|muutti}} {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|muutti}} {{PLURAL:$5|version|$5 version}} näkyvyyttä sivulla $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|muutti}} kohteen $3 lokitapahtumien näkyvyyttä",
        "logentry-import-upload": "$1 {{GENDER:$2|on tuonut}} kohteen $3 tiedostotallennuksella",
        "logentry-import-upload-details": "$1 {{GENDER:$2|on tuonut}} kohteen $3 tiedostotallennuksella ($4 {{PLURAL:$4|versio|versiota}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|on tuonut}} kohteen $3 muusta wikistä",
-       "logentry-import-interwiki-details": "$1 {{GENDER:$2|on tuonut}} kohteen $3 paikasta $5 ($4 {{PLURAL:$4|versio|versioita}})",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|on tuonut}} kohteen $3 paikasta $5 ($4 {{PLURAL:$4|versio|versiota}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|yhdisti}} sivun $3 sivuun $4 (versiot $5 saakka)",
        "logentry-move-move": "$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4 luomatta ohjausta",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|päivitti}} merkkauksia kohdeversiossa $4 sivulla $3 ({{PLURAL:$7|lisätty}} $6; {{PLURAL:$9|poistettu}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|päivitti}} merkkauksia lokimerkinnässä $5 sivulla $3 ({{PLURAL:$7|lisätty}} $6; {{PLURAL:$9|poistettu}} $8)",
        "rightsnone": "(ei oikeuksia)",
-       "revdelete-summary": "yhteenvedon",
-       "rightslogentry-temporary-group": "$1 (tilapäinen, $2 asti)",
+       "rightslogentry-temporary-group": "$1 (väliaikainen, $2 asti)",
        "feedback-adding": "Lisätään palautetta sivulle...",
        "feedback-back": "Takaisin",
        "feedback-bugcheck": "Hyvä! Varmista vielä, että ohjelmointivirhettä ei löydy [$1 tunnettujen virheiden luettelosta].",
        "pagelang-submit": "Lähetä",
        "pagelang-nonexistent-page": "Sivua $1 ei ole olemassa.",
        "pagelang-unchanged-language": "Sivu $1 on jo asetettu kielelle $2.",
+       "pagelang-unchanged-language-default": "Sivu $1 on jo asetettu wikin oletussisältökielelle.",
        "pagelang-db-failed": "Tietokanta epäonnistui vaihtamaan sivun kielen.",
        "right-pagelang": "Vaihtaa sivun kieli",
        "action-pagelang": "muuttaa sivun kieliasetuksia",
        "mediastatistics-table-count": "Tiedostojen lukumäärä",
        "mediastatistics-table-totalbytes": "Yhteenlaskettu koko",
        "mediastatistics-header-unknown": "Tuntematon",
-       "mediastatistics-header-bitmap": "Bitmap-kuvat",
+       "mediastatistics-header-bitmap": "Bittikarttakuvat",
        "mediastatistics-header-drawing": "Piirrokset (vektorikuvat)",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Videot",
        "mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Lisää luokka...",
        "mw-widgets-usersmultiselect-placeholder": "Lisää enemmän...",
+       "date-range-from": "Lähtien:",
+       "date-range-to": "Päättyen:",
        "sessionmanager-tie": "!!FYZZ!!Cannot combine multiple request authentication types: $1.",
        "sessionprovider-generic": "$1 istuntoa",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "istuntoja, joissa on evästeet käytössä",
        "authmanager-realname-label": "Oikea nimi",
        "authmanager-realname-help": "Käyttäjän oikea nimi",
        "authmanager-provider-password": "Salasanapohjainen varmennus",
+       "authmanager-provider-password-domain": "Salasana- ja toimialue-pohjainen todennus",
        "authmanager-provider-temporarypassword": "Väliaikainen salasana",
        "authprovider-confirmlink-message": "Viimeisimpien kirjautumisyritystesi perusteella seuraavat tunnukset voidaan linkittää wikitunnuksellesi. Tunnusten linkittäminen mahdollistaa sisäänkirjautumisen niitä käyttämällä. Valitse tunnukset, jotka tulisi linkittää.",
        "authprovider-confirmlink-request-label": "Tunnukset, jotka tulisi yhdistää",
        "restrictionsfield-badip": "Virheellinen IP-osoite tai alue: $1",
        "restrictionsfield-label": "Sallitut IP-alueet:",
        "revid": "versio $1",
-       "pageid": "sivun tunnistenumero $1"
+       "pageid": "sivun tunnistenumero $1",
+       "gotointerwiki": "Lähdössä {{GRAMMAR:elative|{{SITENAME}}}}",
+       "gotointerwiki-external": "Olet lähdössä {{GRAMMAR:elative|{{SITENAME}}}} toiselle sivustolle [[$2]].\n\n[$1 Paina tästä jatkaaksesi osoitteeseen $1].",
+       "undelete-cantedit": "Et voi palauttaa tätä sivua, koska sinulla ei ole oikeutta muokata tätä sivua.",
+       "undelete-cantcreate": "Et voi palauttaa tätä sivua, koska tällä nimellä ei ole olemassaolevaa sivua eikä sinulla ole oikeutta luoda tätä sivua."
 }
index 5006722..c3542c0 100644 (file)
        "rcshowhideanons": "$1 anonyymit käyttäjät",
        "rcshowhidepatr": "$1 tarkistetut muutokset",
        "rcshowhidemine": "$1 omat muutokset",
-       "rclinks": "Näytä $1 verestä muutosta viimisitten $2 päivitten aikana.<br />$3",
+       "rclinks": "Näytä $1 verestä muutosta viimisitten $2 päivitten aikana.",
        "diff": "ero",
        "hist": "histuuria",
        "hide": "Piilota",
index eaef8b2..aca9662 100644 (file)
        "externaldberror": "Antin var talan um ein atgongd dátubasu feil, ella hevur tú ikki loyvi til at dagføra tína eksternu kontu.",
        "login": "Rita inn",
        "nav-login-createaccount": "Stovna kontu ella rita inn",
-       "userlogin": "Stovna kontu ella rita inn",
-       "userloginnocreate": "Rita inn",
        "logout": "Útrita",
        "userlogout": "Rita út",
        "notloggedin": "Ikki ritað inn",
        "userlogin-noaccount": "Hevur tú ikki nakra kontu?",
        "userlogin-joinproject": "Meldað teg til {{SITENAME}}",
-       "nologin": "Hevur tú ikki eina kontu? $1.",
-       "nologinlink": "Stovna eina kontu",
        "createaccount": "Stovna nýggja kontu",
-       "gotaccount": "Hevur tú longu eina kontu? '''$1'''.",
-       "gotaccountlink": "Rita inn",
-       "userlogin-resetlink": "Hevur tú gloymt tínar logg inn upplýsingar",
        "userlogin-resetpassword-link": "Hevur tú gloymt títt loyniorð?",
        "userlogin-helplink2": "Hjálp til innritan",
        "userlogin-loggedin": "Tú ert longu innritað/ur sum {{GENDER:$1|$1}}.\nNýt formularin niðanfyri fyri at rita inn sum ein annar brúkari.",
        "createacct-another-email-ph": "Skriva tína t-post adressu",
        "createaccountmail": "Nýt eitt fyribils tilvildarligt loyniorð og send tað til nevndu t-post adressuna",
        "createacct-realname": "Veruligt navn (valfrítt)",
-       "createaccountreason": "Orsøk:",
        "createacct-reason": "Orsøk",
        "createacct-reason-ph": "Hví upprættar tú eina nýggja kontu",
        "createacct-submit": "Upprætta tína kontu",
        "showdiff": "Sýn broytingar",
        "anoneditwarning": "<strong>Ávaring:</strong> Tú ert ikki innritað/ur. Tín IP adressa verður alment sjónlig um tú gert rættingar. Um tú <strong>[$1 ritar inn]</strong> ella <strong>[$2 upprættar eina konto]</strong>, so verða tínar rættingar ognaðar tínum brúkaranavni, umframt aðrir fyrimunir.",
        "anonpreviewwarning": "''Tú ert ikki innritað/ur. Um tú goymir nú, so verður tín IP adressa goymd í rættingar søguni hjá hesi síðu. ''",
-       "missingsummary": "'''Áminning:''' Tú hevur ikki givið nakran rættingar samandrátt.\nUm tú trýstir á \"{{int:savearticle}}\" enn einaferð, so verða tínar rættingar goymdar uttan samandrátt.",
+       "missingsummary": "'''Áminning:''' Tú hevur ikki givið nakran rættingar samandrátt.\nUm tú trýstir á \"$1\" enn einaferð, so verða tínar rættingar goymdar uttan samandrátt.",
        "missingcommenttext": "Vinarliga skriva eina viðmerking niðanfyri.",
-       "missingcommentheader": "'''Reminder:''' Tú hevur ikki skrivað nakað evni/yvirskrift fyri hesa viðmerking.\nUm tú trýstir á \"{{int:savearticle}}\" aftur, so verður tín rætting goymd uttan evni/yvirskrift.",
+       "missingcommentheader": "'''Reminder:''' Tú hevur ikki skrivað nakað evni/yvirskrift fyri hesa viðmerking.\nUm tú trýstir á \"$1\" aftur, so verður tín rætting goymd uttan evni/yvirskrift.",
        "summary-preview": "Samandráttaforskoðan:",
        "subject-preview": "Forskoðan av evni/yvirskrift:",
        "blockedtitle": "Brúkarin er bannaður",
        "editingsection": "Tú rættar $1 (partur)",
        "editingcomment": "Tú rættar $1 (nýtt brot)",
        "editconflict": "Rættingar konflikt: $1",
-       "explainconflict": "Onkur annar hevur broytt hesa síðuna síðan tú fór í gongd við at rætta hana.\nTað ovara tekst økið inniheldur síðu tekstin sum hann er í løtuni.\nTínar broytingar eru vístar í tí niðara tekst økinum.\nTú mást flætta tínar rættingar inn í verandi tekstin.\n'''Bert''' teksturin í ovara økinum verður goymdur, tá tú trýstir á \"{{int:savearticle}}\".",
+       "explainconflict": "Onkur annar hevur broytt hesa síðuna síðan tú fór í gongd við at rætta hana.\nTað ovara tekst økið inniheldur síðu tekstin sum hann er í løtuni.\nTínar broytingar eru vístar í tí niðara tekst økinum.\nTú mást flætta tínar rættingar inn í verandi tekstin.\n'''Bert''' teksturin í ovara økinum verður goymdur, tá tú trýstir á \"$1\".",
        "yourtext": "Tín tekstur",
        "storedversion": "Goymd útgáva",
        "nonunicodebrowser": "'''Ávaring: Tín internetkagi er ikki í samsvar við Unicode.'''\nEin dagføring er neyðug fyri at tú á tryggan hátt kanst rætta síður: Ikki-ASCII bókstavar fara at koma fram í rættingarteiginum sum hexadecimal kotur.",
        "saveprefs": "Goym innstillingar",
        "restoreprefs": "Nullstilla alt til standard innstillingar (í øllum teigum)",
        "prefs-editing": "Broyting av greinum",
-       "rows": "Røð:",
-       "columns": "Teigar:",
        "searchresultshead": "Leita",
        "stub-threshold": "Avmarkað til stubba leinki formatering $1:",
        "stub-threshold-sample-link": "dømi",
        "right-editprotected": "Rætta síður sum eru vardar sum \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Rætta síður sum er vardar sum \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "Rætta brúkaramarkamótið",
-       "right-editusercssjs": "Rætta CSS og JavaScript fílur hjá øðrum brúkarum",
        "right-editusercss": "Rætta CSS fílur hjá øðrum brúkarum",
        "right-edituserjs": "Rætta JavaScript fílur hjá øðrum brúkarum",
        "right-editmyusercss": "Rætta tínar egnu brúkara CSS fílur",
        "rcshowhidemine": "$1 mínar rættingar",
        "rcshowhidemine-show": "Vís",
        "rcshowhidemine-hide": "Fjal",
-       "rclinks": "Sýn seinastu $1 broytingarnar seinastu $2 dagarnar<br />$3",
+       "rclinks": "Sýn seinastu $1 broytingarnar seinastu $2 dagarnar",
        "diff": "munur",
        "hist": "søga",
        "hide": "Goym",
        "undeleteviewlink": "Hygg",
        "undeleteinvert": "Umvent val",
        "undeletecomment": "Orsøk:",
-       "undeletedrevisions": "{{PLURAL:$1|1 versjón|$1 versjónir}} endurstovnað/ar",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 versjón|$1 versjónir}} og {{PLURAL:$2|1 fíla|$2 fílur}} endurstovnað/ar",
-       "undeletedfiles": "{{PLURAL:$1|1 fíla endurstovna|$1 fílur endurstovnaðar}}",
        "cannotundelete": "Endurstovnan miseydnaðist:\n$1",
        "undeletedpage": "'''$1 er endurstovnað'''\n\nSí [[Special:Log/delete|slettingarloggin]] fyri at síggja seinastu strikingar og endurstovningar.",
        "undelete-header": "Far til [[Special:Log/delete|slettingarloggin]] fyri at síggja nýliga slettaðar síður.",
        "logentry-newusers-create": "Brúkarakonta $1 varð {{GENDER:$2|upprættað}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|legði út}} $3",
        "rightsnone": "(ongin)",
-       "revdelete-summary": "yvirlit yvir broytingar",
        "searchsuggest-search": "Leita í {{SITENAME}}",
-       "api-error-empty-file": "Fílan sum tú sendi inn var tóm.",
-       "api-error-file-too-large": "Fílan sum tú sendi inn var óv stór.",
-       "api-error-http": "Internur feilur: Kann ikki fáa samband við servaran.",
-       "api-error-mustbeloggedin": "Tú mást vera innritað/ur fyri at tú kanst leggja fílur upp.",
-       "api-error-ok-but-empty": "Internur feilur: Onki svar frá servara.",
-       "api-error-unclassified": "Ein ókendur feilur hendi.",
-       "api-error-unknown-code": "Ókendur feilur: \"$1\"",
        "duration-seconds": "$1 {{PLURAL:$1|sekund}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuttur|minuttir}}",
        "duration-hours": "$1 {{PLURAL:$1|tími|tímar}}",
index 561e0dc..cc820d1 100644 (file)
                        "Derugon",
                        "Benoit Rochon",
                        "Fitoschido",
-                       "Archaeodontosaurus"
+                       "Archaeodontosaurus",
+                       "Trizek (WMF)"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "tog-hideminor": "Masquer les modifications mineures dans les modifications récentes",
-       "tog-hidepatrolled": "Masquer les modifications relues dans les modifications récentes",
+       "tog-hidepatrolled": "Masquer les modifications vérifiées dans les modifications récentes",
        "tog-newpageshidepatrolled": "Masquer les pages relues dans la liste des nouvelles pages",
        "tog-hidecategorization": "Masquer la catégorisation des pages",
        "tog-extendwatchlist": "Étendre la liste de suivi pour afficher toutes les modifications et pas uniquement les plus récentes",
        "tog-enotifminoredits": "M’avertir par courriel également lors des modifications mineures des pages ou des fichiers",
        "tog-enotifrevealaddr": "Afficher mon adresse électronique dans les courriels de notification",
        "tog-shownumberswatching": "Afficher le nombre d’utilisateurs en cours",
-       "tog-oldsig": "Votre signature existante :",
+       "tog-oldsig": "Votre signature actuelle :",
        "tog-fancysig": "Traiter la signature comme du wikitexte (sans lien automatique)",
        "tog-uselivepreview": "Utiliser l’aperçu rapide",
        "tog-forceeditsummary": "M’avertir lorsque je n’ai pas spécifié de résumé de modification",
        "talk": "Discussion",
        "views": "Affichages",
        "toolbox": "Outils",
-       "tool-link-userrights": "Modifier les groupes de {{GENDER:$1|l’utilisateur|l’utilisatrice}}",
+       "tool-link-userrights": "Modifier les groupes de l’utilisat{{GENDER:$1|eur|rice}}",
        "tool-link-userrights-readonly": "Voir les {{GENDER:$1|groupes utilisateur}}",
        "tool-link-emailuser": "Envoyer un courriel à {{GENDER:$1|l’utilisateur|l’utilisatrice}}",
        "userpage": "Voir la page utilisateur",
        "redirectedfrom": "(Redirigé depuis $1)",
        "redirectpagesub": "Page de redirection",
        "redirectto": "Rediriger vers :",
-       "lastmodifiedat": "Dernière modification de cette page le $1, à $2.",
+       "lastmodifiedat": "Cette page a été modifiée pour la dernière fois le $1 à $2.",
        "viewcount": "Cette page {{PLURAL:$1|0=n’a jamais été consultée|1=a été consultée une seule fois|a été consultée $1 fois}}.",
        "protectedpage": "Page protégée",
        "jumpto": "Aller à :",
        "login": "Connexion",
        "login-security": "Vérifier votre identité",
        "nav-login-createaccount": "Créer un compte ou se connecter",
-       "userlogin": "Créer un compte ou se connecter",
-       "userloginnocreate": "Connexion",
        "logout": "Se déconnecter",
        "userlogout": "Déconnexion",
        "notloggedin": "Non connecté",
        "userlogin-noaccount": "Vous n’avez pas de compte ?",
        "userlogin-joinproject": "Rejoignez {{SITENAME}}",
-       "nologin": "Vous n’avez pas de compte ? $1.",
-       "nologinlink": "Créer un compte",
        "createaccount": "Créer un compte",
-       "gotaccount": "Vous avez déjà un compte ? $1.",
-       "gotaccountlink": "Connectez-vous",
-       "userlogin-resetlink": "Vous avez oublié vos détails de connexion ?",
        "userlogin-resetpassword-link": "Mot de passe oublié ?",
        "userlogin-helplink2": "Aide pour se connecter",
        "userlogin-loggedin": "Vous êtes déjà connecté{{GENDER:$1||e|(e)}} en tant que $1.\nUtilisez le formulaire ci-dessous pour vous connecter avec un autre compte utilisateur.",
        "createaccountmail": "Utiliser un mot de passe aléatoire temporaire et l’envoyer à l’adresse de courriel spécifiée",
        "createaccountmail-help": "Peut être utilisé pour créer un compte pour une autre personne sans connaître le mot de passe.",
        "createacct-realname": "Nom réel (facultatif)",
-       "createaccountreason": "Motif :",
        "createacct-reason": "Motif",
        "createacct-reason-ph": "Pourquoi créez-vous un autre compte",
        "createacct-reason-help": "Message affiché dans le journal de création de compte",
        "preview": "Prévisualisation",
        "showpreview": "Prévisualiser",
        "showdiff": "Voir les modifications",
-       "blankarticle": "<strong>Attention :</strong> la page que vous créez est vide.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la page sera créée sans aucun contenu.",
+       "blankarticle": "<strong>Attention :</strong> la page que vous créez est vide.\nSi vous cliquez de nouveau sur « $1 », la page sera créée sans aucun contenu.",
        "anoneditwarning": "<strong>Attention :</strong> vous n’êtes pas connecté. Votre adresse IP sera visible de tout le monde si vous faites des modifications. Si vous <strong>[$1 vous connectez]</strong> ou <strong>[$2 créez un compte]</strong>, vos modifications seront attribuées à votre nom d’utilisateur, avec d'autres avantages.",
        "anonpreviewwarning": "<em>Vous n’êtes pas connecté{{GENDER:||e}}. Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.</em>",
-       "missingsummary": "<strong>Rappel :</strong> vous n’avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « {{int:savearticle}} », vos modifications seront sauvegardées sans résumé.",
-       "selfredirect": "<strong>Attention :</strong> vous êtes en train de rediriger la page vers elle-même.\nVous pouvez avoir spécifié la mauvaise cible pour la redirection, ou vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « {{int:savearticle}} », la redirection sera tout de même créée.",
+       "missingsummary": "<strong>Rappel :</strong> vous n’avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « $1 », vos modifications seront sauvegardées sans résumé.",
+       "selfredirect": "<strong>Attention :</strong> vous êtes en train de rediriger la page vers elle-même.\nIl se peut que vous ayez spécifié la mauvaise cible pour la redirection, ou que vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « $1 », la redirection sera tout de même créée.",
        "missingcommenttext": "Veuillez entrer un commentaire ci-dessous.",
        "missingcommentheader": "<strong>Rappel :</strong> vous n’avez pas fourni de sujet pour ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans sujet.",
        "summary-preview": "Aperçu du résumé de modification :",
        "editingsection": "Modification de $1 (section)",
        "editingcomment": "Modification de $1 (nouvelle section)",
        "editconflict": "Conflit de modification : $1",
-       "explainconflict": "Cette page a été changée après que vous avez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu’il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n<strong>Seul</strong> le texte de la zone supérieure sera sauvegardé si vous cliquez sur « {{int:savearticle}} ».",
+       "explainconflict": "Cette page a été changée après que vous avez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu’il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n<strong>Seul</strong> le texte de la zone supérieure sera sauvegardé si vous cliquez sur « $1 ».",
        "yourtext": "Votre texte",
        "storedversion": "La version enregistrée",
        "nonunicodebrowser": "<strong>Attention : votre navigateur ne prend pas en charge l’Unicode.</strong>\nUn palliatif est en place vous permettant de modifier les pages en toute sécurité, faisant apparaître les caractères non-ASCII sous forme hexadécimale dans la boîte de modification.",
        "readonlywarning": "<strong>AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l’instant.</strong>\nVous pouvez copier et coller votre texte dans un fichier texte et l’enregistrer pour plus tard.\n\nL’administrateur système ayant verrouillé la base de données a donné l’explication suivante : $1",
        "protectedpagewarning": "<strong>AVERTISSEMENT : cette page est protégée afin que seuls les utilisateurs ayant le statut d'administrateur puissent la modifier.</strong>\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
        "semiprotectedpagewarning": "<strong>Note :</strong>Cette page a été protégée de telle façon que seuls les contributeurs enregistrés puissent la modifier. \nLa dernière entrée du journal est affichée ci-dessous pour référence :",
-       "cascadeprotectedwarning": "'''ATTENTION :''' Cette page a été protégée de manière à ce que seuls les administrateurs puissent la modifier car elle est transcluse dans {{PLURAL:$1|la page protégée suivante, qui a|les pages protégées suivantes, qui ont}} la « protection en cascade » activée :",
+       "cascadeprotectedwarning": "<strong>ATTENTION :</strong> Cette page a été protégée de manière à ce que seuls les utilisateurs avec [[Special:ListGroupRights|des droits spécifiques]] puissent la modifier car elle est incluse dans {{PLURAL:$1|la page suivante, protégée en cascade|les pages suivantes, protégées en cascade}} :",
        "titleprotectedwarning": "<strong>ATTENTION : Cette page a été protégée de telle manière que des [[Special:ListGroupRights|droits spécifiques]] sont requis pour pouvoir la créer.</strong> \nLa dernière entrée du journal est affichée ci-dessous pour référence :",
        "templatesused": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} par cette page :",
        "templatesusedpreview": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} dans cette prévisualisation :",
        "duplicate-args-category": "Pages utilisant des arguments dupliqués dans les appels de modèle",
        "duplicate-args-category-desc": "La page contient des appels de modèle qui utilisent des arguments dupliqués, comme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Attention :</strong> cette page contient de trop nombreux appels à des fonctions coûteuses de l’analyseur syntaxique.\n\nIl devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu’il y en a maintenant $1.",
-       "expensive-parserfunction-category": "Pages avec trop d'appels dispendieux de fonctions de l'analyseur syntaxique",
+       "expensive-parserfunction-category": "Pages avec trop d'appels dispendieux aux fonctions de l'analyseur syntaxique",
        "post-expand-template-inclusion-warning": "<strong>Attention :</strong> cette page contient trop d’inclusions de modèles. Certaines inclusions ne seront pas effectuées.",
        "post-expand-template-inclusion-category": "Pages contenant trop d'inclusions de modèles",
        "post-expand-template-argument-warning": "<strong>Attention :</strong> cette page contient au moins un paramètre de modèle dont la taille après expansion est trop importante. \nCes arguments n’ont donc pas été inclus.",
        "post-expand-template-argument-category": "Pages contenant des paramètres de modèle non évalués",
        "parser-template-loop-warning": "Modèle en boucle détecté : [[$1]]",
+       "template-loop-category": "Pages avec des boucles de modèle",
+       "template-loop-category-desc": "La page contient une boucle dans le modèle, c.à.d. un modèle qui s’appelle lui-même récursivement.",
        "parser-template-recursion-depth-warning": "Limite de profondeur des appels récursifs de modèles dépassée ($1)",
        "language-converter-depth-warning": "Limite de profondeur du convertisseur de langue dépassée ($1)",
        "node-count-exceeded-category": "Pages dépassant le nombre de nœuds maximal",
        "expansion-depth-exceeded-category": "Pages dépassant la profondeur d'expansion maximale",
        "expansion-depth-exceeded-category-desc": "La page dépasse la profondeur d’expansion maximale.",
        "expansion-depth-exceeded-warning": "Page dépassant la profondeur d’expansion maximale",
-       "parser-unstrip-loop-warning": "Boucle non démontable détectée",
-       "parser-unstrip-recursion-limit": "Limite de récursion non démontable dépassée ($1)",
+       "parser-unstrip-loop-warning": "Boucle non dépilable détectée",
+       "parser-unstrip-recursion-limit": "Limite de récursion non dépilable dépassée ($1)",
        "converter-manual-rule-error": "Erreur détectée dans la règle manuelle de conversion de langue",
        "undo-success": "Cette modification va être annulée.\nVeuillez vérifier les différences ci-dessous, puis publier l’annulation si c’est bien ce que vous voulez faire.",
        "undo-failure": "Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.",
        "page_first": "première",
        "page_last": "dernière",
        "histlegend": "Sélection du diff : cochez les boutons radio des versions à comparer et appuyez sur entrée ou sur le bouton en bas.<br />\nLégende : <strong>({{int:cur}})</strong> = différence avec la dernière version, <strong>({{int:last}})</strong> = différence avec la version précédente, <strong>{{int:minoreditletter}}</strong> = modification mineure.",
-       "history-fieldset-title": "Naviguer dans l’historique",
-       "history-show-deleted": "Supprimés seulement",
+       "history-fieldset-title": "Rechercher des révisions",
+       "history-show-deleted": "Révision supprimée uniquement",
        "histfirst": "les plus anciennes",
        "histlast": "les plus récentes",
        "historysize": "($1 octet{{PLURAL:$1||s}})",
        "search-file-match": "(correspond au contenu du fichier)",
        "search-suggest": "Essayez avec cette orthographe : $1",
        "search-rewritten": "Résultats affichés pour $1. Rechercher $2 à la place.",
-       "search-interwiki-caption": "Projets frères",
+       "search-interwiki-caption": "Résultats des projets frères",
        "search-interwiki-default": "Résultats de $1 :",
        "search-interwiki-more": "(plus)",
        "search-interwiki-more-results": "résultats supplémentaires",
        "prefs-help-prefershttps": "Cette préférence sera effective lors de votre prochaine connexion.",
        "prefswarning-warning": "Vous avez effectué des modifications dans vos préférences qui n’ont pas encore été enregistrées.\nSi vous quittez cette page sans cliquer sur « $1 », vos préférences ne seront pas mises à jour.",
        "prefs-tabs-navigation-hint": "Astuce : Vous pouvez utiliser les flèches de gauche et de droite pour naviguer entre les onglets.",
-       "userrights": "Gestion des droits des utilisateurs",
+       "userrights": "Droits des utilisateurs",
        "userrights-lookup-user": "Sélectionner un utilisateur",
        "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'utilisat{{GENDER:$1|eur|rice}}",
-       "userrights-viewusergroup": "Afficher les groupes d'utilisat{{GENDER:$1|eur|rice}}",
-       "saveusergroups": "Enregistrer les groupes de l’{{GENDER:$1|utilisateur|utilisatrice}}",
+       "userrights-viewusergroup": "Afficher les groupes d'utilisat{{GENDER:$1|eur|rice}}s",
+       "saveusergroups": "Enregistrer les groupes de l’utilisat{{GENDER:$1|eur|rice}}",
        "userrights-groupsmember": "Membre de :",
        "userrights-groupsmember-auto": "Membre implicite de :",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "Vous pouvez modifier les groupes auxquels appartient {{GENDER:$1|cet utilisateur|cette utilisatrice}} :\n* Une case cochée signifie que l’utilisat{{GENDER:$1|eur|rice}} se trouve dans ce groupe.\n* Une case non cochée signifie qu’{{GENDER:$1|il|elle}} ne s’y trouve pas.\n* Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l’avez ajouté, ou vice-versa.\n* Un dièse (#) indique que vous ne pouvez que rallonger le délai d'expiration du groupe et non pas le raccourcir.",
+       "userrights-groups-help": "Vous pouvez modifier les groupes auxquels appartient {{GENDER:$1|cet utilisateur|cette utilisatrice}} :\n* Une case cochée signifie que {{GENDER:$1|l’utilisateur|l’utilisatrice}} se trouve dans ce groupe.\n* Une case non cochée signifie qu’{{GENDER:$1|il|elle}} ne s’y trouve pas.\n* Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l’avez ajouté, ou vice-versa.\n* Un dièse (#) indique que vous ne pouvez que rallonger le délai d’expiration de l’appartenance au groupe et non pas le raccourcir.",
        "userrights-reason": "Motif :",
        "userrights-no-interwiki": "Vous n'avez pas la permission de modifier les droits utilisateur sur d'autres wikis.",
        "userrights-nodatabase": "La base de données « $1 » n'existe pas ou n'est pas locale.",
        "userrights-expiry-options": "1 jour:1 day,1 semaine:1 week,1 mois:1 month,3 mois:3 montghs,6 mois:6 month,1 an:1 year",
        "userrights-invalid-expiry": "La date d'expiration pour le groupe « $1 » n'est pas valide.",
        "userrights-expiry-in-past": "La date d'expiration pour le groupe « $1 » est dépassée.",
-       "userrights-cannot-shorten-expiry": "Vous ne pouvez pas rallonger la durée d'expiration du groupe « $1 ». Seuls les utilisateurs disposant de l'autorisation d'ajouter et de supprimer ce groupe peuvent rallonger les durées d'expiration.",
+       "userrights-cannot-shorten-expiry": "Vous ne pouvez pas raccourcir la durée d’expiration de l’appartenance au groupe « $1 ». Seuls les utilisateurs disposant de l’autorisation d’ajouter et de supprimer ce groupe peuvent raccourcir les durées d’expiration.",
        "userrights-conflict": "Conflit de modification des droits utilisateur ! Veuillez relire et confirmer vos modifications.",
        "group": "Groupe :",
        "group-user": "Utilisateurs",
        "right-editsemiprotected": "Modifier les pages protégées avec « {{int:protect-level-autoconfirmed}} »",
        "right-editcontentmodel": "Modifier le modèle de contenu d’une page",
        "right-editinterface": "Modifier l'interface utilisateur",
-       "right-editusercssjs": "Modifier les fichiers CSS et JavaScript d'autres utilisateurs",
        "right-editusercss": "Modifier les fichiers CSS d'autres utilisateurs",
        "right-edituserjs": "Modifier les fichiers JavaScript d'autres utilisateurs",
        "right-editmyusercss": "Modifier vos propres fichiers CSS utilisateur",
        "grant-protect": "Protéger et déprotéger des pages",
        "grant-rollback": "Révoquer des modifications sur des pages",
        "grant-sendemail": "Envoyer des courriels aux autres utilisateurs",
-       "grant-uploadeditmovefile": "Télécharger, remplacer et renommer des fichiers",
+       "grant-uploadeditmovefile": "Téléverser, remplacer et renommer des fichiers",
        "grant-uploadfile": "Importer de nouveaux fichiers",
        "grant-basic": "Droits de base",
        "grant-viewdeleted": "Afficher les fichiers et pages supprimés",
        "action-protect": "modifier les niveaux de protection pour cette page",
        "action-rollback": "annuler rapidement les modifications du dernier utilisateur qui a modifié une page donnée",
        "action-import": "importer des pages depuis un autre wiki",
-       "action-importupload": "importer des pages depuis un fichier téléchargé",
+       "action-importupload": "importer des pages depuis un fichier téléversé",
        "action-patrol": "marquer la modification des autres comme relue",
        "action-autopatrol": "avoir votre modification marquée comme relue",
        "action-unwatchedpages": "voir la liste des pages non suivies",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Lister",
        "rcfilters-activefilters": "Filtres actifs",
+       "rcfilters-quickfilters": "Raccoucis",
+       "rcfilters-quickfilters-placeholder-title": "Aucun lien n'a encore été sauvegardé",
+       "rcfilters-quickfilters-placeholder-description": "Pour sauvegarder la configuration de vos filtres pour les réutiliser ultérieurement, cliquez sur l'icône des raccourcis dans la zone des filtres actifs, ci-dessous.",
+       "rcfilters-savedqueries-defaultlabel": "Filtres sauvegardés",
+       "rcfilters-savedqueries-rename": "Renommer",
+       "rcfilters-savedqueries-setdefault": "Activer par défaut",
+       "rcfilters-savedqueries-unsetdefault": "Supprime par défaut",
+       "rcfilters-savedqueries-remove": "Supprimer",
+       "rcfilters-savedqueries-new-name-label": "Nom",
+       "rcfilters-savedqueries-apply-label": "Créer un raccourci",
+       "rcfilters-savedqueries-cancel-label": "Annuler",
+       "rcfilters-savedqueries-add-new-title": "Sauvegarder les filtres en tant que raccourci",
        "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-search-placeholder": "Filtrer les modifications récentes (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-whatsthis": "Qu’est-ce que c'est ?",
+       "rcfilters-filterlist-feedbacklink": "Fournir un commentaire sur les nouveaux filtres (en bêta)",
        "rcfilters-highlightbutton-title": "Mettre en valeur les résultats",
        "rcfilters-highlightmenu-title": "Choisir une couleur",
+       "rcfilters-highlightmenu-help": "Sélectionner une couleur pour mettre en évidence cette propriété",
        "rcfilters-filterlist-noresults": "Aucun filtre trouvé",
+       "rcfilters-noresults-conflict": "Aucun résultat trouvé car les critères de recherche sont en conflit",
+       "rcfilters-state-message-subset": "Ce filtre n'a aucun effet, parce que ses résultats sont inclus dans ceux de la recherche suivante, {{PLURAL:$2|filtre plus étendu|filtres plus étendus}} (essayez la mise en forme pour le différencier): $1",
+       "rcfilters-state-message-fullcoverage": "Sélectionner tous les filtres dans un groupe est la même chose que d'en sélectionner aucun, aussi ce filtre n'a aucun effet. Le groupe comprend: $1",
        "rcfilters-filtergroup-registration": "Inscription de l’utilisateur",
-       "rcfilters-filter-registered-label": "Enregistré",
+       "rcfilters-filter-registered-label": "Connectés",
        "rcfilters-filter-registered-description": "Éditeurs connectés.",
-       "rcfilters-filter-unregistered-label": "Désinscrit",
+       "rcfilters-filter-unregistered-label": "Non connectés",
        "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-filter-unregistered-conflicts-user-experience-level": "Ce filtre est en conflit avec le{{PLURAL:$2| filtre|s filtres}}      Experience suivant, qui ne {{PLURAL:$2|trouve|trouvent}} que des utilisateurs inscrits : $1",
+       "rcfilters-filtergroup-authorship": "Paternité des contributions",
+       "rcfilters-filter-editsbyself-label": "Modifications faites par vous",
+       "rcfilters-filter-editsbyself-description": "Vos propres contributions.",
+       "rcfilters-filter-editsbyother-label": "Modifications faites par les autres.",
+       "rcfilters-filter-editsbyother-description": "Toutes les modifications sauf les votres.",
        "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-user-experience-level-conflicts-unregistered": "Les filtres Experience ne trouvent que des utilisateurs enregistrés, et ce filtre est en conflit avec le filtre \"non enregistré\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Le filtre \"non enregistrés\" est en conflit avec un ou plusieurs  filtres Expérience, qui ne trouvent que les utilisateurs inscrits seulement. Les filtres en conflit sont marqués dans le champ des filtres actifs, ci-dessus.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nouveaux arrivants",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Moins de 10 modifications et 4 jours d’activité.",
+       "rcfilters-filter-user-experience-level-learner-label": "Apprentis",
+       "rcfilters-filter-user-experience-level-learner-description": "Plus expérimenté que les « Nouveaux arrivants » mais moins que les « Utilisateurs expérimentés ».",
+       "rcfilters-filter-user-experience-level-experienced-label": "Utilisateurs expérimentés",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Etat de révision",
+       "rcfilters-filter-patrolled-label": "Patrouillé",
+       "rcfilters-filter-patrolled-description": "Modifications marquées comme relues.",
+       "rcfilters-filter-unpatrolled-label": "Non patrouillé",
+       "rcfilters-filter-unpatrolled-description": "Modifications non marquées comme étant relues.",
        "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-watchlist": "Pages de la liste de suivi",
+       "rcfilters-filter-watchlist-watched-label": "Sur la liste de suivi",
+       "rcfilters-filter-watchlist-watched-description": "Pages de votre liste de suivi modifiées.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nouvelles modifications de la liste de suivi",
+       "rcfilters-filter-watchlist-watchednew-description": "Changements sur les pages de la liste de suivi que vous n'avez pas consultées depuis que ces modifications ont été faites.",
+       "rcfilters-filter-watchlist-notwatched-label": "Absent de la liste de suivi",
+       "rcfilters-filter-watchlist-notwatched-description": "Tout sauf des modifications de pages de la liste de suivi.",
        "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-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…",
+       "rcfilters-filter-logactions-description": "Actions d’administration, créations de compte, suppression de pages, téléversements…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Le filtre « Modifications mineures » est en conflit avec au moins un filtre de Type de modification, parce que certains types de modification ne peuvent être marqués comme « mineurs ». Les filtres en conflit sont marqués dans la zone Filtres actifs ci-dessus.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Certains types de modification ne peuvent pas être qualifiés de « mineurs », donc ce filtre est en conflit avec les filtres de Type de modification suivants : $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ce filtre de Type de modification est en conflit avec le filtre « Modifications mineures ». Certains type sde modification ne peuvent pas être indiqués comme « mineurs ».",
+       "rcfilters-filtergroup-lastRevision": "Version actuelle",
+       "rcfilters-filter-lastrevision-label": "Version actuelle",
+       "rcfilters-filter-lastrevision-description": "Dernière modification apportée à une page.",
+       "rcfilters-filter-previousrevision-label": "Versions précédentes",
+       "rcfilters-filter-previousrevision-description": "Toutes les modifications apportées à une page et qui ne sont pas la dernière.",
        "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>).",
+       "rclistfromreset": "Réinitialiser la sélection de la date",
        "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "rcshowhideminor": "$1 les modifications mineures",
        "rcshowhideminor-show": "Afficher",
        "rcshowhidecategorization": "$1 la catégorisation des pages",
        "rcshowhidecategorization-show": "Afficher",
        "rcshowhidecategorization-hide": "Cacher",
-       "rclinks": "Afficher les $1 dernières modifications effectuées au cours des $2 derniers jours<br />$3.",
+       "rclinks": "Afficher les $1 dernières modifications effectuées au cours des $2 derniers jours.",
        "diff": "diff",
        "hist": "hist",
        "hide": "Masquer",
        "file-thumbnail-no": "Le nom du fichier commence par <strong>$1</strong>.\nIl est possible qu'il s'agisse d'une version réduite <em>(vignette)</em>.\nSi vous disposez du fichier en haute résolution, importez-le, sinon veuillez modifier son nom.",
        "fileexists-forbidden": "Un fichier avec ce nom existe déjà et ne peut pas être écrasé.\nSi vous voulez toujours importer votre fichier, veuillez revenir en arrière et utiliser un autre nom. \n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Un fichier portant ce nom existe déjà dans le dépôt de fichiers partagé.\nSi vous voulez toujours importer votre fichier, veuillez revenir en arrière et utiliser un autre nom. \n[[File:$1|thumb|center|$1]]",
-       "fileexists-no-change": "Le fichier téléchargé est une copie exacte de la version actuelle de <strong>[[:$1]]</strong>",
+       "fileexists-no-change": "Le fichier téléversé est une copie exacte de la version actuelle de <strong>[[:$1]]</strong>",
        "fileexists-duplicate-version": "Le fichier téléversé est une copie exacte {{PLURAL:$2|d'une version précédente|de versions précédentes}} de <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Ce fichier est un doublon {{PLURAL:$1|du fichier suivant|des fichiers suivants}} :",
        "file-deleted-duplicate": "Un fichier identique à celui-ci ([[:$1]]) a déjà été supprimé. \nVous devriez vérifier le journal des suppressions de ce fichier avant de l'importer à nouveau.",
        "php-uploaddisabledtext": "L'import de fichiers est désactivé en PHP. Vérifiez l'option de configuration file_uploads.",
        "uploadscripted": "Ce fichier contient du code HTML ou un script qui pourrait être interprété de façon incorrecte par un navigateur web.",
        "upload-scripted-pi-callback": "Impossible de charger un fichier qui contient des instructions de traitement de feuille de style XML.",
-       "uploaded-script-svg": "Élément scriptable « $1 » trouvé dans le fichier SVG téléchargé.",
+       "upload-scripted-dtd": "Impossible de téléverser des fichiers SVG qui contiennent une déclaration de DTD non standard.",
+       "uploaded-script-svg": "Élément scriptable « $1 » trouvé dans le fichier SVG téléversé.",
        "uploaded-hostile-svg": "CSS non sûr trouvé dans l’élément style d’un fichier SVG téléversé.",
        "uploaded-event-handler-on-svg": "Fixer des attributs de gestionnaire d’événement <code>$1=\"$2\"</code> n’est pas autorisé dans les fichiers SVG.",
        "uploaded-href-attribute-svg": "les attributs href dans les fichiers SVG ne sont autorisés que pour faire référence à des cibles http:// ou https://, <code>&lt;$1 $2=\"$3\"&gt;</code> trouvé.",
-       "uploaded-href-unsafe-target-svg": "Un href vers des données non sûres a été trouvé dans le fichier SVG téléchargé : URI cible <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploaded-animate-svg": "Balise « animate » trouvée, qui pourrait modifier le href en utilisant l’attribut « from » <code>&lt;$1 $2=\"$3\"&gt;</code> dans le fichier SVG téléchargé.",
-       "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-href-unsafe-target-svg": "Un href vers des données non sûres a été trouvé dans le fichier SVG téléversé : URI cible <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-animate-svg": "Balise « animate » trouvée, qui pourrait modifier le href en utilisant l’attribut « from » <code>&lt;$1 $2=\"$3\"&gt;</code> dans le fichier SVG téléversé.",
+       "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éversé.",
        "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 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é.",
+       "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éversé.",
+       "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éversé.",
+       "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éversé.",
+       "uploaded-image-filter-svg": "Filtre d’image avec URL trouvé : <code>&lt;$1 $2=\"$3\"&gt;</code> dans le fichier SVG téléversé.",
        "uploadscriptednamespace": "Ce fichier SVG contient un espace de noms '<nowiki>$1</nowiki>' non autorisé.",
        "uploadinvalidxml": "Le XML dans le fichier importé n’a pas pu être analysé.",
        "uploadvirus": "Ce fichier contient un virus ! Pour plus de détails, consultez : $1",
-       "uploadjava": "C’est un fichier ZIP qui contient un fichier Java .class.\nLe téléchargement de fichiers Java n’est pas autorisé, car ils peuvent contourner certaines restrictions de sécurité.",
+       "uploadjava": "C’est un fichier ZIP qui contient un fichier Java .class.\nLe téléversement de fichiers Java n’est pas autorisé, car ils peuvent contourner certaines restrictions de sécurité.",
        "upload-source": "Fichier source",
        "sourcefilename": "Nom du fichier source :",
        "sourceurl": "URL source :",
        "upload-too-many-redirects": "L’URL contient trop de redirections.",
        "upload-http-error": "Une erreur HTTP est survenue : $1",
        "upload-copy-upload-invalid-domain": "La copie des téléversements n’est pas disponible depuis ce domaine.",
-       "upload-foreign-cant-upload": "Ce wiki n’est pas configuré pour télécharger des fichiers vers le dépôt de fichiers externe demandé.",
+       "upload-foreign-cant-upload": "Ce wiki n’est pas configuré pour téléverser des fichiers vers le dépôt de fichiers externe demandé.",
        "upload-foreign-cant-load-config": "Échec au chargement de la configuration du téléversement des fichiers vers le référentiel de fichiers étrangers.",
        "upload-dialog-disabled": "Les téléversements de fichier utilisant cette boîte de dialogue sont désactivés sur ce wiki.",
        "upload-dialog-title": "Téléverser un fichier",
        "upload-form-label-own-work": "Je suis l’auteur de cette œuvre",
        "upload-form-label-infoform-categories": "Catégories",
        "upload-form-label-infoform-date": "Date",
-       "upload-form-label-own-work-message-generic-local": "Je confirme que je télécharge ce fichier suivant les conditions et les politiques de licence de {{SITENAME}}",
-       "upload-form-label-not-own-work-message-generic-local": "Si vous ne pouvez pas télécharger ce fichier d’après les politiques de {{SITENAME}}, veuillez fermer cette boîte de dialogue et essayer une autre méthode.",
-       "upload-form-label-not-own-work-local-generic-local": "Vous pouvez aussi essayer [[Special:Upload|la page de téléchargement par défaut]].",
+       "upload-form-label-own-work-message-generic-local": "Je confirme que je téléverse ce fichier suivant les conditions et les politiques de licence de {{SITENAME}}",
+       "upload-form-label-not-own-work-message-generic-local": "Si vous ne pouvez pas téléverser ce fichier d’après les politiques de {{SITENAME}}, veuillez fermer cette boîte de dialogue et essayer une autre méthode.",
+       "upload-form-label-not-own-work-local-generic-local": "Vous pouvez aussi essayer [[Special:Upload|la page de téléversement par défaut]].",
        "upload-form-label-own-work-message-generic-foreign": "Je comprends que je téléverse ce fichier vers un dépôt partagé. Je confirme agir en accord avec les conditions d’utilisation et les règles relatives aux licences de celui-ci.",
        "upload-form-label-not-own-work-message-generic-foreign": "Si vous n’êtes pas en mesure de téléverser ce fichier de façon conforme aux règles de ce dépôt partagé, veuillez fermer cette boîte de dialogue et essayer une autre méthode.",
        "upload-form-label-not-own-work-local-generic-foreign": "Vous pouvez également essayer d’utiliser [[Special:Upload|la page de téléversement de {{SITENAME}}]], si leurs règles autorisent le téléversement du fichier.",
        "backend-fail-maxsize": "Impossible d’écrire le fichier « $1 » parce qu’il est plus grand {{PLURAL:$2|qu’un octet|que $2 octets}}.",
        "backend-fail-readonly": "Le support de stockage « $1 » est actuellement en lecture seule. La raison indiquée est : <em>$2</em>",
        "backend-fail-synced": "Le fichier « $1 » est dans un état incohérent dans les supports de stockage internes",
-       "backend-fail-connect": "Impossible de se connecter au support de stockage « $1 ».",
-       "backend-fail-internal": "Une erreur inconnue s’est produite dans le support de stockage « $1 ».",
+       "backend-fail-connect": "Impossible de se connecter au média de stockage « $1 ».",
+       "backend-fail-internal": "Une erreur inconnue s’est produite dans le média de stockage « $1 ».",
        "backend-fail-contenttype": "Impossible de déterminer le type de contenu du fichier à stocker en « $1 ».",
        "backend-fail-batchsize": "On a fourni au support de stockage un lot de $1 {{PLURAL:$1|opération|opérations}} de fichier; la limite est $2 {{PLURAL:$2|opération|opérations}}.",
        "backend-fail-usable": "Impossible de lire ou d’écrire le fichier « $1 » en raison de droits insuffisants ou de répertoires/conteneurs manquants.",
        "uploadstash-errclear": "La suppression des fichiers a échoué.",
        "uploadstash-refresh": "Actualiser la liste des fichiers",
        "uploadstash-thumbnail": "afficher la vignette",
-       "uploadstash-exception": "Impossible de stocker le téléchargement dans la réserve ($1) : « $2 ».",
+       "uploadstash-exception": "Impossible de stocker le téléversement dans la réserve ($1) : « $2 ».",
        "invalid-chunk-offset": "Offset de segment non valide",
        "img-auth-accessdenied": "Accès refusé",
        "img-auth-nopathinfo": "PATH_INFO manquant.\nVotre serveur n’est pas paramétré pour transmettre cette information.\nIl fonctionne peut-être en CGI et ne prend pas en charge img_auth.\nVoir : https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "enotif_body_intro_moved": "La page $1 sur {{SITENAME}} a été {{GENDER:$2|renommée}} le $PAGEEDITDATE par $2, voir $3 pour la révision actuelle.",
        "enotif_body_intro_restored": "La page $1 sur {{SITENAME}} a été restaurée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.",
        "enotif_body_intro_changed": "La page $1 sur {{SITENAME}} a été {{GENDER:$2|modifiée}} le $PAGEEDITDATE par $2, voir $3 pour la révision actuelle.",
-       "enotif_lastvisited": "Voyez $1 pour tous les changements depuis votre dernière visite.",
-       "enotif_lastdiff": "Voyez $1 pour visualiser ces changements.",
+       "enotif_lastvisited": "Pour tous les changements intervenus depuis votre dernière visite, voyez $1",
+       "enotif_lastdiff": "Pour visualiser ces changements, voyez $1",
        "enotif_anon_editor": "utilisateur non-enregistré $1",
        "enotif_body": "Cher $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRésumé du contributeur : $PAGESUMMARY $PAGEMINOREDIT\n\nContactez ce contributeur :\ncourriel : $PAGEEDITOR_EMAIL\nwiki : $PAGEEDITOR_WIKI\n\nIl n’y aura pas d’autres notifications en cas de changements ultérieurs, à moins que vous ne visitiez cette page une fois connecté. Vous pouvez aussi réinitialiser les drapeaux de notification pour toutes les pages de votre liste de suivi.\n\nVotre système de notification de {{SITENAME}}\n\n--\nPour modifier les paramètres de notification par courriel, visitez\n{{canonicalurl:{{#special:Preferences}}}}\n\nPour modifier les paramètres de votre liste de suivi, visitez\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPour supprimer la page de votre liste de suivi, visitez\n$UNWATCHURL\n\nRetour et assistance :\n$HELPPAGE",
        "created": "créée",
        "undeleteviewlink": "voir",
        "undeleteinvert": "Inverser la sélection",
        "undeletecomment": "Motif :",
-       "undeletedrevisions": "$1 {{PLURAL:$1|version restaurée|versions restaurées}}",
-       "undeletedrevisions-files": "$1 version{{PLURAL:$1||s}} et $2 fichier{{PLURAL:$2||s}} restauré{{PLURAL:$2||s}}",
-       "undeletedfiles": "$1 {{PLURAL:$1|fichier restauré|fichiers restaurés}}",
        "cannotundelete": "Certaines ou toutes les restaurations ont échoué :\n$1",
        "undeletedpage": "<strong>La page $1 a été restaurée.</strong>\n\nConsultez le [[Special:Log/delete|journal des suppressions]] pour obtenir la liste des récentes suppressions et restaurations.",
        "undelete-header": "Consultez le [[Special:Log/delete|journal des suppressions]] pour lister les pages récemment supprimées.",
        "sp-contributions-uploads": "imports",
        "sp-contributions-logs": "journaux",
        "sp-contributions-talk": "discuter",
-       "sp-contributions-userrights": "gérer les droits",
+       "sp-contributions-userrights": "gérer les droits {{GENDER:$1|utilisateur}}",
        "sp-contributions-blocked-notice": "Cet utilisateur est actuellement bloqué. \nLa dernière entrée du journal des blocages est affichée ci-dessous pour référence :",
        "sp-contributions-blocked-notice-anon": "Cette adresse IP est actuellement bloquée.\nLa dernière entrée du journal des blocages est affichée ci-dessous pour référence :",
        "sp-contributions-search": "Rechercher les contributions",
        "unblocked-id": "Le blocage $1 a été enlevé",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] a été débloqué.",
        "blocklist": "Utilisateurs bloqués",
+       "autoblocklist": "Blocages automatiques",
+       "autoblocklist-submit": "Rechercher",
+       "autoblocklist-legend": "Lister les blocages automatiques",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Blocage automatique local|Blocages automatiques locaux}}",
+       "autoblocklist-empty": "La liste des blocages automatiques est vide.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Autre blocage automatique|Autres blocages automatiques}}",
        "ipblocklist": "Utilisateurs bloqués",
        "ipblocklist-legend": "Chercher un utilisateur bloqué",
        "blocklist-userblocks": "Masquer les blocages de comptes",
        "movelogpagetext": "Voici la liste de toutes les pages renommées ou déplacées.",
        "movesubpage": "Sous-page{{PLURAL:$1||s}}",
        "movesubpagetext": "Cette page a $1 {{PLURAL:$1|sous-page affichée|sous-pages affichées}} ci-dessous.",
-       "movesubpagetalktext": "La page de discussion correspodnante a $1 {{PLURAL:$1|sous-page|sous-pages}} affichées ci-dessous.",
+       "movesubpagetalktext": "La page de discussion correspondante a $1 {{PLURAL:$1|sous-page|sous-pages}} affichées ci-dessous.",
        "movenosubpage": "Cette page n'a aucune sous-page.",
        "movereason": "Motif :",
        "revertmove": "rétablir",
        "tooltip-pt-mycontris": "La liste de {{GENDER:|vos}} contributions",
        "tooltip-pt-anoncontribs": "Une liste des modifications effectuées depuis cette adresse IP",
        "tooltip-pt-login": "Il est recommandé de vous identifier ; ce n'est cependant pas obligatoire.",
+       "tooltip-pt-login-private": "Vous devez vous connecter pour utiliser ce wiki",
        "tooltip-pt-logout": "Se déconnecter",
        "tooltip-pt-createaccount": "Il vous est conseillé de créer un compte et de vous connecter ; cependant, ce n’est pas obligatoire",
        "tooltip-ca-talk": "Discussion au sujet de cette page de contenu",
        "newimages-summary": "Cette page spéciale affiche les derniers fichiers importés.",
        "newimages-legend": "Filtre",
        "newimages-label": "Nom du fichier (ou une partie de celui-ci) :",
+       "newimages-user": "Adresse IP ou nom d'utilisateur",
        "newimages-showbots": "Afficher les imports faits par des robots",
-       "newimages-hidepatrolled": "Masquer les téléchargements patrouillés",
+       "newimages-hidepatrolled": "Masquer les téléversements patrouillés",
        "noimages": "Aucune image à afficher.",
        "gallery-slideshow-toggle": "Basculer les vignettes",
        "ilsubmit": "Rechercher",
        "exif-artist": "Auteur",
        "exif-copyright": "Détenteur du droit d'auteur",
        "exif-exifversion": "Version EXIF",
-       "exif-flashpixversion": "Version FlashPix supportée",
+       "exif-flashpixversion": "Version FlashPix prise en charge",
        "exif-colorspace": "Espace colorimétrique",
        "exif-componentsconfiguration": "Signification de chaque composante",
        "exif-compressedbitsperpixel": "Mode de compression de l'image",
        "confirmemail_sendfailed": "{{SITENAME}} n’a pas pu vous envoyer le courriel de confirmation.\nVeuillez vérifiez que votre adresse de courriel ne comprend aucun caractère incorrect.\n\nLe programme d’envoi de courriel a retourné l’indication suivante : $1",
        "confirmemail_invalid": "Code de confirmation incorrect.\nCelui-ci a peut-être expiré.",
        "confirmemail_needlogin": "Vous devez vous $1 pour confirmer votre adresse de courriel.",
-       "confirmemail_success": "Votre adresse de courriel a été confirmée.\nVous pouvez maintenant vous [[Special:UserLogin|{{MediaWiki:Loginreqlink}}]] et profiter du wiki.",
+       "confirmemail_success": "Votre adresse de courriel a été confirmée.\nVous pouvez maintenant vous [[Special:UserLogin|{{MediaWiki:Loginreqlink/fr}}]] et profiter du wiki.",
        "confirmemail_loggedin": "Votre adresse de courriel est maintenant confirmée.",
        "confirmemail_subject": "Confirmation d’adresse de courriel pour {{SITENAME}}",
        "confirmemail_body": "Quelqu’un, probablement vous, à partir de l’adresse IP $1,\na créé un compte « $2 » avec cette adresse de courriel sur le site {{SITENAME}}.\n\nPour confirmer que ce compte vous appartient vraiment et afin\nd’activer les fonctions de messagerie sur {{SITENAME}},\nveuillez suivre ce lien dans votre navigateur :\n\n$3\n\nSi vous n’avez *pas* créé ce compte, suivez le lien ci-dessous \npour annuler la confirmation de votre adresse courriel :\n\n$5\n\nCe code de confirmation expirera le $4.",
        "confirmemail_body_changed": "Quelqu’un, probablement vous, à partir de l’adresse IP $1,\na modifié l’adresse de courriel associée au compte « $2 » de {{SITENAME}}\nen cette adresse.\n\nPour confirmer que ce compte vous appartient vraiment et afin\nde réactiver les fonctions de messagerie sur {{SITENAME}},\nveuillez suivre ce lien dans votre navigateur :\n\n$3\n\nSi ce compte ne vous appartient *pas*, n’ouvrez pas ce lien ;\nvous pouvez suivre l’autre lien ci-dessous pour annuler la\nconfirmation de votre adresse courriel :\n\n$5\n\nCe code de confirmation expirera le $4.",
-       "confirmemail_body_set": "Quelqu’un, probablement vous, depuis l’adresse IP $1, a modifié l’adresse de courriel du compte « $2 » en celle-ci sur {{SITENAME}}.\n\nPour confirmer que ce compte vous appartient et réactiver les fonctions de courriel sur {{SITENAME}}, ouvrez ce lien dans votre navigateur Web :\n\n$3\n\nCe code de confirmation expirera le $4.\n\nSi le compte ne vous appartient *pas*, suivez plutôt ce lien pour annuler la confirmation de l’adresse de courriel :\n\n$5",
+       "confirmemail_body_set": "Quelqu’un, probablement vous, depuis l’adresse IP $1, a modifié l’adresse de courriel du compte « $2 » en celle-ci sur {{SITENAME}}.\n\nPour confirmer que ce compte vous appartient et réactiver les fonctions de courriel sur {{SITENAME}}, ouvrez ce lien dans votre navigateur Web :\n\n$3\n\nSi le compte ne vous appartient *pas*, suivez plutôt ce lien pour annuler la confirmation de l’adresse de courriel :\n\n$5\n\nCe code de confirmation expirera le $4.",
        "confirmemail_invalidated": "Confirmation de l’adresse courriel annulée",
        "invalidateemail": "Annuler la confirmation de l'adresse de courriel",
        "notificationemail_subject_changed": "L’adresse courriel enregistrée sur {{SITENAME}} a été changée",
        "confirmrecreate": "L’utilisat{{GENDER:$1|eur|rice}} [[User:$1|$1]] ([[User talk:$1|Discussion]]) a supprimé cette page, alors que vous aviez commencé à la modifier, pour le motif suivant :\n: <em>$2</em>\nVeuillez confirmer que vous désirez réellement recréer cette page.",
        "confirmrecreate-noreason": "L’utilisat{{GENDER:$1|eur|rice}} [[User:$1|$1]] ([[User talk:$1|Discussion]]) a supprimé cette page, alors que vous aviez commencé à la modifier. Veuillez confirmer que vous désirez réellement recréer cette page.",
        "recreate": "Recréer",
+       "confirm-purge-title": "Purger cette page",
        "confirm_purge_button": "Confirmer",
        "confirm-purge-top": "Voulez-vous rafraîchir cette page (purger le cache) ?",
-       "confirm-purge-bottom": "Purger une page l’efface du cache de rendu et force sa dernière version à être régénérée et affichée.",
+       "confirm-purge-bottom": "Purger une page l’efface du cache et force sa dernière version à être affichée.",
        "confirm-watch-button": "Valider",
        "confirm-watch-top": "Ajouter cette page à votre liste de suivi ?",
        "confirm-unwatch-button": "Valider",
        "htmlform-user-not-exists": "<strong>$1</strong> n’existe pas.",
        "htmlform-user-not-valid": "<strong>$1</strong> n’est pas un nom d’utilisateur valide.",
        "logentry-delete-delete": "$1 {{GENDER:$2|a supprimé}} la page $3",
-       "logentry-delete-delete_redir": "$1 {{GENDER:$2|supprimé}} redirigé vers $3 par écrasement.",
-       "logentry-delete-restore": "$1 {{GENDER:$2|a restauré}} la page $3",
+       "logentry-delete-delete_redir": "$1 a {{GENDER:$2|supprimé}} la redirection vers $3 par écrasement",
+       "logentry-delete-restore": "$1 {{GENDER:$2|a restauré}} la page $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|a restauré}} la page $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 révision|$1 révisions}}",
+       "restore-count-files": "{{PLURAL:$1|1 fichier|$1 fichiers}}",
        "logentry-delete-event": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3 : $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|a modifié}} la visibilité des événements du journal sur $3",
        "logentry-block-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} avec une durée de $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} avec une durée de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} avec une durée de $5 $6",
-       "logentry-import-upload": "$1 {{GENDER:$2|a importé}} $3 par téléchargement de fichier",
-       "logentry-import-upload-details": "$1 {{GENDER:$2|a importé}} $3 par téléchargement de fichier ($4 {{PLURAL:$4|révision|révisions}})",
+       "logentry-import-upload": "$1 {{GENDER:$2|a importé}} $3 par téléversement de fichier",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|a importé}} $3 par téléversement de fichier ($4 {{PLURAL:$4|révision|révisions}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|a importé}} $3 depuis un autre wiki",
        "logentry-import-interwiki-details": "$1 {{GENDER:$2|a importé}} $3 depuis $5 ($4 {{PLURAL:$4|révision|révisions}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|a fusionné}} $3 en $4 (révisions jusqu’à $5)",
        "logentry-rights-rights": "$1 a modifié l’appartenance au groupe pour {{GENDER:$6|$3}} de $4 à $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|a été promu}} automatiquement de $4 à $5",
-       "logentry-upload-upload": "$1 {{GENDER:$2|a téléchargé}} $3",
+       "logentry-upload-upload": "$1 {{GENDER:$2|a téléversé}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|a téléversé}} une nouvelle version de $3",
-       "logentry-upload-revert": "$1 {{GENDER:$2|a téléchargé}} $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|a téléversé}} $3",
        "log-name-managetags": "Journal des modifications de balises",
        "log-description-managetags": "Cette page recense les tâches de maintenance liées aux [[Special:Tags|balises]]. Le journal contient uniquement les actions faites manuellement par un administrateur ; les balises peuvent être créées ou supprimées par le logiciel wiki sans que cette action ne soit inscrite dans ce journal.",
        "logentry-managetags-create": "$1 {{GENDER:$2|a créé}} la balise « $4 ».",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|a mis à jour}} les balises de la révision $4 de la page $3 ($6 {{PLURAL:$7|ajoutée|ajoutées}} ; $8 {{PLURAL:$9|supprimée|supprimées}})",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|a mis à jour}} les balises de l’entrée de journal $5 de la page $3 ($6 {{PLURAL:$7|ajoutée|ajoutées}} ; $8 {{PLURAL:$9|supprimée|supprimées}})",
        "rightsnone": "(aucun)",
-       "revdelete-summary": "résumé de modification",
        "rightslogentry-temporary-group": "$1 (temporaire, jusqu'au $2)",
        "feedback-adding": "Ajout de vos commentaires à la page...",
        "feedback-back": "Retour",
        "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_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 d’analyse prises en charge 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_title": "Titre de la page, si le code utilise {{FULLPAGENAME}}, etc. :",
        "expand_templates_input": "Texte wiki source :",
        "expand_templates_output": "Texte wiki obtenu après expansion",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activé)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>désactivé</strong>)",
        "mediastatistics": "Statistiques sur les médias",
-       "mediastatistics-summary": "Statistiques sur les types de fichier téléchargés. Elles ne prennent en compte que la version la plus récente d’un fichier. Les versions anciennes ou supprimées des fichiers sont exclues.",
+       "mediastatistics-summary": "Statistiques sur les types de fichier téléversés. Elles ne prennent en compte que la version la plus récente d’un fichier. Les versions anciennes ou supprimées des fichiers sont exclues.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 octet|$1 octets}} ($2 ; $3%)",
        "mediastatistics-bytespertype": "Taille totale de fichiers pour cette section : {{PLURAL:$1|$1 octet|$1 octets}} ($2 ; $3%).",
        "mediastatistics-allbytes": "Taille totale pour tous les fichiers : {{PLURAL:$1|$1 octet|$1 octets}} ($2).",
        "special-characters-group-thai": "thaï",
        "special-characters-group-lao": "laotien",
        "special-characters-group-khmer": "khmer",
+       "special-characters-group-canadianaboriginal": "Aborigène canadien",
        "special-characters-title-endash": "tiret demi-cadratin",
        "special-characters-title-emdash": "tiret cadratin",
        "special-characters-title-minus": "signe moins",
        "mw-widgets-titleinput-description-redirect": "redirection vers $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Ajouter une catégorie...",
        "mw-widgets-usersmultiselect-placeholder": "Ajouter plus ...",
+       "date-range-from": "À partir du :",
+       "date-range-to": "Jusqu’au :",
        "sessionmanager-tie": "Impossible de combiner des types multiples de demandes d’authentification : $1.",
        "sessionprovider-generic": "sessions $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basées sur les témoins (''cookies'')",
        "unlinkaccounts": "Dissocier les comptes",
        "unlinkaccounts-success": "Le compte a été dissocié.",
        "authenticationdatachange-ignored": "Les modifications de données d’authentification n’ont pas été gérées. Peut-être aucun fournisseur n’a-t-il été configuré ?",
-       "userjsispublic": "Veuillez noter: les sous-pages JavaScript ne doivent pas contenir de données confidentielles parce qu'elles sont visibles des autres utilisateurs.",
+       "userjsispublic": "Veuillez noter : les sous-pages JavaScript ne doivent pas contenir de données confidentielles parce qu’elles sont visibles des autres utilisateurs.",
        "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 <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "version $1",
-       "pageid": "ID de page $1"
+       "pageid": "ID de page $1",
+       "rawhtml-notallowed": "Les balises &lt;html&gt; ne peuvent pas être utilisées en dehors des pages normales.",
+       "gotointerwiki": "Quitter {{SITENAME}}",
+       "gotointerwiki-invalid": "Le titre spécifié n’est pas valide.",
+       "gotointerwiki-external": "Vous allez quitter {{SITENAME}} pour visiter [[$2]], qui est un site web distinct.\n\n<strong>[$1 Continuer vers $1]</strong>",
+       "undelete-cantedit": "Vous ne pouvez pas annuler la suppression de cette page car vous n’êtes pas autorisé à la modifier.",
+       "undelete-cantcreate": "Vous ne pouvez pas annuler la suppression de cette page car il n’existe pas de page avec ce nom, et vous n’êtes pas autorisé à la créer."
 }
index 3ae9648..7680da0 100644 (file)
        "externaldberror": "Soit y avait une erreur avec la base d'information de certification extérieur, soit vous avez pas la permission de renouveler votre compte extérieur.",
        "login": "Connecter",
        "nav-login-createaccount": "Connecter / créer un compte",
-       "userlogin": "Connecter / créer un compte",
        "logout": "Déconnecter",
        "userlogout": "Déconnecter",
        "notloggedin": "Pas connecté",
-       "nologin": "Vous avez pas de compte? '''$1'''.",
-       "nologinlink": "Créez un compte",
        "createaccount": "Créer un compte",
-       "gotaccount": "Vous avez un compte déjà? '''$1'''.",
-       "gotaccountlink": "Connectez",
-       "userlogin-resetlink": "Oublié vôtre détailes de log in?",
        "createacct-emailrequired": "Adresse d'email",
        "createacct-emailoptional": "Adresse d'email (optional)",
        "createacct-email-ph": "Entres t'adresse d'email",
        "createacct-another-email-ph": "Entres adresse d'email",
        "createaccountmail": "par e-mail",
-       "createaccountreason": "Raison:",
        "createacct-reason": "Raison",
        "createacct-reason-ph": "Pourquoi crées-tu un autre compte",
        "badretype": "Les mots de passe que vous avez mis sont pas pareils.",
        "resetpass-temp-password": "Mot de passe temporaire:",
        "passwordreset-username": "Nom d'useur:",
        "passwordreset-domain": "Domaine:",
-       "passwordreset-capture": "Regarder l'email résultant?",
        "passwordreset-email": "Adresse d'email:",
        "changeemail-none": "(aucun)",
        "changeemail-password": "Ton mot de passe sur {{SITENAME}}:",
        "editingsection": "Changement de $1 (section)",
        "editingcomment": "Changement de $1 (remarque)",
        "editconflict": "Dispute de changement: $1",
-       "explainconflict": "Quèqu'une d'autre a changé cette page depuis vous avez commencé à la changer.\nLa boëtte de changements en haut contient le texte de la page comme c'est asteur.\nVos changements sont montrés dans la boëtte de changements en bas.\nIl foudra que vous mettez vos changements dans le texte qu'est là asteur.\n'''Juste''' le texte dans la boëtte de changements en haut va être sauvé quand vous pèsez \"{{int:savearticle}}\".",
+       "explainconflict": "Quèqu'une d'autre a changé cette page depuis vous avez commencé à la changer.\nLa boëtte de changements en haut contient le texte de la page comme c'est asteur.\nVos changements sont montrés dans la boëtte de changements en bas.\nIl foudra que vous mettez vos changements dans le texte qu'est là asteur.\n'''Juste''' le texte dans la boëtte de changements en haut va être sauvé quand vous pèsez \"$1\".",
        "yourtext": "Votre texte",
        "storedversion": "Version sauvée",
        "nonunicodebrowser": "'''ATTENTION: Votre navigateur supporte pas les caractères unicode.  Une solution de peu de durée a été trouvée pour que vous peuvez changer des articles sans problèmes.  Les caractères qui sont pas ASCII va apparaître dans la boëte de changements comme des codes hexadécimaux.'''",
index 23b5493..78a5689 100644 (file)
        "externaldberror": "Ou ben na fôta est arrevâye avouéc la bâsa de balyês d’ôtentificacion de defôr ou ben vos éte pas ôtorisâ{{GENDER:||ye}} a betar a jorn voutron comptio de defôr.",
        "login": "Branchement",
        "nav-login-createaccount": "Sè branchiér ou ben fâre un comptio",
-       "userlogin": "Sè branchiér ou ben fâre un comptio",
-       "userloginnocreate": "Sè branchiér",
        "logout": "Sè dèbranchiér",
        "userlogout": "Dèbranchement",
        "notloggedin": "Pas branchiê",
        "userlogin-noaccount": "Vos éd p’oncor un comptio ?",
        "userlogin-joinproject": "Rejuegnéd {{SITENAME}}",
-       "nologin": "Vos éd p’oncor un comptio ? $1.",
-       "nologinlink": "Féte un comptio",
        "createaccount": "Fâre un comptio",
-       "gotaccount": "Vos éd ja un comptio ? $1.",
-       "gotaccountlink": "Branchiéd-vos",
-       "userlogin-resetlink": "Vos éd oubliâ voutros dètalys de branchement ?",
        "userlogin-resetpassword-link": "Contresegno oubliâ ?",
        "userlogin-helplink2": "Éde u branchement",
        "userlogin-loggedin": "Vos éte ja branchiê{{GENDER:$1||e}} coment {{GENDER:$1|$1}}.\nEmpleyéd lo formulèro ce-desot por vos branchiér coment un ôtr’utilisator.",
        "createacct-another-email-ph": "Buchiéd l’adrèce èlèctronica",
        "createaccountmail": "Empleyér un contresegno temporèro pas de sûr et lo mandar a l’adrèce èlèctronica spècifiâye",
        "createacct-realname": "Veré nom (u chouèx)",
-       "createaccountreason": "Rêson :",
        "createacct-reason": "Rêson",
        "createacct-reason-ph": "Porquè vos féte un ôtro comptio",
        "createacct-submit": "Féte voutron comptio",
        "preview": "Apèrçu",
        "showpreview": "Montrar un apèrçu",
        "showdiff": "Montrar los changements",
-       "blankarticle": "<strong>Atencion :</strong> la pâge que vos éte aprés fâre est voueda.\nSe vos tornâd cllicar dessus « {{int:savearticle}} », la pâge serat fêta sen gins de contegnu.",
+       "blankarticle": "<strong>Atencion :</strong> la pâge que vos éte aprés fâre est voueda.\nSe vos tornâd cllicar dessus « $1 », la pâge serat fêta sen gins de contegnu.",
        "anoneditwarning": "<strong>Atencion :</strong> vos éte pas branchiê. Voutron adrèce IP serat visibla devant tot lo mondo se vos féte de changements. Se vos vos <strong>[$1 branchiéd]</strong> ou ben <strong>[$2 féte un comptio]</strong>, voutros changements seront atribuâs a voutron nom d’utilisator, entre-mié ôtros avantâjos.",
        "anonpreviewwarning": "<em>Vos éte pas branchiê{{GENDER:||e}}. En encartent, voutron adrèce IP serat encartâye dedens l’historico des changements de cela pâge.</em>",
-       "missingsummary": "<strong>Sovegnence :</strong> vos éd balyê gins de rèsumâ de changement.\nSe vos tornâd cllicar dessus « {{int:savearticle}} », voutron changement serat encartâ sen rèsumâ.",
-       "selfredirect": "<strong>Atencion :</strong> vos éte aprés redirigiér la pâge vers lyé-méma.\nVos pouede avêr spècifiâ na crouye ciba por la redirèccion ou ben pôt-étre vos changiéd na crouye pâge.\nSe vos tornâd cllicar dessus « {{int:savearticle}} », la redirèccion serat fêta tot-un.",
+       "missingsummary": "<strong>Sovegnence :</strong> vos éd balyê gins de rèsumâ de changement.\nSe vos tornâd cllicar dessus « $1 », voutron changement serat encartâ sen rèsumâ.",
+       "selfredirect": "<strong>Atencion :</strong> vos éte aprés redirigiér la pâge vers lyé-méma.\nVos pouede avêr spècifiâ na crouye ciba por la redirèccion ou ben pôt-étre vos changiéd na crouye pâge.\nSe vos tornâd cllicar dessus « $1 », la redirèccion serat fêta tot-un.",
        "missingcommenttext": "Se vos plét, buchiéd un comentèro ce-desot.",
-       "missingcommentheader": "<strong>Sovegnence :</strong> vos éd balyê gins de chousa por cél comentèro.\nSe vos tornâd cllicar dessus « {{int:savearticle}} », voutron changement serat encartâ sen chousa.",
+       "missingcommentheader": "<strong>Sovegnence :</strong> vos éd balyê gins de chousa por cél comentèro.\nSe vos tornâd cllicar dessus « $1 », voutron changement serat encartâ sen chousa.",
        "summary-preview": "Apèrçu du rèsumâ :",
        "subject-preview": "Apèrçu de la chousa :",
        "previewerrortext": "Na fôta est arrevâye pendent l’èprôva d’apèrçu de voutros changements.",
        "editingsection": "Changement de $1 (sèccion)",
        "editingcomment": "Changement de $1 (novèla sèccion)",
        "editconflict": "Disputa de changement : $1",
-       "explainconflict": "Un ôtro at changiê cela pâge aprés que vos vos seyéd betâ a la changiér.\nLa zona de changement de d’amont contint lo tèxto de la pâge coment ègziste orendrêt.\nVoutros changements aparèssont dedens la zona de changement de desot.\nVos voléd devêr fusionar voutros changements dedens lo tèxto ègzistent.\n<strong>Solament</strong> lo tèxto de la zona de changement de d’amont serat encartâ se vos cllicâd dessus « {{int:savearticle}} ».",
+       "explainconflict": "Un ôtro at changiê cela pâge aprés que vos vos seyéd betâ a la changiér.\nLa zona de changement de d’amont contint lo tèxto de la pâge coment ègziste orendrêt.\nVoutros changements aparèssont dedens la zona de changement de desot.\nVos voléd devêr fusionar voutros changements dedens lo tèxto ègzistent.\n<strong>Solament</strong> lo tèxto de la zona de changement de d’amont serat encartâ se vos cllicâd dessus « $1 ».",
        "yourtext": "Voutron tèxto",
        "storedversion": "Vèrsion encartâye",
        "nonunicodebrowser": "<strong>Atencion : voutron navegator recognêt pas l’Unicode.</strong>\nNa solucion de rechanjo est étâye trovâye por vos pèrmetre de changiér en tota suretât na pâge : los caractèros nan-ASCII aparêtront dedens la zona de changement coment codes hègzadècimâls.",
        "right-editsemiprotected": "Changiér les pâges protègiêes avouéc « {{int:protect-level-autoconfirmed}} »",
        "right-editcontentmodel": "Changiér lo modèlo de contegnu d’una pâge",
        "right-editinterface": "Changiér l’entredoux utilisator",
-       "right-editusercssjs": "Changiér los fichiérs CSS et JavaScript d’ôtros utilisators",
        "right-editusercss": "Changiér los fichiérs CSS d’ôtros utilisators",
        "right-edituserjs": "Changiér los fichiérs JavaScript d’ôtros utilisators",
        "right-editmyusercss": "Changiér los voutros fichiérs CSS utilisator",
        "rcshowhidecategorization": "$1 la catègorisacion de les pâges",
        "rcshowhidecategorization-show": "Montrar",
        "rcshowhidecategorization-hide": "Cachiér",
-       "rclinks": "Montrar los $1 dèrriérs changements fêts pendent los $2 jorns passâs<br />$3.",
+       "rclinks": "Montrar los $1 dèrriérs changements fêts pendent los $2 jorns passâs",
        "diff": "dif",
        "hist": "hist",
        "hide": "Cachiér",
        "undeleteviewlink": "vêre",
        "undeleteinvert": "Envèrsar lo chouèx",
        "undeletecomment": "Rêson :",
-       "undeletedrevisions": "$1 {{PLURAL:$1|vèrsion refêta|vèrsions refêtes}}",
-       "undeletedrevisions-files": "$1 vèrsion{{PLURAL:$1||s}} et $2 fichiér{{PLURAL:$2||s}} refêts",
-       "undeletedfiles": "$1 {{PLURAL:$1|fichiér refêt|fichiérs refêts}}",
        "cannotundelete": "Falyita de la rèstoracion :\n$1",
        "undeletedpage": "<strong>$1 est étâye refêta</strong>\n\nVêde lo [[Special:Log/delete|jornâl de les suprèssions]] por avêr na lista de les novèles suprèssions et rèstoracions.",
        "undelete-header": "Vêde lo [[Special:Log/delete|jornâl de les suprèssions]] por avêr les pâges suprimâyes dês pou.",
        "logentry-rights-autopromote": "$1 est étâ nomâ ôtomaticament de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|at tèlèchargiê}} $3",
        "rightsnone": "(nion)",
-       "revdelete-summary": "rèsumâ du changement",
        "feedback-adding": "Aponsa de voutros avis a la pâge...",
        "feedback-bugcheck": "Formidâblo ! Controlâd simplament qu’o est pas yona de les [$1 cofieries ja cognues].",
        "feedback-bugnew": "J’é controlâ. Signalar una cofierie novèla",
index a022551..bf23318 100644 (file)
@@ -29,6 +29,7 @@
        "tog-watchdefault": "Salew feranert sidjen an datein leewen uun't uug behual",
        "tog-watchmoves": "Salew fersköwen sidjen an datein leewen uun't uug behual",
        "tog-watchdeletion": "Salew stregen sidjen an datein leewen uun't uug behual",
+       "tog-watchuploads": "Salew huuchschüürd datein leewen uun't uug behual",
        "tog-watchrollback": "Sidjen, diar ik turagsaat haa, uun't uug behual",
        "tog-minordefault": "Aanj feranrangen üs \"letjen\" kääntiakne",
        "tog-previewontop": "\"Iarst ans luke\" boowen faan't wönang tu bewerkin",
        "newwindow": "(woort uun en nei wönang eeben maaget)",
        "cancel": "Ufbreeg",
        "moredotdotdot": "Muar ...",
-       "morenotlisted": "Detdiar list as ei komplet.",
+       "morenotlisted": "Detdiar list küd ei komplet wees.",
        "mypage": "Sidj",
        "mytalk": "Diskuschuun",
        "anontalk": "Diskuschuun",
        "tagline": "Faan {{SITENAME}}",
        "help": "Halep",
        "search": "Schük",
+       "search-ignored-headings": " #<!-- Detdiar rä ei feranre --> <pre>\n# Auerskraften, diar bi't schüken ei beaachtet wurd.\n# Jodiar feranrangen wurd seekert, wan det sidj mä det auerskraft indeksiaret wurden as.\n# Dü könst det sidjenindeksiarang föörtji, wan dü en nul-edit maagest.\n# Syntax:\n#   * Ales, wat bääft en dobelkrüs („#“) stäänt, as en komentaar.\n#   * Arke rä, wat ei leesag as, as di akeroot tiitel, diar ei beaachtet woort.\nFutnuuten\nFerwisangen\nLuke uk diar\n #</pre> <!-- Detdiar rä ei feranre -->",
        "searchbutton": "Schük",
        "go": "Widjer",
        "searcharticle": "Sidj",
        "history": "Werjuunen",
        "history_short": "Ferluup",
+       "history_small": "Ferluup",
        "updatedmarker": "feranert sant man leetst beschük",
        "printableversion": "Ütjdrük maage",
        "permalink": "Permanent link",
        "talk": "Diskuschuun",
        "views": "Uunsichten",
        "toolbox": "Werktjüügen",
+       "tool-link-userrights": "{{GENDER:$1|Brükersköölen}} feranre",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Brükersköölen}} beluke",
+       "tool-link-emailuser": "E-mail tu {{GENDER:$1|didiar brüker|detdiar brükerin}} schüür",
        "userpage": "Brükersidj uunwise",
        "projectpage": "Projektsidj wise",
        "imagepage": "Dateisidj uunwise",
        "virus-scanfailed": "scan ging skiaf (code $1)",
        "virus-unknownscanner": "Ünbekäänd wiirenscanner:",
        "logouttext": "'''Dü beest nü ufmeldet.'''\n\nEnkelt sidjen wise ferlicht noch uun, dat dü uunmeldet beest, so loong dü dan browser-cache ei leesag maaget heest.",
+       "cannotlogoutnow-title": "Ufmeldang hää ei loket",
+       "cannotlogoutnow-text": "Ufmeldin as ei mögelk, wan dü $1 brükst.",
        "welcomeuser": "Welkimen, $1!",
        "welcomecreation-msg": "Din brükerkonto as iinracht wurden.\nFerjid det ei, an aachte üüb din [[Special:Preferences|{{SITENAME}} iinstelangen]].",
        "yourname": "Brükernööm:",
        "createacct-yourpasswordagain-ph": "Du det paaswurd noch ans iin",
        "userlogin-remembermypassword": "Uunmeldet bliiw",
        "userlogin-signwithsecure": "Seeker ferbinjang brük",
+       "cannotlogin-title": "Uunmeldin as ei mögelk",
+       "cannotlogin-text": "Uunmeldin as ei mögelk.",
+       "cannotloginnow-title": "Uunmeldang hää ei loket",
+       "cannotloginnow-text": "Uunmeldin as ei mögelk, wan dü $1 brükst.",
+       "cannotcreateaccount-title": "Brükerkontos kön ei iinracht wurd",
+       "cannotcreateaccount-text": "Üüb detheer wiki kön nian brükerkontos iinracht wurd.",
        "yourdomainname": "Din domain:",
        "password-change-forbidden": "Üüb detheer wiki könst dü nian paaswurden feranre.",
        "externaldberror": "Deer läit en fäägel bai jü äkstärn autentifisiiring for, unti dü möist din äkstärn brükerkonto äi aktualisiire.",
        "login": "Uunmelde",
+       "login-security": "Preewe din identiteet",
        "nav-login-createaccount": "Melde di uun of skriiw di iin",
-       "userlogin": "Melde di uun of skriiw di iin",
-       "userloginnocreate": "Uunmelde",
        "logout": "Ufmelde",
        "userlogout": "Ufmelde",
        "notloggedin": "Ei uunmeldet",
        "userlogin-noaccount": "Dü heest noch nian brükerkonto ?",
        "userlogin-joinproject": "Bi {{SITENAME}} mämaage",
-       "nologin": "Dü heest nian brükerkonto? $1.",
-       "nologinlink": "Nei brükerkonto iinracht",
        "createaccount": "Brükerkonto iinracht",
-       "gotaccount": "Dü hääst ål en brükerkonto? '''$1'''.",
-       "gotaccountlink": "Uunmelde",
-       "userlogin-resetlink": "Heest dü din login dooten ferjiden?",
        "userlogin-resetpassword-link": "Paaswurd ferjiden?",
        "userlogin-helplink2": "Halep bi't uunmeldin",
        "userlogin-loggedin": "Du beest al üs {{GENDER:$1|$1}} uunmeldet.\nBrük det formulaar diar oner, am di mä en öödern nööm uuntumeldin.",
+       "userlogin-reauth": "Dü skel di nei uunmelde, am tu preewein, dat dü {{GENDER:$1|$1}} beest.",
        "userlogin-createanother": "En ööder brükerkonto iinracht",
        "createacct-emailrequired": "E-mail adres",
        "createacct-emailoptional": "E-mail adres (optional)",
        "createacct-email-ph": "Du din e-mail adres iin",
        "createacct-another-email-ph": "E-Mail-adres uundu",
        "createaccountmail": "E-mail tu detdiar adres ferschüür mä en tidjwiis tufelag paaswurd",
+       "createaccountmail-help": "Koon brükt wurd, am för hoker ööders en brükerkonto iinturachten, san det paaswurd tu käänen.",
        "createacct-realname": "Rocht nööm (optional)",
-       "createaccountreason": "Grünj:",
        "createacct-reason": "Grünj",
        "createacct-reason-ph": "Huaram dü en ööder brükerkonto iinrachtst",
+       "createacct-reason-help": "Bööd uun't neiuunmeldangs-logbuk.",
        "createacct-submit": "Din brükerkonto iinracht",
        "createacct-another-submit": "Brükerkonto iinracht",
+       "createacct-continue-submit": "Brükerkontoiinrachtang widjer feer",
+       "createacct-another-continue-submit": "Brükerkontoiinrachtang widjer feer",
        "createacct-benefit-heading": "{{SITENAME}} woort faan lidj üs di maaget.",
        "createacct-benefit-body1": "{{PLURAL:$1|feranrang|feranrangen}}",
        "createacct-benefit-body2": "{{PLURAL:$1|sidj|sidjen}}",
        "nocookiesnew": "Det brükerkonto as iinracht wurden, oober dü beest ei uunmeldet.\n{{SITENAME}} brükt cookies för detdiar aktjuun.\nWees so gud an aktiwiare jo uun dan browser, an do melde di mä dan nei brükernööm an det nei paaswurd uun.",
        "nocookieslogin": "{{SITENAME}} brükt cookies för't uunmeldin faan brükern.\nDü heest cookies deaktiwiaret.\nWees so gud an aktiwiare jo uun dan browser, an do ferschük det noch ans.",
        "nocookiesfornew": "Det brükerkonto as ei iinracht wurden, auer wi ei witj, huar a dooten faan kem.\nÜüb dan kompjuuter skel cookies aktiwiaret wees. Do rep detheer sidj noch ans nei ap.",
+       "createacct-loginerror": "Det brükerkonto as iinracht wurden, oober dü küdst noch ei uunmeldet wurd. Wees so gud an  [[Special:UserLogin|melde di nü uun]].",
        "noname": "Dü skel en rochten brükernööm uundu.",
-       "loginsuccesstitle": "Uunmeldin hää loket.",
+       "loginsuccesstitle": "Uunmeldet",
        "loginsuccess": "'''Dü beest nü üs „$1“ bi {{SITENAME}} uunmeldet.'''",
-       "nosuchuser": "Di brükernööm „$1“ jaft at ei. Aachte üüb det skriiwwiis (an uk üüb grat- an letjskriiwang), an do [[Special:CreateAccount|melde di nei uun]].",
+       "nosuchuser": "Di brükernööm „$1“ jaft at ei. Aachte üüb det skriiwwiis (an uk üüb grat- an letjskriiwang), of [[Special:CreateAccount|melde di nei uun]].",
        "nosuchusershort": "Diar as nään brüker mä di nööm \"$1\".\nHeest dü ham uk rocht skrewen?",
        "nouserspecified": "Dü skel en brükernööm uundu.",
        "login-userblocked": "Didiar brüker as speret wurden. Hi mut ham ei uunmelde.",
        "eauthentsent": "Diar as en e-mail tu det uunjiwen adres schüürd wurden.\n\nIar en e-mail faan ööder brükern auer det e-mail-funktjuun uunnimen wurd koon, skal seeker steld wurd, dat det e-mail-adres uk würelk tu di brüker hiart. Wees so gud an befulge jo uunwisangen uun det e-mail, wat dü jüst füngen heest.",
        "throttled-mailpassword": "Diar as uun a leetst {{PLURAL:$1|stünj|$1 stünj}} al ans am en nei paaswurd uunfraaget wurden. Am dat diar nään masbrük mä drewen woort, koon bluas {{PLURAL:$1|iansis per stünj|iansis per $1 stünj}} am en nei paaswurd uunfraaget wurd.",
        "mailerror": "Fäägel bai dåt siinjen foon e e-mail: $1",
-       "acct_creation_throttle_hit": "Beschükern faan detheer wiki mä din IP-adres haa di leetst dai {{PLURAL:$1|1 brükerkonto|$1 brükerkontos}} iinracht. Muar san ei tuläät.\n\nBeschükern mä detdiar IP-adres kön daalang nian brükerkontos muar iinracht.",
+       "acct_creation_throttle_hit": "Beschükern faan detheer wiki mä din IP-adres haa a leetst $2 {{PLURAL:$1|1 brükerkonto|$1 brükerkontos}} iinracht. Muar san ei tuläät.\n\nBeschükern mä detdiar IP-adres kön daalang nian brükerkontos muar iinracht.",
        "emailauthenticated": "Din e-mail-adres as di $2 am a klook $3 gudkäänd wurden.",
        "emailnotauthenticated": "Din e-mail-adres as noch ei gudkäänd. Jodiar e-mail-funktjuunen kön iarst brükt wurd, wan det adres gudkäänd wurden as.",
        "noemailprefs": "Du en e-mail-adres uun din iinstelangen iin, amdat dü jodiar funktjuunen brük könst.",
        "createacct-another-realname-tip": "Stäänt tu wool. Wan dü dan rochten nööm uundääst, koon hi mä din feranrangen ferbünjen wurd.",
        "pt-login": "Uunmelde",
        "pt-login-button": "Uunmelde",
+       "pt-login-continue-button": "Widjer uunmelde",
        "pt-createaccount": "Brükerkonto iinracht",
        "pt-userlogout": "Ufmelde",
        "php-mail-error-unknown": "Ünbekäänd feeler mä det funktjuun mail() faan PHP.",
        "changepassword-throttled": "Dü heest tufölsis fersoocht, di uuntumeldin.\nWees so gud an teew $1, iar dü det noch ans ferschükst.",
        "botpasswords": "Bot-paaswurden",
        "botpasswords-summary": "Mä <em>bot-paaswurden</em> koon üüb en brükerkonto auer't API tugreben wurd. A brükerrochten bi uunmeldang mä en bot-paaswurd san kört.\n\nWan dü ei witjst, huaram dü det du wel, skulst dü det uk ei du. Näämen fraaget di, en paaswurd iinturachten, an det do widjertudun.",
+       "botpasswords-disabled": "Bot-paaswurden san deaktiwiaret wurden.",
        "botpasswords-no-central-id": "Am bot-paaswurden tu brüken, skel dü bi en sentralisiaret brükerkonto uunmeldet wees.",
        "botpasswords-existing": "Bot-paaswurden",
        "botpasswords-createnew": "En nei bot-paaswurd maage",
        "botpasswords-insert-failed": "Di bot-nööm \"$1\" küd ei apnimen wurd. Ferlicht as hi al diar?",
        "botpasswords-update-failed": "Di bot-nööm \"$1\" küd ei apnimen wurd. As hi stregen wurden?",
        "botpasswords-created-title": "Bot-paaswurd as iinracht wurden.",
-       "botpasswords-created-body": "Det bot-paaswurd \"$1\" as iinracht wurden an uun funktjuun.",
+       "botpasswords-created-body": "Det bot-paaswurd för di bot \"$1\" faan di brüker \"$2\" as iinracht wurden.",
        "botpasswords-updated-title": "Bot-paaswurd as aktualisiaret wurden.",
-       "botpasswords-updated-body": "Det bot-paaswurd \"$1\" as aktualisiaret wurden an uun funktjuun.",
+       "botpasswords-updated-body": "Det bot-paaswurd för di bot \"$1\" faan di brüker \"$2\" as aktualisiaret wurden.",
        "botpasswords-deleted-title": "Bot-paaswurd as stregen wurden.",
-       "botpasswords-deleted-body": "Det bot-paaswurd \"$1\" as stregen wurden.",
+       "botpasswords-deleted-body": "Det bot-paaswurd för di bot \"$1\" faan di brüker \"$2\" as stregen wurden.",
+       "botpasswords-newpassword": "Det nei paaswurd tu uunmeldin mä <strong>$1</strong> as <strong>$2</strong>. <em>Mark di det gud.</em><br>För ääler bots, huar di uunmeldenööm an di leeder brükernööm josalwen san, könst dü uk <strong>$3</strong> üs brükernööm an <strong>$4</strong> üs paaswurd brük.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider as ei diar.",
+       "botpasswords-restriction-failed": "Mä detdiar bot-paaswurd könst dü di ei uunmelde.",
+       "botpasswords-invalid-name": "Didiar brükernööm hää nään bot-paaswurd-dialer („$1“).",
+       "botpasswords-not-exist": "Di brüker „$1“ hää nian bot-paaswurd mä di nööm „$2“.",
        "resetpass_forbidden": "Det paaswurd koon ei feranert wurd.",
+       "resetpass_forbidden-reason": "A paaswurden koon ei feranert wurd: $1",
        "resetpass-no-info": "Dü skel di uunmelde, am üüb det sidj tutugripen.",
        "resetpass-submit-loggedin": "Paaswurd feranre",
        "resetpass-submit-cancel": "Ufbreeg",
        "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.",
        "passwordreset-emailtext-user": "Di brüker $1 üüb {{SITENAME}} hää am brükerinformatsjuunen för {{SITENAME}} uunfraaget ($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. Dü skulst di uunmelde an en nei paaswurd iinracht. Wan hoker ööders detheer uunfraag steld hää of dü din ual paaswurd käänst, säärst dü niks widjer onernem. Melde di ianfach mä din ual paaswurd uun.",
        "passwordreset-emailelement": "Brükernööm: \n$1\n\nTidjwiis paaswurd: \n$2",
-       "passwordreset-emailsentemail": "Diar as en E-Mail tu di onerwais.",
-       "changeemail": "Feranre det E-Mail-adres",
-       "changeemail-header": "Feranre det E-Mail-adres",
+       "passwordreset-emailsentemail": "Diar as en E-Mail tu di onerwais, wan dü en adres uunden heest.",
+       "passwordreset-emailsentusername": "Wan diar en E-Mail-adres mä didiar brükernööm ferbünjen as, woort en E-Mail mä en nei paaswurd ferschüürd.",
+       "passwordreset-nocaller": "Diar skal en reper uunden wurd.",
+       "passwordreset-nosuchcaller": "Son reper jaft at ei: $1",
+       "passwordreset-ignored": "Det turagsaaten faan't paaswurd küd ei ferwerket wurd. Ferlicht as diar nään provider iinracht wurden?",
+       "passwordreset-invalidemail": "Detdiar E-Mail-adres docht niks",
+       "changeemail": "Feranre of strik det E-Mail-adres",
+       "changeemail-header": "Fal det formulaar ütj, wan dü din E-Mail-adres feranre wel. Wan dü nian adres uundu wel, läät det fial man leesag.",
        "changeemail-no-info": "Dü möist önjmälded weese am ju sid diräkt tu tu gripen.",
        "changeemail-oldemail": "Aktuel e-mail adres",
        "changeemail-newemail": "Nei e-mail adres",
        "sig_tip": "Din onerskraft mä tidjstempel",
        "hr_tip": "Horisontaal streg (ei auerdriiw diarmä)",
        "summary": "Tuupfaadet:",
-       "subject": "Auerskraft:",
+       "subject": "Teemo:",
        "minoredit": "Det as man en letj feranrang",
        "watchthis": "Detdiar sidj uun't uug behual",
        "savearticle": "Sidj seekre",
+       "savechanges": "Sidj seekre",
+       "publishpage": "Sidj seekre",
+       "publishchanges": "Sidj seekre",
        "preview": "Iarst ans luke",
        "showpreview": "Iarst ans luke",
        "showdiff": "Feranrangen wise",
-       "blankarticle": "<strong>Paase üüb:</strong> Dü maagest en leesag sidj.\nWan dü üüb \"{{int:savearticle}}\" trakst, woort det sidj iinracht saner wat uun.",
+       "blankarticle": "<strong>Paase üüb:</strong> Dü maagest en leesag sidj.\nWan dü üüb \"$1\" trakst, woort det sidj iinracht saner wat uun.",
        "anoneditwarning": "'''Paase üüb:''' Dü beest ei uunmeldet. Din aktuel IP-adres komt tu sen, wan dü feranrangen föörnamst. Wan dü di <strong>[$1 uunmeldest]</strong> of <strong>[$2 en konto iinrachtst]</strong>, wurd din feranrangen mä dan brükernööm ferbünjen, tuup mä ööder föördialen.",
        "anonpreviewwarning": "\"Dü beest ei uunmeldet. Bi't seekrin woort din IP-adres uun a ferluup faan werjuunen aptiakent.\"",
        "missingsummary": "'''Paase üüb:''' Dü heest det ei tuupfaadet.\nWan dü det sidj seekerst, woort det saner en kurtfaadet beskriiwang auernimen.",
-       "selfredirect": "<strong>Paase üüb:</strong> Dü feerst detheer sidj tu detsalew sidj widjer.\nDü heest was det ferkiard mual uunden, of dü bewerkest det ferkiard sidj.\nWan dü noch ans üüb „{{int:savearticle}}“ trakst, woort det widjerfeerang likes iinracht.",
+       "selfredirect": "<strong>Paase üüb:</strong> Dü feerst detheer sidj tu detsalew sidj widjer.\nDü heest was det ferkiard mual uunden, of dü bewerkest det ferkiard sidj.\nWan dü noch ans üüb „$1“ trakst, woort det widjerfeerang likes iinracht.",
        "missingcommenttext": "Faade det oner tuup.",
-       "missingcommentheader": "'''Paase üüb:''' Dü heest nian auerskraft uunden.\nWan dü det sidj seekerst, woort det saner auerskraft auernimen.",
+       "missingcommentheader": "<strong>Paase üüb:</strong> Dü heest nian teemo uunden. Wan dü noch ans üüb „$1“ trakst, woort din feranrang saner auerskraft seekert.",
        "summary-preview": "Föörskau faan det tuupfaadang:",
        "subject-preview": "Föörskau faan det auerskraft:",
        "previewerrortext": "Diar as wat skiaf gingen, üs en föörskau faan din feranrangen wiset wurd skul.",
        "accmailtext": "En tufelag iinracht paaswurd för [[User talk:$1|$1]] as tu $2 ferschüürd wurden. Det koon üüb det spezial-sidj ''[[Special:ChangePassword|Paaswurd anre]]'' feranert wurd, wan dü uunmeldet beest.",
        "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.",
+       "anontalkpagetext": "----\n<em>Üüb detdiar sidj könst dü hoker, wat ei uunmeldet as, bööd du.</em>\nDiarför woort sin IP-adres brükt. IP-adresen kön oober faan ünlik brükern nadagt wurd.\nWan dü mä jo komentaaren niks began könst, do as was en öödern brüker mend. Ferjid det ianfach.\nDü könst di uk en [[Special:CreateAccount|brükerkonto iinracht]] of di [[Special:UserLogin|uunmelde]], am dat dü ei mä ööder brükern ferwakselt woorst.",
        "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?",
        "userpage-userdoesnotexist-view": "Son brükerkonto \"$1\" jaft at ei.",
        "blocked-notice-logextract": "Didiar brüker as speret. Det stäänt uun't sper-logbuk:",
-       "clearyourcache": "'''Beaachte:''' Maage di cache faan dan browser leesag, wan dü a feranrangen sä wel.\n* '''Firefox / Safari:''' Hual ''Shift'' bi't aktualisiarin, of trak ''Strg an F5'' of ''Strg an R'' (''⌘an R'' üüb en Mac)\n* '''Google Chrome:''' Trak ''Strg an Shift an R'' (''⌘an Shift an R'' üüb en Mac)\n* '''Internet Explorer:''' Hual ''Strg'' bi't aktualisiarin, of trak ''Strg an F5''\n* '''Opera:''' ''Extras - Internetspuren löschen - Individuelle Auswahl - Den kompletten Cache löschen''",
+       "clearyourcache": "<strong>Beaachte:</strong> Maage di cache faan dan browser leesag, wan dü a feranrangen sä wel.\n* <strong>Firefox / Safari:</strong> Hual <em>Shift</em> bi't aktualisiarin, of trak <em>Strg an F5</em> of <em>Strg an R</em> (''⌘an R'' üüb en Mac)\n* <strong>Google Chrome:</strong> Trak <em>Strg an Shift an R</em> (<em>⌘an Shift an R</em> üüb en Mac)\n* <strong>Internet Explorer:</strong> Hual <em>Strg</em> bi't aktualisiarin, of trak <em>Strg an F5</em>\n* <strong>Opera:</strong> <em>Extras - Internetspuren löschen - Individuelle Auswahl - Den kompletten Cache löschen</em>",
        "usercssyoucanpreview": "'''Tip:''' Brük di „{{int:showpreview}}“-knoop, am din nei CSS föör det seekrin tu testin.",
        "userjsyoucanpreview": "'''Tip:''' Brük di „{{int:showpreview}}“-knoop, am din nei JavaScript föör det seekrin tu testin.",
        "usercsspreview": "'''Seenk diaram, dat det bluas en föörskau faan din CSS as.'''\n'''Det as noch ei seekert wurden!'''",
        "userjspreview": "'''Seenk diaram, dat det bluas en föörskau faan din JavaScript as.'''\n'''Det as noch ei seekert wurden!'''",
-       "sitecsspreview": "'''Påås aw dåt dü jüdeer CSS bloot forbekiikest.'''\n'''Dåt as nuch ai spiikerd!'''",
-       "sitejspreview": "'''Påås aw dåt dü jüdeer JavaScript code bloot forbekiikest.'''\n'''Dåt as nuch ai spiikerd!'''",
+       "sitecsspreview": "<strong>Paase üüb! Det as bluas en föörskau faan't CSS. Det as noch ei seekert wurden!</strong>",
+       "sitejspreview": "<strong>Paase üüb! Det as bluas en föörskau faan di JavaScript code. Det as noch ei seekert wurden!</strong>",
        "userinvalidcssjstitle": "''Paase üüb:''' Skak \"$1\" jaft at ei.\nSeenk diaram, dat faan en brüker iinracht .css- an .js-sidjen mä en letjen buksteew began skel. Bispal:\n''{{ns:user}}:Münsterkjarl/vector.css'' uunsteed faan ''{{ns:user}}:Münsterkjarl/Vector.css''.",
        "updated": "(Feranert)",
        "note": "'''Paase üüb:'''",
        "previewnote": "'''Heer könst dü sä, hü det sidj wurd skal.'''\nDet sidj as oober noch ei seekert!",
        "continue-editing": "Gung tu't fial för't bewerkin",
        "previewconflict": "Detdiar föörskau wiset di boowenst dial faan dan tekst. So schocht hi ütj, wan dü ham nü seekerst.",
-       "session_fail_preview": "'''Din werk küd ei ufseekert wurd, diar as wat skiaf gingen.'''\nFerschük det man noch ans an trak do üüb ''Sidj seekre''.\nWan't do imer noch ei loket, [[Special:UserLogout|melde di uf]] an weder uun.",
-       "session_fail_preview_html": "'''Din werk küd ei seekert wurd. Diar as wat skiaf gingen.'''\n\n''Uun {{SITENAME}} as HTML aktiwiaret, an diaram as JavaScript deaktiwiaret wurden.''\n\nFerschük det man noch ans an trak do üüb ''Sidj seekre''.\nWan't do imer noch ei loket, [[Special:UserLogout|melde di uf]] an weder uun.",
+       "session_fail_preview": "Entskilage! Din werk küd ei ufseekert wurd. Diar as wat skiaf gingen.\n\nFerlicht beest dü ufmeldet wurden. <strong>Stel seeker, dat dü noch uunmeldet beest an ferschük det man noch ans</strong>.\nWan det ei wal, do mutst dü di man [[Special:UserLogout|ufmelde]] an do weder nei uunmelde. Dan browser skal cookies uunnem kön.",
+       "session_fail_preview_html": "Din werk küd ei seekert wurd. Diar as wat skiaf gingen.\n\n<em>Uun {{SITENAME}} as HTML aktiwiaret, an diaram as JavaScript deaktiwiaret wurden.</em>\n\nFerschük det man noch ans an trak do üüb <em>Sidj seekre</em>.\nWan't do imer noch ei loket, [[Special:UserLogout|melde di uf]] an weder uun, an luke efter, of dan browser cookies tuläät.",
        "token_suffix_mismatch": "'''Din werk küd ei ufseekert wurd, auer diar frääm tiaken uun san.'''\n\nDet komt flooksis föör, wan Dan anonym Proxy-siinst ei rocht werket.",
        "edit_form_incomplete": "'''Enkelt dialen faan det formulaar san ei rocht uunkimen.'''\nWees so gud an kontroliare ales noch ans.",
        "editing": "Bewerkin faan $1",
        "editingsection": "Bewerke $1 (kirew)",
        "editingcomment": "Bewerke $1 (nei kirew)",
        "editconflict": "Konflikt bi't bewerkin (BK): $1",
-       "explainconflict": "Hoker ööders hää detheer sidj feranert, üs dü jüst diarmä uun a gang wiarst.\nBoowen könst dü di aktuel stant sä. Oner stun din fernanrangen.\nBluas wat '''boowen''' stäänt, woort seekert. Diaram kopiare din feranrangen boowen iin.\nAn do trak „{{int:savearticle}}“.",
+       "explainconflict": "Hoker ööders hää detheer sidj feranert, üs dü jüst diarmä uun a gang wiarst.\nBoowen könst dü di aktuel stant sä. Oner stun din fernanrangen.\nBluas wat '''boowen''' stäänt, woort seekert. Diaram kopiare din feranrangen boowen iin.\nAn do trak „$1“.",
        "yourtext": "Dan tekst",
        "storedversion": "Seekert werjuun",
        "nonunicodebrowser": "'''Paase üüb:''' Dan browser komt ei mä unicode-tiakens turocht. Wees so gud an brük en öödern browser.",
        "copyrightwarning2": "Seenk diaram, dat det sidj {{SITENAME}} faan öödern bewerket, feranert of uk stregen wurd koon. Wan dü det ei wel, do skriiw heer niks iin! \n\nWan dü heer wat iinskrafst, do beest dü diarmä iinferstenen an seekerst tu, dat dü det '''salew skrewen''' heest of faan en steed auernimen heest, huar '''nian rochten''' üüb lei. (Luke bi $1, wan dü muar wed wel.)\n\n'''Auerdreeg nään frääm teksten an bilen saner ferloof!'''",
        "editpage-cannot-use-custom-model": "Det muude faan detheer sidj koon ei feranert wurd.",
        "longpageerror": "'''Error: Dan tekst as {{PLURAL:$1|ian kilobyte|$1 kilobytes}} lung, hi mut oober ei linger wees üs {{PLURAL:$2|ian kilobyte|$2 kilobytes}}.'''Hi koon ei ufspiikerd wurd.",
-       "readonlywarning": "'''Paase üüb: Dü könst uun uugenblak ei üüb det dootenbeenk tugrip. Din dooten kön ei seekert wurd.''' Wees so gud an seekre dan tekst iarst ans üüb dan reegner, an ferschük leederhen, ham tu auerdreegen.\n\nGrünj för det sperin: $1",
+       "readonlywarning": "<strong>Paase üüb: Dü könst uun uugenblak ei üüb det dootenbeenk tugrip. Din dooten kön ei seekert wurd.</strong> Wees so gud an seekre dan tekst iarst ans üüb dan reegner, an ferschük leederhen, ham tu auerdreegen.\n\nGrünj för det sper: $1",
        "protectedpagewarning": "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det bewerke.'''\nUun't logbuk stäänt muar diartu:",
        "semiprotectedpagewarning": "'''Paase üüb: Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det bewerke.'''\nUun't logbuk stäänt muar diartu:",
-       "cascadeprotectedwarning": "<strong>Paase üüb:</strong> Detdiar sidj koon bluas faan administratooren bewerket wurd. Hat as uun {{PLURAL:$1|detdiar ööder sidj|jodiar ööder sidjen}} iinbünjen, diar troch en kaskaadensper seekert {{PLURAL:$1|as|san}}:",
+       "cascadeprotectedwarning": "<strong>Paase üüb:</strong> Detdiar sidj koon bluas faan brükern mä [[Special:ListGroupRights|aparte rochten]] bewerket wurd. Hat as uun {{PLURAL:$1|detdiar ööder sidj|jodiar ööder sidjen}} iinbünjen, diar troch en kaskaadensper seekert {{PLURAL:$1|as|san}}:",
        "titleprotectedwarning": "'''Paase üüb: \"Detdiar sidj mä didiar nööm koon ei faan arken bewerket wurd. Bluas enkelt brükern mä [[Special:ListGroupRights|was brükerrochten]] kön detdiar sidj nei maage of bewerke.'''\nUun't logbuk stäänt muar diartu:",
        "templatesused": "{{PLURAL:$1|Detdiar föörlaag woort|Jodiar föörlaagen wurd}} üüb detdiar sidj brükt:",
        "templatesusedpreview": "{{PLURAL:$1|Detdiar föörlaag woort|Jodiar föörlaagen wurd}} uun detdiar sidjenföörskau brükt:",
        "page_first": "Began",
        "page_last": "Aanj",
        "histlegend": "Am a feranrangen uuntuwisin, schük tau werjuunen ütj an trak üüb „{{int:compareselectedversions}}“.<br />\n* '''({{int:cur}})''' = ferskeel tu't aktuel werjuun, '''({{int:last}})''' = ferskeel tu't leetst werjuun, '''{{int:minoreditletter}}''' = letj feranrang.",
-       "history-fieldset-title": "Schük uun a ferluup",
-       "history-show-deleted": "Bluas stregen werjuunen",
+       "history-fieldset-title": "Schük efter werjuunen",
+       "history-show-deleted": "Bluas stregen werjuunen wise",
        "histfirst": "Äälst",
        "histlast": "Neist",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "revdelete-unsuppress": "Weder iinsteld werjuunen luasmaage",
        "revdelete-log": "Grünj:",
        "revdelete-submit": "Widjer för {{PLURAL:$1|ütjsoocht werjuun|ütjsoocht werjuunen}}",
-       "revdelete-success": "'''Det werjuunsuunsicht as aktualisiaret wurden.'''",
+       "revdelete-success": "Det werjuunsuunsicht as aktualisiaret wurden.",
        "revdelete-failure": "'''Jü färsjoonsönjsicht köö ai aktualisiird wårde:'''\n$1",
-       "logdelete-success": "'''Logbukuunsicht as aktualisiaret wurden.'''",
+       "logdelete-success": "Logbukuunsicht as aktualisiaret wurden.",
        "logdelete-failure": "'''Det logbukuunsicht küd ei feranert wurd:'''\n$1",
        "revdel-restore": "Feranre, wat tu sen wees skal",
        "pagehist": "Ferluup faan werjuunen",
        "mergehistory-go": "Wise werjuunen, diar tuupfeerd wurd kön.",
        "mergehistory-submit": "Werjuunen tuupfeer",
        "mergehistory-empty": "Nian werjuunen kön tuupfeerd wurd.",
-       "mergehistory-done": "$3 {{PLURAL:$3|werjuun|werjuunen}} faan $1 tuupfeerd tu [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Ian werjuun as|$3 werjuunen san}} faan „$1“ tu „[[:$2]]“ tuupfeerd wurden.",
        "mergehistory-fail": "Werjuunen kön ei tuupfeerd wurd. Luke noch ans efter at sidj an a tidjen.",
        "mergehistory-fail-toobig": "A werjuunen küd ei tuupfeerd wurd, auer muar üs {{PLURAL:$1|ian werjuun|$1 werjuunen}} fersköwen {{PLURAL:$1|wurd skul|wurd skul}}.",
        "mergehistory-no-source": "Det iarst sidj \"$1\" as ai diar.",
        "search-file-match": "(fünjen tekst)",
        "search-suggest": "Mendst dü „$1“?",
        "search-rewritten": "Diar wurd resultaaten för $1 uunwiset. Schük uunsteed för $2.",
-       "search-interwiki-caption": "Saster-projekten",
+       "search-interwiki-caption": "Resultaaten faan saster-projekten",
        "search-interwiki-default": "Resultaaten faan $1:",
        "search-interwiki-more": "(muar)",
        "search-relatedarticle": "Ferbünjen",
        "prefs-watchlist-token": "Token för uun't uug behualen:",
        "prefs-misc": "Dit an dat",
        "prefs-resetpass": "Paaswurd feranre",
-       "prefs-changeemail": "Feranre det E-Mail-adres",
+       "prefs-changeemail": "Feranre of strik det E-Mail-adres",
        "prefs-setemail": "E-Mail-adres fäästlei:",
        "prefs-email": "E-Mail iinstelangen",
        "prefs-rendering": "Skak",
        "restoreprefs": "Normool iinstelangen weder haale (uun arke kirew)",
        "prefs-editing": "Bewerke",
        "searchresultshead": "Schük",
-       "stub-threshold": "Formatiarang faan links <a href=\"#\" class=\"stub\">för letj sidjen</a> (uun Byte):",
+       "stub-threshold": "Formatiarang faan ferwisangen faan letj sidjen ($1):",
        "stub-threshold-disabled": "Ufsteld",
        "recentchangesdays": "Soföl daar skel a „leetst feranrangen“ uunwise:",
        "recentchangesdays-max": "Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}",
        "prefs-help-prefershttps": "Detdiar iinstelang täält, wan dü di naist tooch uunmeldest.",
        "prefswarning-warning": "A feranrangen bi din iinstelangen san noch ei seekert wurden.\nWan dü detheer sidj ferläätst, saner üüb \"$1\" tu traken, wurd din iinstelangen ei aktualisiaret.",
        "prefs-tabs-navigation-hint": "Halep: Dü könst a lachter of rochter wiiser-knoop brük, am tesken a ridjerkoorden boowen uun't menüü hen an weder tu springen.",
-       "userrights": "Brükerrochten bewerke",
-       "userrights-lookup-user": "Brükersköölen bewerke",
+       "userrights": "Brükerrochten",
+       "userrights-lookup-user": "En brüker besteme",
        "userrights-user-editname": "Brükernööm:",
-       "editusergroup": "Brükersköölen bewerke",
+       "editusergroup": "Brükersköölen loose",
        "editinguser": "Feranre brükerrochten {{GENDER:$1|faan di brüker}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Lasmootskap tu brükersköölen bewerke",
-       "saveusergroups": "Brükersköölen seekre",
+       "userrights-editusergroup": "Lasmootskat tu brükersköölen faan {{GENDER:$1|di brüker|det brüker}} bewerke",
+       "saveusergroups": "{{GENDER:$1|Lasmootskap tu brükersköölen}} feranre",
        "userrights-groupsmember": "Lasmoot faan:",
        "userrights-groupsmember-auto": "Faan salew lasmoot faan:",
-       "userrights-groups-help": "Dü könst feranre, tu hün brükerskööl di brüker hiirt:\n* En uunkrüsagt kasche ment, di brüker hiirt diartu.\n* En ei uunkrüsagt kasche ment, di brüker hiart ei diartu.\n* En * ment, dat dü det brükerrocht ei weder wechnem könst (of amkiard).",
+       "userrights-groups-help": "Dü könst feranre, tu hün brükerskööl di brüker hiirt:\n* En uunkrüsagt kasche ment, di brüker hiirt diartu.\n* En ei uunkrüsagt kasche ment, di brüker hiart ei diartu.\n* En * ment, dat dü det brükerrocht ei weder wechnem könst (of amkiard).\n* En # ment, dat dü di tidjponkt bluas efter bääften fersküüw könst, ei efter föören.",
        "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.",
        "group-bot": "Bots",
        "group-sysop": "Administratooren",
        "group-bureaucrat": "Bürokraaten",
-       "group-suppress": "Oversighter",
+       "group-suppress": "Fersteeger",
        "group-all": "(Aal a)",
        "group-user-member": "{{GENDER:$1|Brüker}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Registriaret brüker}}",
        "group-bot-member": "{{GENDER:$1|Bot}}",
        "group-sysop-member": "{{GENDER:$1|Administraator}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürokraat}}",
-       "group-suppress-member": "{{GENDER:$1|Oversighter}}",
+       "group-suppress-member": "{{GENDER:$1|Fersteeger}}",
        "grouppage-user": "{{ns:project}}:Brükern",
        "grouppage-autoconfirmed": "{{ns:project}}:Registriaret brükern",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administratooren",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokraaten",
-       "grouppage-suppress": "{{ns:project}}:Oversighter",
+       "grouppage-suppress": "{{ns:project}}:Fersteeg",
        "right-read": "Sidjen lees",
        "right-edit": "Sidjen bewerke",
        "right-createpage": "Sidjen maage (saner diskuschuunsidjen)",
        "right-editsemiprotected": "Sidjen bewerke, diar mä „{{int:protect-level-autoconfirmed}}“ seekert san.",
        "right-editcontentmodel": "Det model faan det sidj bewerke",
        "right-editinterface": "Brüker-skak bewerke",
-       "right-editusercssjs": "CSS- an JavaScript-datein faan ööder brükern bewerke",
        "right-editusercss": "CSS-datein faan ööder brükern bewerke",
        "right-edituserjs": "JavaScript-datein faan ööder brükern bewerke",
        "right-editmyusercss": "Aanj CSS-datein bewerke",
        "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-managechangetags": "[[Special:Tags|Markiarangen]] iinracht an uun't dootenbeenk strik",
+       "right-managechangetags": "[[Special:Tags|Markiarangen]] iinracht an (de)aktiwiare",
        "right-applychangetags": "[[Special:Tags|Markiarangen]] tuup mä ööder feranrangen brük",
        "right-changetags": "Feranre [[Special:Tags|markiarangen]] faan enkelt werjuunen of logbukiindracher",
        "newuserlogpage": "Neiuunmeldangs-logbuk",
        "rightslogtext": "Det as det logbuk auer feranrangen faan brükerrochten.",
        "action-read": "jüdeer sid leese",
        "action-edit": "detdiar sidj tu bewerkin",
-       "action-createpage": "nei sidjen tu maagin",
-       "action-createtalk": "diskuschuunsidjen maage",
+       "action-createpage": "an maage detdiar sidj",
+       "action-createtalk": "an maage detdiar diskuschuunsidj",
        "action-createaccount": "jüdeer brükerkonto mååge",
        "action-history": "di ferluup faan detdiar sidj uuntulukin.",
        "action-minoredit": "detdiar feranrang üs letj kääntiakne",
        "action-upload_by_url": "detdiar datei faan en URL-adres huuchtusjüüren",
        "action-writeapi": "iin uun det API tu skriiwen",
        "action-delete": "detdiar sidj strik",
-       "action-deleterevision": "werjuunen tu striken",
-       "action-deletedhistory": "det list mä stregen werjuunen uuntulukin",
+       "action-deleterevision": "an strik werjuunen",
+       "action-deletedhistory": "an luke det list mä stregen werjuunen uun",
        "action-browsearchive": "schük stregen sidjen",
-       "action-undelete": "detdiar sidj weder iinstel",
-       "action-suppressrevision": "det ferbürgen werjuun uuntulukin an weder turagtuhaalin",
+       "action-undelete": "an stel sidjen weder iin",
+       "action-suppressrevision": "an luke ferbürgen werjuunen uun of stel jo weder iin",
        "action-suppressionlog": "iin uun det priwoot logbuk tu lukin",
        "action-block": "di brüker tu sperin",
        "action-protect": "det seekerhaid faan sidjen tu feranrin",
        "action-viewmyprivateinfo": "din priwoot dooten uuntulukin",
        "action-editmyprivateinfo": "din priwoot dooten tu bewerkin",
        "action-editcontentmodel": "det model faan det sidj tu bewerkin",
-       "action-managechangetags": "markiarangen iinracht an uun't dootenbeenk strik",
+       "action-managechangetags": "an racht markiarangen iin an (de)aktiwiare jo",
        "action-applychangetags": "markiarangen tuup mä ööder feranrangen tu brüken",
        "action-changetags": "markiarangen faan enkelt werjuunen of logbukiindracher tu feranrin",
        "nchanges": "$1 {{PLURAL:$1|feranrang|feranrangen}}",
        "rcshowhidecategorization": "$1 kategorisiarang faan sidjen",
        "rcshowhidecategorization-show": "Wise",
        "rcshowhidecategorization-hide": "Fersteeg",
-       "rclinks": "Wise a leetst $1 feranrangen faan a leetst $2 daar.<br />$3",
+       "rclinks": "Wise a leetst $1 feranrangen faan a leetst $2 daar.",
        "diff": "ferskeel",
        "hist": "werjuunen",
        "hide": "Fersteeg",
        "recentchangeslinked-page": "Sidjennööm:",
        "recentchangeslinked-to": "Wise feranrangen üüb sidjen, diar heerhen ferwise.",
        "recentchanges-page-added-to-category": "[[:$1]] tu kategorii saat",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] an [[Special:WhatLinksHere/$1|{{PLURAL:$2|ian sidj muar|$2 muar sidjen}}]] tu kategorii saat",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] tu kategorii saat, [[Special:WhatLinksHere/$1|detdiar sidj as uun ööder sidjen iinbünjen.]]",
        "recentchanges-page-removed-from-category": "[[:$1]] faan't kategorii wechnimen",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] an {{PLURAL:$2|ian sidj muar|$2 muar sidjen}} faan det kategorii wechnimen",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] faan det kategorii wechnimen, [[Special:WhatLinksHere/$1|detdiar sidj as uun ööder sidjen iinbünjen]]",
        "upload": "Datei huuchschüür",
        "uploadbtn": "Datei huuchschüür",
        "reuploaddesc": "Ufbreeg an turag tu't sidj för't huuchschüüren",
        "backend-fail-read": "Det datei $1 küd ei leesen wurd.",
        "backend-fail-create": "Det datei $1 küd ei seekert wurd.",
        "backend-fail-maxsize": "Det datei $1 küd ei seekert wurd, auer det grater üs {{PLURAL:$2|1 byte|$2 bytes}} as.",
-       "backend-fail-readonly": "Det süsteem „$1“ koon uun uugenblak bluas lees. Di grünj as: „$2“",
+       "backend-fail-readonly": "Det dootebeenk „$1“ koon uun uugenblak bluas lees. Di grünj as: <em>$2</em>",
        "backend-fail-synced": "Det datei „$1“ woort jüst faan't süsteem bewerket.",
        "backend-fail-connect": "Küd ei mä't süsteem „$1“ ferbinj.",
        "backend-fail-internal": "Uun't süsteem „$1“ as wat skiaf gingen.",
        "nopagetext": "Det sidj, wat fersköwen wurd skal, as ei diar.",
        "pager-newer-n": "{{PLURAL:$1|1 neier|$1 neier}}",
        "pager-older-n": "{{PLURAL:$1|1 ääler|$1 ääler}}",
-       "suppress": "Oversight",
+       "suppress": "Fersteeg",
        "querypage-disabled": "Detdiar spezial-sidj as ei aktiif, am det süsteem ei tu auerläästin.",
        "apihelp": "Halep för API",
        "apihelp-no-such-module": "Moduul \"$1\" ei fünjen.",
        "booksources-text": "Detdiar list ferwiset üüb wääbsteeden, diar nei an brükt buken ferkuupe. Diar feist dü uk muar tu weden. {{SITENAME}} hää mo jodiar kuuplidj oober niks tu dun.",
        "booksources-invalid-isbn": "Detdiar ISBN as woorskiinelk ferkiard. Luke noch ans efter, of det rocht auerdraanj wurden as.",
        "specialloguserlabel": "Brüker:",
-       "speciallogtitlelabel": "Mual (sidjennööm of brüker):",
+       "speciallogtitlelabel": "Mual (Tiitel of {{ns:user}}:brükernööm för di brüker):",
        "log": "Logbuken",
        "all-logs-page": "Aal a öfentelk logbuken",
        "alllogstext": "Diar wurd aal a logbuken faan {{SITENAME}} uunwiset.\nDet woort efter logbukslach, brüker of sidjennööm uunwiset. Grat- an letjskriiwang skel beaachtet wurd.",
        "emailccsubject": "Kopii faan din mädialang tu $1: $2",
        "emailsent": "E-mail as wechschüürd wurden",
        "emailsenttext": "Din e-mail as wechschüürd wurden.",
-       "emailuserfooter": "Detdiar e-mail as faan „$1“ tu „$2“ auer det funktjuun „{{int:emailuser}}“ bi {{SITENAME}} schüürd wurden.",
+       "emailuserfooter": "Detdiar E-Mail as faan „$1“ tu „{{GENDER:$2|$2}}“ mä det funktjuun „{{int:emailuser}}“ bi {{SITENAME}} {{GENDER:$1|schüürd}} wurden. Wan {{GENDER:$2|dü}} üüb detdiar E-Mail swaarest, woort det direkt tu {{GENDER:$1|di|det}} ufschüürer schüürd. Diarbi feit {{GENDER:$1|hi|hat}} {{GENDER:$2|din}} E-Mail-adres tu weden.",
        "usermessage-summary": "Süsteemnooracht seekert.",
        "usermessage-editor": "Süsteemnoorachten siinst",
        "watchlist": "Uun't uug behual",
        "deletepage": "Sidj strik",
        "confirm": "Gudkään",
        "excontent": "diar sted: „$1“",
-       "excontentauthor": "diar sted: „$1“ (iansagst bewerker: [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "Diar sted: „$1“, an di iansagst bewerker wiar: [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschuun]])",
        "exbeforeblank": "diar sted föör't leesag maagin: „$1“",
        "delete-confirm": "Strik \"$1\"",
        "delete-legend": "Strike",
        "delete-toobig": "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Sok sidjen kön ei so gau stregen wurd, ööders san a servers plaat.",
        "delete-warning-toobig": "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Det striken koon komer maage bi't dootenbeenk.",
        "deleteprotected": "Dü könst detdiar sidj ei strik, auer det seekert wurden as.",
-       "deleting-backlinks-warning": "'''Paase üüb:''' Diar ferwise noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|ööder sidjen]] üüb det sidj, diar dü strik wel. Of det sidj as noch huarööders iinbünjen.",
+       "deleting-backlinks-warning": "<strong>Paase üüb:</strong> Diar ferwise noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|ööder sidjen]] üüb det sidj, diar dü strik wel. Of det sidj as noch huarööders iinbünjen.",
        "rollback": "Feranrangen turagsaat",
        "rollbacklink": "turagsaat",
        "rollbacklinkcount": "$1 {{PLURAL:$1|feranrang|feranrangen}} turagsaat",
        "editcomment": "Tuupfaadet feranrang: <em>$1</em>.",
        "revertpage": "Feranrangen faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschuun]]) san üüb di leetst stant faan [[User:$1|$1]] turagsaat wurden.",
        "revertpage-nouser": "Feranrangen faan en ferbürgenen brüker turagsaat an det leetst werjuun faan {{GENDER:$1|[[User:$1|$1]]}} weder iinsteld.",
-       "rollback-success": "Feranrangen faan $1 turagsaat an det leetst werjuun faan $2 weder iinsteld.",
+       "rollback-success": "Feranrangen faan {{GENDER:$3|$1}} san turagsaat an det leetst werjuun faan {{GENDER:$4|$2}} as weder iinsteld wurden.",
        "sessionfailure-title": "session feeler",
        "sessionfailure": "Diar as wat skiaf gingen bi't auerdreegen faan din brükerdooten.\nAm dat diar ei noch muar skiaf gongt, as det aktjuun ufbreegen wurden.\nGung turag, an began faan föören.",
        "changecontentmodel": "Det muude faan det sidj feranre",
        "changecontentmodel-cannot-convert": "Det muude faan [[:$1]] koon ei tu typ $2 feranert wurd.",
        "changecontentmodel-nodirectediting": "Uun det $1 muude könst dü ei direkt bewerke",
        "log-name-contentmodel": "Muude-feranrang-logbuk",
-       "log-description-contentmodel": "Föörkemen am det sidjenmuude",
+       "log-description-contentmodel": "Detdiar sidj wiset feranrangen bi det muude faan sidjen, an uk sok sidjen, diar efter en ööder muude maaget san.",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|hää}} det muude faan sidj $3 faan „$4“ efter „$5“ feranert.",
        "logentry-contentmodel-change-revertlink": "turagsaat",
        "logentry-contentmodel-change-revert": "turagsaat",
        "undeleteviewlink": "Uunluke",
        "undeleteinvert": "Ütjwool amdrei",
        "undeletecomment": "Grünj:",
-       "undeletedrevisions": "{{PLURAL:$1|1 werjuun|$1 werjuunen}} weder iinsteld",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 werjuun|$1 werjuunen}} an {{PLURAL:$2|1 datei|$2 datein}} weder iinsteld",
-       "undeletedfiles": "{{PLURAL:$1|1 datei|$1 datein }} weder iinsteld",
        "cannotundelete": "Weder iinstelen hää ei loket:\n$1",
        "undeletedpage": "'''„$1“''' as weder iinsteld wurden.\nUun't [[Special:Log/delete|logbuk faan stregen sidjen]] stun a stregen an weder iinsteld sidjen.",
        "undelete-header": "Luke uun't [[Special:Log/delete|logbuk för stregen sidjen]] efter stregen sidjen faan a leetst tidj.",
        "sp-contributions-newbies-sub": "Faan nei brükern",
        "sp-contributions-newbies-title": "Brükerbidracher faan nei brükern",
        "sp-contributions-blocklog": "Sper-logbuk",
-       "sp-contributions-suppresslog": "Ei uunwiset brüker-bidracher",
-       "sp-contributions-deleted": "Stregen bidracher",
+       "sp-contributions-suppresslog": "Fersteecht {{GENDER:$1|brükerbidracher}}",
+       "sp-contributions-deleted": "Stregen {{GENDER:$1|brüker}} bidtacher",
        "sp-contributions-uploads": "Huuchschüürd bilen",
        "sp-contributions-logs": "Logbuken",
        "sp-contributions-talk": "Diskuschuun",
-       "sp-contributions-userrights": "Brükerrochten",
+       "sp-contributions-userrights": "{{GENDER:$1|Brüker}}rochten",
        "sp-contributions-blocked-notice": "Didiar brüker as speret. Det stäänt uun't sperlogbuk:",
        "sp-contributions-blocked-notice-anon": "Detdiar IP-adres as speret. Det stäänt uun't sperlogbuk:",
        "sp-contributions-search": "Schük efter brükerbidracher",
        "whatlinkshere-hideredirs": "$1 widjerfeerangen",
        "whatlinkshere-hidetrans": "$1 iinbünjen föörlaagen",
        "whatlinkshere-hidelinks": "$1 ferwisangen",
-       "whatlinkshere-hideimages": "Ferwisangen tu datein $1",
+       "whatlinkshere-hideimages": "$1 ferwisangen tu datein",
        "whatlinkshere-filters": "Filtere",
        "autoblockid": "Automaatisk sper #$1",
        "block": "Brüker spere",
        "unblock": "Brüker ei muar spere",
        "blockip": "IP-adres/{{GENDER:$1|brüker}} spere",
        "blockip-legend": "IP-adres/brüker spere",
-       "blockiptext": "Mä detdiar formulaar sperest dü en IP-adres of en brükernööm, so dat faan diar nian feranrangen muar maaget wurd kön. \nDet skul bluas föörnimen wurd, am jin wandaalen föörtugungen an uun auerianstemang mä a [[{{MediaWiki:Policy-url}}|brükerreegeln]].\nSkriiw en guden grünj för det sper ap.",
+       "blockiptext": "Mä detdiar formulaar sperest dü en IP-adres of en brükernööm, so dat faan diar nian feranrangen muar maaget wurd kön. \nDet skul bluas föörnimen wurd, am jin wandaalen föörtugungen an uun auerianstemang mä a [[{{MediaWiki:Policy-url}}|brükerreegeln]].\nSkriiw en guden grünj för det sper ap.\nDü könst IP-adres-beriker mä det [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]-syntax spere; di gratst mögelk berik as /$1 för IPv4 and /$2 för IPv6.",
        "ipaddressorusername": "IP-adres of brükernööm:",
        "ipbexpiry": "Sperdüür:",
        "ipbreason": "Grünj:",
        "lockedbyandtime": "(faan $1 di $2 am a klook $3)",
        "move-page": "Fersküüw $1",
        "move-page-legend": "Sidj fersküüw",
-       "movepagetext": "Mä detdiar formulaar könst dü en sidj mä aal sin werjuunen amnääm.\nDi ual tiitel woort üüb di nei widjerfeerd.\nDü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjerfeer läät.\nWan dü det oober ei dääst, paase üüb, dat dü aal a [[Special:DoubleRedirects|dobelt]] of [[Special:BrokenRedirects|breegen]] widjerfeerangen noch ans efterlukest.\nBluas dü könst diarför surge, dat ferwisangen widjerhen rocht werke.\n\nDet sidj woort '''ei''' fersköwen, wan't al en sidj mä di nei nööm jaft. Det loket bluas do, wan di nei nööm salew en widjerfeerang as. Det ment, dat dü det amnäämen turagsaat könst, wan dü niks ferkiard maaget heest. Dü könst oober nian sidj, diar't al jaft, auerskriiw.\n\n'''Paase üüb!'''\nDet fersküüwen hää widjloftag fulgen för ööder sidjen. Dü skulst begreben haa, wat dü diar maage wel.",
-       "movepagetext-noredirectfixer": "Mä detdiar formulaar könst dü en sidj mä aal sin werjuunen amnääm.\nDi ual tiitel woort üüb di nei widjerfeerd.\nDü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjer feer läät.\nWan dü det oober ei dääst, paase üüb, dat dü aal a [[Special:DoubleRedirects|dobelt]] of [[Special:BrokenRedirects|breegen]] widjerfeerangen noch ans efterlukest.\nBluas dü könst diarför surge, dat ferwisangen widjerhen rocht werke.\n\nDet sidj woort '''ei''' fersköwen, wan't al en sidj mä di nei nööm jaft. Det loket bluas do, wan di nei nööm salew en widjerfeerang as. Det ment, dat dü det amnäämen turagsaat könst, wan dü niks ferkiard maaget heest. Dü könst oober nian sidj, diar't al jaft, auerskriiw.\n\n'''Paase üüb!'''\nDet fersküüwen hää widjloftag fulgen för ööder sidjen. Dü skulst begreben haa, wat dü diar maage wel.",
-       "movepagetalktext": "Uk det diskuschuunsidj woort fersköwen, wan det diar as, <strong>oober ei, wan:</strong>\n*Diar al en diskuschuunsidj mä didiar nööm as, of\n*Dü detdiar mögelkhaid ütjslotst.\n\nUun didiar faal skel dü a diskuschuunsidjen faan hun tuupfeer.",
+       "movepagetext": "Mä detdiar formulaar könst dü en sidj mä aal sin werjuunen amnääm.\nDi ual tiitel woort üüb di nei widjerfeerd.\nDü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjerfeer läät.\nWan dü det oober ei dääst, paase üüb, dat dü aal a [[Special:DoubleRedirects|dobelt]] of [[Special:BrokenRedirects|breegen]] widjerfeerangen noch ans efterlukest.\nBluas dü könst diarför surge, dat ferwisangen widjerhen rocht werke.\n\nDet sidj woort <strong>ei</strong> fersköwen, wan't al en sidj mä di nei nööm jaft. Det loket bluas do, wan di nei nööm salew en widjerfeerang as. Det ment, dat dü det amnäämen turagsaat könst, wan dü niks ferkiard maaget heest. Dü könst oober nian sidj, diar't al jaft, auerskriiw.\n\n<strong>Paase üüb!</strong>\nDet fersküüwen hää widjloftag fulgen för ööder sidjen. Dü skulst begreben haa, wat dü diar maage wel.",
+       "movepagetext-noredirectfixer": "Mä detdiar formulaar könst dü en sidj mä aal sin werjuunen amnääm.\nDi ual tiitel woort üüb di nei widjerfeerd.\nDü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjer feer läät.\nWan dü det oober ei dääst, paase üüb, dat dü aal a [[Special:DoubleRedirects|dobelt]] of [[Special:BrokenRedirects|breegen]] widjerfeerangen noch ans efterlukest.\nBluas dü könst diarför surge, dat ferwisangen widjerhen rocht werke.\n\nDet sidj woort <strong>ei</strong> fersköwen, wan't al en sidj mä di nei nööm jaft. Det loket bluas do, wan di nei nööm salew en widjerfeerang as. Det ment, dat dü det amnäämen turagsaat könst, wan dü niks ferkiard maaget heest. Dü könst oober nian sidj, diar't al jaft, auerskriiw.\n\n<strong>Paase üüb!</strong>\nDet fersküüwen hää widjloftag fulgen för ööder sidjen. Dü skulst begreben haa, wat dü diar maage wel.",
+       "movepagetalktext": "Wan dü detdiar kasche aktiwiarest, woort det diskuschuunsidj woort fersköwen, oober ei, wan diar al en diskuschuunsidj mä didiar nööm as.\n\nUun didiar faal skel dü a diskuschuunsidjen faan hun tuupfeer.",
        "moveuserpage-warning": "'''Paase üüb:''' Dü wel en brükersidj fersküüw. Seenk diaram, dat bluas det brükersidj amnäämd woort, oober '''ei''' di brüker. Hi behäält san ual nööm.",
        "movecategorypage-warning": "<strong>Paase üüb:</strong> Dü wel jüst en kategoriisidj fersküüw. Seenk diaram, dat bluas det sidj fersköwen woort. A sidjen uun det kategorii wurd <em>ei</em> nei kategorisiaret.",
        "movenologintext": "Dü skel registriaret an [[Special:UserLogin|uunmeldet]] wees, am en sidj tu fersküüwen.",
        "cant-move-to-user-page": "Dü mutst nian sidjen üüb en brükersidj fersküüw (bluas üüb onersidjen).",
        "cant-move-category-page": "Dü mutst nian kategoriisidjen fersküüw.",
        "cant-move-to-category-page": "Dü mutst nian sidj tu en kategoriisidj fersküüw.",
-       "newtitle": "Müülj:",
+       "newtitle": "Nei tiitel:",
        "move-watch": "Jodiar sidjen uun't uug behual",
        "movepagebtn": "Sidj fersküüw",
        "pagemovedsub": "Fersküüwen hää loket",
        "movenosubpage": "Det sidj hää nian onersidjen.",
        "movereason": "Grünj:",
        "revertmove": "turag fersküüw",
-       "delete_and_move_text": "== Striken nuadag  ==\n\nDet sidj „[[:$1]]“ as al diar. Wel dü det strik, am det sidj tu fersküüwen?",
+       "delete_and_move_text": "Det sidj „[[:$1]]“ as al diar. Wel dü det strik, am det sidj tu fersküüwen?",
        "delete_and_move_confirm": "Ja, sidj strik",
        "delete_and_move_reason": "Stregen, am steeds för det fersküüwen faan „[[$1]]“ tu maagin.",
        "selfmove": "A nöömer san likedenang. Dü könst nian sidj üüb ham salew fersküüw.",
        "move-leave-redirect": "Widjerfeerang iinracht",
        "protectedpagemovewarning": "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det fersküüw.'''\nUun't logbuk stäänt muar diartu:",
        "semiprotectedpagemovewarning": "'''Paase üüb:''' Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det fersküüw.\nUun't logbuk stäänt muar diartu:",
-       "move-over-sharedrepo": "== Datei as al diar ==\n[[:$1]] stäänt uun en gemiansoom brükt archiif. Det fersküüwen üüb didiar nööm auerskraft det gemiansoom brükt datei.",
+       "move-over-sharedrepo": "[[:$1]] stäänt uun en gemiansoom brükt archiif. Det fersküüwen üüb didiar nööm auerskraft det gemiansoom brükt datei.",
        "file-exists-sharedrepo": "Didiar dateinööm woort al uun en gemiansoom archiif brükt. Wees so gud, an nem en öödern nööm.",
        "export": "Sidjen eksportiare",
        "exporttext": "Mä detdiar spezial-sidj könst dü di tekst mä aal sin werjuunen tu en XML-datei eksportiare. Det nei datei koon do faan en ööder MediaWiki-Wiki [[Special:Import|importiaret]] wurd.\n\nSkriiw a sidjennöömer iin uun det tekstfial (man bluas ään noom uun arke rä).\n\nDi eksport as uk mä [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] mögelk, tun bispal för det [[{{MediaWiki:Mainpage}}]].",
        "import-nonewrevisions": "Diar wurd nian werjuunen importiaret, auer jo eder al diar wiar of auersprüngen wurden san.",
        "xml-error-string": "$1 uun rä $2, türn $3 (byte $4): $5",
        "import-upload": "XML-datein importiare",
-       "import-token-mismatch": "Session dooten san wech. Ferschük det noch ans weder.",
+       "import-token-mismatch": "Session dooten san wech.\n\nDü beest wel ufmeldet wurden. <strong>Stel seeker, dat dü noch uunmeldet beest, an ferschük det man noch ans</strong>.\nWan det ei loket, [[Special:UserLogout|melde di uf]] an do weder uun. Stel seeker, dat dan browser cookies tuläät.",
        "import-invalid-interwiki": "Faan detdiar Wiki koon ik ei importiare.",
        "import-error-edit": "Det sidj „$1“ as ei importiaret wurden, auer dü det ei bewerke mutst.",
        "import-error-create": "Det sidj „$1“ as ei importiaret wurden, auer dü det ei maage mutst.",
        "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 {{GENDER:$1|didiar brüker|detdiar brüker}} uunluke",
-       "tooltip-t-emailuser": "En e-mail tu didiar brüker schüür",
+       "tooltip-t-emailuser": "En E-Mail tu {{GENDER:$1|didiar|detdiar}} brüker schüür",
        "tooltip-t-info": "Muar auer detdiar sidj",
        "tooltip-t-upload": "Datein huuchschüür",
        "tooltip-t-specialpages": "Auersicht auer aal a spezial-sidjen",
        "tooltip-ca-nstab-category": "Kategoriisidj uunluke",
        "tooltip-minoredit": "Detdiar feranrang üs letj kääntiakne.",
        "tooltip-save": "Feranrangen seekre",
+       "tooltip-publish": "Din feranrangen seekre",
        "tooltip-preview": "Föörskau faan feranrangen üüb detdiar sidj. Iarst noch ans luke, iar dü det sidj seekerst!",
        "tooltip-diff": "Feranrangen bi a tekst wise",
        "tooltip-compareselectedversions": "Ferskeel tesken tau werjuunen faan detdiar sidj uunwise.",
        "lastmodifiedatby": "Det sidj as tuleetst di $1 am a klook $2 faan $3 feranert wurden.",
        "othercontribs": "Üüb grünjlaag faan det werk faan $1.",
        "others": "öödern",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|brüker|brükern}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|brüker}}|brükern}} $1",
        "anonusers": "{{PLURAL:$2|anonüümen|anonüüm}} {{SITENAME}}-{{PLURAL:$2|brüker|brükern}} $1",
        "creditspage": "Sidjeninformatsjuunen",
        "nocredits": "Diar san nian sidjeninformatsjuunen",
        "scarytranscludefailed-httpstatus": "[Ufrepen faan föörlaagen för $1 as skiaf gingen: HTTP  $2]",
        "scarytranscludetoolong": "[URL as tu lung]",
        "deletedwhileediting": "'''Paase üüb:''' Det sidj as stregen wurden, üs dü diar jüst bi werket heest!\nUun't [{{fullurl:{{#special:Log}}|type=delete&page={{FULLPAGENAMEE}}}} Strik-logbuk] fanjst dü di grünj för't striken. Wan dü det sidj seekerst, woort det nei uunlaanj.",
-       "confirmrecreate": "Di brüker [[User:$1|$1]] ([[User talk:$1|Diskuschuun]]) hää det sidj stregen, üs dü diar jüst bi werket heest. Di grünj wiar:\n:''$2''\nFerseekre, dat dü det sidj würelk nei maage wel.",
-       "confirmrecreate-noreason": "Di brüker [[User:$1|$1 ]] ([[User talk:$1|Diskuschuun]]) hää det sidj stregen, huar dü jüst bi werket heest. Ferseekre, dat dü det sidj würelk nei maage wel.",
+       "confirmrecreate": "{{Gender:$1|Di brüker|Det brüker}} [[User:$1|$1]] ([[User talk:$1|Diskuschuun]]) hää det sidj stregen, üs dü diar jüst bi werket heest. Di grünj wiar:\n:<em>$2</em>\nFerseekre, dat dü det sidj würelk nei maage wel.",
+       "confirmrecreate-noreason": "{{GENDER:$1|Di brüker|Det brüker}} [[User:$1|$1 ]] ([[User talk:$1|Diskuschuun]]) hää det sidj stregen, huar dü jüst bi werket heest. Ferseekre, dat dü det sidj würelk nei maage wel.",
        "recreate": "Nei maage",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Det sidj ütj a cache strik?",
        "version-libraries-license": "Lisens",
        "version-libraries-description": "Beskriiwang",
        "version-libraries-authors": "Skriiwern",
-       "redirect": "Widjerfeerang faan en brüker, en sidj, en sidjenwerjuun of en datei.",
-       "redirect-summary": "Detdiar spezial-sidj feert widjer üüb en brükersidj, sidj, sidjenwerjuun of datei.\nAn det woort so brükt:  [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] of [[{{#Special:Redirect}}/file/Example.jpg]].",
+       "redirect": "Widjerfeerang faan en datei, en brüker, en sidj, en sidjenwerjuun of en logbukiindrach.",
+       "redirect-summary": "Detdiar spezial-sidj feert widjer üüb en brükersidj, en sidj, en sidjenwerjuun, en datei of en logbukiindrach.\nAn det woort so brükt:  [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/file/Example.jpg]] of [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Widjer",
        "redirect-lookup": "Schük:",
        "redirect-value": "Käänang of dateinööm:",
        "tags-actions-header": "Aktjuunen",
        "tags-active-yes": "Ja",
        "tags-active-no": "Naan",
-       "tags-source-extension": "Faan en ütjwidjang fäästlaanj",
+       "tags-source-extension": "Faan't software fäästlaanj",
        "tags-source-manual": "Manuel faan brükern of bots iinracht",
        "tags-source-none": "Woort ei muar brükt",
        "tags-edit": "bewerke",
        "tags-edit-title": "Markiarangen bewerke",
        "tags-edit-manage-link": "Markiarangen ferwalte",
        "tags-edit-existing-tags": "Markiarangen:",
-       "tags-edit-existing-tags-none": "\"Nianen\"",
+       "tags-edit-existing-tags-none": "<em>Nianen</em>",
        "tags-edit-new-tags": "Nei markiarangen:",
        "tags-edit-add": "Jodiar markiarangen diartusaat:",
        "tags-edit-remove": "Jodiar markiarangen wechnem:",
        "htmlform-user-not-exists": "<strong>$1</strong> jaft at ei.",
        "htmlform-user-not-valid": "<strong>$1</strong> as nään tuläät brükernööm",
        "logentry-delete-delete": "$1 {{Gender:$2}} hää det sidj $3 stregen",
-       "logentry-delete-restore": "$1 {{GENDER:$2}} hää det sidj $3 weder iinsteld",
+       "logentry-delete-restore": "$1 {{GENDER:$2}} hää det sidj $3 weder iinsteld ($4)",
        "logentry-delete-event": "$1 {{GENDER:$2}} hää det uunsicht feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2}} hää det uunsicht feranert faan {{PLURAL:$5|ian werjuun|$5 werjuunen}} faan det sidj $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2}} hää det uunsicht feranert faan logbuk iindracher üüb $3",
        "logentry-newusers-create2": "Brükerkonto $3 as faan $1 {{GENDER:$2|iinracht}} wurden",
        "logentry-newusers-byemail": "Brükerkonto $3 as faan $1 {{GENDER:$2|iinracht}} wurden, an det paaswurd as per e-mail tuschüürd wurden.",
        "logentry-newusers-autocreate": "Brükerkonto $1 as automaatisk {{GENDER:$2|iinracht}} wurden",
-       "logentry-rights-rights": "$1 {{GENDER:$2|hää}} det brükerskööl för $3 faan $4 tu $5 feranert.",
+       "logentry-rights-rights": "$1 {{GENDER:$2|hää}} det brükerskööl för {{GENDER:$6|$3}} faan $4 tu $5 feranert.",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|hää}} det brükerskööl för $3 feranert.",
        "logentry-rights-autopromote": "$1 as automaatisk faan $4 tu $5 {{GENDER:$2|tuwiset}} wurden.",
        "logentry-upload-upload": "$1 {{GENDER:$2|hää}} $3 huuchschüürd",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|hää}} det markiarang \"$4\" för't bewerkin faan brükern of bots de-aktiwiaret.",
        "log-name-tag": "Markiarang-logbuk",
        "rightsnone": "(-)",
-       "revdelete-summary": "tuhuupefootings-komäntoor",
        "feedback-adding": "Komentaar woort tu det sidj skrewen ...",
        "feedback-back": "Turag",
        "feedback-bugcheck": "Gud! Luke noch ans efter, of det ei ferlicht en [$1 bekäänden feeler] as.",
        "api-error-emptypage": "Dü mutst nian leesag sidjen nei iinstel.",
        "api-error-publishfailed": "Intern feeler: Di server küd det tidjwiis datei ei widjer schüür.",
        "api-error-stashfailed": "Intern feeler: Di server küd nian tidjwiis datei seekre.",
-       "api-error-unknown-warning": "Ünbekäänd wäärnang: $1",
+       "api-error-unknown-warning": "Ünbekäänd wäärnang: \"$1\".",
        "api-error-unknownerror": "Ünbekäänd feeler: „$1“",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunden}}",
        "duration-minutes": "$1 {{PLURAL:$1|minüüt|minüüten}}",
        "expand_templates_generate_xml": "XML-parser-buum uunwise",
        "expand_templates_generate_rawhtml": "Rä HTML uunwise",
        "expand_templates_preview": "Föörskau",
-       "expand_templates_preview_fail_html": "<em>Auer {{SITENAME}} rä HTML aktiwiaret hää an session-dooten wech san, as det föörskau ütj seekerhaids-grünjer ferbürgen wurden.</em>\n\n<strong>Wees so gud an ferschük det noch ans.</strong>\nWan det do uk noch ei gongt, [[Special:UserLogout|melde di uf]] an weder uun.",
+       "expand_templates_preview_fail_html": "<em>Auer {{SITENAME}} rä HTML aktiwiaret hää an session-dooten wech san, as det föörskau ütj seekerhaids-grünjer ferbürgen wurden.</em>\n\n<strong>Wees so gud an ferschük det noch ans.</strong>\nWan det do uk noch ei gongt, [[Special:UserLogout|melde di uf]] an weder uun. An stel seeker, dat dan browser cookies tuläät.",
        "expand_templates_preview_fail_html_anon": "<em>Auer {{SITENAME}} rä HTML aktiwiaret hää an dü ein uunmeldet beest, as det föörskau ütj seekerhaids-grünjer ferbürgen wurden.</em>\n\n<strong>Wees so gud an [[Special:UserLogin|melde di uun]], an ferschük det noch ans.</strong>",
-       "pagelanguage": "Ütjwool faan sidjenspriaken",
+       "pagelanguage": "Sidjenspriak feranre",
        "pagelang-name": "Sidj",
        "pagelang-language": "Spriak",
        "pagelang-use-default": "Standard spriak brük",
        "action-pagelang": "det sidjenspriak tu feranrin",
        "log-name-pagelang": "Logbuk för spriak-feranrangen",
        "log-description-pagelang": "Det as en logbuk för sidjenspriak-feranrangen",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|hää}} det sidjenspriak för $3 faan $4 tu $5 feranert.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|hää}} det spriak för $3 faan $4 tu $5 feranert.",
        "default-skin-not-found": "Uuha! Uun <code dir=\"ltr\">$wgDefaultSkin</code> as fäästlaanj, dat <code>$1</code> dan standard-skak as. Man hi as ei diar!\n\nDin instalatjuun hää wel jodiar {{PLURAL:$4|skak|skaker}}. Luke uk uun't [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de brüker-hoonbuk], am {{PLURAL:$4|di skak|a skaker}} tu aktiwiarin an standards iinturachten.\n\n$2\n\n; Wan dü MediaWiki jüst instaliaret heest:\n: Dü heest was faan Git of direkt faan a kwelcode instaliaret. Do as det nian woner. Dü könst skaker ütj det [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Skakfertiaknis] instaliare. Diarför skel dü:\n:* Di [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] deelloose, hi komt mä ünlik skaker an ütjwidjangen. Dü könst det  <code>skins/</code>-fertiaknis kopiare an iinsaat.\n:* Enkelt skak-tarballs faan [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] deelloose.\n:* Ian faan a <code>mediawiki/skins/*</code>-fertiaknissen auer Git iin uun det <code dir=\"ltr\">skins/</code>-fertiaknis faan din MediaWiki-Instalatjuun auerskriiw.\n: Det skul din Git-fertiaknis ei uunstaken maage, wan dü en MediaWiki-ütjwerker beest.\n\n; Wan dü jüst MediaWiki aktualisiaret heest:\n: MediaWiki 1.24 an neier werjuunen aktiwiare instaliaret skaker ei muar faan salew (luke uk iin uun det [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery brüker-hoonbuk]). Dü könst {{PLURAL:$5|detdiar rä|jodiar räen}} uun det datei <code>LocalSettings.php</code> iinsaat, am {{PLURAL:$5|di|aal a}} instaliaret {{PLURAL:$5|skak|skaker}} tu aktiwiarin:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Wan dü jüst <code>LocalSettings.php</code> feranert heest:\n: Heest dü a skaker uk aaltumaal rocht skrewen?",
        "default-skin-not-found-no-skins": "Uuha! Uun <code>$wgDefaultSkin</code> as fäästlaanj, dat <code>$1</code> dan standard-skak as. Man hi as ei diar!\n\nDü heest goor nian skak instaliaret.\n\n; Wan dü MediaWiki jüst instaliaret of aktualisiaret heest:\n: Dü heest was faan Git of direkt faan a kwelcode instaliaret. Do as det nian woner. MediaWiki 1.24 an neier werjuunen haa nian skak uun't hood-fertiaknis. Dü könst skaker ütj det [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Skakfertiaknis] instaliare. Diarför skel dü:\n:* Di [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] deelloose, hi komt mä ünlik skaker an ütjwidjangen. Dü könst det  <code>skins/</code>-fertiaknis kopiare an iinsaat.\n:* Enkelt skak-tarballs faan [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] deelloose.\n:* Ian faan a <code>mediawiki/skins/*</code>-fertiaknissen auer Git iin uun det <code dir=\"ltr\">skins/</code>-fertiaknis faan din MediaWiki-Instalatjuun auerskriiw.\n: Det skul din Git-fertiaknis ei uunstaken maage, wan dü en MediaWiki-ütjwerker beest. Luke uk uun't [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de brüker-hoonbuk], am skaker tu aktiwiarin an standards iinturachten.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiwiaret)",
index 159834d..8da887e 100644 (file)
        "yourdomainname": "Il to domini",
        "login": "Jentre",
        "nav-login-createaccount": "Regjistriti o jentre",
-       "userlogin": "Regjistriti o jentre",
-       "userloginnocreate": "Jentre",
        "logout": "Jes",
        "userlogout": "Jes",
        "notloggedin": "No tu sês jentrât",
        "userlogin-noaccount": "No âstu ancjemò une identitât?",
        "userlogin-joinproject": "Regjstriti du {{SITENAME}}",
-       "nologin": "No âstu ancjemò une identitât par jentrâ? '''$1'''.",
-       "nologinlink": "Creile cumò",
        "createaccount": "Cree une gnove identitât",
-       "gotaccount": "Âstu za une identitât? '''$1'''.",
-       "gotaccountlink": "Jentre",
-       "userlogin-resetlink": "Dismenteât i detais par jentrâ?",
        "userlogin-resetpassword-link": "Password dismenteade?",
        "userlogin-helplink2": "Judimi a jentrâ",
        "createacct-emailoptional": "Direzion email (opzionâl)",
        "createacct-email-ph": "Scrîl la tô direzion email",
        "createaccountmail": "par pueste eletroniche",
-       "createaccountreason": "Reson:",
        "createacct-submit": "Cree il to profîl utent",
        "createacct-benefit-heading": "{{SITENAME}} al è fat di int come te",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|contribût|contribûts}}",
        "editingsection": "Cambiament di $1 (sezion)",
        "editingcomment": "Cambiament di $1 (gnove sezion)",
        "editconflict": "Conflit inte modifiche: $1",
-       "explainconflict": "Cualchidun altri al à cambiât cheste pagjine di cuant che tu âs començât a modificâle.\nLa aree di test disore e conten il test de pagjine che esist cumò, i tiei cambiaments a son mostrâts inte aree disot.\nTu varâs di inserî di gnûf i tiei cambiaments tal test esistint.\n'''Dome''' il test in alt al vignarà salvât cuant che tu frachis su \"{{int:savearticle}}\".",
+       "explainconflict": "Cualchidun altri al à cambiât cheste pagjine di cuant che tu âs començât a modificâle.\nLa aree di test disore e conten il test de pagjine che esist cumò, i tiei cambiaments a son mostrâts inte aree disot.\nTu varâs di inserî di gnûf i tiei cambiaments tal test esistint.\n'''Dome''' il test in alt al vignarà salvât cuant che tu frachis su \"$1\".",
        "editingold": "'''ATENZION: tu stâs cambiant une version vecje e no inzornade di cheste pagjine. Se tu la salvis, ducj i cambiaments fats di chê volte in ca a laran pierdûts.'''",
        "yourdiff": "Difarencis",
        "copyrightwarning": "Note: ducj i contribûts a {{SITENAME}} a si considerin come dâts fûr sot de licence $2 (cjale $1 pai detais). Se no tu vuelis che i tiei tescj a podedin jessi modificâts e tornâts a dâ fûr di ognidun cence limits, no stâ mandâju a {{SITENAME}}.<br />\nCun di plui, inviant il test tu declaris che tu âs scrit tu chest o tu lu âs copiât di une sorzint tal domini public o di une sorzint libare.\n'''NO ST MAND MATERIÂL CUVIERT DAL DIRIT DI AUTÔR CENCE AUTORIZAZION!'''",
        "saveprefs": "Salve lis preferencis",
        "restoreprefs": "Torne a lis impostazions predeterminadis",
        "prefs-editing": "Cambiament",
-       "rows": "Riis",
-       "columns": "Colonis:",
        "searchresultshead": "Ricercje",
        "stub-threshold": "Valôr minim pe formatazion dai <a href=\"#\" class=\"stub\">leams aboç</a> (bytes):",
        "recentchangesdays": "Numar di zornadis di mostrâ tai ultins cambiaments:",
        "rcshowhidemine": "$1 miei cambiaments",
        "rcshowhidemine-show": "Mostre",
        "rcshowhidemine-hide": "plate",
-       "rclinks": "Mostre i ultins $1 cambiaments tes ultimis $2 zornadis<br />$3",
+       "rclinks": "Mostre i ultins $1 cambiaments tes ultimis $2 zornadis",
        "diff": "difarencis",
        "hist": "stor",
        "hide": "plate",
        "logentry-upload-upload": "$1 {{GENDER:$2|al à tirât su}} $3",
        "searchsuggest-search": "Ricercje",
        "searchsuggest-containing": "che al à dentri...",
-       "api-error-unclassified": "Al è capitât un erôr no cognossût",
        "expandtemplates": "Espant i modei",
        "expand_templates_output": "Risultât",
        "expand_templates_ok": "Va ben",
index e10b921..580db63 100644 (file)
@@ -16,7 +16,9 @@
                        "Macofe",
                        "Xð",
                        "Robin van der Vliet",
-                       "PiefPafPier"
+                       "PiefPafPier",
+                       "Catrope",
+                       "Sjoerddebruin"
                ]
        },
        "tog-underline": "Keppelings ûnderstreekje:",
        "privacypage": "Project:Privacybelied",
        "badaccess": "Gjin tastimming",
        "badaccess-group0": "Jo hawwe gjin rjochten om de frege hanneling út te fieren.",
-       "badaccess-groups": "De frege hanneling is foarbehâlden oan brûkers yn {{PLURAL:$2|'e groep|ien fan de groepen}}: $1.",
+       "badaccess-groups": "De frege hanneling is foarbehâlden oan meidoggers yn {{PLURAL:$2|'e groep|ien fan de groepen}}: $1.",
        "versionrequired": "Ferzje $1 fan MediaWiki is eask",
        "versionrequiredtext": "Ferzje $1 fan MediaWiki is eask om dizze side te brûken. Mear ynfo is beskikber op 'e side [[Special:Version|softwareferzje]].",
        "ok": "OK",
        "toc": "Ynhâld",
        "showtoc": "sjen litte",
        "hidetoc": "net sjen litte",
+       "collapsible-collapse": "Ynklappe",
+       "collapsible-expand": "Utklappe",
        "confirmable-yes": "Ja",
        "confirmable-no": "Nee",
        "thisisdeleted": "\"$1\" lêze of werombringe?",
        "externaldberror": "Der is in fout by it oanmelden by de database of jo hawwe gjin tastimming om jo ekstern account by te wurkjen.",
        "login": "Oanmelde",
        "nav-login-createaccount": "Oanmelde",
-       "userlogin": "Oanmelde",
-       "userloginnocreate": "Ynlogge",
        "logout": "Ofmelde",
        "userlogout": "Ofmelde",
        "notloggedin": "Net oanmelde",
        "userlogin-noaccount": "Hasto gjin akkount?",
        "userlogin-joinproject": "Meidwaan {{SITENAME}}",
-       "nologin": "Noch net oanmelden as meidogger? $1.",
-       "nologinlink": "Meitsje in brûker oan",
        "createaccount": "Registrearje",
-       "gotaccount": "Hawwe jo jo al as meidogger oanmelde? '''$1'''.",
-       "gotaccountlink": "Oanmelde",
-       "userlogin-resetlink": "Ynlochdata fergetten?",
        "userlogin-resetpassword-link": "Wachtwurd fergetten?",
        "createacct-emailrequired": "E-mailadres",
        "createacct-emailoptional": "E-mailadres (net ferplichte)",
        "createacct-another-email-ph": "E-mailadres ynfiere",
        "createaccountmail": "troch e-mail",
        "createacct-realname": "Echte namme (net ferplichte)",
-       "createaccountreason": "Reden:",
        "createacct-reason": "Reden",
        "createacct-reason-ph": "Wêrom makkesto in oare akkount?",
        "createacct-submit": "Meitsje in akkount",
        "eauthentsent": "Foar befêstiging is jo in netpostberjocht tastjoerd op it adres dat jo ynsteld hawwe. Der wurdt gjin oare netpost stjoerd, oant jo it adres befêstigje sa't it yn it netpostberjocht stiet.",
        "throttled-mailpassword": "Yn {{PLURAL:$1|de lêste oere|de lêste $1 oeren}} is der al in wachtwurdwink ferstjoerd.\nOm misbrûk tefoaren te kommen wurdt der mar ien wachtwurdwink yn 'e {{PLURAL:$1|oere|$1 oeren}} ferstjoerd.",
        "mailerror": "Flater by it ferstjoeren fan e-mail: $1",
-       "acct_creation_throttle_hit": "Jo hawwe al {{PLURAL:$1|1 meidochnamme|$1 meidochnammen}} oanmakke. Jo kinne net mear oanmeitsje.",
+       "acct_creation_throttle_hit": "Besikers fan dizze wiky mei itselde ynternet-adres as jo hawwe de ôfrûne $2 al {{PLURAL:$1|1 meidochnamme|$1 meidochnammen}} oanmakke, wat it maksimaal tasteane oantal is foar dizze perioade.\nDêrom kinne jo fan jo ynternet-adres ôf op dit stuit gjin nije meidochnammen oanmeitsje.",
        "emailauthenticated": "Jo netpostadres waard befêstige op $2 om $3.",
        "emailnotauthenticated": "Jo netpostadres is <strong>noch net befêstige</strong>. Jo kinne oare brûkers gjin post stjoere, en foar de neikommende opsjes wurdt jo gjin post stjoerd.",
        "noemailprefs": "Jou in e-mailadres op om dizze funksjes te brûken.",
        "emailconfirmlink": "Befêstigje jo netpostadres.",
        "invalidemailaddress": "It e-mailadres is net akseptearre om't it in ûnjildige opmaak hat.\nJou beleaven in jildich e-mailadres op of lit it fjild leech.",
-       "accountcreated": "Brûker oanmakke",
-       "accountcreatedtext": "De brûkersaccount foar [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|oerlis]]) is oanmakke.",
+       "accountcreated": "Meidogger oanmakke",
+       "accountcreatedtext": "It meidoggersakkount [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|oerlis]]) is oanmakke.",
        "createaccount-title": "Brûkers registrearje foar {{SITENAME}}",
        "createaccount-text": "Immen hat in brûker op {{SITENAME}} ($4) oanmakke mei de namme \"$2\" en jo e-mailadres. It wachtwurd foar \"$2\" is \"$3\". Meld jo oan en feroarje jo wachtwurd.\n\nNegearje it berjocht as dizze brûker sûnder jo meiwitten oanmakke is.",
        "login-throttled": "Jo hawwe koartlyn te faak besocht oan te melden mei in ûnkrekt wachtwurd.\nJo moatte efkes wachtsje foar't jo it op'e nij besykje kinne.",
        "minoredit": "Dit is in tekstwiziging",
        "watchthis": "Folgje dizze side",
        "savearticle": "Side bewarje",
+       "publishpage": "Side fêstlizze",
        "preview": "Oerlêze",
        "showpreview": "Earst oerlêze",
        "showdiff": "Wizigings",
-       "anoneditwarning": "<strong>Warskôging:</strong> Jo binne net oanmeld. By it fêstlizzen wurdt jo ynternetadres opnaam yn de sideskiednis.",
+       "anoneditwarning": "<strong>Warskôging:</strong> Jo binne net oanmeld. By it fêstlizzen wurdt jo ynternet-adres opnaam yn de sideskiednis. At jo <strong>[$1 oanmelde]</strong> of <strong>[$2 in akkount oanmeitsje]</strong> ferskine jo bewurkingen ûnder jo meidochnamme, njonken oare foardielen.",
        "missingsummary": "<strong>Tink derom:</strong> Jo hawwe gjin gearfetting jûn foar jo bewurking.\nAs jo nochris op ''Side opslaan'' klikke wurdt de bewurking sûnder gearfetting opslein.",
        "missingcommenttext": "Set jo opmerking beleaven hjir ûnder.",
        "missingcommentheader": "<strong>Tink derom:</strong> Jo hawwe gjin ûnderwerp/kop foar dizze opmerking opjûn.\ns jo op 'e nij op \"opslaan\" klikke, wurdt jo feroaring sûnder in ûnderwerp/kop opslein.",
        "summary-preview": "Gearfetting sa at dy brûkt wurdt:",
        "subject-preview": "Neisjen ûnderwerp/kop:",
        "blockedtitle": "Meidogger is útsletten troch",
-       "blockedtext": "<strong>Jo meidoggernamme of IP-adres is útsletten.</strong>\n\nDe útsluting is útfierd troch $1.\nDe opjûne reden is <em>$2</em>.\n\n* Begjin útsluting : $8\n* Ein útsluting : $6\n* Bedoeld út te sluten: $7\n\nJo kinne kontakt opnimme mei $1 of in oare [[{{MediaWiki:Grouppage-sysop}}|behearder]] om de útsluting te besprekken.\nJo kinne gjin gebrûk meitsje fan 'e funksje 'Skriuw meidogger', of jo moatte in jildich e-postadres opjûn hawwe yn jo [[Special:Preferences|foarkarren]] en it gebrûk fan dy funksje moat net útsletten wêze.\nJo tsjintwurdich e-mailadres is $3 en it útsletnûmer is #$5. Neam beide gegevens as jo earne op dizze útsluting reagearje.",
+       "blockedtext": "<strong>Jo meidochnamme of ynternet-adres is útsletten.</strong>\n\nDe útsluting is útfierd troch $1.\nAs reden is opjûn <em>$2</em>.\n\n* Begjin útsluting: $8\n* Ein útsluting: $6\n* Bedoeld út te sluten: $7\n\nAs jo wolle, kinne jo kontakt opnimme mei $1 of in oare [[{{MediaWiki:Grouppage-sysop}}|behearder]] en besprekke de útsluting.\nJo kinne de funksje 'Skriuw dizze meidogger' net brûke, of it moast wêze dat jo in jildich e-mailadres opjûn hawwe by jo [[Special:Preferences|ynstellings]] en net útsletten binne dat te brûken.\nJo hjoeddeisk ynternet-adres is $3, en it útslútnûmer is #$5.\nNim alle boppesteande gegevens op yn jo reäksjes.\n\n(Om't in ynternet-adres faak mar foar ien sesje tawiisd wurdt, kin it wêze dat it om in oar giet, dy't deselde tagongkedizer hat as jo hawwe. As it jo net oanbelanget, besykje dan earst of it noch sa is as jo in skoftke gjin ynternet-ferbining hân hawwe. As it in probleem bliuwt, skriuw dan in behearder. Sorry, foar it ûngemak.)",
        "autoblockedtext": "Jo IP-adres is automatysk útsletten om't brûkt is troch in oare brûker, dy't útsletten is troch $1.\nDe opjûne reden is:\n\n:''$2''\n\n* Begjin útsluting : $8\n* Ein útsluting : $6\n* Bedoeld út te sluten: $7\n\nJo kinne kontakt opnimme mei $1 of in oare [[{{MediaWiki:Grouppage-sysop}}|behearder]] om de útsluting te besprekken.\nJo kinne gjin gebrûk meitsje fan 'e funksje 'Skriuw meidogger', of jo moatte in jildich e-postadres opjûn hawwe yn jo [[Special:Preferences|foarkarren]] en it gebrûk fan dy funksje moat net útsletten wêze.\nJo tsjintwurdich e-postadres is $3 en it útsletnûmer is #$5. Neam beide gegevens as jo earne op dizze útsluting reagearje.",
        "blockednoreason": "gjin reden opjûn",
        "whitelistedittext": "Jo moatte $1 om siden te bewurkjen.",
        "loginreqlink": "Oanmelde",
        "loginreqpagetext": "Jo moatte jo $1 om oare siden besjen te kinnen.",
        "accmailtitle": "Wachtwurd ferstjoerd.",
-       "accmailtext": "It wachtwurd foar \"$1\" is ferstjoerd nei $2.",
+       "accmailtext": "Samar in wachtwurd foar [[User talk:$1|$1]] is ferstjoerd nei $2. It kin wizige wurde op 'e side \n<em>[[Special:ChangePassword|Wachtwurd feroarje]]</em> nei oanmelden.",
        "newarticle": "(Nij)",
        "newarticletext": "Jo hawwe in keppeling folge nei in side dêr't noch gjin tekst op stiet.\nOm sels tekst te meistjsen kinne jo dy gewoan yntype in dit bewurkingsfjild\n([$1 Mear ynformaasje oer bewurkjen].)\nOars kinne jo tebek mei de tebek-knop fan jo blêder.",
-       "anontalkpagetext": "----''Dit is de oerlisside fan in ûnbekende meidogger; in meidogger dy't him/har net oanmeld hat. Om't der gjin namme bekend is, wurdt it ynternet-adres brûkt om oan te jaan wa. Mar faak is it sa dat sa'n adres net altyd troch deselde persoan brûkt wurdt. As jo it idee hawwe dat jo as ûnbekende meidogger opmerkings foar in oar krije, dan kinne jo jo [[Special:CreateAccount|registrearje]], of jo [[Special:UserLogin|oanmelde]]. Fan in oanmelde meidogger is it ynternet-adres net sichtber, en as oanmelde meidogger krije jo allinnich opmerkings dy't foar josels bedoeld binne.''",
+       "anontalkpagetext": "----\n<em>Dit is de oerlisside fan in ûnbekende meidogger; in meidogger dy't him/har net oanmeld hat.</em>\nOm't der gjin namme bekend is, wurdt it ynternet-adres brûkt om oan te jaan om wa't it giet.\nMar faak is it sa dat sa'n adres net altyd troch deselde persoan brûkt wurdt.\nAs jo it idee hawwe dat jo as ûnbekende meidogger opmerkings foar in oar krije, dan kinne jo jo [[Special:CreateAccount|registrearje]], of jo [[Special:UserLogin|oanmelde]]. Fan in oanmelde meidogger is it ynternet-adres net sichtber, en as oanmelde meidogger krije jo allinnich opmerkings dy't foar josels bedoeld binne.",
        "noarticletext": "Der stjit noch gjin tekst op dizze side. Jo kinne\n[[Special:Search/{{PAGENAME}}|hjirboppe nei dy tekst sykje]], of [{{fullurl:{{FULLPAGENAME}}|action=edit}} de side skriuwe].",
        "userpage-userdoesnotexist": "Jo bewurkje in brûkersside fan in brûker dy't net bestiet (brûker \"<nowiki>$1</nowiki>\").\nKontrolearje oft jo dizze side wol oanmeitsje/bewurkje wolle.",
        "clearyourcache": "<strong>Opmerking:</strong> Nei it fêstlizzen kin it nedich wêze de oerslach fan dyn blêder te leegjen foardat de wizigings te sjen binne.\n* <strong>Firefox / Safari:</strong> Hâld <em>Shift</em> yntreaun wylst jo op <em>Dizze side fernije</em> klikke, of typ <em>Ctrl-F5</em> of <em>Ctrl-R</em> (<em>⌘-R</em> op in Mac)\n* <strong>Google Chrome:</strong> Typ <em>CTRL-Shift-R</em> (<em>⌘-Shift-R</em> op in Mac)\n* <strong>Internet Explorer:</strong> Hâld <em>Ctrl</em> yntreaun wylst jo <em>Vernieuwen'' klikke of typ <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Leegje jo cache yn <em>Extra → Voorkeuren</em>",
        "revertmerge": "Gearfoeging ûngedien meitsje",
        "mergelogpagetext": "Hjirûnder stiet in list fan resinte gearfoegings fan ien side-skiednis nei in oaren.",
        "history-title": "$1: ferzjeskiednis",
+       "difference-title": "Ferskil tusken ferzjes fan \"$1\"",
        "lineno": "Rigel $1:",
        "compareselectedversions": "Ferlykje selektearre ferzjes",
        "showhideselectedversions": "Oantikke ferzjes wol/net sjen litte",
        "saveprefs": "Bewarje",
        "restoreprefs": "Tebek nei de standertynstellings",
        "prefs-editing": "Siden bewurkje",
-       "rows": "Rigen",
-       "columns": "Kolommen",
        "searchresultshead": "Sykje",
        "stub-threshold": "Drompel foar markearring <a href=\"#\" class=\"stub\">stobbe</a> (bytes):",
        "stub-threshold-disabled": "Utskeakele",
        "timezoneregion-europe": "Jeropa",
        "timezoneregion-indian": "Yndyske Oseaan",
        "timezoneregion-pacific": "Stille Oseaan",
-       "allowemail": "Lit my ek netpost fan oare meidoggers krije",
+       "allowemail": "Lit my ek e-mail fan oare meidoggers ûntfange",
        "prefs-searchoptions": "Sykje",
        "prefs-namespaces": "Nammeromten",
        "default": "standert",
        "userrights-reason": "Reden:",
        "userrights-no-interwiki": "Jo hawwe gjin foech om rjochten fan meidoggers op oare wikis te wizigjen.",
        "userrights-nodatabase": "Databank $1 bestiet net of is net lokaal.",
-       "userrights-nologin": "Jo moatte jo [[Special:UserLogin|oanmelde]] as rjochtenútfurder om rjochten fan meidoggers wizigje te kinnen.",
-       "userrights-notallowed": "Jo hawwe gjin rjochten om rjochten fan meidoggers te wizigjen.",
        "userrights-changeable-col": "Groepen dy't jo beheare kinne",
        "userrights-unchangeable-col": "Groepen dy't jo net beheare kinne",
        "userrights-irreversible-marker": "$1*",
        "right-protect": "Befeiligingsnivo's feroarje en beskerme siden bewurkje",
        "right-editprotected": "Befeilige siden bewurkje (sûnder cascading-befeiliging)",
        "right-editinterface": "Brûkersinterface bewurkje",
-       "right-editusercssjs": "De CSS- en JS-triemmen fan oare brûkers bewurkje",
        "right-editusercss": "De CSS-JS-triemmen fan oare brûkers bewurkje",
        "right-edituserjs": "De JS-triemmen fan oare brûkers bewurkje",
        "right-rollback": "Gau de lêste bewurking(s) fan in brûker fan in side tebekdraaie",
        "action-edit": "dizze side te bewurkjen",
        "action-createpage": "siden oan te meitsjen",
        "action-createtalk": "oerlissiden oan te meitsjen",
-       "action-createaccount": "dizze brûker oan te meitsjen",
+       "action-createaccount": "dizze meidogger oan te meitsjen",
        "action-minoredit": "dizze bewurking as lyts te markearjen",
        "action-move": "dizze side in oare namme te jaan",
        "action-move-subpages": "dizze side en de derby hearrende subsiden in oare namme te jaan",
-       "action-move-rootuserpages": "brûkerssiden fan it heechste nivo in oare namme te jaan",
+       "action-move-rootuserpages": "meidoggersiden fan it heechste nivo in oare namme te jaan",
        "action-move-categorypages": "categorysiden ferpleatse",
        "action-movefile": "dizze triem in oare namme te jaan",
        "action-upload": "dizze triem te opladen",
        "action-undelete": "dizze side wer te plak sette",
        "action-suppressrevision": "dizze ferburgen ferzje besjen en wer te plak sette",
        "action-suppressionlog": "dit beskerme logboek besjen",
-       "action-block": "dizze brûker in bewurkingsblokkade oplizze",
+       "action-block": "dizze meidogger in bewurkingsblokkade oplizze",
        "action-protect": "it befeiligingsnivo fan dizze side oanpasse",
        "action-import": "dizze side fan in oare wiki ymportearje",
        "action-importupload": "dizze side ymportearje fan in triem-oplading",
        "action-autopatrol": "eigen bewurkings as kontrolearre markearje litte",
        "action-unwatchedpages": "de list mei siden dy't net op in folchlist steane besjen",
        "action-mergehistory": "de skiednis fan dizze side gearfoegje",
-       "action-userrights": "alle brûkersrjochten bewurkje",
-       "action-userrights-interwiki": "brûkersrjochten fan brûkers fan oare wiki's bewurkje",
+       "action-userrights": "alle meidoggerrjochten bewurkje",
+       "action-userrights-interwiki": "meidoggerrjochten fan meidoggers fan oare wiki's bewurkje",
        "action-siteadmin": "de database ôfslute of iepenstelle",
        "action-sendemail": "e-mail stjoere:",
        "action-editmywatchlist": "jo folchlist bewurkje",
        "recentchanges-label-minor": "Dit is in tekstwiziging",
        "recentchanges-label-bot": "Dizze wiziging is troch in robot makke",
        "recentchanges-label-unpatrolled": "Dizze wiziging is noch net neisjûn",
+       "recentchanges-label-plusminus": "De sidegrutte is mei dit oantal bytes wizige",
        "recentchanges-legend-heading": "<strong>Leginda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjoch ek de [[Special:NewPages|list mei nije siden]])",
        "rcnotefrom": "Dit binne de feroarings sûnt <b>$2</b> (maksimaal <b>$1</b>).",
        "rcshowhidemine": "$1 eigen bewurkings",
        "rcshowhidemine-show": "werjaan",
        "rcshowhidemine-hide": "ferbergje",
-       "rclinks": "Jou $1 nije feroarings yn de lêste $2 dagen<br /> $3",
+       "rclinks": "Jou $1 nije feroarings yn de lêste $2 dagen",
        "diff": "ferskil",
        "hist": "skiednis",
        "hide": "gjin",
        "allpagesfrom": "Begjin list by",
        "allpagesto": "Siden besjen oant:",
        "allarticles": "Alle siden",
-       "allinnamespace": "Alle siden, yn de ($1-nammeromte)",
+       "allinnamespace": "Alle siden (yn de $1-nammeromte)",
        "allpagessubmit": "Los!",
        "allpagesprefix": "Siden sjen litte dy't begjinne mei:",
        "allpagesbadtitle": "De opjûne sidenamme is ûnjildich of hat in yntertaal- of ynterwikifoarheaksel.\nMûglik befettet de namme karakters dy't net brûkt wurde meie yn sidenammen.",
        "nowatchlist": "Jo hawwe gjin siden op jo folchlist.",
        "watchnologin": "Net oanmeld yn",
        "addwatch": "Oan folchlist tafoegje",
-       "addedwatchtext": "De side \"'''[[:$1]]'''\" is tafoege oan jo [[Special:Watchlist|folchlist]]. Bewurkings fan dizze side en oerlisside wurde yn de takomst op jo folchlist oanjûn. Hja wurde foar jo ek '''fet''' printe op [[Special:RecentChanges|Koartlyn feroare]].\n\nAt jo letter in side net mear folgje wolle, dan brûke jo op dy side de keppeling \"Ferjit dizze side.\" Jo [[Special:Watchlist|folchlist]] hat ek in keppeling \"Jo folchlist bewurkje,\" foar at jo mear as ien side \"ferjitte\" wolle.",
+       "addedwatchtext": "\"[[:$1]]\" en de bybehearrende oerlisside binne tafoege oan jo [[Special:Watchlist|folchlist]].",
        "removedwatchtext": "De side \"[[:$1]]\" stiet net mear op jo folchlist.",
        "watch": "Folgje",
        "watchthispage": "Folgje dizze side",
        "watching": "Dwaande mei op'e folchlist te setten ...",
        "unwatching": "Dwaande mei fan'e folchlist ôf te heljen ...",
        "enotif_impersonal_salutation": "meidogger fan {{SITENAME}}",
-       "enotif_body": "Bêste $WATCHINGUSERNAME,\n\nDe {{SITENAME}}side '$PAGETITLE' is op $PAGEEDITDATE $CHANGEDORCREATED troch meidogger $PAGEEDITOR;\nsjoch $PAGETITLE_URL foar de aktuele ferzje.\n\n$NEWPAGE\n\nGearfetting: $PAGESUMMARY $PAGEMINOREDIT\n\nFoar oerlis mei meidogger $PAGEEDITOR:\n- netpost: $PAGEEDITOR_EMAIL\n- wiki: $PAGEEDITOR_WIKI\n\nFierdere meldings wurde jo net tastjoerd, oant jo de side lêzen hawwe. Op jo folchlist kinne jo op 'e nij meldings foar al jo folge siden freegje.\n\n                 Jo freonlike {{SITENAME}}-meldingssysteem.\n\n--\nGean nei {{canonicalurl:{{#special:EditWatchlist}}}}\nom jo folchlistynstellings te feroarjen.\n\nReaksjes en fierdere help:\n$HELPPAGE",
+       "enotif_body": "Bêste $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nGearfetting: $PAGESUMMARY $PAGEMINOREDIT\n\nFoar oerlis mei meidogger:\nnetpost: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nFierdere meldings wurde jo net tastjoerd, oant jo de side lêzen hawwe. Op jo folchlist kinne jo op 'e nij meldings foar al jo folge siden freegje.\n\nJo freonlike {{SITENAME}}-meldingssysteem.\n\n--\nGean nei {{canonicalurl:{{#special:Preferences}}}}\nom jo netpostynstellings te feroarjen.\n\nGean nei {{canonicalurl:{{#special:EditWatchlist}}}}\nom jo folchlistynstellings te feroarjen.\n\nOm de side fan jo folchlist te ferwiderjen, gean nei\n$UNWATCHURL\n\nReaksjes en fierdere help:\n$HELPPAGE",
        "created": "oanmakke",
        "changed": "feroare",
        "deletepage": "Wisk side",
        "rollbacklink": "feroaring werom sette",
        "rollbackfailed": "Feroaring werom sette net slagge",
        "cantrollback": "Dizze feroaring kin net werom setten wurde, om't der mar ien skriuwer is.",
-       "alreadyrolled": "Kin de feroaring fan [[:$1]]\ntroch [[User:$2|$2]] ([[User talk:$2|Oerlis]]) net werom sette;\nin oar hat de feroaring werom set, of oars wat oan de side feroare.\n\nDe lêste feroaring wie fan [[User:$3|$3]] ([[User talk:$3|Oerlis]]).",
+       "alreadyrolled": "Kin de feroaring fan [[:$1]] troch [[User:$2|$2]] ([[User talk:$2|oerlis]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) net werom sette;\nin oar hat de feroaring werom set, of oars wat oan de side feroare.\n\nDe lêste feroaring wie fan [[User:$3|$3]] ([[User talk:$3|oerlis]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "De gearfetting wie: <em>$1</em>.",
        "revertpage": "Bewurkings fan [[Special:Contributions/$2|$2]] ([[User talk:$2|Oerlis]]) werom set ta de ferzje fan [[User:$1|$1]]",
        "rollback-success": "Feroarings werom set fan $1; werom set nei de lêste ferzje fan $2.",
        "undelete-show-file-submit": "Ja",
        "namespace": "Nammeromte:",
        "invert": "Seleksje útsein",
-       "blanknamespace": "(Haadnammerûmte)",
+       "blanknamespace": "(Ensyklopedy)",
        "contributions": "{{GENDER:$1|Meidogger}}-bydragen",
        "contributions-title": "Bydragen fan $1",
        "mycontris": "Bydragen",
        "whatlinkshere-hidelinks": "$1 keppelings",
        "whatlinkshere-filters": "Filters",
        "blockip": "Slút {{GENDER:$1|meidogger}} út",
-       "blockip-legend": "Slút brûker út",
-       "blockiptext": "Brûk dizze fjilden om in meidogger fan skriuwtagong út te sluten.\nDat soe allinnich fanwege fandalisme dien wurde moatte, sa't de\n[[{{MediaWiki:Policy-url}}|útslut-rie]] it oanjout.\nMeld de krekte reden! Neam bygelyks de siden dy't oantaaste waarden.",
+       "blockip-legend": "Slút meidogger út",
+       "blockiptext": "Brûk dizze fjilden om in beskaat IP-adres of meidochnamme fan skriuwtagong út te sluten.\nDat soe allinnich dien wurde moatte fanwegen fandalisme of oar ûnakseptabel hâlden en dragen, sa't de\n[[{{MediaWiki:Policy-url}}|útslút-rie]] it oanjout.\nMeld de krekte reden! Neam bygelyks de siden dy't oantaaste waarden.\nJo kinne IP-adresrigen útslute mei de syntaksis fan [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; de grutst tastiene rige is /$1 foar IPv4 en /$2 foar IPv6.",
        "ipaddressorusername": "IP Adres of meidoggernamme:",
        "ipbexpiry": "Ferrint nei:",
        "ipbreason": "Reden:",
        "ipbsubmit": "Slút dizze meidogger út",
        "ipbother": "In oare tiid:",
        "ipboptions": "2 oeren:2 hours,1 dei:1 day,3 dagen:3 days,1 wike:1 week,2 wiken:2 weeks,1 moanne:1 month,3 moanne:3 months,6 moanne:6 months,1 jier:1 year,ûnbeheind:infinite",
-       "badipaddress": "Gjin jildige IP-adres",
+       "badipaddress": "Gjin jildich IP-adres",
        "blockipsuccesssub": "Utsluting slagge",
-       "blockipsuccesstext": "Meidogger [[Special:Contributions/$1|$1]] is útsletten.<br />\n(List fan [[Special:BlockList|útslette meidoggers]].)",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] is útsletten.<br />\nDe [[Special:BlockList|List fan útsletten ynternet-adressen en meidochnammen]] neisjen.",
        "ipb-unblock-addr": "Lit $1 yn",
        "ipb-unblock": "Lit in meidogger of IP-adres yn",
        "ipb-blocklist": "Besteande útslutings besjen",
        "allmessagesname": "Namme",
        "allmessagesdefault": "Standerttekst",
        "allmessagescurrent": "Tekst yn de nijste ferzje",
-       "allmessagestext": "Dit is in list fan alle systeemberjochten beskikber yn de MediaWiki-nammeromte.\nSjoch: [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation], [https://translatewiki.net translatewiki.net].",
+       "allmessagestext": "Dit is in list fan alle systeemberjochten beskikber yn de MediaWiki-nammeromte.\nSjoch [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] en [https://translatewiki.net translatewiki.net] at jo bydrage wolle oan de basisoersettings fan MediaWiki.",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter-all": "Alle",
        "allmessages-language": "Taal:",
        "revdelete-restricted": "hat beheinings oplein oan behearders",
        "revdelete-unrestricted": "hat beheinings foar behearders goedmakke",
        "rightsnone": "(gjin)",
-       "revdelete-summary": "gearfetting bewurkje",
        "feedback-back": "Foarige",
        "feedback-cancel": "Annulearje",
        "feedback-close": "Dien",
        "feedback-submit": "Ferstjoere",
        "feedback-useragent": "Useragent:",
        "searchsuggest-search": "Sykje",
-       "api-error-unknown-code": "Unbekende flater: \"$1\".",
        "api-error-unknownerror": "Unbekende flater: \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|sekonde|sekonden}}",
        "duration-minutes": "$1 {{PLURAL:$1|minút|minuten}}",
index 8509a8a..abf9a8a 100644 (file)
        "externaldberror": "Bhí earráid bhunachair sonraí ann maidir le fíordheimhniú seachtrach, nóThere was either an external authentication database error or you are not allowed to update your external account.",
        "login": "Logáil isteach",
        "nav-login-createaccount": "Logáil isteach",
-       "userlogin": "Logáil isteach / cruthaigh cuntas",
-       "userloginnocreate": "Logáil isteach",
        "logout": "Logáil amach",
        "userlogout": "Logáil amach",
        "notloggedin": "Níl tú logáilte isteach",
        "userlogin-noaccount": "Níl cuntas agat?",
        "userlogin-joinproject": "Cláraigh le {{SITENAME}}",
-       "nologin": "Nach bhfuil logáil isteach agat? '''$1'''.",
-       "nologinlink": "Cruthaigh cuntas",
        "createaccount": "Cruthaigh cuntas nua",
-       "gotaccount": "An bhfuil cuntas agat cheana féin? '''$1'''.",
-       "gotaccountlink": "Logáil isteach",
-       "userlogin-resetlink": "Sonraí logála isteach dearmadta agat?",
        "userlogin-resetpassword-link": "Pasfhocal dearmadta?",
        "userlogin-helplink2": "Cabhair le logáil isteach",
        "createacct-emailrequired": "Seoladh ríomhphoist",
        "createacct-email-ph": "Iontráil do sheoladh ríomhphoist",
        "createacct-another-email-ph": "Iontráil seoladh ríomhphoist",
        "createaccountmail": "le ríomhphost",
-       "createaccountreason": "Fáth:",
        "createacct-reason": "Cúis",
        "createacct-submit": "Cruthaigh do chuntas",
        "createacct-another-submit": "Cruthaigh cuntas eile",
        "editingsection": "Ag athrú $1 (mir)",
        "editingcomment": "Ag athrú $1 (mír nua)",
        "editconflict": "Coimhlint athraithe: $1",
-       "explainconflict": "D'athraigh duine eile an leathanach seo ó thosaigh tú ar a athrú.\nTá téacs an leathanaigh mar atá sé faoi láthair le feiceáil thuas.\nTá do chuid athruithe le feiceáil thíos.\nCaithfidh tú do chuid athruithe a chumasc leis an leagan reatha.\nNí shábhálfar '''ach''' an téacs thuas nuair a bhrúnn tú ar an gcnaipe \"{{int:savearticle}}\".",
+       "explainconflict": "D'athraigh duine eile an leathanach seo ó thosaigh tú ar a athrú.\nTá téacs an leathanaigh mar atá sé faoi láthair le feiceáil thuas.\nTá do chuid athruithe le feiceáil thíos.\nCaithfidh tú do chuid athruithe a chumasc leis an leagan reatha.\nNí shábhálfar '''ach''' an téacs thuas nuair a bhrúnn tú ar an gcnaipe \"$1\".",
        "yourtext": "Do chuid téacs",
        "storedversion": "Leagan sábháilte",
        "editingold": "'''Rabhadh: Tá tú ag athrú leagan an leathanaigh seo atá as dáta.\nMá shábhálfar é, caillfear gach athrú a rinneadh i ndiaidh an leagain seo.'''",
        "saveprefs": "Sábháil",
        "restoreprefs": "Cuir ar ais gach sainrogha réamhshocraithe",
        "prefs-editing": "Eagarthóireacht",
-       "rows": "Sraitheanna",
-       "columns": "Colúin",
        "searchresultshead": "Cuardaigh",
        "stub-threshold-disabled": "Díchumasaithe",
        "recentchangesdays": "Méid laethanta le taispeáint sna hathruithe is déanaí:",
        "saveusergroups": "Sabháil cnuasach úsáideora",
        "userrights-groupsmember": "Ball de:",
        "userrights-reason": "Fáth:",
-       "userrights-notallowed": "Níl cead ag do chuntas ceartanna úsáideora a athrú.",
        "group": "Grúpa:",
        "group-user": "Úsáideoirí",
        "group-bot": "Róbónna",
        "rcshowhidemine": "$1 mo chuid athruithe",
        "rcshowhidemine-show": "Taispeáin",
        "rcshowhidemine-hide": "Folaigh",
-       "rclinks": "Taispeáin an $1 athrú is déanaí sa $2 lá seo caite<br />$3",
+       "rclinks": "Taispeáin an $1 athrú is déanaí sa $2 lá seo caite",
        "diff": "difr",
        "hist": "stair",
        "hide": "Folaigh",
        "undeleteviewlink": "Amharc",
        "undeleteinvert": "Cuir an roghnú bun os cionn",
        "undeletecomment": "Tuairisc:",
-       "undeletedrevisions": "{{PLURAL:$1|Leagan amháin|$1 leagain}} díscriosta",
-       "undeletedrevisions-files": "{{PLURAL:$1|Leagan amháin|$1 leagain}} agus {{PLURAL:$2|comhad amháin|$2 comhaid}} a chur ar ais",
-       "undeletedfiles": "{{PLURAL:$1|Comhad amháin|$1 comhaid}} díscriosta",
        "undelete-search-box": "Cuardaigh leathanaigh scriosta",
        "undelete-search-submit": "Cuardaigh",
        "namespace": "Ainmspás:",
index 42b617f..004936f 100644 (file)
@@ -6,7 +6,8 @@
                        "Emperyan",
                        "Reedy",
                        "Meisam",
-                       "아라"
+                       "아라",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "Baalantıların altını çiz",
        "yourdomainname": "Domen adınız",
        "login": "Gir",
        "nav-login-createaccount": "Gir / esap yarat",
-       "userlogin": "Gir / esap yarat",
        "logout": "Sessiyanı kapat",
        "userlogout": "Oturmaa kapat",
        "notloggedin": "Sessiya diil açık",
-       "nologin": "Henez aza olmadınız? '''$1'''.",
-       "nologinlink": "Esap yarat",
        "createaccount": "Eni esap aç",
-       "gotaccount": "Taa ilerdä esap açtınızmı? '''$1'''.",
-       "gotaccountlink": "Herliim ilerdän esap açtıysanız girin bu baalantıdan.",
        "createaccountmail": "e-maillan",
        "badretype": "Parollar angılarını girdiniz uymêêr.",
        "userexists": "Kullanıcı adı ani girdiniz kullanılêr. Yalvarêrız farklı bir kullanıcı adı seçin.",
        "rcshowhideanons": "anonim kullanıcıları $1",
        "rcshowhidepatr": "bakılmış diişmäkleri $1",
        "rcshowhidemine": "diişmäklerimi $1",
-       "rclinks": "Göster bitki $1 diişmäklii ani yapıldı $2 gündä;<br /> $3",
+       "rclinks": "Göster bitki $1 diişmäklii ani yapıldı $2 gündä;",
        "diff": "fark",
        "hist": "geçmiş",
        "hide": "sakla",
index e3a2daf..e19348d 100644 (file)
        "externaldberror": "外部验证数据库出错,或倷更新伓正倷𠮶外部帐户。",
        "login": "登入",
        "nav-login-createaccount": "登入/新开只帐户",
-       "userlogin": "登入/新开只帐户",
-       "userloginnocreate": "登入",
        "logout": "退出",
        "userlogout": "退出",
        "notloggedin": "冇登入",
-       "nologin": "倷冇得帐户啊? '''$1'''。",
-       "nologinlink": "新开只帐户",
        "createaccount": "新开只帐户",
-       "gotaccount": "有喽帐户? '''$1'''.",
-       "gotaccountlink": "登入",
-       "userlogin-resetlink": "𫍧记汝𠮶登录信息?",
        "createaccountmail": "通过email",
-       "createaccountreason": "原因:",
        "badretype": "倷输𠮶密码伓合。",
        "userexists": "汝输𠮶用户名系人家𠮶,拣过只啰!",
        "loginerror": "登入错误",
        "anoneditwarning": "'''警告:'''倷哈冇登入,个页𠮶编写历史会记到倷𠮶IP。",
        "missingsummary": "'''提示:''' 倷冇提供编写摘要。要系倷再按系保存𠮶话,倷保存𠮶编辑就会冇编辑摘要。",
        "missingcommenttext": "请到底下评论。",
-       "missingcommentheader": "''提示:''' 汝𠮶评论冇提供标题。若系汝捺过到{{int:savearticle}}𠮶话,汝保存𠮶编辑就会冇标题。",
+       "missingcommentheader": "''提示:''' 汝𠮶评论冇提供标题。若系汝捺过到$1𠮶话,汝保存𠮶编辑就会冇标题。",
        "summary-preview": "摘要预览:",
        "subject-preview": "主题/头条预览:",
        "blockedtitle": "用户封到嘞",
        "prefs-misc": "杂项",
        "saveprefs": "存到参数",
        "prefs-editing": "编写",
-       "rows": "横:",
-       "columns": "竖:",
        "searchresultshead": "设置寻到𠮶结果",
        "stub-threshold": "<a href=\"#\" class=\"stub\">细文链接</a>格式门槛:",
        "recentchangesdays": "最近更改中𠮶显示日数:",
        "rcshowhideanons": "$1匿名用户𠮶编辑",
        "rcshowhidepatr": "$1检查过𠮶编辑",
        "rcshowhidemine": "$1偶𠮶编辑",
-       "rclinks": "显示最晏$2日之内最新𠮶$1回改动。<br />$3",
+       "rclinks": "显示最晏$2日之内最新𠮶$1回改动。",
        "diff": "差异",
        "hist": "历史",
        "hide": "弆到",
        "undeletelink": "还原",
        "undeleteviewlink": "望吖",
        "undeletecomment": "评论:",
-       "undeletedrevisions": "$1只修改版本恢复正嘞",
-       "undeletedrevisions-files": "$1只修改版本同$2只档案恢复正嘞",
-       "undeletedfiles": "$1只档案恢复正嘞",
        "cannotundelete": "反删除伓正;话伓定别𠮶人先倷恢复嘞个只页面。",
        "undeletedpage": "'''$1恢复正嘞'''\n\n望吖[[Special:Log/delete|删除日志]]𠮶删除同恢复记录。",
        "undelete-header": "要查最晏𠮶记录𠮶话请望[[Special:Log/delete|删除日志]]。",
index 3a58c92..65ad1b4 100644 (file)
        "externaldberror": "外部驗證資料庫出錯,或倷更新伓正倷嗰外部帳戶。",
        "login": "登入",
        "nav-login-createaccount": "登入/新開隻帳戶",
-       "userlogin": "登入/新開隻帳戶",
-       "userloginnocreate": "登入",
        "logout": "退出",
        "userlogout": "退出",
        "notloggedin": "冇登入",
-       "nologin": "汝冇帳戶嘎? '''$1'''。",
-       "nologinlink": "新開隻帳戶",
        "createaccount": "新開隻帳戶",
-       "gotaccount": "有帳戶哩? '''$1'''。",
-       "gotaccountlink": "登入",
-       "userlogin-resetlink": "誺記汝嗰登錄信息?",
        "createaccountmail": "通過email",
-       "createaccountreason": "原因:",
        "badretype": "汝捺嗰密碼伓合。",
        "userexists": "汝輸嗰用戶名係人家嗰,揀過隻囉!",
        "loginerror": "登入錯誤",
        "anoneditwarning": "'''警告:'''汝哈冇登入,箇頁嗰編寫歷史會錄到汝嗰IP。",
        "missingsummary": "'''提示:''' 倷冇提供編寫摘要。要係倷再按係保存嗰話,倷保存嗰編輯就會冇編輯摘要。",
        "missingcommenttext": "請到底下評論。",
-       "missingcommentheader": "''提示:''' 汝嗰評論冇提供標題。若係汝捺過到{{int:savearticle}}嗰話,汝保存嗰編輯就會冇標題。",
+       "missingcommentheader": "''提示:''' 汝嗰評論冇提供標題。若係汝捺過到$1嗰話,汝保存嗰編輯就會冇標題。",
        "summary-preview": "摘要預覽:",
        "subject-preview": "主題/頭條預覽:",
        "blockedtitle": "用戶封到哩",
        "prefs-misc": "雜項",
        "saveprefs": "存到參數",
        "prefs-editing": "編寫",
-       "rows": "橫:",
-       "columns": "豎:",
        "searchresultshead": "設置尋到嗰結果",
        "stub-threshold": "<a href=\"#\" class=\"stub\">細文連結</a>格式門檻:",
        "recentchangesdays": "頂晏嗰改動嗰顯示日數:",
        "rcshowhideanons": "$1匿名用戶嗰編輯",
        "rcshowhidepatr": "$1檢查過嗰編輯",
        "rcshowhidemine": "$1我嗰編輯",
-       "rclinks": "顯示頂晏$2日之內頂新嗰$1回改動。<br />$3",
+       "rclinks": "顯示頂晏$2日之內頂新嗰$1回改動。",
        "diff": "差異",
        "hist": "歷史",
        "hide": "弆到",
        "undeletelink": "還原",
        "undeleteviewlink": "望吖",
        "undeletecomment": "評論:",
-       "undeletedrevisions": "$1隻修改版本還原正哩",
-       "undeletedrevisions-files": "$1隻修改版本同$2隻檔案還原正哩",
-       "undeletedfiles": "$1隻檔案還原正哩",
        "cannotundelete": "反刪除伓正;話伓定別嗰人先倷恢復嘞箇隻頁面。",
        "undeletedpage": "'''$1還原正哩'''\n\n望吖[[Special:Log/delete|刪除日誌]]嗰刪除同恢復記錄。",
        "undelete-header": "要查頂晏嗰記錄嗰話請望[[Special:Log/delete|刪除日誌]]。",
index 5bd8f3b..b4cf71f 100644 (file)
        "externaldberror": "Thachair mearachd le dearbhadh an stòir-dhàta air neo chan eil cead agad an cunntas agad air an taobh a-muigh ùrachadh.",
        "login": "Log a-steach",
        "nav-login-createaccount": "Log a-steach / cruthaich cunntas",
-       "userlogin": "Log a-steach / cruthaich cunntas",
-       "userloginnocreate": "Log a-steach",
        "logout": "Log a-mach",
        "userlogout": "Log a-mach",
        "notloggedin": "Chan eil thu air logadh a-steach",
        "userlogin-noaccount": "Nach eil cunntas agad?",
        "userlogin-joinproject": "Gabh pàirt ann an {{SITENAME}}",
-       "nologin": "Nach eil cunntas agad fhathast? $1.",
-       "nologinlink": "Cruthaich cunntas",
        "createaccount": "Cruthaich cunntas ùr",
-       "gotaccount": "A bheil cunntas agad mu thràth? $1.",
-       "gotaccountlink": "Log a-steach",
-       "userlogin-resetlink": "Na dhìochuimhnich thu d' ainm is facal-faire?",
        "userlogin-resetpassword-link": "Na dhìochuimhnich thu am facal-faire agad?",
        "userlogin-helplink2": "Taic le logadh a-steach",
        "userlogin-loggedin": "Chaidh do logadh a-steach mar $1 mu thràth.\nCleachd am foirm gu h-ìosal airson logadh a-steach mar chleachdaiche eile.",
        "createacct-another-email-ph": "Cuir a-steach seòladh puist-d",
        "createaccountmail": "Cleachd facal-faire sealach air thuaiream agus cuir e dhan phost-d a tha 'ga shònrachadh gu h-ìosal",
        "createacct-realname": "Fìor-ainm (roghainneil)",
-       "createaccountreason": "Adhbhar:",
        "createacct-reason": "Adhbhar",
        "createacct-reason-ph": "Carson a tha thu a' cruthachadh cunntas eile?",
        "createacct-submit": "Cruthaich an cunntas agad",
        "preview": "Ro-shealladh",
        "showpreview": "Seall an ro-shealladh",
        "showdiff": "Seall na mùthaidhean",
-       "blankarticle": "<strong>Rabhadh:</strong> Tha an duilleag a tha thu a' cruthachadh bàn.\nMa nì thu briogadh air \"{{int:savearticle}}\" a-rithist, thèid an duilleag a chruthachadh gun susbaint sam bith innte.",
+       "blankarticle": "<strong>Rabhadh:</strong> Tha an duilleag a tha thu a' cruthachadh bàn.\nMa nì thu briogadh air \"$1\" a-rithist, thèid an duilleag a chruthachadh gun susbaint sam bith innte.",
        "anoneditwarning": "<strong>Rabhadh:</strong> Chan eil thu air logadh a-steach. Chithear an seòladh IP agad gu poblach ma nì thu deasachadh sam bith. Ma nì thu <strong>[$1 logadh a-steach]</strong> no ma <strong>[$2 chruthaicheas tu cunntas]</strong>, thèid d' ainm a chur ris na dheasaich thu 's gheibh thu buannachd a bharrachd às cuideachd.",
        "anonpreviewwarning": "<em>Chan eil thu air logadh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.</em>",
-       "missingsummary": "<strong>Cuimhnich:</strong> Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
-       "selfredirect": "<strong>Rabhadh:</strong> Tha thu ag ath-stiùireadh duilleag dha fhèin.\nDh'fhaoidte gun do shònraich thu an t-amas cearr airson an ath-stiùiridh no gu bheil thu a' deasachadh an duilleag cearr.\nMa nì thu briogadh air \"{{int:savearticle}}\" a-rithist,m thèid an ath-stiùireadh a chruthachadh co-dhiù.",
+       "missingsummary": "<strong>Cuimhnich:</strong> Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.\nMa bhriogas tu air \"$1\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
+       "selfredirect": "<strong>Rabhadh:</strong> Tha thu ag ath-stiùireadh duilleag dha fhèin.\nDh'fhaoidte gun do shònraich thu an t-amas cearr airson an ath-stiùiridh no gu bheil thu a' deasachadh an duilleag cearr.\nMa nì thu briogadh air \"$1\" a-rithist,m thèid an ath-stiùireadh a chruthachadh co-dhiù.",
        "missingcommenttext": "Cuir a-steach beachd gu h-ìosal.",
-       "missingcommentheader": "<strong>Cuimhnich:</strong> Cha dug thu seachad cuspair airson a’ bheachd seo.\nMa bhriogas tu air “{{int:savearticle}}” a-rithist, thèid na dheasaich thu a shàbhaladh as aonais.",
+       "missingcommentheader": "<strong>Cuimhnich:</strong> Cha dug thu seachad cuspair airson a’ bheachd seo.\nMa bhriogas tu air “$1” a-rithist, thèid na dheasaich thu a shàbhaladh as aonais.",
        "summary-preview": "Ro-shealladh a' ghearr-chunntais:",
        "subject-preview": "Ro-shealladh a’ chuspair:",
        "blockedtitle": "Tha an cleachdair air a bhacadh",
        "editingsection": "A' deasachadh $1 (earrann)",
        "editingcomment": "A' deasachadh $1 (earrann ùr)",
        "editconflict": "Còmhstri deasachaidh: $1",
-       "explainconflict": "Tha cuideigin eile air an duilleag seo a mhùthadh on a thòisich thu fhèin air a dheasachadh.\nTha am bogsa teacsa gu h-àrd a' nochdadh na duilleige mar a tha i an-dràsta.\nTha na mùthaidhean agadsa sa bhogsa gu h-ìosal.\nBidh agad ris na mùthaidhean agad a cho-aonachadh ris an teacsa làithreach.\nCha dèid <strong>ach an teacsa gu h-àrd</strong> a shàbhaladh nuair a bhriogas tu air \"{{int:savearticle}}\".",
+       "explainconflict": "Tha cuideigin eile air an duilleag seo a mhùthadh on a thòisich thu fhèin air a dheasachadh.\nTha am bogsa teacsa gu h-àrd a' nochdadh na duilleige mar a tha i an-dràsta.\nTha na mùthaidhean agadsa sa bhogsa gu h-ìosal.\nBidh agad ris na mùthaidhean agad a cho-aonachadh ris an teacsa làithreach.\nCha dèid <strong>ach an teacsa gu h-àrd</strong> a shàbhaladh nuair a bhriogas tu air \"$1\".",
        "yourtext": "An teacsa agad",
        "storedversion": "Mùthadh taisgte",
        "nonunicodebrowser": "<strong>Rabhadh: Chan eil am brabhsair agad co-chòrdail le Unicode.</strong>\nChuir sinn gleus air dòigh dhut a nì cinnteach gun urrainn dhut duilleagan a shàbhaladh gu tèarainte: Nochdaidh caractaran taobh a-muigh ASCII mar chòd sia-dheicheach sa bhogsa deasachaidh.",
        "right-editsemiprotected": "Cead gus duilleagan le dìon \"{{int:protect-level-autoconfirmed}}\" a dheasachadh",
        "right-editcontentmodel": "Deasaich modail susbaint duilleige",
        "right-editinterface": "Cead gus eadar-aghaidh nan cleachdaichean a dheasachadh",
-       "right-editusercssjs": "Cead gus faidhlichean CSS 's JavaScript càich a dheasachadh",
        "right-editusercss": "Cead gus faidhlichean CSS càich a dheasachadh",
        "right-edituserjs": "Cead gus faidhlichean JavaScript càich a dheasachadh",
        "right-editmyusercss": "Cead gus faidhlichean CSS agad fhèin a dheasachadh",
        "rcshowhidemine": "$1 na mùthaidhean agam",
        "rcshowhidemine-show": "Seall",
        "rcshowhidemine-hide": "Falaich",
-       "rclinks": "Seall {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh thairis air {{PLURAL:$2|an $2 latha|an $2 latha|na $2 làithean|am $2 latha}} mu dheireadh<br />$3",
+       "rclinks": "Seall {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh thairis air {{PLURAL:$2|an $2 latha|an $2 latha|na $2 làithean|am $2 latha}} mu dheireadh",
        "diff": "diofar",
        "hist": "eachdr",
        "hide": "Falaich",
        "undeleteviewlink": "seall",
        "undeleteinvert": "Ais-thionndaidh na thagh thu",
        "undeletecomment": "Adhbhar:",
-       "undeletedrevisions": "Chaidh $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} aiseag",
-       "undeletedrevisions-files": "Chaidh $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} agus $2 {{PLURAL:$2|fhaidhle|fhaidhle|faidhlichean|faidhle}} aiseag",
-       "undeletedfiles": "Chaidh $1 {{PLURAL:$1|fhaidhle|fhaidhle|faidhlichean|faidhle}} aiseag",
        "cannotundelete": "Dh’fhàillig neo-dhèanamh an sguabaidh às no co-dhiù cuid dheth:\n$1",
        "undeletedpage": "<strong>Chaidh $1 aiseag</strong>\n\nThoir sùil air [[Special:Log/delete|loga an sguabaidh às]] airson clàr air na chaidh a sguabadh às no aiseag o chionn goirid.",
        "undelete-header": "Faic [[Special:Log/delete|loga an sguabaidh às]] airson duilleagan a chaidh a sguabadh às o chionn goirid.",
        "logentry-upload-overwrite": "Luchdaich $1 tionndadh ùr de $3 suas",
        "logentry-upload-revert": "Luchdaich $1 $3 suas",
        "rightsnone": "(chan eil gin)",
-       "revdelete-summary": "gearr-chunntas an deasachaidh",
        "feedback-adding": "A' cur beachd ri duilleag...",
        "feedback-bugcheck": "Taghta! Dearbhaich nach eil e air [$1 liosta nam bugaichean air a bheil sinn eòlach] mar-thà.",
        "feedback-bugnew": "Dhearbh mi seo. Dèan aithris air buga ur",
index 7047334..116473f 100644 (file)
        "index-category": "Páxinas indexadas",
        "noindex-category": "Páxinas non indexadas",
        "broken-file-category": "Páxinas con ligazóns rotas cara a ficheiros",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "Acerca de",
        "article": "Páxina de contido",
        "newwindow": "(abre unha ventá nova)",
        "redirectedfrom": "(Redirixido desde \"$1\")",
        "redirectpagesub": "Páxina de redirección",
        "redirectto": "Redirixir cara a:",
-       "lastmodifiedat": "A última modificación desta páxina foi o $1 ás $2.",
+       "lastmodifiedat": "A última edición desta páxina foi o $1 ás $2.",
        "viewcount": "Esta páxina foi visitada {{PLURAL:$1|unha vez|$1 veces}}.",
        "protectedpage": "Páxina protexida",
        "jumpto": "Ir a:",
        "versionrequired": "Necesítase a versión $1 de MediaWiki",
        "versionrequiredtext": "Necesítase a versión $1 de MediaWiki para utilizar esta páxina. Vexa [[Special:Version|a páxina da versión]].",
        "ok": "Aceptar",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Traído desde \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|Ten}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Ten}} $1 {{PLURAL:$3|doutro usuario|de $3 usuarios}} ($2).",
        "site-atom-feed": "Fonte de novas Atom de $1",
        "page-rss-feed": "Fonte de novas RSS de \"$1\"",
        "page-atom-feed": "Fonte de novas Atom de \"$1\"",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (a páxina aínda non existe)",
        "sort-descending": "Orde descendente",
        "sort-ascending": "Orde ascendente",
        "login": "Acceder ao sistema",
        "login-security": "Verifique a súa identidade",
        "nav-login-createaccount": "Rexistro",
-       "userlogin": "Rexistro",
-       "userloginnocreate": "Rexistro",
        "logout": "Saír ao anonimato",
        "userlogout": "Saír ao anonimato",
        "notloggedin": "Non accedeu ao sistema",
        "userlogin-noaccount": "Non está rexistrado?",
        "userlogin-joinproject": "Únase a {{SITENAME}}",
-       "nologin": "Non está rexistrado? $1.",
-       "nologinlink": "Cree unha conta",
        "createaccount": "Crear unha conta",
-       "gotaccount": "Xa ten unha conta? $1.",
-       "gotaccountlink": "Acceda ao sistema",
-       "userlogin-resetlink": "Esqueceu os seus datos de rexistro?",
        "userlogin-resetpassword-link": "Esqueceu o contrasinal?",
        "userlogin-helplink2": "Axuda co rexistro",
        "userlogin-loggedin": "Xa accedeu ao sistema como {{GENDER:$1|$1}}.\nUtilice o formulario inferior para acceder como outro usuario.",
        "createaccountmail": "Utilizar un contrasinal aleatorio temporal e envialo ao enderezo de correo electrónico especificado",
        "createaccountmail-help": "Pode usarse para crear unha conta para outra persoa sen coñecer o contrasinal.",
        "createacct-realname": "Nome real (opcional)",
-       "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por que crea outra conta?",
        "createacct-reason-help": "Mensaxe mostrada no rexistro de creación de contas",
        "nocookiesnew": "A conta de usuario foi creada, pero non accedeu ao sistema.\n{{SITENAME}} para rexistrar os usuarios.\nVostede ten as cookies deshabilitadas.\nPor favor, habilíteas e logo acceda ao sistema co seu novo nome de usuario e contrasinal.",
        "nocookieslogin": "{{SITENAME}} usa cookies para rexistrar os usuarios.\nVostede ten as cookies deshabilitadas.\nPor favor, habilíteas e inténteo de novo.",
        "nocookiesfornew": "Non se creou a conta de usuario porque non puidemos confirmar a súa orixe.\nAsegúrese de que ten as cookies habilitadas, volva cargar a páxina e inténteo de novo.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "createacct-loginerror": "A conta creouse correctamente, pero non se puido conectar automaticamente. Vaia ao [[Special:UserLogin|acceso manual]].",
        "noname": "Non especificou un nome de usuario válido.",
        "loginsuccesstitle": "Accedeu ao sistema",
        "preview": "Vista previa",
        "showpreview": "Mostrar a vista previa",
        "showdiff": "Mostrar os cambios",
-       "blankarticle": "<strong>Advertencia:</strong> A páxina que está a piques de crear está baleira.\nSe preme no botón \"{{int:savearticle}}\" outra vez, a páxina crearase sen contido.",
+       "blankarticle": "<strong>Advertencia:</strong> A páxina que está a piques de crear está baleira.\nSe preme no botón \"$1\" outra vez, a páxina crearase sen contido.",
        "anoneditwarning": "<strong>Aviso:</strong> Non accedeu ao sistema. O seu enderezo IP será visible se fai algunha edición. Se <strong>[$1 accede ao sistema]</strong> ou <strong>[$2 crea unha conta]</strong>, as súas edicións serán atribuídas ao seu nome de usuario e obterá outros beneficios.",
        "anonpreviewwarning": "''Non accedeu ao sistema. Se garda a páxina, o seu enderezo IP quedará rexistrado no historial de edicións.''",
-       "missingsummary": "'''Aviso:''' Esqueceu incluír o texto do campo resumo.\nSe preme en \"{{int:savearticle}}\" a súa edición gardarase sen ningunha descrición da edición.",
-       "selfredirect": "<strong>Atención:</strong> Está redirixindo esta páxina a si mesma.\nQuizais especificou incorrectamente a páxina de destino ou poida que estea a editar unha páxina errónea.\nSe preme en \"{{int:savearticle}}\" de novo, crearase a redireción de calquera xeito.",
+       "missingsummary": "'''Aviso:''' Esqueceu incluír o texto do campo resumo.\nSe preme en \"$1\" a súa edición gardarase sen ningunha descrición da edición.",
+       "selfredirect": "<strong>Atención:</strong> Está redirixindo esta páxina a si mesma.\nQuizais especificou incorrectamente a páxina de destino ou poida que estea a editar unha páxina errónea.\nSe preme en \"$1\" de novo, crearase a redireción de calquera xeito.",
        "missingcommenttext": "Por favor, escriba un comentario a continuación.",
-       "missingcommentheader": "<strong>Aviso:</strong> Non escribiu ningún texto no asunto deste comentario.\nSe preme en \"{{int:savearticle}}\" de novo, a súa edición gardarase sen el.",
+       "missingcommentheader": "<strong>Aviso:</strong> Non escribiu ningún texto no asunto deste comentario.\nSe preme en \"$1\" de novo, a súa edición gardarase sen el.",
        "summary-preview": "Vista previa do resumo de edición:",
        "subject-preview": "Vista previa do asunto:",
        "previewerrortext": "Produciuse un erro ao intentar previsualizar os cambios.",
        "editingsection": "Editando unha sección de \"$1\"",
        "editingcomment": "Editando unha nova sección de \"$1\"",
        "editconflict": "Conflito de edición: $1",
-       "explainconflict": "Alguén cambiou esta páxina desde que comezou a editala.\nA área de texto superior contén o texto da páxina tal e como existe na actualidade.\nOs seus cambios móstranse na área inferior.\nPode mesturar os seus cambios co texto existente.\n'''Só''' se gardará o texto na área superior cando prema en \"{{int:savearticle}}\".",
+       "explainconflict": "Alguén cambiou esta páxina desde que comezou a editala.\nA área de texto superior contén o texto da páxina tal e como existe na actualidade.\nOs seus cambios móstranse na área inferior.\nPode mesturar os seus cambios co texto existente.\n'''Só''' se gardará o texto na área superior cando prema en \"$1\".",
        "yourtext": "O seu texto",
        "storedversion": "Versión gardada",
        "nonunicodebrowser": "'''Atención: O seu navegador non soporta o Unicode.'''\nExiste unha solución que lle permite editar páxinas con seguridade: os caracteres non incluídos no ASCII aparecerán na caixa de edición como códigos hexadecimais.",
        "readonlywarning": "<strong>Atención: Pechouse a base de datos para facer mantemento, polo que non vai poder gardar as súas edicións polo de agora.</strong>\nSe cadra, pode cortar e pegar o texto nun ficheiro de texto e gardalo para despois.\n\nO administrador do sistema que a pechou deu esta explicación: $1",
        "protectedpagewarning": "'''Aviso: Esta páxina foi protexida de xeito que só os usuarios con privilexios de administrador a poidan editar.'''\nVelaquí está a última entrada no rexistro, por se quere consultala:",
        "semiprotectedpagewarning": "'''Nota:''' Esta páxina foi protexida de xeito que só os usuarios rexistrados a poidan editar.\nVelaquí está a última entrada no rexistro, por se quere consultala:",
-       "cascadeprotectedwarning": "<strong>Atención:</strong> Protexeuse esta páxina de xeito que só a poden editar os usuarios con privilexios de administrador debido a que está transcluída {{PLURAL:$1|na seguinte páxina protexida|nas seguintes páxinas protexidas}} coa opción \"protección en serie\" activada:",
+       "cascadeprotectedwarning": "<strong>Atención:</strong> Protexeuse esta páxina de xeito que só a poden editar os usuarios con [[Special:ListGroupRights|privilexios específicos]] debido a que está transcluída {{PLURAL:$1|na seguinte páxina protexida|nas seguintes páxinas protexidas}} coa opción \"protección en serie\" activada:",
        "titleprotectedwarning": "'''Aviso: Esta páxina foi protexida de xeito que [[Special:ListGroupRights|só algúns usuarios]] a poidan crear.'''\nVelaquí está a última entrada no rexistro, por se quere consultala:",
        "templatesused": "{{PLURAL:$1|Modelo usado|Modelos usados}} nesta páxina:",
        "templatesusedpreview": "{{PLURAL:$1|Modelo usado|Modelos usados}} nesta vista previa:",
        "template-semiprotected": "(semiprotexido)",
        "hiddencategories": "Esta páxina forma parte {{PLURAL:$1|dunha categoría oculta|de $1 categorías ocultas}}:",
        "edittools": "<!-- O texto que apareza aquí mostrarase por debaixo dos formularios de edición e envío. -->",
+       "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}} ten restrinxida a posibilidade de crear páxinas novas.\nPode volver e editar unha páxina que xa existe ou ben [[Special:UserLogin|acceder ao sistema ou crear unha conta]].",
        "nocreate-loggedin": "Non ten os permisos necesarios para crear páxinas novas.",
        "sectioneditnotsupported-title": "A edición de seccións non está soportada",
        "content-model-text": "texto simple",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
        "content-json-empty-object": "Obxecto baleiro",
        "content-json-empty-array": "Matriz baleira",
        "deprecated-self-close-category": "Páxinas que usan etiquetas HTML de auto-pechado non válidas",
        "post-expand-template-argument-warning": "'''Aviso:''' Esta páxina contén, polo menos, un argumento de modelo que ten un tamaño e expansión moi grande.\nEstes argumentos foron omitidos.",
        "post-expand-template-argument-category": "Páxinas que conteñen argumentos de modelo omitidos",
        "parser-template-loop-warning": "Detectouse un modelo en bucle: [[$1]]",
+       "template-loop-category": "Páxinas con bucles de modelo",
+       "template-loop-category-desc": "A páxina contén un bucle de modelo, por exemplo, un modelo que se chama a si mesmo recursivamente.",
        "parser-template-recursion-depth-warning": "Excedeuse o límite de profundidade de recursión do modelo ($1)",
        "language-converter-depth-warning": "Excedeuse o límite de profundidade do convertedor de lingua ($1)",
        "node-count-exceeded-category": "Páxinas nas que se supera o número de nodos",
        "page_first": "primeira",
        "page_last": "derradeira",
        "histlegend": "Selección de diferenzas: Marque as versións que queira comparar e prema no botón ao final.<br />\nLenda: '''({{int:cur}})''' = diferenza coa versión actual, '''({{int:last}})''' = diferenza coa versión precedente, '''{{int:minoreditletter}}''' = edición pequena.",
-       "history-fieldset-title": "Explorar o historial",
-       "history-show-deleted": "Borrados soamente",
+       "history-fieldset-title": "Buscar revisións",
+       "history-show-deleted": "Só con borrados de revisións",
        "histfirst": "as máis antigas",
        "histlast": "as máis novas",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "mergehistory-comment": "\"[[:$1]]\" fusionouse con \"[[:$2]]\": $3",
        "mergehistory-same-destination": "A páxina de orixe e a páxina de destino non poden ser a mesma",
        "mergehistory-reason": "Motivo:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "Rexistro de fusións",
        "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.",
        "search-file-match": "(coincide co contido do ficheiro)",
        "search-suggest": "Quizais quixo dicir: $1",
        "search-rewritten": "Móstranse os resultados para \"$1\". Buscar no seu lugar \"$2\".",
-       "search-interwiki-caption": "Proxectos irmáns",
+       "search-interwiki-caption": "Resultados dos proxectos irmáns",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(máis)",
        "search-interwiki-more-results": "máis resultados",
        "youremail": "Correo electrónico:",
        "username": "Nome de {{GENDER:$1|usuario|usuaria}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:",
+       "prefs-memberingroups-type": "$1",
        "group-membership-link-with-expiry": "$1 (ata $2)",
        "prefs-registration": "Data e hora de rexistro:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "Nome real:",
        "yourlanguage": "Lingua:",
        "yourvariant": "Variante de lingua para os contidos:",
        "prefs-help-prefershttps": "Esta preferencia ha aplicarse no seu vindeiro acceso ao sistema.",
        "prefswarning-warning": "Fixo cambios nas súas preferencias que aínda non se gardaron.\nSe deixa esta páxina sen premer en \"$1\", non se actualizarán as súas preferencias.",
        "prefs-tabs-navigation-hint": "Consello: Pode empregar as frechas esquerda e dereita para navegar polas lapelas da lista.",
-       "userrights": "Xestión dos dereitos de usuario",
+       "userrights": "Dereitos de usuario",
        "userrights-lookup-user": "Seleccionar un usuario",
        "userrights-user-editname": "Escriba un nome de usuario:",
        "editusergroup": "Cargar os grupos de usuario",
        "saveusergroups": "Gardar os grupos {{GENDER:$1|do usuario|da usuaria}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implícito de:",
-       "userrights-groups-help": "Pode cambiar os grupos aos que {{GENDER:$1|o usuario|a usuaria}} pertence:\n* Se a caixa ten un sinal (✓) significa que {{GENDER:$1|o usuario|a usuaria}} pertence a ese grupo.\n* Se, pola contra, non o ten, significa que non pertence.\n* Un asterisco (*) indica que non pode eliminar o grupo unha vez que o engadiu, e viceversa.\n* Un # indica que só se pode atrasar a data de caducidade deste grupo; non se pode adiantar.",
+       "userrights-groupsmember-type": "$1",
+       "userrights-groups-help": "Pode cambiar os grupos aos que {{GENDER:$1|o usuario|a usuaria}} pertence:\n* Se a caixa ten un sinal (✓) significa que {{GENDER:$1|o usuario|a usuaria}} pertence a ese grupo.\n* Se, pola contra, non o ten, significa que non pertence.\n* Un asterisco (*) indica que non pode eliminar o grupo unha vez que o engadiu, e viceversa.\n* Un # indica que só se pode atrasar a data de caducidade de pertenza a este grupo; non se pode adiantar.",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Non ten os permisos necesarios para editar os dereitos de usuario noutros wikis.",
        "userrights-nodatabase": "A base de datos \"$1\" non existe ou non é local.",
        "userrights-changeable-col": "Os grupos que pode cambiar",
        "userrights-unchangeable-col": "Os grupos que non pode cambiar",
+       "userrights-irreversible-marker": "$1*",
+       "userrights-no-shorten-expiry-marker": "$1#",
        "userrights-expiry-current": "Caduca o $1",
        "userrights-expiry-none": "Non caduca",
        "userrights-expiry": "Caduca:",
        "userrights-expiry-options": "1 día:1 día,1 semana:1 semana,1 mes:1 mes,3 meses:3 meses,6 meses:6 meses,1 ano:1 ano",
        "userrights-invalid-expiry": "O tempo de caducidade para o grupo \"$1\" non é válido.",
        "userrights-expiry-in-past": "O tempo de caducidade para o grupo \"$1\" está no pasado.",
-       "userrights-cannot-shorten-expiry": "Non pode adiantar a data de caducidade do grupo \"$1\". Só os usuarios con permisos para engadir e eliminar este grupo poden adiantar datas de caducidade.",
+       "userrights-cannot-shorten-expiry": "Non pode adiantar a data de caducidade de pertenza ó grupo \"$1\". Só os usuarios con permisos para engadir e eliminar este grupo poden adiantar datas de caducidade.",
        "userrights-conflict": "Hai un conflito na modificación dos dereitos de usuario! Por favor, revíseo e confirme os seus cambios.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "right-editsemiprotected": "Editar páxinas protexidas con \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Editar o modelo de contido dunha páxina",
        "right-editinterface": "Editar a interface de usuario",
-       "right-editusercssjs": "Editar os ficheiros CSS e JavaScript doutros usuarios",
        "right-editusercss": "Editar os ficheiros CSS doutros usuarios",
        "right-edituserjs": "Editar os ficheiros JavaScript doutros usuarios",
        "right-editmyusercss": "Editar os ficheiros CSS propios",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Mostrar",
        "rcfilters-activefilters": "Filtros activos",
+       "rcfilters-quickfilters": "Ligazóns rápidas",
+       "rcfilters-savedqueries-defaultlabel": "Filtros gardados",
+       "rcfilters-savedqueries-rename": "Renomear",
+       "rcfilters-savedqueries-setdefault": "Activar por defecto",
+       "rcfilters-savedqueries-unsetdefault": "Eliminar por defecto",
+       "rcfilters-savedqueries-remove": "Eliminar",
+       "rcfilters-savedqueries-new-name-label": "Nome",
+       "rcfilters-savedqueries-apply-label": "Crear ligazón rápida",
+       "rcfilters-savedqueries-cancel-label": "Cancelar",
+       "rcfilters-savedqueries-add-new-title": "Gardar filtros como ligazón rápida",
        "rcfilters-restore-default-filters": "Restaurar os filtros por defecto",
        "rcfilters-clear-all-filters": "Borrar todos os filtros",
        "rcfilters-search-placeholder": "Filtrar os cambios recentes (ollar ou comezar a escribir)",
        "rcfilters-invalid-filter": "Filtro no válido",
        "rcfilters-empty-filter": "Non hai filtros activos. Móstranse tódalas contribucións.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "Que é isto?",
+       "rcfilters-filterlist-feedbacklink": "Deixar comentarios sobre os novos filtros (en fase beta)",
        "rcfilters-highlightbutton-title": "Resaltar resultados",
        "rcfilters-highlightmenu-title": "Seleccione unha cor",
+       "rcfilters-highlightmenu-help": "Seleccione unha cor para resaltar esta propiedade",
        "rcfilters-filterlist-noresults": "Non se atoparon filtros",
+       "rcfilters-noresults-conflict": "Non se atoparon resultados porque os criterios de busca están en conflito.",
+       "rcfilters-state-message-subset": "Este filtro non ten efecto porque os seus resultados están incluídos dentro da seguinte procura, {{PLURAL:$2|filtro máis amplo|filtros máis amplos}} (probe a destacalo para distinguilo): $1",
+       "rcfilters-state-message-fullcoverage": "Seleccionar tódolos filtros dun grupo é o mesmo que non seleccionar ningún, polo que este filtro non ten efecto. O grupo inclúeː $1",
        "rcfilters-filtergroup-registration": "Rexistro de usuario",
        "rcfilters-filter-registered-label": "Rexistrado",
        "rcfilters-filter-registered-description": "Editores autenticados.",
        "rcfilters-filter-unregistered-label": "Non rexistrado",
        "rcfilters-filter-unregistered-description": "Editores que non están autenticados.",
-       "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 (non por vostede).",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Este filtro está en conflito {{PLURAL:$2|co seguinte filtro|cos seguintes filtros}} Experience, que {{PLURAL:$2|atopa|atopan}} só usuarios rexistradosː $1",
+       "rcfilters-filtergroup-authorship": "Autoría da contribución",
+       "rcfilters-filter-editsbyself-label": "Cambios seus",
+       "rcfilters-filter-editsbyself-description": "As súas contribucións",
+       "rcfilters-filter-editsbyother-label": "Modificacións doutros.",
+       "rcfilters-filter-editsbyother-description": "Tódolos cambios, excepto os seus.",
        "rcfilters-filtergroup-userExpLevel": "Nivel de experiencia (só para usuarios rexistrados)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Chegados recentemente",
-       "rcfilters-filter-userExpLevel-newcomer-description": "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-filtergroup-user-experience-level-conflicts-unregistered": "Os filtros Experience só atopan usuarios rexistrados, polo que este filtro está en conflito co filtro \"non rexistrado\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "O filtro \"non rexistrados\" está en conflito cun ou máis filtros Experience, que só atopan usuarios rexistrados. Os filtros en conflito están marcados na área dos filtros activos, arriba.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Chegados recentemente",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Menos de 10 edicións e 4 días de actividade.",
+       "rcfilters-filter-user-experience-level-learner-label": "Aprendices",
+       "rcfilters-filter-user-experience-level-learner-description": "Máis experimentado que os \"usuarios novatos\" pero menos que os \"usuarios experimentados\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Usuarios experimentados",
+       "rcfilters-filter-user-experience-level-experienced-description": "Máis de 30 días de actividade e 500 edicións.",
        "rcfilters-filtergroup-automated": "Contribucións automatizadas",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Edicións realizadas por ferramentas automatizadas.",
        "rcfilters-filter-humans-label": "Humano (non bot)",
        "rcfilters-filter-humans-description": "Edicións realizadas por editores humanos.",
+       "rcfilters-filtergroup-reviewstatus": "Estado de revisión",
+       "rcfilters-filter-patrolled-label": "Patrulladas",
+       "rcfilters-filter-patrolled-description": "Edicións marcadas como patrulladas.",
+       "rcfilters-filter-unpatrolled-label": "Sen patrullar",
+       "rcfilters-filter-unpatrolled-description": "Edicións non marcadas como patrulladas.",
        "rcfilters-filtergroup-significance": "Importancia",
        "rcfilters-filter-minor-label": "Edicións menores",
        "rcfilters-filter-minor-description": "Edicións que o autor etiquetou como menores.",
        "rcfilters-filter-major-label": "Edicións non menores",
        "rcfilters-filter-major-description": "Edicións non marcadas como menores.",
+       "rcfilters-filtergroup-watchlist": "Páxinas vixiadas",
+       "rcfilters-filter-watchlist-watched-label": "Na lista de vixilancia",
+       "rcfilters-filter-watchlist-watched-description": "Cambios a páxinas na súa lista de vixilancia.",
+       "rcfilters-filter-watchlist-watchednew-label": "Cambios novos na súa lista de vixilancia",
+       "rcfilters-filter-watchlist-watchednew-description": "Cambios nas páxinas da súa lista de vixilancia que non visitou dende que se produciron os cambios.",
+       "rcfilters-filter-watchlist-notwatched-label": "Ausente da lista de vixilancia",
+       "rcfilters-filter-watchlist-notwatched-description": "Todos, excepto os cambios nas páxinas da súa lista de vixilancia.",
        "rcfilters-filtergroup-changetype": "Tipo de cambio",
        "rcfilters-filter-pageedits-label": "Edicións de páxinas",
        "rcfilters-filter-pageedits-description": "Edicións do contido da wiki, de conversas, de descricións de categorías...",
        "rcfilters-filter-categorization-description": "Rexistros de páxinas engadidas ou borradas de categorías.",
        "rcfilters-filter-logactions-label": "Accións rexistradas",
        "rcfilters-filter-logactions-description": "Accións administrativas, creacións de conta, borrados de páxinas, subas de ficheiros....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "O filtro \"edicións menores\" está en conflito con un ou máis filtros Tipo de modificación, porque certos tipos de modificación non poden designarse como \"menores\". Os filtros en conflito están marcados na zona Filtros activos, arriba.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Certos tipos de modificación non poden designarse como \"menores\", polo que este filtro entra en conflito cos seguintes filtros Tipo de modificaciónː $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Este filtro Tipo de modificación entra en conflito co filtro \"Modificacións menores\". Certos tipos de modificación non poden designarse como \"menores\".",
+       "rcfilters-filtergroup-lastRevision": "Versión actual",
+       "rcfilters-filter-lastrevision-label": "Versión actual",
+       "rcfilters-filter-lastrevision-description": "A última modificación a unha páxina.",
+       "rcfilters-filter-previousrevision-label": "Versións anteriores",
+       "rcfilters-filter-previousrevision-description": "Tódolos cambios realizados nunha páxina e que non son os máis recentes.",
        "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).",
+       "rclistfromreset": "Reinicializar a selección da data",
        "rclistfrom": "Mostrar os cambios novos desde o $3 ás $2",
        "rcshowhideminor": "$1 as edicións pequenas",
        "rcshowhideminor-show": "Mostrar",
        "rcshowhidecategorization": "$1 a categorización de páxinas",
        "rcshowhidecategorization-show": "Mostrar",
        "rcshowhidecategorization-hide": "Agochar",
-       "rclinks": "Mostrar os últimos $1 cambios nos últimos $2 días.<br />$3",
+       "rclinks": "Mostrar os últimos $1 cambios nos últimos $2 días.",
        "diff": "dif",
        "hist": "hist",
        "hide": "Agochar",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuario|usuarios}} vixiando]",
        "rc_categories": "Limitar ás categorías (separadas por \"|\"):",
        "rc_categories_any": "Calquera das elixidas",
+       "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} despois da modificación",
        "newsectionsummary": "Nova sección: /* $1 */",
        "rc-enhanced-expand": "Mostrar os detalles",
        "php-uploaddisabledtext": "As cargas de ficheiros PHP están desactivadas. Por favor, comprobe a característica file_uploads.",
        "uploadscripted": "Este ficheiro contén código HTML ou script que pode producir erros ao ser interpretado polo navegador.",
        "upload-scripted-pi-callback": "Non se pode subir un ficheiro que conteña instrucións de procesamento de follas de estilo XML.",
+       "upload-scripted-dtd": "Non pode subir ficheiros SVG que conteñen unha declaración de DTD non estándar.",
        "uploaded-script-svg": "Atopouse un elemento de comandos \"$1\" no ficheiro SVG subido.",
        "uploaded-hostile-svg": "Atopouse CSS non seguro no elemento de estilo do ficheiro SVG subido.",
        "uploaded-event-handler-on-svg": "Non está permitido fixar atributos de xestión de eventos <code>$1=\"$2\"</code> nos ficheiros SVG.",
        "uploadnewversion-linktext": "Cargar unha nova versión deste ficheiro",
        "shared-repo-from": "de $1",
        "shared-repo": "repositorio compartido",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
        "filepage.css": "/** O CSS que se coloque aquí será incluído na páxina de descrición do ficheiro, así como nos wikis de clientes estranxeiros */",
        "upload-disallowed-here": "Non pode sobrescribir este ficheiro.",
        "filerevert": "Reverter \"$1\"",
        "apisandbox-request-selectformat-label": "Mostrar os datos da petición como:",
        "apisandbox-request-format-url-label": "Cadea de consulta da URL",
        "apisandbox-request-url-label": "URL da solicitude:",
+       "apisandbox-request-format-json-label": "JSON",
        "apisandbox-request-json-label": "Solicitude do JSONː",
        "apisandbox-request-time": "Duración da solicitude: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Corrixir o identificador e reenviar",
        "apisandbox-multivalue-all-values": "$1 (Tódolos valores)",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Procurar fontes bibliográficas",
+       "booksources-isbn": "ISBN:",
        "booksources-search": "Procurar",
        "booksources-text": "A continuación aparece unha lista de ligazóns cara a outros sitios web que venden libros novos e usados; neles tamén pode obter máis información sobre as obras que está a buscar:",
        "booksources-invalid-isbn": "O ISBN inserido semella non ser válido; comprobe que non se producisen erros ao copialo da fonte orixinal.",
        "listgrouprights-rights": "Dereitos",
        "listgrouprights-helppage": "Help:Dereitos do grupo",
        "listgrouprights-members": "(lista de membros)",
+       "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
+       "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
        "listgrouprights-addgroup": "Pode engadir {{PLURAL:$2|o grupo|os grupos}}: $1",
        "listgrouprights-removegroup": "Pode eliminar {{PLURAL:$2|o grupo|os grupos}}: $1",
        "listgrouprights-addgroup-all": "Pode engadir todos os grupos",
        "listgrants-summary": "Esta é unha lista de permisos cos seus accesos asociados aos permisos de usuario. Os usuarios poden autorizar aplicacións para que usen a súa conta, pero con acceso limitado en función dos permisos que o usuario concede á aplicación. Porén, unha aplicación que actúa no nome dun usuario non pode empregar permisos que o propio usuario non posúe.\nPode obter máis información sobre os dereitos individuais [[{{MediaWiki:Listgrouprights-helppage}}|nesta páxina]].",
        "listgrants-grant": "Outorgar",
        "listgrants-rights": "Dereitos",
+       "listgrants-grant-display": "$1 <code>($2)</code>",
        "trackingcategories": "Categorías de seguimento",
        "trackingcategories-summary": "Esta páxina lista as categorías de seguimento que o software de MediaWiki enche automaticamente. Pódense alterar os seus nomes modificando as correspondentes mensaxes do sistema no espazo de nomes \"{{ns:8}}\".",
        "trackingcategories-msg": "Categoría de seguimento",
        "enotif_body_intro_moved": "{{GENDER:$2|$2}} trasladou a páxina chamada \"$1\" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.",
        "enotif_body_intro_restored": "{{GENDER:$2|$2}} restaurou a páxina chamada \"$1\" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.",
        "enotif_body_intro_changed": "{{GENDER:$2|$2}} modificou a páxina chamada \"$1\" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.",
-       "enotif_lastvisited": "Consulte $1 para comprobar todos os cambios feitos desde a súa última visita.",
-       "enotif_lastdiff": "Consulte $1 para ver esta modificación.",
+       "enotif_lastvisited": "Consulte $1 para ver tódolos cambios desde a súa última visita",
+       "enotif_lastdiff": "Consulte $1 para ver este cambio",
        "enotif_anon_editor": "usuario anónimo $1",
        "enotif_body": "Boas, $WATCHINGUSERNAME:\n\n$PAGEINTRO $NEWPAGE\n\nResumo de edición: $PAGESUMMARY $PAGEMINOREDIT\n\nPode contactar co editor:\npor correo electrónico: $PAGEEDITOR_EMAIL\nno wiki: $PAGEEDITOR_WIKI\n\nNon se producirán máis notificacións en caso de que haxa actividade nova ata que acceda ao sistema e visite a páxina. Pode restablecer os indicadores de aviso de notificación para o conxunto das páxinas marcadas na súa lista de vixilancia.\n\nO sistema de avisos de {{SITENAME}}\n\n--\nPara cambiar as notificacións por correo electrónico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nPara cambiar a súa lista de vixilancia, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara borrar a páxina da súa lista de vixilancia, visite\n$UNWATCHURL\n\nAxuda:\n$HELPPAGE",
        "created": "creada",
        "editcomment": "O resumo de edición foi: <em>$1</em>.",
        "revertpage": "Desfixéronse as edicións de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]]); cambiado á última versión feita por [[User:$1|$1]]",
        "revertpage-nouser": "Desfixéronse as edicións dun usuario agochado; cambiado á última versión feita por {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Desfixéronse as edicións de $1;\nvolveuse á última edición, feita por $2.",
+       "rollback-success": "Desfixéronse as edicións de {{GENDER:$3|$1}};\nvolveuse á última edición, feita por {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Revertéronse as edicións de $1;\nrestaurouse a última revisión de $2. [$3 Mostrar os cambios]",
        "sessionfailure-title": "Erro de sesión",
        "sessionfailure": "Parece que hai un problema co rexistro da súa sesión;\nesta acción cancelouse como precaución fronte ao secuestro de sesións.\nPrema no botón \"atrás\", volva cargar a páxina da que proviña e inténteo de novo.",
        "protect-fallback": "Permitir só aos usuarios con permisos de \"$1\"",
        "protect-level-autoconfirmed": "Permitir só aos usuarios autoconfirmados",
        "protect-level-sysop": "Permitir só aos administradores",
+       "protect-summary-desc": "[$1=$2] ($3)",
        "protect-summary-cascade": "protección en serie",
        "protect-expiring": "remata o $2 ás $3 (UTC)",
        "protect-expiring-local": "caduca o $1",
        "undeleteviewlink": "ver",
        "undeleteinvert": "Inverter a selección",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "{{PLURAL:$1|Restaurouse $1 revisión|Restauráronse $1 revisións}}",
-       "undeletedrevisions-files": "Restauráronse $1 {{PLURAL:$1|revisión|revisións}} e $2 {{PLURAL:$2|ficheiro|ficheiros}}",
-       "undeletedfiles": "{{PLURAL:$1|Restaurouse $1 ficheiro|Restauráronse $1 ficheiros}}",
        "cannotundelete": "Algunhas ou todas as restauracións fallaronː\n$1",
        "undeletedpage": "'''A páxina \"$1\" foi restaurada'''\n\nComprobe o [[Special:Log/delete|rexistro de borrados]] para ver as entradas recentes no rexistro de páxinas eliminadas e restauradas.",
        "undelete-header": "Consulte [[Special:Log/delete|no rexistro de borrados]] as páxinas borradas recentemente.",
        "undelete-error-long": "Atopáronse erros ao desfacer a eliminación do ficheiro:\n\n$1",
        "undelete-show-file-confirm": "Está seguro de querer ver unha revisión borrada do ficheiro \"<nowiki>$1</nowiki>\" do día $2 ás $3?",
        "undelete-show-file-submit": "Si",
+       "undelete-revision-row2": "$1 ($2) $3 . . $4 $5 $6 $7 $8",
        "namespace": "Espazo de nomes:",
        "invert": "Inverter a selección",
        "tooltip-invert": "Marque esta caixa para agochar os cambios nas páxinas pertencentes ao espazo de nomes seleccionado (e o espazo de nomes asociado, se escolleu a opción)",
        "sp-contributions-uploads": "cargas",
        "sp-contributions-logs": "rexistros",
        "sp-contributions-talk": "conversa",
-       "sp-contributions-userrights": "xestión dos dereitos do usuario",
+       "sp-contributions-userrights": "xestión dos dereitos {{GENDER:$1|do usuario|da usuaria}}",
        "sp-contributions-blocked-notice": "Este usuario está bloqueado. Velaquí está a última entrada do rexistro de bloqueos, por se quere consultala:",
        "sp-contributions-blocked-notice-anon": "Este enderezo IP está bloqueado.\nVelaquí está a última entrada do rexistro de bloqueos, por se quere consultala:",
        "sp-contributions-search": "Busca de contribucións",
        "unblocked-id": "O bloqueo $1 foi eliminado.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] foi desbloqueado.",
        "blocklist": "Usuarios bloqueados",
+       "autoblocklist": "Autobloqueos",
+       "autoblocklist-submit": "Procura",
+       "autoblocklist-legend": "Listar autobloqueos",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Autobloqueo local|Autobloqueos locais}}",
+       "autoblocklist-empty": "A lista de autobloqueos está baleira.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Outro autobloqueo|Outros autobloqueos}}",
        "ipblocklist": "Usuarios bloqueados",
        "ipblocklist-legend": "Buscar un usuario bloqueado",
        "blocklist-userblocks": "Agochar os bloqueos de contas",
        "tooltip-pt-mycontris": "Lista das súas contribucións",
        "tooltip-pt-anoncontribs": "Unha lista das modificacións feitas desde este enderezo IP",
        "tooltip-pt-login": "Recoméndaselle rexistrarse, se ben non é obrigatorio",
+       "tooltip-pt-login-private": "Precisa conectarse para usa esta wiki",
        "tooltip-pt-logout": "Saír ao anonimato",
        "tooltip-pt-createaccount": "Recoméndaselle crear unha conta e acceder ao sistema, se ben non é obrigatorio",
        "tooltip-ca-talk": "Conversa acerca do contido desta páxina",
        "tooltip-preferences-save": "Gardar as preferencias",
        "tooltip-summary": "Escriba un breve resumo",
        "interlanguage-link-title": "$1 – $2",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "common.css": "/** O CSS que se coloque aquí será aplicado a todas as aparencias */",
        "print.css": "/* O CSS que se coloque aquí afectará ás impresións */",
        "noscript.css": "/* O CSS que se coloque aquí afectará aos usuarios co JavaScript desactivado */",
        "group-autoconfirmed.css": "/* O CSS que se coloque aquí afectará soamente aos usuarios autoconfirmados */",
+       "group-user.css": "/* Os estilos CSS colocados aquí aplicaranse a tódolos usuarios rexistrados */",
        "group-bot.css": "/* O CSS que se coloque aquí afectará soamente aos bots */",
        "group-sysop.css": "/* O CSS que se coloque aquí afectará soamente aos administradores */",
        "group-bureaucrat.css": "/* O CSS que se coloque aquí afectará soamente aos burócratas */",
        "common.js": "/* Calquera JavaScript que haxa aquí será cargado para todos os usuarios en cada páxina que vexan. */",
        "group-autoconfirmed.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os usuarios autoconfirmados */",
+       "group-user.js": "/* Calquera código JavaScript escrito aquí cargarase para tódolos usuarios rexistrados */",
        "group-bot.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os bots */",
        "group-sysop.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os administradores */",
        "group-bureaucrat.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os burócratas */",
        "anonymous": "{{PLURAL:$1|Usuario anónimo|Usuarios anónimos}} de {{SITENAME}}",
        "siteuser": "$1 de {{SITENAME}}",
        "anonuser": "o usuario anónimo $1 de {{SITENAME}}",
-       "lastmodifiedatby": "A última modificación desta páxina foi o $1 ás $2 por $3.",
+       "lastmodifiedatby": "A última edición desta páxina foi o $1 ás $2 por $3.",
        "othercontribs": "Baseado no traballo feito por $1.",
        "others": "outros",
        "siteusers": "{{PLURAL:$2|{{GENDER:$1|o usuario|a usuaria}}|os usuarios}} $1 de {{SITENAME}}",
        "pageinfo-few-watchers": "Menos de $1 {{PLURAL:$1|vixiante|vixiantes}}",
        "pageinfo-few-visiting-watchers": "Pode haber, ou non, un usuario que vixía páxinas visitando as edicións recentes",
        "pageinfo-redirects-name": "Número de redireccións cara a esta páxina",
+       "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Subpáxinas desta páxina",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirección|redireccións}}; $3 {{PLURAL:$3|non-redirección|non-redireccións}})",
        "pageinfo-firstuser": "Creador da páxina",
        "mediawarning": "'''Aviso:''' Este tipo de ficheiro pode conter código malicioso.\nO seu sistema pode quedar comprometido se o executa.",
        "imagemaxsize": "Límite de tamaño das imaxes:<br />''(nas páxinas de descrición de ficheiros)''",
        "thumbsize": "Tamaño da miniatura:",
+       "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|páxina|páxinas}}",
        "file-info": "tamaño do ficheiro: $1; tipo MIME: $2",
        "file-info-size": "$1 × $2 píxeles; tamaño do ficheiro: $3; tipo MIME: $4",
        "newimages-summary": "Esta páxina especial mostra os últimos ficheiros cargados.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nome do ficheiro (ou parte del):",
+       "newimages-user": "Enderezo IP ou nome de usuario",
        "newimages-showbots": "Mostrar as cargas feitas por bots",
        "newimages-hidepatrolled": "Agochar as subidas patrulladas",
        "noimages": "Non hai imaxes que mostrar.",
        "ilsubmit": "Procurar",
        "bydate": "por data",
        "sp-newimages-showfrom": "Mostrar os novos ficheiros comezando polo $1 ás $2",
+       "video-dims": "$1, $2 × $3",
+       "seconds-abbrev": "$1 s",
        "minutes-abbrev": "$1 min",
+       "hours-abbrev": "$1 h",
+       "days-abbrev": "$1 d",
        "seconds": "{{PLURAL:$1|$1 segundo|$1 segundos}}",
        "minutes": "{{PLURAL:$1|$1 minuto|$1 minutos}}",
        "hours": "{{PLURAL:$1|$1 hora|$1 horas}}",
        "metadata-expand": "Mostrar os detalles",
        "metadata-collapse": "Agochar os detalles",
        "metadata-fields": "Os campos de metadatos listados nesta mensaxe incluiranse na páxina da imaxe ao contraer a táboa dos metadatos.\nOs demais agocharanse por omisió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",
+       "metadata-langitem": "<strong>$2:</strong> $1",
+       "metadata-langitem-default": "$1",
        "exif-imagewidth": "Ancho",
        "exif-imagelength": "Alto",
        "exif-bitspersample": "Bits por compoñente",
        "exif-exposuretime": "Tempo de exposición",
        "exif-exposuretime-format": "$1 segundos ($2)",
        "exif-fnumber": "Número f",
+       "exif-fnumber-format": "f/$1",
        "exif-exposureprogram": "Programa de exposición",
        "exif-spectralsensitivity": "Sensibilidade espectral",
        "exif-isospeedratings": "Relación de velocidade ISO",
        "exif-lightsource": "Fonte da luz",
        "exif-flash": "Flash",
        "exif-focallength": "Lonxitude focal",
+       "exif-focallength-format": "$1 mm",
        "exif-subjectarea": "Área do suxeito",
        "exif-flashenergy": "Enerxía do flash",
        "exif-focalplanexresolution": "Resolución X do plano focal",
        "exif-gpsareainformation": "Nome da área GPS",
        "exif-gpsdatestamp": "Data do GPS",
        "exif-gpsdifferential": "Corrección diferencial do GPS",
+       "exif-coordinate-format": "$1° $2′ $3″ $4",
        "exif-jpegfilecomment": "Comentario do ficheiro JPEG",
        "exif-keywords": "Palabras clave",
        "exif-worldregioncreated": "Rexión do mundo onde se tirou a foto",
        "exif-personinimage": "Persoa retratada",
        "exif-originalimageheight": "Altura da imaxe antes de ser cortada",
        "exif-originalimagewidth": "Ancho da imaxe antes de ser cortada",
+       "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+       "exif-subjectnewscode-value": "$2 ($1)",
        "exif-compression-1": "Sen comprimir",
        "exif-compression-2": "CCITT Grupo 3 Lonxitude de codificación unidimensional Huffman modificada",
        "exif-compression-3": "CCITT Grupo 3 codificación de fax",
        "exif-compression-4": "CCITT Grupo 4 codificación de fax",
        "exif-compression-6": "JPEG (vello)",
+       "exif-compression-7": "JPEG",
+       "exif-compression-34712": "JPEG2000",
        "exif-copyrighted-true": "Con dereitos de autoría",
        "exif-copyrighted-false": "Dereitos de autoría non definidos",
+       "exif-photometricinterpretation-0": "Branco e negro (branco é 0)",
        "exif-photometricinterpretation-1": "Negro e branco (negro é 0)",
+       "exif-photometricinterpretation-2": "RGB",
+       "exif-photometricinterpretation-4": "Máscara de transparencia",
+       "exif-photometricinterpretation-5": "Separados (Probablemente CMYK)",
+       "exif-photometricinterpretation-32803": "Matriz de filtro de cor",
        "exif-unknowndate": "Data descoñecida",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Volteada horizontalmente",
        "exif-orientation-8": "Rotada 90° en sentido horario",
        "exif-planarconfiguration-1": "formato de paquete de píxeles",
        "exif-planarconfiguration-2": "formato de planos",
+       "exif-xyresolution-i": "$1 ppp",
        "exif-colorspace-65535": "Sen calibrar",
        "exif-componentsconfiguration-0": "non existe",
        "exif-exposureprogram-0": "Sen definir",
        "confirmrecreate": "O usuario [[User:$1|$1]] ([[User talk:$1|conversa]]) {{GENDER:$1|borrou}} esta páxina despois de que vostede comezase a editala, achegando o seguinte motivo:\n: <em>$2</em>\nPor favor, confirme que realmente quere recrear esta páxina.",
        "confirmrecreate-noreason": "O usuario [[User:$1|$1]] ([[User talk:$1|conversa]]) {{GENDER:$1|borrou}} esta páxina despois de que vostede comezase a editala. Por favor, confirme que realmente quere recrear esta páxina.",
        "recreate": "Recrear",
+       "confirm-purge-title": "Purgar esta páxina",
        "confirm_purge_button": "Aceptar",
        "confirm-purge-top": "Quere limpar a memoria caché desta páxina?",
        "confirm-purge-bottom": "Ao purgar unha páxina, límpase a memoria caché e isto obriga tamén a que apareza a versión máis recente da páxina.",
        "confirm-unwatch-top": "Quere eliminar esta páxina da lista de vixilancia?",
        "confirm-rollback-button": "Aceptar",
        "confirm-rollback-top": "Quere reverter as edicións desta páxina?",
+       "semicolon-separator": ";&#32;",
+       "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
+       "pipe-separator": "&#32;|&#32;",
+       "word-separator": "&#32;",
+       "ellipsis": "...",
+       "percent": "$1%",
+       "parentheses": "($1)",
+       "brackets": "[$1]",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← páxina anterior",
        "imgmultipagenext": "páxina seguinte →",
        "imgmultigo": "Ir!",
        "imgmultigoto": "Ir á páxina $1",
+       "img-lang-opt": "$2 ($1)",
        "img-lang-default": "(lingua por defecto)",
        "img-lang-info": "Renderizar esta imaxe en $1. $2",
        "img-lang-go": "Mostrar",
        "autoredircomment": "Redirixida cara a \"[[$1]]\"",
        "autosumm-new": "Nova páxina: \"$1\"",
        "autosumm-newblank": "A páxina creouse sen contido",
+       "size-bytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "size-kilobytes": "$1 kB",
+       "size-megabytes": "$1 MB",
+       "size-gigabytes": "$1 GB",
+       "size-terabytes": "$1 TB",
+       "size-petabytes": "$1 PB",
+       "size-exabytes": "$1 EB",
+       "size-zetabytes": "$1 ZB",
+       "size-yottabytes": "$1 YB",
+       "size-pixel": "$1 {{PLURAL:$1|píxel|píxeles}}",
+       "bitrate-bits": "$1 bps",
+       "bitrate-kilobits": "$1 kbps",
+       "bitrate-megabits": "$1 Mbps",
+       "bitrate-gigabits": "$1 Gbps",
+       "bitrate-terabits": "$1 Tbps",
+       "bitrate-petabits": "$1 Pbps",
+       "bitrate-exabits": "$1 Ebps",
+       "bitrate-zetabits": "$1 Zbps",
+       "bitrate-yottabits": "$1 Ybps",
        "lag-warn-normal": "Pode que os cambios feitos {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} non aparezan nesta lista.",
        "lag-warn-high": "Debido a unha gran demora do servidor da base de datos, pode que nesta lista non aparezan os cambios feitos {{PLURAL:$1|no último segundo|nos últimos $1 segundos}}.",
        "watchlistedit-normal-title": "Editar a lista de vixilancia",
        "watchlisttools-view": "Ver as modificacións relevantes",
        "watchlisttools-edit": "Ver e editar a lista de vixilancia",
        "watchlisttools-raw": "Editar a lista de vixilancia simple",
+       "iranian-calendar-m1": "Farvardin",
+       "iranian-calendar-m2": "Ordibehesht",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|conversa]])",
        "timezone-local": "Local",
        "duplicate-defaultsort": "<strong>Aviso:</strong> A clave de ordenación por defecto \"$2\" anula a clave de ordenación anterior por defecto \"$1\".",
        "htmlform-user-not-valid": "\"<strong>$1</strong>\" non é un nome de usuario válido.",
        "logentry-delete-delete": "$1 {{GENDER:$2|borrou}} a páxina \"$3\"",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|eliminou}} a redirección $3 sobreescribíndoa",
-       "logentry-delete-restore": "$1 {{GENDER:$2|restaurou}} a páxina \"$3\"",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restaurou}} a páxina \"$3\" ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|restaurou}} a páxina $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 revisión|$1 revisións}}",
+       "restore-count-files": "{{PLURAL:$1|1 ficheiro|$1 ficheiros}}",
        "logentry-delete-event": "$1 {{GENDER:$2|mudou}} a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|mudou}} a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina \"$3\": $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|mudou}} a visibilidade de entradas do rexistro de $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|actualizou}} etiquetas da revisión $4 da páxina $3 ({{PLURAL:$7|engadiu}} $6; {{PLURAL:$9|eliminou}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|actualizou}} etiquetas da entrada do rexistro $5 da páxina $3 ({{PLURAL:$7|engadiu}} $6; {{PLURAL:$9|eliminou}} $8)",
        "rightsnone": "(ningún)",
-       "revdelete-summary": "o resumo de edición",
        "rightslogentry-temporary-group": "$1 (temporal, ata $2)",
        "feedback-adding": "Enviando os comentarios...",
        "feedback-back": "Volver",
        "special-characters-group-thai": "Tailandés",
        "special-characters-group-lao": "Laosiano",
        "special-characters-group-khmer": "Camboxano",
+       "special-characters-group-canadianaboriginal": "Aborixe canadense",
        "special-characters-title-endash": "guión",
        "special-characters-title-emdash": "raia",
        "special-characters-title-minus": "signo menos",
        "mw-widgets-titleinput-description-redirect": "redirección cara a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Engadir unha categoría...",
        "mw-widgets-usersmultiselect-placeholder": "Engadir máis...",
+       "date-range-from": "Dende a data:",
+       "date-range-to": "Ata a data:",
        "sessionmanager-tie": "Non pode combinar peticións múltiples de tipos de autenticación: $1.",
        "sessionprovider-generic": "sesións $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesións baseadas nas cookies",
        "restrictionsfield-label": "Rangos de IP permitidos:",
        "restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utiliceː\n<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisión $1",
-       "pageid": "identificador de páxina $1"
+       "pageid": "identificador de páxina $1",
+       "rawhtml-notallowed": "As marcas &lt;html&gt; non poden usarse fóra das páxinas normais.",
+       "gotointerwiki": "Deixando {{SITENAME}}",
+       "gotointerwiki-invalid": "O título especificado non é válido.",
+       "gotointerwiki-external": "Vai sair de {{SITENAME}} para visitar [[$2]], que é un sitio web externo.\n\n'''[$1 Continuar en $1]'''",
+       "undelete-cantedit": "Non pode anular o borrado desta páxina porque non ten permisos para editar esta páxina.",
+       "undelete-cantcreate": "Non pode anular o borrado desta páxina xa que non hai ningunha páxina con ese nome e non ten permisos para creala."
 }
index 46af76a..e42ae97 100644 (file)
@@ -30,6 +30,9 @@
        "tog-watchlisthideliu": "ديرين بمأ کارگيرؤنˇ دچينواچينؤنه، پىگيتنؤنˇ ليستˇ مئن دۊخۊسان",
        "tog-ccmeonemails": "اۊ ايمىلˇ جي که ديگرؤن ئبه اۊسئه کؤنم ىک نؤسخه کؤپي مئبه روانه بۊبۊن",
        "tog-norollbackdiff": "پساوگردانئنˇ پسي، تؤفير نۊشؤن بدأ نۊبۊن",
+       "underline-always": "هميشک",
+       "underline-never": "هرگيز",
+       "editfont-serif": "ديمه‌دار قلم",
        "sunday": "ىکشمبه",
        "monday": "دۊشمبه",
        "tuesday": "سۊشمبه",
        "category-article-count-limited": "جيرˇ{{PLURAL:$1|ولگ|$1 ولگ}} هي جرگه مئن دره.",
        "category-file-count": "{{PLURAL:$2|اي جرگه مئن خالي اي فاىل دره.|{{PLURAL:$1|اي فاىل|اي $1ته فاىل}} اي جرگه مئن {{PLURAL:$1|دره|درن}}؛ اي جرگه مئن در کؤل $2ته فاىل دره.}}",
        "listingcontinuesabbrev": "(ايدامه)",
+       "about": "راجع به",
+       "article": "دله ولگ",
        "newwindow": "(تازه پنجره ميئن بازأبۊنه)",
        "cancel": "لغو",
        "moredotdotdot": "ویشتر...",
+       "morenotlisted": "اي ليست مۊمکنه کامل نبي.",
        "mypage": "ولگ",
        "mytalk": "گب",
        "anontalk": "گب",
        "qbfind": "ىاتن",
        "qbedit": "دچینواچین",
        "qbpageoptions": "اي ولگ",
+       "faq": "رايج سۊالؤن",
+       "faqpage": "Project:رايج سۊالؤن",
+       "actions": "کۊنۊشؤن",
        "namespaces": "نؤمفضاؤن",
        "variants": "گۊىشؤن",
        "navigation-heading": "گرأخؤر منؤ",
+       "errorpagetitle": "سأب",
        "returnto": "$1 وگرد.",
        "tagline": "{{SITENAME}} جي",
        "help": "رانما",
        "searcharticle": "بۊشۊ",
        "history": "ولگˇ تاريخ",
        "history_short": "تاريخ",
+       "history_small": "تاريخ",
        "printableversion": "وؤته چاپ گۊدن",
        "permalink": "داىمي خال",
+       "print": "چاپ",
        "view": "دئن",
        "view-foreign": "دئن $1ˇ ميئن",
        "edit": "دچينواچين",
+       "create": "چاگۊدن",
        "editthispage": "اي ولگه دچينواچين بکۊن",
        "create-this-page": "اي ولگه چاکۊن",
        "delete": "حذف",
        "deletethispage": "اي ولگه پاکأ کۊن.",
+       "undeletethispage": "اي ولگه احيا بکۊن.",
        "protect": "پأسن",
+       "protect_change": "تغيير",
        "protectthispage": "اي ولگه بپا",
        "unprotect": "پأسنه عوضأؤدن",
        "unprotectthispage": "اي ولگˇ پأسنه عوضأکۊن",
        "views": "بدئرؤن",
        "toolbox": "أبزارؤن",
        "userpage": "کارگيرˇ ولگه دئن",
+       "imagepage": "فايلˇ ولگه دئن",
        "categorypage": "جرگه ولگه دئن",
        "otherlanguages": "باخي زوانؤنˇ جي",
        "redirectedfrom": "(مسير عوضاؤدن $1 أجي)",
+       "redirectto": "تغييرمسير به:",
        "lastmodifiedat": "اي ولگ آخري گرش $1ˇ ميئن ساعت $2 دچينواچين بۊبؤ.",
        "protectedpage": "بپأسه ولگ",
        "jumpto": "بوؤز:",
        "disclaimers": "ردنامهٰ‌ن",
        "disclaimerpage": "Project:عۊمۊمي ردنامه",
        "edithelp": "دچينواچينˇ رانما",
+       "helppage-top-gethelp": "رانما",
        "mainpage": "گتˇ ولگ",
        "mainpage-description": "گتˇ ولگ",
+       "policy-url": "Project:سياستؤن",
        "portal": "أمي جیگا",
        "portal-url": "Project:کارگيرؤنˇ ديرينگه",
        "privacy": "خۊصۊصي حریمˇ سیاست",
        "privacypage": "Project:حريمˇ سیاست",
+       "badaccess": "دسبرسي سأب",
        "badaccess-groups": "کاري که شمه خأنين، فقط {{PLURAL:$2|اي پأره|اي پأره'ن}} کارگيرؤنˇ شئه: $1.",
+       "ok": "خؤ",
        "retrievedfrom": "«$1» جي وأىته",
        "youhavenewmessagesfromusers": "شمه {{PLURAL:$4|ىکته دئه کارگير|$3 کارگير}} جي $1 دأنين ($2).",
        "editsection": "دچينواچين",
        "viewsourcelink": "سربسه دئن",
        "editsectionhint": "وابينˇ دچينواچين: $1",
        "toc": "دله",
+       "showtoc": "نۊشؤن دأن",
+       "hidetoc": "دۊخۊسان",
+       "confirmable-yes": "أهأ",
+       "confirmable-no": "نأ",
+       "viewdeleted": "$1ˇ دئن؟",
+       "feedlinks": "خبرخؤن:",
        "site-atom-feed": "أتؤمˇ خۊراک $1 ئبه",
        "page-atom-feed": "أتؤمˇ خۊراک $1 ئبه",
        "red-link-title": "$1 (ولگ دننه)",
        "nstab-special": "خاصˇ ولگ",
        "nstab-project": "پؤرؤژه ولگ",
        "nstab-image": "فاىل",
+       "nstab-mediawiki": "پيغؤم",
        "nstab-template": "قالب",
+       "nstab-help": "رانما ولگ",
        "nstab-category": "جرگه",
        "mainpage-nstab": "گتˇ ولگ",
        "error": "سأب",
        "cannotloginnow-text": "وختي $1 کاردره، نشأنه دۊيرين أمأن.",
        "yourdomainname": "تي پره",
        "login": "ديرين بأىن",
-       "userloginnocreate": "ديرين",
        "logout": "بيرين شؤن",
        "userlogout": "بيرين شؤن",
+       "notloggedin": "دۊيرين نمأين",
        "userlogin-noaccount": "کارگيري حيساب ندأني؟",
        "userlogin-joinproject": "{{SITENAME}}ˇ مئن ثبتˇ نام بکۊن.",
-       "nologin": "کارگيري حيساب ندأني؟ $1.",
-       "nologinlink": "ىکته حيساب چاکۊن",
        "createaccount": "حيساب چاکۊدن",
-       "gotaccount": "ىکته کارگيري حيساب دأني؟ $1.",
-       "gotaccountlink": "دۊيرين",
-       "userlogin-resetlink": "دۊيرين أمأنˇ اطلاعاته ىادأگۊدي؟",
        "userlogin-resetpassword-link": "تي رمزه ىادأگۊدي؟",
+       "userlogin-helplink2": "دؤرين أمأن کۊمکˇ أمرأ",
        "userlogin-loggedin": "شمه هسأ {{GENDER:$1|$1}}ˇ تأهأت ديرين بمأىن.\nأگه خأ ىکته دئه کارگيرˇ تأهأت ديرن بأىن، جيري فؤرمه کاراگيرين.",
        "userlogin-createanother": "ىکته دئه کارگيري حيساب چاکۊن",
        "createacct-emailrequired": "ايمىلˇ آدرس",
        "createacct-email-ph": "تي ايمىلˇ آدرسه بنويس",
        "createacct-another-email-ph": "ايمىلˇ آدرسه بنويس",
        "createacct-realname": "واقعي نؤم (ديلبخا)",
-       "createaccountreason": "دليل:",
        "createacct-reason": "دليل",
        "createacct-reason-ph": "چره ىکته دئه کارگيري حساب چاکأدري؟",
        "createacct-submit": "تي کارگيري حيسابه چاکۊن",
        "password-name-match": "شيمئه رمز وا شيمئه کارگيري نؤمˇ أمرأ تؤفير بدأره.",
        "mailmypassword": "هندئه رمز چاگۊدن",
        "passwordremindertext": "ىک نفر (شاىد خۊدˇ شمه، $1 آى.پي نۊشؤني جي) {{SITENAME}} مئن شيمئه کارگيري حساب ئبه تازه رمز بخأسته ($4).\nىکته مؤوقتي رمز چاگۊده بۊبؤ \"$2\" کارگير ئبه ؤ ائره نأ: \"$3\". \nأگه هينه خأستين، هسأ وأ وبجيگه' ديرين بشين ؤ تازه رمز چاکۊنين.\nشيمئه مؤوقتي رمز {{PLURAL:$5|ىک رۊز|$5 رۊز}} مئن باطل بۊنه.\n\nأگه ىک نفر ديگه همچين چيزي بخأسته ىا أگه شمه شيمئه قديمي رمزه ىاد بأردين ؤ دئه نخأنين اۊنه عوضأکۊنين، اي پىغامه ندئه بگيرين ؤ هۊ قديمي رمزه کاراگيرين.",
+       "emailconfirmlink": "تي ايميلˇ آدرسه تأييد بکۊن",
        "accountcreated": "حيساب چاگۊده-بۊبؤ!",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|گب]]) واسي کارگيري حيساب چاگۊده بۊبؤ.",
        "login-migrated-generic": "شيمئه کارگيري حيساب جابجا بۊبؤ ؤ شيمئه کارگيري نؤم ديگه اي ويکي ميئن دننه.",
        "retypenew": "رمزه دۊمارته بنويس",
        "resetpass_submit": "رمزه عوضأکۊن ؤ دۊيرين بشۊ",
        "changepassword-success": "تي رمز عوضأبؤ!",
+       "botpasswords-label-appid": "رۊباتˇ نؤم:",
        "botpasswords-label-create": "چاگۊدن",
        "botpasswords-label-update": "برۊزأگۊدن",
        "botpasswords-label-cancel": "لغو",
        "resetpass-submit-cancel": "لغو",
        "passwordreset": "هندئه رمز چاگۊدن",
        "passwordreset-username": "کارگيري نؤم:",
+       "passwordreset-domain": "پره:",
+       "passwordreset-email": "ايمىلˇ آدرس:",
        "passwordreset-emailelement": "کارگيري نؤم: \n$1\n\nمؤوقتي رمز: \n$2",
+       "changeemail-newemail": "تازه ايميلˇ آدرس:",
+       "changeemail-none": "(هيچ)",
        "bold_sample": "پۊررنگˇ وؤت",
        "bold_tip": "پۊررنگˇ وؤت",
        "italic_sample": "کجˇ وؤت",
        "minoredit": "اي نيميزگره دچينواچينه",
        "watchthis": "اي ولگه پى بگير",
        "savearticle": "ولگه ذخيره گۊدن",
+       "publishpage": "ولگه مۊنتشرأگۊدن",
+       "publishchanges": "تغييرؤنه مۊنتشرأگۊدن",
        "preview": "پيشادئن",
        "showpreview": "پيشادئن",
        "showdiff": "تغىيرؤنه نۊشؤن دأن",
-       "summary-preview": "پيشادئنˇفيچالسه:",
+       "summary-preview": "فيچالسه پيشادئن:",
+       "subject-preview": "مؤضۊعˇ پيشادئن:",
        "blockedtitle": "کارگير دبۊسته بۊبؤ",
        "loginreqtitle": "خأ أول ديرين بأى",
        "loginreqlink": "ديرين بئه",
-       "noarticletext": "اي ولگˇ مئن ألؤنى هيچ وؤتي دننئه. شۊمۊ تؤنين باخيˇ ولگؤنˇ مئن [[Special:Search/{{PAGENAME}}|اي ولگˇ تيتره وامجين]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} مۊرتبط سياه'نه وامجين]،\nىا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اي ولگه دچينواچين بکۊنين]</span>.",
+       "newarticle": "(تازه)",
+       "noarticletext": "اي ولگˇ مئن ألؤنى هيچ وؤتي دننئه. شۊمۊ تؤنين باخيˇ ولگؤنˇ مئن [[Special:Search/{{PAGENAME}}|اي ولگˇ تيتره وامجين]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} مۊرتبط سياه'نه وامجين]،\nىا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اي ولگه چاکۊنين]</span>.",
        "editing": "$1 دچينواچين گۊدن",
+       "creating": "$1ˇ چأگۊدن",
        "editingsection": "دچيواچينˇ مئن $1 (وابين)",
+       "yourtext": "تي وؤت",
+       "yourdiff": "تفاوۊتؤن",
        "templatesused": "اي ولگˇ مينˇ {{PLURAL:$1|قالب|قالبؤن}}",
        "template-protected": "(بپأسه)",
        "template-semiprotected": "(نيمه بپأسه)",
        "hiddencategories": "اي ولگ {{PLURAL:$1|ىکته جخۊته جرگه|$1 جخۊته جرگه}} مئن دره:",
+       "moveddeleted-notice": "اي ولگ حذفأبؤکه.\nحذف ؤ اينتقالˇ سياهه اي ولگˇ ويسين اي بۊن نۊشؤن بدأکه.",
+       "viewpagelogs": "اي ولگˇ سياهه'نه دئن",
        "currentrev-asof": "هسأىي نۊسخه تا $1",
        "revisionasof": "نۊسخه $1",
        "previousrevision": "→ قديميترˇ نۊسخه",
+       "nextrevision": "تازه‌ترˇ نۊسخه ←",
        "currentrevisionlink": "هسأىى نۊسخهٰ نۊشؤن دأن",
        "cur": "ألؤن",
        "last": "دأميشکي",
        "rev-delundel": "نۊشؤن دأن/جۊخۊسانئن",
        "revdelete-hide-user": "کارگيري نؤم/آى.پي",
        "revdelete-reason-dropdown": "*حذفˇ هرماله دليلؤن\n** چاکۊدنحقه نقض گۊدن\n** نظر ىا اطلاعاتي که مؤناسب نيه\n** کارگيري نؤمي که مؤناسب نيه\n** اطلاعاتي که اۊنˇ مئن تؤهمت دره",
+       "history-title": "\"$1\"ˇ واگرداني تارئخ",
        "difference-title": "$1: نۊسخه'نˇ تؤفير",
        "lineno": "رچ $1:",
        "editundo": "وگردانئن",
        "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)",
        "searchprofile-articles": "دله ولگؤن",
        "recentchanges-label-unpatrolled": "اي دچينواچين هلئه گشتزني نۊبؤ",
        "recentchanges-label-plusminus": "ولگˇ حجم اي مقدار بايتˇ واويراز تغيير بؤده",
        "recentchanges-legend-heading": "<strong>اختصارؤن:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}( [[Special:NewPages|تازه ولگؤنˇ ليسته]] بينين)",
        "rclistfrom": "تازه تغييرؤنˇ نۊشؤن دأنˇ سرأگيري $3 $2ˇ جي",
        "rcshowhideminor": "$1 نيميزگره دچينواچينؤن",
        "rcshowhideminor-show": "نۊشؤن دأن",
        "rcshowhidemine": "$1 مي دچينواچينؤن",
        "rcshowhidemine-show": "نۊشؤن دأن",
        "rcshowhidemine-hide": "دۊخۊسان",
+       "rclinks": "آخري $1ته تغییره آخري $2 رۊزˇ ميئن نۊشؤن دأن",
        "diff": "تؤفير",
        "hist": "تاريخ",
        "hide": "دۊخۊسان",
        "rc-change-size-new": "$1 {{PLURAL:$1|باىت}} تغييرˇ پسي",
        "recentchangeslinked": "مۊرتبطˇ تغىيرؤن",
        "recentchangeslinked-toolbox": "مۊرتبطˇ تغىيرؤن",
+       "recentchangeslinked-title": "\"$1\"ˇ مۊرتبط تغييرؤن",
        "recentchangeslinked-summary": "اي جير، ىکته ليسته تينين بىنين آخري تغييرؤن أجي اۊ ولگؤنˇ مئن کي اي ولگˇ جي خال ببؤن (ىا جرگهٔ مؤردˇ نظرˇ جي). اۊ ولگؤني که [[Special:Watchlist|شيمئه پىگيري ليست]]۱ميئن دبۊن پۊررنگ نۊشؤن بدأبۊنن.",
        "recentchangeslinked-page": "ولگˇ نؤم:",
        "upload": "فاىله جؤراکشئن",
        "filehist-comment": "نظر",
        "imagelinks": "فاىله کارأىتن",
        "linkstoimage": "اي {{PLURAL:$1|ولگ|ولگؤن}} اي تاتاىئه خال بدأ {{PLURAL:$1|دأنه|دأنن}}:",
+       "nolinkstoimage": "اي فايل هيته ولگˇ ميئن کأرأگيته نۊبؤ.",
        "sharedupload-desc-here": "اي فاىل $1 مئن دره ؤ شاىد باخيˇ پؤرؤژه'نˇ مئنأني کاراىته بۊبۊن.\n[$2 فاىلˇ تؤضيحاتˇ ولگ، اؤره]ˇ مئنˇ تؤضيحات اي جير نۊشؤن بدأره.",
        "randompage": "کترئي ولگ",
        "randomincategory": "جرگه مئنˇ کترئي ولگ",
        "statistics-users": "[[Special:ListUsers|کارگيرؤن]] ثبتˇ نام بؤده",
        "nbytes": "$1 {{PLURAL:$1|باىت|باىتؤن}}",
        "ncategories": "{{PLURAL:$1|جرگه|جرگهٰ‌ن}}",
+       "nmembers": "$1 {{PLURAL:$1|عۊضو|عۊضو}}",
        "protectedpages": "بپأسه ولگؤن",
        "protectedpages-performer": "پأسن کارگير",
        "protectedpages-unknown-performer": "ناشيناس کارگير",
        "tooltip-namespace_association": "ائره' تيک بزنين تا گبˇ نؤمفضا ىا مؤرتبط مؤضۊع ىا دؤجين بۊبؤ نؤمفضا ني شامل بۊبۊن.",
        "blanknamespace": "گت",
        "contributions": "{{GENDER:$1|کارگير}}ˇ مۊشارکتؤن",
+       "mycontris": "مۊشارکتؤن",
+       "anoncontribs": "مۊشارکتؤن",
        "month": "اي ماه مئن (ؤ دأميشک):",
        "year": "اي سالˇ مئن (ؤ دأميشک):",
        "sp-contributions-talk": "گب",
        "whatlinkshere": "هرچي خال ببؤ ائره",
+       "whatlinkshere-title": "ولگؤني گه «$1»ˇ أمرأ خال دأنن",
        "whatlinkshere-page": "ولگ:",
+       "linkshere": "جيري ولگؤن '''[[:$1]]'''ˇ أمرأ خال دأنن:",
+       "isredirect": "تغييرمسيرˇ ولگ",
        "isimage": "فاىلˇ خال",
+       "whatlinkshere-prev": "{{PLURAL:$1|قبلي|$1 قبلي مؤرد}}",
+       "whatlinkshere-next": "{{PLURAL:$1|بعدي|$1 بعدي مؤرد}}",
        "whatlinkshere-links": "→ خالؤن",
+       "whatlinkshere-hideredirs": "$1ˇ تغيير مسير",
        "whatlinkshere-hidelinks": "$1 خالؤن",
        "whatlinkshere-filters": "فيلترؤن",
        "blocklist-by": "دبۊدگر کيا",
        "tooltip-pt-userpage": "{{جنس:|شيمي کارگير}} ولگ",
        "tooltip-pt-mytalk": "{{جنس:|شيمي}} گبˇ ولگ",
        "tooltip-pt-preferences": "{{جنس:|شيمي}} ترجيحات",
+       "tooltip-pt-watchlist": "ولگؤنˇ ليستي گه شۊمۊ ايشؤنˇ تغييرؤنه پى گينين",
+       "tooltip-pt-mycontris": "{{GENDER:|شيمي}} مۊشارکتؤنˇ ليست",
        "tooltip-pt-login": "بئتره ديرين بشين؛ بسچی گه ايجباری نیه.",
        "tooltip-pt-logout": "بيرين شؤن",
        "tooltip-pt-createaccount": "بئتره کارگیري حساب چاکۊنين ؤ ديرين بشين؛ بسچي که حساب چاؤدن ايجباری نیه.",
        "tooltip-ca-nstab-main": "مۊحتوياتˇ ولگه دئن",
        "tooltip-ca-nstab-user": "کارگيرˇ ولگه دئن",
        "tooltip-ca-nstab-special": "اي ىکته خاصˇ ولگه ؤ نشأنه دچينواچين گۊدن.",
+       "tooltip-ca-nstab-project": "پؤرؤژه ولگه دئن",
        "tooltip-ca-nstab-image": "فاىلˇ ولگه دئن",
        "tooltip-ca-nstab-template": "قالبه دئن",
        "tooltip-ca-nstab-category": "جرگه ولگه دئن",
        "pageinfo-hidden-categories": "جخۊته {{PLURAL:$1| جرگه|جرگه}} ( $1 )",
        "pageinfo-toolboxlink": "ولگˇ اطلاعات",
        "pageinfo-category-info": "جرگه اطلاعات",
+       "previousdiff": "→ قديمي‌ترˇ دچينواچين",
+       "nextdiff": "تازه‌ترˇ دچينواچين ←",
        "file-info-size": "<span dir=\"ltr\">$1 × $2</span> پیکسل، فاىلˇ واويراز: $3، نوع MIME فاىل: $4",
        "show-big-image": "أصلˇ فاىل",
        "show-big-image-preview": "اي پيشأدئنˇ واويراز: $1.",
        "exif-orientation": "سۊ",
        "exif-model": "دۊربينˇ مؤدل",
        "exif-software": "کارىته-بۊبؤ نرمبزار",
+       "exif-exifversion": "ائگزيفˇ نۊسخه",
        "exif-colorspace": "رنگي فضا",
        "exif-iimcategory": "جرگه",
        "exif-orientation-1": "عادي",
        "namespacesall": "همه",
        "monthsall": "همه",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|گب]])",
        "specialpages": "خاصˇ ولگؤن",
        "specialpages-group-login": "ديرين/ثبتˇ نؤم",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|تگ|تگؤن}}]]: $2)",
+       "logentry-move-move": "$1 $3ˇ ولگه به $4 {{GENDER:$2|مۊنتقل بؤده}}",
        "logentry-newusers-create": "کارگيري حساب $1 {{GENDER:$2|چاگۊده-بۊبؤ}}",
+       "logentry-upload-upload": "$1 $3 {{GENDER:$2|جؤرأکشئه}}",
        "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 b9e8b50..3bf56e7 100644 (file)
        "rcshowhideliu": "$1 puruhára ohejáva teraguapy",
        "rcshowhideanons": "$1 puruhára ojekuaa'ỹva",
        "rcshowhidemine": "$1 che jehaijey",
-       "rclinks": "Ápe ojehechakuaa umi $1 oñemoambue pyahúva $2 ára ohasava'ekuépe.<br />$3",
+       "rclinks": "Ápe ojehechakuaa umi $1 oñemoambue pyahúva $2 ára ohasava'ekuépe.",
        "hide": "toñemi",
        "show": "hechauka",
        "newsectionsummary": "Pyahuvore: /* $1 */",
index a12ef51..eb67204 100644 (file)
        "password-change-forbidden": "ह्या विकीचेर गुपीत उतरां बदलूंक शकनात",
        "login": "सत्रारंभ करात",
        "nav-login-createaccount": "सत्रारंब/खातें उगडात",
-       "userlogin": "सत्रारंभ करात/खातें उगडात",
-       "userloginnocreate": "लॉग इन",
        "logout": "सत्र शेवट",
        "userlogout": "सत्र शेवट",
        "notloggedin": "लॉग इन ना",
        "userlogin-noaccount": "तुमचें खातें ना?",
        "userlogin-joinproject": "{{SITENAME}} हाचो वांगडी ज़ा",
-       "nologin": "तुमचें खातें ना? $1.",
-       "nologinlink": "खातें तयार करात",
        "createaccount": "खातें रोच",
-       "gotaccount": " आदीं सावन तुजें खातें आसा?$1.",
-       "gotaccountlink": "लॉग इन",
-       "userlogin-resetlink": "तुजो लॉग इन तपशील विसरलें?",
        "userlogin-resetpassword-link": "गुपितउतर विसरला?",
        "userlogin-helplink2": "सत्रारंभ करपाक आदार कर",
        "userlogin-createanother": "दुसरें खातें तयार कर",
        "createacct-email-ph": "तुमचो इमेल पत्तो घालात",
        "createacct-another-email-ph": "तुमचो इमेल पत्तो घालात",
        "createacct-realname": "खरें नांव (पर्यायी)",
-       "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "तूं दुसरें खातें कित्याक उगडटात",
        "createacct-submit": "तुमचे खातें रोचात",
        "rcshowhidemine": "$1 म्हजें संपादन आंकडे",
        "rcshowhidemine-show": "दाखयात",
        "rcshowhidemine-hide": "लिपयात",
-       "rclinks": "फाटल्या $2 दिसांनी जाल्लो $1 बदल दाखयात<br />$3",
+       "rclinks": "फाटल्या $2 दिसांनी जाल्लो $1 बदल दाखयात",
        "diff": "फरक",
        "hist": "इति",
        "hide": "लिपयात",
index 9283234..3ce34b0 100644 (file)
        "password-change-forbidden": "Tujean hea wikicher gupitutor bodlunk zaina.",
        "login": "Sotroromb kor",
        "nav-login-createaccount": "Sotrrombh kor / khatem roch",
-       "userlogin": "Sotrrombh kor / khatem roch",
-       "userloginnocreate": "Sotrorombh",
        "logout": "Bhair podd",
        "userlogout": "Sotracho xevott",
        "notloggedin": "Sotrorombh korunk nai",
        "userlogin-noaccount": "Tuje kode khatem na?",
        "userlogin-joinproject": "{{SITENAME}}-hacho vangdi za",
-       "nologin": "Tuje kodde khatem na? $1.",
-       "nologinlink": "Novem khatem ughodd",
        "createaccount": "Khatem roch",
-       "gotaccount": "Tuje kodem khatem asa? $1.",
-       "gotaccountlink": "Sotrorombh kor",
-       "userlogin-resetlink": "Sotrorombh korpacheo bariksai visorlai?",
        "userlogin-resetpassword-link": "Gupitutor visorlo?",
        "userlogin-helplink2": "Sotrorombh korunk adar",
        "userlogin-createanother": "Dusrem khatem roch",
        "createacct-email-ph": "Tuzo email potto boroi",
        "createacct-another-email-ph": "Email potto boroi",
        "createacct-realname": "Khorem nanv (Soktichem nhoi)",
-       "createaccountreason": "Karonn:",
        "createacct-reason": "Karonn",
        "createacct-reason-ph": "Tum dusrem khatem kiteak rochtai",
        "createacct-submit": "Tujem khatem roch",
        "rcshowhidemine": "Mhojeo bodlopam $1",
        "rcshowhidemine-show": "Dakhoi",
        "rcshowhidemine-hide": "Lipoi",
-       "rclinks": "Xevtiche $2 disanim zal'le $1 bodlopam dakhoi<br />$3",
+       "rclinks": "Xevtiche $2 disanim zal'le $1 bodlopam dakhoi",
        "diff": "frk",
        "hist": "iti",
        "hide": "Lipoi",
index 7983c95..65a720d 100644 (file)
                        "Amire80"
                ]
        },
-       "tog-underline": "Garisiyi totibawa pranala",
-       "tog-hideminor": "Wanto'a u iluba ngo'idi to'u bohu",
-       "tog-hidepatrolled": "Wanto'a u iluba patroli to'u bohu",
-       "tog-newpageshidepatrolled": "Wanto'a halaamani patroli lonto daputari halaamani bohu",
-       "tog-hidecategorization": "Wanto'a tayadu halaamani",
-       "tog-extendwatchlist": "Duhengi daputari he'awasiyalo u mopobilohu nga'amila ulo ubawa, dila bo ubohu",
-       "tog-usenewrc": "Popotayade u iluba to bibilohu lu'ubawa baharu wawu daputari he awasiyalo berdasarkan halaamani",
+       "tog-underline": "Garisiyi totibawa wumbuta",
+       "tog-hideminor": "Wanto'a u biloli'a ngo'idi to'u lobohuwa",
+       "tog-hidepatrolled": "Wanto'a u biloli'a lo patroli to'u lobohuwa",
+       "tog-newpageshidepatrolled": "Wanto'a halaman patroli lonto daputari halaman bohu",
+       "tog-hidecategorization": "Wanto'a tayadu halaman",
+       "tog-extendwatchlist": "Bu'ade daputari he'awasiyalo mopobilohu nga'amila u loboli'a, diila bo ubohu",
+       "tog-usenewrc": "Tayade u biloli'o to bibilohu halaman lobohuwa wawu daputari he awasiyalo",
        "tog-numberheadings": "Otomatis modulade nomoro",
-       "tog-showtoolbar": "Mopobilohe pilakasi ponguba",
-       "tog-editondblclick": "Monguba halaamani mo klik po'oluwo",
-       "tog-editsectiononrightclick": "Popohunawa monguba tayadu wolo mengeklik olowala to judul lo tayadu",
-       "tog-watchcreations": "Duhengi halamani u pilohutu'u wawu berkas u diletohu'u ode daputari he awasiya'u",
-       "tog-watchdefault": "Duhengi halamani wawu berkas u iluba'u ode daputari he awasiya'u",
-       "tog-watchmoves": "Duhengi halamani wawu berkas u pilinda'u ode daputari he awasiya'u",
-       "tog-watchdeletion": "Duhengi halamani wawu berkas u yilulutu'u ode daputari he awasiya'u",
+       "tog-showtoolbar": "Popobilohe pilakasi pomoli'o",
+       "tog-editondblclick": "Boli'a halaman lo klik po'oluwo",
+       "tog-editsectiononrightclick": "Popohunawa momoli'a tayadu wolo mengeklik olowala to judul lo tayadu",
+       "tog-watchcreations": "Duhengi halaman pilohutu'u wawu berkas diletohu ode daputari he awasiyalo",
+       "tog-watchdefault": "Duhengi halaman wawu berkas biloli'o ode daputari he awasiya'u",
+       "tog-watchmoves": "Duhengi halaman wawu berkas hileyi'u ode daputari he awasiya'u",
+       "tog-watchdeletion": "Duhengi halaman wawu berkas yilulutu'u ode daputari he awasiya'u",
        "tog-watchuploads": "Duhengi berkas bohu u diletohu'u to daputari he'awasiyalo",
        "tog-watchrollback": "Duhengi halamani u pilohuwalingu'u ode daputari he awasiya'u",
        "tog-minordefault": "Tandai nga'amila odelo iluba keke'ingo secara baku",
        "october": "Oktober",
        "november": "Nopember",
        "december": "Desember",
-       "january-gen": "Januwari",
-       "february-gen": "Peburuwari",
+       "january-gen": "Januari",
+       "february-gen": "Pebruari",
        "march-gen": "Maret",
        "april-gen": "April",
-       "may-gen": "Meyi",
+       "may-gen": "Mei",
        "june-gen": "Juni",
        "july-gen": "Juli",
        "august-gen": "Agustus",
        "oct": "Okt",
        "nov": "Nop",
        "dec": "Des",
-       "january-date": "$1 Yanuari",
+       "january-date": "$1 Januari",
        "february-date": "$1 Pebruari",
        "march-date": "$1 Maret",
        "april-date": "$1 April",
        "category-media-header": "Media to delomo kategori \"$1\"",
        "category-empty": "<em>Kategori botiye ja o halaman meyalo media.<em>",
        "hidden-categories": "{{PLURAL:$1|Tayadu wanto-wanto'o}}",
-       "hidden-category-category": "Kategori wanto-wanto'o",
+       "hidden-category-category": "Kategori wanto-wanto'o",
        "category-subcat-count": "{{PLURAL:$2|Kategori boti woluwo subkategori|Kategori boti woluwo {{PLURAL:$1|subkategori|$1 subkategori}} lonto nga'amila $2.}}",
        "category-subcat-count-limited": "Kategori boti woluwo {{PLURAL:$1|subkategori|$1 subkategori}}",
        "category-article-count": "{{PLURAL:$2|Kategori botiye o tuwango halaman.|Woluwo {{PLURAL:$|$1 halaman}} to delomo kategori, lonto $2 nga'amila.}}",
        "morenotlisted": "Daputari boti kira-kira diipo ganapu",
        "mypage": "Halaamani",
        "mytalk": "Lo'iya",
-       "anontalk": "Bisala",
+       "anontalk": "Lo'iya",
        "navigation": "Navigasi",
        "and": "&#32;wawu",
        "qbfind": "Lolohe",
        "qbbrowse": "Momilohu",
-       "qbedit": "Monguba",
+       "qbedit": "Boli'a",
        "qbpageoptions": "Halaman botiya",
        "qbmyoptions": "Halamani'u",
        "faq": "FAQ",
        "history": "Riwayati lo halaman",
        "history_short": "Riwayati",
        "history_small": "riwayati",
-       "updatedmarker": "iluba to'u nila'o'u pulitiyo",
+       "updatedmarker": "biloli'o to'u bililohe pulitiyo",
        "printableversion": "Persi cetak",
        "permalink": "Wumbuta kakali",
        "print": "Cetaki",
        "redirectedfrom": "Pilobale lonto $1",
        "redirectpagesub": "Halaman pilobaleyalo",
        "redirectto": "Mobale ode",
-       "lastmodifiedat": "Halaman botiye biloli'o pulitiyo $1, $2.",
+       "lastmodifiedat": "Halaman botiye biloli'a pulitiyo $1,to $2.",
        "viewcount": "Halaman botiye ma hilu'o {{PLURAL:$1|$1 kali}}.<br />",
        "protectedpage": "Halaman udaha-daha",
        "jumpto": "Lumanti'a ode:",
        "nstab-image": "Berkas",
        "nstab-mediawiki": "Tahuli",
        "nstab-template": "Templat",
-       "nstab-help": "Halaman tulungi",
+       "nstab-help": "Halaman wubodu",
        "nstab-category": "Kategori",
-       "mainpage-nstab": "Halaman Bungaliyo",
+       "mainpage-nstab": "Halaman bungaliyo",
        "nosuchaction": "Diya'a huhutu boyito",
        "nosuchactiontext": "Huhutu u hepohile lo URL ja valid.\nYi'o lotalawa lopomaso lo URL, meyalo lodudu'a pranala u ja banari.\nUtiye olo kira-kira tuwotiyo woluwo bug to pilaakasi u hepomake {{SITENAME}}",
        "nosuchspecialpage": "Diya'a halaman istimewa boyito",
        "login": "Tumuwoto log",
        "login-security": "Po'opatata tita yi'o",
        "nav-login-createaccount": "Tumuwoto log / mohutu akun",
-       "userlogin": "Tumuwoto log / mohutu akun",
-       "userloginnocreate": "Tumuwoto log",
        "logout": "Lumuwalo log",
        "userlogout": "Lumuwalo log",
        "notloggedin": "Diipo tilumuwoto log",
        "userlogin-noaccount": "Diipo o akun",
        "userlogin-joinproject": "Motiwayito {{SITENAME}}",
-       "nologin": "Diipo o akun? $1",
-       "nologinlink": "Mohutu akun bohu",
        "createaccount": "Mohutu akun",
-       "gotaccount": "Ma yilohutu akun? $1",
-       "gotaccountlink": "Tumuwoto log",
-       "userlogin-resetlink": "Ilolipata detail habari tumuwotumu?",
        "userlogin-resetpassword-link": "Ilolipata tahe u'unti?",
        "userlogin-helplink2": "Wubodu tumuwoto log",
        "userlogin-loggedin": "Yi'o ma tilumuwoto odelo {{GENDER:$1|$1}}\nPopohunawa formulir formulir to tibawa botiye odelo pengguna uweewo.",
        "createacct-another-email-ph": "Tuwanga alamat tuladu email",
        "createaccountmail": "Popohunawa tahu u'unti ja kakali wawu lawola ode tuladu elektronik u pilohile",
        "createacct-realname": "Tanggula banari (tulawoto)",
-       "createaccountreason": "Alaasani",
        "createacct-reason": "Alaasani",
        "createacct-reason-ph": "Longola Y'io mohutu akun uweewo.",
        "createacct-reason-help": "Tahuli u pilopobilohu to delomo log mohutu akun",
        "enhancedrc-history": "riwayati",
        "recentchanges": "Boheli loboli'a mola",
        "recentchanges-legend": "Tulawotolo boheli loboli'a mola",
-       "recentchanges-summary": "Mololohe u yilo'ubawa bohu to halaman wiki botiye.",
+       "recentchanges-summary": "Lolohe u boheli loboli'a mola to wiki halaman botiye.",
        "recentchanges-label-newpage": "Momoli'a utiye mohutu halaman bohu",
        "recentchanges-label-minor": "Utiye biloli'o ngo'idi",
        "recentchanges-label-bot": "Lomoli'a utiye kilaraja lo bot",
        "rcshowhidemine": "$1 biloli'u'u",
        "rcshowhidemine-show": "Popobilohe",
        "rcshowhidemine-hide": "Wanto'a",
-       "rclinks": "Popobilohe $1 u yilo'boli'a pulitiyo to delomo $2 dulahu pulitiyo<br />$3",
+       "rclinks": "Popobilohe $1 u yilo'boli'a pulitiyo to delomo $2 dulahu pulitiyo",
        "diff": "ngopohiya",
        "hist": "riwayati",
        "hide": "Wanto'a",
index 6220a07..fd90bda 100644 (file)
                        "Gothicspeaker"
                ]
        },
+       "tog-previewontop": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽 𐍆𐌰𐌿𐍂𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌰𐍂𐌺𐌰",
        "tog-previewonfirst": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽 𐌰𐍄 𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽",
+       "tog-enotifusertalkpages": "𐍃𐌰𐌽𐌳𐌴𐌹 𐌼𐌹𐌺 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌾𐌰𐌱𐌰𐌹 𐌼𐌴𐌹𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌹𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌳𐌰",
+       "tog-shownumberswatching": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍂𐌰𐌸𐌾𐍉𐌽 𐍅𐌹𐍄𐌰𐌽𐌳𐌰𐌹𐌶𐌴 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌴",
+       "tog-oldsig": "𐌸𐌴𐌹𐌽𐌰 𐍅𐌹𐍃𐌰𐌽𐌳𐌴𐌹 𐌿𐍆𐌼𐌴𐌻𐌴𐌹𐌽𐍃",
        "underline-always": "𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉",
        "underline-never": "𐌽𐌹 𐌰𐌹𐍅",
        "sunday": "𐌰𐍆𐌰𐍂𐍃𐌰𐌱𐌱𐌰𐍄𐍉",
        "badtitle": "𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐍄𐌰 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹",
        "badtitletext": "𐍆𐍂𐌰𐌹𐌷𐌰𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐍅𐌰𐍃 𐌿𐌽𐌲𐌰𐌼𐌰𐌲𐌰𐌽𐌳𐍃, 𐌻𐌰𐌿𐍃, 𐌰𐌹𐌸𐌸𐌰𐌿 𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐌱𐌰 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍃 𐌼𐌹𐌸𐍂𐌰𐌶𐌳𐌰 𐌸𐌰𐌿 𐌼𐌹𐌸-𐍅𐌹𐌺𐌹 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹. 𐌼𐌰𐌲𐌹 𐌷𐌰𐌱𐌰𐌽 𐌰𐌹𐌽𐌰 𐌸𐌰𐌿 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐍉𐍃 𐌱𐍉𐌺𐍉𐍃 𐌱𐍂𐌿𐌺𐌹𐌳𐍉𐍃 𐌹𐌽 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌾𐌰𐌼.",
        "viewsource": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
+       "protectedpagetext": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳, 𐌴𐌹 𐌽𐌹 𐍅𐌰𐌹𐍂𐌸𐌴𐌹𐌽𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌸𐌰𐌿 𐌰𐌽𐌸𐌰𐍂𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
        "mycustomjsprotected": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 JavaScript 𐌻𐌰𐌿𐍆.",
        "yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉:",
        "userlogin-yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉",
        "cannotloginnow-title": "𐌽𐌿 𐌽𐌹 𐌼𐌰𐌲𐍄 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽",
        "login": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "nav-login-createaccount": "𐌰𐍄𐌲𐌰𐌲𐌲 / 𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
-       "userlogin": "𐌰𐍄𐌲𐌰𐌲𐌲 / 𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
-       "userloginnocreate": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "logout": "𐌰𐍆𐌻𐌴𐌹𐌸",
        "userlogout": "𐌰𐍆𐌻𐌴𐌹𐌸",
        "userlogin-noaccount": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽?",
        "userlogin-joinproject": "𐌲𐌰𐌳𐌰𐌹𐌻𐌴𐌹 𐌹𐌽 𐌽𐌰𐍄𐌾𐌰𐍃𐍄𐌰𐌳𐌰 {{SITENAME}}",
-       "nologinlink": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
        "createaccount": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
-       "gotaccount": "𐌾𐌿 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽 𐌷𐌰𐌱𐌰𐌹𐍃? $1.",
-       "gotaccountlink": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "userlogin-resetpassword-link": "𐌿𐍆𐌰𐍂𐌼𐌿𐌽𐌽𐍉𐌳𐌴𐍃 𐌸𐌴𐌹𐌽𐌰𐌼𐌼𐌰 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳𐌰?",
        "userlogin-helplink2": "𐌷𐌹𐌻𐍀𐌰 𐌼𐌹𐌸 𐌰𐍄𐌲𐌰𐌲𐌲𐌰",
        "createacct-emailoptional": "𐌴-𐌱𐍉𐌺𐍉𐍃 (𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍉𐍃)",
        "createacct-email-ph": "𐌼𐌴𐌻𐌴𐌹 𐌸𐌴𐌹𐌽𐍉𐍃 𐌴-𐌱𐍉𐌺𐍉𐍃",
-       "createaccountreason": "𐌲𐍂𐌿𐌽𐌳𐌿𐍃:",
        "createacct-reason": "𐌲𐍂𐌿𐌽𐌳𐌿𐍃",
        "createacct-submit": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌸𐌴𐌹𐌽𐌰 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
        "createacct-benefit-heading": "{{SITENAME}} 𐍄𐌰𐍅𐌹𐌸 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 𐌼𐌰𐌽𐌽𐌰𐌼 𐍃𐍅𐌴 𐌸𐌿𐌺.",
        "minoredit": "𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌼𐌹𐌽𐌽𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
        "watchthis": "𐌰𐍄𐍅𐌹𐍄 𐌻𐌰𐌿𐌱𐌰",
        "savearticle": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌻𐌰𐌿𐍆",
+       "publishpage": "𐌼𐌴𐍂𐌴𐌹 𐌻𐌰𐌿𐍆",
        "preview": "𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐍃",
        "showpreview": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽",
        "showdiff": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃",
        "rcshowhidemine": "$1 𐌼𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
        "rcshowhidemine-show": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
        "rcshowhidemine-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
-       "rclinks": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 $1 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃 𐌹𐌽 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌹𐌼 $2 𐌳𐌰𐌲𐌰𐌼 <br />$3",
+       "rclinks": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 $1 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃 𐌹𐌽 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌹𐌼 $2 𐌳𐌰𐌲𐌰𐌼",
        "diff": "𐌼𐌹𐍃𐍃",
        "hist": "𐍃𐍀𐌹𐌻𐌻",
        "hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
index 99c0a74..91768b1 100644 (file)
@@ -18,7 +18,8 @@
                        "JoostBotman",
                        "Macofe",
                        "Giorgos456",
-                       "Gts-tg"
+                       "Gts-tg",
+                       "RubatoStuf"
                ]
        },
        "tog-underline": "Ὑπογραμμίζειν συνδέσμους:",
        "searcharticle": "Ἰέναι",
        "history": "Αἱ τῆς δέλτου πρότεραι",
        "history_short": "Αἱ πρότεραι",
+       "history_small": "Αἱ πρότεραι",
        "updatedmarker": "αἱ δέλτου ἐνημερώσεις ἀφ’ ὅτε ἐπεσκέφθην αὐτὴν ὑστάτως",
        "printableversion": "Ἐκτυπώσιμος μορφή",
        "permalink": "Σύνδεσμος μόνιμος",
        "create-this-page": "Ποιεῖν τήνδε τὴν δέλτον",
        "delete": "Σβεννύναι",
        "deletethispage": "Διαγράφειν τήνδε τὴν δέλτον",
+       "undeletethispage": "ἐκδιαγράφειν τήνδε τὴν δέλτον",
        "undelete_short": "Ἐπανορθοῦν {{PLURAL:$1|ἕνα μεταγραφὲν|$1 μεταγραφέντα}}",
        "protect": "Φυλάττειν",
        "protect_change": "ἀλλάττειν",
        "talk": "Διάλεξις",
        "views": "Προβολαί",
        "toolbox": "Ἔργαλεῖα",
+       "tool-link-userrights-readonly": "Ὁρᾶν τὰ ὁμάδας {{GENDER:$1|αὐτοῦ|αὐτῆς}}",
        "userpage": "Ὁρᾶν δέλτον χρωμένου",
        "projectpage": "Ἴδε δέλτον ἐγχειρήματος",
        "imagepage": "Ὁρᾶν τῆν δέλτον τοῦ ἀρχείου",
        "externaldberror": "Συνέβη εἴτε σφάλμα τι πιστοποιήσεως τῆς βάσεως δεδομένων εἴτε οὐκ ἔξεστί σοι ἐνημεροῦν τὸν ἐξωτερικὸν λογισμόν σου.",
        "login": "Συνδεῖσθαι",
        "nav-login-createaccount": "Συνδεῖσθαι/λογισμὸν ποιεῖν",
-       "userlogin": "Συνδεῖσθαι/λογισμὸν ποιεῖν",
-       "userloginnocreate": "Συνδεῖσθαι",
        "logout": "Ἐξέρχεσθαι",
        "userlogout": "Ἐξέρχεσθαι",
        "notloggedin": "Οὐ συνδεδεμένος",
        "userlogin-noaccount": "Ἆρα λογισμὸν οὐκ ἔχεις;",
        "userlogin-joinproject": "Μετέχειν {{SITENAME}}",
-       "nologin": "Ἆρα λογισμὸν οὐκ ἔχεις; '''$1'''.",
-       "nologinlink": "Λογισμὸν ποιεῖν",
        "createaccount": "Λογισμὸν ποιεῖν",
-       "gotaccount": "Ἆρα λογισμὸν ἤδη τινὰ ἔχεις; '''$1'''.",
-       "gotaccountlink": "Συνδεῖσθαι",
        "userlogin-resetpassword-link": "Λανθάνεσαι σήμα σοι;",
        "userlogin-helplink2": "Βοήθεια δια σύνδεσιν",
        "createacct-emailoptional": "Ἠλεκτρονική ἀλληλογραφίαν (προαιρετικόν)",
        "createacct-email-ph": "Παρέχειν διεύθυνσην ἤλεκτρονικής ἀλληλογραφίας σου",
        "createaccountmail": "ἠλεκτρονικῇ ἐπιστολῇ",
-       "createaccountreason": "Αἰτία",
        "createacct-submit": "Λογισμὸν ποιεῖν",
        "createacct-benefit-heading": "{{SITENAME}} ποιούται ὐπό ἀνθρώπων ἐσού ώς.",
        "createacct-benefit-body1": "{{PLURAL:$1|μεταγραφή|μεταγραφαί}}",
        "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-protect": "Ἀλλάττειν κλίμακα προστασίας καὶ μεταγράφειν τὰς φυλαττομένας δέλτους",
        "right-editprotected": "Μεταγράφειν φυλαττομένας δέλτους (ἄνευ διαδοχικῆς προστασίας)",
        "right-editinterface": "Μεταγράφειν τὸ τοῦ χρωμένου περιβάλλον ἀλληλεπιδράσεως",
-       "right-editusercssjs": "Μεταγράφειν ἑτέρων χρωμένων CSS- καὶ JS-ἀρχεῖα",
        "right-editusercss": "Μεταγράφειν ἑτέρων χρωμένων CSS-ἀρχεῖα",
        "right-edituserjs": "Μεταγράφειν ἑτέρων χρωμένων JS-ἀρχεῖα",
        "right-markbotedits": "Σήμανσις μεταγραφῶν οἵπερ ἐπαναφέρθησαν ὡς μεταγραφῶν ὑπ' αὐτομάτων",
        "rcshowhideanons-show": "Δεικνύναι",
        "rcshowhideanons-hide": "Κρύπτειν",
        "rcshowhidepatr": "$1 τὰς περιπολουμένας μεταγραφάς",
+       "rcshowhidepatr-hide": "Κρύπτειν",
        "rcshowhidemine": "$1 μεταγραφαί ἐμού",
        "rcshowhidemine-show": "Δεικνύναι",
        "rcshowhidemine-hide": "Κρύπτειν",
-       "rclinks": "Ἐμφάνισις τῶν τελευταίων $1 ἀλλαγῶν τῷ χρονικῷ διαστήματι τῶν τελευταίων $2 ἡμερῶν <br />$3",
+       "rcshowhidecategorization-hide": "Κρύπτειν",
+       "rclinks": "Ἐμφάνισις τῶν τελευταίων $1 ἀλλαγῶν τῷ χρονικῷ διαστήματι τῶν τελευταίων $2 ἡμερῶν",
        "diff": "διαφ.",
        "hist": "Ἰστ.",
        "hide": "Κρύπτειν",
        "undeleteviewlink": "ὁρᾶν",
        "undeleteinvert": "Ἀναστρέφειν τὴν ἐπιλογήν",
        "undeletecomment": "Αἰτία:",
-       "undeletedrevisions": "{{PLURAL:$1|1 ἀναθεωρήσις|$1 ἀναθεωρήσεις}} ἀποκατεστάθησαν",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 ἀναθεωρήσις|$1 ἀναθεωρήσεις}} καὶ {{PLURAL:$2|1 ἀρχεῖον|$2 ἀρχεῖα}} ἀποκατεστάθησαν",
-       "undeletedfiles": "{{PLURAL:$1|1 ἀρχεῖον|$1 ἀρχεῖα}} ἀποκατεστάθησαν",
        "cannotundelete": "Ἡ ἐκδιαγραφὴ ἀπετεύχθη·\nἕτερός τις ἐνδέχεται πρῶτος ἐκδιαγεγραφέναι τὴν δέλτον.",
        "undelete-search-box": "Ζητεῖν διαγεγραμμένας δέλτους",
        "undelete-search-prefix": "Δεικνύναι δέλτους· ἐκκινεῖν ἐκ:",
        "logentry-newusers-create": "Ὀ λογισμός χρώμενου $1 {{GENDER:$2|created}} ἐποιεῖθηκε",
        "logentry-upload-upload": "$1 {{GENDER:$2|μεταφόρτωσε}} $3",
        "rightsnone": "(Οὐδέν)",
-       "revdelete-summary": "σύνοψις μεταγραφῶν",
        "feedback-cancel": "Ἀκυροῦν",
        "searchsuggest-search": "Ζητεῖν",
        "searchsuggest-containing": "περιέχον...",
index edb1b85..c5ee148 100644 (file)
@@ -46,7 +46,7 @@
        "tog-previewontop": "Vorschou oberhalb vom Editierfänschter aazeige",
        "tog-previewonfirst": "Vorschou scho bim ersten Editieren azeige",
        "tog-enotifwatchlistpages": "Schick mer e Mail, wänn e Syte oder e Datei gänderet wird, wun i beobachte due",
-       "tog-enotifusertalkpages": "Schick mer es Mail, we öpper myni Benutzerdiskussionssyte het gänderet",
+       "tog-enotifusertalkpages": "Schick mer es Mail, we öpper myni Benutzerdiskussionssyte het gänderet",
        "tog-enotifminoredits": "Au bi chlaine Änderige an Syte oder Dateie ne Mail schicke",
        "tog-enotifrevealaddr": "Dyni E-Mail-Adrässe wird i Benachrichtigungsmails zeigt",
        "tog-shownumberswatching": "Aazahl Benutzer aazeige, wo ne Syten am Aaluege sy (i den Artikelsyte, i de «letschten Änderigen» und i der Beobachtigslischte)",
@@ -58,6 +58,7 @@
        "tog-watchlisthidebots": "Bot-Änderige in d Beobachtigslischt usblende",
        "tog-watchlisthideminor": "Chlyni Änderige nit in de Beobachtigslischte aazeige",
        "tog-watchlisthideliu": "Bearbeitige vu aagmäldete Benutzer usblände",
+       "tog-watchlistreloadautomatically": "Wänn e Filter gänderet woren isch, d Beobachtigslischt automatisch nei lade (brucht JavaScript)",
        "tog-watchlisthideanons": "Bearbeitige vu anonyme Benutzer (IP-Adresse) usblände",
        "tog-watchlisthidepatrolled": "vum Fäldhieter aagluegti Änderige in dr Beobachtigslischt usblände",
        "tog-watchlisthidecategorization": "Kategorisierig vo de Syte nid zeige",
        "tagline": "Us {{SITENAME}}",
        "help": "Hilf",
        "search": "Suech",
+       "search-ignored-headings": " #<!-- die Zylede nit ändere --> <pre>\n# Iberschrifte, wu vu dr Suechi ignoriert wäre.\n# Die Änderige wäre wirksam, sobald d Syte mit dr Iberschrift indexiert woren isch.\n# Du chasch d Sytenindexierig zwinge, indäm e Nulledit machsch.\n# Syntax:\n#   * Alles, was bis zum Zyledenänd noch ere Rute („#“) chunnt, isch e Kommentar.\n#   * E jedi nit-lääri Zylede isch dr Titel, wu exakt mueß ignoriert wäre.\nFueßnote\nWeblink\nLueg au\n #</pre> <!-- die Zylede nit ändere -->",
        "searchbutton": "Suech",
        "go": "Site",
        "searcharticle": "Sueche",
        "history": "Versione",
        "history_short": "Versione/Autore",
+       "history_small": "Versionsgschicht",
        "updatedmarker": "(gändret syt mym letschte Bsuech)",
        "printableversion": "Druck-Aasicht",
        "permalink": "Bschtändigi URL",
        "databaseerror-query": "Abfrog: $1",
        "databaseerror-function": "Funktion: $1",
        "databaseerror-error": "Fähler: $1",
+       "transaction-duration-limit-exceeded": "Go ne großi Verzegerig in dr Datereplikation z vermyyde, isch die Transaktion abbroche wore. D Schrybduur ($1) het d Gränze vu $2 Sekunden iberschritte. Wänn du vyl Objäkt uf s Mol ändere duesch, versuech statt däm, d Änderige uf mehreri Operationen ufzdeile.",
        "laggedslavemode": "Warnig: di letschte Änderige wäre u. U. nonig aazeigt!",
        "readonly": "Datebank isch gsperrt",
        "enterlockreason": "Bitte gib e Grund y, worum d Datebank soll gsperrt wäre un e Yschätzig wie lang si soll gsperrt blybe",
-       "readonlytext": "D {{SITENAME}}-Datebank isch e Zyd lang gsperrt fir Nejytreg un Änderige. Bitte versuech s speter no mol.\n\nGrund vu dr Sperrig: $1",
+       "readonlytext": "D Datebank isch e Zyt lang gsperrt fir Nejyytreg un Änderige. Bitte versuech s speter no mol.\n\nGrund vu dr Sperrig: $1",
        "missing-article": "Dr Täkscht fir „$1“ $2 isch nit in dr Datebank gfunde wore.\n\nDie Syte isch villicht glescht oder verschobe wore.\n\nWänn s des nit isch, hesch villicht e Fähler in dr Software gfunde. Bitte mäld des eme [[Special:ListUsers/sysop|Ammann]] un gib d URL derzue aa.",
        "missingarticle-rev": "(Versionsnummere: $1)",
        "missingarticle-diff": "(Unterschid zwische Versione: $1, $2)",
        "readonly_lag": "D Datebank isch automatisch gperrt wore, wil di verteilte Datebankserver (Sklave) mien mit em Hauptdatebankserver (Meischter) abgliche wäre.",
+       "nonwrite-api-promise-error": "Dr HTTP-Header „Promise-Non-Write-API-Action“ isch gsändet wore, aber d Aafrog isch an e API-Schrybmodul gange.",
        "internalerror": "Interner Fähler",
        "internalerror_info": "Interne Fähler: $1",
        "internalerror-fatal-exception": "Fatale Uusnahmefähler vum Typ „$1“",
        "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.",
+       "cannotcreateaccount-text": "S diräkt Aalege vu Benutzerkonten isch uf däm Wiki nit aktiviert.",
        "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",
        "logout": "Abmälde",
        "userlogout": "Abmälde",
        "notloggedin": "Nit aagmäldet",
        "userlogin-noaccount": "No kei Benutzerkonto?",
        "userlogin-joinproject": "Bi {{SITENAME}} aamälde",
-       "nologin": "No kei Benutzerkonto? $1.",
-       "nologinlink": "»Konto aaleege«",
        "createaccount": "Nöis Benutzerkonto aalege",
-       "gotaccount": "Du häsch scho a Konto? '''$1'''",
-       "gotaccountlink": "»Login fir Benutzer, wu scho aagmäldet sin«",
-       "userlogin-resetlink": "Hesch Dyy Aamäldedate vergässe?",
        "userlogin-resetpassword-link": "Passwort vergässe?",
        "userlogin-helplink2": "Hilf bim Aamälde",
        "userlogin-loggedin": "Du bisch scho as {{GENDER:$1|$1}} aagmäldet.\nBruuch s Formular unte go Di unter eme andere Benutzername aamälde.",
+       "userlogin-reauth": "Du muesch di nomol aamälde go z verifiziere, ass du {{GENDER:$1|$1}} bisch.",
        "userlogin-createanother": "En ander Benutzerkonto aalege",
        "createacct-emailrequired": "E-Mail-Adräss",
        "createacct-emailoptional": "E-Mail-Adräss (optional)",
        "createacct-email-ph": "Gib Dyy E-Mail-Adräss yy",
        "createacct-another-email-ph": "Gib Dyy E-Mail-Adräss yy",
        "createaccountmail": "E temporär Zuefallspasswort bruuchen un an di aagee E-Mail-Adräss schicke",
+       "createaccountmail-help": "Cha brucht wäre zum e Benutzerkonto fir e anderi Person aazlege, ohni ass mer s Passwort mueß wisse.",
        "createacct-realname": "Richtige Name (optional)",
-       "createaccountreason": "Grund:",
        "createacct-reason": "Grund",
        "createacct-reason-ph": "Wurum Du ne ander Benutzerkonto aaleisch",
+       "createacct-reason-help": "Im Neiaamäldigs-Logbuech aazeigti Nochricht",
        "createacct-submit": "Dyy Benutzerkonto aalege",
        "createacct-another-submit": "Benutzerkonto aalege",
+       "createacct-continue-submit": "Wytermache mit em Aalege vun eme Benutzerkonto",
+       "createacct-another-continue-submit": "Wytermache mit em Aalege vun eme Benutzerkonto",
        "createacct-benefit-heading": "{{SITENAME}} wird vu Mänsche wie Dir gschaffe.",
        "createacct-benefit-body1": "{{PLURAL:$1|Bearbeitig|Bearbeitige}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Syte|Syte}}",
        "nocookiesnew": "Dr Benutzerzuegang isch aaglait wore, aber Du bisch nid yygloggt. {{SITENAME}} brucht fir die Funktion Cookies, bitte tue die aktiviere un logg Di derno mit Dyynem neje Benutzername un em Passwort, wu drzue ghert, yy.",
        "nocookieslogin": "{{SITENAME}} brucht Cookies fir e Aamäldig. Du hesch d Cookies deaktiviert. Aktivier si bitte un versuech s no mol.",
        "nocookiesfornew": "S Benutzerkonto isch nit aagleit wore, wel d Datehärchumft nit het chenne uusgmacht wäre.\nS mueß sichergstellt syy, ass Cookies aktiviert sin. Derno ddie Syte nomol lade un s wider versueche.",
+       "createacct-loginerror": "S Benutzerkonto isch erfolgrych aagleit wore, aber du hesch nit chenne automatisch aagmäldet wäre. Bitte mach wyter mit dr [[Special:UserLogin|manuälle Aamäldig]].",
        "noname": "Du muesch e Benutzername aagee.",
-       "loginsuccesstitle": "Aamäldig erfolgrych",
+       "loginsuccesstitle": "Aagmäldet",
        "loginsuccess": "'''Du bisch jetz als \"$1\" bi {{SITENAME}} aagmäldet.'''",
-       "nosuchuser": "Dr Benutzername \"$1\" git s nit.\n\nIberprief d Schrybwys, oder mäld Di as [[Special:CreateAccount|neje Benutzer aa]].",
+       "nosuchuser": "Dr Benutzername „$1“ git s nit.\n\nIberprief d Schrybwys, au d Groß- un Chlaischrybig, oder mäld Di as [[Special:CreateAccount|neje Benutzer aa]].",
        "nosuchusershort": "S git kei Benutzername „$1“. Bitte iberprief d Schrybwys.",
        "nouserspecified": "Bitte gib e Benutzername yy.",
        "login-userblocked": "Dää Benutzer isch gsperrt. Aamäldig nit erlaubt.",
        "minoredit": "Numen es birebitzeli gänderet",
        "watchthis": "Dä Artikel beobachte",
        "savearticle": "Syte spychere",
+       "publishpage": "Syte spychere",
+       "publishchanges": "Änderige spychere",
        "preview": "Vorschou",
        "showpreview": "Vorschau aaluege",
        "showdiff": "Änderige zeige",
-       "blankarticle": "<strong>Warnig:</strong> D Syte, wu Du aalaisch, isch läär.\nWänn Du nomol uf „{{int:savearticle}}“ klicksch, wird d Syte ohni Inhalt aaglait.",
+       "blankarticle": "<strong>Warnig:</strong> D Syte, wu Du aalaisch, isch läär.\nWänn Du nomol uf „$1“ klicksch, wird d Syte ohni Inhalt aaglait.",
        "anoneditwarning": "<strong>Warnig:</strong> Du bisch nit aagmäldet. Dy IP-Adräss wird effetli sichtbar, wänn Du Bearbeitige machsch. Wänn di <strong>[$1 aamälde duesch]</strong> oder <strong>[$2 e Benutzerkonto aalaisch]</strong>, wäre Bearbeitige zämme mit andere Bytreg Dym Nenutzername zuegordnet.",
        "anonpreviewwarning": "''Du bisch nit aagmäldet. Bim Spychere wird Dyy IP-Adräss yydrait in d Versionsgschicht vu däre Syte.''",
        "missingsummary": "'''Obacht:''' Du hesch kei Zämefassig aagee. Wenn du nomol uf Spychere drucksch, wird d Änderung ohni gspychert.",
-       "selfredirect": "<strong>Obacht:</strong> Du bisch die Syten uf sech sälber am Wyterleite.\nVilech hesch für d Wyterleitig ds falsche Zil y’gä, oder vilech bisch di falschi Syten am bearbeite.\nWe d’ nomal «{{int:savearticle}}» kliksch, de wird d Wyterleitig einewäg agleit.",
+       "selfredirect": "<strong>Obacht:</strong> Du bisch die Syten uf sech sälber am Wyterleite.\nVilech hesch für d Wyterleitig ds falsche Zil y’gä, oder vilech bisch di falschi Syten am bearbeite.\nWe d’ nomal «$1» kliksch, de wird d Wyterleitig einewäg agleit.",
        "missingcommenttext": "Bitte gib Dyy Kommentar unte yy.",
-       "missingcommentheader": "<strong>Obacht:</strong> Du hesch kei Iberschrift für dä Kommentar yygee.\nWänn nomol uf „{{int:savearticle}}“ drucksch, wird Dyyni Bearbeitig ohni Iberschrift gspicheret.",
+       "missingcommentheader": "<strong>Obacht:</strong> Du hesch kei Iberschrift für dä Kommentar yygee.\nWänn nomol uf „$1“ drucksch, wird Dyyni Bearbeitig ohni Iberschrift gspicheret.",
        "summary-preview": "Vorschou vor Zämefassig:",
        "subject-preview": "Vorschau vum Betreff:",
        "previewerrortext": "Es het e Fähler ’gä bim Versuech, e Vorschou vo dynen Änderige z zeige.",
        "editingsection": "Bearbeite vo «$1» (Absatz)",
        "editingcomment": "Bearbeite vu $1 (Neje Abschnitt)",
        "editconflict": "Bearbeitigs-Konflikt: «$1»",
-       "explainconflict": "Öpper anders het dä Artikel gänderet, wo du ne sälber am Ändere bisch gsy.\nIm obere Tekschtfäld steit der jitzig Artikel.\nIm untere Tekschtfält stöh dyni Änderige.\nBitte überträg dyni Änderigen i ds obere Tekschtfäld.\nWe du «{{int:savearticle}}» drücksch, de wird '''nume''' der Inhalt vom obere Tekschtfäld gspycheret.",
+       "explainconflict": "Öpper anders het dä Artikel gänderet, wo du ne sälber am Ändere bisch gsy.\nIm obere Tekschtfäld steit der jitzig Artikel.\nIm untere Tekschtfält stöh dyni Änderige.\nBitte überträg dyni Änderigen i ds obere Tekschtfäld.\nWe du «$1» drücksch, de wird '''nume''' der Inhalt vom obere Tekschtfäld gspycheret.",
        "yourtext": "Dyy Täxt",
        "storedversion": "Gspychereti Version",
        "nonunicodebrowser": "'''Obacht:''' Dyy Browser cha Unicode-Zeiche nid richtig verschaffe. Bitte verwänd e andere Browser zum Syte bearbeite.",
        "prefs-tokenwatchlist": "Schlüssel für persönleche Webfeed",
        "prefs-diffs": "Versionsverglych",
        "prefs-help-prefershttps": "Die Ystellig würkt sech uus, we du di ds nächste Mal amäldisch.",
-       "prefswarning-warning": "Du hesch Ystellige gänderet wo no nid gspycheret sy.\nWe du die Syte verlasch, ohni uf «$1» z drücke, de gö die Änderige verlore.",
+       "prefswarning-warning": "Du hesch Ystellige gänderet wo no nid gspycheret sy.\nWe du die Syte verlasch, ohni uf «$1» z drücke, de gö die Änderige verlore.",
        "prefs-tabs-navigation-hint": "Tipp: Mit der linggen u der rächte Pfyltaste chasch zwüsche de Tabs wächsle.",
        "userrights": "Benutzerrächtsverwaltig",
        "userrights-lookup-user": "Verwalt d Gruppezuegherigkeit",
        "right-editsemiprotected": "Mit «{{protect-level-autoconfirmed}}» gschützti Syten ändere",
        "right-editcontentmodel": "Inhaltsmodäll vo’re Syten ändere",
        "right-editinterface": "Benutzerinterface bearbeite",
-       "right-editusercssjs": "Bearbeite vu CSS- und JS-Dateie vu andere Benutzer",
        "right-editusercss": "Bearbeite vu CSS-Dateie vu andere Benutzer",
        "right-edituserjs": "Bearbeite vu JS-Dateie vu andere Benutzer",
        "right-editmyusercss": "Dyni eigete CSS-Dateien ändere",
        "rcshowhidecategorization": "Sytekategorisierige $1",
        "rcshowhidecategorization-show": "zeige",
        "rcshowhidecategorization-hide": "nid zeige",
-       "rclinks": "Zeig di letschte $1 Änderige vo de vergangene $2 Täg.<br />$3",
+       "rclinks": "Zeig di letschte $1 Änderige vo de vergangene $2 Täg.",
        "diff": "Unterschid",
        "hist": "Versione",
        "hide": "usblände",
        "notvisiblerev": "Version isch glescht wore",
        "watchlist-details": "{{PLURAL:$1|1 Syte wird|$1 Syte wärde}} beobachtet (Diskussionssyte nid zelt, aber ou beobachtet).",
        "wlheader-enotif": "E-Mail-Benachrichtigung isch aktiviert.",
-       "wlheader-showupdated": "Syte, wo syt em letste Bsuech hei gänderet, sy <strong>fett</strong> dargstellt.",
+       "wlheader-showupdated": "Syte, wo syt em letste Bsuech hei gänderet, sy <strong>fett</strong> dargstellt.",
        "wlnote": "Unde {{PLURAL:$1|steit di letsti Änderig|stöh di letste <strong>$1</strong> Änderigen}} us {{PLURAL:$2|der letste Stund|de letste <strong>$2</strong> Stunde}}. Stand: $3, $4 Uhr.",
        "wlshowlast": "Zeig di letste $1 Stunden und $2 Täg",
        "watchlist-options": "Aazeigoptione",
        "changecontentmodel-title-label": "Sytetitel",
        "changecontentmodel-model-label": "Nöüs Inhaltsmodäll",
        "changecontentmodel-reason-label": "Grund:",
-       "changecontentmodel-success-title": "Ds Inhaltsmodäll het gänderet",
-       "changecontentmodel-success-text": "Der Inhaltstyp vo [[:$1]] het gänderet.",
+       "changecontentmodel-success-title": "Ds Inhaltsmodäll het gänderet",
+       "changecontentmodel-success-text": "Der Inhaltstyp vo [[:$1]] het gänderet.",
        "changecontentmodel-cannot-convert": "Der Inhalt vo [[:$1]] lat sech nid zum Typ $2 la konvertiere.",
        "changecontentmodel-nodirectediting": "Ds Inhaltsmodäll «$1» lat ds diräkte Bearbeite nid zue",
        "log-name-contentmodel": "Protokoll vo Inhaltsmodälländerige",
        "log-description-contentmodel": "Ereignis, wo mit em Inhaltsmodäll von ere Syte z tüe hei",
-       "logentry-contentmodel-change": "{{GENDER:$2|Der $1|D $1|$1}} het ds Inhaltsmodäll vor Syte $3 gänderet vo «$4» uf «$5»",
+       "logentry-contentmodel-change": "{{GENDER:$2|Der $1|D $1|$1}} het ds Inhaltsmodäll vor Syte $3 gänderet vo «$4» uf «$5»",
        "logentry-contentmodel-change-revertlink": "zrüggsetze",
        "logentry-contentmodel-change-revert": "zrüggsetze",
        "protectlogpage": "Syteschutz-Logbuech",
        "undeleteviewlink": "aaluege",
        "undeleteinvert": "Uswahl umchehre",
        "undeletecomment": "Grund:",
-       "undeletedrevisions": "{{PLURAL:$1|ei Revision|$1 Revisione}} wider zruckgholt.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Version|$1 Versione}} un {{PLURAL:$2|1 Datei|$2 Dateie}} sin widerhärgstellt wore",
-       "undeletedfiles": "{{PLURAL:$1|1 Datei isch|$1 Dateie sin}} widerhärgstellt wore",
        "cannotundelete": "D Widerhärstellig isch nit gange:\n\n$1",
        "undeletedpage": "'''„$1“''' isch widerhärgstellt wore.\n\nIm [[Special:Log/delete|Lesch-Logbuech]] findsch e Ibersicht vu dr gleschte un widerhärgstellte Syte.",
        "undelete-header": "Lueg im [[Special:Log/delete|Lesch-Logbuech]] no Syte, wu in dr letschte Zyt glescht wore sin.",
        "specialpages-group-changes": "D letschte Änderige un Logbüecher",
        "specialpages-group-media": "Medie",
        "specialpages-group-users": "Benutzer un Rächt",
-       "specialpages-group-highuse": "Syte wo oft bruucht werde",
+       "specialpages-group-highuse": "Syte wo hüüfig bruucht werde",
        "specialpages-group-pages": "Lischte vo Syte",
        "specialpages-group-pagetools": "Sytewerchzüüg",
        "specialpages-group-wiki": "Date un Wärchzyyg",
        "logentry-block-unblock": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} entsperrt",
        "logentry-block-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} bis $5 gsperrt $6",
        "logentry-suppress-block": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} bis $5 gsperrt $6",
-       "logentry-suppress-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het d Sperrystellige {{GENDER:$4|füre $3|für d $3|für $3}} bis $5 gänderet $6",
+       "logentry-suppress-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het d Sperrystellige {{GENDER:$4|füre $3|für d $3|für $3}} bis $5 gänderet $6",
        "logentry-import-upload": "{{GENDER:$2|Der $1|D $1|$1}} het $3 importiert per Datei-Ufelade",
        "logentry-import-interwiki": "{{GENDER:$2|Der $1|D $1|$1}} het $3 vomenen andere Wiki importiert",
        "logentry-merge-merge": "{{GENDER:$2|Der $1|D $1|$1}} het $3 i $4 zämegfüert (Versione bis $5)",
        "logentry-protect-unprotect": "{{GENDER:$2|Der $1|D $1|$1}} het der Schutz vor Syte $3 furtgnoh.",
        "logentry-protect-protect": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 gschützt $4",
        "logentry-protect-protect-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 gschützt $4 [mit Kaskade]",
-       "logentry-protect-modify": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 gänderet $4",
-       "logentry-protect-modify-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 gänderet $4 [mit Kaskade]",
+       "logentry-protect-modify": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 gänderet $4",
+       "logentry-protect-modify-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 gänderet $4 [mit Kaskade]",
        "logentry-rights-rights": "{{GENDER:$2|Der $1|D $1|$1}} het d Gruppezuegherigkeit fir $3 vu $4 uf $5 gänderet",
        "logentry-rights-rights-legacy": "{{GENDER:$2|Der $1|D $1|$1}} het d Gruppezuegherigkeit fir $3 gänderet",
        "logentry-rights-autopromote": "{{GENDER:$2|Der $1|D $1|$1}} isch automatisch vo $4 uf $5 beförderet worde",
        "logentry-tag-update-revision": "{{GENDER:$2|Der $1|D $1|$1}} het d Markierige bir Version $4 vor Syte $3 aktualisiert ({{PLURAL:$7|eini|$6}} derzueta, {{PLURAL:$9|eini|$8}} furtgnoh).",
        "logentry-tag-update-logentry": "{{GENDER:$2|Der $1|D $1|$1}} het d Markierige bim Logbuechytrag $5 vor Syte $3 aktualisiert ({{PLURAL:$7|eini|$6}} derzueta, {{PLURAL:$9|eini|$8}} furtgnoh).",
        "rightsnone": "(keini)",
-       "revdelete-summary": "Zämmefassig",
        "feedback-adding": "Ruggmäldig wird zur Syte dezuegfiegt …",
        "feedback-back": "Zrügg",
        "feedback-bugcheck": "Schen! Bitte iberprief no, eb s sich doderby nit um e scho [$1 bekannte Fähler] handlet.",
        "log-name-pagelang": "Sprachänderigs-Logbuech",
        "log-description-pagelang": "Das isch es Logbuech für Änderige vo Sytesprache.",
        "logentry-pagelang-pagelang": "{{GENDER:$2|Der $1|D $1|$1}} het d Sytesprach vo $3 vo $4 uf $5 g’änderet.",
-       "default-skin-not-found": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> – steit nid zur Verfüegig.\n\nI dyren Installation het’s schynt’s di {{PLURAL:$4|folgendi Benutzeroberflächi|folgende Benutzeroberflächine}}:\n\n$2\n\nLueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie d’se chasch {{PLURAL:$4|aktiviere|aktivieren und eini dervo chasch vorystelle}}.\n\n; Falls du MediaWiki grad installiert hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis <code>skins/</code> druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt’s derby nid zu Konflikte mit dym git repository cho.\n\n; Falls du MediaWiki grad ufe nöüst Stand hesch ’bracht:\n: MediaWiki ab 1.24 aktiviert di installierte Benutzeroberflächine nümm automatisch (lueg [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Für di {{PLURAL:$5|installierti Benutzeroberflächi|installierte Benutzeroberflächine}} z aktiviere, chasch di {{PLURAL:$5|folgendi Zyle|folgende Zyle}} i d Datei <code>LocalSettings.php</code> kopiere:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du grad d Datei <code>LocalSettings.php</code> hesch g’änderet:\n: Lueg genau nache, öb’s vilech Tippfähler het i de Näme vo de Benutzeroberflächine.",
-       "default-skin-not-found-no-skins": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> – steit nid zur Verfüegig.\n\nDu hesch kener Benutzeroberflächinen installiert.\n\n; Falls du MediaWiki grad installiert oder ufe nöüst Stand ’bracht hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. MediaWiki ab 1.24 het kener Benutzeroberflächinen im Houpt-Repository derby. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis <code>skins/</code> druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt’s derby nid zu Konflikte mit dym Git-Repository cho. Lueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie du Benutzeroberflächi chasch aktivieren und vorystelle.",
+       "default-skin-not-found": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> – steit nid zur Verfüegig.\n\nI dyren Installation het’s schynt’s di {{PLURAL:$4|folgendi Benutzeroberflächi|folgende Benutzeroberflächine}}:\n\n$2\n\nLueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie d se chasch {{PLURAL:$4|aktiviere|aktivieren und eini dervo chasch vorystelle}}.\n\n; Falls du MediaWiki grad installiert hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis <code>skins/</code> druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt s derby nid zu Konflikte mit dym git Repositorium cho.\n\n; Falls du MediaWiki grad ufe nöüst Stand hesch bbracht:\n: MediaWiki ab 1.24 aktiviert di installierte Benutzeroberflächine nümm automatisch (lueg [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Für di {{PLURAL:$5|installierti Benutzeroberflächi|installierte Benutzeroberflächine}} z aktiviere, chasch di {{PLURAL:$5|folgendi Zyle|folgende Zyle}} i d Datei <code>LocalSettings.php</code> kopiere:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du grad d Datei <code>LocalSettings.php</code> hesch gänderet:\n: Lueg genau nache, öb s vilech Tippfähler het i de Näme vo de Benutzeroberflächine.",
+       "default-skin-not-found-no-skins": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> – steit nid zur Verfüegig.\n\nDu hesch kener Benutzeroberflächinen installiert.\n\n; Falls du MediaWiki grad installiert oder ufe nöüst Stand bracht hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. MediaWiki ab 1.24 het kener Benutzeroberflächinen im Houpt-Repository derby. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis <code>skins/</code> druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt s derby nid zu Konflikte mit dym Git-Repositorium cho. Lueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie du Benutzeroberflächi chasch aktivieren und vorystelle.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiviert)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>deaktiviert</strong>)",
        "mediastatistics": "Statistike zu Dateitype",
index 30e2574..719191a 100644 (file)
        "externaldberror": "પ્રમાણભૂતતાની ત્રુટી આવી અથવા તમારૂ બહારનુ ખાતું અપડેટ કરવાનો અધિકાર તમને નથી.",
        "login": "પ્રવેશ",
        "nav-login-createaccount": "પ્રવેશ કરો / નવું ખાતું ખોલો",
-       "userlogin": "પ્રવેશ કરો / નવું ખાતું ખોલો",
-       "userloginnocreate": "પ્રવેશ",
        "logout": "પ્રસ્થાન",
        "userlogout": "પ્રસ્થાન/લૉગ આઉટ",
        "notloggedin": "પ્રવેશ કરેલ નથી",
        "userlogin-noaccount": "શું તમારૂં ખાતું નથી?",
        "userlogin-joinproject": "{{SITENAME}} સાથે જોડાવ",
-       "nologin": "શું તમારૂં ખાતું નથી? તો નવું '''$1'''.",
-       "nologinlink": "ખાતું ખોલો",
        "createaccount": "નવું ખાતું ખોલો",
-       "gotaccount": "પહેલેથી ખાતું ખોલેલું છે? '''$1'''.",
-       "gotaccountlink": "પ્રવેશ",
-       "userlogin-resetlink": "પોતાની પ્રવેશ માહિતી ભૂલી ગયા છો?",
        "userlogin-resetpassword-link": "આપની ગુપ્ત સંજ્ઞા (પાસવર્ડ) ભૂલી ગયા છો?",
        "userlogin-helplink2": "પ્રવેશ કરવા માટે મદદ",
        "userlogin-loggedin": "તમે પહેલેથી {{GENDER:$1|$1}} તરીકે પ્રવેશ કરેલો જ છે.\nબીજા સભ્ય તરીકે પ્રવેશ કરવા માટે નીચેનું ફોર્મ વાપરો.",
        "createacct-another-email-ph": "તમારું ઇમેલ સરનામું દાખલ કરો",
        "createaccountmail": "કામચલાઉ ગમે-તેમ પાસવર્ડ વાપરો અને તેને સ્પષ્ટ કરેલ ઇમેલ સરનામા પર મોકલો",
        "createacct-realname": "સાચું નામ (વૈકલ્પિક)",
-       "createaccountreason": "કારણ:",
        "createacct-reason": "કારણ",
        "createacct-reason-ph": "તમે કેમ બીજું ખાતું બનાવો છો",
        "createacct-submit": "તમારું ખાતું બનાવો",
        "showdiff": "ફેરફારો દર્શાવો",
        "anoneditwarning": "<strong>ચેતવણી:</strong> તમે તમારા સભ્ય નામથી પ્રવેશ કર્યો નથી.\nઆ પાનાનાં ઇતિહાસમાં તમારૂં આઇ.પી. (IP) એડ્રેસ નોંધવામાં આવશે અને તમારૂં આઈ.પી. લોકો જાહેર રીતે જોઈ શકશે. માટે <strong>[$1 પ્રવેશ કરો]</strong> અથવા તમે <strong>[$2 ખાતું બનાવો]</strong> તો ફેરફારો તમારા સભ્યનામ હેઠળ થશે અને અન્ય ફાયદાઓ પણ મળશે.",
        "anonpreviewwarning": "તમે સભ્યનામથી પ્રવેશ કર્યો નથી,આ પાનું ઈતિહાસમાંતમારા IP સરનામાના નામે  સાચવવામાં આવશે",
-       "missingsummary": "'''ચેતવણી:''' તમે ફેરફારનો સારંશ નથી આપ્યો.\nજો તમે \"{{int:savearticle}}\"  પર ક્લીક કરશો તો તમરો ફેરફારા સારાઁશાવગરાસાચવવામાં આવશે",
+       "missingsummary": "'''ચેતવણી:''' તમે ફેરફારનો સારંશ નથી આપ્યો.\nજો તમે \"$1\"  પર ક્લીક કરશો તો તમરો ફેરફારા સારાઁશાવગરાસાચવવામાં આવશે",
        "missingcommenttext": "કૃપા કરી નીચે ટીપ્પણી લખો.",
-       "missingcommentheader": "'''યાદ દેવડાવું:'''તમે તમારી ટિપ્પણી ને શીર્ષક/મથાળુ આપ્યું નથી. \nજો તમે  \"{{int:savearticle}}\" પર ફરીથી ક્લિક કરશો, તો તમારા ફેરરારો મથાળા વગર સચવાશે.",
+       "missingcommentheader": "'''યાદ દેવડાવું:'''તમે તમારી ટિપ્પણી ને શીર્ષક/મથાળુ આપ્યું નથી. \nજો તમે  \"$1\" પર ફરીથી ક્લિક કરશો, તો તમારા ફેરરારો મથાળા વગર સચવાશે.",
        "summary-preview": "સારાંશ પૂર્વાવલોકન:",
        "subject-preview": "વિષય/શીર્ષક પૂર્વાવલોકન:",
        "blockedtitle": "સભ્ય પ્રતિબંધિત છે",
        "editingsection": "$1 (પરિચ્છેદ)નો ફેરફાર કરી રહ્યા છો",
        "editingcomment": "$1 (પરિચ્છેદ)નો ફેરફાર કરી રહ્યા છો",
        "editconflict": "ફેરફારમાં વિસંગતતા: $1",
-       "explainconflict": "તમે ફેરફાર કરવાની શરૂઆત કરી તે દરમ્યાન અમુક કોઇકે પણ તેમાં ફેરફાર કર્યાં છે.\nઉપરનો અક્ષર દેહ અત્યારનો વિહરમાન સ્થિતિ બતાવે છે.\nતમારા દ્વારા કરાયેલ ફેરફાર નીચેના ક્ષેત્રમાં દેખાય છે.\nતમારે તમારા ફેરફારો વિહરમાન હયાત લેખમાં વિલિન કરવા પડશે. \nજો તમે  \"{{int:savearticle}}\" આ બટન દબાવશો તો <strong>ફક્ત</strong> ઉપરનો લેખ સચવાશે.",
+       "explainconflict": "તમે ફેરફાર કરવાની શરૂઆત કરી તે દરમ્યાન અમુક કોઇકે પણ તેમાં ફેરફાર કર્યાં છે.\nઉપરનો અક્ષર દેહ અત્યારનો વિહરમાન સ્થિતિ બતાવે છે.\nતમારા દ્વારા કરાયેલ ફેરફાર નીચેના ક્ષેત્રમાં દેખાય છે.\nતમારે તમારા ફેરફારો વિહરમાન હયાત લેખમાં વિલિન કરવા પડશે. \nજો તમે  \"$1\" આ બટન દબાવશો તો <strong>ફક્ત</strong> ઉપરનો લેખ સચવાશે.",
        "yourtext": "તમારું લખાણ",
        "storedversion": "સંગ્રહેલ પુનરાવર્તન",
        "nonunicodebrowser": "'''ચેતવણી: તમારું બ્રાઉઝર યુનિકોડ ઉકેલવા સક્ષમ નથી.'''\nઅહીં તમે સુરક્ષિત રીતે ફેરફારો નહીં કરી શકો: ASCII સિવાયના અક્ષરો સંપાદન ચોકઠામાં હેક્સાડેસિમલ સ્વરૂપે દેખાશે.",
        "saveprefs": "સાચવો",
        "restoreprefs": "મૂળ વિકલ્પો ફરી ગોઠવો (બધાં વિભાગોમાં)",
        "prefs-editing": "સંપાદન",
-       "rows": "પંક્તિઓ",
-       "columns": "સ્તંભ",
        "searchresultshead": "શોધો",
        "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a>નાફોર્મમેટિંગ માટે શરૂઆતિ પગથિયું  (બાઈટ્સ):",
        "stub-threshold-disabled": "નિષ્ક્રિય કરેલ",
        "right-protect": "સંરક્ષણ સ્તર બદલો અને ધોધાકાર-સંરક્ષિત પાનાઓમાં ફેરફાર કરો.",
        "right-editprotected": "પાનામાં \"{{int:protect-level-sysop}}\" તરીકે ફેરફાર કરો",
        "right-editinterface": "સભ્ય સંભાષણ પટલમાં ફેરફાર કરો",
-       "right-editusercssjs": "અન્ય સભ્યોની CSS અને JavaScript ફાઇલમાં ફેરફાર કરો",
        "right-editusercss": "અન્ય સભ્યોની CSS ફાઇલમાં ફેરફાર કરો",
        "right-edituserjs": "અન્ય સભ્યોની JavaScript ફાઇલમાં ફેરફાર કરો",
        "right-editmyusercss": "તમારી પોતાની CSS ફાઇલોમાં ફેરફાર કરો",
        "rcshowhidemine": "મારા ફેરફારો $1",
        "rcshowhidemine-show": "બતાવો",
        "rcshowhidemine-hide": "છુપાવો",
-       "rclinks": "છેલ્લાં $2 દિવસમાં થયેલા છેલ્લાં $1 ફેરફારો દર્શાવો<br />$3",
+       "rclinks": "છેલ્લાં $2 દિવસમાં થયેલા છેલ્લાં $1 ફેરફારો દર્શાવો",
        "diff": "ભેદ",
        "hist": "ઇતિહાસ",
        "hide": "છુપાવો",
        "undeleteviewlink": "જુઓ",
        "undeleteinvert": "પસંદગી ઉલટાવો",
        "undeletecomment": "કારણ:",
-       "undeletedrevisions": "{{PLURAL:$1|૧ સંપાદન|$1 સંપાદનો}} પુન સ્થાપિત કરાયા",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 ફેરફાર|$1 ફેરફારો}} અને {{PLURAL:$2|1 ફાઈલા|$2 ફાઈલો}} પુનઃસ્થાપિત",
-       "undeletedfiles": "{{PLURAL:$1|1 ફાઇલ|$1 ફાઇલો}} પુનઃસ્થાપિત",
        "cannotundelete": "પુનર્જીવિત કરવાનું કાર્ય અસફળ:\n$1",
        "undeletedpage": "'''$1 પુનઃસ્થાપિત કરાયા'''\n\nતાજેતરમાં હટાવેલા કે પુનઃસ્થાપિત થયેલા ફેરફારની નોંધ નો સંદર્ભ અહીં ઉપ્લબ્ધ [[Special:Log/delete|deletion log]].",
        "undelete-header": "હાલમાં હટાવેલ પાનાનો  [[Special:Log/delete|the deletion log]]  જુઓ",
        "logentry-newusers-autocreate": "વપરાશકર્તા ખાતું $1 આપમેળે {{GENDER:$2|બનાવવામાં આવ્યું હતું}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|દ્વારા ચડાવેલ}} $3",
        "rightsnone": "(કંઈ નહી)",
-       "revdelete-summary": "સંપાદનનો સંક્ષિપ્ત અહેવાલ",
        "feedback-adding": "પ્રતિભાવ આ પાના પર ઉમેરાઈ રહ્યો છે.",
        "feedback-bugcheck": "સરસ! જરા જોઈ લેશો કે આ  પહેલેથી જ હાજર [$1 known bugs] નથીને?",
        "feedback-bugnew": "મેં તપાસ્યું.  નવી ત્રુટીની જાણ કરો.",
        "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|was another file|were some other files}} તે જ મહિતી સાથે મોજૂદ છે , પણ {{PLURAL:$1|it was|they were}} હટાવી દો.",
-       "api-error-empty-file": "તમે ચડાવેલ ફાઈલ ખાલી છે",
        "api-error-emptypage": "નવા ખાલી પાનાં બનાવવાની પરવાનગી નથી.",
-       "api-error-fetchfileerror": "આંતરીક ત્રુટી: ફાઈલ લાવતી વખતે અમુક ગડબડ થઈ",
-       "api-error-fileexists-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-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 7c47068..efda525 100644 (file)
        "yourpasswordagain": "Aascreeu dt'ockle arrey:",
        "login": "Log stiagh",
        "nav-login-createaccount": "Log stiagh / croo coontys",
-       "userlogin": "Log stiagh / croo coontys",
-       "userloginnocreate": "Log stiagh",
        "logout": "Log magh",
        "userlogout": "Log magh",
        "notloggedin": "Cha nel ou loggit stiagh",
-       "nologin": "Nagh vel loggal stiagh ayd? '''$1'''.",
-       "nologinlink": "Croo coontys",
        "createaccount": "Croo coontys",
-       "gotaccount": "Vel coontys ayd hannah? '''$1'''.",
-       "gotaccountlink": "Log stiagh",
        "createaccountmail": "Croo fockle arrey shallidagh gyn tort as cur eh da'n post-l reiht ayd",
-       "createaccountreason": "Fa:",
        "loginerror": "Marranys loggal stiagh",
        "createaccounterror": "Cha nod shin croo coontys: $1",
        "noname": "Cha honree uss ennym ymmydeyr fondagh.",
        "prefs-rendering": "Cummey",
        "saveprefs": "Sauail",
        "prefs-editing": "Reaghey",
-       "columns": "Collooyn:",
        "searchresultshead": "Ronsee",
        "recentchangesdays": "Laaghyn y haishbyney ayns caghlaaghyn s'noa:",
        "savedprefs": "Ta dty hosheeaghtyn sauailt.",
        "rcshowhideanons": "{{PLURAL:$1|$1 ymmydeyr|$1 ymmydeyr|$1 ymmydeyr|$1 ymmydeyryn}} neuenmyssit",
        "rcshowhidepatr": "$1 arraghyn patrolit",
        "rcshowhidemine": "$1 m'arraghyn",
-       "rclinks": "Soilshee {{PLURAL:$1|ny $1 caghlaa|yn $1 chaghlaa|ny $1 chaghlaa|ny $1 caghlaaghyn}} s'jerree ayns {{PLURAL:$2|ny $2 laa|yn $2 laa|ny $2 laa|ny $2 laaghyn}} s'jerree<br />$3",
+       "rclinks": "Soilshee {{PLURAL:$1|ny $1 caghlaa|yn $1 chaghlaa|ny $1 chaghlaa|ny $1 caghlaaghyn}} s'jerree ayns {{PLURAL:$2|ny $2 laa|yn $2 laa|ny $2 laa|ny $2 laaghyn}} s'jerree",
        "diff": "anch",
        "hist": "shen",
        "hide": "Follee",
        "specialpages-group-users": "Ymmydeyryn as kiartyn",
        "tags-edit": "reaghey",
        "rightsnone": "(veg)",
-       "revdelete-summary": "giare-choontey yn reaghey",
        "searchsuggest-search": "Ronsaghey",
        "searchsuggest-containing": "goaill stiagh...",
        "expand_templates_ok": "OK",
index 7afcfaf..7d42e81 100644 (file)
        "rcshowhideliu": "$1 Ma'aikata logaggi",
        "rcshowhideanons": "$1 ma'aikata masu ɓoyayye suna",
        "rcshowhidemine": "$1 sauye-sauyena",
-       "rclinks": "Nuna sauye-sauye $1 na ƙarshe a cikin kwanaki $2 na baya<br />$3",
+       "rclinks": "Nuna sauye-sauye $1 na ƙarshe a cikin kwanaki $2 na baya",
        "diff": "bamban",
        "hist": "Tarihi",
        "hide": "Ɓoye",
index 93ba9a2..03f044c 100644 (file)
        "externaldberror": "Liá khó-nèn he yù-yî ngiam-chṳn sú-kí-khù chhâ-chho fe̍t-chá ngì fûn hì-thúng kim-chṳ́ kiên-sîn ngì ke ngoi-phu fu-thèu.",
        "login": "Tên-ngi̍p",
        "nav-login-createaccount": "Tên-ngi̍p / khôi sîn fu-thèu",
-       "userlogin": "Tên-ngi̍p / khôi sîn fu-thèu",
-       "userloginnocreate": "Tên-ngi̍p",
        "logout": "Tên-chhut",
        "userlogout": "Tên-chhut",
        "notloggedin": "Hàn-mò tên-ngi̍p",
        "userlogin-noaccount": "Hàn-mò fu-thèu he mò?",
        "userlogin-joinproject": "Chhâm-yi  {{SITENAME}}",
-       "nologin": "Hàn-mò fu-thèu he-mò? $1.",
-       "nologinlink": "Khôi fu-thèu",
        "createaccount": "Khôi fu-thèu",
-       "gotaccount": "Yí-kîn yû fu-thèu he-mò? $1.",
-       "gotaccountlink": "Tên-ngi̍p",
-       "userlogin-resetlink": "M̀-ki-tet ngì-ke tên-ngi̍p sin-sit?",
        "userlogin-resetpassword-link": "Thiâm mong-ki ngì ke me̍t-ma?",
        "userlogin-helplink2": "Tên-ngi̍p hia̍p-chhu",
        "userlogin-loggedin": "汝已作為{{GENDER:$1|$1}}登錄。\n利用以下表單以作為另一賬戶登錄。",
        "createacct-another-email-ph": "輸入電郵地址",
        "createaccountmail": "Sṳ́-yung yit-chak lìm-sṳ̀ ke sùi-kî me̍t-ma, pin chiông khì fat-sung to chṳ́-thin ke thien-chṳ́ yù-khien thi-chí",
        "createacct-realname": "實名(可選)",
-       "createaccountreason": "Ngièn-yîn:",
        "createacct-reason": "Ngièn-yîn:",
        "createacct-reason-ph": "汝做麽嘅愛創建另一隻帳號",
        "createacct-submit": "Khôi fu-thèu",
        "passwordreset-emaildisabled": "電子郵件功能在此 wiki 上已禁用。",
        "passwordreset-username": "Yung-fu-miàng:",
        "passwordreset-domain": "Vet-miàng:",
-       "passwordreset-capture": "查看生成嘅電子郵件係無?",
-       "passwordreset-capture-help": "係講汝選中邇隻框,電子郵件(包括臨時密碼)將顯示,並發送分用戶。",
        "passwordreset-email": "Thien-yù thi-chí:",
        "passwordreset-emailtitle": "在{{SITENAME}}上嘅詳細信息",
        "passwordreset-emailsentemail": "密碼重置電子郵件已發送。",
        "showdiff": "Chán-sṳ chhâ-phe̍t",
        "anoneditwarning": "<strong>Kín-ko:</strong> Ngì hàn-m̀ tên-ngi̍p. Ngì ke IP vi-chí voi ki-liu̍k chhai liá ya̍p ke phiên-siá li̍t-sṳ́ tú. Na-he ngì <strong>[$1 tên-ngi̍p]</strong> fe̍t-chá <strong>[$2 khôi fu-thèu]</strong>, ngì ke phiên-siá voi hién-sṳ ngì ke yung-fu miàng-sṳ, pin-chhiâ yû khì-thâ ke yù-tiám.",
        "anonpreviewwarning": "“警告:汝還吂登入。汝嘅IP地址將會記錄在邇頁嘅編輯歷史中”",
-       "missingsummary": "'''提示:''' 汝無提供一隻編寫摘要。假使汝再次單擊「{{int:savearticle}}」,汝嘅編寫將毋帶編寫摘要保存。",
+       "missingsummary": "'''提示:''' 汝無提供一隻編寫摘要。假使汝再次單擊「$1」,汝嘅編寫將毋帶編寫摘要保存。",
        "missingcommenttext": "請在下背輸入評論。",
-       "missingcommentheader": "'''提示:''' 汝還無為邇條評論提供一隻標題。假使汝再次單擊「{{int:savearticle}}」,您嘅編寫將毋帶標題保存。",
+       "missingcommentheader": "'''提示:''' 汝還無為邇條評論提供一隻標題。假使汝再次單擊「$1」,您嘅編寫將毋帶標題保存。",
        "summary-preview": "摘要預覽:",
        "subject-preview": "主題/標題預覽:",
        "blockedtitle": "用戶分查封",
        "editingsection": "Phiên-siá $1 (thon-lo̍k)",
        "editingcomment": "Chang-chhai phiên-siá $1 (phìn-lun)",
        "editconflict": "Phiên-siá chhûng-thu̍t: $1",
-       "explainconflict": "有人在汝開始編寫後更改矣頁面。\n上片嘅文字框內展示嘅是當前本頁嘅內容。\n汝所做嘅修改展示在下背嘅文字框肚。\n汝應該將汝所做嘅修改加入現有嘅內容肚。\n'''單淨'''在上片文字框肚嘅內容會在汝點擊「{{int:savearticle}}」後分保存。",
+       "explainconflict": "有人在汝開始編寫後更改矣頁面。\n上片嘅文字框內展示嘅是當前本頁嘅內容。\n汝所做嘅修改展示在下背嘅文字框肚。\n汝應該將汝所做嘅修改加入現有嘅內容肚。\n'''單淨'''在上片文字框肚嘅內容會在汝點擊「$1」後分保存。",
        "yourtext": "Ngì-ke vùn-sṳ",
        "storedversion": "Yí pó-chhùn ke siû-thin pán-pún",
        "nonunicodebrowser": "'''警告: 汝嘅瀏覽器毋兼容Unicode編碼。'''邇位有一隻工作區將使汝做得安全編寫頁面: 非ASCII字符將以十六進製編碼模式出現在編輯框肚。",
        "mergehistory-merge": "Yî-hâ [[:$1]] ke siû-thin cho-tet ha̍p-pìn to [[:$2]]. Yung liá sién-hong on-néu-làn hi ha̍p-pìn tân-chhiang yû chhai chṳ́-thin sṳ̀-kiên yî-chhièn só chhóng-kien ke siû-thin. Oi liù-yi ke he sṳ́-yung thô-hòng lièn-chiap chhiu-fi chhùng-sat liá-yit làn.",
        "revertmerge": "解除合併",
        "history-title": "\"$1\" ke siû-thin li̍t-sṳ́",
-       "difference-title": "\"$1\" siû-thin kiên ke chhâ-bie",
+       "difference-title": "\"$1\" siû-thin kiên ke chhâ-phe̍t",
        "lineno": "Thi $1 hàng:",
        "compareselectedversions": "Pí-káu sién-chet ke pán-pún",
        "editundo": "Chhí-sêu",
        "saveprefs": "保存",
        "restoreprefs": "Fî-fu̍k só-yû me̍t-ngin sat-thin (só-yû hong-muk)",
        "prefs-editing": "編寫緊",
-       "rows": "行数:",
-       "columns": "列:",
        "searchresultshead": "搜尋",
        "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面鏈接</a>格式門檻值(字節):",
        "recentchangesdays": "Chui-khiûn kiên-kói tú ke hién-sṳ ngit-sú:",
        "rcshowhidemine": "$1 ngài-ke phiên-siá",
        "rcshowhidemine-show": "Hien",
        "rcshowhidemine-hide": "Ám",
-       "rclinks": "Chán-sṳ chui-khiûn $2-ngit nui chui-sîn ke $1 chhṳ kói-thûng. <br />$3",
+       "rclinks": "Chán-sṳ chui-khiûn $2-ngit nui chui-sîn ke $1 chhṳ kói-thûng.",
        "diff": "chhâ-phe̍t",
        "hist": "li̍t-sṳ́",
        "hide": "Ám",
        "undeletelink": "查看/恢復",
        "undeleteviewlink": "查看",
        "undeletecomment": "Ngièn-yîn:",
-       "undeletedrevisions": "$1-chak siû-thin pán-pún yí-kîn fî-fu̍k",
-       "undeletedrevisions-files": "$1-chak pán-pún lâu $2-chak vùn-khien fûn fî-fu̍k",
-       "undeletedfiles": "$1-chak vùn-khien fûn fî-fu̍k",
        "cannotundelete": "Fî-fu̍k sṳt-phai; khó-nèn chṳ̂-chhièn yí-kîn pûn khì-thâ-ngìn fî-fu̍k.",
        "undeletedpage": "<strong>$1 yí-kîn fûn fî-fu̍k</strong>\n\nChhiáng chhâm-kháu [[Special:Log/delete|san-chhù ngit-chì]] lòi chhà-sûn san-chhù lâu fî-fu̍k ki-liu̍k.",
        "undelete-header": "Ká-sṳ́ oi chhà-sûn chui-khiûn ke ki-liu̍k chhiáng chhâm-khon [[Special:Log/delete|san-chhù ngit-chì]].",
        "ipbenableautoblock": "Chhṳ-thûng chhà-fûng liá yung-fu chui-heu só yung ke IP thi-chí, lâu heu-lòi sṳ-thù phiên-siá só yung ke só-yû thi-chí",
        "ipbsubmit": "Chhà-fûng liá yung-fu",
        "ipbother": "其它時間:",
-       "ipboptions": "2小時:2 hours,1日:1 day,3日:3 days,1星期:1 week,2星期:2 weeks,1隻月:1 month,3隻月:3 months,6隻月:6 months,1年:1 year,無限期:infinite",
+       "ipboptions": "2 tiám-chûng:2 hours,1 thiên:1 day,3 thiên:3 days,1-ke lî-pai:1 week,2-ke lî-pai:2 weeks,1-ke ngie̍t:1 month,3-ke ngie̍t:3 months,6-ke ngie̍t:6 months,1 ngièn:1 year,chhòng-khì:infinite",
        "ipbhidename": "Chhai chhà-fûng ngit-ki, fa̍t-chhiok chhà-fûng lie̍t-péu yî-khi̍p yung-fu lie̍t-péu chûng yún-chhòng yung-fu-miàng.",
        "badipaddress": "Mò-háu IP thi-chí",
        "blockipsuccesssub": "Chhà-fûng sṳ̀n-kûng",
        "logentry-newusers-create": "Yí-kîn {{GENDER:$2|khôi}} yung-fu fu-thèu $1",
        "logentry-upload-upload": "$1 {{GENDER:$2|yí-kîn sông-chhòn}} $3",
        "rightsnone": "(無)",
-       "revdelete-summary": "piên-sip tsak-yêu",
        "searchsuggest-search": "Chhìm"
 }
index 5dcfbd5..e96b8c2 100644 (file)
        "userlogin-remembermypassword": "Hoʻomanaʻo iaʻu",
        "login": "ʻEʻe",
        "nav-login-createaccount": "ʻEʻe / Kāinoa",
-       "userlogin": "ʻEʻe / Kāinoa",
-       "userloginnocreate": "ʻEʻe",
        "logout": "Haʻalele",
        "userlogout": "Haʻalele",
        "notloggedin": "ʻE‘e ʻole",
        "userlogin-noaccount": "ʻAʻohe āu moʻokāki?",
        "userlogin-joinproject": "E komo mai iā {{SITENAME}}",
-       "nologin": "ʻAʻohe āu moʻokāki? '''$1'''.",
-       "nologinlink": "E Kāinoa",
        "createaccount": "E Kāinoa",
-       "gotaccount": "He moʻokāki kāu? '''$1'''.",
-       "gotaccountlink": "ʻEʻe",
-       "userlogin-resetlink": "Ua poina i kāu ʻike ʻeʻe?",
        "userlogin-resetpassword-link": "Ua poina i kāu ʻōlelo hūnā?",
        "userlogin-helplink2": "Ke kōkua ʻana me ka ʻeʻe ʻana",
        "userlogin-loggedin": "Ua ʻeʻe ʻē ʻoe penei: {{GENDER:$1|$1}}.\nHana i ke kahua i lalo no ka ʻeʻe ʻana i kekahi mea hoʻohana ʻē aʻe.",
        "createacct-another-email-ph": "E kikokiko i ka wahinoho lekauila",
        "createaccountmail": "Hana i kekahi ʻōlelo hūnā ponokoho kūikawā a hoʻouna ia i ka wahinoho lekauila i kikokiko ʻia",
        "createacct-realname": "Inoa ʻoiaʻiʻo (kāpae)",
-       "createaccountreason": "Kumu:",
        "createacct-reason": "Kumu",
        "createacct-reason-ph": "No ke aha mai ke kāinoa nei i kekahi moʻokāki ʻē aʻe",
        "createacct-submit": "Kāinoa",
        "saveprefs": "Mālama",
        "restoreprefs": "Hōʻala i nā makemake paʻamau (apau)",
        "prefs-editing": "Hoʻololi",
-       "rows": "Lālani:",
-       "columns": "Koloma:",
        "searchresultshead": "Huli",
        "savedprefs": "Ua mālama ‘ia kāu makemake",
        "timezonelegend": "Kāʻei hola:",
        "rcshowhidemine": "$1 i ka‘u mau hoʻololi",
        "rcshowhidemine-show": "Hōʻike",
        "rcshowhidemine-hide": "Hoʻohūnā",
-       "rclinks": "E hōʻike i nā loli $1 hou, mai $2 (mau) lā aku nei<br />$3",
+       "rclinks": "E hōʻike i nā loli $1 hou, mai $2 (mau) lā aku nei",
        "diff": "ʻokoʻa",
        "hist": "mōkala",
        "hide": "Hoʻohūnā",
        "feedback-subject": "Kumunui:",
        "feedback-submit": "Waiho",
        "searchsuggest-search": "Huli",
-       "api-error-unknown-code": "Hewa ʻikeʻole: \"$1\".",
        "api-error-unknown-warning": "Akahele ʻikeʻole: \"$1\".",
        "api-error-unknownerror": "Hewa ʻikeʻole: \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|kekona|mau kekona}}",
index 76e652a..c1daa8e 100644 (file)
@@ -36,7 +36,9 @@
                        "DatGuy",
                        "IKhitron",
                        "Matma Rex",
-                       "Or"
+                       "Or",
+                       "שמזן",
+                       "Uziel302"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "redirectedfrom": "(הופנה מהדף $1)",
        "redirectpagesub": "דף הפניה",
        "redirectto": "הפניה ל:",
-       "lastmodifiedat": "×\93×£ ×\96×\94 ×©×\95Ö¼× ×\94 לאחרונה ב־$1, בשעה $2.",
+       "lastmodifiedat": "×\93×£ ×\96×\94 × ×¢×¨×\9a לאחרונה ב־$1, בשעה $2.",
        "viewcount": "דף זה נצפה {{PLURAL:$1|פעם אחת|פעמיים|$1 פעמים}}.",
        "protectedpage": "דף מוגן",
        "jumpto": "קפיצה אל:",
        "login": "כניסה לחשבון",
        "login-security": "אימות הזהות שלך",
        "nav-login-createaccount": "כניסה לחשבון / הרשמה",
-       "userlogin": "כניסה לחשבון / הרשמה",
-       "userloginnocreate": "כניסה לחשבון",
        "logout": "יציאה מהחשבון",
        "userlogout": "יציאה מהחשבון",
        "notloggedin": "לא בחשבון",
        "userlogin-noaccount": "אין לך חשבון?",
        "userlogin-joinproject": "הצטרפות ל{{grammar:תחילית|{{SITENAME}}}}",
-       "nologin": "אין לך חשבון? $1.",
-       "nologinlink": "הרשמה",
        "createaccount": "יצירת חשבון חדש",
-       "gotaccount": "כבר יש לך חשבון? $1.",
-       "gotaccountlink": "כניסה לחשבון",
-       "userlogin-resetlink": "שכחת את פרטי הכניסה?",
        "userlogin-resetpassword-link": "שכחת את הסיסמה?",
        "userlogin-helplink2": "עזרה בכניסה לחשבון",
        "userlogin-loggedin": "אתם כבר מחוברים לחשבון {{GENDER:$1|$1}}.\nהשתמשו בטופס שלהלן כדי להתחבר לחשבון אחר.",
        "createaccountmail": "שימוש בסיסמה זמנית אקראית ושליחתה לכתובת הדוא\"ל שצוינה",
        "createaccountmail-help": "יכול לשמש ליצירת חשבון לאדם אחר בלי לברר מה הססמה.",
        "createacct-realname": "שם אמיתי (לא חובה)",
-       "createaccountreason": "סיבה:",
        "createacct-reason": "סיבה",
        "createacct-reason-ph": "סיבה ליצירת חשבון נוסף",
        "createacct-reason-help": "הודעה שמוצגת ביומן רישום המשתמשים",
        "preview": "תצוגה מקדימה",
        "showpreview": "תצוגה מקדימה",
        "showdiff": "הצגת שינויים",
-       "blankarticle": "<strong>אזהרה:</strong> הדף שאתם יוצרים הוא ריק.\nאם תלחצו שוב על \"{{int:savearticle}}\", הדף ייווצר ללא תוכן.",
+       "blankarticle": "<strong>אזהרה:</strong> הדף שאתם יוצרים הוא ריק.\nאם תלחצו שוב על \"$1\", הדף ייווצר ללא כל תוכן.",
        "anoneditwarning": "<strong>אזהרה:</strong> אינכם מחוברים לחשבון. כתובת ה־IP שלכם תוצג בפומבי אם תבצעו עריכות כלשהן. אם <strong>[$1 תיכנסו לחשבון]</strong> או <strong>[$2 תיצרו חשבון]</strong>, העריכות שלכם תיוחסנה לשם המשתמש שלכם ותקבלו גם יתרונות אחרים.",
        "anonpreviewwarning": "<em>אתם לא מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.</em>",
-       "missingsummary": "<strong>תזכורת:</strong> לא הזנת תקציר עריכה.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר בלעדיו.",
-       "selfredirect": "<strong>אזהרה:</strong> ניסית ליצור הפניה מדף זה לעצמו.\nאולי כתבת יעד שגוי להפניה, ואולי ערכת את הדף הלא־נכון.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום להפניה להיווצר בכל זאת.",
+       "missingsummary": "<strong>תזכורת:</strong> לא הזנת תקציר עריכה.\nלחיצה חוזרת על הכפתור \"$1\" תגרום לעריכה שלך להישמר בלעדיו.",
+       "selfredirect": "<strong>אזהרה:</strong> ניסית ליצור הפניה מדף זה לעצמו.\nאולי כתבת יעד שגוי להפניה, ואולי ערכת את הדף הלא־נכון.\nלחיצה חוזרת על הכפתור \"$1\" תגרום להפניה להיווצר בכל זאת.",
        "missingcommenttext": "יש להקליד את ההודעה למטה.",
-       "missingcommentheader": "<strong>תזכורת:</strong> לא הזנת נושא להודעה זו.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר ללא נושא.",
+       "missingcommentheader": "<strong>תזכורת:</strong> לא הזנת נושא להודעה זו.\nלחיצה חוזרת על הכפתור \"$1\" תגרום לעריכה שלך להישמר ללא נושא.",
        "summary-preview": "תצוגה מקדימה של תקציר העריכה:",
        "subject-preview": "תצוגה מקדימה של הנושא:",
        "previewerrortext": "אירעה שגיאה בעת הניסיון להציג תצוגה מקדימה של השינויים שלך.",
        "editingsection": "עריכת הדף \"$1\" (פסקה)",
        "editingcomment": "עריכת הדף \"$1\" (פסקה חדשה)",
        "editconflict": "התנגשות עריכה: $1",
-       "explainconflict": "משתמש אחר שינה את הדף מאז שהתחלת לערוך אותו.\nתיבת העריכה העליונה מכילה את הטקסט בדף כפי שהוא כרגע.\nהשינויים שלך מוצגים בתיבת העריכה התחתונה.\nיש למזג את השינויים שלך מתיבת העריכה התחתונה לתיבת העריכה העליונה.\n<strong>רק</strong> הטקסט בתיבת העריכה העליונה יישמר לאחר לחיצה על \"{{int:savearticle}}\".",
+       "explainconflict": "משתמש אחר שינה את הדף מאז שהתחלת לערוך אותו.\nתיבת העריכה העליונה מכילה את הטקסט בדף כפי שהוא כרגע.\nהשינויים שלך מוצגים בתיבת העריכה התחתונה.\nיש למזג את השינויים שלך מתיבת העריכה התחתונה לתיבת העריכה העליונה.\n<strong>רק</strong> הטקסט בתיבת העריכה העליונה יישמר לאחר לחיצה על \"$1\".",
        "yourtext": "הטקסט שלך",
        "storedversion": "גרסה שמורה",
        "nonunicodebrowser": "'''אזהרה: הדפדפן שלך אינו תואם לתקן יוניקוד.'''\nכדי למנוע בעיות הנוצרות כתוצאה מכך ולאפשר לך לערוך דפים בבטחה, תווים שאינם ב־ASCII יוצגו בתיבת העריכה כקודים הקסדצימליים.",
        "readonlywarning": "'''אזהרה: בסיס הנתונים ננעל לצורך תחזוקה. בזמן זה לא ניתן לשמור את הטקסט הערוך.'''\nבאפשרותך להעתיק ולהדביק את הטקסט לתוך קובץ טקסט ולשמור אותו למועד מאוחר יותר.\n\nמנהל המערכת שנעל את בסיס הנתונים סיפק את ההסבר הבא: $1",
        "protectedpagewarning": "'''אזהרה: דף זה מוגן כך שרק מפעילי מערכת יכולים לערוך אותו.'''\nפעולת היומן האחרונה מוצגת להלן:",
        "semiprotectedpagewarning": "'''הערה:''' דף זה מוגן כך שרק משתמשים רשומים יכולים לערוך אותו.\nפעולת היומן האחרונה מוצגת להלן:",
-       "cascadeprotectedwarning": "<strong>×\90×\96×\94ר×\94:</strong> ×\93×£ ×\96×\94 ×\9e×\95×\92×\9f ×\9b×\9a ×©×¨×§ ×\9eפע×\99×\9c×\99 ×\9eער×\9bת יכולים לערוך אותו, כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:",
+       "cascadeprotectedwarning": "<strong>×\90×\96×\94ר×\94:</strong> ×\93×£ ×\96×\94 ×\9e×\95×\92×\9f ×\9b×\9a ×©×¨×§ ×\9eשת×\9eש×\99×\9d ×¢×\9d [[Special:ListGroupRights|×\94רש×\90×\95ת ×\9eס×\95×\99×\9e×\95ת]] יכולים לערוך אותו, כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:",
        "titleprotectedwarning": "'''אזהרה: דף זה מוגן כך שדרושות [[Special:ListGroupRights|הרשאות מסוימות]] כדי ליצור אותו.'''\nפעולת היומן האחרונה מוצגת להלן:",
        "templatesused": "{{PLURAL:$1|תבנית המופיעה|תבניות המופיעות}} בדף זה:",
        "templatesusedpreview": "{{PLURAL:$1|תבנית המופיעה|תבניות המופיעות}} בתצוגה המקדימה הזאת:",
        "post-expand-template-argument-warning": "'''אזהרה:''' דף זה כולל לפחות תבנית אחת שבה פרמטרים גדולים מדי.\nפרמטרים אלה הושמטו.",
        "post-expand-template-argument-category": "דפים שבהם הושמטו פרמטרים של תבניות",
        "parser-template-loop-warning": "נמצאה תבנית הקוראת לעצמה: [[$1]]",
+       "template-loop-category": "דפים עם לולאות בתבנית",
+       "template-loop-category-desc": "הדף הזה מכיל לולאה בתבנית, כלומר תבנית שקוראת לעצמה באופן רקורסיבי.",
        "parser-template-recursion-depth-warning": "עומק התבניות המוכללות זו בזו עבר את המגבלה ($1)",
        "language-converter-depth-warning": "עומק ממיר השפה עבר את המגבלה ($1)",
        "node-count-exceeded-category": "דפים שבהם מספר הצמתים גדול מדי",
        "page_first": "ראשון",
        "page_last": "אחרון",
        "histlegend": "בחירת גרסאות להשוואה: {{GENDER:|בחר|בחרי|בחרו}} את הגרסאות ש{{GENDER:|ברצונך|ברצונך|ברצונכם}} להשוות ולאחר מכן {{GENDER:|הקש|הקישי|הקישו}} על Enter או {{GENDER:|לחץ|לחצי|לחצו}} על הכפתור שלמטה.<br />\nמקרא: <strong>({{int:cur}})</strong> = השוואה עם הגרסה הנוכחית, <strong>({{int:last}})</strong> = השוואה עם הגרסה הקודמת, <strong>{{int:minoreditletter}}</strong> = עריכה משנית.",
-       "history-fieldset-title": "×\97×\99פ×\95ש ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\93×£",
-       "history-show-deleted": "ער×\99×\9bות מוסתרות בלבד",
+       "history-fieldset-title": "×\97×\99פ×\95ש ×\92רס×\90×\95ת",
+       "history-show-deleted": "×\92רס×\90ות מוסתרות בלבד",
        "histfirst": "הישנות ביותר",
        "histlast": "החדשות ביותר",
        "historysize": "({{PLURAL:$1|בייט אחד|$1 בייטים}})",
        "search-file-match": "(התאמה בתוכן הקובץ)",
        "search-suggest": "האם התכוונת ל: $1",
        "search-rewritten": "מוצגות התוצאות עבור $1. ניתן לחפש $2 במקום זאת.",
-       "search-interwiki-caption": "מיזמי אחות",
+       "search-interwiki-caption": "ת×\95צ×\90×\95ת ×\9e×\9e×\99×\96×\9e×\99 ×\90×\97×\95ת",
        "search-interwiki-default": "תוצאות מתוך $1:",
        "search-interwiki-more": "(עוד)",
        "search-interwiki-more-results": "תוצאות נוספות",
        "prefs-help-prefershttps": "העדפה זו תיכנס לתוקף בכניסה הבאה לחשבון.",
        "prefswarning-warning": "ביצעת שינויים בהעדפות שלך, והם עדיין לא נשמרו.\nעזיבת דף זה ללא לחיצה על \"$1\" תגרום לכך שההעדפות שלך לא יעודכנו.",
        "prefs-tabs-navigation-hint": "טיפ: ניתן להשתמש במקשי החצים הימני והשמאלי כדי לנווט בין הלשוניות ברשימת הלשוניות.",
-       "userrights": "× ×\99×\94×\95×\9c ×\94רש×\90×\95ת ×\9eשת×\9eש",
+       "userrights": "הרשאות משתמש",
        "userrights-lookup-user": "בחירת משתמש",
        "userrights-user-editname": "שם משתמש:",
        "editusergroup": "טעינת קבוצות המשתמש",
        "saveusergroups": "שמירת הקבוצות של ה{{GENDER:$1|משתמש|משתמשת}}",
        "userrights-groupsmember": "{{GENDER:$2|חבר|חברה}} ב{{PLURAL:$1|קבוצה|קבוצות}}:",
        "userrights-groupsmember-auto": "{{GENDER:$2|חבר|חברה}} אוטומטית ב{{PLURAL:$1|קבוצה|קבוצות}}:",
-       "userrights-groups-help": "באפשרותך לשנות את הקבוצות ש{{GENDER:$1|משתמש זה חבר|משתמשת זו חברה}} בהן:\n* תיבה מסומנת פירושה שה{{GENDER:$1|משתמש כבר חבר|משתמשת כבר חברה}} בקבוצה.\n* תיבה בלתי מסומנת פירושה שה{{GENDER:$1|משתמש אינו חבר|משתמשת אינה חברה}} בקבוצה.\n* סימון * פירושו שלא יהיה באפשרותך להסיר את ה{{GENDER:$1|משתמש|משתמשת}} מהקבוצה לאחר שהוספת {{GENDER:$1|אותו|אותה}} אליה, או להפך.\n* סימון # פירושו שבאפשרותך רק לאחר את זמן הפקיעה של קבוצה זו; אין באפשרותך להקדימו.",
+       "userrights-groups-help": "×\91×\90פשר×\95ת×\9a ×\9cשנ×\95ת ×\90ת ×\94ק×\91×\95צ×\95ת ×©{{GENDER:$1|×\9eשת×\9eש ×\96×\94 ×\97×\91ר|×\9eשת×\9eשת ×\96×\95 ×\97×\91ר×\94}} ×\91×\94×\9f:\n* ×ª×\99×\91×\94 ×\9eס×\95×\9eנת ×¤×\99ר×\95ש×\94 ×©×\94{{GENDER:$1|×\9eשת×\9eש ×\9b×\91ר ×\97×\91ר|×\9eשת×\9eשת ×\9b×\91ר ×\97×\91ר×\94}} ×\91ק×\91×\95צ×\94.\n* ×ª×\99×\91×\94 ×\91×\9cת×\99 ×\9eס×\95×\9eנת ×¤×\99ר×\95ש×\94 ×©×\94{{GENDER:$1|×\9eשת×\9eש ×\90×\99× ×\95 ×\97×\91ר|×\9eשת×\9eשת ×\90×\99× ×\94 ×\97×\91ר×\94}} ×\91ק×\91×\95צ×\94.\n* ×¡×\99×\9e×\95×\9f * ×¤×\99ר×\95ש×\95 ×©×\9c×\90 ×\99×\94×\99×\94 ×\91×\90פשר×\95ת×\9a ×\9c×\94ס×\99ר ×\90ת ×\94{{GENDER:$1|×\9eשת×\9eש|×\9eשת×\9eשת}} ×\9e×\94ק×\91×\95צ×\94 ×\9c×\90×\97ר ×©×\94×\95ספת {{GENDER:$1|×\90×\95ת×\95\90×\95ת×\94}} ×\90×\9c×\99×\94, ×\90×\95 ×\9c×\94פ×\9a.\n* ×¡×\99×\9e×\95×\9f # ×¤×\99ר×\95ש×\95 ×©×\91×\90פשר×\95ת×\9a ×¨×§ ×\9c×\90×\97ר ×\90ת ×\96×\9e×\9f ×\94פק×\99×¢×\94 ×©×\9c ×\94×\97×\91ר×\95ת ×\91ק×\91×\95צ×\94 ×\96×\95; ×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9c×\94ק×\93×\99×\9e×\95.",
        "userrights-reason": "סיבה:",
        "userrights-no-interwiki": "אין לך הרשאה לערוך הרשאות משתמש באתרים אחרים.",
        "userrights-nodatabase": "בסיס הנתונים $1 אינו קיים או אינו מקומי.",
        "userrights-expiry-options": "יום:1 day,שבוע:1 week,חודש:1 month,שלושה חודשים:3 months,שישה חודשים:6 months,שנה:1 year",
        "userrights-invalid-expiry": "זמן הפקיעה לקבוצה \"$1\" אינו תקין.",
        "userrights-expiry-in-past": "זמן הפקיעה לקבוצה \"$1\" הוא בעבר.",
-       "userrights-cannot-shorten-expiry": "אין באפשרותך להקדים את זמן הפקיעה של הקבוצה \"$1\". רק משתמשים בעלי הרשאה להוסיף ולהסיר את הקבוצה יכולים להקדים את זמן הפקיעה.",
+       "userrights-cannot-shorten-expiry": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9c×\94ק×\93×\99×\9d ×\90ת ×\96×\9e×\9f ×\94פק×\99×¢×\94 ×©×\9c ×\94×\97×\91ר×\95ת ×\91ק×\91×\95צ×\94 \"$1\". ×¨×§ ×\9eשת×\9eש×\99×\9d ×\91×¢×\9c×\99 ×\94רש×\90×\94 ×\9c×\94×\95ס×\99×£ ×\95×\9c×\94ס×\99ר ×\90ת ×\94ק×\91×\95צ×\94 ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94ק×\93×\99×\9d ×\90ת ×\96×\9e×\9f ×\94פק×\99×¢×\94.",
        "userrights-conflict": "התנגשות בין שינויי הרשאות משתמש! אנא בִּדקו את השינויים שלכם ואשרו אותם.",
        "group": "קבוצה:",
        "group-user": "משתמשים",
        "right-editsemiprotected": "עריכת דפים המוגנים ברמת ההגנה \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "שינוי מודל התוכן של דפים",
        "right-editinterface": "עריכת ממשק המשתמש",
-       "right-editusercssjs": "עריכת קובצי CSS ו־JavaScript של משתמשים אחרים",
        "right-editusercss": "עריכת קובצי CSS של משתמשים אחרים",
        "right-edituserjs": "עריכת קובצי JavaScript של משתמשים אחרים",
        "right-editmyusercss": "עריכת קובצי CSS של המשתמש עצמו",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "הצגה",
        "rcfilters-activefilters": "מסננים פעילים",
+       "rcfilters-quickfilters": "קישורים מהירים",
+       "rcfilters-quickfilters-placeholder-title": "טרם נשמרו קישורים",
+       "rcfilters-quickfilters-placeholder-description": "כדי לשמור את הגדרות המסננים שלך ולהשתמש בהן מאוחר יותר, יש ללחוץ על סמל הסימנייה באזור המסנן הפעיל להלן.",
+       "rcfilters-savedqueries-defaultlabel": "מסננים שמורים",
+       "rcfilters-savedqueries-rename": "שינוי שם",
+       "rcfilters-savedqueries-setdefault": "הגדרה כברירת מחדל",
+       "rcfilters-savedqueries-unsetdefault": "ביטול הגדרה כברירת מחדל",
+       "rcfilters-savedqueries-remove": "הסרה",
+       "rcfilters-savedqueries-new-name-label": "שם",
+       "rcfilters-savedqueries-apply-label": "יצירת קישור מהיר",
+       "rcfilters-savedqueries-cancel-label": "ביטול",
+       "rcfilters-savedqueries-add-new-title": "שמירת מסננים בתור קישור מהיר",
        "rcfilters-restore-default-filters": "שחזור למסנני ברירת המחדל",
        "rcfilters-clear-all-filters": "מחיקת כל המסננים",
        "rcfilters-search-placeholder": "סינון שינויים אחרונים (עיינו או התחילו להקליד)",
        "rcfilters-invalid-filter": "מסנן בלתי־תקין",
        "rcfilters-empty-filter": "אין מסננים פעילים. כל התרומות מוצגות.",
        "rcfilters-filterlist-title": "מסננים",
+       "rcfilters-filterlist-whatsthis": "מה זה?",
+       "rcfilters-filterlist-feedbacklink": "שליחת משוב על המסננים החדשים (בטא)",
        "rcfilters-highlightbutton-title": "הבלטת התוצאות",
        "rcfilters-highlightmenu-title": "בחירת צבע",
+       "rcfilters-highlightmenu-help": "בחירת צבע להדגשת מאפיין זה",
        "rcfilters-filterlist-noresults": "לא נמצאו מסננים",
+       "rcfilters-noresults-conflict": "לא נמצאו תוצאות משום שקריטריוני החיפוש מתנגשים",
+       "rcfilters-state-message-subset": "המסנן הזה אינו משפיע כי התוצאות שלו כלולות {{PLURAL:$2|במסנן הרחב יותר הבא|במסננים הרחבים יותר הבאים}} (נסו להדגיש כדי להבדיל ביניהם): $1",
+       "rcfilters-state-message-fullcoverage": "בחירת כל המסננים בקבוצה זהה לביטול כל הבחירות, אז למסנן הזה אין השפעה. הקבוצה כוללת: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "המסנן הזה פעיל מתנגש עם {{PLURAL:$2|מסנן רמת הניסיון הבא, שמוצא|מסנני רמת הניסיון הבאים, שמוצאים}} רק משתמשים רשומים: $1",
+       "rcfilters-filtergroup-authorship": "מבצעי התרומה",
+       "rcfilters-filter-editsbyself-label": "שינויים שלך",
+       "rcfilters-filter-editsbyself-description": "תרומות שביצעת בעצמך.",
+       "rcfilters-filter-editsbyother-label": "שינויים של אחרים",
+       "rcfilters-filter-editsbyother-description": "כל השינויים מלבד אלה שלך.",
+       "rcfilters-filtergroup-userExpLevel": "רמת ניסיון (למשתמשים רשומים בלבד)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "מסנני הניסיון מוצאים רק משתמשים רשומים, כך שמסנן זה מתנגש עם המסנן \"לא רשומים\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "המסנן \"לא רשומים\" מתנגש עם אחד או יותר ממסנני רמת הניסיון, שמוצאים משתמשים רשומים בלבד. המסננים המתנגשים מסומנים באזור המסננים הפעילים לעיל.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "חדשים",
+       "rcfilters-filter-user-experience-level-newcomer-description": "פחות מ־10 עריכות ומ־4 ימים של פעילות.",
+       "rcfilters-filter-user-experience-level-learner-label": "לומדים",
+       "rcfilters-filter-user-experience-level-learner-description": "יותר ניסיון מ\"חדשים\", אבל פחות מ\"משתמשים מנוסים\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "משתמשים מנוסים",
+       "rcfilters-filter-user-experience-level-experienced-description": "יותר מ־30 ימים של פעילות ו־500 עריכות.",
        "rcfilters-filtergroup-automated": "תרומות אוטומטיות",
        "rcfilters-filter-bots-label": "בוטים",
        "rcfilters-filter-bots-description": "עריכות שבוצעו על־ידי כלים אוטומטיים.",
        "rcfilters-filter-humans-label": "בני אדם (לא בוטים)",
        "rcfilters-filter-humans-description": "עריכות שבוצעו על־ידי עורכים אנושיים.",
+       "rcfilters-filtergroup-reviewstatus": "מצב סקירה",
+       "rcfilters-filter-patrolled-label": "בדוקות",
+       "rcfilters-filter-patrolled-description": "עריכות שסומנו כבדוקות.",
+       "rcfilters-filter-unpatrolled-label": "לא בדוקות",
+       "rcfilters-filter-unpatrolled-description": "עריכות שלא סומנו כבדוקות.",
        "rcfilters-filtergroup-significance": "חשיבות",
        "rcfilters-filter-minor-label": "עריכות משניות",
        "rcfilters-filter-minor-description": "עריכות שהוגדרו על־ידי העורכים כמשניות.",
        "rcfilters-filter-major-label": "עריכות שאינן משניות",
        "rcfilters-filter-major-description": "עריכות שלא הוגדרו כמשניות.",
+       "rcfilters-filtergroup-watchlist": "דפים ברשימת המעקב",
+       "rcfilters-filter-watchlist-watched-label": "ברשימת המעקב",
+       "rcfilters-filter-watchlist-watched-description": "שינויים לדפים ברשימת המעקב שלך.",
+       "rcfilters-filter-watchlist-watchednew-label": "שינויים חדשים ברשימת המעקב",
+       "rcfilters-filter-watchlist-watchednew-description": "שינויים לדפים ברשימת המעקב שלא ביקרת בהם מאז שבוצעו השינויים.",
+       "rcfilters-filter-watchlist-notwatched-label": "לא ברשימת המעקב",
+       "rcfilters-filter-watchlist-notwatched-description": "הכל מלבד שינויים לדפים ברשימת המעקב שלך.",
        "rcfilters-filtergroup-changetype": "סוג השינויים",
        "rcfilters-filter-pageedits-label": "עריכות דפים",
        "rcfilters-filter-pageedits-description": "עריכות של תוכן ויקי, של דיונים, של תיאורי קטגוריות...",
        "rcfilters-filter-categorization-description": "רישומים על דפים שנוספו לקטגוריות או הוסרו מהן.",
        "rcfilters-filter-logactions-label": "פעולות יומן",
        "rcfilters-filter-logactions-description": "פעולות מנהליות, יצירת חשבונות, מחיקת דפים, העלאות...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "מסנן \"עריכות משניות\" מתנגש עם מסנן סוג השינויים אחד או יותר, כי סוגים מסוימים של שינויים אינם יכולים להיות מסווגים בתור \"משניים\". המסננים המתנגשים מסומנים באזור המסננים הפעילים לעיל.",
+       "rcfilters-hideminor-conflicts-typeofchange": "סוגים מסוימים של שינויים אינם יכולים להיות מסווגים כ\"משניים\", כך שמסנן זה מתנגש עם מסנן סוג השינויים הבא: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "מסנן סוג השינויים הזה מתנגש עם מסנן \"עריכות משניות\". סוגים מסוימים של שינויים אינם יכולים מסווגים כ\"משניים\".",
+       "rcfilters-filtergroup-lastRevision": "גרסה אחרונה",
+       "rcfilters-filter-lastrevision-label": "הגרסה האחרונה",
+       "rcfilters-filter-lastrevision-description": "השינוי האחרון בדף.",
+       "rcfilters-filter-previousrevision-label": "גרסאות קודמות",
+       "rcfilters-filter-previousrevision-description": "כל השינויים שאינם השינוי האחרון בדף.",
        "rcnotefrom": "להלן {{PLURAL:$5|השינוי שבוצע|השינויים שבוצעו}} מאז <strong>$3, $4</strong> (מוצגים עד <strong>$1</strong>).",
+       "rclistfromreset": "איפוס בחירת התאריך",
        "rclistfrom": "הצגת שינויים חדשים החל מ־$2, $3",
        "rcshowhideminor": "$1 עריכות משניות",
        "rcshowhideminor-show": "הצגת",
        "rcshowhidecategorization": "$1 שינויים בקטגוריות",
        "rcshowhidecategorization-show": "הצגת",
        "rcshowhidecategorization-hide": "הסתרת",
-       "rclinks": "הצגת $1 השינויים האחרונים ב־$2 הימים האחרונים<br />$3",
+       "rclinks": "הצגת $1 השינויים האחרונים ב־$2 הימים האחרונים",
        "diff": "הבדל",
        "hist": "היסטוריה",
        "hide": "הסתרת",
        "recentchangeslinked-to": "הצגת השינויים בדפים המקשרים לדף הנתון במקום זאת",
        "recentchanges-page-added-to-category": "הדף [[:$1]] נוסף לקטגוריה",
        "recentchanges-page-added-to-category-bundled": "הדף [[:$1]] נוסף לקטגוריה, [[Special:WhatLinksHere/$1|והוא מוכלל בדפים אחרים]]",
-       "recentchanges-page-removed-from-category": "הדף [[:$1]] הוסר מקטגוריה",
-       "recentchanges-page-removed-from-category-bundled": "×\94×\93×£ [[:$1]] ×\94×\95סר ×\9eק×\98×\92×\95ר×\99×\94, [[Special:WhatLinksHere/$1|×\95הוא מוכלל בדפים אחרים]]",
+       "recentchanges-page-removed-from-category": "×\94×\93×£ [[:$1]] ×\94×\95סר ×\9e×\94ק×\98×\92×\95ר×\99×\94",
+       "recentchanges-page-removed-from-category-bundled": "×\94×\93×£ [[:$1]] ×\94×\95סר ×\9e×\94ק×\98×\92×\95ר×\99×\94, ×\95[[Special:WhatLinksHere/$1|הוא מוכלל בדפים אחרים]]",
        "autochange-username": "שינוי אוטומטי של מדיה־ויקי",
        "upload": "העלאת קובץ",
        "uploadbtn": "העלאת הקובץ",
        "php-uploaddisabledtext": "אפשרות העלאת הקבצים מבוטלת ברמת PHP. אנא בדקו את ההגדרה file_uploads.",
        "uploadscripted": "הקובץ כולל קוד סקריפט או HTML שעשוי להתפרש או להתבצע בטעות על־ידי הדפדפן.",
        "upload-scripted-pi-callback": "לא ניתן להעלות קובץ שמכיל את הוראת העיבוד XML-stylesheet.",
+       "upload-scripted-dtd": "לא ניתן להעלות קבצי SVG שכוללים הכרזת DTD לא־סטנדרטית.",
        "uploaded-script-svg": "נמצא אלמנט שאפשר לכתוב בו תסריט \"$1\" בקובץ ה־SVG שהועלה.",
        "uploaded-hostile-svg": "נמצא CSS בלתי־מאובטח באלמנט style בקובץ ה־SVG שהועלה.",
        "uploaded-event-handler-on-svg": "אסור להגדיר מאפייני טיפול באירועים <code dir=\"ltr\">$1=\"$2\"</code> בקובצי SVG.",
        "uncategorizedcategories": "קטגוריות חסרות קטגוריה",
        "uncategorizedimages": "קבצים חסרי קטגוריה",
        "uncategorizedtemplates": "תבניות חסרות קטגוריה",
-       "uncategorized-categories-exceptionlist": " # מכיל רשימה של קטגוריות שאינן אמורות להופיע בדףSpecial:UncategorizedCategories. יש לכתוב קטגוריה אחת בכל שורה, ולהתחיל כל שורה בתו \"*\". התוכנה תתעלם משורות המתחילות בתווים אחרים (לרבות רווחים). התו \"#\" משמש להערות.",
+       "uncategorized-categories-exceptionlist": " # מכיל רשימה של קטגוריות שאינן אמורות להופיע בדף Special:UncategorizedCategories. יש לכתוב קטגוריה אחת בכל שורה, ולהתחיל כל שורה בתו \"*\". התוכנה תתעלם משורות המתחילות בתווים אחרים (לרבות רווחים). התו \"#\" משמש להערות.",
        "unusedcategories": "קטגוריות שאינן בשימוש",
        "unusedimages": "קבצים שאינם בשימוש",
        "wantedcategories": "קטגוריות מבוקשות",
        "log": "יומנים",
        "logeventslist-submit": "הצגה",
        "all-logs-page": "כל היומנים הציבוריים",
-       "alllogstext": "תצוגה משולבת של כל סוגי היומנים הזמינים ב{{grammar:תחילית|{{SITENAME}}}}.\nניתן לצמצם את התצוגה על־ידי בחירת סוג היומן, שם המשתמש (תלוי רישיות) או הדף המושפע (גם כן תלוי רישיות).",
+       "alllogstext": "×\96×\95×\94×\99 ×ª×¦×\95×\92×\94 ×\9eש×\95×\9c×\91ת ×©×\9c ×\9b×\9c ×¡×\95×\92×\99 ×\94×\99×\95×\9e× ×\99×\9d ×\94×\96×\9e×\99× ×\99×\9d ×\91{{grammar:ת×\97×\99×\9c×\99ת|{{SITENAME}}}}.\n× ×\99ת×\9f ×\9cצ×\9eצ×\9d ×\90ת ×\94תצ×\95×\92×\94 ×¢×\9cÖ¾×\99×\93×\99 ×\91×\97×\99רת ×¡×\95×\92 ×\94×\99×\95×\9e×\9f, ×©×\9d ×\94×\9eשת×\9eש (ת×\9c×\95×\99 ×¨×\99ש×\99×\95ת) ×\90×\95 ×\94×\93×£ ×\94×\9e×\95שפע (×\92×\9d ×\9b×\9f ×ª×\9c×\95×\99 ×¨×\99ש×\99×\95ת).",
        "logempty": "אין פריטים תואמים ביומן.",
        "log-title-wildcard": "חיפוש כותרות המתחילות באותיות אלה",
        "showhideselectedlogentries": "שינוי מצב התצוגה של פעולות היומן שנבחרו",
        "enotif_body_intro_moved": "הדף \"$1\" באתר {{SITENAME}} הועבר ב־$PAGEEDITDATE על־ידי $2; ראו $3 לגרסה הנוכחית של הדף.",
        "enotif_body_intro_restored": "הדף \"$1\" באתר {{SITENAME}} שוחזר ב־$PAGEEDITDATE על־ידי $2; ראו $3 לגרסה הנוכחית של הדף.",
        "enotif_body_intro_changed": "הדף \"$1\" באתר {{SITENAME}} שוּנה ב־$PAGEEDITDATE על־ידי $2; ראו $3 לגרסה הנוכחית של הדף.",
-       "enotif_lastvisited": "ר×\90×\95 $1 ×\9c×\9b×\9c ×\94ש×\99× ×\95×\99×\99×\9d ×\9e×\90×\96 ×\91×\99ק×\95ר×\9b×\9d ×\94×\90×\97ר×\95×\9f ×\91×\93×£.",
-       "enotif_lastdiff": "ר×\90×\95 $1 ×\9cש×\99× ×\95×\99 ×\96×\94.",
+       "enotif_lastvisited": "×\9c×\9b×\9c ×\94ש×\99× ×\95×\99×\99×\9d ×\9e×\90×\96 ×\91×\99ק×\95ר×\9b×\9d ×\94×\90×\97ר×\95×\9f ×\91×\93×£, ×¨' $1",
+       "enotif_lastdiff": "×\9cצפ×\99×\99×\94 ×\91ש×\99× ×\95×\99 ×\96×\94, ×¨' $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",
        "created": "נוצר",
        "undeleteviewlink": "הצגה",
        "undeleteinvert": "הפיכת הבחירה",
        "undeletecomment": "סיבה:",
-       "undeletedrevisions": "{{PLURAL:$1|שוחזרה גרסה אחת|שוחזרו $1 גרסאות}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}} ו{{PLURAL:$2|קובץ אחד|־$2 קבצים}} שוחזרו",
-       "undeletedfiles": "{{PLURAL:$1|שוחזר קובץ אחד|שוחזרו $1 קבצים}}",
        "cannotundelete": "השחזור (או חלק ממנו) נכשל:\n$1",
        "undeletedpage": "<strong>הדף $1 שוחזר</strong>\n\nראו את [[Special:Log/delete|יומן המחיקות]] לרשימה של המחיקות והשחזורים שבוצעו לאחרונה.",
        "undelete-header": "{{GENDER:|ראה|ראי|ראו}} את [[Special:Log/delete|יומן המחיקות]] לרשימה של דפים שנמחקו לאחרונה.",
        "sp-contributions-uploads": "העלאות",
        "sp-contributions-logs": "יומנים",
        "sp-contributions-talk": "שיחה",
-       "sp-contributions-userrights": "ניהול הרשאות משתמש",
+       "sp-contributions-userrights": "ניהול הרשאות {{GENDER:$1|משתמש|משתמשת}}",
        "sp-contributions-blocked-notice": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "sp-contributions-blocked-notice-anon": "כתובת IP זו חסומה כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "sp-contributions-search": "חיפוש תרומות",
        "unblocked-id": "חסימה מספר $1 שוחררה.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] שוחררה מחסימתה.",
        "blocklist": "משתמשים חסומים",
+       "autoblocklist": "חסימות אוטומטיות",
+       "autoblocklist-submit": "חיפוש",
+       "autoblocklist-legend": "רשימת חסימות אוטומטיות",
+       "autoblocklist-localblocks": "{{PLURAL:$1|חסימה אוטומטית מקומית|חסימות אוטומטיות מקומיות}}",
+       "autoblocklist-empty": "רשימת החסימות האוטומטיות ריקה.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|חסימה אוטומטית אחרת|חסימות אוטומטיות אחרות}}",
        "ipblocklist": "משתמשים חסומים",
        "ipblocklist-legend": "מציאת משתמש חסום",
        "blocklist-userblocks": "הסתרת חסימות של משתמשים רשומים",
        "ipb_expiry_temp": "חסימות הכוללות הסתרת שם משתמש חייבות להיות לזמן בלתי מוגבל.",
        "ipb_hide_invalid": "לא ניתן להעלים את החשבון הזה; {{PLURAL:$1|בוצעה ממנו יותר מעריכה אחת|בוצעו ממנו יותר מ‏‏֫־$1 עריכות}}.",
        "ipb_already_blocked": "המשתמש \"$1\" כבר נחסם.",
-       "ipb-needreblock": "ה{{GENDER:$1|משתמש|משתמשת}} \"$1\" כבר {{GENDER:$1|חסום|חסומה}}. האם ברצונך לשנות את הגדרות החסימה?",
+       "ipb-needreblock": "$1 כבר {{GENDER:$1|חסום|חסומה}}. האם ברצונך לשנות את הגדרות החסימה?",
        "ipb-otherblocks-header": "{{PLURAL:$1|חסימה אחרת|חסימות אחרות}}",
        "unblock-hideuser": "אין באפשרותך לשחרר את החסימה של המשתמש הזה, כיוון ששם המשתמש שלו הוסתר.",
        "ipb_cant_unblock": "שגיאה: חסימה מספר $1 לא נמצאה. ייתכן שהיא כבר שוחררה.",
        "tooltip-pt-mytalk": "דף השיחה שלך",
        "tooltip-pt-anontalk": "דיון על העריכות שנעשו מכתובת ה־IP הזאת",
        "tooltip-pt-preferences": "ההעדפות שלך",
-       "tooltip-pt-watchlist": "רשימת הדפים ש{{GENDER:|אתה עוקב|את עוקבת}} אחרי השינויים בהם",
+       "tooltip-pt-watchlist": "רשימת הדפים {{GENDER:|שאתה עוקב|שאת עוקבת}} אחרי השינויים בהם",
        "tooltip-pt-mycontris": "רשימת העריכות שביצעת",
        "tooltip-pt-anoncontribs": "רשימת העריכות שנעשו מכתובת ה־IP הזאת",
        "tooltip-pt-login": "מומלץ להיכנס לחשבון, אך אין חובה לעשות זאת",
+       "tooltip-pt-login-private": "יש להיכנס לחשבון כדי להשתמש באתר הוויקי הזה",
        "tooltip-pt-logout": "יציאה מהחשבון",
        "tooltip-pt-createaccount": "מומלץ ליצור חשבון ולהיכנס אליו, אך אין חובה לעשות זאת",
        "tooltip-ca-talk": "שיחה על דף זה",
        "anonymous": "{{PLURAL:$1|משתמש אנונימי|משתמשים אנונימיים}} של {{SITENAME}}",
        "siteuser": "משתמש {{SITENAME}} $1",
        "anonuser": "משתמש אנונימי של {{SITENAME}} $1",
-       "lastmodifiedatby": "×\93×£ ×\96×\94 ×©×\95Ö¼× ×\94 לאחרונה ב־$2, $1 על־ידי $3.",
+       "lastmodifiedatby": "×\93×£ ×\96×\94 × ×¢×¨×\9a לאחרונה ב־$2, $1 על־ידי $3.",
        "othercontribs": "מבוסס על העבודה של $1.",
        "others": "אחרים",
        "siteusers": "{{PLURAL:$2|{{GENDER:$1|משתמש}}|משתמשי}} {{SITENAME}} $1",
        "newimages-summary": "דף מיוחד זה מציג את הקבצים האחרונים שהועלו.",
        "newimages-legend": "מסנן",
        "newimages-label": "שם הקובץ (או חלק ממנו):",
+       "newimages-user": "כתובת IP או שם משתמש",
        "newimages-showbots": "הצגת העלאות שבוצעו על־ידי בוטים",
        "newimages-hidepatrolled": "הסתרת העלאות בדוקות",
        "noimages": "אין קבצים.",
        "confirmrecreate": "ה{{GENDER:$1|משתמש|משתמשת}} [[User:$1|$1]] ([[User talk:$1|שיחה]]) {{GENDER:$1|מחק|מחקה}} את הדף הזה לאחר שהתחלת לערוך אותו, מהסיבה הבאה:\n: <em>$2</em>\nיש לאשר שאכן ברצונך ליצור מחדש את הדף.",
        "confirmrecreate-noreason": "ה{{GENDER:$1|משתמש|משתמשת}} [[User:$1|$1]] ([[User talk:$1|שיחה]]) {{GENDER:$1|מחק|מחקה}} את הדף הזה לאחר שהתחלת לערוך אותו. יש לאשר שאכן ברצונך ליצור מחדש את הדף.",
        "recreate": "יצירה מחדש",
+       "confirm-purge-title": "ניקוי המטמון של דף זה",
        "confirm_purge_button": "אישור",
        "confirm-purge-top": "לנקות את המטמון של דף זה?",
        "confirm-purge-bottom": "ניקוי המטמון של דף גורם לגרסה החדשה ביותר להופיע.",
        "watchlisttools-view": "הצגת השינויים הרלוונטיים",
        "watchlisttools-edit": "הצגה ועריכה של רשימת המעקב",
        "watchlisttools-raw": "עריכת רשימת המעקב הגולמית",
-       "iranian-calendar-m1": "פר×\91רדין",
-       "iranian-calendar-m2": "×\90×\95ר×\93×\99×\91×\94ש×\98",
-       "iranian-calendar-m3": "×\97×\95רדאד",
+       "iranian-calendar-m1": "פר×\95רדין",
+       "iranian-calendar-m2": "×\90ר×\93×\99×\91×\94שת",
+       "iranian-calendar-m3": "×\97׳רדאד",
        "iranian-calendar-m4": "תיר",
-       "iranian-calendar-m5": "×\9e×\95ר×\93×\90×\93",
-       "iranian-calendar-m6": "ש×\94ר×\99×\91ר",
+       "iranian-calendar-m5": "מרדאד",
+       "iranian-calendar-m6": "ש×\94ר×\99×\95ר",
        "iranian-calendar-m7": "מהר",
-       "iranian-calendar-m8": "אבן",
-       "iranian-calendar-m9": "×\90×\96ר",
+       "iranian-calendar-m8": "×\90×\91×\90×\9f",
+       "iranian-calendar-m9": "×\90×\93׳ר",
        "iranian-calendar-m10": "די",
        "iranian-calendar-m11": "בהמן",
        "iranian-calendar-m12": "אספנד",
        "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-restore": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3",
+       "restore-count-revisions": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}}",
+       "restore-count-files": "{{PLURAL:$1|קובץ אחד|$1 קבצים}}",
        "logentry-delete-event": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרסאות}} בדף $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של פעולות יומן של $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|עדכן|עדכנה}} את התגיות בגרסה $4 של הדף $3 ({{PLURAL:$7|הוסיף|הוסיפה}} את $6; {{PLURAL:$9|הסיר|הסירה}} את $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|עדכן|עדכנה}} את התגיות ברשומת היומן $5 של הדף $3 ({{PLURAL:$7|הוסיף|הוסיפה}} את $6; {{PLURAL:$9|הסיר|הסירה}} את $8)",
        "rightsnone": "(כלום)",
-       "revdelete-summary": "תקציר העריכה",
        "rightslogentry-temporary-group": "$1 (זמני, עד $2)",
        "feedback-adding": "הוספת משוב לדף...",
        "feedback-back": "חזרה",
        "special-characters-group-thai": "תאית",
        "special-characters-group-lao": "לאו",
        "special-characters-group-khmer": "קמרית",
+       "special-characters-group-canadianaboriginal": "לשונות ילידיות קנדיות",
        "special-characters-title-endash": "קו מפריד",
        "special-characters-title-emdash": "קו מפריד ארוך",
        "special-characters-title-minus": "מינוס",
        "mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}",
        "mw-widgets-categoryselector-add-category-placeholder": "הוספת קטגוריה...",
        "mw-widgets-usersmultiselect-placeholder": "הוספת עוד...",
+       "date-range-from": "מתאריך:",
+       "date-range-to": "עד תאריך:",
        "sessionmanager-tie": "לא ניתן לצרף מספר סוגי אימות זהות: $1.",
        "sessionprovider-generic": "התחברויות של $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "התחברויות המבוססות על עוגיות",
        "log-action-filter-upload-upload": "העלאות של קבצים חדשים",
        "log-action-filter-upload-overwrite": "דריסות של קבצים קיימים",
        "authmanager-authn-not-in-progress": "האימות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
-       "authmanager-authn-no-primary": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\90×\9eת ×\90ת ×\94×\90×\99ש×\95ר×\99×\9d שסופקו.",
-       "authmanager-authn-no-local-user": "×\94×\90×\99ש×\95ר×\99×\9d שסופקו אינם שייכים לשום משתמש באתר זה.",
+       "authmanager-authn-no-primary": "×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\90×\9eת ×\90ת × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שסופקו.",
+       "authmanager-authn-no-local-user": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שסופקו אינם שייכים לשום משתמש באתר זה.",
        "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": "×\94×\90×\99ש×\95ר×\99×\9d שסופקו לא יכולים להיות בשימוש ביצירת חשבון.",
-       "authmanager-link-no-primary": "×\94×\90×\99ש×\95ר×\99×\9d ×©×¡×\95פק×\95 ×\9c×\90 ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94×\99×\95ת ×\91ש×\99×\9e×\95ש ×\91קישור חשבונות.",
+       "authmanager-create-no-primary": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שסופקו לא יכולים להיות בשימוש ביצירת חשבון.",
+       "authmanager-link-no-primary": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת ×©×¡×\95פק×\95 ×\9c×\90 ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94×\99×\95ת ×\91ש×\99×\9e×\95ש ×\9cש×\9d קישור חשבונות.",
        "authmanager-link-not-in-progress": "קישור החשבונות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
        "authmanager-authplugin-setpass-failed-title": "שינוי הסיסמה נכשל",
        "authmanager-authplugin-setpass-failed-message": "תוסף האימות דחה את שינוי הסיסמה.",
        "authpage-cannot-link-continue": "לא ניתן להמשיך בתהליך קישור החשבונות. כנראה שזמן ההמתנה של הפעולה חלף.",
        "cannotauth-not-allowed-title": "הגישה נדחתה",
        "cannotauth-not-allowed": "אינך מורשה להשתמש בדף זה",
-       "changecredentials": "ש×\99× ×\95×\99 ×\94×\90×\99ש×\95ר×\99×\9d",
-       "changecredentials-submit": "ש×\99× ×\95×\99 ×\94×\90×\99ש×\95ר×\99×\9d",
+       "changecredentials": "ש×\99× ×\95×\99 × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
+       "changecredentials-submit": "ש×\99× ×\95×\99 × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
        "changecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
-       "changecredentials-success": "×\94×\90×\99ש×\95ר×\99×\9d שלך שונו.",
-       "removecredentials": "×\94סרת ×\94×\90×\99ש×\95ר×\99×\9d",
-       "removecredentials-submit": "×\94סרת ×\94×\90×\99ש×\95ר×\99×\9d",
+       "changecredentials-success": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שלך שונו.",
+       "removecredentials": "×\94סרת × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
+       "removecredentials-submit": "×\94סרת × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת",
        "removecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
-       "removecredentials-success": "×\94×\90×\99ש×\95ר×\99×\9d שלך הוסרו.",
-       "credentialsform-provider": "ס×\95×\92 ×\94×\90×\99ש×\95ר×\99×\9d:",
+       "removecredentials-success": "נת×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת שלך הוסרו.",
+       "credentialsform-provider": "ס×\95×\92 × ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת:",
        "credentialsform-account": "שם החשבון:",
        "cannotlink-no-provider-title": "אין חשבונות שניתן לקשר",
        "cannotlink-no-provider": "אין חשבונות שניתן לקשר.",
        "restrictionsfield-label": "טווחי כתובות IP מותרים:",
        "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "גרסה $1",
-       "pageid": "מזהה דף $1"
+       "pageid": "מזהה דף $1",
+       "rawhtml-notallowed": "לא ניתן להשתמש בתגיות &lt;html&gt; מחוץ לדפים רגילים.",
+       "gotointerwiki": "עזיבת {{SITENAME}}",
+       "gotointerwiki-invalid": "הכותרת שצוינה אינה תקינה.",
+       "gotointerwiki-external": "{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} לעזוב את {{SITENAME}} כדי לבקר באתר הנפרד \"[[$2]]\".\n\n'''[$1 להמשך לכתובת $1]'''",
+       "undelete-cantedit": "אין באפשרותך לשחזר דף זה, כי אין באפשרותך לערוך אותו.",
+       "undelete-cantcreate": "אין באפשרותך לשחזר דף זה, כי אין דף קיים בשם זה ואין באפשרותך ליצור אותו."
 }
index 29e03e9..c261b10 100644 (file)
                        "NehalDaveND",
                        "Susant purohit",
                        "Jayprakash12345",
-                       "Dr. Shikha Jaggi"
+                       "Dr. Shikha Jaggi",
+                       "Shyamal",
+                       "SatyamMishra",
+                       "चक्रपाणी"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "tog-hideminor": "हाल में हुए परिवर्तन में छोटे बदलाव छिपाएँ",
        "tog-hidepatrolled": "हाल में हुए परिवर्तन में परीक्षित बदलाव छिपाएँ",
        "tog-newpageshidepatrolled": "नये पृष्ठों की सूची में परीक्षित पृष्ठ छिपाएँ",
-       "tog-hidecategorization": "पà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95ा à¤¶à¥\8dरà¥\87णà¥\80à¤\95रण à¤¹à¤\9fाà¤\8fà¤\81",
+       "tog-hidecategorization": "पà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95ा à¤¶à¥\8dरà¥\87णà¥\80à¤\95रण à¤\9bिपाà¤\8fà¤\82",
        "tog-extendwatchlist": "केवल हालिया ही नहीं, बल्कि सभी परिवर्तनों को दिखाने के लिए ध्यानसूची को विस्तारित करें",
        "tog-usenewrc": "हाल में हुए परिवर्तनों और ध्यानसूची में परिवर्तनों को पृष्ठ अनुसार समूहों में बाँटें",
        "tog-numberheadings": "शीर्षक स्व-क्रमांकित करें",
        "tog-showtoolbar": "सम्पादन उपकरण पट्टी दिखाएँ",
-       "tog-editondblclick": "दà¥\8bà¤\97à¥\81ना क्लिक पर पृष्ठ संपादित करें",
+       "tog-editondblclick": "डबल क्लिक पर पृष्ठ संपादित करें",
        "tog-editsectiononrightclick": "अनुभाग शीर्षक पर दायाँ क्लिक करने पर अनुभाग सम्पादित करें",
        "tog-watchcreations": "मेरे द्वारा निर्मित पृष्ठों और मेरी अपलोड की फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "tog-watchdefault": "मेरे द्वारा सम्पादित पृष्ठों और फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "underline-always": "सदैव",
        "underline-never": "कभी नहीं",
        "underline-default": "प्राथमिक त्वचा या ब्राउज़र",
-       "editfont-style": "समà¥\8dपादन à¤\95à¥\8dषà¥\87तà¥\8dर à¤\95à¥\80 à¤®à¥\81दà¥\8dरलिपि शैली:",
+       "editfont-style": "समà¥\8dपादन à¤\95à¥\8dषà¥\87तà¥\8dर à¤\95à¥\80 à¤«à¥\89नà¥\8dà¤\9f शैली:",
        "editfont-default": "प्राथमिक ब्राउज़र",
        "editfont-monospace": "एकल स्थल मुद्रलिपि",
        "editfont-sansserif": "बिना नोकों वाली मुद्रलिपि",
        "tagline": "{{SITENAME}} से",
        "help": "सहायता",
        "search": "खोज",
+       "search-ignored-headings": " #<!-- इस पंक्ति को जैसा है वैसा ही रहने दें। --> <pre>\n# शीर्षक, जिसे खोजते समय अनदेखा कर दिया जाता है।\n# इसमें कोई भी बदलाव तुरंत दिखाई देता है, जब वह शीर्षक इंडेक्स हो जाता है।\n# आप किसी पृष्ठ को फिर से इंडेक्स करने के लिए रिक्त सम्पादन कर सकते हैं।\n# इन चिन्हों का पालन करें:\n#   * हर चीज जो \"#\" से शुरू होता है, वह केवल टिप्पणी है।\n#   * हर बिना रिक्त पंक्ति एक सटीक शीर्षक है, जो रूप आदि हर चीज को अनदेखा कर देता है।\nसन्दर्भ\nबाहरी कड़ियाँ\nइन्हें भी देखें\n #</pre> <!-- इस पंक्ति को जैसा है वैसा ही रहने दें।  -->",
        "searchbutton": "खोजें",
        "go": "जाएँ",
        "searcharticle": "जाएँ",
        "databaseerror-query": "अनुरोध: $1",
        "databaseerror-function": "फ़ंक्शन: $1",
        "databaseerror-error": "त्रुटि: $1",
-       "transaction-duration-limit-exceeded": "à¤\85तà¥\8dयधिà¤\95 à¤¬à¥\8bà¤\9d à¤\95à¥\8b à¤\95म à¤\95रनà¥\87 à¤²à¤¿à¤\8f à¤¯à¤¹ à¤\95ारà¥\8dय à¤°à¥\8bà¤\95 à¤¦à¤¿à¤¯à¤¾ à¤\97या à¤¹à¥\88, à¤\95à¥\8dयà¥\8bà¤\82à¤\95ि à¤¯à¤¹ à¤²à¤¿à¤\96नà¥\87 à¤\95à¥\80 à¤\85वधि ($1) à¤¸à¥\87 à¤¬à¤¢à¤¼ à¤\95र $2 {{PLURAL:$2|सà¥\87à¤\95à¤\82ड|सà¥\87à¤\95à¤\82ड}} à¤\95à¥\8b à¤ªà¤¾à¤° à¤\95र à¤\97या।\nIf à¤¯à¤¦à¤¿ à¤\86प  à¤¬à¤¹à¥\81त à¤¸à¤¾à¤°à¥\87 à¤µà¤¸à¥\8dतà¥\81 à¤\95à¥\8b à¤\8fà¤\95 à¤¸à¤¾à¤¥ à¤¬à¤¦à¤² à¤°à¤¹à¥\87 à¤¹à¥\88à¤\82, à¤¤à¥\8b à¤\95à¥\83पया à¤\9bà¥\8bà¤\9fà¥\87 à¤¹à¥\8bतà¥\87 à¤°à¥\82प à¤®à¥\87à¤\82 à¤¬à¤¦à¤²ें।",
+       "transaction-duration-limit-exceeded": "à¤\89à¤\9aà¥\8dà¤\9a à¤ªà¥\8dरतिà¤\95à¥\83ति à¤\85à¤\82तराल à¤¨à¤¿à¤°à¥\8dमाण à¤¸à¥\87 à¤¬à¤\9aनà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f, à¤¯à¤¹ à¤®à¤¸à¥\8cदा à¤¨à¤¿à¤°à¤¸à¥\8dत à¤\95िया à¤\97या à¤\95à¥\8dयà¥\8bà¤\82à¤\95ि à¤²à¥\87à¤\96न à¤\95ाल ($1) à¤¦à¥\82सरà¥\80 à¤¸à¥\80मा $2 à¤\95à¥\8b à¤ªà¤¾à¤° à¤\95र à¤\97या।\nयदि à¤\86प à¤\95à¤\88 à¤\86यà¤\9fमà¥\8bà¤\82 à¤\95à¥\8b à¤\8fà¤\95 à¤¸à¤¾à¤¥ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतित à¤\95र à¤°à¤¹à¥\87 à¤¹à¥\88à¤\82 à¤¤à¥\8b à¤\87सà¤\95à¥\87 à¤¸à¥\8dथान à¤ªà¤° à¤\85धिà¤\95 à¤¸à¤\82à¤\96à¥\8dया à¤®à¥\87à¤\82 à¤\9bà¥\8bà¤\9fà¥\80 à¤¸à¤\82à¤\95à¥\8dरियायà¥\87à¤\82 à¤\95रें।",
        "laggedslavemode": "'''चेतावनी:''' यह पृष्ठ अद्यतनीत जानकारी-युक्त ना होने की आशंका है।",
        "readonly": "डाटाबेस लॉक किया हुआ है",
        "enterlockreason": "लॉक करने का कारण दीजिए, साथ ही लॉक खुलने के समय का लगभग आकलन दीजिये।",
        "title-invalid-magic-tilde": "निवेदित पृष्ठ का शीर्षक अवैध जादूई टिल्ड सिलसिला रखता है।",
        "title-invalid-too-long": "माँग किए गए पृष्ठ का शीर्षक बहुत लम्बा है। इसे यू०टी०एफ़० कोडिंग मे $1 {{PLURAL:$1|बाइट|बाइट्स}} से बढ़कर नहीं होना चाहिए और इसे यू०टी०एफ़०-८ एनकोडिंग में होना चाहिए।",
        "title-invalid-leading-colon": "निवेदित पृष्ठ का शीर्षक प्रारंभ में अवैध कोलन रखता है।",
-       "perfcached": "नीचे दिया हुआ डेटा कैशे मेमोरी से लिया हुआ है, अतः हो सकता है कि इसका पूर्ण अद्यतन न हुआ हो। कैशे मेमोरी में अधिकतम {{PLURAL:$1|एक  नतीजा|$1 नतीजे}} उपलब्ध हैं।",
-       "perfcachedts": "नीचे दिया हुआ डेटा कैशे मेमोरी से है, और इसका अंतिम अद्यतन $1 को हुआ था। कैशे मेमोरी में अधिकतम {{PLURAL:$4|एक  नतीजा|$4 नतीजे}} उपलब्ध हैं।",
+       "perfcached": "नीचे दिया हुआ डेटा कैश मेमोरी से लिया हुआ है, अतः हो सकता है कि इसका पूर्ण अद्यतन न हुआ हो। कैश मेमोरी में अधिकतम {{PLURAL:$1|एक  नतीजा|$1 नतीजे}} उपलब्ध हैं।",
+       "perfcachedts": "नीचे दिया हुआ डेटा कैश मेमोरी से है, और इसका अंतिम अद्यतन $1 को हुआ था। कैश मेमोरी में अधिकतम {{PLURAL:$4|एक  नतीजा|$4 नतीजे}} उपलब्ध हैं।",
        "querypage-no-updates": "इस पृष्ठ का नवीनीकरण करना मना है। अभी यहाँ के डाटा को ताज़ा नहीं कर सकते।",
        "viewsource": "स्रोत देखें",
        "viewsource-title": "$1 का स्रोत देखें",
        "createacct-yourpasswordagain-ph": "कूटशब्द पुनः लिखें",
        "userlogin-remembermypassword": "मुझे लॉग्ड इन रखें",
        "userlogin-signwithsecure": "सुरक्षित कनेक्शन का प्रयोग करें",
-       "cannotlogin-title": "à¤\85भà¥\80 à¤ªà¥\8dरवà¥\87श à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\8b à¤°à¤¹ा",
-       "cannotlogin-text": "पà¥\8dरवà¥\87श संभव नहीं है",
-       "cannotloginnow-title": "à¤\85भà¥\80 à¤ªà¥\8dरवà¥\87श à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\8b à¤°à¤¹à¤¾ à¤¹à¥\88",
-       "cannotloginnow-text": "$1 à¤\95ा à¤\89पयà¥\8bà¤\97 à¤\95रतà¥\87 à¤¸à¤®à¤¯ à¤ªà¥\8dरवà¥\87श नहीं हो सकता है।",
+       "cannotlogin-title": "लà¥\89à¤\97 à¤\87न à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cा à¤¸à¤\95ता",
+       "cannotlogin-text": "लà¥\89à¤\97 à¤\87न संभव नहीं है",
+       "cannotloginnow-title": "à¤\85भà¥\80 à¤²à¥\89à¤\97 à¤\87न à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cा à¤¸à¤\95ता",
+       "cannotloginnow-text": "$1 à¤\95ा à¤\89पयà¥\8bà¤\97 à¤\95रतà¥\87 à¤¸à¤®à¤¯ à¤²à¥\89à¤\97 à¤\87न नहीं हो सकता है।",
        "cannotcreateaccount-title": "खाता नहीं खोल सकते",
        "cannotcreateaccount-text": "सीधे खाता बनाना इस विकि में सक्रिय नहीं है।",
        "yourdomainname": "आपका डोमेन:",
        "password-change-forbidden": "आप इस विकि पर कूटशब्द नहीं बदल सकते हैं।",
        "externaldberror": "या तो प्रमाणिकरण डाटाबेस में त्रुटि हुई है या फिर आपको अपना बाह्य खाता अपडेट करने की अनुमति नहीं है।",
-       "login": "पà¥\8dरवà¥\87श",
+       "login": "लà¥\89à¤\97 à¤\87न",
        "login-security": "अपनी पहचान सत्यापित करें",
        "nav-login-createaccount": "सत्रारंभ / खाता खोलें",
-       "userlogin": "सत्रारंभ / खाता खोलें",
-       "userloginnocreate": "लॉग इन",
        "logout": "प्रस्थान करें",
        "userlogout": "प्रस्थान करें",
        "notloggedin": "लॉग इन नहीं किया है",
        "userlogin-noaccount": "खाता नहीं है?",
        "userlogin-joinproject": "{{SITENAME}} से जुड़ें",
-       "nologin": "क्या आपने सदस्यता नहीं ली है? '''$1'''।",
-       "nologinlink": "नया खाता बनाएँ",
        "createaccount": "खाता बनाएँ",
-       "gotaccount": "पहले से आपका खाता है? '''$1''' करें।",
-       "gotaccountlink": "प्रवेश करें",
-       "userlogin-resetlink": "अपनी प्रवेश जानकारी भूल गए हैं?",
        "userlogin-resetpassword-link": "अपना पासवर्ड भूल गए?",
        "userlogin-helplink2": "लॉग इन करने में सहायता",
        "userlogin-loggedin": "आप {{GENDER:$1|$1}} के रूप में पहले से लॉग्ड इन हैं।\nकिसी अन्य सदस्य के रूप में लॉग इन करने के लिए निम्नलिखित फ़ॉर्म का प्रयोग करें।",
-       "userlogin-reauth": "à¤\86प {{GENDER:$1|$1}} à¤¹à¥\8b, à¤\87सà¤\95à¥\87 à¤²à¤¿à¤\8f à¤\86पà¤\95à¥\8b à¤\8fà¤\95 à¤\94र à¤¬à¤¾à¤° à¤\96ातà¥\87 à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श करना होगा।",
+       "userlogin-reauth": "à¤\86प {{GENDER:$1|$1}} à¤¹à¥\8b, à¤\87सà¤\95à¥\87 à¤²à¤¿à¤\8f à¤\86पà¤\95à¥\8b à¤\8fà¤\95 à¤\94र à¤¬à¤¾à¤° à¤\96ातà¥\87 à¤®à¥\87à¤\82 à¤²à¥\89à¤\97 à¤\87न करना होगा।",
        "userlogin-createanother": "एक अन्य खाता खोलें",
        "createacct-emailrequired": "ई-मेल पता",
        "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
        "createacct-email-ph": "अपना ई-मेल पता लिखें",
        "createacct-another-email-ph": "ईमेल पता प्रदान करें",
-       "createaccountmail": "à¤\8fà¤\95 à¤\85सà¥\8dथायà¥\80 à¤¯à¤¾à¤¦à¥\83à¤\9aà¥\8dà¤\9bिà¤\95 (रà¥\88à¤\82डम) à¤\95à¥\82à¤\9fशबà¥\8dद चुनें और उसे निर्दिष्ट ई-मेल पते पर भेजें",
+       "createaccountmail": "à¤\8fà¤\95 à¤\85सà¥\8dथायà¥\80 à¤°à¥\88à¤\82डम à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड चुनें और उसे निर्दिष्ट ई-मेल पते पर भेजें",
        "createaccountmail-help": "इसका उपयोग बिना पासवर्ड जाने किसी और के लिए खाता खोलने के लिए उपयोग किया जाता है।",
        "createacct-realname": "असली नाम (वैकल्पिक)",
-       "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आप एक अन्य खाता क्यों बना रहे हैं",
        "createacct-reason-help": "खाता निर्माण लॉग में यह सन्देश दिखाई देगा।",
        "nocookiesnew": "आपका खाता खोल दिया गया है, पर आप लॉग इन नहीं हुए हैं।\n{{SITENAME}} पर लॉग इन करने के लिये कुकीज़ का प्रयोग होता है।\nआपने कुकीज़ अक्षम कर रखी हैं।\nकृपया अपने ब्राउज़र में कुकीज़ सक्षम करें, और फिर अपने सदस्यनाम एवं कूटशब्द से लॉग इन करें।",
        "nocookieslogin": "{{SITENAME}} पर लॉग इन करने के लिये कुकीज़ का प्रयोग होता है।\nआपने कुकीज़ अक्षम कर रखी हैं।\nकृपया अपने ब्राउज़र में कुकीज़ सक्षम करें और फिर पुनः कोशिश करें।",
        "nocookiesfornew": "स्रोत की पुष्टि ना हो पाने के कारण यह खाता निर्मित नहीं किया गया। \nसुनिश्चित करें कि आपने कुकीज़ सक्षम की हैं, पृष्ठ को पुनः लोड करें और पुनः प्रयास करें।",
+       "createacct-loginerror": "खाता सफलतापूर्वक निर्मित किया गया लेकिन आप स्वतः लॉग-इन नहीं कर सके। कृपया [[Special:UserLogin|हाथ से]] लॉग-इन करें।",
        "noname": "आपने वैध सदस्यनाम नहीं दिया है।",
-       "loginsuccesstitle": "पà¥\8dरवà¥\87श à¤¹à¥\81à¤\86",
+       "loginsuccesstitle": "लà¥\89à¤\97à¥\8dड-à¤\87न",
        "loginsuccess": "'''आप {{SITENAME}} में \"$1\" सदस्यनाम से लॉग इन हो {{GENDER:$1|चुके|चुकी|चुके}} हैं।'''",
        "nosuchuser": "यहाँ \"$1\" नाम का कोई सदस्य नहीं है।\nसदस्यनाम में लघु और दीर्घ अक्षरों से फ़र्क पड़ता है।\nअपनी वर्तनी जाँचें, या [[Special:CreateAccount|नया खाता खोलें]]।",
        "nosuchusershort": "\"$1\" नाम का कोई सदस्य नहीं है।\nकृपया अपनी दी हुई वर्तनी जाँचें।",
        "eauthentsent": "दर्ज किये हुए ई-मेल पते पर एक सत्यापन ई-मेल भेजा दिया गया है।\nआपको उस ई-मेल में दिये हुए निर्देशों के अनुसार ई-मेल पते का सत्यापन करना होगा, उसके पश्चात ही यहाँ से कोई दूसरा ई-मेल भेजा जाएगा।",
        "throttled-mailpassword": "पिछले {{PLURAL:$1|एक घंटे|$1 घंटों}} के दरमियान एक कूटशब्द स्मरण-पत्र भेजा जा चुका है।\nदुरुपयोग से बचाव के लिए हर {{PLURAL:$1|एक घंटे|$1 घंटों}} में एक कूटशब्द स्मरण-पत्र ही भेजा जाता है।",
        "mailerror": "ई-मेल भेजने में त्रुटि: $1",
-       "acct_creation_throttle_hit": "à¤\86पà¤\95à¥\87 à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¥\87 à¤¸à¥\87 à¤\86à¤\8f à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤ªà¤¿à¤\9bलà¥\87 à¤\9aà¥\8cबà¥\80स à¤\98à¤\82à¤\9fà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤\87स à¤µà¤¿à¤\95ि à¤ªà¤° {{PLURAL:$1|à¤\8fà¤\95 à¤\96ाता|$1 à¤\96ातà¥\87}} à¤¬à¤¨à¤¾ à¤\9aà¥\81à¤\95à¥\87 à¤¹à¥\88à¤\82, à¤\87स à¤¸à¤®à¤¯à¤¾à¤µà¤§à¤¿ à¤®à¥\87à¤\82 à¤¯à¤¹à¥\80 à¤\85धिà¤\95तम à¤¸à¥\80मा à¤¹à¥\88।\nà¤\85तà¤\83 à¤\87स à¤¸à¤®à¤¯ à¤\87स à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¥\87 à¤\95ा à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रनà¥\87 à¤µà¤¾à¤²à¥\87 à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤\94र à¤\96ातà¥\87 à¤¨à¤¹à¥\80à¤\82 à¤\96à¥\8bल à¤¸à¤\95à¥\87à¤\82à¤\97े।",
+       "acct_creation_throttle_hit": "à¤\87स à¤µà¤¿à¤\95ि à¤\95à¥\87 à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤\87स à¤\86à¤\87॰पà¥\80॰ à¤\95à¥\8b à¤\95ाम à¤®à¥\87à¤\82 à¤²à¥\87तà¥\87 à¤¹à¥\81यà¥\87 à¤ªà¤¿à¤\9bलà¥\87 $2 à¤®à¥\87à¤\82 {{PLURAL:$1|१ à¤\96ाता à¤¨à¤¿à¤°à¥\8dमित à¤\95िया|$1 à¤\96ातà¥\87 à¤¨à¤¿à¤°à¥\8dमित à¤\95र à¤\9aà¥\81à¤\95à¥\87 à¤¹à¥\88à¤\82}} à¤\9cà¥\8b à¤\95ि à¤\87स à¤¸à¤®à¤¯ à¤®à¥\87à¤\82 à¤\85धिà¤\95तम à¤\85नà¥\81मत à¤¸à¥\80मा à¤¹à¥\88।\nà¤\87सà¤\95à¥\87 à¤ªà¤°à¤¿à¤£à¤¾à¤®à¤¸à¥\8dवरà¥\82प, à¤\87स à¤\86à¤\87॰पà¥\80॰ à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रनà¥\87 à¤µà¤¾à¤²à¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤\87स à¤¸à¤®à¤¯ à¤\94र à¤\96ातà¥\87 à¤¨à¤¿à¤°à¥\8dमित à¤¨à¤¹à¥\80à¤\82 à¤\95र à¤¸à¤\95ते।",
        "emailauthenticated": "आपका ई-मेल पता $2 को $3 बजे सत्यापित किया गया।",
        "emailnotauthenticated": "आपके ई-मेल पते की पुष्टि नहीं हुई है।\nनीचे दी किसी भी सुविधा के लिये आपको ई-मेल नहीं भेजा जाएगा।",
        "noemailprefs": "इन सुविधाओं का प्रयोग करने के लिये अपनी वरीयताओं में ई-मेल पता दें।",
        "createaccount-title": "{{SITENAME}} के लिये खाता बनाएँ",
        "createaccount-text": "आपके ई-मेल पते के लिये किसी ने {{SITENAME}} ($4) पर \"$2\" सदस्य नाम से \"$3\" कूटशब्द (पासवर्ड) सहित खाता खोला है।\nआपको लॉग इन कर के अपना कूटशब्द (पासवर्ड) तुरंत बदल लेना चाहिये।\n\nयदि यह खाता गलती से खोला गया है, तो आप इस मेसेज को नज़रंदाज़ कर सकते हैं।",
        "login-throttled": "आपने हाल ही में कई बार लॉग इन करने के प्रयास किये हैं।\nपुनः प्रयास करने से पहले कृपया $1 प्रतीक्षा करें।",
-       "login-abort-generic": "à¤\86पà¤\95ा à¤ªà¥\8dरवà¥\87श असफल हुआ - रोका गया",
+       "login-abort-generic": "à¤\86पà¤\95ा à¤²à¥\89à¤\97 à¤\87न असफल हुआ - रोका गया",
        "login-migrated-generic": "आपका खाता माइग्रेट हो गया है और आपका सदस्यनाम इस विकी पर अब मौजूद नहीं है।",
        "loginlanguagelabel": "भाषा: $1",
-       "suspicious-userlogout": "à¤\85पका लॉग आउट करने का अनुरोध अस्वीकृत कर दिया गया है क्योंकि ऐसा प्रतीत होता है कि यह किसी खराब ब्राउज़र या कैश करने वाली प्रॉक्सी द्वारा भेजा गया था।",
+       "suspicious-userlogout": "à¤\86पका लॉग आउट करने का अनुरोध अस्वीकृत कर दिया गया है क्योंकि ऐसा प्रतीत होता है कि यह किसी खराब ब्राउज़र या कैश करने वाली प्रॉक्सी द्वारा भेजा गया था।",
        "createacct-another-realname-tip": "असली नाम देना आवश्यक नहीं है।\nयदि आप प्रदान करते हैं तो इसका प्रयोग सदस्य के योगदानों के लिये उनको श्रेय (attribution) देने के लिये किया जायेगा।",
        "pt-login": "लॉग इन",
        "pt-login-button": "लॉग इन",
-       "pt-login-continue-button": "पà¥\8dरवà¥\87श जारी रखें",
+       "pt-login-continue-button": "लà¥\89à¤\97 à¤\87न जारी रखें",
        "pt-createaccount": "खाता बनाएँ",
        "pt-userlogout": "लॉगआउट",
        "php-mail-error-unknown": "PHP के mail() फ़ंक्शन में अज्ञात त्रुटि हुई।",
        "botpasswords-label-delete": "हटाएँ",
        "botpasswords-label-resetpassword": "पासवर्ड पुनः तय करें",
        "botpasswords-label-grants": "अनुदान आवेदन:",
-       "botpasswords-help-grants": "हर à¤\85नà¥\81दान à¤\9cà¥\8b à¤¸à¤¦à¤¸à¥\8dय à¤\85धिà¤\95ार à¤®à¥\87à¤\82  à¤ªà¤¹à¤²à¥\87 à¤¸à¥\87 à¤\86ता à¤¹à¥\88, à¤\89सà¥\87 à¤\85धिà¤\95ार à¤¤à¤\95 à¤ªà¤¹à¥\81à¤\81à¤\9a à¤¦à¥\87ता à¤¹à¥\88।  à¤¦à¥\87à¤\96à¥\87à¤\82 : [[Special:ListGrants|à¤\85नà¥\81दान à¤¸à¤¾à¤°à¤£à¥\80]]",
+       "botpasswords-help-grants": "à¤\85नà¥\81दान à¤\86पà¤\95à¥\8b à¤\85धिà¤\95ारà¥\8bà¤\82 à¤¤à¤\95 à¤ªà¤¹à¥\81à¤\81à¤\9aनà¥\87 à¤¦à¥\87ता à¤¹à¥\88, à¤\9cà¥\8b à¤\86पà¤\95à¥\87 à¤\96ातà¥\87 à¤\95à¥\87 à¤ªà¤¾à¤¸ à¤ªà¤¹à¤²à¥\87 à¤¸à¥\87 à¤¹à¥\88। à¤\85नà¥\81दान à¤\95à¥\8b à¤¸à¤\95à¥\8dरिय à¤\95रनà¥\87 à¤¸à¥\87 à¤\95à¥\8bà¤\88 à¤\85धिà¤\95ार à¤ªà¥\8dरापà¥\8dत à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\8bà¤\97ा, à¤\9cà¥\8b à¤\86पà¤\95à¥\87 à¤\96ातà¥\87 à¤®à¥\87à¤\82 à¤¨ à¤¹à¥\8b। à¤\85धिà¤\95 à¤\9cानà¤\95ारà¥\80 à¤\95à¥\87 à¤²à¤¿à¤\8f [[Special:ListGrants|à¤\85नà¥\81दान à¤¸à¤¾à¤°à¤£à¥\80]] à¤¦à¥\87à¤\96à¥\87à¤\82।",
        "botpasswords-label-grants-column": "प्रदान किया",
        "botpasswords-bad-appid": "बॉट नाम \"$1\" मान्य नहीं है।",
        "botpasswords-insert-failed": "बॉट नाम \"$1\" को जोड़ने में विफल हुआ। क्या यह पहले से है?",
        "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\") नहीं है।",
        "preview": "झलक",
        "showpreview": "झलक दिखाएँ",
        "showdiff": "बदलाव दिखाएँ",
-       "blankarticle": "<strong>चेतावनी:</strong> आप एक रिक्त पृष्ठ का निर्माण कर रहे हैं।\nयदि आप \"{{int:savearticle}}\" को पुनः दबाते हैं तो पृष्ठ को बिना किसी सामग्री के निर्मित किया जाएगा।",
+       "blankarticle": "<strong>चेतावनी:</strong> आप एक रिक्त पृष्ठ का निर्माण कर रहे हैं।\nयदि आप \"$1\" को फिर से दबाते हैं तो बिना सामग्री का पृष्ठ निर्मित हो जाएगा।",
        "anoneditwarning": "<strong>सावधान:</strong> आपने सत्रारंभ नहीं किया है। यदि आप सम्पादन करते हैं तो इस पृष्ठ के संपादन इतिहास में आपका आइ॰पी पता अंकित किया जाएगा। यदि आप <strong>[$1 लॉगिन]</strong> करते हैं अथवा <strong>[$2 खाता बनाते हैं]</strong> तो अन्य सुविधाओं के साथ-साथ आपके संपादनों का श्रेय आपके सदस्यनाम पर दिया जाएगा।",
        "anonpreviewwarning": "''आप लॉग्ड इन नहीं हैं। पृष्ठ सहेजने पर आपका आइ॰पी पता इस पृष्ठ के इतिहास में दर्ज किया जायेगा।''",
-       "missingsummary": "'''à¤\85नà¥\81सà¥\8dमारà¤\95:''' à¤\86पनà¥\87 à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¨à¤¹à¥\80à¤\82 à¤¦à¤¿à¤¯à¤¾ à¤¹à¥\88।\nà¤\85à¤\97र à¤\86प à¤¦à¥\81बारा \"{{int:savearticle}}\" à¤ªà¤° à¤\95à¥\8dलिà¤\95 à¤\95रतà¥\87 à¤¹à¥\88à¤\82 à¤¤à¥\8b à¤\86पà¤\95ा à¤¸à¤\82पादन à¤¬à¤¿à¤¨à¤¾ à¤¸à¤¾à¤°à¤¾à¤\82श à¤\95à¥\87 à¤¸à¤\82à¤\9cà¥\8bया जायेगा।",
-       "selfredirect": "<strong>चेतावनी:</strong> आप खुद को इस पेज पुनः निर्देशित कर रहे हैं।\nआप अनुप्रेषित के लिए गलत लक्ष्य निर्दिष्ट हो सकता है, या आप गलत पृष्ठ का संपादन किया जा सकता है।\nआप फिर से \"{{int:savearticle}}\" क्लिक करते हैं, रीडायरेक्ट वैसे भी बनाया जाएगा।",
+       "missingsummary": "'''सà¥\82à¤\9aना:''' à¤\86पनà¥\87 à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¨à¤¹à¥\80à¤\82 à¤¦à¤¿à¤¯à¤¾ à¤¹à¥\88।\nà¤\85à¤\97र à¤\86प à¤¦à¥\81बारा \"$1\" à¤ªà¤° à¤\95à¥\8dलिà¤\95 à¤\95रतà¥\87 à¤¹à¥\88à¤\82 à¤¤à¥\8b à¤\86पà¤\95ा à¤¸à¤\82पादन à¤¬à¤¿à¤¨à¤¾ à¤¸à¤¾à¤°à¤¾à¤\82श à¤\95à¥\87 à¤¸à¤¹à¥\87à¤\9cा जायेगा।",
+       "selfredirect": "<strong>चेतावनी:</strong> आप खुद को इस पेज पुनः निर्देशित कर रहे हैं।\nआप अनुप्रेषित के लिए गलत लक्ष्य निर्दिष्ट हो सकता है, या आप गलत पृष्ठ का संपादन किया जा सकता है।\nआप फिर से \"$1\" क्लिक करते हैं, रीडायरेक्ट वैसे भी बनाया जाएगा।",
        "missingcommenttext": "कृपया नीचे टिप्पणी दें।",
-       "missingcommentheader": "'''अनुस्मारक:''' आपने इस टिप्पणी का कोई शीर्षक नहीं दिया है।\nअगर आप \"{{int:savearticle}}\" पर दोबारा क्लिक करते हैं तो आपके बदलाव बिना शीर्षक के संजोये जायेंगे।",
+       "missingcommentheader": "'''अनुस्मारक:''' आपने इस टिप्पणी का कोई शीर्षक नहीं दिया है।\nअगर आप \"$1\" पर दोबारा क्लिक करते हैं तो आपके बदलाव बिना शीर्षक के संजोये जायेंगे।",
        "summary-preview": "सारांश की झलक:",
        "subject-preview": "विषय की झलक:",
        "previewerrortext": "आपके परिवर्तनों का पूर्वावलोकन करने का प्रयास करते समय एक त्रुटि हुई।",
        "editingsection": "$1 सम्पादन (अनुभाग)",
        "editingcomment": "$1 सम्पादन (नया अनुभाग)",
        "editconflict": "संपादन अंतर्विरोध: $1",
-       "explainconflict": "आपके द्वारा सम्पादन शुरू करने के बाद से किसी अन्य व्यक्ति ने इस पृष्ठ में बदलाव किये हैं।\nऊपरी पाठ सम्पादन क्षेत्र में वर्तमान पाठ दर्शाया गया है।\nनिछले क्षेत्र में आपके बदलाव दर्शाये गये हैं।\nआपको अपने बदलाव वर्तमान पाठ में स्वयं एकत्रित करने होंगे।\nआपके \"{{int:savearticle}}\" पर क्लिक करने पर '''केवल''' ऊपरी क्षेत्र में दिखने वाला पाठ संजोया जायेगा।",
+       "explainconflict": "आपके द्वारा सम्पादन शुरू करने के बाद से किसी अन्य व्यक्ति ने इस पृष्ठ में बदलाव किये हैं।\nऊपरी पाठ सम्पादन क्षेत्र में वर्तमान पाठ दर्शाया गया है।\nनिछले क्षेत्र में आपके बदलाव दर्शाये गये हैं।\nआपको अपने बदलाव वर्तमान पाठ में स्वयं एकत्रित करने होंगे।\nआपके \"$1\" पर क्लिक करने पर '''केवल''' ऊपरी क्षेत्र में दिखने वाला पाठ संजोया जायेगा।",
        "yourtext": "आपका पाठ",
        "storedversion": "संजोया हुआ अवतरण",
        "nonunicodebrowser": "'''सावधान: आपका ब्राउज़र युनिकोड को स्वीकार नहीं करता है।'''\nआपके द्वारा सुयोग्य संपादन होने के लिये: ग़ैर-ASCII कैरैक्टर षट्‍पदी कोड (hexadecimal) में दर्शाए जायेंगे।",
        "readonlywarning": "<strong>सावधान: डाटाबेस को रख-रखाव के लिये बंद कर दिया गया है, इसलिये अभी आपके बदलाव संजोए नहीं जा सकते।\nअगर आप चाहें तो इस सामग्री को बाद के लिए कॉपी-पेस्ट कर के किसी टेक्स्ट फ़ाइल में रख सकते हैं।</strong>\n\nबंद करने वाले कार्यकारी प्रबंधक ने बंद करने का यह कारण दिया है: $1",
        "protectedpagewarning": "'''चेतावनी: इस पृष्ठ को सुरक्षित कर दिया गया है और इसे केवल प्रबंधक ही सम्पादित कर सकते हैं।'''\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:",
        "semiprotectedpagewarning": "'''सूचना:''' यह पृष्ठ सुरक्षित कर दिया गया है और इसे केवल पंजीकृत सदस्य ही सम्पादित कर सकते हैं।\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:",
-       "cascadeprotectedwarning": "'''सावधान:''' यह पृष्ठ निम्नलिखित सुरक्षा-सीढ़ी {{PLURAL:$1|पृष्ठ से|पन्नों से}} जुड़ा हुआ होने के कारण सुरक्षित है, और केवल प्रबंधक ही इसमें बदलाव कर सकते हैं:",
+       "cascadeprotectedwarning": "<strong>सावधान:</strong> यह पृष्ठ निम्नलिखित सुरक्षा-सीढ़ी वाले {{PLURAL:$1|पृष्ठ से|पन्नों से}} जुड़ा हुआ होने के कारण सुरक्षित है, और केवल [[Special:ListGroupRights|आवश्यक अधिकार वाले]] ही इसमें बदलाव कर सकते हैं:",
        "titleprotectedwarning": "'''चेतावनी: यह पृष्ठ सुरक्षित है और इसे बनाने के लिये [[Special:ListGroupRights|विशेष अधिकारों]] की आवश्यकता है।'''\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:",
        "templatesused": "इस पृष्ठ पर प्रयुक्त {{PLURAL:$1|साँचा|साँचे}}:",
        "templatesusedpreview": "इस झलक में प्रयुक्त {{PLURAL:$1|साँचा|साँचे}}:",
        "content-json-empty-object": "रिक्त ऑब्जेक्ट",
        "content-json-empty-array": "रिक्त ऐरे",
        "deprecated-self-close-category": "अवैध एचटीएमएल टैग का उपयोग कर रहे पृष्ठ",
+       "deprecated-self-close-category-desc": "इस पृष्ठ में स्वयं-बंद ऍचटीएमएल चिप्पियाँ समाहित हैं जैसे <code>&lt;b/></code> अथवा <code>&lt;span/></code> आदि। इनका व्यवहार जल्दी ही ऍचटीएमएल५ विनिर्देशों के अनुरूप परिवर्तित हो जायेगा अतः विकि-पाठ में इनके प्रयोग को न करने की सलाह दी जाती है।",
        "duplicate-args-warning": "<strong>चेतावनी:</strong> [[:$1]] प्राचल \"$3\" के लिए [[:$2]] को एक से अधिक बार काम में ले रहा है। केवल अन्त में दिया गया मान ही काम में लिया जायेगा।",
        "duplicate-args-category": "टेम्पलेट कॉल में डुप्लिकेट तर्क का उपयोग करते हुए पन्ने",
        "duplicate-args-category-desc": "पेज जैसे तर्कों के डुप्लिकेट का उपयोग करने वाले टेम्पलेट कॉल, जैसे <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> और <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "post-expand-template-argument-warning": "'''चेतावनी:''' इस पृष्ठ पर किसी साँचे में कम-से-कम एक ऐसा प्राचल है जो बढ़ाने पर बहुत बड़ा हो जायेगा।\nऐसे प्राचलों को छोड़ दिया गया है।",
        "post-expand-template-argument-category": "ऐसे पृष्ठ जिनमें प्राचल छोड़े गये हैं",
        "parser-template-loop-warning": "साँचा चक्र मिला: [[$1]]",
+       "template-loop-category": "टेम्पलेट लूप वाले पेज",
+       "template-loop-category-desc": "पृष्ठ में एक टेम्पलेट लूप है, अर्थात। एक टेम्पलेट जो स्वयं को पुनरावर्ती रूप से कॉल करता है",
        "parser-template-recursion-depth-warning": "साँचा पुनरावर्ती गहराई सीमा पार ($1)",
        "language-converter-depth-warning": "भाषा कन्वर्टर गहराई सीमा से बाहर गया ( $1 )",
        "node-count-exceeded-category": "पृष्ठ जिनमें नोड-संख्या सीमा पार की गई है",
        "page_first": "पहला",
        "page_last": "आखिरी",
        "histlegend": "अन्तर चयन: अन्तर देखने के लिए पुराने अवतरणों के आगे दिए गए रेडियो बॉक्स पर क्लिक करें तथा एण्टर करें अथवा नीचे दिए हुए बटन पर क्लिक करें<br />\nलिजण्ड: (चालू) = सद्य अवतरण के बीच में अन्तर,\n(आखिरी) = पिछले अवतरण के बीच में अन्तर, छो = छोटा बदलाव।",
-       "history-fieldset-title": "à¤\87तिहास à¤\95ा à¤µà¤¿à¤\9aरण à¤\95रें",
-       "history-show-deleted": "सà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\95à¥\87वल à¤\9bà¥\81पाà¤\8f à¤¹à¥\81à¤\8f à¤\85वतरण à¤¦à¤¿à¤\96ाà¤\8fà¤\81",
+       "history-fieldset-title": "à¤\85वतरण à¤¹à¥\87तà¥\81 à¤\96à¥\8bà¤\9cें",
+       "history-show-deleted": "हà¤\9fायà¥\87 à¤\97à¤\8f à¤\85वतरण à¤¹à¥\80",
        "histfirst": "सबसे पुराना",
        "histlast": "सबसे नया",
        "historysize": "($1 {{PLURAL:$1|बाइट}})",
        "search-file-match": "(फ़ाइल सामग्री से मेल खाता है)",
        "search-suggest": "कहीं आपका मतलब $1 तो नहीं था?",
        "search-rewritten": "$1 का परिणाम दिखा रहा है। यह $2 हेतु खोज रहा है।",
-       "search-interwiki-caption": "अन्य प्रकल्प",
+       "search-interwiki-caption": "अन्य प्रकल्पों से परिणाम",
        "search-interwiki-default": "$1 से परिणाम:",
        "search-interwiki-more": "(और)",
        "search-interwiki-more-results": "अधिक परिणाम",
        "prefs-help-recentchangescount": "इसमें हाल के बदलाव, पृष्ठ इतिहास व लॉग शामिल हैं।",
        "prefs-help-watchlist-token2": "यह आपकी ध्यानसूची की वेब फ़ीड की गोपनीय चाबी है।\nयह जिसके भी पास होगी वह आपकी ध्यानसूची पढ़ सकेगा, इसिलए इसे किसी के साथ बांटियेगा नहीं।\n[[Special:ResetTokens|इसे रीसेट करने के लिए यहाँ क्लिक करें]]।",
        "savedprefs": "आपकी वरीयताएँ संजोई गई हैं।",
-       "savedrights": "पà¥\8dरयà¥\8bà¤\95à¥\8dता {{GENDER:$1|$1}} का सदस्य अधिकार सहेजा गया।",
+       "savedrights": "सदसà¥\8dय {{GENDER:$1|$1}} का सदस्य अधिकार सहेजा गया।",
        "timezonelegend": "समयमंडल:",
        "localtime": "स्थानीय समय:",
        "timezoneuseserverdefault": "विकि मूल का उपयोग करें ($1)",
        "prefs-help-prefershttps": "यह वरीयता आपके अगले लॉगिन पर प्रभावी होगी।",
        "prefswarning-warning": "आपने अपनी वरीयताओं में एैसे परिवर्तन किए हैं जिन्हे अभी तक संचित नहीं किया गया है। अगर अाप \"$1\" पर बिना क्लिक किये इस पृष्ठ को छोड़ देते हैं तो अापकी वरीयताओं का अद्यतन नहीं किया जाएगा।",
        "prefs-tabs-navigation-hint": "सुझाव: आप टैब्स सूची में टैब्स के बीच आवागमन करने के लिए बाएँ और दाएँ तीर कुंजियों का उपयोग कर सकते हैं।",
-       "userrights": "सदस्य अधिकार व्यवस्थापन",
+       "userrights": "सदस्य अधिकार",
        "userrights-lookup-user": "सदस्य चुनें",
        "userrights-user-editname": "सदस्यनाम दें:",
-       "editusergroup": "{{GENDER:$1|सदस्य}} समूहों का संपादन करें",
+       "editusergroup": "सदस्य समूह दिखायें",
        "editinguser": "सदस्य '''[[User:$1|$1]]''' $2 के अधिकार बदलें\n{{GENDER:$1|सदस्य}} के सदस्य अधिकार बदले जा रहे हैं <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "{{GENDER:$1|user}} के उपयोगकर्ता अधिकारों को देखना <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "सदस्य समूहों का संपादन करें",
-       "userrights-viewusergroup": "सदस्य समूह देखें",
+       "userrights-viewusergroup": "{{GENDER:$1|सदस्य}} समूह देखें",
        "saveusergroups": "{{GENDER:$1|सदस्य}} समूह सहेजें",
        "userrights-groupsmember": "निम्न {{PLURAL:$1|समूह|समूहों}} का सदस्य:",
        "userrights-groupsmember-auto": "निम्न {{PLURAL:$1|समूह|समूहों}} का अंतर्निहित सदस्य:",
-       "userrights-groups-help": "आप इस सदस्य की समूह-सदस्यता बदल सकते हैं:\n* बक्से पर सही का निशान लगे होने का अर्थ है कि सदस्य उस समूह में है।\n* बक्से पर सही का निशान न लगे होने का अर्थ है कि सदस्य उस समूह में नहीं है।\n* एक * का अर्थ है कि एक बार जोड़ने के बाद वह समूह हटा नहीं सकते हैं, और हटाने के बाद जोड़ नहीं सकते हैं।",
+       "userrights-groups-help": "आप इस सदस्य की समूह-सदस्यता बदल सकते हैं:\n* बक्से पर सही का निशान लगे होने का अर्थ है कि सदस्य उस समूह में है।\n* बक्से पर सही का निशान न लगे होने का अर्थ है कि सदस्य उस समूह में नहीं है।\n* एक * का अर्थ है कि एक बार जोड़ने के बाद वह समूह हटा नहीं सकते हैं, और हटाने के बाद जोड़ नहीं सकते हैं।\n* एक # सूचित करता है कि आप केवल इस समूह सदस्यता के समाप्ति समय को वापस रख सकते हैं; आप इसे आगे नहीं बढ़ा सकते हैं",
        "userrights-reason": "कारण:",
        "userrights-no-interwiki": "आपको अन्य विकियों पर सदस्य अधिकार बदलने की अनुमति नहीं हैं।",
        "userrights-nodatabase": "डाटाबेस $1 या तो मौजूद नहीं है या फिर स्थानीय नहीं है।",
        "userrights-expiry-current": "समाप्ती $1",
        "userrights-expiry-none": "समाप्त नहीं होता",
        "userrights-expiry": "समाप्ति:",
+       "userrights-expiry-existing": "वर्तमान समाप्ति समय: $3, $2",
        "userrights-expiry-othertime": "अन्य समय:",
        "userrights-expiry-options": "एक दिन:1 day,एक सप्ताह:1 week,एक महीना:1 month,तीन महीने:3 months,छः महीने:6 months,एक वर्ष:1 year",
        "userrights-invalid-expiry": "\"$1\" समूह के लिए समाप्ती तिथि अमान्य है।",
        "userrights-expiry-in-past": "\"$1\" समूह हेतु समाप्ती का समय पहले ही बीत चुका है।",
+       "userrights-cannot-shorten-expiry": "आप \"$1\" समूह की समाप्ति को आगे नहीं बढ़ा सकते हैं। केवल इस समूह में जोड़ने और निकालने की अनुमति वाले सदस्य ही समाप्ति समय को आगे बढ़ा सकते हैं।",
        "userrights-conflict": "सदस्य अधिकार बदलावों में अंतर्विरोध! कृपया अपने बदलाव जाँचें और पुनः सुनिश्चित करें।",
        "group": "समूह:",
        "group-user": "सदस्य",
        "right-editsemiprotected": "उन पृष्ठों को सम्पादित करें जिनका सुरक्षा स्तर है \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "एक पेज की सामग्री मॉडल को संपादित।",
        "right-editinterface": "सॉफ़्टवेयर इंटरफ़ेस सम्पादित करें",
-       "right-editusercssjs": "अन्य सदस्यों के सी॰एस॰एस और जावास्क्रिप्ट पृष्ठ सम्पादित करें",
        "right-editusercss": "अन्य सदस्यों के सी॰एस॰एस पृष्ठ सम्पादित करें",
        "right-edituserjs": "अन्य सदस्यों के जावास्क्रिप्ट पृष्ठ सम्पादित करें",
        "right-editmyusercss": "अपनी सदस्य स्तर की सी॰एस॰एस फ़ाइलें सम्पादित करें",
        "action-upload_by_url": "यू॰आर॰एल से इस फ़ाइल को चढ़ाने",
        "action-writeapi": "लेखन ए॰पी॰आई का प्रयोग करने",
        "action-delete": "इस पृष्ठ को हटाने",
-       "action-deleterevision": "à¤\87स à¤\85वतरण à¤\95à¥\8b à¤¹à¤\9fानà¥\87",
+       "action-deleterevision": "à¤\85वतरण à¤¹à¤\9fायà¥\87à¤\82",
        "action-deletelogentry": "लॉग प्रविष्टियाँ को हटाए",
-       "action-deletedhistory": "इस पृष्ठ के मिटे इतिहास को देखने",
+       "action-deletedhistory": "पृष्ठ के मिटे इतिहास को देखना",
+       "action-deletedtext": "हटाये गए अवतरण का पाठ देखें",
        "action-browsearchive": "हटाएँ गए पृष्ठों में खोजने",
-       "action-undelete": "à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रनà¥\87",
-       "action-suppressrevision": "à¤\87स à¤\9bिपà¥\87 à¤\85वतरण को देखने और पुनर्स्थापित करने",
+       "action-undelete": "पृष्ठ को पुनर्स्थापित करने",
+       "action-suppressrevision": "à¤\9bिपà¥\87 à¤\85वतरणà¥\8bà¤\82 को देखने और पुनर्स्थापित करने",
        "action-suppressionlog": "इस निजी लॉग को देखने",
        "action-block": "इस सदस्य को संपादन करने से ब्लॉक करने",
        "action-protect": "इस पृष्ठ के सुरक्षा स्तर बदलने",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नए पन्नों की सूची]] को भी देखें)",
        "recentchanges-submit": "दिखाएँ",
        "rcfilters-activefilters": "सक्रिय फिल्टर",
+       "rcfilters-quickfilters": "शीघ्र कड़ी",
+       "rcfilters-quickfilters-placeholder": "अपने पसंदीदा औजार की वरीयता सहेजें, ताकि बाद में फिर उपयोग कर सकें।",
+       "rcfilters-savedqueries-defaultlabel": "सहेजे फ़िल्टर",
+       "rcfilters-savedqueries-rename": "नाम बदलें",
+       "rcfilters-savedqueries-setdefault": "मूल के रूप में रखें",
+       "rcfilters-savedqueries-unsetdefault": "मूल के रूप से हटाएँ",
+       "rcfilters-savedqueries-remove": "निकालें",
+       "rcfilters-savedqueries-new-name-label": "नाम",
+       "rcfilters-savedqueries-apply-label": "शीघ्र कड़ी बनाएँ",
+       "rcfilters-savedqueries-cancel-label": "रद्द करें",
+       "rcfilters-savedqueries-add-new-title": "फ़िल्टर को शीघ्र कड़ी के रूप में सहेजें",
        "rcfilters-restore-default-filters": "मूलभूत फिल्टर पुनर्स्थापित करे",
        "rcfilters-clear-all-filters": "सभी फिल्टर हटाएँ",
        "rcfilters-search-placeholder": "हाल में हुए बदलाव फ़िल्टर (ब्राउज़ या टाइप करना आरंभ करें)",
        "rcfilters-invalid-filter": "अमान्य फ़िल्टर",
        "rcfilters-empty-filter": "कोई सक्रिय फिल्टर नहीं। सभी योगदान दिखाए गए है।",
        "rcfilters-filterlist-title": "फिल्टर",
+       "rcfilters-filterlist-whatsthis": "यह क्या है?",
+       "rcfilters-filterlist-feedbacklink": "नए (बीटा) फिल्टर पर प्रतिक्रिया दें",
+       "rcfilters-highlightbutton-title": "Highlight results",
+       "rcfilters-highlightmenu-title": "रंग चुनें",
+       "rcfilters-highlightmenu-help": "इस गुण को हाइलाइट करने के लिए एक रंग चुनें",
        "rcfilters-filterlist-noresults": "कोई फिल्टर नहीं पाया",
+       "rcfilters-noresults-conflict": "कोई भी परिणाम नहीं मिला क्योंकि खोज मापदंड संघर्ष में है",
+       "rcfilters-state-message-subset": "इस फिल्टर का कोई प्रभाव नहीं है क्योंकि इसका परिणाम निम्न, व्यापक {{PLURAL: $2 |फ़िल्टर|फिल्टर}} के साथ शामिल है (इसे भेद करने के लिए हाइलाइट करने की कोशिश करें): $1",
+       "rcfilters-state-message-fullcoverage": "किसी समूह में सभी फ़िल्टर चुनना कोई भी नहीं चुनने के समान है इसलिए इस फ़िल्टर का कोई प्रभाव नहीं है समूह में शामिल हैं: $1",
        "rcfilters-filtergroup-registration": "उपयोगकर्ता पंजीकरण",
        "rcfilters-filter-registered-label": "पंजीकृत:",
        "rcfilters-filter-registered-description": "लॉग-इन संपादक।",
        "rcfilters-filter-unregistered-label": "अपंजीकृत",
        "rcfilters-filter-unregistered-description": "संपादक जो लॉग इन नहीं हैं।",
-       "rcfilters-filter-editsbyself-label": "आपके अपने संपादन",
-       "rcfilters-filter-editsbyself-description": "आपके द्वारा संपादित",
-       "rcfilters-filter-editsbyother-label": "दूसरों के द्वारा संपादित",
-       "rcfilters-filter-userExpLevel-newcomer-label": "अपरिचित",
-       "rcfilters-filter-userExpLevel-learner-label": "शिक्षार्थियों",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "यह फ़िल्टर निम्न {{PLURAL:$2|फ़िल्टर}} के साथ संघर्ष करता है, जो केवल पंजीकृत सदस्यों को ही {{PLURAL:$2|ढूंढ}} रहा है: $1",
+       "rcfilters-filtergroup-authorship": "लेखक योगदान",
+       "rcfilters-filter-editsbyself-label": "आपके द्वारा बदलाव",
+       "rcfilters-filter-editsbyself-description": "आपके अपने योगदान।",
+       "rcfilters-filter-editsbyother-label": "दूसरों के द्वारा बदलाव",
+       "rcfilters-filter-editsbyother-description": "आपके बदलावों को छोड़ कर सभी के बदलाव।",
+       "rcfilters-filtergroup-userExpLevel": "अनुभव स्तर (केवल पंजीकृत सदस्यों के लिए)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "अनुभव फ़िल्टर केवल पंजीकृत उपयोगकर्ता पाते हैं इसलिए यह फ़िल्टर \"अपंजीकृत\" फ़िल्टर के साथ संघर्ष करता है।",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"अपंजीकृत\" फ़िल्टर एक या अधिक अनुभव फिल्टर के साथ संघर्ष करता है, जो केवल पंजीकृत उपयोगकर्ता ढूंढते हैं परस्पर विरोधी फिल्टर ऊपर सक्रिय फिल्टर क्षेत्र में चिह्नित हैं।",
+       "rcfilters-filter-user-experience-level-newcomer-label": "अपरिचित",
+       "rcfilters-filter-user-experience-level-newcomer-description": "4 दिनों की गतिविधि और 10 सम्पादन से कम।",
+       "rcfilters-filter-user-experience-level-learner-label": "शिक्षार्थियों",
+       "rcfilters-filter-user-experience-level-learner-description": "\"नए सदस्यों\" की तुलना में अधिक लेकिन \"अनुभवी सदस्यों\" से कम अनुभवी",
+       "rcfilters-filter-user-experience-level-experienced-label": "अनुभवी सदस्य",
+       "rcfilters-filter-user-experience-level-experienced-description": "30 दिन से अधिक गतिविधि और 500 सम्पादन।",
+       "rcfilters-filtergroup-automated": "स्वचालित योगदान",
        "rcfilters-filter-bots-label": "बॉट",
+       "rcfilters-filter-bots-description": "स्वचालित औजारों से किए सम्पादन।",
        "rcfilters-filter-humans-label": "मानव (बॉट नहीं)",
        "rcfilters-filter-humans-description": "मानव संपादक द्वारा किए गए संपादन।",
+       "rcfilters-filtergroup-reviewstatus": "पुनरीक्षण स्थिति",
+       "rcfilters-filter-patrolled-label": "परीक्षित",
+       "rcfilters-filter-patrolled-description": "परीक्षित चिन्हित किए सम्पादन।",
+       "rcfilters-filter-unpatrolled-label": "अपरीक्षित",
+       "rcfilters-filter-unpatrolled-description": "परीक्षित चिन्हित न किए सम्पादन।",
        "rcfilters-filtergroup-significance": "महत्व",
        "rcfilters-filter-minor-label": "छोटा संपादन",
+       "rcfilters-filter-minor-description": "लेखक का संपादन छोटा संपादन के रूप में लेबल किया गया है।",
        "rcfilters-filter-major-label": "गैर-मामूली संपादन",
+       "rcfilters-filter-major-description": "छोटा चिन्हित न किए सम्पादन।",
+       "rcfilters-filtergroup-watchlist": "ध्यानसूची पृष्ठ",
+       "rcfilters-filter-watchlist-watched-label": "ध्यानसूची में",
+       "rcfilters-filter-watchlist-watched-description": "आपकी ध्यानसूची पर पृष्ठों में परिवर्तन",
+       "rcfilters-filter-watchlist-watchednew-label": "नया ध्यानसूची बदलाव",
+       "rcfilters-filter-watchlist-watchednew-description": "ध्यानसूची पृष्ठों में किए गए परिवर्तन, जिन आपने परिवर्तनों के बाद से देखा नहीं है।",
+       "rcfilters-filter-watchlist-notwatched-label": "ध्यानसूची में नहीं",
+       "rcfilters-filter-watchlist-notwatched-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": "प्रशासनिक कार्रवाई, खाता निर्माण, पृष्ठ विलोपन, अपलोड ....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "\"लघु संपादन\" फ़िल्टर एक या एक से अधिक प्रकार के परिवर्तन फ़िल्टर के साथ संघर्ष करता है, क्योंकि कुछ प्रकार के परिवर्तन को \"लघु\" के रूप में निर्दिष्ट नहीं किया जा सकता है। परस्पर विरोधी फिल्टर ऊपर सक्रिय फिल्टर क्षेत्र में चिह्नित हैं।",
+       "rcfilters-hideminor-conflicts-typeofchange": "कुछ प्रकार के परिवर्तन को \"लघु\" के रूप में निर्दिष्ट नहीं किया जा सकता है\", इसलिए यह फ़िल्टर निम्न प्रकार के परिवर्तन फिल्टर के साथ संघर्ष करता है: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "इस प्रकार का परिवर्तन फ़िल्टर \"लघु संपादन\" फ़िल्टर के साथ संघर्ष करता है। कुछ प्रकार के परिवर्तन को \"लघु\" के रूप में निर्दिष्ट नहीं किया जा सकता है।",
+       "rcfilters-filtergroup-lastRevision": "सद्य अवतरण",
+       "rcfilters-filter-lastrevision-label": "अंतिम अवतरण",
+       "rcfilters-filter-lastrevision-description": "पृष्ठ का सबसे हाल में हुआ बदलाव",
+       "rcfilters-filter-previousrevision-label": "पहले के अवतरण",
+       "rcfilters-filter-previousrevision-description": "सभी परिवर्तन जो एक पृष्ठ में सबसे हाल के परिवर्तन नहीं हैं।",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
+       "rclistfromreset": "चुने दिनांक पहले जैसा करें",
        "rclistfrom": "$3 $2 से नये बदलाव दिखाएँ",
        "rcshowhideminor": "छोटे बदलाव $1",
        "rcshowhideminor-show": "दिखाएँ",
        "rcshowhidecategorization": "$1 पृष्ठ श्रेणीकरण",
        "rcshowhidecategorization-show": "दिखाएँ",
        "rcshowhidecategorization-hide": "छुपाएँ",
-       "rclinks": "पिछले $2 दिनों में हुए $1 बदलाव दिखाएँ<br />$3",
+       "rclinks": "पिछले $2 दिनों में हुए $1 बदलाव दिखाएँ",
        "diff": "अंतर",
        "hist": "इतिहास",
        "hide": "छुपाएँ",
        "recentchangeslinked-page": "पृष्ठ नाम:",
        "recentchangeslinked-to": "इसके बदले में दिये हुए पृष्ठसे जुडे पन्नोंके बदलाव दर्शायें",
        "recentchanges-page-added-to-category": "[[:$1]] श्रेणी में जुड़ा",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] à¤\94र [[Special:WhatLinksHere/$1|{{PLURAL:$2|à¤\8fà¤\95 à¤ªà¥\83षà¥\8dठ|$2 à¤ªà¥\83षà¥\8dठ}}]] à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\81ड़ा",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤\9cà¥\8bड़ा à¤\97या, [[Special:WhatLinksHere/$1|यह à¤ªà¥\87à¤\9c à¤\85नà¥\8dय à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤¶à¤¾à¤®à¤¿à¤² à¤¹à¥\88]]",
        "recentchanges-page-removed-from-category": "[[:$1]] श्रेणी से हटा",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] à¤\94र [[Special:WhatLinksHere/$1|{{PLURAL:$2|à¤\8fà¤\95 à¤ªà¥\83षà¥\8dठ|$2 à¤ªà¥\83षà¥\8dठ}}]] à¤¶à¥\8dरà¥\87णà¥\80 à¤¸à¥\87 à¤¹à¤\9fा",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] à¤¶à¥\8dरà¥\87णà¥\80 à¤¸à¥\87 à¤¹à¤\9fाया à¤\97या, [[Special:WhatLinksHere/$1|यह à¤ªà¥\87à¤\9c à¤\85नà¥\8dय à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤¶à¤¾à¤®à¤¿à¤² à¤¹à¥\88]]",
        "autochange-username": "मीडियाविकि स्वतः परिवर्तन",
        "upload": "फ़ाइल अपलोड करें",
        "uploadbtn": "फ़ाइल अपलोड करें",
        "file-thumbnail-no": "इस फ़ाइल का नाम <strong>$1</strong> से शुरू हो रहा है।\nयह आकार घटाई हुई ''(अंगूठाकार)'' हो सकती है।\nअगर यह चित्र अपने मूल आकार में है तो इसे अपलोड करें, नहीं तो फ़ाइल बदलें।",
        "fileexists-forbidden": "इस नाम की फ़ाइल पहले ही मौजूद है, और इसकी जगह और नहीं अपलोड की जा सकती।\nयदि आप इस फ़ाइल को फिर भी अपलोड करना चाहते हैं, तो कृपया वापस जा के इसके लिए कोई अन्य नाम चुनें।\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "इस नाम की फ़ाइल साझे फ़ाइल भंडार में पहले ही मौजूद है।\nयदि आप इस फ़ाइल को फिर भी अपलोड करना चाहते हैं, तो कृपया वापस जा के इसके लिए कोई अन्य नाम चुनें।\n[[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "अपलोड <strong>[[:$1]]</strong> के वर्तमान संस्करण का सटीक प्रतिलिपि है।",
+       "fileexists-duplicate-version": "अपलोड <strong>[[:$1]]</strong> के  {{PLURAL:$2|पुराने संस्करणों}} का सटीक प्रतिलिपि है",
        "file-exists-duplicate": "यह फ़ाइल निम्नलिखित {{PLURAL:$1|फ़ाइल|फ़ाइलों}} की प्रति है:",
        "file-deleted-duplicate": "इसी फ़ाइल ([[:$1]]) से हूबहू मेल खाती एक फ़ाइल पहले हटाई जा चुकी है।\nइसे फिर से अपलोड करने से पहले आपको पुरानी फ़ाइल का हटाने के इतिहास देख लेना चाहिए।",
        "file-deleted-duplicate-notitle": "इससे पहले इस फ़ाइल के समान एक फ़ाइल को हटाया गया है, और शीर्षक छिपा दिया गया है।\nइसे फिर से अपलोड करने से पहले आप किसी ऐसे व्यक्ति से स्थिति की समीक्षा करने के लिए कहें जिसके पास छिपी फ़ाइल का डाटा देखने की क्षमता है।",
        "php-uploaddisabledtext": "पी॰एच॰पी में फ़ाइल अपलोड बंद हैं।\nकृपया file_uploads जमाव की जाँच करें।",
        "uploadscripted": "इस फ़ाइल में एच॰टी॰एम॰एल या स्क्रिप्ट कोड है, जो वेब ब्राउज़र द्वारा गलत पढ़ा जा सकता है।",
        "upload-scripted-pi-callback": "उस फाइल को अपलोड नहीं किया जा सकता जिसमें एक्सएमएल-स्टाइलशीट प्रसंस्करण निर्देश समाविष्ट हैं।",
+       "upload-scripted-dtd": "SVG फ़ाइलों को अपलोड नहीं किया जा सकता जिसमें एक गैर-मानक DTD की घोषणा हो।",
        "uploaded-script-svg": "अपलोड की गयी एसवीजी फ़ाइल में स्क्रीप्ट अवयव \"$1\" पाया गया।",
        "uploaded-hostile-svg": "अपलोड की गयी एसवीजी फाइल के शैली अवयव में असुरक्षित सीएसएस पायी गयी।",
        "uploaded-event-handler-on-svg": "सेटिंग ईवेंट हैंडलर (आयोजन प्रबन्धनकर्ता वरियता) <code>$1=\"$2\"</code> एसवीजी फ़ाइल में अनुमत नहीं है।",
        "upload-http-error": "एक एच॰टी॰टी॰पी त्रुटि आई: $1",
        "upload-copy-upload-invalid-domain": "कॉपी अपलोड इस डोमेन से उपलब्ध नहीं हैं।",
        "upload-foreign-cant-upload": "यह विकि अन्य फ़ाइल संग्रह में अपलोड हेतु तय नहीं किया गया है।",
+       "upload-foreign-cant-load-config": "फ़ाइल अपलोड के लिए कॉन्फ़िगरेशन को विदेशी फ़ाइल रिपॉजिटरी में लोड करने में विफल।",
+       "upload-dialog-disabled": "इस बॉक्स का उपयोग कर फ़ाइल अपलोड इस विकी पर अक्षम हैं।",
        "upload-dialog-title": "फ़ाइल डालें",
        "upload-dialog-button-cancel": "रद्द करें",
        "upload-dialog-button-back": "पीछे",
        "uploadstash-errclear": "फ़ाइलों को साफ़ करना असफल रहा।",
        "uploadstash-refresh": "फ़ाइलों की सूची रिफ़्रेश करें",
        "uploadstash-thumbnail": "छवि देखें",
+       "uploadstash-exception": "गुप्त कोष में अपलोड स्टोर नहीं किया जा सका ($1): \"$2\".",
        "invalid-chunk-offset": "अग्राह्य चंक ऑफ़सेट",
        "img-auth-accessdenied": "अनुमति नहीं है",
        "img-auth-nopathinfo": "PATH_INFO मौजूद नहीं है।\nआपके सर्वर में इस जानकारी को भेजने के लिए जमाव नहीं है।\nयह सी॰जी॰आई-आधारित हो सकता है और img_auth को स्वीकार नहीं करता है।\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization देखें।",
        "filerevert-submit": "पूर्ववत करें",
        "filerevert-success": "'''[[Media:$1|$1]]''' को [$4 $2 को $3 बजे के अवतरण] को पूर्ववत कर दिया गया है।",
        "filerevert-badversion": "दिये हुए समय से मेल खाने वाला इस फ़ाइल का पुराना अवतरण नहीं है।",
+       "filerevert-identical": "फ़ाइल का वर्तमान संस्करण पहले से ही चयनित एक जैसा है।",
        "filedelete": "$1 हटाएँ",
        "filedelete-legend": "फ़ाइल हटाएँ",
        "filedelete-intro": "आप फ़ाइल '''[[Media:$1|$1]]''' इतिहास समेत हटाने जा रहे हैं।",
        "unusedtemplates": "अप्रयुक्त साँचे",
        "unusedtemplatestext": "इस पृष्ठ पर {{ns:template}} नामस्थान वाले वे सभी पृष्ठ इंगित है जो किसी अन्य पृष्ठ में शामिल नहीं हैं।\nइन्हें हटाने के पहले इन साँचों की और कड़ियाँ जाँच लें।",
        "unusedtemplateswlh": "अन्य कड़ियाँ",
-       "randompage": "यादà¥\83à¤\9aà¥\8dà¤\9bिà¤\95 पृष्ठ",
+       "randompage": "à¤\95à¥\8bà¤\88 à¤­à¥\80 पृष्ठ",
        "randompage-nopages": "कोई भी पृष्ठ {{PLURAL:$2|इस नामस्थान|इन नामस्थानों}} में नहीं हैं: $1।",
-       "randomincategory": "शà¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¯à¤¾à¤¦à¥\83à¤\9aà¥\8dà¤\9bिà¤\95 (रà¥\88à¤\82डम) पृष्ठ",
+       "randomincategory": "शà¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤°à¥\88à¤\82डम पृष्ठ",
        "randomincategory-invalidcategory": "\"$1\" एक मान्य श्रेणी नाम नहीं है।",
        "randomincategory-nopages": "[[:Category:$1|$1]] श्रेणी में कोई पृष्ठ नहीं हैं।",
        "randomincategory-category": "श्रेणी:",
-       "randomincategory-legend": "शà¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¯à¤¾à¤¦à¥\83à¤\9aà¥\8dà¤\9bिà¤\95 पृष्ठ",
+       "randomincategory-legend": "शà¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤°à¥\88à¤\82डम पृष्ठ",
        "randomincategory-submit": "जायें",
        "randomredirect": "किसी एक पुनर्निर्देशन पर जाएँ",
        "randomredirect-nopages": "नामस्थान \"$1\" में कोई पुनर्निर्देशन नहीं हैं।",
        "uncategorizedcategories": "अश्रेणीकृत श्रेणियाँ",
        "uncategorizedimages": "अश्रेणीकृत फ़ाइलें",
        "uncategorizedtemplates": "अश्रेणीकृत साँचे",
+       "uncategorized-categories-exceptionlist": " # इसमें श्रेणियों की एक सूची है, जिसका विशेष:श्रेणीहीन_श्रेणियाँ उल्लेख नहीं किया जाना चाहिए। प्रति पंक्ति एक, \"*\" से शुरू. दूसरे वर्ण (व्हाइटस्पेस सहित) के साथ शुरू होने वाली पंक्तिओं को नजरअंदाज कर दिया जाता है। टिप्पणियों के लिए \"#\" का उपयोग करें।",
        "unusedcategories": "अप्रयुक्त श्रेणियाँ",
        "unusedimages": "अप्रयुक्त फ़ाइलें",
        "wantedcategories": "वांछित श्रेणियाँ",
        "apisandbox-sending-request": "एपीआई अनुरोध भेज रहा...",
        "apisandbox-loading-results": "एपीआई परिणाम ले रहा...",
        "apisandbox-results-error": "एपीआई के समय कोई त्रुटि हुई: $1",
+       "apisandbox-request-selectformat-label": "अनुरोध डेटा को इस रूप में दिखाएं:",
+       "apisandbox-request-format-url-label": "यूआरएल क्वेरी स्ट्रिंग",
        "apisandbox-request-url-label": "अनुरोध URL:",
+       "apisandbox-request-json-label": "JSON अनुरोध:",
        "apisandbox-request-time": "अनुरोध समय: {{PLURAL:$1|$1 मि}}",
        "apisandbox-results-fixtoken": "टोकन सही करें और दोबारा भेजें।",
        "apisandbox-results-fixtoken-fail": "टोकन \"$1\" डालने में विफल",
        "apisandbox-alert-field": "जगह में डाला गया जानकारी अमान्य है।",
        "apisandbox-continue": "जारी रखें",
        "apisandbox-continue-clear": "खाली करें",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continue] अंतिम अनुरोध होगा; {{int:apisandbox-continue-clear}} निरंतरता-संबंधित मानदंडों को साफ करेगा।",
+       "apisandbox-param-limit": "अधिकतम सीमा का उपयोग करने के लिए <kbd>अधिकतम</kbd> दर्ज करें।",
        "apisandbox-multivalue-all-namespaces": "$1 (सभी नामस्थान)",
        "apisandbox-multivalue-all-values": "$1 (सभी मूल्य)",
        "booksources": "पुस्तकों के स्रोत",
        "booksources-search": "खोजें",
        "booksources-text": "नीचे पुरानी और नई पुस्तकें बेचने वाली वेबसाइटों के एड्रेस हैं, जिसमें आपको आप द्वारा खोजी जाने वाली पुस्तक के बारे में अधिक जानकारी मिल सकती है:",
        "booksources-invalid-isbn": "यह आइ॰एस॰बी॰एन सही नहीं लग रहा है; मूल स्रोत से नकल करने में हुई त्रुटि के लिए जाँचें।",
+       "magiclink-tracking-rfc": "RFC जादू लिंक का उपयोग कर रहे पेज",
+       "magiclink-tracking-rfc-desc": "यह पृष्ठ आरएफसी जादू लिंक का उपयोग करता है। कैसे माइग्रेट करें [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] पर देखें।",
+       "magiclink-tracking-pmid": "पीएमआईडी जादू लिंक का उपयोग कर रहे पेज",
+       "magiclink-tracking-pmid-desc": "यह पृष्ठ पीएमआईडी जादू लिंक का उपयोग करता है। कैसे माइग्रेट करें [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] पर देखें।",
+       "magiclink-tracking-isbn": "आईएसबीएन के जादुई कड़ियों का उपयोग करने वाले पृष्ठ",
+       "magiclink-tracking-isbn-desc": "यह पृष्ठ आईएसबीएन जादू लिंक का उपयोग करता है। कैसे माइग्रेट करें [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] पर देखें।",
        "specialloguserlabel": "कर्ता:",
-       "speciallogtitlelabel": "पà¥\8dरयà¥\8bà¤\9cन (शà¥\80रà¥\8dषà¤\95 à¤\85थवा {{ns:सदसà¥\8dयनाम}}:सदसà¥\8dय à¤¨à¤¾à¤®):",
+       "speciallogtitlelabel": "लà¤\95à¥\8dषà¥\8dय (शà¥\80रà¥\8dषà¤\95 à¤¯à¤¾ \"{{ns:सदसà¥\8dयनाम}}:सदसà¥\8dयनाम\" à¤¸à¤¦à¤¸à¥\8dय à¤¹à¥\87तà¥\81):",
        "log": "लॉग",
        "logeventslist-submit": "दिखाएँ",
        "all-logs-page": "सभी सार्वजनिक लॉग",
        "activeusers-intro": "यह सक्रिय सदस्यों की सूची है जिन्होंने पिछले $1 {{PLURAL:$1|दिन|दिनों}} में कुछ गतिविधि करी है।",
        "activeusers-count": "$1 {{PLURAL:$1|कार्य}} पिछले $3 {{PLURAL:$3|दिन|दिनों}} में",
        "activeusers-from": "इस अक्षर से शुरू होने वाले सदस्य दिखाएँ:",
+       "activeusers-groups": "इस समूह के सदस्यों को दिखाएँ:",
+       "activeusers-excludegroups": "इस समूह के सदस्यों को न दिखाएँ:",
        "activeusers-noresult": "कोई सदस्य नहीं मिले।",
        "activeusers-submit": "सक्रिय सदस्यों को दिखायें",
        "listgrouprights": "सदस्य समूह अधिकार",
        "trackingcategories-msg": "चिह्नित श्रेणी",
        "trackingcategories-name": "संदेश नाम",
        "trackingcategories-desc": "श्रेणी शामिल किए जाने के मानदंड",
+       "restricted-displaytitle-ignored": "नजरअंदाज कर दिया प्रदर्शन शीर्षक वाले पृष्ठ",
+       "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> से बढ़कर है। सभी साँचों के फैलाने के बाद कुछ साँचों को फैलाया नहीं जा सकता है।",
        "emailccsubject": "आपके ई-मेल की प्रति जो $1 को भेजा गया: $2",
        "emailsent": "ई-मेल भेज दिया गया है।",
        "emailsenttext": "आपका ई-मेल संदेश भेज दिया गया है।",
-       "emailuserfooter": "इस ई-मेल को $1 {{GENDER:$1|द्वारा}} {{GENDER:$2|$2}} को भेजा गया था जिसके लिए \"{{int:emailuser}}\" कार्य को {{SITENAME}} पर प्रयोग में लाया गया था।",
+       "emailuserfooter": "इस ई-मेल को $1 {{GENDER:$1|द्वारा}} {{GENDER:$2|$2}} को भेजा गया था जिसके लिए \"{{int:emailuser}}\" कार्य को {{SITENAME}} पर प्रयोग में लाया गया था। अगर {{GENDER:$2|आप}} इस ईमेल का उत्तर देते हैं, {{GENDER:$2|आपका}} ईमेल सीधे {{GENDER:$1|मूल प्रेषक}} को भेज दिया जाएगा। {{GENDER:$1उनको}} {{GENDER:$2|अपना}} ईमेल पता बताएं।",
        "usermessage-summary": "प्रणाली सन्देश छोड़ रहा है।",
        "usermessage-editor": "सिस्टम दूत",
        "watchlist": "ध्यानसूची",
        "watchnologin": "लॉग इन नहीं किया है",
        "addwatch": "ध्यानसूची में जोड़ें",
        "addedwatchtext": "आपकी [[Special:Watchlist|ध्यानसूची]] में \"[[:$1]]\" और इसके चर्चा पृष्ठ जोड़ दिए गए हैं।",
+       "addedwatchtext-talk": "\"[[:$1]]\" और उससे जुड़े पन्ने आपके [[Special:Watchlist|ध्यानसूची]] में जोड़ दिये गए हैं।",
        "addedwatchtext-short": "पृष्ठ \"$1\" को आपकी ध्यानसूची से जोड़ा गया है।",
        "removewatch": "ध्यानसूची से हटाएँ",
-       "removedwatchtext": "\"[[:$1]]\" नामक पृष्ठ को आपकी [[Special:Watchlist|ध्यानसूची]] से हटा दिया गया है।",
+       "removedwatchtext": "\"[[:$1]]\" और इसके वार्ता पृष्ठ को आपके [[Special:Watchlist|ध्यानसूची]] से हटा दिया गया है।",
+       "removedwatchtext-talk": "\"[[:$1]]\" और उससे जुड़े पन्ने आपके [[Special:Watchlist|ध्यानसूची]] से हटा दिये गए हैं।",
        "removedwatchtext-short": "पृष्ठ \"$1\" को आपकी ध्यानसूची से हटाया गया है।",
        "watch": "ध्यान रखें",
        "watchthispage": "इस पृष्ठ का ध्यान रखें",
        "deletepage": "पृष्ठ हटाएँ",
        "confirm": "सुनिश्चित करें",
        "excontent": "पाठ था: '$1'",
-       "excontentauthor": "पाठ था: '$1' (और सिर्फ '[[Special:Contributions/$2|$2]]' का योगदान था। ([[User talk:$2|वार्ता]])",
+       "excontentauthor": "पाठ था: '$1'और सिर्फ '[[Special:Contributions/$2|$2]]' का योगदान था। ([[User talk:$2|वार्ता]])",
        "exbeforeblank": "खाली करने से पहले पाठ था: '$1'",
        "delete-confirm": "\"$1\" को हटाएँ",
        "delete-legend": "हटाएँ",
        "delete-toobig": "इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है।\n{{SITENAME}} के अनपेक्षित रूप से बंद होने से रोकने के लिये ऐसे पृष्ठों को हटाने की अनुमति नहीं है।",
        "delete-warning-toobig": "इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है।\nइसे हटाने से {{SITENAME}} के डाटाबेस की गतिविधियों में व्यवधान आ सकता है;\nकृपया सोच समझ कर आगे बढ़ें।",
        "deleteprotected": "आप इस पृष्ठ को हटा नहीं सकते क्योंकि इसे सुरक्षित किया गया है।",
-       "deleting-backlinks-warning": "'''चेतावनी:''' जो पृष्ठ आप हटाने जा रहे हैं उससे [[Special:WhatLinksHere/{{FULLPAGENAME}}|अन्य पृष्ठ]] जुड़ते हैं अथवा उसे ट्रांसक्लूड करते हैं।",
+       "deleting-backlinks-warning": "<strong>चेतावनी:</strong> जो पृष्ठ आप हटाने जा रहे हैं उससे [[Special:WhatLinksHere/{{FULLPAGENAME}}|अन्य पृष्ठ]] जुड़ते हैं अथवा उसे ट्रांसक्लूड करते हैं।",
        "rollback": "संपादन वापिस लें",
        "rollbacklink": "वापिस लें",
        "rollbacklinkcount": "$1 {{PLURAL:$1|सम्पादन}} वापिस लें",
        "rollbacklinkcount-morethan": "$1 से अधिक {{PLURAL:$1|सम्पादन}} वापिस लें",
        "rollbackfailed": "वापिस लेना असफल रहा",
+       "rollback-missingparam": "अनुरोध पर अपेक्षित पैरामीटर गायब हैं।",
        "rollback-missingrevision": "अवतरण डाटा दिखाने में असमर्थ।",
        "cantrollback": "पुराने अवतरण को पूर्ववत नहीं कर सकते हैं;\nइस पृष्ठ का अन्तिम योगदानकर्ता इस लेख का एकमात्र लेखक है।",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) द्वारा किए गए  [[:$1]] के पिछले संपादन को वापिस पुरानी स्थिति पर नहीं लाया जा सकता है;\nकिसी और ने इस बीच या तो इस पृष्ठ को फिर से संपादित कर दिया है या पहले ही पृष्ठ पुरानी स्थिति पर लाया जा चुका है।\n\nइस पृष्ठ का अन्तिम संपादन [[User:$3|$3]] ([[User talk:$3|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ने किया है।",
        "editcomment": "संपादन सारांश था: <em>$1</em>।",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) के संपादनों को हटाकर [[User:$1|$1]] के अन्तिम अवतरण को पूर्ववत किया",
        "revertpage-nouser": "(सदस्य नाम हटाया गया है) के संपादनों को हटाकर {{GENDER:$1|[[User:$1|$1]]}} के अन्तिम अवतरण को पूर्ववत किया।",
-       "rollback-success": "$1 के संपादन हटाए;\n$2 द्वारा संपादित अन्तिम अवतरण को पुनर्स्थापित किया।",
+       "rollback-success": "{{GENDER:$3|$1}} के संपादन हटाए;\n{{GENDER:$4|$2}} द्वारा संपादित अन्तिम अवतरण को पुनर्स्थापित किया।",
+       "rollback-success-notify": "$1 द्वारा वापिस लौटे संपादन; $2 द्वारा पिछली संशोधन में वापस बदल दिया। [$3 बदलाव दिखाएं]",
        "sessionfailure-title": "सत्र विफलता",
        "sessionfailure": "ऐसा प्रतीत होता है कि आपके लॉगिन सत्र के साथ कोई समस्या है।\nसत्र अपहरण से बचाने के लिए सावधानी के तौर पर आपका यह क्रियाकलाप रद्द कर दिया गया है।\nकृपया पीछे जाएँ और पृष्ठ को पुनः लोड करें, तब दुबारा कोशिश करें।",
        "changecontentmodel": "पेज कि सामगरिि मोदल को बदलिये",
        "changecontentmodel-emptymodels-title": "कोई सामग्री प्रारूप उपलब्ध नहीं",
        "changecontentmodel-emptymodels-text": "[[:$1]] में सामग्री किसी और प्रकार में परिवर्तित नहीं हो सकती।",
        "log-name-contentmodel": "सामाग्री परिवर्तन लॉग",
-       "log-description-contentmodel": "à¤\86यà¥\8bà¤\9cन à¤\9cà¥\8b à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤¸à¥\87 à¤®à¤¿à¤²à¤¤à¥\87 à¤\9cà¥\81लतà¥\87 à¤¹à¥\88à¤\82",
+       "log-description-contentmodel": "यह à¤ªà¥\83षà¥\8dठ, à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95à¥\87 à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤®à¥\89डल à¤\94र à¤ªà¥\8dरारमà¥\8dभिà¤\95 à¤\95à¥\87 à¤\85तिरिà¤\95à¥\8dत à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤®à¥\89डल à¤¦à¥\8dवारा à¤¨à¤¿à¤°à¥\8dमित à¤ªà¥\83षà¥\8dठà¥\8bà¤\82 à¤\95à¥\87 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤°à¤\96ता à¤¹à¥\88।",
        "logentry-contentmodel-new": "$1 ने  $3 पृष्ठ का {{GENDER:$2|निर्माण}} किया बिना मूल सामग्री प्रारूप के \"$5\"",
        "logentry-contentmodel-change": "$1 ने $3 पृष्ठ का सामग्री \"$4\" से \"$5\" {{GENDER:$2|परिवर्तित किया}}",
        "logentry-contentmodel-change-revertlink": "पूर्ववत करें",
        "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-summary-cascade": "सीढ़ी",
        "protect-expiring": "समाप्ती $1 (UTC)",
        "protect-expiring-local": "समाप्ती $1",
-       "protect-expiry-indefinite": "à¤\85निशà¥\8dà¤\9aितà¤\95ालà¥\80न",
+       "protect-expiry-indefinite": "हमà¥\87शा",
        "protect-cascade": "इस पृष्ठ से जुड़े हुए पृष्ठ सुरक्षित करें (सुरक्षा-सीढ़ी)",
        "protect-cantedit": "आप इस पृष्ठ का सुरक्षा-स्तर बदल नहीं सकते क्योंकि आपको ऐसा करने का अधिकार नहीं है।",
        "protect-othertime": "अन्य समय:",
        "undeletepagetext": "निम्न {{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठों}} को हटा दिया गया है, लेकिन अभी ये लेखागार में हैं और पुनर्स्थापित किये जा सकते हैं।\nलेखागार समय-समय पर साफ किये जाते हैं।",
        "undelete-fieldset-title": "अवतरण पुरानी स्थिति पर लाएँ",
        "undeleteextrahelp": "पृष्ठ का संपूर्ण इतिहास वापस लाने के लिए सभी बक्सों से सही का निशान हटा दें और '''''{{int:undeletebtn}}''''' पर क्लिक करें।\nचुनिंदा इतिहास को वापस लाने के लिए उन अवतरणों के बगल के बक्सों पर सही का निशान लगाएँ और '''''{{int:undeletebtn}}''''' पर क्लिक करें।",
-       "undeleterevisions": "$1 अवतरण लेखागार में {{PLURAL:$1|है|हैं}}",
+       "undeleterevisions": "$1 अवतरण {{PLURAL:$1|हटाया गया|हटाये गये}}",
        "undeletehistory": "यदि आप पृष्ठ को पुनर्स्थापित करते हैं तो सभी अवतरण इतिहास में पुनर्स्थापित हो जायेंगे।\nहटाने के बाद यदि एक नया पृष्ठ उसी नाम से बनाया गया है तो पुनर्स्थापित अवतरण पिछले इतिहास में दर्शित होंगे।",
        "undeleterevdel": "यदि पुनर्स्थापन के फलस्वरूप शीर्ष पृष्ठ या फ़ाइल अवतरण आंशिक रूप से मिट सकता है, तो इसे नहीं किया जायेगा।\nऐसी स्थिति में, आपको नवीनतम मिटाए गए अवतरण को बिना सही के निशान लगाये हुए या बिना छुपाये रखना होगा।",
        "undeletehistorynoadmin": "यह पृष्ठ हटा दिया गया है।\nहटाए जाने का कारन नीचे सारांश में दिया गया है, और साथ ही उन सदस्यों के बारे में विस्तार भी दिया गया है, जिन्होंने हटाए जाने से पहले इस पृष्ठ को संपादित किया था।\nइन हटाये गए अवतरणों का पाठ केवल प्रबंधकों को ही उपलब्ध है।",
        "undelete-revision": "$1 ($4 को $5 बजे $3 द्वारा बनाया गया) का मिटाया हुआ संस्करण:",
        "undeleterevision-missing": "अमान्य अथवा अनुपस्थित अवतरण।\nया तो आप ग़लत कड़ी प्रयोग कर रहे हैं, या यह अवतरण पुनर्स्थापित किया जा चुका है, अथवा इसे लेखागार से हटा दिया गया है।",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|One revision|$1संशोधन}} को पुनर्स्थापित नहीं किया जा सका, क्योंकि {{PLURAL:$1|यह|अपने}} <code>rev_id</code> पहले से ही उपयोग में है।",
        "undelete-nodiff": "कोई पुराना अवतरण नहीं मिला।",
        "undeletebtn": "वापस ले आयें",
        "undeletelink": "देखें/पुनर्स्थापित करें",
        "undeleteviewlink": "देखें",
        "undeleteinvert": "चुनाव उलटें",
        "undeletecomment": "कारण:",
-       "undeletedrevisions": "{{PLURAL:$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": "सिर्फ़ नये सदस्यों के योगदान दर्शायें",
        "sp-contributions-newbies-sub": "नये सदस्योंके लिये",
        "sp-contributions-newbies-title": "नए सदस्यों द्वारा योगदान",
-       "sp-contributions-blocklog": "बà¥\8dलà¥\89à¤\95 सूची",
-       "sp-contributions-suppresslog": "छुपाए गए उपयोगकर्ता के योगदान",
-       "sp-contributions-deleted": "हटाए गए सदस्य योगदान",
+       "sp-contributions-blocklog": "à¤\85वरà¥\8bध सूची",
+       "sp-contributions-suppresslog": "छुपाए गए {{GENDER:$1|सदस्य}} के योगदान",
+       "sp-contributions-deleted": "हटाए गए {{GENDER:$1|सदस्य}} योगदान",
        "sp-contributions-uploads": "अपलोड",
        "sp-contributions-logs": "लॉग",
        "sp-contributions-talk": "वार्ता",
-       "sp-contributions-userrights": "सदस्य अधिकार प्रबंधन",
+       "sp-contributions-userrights": "{{GENDER:$1|सदस्य}} अधिकार प्रबंधन",
        "sp-contributions-blocked-notice": "यह सदस्य फ़िलहाल अवरोधित हैं। सदंर्भ के लिए ताज़ातरीन अवरोध चिट्ठा प्रविष्टि नीचे है:",
        "sp-contributions-blocked-notice-anon": "यह आईपी पता अभी अवरोधित है। \nनवीनतम अवरोध अभिलेख प्रविष्टि सन्दर्भ के लिए नीचे दी गई है:",
        "sp-contributions-search": "योगदान के लिये खोज",
        "unblock": "उपयोक्ता पर अवरोधण हटाएँ",
        "blockip": "{{GENDER:$1|सदस्य|सदस्या}} अवरोधित करें",
        "blockip-legend": "सदस्य को ब्लॉक करें",
-       "blockiptext": "विशिष्ठ IP पते अथवा सदस्य नाम को लिखने के अधिकार से बाध्य करने के लिए निम्न पत्र का प्रयोग करें।\nयह सिर्फ बर्बरता को रोकने के लिए ही किया जाना चाहिए, और [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार ही करना चाहिए।\nनीचे विशिष्ठ कारण भी लिखें (उदाहरण के लिए, सटीक पृष्ठों को दर्शाते हुए, जिनमें बर्बरता की गई हो)।",
+       "blockiptext": "विशिष्ठ IP पते अथवा सदस्य नाम को लिखने के अधिकार से बाध्य करने के लिए निम्न पत्र का प्रयोग करें।\nयह सिर्फ बर्बरता को रोकने के लिए ही किया जाना चाहिए, और [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार ही करना चाहिए।\nनीचे विशिष्ठ कारण भी लिखें (उदाहरण के लिए, सटीक पृष्ठों को दर्शाते हुए, जिनमें बर्बरता की गई हो)।\nआप [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing सीआईडीआर] सिंटैक्स का उपयोग करके आईपी पता श्रेणियां ब्लॉक कर सकते हैं। आईपीवी4 के लिए सबसे बड़ी स्वीकार्य सीमा /$1 है और आईपीवी6 के लिए /$2 है।",
        "ipaddressorusername": "आईपी एड्रेस या सदस्यनाम:",
        "ipbexpiry": "समाप्ति:",
        "ipbreason": "कारण:",
        "unblocked-id": "अवरोध $1 निकाल दिया गया है",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] पर से प्रतिरोध हटाया गया है।",
        "blocklist": "अवरोधित उपयोक्ता",
+       "autoblocklist": "स्वतःअवरोध",
+       "autoblocklist-submit": "खोजें",
+       "autoblocklist-legend": "स्वतः अवरोध सूची",
+       "autoblocklist-localblocks": "स्थानीय {{PLURAL:$1|स्वतः अवरोध}}",
+       "autoblocklist-empty": "स्वतः अवरोध सूची खाली है।",
+       "autoblocklist-otherblocks": "अन्य {{PLURAL:$1|स्वतःअवरोध}}",
        "ipblocklist": "अवरोधित आईपी पते व सदस्यनाम",
        "ipblocklist-legend": "अवरोधित सदस्य को खोजें",
        "blocklist-userblocks": "खाते के अवरोध छिपाएं",
        "createaccountblock": "खाते निर्माण को रोक दिया हैं",
        "emailblock": "ईमेल अवरोधित",
        "blocklist-nousertalk": "अपना वार्ता पृष्ठ भी संपादित नहीं कर सकेंगे",
-       "ipblocklist-empty": "बà¥\8dलà¥\89à¤\95 सूची खाली हैं।",
+       "ipblocklist-empty": "à¤\85वरà¥\8bध सूची खाली हैं।",
        "ipblocklist-no-results": "पूछे गये आईपी एड्रेस / सदस्यनाम पर ब्लॉक नहीं हैं।",
        "blocklink": "अवरोधित करें",
        "unblocklink": "अवरोध हटाएँ",
        "contribslink": "योगदान",
        "emaillink": "ई-मेल भेजें",
        "autoblocker": "आपका आइ॰पी पता स्वतः अवरुद्ध है, चूँकि इसे हाल ही में \"[[User:$1|$1]]\" द्वारा प्रयोग किया गया है।\n$1 को अवरोधित करने का कारण है: \"$2\"",
-       "blocklogpage": "बà¥\8dलà¥\89à¤\95 सूची",
+       "blocklogpage": "à¤\85वरà¥\8bध सूची",
        "blocklog-showlog": "इस प्रयोक्ता को पहले भी अवरोधित किया जा चुका है। \nसन्दर्भ के लिए अवरोधन अभिलेख नीचे दिया गया है:",
        "blocklog-showsuppresslog": "यह प्रयोक्ता पहले भी अवरोधित किया जा चुका है।\nयह दबाया गया लॉग सन्दर्भ के लिए उपलब्ध कया गया है:",
        "blocklogentry": "\"[[$1]]\" को $2 $3 तक बदलाव करने से रोक दिया गया है।",
        "proxyblockreason": "आपका IP पता बाधित किया जा चुका है क्योंकि यह एक मुक्त प्रतिनिधि है।\nकृपया आप अपने इंटरनेट सेवा प्रदान करने वाले से या तकनीकी सहायक से सम्पर्क करें अथवा उन्हें इस भयावह सुरक्षा समस्या के बारे में सूचित करें।",
        "sorbsreason": "{{SITENAME}} द्वारा इस्तेमालमें लाये जाने वाले DNSBL में आपके आईपी एड्रेसको ओपन प्रॉक्सीमें दर्शाया गया हैं।",
        "sorbs_create_account_reason": "{{SITENAME}} के DNSBL ने आपका आईपी एड्रेस ओपन प्रोक्सी करके सूचित किया हैं। आप खाता खोल नहीं सकतें।",
+       "softblockrangesreason": "आपके आईपी ($1) के द्वारा बिना खाता के सम्पादन नहीं हो सकता है। कृपया खाते में लॉग इन करें।",
        "xffblockreason": "एक आई०पी० पता जो X-Forwarded-For हेडर में मौजूद है, या तो आपका है या उस प्रौक्सी सरवर का है जिसका आप प्रयोग कर रहे हैं और उस पर प्रतिबंध लगा दिया गया है। वास्तविक कारण था: $1",
        "cant-see-hidden-user": "जिस सदस्य को आप अवरोधित करने की कोशिश कर रहे हैं उसे पहले ही अवरोधित कर के छुपाया जा चुका है।\nचूँकि आपके पास hideuser अधिकार नहीं है, आप इस सदस्य का अवरोधन ना देख सकते हैं और ना ही सम्पादित कर सकते हैं।",
        "ipbblocked": "आप अन्य प्रयोक्ताओं को अवरोधित या अनवरोधित नहीं कर सकते, क्योंकि आप स्वयं अवरोधित हैं",
        "lockedbyandtime": "(द्वारा {{GENDER:$1|$1}} पर $2 यहां $3)",
        "move-page": "$1 ले जाएं",
        "move-page-legend": "पृष्ठ स्थानांतरण",
-       "movepagetext": "नà¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¯à¤¾ à¤¹à¥\81à¤\86 à¤«à¤¼à¥\89रà¥\8dम à¤ªà¥\83षà¥\8dठ à¤\95ा à¤¨à¤¾à¤® à¤¬à¤¦à¤² à¤¦à¥\87à¤\97ा, à¤\89सà¤\95ा à¤¸à¤¾à¤°à¤¾ à¤\87तिहास à¤­à¥\80 à¤¨à¤\8f à¤¨à¤¾à¤® à¤¸à¥\87 à¤¦à¤¿à¤\96ना à¤¶à¥\81रà¥\82 à¤¹à¥\8b à¤\9cाà¤\8fà¤\97ा।\nपà¥\81राना à¤¶à¥\80रà¥\8dषà¤\95 à¤¨à¤¯à¥\87 à¤¨à¤¾à¤® à¤\95à¥\8b à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शित à¤\95र à¤¦à¤¿à¤¯à¤¾ à¤\9cाà¤\8fà¤\97ा।\nमà¥\82ल à¤¶à¥\80रà¥\8dषà¤\95 à¤\95à¥\80 à¤\93र à¤²à¥\87 à¤\9cानà¥\87 à¤µà¤¾à¤²à¥\87 à¤ªà¥\81नारà¥\8dनिरà¥\8dदà¥\87शà¥\8bà¤\82 à¤\95à¥\8b à¤\86प à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤¬à¤¦à¤² à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82।\nयदि à¤\86प à¤\90सा à¤¨à¤¹à¥\80à¤\82 à¤\95रतà¥\87 à¤¹à¥\88à¤\82 à¤¤à¥\8b à¤\95à¥\83पया [[Special:DoubleRedirects|दà¥\8bहरà¥\87 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन]] à¤¯à¤¾ [[Special:BrokenRedirects|à¤\9fà¥\82à¤\9fà¥\87 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन]] à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\9c़रà¥\82र à¤\9cाà¤\81à¤\9a à¤\95रà¥\87à¤\82।\nà¤\95ड़ियाà¤\81 à¤¸à¤¹à¥\80 à¤\9cà¤\97ह à¤\87à¤\82à¤\97ित à¤\95रतà¥\80 à¤°à¤¹à¥\87à¤\82, à¤¯à¤¹ à¤¸à¥\81निशà¥\8dà¤\9aित à¤\95रना à¤\86पà¤\95à¥\80 à¤\9c़िमà¥\8dमà¥\87दारà¥\80 à¤¹à¥\88।\n\nà¤\85à¤\97र à¤¨à¤¯à¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤\95ा à¤²à¥\87à¤\96 à¤ªà¤¹à¤²à¥\87 à¤¸à¥\87 à¤¹à¥\88 à¤¤à¥\8b à¤¸à¥\8dथानाà¤\82तरण '''नहà¥\80à¤\82''' à¤¹à¥\8bà¤\97ा। à¤ªà¤° à¤\85à¤\97र à¤¨à¤¯à¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤µà¤¾à¤²à¤¾ à¤²à¥\87à¤\96 à¤\95हà¥\80à¤\82 à¤\94र à¤\85नà¥\81पà¥\8dरà¥\87षित à¤\95रता à¤¹à¥\88 à¤\94र à¤¸à¤¾à¤¥ à¤¹à¥\80 à¤\89सà¤\95à¥\87 à¤ªà¥\81रानà¥\87 à¤¸à¤\82सà¥\8dà¤\95रण à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88à¤\82 à¤¤à¥\8b à¤¸à¥\8dथानाà¤\82तरण à¤¹à¥\8b à¤\9cायà¥\87à¤\97ा।\nà¤\87सà¤\95ा à¤®à¤¤à¤²à¤¬ à¤\95ि à¤¯à¤¦à¤¿ à¤\86पसà¥\87 à¤\97लतà¥\80 à¤¹à¥\8b à¤\9cाà¤\8f à¤¤à¥\8b à¤\86प à¤µà¤¾à¤ªà¤¸ à¤ªà¥\81रानà¥\87 à¤¨à¤¾à¤® à¤ªà¤° à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95ा à¤¸à¥\8dथानाà¤\82तरण à¤\95र à¤¸à¤\95à¥\87à¤\82à¤\97à¥\87, à¤\94र à¤¸à¤¾à¤¥ à¤¹à¥\80 à¤\86प à¤\95िसà¥\80 à¤®à¥\8cà¤\9cà¥\82दा à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤¬à¤¦à¤²à¥\87 à¤¯à¤¹ à¤¸à¥\8dथानाà¤\82तरण à¤¨à¤¹à¥\80à¤\82 à¤\95र à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82।\n\n'''à¤\9aà¥\87तावनà¥\80!'''\nयदि à¤ªà¥\83षà¥\8dठ à¤\95ाफ़à¥\80 à¤²à¥\8bà¤\95पà¥\8dरिय à¤¹à¥\88 à¤¤à¥\8b à¤\89सà¤\95à¥\87 à¤²à¤¿à¤\8f à¤¯à¤¹ à¤\8fà¤\95 à¤¬à¤¹à¥\81त à¤¬à¤¡à¤¼à¤¾ à¤µ à¤\85à¤\95सà¥\8dमातà¥\8d à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\8b à¤¸à¤\95ता à¤¹à¥\88;\nà¤\86à¤\97à¥\87 à¤¬à¤¢à¤¼à¤¨à¥\87 à¤¸à¥\87 à¤ªà¤¹à¤²à¥\87 à¤\87सà¤\95ा à¤\85à¤\82à¤\9cाम à¤\85à¤\9aà¥\8dà¤\9bà¥\80 à¤¤à¤°à¤¹ समझ लें।",
-       "movepagetext-noredirectfixer": "नीचे दिया हुआ पर्चा पृष्ठ का नाम बदल देगा, उसका सारा इतिहास भी नए नाम से दिखना शुरू हो जाएगा।\nपुराना शीर्षक नये नाम को अनुप्रेषित करेगा ।\nमूल शीर्षक की ओर ले जाने वाले अग्रेषणों को आप स्वचालित रूप से बदल सकते हैं।\nयदि आप ऐसा नहीं करते हैं तो कृपया [[Special:DoubleRedirects|दोहरे]] पुनर्निर्देशण या [[Special:BrokenRedirects|टूटे पुनर्निर्देशन]] के लिए ज़रूर जाँच करें।\nकड़ियाँ सही जगह इंगित करती रहें, यह सुनिश्चित करना आपकी जिम्मेदारी है।\n\nअगर नये शीर्षक का लेख पहले से है तो स्थानांतरण '''नहीं''' होगा। पर अगर नये शीर्षक वाला लेख खाली है अथवा कहीं और अनुप्रेषित करता है और साथ ही उसके पुराने संस्करण नहीं हैं तो स्थानांतरण हो जायेगा ।\nइसका मतलब कि यदि आपसे गलती हो जाए तो आप वापस पुराने नाम पर इस पृष्ठ का स्थानांतरण कर सकेंगे, और साथ ही आप किसी मौजूदा पृष्ठ के बदले यह स्थानांतरण नहीं कर सकते हैं।\n\n'''चेतावनी!'''\nयदि पृष्ठ काफ़ी लोकप्रिय है तो उसके लिए यह एक बहुत बड़ा व अकस्मात् परिवर्तन हो सकता है;\nआगे बढ़ने से पहले इसका अंजाम अच्छी तरह समझ लें।\n\n'''सूचना!'''\nस्थानांतरण करनेसे कोई भी महत्वपूर्ण लेख में अनपेक्षित बदलाव हो सकते है ।\nआपसे अनुरोध है कि आप इसके परिणाम जान लें ।",
-       "movepagetalktext": "सà¤\82बà¤\82धित à¤µà¤¾à¤°à¥\8dता à¤ªà¥\83षà¥\8dठ à¤\87सà¤\95à¥\87 à¤¸à¤¾à¤¥ à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\8bà¤\97ा '''à¤\85à¤\97र:'''\n* à¤\86प à¤ªà¥\83षà¥\8dठ à¤¦à¥\81सरà¥\87 à¤¨à¤¾à¤®à¤¸à¥\8dथान à¤®à¥\87à¤\82 à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤\95र à¤°à¤¹à¥\87à¤\82 à¤¹à¥\88\n* à¤\87स à¤¨à¤¾à¤® à¤\95ा à¤µà¤¾à¤°à¥\8dता à¤ªà¥\83षà¥\8dठ à¤ªà¤¹à¤²à¥\87सà¥\87 à¤¬à¤¨à¤¾ à¤¹à¥\81वा à¤¹à¥\88, à¤¯à¤¾\n* à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¯à¤¾ à¤¹à¥\81à¤\86 à¤\9aà¥\87à¤\95 à¤¬à¥\89à¤\95à¥\8dस à¤\86पनà¥\87 à¤¨à¤¿à¤\95ाल à¤¦à¤¿à¤¯à¤¾ à¤¹à¥\88 à¥¤\n\nà¤\87न à¤®à¤¾à¤®à¤²à¥\8bà¤\82मे आपको स्वयं यह पृष्ठ जोडने पड़ सकते है ।",
+       "movepagetext": "निमà¥\8dनलिà¤\96ित à¤ªà¥\8dरारà¥\82प à¤\95à¥\8b à¤\95ाम à¤®à¥\87à¤\82 à¤²à¥\87नà¥\87 à¤ªà¤° à¤ªà¥\83षà¥\8dठ à¤\95ा à¤¨à¤¾à¤® à¤ªà¤°à¤¿à¤µà¤°à¥\8dतित à¤¹à¥\8b à¤\9cायà¥\87à¤\97ा, à¤\87सà¤\95ा à¤¸à¤®à¥\8dपà¥\82रà¥\8dण à¤\87तिहास à¤¨à¤¯à¥\87 à¤¨à¤¾à¤® à¤ªà¤° à¤¸à¥\8dथानानà¥\8dतरित à¤¹à¥\8b à¤\9cायà¥\87à¤\97ा।\nपà¥\81राना à¤¶à¥\80रà¥\8dषà¤\95 à¤¨à¤¯à¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤° à¤\8fà¤\95 à¤\85नà¥\81पà¥\8dरà¥\87षण à¤ªà¥\83षà¥\8dठ à¤¬à¤¨ à¤\9cायà¥\87à¤\97ा।\nà¤\86प à¤®à¥\82ल à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤° à¤\85नà¥\81पà¥\8dरà¥\87षिणà¥\8bà¤\82 à¤\95à¥\8b à¤¸à¥\8dवतà¤\83 à¤\85दà¥\8dयतन à¤\95र à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82।\nयदि à¤\86प à¤\90सा à¤¨à¤¹à¥\80à¤\82 à¤\95रतà¥\87 à¤¹à¥\88à¤\82 à¤¤à¥\8b [[Special:DoubleRedirects|दà¥\8dवि-à¤\85नà¥\81पà¥\8dरà¥\87षण]] à¤\94र [[Special:BrokenRedirects|à¤\9fà¥\82à¤\9fà¥\87 à¤¹à¥\81यà¥\87 à¤\85नà¥\81पà¥\8dरà¥\87षणà¥\8bà¤\82]] à¤\95à¥\80 à¤\9cाà¤\81à¤\9a à¤\95रà¥\87à¤\82।\nà¤\95ड़ियà¥\8bà¤\82 à¤\95à¥\87 à¤\86वशà¥\8dयà¤\95 à¤°à¥\82प à¤¸à¥\87 à¤¸à¤¹à¥\80 à¤¸à¥\8dथान à¤ªà¤° à¤\9cà¥\8bड़नà¥\87 à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\86प à¤\89तà¥\8dतरदायà¥\80 à¤¹à¥\88à¤\82।\n\nयदि à¤¨à¤¯à¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤° à¤ªà¤¹à¤²à¥\87 à¤¸à¥\87 à¤\95à¥\8bà¤\88 à¤ªà¥\83षà¥\8dठ à¤\89पलबà¥\8dध à¤¹à¥\88 à¤¤à¥\8b à¤ªà¥\83षà¥\8dठ à¤\95ा à¤¸à¥\8dथानानà¥\8dतरण <strong>नहà¥\80à¤\82</strong> à¤¹à¥\8bà¤\97ा à¤\9cबà¤\95ि à¤¬à¤¾à¤¦ à¤µà¤¾à¤²à¤¾ à¤\87तिहास à¤°à¤¹à¤¿à¤¤ à¤\85नà¥\81पà¥\8dरà¥\87षण à¤¨à¤¹à¥\80à¤\82 à¤¹à¥\88।\nà¤\87सà¤\95ा à¤\85रà¥\8dथ à¤¯à¤¹ à¤¹à¥\81à¤\86 à¤\95ि à¤\86प à¤\95िसà¥\80 à¤ªà¥\83षà¥\8dठ à¤\95ा à¤ªà¥\81नà¤\83 à¤¨à¤¾à¤®à¤\95रण à¤µà¤¹à¤¾à¤\81 à¤\95र à¤¸à¤\95तà¥\87 à¤¹à¥\88à¤\82 à¤\9cहाà¤\81 à¤¸à¥\87 à¤\87सà¤\95à¥\8b à¤\97लतà¥\80 à¤¸à¥\87 à¤¯à¤¹à¤¾à¤\81 à¤¸à¥\8dथानानà¥\8dतरित à¤\95िया à¤\97या à¤¹à¥\88 à¤\94र à¤\86प à¤ªà¤¹à¤²à¥\87 à¤¸à¥\87 à¤¬à¤¨à¥\87 à¤¹à¥\81यà¥\87 à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤ªà¥\81नà¤\83 à¤¨à¤¹à¥\80à¤\82 à¤²à¤¿à¤\96 à¤¸à¤\95तà¥\87।\n\n<strong>à¤\9fिपà¥\8dपणà¥\80:</strong>\nयह à¤\95िसà¥\80 à¤²à¥\8bà¤\95पà¥\8dरिय à¤ªà¥\83षà¥\8dठ à¤\95à¥\87 à¤²à¤¿à¤\8f à¤\95ठà¥\8bर à¤\94र à¤\85पà¥\8dरतà¥\8dयासित à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\8b à¤¸à¤\95ता à¤¹à¥\88;\nà¤\95à¥\83पया à¤\86à¤\97à¥\87 à¤¬à¤¢à¤¼à¤¨à¥\87 à¤¸à¥\87 à¤ªà¤¹à¤²à¥\87 à¤\87सà¤\95à¥\87 à¤ªà¤°à¤¿à¤£à¤¾à¤®à¥\8bà¤\82 à¤\95à¥\8b à¤\85à¤\9aà¥\8dà¤\9bà¥\87 à¤¸à¥\87 समझ लें।",
+       "movepagetext-noredirectfixer": "नीचे दिया हुआ पर्चा पृष्ठ का नाम बदल देगा, उसका सारा इतिहास भी नए नाम से दिखना शुरू हो जाएगा।\nपुराना शीर्षक नये नाम को अनुप्रेषित करेगा ।\nमूल शीर्षक की ओर ले जाने वाले अग्रेषणों को आप स्वचालित रूप से बदल सकते हैं।\nयदि आप ऐसा नहीं करते हैं तो कृपया [[Special:DoubleRedirects|दोहरे]] पुनर्निर्देशण या [[Special:BrokenRedirects|टूटे पुनर्निर्देशन]] के लिए ज़रूर जाँच करें।\nकड़ियाँ सही जगह इंगित करती रहें, यह सुनिश्चित करना आपकी जिम्मेदारी है।\n\nअगर नये शीर्षक का लेख पहले से है तो स्थानांतरण <strong>नहीं</strong> होगा। पर अगर नये शीर्षक वाला लेख खाली है अथवा कहीं और अनुप्रेषित करता है और साथ ही उसके पुराने संस्करण नहीं हैं तो स्थानांतरण हो जायेगा ।\nइसका मतलब कि यदि आपसे गलती हो जाए तो आप वापस पुराने नाम पर इस पृष्ठ का स्थानांतरण कर सकेंगे, और साथ ही आप किसी मौजूदा पृष्ठ के बदले यह स्थानांतरण नहीं कर सकते हैं।\n\n<strong>चेतावनी!</strong>\nयदि पृष्ठ काफ़ी लोकप्रिय है तो उसके लिए यह एक बहुत बड़ा व अकस्मात् परिवर्तन हो सकता है;\nआगे बढ़ने से पहले इसका अंजाम अच्छी तरह समझ लें।\n\n<strong>सूचना!</strong>\nस्थानांतरण करनेसे कोई भी महत्वपूर्ण लेख में अनपेक्षित बदलाव हो सकते है ।\nआपसे अनुरोध है कि आप इसके परिणाम जान लें ।",
+       "movepagetalktext": "यदि à¤\86प à¤\87स à¤¬à¥\89à¤\95à¥\8dस à¤\95à¥\8b à¤\9aà¥\87à¤\95 à¤\95रतà¥\87 à¤¹à¥\88à¤\82, à¤¸à¤\82बà¤\82धित à¤µà¤¾à¤°à¥\8dता à¤ªà¥\83षà¥\8dठ à¤¸à¥\8dवà¤\9aालित à¤°à¥\82प à¤¸à¥\87 à¤¨à¤\8f à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤° à¤²à¥\87 à¤\9cाया à¤\9cाà¤\8fà¤\97ा, à¤\9cब à¤¤à¤\95 à¤\95ि à¤\8fà¤\95 à¤°à¤¿à¤\95à¥\8dत à¤µà¤¾à¤°à¥\8dता à¤ªà¥\83षà¥\8dठ à¤ªà¤¹à¤²à¥\87 à¤¸à¥\87 à¤®à¥\8cà¤\9cà¥\82द à¤¨ à¤¹à¥\8b।\n\nà¤\87स à¤®à¤¾à¤®à¤²à¥\87 मे आपको स्वयं यह पृष्ठ जोडने पड़ सकते है ।",
        "moveuserpage-warning": "<strong>चेतावनी:</strong> आप एक सदस्य पृष्ठ स्थानांतरित करने जा रहे हैं। कृपया ध्यान दें कि केवल पृष्ठ का नाम बदला जाएगा और सदस्यनाम <em>नहीं</em> बदलेगा।",
        "movecategorypage-warning": "<strong>चेतावनी:</strong> आप एक श्रेणी पृष्ठ को स्थानांतरित करने जा रहे हैं। याद रखिए कि केवल वह पृष्ठ स्थानांतरित होगा और पुरानी श्रेणी में शामिल पृष्ठ नई श्रेणी के अंतरगत <em>नहीं</em> आएँगे।",
        "movenologintext": "लेख स्थानान्तरित करने के लिये आपका [[Special:UserLogin|लॉग इन]] किया होना आवश्यक हैं।",
        "cant-move-to-user-page": "आपको किसी पन्नो को सदस्य पृष्ठ पर ले जाने की अनुमति नहीं है (सिवाय सदस्य उप पृष्ठ के)",
        "cant-move-category-page": "आपको श्रेणी प्रष्ठों को स्थानांतरित करने की अनुमति नहीं है।",
        "cant-move-to-category-page": "आपको किसी पृष्ठ को श्रेणी पृष्ठ पर स्थानांतरित करने की अनुमति नहीं है।",
+       "cant-move-subpages": "आपको उपपृष्ठों को स्थानांतरित करने की अनुमति नहीं है।",
        "namespace-nosubpages": "\"$1\" नामस्थान उपपृष्ठ की अनुमति नहीं देता है।",
        "newtitle": "नया शीर्षक:",
        "move-watch": "ध्यान रखें",
        "movelogpagetext": "नीचे सभी स्थानान्तरणों की सूची दी गई है।",
        "movesubpage": "{{PLURAL:$1|उप पृष्ठ|उप पृष्ठ}}",
        "movesubpagetext": "नीचे $1 {{PLURAL:$1|पृष्ठ दिखाया गया है, जो इस पृष्ठ का उप पृष्ठ है|पृष्ठ दिखाया गया है, जो इस पृष्ठ के उप पृष्ठ हैं}}।",
+       "movesubpagetalktext": "{{PLURAL:$1|उप-पृष्ठ}} में संबंधित वार्ता पृष्ठ नीचे दिखाए गए हैं",
        "movenosubpage": "इस पृष्ठ के कोई उपपृष्ठ नहीं हैं।",
        "movereason": "कारण:",
        "revertmove": "पुराने अवतरण पर ले जाएं",
-       "delete_and_move_text": "==हटाने की ज़रूरत==\nलक्ष्य पृष्ठ \"[[:$1]]\" पहले से मौजूद है।\nनाम बदलने के लिये क्या आप इसे हटाना चाहते हैं?",
+       "delete_and_move_text": "लक्ष्य पृष्ठ \"[[:$1]]\" पहले से मौजूद है।\nनाम बदलने के लिये क्या आप इसे हटाना चाहते हैं?",
        "delete_and_move_confirm": "जी हाँ, पृष्ठ हटाएँ",
        "delete_and_move_reason": "\"[[$1]]\" से स्थानांतरण करने के लिये जगह बनाई गयी है",
        "selfmove": "स्रोत और लक्ष्य शीर्षक समान हैं;\nपृष्ठ अपने ही जगह पर स्थानांतरित नहीं हो सकता।",
        "move-leave-redirect": "एक पुनर्निर्देशन पीछे छोड़ते जाएँ",
        "protectedpagemovewarning": "'''चेतावनी:''' यह पृष्ठ तालाबंद है अतः केवल वही सदस्य इनका स्थानांतरण कर सकते हैं जो प्रबंधक हों।\nनिम्न् तलिका मे ताजा सदस्यो कि जानकारी दि गयि है:",
        "semiprotectedpagemovewarning": "'''सूचना:''' यह पृष्ठ सुरक्षित कर दिया गया है और इसे केवल पंजीकृत सदस्य ही स्थानांतरित कर सकते हैं।\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:",
-       "move-over-sharedrepo": "== फ़ाइल मौजूद है ==\n[[:$1]] एक साझे भंडार पर मौजूद है। इस नाम पर स्थानांतरण से नई फ़ाइल साझा फ़ाइल को ओवरराइड करेगी।",
+       "move-over-sharedrepo": "[[:$1]] एक साझे भंडार पर मौजूद है। इस नाम पर स्थानांतरण से नई फ़ाइल साझा फ़ाइल को ओवरराइड करेगी।",
        "file-exists-sharedrepo": "चयनित फ़ाइल नाम पहले ही एक साझा भण्डार में प्रयुक्त है।\nकृपया अन्य नाम चुनें।",
        "export": "पन्नों का निर्यात करें",
        "exporttext": "आप विशिष्ठ पृष्ठ के विषय वस्तु और संपादन इतिहास को निर्यात कर सकते हैं अथवा पृष्ठों के समूह को कुछ XML में लपेट सकते हैं।\nयह [[Special:Import|आयात पृष्ठ]] की सहायता से मीडियाविकी का प्रयोग करके दूसरी विकी से आयात किया जा सकता है।\n\nपृष्ठों को निर्यात करने के लिए, नीचे विषय वस्तु संदूक में शीर्षक प्रवेश करें, एक शीर्षक प्रति पंक्ति, और चुने कि आप वर्त्तमान अवतरण के साथ पुराने अवतरण भी चाहते हैं कि नहीं, या पिछले संपादन के बारे में जानकारी के साथ केवल वर्त्तमान अवतरण चाहते हैं।\n\nबाद वाली स्थिति के लिए आप एक सम्पर्क भी प्रयोग कर सकते हैं, उदाहरण के लिए, \"[[{{MediaWiki:Mainpage}}]]\" पृष्ठ के लिए [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।",
        "import-nonewrevisions": "कोई अवतरण आयात नहीं किये गये (या तो सभी अवतरण पहले से मौजूद हैं, या त्रुटियों के कारण छोड़े गये)।",
        "xml-error-string": "$1 पंक्ति $2 में, कॉलम $3 (बाईट $4): $5",
        "import-upload": "XML डाटा अपलोड करें",
-       "import-token-mismatch": "सत्र सामग्री खो गई है। \nकृपया पुनः प्रयास करें।",
+       "import-token-mismatch": "सत्र सामग्री खो गई है।\n\nशायद आपने सत्रान्त कर दिया। <strong>कृपया इसकी पुष्टि करें कि आप अब तक लॉग-इन हैं और पुनः प्रयास करें</strong>।\nयदि यह अब भी कार्य नहीं करता है, [[Special:UserLogout|सत्रान्त]] करें और पुनः लॉग-इन करें एवं यह जाँचें की आपका ब्राउज़र इस साइट के लिए कुकीज़ को अनुमत करता है।",
        "import-invalid-interwiki": "इस विकि से आयात नहीं हो सकता है।",
        "import-error-edit": "पृष्ठ \"$1\" आयात नहीं किया गया है क्योंकि आपको उसे संपादित करने की अनुमति नहीं हैं।",
        "import-error-create": "पृष्ठ \"$1\" आयात नहीं किया गया है क्योंकि आपको उसे बनाने की अनुमति नहीं हैं।",
        "tooltip-pt-mycontris": "आपके योगदानों की सूची",
        "tooltip-pt-anoncontribs": "इस आईपी पते से संपादन की सूची",
        "tooltip-pt-login": "आपको सत्रारम्भ करने के लिए प्रोत्साहित किया जाता है; लेकिन यह अनिवार्य नहीं है",
+       "tooltip-pt-login-private": "इस विकि का उपयोग करने हेतु लॉगिन (प्रवेश) करें",
        "tooltip-pt-logout": "प्रस्थान",
        "tooltip-pt-createaccount": "हमारा सुझाव है की आप खाता बनाएँ और लॉगिन करें, परन्तु यह अनिवार्य नहीं है",
        "tooltip-ca-talk": "सामग्री पृष्ठ के बारे में वार्तालाप",
        "tooltip-t-recentchangeslinked": "यहाँ जुड़े हुए सभी पन्नों में हुए हाल के बदलाव",
        "tooltip-feed-rss": "इस पृष्ठ की आरएसएस फ़ीड",
        "tooltip-feed-atom": "इस पृष्ठ की अणु फ़ीड",
-       "tooltip-t-contributions": "{{GENDER:$1|à¤\87स à¤¸à¤¦à¤¸à¥\8dय}} à¤\95à¥\87 à¤¯à¥\8bà¤\97दाà¤\93ं की सूची",
+       "tooltip-t-contributions": "{{GENDER:$1|à¤\87स à¤¸à¤¦à¤¸à¥\8dय}} à¤\95à¥\87 à¤¯à¥\8bà¤\97दानà¥\8bं की सूची",
        "tooltip-t-emailuser": "{{GENDER:$1|इस सदस्य}} को इमेल भेजें",
        "tooltip-t-info": "इस पृष्ठ के बारे में अधिक जानकारी",
        "tooltip-t-upload": "फ़ाइल अपलोड करें",
        "newimages-summary": "यह विशेष पृष्ठ हाल ही में अपलोड की गयी फ़ाइलें दिखाता है।",
        "newimages-legend": "छननी",
        "newimages-label": "संचिका नाम (या उसका अंश):",
+       "newimages-user": "आईपी पता या सदस्यनाम",
        "newimages-showbots": "बॉट के अपलोड दिखाइये",
        "newimages-hidepatrolled": "जाँचा हुआ अपलोड छुपाएँ",
        "noimages": "देखने के लिए कुछ नहीं है।",
+       "gallery-slideshow-toggle": "टॉगल थंबनेल",
        "ilsubmit": "खोजें",
        "bydate": "तिथि अनुसार",
        "sp-newimages-showfrom": "$2, $1 के बाद की फ़ाईलें दर्शायें",
        "invalidateemail": "इ-मेल प्रमाणिकरण रद्द करें",
        "notificationemail_subject_changed": "{{SITENAME}} पंजीकृत ईमेल खाता बदला गया।",
        "notificationemail_subject_removed": "{{SITENAME}} पंजीकृत ईमेल खाता हटाया गया।",
+       "notificationemail_body_changed": "आप या किसी और व्यक्ति ने $1 आईपी पते से,\n{{SITENAME}} में आपके खाते का ईमेल पता \"$2\" से बदल कर \"$3\" कर दिया है। \n\nयदि यह आपने नहीं किया है, तो कृपया तुरंत प्रबन्धकों को इसकी सूचना दें।",
+       "notificationemail_body_removed": "आप या किसी और व्यक्ति ने $1 आईपी पते से,\n{{SITENAME}} में आपके खाते से ईमेल पता \"$2\" को हटा दिया है।\n\nयदि यह आपने नहीं किया है, तो कृपया तुरंत प्रबन्धकों को इसकी सूचना दें।",
        "scarytranscludedisabled": "[आंतरविकि ट्रान्स्क्लुडिंग बंद हैं]",
        "scarytranscludefailed": "[$1 के लिये साँचा मँगा नहीं पाए]",
        "scarytranscludefailed-httpstatus": "[$1 के लिये साँचा मँगा नहीं पाए, त्रुटि: HTTP $2]",
        "scarytranscludetoolong": "[यूआरएल बहुत लंबा है]",
        "deletedwhileediting": "'''Warning''': आपने जब से संपादन शुरू किया है, उसके बाद से यह पृष्ठ ही मिटा दिया गया है!",
-       "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|talk]]) ने इसे हटा दिया है।  कृपया पुष्टि करें कि आप इस पृष्ठ को पुनः बनाना चाहते हैं।",
        "recreate": "फिरसे बनायें",
        "unit-pixel": "px",
+       "confirm-purge-title": "पृष्ठ ताजा करें",
        "confirm_purge_button": "ओके",
-       "confirm-purge-top": "à¤\95à¥\8dया à¤\86प à¤¯à¤¹ à¤ªà¥\83षà¥\8dठ à¤\95ा à¤\95à¥\88श à¤\96़ालà¥\80 à¤\95रनà¥\87 à¤\9aाहिà¤\8f?",
+       "confirm-purge-top": "à¤\87स à¤ªà¥\87à¤\9c à¤\95ा à¤\95à¥\88श à¤\96ालà¥\80 à¤\95रà¥\87à¤\82?",
        "confirm-purge-bottom": "किसी पृष्ठ को मिटाने से संचिका साफ़ हो जाती है और इस वजह से ताज़ातरीन संस्करण प्रकट हो जाता है।",
        "confirm-watch-button": "ठीक है",
        "confirm-watch-top": "इस पृष्ठ को अपने ध्यानसूची में जोड़ें?",
        "version-libraries-description": "विवरण",
        "version-libraries-authors": "लेखक",
        "redirect": "फ़ाइल, सदस्य, पृष्ठ, अवतरण या लॉग आईडी द्वारा अनुप्रेषित",
-       "redirect-summary": "यह à¤µà¤¿à¤¶à¥\87ष à¤ªà¥\83षà¥\8dठ à¤«à¤¼à¤¾à¤\87लनाम à¤ªà¥\8dरदान à¤\95रनà¥\87 à¤ªà¤° à¤«à¤¼à¤¾à¤\87ल à¤¨à¤¾à¤® à¤\95à¥\8b, à¤ªà¥\83षà¥\8dठ à¤\86à¤\87॰दà¥\80 à¤\85थवा à¤\85वतरण à¤\86à¤\87॰दà¥\80 à¤¦à¥\87नà¥\87 à¤ªà¤° à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b, à¤\94र à¤¸à¤¦à¤¸à¥\8dय à¤\86à¤\87॰दà¥\80 à¤¦à¥\87नà¥\87 à¤ªà¤° à¤¸à¤¦à¤¸à¥\8dय à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤ªà¥\81नरà¥\8dपà¥\8dरà¥\87षित à¤\95रता à¤¹à¥\88। à¤\89दाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], à¤¯à¤¾ [[{{#Special:Redirect}}/user/101]]।",
+       "redirect-summary": "यह à¤µà¤¿à¤¶à¥\87ष à¤ªà¥\83षà¥\8dठ à¤\8fà¤\95 à¤«à¤¾à¤\87ल (फाà¤\87ल à¤¨à¤¾à¤® à¤¦à¤¿à¤¯à¤¾ à¤\97या), à¤\8fà¤\95 à¤ªà¥\83षà¥\8dठ (à¤\8fà¤\95 à¤\85वतरण à¤ªà¤¤à¤¾ à¤\85थवा à¤ªà¥\83षà¥\8dठ à¤ªà¤¤à¤¾ à¤¦à¤¿à¤¯à¤¾ à¤\97या), à¤\8fà¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¥\83षà¥\8dठ (à¤\8fà¤\95 à¤¸à¤\82à¤\96à¥\8dयातà¥\8dमà¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¤à¤¾) à¤\85थवा à¤\8fà¤\95 à¤²à¥\89à¤\97 à¤ªà¥\8dरविषà¥\8dà¤\9fि (लà¥\89à¤\97 à¤ªà¤¤à¤¾ à¤¦à¤¿à¤¯à¤¾ à¤\97या) à¤ªà¤° à¤\85नà¥\81पà¥\8dरà¥\87षित à¤¹à¥\8bता à¤¹à¥\88। à¤\89पयà¥\8bà¤\97: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], à¤\85थवा [[{{#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": "à¤\8fà¤\95à¥\8dसà¤\9fà¥\87à¤\82शन द्वारा परिभाषित",
+       "tags-source-extension": "सà¥\89फà¥\8dà¤\9fवà¥\87यर द्वारा परिभाषित",
        "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-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\" को हटाए जाने की अनुमति नहीं है।",
        "htmlform-date-placeholder": "वववव-मम-दद",
        "htmlform-time-placeholder": "घघ:मम:सस",
        "htmlform-datetime-placeholder": "वववव-मम-दद हह:मम:सस",
+       "htmlform-date-invalid": "आपने जो मान डाला है, उसे दिनांक के रूप में नहीं पहचान पा रहा है। YYYY-MM-DD के प्रारूप में प्रयास करें।",
+       "htmlform-time-invalid": "आपने जो मान डाला है, उसे समय के रूप में नहीं पहचान पा रहा है। HH:MM:SS के प्रारूप में प्रयास करें।",
+       "htmlform-datetime-invalid": "आपने जो मान डाला है, उसे दिनांक और समय के रूप में नहीं पहचान पा रहा है। YYYY-MM-DD HH:MM:SS के प्रारूप में प्रयास करें।",
+       "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> à¤®à¤¾à¤¨à¥\8dय à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता नाम नहीं है।",
+       "htmlform-user-not-valid": "<strong>$1</strong> à¤®à¤¾à¤¨à¥\8dय à¤¸à¤¦à¤¸à¥\8dय नाम नहीं है।",
        "logentry-delete-delete": "$1 ने पृष्ठ $3 {{GENDER:$2|हटा}} दिया",
-       "logentry-delete-restore": "$1 ने पृष्ठ $3 को {{GENDER:$2|पुनर्स्थापित}} कर दिया",
+       "logentry-delete-delete_redir": "$1 ने $3 से पुनर्निर्देशन {{GENDER:$2|हटाकर}} अन्य जानकारी डाल दी।",
+       "logentry-delete-restore": "$1 ने पृष्ठ $3 ($4) को {{GENDER:$2|पुनर्स्थापित}} कर दिया",
+       "logentry-delete-restore-nocount": "$1 $3 पृष्ठ {{GENDER:$2|को बहाल किया}}",
+       "restore-count-revisions": "{{PLURAL:$1|1 संशोधन|$1 संशोधन}}",
+       "restore-count-files": "{{PLURAL:$1|1 फ़ाइल|$1 फ़ाइल}}",
        "logentry-delete-event": "$1 ने $3 पृष्ठ की लॉग {{PLURAL:$5|प्रविष्टि|प्रविष्टियों}} की दृश्यता {{GENDER:$2|बदली}}: $4",
        "logentry-delete-revision": "$1 ने $3 पृष्ठ के {{PLURAL:$5|एक अवतरण|$5 अवतरणों}} की दृश्यता {{GENDER:$2|बदली}}: $4",
        "logentry-delete-event-legacy": "$1 ने $3 पृष्ठ पर लॉग क्रियाओं की दृश्यता {{GENDER:$2|बदली}}",
        "revdelete-uname-unhid": "सदस्यनाम फिर सार्वजनिक किया गया",
        "revdelete-restricted": "प्रबंधकोंको प्रतिबंधित किया",
        "revdelete-unrestricted": "प्रबंधकोंके प्रबंधन हटायें",
-       "logentry-block-block": "$1 {{GENDER:$2|प्रतिबंधित}}{{GENDER:$4|$3}} जिसमें समय समाप्ति की अवधि है $5 $6",
+       "logentry-block-block": "$1 ने {{GENDER:$4|$3}} को $5 के लिए {{GENDER:$2|अवरोधित}} कर दिया। $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|प्रतिबंधित}} {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1 {{GENDER:$2|changed}} प्रतिबंध सेटिंग {{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-block-reblock": "$1 ने {{GENDER:$4|$3}} के अवरोध में {{GENDER:$2|बदलाव}} कर दिया और यह अवरोध $5 रहेगा। $6",
+       "logentry-suppress-block": "$1 ने {{GENDER:$4|$3}} को $5 के लिए {{GENDER:$2|अवरोधित}} कर दिया। $6",
+       "logentry-suppress-reblock": "$1 ने {{GENDER:$4|$3}} के अवरोध में {{GENDER:$2|बदलाव}} कर दिया और यह अवरोध $5 रहेगा। $6",
        "logentry-import-upload": "$1 {{GENDER:$2|आयात किया गया}} $3 फ़ाइल अपलोड के माध्यम से",
-       "logentry-import-upload-details": "$1 à¤¨à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤\85पलà¥\8bड à¤¦à¥\8dवारा $3 à¤\95à¥\8b {{GENDER:$2|à¤\86यात}} à¤\95िया ($4 {{PLURAL:$4|à¤\85वतरण|à¤\85वतरण}})",
+       "logentry-import-upload-details": "$1 à¤¨à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤\85पलà¥\8bड à¤¸à¥\87 $3 à¤\95à¥\87 ($4 {{PLURAL:$4|à¤\85वतरण|à¤\85वतरणà¥\8bà¤\82}}) à¤\95à¥\8b {{GENDER:$2|à¤\86यात}} à¤\95िया।",
        "logentry-import-interwiki": "$1 {{GENDER:$2|आयात किया गया}} $3 किसी और विकि से",
-       "logentry-import-interwiki-details": "$1 ने $5 से $3 को {{GENDER:$2|आयात}} किया ($4 {{PLURAL:$4|अवतरण|अवतरण}})",
+       "logentry-import-interwiki-details": "$1 ने $3 के ($4 {{PLURAL:$4|अवतरण|अवतरणों}}) को $5 से {{GENDER:$2|आयात}} किया।",
        "logentry-merge-merge": "$1 {{GENDER:$2|विलय किया गया}} $3 को $4 में (संशोधन $5 तक)",
        "logentry-move-move": "$1 ने $3 पृष्ठ $4 पर {{GENDER:$2|स्थानांतरित}} किया",
        "logentry-move-move-noredirect": "$1 ने $3 पर पुनर्निर्देश छोड़े बिना उसे $4 पर {{GENDER:$2|स्थानांतरित}} किया",
        "logentry-protect-protect-cascade": "$1 ने $3 $4 {{GENDER:$2|सुरक्षित किया}} [व्यापक]",
        "logentry-protect-modify": "$1 ने $3 $4 का सुरक्षा स्तर {{GENDER:$2|परिवर्तित किया}}",
        "logentry-protect-modify-cascade": "$1 ने $3 $4 का सुरक्षा स्तर {{GENDER:$2|परिवर्तित किया}} [व्यापक]",
-       "logentry-rights-rights": "$1 ने $3 के सदस्य समूह $4 से बदलकर $5 {{GENDER:$2|किये}}",
+       "logentry-rights-rights": "$1 ने {{GENDER:$6|$3}} के सदस्य समूह $4 से बदलकर $5 {{GENDER:$2|किये}}",
        "logentry-rights-rights-legacy": "$1 ने $3 के सदस्य समूह {{GENDER:$2|बदले}}",
        "logentry-rights-autopromote": "$1 के सदस्य समूह स्वतः $4 से बदलकर $5 {{GENDER:$2|किये}} गए",
        "logentry-upload-upload": "$1 {{GENDER:$2|ने}} $3 अपलोड किया",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|उद्यतन किए गए}} टैग संशोधन $4 पर पृष्ठ $3 के ({{PLURAL:$7|जोड़ दिए गए}} $6; {{PLURAL:$9|हटाए गए}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|उद्यतन किए गए}} टैग संशोधन $5 पर पृष्ठ $3 के ({{PLURAL:$7|जोड़ दिए गए}} $6; {{PLURAL:$9|हटाए गए}} $8)",
        "rightsnone": "(कोई नहीं)",
-       "revdelete-summary": "संपादन सारांश",
+       "rightslogentry-temporary-group": "$1 (अस्थाई, $2 तक)",
        "feedback-adding": "पृष्ठ पर प्रतिक्रिया जोड़ना ...",
        "feedback-back": "पीछे जाएँ",
        "feedback-bugcheck": "शानदार! जांच ले कहीं ये [ $1 known bugs] पहले से ही न हो ।",
        "feedback-thanks": "धन्यवाद! आपकी प्रतिक्रिया पृष्ठ में नियुक्त किया गया है \"[ $2  $1 ]\"।",
        "feedback-thanks-title": "धन्यवाद!",
        "feedback-useragent": "सदस्य कर्ता:",
-       "searchsuggest-search": "खोजें {{SITENAME}}",
+       "searchsuggest-search": "{{SITENAME}} में खोजें",
        "searchsuggest-containing": "...से युक्त",
        "api-error-badtoken": "आंतरिक त्रुटि: बुरी टोकन।",
        "api-error-emptypage": "नए खाली पृष्ठ बनाने की अनुमति नहीं है।",
        "api-error-publishfailed": "आंतरिक त्रुटि: सर्वर अस्थाई फ़ाइल को प्रकासन करने में विफल।",
        "api-error-stashfailed": "आंतरिक त्रुटि: सर्वर अस्थाई फ़ाइल को संग्रहीत करने में विफल।",
-       "api-error-unknown-warning": "अज्ञात चेतावनी: $1",
+       "api-error-unknown-warning": "अज्ञात चेतावनी: \"$1\"।",
        "api-error-unknownerror": "अज्ञात त्रुटि: \" $1 \"",
        "duration-seconds": "$1 {{PLURAL:$1|सॅकेंड}}",
        "duration-minutes": "$1 {{PLURAL:$1|मिनट}}",
        "expand_templates_generate_xml": "XML का पार्स (parse) वृक्ष दर्शायें",
        "expand_templates_generate_rawhtml": "सीधे-साधा एचटीएमएल दिखाएँ",
        "expand_templates_preview": "झलक",
-       "expand_templates_preview_fail_html": "<strong>à¤\85à¤\97र à¤¯à¤¹ à¤µà¥\88ध à¤ªà¥\82रà¥\8dववावलà¥\8bà¤\95न à¤ªà¥\8dरयास à¤¹à¥\88, à¤¤à¥\8b à¤«à¤¿à¤° à¤¸à¥\87 à¤ªà¥\8dरयास à¤\95à¥\80à¤\9cिà¤\8f।</strong>\nà¤\85à¤\97र à¤\87ससà¥\87 à¤\95ाम à¤¨ à¤¬à¤¨à¥\87 à¤¤à¥\8b [[Special:UserLogout|लà¥\89à¤\97 à¤\86à¤\89à¤\9f à¤¹à¥\8bà¤\95र]] à¤«à¤¿à¤° à¤¸à¥\87 à¤²à¥\89à¤\97 à¤\87न à¤¹à¥\8b à¤\9cाà¤\87यà¥\87।",
+       "expand_templates_preview_fail_html": "<strong>à¤\85à¤\97र à¤¯à¤¹ à¤µà¥\88ध à¤ªà¥\82रà¥\8dववावलà¥\8bà¤\95न à¤ªà¥\8dरयास à¤¹à¥\88, à¤¤à¥\8b à¤«à¤¿à¤° à¤¸à¥\87 à¤ªà¥\8dरयास à¤\95à¥\80à¤\9cिà¤\8f।</strong>\nà¤\85à¤\97र à¤\87ससà¥\87 à¤\95ाम à¤¨ à¤¬à¤¨à¥\87 à¤¤à¥\8b [[Special:UserLogout|सतà¥\8dराà¤\82त à¤¹à¥\8bà¤\95र]] à¤ªà¥\81नà¤\83 à¤¸à¥\87 à¤²à¥\89à¤\97 à¤\87न à¤\95रà¥\87à¤\82 à¤\94र à¤\9cाà¤\81à¤\9a à¤\95रà¥\87à¤\82 à¤\95à¥\80 à¤\86पà¤\95ा à¤¬à¥\8dराà¤\89à¤\9c़र à¤\87स à¤¸à¤¾à¤\87à¤\9f à¤ªà¤° à¤\95à¥\81à¤\95à¥\80à¤\9c à¤\95à¥\8b à¤\85नà¥\81मत à¤\95रता à¤¹à¥\88।",
        "expand_templates_preview_fail_html_anon": "<em>चूँकि {{SITENAME}} सीधे-साधे रूप से एचटीएमएल-सक्षम है और आप लॉग्ड इन नहीं है, पूर्वावलोकन छिपा हुआ है ताकि सम्भावित जावास्क्रिप्ट हमले को रोका सके।</em>\n\n<strong>अगर यह वैध पूर्वावलोकन प्रयास है तो कृपया [[Special:UserLogin|लॉग इन करके]] फिर से प्रयास कीजिए।</strong>",
        "expand_templates_input_missing": "आपको कम से कम कुछ पाठ्य प्रदान करने पड़ेंगे।",
        "pagelanguage": "पृष्ठ भाषा बदलें",
        "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": "भाषा बदलाव लॉग",
        "special-characters-group-thai": "थाई",
        "special-characters-group-lao": "लाओ",
        "special-characters-group-khmer": "खमेर",
+       "special-characters-group-canadianaboriginal": "कनाडाई एबोरिजिनल",
        "special-characters-title-endash": "एन डैश",
        "special-characters-title-emdash": "एम डैश",
        "special-characters-title-minus": "ऋण चिह्न",
        "mw-widgets-dateinput-no-date": "कुछ चयनित नहीं",
        "mw-widgets-dateinput-placeholder-day": "DD-MM-YYYY",
+       "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": "श्रेणी जोड़ें...",
+       "mw-widgets-usersmultiselect-placeholder": "और जोड़ें...",
+       "date-range-from": "दिनांक से (शुरू):",
+       "date-range-to": "दिनांक तक (समाप्त):",
        "sessionmanager-tie": "एक साथ कई अनुरोध को नहीं मिला सकता: $1",
        "sessionprovider-generic": "$1 सत्र",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "कुकी-आधारित सत्र",
        "sessionprovider-nocookies": "हो सकता है कि कुकी निष्क्रिय है। कृपया देखें कि और सक्रिय करें।",
        "randomrootpage": "अविशिष्ट मूल पृष्ठ",
-       "log-action-filter-block": "प्रतिबंध के प्रकार:",
+       "log-action-filter-block": "अवरोध के प्रकार:",
+       "log-action-filter-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-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-block-unblock": "अवरोध हटाना",
+       "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-import-interwiki": "अंतरविकि आयात",
        "log-action-filter-import-upload": "एक्सएमएल अपलोड द्वारा आयात",
        "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-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-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-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": "पà¥\8dरवà¥\87श करने में अक्षम।",
-       "authpage-cannot-login-continue": "पà¥\8dरवà¥\87श à¤\95रनà¥\87 à¤®à¥\87à¤\82 à¤\85à¤\95à¥\8dषम। हो सकता है कि आपका सत्र समय समाप्त हो गया।",
+       "authpage-cannot-login": "लà¥\89à¤\97 à¤\87न करने में अक्षम।",
+       "authpage-cannot-login-continue": "लà¥\89à¤\97 à¤\87न à¤\95रनà¥\87 à¤®à¥\87à¤\82 à¤\85à¤\95à¥\8dषम, हो सकता है कि आपका सत्र समय समाप्त हो गया।",
        "authpage-cannot-create": "खाता निर्माण में अक्षम है।",
        "authpage-cannot-create-continue": "खाता निर्माण में अक्षम है। हो सकता है कि आपका सत्र समाप्त हो गया हो।",
        "authpage-cannot-link": "खाता जोड़ना शुरू नहीं कर सकते।",
        "linkaccounts-submit": "खाता जोड़ें",
        "unlinkaccounts": "खाता अलग करें",
        "unlinkaccounts-success": "खाता अलग हो गया।",
+       "authenticationdatachange-ignored": "प्रमाणीकरण डेटा परिवर्तन का संचालन नहीं किया गया था। शायद कोई प्रदाता कॉन्फ़िगर नहीं हुआ था?",
+       "userjsispublic": "ध्यान दें: जावास्क्रिप्ट के उपपृष्ठ में कोई भी निजी जानकारी नहीं होनी चाहिए, क्योंकि इसे कोई भी देख सकता है।",
+       "usercssispublic": "ध्यान दें: सीसीएस के उपपृष्ठ में कोई भी निजी जानकारी नहीं होनी चाहिए, क्योंकि इसे कोई भी देख सकता है।",
        "restrictionsfield-badip": "अमान्य आईपी पते या सीमा: $1",
        "restrictionsfield-label": "अनुमत आईपी सीमा:",
+       "restrictionsfield-help": "एक आईपी पता या सीडीआरएल सीमा प्रति पंक्ति में लिखें। सभी को सक्रिय करने के लिए <pre>0.0.0.0/0::/0</pre> का उपयोग करें।",
        "revid": "अवतरण $1",
-       "pageid": "पेज आईडी"
+       "pageid": "पेज आईडी $1",
+       "rawhtml-notallowed": "&lt;html&gt; टैग का उपयोग सामान्य पन्नों के बाहर नहीं किया जा सकता है।",
+       "gotointerwiki": "आप {{SITENAME}} से बाहर जा रहे हैं।",
+       "gotointerwiki-invalid": "दिया गया शीर्षक अमान्य है।",
+       "gotointerwiki-external": "[[$2]] एक बाहरी वेबसाइट है, जिसमें जाने के लिए आप {{SITENAME}} को छोड़ रहे हैं।\n\n[$1 $1 पर जाने के लिए इस पर क्लिक करें]।",
+       "undelete-cantedit": "आप इस पन्ने को वापस नहीं ला सकते, क्योंकि आपको इस पन्ने पर सम्पादन की अनुमति नहीं है।",
+       "undelete-cantcreate": "आप इस पन्ने को वापस नहीं ला सकते, क्योंकि यह पन्ना इस नाम से है ही नहीं और आपको इस पन्ने के निर्माण की अनुमति भी नहीं है।"
 }
index 12ea679..0466d5f 100644 (file)
@@ -17,7 +17,8 @@
                        "Matma Rex",
                        "V6rg",
                        "C.R.",
-                       "Smcnarayan"
+                       "Smcnarayan",
+                       "Vito Genovese"
                ]
        },
        "tog-underline": "Jorr ke niche line khicho:",
        "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",
        "logout": "Log out",
        "userlogout": "Sadasya logout",
        "notloggedin": "Aap logged in nai hai",
        "userlogin-noaccount": "Aap ke lage account hae?",
        "userlogin-joinproject": "{{SITENAME}} ke join karo",
-       "nologin": "Account nai hai? '''$1'''.",
-       "nologinlink": "Nawaa account banao",
        "createaccount": "Nawaa account banao",
-       "gotaccount": "Aap ke pas pahile se account hai ki nai? '''$1'''.",
-       "gotaccountlink": "Log in",
-       "userlogin-resetlink": "Ka aap aapan login kare waala jaankari ke bhulae gaya hae?",
        "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.",
        "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",
        "preview": "Jhalak dekhao",
        "showpreview": "Preview dekhao",
        "showdiff": "Badlao dekhao",
-       "blankarticle": "<strong>Chetauni:</strong> Jon panna ke aap banata hae, me kuchh likha nai hae. \nAgar aap \"{{int:savearticle}}\" ke fir se click karaa, tab khaali panna ban jaai.",
+       "blankarticle": "<strong>Chetauni:</strong> Jon panna ke aap banata hae, me kuchh likha nai hae. \nAgar aap \"$1\" ke fir se click karaa, tab khaali panna ban jaai.",
        "anoneditwarning": "'''Sawadhaan:''' Aap login nai karaa hai\nAap ke IP address ke sab koi dekhe saki agar aap koi badlao karra. Agar aap <strong>>[$1 log in]</strong> or <strong>[$2 create an account]</strong>, tab aap ke badlao aap ke naam ke niche dekhai, aur duusra benefits ke saathe.",
        "anonpreviewwarning": "\"Aap log in nai bhaya hae. Ii panna ke bachae pe aap ke IP address ke panna ke badlao ke itihass me likha jaai.\"",
        "missingsummary": "'''Suchna:''' Aap badlao ke sanchhit me nai likha hai.\nAgar aap Save ke fir se click karaa tab, aap ke badlao bina summary ke save kar lewa jaai.",
-       "selfredirect": "<strong>Chetauni:</strong> Aap ii panna ke apne me redirect kartaa hae. \nAap saait wrong target ke specify karaa, nai to wrong panna ke badaltaa hae.\nAgar aap  \"{{int:savearticle}}\" ke fir se click karaa tab redirect ban jaai.",
+       "selfredirect": "<strong>Chetauni:</strong> Aap ii panna ke apne me redirect kartaa hae. \nAap saait wrong target ke specify karaa, nai to wrong panna ke badaltaa hae.\nAgar aap  \"$1\" ke fir se click karaa tab redirect ban jaai.",
        "missingcommenttext": "Meharbani kar ke niche aapan vichar deo.",
-       "missingcommentheader": "<strong>Yaad karawa jaae hae:</strong> Aap ii vichar ke vishay nai likha hai.\nAgar aap \"{{int:savearticle}}\"  pe click karaa tab bina vishay ke iske bachae dewa jaai.",
+       "missingcommentheader": "<strong>Yaad karawa jaae hae:</strong> Aap ii vichar ke vishay nai likha hai.\nAgar aap \"$1\"  pe click karaa tab bina vishay ke iske bachae dewa jaai.",
        "summary-preview": "Sanchhep jhalak:",
        "subject-preview": "Suchi ke jhalak:",
        "previewerrortext": "Aap ke badlao ke preview kare ke time kuchh garrbarro hae gais hai.",
        "editingsection": "Sampadan $1 (bhaag)",
        "editingcomment": "$1 ke badla jae hai (nawaa section)",
        "editconflict": "Badle me conflict: $1",
-       "explainconflict": "Aap ke ii panna ke badle ke suruu kare ke baad, aur koi ii panna ke badal diis hai.\nUppar ke text area panna ke text jaise abhi hai ke dekhawa jae hai.\nAap ke badlao ke lower text area me dekawa jae hai.\nAap ke aapan badlao ke existing text me merge kare ke parri.\n'''Khali''' text in the upper text area  ke save karaa jai jab aap \"{{int:savearticle}}\" ke press karega.",
+       "explainconflict": "Aap ke ii panna ke badle ke suruu kare ke baad, aur koi ii panna ke badal diis hai.\nUppar ke text area panna ke text jaise abhi hai ke dekhawa jae hai.\nAap ke badlao ke lower text area me dekawa jae hai.\nAap ke aapan badlao ke existing text me merge kare ke parri.\n'''Khali''' text in the upper text area  ke save karaa jai jab aap \"$1\" ke press karega.",
        "yourtext": "Aap ke text",
        "storedversion": "Bachawa gais version",
        "nonunicodebrowser": "'''CHETAUNI: Aap ke browser unicode ke nai maane hae.\nEk workaround uu jagah hae jahan pe aap thik se panna ke badle sakta hae: non-ASCII akchhar edit box me hexadecimal codes dekhai.'''",
        "right-editsemiprotected": "Badla gais panna ke \"{{int:protect-level-autoconfirmed}}\" ke rakam bachawa gais hae",
        "right-editcontentmodel": "Panna ke content model ke badlo",
        "right-editinterface": "User interface ke badlo",
-       "right-editusercssjs": "Duusra sadsya ke CSS aur JS files ke badlo",
        "right-editusercss": "Duusra sadsya ke CSS files ke badlo",
        "right-edituserjs": "Duusra sadsya ke JS files ke badlo",
        "right-editmyusercss": "Aapan CSS files ke badlo",
        "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 (registered sadasya ke khaatir)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Newcomers",
-       "rcfilters-filter-userExpLevel-newcomer-description": "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",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Newcomers",
+       "rcfilters-filter-user-experience-level-newcomer-description": "10 se kamtii badlao aur 4 din se kamtii activity.",
+       "rcfilters-filter-user-experience-level-learner-label": "Sikhe waala",
+       "rcfilters-filter-user-experience-level-learner-description": "More days of activity and edits than 'Newcomers' but fewer than 'Experienced users.'",
+       "rcfilters-filter-user-experience-level-experienced-label": "Experienced users",
+       "rcfilters-filter-user-experience-level-experienced-description": "30 din se jaada activity aur 500 se jaada badlao",
        "rcfilters-filtergroup-automated": "Automated contributions",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Edits made by automated tools.",
        "rcshowhidecategorization": "$1 page categorization",
        "rcshowhidecategorization-show": "Dekhao",
        "rcshowhidecategorization-hide": "Lukao",
-       "rclinks": "Pichhla $1 badlao pichle $2 din me dekhao <br />$3",
+       "rclinks": "Pichhla $1 badlao pichle $2 din me dekhao",
        "diff": "farka",
        "hist": "itihaas",
        "hide": "Chhupao",
        "undeleteviewlink": "dekho",
        "undeleteinvert": "Selection ke ulta karo",
        "undeletecomment": "Kaaran::",
-       "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": "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.",
        "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",
        "rightslogentry-temporary-group": "$1 (temporary, until $2)",
        "feedback-adding": "Panna me subject jorra jaawe hae...",
        "feedback-back": "Piichhe",
index 59ff3f2..8d1addf 100644 (file)
        "externaldberror": "Mahimo nga may ara sang sala sa pagpamatood sang database ukon wala ka sa lugar nga magbag-o sang imo pang-guha nga akawnt.",
        "login": "Mag sulod",
        "nav-login-createaccount": "Magsulod / maghimo account",
-       "userlogin": "Mag sulod / maghimo account",
-       "userloginnocreate": "Magsulod",
        "logout": "Mag guha",
        "userlogout": "Mag guha",
        "notloggedin": "Wala naka-sulod",
-       "nologin": "Wala ka sang imo akawnt? $1.",
-       "nologinlink": "Maghimo account",
        "createaccount": "Maghimo Account",
-       "gotaccount": "May yara ka na sang akawnt? $1.",
-       "gotaccountlink": "Mag sulod",
-       "userlogin-resetlink": "Nalipatan mo bala ang mga detalye sang imo pagsulod?",
        "userlogin-createanother": "Maghimo sing panibag-o nga account",
        "createaccountmail": "Paagi sa e-mail",
-       "createaccountreason": "Rason:",
        "createacct-submit": "Maghimo sing imo account",
        "createacct-another-submit": "Maghimo sing panibag-o nga account",
        "badretype": "Ang mga pasword nga imo gintum-ok wala naga-santo.",
        "passwordreset-disabled": "Ang mga pagliwat sang pasword gin-untat sa sini nga wiki.",
        "passwordreset-username": "Ngalan sang Manog-gamit\"",
        "passwordreset-domain": "Domeyn:",
-       "passwordreset-capture": "Lantawon ang nagresuta nga e-mail?",
-       "passwordreset-capture-help": "Kon butangan mo sang tsek ang ini nga kahon, ang e-mail (nga may temporaryo nga pasword) igapakita sa imo kag amo man ipadala sa manuggamit.",
        "passwordreset-email": "Adres sang e-mail:",
        "passwordreset-emailtitle": "Ang mga detalye sang akawnt sa {{SITENAME}}",
        "passwordreset-emailtext-ip": "May tawo nga (mahimo ikaw, halin sa IP adres nga $1) nagpangabay sang pahanumdom sang mga detalye\nsang imo akawnt para sa {{SITENAME}} ($4). Ang masunod nga {{PLURAL:$3|akawnt|mga akawnt}} sang manuggamit\nmay kabahin sa sini nga adres sang e-mail:\n\n$2\n\n{{PLURAL:$3|Ang ini nga temporaryo nga pasword|Ang mga ini nga temporaryo nga pasword}} indi na magamit sa {{PLURAL:$5|isa ka adlaw|$5 ka adlaw}}.\nKinahanglan mo nga magsulod kag magpili sang bag-o nga pasword subong. Kon lain nga tawo ang nagbuhat sini\nnga pagpangabay, ukon nadumduman mo na ang imo pasword, kag indi mo na kinahanglan nga ini\npaga-ilisan, mahimo mo nga pabay-an ang ini nga pahanumdom kag magpadayon sa paggamit sang imo daan nga pasword.",
        "preview": "Ipakita subong",
        "showpreview": "Ipakita nga daan",
        "showdiff": "Ipakita ang gin-ilisan",
-       "blankarticle": "<strong>Pahibalo:</strong> Ang panid nga imo ginahimo wala sing unod. Kon imo tum-ukon liwat ang \"{{int:savearticle}}\", ang panid pagahimuon nga wala sing unod.",
+       "blankarticle": "<strong>Pahibalo:</strong> Ang panid nga imo ginahimo wala sing unod. Kon imo tum-ukon liwat ang \"$1\", ang panid pagahimuon nga wala sing unod.",
        "anoneditwarning": "<strong>Pahibalo:</strong> Wala ka nakasulod. Kitaon sa publiko ang imo nga IP address kon ikaw maghimo sang pagbaylo. Kon ikaw <strong>[$ magsulod]</strong> ukon <strong>[$ maghimo sing account]</strong>, ang imo mga ginhimo nga pagbaylo ipahanungod sa imo nga username, kaupod sang iban pa nga kapuslanan.",
        "anonpreviewwarning": "''Wala ka pa nakasulod. Igasulat ang imo IP adres sa historya sini nga inislan na pahina.''",
-       "missingsummary": "'''Pahanumdom:''' Wala ka naghatag sang malip-ot nga pagsaysay sang imo gin-ilisan.\nKon tum-okon mo liwat ang \"{{int:savearticle}}\", ang imo gin-ilisan pagatiponon nga wala sini.",
+       "missingsummary": "'''Pahanumdom:''' Wala ka naghatag sang malip-ot nga pagsaysay sang imo gin-ilisan.\nKon tum-okon mo liwat ang \"$1\", ang imo gin-ilisan pagatiponon nga wala sini.",
        "missingcommenttext": "Palihog butangi sang komento sa idalom.",
-       "missingcommentheader": "'''Pahanumdom:''' Wala ka naghatag sang topiko/ulo sang topiko para sa sini nga komento.\nKon tum-okon mo liwat ang \"{{int:savearticle}}\", ang imo gin-ilisan pagatiponon nga wala sini.",
+       "missingcommentheader": "'''Pahanumdom:''' Wala ka naghatag sang topiko/ulo sang topiko para sa sini nga komento.\nKon tum-okon mo liwat ang \"$1\", ang imo gin-ilisan pagatiponon nga wala sini.",
        "summary-preview": "Kabilugan nga prebyu:",
        "subject-preview": "Prebyu sang topiko/ulo sang topiko:",
        "blockedtitle": "Ang manuggamit ginapunggan",
        "editingsection": "Ginaliwat ang $1 (bahin)",
        "editingcomment": "Gina-islan ang $1 (bag-o nga bahin)",
        "editconflict": "May pagpamatok sa pag-ilis: $1",
-       "explainconflict": "May yara sang iban nga nag-ilis sang sini nga panid umpisa nga imo ini gin-ilisan.\nAng lugar sang ibabaw nga teksto may yara sang teksto sang panid kon ano ini karon naga-eksister.\nAng imo mga pagbag-o ginapakita sa may lugar sang idalom nga teksto.\nMahimo nga kinahanglan mo pa nga tabidon ang imo mga pagbag-o sa mga naga-eksiter nga nga teksto.\nAng mga teksto '''lamang''' nga yara sa lugar sang ibabaw nga teksto ang matipon kon imo pagatum-ukon ang \"{{int:savearticle}}\".",
+       "explainconflict": "May yara sang iban nga nag-ilis sang sini nga panid umpisa nga imo ini gin-ilisan.\nAng lugar sang ibabaw nga teksto may yara sang teksto sang panid kon ano ini karon naga-eksister.\nAng imo mga pagbag-o ginapakita sa may lugar sang idalom nga teksto.\nMahimo nga kinahanglan mo pa nga tabidon ang imo mga pagbag-o sa mga naga-eksiter nga nga teksto.\nAng mga teksto '''lamang''' nga yara sa lugar sang ibabaw nga teksto ang matipon kon imo pagatum-ukon ang \"$1\".",
        "yourtext": "Imo teksto",
        "storedversion": "Gintago nga pagbag-o",
        "nonunicodebrowser": "'''Pahibalo: Ang imo brawser wala nagahando sa unicode.'''\nMay nagakatabo nga paghulag agod nga masugtan ka sang pa-ilis nga may paghalong: ang mga indi ASCII nga mga letra maga-paita sa kahon sang pag-ilis bilang kodigo nga heksadesimal.",
        "saveprefs": "Itipunon",
        "restoreprefs": "Ibalik ang tanan nga default settings",
        "prefs-editing": "Pag-ilis",
-       "rows": "Mga linya:",
-       "columns": "Mga kulumna:",
        "searchresultshead": "Pangita-a",
        "stub-threshold": "Suludlan sang <a href=\"#\" class=\"stub\">stub sang link</a> nga pagkay-o (bytes):",
        "stub-threshold-disabled": "Gin-untat",
        "userrights-reason": "Rason:",
        "userrights-no-interwiki": "Wala ka permiso nga lainon ang layi sang tiggamit sa iban nga mga wiki.",
        "userrights-nodatabase": "Wala nagagwa ang datos $1 ukon indi ini lokal.",
-       "userrights-nologin": "Kinahanglang [[Special:UserLogin|log in]] pinaagi sa isa account nga tagdumala para matagaan sang derecho sang tiggamit.",
-       "userrights-notallowed": "Ang imo nga account waay sing permiso para magdugang ukon magpanas sang kinamatarong sang mga naga-usar.",
        "userrights-changeable-col": "Mga grupo nga pwede mong baguhon.",
        "userrights-unchangeable-col": "Mga grupo nga indi mo pwede baguhon.",
        "group": "Grupo:",
        "right-protect": "Islan ang grado sang proteksyon kag baguhon ang mga ginprotektar nga mga panid",
        "right-editprotected": "Baguhon ang mga panid nga ginprotekta (waay sing proteksyon nga de-grado)",
        "right-editinterface": "Baguhon ang user interface.",
-       "right-editusercssjs": "Baguhon ang mga CSS kag Javascript nga files sang iban nga naga-usar.",
        "right-editusercss": "Baguhon ang mga CSS files sang iban nga naga-usar.",
        "right-edituserjs": "Baguhon ang mga Javascript files sang iban nga mga naga-usar.",
        "right-rollback": "Dasigay nga ibalik sa nahauna nga estado ang mga pagbag-o sang ulihi nga naga-usar nga nabag-o sa isa ka partikular nga panid.",
        "right-siteadmin": "Isira kag abrihan ang bulutangan sang mga impormasyon",
        "right-override-export-depth": "Ipagwa ang mga panid kaupod ang mga sugpon nga mga panid tubtub isa idalum nga 5.",
        "right-sendemail": "Magpadala sang email sa iban nga naga-usar",
-       "right-passwordreset": "Tan-awa ang mga email sang password reset",
        "right-managechangetags": "Maghimo kag magdula sing [[Special:Tags|mga tag]] halin sa database.",
        "newuserlogpage": "Pagkitan sang paghimo sang taggamit",
        "newuserlogpagetext": "Ini ang isa ka log sang mga ginhimo sang naga-usar",
        "rcshowhidepatr": "$1 ginabantyan nga pagbag-o",
        "rcshowhidemine": "$1 ang akon mga pagliwat",
        "rcshowhidemine-hide": "Itaguon",
-       "rclinks": "Ipakita ang ulihi nga $1 ka mga gin-ilisan sa sulod sang $2 ka adlaw<br />$3",
+       "rclinks": "Ipakita ang ulihi nga $1 ka mga gin-ilisan sa sulod sang $2 ka adlaw",
        "diff": "knln",
        "hist": "ngkltb",
        "hide": "Tago",
        "revdelete-restricted": "ginapatuman nga pagbawal sa mga administrador",
        "revdelete-unrestricted": "ginkakas nga pagbawal sa mga administrador",
        "rightsnone": "(wala)",
-       "revdelete-summary": "liwaton ang kabilogan",
        "searchsuggest-search": "Pangitaa",
        "expand_templates_preview": "Ipakita subong"
 }
index 462ab06..ef4a168 100644 (file)
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategorija|Kategorije|Kategorija}}",
-       "category_header": "Stranice 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.''",
+       "category-media-header": "Mediji u kategoriji »$1«",
+       "category-empty": "<em>U ovoj kategoriji trenutačno nema članaka ni medija.</em>",
        "hidden-categories": "{{PLURAL:$1|Skrivena kategorija|Skrivene kategorije|Skrivenih kategorija}}",
        "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 jednu stranicu.|{{PLURAL:$1|Prikazana je $1 stranica|Prikazane su $1 stranice|Prikazano je $1 stranica}} od njih $2 ukupno.}}",
+       "category-article-count": "{{PLURAL:$2|Ova kategorija sadrži samo sljedeću stranicu.|{{PLURAL:$1|Prikazana stranica jedina je|Prikazane su $1 stranice su|Prikazano je $1 stranica}} u ovoj kategoriji, od ukupno $2.}}",
        "category-article-count-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.",
        "talk": "Razgovor",
        "views": "Pogledi",
        "toolbox": "Pomagala",
-       "tool-link-userrights": "Promijeni {{GENDER:$1|suradnikove|suradničine}} grupe",
+       "tool-link-userrights": "Promijeni {{GENDER:$1|suradnikovu|suradničinu}} pripadnost skupinama",
        "tool-link-userrights-readonly": "Vidi {{GENDER:$1|suradnikovu|suradničinu|suradničku}} pripadnost skupinama",
        "tool-link-emailuser": "Pošalji {{GENDER:$1|suradniku|suradnici}} e-poruku",
        "userpage": "Vidi suradnikovu stranicu",
        "versionrequired": "Potrebna inačica $1 MediaWikija",
        "versionrequiredtext": "Za korištenje ove stranice potrebna je inačica $1 MediaWiki softvera. Pogledaj [[Special:Version|inačice]]",
        "ok": "U redu",
+       "pagetitle": "$1 – {{SITENAME}}",
        "retrievedfrom": "Dobavljeno iz \"$1\"",
        "youhavenewmessages": "Imate $1 ($2).",
        "youhavenewmessagesfromusers": "Imate $1 {{PLURAL:$3||od $3 suradnika|od $3 suradnika}} ($2).",
        "youhavenewmessagesmanyusers": "Imate $1 od više suradnika ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|$1 nove poruke|999=novih poruka}}",
+       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|999=nove poruke}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|posljednje uređivanje|posljednja $1 uređivanja|posljednjih $1 uređivanja}} na stranici za razgovor",
        "youhavenewmessagesmulti": "Imate nove poruke na $1",
        "editsection": "uredi",
        "toc": "Sadržaj",
        "showtoc": "prikaži",
        "hidetoc": "sakrij",
-       "collapsible-collapse": "sklopi stablo",
-       "collapsible-expand": "raširi stablo",
+       "collapsible-collapse": "sklopi",
+       "collapsible-expand": "raširi",
        "confirmable-confirm": "Jeste li sigurni?",
        "confirmable-yes": "Da",
        "confirmable-no": "Ne",
        "login": "Prijavi se",
        "login-security": "Potvrdite svoj identitet",
        "nav-login-createaccount": "Prijavi se",
-       "userlogin": "Prijavi se / stvori račun",
-       "userloginnocreate": "Prijavi se",
        "logout": "Odjavi se",
        "userlogout": "Odjavi se",
        "notloggedin": "Niste prijavljeni",
        "userlogin-noaccount": "Nemate suradnički račun?",
        "userlogin-joinproject": "Pridružite se {{SITENAME}}",
-       "nologin": "Nemate suradnički račun? $1.",
-       "nologinlink": "Otvorite račun",
        "createaccount": "Otvori novi suradnički račun",
-       "gotaccount": "Već imate suradnički račun? '''$1'''.",
-       "gotaccountlink": "Prijavite se",
-       "userlogin-resetlink": "Zaboravili ste detalje vaše prijave?",
        "userlogin-resetpassword-link": "Zaboravili ste zaporku?",
        "userlogin-helplink2": "Pomoć pri prijavi",
        "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nRabite donji obrazac da biste se prijavili kao drugi suradnik.",
        "createacct-another-email-ph": "Upišite adresu e-pošte",
        "createaccountmail": "Uporabite nasumice odabranu privremenu zaporku i pošaljite ju na navedenu adresu e-pošte",
        "createacct-realname": "Stvarno ime (neobvezatno)",
-       "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto stvarate drugi račun",
        "createacct-submit": "Stvorite svoj suradnički račun",
        "createacct-another-submit": "Otvori račun",
+       "createacct-continue-submit": "Pritisni za stvaranje računa",
+       "createacct-another-continue-submit": "Nastavi za stvaranje računa",
        "createacct-benefit-heading": "{{SITENAME}} su stvorili ljudi poput Vas.",
        "createacct-benefit-body1": "{{PLURAL:$1|uređivanje|uređivanja}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice|stranica}}",
        "botpasswords-insert-failed": "Nije moguće dodavanje imena bota \"$1\". Možda je već dodano?",
        "botpasswords-update-failed": "Nije moguće ažurirati bot s imenom \"$1\". Možda je izbrisan?",
        "botpasswords-created-title": "Stvorena bot zaporka",
+       "botpasswords-updated-title": "Zaporka za Vašeg bota obnovljena je",
+       "botpasswords-updated-body": "Zaporka za bota imena »$1« suradnika »$2« obnovljena je.",
+       "botpasswords-deleted-title": "Zaporka je za Vašeg bota uklonjena",
        "resetpass_forbidden": "Zaporka ne može biti promijenjena",
+       "resetpass_forbidden-reason": "Zaporka ne može biti promijenjena: $1",
        "resetpass-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
        "resetpass-submit-loggedin": "Promijeni zaporku",
        "resetpass-submit-cancel": "Odustani",
        "passwordreset-emailtext-user": "Suradnik $1 na {{SITENAME}} zatražio je podsjetnik o pojedinostima vašeg računa za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena zaporka|Ove privremene zaporke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu zaporku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše izvorne zaporke, a više je ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru zaporku.",
        "passwordreset-emailelement": "Suradničko ime: \n$1\n\nPrivremena zaporka: \n$2",
        "passwordreset-emailsentemail": "Ako je ova adresa povezana s Vašim suradničkim računom, na nju će biti poslan podsjetnik na zaporku.",
+       "passwordreset-emailsentusername": "Ukoliko je ova adresa povezana s Vašim suradničkim računom, na istu će biti poslan podsjetnik sa zaporkom.",
        "passwordreset-invalidemail": "Nevaljala adresa e-pošte",
        "changeemail": "Promijeni ili izbriši e-mail adresu",
        "changeemail-header": "Ispunite ovaj obrazac da biste promijenili svoju adresu e-pošte. Ukoliko želite ukloniti povezanost svoje adrese e-pošte i suradničkoga računa, prilikom popunjavanja obrasca ostavite prazno polje umjesto upisivanja nove adrese e-pošte.",
        "changeemail-submit": "Promijeni e-mail",
        "changeemail-throttled": "Nedavno ste se previše puta pokušali prijaviti.\nMolimo Vas pričekajte $1 prije nego što pokušate ponovno.",
        "changeemail-nochange": "Molimo vas, upišite neku novu adresu e-pošte.",
+       "resettokens": "Ponovo postavljanje tajnoga ključa",
+       "resettokens-text": "Možete ponovo postaviti tajni ključ koji Vam dopušta pristupanje određenim osobnim podatcima povezanim s Vašim ovdje navedenim suradničkim računom.\n\nTrebali bi to načiniti ukoliko ga kojim slučajem priopćite nekome ili ukoliko je Vaš suradnički račun ugrožen.",
+       "resettokens-tokens": "Tajni ključevi:",
+       "resettokens-token-label": "$1 (trenutačna postavka: $2)",
+       "resettokens-watchlist-token": "Tajni ključ za uvoženje u mrežno sjedište (Atom/RSS) [[Special:Watchlist|promjena na stranicama s Vašega popisa praćenih stranica]]",
+       "resettokens-resetbutton": "Ponovo postavi odabrane tajne ključeve",
        "bold_sample": "Podebljani tekst",
        "bold_tip": "Podebljani tekst",
        "italic_sample": "Kurzivni tekst",
        "minoredit": "Ovo je manja promjena",
        "watchthis": "Prati ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
-       "savechanges": "Spremi promjene",
+       "savechanges": "Sačuvaj stranicu",
        "publishpage": "Objavi stranicu",
-       "publishchanges": "Objavi izmjene",
+       "publishchanges": "Sačuvaj uređivanje",
        "preview": "Pregled kako će stranica izgledati",
        "showpreview": "Prikaži kako će izgledati",
        "showdiff": "Prikaži promjene",
-       "blankarticle": "<strong>Upozorenje:</strong> Stvorili ste stranicu koja je prazna.\nAko iznova pritisnete na \"{{int:savearticle}}\", stranica će biti stvorena bez ikakvog sadržaja.",
+       "blankarticle": "<strong>Upozorenje:</strong> Stvorili ste stranicu koja je prazna.\nAko iznova pritisnete na \"$1\", stranica će biti stvorena bez ikakvog sadržaja.",
        "anoneditwarning": "<strong>Upozorenje:</strong> niste prijavljeni. Ako napravite uređivanje, Vaša IP adresa će biti javno vidljiva. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 stvorite račun]</strong>, Vaša uređivanja će biti pridružena suradničkom imenu, zajedno s ostalim pogodnostima.",
        "anonpreviewwarning": "<em>Niste prijavljeni. Spremanjem izmjena Vaša će IP adresa ostati zabilježena u povijesti uređivanja ove stranice.</em>",
        "missingsummary": "'''Podsjetnik:''' Niste unijeli sažetak promjena. Ako ponovno kliknete na \"Sačuvaj stranicu\", Vaše će promjene biti snimljene bez sažetka.",
-       "selfredirect": "<strong>Upozorenje:</strong> Stvarate preusmjeravanje na isti članak.\nMožda ste izabrali pogrješnu odredišnu stranicu za preusmjeravanje ili uređujete pogrješnu stranicu.\nAko pritisnete na \"{{int:savearticle}}\" još jednom, preusmjeravanje će svejedno biti stvoreno.",
+       "selfredirect": "<strong>Upozorenje:</strong> Stvarate preusmjeravanje na isti članak.\nMožda ste izabrali pogrješnu odredišnu stranicu za preusmjeravanje ili uređujete pogrješnu stranicu.\nAko pritisnete na \"$1\" još jednom, preusmjeravanje će svejedno biti stvoreno.",
        "missingcommenttext": "Molim unesite sažetak.",
-       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali sažetak ovoga komentara. Ukoliko ponovo kliknete \"{{int:savearticle}}\", Vaš će komentar biti snimljen bez sažetka.",
+       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali sažetak ovoga komentara. Ukoliko ponovo kliknete \"$1\", Vaš će komentar biti snimljen bez sažetka.",
        "summary-preview": "Pregled polja Sažetak:",
        "subject-preview": "Pregled teme:",
        "previewerrortext": "Pri pokušaju prikazivanja pretpregleda vaših promjena došlo je do pogrješke.",
        "userinvalidcssjstitle": "'''Upozorenje:''' Nema sučelja pod imenom \"$1\". Ne zaboravite da imena stranica s .css and .js kodom počinju malim slovom, npr. {{ns:user}}:Mate/vector.css, a ne {{ns:user}}:Mate/Vector.css.",
        "updated": "(Ažurirano)",
        "note": "'''Napomena:'''",
-       "previewnote": "'''Ne zaboravite da je ovo samo pregled kako će stranica izgledati. Vaše uređivanje još nije snimljeno!'''",
+       "previewnote": "<strong>Ne zaboravite da je ovo samo pregled kako će stranica izgledati.</strong>\nVaše uređivanje još nije snimljeno!",
        "continue-editing": "Nastavi uređivati",
        "previewconflict": "Ovaj pregled odražava stanje u gornjem polju za unos koje će biti sačuvano\nako pritisnete \"Sačuvaj stranicu\".",
        "session_fail_preview": "'''Ispričavamo se! Nismo mogli obraditi Vašu izmjenu zbog gubitka podataka o prijavi.\nMolimo pokušajte ponovno. Ako i dalje ne bude uspijevalo, pokušajte se [[Special:UserLogout|odjaviti]] i ponovno prijaviti.'''",
        "editingsection": "Uređujete $1 (odlomak)",
        "editingcomment": "Uređujete $1 (novi odlomak)",
        "editconflict": "Istovremeno uređivanje: $1",
-       "explainconflict": "Netko je u međuvremenu promijenio stranicu.\nGornje polje sadrži sadašnji tekst stranice.\nU donjem polju prikazane su Vaše promjene.\nMorat ćete unijeti Vaše promjene u sadašnji tekst.\n'''Samo''' će tekst u gornjem polju biti sačuvan kad pritisnete \"{{int:savearticle}}\".",
+       "explainconflict": "Netko je u međuvremenu promijenio stranicu.\nGornje polje sadrži sadašnji tekst stranice.\nU donjem polju prikazane su Vaše promjene.\nMorat ćete unijeti Vaše promjene u sadašnji tekst.\n'''Samo''' će tekst u gornjem polju biti sačuvan kad pritisnete \"$1\".",
        "yourtext": "Vaš tekst",
        "storedversion": "Pohranjena inačica",
        "nonunicodebrowser": "'''UPOZORENJE: Vaš preglednik ne podržava Unicode zapis znakova, molimo promijenite ga prije sljedećeg uređivanja članaka.'''",
        "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. -->",
+       "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; #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>",
        "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",
        "sectioneditnotsupported-text": "Uređivanje odjeljka nije podržano na ovoj stranici",
        "permissionserrors": "Pogrješka u pravima",
        "permissionserrorstext": "Nemate ovlasti za tu radnju iz sljedećih {{PLURAL:$1|razlog|razloga}}:",
-       "permissionserrorstext-withaction": "Nemate dopuštenje za $2, iz {{PLURAL:$1|razloga|razloga}}:",
+       "permissionserrorstext-withaction": "Nemate dopuštenje za $2, iz {{PLURAL:$1|navedenog|navedenih}} razloga:",
        "recreate-moveddeleted-warn": "'''Upozorenje: Ponovno stvarate stranicu koja je prethodno bila izbrisana.'''\n\nRazmotrite je li prikladno nastaviti s uređivanje ove stranice.\nZa Vašu informaciju slijedi evidencija brisanja i premještanja ove stranice:",
        "moveddeleted-notice": "Ova stranica je bila izbrisana.\nEvidencija brisanja i evidencija premještanja za ovu stranicu je prikazana niže.",
        "moveddeleted-notice-recent": "Žao nam je, ova stranica je izbrisana u prošla 24 sata. \nNiže je navedena evidencija brisanja i premještanja.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Prazan objekt",
        "content-json-empty-array": "Prazno polje",
+       "deprecated-self-close-category": "Stranice s krivo zatvorenim HTML oznakama‎",
        "duplicate-args-warning": "<strong>Upozorenje:</strong> [[:$1]] poziva na [[:$2]] s više od jedne vrijednosti za parametar \"$3\". Rabit će se samo posljednja navedena vrijednost.",
        "duplicate-args-category": "Stranice u kojima se ponavljaju argumenti u predlošcima",
        "expensive-parserfunction-warning": "Upozorenje: Ova stranica sadrži previše opterećujućih poziva parserskih funkcija\n\nTrebala bi imati manje od $2 {{PLURAL:$2|poziva|poziva}}, sada ima {{PLURAL:$1|$1 poziv|$1 poziva}}.",
        "post-expand-template-argument-warning": "Upozorenje: Ova stranica sadrži najmanje jedan argument predložaka koji ima preveliko proširenje. Ovi su argumenti izostavljeni.",
        "post-expand-template-argument-category": "Stranice koje sadrže izostavljene argumente za predloške",
        "parser-template-loop-warning": "Otkrivena petlja predloška: [[$1]]",
+       "template-loop-category": "Stranice s petljama u predlošcima",
        "parser-template-recursion-depth-warning": "Dubina rekurzije predloška je izvan granice ($1)",
        "language-converter-depth-warning": "Prekoračena granica dubine jezičnog pretvarača ($1)",
        "node-count-exceeded-category": "Stranice s previše čvorova",
        "currentrev": "Trenutačna inačica",
        "currentrev-asof": "Trenutačna izmjena od $1",
        "revisionasof": "Inačica od $1",
-       "revision-info": "Inačica od $1 koju je unio/unijela $2",
+       "revision-info": "Inačica $3 od $4 u $5 koju je {{GENDER:$6|unio|unijela}} {{GENDER:$6|$2}}$7",
        "previousrevision": "←Starija inačica",
        "nextrevision": "Novija inačica→",
        "currentrevisionlink": "vidi trenutačnu inačicu",
        "revertmerge": "Razdvoji",
        "mergelogpagetext": "Slijedi popis posljednjih spajanja povijesti stranica.",
        "history-title": "Povijest izmjena stranice »$1«",
-       "difference-title": "Razlika između inačica stranice $1",
+       "difference-title": "Razlika između inačica stranice »$1«",
        "difference-title-multipage": "Razlika između stranica \"$1\" i \"$2\"",
        "difference-multipage": "(Razlika između stranica)",
        "lineno": "Redak $1:",
        "datedefault": "Nemoj postaviti",
        "prefs-labs": "Labs mogućnosti",
        "prefs-user-pages": "Suradničke stranice",
-       "prefs-personal": "Podaci o suradniku",
+       "prefs-personal": "Podatci o suradniku",
        "prefs-rc": "Nedavne promjene",
        "prefs-watchlist": "Praćene stranice",
        "prefs-editwatchlist": "Uredi popis praćenja",
        "prefs-watchlist-days-max": "Najviše $1 {{PLURAL:$1|dan|dana}}",
        "prefs-watchlist-edits": "Broj uređivanja koji će se prikazati na proširenom popisu praćenja:",
        "prefs-watchlist-edits-max": "Maksimalni broj: 1000",
-       "prefs-watchlist-token": "Token popisa praćenja:",
+       "prefs-watchlist-token": "Tajni ključ popisa praćenja:",
        "prefs-misc": "Razno",
        "prefs-resetpass": "promijeni zaporku",
        "prefs-changeemail": "promijeni ili ukloni adresu e-pošte",
        "prefs-help-recentchangescount": "Ovo uključuje nedavne promjene, stare izmjene, i evidencije.",
        "prefs-help-watchlist-token2": "Ovo je tajni ključ prema sažetku Vašeg popisa praćenja. Svaki suradnik kojem je poznat, moći će čitati Vaš popis praćenih stranica. Ne dijelite ga ni s kim. [[Special:ResetTokens|Kliknite ovdje ako ga želite ponovo postaviti]].",
        "savedprefs": "Vaše postavke su sačuvane.",
-       "savedrights": "Suradnička prava {{GENDER:suradnika $1|suradnice $1}} su spremljena.",
+       "savedrights": "Suradnička su prava {{GENDER:$1|suradnika $1|suradnice $1}} spremljena.",
        "timezonelegend": "Vremenska zona:",
        "localtime": "Lokalno vrijeme:",
        "timezoneuseserverdefault": "Koristi postavke wikija ($1)",
        "prefs-common-css-js": "Dijeljeni CSS/JS za sve izglede:",
        "prefs-reset-intro": "Možete koristiti ovu stranicu za povrat Vaših postavki na prvotne postavke. Ovo se ne može poništiti.",
        "prefs-emailconfirm-label": "Potvrda e-mail adrese:",
-       "youremail": "Vaša elektronska pošta *",
+       "youremail": "Vaša adresa e-pošte:",
        "username": "Ime {{GENDER:$1|suradnika|suradnice}}:",
-       "prefs-memberingroups": "{{GENDER:$2|Suradnik|Suradnica}} je član {{PLURAL:$1|sljedeće skupine|sljedećih skupina}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Suradnik je član|Suradnica je članica}} {{PLURAL:$1|sljedeće skupine|sljedećih skupina}}:",
+       "group-membership-link-with-expiry": "$1 (do $2)",
        "prefs-registration": "Vrijeme prijave:",
        "yourrealname": "Pravo ime (nije obvezno)*",
        "yourlanguage": "Jezik:",
        "yournick": "Vaš nadimak (za potpisivanje)",
        "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}}.",
+       "badsiglength": "Vaš je potpis predugačak.\nNe smije biti duži od $1 {{PLURAL:$1|znaka|znakova}}.",
        "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.",
        "prefs-advancedwatchlist": "Napredne mogućnosti",
        "prefs-displayrc": "Mogućnosti prikaza",
        "prefs-displaywatchlist": "Mogućnosti prikaza",
+       "prefs-tokenwatchlist": "Tajni ključ",
        "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": "Upravljanje pravima",
        "userrights-lookup-user": "Izaberi suradnika",
        "userrights-user-editname": "Unesite suradničko ime:",
        "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 {{GENDER:$1|suradničke}} skupine",
+       "userrights-editusergroup": "Uređivanje {{GENDER:$1|suradnikove|suradničine}} pripadnosti skupinama",
        "userrights-viewusergroup": "Vidi {{GENDER:$1|suradničke}} skupine",
        "saveusergroups": "Spremi {{GENDER:$1|suradničke}} grupe",
-       "userrights-groupsmember": "{{GENDER:$2|Pripadnik|Pripadnica}} skupina:",
-       "userrights-groupsmember-auto": "{{GENDER:$2|Pripadnik|Pripadnica}} obuhvaćenih skupina:",
-       "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.\n* povisilica (#) označava da rok valjanosti pripadanja skupini možete samo skratiti, a ne i produljiti",
+       "userrights-groupsmember": "{{GENDER:$2|Pripadnik|Pripadnica}} {{PLURAL:$1|skupine|skupinama|skupina}}:",
+       "userrights-groupsmember-auto": "{{GENDER:$2|Pripadnik|Pripadnica}} {{PLURAL:$1|obuhvaćene skupine|obuhvaćenih skupina}}:",
+       "userrights-groups-help": "Možete promijeniti skupine za {{GENDER:$1|ovoga suradnika|ovu suradnicu}}:\n* označena kućica pokazuje skupinu kojoj {{GENDER:$1|suradnik|suradnica}} pripada;\n* neoznačena kućica pokazuje skupinu kojoj {{GENDER:$1|suradnik|suradnica}} ne pripada;\n* zvjezdica (*) označava skupinu koju ne možete ukloniti kad ju jednom dodate, ili obratno.\n* povisilica (#) označava da rok valjanosti pripadanja skupini možete samo skratiti, a ne i produljiti",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate dopuštenje za uređivanje suradničkih prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalno dostupna.",
        "userrights-changeable-col": "Skupine koje možete promijeniti",
        "userrights-unchangeable-col": "Skupine koje ne možete promijeniti",
+       "userrights-expiry-current": "Ističe $1",
        "userrights-expiry-none": "Neograničeno trajanje statusa",
+       "userrights-expiry": "Istječe:",
+       "userrights-expiry-existing": "Postojeće vrijeme isteka: $3, $2",
+       "userrights-expiry-othertime": "Drugo vrijeme:",
+       "userrights-expiry-options": "1 dan:1 day,1 tjedan:1 week,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godina:1 year",
        "userrights-conflict": "Sukob promjene suradničkih prava! Molimo provjerite i potvrdite svoje promjene.",
        "group": "Skupina:",
        "group-user": "Suradnici",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
-       "group-suppress": "Nadzornici",
+       "group-suppress": "Otajnici",
        "group-all": "(svi)",
        "group-user-member": "{{GENDER:$1|suradnik|suradnica}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđen suradnik|automatski potvrđena suradnica}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorica}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica}}",
-       "group-suppress-member": "{{GENDER:$1|nadzornik|nadzornica}}",
+       "group-suppress-member": "{{GENDER:$1|otajnik|otajnica}}",
        "grouppage-user": "{{ns:project}}:Suradnici",
        "grouppage-autoconfirmed": "{{ns:project}}:automatski potvrđeni suradnici",
        "grouppage-bot": "{{ns:project}}:Botovi",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
-       "grouppage-suppress": "{{ns:project}}:Nadzor",
+       "grouppage-suppress": "{{ns:project}}:Otajnost",
        "right-read": "Čitanje stranica",
        "right-edit": "Uređivanje stranica",
        "right-createpage": "Stvaranje stranica (stranica koje nisu razgovor)",
        "right-deletedtext": "Pregled izbrisanog teksta i izmjena između izbrisanih izmjena",
        "right-browsearchive": "Traženje obrisanih stranica",
        "right-undelete": "Vraćanje stranica",
-       "right-suppressrevision": "Pregledavanje i vraćanje izmjena skrivenih od administratora",
+       "right-suppressrevision": "Pregledavanje, skrivanje i vraćanje izmjena na suradničkim stranicama bilo kojega suradnika",
+       "right-viewsuppressed": "Prikaži izmjene skrivene od svih suradnika",
        "right-suppressionlog": "Gledanje privatnih evidencija",
        "right-block": "Blokiranje suradnika u uređivanju",
        "right-blockemail": "Blokiranje suradnika u slanju elektroničke pošte",
        "right-protect": "Mijenjanje razina zaštićivanja i uređivanje zaštićenih stranica",
        "right-editprotected": "Uređivanje stranica zaštićenih kao \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Uređivanje stranica zaštićenih kao \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Odredi modela sadržaja stranice",
        "right-editinterface": "Uređivanje suradničkog sučelja",
-       "right-editusercssjs": "Uređivanje CSS i JS stranica drugih suradnika",
        "right-editusercss": "Uređivanje CSS stranica drugih suradnika",
        "right-edituserjs": "Uređivanje JS stranica drugih suradnika",
        "right-editmyusercss": "Uređivanje vlastitih CSS stranica",
        "grant-group-email": "Pošalji e-mail",
        "grant-blockusers": "Blokiraj i odblokiraj korisnike",
        "grant-createaccount": "Otvori račune",
-       "grant-createeditmovepage": "Stvori, uredi i premjesti stranice",
+       "grant-createeditmovepage": "Stvaranje, uređivanje i premještanje stranica",
        "grant-editmyoptions": "Uređivanje vlastitih suradničkih postavki",
        "grant-editpage": "Uređivanje postojećih stranica",
        "grant-editprotected": "Uređivanje zaštićenih stranica",
        "grant-highvolume": "Uređivanja velikog opsega",
+       "grant-uploadeditmovefile": "Postavljanje, zamjena i premještanje datoteka",
+       "grant-uploadfile": "Postavljanje novih datoteka",
        "grant-basic": "Osnovna prava",
        "grant-viewdeleted": "Prikaz izbrisanih datoteka i stranica",
        "grant-viewmywatchlist": "Pregled popisa praćenih stranica",
        "action-viewmyprivateinfo": "pregled Vaših privatnih podataka",
        "action-editmyprivateinfo": "uredite svoje privatne podatke",
        "nchanges": "{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|uređivanje od Vašeg posljednjeg posjeta|uređivanja od Vašeg posljednjeg posjeta}}",
        "enhancedrc-history": "povijest",
        "recentchanges": "Nedavne promjene",
        "recentchanges-legend": "Izbornik nedavnih promjena",
        "recentchanges-label-minor": "Manja izmjena",
        "recentchanges-label-bot": "Izmjenu napravio bot",
        "recentchanges-label-unpatrolled": "Nepregledana izmjena",
-       "recentchanges-label-plusminus": "Promjena veličine stranice (u bajtovima)",
+       "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",
+       "rcfilters-activefilters": "Aktivni filtri",
+       "rcfilters-restore-default-filters": "Vrati zadane filtre",
+       "rcfilters-clear-all-filters": "Očisti sve filtre",
+       "rcfilters-search-placeholder": "Posljednje izmjene filtera (pogledajte ili počnite unositi)",
+       "rcfilters-invalid-filter": "Filter nije valjan",
+       "rcfilters-empty-filter": "Nema aktivnih filtera. Prikazani su svi doprinosi.",
+       "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-whatsthis": "Što je ovo?",
+       "rcfilters-filterlist-feedbacklink": "Napišite povratne informacije vezane za nove (beta) filtere",
+       "rcfilters-highlightbutton-title": "Označi rezultate",
+       "rcfilters-highlightmenu-title": "Odaberite boju",
+       "rcfilters-highlightmenu-help": "Odaberite boju za označavanje ovog svojstva",
+       "rcfilters-filterlist-noresults": "Nema filtera",
+       "rcfilters-filtergroup-registration": "Registracija suradnika",
+       "rcfilters-filter-registered-label": "Prijavljeni",
+       "rcfilters-filter-registered-description": "Prijavljeni suradnici.",
+       "rcfilters-filter-unregistered-label": "Neprijavljeni",
+       "rcfilters-filter-unregistered-description": "Suradnici koji nisu prijavljeni.",
+       "rcfilters-filtergroup-authorship": "Doprinosi prema autorima",
+       "rcfilters-filter-editsbyself-label": "Uređivanja koja ste Vi napravili",
+       "rcfilters-filter-editsbyself-description": "Vaša uređivanja.",
+       "rcfilters-filter-editsbyother-label": "Promjene drugih suradnika",
+       "rcfilters-filter-editsbyother-description": "Sve promjene osim Vaših.",
+       "rcfilters-filtergroup-userExpLevel": "Napredna razina (samo za registrirane suradnike)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novopridošli",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Manje od 10 uređivanja i 4 dana aktivnosti.",
+       "rcfilters-filter-user-experience-level-learner-label": "Početnici",
+       "rcfilters-filter-user-experience-level-learner-description": "Više dana aktivnosti i uređivanja od novih ali manje od iskusnih suradnika.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Iskusni suradnici",
+       "rcfilters-filter-user-experience-level-experienced-description": "Aktivnost više od 30 dana i 500 uređivanja.",
+       "rcfilters-filtergroup-automated": "Automatizirani doprinosi",
+       "rcfilters-filter-bots-description": "Uređivanja učinjena automatiziranim alatima.",
+       "rcfilters-filter-humans-label": "Osoba (ne bot)",
+       "rcfilters-filter-humans-description": "Uređivanja koja su napravili suradnici.",
+       "rcfilters-filtergroup-reviewstatus": "Stanje pregledanja",
+       "rcfilters-filter-patrolled-label": "Ophođeno",
+       "rcfilters-filter-patrolled-description": "Uređivanja označena ophođenima.",
+       "rcfilters-filter-unpatrolled-label": "Neophođeno",
+       "rcfilters-filter-unpatrolled-description": "Uređivanja koja nisu označena ophođenima.",
+       "rcfilters-filtergroup-significance": "Važnost",
+       "rcfilters-filter-minor-label": "Manja uređivanja",
+       "rcfilters-filter-minor-description": "Uređivanja koja je suradnik označio manjim.",
+       "rcfilters-filter-major-label": "Obična uređivanja",
+       "rcfilters-filter-major-description": "Uređivanja koja nisu označena manjim.",
+       "rcfilters-filtergroup-changetype": "Vrste promjena",
+       "rcfilters-filter-pageedits-label": "Uređivanja stranice",
+       "rcfilters-filter-pageedits-description": "Uređivanja wikisadržaja, rasprave, opisi kategorija...",
+       "rcfilters-filter-newpages-label": "Stvaranje stranica",
+       "rcfilters-filter-newpages-description": "Uređivanja kojima su stvorene nove stranice.",
+       "rcfilters-filter-categorization-label": "Promjene kategorija",
+       "rcfilters-filter-categorization-description": "Uređivanja kojima se dodaju ili uklanjanju stranice iz kategorija.",
+       "rcfilters-filter-logactions-label": "Radnje zabilježene u evidencijama",
+       "rcfilters-filter-logactions-description": "Administrativne radnje, stvaranja računa, brisanje stranica, postavljanja datoteka...",
        "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",
        "rcshowhideminor": "$1 manje promjene",
        "rcshowhidecategorization": "$1 kategorizaciju stranica",
        "rcshowhidecategorization-show": "prikaži",
        "rcshowhidecategorization-hide": "Sakrij",
-       "rclinks": "Prikaži posljednjih $1 promjena {{PLURAL:$2|prethodni dan|u posljednja $2 dana|u posljednjih $2 dana}}<br />$3",
+       "rclinks": "Prikaži posljednjih $1 promjena {{PLURAL:$2|prethodni dan|u posljednja $2 dana|u posljednjih $2 dana}}",
        "diff": "razl",
        "hist": "pov",
        "hide": "sakrij",
        "brokenredirectstext": "Sljedeća preusmjeravanja povezuju na nepostojeće stranice:",
        "brokenredirects-edit": "uredi",
        "brokenredirects-delete": "izbriši",
-       "withoutinterwiki": "Stranice bez međuwiki poveznica",
+       "withoutinterwiki": "Stranice bez međuwikipoveznica",
        "withoutinterwiki-summary": "Sljedeće stranice nemaju poveznice na projekte na drugim jezicima:",
        "withoutinterwiki-legend": "Prefiks",
        "withoutinterwiki-submit": "Prikaži",
-       "fewestrevisions": "Članci s najmanje izmjena",
+       "fewestrevisions": "Stranice s najmanje izmjena",
        "nbytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
        "ncategories": "$1 {{PLURAL:$1|kategorija|kategorije|kategorija}}",
        "ninterwikis": "$1 međuwiki {{PLURAL:$1|poveznica|poveznice|poveznica}}",
        "wantedpages-badtitle": "Nevaljani naslov kao rezultat: $1",
        "wantedfiles": "Tražene datoteke",
        "wantedfiletext-cat": "Sljedeće datoteke se rabe ali ne postoje. Datoteke iz drugih izvora mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> s popisa. Osim toga, stranice koje sadrže nepostojeće datoteke popisane su [[:$1|ovdje]].",
+       "wantedfiletext-cat-noforeign": "Sljedeće datoteke se rabe ali ne postoje. Osim toga, na popisu su prikazane stranice s umetnutnim datotekama koje ne postoje: [[:$1]].",
        "wantedfiletext-nocat": "Sljedeće datoteke se rabe ali ne postoje. Datoteke iz drugih izvora mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbrisane</del> s popisa.",
+       "wantedfiletext-nocat-noforeign": "Sljedeće datoteke se rabe ali ne postoje.",
        "wantedtemplates": "Traženi predlošci",
        "mostlinked": "Stranice na koje vodi najviše poveznica",
        "mostlinkedcategories": "Kategorije na koje vodi najviše poveznica",
        "mostlinkedtemplates": "Predlošci na koje vodi najviše poveznica",
-       "mostcategories": "Popis članaka po broju kategorija",
+       "mostcategories": "Popis stranica po broju kategorija",
        "mostimages": "Slike na koje vodi najviše poveznica",
        "mostinterwikis": "Stranice s najviše međuwiki poveznica",
-       "mostrevisions": "Popis članaka po broju uređivanja",
+       "mostrevisions": "Popis stranica po broju uređivanja",
        "prefixindex": "Sve stranice prema početku naslova",
        "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
        "prefixindex-submit": "Prikaži",
        "prefixindex-strip": "Ne prikazuj predmetak u popisu",
        "shortpages": "Kratke stranice",
        "longpages": "Duge stranice",
-       "deadendpages": "Slijepe ulice",
+       "deadendpages": "Stranice na koje ne vodi ijedna druga stranica",
        "deadendpagestext": "Sljedeće stranice nemaju poveznice na druge stranice na ovom wikiju ({{SITENAME}}).",
        "protectedpages": "Zaštićene stranice",
        "protectedpages-indef": "Samo neograničene zaštite",
        "suppress": "Nadzor",
        "querypage-disabled": "Ova posebna stranica onemogućena je jer bi usporila funkcioniranje projekta.",
        "apihelp": "Pomoć za API",
+       "apisandbox": "Stranica za vježbanje API-ja",
        "apisandbox-submit": "Napraviti zahtjev",
        "apisandbox-reset": "Očisti",
        "apisandbox-examples": "Primjer",
        "showhideselectedlogentries": "Otkrij/sakrij odabrane evidencije",
        "checkbox-select": "Odaberite: $1",
        "checkbox-all": "Sve",
-       "checkbox-none": "Nijedan",
+       "checkbox-none": "Ništa",
        "checkbox-invert": "Obrnuto",
        "allpages": "Sve stranice",
        "nextpage": "Sljedeća stranica ($1)",
        "listgrouprights-removegroup-self": "Ukloni {{PLURAL:$2|skupinu|skupine}} iz vlastitog računa: $1",
        "listgrouprights-addgroup-self-all": "Dodaj sve skupine vlastitom računu",
        "listgrouprights-removegroup-self-all": "Uklonite sve skupine iz vlastitog računa",
-       "listgrouprights-namespaceprotection-header": "Ograničenja prostora imena",
+       "listgrouprights-namespaceprotection-header": "Ograničenja imenskoga prostora",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
        "listgrants": "Dozvole",
        "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-summary": "Ova je posebna stranica koja prikazuje prateće kategorije koje programska podrška MediaWiki automatski popunjava. Njihovi se nazivi mogu promijeniti izmjenom odgovarajućih sustavskih poruka u imenskom prostoru {{ns:8}}.",
        "trackingcategories-msg": "Praćene kategorije",
        "trackingcategories-name": "Naziv poruke",
        "trackingcategories-desc": "Kriteriji za uključenje u kategoriju",
        "excontent": "sadržaj je bio: '$1'",
        "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-confirm": "Pobriši »$1«",
        "delete-legend": "Izbriši",
        "historywarning": "<strong>Upozorenje:</strong> stranica koju želite izbrisati ima starije izmjene s $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
        "historyaction-submit": "Prikaži",
        "undeleteviewlink": "pregled",
        "undeleteinvert": "Obrni odabir",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|$1 inačica vraćena|$1 inačice vraćene|$1 inačica vraćeno}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}} i {{PLURAL:$2|$2 datoteka vraćena|$2 datototeke vraćene|$2 datoteka vraćeno}}",
-       "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
        "cannotundelete": "Vraćanje obrisane inačice nije uspjelo:\n$1",
        "undeletedpage": "'''$1 je vraćena'''\n\nPogledajte [[Special:Log/delete|evidenciju brisanja]] za zapise nedavnih brisanja i vraćanja.",
        "undelete-header": "Pogledaj [[Special:Log/delete|evidenciju brisanja]] za nedavno obrisane stranice.",
        "sp-contributions-hideminor": "Sakrij manje izmjene",
        "sp-contributions-submit": "Traži",
        "whatlinkshere": "Što vodi ovamo",
-       "whatlinkshere-title": "Stranice koje vode na \"$1\"",
+       "whatlinkshere-title": "Stranice koje vode na »$1«",
        "whatlinkshere-page": "Stranica:",
        "linkshere": "Sljedeće stranice povezuju ovamo ([[:$1]]):",
        "nolinkshere": "Nijedna stranica ne vodi ovamo (tj. nema poveznica na stranicu [[:$1]]).",
        "unblocked-range": "$1 je deblokiran",
        "unblocked-id": "Blok $1 je uklonjen",
        "blocklist": "Blokirani suradnici",
+       "autoblocklist": "Automatska blokiranja",
        "ipblocklist": "Blokirani suradnici",
        "ipblocklist-legend": "Pronađi blokiranog suradnika",
        "blocklist-userblocks": "Sakrij blokiranja računa",
        "change-blocklink": "promijeni blokiranje",
        "contribslink": "doprinosi",
        "emaillink": "pošalji e-poruku",
-       "autoblocker": "Automatski ste blokirani jer je Vašu IP adresu nedavno koristio \"[[User:$1|$1]]\" koji je blokiran zbog: \"$2\".",
+       "autoblocker": "Automatski ste blokirani jer je Vašu IP adresu nedavno koristio \"[[User:$1|$1]]\".\nRazlog koji je dan za blokiranje $1 bio je \"$2\".",
        "blocklogpage": "Evidencija blokiranja",
        "blocklog-showlog": "Ovaj suradnik je ranije blokiran.\nEvidencija blokiranja je prikazan ispod kao napomena:",
        "blocklog-showsuppresslog": "Ovaj suradnik je ranije blokiran i skriven.\nEvidencija skrivanja je prikazana ispod kao napomena:",
        "tooltip-ca-nstab-category": "Pogledaj stranicu kategorije",
        "tooltip-minoredit": "Označi kao manju promjenu",
        "tooltip-save": "Sačuvaj promjene",
+       "tooltip-publish": "Sačuvaj svoje uređivanje",
        "tooltip-preview": "Prikaži kako će izgledati, molimo koristite prije snimanja!",
        "tooltip-diff": "Prikaži promjene učinjene u tekstu.",
        "tooltip-compareselectedversions": "Prikaži usporedbu izabranih inačica ove stranice.",
        "lastmodifiedatby": "Ovu je stranicu posljednji put {{GENDER:$4|mijenjao suradnik|mijenjala suradnica}} $3 dana $1 u $2.",
        "othercontribs": "Temelji se na doprinosu suradnika $1.",
        "others": "drugih",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|suradnik|suradnici}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|suradnik|suradnica}}|suradnici}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|anonimni suradnik|anonimni suradnici}} $1",
        "creditspage": "Autori stranice",
        "nocredits": "Za ovu stranicu nema podataka o autorima.",
        "spam_blanking": "Sve inačice koje sadržavaju poveznice na $1, brišem cjelokupni sadržaj",
        "spam_deleting": "Sve inačice sadržale su poveznice na $1, brišem cjelokupni sadržaj",
        "simpleantispam-label": "Anti-spam provjera.\n<strong>NE</strong> ispunjavajte ovo!",
-       "pageinfo-title": "Podatci o stranici \"$1\"",
+       "pageinfo-title": "Podatci o stranici »$1«",
        "pageinfo-not-current": "Nema podataka o uređivanju za najstarija uređivanja stranice.",
        "pageinfo-header-basic": "Osnovni podatci",
        "pageinfo-header-edits": "Uređivanja",
        "pageinfo-header-properties": "Svojstva stranice",
        "pageinfo-display-title": "Naslov stranice",
        "pageinfo-default-sort": "Podrazumijevano sortiranje",
-       "pageinfo-length": "Dužina stranice (u bajtovima)",
+       "pageinfo-length": "Veličina stranice (u bajtovima)",
        "pageinfo-article-id": "ID stranice",
        "pageinfo-language": "Jezik stranice",
        "pageinfo-content-model": "Tip podataka na stranici",
+       "pageinfo-content-model-change": "promijeni",
        "pageinfo-robot-policy": "Status tražilice",
        "pageinfo-robot-index": "Stranicu je moguće indeksirati",
        "pageinfo-robot-noindex": "Indeksiranje stranice onemogućeno",
        "newimages-summary": "Ova posebna stranica pokazuje posljednje nedavno postavljene datoteke.",
        "newimages-legend": "Filtar",
        "newimages-label": "Naziv datoteke (ili njen dio):",
+       "newimages-user": "IP adresa ili suradničko ime",
        "newimages-showbots": "Prikaži datoteke koje su postavili botovi",
        "newimages-hidepatrolled": "Sakrij pregledana postavljanja",
        "noimages": "Nema slika.",
        "specialpages-group-highuse": "Najčešće korištene stranice",
        "specialpages-group-pages": "Popisi stranica",
        "specialpages-group-pagetools": "Alati za stranice",
-       "specialpages-group-wiki": "Wiki podaci i alati",
+       "specialpages-group-wiki": "Podatci i oruđe",
        "specialpages-group-redirects": "Preusmjeravajuće posebne stranice",
        "specialpages-group-spam": "Spam alati",
        "specialpages-group-developer": "Alati za razvijatelje",
        "htmlform-time-invalid": "Unesena vrijednost nije prepoznati format vremena. Pokušajte koristiti format HH:MM:SS.",
        "htmlform-datetime-toohigh": "Uneseni datum i vrijeme su veći od $1",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
-       "logentry-delete-delete_redir": "$1 je premještanjem {{GENDER:$2|pobrisao|pobrisala}} preusmjeravanje $3",
+       "logentry-delete-delete_redir": "$1 premještanjem je {{GENDER:$2|pobrisao|pobrisala}} preusmjeravanje $3",
        "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|zapisa u evidenciji|$5 zapisa u evidenciji}} na $3: $4",
        "logentry-delete-revision": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|uređivanja|$5 uređivanja}} na stranici $3: $4",
        "logentry-move-move-noredirect": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 bez preusmjeravanja",
        "logentry-move-move_redir": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja",
        "logentry-move-move_redir-noredirect": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja",
-       "logentry-patrol-patrol": "$1 je {{GENDER:$2|označio|označila}} uređivanje $4 stranice $3 pregledanim",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|označio|označila}} je uređivanje $4 stranice $3 ophođenim",
        "logentry-patrol-patrol-auto": "$1 je automatski {{GENDER:$2|označio|označila}} uređivanje $4 stranice $3 pregledanim",
        "logentry-newusers-newusers": "$1 je {{GENDER:$2|otvorio|otvorila}} suradnički račun",
        "logentry-newusers-create": "$1 je {{GENDER:$2|stvorio|stvorila}} suradnički račun.",
        "log-name-managetags": "Evidencija upravljanja oznakama",
        "log-name-tag": "Evidencija oznaka",
        "rightsnone": "(suradnik)",
-       "revdelete-summary": "sažetak",
        "feedback-adding": "Dodajem povratne informacije na stranicu...",
        "feedback-back": "Natrag",
        "feedback-bugcheck": "Izvrsno! Molimo provjerite da se ne radi o nekom [$1 poznatom \"bugu\"].",
        "feedback-bugnew": "Provjereno. Prijavi novi \"bug\"",
        "feedback-bugornote": "Ako ste spremni detaljno opisati tehnički problem molimo [$1 prijavite \"bug\"].\nInače, možete ispuniti jednostavan obrazac u nastavku. Vaš komentar biti će dodan na stranicu \"[$3 $2]\", zajedno s vašim suradničkim imenom i imenom internetskog preglednika koji rabite.",
        "feedback-cancel": "Odustani",
-       "feedback-close": "Gotovo",
+       "feedback-close": "Riješeno",
        "feedback-external-bug-report-button": "Arhiviraj tehnički zadatak",
        "feedback-dialog-title": "Slanje povratnih informacija",
        "feedback-dialog-intro": "Da biste poslali povratnu informaciju, rabite jednostavan obrazac. Vaš će komentar biti dodan na stranici \"$1\" s Vašim suradničkim imenom.",
        "feedback-terms": "Jasno mi je da moje ''user agent'' informacije sadrže točne informacije o mom pregledniku i operativnom sustavu te da će biti javno dostupne zajedno s mojom povratnom informacijom.",
        "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!",
+       "feedback-thanks-title": "Hvala Vam lijepa!",
        "searchsuggest-search": "Pretraži projekt {{SITENAME}}",
        "searchsuggest-containing": "sadrži....",
        "api-error-badtoken": "Interna pogrješka: Token nije ispravan.",
index 85192b1..fd14654 100644 (file)
        "externaldberror": "Entweder es lieht en Fehler bei der externe Authentifizierung voar orrer du därrefst dein externes Benutzerkonto net aktualisiere.",
        "login": "Oonmelde",
        "nav-login-createaccount": "Oonmelde / Benutzerkonto erstelle",
-       "userlogin": "Oonmelde / Benutzerkonto erstelle",
-       "userloginnocreate": "Oonmelde",
        "logout": "Abmelde",
        "userlogout": "Abmelde",
        "notloggedin": "Nicht oongemeldt",
        "userlogin-noaccount": "Du host noch ken Benutzerkonto?",
        "userlogin-joinproject": "{{SITENAME}} beitrete",
-       "nologin": "Du host ken Benutzerkonto? '''$1'''.",
-       "nologinlink": "En neie Benutzerkonto erstelle",
        "createaccount": "Benutzerkonto erstelle",
-       "gotaccount": "Du host schon en Benutzerkonto? '''$1'''.",
-       "gotaccountlink": "Oonmelde",
-       "userlogin-resetlink": "Die Oonmelddate vergess?",
        "userlogin-resetpassword-link": "Passwort vergesse?",
        "userlogin-helplink2": "Hellef bei der Oonmeldung",
        "userlogin-loggedin": "Du bist schon als {{GENDER:$1|$1}} oongemeldt.\nBenutz das unne stehnd Formular, um dich unner enem annren Benutzername oonzumelde.",
        "createacct-another-email-ph": "E-Mail-Adress",
        "createaccountmail": "En temporäres Zufallspasswort verwenne und an die oongebne E-Mail-Adress verschicke",
        "createacct-realname": "Registrierte Noome (optional)",
-       "createaccountreason": "Grund:",
        "createacct-reason": "Begründung",
        "createacct-reason-ph": "Waroom erstellst du en annres Benutzerkonto?",
        "createacct-submit": "Dein Benutzerkonto erstelle",
        "showdiff": "Ändrunge zeiche",
        "anoneditwarning": "Du beoorbeitest die Seit unoongemeldet. Wenn du sie abspeichre tust, weard dein aktuelle Komputador IP-Adress in der Versionsgeschicht uffgezeichnet und ist domit unwiderruflich und kann '''öffentlich''' gesiehn sind.",
        "anonpreviewwarning": "''Du bist net oongemeldet. Beim Speichre weard dein IP-Adress in der Versionsgeschicht uffgezeichnet.''",
-       "missingsummary": "'''Hinweis:''' Du host ken Zusammerfassung oongeb. Wenn du erneit uff \"{{int:savearticle}}\" klicke tust, weard dein Ännrung ohne Zusammerfassung üwernomm.",
+       "missingsummary": "'''Hinweis:''' Du host ken Zusammerfassung oongeb. Wenn du erneit uff \"$1\" klicke tust, weard dein Ännrung ohne Zusammerfassung üwernomm.",
        "missingcommenttext": "Dein Abschnitt enthält ken Text.",
-       "missingcommentheader": "'''Achtung:''' Du host ken Betreff/Üwerschrift ingeb. Wenn du erneit uff \"{{int:savearticle}}\" klicke tust, weard dein Beoorbeitung ohne Üwerschrift gespeichert.",
+       "missingcommentheader": "'''Achtung:''' Du host ken Betreff/Üwerschrift ingeb. Wenn du erneit uff \"$1\" klicke tust, weard dein Beoorbeitung ohne Üwerschrift gespeichert.",
        "summary-preview": "Voarschau von der Zusammerfassungszeil:",
        "subject-preview": "Voarschau von der Zusammerfassungszeil:",
        "blockedtitle": "Benutzer ist gesperrt",
        "editingsection": "Beoorbeite von „$1“ (Abschnitt)",
        "editingcomment": "Beoorbeite von \"$1\" (Abschnitt)",
        "editconflict": "Beoorbeitungskonflikt: $1",
-       "explainconflict": "Jemand anners hot die Seit geännert, nohdem du oongefäng host, sie zu beoorbeite.\nDas Textfeld do uwe enthält den aktuell Beoorbeitungsstand von der Seit.\nDas unnre Textfeld enthält dein Ändrunge.\nBittschön füch dein Ändrungen in das Textfeld do uwe ren.\n'''Nuar''' der Inhalt von dem Textfeld do uwe weard gespeichert, wenn du uff „{{int:savearticle}}“ klicke tust.",
+       "explainconflict": "Jemand anners hot die Seit geännert, nohdem du oongefäng host, sie zu beoorbeite.\nDas Textfeld do uwe enthält den aktuell Beoorbeitungsstand von der Seit.\nDas unnre Textfeld enthält dein Ändrunge.\nBittschön füch dein Ändrungen in das Textfeld do uwe ren.\n'''Nuar''' der Inhalt von dem Textfeld do uwe weard gespeichert, wenn du uff „$1“ klicke tust.",
        "yourtext": "Dein Text",
        "storedversion": "Gespeicherte Version",
        "nonunicodebrowser": "'''Achtung: Dein Browser kann Unicode-Zeiche net richtich veroorbeite.''' Es weard en Hellefsroutin rengesetzt, um dich zu erlaube, Seite sicher zu beoorbeite: Nicht-ASCII-Zeiche werre dabei im Beoorbeitungsfenster als hexadezimale Codes oongezeicht.",
        "right-editprotected": "Seite bearbeite, wo als \"{{int:protect-level-sysop}}\" geschützt sind",
        "right-editsemiprotected": "Seite beoorbeite, wo als \"{{int:protect-level-autoconfirmed}}\" geschützt sind",
        "right-editinterface": "Benutzeroberfläche beoorbeite",
-       "right-editusercssjs": "Fremde CSS- und JavaScript-Dateie beoorbeite",
        "right-editusercss": "Fremde CSS-Dateie bearbeite",
        "right-edituserjs": "Fremde JavaScript-Dateie boobeite",
        "right-editmyusercss": "Eichne Benutzer-CSS-Dateie beoorbeite",
        "rcshowhidemine": "Eichne Beiträche $1",
        "rcshowhidemine-show": "Zeich",
        "rcshowhidemine-hide": "Versteck",
-       "rclinks": "Zeich die letzte $1 Ännrunge von der letzte $2 Tooche.<br />$3",
+       "rclinks": "Zeich die letzte $1 Ännrunge von der letzte $2 Tooche.",
        "diff": "Unnerschied",
        "hist": "Versione",
        "hide": "Versteck",
        "undeleteviewlink": "oongucke",
        "undeleteinvert": "Auswahl umkehre",
        "undeletecomment": "Grund:",
-       "undeletedrevisions": "{{PLURAL:$1|1 Version woard|$1 Versione woorre}} wiederheargestellt",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Version|$1 Versione}} und {{PLURAL:$2|1 Datei|$2 Dateie}} woorre wiederheargestellt",
-       "undeletedfiles": "{{PLURAL:$1|1 Datei woard|$1 Dateie worre}} wiederhergestellt",
        "cannotundelete": "Die Wiederhearstellung ist fehlgeschlooht:\n$1",
        "undeletedpage": "'''\"$1\"''' woorre wiederhergestellt.\n\nIm [[Special:Log/delete|Abwischung-Logbuch]] finnst du en Üwersicht von der gelöschte und wiederheargestellte Seite.",
        "undelete-header": "Sieh das [[Special:Log/delete|Abwischung-Logbuch]] für keerzlich abgewischte Seite.",
index 9012602..2ae1aa3 100644 (file)
@@ -21,6 +21,7 @@
        "tog-hideminor": "Snadne změny w aktualnych změnach schować",
        "tog-hidepatrolled": "Dohladawane změny w aktualnych změnach schować",
        "tog-newpageshidepatrolled": "Dohladowane strony z lisćiny nowych stronow schować",
+       "tog-hidecategorization": "Kategorizaciju stronow schować",
        "tog-extendwatchlist": "Lisćinu wobkedźbowankow wočinić, zo by wšě změny widźał, nic jenož najnowše",
        "tog-usenewrc": "Změny po stronje w aktualnych změnach a wobkedźbowankach zeskupjeć",
        "tog-numberheadings": "Nadpisma awtomatisce čisłować",
@@ -40,7 +41,7 @@
        "tog-enotifminoredits": "Tež za snadne změny stronow a datajow e-mejl pósłać",
        "tog-enotifrevealaddr": "Moju e-mejlowu adresu w e-mejlowych zdźělenkach wotkryć",
        "tog-shownumberswatching": "Ličbu wobkedźbowacych wužiwarjow pokazać",
-       "tog-oldsig": "Eksistowaca signatura:",
+       "tog-oldsig": "Twoja eksistowaca signatura:",
        "tog-fancysig": "Ze signaturu kaž z wikitekstom wobchadźeć  (bjez awtomatiskeho wotkaza)",
        "tog-uselivepreview": "Live-přehlad wužiwać",
        "tog-forceeditsummary": "Mje skedźbnić, jeli zabudu zjeće",
        "october-date": "$1. oktobra",
        "november-date": "$1. nowembra",
        "december-date": "$1. decembra",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategorija|Kategoriji|Kategorije|Kategorije}}",
        "category_header": "Nastawki w kategoriji „$1”",
        "subcategories": "Podkategorije",
        "newwindow": "(wočinja so w nowym woknje)",
        "cancel": "Přetorhnyć",
        "moredotdotdot": "Wjace…",
-       "morenotlisted": "Tuta lisćina dospołna njeje.",
+       "morenotlisted": "Tuta lisćina snadź dospołna njeje.",
        "mypage": "Strona",
        "mytalk": "Diskusija",
        "anontalk": "Diskusija",
        "searcharticle": "Pytać",
        "history": "Wersije strony",
        "history_short": "wersije",
+       "history_small": "starše wersije",
        "updatedmarker": "Změny z mojeho poslednjeho wopyta",
        "printableversion": "Ćišćomna wersija",
        "permalink": "Trajny wotkaz",
        "talk": "diskusija",
        "views": "Zwobraznjenja",
        "toolbox": "Nastroje",
+       "tool-link-emailuser": "{{GENDER:$1|Tutomu wužiwarjej|Tutej wužiwarce}} mejlku pósłać",
        "userpage": "Wužiwarsku stronu pokazać",
        "projectpage": "Projektowu stronu pokazać",
        "imagepage": "Datajowu stronu sej wobhladać",
        "createacct-yourpasswordagain-ph": "Zapodaj hesło hišće raz",
        "userlogin-remembermypassword": "Přizjewjeny wostać",
        "userlogin-signwithsecure": "Wěsty zwisk wužiwać",
+       "cannotlogin-title": "Přizjewjenje njeje móžne.",
+       "cannotlogin-text": "Přizjewjenje njeje móžne.",
+       "cannotloginnow-title": "Přizjewjenje njebě wuspěšne.",
+       "cannotcreateaccount-title": "Wužiwarske konto njeda so załožić.",
+       "cannotcreateaccount-text": "Bjezposrědnje załoženje wužiwarskich kontow w tutym wikiju móžne njeje.",
        "yourdomainname": "Twoja domejna:",
        "password-change-forbidden": "Njemóžeš hesła na tutym wikiju změnić.",
        "externaldberror": "Běše pak eksterny zmylk awtentifikacije datoweje banki, pak njesměš swoje eksterne konto aktualizować.",
        "login": "Přizjewić",
+       "login-security": "Wobkruć swoju identitu",
        "nav-login-createaccount": "Konto wutworić abo so přizjewić",
-       "userlogin": "Załožće konto abo přizjewće so",
-       "userloginnocreate": "Přizjewić",
        "logout": "wotzjewić",
        "userlogout": "wotzjewić",
        "notloggedin": "Njepřizjewjeny",
        "userlogin-noaccount": "Nimaš žane konto?",
        "userlogin-joinproject": "Konto za {{GRAMMAR:akuzatiw|{{SITENAME}}}} załožić",
-       "nologin": "Nimaš žane konto? $1.",
-       "nologinlink": "Konto załožić",
        "createaccount": "Konto załožić",
-       "gotaccount": "Maš hižo wužiwarske konto? $1.",
-       "gotaccountlink": "Přizjewić",
-       "userlogin-resetlink": "Přizjewjenske daty zabył?",
        "userlogin-resetpassword-link": "Sy swoje hesło zabył?",
        "userlogin-helplink2": "Pomoc při přizjewjenju",
        "userlogin-loggedin": "Sy hižo jako {{GENDER:$1|$1 přizjewjeny|$1 přizjewjena}}. Wužij slědowacy formular, zo by so jako druhi wužiwar přizjewił.",
+       "userlogin-reauth": "Dyrbiš so znowa přizjewić, zo by {{GENDER:$1|wobkrućił|wobkrućiła}} zo sy {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Dalše konto załožić",
        "createacct-emailrequired": "E-mejlowa adresa",
        "createacct-emailoptional": "E-mejlowa adresa (opcionalny)",
        "createacct-another-email-ph": "E-mejlowu adresu zapodać",
        "createaccountmail": "Nachwilne připadne hesło wužiwać a jo na slědowacu e-mejlowu adresu pósłać",
        "createacct-realname": "Woprawdźite mjeno (opcionalny)",
-       "createaccountreason": "Přičina:",
        "createacct-reason": "Přičina",
        "createacct-reason-ph": "Čehodla załožuješ druhe konto?",
        "createacct-submit": "Twoje konto załožić",
        "resetpass_submit": "Hesło posrědkować a so přizjewić",
        "changepassword-success": "Twoje hesło je so změniło!",
        "changepassword-throttled": "Sy přehusto spytał so přizjewić. Počakaj prošu $1, prjedy hač hišće raz spytaš.",
+       "botpasswords-label-create": "Wutworić",
+       "botpasswords-label-update": "Aktualizować",
+       "botpasswords-label-cancel": "Přetorhnyć",
+       "botpasswords-label-delete": "Wušmórnyć",
+       "botpasswords-label-resetpassword": "Hesło wróćo stajić",
+       "botpasswords-label-grants-column": "Dowolene",
        "resetpass_forbidden": "Hesła njedadźa so změnić.",
        "resetpass-no-info": "Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.",
        "resetpass-submit-loggedin": "Hesło změnić",
        "passwordreset-emailtext-user": "Wužiwar $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}} je anulowanje twojeho hesła za {{GRAMMAR:akuzatiw|{{SITENAME}}}} požadał ($4).  {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane}}:\n\n$2\n\n{{PLURAL:$3|Tute nachwilne hesło spadnje|Tutej nachwilnej hesle spadnjetej|Tute nachwilne hesła spadnu}} za {{PLURAL:$5|jedyn dźeń|$5 dnjej|$5 dny|$5 dnjow}}.\nTy měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tute naprašowanje pósłał, abo jeli sy so zaso na prěnjotne hesło dopomnił a wjace nochceš jo změnić, móžeš tutu zdźělenku ignorować a swoje stare hesło dale wužiwać.",
        "passwordreset-emailelement": "Wužiwarske mjeno: \n$1\n\nNachwilne hesło: \n$2",
        "passwordreset-emailsentemail": "Jeli tuta e-mejlowa adresa je z wašim kontom zwjazana, so mejlka za wróćostajenje hesła pósćele.",
+       "passwordreset-invalidemail": "Njepłaćiwa mejlkowa adresa",
+       "passwordreset-nodata": "Ani wužiwarske mjeno ani mejlkowa adresa stej so zapodałoj",
        "changeemail": "E-mejlowu adresu změnić abo wotstronić",
        "changeemail-header": "Wupjelń tutón formular, zo by swoju e-mejlowu adresu změnił. Jeli chceš zwisk e-mejloweje adresy ze swijim kontom wotstronić,  wostaj polo e-mejloweje adresy prózdne, hdyž formular preč sćeleš.",
        "changeemail-no-info": "Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.",
        "minoredit": "Snadna změna",
        "watchthis": "Stronu wobkedźbować",
        "savearticle": "Stronu składować",
+       "savechanges": "Změny składować",
        "publishpage": "Stronu wozjewić",
        "publishchanges": "Změny wozjewić",
        "preview": "Přehlad",
        "showpreview": "Přehlad pokazać",
        "showdiff": "Změny pokazać",
-       "blankarticle": "<strong>Warnowanje:</strong> Strona, kotruž wutworješ, je prózdna.\nJeli hišće raz na \"{{int:savearticle}}\" kliknješ, budźe so strona bjez wobsaha wutworić.",
+       "blankarticle": "<strong>Warnowanje:</strong> Strona, kotruž wutworješ, je prózdna.\nJeli hišće raz na \"$1\" kliknješ, budźe so strona bjez wobsaha wutworić.",
        "anoneditwarning": "<strong>Warnowanje:</strong> Njejsy přizjewjeny. Twoja IP-adresa budźe zjawnje widźomna, hdyž něšto změniš. Jeli <strong>[$1 so přizjewiš]</strong> abo <strong>[$2 konto załožiš]</strong>, so twoje změny twojemu wužiwarskemu mjenu připokazaja, nimo druhich lěpšinow.",
        "anonpreviewwarning": "''Njejsy přizjewjeny. Składowanje přenošuje twoju IP-adresu do wobdźěłowanskeje historije tuteje strony.''",
-       "missingsummary": "'''Kedźbu:''' Njejsy žane zjeće zapodał. Jeli hišće raz na \"{{int:savearticle}}\" kliknješ, budźe so twoja změna bjez njeho składować.",
+       "missingsummary": "'''Kedźbu:''' Njejsy žane zjeće zapodał. Jeli hišće raz na \"$1\" kliknješ, budźe so twoja změna bjez njeho składować.",
        "missingcommenttext": "Prošu zapodaj komentar.",
-       "missingcommentheader": "<strong>Kedźbu:</strong> Njejsy temu za tutón komentar podał. Jeli na „{{int:savearticle}}” kliknješ, składuje so twoja změna bjez temy.",
+       "missingcommentheader": "<strong>Kedźbu:</strong> Njejsy temu za tutón komentar podał. Jeli na „$1” kliknješ, składuje so twoja změna bjez temy.",
        "summary-preview": "Přehlad zjeća:",
        "subject-preview": "Přehlad temy:",
        "blockedtitle": "Wužiwar je zablokowany",
        "editingsection": "Wobdźěłanje strony $1 (wotrězk)",
        "editingcomment": "$1 so wobdźěłuje (nowy wotrězk)",
        "editconflict": "Wobdźěłowanski konflikt: $1",
-       "explainconflict": "Něchtó druhi je stronu změnił, po tym zo sy započał, ju wobdźěłować.\nHornje tekstowe polo wobsahuje tekst strony kaž tuchwilu eksistuje.\nTwoje změny so w delnim tekstowym polu pokazuja.\nDyrbiš swoje změny do eksistowaceho teksta zadźěłać.\n'''Jenož''' tekst w hornim tekstowym polu so składuje, hdyž znowa na „{{int:savearticle}}” kliknješ.",
+       "explainconflict": "Něchtó druhi je stronu změnił, po tym zo sy započał, ju wobdźěłować.\nHornje tekstowe polo wobsahuje tekst strony kaž tuchwilu eksistuje.\nTwoje změny so w delnim tekstowym polu pokazuja.\nDyrbiš swoje změny do eksistowaceho teksta zadźěłać.\n'''Jenož''' tekst w hornim tekstowym polu so składuje, hdyž znowa na „$1” kliknješ.",
        "yourtext": "Twój tekst",
        "storedversion": "Składowana wersija",
        "nonunicodebrowser": "'''KEDŹBU: Twój wobhladowak z Unikodom kompatibelny njeje.'''\nProwizoriske rozrisanje steji k dispoziciji, zo by ći zmóžnił, strony wěsće wobdźěłał: Nic-ASCII-znamješka budu so we wobdźěłowanskim polu jako heksadecimalne kody jewić.",
        "search-interwiki-caption": "Sotrowske projekty",
        "search-interwiki-default": "Wuslědki z $1:",
        "search-interwiki-more": "(dalše)",
+       "search-interwiki-more-results": "Dalše wuslědki",
        "search-relatedarticle": "Přiwuzne",
        "searchrelated": "přiwuzny",
        "searchall": "wšě",
        "showingresultsinrange": "Deleka so do {{PLURAL:$1|<strong>1</strong> wuslědka|<strong>$1</strong> wuslědkow}} we wobłuku <strong>$2</strong> hač do <strong>$3</strong> pokazuje.",
        "search-showingresults": "{{PLURAL:$4|Wuslědk <strong>$1</strong> z <strong>$3</strong>|Wuslědki <strong>$1 - $2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Njebuchu wuslědki namakane, kotrež naprašowanju wotpowěduja.",
+       "search-nonefound-thiswiki": "Na tutej webstronje njejsu wuslědki, kotrež naprašowanju wotpowěduja.",
        "powersearch-legend": "Rozšěrjene pytanje",
        "powersearch-ns": "W mjenowych rumach pytać:",
        "powersearch-togglelabel": "Kontrolować:",
        "prefs-editing": "Wobdźěłowanje",
        "searchresultshead": "Pytać",
        "stub-threshold": "Wotkazowe formatowanje małych stronow ($1):",
+       "stub-threshold-sample-link": "přikład",
        "stub-threshold-disabled": "Znjemóžnjeny",
        "recentchangesdays": "Ličba dnjow w lisćinje aktualnych změnow:",
        "recentchangesdays-max": "(Maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})",
        "prefs-diffs": "Rozdźěle",
        "prefs-help-prefershttps": "Tute nastajenje so po twojim přichodnym přizjewjenju wuskutkuje.",
        "prefs-tabs-navigation-hint": "Tip: Móžeš lěwy a prawy šipk wužiwać, zo byšće mjez rajtarkami w lisćinje rajtarkow nawigował.",
-       "userrights": "Zrjadowanje wužiwarskich prawow",
-       "userrights-lookup-user": "Wužiwarske skupiny zrjadować",
+       "userrights": "Wužiwarske prawa",
+       "userrights-lookup-user": "Wužiwarja wubrać",
        "userrights-user-editname": "Wužiwarske mjeno:",
        "editusergroup": "{{GENDER:$1|Wužiwarske}} skupiny wobdźěłać",
        "editinguser": "Změni wužiwarske prawa {{GENDER:$1|wužiwarja|wužiwarki}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Wužiwarske skupiny wobdźěłać",
+       "userrights-editusergroup": "{{GENDER:$1|Wužiwarske}} skupiny wobdźěłać",
        "saveusergroups": "{{GENDER:$1|Wužiwarske}} skupiny składować",
        "userrights-groupsmember": "Čłon wot:",
        "userrights-groupsmember-auto": "Implicitny čłon wot:",
        "right-editsemiprotected": "Strony wobdźěłać, kotrež su přez \"{{int:protect-level-autoconfirmed}}\" škitane",
        "right-editcontentmodel": "Wobsahowy model strony wobdźěłać",
        "right-editinterface": "Wužiwarski powjerch wobdźěłać",
-       "right-editusercssjs": "Dataje CSS a JS druhich wužiwarjow wobdźěłać",
        "right-editusercss": "Dataje CSS druhich wužiwarjow wobdźěłać",
        "right-edituserjs": "Dataje JS druhich wužiwarjow wobdźěłać",
        "right-editmyusercss": "Twoje swójske wužiwarske CSS-dataje wobdźěłać",
        "right-sendemail": "Druhim wužiwarjam e-mejl pósłać",
        "right-managechangetags": "[[Special:Tags|Markěrowanja]] wutworić a z(nje)móžnić",
        "right-applychangetags": "[[Special:Tags|Markěrowanja]] hromadźe ze změnami nałožować",
+       "grant-group-email": "Mejlku pósłać",
+       "grant-createaccount": "Wužiwarske konta wutworić",
+       "grant-createeditmovepage": "Strony wutworić, wobdźěłać a přesunyć",
+       "grant-delete": "Strony, wersije a zapiski logoweje knihi wušmórnyć",
+       "grant-editmywatchlist": "Twoje wobkedźbowanki wobdźěłać",
+       "grant-uploadfile": "Nowe dataje nahrawać",
+       "grant-basic": "Zakładne prawa",
        "newuserlogpage": "Protokol nowych wužiwarjow",
        "newuserlogpagetext": "To je protokol wutworjenja nowych wužiwarskich kontow.",
        "rightslog": "Protokol zrjadowanja wužiwarskich prawow",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (hlej tež [[Special:NewPages|lisćinu nowych stronow]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Pokazać",
+       "rcfilters-savedqueries-rename": "Přemjenować",
+       "rcfilters-savedqueries-new-name-label": "Mjeno",
+       "rcfilters-savedqueries-cancel-label": "Přetorhnyć",
+       "rcfilters-invalid-filter": "Njepłaćiwy filter",
+       "rcfilters-filterlist-whatsthis": "Što je to?",
+       "rcfilters-highlightmenu-title": "Barbu wubrać",
+       "rcfilters-filtergroup-registration": "Registrowanje wužiwarja",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nowački",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Mjenje hač 10 změnow a štyri aktiwne dny.",
+       "rcfilters-filter-user-experience-level-learner-label": "Započatkarjo",
+       "rcfilters-filter-user-experience-level-learner-description": "Wjace nazhonjenjow hač „nowački“, ale mjenje hač „nazhonići wužiwarjo“.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Nazhonići wužiwarjo",
+       "rcfilters-filter-user-experience-level-experienced-description": "Wjace hač 30 aktiwnych dnjow a 500 změnow.",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-patrolled-label": "Kontrolowane",
+       "rcfilters-filter-patrolled-description": "Změny, kotrež markěrowachu so jako kontrolowane.",
+       "rcfilters-filter-unpatrolled-label": "Njekontrolowane",
+       "rcfilters-filter-unpatrolled-description": "Změny, kotrež njemarkěrowachu so jako kontrolowane.",
+       "rcfilters-filtergroup-significance": "Wuznam",
+       "rcfilters-filter-minor-label": "Snadne změny",
+       "rcfilters-filter-pageedits-label": "Změny na stronach",
        "rcnotefrom": "Deleka so {{PLURAL:$5|změna|změnje|změny}} wot <strong>$3, $4</strong> {{PLURAL:$5|pokazuje|pokazujetej|pokazuja}} (hač k <strong>$1</strong>).",
        "rclistfrom": "Jenož změny wot $3, $2 pokazać.",
        "rcshowhideminor": "snadne změny $1",
        "rcshowhidemine-hide": "schować",
        "rcshowhidecategorization-show": "Pokazać",
        "rcshowhidecategorization-hide": "Schować",
-       "rclinks": "Pokazuj poslednje $1 změny poslednich $2 dnjow.<br />$3",
+       "rclinks": "Pokazuj poslednje $1 změny poslednich $2 dnjow.",
        "diff": "rozdźěl",
        "hist": "wersije",
        "hide": "schować",
        "undeleteviewlink": "wobhladać sej",
        "undeleteinvert": "Wuběr wobroćić",
        "undeletecomment": "Přičina:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} {{PLURAL:$1|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} a $2 {{PLURAL:$2|dataja|dataji|dataje|datajow}} {{PLURAL:$2|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}",
-       "undeletedfiles": "$1 {{PLURAL:$1|dataja|dataji|dataje|datajow}} {{PLURAL:$1|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}.",
        "cannotundelete": "Wobnowjenje zwrěšćiło:\n$1",
        "undeletedpage": "'''Strona $1 bu z wuspěchom wobnowjena.'''\n\nHlej [[Special:Log/delete|protokol]] za lisćinu aktualnych wušmórnjenjow a wobnowjenjow.",
        "undelete-header": "Hlej [[Special:Log/delete|protokol wušmórnjenjow]] za njedawno wušmórnjene strony.",
        "patrol-log-header": "To je protokol dohladowanych wersijow.",
        "log-show-hide-patrol": "Protokol dohladowanja $1",
        "log-show-hide-tag": "Protokol markěrowanjow $1",
+       "confirm-markpatrolled-button": "W porjadku",
+       "confirm-markpatrolled-top": "Wersiju $3 strony $2 jako přehladowanu markěrować?",
        "deletedrevision": "Stara wersija $1 wušmórnjena",
        "filedeleteerror-short": "Zmylk při zničenju dataje: $1",
        "filedeleteerror-long": "Buchu zmylki při zničenju dataje zwěsćene:\n\n$1",
        "confirmrecreate": "{{GENDER:$1|Wužiwar|Wužiwarka}} [[User:$1|$1]] ([[User talk:$1|diskusija]]) je stronu {{GENDER:$1|wušmórnył|wušmórnyła}}, po tym zo sy započał ju wobdźěłać. Přičina:\n: <em>$2</em>\nProšu potwjerdź, zo chceš tutu stronu woprawdźe znowa wutworić.",
        "confirmrecreate-noreason": "{{GENDER:$1|Wužiwar|Wužiwarka}} [[User:$1|$1]] ([[User talk:$1|diskusija]]) je tutu stronu {{GENDER:$1|zhašał|zhašała}}, po tym zo sće wobdźěłowanje započał. Prošu wobkruć, zo woprawdźe chceš tutu stronu znowa wutworić.",
        "recreate": "Znowa wutworić",
+       "confirm-purge-title": "Tutu stronu zaktualizować",
        "confirm_purge_button": "W porjadku",
        "confirm-purge-top": "Pufrowak strony wuprózdnić?",
        "confirm-purge-bottom": "Wuprózdnja pufrowak a wunuzuje zwobraznjenje aktualneje wersije.",
        "confirm-watch-top": "Tutu stronu wobkedźbowankam přidać?",
        "confirm-unwatch-button": "W porjadku",
        "confirm-unwatch-top": "Tutu stronu z wobkedźbowankow wotstronić?",
+       "confirm-rollback-button": "W porjadku",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← předchadna strona",
        "imgmultipagenext": "přichodna strona →",
        "logentry-upload-overwrite": "$1 je nowu wersiju $3 {{GENDER:$2|nahrał|nahrała}}",
        "logentry-upload-revert": "$1 je $3 {{GENDER:$2|nahrał|nahrała}}",
        "rightsnone": "(ničo)",
-       "revdelete-summary": "zjeće wobdźěłać",
        "feedback-adding": "Komentar so stronje přidawa...",
        "feedback-back": "Wróćo",
        "feedback-bugcheck": "Wulkotnje! Skontroluj jenož, hač to jedyn z [$1 znatych zmylkow] njeje.",
index edb8a7c..0f654a5 100644 (file)
@@ -17,6 +17,7 @@
        "tog-hideminor": "Kache tout modifikasyon resan yo ki tou piti",
        "tog-hidepatrolled": "Kache modifikasyon yo ki fèk fèt pou moun ki ap veye yo",
        "tog-newpageshidepatrolled": "Kache paj ki siveye yo nan mitan lis nouvo paj yo",
+       "tog-hidecategorization": "Kache kategori ki nan paj la",
        "tog-extendwatchlist": "Etann lis swivi pou ou kapab wè tout chanjman yo, pa sèlman sa ki fèk fèt yo",
        "tog-usenewrc": "Sanble modifikasyon pou chak paj nan chanjman resan ak paj an vèy",
        "tog-numberheadings": "Nimewote otomatikman tit yo",
@@ -27,6 +28,7 @@
        "tog-watchdefault": "Ajoute paj mwen chanje yo nan lis swivi mwen",
        "tog-watchmoves": "Ajoute paj mwen deplase yo nan lis swivi mwen",
        "tog-watchdeletion": "Ajoute paj mwen efase yo nan lis swivi mwen",
+       "tog-watchuploads": "Ajoute paj nouvo nan favori m'",
        "tog-watchrollback": "Ajoute paj kote mwen ranvèse chanjman yo nan lis swivi mwen",
        "tog-minordefault": "Make tout modifikasyon kòm «&nbsp;tou piti&nbsp;» pa defo",
        "tog-previewontop": "Montre kout je anvan zòn modifikasyon",
@@ -36,7 +38,7 @@
        "tog-enotifminoredits": "Voye yon imèl ban mwen pou ti chanjman paj ak fichye",
        "tog-enotifrevealaddr": "Montre adrès imèl mwen nan kominikasyon notifikasyon yo",
        "tog-shownumberswatching": "Montre kantite itlizatè k’ap swiv",
-       "tog-oldsig": "Siyati ki la deja a:",
+       "tog-oldsig": "Siyati ki egziste deja ou",
        "tog-fancysig": "Konsidere siyati sa tankou yon wikitèks (san lyen ki ta otomatik)",
        "tog-uselivepreview": "Sèvi ak vizyònman dirèk",
        "tog-forceeditsummary": "Notifye m lè m ap antre yon somè modifikasyon vid",
@@ -67,8 +69,8 @@
        "thursday": "jedi",
        "friday": "vandredi",
        "saturday": "samdi",
-       "sun": "dim",
-       "mon": "len",
+       "sun": "dimanch",
+       "mon": "lendi",
        "tue": "mad",
        "wed": "mèk",
        "thu": "jed",
        "searcharticle": "Ale",
        "history": "Istorik paj la",
        "history_short": "Istorik",
+       "history_small": "Istwa",
        "updatedmarker": "Aktyalize depi dènyè visit mwen",
        "printableversion": "Vèsyon ou kapab enprime",
        "permalink": "Lyen pou tout tan",
        "nstab-template": "Modèl",
        "nstab-help": "Paj èd",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "paj prensipal",
        "nosuchaction": "Pa gen bagay konsa",
        "nosuchactiontext": "Wiki a pa rekonèt aksyon ki espesifye pa URL la.\nOu gendwa mal ekri URL la oubyen ou te swiv yon movè lyen.\nSa kapab di tou gen yon erè nan lojisyèl ki itilize nan sit {{SITENAME}}.",
        "nosuchspecialpage": "Pa gen paj especial konsa",
        "yourname": "Non itilizatè ou an :",
        "userlogin-yourname": "Non itilizatè",
        "userlogin-yourname-ph": "Rantre non itilizatè w",
+       "createacct-another-username-ph": "Antre non itilizatè a",
        "yourpassword": "Mopas ou an :",
        "userlogin-yourpassword": "Modpas",
        "userlogin-yourpassword-ph": "Rantre modpas ou",
        "createacct-yourpasswordagain-ph": "Rantre modpas la ankò",
        "userlogin-remembermypassword": "Pa dekonekte m",
        "userlogin-signwithsecure": "Sèvi ak yon koneksyon sekirize",
+       "cannotloginnow-title": "Ou pa ka siyen nan kounye a",
        "yourdomainname": "Domèn ou an",
        "password-change-forbidden": "Ou pa ka chanje modpas sou wiki sa a.",
        "externaldberror": "Li sanble ke yon erè pwodui ak bazdone a pou idantifikasyon ki pa nan sistèm an, oubyen ou pa otorize pou mete a jou kont ou genyen nan lòt sistèm yo.",
        "login": "Konekte ou",
        "nav-login-createaccount": "Kreye yon kont oubyen konekte ou",
-       "userlogin": "Kreye yon kont oubyen konekte ou",
-       "userloginnocreate": "Konekte ou",
        "logout": "Dekonekte ou",
        "userlogout": "Dekoneksyon",
        "notloggedin": "Ou pa konekte",
        "userlogin-noaccount": "Ou pa gen yon kont?",
        "userlogin-joinproject": "Enskri nan {{SITENAME}}",
-       "nologin": "Ou pa genyen yon kont ? '''$1'''.",
-       "nologinlink": "Kreye yon kont",
        "createaccount": "Kreye yon kont",
-       "gotaccount": "Ou deja genyen yon kont ? '''$1'''.",
-       "gotaccountlink": "Idantifye ou",
        "userlogin-resetpassword-link": "Ou bliye modpas ou?",
        "userlogin-helplink2": "Èd pou konekte",
+       "createacct-emailrequired": "adrès imel ou",
        "createacct-emailoptional": "Adrès imèl (fakiltatif)",
        "createacct-email-ph": "Rantre adrès imèl ou",
-       "createaccountmail": "pa imèl",
-       "createaccountreason": "Rezon:",
+       "createacct-another-email-ph": "Antre nan adrès imel ou",
+       "createaccountmail": "Sèvi ak yon modpas pou yon ti tan ak o aza lè sa a, voye li nan adrès imel la espesifye",
        "createacct-reason": "Rezon",
        "createacct-reason-ph": "Poukisa w ap ouvri yon lòt kont?",
        "createacct-submit": "Ouvri kont ou",
        "showdiff": "Montre chanjman yo",
        "anoneditwarning": "'''Atansyon :''' ou pa konekte nan sistèm nan. Adrès IP ou a ap pibliz si w fè chanjman. Si w <strong>[$1 konekte]</strong> oubyen <strong>[$2 ouvri yon kont]</strong> chanjman ou fè yo ap asosye ak non itilizate ou, ansanm ak lòt avantaj.",
        "anonpreviewwarning": "''Ou pa konekte.  Anrejistre ap kenbe adrès IP ou a nan istorik paj sa a.''",
-       "missingsummary": "'''Souple :''' ou poko bay rezime modifikasyon ou fè an\nSi ou klike sou \"{{int:savearticle}}\" ankò, piblikasyon sa ap fèt san li bay lòt avètisman.",
+       "missingsummary": "'''Souple :''' ou poko bay rezime modifikasyon ou fè an\nSi ou klike sou \"$1\" ankò, piblikasyon sa ap fèt san li bay lòt avètisman.",
        "missingcommenttext": "Souple, ekri komantè ou an pli ba nan paj sa.",
-       "missingcommentheader": "'''Pòte atansyon :''' ou pa bay komantè ou an yon sijè/tit .\nSi ou klike sou \"{{int:savearticle}}\", modifikasyon ou an pap genyen yon tit.",
+       "missingcommentheader": "'''Pòte atansyon :''' ou pa bay komantè ou an yon sijè/tit .\nSi ou klike sou \"$1\", modifikasyon ou an pap genyen yon tit.",
        "summary-preview": "Kout je nan rezime an anvan li anrejistre:",
        "subject-preview": "Yon kout je sou sijè/tit sa:",
        "blockedtitle": "itilizatè a bloke.",
        "editingsection": "Modifikasyon pou $1 (seksyon)",
        "editingcomment": "Modifikasyon pou $1 (nouvo seksyon)",
        "editconflict": "Batay ant modifikasyon : $1",
-       "explainconflict": "Yon lòt moun te anrejistre paj sa apre ou te komanse modifye l.\nW ap jwenn teks jan li ye kounye a nan zòn modifikasyon an ki anlè.\nModifikasyon ou pòte yo parèt anba.\nOu dwe fè modifikasyon ou yo nan tèks ki te deja anrejistre a ki anlè.\nSe tèks ki nan pati anlè a sèlman k ap anrejistre toutbon lè ou klike sou « {{int:savearticle}} ».",
+       "explainconflict": "Yon lòt moun te anrejistre paj sa apre ou te komanse modifye l.\nW ap jwenn teks jan li ye kounye a nan zòn modifikasyon an ki anlè.\nModifikasyon ou pòte yo parèt anba.\nOu dwe fè modifikasyon ou yo nan tèks ki te deja anrejistre a ki anlè.\nSe tèks ki nan pati anlè a sèlman k ap anrejistre toutbon lè ou klike sou « $1 ».",
        "yourtext": "Tèks ou an",
        "storedversion": "Vèsyon ki anrejistre",
        "nonunicodebrowser": "'''Atansyon: Navigatè ou an pa ka mache ak Unicode lan.'''\nNou fè yon jan pou pèmèt ou fè modifikasyon nan paj yo: karaktè ki pa nan ASCII yo pral ekri ak kòd ekzadesimal.",
        "rcshowhidemine": "$1 kontribisyon mwen yo",
        "rcshowhidemine-show": "Montre",
        "rcshowhidemine-hide": "Kache",
-       "rclinks": "Afiche dènye $1 modifikasyon ki fèt nan $2 dènye jou sa yo<br />$3.",
+       "rclinks": "Afiche dènye $1 modifikasyon ki fèt nan $2 dènye jou sa yo",
        "diff": "diferans",
        "hist": "istorik",
        "hide": "Kache",
        "htmlform-reset": "Revoke chanjman yo",
        "revdelete-restricted": "aplike restriksyon sa yo pou administratè yo",
        "logentry-newusers-create": "Kont itilizatè $1 a kreye",
-       "revdelete-summary": "somè pou modifikasyon",
        "searchsuggest-search": "Chèche"
 }
diff --git a/languages/i18n/hu-formal.json b/languages/i18n/hu-formal.json
new file mode 100644 (file)
index 0000000..c098a2f
--- /dev/null
@@ -0,0 +1,255 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Dani",
+                       "Futhark1988",
+                       "Máté",
+                       "R-Joe",
+                       "Tacsipacsi"
+               ]
+       },
+       "tog-underline": "Hivatkozások aláhúzása:",
+       "tog-hideminor": "Apró változtatások elrejtése a friss változtatások lapon",
+       "tog-hidepatrolled": "Az ellenőrzött szerkesztések elrejtése a friss változtatások lapon",
+       "tog-newpageshidepatrolled": "Ellenőrzött lapok elrejtése az új lapok listájáról",
+       "tog-extendwatchlist": "A figyelőlistán az összes változtatás látszódjon, ne csak az utolsó",
+       "tog-usenewrc": "Szerkesztések csoportosítása oldal szerint a friss változtatásokban és a figyelőlistán",
+       "tog-numberheadings": "Fejezetcímek automatikus számozása",
+       "tog-showtoolbar": "Szerkesztőeszközsor megjelenítése",
+       "tog-editondblclick": "A lapok szerkesztése dupla kattintásra",
+       "tog-editsectiononrightclick": "Szakaszok szerkesztése a szakaszcímre való jobb kattintással",
+       "tog-watchcreations": "Az Ön által létrehozott lapok és feltöltött fájlok felvétele a figyelőlistára",
+       "tog-watchdefault": "Az Ön által szerkesztett lapok és fájlok felvétele a figyelőlistájára",
+       "tog-watchmoves": "Az Ön által átnevezett lapok és fájlok felvétele a figyelőlistájára",
+       "tog-watchdeletion": "Az Ön által törölt lapok és fájlok hozzáadása a figyelőlistájához",
+       "tog-minordefault": "Alapértelmezésben az összes szerkesztése legyen aprónak jelölve",
+       "tog-previewontop": "Előnézet megjelenítése a szerkesztőablak előtt",
+       "tog-previewonfirst": "Előnézet első szerkesztésnél",
+       "tog-enotifwatchlistpages": "Értesítés küldése e-mailben, ha egy Ön által figyelt lap vagy fájl megváltozik",
+       "tog-enotifusertalkpages": "Értesítés e-mailben, ha megváltozik a vitalapja",
+       "tog-enotifminoredits": "Értesítés küldése e-mailben akkor is, ha egy Ön által figyelt lap vagy fájl megváltozik (apró változtatás)",
+       "tog-enotifrevealaddr": "Jelenítse meg az e-mail címét a figyelmeztető e-mailekben",
+       "tog-shownumberswatching": "A lapot figyelő szerkesztők számának megjelenítése",
+       "tog-oldsig": "A jelenlegi aláírás:",
+       "tog-fancysig": "Az aláírás wikiszöveg (nem lesz automatikusan hivatkozásba rakva)",
+       "tog-uselivepreview": "Élő előnézet használata (kísérleti)",
+       "tog-forceeditsummary": "Figyelmeztetés megjelenítése, ha nem ad meg szerkesztési összefoglalót",
+       "tog-watchlisthideown": "Az Ön szerkesztéseinek elrejtése a figyelőlistáról",
+       "tog-watchlisthidebots": "Robotok szerkesztéseinek elrejtése",
+       "tog-watchlisthideminor": "Apró változtatások elrejtése",
+       "tog-watchlisthideliu": "Bejelentkezett szerkesztők módosításainak elrejtése a figyelőlistáról",
+       "tog-watchlisthideanons": "Névtelen szerkesztések elrejtése",
+       "tog-watchlisthidepatrolled": "Az ellenőrzött szerkesztések elrejtése",
+       "tog-ccmeonemails": "A másoknak küldött e-mailjeiről kapon Ön is másolatot",
+       "tog-diffonly": "Ne mutassa a lap tartalmát a lapváltozatok közötti eltérések megtekintésekor",
+       "tog-showhiddencats": "Rejtett kategóriák megjelenítése",
+       "tog-norollbackdiff": "Ne jelenjenek meg az eltérések visszaállítás után",
+       "underline-always": "mindig",
+       "underline-never": "soha",
+       "underline-default": "Felület és böngésző alapértelmezése szerint",
+       "editfont-style": "A szerkesztőterület betűtípusa:",
+       "editfont-default": "a böngésző alapértelmezett beállítása",
+       "editfont-monospace": "fix szélességű betűtípus",
+       "editfont-sansserif": "talpatlan (sans-serif) betűtípus",
+       "editfont-serif": "talpas (serif) betűtípus",
+       "sunday": "vasárnap",
+       "monday": "hétfő",
+       "tuesday": "kedd",
+       "wednesday": "szerda",
+       "thursday": "csütörtök",
+       "friday": "péntek",
+       "saturday": "szombat",
+       "sun": "vas",
+       "mon": "hét",
+       "tue": "kedd",
+       "wed": "sze",
+       "thu": "csü",
+       "fri": "pén",
+       "sat": "szo",
+       "january": "január",
+       "february": "február",
+       "march": "március",
+       "april": "április",
+       "may_long": "május",
+       "june": "június",
+       "july": "július",
+       "august": "augusztus",
+       "september": "szeptember",
+       "october": "október",
+       "november": "november",
+       "december": "december",
+       "january-gen": "január",
+       "february-gen": "február",
+       "march-gen": "március",
+       "april-gen": "április",
+       "may-gen": "május",
+       "june-gen": "június",
+       "july-gen": "július",
+       "august-gen": "augusztus",
+       "september-gen": "szeptember",
+       "october-gen": "október",
+       "november-gen": "november",
+       "december-gen": "december",
+       "jan": "jan",
+       "feb": "febr",
+       "mar": "márc",
+       "apr": "ápr",
+       "may": "máj",
+       "jun": "jún",
+       "jul": "júl",
+       "aug": "aug",
+       "sep": "szept",
+       "oct": "okt",
+       "nov": "nov",
+       "dec": "dec",
+       "pagecategories": "{{PLURAL:$1|Kategória}}",
+       "category_header": "A(z) „$1” kategóriába tartozó lapok",
+       "subcategories": "Alkategóriák",
+       "category-media-header": "A(z) „$1” kategóriába tartozó médiafájlok",
+       "category-empty": "''Ebben a kategóriában pillanatnyilag egyetlen lap vagy médiafájl sem szerepel.''",
+       "hidden-categories": "{{PLURAL:$1|Rejtett kategória}}",
+       "hidden-category-category": "Rejtett kategóriák",
+       "category-subcat-count": "''{{PLURAL:$2|1=Ennek a kategóriának csak egyetlen alkategóriája van.|2=Ez a kategória az alábbi {{PLURAL:$1|1=alkategóriával|2=$1 alkategóriával}} rendelkezik (összesen $2 alkategóriája van).}}''",
+       "category-subcat-count-limited": "Ebben a kategóriában {{PLURAL:$1|egy|$1}} alkategória található.",
+       "category-article-count": "{{PLURAL:$2|A kategóriában csak a következő lap található.|A következő $1 lap található a kategóriában, összesen $2 lapból.}}",
+       "category-article-count-limited": "Ebben a kategóriában a következő {{PLURAL:$1|lap|$1 lap}} található:",
+       "category-file-count": "{{PLURAL:$2|Csak a következő fájl található ebben a kategóriában.|Az összesen $2 fájlból a következő $1-t listázza ez a kategórialap, a többi a további oldalakon található.}}",
+       "category-file-count-limited": "Ebben a kategóriában a következő {{PLURAL:$1|lap|$1 lap}} található:",
+       "listingcontinuesabbrev": "folyt.",
+       "index-category": "Indexelt lapok",
+       "noindex-category": "Nem indexelt lapok",
+       "broken-file-category": "Hibás fájlhivatkozásokat tartalmazó lapok",
+       "about": "Névjegy",
+       "article": "Szócikk",
+       "newwindow": "(új ablakban nyílik meg)",
+       "cancel": "Mégse",
+       "moredotdotdot": "Tovább…",
+       "mypage": "‎Lapom",
+       "mytalk": "Vitalap",
+       "anontalk": "Az IP-címhez tartozó vitalap",
+       "navigation": "Navigáció",
+       "and": "&#32;és",
+       "qbfind": "Keresés",
+       "qbbrowse": "Böngészés",
+       "qbedit": "Szerkesztés",
+       "qbpageoptions": "Lapbeállítások",
+       "qbmyoptions": "Lapjai",
+       "faq": "GyIK",
+       "faqpage": "Project:GyIK",
+       "actions": "Műveletek",
+       "namespaces": "Névterek",
+       "variants": "Változatok",
+       "errorpagetitle": "Hiba",
+       "returnto": "Vissza a(z) $1 laphoz.",
+       "tagline": "A {{SITENAME}} wikiből",
+       "help": "Segítség",
+       "search": "Keresés",
+       "searchbutton": "Keresés",
+       "go": "Menjen",
+       "searcharticle": "Menjen",
+       "history": "Laptörténet",
+       "history_short": "Laptörténet",
+       "updatedmarker": "az utolsó látogatása óta frissítették",
+       "printableversion": "Nyomtatható változat",
+       "permalink": "Hivatkozás erre a változatra",
+       "print": "Nyomtatás",
+       "view": "Olvasás",
+       "edit": "Szerkesztés",
+       "create": "Létrehozás",
+       "editthispage": "Lap szerkesztése",
+       "create-this-page": "Oldal létrehozása",
+       "delete": "Törlés",
+       "deletethispage": "Lap törlése",
+       "undelete_short": "{{PLURAL:$1|Egy|$1}} szerkesztés helyreállítása",
+       "viewdeleted_short": "{{PLURAL:$1|Egy|$1}} törölt szerkesztés megtekintése",
+       "protect": "Lapvédelem",
+       "protect_change": "módosítás",
+       "protectthispage": "Lapvédelem",
+       "unprotect": "Védelem módosítása",
+       "unprotectthispage": "Védelem módosítása",
+       "newpage": "Új lap",
+       "talkpage": "A lappal kapcsolatos megbeszélés",
+       "talkpagelinktext": "vitalap",
+       "specialpage": "Speciális lap",
+       "personaltools": "Személyes eszközök",
+       "articlepage": "Szócikk megtekintése",
+       "talk": "Vitalap",
+       "views": "Nézetek",
+       "toolbox": "Eszközök",
+       "userpage": "Felhasználó lapjának megtekintése",
+       "projectpage": "Projektlap megtekintése",
+       "imagepage": "A fájl leírólapjának megtekintése",
+       "mediawikipage": "Üzenetlap megtekintése",
+       "templatepage": "Sablon lapjának megtekintése",
+       "viewhelppage": "Súgólap megtekintése",
+       "categorypage": "Kategórialap megtekintése",
+       "viewtalkpage": "Beszélgetés megtekintése",
+       "otherlanguages": "Más nyelveken",
+       "redirectedfrom": "($1 szócikkből átirányítva)",
+       "redirectpagesub": "Átirányító lap",
+       "lastmodifiedat": "A lap utolsó módosítása: $1, $2",
+       "viewcount": "Ezt a lapot {{PLURAL:$1|egy|$1}} alkalommal keresték fel.",
+       "protectedpage": "Védett lap",
+       "jumpto": "Ugrás:",
+       "jumptonavigation": "navigáció",
+       "jumptosearch": "keresés",
+       "view-pool-error": "Sajnos a szerverek jelen pillanatban túl vannak terhelve, mert\ntúl sok felhasználó próbálta megtekinteni ezt az oldalt.\nKérjük, várjon egy kicsit, mielőtt újrapróbálkozna a lap megtekintésével!\n\n$1",
+       "pool-timeout": "Letelt a zárolás feloldására szánt várakozási idő",
+       "pool-queuefull": "A pool sor megtelt",
+       "pool-errorunknown": "Ismeretlen hiba",
+       "aboutsite": "A {{SITENAME}} wikiről",
+       "aboutpage": "Project:Rólunk",
+       "copyright": "A tartalom további jelölés hiányában a(z) $1 feltételei szerint használható fel.",
+       "copyrightpage": "{{ns:project}}:Szerzői jogok",
+       "currentevents": "Aktuális események",
+       "currentevents-url": "Project:Friss események",
+       "disclaimers": "Jogi nyilatkozat",
+       "disclaimerpage": "Project:Jogi nyilatkozat",
+       "edithelp": "Szerkesztési segítség",
+       "mainpage": "Kezdőlap",
+       "mainpage-description": "Kezdőlap",
+       "policy-url": "Project:Irányelvek",
+       "portal": "Közösségi portál",
+       "portal-url": "Project:Közösségi portál",
+       "privacy": "Adatvédelmi irányelvek",
+       "privacypage": "Project:Adatvédelmi irányelvek",
+       "badaccess": "Engedélyezési hiba",
+       "badaccess-group0": "Ezt a tevékenységet Ön nem végezheti el.",
+       "badaccess-groups": "Ezt a tevékenységet csak a(z) $1 {{PLURAL:$2|csoportba|csoportok valamelyikébe}} tartozó felhasználó végezheti el.",
+       "versionrequired": "A MediaWiki $1 verziója szükséges",
+       "versionrequiredtext": "A lap használatához a MediaWiki $1-s verziójára van szükség.\nTovábbi információkat a [[Special:Version|verzióinformációs lapon]] találhat.",
+       "ok": "OK",
+       "retrievedfrom": "A lap eredeti címe: „$1”",
+       "youhavenewmessages": "Új üzenet várja $1! (Az üzenetet $2.)",
+       "youhavenewmessagesmulti": "Új üzenetet várja a(z) $1 wikin",
+       "editsection": "szerkesztés",
+       "editold": "szerkesztés",
+       "viewsourceold": "lapforrás",
+       "editlink": "szerkesztés",
+       "viewsourcelink": "forráskód megtekintése",
+       "editsectionhint": "Szakasz szerkesztése: $1",
+       "toc": "Tartalomjegyzék",
+       "showtoc": "megjelenítés",
+       "hidetoc": "elrejtés",
+       "collapsible-collapse": "becsuk",
+       "collapsible-expand": "kinyit",
+       "nstab-main": "Lap",
+       "nosuchactiontext": "Az URL-ben megadott műveletet érvénytelen.\nValószínűleg elgépelte, hibás hivatkozásra kattintott, vagy a\na(z) {{SITENAME}} által használt szoftver hibája is lehet.",
+       "nospecialpagetext": "<strong>Érvénytelen speciális lapot akart megtekinteni.</strong>\n\nAz érvényes speciális lapok listáját a [[Special:SpecialPages|Speciális lapok]] oldalon találja meg.",
+       "enterlockreason": "Adja meg a lezárás okát, valamint egy becslést, hogy mikor kerül a lezárás feloldásra",
+       "exception-nologin-text": "Ezen lap vagy művelet eléréséhez, kérjük, [[Special:Userlogin|jelentkezzen be]].",
+       "login-security": "Személyazonosságának igazolása",
+       "userlogin-reauth": "Újra be kell jelentkeznie, hogy igazolja, ön $1.",
+       "createacct-loginerror": "A fiók sikeresen létrejött, de nem tudott automatikusan bejelentkezni. Kérjük, [[Special:UserLogin|jelentkezzen be manuálisan]]!",
+       "nosuchuser": "Nem létezik „$1” nevű szerkesztő.\nEllenőrizze, hogy helyesen írta-e be, vagy [[Special:CreateAccount|hozzon létre egy új fiókot]].",
+       "changeemail-newemail-help": "Ha el akarja távolítani az e-mail-címét, ezt a mezőt üresen kell hagynia. Ha eltávolítja az e-mail-címét, nem fogja tudni visszaállítani a jelszavát, és nem fog tudni e-maileket fogadni erről a wikiről.",
+       "changeemail-nochange": "Kérjük, adjon meg egy másik új e-mail-címet.",
+       "noarticletext": "Ez a lap jelenleg nem tartalmaz szöveget.\n[[Special:Search/{{PAGENAME}}|Rákereshet erre a címszóra]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} megtekintheti a kapcsolódó naplókat],\nvagy [{{fullurl:{{FULLPAGENAME}}|action=edit}} létrehozhatja a lapot].</span>",
+       "recentchangeslinked-toolbox": "Kapcsolódó változtatások",
+       "upload-form-label-not-own-work-local-generic-local": "Az [[Special:Upload|alapértelmezett feltöltőoldalt]] is kipróbálhatja.",
+       "filehist": "Fájl történet",
+       "newpages": "Új lapok",
+       "changecontentmodel-submit": "Módosít",
+       "specialpages": "Speciális lapok",
+       "sessionprovider-nocookies": "A sütik le lehetnek tiltva. Engedélyezze a sütiket, és próbálja meg újra!"
+}
index 2586a71..bf2a048 100644 (file)
@@ -45,7 +45,9 @@
                        "Bencoke",
                        "Máté",
                        "Wolf Rex",
-                       "BanKris"
+                       "BanKris",
+                       "Notramo",
+                       "Urbalazs"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
        "navigation-heading": "Navigációs menü",
        "errorpagetitle": "Hiba",
        "returnto": "Vissza a(z) $1 laphoz.",
-       "tagline": "A {{SITENAME}} wikiből",
+       "tagline": "Innen: {{SITENAME}}",
        "help": "Segítség",
        "search": "Keresés",
        "search-ignored-headings": " #<!-- ezen a soron ne változtass --> <pre>\n# Az itt megadott szakaszokat figyelmen kívül hagyja a kereső.\n# Ha megváltoztatod ezt a listát, csak a változtatás után indexelt lapokra lesz hatása.\n# Ha újra akarsz indexelni egy adott oldalt, egy üres szerkesztéssel (megnyit-elment) megteheted.\n# Szintaxis:\n#   * A # jeltől a sor végéig tartó rész megjegyzés, a szoftver figyelmen kívül hagyja\n#   * Minden nem üres sor egy olyan szakasz címe, amit nem akarjuk, hogy indexeljen a kereső. (Csak a pontos egyezés számít, kisbetű/nagybetűt is beleértve.)\nForrások\nJegyzetek\nHivatkozások\nKülső hivatkozások\nLásd még\n #</pre> <!-- ezen a soron ne változtass -->",
        "login": "Bejelentkezés",
        "login-security": "Személyazonosságod igazolása",
        "nav-login-createaccount": "Bejelentkezés / fiók létrehozása",
-       "userlogin": "Bejelentkezés / fiók létrehozása",
-       "userloginnocreate": "Bejelentkezés",
        "logout": "Kijelentkezés",
        "userlogout": "Kijelentkezés",
        "notloggedin": "Nem vagy bejelentkezve",
        "userlogin-noaccount": "Nem rendelkezel még felhasználói fiókkal?",
        "userlogin-joinproject": "Csatlakozz a(z) {{SITENAME}} wikihez",
-       "nologin": "Nem rendelkezel még felhasználói fiókkal? $1.",
-       "nologinlink": "Itt regisztrálhatsz",
        "createaccount": "Regisztráció",
-       "gotaccount": "Már van fiókod? $1.",
-       "gotaccountlink": "Bejelentkezés",
-       "userlogin-resetlink": "Elfelejtetted a bejelentkezési adataidat?",
        "userlogin-resetpassword-link": "Elfelejtetted a jelszavad?",
        "userlogin-helplink2": "Segítség a bejelentkezéshez",
        "userlogin-loggedin": "Már be vagy jelentkezve mint {{GENDER:$1|$1}}. Ha más néven akarsz belépni, alább megteheted.",
        "createaccountmail": "Átmeneti, véletlenszerű jelszó beállítása és kiküldése a megadott e-mail címre",
        "createaccountmail-help": "A jelszó megismerése nélkül készíthető valaki másnak fiók.",
        "createacct-realname": "Igazi neved (nem kötelező)",
-       "createaccountreason": "Indoklás:",
        "createacct-reason": "Indoklás",
        "createacct-reason-ph": "Miért hozol létre egy másik fiókot",
        "createacct-reason-help": "A fióklétrehozási naplóban megjelenő üzenet",
        "botpasswords-insert-failed": "A(z) „$1” botnév hozzáadása sikertelen. Nem lehet, hogy már hozzá lett adva?",
        "botpasswords-update-failed": "A(z) „$1” nevű botfiók frissítése sikertelen. Lehet, hogy törölted?",
        "botpasswords-created-title": "Botjelszó létrehozva",
-       "botpasswords-created-body": "\"$2\" felhasználó \"$1\" bot jelszava létrehozva.",
+       "botpasswords-created-body": "„$2” felhasználó „$1” botjának jelszava létrehozva.",
        "botpasswords-updated-title": "Botjelszó frissítve",
-       "botpasswords-updated-body": "\"$2\" felhasználó \"$1\" bot jelszava módosítva.",
+       "botpasswords-updated-body": "„$2” felhasználó „$1” botjának jelszava módosítva.",
        "botpasswords-deleted-title": "Botjelszó törölve",
-       "botpasswords-deleted-body": "\"$2\" felhasználó \"$1\" bot jelszava törölve.",
+       "botpasswords-deleted-body": "„$2” felhasználó „$1” botjának jelszava törölve.",
        "botpasswords-newpassword": "A bejelentkezéshez használható új felhasználóneved <strong>$1</strong>, jelszavad <strong>$2</strong>. <em>Ezeket jegyezd fel a későbbiekre.</em> <br> (Régebbi botoknál, amik megkövetelhetik, hogy a bejelentkezési név megegyezzen magával a felhasználónévvel, használhatod a(z) <strong>$3</strong> felhasználónevet is <strong>$4</strong> jelszóval.)",
        "botpasswords-no-provider": "A BotPasswordsSessionProvider nem áll rendelkezésre.",
        "botpasswords-restriction-failed": "A botjelszó-korlátozások megakadályozzák ezt a bejelentkezést.",
        "preview": "Előnézet",
        "showpreview": "Előnézet megtekintése",
        "showdiff": "Változtatások megtekintése",
-       "blankarticle": "<strong>Figyelem:</strong> A létrehozandó szócikk üres.\nHa ismét a \"{{int:savearticle}}\" gombra kattintasz, a szócikket tartalom nélkül fogod létrehozni.",
+       "blankarticle": "<strong>Figyelem:</strong> A létrehozandó szócikk üres.\nHa ismét a \"$1\" gombra kattintasz, a szócikket tartalom nélkül fogod létrehozni.",
        "anoneditwarning": "<strong>Figyelem:</strong> Nem vagy bejelentkezve. Ha szerkesztesz, az IP-címed nyilvánosan látható lesz a laptörténetben. Ha <strong>[$1 bejelentkezel]</strong> vagy <strong>[$2 regisztrálsz]</strong>, a szerkesztéseid a felhasználónevedhez lesznek társítva, egyéb hasznos dolgok mellett.",
        "anonpreviewwarning": "''Nem vagy bejelentkezve. A mentéskor az IP-címed rögzítve lesz a laptörténetben.''",
        "missingsummary": "'''Emlékeztető:''' Nem adtál meg szerkesztési összefoglalót. Ha összefoglaló nélkül akarod elküldeni a szöveget, kattints újra a mentésre.",
-       "selfredirect": "<strong>Figyelem:</strong> Az lapot önmagára készült átirányítani. Lehet, hogy rossz célt adtál meg, vagy rossz oldalt szerkesztesz. Ha ismét a {{int:savearticle}} gombra kattintasz, akkor az átirányítás mégis létrejön.",
+       "selfredirect": "<strong>Figyelem:</strong> Az lapot önmagára készült átirányítani. Lehet, hogy rossz célt adtál meg, vagy rossz oldalt szerkesztesz. Ha ismét a $1 gombra kattintasz, akkor az átirányítás mégis létrejön.",
        "missingcommenttext": "Kérjük, írj összefoglalót a szerkesztésedhez.",
-       "missingcommentheader": "<strong>Emlékeztető:</strong> Nem adtad meg a megjegyzés tárgyát.\nHa ismét a „{{int:savearticle}}” gombra kattintasz, akkor a szerkesztésed nélküle lesz elmentve.",
+       "missingcommentheader": "<strong>Emlékeztető:</strong> Nem adtad meg a megjegyzés tárgyát.\nHa ismét a „$1” gombra kattintasz, akkor a szerkesztésed nélküle lesz elmentve.",
        "summary-preview": "A szerkesztési összefoglaló előnézete:",
        "subject-preview": "Tárgy előnézete:",
-       "previewerrortext": "Hiba történt a változások előnézete megjelenítése során.",
+       "previewerrortext": "Hiba történt a változások előnézetének megjelenítése során.",
        "blockedtitle": "A szerkesztő blokkolva van",
        "blockedtext": "<strong>A szerkesztőnevedet vagy az IP-címedet blokkoltuk.</strong>\n\nA blokkolást $1 végezte el.\nAz általa felhozott indok: <em>$2.</em>\n\n* A blokk kezdete: $8\n* A blokk lejárata: $6\n* Blokkolt szerkesztő: $7\n\nKapcsolatba léphetsz $1 szerkesztőnkkel vagy egy másik [[{{MediaWiki:Grouppage-sysop}}|adminisztrátorral]], és megbeszélheted vele a blokkolást.\nAz „E-mail küldése ennek a szerkesztőnek” funkciót csak akkor használhatod, ha érvényes e-mail címet adtál meg [[Special:Preferences|fiókbeállításaidban]], és nem blokkolták a használatát.\nJelenlegi IP-címed: $3, a blokkolás azonosítószáma: #$5.\nKérjük, hogy érdeklődés esetén minden fenti részletet adj meg.",
        "autoblockedtext": "Az IP-címed automatikusan blokkolva lett, mert korábban egy olyan szerkesztő használta, akit $1 blokkolt, az alábbi indoklással:\n\n:''$2''\n\n*A blokk kezdete: '''$8'''\n*A blokk lejárata: '''$6'''\n*Blokkolt szerkesztő: '''$7'''\n\nKapcsolatba léphetsz $1 szerkesztőnkkel, vagy egy másik [[{{MediaWiki:Grouppage-sysop}}|adminisztrátorral]], és megbeszélheted vele a blokkolást.\n\nAz 'E-mail küldése ennek a szerkesztőnek' funkciót csak akkor használhatod, ha érvényes e-mail címet adtál meg\n[[Special:Preferences|fiókbeállításaidban]], és nem blokkolták a használatát.\n\nJelenlegi IP-címed: $3, a blokkolás azonosítószáma: #$5.\nKérjük, hogy érdeklődés esetén mindkettőt add meg.",
        "editingsection": "$1 szerkesztése (szakasz)",
        "editingcomment": "$1 szerkesztése (új szakasz)",
        "editconflict": "Szerkesztési ütközés: $1",
-       "explainconflict": "Valaki megváltoztatta a lapot, mióta elkezdted szerkeszteni. A felső szövegdobozban láthatod az oldal jelenlegi tartalmát. A te módosításaid az alsó dobozban találhatók. Át kell másolnod a módosításaidat a felsőbe! \n\n<strong>Csak</strong> a felső dobozban levő szöveg lesz elmentve, amikor a „{{int:savearticle}}” gombra kattintasz.",
+       "explainconflict": "Valaki megváltoztatta a lapot, mióta elkezdted szerkeszteni. A felső szövegdobozban láthatod az oldal jelenlegi tartalmát. A te módosításaid az alsó dobozban találhatók. Át kell másolnod a módosításaidat a felsőbe! \n\n<strong>Csak</strong> a felső dobozban levő szöveg lesz elmentve, amikor a „$1” gombra kattintasz.",
        "yourtext": "A te változatod",
        "storedversion": "A tárolt változat",
        "nonunicodebrowser": "'''Figyelem: A böngésződ nem Unicode kompatibilis. Egy kerülő megoldásként biztonságban szerkesztheted a cikkeket: a nem ASCII karakterek a szerkesztőablakban hexadeciális kódokként jelennek meg.'''",
        "readonlywarning": "<strong>FIGYELMEZTETÉS: A wiki adatbázisát karbantartás miatt zárolták, ezért most nem fogod tudni elmenteni a szerkesztéseidet!</strong>\nA lap szövegét másold egy szövegfájlba, amit később felhasználhatsz!\n\nAz adatbázist lezáró rendszeradminisztrátor az alábbi magyarázatot adta: $1",
        "protectedpagewarning": "<strong>Figyelem: Ez a lap védett, így csak adminisztrátori jogosultságokkal rendelkező szerkesztők módosíthatják.</strong>\nA legutolsó ide vonatkozó naplóbejegyzés alább látható:",
        "semiprotectedpagewarning": "'''Megjegyzés:''' ez a lap védett, így regisztrálatlan vagy újonnan regisztrált szerkesztők nem módosíthatják.",
-       "cascadeprotectedwarning": "<strong>Figyelem:</strong> ez a lap le van zárva, csak adminisztrátorok szerkeszthetik, mert a következő kaszkádvédelemmel ellátott {{PLURAL:$1|lapon|lapokon}} be van illesztve:",
+       "cascadeprotectedwarning": "<strong>Figyelem:</strong> ez a lap le van zárva, csak [[Special:ListGroupRights|megfelelő jogosultságú]] felhasználók szerkeszthetik, mert a következő kaszkádvédelemmel ellátott {{PLURAL:$1|lapon|lapokon}} be van illesztve:",
        "titleprotectedwarning": "'''Figyelem: Ez a lap le van védve, így csak a [[Special:ListGroupRights|megfelelő jogosultságokkal]] rendelkező szerkesztők hozhatják létre.'''\nA legutolsó ide vonatkozó naplóbejegyzés alább látható:",
        "templatesused": "A lapon használt {{PLURAL:$1|sablon|sablonok}}:",
        "templatesusedpreview": "Az előnézet megjelenítésekor használt {{PLURAL:$1|sablon|sablonok}}:",
        "content-failed-to-parse": "Hiba történt a $2 tartalom $1 modellre történő konvertálása során: $3",
        "invalid-content-data": "Érvénytelen tartalom adat",
        "content-not-allowed-here": "\"$1\" tartalom nem engedélyezett a [[$2]] oldalon",
-       "editwarning-warning": "A lap elhagyásával az összes itt végzett változtatás elveszhet.\nHa be vagy jelentkezve letilthatod ezt a figyelmeztetést a beállításaid „{{int:prefs-editing}}” szakaszában.",
+       "editwarning-warning": "A lap elhagyásával az összes itt végzett változtatás elveszhet. Ha be vagy jelentkezve, letilthatod ezt a figyelmeztetést a beállításaid „{{int:prefs-editing}}” szakaszában.",
        "editpage-invalidcontentmodel-title": "A tartalommodell nem támogatott",
        "editpage-invalidcontentmodel-text": "A(z) „$1” tartalommodell nem támogatott.",
        "editpage-notsupportedcontentformat-title": "Nem támogatott tartalom formátum",
        "post-expand-template-argument-warning": "Figyelem: Ez a lap legalább egy olyan sablonparamétert tartalmaz, amely kibontva túl nagy, így el lett(ek) hagyva.",
        "post-expand-template-argument-category": "Elhagyott sablonparaméterekkel rendelkező lapok",
        "parser-template-loop-warning": "Végtelen ciklus a következő sablonban: [[$1]]",
+       "template-loop-category": "Lapok végtelen sablonciklusokkal",
+       "template-loop-category-desc": "A lap végtelen sablonciklust tartalmaz, vagyis egy sablon önmagát hívja meg rekurzívan.",
        "parser-template-recursion-depth-warning": "A sablon rekurzív beillesztésének mélysége átlépte a határértéket ($1)",
        "language-converter-depth-warning": "A nyelvátalakító rekurzióinak száma túllépve ($1)",
        "node-count-exceeded-category": "Túl sok csomópontot tartalmazó lapok",
        "search-interwiki-caption": "Társlapok",
        "search-interwiki-default": "$1 találatok:",
        "search-interwiki-more": "(több)",
+       "search-interwiki-more-results": "további eredmények",
        "search-relatedarticle": "Kapcsolódó",
        "searchrelated": "kapcsolódó",
        "searchall": "mind",
        "search-external": "Külső kereső",
        "searchdisabled": "Elnézésed kérjük, de a teljes szöveges keresés terhelési okok miatt átmenetileg nem használható. Ezidő alatt használhatod a lenti Google keresést, mely viszont lehetséges, hogy nem teljesen friss adatokkal dolgozik.",
        "search-error": "A keresés közben hiba történt: $1",
+       "search-warning": "$1 keresése közben hiba történt",
        "preferences": "Beállítások",
        "mypreferences": "Beállítások",
        "prefs-edits": "Szerkesztéseid száma:",
        "prefs-help-prefershttps": "A beállítás a legközelebbi belépés után lép érvénybe.",
        "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": "Szerkesztői jogok",
        "userrights-lookup-user": "Válasszon ki egy felhasználót",
        "userrights-user-editname": "Add meg a szerkesztő nevét:",
        "editusergroup": "Szerkesztőcsoportok betöltése",
        "editinguser": "<strong>[[User:$1|$1]]</strong> felhasználó jogainak megváltoztatása $2",
        "viewinguserrights": "<strong>[[User:$1|$1]]</strong> felhasználói csoportjainak megtekintése $2",
        "userrights-editusergroup": "Szerkesztőcsoportok módosítása",
-       "userrights-viewusergroup": "Felhasználói csoportok megtekintése",
+       "userrights-viewusergroup": "{{GENDER:$1|Felhasználói}} csoportok megtekintése",
        "saveusergroups": "{{GENDER:$1|Szerkesztőcsoportok}} mentése",
        "userrights-groupsmember": "Csoporttag:",
        "userrights-groupsmember-auto": "Alapértelmezetten tagja:",
-       "userrights-groups-help": "Beállíthatod, hogy a szerkesztő mely csoportokba tartozik.\n* A bepipált doboz azt jelenti, hogy a szerkesztő benne van a csoportban, az üres azt, hogy nem.\n* A * az olyan csoportokat jelöli, amelyeket ha egyszer hozzáadtál, nem távolíthatod el, vagy nem adhatod hozzá.",
+       "userrights-groups-help": "Beállíthatod, hogy a szerkesztő mely csoportokba tartozik.\n* A bepipált doboz azt jelenti, hogy a szerkesztő benne van a csoportban\n* Az üres azt, hogy nincs.\n* A * az olyan csoportokat jelöli, amelyeket ha egyszer hozzáadtál, nem távolíthatod el, vagy nem adhatod hozzá.\n* A # azt jelöli, hogy a csoporttagság lejárati idejét csak csökkenteni tudod, növelni nem.",
        "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-expiry-options": "1 nap:1 day,1 hét:1 week,1 hónap:1 month,3 hónap:3 months,6 hónap:6 months,1 év:1 year",
        "userrights-invalid-expiry": "A(z) „$1” csoport lejárati ideje érvénytelen.",
        "userrights-expiry-in-past": "A(z) „$1” csoport lejárati ideje már elmúlt.",
+       "userrights-cannot-shorten-expiry": "Nem hosszabbíthatod meg a(z) „$1” csoporthoz tartozást. Csak az ezen csoport hozzáadására és eltávolítására jogosult felhasználók rakhatják későbbre a lejáratot.",
        "userrights-conflict": "Felhasználói jogok ütközése! Kérlek, végezd el újra a változtatásokat.",
        "group": "Csoport:",
        "group-user": "szerkesztők",
        "right-editsemiprotected": "„{{int:protect-level-autoconfirmed}}” védelmi szintű lapok szerkesztése",
        "right-editcontentmodel": "A lap tartalom modelljének szerkesztése",
        "right-editinterface": "felhasználói felület szerkesztése",
-       "right-editusercssjs": "más felhasználók CSS és JS fájljainak szerkesztése",
        "right-editusercss": "más felhasználók CSS fájljainak szerkesztése",
        "right-edituserjs": "más felhasználók JS fájljainak szerkesztése",
        "right-editmyusercss": "Saját szerkesztői CSS-fájlok szerkesztése",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lásd még: [[Special:NewPages|új lapok listája]])",
        "recentchanges-submit": "Megjelenítés",
        "rcfilters-activefilters": "Aktív szűrők",
+       "rcfilters-quickfilters": "Gyors hivatkozások",
+       "rcfilters-savedqueries-defaultlabel": "Mentett szűrők",
+       "rcfilters-savedqueries-rename": "Átnevezés",
+       "rcfilters-savedqueries-setdefault": "Beállítás alapértelmezettként",
+       "rcfilters-savedqueries-remove": "Eltávolítás",
+       "rcfilters-savedqueries-new-name-label": "Név",
+       "rcfilters-savedqueries-apply-label": "Gyors hivatkozás létrehozása",
+       "rcfilters-savedqueries-cancel-label": "Mégse",
+       "rcfilters-savedqueries-add-new-title": "Szűrők mentése gyors hivatkozásként",
        "rcfilters-restore-default-filters": "Alapértelmezett szűrők visszaállítása",
        "rcfilters-clear-all-filters": "Összes szűrő kikapcsolása",
        "rcfilters-search-placeholder": "Friss változtatások szűrése (böngészd vagy kezdj el gépelni)",
        "rcfilters-invalid-filter": "Érvénytelen szűrő",
        "rcfilters-empty-filter": "Nincs aktív szűrő. Minden közreműködés látható.",
        "rcfilters-filterlist-title": "Szűrők",
+       "rcfilters-filterlist-whatsthis": "Mi ez?",
+       "rcfilters-filterlist-feedbacklink": "Visszajelzés küldése az új (beta) szűrőkről",
+       "rcfilters-highlightbutton-title": "Kiemelt találatok",
+       "rcfilters-highlightmenu-title": "Válassz egy színt",
+       "rcfilters-highlightmenu-help": "Válassz színt ennek a tulajdonságnak kijelöléséhez",
        "rcfilters-filterlist-noresults": "Nem található szűrő",
+       "rcfilters-noresults-conflict": "Nincs találat, mert a keresési kritériumok konfliktusban vannak",
+       "rcfilters-state-message-subset": "Ennek a szűrőnek nincs hatása, mert az eredményét {{PLURAL:$2|tartalmazza a következő, nagyobb szűrő|tartalmazzák a következő, nagyobb szűrők}} (próbáld meg kiemelni a megkülönböztetéshez): $1",
+       "rcfilters-state-message-fullcoverage": "Az összes szűrő kijelölése egy csoportban ugyanaz, mint ha semmit nem választanál ki, így ennek a szűrőnek nincs hatása. A csoport tartalmazza: $1",
+       "rcfilters-filtergroup-registration": "Regisztráció",
        "rcfilters-filter-registered-label": "Regisztrált",
        "rcfilters-filter-registered-description": "Bejelentkezett szerkesztők.",
        "rcfilters-filter-unregistered-label": "Nem regisztrált",
        "rcfilters-filter-unregistered-description": "Nem bejelentkezett szerkesztők.",
-       "rcfilters-filtergroup-authorship": "Szerkesztő",
-       "rcfilters-filter-editsbyself-label": "Saját szerkesztéseid",
-       "rcfilters-filter-editsbyself-description": "Saját szerkesztések",
-       "rcfilters-filter-editsbyother-label": "Mások szerkesztései",
-       "rcfilters-filter-editsbyother-description": "Más felhasználók által végzett szerkesztések (nem sajátok)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Újoncok",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Kevesebb mint 10 szerkesztés és 4 nap aktivitás.",
-       "rcfilters-filter-userExpLevel-learner-label": "Tanulók",
-       "rcfilters-filter-userExpLevel-learner-description": "Több aktív nap és szerkesztés, mint az „újoncok”, de kevesebb, mint a „tapasztalt szerkesztők”.",
-       "rcfilters-filter-userExpLevel-experienced-label": "Tapasztalt szerkesztők",
-       "rcfilters-filter-userExpLevel-experienced-description": "Több mint 30 nap aktivitás és 500 szerkesztés.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ez a szűrő ütközik a következő tapasztalati {{PLURAL:$2|szűrővel, ami|szűrőkkel, amik}} csak regisztrált felhasználókat {{PLURAL:$2|talál|találnak}} meg: $1",
+       "rcfilters-filtergroup-authorship": "Hozzájárulás szerzője",
+       "rcfilters-filter-editsbyself-label": "Saját változtatásaid",
+       "rcfilters-filter-editsbyself-description": "A te hozzájárulásaid.",
+       "rcfilters-filter-editsbyother-label": "Mások módosításai",
+       "rcfilters-filter-editsbyother-description": "Minden változtatás a tieidet kivéve.",
+       "rcfilters-filtergroup-userExpLevel": "Tapasztalati szint (csak regisztrált felhasználók)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "A tapasztalat szűrő csak regisztrált felhasználókat keres, tehát ez a szűrő ellentétben van a \"Regisztrálatlan\" szűrővel.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "A \"Regisztrálatlan\" szűrő ellentétben van egy vagy több Tapasztalat szűrővel, ami csak regisztrált felhasználókat keres. A konfliktusban lévő szűrők meg vannak jelölve fent az Aktív Szűrők résznél.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Újoncok",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Kevesebb mint 10 szerkesztés és 4 nap aktivitás.",
+       "rcfilters-filter-user-experience-level-learner-label": "Tanulók",
+       "rcfilters-filter-user-experience-level-learner-description": "Több tapasztalat egy „újoncnál”, de kevesebb egy „tapasztalt szerkesztőnél”.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Tapasztalt szerkesztők",
+       "rcfilters-filter-user-experience-level-experienced-description": "Több mint 30 nap aktivitás és 500 szerkesztés.",
        "rcfilters-filtergroup-automated": "Automatikus szerkesztések",
        "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-filtergroup-reviewstatus": "Felülvizsgálati státusz",
+       "rcfilters-filter-patrolled-label": "Ellenőrzött",
+       "rcfilters-filter-patrolled-description": "Ellenőrzöttnek jelölt szerkesztések",
+       "rcfilters-filter-unpatrolled-label": "Ellenőrizetlen",
+       "rcfilters-filter-unpatrolled-description": "Ellenőrzöttnek nem jelölt szerkesztések",
+       "rcfilters-filtergroup-significance": "Fontosság",
        "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-filter-watchlist-watched-label": "Figyelőlistán",
        "rcfilters-filtergroup-changetype": "Változtatás típusa",
        "rcfilters-filter-pageedits-label": "Lapszerkesztések",
+       "rcfilters-filter-pageedits-description": "A wiki tartalom szerkesztése, beszélgetés, kategória leírások...",
        "rcfilters-filter-newpages-label": "Laplétrehozások",
        "rcfilters-filter-newpages-description": "Új oldalt létrehozó szerkesztések.",
        "rcfilters-filter-categorization-label": "Kategóriaváltoztatások",
+       "rcfilters-filter-categorization-description": "Bejegyzések arról lapok hozzáadásáról kategóriákhoz vagy eltávolításáról azokból.",
        "rcfilters-filter-logactions-label": "Naplózott műveletek",
        "rcfilters-filter-logactions-description": "Adminisztratív műveletek, fióklétrehozások, laptörlések, feltöltések…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Az „apró változtatás” szűrő ütközik egy vagy több „változtatás típusa” szűrővel, mert bizonyos változtatástípusok nem jelölhetők aprónak. Az ütköző szűrők meg vannak jelölve a fenti Aktív szűrők részen.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Bizonyos változtatástípusok nem jelölhetők „aprónak”, így ez a szűrő ütközik a következő „változtatás típusa” szűrőkkel: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ez a változtatástípus-szűrő ütközik az „apró változtatások” szűrővel. Bizonyos változtatástípusok nem jelölhetők aprónak.",
+       "rcfilters-filtergroup-lastRevision": "Legutóbbi változat",
+       "rcfilters-filter-lastrevision-label": "Legutóbbi változat",
+       "rcfilters-filter-lastrevision-description": "Egy lap legfrissebb változtatása",
+       "rcfilters-filter-previousrevision-label": "Régebbi változatok",
+       "rcfilters-filter-previousrevision-description": "Minden változtatás a legutóbbiak kivételével",
        "rcnotefrom": "Alább a <strong>$3 $4</strong> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).",
+       "rclistfromreset": "Dátumválasztás visszaállítása",
        "rclistfrom": "$3, $2 után történt változtatások megtekintése",
        "rcshowhideminor": "apró szerkesztések $1",
        "rcshowhideminor-show": "megjelenítése",
        "rcshowhidecategorization": "lapok kategorizálásának $1",
        "rcshowhidecategorization-show": "megjelenítése",
        "rcshowhidecategorization-hide": "elrejtése",
-       "rclinks": "Az elmúlt $2 nap utolsó $1 változtatása legyen látható<br />$3",
+       "rclinks": "Az elmúlt $2 nap utolsó $1 változtatása legyen látható",
        "diff": "eltér",
        "hist": "történet",
        "hide": "elrejtése",
        "file-deleted-duplicate": "Egy ehhez hasonló fájlt ([[:$1]]) korábban már töröltek. Ellenőrizd a fájl törlési naplóját, mielőtt újra feltöltenéd.",
        "file-deleted-duplicate-notitle": "Egy ugyanilyen fájlt korábban már töröltek, és címét eltávolították. Kérj meg valakit, aki meg tudja nézni a törölt fájlokat, hogy tekintse át a helyzetet, mielőtt újra feltöltenéd a fájlt.",
        "uploadwarning": "Feltöltési figyelmeztetés",
-       "uploadwarning-text": "Kérlek módosítsd a fájl leírását alább, majd próbáld újra.",
+       "uploadwarning-text": "Kérlek, módosítsd a fájl leírását alább, majd próbáld újra.",
        "savefile": "Fájl mentése",
        "uploaddisabled": "Feltöltések kikapcsolva",
        "copyuploaddisabled": "A feltöltés URL alapján le van tiltva.",
        "php-uploaddisabledtext": "A PHP-s fájlfeltöltés le van tiltva. Ellenőrizd a file_uploads beállítást.",
        "uploadscripted": "Ez a fájl olyan HTML- vagy parancsfájlkódot tartalmaz, melyet tévedésből egy webböngésző esetleg értelmezni próbálhatna.",
        "upload-scripted-pi-callback": "Nem tölthetsz fel olyan fájlt, ami XML-stíluslap feldolgozási utasításokat tartalmaz.",
+       "upload-scripted-dtd": "Nem lehet feltölteni olyan SVG fájlokat, amik nem szabványos DTD deklarációt tartalmaznak.",
        "uploaded-script-svg": "A feltöltött SVG fájlodban szkriptelemet találtunk: \"$1\".",
        "uploaded-hostile-svg": "Nem biztonságos CSS kódot találtunk a feltöltött SVG fájlod stíluselemei között.",
        "uploaded-event-handler-on-svg": "Az alábbi eseménykezelő-attribútum beállítása nem megengedett az SVG fájlokban: <code>$1=$2</code>.",
        "uploaded-animate-svg": "A feltöltött SVG fájlban \"animate\" taget találtam, ami az alábbi \"from\" attribútumával megváltoztathat egy href-et: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-setting-event-handler-svg": "Eseménykezelő attribútumok beállítása blokkolva van, <code>&lt;$1 $2=\"$3\"&gt;</code> található a feltöltendő SVG fájlban.",
        "uploaded-setting-href-svg": "A „set” címke használata „href” attribútum szülőelemhez adására blokkolva van.",
+       "uploaded-wrong-setting-svg": "A „set” címke használata távoli/adat-/szkriptcél hozzáadására blokkolva van. A feltöltött SVG fájlban a következő szerepel: <code>&lt;set to=\"$1\"&gt;</code>",
        "uploaded-setting-handler-svg": "Az SVG kódok, amelyek a \"handler\" attribútumot távolra/adatra/szkriptre állítják, le vannak tiltva. A feltöltött SVG fájlban a következőt találtam: <code>$1=\"$2\"</code>.",
        "uploaded-remote-url-svg": "Az SVG kódok, amelyek bármely stílus-attribútumot távoli URL-ra állítják, le vannak tiltva. A feltöltött SVG fájlban a következőt találtam: <code>$1=\"$2\"</code>.",
        "uploaded-image-filter-svg": "A feltöltött SVG fájl URL-t tartalmazó képfiltert tartalmaz: <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "apisandbox-sending-request": "API-kérés küldése…",
        "apisandbox-loading-results": "API-válaszok fogadása…",
        "apisandbox-results-error": "Hiba történt az API-lekérdezés válaszának betöltése közben: $1.",
+       "apisandbox-request-selectformat-label": "Kérésadatok megjelenítése a következő formátumban:",
+       "apisandbox-request-format-url-label": "URL-lekérdezés",
        "apisandbox-request-url-label": "Kérő URL:",
        "apisandbox-request-json-label": "JSON kérése:",
        "apisandbox-request-time": "Kérés hossza: $1 ms",
        "enotif_body_intro_moved": "$2 átmozgatta a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, lásd az aktuális verziót itt: $3.",
        "enotif_body_intro_restored": "$2 visszaállította a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, lásd az aktuális verziót itt: $3.",
        "enotif_body_intro_changed": "$2 megváltoztatta a(z) $1 {{SITENAME}}-oldalt $PAGEEDITDATE dátumon, az aktuális verziót lásd itt: $3.",
-       "enotif_lastvisited": "Lásd a $1 lapot az utolsó látogatásod óta történt változtatásokért.",
-       "enotif_lastdiff": "Lásd a $1 lapot ezen változtatás megtekintéséhez.",
+       "enotif_lastvisited": "Az utolsó látogatásod óta történt változtatásokért lásd: $1",
+       "enotif_lastdiff": "Ezen változtatás megtekintéséhez lásd: $1",
        "enotif_anon_editor": "$1 névtelen felhasználó",
        "enotif_body": "Kedves $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nA szerkesztési összefoglaló a következő volt: $PAGESUMMARY $PAGEMINOREDIT\n\nA szerkesztő elérhetősége:\ne-mail küldése: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAmíg nem keresed fel az oldalt bejelentkezve, addig nem érkeznek újabb értesítések az oldal változásaival kapcsolatban. A figyelőlistádon is beállíthatod, hogy újból kapj értesítéseket, az összes lap után.\n\nBaráti üdvözlettel: a(z) {{SITENAME}} értesítő rendszere\n\n--\nAz e-mail értesítéseid módosításához keresd fel a \n{{canonicalurl:{{#special:Preferences}}}} címet\n\nA figyelőlistád módosításához keresd fel a\n{{canonicalurl:{{#special:EditWatchlist}}}} címet\n\nA lap figyelőlistádról való törléséhez keresd fel a\n$UNWATCHURL címet\n\nVisszajelzés és további segítség:\n$HELPPAGE",
        "created": "létrehozta",
        "editcomment": "A szerkesztési összefoglaló <em>$1</em> volt.",
        "revertpage": "Visszaállítottam a lap korábbi változatát: [[Special:Contributions/$2|$2]]  ([[User talk:$2|vita]]) szerkesztéséről [[User:$1|$1]] szerkesztésére",
        "revertpage-nouser": "Visszaállítottam a lap korábbi változatát (szerkesztőnév eltávolítva) szerkesztéséről [[User:$1|$1]] szerkesztésére",
-       "rollback-success": "$1 szerkesztéseit visszaállítottam $2 utolsó változatára.",
+       "rollback-success": "{{GENDER:$3|$1}} szerkesztéseit visszaállítottam {{GENDER:$4|$2}} utolsó változatára.",
        "rollback-success-notify": "$1 szerkesztései visszaállítva;\nhelyreállítva $2 utolsó változata. [$3 Változtatások megtekintése]",
        "sessionfailure-title": "Munkamenethiba",
        "sessionfailure": "Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;\nez a művelet a munkamenet eltérítése miatti óvatosságból megszakadt.\nKérjük, hogy nyomd meg a „vissza” gombot, és töltsd le újra az oldalt, ahonnan jöttél, majd próbáld újra.",
        "undeleteviewlink": "megtekintés",
        "undeleteinvert": "Kijelölés megfordítása",
        "undeletecomment": "Ok:",
-       "undeletedrevisions": "$1 változat helyreállítva",
-       "undeletedrevisions-files": "{{PLURAL:$1|egy|$1}} változat és {{PLURAL:$2|egy|$2}} fájl visszaállítva",
-       "undeletedfiles": "{{PLURAL:$1|egy|$1}} fájl visszaállítva",
        "cannotundelete": "Egy vagy több visszaállítás sikertelen:\n$1",
        "undeletedpage": "'''$1 helyreállítva'''\n\nLásd a [[Special:Log/delete|törlési naplót]] a legutóbbi törlések és helyreállítások listájához.",
        "undelete-header": "A legutoljára törölt lapokat lásd a [[Special:Log/delete|törlési naplóban]].",
        "sp-contributions-uploads": "feltöltések",
        "sp-contributions-logs": "naplók",
        "sp-contributions-talk": "vitalap",
-       "sp-contributions-userrights": "szerkesztői jogok beállítása",
+       "sp-contributions-userrights": "{{GENDER:$1|felhasználói}} jogok beállítása",
        "sp-contributions-blocked-notice": "Ez a szerkesztő blokkolva van. A blokknapló legutóbbi ide vonatkozó bejegyzése a következő:",
        "sp-contributions-blocked-notice-anon": "Ez az IP-cím blokkolva van.\nA blokknapló legutóbbi ide vonatkozó bejegyzése a következő:",
        "sp-contributions-search": "Közreműködések szűrése",
        "unblocked-id": "$1 blokkolása feloldásra került",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] blokkolása feloldva",
        "blocklist": "Blokkolt felhasználók",
+       "autoblocklist": "Autoblokkok",
+       "autoblocklist-submit": "Keresés",
+       "autoblocklist-legend": "Autoblokkok listája",
+       "autoblocklist-localblocks": "Helyi {{PLURAL:$1|autoblokk|autoblokkok}}",
+       "autoblocklist-empty": "Az autoblokklista üres.",
+       "autoblocklist-otherblocks": "Egyéb {{PLURAL:$1|autoblokk|autoblokkok}}",
        "ipblocklist": "Blokkolt felhasználók",
        "ipblocklist-legend": "Blokkolt felhasználó keresése",
        "blocklist-userblocks": "Fiókblokkolások elrejtése",
        "tooltip-pt-watchlist": "Az általad figyelemmel kísért oldalak utolsó változtatásai",
        "tooltip-pt-mycontris": "A közreműködéseid listája",
        "tooltip-pt-anoncontribs": "Erről az IP-címről végrehajtott szerkesztések listája",
-       "tooltip-pt-login": "Bejelentkezni javasolt, de nem kötelező.",
+       "tooltip-pt-login": "Bejelentkezni javasolt, de nem kötelező",
+       "tooltip-pt-login-private": "Be kell jelentkezned a wiki használatához",
        "tooltip-pt-logout": "Kijelentkezés",
        "tooltip-pt-createaccount": "Arra bíztatunk, hogy hozz létre egy fiókot, és jelentkezz be, azonban ez nem kötelező",
        "tooltip-ca-talk": "Az oldal tartalmának megvitatása",
        "tooltip-ca-move": "A lap áthelyezése",
        "tooltip-ca-watch": "A lap hozzáadása a figyelőlistádhoz",
        "tooltip-ca-unwatch": "A lap eltávolítása a figyelőlistádról",
-       "tooltip-search": "Keresés a wikin",
+       "tooltip-search": "Keresés ezen: {{SITENAME}}",
        "tooltip-search-go": "Ugrás a megadott lapra, ha létezik",
        "tooltip-search-fulltext": "Oldalak keresése a megadott szöveg alapján",
-       "tooltip-p-logo": "Kezdőlap",
+       "tooltip-p-logo": "Kezdőlap megtekintése",
        "tooltip-n-mainpage": "A kezdőlap felkeresése",
        "tooltip-n-mainpage-description": "A kezdőlap megtekintése",
-       "tooltip-n-portal": "A közösségről, miben segíthetsz, mit hol találsz meg",
+       "tooltip-n-portal": "A projektről, miben segíthetsz, mit hol találsz meg",
        "tooltip-n-currentevents": "Háttérinformáció az aktuális eseményekről",
        "tooltip-n-recentchanges": "A wikiben történt legutóbbi változtatások listája",
        "tooltip-n-randompage": "Egy véletlenszerűen kiválasztott lap betöltése",
        "tooltip-t-contributions": "A {{GENDER:$1|felhasználó}} közreműködéseinek listája",
        "tooltip-t-emailuser": "Írj e-mailt ennek a {{GENDER:$1|felhasználónak}}",
        "tooltip-t-info": "További információk erről a lapról",
-       "tooltip-t-upload": "Képek vagy egyéb fájlok feltöltése",
+       "tooltip-t-upload": "Fájlok feltöltése",
        "tooltip-t-specialpages": "Az összes speciális lap listája",
        "tooltip-t-print": "A lap nyomtatható változata",
        "tooltip-t-permalink": "Állandó hivatkozás a lap ezen változatához",
        "anonymous": "Névtelen {{SITENAME}}-{{PLURAL:$1|szerkesztő|szerkesztők}}",
        "siteuser": "$1 {{SITENAME}}-felhasználó",
        "anonuser": "$1 névtelen {{SITENAME}}-felhasználó",
-       "lastmodifiedatby": "Ezt a lapot utoljára $3 módosította $2, $1 időpontban.",
+       "lastmodifiedatby": "Ezt a lapot utoljára $3 szerkesztette $2, $1 időpontban.",
        "othercontribs": "$1 munkája alapján.",
        "others": "mások",
        "siteusers": "$1 {{SITENAME}}-{{PLURAL:$2|szerkesztő|szerkesztők}}",
        "pageinfo-header-basic": "Alapinformációk",
        "pageinfo-header-edits": "Szerkesztések története",
        "pageinfo-header-restrictions": "Lapvédelem",
-       "pageinfo-header-properties": "Lap tulajdonságok",
+       "pageinfo-header-properties": "A lap tulajdonságai",
        "pageinfo-display-title": "Megjelenített cím",
        "pageinfo-default-sort": "Alapértelmezett rendezési kulcs",
-       "pageinfo-length": "Lap hossza (bájtokban)",
+       "pageinfo-length": "A lap hossza (byte-ban)",
        "pageinfo-article-id": "Lapazonosító",
        "pageinfo-language": "Laptartalom nyelve",
        "pageinfo-language-change": "módosítás",
-       "pageinfo-content-model": "Oldal tartalom modell",
+       "pageinfo-content-model": "Az oldal tartalommodellje",
        "pageinfo-content-model-change": "módosítás",
        "pageinfo-robot-policy": "Indexelés robottal",
        "pageinfo-robot-index": "Engedélyezett",
        "newimages-summary": "Ezen a speciális lapon láthatóak a legutóbb feltöltött fájlok.",
        "newimages-legend": "Fájlnév",
        "newimages-label": "Fájlnév (vagy annak részlete):",
+       "newimages-user": "IP-cím vagy felhasználónév",
        "newimages-showbots": "Botos feltöltések mutatása",
        "newimages-hidepatrolled": "Ellenőrzött szerkesztések elrejtése",
        "noimages": "Nem tekinthető meg semmi.",
        "confirmrecreate": "Miután elkezdted szerkeszteni, [[User:$1|$1]] ([[User talk:$1|vita]]) törölte ezt a lapot a következő indokkal:\n: <em>$2</em>\nKérlek erősítsd meg, hogy tényleg újra létre akarod-e hozni a lapot.",
        "confirmrecreate-noreason": "[[User:$1|$1]] ([[User talk:$1|vita]]) törölte ezt a lapot, miután elkezdted szerkeszteni. Erősítsd meg, hogy tényleg ismét létre szeretnéd hozni a lapot.",
        "recreate": "Újraírás",
+       "confirm-purge-title": "Gyorsítótár ürítése",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Törlöd az oldal gyorsítótárban (cache) található változatát?",
        "confirm-purge-bottom": "A lap ürítésével törlődik annak gyorsítótárazott változata, és a legújabb tartalom fog megjelenni.",
        "htmlform-user-not-valid": "<strong>$1</strong> nem egy érvényes felhasználónév.",
        "logentry-delete-delete": "$1 törölte a következő lapot: $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|törölte}} a(z) $3 átirányítást felülírással",
-       "logentry-delete-restore": "$1 helyreállította a következő lapot: $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|helyreállította}} a következő lapot: $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|helyreállította}} a következő lapot: $3",
+       "restore-count-revisions": "$1 lapváltozat",
+       "restore-count-files": "$1 fájl",
        "logentry-delete-event": "$1 megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát a(z) $3 című lapon: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|módosította}} a(z) $3 című lap {{PLURAL:$5|egy|$5}} lapváltozatának láthatóságát: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|módosította}} a(z) $3 című lap naplóbejegyzéseinek láthatóságát",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|frissítette}} a címkéket a(z) $3 lap $4 változatánál ({{PLURAL:$7|hozzáadva}}: $6; {{PLURAL:$9|eltávolítva}}: $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|frissítette}} a címkéket a(z) $3 lap $5 napló bejegyzésénél ({{PLURAL:$7|hozzáadta}}: $6; {{PLURAL:$9|eltávolította}}: $8)",
        "rightsnone": "(semmi)",
-       "revdelete-summary": "a szerkesztési összefoglalóját",
        "rightslogentry-temporary-group": "$1 (ideiglenesen, a következő időpontig: $2)",
        "feedback-adding": "Visszajelzés elmentése...",
        "feedback-back": "Vissza",
        "feedback-thanks": "Köszönjük. A visszajelzésed elküldve a „[$2 $1]” laphoz.",
        "feedback-thanks-title": "Köszönjük!",
        "feedback-useragent": "User agent:",
-       "searchsuggest-search": "Keresés a wikin",
+       "searchsuggest-search": "Keresés ezen: {{SITENAME}}",
        "searchsuggest-containing": "tartalmazza…",
        "api-error-badtoken": "Belső hiba: hibás token.",
        "api-error-emptypage": "Új, üres lap létrehozása nem engedélyezett.",
        "pagelang-nonexistent-page": "A(z) $1 lap nem létezik.",
        "pagelang-unchanged-language": "A(z) $1 lap már $2 nyelvű.",
        "pagelang-unchanged-language-default": "A(z) $1 lap már a wiki alapértelmezett tartalomnyelvére van állítva.",
+       "pagelang-db-failed": "Az adatbázis nem tudta megváltoztatni a lapnyelvet.",
        "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-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…",
+       "mw-widgets-usersmultiselect-placeholder": "Továbbiak hozzáadása…",
+       "date-range-from": "Dátumtól:",
+       "date-range-to": "Dátumig:",
        "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",
        "restrictionsfield-label": "Engedélyezett IP-tartományok:",
        "restrictionsfield-help": "Egy IP-cím vagy CIDR-tartomány soronként. Minden engedélyezéséhez használd a következő tartományokat:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
        "revid": "$1 változat",
-       "pageid": "$1 lapazonosító"
+       "pageid": "$1 lapazonosító",
+       "rawhtml-notallowed": "&lt;html&gt; címkék nem használhatók normál lapokon kívül.",
+       "gotointerwiki": "{{SITENAME}} elhagyása",
+       "gotointerwiki-invalid": "A megadott cím érvénytelen.",
+       "gotointerwiki-external": "A(z) {{SITENAME}} elhagyására és a(z) [[$2]] meglátogatására készülsz, ami egy másik webhelyen található.\n\n[$1 Kattints ide a(z) $1 oldalra való továbblépéshez.]",
+       "undelete-cantedit": "Nem állíthatod helyre ezt a lapot, mert nincs jogosultságod a szerkesztéséhez.",
+       "undelete-cantcreate": "Nem állíthatod helyre ezt a lapot, mert nem létezik ilyen című lap, és nincs jogosultságod létrehozni azt."
 }
index e5cbf84..9cbe59e 100644 (file)
@@ -28,7 +28,8 @@
                        "KeepingCalm",
                        "Macofe",
                        "Kareyac",
-                       "Irus"
+                       "Irus",
+                       "Narek"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
@@ -73,7 +74,7 @@
        "tog-showhiddencats": "Ցուցադրել թաքնված կատեգորիաները",
        "tog-norollbackdiff": "Չցուցադրել տարբերությունները հետ գլորելուց հետո",
        "tog-useeditwarning": "Զգուշացնել ինձ, երբ ես լքում եմ խմբագրման էջը առանց կատարած փոփոխությունները հիշելու։",
-       "tog-prefershttps": "Õ\84Õ«Õ·Õ¿ Ö\85Õ£Õ¿Õ¡Õ£Õ¸Ö\80Õ®Õ¥Ö\84 Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ´Õ«Õ¡Ö\81Õ¸Ö\82Õ´ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö\80Õ£Õ¸Ö\82Õ´ Õ¶Õ¥Ö\80Õ¯Õ¡ÕµÕ¡Ö\81Õ¶Õ¥Õ¬Õ¸Ö\82Ö\81 Õ°Õ¥Õ¿Õ¸",
+       "tog-prefershttps": "Õ\84Õ¸Ö\82Õ¿Ö\84 Õ£Õ¸Ö\80Õ®Õ¥Õ¬Õ¸Ö\82Ö\81 Õ°Õ¥Õ¿Õ¸, Õ´Õ«Õ·Õ¿ Õ£Õ¸Ö\80Õ®Õ¡Õ®Õ¥Õ¬ Õ¡Õ¶Õ¾Õ¶Õ¿Õ¡Õ¶Õ£ Õ´Õ«Õ¡Ö\81Õ¸Ö\82Õ´Õ«Ö\81 (HTTPS)",
        "underline-always": "Միշտ",
        "underline-never": "Երբեք",
        "underline-default": "Դիտարկչի կամ թեմայի լռելյայն ոճով",
        "newwindow": "(բացվում է նոր պատուհանում)",
        "cancel": "Չեղարկել",
        "moredotdotdot": "Ավելին...",
-       "morenotlisted": "Ô±ÕµÕ½ Ö\81Õ¸Ö\82Ö\81Õ¡Õ¯Õ¨ Õ¯Õ¡Ö\80Õ¸Õ² Õ§ Õ¬Õ«Õ¶Õ¥Õ¬ Õ©Õ¥Ö\80Õ«",
+       "morenotlisted": "Ô±ÕµÕ½ Ö\81Õ¡Õ¶Õ¯Õ¨ Õ¯Õ¡Ö\80Õ¸Õ² Õ§ Õ¸Õ¹ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ¬Õ«Õ¶Õ¥Õ¬Ö\89",
        "mypage": "Էջ",
        "mytalk": "Քննարկում",
        "anontalk": "Քննարկում",
        "searcharticle": "Անցնել",
        "history": "Էջի պատմություն",
        "history_short": "Պատմություն",
-       "updatedmarker": "թարմացվել է իմ վերջին այցից հետո",
+       "history_small": "պատմություն",
+       "updatedmarker": "փոփոխվել է ձեր վերջին այցից հետո",
        "printableversion": "Տպելու տարբերակ",
        "permalink": "Մշտական հղում",
        "print": "Տպել",
        "create-local": "Ավելացնել տեղային նկարագիր",
        "editthispage": "Խմբագրել այս էջը",
        "create-this-page": "Ստեղծել այս էջը",
-       "delete": "Õ\8bÕ¶Õ»ել",
+       "delete": "Õ\80Õ¥Õ¼Õ¡Ö\81Õ¶ել",
        "deletethispage": "Ջնջել այս էջը",
        "undeletethispage": "Վերականգնել այս էջը",
        "undelete_short": "Վերականգնել {{PLURAL:$1|մեկ խմբագրում|$1 խմբագրում}}",
        "views": "Դիտումները",
        "toolbox": "Գործիքներ",
        "tool-link-userrights": "Փոփոխել {{GENDER:$1|մասնակից}} խմբեր",
+       "tool-link-userrights-readonly": "Տեսնել {{GENDER:$1|մասնակից}} խումբը",
        "tool-link-emailuser": "Ուղարկել էլ այս նամակ {{GENDER:$1|մասնակցին}}",
        "userpage": "Դիտել մասնակցի էջը",
        "projectpage": "Դիտել նախագծի էջը",
        "filedeleteerror": "Չհաջողվեց ջնջել «$1» ֆայլը։",
        "directorycreateerror": "Չհաջողվեց ստեղծել «$1» պանակը։",
        "directoryreadonlyerror": "$1 թղթապանակը միայն ընթերցելու համար է:",
+       "directorynotreadableerror": "«$1» ցուցակն անընթեռնելի է։",
        "filenotfound": "Չհաջողվեց գտնել «$1» ֆայլը։",
        "unexpected": "Անսպասելի արժեք. «$1»=«$2»։",
        "formerror": "Սխալ. չհաջողվեց փոխանցել տվյալները",
        "badarticleerror": "Տվյալ գործողությունը չի կարող կատարվել այս էջում։",
        "cannotdelete": "Չհաջողվեց ջնջել «$1» էջը կամ ֆայլը։\nՀավանաբար այն արդեն ջնջվել է մեկ այլ մասնակցի կողմից։",
        "cannotdelete-title": "Հնարավոր չէ ջնջել $1 էջը",
-       "delete-hook-aborted": "Ô½Õ´Õ¢Õ¡Õ£Ö\80Õ¥Õ¬ Õ¹Õ¥Õ²ÕµÕ¡Õ¬ Õ§.\nÔ¼Ö\80Õ¡Ö\81Õ¸Ö\82Ö\81Õ«Õ¹ ÕºÕ¡Ö\80Õ¦Õ¡Õ¢Õ¡Õ¶Õ¸Ö\82Õ´Õ¶Õ¥Ö\80 Õ¹Õ« Õ¤Ö\80Õ¾Õ¥Õ¬.",
-       "no-null-revision": "Õ\89Õ« Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö\80 Õ¦Ö\80Õ¸ÕµÕ¡Õ¯Õ¡Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´ Õ§Õ»Õ« Õ°Õ¡Õ´Õ¡Ö\80 \"$1\"",
+       "delete-hook-aborted": "Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¸Ö\82Õ´Õ¨ (hookâ\80\93Õ« Õ´Õ«Õ»Õ¸Ö\81Õ¸Õ¾) Õ­Õ¸Õ¹Õ¨Õ¶Õ¤Õ¸Õ¿Õ¥Õ¬ Õ§ Õ»Õ¶Õ»Õ´Õ¡Õ¶Õ¨Ö\89\nÔ¼Ö\80Õ¡Ö\81Õ¸Ö\82Ö\81Õ«Õ¹ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¶Õ¥Ö\80 Õ¹Õ¥Õ¶ Õ¶Õ·Õ¾Õ¥Õ¬Ö\89",
+       "no-null-revision": "Õ\80Õ¶Õ¡Ö\80Õ¡Õ¾Õ¸Ö\80 Õ¹Õ§Ö\80 Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Â«$1» Õ§Õ»Õ« Õ¶Õ¸Ö\80 Õ¦Ö\80Õ¸ÕµÕ¡Õ¯Õ¡Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´",
        "badtitle": "Անընդունելի անվանում",
        "badtitletext": "Հարցված էջի անվանումը անընդունելի է, դատարկ է կամ սխալ միջ-լեզվական կամ ինտերվիքի անվանում է։ Հնարավոր է, որ այն պարունակում է անթույլատրելի սիմվոլներ։",
        "title-invalid-empty": "Էջի հայցվող վերնագիրը դատարկ է կամ պարունակում է միայն անվանատարածքի անունը։",
-       "title-invalid-utf8": "Õ\80Õ¡Ö\80Ö\81Õ¸Ö\82Õ´Õ¶ Õ½Õ¿Õ¡Ö\81Õ¡Õ® Õ¡Õ¶Õ¸Ö\82Õ¶Õ¨ Õ§Õ»Õ¨ ÕºÕ¡Ö\80Õ¸Ö\82Õ¶Õ¡Õ¯Õ¸Ö\82Õ´ Õ§ Õ¯Ö\80Õ¸Ö\82Õ´ Õ½Õ­Õ¡Õ¬ Õ°Õ¡Õ»Õ¸Ö\80Õ¤Õ¡Õ¯Õ¡Õ¶Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¨ Õ¶Õ«Õ· UTF-8.",
+       "title-invalid-utf8": "Õ\80Õ¡Ö\80Ö\81Õ¾Õ¸Õ² Õ§Õ»Õ« Õ¾Õ¥Ö\80Õ¶Õ¡Õ£Õ«Ö\80Õ¨ ÕºÕ¡Ö\80Õ¸Ö\82Õ¶Õ¡Õ¯Õ¸Ö\82Õ´ Õ§ Õ¡Õ¶Õ¾Õ¡Õ¾Õ¥Ö\80 UTF-8 Õ¶Õ·Õ¡Õ¶Õ¶Õ¥Ö\80Õ« Õ·Õ¡Ö\80Ö\84Ö\89",
        "perfcached": "Ստորև տվյալները պահուստավորված են և հնարավոր է չարտացոլեն վերջին փոփոխությունները։ Առավելագույն {{PLURAL:$1|արդյունք|$1 արդյունք}} է հասանելի քեշում։",
        "perfcachedts": "Հետևյալ տվյալները վերցված են քեշից և վերջին անգամ թարմացվել են $1։ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "Այս էջի փոփոխությունները ներկայումս արգելված են։ Այստեղի տվյալները այժմ չեն թարմացվի։",
        "createacct-yourpasswordagain-ph": "Կրկին մուտքագրեք գաղտնաբառը",
        "userlogin-remembermypassword": "Մուտք գործած մնալ",
        "userlogin-signwithsecure": "Օգտագործել անվտանգ միացում",
+       "cannotlogin-title": "Հնարավոր չէ մուտք գործել",
+       "cannotlogin-text": "Հնարավոր չէ մուտք գործել համակարգ։",
        "cannotloginnow-title": "Այժմ դուրս գալ անհնար է",
        "cannotloginnow-text": "$1 օգտագործելիս դուրս գալն անհնար է:",
        "cannotcreateaccount-title": "Անհնար է ստեղծել հաշիվներ",
        "login": "Մտնել համակարգ",
        "login-security": "Հաստատեք Ձեր ինքնությունը",
        "nav-login-createaccount": "Մտնել / Գրանցվել",
-       "userlogin": "Մտնել / Գրանցվել",
-       "userloginnocreate": "Մտնել",
        "logout": "Դուրս գալ համակարգից",
        "userlogout": "Ելնել համակարգից",
        "notloggedin": "Դուք չեք մտել համակարգ",
        "userlogin-noaccount": "Հաշիվ չունե՞ք։",
        "userlogin-joinproject": "Միացեք {{SITENAME}} նախագծին",
-       "nologin": "Չունե՞ք հաշիվ '''$1'''։",
-       "nologinlink": "Ստեղծել մասնակցային հաշիվ",
        "createaccount": "Ստեղծել նոր հաշիվ",
-       "gotaccount": "Դուք արդեն գրանցվա՞ծ եք։ '''$1'''։",
-       "gotaccountlink": "Մուտք գործեք համակարգ",
-       "userlogin-resetlink": "Մոռացե՞լ եք Ձեր հաշվի տվյալները։",
        "userlogin-resetpassword-link": "Մոռացե՞լ եք գաղտնաբառը",
        "userlogin-helplink2": "Մուտք գործելու օգնություն",
        "userlogin-loggedin": "Դուք արդեն մտել է որպես {{GENDER:$1|$1}}.\nՕգտագործեք ստորև բերված ձևը մուտք գործելու համար այլ հաշից",
        "createacct-another-email-ph": "Մուտքագրեք էլ․ փոստի հասցեն",
        "createaccountmail": "Օգտագործել ժամանակավոր պատահական գաղտնաբառ, որը կուղարկվի ձեր էլ–փոստի հասցեին։",
        "createacct-realname": "Իրական անուն (պարտադիր չէ)",
-       "createaccountreason": "Պատճառը՝",
        "createacct-reason": "Պատճառ",
        "createacct-reason-ph": "Ինչո՞ւ եք փորձում ստեղծել մեկ այլ հաշիվ",
        "createacct-submit": "Ստեղծել ձեր հաշիվը",
        "retypenew": "Հաստատեք նոր գաղտնաբառը.",
        "resetpass_submit": "Հաստատել գաղտնաբառը և մտնել համակարգ",
        "changepassword-success": "Ձեր գաղտնաբառը փոփոխվեց։",
-       "botpasswords": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80եր",
-       "botpasswords-disabled": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80Õ¥Ö\80Õ¶ անջատված են:",
-       "botpasswords-existing": "Ô³Õ¸ÕµÕ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ Õ¸Ö\82Õ¶Õ¥Ö\81Õ¸Õ² Õ¢Õ¸Õ¿Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80Õ¥Ö\80Õ¨",
-       "botpasswords-createnew": "Õ\8dÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö\80 Õ¢Õ¸Õ¿Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80",
-       "botpasswords-editexisting": "Խմբագրել առկա բոտային ծածկագիրը",
+       "botpasswords": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼եր",
+       "botpasswords-disabled": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö\80Õ¨ անջատված են:",
+       "botpasswords-existing": "Ô³Õ¸ÕµÕ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ Õ¸Ö\82Õ¶Õ¥Ö\81Õ¸Õ² Õ¢Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö\80",
+       "botpasswords-createnew": "Õ\8dÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö\80 Õ¢Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼",
+       "botpasswords-editexisting": "Փոխել եղած բոտի գաղտնաբառը",
        "botpasswords-label-appid": "Բոտի անուն՝",
        "botpasswords-label-create": "Ստեղծել",
        "botpasswords-label-update": "Թարմացնել",
        "botpasswords-label-cancel": "Չեղարկել",
        "botpasswords-label-delete": "Ջնջել",
-       "botpasswords-label-resetpassword": "Õ\8eÕ¥Ö\80Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80ը",
+       "botpasswords-label-resetpassword": "Õ\8eÕ¥Ö\80Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼ը",
        "botpasswords-label-grants-column": "Թույլատրված է",
        "botpasswords-bad-appid": "\"$1\" բոտի անունն անթույլատրելի է:",
        "botpasswords-created-title": "Բոտի ծածկագիրը ստեղծվել է",
        "botpasswords-created-body": "$2 մասնակցի $1 բոտի համար բոտի ծածկագիրը ստեղծվել է:",
-       "botpasswords-updated-title": "Ô²Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80ը թարմացվել է",
-       "botpasswords-updated-body": "$2 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« $1 Õ¢Õ¸Õ¿Õ« Õ°Õ¡Õ´Õ¡Ö\80 Õ¢Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80Õ¨ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§:",
-       "botpasswords-deleted-title": "Ô²Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80Õ¨ Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ§",
+       "botpasswords-updated-title": "Ô²Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼ը թարմացվել է",
+       "botpasswords-updated-body": "$2 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« $1 Õ¢Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Ö\83Õ¸Ö\83Õ¸Õ­Õ¾Õ¥Ö\81:",
+       "botpasswords-deleted-title": "Ô²Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ»Õ¶Õ»Õ¾Õ¥Ö\81",
        "botpasswords-deleted-body": "$2 մասնակցի $1 բոտի համար բոտի ծածկագիրը ջնջվել է:",
        "resetpass_forbidden": "Գաղտնաբառը չի կարող փոխվել",
        "resetpass-no-info": "Այս էջին ուղիղ դիմելու համար անհրաժեշտ է մտնել համակարգ։",
        "preview": "Նախադիտում",
        "showpreview": "Նախադիտել",
        "showdiff": "Կատարված փոփոխությունները",
-       "blankarticle": "<strong>Զգուշացում:</strong> Էջը, որը Դուք ստեղծում եք, դատարկ է:\nԵթե նորից սեղմեք «{{int:savearticle}}» կոճակը, էջը կստեղծվի առանց որևէ բովանդակության:",
+       "blankarticle": "<strong>Զգուշացում:</strong> Էջը, որը Դուք ստեղծում եք, դատարկ է:\nԵթե նորից սեղմեք «$1» կոճակը, էջը կստեղծվի առանց որևէ բովանդակության:",
        "anoneditwarning": "<strong>Ուշադրություն,</strong> Դուք չեք մտել համակարգ։ Ցանկացած խմբագրման դեպքում Ձեր IP հասցեն կդառնա բոլորին տեսանելի։ Եթե Դուք <strong>[$1 մուտք գործեք]</strong> կամ <strong>[$2 ստեղծեք մասնակցային հաշիվ]</strong>, Ձեր կատարած խմբագրումները կկապվեն Ձեր մասնակցային անվան հետ, ինչպես նաև կունենաք այլ առավելություններ։",
        "anonpreviewwarning": "<em>Դուք չեք մտել համակարգ։\nՀիշելով Ձեր կատարած խմբագրումը, այն կպահանվի Ձեր IP հասցեի հետ միասին այս էջի խմբագրումների պատմության մեջ։</em>",
        "missingsummary": "'''Հիշեցում.''' Դուք չեք տվել խմբագրման ամփոփում։ «Հիշել» կոճակի կրկնակի մատնահարման դեպքում փոփոխությունները կհիշվեն առանց ամփոփման։",
        "newarticle": "(Նոր)",
        "newarticletext": "Դուք հղվել եք դեռևս գոյություն չունեցող էջի։ \nՆոր էջ ստեղծելու համար ստորև գտնվող խմբագրման դաշտում ավելացրեք տեքստ, այնուհետև սեղմեք '''Հիշել էջը''' (այցելեք [$1 օգնության էջը]՝ մանրամասն տեղեկությունների համար)։ \n\nԵթե դուք սխալմամբ եք այստեղ հայտնվել, ապա սեղմեք ձեր դիտարկչի '''հետ''' (back) կոճակը։",
        "anontalkpagetext": "----\n''Այս քննարկման էջը պատկանում է անանուն մասնակցին, որը դեռ չի ստեղծել մասնակցային հաշիվ կամ չի մտել համակարգ մասնակցի անունով։''\nԱյդ իսկ պատճառով օգտագործվում է թվային IP-հասցեն։\nՆման IP-հասցեից կարող են օգտվել մի քանի մասնակիցներ։\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": "Ներկայումս այս էջում որևէ տեքստ չկա։\nԴուք կարող եք [[Special:Search/{{PAGENAME}}|որոնել այս անվանումը]] այլ էջերում, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} որոնել համապատասխան տեղեկամատյանները] կամ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ստեղծել նոր էջ այս անվանմամբ]</span>։",
        "noarticletext-nopermission": "Ներկայումս այս էջում որևէ տեքստ չկա։\nԴուք կարող եք [[Special:Search/{{PAGENAME}}|որոնել այս անվանունը]] այլ էջերում կամ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} որոնել այն տեղեկամատյաններում]</span>։ Դուք չունեք թույլտվություն ստեղծել այս էջը։",
        "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» անվանմամբ մասնակից գոյություն չունի։\nԽնդրում ենք հավաստիանալ նրանում, թե արդյոք ուզում եք ստեղծել/խմբագրել այս էջը։",
        "userpage-userdoesnotexist-view": "«$1» անվանմամբ գրանցված մասնակից չկա։",
        "session_fail_preview_html": "'''Ցավոք՝ չհաջողվեց հիշել ձեր խմբագրումները սեսիայի տվյալների կորստի պատճառով։'''\n\n''Քանի որ {{SITENAME}} նախագիծը թույլատրում է հում HTML, նախադիտումը անջատված է JavaScript-գրոհի կանխման նպատակով։''\n\n'''Եթե սա բարեխիղճ խմբագրման փորձ է, խնդրում ենք փորձել կրկին։ Սխալի կրկնման դեպքում՝ փորձեք [[Special:UserLogout|դուրս գալ]], ապա կրկին մտնել համակարգ։'''",
        "token_suffix_mismatch": "'''Ձեր խմբագրումը մերժվել է, քանի որ ձեր օգտագործած ծրագիրը աղավաղել է կետադրության նշանները խմբագրման դաշտում։ Խմբագրումը մերժվել է էջի տեքստի խաթարումը կանխելու նպատակով։ Սա երբեմն պայմանավորված է սխալներ պարունակող անանվանեցնող վեբ-փոխարինորդ (proxy) ծառայության օգտագործմամբ։'''",
        "editing": "Խմբագրվում է՝ $1 էջը",
-       "creating": "Ստեղծվում է՝ $1 էջը",
+       "creating": "Ստեղծվում է «$1» էջը",
        "editingsection": "Խմբագրվում է $1 բաժինը",
        "editingcomment": "Խմբագրվում է՝ $1 էջի (նոր բաժինը)",
        "editconflict": "Խմբագրման ընդհարում. $1",
-       "explainconflict": "Մեկ այլ մասնակից փոփոխել է այս տեքստը ձեր խմբագրման ընթացքում։\nՎերին խմբագրման դաշտում ընդգրկված է ընթացիկ տեքստը, որն ենթակա է հիշման։\nՁեր խմբագրումներով տեքստը գտնվում է ստորին դաշտում։\nՈրպեսզի ձեր փոփոխությունները հիշվեն, միաձուլեք դրանք վերին տեքստի մեջ։\n«{{int:savearticle}}» կոճակին սեղմելով կհիշվի '''միայն''' վերևվի դաշտի տեքստը:",
+       "explainconflict": "Մեկ այլ մասնակից փոփոխել է այս տեքստը ձեր խմբագրման ընթացքում։\nՎերին խմբագրման դաշտում ընդգրկված է ընթացիկ տեքստը, որն ենթակա է հիշման։\nՁեր խմբագրումներով տեքստը գտնվում է ստորին դաշտում։\nՈրպեսզի ձեր փոփոխությունները հիշվեն, միաձուլեք դրանք վերին տեքստի մեջ։\n«$1» կոճակին սեղմելով կհիշվի '''միայն''' վերևվի դաշտի տեքստը:",
        "yourtext": "Ձեր տեքստը",
        "storedversion": "Պահված տարբերակ",
        "nonunicodebrowser": "'''ԶԳՈՒՇԱՑՈՒՄ. Ձեր զննարկիչը չունի Յունիկոդ ապահովում։ Հոդվածներ խմբագրելիս բոլոր ոչ-ASCII սիմվլոները փոխարինվելու են իրենց տասնվեցական կոդերով։'''",
        "searchprofile-advanced-tooltip": "Որոնել նշված անվանատարածքներում",
        "search-result-size": "$1 ({{PLURAL:$2|1 բառ|$2 բառ}})",
        "search-result-category-size": "{{PLURAL:$1|անդամ}} ({{PLURAL:$2|ենթակատեգորիա}}, {{PLURAL:$3|նիշք}})",
-       "search-redirect": "(վերահղում $1-ից)",
+       "search-redirect": "(վերահղում $1 էջից)",
        "search-section": "(բաժին $1)",
        "search-suggest": "Գուցե նկատի ունե՞ք՝ $1",
        "search-interwiki-caption": "Կից նախագծեր",
        "userrights-groupsmember": "Անդամ է՝ $2-ին",
        "userrights-reason": "Պատճառ.",
        "userrights-changeable-col": "Խմբեր, որոնք դուք կարող եք ձևափոխել",
+       "userrights-unchangeable-col": "Խմբեր, որոնք Դուք չեք կարող փոփոխել",
        "group": "Խումբ.",
        "group-user": "Մասնակիցներ",
        "group-autoconfirmed": "Ավտովավերացված մասնակիցներ",
        "recentchanges-legend-heading": "<strong>Լեգենդ՝</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
        "recentchanges-submit": "Ցույց տալ",
+       "rcfilters-savedqueries-rename": "Վերանվանել",
+       "rcfilters-savedqueries-remove": "Ջնջել",
+       "rcfilters-savedqueries-new-name-label": "Անուն",
+       "rcfilters-savedqueries-apply-label": "Ստեղծել արագ հղում",
+       "rcfilters-savedqueries-cancel-label": "Չեղարկել",
        "rcfilters-filterlist-title": "Զտիչներ",
        "rcfilters-filter-editsbyself-label": "Ձեր խմբագրումներ",
+       "rcfilters-filtergroup-lastRevision": "Ընթացիկ տարբերակ",
        "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
        "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $3 $2",
        "rcshowhideminor": "$1 չնչին խմբագրումները",
        "rcshowhidecategorization": "$1 էջերի կատեգորիզացիա",
        "rcshowhidecategorization-show": "Ցուցադրել",
        "rcshowhidecategorization-hide": "Թաքցնել",
-       "rclinks": "Ցույց տալ վերջին $1 փոփոխությունները վերջին $2 օրվա ընթացքում<br />$3",
+       "rclinks": "Ցույց տալ վերջին $1 փոփոխությունները վերջին $2 օրվա ընթացքում",
        "diff": "տարբ",
        "hist": "պատմ",
        "hide": "Թաքցնել",
        "undeleteviewlink": "դիտել",
        "undeleteinvert": "Շրջել ընտրությունը",
        "undeletecomment": "Մեկնաբանություն.",
-       "undeletedrevisions": "վերականգնվեց $1 տարբերակ",
-       "undeletedrevisions-files": "վերականգնվեց $1 {{PLURAL:$1|տարբերակ}} և  $2 {{PLURAL:$2|նիշք}}",
-       "undeletedfiles": "վերականգնվեց $1 {{PLURAL:$1|նիշք}}",
        "cannotundelete": "Վերականգնումը ձախողվեց։ Հնարավոր է մեկ ուրիշն արդեն վերականգնել է այս էջը։",
        "undeletedpage": "'''«$1» էջը վերականգնված է։'''\n\nՏես [[Special:Log/delete|ջնջման տեղեկամատյանը]]` վերջին ջնջումների և վերականգնումների համար։",
        "undelete-header": "Տես [[Special:Log/delete|ջնջման տեղեկամատյանը]]՝ վերջին ջնջումների և վերականգնումների համար։",
        "whatlinkshere-prev": "{{PLURAL:$1|նախորդ|նախորդ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|հաջորդ|հաջորդ $1}}",
        "whatlinkshere-links": "← հղումներ",
-       "whatlinkshere-hideredirs": "$1 վերահղումներ",
-       "whatlinkshere-hidetrans": "$1 Õ¶Õ¥Ö\80Õ¡Õ¼Õ¥Õ¬Õ¸Ö\82",
-       "whatlinkshere-hidelinks": "$1 հղումներ",
+       "whatlinkshere-hideredirs": "$1 վերահղումները",
+       "whatlinkshere-hidetrans": "$1 Õ¶Õ¥Ö\80Õ¡Õ¼Õ¸Ö\82Õ´Õ¶Õ¥Ö\80Õ¨",
+       "whatlinkshere-hidelinks": "$1 հղումները",
        "whatlinkshere-hideimages": "$1 նիշքային հղումներ",
        "whatlinkshere-filters": "Զտիչներ",
        "whatlinkshere-submit": "Գնալ առաջ",
index f8dfc24..c3643c1 100644 (file)
        "category-file-count-limited": "Le sequente {{PLURAL:$1|file es|$1 files es}} in le categoria actual.",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Paginas indexate",
-       "noindex-category": "Paginas con \"__NOINDEX__\"",
+       "noindex-category": "Paginas non indexate",
        "broken-file-category": "Paginas con ligamines rupte a files",
        "about": "A proposito",
        "article": "Pagina de contento",
        "otherlanguages": "In altere linguas",
        "redirectedfrom": "(Redirigite ab $1)",
        "redirectpagesub": "Pagina de redirection",
-       "redirectto": "Rediriger verso:",
-       "lastmodifiedat": "Ultime modification de iste pagina: le $1 a $2.",
+       "redirectto": "Redirection verso:",
+       "lastmodifiedat": "Iste pagina esseva modificate le plus recentemente le $1 a $2.",
        "viewcount": "Iste pagina ha essite visitate {{PLURAL:$1|un vice|$1 vices}}.",
        "protectedpage": "Pagina protegite",
        "jumpto": "Saltar a:",
        "login": "Aperir session",
        "login-security": "Verifica tu identitate",
        "nav-login-createaccount": "Aperir session / crear conto",
-       "userlogin": "Aperir session / crear conto",
-       "userloginnocreate": "Aperir session",
        "logout": "Clauder session",
        "userlogout": "Clauder session",
        "notloggedin": "Tu non ha aperite un session",
        "userlogin-noaccount": "Non ha un conto?",
        "userlogin-joinproject": "Crear un conto in {{SITENAME}}",
-       "nologin": "Tu non ha un conto? $1.",
-       "nologinlink": "Crear un conto",
        "createaccount": "Crear conto",
-       "gotaccount": "Tu jam ha un conto? '''$1'''.",
-       "gotaccountlink": "Aperir session",
-       "userlogin-resetlink": "Datos de authentication oblidate?",
        "userlogin-resetpassword-link": "Contrasigno oblidate?",
        "userlogin-helplink2": "Adjuta al accesso",
        "userlogin-loggedin": "Tu ha jam aperite session como {{GENDER:$1|$1}}.\nUsa le formulario sequente pro aperir session como altere usator.",
        "createaccountmail": "Usar un contrasigno aleatori temporari e inviar lo al adresse de e-mail specificate",
        "createaccountmail-help": "Pro crear un conto pro un altere persona sin cognoscer le contrasigno.",
        "createacct-realname": "Nomine real (optional)",
-       "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Proque crea tu un altere conto?",
        "createacct-reason-help": "Message pro le registro de creation de contos",
        "preview": "Previsualisation",
        "showpreview": "Monstrar previsualisation",
        "showdiff": "Detaliar modificationes",
-       "blankarticle": "<strong>Advertimento:</strong> Le pagina que tu vole crear es vacue.\nSi tu clicca de novo sur \"{{int:savearticle}}\", le pagina essera create sin contento.",
+       "blankarticle": "<strong>Advertimento:</strong> Le pagina que tu vole crear es vacue.\nSi tu clicca de novo sur \"$1\", le pagina essera create sin contento.",
        "anoneditwarning": "<strong>Attention:</strong> Tu non ha aperite un session. Le adresse IP tue essera publicamente visibile si tu face modificationes. Si tu <strong>[$1 aperi un session]</strong> o <strong>[$2 crea un conto]</strong>, le modificationes essera attribuite al nomine de usator tue, inter altere avantages.",
        "anonpreviewwarning": "''Tu non ha aperite un session. Salveguardar registrara tu adresse IP in le historia de modificationes de iste pagina.''",
-       "missingsummary": "'''Rememoration:''' Tu non ha specificate un summario del modification.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin summario.",
-       "selfredirect": "<strong>Attention:</strong> Tu redirige iste pagina verso se mesme.\nTu pote haber specificate le mal destination pro le redirection, o tu modifica forsan le mal pagina.\nSi tu clicca sur \"{{int:savearticle}}\" de novo, le redirection essera create in despecto de isto.",
+       "missingsummary": "<strong>Rememoration:</strong> Tu non ha scribite un summario de modification.\nSi tu clicca sur \"$1\" de novo, le modification essera publicate sin summario.",
+       "selfredirect": "<strong>Attention:</strong> Tu redirige iste pagina verso se mesme.\nTu pote haber specificate le mal destination pro le redirection, o tu modifica forsan le mal pagina.\nSi tu clicca sur \"$1\" de novo, le redirection essera create in despecto de isto.",
        "missingcommenttext": "Per favor entra un commento infra.",
-       "missingcommentheader": "<strong>Rememoration:</strong> Tu non ha fornite un subjecto pro iste commento.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin subjecto.",
+       "missingcommentheader": "<strong>Rememoration:</strong> Tu non ha fornite un subjecto pro iste commento.\nSi tu clicca super \"$1\" de novo, le modification essera publicate sin subjecto.",
        "summary-preview": "Previsualisation del summario de modification:",
        "subject-preview": "Previsualisation del subjecto:",
        "previewerrortext": "Un error ha occurrite durante le tentativa de previsualisar le cambiamentos.",
        "editingsection": "Modification de $1 (section)",
        "editingcomment": "Modification de $1 (nove section)",
        "editconflict": "Conflicto de modification: $1",
-       "explainconflict": "Alicuno ha modificate iste pagina post que tu\nha comenciate a modificar lo.\nLe area de texto superior contine le texto del pagina como illo existe actualmente.\nTu modificationes se monstra in le area de texto inferior.\nTu debera incorporar tu modificationes in le texto existente.\n'''Solmente''' le texto del area superior essera publicate quando tu clicca super \"{{int:savearticle}}\".",
+       "explainconflict": "Alicuno ha modificate iste pagina post que tu\nha comenciate a modificar lo.\nLe area de texto superior contine le texto del pagina como illo existe actualmente.\nTu modificationes se monstra in le area de texto inferior.\nTu debera incorporar tu modificationes in le texto existente.\n<strong>Solmente</strong> le texto del area superior essera publicate quando tu clicca super \"$1\".",
        "yourtext": "Tu texto",
        "storedversion": "Version immagazinate",
        "nonunicodebrowser": "'''Attention: Tu utilisa un navigator non compatibile con le characteres Unicode.'''\nUn systema de modification alternative ha essite activate, que te permitte modificar articulos con securitate: le characteres non ASCII apparera in le quadro de modification como codices hexadecimal.",
        "readonlywarning": "<strong>Attention: Le base de datos ha essite blocate pro mantenentia. Tu non pote salveguardar tu modificationes in iste momento.</strong>\nNos recommenda copiar e collar le texto in un file e salveguardar lo pro plus tarde.\n\nLe administrator de systema qui ha blocate le base de datos ha fornite iste explication: $1",
        "protectedpagewarning": "'''Attention:  Iste pagina ha essite protegite de sorta que solmente usatores con privilegios de administrator pote modificar lo.''' Le ultime entrata del registro es fornite hic infra pro referentia:",
        "semiprotectedpagewarning": "'''Nota:''' Iste pagina ha essite protegite de maniera que solmente usatores registrate pote modificar lo. Le ultime entrata del registro es fornite hic infra pro referentia:",
-       "cascadeprotectedwarning": "<strong>Attention:</strong> Iste pagina ha essite protegite de maniera que solmente usatores con privilegios de administrator pote modificar lo, perque illo es transcludite in le sequente {{PLURAL:$1|pagina|paginas}} protegite in cascada:",
+       "cascadeprotectedwarning": "<strong>Attention:</strong> Iste pagina ha essite protegite de maniera que solmente usatores con [[Special:ListGroupRights|certe privilegios]] pote modificar lo, perque illo es transcludite in le sequente {{PLURAL:$1|pagina|paginas}} protegite in cascada:",
        "titleprotectedwarning": "'''Attention:  Iste pagina ha essite protegite de maniera que [[Special:ListGroupRights|permissiones specific]] es requirite pro crear lo.''' Le ultime entrata del registro es fornite hic infra pro referentia:",
        "templatesused": "{{PLURAL:$1|Patrono|Patronos}} usate in iste pagina:",
        "templatesusedpreview": "{{PLURAL:$1|Patrono|Patronos}} usate in iste previsualisation:",
        "post-expand-template-argument-warning": "'''Attention:''' Iste pagina contine al minus un parametro de patrono que ha un grandor de expansion excessive.\nIste parametros ha essite omittite.",
        "post-expand-template-argument-category": "Paginas que omitte alcun parametros de patrono",
        "parser-template-loop-warning": "Recursion infinite detegite in patrono: [[$1]]",
+       "template-loop-category": "Paginas con buclas de patrono",
+       "template-loop-category-desc": "Le pagina contine un bucla in un patrono, i.e. un patrono que se appella recursivemente.",
        "parser-template-recursion-depth-warning": "Limite de recursion del patrono excedite ($1)",
        "language-converter-depth-warning": "Limite de profunditate del conversor de lingua excedite ($1)",
        "node-count-exceeded-category": "Paginas in que le numero de nodos excede le limite",
        "page_first": "prime",
        "page_last": "ultime",
        "histlegend": "Pro comparar duo versiones: marca lor circulos correspondente, e preme <code>Enter</code> o clicca le button in basso.<br />\nLegenda: '''({{int:cur}})''' = comparar con le version actual,\n'''({{int:last}})''' = comparar con le version precedente, '''{{int:minoreditletter}}''' = modification minor.",
-       "history-fieldset-title": "Examinar historia",
-       "history-show-deleted": "Delite solmente",
+       "history-fieldset-title": "Cercar versiones",
+       "history-show-deleted": "Solmente versiones delite",
        "histfirst": "le plus ancian",
        "histlast": "le plus nove",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "search-file-match": "(corresponde al contento del file)",
        "search-suggest": "Esque tu vole dicer: $1",
        "search-rewritten": "Es monstrate le resultatos pro $1. Cerca $2 in su loco.",
-       "search-interwiki-caption": "Projectos fratres",
+       "search-interwiki-caption": "Resultatos de projectos affin",
        "search-interwiki-default": "Resultatos de $1:",
        "search-interwiki-more": "(plus)",
        "search-interwiki-more-results": "plus resultatos",
        "prefs-help-prefershttps": "Iste preferentia habera effecto a partir de tu proxime session.",
        "prefswarning-warning": "To ha facite modificationes in tu preferentias que non ha ancora essite confirmate. Si tu quita iste pagina sin cliccar sur \"$1\", tu preferentias non essera cambiate.",
        "prefs-tabs-navigation-hint": "Consilio: Tu pote usar le claves de sagitta sinistre e dextre pro navigar inter le schedas in le lista.",
-       "userrights": "Gestion de derectos de usator",
+       "userrights": "Derectos de usator",
        "userrights-lookup-user": "Selige un usator",
        "userrights-user-editname": "Entra un nomine de usator:",
        "editusergroup": "Cargar gruppos de usator",
        "saveusergroups": "Salveguardar gruppos de {{GENDER:$1|usator}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implicite de:",
-       "userrights-groups-help": "Tu pote alterar le gruppos al quales iste usator pertine:\n* Un quadrato marcate significa que le usator es in le gruppo.\n* Un non marcate significa que ille non lo es.\n* Un * indica que tu non pote remover le gruppo post adder lo, o vice versa.\n* Un # indica que tu pote solmente reducer le tempore de expiration del gruppo e non extender lo.",
+       "userrights-groups-help": "Tu pote alterar le gruppos al quales iste usator pertine:\n* Un quadrato marcate significa que le usator es in le gruppo.\n* Un non marcate significa que ille non lo es.\n* Un * indica que tu non pote remover le gruppo post adder lo, o vice versa.\n* Un # indica que tu pote solmente prolongar le pertinentia a iste gruppo e non accurtar lo.",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Tu non ha le permission de modificar le derectos de usatores in altere wikis.",
        "userrights-nodatabase": "Le base de datos $1 non existe o non es local.",
        "userrights-expiry-options": "1 die:1 day,1 septimana:1 week,1 mense:1 month,3 menses:3 months,6 menses:6 months,1 anno:1 year",
        "userrights-invalid-expiry": "Le hora de expiration pro le gruppo \"$1\" es invalide.",
        "userrights-expiry-in-past": "Le hora de expiration pro le gruppo \"$1\" es in le passato.",
+       "userrights-cannot-shorten-expiry": "Tu non pote accurtar le tempore de expiration del appertinentia al gruppo \"$1\". Solmente usatores con le permission de adder e remover iste gruppo pote accurtar tempores de expiration.",
        "userrights-conflict": "Conflicto inter cambiamentos de derectos de usator! Per favor revide e confirma tu cambiamentos.",
        "group": "Gruppo:",
        "group-user": "Usatores",
        "right-deleterevision": "Deler e restaurar versiones specific de paginas",
        "right-deletedhistory": "Vider entratas de historia delite, sin lor texto associate",
        "right-deletedtext": "Vider texto delite e differentias inter versiones delite",
-       "right-browsearchive": "Cercar in paginas delite",
+       "right-browsearchive": "Cercar paginas delite",
        "right-undelete": "Restaurar un pagina",
        "right-suppressrevision": "Vider, celar e revelar versiones specific de paginas de qualcunque usator",
        "right-viewsuppressed": "Vider versiones celate de qualcunque usator",
        "right-editsemiprotected": "Modificar paginas protegite como \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Modificar le modello de contento de un pagina",
        "right-editinterface": "Modificar le interfacie de usator",
-       "right-editusercssjs": "Modificar le files CSS e JS de altere usatores",
        "right-editusercss": "Modificar le files CSS de altere usatores",
        "right-edituserjs": "Modificar le files JS de altere usatores",
        "right-editmyusercss": "Modificar le proprie files CSS de usator",
        "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-browsearchive": "cercar paginas delite",
        "action-undelete": "restaurar paginas",
        "action-suppressrevision": "revider e restaurar versiones celate",
        "action-suppressionlog": "vider iste registro private",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Monstrar",
        "rcfilters-activefilters": "Filtros active",
+       "rcfilters-quickfilters": "Ligamines rapide",
        "rcfilters-restore-default-filters": "Restaurar filtros predefinite",
        "rcfilters-clear-all-filters": "Rader tote le filtros",
        "rcfilters-search-placeholder": "Filtrar le modificationes recente (naviga o comencia a scriber)",
        "rcfilters-invalid-filter": "Filtro non valide",
        "rcfilters-empty-filter": "Nulle filtro active. Tote le contributiones es monstrate.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "Que es isto?",
+       "rcfilters-filterlist-feedbacklink": "Da nos tu opinion sur le nove filtros (in beta)",
+       "rcfilters-highlightbutton-title": "Accentuar resultatos",
+       "rcfilters-highlightmenu-title": "Selige un color",
+       "rcfilters-highlightmenu-help": "Selige un color pro accentuar iste proprietate",
        "rcfilters-filterlist-noresults": "Nulle filtro trovate",
+       "rcfilters-noresults-conflict": "Nulle resultato trovate perque le criterios de recerca es in conflicto",
+       "rcfilters-state-message-subset": "Iste filtro non ha effecto perque su resultatos es includite in illos del sequente {{PLURAL:$2|filtro|filtros}} plus comprehensive (essaya accentuar pro poter distinguer lo): $1",
+       "rcfilters-state-message-fullcoverage": "Seliger tote le filtros in un gruppo equivale seliger nulle, dunque iste filtro non ha effecto. Le gruppo include: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "Iste filtro es in conflicto con le sequente {{PLURAL:$2|filtro|filtros}} de Experientia, le {{PLURAL:$2|qual|quales}} trova solmente usatores registrate: $1",
        "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-user-experience-level-conflicts-unregistered": "Filtros de Experientia trova solmente usatores registrate. Iste filtro es dunque in conflicto con le filtro \"Non registrate\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Le filtro \"Non registrate\" es in conflicto con un o plure filtros \"Experientia\", le quales trova solmente usatores registrate. Le filtros in conflicto es marcate in le area \"Filtros active\" supra.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novicios",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Minus de 10 modificationes e 4 dies de activitate.",
+       "rcfilters-filter-user-experience-level-learner-label": "Apprentisses",
+       "rcfilters-filter-user-experience-level-learner-description": "Plus dies de activitate e modificationes que \"Novicios\" ma minus que \"Usatores con experientia\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Usatores con experientia",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Stato de revision",
+       "rcfilters-filter-patrolled-label": "Patruliate",
+       "rcfilters-filter-patrolled-description": "Modificationes marcate como patruliate.",
+       "rcfilters-filter-unpatrolled-label": "Non patruliate",
+       "rcfilters-filter-unpatrolled-description": "Modificationes non marcate como patruliate.",
        "rcfilters-filtergroup-significance": "Importantia",
        "rcfilters-filter-minor-label": "Modificationes minor",
        "rcfilters-filter-minor-description": "Modificationes que le autor ha marcate como minor.",
        "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…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Le filtro \"Modificationes minor\" es in conflicto con un o plure filtros \"Typo de cambiamento\", perque certe typos de cambiamento non pote esser assignate como \"minor\". Le filtros in conflicto es marcate in le area \"Filtros active\" supra.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Certe typos de cambiamento non pote esser assignate como \"minor\", dunque iste filtro es in conflicto con le sequente filtros \"Typo de cambiamento\": $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Iste filtro \"Typo de cambiamento\" es in conflicto con le filtro \"Modificationes minor\". Certe typos de cambiamento non pote esser assignate como \"minor\".",
        "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",
        "rcshowhidecategorization": "$1 le categorisation de paginas",
        "rcshowhidecategorization-show": "Monstrar",
        "rcshowhidecategorization-hide": "Celar",
-       "rclinks": "Monstrar le $1 ultime modificationes in le $2 ultime dies<br />$3",
+       "rclinks": "Monstrar le $1 ultime modificationes in le $2 ultime dies",
        "diff": "diff",
        "hist": "hist",
        "hide": "Celar",
        "editcomment": "Le summario del modification esseva: <em>$1</em>.",
        "revertpage": "Reverteva modificationes per [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]]) al ultime version per [[User:$1|$1]]",
        "revertpage-nouser": "Reverteva modificationes per un usator celate al ultime version per {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Revocava modificationes per $1;\nretornava al version per $2.",
+       "rollback-success": "Revocava modificationes per {{GENDER:$3|$1}};\nretornava al version per {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Modificationes de $1 revertite;\nultime version de $2 restaurate. [$3 Monstrar cambiamentos]",
        "sessionfailure-title": "Error de session",
        "sessionfailure": "Il pare haber un problema con tu session de conto;\niste action ha essite cancellate como precaution contra le sequestramento de sessiones.\nPer favor preme \"retro\" e recarga le pagina de ubi tu ha venite, postea reprova.",
        "undeleteviewlink": "vider",
        "undeleteinvert": "Inverter selection",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "{{PLURAL:$1|1 version|$1 versiones}} restaurate",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 version|$1 versiones}} e {{PLURAL:$2|1 file|$2 files}} restaurate",
-       "undeletedfiles": "$1 {{PLURAL:$1|file|files}} restaurate",
        "cannotundelete": "Le restauration ha partial- o totalmente fallite:\n$1",
        "undeletedpage": "'''$1 ha essite restaurate'''\n\nConsulta le [[Special:Log/delete|registro de deletiones]] pro un lista de deletiones e restaurationes recente.",
        "undelete-header": "Vide [[Special:Log/delete|le registro de deletiones]] pro un lista de paginas recentemente delite.",
-       "undelete-search-title": "Cercar in paginas delite",
+       "undelete-search-title": "Cercar paginas delite",
        "undelete-search-box": "Cercar paginas delite",
        "undelete-search-prefix": "Monstrar paginas que comencia con:",
        "undelete-search-submit": "Cercar",
        "ipbexpiry": "Expiration:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Motivos frequente pro blocar\n** Insertion de informationes false\n** Elimination de contento de paginas\n** Ligamines ''spam'' verso sitos externe\n** Insertion de nonsenso/absurditates in paginas\n** Comportamento intimidatori/molestation\n** Abuso de contos multiple\n** Nomine de usator inacceptabile",
-       "ipb-hardblock": "Impedir le usatores authenticate de facer modificationes ab iste adresse IP",
+       "ipb-hardblock": "Impedir que usatores authenticate face modificationes ab iste adresse IP",
        "ipbcreateaccount": "Impedir creation de contos",
        "ipbemailban": "Impedir que le usator invia e-mail",
        "ipbenableautoblock": "Blocar automaticamente le adresse IP usate le plus recentemente per iste usator, e omne IPs successive desde le quales ille/-a tenta facer modificationes",
        "ipboptions": "2 horas:2 hours,1 die:1 day,3 dies:3 days,1 septimana:1 week,2 septimanas:2 weeks,1 mense:1 month,3 menses:3 months,6 menses:6 months,1 anno:1 year,infinite:infinite",
        "ipbhidename": "Celar le nomine del usator del modificationes e del listas",
        "ipbwatchuser": "Observar le paginas de usator e de discussion de iste usator",
-       "ipb-disableusertalk": "Impedir iste usator de modificar su proprie pagina de discussion durante que ille es blocate",
+       "ipb-disableusertalk": "Impedir que iste usator modifica su proprie pagina de discussion durante que ille es blocate",
        "ipb-change-block": "Reblocar le usator con iste configurationes",
        "ipb-confirm": "Confirmar blocada",
        "badipaddress": "Adresse IP mal formate.",
        "newimages-summary": "Iste pagina special detalia le recente files incargate.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nomine del file (o un parte de illo):",
+       "newimages-user": "Adresse de IP o nomine de usator",
        "newimages-showbots": "Monstrar files incargate per robots",
        "newimages-hidepatrolled": "Celar le files incargate patruliate",
        "noimages": "Nihil a vider.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|actualisava}} etiquettas sur le version $4 del pagina $3 ({{PLURAL:$7|addeva}} $6; {{PLURAL:$9|removeva}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|actualisava}} etiquettas sur le entrata de registro $5 del pagina $3 ({{PLURAL:$7|addeva}} $6; {{PLURAL:$9|removeva}} $8)",
        "rightsnone": "(nulle)",
-       "revdelete-summary": "summario del modification",
        "rightslogentry-temporary-group": "$1 (temporari, usque a $2)",
        "feedback-adding": "Le responsa es addite al pagina...",
        "feedback-back": "Retornar",
        "restrictionsfield-label": "Intervallos IP permittite:",
        "restrictionsfield-help": "Un adresse IP o intervallo CIDR per linea. Pro activar toto, usa:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "version $1",
-       "pageid": "ID de pagina $1"
+       "pageid": "ID de pagina $1",
+       "rawhtml-notallowed": "Etiquettas &lt;html&gt; non pote esser usate foras de paginas normal."
 }
index 412a133..73398af 100644 (file)
@@ -51,7 +51,9 @@
                        "Bonaditya",
                        "Irus",
                        "Presidenvolksraad",
-                       "Hidayatsrf"
+                       "Hidayatsrf",
+                       "MF-Warburg",
+                       "Rachmat04"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "login": "Masuk log",
        "login-security": "Buktikan identitas Anda",
        "nav-login-createaccount": "Masuk log / buat akun",
-       "userlogin": "Masuk log / buat akun",
-       "userloginnocreate": "Masuk log",
        "logout": "Keluar log",
        "userlogout": "Keluar log",
        "notloggedin": "Belum masuk log",
        "userlogin-noaccount": "Belum punya akun?",
        "userlogin-joinproject": "Gabung {{SITENAME}}",
-       "nologin": "Belum mempunyai akun? $1.",
-       "nologinlink": "Daftarkan akun baru",
        "createaccount": "Buat akun baru",
-       "gotaccount": "Sudah terdaftar sebagai pengguna? '''$1'''.",
-       "gotaccountlink": "Masuk log",
-       "userlogin-resetlink": "Lupa detail info masuk Anda?",
        "userlogin-resetpassword-link": "Lupa kata sandi?",
        "userlogin-helplink2": "Bantuan masuk log",
        "userlogin-loggedin": "Anda telah masuk log sebagai $1.\nGunakan formulir di bawah untuk masuk log sebagai pengguna lain.",
        "createaccountmail": "Gunakan kata sandi acak sementara dan kirimkan ke surel yang diinginkan",
        "createaccountmail-help": "Dapat digunakan untuk membuat akun untuk orang lain tanpa mengetahui kata sandinya.",
        "createacct-realname": "Nama asli (opsional)",
-       "createaccountreason": "Alasan:",
        "createacct-reason": "Alasan",
        "createacct-reason-ph": "Mengapa Anda membuat akun lain",
        "createacct-reason-help": "Pesan yang ditunjukkan dalam log pembuatan akun",
        "preview": "Pratayang",
        "showpreview": "Lihat pratayang",
        "showdiff": "Lihat perubahan",
-       "blankarticle": "<strong>Peringatan:</strong> Halaman yang akan Anda buat tidak berisi apa-apa.\nJika Anda mengklik \"{{int:savearticle}}\" sekali lagi, halaman ini akan dibuat tanpa ada isi.",
+       "blankarticle": "<strong>Peringatan:</strong> Halaman yang akan Anda buat tidak berisi apa-apa.\nJika Anda mengklik \"$1\" sekali lagi, halaman ini akan dibuat tanpa ada isi.",
        "anoneditwarning": "<strong>Peringatan:</strong> Anda sedang tidak masuk log. Alamat IP Anda akan terlihat oleh publik jika Anda melakukan suatu perubahan. Jika Anda <strong>[$1 masuk log]</strong> atau <strong>[$2 membuat akun]</strong>, suntingan Anda akan diatribusikan kepada nama pengguna Anda, beserta berbagai keuntungan lainnya.",
        "anonpreviewwarning": "''Anda belum masuk log. Menyimpan halaman akan menyebabkan alamat IP Anda tercatat pada riwayat suntingan laman ini.''",
        "missingsummary": "'''Peringatan:''' Anda tidak memasukkan ringkasan penyuntingan. Jika Anda kembali menekan tombol Simpan, suntingan Anda akan disimpan tanpa ringkasan penyuntingan.",
-       "selfredirect": "<strong>Peringatan:</strong> Anda mengalihkan halaman ini kembali ke halaman semula.\nAnda bisa jadi telah memberikan tujuan pengalihan yang salah, atau telah menyunting halaman yang salah.\nJika Anda mengeklik \"{{int:savearticle}}\" sekali lagi, halaman pengalihan akan dibuat.",
+       "selfredirect": "<strong>Peringatan:</strong> Anda mengalihkan halaman ini kembali ke halaman semula.\nAnda bisa jadi telah memberikan tujuan pengalihan yang salah, atau telah menyunting halaman yang salah.\nJika Anda mengeklik \"$1\" sekali lagi, halaman pengalihan akan dibuat.",
        "missingcommenttext": "Harap masukkan komentar di bawah ini.",
-       "missingcommentheader": "'''Peringatan:''' Anda belum memberikan subjek atau judul untuk komentar Anda. Jika Anda kembali menekan \"{{int:savearticle}}\", suntingan Anda akan disimpan tanpa komentar tersebut.",
-       "summary-preview": "Pratayang ringkasan:",
+       "missingcommentheader": "'''Peringatan:''' Anda belum memberikan subjek atau judul untuk komentar Anda. Jika Anda kembali menekan \"$1\", suntingan Anda akan disimpan tanpa komentar tersebut.",
+       "summary-preview": "Pratayang ringkasan suntingan:",
        "subject-preview": "Pratayang subjek:",
        "previewerrortext": "Kesalahan terjadi saat mencoba memperlihatkan pratayang perubahan Anda.",
        "blockedtitle": "Pengguna diblokir",
        "editingsection": "Menyunting $1 (bagian)",
        "editingcomment": "Menyunting $1 (bagian baru)",
        "editconflict": "Konflik penyuntingan: $1",
-       "explainconflict": "Orang lain telah menyunting halaman ini sejak Anda mulai menyuntingnya.\nBagian atas teks ini mengandung teks halaman saat ini.\nPerubahan yang Anda lakukan ditunjukkan pada bagian bawah teks.\nAnda hanya perlu menggabungkan perubahan Anda dengan teks yang telah ada.\n'''Hanya''' teks pada bagian atas halamanlah yang akan disimpan apabila Anda menekan \"{{int:savearticle}}\".",
+       "explainconflict": "Orang lain telah menyunting halaman ini sejak Anda mulai menyuntingnya.\nBagian atas teks ini mengandung teks halaman saat ini.\nPerubahan yang Anda lakukan ditunjukkan pada bagian bawah teks.\nAnda hanya perlu menggabungkan perubahan Anda dengan teks yang telah ada.\n'''Hanya''' teks pada bagian atas halamanlah yang akan disimpan apabila Anda menekan \"$1\".",
        "yourtext": "Teks Anda",
        "storedversion": "Versi tersimpan",
        "nonunicodebrowser": "'''Peringatan: Penjelajah web Anda tidak mendukung unicode.'''\nTelah terdapat sebuah solusi agar Anda dapat menyunting halaman dengan aman: karakter non-ASCII akan muncul dalam kotak edit sebagai kode heksadesimal.",
        "post-expand-template-argument-warning": "Peringatan: Halaman ini mengandung setidaknya satu argumen templat dengan ukuran ekspansi yang terlalu besar. Argumen-argumen tersebut telah diabaikan.",
        "post-expand-template-argument-category": "Halaman dengan argumen templat yang diabaikan",
        "parser-template-loop-warning": "Hubungan berulang templat terdeteksi: [[$1]]",
+       "template-loop-category": "Halaman dengan templat berulang",
        "parser-template-recursion-depth-warning": "Limit kedalaman hubungan berulang templat terlampaui ($1)",
        "language-converter-depth-warning": "Batas kedalaman pengonversi bahasa terlampaui ($1)",
        "node-count-exceeded-category": "Halaman dimana hitungan-node terlampaui",
        "search-interwiki-caption": "Proyek lain",
        "search-interwiki-default": "Hasil dari $1:",
        "search-interwiki-more": "(selanjutnya)",
+       "search-interwiki-more-results": "Hasil lainnya",
        "search-relatedarticle": "Berkaitan",
        "searchrelated": "berkaitan",
        "searchall": "semua",
        "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",
+       "userrights-editusergroup": "Sunting kelompok {{GENDER:$1|pengguna}}",
+       "userrights-viewusergroup": "Lihat kelompok {{GENDER:$1|pengguna}}",
        "saveusergroups": "Simpan kelompok {{GENDER:$1|pengguna}}",
        "userrights-groupsmember": "Anggota dari:",
        "userrights-groupsmember-auto": "Anggota implisit dari:",
        "userrights-changeable-col": "Kelompok yang dapat Anda ubah",
        "userrights-unchangeable-col": "Kelompok yang tidak dapat Anda ubah",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "Udang $1",
+       "userrights-expiry-none": "Tidak usang",
+       "userrights-expiry": "Usang:",
        "userrights-expiry-othertime": "Waktu lain:",
        "userrights-conflict": "Konflik perubahan hak pengguna! Silakan tinjau ulang dan konfirmasi perubahan Anda.",
        "group": "Kelompok:",
        "right-editsemiprotected": "Sunting halaman yang dilindungi sebagai \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Edit model konten halaman",
        "right-editinterface": "Menyunting antarmuka pengguna",
-       "right-editusercssjs": "Menyunting arsip CSS dan JS pengguna lain",
        "right-editusercss": "Menyunting berkas CSS pengguna lain",
        "right-edituserjs": "Menyunting berkas JS pengguna lain",
        "right-editmyusercss": "Sunting berkas CSS pengguna Anda",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat pula [[Special:NewPages|daftar halaman baru]])",
        "recentchanges-submit": "Tampilkan",
        "rcfilters-activefilters": "Filter aktif",
+       "rcfilters-savedqueries-rename": "Ubah nama",
+       "rcfilters-savedqueries-setdefault": "Tetapkan sebagai baku",
+       "rcfilters-savedqueries-remove": "Hapus",
+       "rcfilters-savedqueries-cancel-label": "Batalkan",
+       "rcfilters-restore-default-filters": "Kembalikan filter bawaan",
+       "rcfilters-clear-all-filters": "Hapus semua penyaringan",
+       "rcfilters-search-placeholder": "Filter perubahan terbaru (jelajahi atau masukan input)",
+       "rcfilters-invalid-filter": "Penyqringan tidak sah",
+       "rcfilters-empty-filter": "Tidak ada filter aktif. Semua kontribusi ditampilkan.",
+       "rcfilters-filterlist-title": "Penyaringan",
+       "rcfilters-filterlist-whatsthis": "Apa ini?",
+       "rcfilters-filterlist-feedbacklink": "Berikan umpan balik untuk filter uji coba baru",
+       "rcfilters-highlightmenu-title": "Pilih warna",
+       "rcfilters-filterlist-noresults": "Tidak ada penyaring ditemukan",
+       "rcfilters-filtergroup-registration": "Pendaftaran pengguna",
        "rcfilters-filter-registered-label": "Terdaftar",
+       "rcfilters-filter-registered-description": "Penyunting masuk log",
        "rcfilters-filter-unregistered-label": "Tidak terdaftar",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Pendatang baru",
+       "rcfilters-filter-unregistered-description": "Penyunting yang tidak masuk log",
+       "rcfilters-filtergroup-authorship": "Sunting kepengarangan",
+       "rcfilters-filter-editsbyself-label": "Suntingan Anda",
+       "rcfilters-filter-editsbyself-description": "Suntingan oleh Anda",
+       "rcfilters-filter-editsbyother-label": "Suntingan orang lain",
+       "rcfilters-filter-editsbyother-description": "Suntingan dibuat oleh orang lain (bukan Anda)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Pendatang baru",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Kurang dari 10 suntingan dan aktivitas selama 4 hari.",
+       "rcfilters-filter-user-experience-level-learner-label": "Pelajar",
+       "rcfilters-filter-user-experience-level-experienced-label": "Pengguna berpengalaman",
+       "rcfilters-filtergroup-automated": "Kontribusi otomatis",
        "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Suntingan yang dibuat dengan perkakas terotomatisasi.",
+       "rcfilters-filter-humans-label": "Manusia (bukan bot)",
+       "rcfilters-filter-humans-description": "Suntingan yang dibuat oleh penyunting manusia.",
+       "rcfilters-filter-patrolled-label": "Telah dipatroli",
+       "rcfilters-filter-patrolled-description": "Suntingan ditandai sebagai terpatroli",
+       "rcfilters-filter-unpatrolled-label": "Belum terpatroli",
+       "rcfilters-filtergroup-significance": "Kepentingan",
        "rcfilters-filter-minor-label": "Suntingan kecil",
+       "rcfilters-filter-minor-description": "Suntingan yang ditandai penyunting sebagai suntingan kecil",
+       "rcfilters-filter-major-label": "Suntingan yang bukan suntingan kecil",
+       "rcfilters-filter-major-description": "Suntingan yang ditandai sebagai suntingan kecil",
+       "rcfilters-filtergroup-changetype": "Jenis perubahan",
+       "rcfilters-filter-pageedits-label": "Suntingan halaman",
+       "rcfilters-filter-pageedits-description": "Suntingan pada konten wiki, diskusi, deskripsi kategori....",
+       "rcfilters-filter-newpages-label": "Pembuatan halaman",
+       "rcfilters-filter-newpages-description": "Suntingan yang membuat halaman baru",
        "rcfilters-filter-categorization-label": "Perubahan kategori",
+       "rcfilters-filter-categorization-description": "Rekam jejak halaman yang telah ditambahkan atau dihapus dari kategori.",
+       "rcfilters-filter-logactions-label": "Tindakan tercatat",
+       "rcfilters-filter-logactions-description": "Tindakan administratif, pembuatan akun, penghapusan halaman, pengunggahan....",
+       "rcfilters-filtergroup-lastRevision": "Revisi terkini",
+       "rcfilters-filter-lastrevision-label": "Revisi terkini",
+       "rcfilters-filter-lastrevision-description": "Perubahan terkini halaman ini",
+       "rcfilters-filter-previousrevision-label": "Revisi lebih awal",
        "rcnotefrom": "Di bawah ini adalah {{PLURAL:$5|perubahan}} sejak <strong>$3, $4</strong> (ditampilkan sampai <strong>$1</strong> perubahan).",
+       "rclistfromreset": "Atur ulang pilihan tanggal",
        "rclistfrom": "Perlihatkan perubahan terbaru sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "rcshowhideminor-show": "Tampilkan",
        "rcshowhidecategorization": "$1 kategorisasi halaman",
        "rcshowhidecategorization-show": "Tampilkan",
        "rcshowhidecategorization-hide": "Sembunyikan",
-       "rclinks": "Perlihatkan $1 perubahan terbaru dalam $2 hari terakhir<br />$3",
+       "rclinks": "Perlihatkan $1 perubahan terbaru dalam $2 hari terakhir",
        "diff": "beda",
        "hist": "versi",
        "hide": "Sembunyikan",
        "apisandbox-sending-request": "Mengirim permintaan API...",
        "apisandbox-loading-results": "Menerima hasil API...",
        "apisandbox-results-error": "Sebuah galat terjadi ketika memuat permintaan respon API: $1.",
+       "apisandbox-request-selectformat-label": "Tampilkan permintaan data sebagai:",
        "apisandbox-request-url-label": "URL Permintaan:",
+       "apisandbox-request-json-label": "Meminta JSON:",
        "apisandbox-request-time": "Lama permintaan: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Perbaiki token dan kirim kembali",
        "apisandbox-results-fixtoken-fail": "Gagal mendapatkan token \"$1\".",
        "apisandbox-alert-field": "Nilai dalam kolom ini tidak valid.",
        "apisandbox-continue": "Lanjutkan",
        "apisandbox-continue-clear": "Kosongkan",
+       "apisandbox-param-limit": "Masukan <kbd>max</kbd> untuk menggunakan batas maksimum.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Semua ruang nama)",
+       "apisandbox-multivalue-all-values": "$1 (Semua nilai)",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Cari di sumber buku",
        "booksources-isbn": "ISBN:",
        "booksources-search": "Cari",
        "booksources-text": "Di bawah ini adalah daftar pranala ke situs lain yang menjual buku baru dan bekas, dan mungkin juga mempunyai informasi lebih lanjut mengenai buku yang sedang Anda cari:",
        "booksources-invalid-isbn": "ISBN yang diberikan tampaknya tidak valid; periksa kesalahan penyalinan dari sumber asli.",
+       "magiclink-tracking-rfc": "Halaman menggunakan pranala magis RFC",
+       "magiclink-tracking-pmid": "Halaman menggunakan pranala magis PMID",
+       "magiclink-tracking-isbn": "Halaman yang menggunakan pranala magis ISBN",
        "specialloguserlabel": "Pengguna:",
        "speciallogtitlelabel": "Target (judul atau{{ns:pengguna}}:nama pengguna untuk pengguna)",
        "log": "Catatan (Log)",
        "activeusers-intro": "Berikut adalah daftar pengguna yang memiliki suatu bentuk aktivitas selama paling tidak $1 {{PLURAL:$1|hari|hari}} terakhir.",
        "activeusers-count": "$1 {{PLURAL:$1|aktivitas|aktivitas}} dalam {{PLURAL:$3|1 hari|$3 hari}} terakhir",
        "activeusers-from": "Tampilkan pengguna mulai dari:",
+       "activeusers-groups": "Tampilkan pengguna yang termasuk kelompok:",
+       "activeusers-excludegroups": "Sembunyikan pengguna yang termasuk kelompok:",
        "activeusers-noresult": "Pengguna tidak ditemukan.",
        "activeusers-submit": "Tampilkan pengguna aktif",
        "listgrouprights": "Daftar hak kelompok",
        "rollbacklinkcount-morethan": "kembalikan lebih dari $1 {{PLURAL:$1|suntingan|suntingan}}",
        "rollbackfailed": "Pengembalian gagal dilakukan",
        "rollback-missingparam": "Parameter dibutuhkan ketika diminta tidak tersedia.",
+       "rollback-missingrevision": "Tidak mampu memuat data revisi.",
        "cantrollback": "Tidak dapat membatalkan suntingan;\nkontributor terakhir adalah satu-satunya penulis halaman ini.",
        "alreadyrolled": "Tidak dapat melakukan pengembalian ke revisi terakhir [[:$1]] oleh [[User:$2|$2]] ([[User talk:$2|bicara]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\npengguna lain telah menyunting atau melakukan pengembalian terhadap halaman ini.\n\nSuntingan terakhir dilakukan oleh [[User:$3|$3]] ([[User talk:$3|bicara]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Komentar penyuntingan adalah: <em>$1</em>.",
        "revertpage": "←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dibatalkan ke versi terakhir oleh [[User:$1|$1]]",
        "revertpage-nouser": "Mengembalikan suntingan oleh (nama pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]",
-       "rollback-success": "Pembatalan suntingan oleh $1; dibatalkan ke versi terakhir oleh $2.",
+       "rollback-success": "Pembatalan suntingan oleh {{GENDER:$3|$1}}; dibatalkan ke versi terakhir oleh {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Mengembalikan suntingan oleh $1; rubah kembali untuk revisi terakhir oleh $2. [$3 Lihat perubahan]",
        "sessionfailure-title": "Kegagalan sesi",
        "sessionfailure": "Sepertinya ada masalah dengan sesi log Anda; log Anda telah dibatalkan untuk mencegah pembajakan. Silakan tekan tombol \"kembali\" dan muat kembali halaman sebelum Anda masuk, lalu coba lagi.",
        "undeleteviewlink": "lihat",
        "undeleteinvert": "Balikkan pilihan",
        "undeletecomment": "Alasan:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|revisi|revisi}} telah dikembalikan",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|revisi|revisi}} and $2 berkas dikembalikan",
-       "undeletedfiles": "$1 {{PLURAL:$1|berkas|berkas}} dikembalikan",
        "cannotundelete": "Beberapa pembatalan penghapusan gagal:\n$1",
        "undeletedpage": "'''$1 berhasil dikembalikan'''\n\nLihat [[Special:Log/delete|log penghapusan]] untuk data penghapusan dan pengembalian.",
        "undelete-header": "Lihat [[Special:Log/delete|log penghapusan]] untuk daftar halaman yang baru dihapus.",
        "unblocked-id": "Blokir $1 telah dicabut.",
        "unblocked-ip": "Pemblokiran [[Special:Contributions/$1|$1]] telah dicabut.",
        "blocklist": "Daftar pengguna yang diblokir",
+       "autoblocklist": "Pemblokiran otomatis",
+       "autoblocklist-submit": "Pencarian",
+       "autoblocklist-legend": "Daftar pemblokiran otomatis",
        "ipblocklist": "Daftar pemblokiran pengguna",
        "ipblocklist-legend": "Cari pengguna yang diblokir",
        "blocklist-userblocks": "Sembunyikan pemblokiran akun",
        "sorbs": "DNSBL",
        "sorbsreason": "Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL.",
        "sorbs_create_account_reason": "Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL. Anda tidak dapat membuat akun.",
+       "softblockrangesreason": "Kontribusi anonim tidak diizinkan dari alamat IP Anda ($1). Silakan masuk log.",
        "xffblockreason": "Sebuah alamat IP terdapat di kepala X-Forwarded-For, entah milik Anda atau peladen ''proxy'' yang Anda gunakan, telah diblokir. Alasan pemblokirannya adalah: $1",
        "cant-see-hidden-user": "Pengguna yang Anda coba blokir telah diblokir dan disembunyikan. Selama Anda tidak memiliki hak sembunyikan pengguna, Anda tidak dapat melihat atau menyunting pemblokiran pengguna ini.",
        "ipbblocked": "Anda tidak dapat memblokir atau membuka blokir pengguna lain, karena Anda sendiri diblokir.",
        "cant-move-to-user-page": "Anda tidak memiliki hak akses untuk memindahkan halaman ke suatu halaman pengguna (kecuali ke subhalaman pengguna).",
        "cant-move-category-page": "Anda tidak memiliki izin untuk memindahkan halaman kategori.",
        "cant-move-to-category-page": "Anda tidak memiliki izin untuk memindahkan halaman ke halaman kategori.",
+       "cant-move-subpages": "Anda tidak memiliki izin untuk memindahkan subhalaman",
+       "namespace-nosubpages": "Ruang nama \"$1\" tidak mengizinkan subhalaman.",
        "newtitle": "Judul baru:",
        "move-watch": "Pantau halaman ini",
        "movepagebtn": "Pindahkan halaman",
        "newimages-showbots": "Tampilkan unggahan oleh bot",
        "newimages-hidepatrolled": "Sembunyikan unggahan yang telah dipatroli",
        "noimages": "Tidak ada yang dilihat.",
+       "gallery-slideshow-toggle": "Beralih  ''thumbnails''",
        "ilsubmit": "Cari",
        "bydate": "berdasarkan tanggal",
        "sp-newimages-showfrom": "Tampilkan berkas baru dimulai dari $2, $1",
        "metadata-help": "Berkas ini mengandung informasi tambahan yang mungkin ditambahkan oleh kamera digital atau pemindai yang digunakan untuk membuat atau mendigitalisasi berkas. Jika berkas ini telah mengalami modifikasi, rincian yang ada mungkin tidak secara penuh merefleksikan informasi dari gambar yang sudah dimodifikasi ini.",
        "metadata-expand": "Tampilkan rincian tambahan",
        "metadata-collapse": "Sembunyikan rincian tambahan",
-       "metadata-fields": "Bidang metadata gambar yang tercantum dalam pesan ini akan dimasukkan pada tampilan halaman gambar ketika tabel metadata diciutkan.\nData lain akan disembunyikan secara bawaan.\n* pembuat\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* hak cipta\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "Bidang metadata gambar yang tercantum dalam pesan ini akan dimasukkan pada tampilan halaman gambar ketika tabel metadata diciutkan.\nData lain akan disembunyikan secara bawaan.\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",
        "metadata-langitem-default": "$1",
        "exif-imagewidth": "Lebar",
        "tag-filter": "Filter [[Special:Tags|tag]]:",
        "tag-filter-submit": "Penyaring",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
+       "tag-mw-contentmodelchange": "Perubahan model konten",
+       "tag-mw-contentmodelchange-description": "Perubahan yang [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel mengubah model konten] suatu halaman",
        "tags-title": "Tanda",
        "tags-intro": "Halaman ini berisi daftar tag yang dapat ditandai oleh perangkat lunak terhadap suatu suntingan berikut artinya.",
        "tags-tag": "Nama tag",
        "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-update-add-not-allowed-one": "Tag \"$1\"tidak diizinkan untuk ditambahkan secara manual.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|tag is|Tag ini}} tidak diizinkan untuk ditambahkan secara manual: $1",
+       "tags-update-remove-not-allowed-one": "Tag \"$1\" tidak diizinkan untuk dihapus.",
        "tags-edit-title": "Sunting tag",
        "tags-edit-manage-link": "Kelola tag",
        "tags-edit-revision-selected": "{{PLURAL:$1|Revisi terpilih|Revisi terpilih}} dari [[:$2]]:",
        "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-time-invalid": "Nilai yang Anda tentukan bukan waktu yang dikenali. Cobalah menggunakan format HH:MM:SS",
        "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-datetime-toolow": "Nilai yang Anda tentukan berada sebelum tanggal dan waktu paling awal yang diperbolehkan $1",
+       "htmlform-datetime-toohigh": "Nilai yang Anda masukan telah terlewati setelah tanggal dan waktu terakhir yang diperbolehkan $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.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|memperbarui}} tag pada revisi $4 dari halaman $3 ({{PLURAL:$7|menambahkan}} $6; {{PLURAL:$9|menghapus}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|memperbarui}} tag pada entri log $5 dari halaman $3 ({{PLURAL:$7|menambahkan}} $6; {{PLURAL:$9|menghapus}} $8)",
        "rightsnone": "(tidak ada)",
-       "revdelete-summary": "ringkasan",
+       "rightslogentry-temporary-group": "$1 (sementara, hingga $2)",
        "feedback-adding": "Menambahkan umpan balik ke halaman...",
        "feedback-back": "Kembali",
        "feedback-bugcheck": "Hebat! Hanya periksa bahwa itu bukan satu di antara [$1 bug yang telah dikenal].",
        "pagelang-language": "Bahasa",
        "pagelang-use-default": "Gunakan bahasa baku",
        "pagelang-select-lang": "Pilih bahasa",
+       "pagelang-reason": "Alasan",
        "pagelang-submit": "Kirim",
+       "pagelang-nonexistent-page": "Halaman $1 tidak tersedia",
+       "pagelang-unchanged-language": "Halaman $1 telah di atur ke bahasa $2",
+       "pagelang-unchanged-language-default": "Halaman $1 Telah diatur ke bahasa konten bawaan.",
+       "pagelang-db-failed": "Basis data gagal mengubah bahasa halaman",
        "right-pagelang": "Ubah bahasa halaman",
        "action-pagelang": "mengubah bahasa halaman",
        "log-name-pagelang": "Log perubahan bahasa",
        "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...",
+       "mw-widgets-usersmultiselect-placeholder": "Tambahkan lebih banyak...",
+       "date-range-from": "Dari tanggal",
+       "date-range-to": "Sampai tanggal",
        "sessionmanager-tie": "Tidak dapat menggabungkan banyak jenis otentikasi permintaan: $1.",
        "sessionprovider-generic": "sesi $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesi berdasarkan kuki",
        "sessionprovider-nocookies": "Kuki mungkin dimatikan. Pastikan Anda telah mengaktifkan kuki dan coba mulai kembali.",
        "randomrootpage": "Halaman dasar sembarang",
        "log-action-filter-block": "Jenis pemblokiran:",
-       "log-action-filter-contentmodel": "Jenis modifikasi modelkonten:",
+       "log-action-filter-contentmodel": "Jenis perubahan modelkonten:",
        "log-action-filter-delete": "Jenis penghapusan:",
        "log-action-filter-import": "Jenis impor:",
        "log-action-filter-managetags": "Jenis tindakan manajemen tag:",
        "authmanager-link-no-primary": "Kredensial yang diberikan tidak dapat digunakan untuk menautkan akun.",
        "authmanager-link-not-in-progress": "Penautan akun tidak dilanjutkan atau data sesi telah hilang. Ulang kembali dari awal.",
        "authmanager-authplugin-setpass-failed-title": "Penggantian kata sandi gagal",
+       "authmanager-authplugin-setpass-failed-message": "Plugin autentikasi mencegah pengubahan pasword.",
+       "authmanager-authplugin-create-fail": "Plugin autentikasi mencegah pembuatan akun.",
+       "authmanager-authplugin-setpass-denied": "Plugin autentikasi tidak memperbolehkan mengubah kata kunci.",
        "authmanager-authplugin-setpass-bad-domain": "Domain tidak sah.",
        "authmanager-autocreate-noperm": "Pembuatan akun otomatis tidak diizinkan.",
        "authmanager-autocreate-exception": "Pembuatan akun otomatis dimatikan sementara karena galat sebelumnya.",
index 476af2b..832a5a7 100644 (file)
        "login": "Aperter session",
        "login-security": "Verifica vor identitá",
        "nav-login-createaccount": "Crear un conto o intrar",
-       "userlogin": "Crear un conto o intrar",
-       "userloginnocreate": "Intrar",
        "logout": "Surtida",
        "userlogout": "Surtir",
        "notloggedin": "Vu ne ha intrat",
        "userlogin-noaccount": "Ne have un conto?",
        "userlogin-joinproject": "Adherer a {{SITENAME}}",
-       "nologin": "Ne have un conto? $1.",
-       "nologinlink": "Crear un conto",
        "createaccount": "Crear un conto",
-       "gotaccount": "Ja have un conto? $1.",
-       "gotaccountlink": "Intrar",
-       "userlogin-resetlink": "Obliviat tui detallies de registre?",
        "createacct-reason": "Motive",
        "createacct-benefit-body1": "{{PLURAL:$1|redaction|redactiones}}",
        "createacct-benefit-body2": "{{PLURAL:$1|págine|págines}}",
        "rcshowhidepatr-hide": "Ocultar",
        "rcshowhidemine": "$1 mi redactiones",
        "rcshowhidemine-show": "Monstrar",
-       "rclinks": "Monstrar li $1 ultim modificationes fat durante li $2 ultim dies<br />$3.",
+       "rclinks": "Monstrar li $1 ultim modificationes fat durante li $2 ultim dies",
        "diff": "dif",
        "hist": "hist",
        "hide": "Celar",
        "undeleteviewlink": "vider",
        "undeleteinvert": "Inverter selection",
        "undeletecomment": "Motive:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisiones}} restaurat",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisiones}} e {{PLURAL:$2|1 file|$2 files}} restaurat",
-       "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restaurat",
        "undeletedpage": "'''$1 ha esset restaurat'''\n\nConsulta li [[Special:Log/delete|diarium de deletion]] por un registre de deletiones nov e restaurationes.",
        "undelete-header": "Vider [[Special:Log/delete|li diarium de deletion]] por págines deletet currentmen.",
        "undelete-search-box": "Serchar págines deletet",
index 81b98c5..369a4f0 100644 (file)
        "yourdomainname": "Obí gi:",
        "login": "Banyé",
        "nav-login-createaccount": "Banyé / ké buwá",
-       "userlogin": "Banyé / ké buwá",
-       "userloginnocreate": "Banyé",
        "logout": "Fwuör",
        "userlogout": "Fwuör",
        "notloggedin": "I bátà bò",
-       "nologin": "I nwegị buwa? $1.",
-       "nologinlink": "ké otụ buwa",
        "createaccount": "Ké otụ buwa",
-       "gotaccount": "I nwerecha buwa? $1.",
-       "gotaccountlink": "Banyé",
        "createaccountmail": "na e-mail",
-       "createaccountreason": "Mgbaghaputa:",
        "badretype": "Mkpurụ okwu ejị a gafẹ é jëghị.",
        "userexists": "Áhè ọ'bànifé tírí di na áká onye ozor.\nBíkó nwèré áhà nke ozor.",
        "loginerror": "Nsogbu ngbe I choro I bata",
        "prefs-rendering": "Ọdịdị",
        "saveprefs": "Domá",
        "prefs-editing": "Írüwa",
-       "rows": "Ǹdịlị:",
-       "columns": "Ogìdì:",
        "searchresultshead": "Chọwa",
        "stub-threshold-disabled": "Ápụgị òkò",
        "timezonelegend": "Nkeji ogẹ:",
        "rcshowhideanons": "$1 ndi ọ'bànifé nke amághị",
        "rcshowhidepatr": "$1 orü hä lèrè",
        "rcshowhidemine": "$1 ihe m rürü",
-       "rclinks": "Zí nke mbu $1 gbawere na ubochi gárá nke $2<br />$3",
+       "rclinks": "Zí nke mbu $1 gbawere na ubochi gárá nke $2",
        "diff": "Íchè",
        "hist": "akíkómbu",
        "hide": "Zonari",
        "htmlform-selectorother-other": "Nke ozor",
        "revdelete-content-hid": "ihe zọ̀nàri",
        "rightsnone": "(efù)",
-       "revdelete-summary": "mmẹkotá orü",
        "feedback-close": "Ọméchá.",
        "feedback-message": "Ozi:",
        "searchsuggest-search": "Chọwa",
index e8f90af..36a7280 100644 (file)
@@ -35,9 +35,9 @@
        "tog-enotifwatchlistpages": "Esuratannak no mabaliwan ti panid wenno ti papeles iti listaan dagiti bambantayak",
        "tog-enotifusertalkpages": "Esuratannak no mabaliwan ti panid ti tungtungak",
        "tog-enotifminoredits": "Esuratannak pay para kadagiti bassit a panagurnos kadagiti panid ken papeles",
-       "tog-enotifrevealaddr": "Iparang ti pagtaengan ti esuratko iti panagipakaaammo kadagiti esurat",
+       "tog-enotifrevealaddr": "Iparang ti adres ti esuratko iti panagipakaaammo kadagiti esurat",
        "tog-shownumberswatching": "Ipakita ti bilang dagiti agbuybuya nga agar-aramat",
-       "tog-oldsig": "Ti adda a pirma:",
+       "tog-oldsig": "Ti adda a pirmam:",
        "tog-fancysig": "Tratuen ti pirma a kas wikitext (awanan iti automatiko a silpo)",
        "tog-uselivepreview": "Usaren ti agdama a panagipadas",
        "tog-forceeditsummary": "Pakaammuannak no sumrek iti blanko a pakabuklan ti panagurnos",
@@ -54,7 +54,7 @@
        "tog-showhiddencats": "Ipakita dagiti nailemmeng a kategoria",
        "tog-norollbackdiff": "Saan nga ipakita ti paggiddiatan kalpasan ti panagaramid ti panagisubli",
        "tog-useeditwarning": "Pakaunaannak no pumanawak iti maysa pagurnosan a panid nga addaan iti saan a naidulin a sinuksukatan",
-       "tog-prefershttps": "Kankanayon nga agusar ti natalged a koneksion no nakastrek",
+       "tog-prefershttps": "Kankanayon nga agusar iti natalged a koneksion bayat a nakastrek",
        "underline-always": "Kanayon",
        "underline-never": "Saan uray kaanoman",
        "underline-default": "Kudil wenno kasisigud a pagbasabasa",
        "newwindow": "(aglukat iti baro a tawa)",
        "cancel": "Ukasen",
        "moredotdotdot": "Adu pay...",
-       "morenotlisted": "Daytoy a listaan ket saan a kompleto.",
+       "morenotlisted": "Daytoy a listaan ket mabalin a saan a kompleto.",
        "mypage": "Panid",
        "mytalk": "Tungtungan",
        "anontalk": "Tungtungan",
        "returnto": "Agsubli iti $1.",
        "tagline": "Manipud iti {{SITENAME}}",
        "help": "Tulong",
-       "search": "Biruken",
+       "search": "Agbiruk",
        "search-ignored-headings": " #<!-- saan a kutkutien daytoy a linia --> <pre>\n# Dagiti paulo a saanto nga ikaskaso babaen ti panagbiruk.\n# Dagiti panagbalbaliw mabalinton intono ti panid nga addaan ti paulo ket maipasurotan.\n# Mabalinmo a piliten ti panangisurot manen iti panid babaen ti awan linaon a panagurnos.\n# Ti eskritu ket kasla dagiti sumaganad:\n#   * Amin manipud ti karater ti \"#\" aginggana ti gibus ti linia ket komentario.\n#   * Amin a saan a blanko a linia ket eksakto a titulo a saan nga maikaskaso, kadakkel ti letra ken amin.\nDagiti reperensia\nDagiti silpo ti ruar\nKitaen pay\n #</pre> <!-- saan a kutkutien daytoy a linia -->",
-       "searchbutton": "Biruken",
+       "searchbutton": "Agbiruk",
        "go": "Inkan",
        "searcharticle": "Inkan",
        "history": "Pakasaritaan ti panid",
        "history_short": "Pakasaritaan",
+       "history_small": "pakasaritaan",
        "updatedmarker": "napabaro sipud ti naudi nga isasarungkarko",
        "printableversion": "Bersion a maimaldit",
        "permalink": "Agnanayon a silpo",
        "talk": "Pagtungtungan",
        "views": "Dagiti pangkitaan",
        "toolbox": "Ramramit",
+       "tool-link-userrights": "Baliwan dagiti grupo ti {{GENDER:$1|agar-aramat}}",
+       "tool-link-userrights-readonly": "Kitaen dagiti grupo ti {{GENDER:$1|agar-aramat}}",
+       "tool-link-emailuser": "Esuratam daytoy nga {{GENDER:$1|agar-aramat}}",
        "userpage": "Kitaen ti panid ti agar-aramat",
        "projectpage": "Kitaen ti panid ti proyekto",
        "imagepage": "Kitaen ti panid ti papeles",
        "redirectedfrom": "(Naibaw-ing manipud iti $1)",
        "redirectpagesub": "Baw-ing a panid",
        "redirectto": "Naibaw-ing iti:",
-       "lastmodifiedat": "Daytoy a panid ket naudi a nabaliwan idi $1, $2.",
+       "lastmodifiedat": "Daytoy a panid ket naudi a naurnos idi $1, $2.",
        "viewcount": "Naserrekanen daytoy a panid {{PLURAL:$1|iti naminsan|kadagiti $1 a beses}}.",
        "protectedpage": "Nasalakniban a panid",
        "jumpto": "Lumaktaw idiay:",
        "jumptonavigation": "pagdaliasatan",
-       "jumptosearch": "biruken",
+       "jumptosearch": "agbiruk",
        "view-pool-error": "Pasensian, dagiti server ket nadagsenan unay iti agdama.\nAdu unay dagiti agar-aramat nga agpadpadas nga agbuya iti daytoy a panid.\nPangngaasi nga agurayka bassit sakbay a padasem manen a serrekan daytoy a panid.\n\n$1",
        "generic-pool-error": "Pasensian, dagiti server ket agdama a nadagsenan iti agdama.\nAdu unay dagiti agar-aramat nga agpadpadas nga agbuya iti daytoy a rekurso.\nPangngaasi nga agurayka bassit sakbay a padasem manen a serrekan daytoy a rekurso.",
        "pool-timeout": "Madamdama agur-uray para iti kandado",
        "readonly": "Narikepan ti database",
        "enterlockreason": "Agikabil ti rason para iti pannakarikep, mangiraman ti maysa a karkulo no kaanonto a malukatan",
        "readonlytext": "Ti database ket agdama a narikpan kadagiti baro a panagikabil ken panagbaliw, mabalin a gapu dagiti kadawyan a pagsimpa, kalpasanna a normalto nga agsubli.\n\nTi administrador ti sistema a nangrikep ket nangited iti daytoy a palawag: $1",
-       "missing-article": "Ti database ket saan a nakabiruk ti testo ti panid a mabirukanna koma, a nanaganan ti \"$1\" $2.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a baak a paggiddiatan wenno silpo ti pakasaritaan ti maysa panid a dati a naikkat.\n\nNo saan a kasta, mabalin a nakasarakka ti parikut ti sopwer.\n\nPangngaasi nga ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isuratmo ti pakaammo dayta nga URL.",
+       "missing-article": "Ti database ket saan a nakabiruk ti teksto ti panid a mabirukanna koma, a nanaganan ti \"$1\" $2.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a baak a paggiddiatan wenno silpo ti pakasaritaan ti maysa panid a dati a naikkat.\n\nNo saan a kasta, mabalin a nakasarakka ti parikut ti sopwer.\n\nPangngaasi nga ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isuratmo ti pakaammo dayta nga URL.",
        "missingarticle-rev": "(rebision#: $1)",
        "missingarticle-diff": "(Dip: $1, $2)",
        "readonly_lag": "Automatiko a narikpan ti database kabayatan a dagiti tagabu a server ti database ket kumamakam iti agturay",
        "login": "Sumrek",
        "login-security": "Pasingkedan ti identidadmo",
        "nav-login-createaccount": "Sumrek / agpartuat iti pakabilangan",
-       "userlogin": "Sumrek / agpartuat iti pakabilangan",
-       "userloginnocreate": "Sumrek",
        "logout": "Rummuar",
        "userlogout": "Rummuar",
        "notloggedin": "Saan a nakastrek",
        "userlogin-noaccount": "Awan ti pakabilangam?",
        "userlogin-joinproject": "Tumipon iti {{SITENAME}}",
-       "nologin": "Awan pakabilangam? $1.",
-       "nologinlink": "Agpartuat iti pakabilangan",
        "createaccount": "Agpartuat iti pakabilangan",
-       "gotaccount": "Addaanka kadin iti pakabilangan? $1.",
-       "gotaccountlink": "Sumrek",
-       "userlogin-resetlink": "Nalipatam dagiti salaysay ti panagserrekmo?",
        "userlogin-resetpassword-link": "Nalipatam ti kontraseniasmo?",
        "userlogin-helplink2": "Tulong iti panagserrek",
        "userlogin-loggedin": "Nakastrekkan a kas ni {{GENDER:$1|$1}}.\nUsaren ti porma dita baba tapno sumrek a kas sabali nga agar-aramat.",
        "userlogin-reauth": "Nasken a sumrekka manen tapno mapasingkedan a sika ni {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Agpartuat iti sabali a pakabilangan",
-       "createacct-emailrequired": "Esurat a pagtaengan",
-       "createacct-emailoptional": "Esurat a pagtaengan (pagpilian)",
+       "createacct-emailrequired": "Adres ti esurat",
+       "createacct-emailoptional": "Adres ti esurat (pagpilian)",
        "createacct-email-ph": "Ikabil ti esurat a pagtaengam",
-       "createacct-another-email-ph": "Ikabil ti esurat a pagtaengan",
-       "createaccountmail": "Agusar iti pugto a temporario a kontrasenias ken ipatulod iti naisangayan nga esurat a pagtaengan",
+       "createacct-another-email-ph": "Ikabil ti adres ti esurat",
+       "createaccountmail": "Agusar iti pugto a temporario a kontrasenias ken ipatulod iti nainaganan nga adres ti esurat",
        "createaccountmail-help": "Mabalin a mausar a panagpartuat ti pakabilangan para iti sabali a tao a saan a makaammo iti kontrasenias.",
        "createacct-realname": "Pudno a nagan (pagpilian)",
-       "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-reason-ph": "Apay nga agparpartuatka manen iti sabali a pakabilangan",
        "createacct-reason-help": "Ti mensahe a naipakita iti listaan iti panagpartuat ti pakabilangan",
        "passwordtooshort": "Dagiti kontrasenias ket nasken a saan a basbasit ngem {{PLURAL:$1|1 a karakter|$1 a karkarakter}}.",
        "passwordtoolong": "Dagiti kontrasenias ket nasken a saan nga at-atiddog ngem {{PLURAL:$1|1 a karakter|$1 a karkarakter}}.",
        "passwordtoopopular": "Saan a mabalin a mausar dagiti kadawyan a mapilpili a kontrasenias. Pangngaasi nga agpili iti naisangsangayan a kontrasenias.",
-       "password-name-match": "Nasken a ti kontrasenias ket maigiddiat manipud ti naganmo.",
+       "password-name-match": "Nasken a ti kontrasenias ket maigiddiat manipud iti naganmo.",
        "password-login-forbidden": "Naipariten ti panagusar iti daytoy a nagan ti agar-aramat ken kontrasenias.",
        "mailmypassword": "Isaad manen ti kontrasenias",
        "passwordremindertitle": "Baro a temporario a kontrasenias para iti {{SITENAME}}",
-       "passwordremindertext": "Adda maysa a tao (mabalin a sika met laeng, manipud iti IP a pagtaengan a $1) ket nagkiddaw iti baro a kontrasenias para iti {{SITENAME}} ($4). Ti temporario a kontrasenias para kenni agar-aramat \"$2\" ket napartuaten ken naisaad iti \"$3\". No kastan ti kinayatmo, nasken itan a sumrekka ken agpili iti baro a kontrasenias.\nTi temporario a kontraseniasmo ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\n\nNo sabali ti nagkiddaw, wenno nalagipmon ti kontraseniasmo,\nken dimo kayaten a sukatan daytoy, mabalinmo a di ikaskaso daytoy a mensahe ken agtuloy nga usaren ti daan a kontraseniasmo.",
-       "noemail": "Awan ti esurat a pagtaengan a nairehistro para kenni agar-aramat \"$1\".",
-       "noemailcreate": "Nasken a mangitedka ti pudno nga esurat a pagtaengan.",
-       "passwordsent": "Naipatuloden ti baro a kontrasenias iti esurat a pagtaengan a nairehistro kenni \"$1\".\nPangngaasi a sumrekka manen kalpasan ti pannakaawatmo.",
+       "passwordremindertext": "Adda maysa a tao (mabalin a sika met laeng, manipud iti adres ti IP ti $1) ket nagkiddaw iti baro a kontrasenias para iti {{SITENAME}} ($4). Ti temporario a kontrasenias para kenni agar-aramat \"$2\" ket napartuaten ken naisaad iti \"$3\". No kastan ti kinayatmo, nasken itan a sumrekka ken agpili iti baro a kontrasenias.\nTi temporario a kontraseniasmo ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\n\nNo sabali ti nagkiddaw, wenno nalagipmon ti kontraseniasmo,\nken dimo kayaten a sukatan daytoy, mabalinmo a di ikaskaso daytoy a mensahe ken agtuloy nga usaren ti daan a kontraseniasmo.",
+       "noemail": "Awan ti adres ti esurat a nairehistro para kenni agar-aramat \"$1\".",
+       "noemailcreate": "Nasken a mangitedka iti umiso nga adres ti esurat.",
+       "passwordsent": "Naipatuloden ti baro a kontrasenias iti adres ti esurat a nairehistro kenni \"$1\".\nPangngaasi a sumrekka manen kalpasan iti pannakaawatmo.",
        "blocked-mailpassword": "Ti adresmo ti IP ket naserraan manipud iti panagurnos. Tapno mapawilan ti panagabuso, saan a maipalubos ti agusar ti panagipulang ti kontrasenias manipud iti daytoy nga adres ti IP.",
-       "eauthentsent": "Naipatuloden ti pammatalged nga esurat iti naikeddeng nga esurat a pagtaengan.\nSakbay a maipatulod ti ania man nga esurat iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapatalgedan ti pakabilangan ket agpayso a kukuam.",
+       "eauthentsent": "Naipatuloden ti pammatalged nga esurat iti naikeddeng nga adres ti esurat.\nSakbay a maipatulod ti ania man nga esurat iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapatalgedan ti pakabilangan ket agpayso a kukuam.",
        "throttled-mailpassword": "Ti panangisaad manen ti kontrasenias ket naipatuloden, iti kaunegan ti napalabas  {{PLURAL:$1|nga oras|a $1 nga or-oras}}.\nTapno maipawilan ti panagabuso, maysa laeng a panangisaad manen ti kontrasenias ti maipatulod iti tunggal {{PLURAL:$1|maysa nga oras|$1 nga or-oras}}.",
        "mailerror": "Biddut iti panangipatulod ti surat: $1",
-       "acct_creation_throttle_hit": "Dagiti sumarungkar iti daytoy a wiki nga agus-usar ti IP a pagtaengan ket nakapartuat {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} iti nasakbayan nga aldaw, nga isu laeng ti kaadu a maipalubos iti daytoy a paset ti panawen.\nA kas ti nagbanagan, dagiti agsarsarungkar nga agus-usar ti IP a pagtaengan ket agdama a saanda a mabalin a makapartuat kadagiti pakabilangan.",
+       "acct_creation_throttle_hit": "Dagiti sumarungkar iti daytoy a wiki nga agus-usar iti adres ti IP ket nakapartuat {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} iti nasakbayan nga $2 nga isu laeng ti kaadu a maipalubos iti daytoy a paset ti panawen.\nA kas ti nagbanagan, dagiti agsarsarungkar nga agus-usar iti adres ti IP ket agdama a saanda a mabalin a makapartuat kadagiti pakabilangan.",
        "emailauthenticated": "Ti esurat a pagtaengam ket napatalgedan idi $2, $3.",
-       "emailnotauthenticated": "Saan pay a napatalgedan ti esuratmo a pagtaengan.\nAwanto ti esurat a maipatulod para kadagiti sumaganad a langa.",
-       "noemailprefs": "Ipanaganan ti esurat a pagtaengan tapno agbalin dagitoy a langa.",
+       "emailnotauthenticated": "Saan pay a napatalgedan ti adres ti esuratmo.\nAwanto ti esurat a maipatulod para kadagiti sumaganad a langa.",
+       "noemailprefs": "Manginagan iti maysa nga adres ti esurat tapno agbalin dagitoy a langa.",
        "emailconfirmlink": "Pasingkedam ti esurat a pagtaengam",
-       "invalidemailaddress": "Ti esurat a pagtaengan ket saan a maawat ngamin ket kasla adda ti saan a napudno a porma.\nPangngaasi nga agikabil ti nasayaat a porma ti pagtaengan wenno ikkaten amin a naikabil.",
-       "cannotchangeemail": "Dagiti pakabilangan nga esurat a pagtaengan ket saan a mabaliwan iti daytoy a wiki.",
+       "invalidemailaddress": "Ti adres ti esurat ket saan a maawat ngamin ket kasla adda ti saan a napudno a pormat.\nPangngaasi nga agikabil ti nasayaat a pormat ti adres wenno ikkaten amin a naikabil.",
+       "cannotchangeemail": "Dagiti pakabilangan nga adres ti esurat ket saan a mabaliwan iti daytoy a wiki.",
        "emaildisabled": "Daytoy a sitio ket saan a makaipatulod kadagiti esurat.",
        "accountcreated": "Napartuaten ti pakabilangan",
        "accountcreatedtext": "Ti pakabilangan ti agar-aramat para kenni [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tungtungan]]) ket napartuaten.",
        "pt-createaccount": "Agpartuat iti pakabilangan",
        "pt-userlogout": "Rummuar",
        "php-mail-error-unknown": "Di ammo a biddut iti surat ti annong ti PHP().",
-       "user-mail-no-addy": "Pinadas nga inpatulod ti esurat nga awan ti maysa nga esurat a pagtaengan.",
+       "user-mail-no-addy": "Pinadas nga inpatulod ti esurat nga awan ti maysa nga adres ti esurat.",
        "user-mail-no-body": "Pinadas nga inpatulod ti esurat nga awan ti maysa a linaonna wenno ababa unay a bagi.",
        "changepassword": "Baliwan ti kontrasenias",
        "resetpass_announce": "Tapno malpas ti panagserrek, nasken a mangisaadka iti baro a kontrasenias.",
        "changepassword-success": "Nasukatanen ti kontraseniasmo!",
        "changepassword-throttled": "Nakaaramidka kadagiti adu unay a nabiit a panangipadas ti panagserrek.\nPangngaasi nga aguray iti $1 sakbay a padasen manen.",
        "botpasswords": "Dagiti kontrasenias ti bot",
-       "botpasswords-summary": "<em>Dagiti kontrasenias ti bot</em> ket mangpalubos a maserrekan ti pakabilangan ti agar-aramat babaen ti API a saan nga agusar kadagiti nangruna a kredensial ti pakabilangan. Dagiti magun-od a karbengan ti agar-aramat no nakastrek iti kontrasenias ti bot ket mabalin a nagawidan.\n\nNo saanmo nga ammo no apay a kayatmo nga aramiden daytoy, mabalin a saanmo koma nga aramiden daytoy. Awan koma ti mangdamag kaniam iti agpataud iti maysa kadagitoy ken itedmo kaniada.",
+       "botpasswords-summary": "<em>Dagiti kontrasenias ti bot</em> ket mangipalubos a maserrekan ti pakabilangan ti agar-aramat babaen ti API a saan nga agusar kadagiti nangruna a kredensial ti pakabilangan. Dagiti magun-od a karbengan ti agar-aramat no nakastrek iti kontrasenias ti bot ket mabalin a nagawidan.\n\nNo saanmo nga ammo no apay a kayatmo nga aramiden daytoy, mabalin a saanmo koma nga aramiden daytoy. Awan koma ti mangdamag kaniam iti agpataud iti maysa kadagitoy ken itedmo kaniada.",
        "botpasswords-disabled": "Nabaldado dagiti kontrasenias ti bot.",
        "botpasswords-no-central-id": "Ti agusar kadagiti kontrasenias ti bot, nasken a nakastrekka iti sentralisado a pakabilangan.",
        "botpasswords-existing": "Dagiti adda a kontrasenias ti bot",
        "passwordreset-emaildisabled": "Dagiti langa ti esurat ket nabaldado iti daytoy a wiki.",
        "passwordreset-username": "Nagan ti agar-aramat:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-email": "Esurat a pagtaengan:",
+       "passwordreset-email": "Adres ti esurat:",
        "passwordreset-emailtitle": "Dagiti salaysay ti pakabilangan iti {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti maysa a panangisaad manen ti kontrasenias para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloyka nga agusar ti daan a kontrasenias.",
-       "passwordreset-emailtext-user": "Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangisaad manen ti bukod a kontrasenias para iti {{SITENAME}}\n($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ken saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloykan nga agusar ti daan a kontraseniasmo.",
+       "passwordreset-emailtext-ip": "Adda (baka sika, ti naggapuan ti adres ti IP ti $1) a nagkiddaw iti maysa a panangisaad manen ti kontrasenias para iti {{SITENAME}} ($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga adres ti esurat:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika iti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloyka nga agusar iti daan a kontrasenias.",
+       "passwordreset-emailtext-user": "Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangisaad manen ti bukod a kontrasenias para iti {{SITENAME}}\n($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga adres ti esurat:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ken saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloykan nga agusar ti daan a kontraseniasmo.",
        "passwordreset-emailelement": "Nagan ti agar-aramat: \n$1\n\nTemporario a kontrasenias: \n$2",
        "passwordreset-emailsentemail": "No daytoy nga adres ti esurat ket mainaig iti pakabilangam, maipatulodto ti maysa nga esurat iti panangisaad manen ti kontrasenias.",
        "passwordreset-emailsentusername": "No adda adres ti esurat a mainaig iti daytoy a nagan ti agar-aramat, addanto maipatulod nga esurat iti panangisaad manen ti kontrasenia.",
        "changeemail": "Sukatan wenno ikkaten ti adres ti esurat",
        "changeemail-header": "Kompletuen daytoy a porma tapno masukatan ti adres ti esuratmo. No kayatmo a maikkat ti pannakainaig iti ania man nga adres ti esurat manipud iti pakabilangam, ibati a blanko ti baro nga adres ti esurat no ited ti porma.",
        "changeemail-no-info": "Masapul a nakastrekka tapno dagus a makapan iti ditoy a panid.",
-       "changeemail-oldemail": "Agdama nga esurat a pagtaengan:",
-       "changeemail-newemail": "Baro nga esurat a pagtaengan:",
+       "changeemail-oldemail": "Agdama nga adres ti esurat:",
+       "changeemail-newemail": "Baro nga adres ti esurat:",
        "changeemail-newemail-help": "Daytoy a pagikabilan ket nasken a blanko no kayatmo a maikkat ti adres ti esuratmo. Saanmonto a mabalin ti mangisaad manen ti nalipatan a kontrasenias ken saankanto a makaawat kadagiti esurat manipud iti daytoy a wiki no maikkat ti adres ti esurat.",
        "changeemail-none": "(awan)",
        "changeemail-password": "Ti bukodmo a kontrasenias ti {{SITENAME}}:",
        "changeemail-throttled": "Adu unay ti panagpadasmo a sumrek.\nPangngaasi nga aguray ti $1 sakbay a padasen manen.",
        "changeemail-nochange": "Pangngaasi nga agikabil iti sabali a baro nga adres ti esurat.",
        "resettokens": "Isaad manen dagiti tandaan",
-       "resettokens-text": "Mabalinmo nga isaad manen dagiti tandaan a mangpalubos ti panagserrek ti naisangayan a pribado datos a mainaig ti pakabilangam ditoy.\n\nAramidem daytoy no aksidente nga inbingaymo dagitoy iti sabali wenno ti pakabilangam ket nakomprimiso.",
+       "resettokens-text": "Mabalinmo nga isaad manen dagiti tandaan a mangipalubos ti panagserrek iti naisangayan a pribado datos a mainaig iti pakabilangam ditoy.\n\nAramidem daytoy no aksidente nga inbingaymo dagitoy iti sabali wenno ti pakabilangam ket nakomprimiso.",
        "resettokens-no-tokens": "Awan dagiti maisaad manen a tandaan.",
        "resettokens-tokens": "Dagiti tandaan:",
        "resettokens-token-label": "$1 (agdama a pateg: $2)",
        "preview": "Ipadas",
        "showpreview": "Ipakita ti ipadas",
        "showdiff": "Ipakita dagiti binaliwan",
-       "blankarticle": "<strong>Ballaag:</strong> Ti panid a parpatuatem ket blanko.\nNo pindutem manen ti \"{{int:savearticle}}\", ti panid ket mapartuatto nga awan ti ania man a linaon.",
-       "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek. Ti IP a pagtaengan ket publikonto a makita nga agaramidka iti ania man a panagurnos. No <strong>[$1 sumrekka]</strong> wenno <strong>[$2 agpartuatka iti pakabilangan]</strong>, dagiti inurnosmo ket maitunosto iti naganmo nga agar-aramat, ken dagiti dadduma pay a pagimbagan.",
+       "blankarticle": "<strong>Ballaag:</strong> Ti panid a parpatuatem ket blanko.\nNo pindutem manen ti \"$1\", ti panid ket mapartuatto nga awan ti ania man a linaon.",
+       "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek. Ti adres ti IP ket publikonto a makita nga agaramidka kadagiti ania man a panagurnos. No <strong>[$1 sumrekka]</strong> wenno <strong>[$2 agpartuatka iti pakabilangan]</strong>, dagiti inurnosmo ket maitunosto iti naganmo nga agar-aramat, ken dagiti dadduma pay a pagimbagan.",
        "anonpreviewwarning": "<em>Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a pakasaritaan ti panagurnos iti daytoy a panid.</em>",
-       "missingsummary": "<strong>Palagip:</strong> Saanka a nakaited iti pakabuklan ti panagurnos.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
-       "selfredirect": "<strong>Ballaag:</strong> Ibawbaw-ingmo daytoy a panid iti isu met laeng a panid.\nMabalinmo nga innaganan ti kamali a puntaan para iti baw-ing, wenno mabalin nga ur-urnosem ti kamali a panid.\nNo pindutem manen ti \"{{int:savearticle}}\" , mapartuatto lattan ti baw-ing.",
+       "missingsummary": "<strong>Palagip:</strong> Saanka a nakaited iti pakabuklan ti panagurnos.\nNo pindutem manen ti \"$1\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
+       "selfredirect": "<strong>Ballaag:</strong> Ibawbaw-ingmo daytoy a panid iti isu met laeng a panid.\nMabalinmo nga innaganan ti kamali a puntaan para iti baw-ing, wenno mabalin nga ur-urnosem ti kamali a panid.\nNo pindutem manen ti \"$1\" , mapartuatto lattan ti baw-ing.",
        "missingcommenttext": "Pangngaasi nga agikabil ti komentario dita baba.",
-       "missingcommentheader": "<strong>Palagip:</strong> Saanka pay a nakaited iti suheto para iti daytoy a komentario.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulinto ti inurnosmo nga awan ti pakabuklanna.",
-       "summary-preview": "Naipadas a pakabuklan:",
-       "subject-preview": "Naipadas a suheto:",
+       "missingcommentheader": "<strong>Palagip:</strong> Saanka pay a nakaited iti suheto para iti daytoy a komentario.\nNo pindutem manen ti \"$1\", maidulinto ti inurnosmo nga awan ti pakabuklanna.",
+       "summary-preview": "Panangipadas ti pakabuklan ti panagurnos:",
+       "subject-preview": "Panangipadas ti suheto:",
        "previewerrortext": "Adda napasamak a maysa a biddut bayat a nagpadpadas kadagiti binawbaliwam.",
        "blockedtitle": "Naseraan ti agar-aramat",
-       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti IP a pagtaengam.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
-       "autoblockedtext": "Ti IP a pagtaengam ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga esurat a pagtaengan a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panagusar daytoy.\n\nTi tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
+       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti adres ti IP.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga adres ti esurat a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga adres ti IP ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
+       "autoblockedtext": "Ti bukodmo nga adres ti IP ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga adres ti esurat a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panagusar daytoy.\n\nTi agdama a bukodmo nga adres ti IP ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
        "blockednoreason": "awan ti naited a rason",
        "whitelistedittext": "Pangngaasi a $1 tapno makaurnos kadagiti panid.",
        "confirmedittext": "Masapul a pasingkedam ti esurat sakbay a makaurnos kadagitoy a panid.\nPangngaasi nga isaad ken ipapudnom ti esuratmo babaen ti [[Special:Preferences|kakaykayatan ti agar-aramat]].",
        "accmailtext": "Ti pugto a napartuat a kontrasenias para kenni [[User talk:$1|$1]] ket naipatuloden iti $2. Mabalin a masukatan iti\n<em>[[Special:ChangePassword|pagsukatan ti kontrasenias]]</em> a panid no sumrekka.",
        "newarticle": "(Baro)",
        "newarticletext": "Nasurotmo ti silpo ti awan pay a panid. \nTi mangpartuat ti panid, rugiamon ti agmakinilia iti kahon dita baba (kitaen ti [$1 panid ti tulong] para iti adu pay a pakaammo). \nNo addaka ditoy babaen ti biddut, pindutem ti buton ti <strong>back</strong> ti pagbasabasam.",
-       "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat iti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero nga IP a pagtaengan tapno mailasin isuda a lalaki/babai.\nTi kastoy nga IP a pagtaengan ket us-usaren a bingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:CreateAccount|agpartuatka iti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
+       "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat iti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero ti adres ti IP tapno mailasin isuda a lalaki/babai.\nTi kastoy nga adres ti IP ket us-usaren a pagbibingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:CreateAccount|agpartuatka iti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
        "noarticletext": "Awan ti agdama a teksto iti daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk iti kastoy a titulo ti panid]] kadagiti sabali a panid,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan],\nwenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} partuaten daytoy a panid]</span>.",
        "noarticletext-nopermission": "Awan ti agdama  a linaon daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk para iti titulo ti daytoy a panid]] kadagiti sabali a panid, wenno <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan]</span>, ngem awan ti pammalubosmo a mangpartuat iti daytoy a panid.",
        "missing-revision": "Ti panagbalbaliw ti #$1 iti daytoy a panid a nanaganan ti \"{{FULLPAGENAME}}\" ket awan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a silpo ti baak a pakasaritaan iti maysa a naikkaten a panid.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "previewnote": "<strong>Laglagipem a daytoy ket panagipadas laeng.</strong>\nDagiti sinukatam ket saan pay a naidulin!",
        "continue-editing": "Mapan idiay pagurnosan a lugar",
        "previewconflict": "Daytoy a panagpadas ket mangipakita ti teksto iti lugar ti akinngato a pangurnosan ti teksto a kasla agparang no piliem nga idulin.",
-       "session_fail_preview": "Pasensia! Saanmi a maproseso ti panagurnosmo gapu ta naawanan ti sesion ti datos.\n\nMabalin a nakaruarka. <strong>Pangngaasi a pasingkedan a nakastrekka pay laeng ken padasen manen</strong>.\n \t\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen, ken kitaen no ti pagbasabasam ket mangpalubos kadagiti galieta manipud iti daytoy a sitio.",
-       "session_fail_preview_html": "Pasensia! Saanmi a maproseso ti panagurnosmo gapu ta naawanan ti sesion ti datos.\n\n<em>Gapu ta ti {{SITENAME}} ket addaan iti naata a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti panagraut iti dakes a JavaScript.</em>\n\n<strong>No daytoy ket pudno a panagurnos, pangngaasi a padasem manen.</strong>\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen, ken kitaen no ti pagbasabasam ket mangpalubos kadagiti galieta manipud iti daytoy a sitio.",
+       "session_fail_preview": "Pasensia! Saanmi a maproseso ti panagurnosmo gapu ta naawanan ti sesion ti datos.\n\nMabalin a nakaruarka. <strong>Pangngaasi a pasingkedan a nakastrekka pay laeng ken padasen manen</strong>.\n \t\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen, ken kitaen no ti pagbasabasam ket mangipalubos kadagiti galieta manipud iti daytoy a sitio.",
+       "session_fail_preview_html": "Pasensia! Saanmi a maproseso ti panagurnosmo gapu ta naawanan ti sesion ti datos.\n\n<em>Gapu ta ti {{SITENAME}} ket addaan iti naata a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti panagraut iti dakes a JavaScript.</em>\n\n<strong>No daytoy ket pudno a panagurnos, pangngaasi a padasem manen.</strong>\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen, ken kitaen no ti pagbasabasam ket mangipalubos kadagiti galieta manipud iti daytoy a sitio.",
        "token_suffix_mismatch": "<strong>Ti panagurnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna dagiti karakter ti tuldek iti tandaan ti panagurnos.</strong>\nTi panagurnos ket saan a naawat tapno mapawilan ti pannakadadael ti teksto ti panid.\nSagpaminsan a mapasamak daytoy no agus-usarka ti saan a nasayaat a naibatay ti web ti di ammo a pannakbagi a serbisio.",
        "edit_form_incomplete": "<strong>Adda dagiti paset ti pagurnosan a porma a saan a nakadanon dita server; mamindua a kitaen dagiti panagurnosmo ket sibubukel ken padasen manen.</strong>",
        "editing": "Ur-urnosen ti $1",
        "editingsection": "Ur-urnosen ti $1 (seksion)",
        "editingcomment": "Ur-urnosen ti $1 (baro a seksion)",
        "editconflict": "Agsinnungat a panagurnos: $1",
-       "explainconflict": "Adda sabali a nagsukat iti daytoy a panid idi nangrugika a nagurnos.\nTi akinngato a lugar ti teksto ket aglaon ti teksto ti panid iti agdama kaaddana.\nDagiti sinukatam ket maipakita iti akinbaba a lugar ti teksto.\nNasken nga itiponmonto dagiti sinukatam iti adda a teksto.\nTi <strong>laeng</strong> teksto iti akinngato a lugar ti teksto ti maidulinto no talmegam ti \"{{int:savearticle}}\".",
+       "explainconflict": "Adda sabali a nagsukat iti daytoy a panid idi nangrugika a nagurnos.\nTi akinngato a lugar ti teksto ket aglaon ti teksto ti panid iti agdama kaaddana.\nDagiti sinukatam ket maipakita iti akinbaba a lugar ti teksto.\nNasken nga itiponmonto dagiti sinukatam iti adda a teksto.\nTi <strong>laeng</strong> teksto iti akinngato a lugar ti teksto ti maidulinto no talmegam ti \"$1\".",
        "yourtext": "Ti tekstom",
        "storedversion": "Rebision a naidulin",
        "nonunicodebrowser": "<strong>Ballaag: Ti pabasabasam ket saan a maitunos iti Unicode .</strong>\nAdda sabali a mausar tapno makaurnoska kadagiti panid: Ti saan nga-ASCII a karakter ket agparang iti pagurnosan a kahon a kas dagiti heksadesimal a kodigo.",
        "copyrightwarning2": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket mabalin a maurnos, mabaliwan, wenno ikkaten dagiti sabali a kontributor.\nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud iti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan. (kitaen ti $1 para kadagiti salaysay).\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
        "editpage-cannot-use-custom-model": "Saan a mabaliwan ti modelo ti linaon iti daytoy a panid.",
        "longpageerror": "<strong>Biddut: Ti teksto nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kilkilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kilkilobyte}}.</strong>\nSaan a mabalin a maidulin.",
-       "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador ti sistema a nangrikep ket nangited iti daytoy a palawag: $1",
+       "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti tekstom iti papeles ti teksto ken idulinmo daytoy intono madamdama.\n\nTi administrador ti sistema a nangrikep ket nangited iti daytoy a palawag: $1",
        "protectedpagewarning": "<strong>Ballaag: Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ditoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "cascadeprotectedwarning": "<strong>Ballaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos gapu ta nailak-am {{PLURAL:$1|iti sumaganad a panid|kadagiti sumaganad a panid}} a nasalakniban iti sariap:",
        "post-expand-template-argument-warning": "<strong>Ballaag:</strong> Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panangipalawag ti plantilia a dakkel unay ti panagpadakkelna.\nDagitoy nga argumento ket saanen a nairaman.",
        "post-expand-template-argument-category": "Pampanid a naglaon kadagiti saan a nairaman nga argumento ti plantilia",
        "parser-template-loop-warning": "Nakaduktal iti silo ti plantilia: [[$1]]",
+       "template-loop-category": "Pampanid nga agraman kadagiti silo ti plantilia",
        "parser-template-recursion-depth-warning": "Nalabsan ti patingga ti panagdullit ti kinauneg ti plantilia ($1)",
        "language-converter-depth-warning": "Nalabsan ti patingga ti pagbaliwen a kinauneg ti pagsasao ($1)",
        "node-count-exceeded-category": "Dagiti panid a nakasurokan ti bilang ti nodo",
        "parser-unstrip-loop-warning": "Nakaduktal ti di-naukisan a silo",
        "parser-unstrip-recursion-limit": "Nalabsan ti patingga ti panagdullit ti di-naukisan ($1)",
        "converter-manual-rule-error": "Adda biddut a naduktalan iti manual nga alagaden ti panagbalbaliw ti pagsasao",
-       "undo-success": "Ti panag-urnos ket saan a maisubli.\nPangngaasi a kitaen ti panangipada dita baba tapno maammuan no daytoy ti kayatmo nga aramiden, ken kalpasanna idulin dagiti sinukatan dita baba tapno malpas ti panagsubli ti inurnos.",
+       "undo-success": "Mabalin a maisubli ti panagurnos.\nPangngaasi a kitaen ti panangiyasping dita baba tapno maammuan no daytoy ti kayatmo nga aramiden, ken kalpasanna idulin dagiti sinukatan dita baba tapno malpas ti panangisubli ti inurnos.",
        "undo-failure": "Ti inurnos ket saan a maipasubli gapu ta adda dagiti nakisinnungat a patingnga a naurnos.",
        "undo-norev": "Saan a maibabawi ti naurnos ngamin ket awan daytoy wenno mabalin a naikkaten.",
        "undo-nochange": "Ti inurnos ket kasla naibabawin.",
        "undo-summary": "Ibabawi ti $1 a binaliwan babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]])",
        "undo-summary-username-hidden": "Isubli ti $1 a binaliwan babaen ti nailemmeng nga agar-aramat",
-       "cantcreateaccount-text": "Ti panagpartuat iti pakabilangan manipud ti daytoy nga IP a pagtaengan (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
-       "cantcreateaccount-range-text": "Ti panagpartuat iti pakabilangan manipud kadagiti pagtaengan ti IP iti sakop ti <strong>$1</strong>, a mairaman ti IP a pagtaengam (<strong>$4</strong>), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
+       "cantcreateaccount-text": "Ti panagpartuat iti pakabilangan manipud iti daytoy nga adres ti IP (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
+       "cantcreateaccount-range-text": "Ti panagpartuat iti pakabilangan manipud kadagiti adres ti IP iti sakop ti <strong>$1</strong>, a mairaman ti adres ti IP (<strong>$4</strong>), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
        "viewpagelogs": "Kitaen dagiti listaan para iti daytoy a panid",
        "nohistory": "Awan ti pakasaritaan ti panagurnos iti daytoy a panid.",
        "currentrev": "Kinaudi a rebision",
        "page_first": "umuna",
        "page_last": "naudi",
        "histlegend": "Panagpili ti diperensia: Markaan dagiti kahon ti radio kadagiti rebision tapno maipada ken pinduten ti enter wenno ti buton dita baba.<br />\nLeyenda: <strong>({{int:cur}})</strong> = naggidiatan ti kinaudi a rebision, <strong>({{int:last}})</strong> = naggidiatan ti sarsarunuen a rebision, <strong>{{int:minoreditletter}}</strong> = bassit nga urnos.",
-       "history-fieldset-title": "Agbasabasa iti pakasaritaan",
-       "history-show-deleted": "Naikkat laeng",
+       "history-fieldset-title": "Agbiruk para kadagiti rebision",
+       "history-show-deleted": "Naikkat laeng ti rebision",
        "histfirst": "kadaanan",
        "histlast": "kabaruan",
        "historysize": "({{PLURAL:$1|1 byte|dagiti $1 a byte}})",
        "rev-deleted-comment": "(naikkat ti pakabuklan ti inurnos)",
        "rev-deleted-user": "(naikkat ti nagan ti agar-aramat)",
        "rev-deleted-event": "(naikkat ti listaan dagiti salaysay)",
-       "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno IP a pagtaengan - ti inurnos ket nailemmeng manipud kadagiti kontribusion]",
+       "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno adres ti IP - nailemmeng ti inurnos manipud kadagiti kontribusion]",
        "rev-deleted-text-permission": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "rev-suppressed-text-permission": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabalin a mabirukan iti [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
        "rev-deleted-text-unhide": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].\nMabalinmo pay a [$1 makita daytoy a rebision] no kayatmo ti agtuloy.",
        "revdelete-hide-image": "Ilemmeng ti linaon ti papeles",
        "revdelete-hide-name": "Ilemmeng ti puntaan ken dagiti parametro",
        "revdelete-hide-comment": "Pakabuklan ti inurnos",
-       "revdelete-hide-user": "Nagan ti agar-amat/IP a pagtaengan ti editor",
+       "revdelete-hide-user": "Nagan ti agar-amat/adres ti IP ti editor",
        "revdelete-hide-restricted": "Depdepen ti datos manipud kadagiti administrador ken dagiti pay sabali",
        "revdelete-radio-same": "(saan a sukatan)",
        "revdelete-radio-set": "Nailemmeng",
        "searchprofile-advanced-tooltip": "Agbirukka kadagiti naiduma a nagan ti espasio",
        "search-result-size": "$1 ({{PLURAL:$2|iti 1 a balikas|kadagiti $2 a balikas}})",
        "search-result-category-size": "{{PLURAL:$1|1 a kameng| dagiti $1 a kameng}} ({{PLURAL:$2|1 a subkategoria|dagiti $2 a subkategoria}}, {{PLURAL:$3|1 a papeles|dagiti $3 a papeles}})",
-       "search-redirect": "(baw-ing $1)",
+       "search-redirect": "(baw-ing manipud iti $1)",
        "search-section": "(seksion $1)",
        "search-category": "(kategoria $1)",
        "search-file-match": "(maipada ti linaon a papeles)",
        "search-interwiki-caption": "Dagiti kakabsat a proyekto",
        "search-interwiki-default": "Dagiti resulta manipud iti $1:",
        "search-interwiki-more": "(adu pay)",
+       "search-interwiki-more-results": "adu pay a resresulta",
        "search-relatedarticle": "Mainaig",
        "searchrelated": "mainaig",
        "searchall": "amin",
        "search-external": "Akinruar a panagbiruk",
        "searchdisabled": "Nabaldado ti panagbiruk iti {{SITENAME}}.\nMabalinmo itan ti agbiruk iti Google.\nLaglagipem laeng a dagiti pagsurotan a linaon ti {{SITENAME}} ket mabalin a baak.",
        "search-error": "Adda napasamak a biddut bayat nga agbirbiruk: $1",
+       "search-warning": "Adda napasamak a ballaag bayat nga agbirbiruk: $1",
        "preferences": "Kakaykayatan",
        "mypreferences": "Kakaykayatan",
        "prefs-edits": "Bilang dagiti inurnos:",
        "prefs-misc": "Sabsabali",
        "prefs-resetpass": "Sukatan ti kontrasenias",
        "prefs-changeemail": "Sukatan wenno ikkaten ti adres ti esurat",
-       "prefs-setemail": "Isaad ti esurat a pagtaengan",
+       "prefs-setemail": "Isaad ti maysa nga adres ti esurat",
        "prefs-email": "Dagiti pagpilian ti esurat",
        "prefs-rendering": "Tabas",
        "saveprefs": "Idulin",
        "restoreprefs": "Isubli amin dagiti kasisigud a pannakaisaad (kadagiti amin a seksion)",
        "prefs-editing": "Ur-urnosen",
-       "searchresultshead": "Biruken",
+       "searchresultshead": "Agbiruk",
        "stub-threshold": "Pagpatinggaan para iti panagpormat iti silpo ti pungol ($1):",
        "stub-threshold-sample-link": "wadan",
        "stub-threshold-disabled": "Nabaldado",
        "prefs-help-recentchangescount": "Daytoy ket mangiraman iti kaudian a balbaliw, dagiti pakasaritaan ti panid, ken dagiti listaan.",
        "prefs-help-watchlist-token2": "Daytoy ti sekreto a tulbek iti pakan ti web iti listaan ti bambantayam.\nTi sinoman a makaammo daytoy ket mabalinda a basaen ti listaan ti bambantayam, isu a saanmo nga ipabingay.\nNo masapulmo, [[Special:ResetTokens|mabalinmo nga isaad manen]].",
        "savedprefs": "Naidulinen dagiti kakaykayatam.",
-       "savedrights": "Naidulinen dagiti karbengan ti agar-aramat ni {{GENDER:$1|$1}}.",
+       "savedrights": "Naidulinen dagiti grupo ti agar-aramat ni {{GENDER:$1|$1}}.",
        "timezonelegend": "Sona ti oras:",
        "localtime": "Lokal nga oras:",
        "timezoneuseserverdefault": "Usaren ti kasisigud ti wiki ($1)",
        "timezoneuseoffset": "Sabali (inaganan ti timbengan)",
        "servertime": "Oras ti server:",
-       "guesstimezone": "Punuen manipud ti pagbasabasa",
+       "guesstimezone": "Punuen manipud iti pagbasabasa",
        "timezoneregion-africa": "Aprika",
        "timezoneregion-america": "Amerika",
        "timezoneregion-antarctica": "Antartika",
        "timezoneregion-indian": "Taaw Indiano",
        "timezoneregion-pacific": "Taaw Pasipiko",
        "allowemail": "Pakabaelam ti esurat a naggapo kadagiti sabali nga agar-aramat",
-       "prefs-searchoptions": "Biruken",
+       "prefs-searchoptions": "Agbiruk",
        "prefs-namespaces": "Dagiti nagan ti espasio",
        "default": "kasisigud",
        "prefs-files": "Dagiti papeles",
        "youremail": "Esurat:",
        "username": "{{GENDER:$1|Nagan ti agar-aramat}}:",
        "prefs-memberingroups": "{{GENDER:$2|Kameng}} ti {{PLURAL:$1|a grupo|a grupgrupo}}:",
+       "group-membership-link-with-expiry": "$1 (aginggana intono $2)",
        "prefs-registration": "Oras a nagrehistro:",
        "yourrealname": "Pudno a nagan:",
        "yourlanguage": "Pagsasao:",
        "prefs-help-gender": "Ti panangisaad daytoy a kakaykayatan ket saan a nasken.\nTi sopwer ket agus-usar iti pategna tapno tawagannaka ken ibaganaka kadagiti sabali nga agus-usar iti maitunos gramatika ti henero.\nDaytoy a pakaammo ket makitanto iti publiko.",
        "email": "Esurat",
        "prefs-help-realname": "Saan a nasken ti pudno a nagan.\nNo maited, mabalin a maaramatto a panangited iti pammadayaw kenka iti obram.",
-       "prefs-help-email": "Ti esurat a pagtaengan ket saan a masapul, ngem masapul kadagiti panangisaad manen ti kontrasenias, no malipatam ti kontraseniasmo.",
+       "prefs-help-email": "Ti adres ti esurat ket saan a masapul, ngem masapul kadagiti panangisaad manen ti kontrasenias, no malipatam ti kontraseniasmo.",
        "prefs-help-email-others": "Mabalinmo pay ti agpili tapno dagiti sabali nga agar-aramat ket mabalin nga esuratandaka babaen ti silpo ti panidmo wenno ti panid ti tungtungam.\nTi esurat a pagtaengam ket saan a maipakita no agkontak kenka dagiti agar-aramat.",
-       "prefs-help-email-required": "Masapul ti esurat a pagtaengan.",
+       "prefs-help-email-required": "Masapul ti adres ti esurat.",
        "prefs-info": "Kangrunaan a pakaammo",
        "prefs-i18n": "Internasionalisasion",
        "prefs-signature": "Pirma",
        "prefs-help-prefershttps": "Daytoy a kakaykayatan ket mapakabaelanto iti sumaruno nga iseserrekmo.",
        "prefswarning-warning": "Nagaramikka kadagiti panagbalbaliw kadagiti kakaykayatam a saan pay a naidulin.\nNo panawan daytoy a panid a saan nga agpindut iti \"$1\" dagiti kakaykayatam ket saanto a mapabaro.",
        "prefs-tabs-navigation-hint": "Pakaammo: Mabalinmo nga usaren dagiti kanigid ken kanawan a tekla ti pana tapno madaliasat ti baetan dagiti etiketa iti listaan dagiti etiketa.",
-       "userrights": "Panagtaripato kadagiti karbengan ti agar-aramat",
-       "userrights-lookup-user": "Agtaripato kadagiti grupo ti agar-aramat",
+       "userrights": "Dagiti karbengan ti agar-aramat",
+       "userrights-lookup-user": "Agpili iti agar-aramat",
        "userrights-user-editname": "Mangiserrek iti nagan ti agar-aramat:",
-       "editusergroup": "Urnosen dagiti grupo ti {{GENDER:$1|agar-aramat}}",
+       "editusergroup": "Ikarga dagiti grupo ti agar-aramat",
        "editinguser": "Suksukatan ti karbengan ni {{GENDER:$1|agar-aramat}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Urnosen dagiti grupo ti agar-aramat",
+       "userrights-editusergroup": "Urnosen dagiti grupo ti {{GENDER:$1|agar-aramat}}",
+       "userrights-viewusergroup": "Kitaen dagiti grupo ti {{GENDER:$1|agar-aramat}}",
        "saveusergroups": "Idulin dagiti grupo ti {{GENDER:$1|agar-aramat}}",
        "userrights-groupsmember": "Kameng ti:",
        "userrights-groupsmember-auto": "Napudno a kameng ti:",
        "userrights-nodatabase": "Awan ti database a $1 wenno saan a lokal.",
        "userrights-changeable-col": "Dagiti grupo a mabalinmo a baliwan",
        "userrights-unchangeable-col": "Dagiti grupo a dimo mabalin a baliwan",
+       "userrights-expiry-current": "Agpaso $1",
+       "userrights-expiry-none": "Saan nga agpaso",
+       "userrights-expiry": "Agpaso:",
+       "userrights-expiry-existing": "Ti adda a panagpaso ti oras: $3, $2",
+       "userrights-expiry-othertime": "Sabali nga oras:",
+       "userrights-invalid-expiry": "Imbalido ti oras a panagpaso para iti grupo \"$1\".",
+       "userrights-expiry-in-past": "Napalabasen ti oras a panagpaso para iti grupo \"$1\".",
        "userrights-conflict": "Suppiat dagiti panagbaliw kadagiti karbengan ti agar-aramat! Pangngaasi nga irepasom ken pasingkedam dagiti sinuksukatam.",
        "group": "Grupo:",
        "group-user": "Dagiti agar-aramat",
        "right-move-rootuserpages": "Agiyalis kadagiti ramut a panid ti agar-aramat",
        "right-move-categorypages": "Agiyalis iti pampanid ti kategoria",
        "right-movefile": "Agiyalis kadagiti papeles",
-       "right-suppressredirect": "Saan nga agpartuat kadagiti baw-ing manipud ti taudan ti pampanid no agiyalis kadagiti panid",
+       "right-suppressredirect": "Saan nga agpartuat kadagiti baw-ing manipud iti taudan ti pampanid no agiyalis kadagiti panid",
        "right-upload": "Agikarga kadagiti papeles",
        "right-reupload": "Agisurat manen kadagiti addan a papeles",
        "right-reupload-own": "Agisurat manen kadagiti addan a papeles a bukod nga inkarga",
        "right-editsemiprotected": "Agurnos kadagiti panid a nasalakniban a kas \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Urnosen ti modelo ti linaon iti panid",
        "right-editinterface": "Agurnos iti interface ti agar-aramat",
-       "right-editusercssjs": "Agurnos kadagiti papales ti CSS ken JavaScript dagiti sabali nga agar-aramat",
        "right-editusercss": "Agurnos kadagiti papeles ti CSS dagiti sabali nga agar-aramat",
        "right-edituserjs": "Agurnos kadagiti papales ti JavaScript dagiti sabali nga agar-aramat",
        "right-editmyusercss": "Agurnos kadagiti bukodmo a papeles ti CSS ti agar-aramat",
        "right-editmyuserjs": "Agurnos kadagiti bukodmo a papeles ti JavaScript ti agar-aramat",
        "right-viewmywatchlist": "Agkita iti bukodmo a listaan ti bambantayan",
        "right-editmywatchlist": "Agurnos iti bukodmo a listaan ti bambantayan. Laglagipen nga adda dagiti tignay a mangnayonto pay laeng ti pampanid urayno awan daytoy a karbengan.",
-       "right-viewmyprivateinfo": "Agkita iti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)",
-       "right-editmyprivateinfo": "Agurnos iti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)",
+       "right-viewmyprivateinfo": "Agkita iti bukodmo a pribado a datos (kasla ti adres ti esurat, pudno a nagan)",
+       "right-editmyprivateinfo": "Agurnos iti bukodmo a pribado a datos (kasla ti adres ti esurat, pudno a nagan)",
        "right-editmyoptions": "Agurnos kadagiti bukodmo a kakaykayatan",
        "right-rollback": "Napardas a mangisubli kadagiti inurnos ti naudi nga agar-aramat a nagurnos iti naisangayan a panid",
        "right-markbotedits": "Agmarka kadagiti naipasubli nga urnos a kas inurnos dagiti bot",
        "right-noratelimit": "Saan a maaringan babaen dagiti patingga ti gatad",
        "right-import": "Agala ti pampanid manipud kadagiti sabali a wiki",
-       "right-importupload": "Agala kadagiti panid manipud ti naikarga a papeles",
+       "right-importupload": "Agala kadagiti panid manipud iti naikarga a papeles",
        "right-patrol": "Markaanna dagiti inurnos ti dadduma a kas napatruliaan",
        "right-autopatrol": "Automatiko a mamarkaanna ti bukod nga inurnos a kas napatruliaan",
        "right-patrolmarks": "Agkita kadagiti kaudian a binaliwan dagiti marka ti napatruliaan",
        "grant-blockusers": "Serraan ken ikkaten ti serra dagiti agar-aramat",
        "grant-createaccount": "Agpartuat kadagiti pakabilangan",
        "grant-createeditmovepage": "Agpartuat, agurnos, ken agiyalis kadagiti panid",
-       "grant-delete": "Agikkat kadagiti panid, dagit irebision, ken dagiti naikabil iti listaan",
+       "grant-delete": "Agikkat kadagiti panid, dagitrebision, ken dagiti naikabil iti listaan",
        "grant-editinterface": "Urnosen ti nagan ti espasio ti MediaWiki ken ti CSS/JavaScript ti agar-aramat",
        "grant-editmycssjs": "Urnosen ti bukodmo a CSS/JavaScript ti agar-aramat",
        "grant-editmyoptions": "Urnosem ti bukodmo a kakaykayatan ti agar-aramat",
        "action-upload_by_url": "agikarga iti daytoy a papeles manipud iti URL",
        "action-writeapi": "agusar iti panagsurat ti API",
        "action-delete": "agikkat iti daytoy a panid",
-       "action-deleterevision": "agikkat iti daytoy a rebision",
-       "action-deletedhistory": "agkita kadagiti naikkat a pakasaritaan iti daytoy a panid",
+       "action-deleterevision": "agikkat kadagiti rebision",
+       "action-deletedhistory": "agkita iti naikkat a pakasaritaan ti panid",
+       "action-deletedtext": "agkita iti naikkat a rebision ti teksto",
        "action-browsearchive": "agbiruk kadagiti naikkat a panid",
-       "action-undelete": "agisubli iti pannakaikkat iti daytoy a panid",
-       "action-suppressrevision": "agrepaso ken agisubli iti daytoy a nailemmeng a rebision",
+       "action-undelete": "agisubli iti pannakaikkat kadagiti panid",
+       "action-suppressrevision": "agrepaso ken agisubli kadagiti nailemmeng a rebision",
        "action-suppressionlog": "agkita iti daytoy a pribado a listaan",
        "action-block": "agserra iti daytoy nga agar-aramat manipud iti panagurnos",
        "action-protect": "mangsukat kadagiti lessaad ti salaknib para iti daytoy a panid",
        "action-userrights-interwiki": "agurnos kadagiti karbengan ti agar-aramat dagiti agar-aramat kadagiti sabali a wiki",
        "action-siteadmin": "mangkandado wenno manglukat ti database",
        "action-sendemail": "agipatulod kadagiti esurat",
+       "action-editmyoptions": "urnosem dagiti kakaykayatam",
        "action-editmywatchlist": "agurnos iti bukodmo a listaan ti bambantayan",
        "action-viewmywatchlist": "agkita iti bukodmo a listaan ti bambantayan",
        "action-viewmyprivateinfo": "agkita iti bukodmo a pribado a pakaammo",
        "recentchanges-legend-heading": "<strong>Leyenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])",
        "recentchanges-submit": "Ipakita",
+       "rcfilters-activefilters": "Dagiti aktibo a sagat",
+       "rcfilters-restore-default-filters": "Isubli dagiti kasisigud a sagat",
+       "rcfilters-clear-all-filters": "Dalusan amin dagiti sagat",
+       "rcfilters-search-placeholder": "Sagaten ti kaudian a balbaliw (agbasabasa wenno mangrugi nga agmakinilia)",
+       "rcfilters-invalid-filter": "Imbalido a sagat",
+       "rcfilters-empty-filter": "Awan dagiti aktibo a sagat. Naipakita amin dagiti kontribusion.",
+       "rcfilters-filterlist-title": "Dagiti sagat",
+       "rcfilters-filterlist-whatsthis": "Ania daytoy?",
+       "rcfilters-highlightmenu-title": "Agpili iti maris",
+       "rcfilters-filterlist-noresults": "Awan dagiti nabirukan a sagat",
+       "rcfilters-filter-registered-label": "Nakarehistro",
+       "rcfilters-filter-registered-description": "Dagiti nakastrek nga editor.",
+       "rcfilters-filter-unregistered-label": "Saan a nakarehistro",
+       "rcfilters-filter-unregistered-description": "Dagiti editor a saan a nakastrek.",
+       "rcfilters-filter-editsbyself-label": "Dagiti bukodmo nga inurnos",
+       "rcfilters-filter-editsbyself-description": "Dagiti inurnosmo.",
+       "rcfilters-filter-editsbyother-label": "Dagiti inurnos ti sabali",
+       "rcfilters-filter-editsbyother-description": "Dagiti inurnos a pinartuat babaen dagiti sabali nga agar-aramat (saan a sika).",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Dagiti agdadamo",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Basbassit ngem 10 nga inur-urnos ken 4 nga aldaw iti aktibidad.",
+       "rcfilters-filter-user-experience-level-learner-label": "Dagiti agad-adal",
+       "rcfilters-filter-user-experience-level-learner-description": "Ad-adu nga al-aldaw iti aktibidad ken inur-urnos ngem \"Dagiti agdadamo\" ngem basbassit ngem \"Dagiti nasanay nga agar-aramat\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Dagiti nasanay nga agar-aramat",
+       "rcfilters-filter-user-experience-level-experienced-description": "Ad-adu ngem 30 nga aldaw iti aktibidad ken 500 nga inur-urnos.",
+       "rcfilters-filtergroup-automated": "Dagiti automado a kontribusion",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Dagiti inurnos nga inaramid babaen ti automado a ramramit.",
+       "rcfilters-filter-humans-label": "Tao (saan a bot)",
+       "rcfilters-filter-humans-description": "Dagiti inurnos nga inaramid babaen dagiti editor a tao.",
+       "rcfilters-filtergroup-reviewstatus": "Irepaso ti kasasaad",
+       "rcfilters-filter-patrolled-label": "Napatruliaan",
+       "rcfilters-filter-patrolled-description": "Dagiti inurnos a namarkaan a kas napatruliaan.",
+       "rcfilters-filter-unpatrolled-label": "Di napatruliaan",
+       "rcfilters-filter-unpatrolled-description": "Dagiti inurnos a saan a namarkaan a kas napatruliaan.",
+       "rcfilters-filter-minor-label": "Dagiti bassit a panagurnos",
+       "rcfilters-filter-minor-description": "Dagiti panagurnos a minarkaan ti mannurat a kas bassit.",
+       "rcfilters-filter-major-label": "Dagiti saan a bassit a panagurnos",
+       "rcfilters-filter-major-description": "Dagiti panagurnos a saan a namarkaan a kas bassit.",
+       "rcfilters-filtergroup-changetype": "Kita ti panagbaliw",
+       "rcfilters-filter-pageedits-label": "Dagiti panagurnos ti panid",
+       "rcfilters-filter-pageedits-description": "Dagiti panagurnos iti linaon ti wiki, tungtungan, dagiti deskripsion ti kategoria....",
+       "rcfilters-filter-newpages-label": "Dagiti panagpartuat ti panid",
+       "rcfilters-filter-newpages-description": "Dagiti panagurnos a nakaaramid kadagiti baro a panid.",
+       "rcfilters-filter-categorization-label": "Dagiti panagbaliw ti kategoria",
+       "rcfilters-filter-categorization-description": "Dagiti rekord ti pampanid a mainaynayon wenno maik-ikkat manipud kadagiti kategoria.",
+       "rcfilters-filter-logactions-label": "Dagiti aksion a nailista",
+       "rcfilters-filter-logactions-description": "Dagiti aksion nga administratibo, dagiti panagpartuat iti pakabilangan, dagiti panagikkat iti panid, dagiti panangikarga....",
        "rcnotefrom": "Dita baba ket {{PLURAL:$5|ti sinukatan|dagiti sinukatan}} manipud idi <strong>$3, $4</strong> (aginggana iti <strong>$1</strong> a naipakita).",
        "rclistfrom": "Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $2, $3",
        "rcshowhideminor": "$1 dagiti bassit a panagurnos",
        "rcshowhidecategorization": "$1 ti pannakaikategoria ti panid",
        "rcshowhidecategorization-show": "Ipakita",
        "rcshowhidecategorization-hide": "Ilemmeng",
-       "rclinks": "Ipakita dagiti naudi a $1 a sinukatan iti kallabes a $2 nga al-aldaw<br />$3",
+       "rclinks": "Ipakita dagiti naudi a $1 a sinukatan iti kallabes a $2 nga al-aldaw",
        "diff": "dip",
        "hist": "hist",
        "hide": "Ilemmeng",
        "upload-dialog-disabled": "Nabaldado iti daytoy a wiki dagiti panangikarga ti papeles iti daytoy a dialogo.",
        "upload-dialog-title": "Agikarga iti papeles",
        "upload-dialog-button-cancel": "Ukasen",
+       "upload-dialog-button-back": "Agsubli",
        "upload-dialog-button-done": "Nalpasen",
        "upload-dialog-button-save": "Idulin",
        "upload-dialog-button-upload": "Agikarga",
        "upload-form-label-infoform-categories": "Katkategoria",
        "upload-form-label-infoform-date": "Petsa",
        "upload-form-label-own-work-message-generic-local": "Pasingkedak nga ikarkargak daytoy a papeles a sumursurot kadagiti termino ti serbisio ken dagiti annuroten ti lisensia iti {{SITENAME}}.",
-       "upload-form-label-not-own-work-message-generic-local": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti {{SITENAME}}, pangngaasi nga irekep daytoy a dialogo ken padasen ti sabali a pamay-an.",
+       "upload-form-label-not-own-work-message-generic-local": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti {{SITENAME}}, pangngaasi nga irikep daytoy a dialogo ken padasen ti sabali a pamay-an.",
        "upload-form-label-not-own-work-local-generic-local": "Mabalinmo pay a padasen [[Special:Upload|ti kasisigud a pagikargaan a panid]].",
        "upload-form-label-own-work-message-generic-foreign": "Maawatak nga agikarkargaak iti daytoy a papeles iti pagbibingayan a repositorio. Pasingkedak nga ar-aramidek a sumursurot kadagiti termino ti serbisio ken dagiti annuroten ti lisensia idiay.",
-       "upload-form-label-not-own-work-message-generic-foreign": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti pagbibingayan a repositorio, pangngaasi nga irekep daytoy a dialogo ken padasen ti sabali a pamay-an.",
+       "upload-form-label-not-own-work-message-generic-foreign": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti pagbibingayan a repositorio, pangngaasi nga irikep daytoy a dialogo ken padasen ti sabali a pamay-an.",
        "upload-form-label-not-own-work-local-generic-foreign": "Malinmo pay a padasen ti panagusar [[Special:Upload|ti panid a pagikargaan iti {{SITENAME}}]], no daytoy a panid ket mabalin a maikarga idiay babaen dagiti bukodda nga annuroten.",
        "backend-fail-stream": "Saan a maipan ti papeles $1.",
        "backend-fail-backup": "Saan a makaidulin ti kapada ti papeles ti $1.",
        "img-auth-accessdenied": "Nalibak ti iseserrek",
        "img-auth-nopathinfo": "Ti servermo ket saan a naisaad nga agipasa iti daytoy a pakaammo.\nMabalin a naibatay iti CGI ken saan a makasuporta ti img_auth.\nKitaen ti https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization .",
        "img-auth-notindir": "Ti kiniddaw a dalan ket saan nga adda iti naaramid a direktorio ti pagikargaan",
-       "img-auth-badtitle": "Saan a makaaramid ti umisu a titulo manipud ti \"$1\".",
+       "img-auth-badtitle": "Saan a makaaramid ti umisu a titulo manipud iti \"$1\".",
        "img-auth-nologinnWL": "Saanka a nakastrek ken ti \"$1\" ket awan idiay mabalin a listaan.",
        "img-auth-nofile": "Awan ti papeles ti \"$1\".",
        "img-auth-isdir": "Padpadasem ti mangserrek ti direktorio ti \"$1\".\nTi laeng panagserrek ti papeles ti maipalubos.",
        "nolicense": "Awan ti napili",
        "licenses-edit": "Urnosen dagiti pagpilian ti lisensia",
        "license-nopreview": "(Saan a magun-od ti panagipadas)",
-       "upload_source_url": "(ti pinilim a papeles manipud ti umisu, ken publiko a maserrekan nga URL)",
-       "upload_source_file": "(ti pinilim a papeles manipud ti kompiutermo)",
+       "upload_source_url": "(ti pinilim a papeles manipud iti umisu, ken publiko a maserrekan nga URL)",
+       "upload_source_file": "(ti pinilim a papeles manipud iti kompiutermo)",
        "listfiles-delete": "ikkaten",
        "listfiles-summary": "Daytoy nga espesial a panid ket agiparang kadagiti amin a naikarga a papeles.",
        "listfiles_search_for": "Agbiruk para iti nagan ti midia:",
        "doubleredirects": "Dagiti namindua a naibaw-ing",
        "doubleredirectstext": "Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabali a baw-ing a pampanid.\nIti tunggal maysa nga aray ket aglaon kadagiti silpo iti umuna ken maikadua a baw-ing, ken ti pay puntaan ti maikadua a baw-ing, nga isu ti \"pudno\" a puntaan ti panid, nga ti umuna a baw-ing ket isu koma ti pakaituduanna.\nNasolbaren dagiti <del>nakurosan</del> a naikabil.",
        "double-redirect-fixed-move": "Naiyalisen ti [[$1]].\nAutomatiko idi a napabaro ken naibaw-ing tattan iti [[$2]].",
-       "double-redirect-fixed-maintenance": "Automatiko nga agsimsimpa ti doble a baw-ing manipud ti [[$1]] iti [[$2]] iti panagtaripato nga obra.",
+       "double-redirect-fixed-maintenance": "Automatiko nga agsimsimpa ti doble a baw-ing manipud iti [[$1]] iti [[$2]] iti panagtaripato nga obra.",
        "double-redirect-fixer": "Panagsimpa ti baw-ing",
        "brokenredirects": "Dagiti naputed a baw-ing",
        "brokenredirectstext": "Dagiti sumaganad a baw-ing ket nakasilpo kadagiti awan a panid:",
        "mostinterwikis": "Dagiti panid a kaaduan kadagiti interwiki",
        "mostrevisions": "Dagiti panid a kaaduan kadagiti rebision",
        "prefixindex": "Amin a pampanid nga addaan iti pasakbay",
-       "prefixindex-namespace": "Amin a pampanid nga addaan iti pasaruno (nagan ti espasio ti $1)",
+       "prefixindex-namespace": "Amin a pampanid nga agraman iti pasakbay (nagan ti espasio ti $1)",
        "prefixindex-submit": "Ipakita",
        "prefixindex-strip": "Ikkaten ti pasakbay iti listaan",
        "shortpages": "Dagiti ababa a panid",
        "ancientpages": "Dagiti kadaanan a panid",
        "move": "Iyalis",
        "movethispage": "Iyalis daytoy a panid",
-       "unusedimagestext": "Adda dagiti sumaganad a papeles ngem saanda a naikabil iti aniaman a panid.\nPangngaasi a laglagipen a dagiti sabali a sitio ti web ket mabalin a nakasilpoda iti papeles iti dagus a URL, ken mabalin pay a nailista ditoy urayno saanda nga aktibo a maus-usar.",
+       "unusedimagestext": "Adda dagiti sumaganad a papeles ngem saanda a naikabil iti ania man a panid.\nPangngaasi a laglagipen a dagiti sabali a sitio ti web ket mabalin a nakasilpoda iti papeles iti dagus a URL, ken mabalin pay a nailista ditoy urayno saanda nga aktibo a maus-usar.",
        "unusedcategoriestext": "Ti sumaganad a kategoria ti pampanid ket adda,urayno awan ti sabali a panid wenno kategoria ti agus-usar kaniada.",
        "notargettitle": "Awan ti puntaan",
        "notargettext": "Saanmo a nainagan ti puntaan a panid wenno agar-aramat ti mangtungpal iti daytoy nga annong.",
        "apisandbox-results-fixtoken-fail": "Napaay ti panagala iti tangdan ti \"$1\".",
        "apisandbox-alert-page": "Saan nga umiso dagiti pagikabilan iti daytoy a panid.",
        "apisandbox-alert-field": "Saan nga umiso ti pateg iti daytoy a pagikabilan.",
+       "apisandbox-continue": "Agtuloy",
+       "apisandbox-continue-clear": "Dalusan",
+       "apisandbox-multivalue-all-namespaces": "$1 (Amin a nagan ti espasio)",
+       "apisandbox-multivalue-all-values": "$1 (Amin a patpateg)",
        "booksources": "Dagiti taudan ti libro",
        "booksources-search-legend": "Agbiruk para kadagiti taudan ti libro",
-       "booksources-search": "Biruken",
+       "booksources-search": "Agbiruk",
        "booksources-text": "Dita baba ket listaan dagiti silpo ti sabali a sitio nga aglaklako ti baro ken saan a nausar a liblibro, ken mabalin nga addaan pay iti adu a pakaammo a maipanggep kadagiti libro a birbirukem:",
-       "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud ti kasisigud a taudan.",
+       "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud iti kasisigud a taudan.",
+       "magiclink-tracking-rfc": "Pampanid nga agus-usar kadagiti salamangka a silpo ti RFC",
+       "magiclink-tracking-rfc-desc": "Daytoy a panid ket agus-usar kadagiti salamangka a silpo ti RFC. Kitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] no kasano iti mangiyakar.",
+       "magiclink-tracking-pmid": "Pampanid nga agus-usar kadagiti salamangka a silpo ti PMID",
+       "magiclink-tracking-pmid-desc": "Daytoy a panid ket agus-usar kadagiti salamangka a silpo ti PMID. Kitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] no kasano iti mangiyakar.",
+       "magiclink-tracking-isbn": "Pampanid nga agus-usar kadagiti salamangka a silpo ti ISBN",
+       "magiclink-tracking-isbn-desc": "Daytoy a panid ket agus-usar kadagiti salamangka a silpo ti ISBN. Kitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] no kasano iti mangiyakar.",
        "specialloguserlabel": "Nangitungpal:",
        "speciallogtitlelabel": "Puntaan (titulo wenno {{ns:user}}:nagan ti agar-aramat para iti agar-aramat):",
        "log": "Dagiti listaan",
        "all-logs-page": "Amin a listaan a publiko",
        "alllogstext": "Naikaykaysa a panagiparang kadagiti amin a magun-od a listaan iti {{SITENAME}}.\nMapabassitmo ti panagkita babaen ti panagpili ti kita ti listaan, ti nagan ti agar-aramat (sensitibo ti kadakkel ti letra), wenno ti naapektaran a panid (sensitibo pay ti kadakkel ti letra).",
        "logempty": "Awan dagiti maipada a banag iti listaan.",
-       "log-title-wildcard": "Agbiruk kadagiti titulo a mangrugi iti daytoy a testo",
+       "log-title-wildcard": "Agbiruk kadagiti titulo a mangrugi iti daytoy a teksto",
        "showhideselectedlogentries": "Baliwan ti panagkita kadagiti napili a naikabil iti listaan",
        "log-edit-tags": "Urnosen dagiti etiketa iti napili a listaan ti naikabkabil",
        "checkbox-select": "Agpili: $1",
        "linksearch": "Panagbiruk kadagiti akinruar a silpo",
        "linksearch-pat": "Tabas ti panagbiruk:",
        "linksearch-ns": "Nagan ti espasio:",
-       "linksearch-ok": "Biruken",
+       "linksearch-ok": "Agbiruk",
        "linksearch-text": "Dagiti naatap a tarheta a kas ti \"*.wikipedia.org\" ket mabalin nga usaren.\nMasapul ti saan a basbassit ngem kangatuan a dominio, kas pagarigan \"*.org\".<br />\n{{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: $1 (kasisigud iti http:// no awan ti nainaganan a protokol).",
-       "linksearch-line": "Ti $1 ket naisilpo manipud ti $2",
+       "linksearch-line": "Ti $1 ket naisilpo manipud iti $2",
        "linksearch-error": "Ti naatap a tarheta ket mabalin nga agparang laeng iti rugi ti nagan ti agsangaili.",
        "listusersfrom": "Iparang dagiti agar-aramat a mangrugi iti:",
        "listusers-submit": "Ipakita",
        "activeusers-intro": "Daytoy ti listaan dagiti agar-aramat nga adda inar-aramid iti kaunegan dagiti napalabas a $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}.",
        "activeusers-count": "$1 a {{PLURAL:$1|tignay|tigtignay}} iti napalabas {{PLURAL:$3|nga aldaw|a $3 nga al-aldaw}}",
        "activeusers-from": "Iparang dagiti agar-aramat a mangrugi iti:",
+       "activeusers-groups": "Iparang dagiti agar-aramat a maitagikua kadagiti grupo:",
+       "activeusers-excludegroups": "Ilaksid dagiti agar-aramat a maitagikua kadagiti grupo:",
        "activeusers-noresult": "Awan ti nasarakan nga agar-aramat.",
        "activeusers-submit": "Ipakita dagiti aktibo nga agar-aramat",
        "listgrouprights": "Dagiti karbengan ti grupo ti agar-aramat",
        "listgrouprights-addgroup-self": "Agnayon {{PLURAL:$2|iti grupo|kadagiti grupo}} iti bukod a pakabilangan: $1",
        "listgrouprights-removegroup-self": "Agikkat {{PLURAL:$2|iti grupo|kadagiti grupo}} manipud ti bukod a pakabilangan: $1",
        "listgrouprights-addgroup-self-all": "Inayon amin dagiti grupo iti bukod a pakabilangan",
-       "listgrouprights-removegroup-self-all": "Ikkatem amin dagiti grupo manipud ti bukod a pakabilangan",
+       "listgrouprights-removegroup-self-all": "Ikkatem amin dagiti grupo manipud iti bukod a pakabilangan",
        "listgrouprights-namespaceprotection-header": "Dagiti panangigawid ti nagan ti espasio",
        "listgrouprights-namespaceprotection-namespace": "Nagan ti espasio",
-       "listgrouprights-namespaceprotection-restrictedto": "Karbengan wenno karkarbengan a mangpalubos nga agurnos ti agar-aramat",
+       "listgrouprights-namespaceprotection-restrictedto": "Karbengan wenno karkarbengan a mangipalubos nga agurnos ti agar-aramat",
        "listgrants": "Dagiti sagut",
        "listgrants-summary": "Ti sumagand ket listaan dagiti sagut nga agraman kadagiti mainaig a panagserrek kadagiti karbengan ti agar-aramat. Dagiti agar-aramat ket mabalinda ti mangipalubos kadagiti aplikasion a mausarda iti bukodda a pakabilangan, ngem addaan iti limitado a pammalubos a naibatay kadagiti sagut nga inted ti agar-aramat iti aplikasion. Nupay kasta ti maysa nga aplikasion nga agtigtignay para iti agar-aramat ket saan a pudno a makausar kadagiti karbengan nga awanan iti agar-aramat.\nMabalin nga adda iti [[{{MediaWiki:Listgrouprights-helppage}}|maipatinayon a pakaammo]] a maipanggep kadagiti indibidual a karbengan.",
        "listgrants-grant": "Sagut",
        "hidden-category-category-desc": "Ti kategoria ket aglaon ti <code><nowiki>__HIDDENCAT__</nowiki></code> iti panid a linaonna, a mangpawil daytoy nga agparang kadagiti silpo ti kahon ti kategoria kadagiti panid babaen ti kasisigud.",
        "trackingcategories-nodesc": "Awan ti magun-od a deskripsion.",
        "trackingcategories-disabled": "Nabaldado ti kategoria",
-       "mailnologin": "Awan ti pagipatulodan a pagtaengan",
-       "mailnologintext": "Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga esurat a pagtaengan idiay [[Special:Preferences|kaykayatam]] tapno makaipatulod iti esurat kadagiti sabali nga agar-aramat.",
+       "mailnologin": "Awan ti pagipatulodan nga adres",
+       "mailnologintext": "Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga adres ti esurat iti [[Special:Preferences|kaykayatam]] tapno makaipatulod iti esurat kadagiti sabali nga agar-aramat.",
        "emailuser": "Esuratan daytoy nga agar-aramat",
        "emailuser-title-target": "Esuratam daytoy nga {{GENDER:$1|agar-aramat}}",
        "emailuser-title-notarget": "Esuratan ti agar-aramat",
-       "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod iti esurat a mensahe iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapo\" a pagtaengan ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
+       "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod iti mensahe ti esurat iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapo\" nga adres ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
        "defemailsubject": "Esurat ti {{SITENAME}} a naggapo kenni \"$1\"",
        "usermaildisabled": "Saanmo a mabalin ti agipatulod ti esurat",
        "usermaildisabledtext": "Saanmo a mabalin ti agipatulod ti esurat kadagiti sabali nga agar-aramat iti daytoy a wiki",
-       "noemailtitle": "Awan ti esurat a pagtaengan",
-       "noemailtext": "Ti agar-aramat ket saan a nanginagan ti umisu nga esurat a pagtaengan.",
+       "noemailtitle": "Awan ti adres ti esurat",
+       "noemailtext": "Daytoy nga agar-aramat ket saan a nanginagan ti umisu nga adres ti esurat.",
        "nowikiemailtext": "Ti agar-aramat ket mabalinna ti agpili a saan nga umawat iti esurat kadagiti sabali nga agar-aramat.",
        "emailnotarget": "Awan wenno saan nga umisu a nagan ti agar-aramat para iti nagipatulodan.",
        "emailtarget": "Ikabil ti nagan ti agar-aramat a pangitulodam",
        "addedwatchtext": "Ti \"[[:$1]]\" ken ti tungtunganna a panid ket nainayonen iti [[Special:Watchlist|listaan ti bambantayam]].",
        "addedwatchtext-talk": "Ti \"[[:$1]]\" ken ti mainaig a panidna ket nainayoen iti [[Special:Watchlist|bambantayam]].",
        "addedwatchtext-short": "Ti panid ti \"$1\" ket nainayonen iti listaan ti bambantayam.",
-       "removewatch": "Ikkaten manipud ti listaan ti bambantayan",
+       "removewatch": "Ikkaten manipud iti listaan ti bambantayan",
        "removedwatchtext": "Ti \"[[:$1]]\" ken ti tungtunganna a panid ket naikkaten manipud iti [[Special:Watchlist|listaan ti bambantayam]].",
        "removedwatchtext-talk": "Ti \"[[:$1]]\" ken ti mainaig a panidna ket naikkaten manipud iti [[Special:Watchlist|bambantayam]].",
-       "removedwatchtext-short": "Ti panid ti \"$1\" ket naikkaten manipud ti listaan ti bambantayam.",
+       "removedwatchtext-short": "Ti panid ti \"$1\" ket naikkaten manipud iti listaan ti bambantayam.",
        "watch": "Bantayan",
        "watchthispage": "Bantayan daytoy a panid",
        "unwatch": "Saanen a bantayan",
        "log-name-contentmodel": "Listaan ti panagbaliw ti modelo ti linaon",
        "log-description-contentmodel": "Dagiti pasamak a mainaig kadagiti modelo ti linaon ti panid",
        "logentry-contentmodel-new": "{{GENDER:$2|Pinartuat}} ni $1 ti panid ti $3 a nagusar ti saan a kasisigud a modelo ti linaon ti \"$5\"",
-       "logentry-contentmodel-change": "{{GENDER:$2|Binaliwan}} ni $1 ti modelo ti panid ti $3 manipud ti \"$4\" iti \"$5\"",
+       "logentry-contentmodel-change": "{{GENDER:$2|Binaliwan}} ni $1 ti modelo ti panid ti $3 manipud iti \"$4\" iti \"$5\"",
        "logentry-contentmodel-change-revertlink": "isubli",
        "logentry-contentmodel-change-revert": "isubli",
        "protectlogpage": "Listaan ti panagsalaknib",
        "protectlogtext": "Dita baba ket adda listaan dagiti sinukatan a salaknib ti panid.\nKitaen ti [[Special:ProtectedPages|listaan kadagiti nasalakniban a panid]] ti listaan kadagiti agdama a panagpataray a panagsalaknib ti panid.",
        "protectedarticle": "nasalakniban ti \"[[$1]]\"",
        "modifiedarticleprotection": "nasukatan ti agpang ti salaknib para iti \"[[$1]]\"",
-       "unprotectedarticle": "naikkat ti salaknib manipud ti \"[[$1]]\"",
-       "movedarticleprotection": "iyalis ti kasasaad ti salaknib manipud ti \"[[$2]]\" iti \"[[$1]]\"",
+       "unprotectedarticle": "naikkat ti salaknib manipud iti \"[[$1]]\"",
+       "movedarticleprotection": "iyalis ti kasasaad ti salaknib manipud iti \"[[$2]]\" iti \"[[$1]]\"",
        "protect-title": "Sukatan ti agpang ti salaknib para iti \"$1\"",
        "protect-title-notallowed": "Kitaen ti agpang ti salaknib ti \"$1\"",
        "prot_1movedto2": "[[$1]] naiyalis iti [[$2]]",
        "restriction-upload": "Agikarga",
        "restriction-level-sysop": "napno a nasalakniban",
        "restriction-level-autoconfirmed": "nasalakniban-bassit",
-       "restriction-level-all": "aniaman nga agpang",
+       "restriction-level-all": "ania man nga agpang",
        "undelete": "Kitaen dagiti naikkat a panid",
        "undeletepage": "Kitaen ken isubli dagiti naikkat a panid",
        "undeletepagetitle": "<strong>Ti sumaganad ket buklen dagiti naikkat a rebision ti [[:$1|$1]]</strong>.",
        "undeleterevisions": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naikkat",
        "undeletehistory": "No ipasublim daytoy a panid, amin dagiti rebision ket maipasubli iti pakasaritaan.\nKet no adda baro a panid a kanagnaganna a naaramid ti napalabas a panagikkat, dagiti naipasubli a rebision ket agparang iti napalabas a pakasaritaan.",
        "undeleterevdel": "Ti panagikkat ket saan a maaramid no agbanag iti rabaw ti panid, wenno ti rebision ti papeles ket maikkatan ti bassit.\nIti kastoy a kaso, masapul nga ikkatem ti kur-it wenno ikkatem ti lemmeng dagiti kabarbaro a naikkat a rebision.",
-       "undeletehistorynoadmin": "Daytoy a panid ket naikkaten.\nTi rason ti panagikkat ket naipakita iti pakabuklan dita baba, ken dagita a salaysay ti agar-aramat a nagurnos iti daytoy a panid sakbay a naikkat.\nTi husto a testo dagitoy a naikat a rebision ket magun-od laeng dagiti administrador.",
+       "undeletehistorynoadmin": "Daytoy a panid ket naikkaten.\nTi rason ti panagikkat ket naipakita iti pakabuklan dita baba, ken dagita a salaysay ti agar-aramat a nagurnos iti daytoy a panid sakbay a naikkat.\nTi husto a teksto dagitoy a naikat a rebision ket magun-od laeng dagiti administrador.",
        "undelete-revision": "Naikkat ti rebision ti $1 (manipud idi $4, $5) babaen ni $3:",
        "undeleterevision-missing": "Imbalido wenno napukaw a rebision.\nAddaanka ngata ti madi a silpo, wenno ti rebision ket mabalin a naipasubli wenno naikkat manipud ti arkibo.",
        "undeleterevision-duplicate-revid": "Saan a maisubli {{PLURAL:$1|ti maysa a rebision|dagiti $1 a rebision}}, gapu ta {{PLURAL:$1|ti bukona|dagiti bukodda}} nga <code>rev_id</code> ket naus-usaren.",
        "undeleteviewlink": "kitaen",
        "undeleteinvert": "Baliktaden ti napili",
        "undeletecomment": "Rason:",
-       "undeletedrevisions": "{{PLURAL:$1|1 a rebision|dagiti $1 a rebision}} ti naisubli",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 a rebision|dagiti $1 a rebision}} ken {{PLURAL:$2|1 a papeles|dagiti $2 a papeles}} ti naisubli",
-       "undeletedfiles": "{{PLURAL:$1|1 a papeles|dagiti $1 a papeles}} ti naisubli",
        "cannotundelete": "Napaay ti sangkabassit wenno amin iti panagisubli ti panagikkat:\n$1",
        "undeletedpage": "<strong>Naisublin ti $1</strong>\n\nBinsiren ti [[Special:Log/delete|listaan ti panagikkat]] para iti rehistro dagiti kaudian panagikkat ken naisubsubli.",
        "undelete-header": "Kitaen [[Special:Log/delete|ti listaan ti panagikkat]] kadagiti kaudian a naikkat a panid.",
-       "undelete-search-title": "Biruken dagiti naikkat a panid",
-       "undelete-search-box": "Biruken dagiti naikkat a panid",
+       "undelete-search-title": "Agbiruk kadagiti naikkat a panid",
+       "undelete-search-box": "Agbiruk kadagiti naikkat a panid",
        "undelete-search-prefix": "Ipakita dagiti panid a mangrugi iti:",
-       "undelete-search-submit": "Biruken",
+       "undelete-search-submit": "Agbiruk",
        "undelete-no-results": "Awan dagiti kapada ti panid a nasarakan idiay arkibo ti panagikkat.",
        "undelete-filename-mismatch": "Saan maisubli ti panagikkat ti rebision ti papeles nga adda oras ket petsana a $1: Saan nga agpada ti nagan ti papeles.",
        "undelete-bad-store-key": "Saan a maisubli ti pinagikkat ti rebision ti papeles nga adda oras ket petsana a $1: Ti papeles ket napukaw sakbay a naikkat.",
        "contributions-userdoesnotexist": "Ti pakabilangan ti agar-aramat ni \"$1\" ket saan a nakarehistro.",
        "nocontribs": "Awan ti nasarakan a nasukatan a kapada dagitoy a kriteria.",
        "uctop": "(agdama)",
-       "month": "Manipud ti bulan (ken nasapsapa):",
-       "year": "Manipud ti tawen (ken nasapsapa):",
+       "month": "Manipud iti bulan (ken nasapsapa):",
+       "year": "Manipud iti tawen (ken nasapsapa):",
        "sp-contributions-newbies": "Iparang dagiti kontribusion dagiti kabarbaro a pakabilangan laeng",
        "sp-contributions-newbies-sub": "Para kadagiti kabarbaro a pakabilangan",
        "sp-contributions-newbies-title": "Dagiti kontribusion para kadagiti baro a pakabilangan",
        "sp-contributions-talk": "tungtungan",
        "sp-contributions-userrights": "panagtaripato kadagiti karbengan ti agar-aramat",
        "sp-contributions-blocked-notice": "Agdama a naserraan daytoy nga agar-aramat.\nTi naudi a naikabil iti listaan ti pannakaserra ket naited dita baba para iti reperensia:",
-       "sp-contributions-blocked-notice-anon": "Daytoy nga IP a pagtaengan ket agdama a naserraan.\nTi naudi a naikabil iti listaan ti pannakaserra ket adda dita baba para iti reperensia:",
+       "sp-contributions-blocked-notice-anon": "Daytoy nga adres ti IP ket agdama a naserraan.\nTi naudi a naikabil iti listaan ti pannakaserra ket adda dita baba para iti reperensia:",
        "sp-contributions-search": "Agbiruk para kadagiti kontribusion",
-       "sp-contributions-username": "IP a pagtaengan wenno nagan ti agar-aramat:",
+       "sp-contributions-username": "Adres ti IP wenno nagan ti agar-aramat:",
        "sp-contributions-toponly": "Ipakita laeng dagiti inurnos dagiti kaudian a rebision",
        "sp-contributions-newonly": "Ipakita laeng dagiti inurnos a pannakapartuat ti pampanid",
        "sp-contributions-hideminor": "Ilemmeng dagiti bassit a panagurnos",
-       "sp-contributions-submit": "Biruken",
+       "sp-contributions-submit": "Agbiruk",
        "whatlinkshere": "Dagiti nakasilpo ditoy",
        "whatlinkshere-title": "Pampanid a nakasilpo iti \"$1\"",
        "whatlinkshere-page": "Panid:",
        "whatlinkshere-filters": "Dagiti sagat",
        "whatlinkshere-submit": "Inkan",
        "autoblockid": "Auto a panagserra #$1",
-       "block": "Seraan ti agar-aramat",
+       "block": "Serraan ti agar-aramat",
        "unblock": "Ikkaten ti serra ti agar-aramat",
        "blockip": "Serraan ti {{GENDER:$1|agar-aramat}}",
        "blockip-legend": "Serraan ti agar-aramat",
        "blockiptext": "Usaren ti porma dita baba tapno maserraan ti panagserrek ti panagsurat manipud iti naisangayan nga adres ti IP wenno nagan ti agar-aramat.\nDaytoy ket nasken laeng a maaramid tapno mapawilan ti bandalismo, ken segun iti [[{{MediaWiki:Policy-url}}|annuroten]].\nIkabil ti naisangayan a rason dita baba (kas pagarigan, ti panagdakamat kadagiti naisangayan a panid a nabandalismo).\nMabalinmo a serraan dagiti sakup ti adres ti IP babaen ti panagusar ti sintaksis ti [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; ti kadakkelan a maipalubos a sakup ket /$1 para iti IPv4 ken /$2 para iti IPv6.",
-       "ipaddressorusername": "IP a pagtaengan wenno nagan ti agar-aramat:",
+       "ipaddressorusername": "Adres ti IP wenno nagan ti agar-aramat:",
        "ipbexpiry": "Agpaso:",
        "ipbreason": "Rason:",
        "ipbreason-dropdown": "*Dagiti kadawyan a rason ti panagserra\n** Agikabil kadagiti  madi a pakaammo\n** Agikkat kadagiti linaon ti pampanid\n** Agikabil ti spam a silpo iti ruar\n** Agikabil ti minamaag/saan a maawatan a pampanid\n** Mangbutbuteng a panagkukua /mangriribok\n** Agab-abuso kadagiti nadumaduma a pakabilangan\n** Saan a maawat a nagan ti agar-aramat",
-       "ipb-hardblock": "Iparit dagiti nakastrek nga agar-aramat manipud ti panagurnos manipud ti daytoy nga IP a pagtaengan",
+       "ipb-hardblock": "Iparit dagiti nakastrek nga agar-aramat manipud iti panagurnos manipud iti daytoy nga adres ti IP",
        "ipbcreateaccount": "Pawilan ti panagpartuat iti pakabilangan",
        "ipbemailban": "Pawilan ti agar-aramat nga agipatulod iti esurat",
-       "ipbenableautoblock": "Automatiko a mangserra ti naudi nga IP a pagtaengan nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga IP a pagtaengan nga ayan ti pangipadasanda nga agurnos",
+       "ipbenableautoblock": "Automatiko a mangserra ti naudi nga adres ti IP nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga adres ti IP nga ayan ti pangipadasanda nga agurnos",
        "ipbsubmit": "Serraan daytoy nga agar-aramat",
        "ipbother": "Sabali nga oras:",
        "ipboptions": "2 nga oras:2 hours,1 nga aldaw:1 day,3 nga aldaw:3 days,1 a lawas:1 week,2 a lawas:2 weeks,1 a bulan:1 month,3 a bulan:3 months,6 a bulan:6 months,1 a tawen:1 year,awan inggana:infinite",
        "ipb-disableusertalk": "Pawilan daytoy nga agar-aramat nga agurnos kadagiti bukodda a tungtungan a panid bayat a naserraan",
        "ipb-change-block": "Serraan manen ti agar-aramat kadagitoy a pannakaisaad",
        "ipb-confirm": "Pasingkedan ti serra",
-       "badipaddress": "Imbalido nga IP a pagtaengan",
+       "badipaddress": "Imbalido nga adres ti IP",
        "blockipsuccesssub": "Balligi ti panangserra",
        "blockipsuccesstext": "Ni [[Special:Contributions/$1|$1]] ket naserraanen.<br />\nKitaen ti [[Special:BlockList|listaan ti serra]] tapno marepaso dagiti serra.",
        "ipb-blockingself": "Mangrugrugika nga agserra kenka! Sigurado a kayatmo nga aramiden daytoy?",
        "ipb-confirmaction": "No sigurado a kayatmo nga aramiden daytoy, pangngaasi a kitaen ti \"{{int:ipb-confirm}}\" a pagikabilan dita baba.",
        "ipb-edit-dropdown": "Urnosen dagiti rason ti panagserra",
        "ipb-unblock-addr": "Lukatan ti serra ni $1",
-       "ipb-unblock": "Lukatan ti serra ti nagan ti agar-aramat wenno IP a pagtaengan",
+       "ipb-unblock": "Lukatan ti serra ti nagan ti agar-aramat wenno adres ti IP",
        "ipb-blocklist": "Kitaen dagiti adda a serra",
        "ipb-blocklist-contribs": "Dagiti kontribusion para kenni {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "$1 ti nabati",
        "unblockip": "Lukatan ti serra ti agar-aramat",
-       "unblockiptext": "Usaren ti porma dita baba tapno maisubli ti panagserrek ti panagsurat ti dati a naserran nga IP a pagtaengan wenno nagan ti agar-aramat.",
+       "unblockiptext": "Usaren ti porma dita baba tapno maisubli ti panagserrek ti panagsurat ti dati a naserran nga adres ti IP wenno nagan ti agar-aramat.",
        "ipusubmit": "Ikkaten daytoy a serra",
        "unblocked": "Naikkat ti pannakaserra ni [[User:$1|$1]].",
        "unblocked-range": "Naikkaten ti serra ti $1.",
        "unblocked-id": "Naikkaten ti serra ti $1.",
        "unblocked-ip": "Naikkaten ti serra ni [[Special:Contributions/$1|$1]] .",
        "blocklist": "Dagiti naserraan nga agar-aramat",
+       "autoblocklist-submit": "Agbiruk",
        "ipblocklist": "Dagiti naserraan nga agar-aramat",
        "ipblocklist-legend": "Agbiruk ti naserraan nga agar-aramat",
        "blocklist-userblocks": "Ilemmeng dagiti serra ti pakabilangan",
        "blocklist-by": "Ti nagserra nga admin",
        "blocklist-params": "Dagiti parametro ti serra",
        "blocklist-reason": "Rason",
-       "ipblocklist-submit": "Biruken",
+       "ipblocklist-submit": "Agbiruk",
        "ipblocklist-localblock": "Lokal a serra",
        "ipblocklist-otherblocks": "Sabali {{PLURAL:$1|a serra|kadagiti serra}}",
        "infiniteblock": "inggana't inggana",
        "emailblock": "nabaldado ti esurat",
        "blocklist-nousertalk": "saan a mabalin nga agurnos ti bukod a tungtungan a panid",
        "ipblocklist-empty": "Awan linaon ti listaan ti serra.",
-       "ipblocklist-no-results": "Ti kiniddaw nga IP a pagtaengan wenno nagan ti agar-aramat ket saan a naserraan.",
+       "ipblocklist-no-results": "Ti kiniddaw nga adres ti IP wenno nagan ti agar-aramat ket saan a naserraan.",
        "blocklink": "serraan",
        "unblocklink": "ikkaten ti serra",
        "change-blocklink": "baliwan ti serra",
        "blocklog-showsuppresslog": "Daytoy nga agar-aramat ket dati a naserraan ken nailemmeng.\nTi listaan ti panagpasardeng ket naikabil dita baba para iti reperensia:",
        "blocklogentry": "naserraan ni [[$1]] nga adda ti oras a panagpaso iti $2 $3",
        "reblock-logentry": "sinukatan ti pannakaserra para kenni [[$1]] nga adda ti oras a panagpaso iti $2 $3",
-       "blocklogtext": "Daytoy ket listaan ti agar-aramat kadagiti panagserra ken panaglukat ti serra\nDagiti automatiko a panakaserra ti IP a pagtaengan ket saan a nailista.\nKitaen ti [[Special:BlockList|listaan ti serra]] para iti listaan kadagiti agdama a naiparit a pagpataray ken dagiti serra.",
+       "blocklogtext": "Daytoy ket listaan ti agar-aramat kadagiti panagserra ken panaglukat ti serra\nDagiti automatiko a pannakaserra ti adres ti IP ket saan a nailista.\nKitaen ti [[Special:BlockList|listaan ti serra]] para iti listaan kadagiti agdama a panangiparit ti pagpataray ken dagiti serra.",
        "unblocklogentry": "lukatan ti serra ni $1",
        "block-log-flags-anononly": "dagiti di ammo nga agar-aramat laeng",
        "block-log-flags-nocreate": "nabaldado ti panagpartuat ti pakabilangan",
        "ipb-otherblocks-header": "Sabali {{PLURAL:$1|a naserraan|kadagiti naserraan}}",
        "unblock-hideuser": "Saanmo a maisubli ti serra daytoy nga agar-aramat, nailemmengen ti nagan daytoy nga agar-aramat.",
        "ipb_cant_unblock": "Biddut: San a nabirukan ti ID $1 ti serra. Mabalin a nalukatanen ti serrana.",
-       "ipb_blocked_as_range": "Biddut: Ti IP a pagtaengan ti $1 ket saan a dagus a naserraan ken saan a malukatan ti serrana.\nNgem, nupay kasta, naserran a kas paset ti sakop ti $2, a mabalin a malukatan ti serrana.",
+       "ipb_blocked_as_range": "Biddut: Ti adres ti IP ti $1 ket saan a dagus a naserraan ken saan a malukatan ti serrana.\nNgem, nupay kasta, naserran a kas paset ti sakop ti $2, a mabalin a malukatan ti serrana.",
        "ip_range_invalid": "Imbalido a sakop ti IP.",
        "ip_range_toolarge": "Dagiti serra a nasakop a dakdakkel ngem /$1 ket saan a maipalubos.",
        "proxyblocker": "Pannakbagi a panagserra",
        "proxyblockreason": "Ti IP a pagtaengam ket naserraan ngamin ket daytoy ket nakalukat a panakbagi.\nPangngaasi a kontakem ti agit-ited ti serbisio ti Internetmo wenno teknikal a suporta ti gunglom ken ibagam kaniada ti nakaro a parikut ti seguridad.",
        "sorbsreason": "Ti IP a pagtaengam ket nailista a kasla \"nalukatan a pannakbagi\" iti DNSBL nga inusar babaen ti {{SITNAME}}.",
        "sorbs_create_account_reason": "Ti IP a pagtaengam ket nailista a kasla \"nalukatan a pannakbagi\" iti DNSBL nga inusar babaen ti {{SITNAME}}.\nSaanka a makapartuat ti pakabilangan.",
-       "xffblockreason": "Ti maysa nga IP a pagtaengan nga adda iti X-Forwarded-For header, mabalin a kukuam wenno ti pannakbagi a server nga us-usarem, ket naserraan. Ti kasisigud a rason ti pannakaserra idi ket: $1",
+       "xffblockreason": "Ti maysa nga adres ti IP nga adda iti paulo ti X-Forwarded-For, mabalin a kukuam wenno ti pannakbagi a server nga us-usarem, ket naserraan. Ti kasisigud a rason ti pannakaserra idi ket: $1",
        "cant-see-hidden-user": "Ti agar-aramat a kayatmo a serraan ket naserraanen ken nailemmeng.\nGapu ta awan met ti karbengam nga agilemming ti agar-aramat, saanmo a makita wenno maurnos ti serra ti agar-aramat.",
        "ipbblocked": "Saanmo a mabalin ti agserra wenno agikkat ti serra ti sabali nga agar-aramat, ngamin ket naserraanka met.",
        "ipbnounblockself": "Saanmo a mabalin a lukatan ti serram.",
        "movepagetext-noredirectfixer": "Ti panagusar ti kinabuklan dita baba, ket panaganan ti panid, iyalisna amin ti pakasaritaanna iti baro a nagan.\nTi daan a titulo ket agbalin baw-ing a panid idiay baro a titulo.\nSiguraduem a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRebbengem ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket <strong>saan</strong> a maiyalis no addaan iti sigud a panid iti baro a titulo, malaksid no awan linaonna wenno no maysa a baw-ing a panid ken awan ti panagbaliw iti pakasaritaan ti napalabas. \nKayat a sawen daytoy a mabalinmo a sukatan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saanmo a mabalin a suratan manen ti addaan a panid.\n\n<strong>Nota:</strong>\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim ta pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
        "movepagetalktext": "No kur-item daytoy a kahon, automatikonto a maiyalis ti mainaig a tungtungan a panid, malaksid no addanto idiay iti adda linaon a tungtungan a panid.\n\nIti daytoy a kaso, masapul nga iyalis wenno manual nga itiponmo ti panid no kayatmo.",
        "moveuserpage-warning": "<strong>Ballaag:</strong> Mangrugrugika nga agiyalis ti panid ti agar-aramat. Pangngaasi a laglapipen a ti panid ket isu laeng ti maiyalis ken ti agar-aramat ket <em>saanto</em> a managanan.",
-       "movecategorypage-warning": "<strong>Ballaag:</strong> Mangiyal-aliskan iti panid ti kategoria. Pangngaasi a laglagipen a ti maiyalisto laeng ket ti panid ken ti aniaman a pampanid iti daan a kategoria ket <em>saanto</em> a maikategoria iti baro.",
+       "movecategorypage-warning": "<strong>Ballaag:</strong> Mangiyal-aliskan iti panid ti kategoria. Pangngaasi a laglagipen a ti maiyalisto laeng ket ti panid ken ti ania man a pampanid iti daan a kategoria ket <em>saanto</em> a maikategoria iti baro.",
        "movenologintext": "Masapul a nakarehistroka nga agar-aramat ken [[Special:UserLogin|nakastrek]] tapno makaiyalis iti panid.",
        "movenotallowed": "Awan ti pammalubosmo nga agiyalis kadagiti panid.",
        "movenotallowedfile": "Awan ti pammalubosmo nga agiyalis kadagiti papeles.",
        "cant-move-to-user-page": "Awan ti pammalubosmo nga agiyalis ti panid iti panid ti agar-aramat (malaksid kadagiti subpanid ti agar-aramat).",
        "cant-move-category-page": "Awan ti pammalubosmo nga agiyalis kadagiti panid ti kategoria.",
        "cant-move-to-category-page": "Awan ti pammalubosmo nga agiyalis ti panid iti panid ti kategoria.",
+       "cant-move-subpages": "Awan pammalubosmo nga agiyalis kadagiti subpanid.",
+       "namespace-nosubpages": "Saan a mangipalubos kadagiti subpanid ti nagan ti espasio ti \"$1\".",
        "newtitle": "Baro a titulo:",
        "move-watch": "Bantayan ti taudan a panid ken puntaan a panid",
        "movepagebtn": "Iyalis ti panid",
        "movepage-moved-redirect": "Napartuaten ti maysa a baw-ing.",
        "movepage-moved-noredirect": "Napasardeng ti pannakapartuat ti baw-ing.",
        "articleexists": "Adda panid nga adda ti kastan a nagan, wenno ti nagan a pinilim ket saan a mabalin.\nPangngaasi nga agpili ti sabali a nagan.",
-       "cantmove-titleprotected": "Saanmo a maiyalis ti panid iti daytoy a lokasion ngamin ket ti baro a titulo ket nasalakniban manipud ti pannakapartuat",
+       "cantmove-titleprotected": "Saanmo a maiyalis ti panid iti daytoy a lokasion ngamin ket ti baro a titulo ket nasalakniban manipud iti pannakapartuat",
        "movetalk": "Iyalis ti mainaig a panid ti tungtungan",
        "move-subpages": "Iyalis dagiti subpanid (aginggana iti $1)",
        "move-talk-subpages": "Iyalis dagiti subpanid ti tungtungan ti panid (aginggana iti $1)",
        "revertmove": "isubli",
        "delete_and_move_text": "Addan ti pangipanan a panid ti \"[[:$1]]\".\nKayatmo nga ikkaten daytoy tapno makaiyaliska?",
        "delete_and_move_confirm": "Wen, ikkaten ti panid",
-       "delete_and_move_reason": "Naikkat tapno mawayaan ti pannaka-iyalis manipud ti \"[[$1]]\"",
+       "delete_and_move_reason": "Naikkat tapno mawayaan ti pannaka-iyalis manipud iti \"[[$1]]\"",
        "selfmove": "Ti titulo ti taudan ken ti pangipanan ket agpadpada;\nsaanmo a maiyalis ti panid ti isu met laeng a panid.",
        "immobile-source-namespace": "Saan a maiyalis dagiti panid iti nagan ti espasio ti \"$1\"",
        "immobile-target-namespace": "Saan a maiyalis dagiti panid iti nagan ti espasio ti \"$1\"",
        "immobile-target-namespace-iw": "Ti silpo nga interwiki ket saan nga umiso a puntaan para iti panagiyalis ti panid.",
        "immobile-source-page": "Saan a mabalin nga iyalis daytoy a panid.",
        "immobile-target-page": "Saan a maiyalis iti dayta a pangipanan a titulo.",
-       "bad-target-model": "Ti kinaykayat a pangipanan ket agus-usar ti sabali a modelo ti linaon. Saan a mapagbaliwen manipud ti $1 iti $2.",
+       "bad-target-model": "Ti kinaykayat a pangipanan ket agus-usar ti sabali a modelo ti linaon. Saan a mapagbaliwen manipud iti $1 iti $2.",
        "imagenocrossnamespace": "Saan a maiyalis ti papeles iti saan nagan ti espasio ti papeles",
        "nonfile-cannot-move-to-file": "Saan a maiyalis ti saan a papeles iti nagan ti espasio ti papeles",
        "imagetypemismatch": "Ti baro a pagpaatiddog ti papeles ket saan a maipada iti bukodna a kita",
        "imageinvalidfilename": "Ti puntaan a nagan ti papeles ket imbalido",
-       "fix-double-redirects": "Agpabaro kadagiti aniaman a baw-ing a mangipatudo ti kasisigud a titulo",
+       "fix-double-redirects": "Agpabaro kadagiti ania man a baw-ing a mangipatudo ti kasisigud a titulo",
        "move-leave-redirect": "Mangibati ti baw-ing",
        "protectedpagemovewarning": "<strong>Balaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan ti gundaway nga administrador ti makaiyalis.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "semiprotectedpagemovewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaiyalis daytoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "move-over-sharedrepo": "Addan ti [[:$1]] iti pagbingayan a repositorio. Ti panagiyalis ti papeles iti daytoy a titulo ket tuonenna ti pagbingayan a papeles.",
        "file-exists-sharedrepo": "Ti napilim a nagan ti papeles ket naususaren iti pagbingayan a repositorio.\nPangngaasi nga agpilika ti sabali a nagan.",
        "export": "Agipan kadagiti panid",
-       "exporttext": "Maipanmo ti testo ken pakasaritaan ti inurnos iti maysa a panid wenno pampanid a nabalkut ti XML.\nDaytoy ket mabalin a maikabil iti sabali a wiki nga agususar ti MediaWiki nga usaren ti [[Special:Import|pinagala ti panid]].\n\nTi pinagipan ti panid, ikabil ti titulo dita kahon ti testo dita baba, maysa a titulo iti maysa a linia, ken agpili ka no ti kayatmo ket ti agdama a pinagbaliw ken amin nga daan a panagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a panagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a panagurnos.\n\nNo iti kinaudi a kaso mabalinmo nga usaren ti silpo, a kas pagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exporttext": "Maipanmo ti teksto ken pakasaritaan ti inurnos iti maysa a panid wenno pampanid a nabalkut ti XML.\nDaytoy ket mabalin a maikabil iti sabali a wiki nga agus-usar ti MediaWiki nga usaren ti [[Special:Import|pinagala ti panid]].\n\nTi pinagipan ti panid, ikabil ti titulo dita kahon ti teksto dita baba, maysa a titulo iti maysa a linia, ken agpilika no ti kayatmo ket ti agdama a panagbaliw ken amin nga daan a panagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a panagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a panagurnos.\n\nNo iti kinaudi a kaso mabalinmo nga usaren ti silpo, a kas pagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid \"[[{{MediaWiki:Mainpage}}]]\".",
        "exportall": "Ipan amin a pampanid",
        "exportcuronly": "Iraman laeng ti kinaudi a panagbaliw, saan a ti napno a pakasaritaan",
        "exportnohistory": "----\n<strong>Nota:</strong> Ti pagipapan dagiti napno a pakasaritaan dagiti panid iti daytoy a kinabuklan ket nabaldado gapu dagiti pannakalaing ti panagandar a rason.",
        "exportlistauthors": "Iraman ti amin a listaan kadagiti nagaramid iti tunggal a maysa a panid",
        "export-submit": "Agipan",
-       "export-addcattext": "Agnayon kadagiti panid manipud ti kategoria:",
+       "export-addcattext": "Agnayon kadagiti panid manipud iti kategoria:",
        "export-addcat": "Inayon",
-       "export-addnstext": "Agnayon kadagiti panid manipud ti nagan ti espasio:",
+       "export-addnstext": "Agnayon kadagiti panid manipud iti nagan ti espasio:",
        "export-addns": "Inayon",
        "export-download": "Idulin a kas papeles",
        "export-templates": "Mangiraman kadagiti plantilia",
        "export-manual": "Manual nga inayon dagiti panid:",
        "allmessages": "Dagiti mensahe ti sistema",
        "allmessagesname": "Nagan",
-       "allmessagesdefault": "Kasisigud a testo ti mensahe",
-       "allmessagescurrent": "Agdama a testo ti mensahe",
+       "allmessagesdefault": "Kasisigud a teksto ti mensahe",
+       "allmessagescurrent": "Agdama a teksto ti mensahe",
        "allmessagestext": "Daytoy ti listaan dagiti mensahe ti sistema a magun-od iti nagan ti espasio ti MediaWiki.\nPangngaasi a bisitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Lokalisasion ti MediaWiki] ken [https://translatewiki.net translatewiki.net] no kayatmo ti agparawad kadagiti sapasap a panagipatarus ti MediaWiki.",
        "allmessagesnotsupportedDB": "Daytoy a panid ket saan a musar gapu ta nabaldado ti <strong>$wgUseDatabaseMessages</strong>.",
        "allmessages-filter-legend": "Sagat",
        "allmessages-filter-unmodified": "Saan a nabaliwan",
        "allmessages-filter-all": "Amin",
        "allmessages-filter-modified": "Nabaliwan",
-       "allmessages-prefix": "Sagaten babaen ti pasaruno:",
+       "allmessages-prefix": "Sagaten babaen ti pasakbay:",
        "allmessages-language": "Pagsasao:",
        "allmessages-filter-submit": "Inkan",
        "allmessages-filter-translate": "Ipatarus",
        "thumbnail-more": "Padakkelen",
        "filemissing": "Awan ti papeles",
        "thumbnail_error": "Biddut ti panagpartuat ti bassit a ladawan: $1",
-       "thumbnail_error_remote": "Biddut a mensahe manipud ti $1: \n$2",
+       "thumbnail_error_remote": "Biddut a mensahe manipud iti $1: \n$2",
        "djvu_page_error": "Ti DjVu a panid ket saan a masakop",
        "djvu_no_xml": "Saan a naala ti XML iti DjVu a papeles",
        "thumbnail-temp-create": "Saan a makapartuat ti temporario a bassit a ladawan ti papeles",
        "import-mapping-subpage": "Alaen a kas dagiti subpanid ti sumaganad a panid:",
        "import-upload-filename": "Nagan ti papeles:",
        "import-comment": "Komentario:",
-       "importtext": "Pangngaasi nga ipanmo ti papeles manipud ti nagtaudan a wiki nga agusar ti [[Special:Export|ramit ti panagipan]].\nIdulinmo iti bukodmo a kompiuter ken ikarga ditoy.",
+       "importtext": "Pangngaasi nga ipanmo ti papeles manipud iti nagtaudan a wiki nga agusar ti [[Special:Export|ramit ti panagipan]].\nIdulinmo iti bukodmo a kompiuter ken ikarga ditoy.",
        "importstart": "Agal-ala kadagiti panid...",
        "import-revision-count": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}}",
        "importnopages": "Awan dagiti maala a panid.",
        "xml-error-string": "$1 iti linia $2, tukol $3 (byte $4): $5",
        "import-upload": "Ikarga ti datos ti XML",
        "import-token-mismatch": "Pannakapukaw ti sesion ti datos.\n\nMabalin a nakaruarka. <strong>Pangngaasi a pasingkedan a nakastrekka pay laeng ken padasem manen</strong>.\nNo saan pay a mabalin, padasem ti [[Special:UserLogout|rummuar]] ken sumrek manen, ken kitaen no ti pagpasabasam ket mangipalubos kadagiti galieta manipud iti daytoy a sitio.",
-       "import-invalid-interwiki": "Saan a makaala manipud ti nainaganan a wiki.",
+       "import-invalid-interwiki": "Saan a makaala manipud iti nainaganan a wiki.",
        "import-error-edit": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket saanmo a mabalin nga urnosen.",
        "import-error-create": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket saanmo a mabalin a partuaten.",
        "import-error-interwiki": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket ti nagan ket naireserba para iti ruar a panagsilpo (interwiki).",
        "import-error-bad-location": "Ti rebision ti $2 nga agus-usar ti modelo a linaon ti $3 ket saan a maipenpen iti \"$1\" iti daytoy a wiki, gapu ta dayta a modelo ket saan a nasuportaran iti dayta a panid.",
        "import-options-wrong": "Saan a husto {{PLURAL:$2|a pagpilian|a pagpilpilian}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Ti naited a ramut ti panid ket imbalido a titulo.",
-       "import-rootpage-nosubpage": "Ti nagan ti espasio ti \"$1\" iti ramut ti panid ket saan a mangpalubos kadagiti subpanid.",
+       "import-rootpage-nosubpage": "Ti nagan ti espasio ti \"$1\" iti ramut ti panid ket saan a mangipalubos kadagiti subpanid.",
        "importlogpage": "Listaan ti panagala",
-       "importlogpagetext": "Dagiti administratibo a panagala kadagiti panid nga addaan iti pakasaritaan ti panag-urnos manipud kadagiti sabali a wiki.",
+       "importlogpagetext": "Dagiti administratibo a panagala kadagiti panid nga addaan iti pakasaritaan ti panagurnos manipud kadagiti sabali a wiki.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naala",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|rebision|dagiti rebision}} ti naala manipud ti $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|rebision|dagiti rebision}} ti naala manipud iti $2",
        "javascripttest": "Panagsubok ti JavaScript",
        "javascripttest-pagetext-unknownaction": "Di ammo a tignay ti \"$1\".",
        "javascripttest-qunit-intro": "Kitaen ti [ $1 dukomentasion ti panagsubok] idiay mediawiki.org.",
        "tooltip-pt-userpage": "Panidmo nga agar-aramat",
-       "tooltip-pt-anonuserpage": "Ti panid ti agar-aramat para iti daytoy nga IP a pagtaengan a kas ur-urnosem",
+       "tooltip-pt-anonuserpage": "Ti panid ti agar-aramat para iti daytoy nga adres ti IP a kas ur-urnosem",
        "tooltip-pt-mytalk": "Tungtungam a panid",
        "tooltip-pt-anontalk": "Pakitungtungan a maipanggep kadagiti panagurnos manipud iti daytoy nga adres ti IP",
        "tooltip-pt-preferences": "Dagiti kakaykayatam",
        "tooltip-ca-undelete": "Isubli dagiti inurnos a naaramid iti daytoy a panid sakbay idi naikkat",
        "tooltip-ca-move": "Iyalis daytoy a panid",
        "tooltip-ca-watch": "Inayon daytoy a panid iti listaan ti bambantayam",
-       "tooltip-ca-unwatch": "Ikkaten daytoy a panid manipud ti listan ti bambantayam",
+       "tooltip-ca-unwatch": "Ikkaten daytoy a panid manipud iti listan ti bambantayam",
        "tooltip-search": "Agbiruk iti {{SITENAME}}",
        "tooltip-search-go": "Inka idiay panid nga adda kastoy a naganna no adda",
-       "tooltip-search-fulltext": "Biruken dagiti panid para iti daytoy a testo",
+       "tooltip-search-fulltext": "Agbiruk kadagiti panid para iti daytoy a teksto",
        "tooltip-p-logo": "Sarungkaran ti umuna a panid",
        "tooltip-n-mainpage": "Sarungkaran ti umuna a panid",
        "tooltip-n-mainpage-description": "Sarungkaran ti umuna a panid",
        "tooltip-recreate": "Partuaten manen ti panid urayno dati a naikkat.",
        "tooltip-upload": "Irugi ti panagikarga",
        "tooltip-rollback": "\"Baliktaden\"  isubli ti inurnos (dagiti inurnos) iti daytoy a panid iti naudi a kontributor iti maysa a pindut",
-       "tooltip-undo": "\"Ibabawi\" ipasubli daytoy nga urnos ken lukatanna ti porma ti pagurnosan iti panagpadas a moda. Mangpalubos daytoy ti agikabil ti rason iti pakabuklan.",
+       "tooltip-undo": "\"Ibabawi\" isubli daytoy nga urnos ken lukatanna ti porma ti pagurnosan iti moda ti panagpadas. Mangipalubos daytoy ti agikabil ti rason iti pakabuklan.",
        "tooltip-preferences-save": "Idulin dagiti kakaykayatam",
        "tooltip-summary": "Agikabil ti bassit a pakabuklan",
        "anonymous": "Di ammo {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}} iti {{SITENAME}}",
        "creditspage": "Dagiti pammadayaw ti panid",
        "nocredits": "Awan dagiti pakaammo ti pammadayaw a magun-od para iti daytoy a panid.",
        "spamprotectiontitle": "Panagsalaknib a sagat para iti spam",
-       "spamprotectiontext": "Ti testo a kayatmo nga idulin ket sinerraan babaen ti sagat ti spam.\nDaytoy ket mabalin a gapuanan babaen ti silpo a naiparit ti akin ruar a sitio.",
-       "spamprotectionmatch": "Ti sumaganad a testo ket isu ti nangkalbit ti sagat ti spam: $1",
+       "spamprotectiontext": "Ti teksto a kayatmo nga idulin ket sinerraan babaen ti sagat ti spam.\nDaytoy ket mabalin a gapuanan babaen ti silpo a naiparit ti akinruar a sitio.",
+       "spamprotectionmatch": "Ti sumaganad a teksto ket isu ti nangkalbit ti sagat ti spam: $1",
        "spambot_username": "Panagdalus iti spam ti MediaWiki",
        "spam_reverting": "Ipasubli ti naudi a rebision nga awan dagiti linaon a silpo iti $1",
        "spam_blanking": "Amin dagiti rebision ket aglaon kadagiti silpo iti $1, iblanko",
        "pageinfo-length": "Kaatiddog ti panid (kadagiti byte)",
        "pageinfo-article-id": "ID ti panid",
        "pageinfo-language": "Pagsasao ti naglaon a panid",
+       "pageinfo-language-change": "baliwan",
        "pageinfo-content-model": "Modelo ti linaon ti panid",
        "pageinfo-content-model-change": "baliwan",
        "pageinfo-robot-policy": "Panagpasurot babaen dagiti robot",
        "pageinfo-category-pages": "Bilang dagiti panid",
        "pageinfo-category-subcats": "Bilang dagiti subkategoria",
        "pageinfo-category-files": "Bilang dagiti papeles",
+       "pageinfo-user-id": "ID ti agar-aramat",
        "markaspatrolleddiff": "Markaan a kas napatruliaan",
        "markaspatrolledtext": "Markaan daytoy a panid a kas napatruliaan",
        "markaspatrolledtext-file": "Markaan daytoy a bersion ti papeles a kas napatruliaan",
        "patrol-log-header": "Daytoy ket listaan dagiti napatruliaan a rebision.",
        "log-show-hide-patrol": "$1 listaan ti napatruliaan",
        "log-show-hide-tag": "$1 ti listaan ti etiketa",
+       "confirm-markpatrolled-button": "Sige",
+       "confirm-markpatrolled-top": "Markaan ti rebision $3 iti $2 a kas napatruliaan?",
        "deletedrevision": "Naikkat a daan a rebision ti $1",
        "filedeleteerror-short": "Biddut ti panakaikkat ti papeles: $1",
        "filedeleteerror-long": "Adda nasarakan a biddut idi agikikkat ti papeles:\n\n$1",
        "newimages-showbots": "Ipakita dagiti naikarga babaen dagiti bot",
        "newimages-hidepatrolled": "Ilemmeng dagiti panangikarga a napatruliaan",
        "noimages": "Awan ti makita.",
-       "ilsubmit": "Biruken",
+       "ilsubmit": "Agbiruk",
        "bydate": "babaen ti petsa",
        "sp-newimages-showfrom": "Iparang dagiti baro a papeles a mangrugi manipud idi $2, $1",
        "seconds": "{{PLURAL:$1|$1 a segundo|$1 a segsegundo}}",
        "confirmemail_needlogin": "Masapulmo ti $1 tapno mapasingkedan ti esurat a pagtaengam.",
        "confirmemail_success": "Napasingkedanen ti esurat a pagtaengam.\nMabalinmo tattan ti [[Special:UserLogin|sumrek]] ken nanamen ti wiki.",
        "confirmemail_loggedin": "Napasingkedanen ti esurat a pagtaengam.",
-       "confirmemail_subject": "Pammasingked ti esurat a pagtaengan ti {{SITENAME}}",
-       "confirmemail_body": "Addaan, baka sika, ti naggapu ti IP a pagtaengan $1,\nket nagrehistro ti pakabilangan \"$2\" iti daytoy nga esurat a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan a daytoy a pakabilangan ket kukuam ken ti \npinagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surotem daytoy a panilpo\nta pasardengem ti pinakasingkedan ti esurat a  pagtaengam:\n\n$5\n\nDaytoy a pammasingked a kodigo ket agpaso iti $4.",
-       "confirmemail_body_changed": "Addaan, baka sika, ti naggapu ti IP a pagtaengam $1,\nket nangsukat ti esurat a pagtaengan ti pakabilangan \"$2\" iti daytoy a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket kukuam ken ti \npanagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surutem daytoy a panilpo\nta pasardengem ti pinakasingkedan ti esurat a pagtaengam:\n\n$5\n\nDaytoy a kodigo a pasingkedan ket agpaso iti $4.",
-       "confirmemail_body_set": "Addaan, baka sika met laeng, manipud ti IP a pagtaengan ti $1,\nket nangikabil ti esurat a pagtaengan ti pakabilangan ti \"$2\" iti daytoy a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket agpayso a kukuam ken \npakabaelan dagiti esurat a langa idiay {{SITENAME}}, lukatam daytoy a silpo idiay pabasabasam:\n\n$3\n\nNo daytoy a pakabilangan ket *saanmo* a kukua, surutem daytoy a silpo\ntapno ukasen ti panagpasingked ti esurat a pagtaengan:\n\n$5\n\nDaytoy a panagpasingked ti kodigo ket agpaso intono $4.",
+       "confirmemail_subject": "Pammasingked ti adres ti esurat ti {{SITENAME}}",
+       "confirmemail_body": "Addaan, baka sika, ti naggapu ti adres ti IP ti $1,\nket nagrehistro ti pakabilangan \"$2\" iti daytoy nga adres ti esurat iti {{SITENAME}}\n\nTapno mapasingkedan a daytoy a pakabilangan ket kukuam ken ti \npinagpabalin ti esurat a kita iti {{SITENAME}}, lukatam daytoy a silpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surotem daytoy a silpo\nta pasardengem ti panagpasingked ti adres ti esuratmo:\n\n$5\n\nDaytoy a kodigo ti pammasingked ket agpaso intono $4.",
+       "confirmemail_body_changed": "Addaan, baka sika, ti naggapu ti adres ti IP ti $1,\nket nangsukat ti adres ti esurat ti pakabilangan \"$2\" iti daytoy ngaadres iti {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket kukuam ken ti \npanagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surutem daytoy a silpo\nta pasardengem ti panagpasingked ti adres ti esuratmo:\n\n$5\n\nDaytoy a kodigo a pammasingked ket agpaso intono $4.",
+       "confirmemail_body_set": "Addaan, baka sika met laeng, manipud iti adres ti IP ti $1,\nket nangikabil ti adres ti esurat ti pakabilangan ti \"$2\" iti daytoy nga adres iti {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket agpayso a kukuam ken \npakabaelan dagiti esurat a langa iti {{SITENAME}}, lukatam daytoy a silpo iti pabasabasam:\n\n$3\n\nNo daytoy a pakabilangan ket *saanmo* a kukua, surutem daytoy a silpo\ntapno ukasen ti panagpasingked ti adres ti esurat:\n\n$5\n\nDaytoy a panagpasingked ti kodigo ket agpaso intono $4.",
        "confirmemail_invalidated": "Naukas ti pammasingked ti esurat a pagtaengam",
        "invalidateemail": "Ukasen ti pammasingked ti esurat",
        "notificationemail_subject_changed": "Nabaliwanen ti nairehistro nga adres ti esurat ti {{SITENAME}}",
        "confirmrecreate": "{{GENDER:$1|Inikkat}} ni agar-aramat [[User:$1|$1]] ([[User talk:$1|tungtungan]])  daytoy a panid kalpasan idi nangrugika nga agurnos iti rason a:\n: <em>$2</em>\nPangngaasi a pasingkedan no agpayso a kayatmo a partuaten manen daytoy a panid",
        "confirmrecreate-noreason": "{{GENDER:$1|Inikkat}} ni agar-aramat [[User:$1|$1]] ([[User talk:$1|tungtungan]]) daytoy a panid kalpasan idi nangrugika nga agurnos. Pangngaasi a pasingkedan no agpayso a kayatmo a partuaten manen daytoy a panid.",
        "recreate": "Partuaten manen",
+       "confirm-purge-title": "Purgaen daytoy a panid",
        "confirm_purge_button": "Sige",
        "confirm-purge-top": "Dalusan ti cache daytoy a panid?",
        "confirm-purge-bottom": "Ti panagpurga ti panid ket dalusanna ti cache ken pursaranna nga iparang dagiti agdama rebision.",
        "confirm-watch-button": "Sige",
        "confirm-watch-top": "Inayon daytoy a panid iti listaan ti bambantayam?",
        "confirm-unwatch-button": "Sige",
-       "confirm-unwatch-top": "Ikkatem daytoy a panid manipud ti listaan ti bambantayam?",
+       "confirm-unwatch-top": "Ikkatem daytoy a panid manipud iti listaan ti bambantayam?",
        "confirm-rollback-button": "Sige",
        "confirm-rollback-top": "Isubli dagiti panagurnos iti daytoy a panid?",
        "quotation-marks": "\"$1\"",
        "lag-warn-normal": "Dagiti panangbalbaliw a nabarbaro ngem $1 {{PLURAL:$1|a segundo|a segsegundo}} ket mabalin a saan a maiparang iti daytoy a listaan.",
        "lag-warn-high": "Gapu ti kinabuntog ti database server, dagiti nasukatan a barbaro ngem $1 {{PLURAL:$1|a segundo|a segegundo}} ket mabalin a saan nga agparang iti daytoy a listaan.",
        "watchlistedit-normal-title": "Urnosen ti listaan ti bambantayan",
-       "watchlistedit-normal-legend": "Ikkaten dagiti titulo manipud ti listaan ti bambantayam",
+       "watchlistedit-normal-legend": "Ikkaten dagiti titulo manipud iti listaan ti bambantayam",
        "watchlistedit-normal-explain": "Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba.\nTi mangikkat ti titulo, ikur-it ti kaaripingna a kahon, ken pinduten ti \"{{int:Watchlistedit-normal-submit}}\".\nMabalinmo pay nga [[Special:EditWatchlist/raw|urnosen ti naata a listaan]].",
        "watchlistedit-normal-submit": "Ikkaten dagiti titulo",
-       "watchlistedit-normal-done": "{{PLURAL:$1|1 ti titulo|$1 dagiti titulo}} a naikkat manipud ti listaan ti bambantayam:",
+       "watchlistedit-normal-done": "{{PLURAL:$1|Ti bugbugtong a titulo|Dagiti $1 a titulo}} ket naikkat manipud iti listaan ti bambantayam:",
        "watchlistedit-raw-title": "Urnosen ti naata a listaan ti bambantayan",
        "watchlistedit-raw-legend": "Urnosen ti naata a listaan ti bambantayan",
        "watchlistedit-raw-explain": "Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba, ken mabaliwam nga urnosen babaen ti panagnayon ken panagkissay manipud ti listaan;\nmaysa a titulo tunggal maysa a linia.\nNo malpaska, pinduten ti \"{{int:Watchlistedit-raw-submit}}\".\nMabalinmo pay nga [[Special:EditWatchlist|usaren ti pagalagadan nga editor]].",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 a titulo|$1 kadagiti titulo}} ti naikkat:",
        "watchlistedit-clear-title": "Dalusan ti listaan ti bambantayan",
        "watchlistedit-clear-legend": "Dalusan ti listaan ti bambantayan",
-       "watchlistedit-clear-explain": "Amin dagiti titulo ket maikkatto manipud ti listaan ti bambantayam",
+       "watchlistedit-clear-explain": "Amin dagiti titulo ket maikkatto manipud iti listaan ti bambantayam",
        "watchlistedit-clear-titles": "Dagiti titulo:",
        "watchlistedit-clear-submit": "Dalusan ti listaan ti bambantayan (Daytoy ket permanente!)",
        "watchlistedit-clear-done": "Nadalusanen ti bambantayam.",
        "version-poweredby-others": "dadduma pay",
        "version-poweredby-translators": "dagiti agipatpatarus iti translatewiki.net",
        "version-credits-summary": "Kayatmi koma a pammadayawan dagiti sumaganad a tao para kadagiti kontribusonda iti [[Special:Version|MediaWiki]].",
-       "version-license-info": "Ti MediaWiki ket nawaya a sopwer; mabalinmo nga iwaras ken/wenno baliwan babaen kadagiti termino ti GNU General Public License a naipablaak babaen ti Free Software Foundation; wenno bersion 2 iti Lisensia, wenno (ti panagpilim) ti  aniaman a naudi a bersion.\n\nTi MediaWiki ket naiwarwaras iti namnama a makatulongto, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANNAKAILAKO wenno KALAINGANNA ITI DAYTOY A PANGGEP. Kitaen ti GNU General Public License para kadagiti adu pay a salaysay.\n\nNaka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU General Public License] a nairaman iti daytoy a programa; no saan, agsuratka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem iti online].",
+       "version-license-info": "Ti MediaWiki ket nawaya a sopwer; mabalinmo nga iwaras ken/wenno baliwan babaen kadagiti termino ti GNU General Public License a naipablaak babaen ti Free Software Foundation; wenno bersion 2 iti Lisensia, wenno (ti panagpilim) ti  ania man a naudi a bersion.\n\nTi MediaWiki ket naiwarwaras iti namnama a makatulongto, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANNAKAILAKO wenno KALAINGANNA ITI DAYTOY A PANGGEP. Kitaen ti GNU General Public License para kadagiti adu pay a salaysay.\n\nNaka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU General Public License] a nairaman iti daytoy a programa; no saan, agsuratka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem iti online].",
        "version-software": "Naisaad a sopwer",
        "version-software-product": "Produkto",
        "version-software-version": "Bersion",
        "fileduplicatesearch": "Agbiruk kadagiti duplikado a papeles",
        "fileduplicatesearch-summary": "Agbiruk kadagiti duplikado a papeles a naibatay kadagiti pateg ti hash.",
        "fileduplicatesearch-filename": "Nagan ti papeles:",
-       "fileduplicatesearch-submit": "Biruken",
+       "fileduplicatesearch-submit": "Agbiruk",
        "fileduplicatesearch-info": "$1 × $2 a piksel<br />Rukod ti papeles: $3<br />Kita ti MIME: $4",
        "fileduplicatesearch-result-1": "Awan ti kapadpadana a duplikado ti papeles ti \"$1\".",
        "fileduplicatesearch-result-n": "Ti papeles ti \"$1\" ket addaan {{PLURAL:$2|iti 1 nga agpadpada a duplikado|kadagiti $2 nga agpadpada a duplikado}}.",
        "tags-create-warnings-above": "Nakasarak {{PLURAL:$2|iti sumaganad a ballaag|kadagiti sumaganad a ballaag}} idi nagpadas a nagpartuat iti etiketa ti \"$1\":",
        "tags-create-warnings-below": "Kayatmo kadi ti agtuloy nga agpartuat iti etiketa?",
        "tags-delete-title": "Ikkaten ti etiketa",
-       "tags-delete-explanation-initial": "Ik-ikkatemon ti etiketa ti \"$1\" manipud ti database.",
+       "tags-delete-explanation-initial": "Ik-ikkatemon ti etiketa ti \"$1\" manipud iti database.",
        "tags-delete-explanation-in-use": "Daytoy ket maikkatto manipud {{PLURAL:$2|kadagiti $2 a rebision wenno naikabil iti listaan|kadagiti amin a $2 a rebision/wenno naikabil iti listaan}} iti agdama  a nakaipakatanna.",
        "tags-delete-explanation-warning": "Daytoy nga aksion ket <strong>saan a maipasubli</strong> ken <strong>saan a mabalin nga ibabawi</strong>, urayno babaen dagiti administradore ti database. Siguraduem a daytoy ti etiketa a kayatmo nga ikkaten.",
        "tags-delete-explanation-active": "<strong>Aktibo pay laeng ti etiketa ti \"$1\", ken agtuloy a maipakat iti masakbayan.</strong> Tapno mangpasardeng daytoy a mapasamak, mapan iti lugar wenno luglugar nga ayan a pakaipakatanto ti etiketa, ken ibaldado idiay.",
        "logentry-managetags-create": "{{GENDER:$2|Nagpartuat}} ni $1 ti etiketa ti \"$4\"",
        "log-name-tag": "Listaan ti etiketa",
        "rightsnone": "(awan)",
-       "revdelete-summary": "Pakabuklan ti inurnos",
        "feedback-adding": "Agnaynayon ti feedback iti panid...",
        "feedback-back": "Agsubli",
        "feedback-bugcheck": "Nasayaaten! Kitaem tapno saan a dagiti adda idin a [$1 nga ammo a parparikut].",
        "feedback-bugornote": "No sisasagakan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi nga [$1 ireporta ti parikut].\nNupay kasta, mausarmo ti nalaka a porma dita baba. Ti komentario nga itedmo ket mainayon iti panid \"[$3 $2], a mairaman ti naganmo nga agar-aramat ken no ania ti pagbasabasa nga us-sarem.",
        "feedback-cancel": "Ukasen",
        "feedback-close": "Nalpasen",
-       "feedback-error1": "Biddut: Saan a malasin dagiti nagbanagan manipud ti API",
+       "feedback-error1": "Biddut: Saan a malasin dagiti nagbanagan manipud iti API",
        "feedback-error2": "Biddut: Napaay ti panagurnos",
-       "feedback-error3": "Biddut: Awan ti sungbat manipud ti API",
+       "feedback-error3": "Biddut: Awan ti sungbat manipud iti API",
        "feedback-error4": "Biddut:Saan a naipablak iti naited a titulo ti feedback",
        "feedback-message": "Mensahe:",
        "feedback-subject": "Suheto:",
        "feedback-thanks": "Agyaman! Ti feedbackmo ket naipablaak iti panid \"[$2 $1]\".",
        "feedback-thanks-title": "Agyamanak!",
        "feedback-useragent": "Ahente ti agar-aramat:",
-       "searchsuggest-search": "Biruken",
+       "searchsuggest-search": "Agbiruk iti {{SITENAME}}",
        "searchsuggest-containing": "naglaon ti...",
        "api-error-badtoken": "Akin-uneg a biddut: Dakes a tandaan.",
        "api-error-emptypage": "Agparprtuat ti baro, dagiti awan ti linaon a panid ket saan a maipalubos.",
        "pagelang-language": "Pagsasao",
        "pagelang-use-default": "Usaren ti kasisigud a pagsasao",
        "pagelang-select-lang": "Agpili iti pagsasao",
+       "pagelang-reason": "Rason",
        "pagelang-submit": "Ited",
+       "pagelang-nonexistent-page": "Awan ti panid ti $1.",
        "right-pagelang": "Baliwan ti pagsasao ti panid",
        "action-pagelang": "baliwan ti pagsasao ti panid",
        "log-name-pagelang": "Listaan ti panagbaliw ti pagsasao",
        "mw-widgets-dateinput-no-date": "Awan ti napili a petsa",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
        "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
+       "mw-widgets-mediasearch-input-placeholder": "Agbiruk para iti midia",
+       "mw-widgets-mediasearch-noresults": "Awan dagiti nabirukan a resulta.",
        "mw-widgets-titleinput-description-new-page": "awan pay ti panid",
        "mw-widgets-titleinput-description-redirect": "ibaw-ing iti $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Agnayon iti kategoria...",
+       "mw-widgets-usersmultiselect-placeholder": "Agnayon pay iti adu...",
        "sessionmanager-tie": "Saan a mabalin nga itipon dagiti nadumaduma kita ti kiddaw ti pammasingked: $1.",
        "sessionprovider-generic": "Dagiti sesion ti $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "dagiti sesion a naibatay iti galieta",
        "log-action-filter-block-block": "Serra",
        "log-action-filter-block-reblock": "Panagbaliw ti serra",
        "log-action-filter-block-unblock": "Ikkaten ti serra",
-       "log-action-filter-contentmodel-change": "Panagbaliw ti Contentmodel",
-       "log-action-filter-contentmodel-new": "Panagpartuat ti panid iti saan a pagalagadan a Contentmodel",
+       "log-action-filter-contentmodel-change": "Panagbaliw ti modelo ti linaon",
+       "log-action-filter-contentmodel-new": "Panagpartuat ti panid iti saan a kasisigud a modelo ti linaon",
        "log-action-filter-delete-delete": "Panagikkat ti panid",
        "log-action-filter-delete-restore": "Panangisubli ti panagikkat ti panid",
        "log-action-filter-delete-event": "Panagikkat ti listaan",
        "authmanager-authn-autocreate-failed": "Napaay ti automatiko a panagpartuat iti lokal a pakabilangan: $1",
        "authmanager-change-not-supported": "Dagiti naited a kredensial ket saan a mabaliwan, gapu ta awan ti mangusar kaniada.",
        "authmanager-create-disabled": "Nabaldado ti panagpartuat ti pakabilangan.",
-       "authmanager-create-from-login": "Tapno mapartuat ti pakabilangam, pangngaasi a punnuen dagiti pagikabilan dita baba.",
+       "authmanager-create-from-login": "Tapno mapartuat ti pakabilangam, pangngaasi a punnuen dagiti pagikabilan.",
        "authmanager-create-not-in-progress": "Saan nga agprogprogreso ti panagpartuat ti pakabilangan wenno napukaw ti datos ti sesion. Pangngaasi a mangrugi manen iti pagrugian.",
        "authmanager-create-no-primary": "Dagiti naited a kredensial ket saan a mabalin a mausar para iti panagpartuat ti pakabilangan.",
        "authmanager-link-no-primary": "Dagiti naited a kredensial ket saan a mabalin a mausar para iti panangisilpo ti pakabilangan.",
        "unlinkaccounts-success": "Ti pakabilangan ket naikkat iti pannakaisilpo.",
        "authenticationdatachange-ignored": "Saan a natengngel ti panagbaliw ti datos ti pammasingked. Mabalin nga awan ti nakompigura a mangited?",
        "userjsispublic": "Pangngaasi a laglagipen: Dagiti subpanid ti JavaScript ket nasken a saan nga aglaon iti datos a nailemed gapu ta makita dagitoy babaen dagiti sabali nga agar-aramat.",
-       "usercssispublic": "Pangngaasi a laglagipen: Dagiti subpanid ti CSS ket nasken a saan nga aglaon iti datos a nailemed gapu ta makita dagitoy babaen dagiti sabali nga agar-aramat."
+       "usercssispublic": "Pangngaasi a laglagipen: Dagiti subpanid ti CSS ket nasken a saan nga aglaon iti datos a nailemed gapu ta makita dagitoy babaen dagiti sabali nga agar-aramat.",
+       "restrictionsfield-badip": "Imbalido nga adres ti IP wenno sakup: $1",
+       "restrictionsfield-label": "Dagiti mapalubosan a sakup ti IP:",
+       "revid": "rebision $1",
+       "pageid": "ID ti panid $1",
+       "gotointerwiki": "Pumanpanaw iti {{SITENAME}}"
 }
index 6990ca0..4feb7b8 100644 (file)
@@ -38,7 +38,7 @@
        "tog-enotifminoredits": "ОагIонашта а файлашта даь хувцамаш геттара зIамига дале а хоам бе сога",
        "tog-enotifrevealaddr": "ДIахайта хоамбараш чу бIаргадейта са почта адрес",
        "tog-shownumberswatching": "Шоаш зем бу оагIонашта юкъе ер оагIув чуяьккха доакьошхоша таьрахь гойта",
-       "tog-oldsig": "ХIанзара яздаь кулг:",
+       "tog-oldsig": "Хьа карара кулг яздар:",
        "tog-fancysig": "Кулг яздара ший йола вики-разметка (автоматически тIахьожаярг йоацаш)",
        "tog-uselivepreview": "Пайда эца сиха дола хьалххе бIаргтохар",
        "tog-forceeditsummary": "ДIахьалхадаккха, нагахьа санна хувцама йоазонца сурт оттадара моттиг хьалъйизанза яле",
        "category-file-count-limited": "Укх категори чу {{PLURAL:$1|$1 файл|$1 файлаш|1=цаI мара файл яц}}.",
        "listingcontinuesabbrev": "(дIахо)",
        "index-category": "Индекс оттаеш оагIонаш",
-       "noindex-category": "Индекс ца оттаеш оагIонаш",
+       "noindex-category": "Индекс оттайинза оагIонаш",
        "broken-file-category": "Файла тIахьожаяргаш болхбеш йоаца оагIонаш",
        "about": "Сурт оттадар",
        "article": "Статья",
        "newwindow": "&nbsp;(керда кора чу)",
        "cancel": "Юхадаккха",
        "moredotdotdot": "ДIахо...",
-       "morenotlisted": "Ð\95Ñ\80 Ñ\81пиÑ\81ок Ñ\85Ñ\8cалйиза Ñ\8fÑ\86.",
+       "morenotlisted": "Ð\95Ñ\80 Ñ\85Ñ\8cаÑ\8fзÑ\8fÑ\8cÑ\80 Ñ\85Ñ\8cалйизанза Ñ\85ила Ð¼ÐµÐ³Ð°Ñ\88 Ñ\8f.",
        "mypage": "ОагIув",
        "mytalk": "Дувца оттадар",
        "anontalk": "Дувца оттадар",
        "yourdomainname": "Хьа нана-цIа:",
        "login": "Чувала/яла",
        "nav-login-createaccount": "Шоаш довзийтар / Дагара йоазув кхоллар",
-       "userlogin": "Шоаш довзийтар е дагара йоазув кхоллар",
-       "userloginnocreate": "Шоаш довзийта",
        "logout": "Аравала/яла",
        "userlogout": "Аравала/яла",
        "notloggedin": "Оаш шоаш довзийтадац системан",
        "userlogin-noaccount": "Доакъашхочун учета яздар дице хьа?",
        "userlogin-joinproject": "ДIахоттале {{SITENAME}}аца",
-       "nologin": "Дагара йоазув йице хьога? $1.",
-       "nologinlink": "Дагара йоазув хьакхолла",
        "createaccount": "Дагара йоазув хьакхолла",
-       "gotaccount": "Укхаза тхьовре дӀаяьзденна дий шо? $1.",
-       "gotaccountlink": "Чувала/яла",
-       "userlogin-resetlink": "Чувалара/ялара дараш дицданнадий шоана?",
        "userlogin-resetpassword-link": "ТIеракхосс хьа пароль?",
        "userlogin-helplink2": "Система чуваларах новкъостал",
        "userlogin-createanother": "Кхыдола дагара йоазув хьакхолла",
        "createacct-emailoptional": "Электронни почта адрес (ца яздича мегаш да)",
        "createacct-email-ph": "Iочуязде хьа электронни почта адрес",
        "createaccountmail": "Пайда эца ца ховш нийсденна къайладIоагIа, иштта хьадайта из белгалдаь электронни почта адреса тӀа.",
-       "createaccountreason": "Бахьан:",
        "createacct-reason": "Бахьан",
        "createacct-submit": "Хьакхолла учета яздар",
        "createacct-another-submit": "Дагара йоазув хьакхолла",
        "showpreview": "Хьалххе бIаргтохар",
        "showdiff": "Даь дола хувцамаш",
        "anoneditwarning": "<strong>Теркам бе!</strong> Хьо автор хинна система чуваьннавац. Нагахьа санна Iа моллагIа хувцам бой, Хьа IP-адрес дийла массанен бIаргагуш хургда. Нагахьа санна Хьо <strong>[$1 хьачувоале]</strong> е <strong>[$2 дагара йоазув хьакхолле]</strong>, нийсдараш (хувцамаш) бувзам болаш хургда Хьа доакъашхой цIерца, иштта кхыдола толажагIи гIойленагIи дола дикаьш хургда Хьона.",
-       "summary-preview": "СÑ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80 Ñ\85Ñ\83Ñ\80гда:",
-       "subject-preview": "Ð\94аÑ\8cкÑ\8aа Ñ\86Iи Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f Ð¸Ñ\88Ñ\82Ñ\82а:",
+       "summary-preview": "Ð¥Ñ\83вÑ\86ама Ñ\81Ñ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80а Ñ\85Ñ\8cалÑ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80:",
+       "subject-preview": "Теман/коÑ\80Ñ\82баÑ\80а Ñ\85Ñ\8cалÑ\85Ñ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80:",
        "blockedtitle": "Доакъашхочун чIега техаб",
        "blockednoreason": "бахьан белгалдаьккха дац",
        "loginreqlink": "довзийта",
        "notextmatches": "ОагIонай тексташта юкъе цхьатара хилар дац",
        "prevn": "{{PLURAL:$1|1=хьалхайогIар|хьалхайогIараш}} $1",
        "nextn": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
-       "prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
+       "prevn-title": "{{PLURAL:$1|ХьалхадоагIа $1 дIаяздар}}",
        "nextn-title": "{{PLURAL:$1|ТIадоагIа $1 яздар|ТIадоагIа $1 яздараш}}",
        "shown-title": "Гойта $1 {{PLURAL:$1|яздаьр|яздаьраш}} укх оáгIон тIа",
        "viewprevnext": "ДIахьажа ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''Укх вики чу йолаш я оагӀув «[[:$1]]»'''",
+       "searchmenu-exists": "<strong>Укх вики чу йолаш я оагӀув «[[:$1]]».</strong>",
        "searchmenu-new": "<strong>Хьакхолла оагIув «[[:$1]]» укх вики-проекте!</strong>\n{{PLURAL:$2|0=|Иштта хьажа Iайха лийха оагIонга.|Иштта хьажа хьай лахара хьахиннарашка.}}",
        "searchprofile-articles": "Кертера оагIонаш",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything-tooltip": "Массайола оагIонаш тIа лахар (дувцар оттадара оагIонаш чулоацаш)",
        "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-result-category-size": "$1 {{PLURAL:$1|юкъедахар}} ($2 {{PLURAL:$2|кIалкатегори}}, $3 {{PLURAL:$3|файл}})",
        "search-redirect": "(дIа-хьахьожадар $1 тIара)",
        "search-section": "(дáкъа «$1»)",
        "search-suggest": "Хьона эшар ер хила мега: $1",
        "prefs-signature": "Кулг яздар",
        "prefs-preview": "Хьалххе бIаргтохар",
        "userrights-user-editname": "Iочуязъе доакъашхочун цӀи:",
-       "editusergroup": "Ð¥Ñ\83вÑ\86а {{GENDER:$1|доакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н}} тоабаш",
+       "editusergroup": "Ð\99оÑ\82Ñ\82а Ð´Ð¾Ð°ÐºÑ\8aаÑ\88Ñ\85ой тоабаш",
        "saveusergroups": "ДIаязъе {{GENDER:$1|доакъашхочун}} тоабаш",
        "userrights-groupsmember": "Дакъа лоаца тоабаш чу:",
        "userrights-reason": "Бахьан:",
        "recentchanges-label-plusminus": "байташкахь боарам хувцар",
        "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа иштта [[Special:NewPages|керда оагIонашка]])",
-       "rcnotefrom": "КIалхагIа хувцамаш хьахьекха я <strong>$2</strong> денза (<strong>$1</strong> кхачалца).",
+       "rcnotefrom": "КIалхагIа {{PLURAL:$5|хувцам белгалбаьккхаб}} <strong>$3, $4</strong> тIера (хьахьекхабац <strong>$1</strong>-л дукхагIа).",
        "rclistfrom": "$3 $2 денза даь хувцамаш хьахьокха",
        "rcshowhideminor": "$1 зIамига нийсдараш",
        "rcshowhideminor-show": "Хьахьокха",
        "rcshowhidemine": "$1 хьа нийсдараш",
        "rcshowhidemine-show": "Хьахьокха",
        "rcshowhidemine-hide": "Къайладаккха",
-       "rclinks": "Хьахьокха $2 дийнахь даь хинна тIеххьара $1 хувцамаш\n<br />$3",
+       "rclinks": "Хьахьокха $2 дийнахь даь хинна тIеххьара $1 хувцамаш",
        "diff": "башхало",
        "hist": "истори",
        "hide": "Къайладаккха",
        "newpages": "Керда оагIонаш",
        "move": "ЦIи хувца",
        "movethispage": "ЦIи хувца укх оагIон",
-       "pager-newer-n": "{{PLURAL:$1|кердагIа дара|кердагIа дараш|кердагIа долачаьрахь}} $1",
+       "pager-newer-n": "$1 дукхагIа {{PLURAL:$1|керда}}",
        "pager-older-n": "{{PLURAL:$1|къаьнара дара|къаьнара дараш|къаьнара долaчарех}} $1",
        "booksources": "Джейнай хьасташ (источники)",
        "booksources-search-legend": "Джейнах лаьца хоам лахар",
        "protect_expiry_old": "Чакхадалара ха — дахáр да.",
        "protect-text": "Хьа йиш я оагIон '''$1''' лорадара лагIа бIаргтоха a, хувца a .",
        "protect-locked-access": "Хьа дагара йоазонга тоъал бокъо яц оагIон лорадара лагIа хувца. '''$1''' оагIон карара оттадараш:",
-       "protect-cascadeon": "{{PLURAL:$1|1=КIалхахь хьагойташ йола оагIувчу|КIалхахь хьагойташ йола оагIувнашчу}} ер оагIув чуяккха халарахь, лорам Iоттая я, хурхала лорам Iоттая я. Укх оагIувни лорама лагIа хувца йийш йолаш я, амма хурхала лорам хувцлургдац.",
+       "protect-cascadeon": "Каскадни лорадар оттадаь йолча {{PLURAL:$1|1=кIалхагIа белгалъяь оагIон чу|кIалхагIа белгалъяь оагIонаш чу}} юкъеяьккха хилара бахьане ер оагIув хIанза лораяь я. Укх оагIон лорадара дарж хувцаро каскадни лорадар меттахдоаккхадац.",
        "protect-default": "Лорадар доацаш",
        "protect-fallback": "Могадаьд алхха ше «$1» волача доакъашхошта",
        "protect-level-autoconfirmed": "Могадаьд алхха ше-ше къоабалбаь хинна доакъашхошта",
        "unblocklogentry": "чIега баьстаб $1",
        "block-log-flags-nocreate": "дагара йоазонаш кхоллар пурам деннадац",
        "move-page-legend": "ОагIон цIи хувцар",
-       "movepagetext": "КIалхара кепаца болхабеча, оаш оагIувни цIи хувцаргья, цунна хувцамий тептар кхыйола меттиге дIачудоаккхаш.\nКIаьнара цIерахь керда цIерий дIачудаккхам хургда.\nКIаьнара цIера тIа даь дола дIачудаккхамаш, шун ший лоIамахь кердадаккха йийш хургья.\nИз оаш ца дой, дехар да, [[Special:DoubleRedirects|шолха]] кхы [[Special:BrokenRedirects|вIашагIаяккха дIачудаккхамий]] кардоламахь хьажа.\nОаш жоп лу, шоай чуяккха йола Iинкаш, даим болхбеш хургдолга.\n\nЗем бахка, оагIувни цIи хувцалургьяц, изза мо цIи йолаш оагIув хилача. \nЙолаш йола оагIув хувца йийш яц, амма хийца йола оагIув юха хьахувца йийш я. \n\n'''Хоамхайтар'''\n\nЦIи хувцар, йовзаш йола оагIувнаший, доккха а цаьхха а хувцамшка дIатIадала мегаш да.\nДехар да, оаш дIахо болх белаьхь, хургдола хIама кхеташ долга, кхеталаш.",
-       "movepagetalktext": "ТIаÑ\82еÑ\85а Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³IÑ\83в, Ñ\88ий Ð»Ð¾IамаÑ\85Ñ\8c Ñ\86Iи Ñ\85Ñ\83влÑ\83Ñ\80гÑ\8cÑ\8f, '''еÑ\80 Ð´Ð°Ð³Ð° Ð° Ð´Ð¾Ð°Ñ\86аÑ\80, Ð´Ð¾Ð°Ñ\86а:'''\n\n*Ð\98зза Ð¼Ð¾ Ñ\86Iи Ð¹Ð¾Ð»Ð°Ñ\88 Ñ\8fÑ\8cÑ\81Ñ\81а Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³IÑ\83в Ñ\8f Ðµ\n*Ð\9eаÑ\88 ÐºIалÑ\85аÑ\85Ñ\8c Ð±ÐµÐ»Ð³Ð°Ð»Ð¾ Ð´Ð°Ñ\8cдаÑ\86.\n\nÐ\98з Ð¸Ñ\88Ñ\82Ñ\82а Ð´Ð°Ð»Ðµ, ÐºÑ\83лги Ð½Ð¾Ð²ÐºÑ\8aоÑ\81Ñ\82алÑ\86а Ð¾Ð°Ð³IÑ\83внаÑ\88 Ð²IаÑ\88агIаÑ\82оÑ\85а  Ðµ Ð´IадеÑ\85Ñ\8cаÑ\8fккÑ\85а Ð´ÐµÐ·Ð° Ñ\88Ñ\83н.",
+       "movepagetext": "КIалха белгаляьча формах пайда ийца Iа оагIон цIи хувцаргья, цун хувцамий тептар кхыйола моттиге оттаярца цхьанна.\nКъаьнарча цIерах хургья кердача цIера дIа-сахьожадар.\nХьа аьттув ба къаьнарча цIера хинна дIа-сахьожадараш ше-ше кердадаккха.\nНагахьа санна Iа из ца дой, дехар ду, [[Special:DoubleRedirects|шолха]]  а [[Special:BrokenRedirects|хеттанза дIа-сахьожадараш]] долаш дий тахка.\nХьо бехктокхаме ва тIахьожаяргаш шоаш тIахьожаде дезача нийса хилар.\n\nТеркам бе, оагIон цIи <strong>хувцалургьйоацалга</strong> нагахьа санна изза мо цIи йола оагIув йолаш яле. Чу хIама доацача оагIонашта е дIа-сахьожадарашта, кхы а цар хувцамий истори йице, из новкъа дац. Из яхилга да, нагахьа Iа харца цIи хувцар даь дале, ше хинна цIи юхадIахувца йиш я, амма бакъда йолаш йола оагIув ца ховш дIаяккха аьттув бац. \n\n<strong>Белгалдоахар:</strong>\nГIоряьннача оагIонай цIи хувцаро тIехдоккхеи цIаьххеи хувцамаш доаладе мега.\nБоккъала, дIахо хье дIавахалехьа, кхета, хила мегаш дар хургдолга.",
+       "movepagetalktext": "Ð\9dагаÑ\85Ñ\8cа Ñ\81анна Iа ÐµÑ\80 Ð¿Ñ\83нкÑ\82 Ð±ÐµÐ»Ð³Ð°Ð»Ñ\8aйой, Ñ\86Ñ\83нÑ\86а Ð±Ñ\83взам Ð±Ð¾Ð»Ð° Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³IÑ\83в Ð¸Ñ\88Ñ\82Ñ\82а Ñ\88е-Ñ\88е Ñ\86Iи Ñ\85ийÑ\86а Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f, Ð½Ð°Ð³Ð°Ñ\85Ñ\8cа Ñ\81анна Ð¸Ð·Ð·Ð° Ð¼Ð¾ Ñ\86Iи Ð¹Ð¾Ð»Ð° Ñ\8fÑ\8cÑ\81Ñ\81а Ð¹Ð¾Ð°Ñ\86а Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³IÑ\83в Ð¹Ð¾Ð»Ð°Ñ\88 Ð¹Ð¸Ñ\86е.\n\nÐ\98з Ð¸Ñ\88Ñ\82Ñ\82а Ð´Ð°Ð»Ðµ, Ð½Ð°Ð³Ð°Ñ\85Ñ\8cа Ð¸Ð· Ñ\8dÑ\88аÑ\88 Ð´Ð°Ð»Ðµ, IайÑ\85а Ð¾Ð°Ð³Iон  Ñ\86Iи Ð´IаÑ\85Ñ\83вÑ\86а.",
        "newtitle": "Керда цIи:",
        "move-watch": "Ер оагIув зем бара хьаязъяьра юкъеяьккха",
        "movepagebtn": "ОагIон цIи хувца",
        "logentry-newusers-create": "{{GENDER:$2|Доакъашхочо хьакхеллад}} дагара йоазув $1",
        "logentry-upload-upload": "$1 {{GENDER:$2|чуяьккхай}} $3",
        "rightsnone": "(яц)",
-       "revdelete-summary": "хувцамий сурт оттадар",
        "searchsuggest-search": "Хьалаха {{grammar:prepositional|{{SITENAME}}}} чу",
        "expand_templates_preview": "Хьалххе бIаргтохар",
        "pagelang-name": "ОагIув",
index 1814b46..e5a0858 100644 (file)
        "login": "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",
-       "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.",
        "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",
        "preview": "Previdar",
        "showpreview": "Previdar",
        "showdiff": "Montrez chanji",
-       "blankarticle": "<strong>Averto:</strong> La pagino vu kreas es vakua.\nSe vu ri-selektos \"{{int:savearticle}}\", la pagino kreesos sen irga kontenajo.",
+       "blankarticle": "<strong>Averto:</strong> La pagino vu kreas es vakua.\nSe vu ri-selektos \"$1\", 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.",
        "editingsection": "Vu redaktas $1 (seciono)",
        "editingcomment": "Vu redaktas $1 (nova seciono)",
        "editconflict": "Redakto-konflikto: $1",
-       "explainconflict": "Ulu chanjis ica pagino depos vu editeskis ol.\nLa supra texto-areo kontenas la texto dil pagino quale ol existas aktuale.\nVua chanji montresas en la infra texto-areo.\nVu devas atachar vua chanji en la existanta texto.\n'''Nur''' la texto en la supra texto-areo registragesos kande vu presez sur \"{{int:savearticle}}\".",
+       "explainconflict": "Ulu chanjis ica pagino depos vu editeskis ol.\nLa supra texto-areo kontenas la texto dil pagino quale ol existas aktuale.\nVua chanji montresas en la infra texto-areo.\nVu devas atachar vua chanji en la existanta texto.\n'''Nur''' la texto en la supra texto-areo registragesos kande vu presez sur \"$1\".",
        "yourtext": "Vua texto",
        "storedversion": "Gardita versiono",
        "nonunicodebrowser": "'''EGARDEZ: Vua navigilo esas ne obediema ad ''unicode''.'''\nSolvo esas funcionanta qua posibligas redaktar pagini sekure por vu: ne-ASCII signi konvertesos en la redakto-buxo kom dekesisala kodi.",
        "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.",
+       "rcfilters-filter-user-experience-level-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",
        "rcshowhidemine": "$1 mea redakti",
        "rcshowhidemine-show": "Montrar",
        "rcshowhidemine-hide": "Celar",
-       "rclinks": "Montrar la lasta $1 chanji dum la lasta $2 dii<br />$3",
+       "rclinks": "Montrar la lasta $1 chanji dum la lasta $2 dii",
        "diff": "dif",
        "hist": "vers",
        "hide": "Celar",
        "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 en {{SITENAME}}",
        "searchsuggest-containing": "quan kontenas...",
        "expand_templates_output": "Rezulto",
index fcec7be..3b85292 100644 (file)
@@ -24,7 +24,9 @@
                        "Matma Rex",
                        "Xð",
                        "Sveinki",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Asmen",
+                       "MyraMidnight"
                ]
        },
        "tog-underline": "Undirstrika tengla:",
        "redirectedfrom": "(Endurbeint frá $1)",
        "redirectpagesub": "Tilvísunarsíða",
        "redirectto": "Endurbeint á:",
-       "lastmodifiedat": "Þessari síðu var síðast breytt $1 klukkan $2.",
+       "lastmodifiedat": "Þessari síðu var síðast breytt $1, klukkan $2.",
        "viewcount": "Þessi síða hefur verið skoðuð $1 {{PLURAL:$1|sinni|sinnum}}.",
        "protectedpage": "Vernduð síða",
        "jumpto": "Stökkva á:",
        "externaldberror": "Uppfærsla mistókst. Annaðhvort varð villa í gagnasafninu eða að þér sé óheimilt að uppfæra aðra aðganga.",
        "login": "Innskrá",
        "nav-login-createaccount": "Innskrá / Búa til aðgang",
-       "userlogin": "Innskrá / Búa til aðgang",
-       "userloginnocreate": "Innskrá",
        "logout": "Útskráning",
        "userlogout": "Útskrá",
        "notloggedin": "Ekki innskráð(ur)",
        "userlogin-noaccount": "Áttu ekki aðgang?",
        "userlogin-joinproject": "Sameina {{SITENAME}}",
-       "nologin": "Ekki með aðgang? $1.",
-       "nologinlink": "Stofnaðu aðgang",
        "createaccount": "Nýskrá",
-       "gotaccount": "Nú þegar með notandanafn? '''$1'''.",
-       "gotaccountlink": "Skráðu þig inn",
-       "userlogin-resetlink": "Gleymdir þú notendaupplýsingunum þínum?",
        "userlogin-resetpassword-link": "Gleymdiru lykilorðinu þínu?",
        "userlogin-helplink2": "Hjálp við innskráningu",
        "userlogin-loggedin": "Þú ert búin(n) að skrá þig inn sem {{GENDER:$1|$1}}.\nNotaðu eyðablaðið fyrir neðan til að skrá þig inn sem annar notandi.",
        "createacct-another-email-ph": "Skrifaðu netfang",
        "createaccountmail": "Nota handahófsvalið bráðabirgðalykilorð og senda það á netfangið sem er tilgreint hér fyrir neðan",
        "createacct-realname": "Raunverulegt nafn (valfrjálst)",
-       "createaccountreason": "Ástæða:",
        "createacct-reason": "Ástæða",
        "createacct-reason-ph": "Afhverju ertu að búa til annan aðgang",
        "createacct-submit": "Búa til aðganginn",
        "preview": "Forskoða",
        "showpreview": "Forskoða",
        "showdiff": "Sýna breytingar",
-       "blankarticle": "<strong>Viðvörun:</strong> Síðan sem þú ert að búa til er tóm.\nEf þú smellir aftur á \"{{int:savearticle}}\", verður síðan búin til án innihalds.",
+       "blankarticle": "<strong>Viðvörun:</strong> Síðan sem þú ert að búa til er tóm.\nEf þú smellir aftur á \"$1\", verður síðan búin til án innihalds.",
        "anoneditwarning": "<strong>Viðvörun:</strong> Þú ert ekki innskráð(ur). Vistfang þitt verður sýnt opinberlega ef þú gerir einhverjar breytingar. Ef þú <strong>[$1 skráir þig inn]</strong> eða <strong>[$2 stofnar aðgang]</strong> munu breytingarnar þínar vera tengdar við notandanafn þitt, ásamt öðrum kostum.",
        "anonpreviewwarning": "Þú ert ekki innskráð(ur). Vistfang þitt skráist í breytingaskrá síðunnar.",
        "missingsummary": "'''Áminning:''' Þú hefur ekki skrifað breytingarágrip.\nEf þú smellir á Vista aftur, verður breyting þín vistuð án þess.",
        "missingcommenttext": "Gerðu svo vel og skrifaðu athugasemd fyrir neðan.",
-       "missingcommentheader": "<strong>Áminning:</strong> Þú hefur ekki gefið upp umræðuefni.\nEf þú smellir á \"{{int:savearticle}}\" aftur, verður breyting þín vistuð án þess.",
+       "missingcommentheader": "<strong>Áminning:</strong> Þú hefur ekki gefið upp umræðuefni.\nEf þú smellir á \"$1\" aftur, verður breyting þín vistuð án þess.",
        "summary-preview": "Forskoða breytingarágrip:",
        "subject-preview": "Forskoðun umræðuefnis:",
        "blockedtitle": "Notandi er bannaður",
        "right-editprotected": "Breyta síðum vernduðum sem „{{int:protect-level-sysop}}“",
        "right-editsemiprotected": "Breyta síðum vernduðum sem „{{int:protect-level-autoconfirmed}}“",
        "right-editinterface": "Breyta notandaviðmótinu",
-       "right-editusercssjs": "Breyta CSS- og JS-skrám annarra",
        "right-editusercss": "Breyta CSS-skrám annarra",
        "right-edituserjs": "Breyta JS-skrám annarra",
        "right-editmyusercss": "Breyta þinni eigin CSS-notandaskrá",
        "rcshowhidecategorization": "$1 flokkun síðna",
        "rcshowhidecategorization-show": "Birta",
        "rcshowhidecategorization-hide": "Fela",
-       "rclinks": "Sýna síðustu $1 breytingar síðustu $2 daga<br />$3",
+       "rclinks": "Sýna síðustu $1 breytingar síðustu $2 daga",
        "diff": "breyting",
        "hist": "breytingaskrá",
        "hide": "Fela",
        "undeleteviewlink": "skoða",
        "undeleteinvert": "Snúa vali við",
        "undeletecomment": "Ástæða:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|breyting endurvakin|breytingar endurvaktar}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|breyting|breytingar}} og $2 {{PLURAL:$2|skrá|skrár}} endurvaktar",
-       "undeletedfiles": "$1 {{PLURAL:$1|skrá endurvakin|skrár endurvaktar}}",
        "cannotundelete": "Afturköllun eyðingar mistókst að hluta eða í heild: \n$1",
        "undeletedpage": "'''$1 var endurvakin'''\n\nSkoðaðu [[Special:Log/delete|eyðingaskrána]] til að skoða eyðingar og endurvakningar.",
        "undelete-header": "Sjá [[Special:Log/delete|eyðingarskrá]] fyrir síður sem nýlega hefur verið eytt.",
        "log-name-managetags": "Breytingaskrá yfir sýsl með merki",
        "logentry-managetags-create": "$1 {{GENDER:$2|bjó til}} merkið \"$4\"",
        "rightsnone": "(engum)",
-       "revdelete-summary": "breytingarágrip",
        "feedback-adding": "Bæti umsögn á síðuna...",
        "feedback-back": "Til baka",
        "feedback-bugcheck": "Frábært! Athugaðu hvort þessi villa hafi verið [$1 tilkynnt áður].",
index a41dba2..29ffec6 100644 (file)
                        "Saracrovetto",
                        "Tosky",
                        "Selven",
-                       "Margherita.mignanelli"
+                       "Margherita.mignanelli",
+                       "Redredsonia",
+                       "Luigi.delia",
+                       "Samuele2002",
+                       "Kaspo"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "login": "Entra",
        "login-security": "Verifica la tua identità",
        "nav-login-createaccount": "Entra / registrati",
-       "userlogin": "Entra / registrati",
-       "userloginnocreate": "Entra",
        "logout": "Esci",
        "userlogout": "Esci",
        "notloggedin": "Accesso non effettuato",
        "userlogin-noaccount": "Non hai ancora effettuato la registrazione?",
        "userlogin-joinproject": "Registrati su {{SITENAME}}",
-       "nologin": "Non hai ancora un accesso? $1.",
-       "nologinlink": "Registrati",
        "createaccount": "Registrati",
-       "gotaccount": "Hai già un accesso? $1.",
-       "gotaccountlink": "Entra",
-       "userlogin-resetlink": "Hai dimenticato i tuoi dati di accesso?",
        "userlogin-resetpassword-link": "Hai dimenticato la password?",
        "userlogin-helplink2": "Aiuto con l'accesso",
        "userlogin-loggedin": "Sei già connesso come {{GENDER:$1|$1}}.\nUsa il modulo sottostante per accedere come altro utente.",
        "createaccountmail": "Usa una password casuale temporanea e inviala all'indirizzo di posta elettronica specificato",
        "createaccountmail-help": "Può essere utilizzato per creare un'utenza per un'altra persona senza doverne conoscere la password.",
        "createacct-realname": "Nome reale (opzionale)",
-       "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Perché stai creando un'altra utenza",
        "createacct-reason-help": "Messaggio visualizzato nel registro della creazione dell'utenza",
        "preview": "Anteprima",
        "showpreview": "Visualizza anteprima",
        "showdiff": "Mostra modifiche",
-       "blankarticle": "<strong>Attenzione:</strong> la pagina che stai creando è vuota.\nCliccando nuovamente su \"{{int:savearticle}}\", la pagina sarà creata senza alcun contenuto.",
+       "blankarticle": "<strong>Attenzione:</strong> la pagina che stai creando è vuota.\nCliccando nuovamente su \"$1\", la pagina sarà creata senza alcun contenuto.",
        "anoneditwarning": "<strong>Attenzione:</strong> non hai effettuato l'accesso. Se effettuerai delle modifiche il tuo indirizzo IP sarà visibile pubblicamente. Se <strong>[$1 accedi]</strong> o <strong>[$2 crei un'utenza]</strong>, le tue modifiche saranno attribuite al tuo nome utente, insieme ad altri benefici.",
        "anonpreviewwarning": "<em>Non hai effettuato l'accesso. Salvando, il tuo indirizzo IP sarà registrato nella cronologia della pagina.</em>",
-       "missingsummary": "<strong>Attenzione:</strong> non è stato specificato l'oggetto di questa modifica. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata senza.",
-       "selfredirect": "<strong>Attenzione:</strong> stai reindirizzando questa pagina a se stessa.\nPotresti aver indicato la destinazione errata per il redirect, o stai modificando la pagina sbagliata.\nSe fai clic nuovamente su \"{{int:savearticle}}\", il redirect sarà creato comunque.",
+       "missingsummary": "<strong>Attenzione:</strong> non è stato specificato l'oggetto di questa modifica. Premendo di nuovo \"$1\" la modifica verrà salvata senza.",
+       "selfredirect": "<strong>Attenzione:</strong> stai reindirizzando questa pagina a se stessa.\nPotresti aver indicato la destinazione errata per il redirect, o stai modificando la pagina sbagliata.\nSe fai clic nuovamente su \"$1\", il redirect sarà creato comunque.",
        "missingcommenttext": "Inserire un commento qui sotto.",
-       "missingcommentheader": "<strong>Attenzione:</strong> non è stato specificato l'oggetto di questo commento. Premendo di nuovo \"{{int:savearticle}}\" la modifica verrà salvata senza.",
+       "missingcommentheader": "<strong>Attenzione:</strong> non è stato specificato l'oggetto di questo commento. Premendo di nuovo \"$1\" la modifica verrà salvata senza.",
        "summary-preview": "Anteprima dell'oggetto della modifica:",
        "subject-preview": "Anteprima dell'oggetto:",
        "previewerrortext": "Si è verificato un errore durante il tentativo di mostrare l'anteprima delle tue modifiche.",
        "editingsection": "Modifica di $1 (sezione)",
        "editingcomment": "Modifica di $1 (nuova sezione)",
        "editconflict": "Conflitto di edizione su $1",
-       "explainconflict": "Un altro utente ha salvato una nuova versione della pagina mentre stavi effettuando le modifiche.\nLa casella di modifica superiore contiene il testo della pagina attualmente online, così come è stato aggiornato dall'altro utente.\nLa versione con le tue modifiche è invece riportata nella casella di modifica inferiore.\nSe desideri confermarle, devi riportare le tue modifiche nel testo esistente (casella superiore).\nPremendo il pulsante '{{int:savearticle}}', verrà salvato '''solo''' il testo contenuto nella casella di modifica superiore.",
+       "explainconflict": "Un altro utente ha salvato una nuova versione della pagina mentre stavi effettuando le modifiche.\nLa casella di modifica superiore contiene il testo della pagina attualmente online, così come è stato aggiornato dall'altro utente.\nLa versione con le tue modifiche è invece riportata nella casella di modifica inferiore.\nSe desideri confermarle, devi riportare le tue modifiche nel testo esistente (casella superiore).\nPremendo il pulsante '$1', verrà salvato '''solo''' il testo contenuto nella casella di modifica superiore.",
        "yourtext": "Il tuo testo",
        "storedversion": "La versione memorizzata",
        "nonunicodebrowser": "'''Attenzione: si sta utilizzando un browser non compatibile con i caratteri Unicode. Per consentire la modifica delle pagine senza creare inconvenienti, i caratteri non ASCII vengono visualizzati nella casella di modifica sotto forma di codici esadecimali.'''",
        "readonlywarning": "<strong>Attenzione</strong>: il database è bloccato per manutenzione, non è momentaneamente possibile salvare le modifiche effettuate.\nPer non perderle, copiale in un file di testo e salvalo in attesa dello sblocco del database.\n\nL'amministratore di sistema che impostato il blocco ha fornito questa spiegazione: $1.",
        "protectedpagewarning": "'''Attenzione: questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla.'''\nL'ultimo elemento del registro è riportato di seguito per informazione:",
        "semiprotectedpagewarning": "'''Nota:''' Questa pagina è stata bloccata in modo che solo gli utenti registrati possano modificarla.\nL'ultimo elemento del registro è riportato di seguito per informazione:",
-       "cascadeprotectedwarning": "<strong>Attenzione:</strong> Questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla poiché è inclusa selezionando la protezione \"ricorsiva\" {{PLURAL:$1|nella pagina|nelle pagine}}:",
+       "cascadeprotectedwarning": "<strong>Attenzione:</strong> questa pagina è stata bloccata in modo che solo gli utenti con [[Special:ListGroupRights|diritti specifici]] possano modificarla poiché è inclusa, selezionando la protezione \"ricorsiva\", {{PLURAL:$1|nella pagina|nelle pagine}}:",
        "titleprotectedwarning": "'''Attenzione: questa pagina è stata bloccata in modo che siano necessari [[Special:ListGroupRights|diritti specifici]] per crearla.'''\nL'ultimo elemento del registro è riportato di seguito per informazione:",
        "templatesused": "{{PLURAL:$1|Template utilizzato|Template utilizzati}} in questa pagina:",
        "templatesusedpreview": "{{PLURAL:$1|Template utilizzato|Template utilizzati}} in questa anteprima:",
        "post-expand-template-argument-warning": "'''Attenzione:''' questa pagina contiene uno o più argomenti di template troppo grandi per essere espansi. Tali argomenti verranno omessi.",
        "post-expand-template-argument-category": "Pagine contenenti template con parametri omessi",
        "parser-template-loop-warning": "Rilevato loop del template: [[$1]]",
+       "template-loop-category": "Pagine con template che richiamano sé stessi",
+       "template-loop-category-desc": "La pagina contiene un template che richiama sé stesso, cioè un template in cui è incluso lo stesso template.",
        "parser-template-recursion-depth-warning": "È stato raggiunto il limite di ricorsione nel template ($1)",
        "language-converter-depth-warning": "Limite di profondità del convertitore di lingua superato ($1)",
        "node-count-exceeded-category": "Pagine dove viene superato il numero di nodi",
        "page_first": "prima",
        "page_last": "ultima",
        "histlegend": "Confronto tra versioni: selezionare le caselle corrispondenti alle versioni desiderate e premere Invio o il pulsante in basso.\n\nLegenda: '''({{int:cur}})''' = differenze con la versione attuale, '''({{int:last}})''' = differenze con la versione precedente, '''{{int:minoreditletter}}''' = modifica minore",
-       "history-fieldset-title": "Naviga nella cronologia",
-       "history-show-deleted": "Solo quelli cancellati",
+       "history-fieldset-title": "Ricerca per versioni",
+       "history-show-deleted": "Solo versioni cancellate",
        "histfirst": "prima",
        "histlast": "ultima",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "nextn-title": "{{PLURAL:$1|Risultato successivo|$1 risultati successivi}}",
        "shown-title": "Mostra {{PLURAL:$1|un risultato|$1 risultati}} per pagina",
        "viewprevnext": "Vedi ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "'''Sul sito esiste una pagina il cui nome è \"[[:$1]]\"'''",
+       "searchmenu-exists": "<strong>Su questo wiki esiste una pagina il cui nome è \"[[:$1]]\".</strong> {{PLURAL:$2|0=|Vedi anche gli altri risultati trovati.}}",
        "searchmenu-new": "<strong>Crea la pagina \"[[:$1]]\" su questo wiki!</strong> {{PLURAL:$2|0=|Vedi anche la pagina trovata con la tua ricerca|Vedi anche i risultati della ricerca}}",
        "searchprofile-articles": "Pagine di contenuti",
        "searchprofile-images": "Multimedia",
        "search-file-match": "(corrispondenza nel contenuto del file)",
        "search-suggest": "Forse cercavi: $1",
        "search-rewritten": "Mostro i risultati per $1. Altrimenti, cerca $2.",
-       "search-interwiki-caption": "Progetti fratelli",
+       "search-interwiki-caption": "Risultati dai progetti fratelli",
        "search-interwiki-default": "Risultati da $1:",
        "search-interwiki-more": "(altro)",
        "search-interwiki-more-results": "altri risultati",
        "prefs-help-prefershttps": "Questa preferenza avrà effetto dal prossimo accesso.",
        "prefswarning-warning": "Hai fatto modifiche alle tue preferenze che non sono state ancora salvate.\nSe esci da questa pagina senza cliccare \"$1\" le preferenze non verranno aggiornate.",
        "prefs-tabs-navigation-hint": "Suggerimento: è possibile utilizzare i tasti freccia sinistra e destra per spostarsi tra le schede nell'elenco delle schede.",
-       "userrights": "Gestione dei permessi degli utenti",
+       "userrights": "Diritti utente",
        "userrights-lookup-user": "Seleziona un utente",
        "userrights-user-editname": "Inserire il nome utente:",
        "editusergroup": "Modifica gruppi utente",
        "saveusergroups": "Salva gruppi {{GENDER:$1|utente}}",
        "userrights-groupsmember": "Appartiene {{PLURAL:$1|al gruppo|ai gruppi}}:",
        "userrights-groupsmember-auto": "Membro implicito di:",
-       "userrights-groups-help": "È possibile modificare i gruppi cui è assegnato l'utente.\n* Una casella di spunta selezionata indica l'appartenenza dell'utente al gruppo\n* Una casella di spunta deselezionata indica la sua mancata appartenenza al gruppo.\n* Il simbolo * indica che non è possibile eliminare l'appartenenza al gruppo dopo averla aggiunta (o viceversa).\n* Il simbolo # indica che puoi solo mettere indietro la data di scadenza di questo gruppo; non è possibile portare avanti.",
+       "userrights-groups-help": "È possibile modificare i gruppi cui è assegnato l'utente.\n* Una casella di spunta selezionata indica l'appartenenza dell'utente al gruppo\n* Una casella di spunta deselezionata indica la sua mancata appartenenza al gruppo\n* Il simbolo * indica che non è possibile eliminare l'appartenenza al gruppo dopo averla aggiunta (o viceversa)\n* Il simbolo # indica che puoi solo mettere indietro la data di scadenza di appartenenza a questo gruppo; non è possibile portarla avanti",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Non si dispone dei permessi necessari per modificare i diritti degli utenti su altri siti.",
        "userrights-nodatabase": "Il database $1 non esiste o non è un database locale.",
        "userrights-expiry-current": "Scade il $1",
        "userrights-expiry-none": "Non ha scadenza",
        "userrights-expiry": "Scadenza:",
+       "userrights-expiry-existing": "Scadenza attuale: $2, $3",
+       "userrights-expiry-othertime": "Altra durata:",
        "userrights-expiry-options": "1 giorno:1 day,1 settimana:1 week,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 anno:1 year",
+       "userrights-invalid-expiry": "La scadenza per il gruppo \"$1\" non è valida",
+       "userrights-expiry-in-past": "La scadenza per il gruppo \"$1\" è già passata.",
+       "userrights-cannot-shorten-expiry": "Non puoi anticipare la scadenza dell'appartenenza al gruppo \"$1\". Soltanto gli utenti con il permesso di aggiungere e rimuovere questo gruppo possono anticiparne la scadenza.",
        "userrights-conflict": "Conflitto di modifica dei diritti utente! Controlla e conferma le tue modifiche.",
        "group": "Gruppo:",
        "group-user": "Utenti",
        "right-editsemiprotected": "Modifica pagine protette con \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Modifica il modello di contenuto di una pagina",
        "right-editinterface": "Modifica l'interfaccia utente",
-       "right-editusercssjs": "Modifica i file CSS e JS di altri utenti",
        "right-editusercss": "Modifica i file CSS di altri utenti",
        "right-edituserjs": "Modifica i file JS di altri utenti",
        "right-editmyusercss": "Modifica il file CSS del proprio utente",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Mostra",
        "rcfilters-activefilters": "Filtri attivi",
+       "rcfilters-quickfilters": "Collegamenti rapidi",
+       "rcfilters-savedqueries-defaultlabel": "Filtri salvati",
+       "rcfilters-savedqueries-rename": "Rinomina",
+       "rcfilters-savedqueries-setdefault": "Imposta come predefinito",
+       "rcfilters-savedqueries-unsetdefault": "Rimuovi come predefinito",
+       "rcfilters-savedqueries-remove": "Rimuovi",
+       "rcfilters-savedqueries-new-name-label": "Nome",
+       "rcfilters-savedqueries-apply-label": "Crea collegamento rapido",
+       "rcfilters-savedqueries-cancel-label": "Annulla",
+       "rcfilters-savedqueries-add-new-title": "Salva filtri come un collegamento rapido",
        "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-whatsthis": "Cos'è questo?",
+       "rcfilters-filterlist-feedbacklink": "Lascia un commento sulla nuova funzionalità sperimentale",
+       "rcfilters-highlightbutton-title": "Evidenzia risultati",
+       "rcfilters-highlightmenu-title": "Seleziona un colore",
+       "rcfilters-highlightmenu-help": "Seleziona un colore per evidenziare questa proprietà",
        "rcfilters-filterlist-noresults": "Nessun filtro trovato",
+       "rcfilters-noresults-conflict": "Nessun risultato trovato, perché i criteri di ricerca sono in conflitto",
+       "rcfilters-state-message-subset": "Questo filtro non ha effetto perché i suoi risultati sono inclusi in quelli {{PLURAL:$2|del seguente filtro, più ampio|dei seguenti filtri, più ampi}} (prova ad evidenziarli per distinguerli): $1",
+       "rcfilters-state-message-fullcoverage": "La selezione di tutti i filtri in un gruppo è come non selezionarne alcuno, in questo modo questo filtro non ha effetto. Il gruppo include: $1",
        "rcfilters-filtergroup-registration": "Registrazione utente",
        "rcfilters-filter-registered-label": "Registrato",
-       "rcfilters-filtergroup-authorship": "Modifica paternità",
+       "rcfilters-filter-unregistered-label": "Non registrato",
+       "rcfilters-filtergroup-authorship": "Autore del contributo",
+       "rcfilters-filter-editsbyself-label": "Mie modifiche",
+       "rcfilters-filter-editsbyself-description": "I tuoi contributi.",
+       "rcfilters-filter-editsbyother-label": "Modifiche di altri",
+       "rcfilters-filter-editsbyother-description": "Tutte le modifiche eccetto le tue.",
+       "rcfilters-filtergroup-userExpLevel": "Livello d'esperienza (solo per utenti registrati)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nuovi utenti",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Meno di 10 modifiche e 4 giorni di attività.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Utenti con esperienza",
+       "rcfilters-filter-user-experience-level-experienced-description": "Più di 30 giorni di attività e 500 modifiche.",
+       "rcfilters-filtergroup-automated": "Contributi automatici",
        "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Modifiche effettuate da strumenti automatici.",
+       "rcfilters-filter-humans-label": "Umani (non bot)",
+       "rcfilters-filter-humans-description": "Modifiche effettuate da contributori umani.",
+       "rcfilters-filtergroup-reviewstatus": "Stato revisione",
+       "rcfilters-filter-patrolled-label": "Verificate",
+       "rcfilters-filter-patrolled-description": "Modifiche contrassegnate come verificate.",
+       "rcfilters-filter-unpatrolled-label": "Non verificate",
+       "rcfilters-filter-unpatrolled-description": "Modifiche non contrassegnate come verificate.",
        "rcfilters-filtergroup-significance": "Significato",
        "rcfilters-filter-minor-label": "Modifiche minori",
+       "rcfilters-filter-minor-description": "Modifiche che sono state indicate come minori.",
        "rcfilters-filter-major-label": "Modifiche non minori",
+       "rcfilters-filter-watchlist-watched-label": "Negli osservati speciali",
        "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....",
+       "rcfilters-filtergroup-lastRevision": "Ultima versione",
+       "rcfilters-filter-lastrevision-label": "Ultima versione",
+       "rcfilters-filter-lastrevision-description": "Le ultime modifiche ad una pagina.",
+       "rcfilters-filter-previousrevision-label": "Versioni precedenti",
        "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",
        "rcshowhidecategorization": "$1 categorizzazione della pagina",
        "rcshowhidecategorization-show": "Mostra",
        "rcshowhidecategorization-hide": "Nascondi",
-       "rclinks": "Mostra le $1 modifiche più recenti apportate negli ultimi $2 giorni<br />$3",
+       "rclinks": "Mostra le $1 modifiche più recenti apportate negli ultimi $2 giorni",
        "diff": "diff",
        "hist": "cron",
        "hide": "Nascondi",
        "largefileserver": "Il file supera le dimensioni consentite dalla configurazione del server.",
        "emptyfile": "Il file appena caricato sembra essere vuoto. Ciò potrebbe essere dovuto ad un errore nel nome del file. Verificare che si intenda realmente caricare questo file.",
        "windows-nonascii-filename": "Questo wiki non supporta nomi di file con caratteri speciali.",
-       "fileexists": "Un file con questo nome esiste già.\nVerificare prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
+       "fileexists": "Un file con questo nome esiste già, verifica prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
        "filepageexists": "La pagina di descrizione di questo file è già stata creata all'indirizzo <strong>[[:$1]]</strong>, anche se non esiste ancora un file con questo nome. La descrizione dell'oggetto inserita in fase di caricamento non apparirà sulla pagina di descrizione. Per far sì che l'oggetto compaia sulla pagina di descrizione, sarà necessario modificarla manualmente.\n[[$1|thumb]]",
        "fileexists-extension": "Un file con nome simile a questo esiste già: [[$2|thumb]]\n* Nome del file caricato: <strong>[[:$1]]</strong>\n* Nome del file esistente: <strong>[[:$2]]</strong>\nForse vuoi scegliere un nome più caratteristico?.",
        "fileexists-thumbnail-yes": "Il file caricato sembra essere una miniatura ''(thumbnail)''. [[$1|thumb]]\nVerificare, per confronto, il file <strong>[[:$1]]</strong>.\nSe si tratta della stessa immagine, nelle dimensioni originali, non è necessario caricarne altre miniature.",
        "enotif_body_intro_moved": "La pagina $1 di {{SITENAME}} è stata spostata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.",
        "enotif_body_intro_restored": "La pagina $1 di {{SITENAME}} è stata ripristinata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.",
        "enotif_body_intro_changed": "La pagina $1 di {{SITENAME}} è stata modificata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.",
-       "enotif_lastvisited": "Visita $1 per vedere tutte le modifiche dall'ultima visita.",
-       "enotif_lastdiff": "Visita $1 per vedere la modifica.",
+       "enotif_lastvisited": "Per tutte le modifiche dalla tua ultima visita, vedi $1",
+       "enotif_lastdiff": "Per vedere questa modifica, vedi $1",
        "enotif_anon_editor": "utente anonimo $1",
        "enotif_body": "Gentile $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nOggetto dell'intervento, inserito dall'autore: $PAGESUMMARY $PAGEMINOREDIT\n\nContatta l'autore:\nvia posta elettronica: $PAGEEDITOR_EMAIL\nsul sito: $PAGEEDITOR_WIKI\n\nNon verranno inviate altre notifiche in caso di ulteriori attività, se non visiti la pagina dopo aver effettuato l'accesso. Inoltre, è possibile modificare le impostazioni di notifica per tutte le pagine nella lista degli osservati speciali.\n\nIl sistema di notifica di {{SITENAME}}, al tuo servizio\n\n--\nPer modificare le impostazioni delle notifiche via posta elettronica, visita \n{{canonicalurl:{{#special:Preferences}}}}\n\nPer modificare la lista degli osservati speciali, visita \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPer rimuovere la pagina dalla lista degli osservati speciali, visita\n$UNWATCHURL\n\nPer commentare e ricevere aiuto:\n$HELPPAGE",
        "created": "creata",
        "protect-expiry-indefinite": "infinito",
        "protect-cascade": "Protezione ricorsiva (estende la protezione a tutte le pagine incluse in questa).",
        "protect-cantedit": "Non è possibile modificare i livelli di protezione per la pagina in quanto non si dispone dei permessi necessari per modificare la pagina stessa.",
-       "protect-othertime": "Durata non in elenco:",
-       "protect-othertime-op": "durata non in elenco",
+       "protect-othertime": "Altra durata:",
+       "protect-othertime-op": "altra durata",
        "protect-existing-expiry": "Scadenza attuale: $2, $3",
        "protect-existing-expiry-infinity": "Scadenza attuale: infinito",
        "protect-otherreason": "Altri motivi/dettagli:",
        "undeleteviewlink": "visualizza",
        "undeleteinvert": "Inverti selezione",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "{{PLURAL:$1|Una versione recuperata|$1 versioni recuperate}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Una versione|$1 versioni}} e $2 file recuperati",
-       "undeletedfiles": "{{PLURAL:$1|Un file recuperato|$1 file recuperati}}",
        "cannotundelete": "Alcuni o tutti i ripristini non riusciti:\n$1",
        "undeletedpage": "'''La pagina $1 è stata recuperata'''\n\nConsulta il [[Special:Log/delete|registro delle cancellazioni]] per vedere le cancellazioni e i recuperi più recenti.",
        "undelete-header": "Consulta il [[Special:Log/delete|registro delle cancellazioni]] per vedere le cancellazioni più recenti.",
        "sp-contributions-uploads": "file caricati",
        "sp-contributions-logs": "registri",
        "sp-contributions-talk": "discussione",
-       "sp-contributions-userrights": "gestione dei permessi",
+       "sp-contributions-userrights": "gestione permessi {{GENDER:$1|utente}}",
        "sp-contributions-blocked-notice": "Questo utente è attualmente bloccato.\nL'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
        "sp-contributions-blocked-notice-anon": "Questo indirizzo IP è attualmente bloccato.\nL'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
        "sp-contributions-search": "Ricerca contributi",
        "ipbemailban": "Impedisci all'utente l'invio di email",
        "ipbenableautoblock": "Blocca automaticamente l'ultimo indirizzo IP usato dall'utente e i successivi con cui vengono tentate modifiche",
        "ipbsubmit": "Blocca l'utente",
-       "ipbother": "Durata non in elenco:",
+       "ipbother": "Altra durata:",
        "ipboptions": "2 ore:2 hours,1 giorno:1 day,3 giorni:3 days,1 settimana:1 week,2 settimane:2 weeks,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 anno:1 year,infinito:infinite",
        "ipbhidename": "Nascondi il nome utente dalle modifiche e dagli elenchi.",
        "ipbwatchuser": "Segui le pagine e le discussioni utente di questo utente",
        "unblocked-id": "Il blocco $1 è stato rimosso",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] è stato sbloccato.",
        "blocklist": "Utenti bloccati",
+       "autoblocklist": "Autoblocchi",
+       "autoblocklist-submit": "Ricerca",
+       "autoblocklist-legend": "Elenca autoblocchi",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Autoblocco locale|Autoblocchi locali}}",
+       "autoblocklist-empty": "L'elenco dei autoblocchi è vuoto.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Altro autoblocco|Altri autoblocchi}}",
        "ipblocklist": "Utenti bloccati",
        "ipblocklist-legend": "Cerca un utente bloccato",
        "blocklist-userblocks": "Nascondi i blocchi degli utenti registrati",
        "move-page-legend": "Spostamento di pagina",
        "movepagetext": "Questo modulo consente di rinominare una pagina, spostando tutta la sua cronologia al nuovo nome. La pagina attuale diverrà automaticamente un redirect al nuovo titolo. Puoi aggiornare automaticamente i redirect che puntano al titolo originale. Puoi decidere di non farlo, ma ricordati di verificare che lo spostamento non abbia creato [[Special:DoubleRedirects|doppi redirect]] o [[Special:BrokenRedirects|redirect errati]]. L'onere di garantire che i collegamenti alla pagina restino corretti spetta a chi la sposta.\n\nSi noti che la pagina <strong>non</strong> sarà spostata se ne esiste già una con il nuovo nome, a meno che quest'ultima non sia costituita solo da un redirect e sia priva di versioni precedenti. In caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.\n\n<strong>Nota:</strong>\nUn cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
        "movepagetext-noredirectfixer": "Questo modulo consente di rinominare una pagina, spostando tutta la sua cronologia al nuovo nome. La pagina attuale diverrà automaticamente un redirect al nuovo titolo. Controlla che lo spostamento non abbia creato [[Special:DoubleRedirects|doppi redirect]] o [[Special:BrokenRedirects|redirect errati]]. L'onere di garantire che i collegamenti alla pagina restino corretti spetta a chi la sposta.\n\nSi noti che la pagina <strong>non</strong> sarà spostata se ne esiste già una con il nuovo nome, a meno che non sia costituita solo da un redirect e sia priva di versioni precedenti. In caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.\n\n<strong>Nota:</strong>\nUn cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
-       "movepagetalktext": "Se selezioni questa casella, la corrispondente pagina di discussione sarà spostata automaticamente al nuovo titolo, a meno che esiste già una pagina di discussione non vuota.\n\nIn questi casi, dovrai spostare o unire manualmente la pagina, se lo si ritiene opportuno.",
+       "movepagetalktext": "Se selezioni questa casella, la corrispondente pagina di discussione sarà spostata automaticamente al nuovo titolo, a meno che esista già una pagina di discussione non vuota.\n\nIn questi casi, se lo ritieni opportuno, dovrai spostare o unire manualmente la pagina.",
        "moveuserpage-warning": "'''Attenzione:''' Si sta per spostare una pagina utente. Nota che verrà spostata solamente la pagina. L'utente ''non'' sarà rinominato.",
        "movecategorypage-warning": "<strong>Attenzione:</strong> si sta per spostare una categoria. Solo questa pagina verrà spostata: tutte le pagine nella vecchia categoria <em>non</em> saranno inserite nella nuova.",
        "movenologintext": "Lo spostamento delle pagine è consentito solo agli utenti registrati che hanno eseguito l'[[Special:UserLogin|accesso]] al sito.",
        "tooltip-pt-mycontris": "La lista dei {{GENDER:|tuoi}} contributi",
        "tooltip-pt-anoncontribs": "Un elenco delle modifiche fatte da questo indirizzo IP",
        "tooltip-pt-login": "Si consiglia di effettuare l'accesso, anche se non è obbligatorio",
+       "tooltip-pt-login-private": "Devi accedere per utilizzare questo wiki",
        "tooltip-pt-logout": "Uscita (logout)",
        "tooltip-pt-createaccount": "Si consiglia di registrarsi e di effettuare l'accesso, anche se non è obbligatorio",
        "tooltip-ca-talk": "Vedi le discussioni relative a questa pagina",
        "newimages-summary": "Questa pagina speciale mostra i file caricati più di recente.",
        "newimages-legend": "Filtra",
        "newimages-label": "Nome file (o una parte di esso):",
+       "newimages-user": "Indirizzo IP o nome utente",
        "newimages-showbots": "Mostra caricamenti di bot",
        "newimages-hidepatrolled": "Nascondi caricamenti verificati",
        "noimages": "Non c'è nulla da vedere.",
        "htmlform-user-not-exists": "<strong>$1</strong> non esiste.",
        "htmlform-user-not-valid": "<strong>$1</strong> non è un nome utente valido.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ha cancellato}} la pagina $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|ha ripristinato}} la pagina \"$3\"",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|ha cancellato}} il redirect $3 con la sovrascrittura",
+       "logentry-delete-restore": "$1 {{GENDER:$2|ha ripristinato}} la pagina $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|ha ripristinato}} la pagina $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 versione|$1 versioni}}",
+       "restore-count-files": "{{PLURAL:$1|1 file|$1 file}}",
        "logentry-delete-event": "$1 {{GENDER:$2|ha modificato}} la visibilità di {{PLURAL:$5|un'azione del registro|$5 azioni del registro}} di \"$3\": $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ha modificato}} la visibilità per {{PLURAL:$5|una versione|$5 versioni}} della pagina $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ha modificato}} la visibilità di alcune azioni del registro di $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|ha aggiornato}} le etichette della versione $4 della pagina $3 ({{PLURAL:$7|aggiunta|aggiunte}} $6; {{PLURAL:$9|rimossa|rimosse}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|ha aggiornato}} le etichette della voce di registro $5 di pagina $3 ({{PLURAL:$7|aggiunta|aggiunte}} $6; {{PLURAL:$9|rimossa|rimosse}} $8)",
        "rightsnone": "(nessuno)",
-       "revdelete-summary": "oggetto della modifica",
+       "rightslogentry-temporary-group": "$1 (temporaneo, fino a $2)",
        "feedback-adding": "Inserimento del feedback nella pagina...",
        "feedback-back": "Indietro",
        "feedback-bugcheck": "Ottimo! Verifica che non sia già fra i [$1 bug conosciuti].",
        "pagelang-reason": "Motivo",
        "pagelang-submit": "Invia",
        "pagelang-nonexistent-page": "La pagina $1 non esiste.",
+       "pagelang-db-failed": "Il database non è stato in grado di modificare la lingua della pagina.",
        "right-pagelang": "Modifica la lingua della pagina",
        "action-pagelang": "modificare la lingua della pagina",
        "log-name-pagelang": "Modifiche lingua",
        "special-characters-group-thai": "Thailandese",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Canadese aborigeno",
        "special-characters-title-endash": "lineetta enne",
        "special-characters-title-emdash": "lineetta emme",
        "special-characters-title-minus": "segno meno",
        "mw-widgets-titleinput-description-new-page": "questa pagina non esiste ancora",
        "mw-widgets-titleinput-description-redirect": "reindirizzamento a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Aggiungi una categoria...",
+       "mw-widgets-usersmultiselect-placeholder": "Aggiungi altri...",
+       "date-range-from": "Dalla data:",
+       "date-range-to": "Alla data:",
        "sessionmanager-tie": "Non è possibile combinare più tipi di richieste di autenticazione: $1.",
        "sessionprovider-generic": "sessioni $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessioni basate su cookie",
        "log-action-filter-contentmodel-change": "Modifica del modello di contenuto",
        "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-delete_redir": "Sovrascrittura di redirect",
        "log-action-filter-delete-restore": "Ripristino pagina",
        "log-action-filter-delete-event": "Cancellazione registro",
        "log-action-filter-delete-revision": "Cancellazione versione",
        "restrictionsfield-label": "Intervalli IP consentiti:",
        "restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "versione $1",
-       "pageid": "ID della pagina $1"
+       "pageid": "ID della pagina $1",
+       "rawhtml-notallowed": "I tag &lt;html&gt; non possono essere utilizzati al di fuori delle normali pagine.",
+       "gotointerwiki": "Stai per lasciare {{SITENAME}}",
+       "gotointerwiki-invalid": "Il titolo specificato non è valido.",
+       "gotointerwiki-external": "Stai per lasciare {{SITENAME}} per visitare [[$2]], che è un sito web diverso.\n\n'''[$1 Continua su $1]'''",
+       "undelete-cantedit": "Non puoi ripristinare questa pagina poiché non hai sufficienti permessi per modificarla.",
+       "undelete-cantcreate": "Non puoi ripristinare questa pagina poiché la pagina con questo nome non è ancora inesistente e non hai sufficienti permessi per crearla."
 }
index 2c4c3ba..f9d606e 100644 (file)
                        "Suchichi02",
                        "にょきにょき",
                        "おはぐろ蜻蛉",
-                       "Aefgh39622"
+                       "Aefgh39622",
+                       "Ayame",
+                       "Omotecho",
+                       "Thibaut120094"
                ]
        },
        "tog-underline": "リンクの下線:",
        "tog-watchdeletion": "自分が削除したページやファイルをウォッチリストに追加",
        "tog-watchuploads": "自分が新しくアップロードしたファイルをウォッチリストに追加",
        "tog-watchrollback": "自分が巻き戻したページをウォッチリストに追加",
-       "tog-minordefault": "編集をすべて既定で細部の編集とする",
+       "tog-minordefault": "すべての編集を既定で細部の編集とする",
        "tog-previewontop": "プレビューを編集ボックスの前に配置",
        "tog-previewonfirst": "編集開始時にもプレビューを表示",
        "tog-enotifwatchlistpages": "ウォッチリストにあるページやファイルが更新されたら、メールを受け取る",
        "missingarticle-rev": "(版番号: $1)",
        "missingarticle-diff": "(差分: $1, $2)",
        "readonly_lag": "データベースはスレーブのデータベースサーバーがマスターに同期するまで自動的にロックされています",
+       "nonwrite-api-promise-error": "「Promise-Non-Write-API-Action」HHTPヘッダーが送信されましたが、リクエストはAPI書き込みモジュールに送信されました。",
        "internalerror": "内部エラー",
        "internalerror_info": "内部エラー: $1",
        "internalerror-fatal-exception": "種別「$1」の致命的例外",
        "login": "ログイン",
        "login-security": "あなたが同一人であることを確認します",
        "nav-login-createaccount": "ログインまたはアカウント作成",
-       "userlogin": "ログインまたはアカウント作成",
-       "userloginnocreate": "ログイン",
        "logout": "ログアウト",
        "userlogout": "ログアウト",
        "notloggedin": "ログインしていません",
        "userlogin-noaccount": "登録がまだの場合",
        "userlogin-joinproject": "{{SITENAME}}のアカウントを作成",
-       "nologin": "登録がまだの場合、$1。",
-       "nologinlink": "アカウントを作成してください",
        "createaccount": "アカウント作成",
-       "gotaccount": "アカウントを既に持っている場合、$1。",
-       "gotaccountlink": "ログインしてください",
-       "userlogin-resetlink": "ログイン情報をお忘れですか?",
        "userlogin-resetpassword-link": "パスワードをお忘れですか?",
        "userlogin-helplink2": "ログインについてのヘルプ",
        "userlogin-loggedin": "{{GENDER:$1|$1}} として既にログインしています。\n別の利用者としてログインするには下のフォームを使用してください。",
        "createacct-email-ph": "メールアドレスを入力",
        "createacct-another-email-ph": "メールアドレスを入力",
        "createaccountmail": "無作為な仮パスワードを生成し、指定のメールアドレスに送信",
+       "createaccountmail-help": "パスワードを知ることなく他の人のためにアカウントを作成するために使用することが出来ます。",
        "createacct-realname": "本名 (省略可能)",
-       "createaccountreason": "理由:",
        "createacct-reason": "理由",
        "createacct-reason-ph": "アカウントを作成する理由",
        "createacct-reason-help": "アカウント作成記録に表示されるメッセージ",
        "botpasswords-deleted-body": "利用者「$2」のボット名「$1」のためのパスワードが削除されました。",
        "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」 が含まれていません。",
        "botpasswords-not-exist": "利用者「$1」はボット「$2」のパスワードを所持していません。",
        "resetpass_forbidden": "パスワードは変更できません",
        "passwordreset-emailelement": "利用者名: \n$1\n\n仮パスワード: \n$2",
        "passwordreset-emailsentemail": "このメールアドレスがあなたのアカウントに関連付けられている場合は、パスワードリセットのメールが送信されます。",
        "passwordreset-emailsentusername": "この利用者名に関連付けられたメールアドレスがある場合は、パスワードリセットのメールが送信されます。",
+       "passwordreset-nocaller": "送信者の情報を提供する必要があります",
+       "passwordreset-nosuchcaller": "送信者が存在しません: $1",
        "passwordreset-ignored": "パスワードのリセットが処理されませんでした。プロバイダーが設定されていない可能性があります。",
        "passwordreset-invalidemail": "無効なメールアドレスです",
        "passwordreset-nodata": "利用者名もメールアドレスも入力されていません",
        "blankarticle": "<strong>警告:</strong>作成しようとしているページの内容がありません。{{Int:savearticle}}\"をもう一度クリックすると、中身の無いページが作成されます。",
        "anoneditwarning": "<strong>警告:</strong> ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。<strong>[$1 ログイン]</strong>または<strong>[$2 アカウントを作成]</strong>すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。",
        "anonpreviewwarning": "<em>ログインしていません。投稿を保存すると、ご使用中のIPアドレスがこのページの履歴に記録されます。</em>",
-       "missingsummary": "<strong>注意:</strong> 編集内容の要約が空欄です。\n「{{int:savearticle}}」をもう一度クリックすると、編集内容は要約なしで保存されます。",
-       "selfredirect": "<strong>警告:</strong> あなたはこのページを自身に転送させようとしています。\n転送先の設定を間違ったか、あるいは間違ったページを編集しているかもしれません。\n「{{int:savearticle}}」を再度クリックすると、そのままの転送ページが作成されます。",
+       "missingsummary": "<strong>注意:</strong> 編集内容の要約が空欄です。\n「$1」をもう一度クリックすると、編集内容は要約なしで保存されます。",
+       "selfredirect": "<strong>警告:</strong> あなたはこのページを自身に転送させようとしています。\n転送先の設定を間違ったか、あるいは間違ったページを編集しているかもしれません。\n「$1」を再度クリックすると、そのままの転送ページが作成されます。",
        "missingcommenttext": "以下にコメントを入力してください。",
-       "missingcommentheader": "<strong>注意:</strong> このコメントに対する題名が空欄です。\n「{{int:savearticle}}」ボタンをもう一度押すと、空のまま編集が保存されます。",
+       "missingcommentheader": "<strong>注意:</strong> このコメントに対する題名が空欄です。\n「$1」ボタンをもう一度押すと、空のまま編集が保存されます。",
        "summary-preview": "要約のプレビュー:",
        "subject-preview": "題名のプレビュー:",
        "previewerrortext": "変更のプレビューを処理中に、エラーが発生しました。",
        "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|個人設定]]で有効なメールアドレスが登録されていない場合、またはメール送信機能の使用がブロックされている場合、「この利用者にメールを送信」の機能は使えません。\n現在ご使用中のIPアドレスは$3、このブロックIDは#$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 、このブロックIDは#$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|個人設定]]でメールアドレスを設定し、確認を行ってください。",
        "editingsection": "「$1」を編集中 (節単位)",
        "editingcomment": "「$1」を編集中 (新しい節)",
        "editconflict": "編集の競合: $1",
-       "explainconflict": "このページを編集し始めた後に、他の誰かがこのページを変更しました。\n上側のテキスト領域は現在の最新の状態です。\n編集していた文章は下側のテキスト領域に示されています。\n編集していた文章を、上側のテキスト領域の、既存の文章に組み込んでください。\n上側のテキスト領域の内容<strong>だけ</strong>が、「{{int:savearticle}}」をクリックした時に実際に保存されます。",
+       "explainconflict": "このページを編集し始めた後に、他の誰かがこのページを変更しました。\n上側のテキスト領域は現在の最新の状態です。\n編集していた文章は下側のテキスト領域に示されています。\n編集していた文章を、上側のテキスト領域の、既存の文章に組み込んでください。\n上側のテキスト領域の内容<strong>だけ</strong>が、「$1」をクリックした時に実際に保存されます。",
        "yourtext": "編集中の文章",
        "storedversion": "保存された版",
        "nonunicodebrowser": "<strong>警告: ご使用中のブラウザーは Unicode に未対応です。</strong>\n安全にページを編集する回避策を表示しています: 編集ボックス内の非 ASCII 文字を 16 進数コードで表現しています。",
        "readonlywarning": "<strong>警告: データベースがメンテナンスのためロックされており、現在は編集内容を保存できません。</strong>\n必要であれば文章をコピー&amp;ペーストしてテキストファイルとして保存し、後ほど保存をやり直してください。\n\nデータベースをロックしたシステム管理者による説明は以下の通りです: $1",
        "protectedpagewarning": "<strong>警告: このページは保護されているため、管理者権限を持つ利用者のみが編集できます。</strong>\n参考として以下に最後の記録を表示します:",
        "semiprotectedpagewarning": "<strong>注意:</strong> このページは保護されているため、登録利用者のみが編集できます。\n参考として以下に最後の記録を表示します:",
-       "cascadeprotectedwarning": "<strong>警告:</strong> このページはカスケード保護されている以下の{{PLURAL:$1|ページ|ページ群}}からトランスクルードのため読み込まれているので、管理者権限を持つ利用者のみが編集できるように保護されています:",
+       "cascadeprotectedwarning": "<strong>警告:</strong> このページはカスケード保護されている以下の{{PLURAL:$1|ページ|ページ群}}からトランスクルードのため読み込まれているので、[[Special:ListGroupRights|特定の権限]]を持つ利用者のみが編集できるように保護されています:",
        "titleprotectedwarning": "<strong>警告: このページは保護されているため、作成には[[Special:ListGroupRights|特定の権限]]が必要です。</strong>\n参考として以下に最後の記録を表示します:",
        "templatesused": "このページで使用されている{{PLURAL:$1|テンプレート}}:",
        "templatesusedpreview": "このプレビューで使用されている{{PLURAL:$1|テンプレート}}:",
        "content-not-allowed-here": "ページ [[$2]] では、「$1」コンテンツは許可されていません",
        "editwarning-warning": "このページを離れると、あなたが行なった変更がすべて失われてしまうかもしれません。\nログインしている場合、個人設定の「{{int:prefs-editing}}」タブでこの警告を表示しないようにすることができます。",
        "editpage-invalidcontentmodel-title": "対応していないコンテンツ形式",
+       "editpage-invalidcontentmodel-text": "コンテンツ・モデル「$1」は対応していません。",
        "editpage-notsupportedcontentformat-title": "対応していないコンテンツ形式",
        "editpage-notsupportedcontentformat-text": "コンテンツ モデル $2 は、コンテンツ形式 $1 に対応していません。",
        "content-model-wikitext": "ウィキテキスト",
        "content-model-css": "CSS",
        "content-json-empty-object": "空のオブジェクト",
        "content-json-empty-array": "空の配列",
+       "deprecated-self-close-category": "無効な自己終了HTMLタグを使用しているページ",
+       "deprecated-self-close-category-desc": "<code>&lt;b/></code> や <code>&lt;span/></code> 等の無効な自己終了HTMLタグを含むページ。これらのタグはまもなく HTML5 の仕様に準拠する動作へと変更されるため、ウィキテキスト内での使用は非推奨となりました。",
        "duplicate-args-warning": "<strong>警告:</strong> [[:$1]]は複数の「$3」パラメータを伴って[[:$2]]を呼び出しています。提供されている最後の値のみが使用されます。",
        "duplicate-args-category": "テンプレート呼び出しで引数が重複しているページ",
        "duplicate-args-category-desc": "引数が重複したテンプレート呼び出しを含むページ。例: <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>、<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>",
        "post-expand-template-argument-warning": "<strong>警告:</strong> このページは、展開後のサイズが大きすぎるテンプレート引数を少なくとも 1 つ含んでいます。\nこれらの引数を省略しました。",
        "post-expand-template-argument-category": "省略されたテンプレート引数を含むページ",
        "parser-template-loop-warning": "テンプレートのループを検出しました: [[$1]]",
+       "template-loop-category": "テンプレートがループしているページ",
+       "template-loop-category-desc": "テンプレート自身が再帰的自己参照を行うなど、ループするテンプレートが含まれているページ。",
        "parser-template-recursion-depth-warning": "テンプレートの再帰の深さ ($1) が上限を超えました",
        "language-converter-depth-warning": "言語変換機能の深さ ($1) が制限を超えました",
        "node-count-exceeded-category": "ノード数が制限を超えたページ",
        "page_first": "先頭",
        "page_last": "末尾",
        "histlegend": "差分の選択: 比較したい版のラジオボタンを選択し、Enterキーを押すか、下部のボタンを押します。<br />\n凡例: <strong>({{int:cur}})</strong>=最新版との比較、<strong>({{int:last}})</strong>=直前の版との比較、<strong>{{int:minoreditletter}}</strong>=細部の編集",
-       "history-fieldset-title": "履歴の閲覧",
-       "history-show-deleted": "削除済みのみ",
+       "history-fieldset-title": "版の検索",
+       "history-show-deleted": "削除のみ",
        "histfirst": "最古",
        "histlast": "最新",
        "historysize": "({{PLURAL:$1|$1バイト}})",
        "search-interwiki-caption": "姉妹プロジェクト",
        "search-interwiki-default": "$1からの結果:",
        "search-interwiki-more": "(続き)",
+       "search-interwiki-more-results": "結果をさらに取得",
        "search-relatedarticle": "関連",
        "searchrelated": "関連",
        "searchall": "すべて",
        "search-external": "外部検索",
        "searchdisabled": "{{SITENAME}}の検索機能は無効化されています。\nさしあたってはGoogleなどで検索できます。\nただし外部の検索エンジンの索引にある{{SITENAME}}のコンテンツは古い場合があります。",
        "search-error": "検索する際にエラーが発生しました: $1",
+       "search-warning": "検索中にエラーが発生しました: $1",
        "preferences": "個人設定",
        "mypreferences": "個人設定",
        "prefs-edits": "編集回数:",
        "username": "{{GENDER:$1|利用者名}}:",
        "prefs-memberingroups": "{{GENDER:$2|所属}}{{PLURAL:$1|グループ}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 ($2 まで)",
        "prefs-registration": "登録日時:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "本名:",
        "prefs-help-prefershttps": "この設定は、次回ログインの際に反映されます。",
        "prefswarning-warning": "個人設定にまだ保存されていない変更があります。\n「$1」をクリックせずに離れた場合、個人設定は更新されません。",
        "prefs-tabs-navigation-hint": "ヒント: ← キーと → キーで、タブ一覧内のタブ間を移動できます。",
-       "userrights": "利用者権限を管理",
+       "userrights": "利用者権限",
        "userrights-lookup-user": "利用者を選択",
        "userrights-user-editname": "利用者名を入力:",
        "editusergroup": "利用者グループの表示",
        "editinguser": "利用者<strong> [[User:$1|$1]]</strong> $2 の権限を変更",
        "viewinguserrights": "{{GENDER:$1|利用者}} <strong>[[User:$1|$1]]</strong> $2 の利用者権限",
        "userrights-editusergroup": "利用者グループを編集",
-       "userrights-viewusergroup": "利用者グループ",
+       "userrights-viewusergroup": "{{GENDER:$1|利用者}}グループ",
        "saveusergroups": "{{GENDER:$1|利用者}}グループを保存",
        "userrights-groupsmember": "所属グループ:",
        "userrights-groupsmember-auto": "自動的に付与される権限:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "この利用者が属するグループを変更できます。\n* チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。\n* チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。\n* 「*」はグループに一旦追加した場合に除去 (あるいはその逆) ができないことを示しています。",
+       "userrights-groups-help": "この利用者が属するグループを変更できます。\n* チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。\n* チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。\n*「*」はグループに一旦追加した場合に除去 (あるいはその逆) ができないことを示しています。\n*「#」は有効期限の延長のみを行うことができるグループの参加資格を示します; 現在の期限よりも短縮することはできません。",
        "userrights-reason": "理由:",
        "userrights-no-interwiki": "他ウィキ上における利用者権限の編集権限は、ありません。",
        "userrights-nodatabase": "データベース$1は存在しないか、ローカル上にありません。",
        "userrights-unchangeable-col": "変更できないグループ",
        "userrights-irreversible-marker": "$1*",
        "userrights-expiry-current": "期限 $1",
-       "userrights-expiry-none": "有効期限切れではありません",
+       "userrights-expiry-none": "無期限",
        "userrights-expiry": "有効期限:",
+       "userrights-expiry-existing": "現在の有効期限: $2 $3",
        "userrights-expiry-othertime": "その他の期間:",
+       "userrights-expiry-options": "1日:1 day,1週間:1 week,1か月:1 month,3か月:3 months,6か月:6 months,1 年:1 year",
+       "userrights-invalid-expiry": "「$1」グループに指定された有効期限は無効です。",
+       "userrights-expiry-in-past": "「$1」グループに指定された有効期限は過去の時刻です。",
+       "userrights-cannot-shorten-expiry": "「$1」グループの参加資格の有効期限を短縮できません。このグループを与奪できる権限を持つ利用者だけが有効期限を短縮できます。",
        "userrights-conflict": "利用者権限の変更が競合しています! 変更内容を確認してください。",
        "group": "グループ:",
        "group-user": "登録利用者",
        "right-editsemiprotected": "「{{int:protect-level-autoconfirmed}}」の保護を設定されたページを編集",
        "right-editcontentmodel": "ページのコンテンツモデルを編集",
        "right-editinterface": "ユーザーインターフェースを編集",
-       "right-editusercssjs": "他の利用者のCSSファイル/JavaScriptファイルを編集",
        "right-editusercss": "他の利用者のCSSファイルを編集",
        "right-edituserjs": "他の利用者のJavaScriptファイルを編集",
        "right-editmyusercss": "自身のCSSファイルを編集",
        "right-applychangetags": "自分の編集に[[Special:Tags|タグ]]を適用する",
        "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-group-other": "その他の活動",
        "grant-blockusers": "利用者をブロックおよびブロック解除",
        "grant-basic": "基礎的な権限",
        "grant-viewdeleted": "削除されたファイルとページを閲覧",
        "grant-viewmywatchlist": "自身のウォッチリストを閲覧",
+       "grant-viewrestrictedlogs": "制限されたログを表示する",
        "newuserlogpage": "アカウント作成記録",
        "newuserlogpagetext": "以下はアカウント作成の記録です。",
        "rightslog": "利用者権限の変更記録",
        "action-deleterevision": "版の削除",
        "action-deletelogentry": "記録項目の削除",
        "action-deletedhistory": "ページの削除履歴の閲覧",
+       "action-deletedtext": "削除された版の本文を閲覧する",
        "action-browsearchive": "削除されたページの検索",
        "action-undelete": "ページの復元",
        "action-suppressrevision": "隠された版の確認と復元",
        "action-applychangetags": "自分の編集にタグを適用する",
        "action-changetags": "個々の版および記録項目への任意のタグの追加と除去",
        "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": "(<em>±123</em>)",
        "recentchanges-submit": "表示",
+       "rcfilters-activefilters": "絞り込み",
+       "rcfilters-savedqueries-cancel-label": "キャンセル",
+       "rcfilters-restore-default-filters": "標準設定の絞り込み条件を適用",
        "rcfilters-clear-all-filters": "すべてのフィルターをクリア",
+       "rcfilters-search-placeholder": "絞り込みを行う(一覧から選択、または検索)",
        "rcfilters-invalid-filter": "無効なフィルター",
+       "rcfilters-empty-filter": "絞り込みは行われていません。全ての項目が表示さます。",
        "rcfilters-filterlist-title": "フィルター",
+       "rcfilters-filterlist-whatsthis": "これは何?",
+       "rcfilters-filterlist-feedbacklink": "絞り込み機能(ベータ版)に関するフィードバックを行う",
+       "rcfilters-highlightbutton-title": "該当項目を強調表示する",
+       "rcfilters-highlightmenu-title": "色を選ぶ",
+       "rcfilters-highlightmenu-help": "この項目を何色で強調表示するか選択してください",
        "rcfilters-filterlist-noresults": "フィルターが見つかりませんでした",
+       "rcfilters-noresults-conflict": "検索条件が競合しているため、絞り込みできません",
+       "rcfilters-state-message-subset": "この項目による絞り込みは全て以下の{{PLURAL:$2|項目}}による絞り込みの結果に含まれています(強調表示を使うことで該当項目を抽出できます) : $1",
+       "rcfilters-state-message-fullcoverage": "同じグループの全ての項目が選択されています。絞り込みできません。同じグループに含まれる項目 :$1",
        "rcfilters-filtergroup-registration": "利用者登録",
        "rcfilters-filter-registered-label": "登録済み",
        "rcfilters-filter-registered-description": "ログイン済みの編集者。",
        "rcfilters-filter-unregistered-label": "未登録",
+       "rcfilters-filter-unregistered-description": "ログインしていない編集者。",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "この項目は、登録済み利用者を編集回数別で絞り込む以下の{{PLURAL:$2|項目}}と競合しています :$1",
+       "rcfilters-filtergroup-authorship": "自分の編集か他者の編集か",
+       "rcfilters-filter-editsbyself-label": "自分の編集",
+       "rcfilters-filter-editsbyself-description": "自分の投稿記録を絞り込む",
+       "rcfilters-filter-editsbyother-label": "自分以外の編集",
+       "rcfilters-filter-editsbyother-description": "自分以外の利用者による編集",
+       "rcfilters-filtergroup-userExpLevel": "編集回数別(登録利用者のみが対象)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "編集回数別絞り込みは登録利用者のみが対象です。「未登録」の絞り込み項目と競合しています。",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "「未登録」の項目が登録済み利用者を絞り込む項目と競合しています。競合している項目は項目選択欄で強調表示されています。",
+       "rcfilters-filter-user-experience-level-newcomer-label": "新規利用者",
+       "rcfilters-filter-user-experience-level-newcomer-description": "登録から4日以内、かつ10編集以下の利用者",
+       "rcfilters-filter-user-experience-level-learner-label": "一般利用者",
+       "rcfilters-filter-user-experience-level-learner-description": "「新規参加者」よりも活動履歴が長く、「定着参加者」より活動履歴が短い利用者",
+       "rcfilters-filter-user-experience-level-experienced-label": "定着利用者",
+       "rcfilters-filter-user-experience-level-experienced-description": "30日以上、かつ500編集以上の活動履歴がある利用者",
+       "rcfilters-filtergroup-automated": "自動編集",
        "rcfilters-filter-bots-label": "ボット",
+       "rcfilters-filter-bots-description": "ツールによって自動化された編集",
        "rcfilters-filter-humans-label": "人間(ボットではない)",
+       "rcfilters-filter-humans-description": "人間の手作業による編集",
+       "rcfilters-filtergroup-reviewstatus": "ステータスの確認",
+       "rcfilters-filter-patrolled-label": "巡回済み",
+       "rcfilters-filter-patrolled-description": "巡回済みとマークされた編集。",
+       "rcfilters-filter-unpatrolled-label": "未巡回",
+       "rcfilters-filter-unpatrolled-description": "まだ巡回済みとマークされていない編集。",
+       "rcfilters-filtergroup-significance": "重要度",
+       "rcfilters-filter-minor-label": "細部の編集",
+       "rcfilters-filter-minor-description": "編集者が細部の編集とマークしたもの。",
+       "rcfilters-filter-major-label": "細部でない編集",
+       "rcfilters-filter-major-description": "細部とマークされていない編集。",
+       "rcfilters-filtergroup-watchlist": "ウォッチリストに追加されているページ",
+       "rcfilters-filter-watchlist-watched-label": "ウォッチリストに登録されたページ",
+       "rcfilters-filter-watchlist-watched-description": "ウォッチリストに登録されているページの変更",
+       "rcfilters-filter-watchlist-watchednew-label": "ウォッチリストのページの新しい変更",
+       "rcfilters-filter-watchlist-watchednew-description": "最終訪問後にウォッチリストに登録されたページに対して行われた変更",
+       "rcfilters-filter-watchlist-notwatched-label": "ウォッチリストに登録されていないページ",
+       "rcfilters-filter-watchlist-notwatched-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": "アカウント作成、削除、アップロードなどのログに残る管理操作",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "「細部の編集」として絞り込めない項目を「細部の編集」として絞り込もうとしています。競合している項目は項目選択欄で強調表示されています。",
+       "rcfilters-hideminor-conflicts-typeofchange": "細部の編集として絞り込めない以下の項目を絞り込もうとしています: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "「細部の編集」の絞り込みと競合しています。この項目を「細部の編集」として絞り込むことはできません。",
+       "rcfilters-filtergroup-lastRevision": "最新版",
+       "rcfilters-filter-lastrevision-label": "最新版",
+       "rcfilters-filter-lastrevision-description": "ページの最新の変更",
+       "rcfilters-filter-previousrevision-label": "新しい版",
+       "rcfilters-filter-previousrevision-description": "ページの最新の変更ではない全ての変更。",
        "rcnotefrom": "以下は<strong>$3 $4</strong>以降の{{PLURAL:$5|更新です}} (最大 <strong>$1</strong> 件)。",
+       "rclistfromreset": "日時指定をリセット",
        "rclistfrom": "$3の$2以降の更新を表示する",
        "rcshowhideminor": "細部の編集を$1",
-       "rcshowhideminor-show": "表示",
-       "rcshowhideminor-hide": "非表示",
+       "rcshowhideminor-show": "表示する",
+       "rcshowhideminor-hide": "非表示にする",
        "rcshowhidebots": "ボットを$1",
-       "rcshowhidebots-show": "表示",
-       "rcshowhidebots-hide": "非表示",
+       "rcshowhidebots-show": "表示する",
+       "rcshowhidebots-hide": "非表示にする",
        "rcshowhideliu": "登録利用者を$1",
-       "rcshowhideliu-show": "表示",
-       "rcshowhideliu-hide": "非表示",
+       "rcshowhideliu-show": "表示する",
+       "rcshowhideliu-hide": "非表示にする",
        "rcshowhideanons": "匿名利用者を$1",
-       "rcshowhideanons-show": "表示",
-       "rcshowhideanons-hide": "非表示",
+       "rcshowhideanons-show": "表示する",
+       "rcshowhideanons-hide": "非表示にする",
        "rcshowhidepatr": "巡回された編集を$1",
-       "rcshowhidepatr-show": "表示",
-       "rcshowhidepatr-hide": "非表示",
+       "rcshowhidepatr-show": "表示する",
+       "rcshowhidepatr-hide": "非表示にする",
        "rcshowhidemine": "自分の編集を$1",
-       "rcshowhidemine-show": "表示",
-       "rcshowhidemine-hide": "非表示",
+       "rcshowhidemine-show": "表示する",
+       "rcshowhidemine-hide": "非表示にする",
        "rcshowhidecategorization": "ページのカテゴリー追加・除去を$1",
-       "rcshowhidecategorization-show": "表示",
-       "rcshowhidecategorization-hide": "非表示",
-       "rclinks": "最近 $2 日間の更新を最大 $1 件表示<br />$3",
+       "rcshowhidecategorization-show": "表示する",
+       "rcshowhidecategorization-hide": "非表示にする",
+       "rclinks": "最近 $2 日間の更新を最大 $1 件表示",
        "diff": "差分",
        "hist": "履歴",
        "hide": "非表示",
        "booksources-search": "検索",
        "booksources-text": "お探しの書籍の新品/中古品を販売している外部サイトへのリンクを以下に列挙します。この書籍についてさらに詳しい情報があるかもしれません:",
        "booksources-invalid-isbn": "指定した ISBN は有効ではないようです。情報源から写し間違えていないか確認してください。",
+       "magiclink-tracking-isbn": "ISBNリンクを使用しているページ",
        "specialloguserlabel": "実行者:",
        "speciallogtitlelabel": "対象 (ページ名または利用者の場合、{{ns:user}}:利用者名):",
        "log": "記録",
        "activeusers-intro": "これは過去 $1 {{PLURAL:$1|日|日間}}に何らかの活動をした利用者の一覧です。",
        "activeusers-count": "過去 {{PLURAL:$3|1 日|$3 日間}}に $1 {{PLURAL:$1|回の操作}}",
        "activeusers-from": "最初に表示する利用者:",
+       "activeusers-groups": "選択した利用者グループに属する利用者を表示:",
+       "activeusers-excludegroups": "選択した利用者グループに属する利用者を非表示:",
        "activeusers-noresult": "利用者が見つかりませんでした。",
        "activeusers-submit": "活動中の利用者を表示",
        "listgrouprights": "利用者グループの権限",
        "enotif_body_intro_restored": "{{SITENAME}}のページ「$1」が$PAGEEDITDATEに、$2 によって{{GENDER:$2|復元}}されました。現在の版は $3 で閲覧できます。",
        "enotif_body_intro_changed": "{{SITENAME}}のページ「$1」が$PAGEEDITDATEに、$2 によって{{GENDER:$2|変更}}されました。現在の版は $3 で閲覧できます。",
        "enotif_lastvisited": "最終訪問以降のすべての変更は $1 をご覧ください。",
-       "enotif_lastdiff": "この変更内容を表示するには $1 をご覧ください。",
+       "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",
        "created": "作成",
        "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による編集を差し戻しました。\n$2による直前の版へ変更されました。",
+       "rollback-success": "{{GENDER:$3|$1}}による編集を差し戻しました。\n{{GENDER:$4|$2}}による直前の版へ変更されました。",
        "rollback-success-notify": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。[$3 変更を表示]",
        "sessionfailure-title": "セッションの失敗",
        "sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\n前のページへ戻って再度読み込んだ後に、もう一度試してください。",
        "changecontentmodel-success-text": "[[:$1]]のコンテンツ・タイプは変更されました。",
        "changecontentmodel-cannot-convert": "[[:$1]]のコンテンツは$2の型には変換できません。",
        "changecontentmodel-nodirectediting": "$1 コンテンツ・モデルは、ダイレクト編集をサポートしていません。",
+       "changecontentmodel-emptymodels-title": "利用可能なコンテンツ・モデルがありません",
        "changecontentmodel-emptymodels-text": "[[:$1]]のコンテンツはどの型にも変換できません。",
        "log-name-contentmodel": "コンテンツ・モデル変更記録",
        "log-description-contentmodel": "ページのコンテンツ・モデルに関連する出来事",
        "protect-cantedit": "このページの編集権限がないため、保護レベルを変更できません。",
        "protect-othertime": "その他の期間:",
        "protect-othertime-op": "その他の期間",
-       "protect-existing-expiry": "現在の保護期限: $2 $3",
-       "protect-existing-expiry-infinity": "既存の有効期限: 無期限",
+       "protect-existing-expiry": "現在の有効期限: $2 $3",
+       "protect-existing-expiry-infinity": "現在の有効期限: 無期限",
        "protect-otherreason": "他の、または追加の理由:",
        "protect-otherreason-op": "その他の理由",
        "protect-dropdown": "*よくある保護理由\n** 度重なる荒らし\n** 度重なるスパム投稿\n** 非生産的な編集合戦\n** 高負荷ページ",
        "undeleteviewlink": "閲覧",
        "undeleteinvert": "選択を反転",
        "undeletecomment": "理由:",
-       "undeletedrevisions": "{{PLURAL:$1|$1版}}を復元しました",
-       "undeletedrevisions-files": "{{PLURAL:$1|$1版}}と{{PLURAL:$2|$2ファイル}}を復元しました",
-       "undeletedfiles": "{{PLURAL:$1|$1ファイル}}を復元しました",
        "cannotundelete": "復元に一部またはすべて失敗しました:\n$1",
        "undeletedpage": "<strong>$1 を復元しました。</strong>\n\n最近の削除と復元は[[Special:Log/delete|削除記録]]で参照できます。",
        "undelete-header": "最近削除されたページは[[Special:Log/delete|削除記録]]で確認できます。",
        "sp-contributions-uploads": "アップロード",
        "sp-contributions-logs": "記録",
        "sp-contributions-talk": "トーク",
-       "sp-contributions-userrights": "利用者権限の管理",
+       "sp-contributions-userrights": "{{GENDER:$1|利用者}}権限の管理",
        "sp-contributions-blocked-notice": "この利用者は現在ブロックされています。\n参考のために最新のブロック記録項目を以下に表示します:",
        "sp-contributions-blocked-notice-anon": "このIPアドレスは現在ブロックされています。\n参考のために最近のブロック記録項目を以下に表示します:",
        "sp-contributions-search": "投稿の検索",
        "unblocked-id": "ブロック$1を除去しました。",
        "unblocked-ip": "[[Special:Contributions/$1|$1]]のブロックを解除しました。",
        "blocklist": "ブロックされている利用者",
+       "autoblocklist": "自動ブロック",
+       "autoblocklist-submit": "検索",
+       "autoblocklist-legend": "自動ブロックの一覧",
+       "autoblocklist-localblocks": "ローカルの{{PLURAL:$1|自動ブロック|自動ブロック}}",
+       "autoblocklist-empty": "自動ブロック一覧は空です。",
+       "autoblocklist-otherblocks": "他の{{PLURAL:$1|自動ブロック|自動ブロック}}",
        "ipblocklist": "ブロックされている利用者",
        "ipblocklist-legend": "ブロックされている利用者の検索",
        "blocklist-userblocks": "アカウントのブロックを非表示",
        "sorbs": "DNSBL",
        "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あなたには hideuser 権限がないため、この利用者のブロックの閲覧/編集はできません。",
        "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": "ページを移動",
        "anonymous": "{{SITENAME}}の匿名{{PLURAL:$1|利用者}}",
        "siteuser": "{{SITENAME}}の利用者 $1",
        "anonuser": "{{SITENAME}}の匿名利用者 $1",
-       "lastmodifiedatby": "このページの最終更新は $1 $2 に $3 によって行われました。",
+       "lastmodifiedatby": "このページの最終編集は $1 $2 に $3 によって行われました。",
        "othercontribs": "また、最終更新より前に $1 が編集しました。",
        "others": "その他",
        "siteusers": "{{SITENAME}}の{{PLURAL:$2|利用者}} $1",
        "newimages-summary": "この特別ページでは、最近アップロードされたファイルを表示します。",
        "newimages-legend": "絞り込み",
        "newimages-label": "ファイル名 (またはその一部):",
+       "newimages-user": "IPアドレスまたは利用者名:",
        "newimages-showbots": "ボットによるアップロードを表示",
        "newimages-hidepatrolled": "巡回済みのアップロードを隠す",
        "noimages": "表示できるものがありません。",
+       "gallery-slideshow-toggle": "トグルサムネイル",
        "ilsubmit": "検索",
        "bydate": "日付順",
        "sp-newimages-showfrom": "$1の$2以降の新しいファイルを表示",
        "tag-filter": "[[Special:Tags|タグ]]絞り込み:",
        "tag-filter-submit": "絞り込み",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|タグ}}]]: $2)",
+       "tag-mw-contentmodelchange": "コンテンツ・モデルの変更",
        "tags-title": "タグ",
        "tags-intro": "このページは、ソフトウェアが編集に対して付けるタグとその意味の一覧です。",
        "tags-tag": "タグ名",
        "tags-display-header": "変更一覧に表示されるもの",
        "tags-description-header": "詳細な意味の説明",
        "tags-source-header": "由来",
-       "tags-active-header": "アクティブ?",
+       "tags-active-header": "使用中?",
        "tags-hitcount-header": "タグが付与された変更",
        "tags-actions-header": "対処操作",
        "tags-active-yes": "はい",
        "htmlform-user-not-valid": "<strong>$1</strong>は有効な利用者名ではありません。",
        "logentry-delete-delete": "$1 がページ「$3」を{{GENDER:$2|削除しました}}",
        "logentry-delete-delete_redir": "$1 がリダイレクト「$3」を上書きにより{{GENDER:$2|削除しました}}",
-       "logentry-delete-restore": "$1 がページ「$3」を{{GENDER:$2|復元しました}}",
+       "logentry-delete-restore": "$1 がページ「$3 ($4)」を{{GENDER:$2|復元しました}}",
+       "logentry-delete-restore-nocount": "$1 がページ「$3」を{{GENDER:$2|復元しました}}",
+       "restore-count-revisions": "$1{{PLURAL:$1|版}}",
+       "restore-count-files": "{{PLURAL:$1|$1ファイル}}",
        "logentry-delete-event": "$1 が $3 の{{PLURAL:$5|記録項目|記録項目$5件}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
        "logentry-delete-revision": "$1 がページ「$3」の{{PLURAL:$5|版|$5件の版}}の閲覧レベルを{{GENDER:$2|変更しました}}: $4",
        "logentry-delete-event-legacy": "$1 が $3 の記録項目の閲覧レベルを{{GENDER:$2|変更しました}}",
        "logentry-tag-update-revision": "$1 がページ「$3」の版 $4 のタグを{{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": "編集内容の要約",
+       "rightslogentry-temporary-group": "$1 ($2までの臨時)",
        "feedback-adding": "ページへのフィードバックの追加...",
        "feedback-back": "戻る",
        "feedback-bugcheck": "Great! [$1 既出のバグ]に既に含まれていないかご確認ください。",
        "pagelang-language": "言語",
        "pagelang-use-default": "既定の言語を使用",
        "pagelang-select-lang": "言語を選択",
+       "pagelang-reason": "理由",
        "pagelang-submit": "変更",
+       "pagelang-nonexistent-page": "ページ $1 は存在しません。",
+       "pagelang-unchanged-language": "ページ「$1」の言語は既に$2に設定されています。",
        "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",
+       "undelete-cantcreate": "同名のページが存在せず、また作成する許可があなたに無いため、このページを復元できません。"
 }
index 2b14bfc..61ca0b2 100644 (file)
        "externaldberror": "Aida aatentikieshan dietabies era okor ar yu no lou fi opdiet yu extoernal akount.",
        "login": "Lag iin",
        "nav-login-createaccount": "Lag iin / kriet akount",
-       "userlogin": "Lag iin / kriet akount",
-       "userloginnocreate": "Lag iin",
        "logout": "Lag out",
        "userlogout": "Lag out",
        "notloggedin": "No lag iin",
        "userlogin-noaccount": "No gat no akount?‎",
        "userlogin-joinproject": "Jain {{SITENAME}}‎",
-       "nologin": "Naa no akount? $1.",
-       "nologinlink": "Kriet a akount",
        "createaccount": "Kriet akount",
-       "gotaccount": "Aredi gat akount? $1.",
-       "gotaccountlink": "Lag iin",
-       "userlogin-resetlink": "Figet yu lagin detail dem?",
        "userlogin-resetpassword-link": "Figat yu paaswod?‎",
        "userlogin-helplink2": "Elp wid lagiin‎",
        "createacct-emailoptional": "Iimiel ajres (apshanal)",
        "createacct-email-ph": "Enta yu iimiel ajres",
        "createaccountmail": "Bai e-miel",
-       "createaccountreason": "Riizn:",
        "createacct-submit": "Kriet yu akount",
        "createacct-benefit-heading": "{{SITENAME}} mek bai smadi laka yu.",
        "createacct-benefit-body1": "{{PLURAL:$1|edit|edits}}",
        "showdiff": "Shuo chienjdem",
        "anoneditwarning": "<strong>Waanin:</strong> Yu no lagiin. Yu IP ajres wi vizibl tu poblik ef yu mek eni edit. Ef yu <strong>[$1 lagiin]</strong> ar <strong>[$2 kriet akount]</strong>, yu editdem wi get achribiut tu yu yuuzaniem, wid adaels benifit.‎",
        "anonpreviewwarning": "''Yu no lag iin. Sievin wi rikaad yu IP ajres ina dis piej edit ischri.''",
-       "missingsummary": "'''Rimainda:''' Yu no provaid no edit somari.\nEf yu klik \"{{int:savearticle}}\" agen, yu edit wi siev widoutn wan.",
+       "missingsummary": "'''Rimainda:''' Yu no provaid no edit somari.\nEf yu klik \"$1\" agen, yu edit wi siev widoutn wan.",
        "missingcommenttext": "Begyu enta a kament biluo.",
-       "missingcommentheader": "'''Rimainda:''' Yu no provaid no sobjek/edlain fi dis kament.\nEf yu klik \"{{int:savearticle}}\" agen, yu edit wi siev widoutn wan.",
+       "missingcommentheader": "'''Rimainda:''' Yu no provaid no sobjek/edlain fi dis kament.\nEf yu klik \"$1\" agen, yu edit wi siev widoutn wan.",
        "summary-preview": "Somari priivyuu",
        "subject-preview": "Sobjek/edlain priivyuu:",
        "blockedtitle": "Yuuza blak",
        "editingsection": "Editin $1 (sekshan)",
        "editingcomment": "Editin $1 (nyuu sekshan)",
        "editconflict": "Edit kanflik: $1",
-       "explainconflict": "Smadi els chienj dis poej sens yu taat editi.\nDi opa tex ieria kantien di piej tex az ikorantli egzis.\nYu chienjdem shuo ina di lowa tex ieria.\nYu wi afi moerj yu chienjdem ina di egzisin tex.\n'''Onggl''' di tex ina di opa tes ieria wi sieb wen yu pres \"{{int:savearticle}}\".",
+       "explainconflict": "Smadi els chienj dis poej sens yu taat editi.\nDi opa tex ieria kantien di piej tex az ikorantli egzis.\nYu chienjdem shuo ina di lowa tex ieria.\nYu wi afi moerj yu chienjdem ina di egzisin tex.\n'''Onggl''' di tex ina di opa tes ieria wi sieb wen yu pres \"$1\".",
        "yourtext": "Yu tex",
        "storedversion": "Stuor rivijan",
        "yourdiff": "Difrans",
        "rcshowhidemine": "$1 mi editdem",
        "rcshowhidemine-show": "Shuo",
        "rcshowhidemine-hide": "Aid",
-       "rclinks": "Shuo laas $1 chienj ina laas $2 die<br />$3",
+       "rclinks": "Shuo laas $1 chienj ina laas $2 die",
        "diff": "dif",
        "hist": "isch",
        "hide": "Aid",
index c57d440..fa6dc1c 100644 (file)
        "recentchanges-summary": "liste loi nu puzi stika le uitki",
        "rcshowhidebots": "$1 lo zmiku",
        "rcshowhideliu": "$1 lo se jaspu pilno",
-       "rclinks": "zgana $1 lo romoi nu stika ca $2 lo romoi djedi<br />$3",
+       "rclinks": "zgana $1 lo romoi nu stika ca $2 lo romoi djedi",
        "diff": "te frica",
        "hist": "galfi plivei",
        "hide": "cancygau",
index 48cf4aa..0b6225e 100644 (file)
        "externaldberror": "Där ä opstotj en fejl i i ekstern adgångsdatabase, elle du hår ett rettihede te å opdatiir denn.",
        "login": "Logg på",
        "nav-login-createaccount": "Oprett e konto ellerlogg på",
-       "userlogin": "Oprett e konto elle logg på",
-       "userloginnocreate": "Logg på",
        "logout": "Logg å",
        "userlogout": "Logg å",
        "notloggedin": "Ikke loggen på",
        "userlogin-noaccount": "Hår du ett e konto?",
        "userlogin-joinproject": "Slut dej te {{SITENAME}}",
-       "nologin": "Du hår iet kronto? $1.",
-       "nologinlink": "Oprett e ny brugekonto",
        "createaccount": "Oprett e ny brugekonto",
-       "gotaccount": "Hår du ållried e konto? '''$1'''.",
-       "gotaccountlink": "Logg på",
-       "userlogin-resetlink": "Hår du glommen din login-oplysnenge?",
        "userlogin-resetpassword-link": "Glommen din adgångskode?",
        "userlogin-helplink2": "Hjälp mä å logg på",
        "userlogin-loggedin": "Du ä ållried loggen på som {{GENDER:$1|$1}}. Brug formulari nierfor te å logg på som i ånj bruge.",
        "createacct-emailoptional": "E-mailadress (walgfri)",
        "createacct-email-ph": "Intast dej e-mailadress",
        "createacct-another-email-ph": "Intast e-mailadress",
-       "createaccountreason": "Begrunjels:",
        "createacct-submit": "Oprett det konto",
        "createacct-another-submit": "Oprett konto",
        "createacct-benefit-heading": "{{SITENAME}} laws å menske som du.",
        "saveprefs": "Djiem instellenge",
        "restoreprefs": "Djensätt åll standardinstellenge (i åll seksjone)",
        "prefs-editing": "Redigiireng",
-       "rows": "Räkke:",
-       "columns": "Kolonne:",
        "searchresultshead": "Syegresultate",
        "stub-threshold": "Græns for stumplinkformatiireng ($1):",
        "stub-threshold-sample-link": "eksempel",
        "rcshowhidemine-hide": "Sjul",
        "rcshowhidecategorization-show": "Wis",
        "rcshowhidecategorization-hide": "Sjul",
-       "rclinks": "Wis siensti $1 øndrenge i di sisti $2 daw<br />$3",
+       "rclinks": "Wis siensti $1 øndrenge i di sisti $2 daw",
        "diff": "forskell",
        "hist": "historik",
        "hide": "Sjul",
index 89c777e..404af3b 100644 (file)
        "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 panjenengan sing ana:",
-       "tog-fancysig": "Anggep tandha tangan minangka tulisan wiki (tanpa pranala otomatis)",
+       "tog-oldsig": "Tapak asmané panjenengan sing ana:",
+       "tog-fancysig": "Cakaké tapak asma minangka tèks wiki (tanpa pranala otomatis)",
        "tog-uselivepreview": "Nganggo pratuduh langsung",
-       "tog-forceeditsummary": "Élingna aku menawa kothak ringkesan suntingan isih kosong",
+       "tog-forceeditsummary": "Kandhani aku manawa kothak ringkesané besutan isih kosong",
        "tog-watchlisthideown": "Dhelikaké besutanku saka pawawangan",
        "tog-watchlisthidebots": "Dhelikaké besutan bot saka pangawasan",
        "tog-watchlisthideminor": "Dhelikaké besutan cilik saka pawawangan",
        "tog-prefershttps": "Tansah anggoa sambungan sing aman nalika mlebu log",
        "underline-always": "Tansah",
        "underline-never": "Ora tau",
-       "underline-default": "Baku kulit utawa pangluron",
+       "underline-default": "Ules utawa pangluru gawan",
        "editfont-style": "Gagrag fon ing pambesutan:",
        "editfont-default": "Baku pangluron",
        "editfont-monospace": "Fon monospasi",
        "editfont-sansserif": "Fon tansèrif",
        "editfont-serif": "Fon sèrif",
-       "sunday": "Minggu",
+       "sunday": "Ngahad",
        "monday": "Senèn",
        "tuesday": "Selasa",
        "wednesday": "Rebo",
        "december-date": "$1 Dhésèmber",
        "period-am": "Isuk-Awan",
        "period-pm": "Soré-Wengi",
-       "pagecategories": "{{PLURAL:$1|Kategori|Kategori}}",
+       "pagecategories": "{{PLURAL:$1|Kategori}}",
        "category_header": "Kaca sajeroning kategori \"$1\"",
        "subcategories": "Anak kategori",
        "category-media-header": "Médhia sajeroning kategori \"$1\"",
        "faq": "Pitakon Kerep",
        "faqpage": "Project:Pitakon Kerep",
        "actions": "Lelabuhan",
-       "namespaces": "Jagat aran",
+       "namespaces": "Mandala aran",
        "variants": "Varian",
        "navigation-heading": "Menu navigasi",
        "errorpagetitle": "Cacad",
        "searcharticle": "Menyang",
        "history": "Sujarah kaca",
        "history_short": "Sujarah",
+       "history_small": "sujarah",
        "updatedmarker": "wis dianyari kawit tekaku mréné pungkasan",
        "printableversion": "Vèrsi cithak",
        "permalink": "Pranala permanèn",
        "viewhelppage": "Deleng kaca pitulung",
        "categorypage": "Deleng kaca kategori",
        "viewtalkpage": "Deleng parembugan",
-       "otherlanguages": "Ing basa liya",
+       "otherlanguages": "Ing basa liya",
        "redirectedfrom": "(Dilih saka $1)",
        "redirectpagesub": "Alih kaca",
        "redirectto": "Ngalih menyang:",
-       "lastmodifiedat": "Kaca iki pungkasan diowah kala $1, tabuh $2.",
+       "lastmodifiedat": "Kaca iki dibesut pungkasan nalika $1, pukul $2.",
        "viewcount": "Kaca iki wis diaksès ping {{PLURAL:$1|siji|$1}}.",
        "protectedpage": "Kaca kareksa",
        "jumpto": "Jujug:",
        "jumptonavigation": "navigasi",
        "jumptosearch": "golèk",
        "view-pool-error": "Nyuwun ngapuro, peladèn lagi sibuk wektu iki.\nKakèhan panganggo sing nyoba mbukak kaca iki.\nEntèni sedhéla sadurungé nyoba ngaksès kaca iki manèh .\n\n$1",
-       "generic-pool-error": "Nyuwun pangapura, paladèn saiki nembé arungan.\nKakèhan panganggo sing péngin ndeleng sumber iki.\nEntèna sadhéla sadurungé sampéyan nekani sumber iki manèh.",
+       "generic-pool-error": "Ngapunten, paladèné lagi kabotan momotan.\nPanganggo akèh sing péngin ndeleng sumber iki.\nEntènana sadhéla sadurungé panjenengan marani sumber iki manèh.",
        "pool-timeout": "Kelangkung wekdal nengga kunci",
        "pool-queuefull": "Kempalan antrian kebak",
        "pool-errorunknown": "Kalepata ingkang mboten dipun mangertosi",
        "poolcounter-usage-error": "Cacad panganggo: $1",
        "aboutsite": "Ngenani {{SITENAME}}",
        "aboutpage": "Project:Ngenani",
-       "copyright": "Kabèh isi kasedyakaké miturut $1.",
+       "copyright": "Isi cumepak kanthi pangayoman $1 kajaba disebutaké yèn ana liyané.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
-       "currentevents": "Kadadian saiki",
-       "currentevents-url": "Project:Kadadian saiki",
+       "currentevents": "Kadadéan saiki",
+       "currentevents-url": "Project:Kadadéan saiki",
        "disclaimers": "Sélakan",
        "disclaimerpage": "Project:Sélakan umum",
        "edithelp": "Pitulung besut",
        "policy-url": "Project:Kabijakan",
        "portal": "Gapura paguyuban",
        "portal-url": "Project:Garupa paguyuban",
-       "privacy": "Niti priangga",
-       "privacypage": "Project:Niti priangga",
+       "privacy": "Paugeran privasi",
+       "privacypage": "Project:Paugeran privasi",
        "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.",
        "versionrequired": "Dibutuhaké MediaWiki vèrsi $1",
        "versionrequiredtext": "MediaWiki vèrsi $1 dibutuhaké kanggo nggunakaké kaca iki. Mangga mirsani [[Special:Version|kaca iki]]",
        "ok": "Oké",
-       "retrievedfrom": "Dijupuk saka: \"$1\"",
+       "retrievedfrom": "Dijupuk saka \"$1\"",
        "youhavenewmessages": "Panjenengan kagungan $1 ($2).",
-       "youhavenewmessagesfromusers": "Sampéyan nduwé $1 saka  {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).",
-       "youhavenewmessagesmanyusers": "Sampéyang nduwé $1 saka akèh panganggo ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Panjenengan duwé}} $1 saka {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).",
+       "youhavenewmessagesmanyusers": "Panjenengan duwé $1 saka manéka panganggo ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|layang anyar|999=layang anyar}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|owahan|999=owahan}} pungkasan",
-       "youhavenewmessagesmulti": "Sampéyan éntuk nawala anyar ing $1",
+       "youhavenewmessagesmulti": "Panjenengan éntuk layang anyar ing $1",
        "editsection": "besut",
        "editold": "besut",
        "viewsourceold": "deleng sumber",
        "hidetoc": "dhelikaké",
        "collapsible-collapse": "tutup",
        "collapsible-expand": "bukak",
-       "confirmable-confirm": "{{GENDER:$1|Sampéyan}} yakin?",
+       "confirmable-confirm": "{{GENDER:$1|Panjenengan}} yakin?",
        "confirmable-yes": "Iya",
        "confirmable-no": "Ora",
        "thisisdeleted": "Ndeleng utawa mbalèkaké $1?",
        "feed-invalid": "Tipe permintaan asupan ora bener.",
        "feed-unavailable": "Umpan sindikasi (''syndication feeds'') ora kasedyakaké",
        "site-rss-feed": "$1 ''RSS Feed''",
-       "site-atom-feed": "Umpan atom $1",
+       "site-atom-feed": "Lebon atom $1",
        "page-rss-feed": "\"$1\" ''RSS Feed''",
        "page-atom-feed": "\"$1\" ''Atom Feed''",
        "red-link-title": "$1 (kaca durung ana)",
        "filerenameerror": "Ora bisa ngowahi saka \"$1\" dadi \"$2\".",
        "filedeleteerror": "Ora bisa mbusak berkas \"$1\".",
        "directorycreateerror": "Ora bisa nggawé dirèktori \"$1\".",
+       "directoryreadonlyerror": "Pérangan \"$1\" mung kena diwaca.",
+       "directorynotreadableerror": "Pérangan \"$1\" ora kena diwaca.",
        "filenotfound": "Ora bisa nemokaké berkas \"$1\".",
        "unexpected": "Biji (''nilai'') ing njabaning jangkauan: \"$1\"=\"$2\".",
        "formerror": "Kasalahan: Ora bisa ngirimaké formulir",
        "no-null-revision": "Ora isa nggawe revisi 'null' anyar kanggo kaca \"$1\"",
        "badtitle": "Sesirah ala",
        "badtitletext": "Sesirahing kaca sing dikarepaké ora sah, suwung, utawa salah nggayut nyang sesirah antarabasa utawa antarawiki.\nIku mungkin ngandhut pralambang siji utawa luwih sing ora kena dianggo tumrap sesirah iki.",
+       "title-invalid-empty": "Sesirah kaca sing dikarepaké kosong utawa mung ngemu jenengé mandala-aran.",
+       "title-invalid-utf8": "Sesirah kaca sing dikarepaké ngemu reroncèn UTF-8 sing ora sah.",
+       "title-invalid-interwiki": "Sesirah kaca sing dikarepaké ngemu pranala interwiki sing ora bisa dicakaké dadi sesirah",
+       "title-invalid-talk-namespace": "Sesirah kaca sing dikarepaké nggayut kaca parembugan sing ora ana.",
+       "title-invalid-characters": "Sesirah kaca sing dikarepaké ngemu karakter sing ora sah: \"$1\".",
+       "title-invalid-relative": "Sesirah ngemu alamat rélatif. Sesirah kaca relatif (./, ../) iku ora sah amarga ora bisa ditekani lumantar pangluru.",
+       "title-invalid-magic-tilde": "Sesirah kaca sing dikarepaké ngemu reroncèn tilda (<nowiki>~~~</nowiki>) sing ora sah.",
+       "title-invalid-too-long": "Sesirah kaca sing dikarepaké kedawan. Kuduné ora munjuli $1 bèt sarana kodhé UTF-8.",
+       "title-invalid-leading-colon": "Sesirah kaca sing dikarepaké ngemu titik loro sing ora sah ing ngarepé.",
        "perfcached": "Data ing ngisor iki kasimpen ing telih lan mungkin durung dianyari. Paling akèh ana {{PLURAL:$1|sakasil|$1 kasil}} sumadhiya ing telih iku.",
        "perfcachedts": "Data ing ngisor iki kasimpen ing telih, lan pungkasan dianyari $1. Paling akèh ana {{PLURAL:$4|sakasil|$4 kasil}} sumadhiya ing telih iku.",
        "querypage-no-updates": "Update saka kaca iki lagi dipatèni. Data sing ana ing kéné saiki ora bisa bakal dibalèni unggah manèh.",
        "viewsource": "Deleng sumber",
-       "viewsource-title": "Delok sumberé $1",
+       "viewsource-title": "Deleng sumberé $1",
        "actionthrottled": "Tindakan diwatesi",
-       "actionthrottledtext": "Minangka sawijining pepesthèn anti-spam, panjenengan diwatesi nglakoni tindhakan iki sing cacahé kakèhan ing wektu cendhak.\nMangga dicoba manèh ing sawetara menit.",
+       "actionthrottledtext": "Minangka upaya lumawan tumindak salah-guna, panjenengan diwatesi nalika ngayahi iki ping bola-bali tur rikat, lan panjenengan wis munjuli watesané.\nMangga jajalen manèh mengko.",
        "protectedpagetext": "Kaca iki wis digembok supaya ora bisa disunting lan diapa-apakaké.",
-       "viewsourcetext": "Sampéyan bisa ndeleng lan nyalin sumbering kaca iki.",
-       "viewyourtext": "Sampéyan bisa ndeleng lan nyalin sumbering <strong>besutaning sampéyan</strong> ing kaca iki.",
+       "viewsourcetext": "Panjenengan bisa ndeleng lan nurun sumberé kaca iki.",
+       "viewyourtext": "Panjenengan bisa ndeleng lan nurun sumberé <strong>besutané panjenengan</strong> nyang kaca iki.",
        "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 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.",
+       "namespaceprotected": "Panjenengan ora duwé idin kanggo mbesut kaca ing mandala aran <strong>$1</strong>.",
+       "customcssprotected": "Panjenengan ora diidinaké mbesut kaca CSS iki amarga isiné setèlan pribadhi panganggo liyané.",
+       "customjsprotected": "Panjenengan ora diidinaké mbesut kaca JavaScript iki amarga isiné setèlan pribadhi panganggo liyané.",
        "mycustomcssprotected": "Sampèyan ora duwé idin kanggo ngowah kaca CSS iki.",
        "mycustomjsprotected": "Sampèyan ora duwé idin kanggo ngowah kaca JavaScript iki.",
        "myprivateinfoprotected": "Sampèyan ora duwé idin kanggo ngowah informasi privat sampèyan.",
        "mypreferencesprotected": "Sampèyan ora duwé idin kanggo ngowah preferensi sampèyan.",
        "ns-specialprotected": "Kaca ing bilik nama astaméwa utawa kusus, ora bisa disunting.",
        "titleprotected": "Irah-irahan iki direksa ora olèh digawé déning [[User:$1|$1]].\nAlesané yaiku <em>$2</em>.",
-       "filereadonlyerror": "Ora bisa ngowah berkas \"$1\" amarga panyimpenan berkas \"$2\" ana ing mode mung-bisa-diwaca.\n\nPangurus sing ngopèni kuwi ngawedharaké: \"$3\".",
+       "filereadonlyerror": "Ora bisa ndandani barkas \"$1\" amarga panyimpenan barkas \"$2\" mung bisa diwaca.\n\nPangurus sistem sing ngunci iku njlèntrèhaké: \"$3\".",
        "invalidtitle-knownnamespace": "Irah-irahan ora sah mawa bilik jeneng \"$2\" lan tèks \"$3\"",
        "invalidtitle-unknownnamespace": "Judhul ora sah mawa angka $1 lan tèks \"$2\" bilik jeneng sing ora dingertèni",
        "exception-nologin": "Durung mlebu log",
-       "exception-nologin-text": "Tulung [[Special:Userlogin|mlebu log]] dhisik kanggo ngakses kaca utawa kelakon iki.",
+       "exception-nologin-text": "Mangga mlebua log supaya bisa ngaksès kaca utawa tumindak iki.",
        "exception-nologin-text-manual": "Tulung $1 kanggo ngakses kaca utawa kelakon iki.",
        "virus-badscanner": "Kasalahan konfigurasi: pamindai virus ora dikenal: ''$1''",
        "virus-scanfailed": "''Pemindaian'' utawa ''scan'' gagal (kode $1)",
        "virus-unknownscanner": "antivirus buhbuhan:",
-       "logouttext": "'''Sampéyan wis metu log'''\n\nCathet yèn sapérangan kaca mungkin isih nampilaké kayata sampéyan isih mlebu log, kuwi bisa ilang yèn sampéyan ngresiki ''cache'' pramban sampéyan.",
+       "logouttext": "<strong>Panjenengan saiki wis metu.</strong>\n\nTulung gatèkaké yèn sawenèh kaca bokmanawa bakal isih katon kaya déné yèn panjenengan isih mlebu log, mula busakana cache pangluruné panjenengan.",
        "cannotlogoutnow-title": "Ora bisa metu saiki",
        "cannotlogoutnow-text": "Metu ora mungkin menawa nganggo $1.",
        "welcomeuser": "Sugeng Rawuh, $1!",
        "welcomecreation-msg": "Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.",
        "yourname": "Jeneng panganggo:",
        "userlogin-yourname": "Jeneng panganggo",
-       "userlogin-yourname-ph": "Isi jeneng panganggoning sampéyan",
+       "userlogin-yourname-ph": "Isènana jeneng panganggoné panjenengan",
        "createacct-another-username-ph": "Isi jeneng panganggo",
        "yourpassword": "Tembung wadi:",
        "userlogin-yourpassword": "Tembung wadi",
-       "userlogin-yourpassword-ph": "Lebokaké tembung wadining sampéyan",
-       "createacct-yourpassword-ph": "Lebokaké tembung wadi",
+       "userlogin-yourpassword-ph": "Isènana tembung wadiné panjenengan",
+       "createacct-yourpassword-ph": "Isi tembung wadi",
        "yourpasswordagain": "Tik manèh tembung wadiné:",
-       "createacct-yourpasswordagain": "Netepaké tembung wadi",
+       "createacct-yourpasswordagain": "Konfirmasi tembung wadi",
        "createacct-yourpasswordagain-ph": "Lebokaké manèh tembung wadiné",
        "userlogin-remembermypassword": "Gawé amrih aku panggah kalebu",
        "userlogin-signwithsecure": "Nganggo koneksi aman",
        "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.",
+       "password-change-forbidden": "Panjenengan ora bisa ngowahi tembung wadi ing 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",
-       "logout": "Metu",
-       "userlogout": "Metu",
+       "nav-login-createaccount": "Mlebu log / gawé akun",
+       "logout": "Metu log",
+       "userlogout": "Metu log",
        "notloggedin": "Durung kalebu",
        "userlogin-noaccount": "Durung duwé akun?",
        "userlogin-joinproject": "Mèlua {{SITENAME}}",
-       "nologin": "Durung kagungan asma panganggo? '''$1'''.",
-       "nologinlink": "Gawé akun",
        "createaccount": "Gawé akun",
-       "gotaccount": "Wis duwé akun? $1.",
-       "gotaccountlink": "Mlebu",
-       "userlogin-resetlink": "Lali rincian mlebu log Sampéyan?",
-       "userlogin-resetpassword-link": "Lali tembung wadining sampéyan?",
+       "userlogin-resetpassword-link": "Lali tembung wadiné panjenengan?",
        "userlogin-helplink2": "Tulungi mlebu",
-       "userlogin-loggedin": "Sampeyan sampun mlebet log dadi {{GENDER:$1|$1}}.\nGunakna formulir ing ngisor iki kanggo mlebet log dadi panganggo liyane.",
+       "userlogin-loggedin": "Panjenengan wis mlebu log minangka {{GENDER:$1|$1}}.\nAnggonen formulir ngisor iki saperlu mlebu log minangka panganggo liya.",
        "userlogin-createanother": "Gawé akun liya",
        "createacct-emailrequired": "Alamat layang èlèktronik",
        "createacct-emailoptional": "Alamat layang èlèktronik (manasuka)",
-       "createacct-email-ph": "Lebokaké layang èlèktronik sampéyan",
+       "createacct-email-ph": "Isènana layang-èlé panjenengan",
        "createacct-another-email-ph": "Isi alamat layang èlèktronik",
-       "createaccountmail": "Nganggoa sandi sauntara sembarang lan kirimna liwat layang e-mail ing ngisor iki",
+       "createaccountmail": "Anggonen tembung wadi sembarang sauntara lan kirimen nyang alamat layang-èl sing dikarepaké",
        "createacct-realname": "Jeneng asli (manasuka)",
-       "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
-       "createacct-reason-ph": "Kenapa sampeyan nggawe akun liyane",
-       "createacct-submit": "Gawé akun sampéyan",
+       "createacct-reason-ph": "Alesané panjenengan nggawé akun liya",
+       "createacct-submit": "Gawé akuné panjenengan",
        "createacct-another-submit": "Gawé akun",
        "createacct-continue-submit": "Banjuraké gawé akun",
        "createacct-another-continue-submit": "Banjuraké gawé akun",
-       "createacct-benefit-heading": "{{SITENAME}} digawé déning wong-wong kaya déné sampéyan.",
+       "createacct-benefit-heading": "{{SITENAME}} digawé déning wong-wong kaya panjenengan.",
        "createacct-benefit-body1": "{{PLURAL:$1|besutan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|sing nyumbang}} pungkasan",
+       "createacct-benefit-body3": "{{PLURAL:$1|sing nyumbang}} mentas waé",
        "badretype": "Sandhi panjenengan ora gathuk",
        "usernameinprogress": "Panggawéning akun tumrap jeneng panganggo iki tembé lumaku.\nEntèni sadhéla.",
        "userexists": "Jeneng panganggo sing dilebokaké lagi dianggo.\nMangga pilih jeneng liya.",
        "loginerror": "Cacad nalika mlebu",
        "createacct-error": "Cacad nalika nggawé akun",
        "createaccounterror": "Ora bisa gawé akun: $1",
-       "nocookiesnew": "Rékening utawa akun panganggo panjenengan wis digawé, nanging panjenengan durung mlebu log. {{SITENAME}} nggunakaké ''cookies'' kanggo  log panganggo. ''Cookies'' ing panjlajah wèb panjengengan dipatèni. Mangga diaktifaké lan mlebu log manèh mawa jeneng panganggo lan tembung sandhi panjenengan.",
+       "nocookiesnew": "Akun panganggoné wis digawé, nanging panjenengan durung mlebu log.\n{{SITENAME}} nganggo kuki kanggo nglebokaké panganggo ing log.\nÉwadéné, kukiné panjenengan dipatèni.\nMangga urubaké iku, banjur mlebua log kanthi nganggo jeneng panganggo lan tembung wadiné panjenengan sing anyar.",
        "nocookieslogin": "{{SITENAME}} nggunakaké ''cookies'' kanggo log panganggoné. ''Cookies'' ing panjlajah wèb panjenengan dipatèni. Mangga ngaktifaké manèh lan coba manèh.",
-       "nocookiesfornew": "Akun panganggo ora digawé amarga sumberé ora bisa dipesthèkaké.\nPesthèkaké sampéyan wis ngurubaké kuki, banjur balèni ngamot kaca iki lan njajal manèh.",
-       "createacct-loginerror": "Akuné wis kasil digawe nanging sampéyan ora bisa mlebu otomatis. Mangga [[Special:UserLogin|mlebua manual]].",
-       "noname": "Asma panganggo sing panjenengan pilih ora sah.",
+       "nocookiesfornew": "Akun panganggoné wurung digawé amarga awak dhéwé ora bisa mesthèkaké sumberé.\nPesthèkaké panjenengan wis ngurubaké kuki, banjur ambalana ngamot kaca iki lan njajalana manèh.",
+       "createacct-loginerror": "Akuné wis kasil digawe nanging panjenengan ora bisa otomatis mlebu. Mangga [[Special:UserLogin|mlebua kanthi manual]].",
+       "noname": "Panjenengan durung awèh jeneng panganggo sing trep.",
        "loginsuccesstitle": "Kasil mlebu",
-       "loginsuccess": "'''Panjenengan saiki mlebu ing {{SITENAME}} kanthi asma \"$1\".'''",
-       "nosuchuser": "Ora ana panganggo mawa asma \"$1\".\nJeneng panganggo iku mbédakaké kapitalisasi.\nCoba dipriksa manèh pasang aksarané, utawa [[Special:CreateAccount|gawé akun anyar]].",
+       "loginsuccess": "<strong>Panjenengan saiki wis mlebu log ing {{SITENAME}} minangka \"$1\".</strong>",
+       "nosuchuser": "Ora ana panganggo kanthi jeneng \"$1\".\nJeneng panganggo iku sènsitif tumrap gedhé-ciliké huruf.\nJajan priksanen éjaané panjenengan, utawa [[Special:CreateAccount|gawénen akun anyar]].",
        "nosuchusershort": "Ora ana panganggo mawa asma \"$1\". Coba dipriksa manèh pasang aksarané (éjaané).",
-       "nouserspecified": "Panjenengan kudu milih asma panganggo.",
+       "nouserspecified": "Panjenengan kudu milih jeneng panganggo.",
        "login-userblocked": "Panganggo iki pinalangan. Ora kena mbelu.",
        "wrongpassword": "Tembung sandhi sing dipilih salah. Mangga coba manèh.",
        "wrongpasswordempty": "Panjenengan ora milih tembung sandhi. Mangga dicoba manèh.",
        "passwordtooshort": "Tembung sesinglon paling sethithik cacahé {{PLURAL:$1|1 aksara|$1 aksara}}.",
        "passwordtoolong": "Tembung wadi ora kena munjuli {{PLURAL:$1|1 pralambang|$1 pralambang}}.",
        "passwordtoopopular": "Tembung wadi sing wis kaprah ora kena dianggo. Mangga pilih tembung wadi liya sing mbédani.",
-       "password-name-match": "Tembung sandi panjenengan kudu béda karo jeneng panganggo panjenengan.",
+       "password-name-match": "Tembung wadiné panjenengan kudu béda saka jeneng panganggoné panjenengan.",
        "password-login-forbidden": "Panganggoning jeneng panganggo lan tembung wadi iki dilarang.",
        "mailmypassword": "Balèni gawé tembung wadi",
        "passwordremindertitle": "Pèngetan tembung sandhi saka {{SITENAME}}",
        "noemailcreate": "Panjenengan kudu maringi alamat e-mail sing absah",
        "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.",
+       "eauthentsent": "Layang-èl konfirmasi wis dikirim nyang alamat layang-èl sing diisèkaké. Sadurungé ana layang-èl liyané sing dikirim nyang akun iku, panjenengan kudu nuruti arahan ana ing layang-èl iku saperlu ngonfirmasi yèn akun iku pancèn duwèké panjenengan.",
        "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}}.",
        "mailerror": "Cacad nalika ngirim layang: $1",
        "acct_creation_throttle_hit": "Tamu ing wiki iki kanthi alamat IP sing padha karo panjenengan wis gawé {{PLURAL:$1|1 akun|$1 akun}} ing sadina pungkasan, nganti cacah maksimum sing diidinaké.\nAmarga saka kuwi., tamu kanthi alamat IP iki ora bisa gawé akun manèh kanggo sauntara iki.",
-       "emailauthenticated": "Alamat layang élèktronik (e-mail) panjenengan wis didhedhes (dikonfirmasi) ing tanggal $2, jam $3.",
-       "emailnotauthenticated": "Alamat layang élèktronik panjenengan durung didhedhes (dikonfirmasi). \n\nSadurungé didhedhes, panjenengan ora bisa nganggo fitur layang élèktronik (e-mail) ing ngisor iki.",
+       "emailauthenticated": "Alamat layang-èlé panjenengan wis dikonfirmasi ing tanggal $2 pukul $3.",
+       "emailnotauthenticated": "Alamat layang-èlé panjenengan durung dikonfirmasi.\nLayang-èl ora bakal dikirim yèn gegayutan karo fitur-fitur iki.",
        "noemailprefs": "Panjenengan kudu milih alamat e-mail supaya bisa nganggo fitur iki.",
        "emailconfirmlink": "Ndhedhes (konfirmasi) alamat e-mail panjenengan",
        "invalidemailaddress": "Alamat e-mail iki ora bisa ditampa amarga formaté ora bener. Tulung lebokna alamat mawa format sing bener utawa kosongaké waé isèn kasebut.",
        "emaildisabled": "Situs iki ora bisa ngirim layang èlèktronik.",
        "accountcreated": "Akun wis kagawé",
        "accountcreatedtext": "Akun panganggo [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|rembug]]) wis digawé.",
-       "createaccount-title": "Gawé rékening kanggo {{SITENAME}}",
-       "createaccount-text": "Ana wong sing nggawé sawijining akun utawa rékening kanggo alamat e-mail panjenengan ing {{SITENAME}} ($4) mawa jeneng \"$2\" lan tembung sandi \"$3\". Panjenengan disaranaké kanggo mlebu log lan ngganti tembung sandi panjenengan saiki.\n\nPanjenengan bisa nglirwakaké pesen iki yèn akun utawa rékening iki digawé déné sawijining kaluputan.",
+       "createaccount-title": "Gawé akun kanggo {{SITENAME}}",
+       "createaccount-text": "Ana sing nggawé akun nganggo alamat layang-èlé panjenengan ing {{SITENAME}} ($4) kanthi aran \"$2\", mawa tembung wadi \"$3\".\nPanjenengan kudu mlebu log lan ngowahi tembung wadiné panjenengan saiki.\n\nPanjenengan kena nglirwakaké layang iki, manawa akun iki digawé awit kaluputan.",
        "login-throttled": "Panjenengan wis kakèhan njajal mlebu log.\nTulung nunggu dhisik $1 sadurungé njajal manèh.",
-       "login-abort-generic": "Sampéyan ora bisa mlebu - Kawurungan",
+       "login-abort-generic": "Panjenengan ora bisa mlebu log - Kawurungan",
+       "login-migrated-generic": "Akuné panjenengan wis dimigrasi, lan jeneng panganggoné wis ora ana manèh ing wiki iki.",
        "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.",
+       "createacct-another-realname-tip": "Jeneng asli ora kudu diisi.\nYèn diisi, jeneng asliné panjenengan bakal kanggo atribusi awit karyané panjenengan.",
        "pt-login": "Mlebu log",
        "pt-login-button": "Mlebu",
        "pt-login-continue-button": "Banjuraké mlebu",
        "pt-createaccount": "Gawé akun",
-       "pt-userlogout": "Metu",
+       "pt-userlogout": "Metu log",
        "php-mail-error-unknown": "Kasalahan ora dingertèni nèng piguna mail() PHP.",
        "user-mail-no-addy": "Njajal ngirim layang èlèktronik tanpa alamat layang èlèktronik.",
        "user-mail-no-body": "Nyoba ngirim layang e-mail, tapi isine kosong.",
        "changepassword": "Ganti tembung wadi",
-       "resetpass_announce": "Kanggo ngrampungaké lelakoning lumebu, sampéyan kudu masang tembung wadi anyar.",
+       "resetpass_announce": "Saperlu ngrampungaké olèhé mlebu log, panjenengan kudu nggawé tembung wadi anyar.",
        "resetpass_text": "<!-- Tambahaké teks ing kéné -->",
        "resetpass_header": "Ganti tembung wadining akun",
        "oldpassword": "Tembung wadi lawas:",
        "newpassword": "Tembung wadi anyar:",
        "retypenew": "Tik manèh tembung wadi anyaré:",
        "resetpass_submit": "Nata tembung sandhi lan mlebu log",
-       "changepassword-success": "Tembung wadining sampéyan kasil diowah!",
+       "changepassword-success": "Tembung wadiné panjenengan kasil diowah!",
+       "changepassword-throttled": "Panjenengan wis kakèhan njajal mlebu log.\nTulung nunggu dhisik $1 sadurungé njajal manèh.",
        "botpasswords": "Tembung wadi bot",
+       "botpasswords-disabled": "Tembung wadiné bot dipatèni.",
+       "botpasswords-no-central-id": "Saperlu nganggo tembung wadiné bot, panjenengan kudu mlebu nyang akun séntral.",
+       "botpasswords-existing": "Tembung wadiné bot sing cumepak",
+       "botpasswords-createnew": "Gawé anyar tembung wadiné bot",
+       "botpasswords-editexisting": "Besut tembung wadiné bot sing anyar",
        "botpasswords-label-appid": "Jeneng bot:",
        "botpasswords-label-create": "Gawé",
        "botpasswords-label-update": "Anyari",
        "resetpass_forbidden": "Tembung wadi ora bisa diganti",
        "resetpass-no-info": "Panjenengan kudu mlebu log kanggo ngaksès kaca iki sacara langsung.",
        "resetpass-submit-loggedin": "Ganti tembung wadi",
-       "resetpass-submit-cancel": "Batal",
-       "resetpass-wrong-oldpass": "Tembung sandi ora sah.\nPanjengen manawa wis kasil ganti tembung sandi utawa nyuwun tembung sandi sauntara sing anyar.",
+       "resetpass-submit-cancel": "Wurung",
+       "resetpass-wrong-oldpass": "Tembung wadi saiki utawa sauntara ora trep.\nPanjengen bokmanawa wis ngganti tembung wadiné panjenengan utawa nyuwun tembung wadi sauntara sing anyar.",
        "resetpass-temp-password": "Tembung wadi sauntara:",
        "resetpass-abort-generic": "Ngowah tembung sandhi diwurungaké déning èkstènsi.",
        "passwordreset": "Balèni setèl tembung sandhi",
        "image_tip": "Barkas sisipan",
        "media_sample": "Conto.ogg",
        "media_tip": "Pranala barkas",
-       "sig_tip": "Tandha tangan sampéyan mawa tandha wayah",
+       "sig_tip": "Tapak asmané panjenengan mawa tandha wektu",
        "hr_tip": "Garis horisontal",
        "summary": "Ringkesan:",
        "subject": "Jejer:",
        "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": "<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é.",
+       "missingsummary": "<strong>Pangéling-éling:</strong> Panjenengan ora ngisèni ringkesané besutan.\nManawa panjenengan mencèt \"$1\" manèh, besutané panjengan bakal kasimpen tanpa katerangan.",
+       "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 \"$1\" manèh, kaca alihan bakal digawé.",
        "missingcommenttext": "Mangga isi tanggapan ing ngisor iki.",
-       "missingcommentheader": "'''Pangéling:''' Sampéyan durung nyadhiyakaké judhul/jejer kanggo tanggepan iki.\nYèn Sampéyan klik \"{{int:savearticle}}\" manèh, suntingan Sampéyan bakal kasimpen tanpa kuwi.",
+       "missingcommentheader": "'''Pangéling:''' Sampéyan durung nyadhiyakaké judhul/jejer kanggo tanggepan iki.\nYèn Sampéyan klik \"$1\" manèh, suntingan Sampéyan bakal kasimpen tanpa kuwi.",
        "summary-preview": "Pratuduh tingkesan:",
        "subject-preview": "Prawuryaning jejer:",
        "previewerrortext": "Cacad dumadi nalika njajal mratuduh owahanmu.",
        "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.",
+       "newarticletext": "Panjenengan ngetuti pranala sing durung ana.\nKanggo nggawé kaca, gagéa ngetik ing kothak ngisor iki (deleng [$1 kaca pitulung] ngenani katerangané).\nManawa panjenengan tekan kéné awit ora sengaja, kliken tumbul <strong>balik</strong> ana ing pangluruné 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.''",
        "noarticletext": "Kala saiki kaca iki durung ana tulisané.\nSampéyan bisa [[Special:Search/{{PAGENAME}}|nggolèki sesirahing kaca iki]] sajeroning kaca liya,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nggolèki log sing magepokan],\nutawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} nggawé kaca iki]</span>.",
        "noarticletext-nopermission": "Saiki ora ana tèks ing kaca iki. \nSampéyan bisa [[Special:Search/{{PAGENAME}}|nggolèki judhul kaca iki]] nèng kaca liya, \nutawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|kaca={{urlencode:{{FULLPAGENAME}}}}}} nggolèki log sing kaitan]</span>, nanging Sampéyan ora nduwèni idin nggawé kaca iki.",
        "missing-revision": "Benahan #$1 saka kaca ajeneng \"{{FULLPAGENAME}}\" ora ana.\n\nIki biasané kasebabaké pranala riwayat sing kedaluwarsa saka kaca kuwi wis dibusak.\nRinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-       "userpage-userdoesnotexist": "Akun utawa rékening panganggo \"<nowiki>$1</nowiki>\" ora kadaftar.",
+       "userpage-userdoesnotexist": "Akun panganggo \"$1\" ora kadhaftar.\nMangga pesthèkaké dhisik yèn panjenengan péngin nggawé/mbesut kaca iki.",
        "userpage-userdoesnotexist-view": "Panganggo \"$1\" ora kadhaptar.",
        "blocked-notice-logextract": "Panganggo iki saiki lagi diblokir.\nLog pamblokiran pungkasan dituduhaké ing ngisor iki minangka bahan rujukan:",
        "clearyourcache": "'''Cathetan:''' Sawisé nyimpen préférènsi, panjenengan prelu ngresiki <em>cache</em> panjlajah wèb panjenengan kanggo mirsani pangowahan. '''Mozilla / Firefox / Safari:''' pencèt ''Ctrl-Shift-R'' (''Cmd-Shift-R'' pada Apple Mac); '''IE:''' tekan ''Ctrl-F5''; '''Konqueror:''': pencèt ''F5''; '''Opera''' resikana <em>cache</em> miturut menu ''Tools→Preferences''.",
        "userjspreview": "'''Pèngeten yèn sing panjenengan pirsani namung pratilik JavaScript panjenengan, lan menawa pratilik iku dèrèng kasimpen!'''",
        "sitecsspreview": "<strong>Élinga yèn Sampéyan mung mratuduh CSS iki.\nIki durung kasimpen!</strong>",
        "sitejspreview": "<strong>Élinga yèn Sampéyan mung mratuduh kodhé JavaScript iki.\nIki durung kasimpen!</strong>",
-       "userinvalidcssjstitle": "'''Pènget:''' Kulit \"$1\" ora ditemokaké. Muga dipèngeti yèn kaca .css lan .js nggunakaké huruf cilik, conto {{ns:user}}:Foo/vector.css lan dudu {{ns:user}}:Foo/Vector.css.",
+       "userinvalidcssjstitle": "<strong>Pènget:</strong> Ora ana ules \"$1\".\nKaca .css lan .js padatan nganggo sesirah mawa huruf cilik, contoné {{ns:user}}:Foo/vector.css, dudu {{ns:user}}:Foo/Vector.css.",
        "updated": "(Kaanyaran)",
        "note": "<strong>Cathetan:</strong>",
        "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.",
+       "previewconflict": "Pratuduh iki nuduhaké tèksé ing pérangan ndhuwur kothak besutan tèks lan nuduhaké wujudé kaya déné yèn wis disimpen.",
        "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.'''",
+       "token_suffix_mismatch": "<strong>Besutané panjenengan ditulak amarga aplikasi klièné panjenengan ngowahi karakter tandha waca ing token besutané.</strong>\nBesutané wis ditulak kanggo nyegah rusaké tèks kaca.\nSing kaya mangkono biyasané kadadéan nalika panjenengan nganggo paladenan proksi anonim sing lelandhesan jaringan.",
        "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.'''",
        "editing": "Mbesut $1",
        "creating": "Nggawé $1",
        "editingsection": "Mbesut $1 (pérangan)",
        "editingcomment": "Mbesut $1 (pérangan anyar)",
        "editconflict": "Cengkah besutan: $1",
-       "explainconflict": "Wong liya wis nyunting kaca iki wiwit panjenengan mau nyunting.\nBagian dhuwur tèks iki ngamot tèks kaca vèrsi saiki.\nPangowahan sing panjenengan lakoni dituduhaké ing bagian ngisor tèks.\nPanjenengan namung prelu nggabungaké pangowahan panjenengan karo tèks sing wis ana.\n'''Namung''' tèks ing bagian dhuwur kaca sing bakal kasimpen menawa panjenengan mencèt \"{{int:savearticle}}\".",
+       "explainconflict": "Wong liya wis nyunting kaca iki wiwit panjenengan mau nyunting.\nBagian dhuwur tèks iki ngamot tèks kaca vèrsi saiki.\nPangowahan sing panjenengan lakoni dituduhaké ing bagian ngisor tèks.\nPanjenengan namung prelu nggabungaké pangowahan panjenengan karo tèks sing wis ana.\n'''Namung''' tèks ing bagian dhuwur kaca sing bakal kasimpen menawa panjenengan mencèt \"$1\".",
        "yourtext": "Tulisan panjenengan",
        "storedversion": "Owahan kasimpen",
        "nonunicodebrowser": "'''PÈNGET: Panjlajah wèb panjenengan ora ndhukung Unicode, mangga gantènana panjlajah wèb panjenengan sadurungé nyunting artikel.'''",
        "recreate-moveddeleted-warn": "'''Pènget: Panjenengan gawé manèh sawijining kaca sing wis tau dibusak.'''\n\nMangga digagas manèh apa pantes nerusaké nyunting kaca iki.\nIng ngisor iki kapacak log pambusakan lan pamindhahan saka kaca iki:",
        "moveddeleted-notice": "Kaca iki wis dibusak.\nCathetan busakan lan lih-lihan kaca ana ing ngisor minangka rujukan.",
        "log-fulllog": "Deleng cathetan wutuh",
-       "edit-hook-aborted": "Suntingan dibatalaké déning kait parser\nTanpa ana katrangan.",
+       "edit-hook-aborted": "Besutan diwurungaké déning cangkolan.\nOra ana katerangané.",
        "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.",
+       "edit-no-change": "Besutané panjenengan dilirwakaké amarga ora ana owahan apa-apa nyang tèksé.",
        "postedit-confirmation-created": "Kaca wis kagawé.",
-       "postedit-confirmation-saved": "Besutan sampeyan wis kasimpen.",
+       "postedit-confirmation-saved": "Besutané panjenengan wis kasimpen.",
        "edit-already-exists": "Ora bisa nggawé kaca anyar.\nAmerga wis ana.",
        "defaultmessagetext": "Tèks layang gawan",
        "content-failed-to-parse": "Gagal menjabarkan konten $2 untuk model $1: $3",
        "undo-failure": "Suntingan iki ora bisa dibatalakén amerga ana konflik panyuntingan antara.",
        "undo-norev": "Besutan iki ora bisa diwurungaké amarga wis ora ana utawa wis dibusak.",
        "undo-summary": "Mbalèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]])",
-       "undo-summary-username-hidden": "Batalna revisi $1 saking panganggo kang didhelikake",
+       "undo-summary-username-hidden": "Balèkaké owahan $1 déning panganggo sing didhelikaké",
        "cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa rékening. Sing mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
        "cantcreateaccount-range-text": "Nggawe akun saking alamat IP \"$1\", sing termasuk IP sampeyan (<strong>$4</strong>), sampun diblokir kaliyan [[User:$3|$3]].\n\nAlesan pamblokiran yaiku \"$2\"",
        "viewpagelogs": "Deleng cathetaning kaca iki",
        "last": "sadurung",
        "page_first": "kapisan",
        "page_last": "pungkasan",
-       "histlegend": "Kanggo mbandhingaké: tandhani kothak radhio révisi-révisi sing arep dibandhingaké lan pencèt ''Enter'' utawa tombol sing ana ing ngisor.<br />\nLegéndha: <strong>({{int:cur}})</strong> = béda karo révisi pungkasan, <strong>({{int:last}})</strong> = béda karo révisi sadurungé, <strong>{{int:minoreditletter}}</strong> = besutan cilik.",
+       "histlegend": "Kanggo nandhingaké: tandhani kothak radhio révisi-révisi sing arep dibandhingaké lan pencèt ''Enter'' utawa tombol sing ana ing ngisor.<br />\nLegéndha: <strong>({{int:cur}})</strong> = béda karo révisi pungkasan, <strong>({{int:last}})</strong> = béda karo révisi sadurungé, <strong>{{int:minoreditletter}}</strong> = besutan cilik.",
        "history-fieldset-title": "Luru sujarah",
        "history-show-deleted": "Mligi sing dibusak",
        "histfirst": "lawas dhéwé",
        "mergehistory-empty": "Ora ana revisi sing bisa digabung.",
        "mergehistory-done": "$3 {{PLURAL:$1|révisi|révisi}} saka $1 bisa suksès digabung menyang [[:$2]].",
        "mergehistory-fail": "Ora bisa nggabung sajarah, coba dipriksa manèh kacané lan paramèter wektuné.",
+       "mergehistory-fail-invalid-source": "Kaca sumber ora trep.",
+       "mergehistory-fail-invalid-dest": "Kaca paran ora trep.",
+       "mergehistory-fail-no-change": "Panggabung sujarah ora nggabungaké rèvisi. Mangga priksanen kaca lan paramèter wektuné.",
+       "mergehistory-fail-self-merge": "Kaca asal lan kaca paran padha.",
+       "mergehistory-fail-timestamps-overlap": "Rèvisi asal tumpuk-undhung utawa njedhul sawisé révisi paran.",
+       "mergehistory-fail-toobig": "Ora bisa nggabungaké sujarah amarga {{PLURAL:$1|révisi}} sing arep dilih munjuli $1.",
        "mergehistory-no-source": "Kaca sumber $1 ora ana.",
        "mergehistory-no-destination": "Kaca paran $1 ora ana.",
        "mergehistory-invalid-source": "Kaca sumber kudu asesirah sing sah.",
        "mergehistory-same-destination": "Jeneng kaca sumber lan tujuan ora kena padha",
        "mergehistory-reason": "Alesan:",
        "mergelog": "Gabung log",
-       "revertmerge": "Batalna panggabungan",
+       "revertmerge": "Wurung gabung",
        "mergelogpagetext": "Ing ngisor iki kapacak daftar panggabungan sajarah kaca ing kaca liyané.",
        "history-title": "Sujarah owahaning \"$1\"",
        "difference-title": "Prabéda antara owahan \"$1\"",
        "editundo": "wurung",
        "diff-empty": "(Ora ana bedane)",
        "diff-multi-sameuser": "({{PLURAL:$1|$1 owahan antara}} déning panganggo sing padha ora katuduhaké)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Siji révisi langsung|$1 révisi langsung}} déning {{PLURAL:$2|siji panganggo liyané|$2 panganggo}} ora dituduhaké)",
        "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",
        "searchmenu-new": "<strong>Gawéa kaca \"[[:$1]]\" nyang wiki iki!</strong> {{PLURAL:$2|0=|Uga delenga kaca sing katemu sarana panggolèking sampéyan.|Uga delenga kasiling panggolèk.}}",
        "searchprofile-articles": "Kaca isi",
        "searchprofile-images": "Multimédhia",
-       "searchprofile-everything": "Samubarang",
+       "searchprofile-everything": "Kabèh",
        "searchprofile-advanced": "Lungidan",
        "searchprofile-articles-tooltip": "Golèkan ing $1",
        "searchprofile-images-tooltip": "Golèk barkas",
        "searchprofile-everything-tooltip": "Golèk kabèh isi (kalebu kaca guneman)",
-       "searchprofile-advanced-tooltip": "Golèk ing jagat aran tinamtu",
+       "searchprofile-advanced-tooltip": "Golèk ing mandala 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": "(alihan saka $1)",
        "search-section": "(pérangan $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(cocog karo isi barkas)",
-       "search-suggest": "Apa karepé sampéyan: $1",
+       "search-suggest": "Apa sing panjenengan karepaké iki: $1",
        "search-rewritten": "Tuduhaké kasilé $1, nanging golèkaké $2.",
-       "search-interwiki-caption": "Proyèk-proyèk sababon",
+       "search-interwiki-caption": "Kasil saka proyèk-proyèk sababon",
        "search-interwiki-default": "Wohing panggolèk $1:",
        "search-interwiki-more": "(luwih akèh)",
+       "search-interwiki-more-results": "kasil liyané",
        "search-relatedarticle": "Magepokan",
        "searchrelated": "magepokan",
        "searchall": "kabèh",
        "showingresultsinrange": "Nuduhaké nganti {{PLURAL:$1|<strong>1</strong> kasil|<strong>$1</strong> kasil}} sajeroning penthangan #<strong>$2</strong> tekan #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Asil <strong>$1</strong> dari <strong>$3</strong>|Asil <strong>$1 - $2</strong> saking <strong>$3</strong>}}",
        "search-nonefound": "Ora ana kasil sing cocog karo pitakonan (''query'').",
+       "search-nonefound-thiswiki": "Ora ana kasil sing jumbuh karo panjalukan ing situs iki.",
        "powersearch-legend": "Panggolèkan sabanjuré (''advance search'')",
        "powersearch-ns": "Panggolèkan ing ruang jeneng:",
        "powersearch-togglelabel": "Pilih:",
        "powersearch-toggleall": "Kabèh",
        "powersearch-togglenone": "Ora ana",
+       "powersearch-remember": "Éling-éling sing dipilih kanggo golèkan ing tembé mburi",
        "search-external": "Panggolèkan èkstèrnal",
        "searchdisabled": "Sawetara wektu iki panjenengan ora bisa nggolèk mawa fungsi golèk {{SITENAME}}. Kanggo saiki mangga panjenengan bisa golèk nganggo Google. Nanging isi indèks Google kanggo {{SITENAME}} bisa waé lawas lan durung dianyari.",
        "search-error": "Ana kasalahan wektu nggoleki: $1",
+       "search-warning": "Ana pepélik nalika nggolèk: $1",
        "preferences": "Pilihan",
        "mypreferences": "Pilihan",
        "prefs-edits": "Gunggung besutan:",
-       "prefsnologintext2": "Tulung $1 kanggo ngganti preferensi sampeyan.",
-       "prefs-skin": "Kulit",
+       "prefsnologintext2": "Mangga mlebua log saperlu ngowahi pilalané panjenengan.",
+       "prefs-skin": "Ules",
        "skin-preview": "Pratuduh",
        "datedefault": "Ora ana pilihan",
        "prefs-labs": "Piranti lab",
        "prefs-user-pages": "Kacaning sing nganggo",
-       "prefs-personal": "Panjèrènging sing nganggo",
+       "prefs-personal": "Profil panganggo",
        "prefs-rc": "Owah-owahan pungkasan",
        "prefs-watchlist": "Pawawangan",
        "prefs-editwatchlist": "Besut pawawangan",
        "prefs-watchlist-edits-max": "Gunggung maksimum: 1000",
        "prefs-watchlist-token": "Tokening pawawangan:",
        "prefs-misc": "Liya-liya",
-       "prefs-resetpass": "Ganti tembung sandi",
+       "prefs-resetpass": "Ganti tembung wadi",
        "prefs-changeemail": "Owah utawa busak alamat layangtronik",
        "prefs-setemail": "Setèl alamat layang èlèktronik",
-       "prefs-email": "Opsi layang-e",
+       "prefs-email": "Opsi layang-èl",
        "prefs-rendering": "Tampilan",
        "saveprefs": "Simpen",
        "restoreprefs": "Balèkna kabèh setèlan baku",
        "prefs-editing": "Pambesut",
        "searchresultshead": "Panggolèkan",
-       "stub-threshold": "Ambang wates kanggo format <a href=\"#\" class=\"stub\">pranala rintisan</a>:",
+       "stub-threshold": "Watesan kanggo format pranala rintisan ($1):",
        "stub-threshold-sample-link": "pralampita",
        "stub-threshold-disabled": "Dipatèni",
        "recentchangesdays": "Cacahé dina sing dituduhaké ing owah-owahan pungkasan:",
        "prefs-help-recentchangescount": "Iki klebu owah-owahan pungkasan, kaca sajarah, lan log.",
        "prefs-help-watchlist-token2": "Ini adalah kunci rahasia (token) ke web feed dari daftar pantauan Anda.\nSiapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan.\n[[Special:ResetTokens|Klik di sini jika Anda perlu menyetel ulang]].",
        "savedprefs": "Prèferènsi Panjenengan wis disimpen",
-       "savedrights": "Haking panganggo {{GENDER:$1|$1}} wis kasimpen.",
+       "savedrights": "Golongan panganggo {{GENDER:$1|$1}} wis disimpen.",
        "timezonelegend": "Zona wektu:",
        "localtime": "Wektu saenggon:",
        "timezoneuseserverdefault": "Anggo gawan wiki ($1)",
        "prefs-files": "Barkas",
        "prefs-custom-css": "CSS priangga",
        "prefs-custom-js": "JavaScript priangga",
-       "prefs-common-css-js": "CSS/JS didumaké kanggo kabèh kulit:",
+       "prefs-common-css-js": "CSS/JS sing didumaké kanggo kabèh ules:",
        "prefs-reset-intro": "Panjenengan bisa migunakaké kaca iki kanggo mbalèkaké préferensi panjenengan marang setèlan baku situs.\nPembalikan ora bisa dibatalaké.",
        "prefs-emailconfirm-label": "Konfirmasi layang-e:",
-       "youremail": "Layang élèktronik (E-mail):",
-       "username": "{{GENDER:$1|Asma panganggo}}:",
-       "prefs-memberingroups": "{{GENDER:$2|Anggota}} {{PLURAL:$1|klompok|klompok-klompok}}:",
+       "youremail": "Layang-èl:",
+       "username": "{{GENDER:$1|Jeneng panganggo}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Anggota}} saka {{PLURAL:$1|golongan}}:",
+       "group-membership-link-with-expiry": "$1 (tekan $2)",
        "prefs-registration": "Wektu régistrasi:",
-       "yourrealname": "Asma sajatiné :",
+       "yourrealname": "Jeneng asli:",
        "yourlanguage": "Basa sing dianggo:",
        "yourvariant": "Werna basa isi:",
        "prefs-help-variant": "Varian utawa ortograpi sing Sampéyan pilih kanggo nampilaké kaca kontèn saka wiki iki.",
-       "yournick": "Asma sesinglon/samaran (kagem tapak asta):",
-       "prefs-help-signature": "Tanggapan ing kaca parembugan kudu ditandhatangani mawa \"<nowiki>~~~~</nowiki>\", sing bakal salin dadi tandha tangan lan cap wektumu.",
+       "yournick": "Tapak asma anyar:",
+       "prefs-help-signature": "Tanggapan ing kaca parembugan kudu ditapakasmani mawa \"<nowiki>~~~~</nowiki>\", sing bakal salin dadi tapak asma lan tandha wektuné panjenengan.",
        "badsig": "Tapak astanipun klèntu; cèk rambu HTML.",
        "badsiglength": "Tapak asta panjenengan kedawan.\nAja luwih saka {{PLURAL:$1|karakter|karakter}}.",
-       "yourgender": "Kepiyé sampéyan medhar priangganing panjenengan?",
-       "gender-unknown": "Nalika nyebut sampéyan, piranti alus iku bakal nganggo tembung sing nétral jèndher sabisané",
-       "gender-male": "Dhèwèké mbesut kaca wiki",
-       "gender-female": "Dhèwèké mbesut kaca wiki",
-       "prefs-help-gender": "Opsional: Dipigunakaké kanggo panyebutan jinis kelamin sing bener déning piranti alus.\nInformasi iki bakal kabuka kanggo publik.",
+       "yourgender": "Kepiyé panjenengan nggambaraké salirané panjenengan?",
+       "gender-unknown": "Nalika nyebut panjenengan, piranti alusé bakal nganggo tembung sing nétral jèndher sabisané",
+       "gender-male": "Lanang",
+       "gender-female": "Wadon",
+       "prefs-help-gender": "Setèlané pilalan iki sipaté manasuka.\nPiranti alusé nganggo ajiné kanggo ngarani lan nyebut panjenengan nyang liyan sarana tembung jèndher sing patut sacara paramasastra.\nKaterangan iki bakal kanton marang umum.",
        "email": "Layangtronik",
-       "prefs-help-realname": "Jeneng asli manasuka.\nMenawa diisi, iku bakal kanggo ngatribusi sampéyan awit karyaning sampéyan.",
+       "prefs-help-realname": "Jeneng asli ora kudu diisi.\nYèn diisi, jeneng asliné panjenengan bakal kanggo atribusi awit karyané panjenengan.",
        "prefs-help-email": "Alamat layang èlèktronik sipaté mung pilihan, nanging dibutuhaké kanggo nyetèl ulang tembung sandhi yèn Sampéyan lali.",
        "prefs-help-email-others": "Sampéyan uga bisa milih kanggo ngidinaké wong liya ngubungi Sampéyan liwat layang èlèktronik sing ana ing kaca panganggo utawa kaca guneman.\nAlamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi Sampéyan.",
        "prefs-help-email-required": "Alamat layang-e dibutuhaké.",
        "prefs-diffs": "Prabédan",
        "prefs-help-prefershttps": "Pamiji iki bakal lumaku mentas sampeyan mbalèni mlebu.",
        "prefs-tabs-navigation-hint": "Saran: Sampeyan bisa nganggo tombol jemparing kiwa lan tengen saperlu navigasi tab-tab ing pratélan tab.",
-       "userrights": "Manajemen hak panganggo",
-       "userrights-lookup-user": "Ngatur kelompok panganggo",
+       "userrights": "Hak panganggo",
+       "userrights-lookup-user": "Pilih panganggo",
        "userrights-user-editname": "Isi jeneng panganggo:",
-       "editusergroup": "Besut golongan {{GENDER:$1|panganggo}}",
-       "editinguser": "Ngganti hak panganggo '''[[User:$1|$1]]''' $2",
-       "userrights-editusergroup": "Besut golongan panganggo",
-       "saveusergroups": "Simpen kelompok panganggo",
+       "editusergroup": "Mot golongan panganggo",
+       "editinguser": "Ngowahi hak {{GENDER:$1|panganggo}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Ndeleng hak {{GENDER:$1|panganggo}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Besut golongan {{GENDER:$1|panganggo}}",
+       "userrights-viewusergroup": "Deleng golongan {{GENDER:$1|panganggo}}",
+       "saveusergroups": "Simpen golongan {{GENDER:$1|panganggo}}",
        "userrights-groupsmember": "Anggota saka:",
        "userrights-groupsmember-auto": "Anggota implisit saka:",
        "userrights-groups-help": "Panjenengan bisa ngowahi grup-grup sing ana panganggoné iki.\n* Kothak sing dicenthang tegesé panganggo iki ana sajroné grup iku.\n* Kothak sing ora dicenthang tegesé panganggo iku ora ana ing grup iku.\n* Tandha bintang * tegesé panjenengan ora bisa ngilangi grup iku yèn wis tau nambah, utawa sawalikané.",
        "userrights-nodatabase": "Basis data $1 ora ana utawa ora lokal.",
        "userrights-changeable-col": "Grup sing bisa panjenengan owahi",
        "userrights-unchangeable-col": "Grup sing ora bisa diowahi panjenengan",
+       "userrights-expiry-current": "Kadaluwarsa $1",
+       "userrights-expiry-none": "Ora kadaluwarsa",
+       "userrights-expiry": "Kadaluwarsa:",
+       "userrights-expiry-existing": "Wektu kadaluwarsa sing ana: $3, $2",
+       "userrights-expiry-othertime": "Wektu liya:",
+       "userrights-expiry-options": "1 dina:1 dina,1 minggu:1 minggu,1 wulan:1 wulan,3 wulan:3 wulan,6 wulan:6 wulan,1 taun:1 taun",
+       "userrights-invalid-expiry": "Wektu kadaluwarsa golongan \"$1\" ora trep.",
+       "userrights-expiry-in-past": "Wektu kadaluwarsa golongan \"$1\" ana ing kala kawuri.",
        "userrights-conflict": "Konflik pangowahan hak-hak panganggo! Tulung ditinjau maneh lan konfirmasi Pangowahan sampeyan.",
        "group": "Golongan:",
        "group-user": "Para panganggo",
-       "group-autoconfirmed": "Panganggo sing otomatis didhedhes (dikonfirmasi)",
+       "group-autoconfirmed": "Panganggo sing otomatis kakonfirmasi",
        "group-bot": "Bot",
        "group-sysop": "Pangurus",
        "group-bureaucrat": "Birokrat",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat}}",
        "group-suppress-member": "{{GENDER:$1|pangawasan}}",
        "grouppage-user": "{{ns:project}}:Para panganggo",
-       "grouppage-autoconfirmed": "{{ns:project}}:Panganggo sing otomatis didhedhes (dikonfirmasi)",
+       "grouppage-autoconfirmed": "{{ns:project}}:Panganggo sing otomatis kakonfirmasi",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Pangurus",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrat",
        "right-edit": "Besut kaca",
        "right-createpage": "Gawé kaca (sing dudu kaca parembugan)",
        "right-createtalk": "Gawé kaca parembugan",
-       "right-createaccount": "Nggawé rékening (akun) panganggo anyar",
-       "right-minoredit": "Tandhani minangka besutan cilik",
+       "right-createaccount": "Gawé akun panganggo anyar",
+       "right-autocreateaccount": "Otomatis mlebu log nganggo akun panganggo njaba",
+       "right-minoredit": "Tandhani yèn besutan cilik",
        "right-move": "Ngalih kaca",
        "right-move-subpages": "Pindhahaké kaca lan kabèh anak-kacané",
        "right-move-rootuserpages": "Ngalih kaca panganggo oyod",
+       "right-move-categorypages": "Lih kaca kategori",
        "right-movefile": "Mindhah berkas",
        "right-suppressredirect": "Aja nggawé pangalihan saka kaca sing lawas yèn mindhah sawijining kaca",
        "right-upload": "Unggah barkas",
        "right-delete": "Busak kaca-kaca",
        "right-bigdelete": "Busak kaca-kaca mawa sajarah panyuntingan sing gedhé",
        "right-deletelogentry": "Busak lan wurung busak èntri log tartamtu",
-       "right-deleterevision": "Busak lan batal busak révisi tartamtu kaca-kaca",
+       "right-deleterevision": "Busak lan wurung busak owahan tinamtuné kaca",
        "right-deletedhistory": "Ndeleng sajarah èntri-èntri kabusak, tanpa bisa ndeleng apa sing dibusak",
        "right-deletedtext": "Delok tèks kabusak lan panggantèn antara rèpisi kabusak",
        "right-browsearchive": "Golèk kaca-kaca sing wis dibusak",
        "right-undelete": "Wurung busak kaca",
-       "right-suppressrevision": "Ndeleng lan mbalèkaké révisi-révisi sing didelikaké saka para opsis",
+       "right-suppressrevision": "Deleng, dhelikaké, lan wurung dhelikaké owahan tinamtu kaca-kacané panganggo sembarang",
+       "right-viewsuppressed": "Deleng owahan sing didhelikaké saka panganggo sembarang",
        "right-suppressionlog": "Ndeleng log-log pribadi",
        "right-block": "Blokir panganggo-panganggo liya saka panyuntingan",
        "right-blockemail": "Blokir sawijining panganggo saka ngirim e-mail",
        "right-protect": "Ganti undhaking pangreksan lan owah kaca-kaca sing direksa",
        "right-editprotected": "Owah kaca-kaca sing direksa (tanpa pangreksan runtun)",
        "right-editsemiprotected": "Owah kaca-kaca sing direksa dadi \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Besut modhèl kontèn kaca",
        "right-editinterface": "Besut antarmuka panganggo",
-       "right-editusercssjs": "Besut barkas-barkas CSS lan JavaScript panganggo liya",
        "right-editusercss": "Besut barkas-barkas CSS panganggo liya",
        "right-edituserjs": "Besut barkas-barkas JavaScript panganggo liya",
        "right-editmyusercss": "Owahi berkas CSS panganggo sampeyan",
        "right-editmyuserjs": "Owahi berkas JavaScript panganggo sampeyan",
-       "right-viewmywatchlist": "Deleng pawawanganing sampéyan",
+       "right-viewmywatchlist": "Deleng pawawangané panjenengan",
        "right-editmywatchlist": "Owahi daftar pangawasan sampeyan. Cathetan: ana cara liyane kanggo nambahi kaca menyang daftar, sanadyan ora duwe hak iki.",
        "right-viewmyprivateinfo": "Dheleng data pribadi sampeyan (kayata alamat layang elektronik, jeneng asli)",
        "right-editmyprivateinfo": "Owahi data pribadi sampeyan (kayata alamat layang elektronik, jeneng asli)",
        "right-editmyoptions": "Owahi preferensi sampeyan",
        "right-rollback": "Balèkaké kanthi gelis besutaning panganggo pungkasan sing mbesut kaca tinamtu",
-       "right-markbotedits": "Tandhani besutan kawurungan minangka besutan bot",
+       "right-markbotedits": "Tandhani besutan sing kawurungan yèn besutan bot",
        "right-noratelimit": "Ora dipengaruhi déning wates cacahing suntingan.",
        "right-import": "Impor kaca-kaca saka wiki liya",
        "right-importupload": "Impor kaca saka unggahan barkas",
        "right-siteadmin": "Kunci lan buka kunci basis data",
        "right-override-export-depth": "Èkspor kaca klebu kaca kagandhèng nganti tataran/''depth'' 5",
        "right-sendemail": "Ngirim layang listrik (e-mail) menyang panganggo liya",
-       "grant-group-email": "Kirim layang élèktronik",
+       "grant-group-page-interaction": "Srawungan karo kaca",
+       "grant-group-file-interaction": "Srawungan karo médhia",
+       "grant-group-watchlist-interaction": "Srawungan karo pawawangané panjenengan",
+       "grant-group-email": "Kirim layang-èl",
+       "grant-group-high-volume": "Ngayahi kagiyatan sing akih",
+       "grant-group-customization": "Panglarasan lan pilalan",
+       "grant-group-administration": "Ngayahi tumindak administratif",
+       "grant-group-private-information": "Ngaksès dhata pribadhi ngenani panjenengan",
+       "grant-group-other": "Kagiyatan rena-rena",
+       "grant-blockusers": "Blokir lan uculaké blokirané panganggo",
        "grant-createaccount": "Gawé akun",
        "grant-createeditmovepage": "Gawé, besut, lan lih kaca",
        "grant-delete": "Busak kaca, owahan, lan isian cathetan",
        "grant-editinterface": "Besut jagad aran MediaWiki lan CSS/JavaScript panganggo",
        "grant-editmycssjs": "Besut CSS/JavaScript panganggomu",
        "grant-editmyoptions": "Besut préferènsi panganggomu",
+       "grant-editmywatchlist": "Besut pawawangané panjenengan",
+       "grant-editpage": "Besut kaca sing ana",
+       "grant-editprotected": "Besut kaca sing direksa",
+       "grant-highvolume": "Besutan gedhi",
+       "grant-oversight": "Dhelikaké panganggo dalah révisiné",
+       "grant-patrol": "Awasi owahané kaca",
+       "grant-privateinfo": "Ngaksès informasi pribadhi",
+       "grant-protect": "Reksa lan uculi rereksané kaca",
+       "grant-rollback": "Wurungaké owahané kaca",
+       "grant-sendemail": "Kirim layang-èl nyang panganggo liyané",
+       "grant-uploadeditmovefile": "Unggah, ganti, lan lih barkas",
+       "grant-uploadfile": "Unggah barkas anyar",
+       "grant-basic": "Hak pokok",
+       "grant-viewdeleted": "Deleng barkas lan kaca sing dibusak",
+       "grant-viewmywatchlist": "Deleng pawawangané panjenengan",
+       "grant-viewrestrictedlogs": "Deleng isian log sing winates",
        "newuserlogpage": "Log panganggo anyar",
        "newuserlogpagetext": "Ing ngisor iki kapacak log pandaftaran panganggo anyar.",
        "rightslog": "Log hak panganggo",
        "action-createpage": "gawé kaca iki",
        "action-createtalk": "gawé kaca parembugan iki",
        "action-createaccount": "gawé akun panganggo iki",
+       "action-autocreateaccount": "otomatis nggawé akun panganggo njaba iki",
+       "action-history": "deleng sujarahé kaca iki",
        "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-upload_by_url": "unggahna berkas iki saka sawijining alamat URL",
        "action-writeapi": "migunakaké API panulisan",
        "action-delete": "busak kaca iki",
-       "action-deleterevision": "busak revisi iki",
-       "action-deletedhistory": "pirsani sajarah kaca sing wis dibusak iki",
+       "action-deleterevision": "busak révisi",
+       "action-deletelogentry": "busak isian log",
+       "action-deletedhistory": "deleng sujarah sing dibusak sawijiné kaca",
+       "action-deletedtext": "deleng tèks révisi sing dibusak",
        "action-browsearchive": "nggolèki kaca-kaca sing wis dibusak",
-       "action-undelete": "wurung busak kaca iki",
-       "action-suppressrevision": "ninjo lan mbalèkaké revisi sing didhelikaké iki",
+       "action-undelete": "wurung busak kaca",
+       "action-suppressrevision": "tinjo lan balèkaké révisi sing didhelikaké",
        "action-suppressionlog": "mirsani log pribadi iki",
        "action-block": "malang panganggo iki mbesut",
        "action-protect": "owahi tataran pangreksan kaca iki",
        "action-import": "impor kaca iki saka wiki liya",
        "action-importupload": "impor kaca iki saka pamunggahan berkas",
        "action-patrol": "nandhani besutan wong liya yèn wis kapriksa",
-       "action-autopatrol": "nandhani besutan panjenengan dhéwé 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",
        "action-siteadmin": "ngunci utawa mbukak kunci basis data",
        "action-sendemail": "kirim layang èlèktronik",
+       "action-editmyoptions": "besut pilalané panjenengan",
        "action-editmywatchlist": "owahi daftar pantauan sampeyan",
        "action-viewmywatchlist": "dheleng daftar pantauan sampeyan",
        "action-viewmyprivateinfo": "dheleng informasi pribadi sampeyan",
        "action-editmyprivateinfo": "owahi informasi pribadi sampeyan",
+       "action-editcontentmodel": "besut modhèl kontèné sawijiné kaca",
+       "action-managechangetags": "gawé lan patèni tag",
+       "action-applychangetags": "pasang tag nyang owahané panjenengan",
+       "action-changetags": "tambah lan busak tag arbitrèr ing saben révisi lan isian log",
+       "action-deletechangetags": "busak tag saka sasana dhata",
+       "action-purge": "buwang kaca iki",
        "nchanges": "$1 {{PLURAL:$1|pangowahan|owah-owahan}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|saka keri dhewe mrene}}",
        "enhancedrc-history": "sujarah",
        "recentchanges-label-minor": "Iki besutan cilik",
        "recentchanges-label-bot": "Besutan iki diayahi bot",
        "recentchanges-label-unpatrolled": "Besutan iki durung kapatroli",
-       "recentchanges-label-plusminus": "Ukuran owahing kaca ing bèt",
+       "recentchanges-label-plusminus": "Ukuran owahé kaca mawa ékan bèt",
        "recentchanges-legend-heading": "<strong>Legendha:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uga deleng [[Special:NewPages|pratélaning kaca-kaca anyar]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uga delengen [[Special:NewPages|pratélané kaca-kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Tuduhaké",
+       "rcfilters-activefilters": "Saringan sing murub",
+       "rcfilters-quickfilters": "Pranala rikat",
+       "rcfilters-savedqueries-defaultlabel": "Saringan sumimpen",
+       "rcfilters-savedqueries-rename": "Ganti jeneng",
+       "rcfilters-savedqueries-setdefault": "Dadèkaké baku",
+       "rcfilters-savedqueries-unsetdefault": "Wutung ndadèkaké baku",
+       "rcfilters-savedqueries-remove": "Busak",
+       "rcfilters-savedqueries-new-name-label": "Jeneng",
+       "rcfilters-savedqueries-apply-label": "Gawé pranala rikat",
+       "rcfilters-savedqueries-cancel-label": "Wurung",
+       "rcfilters-savedqueries-add-new-title": "Simpen saringan dadi pranala rikat",
+       "rcfilters-restore-default-filters": "Pulihaké saringan gawan",
+       "rcfilters-clear-all-filters": "Resiki kabèh saringan",
+       "rcfilters-search-placeholder": "Saring owah-owahan anyar (lurua utawa wiwita ngetik)",
+       "rcfilters-invalid-filter": "Saringan ora sah",
+       "rcfilters-empty-filter": "Ora ana saringan sing aktif. Kabèh sumbangan katuduhaké.",
+       "rcfilters-filterlist-title": "Saringan",
+       "rcfilters-filterlist-whatsthis": "Apa iki?",
+       "rcfilters-filterlist-feedbacklink": "Wènèhi saran ngenani saringan (béta) sing anyar",
+       "rcfilters-highlightbutton-title": "Sentrongi kasil",
+       "rcfilters-filterlist-noresults": "Saringan ora katemu",
+       "rcfilters-filtergroup-registration": "Pandhaftaran panganggo",
+       "rcfilters-filter-registered-label": "Kadhaftar",
+       "rcfilters-filter-registered-description": "Pambesut njeron log.",
+       "rcfilters-filter-unregistered-label": "Ora kadhaftar",
+       "rcfilters-filter-unregistered-description": "Juru besut sing ora mlebu log.",
+       "rcfilters-filtergroup-authorship": "Pangripta besutan",
+       "rcfilters-filter-editsbyself-label": "Owah-owahané panjenengan",
+       "rcfilters-filter-editsbyself-description": "Sumbangané panjenengan dhéwé.",
+       "rcfilters-filter-editsbyother-label": "Owah-owahané liyan",
+       "rcfilters-filter-editsbyother-description": "Kabèh owahan kajaba duwèké panjenengan.",
+       "rcfilters-filtergroup-userExpLevel": "Tataran pangalaman (mung kanggo panganggo kadhaftar)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Wong neneka anyar",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Kurang saka 10 besutan lan 4 dina kagiyatan.",
+       "rcfilters-filter-user-experience-level-learner-label": "Wong sinau",
+       "rcfilters-filter-user-experience-level-learner-description": "Luwih akèh pangalamané tinimbang \"Wong neneka anyar\" nanging durung ngèmperi \"Panganggo kawakan\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Panganggo kawakan",
+       "rcfilters-filter-user-experience-level-experienced-description": "Punjul saka 30 dina kagiyatan lan 500 besutan.",
+       "rcfilters-filtergroup-automated": "Sumbangan otomatisasi",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Besutan déning piranti otomatisasi.",
+       "rcfilters-filter-humans-label": "Manungsa (dudu bot)",
+       "rcfilters-filter-humans-description": "Besutan gawéané pambesut manungsa.",
+       "rcfilters-filtergroup-reviewstatus": "Tinjo kalungguhan",
+       "rcfilters-filter-patrolled-label": "Diawasi",
+       "rcfilters-filter-patrolled-description": "Besutan ditengeri yèn diawasi.",
+       "rcfilters-filter-unpatrolled-label": "Uculi pangawasan",
+       "rcfilters-filter-unpatrolled-description": "Besutan ora ditengeri yèn diawasi.",
+       "rcfilters-filtergroup-significance": "Kawigatèn",
+       "rcfilters-filter-minor-label": "Besutan cilik",
+       "rcfilters-filter-minor-description": "Besutan sing ditandhani pangriptané minangka besutan cilik.",
+       "rcfilters-filter-major-label": "Besutan ora cilik",
+       "rcfilters-filter-major-description": "Besutan sing ora ditandhani minangka besutan cilik.",
+       "rcfilters-filtergroup-watchlist": "Kaca sing ana ing pawawangan",
+       "rcfilters-filter-watchlist-watched-label": "Ana ing Pawawangan",
+       "rcfilters-filter-watchlist-watched-description": "Owahané kaca-kaca ing Pawawangané panjenengan.",
+       "rcfilters-filter-watchlist-watchednew-label": "Owah-owahané Pawawangan anyar",
+       "rcfilters-filter-watchlist-watchednew-description": "Owah-owahan ngenani kaca-kaca ing Pawawangané panjenengan sing durung ditiliki.",
+       "rcfilters-filter-watchlist-notwatched-label": "Ora ana ing Pawawangan",
+       "rcfilters-filter-watchlist-notwatched-description": "Samubarang kajaba owah-owahané kaca-kaca ing ana ing Pawawangané panjenengan.",
+       "rcfilters-filtergroup-changetype": "Jinisé owahan",
+       "rcfilters-filter-pageedits-label": "Besutan kaca",
+       "rcfilters-filter-pageedits-description": "Besutan marang kontèn wiki, parembugan, wedharan kategori....",
+       "rcfilters-filter-newpages-label": "Gawéan kaca",
+       "rcfilters-filter-newpages-description": "Besutan sing nggawé kaca anyar.",
+       "rcfilters-filter-categorization-label": "Owah-owahan kategori",
+       "rcfilters-filter-categorization-description": "Cathethan ngenani mlebu-metuné kaca saka kategori.",
+       "rcfilters-filter-logactions-label": "Tumindak njeron log",
+       "rcfilters-filter-logactions-description": "Tumindak administratif, gawéan akun, busakan kaca, unggahan....",
+       "rcfilters-filtergroup-lastRevision": "Owahan pungkasan",
+       "rcfilters-filter-lastrevision-label": "Owahan pungkasan",
+       "rcfilters-filter-lastrevision-description": "Owahan paling anyar tumrap kaca.",
+       "rcfilters-filter-previousrevision-label": "Owahan-owahan dhisik",
+       "rcfilters-filter-previousrevision-description": "Kabèh owahan sing dudu sing anyar dhéwé tumrap kaca.",
        "rcnotefrom": "Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
        "rclistfrom": "Tuduhaké owah-owahan anyar kawit $2, $3",
        "rcshowhideminor": "$1 besutan cilik",
        "rcshowhidecategorization": "$1 kategorisasi kaca",
        "rcshowhidecategorization-show": "Tuduhaké",
        "rcshowhidecategorization-hide": "Dhelikaké",
-       "rclinks": "Tuduhaké $1 owahan kawit $2 dina kapungkur.<br />$3",
+       "rclinks": "Tuduhaké $1 owahan pungkasan kawit $2 dina kapungkur.",
        "diff": "béd",
        "hist": "saj",
        "hide": "Dhelikaké",
        "recentchangeslinked-summary": "Iki pratélan owah-owahan anyar kaca-kaca sing nggayut kaca tinamtu (utawa péranganing kategori tinamtu).\nKaca-kaca sing ana ing [[Special:Watchlist|pawawanganing sampéyan]] ya iku sing <strong>kandhel</strong>.",
        "recentchangeslinked-page": "Jeneng kaca:",
        "recentchangeslinked-to": "Nuduhaké owah-owahan menyang kaca sing disambung menyang kaca-kaca iki",
+       "recentchanges-page-added-to-category": "[[:$1]] ditambahaké nyang kategori",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ditambahaké nyang kategori, [[Special:WhatLinksHere/$1|kaca iki kalebu ing njeroné kaca liyané]]",
+       "recentchanges-page-removed-from-category": "[[:$1]] dibusak saka kategori",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] dibusak saka kategori, [[Special:WhatLinksHere/$1|kaca iki kalebu ing njeroné kaca liyané]]",
+       "autochange-username": "Salin otomatis MediaWiki",
        "upload": "Unggah barkas",
        "uploadbtn": "Unggahna berkas",
        "reuploaddesc": "Bali ing formulir pamotan",
        "upload-tryagain": "Kirim déskripsi berkas sing wis diowah",
        "uploadnologin": "Durung mlebu log",
-       "uploadnologintext": "Sampéyan kudu $1 supaya bisa ngunggah berkas.",
+       "uploadnologintext": "Mangga $1 saperlu ngunggah barkas.",
        "upload_directory_missing": "Direktori pamunggahan ($1) ora ditemokaké lan ora bisa digawé déning server wèb.",
        "upload_directory_read_only": "Dhirèktori pangunggahan ($1) ora bisa ditulis déning paladèn jaringan.",
        "uploaderror": "Kaluputan pangunggahan berkas",
        "upload-recreate-warning": "'''Pèngetan: Berkas mawa jeneng kuwi wis dibusak utawa disingkiraké.'''\n\nLog pambusakan lan panyingkiran saka kaca iki sumadhiya nèng kéné:",
        "uploadtext": "Anggé formulir ing ngandhap punika kanggé nginggahaké gambar.\nKanggé mirsani utawi madosi gambar ingkang sampun dipununggah sakdèrèngipun pigunakaken [[Special:FileList|dhaftar berkas sing wis diunggah]], gambar ingkang dipununggah ulang ugi kadhaftar ing [[Special:Log/upload|log pangunggahan]], pambusakan ing [[Special:Log/delete|Log pambusakan]].\n\nKanggé nyertakaken gambar ing satunggiling kaca, pigunakaken pranala salah setunggal saking format ing ngandhap punika:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></code>''' kanggé migunakaken versi pepak gambar\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|tèks alt]]</nowiki></code>''' kanggé migunakaken gambar wiyaripun 200 piksel ing kothak ing sisih kiwa kanthi 'tèks alt' minangka panjelasan\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' kanggé nggandhèng langsung dhumateng gambar tanpi nampilaké gambar",
-       "upload-permitted": "Jenis berkas sing diidinaké: $1.",
-       "upload-preferred": "Jenis berkas sing disaranaké: $1.",
-       "upload-prohibited": "Jenis berkas sing dilarang: $1.",
+       "upload-permitted": "{{PLURAL:$2|Jinis}} barkas sing diidinaké: $1.",
+       "upload-preferred": "{{PLURAL:$2|Jinis}} barkas sing diprayogakaké: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Jinis}} barkas sing dilarang: $1.",
        "uploadlogpage": "Log unggah",
        "uploadlogpagetext": "Ing ngisor iki kapacak log pangunggahan berkas sing anyar dhéwé.\nMangga mirsani [[Special:NewFiles|galeri berkas-berkas anyar]] kanggo pratélan visual.",
        "filename": "Jeneng barkas",
        "filetype-unwanted-type": "'''\".$1\"''' klebu jenis berkas sing ora diidinaké.\nLuwih becik {{PLURAL:$3|jinis berkas|Jinis-jinis berkas}} $2.",
        "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|dudu jinis berkas sing dililakaké|dudu jinis berkas sing dililakaké}}.\n{{PLURAL:$3|Berkas|Berkas}} sing dililakaké $2.",
        "filetype-missing": "Berkas ini ora duwé ekstènsi (contoné \".jpg\").",
-       "empty-file": "Berkas sing Sampéyan kirim kosong.",
-       "file-too-large": "Berkas sing Sampéyan kirim kagedhèn.",
+       "empty-file": "Barkas sing panjenengan kirim kosong.",
+       "file-too-large": "Barkas sing panjenengan kirim kagedhèn.",
        "filename-tooshort": "Jeneng berkas kacendhèken.",
        "filetype-banned": "Jinis berkas iki dilarang.",
        "verification-error": "Berkas iki ora lulus pangesahan.",
-       "hookaborted": "Pangowahan sing Sampéyan coba dibatalaké déning èkstènsi.",
+       "hookaborted": "Owahan sing panjenengan ayahi diwurungaké déning èkstènsi.",
        "illegal-filename": "Jeneng berkas ora dililakaké.",
        "overwrite": "Nibani berkas sing wis ana ora dililakaké.",
        "unknown-error": "Ana masalah sing ora dingertèni.",
        "upload-copy-upload-invalid-domain": "Unggahan salinan ora sumadhiya nèng domain iki.",
        "upload-dialog-title": "Unggah barkas",
        "upload-dialog-button-cancel": "Wurung",
+       "upload-dialog-button-back": "Balik",
        "upload-dialog-button-done": "Rampung",
        "upload-dialog-button-save": "Simpen",
        "upload-dialog-button-upload": "Unggah",
        "upload-form-label-infoform-title": "Rerincèn",
        "upload-form-label-infoform-name": "Jeneng",
+       "upload-form-label-infoform-description": "Wedharan",
+       "upload-form-label-usage-title": "Pangguna",
        "upload-form-label-usage-filename": "Jeneng barkas",
        "upload-form-label-own-work": "Iki karyaku dhéwé",
        "upload-form-label-infoform-categories": "Kategori",
        "uploadstash": "Unggah pandhelikan",
        "uploadstash-summary": "Kaca iki nyadhiyakaké dalan nèng berkas-berkas sing wis diunggah (utawa lagi diunggah) naning durung diterbitaké nèng wiki. Berkas-berkas iki ora katon kanggo sapa waé nanging namung kanggo panganggo sing ngunggah waé.",
        "uploadstash-clear": "Busak berkas kadhelikaké",
-       "uploadstash-nofiles": "Sampéyan ora nduwé berkas kadhelikaké.",
+       "uploadstash-nofiles": "Panjenengan ora duwé barkas simpenan.",
        "uploadstash-badtoken": "Nglakoni iki ora suksès, mungkin amarga hak panyuntingan Sampéyan wis kedaluwarsa. Jajal manèh.",
        "uploadstash-errclear": "Ngresiki berkas ora suksès.",
        "uploadstash-refresh": "Segeraké daptar berkas",
        "license": "Jenis lisènsi:",
        "license-header": "Pamalilah",
        "nolicense": "Durung ana sing dipilih",
+       "licenses-edit": "Besut pilihan lisènsi",
        "license-nopreview": "(Pratuduh ora sumadhiya)",
-       "upload_source_url": " (sawijining URL absah sing bisa diaksès publik)",
-       "upload_source_file": " (sawijining berkas ing komputeré panjenengan)",
+       "upload_source_url": "(barkas sing panjenengan pilih saka URL sing trep tur bisa diaksès umum)",
+       "upload_source_file": "(barkas sing panjenengan pilih saka komputeré panjenengan)",
+       "listfiles-delete": "busak",
        "listfiles-summary": "Kaca mirunggan iki nuduhaké kabèh barkas sing kaunggah.",
        "listfiles_search_for": "Golèk jeneng gambar:",
+       "listfiles-userdoesnotexist": "Akun panganggo \"$1\" ora kadhaftar.",
        "imgfile": "barkas",
        "listfiles": "Daftar gambar",
        "listfiles_thumb": "Gambar mini",
        "morelinkstoimage": "Ndeleng [[Special:WhatLinksHere/$1|luwih akèh pranala]] menyang berkas iki.",
        "linkstoimage-redirect": "$1 (alihan berkas) $2",
        "duplicatesoffile": "{{PLURAL:$1|berkas ing ngisor arupa duplikat|$1 berkas ing ngisor arupa duplikat}} saka berkas iki ([[Special:FileDuplicateSearch/$2|luwih rinci]]):",
-       "sharedupload": "Berkas iki saka $1 lan bisa digunakaké déning proyèk liya.",
+       "sharedupload": "Barkas iki saka $1 lan bisa kanggo proyèk-proyèk liyané.",
        "sharedupload-desc-there": "Berkas iki asal saka $1 lan bisa dipigunakaké déning proyèk liya.\nMangga pirsani [$2 kaca dhèskripsi berkas] kanggo informasi sabanjuré.",
        "sharedupload-desc-here": "Barkas iki saka $1 lan kena kanggo proyèk liya.\nPanyandraning [$2 kaca panyandra barkas]é kapacak ing ngisor.",
        "sharedupload-desc-edit": "Berkas iki saka $1 lan mungkin dianggo nèng proyèk liya.\nMungkin Sampéyan pingin nyunting katrangan nèng [$2 kaca katrangan berkasé] nèng kono.",
        "filerevert-submit": "Balèkna",
        "filerevert-success": "'''[[Media:$1|$1]]''' wis dibalèkaké menyang [vèrsi $4 ing $3, $2].",
        "filerevert-badversion": "Ora ana vèrsi lokal sadurungé saka berkas iki mawa stèmpel wektu sing dikarepaké.",
+       "filerevert-identical": "Vèrsi barkasé sing saiki padha plek karo sing dipilih.",
        "filedelete": "Mbusak $1",
        "filedelete-legend": "Mbusak berkas",
        "filedelete-intro": "Panjenengan bakal mbusak berkas '''[[Media:$1|$1]]''' sekaliyan kabèh riwayaté.",
        "randomincategory": "Sembarang kaca ing kategori",
        "randomincategory-invalidcategory": "\"$1\" dudu jeneng kategori sing apik.",
        "randomincategory-nopages": "Ora ana kaca ing kategori [[:Category:$1|$1]].",
+       "randomincategory-category": "Kategori:",
+       "randomincategory-legend": "Sembarang kaca ing kategori",
        "randomincategory-submit": "Tumuju",
        "randomredirect": "Pangalihan sembarang",
        "randomredirect-nopages": "Ora ana pangalihan ing bilik jeneng \"$1\".",
        "protectedpagesempty": "Saat ini tidak ada halaman yang sedang dilindungi.",
        "protectedpages-page": "Kaca",
        "protectedpages-expiry": "Kadaluwarsa",
+       "protectedpages-performer": "Ngreksa panganggo",
+       "protectedpages-params": "Paramèter rereksan",
        "protectedpages-reason": "Alesan",
+       "protectedpages-submit": "Tuduhaké kaca",
+       "protectedpages-unknown-timestamp": "Ora dingertèni",
+       "protectedpages-unknown-performer": "Panganggo ora dingertèni",
        "protectedtitles": "Sesirah direksa",
        "protectedtitlesempty": "Ora ana sesirah sing saiki kareksa mawa paramèter iki.",
+       "protectedtitles-submit": "Tuduhaké sesirah",
        "listusers": "Daftar panganggo",
        "listusers-editsonly": "Tampilaké mung panganggo sing nduwèni kontribusi",
        "listusers-creationsort": "Urut miturut tanggal digawé",
        "usereditcount": "$1 {{PLURAL:$1|besutan|besutan}}",
        "usercreated": "{{GENDER:$3|Digawé}} $1 wanci $2",
        "newpages": "Kaca anyar",
-       "newpages-username": "Asma panganggo:",
+       "newpages-submit": "Tuduhaké",
+       "newpages-username": "Jeneng panganggo:",
        "ancientpages": "Kaca paling lawas",
        "move": "Pindhahen",
        "movethispage": "Lih kaca iki",
        "pager-older-n": "{{PLURAL:$1|1 luwih lawas|$1 luwih lawas}}",
        "suppress": "Dhelikaké",
        "querypage-disabled": "Kaca kusus iki dipatèni kanggo alesan kinerja.",
+       "apihelp": "Pitulung API",
+       "apihelp-no-such-module": "Modhul \"$1\" ora katemu.",
        "apisandbox": "Kothak wedhi API",
+       "apisandbox-jsonly": "JavaScript dibutuhaké saperlu nganggo bak wedhi API.",
        "apisandbox-api-disabled": "API dipatèni nèng situs iki.",
        "apisandbox-intro": "Anggo kaca iki kanggo njajal-njajal '''API layanan wèb MediaWiki'''.\nRujuk [https://www.mediawiki.org/wiki/API:Main_page the dhokumèntasi API] kanggo panganggoan API luwih rinci. Conto: [https://www.mediawiki.org/wiki/API#A_simple_example ngéntukaké kontèn Kaca Utama]. Pilih laku kanggo ndelok conto luwih akèh.",
+       "apisandbox-fullscreen": "Jembaraké panèl",
+       "apisandbox-fullscreen-tooltip": "Jembaraké panèl bak wedhi kanggo ngisi jendhéla pangluru.",
+       "apisandbox-unfullscreen": "Tuduhaké kaca",
+       "apisandbox-unfullscreen-tooltip": "Ciyutaké panèl bak wedhi supaya pranala navigasi MediaWiki dadi ana.",
        "apisandbox-submit": "Gawé panjalukan",
        "apisandbox-reset": "Resiki",
+       "apisandbox-retry": "Jajal manèh",
+       "apisandbox-loading": "Ngamot katerangan kanggo modhul API \"$1\"...",
+       "apisandbox-load-error": "Ana masalah nalika ngamot katerangan modhul API \"$1\": $2",
+       "apisandbox-no-parameters": "Modhul API iki ora ana paramèteré.",
+       "apisandbox-helpurls": "Pranala pitulung",
        "apisandbox-examples": "Conto",
-       "apisandbox-results": "Asil",
+       "apisandbox-dynamic-parameters": "Paramèter tambahan",
+       "apisandbox-dynamic-parameters-add-label": "Tambah paramèter:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Jeneng paramèter",
+       "apisandbox-dynamic-error-exists": "Paramèter aran \"$1\" wis ana.",
+       "apisandbox-deprecated-parameters": "Paramèter lawas",
+       "apisandbox-fetch-token": "Isi otomatis tokené",
+       "apisandbox-submit-invalid-fields-title": "Sawenèh babagan ora trep",
+       "apisandbox-submit-invalid-fields-message": "Jajal dandanana babagan sing ditandhani lan jajalen manèh.",
+       "apisandbox-results": "Kasil",
+       "apisandbox-sending-request": "Ngirim panyuwuné API...",
+       "apisandbox-loading-results": "Nampa kasilé API...",
+       "apisandbox-results-error": "Ana masalah nalika ngamot wangsulan kanggo panyuwuné API: $1.",
+       "apisandbox-request-selectformat-label": "Tuduhaké dhata suwunan minangka:",
        "apisandbox-request-url-label": "URL dikarepaké:",
-       "apisandbox-request-time": "Suwéné panjalukan: $1",
+       "apisandbox-request-json-label": "Nyuwun JSON:",
+       "apisandbox-request-time": "Suwéné panyuwunan: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Dandanana tokené lan balènana numpuk",
+       "apisandbox-results-fixtoken-fail": "Wurung njupuk token \"$1\".",
+       "apisandbox-alert-page": "Babagan ing kaca iki ora trep.",
+       "apisandbox-alert-field": "Ajiné babagan iki ora trep.",
+       "apisandbox-continue": "Banjuraké",
+       "apisandbox-continue-clear": "Resiki",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} bakal [https://www.mediawiki.org/wiki/API:Query#Continuing_queries mbanjuraké] panyuwunané sing pungkasan; {{int:apisandbox-continue-clear}} bakal ngresiki paramèter sing gegayutan karo tumindak panglanjutané.",
+       "apisandbox-param-limit": "Isènana <kbd>max</kbd> saperlu nganggo watesan maksimum.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Kabèh mandala aran)",
+       "apisandbox-multivalue-all-values": "$1 (Kabèh aji)",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Golèk sumber buku",
        "booksources-search": "Golèk",
        "booksources-text": "Ing ngisor iki kapacak daftar pranala menyang situs liyané sing ngadol buku anyar lan bekas, lan mbok-menawa uga ndarbèni informasi sabanjuré ngenani buku-buku sing lagi panjenengan golèki:",
        "booksources-invalid-isbn": "ISBN sing diwènèhaké katonané ora valid; priksa kasalahan penyalinan saka sumber asli.",
+       "magiclink-tracking-rfc": "Kaca sing nganggo pranala ajaib RFC",
+       "magiclink-tracking-rfc-desc": "Kaca iki nganggo pranala ajaib RFC. Delengen [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] ngenani carané boyongan.",
+       "magiclink-tracking-pmid": "Kaca nganggo pranala ajaib PMID",
        "specialloguserlabel": "Panampil:",
        "speciallogtitlelabel": "Patujon (judhul utawa panganggo) :",
        "log": "Log",
+       "logeventslist-submit": "Tuduhaké",
        "all-logs-page": "Kabèh log publik",
        "alllogstext": "Gabungan tampilam kabèh log sing ana ing {{SITENAME}}.\nPanjenengan bisa mbatesi tampilan kanthi milih jinis log, jeneng panganggo (sènsitif aksara gedhé/cilik), utawa kaca sing magepokan (uga sènsitif aksara gedhé/cilik).",
        "logempty": "Ora ditemokaké èntri log sing pas.",
        "log-title-wildcard": "Golèk sesirah sing diwiwiti tulisan iki",
        "showhideselectedlogentries": "Tuduhalé/dhelikaké èntri log kapilih",
+       "log-edit-tags": "Besut tag saka isian log sing dipilih",
+       "checkbox-select": "Pilih: $1",
+       "checkbox-all": "Kabèh",
+       "checkbox-none": "Ora ana",
+       "checkbox-invert": "Balèkaké",
        "allpages": "Kabèh kaca",
        "nextpage": "Kaca sabanjuré ($1)",
        "prevpage": "Kaca sadurungé ($1)",
        "allpagesfrom": "Kaca-kaca kawiwitan kanthi:",
        "allpagesto": "Tampilaké kaca dipungkasi ing:",
        "allarticles": "Kabèh kaca",
-       "allinnamespace": "Kabeh kaca ($1 namespace)",
+       "allinnamespace": "Kabèh kaca (mandala aran $1)",
        "allpagessubmit": "Menyang",
        "allpagesprefix": "Kapacak kaca-kaca ingkang mawi ater-ater:",
        "allpagesbadtitle": "Irah-irahan (judhul) ingkang dipun-gunaaken boten sah utawi nganggé ater-ater (awalan) antar-basa utawi antar-wiki. Irah-irahan punika saged ugi nganggé setunggal aksara utawi luwih ingkang boten saged kagunaaken dados irah-irahan.",
        "allpages-hide-redirects": "Dhelikaké alihan",
        "cachedspecial-viewing-cached-ttl": "Sampéyan lagi ndelok vèrsi cadhangan saka kaca iki, sing bisa dadi lawasé wis $1.",
        "cachedspecial-viewing-cached-ts": "Sampéyan lagi ndelok vèrsi cadhangan saka kaca iki, sing bisa dadi ora padha karo kasunyatan.",
-       "cachedspecial-refresh-now": "Delok sing paling anyar.",
+       "cachedspecial-refresh-now": "Deleng sing paling anyar.",
        "categories": "Kategori",
+       "categories-submit": "Tuduhaké",
        "categoriespagetext": "{{PLURAL:$1|kategori ing ngisor iki ngandhut|kategori ing ngisor iki ngandhut}} kaca utawa media.\n[[Special:UnusedCategories|Kategori sing ora dianggo]] ora ditampilaké ing kéné.\nDeleng uga [[Special:WantedCategories|kategori sing diperlokaké]].",
-       "categoriesfrom": "Tampilaké kategori-kategori diwiwiti saka:",
+       "categoriesfrom": "Tuduhaké kategori-kategori sing diwiwiti:",
        "deletedcontributions": "Sumbangan panganggo sing dibusak",
        "deletedcontributions-title": "Sumbanganing panganggo sing dibusak",
        "sp-deletedcontributions-contribs": "sumbangan",
        "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-groups": "Tuduhaké panganggo sing mlebu golongan:",
+       "activeusers-excludegroups": "Aja lebokaké panganggo sing kalebu golongan:",
        "activeusers-noresult": "Panganggo ora ana.",
+       "activeusers-submit": "Tuduhaké panganggo aktif",
        "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>",
        "listgrouprights-rights": "Hak-hak",
        "listgrouprights-helppage": "Help:Hak-hak grup",
        "listgrouprights-members": "(daftar anggota)",
-       "listgrouprights-addgroup": "Bisa nambahaké {{PLURAL:$2|klompok|klompok}}: $1",
-       "listgrouprights-removegroup": "Bisa mbusak {{PLURAL:$2|klompok|klompok}}: $1",
+       "listgrouprights-addgroup": "Tambah {{PLURAL:$2|golongan}}: $1",
+       "listgrouprights-removegroup": "Busak {{PLURAL:$2|golongan}}: $1",
        "listgrouprights-addgroup-all": "Bisa nambahaké kabèh klompok",
        "listgrouprights-removegroup-all": "Bisa mbusak kabèh klompok",
        "listgrouprights-addgroup-self": "Nambahaké {{PLURAL:$2|klompok|klompok}} menyang akuné dhéwé: $1",
        "listgrouprights-removegroup-self": "Mbusak {{PLURAL:$2|klompok|klompok}} saka akuné dhéwé: $1",
        "listgrouprights-addgroup-self-all": "Nambahaké kabèh grup menyang akuné dhéwé",
        "listgrouprights-removegroup-self-all": "Mbusak kabèh klompok saka akuné dhéwé",
+       "listgrouprights-namespaceprotection-header": "Watesan mandala aran",
+       "listgrouprights-namespaceprotection-namespace": "Mandala aran",
+       "listgrouprights-namespaceprotection-restrictedto": "Hak sing ngidinaké panganggo mbesut",
+       "listgrants": "Idin",
+       "listgrants-grant": "Idin",
+       "listgrants-rights": "Hak",
+       "trackingcategories": "Kategori panglacak",
+       "trackingcategories-msg": "Kategori panglacak",
+       "trackingcategories-name": "Jeneng layang",
        "mailnologin": "Ora ana alamat layang e-mail",
-       "mailnologintext": "Panjenengan kudu [[Special:UserLogin|mlebu log]] lan kagungan alamat e-mail sing sah ing [[Special:Preferences|preféèrensi]] yèn kersa ngirim layang e-mail kanggo panganggo liya.",
+       "mailnologintext": "Panjenengan kudu [[Special:UserLogin|mlebu log]] lan duwé alamat layang-èl sing trep ing [[Special:Preferences|pilalané]] panjenengan kanggo nglayangi panganggo liyané.",
        "emailuser": "Kirim e-mail panganggo iki",
        "emailuser-title-target": "Kirim surel ke {{GENDER:$1|pengguna}} ini",
        "emailuser-title-notarget": "Kirimi panganggo iki layang e-mail",
        "watch": "Awasi",
        "watchthispage": "Periksa kaca iki",
        "unwatch": "Ora usah ngawasaké manèh",
-       "unwatchthispage": "Batalna olèhé ngawasi kaca iki",
+       "unwatchthispage": "Mandheg ngawasi",
        "notanarticle": "Dudu kaca artikel",
        "notvisiblerev": "Révisi wis dibusak",
        "watchlist-details": "Ngawasaké {{PLURAL:$1|$1 kaca|$1 kaca}}, ora kalebu kaca-kaca dhiskusi.",
        "wlheader-showupdated": "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
        "wlnote": "Ngisor iki {{PLURAL:$1|owahan pungkasan|'''$1''' owahan pungkasan}} {{PLURAL:$2|jam|'''$2''' jam}} kapungkur, per $3, $4.",
        "wlshowlast": "Tuduhna $1 jam $2 dina  pungkasan",
+       "watchlist-hide": "Dhelikaké",
+       "watchlist-submit": "Tuduhaké",
+       "wlshowtime": "Kala mangsa kanggo dituduhaké:",
+       "wlshowhideminor": "besutan cilik",
+       "wlshowhidebots": "bot",
+       "wlshowhideliu": "panganggo kadhaftar",
+       "wlshowhideanons": "panganggo anonim",
+       "wlshowhidepatr": "besutan sing diawasi",
+       "wlshowhidemine": "besutanku",
        "wlshowhidecategorization": "kategorisasi kaca",
        "watchlist-options": "Pilihaning pawawangan",
        "watching": "Ngawasi...",
        "delete-confirm": "Busak \"$1\"",
        "delete-legend": "Busak",
        "historywarning": "'''Pènget''': Kaca sing bakal panjenengan busak ana sajarahé kanthi $1 {{PLURAL:$1|révisi|révisi}}:",
+       "historyaction-submit": "Tuduhaké",
        "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",
        "delete-edit-reasonlist": "Besut jalaraning pambusak",
        "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.",
+       "deleteprotected": "Panjenengan ora bisa mbusak kaca iki amarga direksa.",
        "deleting-backlinks-warning": "'''Awas:''' Kaca liyane mungkin ana sing nautake ing kaca sing arep sampeyan busak.",
        "rollback": "Pulihaké besutan",
        "rollbacklink": "balèkaké",
        "rollback-success": "Suntingan dibalèkaké déning $1;\ndiowahi bali menyang vèrsi pungkasan déning $2.",
        "sessionfailure-title": "Sèsi gagal",
        "sessionfailure": "Katoné ana masalah karo sèsi log panjenengan; log panjenengan wis dibatalaké kanggo nyegah pambajakan. Mangga mencèt tombol \"back\" lan unggahaké manèh kaca sadurungé mlebu log, lan coba manèh.",
+       "changecontentmodel-title-label": "Sesirahé kaca",
+       "changecontentmodel-model-label": "Modhèl kontèn anyar",
+       "changecontentmodel-reason-label": "Alesan:",
+       "changecontentmodel-submit": "Ganti",
+       "changecontentmodel-success-title": "Modhèl kontèn wis diowahi",
+       "logentry-contentmodel-change-revertlink": "pulihaké",
+       "logentry-contentmodel-change-revert": "pulihaké",
        "protectlogpage": "Log reksa",
        "protectlogtext": "Ngisor iki daptar owahan saka panjagan kaca.\nDelok [[Special:ProtectedPages|daptar kaca sing dijaga]] kanggo daptar panjagan kaca paling anyar.",
        "protectedarticle": "ngreksa \"[[$1]]\"",
        "modifiedarticleprotection": "ngowahi tingkat pangreksan \"[[$1]]\"",
        "unprotectedarticle": "nyingkiraké panjagan saka \"[[$1]]\"",
-       "movedarticleprotection": "mindhahaké pangaturan protèksi saka \"[[$2]]\" menyang \"[[$1]]\"",
+       "movedarticleprotection": "ngalih setèlan rereksan saka \"[[$2]]\" nyang \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Ngreksa}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Ngowahi tataran rereksan}} tumrap \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Nyopot rereksan}} saka \"[[$1]]\"",
        "protect-title": "Ngowahi tingkatan pangreksan kanggo \"$1\"",
-       "protect-title-notallowed": "Delok undhaké panjagan saka \"$1\"",
+       "protect-title-notallowed": "Deleng tataran rereksan saka \"$1\"",
        "prot_1movedto2": "$1 dialihaké menyang $2",
        "protect-badnamespace-title": "Bilik jeneng sing ora bisa dijagani",
        "protect-badnamespace-text": "Kaca nèng bilik jeneng iki ora bisa dijagani.",
        "undeleteviewlink": "pirsani",
        "undeleteinvert": "Walik pilihan",
        "undeletecomment": "Alesan:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|révisi|révisi}} wis dibalèkaké",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|révisi|révisi}} lan $2 berkas dibalèkaké",
-       "undeletedfiles": "$1 {{PLURAL:$1|berkas|berkas}} dibalèkaké",
        "cannotundelete": "Olèhé mbatalaké pambusakan gagal;\n$1",
        "undeletedpage": "'''$1 bisa dibalèkaké'''\n\nDelengen [[Special:Log/delete|log pambusakan]] kanggo data pambusakan lan pambalèkan.",
        "undelete-header": "Mangga mirsani [[Special:Log/delete|log pambusakan]] kanggo daftar kaca sing lagi waé dibusak.",
        "undelete-error-long": "Ana kaluputan nalika mbatalaké pambusakan berkas:\n\n$1",
        "undelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi berkas \"<nowiki>$1</nowiki>\" sing wis kabusak ing $2 jam $3?",
        "undelete-show-file-submit": "Ya",
-       "namespace": "Jagat aran:",
+       "namespace": "Mandala aran:",
        "invert": "Balèkaké pilihan",
        "tooltip-invert": "Centhang kothak iki kanggo ndhelikaké owahan saka kaca-kaca nèng njero bilik jeneng kapilih (lan bilik jeneng kakait yèn dicenthang)",
-       "namespace_association": "Jagat aran magepokan",
+       "namespace_association": "Mandala aran magepokan",
        "tooltip-namespace_association": "Centhang kothak iki kanggo nglebokaké uga bilik jeneng gumenan utawa subyèk sing kakait karo bilik jeneng kapilih",
        "blanknamespace": "(Pokok)",
        "contributions": "Sumbangan {{GENDER:$1|panganggo}}",
        "sp-contributions-newbies": "Namung panganggo-panganggo anyar",
        "sp-contributions-newbies-sub": "Kanggo panganggo anyar",
        "sp-contributions-newbies-title": "Sumbanganing para panganggo anyar",
-       "sp-contributions-blocklog": "Log pemblokiran",
+       "sp-contributions-blocklog": "Log blokir",
        "sp-contributions-deleted": "sumbanganing panganggo sing dibusak",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "ipbreason": "Alesan:",
        "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",
+       "ipbcreateaccount": "Penggak panggawéné akun",
        "ipbemailban": "Penggak panganggo ngirim layang e-mail",
        "ipbenableautoblock": "Blokir alamat IP pungkasan sing dienggo déning pengguna iki sacara otomatis, lan kabèh alamat sabanjuré sing dicoba arep dienggo nyunting.",
        "ipbsubmit": "Kirimna",
        "reblock-logentry": "ngowah setèlan blokir tumrap [[$1]] kanthi wektu kadaluwarsa $2 $3",
        "blocklogtext": "Ing ngisor iki kapacak log pamblokiran lan panjabelan blokir panganggo.\nAlamat IP sing diblokir sacara otomatis ora ana ing daftar iki.\nMangga mirsani [[Special:BlockList|daftar panganggo sing diblokir]] kanggo daftar blokir pungkasan.",
        "unblocklogentry": "njabel blokir \"$1\"",
-       "block-log-flags-anononly": "namung panganggo anonim waé",
-       "block-log-flags-nocreate": "opsi nggawé akun utawa rékening dipatèni",
+       "block-log-flags-anononly": "namung panganggo anonim",
+       "block-log-flags-nocreate": "panggawéné akun dipatèni",
        "block-log-flags-noautoblock": "blokir otomatis dipatèni",
        "block-log-flags-noemail": "e-mail diblokir",
        "block-log-flags-nousertalk": "ora kena mbesut kaca guneman dhéwé",
        "lockedbyandtime": "(déning {{GENDER:$1|$1}} tanggal $2 wanci $3)",
        "move-page": "Ngalih $1",
        "move-page-legend": "Mindhah kaca",
-       "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.",
+       "movepagetext": "Formulir ing ngisor iki bakal ngganti jeneng kaca lan ngalihaké kabèh sujarahé nyang jeneng anyar.\nJeneng lawas bakal dadi kaca alihan marang jeneng anyar.\nPanjenengan bisa ndandani kaca alihan sing otomatis nggayut nyang kaca asliné.\nYèn ora, pesthèkaké yèn panjenengan wis mriksa ana-orané kaca alihan [[Special:DoubleRedirects|dhobel]] utawa [[Special:BrokenRedirects|rusak]].\nPanjenengan kudu tanggon saperlu mesthèkaké yèn pranalané menyang kaca sing samesthiné.\n\nÉling-élingen yèn kacané <strong>ora</strong> bakal dilih yèn jeneng sing dituju wis ana kacané, kajaba isiné kaca alihan sing ora ana sujarah besutané.\nIki ateges panjenengan bisa ngganti jeneng kaca bali nyang asliné manawa ana salah, lan panjenengan ora bisa ngamblegi kaca sing wis ana.\n\n<strong>Cathetan:</strong>\nTumindak iki bisa dadi owahan sing ora kinira lan gedhé mungguh ing kaca sing misuwur;\nmangga pesthèkaké dhisik yèn panjenengan mudheng temahané sadurungé mbacutaké.",
+       "movepagetext-noredirectfixer": "Formulir ing ngisor iki bakal ngganti jeneng kaca lan ngalihaké kabèh sujarahé nyang jeneng anyar.\nJeneng lawas bakal dadi kaca alihan marang jeneng anyar.\nPanjenengan kudu yakin yèn wis mriksa ana-orané kaca alihan [[Special:DoubleRedirects|dhobel]] utawa [[Special:BrokenRedirects|rusak]].\nPanjenengan kudu tanggon saperlu mesthèkaké yèn pranalané menyang kaca sing samesthiné.\n\nÉling-élingen yèn kacané <strong>ora</strong> bakal dilih yèn jeneng sing dituju wis ana kacané, kajaba isiné kaca alihan sing ora ana sujarah besutané.\nIki ateges panjenengan bisa ngganti jeneng kaca bali nyang asliné manawa ana salah, lan panjenengan ora bisa ngamblegi kaca sing wis ana.\n\n<strong>Cathetan:</strong>\nTumindak iki bisa dadi owahan sing ora kinira lan gedhé mungguh ing kaca sing misuwur;\nmangga pesthèkaké dhisik yèn panjenengan mudheng temahané sadurungé mbacutaké.",
        "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": "<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.",
+       "movenologintext": "Panjenengan kudu dadi panganggo sing kadhaftar lan wis [[Special:UserLogin|mlebu log]] yèn arep ngalihaké kaca.",
        "movenotallowed": "Panjenengan ora pareng ngalihaké kaca.",
        "movenotallowedfile": "Panjenengan ora duwé hak kanggo mindhahaké berkas.",
        "cant-move-user-page": "Panjenengan ora nduwèni hak aksès kanggo mindhahaké kaca panganggo (kapisah saka anak-kaca).",
        "export-download": "Simpen minangka berkas",
        "export-templates": "Kalebu cithakan-cithakan",
        "export-pagelinks": "Lebokaké kaca sing kagayut nyang jeroning:",
-       "allmessages": "Kabèh laporan sistém",
-       "allmessagesname": "Asma (jeneng)",
+       "export-manual": "Tambah kaca kanthi manual:",
+       "allmessages": "Layang sistem",
+       "allmessagesname": "Jeneng",
        "allmessagesdefault": "Tèks baku",
        "allmessagescurrent": "Tèks saiki",
-       "allmessagestext": "Iki dhaptar kabèh pesen saka sistem sing ana ing bilik jeneng MediaWiki.\nMangga pirsani [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] lan [https://translatewiki.net translatewiki.net] yèn panjenengan arep kontribusi ing lokalisasi generik MediaWiki.",
+       "allmessagestext": "Iki pratélan layang sistem sing ana ing mandala aran MediaWiki.\nMangga manjing [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Panglokalan MediaWiki] lan [https://translatewiki.net translatewiki.net] manawa panjenengan arep nyumbang ing panglokalan MediaWiki sing asli.",
        "allmessagesnotsupportedDB": "Kaca iki ora bisa dienggo amerga '''$wgUseDatabaseMessages''' dipatèni.",
        "allmessages-filter-legend": "Penyaring",
        "allmessages-filter": "Saring nganggo kahanan kustomisasi:",
        "allmessages-prefix": "Saring nganggo ater-ater:",
        "allmessages-language": "Basa:",
        "allmessages-filter-submit": "Tumuju menyang",
+       "allmessages-filter-translate": "Pertal",
        "thumbnail-more": "Gedhèkaké",
        "filemissing": "Barkas ilang",
        "thumbnail_error": "Kaluputan nalika nggawé gambar cilik (''thumbnail''): $1",
        "thumbnail-temp-create": "Ora bisa nggawé berkas gambar mini sawetara",
        "thumbnail-dest-create": "Ora bisa nyimpen bambar mini nèng papan patujon",
        "thumbnail_invalid_params": "Paramèter gambar cilik (''thumbnail'') ora absah",
+       "thumbnail_toobigimagearea": "Barkas kanthi alang-ujur luwih gedhé saka $1",
        "thumbnail_dest_directory": "Ora bisa nggawé dirèktori tujuan",
        "thumbnail_image-type": "Tipe gambar ora didhukung",
        "thumbnail_gd-library": "Konfigurasi pustaka GD ora pepak: fungsi $1 ilang",
        "import": "Impor kaca",
        "importinterwiki": "Impor saka wiki liya",
        "import-interwiki-text": "Pilih sawijining wiki lan irah-irahan kaca sing arep diimpor.\nTanggal révisi lan jeneng panyunting bakal dilestarèkaké.\nKabèh aktivitas impor transwiki bakal dilog ing [[Special:Log/import|log impor]].",
+       "import-interwiki-sourcewiki": "Wiki sumber:",
+       "import-interwiki-sourcepage": "Kaca sumber:",
        "import-interwiki-history": "Tuladen kabèh vèrsi lawas saka kaca iki",
        "import-interwiki-templates": "Katutna kabèh cithakan",
        "import-interwiki-submit": "Impor",
+       "import-mapping-default": "Impor nyang pernah gawan",
+       "import-mapping-namespace": "Impor nyang mandala aran:",
+       "import-mapping-subpage": "Impor minangka anak kaca iki:",
        "import-upload-filename": "Jeneng barkas:",
        "import-comment": "Komentar:",
        "importtext": "Mangga èkspor berkas saka wiki sumber nganggo [[Special:Export|prangkat èkspor]].\nSimpen nèng komputer Sampéyan lan unggaha nèng kéné.",
        "import-error-create": "Kaca \"$1\" ora diimpor amarga Sampéyan ora dililakaké nggawé kuwi.",
        "import-error-interwiki": "Kaca \"$1\" ora diimpor amarga jenengé dicadhangaké kango pranala njaba (interwiki).",
        "import-error-special": "Kaca \"$1\" ora diimpor amarga kuwi kalebu nèng bilik jeneng kusus sing ora nglilakaké anané kaca.",
-       "import-error-invalid": "Kaca \"$1\" ora diimpor amarga jenengé ora sah.",
+       "import-error-invalid": "Kaca \"$1\" ora diimpor amarga jenengé ora trep kanggo wiki iki.",
        "import-error-unserialize": "Revisi $2 saka kaca \"$1\" ora bisa diurutaké. Revisi iku dilapuraké murih nganggo gagrag isi $3 sing diurutaké minangka $4.",
        "import-options-wrong": "{{PLURAL:$2|Opsi|Opsi}} salah: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Kaca wod iki sesirahé ora sah.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|révisi|révisi}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|révisi}} saka $2",
        "javascripttest": "Panjajalan JavaScript",
+       "javascripttest-pagetext-unknownaction": "Tumindak ora dingertèni: $1",
        "javascripttest-qunit-intro": "Delok [dhokumèntasi panjajalan $1] nèng mediawiki.org.",
        "tooltip-pt-userpage": "Kaca {{GENDER:|panganggoning sampéyan}}",
        "tooltip-pt-anonuserpage": "Kaca panganggo IP panjenengan",
        "tooltip-pt-preferences": "Pilih-pilihaning {{GENDER:|sampéyan}}",
        "tooltip-pt-watchlist": "Pratélaning kaca sing sampéyan awasi owah-owahané",
        "tooltip-pt-mycontris": "Pratélaning sumbanganing {{GENDER:|sampéyan}}",
-       "tooltip-pt-login": "Sampéyan prayogané mlebu masiya ora kudu",
-       "tooltip-pt-logout": "Metu",
-       "tooltip-pt-createaccount": "Sampéyan prayogané gawé akun lan mlebu masiya ora kudu",
-       "tooltip-ca-talk": "Pirembug ngenani kaca isi",
+       "tooltip-pt-anoncontribs": "Pratélan besutané alamat IP iki",
+       "tooltip-pt-login": "Panjenengan prayogané mlebu log, sanadyan ora kudu",
+       "tooltip-pt-login-private": "Panjenengan kudu mlebu log supaya bisa nganggo wiki iki",
+       "tooltip-pt-logout": "Metu log",
+       "tooltip-pt-createaccount": "Panjenengan prayogané nggawé akun lan mlebu log, sanadyan ora kudu",
+       "tooltip-ca-talk": "Rembugan ngenani kaca isi",
        "tooltip-ca-edit": "Besut kaca iki",
        "tooltip-ca-addsection": "Miwiti pérangan anyar",
        "tooltip-ca-viewsource": "Kaca iki direksa. \nSampéyan bisa ndeleng sumberé",
-       "tooltip-ca-history": "Owahaning kaca iki sadurungé",
+       "tooltip-ca-history": "Owahan sadurungé saka kaca iki",
        "tooltip-ca-protect": "Reksa kaca iki",
        "tooltip-ca-unprotect": "Ganti panjagan kaca iki",
        "tooltip-ca-delete": "Busak kaca iki",
        "tooltip-ca-move": "Lih kaca iki",
        "tooltip-ca-watch": "Tambahaké kaca iki nyang pawawangan sapéyan",
        "tooltip-ca-unwatch": "Busak kaca iki saka pawawanganing sampéyan",
-       "tooltip-search": "Golèk nyang {{SITENAME}}",
+       "tooltip-search": "Golèk ing {{SITENAME}}",
        "tooltip-search-go": "Jujug kaca asesirah persis mangkéné yèn ana",
        "tooltip-search-fulltext": "Golèk kaca isi tulisan kaya mangkéné",
        "tooltip-p-logo": "Menyang tepas",
        "tooltip-n-mainpage": "Menyang tepas",
        "tooltip-n-mainpage-description": "Menyang tepas",
-       "tooltip-n-portal": "Bab proyèk, apa sing bisa sampéyan garap, ana ing endi saprelu golèk apa-apa",
-       "tooltip-n-currentevents": "Temokaké katerangan latar wuri saka kadadéan saiki",
+       "tooltip-n-portal": "Ngenani proyèk, apa sing bisa panjenengan garap, lang ing endi saprelu golèk apa-apa",
+       "tooltip-n-currentevents": "Golèk katerangan latar wuri saka kadadéan saiki",
        "tooltip-n-recentchanges": "Pratélaning owah-owahan pungkasan sajeroning wiki.",
-       "tooltip-n-randompage": "Mot waton kaca",
+       "tooltip-n-randompage": "Mot sembarang kaca",
        "tooltip-n-help": "Papan kanggo golèk weruh",
-       "tooltip-t-whatlinkshere": "Pratélaning kabèh kaca wiki sing nggayut mréné",
+       "tooltip-t-whatlinkshere": "Pratélané kabèh kaca wiki sing nggayut mréné",
        "tooltip-t-recentchangeslinked": "Owah-owahan anyar saka kaca-kaca sing nggayut kaca iki",
        "tooltip-feed-rss": "''RSS feed'' kanggo kaca iki",
        "tooltip-feed-atom": "''Atom feed'' kanggo kaca iki",
        "tooltip-t-contributions": "Pratélaning sumbangan {{GENDER:$1|panganggo iki}}",
-       "tooltip-t-emailuser": "Kirimna e-mail menyang panganggo iki",
+       "tooltip-t-emailuser": "Kirimi layang-èl nyang {{GENDER:$1|panganggo iki}}",
+       "tooltip-t-info": "Katerangan liyané ngenani kaca iki",
        "tooltip-t-upload": "Unggah barkas",
        "tooltip-t-specialpages": "Pratélaning kabèh kaca mirunggan",
        "tooltip-t-print": "Vèrsi cithak kaca iki",
        "tooltip-ca-nstab-template": "Deleng cithakan",
        "tooltip-ca-nstab-help": "Mirsani kaca pitulung",
        "tooltip-ca-nstab-category": "Deleng kaca kategori",
-       "tooltip-minoredit": "Tandhani iki minangka besutan cilik",
+       "tooltip-minoredit": "Tandhani iki yèn besutan cilik",
        "tooltip-save": "Simpen owah-owahaning sampéyan",
+       "tooltip-publish": "Babar owahané panjenengan",
        "tooltip-preview": "Pratuduhing owah-owahaning sampéyan. Anggoa cara iki sadurungé nyimpen.",
        "tooltip-diff": "Tuduhaké owah-owahan endi sing sampéyan gawé tumrap tulisan iki",
        "tooltip-compareselectedversions": "Delengen prabédan antara rong vèrsi kaca iki sing dipilih.",
        "anonymous": "{{PLURAL:$1|Panganggo|panganggo}} anon ing {{SITENAME}}.",
        "siteuser": "Panganggo {{SITENAME}} $1",
        "anonuser": "Panganggo anonim {{SITENAME}} $1",
-       "lastmodifiedatby": "Kaca iki pungkasan diowahi  $2, $1 déning $3.",
+       "lastmodifiedatby": "Kaca iki pungkasan diowahi pukul $2, $1 déning $3.",
        "othercontribs": "Adhedhasar karyané $1.",
        "others": "liya-liyané",
-       "siteusers": "{{PLURAL:$2|Panganggo|Panganggo-panganggo}} {{SITENAME}} $1",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|Panganggo}}|Panganggo}} {{SITENAME}} $1",
        "anonusers": "{{PLURAL:$2|Panganggo|Panganggo}} anonim {{SITENAME}} $1",
        "creditspage": "Informasi para panulis kaca",
        "nocredits": "Ora ana informasi ngenani para panulis ing kaca iki.",
        "pageinfo-length": "Panjang halaman (dalam bita)",
        "pageinfo-article-id": "ID kaca",
        "pageinfo-language": "Basaning isining kaca",
+       "pageinfo-language-change": "owah",
        "pageinfo-content-model": "Model isi kaca",
+       "pageinfo-content-model-change": "owah",
        "pageinfo-robot-policy": "Diindeks karo robot",
        "pageinfo-robot-index": "Entuk",
        "pageinfo-robot-noindex": "Ora entuk",
        "pageinfo-watchers": "Cacahé pangawas kaca",
+       "pageinfo-visiting-watchers": "Cacahé pandeleng kaca sing nekani besutan anyar",
        "pageinfo-few-watchers": "Kurang seka $1 {{PLURAL:$1|wong tilik|wong tilik}}",
        "pageinfo-redirects-name": "Jumlah pangalihan menyang kaca iki",
        "pageinfo-subpages-name": "Subhalaman halaman ini",
        "markedaspatrollederror": "Ora bisa awèh tandha wis dipatroli",
        "markedaspatrollederrortext": "Panjenengan kudu nentokaké sawijining révisi kanggo ditandhani minangka sing dipatroli.",
        "markedaspatrollederror-noautopatrol": "Panjenengan ora pareng nandhani suntingan panjenengan dhéwé minangka dipatroli.",
-       "markedaspatrollednotify": "Perubahan $1 telah dipatroli.",
+       "markedaspatrollednotify": "Owahan $1 wis dipatroli.",
        "markedaspatrollederrornotify": "Penanda patroli gagal dibuat.",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Iki log revisi sing wis dipatroli.",
        "years": "{{PLURAL:$1|$1 taun|$1 taun}}",
        "ago": "$1 kapungkur",
        "just-now": "baru saja",
-       "hours-ago": "$1 {{PLURAL:$1|jam|jam}} kapungkur",
-       "minutes-ago": "$1 {{PLURAL:$1|menit|menit}} kapungkur",
-       "seconds-ago": "$1 {{PLURAL:$1|detik|detik}} kapungkur",
+       "hours-ago": "$1 jam kapungkur",
+       "minutes-ago": "$1 menit kapungkur",
+       "seconds-ago": "$1 dhetik kapungkur",
        "monday-at": "Senin jam $1",
        "tuesday-at": "Selasa jam $1",
        "wednesday-at": "Rabu jam $1",
        "exif-primarychromaticities": "Kromatisitas werna primer",
        "exif-ycbcrcoefficients": "Koèfisièn matriks transformasi papan werna",
        "exif-referenceblackwhite": "Wiji réferènsi pasangan ireng putih",
-       "exif-datetime": "Tanggal lan tabuh owahing barkas",
+       "exif-datetime": "Tanggal lan tabuh owahé barkas",
        "exif-imagedescription": "Sesirah gambar",
        "exif-make": "Produsèn kamera",
        "exif-model": "Modhèl kaméra",
        "exif-attributionurl": "Nalika nganggo manèh karya iki, mangga ubungaké nèng",
        "exif-preferredattributionname": "Nalika nganggo manèh karya iki, mangga awèhi krèdit",
        "exif-pngfilecomment": "Tanggepan berkas PNG",
-       "exif-disclaimer": "Pamaidonan",
+       "exif-disclaimer": "Sélakan",
        "exif-contentwarning": "Pèngetan kontèn",
        "exif-giffilecomment": "Tanggepan berkas GIF",
        "exif-intellectualgenre": "Jinis barang",
        "confirmemail_body": "Sawijining wong, mbokmenawa panjenengan dhéwé, saka alamat IP $1, wis ndaftaraké akun \"$2\" mawa alamat e-mail iki ing {{SITENAME}}. Bukaka pranala iki ing panjlajah wèb panjenengan.\n\n$3\n\nYèn panjenengan *ora tau* ndaftar akun iki, tutna pranala ing ngisor iki kanggo mbatalaké konfirmasi alamat e-mail:\n\n$5\n\nKonfirmasi iki bakal kadaluwarsa ing $4.",
        "confirmemail_body_changed": "Sawijining wong, mbokmenawa panjenengan dhéwé, saka alamat IP $1, wis ndaftaraké akun \"$2\" mawa alamat e-mail iki ing {{SITENAME}}. Bukaka pranala iki ing panjlajah wèb panjenengan.\n\n$3\n\nYèn panjenengan *ora tau* ndaftar akun iki, tutna pranala ing ngisor iki kanggo mbatalaké konfirmasi alamat e-mail:\n\n$5\n\nKonfirmasi iki bakal kadaluwarsa ing $4.",
        "confirmemail_body_set": "Sawijining wong, mbokmenawa panjenengan dhéwé, saka alamat IP $1, wis ndaftaraké akun \"$2\" mawa alamat e-mail iki ing {{SITENAME}}. Bukaka pranala iki ing panjlajah wèb panjenengan.\n\n$3\n\nYèn panjenengan *ora tau* ndaftar akun iki, tutna pranala ing ngisor iki kanggo mbatalaké konfirmasi alamat e-mail:\n\n$5\n\nKonfirmasi iki bakal kadaluwarsa ing $4.",
-       "confirmemail_invalidated": "Pandhedhesan (konfirmasi) alamat e-mail batal",
-       "invalidateemail": "Batalna pandhedhesan (konfirmasi) e-mail",
+       "confirmemail_invalidated": "Konfirmasi alamat layang-èl wurung",
+       "invalidateemail": "Wurung konfirmasi layang-èl",
        "scarytranscludedisabled": "[Transklusi cithakan interwiki dipatèni]",
        "scarytranscludefailed": "[Olèhé njupuk cithakan $1 gagal]",
        "scarytranscludefailed-httpstatus": "[Pengambilan templat $1 gagal: HTTP $2]",
        "scarytranscludetoolong": "[URL-é kedawan]",
-       "deletedwhileediting": "'''Pènget''': Kaca iki wis kabusak sawisé panjenengan miwiti nyunting!",
+       "deletedwhileediting": "<strong>Pélik:</strong> Kaca iki wis dibusak kawit pisanan panjenengan mbesut!",
        "confirmrecreate": "Panganggo [[User:$1|$1]] ([[User talk:$1|Wicara]]) wis mbusak kaca iki nalika panjenengan miwiti panyuntingan mawa alesan:\n: ''$2''\nMangga didhedhes (dikonfirmasi) menawa panjenengan kersa nggawé ulang kaca iki.",
        "confirmrecreate-noreason": "Panganggo [[User:$1|$1]] ([[User talk:$1|wicara]]) mbusak kaca iki sakbaré Sampéyan lekas nyunting. Mangga pesthèkaké yèn Sampéyan pancen pingin tenan nggawé manèh kaca iki.",
        "recreate": "Gawé ulang",
        "duplicate-defaultsort": "Pènget: Kunci pilih asal (''Default sort key'') \"$2\" nggantèkaké kunci pilih asal sadurungé \"$1\".",
        "version": "Versi",
        "version-extensions": "Èkstènsi sing wis diinstalasi",
-       "version-skins": "Kulit sing disetèl",
+       "version-skins": "Ules sing dipasang",
        "version-specialpages": "Kaca astaméwa (kaca kusus)",
        "version-parserhooks": "Canthèlan parser",
        "version-variables": "Variabel",
        "htmlform-int-toohigh": "Aji sing panjenengan lebokaké kegedhèn ngluwihi aji maksimum $1",
        "htmlform-required": "Nilé iki dibutuhaké",
        "htmlform-submit": "Kirim",
-       "htmlform-reset": "Batalna pangowahan",
+       "htmlform-reset": "Balèkaké owahan",
        "htmlform-selectorother-other": "Liya",
        "htmlform-no": "Ora",
        "htmlform-yes": "Iya",
        "logentry-rights-autopromote": "$1 otomatis {{GENDER:$2|dipromosikne}} saka $4 nèng $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngunggah}} $3",
        "rightsnone": "(ora ana)",
-       "revdelete-summary": "tingkesan besutan",
        "feedback-adding": "Nambahaké lebon saran nèng kaca...",
        "feedback-bugcheck": "Apik! Pesthèké kuwi dudu sawijining [$1 bug sing dingertèni].",
        "feedback-bugnew": "Aku wis mriksa. Kandakaké bug anyar",
        "feedback-bugornote": "Yèn Sampéyan siap njelasaké masalah tèhnis kanthi rinci mangga [$1 laporaké bug].\nUtawa, Sampéyan bisa nganggo pormulir gampang ngisor. Tanggepan Sampéyan bakal ditambahaké nèng kaca \"[$3 $2]\", bebarengan karo jeneng panganggo Sampéyan lan pramban sing Sampéyan anggo.",
-       "feedback-cancel": "Batal",
+       "feedback-cancel": "Wurung",
        "feedback-close": "Rampung",
        "feedback-error1": "Kasalahan: Asil ora dikenal saka API",
        "feedback-error2": "Cacad: Gagal mbesut",
        "feedback-subject": "Jejer:",
        "feedback-submit": "Kirim",
        "feedback-thanks": "Nuwun! Lebon saran Sampéyan wis dipasang nèng kacané \"[$2 $1]\".",
-       "searchsuggest-search": "Golèk {{SITENAME}}",
+       "searchsuggest-search": "Golèk ing {{SITENAME}}",
        "searchsuggest-containing": "ngemu...",
        "api-error-badtoken": "Kasalahan njero: Token èlèk.",
        "api-error-emptypage": "Nggawé kaca kosong anyar ora dilikaké.",
index f61112d..8561bef 100644 (file)
@@ -27,7 +27,8 @@
                        "Gi777ga",
                        "Matma Rex",
                        "Sopopruidze",
-                       "Dixtosa"
+                       "Dixtosa",
+                       "OpusDEI"
                ]
        },
        "tog-underline": "ბმულების ხაზგასმა:",
@@ -72,7 +73,7 @@
        "tog-showhiddencats": "დამალული კატეგორიების ჩვენება",
        "tog-norollbackdiff": "ცვლილების გაუქმებისას არ მანახო ცვლილებათა განსხვავება",
        "tog-useeditwarning": "გამაფრთხილე, როდესაც დავტოვებ რედაქტირებად გვერდს, დაუმახსოვრებელი ცვლილებებით",
-       "tog-prefershttps": "á\83£á\83¡á\83\90á\83¤á\83 á\83\97á\83®á\83\9d á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\98á\83¡ á\83\9bá\83£á\83\93á\83\90á\83\9b გამოყენება ავტორიზაციის შემდეგ",
+       "tog-prefershttps": "á\83\9bá\83£á\83\93á\83\90á\83\9b á\83£á\83¡á\83\90á\83¤á\83 á\83\97á\83®á\83\9d á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\98á\83¡ გამოყენება ავტორიზაციის შემდეგ",
        "underline-always": "მუდამ",
        "underline-never": "არასდროს",
        "underline-default": "დამოკიდებული მომხმარებელზე ან ბრაუზერის არჩევანზე",
        "category-file-count-limited": "შემდეგი {{PLURAL:$1|ფაილი|$1 ფაილები}} ამ კატეგორიაშია.",
        "listingcontinuesabbrev": "გაგრძ.",
        "index-category": "გვერდების ინდექსაცია",
-       "noindex-category": "არ არსებობს ინდექსირებული გვერდები",
+       "noindex-category": "არინდექსირებული გვერდები",
        "broken-file-category": "გვერდები ფაილების არასწორი ბმულებით",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "category-header-numerals": "$1–$2",
        "newwindow": "(ახალ ფანჯარაში)",
        "cancel": "გაუქმება",
        "moredotdotdot": "ვრცლად...",
-       "morenotlisted": "á\83\94á\83¡ á\83\90á\83 á\83\90á\83¡á\83 á\83£á\83\9aá\83\98 á\83¡á\83\98á\83\90á\83\90.",
+       "morenotlisted": "á\83\94á\83¡ á\83¡á\83\98á\83\90 á\83¨á\83\94á\83\98á\83«á\83\9aá\83\94á\83\91á\83\90 á\83\98á\83§á\83\9dá\83¡ á\83\90á\83 á\83\90á\83¡á\83 á\83£á\83\9aá\83\98.",
        "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": "ფაილის გვერდის ნახვა",
        "redirectedfrom": "(გადმომისამართდა $1-დან)",
        "redirectpagesub": "გადამისამართება გვერდზე",
        "redirectto": "გადამისამართება:",
-       "lastmodifiedat": "á\83\94á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83\91á\83\9dá\83\9aá\83\9dá\83¡ á\83\92á\83\90á\83\9cá\83\90á\83®á\83\9aá\83\93á\83\90 $2, $1.",
+       "lastmodifiedat": "á\83\94á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83\91á\83\9dá\83\9aá\83\9dá\83¡ á\83\93á\83\90á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\93á\83\90: $2, $1.",
        "viewcount": "ეს გვერდი შემოწმდა {{PLURAL:$1|ერთხელ|$1-ჯერ}}.",
        "protectedpage": "დაბლოკილი გვერდი",
        "jumpto": "გადასვლა:",
        "viewyourtext": "თქვენ შეგიძლიათ იხილოთ და დააკოპიროთ  <strong>თქვენი რედაქტირებების</strong> საწყისი ტექსტი ამ გვერდზე:",
        "protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
        "editinginterface": "'''ყურადღება:''' თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც. \nიმისათვის, რომ დაამატოთ ან შეცვალოთ თარგმანები ყველა ვიკიში, გთხოვთ, გამოიყენოთ მედიავიკის ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
-       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
+       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკების ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "ეს გვერდი რედაქტირებისგან დაცულია, რადგან იგი ჩართულია შემდეგ {{PLURAL:$1|გვერდში, რომლის|გვერდებში, რომელთა}} დასაცავადაც ჩართულია პარამეტრი \"იერარქიული\":\n$2",
        "namespaceprotected": "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
        "customcssprotected": "თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.",
        "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": "საგარეო მონაცემთა ბაზაში აუტენტიფიკაციის შეცდომაა, ან თქვენ არ გაქვთ საკმარისი უფლებები საგარეო ანგარიშში ცვლილებების შესატანად.",
        "login": "შესვლა",
        "login-security": "დაადასტურეთ იდენტიფიკაცია",
        "nav-login-createaccount": "შესვლა / რეგისტრაცია",
-       "userlogin": "შესვლა/ანგარიშის შექმნა",
-       "userloginnocreate": "შესვლა",
        "logout": "გასვლა",
        "userlogout": "გასვლა",
        "notloggedin": "შესული არ ხართ",
        "userlogin-noaccount": "არ გაქვთ ანგარიში?",
        "userlogin-joinproject": "შეუერთდით პროექტს {{SITENAME}}",
-       "nologin": "ჯერ არ ხართ რეგისტრირებული? '''$1'''.",
-       "nologinlink": "გახსენით ანგარიში",
        "createaccount": "გახსენი ანგარიში",
-       "gotaccount": "უკვე რეგისტრირებული ხართ? '''$1'''",
-       "gotaccountlink": "შესვლა",
-       "userlogin-resetlink": "ავტორიზაციის მონაცემები დაგავიწყდათ?",
        "userlogin-resetpassword-link": "დაგავიწყდათ პაროლი?",
        "userlogin-helplink2": "დახმარება:შესვლა",
        "userlogin-loggedin": "თქვენ უკვე შეხვედით როგორც {{GENDER:$1|$1}}.\nგამოიყენეთ ფორმა ქვემოთ, რათა შეხვიდეთ სხვა ანგარიშიდან.",
        "createaccountmail": "გამოიყენეთ შემთხვევითობის მეთოდით შერჩეული დროებითი პაროლი და გააგზავნეთ მითითებულ ელ.ფოსტის მისამართზე",
        "createaccountmail-help": "შეიძლება იქნას გამოყენებული სხვისი პირონების ანგარიშის შექმნისთვის მისი პაროლის ცოდნის გარეშე",
        "createacct-realname": "ნამდვილი სახელი (არააუცილებელი)",
-       "createaccountreason": "მიზეზი:",
        "createacct-reason": "მიზეზი",
        "createacct-reason-ph": "რატომ ქმნით ახალ ანგარიშს?",
        "createacct-reason-help": "მესიჯი რომელიც გამოჩნდება ანგარიშის შექმის აღრიცხვის ჟურნალში",
        "summary": "რეზიუმე:",
        "subject": "თემა:",
        "minoredit": "მცირე რედაქტირება",
-       "watchthis": "á\83£á\83\97á\83\95á\83\90á\83\9aá\83\97á\83\95á\83\90á\83\9aá\83\94 ამ გვერდს",
+       "watchthis": "á\83\97á\83\95á\83\90á\83\9aá\83\98 á\83\9bá\83\98á\83\90á\83\93á\83\94á\83\95á\83\9cá\83\94á\83\97 ამ გვერდს",
        "savearticle": "გვერდის შენახვა",
        "savechanges": "ცვლილებების შენახვა",
        "publishpage": "გვერდის გამოქვეყნება",
-       "publishchanges": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\92á\83\90á\83\9bá\83\9dá\83¥á\83\95á\83\94á\83§á\83\9cá\83\94á\83\91ა",
+       "publishchanges": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83\9cá\83\90á\83®á\83\95ა",
        "preview": "წინასწარი გადახედვა",
        "showpreview": "წინასწარი გადახედვის ჩვენება",
        "showdiff": "ცვლილებების ჩვენება",
-       "blankarticle": "გაფრთხილება: გვერდი, რომელსაც ქმნით, ცარიელია. თუკი კვლავ დააჭერთ ღილაკს \"{{int:savearticle}}\", გვერდი შეიქმნება შემცვლელობის გარეშე.",
+       "blankarticle": "გაფრთხილება: გვერდი, რომელსაც ქმნით, ცარიელია. თუკი კვლავ დააჭერთ ღილაკს \"$1\", გვერდი შეიქმნება შემცვლელობის გარეშე.",
        "anoneditwarning": "<strong>გაფრთხილება:</strong> თქვენ არ ხართ ავტორიზირებული. თქვენი IP მისამართი საჯაროდ ხილული იქნება, თუკი განახორციელებთ რედაქტირებას. თუ თქვენ გაივლით <strong>[$1 ავტორიზაციას]</strong> ან <strong>[$2 შექმნით ანგარიშს]</strong>, სხვა უპირატესობებთან ერთად, თქვენი რედაქტირებები დაუკავშირდება თქვენს მომხმარებლის სახელს.",
        "anonpreviewwarning": "''თქვენ არ შესულხართ სისტემაში. თქვენი IP მისამართი შეინახება გვერდის ისტორიაში. ''",
        "missingsummary": "'''შეხსენება:''' თქვენ არ მიგითითებიათ რედაქტირების რეზიუმე.\nთუ ისევ დააწკაპუნებთ შენახვაზე, თქვენი რედაქტირება რეზიუმეს გარეშე დამახსოვრდება.",
-       "selfredirect": "გაფრთხილება: თქვენ გადამისამართებას იმავე გვერდზე ქმნით. შესაძლოა, თქვენ გადამისამართებისთვის აირჩიეთ არასწორი სამიზნე გვერდი ან არედაქტირებთ არასამიზნე გვერდს. \n\nთუ თქვენ კიდევ ერთხელ დააჭერთ ღილაკს \"{{int:savearticle}}\", გადამისამართება შეიქმნება.",
+       "selfredirect": "გაფრთხილება: თქვენ გადამისამართებას იმავე გვერდზე ქმნით. შესაძლოა, თქვენ გადამისამართებისთვის აირჩიეთ არასწორი სამიზნე გვერდი ან არედაქტირებთ არასამიზნე გვერდს. \n\nთუ თქვენ კიდევ ერთხელ დააჭერთ ღილაკს \"$1\", გადამისამართება შეიქმნება.",
        "missingcommenttext": "გთხოვთ კომენტარი შეიყვანოთ ქვემოთ.",
-       "missingcommentheader": "<strong>შეხსენება:</strong> თქვენ ამ კომენტარისთვის თემა არ მიგითითებიათ. თუ შენახვაზე \"{{int:savearticle}}\" დააწკაპუნებთ, თქვენი ცვლილება მის გარეშე იქნება შენახული.",
+       "missingcommentheader": "<strong>შეხსენება:</strong> თქვენ ამ კომენტარისთვის თემა არ მიგითითებიათ. თუ შენახვაზე \"$1\" დააწკაპუნებთ, თქვენი ცვლილება მის გარეშე იქნება შენახული.",
        "summary-preview": "რეზიუმეს წინასწარი გადახედვა:",
        "subject-preview": "თემის გადახედვა:",
        "previewerrortext": "თქვენი ცვლილებების წინასწარი გადახედვის მცდელობის დროს მოხდა შეცდომა",
        "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|ანგარიშის კონფიგურაციაში]] ან თუ დაბლოკვის შედეგად გაქვთ ამ ფუნქციის გამოყენების ნებართვა ჩამორთმეული.\nთქვენი ამჟამინდელი IP მისამართია $3, ხოლო ბლოკის იდენტიფიკატორი #$5.\nგთხოვთ, მიუთითოთ ყველა ზემოთხსენებული მონაცემი თქვენს კორესპონდენციაში.",
        "autoblockedtext": "თქვენი IP მისამართი ავტომატურად დაიბლოკა, ვინაიდან მას სხვა მომხმარებელი იყენებდა, რომელიც დაბლოკა $1-მა.\nსაბაბად მოყვანილი იყო შემდეგი:\n\n:''$2''\n\n* ბლოკის დაწყების თარიღი: $8\n* ბლოკის ვადის გასვლა: $6\n*დაიბლოკა $7\n\nშეგიძლიათ დაუკავშირდეთ $10ს ან რომელიმე სხვა\n[[{{MediaWiki:Grouppage-sysop}}|ადმინისტრატორს]] ამ ბლოკის განსახილველად.\n\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": "გვერდების დარედაქტირებამდე უნდა დაადასტუროთ თქვენი ელფოსტის მისამართი. გთხოვთ [[Special:Preferences|მომხმარებლის პარამეტრებში]] მიუთითოთ და დაამოწმოთ ელფოსტის მისამართი.",
        "editingsection": "რედაქტირება - $1 (სექცია)",
        "editingcomment": "რედაქტირება: $1 (ახალი სექცია)",
        "editconflict": "რედაქტირების კონფლიქტი: $1",
-       "explainconflict": "სხვა მომხმარებელმა შეცვალა ეს გვერდი მას შემდეგ რაც თქვენ დაიწყეთ მისი რედატირება.\nზედა ტექსტური ველი შეიცავს გვერდის შიგთავსს მისი ამჟამინდელი სახით.\nთქვენი ცვლილებები ნაჩვენებია ქვედა ტექსტურ ველში.\nთქვენ მოგიწევთ თქვენი ცვლილებების შერწყმა არსებულ ტექსტთან.\n'''მხოლოდ''' ზედა ველში არსებული ტექსტი იქნება შენახული, როდესაც „{{int:savearticle}}“ დააჭერთ.",
+       "explainconflict": "სხვა მომხმარებელმა შეცვალა ეს გვერდი მას შემდეგ რაც თქვენ დაიწყეთ მისი რედატირება.\nზედა ტექსტური ველი შეიცავს გვერდის შიგთავსს მისი ამჟამინდელი სახით.\nთქვენი ცვლილებები ნაჩვენებია ქვედა ტექსტურ ველში.\nთქვენ მოგიწევთ თქვენი ცვლილებების შერწყმა არსებულ ტექსტთან.\n'''მხოლოდ''' ზედა ველში არსებული ტექსტი იქნება შენახული, როდესაც „$1“ დააჭერთ.",
        "yourtext": "თქვენი ტექსტი",
        "storedversion": "შენახული ვერსია",
        "nonunicodebrowser": "'''გაფრთხილება: თქვენი ბრაუზერი უნიკოდთან თავსებადი არ არის. ჩვენ ვცდილობთ ამ პრობლემის გადაჭრას, რათა თქვენ შეძლოთ უსაფრთხოდ შეიტანოთ ცვლილებები გვერდებზე: არა-ASCII ნიშნები რედაქტირების ფანჯარაში გამოჩნდება როგორც ჰექსადეციმალური კოდები.'''",
        "contentmodelediterror": "არ შეგიძლიათ ამ ვერსიის რედაქტირება, რადგან მისი კონტენტის მოდელი არის <code>$1</code>, რაც განსხვავდება გვერდის მიმდინარე კონტენტის მოედლისაგან <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''გაფრთხილება: თქვენ ხელახლა ქმნით გვერდს, რომელიც ადრე წაიშალა.'''\n\nგთხოვთ დაფიქრდეთ, მისაღები არის თუ არა ამ გვერდის რედაქტირების გაგრძელება.\nინფორმაციისთვის ქვემოთ მოყვანილია ამ გვერდის წაშლის ისტორია:",
        "moveddeleted-notice": "ეს გვერდი წაიშალა. ინფორმაციის მისაღებად ქვემოთ წარმოდგენილია შესაბამისი ჩანაწერები წაშლისა და გადარქმევის ჟურნალებიდან.",
-       "moveddeleted-notice-recent": "á\83\91á\83\9dá\83\93á\83\98á\83¨á\83\98, á\83\94á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83¬á\83\90á\83¨á\83\9aá\83\98á\83\9aá\83\98á\83\90 (á\83\91á\83\9dá\83\9aá\83\9d 24 á\83¡á\83\90á\83\90á\83\97á\83\98á\83¡ á\83\92á\83\90á\83\9cá\83\9bá\83\90á\83\95á\83\9aá\83\9dá\83\91á\83\90á\83¨á\83\98).\ná\83¬á\83\90á\83¨á\83\9aá\83\98á\83¡á\83\90 á\83\93á\83\90 á\83\92á\83\90á\83\93á\83\90á\83¢á\83\90á\83\9cá\83\98á\83¡ á\83\9fá\83£á\83 á\83\9cá\83\90á\83\9aá\83\98 á\83¥á\83\9bá\83\94á\83\9cოთ არის მოცემული.",
+       "moveddeleted-notice-recent": "á\83¡á\83\90á\83\9bá\83¬á\83£á\83®á\83\90á\83 á\83\9dá\83\93, á\83\94á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83¬á\83\90á\83¨á\83\9aá\83\98á\83\9aá\83\98á\83\90 (á\83\91á\83\9dá\83\9aá\83\9d 24 á\83¡á\83\90á\83\90á\83\97á\83\98á\83¡ á\83\92á\83\90á\83\9cá\83\9bá\83\90á\83\95á\83\9aá\83\9dá\83\91á\83\90á\83¨á\83\98).\ná\83¬á\83\90á\83¨á\83\9aá\83\98á\83¡á\83\90 á\83\93á\83\90 á\83\92á\83\90á\83\93á\83\90á\83¢á\83\90á\83\9cá\83\98á\83¡ á\83\9fá\83£á\83 á\83\9cá\83\90á\83\9aá\83\98 á\83¥á\83\95á\83\94á\83\9bოთ არის მოცემული.",
        "log-fulllog": "ყველა ჟურნალის ხილვა",
        "edit-hook-aborted": "შესწორება გაუქმებულია გადამჭერით.\nდამატებითი ახსნა არ ჩაწერილა.",
        "edit-gone-missing": "გვერდის განახლეა შეუძლებელია.\nშესაძლოა, იგი წაიშალა.",
        "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": "ვიკიტექსტი",
        "content-json-empty-object": "ცარიელი ობიექტი",
        "content-json-empty-array": "ცარიელი ტაბლო",
        "deprecated-self-close-category": "გვერდები, რომლებიც იყენებენ არავალიდურ თვითდახურვად HTML ტეგებს",
+       "deprecated-self-close-category-desc": "გვერდი შეიცვას არასწორ თვითდახურვად HTML-ტეგებს, როგორიცაა<code>&lt;b/></code> ან <code>&lt;span/></code>. ამ ტეგების ქცევა სულ მალე შეიცვლება HTML5-ის სპეციფიკის გათვალისწინებით, ამიტომ მათი გამოყენება ვიკიტექსტში არ არის მიზანშეწონილი.",
        "duplicate-args-warning": "<strong>გაფრთხილება:</strong> [[:$1]] იძახებს [[:$2]]-ის \"$3\" პარამეტრის ერთზე მეტ მნიშვნელობას. აისახება მხოლოდ ბოლოს გამოყენებული მნიშვნელობა.",
        "duplicate-args-category": "გვერდები, რომლებიც იყენებენ დუბლიკატ არგუმენტებს თარგების გამოძახებისას",
        "duplicate-args-category-desc": "გვერდები, რომლებიც იყენებენ დუბლიკატ არგუმენტებს თარგების გამოძახებისას, როგორებიც არის <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ან <code><nowiki>{{foo|bar|1=bar}}</nowiki></code>.",
        "post-expand-template-argument-warning": "'''ფრთხილად:''' ეს გვერდი შეიცავს თარგის მინიმუმ ერთ მნიშვნელობას, რომელიც ნამეტანად გრძელია გახსნისთვის.\nამგვარი მნიშვნელობები გამოიტოვება.",
        "post-expand-template-argument-category": "გვერდები, რომლებიც შეიცავენ თარგების გამოტოვებულ მნიშვნელობებს",
        "parser-template-loop-warning": "აღმოჩენილია ლუპი თარგ: [[$1]]-ში",
+       "template-loop-category": "გვერდები შაბლონური მარყუჟებით",
+       "template-loop-category-desc": "ეს გვერდი შეიცვას შაბლონურ მარყუჟს, ანუ შაბლონი რეკურსიულად იძახებს თავის თავს.",
        "parser-template-recursion-depth-warning": "თარგის რეკურსიის სიღრმე აემატება დაშვებულს ($1)",
        "language-converter-depth-warning": "ენათა გადამუშავების კონვერციის ლიმიტი ამოწურულია ($1)",
        "node-count-exceeded-category": "გვერდები, რომელშიც გადამეტებულია კვანძების რაოდენობა",
        "page_first": "პირველი",
        "page_last": "ბოლო",
        "histlegend": "ვერსიების შედარება: აირჩიეთ სასურველი ვერსიები რადიო-რგოლების მონიშვნით და დააწკაპუნეთ შედარების ღილაკზე.<br />\nლეგენდა: '''({{int:cur}})''' = სხვაობა მიმდინარე ვერსიასთან, '''({{int:last}})''' = სხვაობა წინა ვერსიასთან, '''{{int:minoreditletter}}''' = მცირე შესწორება.",
-       "history-fieldset-title": "á\83\93á\83\90á\83\97á\83\95á\83\90á\83\9aá\83\98á\83\94á\83 á\83\94á\83\91á\83\98á\83¡ á\83\98á\83¡á\83¢á\83\9dá\83 á\83\98ა",
-       "history-show-deleted": "მხოლოდ წაშლილი",
+       "history-fieldset-title": "á\83\95á\83\94á\83 á\83¡á\83\98á\83\94á\83\91á\83\98á\83¡ á\83«á\83\98á\83\94á\83\91ა",
+       "history-show-deleted": "მხოლოდ წაშლილი ვერსიები",
        "histfirst": "უძველესი",
        "histlast": "უახლესი",
        "historysize": "({{PLURAL:$1|$1 ბაიტი|$1 ბაიტი}})",
        "search-file-match": "(ემთხვევა ფაილის შინაარსს)",
        "search-suggest": "ხომ არ იგულისხმეთ: $1?",
        "search-rewritten": "ნაჩვენებია შედეგები $1-სთვის. ძებნა $2-ის ნაცვლად.",
-       "search-interwiki-caption": "á\83\93á\83\9dá\83\91á\83\98á\83\9aá\83\98 á\83\9eá\83 á\83\9dá\83\94á\83¥á\83¢á\83\94á\83\91á\83\98",
+       "search-interwiki-caption": "á\83¨á\83\94á\83\93á\83\94á\83\92á\83\94á\83\91á\83\98 á\83\93á\83\9dá\83\91á\83\98á\83\9aá\83\98 á\83\9eá\83 á\83\9dá\83\94á\83¥á\83¢á\83\94á\83\91á\83\98á\83\93á\83\90á\83\9c",
        "search-interwiki-default": "შედეგები $1-დან:",
        "search-interwiki-more": "(გაგრძელება)",
+       "search-interwiki-more-results": "მეტი შედეგი",
        "search-relatedarticle": "დაკავშირებული",
        "searchrelated": "მიბმული",
        "searchall": "ყველა",
        "search-external": "გარე ძიება",
        "searchdisabled": "{{SITENAME}}ში ძებნა გაუქმებულია. თქვენ შეგიძლიათ დროის შუალედით Google-ით ძებნა. მიაქციეთ ყურადღება, რომ {{SITENAME}}ში შესაძლებელია მათი ინდექსები აქტუალური არ არის.",
        "search-error": "ძიებისას მოხდა შეცდომა: $1",
+       "search-warning": "ძიებისას გაიცა გაფრხილება: $1",
        "preferences": "კონფიგურაცია",
        "mypreferences": "კონფიგურაცია",
        "prefs-edits": "რედაქციების რაოდენობა:",
        "prefs-help-recentchangescount": "შეიცავს ახალ შესწორებებს, გვერდების ისტორიებს, ჟურნალებს.",
        "prefs-help-watchlist-token2": "ეს არის საიდუმლო გასაღები თქვენი კონტროლის სიის ვებ-არხისთვის. ნებისმიერს, ვინც იცის ის, შეუძლია წაიკითხოს თქვენი კონტროლის სია, ამიტომ არ გაუზიაროთ იგი სხვებს. [[Special:ResetTokens|თქვენ შეგიძლიათ ჩამოყაროთ ის]].",
        "savedprefs": "თქვენ მიერ შერჩეული პარამეტრები დამახსოვრებულია.",
-       "savedrights": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ {{GENDER:$1|$1}} á\83£á\83¤á\83\9aá\83\94á\83\91ები შენახულია",
+       "savedrights": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ {{GENDER:$1|$1}} á\83¯á\83\92á\83£á\83¤ები შენახულია",
        "timezonelegend": "სასაათო სარტყელი:",
        "localtime": "ადგილობრივი დრო:",
        "timezoneuseserverdefault": "გამოიყენე ნაგულისხმევი პარამეტრები ($1)",
        "username": "{{GENDER:$1|მომხმარებლის სახელი}}:",
        "prefs-memberingroups": "{{PLURAL:$1|ჯგუფის|ჯგუფების}} {{GENDER:$2|წევრი}}:",
        "prefs-memberingroups-type": "$1",
-       "prefs-registration": "რეგისტრაციის თარიღი",
+       "group-membership-link-with-expiry": "$1 ($2-მდე)",
+       "prefs-registration": "რეგისტრაციის დრო:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "ნამდვილი სახელი:",
        "yourlanguage": "ენა:",
        "prefs-help-prefershttps": "ამ კონფიგურაციის არჩევა შედეგს გამოიღებს შემდგომი ავტორიზაციის შედმეგ.",
        "prefswarning-warning": "თქვენ შეიტანეთ ცვლილება თქვენ პარამეტრებში, რომელიც ჯერ კიდევ არ არის შენახული. თუ თქვენ დატოვებთ ამ გვერდს და არ დააჭერთ \"$1\"-ს, პარამეტრები არ იქნება განახლებული.",
        "prefs-tabs-navigation-hint": "რჩევა: თქვენ შეგიძლიათ გამოიყენოთ ისრის კლავიშები მარცხნივ ან მარჯვნივ ჩანართებსა და ჩანართბის სიას შორის არსებული გადასვლებისათვის",
-       "userrights": "მომხმარებელთა უფლებების მართვა",
-       "userrights-lookup-user": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\97á\83\90 á\83¯á\83\92á\83£á\83¤á\83\94á\83\91á\83\98á\83¡ á\83\9bá\83\90á\83 á\83\97ვა",
-       "userrights-user-editname": "á\83¨á\83\94á\83\98á\83¢ანეთ მომხმარებლის სახელი:",
-       "editusergroup": "{{GENDER:$1|მომხმარებელთა}} ჯგუფების რედაქტირება",
+       "userrights": "მომხმარებელთა უფლებები",
+       "userrights-lookup-user": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ á\83\90á\83 á\83©á\83\94ვა",
+       "userrights-user-editname": "á\83¨á\83\94á\83\98á\83§á\83\95ანეთ მომხმარებლის სახელი:",
+       "editusergroup": "მომხმარებელთა ჯგუფების ჩატვირთვა",
        "editinguser": "უფლებების შეცვლა {{GENDER:$1|მომხმარებლისთვის}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "დაარედაქტირეთ მომხმარებელთა ჯგუფები",
+       "viewinguserrights": "{{GENDER:$1|მომხმარებლის}} უფლებების ხილვა <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "{{GENDER:$1|მომხმარებელთა}} ჯგუფების რედაქტირება",
+       "userrights-viewusergroup": "{{GENDER:$1|მომხმარებლის}} ჯგუფების ხილვა",
        "saveusergroups": "{{GENDER:$1|მომხმარებელთა}} ჯგუფების შენახვა",
        "userrights-groupsmember": "ჯგუფის წევრი:",
        "userrights-groupsmember-auto": "ნაგულისხმევი წევრი:",
        "userrights-changeable-col": "ჯგუფები, რომლებიც შეგიძლიათ შეცვალოთ",
        "userrights-unchangeable-col": "ჯგუფები, რომლებიც არ შეგიძლიათ შეცვალოთ",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "ვადის გასვლის თარიღია $1",
+       "userrights-expiry-none": "უვადოდ",
+       "userrights-expiry": "ვადა:",
+       "userrights-expiry-existing": "დასრულების დრო: $3, $2",
+       "userrights-expiry-othertime": "სხვა დრო:",
+       "userrights-expiry-options": "1 დღე:1 day,1 კვირა:1 week,1 თვე:1 month,3 თვე:3 months,6 თვე:6 months,1 წელი:1 year",
+       "userrights-invalid-expiry": "ვადის გასვლის თარიღი ჯგუფისთვის „$1“ არასწორია.",
+       "userrights-expiry-in-past": "ვადის გასვლის თარიღი ჯგუფისთვის „$1“ მითითებულია წარსულში.",
+       "userrights-cannot-shorten-expiry": "თქვენ ვერ გადაიტანთ უფრო ადრეულ თარიღზე წევრობის ამოწურვის ვადას ჯგუფში „$1“. ვადის უფრო ადრეულ თარიღზე გადაწევის უფლება აქვთ მხოლოდ იმ მომხმარებლებს, რომელთაც აქვთ ამ ჯგუფის დამატების და წაშლის უფლება.",
        "userrights-conflict": "მომხმარებელთა უფლებების კონფლიქტი! გთხოვთ ხელმეორედ შეინახოთ თქვენი ცვლილებები.",
        "group": "ჯგუფი:",
        "group-user": "მომხმარებლები",
        "right-editsemiprotected": "გვერდების რედაქტირება რომლებიც დაცულია როგორც „{{int:protect-level-autoconfirmed}}“",
        "right-editcontentmodel": "გვერდის კონტენტური მოდელის რედაქტირება",
        "right-editinterface": "მომხმარებლის ინტერფეისის შეცვლა",
-       "right-editusercssjs": "სხვა მომხმარებლების CSS- и JS- ფაილების შესწორება",
        "right-editusercss": "სხვა მომხმარებლების CSS- ფაილების შესწორება",
        "right-edituserjs": "სხვა მომხმარებლების JS- ფაილების შესწორება",
        "right-editmyusercss": "თქვენი საკუთარი CSS-ფაილების რედაქტირება",
        "grant-group-high-volume": "მაღალი სიხშირის მოქმედების შესრულება",
        "grant-group-customization": "კონფიგურაცია",
        "grant-group-administration": "ადმინისტრაციული მოქმედებების შესრულება",
+       "grant-group-private-information": "თქვენს პირად მონაცემებთან წვდომა",
        "grant-group-other": "სხვადასხვა ქმედებები",
        "grant-blockusers": "მომხმარებლების დაბლოკვა და ბლოკის მოხსნა",
        "grant-createaccount": "ანგარიშების შექმნა",
        "action-writeapi": "API-ს გამოყენება რედაქტირებისთვის",
        "action-delete": "ამ გვერდის წაშლა",
        "action-deleterevision": "გვერდის ამ ვერსიის წაშლა",
+       "action-deletelogentry": "ჩანაწერთა ჟურნალის წაშლა",
        "action-deletedhistory": "ამ გვერდის წაშლილი ისტორიის ხილვა",
+       "action-deletedtext": "წაშლილი ვერსიის ტექსტის ხილვა",
        "action-browsearchive": "წაშლილი გვერდების ძიება",
        "action-undelete": "ამ გვერდის აღდგენა",
-       "action-suppressrevision": "á\83\92á\83\95á\83\94á\83 á\83\93á\83\98á\83¡ á\83\90á\83\9b á\83\93á\83\90á\83¤á\83\90á\83 á\83£á\83\9aá\83\98 á\83\95á\83\94á\83 á\83¡á\83\98á\83\98á\83¡ á\83\9cá\83\90á\83®á\83\95á\83\90 á\83\93á\83\90 á\83\90á\83¦á\83\93á\83\92á\83\94á\83\9cá\83\90",
+       "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": "(<em>±123</em>)",
        "recentchanges-submit": "ჩვენება",
+       "rcfilters-activefilters": "აქტიური ფილტრები",
+       "rcfilters-quickfilters": "სწრაფი ბმულები",
+       "rcfilters-quickfilters-placeholder-title": "შენახული ბმულები არ არის ჯერ",
+       "rcfilters-quickfilters-placeholder-description": "ფილტრის პარამეტრების შენახვისთვის და მოგვიანებით მათი გამოყენებისთვის, დააჭირეთ ჩანართის ხატულას აქტიური ფილტრის არეში, ქვემოთ.",
+       "rcfilters-savedqueries-defaultlabel": "შენახული ფილტრები",
+       "rcfilters-savedqueries-rename": "გადარქმევა",
+       "rcfilters-savedqueries-setdefault": "ნაგულისხმევად დამახსოვრება",
+       "rcfilters-savedqueries-unsetdefault": "ამოღება ნაგულისხმევიდან",
+       "rcfilters-savedqueries-remove": "წაშლა",
+       "rcfilters-savedqueries-new-name-label": "სახელი",
+       "rcfilters-savedqueries-apply-label": "სწრაფი ბმულის შექმნა",
+       "rcfilters-savedqueries-cancel-label": "გაუქმება",
+       "rcfilters-savedqueries-add-new-title": "ფილტრის შენახვა როგორც სწრაფი ბმული",
+       "rcfilters-restore-default-filters": "ნაგულისხმევი ფილტრების აღდგენა",
+       "rcfilters-clear-all-filters": "ყველა ფილტრის გაწმენდა",
+       "rcfilters-search-placeholder": "ფილტრის ბოლო ცვლილებები (დაათვალიერეთ ან დაიწყეთ შეყვანა)",
+       "rcfilters-invalid-filter": "არასწორი ფილტრი",
+       "rcfilters-empty-filter": "აქტიური ფილტრები არ არის. აისახება ყველა წვლილი.",
+       "rcfilters-filterlist-title": "ფილტრები",
+       "rcfilters-filterlist-whatsthis": "ეს რა არის?",
+       "rcfilters-filterlist-feedbacklink": "შეტყობინების დატოვება ახალი (ბეტა) ფილტრების შესახებ",
+       "rcfilters-highlightbutton-title": "შედეგების მონიშვნა",
+       "rcfilters-highlightmenu-title": "ფერის არჩევა",
+       "rcfilters-highlightmenu-help": "აირჩიეთ ფერი, რათა მონიშნოთ ეს თვისება",
+       "rcfilters-filterlist-noresults": "ფილტრები ვერ მოძებნა",
+       "rcfilters-noresults-conflict": "შედეგი ვერ მოიძებნა ძიების კრიტერიუმების კონფლიქტის გამო",
+       "rcfilters-state-message-subset": "ამ ფილტრს არ აქვს ეფექტი, რადგან მისი შედეგები ჩართულია შემდეგ უფრო ფართო {{PLURAL:$2|ფილტრში|ფილტრებში}} (გარჩევისთვის სცადეთ მისი განათება): $1",
+       "rcfilters-state-message-fullcoverage": "ყველა ფილტრის არჩევა ჯგუფში იგივეა რაც არაფრის არჩევა, ამიტომ ამ ფილტრს არ აქვს არანაირი ეფექტი. ჯგუფი შეიცავს: $1",
+       "rcfilters-filtergroup-registration": "მომხმარებლის რეგისტრაცია",
+       "rcfilters-filter-registered-label": "რეგისტრირებულები",
+       "rcfilters-filter-registered-description": "შესული რედაქტორები.",
+       "rcfilters-filter-unregistered-label": "არარეგისტრირებულები",
+       "rcfilters-filter-unregistered-description": "რედაქტორები, რომლებიც არ შესულან სისტემაში.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "ეს ფილტრი კონფლიქტშია გამოცდილების შემდეგ {{PLURAL:$2|ფილტრთან|ფილტრებთან}}, {{PLURAL:$2|რომელიც ეძებს|რომლებიც ეძებენ}} მხოლოდ რეგისტრირებულ მომხმარებლებს: $1",
+       "rcfilters-filtergroup-authorship": "ავტორობის წვლილი",
+       "rcfilters-filter-editsbyself-label": "თქვენი საკუთარი ცვლილებები",
+       "rcfilters-filter-editsbyself-description": "თქვენი წვლილი.",
+       "rcfilters-filter-editsbyother-label": "სხვა მომხმარებლების ცვლილებები",
+       "rcfilters-filter-editsbyother-description": "ყველა ცვლილება, გარდა საკუთარისა.",
+       "rcfilters-filtergroup-userExpLevel": "გამოცდილების დონე (მხოლოდ დარეგისტრირებული მომხმარებლებისათვის)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "გამოცდილების ფილტრები ეძებენ მხოლოდ რეგისტრირებულ მომხმარებლებს, ამიტომ ეს ფილტრი კონფლიქტშია „დაურეგისტრირებელთა“ ფილტრთან.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "„დაურეგისტრირებელთა“ ფილტრი კონფლიქტშია ერთ ან რამდენიმე გამოცდილების ფილტრთან, რომელიც ეძებს მხოლოდ რეგისტრირებულ მომხმარებლებს. კონფლიქტური ფილტრები აღნიშნულია აქტიური ფილტრების არეში, ზემოთ.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "ახალბედები",
+       "rcfilters-filter-user-experience-level-newcomer-description": "10-ზე ნაკლები ცვლილება და აქტიურობის 4 დღე.",
+       "rcfilters-filter-user-experience-level-learner-label": "მოსწავლეები",
+       "rcfilters-filter-user-experience-level-learner-description": "მეტი რედაქტირება, ვიდრე „ახალბედებს“, მაგრამ ნაკლები, ვიდრე „გამოცდილ მომხმარებლებს“.",
+       "rcfilters-filter-user-experience-level-experienced-label": "გამოცდილი მომხმარებლები",
+       "rcfilters-filter-user-experience-level-experienced-description": "30 დღეზე მეტი აქტიურობა და 500 რედაქტირება.",
+       "rcfilters-filtergroup-automated": "ავტომატიზირებული წვლილი",
+       "rcfilters-filter-bots-label": "ბოტი",
+       "rcfilters-filter-bots-description": "ავტომატიზირებული ხელსაწყოებით შესრულებული რედაქტირებები.",
+       "rcfilters-filter-humans-label": "რედაქტორი (არა ბოტით)",
+       "rcfilters-filter-humans-description": "რედაქტორების მიერ შესრულებული რედაქტირებები.",
+       "rcfilters-filtergroup-reviewstatus": "შემოწმების სტატუსი",
+       "rcfilters-filter-patrolled-label": "პატრულირებულია",
+       "rcfilters-filter-patrolled-description": "ცვლილებები მონიშნულია მატრულირებულად.",
+       "rcfilters-filter-unpatrolled-label": "გაუპატრულირებული",
+       "rcfilters-filter-unpatrolled-description": "ცვლილებები არ არის მონიშნული პატრულირებულად",
+       "rcfilters-filtergroup-significance": "მნიშვნელობა",
+       "rcfilters-filter-minor-label": "მცირე რედაქტირებები",
+       "rcfilters-filter-minor-description": "რედაქტირებები, რომლებიც ავტორმა მონიშნა როგორც მცირე.",
+       "rcfilters-filter-major-label": "ჩვეულებრივი რედაქტირებები",
+       "rcfilters-filter-major-description": "რედაქტირებები არ არის აღნიშნული როგორც მცირე.",
+       "rcfilters-filtergroup-watchlist": "გვერდები კონტროლის სიიდან",
+       "rcfilters-filter-watchlist-watched-label": "კონტროლის სიაშია",
+       "rcfilters-filter-watchlist-watched-description": "კონტროლის სიაში მყოფი გვერდების ცვლილებები",
+       "rcfilters-filter-watchlist-watchednew-label": "ახალი ცვლილებები კონტროლის სიაში",
+       "rcfilters-filter-watchlist-watchednew-description": "კონტროლის სიის გვერდების ცვლილებები, რომლებიც თქვენ არ გინახავთ მათი განხორცილებიდან.",
+       "rcfilters-filter-watchlist-notwatched-label": "არ არის კონტროლის სიაში",
+       "rcfilters-filter-watchlist-notwatched-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",
        "rcshowhidecategorization": "გვერდის კატეგორიზაციის $1",
        "rcshowhidecategorization-show": "ჩვენება",
        "rcshowhidecategorization-hide": "დამალვა",
-       "rclinks": "ბოლო $1 ცვლილების ჩვენება უკანასკნელი $2 დღის მანძილზე<br />$3",
+       "rclinks": "ბოლო $1 ცვლილების ჩვენება უკანასკნელი $2 დღის მანძილზე",
        "diff": "განსხ.",
        "hist": "ისტ.",
        "hide": "დამალვა",
        "upload-dialog-disabled": "ფაილის ატვირთვა ამ დიალოგური ფანჯრით გათიშულია ამ ვიკიზე.",
        "upload-dialog-title": "ფაილის ატვირთვა",
        "upload-dialog-button-cancel": "გაუქმება",
+       "upload-dialog-button-back": "უკან",
        "upload-dialog-button-done": "შესრულდა",
        "upload-dialog-button-save": "შენახვა",
        "upload-dialog-button-upload": "ატვირთვა",
        "querypage-disabled": "ეს სპეცგვერდი გამორთულია წარმადობის გასაზრდელად.",
        "apihelp": "API დახმარება",
        "apihelp-no-such-module": "მოდული „$1“ ვერ მოიძებნა.",
-       "apisandbox": "API-ს სავარჯიშო",
+       "apisandbox": "API-á\83\98á\83¡ á\83¡á\83\90á\83\95á\83\90á\83 á\83¯á\83\98á\83¨á\83\9d",
        "apisandbox-jsonly": "API-ის სავარჯიშოს გამოსაყენებლად საჭიროა JavaScript.",
        "apisandbox-api-disabled": "API ამ საიტზე გამორთულია.",
        "apisandbox-intro": "გამოიყენეთ ეს გვერდი, თუ გსურთ მოსინჯოთ <strong>MediaWiki web service API</strong>.\nიხილეთ [[mw:API:Main page|API დოკუმენტაცია]] სხვა დეტალებისათვის.\nმაგალითი: [https://www.mediawiki.org/wiki/API#A_simple_example მიიღეთ მთავარი გვერდის შინაარსი]. შეგიძლიათ ნახოთ სხვა მაგალითებიც.\n\nგაითვალისწინეთ, რომ თუმცა ეს სავარჯიშოა, თქვენმა მოქმედებამ შესაძლოა შეცვალოს ვიკის გვერდი.",
        "apisandbox-results-fixtoken-fail": "ვერ მოხერხდა $1 ტოკენის მოძიება.",
        "apisandbox-alert-page": "ველები ამ გვერდზე არ არის ვალიდური",
        "apisandbox-alert-field": "ამ ველის მნიშვნელობა არ არის ვალიდური",
+       "apisandbox-continue": "გაგრძელება",
+       "apisandbox-continue-clear": "გასუფთავება",
+       "apisandbox-multivalue-all-namespaces": "$1 (ყველა სახელთა სივრცე)",
+       "apisandbox-multivalue-all-values": "$1 (ყველა მნიშვნელობა)",
        "booksources": "წიგნის წყაროები",
        "booksources-search-legend": "წიგნის წყაროს ძებნა",
        "booksources-isbn": "ISBN:",
        "trackingcategories-disabled": "კატეგორია გამორთულია",
        "mailnologin": "გამგზავნი მისამართი არ არის მითითებული.",
        "mailnologintext": "თქვენ უნდა [[Special:UserLogin|წარადგენილი იყოთ სისტემისადმი]] და გქონდეთ წესიერი ელექტრონული ფოსტის მისამართი თქვენს [[Special:Preferences|კონფიგურაციაში]] იმისთვის, რომ გაუგზავნოთ წერილების სხვა მომხმარებლებს.",
-       "emailuser": "á\83\92á\83\90á\83£á\83\92á\83\96á\83\90á\83\95á\83\9cá\83\94á\83\97 á\83\98á\83\9bá\83\94á\83\98á\83\9aá\83\98 á\83\90á\83\9b á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83¡",
-       "emailuser-title-target": "ელ. ფოსტის მიწერა {{GENDER:$1|მომხმარებელთან}}",
+       "emailuser": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡á\83\97á\83\95á\83\98á\83¡ á\83\98\83\9bá\83\94á\83\98á\83\9aá\83\98á\83¡ á\83\9bá\83\98á\83¬á\83\94á\83 á\83\90",
+       "emailuser-title-target": "{{GENDER:$1|მომხმარებლისთვის}} ელ.ფოსტის მიწერა",
        "emailuser-title-notarget": "ელ. ფოსტის გაგზავნა მომხმარებელთან",
        "emailpagetext": "თუ ამ მომხმარებელმა თავის პარამეტრებში ელ. ფოსტის მოქმედი მისამართი მიუთითა, ქვემოთ მოყვანილი ფორმის შევსებისას შეგიძლიათ {{GENDER:$1|მისთვის}} შეტყობინების გაგზავნა. ელ. ფოსტის მისამართი, რომელიც [[Special:Preferences|თქვენს პარამეტრებში]] მიუთითეთ, დაფიქსირდება „გამომგზავნის“ ველში, რათა ადრესატმა პასუხის გაცემა შეძლოს.",
        "defemailsubject": "ელ-ფოსტა საიტის {{SITENAME}} მომხმარებლისგან „$1“",
        "enotif_body_intro_restored": "$PAGEEDITDATE {{gender:$2|მომხმარებელმა}} $2 აღადგინა გვერდი პროექტიდან „{{SITENAME}}“ სახელწოდებით „$1“, მიმდინარე ვერსია იხილიეთ ბმულზე: $3",
        "enotif_body_intro_changed": "$PAGEEDITDATE {{gender:$2|მომხმარებელმა}} $2 შეცვალა გვერდი პროექტიდან „{{SITENAME}}“ სახელწოდებით „$1“, მიმდინარე ვერსია იხილიეთ ბმულზე: $3",
        "enotif_lastvisited": "იხ. $1 ყველა ცვლილებისთვის თქვენი ბოლო შემოსვლის შემდეგ.",
-       "enotif_lastdiff": "á\83\98á\83®á\83\98á\83\9aá\83\94á\83\97 $1 á\83\90á\83\9b á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83¡á\83\90á\83\9cá\83\90á\83®á\83\90á\83\95á\83\90á\83\93.",
+       "enotif_lastdiff": "á\83\90á\83\9b á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83¡á\83\90á\83\9cá\83\90á\83®á\83\90á\83\95á\83\90á\83\93, á\83\98á\83®á\83\98á\83\9aá\83\94á\83\97 $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\t\t\t {{SITENAME}} შეტყობინებათა სისტემა\n\n--\nშეტყობინების პარამეტრების ცვლილება\n{{canonicalurl:{{#special:Preferences}}}}\n\nთქვენი კონტროლის სიის პარამეტრების ცვლილება\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nგვერდების ამოშლა თქვენი კონტროლის სიიდან\n$UNWATCHURL\n\nდამატებითი ინფორმაცია\n$HELPPAGE",
        "created": "შექმნილია",
        "modifiedarticleprotection": "შეცვლილია დაცვის დონე გვერდისთვის „[[$1]]“",
        "unprotectedarticle": "„[[$1]]“-დან დაცვა მოხსნილია",
        "movedarticleprotection": "დაცვის პარამეტრების გადატანა გვერდიდან „[[$2]]“ გვერდზე „[[$1]]“",
+       "protectedarticle-comment": "მომხმარებელმა {{GENDER:$2|დაიცვა}} „[[$1]]“",
+       "modifiedarticleprotection-comment": "მომხმარებელმა {{GENDER:$2|შეცვალა დაცვის დონე}} „[[$1]]“-ზე",
+       "unprotectedarticle-comment": "მომხარებელმა {{GENDER:$2|მოხსნა დაცვა}} „[[$1]]“-დან",
        "protect-title": "დაცვის დონის შეცვლა გვერდისთვის „$1“",
        "protect-title-notallowed": "დაცვის დონის ხილვა გვერდისთვის „$1“",
        "prot_1movedto2": "[[$1]] გადატანილია გვერდზე [[$2]]",
        "undeleteviewlink": "იხილე",
        "undeleteinvert": "გააუქმეთ გამოყოფა",
        "undeletecomment": "მიზეზი:",
-       "undeletedrevisions": "$1 ვერსია აღდგენილია",
-       "undeletedrevisions-files": "$1 ვერსია და $2 ფაილი აღდგენილია",
-       "undeletedfiles": "$1 ფაილი აღდგენილია",
        "cannotundelete": "ზოგიერთი ან ყველა წაშლის გაუქმება ვერ განხორციელდა:\n$1",
        "undeletedpage": "'''$1 აღდგენილია'''\n\nუკანასკნელი წაშლილთა და აღდგენის სია შეგიძლიათ ნახოთ [[Special:Log/delete|წაშლილთა სიაში]].",
        "undelete-header": "ბოლოს წაშლილი გვერდების სიის ნახვა შეიძლება [[Special:Log/delete|წაშლათა ჟურნალში]].",
        "sp-contributions-uploads": "ატვირთვები",
        "sp-contributions-logs": "ჟურნალები",
        "sp-contributions-talk": "განხილვა",
-       "sp-contributions-userrights": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\97á\83\90 á\83£á\83¤á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ მართვა",
+       "sp-contributions-userrights": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\9aá\83\98á\83¡ {{GENDER:$1|á\83£á\83¤á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡}} მართვა",
        "sp-contributions-blocked-notice": "ეს მომხმარებელი ამჟამად დაბლოკილია. ქვემოთ მოყვანილია ამონაწერი წაშლათა ჟურნალიდან:",
        "sp-contributions-blocked-notice-anon": "ეს მომხმარებელი ამჟამად დაბლოკილია.\nქვემოთ მოყვანილია ამონაწერი წაშლათა ჟურნალიდან:",
        "sp-contributions-search": "წვლილის ძიება",
        "unblocked-id": "ბლოკი $1 მოიხსნა",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] განიბლოკა.",
        "blocklist": "დაბლოკილი მომხმარებლები",
+       "autoblocklist": "ავტობლოკირება",
+       "autoblocklist-submit": "ძიება",
+       "autoblocklist-legend": "ავტობლოკირებების სია",
+       "autoblocklist-localblocks": "ადგილობრივი {{PLURAL:$1|ავტობლოკი|ავტობლოკირებები}}",
+       "autoblocklist-empty": "ავტობლოკირებების სია ცარიელია.",
+       "autoblocklist-otherblocks": "სხვა {{PLURAL:$1|ავტობლოკი|ავტობლოკირებები}}",
        "ipblocklist": "დაბლოკილი მომხმარებლები",
        "ipblocklist-legend": "დაბლოკილი მომხმარებლის პოვნა",
        "blocklist-userblocks": "დამალე ანგარიშის ბლოკირებები",
        "anonymous": "{{SITENAME}}-ის ანონიმური {{PLURAL:$1|მომხმარებელი|მომხმარებლები}}",
        "siteuser": "{{SITENAME}} მომხმარებელი $1",
        "anonuser": "{{SITENAME}} ანონიმური მომხმარებელი $1",
-       "lastmodifiedatby": "á\83\94á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83\91á\83\9dá\83\9aá\83\9dá\83¡ á\83¨á\83\94á\83\98á\83ªá\83\95á\83\90á\83\9aá\83\90 $2, $1  $3-á\83\98á\83\97.",
+       "lastmodifiedatby": "á\83\94á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83\91á\83\9dá\83\9aá\83\9dá\83¡ á\83\93á\83\90á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\93á\83\90: $2, $1  á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\90á\83\95á\83¢á\83\9dá\83 á\83\98 â\80\94 $3.",
        "othercontribs": "$1-ს ნამუშევრის მიხედვით.",
        "others": "სხვები",
        "siteusers": "{{SITENAME}}-ის {{PLURAL:$2|{{GENDER:$1|მომხმარებელი}}|მომხმარებლები}} $1",
        "pageinfo-length": "გვერდის სიგრძე (ბაიტებში)",
        "pageinfo-article-id": "გვერდის 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": "მონიშნეთ ამ ფაილის ვერსია, როგორც პატრულირებული",
        "patrol-log-header": "ეს არის პატრულირებულ ვერსიათა ჟურნალი.",
        "log-show-hide-patrol": "$1 პატრულირების ჟურნალი",
        "log-show-hide-tag": "$1 დასათაურების ჟურნალი",
+       "confirm-markpatrolled-button": "კარგი",
        "deletedrevision": "წაშლილია ძველი ვერსია $1.",
        "filedeleteerror-short": "შეცდომა ფაილის $1 წაშლისას",
        "filedeleteerror-long": "ფაილის წაშლისას წარმოიშვა შეცდომები:\n\n$1",
        "newimages-summary": "ეს სპეცგვერდი აჩვენებს ბოლო დროს ატვირთულ ფაილებს.",
        "newimages-legend": "ფილტრი",
        "newimages-label": "ფაილის (ან მისი სახელის) ნაწილი",
+       "newimages-user": "IP მისამართი ან მომხმარებლის სახელი",
        "newimages-showbots": "ბოტის ატვირთვების ჩვენება",
        "newimages-hidepatrolled": "დამალე შემოწმებული ატვირთვები",
        "noimages": "გადასახედი არაფერია.",
        "htmlform-cloner-create": "მეტის დამატება",
        "htmlform-cloner-delete": "წაშლა",
        "htmlform-cloner-required": "აუცილებელია სულ მცირე ერთი მნიშვნელობა.",
+       "htmlform-date-placeholder": "წწწწ-თთ-დდ",
+       "htmlform-time-placeholder": "სთ:წთ:წმ",
+       "htmlform-datetime-placeholder": "წწწწ-თთ-დდ სთ:წთ:წმ",
        "htmlform-title-badnamespace": "[[:$1]] არ მდებარეობს \"{{ns:$2}}\"-ის სახელთა სივრცეში.",
        "htmlform-title-not-creatable": "$1\" არ არის მართებული გვერდის სათაური",
        "htmlform-title-not-exists": "$1 არ არსებობს.",
        "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-restore": "მომხმარებელმა $1 {{GENDER:$2|აღადგინა}} გვერდი $3 ($4)",
+       "logentry-delete-restore-nocount": "მომხმარებელმა $1 {{GENDER:$2|აღადგინა}} გვერდი $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 ვერსია|$1 ვერსია}}",
+       "restore-count-files": "{{PLURAL:$1|1 ფაილი|$1 ფაილი}}",
        "logentry-delete-event": "მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} {{PLURAL:$5|ჟურნალის ჩანაწერის|$5 ჟურნალის ჩანაწერების}} ხილვადობა $3-ზე: $4",
        "logentry-delete-revision": "მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვადობა გვერდისათვის $3: $4",
        "logentry-delete-event-legacy": "მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} ჩანაწერების ჟურნალის ხილვადობა $3-ზე",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|განაახლა}} დასათაურება $4 ვერსიასთან $3 გვერდთან ({{PLURAL:$7|დამატებული}} $6; {{PLURAL:$9|წაშლილი}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|განაახლა}} დასათაურება $5 ჟურნალის ჩანაწერთან $3 გვერდთან ({{PLURAL:$7|დამატებული}} $6; {{PLURAL:$9|წაშლილი}} $8)",
        "rightsnone": "(არცერთი)",
-       "revdelete-summary": "ცვლილებების აღწერა",
+       "rightslogentry-temporary-group": "$1 (დროებითი, $2-მდე)",
        "feedback-adding": "თქვენი შეფასების შენახვა...",
        "feedback-back": "უკან",
        "feedback-bugcheck": "კარგია! გთხოვთ, კიდევ ერთხელ შეამოწმეთ, ხომ არ არის აქ რომელიმე უკვე [$1 ნაცნობი შეცდომა].",
        "feedback-thanks": "გმადლობთ! თქვენი შეფასება განთავსებულია „[$2 $1]“ გვერდზე.",
        "feedback-thanks-title": "გმადლობთ!",
        "feedback-useragent": "მომხმარებლის აგენტი:",
-       "searchsuggest-search": "ძიება",
+       "searchsuggest-search": "ძიება {{grammar:prepositional|{{SITENAME}}}}ში",
        "searchsuggest-containing": "შეიცავს...",
        "api-error-badtoken": "შიდა შეცდომა: ცუდი ტოკენი.",
        "api-error-emptypage": "ახალი, ცარიელი გვერდების შექმნა აკრძალულია.",
        "pagelang-language": "ენა",
        "pagelang-use-default": "საწყისი ენის გამოყენება",
        "pagelang-select-lang": "აირჩიეთ ენა",
+       "pagelang-reason": "მიზეზი",
        "pagelang-submit": "გაგზავნა",
+       "pagelang-nonexistent-page": "გვერდი $1 არ არსებობს.",
        "right-pagelang": "გვერდის ენის შეცვლა",
        "action-pagelang": "გვერდის ენის შეცვლა",
        "log-name-pagelang": "ენის ცვლილებების ჟურნალი",
        "special-characters-group-thai": "ტაილანდური",
        "special-characters-group-lao": "ლაოსური",
        "special-characters-group-khmer": "ქჰმერული",
+       "special-characters-group-canadianaboriginal": "კანადური აბორიგენული",
        "special-characters-title-endash": "ტირე",
        "special-characters-title-emdash": "გრძელი ტირე",
        "special-characters-title-minus": "მინუსის ნიშანი",
        "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": "კატეგორიის დამატება...",
+       "mw-widgets-usersmultiselect-placeholder": "კიდევ დამატება...",
        "sessionmanager-tie": "შეუძლებელია მრავალი მოთხოვნის ავთენთიფიკაციის ტიპების გაერთიანება: $1.",
        "sessionprovider-generic": "$1 სესიები",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-სთან დაკავშირებული სესიები",
index 3397906..5378d3b 100644 (file)
        "yourdomainname": "Sizin' domen:",
        "login": "Kiriw",
        "nav-login-createaccount": "Kiriw / akkaunt jaratıw",
-       "userlogin": "Kiriw / akkaunt jaratıw",
        "logout": "Shıg'ıw",
        "userlogout": "Shıg'ıw",
        "notloggedin": "Kirilmegen",
-       "nologin": "Akkauntın'ız joqpa? '''$1'''.",
-       "nologinlink": "Akkaunt jaratın'",
        "createaccount": "Akkaunt jarat",
-       "gotaccount": "Akkauntın'ız barma? '''$1'''.",
-       "gotaccountlink": "Kir",
        "createaccountmail": "Waqtınshalıq parol jaratıw ha'm onı ko'rsetilgen e-mail adresin jiber",
        "badretype": "Siz kiritken parol tuwra kelmedi.",
        "userexists": "Kiritken paydalanıwshı atı ba'nt. \nİltimas, basqa at saylan'.",
        "anoneditwarning": "'''Esletpe:''' Siz kirmedin'iz. Sizin' IP adresin'iz usi bettin' o'zgeris tariyxında saqlanıp qaladı.",
        "missingsummary": "'''Esletpe:''' O'zgeristin' qısqasha mazmunın ko'rsetpedin'iz.\n\"Saqlaw\"dı ja'ne bassan'ız, o'zgerislerin'iz hesh qanday kommentariysiz saqlanadı.",
        "missingcommenttext": "Kommentariydi to'mende kiritin'.",
-       "missingcommentheader": "'''Eskertpe:''' Bul kommentariy ushın atama ko'rsetpedin'iz.\nEger ja'ne \"{{int:savearticle}}\" bassan'ız, o'zgerislerin'iz olsız saqlanadı.",
+       "missingcommentheader": "'''Eskertpe:''' Bul kommentariy ushın atama ko'rsetpedin'iz.\nEger ja'ne \"$1\" bassan'ız, o'zgerislerin'iz olsız saqlanadı.",
        "summary-preview": "Juwmag'ın ko'rip shıg'ıw:",
        "subject-preview": "Atamanı aldınnan qaraw:",
        "blockedtitle": "Paydalanıwshı bloklang'an",
        "prefs-resetpass": "Paroldi o'zgertiw",
        "saveprefs": "Saqla",
        "prefs-editing": "O'zgertiw",
-       "rows": "Qatarlar:",
-       "columns": "Bag'analar:",
        "searchresultshead": "İzlew",
        "recentchangesdays": "Aqırg'ı o'zgerislerde ko'rsetiletug'ın ku'nler:",
        "recentchangesdays-max": "(maksimum $1 {{PLURAL:$1|ku'n|ku'n}})",
        "userrights-groupsmember": "Ag'zalıq toparı:",
        "userrights-reason": "Sebep:",
        "userrights-nodatabase": "$1 mag'lıwmatlar bazası ele jaratılmag'an yamasa jergilikli emes.",
-       "userrights-nologin": "Paydalanıwshılar huquqların belgilew ushın administrator akkauntı menen [[Special:UserLogin|kiriwin'iz]] kerek.",
-       "userrights-notallowed": "Sizin' akkauntın'ızda paydalanıwshılardın' huquqın belgilew imka'niyatı joq.",
        "userrights-changeable-col": "O'zgerte alatug'ın toparların'ız",
        "userrights-unchangeable-col": "O'zgerte almaytug'ın toparların'ız",
        "group": "Topar:",
        "right-protect": "Qorg'aw da'relelerin o'zgertiw ha'm qorg'alg'an betlerdi o'zgertiw",
        "right-editprotected": "Qorg'alg'an betlerdi o'zgertiw (kaskadlı qorg'awsız)",
        "right-editinterface": "Paydalanıwshı interfeysin o'zgertiw",
-       "right-editusercssjs": "Basqa paydalanıwshılardın' CSS ha'm JS faylların o'zgertiw",
        "right-editusercss": "Basqa paydalanıwshılardın' CSS faylların o'zgertiw",
        "right-edituserjs": "Basqa paydalanıwshılardın' JS faylların o'zgertiw",
        "right-markbotedits": "Qaytarılg'an o'zgerislerdi botlardiki dep belgilew",
        "rcshowhideanons": "Anonim paydalanıwshılardı $1",
        "rcshowhidepatr": "Tekserilgen o'zgerislerdi $1",
        "rcshowhidemine": "O'zgertiwlerimdi $1",
-       "rclinks": "Aqırg'ı $2 ku'ndegi aqırg'ı $1 o'zgeristi ko'rset<br />$3",
+       "rclinks": "Aqırg'ı $2 ku'ndegi aqırg'ı $1 o'zgeristi ko'rset",
        "diff": "parq",
        "hist": "tar.",
        "hide": "jasır",
        "undeletebtn": "Qayta tiklew",
        "undeletelink": "ko'riw/qayta tiklew",
        "undeletecomment": "Sebep:",
-       "undeletedrevisions": "{{PLURAL:$1|1 nusqa|$1 nusqa}} qayta tiklendi",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 nusqa|$1 nusqa}} ha'm {{PLURAL:$2|1 fayl|$2 fayl}} qayta tiklendi",
-       "undeletedfiles": "{{PLURAL:$1|1 fayl|$1 fayl}} qayta tiklendi",
        "undelete-search-box": "O'shirilgen betlerdi izlew",
        "undelete-search-prefix": "Mınadan baslag'an betlerdi ko'rsetiw:",
        "undelete-search-submit": "İzle",
        "specialpages-group-users": "Paydalanıwshılar ha'm olardın' huqıqları",
        "revdelete-restricted": "administratorlarg'a qollanılg'an sheklewler",
        "revdelete-unrestricted": "administratorlardan alıp taslang'an sheklewler",
-       "rightsnone": "(hesh qanday)",
-       "revdelete-summary": "o'zgerislerdin' qısqasha mazmunı"
+       "rightsnone": "(hesh qanday)"
 }
index 3faa3a8..17a2ff5 100644 (file)
        "externaldberror": "Yella ugul aberrani n database neɣ ur tettalaseḍ ara ad tbeddleḍ isem an wemseqdac aberrani inek.",
        "login": "Kcem",
        "nav-login-createaccount": "Kcem / Xleq isem n wemseqdac",
-       "userlogin": "Kcem / Xleq isem n wemseqdac",
-       "userloginnocreate": "Qqen",
        "logout": "Ffeɣ",
        "userlogout": "Ffeɣ",
        "notloggedin": "Ur tekcimeḍ ara",
        "userlogin-noaccount": "Ur tesɛiḍ ara amiḍan ?",
        "userlogin-joinproject": "Ddukkel ar {{SITENAME}}",
-       "nologin": "Ur tesɛiḍ ara isem n umseqdac? '''$1'''.",
-       "nologinlink": "Xleq isem n wemseqdac",
        "createaccount": "Xleq isem n wemseqdac",
-       "gotaccount": "Tesɛiḍ yagi isem n wemseqdac? '''$1'''.",
-       "gotaccountlink": "Kcem",
-       "userlogin-resetlink": "Ettuḍ tilɣa n tuqqna ?",
        "userlogin-resetpassword-link": "Ettuḍ awal n uɛaddi ?",
        "userlogin-loggedin": "Teqqneḍ yakan am {{GENDER:$1|$1}}. Seqdec tiferkit ddaw-agi iwakken ad teqqneḍ s umiḍan nniḍen.",
        "userlogin-createanother": "Snulfud amiḍan nniḍen",
        "createacct-another-email-ph": "Sekcem tansa email",
        "createaccountmail": "Seqdec awal n uɛaddi agacuran akudan dɣa ceggeε-it ar tansa email yemlen",
        "createacct-realname": "Isem n tidets (axetṛan)",
-       "createaccountreason": "Ayɣer",
        "createacct-reason": "Taɣẓint",
        "createacct-reason-ph": "Ayɣer ad snulfuḍ amiḍan nniḍen",
        "createacct-submit": "Snulfud amiḍan inek(m)",
        "passwordreset-emaildisabled": "Tiseɣnin email nsant ɣef wiki agi.",
        "passwordreset-username": "Isem n useqdac",
        "passwordreset-domain": "Talɣut :",
-       "passwordreset-capture": "Ẓeṛ tirawt ?",
-       "passwordreset-capture-help": "Lukan ad tekkiḍ ɣef texxamt agi, tirawt (deg-es awal n uɛaddi akudan) att beqqeḍ dɣa ad tetwetceggaɛ i useqdac.",
        "passwordreset-email": "Tansa e-mail :",
        "passwordreset-emailtitle": "Tilɣa n umiḍan ɣef {{SITENAME}}",
        "passwordreset-emailtext-ip": "Yiwen (Ahat kečč/kem, seg tansa IP $1) yessutered awennez n awal n uɛaddi i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yeqqen|imiḍanen n iseqdacen agi qqenen}} s tansa e-mail agi :\n\n$2\n\n{{PLURAL:$3|Awal n uɛaddi uɛḍil agi ad i aff tasewti-s|Awalen n uɛaddi uɛḍilen agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.",
        "editingsection": "Abeddel n $1 (amur)",
        "editingcomment": "Abeddel n $1 (tigezmi tamaynut)",
        "editconflict": "Amennuɣ deg ubeddel: $1",
-       "explainconflict": "Amdan nniḍen ibeddel asebter-agi asmi telliḍ tettbeddileḍ.\nAḍris deg usawen yesɛa asebter am yella tura.\nIbeddlen inek ahaten deg ukessar.\nYesfek ad txelṭeḍ ibeddlen inek akk d usebter i yellan.\n'''Ala''' aḍris deg usawen i yettusmekta asmi twekkiḍ \"{{int:savearticle}}\".",
+       "explainconflict": "Amdan nniḍen ibeddel asebter-agi asmi telliḍ tettbeddileḍ.\nAḍris deg usawen yesɛa asebter am yella tura.\nIbeddlen inek ahaten deg ukessar.\nYesfek ad txelṭeḍ ibeddlen inek akk d usebter i yellan.\n'''Ala''' aḍris deg usawen i yettusmekta asmi twekkiḍ \"$1\".",
        "yourtext": "Aḍris inek",
        "storedversion": "Tasiwelt yettusmketen",
        "nonunicodebrowser": "'''AƔTAL: Browser/Explorateur inek ur yebil ara unicode. Nexdem akken ad tzemreḍ ad tbeddleḍ mebla amihi: isekkilin i mačči ASCII ttbanen deg tankult ubeddel s ungilen hexadecimal.'''",
        "saveprefs": "Smekti",
        "restoreprefs": "Err akkw iɣewwaren s lexṣas (deg akkw tigezmiwin)",
        "prefs-editing": "Abedddil",
-       "rows": "Ijerriḍen:",
-       "columns": "Tigejda:",
        "searchresultshead": "Anadi",
        "stub-threshold": "Talast timinegt i <a href=\"#\" class=\"stub\">izdayen ɣer ibegzan</a> (itamḍanen) :",
        "stub-threshold-disabled": "Yensa",
        "userrights-reason": "Ayɣer",
        "userrights-no-interwiki": "Ur tesɛiḍ ara turagt iwakken ad beddeleḍ izerfan n iseqdacen ɣef wiki nniḍen.",
        "userrights-nodatabase": "Taffa n isefka « $1 » ulac itt naɣ mačči d tadigant.",
-       "userrights-nologin": "Ilaq ad [[Special:UserLogin|qqeneḍ]] s yiwen umiḍan anedbal iwakken ad beddeleḍ izerfan n useqdac.",
-       "userrights-notallowed": "Ur tesɛiḍ ara turagt ad rnuḍ neɣ ad ekkeseḍ izerfan n umseqdac.",
        "userrights-changeable-col": "Igrawen i tzemreḍ ad beddeleḍ",
        "userrights-unchangeable-col": "Igrawen ur tzemreḍ ara ad beddeleḍ",
        "userrights-conflict": "Ccwal n ubeddel n izerfan n umseqdac ! Ilaq ad ɛzemeḍ tikelt nniḍen dɣa ad sergegeḍ ibeddilen.",
-       "userrights-removed-self": "Tekkeseḍ s lerbaḥ izerfan inek/inem. Tura ur tzemreḍ ara ad kecmeḍ ar usebtar agi.",
        "group": "Adrum:",
        "group-user": "Iseqdacen",
        "group-autoconfirmed": "Iseqdacen i rgegen",
        "right-editprotected": "Beddel isebtar i gdelen s « {{int:protect-level-sysop}} »",
        "right-editsemiprotected": "Beddel isebtar i gdelen s « {{int:protect-level-autoconfirmed}} »",
        "right-editinterface": "Beddel agrudem n useqdac",
-       "right-editusercssjs": "Beddel ifuyla CSS d JavaScript n iseqdacen nniḍen",
        "right-editusercss": "Beddel ifuyla CSS n iseqdacen nniḍen",
        "right-edituserjs": "Beddel ifuyla JavaScript n iseqdacen nniḍen",
        "right-editmyusercss": "Beddel ifuyla CSS n umseqdac inek/inem",
        "right-siteadmin": "Sekkweṛ naɣ kkes aseḍru i taffa n isefka",
        "right-override-export-depth": "Sifeḍ isebtar akkw d isebtar iqqenen alama tadrut n 5 iswiren",
        "right-sendemail": "Ceggaɛ tirawt i iseqdacen nniḍen",
-       "right-passwordreset": "Ẓeṛ tira n uwennez n awalen uɛaddi",
        "newuserlogpage": "Aɣmis n isnulfan n  imiḍanen n imseqdacen",
        "newuserlogpagetext": "Asebter agi yebeqqeḍ amezruy n usnulfu n imiḍanen n iseqdacen.",
        "rightslog": "Aɣmis n yizerfan n wemseqdac",
        "rcshowhideanons": "$1 n yimseqdacen udrigen",
        "rcshowhidepatr": "$1 n yibeddlen yettwassenqden",
        "rcshowhidemine": "$1 ibeddlen inu",
-       "rclinks": "Ssken $1 n yibeddlen ineggura di $2 n wussan ineggura<br />$3",
+       "rclinks": "Ssken $1 n yibeddlen ineggura di $2 n wussan ineggura",
        "diff": "amgirred",
        "hist": "Amezruy",
        "hide": "Ffer",
        "undeleteviewlink": "ẓeṛ",
        "undeleteinvert": "Snegdam ayen textareḍ",
        "undeletecomment": "Taɣẓint :",
-       "undeletedrevisions": "$1 {{PLURAL:$1|lqem yetwerren|ileqman yetwerren}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|lqem|ileqman}} d $2 {{PLURAL:$2|afaylu|ifuyla}} {{PLURAL:$2|yetwerr|twerren}}",
-       "undeletedfiles": "$1 {{PLURAL:$1|afaylu yetwerr|ifuyla twerren}}",
        "cannotundelete": "Abrir n tiririt :\n$1",
        "undeletedpage": "'''Asebtar $1 yetwerr.'''\n\nZeṛ [[Special:Log/delete|aɣmis n tukksiwin]] iwakken ad zṛeḍ umuɣ n tukksiwin d tiririyin timaynutin.",
        "undelete-header": "Ẓer [[Special:Log/delete|aɣmis n umḥay]] i isebtar ttumḥan tura.",
        "feedback-thanks": "Tanemmirt ! Awennit inek/inem yeffeɣ-d ɣef usebtar \"[$2 $1]\".",
        "searchsuggest-search": "Nadi",
        "searchsuggest-containing": "yesɛan...",
-       "api-error-badaccess-groups": "Ur tesɛiḍ ara turagt ad smireḍ ifuyla ɣef wiki agi.",
        "api-error-badtoken": "Tuccḍa tagensit : yir « tiddest ».",
-       "api-error-copyuploaddisabled": "Issenɣal seg URL nsan ɣef aqeddac agi.",
-       "api-error-duplicate": "{{PLURAL:$1|Yella yakan $2 afaylu nniḍen|Llan yakan $2 ifuyla nniḍen}} ɣef asmel agi s ugbur am winna.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Yella yakan afaylu nniḍen|Llan yakan ifuyla nniḍen}} ɣef asmel agi s ugbur am winna, maca {{PLURAL:$1|yetwekkes|tetwekksen}}.",
-       "api-error-empty-file": "Afaylu id ceggɛeḍ d-ilem.",
        "api-error-emptypage": "Asnulfu n isebtar ilemawen ur yareg ara.",
-       "api-error-fetchfileerror": "Tuccḍa tagensit : Yella kra ur yaɛeddan ara s luwqem deg tiririt n ufaylu.",
-       "api-error-fileexists-forbidden": "Afaylu s isem \"$1\" yella yakan, dɣa ur nezmer ara at n-mzey.",
-       "api-error-fileexists-shared-forbidden": "Afaylu s isem \"$1\" yella yakan deg ukaram n ifuyla yettwacerken, dɣa ur nezmer ara at n-mzey.",
-       "api-error-file-too-large": "Afaylu id cegɛed d-ameqqṛan aṭas.",
-       "api-error-filename-tooshort": "Isem n ufaylu d-awezzlan aṭas.",
-       "api-error-filetype-banned": "Tawsit agi n ufaylu d-tazanbagt.",
-       "api-error-filetype-banned-type": "''' « .$1 » '''mačči d {{PLURAL:$4|tawit n ufaylu yesɛan turagt|tiwsatin n ufaylu yesɛan turagt}}. \n{{PLURAL:$3|Tawit n ufaylu yesɛan turagt d-wagi :|Tiwsatin n ufaylu yesɛan turagt d-wigi :}} $2.",
-       "api-error-filetype-missing": "Asiɣzef n ufaylu agi ulac-it.",
-       "api-error-hookaborted": "Abeddel i ɛerdeḍ ad xedmeḍ yetweḥbes s tamdeyt n usiɣzef.",
-       "api-error-http": "Tuccḍa tagensit : ur yezmer ara ad yeqqen ar uqeddac.",
-       "api-error-illegal-filename": "Isem n ufaylu agi ur yeɣbel ara.",
-       "api-error-internal-error": "Tuccḍa tagensit : Yella kra ur yelḥa ara s luwqem deg usekker n taktert inek/inem ɣef wiki agi.",
-       "api-error-invalid-file-key": "Tuccḍa tagensit : ulac afaylu deg uḥraz akudan.",
-       "api-error-missingparam": "Tuccḍa tagensit : Xuṣṣen iɣewwaren deg tuttra inek/inem.",
-       "api-error-missingresult": "Tuccḍa tagensit : Ur nezmer ara ad n-ini ma anɣel yetwaxeddem.",
-       "api-error-mustbeloggedin": "Ilaq ad qqeneḍ iwakken ad zdemeḍ ifuyla.",
-       "api-error-mustbeposted": "Tuccḍa tagensit : Tuttra agi teḥwaǧ tarrayt HTTP POST.",
-       "api-error-noimageinfo": "Azdam yetwaxdam, maca aqeddac ur d-yefka ara tilɣa ɣef ufaylu.",
-       "api-error-nomodule": "Tuccḍa tagensit : Ulac azegrir n ussenɣel.",
-       "api-error-ok-but-empty": "Tuccḍa tagensit : Ulac tamrarut seg uqeddac.",
-       "api-error-overwrite": "Asefxes n ufaylu yellan ur yeɣbel ara.",
-       "api-error-stashfailed": "Tuccḍa tagensit : aqeddac ur yezmer ara ad yekles afaylu uɛḍil.",
        "api-error-publishfailed": "Tuccḍa tagensit : Aqeddac yexṣer imi yebɣa ad yessuffeɣ afaylu akudan.",
-       "api-error-stasherror": "Tella tuccḍa imi d-zdemeḍ afaylu iwakken ad yetweffer.",
-       "api-error-timeout": "Aqeddac ur d-yerra ara awal deg ukud yeḥeṛṛen.",
-       "api-error-unclassified": "Yefkad anezri warisem.",
-       "api-error-unknown-code": "Tuccḍa warisem : « $1 »",
-       "api-error-unknown-error": "Tuccḍa tagensit : Yella kra yexṣren deg ussenɣel n ufaylu inek.",
+       "api-error-stashfailed": "Tuccḍa tagensit : aqeddac ur yezmer ara ad yekles afaylu uɛḍil.",
        "api-error-unknown-warning": "Alɣu warisem : \"$1\".",
        "api-error-unknownerror": "Tuccḍa warisem : « $1 »",
-       "api-error-uploaddisabled": "Azdam yensa ɣef wiki agi.",
-       "api-error-verification-error": "Ahat afaylu agi yefsed, neɣ asiɣzef ines ur yeɣbel ara.",
        "duration-seconds": "$1 {{PLURAL:$1|tasint|tisinin}}",
        "duration-minutes": "$1 {{PLURAL:$1|tamrect|timercin}}",
        "duration-hours": "$1 {{PLURAL:$1|asrag|isragen}}",
index 9dd1e0d..58442f6 100644 (file)
        "externaldberror": "Щэуэгъуэ хъуа, аутентификациэ щекӀуэкӀым иэ апхуэдиз пӀалъэ уиӀу щыткъым, уи нэкугъуэ аккаунтыр зэпхъуэкӀын.",
        "login": "Системэм зыкъегъэцIыхуын",
        "nav-login-createaccount": "Ихьэн/щӀэуэ зитхэн",
-       "userlogin": "Ихьэн/зыхэтхэн",
-       "userloginnocreate": "Системэм зыкъегъэцӀыхуын",
        "logout": "ИкӀыжын",
        "userlogout": "ИкӀыжын",
        "notloggedin": "Системэм зэкъебгъэцӀыхуакъым",
-       "nologin": "Аккаунт щыӀэкъэ? '''$1'''.",
-       "nologinlink": "Аккаунт щІын",
        "createaccount": "Аккаун щӀэуэ щӀын",
-       "gotaccount": "Аккаунт щыӀу щыт?  '''$1'''.",
-       "gotaccountlink": "Системэм зыкъегъэцӀыху",
        "createaccountmail": "Электронэ почтэмкӀэ",
-       "createaccountreason": "Щхьэусыгъуэ:",
        "badretype": "Парол иптхахэр зэтеху щытхэкъым.",
        "userexists": "ЦыхухэтыцӀэ иптхар пэмыкӀ гуэрэм къегъэсэбэп.\nПэмыкӀ цӀэ къыхэх.",
        "loginerror": "Логиныр тэрэзкъым",
        "showdiff": "ЗэхъуэкӀыныгъэ хэлъхьахэр",
        "anoneditwarning": "'''Гу лъытэ!''': ЗыкъебгъэцӀыхуакъым системэм. Уи IP-адресыр иритхэнущ  напэкӀуэцӀым и зэхъуэкӀыныгъэ тхыдэм.",
        "anonpreviewwarning": "''Системэм зыкъебгъэцӀыхуакъым. Итхэным уи IP-адресыр къыринэну напэкӀуэцӀым и зэхъуэкӀыгъуэхэм я тхыдэм.''",
-       "missingsummary": "'''Гу лъытэ.''' ЗэхъуэкӀыгъуэм тепсэлъыхьыгъуэ кӀэщӀу ептакъым. ЕтӀуану «{{int:savearticle}}» тепкъузэмэ уи зэхъуэкӀыгъуэр тепсэлъыхьыншэу иритхэнущ.",
+       "missingsummary": "'''Гу лъытэ.''' ЗэхъуэкӀыгъуэм тепсэлъыхьыгъуэ кӀэщӀу ептакъым. ЕтӀуану «$1» тепкъузэмэ уи зэхъуэкӀыгъуэр тепсэлъыхьыншэу иритхэнущ.",
        "missingcommenttext": "ИщӀагъымкӀэ уи тхыгъэр итхэ.",
-       "missingcommentheader": "'''Гу лъытэ.''' Тепсэлъыхьыгъуэ къэбгъэнам псэлъащхьэ ептакъым.\nЕтӀуану «{{int:savearticle}}» тепкъузэмэ уи гъэтэрэзыгъуэр псэлъащхьэншу иритхэнущ.",
+       "missingcommentheader": "'''Гу лъытэ.''' Тепсэлъыхьыгъуэ къэбгъэнам псэлъащхьэ ептакъым.\nЕтӀуану «$1» тепкъузэмэ уи гъэтэрэзыгъуэр псэлъащхьэншу иритхэнущ.",
        "summary-preview": "Аннотациэр:",
        "subject-preview": "Псэлъащхьэ хъунур:",
        "blockedtitle": "ЦӀыхухэтыр теубыдащ",
        "editingsection": "Гъэтэрэзын $1 (секцэр)",
        "editingcomment": "Гъэтэрэзыгъуэ $1 (лъэныкъуэгъу/секциэ щӀэ)",
        "editconflict": "Редактированием зэпэщӀэуэныгъэ: $1",
-       "explainconflict": " Мы напэкӀуэцӀыр  редактировать пщӀыху , зыгуэрым зэхъуэкӀыныгъэ хилъхьащ.\nРедактированием и ищхьэ щхьэгъумбжэм щыболъагъу иджыпсту напэкӀуэцӀым ит текстыр.\nИщӀагъ щхьэгъумбжэм уэ пщӀа зэхъуэкӀыныгъэр итщ.\nУи зэхъуэкӀыныгъэхэр ищӀагъым къихи ищхьэ щхьэгъумбжэм хьы.\n«{{int:savearticle}} -м» щытепкъузэкӀэ ищхьэ щхьэгъумбжэм ит текстыр ихъумэнущ.",
+       "explainconflict": " Мы напэкӀуэцӀыр  редактировать пщӀыху , зыгуэрым зэхъуэкӀыныгъэ хилъхьащ.\nРедактированием и ищхьэ щхьэгъумбжэм щыболъагъу иджыпсту напэкӀуэцӀым ит текстыр.\nИщӀагъ щхьэгъумбжэм уэ пщӀа зэхъуэкӀыныгъэр итщ.\nУи зэхъуэкӀыныгъэхэр ищӀагъым къихи ищхьэ щхьэгъумбжэм хьы.\n«$1 -м» щытепкъузэкӀэ ищхьэ щхьэгъумбжэм ит текстыр ихъумэнущ.",
        "yourtext": "Уи текстыр",
        "storedversion": "Хъума щытыкӀэр",
        "nonunicodebrowser": "'''Хуэсакъ: Уи браузерым Йуникодыр къыштэкъым. Тхыгъэхэм я гъэтэрэзыгъуэм дежь мы ASCII щыту хъуа дэмыгъэхэр я кодкӀэ зэхъуэкӀауэ щытынухэ.'''",
        "rcshowhideliu": "ЦӀыхухэту, ихьахэр $1",
        "rcshowhideanons": "$1 анонимну",
        "rcshowhidemine": "$1 сгъэтэрэзахэр",
-       "rclinks": "ЗэхъуэкӀыгъуэхэр яужырейхэр $1 гъэлъэгъуэн $2 махуэ<br />$3",
+       "rclinks": "ЗэхъуэкӀыгъуэхэр яужырейхэр $1 гъэлъэгъуэн $2 махуэ",
        "diff": "зэмылI.",
        "hist": "тхыдэ",
        "hide": "ГъэпшкӀун",
        "version-specialpages": "Лэжыгъэ напэкӀуэцӀ",
        "specialpages": "СпецнапэкӀуэцӀхэр",
        "revdelete-restricted": "теубыдыгъуэхэр тхьэмадэхэм ятохуэ",
-       "revdelete-unrestricted": "теубыдыгъуэхэр тхьэмадэхэм ятеха",
-       "revdelete-summary": "зэхъуэкӀыгъуэхэм я тепсэлъыхьыгъуэ"
+       "revdelete-unrestricted": "теубыдыгъуэхэр тхьэмадэхэм ятеха"
 }
diff --git a/languages/i18n/kbp.json b/languages/i18n/kbp.json
new file mode 100644 (file)
index 0000000..e42fe51
--- /dev/null
@@ -0,0 +1,563 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Gnangbade",
+                       "Stephanecbisson"
+               ]
+       },
+       "tog-underline": "Kpasɩ kɩhɛsɩ",
+       "tog-hideminor": "Kendi ñɔɔzɩtʋ cekpetu wayɩ wayɩ ñɔɔzɩtʋ taa",
+       "tog-hidepatrolled": "Kendi ñɔɔzɩtʋ kiwilitu wayɩ wayɩ ñɔɔzɩtʋ taa",
+       "tog-newpageshidepatrolled": "Kendi takayɩhatʋ kiwilitu takayahatʋ kɩfatʋ lolaɣ taa",
+       "tog-hidecategorization": "Kendi takayɩhatʋ pɩlɩtʋ",
+       "tog-extendwatchlist": "Walanzɩ tɩŋʋʋ lolaɣ nɛ pɩsa pataaɖɩ ñɔɔzɩtʋ tɩŋa, pɛtɛkɛ wayɩ wayɩ ñɩndʋ ɖeke",
+       "tog-usenewrc": "Kpeɣli lɛzɩtʋ paa takayɩhayʋʋ ŋgʋ kɩ-yɔɔ wayɩ wayɩ ñɔɔzɩtʋ nɛ tɩŋʋʋ lolaɣ pa-taa.",
+       "tog-numberheadings": "Ma tɩ-yɔɔ ñʋʋ hɔɔlʋʋ hɩɖɛ",
+       "tog-showtoolbar": "Taaɖɩ ñɔɔzʋʋ wondu caŋa",
+       "tog-editondblclick": "Ñɔɔzɩ takayɩhatʋ nɛ nabʋlɛ ñɩɣʋ",
+       "tog-editsectiononrightclick": "Tɩɣ hɔɔlɩŋ ñɔɔzɩtʋ nɛ nɩwaŋ yɔɔ ñɩɣʋ hɔɔlɩŋ hɩla yɔɔ",
+       "tog-watchcreations": "Sɔzɩ man-tɩŋʋʋ lolaɣ yɔɔ takayɩhatʋ ndʋ malakɩ yɔ nɛ ndʋ mamʋʋ yɔ",
+       "tog-watchdefault": "Sɔzɩ man-tɩŋʋʋ lolaɣ yɔɔ takayɩhatʋ nɛ takayɛsɩ mba mɔñɔɔzʋʋ yɔ",
+       "tog-watchmoves": "Sɔzɩ takayɩhatʋ nɛ takayɛsɩ mba mɛnkɛzɩɣ yɔ man-tɩŋʋʋ lolaɣ taa",
+       "tog-watchdeletion": "Sɔzɩ man-tɩŋʋʋ lolaɣ yɔɔ takayɩhatʋ nɛ takayɛsɩ mba mahɩzɩɣ yɔ",
+       "tog-watchuploads": "Sɔzɩ takayɛsɩ kɩfasɩ nzɩ mamʋʋ yɔ man-tɩŋʋʋ lolaɣ yɔɔ",
+       "tog-watchrollback": "Sɔzɩ man-tɩŋʋʋ lolaɣ yɔɔ takayɩhatʋ ndʋ mɛnkpɛna ñɔɔzɩtʋ yɔ",
+       "tog-minordefault": "Ɛzɩ pɩtɩɩwɛʋ yɔ, ɖʋ ñɔɔzɩtʋ tɩŋa se tɩkɛ cekpetu",
+       "tog-previewontop": "Taaɖɩ mɔncɔnɩnɛpʋcɔ kɛ ñɔɔzɩtʋ wilaʋ ñʋʋ yɔɔ",
+       "tog-previewonfirst": "Taaɖɩ mɔncɔnɩnɛpʋcɔ kajalaɣ nɔɔzɩtʋ ɖeɖe",
+       "tog-enotifwatchlistpages": "Tukuna-m nɛ meeli yɔɔ yee pɔñɔɔza takayɩhayʋʋ nakʋyʋ yaa takayaɣ nakɛyɛ man-tɩnʋʋ lolaɣ taa yɔ",
+       "tog-enotifusertalkpages": "Tukuna-m nɛ meeli yɔɔ yee pɔñɔɔza mɔn-tɔnjɔlɩyɛ takayɩhayʋʋ yɔ",
+       "tog-enotifminoredits": "Tukuna-m nɛ meeli yɔɔ ɖɔɖɔ yee ñɔɔzɩtʋ cikpetu ɛwɛ takayɩhatʋ yaa takayɛsɩ pɔ-yɔɔ yɔ",
+       "tog-enotifrevealaddr": "Taaɖɩ mɛn-tɛ meeli ɖɩtɩlɩyɛ meeli ŋgʋ potukuna-m yɔ kɩ-taa",
+       "tog-shownumberswatching": "Taaɖɩ labɩnɩyaa mba pɔɖɔŋ labʋ yɔ pa-ñʋʋ",
+       "tog-oldsig": "Ñɛ-tɛ nɔnɔɔ nesi ñɩɣʋ",
+       "tog-fancysig": "Kpaɣ nesi ñɩɣʋ se pɩkɛ wikitext (kpasɩ tɩ-yɔɔ wɛʋ fɛyɩ)",
+       "tog-uselivepreview": "Labɩna ñatanaʋ kɛlɛʋ",
+       "tog-forceeditsummary": "Tukuna-m yee mantafasɩ ñɔɔzɩtʋ tɔm keem yɔ",
+       "tog-watchlisthideown": "Kendi tɩŋʋʋ lolaɣ taa ma-maɣmaɣ mɔ-ñɔɔzɩtʋ",
+       "tog-watchlisthidebots": "Kendi tɩŋʋʋ lolaɣ taa ñɔɔzɩtʋ ndʋ pijinɖe laba yɔ",
+       "tog-watchlisthideminor": "Kendi tɩŋʋʋ lolaɣ taa ñɔɔzɩtʋ cekpetu",
+       "tog-watchlisthideliu": "Kendi tɩŋʋʋ lolaɣ taa ñɔɔzɩtʋ ndʋ labɩnayaa mba pama pa-hila yɔ palaba yɔ",
+       "tog-watchlistreloadautomatically": "Ɖaɣnɩ hazʋʋ tɩ-yɔɔ tɩŋʋʋ lolaɣ yee pɔñɔɔzɩ catʋʋ lɩzɩtʋ yɔ (JavaScript wɛ kɩjɛyʋʋ)",
+       "tog-watchlisthideanons": "Kendi tɩŋʋʋ lolaɣ taa mɛɛsaɣ tɛɛ labɩnayaa ñɔɔzɩtʋ",
+       "tog-watchlisthidepatrolled": "Kendi tɩŋʋʋ lolaɣ taa ñɔɔzɩtʋ ndʋ patasa kalʋʋ yɔ",
+       "tog-watchlisthidecategorization": "Kendi takayɩhatʋ pɩlɩtʋ",
+       "tog-ccmeonemails": "Tiyina-m meeli ŋgʋ mentiyina labɩnayaa lalaa yɔ kɩ-lɛɛzʋʋ",
+       "tog-diffonly": "Taataaɖɩ mbʋ pɩwɛɛ takayɩhatʋ taa yɔ diffs tɛɛ",
+       "tog-showhiddencats": "Taaɖɩ pɩlɩŋ kɩmɛlɩŋ",
+       "tog-norollbackdiff": "Taataaɖi diff yee ŋtɛma natʋyʋ kpɛnaʋ lɛ",
+       "tog-useeditwarning": "Tukuna-m yee mancaɣ ɖɛʋ ñɔɔzɩtʋ takayɩhayʋʋ nakʋyʋ yɔɔ nɛ mɔntɔtɔsɩda-kʋ yɔ",
+       "tog-prefershttps": "Paa ɖooye ŋtamsɩɣna ña-tɩ lɛ, labɩna yɔɔ kandʋʋ tamsɩnaʋ",
+       "underline-always": "Paaɖooye",
+       "underline-never": "Kpoyi",
+       "underline-default": "Pɩtɩɩwɛʋ ñʋʋ yaa nɔmɔʋ hɛyʋʋ wazaɣ",
+       "editfont-style": "Ñɔɔzɩtʋ wilaʋ tɛ mayaɣ wɛtʋ",
+       "editfont-default": "Nɔmɔʋ hɛyʋʋ pɩtɩɩwɛʋ mayaɣ wɛtʋ",
+       "editfont-monospace": "Mayaɣ wɛtʋ walanzɩ maaciɣdiɣ",
+       "editfont-sansserif": "Patacana-m mayaɣ wɛtʋ",
+       "editfont-serif": "Pacana-m mayaɣ wɛtʋ",
+       "sunday": "Kujuka",
+       "monday": "Hodo",
+       "tuesday": "Piya",
+       "wednesday": "Cɩla",
+       "thursday": "Sarakawaɣ",
+       "friday": "Kimeɣa",
+       "saturday": "Mazaɣ",
+       "sun": "Kuj",
+       "mon": "Hod",
+       "tue": "Piy",
+       "wed": "Cɩl",
+       "thu": "Sar",
+       "fri": "Kim",
+       "sat": "Maz",
+       "january": "Kɔlaɣ fenaɣ",
+       "february": "Lɛlaɣ fenaɣ",
+       "march": "Lakɩŋ fenaɣ",
+       "april": "Ɖomaɣ fenaɣ",
+       "may_long": "Agoza fenaɣ",
+       "june": "Mɩsɩkʋm fenaɣ",
+       "july": "Hasɩyaɖɛ fenaɣ",
+       "august": "Kɩyɛɛna fenaɣ",
+       "september": "Salaŋ fenaɣ",
+       "october": "Aloma fenaɣ",
+       "november": "Kamɩŋ fenaɣ",
+       "december": "Saŋayɩŋ fenaɣ",
+       "january-gen": "Kɔlaɣ fenaɣ",
+       "february-gen": "Lɛlaɣ fenaɣ",
+       "march-gen": "Lakɩŋ fenaɣ",
+       "april-gen": "Ɖomaɣ fenaɣ",
+       "may-gen": "Agoza fenaɣ",
+       "june-gen": "Mɩsɩkʋm fenaɣ",
+       "july-gen": "Hasɩyaɖɛ fenaɣ",
+       "august-gen": "Keenaɣ fenaɣ",
+       "september-gen": "Salaŋ fenaɣ",
+       "october-gen": "Aloma fenaɣ",
+       "november-gen": "Kamɩŋ fenaɣ",
+       "december-gen": "Saŋayɩŋ fenaɣ",
+       "jan": "Kɔl",
+       "feb": "Lɛl",
+       "mar": "Lak",
+       "apr": "Ɖom",
+       "may": "Ago",
+       "jun": "Mɩs",
+       "jul": "Has",
+       "aug": "Kɩy",
+       "sep": "Sal",
+       "oct": "Alo",
+       "nov": "Kam",
+       "dec": "Saŋ",
+       "january-date": "Kolaɣ fenaɣ $1",
+       "february-date": "Lɛlaɣ fenaɣ $1",
+       "march-date": "Lakɩŋ fenaɣ $1",
+       "april-date": "Ɖomaɣ fenaɣ $1",
+       "may-date": "Agoza fenaɣ $1",
+       "june-date": "Mɩsɩkʋm fenaɣ $1",
+       "july-date": "Hasɩyaɖɛ fenaɣ $1",
+       "august-date": "Keenaɣ fenaɣ $1",
+       "september-date": "Salaŋ fenaɣ $1",
+       "october-date": "Aloma fenaɣ $1",
+       "november-date": "Kamɩŋ fenaɣ $1",
+       "december-date": "Saŋayɩŋ fenaɣ $1",
+       "period-am": "tanaŋ tɛɛ",
+       "period-pm": "ɖanaɣ",
+       "pagecategories": "{{PLURAL:$1|Pɩlɩʋ|Pɩlɩŋ}}",
+       "category_header": "Pɩlɩʋ \\ $1 \\ takayɩhatʋ",
+       "subcategories": "Pɩlɩŋ kɩtɛyɩŋ",
+       "category-media-header": "\\ $1 \\ pɩlɩʋ taa mediyaa",
+       "category-empty": "<em>Pɩlɩʋ kɩnɛ kɩ-taa fɛyɩ takayɩhayʋʋ nakʋyʋ yaa multimediya takayaɣ nakɛyɛ kɛ nɔnɔɔ</em>",
+       "hidden-categories": "{{PLURAL:$1|Pɩlɩʋ kɩmɛlʋʋ|Pɩlɩŋ kɩmɛlɩŋ}}",
+       "hidden-category-category": "Pɩlɩŋ kɩmɛsɩŋ",
+       "category-subcat-count": "{{PLURAL:$2|Pɩlɩʋ kʋnɛ kɩwɛna takayɩhayʋʋ kɩtɩŋʋʋ kʋnɛ ɖeke|{{PLURAL:$1|Takɩyɩhayʋʋ kɩtɩŋʋʋ kʋnɛ kɩ-wɛɛ|$1 Takayɩhatʋ kɩtɩŋɩtʋ tʋnɛ tɩ-wɛɛ}} pɩlɩʋ takayɩhatʋ $2 taa.}}",
+       "category-subcat-count-limited": "Pɩlɩʋ kʋnɛ kɩwɛna {{PLURAL:$1|pɩlɩʋ cikpeluu$1|pɩlɩŋ cikpeŋ}} kɩ-tɛɛ",
+       "category-article-count": "{{PLURAL:$2|Pɩlɩʋ kʋnɛ kɩwɛna pɩlɩʋ kɩtɛyʋʋ kʋnɛ ɖeke|{{PLURAL:$1|Pɩlɩʋ kʋnɛ kɩ-wɛɛ|$1 pɩlɩʋ kɩtɛyʋʋ tʋnɛ tɩ-wɛɛ}} pɩlɩʋ kɩtɛyʋʋ $2 taa.}}",
+       "category-article-count-limited": "{{PLURAL:$1|0=Takayɩhayʋʋ nakʋyʋ fɛyɩ|1=Takayɩhayʋʋ kɩtɩŋʋʋ wɛ|$1Takayɩhatʋ kɩtɩŋɩtʋ wɛ}} nɔnɔɔ pɩlɩʋ kʋnɛ kɩ-taa",
+       "category-file-count": "{{PLURAL:$2|Pɩlɩʋ kʋnɛ kɩwɛna takayaɣ kɩtɩŋaɣ ɖeke.|{{PLURAL:$1|Takayaɣ kɩtɩŋaɣ kʋɖʋmaɣ|Takayɛsɩ $1 kɩtɩŋasɩ}} wɛ pɩlɩʋ kʋnɛ kɩ-taa kagbanzɩ taa.}}",
+       "category-file-count-limited": "{{PLURAL:$1|0=Takayaɣ nakɛyɛ fɛyɩ|1=Takayaɣ kɩtɩŋaɣ wɛ|$1Takayɛsɩ kɩtɩŋasɩ wɛ}} nɔnɔɔ pɩlɩʋ kʋnɛ kɩ-taa",
+       "listingcontinuesabbrev": "(mbʋ pɩtɩŋɩɣ yɔ)",
+       "index-category": "Takayɩhatʋ kɩwɩlɩtʋ",
+       "noindex-category": "Takayɩhatʋ ndʋ patawɩlɩ yɔɔ",
+       "broken-file-category": "Takayɩhatʋ ndʋ tɩ-kpasɩ cɛba yɔ",
+       "about": "Pɩlɩɩna",
+       "article": "Takayɩhayʋʋ ŋgʋ kɩ-taa wɛ tɔm yɔ",
+       "newwindow": "Tʋlɩ mondoɖe kɩfaɖɛ taa",
+       "cancel": "Ɖɩzɩ",
+       "moredotdotdot": "Tasʋʋ…",
+       "morenotlisted": "Lolaɣ kanɛ kapɩzɩɣ kaatɛŋ",
+       "mypage": "Takayɩhayʋʋ",
+       "mytalk": "Ndɔncɔɔlɩyɛ",
+       "anontalk": "Ndɔnjɔɔlɩyɛ",
+       "navigation": "Tʋʋzɩtʋ",
+       "and": "&#32;nɛ",
+       "qbfind": "Ñɩnɩ",
+       "qbbrowse": "Kuli",
+       "qbedit": "Ñɔɔzɩ",
+       "qbpageoptions": "Takayɩhayʋʋ kʋnɛ",
+       "qbmyoptions": "Man-takayɩhatʋ",
+       "faq": "Tɔm pɔsɩtʋ kɩkpɛndɩtʋ",
+       "faqpage": "Project:Tɔmpɔsɩtʋ kɩkpɛndɩtʋ",
+       "actions": "Labɩtʋ",
+       "namespaces": "Hɩla loniye",
+       "variants": "Ndɩ ndɩ",
+       "navigation-heading": "Ɖiwoɖe tʋʋzʋʋ",
+       "errorpagetitle": "Wɛɛkʋʋ",
+       "returnto": "Pɩsɩ takayɩhayʋʋ $1 ñɩŋgʋ yɔɔ",
+       "tagline": "Pɩlɩɩna {{SITENAME}}",
+       "help": "Sɩnaʋ",
+       "search": "Ñɩnɩ",
+       "search-ignored-headings": "#<!-- yele caŋa ŋga ɛzɩ kɛwɛʋ yɔ --> <pre> \n# Hɔɔlɩŋ hɩla wena pakaɣ-yɛ ñɩnʋʋ yɔ \n# Lɛɛzɩtʋ ndʋ palaba cɩnɛ yɔ tɩpazɩɣ alɩwaatʋ ndʋ pawɩlɩ takayɩhayʋʋ hɩɖɛ yɔ \n# Ŋpɩzɩɣ ŋkpana ɖoŋ takayɩhayʋʋ tɛ tasʋʋ wɩlʋʋ yee ŋlakɩ kpɛɖɛ ñɔɔzʋʋ yɔ \n# Tɔm cɔlɩtʋ kɔyɔ : \n# * Paa caŋa ŋga payʋsa kɔ-yɔɔ « # » yɔ, kɛkɛ ndɔnjɔlɩyɛ caŋa \n# * Paa caŋa ŋga ka-taa wɛ nabʋyʋ yɔ, kɛkɛ ñʋʋ hɩɖɛ maɣmaɣ nɖɩ pɔsɔɔ ɖɩ-yɔɔ yɔ (Mayaɣ lɛɛzɩtʋ wɛ pɩ-taa).\nYɔɔ kɩtɔzɩtʋ \nAwayɩ kpasɩ\nCɔna ɖɔɖɔ\n#</pre> <!-- yele caŋa ŋga ɛzɩ kɛwɛʋ yɔ -->",
+       "searchbutton": "Ñɩnɩ",
+       "go": "Wili",
+       "searcharticle": "Kalɩ",
+       "history": "Takayɩhayʋʋ caanaʋ tɔm kɛdʋʋ",
+       "history_short": "Caanaʋ tɔm kɛdʋʋ",
+       "history_small": "caanaʋ tɔm kɛdʋʋ",
+       "updatedmarker": "pɔñɔɔza kpaɣ nɛ ɖooo ma-wayɩ wayɩ natʋ",
+       "printableversion": "Ñɔɔzɩtʋ kɩlɛɣzɩtʋ kɩlɩʋ lone",
+       "permalink": "Ɖɩtɩlɩyɛ caɣdam",
+       "print": "Lɩzɩ takayahayʋʋ kɩlɩʋ",
+       "view": "Cɔna",
+       "view-foreign": "Cɔna $1 yɔɔ",
+       "edit": "Ñɔɔzɩ",
+       "edit-local": "Ñɔɔzɩ kɛdɩtʋ kɩcɛyɩtʋ",
+       "create": "Lɩzɩ",
+       "create-local": "Sɔzɩ kɛdɩtʋ kɩcɛyɩtʋ",
+       "editthispage": "Ñɔɔzɩ takayɩhayʋʋ kʋnɛ",
+       "create-this-page": "Lɩzɩ takayɩhayʋʋ kʋnɛ",
+       "delete": "Hɩzɩ",
+       "deletethispage": "Hɩzɩ takayɩhayʋʋ kʋnɛ",
+       "undeletethispage": "Kitina takayɩhayʋʋ kɩhɩzʋʋ",
+       "undelete_short": "Kitina {{PLURAL:$1|ñɔɔzʋʋ|$1 ñɔɔzɩtʋ}}",
+       "viewdeleted_short": "Na {{PLURAL:$1|ñɔɔzʋʋ kɩhɩzʋʋ|$1 ñɔɔzɩtʋ kɩhɩzɩtʋ}}",
+       "protect": "Kandɩ",
+       "protect_change": "Lɛɣzɩ",
+       "protectthispage": "Kandɩ takayɩhayʋʋ kʋnɛ kɩ-yɔɔ",
+       "unprotect": "Lɛɣzɩ kandɩtʋ",
+       "unprotectthispage": "Lɛɣzɩ takayɩhayʋʋ kʋnɛ kɩ-yɔɔ kandɩtʋ",
+       "newpage": "Takayɩhayʋʋ kɩfalʋʋ",
+       "talkpage": "Takayɩhayʋʋ kʋnɛ kɩ-yɔɔ ndɔnjɔlɩyɛ",
+       "talkpagelinktext": "ndɔncɔɔlɩyɛ",
+       "specialpage": "Takayɩhayʋʋ ndɩ",
+       "personaltools": "Man-kɩlabɩnaʋ",
+       "articlepage": "Na takayɩhayʋʋ ŋgʋ kɩ-taa wɛ tɔm yɔ",
+       "talk": "Ndɔncɔɔlɩyɛ",
+       "views": "Taaɖɩtʋ",
+       "toolbox": "Kɩlabɩnaʋ",
+       "tool-link-userrights": "Lɛɣzɩ {{GENDER:$1|labɩnɩyaa}} tindima",
+       "tool-link-userrights-readonly": "Na {{GENDER:$1|labɩnɩyaa}} tindima",
+       "tool-link-emailuser": "Tiyina meeli kɛ labɩnayʋ",
+       "userpage": "Na labɩnayʋ takayɩhayʋʋ",
+       "projectpage": "Na tambaɣ takayɩhayʋʋ",
+       "imagepage": "Na takayaɣ takayɩhayʋʋ",
+       "mediawikipage": "Na tɔm kiyekitu takayɩhayʋʋ",
+       "templatepage": "Na kɩtɩzɩnaʋ takayɩhayʋʋ",
+       "viewhelppage": "Na sɩnaʋ takayɩhayʋʋ",
+       "categorypage": "Na pɩlɩʋ takayɩhayʋʋ",
+       "viewtalkpage": "Na ndɔnjɔlɩyɛ takayɩhayʋʋ",
+       "otherlanguages": "Kʋnʋmɩŋ lɛɛŋ",
+       "redirectedfrom": "(Papɩsɩna-kɛ nɛ ɖooo $1)",
+       "redirectpagesub": "Kɩpɩsɩnaʋ takayɩhayʋʋ",
+       "redirectto": "Pɩsɩna nɛ:",
+       "lastmodifiedat": "Takayahayʋʋ kɩfalʋ wayɩ wayɩ ñɩŋgʋ ñɔɔzɩtʋ $1 wiye, $2 yɔɔ.",
+       "viewcount": "{{PLURAL:$1|0=Petewila kaʋ|1=Pewila tam kʋɖʋm koŋ |Pewila tam $1}} takayɩhayʋʋ kʋnɛ kɩ-taa",
+       "protectedpage": "Takayɩhayʋʋ pakandɩ mɔ-yɔɔ",
+       "jumpto": "Wolo:",
+       "jumptonavigation": "tʋʋzɩtʋ",
+       "jumptosearch": "ñɩnɩ",
+       "view-pool-error": "Pɩtaacɛyɩ-ŋ, pɔɖɔkɩna ñɩɣyʋ lɩmɖʋyʋ ñɩŋʋ alɩwaatʋ tʋnɛ. \nLabɩnɩyaa mba pañɩnɩɣ se pewili takayɩhayʋʋ kʋnɛ kɩ-taa yɔ pakɩlɩ ɖɔʋ. \nƉaŋɩ pazɩ nɛ pʋcɔ ŋpɩzɩ ŋtasɩ takayɩhayʋʋ ŋgʋ kɩ-taa wiluu. $1",
+       "generic-pool-error": "Pɩtaacɛyɩ-ŋ, pɔɖɔkɩna ñɩɣyʋ lɩmɖʋyʋ ñɩŋʋ alɩwaatʋ tʋnɛ.\nLabɩnɩyaa mba pañɩnɩɣ se pewili kɩlabɩnaʋ kʋnɛ kɩ-taa yɔ pakɩlɩ ɖɔʋ. Ɖaŋɩ pazɩ nɛ pʋcɔ ŋpɩzɩ ŋtasɩ takayɩhayʋʋ ŋgʋ kɩ-taa wiluu.",
+       "pool-timeout": "Alɩwaatʋ ndʋ pɩwɛ se ŋkaɖɩ yɔ tɩɖɛwa",
+       "pool-queuefull": "Ɖɩsʋyɛ ñɩɣdaa",
+       "pool-errorunknown": "Yiɣduu mbʋ paasɩŋ yɔ",
+       "pool-servererror": "Pɔɖɔkɩna ɖɩcaɣyɛ tʋmɩyɛ ($1).",
+       "aboutsite": "pɩlɩɩna {{SITENAME}}",
+       "aboutpage": "Project:pɩlɩɩna",
+       "copyrightpage": "{{ns:project}}:Mayʋ waɖɛ",
+       "currentevents": "Sɔnɔ tɔm",
+       "currentevents-url": "Project:Sɔnɔ tɔm",
+       "disclaimers": "Paɣʋ",
+       "disclaimerpage": "Tɔm tɩŋa yɔɔ paɣʋ",
+       "edithelp": "Ñɔɔzɩtʋ sɩnaʋ",
+       "mainpage": "Talɩ ɖeu",
+       "mainpage-description": "Talɩ ɖeu",
+       "portal": "Ŋgbɛyɛ",
+       "portal-url": "Project:Talɩ ɖeu",
+       "privacy": "Mɛsaɣ tɛɛ tɔm ɖɔkʋʋ paɣtʋ",
+       "privacypage": "Project:Mɛsaɣ tɛɛ tɔm ɖɔkʋʋ",
+       "retrievedfrom": "Pɩɖaɣna mʋʋna \"$1\"",
+       "editsection": "ñɔɔzɩ",
+       "editold": "ñɔɔzɩ",
+       "editlink": "Ñɔɔzɩ",
+       "viewsourcelink": "Cɔna kide tɛɛ",
+       "editsectionhint": "Ñɔɔzɩ hɔɔlʋʋ : $1",
+       "toc": "Tɔm keem",
+       "site-atom-feed": "$1 tɛ Flukisi Atom",
+       "page-atom-feed": "$1 tɛ Flukisi Atom",
+       "red-link-title": "$1 (takayɩhayʋʋ mɛnfɛyɩ)",
+       "nstab-main": "Takayɩhayʋʋ",
+       "nstab-user": "Labɩnayʋ takayɩhayʋʋ",
+       "nstab-special": "Takayahayʋʋ ndɩ",
+       "nstab-project": "Pɩlɩɩna",
+       "nstab-image": "Takayaɣ",
+       "nstab-template": "Kɩtɩzɩnaʋ",
+       "nstab-category": "Pɩlɩʋ",
+       "mainpage-nstab": "Talɩ ɖeu",
+       "badtitle": "Hɩɖɛ kɩtɛkɛɖɩyɛ",
+       "badtitletext": "Takayɩhayʋʋ hɩɖɛ nɖɩ ŋñɩnaa yɔ, ɖɩtamʋna yaa ɖɩ-taa fɛyɩ pʋyʋ, yaa ɖɩ-kpayaɣ kʋnʋmɩŋ yaa wikinaa ndɩ ndɩ taa hɩɖɛ tacaɣ. Pɩtatɩlɩ, ɖɩwɛna mayaɣ yaa masɩ nzɩ paapɩzɩɣ pama-sɩ hɩla taa yɔ.",
+       "viewsource": "Cɔna tɔm kɩmatʋ kiɖe tɛɛ",
+       "userlogin-yourname": "Ña-labɩnayʋ hɩɖɛ",
+       "userlogin-yourname-ph": "Ma ña-labɩnayʋ hɩɖɛ",
+       "userlogin-yourpassword": "Tɔmbiye kɩtʋlɩyɛ",
+       "userlogin-yourpassword-ph": "Ma ñɔ-tɔmbiye kɩtʋlɩyɛ",
+       "createacct-yourpassword-ph": "Hɩɖɛ kɩsɛsɛyɛ naɖɩyɛ fɛyɩ",
+       "createacct-yourpasswordagain": "Cuuzi tɔmbiye kɩtʋlɩyɛ",
+       "createacct-yourpasswordagain-ph": "Tasɩ maʋ tɔmbiye kɩtʋlɩyɛ",
+       "userlogin-remembermypassword": "Ɖaŋɩ man-kpɩtɩnaʋ yɔɔ",
+       "login": "Kpɩtɩna",
+       "userlogin-noaccount": "Ŋfɛyɩna koozaɣ na ?",
+       "userlogin-joinproject": "Pɩsɩna {{SITENAME}} yɔɔ",
+       "createaccount": "Tʋlɩ koozaɣ",
+       "userlogin-resetpassword-link": "Ŋsɔ ñɔ-tɔmbiye kɩtʋlɩyɛ yɔɔ ?",
+       "userlogin-helplink2": "Kpɩtɩnaʋ sɩnaʋ",
+       "createacct-emailoptional": "Limɛlɩ ɖɩtɩlɩyɛ (pɩfɛyɩ kɩjɛyʋʋ)",
+       "createacct-email-ph": "Ma ñe-iimɛlɩ ɖɩtɩlɩyɛ",
+       "createacct-submit": "Lɩzɩ ño-koozaɣ",
+       "createacct-benefit-heading": "Ɛyaa ɛzɩ ña yɔ maɣna {{SITENAME}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|ñɔɔzʋʋ|ñɔɔzɩtʋ}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|takayɩhayʋʋ|takayɩhatʋ}}",
+       "createacct-benefit-body3": "wayɩ wayɩ nesi {{PLURAL:$1|ɖʋyʋ|ɖuyaa}}",
+       "loginlanguagelabel": "Kʋnʋŋ : $1",
+       "pt-login": "Kpɩtɩna",
+       "pt-login-button": "Kpɩtɩna",
+       "pt-createaccount": "Tʋlɩ koozaɣ",
+       "pt-userlogout": "Cɛ kpɩtɩnaʋ",
+       "passwordreset": "Ɖaɣnɩ pɩsɩnaʋ tɔmbiye kɩtʋlɩyɛ kpɛɖɛ",
+       "bold_sample": "Mamaɖɛ tɔm kɩmamatʋ",
+       "bold_tip": "Mamaɖɛ tɔm kɩmamatʋ",
+       "italic_sample": "Tɔm kɩmamatʋ kɩwɛlɩtʋ",
+       "italic_tip": "Tɔm kɩmamatʋ kɩwɛlɩtʋ",
+       "link_sample": "Kpayaɣ hɩɖɛ",
+       "link_tip": "Pɩ-taa kpayaɣ",
+       "extlink_sample": "http://www.example.com kpayaɣ hɩɖɛ",
+       "extlink_tip": "Awayɩ kpayaɣ (taasɔɔ paɖʋpʋcɔ http://)",
+       "headline_sample": "Hɩɖɛ tɔm kɩmamatʋ",
+       "headline_tip": "Hɩɖɛ kɩtɛyɛ, kʋkʋyɩmɩŋ 2 ñɩŋgʋ",
+       "nowiki_sample": "Ma tɔm kɩmamatʋ ndʋ pɔtɔcɔlɩ-tʋ yɔ cɩnɛ",
+       "nowiki_tip": "Sɔɔ Wiki cɔlʋʋ yɔɔ",
+       "image_tip": "Takayaɣ kɩñɩɣdaɣ",
+       "media_tip": "Kpayaɣ mowoki takayaɣ mediyaa taa",
+       "sig_tip": "Ñe-nesi ñɩɣʋ nɛ sɔnɔ efemiye",
+       "hr_tip": "Caŋa kɩkaɣa (labɩna-kɛ ñɩɩɩ)",
+       "summary": "Tɔm keem",
+       "minoredit": "Pʋnɛ pɩkɛ ñɔɔzʋʋ cikpem",
+       "watchthis": "Tɩŋɩ takayɩhayʋʋ ŋgʋ",
+       "savearticle": "Tɔsɩ",
+       "showpreview": "Cɔna nɛ pʋcɔ",
+       "showdiff": "Cɔna ñɔɔzɩtʋ",
+       "anoneditwarning": "<strong>Kpaɣ ña-tɩ :</strong> Ŋtakpɩtɩna. Yee ŋñɔɔzaa natʋyʋ yɔ, paa anɩ ɛpɩzɩɣ ɛna ña-dɩtɩlɩyɛ IP. Yee <strong>[$1 ŋkpɩtɩna]</strong> yaa <strong>[$2 ŋtʋla koozaɣ]</strong> yɔ, pakaɣ cɛlʋʋ ñɔ-ñɔɔzɩtʋ ña-labɩnayʋ hɩɖɛ, kazɩsɩ ndɩ ndɩ lɛɛsɩ taa.",
+       "loginreqlink": "kpɩtɩna",
+       "newarticletext": "Ŋtɩŋa takayɩhayʋʋ mantatɩɩwɛda yɔɔ kpayaɣ. Pʋcɔ ŋpɩzɩ ŋlɩzɩ-kʋ lɛ, ma ñɔ-tɔm aɖakaɣ ŋga kɛwɛ pɩ-tɛɛ yɔ ka-taa (Ŋpɩzɩɣ ŋcɔna [$1 sɩnaʋ takayɩhayʋʋ] yɔɔ nɛ ŋtasɩ pɩ-taa nɩʋ ɖeu). Yee piyiɣdi-ŋ nɛ ŋtalɩ cɩnɛ yɔ, tukina tʋʋzɩtʋ kʋtɔŋ \"kɩpɩsʋʋ\" yɔɔ.",
+       "noarticletext": "Tɔm natʋyʋ tatɩɩwɛta takayɩhayʋʋ kʋnɛ kʋ-yɔɔ. Ɛlɛ, ŋpɩzɩɣ ŋñɩnɩ tɔm ndʋ takayɩhatʋ lɛɛtʋ yɔɔ, n<span class=\\\"plainlinks\\\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ñɩnɩ labɩtʋ kɩtamtʋ taa]\\nyaa [{{fullurl:{{FULLPAGENAME}}|action=edit}} lɩzɩ takayɩhayʋʋ kʋnɛ]</span>.\"",
+       "noarticletext-nopermission": "Tɔm natʋyʋ tatɩɩwɛta takayɩhayʋʋ kʋnɛ kʋ-yɔɔ.\\nŊpɩzɩɣ [[Special:Search/{{PAGENAME}}ŋñɩnɩ |tɔm hɩɖɛ nɖɩ]] takayɩhatʋ lɛɛtʋ taa,\\nya <span class=\\\"plainlinks\\\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} alɩwaatʋ loyisi nzɩ pɛkpɛnda yɔ sɩ-taa]</span>.\"\nTɩŋɩ Wiki yɔɔ wayɩ wayɩ ñɔɔzɩtʋ takayɩhayʋʋ kʋnɛ kʋ-yɔɔ.",
+       "editing": "$1 ñɔɔzɩtʋ",
+       "creating": "$1 lɩzɩtʋ",
+       "editingsection": "(hɔɔluʋ) $1 ñɔɔzɩtʋ",
+       "templatesused": "{{PLURAL:$1|Kɩtɩzɩnaʋ mbʋ|Kɩtɩzɩnatʋ ndʋ}} palabɩna takayɩhayʋʋ kʋnɛ yɔ :",
+       "template-protected": "(yɔɔ kandʋʋ)",
+       "template-semiprotected": "(pakanda hɔɔlʋʋ yɔɔ)",
+       "hiddencategories": "Takayɩhayʋʋ kʋnɛ kɩwɛ {{PLURAL:$1|pɩlɩʋ kɩmɛsʋʋ kʋnɛ kɩ-taa|pɩlɩŋ kɩmɛsɩŋ ɛnɛ ɛ-taa}} :",
+       "permissionserrorstext-withaction": "Ŋŋpɩzɩɣ ŋla $2, pʋnɛ pʋ-yɔɔ :",
+       "moveddeleted-notice": "Pahɩza takayɩhayʋʋ kʋnɛ. Pataaɖɩ hɩzʋʋ nɛ kɛzʋʋ pa-alɩwaatʋ lolaɣ pɩ-tɛɛ se ŋcɔna.",
+       "viewpagelogs": "Cɔna takayɩhayʋʋ kʋnɛ kɔ-yɔɔ kɩlabɩm",
+       "currentrev-asof": "Wayɩ wayɩ ñɔɔzɩtʋ (efemiye : $1)",
+       "revisionasof": "$1 wiye ñɔɔzɩtʋ kɩlɛɣzɩtʋ",
+       "revision-info": "{{GENDER:$6|$2}} ñɔɔzɩna $7",
+       "previousrevision": "‚Üê wayɩ wayɩ kpaagbaa ñɔɔzɩtʋ kɩlɛɣzɩtʋ",
+       "nextrevision": "Ñɔɔzɩtʋ kɩlɛɣzɩtʋ kɩtɩŋɩtʋ ‚Üí",
+       "currentrevisionlink": "Cɔna sɔnɔ ñɔɔzɩtʋ",
+       "cur": "lɛɛ",
+       "last": "pɩɖɛwa",
+       "rev-delundel": "taaɖɩ/huuzi",
+       "history-title": "Ñɔɔzɩtʋ kɩlɛɣzɩtʋ caanaʋ tɔm kɛdʋʋ",
+       "difference-title": "Ñɔɔzɩtʋ hɛkʋ taa tʋkaɣ",
+       "lineno": "Caŋa $1:",
+       "editundo": "Hɩzɩ",
+       "diff-multi-sameuser": "(Labɩnayʋ kʋɖʋm ɛnʋ ɛ-hɛkʋ taa {{PLURAL:$1|ñɔɔzʋʋ nabʋyʋ|$1 ñɔɔzɩtʋ natʋyʋ }} tataaɖɩ)",
+       "searchresults": "Ñɩnʋʋ naʋ",
+       "searchresults-title": "\"$1\" tɔm ñɩnʋʋ naʋ",
+       "prevn": "wayɩ ñɩnʋ| wayɩ ñɩmba| wayɩ ñɩŋʋ| wayɩ ñɩŋ| wayɩ ñɩŋa| wayɩ ñɩnzɩ|  wayɩ ñɩnɖɛ| wayɩ ñɩna | wayɩ ñɩndʋ | ñɩmbʋ",
+       "nextn": "kɩtɩŋʋ| kɩtɩŋaa| kɩtɩŋʋʋ| kɩtɩŋɩŋ| kɩtɩŋaɣ| kɩtɩŋasɩ| kɩtɩŋɩyɛ| kɩtɩŋa| kɩtɩŋɩtʋ| kɩtɩŋɩm",
+       "nextn-title": "$1 {{PLURAL:$1|ñɩnʋʋ naʋ kɩtɩnŋʋʋ|ñɩnʋʋ natʋ kɩtɩnŋɩtʋ}}",
+       "shown-title": "Taaɖɩ natʋ $1{{PLURAL:$1||s}} paa takayɩhayʋʋ ngʋ kʋ-yɔɔ",
+       "viewprevnext": "Cɔna ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Lɩzɩ takayɩhayʋʋ \\‚ÄØ[[:$1|$1]]‚ÄØ\\\" Wiki kʋnɛ kɩ-yɔɔ‚ÄØ!</strong> {{PLURAL:$2|0=|Cɔna ɖɔɖɔ takayɩhayʋʋ kihihiu ña-ñɩnʋʋ taa|Cɔna ɖɔɖɔ takayɩhatʋ kihihitu ña-ñɩnʋʋ taa.}}",
+       "searchprofile-articles": "Takayɩhayʋʋ ŋgʋ kɩ-taa wɛ tɔm yɔ",
+       "searchprofile-images": "Multimediya",
+       "searchprofile-everything": "Pɩtɩŋa",
+       "searchprofile-advanced": "Ñɩnɩtʋ ndʋ ɖɩɖɛ ɛsɩndaa yɔ",
+       "searchprofile-articles-tooltip": "Ñɩnɩ $1 taa",
+       "searchprofile-images-tooltip": "Ñɩnɩ multimediya takayɛsɩ",
+       "searchprofile-everything-tooltip": "Ñɩnɩ wilau tɩŋa (pɩkpɛndɩna ndɔnjɔɔlɩyɛ takayɩhatʋ taa)",
+       "searchprofile-advanced-tooltip": "Lɩzɩ hɩla lona nɛ ŋñɩnɩ",
+       "search-result-size": "$1 ({{PLURAL:$2|1 tɔmbiye|$2 tɔmbe}})",
+       "search-redirect": "Pɩsɩna ɖooo $1",
+       "search-section": "(hɔɔlʋʋ $1)",
+       "search-suggest": "Maɣzɩ matʋ tʋnɛ nɛ ŋna:",
+       "searchall": "pɩtɩŋa",
+       "search-showingresults": "{{PLURAL:$4|Natʋ <strong>$1</strong><strong>$3 taa</strong>|Natʋ <strong>$1 powolo $2</strong><strong>$3 taa</strong>}}",
+       "search-nonefound": "Pañɩnaa patana pʋyʋ.",
+       "mypreferences": "Liu ñɩmbʋ",
+       "right-writeapi": "Labɩna wiki ñɔɔzɩtʋ API nɛ tʋmɩyɛ",
+       "newuserlogpage": "Labɩnayʋ koozasɩ alɩwaatʋ lolaɣ",
+       "enhancedrc-history": "caanaʋ tɔm kɛdʋʋ",
+       "recentchanges": "Wayɩ wayɩ ñɔɔzɩtʋ",
+       "recentchanges-legend": "Wayɩ wayɩ ñɔɔzɩtʋ ɖɩlɩzɩyɛ",
+       "recentchanges-summary": "KAPƖCA",
+       "recentchanges-label-newpage": "Ñɔɔzɩtʋ tʋnɛ tɩlɩzɩ takayɩhayʋʋ kɩfalʋʋ",
+       "recentchanges-label-minor": "Ñɔɔzɩtʋ tʋnɛ tɩkɛ cikpetu",
+       "recentchanges-label-bot": "Pɩjɩndɛ labɩna ñɔɔzɩtʋ tʋnɛ",
+       "recentchanges-label-unpatrolled": "Patatiiwilita ñɔɔzɩtʋ tʋnɛ tɩ-taa.",
+       "recentchanges-label-plusminus": "Takayɩhayʋʋ walanzɩ tatasɩ kɛʋ okteenaa ñʋʋ kʋnɛ",
+       "recentchanges-legend-heading": "<strong>Tɔm kitelitu :</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (Cɔna ɖɔɖɔ [[Special:NewPages|takayɩhatʋ kɩfatʋ lolaɣ]]).",
+       "rclistfrom": "Taaɖɩ ñɔɔzɩtʋ kɩfatʋ kpaɣna $3 wiye, ñɩɣtʋ $2 yɔɔ",
+       "rcshowhideminor": "Ñɔɔzɩtʋ cikpetu $1",
+       "rcshowhideminor-show": "Taaɖɩ",
+       "rcshowhideminor-hide": "Huuzi",
+       "rcshowhidebots": "Pɩjɩnla $1",
+       "rcshowhidebots-show": "Taaɖɩ",
+       "rcshowhidebots-hide": "Huuzi",
+       "rcshowhideliu": "Labɩnayaa kɩsɩmaa $1",
+       "rcshowhideliu-hide": "Huuzi",
+       "rcshowhideanons": "Mɛɛsaɣ tɛɛ labɩnayaa $1",
+       "rcshowhideanons-show": "Taaɖɩ",
+       "rcshowhideanons-hide": "Huuzi",
+       "rcshowhidemine": "Mɔ-ñɔɔzɩtʋ $1",
+       "rcshowhidemine-show": "Taaɖɩ",
+       "rcshowhidemine-hide": "Huuzi",
+       "rclinks": "Taaɖɩ wayɩ wayɩ ñɔɔzɩtʋ $1 ndʋ palaba wayɩ wayɩ kɩyakɩŋ $2 taa yɔ.",
+       "diff": "tʋk",
+       "hist": "can",
+       "hide": "Huuzi",
+       "show": "Taaɖɩ",
+       "minoreditletter": "ñc",
+       "newpageletter": "tk",
+       "boteditletter": "b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|oktee|okteenaa}} ñɔɔzʋʋ wayɩ",
+       "recentchangeslinked": "Takayɩhatʋ ndʋ tɩtamsɩna kanɛ yɔ tɩ-tɩŋʋʋ",
+       "recentchangeslinked-toolbox": "Takayɩhatʋ ndʋ tɩtamsɩna kanɛ yɔ tɩ-tɩŋʋʋ",
+       "recentchangeslinked-title": "Takayɛsɩ nzɩ sɩkpɛndɩ \\ $1 \\ yɔɔ yɔ sɩ-tɩŋʋʋ",
+       "recentchangeslinked-summary": "Takayɩhayʋʋ ndɩ kʋnɛ kɩwɩlɩɣ wayɩ wayɩ ñɔɔzɩtʋ takayɩhatʋ ndʋ tɩtamsɩna ɖama yɔ tɩ-taa. Piyele nɛ ña-tɩŋʋʋ lolaɣ takayɩhatʋ lɛ, pataaɖɩ tʋtʋ nɛ mamaɖɛ mayaɣ.",
+       "recentchangeslinked-page": "Takayɩhayʋʋ hɩɖɛ:",
+       "recentchangeslinked-to": "Taaɖɩ takayɩhatʋ ñɔɔzɩtʋ ndʋ tɩwɛna kpayaɣ nɛ takayɩhayʋʋ kʋnɛ kɩ-yɔɔ kiŋ yɔ kɛnɛ",
+       "upload": "Tiyina poliŋ taa takayaɣ",
+       "filedesc": "Kɛdɩtʋ",
+       "license-header": "Labɩnaʋ paɣtʋ",
+       "imgfile": "Takayaɣ",
+       "file-anchor-link": "Takayaɣ",
+       "filehist": "Takayaɣ caanaʋ tɔm kɛdʋʋ",
+       "filehist-help": "Tukina efemiye nɛ ñɩɣtʋ nɛ ŋna takayaɣ kanɛ ɛzɩ kaawɛʋ alɩwaatʋ ndʋ tɩ-taa yɔ.",
+       "filehist-current": "lɛlɛɛyɔ",
+       "filehist-datetime": "Efemiye nɛ ñɩɣtʋ",
+       "filehist-thumb": "Tampɔɔ",
+       "filehist-thumbtext": "$1 ñɔɔzɩtʋ kɩlɛɣzɩtʋ tɛ tampɔɔ",
+       "filehist-user": "Labɩnayʋ",
+       "filehist-dimensions": "Walanzɩ",
+       "filehist-comment": "Tɔm taa nuutuu",
+       "imagelinks": "Takayaɣ labɩnaʋ",
+       "linkstoimage": "{{PLURAL:$1|Takayɩhayʋʋ kɩtɩŋʋʋ lakɩna|Takayɩhatʋ $1 kɩtɩŋɩtʋ lakɩna}} takayaɣ kanɛ tʋmɩyɛ :",
+       "nolinkstoimage": "Takayɩhayʋʋ nakʋyʋ tatamsɩna takayaɣ kanɛ.",
+       "sharedupload-desc-here": "Takayaɣ kanɛ kalɩna $1. Tamasɩ lɛɛsɩ pɩzɩɣ palabɩna-kɛ nɛ tʋmɩyɛ.\\nPataaɖɩ kɛ-kɛdʋʋ tɔm ka-[$2 takayɩhayʋʋ ngʋ kɩkɛdʋʋ kɔ-tɔm yɔ] nɛ pɩ-tɛɛ.",
+       "upload-disallowed-here": "Ŋŋpɩzɩɣ ŋlɛɣzɩ takayaɣ kanɛ",
+       "randompage": "Takayɩhayʋʋ nakʋyʋ yem",
+       "nbytes": "$1 {{PLURAL:$1|oktee|okteenaa}}",
+       "nmembers": "$1 {{PLURAL:$1|koobu|koobiya}}",
+       "newpages": "Takayɩhatʋ kɩfatʋ",
+       "pager-older-n": "{{PLURAL:$1|mankɩlɩ pɩnʋʋ|$1 mankɩlɩ pɩnʋʋ waas}}",
+       "booksources": "Kiɖe tɛɛ takayɛsɩ",
+       "booksources-search-legend": "Ñɩnɩ kiɖe tɛɛ takayɛsɩ taa",
+       "booksources-search": "Ñɩnɩ",
+       "log": "Labɩtʋ alɩwaatʋ loyisi",
+       "allarticles": "Takayɩhatʋ tɩŋa",
+       "allpagessubmit": "Lɩzɩ lolaɣ",
+       "categories": "Pɩlɩŋ lolaɣ",
+       "mywatchlist": "Tɩŋʋʋ lolaɣ",
+       "watch": "Tɩŋɩ",
+       "dellogpage": "Hɩzɩtʋ alɩwaatʋ lolaɣ",
+       "rollbacklink": "Pɩzɩ wayɩ wayɩ ñɔɔzɩtʋ yɔɔ",
+       "rollbacklinkcount": "pɩsɩna $1 {{PLURAL:$1|ñɔɔzʋʋ|ñɔɔzɩtʋ}}",
+       "protectlogpage": "Kandɩtʋ alɩwaatʋ lolaɣ",
+       "namespace": "Hɩla lona",
+       "invert": "Pɩsɩ kɩlɩzɩm",
+       "tooltip-invert": "Yʋsɩ tataɣ kanɛ nɛ ŋhuuzi takayɩhatʋ ñɔɔzɩtʋ yɔɔ hɩla loniye kɩlɩzɩyɛ taa nɛ hɩla loniye kɩkpɛndɩyɛ ɖɔɖɔ yɔɔ, yee ŋyʋsaa ɖɩ-yɔɔ kɔyɔ.",
+       "namespace_association": "Hɩla loniye kɩkpɛndɩyɛ",
+       "tooltip-namespace_association": "Yʋsɩ tataɣ kanɛ nɛ ŋɖʋ ɖɔɖɔ ndɔncɔɔlɩyɛ hɩla loniye nɖɩ ɖɩkpɛnda hɩla loniye kɩlɩzɩyɛ yɔ ɖɩ-taa",
+       "blanknamespace": "(Kajalaɣ)",
+       "contributions": "msgid \"{{GENDER:$1|labɩnayʋ}} tambaɣ\"",
+       "mycontris": "Tambaɣ",
+       "anoncontribs": "Tambaɣ",
+       "month": "Sɛɛna $1 fenaɣ nɛ ŋpɩsɩ",
+       "year": "Sɛɛna pɩnaɣ $1 nɛ ŋpɩsɩ",
+       "whatlinkshere": "Takayɩhatʋ kɩtamtʋ",
+       "whatlinkshere-title": "Takayɩhatʋ ndʋ tɩtamsɩna \\ $1 \\ yɔ",
+       "whatlinkshere-page": "Takayɩhayʋʋ :",
+       "linkshere": "Takayɩhatʋ ndʋ tɩwɛ pɩ-tɛɛ yɔ tɩwɛna kpasɩ <strong>[[:$1]]<strong> yɔɔ:",
+       "isredirect": "Kɩpɩsɩnaʋ takayɩhayʋʋ",
+       "istemplate": "tɛɣʋ",
+       "isimage": "takayaɣ yɔɔ kpayaɣ",
+       "whatlinkshere-prev": "{{PLURAL:$1|wayɩ|$1 wayɩ}}",
+       "whatlinkshere-next": "kɩtɩŋʋ| kɩtɩŋaa| kɩtɩŋʋʋ| kɩtɩŋɩŋ| kɩtɩŋaɣ| kɩtɩŋasɩ| kɩtɩŋɩyɛ| kɩtɩŋa| kɩtɩŋɩtʋ| kɩtɩŋɩm",
+       "whatlinkshere-links": "Üê kpasɩ",
+       "whatlinkshere-hideredirs": "$1 pɩsɩna",
+       "whatlinkshere-hidetrans": "$1 tɛɣtʋ",
+       "whatlinkshere-hidelinks": "$1 kpasɩ",
+       "whatlinkshere-filters": "Catasɩ",
+       "blocklink": "Ɖɩɣ",
+       "contribslink": "tambasɩ",
+       "movelogpage": "Kɛzɩtʋ alɩwaatʋ lolaɣ",
+       "export": "Wona takayɩhatʋ poliŋ taa",
+       "thumbnail-more": "Walasɩ",
+       "tooltip-pt-userpage": "Ña-labɩnayʋ takayɩhayʋʋ",
+       "tooltip-pt-mytalk": "Ñɔ-ndɔncɔɔlɩyɛ takayɩhayʋʋ",
+       "tooltip-pt-preferences": "Ñe-liu ñɩmbʋ",
+       "tooltip-pt-watchlist": "Takayɩhatʋ loyisi nzɩ ŋtɩŋɩɣ sɩ-ñɔɔzɩtʋ yɔ",
+       "tooltip-pt-mycontris": "Ña-tambaɣ lolaɣ",
+       "tooltip-pt-login": "Pɩwɛ ɖeu se patɩlɩ-ŋ, ɛlɛ, pɩtakɩlɩ kɩcɛyʋʋ.",
+       "tooltip-pt-logout": "Cɛ kpɩtɩnaʋ",
+       "tooltip-pt-createaccount": "Pɩwɛ ɖeu se ŋtʋlɩ koozaɣ nɛ ŋkpɩtɩna, ɛlɛ, pɩtakɩlɩ kɩcɛyʋʋ.",
+       "tooltip-ca-talk": "Ndɔncɔɔlɩyɛ pɩlɩnaa takayɩhayʋʋ ŋgʋ kɩ-taa wɛ tɔm yɔ kɔ-yɔɔ",
+       "tooltip-ca-edit": "Ñɔɔzɩ wikicode",
+       "tooltip-ca-addsection": "Pazɩ hɔɔlʋʋ kɩfalʋʋ",
+       "tooltip-ca-viewsource": "Pakanda takayɩhayʋ kʋnɛ.n\\Ɛlɛ, ŋpɩzɩɣ ŋna ki-kiɖe tɛɛ.",
+       "tooltip-ca-history": "Takayɩhatʋ tʋnɛ tɩ-wayɩ wayɩ ñɔɔzɩtʋ kɩlɛɣzɩtʋ kɩfatʋ (nɛ ti-nesi ɖʋyaa)",
+       "tooltip-ca-move": "Kɛzɩ takayɩhayʋʋ kʋnɛ loniye",
+       "tooltip-ca-watch": "Kpɛndɩ takayɩhayʋʋ kʋnɛ ña-tɩŋʋʋ lolaɣ yɔɔ",
+       "tooltip-search": "Ñɩnɩ {{SITENAME}} taa",
+       "tooltip-search-go": "Wolo takayɩhayʋʋ nɣʋ kɩ-yɔɔ wɛ hɩɖɛ nɖɩ ɖeyi ɖeyi yɔ, yee ɖɩwɛɛ lɛ.",
+       "tooltip-search-fulltext": "Ñɩnɩ takayɩhatʋ ndʋ tɩ-yɔɔ wɛ tɔm yɔ.",
+       "tooltip-p-logo": "Takayɩhayʋʋ kajalaɣ ñɩŋgaɣ",
+       "tooltip-n-mainpage": "Wili Talɩ Ɖeu takayɩhayʋʋ taa",
+       "tooltip-n-mainpage-description": "Wolo talɩ ɖeu ɖeɖe",
+       "tooltip-n-portal": "Pɩlɩɩna tambaɣ yɔɔ; mbʋ ŋpɩzɩɣ labʋ yɔ; ɖenɖe panaɣ kiheyitu yɔ",
+       "tooltip-n-currentevents": "Ñɩnɩ sɔnɔ tɔm nɛ ŋtazɩ tɩ-taa",
+       "tooltip-n-recentchanges": "Wiki yɔɔ wayɩ wayɩ ñɔɔzɩtʋ lolaɣ",
+       "tooltip-n-randompage": "Taaɖɩ takayɩhayʋʋ nakʋyʋ yem",
+       "tooltip-n-help": "Sɩnaʋ",
+       "tooltip-t-whatlinkshere": "Takayɩhatʋ lolaɣ nna katamsɩna kanɛ yɔ",
+       "tooltip-t-recentchangeslinked": "Takayɩhatʋ wayɩ wayɩ ñɔɔzɩtʋ lolaɣ ŋga katamsɩna kanɛ yɔ",
+       "tooltip-feed-atom": "Takayɩhayʋʋ ngʋ flukisi atom",
+       "tooltip-t-contributions": "Cɔna {{GENDER:$1|labɩnayʋ ɛnɛ} ɛ-tambaɣ loyaɣ}",
+       "tooltip-t-upload": "Tiyina poliŋ taa takayɛsɩ",
+       "tooltip-t-specialpages": "Takayɩhatʋ ndɩ ndɩ tɩŋa lolaɣ",
+       "tooltip-t-print": "Takayɩhayʋʋ kʋnɛ kɔ-ñɔɔzɩtʋ kɩlɛɣzɩtʋ kɩlɩʋ lone",
+       "tooltip-t-permalink": "Takayɩhayʋʋ ñɔɔzɩtʋ kɩlɛɣzɩtʋ tʋnɛ ɖɩtɩlɩyɛ caɣdam",
+       "tooltip-ca-nstab-main": "Cɔna takayɩhayʋʋ ŋgʋ kɩ-taa wɛ tɔm yɔ",
+       "tooltip-ca-nstab-user": "Cɔna labɩnayʋ takayɩhayʋʋ",
+       "tooltip-ca-nstab-special": "Kʋnɛ kɩkɛ takayɩhayʋʋ ndɩ, paapɩzɩɣ pɔñɔɔzɩ-kʋ.",
+       "tooltip-ca-nstab-project": "Cɔna tambaɣ takayɩhayʋʋ yɔɔ",
+       "tooltip-ca-nstab-image": "Cɔna takayaɣ taa takayɩhayʋʋ yɔɔ",
+       "tooltip-ca-nstab-template": "Cɔna kɩtɩzɩnaʋ",
+       "tooltip-ca-nstab-category": "Cɔna takayɩhayʋʋ pɩlɩʋ",
+       "tooltip-save": "Tɔsɩ ñɔ-ñɔɔzɩtʋ",
+       "tooltip-preview": "Cɔna ñɔ-ñɔɔzɩtʋ nɛ pʋcɔ ŋyele se paa weyi ɛtɩlɩ-tʋ",
+       "tooltip-diff": "Taaɖɩ ñɔɔzɩtʋ ndʋ ŋlaba tɔm kɩmamatʋ yɔɔ yɔ",
+       "tooltip-rollback": "\\\"Pɩsɩ wayɩ wayɩ ñɔɔzɩtʋ yɔɔ\\\" ɖɩzɩɣ tam kʋɖʋm taa takayɩhayʋʋ kʋnɛ kʋ-yɔɔ wayɩ wayɩ nesi ɖʋyʋʋ ñɔɔzɩtʋ.",
+       "tooltip-undo": "\\ Ɖɩzɩ \\ ɖaɣnɩɣ labʋ wayɩ ñɔɔzɩtʋ nɛ ŋtʋlɩ ñɔɔzʋʋ mondoɖe nɛ pʋwɛɛ ɛzɩ mɔncɔna nɛ pʋcɔ yɔ. Ŋpɩzɩɣ ŋsɔzɩ aseɣɖe naɖɩyɛ tɔm keem taa.",
+       "tooltip-summary": "Ma tɔm keem natʋyʋ",
+       "simpleantispam-label": "Spam lʋbɩnaʋ yɔɔ wiluu. \\nLa <strong>taala</strong> ma cɩnɛ!\"",
+       "pageinfo-toolboxlink": "Takayɩhayʋʋ yɔɔ kiheyitu",
+       "previousdiff": "Wayɩ ñɔɔzɩtʋ",
+       "nextdiff": "Ñʋʋzʋʋ kɩtɩŋɩm",
+       "file-info-size": "Kpaɣna pɩkɩsɛlɩ $1 nɛ pɩtalɩ $2 ñɩŋgʋ, takayaɣ walanzɩ : $3, MIME akɩlɩ : $4",
+       "file-nohires": "Tʋtʋ tʋnɛ tɩ-wayɩ fɛyɩ.",
+       "svg-long-desc": "SVG takayaɣ; tʋtʋ $1 pikiseli powolo patɩlɩ $2; walanzɩ : $3",
+       "show-big-image": "Kiɖe tɛɛ takayaɣ",
+       "show-big-image-preview": "Ñatanaʋ pʋnɛ pɩ-walanzɩ : $1.",
+       "show-big-image-other": "{{PLURAL:$2|Tʋtʋ lɛɛtʋ|Tʋtʋ lɛɛtʋ}} : $1.",
+       "show-big-image-size": "Kpaɣna pɩkɩsɛlɩ $1 nɛ pɩtalɩ $2 ñɩŋgʋ",
+       "metadata": "Mɛtadɔneewaa",
+       "metadata-help": "Takayaɣ kanɛ ka-taa wɛ kiheyitu ndʋ tɩtakɩlɩ wazaɣ yɔ. Pɩlaba, foto numeriki yaa sɩkanɛɛrɩ ngʋ palɩzɩna-kɛ yɔ sɔzɩna-tʋ. Yee pɔñɔɔza takayaɣ ɖooo ka-ɖɩlɩyɛ taa kɔyɔ, ka-taa tɔm tazʋʋ natʋyʋ pɩzɩɣ tɩtalɩɩ takayɩhayʋʋ kɩnɔ̃ɔzʋʋ tɩŋa.",
+       "metadata-fields": "Kɩlɛmɩŋ mɛtadɔneewaa hayɩm mbʋ pɔyɔɔda pɔ-tɔm tɔm kɩmamatʋ taa yɔɔ pakaɣ-pʋ kpɛndʋʋ takayahayʋʋ ŋgʋ kɩkɛdɩɣ kɩlɛmʋʋ tɔm yɔ kɩ-taa alɩwaatʋ ndʋ papasɩɣ mɛtadɔnee kpata yɔ. Pakaɣ huzuu hayɩm lɛɛbʋ yɔɔ nɛ pɩwɛɛ ɛzɩ pɩtɩɩwɛʋ yɔ. \\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": "Kpilinaʋ",
+       "exif-xresolution": "Tʋtʋ kɩkaɣtʋ",
+       "exif-yresolution": "Tʋtʋ kitibitu",
+       "exif-datetime": "Ñɔɔzʋʋ efemiye",
+       "exif-make": "Ñɩɣyʋʋ laɖʋ",
+       "exif-model": "Ñɩɣyʋʋ wɛtʋ",
+       "exif-software": "Loozisɩyɛlɩ kɩlabɩnaʋ",
+       "exif-exifversion": "EXIF ñɔɔzɩtʋ kɩlɛɣzɩtʋ",
+       "exif-colorspace": "Tɩŋgaɣyʋʋ loniye",
+       "exif-datetimeoriginal": "Kajalaɣ foto kɩlɩzʋʋ tɛ efemiye nɛ ñɩɣtʋ",
+       "exif-datetimedigitized": "Kalɩyasɩ pɩsɩtʋ efemiye nɛ ñɩɣtʋ",
+       "exif-orientation-1": "Ɖeyi ɖeyi",
+       "namespacesall": "Pɩtɩŋa",
+       "monthsall": "pɩtɩŋa",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ndɔncɔɔlɩyɛ]])",
+       "specialpages": "Takayɩhatʋ ndɩ",
+       "tag-filter": "\"[[Special:Wondu yʋsʋʋ|Wonuu yʋsʋʋ]] catʋʋ",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Wonuu Yʋsʋʋ|Wondu yʋsʋʋ}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|hɩza}} takayɩhayʋʋ $3",
+       "logentry-move-move": "$1 {{GENDER:$2|kɛzɩ}} takayɩhayʋʋ $3 ñɩŋgʋ nɛ $4 ñɩŋgʋ yɔɔ",
+       "logentry-newusers-create": "{{GENDER:$2|Patʋlɩ}} labɩnayʋ koozaɣ $1",
+       "logentry-upload-upload": "$1 {{GENDER:$2|mʋʋna poliŋ taa}} $3",
+       "searchsuggest-search": "Ñɩnɩ"
+}
index 2f4c06a..5674812 100644 (file)
        "externaldberror": "یا تھے توثیقی ڈیٹابیسا خطا واقع بیتی شیر یا تتے بیریو کھاتو بتاریخ کوریکو اِجازت نیکی",
        "login": "داخل بوس",
        "nav-login-createaccount": "کھاتہ کھولاو کورے یا اندراج کورے",
-       "userlogin": "کھاتہ ساوزاوے یا اندراج کورے",
-       "userloginnocreate": "داخل نوشتہ بوس",
        "logout": "لاگ آوٹ",
        "userlogout": "لاگ آوٹ",
        "notloggedin": "داخلہ نو ہوی",
        "userlogin-noaccount": "تو کھاتہ نو ساوزے آسوسا؟",
        "userlogin-joinproject": "منسلک بوس{{SITENAME}} اری",
-       "nologin": "تو کھاتہ نو ساوزے آسوسا؟ $1",
-       "nologinlink": "کھاتہ ساوزاوے",
        "createaccount": "کھاتہ کھولاو کورے",
-       "gotaccount": "پروشٹی تان کھاتا ساوزینو بیتی شیر؟'''$1'''.",
-       "gotaccountlink": "لاگن بوس",
-       "userlogin-resetlink": "آوا داخل بیکو بچے تان تفصیلاتن روخڅی اسوم",
        "userlogin-resetpassword-link": "کلمہء شناختو روخڅیتام؟",
        "userlogin-helplink2": "لاگن کوراوا مدد کورے",
        "userlogin-createanother": "کھاتہ ساوزاوے",
        "createacct-another-email-ph": "تان ای میلو داخل کورے",
        "createaccountmail": "عارضی پاسورڈ استعمال کورے وا ھورو ای میلا انزاوے",
        "createacct-realname": "اصلی نام (اختیاری)",
-       "createaccountreason": "وجہ:",
        "createacct-reason": "وجہ",
        "createacct-reason-ph": "تو ڈبل کھاتہ کھیوتے ساوزیسان؟",
        "createacct-submit": "کھاتہ ساوزاوے",
        "rcshowhidemine": "ذاتی ترامیم $1",
        "rcshowhidemine-show": "پشاوے",
        "rcshowhidemine-hide": "کھوشتاوے",
-       "rclinks": "آخری $2 آنوسو بیرو $1 تبدیلیان مشاہدہ کورے<br />$3",
+       "rclinks": "آخری $2 آنوسو بیرو $1 تبدیلیان مشاہدہ کورے",
        "diff": "فرق",
        "hist": "تاریخچہ",
        "hide": "مو پشاوے",
index 1b03b32..f04c00a 100644 (file)
@@ -26,7 +26,7 @@
        "tog-watchdefault": "Pel u dosyê ke mı vurnê lista mına şêrkerdişi ke",
        "tog-watchmoves": "Pel u dosyê ke mı kırısnê lista mına şêrkerdişi ke",
        "tog-watchdeletion": "Pel u dosyê ke mı esterıtê, lista mına şêrkerdişi ke",
-       "tog-minordefault": "Vurnayisunê ho pêrune ‘vurnayiso qızkek’ nisan bıde",
+       "tog-minordefault": "Vırnayışanê xo pêrıne ‘vırnayışo qıckek’ nışan bıde",
        "tog-previewontop": "Verqayti pela nustene ser de bıasne",
        "tog-previewonfirst": "Vurnayiso verên de verqayti tım bıasne",
        "tog-enotifwatchlistpages": "Zû pele ya ki dosyawa ke lista mına şêrkerdişi de vurnê mı rê e-poste bırusne",
        "editsection": "bıvurne",
        "editold": "bıvurne",
        "viewsourceold": "çımey bıvêne",
-       "editlink": "bıvurne",
+       "editlink": "bıvırne",
        "viewsourcelink": "çıme bıvêne",
        "editsectionhint": "Qısımi bıvurne: $1",
        "toc": "Tedeestey",
        "externaldberror": "Cıfeteliyaisê naskerdene de ya xeta esta ya ki tebera vırastena hesabê sıma rê destur çino.",
        "login": "Cı kuye",
        "nav-login-createaccount": "Cı kuye / hesab vıraze",
-       "userlogin": "Cı kuye / hesab vıraze",
-       "userloginnocreate": "Cı kuye",
        "logout": "Veciye",
        "userlogout": "Veciye",
        "notloggedin": "Cı nêkota",
-       "nologin": "Hesabê sıma çino? '''$1'''.",
-       "nologinlink": "Jü hesab rake",
        "createaccount": "Hesab vıraze",
-       "gotaccount": "Hesabê sıma ke esto? '''$1'''.",
-       "gotaccountlink": "Cı kuye",
-       "userlogin-resetlink": "Melumatê cıkewtışi xo vira kerdê?",
        "createaccountmail": "e-poste sera",
-       "createaccountreason": "Sebeb:",
        "badretype": "Parola sıma nêvêrena.",
        "userexists": "No namê karberi guretiyo.\nKerem ke, namêna weçine.",
        "loginerror": "Xeta cıkotene",
        "rcshowhideanons": "$1 karberê anonimi",
        "rcshowhidepatr": "Vırnayışê cıyê vênıtey $1",
        "rcshowhidemine": "Vurnayisanê mı $1",
-       "rclinks": "Peyniya $2 rozu de $1 vurnayisu bıasne <br />$3",
+       "rclinks": "Peyniya $2 rozu de $1 vurnayisu bıasne",
        "diff": "ferq",
        "hist": "ver",
        "hide": "Bınımne",
        "compare-page1": "Pele 1",
        "compare-page2": "Pele 2",
        "rightsnone": "(qet jü)",
-       "revdelete-summary": "xulasa vurnaene",
        "feedback-cancel": "Bıtexelne"
 }
index 5f62837..d640781 100644 (file)
        "externaldberror": "وسى ارادا نە شەتتىك راستاۋ دەرەكقورىندا قاتە بولدى, نەمەسە شەتتىك تىركەلگىڭىزدى جاڭالاۋ رۇقساتى جوق.",
        "login": "كىرۋ",
        "nav-login-createaccount": "كىرۋ / تىركەلگى جاساۋ",
-       "userlogin": "كىرۋ / تىركەلگى جاساۋ",
        "logout": "شىعۋ",
        "userlogout": "شىعۋ",
        "notloggedin": "كىرمەگەنسىز",
-       "nologin": "كىرمەگەنسىز بە? '''$1'''.",
-       "nologinlink": "تىركەلگى جاساڭىز",
        "createaccount": "جاڭا تىركەلگى",
-       "gotaccount": "الداقاشان تىركەلگىىڭىز بار ما? '''$1'''.",
-       "gotaccountlink": "كىرىڭىز",
        "createaccountmail": "ە-پوشتامەن",
        "badretype": "ەنگىزگەن قۇپىييا سوزدەرىڭىز ٴبىر بىرىنە سايكەس ەمەس.",
        "userexists": "ەنگىزگەن قاتىسۋشى اتىڭىز الداقاشان پايدالانۋدا.\nوزگە اتاۋدى تاڭداڭىز.",
        "prefs-misc": "ارقىيلى",
        "saveprefs": "ساقتا",
        "prefs-editing": "وڭدەۋ",
-       "rows": "جولدار:",
-       "columns": "باعاندار:",
        "searchresultshead": "ىزدەۋ",
        "stub-threshold": "<a href=\"#\" class=\"stub\">بىتەمە سىلتەمەسىن</a> پىشىمدەۋ تابالدىرىعى (بايت):",
        "recentchangesdays": "جۇىقتاعى وزگەرىستەرىندە كورسەتپەك كۇن سانى:",
        "userrights-reason": "سەبەبى:",
        "userrights-no-interwiki": "باسقا ۋىيكىيلەردەگى پايدالانۋشى قۇقىقتارىن وڭدەۋگە رۇقساتىڭىز جوق.",
        "userrights-nodatabase": "$1 دەرەكقورى جوق نە جەرگىلىكتى ەمەس.",
-       "userrights-nologin": "قاتىسۋشى قۇقىقتارىن تاعايىنداۋ ٴۇشىن اكىمشى تىركەلگىسىمەن [[{{#special:Userlogin}}|كىرۋىڭىز]] ٴجون.",
-       "userrights-notallowed": "قاتىسۋشى قۇقىقتارىن تاعايىنداۋ ٴۇشىن تىركەلگىڭىزدە رۇقسات جوق.",
        "userrights-changeable-col": "وزگەرتە الاتىن توپتار",
        "userrights-unchangeable-col": "وزگەرتە المايتىن توپتار",
        "group": "توپ:",
        "right-protect": "قورعاۋ دەڭگەيلەرىن وزگەرتۋ جانە قورعالعان بەتتەردى وڭدەۋ",
        "right-editprotected": "قورعالعان بەتتەردى وڭدەۋ (باۋلى قورعاۋلارسىز)",
        "right-editinterface": "پايدالانۋشىلىق تىلدەسىۋىن وڭدەۋ",
-       "right-editusercssjs": "باسقا قاتىسۋشىلاردىڭ CSS جانە JS فايلدارىن وڭدەۋ",
        "right-editusercss": "باسقا قاتىسۋشىلاردىڭ CSS فايلدارىن وڭدەۋ",
        "right-edituserjs": "باسقا قاتىسۋشىلاردىڭ JS فايلدارىن وڭدەۋ",
        "right-rollback": "بەلگىلى بەتتى وڭدەگەن سوڭعى قاتىسۋشىنىڭ وڭدەمەلەرىنەن جىلدام شەگىندىرۋ",
        "rcshowhideanons": "تىركەلگىسىزدەردى $1",
        "rcshowhidepatr": "زەرتتەلگەن وڭدەمەلەردى $1",
        "rcshowhidemine": "وڭدەمەلەرىمدى $1",
-       "rclinks": "سوڭعى $2 كۇندە بولعان, سوڭعى $1 وزگەرىستى كورسەت<br />$3",
+       "rclinks": "سوڭعى $2 كۇندە بولعان, سوڭعى $1 وزگەرىستى كورسەت",
        "diff": "ايىرم.",
        "hist": "تار.",
        "hide": "جاسىر",
        "undeletebtn": "قالپىنا كەلتىر!",
        "undeletelink": "قالپىنا كەلتىرۋ",
        "undeletecomment": "ماندەمەسى:",
-       "undeletedrevisions": "$1 تۇزەتۋ قالپىنا كەلتىرىلدى",
-       "undeletedrevisions-files": "$1 تۇزەتۋ جانە $2 فايل قالپىنا كەلتىرىلدى",
-       "undeletedfiles": "$1 فايل قالپىنا كەلتىرىلدى",
        "cannotundelete": "جويۋ بولدىرماۋى ٴساتسىز ٴبىتتى;\nباسقا بىرەۋ العاشىندا بەتتىڭ جويۋدىڭ بولدىرماۋى مۇمكىن.",
        "undeletedpage": "'''$1 قالپىنا كەلتىرىلدى'''\n\nجۋىقتاعى جويۋلار مەن قالپىنا كەلتىرۋلەر جونىندە [[{{#special:Log}}/delete|جويۋ جۋرنالىن]] قاراڭىز.",
        "undelete-header": "جۋىقتاعى جويىلعان بەتتەر جونىندە [[{{#special:Log}}/delete|جويۋ جۋرنالىن]] قاراڭىز.",
        "revdelete-restricted": "اكىمشىلەرگە تىيىمدار قولدادى",
        "revdelete-unrestricted": "اكىمشىلەردەن تىيىمداردى الاستادى",
        "rightsnone": "(ەشقانداي)",
-       "revdelete-summary": "وڭدەمەنىڭ قىسقاشا مازمۇنداماسى",
        "expandtemplates": "ۇلگىلەردى ۇلعايتۋ",
        "expand_templates_intro": "وسى قۇرال ارنايى بەتى الدەبىر ٴماتىندى الادى دا,\nبۇنىڭ ىشىندەگى بارلىق كىرىكتەلگەن ۇلگىلەردى مەيلىنشە ۇلعايتادى.\nمىنا <nowiki>{{#language:...}} سىيياقتى جوڭدەتۋ فۋنكتسىييالارىن دا, جانە {{CURRENTDAY}}\nسىيياقتى اينامالىلارىن دا ۇلعايتادى (ناقتى ايتقاندا, قوس قابات ساداق جاقشالار اراسىنداعى بارلىعىن).\nبۇنى ٴوز MediaWiki باعدارلاماسىنان قاتىستى جوڭدەتۋ ساتىن شاقىرىپ ىستەلىنەدى.",
        "expand_templates_title": "ٴماتىن ارالىق اتاۋى ({{FULLPAGENAME}} ت.ب. بەتتەر ٴۇشىن):",
index 5829ad7..5e02e8f 100644 (file)
        "externaldberror": "Осы арада не шеттік растау дерекқорында қате болды, немесе шеттік тіркелгіңізді жаңалау рұқсаты жоқ.",
        "login": "Кіру",
        "nav-login-createaccount": "Кіру / Тіркелу",
-       "userlogin": "Кіру / Тіркелу",
-       "userloginnocreate": "Кіру",
        "logout": "Шығу",
        "userlogout": "Шығу",
        "notloggedin": "Кірмегенсіз",
        "userlogin-noaccount": "Тіркелгіңіз жоқ па?",
        "userlogin-joinproject": "{{SITENAME}} жобасына тіркелу",
-       "nologin": "Тіркелгіңіз жоқ па? $1.",
-       "nologinlink": "Тіркелгіңізді жасаңыз",
        "createaccount": "Тіркелу",
-       "gotaccount": "Бұған дейін тіркеліп пе едіңіз? '''$1'''.",
-       "gotaccountlink": "Кіріңіз",
-       "userlogin-resetlink": "Қатысушы атын не құпия сөзді ұмыттыңыз ба?",
        "userlogin-resetpassword-link": "Құпия сөзіңізді ұмыттыңыз ба?",
        "userlogin-helplink2": "Кіруге көмек",
        "userlogin-loggedin": "{{GENDER:$1|$1}} ретінде әлдеқашан кіргенсіз.\nТөмендегі пішінді басқа қатысушы кіруі ретінде қолданыңыз.",
        "createacct-another-email-ph": "Е-пошта мекен-жайын енгізіңіз",
        "createaccountmail": "Уақытша берілген құпия сөзді пайдаланыңыз және оны көрсетілген электрондық поштаға жіберіңіз",
        "createacct-realname": "Нақты атыңыз (ерікті)",
-       "createaccountreason": "Себебі:",
        "createacct-reason": "Себебі:",
        "createacct-reason-ph": "Неге басқа тіркегі жасамақшысыз",
        "createacct-submit": "Тіркеліңіз",
        "preview": "Қарап шығу",
        "showpreview": "Алдын-ала қарау",
        "showdiff": "Өзгерістерді көрсет",
-       "blankarticle": "<strong>Ескерту:</strong> Сіз бастамақшы болған бет бос.\nЕгер сіз «{{int:savearticle}}» дегенші қайта шертсеңіз бет қандайда бір мағлұматсыз басталады.",
+       "blankarticle": "<strong>Ескерту:</strong> Сіз бастамақшы болған бет бос.\nЕгер сіз «$1» дегенші қайта шертсеңіз бет қандайда бір мағлұматсыз басталады.",
        "anoneditwarning": "<strong> Ескерту:</strong>  Сіз жүйеге кірмегенсіз.\nIP мекенжайыңыз қандай да бір өңдеме жасасаңыз көпшілікке көрінеді. Егер сіз <strong>[$1 кірсеңіз]</strong> немесе <strong>[$2 тіркелсеңіз]</strong>, сіздің өңдемелеріңіз сіздің қатысушы есіміңізден байланысты болады, сонымен қатар басқа да артықшылықтар беріледі.",
        "anonpreviewwarning": "<em>Сіз жүйеге кірмегенсіз. IP мекенжайыңыз бұл беттің өңделу тарихында жазылып алынады.</em>",
-       "missingsummary": "<strong>Ескерту:</strong> Өңдеменің қысқаша түйіндемесін енгізбепсіз.\n«{{int:savearticle}}» батырмасын қайта бассаңыз өңдемеңіз түйіндемесіз сақталады.",
-       "selfredirect": "<strong>Ескерту:</strong> Сіз бұл бетті өзіне бағыттадыңыз.\nСіз бағыттау үшін қате нысана көрсеттіңіз не қате бетті өңдеген болуыңыз мүмкін.\nЕгер «{{int:savearticle}}» дегенді қайта бассаңыз, бағыттау қалайда басталады.",
+       "missingsummary": "<strong>Ескерту:</strong> Өңдеменің қысқаша түйіндемесін енгізбепсіз.\n«$1» батырмасын қайта бассаңыз өңдемеңіз түйіндемесіз сақталады.",
+       "selfredirect": "<strong>Ескерту:</strong> Сіз бұл бетті өзіне бағыттадыңыз.\nСіз бағыттау үшін қате нысана көрсеттіңіз не қате бетті өңдеген болуыңыз мүмкін.\nЕгер «$1» дегенді қайта бассаңыз, бағыттау қалайда басталады.",
        "missingcommenttext": "Пікіріңізді төменге енгізіңіз.",
-       "missingcommentheader": "<strong>Ескерту:</strong> Бұл пікірге тақырыбын жазбапсыз.\n«{{int:savearticle}}» түймесін тағы бассаңыз өңдемеңіз түйіндемесіз сақталады.",
+       "missingcommentheader": "<strong>Ескерту:</strong> Бұл пікірге тақырыбын жазбапсыз.\n«$1» түймесін тағы бассаңыз өңдемеңіз түйіндемесіз сақталады.",
        "summary-preview": "Қысқаша түйіндемесін қарап шығу:",
        "subject-preview": "Тақырыбын қарап шығу:",
        "previewerrortext": "Өзгерістеріңізді қарап шығу талпынысыңыз кезінде қате кездесті.",
        "editingsection": "Өңдеп жатырсыз: $1 бетінің бөлімі",
        "editingcomment": "Өңдеп жатырсыз: $1 (жаңа бөлім)",
        "editconflict": "Өңдемелер қақтығысы: $1",
-       "explainconflict": "Осы бетті сіз өңдей бастағанда басқа біреу бетті өзгерткен.\nЖоғарғы мәтін аумағында қазіргі уақытта бар бет мәтінінен тұрады.\nТөменгі мәтін аумағында сіздің өзгертулеріңіз көрсетіледі.\nӨзгертуіңізді бар мәтінге біріктіруге тура келеді.\n«{{int:savearticle}}» батырмасын басқанда </strong>тек</strong> жоғарғы мәтін аумағы сақталады.",
+       "explainconflict": "Осы бетті сіз өңдей бастағанда басқа біреу бетті өзгерткен.\nЖоғарғы мәтін аумағында қазіргі уақытта бар бет мәтінінен тұрады.\nТөменгі мәтін аумағында сіздің өзгертулеріңіз көрсетіледі.\nӨзгертуіңізді бар мәтінге біріктіруге тура келеді.\n«$1» батырмасын басқанда </strong>тек</strong> жоғарғы мәтін аумағы сақталады.",
        "yourtext": "Мәтініңіз",
        "storedversion": "Сақталған нұсқасы",
        "nonunicodebrowser": "<strong>Ескерту: Шолғышыңыз Юникод белгілеуіне үйлесімді емес</strong>\nЖұмыс істеуге ықтималдық беру үшін төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі.",
        "right-editsemiprotected": "Қорғалған беттерді өңдеу \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Беттің контент моделін өңдеу",
        "right-editinterface": "Қатысушы тілдесіуін өңдеу",
-       "right-editusercssjs": "Басқа қатысушылардың CSS және JS файлдарын өңдеу",
        "right-editusercss": "Басқа қатысушылардың CSS файлдарын өңдеу",
        "right-edituserjs": "Басқа қатысушылардың JavaScript файлдарын өңдеу",
        "right-editmyusercss": "Өзіңіздің қатысушы CSS файлдарыңызды өңдеу",
        "rcshowhidecategorization": "Бет санаттауларын $1",
        "rcshowhidecategorization-show": "көрсету",
        "rcshowhidecategorization-hide": "жасыру",
-       "rclinks": "Соңғы $2 күнде болған соңғы $1 өзгерісті көрсет<br />$3",
+       "rclinks": "Соңғы $2 күнде болған соңғы $1 өзгерісті көрсет",
        "diff": "айырм",
        "hist": "тарихы",
        "hide": "жасыру",
        "undeleteviewlink": "қарау",
        "undeleteinvert": "Таңдалғанды жасыру",
        "undeletecomment": "Себебі:",
-       "undeletedrevisions": "{{PLURAL:$1|1 түзету|$1 түзету}} қалпына келтірілді",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 түзету|$1 түзету}} және {{PLURAL:$2|1 файл|$2 файл}} қалпына келтірілді",
-       "undeletedfiles": "{{PLURAL:$1|1 файл|$1 файл}} қалпына келтірілді",
        "cannotundelete": "Жою болдырмауы сәтсіз бітті;\n$1",
        "undeletedpage": "'''$1 дегенді қалпына келтірді'''\n\nЖуықтағы жоюлар мен қалпына келтірулер жөнінде  [[Special:Log/delete|жою журналын]] қараңыз.",
        "undelete-header": "Жуықтағы жойылған беттер жөнінде  [[Special:Log/delete|жою журналын]] қараңыз.",
        "logentry-tag-update-revision": "$1 $3 беттегі $4 нұсқасына тегті ({{PLURAL:$7|қосты}} $6; {{GENDER:$2|жаңартты}} {{PLURAL:$9|аластатты}} $8)",
        "logentry-tag-update-logentry": "$1 $3 бетіндегі $5 енгізілім журналындағы тегті {{GENDER:$2|жаңартты}} ({{PLURAL:$7|қосты}} $6; {{PLURAL:$9|аластады}} $8)",
        "rightsnone": "(ешқандай)",
-       "revdelete-summary": "өңдеменің қысқаша мазмұндамасы",
        "feedback-adding": "Бетке кері байланыс қосуда...",
        "feedback-back": "Кері",
        "feedback-bugcheck": "Керемет! [$1 белгілі қате] тізімінде сәйкес жазбалар жоқ екендігін тексеріңіз.",
index 7ea4dfd..67ad4ae 100644 (file)
        "externaldberror": "Osı arada ne şettik rastaw derekqorında qate boldı, nemese şettik tirkelgiñizdi jañalaw ruqsatı joq.",
        "login": "Kirw",
        "nav-login-createaccount": "Kirw / Tirkelgi jasaw",
-       "userlogin": "Kirw / Tirkelgi jasaw",
        "logout": "Şığw",
        "userlogout": "Şığw",
        "notloggedin": "Kirmegensiz",
-       "nologin": "Kirmegensiz be? '''$1'''.",
-       "nologinlink": "Tirkelgi jasañız",
        "createaccount": "Jaña tirkelgi",
-       "gotaccount": "Aldaqaşan tirkelgiiñiz bar ma? '''$1'''.",
-       "gotaccountlink": "Kiriñiz",
        "createaccountmail": "e-poştamen",
        "badretype": "Engizgen qupïya sözderiñiz bir birine säýkes emes.",
        "userexists": "Engizgen qatıswşı atıñız aldaqaşan paýdalanwda.\nÖzge atawdı tañdañız.",
        "prefs-misc": "Ärqïlı",
        "saveprefs": "Saqta",
        "prefs-editing": "Öñdew",
-       "rows": "Joldar:",
-       "columns": "Bağandar:",
        "searchresultshead": "İzdew",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Biteme siltemesin</a> pişimdew tabaldırığı (baýt):",
        "recentchangesdays": "Jüıqtağı özgeristerinde körsetpek kün sanı:",
        "right-protect": "Qorğaw deñgeýlerin özgertw jäne qorğalğan betterdi öñdew",
        "right-editprotected": "Qorğalğan betterdi öñdew (bawlı qorğawlarsız)",
        "right-editinterface": "Paýdalanwşılıq tildesiwin öñdew",
-       "right-editusercssjs": "Basqa qatıswşılardıñ CSS jäne JS faýldarın öñdew",
        "right-editusercss": "Basqa qatıswşılardıñ CSS faýldarın öñdew",
        "right-edituserjs": "Basqa qatıswşılardıñ JS faýldarın öñdew",
        "right-rollback": "Belgili betti öñdegen soñğı qatıswşınıñ öñdemelerinen jıldam şegindirw",
        "rcshowhideanons": "Tirkelgisizderdi $1",
        "rcshowhidepatr": "Zerttelgen öñdemelerdi $1",
        "rcshowhidemine": "Öñdemelerimdi $1",
-       "rclinks": "Soñğı $2 künde bolğan, soñğı $1 özgeristi körset<br />$3",
+       "rclinks": "Soñğı $2 künde bolğan, soñğı $1 özgeristi körset",
        "diff": "aýırm.",
        "hist": "tar.",
        "hide": "jasır",
        "undeletebtn": "Qalpına keltir!",
        "undeletelink": "qalpına keltirw",
        "undeletecomment": "Mändemesi:",
-       "undeletedrevisions": "$1 tüzetw qalpına keltirildi",
-       "undeletedrevisions-files": "$1 tüzetw jäne $2 faýl qalpına keltirildi",
-       "undeletedfiles": "$1 faýl qalpına keltirildi",
        "cannotundelete": "Joyw boldırmawı sätsiz bitti;\nbasqa birew alğaşında bettiñ joywdıñ boldırmawı mümkin.",
        "undeletedpage": "'''$1 qalpına keltirildi'''\n\nJwıqtağı joywlar men qalpına keltirwler jöninde [[{{#special:Log}}/delete|joyw jwrnalın]] qarañız.",
        "undelete-header": "Jwıqtağı joýılğan better jöninde [[{{#special:Log}}/delete|joyw jwrnalın]] qarañız.",
        "revdelete-restricted": "äkimşilerge tïımdar qoldadı",
        "revdelete-unrestricted": "äkimşilerden tïımdardı alastadı",
        "rightsnone": "(eşqandaý)",
-       "revdelete-summary": "öñdemeniñ qısqaşa mazmundaması",
        "expandtemplates": "Ülgilerdi ulğaýtw",
        "expand_templates_intro": "Osı qural arnaýı beti äldebir mätindi aladı da,\nbunıñ işindegi barlıq kiriktelgen ülgilerdi meýlinşe ulğaýtadı.\nMına <nowiki>{{</nowiki>#language:...}} sïyaqtı jöñdetw fwnkcïyaların da, jäne <nowiki>{{</nowiki>CURRENTDAY}}\nsïyaqtı aýnamalıların da ulğaýtadı (naqtı aýtqanda, qos qabat sadaq jaqşalar arasındağı barlığın).\nBunı öz MediaWiki bağdarlamasınan qatıstı jöñdetw satın şaqırıp istelinedi.",
        "expand_templates_title": "Mätin aralıq atawı ({{FULLPAGENAME}} t.b. better üşin):",
index dd10a35..4b89a56 100644 (file)
        "rcshowhideanons": "$1 atuisut anonymejusut",
        "rcshowhidepatr": "$1 allannguutit misissorneqarsimasut",
        "rcshowhidemine": "$1 nammineq tapit",
-       "rclinks": "Takutikkit $1 -it allannguutit kingulliit ulluni kingullerni $2 -ni<br />$3",
+       "rclinks": "Takutikkit $1 -it allannguutit kingulliit ulluni kingullerni $2 -ni",
        "diff": "assigiinng",
        "hist": "oqalutt",
        "hide": "Assequt",
index 89564eb..1ef84c4 100644 (file)
@@ -16,7 +16,8 @@
                        "វ័ណថារិទ្ធ",
                        "아라",
                        "Macofe",
-                       "Dcljr"
+                       "Dcljr",
+                       "Aefgh39622"
                ]
        },
        "tog-underline": "គូសបន្ទាត់ក្រោម​តំណភ្ជាប់៖",
@@ -43,7 +44,7 @@
        "tog-enotifminoredits": "ផ្ញើអ៊ីមែល​មកខ្ញុំពេលមានបន្លាស់ប្ដូរតិចតួច​លើទំព័រឬឯកសារផងដែរ​",
        "tog-enotifrevealaddr": "បង្ហាញ​អាសយដ្ឋានអ៊ីមែល​របស់ខ្ញុំ​ក្នុង​​អ៊ីមែល​ក្រើនរំលឹក​",
        "tog-shownumberswatching": "បង្ហាញ​ចំនួនអ្នកប្រើប្រាស់​ដែលតាមដាន​ទំព័រនេះ",
-       "tog-oldsig": "ហត្ថលេខាមានហើយ៖",
+       "tog-oldsig": "á\9e á\9e\8fá\9f\92á\9e\90á\9e\9bá\9f\81á\9e\81á\9e¶á\9e\8aá\9f\82á\9e\9bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e¶á\9e\93á\9e á\9e¾á\9e\99á\9f\96",
        "tog-fancysig": "ចុះហត្ថលេខា​ជា​អត្ថបទវិគី​ (ដោយ​គ្មានតំណភ្ជាប់​ស្វ័យប្រវត្តិ)",
        "tog-uselivepreview": "ប្រើប្រាស់​ការមើលមុនរហ័ស",
        "tog-forceeditsummary": "សូមរំលឹកខ្ញុំ​កាលបើខ្ញុំទុកប្រអប់ចំណារពន្យល់ឱ្យនៅទំនេរ",
@@ -59,7 +60,7 @@
        "tog-showhiddencats": "បង្ហាញចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានលាក់",
        "tog-norollbackdiff": "បំភ្លេច​ភាព​ខុស​គ្នា​បន្ទាប់​ពី​អនុវត្តការ​ស្ដារវិញ",
        "tog-useeditwarning": "សូមព្រមាន​ខ្ញុំ​ ពេលដែលខ្ញុំ​ចាកចេញ​ពី​ទំព័រ​កែប្រែដោយមិន​បានរក្សា​ទុកបន្លាស់ប្ដូរ​នានា​",
-       "tog-prefershttps": "ប្រើប្រាស់ការតភ្ជាប់មានសុវត្ថិភាពជានិច្ចពេលកត់ឈ្មោះចូល",
+       "tog-prefershttps": "á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\80á\9e¶á\9e\9aá\9e\8fá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\9fá\9e»á\9e\9cá\9e\8fá\9f\92á\9e\90á\9e·á\9e\97á\9e¶á\9e\96á\9e\87á\9e¶á\9e\93á\9e·á\9e\85á\9f\92á\9e\85á\9e\96á\9f\81á\9e\9bá\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9b",
        "underline-always": "ជានិច្ច",
        "underline-never": "កុំឲ្យសោះ",
        "underline-default": "តាមលំនាំដើមនៃ​កម្មវិធី​រុករក​",
        "morenotlisted": "បញ្ជីនេះមិនទាន់ពេញលេញទេ។",
        "mypage": "ទំព័រ​",
        "mytalk": "ការពិភាក្សា​",
-       "anontalk": "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8b IP á\9e\93á\9f\81á\9f\87",
+       "anontalk": "á\9e\80á\9e¶á\9e\9aâ\80\8bá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e",
        "navigation": "ការណែនាំ",
        "and": "&#32;និង",
        "qbfind": "ស្វែងរក",
        "externaldberror": "មាន​​បញ្ហាក្នុងការ​បញ្ជាក់​ផ្ទៀង​ផ្ទាត់​​មូលដ្ឋាន​ទិន្នន័យ​ ឬ​អ្នក​មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​បន្ទាន់​សម័យ​គណនី​ខាង​ក្រៅ​របស់​អ្នក​។​\n​",
        "login": "កត់ឈ្មោះចូល",
        "nav-login-createaccount": "កត់ឈ្មោះចូលឬបង្កើតគណនី",
-       "userlogin": "កត់ឈ្មោះចូលឬបង្កើតគណនី",
-       "userloginnocreate": "កត់ឈ្មោះចូល",
        "logout": "កត់ឈ្មោះចេញ",
        "userlogout": "កត់ឈ្មោះចេញ",
        "notloggedin": "មិនទាន់កត់ឈ្មោះចូល",
        "userlogin-noaccount": "តើលោកអ្នក​មិនទាន់មាន​គណនី​សម្រាប់​ប្រើ​ទេ​ឬ?",
        "userlogin-joinproject": "សូមចូលជាសមាជិក {{SITENAME}}",
-       "nologin": "​បើលោកអ្នក​មិនទាន់មាន​គណនី​សម្រាប់​ប្រើ​ទេ​ សូម'''$1''' ។",
-       "nologinlink": "បង្កើតគណនី",
        "createaccount": "បង្កើតគណនី",
-       "gotaccount": "បើលោកអ្នកមានគណនីសម្រាប់ប្រើហើយ  សូម'''$1'''។",
-       "gotaccountlink": "កត់ឈ្មោះចូល",
-       "userlogin-resetlink": "តើអ្នកភ្លេចព័ត៌មានលម្អិតសម្រាប់កត់ឈ្មោះចូលហើយ?",
        "userlogin-resetpassword-link": "អ្នកភ្លេចពាក្យសម្ងាត់ហើយ?",
        "userlogin-helplink2": "ជំនួយលើការកត់ឈ្មោះចូល",
        "userlogin-loggedin": "អ្នកបានកត់ឈ្មោះចូលជា {{GENDER:$1|$1}} ហើយ។\nប្រើសំណុំបែបបទខាងក្រោមដើម្បីកត់ឈ្មោះចូលជាអ្នកប្រើប្រាស់ផ្សេងម្នាក់ទៀត។",
        "createacct-another-email-ph": "បញ្ចូលអាសយដ្ឋានអ៊ីមែល",
        "createaccountmail": "ប្រើប្រាស់ពាក្យសម្ងាត់ចៃដន្យបណ្ដោះអាសនុ្ន រួចផ្ញើវាទៅកាន់អាសយដ្ឋានអ៊ីមែលខាងក្រោម",
        "createacct-realname": "ឈ្មោះពិត (ដាក់ក៏បានមិនដាក់ក៏បាន)",
-       "createaccountreason": "មូលហេតុ៖",
        "createacct-reason": "មូលហេតុ",
        "createacct-reason-ph": "មូលហេតុដែលអ្នកចង់បង្កើតគណនីមួយទៀត",
        "createacct-submit": "បង្កើតគណនីរបស់អ្នក",
        "nocookieslogin": "{{SITENAME}}ប្រើខូឃីដើម្បីកត់ឈ្មោះចូល។\n\nអ្នកបានជ្រើសមិនប្រើខូឃី។​\n\nសូមជ្រើសប្រើខូឃីវិញ រួចព្យាយាមម្តងទៀត។",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "អ្នកមិនបានផ្ដល់អត្តនាមត្រឹមត្រូវទេ។",
-       "loginsuccesstitle": "á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\9fá\9e\98á\9f\92á\9e\9aá\9f\81á\9e\85",
+       "loginsuccesstitle": "á\9e\94á\9e¶á\9e\93á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e á\9e¾á\9e\99",
        "loginsuccess": "'''ពេលនេះអ្នកបានកត់ឈ្មោះចូល{{SITENAME}}ដោយប្រើឈ្មោះ \"$1\"ហើយ។'''",
        "nosuchuser": "មិនមានអ្នកប្រើដែលមានឈ្មោះ \"$1\" ទេ។\n\nសូម​ពិនិត្យ​ក្រែង​លោ​មានកំហុស​អក្ខរាវិរុទ្ធឬ [[Special:CreateAccount|បង្កើត​គណនី​ថ្មី]]។",
        "nosuchusershort": "គ្មានអ្នកប្រើដែលមានឈ្មោះ $1\" ទេ។\n\nសូម​ពិនិត្យ​​អក្ខរាវិរុទ្ធ​របស់អ្នក ។",
        "newpassword": "ពាក្យសម្ងាត់ថ្មី៖",
        "retypenew": "សូមវាយពាក្យសម្ងាត់ថ្មី​ម្តងទៀត៖",
        "resetpass_submit": "ដាក់ប្រើពាក្យសម្ងាត់និង​កត់ឈ្មោះចូល",
-       "changepassword-success": "á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\94á\9e¶á\9e\93á\9e\9fá\9f\86á\9e\9aá\9f\81á\9e\85á\9e á\9e¾á\9e\99!",
+       "changepassword-success": "ពាក្យសម្ងាត់របស់អ្នកត្រូវបានផ្លាស់ប្តូរហើយ!",
        "changepassword-throttled": "អ្នកបានព្យាយាមកត់ឈ្មោះចូលជាប់ៗគ្នាច្រើនដងពេកហើយ។​\nសូមរង់ចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។",
        "resetpass_forbidden": "ពាក្យសម្ងាត់មិនអាចផ្លាស់ប្តូរបានទេ",
        "resetpass-no-info": "អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។",
        "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បំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
        "minoredit": "នេះជា​កំណែប្រែតិចតួចប៉ុណ្ណោះ",
        "watchthis": "តាមដាន​ទំព័រនេះ",
        "savearticle": "រក្សាទំព័រទុក",
+       "savechanges": "រក្សាទុកបន្លាស់ប្ដូរ",
+       "publishpage": "ផ្សព្វផ្សាយទំព័រ",
+       "publishchanges": "ផ្សព្វផ្សាយការផ្លាស់ប្តូរ",
        "preview": "មើលជាមុន",
        "showpreview": "បង្ហាញ​ការមើលជាមុន",
        "showdiff": "បង្ហាញ​បន្លាស់ប្ដូរ",
-       "blankarticle": "<strong>ប្រយ័ត្ន៖</strong> ទំព័រដែលអ្នកកំពុងបង្កើតជាទំព័រទទេ។\nបើសិនជាអ្នកចុច \"{{int:savearticle}}\" ម្ដងទៀត ទំព័រនេះនឹងត្រូវរក្សាទុកដោយគ្មានខ្លឹមសារខាងក្នុង។",
+       "blankarticle": "<strong>ប្រយ័ត្ន៖</strong> ទំព័រដែលអ្នកកំពុងបង្កើតជាទំព័រទទេ។\nបើសិនជាអ្នកចុច \"$1\" ម្ដងទៀត ទំព័រនេះនឹងត្រូវរក្សាទុកដោយគ្មានខ្លឹមសារខាងក្នុង។",
        "anoneditwarning": "'''ប្រយ័ត្ន ៖''' អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ អាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។ បើសិនជាអ្នក <strong>[$1 កត់ឈ្មោះចូល]</strong> ឬ <strong>[$2 បង្កើតគណនី]</strong> នោះការកែប្រែរបស់អ្នកនឹងត្រូវភ្ចាប់ជាមួយអត្តនាមរបស់អ្នកផង នឹងមានផលប្រយោជន៍ផ្សេងទៀតផង។",
        "anonpreviewwarning": "<em>អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ ប្រសិនបើអ្នកធ្វើការរក្សាទុក នោះអាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។</em>",
        "missingsummary": "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ចំណារពន្យល់អំពីកំណែប្រែនេះទេ។\n\nបើសិនជាអ្នកចុច '''រក្សាទុក''' ម្ដងទៀតនោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានចំណារពន្យល់។",
-       "selfredirect": "<strong>ប្រយ័ត្ន៖</strong> អ្នកកំពុងតែបញ្ជូនបន្តទំព័រនេះទៅកាន់ទំព័រខ្លួនឯង។\n\nប្រហែលជាអ្នកបានផ្ដល់ទំព័រគោលដៅសម្រាប់បញ្ជូនបន្តខុខ ឬប្រហែលជាអ្នកកំពុងកែប្រែទំព័រខុស។\nបើសិនជាអ្នកចុច \"{{int:savearticle}}\" ម្ដងទៀត តំណភ្ជាប់បញ្ជូនបន្តនឹងត្រូវបង្កើតឡើងបែបនេះ។",
+       "selfredirect": "<strong>ប្រយ័ត្ន៖</strong> អ្នកកំពុងតែបញ្ជូនបន្តទំព័រនេះទៅកាន់ទំព័រខ្លួនឯង។\n\nប្រហែលជាអ្នកបានផ្ដល់ទំព័រគោលដៅសម្រាប់បញ្ជូនបន្តខុខ ឬប្រហែលជាអ្នកកំពុងកែប្រែទំព័រខុស។\nបើសិនជាអ្នកចុច \"$1\" ម្ដងទៀត តំណភ្ជាប់បញ្ជូនបន្តនឹងត្រូវបង្កើតឡើងបែបនេះ។",
        "missingcommenttext": "សូមវាយបញ្ចូលយោបល់មួយនៅខាងក្រោម។",
-       "missingcommentheader": "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ប្រធានបទរបស់មតិយោបល់នេះទេ។\nបើសិនជាអ្នកចុច \"{{int:savearticle}}\" ម្ដងទៀត នោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានវា។",
+       "missingcommentheader": "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ប្រធានបទរបស់មតិយោបល់នេះទេ។\nបើសិនជាអ្នកចុច \"$1\" ម្ដងទៀត នោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានវា។",
        "summary-preview": "ការមើលជាមុនរបស់ចំណារពន្យល់:",
        "subject-preview": "ការមើលជាមុនរបស់ប្រធានបទ៖",
        "previewerrortext": "មានបញ្ហាកើតឡើងពេលព្យាយាមើលជាមុនបន្លាស់ប្ដូររបស់អ្នក។",
        "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-editsemiprotected": "កែប្រែទំព័រដែលបានការពារដោយ \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "កែប្រែខ្លឹមសារគំរូរបស់ទំព័រមួយ",
        "right-editinterface": "កែប្រែអន្តរមុខអ្នកប្រើប្រាស់",
-       "right-editusercssjs": "កែប្រែឯកសារ CSS និង JS របស់អ្នកប្រើប្រាស់ផ្សេងទៀត",
        "right-editusercss": "កែប្រែឯកសារ CSS របស់អ្នកប្រើប្រាស់ផ្សេងទៀត",
        "right-edituserjs": "កែប្រែឯកសារ JavaScript របស់អ្នកប្រើប្រាស់ផ្សេងទៀត",
        "right-editmyusercss": "កែប្រែឯកសារ CSS របស់ខ្លួនអ្នកផ្ទាល់",
        "right-siteadmin": "ចាក់សោនិងបើកសោមូលដ្ឋានទិន្នន័យ",
        "right-override-export-depth": "នាំចេញទំព័ររួមទាំងទំព័រដែលមានភ្ជាប់តំណភ្ជាប់​រហូតដល់លំដាប់ទី៥",
        "right-sendemail": "ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើដទៃ",
-       "right-passwordreset": "មើលអ៊ីមែលសំរាប់កំណត់ពាក្យសម្ងាត់ឡើងវិញ",
        "newuserlogpage": "កំណត់ហេតុនៃការបង្កើតគណនី",
        "newuserlogpagetext": "នេះជាកំណត់ហេតុនៃការបង្កើតអ្នកប្រើប្រាស់។",
        "rightslog": "កំណត់ហេតុនៃការប្តូរសិទ្ធិអ្នកប្រើប្រាស់",
        "rightslogtext": "នេះ​ជា​កំណត់ហេតុនៃបំលាស់ប្ដូរចំពោះកាប្ដូរក្រុមសមាជិកភាព​របស់​អ្នកប្រើប្រាស់។",
        "action-read": "អានទំព័រនេះ",
        "action-edit": "កែប្រែទំព័រនេះ",
-       "action-createpage": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9e¶á\9e\93á\9e",
-       "action-createtalk": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\93á\9e¶á\9e\93á\9e",
+       "action-createpage": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87",
+       "action-createtalk": "á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\97á\9e¶á\9e\80á\9f\92á\9e\9fá\9e¶á\9e\93á\9f\81á\9f\87",
        "action-createaccount": "បង្កើតគណនីអ្នកប្រើប្រាស់នេះ",
        "action-history": "មើលប្រវត្តិទំព័រនេះ",
        "action-minoredit": "ចំណាំកំណែប្រែនេះថាជាកំណែប្រែតិចតួច",
        "rcshowhidemine-hide": "លាក់",
        "rcshowhidecategorization-show": "បង្ហាញ​",
        "rcshowhidecategorization-hide": "លាក់",
-       "rclinks": "បង្ហាញបន្លាស់ប្ដូរ$1ចុងក្រោយធ្វើឡើងក្នុងរយៈពេល$2ថ្ងៃចុងក្រោយ<br />$3",
+       "rclinks": "បង្ហាញបន្លាស់ប្ដូរ$1ចុងក្រោយធ្វើឡើងក្នុងរយៈពេល$2ថ្ងៃចុងក្រោយ",
        "diff": "ប្រៀបធៀប",
        "hist": "ប្រវត្តិ",
        "hide": "លាក់",
        "undeleteviewlink": "មើល",
        "undeleteinvert": "ក្រៅពីនោះ",
        "undeletecomment": "មូលហេតុ៖",
-       "undeletedrevisions": "បានស្តារឡើងវិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}",
-       "undeletedrevisions-files": "បានស្តារឡើងវិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}និង{{PLURAL:$2|១ឯកសារ|$2ឯកសារ}}",
-       "undeletedfiles": "{{PLURAL:$1|១ ឯកសារ|$1 ឯកសារ}} ត្រូវបានស្ដារឡើងវិញ",
        "cannotundelete": "ឈប់លុបមិនសម្រេច៖​$1",
        "undeletedpage": "'''$1 ត្រូវបានស្តារឡើងវិញហើយ'''\n\nសូម​ចូល​ទៅ [[Special:Log/delete|កំណត់ហេតុ​នៃ​ការលុប]] ដើម្បី​ពិនិត្យ​មើល​កំណត់ត្រា​នៃ​ការលុប​និង​ការ​ស្ដារ​ឡើង​វិញ​។",
        "undelete-header": "មើលទំព័រដែលត្រូវបានលុបចោលថ្មីៗក្នុង[[Special:Log/delete|កំណត់ហេតុនៃការលុបចោល]]។",
        "anonymous": "{{PLURAL:$1|user|អ្នកប្រើប្រាស់}}អនាមិកនៃ {{SITENAME}}",
        "siteuser": "អ្នកប្រើប្រាស់{{SITENAME}} $1",
        "anonuser": "អ្នកប្រើប្រាស់{{SITENAME}}អនាមិក $1",
-       "lastmodifiedatby": "ទំព័រនេះត្រូវបានប្តូរចុងក្រោយដោយ$3នៅវេលា$2,$1។",
+       "lastmodifiedatby": "ទំព័រនេះត្រូវបានប្តូរចុងក្រោយដោយ $3 នៅវេលា $2,$1។",
        "othercontribs": "ផ្អែកលើការងាររបស់$1។",
        "others": "ផ្សេងៗទៀត",
        "siteusers": "{{PLURAL:$2|អ្នកប្រើប្រាស់|អ្នកប្រើប្រាស់}} {{SITENAME}} $1",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|ត្រូវបានតំឡើង}}សមាជិកភាពពី $4 ជា $5 ដោយស្វ័យប្រវត្តិ",
        "logentry-upload-upload": "$1 {{GENDER:$2|បានផ្ទុកឡើង}} $3",
        "rightsnone": "(ទទេ)",
-       "revdelete-summary": "កែប្រែចំណារពន្យល់",
        "feedback-adding": "កំពុងបន្ថែមមតិយោបល់ទៅលើទំព័រ...",
        "feedback-cancel": "បោះបង់​",
        "feedback-close": "រួចរាល់",
        "feedback-thanks-title": "សូមអរគុណ!",
        "searchsuggest-search": "ស្វែងរក​",
        "searchsuggest-containing": "ដែលមានពាក្យ...",
-       "api-error-badaccess-groups": "អ្នកគ្មានការអនុញ្ញាតអោយផ្ទុកឯកសារឡើងទៅក្នុងវិគីនេះទេ។",
-       "api-error-empty-file": "ឯកសារដែលអ្នកបានដាក់ស្នើគឺទទេ។",
        "api-error-emptypage": "ការអនុញ្ញាតអោយបង្កើតទំព័រថ្មីដែលគ្មានសរសេរអ្វីទេ",
-       "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-http": "បញ្ហាខាងក្នុង៖ មិនអាចភ្ជាប់ទោកាន់ម៉ាស៊ីនបំរើការ។",
-       "api-error-illegal-filename": "មិនអនុញ្ញាតអោយប្រើឈ្មោះឯកសារនេះ។",
-       "api-error-internal-error": "បញ្ហាខាងក្នុង៖ មានបញ្ហាណាមួយកើតឡើងពេលកំពុងដំណើរការផ្ទុកឯកសារអ្នកឡើងទៅក្នុងវិគី។",
-       "api-error-missingresult": "បញ្ហាខាងក្នុង៖ មិនអាចកំណត់បានថាការថតចំលងបានសំរេចទេ។",
-       "api-error-mustbeloggedin": "អ្នកត្រូវតែកត់ឈ្មោះចូលដើម្បីផ្ទុកឯកសារឡើង។",
-       "api-error-ok-but-empty": "បញ្ហាខាងក្នុង៖ គ្មានចម្លើយពីម៉ាស៊ីនបម្រើការ។",
-       "api-error-overwrite": "មិនអនុញ្ញាតអោយសរសេរជាន់ពីលើឯកសារដែលមានស្រាប់ហើយ។",
-       "api-error-timeout": "ម៉ាស៊ីនបំរើការមិនបានឆ្លើយតបក្នុងរយៈពេលដែលយើងរំពឹងទុក។",
-       "api-error-unclassified": "បញ្ហាមិនស្គាល់មួយបានកើតឡើង។",
-       "api-error-unknown-code": "បញ្ហាមិនស្គាល់៖ \"$1\" ។",
-       "api-error-unknown-error": "បញ្ហាខាងក្នុង៖ មានបញ្ហាមិនស្រួលពេលកំពុងព្យាយាមផ្ទុកឯកសាររបស់អ្នកឡើង។",
        "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 c3926de..435bae0 100644 (file)
@@ -29,7 +29,9 @@
                        "Macofe",
                        "రహ్మానుద్దీన్",
                        "ಶಿವಕುಮಾರ್ ನಾಯಕ್",
-                       "Yogesh"
+                       "Yogesh",
+                       "Lokesha kunchadka",
+                       "Anoop rao"
                ]
        },
        "tog-underline": "ಕೊಂಡಿಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
        "tog-showtoolbar": "ಸಂಪಾದನೆಯ ಉಪಕರಣಗಳ ಪಟ್ಟಿಯನ್ನು ತೋರು",
        "tog-editondblclick": "ಎರಡು ಬಾರಿ ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ಪುಟವು ಸಂಪಾದಿಸುವಂತಾಗಲಿ",
        "tog-editsectiononrightclick": "ಪುಟದ ವಿಭಾಗಗಳನ್ನು ಅವುಗಳ ಶೀರ್ಷಿಕೆಯನ್ನು ಎರಡು ಬಾರಿ ಕ್ಲಿಕ್ ಮಾಡಿ ಸಂಪಾದನೆ ಮಾಡುವಂತೆ ಇರಲಿ",
-       "tog-watchcreations": "ನಾನು ಪ್ರಾರಂಭಿಸುವ ಲೇಖನಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು",
-       "tog-watchdefault": "ನಾನು ಸಂಪಾದಿಸುವ ಪುಟಗಳನ್ನು ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು",
-       "tog-watchmoves": "ನಾನು ಸ್ಥಳಾಂತರಿಸುವ ಪುಟಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು",
-       "tog-watchdeletion": "ನಾನು ಅಳಿಸುವ ಪುಟಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾ ಪಟ್ಟಿಗೆ ಸೇರಿಸು",
+       "tog-watchcreations": "ನಾನà³\81 à²ªà³\8dರಾರà²\82ಭಿಸà³\81ವ à²²à³\87à²\96ನà²\97ಳನà³\8dನà³\81 à²®à²¤à³\8dತà³\81 à²\95ಡತà²\97ಳನà³\8dನà³\81 à²¨à²¨à³\8dನ à²µà³\80à²\95à³\8dಷಣಾಪà²\9fà³\8dà²\9fಿà²\97à³\86 à²¸à³\87ರಿಸà³\81",
+       "tog-watchdefault": "ನಾನà³\81 à²¸à²\82ಪಾದಿಸà³\81ವ à²ªà³\81à²\9fà²\97ಳನà³\8dನà³\81 à²®à²¤à³\8dತà³\81 à²\95ಡತà²\97ಳನà³\8dನà³\81 à²µà³\80à²\95à³\8dಷಣಾಪà²\9fà³\8dà²\9fಿà²\97à³\86 à²¸à³\87ರಿಸà³\81",
+       "tog-watchmoves": "ನಾನà³\81 à²¸à³\8dಥಳಾà²\82ತರಿಸà³\81ವ à²ªà³\81à²\9fà²\97ಳನà³\8dನà³\81 à²®à²¤à³\8dತà³\81 à²\95ಡತà²\97ಳನà³\8dನà³\81 à²¨à²¨à³\8dನ à²µà³\80à²\95à³\8dಷಣಾಪà²\9fà³\8dà²\9fಿà²\97à³\86 à²¸à³\87ರಿಸà³\81",
+       "tog-watchdeletion": "ನಾನà³\81 à²\85ಳಿಸà³\81ವ à²ªà³\81à²\9fà²\97ಳನà³\8dನà³\81 à²®à²¤à³\8dತà³\81 à²\95ಡತà²\97ಳನà³\8dನà³\81 à²¨à²¨à³\8dನ à²µà³\80à²\95à³\8dಷಣಾ à²ªà²\9fà³\8dà²\9fಿà²\97à³\86 à²¸à³\87ರಿಸà³\81",
        "tog-watchuploads": "ನಾನು ಹೊಸದಾಗಿ ಅಪ್‍ಲೋಡ್ ಮಾಡಿದ ಫೈಲ್‍ಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು",
        "tog-watchrollback": "ನಾನು ಹಿಮ್ಮರಳುವಿಕೆಯನ್ನು ನಡೆಸಿದ ಪುಟಗಳನ್ನು ನನ್ನ ಗಮನಸೂಚಿಗೆ ಸೇರಿಸು",
        "tog-minordefault": "ನನ್ನ ಎಲ್ಲಾ ಸಂಪಾದನೆಗಳನ್ನು ಚುಟುಕಾದವು ಎಂದು ಗುರುತು ಮಾಡು",
@@ -58,7 +60,7 @@
        "tog-enotifrevealaddr": "ಪ್ರಕಟಣೆ ಇ-ಅಂಚೆಗಳಲ್ಲಿ ನನ್ನ ಇ-ಅಂಚೆ ವಿಳಾಸ ತೋರು",
        "tog-shownumberswatching": "ಪುಟವನ್ನು ವೀಕ್ಷಿಸುತ್ತಿರುವ ಸದಸ್ಯರ ಸಂಖ್ಯೆಯನ್ನು ತೋರಿಸು",
        "tog-oldsig": "ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಸಹಿ",
-       "tog-fancysig": "ಸರಳ à²¸à²¹à²¿à²\97ಳà³\81 (à²\95à³\8aà²\82ಡಿ à²\87ಲà³\8dಲದಿರà³\81ವà²\82ತೆ)",
+       "tog-fancysig": "ಸಹಿà²\97ಳನà³\8dನà³\81 à²µà²¿à²\95ಿà²\9fà³\86à²\95à³\8dಸà³\8d à²\8eà²\82ದà³\81 à²ªà²°à²¿à²\97ಣಿಸಿ (ಸà³\8dವಯà²\82à²\9aಾಲಿತ à²²à²¿à²\82à²\95à³\8d à²\87ಲà³\8dಲದೆ)",
        "tog-uselivepreview": "ನೇರ ಮುನ್ನೋಟವನ್ನು ಉಪಯೋಗಿಸಿ",
        "tog-forceeditsummary": "ಸಂಪಾದನೆ ಸಾರಾಂಶವನ್ನು ಖಾಲಿ ಬಿಟ್ಟಲ್ಲಿ ನೆನಪಿಸು",
        "tog-watchlisthideown": "ವೀಕ್ಷಣಾ ಪಟ್ಟಿಯಲ್ಲಿ ನನ್ನ ಸಂಪಾದನೆಗಳನ್ನು ತೋರಿಸಬೇಡ",
        "tog-watchlisthideliu": "ಲಾಗ್ ಇನ್ ಆಗಿರುವ ಸದಸ್ಯರ ಸಂಪಾದನೆಗಳನ್ನು ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ ಅಡಗಿಸು",
        "tog-watchlistreloadautomatically": "ಯಾವುದೇ ಫಿಲ್ಟರು ಬದಲಾದಾಗ ವೀಕ್ಷಣಾಪಟ್ಟಿ ಮತ್ತೆ ಲೋಡ್ ಆಗಲಿ (ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಇರಬೇಕು)",
        "tog-watchlisthideanons": "ಅನಾಮಧೇಯ ಬಳಕೆದಾರರ ಸಂಪಾದನೆಗಳನ್ನು ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ ಅಡಗಿಸು",
-       "tog-watchlisthidepatrolled": "ವà³\80à²\95à³\8dಷಣಾ à²ªà²¤à³\8dತಿಯಲà³\8dಲಿ à²¹à²¸à³\8dತà³\81à²\95ದರà³\8d ಬದಲಾವಣೆಗಳನ್ನು ಅದಗಿಸು",
+       "tog-watchlisthidepatrolled": "ವà³\80à²\95à³\8dಷಣಾ à²ªà²\9fà³\8dà²\9fಿಯಲà³\8dಲಿ à²\97ಸà³\8dತà³\81 à²¤à²¿à²°à³\81à²\97ಿದ ಬದಲಾವಣೆಗಳನ್ನು ಅದಗಿಸು",
        "tog-watchlisthidecategorization": "ಪುಟಗಳ ವರ್ಗೀಕರಣವನ್ನು ಅಡಗಿಸು",
        "tog-ccmeonemails": "ಇತರರಿಗೆ ನಾನು ಕಳುಹಿಸುವ ಇ-ಅಂಚೆಯ ಪ್ರತಿಯನ್ನು ನನಗೂ ಕಳುಹಿಸು",
        "tog-diffonly": "ವ್ಯತ್ಯಾಸಗಳ ಕೆಳಗಿರುವ ಪುಟದ ವಿವರಗಳನ್ನು ತೋರಿಸಬೇಡ",
        "tog-showhiddencats": "ಅಡಗಿಸಲ್ಪಟ್ಟ ವರ್ಗಗಳನ್ನು ತೋರಿಸು",
-       "tog-norollbackdiff": "ತà³\8aಡà³\86ದà³\81ಹಾà²\95ಿದ ನಂತರ ವ್ತ್ಯತ್ಯಾಸವನ್ನು ತೋರಿಸಬೇಡ",
+       "tog-norollbackdiff": "ಹಿಮà³\8dಮರಳà³\81ವಿà²\95à³\86ಯ ನಂತರ ವ್ತ್ಯತ್ಯಾಸವನ್ನು ತೋರಿಸಬೇಡ",
        "tog-useeditwarning": "ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸದೆ ಹೊರಟಲ್ಲಿ ನನಗೆ ಎಚ್ಚರಿಸು",
        "tog-prefershttps": "ಯಾವತ್ತು ಸಹ ಲಾಗಿನ್ ನಂತರ ಸುರಕ್ಷಿತ ಸಂಪರ್ಕವನ್ನು ಬಳಸಿ",
        "underline-always": "ಯಾವಾಗಲೂ",
        "underline-never": "ಎಂದಿಗೂ ಇಲ್ಲ",
        "underline-default": "ಬ್ರೌಸರ್‍ನ ಯಥಾಸ್ಥಿತಿ",
        "editfont-style": "ಬದಲಾಣೆಯ ಜಾಗಾದ ಬರಿಯುವ ಶೈಲ",
-       "editfont-default": "ಬà³\8dರà³\8cಸರದ ಯಥಾಸ್ಥಿತಿ",
-       "editfont-monospace": "à²\92à²\82ದà³\81ಸà³\8dಥಳದ ಮುದ್ರಲಿಪಿ",
+       "editfont-default": "ಬà³\8dರà³\8cಸರà³\8dâ\80\8dನ ಯಥಾಸ್ಥಿತಿ",
+       "editfont-monospace": "ಮà³\8aನà³\8aಸà³\8dಪà³\87ಸà³\8d ಮುದ್ರಲಿಪಿ",
        "editfont-sansserif": "ಸಾನ್ಸ್-ಸೆರಿಫ಼್ ಮುದ್ರಲಿಪಿ",
        "editfont-serif": "ಸೆರಿಫ಼್ ಮುದ್ರಲಿಪಿ",
        "sunday": "ಭಾನುವಾರ",
        "hidden-categories": "{{PLURAL:$1|ಅಡಗಿಸಲ್ಪಟ್ಟ ವರ್ಗ|ಅಡಗಿಸಲ್ಪಟ್ಟ ವರ್ಗಗಳು}}",
        "hidden-category-category": "ಅಡಗಿಸಲ್ಪಟ್ಟಿರುವ ವರ್ಗಗಳು",
        "category-subcat-count": "{{PLURAL:$2|ಈ ವರ್ಗದಲ್ಲಿ ಈ ಕೆಳಗಿನ ಉಪವರ್ಗ ಇದೆ.|ಈ ವರ್ಗದಲ್ಲಿ ಈ ಕೆಳಗಿನ {{PLURAL:$1|ಉಪವರ್ಗವನ್ನು|$1 ಉಪವರ್ಗಗಳನ್ನು}} ಸೇರಿಸಿ, ಒಟ್ಟು $2 ಇವೆ.}}",
-       "category-subcat-count-limited": "ಈ ವರ್ಗದಲ್ಲಿ ಕೆಳಗೆ ತೋರಿಸಿರುವ {{PLURAL:$1|ಉಪವರ್ಗ|$1 ಉಪವರ್ಗಗಳು}} ಇವೆ.",
+       "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 ಇವೆ.}}",
        "navigation": "ಸಂಚರಣೆ",
        "and": "&#32;ಮತ್ತು",
        "qbfind": "ಹುಡುಕು",
-       "qbbrowse": "ವಿಹರಿಸು",
+       "qbbrowse": "à²\95ಣà³\8dಣಾಡಿಸು",
        "qbedit": "ಸಂಪಾದಿಸು",
        "qbpageoptions": "ಈ ಪುಟ",
        "qbmyoptions": "ನನ್ನ ಪುಟಗಳು",
        "faqpage": "Project:ಸಾಮಾನ್ಯವಾಗಿ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು",
        "actions": "ಕ್ರಿಯೆಗಳು",
        "namespaces": "ನಾಮವರ್ಗಗಳು",
-       "variants": "ವà³\8dಯತà³\8dಯಾಸ à²¹à³\8aà²\82ದಿರà³\81ವ",
+       "variants": "ರà³\82ಪಾà²\82ತರà²\97ಳà³\81",
        "navigation-heading": "ಸಂಚರಣೆ ಪಟ್ಟಿ",
        "errorpagetitle": "ದೋಷ",
        "returnto": "$1 ಗೆ ಹಿಂತಿರುಗಿ.",
        "searcharticle": "ಹೋಗು",
        "history": "ಪುಟದ ಇತಿಹಾಸ",
        "history_short": "ಇತಿಹಾಸ",
+       "history_small": "ಇತಿಹಾಸ",
        "updatedmarker": "ನನ್ನ ಕೊನೆಯ ವೀಕ್ಷಣೆಯ ನಂತರ ಬದಲಾಗಿರುವವು",
-       "printableversion": "ಪà³\8dರಿà²\82à²\9fà³\8d ಆವೃತ್ತಿ",
+       "printableversion": "ಮà³\81ದà³\8dರಣ ಆವೃತ್ತಿ",
        "permalink": "ಸ್ಥಿರ ಕೊಂಡಿ",
        "print": "ಮುದ್ರಿಸು",
        "view": "ನೋಟ",
        "deletethispage": "ಈ ಪುಟವನ್ನು ಅಳಿಸಿ",
        "undeletethispage": "ಈ ಪುಟವನ್ನು ಅಳಿಸುವಿಕೆಯನ್ನು ರದ್ದುಮಾಡು",
        "undelete_short": "{{PLURAL:$1|ಒಂದು ಸಂಪಾದನೆಯ|$1 ಸಂಪಾದನೆಗಳ}} ಅಳಿಸುವಿಕೆಯನ್ನು ತೊಡೆದುಹಾಕು",
-       "viewdeleted_short": "ನà³\8bà²\9f {{PLURAL:$1|೧ ಅಳಿಸಲ್ಪಟ್ಟ ಸಂಪಾದನೆ|$1 ಅಳಿಸಲ್ಪಟ್ಟ ಸಂಪಾದನೆಗಳು}}",
+       "viewdeleted_short": "ನà³\8bà²\9f {{PLURAL:$1|à²\92à²\82ದà³\81 ಅಳಿಸಲ್ಪಟ್ಟ ಸಂಪಾದನೆ|$1 ಅಳಿಸಲ್ಪಟ್ಟ ಸಂಪಾದನೆಗಳು}}",
        "protect": "ಸಂರಕ್ಷಿಸು",
        "protect_change": "ಬದಲಾಯಿಸು",
        "protectthispage": "ಈ ಪುಟವನ್ನು ಸಂರಕ್ಷಿಸಿ",
        "talk": "ಚರ್ಚೆ",
        "views": "ನೋಟಗಳು",
        "toolbox": "ಉಪಕರಣಗಳು",
+       "tool-link-userrights": "{{GENDER:$1|ಬಳಕೆದಾರರ}} ಗುಂಪುಗಳನ್ನು ಬದಲಾಯಿಸಿ",
+       "tool-link-userrights-readonly": "{{GENDER:$1|ಬಳಕೆದಾರರ}} ಗುಂಪುಗಳನ್ನು ವೀಕ್ಷಿಸಿ",
+       "tool-link-emailuser": "ಈ {{GENDER:$1|ಬಳಕೆದಾರ}} ಗೆ ಇಮೇಲ್ ಮಾಡಿ",
        "userpage": "ಸದಸ್ಯರ ಪುಟವನ್ನು ವೀಕ್ಷಿಸು",
        "projectpage": "ಯೋಜನೆಯ ಪುಟವನ್ನು ನೋಡು",
        "imagepage": "ಕಡತದ ಪುಟ ವೀಕ್ಷಿಸಿ",
        "redirectedfrom": "($1 ಇಂದ ಪುನರ್ನಿರ್ದೇಶಿತ)",
        "redirectpagesub": "ಪುನರ್ನಿರ್ದೇಶನ ಪುಟ",
        "redirectto": "ಪುನರ್ನಿರ್ದೇಶನ ಇದಕ್ಕೆ:",
-       "lastmodifiedat": "ಈ ಪುಟವನ್ನು ಕೊನೆಯಾಗಿ $2, $1 ರಂದು ಬದಲಾಯಿಸಲಾಗಿತ್ತು.",
+       "lastmodifiedat": "ಈ ಪುಟವನ್ನು $1, $2 ರಂದು ಕೊನೆಯಾಗಿ ಸಂಪಾದಿಸಲಾಯಿತು.",
        "viewcount": "ಈ ಪುಟವನ್ನು {{PLURAL:$1|೧ ಬಾರಿ|$1 ಬಾರಿ}} ವೀಕ್ಷಿಸಲಾಗಿದೆ.",
        "protectedpage": "ಸಂರಕ್ಷಿತ ಪುಟ",
        "jumpto": "ಇಲ್ಲಿಗೆ ಹೋಗು:",
        "view-pool-error": "ಕ್ಷಮಿಸಿ, ಸದ್ಯಕ್ಕೆ ಸರ್ವರ್‌ಗಳ ಮೇಲೆ ಹೆಚ್ಚಿನ ಹೊರೆ ಇದೆ.\nಬಹಳಷ್ಟು ಬಳಕೆದಾರರು ಈ ಸಂಪನ್ಮೂಲವನ್ನು ನೋಡಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ.\nನೀವು ಈ ಸಂಪನ್ಮೂಲವನ್ನು ಇನ್ನೊಮ್ಮೆ ನೋಡಲು ಪ್ರಯತ್ನಿಸುವ ಮೊದಲು ಸ್ವಲ್ಪಹೊತ್ತು ಕಾಯಿರಿ.\n\n$1",
        "generic-pool-error": "ಕ್ಷಮಿಸಿ, ಸದ್ಯಕ್ಕೆ ಸರ್ವರ್‌ಗಳ ಮೇಲೆ ಹೆಚ್ಚಿನ ಹೊರೆ ಇದೆ.\nಬಹಳಷ್ಟು ಬಳಕೆದಾರರು ಈ ಸಂಪನ್ಮೂಲವನ್ನು ನೋಡಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ.\nನೀವು ಈ ಸಂಪನ್ಮೂಲವನ್ನು ಇನ್ನೊಮ್ಮೆ ನೋಡಲು ಪ್ರಯತ್ನಿಸುವ ಮೊದಲು ಸ್ವಲ್ಪಹೊತ್ತು ಕಾಯಿರಿ.",
        "pool-timeout": "ಕಾಲಾವಕಾಶ ಲಾಕ್ ಕಾಯುವುದು",
-       "pool-queuefull": "ಪà³\8dರà²\95à³\8dರಿಯà³\86ಯನà³\8dನà³\81 à²µà²¿à²¶à³\87ಷ à²\95à³\8dಯà³\81 à²ªà³\82ರà³\8dಣ",
+       "pool-queuefull": "ವಿಶà³\87ಷ à²\95à³\8dಯà³\81 à²ªà³\8dರà²\95à³\8dರಿಯà³\86 à²¤à³\81à²\82ಬಿದà³\86",
        "pool-errorunknown": "ಅಪರಿಚಿತ ದೋಷ",
        "pool-servererror": "ಪೂಲ್ ಕೌಂಟರ್ ಸೇವೆಯು ಲಭ್ಯವಿಲ್ಲ ($1).",
        "poolcounter-usage-error": "ಬಳಕೆಯ ದೋಷ: $1",
-       "aboutsite": "ಕನ್ನಡ {{SITENAME}} ಬಗ್ಗೆ",
+       "aboutsite": "{{SITENAME}} ಬಗ್ಗೆ",
        "aboutpage": "Project:ಬಗ್ಗೆ",
-       "copyright": "ವಿಶà³\87ಷವಾà²\97ಿ à²¹à³\87ಳಲಲà³\8dಲಿದರà³\86 à²\87ದà³\81 \"$1\" à²\95ಾಪಿರà³\88à²\9fà³\8d à²\85ಲà³\8dಲಿ à²²à²­à³\8dಯ à²\89à²\82à²\9fà³\81",
+       "copyright": "ವಿಷಯ $1 à²° à²\85ಡಿಯಲà³\8dಲಿ à²²à²­à³\8dಯವಿದà³\86.ಹà²\95à³\8dà²\95à³\81ಸà³\8dವಾಮà³\8dಯ à²\97ಮನಿಸದಿದà³\8dದರà³\86",
        "copyrightpage": "{{ns:project}}:ಕೃತಿಸ್ವಾಮ್ಯತೆಗಳು",
        "currentevents": "ಪ್ರಚಲಿತ ಸಂಗತಿಗಳು",
        "currentevents-url": "Project:ಪ್ರಚಲಿತ ಸಂಗತಿಗಳು",
        "ok": "ಸರಿ",
        "retrievedfrom": "\"$1\" ಇಂದ ಪಡೆಯಲ್ಪಟ್ಟಿದೆ",
        "youhavenewmessages": "ನಿಮಗೆ $1 ಇವೆ ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|ನಿನà²\97à³\86}} {{PLURAL:$3|à²\87ನà³\8dನà³\81 à²\92à²\82ದà³\81 à²¸à²¦à²¸à³\8dಯನಿà²\82ದ|$3 à²¸à²¦à²¸à³\8dಯà²\97ಳಿಂದ}} $1 ಉಂಟು. ($2)",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|ನಿನà²\97à³\86}} {{PLURAL:$3|à²\87ನà³\8dನà³\81 à²\92à²\82ದà³\81 à²¸à²¦à²¸à³\8dಯನಿà²\82ದ|$3 à²¸à²¦à²¸à³\8dಯರಿಂದ}} $1 ಉಂಟು. ($2)",
        "youhavenewmessagesmanyusers": " ನಿಮಗೆ ಸುಮಾರು ಸದಸ್ಯಗಳಿಂದ $1 ಉಂಟು ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|ಒಂದು ಹೊಸ ಸಂದೇಶ|999=ಹೊಸ ಸಂದೇಶಗಳು}}",
        "newmessagesdifflinkplural": "ಇತ್ತೀಚಿನ {{PLURAL:$1|ಬದಲಾವಣೆ|999=ಬದಲಾವಣೆಗಳು}}",
        "feed-invalid": "ಸಿಂಧುವಲ್ಲದ ಪ್ರಕಾರದ ಫೀಡು.",
        "feed-unavailable": "ಸಿಂಡಿಕೇಶನ್ ಫೀಡುಗಳು ಲಭ್ಯವಿಲ್ಲ",
        "site-rss-feed": "$1 RSS ಫೀಡು",
-       "site-atom-feed": "$1 Atom ಫೀಡು",
+       "site-atom-feed": "$1 ಅಣು ಫೀಡು",
        "page-rss-feed": "\"$1\" RSS ಫೀಡು",
-       "page-atom-feed": "\"$1\" ಪುಟದ Atom ಫೀಡು",
+       "page-atom-feed": "\"$1\" ಪುಟದ ಅಣು ಫೀಡು",
        "red-link-title": "$1 (ಪುಟವು ಇನ್ನೂ ಸೃಷ್ಟಿತವಾಗಿಲ್ಲ)",
        "sort-descending": "ಇಳಿಕೆ ಕ್ರಮದಲ್ಲಿ ಜೋಡಿಸು",
        "sort-ascending": "ಏರಿಕೆ ಕ್ರಮದಲ್ಲಿ ಜೋಡಿಸು",
        "nstab-user": "ಸದಸ್ಯರ ಪುಟ",
        "nstab-media": "ಮೀಡಿಯ ಪುಟ",
        "nstab-special": "ವಿಶೇಷ ಪುಟ",
-       "nstab-project": "ಬà²\97à³\8dà²\97à³\86",
+       "nstab-project": "ಯà³\8bà²\9cನà³\86ಯ à²ªà³\81à²\9f",
        "nstab-image": "ಚಿತ್ರ",
        "nstab-mediawiki": "ಸಂದೇಶ",
        "nstab-template": "ಟೆಂಪ್ಲೇಟು",
        "nstab-category": "ವರ್ಗ",
        "mainpage-nstab": "ಮುಖ್ಯ ಪುಟ",
        "nosuchaction": "ಆ ರೀತಿಯ ಕೃತ್ಯ ಯಾವುದೂ ಇಲ್ಲ",
-       "nosuchactiontext": "ಈ URL ನೇಮಿಸಿದ ಕೃತ್ಯವು ಈ ವಿಕಿಯಿಂದ ಗುರುತಿಸಬಲ್ಲದಲ್ಲ",
+       "nosuchactiontext": "URL ನಿಂದ ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಕ್ರಿಯೆಯು ಅಮಾನ್ಯವಾಗಿದೆ.\nನೀವು URL ತಪ್ಪಾಗಿ ಟೈಪ್ ಮಾಡಿರಬಹುದು, ಅಥವಾ ತಪ್ಪಾದ ಲಿಂಕ್ ಅನ್ನು ಅನುಸರಿಸಿದ್ದೀರಿ.\nಈ {{SITENAME}}  ಬಳಸಲ್ಪಡುವ ತಂತ್ರಾಂಶದಲ್ಲಿ ಒಂದು ದೋಷವನ್ನು ಸೂಚಿಸುತ್ತದೆ.",
        "nosuchspecialpage": "ಆ ಹೆಸರಿನ ವಿಶೇಷ ಪುಟ ಇಲ್ಲ",
        "nospecialpagetext": "<strong>ನೀವು ಅಸ್ಥಿತ್ವದಲ್ಲಿರದ ವಿಶೇಷ ಪುಟವನ್ನು ಕೋರಿರುವಿರಿ.</strong>\n\nಅಸ್ಥಿತ್ವದಲ್ಲಿರುವ ವಿಶೇಷ ಪುಟಗಳ ಪಟ್ಟಿ [[Special:SpecialPages|{{int:specialpages}}]] ಅಲ್ಲಿದೆ.",
        "error": "ದೋಷ",
        "databaseerror": "ಡೇಟಬೇಸ್ ದೋಷ",
-       "databaseerror-text": "ಡà³\87à²\9fಾಬà³\87ಸà³\8d à²\85ನà³\81ರà³\8bಧದಲà³\8dಲಿ à²¤à³\8dರà³\81à²\9fಿ à²\86à²\97ಿದà³\86. \nà²\87ದರ à²\85ರà³\8dಥ à²\87ರಬಹà³\81ದà³\81 à²\8eà²\82ತ à²\85à²\82ದರà³\86 à²¸à²¾à²«à³\8dà²\9fà³\8dವà³\87ರಲà³\8dಲಿ à²\92à²\82ದà³\81 à²¸à²®à²¸à³\8dಯà³\86 à²\87ರಬಹà³\81ದà³\81.",
-       "databaseerror-textcl": "ಡà³\87à²\9fಾಬà³\87ಸà³\8d à²\85ನà³\81ರà³\8bಧದಲà³\8dಲಿ à²¤à³\8dರà³\81à²\9fಿ à²\86à²\97ಿದೆ.",
+       "databaseerror-text": "ಡà³\87à²\9fಾಬà³\87ಸà³\8d à²ªà³\8dರಶà³\8dನà³\86ಯಲà³\8dಲಿ à²¦à³\8bಷ à²¸à²\82ಭವಿಸಿದà³\86.\nà²\87ದà³\81 à²¤à²\82ತà³\8dರಾà²\82ಶದಲà³\8dಲಿನ à²¦à³\8bಷವನà³\8dನà³\81 à²¸à³\82à²\9aಿಸà³\81ತà³\8dತದà³\86.",
+       "databaseerror-textcl": "ಡà³\87à²\9fಾಬà³\87ಸà³\8d à²\85ನà³\81ರà³\8bಧದಲà³\8dಲಿ à²¦à³\8bಷ à²¸à²\82ಭವಿಸಿದೆ.",
        "databaseerror-query": "ಅನುರೋಧ: $1",
        "databaseerror-function": "ಕಾರ್ಯ: $1",
-       "databaseerror-error": "ತà³\8dರà³\81à²\9fಿ: $1",
-       "laggedslavemode": "ಎಚ್ಚರ: ಪುಟದಲ್ಲಿ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳು ಕಾಣದಿರಬಹುದು.",
+       "databaseerror-error": "ದà³\8bಷ: $1",
+       "laggedslavemode": "<strong>ಎಚ್ಚರ:</strong> ಪುಟದಲ್ಲಿ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳು ಕಾಣದಿರಬಹುದು.",
        "readonly": "ಡೇಟಬೇಸ್ ಮುಚ್ಚಲಾಗಿದೆ",
        "enterlockreason": "ಡೇಟಬೇಸ್ ಮುಚ್ಚುತಿರುವ ಕಾರಣವನ್ನು ಮತ್ತು ಮತ್ತೆ ಅದನ್ನು ತೆರೆಯುವ ಅಂದಾಜಿತ ಕಾಲವನ್ನು ತಿಳಿಸಿ",
        "readonlytext": "ಹೊಸ ಸೇರ್ಪಡೆಗಳನ್ನು ಮತ್ತು ಇತರ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲಾಗದಂತೆ ಡೇಟಾಬೇಸ್ ಅನ್ನು ಸದ್ಯಕ್ಕೆ ಮುಚ್ಚಲಾಗಿದೆ. ಇದು ಪ್ರಾಯಶಃ ನಿಯತಕಾಲಿಕೆ ದುರಸ್ತಿಗೆ ಇರಬಹುದು ಮತ್ತು ಅದರ ನಂತರ ಸಾಮಾನ್ಯ ಸ್ಥಿತಿಗೆ ಹಿಂದಿರುಗುತ್ತದೆ.\n\nಡೇಟಾಬೇಸ್ ಅನ್ನು ಮುಚ್ಚಿದ ನಿರ್ವಾಹಕ ನೀಡಿರುವ ಕಾರಣ: $1",
        "internalerror": "ಆಂತರಿಕ ದೋಷ",
        "internalerror_info": "ಆಂತರಿಕ ದೋಷ: $1",
        "internalerror-fatal-exception": "\"$1\" ಬಗೆಯ ಒಂದು ಗಂಭೀರವಾದ ಆಕ್ಷೇಪಣೆ",
-       "filecopyerror": "\"$1\" à²«à³\88ಲà³\8d à²\85ನ್ನು \"$2\" ಗೆ ನಕಲಿಸಲಾಗಲಿಲ್ಲ.",
-       "filerenameerror": "\"$1\" à²«à³\88ಲನ್ನು \"$2\" ಎಂದು ಮರುನಾಮಕರಣ ಮಾಡಲು ಆಗಲಿಲ್ಲ.",
-       "filedeleteerror": "\"$1\" à²«à³\88ಲà³\8d à²\85ನ್ನು ಅಳಿಸಲಾಗಲಿಲ್ಲ.",
+       "filecopyerror": "\"$1\" à²\95ಡತವನ್ನು \"$2\" ಗೆ ನಕಲಿಸಲಾಗಲಿಲ್ಲ.",
+       "filerenameerror": "\"$1\" à²\95ಡತವನ್ನು \"$2\" ಎಂದು ಮರುನಾಮಕರಣ ಮಾಡಲು ಆಗಲಿಲ್ಲ.",
+       "filedeleteerror": "\"$1\" à²\95ಡತವನ್ನು ಅಳಿಸಲಾಗಲಿಲ್ಲ.",
        "directorycreateerror": "\"$1\" ನಿದರ್ಶಕವನ್ನು ಸೃಷ್ಟಿಸಲಾಗಲಿಲ್ಲ.",
        "directoryreadonlyerror": "\"$1\" ಕೋಶವು ಓದಲು ಮಾತ್ರವಾಗಿದೆ.",
        "directorynotreadableerror": "\"$1\" ಕೋಶವನ್ನು ಓದಲು ಸಾಧ್ಯವಿಲ್ಲ.",
-       "filenotfound": "\"$1\" à²«à³\88ಲನ್ನು ಹುಡುಕಲಾಗಲಿಲ್ಲ.",
+       "filenotfound": "\"$1\" à²\95ಡತವನ್ನು ಹುಡುಕಲಾಗಲಿಲ್ಲ.",
        "unexpected": "ಅನಿರೀಕ್ಷಿತ ಮೌಲ್ಯ: \"$1\"=\"$2\".",
        "formerror": "ದೋಷ: ಅರ್ಜಿ ಕಳುಹಿಸಲಾಗಲಿಲ್ಲ",
        "badarticleerror": "ಈ ಪುಟದ ಮೇಲೆ ನೀವು ಪ್ರಯತ್ನಿಸಿದ ಕಾರ್ಯವನ್ನು ನಡೆಸಲಾಗದು.",
-       "cannotdelete": "\"$1\" à²\88 à²ªà³\81à²\9f à²\85ಥವಾ à²\9aಿತà³\8dರವನ್ನು ಅಳಿಸಲಾಗಲಿಲ್ಲ. (ಬೇರೊಬ್ಬ ಸದಸ್ಯರಿಂದ ಆಗಲೇ ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು.)",
+       "cannotdelete": "\"$1\" à²\88 à²ªà³\81à²\9f à²\85ಥವಾ à²\95ಡತವನ್ನು ಅಳಿಸಲಾಗಲಿಲ್ಲ. (ಬೇರೊಬ್ಬ ಸದಸ್ಯರಿಂದ ಆಗಲೇ ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು.)",
        "cannotdelete-title": "\"$1\" ಪುಟವನ್ನು ಅಳಿಸಲಾಗುವುದಿಲ್ಲ",
        "delete-hook-aborted": "ಅಳಿಸುವಿಕೆಯನ್ನು ರದ್ದುಮಾಡಿದ ಕೊಂಡಿ. ಅದು ಯಾವ ವಿವರಣೆ ನೀಡಲಿಲ್ಲ.",
        "no-null-revision": "\"$1\" ಪುಟದ ಶೂನ್ಯ ಪುನರಾವರ್ತನೆಯನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ",
-       "badtitle": "ಸರಿಯಿಲà³\8dಲದ à²¹à³\86ಸರà³\81",
+       "badtitle": "ಸರಿಯಿಲà³\8dಲದ à²¶à³\80ರà³\8dಷಿà²\95à³\86",
        "badtitletext": "ನೀವು ಕೋರಿದ ಪುಟದ ಶೀರ್ಷಿಕೆ ಸಿಂಧುವಲ್ಲದ್ದು ಅಥವ ಖಾಲಿ ಅಥವ ಸರಿಯಾದ ಕೊಂಡಿಯಲ್ಲದ ಅಂತರ-ಭಾಷೆ/ಅಂತರ-ವಿಕಿ ಸಂಪರ್ಕವಾಗಿದೆ.\nಅದರಲ್ಲಿ ಒಂದು ಅಥವ ಹೆಚ್ಚು ಶೀರ್ಷಿಕೆಯಲ್ಲಿ ಬಳಸಲು ನಿಷಿದ್ಧವಾಗಿರುವ ಅಕ್ಷರಗಳು ಇರಬಹುದು.",
        "title-invalid-empty": "ಮನವಿ ಮಾಡಲಾದ ಪುಟದ ಶೀರ್ಷಿಕೆಯು ಖಾಲಿಯಾಗಿದೆ ಅಥವ ಕೇವಲ ನಾಮಸ್ಥಳದ ಹೆಸರನ್ನು ಮಾತ್ರ ಹೊಂದಿದೆ.",
        "title-invalid-utf8": "ಮನವಿ ಮಾಡಲಾದ ಪುಟದ ಶೀರ್ಷಿಕೆಯು ಒಂದು ಅಮಾನ್ಯವಾದ UTF-8 ಅನುಕ್ರಮವನ್ನು ಹೊಂದಿದೆ.",
-       "title-invalid-interwiki": "ಶà³\80ರà³\8dಷಿà²\95à³\86ಯà³\81 à²\85à²\82ತರ-ವಿà²\95ಿ à²\95à³\8aà²\82ಡಿಯನà³\8dನà³\81 à²¹à³\8aà²\82ದಿದà³\86",
+       "title-invalid-interwiki": "ವಿನà²\82ತಿಸಿದ à²ªà³\81à²\9fದ à²¶à³\80ರà³\8dಷಿà²\95à³\86ಯà³\81 à²\85à²\82ತರ-ವಿà²\95ಿ à²\95à³\8aà²\82ಡಿಯನà³\8dನà³\81 à²\92ಳà²\97à³\8aà²\82ಡಿದà³\86, à²\85ದನà³\8dನà³\81 à²¶à³\80ರà³\8dಷಿà²\95à³\86à²\97ಳಲà³\8dಲಿ à²¬à²³à²¸à²²à²¾à²\97à³\81ವà³\81ದಿಲà³\8dಲ.",
        "title-invalid-talk-namespace": "ಮನವಿ ಮಾಡಲಾದ ಪುಟದ ಶೀರ್ಷಿಕೆಯು ಒಂದು ಅಸ್ತಿತ್ವದಲ್ಲಿರದೆ ಇರುವ ಮಾತಿನ ಪುಟವನ್ನು ಸೂಚಿಸುತ್ತದೆ.",
        "title-invalid-characters": "ಮನವಿ ಮಾಡಲಾದ ಪುಟದ ಶೀರ್ಷಿಕೆಯು ಅಮಾನ್ಯವಾದ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿದೆ: \"$1\".",
        "title-invalid-relative": "ಶೀರ್ಷಿಕೆಯು ಒಂದು ಸಾಂದರ್ಭಿಕ ಮಾರ್ಗವಾಗಿರುತ್ತದೆ. ಸಾಂಧರ್ಭಿಕ ಪುಟದ ಶೀರ್ಷಿಕೆಗಳು (./, ../) ಅಮಾನ್ಯವಾಗಿರುತ್ತದೆ, ಏಕೆಂದರೆ ಬಳಕೆದಾರರ ಜಾಲವೀಕ್ಷಕದಿಂದ ಅವುಗಳನ್ನು ತಲುಪುವುದು ಸಾಮಾನ್ಯವಾಗಿ ಅಸಾಧ್ಯವಾಗಿರುತ್ತದೆ.",
+       "title-invalid-magic-tilde": "ವಿನಂತಿಸಿದ ಪುಟ ಶೀರ್ಷಿಕೆಯು ಅಮಾನ್ಯವಾದ ಮ್ಯಾಜಿಕ್ ಟಿಲ್ಡ್ ಅನುಕ್ರಮವನ್ನು ಹೊಂದಿದೆ (<nowiki> ~~~~ </nowiki>).",
+       "title-invalid-leading-colon": "ವಿನಂತಿಸಿದ ಪುಟ ಶೀರ್ಷಿಕೆಯು ಆರಂಭದಲ್ಲಿ ಅಮಾನ್ಯವಾದ ಕೊಲೊನ್ ಅನ್ನು ಹೊಂದಿರುತ್ತದೆ.",
        "perfcached": "ಈ ಕೆಳಗಿನ ಮಾಹಿತಿಯು cache ಇಂದ ಬಂದಿರುವುದು ಮತ್ತು ಪ್ರಸಕ್ತ ಸ್ಥಿತಿಯನ್ನು ಬಿಂಬಿಸದಿರಬಹುದು. ಹೆಚ್ಚಂದರೆ  {{PLURAL:$1|one result is|$1 results are}} cacheನಲ್ಲಿ ಲಭ್ಯವಿರುವುದು",
        "perfcachedts": "ಈ ಕೆಳಗಿನ ಮಾಹಿತಿ cache ಆಗಿರುವುದು, ಮತ್ತು ಇದರ ಕೊನೆಯ ಬದಲಾವಣೆ ಆಗಿರುವುದು $1. ಹೆಚ್ಚಂದರೆ  {{PLURAL:$4|one result is|$4 results are}} cacheನಲ್ಲಿ ಲಭ್ಯವಿರುವುದು",
-       "querypage-no-updates": "à²\88 à²ªà³\81à²\9fದ à²\85ಪà³\8dಡà³\87à²\9fà³\8dâ\80\8dà²\97ಳನà³\8dನà³\81 à²ªà³\8dರಸà²\95à³\8dತವಾà²\97ಿ à²¨à²¿à²²à³\81à²\97ಡà³\86 à²®à²¾à²¡à²²à²¾à²\97ಿದà³\86. à²\87ಲà³\8dಲಿರà³\81ವ à²®à²¾à²¹à²¿à²¤à²¿à²¯à²¨à³\8dನà³\81 à²¸à²¦à³\8dಯà²\95à³\8dà²\95à³\86 à²¨à²µà³\80à²\95ರಿಸಲಾà²\97à³\81ವà³\81ದಿಲà³\8dಲ.",
+       "querypage-no-updates": "à²\88 à²ªà³\81à²\9fà²\95à³\8dà²\95à³\86 à²¨à²µà³\80à²\95ರಣà²\97ಳà³\81 à²ªà³\8dರಸà³\8dತà³\81ತ à²¨à²¿à²·à³\8dà²\95à³\8dರಿಯà²\97à³\8aà²\82ಡಿದà³\86.\nà²\87ಲà³\8dಲಿರà³\81ವ à²®à²¾à²¹à²¿à²¤à²¿à²¯à²¨à³\8dನà³\81 à²¸à²¦à³\8dಯà²\95à³\8dà²\95à³\86 à²¨à²µà³\80à²\95ರಿಸಲಾà²\97à³\81ವà³\81ದಿಲà³\8dಲ..",
        "viewsource": "ಆಕರ ವೀಕ್ಷಿಸು",
        "viewsource-title": "$1 ಇಗೆ  ಮೂಲವನ್ನು ವಿಕ್ಷಿಸಿ",
        "actionthrottled": "ಕ್ರಿಯೆಯನ್ನು ನಿಯಂತ್ರಿಸಲಾಗಿದೆ",
        "protectedpagetext": "ಈ ಪುಟವನ್ನು ಸಂಪಾದನೆ ಮಾಡಲಾಗದಂತೆ ಸಂರಕ್ಷಿಸಲಾಗಿದೆ.",
        "viewsourcetext": "ಈ ಪುಟದ ಮೂಲವನ್ನು ನೀವು ವೀಕ್ಷಿಸಬಹುದು ಮತ್ತು ನಕಲು ಮಾಡಬಹುದು.",
        "viewyourtext": "ನೀವು <strong>ನಿಮ್ಮ ಸಂಪಾದನೆಗಳನ್ನು</strong> ವೀಕ್ಷಿಸಿ ಮತ್ತು ಅದರ ಮೂಲವನ್ನು ಈ ಹಾಳೆಗೆ ನಕಲಿಸಬಹುದು.",
-       "protectedinterface": "ಈ ಪುಟವು ತಾಂತ್ರಿಕತೆಗೆ ಸಂಪರ್ಕ ಪಠ್ಯವನ್ನು ವಿಕಿಯಲ್ಲಿ ಒದಗಿಸುತ್ತದೆ, ಹಾಗು ದುರುಪಯೋಗ ಆಗದಿರಲೆಂದು ಇದನ್ನು ಸಂರಕ್ಷಿಸಲಾಗಿದೆ. ಎಲ್ಲ ವಿಕಿಗಳಿಗೆ ಭಾಷಾಂತರವನ್ನು ಕೂಡಿಸಲು ಹಾಗು ಬದಲಿಸಲು, [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation ಯೋಜನೆಯನ್ನು ಉಪಯೊಗಿಸಿ",
-       "editinginterface": "'''ಎಚ್ಚರಿಕೆ:''' ನೀವು ತಂತ್ರಾಂಶವು ತಾಣವನ್ನು ಪ್ರದರ್ಶಿಸಲು ಉಪಯೋಗಿಸುವ ಪಠ್ಯವನ್ನು ಹೊಂದಿರುವ ಪುಟವೊಂದನ್ನು ಸಂಪಾದಿಸುತ್ತಿರುವಿರಿ.\nಈ ಪುಟದಲ್ಲಾಗುವ ಬದಲಾವಣೆಗಳು ಇತರ ಬಳಕೆದಾರರಿಗೆ ತಾಣವು ಕಾಣುವ ರೀತಿಯನ್ನು ಬದಲಾಯಿಸುತ್ತದೆ.\nಅನುವಾದಗಳನ್ನು ಮಾಡುತ್ತಿದ್ದರೆ, ದಯವಿಟ್ಟು ಮೀಡಿಯವಿಕಿಯ ಪ್ರಾಂತೀಯತೆ ಯೋಜನೆ [https://translatewiki.net/ translatewiki.net], the MediaWiki localisation project ಯೋಜನೆಯನ್ನು ಉಪಯೊಗಿಸಿ",
+       "protectedinterface": "ಈ ಪುಟವು ತಾಂತ್ರಿಕತೆಗೆ ಸಂಪರ್ಕ ಪಠ್ಯವನ್ನು ವಿಕಿಯಲ್ಲಿ ಒದಗಿಸುತ್ತದೆ, ಹಾಗು ದುರುಪಯೋಗ ಆಗದಿರಲೆಂದು ಇದನ್ನು ಸಂರಕ್ಷಿಸಲಾಗಿದೆ. ಎಲ್ಲ ವಿಕಿಗಳಿಗೆ ಭಾಷಾಂತರವನ್ನು ಕೂಡಿಸಲು ಹಾಗು ಬದಲಿಸಲು, [https://translatewiki.net/ translatewiki.net], ಮೀಡಿಯಾವಿಕಿ ಸ್ಥಳೀಕರಣ ಯೋಜನೆಯನ್ನು ಉಪಯೊಗಿಸಿ",
+       "editinginterface": "<strong>ಎಚ್ಚರಿಕೆ:</strong> ನೀವು ತಂತ್ರಾಂಶವು ತಾಣವನ್ನು ಪ್ರದರ್ಶಿಸಲು ಉಪಯೋಗಿಸುವ ಪಠ್ಯವನ್ನು ಹೊಂದಿರುವ ಪುಟವೊಂದನ್ನು ಸಂಪಾದಿಸುತ್ತಿರುವಿರಿ.\nಈ ಪುಟದಲ್ಲಾಗುವ ಬದಲಾವಣೆಗಳು ಇತರ ಬಳಕೆದಾರರಿಗೆ ತಾಣವು ಕಾಣುವ ರೀತಿಯನ್ನು ಬದಲಾಯಿಸುತ್ತದೆ.\nಅನುವಾದಗಳನ್ನು ಮಾಡುತ್ತಿದ್ದರೆ, ದಯವಿಟ್ಟು ಮೀಡಿಯವಿಕಿಯ ಪ್ರಾಂತೀಯತೆ ಯೋಜನೆ [https://translatewiki.net/ translatewiki.net], ಮೀಡಿಯಾವಿಕಿ ಸ್ಥಳೀಕರಣ ಯೋಜನೆಯನ್ನು ಉಪಯೊಗಿಸಿ",
+       "translateinterface": "ಎಲ್ಲಾ ವಿಕಿಗಳಿಗಾಗಿ ಅನುವಾದಗಳನ್ನು ಸೇರಿಸಲು ಅಥವಾ ಬದಲಿಸಲು, ದಯವಿಟ್ಟು ಮೀಡಿಯಾವಿಕಿ ಸ್ಥಳೀಕರಣ ಯೋಜನೆಯ [https://translatewiki.net/ translatewiki.net] ಅನ್ನು ಬಳಸಿ.",
        "cascadeprotected": "ಈ ಪುಟವು ಸಂಪಾದನೆ ಮಾಡಲಾಗದಂತೆ ಸಂರಕ್ಷಿಸಲಾಗಿದೆ. ಇದಕ್ಕೆ ಕಾರಣ ಈ ಪುಟವನ್ನು ಈ ಕೆಳಗಿನ ತಡಸಲು-ಸಂರಕ್ಷಣೆ ಅಳವಡಿಸಲಾದ {{PLURAL:$1|ಪುಟದಲ್ಲಿ|ಪುಟಗಳಲ್ಲಿ}} ಉಪಯೋಗಿಸಲಾಗಿದೆ:\n$2",
        "namespaceprotected": "ನಿಮಗೆ '''$1''' ಪುಟಪ್ರಬೇಧಕ್ಕೆ ಸೇರಿರುವ ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸುವ ಅನುಮತಿ ಇಲ್ಲ.",
        "customcssprotected": "ಈ ಸಿಎಸ್ಎಸ್ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಈ ಪುಟವು ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರನ ವಯುಕ್ತಿಕ ವ್ಯವಸ್ಥೆಯನ್ನು ಹೊಂದಿರುವುದರಿಂದ ಅನುಮತಿ ಇಲ್ಲ",
        "customjsprotected": "ಈ ಜಾವಾ ಸ್ಕ್ರಿಪ್ಟ್ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಈ ಪುಟವು ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರನ ವಯುಕ್ತಿಕ ವ್ಯವಸ್ಥೆಯನ್ನು ಹೊಂದಿರುವುದರಿಂದ ಅನುಮತಿ ಇಲ್ಲ",
        "mycustomcssprotected": "ಈ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
-       "mycustomjsprotected": "ಈ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
+       "mycustomjsprotected": "à²\88 à²\9cಾವಾ à²¸à³\8dà²\95à³\8dರಿಪà³\8dà²\9fà³\8d à²ªà³\81à²\9fವನà³\8dನà³\81 à²¸à²\82ಪಾದಿಸಲà³\81 à²¨à²¿à²®à²\97à³\86 à²\85ನà³\81ಮತಿ à²\87ಲà³\8dಲ.",
        "myprivateinfoprotected": "ನಿಮ್ಮ ಸೂಕ್ಷ್ಮ ವಿಚಾರಗಳನ್ನು ಸಂಪಾದಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
        "mypreferencesprotected": "ನಿಮ್ಮ ಆಯ್ಕೆಗಳನ್ನು  ಸಂಪಾದಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ",
        "ns-specialprotected": "ವಿಶೇಷ ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸಲು ಆಗುವುದಿಲ್ಲ.",
        "titleprotected": "ಈ ಹೆಸರಿನ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಲಾಗದಂತೆ [[User:$1|$1]] ಅವರು ಸಂರಕ್ಷಿಸಿದ್ದಾರೆ.\nಸಂರಕ್ಷಣೆಗೆ ನೀಡಿರುವ ಕಾರಣ: <em>$2</em>.",
-       "filereadonlyerror": "\"$1\" à²\95ಡತವà³\81 à²\93ದಲà³\81 à²®à²¾à²¤à³\8dರ à²¸à²¾à²¦à³\8dಯವಿರà³\81ವ à²°à³\80ತಿಯಲà³\8dಲಿರà³\81ವ \"$2\" à²¸à²\82ಪà³\81à²\9fದಲà³\8dಲಿ à²\87ರà³\81ವà³\81ದರಿà²\82ದ à²\87ದನà³\8dನà³\81  à²®à²¾à²°à³\8dಪಡಿಸಲà³\81 à²¸à²¾à²¦à³\8dಯವಾà²\97à³\81ತà³\8dತಿಲà³\8dಲ.\nà²\87ದನà³\8dನà³\81 à²¬à²¦à³\8dದà²\97à³\8aಳಿಸಿರà³\81ವ à²¨à²¿à²°à³\8dವಾಹà²\95ರà³\81 à²\88 à²µà²¿à²µà²°à²£à³\86ಯನà³\8dನà³\81 à²¨à³\80ಡà³\81ತà³\8dತಿದà³\8dದಾರà³\86: \"$3\"",
+       "filereadonlyerror": "\"$1\" à²\95ಡತವà³\81 à²\93ದಲà³\81 à²®à²¾à²¤à³\8dರ à²¸à²¾à²¦à³\8dಯವಿರà³\81ವ à²°à³\80ತಿಯಲà³\8dಲಿರà³\81ವ \"$2\" à²¸à²\82ಪà³\81à²\9fದಲà³\8dಲಿ à²\87ರà³\81ವà³\81ದರಿà²\82ದ à²\87ದನà³\8dನà³\81  à²®à²¾à²°à³\8dಪಡಿಸಲà³\81 à²¸à²¾à²¦à³\8dಯವಾà²\97à³\81ತà³\8dತಿಲà³\8dಲ.\nà²\87ದರ à²µà²¿à²µà²°à²£à³\86ಯನà³\8dನà³\81 à²¬à²¦à³\8dದà²\97à³\8aಳಿಸಿರà³\81ವ à²¨à²¿à²°à³\8dವಾಹà²\95ರà³\81 à²¨à³\80ಡà³\81ವರà³\81: \"$3\"",
        "invalidtitle-knownnamespace": "\"$2\"ನೇಮ್ ಸ್ಪೇಸ್ ಮತ್ತು \"$3\"ಪಠ್ಯದೊಂದಿಗೆ ಅಸಮಂಜಸ ತಲೆಬರಹ",
        "invalidtitle-unknownnamespace": "$1ನೇಮ್ ಸ್ಪೇಸ್ ಮತ್ತು \"$2\"ಪಠ್ಯದೊಂದಿಗೆ ಅಸಮಂಜಸ ತಲೆಬರಹ",
        "exception-nologin": "ಲಾಗಿನ್ ಆಗಿಲ್ಲ",
        "cannotlogoutnow-title": "ಈಗ ಲಾಗ್ ಔಟ್ ಮಾಡಲಾಗುತ್ತಿಲ್ಲ",
        "cannotlogoutnow-text": "$1 ಬಳಸುವಾಗ ಲಾಗ್ ಔಟ್ ಆಗಲು ಸಾಧ್ಯವಿಲ್ಲ.",
        "welcomeuser": "ಸುಸ್ವಾಗತ,$1!",
-       "welcomecreation-msg": "ನಿಮ್ಮ ಖಾತೆ ತೆರೆಯಲಾಗಿದೆ.ನಿಮ್ಮ [[Special:Preferences|{{SITENAME}} preferences]]ಬದಲಾಯಿಸಲು ಮರೆಯಬೇಡಿ.",
-       "yourname": "ನಿಮà³\8dಮ à²¬à²³à²\95à³\86ಯ à²¹à³\86ಸರà³\81",
+       "welcomecreation-msg": "ನಿಮ್ಮ ಖಾತೆ ತೆರೆಯಲಾಗಿದೆ.ನಿಮ್ಮ [[Special:Preferences|ಆದ್ಯತೆಗಳು]] ಬದಲಾಯಿಸಲು ಮರೆಯಬೇಡಿ.",
+       "yourname": "ಬಳà²\95à³\86ದಾರರ à²¹à³\86ಸರà³\81:",
        "userlogin-yourname": "ಬಳಕೆದಾರರ ಹೆಸರು",
        "userlogin-yourname-ph": "ನಿಮ್ಮ ಸದಸ್ಯನಾಮ ಬರೆಯಿರಿ",
        "createacct-another-username-ph": "ಬಳಕೆದಾರರ ಹೆಸರು ಬರೆಯಿರಿ",
-       "yourpassword": "ನಿಮà³\8dಮ à²ªà³\8dರವà³\87ಶಪದ",
+       "yourpassword": "ಪà³\8dರವà³\87ಶಪದ:",
        "userlogin-yourpassword": "ಪ್ರವೇಶಪದ",
        "userlogin-yourpassword-ph": "ನಿಮ್ಮ ಪ್ರವೇಶಪದ ನಮೂದಿಸಿ",
        "createacct-yourpassword-ph": "ಪ್ರವೇಶಪದ ಒಂದನ್ನು ನಮೂದಿಸಿ",
        "createacct-yourpasswordagain": "ಪ್ರವೇಶಪದವನ್ನು ಧೃಡೀಕರಿಸಿ",
        "createacct-yourpasswordagain-ph": "ಪ್ರವೇಶಪದವನ್ನು ಮತ್ತೊಮ್ಮೆ ನಮೂದಿಸಿ",
        "userlogin-remembermypassword": "ನನ್ನನ್ನು ಲಾಗಿನ್ ಆಗಿಯೇ ಇಡಿ",
-       "userlogin-signwithsecure": "ಸುರಕ್ಷಿತವಾದ ಕನೆಕ್ಷನ್ ಉಪಯೋಗಿಸಿ.",
+       "userlogin-signwithsecure": "ಸುರಕ್ಷಿತ ಸಂಪರ್ಕವನ್ನು ಬಳಸಿ",
        "cannotlogin-title": "ಲಾಗ್ ಇನ್ ಮಾಡಲಾಗುತ್ತಿಲ್ಲ",
        "cannotlogin-text": "ಲಾಗ್ ಇನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ.",
        "cannotloginnow-title": "ಈಗ ಲಾಗ್ ಇನ್ ಮಾಡಲು ಆಗುತ್ತಿಲ್ಲ",
        "cannotloginnow-text": "$1 ಬಳಸುವಾಗ ಲಾಗ್ ಇನ್ ಆಗಲು ಸಾಧ್ಯವಿಲ್ಲ.",
        "cannotcreateaccount-title": "ಖಾತೆಗಳನ್ನು ಸೃಷ್ಟಿಸಲಾಗುತ್ತಿಲ್ಲ",
+       "cannotcreateaccount-text": "ನೇರ ಖಾತೆಯ ರಚನೆಯು ಈ ವಿಕಿಯಲ್ಲಿ ಸಕ್ರಿಯಗೊಂಡಿಲ್ಲ.",
        "yourdomainname": "ನಿಮ್ಮ ಕ್ಷೇತ್ರ:",
        "password-change-forbidden": "ನೀವು ಈ ವಿಕಿಯಲ್ಲಿ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಲು ಸಾದ್ಯವಿಲ್ಲ.",
+       "externaldberror": "ದೃಢೀಕರಣ ಡೇಟಾಬೇಸ್ ದೋಷ ಕಂಡುಬಂದಿದೆ ಅಥವಾ ನಿಮ್ಮ ಬಾಹ್ಯ ಖಾತೆಯನ್ನು ನವೀಕರಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.",
        "login": "ಲಾಗ್ ಇನ್",
-       "nav-login-createaccount": "ಲಾಗ್ ಇನ್ - log in",
-       "userlogin": "ಲಾಗ್ ಇನ್ - log in",
-       "userloginnocreate": "ಲಾಗ್ ಇನ್",
+       "login-security": "ನಿಮ್ಮ ಗುರುತನ್ನು ಪರಿಶೀಲಿಸಿ",
+       "nav-login-createaccount": "ಲಾಗ್ ಇನ್ / ಖಾತೆ ರಚಿಸಿ",
        "logout": "ಲಾಗ್ ಔಟ್",
        "userlogout": "ಲಾಗ್ ಔಟ್",
        "notloggedin": "ಲಾಗಿನ್ ಆಗಿಲ್ಲ",
        "userlogin-noaccount": "ಖಾತೆ ಇಲ್ಲವೇ?",
        "userlogin-joinproject": "{{SITENAME}} ಸೇರಿ",
-       "nologin": "ಖಾತೆ ಇಲ್ಲವೇ? '''$1'''.",
-       "nologinlink": "ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿ",
        "createaccount": "ಹೊಸ ಖಾತೆ ತೆರೆಯಿರಿ",
-       "gotaccount": "ಈಗಾಗಲೇ ಖಾತೆಯಿದೆಯೇ? '''$1'''.",
-       "gotaccountlink": "ಲಾಗ್ ಇನ್",
-       "userlogin-resetlink": "ನಿಮ್ಮ ಲಾಗಿನ್ ವಿವರಗಳನ್ನು ಮರೆತಿದ್ದೀರಾ?",
        "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": "ತಾತ್ಕಾಲಿಕವಾಗಿ ಮನಬ೦ದ೦ತ ಸಂಕೇತ ಪದ ಆಯ್ಕೆಮಾಡಿ ಮತ್ತು ಸೂಚಿಸಿದ ಇಮೇಲ್ ವಿಳಾಸಕ್ಕೆ ಕಳುಹಿಸಿ",
+       "createaccountmail-help": "ಪಾಸ್ವರ್ಡ್ ಕಲಿಯದೆಯೇ ಇನ್ನೊಬ್ಬ ವ್ಯಕ್ತಿಯ ಖಾತೆಗಳನ್ನು ರಚಿಸಲು ಬಳಸಬಹುದು.",
        "createacct-realname": "ನಿಜವಾದ ಹೆಸರು (ಐಚ್ಛಿಕ)",
-       "createaccountreason": "ಕಾರಣ:",
        "createacct-reason": "ಕಾರಣ",
        "createacct-reason-ph": "ನೀವು ಯಾಕೆ ಇನ್ನೊಂದು ಖಾತೆ ತೆರೆಯುತ್ತಿದ್ದೀರಿ",
-       "createacct-submit": "ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿ",
+       "createacct-reason-help": "ಖಾತೆ ಸೃಷ್ಟಿ ಲಾಗ್ನಲ್ಲಿ ಸಂದೇಶವನ್ನು ತೋರಿಸಲಾಗಿದೆ",
+       "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|ಕೊಡುಗೆ|ಕೊಡುಗೆಗಳು}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|ಕೊಡುಗೆದಾರ|ಕೊಡುಗೆದಾರರು}}",
        "badretype": "ನೀವು ಕೊಟ್ಟ ಪ್ರವೇಶಪದಗಳು ಬೇರೆಬೇರೆಯಾಗಿವೆ.",
+       "usernameinprogress": "ಈ ಬಳಕೆದಾರರ ಹೆಸರಿನ ಖಾತೆ ರಚನೆ ಈಗಾಗಲೇ ಪ್ರಗತಿಯಲ್ಲಿದೆ.\nದಯಮಾಡಿ ನಿರೀಕ್ಷಿಸಿ.",
        "userexists": "ನೀವು ನೀಡಿದ ಸದಸ್ಯರ ಹೆಸರು ಆಗಲೆ ಬಳಕೆಯಲ್ಲಿದೆ. ದಯವಿಟ್ಟು ಬೇರೊಂದು ಹೆಸರನ್ನು ಆಯ್ಕೆ ಮಾಡಿ.",
        "loginerror": "ಲಾಗಿನ್ ದೋಷ",
-       "createacct-error": "à²\96ಾತà³\86 à²¨à²¿à²°à³\8dಮಾಣ à²¤à³\8dರà³\81à²\9fಿ",
+       "createacct-error": "à²\96ಾತà³\86 à²¨à²¿à²°à³\8dಮಾಣ à²¦à³\8bಷ",
        "createaccounterror": "$1 ಖಾತೆ ನಿರ್ಮಾಣ ಮಾಡಲಿಕ್ಕೆ ಆಗಲಿಲ್ಲ.",
-       "nocookiesnew": "ನಿಮ್ಮ ಬಳಕೆದಾರ ಖಾತೆಯು ಸೃಷ್ಟಿತವಾಗಿದೆ, ಆದರೆ ನೀವು ಲಾಗ್ ಇನ್ ಆಗಿಲ್ಲ.\n{{SITENAME}} ಲಾಗ್ ಇನ್ ಮಾಡಲು cookieಗಳನ್ನು ಉಪಯೋಗಿಸುತ್ತದೆ.\nನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿ cookieಗಳು ನಿಷಿದ್ಧವಾಗಿದೆ.\nದಯವಿಟ್ಟು ಈ ನಿಷೇಧವನ್ನು ತೆಗೆದು, ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರು ಮತ್ತು ಪ್ರವೇಶಪದಗಳನ್ನು ಉಪಯೋಗಿಸಿ ಲಾಗ್ ಇನ್ ಆಗಿ.",
-       "nocookieslogin": "{{SITENAME}} ಬಳಕೆದಾರರನ್ನು ಲಾಗ್ ಇನ್ ಮಾಡಲು cookieಗಳನ್ನು ಉಪಯೋಗಿಸುತ್ತದೆ.\nನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲ್ cookieಗಳ ಉಪಯೋಗ ನಿಷಿದ್ಧವಾಗಿದೆ.\nದಯವಿಟ್ಟು ಆ ನಿಷೇಧವನ್ನು ತೆಗೆದು ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.",
+       "nocookiesnew": "ನಿಮ್ಮ ಬಳಕೆದಾರ ಖಾತೆಯು ಸೃಷ್ಟಿತವಾಗಿದೆ, ಆದರೆ ನೀವು ಲಾಗ್ ಇನ್ ಆಗಿಲ್ಲ.\n{{SITENAME}} ಲಾಗ್ ಇನ್ ಮಾಡಲು ಕುಕೀಸ್ಗಳನ್ನು ಉಪಯೋಗಿಸುತ್ತದೆ.\nನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿ ಕುಕೀಸ್ಗಳು ನಿಷಿದ್ಧವಾಗಿದೆ.\nದಯವಿಟ್ಟು ಈ ನಿಷೇಧವನ್ನು ತೆಗೆದು, ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರು ಮತ್ತು ಪ್ರವೇಶಪದಗಳನ್ನು ಉಪಯೋಗಿಸಿ ಲಾಗ್ ಇನ್ ಆಗಿ.",
+       "nocookieslogin": "{{SITENAME}} ಬಳಕೆದಾರರು ಪ್ರವೇಶಿಸಲು ಕುಕೀಸ್ ಅನ್ನು ಬಳಸುತ್ತಾರೆ.\nನಿಮ್ಮ ಕುಕೀಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.\nದಯವಿಟ್ಟು ಅವುಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ ಮತ್ತು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.",
+       "nocookiesfornew": "ಅದರ ಮೂಲವನ್ನು ನಾವು ಖಚಿತಪಡಿಸಲು ಸಾಧ್ಯವಾಗದ ಕಾರಣ ಬಳಕೆದಾರ ಖಾತೆಯನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ.\nನೀವು ಕುಕೀಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿರುವಿರಾ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ, ಈ ಪುಟವನ್ನು ಮರುಲೋಡ್ ಮಾಡಿ ಮತ್ತು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.",
        "noname": "ನೀವು ಸರಿಯಾದ ಬಳಕೆದಾರ ಹೆಸರನ್ನು ಸೂಚಿಸಿಲ್ಲ.",
        "loginsuccesstitle": "ಲಾಗಿನ್ ಯಶಸ್ವಿ",
-       "loginsuccess": "ನೀವು ಈಗ \"$1\" ಆಗಿ ವಿಕಿಪೀಡಿಯಕ್ಕೆ ಲಾಗಿನ್ ಆಗಿದ್ದೀರಿ.",
-       "nosuchuser": "\"$1\" ಹೆಸರಿನ ಯಾವ ಸದಸ್ಯರೂ ಇಲ್ಲ.\nಸದಸ್ಯನಾಮದಲ್ಲಿ ಲಘು ಮತ್ತು ದೀರ್ಘ ಅಕ್ಷರಗಳಲ್ಲಿ ವ್ಯತ್ಯಾಸವಿದೆ.\nಕಾಗುಣಿತವನ್ನು ಪರೀಕ್ಷಿಸಿ, ಅಥವಾ [[Special:CreateAccount|ಹೊಸ ಸದಸ್ಯತ್ವ ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿ]].",
+       "loginsuccess": "<strong>ನೀವು ಈಗ \"$1\" ಆಗಿ ವಿಕಿಪೀಡಿಯಕ್ಕೆ ಲಾಗಿನ್ ಆಗಿದ್ದೀರಿ.</strong>",
+       "nosuchuser": "\"$1\" à²¹à³\86ಸರಿನ à²¯à²¾à²µ à²¸à²¦à²¸à³\8dಯರà³\82 à²\87ಲà³\8dಲ.\nಸದಸà³\8dಯನಾಮದಲà³\8dಲಿ à²²à²\98à³\81 à²®à²¤à³\8dತà³\81 à²¦à³\80ರà³\8dà²\98 à²\85à²\95à³\8dಷರà²\97ಳಲà³\8dಲಿ à²¸à³\82à²\95à³\8dಷà³\8dಮವಾದ à²µà³\8dಯತà³\8dಯಾಸವಿದà³\86.\nà²\95ಾà²\97à³\81ಣಿತವನà³\8dನà³\81 à²ªà²°à³\80à²\95à³\8dಷಿಸಿ, à²\85ಥವಾ [[Special:CreateAccount|ಹà³\8aಸ à²¸à²¦à²¸à³\8dಯತà³\8dವ à²\96ಾತà³\86ಯನà³\8dನà³\81 à²¸à³\83ಷà³\8dà²\9fಿಸಿ]].",
        "nosuchusershort": "\"$1\" ಹೆಸರಿನ ಸದಸ್ಯರು ಯಾರೂ ಇಲ್ಲ.\nಹೆಸರಲ್ಲಿ ಕಾಗುಣಿತ ತಪ್ಪಿದೆಯೆ ಎಂದು ಪರೀಕ್ಷಿಸಿ.",
        "nouserspecified": "ನೀವು ಒಂದು ಸದಸ್ಯತ್ವದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು.",
        "login-userblocked": "ಈ ಬಳಕೆದಾರರನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. ಲಾಗಿನ್ ಆಗಲು ಸಾದ್ಯವಿಲ್ಲ.",
        "wrongpassword": "ತಪ್ಪು ಪ್ರವೇಶ ಪದ ನೀಡಿರುವಿರಿ. ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.",
        "wrongpasswordempty": "ಖಾಲಿ ಪ್ರವೇಶ ಪದವನ್ನು ನೀಡಿರುವಿರಿ. ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.",
        "passwordtooshort": "ಪ್ರವೇಶಪದ ಕನಿಷ್ಟ {{PLURAL:$1|೧ ಅಕ್ಷರವನ್ನು|$1 ಅಕ್ಷರಗಳನ್ನು}} ಹೊಂದಿರಬೇಕು.",
+       "passwordtoolong": "ಪ್ರವೇಶ ಸಂಕೇತ ಪದ ಕನಿಷ್ಟ {{PLURAL:$1|೧ ಅಕ್ಷರವನ್ನು|$1 ಅಕ್ಷರಗಳನ್ನು}} ಹೊಂದಿರಬೇಕು.",
+       "passwordtoopopular": "ಸಾಮಾನ್ಯವಾಗಿ ಆಯ್ಕೆ ಮಾಡಿದ ಪ್ರವೇಶ ಸಂಕೇತ ಪದಗಳನ್ನು ಬಳಸಲಾಗುವುದಿಲ್ಲ. ದಯವಿಟ್ಟು ಇನ್ನಷ್ಟು ಅನನ್ಯ ಪ್ರವೇಶ ಸಂಕೇತ ಪದಗಳನ್ನು ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿ.",
        "password-name-match": "ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರಿನಿಂದ ಪ್ರವೇಶಪದ ವಿಭಿನ್ನವಾಗಿರಬೇಕು.",
        "password-login-forbidden": "ಈ ಬಳಕೆದಾರರ ಹೆಸರು ಮತ್ತು ಪ್ರವೇಶಪದವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.",
        "mailmypassword": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿ.",
        "passwordremindertitle": "{{SITENAME}}ಗೆ ಹೊಸ ತಾತ್ಕಾಲಿಕ ಪ್ರವೇಶ ಪದ",
-       "passwordremindertext": "{{SITENAME}} ($4) ಸೈಟಿಗೆ ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು $1 ಐ.ಪಿ. ವಿಳಾಸದಿಂದ ಕೋರಲಾಗಿದೆ.\nಸದಸ್ಯ \"$2\" ಅವರ ಹೊಸ ಪ್ರವೇಶಪದ ಈಗ \"$3\".\nನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ ತಮ್ಮ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಿ.\n\nನೀವು ಈ ಕೋರಿಕೆಯನ್ನು ಮಾಡಿಲ್ಲದಿದ್ದರೆ, ಅಥವ ನೀವು ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ನೆನಪಿಸಿಕೊಂಡರೆ ಈ ಮಾಹಿತಿಗೆ ಗಮನ ನೀಡದೆ ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ಉಪಯೋಗಿಸಲು ಮುಂದುವರೆಸಿರಿ.",
+       "passwordremindertext": "{{SITENAME}} ($4) ಸೈಟಿಗೆ ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು $1 ಐ.ಪಿ. ವಿಳಾಸದಿಂದ ಕೋರಲಾಗಿದೆ.\nಸದಸ್ಯ \"$2\" ಅವರ ಹೊಸ ಪ್ರವೇಶಪದ ಈಗ \"$3\".\nನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ ತಮ್ಮ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಿ.\nನಿಮ್ಮ ತಾತ್ಕಾಲಿಕ ಪಾಸ್ವರ್ಡ್ {{PLURAL:$5|ಒಂದು ದಿನ|$5 ದಿನಗಳಲ್ಲಿ}}. ಕೊನೆಗೊಳ್ಳಲಿದೆ.\nನೀವು ಈ ಕೋರಿಕೆಯನ್ನು ಮಾಡಿಲ್ಲದಿದ್ದರೆ, ಅಥವ ನೀವು ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ನೆನಪಿಸಿಕೊಂಡರೆ ಈ ಮಾಹಿತಿಗೆ ಗಮನ ನೀಡದೆ ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ಉಪಯೋಗಿಸಲು ಮುಂದುವರೆಸಿರಿ.",
        "noemail": "ಸದಸ್ಯ \"$1\" ಅವರ ಹೆಸರಿನಲ್ಲಿ ಯಾವ ಇ-ಅಂಚೆ ವಿಳಾಸವೂ ದಾಖಲಾಗಿಲ್ಲ.",
        "noemailcreate": "ನೀವು ಬಳಕೆಯಲ್ಲಿರುವ ಮಿಂಚಂಚೆ ವಿಳಾಸ ನೀಡಬೇಕಾಗುವುದು.",
        "passwordsent": "\"$1\" ಅವರ ಹೆಸರಿನಲ್ಲಿ ನೋಂದಾಯಿತವಾದ ಇ-ಅಂಚೆ ವಿಳಾಸಕ್ಕೆ ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.\nಅದನ್ನು ಪಡೆದ ಮೇಲೆ ಮತ್ತೆ ಲಾಗಿನ್ ಆಗಿ.",
        "eauthentsent": "ನೀವು ನೊಂದಾಯಿಸಿದ ಇ-ಅಂಚೆ ವಿಳಾಸಕ್ಕೆ ಧೃಡೀಕರಣ ಅಂಚೆಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.\nಈ ವಿಳಾಸಕ್ಕೆ ಮುಂದೆ ಯಾವುದೇ ಇ-ಅಂಚೆ ಕಳುಹಿಸಲ್ಪಡುವ ಮುನ್ನ ನೀವು ಈ ಕಳುಹಿಸಿರುವ ಅಂಚೆಯಲ್ಲಿನ ನಿರ್ದೇಶನಗಳನ್ನು ಪಾಲಿಸಿ, ಈ ವಿಳಾಸವು ನಿಮ್ಮದೇ ಎಂದು ಧೃಡೀಕರಿಸಬೇಕು.",
        "throttled-mailpassword": "ಕಳೆದ $1 ಗಂಟೆಗಳ ಒಳಗೆ ಒಂದು ಪ್ರವೇಶ ಪದವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.\nದುರುಪಯೋಗಗಳನ್ನು ತಡೆಗಟ್ಟಲು ಪ್ರವೇಶಪದಗಳನ್ನು ಪ್ರತಿ {{PLURAL:$1|ಗಂಟೆಗೆ|$1 ಗಂಟೆಗಳಲ್ಲಿ}} ಕೇವಲ ಒಂದು ಬಾರಿ ಕಳುಹಿಸಲಾಗುವುದು.",
        "mailerror": "ಅಂಚೆ ಕಳುಹಿಸುವಲ್ಲಿ ದೋಷ: $1",
-       "acct_creation_throttle_hit": "ಕ್ಷಮಿಸಿ, ನೀವಾಗಲೇ{{PLURAL:$1|೧ ಖಾತೆಯನ್ನು|$1 ಖಾತೆಗಳನ್ನು}} ತೆರೆದಿದ್ದೀರಿ.\nಇನ್ನು ಹೆಚ್ಚಿನ ಖಾತೆಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.",
+       "acct_creation_throttle_hit": "ಕ್ಷಮಿಸಿ, ನೀವಾಗಲೇ{{PLURAL:$1|೧ ಖಾತೆಯನ್ನು|$1 ಖಾತೆಗಳನ್ನು}} ತೆರೆದಿದ್ದೀರಿ. ಕಳೆದ $2, ಅವಧಿಯಲ್ಲಿ ಅನುಮತಿಸಲಾದ ಗರಿಷ್ಠ.\nಇನ್ನು ಹೆಚ್ಚಿನ ಖಾತೆಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.",
        "emailauthenticated": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವು ದಿನಾಂಕ $2 ಸಮಯ $3 ಅಂದು ಧೃಡೀಕೃತವಾಗಿದೆ.",
        "emailnotauthenticated": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸ ಇನ್ನೂ ಧೃಡೀಕೃತವಾಗಿಲ್ಲ.\nಈ ಕೆಳಗಿನ ಆಯ್ಕೆಗಳಿಗೆ ಇ-ಅಂಚೆಯನ್ನು ನಿಮಗೆ ಕಳುಹಿಸಲು ಆಗುವುದಿಲ್ಲ.",
        "noemailprefs": "ಈ ಸೌಲಭ್ಯಗಳು ಕೆಲಸ ಮಾಡಬೇಕಾದರೆ ಒಂದು ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ.",
        "emailconfirmlink": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ಧೃಡೀಕರಿಸಿ",
        "invalidemailaddress": "ಈ ಇ-ಅಂಚೆ ವಿಳಾಸವು ಸರಿಯಾದ ಪ್ರಕಾರದಲ್ಲಿ ಇಲ್ಲದಿರುವುದರಿಂದ ಇದನ್ನು ಸ್ವೀಕಾರ ಮಾಡಲಾಗುವುದಿಲ್ಲ.\nದಯವಿಟ್ಟು ಸರಿಯಾದ ಪ್ರಕಾರದ ವಿಳಾಸವನ್ನು ಸೇರಿಸಿ ಅಥವ ಆ ಚೌಕವನ್ನು ಖಾಲಿ ಬಿಡಿ.",
+       "cannotchangeemail": "ಈ ವಿಕಿ ಖಾತೆಯಲ್ಲಿ ಇಮೇಲ್ ವಿಳಾಸಗಳನ್ನು ಬದಲಾಯಿಸಲಾಗುವುದಿಲ್ಲ.",
        "emaildisabled": "ಈ ಜಾಲತಾಣವು ಮಿಂಚಂಚೆ ಕಳುಹಿಸಲು ಸಾದ್ಯವಿಲ್ಲ.",
        "accountcreated": "ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಲಾಯಿತು",
-       "accountcreatedtext": "$1 ಅವರ ಬಳಕೆದಾರ ಖಾತೆ ಸೃಷ್ಟಿಸಲ್ಪಟ್ಟಿದೆ.",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ಚರ್ಚೆ]])\n, ಅವರ ಬಳಕೆದಾರ ಖಾತೆ ಸೃಷ್ಟಿಸಲ್ಪಟ್ಟಿದೆ.",
        "createaccount-title": "{{SITENAME}} ತಾಣಕ್ಕೆ ಬಳಕೆದಾರ ಖಾತೆ ಸೃಷ್ಟಿ ಮಾಡುವಿಕೆ",
        "createaccount-text": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸ ನೀಡಿ {{SITENAME}} ($4) ಅಲ್ಲಿ ಯಾರೊ \"$2\" ಹೆಸರಿನ ಖಾತೆಯೊಂದನ್ನು ತೆಗೆದಿದ್ದಾರೆ, ಮತ್ತು ಅದರ ಪ್ರವೇಶ ಪದ \"$3\".\nನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ ನಿಮ್ಮ ಪ್ರವೇಶ ಪದವನ್ನು ಬದಲಾಯಿಸಬೇಕು.\n\nಆ ಖಾತೆ ತಪ್ಪಾಗಿ ತೆಗೆದಿದ್ದಲ್ಲಿ, ಈ ಸಂದೇಶವನ್ನು ನೀವು ಅಲಕ್ಷಿಸಬಹುದು.",
+       "login-throttled": "ನೀವು ಬಹಳ ಸಾರಿ ಲಾಗ್ ಇನ್ ಆಗಲು ಪ್ರಯತ್ನಿಸಿರುವಿರಿ. \nಮತ್ತೆ ಪ್ರಯತ್ನಿಸಲು $1 ಕಾಯಬೇಕು.",
        "login-abort-generic": "ನಿಮ್ಮ ಲಾಗಿನ್ ಪಲಪ್ರದವಾಗಿಲ್ಲ-ವಿಫಲವಾಗಿದೆ",
+       "login-migrated-generic": "ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಸ್ಥಳಾಂತರಗೊಳಿಸಲಾಗಿದೆ, ಮತ್ತು ನಿಮ್ಮ ಬಳಕೆದಾರಹೆಸರು ಈ ವಿಕಿ ಯಲ್ಲಿ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ.",
        "loginlanguagelabel": "ಭಾಷೆ: $1",
+       "suspicious-userlogout": "ಲಾಗ್ ಔಟ್ ಮಾಡಲು ನಿಮ್ಮ ವಿನಂತಿಯನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಅದು ಮುರಿದ ಬ್ರೌಸರ್ ಅಥವಾ ಕ್ಯಾಶಿಂಗ್ ಪ್ರಾಕ್ಸಿನಿಂದ ಕಳುಹಿಸಲ್ಪಟ್ಟಿದೆ ಎಂದು ತೋರುತ್ತಿದೆ.",
        "createacct-another-realname-tip": "ಹೆಸರು ನೀಡುವುದು ಐಚ್ಛಿಕ. ನೀವು ಅದನ್ನು ನೀಡಿದಲ್ಲಿ ನಿಮ್ಮ ಕಾಣಿಕೆಗಳಿಗೆ ನಿಮಗೆ ಮನ್ನಣೆ ನೀಡಲಾಗುವುದು.",
        "pt-login": "ಲಾಗ್ ಇನ್",
        "pt-login-button": "ಲಾಗ್ ಇನ್",
+       "pt-login-continue-button": "ಲಾಗಿನ್ ಮುಂದುವರಿಸಿ",
        "pt-createaccount": "ಹೊಸ ಖಾತೆ ತೆರೆಯಿರಿ",
        "pt-userlogout": "ಲಾಗ್ ಔಟ್",
+       "php-mail-error-unknown": "PHP's mail() ಕಾರ್ಯದಲ್ಲಿ ಅಜ್ಞಾತ ದೋಷ.",
+       "user-mail-no-addy": "ಇಮೇಲ್ ವಿಳಾಸವಿಲ್ಲದೆ ಇಮೇಲ್ ಕಳುಹಿಸಲು ಪ್ರಯತ್ನಿಸಿದರು.",
+       "user-mail-no-body": "ಖಾಲಿ ಅಥವಾ ಅವಿವೇಕದ ಚಿಕ್ಕ ದೇಹದೊಂದಿಗೆ ಇಮೇಲ್ ಕಳುಹಿಸಲು ಪ್ರಯತ್ನಿಸಿದರು.",
        "changepassword": "ಪ್ರವೇಶ ಪದ ಬದಲಾಯಿಸಿ",
        "resetpass_announce": "ಲಾಗ್ ಇನ್ ಪೂರ್ಣಗೊಳಿಸಲು ನೀವು ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು ನಮೂದಿಸಬೇಕು.",
        "resetpass_header": "ಖಾತೆಯ ಪ್ರವೇಶಪದ ಬದಲಾಯಿಸಿ",
        "oldpassword": "ಹಳೆಯ ಪ್ರವೇಶ ಪದ",
        "newpassword": "ಹೊಸ ಪ್ರವೇಶ ಪದ",
-       "retypenew": "ಹà³\8aಸ à²ªà³\8dರವà³\87ಶಪದವನà³\8dನà³\81 à²®à²¤à³\8dತà³\86 à²\9fà³\88ಪಿಸà³\81:",
+       "retypenew": "ಹà³\8aಸ à²ªà³\8dರವà³\87ಶಪದವನà³\8dನà³\81 à²®à²¤à³\8dತà³\86 à²¨à²®à³\82ದಿಸಿ:",
        "resetpass_submit": "ಪ್ರವೇಶ ಪದವನ್ನು ನಿಶ್ಚಯಿಸಿ ಲಾಗ್ ಇನ್ ಆಗಿ",
        "changepassword-success": "ನಿಮ್ಮ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ!",
        "changepassword-throttled": "ನೀವು ಬಹಳ ಸಾರಿ ಲಾಗ್ ಇನ್ ಆಗಲು ಪ್ರಯತ್ನಿಸಿರುವಿರಿ. \nಮತ್ತೆ ಪ್ರಯತ್ನಿಸಲು $1 ಕಾಯಬೇಕು.",
        "botpasswords": "ಬಾಟ್ ಪ್ರವೇಶ ಪದಗಳು",
+       "botpasswords-disabled": "ಬಾಟ್ ಪ್ರವೇಶಪದ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.",
+       "botpasswords-no-central-id": "ಬಾಟ್ ಪ್ರವೇಶಪದ ಬಳಸಲು, ನೀವು ಕೇಂದ್ರೀಕೃತ ಖಾತೆಗೆ ಲಾಗ್ ಇನ್ ಆಗಿರಬೇಕು.",
+       "botpasswords-existing": "ಆಸ್ಥಿತ್ವದಲ್ಲಿರುವ ಬಾಟ್ ಪ್ರವೇಶಪದ",
+       "botpasswords-createnew": "ಹೊಸ ಬಾಟ್ ಪ್ರವೇಶಪದ ರಚಿಸಿ",
+       "botpasswords-editexisting": "ಆಸ್ಥಿತ್ವದಲ್ಲಿರುವ ಬಾಟ್ ಪ್ರವೇಶಪದ ಸ೦ಪಾದಿಸಿ",
        "resetpass_forbidden": "ಪ್ರವೇಶಪದಗಳನ್ನು ಬದಲಾಯಿಸುವಂತಿಲ್ಲ.",
        "resetpass-no-info": "ನೀವು ಈ ಪುಟವನ್ನು ನೇರತಲುಪಲು ಲಾಗಿನ್ ಆಗಿರುವುದು ಆವಶ್ಯಕ.",
        "resetpass-submit-loggedin": "ಪ್ರವೇಶಪದ ಬದಲಾಯಿಸು",
        "passwordreset-username": "ಬಳಕೆದಾರರ ಹೆಸರು:",
        "passwordreset-domain": "ಕ್ಷೇತ್ರ:",
        "passwordreset-email": "ಇ-ಮೇಲ್ ವಿಳಾಸ:",
-       "passwordreset-emailsentemail": "ಪà³\8dರವà³\87ಶಪದವನà³\8dನà³\81 à²ªà³\81ನà²\83ಸà³\8dಥಾಪಿಸಿದ à²®à²¿à²\82à²\9aà²\82à²\9aà³\86ಯನà³\8dನà³\81 à²\95ಳà³\81ಹಿಸಲಾà²\97ಿದೆ.",
-       "changeemail": "ಮಿà²\82à²\9aà²\82à²\9aà³\86 à²µà²¿à²³à²¾à²¸à²µà²¨à³\8dನà³\81 à²¬à²¦à²²à²¾à²¯à²¿à²¸ಿ",
+       "passwordreset-emailsentemail": "à²\88 à²\87ಮà³\87ಲà³\8d à²µà²¿à²³à²¾à²¸à²µà³\81 à²¨à²¿à²®à³\8dಮ à²\96ಾತà³\86ಯà³\8aà²\82ದಿà²\97à³\86 à²¸à²\82ಯà³\8bà²\9cಿತà²\97à³\8aà²\82ಡಿದà³\8dದರà³\86, à²ªà³\8dರವà³\87ಶಪದ à²®à²°à³\81ಹà³\8aà²\82ದಿಸಲà³\81 à²\87ಮà³\87ಲà³\8d à²\85ನà³\8dನà³\81 à²\95ಳà³\81ಹಿಸಲಾà²\97à³\81ತà³\8dತದೆ.",
+       "changeemail": "à²\87ಮà³\87ಲà³\8d à²µà²¿à²³à²¾à²¸à²µà²¨à³\8dನà³\81 à²¬à²¦à²²à²¾à²¯à²¿à²¸à²¿ à²\85ಥವಾ à²¤à³\86à²\97à³\86ದà³\81ಹಾà²\95ಿ",
        "changeemail-no-info": "ನೀವು ಈ ಪುಟವನ್ನು ನೇರತಲುಪಲು ಲಾಗಿನ್ ಆಗಿರುವುದು ಆವಶ್ಯಕ.",
        "changeemail-oldemail": "ಪ್ರಸ್ತುತ ಮಿಂಚಂಚೆ ವಿಳಾಸ:",
        "changeemail-newemail": "ಹೊಸ  ಇ-ಅಂಚೆ ವಿಳಾಸ:",
        "bold_tip": "ದಪ್ಪಗಿನ ಅಚ್ಚು",
        "italic_sample": "ಓರೆ ಅಕ್ಷರಗಳು",
        "italic_tip": "ಓರೆ ಅಕ್ಷರಗಳು",
-       "link_sample": "ಸà²\82ಪರà³\8dà²\95ದ à²¹à³\86ಸರà³\81",
+       "link_sample": "ಲಿà²\82à²\95à³\8d à²¶à³\80ರà³\8dಷಿà²\95à³\86",
        "link_tip": "ಆಂತರಿಕ ಸಂಪರ್ಕ",
        "extlink_sample": "http://www.example.com ಸಂಪರ್ಕ ಶೀರ್ಷಿಕೆ",
        "extlink_tip": "ಬಾಹ್ಯ ಸಂಪರ್ಕ (http:// ಇಂದ ಶುರು ಮಾಡಿ)",
        "headline_sample": "ಶಿರೋಲೇಖ",
        "headline_tip": "೨ನೇ ಮಟ್ಟದ ತಲೆಬರಹ",
-       "nowiki_sample": "à²\88 à²\9cಾà²\97ದಲà³\8dಲಿ à²¬à²°à³\86ಯಲà³\8dಪà²\9fà³\8dà²\9fದà³\8dದà³\81 à²µà²¿à²\95à³\80à²\95ರಣ à²\86à²\97à³\81ವà³\81ದಿಲà³\8dಲ",
+       "nowiki_sample": "à²\87ಲà³\8dಲಿ à²µà²¿à²\95à³\80 à²«à²¾à²°à³\8dಮಾà²\9fà³\8d à²®à²¾à²¡à²¦ à²ªà² à³\8dಯವನà³\8dನà³\81 à²¸à³\87ರಿಸಿ",
        "nowiki_tip": "ವಿಕಿ ರಚನಕ್ರಮವನ್ನು ಅಲಕ್ಷಿಸು",
-       "image_tip": "à²\85ಳವಡಿಸಲà³\8dಪà²\9fà³\8dà²\9f à²«à³\88ಲà³\81",
-       "media_tip": "ಫà³\88ಲಿà²\97à³\86 ಕೊಂಡಿ",
+       "image_tip": "à²\85ಳವಡಿಸಲà³\8dಪà²\9fà³\8dà²\9f à²\95ಡತ",
+       "media_tip": "à²\95ಡತದ ಕೊಂಡಿ",
        "sig_tip": "ಸಮಯಮುದ್ರೆಯೊಂದಿಗೆ ನಿಮ್ಮ ಸಹಿ",
        "hr_tip": "ಅಡ್ಡ ಗೆರೆ (ಆದಷ್ಟು ಕಡಿಮೆ ಉಪಯೋಗಿಸಿ)",
        "summary": "ಸಾರಾಂಶ:",
        "preview": "ಮುನ್ನೋಟ",
        "showpreview": "ಮುನ್ನೋಟ ತೋರಿಸು",
        "showdiff": "ಬದಲಾವಣೆಗಳನ್ನು ತೋರಿಸು",
-       "blankarticle": "<strong>ಎಚ್ಚರಿಕೆ:</strong> ನೀವು ಸೃಷ್ಟಿಸುತ್ತಿರುವ ಪುಟ ಖಾಲಿ ಇದೆ.\n\"{{int:savearticle}}\" ಅನ್ನು ಮತ್ತೆ ಕ್ಲಿಕ್ಕಿಸಿದರೆ, ಏನೂ ಇರದಂತೆಯೆ ಈ ಪುಟವು ಸೃಷ್ಟಿಯಾಗುತ್ತದೆ.",
+       "blankarticle": "<strong>ಎಚ್ಚರಿಕೆ:</strong> ನೀವು ಸೃಷ್ಟಿಸುತ್ತಿರುವ ಪುಟ ಖಾಲಿ ಇದೆ.\n\"$1\" ಅನ್ನು ಮತ್ತೆ ಕ್ಲಿಕ್ಕಿಸಿದರೆ, ಏನೂ ಇರದಂತೆಯೆ ಈ ಪುಟವು ಸೃಷ್ಟಿಯಾಗುತ್ತದೆ.",
        "anoneditwarning": "<strong>ಎಚ್ಚರ:</strong> ನೀವು ಲಾಗ್ ಇನ್ ಆಗಿಲ್ಲ. ನೀವು ಸಂಪಾದನೆ ಮಾಡಿದಲ್ಲಿ ನಿಮ್ಮ ಐಪಿ ವಿಳಾಸವು ಎಲ್ಲರಿಗೂ ಕಾಣಲು ಸಿಗುತ್ತದೆ. ನೀವು <strong>[$1 ಲಾಗ್ ಇನ್ ಆದರೆ]</strong> ಅಥವ <strong>[$2 ಹೊಸ ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿದರೆ]</strong>, ನಿಮ್ಮ ಸಂಪಾದನೆಗಳನ್ನು ನೀವು ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರಿನ ಅಡಿಯಲ್ಲಿ ಪ್ರದರ್ಶಿಸಬಹುದು.",
-       "anonpreviewwarning": "''ನೀವು ಲಾಗಿನ್ ಆಗಿಲ್ಲ . ಉಳಿಸಲು ಪ್ರಯತ್ನಿಸಿದಾಗ ನಿಮ್ಮ IP ವಿಳಾಸವನ್ನು ಈ ಪುಟದ ಸಂಪಾದನೆ ಇತಿಹಾಸದಲ್ಲಿ ನಮೂದಿಸಲಗುವುದು.''",
-       "missingsummary": "'''ಗಮನಿಸಿ:''' ನಿಮ್ಮ ಸಂಪಾದನೆಯ ಸಾರಾಂಶವನ್ನು ನೀವು ನೀಡಿಲ್ಲ. ಮತ್ತೊಮ್ಮೆ \"ಉಳಿಸು\" ಗುಂಡಿಯನ್ನು ಒತ್ತಿದರೆ, ಸಾರಾಂಶವಿಲ್ಲದೆಯೇ ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸಲಾಗುವುದು.",
+       "anonpreviewwarning": "<em>ನೀವು ಲಾಗಿನ್ ಆಗಿಲ್ಲ . ಉಳಿಸಲು ಪ್ರಯತ್ನಿಸಿದಾಗ ನಿಮ್ಮ IP ವಿಳಾಸವನ್ನು ಈ ಪುಟದ ಸಂಪಾದನೆ ಇತಿಹಾಸದಲ್ಲಿ ನಮೂದಿಸಲಗುವುದು.''</em>",
+       "missingsummary": "<strong>ಗಮನಿಸಿ: </strong> ನಿಮ್ಮ ಸಂಪಾದನೆಯ ಸಾರಾಂಶವನ್ನು ನೀವು ನೀಡಿಲ್ಲ. ಮತ್ತೊಮ್ಮೆ \"$1\" ಗುಂಡಿಯನ್ನು ಒತ್ತಿದರೆ, ಸಾರಾಂಶವಿಲ್ಲದೆಯೇ ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸಲಾಗುವುದು.",
        "missingcommenttext": "ಕೆಳಗೆ ಒಂದು ಟಿಪ್ಪಣಿ ನಮೂದಿಸಿ",
-       "missingcommentheader": "<strong>ಗಮನಿಸಿ:</strong> ನಿಮ್ಮ ಸಂಪಾದನೆಯ ಸಾರಾಂಶವನ್ನು ನೀವು ನೀಡಿಲ್ಲ. ಮತ್ತೊಮ್ಮೆ \"{{int:savearticle}}\" ಅನ್ನು ಒತ್ತಿದರೆ, ಸಾರಾಂಶವಿಲ್ಲದೆಯೇ ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸಲಾಗುವುದು.",
+       "missingcommentheader": "<strong>ಗಮನಿಸಿ:</strong> ನಿಮ್ಮ ಸಂಪಾದನೆಯ ಸಾರಾಂಶವನ್ನು ನೀವು ನೀಡಿಲ್ಲ. ಮತ್ತೊಮ್ಮೆ \"$1\" ಅನ್ನು ಒತ್ತಿದರೆ, ಸಾರಾಂಶವಿಲ್ಲದೆಯೇ ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸಲಾಗುವುದು.",
        "summary-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, ಮತ್ತು ಈ ನಿರ್ಭಂಧನೆಯ ಕ್ರಮಸಂಖ್ಯೆ (ID) #$5.\nದಯವಿಟ್ಟು ನಿಮ್ಮ ಸಂಪರ್ಕಗಳಲ್ಲಿ ಈ ಸಂಖ್ಯೆಗಳನ್ನು ಸೇರಿಸಿ.",
-       "autoblockedtext": "$1 ಅವರಿಂದ ತಡೆಹಿಡಿಯಲ್ಪಟ್ಟ ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರ ನಿಮ್ಮ ಐಪಿ ವಿಳಾಸವನ್ನು ಉಪಯೋಗಿಸುತ್ತಿದ್ದರಿಂದ ಅ ವಿಳಾಸವನ್ನು ಯಾಂತ್ರಿಕವಾಗಿ ತಡೆಹಿಡಿಯಲ್ಪಟ್ಟಿದೆ.\nತಡೆಗೆ ನೀಡಿರುವ ಕಾರಣ:\n\n:''$2''\n\n* ತಡೆಯ ಪ್ರಾರಂಭ: $8\n* ತಡೆಯ ಅಂತ್ಯ: $6\n* ಉದ್ದೇಶಿತ ತಡೆ: $7\n\nನೀವು $1 ಅವರನ್ನು ಅಥವ ಇತರ [[{{MediaWiki:Grouppage-sysop}}|ನಿರ್ವಾಹಕರನ್ನು]] ಈ ತಡೆಯನ್ನು ಚರ್ಚಿಸಲು ಸಂಪರ್ಕಿಸಬಹುದು.\nಗಮನಿಸಿ: ನಿಮ್ಮ [[Special:Preferences|ಬಳಕೆದಾರ ಪ್ರಾಶಸ್ತ್ಯಗಳಲ್ಲಿ]] ಧೃಡೀಕೃತ ಇ-ಅಂಚೆ ವಿಳಾಸ ನೀಡಿದ್ದಲ್ಲಿ ಮತ್ತು ಅದನ್ನು ಉಪಯೋಗಿಸದಂತೆ ತಡೆಹಿಡಿಯಲ್ಪಟ್ಟಿಲ್ಲದಿದ್ದಲ್ಲಿ ಮಾತ್ರ \"ಸದಸ್ಯರಿಗೆ ಇ-ಅಂಚೆ ಕಳಿಸಿ\" ಸೌಲಭ್ಯವನ್ನು ಉಪಯೋಗಿಸಬಹುದು.\n\nನಿಮ್ಮ ಪ್ರಸ್ತಕ ಐಪಿ ವಿಳಾಸ $3, ಮತ್ತು ಈ ತಡೆಯ ಸಂಖ್ಯೆ $5.\nನೀವು ಸಂಪರ್ಕಿಸಿದಾಗ ದಯವಿಟ್ಟು ಈ ವಿವರಣೆಗಳನ್ನು ಸೇರಿಸಿ.",
+       "blockedtext": "<strong>\nನಿಮ್ಮ ಸದಸ್ಯತ್ವವನ್ನು ಅಥವ IP ವಿಳಾಸವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</strong>\n\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, ಮತ್ತು ಈ ನಿರ್ಭಂಧನೆಯ ಕ್ರಮಸಂಖ್ಯೆ (ID) #$5.\nದಯವಿಟ್ಟು ನಿಮ್ಮ ಸಂಪರ್ಕಗಳಲ್ಲಿ ಈ ಸಂಖ್ಯೆಗಳನ್ನು ಸೇರಿಸಿ.",
+       "autoblockedtext": "$1 ಅವರಿಂದ ತಡೆಹಿಡಿಯಲ್ಪಟ್ಟ ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರ ನಿಮ್ಮ ಐಪಿ ವಿಳಾಸವನ್ನು ಉಪಯೋಗಿಸುತ್ತಿದ್ದರಿಂದ ಅ ವಿಳಾಸವನ್ನು ಯಾಂತ್ರಿಕವಾಗಿ ತಡೆಹಿಡಿಯಲ್ಪಟ್ಟಿದೆ.\nತಡೆಗೆ ನೀಡಿರುವ ಕಾರಣ:\n\n:<em>$2</em>\n\n* ತಡೆಯ ಪ್ರಾರಂಭ: $8\n* ತಡೆಯ ಅಂತ್ಯ: $6\n* ಉದ್ದೇಶಿತ ತಡೆ: $7\n\nನೀವು $1 ಅವರನ್ನು ಅಥವ ಇತರ [[{{MediaWiki:Grouppage-sysop}}|ನಿರ್ವಾಹಕರನ್ನು]] ಈ ತಡೆಯನ್ನು ಚರ್ಚಿಸಲು ಸಂಪರ್ಕಿಸಬಹುದು.\nಗಮನಿಸಿ: ನಿಮ್ಮ [[Special:Preferences|ಬಳಕೆದಾರ ಪ್ರಾಶಸ್ತ್ಯಗಳಲ್ಲಿ]] ಧೃಡೀಕೃತ ಇ-ಅಂಚೆ ವಿಳಾಸ ನೀಡಿದ್ದಲ್ಲಿ ಮತ್ತು ಅದನ್ನು ಉಪಯೋಗಿಸದಂತೆ ತಡೆಹಿಡಿಯಲ್ಪಟ್ಟಿಲ್ಲದಿದ್ದಲ್ಲಿ ಮಾತ್ರ \"ಸದಸ್ಯರಿಗೆ ಇ-ಅಂಚೆ ಕಳಿಸಿ\" ಸೌಲಭ್ಯವನ್ನು ಉಪಯೋಗಿಸಬಹುದು.\n\nನಿಮ್ಮ ಪ್ರಸ್ತಕ ಐಪಿ ವಿಳಾಸ $3, ಮತ್ತು ಈ ತಡೆಯ ಸಂಖ್ಯೆ $5.\nನೀವು ಸಂಪರ್ಕಿಸಿದಾಗ ದಯವಿಟ್ಟು ಈ ವಿವರಣೆಗಳನ್ನು ಸೇರಿಸಿ.",
        "blockednoreason": "ಯಾವ ಕಾರಣವೂ ನೀಡಲಾಗಿಲ್ಲ",
        "whitelistedittext": "ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸಲು ನೀವು $1 ಆಗಬೇಕು.",
        "confirmedittext": "ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸುವ ಮುನ್ನ ನೀವು ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ಧೃಡೀಕರಿಸಬೇಕು.\nದಯವಿಟ್ಟು [[Special:Preferences|ಬಳಕೆದಾರ ಆಯ್ಕೆಗಳು]] ಪುಟದಲ್ಲಿ ತಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ ಮತ್ತು ಧೃಡೀಕರಿಸಿ.",
-       "nosuchsectiontitle": "à²\86 à²¹à³\86ಸರಿನ à²µà²¿à²­à²¾à²\97 à²¯à²¾à²µà³\81ದà³\82 à²\87ಲà³\8dಲ",
+       "nosuchsectiontitle": "ಆ ಹೆಸರಿನ ವಿಭಾಗ ಇಲ್ಲ",
        "nosuchsectiontext": "ನೀವು ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇರದ ಒಂದು ವಿಭಾಗವನ್ನು ಸಂಪಾದಿಸಲು ಪ್ರಯತ್ನಿಸಿದಿರಿ.\nನೀವು ಪುಟವನ್ನು ವೀಕ್ಷಿಸುವಾಗ ಆ ವಿಭಾಗವು ಸ್ಥಳಾಂತರಗೊಂಡಿರಬಹುದು ಅಥವ ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು.",
        "loginreqtitle": "ಲಾಗಿನ್ ಆಗಬೇಕು",
        "loginreqlink": "ಲಾಗ್ ಇನ್",
        "accmailtext": "[[User talk:$1|$1]] ಅವರ ಹೊಸ ಪ್ರವೇಶಪದ $2 ಗೆ ಕಳುಹಿಸಲಾಗಿದೆ.\n\nಈ ಖಾತೆಯ ಪ್ರವೇಶಪದವನ್ನು ಲಾಗಿನ್ ಆದ ನಂತರ ''[[Special:ChangePassword|ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ]]'' ಪುಟದಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು.",
        "newarticle": "(ಹೊಸತು)",
        "newarticletext": "ಇನ್ನೂ ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇರದ ಪುಟದ ಲಿಂಕ್ ಅನ್ನು ನೀವು ಒತ್ತಿರುವಿರಿ.\nಈ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಲು ಕೆಳಗಿನ ಚೌಕದಲ್ಲಿ ಬರೆಯಲು ಆರಂಭಿಸಿರಿ.\n(ಹೆಚ್ಚು ಮಾಹಿತಿಗೆ [$1 ಸಹಾಯ ಪುಟ] ನೋಡಿ).\nಈ ಪುಟಕ್ಕೆ ನೀವು ತಪ್ಪಾಗಿ ಬಂದಿದ್ದಲ್ಲಿ ನಿಮ್ಮ ಬ್ರೌಸರ್‍ನ '''back''' ಬಟನ್ ಅನ್ನು ಒತ್ತಿ.",
-       "anontalkpagetext": "----''ಇದು ಖಾತೆಯೊಂದನ್ನು ಹೊಂದಿರದ ಅನಾಮಧೇಯ ಬಳಕೆದಾರರೊಬ್ಬರ ಚರ್ಚೆ ಪುಟ.\nಖಾತೆಯಿಲ್ಲದಿರುವುದರಿಂದ ಅವರನ್ನು ಗುರುತಿಸಲು ಅವರ IP ವಿಳಾಸವನ್ನು ಉಪಯೋಗಿಸುತ್ತಿದ್ದೇವೆ.\nಈ ರೀತಿಯ IP ವಿಳಾಸವು ಅನೇಕ ಬಳಕೆದಾರರಿಂದ ಉಪಯೋಗದಲ್ಲಿರಬಹುದು.\nನೀವು ಅನಾಮಧೇಯ ಬಳಕೆದಾರರಾಗಿದ್ದಲ್ಲಿ, ಹಾಗು ನಿಮಗೆ ಸಂಬಂಧವಿಲ್ಲದಂತ ಸಂದೇಶಗಳು ಬರುತ್ತಿವೆ ಎಂದು ಅನಿಸಿದರೆ, ಮುಂದೆ ಬೇರೆ ಅನಾಮಧೇಯ ಬಳಕೆದಾರರೊಂದಿಗೆ ತಪ್ಪಾಗಿ ಗುರುತಿಸಬಾರದೆಂದಿದ್ದರೆ ದಯವಿಟ್ಟು [[Special:CreateAccount|ಸದಸ್ಯರಾಗಿ]] ಅಥವ [[Special:UserLogin|ಲಾಗ್ ಇನ್ ಆಗಿ]].''",
+       "anontalkpagetext": "----\n<em>ಇದು ಖಾತೆಯೊಂದನ್ನು ಹೊಂದಿರದ ಅನಾಮಧೇಯ ಬಳಕೆದಾರರೊಬ್ಬರ ಚರ್ಚೆ ಪುಟ. ಖಾತೆಯಿಲ್ಲದಿರುವುದರಿಂದ ಅವರನ್ನು ಗುರುತಿಸಲು ಅವರ IP ವಿಳಾಸವನ್ನು ಉಪಯೋಗಿಸುತ್ತಿದ್ದೇವೆ.</em>\nಈ ರೀತಿಯ IP ವಿಳಾಸವು ಅನೇಕ ಬಳಕೆದಾರರಿಂದ ಉಪಯೋಗದಲ್ಲಿರಬಹುದು.\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}}|ಈ ಶೀರ್ಷಿಕೆಗಾಗಿ ಹುಡುಕಬಹುದು]], ಅಥವಾ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂಧಿಸಿದ ದಾಖಲೆಗಳನ್ನು ಹುಡುಕಬಹುದು]</span>, ಆದರೆ ನಿಮಗೆ ಈ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಲು ಅನುಮತಿಯಿಲ್ಲ.",
-       "userpage-userdoesnotexist": "ಬಳಕೆದಾರ ಖಾತೆ \"<nowiki>$1</nowiki>\" ದಾಖಲಾಗಿಲ್ಲ. ನೀವು ಇದೇ ಪುಟವನ್ನು ಸೃಷ್ಟಿ/ಸಂಪಾದನೆ ಮಾಡಬೇಕೆಂದಿರುವಿರಿ ಎಂದು ಖಾತ್ರಿ ಮಾಡಿಕೊಳ್ಳಿ.",
+       "userpage-userdoesnotexist": "ಬಳಕೆದಾರ ಖಾತೆ \"$1\" ದಾಖಲಾಗಿಲ್ಲ. ನೀವು ಇದೇ ಪುಟವನ್ನು ಸೃಷ್ಟಿ/ಸಂಪಾದನೆ ಮಾಡಬೇಕೆಂದಿರುವಿರಿ ಎಂದು ಖಾತ್ರಿ ಮಾಡಿಕೊಳ್ಳಿ.",
        "blocked-notice-logextract": "ಈ ಬಳಕೆದಾರರನ್ನು  ಪ್ರಸ್ತುತವಾಗಿ  ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. \nಇತ್ತೀಚಿನ  ನಿರ್ಬಂಧನೆಯ ದಾಖಲೆಯನ್ನು ಉಲ್ಲೇಖಕ್ಕಾಗಿ ಕೆಳಗೆ ಕೊಟ್ಟಿದೆ:",
-       "usercssyoucanpreview": "'''ಗಮನಿಸಿ:''' ಉಳಿಸುವ ಮುನ್ನ 'ಮುನ್ನೋಟ' ಗುಂಡಿಯನ್ನು ಉಪಯೋಗಿಸಿ ನಿಮ್ಮ ಹೊಸ CSS ಅನ್ನು ಪ್ರಯೋಗ ಮಾಡಿ.",
+       "usercssyoucanpreview": "<strong>ಗಮನಿಸಿ:</strong> ಉಳಿಸುವ ಮುನ್ನ \"{{int:showpreview}}\" ಗುಂಡಿಯನ್ನು ಉಪಯೋಗಿಸಿ ನಿಮ್ಮ ಹೊಸ CSS ಅನ್ನು ಪ್ರಯೋಗ ಮಾಡಿ.",
        "userjsyoucanpreview": "'''ಗಮನಿಸಿ:''' ಉಳಿಸುವ ಮುನ್ನ 'ಮುನ್ನೋಟ' ಗುಂಡಿಯನ್ನು ಉಪಯೋಗಿಸಿ ನಿಮ್ಮ ಹೊಸ JS ಅನ್ನು ಪ್ರಯೋಗ ಮಾಡಿ.",
-       "usercsspreview": "'''ನೆನಪಿಡಿ: ನೀವು ಇಲ್ಲಿ ಕೇವಲ ನಿಮ್ಮ ಬಳಕೆದಾರ CSSನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ.'''\n'''ಅದನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!'''",
-       "userjspreview": "'''ಗಮನಿಸಿ: ನೀವು ನಿಮ್ಮ ಬಳಕೆದಾರ JavaScriptನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ ಅಥವ ಪ್ರಯೋಗ ಮಾಡುತ್ತಿರುವಿರಿ. ಅದನ್ನಿನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!'''",
-       "sitecsspreview": "'''ನೆನಪಿಡಿ: ನೀವು ಇಲ್ಲಿ ಕೇವಲ ನಿಮ್ಮ ಬಳಕೆದಾರ CSSನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ.''''''ಅದನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!'''",
-       "sitejspreview": "'''ನೆನಪಿಡಿ: ನೀವು ಇಲ್ಲಿ ಕೇವಲ ನಿಮ್ಮ ಬಳಕೆದಾರ CSSನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ.''''''ಅದನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!'''",
-       "updated": "(ನà²\95ಲà³\86ರಿಸಲಾಗಿದೆ)",
-       "note": "'''ಸೂಚನೆ:'''",
-       "previewnote": "'''ಇದು ಕೇವಲ ಮುನ್ನೋಟ.'''\nಪುಟವನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ ಎಂಬುದನ್ನು ಮರೆಯದಿರಿ!",
+       "usercsspreview": "<strong>ನೆನಪಿಡಿ: ನೀವು ಇಲ್ಲಿ ಕೇವಲ ನಿಮ್ಮ ಬಳಕೆದಾರ CSSನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ.\nಅದನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!</strong>",
+       "userjspreview": "<strong>ಗಮನಿಸಿ: ನೀವು ನಿಮ್ಮ ಬಳಕೆದಾರ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ ಅಥವ ಪ್ರಯೋಗ ಮಾಡುತ್ತಿರುವಿರಿ. ಅದನ್ನಿನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!</strong>",
+       "sitecsspreview": "<strong>ನೆನಪಿಡಿ: ನೀವು ಇಲ್ಲಿ ಕೇವಲ ನಿಮ್ಮ ಬಳಕೆದಾರ CSSನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ.\nಅದನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!</strong>",
+       "sitejspreview": "<strong>ನೆನಪಿಡಿ: ನೀವು ಇಲ್ಲಿ ಕೇವಲ ನಿಮ್ಮ ಬಳಕೆದಾರ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ.\nಅದನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!</strong>",
+       "updated": "(ನವà³\80à²\95ರಿಸಲಾಗಿದೆ)",
+       "note": "<strong>ಸೂಚನೆ:</strong>",
+       "previewnote": "<strong>ಇದು ಕೇವಲ ಮುನ್ನೋಟ.</strong>\nಪುಟವನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ ಎಂಬುದನ್ನು ಮರೆಯದಿರಿ!",
        "continue-editing": "ಸಂಪಾದನೆಯ ಪ್ರದೇಶಕ್ಕೆ  ಹೋಗಿ",
-       "editing": "'$1' ಲೇಖನ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ",
+       "editing": "$1 ಲೇಖನ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ",
        "creating": "$1 ನ್ನು ಸೃಷ್ಟಿಸಲಾಗುತ್ತಿದೆ",
        "editingsection": "$1 (ವಿಭಾಗ) ಅನ್ನು ಸಂಪಾದಿಸುತ್ತಿರುವಿರಿ",
        "editingcomment": "$1 (ಹೊಸ ವಿಭಾಗ) ಸಂಪಾದಿಸಲಾಗುತ್ತಿದೆ",
        "editconflict": "ಸಂಪಾದನಾ ಘರ್ಷಣೆ: $1",
-       "explainconflict": "ನೀವು ಈ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಪ್ರಾರಂಭ ಮಾಡಿದ ಮೇಲೆ ಬೇರೊಬ್ಬರು ಯಾರೊ ಪುಟವನ್ನು ಬದಲಾಯಿಸಿದ್ದಾರೆ.\nಮೇಲಿನ ಬರವಣಗೆ ಚೌಕದಲ್ಲಿ ಪುಟದ ಪ್ರಸಕ್ತ ಸ್ವರೂಪ ತೋರಿಸಲಾಗಿದೆ.\nನೀವು ಮಾಡಿದ ಸಂಪಾದನೆಗಳನ್ನು ಕೆಳಗಿನ ಬರವಣಗೆ ಚೌಕದಲ್ಲಿ ತೋರಿಸಲಾಗಿದೆ.\nನಿಮ್ಮ ಸಂಪಾದನೆಗಳನ್ನು ಪ್ರಸಕ್ತ ಸ್ವರೂಪದ ಲೇಖನದಲ್ಲಿ ನೀವು ಸೇರಿಸಬೇಕಾಗುತ್ತದೆ.\nನೀವು ಪುಟವನ್ನು ಉಳಿಸಿದಾಗ '''ಮೇಲಿನ ಚೌಕದಲ್ಲಿ ನೀವು ಮಾಡುವ ಬದಲಾವಣೆಗಳನ್ನು ಮಾತ್ರ''' ಉಳಿಸಲಾಗುತ್ತದೆ.",
+       "explainconflict": "ನೀವು ಈ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಪ್ರಾರಂಭ ಮಾಡಿದ ಮೇಲೆ ಬೇರೊಬ್ಬರು ಯಾರೊ ಪುಟವನ್ನು ಬದಲಾಯಿಸಿದ್ದಾರೆ.\nಮೇಲಿನ ಬರವಣಗೆ ಚೌಕದಲ್ಲಿ ಪುಟದ ಪ್ರಸಕ್ತ ಸ್ವರೂಪ ತೋರಿಸಲಾಗಿದೆ.\nನೀವು ಮಾಡಿದ ಸಂಪಾದನೆಗಳನ್ನು ಕೆಳಗಿನ ಬರವಣಗೆ ಚೌಕದಲ್ಲಿ ತೋರಿಸಲಾಗಿದೆ.\nನಿಮ್ಮ ಸಂಪಾದನೆಗಳನ್ನು ಪ್ರಸಕ್ತ ಸ್ವರೂಪದ ಲೇಖನದಲ್ಲಿ ನೀವು ಸೇರಿಸಬೇಕಾಗುತ್ತದೆ.\nನೀವು ಪುಟವನ್ನು ಉಳಿಸಿದಾಗ ಮೇಲಿನ ಚೌಕದಲ್ಲಿ ನೀವು ಮಾಡುವ ಬದಲಾವಣೆಗಳನ್ನು <strong>ಮಾತ್ರ</strong> ಉಳಿಸಲಾಗುತ್ತದೆ.$1",
        "yourtext": "ನಿಮ್ಮ ಸಂಪಾದನೆ",
        "storedversion": "ಈಗಾಗಲೇ ಉಳಿಸಲಾಗಿರುವ ಆವೃತ್ತಿ",
-       "editingold": "'''ಎಚ್ಚರಿಕೆ: ಈ ಪುಟದ ಹಳೆಯ ಆವೃತ್ತಿಯನ್ನು ಬದಲಾಯಿಸುತ್ತಿದ್ದೀರಿ. ಈ ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಿದಲ್ಲಿ, ನಂತರದ ಆವೃತ್ತಿಗಳೆಲ್ಲವೂ ಕಳೆದುಹೋಗುತ್ತವೆ.'''",
+       "editingold": "<strong>ಎಚ್ಚರಿಕೆ: ಈ ಪುಟದ ಹಳೆಯ ಆವೃತ್ತಿಯನ್ನು ಬದಲಾಯಿಸುತ್ತಿದ್ದೀರಿ. ಈ ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಿದಲ್ಲಿ, ನಂತರದ ಆವೃತ್ತಿಗಳೆಲ್ಲವೂ ಕಳೆದುಹೋಗುತ್ತವೆ.</strong>",
        "yourdiff": "ವ್ಯತ್ಯಾಸಗಳು",
        "copyrightwarning": "ದಯವಿಟ್ಟು ಗಮನಿಸಿ: {{SITENAME}} ಸೈಟಿನಲ್ಲಿ ನಿಮ್ಮ ಎಲ್ಲಾ ಕಾಣಿಕೆಗಳನ್ನೂ $2 ಅಡಿಯಲ್ಲಿ ಬಿಡುಗಡೆ ಮಾಡಲಾಗುತ್ತದೆ (ಮಾಹಿತಿಗೆ $1 ನೋಡಿ). ನಿಮ್ಮ ಸಂಪಾದನೆಗಳನ್ನು ಬೇರೆಯವರು ನಿರ್ದಾಕ್ಷಿಣ್ಯವಾಗಿ ಬದಲಾಯಿಸಿ ಬೇರೆ ಕಡೆಗಳಲ್ಲಿ ಹಂಚಬಹುದು. ಇದಕ್ಕೆ ನಿಮ್ಮ ಒಪ್ಪಿಗೆ ಇದ್ದರೆ ಮಾತ್ರ ಇಲ್ಲಿ ಸಂಪಾದನೆ ಮಾಡಿ.<br />\nಅಲ್ಲದೆ ನಿಮ್ಮ ಸಂಪಾದನೆಗಳನ್ನು ಸ್ವತಃ ರಚಿಸಿದ್ದು, ಅಥವ ಕೃತಿಸ್ವಾಮ್ಯತೆಯಿಂದ ಮುಕ್ತವಾಗಿರುವ ಕಡೆಯಿಂದ ಪಡೆದಿದ್ದು ಎಂದು ಪ್ರಮಾಣಿಸುತ್ತಿರುವಿರಿ.\n'''ಕೃತಿಸ್ವಾಮ್ಯತೆಯ ಅಡಿಯಲ್ಲಿರುವ ರಚನೆಗಳನ್ನು ಅನುಮತಿ ಇಲ್ಲದೆ ಇಲ್ಲಿಗೆ ಹಾಕಬೇಡಿ!'''",
-       "copyrightwarning2": "ದಯವಿಟ್ಟು ಗಮನಿಸಿ: {{SITENAME}} ಸೈಟಿನಲ್ಲಿ ನಿಮ್ಮ ಎಲ್ಲಾ ಸಂಪಾದನೆಗಳನ್ನು ಬೇರೆಯವರು ಬದಲಾಯಿಸಬಹುದು ಅಥವ ಅಳಿಸಬಹುದು.\nನಿಮ್ಮ ಬರಹಗಳನ್ನು ಬೇರೆಯವರು ನಿರ್ದಾಕ್ಷಿಣ್ಯವಾಗಿ ಸಂಪಾದನೆ ಮಾಡುವುದು ನಿಮಗೆ ಇಷ್ಟವಿಲ್ಲದಿದ್ದರೆ ಇಲ್ಲಿ ಸಂಪಾದನೆ ಮಾಡಬೇಡಿ.<br />\nಅಲ್ಲದೆ ನಿಮ್ಮ ಸಂಪಾದನೆಗಳನ್ನು ನೀವೇ ಸ್ವತಃ ರಚಿಸಿದ್ದು, ಅಥವ ಕೃತಿಸ್ವಾಮ್ಯತೆಯಿಂದ ಮುಕ್ತವಾಗಿರುವ ಕಡೆಯಿಂದ ಪಡೆದಿದ್ದು ಎಂದು ನೀವು ಪ್ರಮಾಣಿಸುತ್ತಿರುವಿರಿ (ಮಾಹಿತಿಗೆ $1 ನೋಡಿ).\n'''ಕೃತಿಸ್ವಾಮ್ಯತೆಯ ಅಡಿಯಲ್ಲಿರುವ ರಚನೆಗಳನ್ನು ಅನುಮತಿ ಇಲ್ಲದೆ ಇಲ್ಲಿಗೆ ಹಾಕಬೇಡಿ!'''",
+       "copyrightwarning2": "ದಯವಿಟ್ಟು ಗಮನಿಸಿ: {{SITENAME}} ಸೈಟಿನಲ್ಲಿ ನಿಮ್ಮ ಎಲ್ಲಾ ಸಂಪಾದನೆಗಳನ್ನು ಬೇರೆಯವರು ಬದಲಾಯಿಸಬಹುದು ಅಥವ ಅಳಿಸಬಹುದು.\nನಿಮ್ಮ ಬರಹಗಳನ್ನು ಬೇರೆಯವರು ನಿರ್ದಾಕ್ಷಿಣ್ಯವಾಗಿ ಸಂಪಾದನೆ ಮಾಡುವುದು ನಿಮಗೆ ಇಷ್ಟವಿಲ್ಲದಿದ್ದರೆ ಇಲ್ಲಿ ಸಂಪಾದನೆ ಮಾಡಬೇಡಿ.<br />\nಅಲ್ಲದೆ ನಿಮ್ಮ ಸಂಪಾದನೆಗಳನ್ನು ನೀವೇ ಸ್ವತಃ ರಚಿಸಿದ್ದು, ಅಥವ ಕೃತಿಸ್ವಾಮ್ಯತೆಯಿಂದ ಮುಕ್ತವಾಗಿರುವ ಕಡೆಯಿಂದ ಪಡೆದಿದ್ದು ಎಂದು ನೀವು ಪ್ರಮಾಣಿಸುತ್ತಿರುವಿರಿ (ಮಾಹಿತಿಗೆ $1 ನೋಡಿ).\n<strong>ಕೃತಿಸ್ವಾಮ್ಯತೆಯ ಅಡಿಯಲ್ಲಿರುವ ರಚನೆಗಳನ್ನು ಅನುಮತಿ ಇಲ್ಲದೆ ಇಲ್ಲಿಗೆ ಹಾಕಬೇಡಿ!</strong>",
        "longpageerror": "'''ದೋಷ: ನೀವು ಸಲ್ಲಿಸಿರುವ ಪಠ್ಯವು $1 ಕಿಲೊಬೈಟ್ ಉದ್ದದ್ದಾಗಿದೆ. ಇದು ನಿಯಮಿತವಾಗಿರುವ ಗರಿಷ್ಠವಾದ $2 ಕಿಲೊಬೈಟ್‍ಗಳಿಗಿಂತ ಹೆಚ್ಚಾಗಿದೆ.\nಆದ್ದರಿಂದ ಇದನ್ನು ಉಳಿಸಲು ಆಗುವುದಿಲ್ಲ.'''",
-       "readonlywarning": "'''ಗಮನಿಸಿ: ಡೇಟಾಬೇಸ್ ಅನ್ನು ದುರಸ್ತಿಗಾಗಿ ಮುಚ್ಚಲಾಗಿದೆ. ಹಾಗಾಗಿ ನಿಮ್ಮ ಸಂಪಾದನೆಗಳನ್ನು ಈಗ ಉಳಿಸಲು ಆಗುವುದಿಲ್ಲ.\nನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ನೀವು ಬೇರೆ ಕಡೆ ಉಳಿಸಿ ನಂತರ ಇಲ್ಲಿಗೆ cut-n-paste ಮಾಡಬಹುದು.'''",
-       "protectedpagewarning": "'''ಎಚ್ಚರಿಕೆ: ಈ ಪುಟವನ್ನು ಸಂರಕ್ಷಿಸಲಾಗಿದೆ. ಇದನ್ನು ಕೇವಲ ನಿರ್ವಾಹಕರು ಬದಲಾಯಿಸಬಹುದು.'''",
+       "readonlywarning": "<strong>ಎಚ್ಚರಿಕೆ: ಡೇಟಾಬೇಸ್ ಅನ್ನು ದುರಸ್ತಿಗಾಗಿ ಮುಚ್ಚಲಾಗಿದೆ. ಹಾಗಾಗಿ ನಿಮ್ಮ ಸಂಪಾದನೆಗಳನ್ನು ಈಗ ಉಳಿಸಲು ಆಗುವುದಿಲ್ಲ.\nನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ನೀವು ಬೇರೆ ಕಡೆ ಉಳಿಸಿ ನಂತರ ಇಲ್ಲಿಗೆ ಕತ್ತರಿಸಿ ಅಂಟಿಸಬಹುದು ಮಾಡಬಹುದು.</strong>\n\nಇದನ್ನು ಲಾಕ್ ಮಾಡಿದ ಸಿಸ್ಟಮ್ ನಿರ್ವಾಹಕರು ಈ ವಿವರಣೆಯನ್ನು ನೀಡಿದರು:$1",
+       "protectedpagewarning": "<strong>ಎಚ್ಚರಿಕೆ: ಈ ಪುಟವನ್ನು ಸಂರಕ್ಷಿಸಲಾಗಿದೆ. ಇದನ್ನು ಕೇವಲ ನಿರ್ವಾಹಕರು ಬದಲಾಯಿಸಬಹುದು.</strong>\nಇತ್ತೀಚಿನ ಲಾಗ್ ಎಂಟ್ರಿ ದಾಖಲೆಯನ್ನು ಕೆಳಗೆ ತೋರಿಸಲಾಗಿದೆ:",
        "semiprotectedpagewarning": "'''ಗಮನಿಸಿ:''' ಈ ಪುಟವನ್ನು ಕೇವಲ ನೊಂದಯಿತ ಸದಸ್ಯರು ಸಂಪಾದನೆ ಮಾಡಬರುವಂತೆ ಸಂರಕ್ಷಿಸಲಾಗಿದೆ.",
        "cascadeprotectedwarning": "'''ಎಚ್ಚರಿಕೆ:''' ಈ ಪುಟವು ಕೆಳಗೆ ಪಟ್ಟಿ ಮಾಡಿರುವ ತಡಸಲು-ಸಂರಕ್ಷಣೆ ಹೊಂದಿರುವ {{PLURAL:$1|ಪುಟದಲ್ಲಿ|ಪುಟಗಳಲ್ಲಿ}} ಸೇರಿರುವುದರಿಂದ, ಇದನ್ನು ಕೇವಲ ನಿರ್ವಾಹಕರು ಸಂಪಾದಿಸಬಹುದಂತೆ ಸಂರಕ್ಷಿಸಲಾಗಿದೆ :",
        "titleprotectedwarning": "'''ಎಚ್ಚರಿಕೆ:  ಈ ಪುಟವನ್ನು ಕೆಲ ಬಳಕೆದಾರರು ಮಾತ್ರ ಸೃಷ್ಟಿಸಬಹುದಂತೆ ಸಂರಕ್ಷಿಸಲಾಗಿದೆ. '''",
        "recreate-moveddeleted-warn": "'''ಎಚ್ಚರಿಕೆ: ಹಿಂದೆ ಅಳಿಸಲಾದ ಪುಟವನ್ನು ನೀವು ಮತ್ತೆ ಸೃಷ್ಟಿಸುತ್ತಿರುವಿರಿ.'''\n\nಈ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಸಮರ್ಪಕ ಕಾರಣವಿದೆಯೆ ಎಂದು ದಯವಿಟ್ಟು ಆಲೋಚಿಸಿ.\nಪುಟದ ಅಳಿಸುವಿಕೆ ದಿನಚರಿಯನ್ನು ಈ ಕೆಳಗೆ ನೀಡಲಾಗಿದೆ:",
        "moveddeleted-notice": "ಈ ಪುಟವು ಅಳಿಸಲ್ಪಟ್ಟಿದೆ.\nಈ ಪುಟದ ಅಳಿಸುವಿಕೆಯ ದಾಖಲೆಯನ್ನು ಕೆಳಗೆ ತೋರಿಸಲಾಗಿದೆ.",
        "log-fulllog": "ಪೂರ್ಣ ದಾಖಲೆ ವೀಕ್ಷಿಸಿ",
-       "edit-hook-aborted": "à²\95à³\8aà²\95à³\8dà²\95à³\86 à²¸à³\8dಥà²\97ಿತà²\97à³\8aಳಿಸಲಾà²\97ಿದà³\86 à²¸à²\82ಪಾದಿಸಿ .\nà²\87ದà³\81 à²¯à²¾à²µà³\81ದà³\87 à²µà²¿à²µà²°à²£à³\86 à²¨à³\80ಡಿದರà³\81 .",
+       "edit-hook-aborted": "ಸà²\82ಪಾದನà³\86 à²\95à³\8aà²\95à³\8dà²\95à³\86ಯಿà²\82ದ à²¸à³\8dಥà²\97ಿತà²\97à³\8aಳಿಸಲಾà²\97ಿದà³\86.\nà²\87ದà³\81 à²¯à²¾à²µà³\81ದà³\87 à²µà²¿à²µà²°à²£à³\86ಯನà³\8dನà³\81 à²¨à³\80ಡಿಲà³\8dಲ.",
        "edit-gone-missing": "ಪುಟವನ್ನು ಪ್ರಸ್ತುತಗೊಳಿಸಲು ಸಾದ್ಯವಿಲ್ಲ, ಪುಟವು ಬಹುಶ: ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು",
        "edit-conflict": "ಸಂಪಾದನಾ ಘರ್ಷಣೆ.",
-       "edit-no-change": "ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಕಡೆಗಣಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಪಠ್ಯದಲ್ಲಿ ಯಾವುದೇ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿಲ್ಲ್ಲ",
+       "edit-no-change": "ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಕಡೆಗಣಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಪಠ್ಯದಲ್ಲಿ ಯಾವುದೇ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿಲ್ಲ",
        "postedit-confirmation-created": "ಈ ಪುಟ ಸೃಷ್ಟಿಸಲಾಗಿದೆ.",
        "postedit-confirmation-restored": "ಪುಟವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲಾಗಿದೆ.",
        "postedit-confirmation-saved": "ನಿಮ್ಮ ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸಲಾಗಿದೆ.",
        "content-model-css": "ಸಿಎಸ್‍ಎಸ್",
        "content-json-empty-object": "ಖಾಲಿ ವಿಷಯ",
        "content-json-empty-array": "ಖಾಲಿ ರಚನೆ",
-       "expensive-parserfunction-warning": "ಎಚ್ಚರಿಕೆ: ಈ ಪುಟದಲ್ಲಿ ಬಹುತೇಕ ದುಬಾರಿ parser function ಕರೆಗಳಿವೆ.\n\nಈಗ {{PLURAL:$1|$1 ಕರೆ|$1 ಕರೆಗಳು}} ಇದ್ದು, $2 {{PLURAL:$2|ಕರೆಗಿಂತ|ಕರೆಗಳಿಗಿಂತ}} ಕಡಿಮೆ ಇರಬೇಕು.",
-       "expensive-parserfunction-category": "ಬಹà³\81ತà³\87à²\95 à²¦à³\81ಬಾರಿ parser function à²\95ರà³\86à²\97ಳಿರುವ ಪುಟಗಳು",
-       "post-expand-template-inclusion-warning": "' ' 'ಎಚ್ಚರಿಕೆ:' ' ' ಪುಟದಲ್ಲಿ ಹಕುವ ಛಿತ್ರ ಥೊದಥು. \nಕೆಲವು ಟೆಂಪ್ಲೇಟುಗಳು ಹಕಲಗುದಿಲ್ಲ.",
-       "post-expand-template-inclusion-category": "ಪà³\81à²\9fದಲà³\8dಲಿ  à²\9aಿತà³\8dರ  à²¹à²\97ಲ à²¯à³\86ರಿದà³\86",
+       "expensive-parserfunction-warning": "<strong>ಎಚ್ಚರಿಕೆ:</strong> ಈ ಪುಟದಲ್ಲಿ ಬಹುತೇಕ ದುಬಾರಿ ಪಾರ್ಸರ್ ಕ್ರಿಯೆ ಕರೆಗಳಿವೆ.\n\nಈಗ {{PLURAL:$1|ಒಂದು ಕರೆ|$1 ಕರೆಗಳು}}, ಇದು {{PLURAL:$2|ಕರೆಗಿಂತ|ಕರೆಗಳಿಗಿಂತ}} $2 ಕಡಿಮೆ ಇರಬೇಕು.",
+       "expensive-parserfunction-category": "ಹà³\86à²\9aà³\8dà²\9aà³\81 à²¦à³\81ಬಾರಿ à²ªà²¾à²°à³\8dಸರà³\8d à²\95ಾರà³\8dಯದ à²\95ರà³\86à²\97ಳನà³\8dನà³\81 à²¹à³\8aà²\82ದಿರುವ ಪುಟಗಳು",
+       "post-expand-template-inclusion-warning": "<strong>ಎಚ್ಚರಿಕೆ:</strong> ಟೆಂಪ್ಲೇಟು ಗಾತ್ರವು ತುಂಬಾ ದೊಡ್ಡದಾಗಿರುತ್ತದೆ.\nಕೆಲವು ಟೆಂಪ್ಲೆಟ್ಗಳನ್ನು ಸೇರಿಸಲಾಗುವುದಿಲ್ಲ.",
+       "post-expand-template-inclusion-category": "à²\97ಾತà³\8dರ à²®à³\80ರಿದ à²\9fà³\86à²\82ಪà³\8dಲà³\86à²\9fà³\8d à²\92ಳà²\97à³\8aà²\82ಡಿರà³\81ವ à²ªà³\81à²\9fà²\97ಳà³\81",
        "parser-template-loop-warning": "ಟೆಂಪ್ಲೇಟು ಆವರ್ತನೆ ಪತ್ತೆಯಾಗಿದೆ: [[$1]]",
        "language-converter-depth-warning": "ಭಾಷಾಂತರಕದ ಆಳದ ಮಿತಿಮೀರಿದೆ($1)",
        "undo-success": "ಸಂಪಾದನೆಯನ್ನು ವಜಾ ಮಾಡಬಹುದು. ದಯವಿಟ್ಟು ಕೆಳಗಿರುವ ತುಲನೆಯನ್ನು ಪರೀಕ್ಷಿಸಿ ನೀವು ಮಾಡಲು ಇಚ್ಚಿಸಿರುವುದನ್ನು ಖಾತ್ರಿ ಮಾಡಿಕೊಂಡು ವಜಾಗೊಳಿಸುವ ಕ್ರಿಯೆಯನ್ನು \nಪೂರ್ಣಗೊಳಿಸಲು ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಿ.",
        "undo-norev": "ಸಂಪಾದನೆಯನ್ನು ವಜಾಗೊಳಿಸಲು ಸಾದ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ಒಂದೊ ಇದು ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇಲ್ಲ ಅಧವಾ ಇದು ಅಳಿಸಲ್ಪಟ್ಟಿದೆ",
-       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) ರ $1 ಪರಿಷ್ಕರಣೆಯನ್ನು ವಜಾ ಮಾಡಿ",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ಚರ್ಚೆ]]) ರ $1 ಪರಿಷ್ಕರಣೆಯನ್ನು ವಜಾ ಮಾಡಿ",
        "viewpagelogs": "ಈ ಪುಟಗಳ ದಾಖಲೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ",
        "nohistory": "ಈ ಪುಟಕ್ಕೆ ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ ಇಲ್ಲ.",
        "currentrev": "ಈಗಿನ ತಿದ್ದುಪಡಿ",
-       "currentrev-asof": "ಅತ್ಯಂತ ಇತ್ತೀಚಿನ ಆವೃತ್ತಿ ($1)",
-       "revisionasof": "$1 à²¦à²¿à²¨à²¦ à²\86ವà³\83ತà³\8dತಿ",
+       "currentrev-asof": "$1 ದ ಇತ್ತೀಚಿನ ಆವೃತ್ತಿ",
+       "revisionasof": "$1 à²¨à²\82ತà³\86 à²ªà²°à²¿à²·à³\8dà²\95ರಣà³\86",
        "revision-info": "ಬದಲಾವಣೆ $1 ರಂತೆ {{GENDER:$6|$2}} ಇವರಿಂದ $7",
        "previousrevision": "←ಹಿಂದಿನ ಪರಿಷ್ಕರಣೆ",
-       "nextrevision": "ಮುಂದಿನ ಪರಿಷ್ಕರಣೆ",
+       "nextrevision": "ಮುಂದಿನ ಪರಿಷ್ಕರಣೆ →",
        "currentrevisionlink": "ಈಗಿನ ಪರಿಷ್ಕರಣೆ",
        "cur": "ಸದ್ಯದ",
        "next": "ಮುಂದಿನದು",
        "last": "ಕೊನೆಯ",
        "page_first": "ಮೊದಲ",
        "page_last": "ಕೊನೆಯ",
-       "histlegend": "ವ್ಯತ್ಯಾಸಗಳ ಆಯ್ಕೆ: ಹೋಲಿಕೆ ಮಾಡಬೇಕು ಎಂದಿರುವ ಎರಡು ಆವೃತ್ತಿಗಳ ಪಕ್ಕದಲ್ಲಿ ಇರುವ ಗುಂಡಿಗಳನ್ನು ಗುರುತು ಮಾಡಿ. ನಂತರ enter ಅನ್ನು ಒತ್ತಿ ಅಥವ ಪಟ್ಟಿಯ ಅಂತ್ಯದಲ್ಲಿರುವ ಗುಂಡಿಯನ್ನು ಒತ್ತಿ.<br />\nಆಖ್ಯಾನ: (ಈಗಿನ) = ಪ್ರಸಕ್ತ ಆವೃತ್ತಿಯೊಂದಿಗೆ ವ್ಯತ್ಯಾಸಗಳು,\n(ಕೊನೆಯ) = ಹಿಂದಿನ ಆವೃತ್ತಿಯೊಂದಿಗೆ ವ್ಯತ್ಯಾಸಗಳು, ಚು = ಚುಟುಕಾದ ಬದಲಾವಣೆ.",
+       "histlegend": "ವ್ಯತ್ಯಾಸಗಳ ಆಯ್ಕೆ: ಹೋಲಿಕೆ ಮಾಡಬೇಕು ಎಂದಿರುವ ಎರಡು ಆವೃತ್ತಿಗಳ ಪಕ್ಕದಲ್ಲಿ ಇರುವ ಗುಂಡಿಗಳನ್ನು ಗುರುತು ಮಾಡಿ. ನಂತರ ಎಂಟರ್ ಅನ್ನು ಒತ್ತಿ ಅಥವ ಪಟ್ಟಿಯ ಅಂತ್ಯದಲ್ಲಿರುವ ಗುಂಡಿಯನ್ನು ಒತ್ತಿ.<br />\nಆಖ್ಯಾನ: <strong>({{int:cur}})</strong>= ಪ್ರಸಕ್ತ ಆವೃತ್ತಿಯೊಂದಿಗೆ ವ್ಯತ್ಯಾಸಗಳು,\n <strong>({{int:last}})</strong> = ಹಿಂದಿನ ಆವೃತ್ತಿಯೊಂದಿಗೆ ವ್ಯತ್ಯಾಸಗಳು, <strong>{{int:minoreditletter}}</strong> = ಚುಟುಕಾದ ಬದಲಾವಣೆ.",
        "history-fieldset-title": "ಇತಿಹಾಸವನ್ನು ವಿಹರಿಸಿ",
        "history-show-deleted": "ಅಳಿಸಿದ್ದು ಮಾತ್ರ",
        "histfirst": "ಹಳೆಯ",
        "historyempty": "(ಖಾಲಿ)",
        "history-feed-title": "ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ",
        "history-feed-description": "ವಿಕಿಯ ಈ ಪುಟದ ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ",
-       "history-feed-item-nocomment": "$1 $2 ಅಲ್ಲಿ",
+       "history-feed-item-nocomment": "$2 ಅಲ್ಲಿ $1",
        "history-feed-empty": "ನೀವು ಕೋರಿರುವ ಪುಟ ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇಲ್ಲ.\nಅದು ವಿಕಿಯಿಂದ ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು ಅಥವ ಪುನರ್ನಾಮಕಾರಣಗೊಂಡಿರಬಹುದು.\nಸಂಬಂಧಿತ ಹೊಸ ಪುಟಗಳನ್ನು [[Special:Search|ಹುಡುಕಲು ಪ್ರಯತ್ನಿಸಿ]].",
        "rev-deleted-comment": "ಬದಲಾಯಿಸಿದ ಸಾರಾಂಶ ತೆಗೆದುಹಾಕಲಾಗಿದೆ",
        "rev-deleted-user": "(ಬಳಕೆದಾರ ಹೆಸರು ತಗೆಯಲ್ಪಟ್ಟಿದೆ)",
        "revdelete-show-file-submit": "ಹೌದು",
        "revdelete-legend": "ಕಾಣಿಸುವಿಕೆಯ ನಿಬಂಧನೆಗಳನ್ನು ನಿಶ್ಚಯಿಸು",
        "revdelete-hide-text": "ಪರಿಷ್ಕರಣೆ ಪಠ್ಯ",
-       "revdelete-hide-image": "ಫà³\88ಲಿನಲ್ಲಿರುವ ಮಾಹಿತಿಯನ್ನು ಅಡಗಿಸು",
+       "revdelete-hide-image": "à²\95ಡತà²\97ಳಲ್ಲಿರುವ ಮಾಹಿತಿಯನ್ನು ಅಡಗಿಸು",
        "revdelete-hide-name": "ಕಾರ್ಯ ಮತ್ತು ಗುರಿಗಳನ್ನು ಅಡಗಿಸು",
-       "revdelete-hide-comment": "ಸಾರಾà²\82ಶವನà³\81 à²¬à²¦à²²à²¾à²¯à²¿à²¸à²¿",
+       "revdelete-hide-comment": "ಸà²\82ಪಾದನà³\86ಯ à²¸à²¾à²°à²¾à²\82ಶ",
        "revdelete-hide-user": "ಸಂಪಾದಕರ ಬಳಕೆಯ ಹೆಸರು/IP ವಿಳಾಸ",
-       "revdelete-hide-restricted": "ನಿರà³\8dವಾಹà²\95ರಿà²\82ದ à²®à²¤à³\8dತಿತರರಿà²\82ದ à²¬à²\82ದ à²®à²¾à²¹à²¿à²¤à²¿à²¯à²¨à³\8dನà³\81 à²\85ಡà²\97ಿಸು",
+       "revdelete-hide-restricted": "ನಿರà³\8dವಾಹà²\95ರಿà²\82ದ à²®à²¤à³\8dತಿತರರಿà²\82ದ à²¬à²\82ದ à²®à²¾à²¹à²¿à²¤à²¿à²¯à²¨à³\8dನà³\81 à²¨à²¿à²\97à³\8dರಹಿಸು",
        "revdelete-radio-same": "(ಬದಲಾಯಿಸಬೇಡಿ)",
        "revdelete-radio-set": "ಅಡಗಿದ",
        "revdelete-radio-unset": "ಗೋಚರ",
        "revdelete-suppress": "ನಿರ್ವಾಹಕರಿಂದ ಮತ್ತಿತರರಿಂದ ಬಂದ ಮಾಹಿತಿಯನ್ನು ಅಡಗಿಸು",
        "revdelete-unsuppress": "ಪುನಃ ಸ್ಥಾಪಿಸಿದ ಬದಲಾವಣೆಗಳ ಮೇಲಿನ ನಿಬಂಧನೆಗಳನ್ನು ತೆಗೆ",
        "revdelete-log": "ಕಾರಣ:",
-       "revdelete-submit": "ಆಯ್ಕೆ ಮಾಡಿದ ಬದಲಾವಣೆಗೆ ಅನ್ವಯಿಸು{{PLURAL:$1|revision|revisions}}",
+       "revdelete-submit": "ಆಯ್ಕೆ ಮಾಡಿದ ಬದಲಾವಣೆಗೆ ಅನ್ವಯಿಸುವ {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಗಳು}}",
        "revdel-restore": "ಕಾಣಿಸುವಿಕೆಯನ್ನು ಬದಲಾಯಿಸು",
        "pagehist": "ಪುಟದ ಇತಿಹಾಸ",
        "deletedhist": "ಅಳಿಸಲ್ಪಟ್ಟ ಇತಿಹಾಸ",
        "mergehistory-reason": "ಕಾರಣ:",
        "mergelog": "ಸೇರ್ಪಡೆಯ ದಾಖಲೆ",
        "revertmerge": "ಸೇರ್ಪಡೆಯನ್ನು ತೊಡೆದುಹಾಕು",
-       "mergelogpagetext": "à²\92à²\82ದà³\81 à²ªà³\81à²\9fದ à²\87ತಿಹಾಸವನà³\8dನà³\81 à²\87ನà³\8dನà³\8aà²\82ದರà³\8aಳà²\97à³\86 à²\87ತà³\8dತà³\80à²\9aà³\86à²\97à³\86 à²¸à³\87ರà³\8dಪಡà³\86 à²®à²¾à²¡à²²à²¾à²\97ಿರà³\81ವ ಪಟ್ಟಿ ಕೆಳಗಿದೆ.",
+       "mergelogpagetext": "à²\92à²\82ದà³\81 à²ªà³\81à²\9fದ à²\87ತಿಹಾಸವನà³\8dನà³\81 à²\87ನà³\8dನà³\8aà²\82ದà³\81 à²ªà³\81à²\9fದà³\8aಳà²\97à³\86  à²¸à³\87ರà³\8dಪಡà³\86 à²®à²¾à²¡à²²à²¾à²\97ಿರà³\81ವ à²\87ತà³\8dತà³\80à²\9aಿನ ಪಟ್ಟಿ ಕೆಳಗಿದೆ.",
        "history-title": "\"$1\" ಪುಟದ ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ",
        "difference-title": "\"$1\" ಆವೃತ್ತಿಗಳ ಮಧ್ಯದ ಬದಲಾವಣೆಗಳು",
        "lineno": "$1 ನೇ ಸಾಲು:",
        "compareselectedversions": "ಆಯ್ಕೆ ಮಾಡಿದ ಆವೃತ್ತಿಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡಿ ನೋಡಿ",
        "showhideselectedversions": "ಆಯ್ದ ಆವೃತ್ತಿಗಳನ್ನು ತೋರಿಸು/ಅಡಗಿಸು",
-       "editundo": "ಹಿà²\82ದಿನà²\82ತà³\86",
+       "editundo": "ರದà³\8dದà³\81à²\97à³\8aಳಿಸಿ",
        "diff-empty": "( ಯಾವುದೇ ವ್ಯತ್ಯಾಸವಿಲ್ಲ )",
        "diff-multi-sameuser": "(ಅದೇ ಬಳಕೆದಾರನ {{PLURAL:$1|ಮಧ್ಯದಲ್ಲಿನ ಬದಲಾವಣೆಯನ್ನು|$1 ಮಧ್ಯದ ಬದಲಾವಣೆಗಳನ್ನು}} ತೋರಿಸುತ್ತಿಲ್ಲ)",
        "searchresults": "ಶೋಧನೆಯ ಫಲಿತಾಂಶಗಳು",
        "next-page": "ಮುಂದಿನ ಪುಟ",
        "prevn-title": "ಹಿಂದಿನ $1 {{PLURAL:$1|ಫಲಿತಾಂಶ|ಫಲಿತಾಂಶಗಳು}}",
        "nextn-title": "ಮುಂದಿನ $1 {{PLURAL:$1|ಫಲಿತಾಂಶ|ಫಲಿತಾಂಶಗಳು}}",
-       "shown-title": "ಪ್ರತಿ ಪುಟದಲ್ಲಿಯೂ $1 {{PLURAL:$1|result|results}} ತೋರಿಸು",
+       "shown-title": "ಪ್ರತಿ ಪುಟದ $1 {{PLURAL:$1|ಫಲಿತಾಂಶ|ಫಲಿತಾಂಶಗಳು}} ತೋರಿಸು",
        "viewprevnext": "ವೀಕ್ಷಿಸು ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''\"[[:$1]]\" ಹೆಸರಿನ ಪುಟ ಈ ವಿಕಿಯಲ್ಲಿದೆ.'''",
-       "searchmenu-new": "<strong>\"[[:$1]]\" ಪುಟವನ್ನು ಈ ವಿಕಿಯಲ್ಲಿ ಸೃಷ್ಟಿಸಿ!!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
+       "searchmenu-exists": "<Strong> ಈ ವಿಕಿಯಲ್ಲಿ \"[[:$1]]\" ಹೆಸರಿನ ಪುಟವಿದೆ. </Strong> {{PLURAL:$2|0= ಇತರ ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳು ಸಹ ನೋಡಿ.}}",
+       "searchmenu-new": "<strong>\"[[:$1]]\" ಪುಟವನ್ನು ಈ ವಿಕಿಯಲ್ಲಿ ಸೃಷ್ಟಿಸಿ.</strong> {{PLURAL:$2|0=|ನಿಮ್ಮ ಹುಡುಕಾಟದೊಂದಿಗೆ ಕಂಡುಬರುವ ಪುಟವನ್ನೂ ಸಹ ನೋಡಿ.|ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳನ್ನು ಸಹ ನೋಡಿ.}}",
        "searchprofile-articles": "ಲೇಖನ ಪುಟ",
        "searchprofile-images": "ಮಲ್ಟಿಮೀಡಿಯ",
        "searchprofile-everything": "ಪ್ರತಿಯೊಂದು",
-       "searchprofile-advanced": "ಪರಿಣತ",
+       "searchprofile-advanced": "ಸà³\81ಧಾರಿತ",
        "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 ಇಂದ ಪುನರ್ನಿರ್ದೇಶಿತ)",
        "search-relatedarticle": "ಸಂಬಂಧಿತ",
        "searchrelated": "ಸಂಬಂಧಿತ",
        "searchall": "ಎಲ್ಲಾ",
-       "showingresults": "ಕೆಳಗೆ #'''$2''' ಇಂದ ಶುರುವಾದ {{PLURAL:$1|'''೧''' ಫಲಿತಾಂಶದ|'''$1''' ಫಲಿತಾಂಶಗಳ}}ವರೆಗೂ ತೋರಿಸಲಾಗುತ್ತಿದೆ.",
+       "showingresults": "ಕೆಳಗೆ #<strong>$2</strong> ಇಂದ ಶುರುವಾದ {{PLURAL:$1|<strong>೧</strong> ಫಲಿತಾಂಶದ|<strong>$1</strong> ಫಲಿತಾಂಶಗಳ}}ವರೆಗೂ ತೋರಿಸಲಾಗುತ್ತಿದೆ.",
        "search-nonefound": "ನಿಮ್ಮ ವಿಚಾರಣೆಗೆ ತಕ್ಕ ಫಲಿತಾಂಶಗಳಿಲ್ಲ.",
        "powersearch-legend": "ಮುಂದುವರೆದ ಹುಡುಕಾಟ",
        "powersearch-ns": "ಈ ಪುಟ ಪ್ರಬೇಧಗಳಲ್ಲಿ ಹುಡುಕು:",
        "prefs-skin": "ಚರ್ಮ",
        "skin-preview": "ಮುನ್ನೋಟ",
        "datedefault": "ಯಾವುದೇ ಪ್ರಾಶಸ್ತ್ಯ ಇಲ್ಲ",
-       "prefs-labs": "ಲà³\8dಯಾಬà³\8dಸà³\8d ವೈಶಿಷ್ಟ್ಯಗಳು",
+       "prefs-labs": "ಪà³\8dರಯà³\8bà²\97ಾಲಯದ ವೈಶಿಷ್ಟ್ಯಗಳು",
        "prefs-user-pages": "ಸದಸ್ಯರ ಪುಟಗಳು",
        "prefs-personal": "ಬಳಕೆದಾರರ ಬಗ್ಗೆ",
        "prefs-rc": "ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳು",
        "prefs-rendering": "ಗೋಚರ",
        "saveprefs": "ಉಳಿಸಿ",
        "prefs-editing": "ಸಂಪಾದನೆ",
-       "rows": "ಸಾಲುಗಳು:",
-       "columns": "ಸಾಲುಗಳು:",
        "searchresultshead": "ಹುಡುಕು",
        "stub-threshold-disabled": "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.",
        "recentchangesdays": "ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳಲ್ಲಿ ತೋರಿಸಬೇಕಾದ ದಿನಗಳು:",
        "timezoneregion-europe": "ಯುರೋಪ್",
        "timezoneregion-indian": "ಹಿಂದೂ ಮಹಾಸಾಗರ",
        "timezoneregion-pacific": "ಪೆಸಿಫಿಕ್ ಮಹಾಸಾಗರ",
-       "allowemail": "ಬà³\87ರà³\86 à²¸à²¦à²¸à³\8dಯರಿà²\82ದ à²\88-ಮà³\88ಲà³\8dâ\80\8dಗಳನ್ನು ಸ್ವೀಕರಿಸು",
+       "allowemail": "ಬà³\87ರà³\86 à²¸à²¦à²¸à³\8dಯರಿà²\82ದ à²\87-à²\85à²\82à²\9aà³\86ಗಳನ್ನು ಸ್ವೀಕರಿಸು",
        "prefs-searchoptions": "ಹುಡುಕು",
        "prefs-namespaces": "ನಾಮವರ್ಗಗಳು",
        "default": "ಮೂಲಸ್ಥಿತಿ",
-       "prefs-files": "ಫà³\88ಲà³\81ಗಳು",
+       "prefs-files": "à²\95ಡತಗಳು",
        "prefs-custom-css": "ಕಸ್ಟಮ್ ಸಿಎಸ್ಎಸ್",
        "prefs-custom-js": "ಕಸ್ಟಮ್ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್",
        "prefs-emailconfirm-label": "ಮಿಂಚಂಚೆ ದೃಢೀಕರಣ",
        "prefs-registration": "ನೋಂದಣಿ ಸಮಯ:",
        "yourrealname": "ನಿಜ ಹೆಸರು:",
        "yourlanguage": "ಭಾಷೆ:",
-       "yournick": "ಸಹಿ:",
+       "yournick": "ಹà³\8aಸ à²¸à²¹à²¿:",
        "badsiglength": "ನಿಮ್ಮ ಅಡ್ಡಹೆಸರು ತುಂಬಾ ಉದ್ದವಾಗಿದೆ.\nಅದು $1 {{PLURAL:$1|ಅಕ್ಷರಕ್ಕಿಂತ|ಅಕ್ಷರಗಳಿಗಿಂತ}} ಕಡಿಮೆ ಇರಬೇಕು.",
        "yourgender": "ಲಿಂಗ:",
-       "gender-unknown": "ನಾನà³\81 à²¹à³\87ಳಲಿà²\9aà³\8dà²\9bಿಸà³\81ವà³\81ದಿಲà³\8dಲ",
+       "gender-unknown": "ನಿಮà²\97à³\86 à²ªà³\8dರಸà³\8dತಾಪಿಸಿದಾà²\97, à²¸à²¾à²«à³\8dà²\9fà³\8dವà³\87ರà³\8d à²¸à²¾à²§à³\8dಯವಾದಾà²\97 à²²à²¿à²\82à²\97 à²¤à²\9fಸà³\8dಥ à²ªà²¦à²\97ಳನà³\8dನà³\81 à²¬à²³à²¸à³\81ತà³\8dತದà³\86",
        "gender-male": "ಅವನು ವಿಕಿ ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸುತ್ತಾನೆ",
        "gender-female": "ಅವಳು ವಿಕಿ ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸುತ್ತಾಳೆ",
        "email": "ಇ-ಅಂಚೆ",
        "userrights-reason": "ಕಾರಣ:",
        "userrights-no-interwiki": "ಇತರ ವಿಕಿಗಳಲ್ಲಿ ನಿಮಗೆ ಬಳಕೆದಾರ ಹಕ್ಕುಗಳನ್ನು ಬದಲಾಯಿಸುವ ಅನುಮತಿಯಿಲ್ಲ.",
        "userrights-nodatabase": "ಡೇಟಾಬೇಸ್ $1 ಅಸ್ಥಿತ್ವದಲ್ಲಿಲ್ಲ ಅಥವ ಸ್ಥಳೀಯವಾದುದಲ್ಲ.",
-       "userrights-nologin": "ಬಳಕೆದಾರ ಹಕ್ಕುಗಳನ್ನು ನೇಮಿಸಲು ನೀವು ನಿರ್ವಾಹಕ ಖಾತೆಯೊಂದಕ್ಕೆ [[Special:UserLogin|ಲಾಗ್ ಇನ್]] ಆಗಬೇಕು.",
-       "userrights-notallowed": "ಬಳಕೆದಾರ ಹಕ್ಕುಗಳನ್ನು ನೇಮಿಸಲು ನಿಮ್ಮ ಖಾತೆಗೆ ಅನುಮತಿಯಿಲ್ಲ.",
        "userrights-changeable-col": "ನೀವು ಬದಲಾಯಿಸಬಲ್ಲ ಗುಂಪುಗಳು",
        "userrights-unchangeable-col": "ನೀವು ಬದಲಾಯಿಸಲಾಗದಂತಹ ಗುಂಪುಗಳು",
        "group": "ಗುಂಪು:",
        "group-all": "(ಎಲ್ಲವೂ)",
        "group-user-member": "ಬಳಕೆದಾರ",
        "group-autoconfirmed-member": "ಸ್ವಧೃಡೀಕೃತ ಬಳಕೆದಾರ",
-       "group-bot-member": "{{ಲಿಂಗ:$1|ಬೋಟ್}}",
+       "group-bot-member": "{{GENDER:$1|ಬೋಟ್}}",
        "group-sysop-member": "{{GENDER:$1|ನಿರ್ವಾಹಕ}}",
        "group-bureaucrat-member": "{{GENDER:$1|ಮೇಲ್ವಿಚಾರಕ}}",
        "group-suppress-member": "ನಿಗ ಇಡುವವ",
        "right-move-subpages": "ಪುಟಗಳನ್ನು ಅವುಗಳ ಉಪಪುಟಗಳೊಂದಿಗೆ ಸ್ಥಾಳಾಂತರಿಸಿ",
        "right-movefile": "ಕಡತಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "right-upload": "ಕಡತಗಳನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡು",
-       "right-reupload": "ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಫೈಲ್ ಗಳ ಕಡತಗಳ ಮೇಲೆ ಬರೆಯಿರಿ",
-       "right-reupload-own": "ವತಃ ತಾವೇ ನಕಲೆರಿಸಿರುವ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಫೈಲ್ ಗಳ ಕಡತಗಳ ಮೇಲೆ ಬರೆಯಿರಿ",
+       "right-reupload": "ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಕಡತಗಳ ಮೇಲೆ ಬರೆಯಿರಿ",
+       "right-reupload-own": "ಸ್ವತಃ ತಾವೇ ನಕಲೆರಿಸಿರುವ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಕಡತಗಳ ಮೇಲೆ ಬರೆಯಿರಿ",
+       "right-writeapi": "ಬರಹ API ಯ ಬಳಕೆ",
        "right-delete": "ಪುಟಗಳನ್ನು ಅಳಿಸಿ",
        "right-bigdelete": "ಜಾಸ್ತಿ ಇತಿಹಾಸವಿರುವ ಪುಟಗಳನ್ನು ಅಳಿಸಿ",
        "right-deleterevision": "ಪುಟದ ಕೆಲ ಆವೃತ್ತಿಗಳನ್ನು ಅಳಿಸಿ ಹಾಗು ಉಳಿಸಿ",
        "right-deletedtext": "ಆಳಿಸಿದ ಪಠ್ಯ ಮತ್ತು ಅಳಿಸಿದ ಆವೃತ್ತಿಗಳ ನಡುವಿನ ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಿ",
        "right-browsearchive": "ಅಳಿಸಲಾಗಿರುವ ಪುಟಗಳನ್ನು ಹುಡುಕಿ",
-       "right-undelete": "à²\86ಳಿಸಿದ à²ªà³\81à²\9fವನà³\8dನà³\81 à²\89ಳಿಸಿ",
+       "right-undelete": "à²\88 à²ªà³\81à²\9fವನà³\8dನà³\81 à²\85ಳಿಸà³\81ವಿà²\95à³\86ಯನà³\8dನà³\81 à²°à²¦à³\8dದà³\81ಮಾಡà³\81",
        "right-suppressionlog": "ಖಾಸಗಿ ದಾಖಲೆಗಳು ವೀಕ್ಷಿಸಿ",
        "right-block": "ಬೇರೆ ಬಳಕೆದಾರರು ಸಂಪಾದಿಸದಂತೆ ನಿರ್ಬಂಧಿಸು",
        "right-blockemail": "ಬಳಕೆದಾರನು ಇ-ಅಂಚೆ ಕಳುಹಿಸುವುದನ್ನು ತಡೆಗಟ್ಟು",
        "right-userrights-interwiki": "ಬೇರೆ ವಿಕಿಗಳ ಮೇಲೆ  ಎಲ್ಲಾ ಬಳಕೆದಾರ ಹಕ್ಕುಗಳನ್ನು ತಿದ್ದುಪಡಿಸಿ",
        "right-siteadmin": "ಡೇಟಾಬೇಸ್ ನ್ನು ಬೀಗ ಹಾಕಿ ತೆಗೆಯಿರಿ",
        "right-sendemail": "ಇತರ ಬಳಕೆದಾರರಿಗೆ ಇಮೇಲ್ ಕಳುಹಿಸಿ",
-       "right-passwordreset": "ಪಾಸ್ವರ್ಡ್ ಮತ್ತೆ ಜೋಡಿಸಲ್ಪಟ್ಟ  ಇಮೇಲ್ ಗಳನ್ನು ವೀಕ್ಷಿಸಿ",
        "newuserlogpage": "ಸದಸ್ಯತ್ವ ಸೃಷ್ಟಿಗಳ ದಾಖಲೆ",
        "rightslog": "ಸದಸ್ಯರ ಹಕ್ಕುಗಳ ದಾಖಲೆಗಳು",
        "rightslogtext": "ಇದು ಬಳಕೆದಾರ ಹಕ್ಕುಗಳ ಬದಲಾವಣೆಗಳ ದಾಖಲೆ.",
        "action-move": "ಈ ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "action-move-subpages": "ಈ ಪುಟವನ್ನು ಮತ್ತು ಅದರ ಉಪಪುಟಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
        "action-movefile": "ಈ ಪುಟವನ್ನು ಸ್ಥಳಾಂತರಿಸಿ",
-       "action-upload": "à²\88 à²«à³\88ಲà³\8d à²\85ನà³\8dನà³\81  à²¨à²\95ಲà³\86ರಿಸಿ",
+       "action-upload": "à²\88 à²\95ಡತವನà³\8dನà³\81 à²\85ಪà³\8dಲà³\8bಡà³\8d à²®à²¾à²¡ಿ",
        "action-delete": "ಈ ಪುಟವನ್ನು ಅಳಿಸು",
        "action-deleterevision": "ಈ ಆವೃತ್ತಿಯನ್ನು ಅಳಿಸು",
        "action-browsearchive": "ಅಳಿಸಲಾಗಿರುವ ಪುಟಗಳನ್ನು ಹುಡುಕು",
        "recentchanges-legend-heading": "<strong>ಪರಿವಿಡಿ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|ಹೊಸ ಪುಟಗಳ ಪಟ್ಟಿ]]ಯನ್ನೂ ನೋಡಿ)",
        "rcnotefrom": "'''$2''' ಇಂದ ಆಗಿರುವ ಬದಲಾವಣೆಗಳು ಕೆಳಗಿವೆ (ಕೊನೆಯ '''$1'''ರವರೆಗೆ ತೋರಿಸಲಾಗಿದೆ).",
-       "rclistfrom": "$3 $2 ಇಂದ ಪ್ರಾರಂಭಿಸಿ ಮಾಡಲಾದ ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಿ",
-       "rcshowhideminor": "à²\9aಿà²\95à³\8dà²\95ಪà³\81à²\9fà³\8dà²\9f ಬದಲಾವಣೆಗಳನ್ನು $1",
+       "rclistfrom": "$2,$3 ಇಂದ ಪ್ರಾರಂಭಿಸಿ ಮಾಡಲಾದ ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಿ",
+       "rcshowhideminor": "à²\9aà³\81à²\9fà³\81à²\95ಾದ ಬದಲಾವಣೆಗಳನ್ನು $1",
        "rcshowhideminor-show": "ತೊರಿಸಿ",
        "rcshowhideminor-hide": "ಮರೆ ಮಾಡಿ",
        "rcshowhidebots": "ಬಾಟ್‍ಗಳನ್ನು $1",
        "rcshowhideanons": "ಅನಾಮಧೇಯ ಸದಸ್ಯರು $1",
        "rcshowhideanons-show": "ತೊರಿಸಿ",
        "rcshowhideanons-hide": "ಮರೆ ಮಾಡಿ",
-       "rcshowhidepatr": "$1 à²ªà²°à³\80à²\95à³\8dಷಿತ ಸಂಪಾದನೆಗಳು",
+       "rcshowhidepatr": "$1 à²\97ಸà³\8dತà³\81 à²¤à²¿à²°à³\81à²\97ಿದ ಸಂಪಾದನೆಗಳು",
        "rcshowhidepatr-show": "ತೊರಿಸಿ",
        "rcshowhidepatr-hide": "ಮರೆ ಮಾಡಿ",
        "rcshowhidemine": "ನನ್ನ ಸಂಪಾದನೆಗಳನ್ನು $1",
        "rcshowhidemine-show": "ತೊರಿಸಿ",
        "rcshowhidemine-hide": "ಮರೆ ಮಾಡಿ",
-       "rclinks": "à²\95à³\8aನà³\86ಯ $2 à²¦à²¿à²¨à²\97ಳಲà³\8dಲಿ à²®à²¾à²¡à²¿à²¦ $1 à²\95à³\8aನà³\86ಯ à²¬à²¦à²²à²¾à²µà²£à³\86à²\97ಳನà³\8dನà³\81 à²¨à³\8bಡಿ <br />$3",
+       "rclinks": "à²\95à³\8aನà³\86ಯ $2 à²¦à²¿à²¨à²\97ಳಲà³\8dಲಿ à²®à²¾à²¡à²¿à²¦ $1 à²¬à²¦à²²à²¾à²µà²£à³\86à²\97ಳನà³\8dನà³\81 à²¨à³\8bಡಿ",
        "diff": "ವ್ಯತ್ಯಾಸ",
        "hist": "ಇತಿಹಾಸ",
        "hide": "ಅಡಗಿಸು",
        "recentchangeslinked-summary": "ಒಂದು ನಿರ್ದಿಷ್ಟ ಪುಟದಿಂದ (ಅಥವ ನಿರ್ದಿಷ್ಟ ವರ್ಗಕ್ಕೆ ಸೇರಿರುವ ಪುಟಗಳಿಂದ) ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಪುಟಗಳಲ್ಲಿ ಇತ್ತೀಚೆಗೆ ಮಾಡಲಾಗಿರುವ ಬದಲಾವಣೆಗಳನ್ನು ಈ ಕೆಳಗೆ ಪಟ್ಟಿ ಮಾಡಲಾಗಿದೆ.\n[[Special:Watchlist|ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ]] ಇರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರ'''ಗಳಲ್ಲಿ ಇವೆ.",
        "recentchangeslinked-page": "ಪುಟದ ಹೆಸರು:",
        "recentchangeslinked-to": "ಇದರ ಬದಲಿಗೆ ನೇಮಿತ ಪುಟಕ್ಕೆ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿರುವ ಪುಟಗಳಲ್ಲಿನ ಬದಲಾವಣೆಗಳನ್ನು ತೋರು",
-       "upload": "ಫà³\88ಲà³\8d à²®à³\87ಲà²\95à³\8dà²\95à³\86ರಿಸಿ",
-       "uploadbtn": "ಫà³\88ಲನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ",
+       "upload": "à²\95ಡತ à²¸à³\87ರಿಸಿ",
+       "uploadbtn": "à²\95ಡತವನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ",
        "reuploaddesc": "ಅಪ್ಲೋಡ್ ಅನ್ನು ನಿಲ್ಲಿಸಿ ಮತ್ತೆ ಅಪ್ಲೋಡ್ ವಕ್ಕಣೆಗೆ ಹಿಂದಿರುಗಿ",
        "uploadnologin": "ಲಾಗಿನ್ ಆಗಿಲ್ಲ",
        "uploadnologintext": "ಫೈಲುಗಳನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಲು ನೀವು [[Special:UserLogin|ಲಾಗ್ ಇನ್]] ಆಗಬೇಕು.",
        "undelete-show-file-submit": "ಹೌದು",
        "namespace": "ಹೆಸರಿನ ಬಗೆ:",
        "invert": "ಆಯ್ಕೆಯನ್ನು ತಿರುಗಿಸು",
+       "tooltip-invert": "ಆಯ್ದ ಹೆಸರಿನ ಜಾಗದಲ್ಲಿ ಬದಲಾವಣೆಗಳನ್ನು ಮರೆಮಾಡಲು ಈ ಪೆಟ್ಟಿಗೆಯನ್ನು ಪರಿಶೀಲಿಸಿ (ಮತ್ತು ಪರಿಶೀಲಿಸಿದ ವೇಳೆ ಸಂಬಂಧಿತ ನೇಮ್ಸ್ಪೇಸ್)",
+       "namespace_association": "ಅಸೋಸಿಯೇಟೆಡ್ ನೇಮ್ಸ್ಪೇಸ್",
+       "tooltip-namespace_association": "ಆಯ್ಕೆ ಮಾಡಲಾದ ಹೆಸರಿನೊಂದಿಗೆ ಸಂಬಂಧಿಸಿದ ಚರ್ಚೆ ಅಥವಾ ವಿಷಯ ನಾಮಪದವನ್ನು ಸೇರಿಸಲು ಈ ಪೆಟ್ಟಿಗೆಯನ್ನು ಪರಿಶೀಲಿಸಿ",
        "blanknamespace": "(ಮುಖ್ಯ)",
        "contributions": "{{GENDER:$1|User}} ಕಾಣಿಕೆಗಳು",
        "contributions-title": "$1 ಸದಸ್ಯರ ಕಾಣಿಕೆಗಳು",
        "tooltip-feed-atom": "ಈ ಪುಟಕ್ಕೆ Atom ಫೀಡು",
        "tooltip-t-contributions": "{{GENDER:$1|ಈ ಸದಸ್ಯರ}} ಕಾಣಿಕೆಗಳ ಪಟ್ಟಿ",
        "tooltip-t-emailuser": "ಈ ಸದಸ್ಯರಿಗೆ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸು",
-       "tooltip-t-upload": "ಫà³\88ಲನà³\8dನà³\81 à²®à³\87ಲà²\95à³\8dà²\95à³\86ರಿಸಿ",
+       "tooltip-t-upload": "à²\95ಡತà²\97ಳನà³\8dನà³\81 à²¸à³\87ರಿಸಿ",
        "tooltip-t-specialpages": "ಎಲ್ಲಾ ವಿಶೇಷ ಪುಟಗಳ ಪಟ್ಟಿ",
        "tooltip-t-print": "ಈ ಪುಟದ ಮುದ್ರಣ ಮಾಡಬಹುದಾದಂತ ಆವೃತ್ತಿ",
        "tooltip-t-permalink": "ಪುಟದ ಈ ಆವೃತ್ತಿಗೆ ಶಾಶ್ವತ ಕೊಂಡಿ",
        "logentry-newusers-create": "ಬಳಕೆದಾರ ಖಾತೆ $1 ನ್ನು {{GENDER:$2|ಸೃಷ್ಟಿಸಲಾಯಿತು}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಾಡಿದ್ದಾರೆ}} $3",
        "rightsnone": "(ಯಾವೂ ಇಲ್ಲ)",
-       "revdelete-summary": "ಸಂಪಾದನೆಯ ತಾತ್ಪರ್ಯ",
        "feedback-message": "ಸಂದೇಶ:",
        "feedback-subject": "ವಿಷಯ:",
        "searchsuggest-search": "{{SITENAME}} ಅನ್ನು ಹುಡುಕಿ",
index 52ff8e6..3d3b873 100644 (file)
@@ -65,7 +65,9 @@
                        "Matma Rex",
                        "Tursetic",
                        "Jerrykim306",
-                       "Sukjong0406"
+                       "Sukjong0406",
+                       "Garam",
+                       "렌즈"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "redirectedfrom": "($1에서 넘어옴)",
        "redirectpagesub": "넘겨주기 문서",
        "redirectto": "넘겨줄 대상:",
-       "lastmodifiedat": "이 문서는 $1 $2에 마지막으로 바뀌었습니다.",
+       "lastmodifiedat": "이 문서는 $1 $2에 마지막으로 편집되었습니다.",
        "viewcount": "이 문서는 {{PLURAL:$1|한 번|$1번}} 읽혔습니다.",
        "protectedpage": "보호된 문서",
        "jumpto": "이동:",
        "login": "로그인",
        "login-security": "사용자 정보 확인",
        "nav-login-createaccount": "로그인 / 계정 만들기",
-       "userlogin": "로그인 / 계정 만들기",
-       "userloginnocreate": "로그인",
        "logout": "로그아웃",
        "userlogout": "로그아웃",
        "notloggedin": "로그인하지 않음",
        "userlogin-noaccount": "계정이 없나요?",
        "userlogin-joinproject": "{{SITENAME}}에 가입하세요",
-       "nologin": "계정이 없나요? $1.",
-       "nologinlink": "계정을 만드세요",
        "createaccount": "계정 만들기",
-       "gotaccount": "계정이 이미 있습니까? $1.",
-       "gotaccountlink": "로그인하세요",
-       "userlogin-resetlink": "로그인 정보를 잊으셨나요?",
        "userlogin-resetpassword-link": "비밀번호를 잊으셨나요?",
        "userlogin-helplink2": "로그인에 대한 도움말",
        "userlogin-loggedin": "이미 {{GENDER:$1|$1}}님으로 로그인되어 있습니다.\n다른 사용자로 로그인하려면 아래의 양식을 사용하세요.",
        "createaccountmail": "임의의 임시 비밀번호를 이메일로 보내기",
        "createaccountmail-help": "비밀번호를 기억하지 않고도 다른 사용자를 위한 계정을 만들 수 있습니다.",
        "createacct-realname": "실명 (선택 사항)",
-       "createaccountreason": "이유:",
        "createacct-reason": "이유",
        "createacct-reason-ph": "왜 다른 계정을 만들어야 합니까",
        "createacct-reason-help": "계정 생성 로그에 표시되는 메시지",
        "botpasswords-label-delete": "삭제",
        "botpasswords-label-resetpassword": "비밀번호 재설정",
        "botpasswords-label-grants": "적용할 수 있는 부여:",
-       "botpasswords-help-grants": "각각 부여된 값은 목록에서 사용자 계정을 이미 갖고 있는 사용자 권한에 접근할 수 있는 권한을 줍니다. 자세한 정보는 [[Special:ListGrants|부여 표]]을 보세요.",
+       "botpasswords-help-grants": "사용자 계정에서 사용할 수 있는 권한을 부여합니다. 이 권한을 부여한다고 해서 원래 가지고 있지 않던 권한이 부여되는 것은 아닙니다. 자세한 정보는 [[Special:ListGrants|부여 표]]을 보세요.",
        "botpasswords-label-grants-column": "승인됨",
        "botpasswords-bad-appid": "\"$1\"이라는 봇 이름은 유효하지 않습니다.",
        "botpasswords-insert-failed": "\"$1\" 봇 이름을 추가하는데 실패했습니다. 이미 등록되지 않았는지 확인하기 바랍니다.",
        "preview": "미리 보기",
        "showpreview": "미리 보기",
        "showdiff": "차이 보기",
-       "blankarticle": "<strong>경고:</strong> 만들려는 문서가 비어 있습니다.\n\"{{int:savearticle}}\"을 다시 클릭하면, 아무 내용 없이 문서가 만들어집니다.",
+       "blankarticle": "<strong>경고:</strong> 만들려는 문서가 비어 있습니다.\n\"$1\" 버튼을 다시 클릭하면, 아무 내용 없이 문서가 만들어집니다.",
        "anoneditwarning": "<strong>경고:</strong> 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. <strong>[$1 로그인]</strong>하거나 <strong>[$2 계정을 생성하면]</strong> 편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.",
        "anonpreviewwarning": "<em>로그인하고 있지 않습니다. 문서를 저장하면 당신의 IP 주소가 문서의 편집 역사에 남게 됩니다.</em>",
-       "missingsummary": "'''알림:''' 편집 요약을 적지 않았습니다.\n이대로 \"{{int:savearticle}}\"을 클릭하면 편집 요약 없이 저장됩니다.",
-       "selfredirect": "<strong>경고:</strong> 자기 자신으로 문서를 넘겨주고 있습니다.\n넘겨줄 대상을 잘못 입력했거나, 잘못된 문서를 편집하고 있을 수 있습니다.\n\"{{int:savearticle}}\"을 입력하면, 넘겨주기 문서가 생성될 것입니다.",
+       "missingsummary": "'''알림:''' 편집 요약을 적지 않았습니다.\n\"$1\" 버튼을 다시 클릭하면 편집 요약 없이 편집이 저장됩니다.",
+       "selfredirect": "<strong>경고:</strong> 자기 자신으로 문서를 넘겨주고 있습니다.\n넘겨줄 대상을 잘못 입력했거나, 잘못된 문서를 편집하고 있을 수 있습니다.\n\"$1\" 버튼을 다시 클릭하면, 넘겨주기 문서가 생성됩니다.",
        "missingcommenttext": "아래에 내용을 채워 넣어 주세요.",
-       "missingcommentheader": "<strong>알림:</strong> 글의 제목을 입력하지 않았습니다.\n다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
+       "missingcommentheader": "<strong>알림:</strong> 이 댓글에 제목을 입력하지 않았습니다.\n\"$1\" 버튼을 다시 클릭하면 제목 없이 편집이 저장됩니다.",
        "summary-preview": "편집 요약 미리 보기:",
        "subject-preview": "주제 미리 보기:",
        "previewerrortext": "변경사항을 미리보기하는 도중 오류가 발생했습니다.",
        "editingsection": "$1 편집하기 (부분)",
        "editingcomment": "$1 편집하기 (덧붙이기)",
        "editconflict": "편집 충돌: $1",
-       "explainconflict": "문서를 편집하는 도중에 누군가 이 문서를 고쳤습니다.\n위쪽의 문서가 지금 바뀐 문서이고, 아래쪽의 문서가 당신이 편집한 문서입니다.\n아래쪽의 내용을 위쪽에 적절히 합쳐 주시기 바랍니다.\n\"{{int:savearticle}}\"을 누르면 '''위쪽의 편집 내역만''' 저장됩니다.",
+       "explainconflict": "문서를 편집하는 도중에 누군가 이 문서를 고쳤습니다.\n위쪽의 문서가 지금 바뀐 문서이고, 아래쪽의 문서가 당신이 편집한 문서입니다.\n아래쪽의 내용을 위쪽에 적절히 합쳐 주시기 바랍니다.\n\"$1\"을 누르면 위쪽의 <strong>편집 내역만</strong> 저장됩니다.",
        "yourtext": "당신의 편집",
        "storedversion": "현재 문서",
        "nonunicodebrowser": "<strong>경고: 브라우저가 유니코드를 지원하지 않습니다.</strong>\n문서를 안전하게 편집할 수 있도록 다음의 우회 방안이 제공됩니다: 편집 상자에서 아스키가 아닌 문자가 16진수 코드로 나타납니다.",
        "readonlywarning": "<strong>경고: 데이터베이스가 관리를 위해 잠겨 있습니다. 따라서 문서를 편집한 내용을 지금 저장할 수 없습니다.</strong>\n편집 내용을 복사하여 붙여넣기 등을 사용하여 일단 다른 곳에 저장한 후, 나중에 다시 시도해 주세요.\n\n데이터베이스를 잠근 시스템 관리자가 남긴 설명은 다음과 같습니다: $1",
        "protectedpagewarning": "<strong>경고: 이 문서는 관리자 권한이 있는 사용자만 편집할 수 있도록 보호되어 있습니다.</strong>\n이 문서의 최근 기록을 참조하십시오:",
        "semiprotectedpagewarning": "<strong>참고:</strong> 이 문서는 계정을 등록한 사용자만이 편집할 수 있도록 보호되어 있습니다.\n이 문서의 최근 기록을 참조하십시오:",
-       "cascadeprotectedwarning": "<strong>경고:</strong> 이 문서는 보호되어 있어 관리자 권한이 있는 사용자만 편집할 수 있습니다. 연쇄적 보호가 걸린 다음 {{PLURAL:$1|문서}}에서 이 문서를 사용하고 있습니다:",
+       "cascadeprotectedwarning": "<strong>경고:</strong> 이 문서는 보호되어 있어 [[Special:ListGroupRights|특정 권한]]이 있는 사용자만 편집할 수 있습니다. 연쇄적 보호가 걸린 다음 {{PLURAL:$1|문서}}에서 이 문서를 사용하고 있습니다:",
        "titleprotectedwarning": "<strong>경고: 이 문서는 보호되어 있어, 문서를 만드려면 [[Special:ListGroupRights|특정한 권한]]이 필요합니다.</strong>\n아래 문서의 최근 기록을 참조하십시오:",
        "templatesused": "이 문서에서 사용한 {{PLURAL:$1|틀}}:",
        "templatesusedpreview": "이 미리 보기에서 사용하고 있는 {{PLURAL:$1|틀}}:",
        "post-expand-template-argument-warning": "<strong>경고:</strong> 이 문서는 전개하면 크기가 너무 큰 틀 인수가 하나 이상 포함되어 있습니다.\n이 인수는 생략했습니다.",
        "post-expand-template-argument-category": "생략된 틀 변수를 포함한 문서",
        "parser-template-loop-warning": "재귀적인 틀이 발견되었습니다: [[$1]]",
+       "template-loop-category": "틀 루프가 있는 문서",
+       "template-loop-category-desc": "이 문서에 틀 루프가 있습니다. (예: 자기 자신을 반복하여 호출하는 틀)",
        "parser-template-recursion-depth-warning": "틀 반복 깊이 제한을 초과함 ($1)",
        "language-converter-depth-warning": "언어 변환기 실행 제한 초과($1)",
        "node-count-exceeded-category": "노드 횟수를 초과한 문서",
        "page_first": "처음",
        "page_last": "마지막",
        "histlegend": "차이 선택: 비교하려는 판의 라디오 상자를 선택한 다음 엔터나 아래의 버튼을 누르세요.<br />\n설명: <strong>({{int:cur}})</strong> = 최신 판과 비교, <strong>({{int:last}})</strong> = 이전 판과 비교, <strong>{{int:minoreditletter}}</strong>= 사소한 편집",
-       "history-fieldset-title": "역사 찾아보기",
-       "history-show-deleted": "삭제된 것만",
+       "history-fieldset-title": "특정판 검색",
+       "history-show-deleted": "특정판이 삭제된 것만",
        "histfirst": "오래됨",
        "histlast": "최신",
        "historysize": "({{PLURAL:$1|1 바이트|$1 바이트}})",
        "search-file-match": "(내용이 일치하는 파일 있음)",
        "search-suggest": "$1 문서를 찾고 있으신가요?",
        "search-rewritten": "$1의 결과를 보여주고 있습니다. $2을(를) 대신 검색합니다.",
-       "search-interwiki-caption": "자매 프로젝트",
+       "search-interwiki-caption": "자매 프로젝트에서의 결과",
        "search-interwiki-default": "$1로부터의 결과:",
        "search-interwiki-more": "(더 보기)",
        "search-interwiki-more-results": "더 많은 결과",
        "yourrealname": "실명:",
        "yourlanguage": "언어:",
        "yourvariant": "언어 변종:",
-       "prefs-help-variant": "이 위키 내용을 볼 때 사용할 언어 변종이나 철자 체계를 선택하세요.",
+       "prefs-help-variant": "이 위키 내용을 표시하기 위해 사용할 언어 변종이나 철자 체계를 선택하세요.",
        "yournick": "새 서명:",
        "prefs-help-signature": "토론 문서에 글을 쓴 후에는 마지막에 서명을 해야 합니다.  “<nowiki>~~~~</nowiki>” 기호를 추가하면 서명과 글 작성 시각이 자동으로 입력됩니다.",
        "badsig": "서명이 잘못되었습니다.\nHTML 태그를 확인하세요.",
        "prefs-help-prefershttps": "이 사용자 환경 설정은 다음 로그인부터 적용됩니다.",
        "prefswarning-warning": "사용자 환경 설정에서 바뀐 것이 아직 저장되어 있지 않습니다.\n사용자 환경 설정에서 \"$1\"을 클릭하지 않고 이 페이지를 떠나면 바뀌지 않습니다.",
        "prefs-tabs-navigation-hint": "팁: 탭 목록에서 탭 사이를 둘러보려면 왼쪽과 오른쪽 화살표 키를 사용할 수 있습니다.",
-       "userrights": "사용자 권한 관리",
+       "userrights": "사용자 권한",
        "userrights-lookup-user": "사용자 선택",
        "userrights-user-editname": "사용자 이름 입력:",
        "editusergroup": "사용자 그룹 불러오기",
        "saveusergroups": "{{GENDER:$1|사용자}} 권한 저장",
        "userrights-groupsmember": "현재 권한:",
        "userrights-groupsmember-auto": "자동으로 부여된 권한:",
-       "userrights-groups-help": "이 사용자의 권한을 바꿀 수 있습니다.\n* 사용자는 체크 표시가 있는 권한을 갖습니다.\n* 사용자는 체크 표시가 없는 권한을 갖지 않습니다.\n* <nowiki>*</nowiki>표시는 권한을 주거나 거두는 것 중 하나만 할 수 있다는 뜻입니다.",
+       "userrights-groups-help": "이 사용자의 권한을 바꿀 수 있습니다.\n* 사용자는 체크 표시가 있는 권한을 갖습니다.\n* 사용자는 체크 표시가 없는 권한을 갖지 않습니다.\n* * 표시는 권한을 주거나 거두는 것 중 하나만 할 수 있다는 뜻입니다.\n* # 표시는 사용자 권한의 만료일을 늦출 수만 있다는 뜻입니다; 만료일을 앞당길 수는 없습니다.",
        "userrights-reason": "이유:",
        "userrights-no-interwiki": "다른 위키의 사용자 권한을 바꿀 권한이 없습니다.",
        "userrights-nodatabase": "데이터베이스 $1이 존재하지 않거나 로컬에 있지 않습니다.",
        "userrights-expiry-options": "1일:1 day,1주일:1 week,1개월:1 month,3개월:3 months,6개월:6 months,1년:1 year",
        "userrights-invalid-expiry": "그룹 \"$1\"의 만료 시간이 유효하지 않습니다.",
        "userrights-expiry-in-past": "그룹 \"$1\"의 만료 시간이 과거입니다.",
+       "userrights-cannot-shorten-expiry": "\"$1\"에 해당하는 사용자의 권한의 만료일을 앞당길 수 없습니다. 권한을 추가하고 회수할 수 있는 권한을 가진 사용자만 권한의 만료일을 앞당길 수 있습니다.",
        "userrights-conflict": "사용자 권한 바꾸기가 충돌합니다! 바뀜을 검토하고 확인하세요.",
        "group": "그룹:",
        "group-user": "사용자",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\"로 보호된 문서 편집",
        "right-editcontentmodel": "문서의 콘텐츠 모델을 편집",
        "right-editinterface": "사용자 인터페이스를 편집",
-       "right-editusercssjs": "다른 사용자의 CSS와 자바스크립트 문서를 편집",
        "right-editusercss": "다른 사용자의 CSS 문서를 편집",
        "right-edituserjs": "다른 사용자의 자바스크립트 문서를 편집",
        "right-editmyusercss": "자신의 사용자 CSS 파일 편집하기",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "보기",
        "rcfilters-activefilters": "사용 중인 필터",
+       "rcfilters-quickfilters": "빠른 링크",
+       "rcfilters-savedqueries-defaultlabel": "저장된 필터",
+       "rcfilters-savedqueries-rename": "이름 바꾸기",
+       "rcfilters-savedqueries-setdefault": "기본값으로 설정",
+       "rcfilters-savedqueries-unsetdefault": "기본값으로 제거",
+       "rcfilters-savedqueries-remove": "제거",
+       "rcfilters-savedqueries-new-name-label": "이름",
+       "rcfilters-savedqueries-apply-label": "빠른 링크 만들기",
+       "rcfilters-savedqueries-cancel-label": "취소",
+       "rcfilters-savedqueries-add-new-title": "필터를 빠른 링크로 저장",
        "rcfilters-restore-default-filters": "기본 필터 복구",
        "rcfilters-clear-all-filters": "필터 모두 지우기",
        "rcfilters-search-placeholder": "필터 최근 바뀜 (찾아보거나 입력을 시작하십시오)",
        "rcfilters-invalid-filter": "유효하지 않은 필터",
        "rcfilters-empty-filter": "활성화된 필터가 없습니다. 모든 기여가 표시됩니다.",
        "rcfilters-filterlist-title": "필터",
+       "rcfilters-filterlist-whatsthis": "이게 뭐죠?",
+       "rcfilters-filterlist-feedbacklink": "새로운 (베타) 필터에 대한 의견을 주세요",
+       "rcfilters-highlightbutton-title": "결과 강조",
+       "rcfilters-highlightmenu-title": "색 선택",
+       "rcfilters-highlightmenu-help": "이 속성을 강조할 색을 선택하십시오",
        "rcfilters-filterlist-noresults": "필터를 찾을 수 없습니다",
+       "rcfilters-noresults-conflict": "검색 조건이 충돌하기 때문에 결과를 찾을 수 없습니다",
+       "rcfilters-state-message-subset": "필터의 결과가 다음의 범위가 더 넓은 {{PLURAL:$2|필터}}의 결과에 포함되기 때문에 이 필터는 효력이 없습니다 (구별을 위해 강조해 보십시오): $1",
+       "rcfilters-state-message-fullcoverage": "한 그룹의 모든 필터를 선택하는 것은 아무 것도 선택하지 않는 것과 동일하므로 이 필터는 효력이 없습니다. 그룹은 다음을 포함합니다: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "이 필터는 등록된 사용자만을 {{PLURAL:$2|찾는}} 다음의 경험 {{PLURAL:$2|필터}}와 충돌합니다: $1",
+       "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-user-experience-level-conflicts-unregistered": "경험 필터는 등록된 사용자만을 검색하기 때문에 이 필터는 \"등록 안 됨\" 필터와 충돌합니다.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"등록 안 됨\" 필터는 하나 이상의 경험 필터와 충돌합니다. 경험 필터는 등록된 사용자만 찾습니다. 충돌되는 필터는 위의 활성화된 필터 목록에 표시됩니다.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "신규 사용자",
+       "rcfilters-filter-user-experience-level-newcomer-description": "10회 미만의 편집 및 4일 미만의 활동.",
+       "rcfilters-filter-user-experience-level-learner-label": "학습자",
+       "rcfilters-filter-user-experience-level-learner-description": "\"신규 사용자\" 보다 활동일 및 편집 수가 더 많지만 \"능숙한 사용자\" 보다는 적습니다.",
+       "rcfilters-filter-user-experience-level-experienced-label": "능숙한 사용자",
+       "rcfilters-filter-user-experience-level-experienced-description": "30일 이상의 활동 및 500개 이상의 편집.",
        "rcfilters-filtergroup-automated": "자동으로 된 기여",
        "rcfilters-filter-bots-label": "봇",
        "rcfilters-filter-bots-description": "자동 도구를 이용한 편집.",
        "rcfilters-filter-humans-label": "사람 (봇이 아님)",
-       "rcfilters-filter-humans-description": "수동으로 한 편집.",
+       "rcfilters-filter-humans-description": "사람이 한 편집.",
+       "rcfilters-filtergroup-reviewstatus": "검토 상태",
+       "rcfilters-filter-patrolled-label": "점검됨",
+       "rcfilters-filter-patrolled-description": "검토한 것으로 표시된 편집들.",
+       "rcfilters-filter-unpatrolled-label": "점검 안 됨",
+       "rcfilters-filter-unpatrolled-description": "검토한 것으로 표시되지 않은 편집들.",
        "rcfilters-filtergroup-significance": "의미",
        "rcfilters-filter-minor-label": "사소한 편집",
+       "rcfilters-filter-minor-description": "기여자가 사소한 기여로 표시한 편집.",
        "rcfilters-filter-major-label": "사소하지 않은 편집",
        "rcfilters-filter-major-description": "사소한 편집으로 표시되지 않은 편집.",
+       "rcfilters-filtergroup-watchlist": "주시 중인 문서",
+       "rcfilters-filter-watchlist-watched-label": "주시문서 목록에서",
+       "rcfilters-filter-watchlist-watched-description": "주시문서 목록의 문서의 변경사항입니다.",
+       "rcfilters-filter-watchlist-watchednew-label": "새로운 주시문서 목록 변경사항",
+       "rcfilters-filter-watchlist-notwatched-label": "주시문서 목록에서가 아닌",
+       "rcfilters-filter-watchlist-notwatched-description": "주시 중인 문서의 변경사항을 제외한 모든 사항입니다.",
        "rcfilters-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": "관리적 조치, 계정 만들기, 페이지 삭제, 업로드...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "특정한 유형의 변경사항을 \"사소한 편집\"으로 지정할 수 없기 때문에 \"사소한 편집\" 필터는 하나 이상의 변경사항 유형 필터와 충돌합니다. 충돌되는 필터들은 위의 사용 중인 필터 영역에 표시됩니다.",
+       "rcfilters-hideminor-conflicts-typeofchange": "특정한 종류의 변경사항은 \"사소한 편집\"으로 지정할 수 없으므로 이 필터는 다음 유형의 변경사항 필터와 충돌합니다: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "이 유형의 변경사항 필터는 \"사소한 편집\" 필터와 충돌합니다. 특정한 종류의 변경사항은 \"사소한 편집\"으로 지정할 수 없습니다.",
+       "rcfilters-filtergroup-lastRevision": "마지막 판",
+       "rcfilters-filter-lastrevision-label": "마지막 판",
+       "rcfilters-filter-lastrevision-description": "문서의 최근 변경사항입니다.",
+       "rcfilters-filter-previousrevision-label": "이전 판",
        "rcnotefrom": "아래는 <strong>$3, $4</strong>부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 <strong>$1</strong>개가 표시됨)",
+       "rclistfromreset": "날짜 선택 초기화",
        "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
        "rcshowhideminor": "사소한 편집 $1",
        "rcshowhideminor-show": "보이기",
        "rcshowhidecategorization": "문서 분류 $1",
        "rcshowhidecategorization-show": "보이기",
        "rcshowhidecategorization-hide": "숨기기",
-       "rclinks": "최근 $2일간의 $1개 바뀐 문서 보기<br />$3",
+       "rclinks": "최근 $2일간의 $1개 바뀐 문서 보기",
        "diff": "차이",
        "hist": "역사",
        "hide": "숨기기",
        "upload_directory_read_only": "파일 저장 디렉터리($1)에 쓰기 권한이 없습니다.",
        "uploaderror": "올리기 오류",
        "upload-recreate-warning": "<strong>경고: 해당 이름으로 된 파일이 삭제되었거나 이동되었습니다.</strong>\n\n편의를 위해 이 문서에 대한 삭제와 이동 기록을 다음과 같이 제공합니다:",
-       "uploadtext": "파일을 올리기 위해서는 아래의 양식을 채워주세요.\n[[Special:FileList|파일 목록]]에서 이전에 올라온 파일을 검색할 수 있습니다. [[Special:Log/upload|올리기 기록]]에는 파일이 올라온 기록이 남습니다. 삭제 기록은 [[Special:Log/delete|삭제 기록]]에서 볼 수 있습니다.\n\n문서에 파일을 넣으려면 아래 방법 중 하나를 사용하세요.\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' 파일의 온전한 모양을 사용하고자 할 때\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200픽셀|섬네일|왼쪽|설명]]</nowiki></code>''' 파일의 너비를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' 파일을 직접 보여주지 않고 파일로 바로 링크할 때",
+       "uploadtext": "파일을 올리기 위해서는 아래의 양식을 채워주세요.\n[[Special:FileList|파일 목록]]에서 이전에 올라온 파일을 검색할 수 있습니다. [[Special:Log/upload|올리기 기록]]에는 파일이 올라온 기록이 남습니다. 삭제 기록은 [[Special:Log/delete|삭제 기록]]에서 볼 수 있습니다.\n\n문서에 파일을 넣으려면 아래 방법 중 하나를 사용하세요.\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> 파일의 온전한 모양을 사용하고자 할 때\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200픽셀|섬네일|왼쪽|설명]]</nowiki></code></strong> 파일의 너비를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> 파일을 직접 표시하지 않고 파일로 바로 링크할 때",
        "upload-permitted": "허용된 파일 {{PLURAL:$2|형식}}: $1",
        "upload-preferred": "권장 파일 {{PLURAL:$2|형식}}: $1",
        "upload-prohibited": "금지된 파일 {{PLURAL:$2|형식}}: $1",
        "php-uploaddisabledtext": "PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.",
        "uploadscripted": "이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.",
        "upload-scripted-pi-callback": "XML 스타일시트 처리 명령을 포함하는 파일은 업로드할 수 없습니다.",
+       "upload-scripted-dtd": "비표준 DTD 선언이 포함된 SVG 파일을 업로드할 수 없습니다.",
        "uploaded-script-svg": "업로드된 SVG 파일에서 스크립트로 만들 수 있는 \"$1\" 요소를 발견했습니다.",
        "uploaded-hostile-svg": "업로드된 SVG 파일의 스타일 요소에 안전하지 않은 CSS가 있습니다.",
        "uploaded-event-handler-on-svg": "이벤트 핸들러 속성 <code>$1=\"$2\"</code> 설정은 SVG 파일에서 사용할 수 없습니다.",
        "uploaded-href-attribute-svg": "SVG 파일의 href 속성은 http:// 또는 https:// 대상의 링크만 허용되지만 <code>&lt;$1 $2=\"$3\"&gt;</code>를 발견했습니다.",
        "uploaded-href-unsafe-target-svg": "안전하지 않은 데이터를 가리키는 href를 발견했습니다: 업로드된 SVG 파일의 URI 대상 <code>&lt;$1 $2=\"$3\"&gt;</code>",
-       "uploaded-animate-svg": "업로드된 SVG 파일에서 \"from\" 성 <code>&lt;$1 $2=\"$3\"&gt;</code>을 이용 중 \"animate\" 태그가 href를 변경할 수 있음을 발견했습니다.",
+       "uploaded-animate-svg": "업로드된 SVG 파일에서 \"from\" 성 <code>&lt;$1 $2=\"$3\"&gt;</code>을 이용 중 \"animate\" 태그가 href를 변경할 수 있음을 발견했습니다.",
        "uploaded-setting-event-handler-svg": "이벤트 핸들러 속성을 차단으로 설정한 상태에서 <code>&lt;$1 $2=\"$3\"&gt;</code>가 업로드된 SVG 파일에서 발견되었습니다.",
-       "uploaded-setting-href-svg": "부모 요소에 \"href\" 성을 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다.",
-       "uploaded-wrong-setting-svg": "원격/데이터/스크립트 대상을 임의의 성에 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다. 업로드된 SVG 파일에 <code>&lt;set to=\"$1\"&gt;</code>를 발견했습니다.",
-       "uploaded-setting-handler-svg": "원격/데이터/스크립트와 함께 \"handler\" 성을 설정한 SVG는 이용이 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
-       "uploaded-remote-url-svg": "원격 URL로 style 성이 설정된 SVG파일은 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
+       "uploaded-setting-href-svg": "부모 요소에 \"href\" 성을 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다.",
+       "uploaded-wrong-setting-svg": "원격/데이터/스크립트 대상을 임의의 성에 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다. 업로드된 SVG 파일에 <code>&lt;set to=\"$1\"&gt;</code>를 발견했습니다.",
+       "uploaded-setting-handler-svg": "원격/데이터/스크립트와 함께 \"handler\" 성을 설정한 SVG는 이용이 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
+       "uploaded-remote-url-svg": "원격 URL로 style 성이 설정된 SVG파일은 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
        "uploaded-image-filter-svg": "URL에 이미지 필터를 발견했습니다: 업로드된 SVG 파일의 <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploadscriptednamespace": "이 SVG 파일은 사용할 수 없는 이름공간 '<nowiki>$1</nowiki>'을 포함하고 있습니다.",
        "uploadinvalidxml": "업로드된 파일의 XML의 구문을 분석할 수 없습니다.",
        "uncategorizedcategories": "분류되지 않은 분류 목록",
        "uncategorizedimages": "분류되지 않은 파일 목록",
        "uncategorizedtemplates": "분류되지 않은 틀 목록",
+       "uncategorized-categories-exceptionlist": "# \"특수:분류안된분류\"에 언급되지 않은 분류의 목록을 포함합니다. 한 줄에 하나씩 \"*\"로 시작합니다. 다른 문자(공백 포함)로 시작하는 줄들은 무시됩니다. 주석의 경우 \"#\"를 사용하십시오.",
        "unusedcategories": "사용하지 않는 분류 목록",
        "unusedimages": "사용하지 않는 파일 목록",
        "wantedcategories": "필요한 분류 목록",
        "apisandbox-alert-field": "이 필드의 값이 유효하지 않습니다.",
        "apisandbox-continue": "계속",
        "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 (모든 값)",
        "magiclink-tracking-isbn": "ISBN 매직 링크를 사용하는 문서",
        "magiclink-tracking-isbn-desc": "이 문서는 ISBN 매직 링크를 사용합니다. 이관 방법을 보려면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org]를 참조하십시오.",
        "specialloguserlabel": "작업 수행자:",
-       "speciallogtitlelabel": "대상 (사용자계정에 대한 제목 또는 {{ns:user}}:사용자이름):",
+       "speciallogtitlelabel": "대상 (문서 제목 또는 {{ns:user}}:사용자이름 으로 사용자 검색):",
        "log": "기록 목록",
        "logeventslist-submit": "보기",
        "all-logs-page": "모든 공개 기록",
-       "alllogstext": "{{SITENAME}}ì\97\90ì\84\9cì\9d\98 ê¸°ë¡\9dì\9d´ ëª¨ë\91\90 ë\82\98ì\99\80 ì\9e\88ì\8aµë\8b\88ë\8b¤.\n기ë¡\9d ì¢\85ë¥\98, ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84, ë¬¸ì\84\9c ì\9d´ë¦\84ì\9d\84 ì\84 í\83\9dí\95´ì\84\9c ë³¼ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤. (ë\8c\80ì\86\8c문ì\9e\90를 êµ¬ë³\84í\95©ë\8b\88ë\8b¤.)",
+       "alllogstext": "{{SITENAME}}ì\9d\98 ì·¨ë\93\9d ê°\80ë\8a¥í\95\9c ëª¨ë\93  ê¸°ë¡\9dì\9d´ í\91\9cì\8b\9cë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\n기ë¡\9d ì¢\85ë¥\98, ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84\8c\80ì\86\8c문ì\9e\90 êµ¬ë³\84), ì\98\81í\96¥ì\9d\84 ë°\9bë\8a\94 ë¬¸ì\84\9c\8c\80ì\86\8c문ì\9e\90 êµ¬ë³\84)를 ì\84 í\83\9dí\95´ì\84\9c ë²\94ì\9c\84를 ì¢\81í\98\80ì\84\9c ë³¼ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.",
        "logempty": "일치하는 항목이 없습니다.",
        "log-title-wildcard": "다음 글로 시작하는 제목 검색",
        "showhideselectedlogentries": "선택한 기록 항목 보이기/숨기기",
        "allpages": "모든 문서 목록",
        "nextpage": "다음 문서 ($1)",
        "prevpage": "이전 문서 ($1)",
-       "allpagesfrom": "다음으로 시작하는 문서 표시:",
-       "allpagesto": "다음으로 끝나는 문서 표시:",
+       "allpagesfrom": "다음보다 뒤에 오는 문서 표시:",
+       "allpagesto": "다음 보다 앞에 오는 문서 표시:",
        "allarticles": "모든 문서",
        "allinnamespace": "$1 이름공간의 모든 문서",
        "allpagessubmit": "보기",
        "categories": "분류 목록",
        "categories-submit": "보이기",
        "categoriespagetext": "문서나 자료를 {{PLURAL:$1|포함하고 있는 분류}} 목록입니다.\n[[Special:UnusedCategories|사용되지 않는 분류]]는 여기에 보이지 않습니다.\n[[Special:WantedCategories|필요한 분류]]도 참조하세요.",
-       "categoriesfrom": "다음으로 시작하는 분류 표시:",
+       "categoriesfrom": "검색어와 같거나 검색어보다 뒤에 오는 분류 표시:",
        "deletedcontributions": "삭제된 사용자 기여",
        "deletedcontributions-title": "삭제된 사용자 기여",
        "sp-deletedcontributions-contribs": "기여",
        "emailccsubject": "$1에게 보낸 메시지의 복사본: $2",
        "emailsent": "이메일 보냄",
        "emailsenttext": "이메일을 보냈습니다.",
-       "emailuserfooter": "이 이메일은 {{SITENAME}}의 $1님이 $2님에게 \"{{int:emailuser}}\" 기능을 통해 보냈습니다. 만약, {{GENDER:$2|당신}}이 이 이메일을 답장하면, {{GENDER:$2|당신}}의 이메일은 {{GENDER:$1|원래 사용자}}에게 {{GENDER:$2|당신}}의 이메일 주소가  {{GENDER:$1|원래 사용자}}에게 공개되면서 보내집니다.",
+       "emailuserfooter": "이 이메일은 {{SITENAME}}의 $1님이 $2님에게 \"{{int:emailuser}}\" 기능을 통해 보냈습니다. 이 이메일에 답장을 보내게 되면 원래 이메일을 보낸 사용자에게 직접 답장을 보내게 되며, 따라서 귀하의 이메일 주소를 보낸 사용자에게 공개하게 됩니다.",
        "usermessage-summary": "시스템 메시지 남기기",
        "usermessage-editor": "시스템 메신저",
        "usermessage-template": "MediaWiki:UserMessage",
        "enotif_body_intro_moved": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|이동하였으며}} 현재 판은 $3 에서 볼 수 있습니다.",
        "enotif_body_intro_restored": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|되살렸으며}} 현재 판은 $3 에서 볼 수 있습니다.",
        "enotif_body_intro_changed": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2님이 {{GENDER:$2|바꾸었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
-       "enotif_lastvisited": "마지막으로 방문한 뒤 생긴 모든 바뀜을 보려면 $1을 보세요.",
-       "enotif_lastdiff": "이 바뀜을 보려면 $1을 보세요.",
+       "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",
        "created": "만들었",
        "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의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다.",
+       "rollback-success": "{{GENDER:$3|$1}}의 편집을 되돌렸습니다.\n{{GENDER:$4|$2}}의 마지막 판으로 바뀌었습니다.",
        "rollback-success-notify": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다. [$3 차이 보기]",
        "sessionfailure-title": "세션 실패",
        "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.",
        "changecontentmodel-emptymodels-title": "이용 가능한 콘텐츠 모델이 없음",
        "changecontentmodel-emptymodels-text": "[[:$1]]의 콘텐츠가 임의의 종류로 전환될 수 없습니다.",
        "log-name-contentmodel": "콘텐츠 모델 변경 기록",
-       "log-description-contentmodel": "페이지의 콘텐츠 모델과 관련된 행위",
+       "log-description-contentmodel": "이 페이지는 페이지의 콘텐츠 모델의 변경사항 및 기본값이 외의 콘텐츠 모델로 작성된 페이지들을 나열합니다.",
        "logentry-contentmodel-new": "$1님이 비 기본값 \"$5\" 콘텐츠 모델을 사용해  $3 문서를 {{GENDER:$2|만들었습니다}}",
        "logentry-contentmodel-change": "$1님이 $3 문서의 콘텐츠 모델을 \"$4\"에서 \"$5\"(으)로 {{GENDER:$2|바꾸었습니다}}",
        "logentry-contentmodel-change-revertlink": "되돌리기",
        "undeleteviewlink": "보기",
        "undeleteinvert": "선택 반전",
        "undeletecomment": "이유:",
-       "undeletedrevisions": "{{PLURAL:$1|판 1개|판 $1개}}를 되살렸습니다",
-       "undeletedrevisions-files": "{{PLURAL:$1|판 1개|판 $1개}}와 {{PLURAL:$2|파일 1개|파일 $2개}}를 되살렸습니다",
-       "undeletedfiles": "{{PLURAL:$1|파일 1개|파일 $1개}}를 되살렸습니다",
        "cannotundelete": "일부 또는 모든 항목의 되살리기를 실패했습니다:\n$1",
        "undeletedpage": "<strong>$1 문서를 되살렸습니다.</strong>\n\n[[Special:Log/delete|삭제 기록]]에서 최근의 삭제 및 되살리기 기록을 볼 수 있습니다.",
        "undelete-header": "최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.",
        "sp-contributions-uploads": "올린 파일",
        "sp-contributions-logs": "기록",
        "sp-contributions-talk": "토론",
-       "sp-contributions-userrights": "사용자 권한 관리",
+       "sp-contributions-userrights": "{{GENDER:$1|사용자}} 권한 관리",
        "sp-contributions-blocked-notice": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 차단 기록은 다음과 같습니다:",
        "sp-contributions-blocked-notice-anon": "이 IP 주소는 현재 차단되어 있습니다.\n차단 기록은 다음과 같습니다:",
        "sp-contributions-search": "기여 검색",
        "unblocked-id": "$1 차단이 해제되었습니다.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]]님이 차단 해제되었습니다.",
        "blocklist": "차단된 사용자 목록",
+       "autoblocklist": "자동차단",
+       "autoblocklist-submit": "검색",
+       "autoblocklist-legend": "자동차단 목록",
+       "autoblocklist-localblocks": "로컬 자동 차단 {{PLURAL:$1|기록|기록들}}",
+       "autoblocklist-empty": "자동차단 목록이 비어 있습니다.",
+       "autoblocklist-otherblocks": "다른 자동 차단 {{PLURAL:$1|기록|기록들}}",
        "ipblocklist": "차단된 사용자",
        "ipblocklist-legend": "차단된 사용자 찾기",
        "blocklist-userblocks": "계정에 대한 차단 숨기기",
        "imagenocrossnamespace": "파일을 파일이 아닌 이름공간으로 이동할 수 없습니다.",
        "nonfile-cannot-move-to-file": "파일이 아닌 문서를 파일 이름공간으로 이동할 수 없습니다.",
        "imagetypemismatch": "새 파일의 확장자가 원래의 확장자와 일치하지 않습니다.",
-       "imageinvalidfilename": " 파일 이름이 잘못되었습니다.",
+       "imageinvalidfilename": "대상 파일 이름이 잘못되었습니다.",
        "fix-double-redirects": "원래 제목을 가리키는 넘겨주기를 새로 고침",
        "move-leave-redirect": "이동한 뒤 넘겨주기를 남기기",
        "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만 이동할 수 있도록 보호되어 있습니다.\n최근 기록을 참조를 위해 아래에 제공합니다:",
        "tooltip-pt-mycontris": "{{GENDER:|내}} 기여 목록",
        "tooltip-pt-anoncontribs": "이 IP 주소의 편집 목록",
        "tooltip-pt-login": "꼭 로그인해야 하는 것은 아니지만, 로그인을 권장합니다.",
+       "tooltip-pt-login-private": "이 위키를 사용하려면 로그인해야 합니다",
        "tooltip-pt-logout": "로그아웃",
        "tooltip-pt-createaccount": "계정을 만들고 로그인하는 것이 좋습니다; 하지만, 필수는 아닙니다",
        "tooltip-ca-talk": "문서의 내용에 대한 토론 문서",
        "anonymous": "{{SITENAME}} 익명 {{PLURAL:$1|사용자}}",
        "siteuser": "{{SITENAME}} 사용자 $1",
        "anonuser": "{{SITENAME}} 익명 사용자 $1",
-       "lastmodifiedatby": "이 문서는 $3님이 $1 $2에 마지막으로 ë°\94꾸ì\97\88ì\8aµë\8b\88ë\8b¤.",
+       "lastmodifiedatby": "이 문서는 $3님이 $1 $2에 마지막으로 í\8e¸ì§\91í\96\88ì\8aµë\8b\88ë\8b¤.",
        "othercontribs": "$1의 작업을 바탕으로 합니다.",
        "others": "기타",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|사용자}}}} $1",
        "newimages-summary": "이 특수 문서는 최근에 올라온 파일을 나열하고 있습니다.",
        "newimages-legend": "필터",
        "newimages-label": "파일 이름 (또는 그 일부분):",
+       "newimages-user": "IP 주소 또는 사용자 이름",
        "newimages-showbots": "봇이 올린 것 보기",
        "newimages-hidepatrolled": "점검한 업로드 숨기기",
        "noimages": "그림이 없습니다.",
        "metadata-help": "이 파일은 카메라나 스캐너가 파일을 만들거나 디지털화하는 데 사용하기위해 기록한 부가 정보를 포함하고 있습니다.\n프로그램에서 파일을 편집한 경우, 새로 저장한 파일에 일부 부가 정보가 빠질 수 있습니다.",
        "metadata-expand": "자세한 정보 보이기",
        "metadata-collapse": "자세한 정보 숨기기",
-       "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",
+       "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-imagewidth": "너비",
        "exif-imagelength": "높이",
        "exif-bitspersample": "픽셀당 비트 수",
        "confirmrecreate": "[[User:$1|$1]] 사용자([[User talk:$1|토론]])가 당신이 편집하는 도중에 문서를 {{GENDER:$1|삭제했습니다}}. 삭제 이유는 다음과 같습니다:\n: $2\n문서를 다시 만들어야 하는지 확인해주세요.",
        "confirmrecreate-noreason": "[[User:$1|$1]] 사용자([[User talk:$1|토론]])가 당신이 편집하는 도중에 문서를 {{GENDER:$1|삭제했습니다}}. 문서를 다시 만들어야 하는지 확인해주세요.",
        "recreate": "새로 만들기",
+       "confirm-purge-title": "이 문서를 새로고침",
        "confirm_purge_button": "확인",
        "confirm-purge-top": "이 문서의 캐시를 지울까요?",
        "confirm-purge-bottom": "문서를 새로 고치는 것은 캐시를 지우고 강제로 가장 현재의 판이 나타나게 합니다.",
        "size-bytes": "$1 {{PLURAL:$1|바이트}}",
        "size-pixel": "$1 {{PLURAL:$1|픽셀}}",
        "lag-warn-normal": "최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.",
-       "lag-warn-high": "데이터베이스 서버의 과도한 부하 때문에 최근 $1{{PLURAL:$1|초|초}} 안에 바뀐 문서 목록은 보이지 않을 수 있습니다.",
+       "lag-warn-high": "데이터베이스 서버의 과도한 지연 때문에 $1{{PLURAL:$1|초|초}} 전 이후의 변경 내용은 이 목록에 보이지 않을 수 있습니다.",
        "watchlistedit-normal-title": "주시문서 목록 편집하기",
        "watchlistedit-normal-legend": "주시문서 목록에서 문서 제거하기",
        "watchlistedit-normal-explain": "주시문서 목록에 있는 문서의 제목이 아래에 나와 있습니다.\n주시문서 목록에서 제거하려는 문서가 있으면 각 항목의 확인 상자를 선택한 다음 \"{{int:Watchlistedit-normal-submit}}\"를 클릭해주세요.\n또는 [[Special:EditWatchlist/raw|목록을 직접 편집]]할 수도 있습니다.",
        "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 콘텐츠\n 모델을 변경하는] 편집",
        "tags-title": "태그",
        "tags-intro": "이 문서는 소프트웨어에서 편집에 대해 표시하는 태그와 그 의미를 설명하는 목록입니다.",
        "tags-tag": "태그 이름",
        "htmlform-date-invalid": "지정한 값은 인식할 수 있는 날짜가 아닙니다. YYYY-MM-DD 형식을 사용하세요.",
        "htmlform-time-invalid": "지정한 값은 인식할 수 있는 시간이 아닙니다. HH:MM:SS 형식을 사용하세요.",
        "htmlform-datetime-invalid": "지정한 값은 인식할 수 있는 날짜 및 시간이 아닙니다. YYYY-MM-DD HH:MM:SS 형식을 사용하세요.",
+       "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-valid": "<strong>$1</strong>은 올바른 사용자 이름이 아닙니다.",
        "logentry-delete-delete": "$1님이 $3 문서를 {{GENDER:$2|삭제했습니다}}",
        "logentry-delete-delete_redir": "$1님이 덮어쓰기를 통해 $3 문서를 {{GENDER:$2|삭제했습니다}}",
-       "logentry-delete-restore": "$1님이 $3 문서를 {{GENDER:$2|되살렸습니다}}",
+       "logentry-delete-restore": "$1님이 $3 문서를 {{GENDER:$2|되살렸습니다}} ($4)",
+       "logentry-delete-restore-nocount": "$1님이 $3 문서를 {{GENDER:$2|되살렸습니다}}",
+       "restore-count-revisions": "{{PLURAL:$1|판 1개|판 $1개}}",
+       "restore-count-files": "{{PLURAL:$1|파일 1개|파일 $1개}}",
        "logentry-delete-event": "$1님이 $3의 {{PLURAL:$1|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
        "logentry-delete-revision": "$1님이 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
        "logentry-delete-event-legacy": "$1님이 $3 문서 기록의 보이기 설정을 {{GENDER:$2|바꾸었습니다}}",
        "logentry-tag-update-revision": "$1님이 $3 문서의 $4판에서 태그를 {{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": "편집 요약",
        "rightslogentry-temporary-group": "$1 (일시적, $2까지)",
        "feedback-adding": "문서에 피드백을 올리는 중...",
        "feedback-back": "뒤로",
        "special-characters-group-thai": "타이어",
        "special-characters-group-lao": "라오어",
        "special-characters-group-khmer": "크메르어",
+       "special-characters-group-canadianaboriginal": "캐나다 원주민 언어",
        "special-characters-title-endash": "en 대시",
        "special-characters-title-emdash": "em 대시",
        "special-characters-title-minus": "빼기 기호",
        "mw-widgets-titleinput-description-redirect": "$1 문서로 넘겨주기",
        "mw-widgets-categoryselector-add-category-placeholder": "분류 추가...",
        "mw-widgets-usersmultiselect-placeholder": "더 추가하기...",
+       "date-range-from": "시작 날짜:",
+       "date-range-to": "끝 날짜:",
        "sessionmanager-tie": "여러 요청 인증 유형 결합할 수 없습니다: $1.",
        "sessionprovider-generic": "$1 세션",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "쿠키 기반 세션",
        "authprovider-confirmlink-request-label": "연결할 계정",
        "authprovider-confirmlink-success-line": "$1: 연결을 성공했습니다.",
        "authprovider-confirmlink-failed": "계정 연결을 완전히 성공하지 못했습니다: $1",
-       "authprovider-confirmlink-ok-help": "연결 실패 메시지를 보여준 뒤에도 계속합니다.",
+       "authprovider-confirmlink-ok-help": "연결 실패 메시지를 표시한 뒤에도 계속합니다.",
        "authprovider-resetpass-skip-label": "건너뛰기",
        "authprovider-resetpass-skip-help": "비밀번호 재설정을 건너뜁니다.",
        "authform-nosession-login": "인증은 성공했으나 사용자의 브라우저가 로그인 상태를 저장하지 못했습니다.\n\n$1",
        "restrictionsfield-label": "허용된 IP 대역:",
        "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "$1 판",
-       "pageid": "페이지 ID $1"
+       "pageid": "페이지 ID $1",
+       "rawhtml-notallowed": "&lt;html&gt; 태그는 일반 페이지 밖에서는 사용할 수 없습니다.",
+       "gotointerwiki": "{{SITENAME}}을(를) 떠납니다",
+       "gotointerwiki-invalid": "지정된 제목이 올바르지 않습니다.",
+       "gotointerwiki-external": "다른 웹사이트 [[$2]]을(를) 방문하기 위해, {{SITENAME}}을(를) 떠나려고 합니다.\n\n'''[$1 $1(으)로 계속 진행]'''",
+       "undelete-cantedit": "이 문서를 편집할 권한이 없으므로 이 문서를 복구할 수 없습니다.",
+       "undelete-cantcreate": "이 이름으로 된 문서가 없고 이 문서를 만들 권한이 없으므로 이 문서를 복구할 수 없습니다."
 }
index 9bf914e..5223b90 100644 (file)
        "rcshowhideliu": "Ас нимöн $1 уджкерись",
        "rcshowhideanons": "$1 нимтöг уджкерись",
        "rcshowhidemine": "аслам $1 мöдкодьсьöтöм",
-       "rclinks": "Мыччавны  медбöрья $1 вильмöтöмсö $2 лун дырнаись<br />$3",
+       "rclinks": "Мыччавны  медбöрья $1 вильмöтöмсö $2 лун дырнаись",
        "diff": "неöтк.",
        "hist": "чулалöм",
        "hide": "Сайöвтны",
index 557bc61..6a2191c 100644 (file)
@@ -9,7 +9,8 @@
                        "Къарачайлы",
                        "아라",
                        "Macofe",
-                       "Ernác"
+                       "Ernác",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "Джибериулени черт:",
        "externaldberror": "Тыш информация базаны болушлугъу бла аутентификация, халатлы болду, неда тыш аккаунтугъузну тюрлендирирге хакъларагъыз джетмейди.",
        "login": "Системагъа кириу",
        "nav-login-createaccount": "Системагъа кириу / Аккаунт къурау",
-       "userlogin": "Кир / регистрация эт",
-       "userloginnocreate": "Кириу",
        "logout": "Чыгъыу",
        "userlogout": "Чыгъыу",
        "notloggedin": "Авторизация ётмегенсиз",
        "userlogin-noaccount": "Аккаунтунг джокъмуду?",
        "userlogin-joinproject": "{{SITENAME}} сайтха къошул",
-       "nologin": "Тергеу джазыуугъуз (аккаунтугъуз) джокъмуду? $1.",
-       "nologinlink": "Тергеу джазыу (аккаунт) къурагъыз",
        "createaccount": "Аккаунт къурау",
-       "gotaccount": "Тергеу джазыуугъуз (аккаунтугъуз) энди бармыды? $1.",
-       "gotaccountlink": "Системагъа кир",
-       "userlogin-resetlink": "Кирир ючюн билгилеригизни унутхан этгенмисиз?",
        "userlogin-resetpassword-link": "Паролунгу унутдунгму?",
        "userlogin-helplink2": "Кириуде болушлукъ",
        "userlogin-createanother": "Башха аккаунт къурау",
        "createacct-another-email-ph": "Электрон почтаны адресин джаз",
        "createaccountmail": "Эсде болмагъанлай генерация этилген болджаллы паролну хайырландырыу эмда берилген электрон почта адресге ийиу",
        "createacct-realname": "Керти атыгъыз (ажымсыз керек тюлдю)",
-       "createaccountreason": "Чурум:",
        "createacct-reason": "Чурум",
        "createacct-reason-ph": "Башха тергеу джазыуну нек къураусыз",
        "createacct-submit": "Тергеу джазыуну къура",
        "passwordreset-emaildisabled": "Бу викиде электрон почтаны функциялары джукъланыбдыла.",
        "passwordreset-username": "Къошулуучуну аты:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Джазылгъан билдириуню эсебине къара?",
-       "passwordreset-capture-help": "Бу белгини салсагъыз, къошулуучугъа ийилген болджаллы пароль бла билдириу сизге кёргюзюллюкдю.",
        "passwordreset-email": "Электрон почтаны адреси:",
        "passwordreset-emailtitle": "{{SITENAME}} сайтдагъы тергеу джазыуну юсюнден билгиле",
        "passwordreset-emailelement": "Къошулуучуну аты: \n$1\n\nБолджаллы пароль: \n$2",
        "anonpreviewwarning": "''Сиз тергеу джазыуугъуз бла кирмегенсиз. Бетде тюрлениулени сакълатсагъыз, бетни тюрлениу тарихине IP-адресигиз джазыллыкъды.''",
        "missingsummary": "'''Эс бёлюгюз.'''  Тюрлениулеге къысха ачыкълау джазмагъансыз.\nСиз «Бетни сакъла» дегеннге энтда бассагъыз, тюрлениуле комментарийлесиз сакъланныкъдыла.",
        "missingcommenttext": "Тюбю бла ачыкълау джазыгъыз.",
-       "missingcommentheader": "'''Эс бёлюгюз:''' Сиз ачыкълаугъа тема/башлыкъ джазмагъансыз.\n«{{int:savearticle}}» тиекден джангыдан бассагъыз, тюрлендириулеригиз башлыкъсыз сакъланныкъдыла.",
+       "missingcommentheader": "'''Эс бёлюгюз:''' Сиз ачыкълаугъа тема/башлыкъ джазмагъансыз.\n«$1» тиекден джангыдан бассагъыз, тюрлендириулеригиз башлыкъсыз сакъланныкъдыла.",
        "summary-preview": "Суратлауу былай боллукъду:",
        "subject-preview": "Башлыкъны ал къарау:",
        "blockedtitle": "Къошулуучу блок этилиниб турады",
        "editingsection": "«$1» бетде бёлюмню тюрлендириу",
        "editingcomment": "«$1» бетни тюрлендириу (джангы бёлюм)",
        "editconflict": "Тюрлендириу конфликт: $1",
-       "explainconflict": "Сиз тюрлендире тургъан сагъатда, ким эседа бы бетни тюрлендирген этгенди.\nБаш терезеде сиз бусагъатдагъы текстни кёресиз.\nТюбюнде терезеде сизни варинтды.\nСиз этген тюрлениулени тюб терезеден баш терезеге кёчюрюгюз.\n«{{int:savearticle}}» басылса баш терезеде текст сакъланныкъды.",
+       "explainconflict": "Сиз тюрлендире тургъан сагъатда, ким эседа бы бетни тюрлендирген этгенди.\nБаш терезеде сиз бусагъатдагъы текстни кёресиз.\nТюбюнде терезеде сизни варинтды.\nСиз этген тюрлениулени тюб терезеден баш терезеге кёчюрюгюз.\n«$1» басылса баш терезеде текст сакъланныкъды.",
        "yourtext": "Сизни текстигиз",
        "storedversion": "Сакъланнган версия",
        "nonunicodebrowser": "'''Эсгертиу: сизни браузеригиз Юникод кодировканы танымайдв.'''\nБетлени тюрлендирген сагъатда ASCII болмагъан символла оналтылыкъ кодларына алышдырыллыкъдыла.",
        "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": "Сиз тюрлендирелмезлик къауумла",
        "userrights-irreversible-marker": "$1*",
        "right-protect": "Къорууну дараджасын тюрлендир эмда къорууланнган бетледе тюрлениуле эт",
        "right-editprotected": "Къорууланнган бетледе тюрлениу эт (секиртмесиз джакъсыз)",
        "right-editinterface": "Къошулуучу интерфейсни тюрлендир",
-       "right-editusercssjs": "Башха къошулуучуланы CSS- эм JS-файлларына тюрлениу эт",
        "right-editusercss": "Башха къошулуучуланы CSS-файлларына тюрлениу эт",
        "right-edituserjs": "Башха къошулуучуланы JS-файлларына тюрлениу эт",
        "right-rollback": "Белгили бетни тюрлендирген ахыр къошулуучуну тюрлениулерин дженгил ызына къайтар",
        "right-siteadmin": "Билги базаны киритле эмда киритни ач",
        "right-override-export-depth": "Бетлени, теренлиги 5-ге дери байламлы бетле бла бирге экспорт эт",
        "right-sendemail": "Башха къошулуучулагъа электрон почта джиберирге",
-       "right-passwordreset": "пароль тюрлениуле бла e-mail'леге къарау",
        "grant-group-email": "E-mail джибер",
        "grant-createaccount": "Аккаунтла къурау",
        "newuserlogpage": "Къошулуучуланы регистрацияларыны журналы",
        "rcshowhidemine": "кесими тюрлендириулерими $1",
        "rcshowhidemine-show": "кёргюз",
        "rcshowhidemine-hide": "джашыр",
-       "rclinks": "Ахыр $2 кюнню ичинде этилиннген $1 тюрлениуню кёргюз;<br /> $3",
+       "rclinks": "Ахыр $2 кюнню ичинде этилиннген $1 тюрлениуню кёргюз;",
        "diff": "башх.",
        "hist": "тарих",
        "hide": "джашыр",
        "undeleteviewlink": "кёргюз",
        "undeleteinvert": "Сайлауну ызына бур",
        "undeletecomment": "Чурум:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|1=тюрлендириу|тюрлендириу}} ызына къайтарылды",
-       "undeletedrevisions-files": "{{PLURAL:$1|1=1 версия|$1 версия}} бла {{PLURAL:$2|1=1 файл|$2 файл}} ызына къайтарылды",
-       "undeletedfiles": "{{PLURAL:$1|1=1 файл|$1 файл}} ызына къайтарылды",
        "cannotundelete": "Бетни неда медианы сизден алгъа башха къошулуучу ызына къайтаргъаны себебли сизини ызына къайтарыу ишлемигиз джараусузду.",
        "undeletedpage": "'''$1 бет ызына къайтарылды '''\n\nАхыр кетериу бла ызына къайтарыуну кёрюр ючюн [[Special:Log/delete|кетериуню журнал]]ына къарагъыз.",
        "undelete-header": "Кёб болмай кетерилген бетлени кёрюр ючюн [[Special:Log/delete|кетериу журнал]]гъа къарагъыз.",
        "logentry-rights-autopromote": "$1 къошулуучу, $4 къауумдан автомат халда $5 къауумгъа {{GENDER:$2|кёчюрюлдю}}",
        "logentry-upload-upload": "$1, $3 {{GENDER:$2|джюкледи}}",
        "rightsnone": "(джокъ)",
-       "revdelete-summary": "тюрлениулени ачыкълау",
        "feedback-cancel": "Ызына алыу",
        "feedback-close": "Тындырылды",
        "feedback-error2": "Халат. Тюзетиу ётмеди",
        "searchsuggest-search": "Излеу",
        "searchsuggest-containing": "ичиндегиси…",
        "api-error-badtoken": "Ич халат: терс токен.",
-       "api-error-empty-file": "Сиз ийген файлны ичи бошду.",
        "api-error-emptypage": "Ичи бош болгъан джангы бетле къураргъа болмайды.",
-       "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-illegal-filename": "Джарамагъан файл ат.",
-       "api-error-invalid-file-key": "Ич халат: болджаллы асыраучу джерде файл  табылмады.",
-       "api-error-mustbeposted": "Ич халат: соруу, HTTP POST инструкцияны излейди.",
-       "api-error-ok-but-empty": "Ич халат: сервер джууаб бермейди.",
-       "api-error-timeout": "Сакълагъан заманны ичинде сервер джуууб бермейди.",
-       "api-error-unclassified": "Белгили болмагъан халат чыкъды",
-       "api-error-unknown-code": "Билинмеген халат: «$1».",
-       "api-error-unknown-error": "Ич халат: файлны джюклерге излеген сагъатда не эсе да терс болду.",
        "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 6afca3d..736e5cf 100644 (file)
        "userlogin-remembermypassword": "Pijä miut kirjuttautunuona",
        "login": "Kirjauvu šiämeh",
        "nav-login-createaccount": "Kirjauvu šiämeh / rekisteriyvy",
-       "userlogin": "Kirjauvu šiämeh / rekisteriyvy",
-       "userloginnocreate": "Kirjauvu šiämeh",
        "logout": "Kirjauvu pois",
        "userlogout": "Kirjauvu pois",
        "userlogin-noaccount": "Eikö šiula vielä ole käyttäjätunnušta?",
        "userlogin-joinproject": "Liity {{SITENAME}}",
        "createaccount": "Luaji käyttäjätili",
-       "gotaccountlink": "Kirjauvu šiämeh",
        "userlogin-resetpassword-link": "Unohitko šalašanan?",
        "userlogin-helplink2": "Apu kirjuttautumiseh",
        "createacct-emailoptional": "Šähköpoštiošoiteh (ei tarviče välttämättä kirjuttua)",
        "createacct-email-ph": "Kirjuta oma šähköpoštiošoiteh",
-       "createaccountreason": "Šyy:",
        "createacct-reason": "Šyy",
        "createacct-submit": "Luaji oma käyttäjätunnuš",
        "createacct-benefit-heading": "{{SITENAME}} on šiun kaltasien ihmisien luatima.",
        "searchprofile-everything-tooltip": "Eči kaikilta šivuloilta (niise pakinoista)",
        "searchprofile-advanced-tooltip": "Eči miärätyistä nimitiloista",
        "search-result-size": "$1 ({{PLURAL:$2|1 šana|$2 šanua}})",
-       "search-redirect": "(šiirretty $1)",
+       "search-redirect": "(šiirretty šivulta $1)",
        "search-section": "(alaluku $1)",
        "search-suggest": "Tarkotitko: $1",
        "searchall": "kaikki",
        "rcshowhidemine": "$1 miun kohennukšet",
        "rcshowhidemine-show": "Näytä",
        "rcshowhidemine-hide": "Peitä",
-       "rclinks": "Näytä $1 vereštä kohennušta viimesen $2 päivän ajalta.<br />$3",
+       "rclinks": "Näytä $1 vereštä kohennušta viimesen $2 päivän ajalta.",
        "diff": "ero",
        "hist": "ist",
        "hide": "Peitä",
        "logentry-move-move": "$1 {{GENDER:$2|šiirretty}} šivu $3 kohtah $4",
        "logentry-newusers-create": "Käyttäjätunnuš $1 {{GENDER:$2|oli luotu}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|päivitetty}} $3",
-       "searchsuggest-search": "Eči"
+       "searchsuggest-search": "Eči {{SITENAME}}"
 }
index 3d70dbb..e1d5cd5 100644 (file)
        "externaldberror": "Do wor ene Fähler en de externe Daatebank, oder Do darfs Ding extern Daate nit ändere. Dat Aanmelde jingk jedenfalls donevve.",
        "login": "Enlogge",
        "nav-login-createaccount": "Enlogge, Aanmälde",
-       "userlogin": "Enlogge odder Metmaacher wääde",
-       "userloginnocreate": "Enlogge",
        "logout": "Ußlogge",
        "userlogout": "Ußlogge",
        "notloggedin": "Nit enjelogg",
        "userlogin-noaccount": "Do häß noch keine Zohjang?",
        "userlogin-joinproject": "Aanmälde zom Metmaache!",
-       "nologin": "Wann de dich noch nit aanjemeldt häs, dann dun dich $1.",
-       "nologinlink": "neu aanmelde",
        "createaccount": "Aanmelde als ene neue Metmaacher",
-       "gotaccount": "Do bes ald aanjemeldt {{GRAMMAR:en|{{SITENAME}}}}? Dann jangk nohm '''$1'''.",
-       "gotaccountlink": "Enlogge",
-       "userlogin-resetlink": "Häß De Ding Daate för et Enlogge verjäße?",
        "userlogin-resetpassword-link": "Paßwoot verjäße?",
        "userlogin-helplink2": "Hölp mem Enlogge",
        "userlogin-loggedin": "Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|dä Metmaacher}} [[User:$1|$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz ävver onger enem andere Nahme enlogge.",
        "createaccountmail": "Scheck mer en <i lang=\"en\">e-mail</i> met enem neu ußjedaachte Paßwood op Zick",
        "createaccountmail-help": "Kammer ennsäzze, öm ene Zohjang föe ene Anndere Metmaacher aanzelähje, der ohne dat Paßwoot känne ze lihre.",
        "createacct-realname": "Dinge börjerlesche Nahme, kans De och fott lohße",
-       "createaccountreason": "Jrond:",
        "createacct-reason": "Der Jrond udder Aanlaß",
        "createacct-reason-ph": "Woröm deihs De noch ene Zohjang aanlääje?",
        "createacct-reason-help": "Wadd em Logbohch för et Zohjäng Aanlähje schtonn sull",
        "preview": "Vör-Ansich",
        "showpreview": "Vöraff belohre",
        "showdiff": "Veränderonge zeije",
-       "blankarticle": "<strong>Opjepaß:</strong> Di Sigg, di De jrahd aanlähje wells, es läddesch. Wann De jäz norr_ens op „{{int:savearticle}}“ jehß, weed di Sigg och ohne jät dren aanjelaat.",
+       "blankarticle": "<strong>Opjepaß:</strong> Di Sigg, di De jrahd aanlähje wells, es läddesch. Wann De jäz norr_ens op „$1“ jehß, weed di Sigg och ohne jät dren aanjelaat.",
        "anoneditwarning": "'''Opjepaß:''' Weil De nit enjelogg bes, weed Ding <i lang=\"en\" xml:lang=\"en\">IP</i>-Adräß en heh dä Sigg ier Leß met de Väsiohne faßjehallde wääde.\nWann De [$1 enlogge deihs] udder [$2 desch aanmällds], dann wääde Ding Änderonge met dingem Nahme als Metmaacher opjevöhrt.",
        "anonpreviewwarning": "''Weil De nit enjlogg bes, weed Ding <code lang=\"en\">IP</code>-Addräß zoamme met dä neue Version faßjehallde, wann de heh di Sigg avspeichere deihß.''",
-       "missingsummary": "<strong>Opjepass:</strong> Do häs nix bei „{{int:summary}}“ enjejovve. Dun noch ens op „{{int:savearticle}}“ klicke, öm Ding Änderunge ohne de Zosammefassung ze Speichere. Ävver besser jiss De do jetz tirek ens jet en!",
-       "selfredirect": "<strong>Opjepaß:</strong> Do wells heh di Sigg op sesch sällver ömleide lohße.\nDat hät zwa keine rääschte Senn, ävver wann De jäz norr_enz op „{{int:savearticle}}“ klecks, weed dat esu jemaat.",
+       "missingsummary": "<strong>Opjepass:</strong> Do häs nix bei „{{int:summary}}“ enjejovve. Dun noch ens op „$1“ klicke, öm Ding Änderunge ohne de Zosammefassung ze Speichere. Ävver besser jiss De do jetz tirek ens jet en!",
+       "selfredirect": "<strong>Opjepaß:</strong> Do wells heh di Sigg op sesch sällver ömleide lohße.\nDat hät zwa keine rääschte Senn, ävver wann De jäz norr_enz op „$1“ klecks, weed dat esu jemaat.",
        "missingcommenttext": "Jevv en „Koot Zosammejefass, Quell“ aan!",
-       "missingcommentheader": "<strong>Opjepass:</strong> Do häs kein Övverschreff för Dinge Beidrach enjejovve.\nWann De noch ens op „{{int:savearticle}}“ dröcks, weed Dinge Beidrach der ohne avjespeichert.",
+       "missingcommentheader": "<strong>Opjepass:</strong> Do häs kein Övverschreff för Dinge Beidrach enjejovve.\nWann De noch ens op „$1“ dröcks, weed Dinge Beidrach der ohne avjespeichert.",
        "summary-preview": "Vör-Aansich vun „Koot Zosammejefass, Quell“:",
        "subject-preview": "Vöraff-Aanseesch vun dä Övverschreff:",
        "previewerrortext": "Ene Fähler es beim Versohch opjetrodde, de Sigg met de Änderonge aanzezeije.",
        "editingsection": "Ne Avschnedd vun dä Sigg: „$1“ ändere",
        "editingcomment": "„$1“ ändere (ene neue Avschnedd schrieve)",
        "editconflict": "Problemche: „$1“ dubbelt bearbeidt.",
-       "explainconflict": "Ene andere Metmaacher hät aan dä Sigg och jet jeändert, un zwar nohdäm Do et Ändere aanjefange häs. Jetz ha'mer dr Dress am Jang, un Do darfs et widder uszoteere.\n<strong>Opjepass:</strong><ul><li>Dat bovvere Täxfeld zeisch di Sigg esu, wie se jetz em Momang jeschpeijschert es, alsu met de Änderonge vun alle andere Metmaacher, di flöcker wie Do jeschpeischert han.</li><li>Dat ongere Täxfeld zeisch di Sigg esu, wie De se sälver zoletz zerääch jebrasselt häs.</li></ul>\nDo muss jetz Ding Änderunge och in dat <strong>bovvere</strong> Texxfeld eren bränge. Natörlich ohne dä Andere ihr Saache kapott ze maache.\n<strong>Nor wat em bovvere Texfeld steiht,</strong> dat weed üvvernomme un avjespeichert, wann De „<b\nstyle=\"padding:2px; background-color:#ddd; color:black\">{{int:savearticle}}</b>“ kleks. Bes dohin kanns De esu öff wi De wells op „<b style=\"padding:2px; background-color:#ddd; color:black\">{{int:showdiff}}</b>“ un „<b\nstyle=\"padding:2px; background-color:#ddd; color:black\">{{int:showpreview}}</b>“ klicke, öm ze pröfe, watte ald   jods jemaat häs.\n\nAlles Klor?<br /><br />",
+       "explainconflict": "Ene andere Metmaacher hät aan dä Sigg och jet jeändert, un zwar nohdäm Do et Ändere aanjefange häs. Jetz ha'mer dr Dress am Jang, un Do darfs et widder uszoteere.\n<strong>Opjepass:</strong><ul><li>Dat bovvere Täxfeld zeisch di Sigg esu, wie se jetz em Momang jeschpeijschert es, alsu met de Änderonge vun alle andere Metmaacher, di flöcker wie Do jeschpeischert han.</li><li>Dat ongere Täxfeld zeisch di Sigg esu, wie De se sälver zoletz zerääch jebrasselt häs.</li></ul>\nDo muss jetz Ding Änderunge och in dat <strong>bovvere</strong> Texxfeld eren bränge. Natörlich ohne dä Andere ihr Saache kapott ze maache.\n<strong>Nor wat em bovvere Texfeld steiht,</strong> dat weed üvvernomme un avjespeichert, wann De „<b\nstyle=\"padding:2px; background-color:#ddd; color:black\">$1</b>“ kleks. Bes dohin kanns De esu öff wi De wells op „<b style=\"padding:2px; background-color:#ddd; color:black\">{{int:showdiff}}</b>“ un „<b\nstyle=\"padding:2px; background-color:#ddd; color:black\">{{int:showpreview}}</b>“ klicke, öm ze pröfe, watte ald   jods jemaat häs.\n\nAlles Klor?<br /><br />",
        "yourtext": "Dinge Tex",
        "storedversion": "De jespeicherte Väsjohn",
        "nonunicodebrowser": "<strong>Opjepaß:</strong>\nDinge Brauser kann nit öhntlesch met däm <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> un singe Bochstahbe ömjonn.\nBes esu johd un nemm ene andere Brauser för heh di Sigg!",
        "right-editsemiprotected": "Sigge met däm Schoz „{{int:protect-level-autoconfirmed}}“ ändere",
        "right-editcontentmodel": "et Modäll vum Ennhald vun Sigge verändere",
        "right-editinterface": "Sigge met de Täxte änndere, di et Wikki kallt",
-       "right-editusercssjs": "Anderlücks CSS- un JS-Dateie ändere",
        "right-editusercss": "Anderlücks CSS-Dateie ändere",
        "right-edituserjs": "Anderlücks JS-Dateie ändere",
        "right-editmyusercss": "De eije <i lang=\"en\" xml:lang=\"en\">CSS</i> Datteije aanlääje un ändere",
        "undeleteviewlink": "aanloore",
        "undeleteinvert": "De Ußwahl ömdrihje",
        "undeletecomment": "Jrond (för en et Logbohch):",
-       "undeletedrevisions": "{{PLURAL:$1|ein Version|$1 Versione}} zeröckjehollt",
-       "undeletedrevisions-files": "Zesammejenomme {{PLURAL:$1|Ein Version|<strong>$1</strong> Versione|<strong>Kein</strong> Version}} vun {{PLURAL:$2|eine Datei|<strong>$2</strong> Dateie|<strong>nix</strong>}} zeröckjehollt",
-       "undeletedfiles": "{{PLURAL:$1|Ein Datei|<strong>$1</strong> Dateie|<strong>Kein</strong> Dateie}} zeröckjehollt",
        "cannotundelete": "<strong>Dä.</strong> Et Zeröckholle jing donävve.\n\n$1",
        "undeletedpage": "<strong>De Sigg „$1“ es jetz widder do</strong>\nLuur Der et [[Special:Log/delete|Logbohch met de fottjeschmeße Sigge]] aan, do häs De de Neuste fottjeschmeße un widder herjehollte Sigge.",
        "undelete-header": "Loor Der [[Special:Log/delete|{{LCFIRST:{{int:deletionlog}}}}]] aan, doh fengks De de och neulesch fottjeschmesße Sigge.",
        "logentry-tag-update-revision": "{{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} „$1“ hät {{PLURAL:$7|di Makkehrong|di Makkehronge|nix}} $6 för de Väsjohn $4 em Logbohch vun dä Sigg „$3“ verjovve un {{PLURAL:$9|di Makkehrong|de Makkehronge|nix}} $8 fott jenumme.",
        "logentry-tag-update-logentry": "{{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} „$1“ hädd em Endraaach $5 em Logbohch vun dä Sigg „$3“{{PLURAL:$7|di Makkehrong|di Makkehronge|nix}} $6 derbei jedonn un {{PLURAL:$9|di Makkehrong|di Makehronge|nix}} $8 fott jenumme.",
        "rightsnone": "(nix)",
-       "revdelete-summary": "dä Täx en „{{int:summary}}“",
        "feedback-adding": "Ben di Röckmäldong op di Sigg aam donn&nbsp;…",
        "feedback-back": "Retuhr",
        "feedback-bugcheck": "Joot. Donn op jeede Vall nohlooer, dat dat bes jäz noch nit [$1 bikannt wohr].",
index 2180402..63b2c75 100644 (file)
        "externaldberror": "Çewtiyeke bingeha daneyan heye, an jî destûra te ya rojanekirina hesabê xweyê navxweyî nîne.",
        "login": "Têkeve",
        "nav-login-createaccount": "Têkeve / hesabekî nû çêke",
-       "userlogin": "Têkeve / hesabekî nû çêke",
-       "userloginnocreate": "Têkeve",
        "logout": "Derkeve",
        "userlogout": "Derkeve",
        "notloggedin": "Têneketî",
        "userlogin-noaccount": "Hesabekî te nîne?",
        "userlogin-joinproject": "Tevlî {{SITENAME}} bibe",
-       "nologin": "Hesabê te nîne? $1.",
-       "nologinlink": "Bibe endam",
        "createaccount": "Hesabê nû çêke",
-       "gotaccount": "Hesabê te heye? $1.",
-       "gotaccountlink": "Têkeve",
-       "userlogin-resetlink": "Te agahiyên hesabê xwe ji bîr kirin?",
        "userlogin-resetpassword-link": "Te şîfreya xwe ji bîr kir?",
        "userlogin-helplink2": "Alîkariya têketinê",
        "userlogin-createanother": "Hesabekî din çêke",
        "createacct-another-email-ph": "E-nameya xwe binivîse",
        "createaccountmail": "Şîfreyeke demkî bikar bîne û wê ji navnîşana hatiye diyarkirin re bişîne.",
        "createacct-realname": "Navê te ya rast (Ko tu bixwazi bikeve, pêdivî nîne)",
-       "createaccountreason": "Sedem:",
        "createacct-reason": "Sedem",
        "createacct-reason-ph": "Çima hesabekî din çêdikî",
        "createacct-submit": "Hesabê xwe biafirîne",
        "anonpreviewwarning": "''Tu ne têketî yî. Tomarkirin wê navnîşana IP'ya te di dîroka guhertinan de nîşan bide.''",
        "missingsummary": "<span style=\"color:#990000;\">'''Zanibe:'''</span> Te nivîsekî kurt ji bo guherandinê ra nenivîsand. Eger tu niha carekî din li Tomar xê, guherandinê te vê nivîsekî kurt yê were tomarkirin.",
        "missingcommenttext": "Ji kerema xwe kurteya naverokê li jêr binivisîne.",
-       "missingcommentheader": "<strong>Zanibe:</strong> Te sernav/mijarek nenivîsandîye. Heke tu niha carekî din li ser \"{{int:savearticle}}\" bitikînî, ev guherandina te bê sernav/mijar wê were tomarkirin.",
+       "missingcommentheader": "<strong>Zanibe:</strong> Te sernav/mijarek nenivîsandîye. Heke tu niha carekî din li ser \"$1\" bitikînî, ev guherandina te bê sernav/mijar wê were tomarkirin.",
        "summary-preview": "Pêşdîtina kurtenivîsê:",
        "subject-preview": "Pêşdîtina sernivîsê:",
        "previewerrortext": "Wextê pêşdîtina guhertinên te, pirsgirekek derket.",
        "rcshowhidecategorization": "Kategorîzekirina rûpelan $1",
        "rcshowhidecategorization-show": "nîşan bide",
        "rcshowhidecategorization-hide": "veşêre",
-       "rclinks": "$1 guherandinên di $2 rojên dawî de nîşan bide<br />$3",
+       "rclinks": "$1 guherandinên di $2 rojên dawî de nîşan bide",
        "diff": "cudahî",
        "hist": "dîrok",
        "hide": "veşêre",
        "cantrollback": "Guherto naye vegerandin;\nbikarhênerê dawî, tenya nivîskarê vê rûpelê ye.",
        "alreadyrolled": "Guherandina dawiya [[$1]]\nbi [[User:$2|$2]] ([[User talk:$2|gotûbêj]]) venizivre; kesekî din ew rûpel zîvirandiye an guherandiye.\n\nGuhertoya dawî bi [[User:$3|$3]] ([[User talk:$3|gotûbêj]]).",
        "editcomment": "Kurtenivîsê guherandinê ev bû: <em>$1</em>.",
-       "revertpage": "Guherandina $2 hat betal kirin, vegerand guhartoya dawî ya $1",
+       "revertpage": "Guherandina [[Special:Contributions/$2|$2]] ([[User talk:$2|gotûbêj]]) hat betal kirin, vegerand guhartoya dawî ya [[User:$1|$1]]",
        "rollback-success": "Guherandina $1 şondakir; dîsa guharte verzyona $2.",
        "changecontentmodel-title-label": "Sernavê rûpelê",
        "changecontentmodel-reason-label": "Sedem:",
        "undeleteviewlink": "bibîne",
        "undeleteinvert": "Hilbijartinê şûnde vegerîne",
        "undeletecomment": "Sedem:",
-       "undeletedrevisions": "{{PLURAL:$1|Versiyonek dîsa hate|$1 versiyon dîsa hatin}} çêkirin",
-       "undeletedrevisions-files": "{{PLURAL:$1|Versiyonek|$1 versiyon}} û {{PLURAL:$2|medyayek hate|$2 medya hatin}} çêkirin",
-       "undeletedfiles": "{{PLURAL:$1|Medyayek hate|$1 medya hatin}} çêkirin",
        "undeletedpage": "'''$1 dîsa hate çêkirin'''\n\nJi bo jêbirinan û çêkirinên nû, ji kerema xwe li [[{{ns:special}}:Log/delete|Jêbirina têketinê]] binêre.",
        "undelete-header": "Ji bo rûpelên dawî hatine jêbirin, li [[Special:Log/delete|Jêbirina têketinê]] binêre.",
        "undelete-search-title": "Li rûpelên jêbirî bigere",
        "bydate": "li gor dîrokê",
        "sp-newimages-showfrom": "Daneyên nû ji dema $1, saet $2 ve bibîne",
        "seconds-abbrev": "$1 s",
+       "minutes-abbrev": "$1 d",
        "hours-abbrev": "$1 st",
        "days-abbrev": "$1 r",
        "seconds": "{{PLURAL:$1|$1 saniye}}",
        "logentry-newusers-create": "Hesabe bikarhêneriyê $1 {{GENDER:$2|hate çêkirin}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|hate barkirin}} $3",
        "rightsnone": "(tune)",
-       "revdelete-summary": "kurteyê biguherîne",
        "feedback-back": "Paşve",
        "feedback-cancel": "Betal bike",
        "feedback-close": "Çêbû",
index e4f1e44..0df1daf 100644 (file)
        "password-change-forbidden": "Ny yllir chanjya geryow tremena war an wiki-ma.",
        "login": "Omgelmi",
        "nav-login-createaccount": "Omgelmi / Gwruthyl akont nowyth",
-       "userlogin": "Omgelmi / gwruthyl akont nowyth",
-       "userloginnocreate": "Omgelmi",
        "logout": "Digelmi",
        "userlogout": "Digelmi",
        "notloggedin": "Digelmys",
        "userlogin-noaccount": "A nyns eus akont dhywgh?",
        "userlogin-joinproject": "Junya {{SITENAME}}",
-       "nologin": "A ny'gas beus akont? '''$1'''.",
-       "nologinlink": "Gwruthyl akont",
        "createaccount": "Gwruthyl akont nowydh",
-       "gotaccount": "Eus akont dhywgh seulabrys? '''$1'''.",
-       "gotaccountlink": "Omgelmi",
-       "userlogin-resetlink": "A ankevsowgh hwi agas manylyon omgelmi?",
        "userlogin-resetpassword-link": "Ankevys agas ger tremena genowgh?",
        "userlogin-helplink2": "Gweres owth omgelmi",
        "createacct-emailrequired": "Trigva ebost",
        "createacct-email-ph": "Entrewgh agas trigva ebost",
        "createaccountmail": "Devnydhya ger tremena chonsus anbarthus hag y dhanvon dhe'n drigva ebost res a-woles",
        "createacct-realname": "Hanow gwir (a-dhewis)",
-       "createaccountreason": "Acheson:",
        "createacct-reason": "Acheson",
        "createacct-reason-ph": "Prag yth esowgh ow kwruthyl akont aral",
        "createacct-submit": "Gwruthyl agas akont",
        "saveprefs": "Gwitha",
        "restoreprefs": "Restorya pub settyans defowt",
        "prefs-editing": "Chanjya",
-       "rows": "Rewyow:",
-       "columns": "Kolovennow:",
        "searchresultshead": "Hwilas",
        "savedprefs": "Gwithys re beu agas dewisyansow.",
        "servertime": "Eur an servyer:",
        "rcshowhideanons-hide": "Kudha",
        "rcshowhidemine": "$1 ow chanjyow",
        "rcshowhidemine-hide": "Kudha",
-       "rclinks": "Diskwedhes an $1 chanj diwettha gwrys y'n $2 dydh diwettha<br />$3",
+       "rclinks": "Diskwedhes an $1 chanj diwettha gwrys y'n $2 dydh diwettha",
        "diff": "dyffrans",
        "hist": "istori",
        "hide": "Kudha",
index 8b2d94f..0ac245d 100644 (file)
@@ -16,7 +16,8 @@
                        "Askar Nazyrov",
                        "Macofe",
                        "Janatkg",
-                       "Irus"
+                       "Irus",
+                       "Mouse21"
                ]
        },
        "tog-underline": "Шилтемелердин алдын сызуу:",
        "externaldberror": "Маалымат базасында ката кетти же сизге сырткы эсебиңизди жаңыртууга уруксат берилген эмес.",
        "login": "Кирүү",
        "nav-login-createaccount": "Кирүү / Катталуу",
-       "userlogin": "Кирүү / Катталуу",
-       "userloginnocreate": "Кирүү",
        "logout": "Чыгуу",
        "userlogout": "Чыгуу",
        "notloggedin": "Сиз системге кире элексиз",
        "userlogin-noaccount": "Эсеп жазууңуз жокпу?",
        "userlogin-joinproject": " {{SITENAME}} кошулуңуз",
-       "nologin": "Катталган эмессизби? $1.",
-       "nologinlink": "Катталуу",
        "createaccount": "Катталуу",
-       "gotaccount": "Катталгансызбы? '''$1'''.",
-       "gotaccountlink": "Кирүү",
-       "userlogin-resetlink": "Кирүүчү маалыматарыңызды эсиңизден чыгардыңызбы?",
        "userlogin-resetpassword-link": "Сырсөздү унуттуңузбу?",
        "userlogin-loggedin": "Сиз эчак эле {{GENDER:$1|$1}} деп киргенсиз.\nБашка колдонуучунун атынан кириш үчүн асытдагы форманы колдонуңуз.",
        "createacct-emailrequired": "Эмейл дарек",
        "createacct-another-email-ph": "E-mail дарек териңиз",
        "createaccountmail": "Убактылуу түзүлгөн сырсөздү колдон жана аны көрсөтүлгөн эмейл дарекке жөнөт",
        "createacct-realname": "Чыныгы ысымы (милдеттүү эмес)",
-       "createaccountreason": "Себеби:",
        "createacct-reason": "Себеп",
        "createacct-reason-ph": "Эмне үчүн башка эсеп жазуу түзүп жатасыз",
        "createacct-submit": "Катталыңыз",
        "passwordreset-disabled": "Бул уикиде сырсөздү түшүрүү мүмкүнчүлүгү өчүрүлгөн.",
        "passwordreset-username": "Колдонуучу аты:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Чыккан катты көрүү?",
        "passwordreset-email": "E-mail дарек:",
        "passwordreset-emailtitle": "{{SITENAME}} сайтындагы эсеп жазуусу жөнүндөгү маалымат",
        "passwordreset-emailelement": "Колдонуучу аты: \n$1\n\nУбактылуу сырсөз: \n$2",
        "post-expand-template-argument-warning": "'''Эскертүү:''' Бул барак, жок дегенде, абдан чоң көлөмдүү калыптын бир жүйөсүн камтыйт жана  жайылганда өлчөмү абдан чоң болуп кетет. \nУшул сыяктуу жүйөлөр аттатылды.",
        "post-expand-template-argument-category": "Калыптардын аттатылган жүйөлөрүн камтыган барактар",
        "parser-template-loop-warning": "Калыптарда илмек бар:[[$1]]",
+       "undo-summary": "Кайра $1 жокко [[Special:Contributions/$2|$2]] ([[User talk:$2|сюзюу]])",
        "viewpagelogs": "Бул барактын журналдарын көрүү",
        "nohistory": "Бул барактын өзгөртүүлөр тарыхы жок",
        "currentrev": "Соңку версиясы",
        "saveprefs": "Сактоо",
        "restoreprefs": "Жарыяланбасча ырастоолорду калыбына келтирүү",
        "prefs-editing": "Оңдоп-түзөө",
-       "rows": "Сап:",
-       "columns": "Тилке:",
        "searchresultshead": "Издөө",
        "stub-threshold-disabled": "Өчүрүлгөн",
        "recentchangesdays-max": "Эң көп $1 {{PLURAL:$1|күн}}",
        "rcshowhidemine": "Оңдоолорумду $1",
        "rcshowhidemine-show": "Көрсөтүү",
        "rcshowhidemine-hide": "Жашыруу",
-       "rclinks": "Соңку $2 күндө жасалган акыркы $1 өзгөртүүлөрдү көрсөтүү<br />$3",
+       "rclinks": "Соңку $2 күндө жасалган акыркы $1 өзгөртүүлөрдү көрсөтүү",
        "diff": "айырма",
        "hist": "тарыхы",
        "hide": "Жашыруу",
        "searchsuggest-search": "Издөө",
        "searchsuggest-containing": "кармагандар...",
        "api-error-badtoken": "Ички ката: анык эмес токен.",
-       "api-error-file-too-large": "Сиз жөнөткөн файл өтө чоң.",
-       "api-error-filename-tooshort": "Файл аты өтө кыска.",
-       "api-error-filetype-banned": "Бул файл түрүнө тыюу салынган.",
-       "api-error-illegal-filename": "Жарабай турган файл аты.",
-       "api-error-unclassified": "Белгисиз ката пайда болду.",
-       "api-error-unknown-code": "Белгисиз ката: \"$1\".",
        "api-error-unknown-warning": "Белгисиз эскертүү: \"$1\".",
        "api-error-unknownerror": "Белгисиз ката: «$1».",
-       "api-error-uploaddisabled": "Бул уикиде файлдарды жүктөө мүмкүнчүлүгү өчүрүлгөн.",
        "duration-seconds": "$1 {{PLURAL:$1|секунда}}",
        "duration-minutes": "$1 {{PLURAL:$1|мүнөт}}",
        "duration-hours": "$1 {{PLURAL:$1|саат}}",
index 171a911..0c52fb4 100644 (file)
        "yourdomainname": "Regnum tuum:",
        "login": "Nomen dare",
        "nav-login-createaccount": "Nomen dare / Nomen sibi imponere",
-       "userlogin": "Nomen dare / Nomen sibi imponere",
-       "userloginnocreate": "Nomen dare",
        "logout": "Secedere",
        "userlogout": "Secedere",
        "notloggedin": "Nomen nondum datum est",
        "userlogin-noaccount": "Num nomine cares?",
-       "nologin": "Num nomine cares? $1.",
-       "nologinlink": "Eam crea",
        "createaccount": "Sibi nomen imponere",
-       "gotaccount": "Iamne tibi nomen est? $1.",
-       "gotaccountlink": "Nomen da",
-       "userlogin-resetlink": "Num tesserae tuae oblitus es?",
        "userlogin-resetpassword-link": "Num tesserae oblitus es?",
        "userlogin-helplink2": "auxilium dandi nominis",
        "createacct-emailrequired": "Inscriptio electronica",
        "createacct-another-email-ph": "Inscriptionem electronicam inscribe",
        "createaccountmail": "Use a temporary random password and send it to the specified email address",
        "createacct-realname": "Nomen rectum (non necesse)",
-       "createaccountreason": "Causa:",
        "createacct-reason": "Causa",
        "createacct-reason-ph": "Cur aliud nomen imponas",
        "createacct-submit": "Nomen tibi impone",
        "editingsection": "Recensens $1 (partem)",
        "editingcomment": "Recensens $1 (nova pars)",
        "editconflict": "Contentio recensionis: $1",
-       "explainconflict": "Alius hanc paginam mutavit postquam eadem recensere incipiebas.\nCapsa superior paginae verba recentissima continet.\nMutationes tuae in capsa inferiore monstrantur.\nMutationes tuae in verba superiora adiungare debes.\n'''Solum''' verba capsae superioris servabuntur quando \"{{int:savearticle}}\" premes.",
+       "explainconflict": "Alius hanc paginam mutavit postquam eadem recensere incipiebas.\nCapsa superior paginae verba recentissima continet.\nMutationes tuae in capsa inferiore monstrantur.\nMutationes tuae in verba superiora adiungare debes.\n'''Solum''' verba capsae superioris servabuntur quando \"$1\" premes.",
        "yourtext": "Tua redactio",
        "storedversion": "Redactio modo servata",
        "nonunicodebrowser": "'''CAVETO: Navigatorium retiale tuum systemati UNICODE morem non gerit. Modum habemus quo commentationes sine damno recenseas: litterae non-ASCII in capsa sub veste hexadecimali ostendentur.'''",
        "saveprefs": "Hos modos servare",
        "restoreprefs": "Omnes (diversi) modi in integrum restituantur",
        "prefs-editing": "Recensere",
-       "rows": "Lineae:",
-       "columns": "Columnae:",
        "searchresultshead": "Figuratio eventorum investigationis",
        "recentchangesdays": "Quot dies index respiciat:",
        "recentchangesdays-max": "$1 maxime {{PLURAL:$1|diem|dies}}",
        "right-hideuser": "Celare nomen usoris hunc usorem obstruendo",
        "right-protect": "Protectionem mutare vel paginas protectas recensere",
        "right-editprotected": "Paginas protectas recensere (sine protectione defluente quasi cataracta)",
-       "right-editusercssjs": "Paginas CSS vel JS aliorum usorum recensere",
        "right-editusercss": "Paginas CSS aliorum usorum recensere",
        "right-edituserjs": "Paginas JS aliorum usorum recensere",
        "right-rollback": "Cito reverti recensiones proximas usoris cuiuslibet paginae",
        "rcshowhidecategorization": "$1 classificationes",
        "rcshowhidecategorization-show": "Ostendere",
        "rcshowhidecategorization-hide": "Supprimere",
-       "rclinks": "Monstrare $1 nuperrime mutata in $2 diebus proximis.<br />$3",
+       "rclinks": "Monstrare $1 nuperrime mutata in $2 diebus proximis.",
        "diff": "diff",
        "hist": "hist",
        "hide": "celare",
        "undeleteviewlink": "inspicere",
        "undeleteinvert": "Selectionem invertere",
        "undeletecomment": "Causa:",
-       "undeletedrevisions": "{{PLURAL:$1|1 redactio restituta est|$1 redactiones restitutae sunt}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 redactio restituta est|$1 redactiones restitutae sunt}} et {{PLURAL:1 fasciculus restitutus est|$2 fasciculi restituti sunt}}",
-       "undeletedfiles": "{{PLURAL:$1|1 fasciculus restitutus est|$1 fasciculi restituti sunt}}",
        "cannotundelete": "Abrogatio deletionis fefellit; fortasse aliquis iam paginam restituit.",
        "undelete-header": "Pro paginis nuper deletis, vide [[Special:Log/delete|indicem deletionum]].",
        "undelete-search-box": "Quaerere inter paginas iam deletas",
        "logentry-newusers-autocreate": "Usori $1 nomen automatice impositum est",
        "logentry-protect-protect": "$1 {{GENDER:$2|protegit}} $3 $4",
        "rightsnone": "(nullus)",
-       "revdelete-summary": "summarium recensionis",
        "feedback-cancel": "Dimittere",
        "feedback-close": "Factum",
        "feedback-error2": "Error: Recensio non additur",
        "feedback-message": "Nuntius:",
        "searchsuggest-search": "Quaerere apud {{grammar:accusative|{{SITENAME}}}}",
        "searchsuggest-containing": "continens...",
-       "api-error-empty-file": "Fasciculus inmissus vacuus est.",
        "api-error-emptypage": "Vacuas novas paginas creare non licet.",
-       "api-error-filename-tooshort": "Nomen fasciculi brevius est.",
-       "api-error-filetype-banned": "Talia genera fasciculorum permissa non sunt.",
-       "api-error-illegal-filename": "Nomen fasciculi permissum non est.",
-       "api-error-mustbeloggedin": "Ad fasciculos deferendos nomen des necesse est.",
        "api-error-unknownerror": "Error incognitus: \"$1\".",
        "expandtemplates": "Formulas resolvere",
        "special-characters-group-latin": "Latinum",
index db6cd9f..bb39b02 100644 (file)
        "password-change-forbidden": "No se puede kambiar contrasenyas en este viki.",
        "login": "Entrar",
        "nav-login-createaccount": "Entrar / criar un cuento",
-       "userlogin": "Entrar / Criar cuento",
        "logout": "Salir",
        "userlogout": "Salir",
        "userlogin-noaccount": "No tiene un kuento?",
        "userlogin-joinproject": "Abonar {{SITENAME}}",
-       "nologin": "¿No tienes un cuento? '''$1'''.",
-       "nologinlink": "Criar un kuento",
        "createaccount": "Criar un cuento",
-       "gotaccount": "¿Ya tienes un cuento? '''$1'''.",
-       "gotaccountlink": "Entrar",
-       "userlogin-resetlink": "Olvidates tus detalyos de akseso?",
        "userlogin-resetpassword-link": "Olvidaste tu kontrasenya?",
        "userlogin-createanother": "Krear otro kuento",
        "createacct-emailrequired": "Adreso de korreo elektroniko",
        "createacct-another-email-ph": "Eskrive el adreso de korreo elektronico",
        "createaccountmail": "Uzar una contrasenya temporal y embiarla al korreo elektronico espesificado",
        "createacct-realname": "Nombre verdadero (opsyonal)",
-       "createaccountreason": "Razon:",
        "createacct-reason": "Razon",
        "createacct-submit": "Krear tu cuento",
        "createacct-another-submit": "Krear otro kuento",
        "rcshowhideanons": "$1 usadores anónimos",
        "rcshowhidepatr": "$1 trocamientos akavidados",
        "rcshowhidemine": "$1 mis trocamientos",
-       "rclinks": "Ver los $1 trocamientos dalcavo en los $2 días dalcavo<br />$3",
+       "rclinks": "Ver los $1 trocamientos dalcavo en los $2 días dalcavo",
        "diff": "dif",
        "hist": "ist",
        "hide": "Esconder",
index d54297a..dc6d7c2 100644 (file)
        "login": "Aloggen",
        "login-security": "Iwwerpréift Är Idnetitéit",
        "nav-login-createaccount": "Aloggen / Benotzerkont uleeën",
-       "userlogin": "Aloggen / Benotzerkont uleeën",
-       "userloginnocreate": "Umellen",
        "logout": "Ofmellen",
        "userlogout": "Ausloggen",
        "notloggedin": "Net ageloggt",
        "userlogin-noaccount": "Hutt Dir kee Benotzerkont?",
        "userlogin-joinproject": "Maacht mat bei {{SITENAME}}",
-       "nologin": "Hutt Dir kee Benotzerkont? $1.",
-       "nologinlink": "Neie Benotzerkont maachen",
        "createaccount": "Neie Kont opmaachen",
-       "gotaccount": "Dir hutt schonn e Benotzerkont? '''$1'''.",
-       "gotaccountlink": "Umellen",
-       "userlogin-resetlink": "Hutt Dir d'Detailer vun Ärem Login vergiess?",
        "userlogin-resetpassword-link": "Hutt Dir Äert Passwuert vergiess?",
        "userlogin-helplink2": "Hëllef beim Aloggen",
        "userlogin-loggedin": "Dir sidd schonn als {{GENDER:$1|$1}} ageloggt.\nBenotzt de Formulaire hei drënner fir Iech als een anere Benotzer anzeloggen.",
        "createaccountmail": "En temporäert zoufällegt Passwuert benotzen an et per E-Mail un déi spezifizéiert E-Mailadress schécken",
        "createaccountmail-help": "Ka benotzt gi fir e Benotzerkont fir eng aner Persoun unzeleeën ouni d'Passwuert gewuer ze ginn.",
        "createacct-realname": "Richtegen Numm (fakultativ)",
-       "createaccountreason": "Grond:",
        "createacct-reason": "Grond",
        "createacct-reason-ph": "Fir wat Dir een anere Benotzerkonnt uleet",
        "createacct-reason-help": "Message deen am Logbuch vun den ugeluechte Benotzerkonte gewise gëtt",
        "preview": "Kucken ouni ofzespäicheren",
        "showpreview": "Kucken ouni ofzespäicheren",
        "showdiff": "Ännerunge weisen",
-       "blankarticle": "<strong>Opgepasst:</strong> D'Säit déi Dir uleet ass eidel.\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Säit ugeluecht.",
+       "blankarticle": "<strong>Opgepasst:</strong> D'Säit déi Dir uleet ass eidel.\nWann Dir nach eng Kéier op \"$1\" klickt, da gëtt d'Säit ugeluecht.",
        "anoneditwarning": "<strong>Opgepasst:</strong> Dir sidd net ageloggt. Dowéinst gëtt amplaz vun engem Benotzernumm Är IP Adress ëffentlech gewise wann Dir Ännerunge maacht. Wann Dir <strong>[$1 Iech aloggt]</strong> oder <strong>[$2 e Benotzerkont opmaachen]</strong>, Är Ännerunge ginn dann Ärem Benotzerkont zougedeelt, genee wéi aner Avantagen.",
        "anonpreviewwarning": "''Dir sidd net ageloggt. Wann Dir ofspäichert gëtt Är IP-Adress an der Lëscht vun de Versioune vun dëser Säit enregistréiert.''",
-       "missingsummary": "'''Erënnerung:''' Dir hutt kee Resumé aginn.\nWann Dir nacheemol op \"{{int:savearticle}}\" klickt, gëtt Är Ännerung ouni Resumé ofgespäichert.",
-       "selfredirect": "<strong>Opgepasst:</strong> Dir maacht eng Viruleedung vun dëser Aäit op sech selwer.\n\nEt ka sinn datt Dir déi falsch Zilsäit fir d'Viruleedung aginn hutt oder datt Dir déi falsch Säit ännert.\n\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Viruleedung trotzdem ugeluecht.",
+       "missingsummary": "'''Erënnerung:''' Dir hutt kee Resumé aginn.\nWann Dir nacheemol op \"$1\" klickt, gëtt Är Ännerung ouni Resumé ofgespäichert.",
+       "selfredirect": "<strong>Opgepasst:</strong> Dir maacht eng Viruleedung vun dëser Säit op sech selwer.\n\nEt ka sinn datt Dir déi falsch Zilsäit fir d'Viruleedung aginn hutt oder datt Dir déi falsch Säit ännert.\n\nWann Dir nach eng Kéier op \"$1\" klickt, da gëtt d'Viruleedung trotzdem ugeluecht.",
        "missingcommenttext": "Gitt w.e.g. eng Bemierkung an.",
-       "missingcommentheader": "<strong>Denkt drun:</strong> Dir hutt kee Sujet fir dës Bemierkung aginn.\nWann Dir nach en Kéier op \"{{int:savearticle}}\" klickt da gëtt Är Ännerung ouni Titel gespäichert.",
+       "missingcommentheader": "<strong>Denkt drun:</strong> Dir hutt kee Sujet fir dës Bemierkung aginn.\nWann Dir nach en Kéier op \"$1\" klickt da gëtt Är Ännerung ouni Titel gespäichert.",
        "summary-preview": "Resumé vun der Ännerung kucken ouni ze späicheren:",
        "subject-preview": "Sujet kucken ouni ze späicheren:",
        "previewerrortext": "Beim Versuch fir Är Ännerungen ze weisen, ass e Feeler geschitt.",
        "editingsection": "Ännere vu(n) $1 (Abschnitt)",
        "editingcomment": "Ännere vu(n) $1 (neien Abschnitt)",
        "editconflict": "Ännerungskonflikt: $1",
-       "explainconflict": "En anere Benotzer huet un dëser Säit geschafft, während Dir am Gaang waart, se z'änneren.\nDat iewescht Textfeld weist Iech den aktuellen Text.\nÄr Ännerunge gesitt Dir am ënneschten Textfeld.\nDir musst Är Ännerungen an dat iewescht Textfeld androen.\n'''Nëmmen''' den Text aus dem ieweschten Textfeld gëtt gehale wann Dir op \"{{int:savearticle}}\" klickt.",
+       "explainconflict": "En anere Benotzer huet un dëser Säit geschafft, während Dir am Gaang waart, se z'änneren.\nDat iewescht Textfeld weist Iech den aktuellen Text.\nÄr Ännerunge gesitt Dir am ënneschten Textfeld.\nDir musst Är Ännerungen an dat iewescht Textfeld androen.\n'''Nëmmen''' den Text aus dem ieweschten Textfeld gëtt gehale wann Dir op \"$1\" klickt.",
        "yourtext": "Ären Text",
        "storedversion": "Gespäichert Versioun",
        "nonunicodebrowser": "'''OPGEPASST: Äre Browser ass net Unicode kompatibel.'''\nE 'workaround' gëtt agesat deen et erlaabt Säite sécher z'änneren: Net-ASCII Zeeche ginn an der Ännerungskëscht als hexadezimal-Code gewisen.",
        "readonlywarning": "<strong>OPGEPASST: D'Datebank gouf wéinst Maintenanceaarbechte gespaart, dofir kënnt Dir Är Ännerungen den Ament net ofspäicheren.</strong>\nDir kënnt den Text kopéieren an an een Textfichier drasetzen an deen ofspäicheren fir méi spéit.\n\nDe System-Administrateur deen d'Datebank gespaart huet, huet dës Erklärung ginn: $1",
        "protectedpagewarning": "'''OPGEPASST: Dës Säit gouf gespaart a kann nëmme vun engem Administrateur geännert ginn.''' Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
        "semiprotectedpagewarning": "'''Bemierkung:''' Dës Säit gouf sou gespaart, datt nëmme ugemellt Benotzer s'ännere kënnen. Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
-       "cascadeprotectedwarning": "<strong>Opgepasst:</strong> Dës Säit gouf gespaart a kann nëmme vu Benotzer mat Administrateursrechter geännert ginn. Si ass an dës {{PLURAL:$1|Säit|Säiten}} agebonnen, déi duerch Cascadespäroptioun gespaart {{PLURAL:$1|ass|sinn}}:'''",
+       "cascadeprotectedwarning": "<strong>Opgepasst:</strong> Dës Säit gouf gespaart a kann nëmme vu Benotzer mat [[Special:ListGroupRights|spezifische Rechter]] geännert ginn. Si ass an dës {{PLURAL:$1|Säit|Säiten}} agebonnen, déi duerch Cascadespäroptioun gespaart {{PLURAL:$1|ass|sinn}}:'''",
        "titleprotectedwarning": "'''OPGEPASST: Dës Säit gouf gespaart sou datt [[Special:ListGroupRights|spezifesch Rechter]] gebraucht gi fir se uleeën ze kënnen.''' Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
        "templatesused": "{{PLURAL:$1|Schabloun|Schablounen}} déi op dëser Säit am Gebrauch sinn:",
        "templatesusedpreview": "{{PLURAL:$1|Schabloun|Schablounen}} déi an dëser nach net gespäicherter Versioun benotzt {{PLURAL:$1|gëtt|ginn}}:",
        "templatesusedsection": "{{PLURAL:$1|Schabloun|Schablounen}} déi an dësem Abschnitt benotzt {{PLURAL:$1|gëtt|ginn}}:",
        "template-protected": "(gespaart)",
-       "template-semiprotected": "(gespaart fir net-ugemellten an nei Benotzer)",
+       "template-semiprotected": "(gespaart fir net-ugemellt an nei Benotzer)",
        "hiddencategories": "Dës Säit gehéiert zu {{PLURAL:$1|1 verstoppter Kategorie|$1 verstoppte Kategorien}}:",
        "edittools": "<!-- Dësen Text gëtt ënner dem \"Ännere\"-Formulaire souwéi dem \"Eropluede\"-Formulaire ugewisen. -->",
        "nocreatetext": "Op {{SITENAME}} gouf d'Schafe vun neie Säite limitéiert. Dir kënnt Säiten déi scho bestinn änneren oder Iech [[Special:UserLogin|aloggen oder e Benotzerkont opmaachen]].",
        "post-expand-template-argument-warning": "'''Warnung: Op dëser Säit ass mindestens een Argument an enger Schabloun dat eng ze grouss Expansiounsgréisst huet. Dës Argumenter goufen ewechgelooss.",
        "post-expand-template-argument-category": "Säiten, op dene mindestens e Parameter vun enger Schabloun vergiess ginn ass",
        "parser-template-loop-warning": "Endlos Schleef an der Schabloun: [[$1]] entdeckt",
+       "template-loop-category": "Säite mat Endlos-Schleefe vu Schablounen",
        "parser-template-recursion-depth-warning": "D'Limit vun der Zuel vun de Verschachtelunge vu Schabloune gouf iwwerschratt ($1)",
        "language-converter-depth-warning": "D'Limite vun der déift vun der Sproochëmwandlung gouf iwwerschratt ($1)",
        "node-count-exceeded-category-desc": "D'Säit huet méi wéi déi maximal Zuel vu Kniet (Node-count).",
        "page_first": "éischt",
        "page_last": "lescht",
        "histlegend": "Fir d'Ännerungen unzeweisen: Klickt déi zwou Versiounen un, déi solle verglach ginn.<br />\n*(aktuell) = Ënnerscheed mat der aktueller Versioun,\n*(lescht) = Ënnerscheed mat der aler Versioun,\n*k = Kleng Ännerung.",
-       "history-fieldset-title": "An de Versioune sichen",
-       "history-show-deleted": "nëmmen déi geläscht",
+       "history-fieldset-title": "No Versioune sichen",
+       "history-show-deleted": "Nëmme geläscht Versiounen",
        "histfirst": "eelst",
        "histlast": "neist",
        "historysize": "({{PLURAL:$1|1 Byte|$1 Byten}})",
        "search-file-match": "(Inhalt vum Fichier passt)",
        "search-suggest": "Mengt Dir: $1",
        "search-rewritten": "D'Resultater fir $1 gi gewisen. Amplaz no $2 sichen.",
-       "search-interwiki-caption": "Schwësterprojeten",
+       "search-interwiki-caption": "Resultater vu Schwësterprojeten",
        "search-interwiki-default": "Resultater vu(n) $1:",
        "search-interwiki-more": "(méi)",
        "search-interwiki-more-results": "méi Resultater",
        "prefs-help-prefershttps": "Dës Astellung gëtt déi nächste Kéier wierksam wou Dir Iech ageloggt.",
        "prefswarning-warning": "Dir hutt Ännerunge vun Ären Astellunge gemaach, déi nach net gespäichert goufen.\n\nWann Dir vun dëser Säit erof gitt ouni op \"$1\" ze klicken, da ginn Är Astellungen net aktualiséiert.",
        "prefs-tabs-navigation-hint": "Tipp: Dir kënnt d'Feiler no lénks an no riets benotze fir tëscht den Tabs an der Lëscht vun den Tabs ze navigéieren.",
-       "userrights": "Benotzerrechterverwaltung",
+       "userrights": "Benotzerrechter",
        "userrights-lookup-user": "E Benotzer eraussichen",
        "userrights-user-editname": "Benotzernumm uginn:",
        "editusergroup": "Benotzergruppe lueden",
        "saveusergroups": "{{GENDER:$1|Benotzer}}gruppe späicheren",
        "userrights-groupsmember": "Member vun:",
        "userrights-groupsmember-auto": "Implizit Member vun:",
-       "userrights-groups-help": "Dir kënnt d'Gruppen zu deenen dëse Benotzer gehéiert änneren.\n* Een ugekräizt Haische bedeit, datt de Benotzer Member vun dëser Grupp ass.\n* Een net ugekräizt Haische bedeit, datt de Benotzer net Member vun dëser Grupp ass.\n* E Stäerchen (*) bedeit datt Dir d'Grupp net méi ewechhuele kënnt wann e bis eemol dobäigesat ass oder gouf.\n* Eng Raut (#) gëtt un Datt Dir d'Oflafzäit vun dëser Grupp just zrécksetze kënnt; Dir kënnt se net no vir setzen.",
+       "userrights-groups-help": "Dir kënnt d'Gruppen zu deenen dëse Benotzer gehéiert änneren.\n* Een ugekräizt Haische bedeit, datt de Benotzer Member vun dëser Grupp ass.\n* Een net ugekräizt Haische bedeit, datt de Benotzer net Member vun dëser Grupp ass.\n* E Stäerchen (*) bedeit datt Dir d'Grupp net méi ewechhuele kënnt wann e bis eemol dobäigesat ass oder gouf.\n* Eng Raut (#) gëtt un Datt Dir d'Oflafzäit als Member vun dëser Grupp just zrécksetze kënnt; Dir kënnt se net no vir setzen.",
        "userrights-reason": "Grond:",
        "userrights-no-interwiki": "Dir hutt net déi néideg Rechter, fir d'Rechter vu Benoutzer op anere Wikien z'änneren.",
        "userrights-nodatabase": "D'Datebank $1 gëtt et net oder se ass net lokal.",
        "right-editsemiprotected": "Säiten déi als  \"{{int:protect-level-autoconfirmed}}\" gespaart sinn änneren",
        "right-editcontentmodel": "De Modell vum Inhalt vun enger Säit änneren",
        "right-editinterface": "De Benotzerinterface änneren",
-       "right-editusercssjs": "Anere Benotzer hir CSS a JS Fichieren änneren",
        "right-editusercss": "Anere Benotzer hir CSS Fichieren änneren",
        "right-edituserjs": "Anere Benotzer hir JavaScript Fichieren änneren",
        "right-editmyusercss": "Är eegen CSS-Fichieren änneren",
        "recentchanges-legend-plusminus": "''(±123)''",
        "recentchanges-submit": "Weisen",
        "rcfilters-activefilters": "Aktiv Filteren",
+       "rcfilters-quickfilters": "Séier Linken",
+       "rcfilters-quickfilters-placeholder-title": "Nach keng Linke gespäichert",
+       "rcfilters-savedqueries-defaultlabel": "Gespäichert Filteren",
+       "rcfilters-savedqueries-rename": "Ëmbenennen",
+       "rcfilters-savedqueries-setdefault": "Als Standard festleeën",
+       "rcfilters-savedqueries-unsetdefault": "Als Standard ewechhuelen",
+       "rcfilters-savedqueries-remove": "Ewechhuelen",
+       "rcfilters-savedqueries-new-name-label": "Numm",
+       "rcfilters-savedqueries-apply-label": "Séiere Link uleeën",
+       "rcfilters-savedqueries-cancel-label": "Ofbriechen",
+       "rcfilters-savedqueries-add-new-title": "Filteren als séiere Link späicheren",
        "rcfilters-restore-default-filters": "Standardfiltere restauréieren",
        "rcfilters-clear-all-filters": "All Filteren eidelmaachen",
        "rcfilters-search-placeholder": "Rezent Ännerunge filteren (duerchsichen oder ufänke mat tippen)",
        "rcfilters-invalid-filter": "Net valabele Filter",
+       "rcfilters-empty-filter": "Keen aktive Filter. All Kontributioune gi gewisen.",
        "rcfilters-filterlist-title": "Filteren",
+       "rcfilters-filterlist-whatsthis": "Wat ass dat?",
+       "rcfilters-highlightbutton-title": "Resultater ervirhiewen",
+       "rcfilters-highlightmenu-title": "Eng Faarf eraussichen",
        "rcfilters-filterlist-noresults": "Keng Filtere fonnt",
-       "rcfilters-filter-editsbyself-label": "Är eegen Ännerungen",
-       "rcfilters-filter-editsbyself-description": "Ännerunge vun Iech.",
+       "rcfilters-noresults-conflict": "Näischt fonnt well d'Sichcritère sech widderspriechen",
+       "rcfilters-filter-registered-label": "Ugemellt",
+       "rcfilters-filter-unregistered-label": "Net-ugemellt",
+       "rcfilters-filter-unregistered-description": "Auteuren déi net ageloggt sinn.",
+       "rcfilters-filter-editsbyself-label": "Ännerunge vun Iech",
+       "rcfilters-filter-editsbyself-description": "Är eegen Ännerungen.",
        "rcfilters-filter-editsbyother-label": "Ännerunge vun Aneren",
-       "rcfilters-filter-editsbyother-description": "Ännerunge vun anere Benotzer (net vun Iech).",
+       "rcfilters-filter-editsbyother-description": "All Ännerunge ausser Ären eegenen.",
        "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-user-experience-level-newcomer-label": "Neier",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Manner wéi 10 Ännerungen a manner wéi 4 Deeg Aktivitéit.",
+       "rcfilters-filter-user-experience-level-learner-label": "Ufänger",
+       "rcfilters-filter-user-experience-level-learner-description": "Méi Erfarung wéi ''Nei Benotzer'' awer manner wéi ''Erfuere Benotzer''.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Erfuere Benotzer.",
+       "rcfilters-filter-user-experience-level-experienced-description": "Méi wéi 30 Deeg Aktivitéit a méi wéi 500 Ännerungen.",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-humans-label": "Mënsch (kee Bot)",
+       "rcfilters-filtergroup-reviewstatus": "Status nokucken",
+       "rcfilters-filter-patrolled-label": "Nogekuckt",
+       "rcfilters-filter-patrolled-description": "Ännerungen déi als nogekuckt markéiert sinn.",
+       "rcfilters-filter-unpatrolled-label": "Net nogekuckt",
+       "rcfilters-filter-unpatrolled-description": "Ännerungen déi net als nogekuckt markéiert sinn.",
        "rcfilters-filter-minor-label": "Kleng Ännerungen",
        "rcfilters-filter-major-label": "Keng kleng Ännerungen",
+       "rcfilters-filtergroup-watchlist": "Iwwerwaacht Säiten",
+       "rcfilters-filter-watchlist-watched-label": "Op der Iwwerwaachungslëscht",
+       "rcfilters-filter-watchlist-watched-description": "Ännerungen op Säiten op Ärer Iwwrwaachungslëscht",
+       "rcfilters-filter-watchlist-watchednew-label": "Nei Ännerunge vu Säiten op der Iwwerwaachungslëscht",
+       "rcfilters-filter-watchlist-watchednew-description": "Ännerungen op Säite vun Ärer Iwwerwaachungslëscht déi Dir net besicht hutt säit D'Ännerunge gemaach goufen.",
+       "rcfilters-filter-watchlist-notwatched-label": "Net op der Iwwerwaachungslëscht",
+       "rcfilters-filter-watchlist-notwatched-description": "Alles ausser Ännerungen op de Säite vun Ärer Iwwerwaachungslëscht.",
        "rcfilters-filter-pageedits-label": "Säitenännerungen",
+       "rcfilters-filter-newpages-label": "Ugeluechte Säiten",
+       "rcfilters-filter-categorization-label": "Ännerunge vun de Kategorien:",
+       "rcfilters-filter-logactions-label": "Protokolléiert Aktiounen",
+       "rcfilters-filtergroup-lastRevision": "Lescht Versioun",
+       "rcfilters-filter-lastrevision-label": "Lescht Versioun",
+       "rcfilters-filter-lastrevision-description": "Déi lescht Ännerung op enger Säit",
+       "rcfilters-filter-previousrevision-label": "Méi fréi Versiounen",
+       "rcfilters-filter-previousrevision-description": "All Ännerungen, déi net déi rezenst Ännerung vun enger Säit sinn.",
        "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",
        "rcshowhidecategorization": "Kategorisatioun vu Säite $1",
        "rcshowhidecategorization-show": "Weisen",
        "rcshowhidecategorization-hide": "Verstoppen",
-       "rclinks": "Déi lescht $1 Ännerunge vun de leschten $2 Deeg weisen.<br />$3",
+       "rclinks": "Déi lescht $1 Ännerunge vun de leschten $2 Deeg weisen.",
        "diff": "Ënnerscheed",
        "hist": "Versiounen",
        "hide": "verstoppen",
        "pageswithprop": "Säite mat enger Säiteneegeschaft",
        "pageswithprop-legend": "Säite mat enger Säiteneegeschaft",
        "pageswithprop-text": "Op dëser Säit sti Säiten déi eng speziell Säiteneegeschaft benotzen.",
-       "pageswithprop-prop": "Numm vun der Eegeschaft:",
+       "pageswithprop-prop": "Numm vun der Eegenschaft:",
        "pageswithprop-submit": "Lass",
        "pageswithprop-prophidden-long": "Wäert vun der laanger Texteegeschaft verstoppt ($1)",
        "doubleredirects": "Duebel Viruleedungen",
        "enotif_body_intro_moved": "D'{{SITENAME}}-Säit $1 gouf den $PAGEEDITDATE vum $2 {{GENDER:$2|geréckelt}}, kuckt $3 fir déi aktuell Versioun.",
        "enotif_body_intro_restored": "D'{{SITENAME}}-Säit $1 gouf den $PAGEEDITDATE vum $2 {{GENDER:$2|restauréiert}}, kuckt $3 fir déi aktuell Versioun.",
        "enotif_body_intro_changed": "D'{{SITENAME}}-Säit $1 gouf den $PAGEEDITDATE vum $2  {{GENDER:$2|geännert}}, kuckt $3 fir déi aktuell Versioun",
-       "enotif_lastvisited": "All Ännerungen op ee Bléck: $1",
-       "enotif_lastdiff": "Kuckt $1 fir dës Ännerung.",
+       "enotif_lastvisited": "Fir all Ännerungen zanter Dir fir d'lescht hei waart kuckt $1",
+       "enotif_lastdiff": "Fir dës Ännerung ze gesinn, kuckt $1",
        "enotif_anon_editor": "Anonyme Benotzer $1",
        "enotif_body": "Léiwe $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumé vum Mataarbechter: $PAGESUMMARY $PAGEMINOREDIT\n\nDen Editeur kontaktéieren:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nEt gi soulaang keng weider Maile geschéckt, bis Dir d'Säit nees emol besicht hutt wärend deem Dir ageloggt sidd.\nOp Ärer Iwwerwaachungslëscht kënnt Dir all Noriichtemarkeren zesummen zrécksetzen.\n\n\nÄre frëndleche(n) {{SITENAME}} Noriichtessystem\n\n--\n\nFir d'Astellungen op Ären E-Mailnoriichten z'änneren, besicht w.e.g.\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nFir d'Astellunge vun Ärer Iwwerwaachungslëscht z'änneren, besicht w.e.g.\n{{canonicalurl:Special:Watchlist/edit}}\n\nFeedback a weider Hëllef:\n$HELPPAGE",
        "created": "gemaach",
        "undeleteviewlink": "weisen",
        "undeleteinvert": "Auswiel ëmdréinen",
        "undeletecomment": "Grond:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|Versioun gouf|$1 Versioune goufe}} restauréiert",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Versioun|$1 Versiounen}} a(n) {{PLURAL:$2|1 Fichier|$2 Fichiere}} goufe restauréiert",
-       "undeletedfiles": "$1 {{PLURAL:$1|Fichier gouf|Fichiere goufe}} restauréiert",
        "cannotundelete": "E puer oder all d'Restauratiounen hunn net funktionéiert:\n$1",
        "undeletedpage": "'''$1''' gouf restauréiert.\n\nAm [[Special:Log/delete|Läsch-Logbuch]] fannt Dir déi geläscht a restauréiert Säiten.",
        "undelete-header": "Kuckt [[Special:Log/delete|Läschlescht]] fir rezent geläscht Säiten.",
        "sp-contributions-uploads": "Eropgeluede Fichieren",
        "sp-contributions-logs": "Logbicher",
        "sp-contributions-talk": "diskutéieren",
-       "sp-contributions-userrights": "Verwaltung vun de Benotzerrechter",
+       "sp-contributions-userrights": "Verwaltung vun de {{GENDER:$1|Benotzer}}rechter",
        "sp-contributions-blocked-notice": "Dëse Benotzer ass elo gespaart. Déi lescht Entrée am Läsch-Logbuch steet als Referenz hei ënnendrënner:",
        "sp-contributions-blocked-notice-anon": "Dës IP-Adress ass elo gespaart.\nËnnendrënner steet déi lescht Aschreiwung an d'Spärlëscht:",
        "sp-contributions-search": "No Kontributioune sichen",
        "unblocked-id": "D'Spär $1 gouf opgehuewen",
        "unblocked-ip": "D'Spär vum [[Special:Contributions/$1|$1]] gouf opgehuewen.",
        "blocklist": "Gespaart Benotzer",
+       "autoblocklist": "Automatesch Spären",
+       "autoblocklist-submit": "Sichen",
+       "autoblocklist-legend": "Automatesche Spären opzielen",
+       "autoblocklist-empty": "D'Lëscht vun den automatesche Spären ass eidel.",
        "ipblocklist": "Gespaart Benotzer",
        "ipblocklist-legend": "No engem gespaarte Benotzer sichen",
        "blocklist-userblocks": "Benotzerspäre verstoppen",
        "tooltip-pt-mycontris": "Lëscht vun {{GENDER:|Äre}} Kontributiounen",
        "tooltip-pt-anoncontribs": "Eng Lëscht vun Ännerungen déi vun dëser IP-Adress aus gemaach goufen",
        "tooltip-pt-login": "Sech umelle gëtt gäre gesinn, Dir musst et awer net maachen.",
+       "tooltip-pt-login-private": "Dir musst Iech alogge fir dës Wiki ze benotzen",
        "tooltip-pt-logout": "Ofmellen",
        "tooltip-pt-createaccount": "Et gëtt Iech geroden e Benotzerkont unzeleeën an Iech anzeloggen; dat ass awer net obligatoresch",
        "tooltip-ca-talk": "Diskussioun iwwer de Säiteninhalt",
        "anonymous": "{{PLURAL:$1|Anonyme Benotzer|Anonym Benotzer}} op {{SITENAME}}",
        "siteuser": "{{SITENAME}}-Benotzer $1",
        "anonuser": "Anonyme(n) {{SITENAME}}-Benotzer $1",
-       "lastmodifiedatby": "Dës Säit gouf den $1 ëm $2 Auer vum $3 fir d'lescht geännert.",
+       "lastmodifiedatby": "Dës Säit gouf de(n) $1 ëm $2 Auer vum $3 fir d'lescht geännert.",
        "othercontribs": "Op der Basis vun der Aarbecht vum $1",
        "others": "anerer",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|Benotzer}} $1",
        "newimages-summary": "Dës Spezialsäit weist eng Lëscht mat de Fichieren déi als lescht eropgeluede goufen.",
        "newimages-legend": "Filter",
        "newimages-label": "Numm vum Fichier (oder en Deel dovun):",
+       "newimages-user": "IP-Adress oder Benotzernumm",
        "newimages-showbots": "Vu Botten eropgeluede Fichiere weisen",
        "newimages-hidepatrolled": "Nogekuckt Fichiere verstoppen",
        "noimages": "Keng Biller fonnt.",
        "confirmrecreate": "De Benotzer [[User:$1|$1]] ([[User talk:$1|Diskussioun]]) huet dës Säit {{GENDER:$1|geläscht}}, nodeems datt Dir ugefaangen hutt drun ze schaffen. D'Begrënnung war: <em>$2</em>\nBestätegt w.e.g., datt Dir dës Säit wierklech erëm nei opmaache wëllt.",
        "confirmrecreate-noreason": "De Benotzer [[User:$1|$1]] ([[User talk:$1|Diskussioun]]) huet dës Säit {{GENDER:$1|geläscht}}, nodeems datt Dir ugefaangen hutt drun ze schaffen. Confirméiert w.e.g., datt Dir dës Säit wierklech erëm nei opmaache wëllt.",
        "recreate": "Nees uleeën",
+       "confirm-purge-title": "Dës Säit eidelmaachen",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Dës Säit aus dem Server-Cache läschen?",
        "confirm-purge-bottom": "Mécht de Cache vun enger Säit eidel a forcéiert d'Uweise vun der aktueller Versioun.",
        "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-restore": "$1 {{GENDER:$2|huet}} d'Säit $3 ($4) restauréiert",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
+       "restore-count-revisions": "{{PLURAL:$1|1 Versioun|$1 Versiounen}}",
+       "restore-count-files": "{{PLURAL: $1|1 Fichier|$1 Fichieren}}",
        "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}}",
        "logentry-delete-event-legacy": "$1 huet d'Visibilitéit vun Elementer am Log op $3 {{GENDER:$2|geännert}}",
        "logentry-upload-revert": "$1 huet $3 {{GENDER:$2|eropgelueden}}",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|huet}} d'{{PLURAL:$7|Markéierung|Markéierunge(n)}} $6 op d'Versioun $4 vun der Säit $3 dobäigesat",
        "rightsnone": "(keen)",
-       "revdelete-summary": "Resumé änneren",
        "rightslogentry-temporary-group": "$1 (temporär, bis $2)",
        "feedback-adding": "Feedback gëtt bei d'Säit derbäigesat...",
        "feedback-back": "Zréck",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Kanadesch Silbeschrëft",
        "special-characters-title-endash": "en dash",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "Minus-Zeechen",
        "mw-widgets-titleinput-description-redirect": "viruleeden op $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Eng Kategorie derbäisetzen...",
        "mw-widgets-usersmultiselect-placeholder": "Méi derbäisetzen...",
+       "date-range-from": "Vum (Datum):",
+       "date-range-to": "Bis den (Datum):",
        "sessionprovider-generic": "$1-Sessiounen",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-baséiert Sessiounen",
        "sessionprovider-nocookies": "Cookië sinn eventuell desaktivéiert. Vergewëssert Iech datt Dir d'Cookien aktivéiert hutt a probéiert nach eng Kéier.",
        "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:",
-       "revid": "Versioun $1"
+       "revid": "Versioun $1",
+       "gotointerwiki": "{{SITENAME}} verloossen",
+       "gotointerwiki-invalid": "De spezifizéierten Titel ass net valabel.",
+       "gotointerwiki-external": "Dir sidd am Gaang {{SITENAME}} ze verloosse fir [[$2]] ze besichen, deen een externen Internetsite ass.\n\n'''[$1 Hei klicke fir op $1 virunzefueren]'''",
+       "undelete-cantedit": "Dir kënnt dës Säit net restauréiere well Dir dës Säit net änneren däerft.",
+       "undelete-cantcreate": "Dir kënnt dës Säit net restauréieren well et elo keng Säit mat deem Numm gëtt a well Dir dës Säit net uleeën däerft."
 }
index 3bf5384..07c6971 100644 (file)
        "yourdomainname": "Куь домен",
        "login": "Гьахьун",
        "nav-login-createaccount": "Гьахьун/аккаунт туькӀуьрун",
-       "userlogin": "Гьахьун/аккаунт туькӀуьрун",
-       "userloginnocreate": "Гьахьун",
        "logout": "ЭкъечӀун",
        "userlogout": "ЭкъечӀун",
        "notloggedin": "Куьн гьахьнавач",
-       "nologin": "Квез аккаунт авачни? $1.",
-       "nologinlink": "Аккаунт туькӀуьрун",
        "createaccount": "Аккаунт туькӀуьрун",
-       "gotaccount": "Квез аккаунт авани?$1",
-       "gotaccountlink": "Гьахьун",
-       "userlogin-resetlink": "Гьахьунин куьлуь-шуьлуьяр рикӀел алатнани?",
        "createaccountmail": "Э-чар галаз",
-       "createaccountreason": "Себеб:",
        "loginerror": "Гьахьунин гъалатӀ",
        "createaccounterror": "И аккаунт туькӀуьриз мумкин ттуш: $1",
        "loginsuccesstitle": "Агалкьунралди гьахьун",
        "rcshowhidemine": "$1 зи  дуьзар хъувунар",
        "rcshowhidemine-show": "Къалурун",
        "rcshowhidemine-hide": "Чуьнуьхун",
-       "rclinks": "Эхиримжи $2 йикъан къене $1 масакIавилер къалура <br />$3",
+       "rclinks": "Эхиримжи $2 йикъан къене $1 масакIавилер къалура",
        "diff": "тафават",
        "hist": "тарих",
        "hide": "Чуьнуьхун",
index 1d786c2..4f679d7 100644 (file)
        "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",
        "rcshowhidemine": "$1 me editas",
        "rcshowhidemine-show": "Mostra",
        "rcshowhidemine-hide": "Asconde",
-       "rclinks": "Mostra la $1 cambias presedente en la $2 dias presedente<br />$3",
+       "rclinks": "Mostra la $1 cambias presedente en la $2 dias presedente",
        "diff": "dife",
        "hist": "isto",
        "hide": "Asconde",
index 7afd6f8..6d3ee17 100644 (file)
        "externaldberror": "Waliwo kiremya mu ggwanika lya data ekozesebwa okukakasa bamemba oba tokkirizibwa okukyusa ku akawunti yo ey'awalala.",
        "login": "Yingira",
        "nav-login-createaccount": "Yingira / kolawo akawunti",
-       "userlogin": "Yingira / kolawo akawunti",
-       "userloginnocreate": "Yingira",
        "logout": "Vaamu",
        "userlogout": "Vaamu",
        "notloggedin": "Tonnayingira",
-       "nologin": "Akawunti wafuna? '''$1'''.",
-       "nologinlink": "Funa akawunti",
        "createaccount": "Kolawo akawunti",
-       "gotaccount": "Akawunti wafuna? '''$1'''.",
-       "gotaccountlink": "Yingira",
-       "userlogin-resetlink": "Werabidde by'okozesa okuyingira?",
        "createaccountmail": "Akawunti gikole ne E-mail",
-       "createaccountreason": "Ekikukozesezawo akawunti:",
        "badretype": "Ebigambo ebikuumi by'owandise tebifaanagana.",
        "userexists": "Ery'obwa memba ly'owandise wali omulala alirina.<br />\nLonda eddala.",
        "loginerror": "Okuyingira kuzzeko kiremya:",
        "showdiff": "Ndaga bwe bikyuse",
        "anoneditwarning": "'''Kulabula:''' Owandika toyingidde mu sisitemu. Tujjakuwandika endagiriro eya kompyuta kwosinzidde\nmu lukalala lw'enkuykakyuka ez'omu lupapula luno.",
        "anonpreviewwarning": "''Okola toyingidde sisitemu. Bw'on'okaza by'okola nga sisitemu ewandika n'endagiriro yo eya IP mu lukalala lw'enkyukakyuka lw'olupapula luno.''",
-       "missingsummary": "'''Okujjukiza:''' Towandise ebinnyonyola enkyukakyuka z'okoze.<br />\nBw'oddamu okunyiga \"{{int:savearticle}}\", by'okoze tebijjakubaako okunnyonyola.",
+       "missingsummary": "'''Okujjukiza:''' Towandise ebinnyonyola enkyukakyuka z'okoze.<br />\nBw'oddamu okunyiga \"$1\", by'okoze tebijjakubaako okunnyonyola.",
        "missingcommenttext": "Wandika ebigambo byo wano awaddako.",
-       "missingcommentheader": "'''Okujjukiza:''' Ebigambo byo tobiwadde omutwe.<br />\nBw'oddamu okunyiga \"{{int:savearticle}}\", by'okoze tebijjakubaako omutwe ogubyanjula.",
+       "missingcommentheader": "'''Okujjukiza:''' Ebigambo byo tobiwadde omutwe.<br />\nBw'oddamu okunyiga \"$1\", by'okoze tebijjakubaako omutwe ogubyanjula.",
        "summary-preview": "Kuno kwe kunnyonyola kwo:",
        "subject-preview": "Omutwe bwe gunaafaanana:",
        "blockedtitle": "Ono agaanidwa",
        "editingsection": "Okyusa $1 (kitundu)",
        "editingcomment": "Okyusa $1 (kitundu kipya)",
        "editconflict": "Ebikyusidwamu bireesewo okusobagana: $1",
-       "explainconflict": "Waliwo omulala akyusizza mu lupapula luno nga okyalukolako.<br />\nEkitundu eky'ebiwandike ekisooka wano kikulaga ebigambo ebiruliko kakano.<br />\nBy'owandise byo biri mu kitundu eky'ebiwandike ekiddako.<br />\nEbigambo ebibyo on'obigatta mu ebyo ebiriwo ku lupapula kakano.<br />\nEbinaaba birabika mu kitundu eky'ebiwandike ekisooka w'on'onyigira ku<br />\n\"{{int:savearticle}}\" '''bye byokka''' ebij'okukazibwa.",
+       "explainconflict": "Waliwo omulala akyusizza mu lupapula luno nga okyalukolako.<br />\nEkitundu eky'ebiwandike ekisooka wano kikulaga ebigambo ebiruliko kakano.<br />\nBy'owandise byo biri mu kitundu eky'ebiwandike ekiddako.<br />\nEbigambo ebibyo on'obigatta mu ebyo ebiriwo ku lupapula kakano.<br />\nEbinaaba birabika mu kitundu eky'ebiwandike ekisooka w'on'onyigira ku<br />\n\"$1\" '''bye byokka''' ebij'okukazibwa.",
        "yourtext": "Ebigambo ebibyo",
        "storedversion": "Ebiriwo kakano",
        "nonunicodebrowser": "'''Kulabula: Kalambulaneti yo tekwatagana bulungi n'enkola ya unicode.'''<br />\nOkuvvuunuka obuzibu buno osobole okukyusa mu mpapula, buli lw'on'owandikawo<br />\nakabonero akatali ka ASCII kajjanga okuteekebwawo mu mpandika eya nengakkuminabbiri.",
        "rcshowhideliu": "$1 ebya bamemba abali ku wiki ku saawa eno",
        "rcshowhideanons": "$1 eby'abakola ng'abat'eyanjude",
        "rcshowhidemine": "$1 nze byenkoze",
-       "rclinks": "Ndaga enkyukakyuka $1 ezikoledwa mu nnaku $2 ezaakayita<br />$3",
+       "rclinks": "Ndaga enkyukakyuka $1 ezikoledwa mu nnaku $2 ezaakayita",
        "diff": "enjawulo",
        "hist": "ennanda",
        "hide": "Kisa",
index a82bd16..2e2bacd 100644 (file)
        "externaldberror": "d'r Is 'n fout opgetraoje biej 't aanmelje biej de database of doe höbs gén toesjtömming diene externe gebroeker biej te wèrke.",
        "login": "Aanmèlde",
        "nav-login-createaccount": "Aanmelje / registrere",
-       "userlogin": "Aanmelde / registrere",
-       "userloginnocreate": "Mèlj aan",
        "logout": "Aafmelde",
        "userlogout": "Aafmelde",
        "notloggedin": "Neet aangemeld",
-       "nologin": "Höbs te nog geine gebroekersnaam? $1.",
-       "nologinlink": "Maak 'ne gebroekersnaam aan",
        "createaccount": "Nuuj gebroekersprofiel aanmake.",
-       "gotaccount": "Höbs te al 'ne gebroekersnaam? '''$1'''.",
-       "gotaccountlink": "Inlogge",
-       "userlogin-resetlink": "Bös se dien aanmèljingsgegaeves vergaete?",
        "createaccountmail": "via de e-mail",
-       "createaccountreason": "Raeje:",
        "badretype": "De ingeveurde wachwäörd versjille vanein.",
        "userexists": "De gebroekersnaam dae se höbs ingeveurd weurt al gebroek.\n\nKees estebleef 'ne angere naam.",
        "loginerror": "Inlogfout",
        "passwordreset-disabled": "'t Is hie neet meugelik óm die wachwaord óbbenuits in te sjtelle.",
        "passwordreset-username": "Gebroekersnaam:",
        "passwordreset-domain": "Domein:",
-       "passwordreset-capture": "Bekiek de resulterenden e-mail?",
-       "passwordreset-capture-help": "Es se dit vekske aanvènks, weurt d'n e-mail (mit e tiedelik wachwaord) nao de gebroek gesjik en ouch aan dich getuind.",
        "passwordreset-email": "E-mailadres:",
        "passwordreset-emailtitle": "Gebroekersgegaeves óp {{SITENAME}}",
        "passwordreset-emailtext-ip": "Emes, wersjienlik doe, vanaaf 't IP-adres $1, haet dien gebroekersgegaeves veur {{SITENAME}} ($4) ópgevraog.\nDe volgende {{PLURAL:$3|gebroeker is|gebroekers zint}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tiedelik wachwaord vervilt|Dees tiedelike wachweurd vervallen}} euver {{PLURAL:$5|einen daag|$5 daag}}.\nMel dich aan en veranger 't wachwaord noe. Es se dit verzeuk neet zelf hes gedaon, of es se 't oorspronkelik wachwaord nog kins en 't neet anges wils, laot dit berich den en blief dien aad wachwaord gebroeke.",
        "anonpreviewwarning": "''Doe bös neet aangemeldj.''\n''Door dien bewèrking op te slaon wört dien IP-adres opgeslagen in de paginagesjiedenis.''",
        "missingsummary": "'''Herinnering:''' doe höbs gein samevatting opgegaeve veur dien bewirking. Es te weer op ''Pagina opslaon'' kliks weurt de bewirking zonger samevatting opgesjlage.",
        "missingcommenttext": "Plaats dien opmèrking hiej onger, a.u.b.",
-       "missingcommentheader": "'''Let op:''' Doe höbs gén ongerwerp/kop veur deze opmèrking opgegaeve. Esse oppernuuj op \"{{int:savearticle}}\" kliks, wörd dien verangering zonger ongerwerp/kop opgeslage.",
+       "missingcommentheader": "'''Let op:''' Doe höbs gén ongerwerp/kop veur deze opmèrking opgegaeve. Esse oppernuuj op \"$1\" kliks, wörd dien verangering zonger ongerwerp/kop opgeslage.",
        "summary-preview": "Naokieke samevatting:",
        "subject-preview": "Naokieke ongerwerp/kop:",
        "blockedtitle": "Gebroeker is geblokkeerd",
        "editingsection": "Bewirke van sectie van $1",
        "editingcomment": "Bewirke $1 (commentair)",
        "editconflict": "Bewirkingsconflik: $1",
-       "explainconflict": "Emes angers haet dees pagina verangerd naodats doe aan dees bewirking bis begós.\n't Ierste teksveld tuint de hujige versie van de pagina.\nDe mós dien eige verangeringe dao-in inpasse.\n'''Allein''' d'n tèks in 't ierste teksveld weurt opgesjlage es te noe op \"{{int:savearticle}}\" duujs.",
+       "explainconflict": "Emes angers haet dees pagina verangerd naodats doe aan dees bewirking bis begós.\n't Ierste teksveld tuint de hujige versie van de pagina.\nDe mós dien eige verangeringe dao-in inpasse.\n'''Allein''' d'n tèks in 't ierste teksveld weurt opgesjlage es te noe op \"$1\" duujs.",
        "yourtext": "Euren teks",
        "storedversion": "Opgesjlage versie",
        "nonunicodebrowser": "'''WAARSJOEWING: Diene browser kan neet good euverweeg mit unicode.\n Hie waert rekening mit gehauwe om dich zónger probleme pagina's te kinne laote bewirke: neet-ASCII karakters waere in 't bewirkingsveld weergegaeve es hexadecimaal codes.'''",
        "saveprefs": "Veurkäöre opsjlaon",
        "restoreprefs": "Terug nao standaardinstellinge",
        "prefs-editing": "Aafmeitinge tèksveld",
-       "rows": "Regels",
-       "columns": "Kolomme",
        "searchresultshead": "Insjtèllinge veur zeukresultate",
        "stub-threshold": "Drempel veur markering <a href=\"#\" class=\"stub\">begske</a>:",
        "stub-threshold-disabled": "Oetgezatj",
        "userrights-reason": "Reeje:",
        "userrights-no-interwiki": "Doe höbs gein rechte om gebroekersrechte op anger wiki's te wiezige.",
        "userrights-nodatabase": "Database $1 besteit neet of is gein plaatselike database.",
-       "userrights-nologin": "Doe mos dich [[Special:UserLogin|aanmelle]] mit 'ne gebroeker mit de zjuuste rech om gebroekersrech toe te wieze.",
-       "userrights-notallowed": "Doe höbs gein rechte om gebroekersrechte toe te voegen of te wisse.",
        "userrights-changeable-col": "Gróppe dies te kèns behere",
        "userrights-unchangeable-col": "Gróppe dies te neet kèns behere",
        "group": "Gróp:",
        "right-protect": "Beveiligingsniveaus wijzige",
        "right-editprotected": "Beveiligde pagina's bewerke",
        "right-editinterface": "De gebroekersinterface bewerke",
-       "right-editusercssjs": "De CSS- en JS-bestande van angere gebroekers bewerke",
        "right-editusercss": "De CSS-bestande van angere gebroekers bewerke",
        "right-edituserjs": "De JS-bestande van angere gebroekers bewerke",
        "right-rollback": "Snel de letste bewerking(e) van 'n gebroeker van 'n pagina terugdraaie",
        "right-siteadmin": "De database blokkere en weer vriegaeve",
        "right-override-export-depth": "Export paazjes midin geslinkdje paazjes mit 'n deepdje ven 5",
        "right-sendemail": "Versjik e-mail aan anger gebroekers",
-       "right-passwordreset": "Bekiek e-mails van ópnuuj ingestèldje wachwäörd",
        "newuserlogpage": "Logbook nuuj gebroekers",
        "newuserlogpagetext": "Hiej ónger saton de nuuj ingesjreve gebroekers.",
        "rightslog": "Gebroekersrechtelogbook",
        "rcshowhideanons": "$1 anonieme gebroekers",
        "rcshowhidepatr": "$1 gecontroleerde bewerkinge",
        "rcshowhidemine": "$1 mien bewirkinge",
-       "rclinks": "Bekiek de $1 lètste verangeringe van de aafgeloupe $2 daag.<br />$3",
+       "rclinks": "Bekiek de $1 lètste verangeringe van de aafgeloupe $2 daag.",
        "diff": "vers",
        "hist": "hist",
        "hide": "Versjtaek",
        "undeleteviewlink": "Bekiek",
        "undeleteinvert": "Ómgedriejde selectie",
        "undeletecomment": "Reeje:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|versie|versies}} truukgeplaatsj",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|versie|versies}} en $2 {{PLURAL:$2|bestandj|bestenj}} trökgeplaats",
-       "undeletedfiles": "$1 {{PLURAL:$1|bestandj|bestenj}} trökgeplaats",
        "cannotundelete": "Verwiedere mislùk. Mesjien haet 'ne angere gebroeker de pazjena al verwiederd.",
        "undeletedpage": "'''$1 is trökgeplaats'''\n\nIn 't [[Special:Log/delete|logbook verwiederde pazjena's]] staon recènte verwiederinge en herstelhanjelinge.",
        "undelete-header": "Zuug [[Special:Log/delete|'t logbook verwiederde pazjena's]] veur recènt verwiederde pazjena's.",
        "logentry-newusers-create2": "$1 haet 'ne gebroeker $3 aangemaak",
        "logentry-newusers-autocreate": "De gebroeker $1 is autematis aangemaak",
        "rightsnone": "(gein)",
-       "revdelete-summary": "samevatting bewerke",
        "feedback-adding": "Feedback weurt aan pagina toegevoeg...",
        "feedback-bugcheck": "Good! Kónterleer ef of 't neet al ein vanne [$1 bekèndje bugs] is.",
        "feedback-bugnew": "Gekónterleerdj. Mèlj 'ne nuuj bug.",
        "feedback-thanks": "Danke! Diene feedback is oppe pagina \"[$2 $1]\" geplaats.",
        "searchsuggest-search": "Zeuke",
        "searchsuggest-containing": "bevat...",
-       "api-error-badaccess-groups": "Doe moogs gein bestenj uploade óp deze wiki.",
        "api-error-badtoken": "Intern fout: toke is slech.",
-       "api-error-copyuploaddisabled": "Uploade via URL steit óp deze server oet.",
-       "api-error-duplicate": "d'r {{PLURAL:$1|steit al e bestandj|staon al bestenj}} mit dezelfden inhawd oppe wiki.",
-       "api-error-duplicate-archive": "d'r {{PLURAL:$1|Waar al 'n anger bestandj|woren al $1 anger bestenj}} óppe site mitte zelfdjen inhawd, meh {{PLURAL:$1|det is|die zeen}} gewösj.",
-       "api-error-empty-file": "t Bestandj det se perbeers te uploade had gein inhald.",
        "api-error-emptypage": "Doe maags gein nuuj, laeg pagina's aanmake.",
-       "api-error-fetchfileerror": "Intern fout: d'r is get fout gegange bie 't óphaole van 't bestandj.",
-       "api-error-fileexists-forbidden": "d'r Besteit al e bestandj mitte naam \"$1\" det neet euversjreve kin waere.",
-       "api-error-fileexists-shared-forbidden": "d'r Besteit al e bestandj mitte naam \"$1\" inne gedeildje repositoir det neet euversjreve kin waere.",
-       "api-error-file-too-large": "t Bestandj det se perbeers te uploade waas te groet.",
-       "api-error-filename-tooshort": "t Bestandj det se perbeers te uploade had 'ne te kórte bestandjsnaam.",
-       "api-error-filetype-banned": "t Bestandj det se perbeers te uploade waas van e neet-toegelaote bestandjstype.",
-       "api-error-filetype-banned-type": "{{PLURAL:$4|'t bestandjstype $1 weurt|De bestandjstypes $1 waere}} neet toegelaote. {{PLURAL:$3|'t Toegelaote bestandjstype is|De toegelaote bestandjstypes zeen}} $2.",
-       "api-error-filetype-missing": "'t Bestandj haet gein extensie.",
-       "api-error-hookaborted": "De wieziging die se perbeers te make is aafgebraoke door 'nen oetbreidingshook.",
-       "api-error-http": "Intern fout: d'r kós gein verbinjing gemaak waere mitte server.",
-       "api-error-illegal-filename": "Deze bestandjsnaam is neet toegelaote.",
-       "api-error-internal-error": "Intern fout: d'r is get fout gegange tiedes 't verwirke vanne upload dore wiki.",
-       "api-error-invalid-file-key": "Intern fout: 't bestandj is neet aangetróffe inne tiedeliken ópslaag.",
-       "api-error-missingparam": "Intern fout: neet alle paramaeters zeen in 't verzeuk mitgeleverdj.",
-       "api-error-missingresult": "Intern fout: 't waar neet meugelik vas te stèllen of 't kopiejere is geslaag.",
-       "api-error-mustbeloggedin": "Doe mós aangemèldj zeen óm bestenj te kinnen uploade.",
-       "api-error-mustbeposted": "Inter fout: aanvraog vereis HTTP-POST.",
-       "api-error-noimageinfo": "De upload is aafgeróndj, meh de server haet gein gegaeves van 't bestandj vriegegaeve.",
-       "api-error-nomodule": "Intern fout: d'r is gein uploadmodule ingesteldj.",
-       "api-error-ok-but-empty": "Intern fout: de server haet gein gegaeves trögkgeleverdj.",
-       "api-error-overwrite": "E bestandj euversjrieve geit neet.",
        "api-error-stashfailed": "Intern fout: de server kós 't tiedelik bestandj neet ópslaon.",
-       "api-error-timeout": "De server haet neet inne verwachde tied geantjweurd.",
-       "api-error-unclassified": "dr Is 'n ónbekènde fout opgetraoje.",
-       "api-error-unknown-code": "Intern fout: \"$1\"",
-       "api-error-unknown-error": "Intern fout: d'r is get fout gegange tiedes 't uploade van 't bestandj.",
        "api-error-unknown-warning": "Onbekinde waorsjuwing: $1",
        "api-error-unknownerror": "Ónbekèndje fout: \"$1\"",
-       "api-error-uploaddisabled": "Upload steit oet óp deze wiki.",
-       "api-error-verification-error": "Dit bestandj is meugelik besjadig of haet 'n ónjuuste extensie.",
        "duration-seconds": "$1 {{PLURAL:$1|sekond|sekond}}",
        "duration-minutes": "$1 {{PLURAL:$1|menuut|menuut}}",
        "duration-hours": "$1 {{PLURAL:$1|oer|oer}}",
index afd8cc5..d0ef772 100644 (file)
        "redirectedfrom": "(Rendirissou da $1)",
        "redirectpagesub": "Paggina de rindirissamento",
        "redirectto": "Rendirissa a:",
-       "lastmodifiedat": "Sta pagina a l'è stæta cangiâ l'urtima votta a e $2 do $1.",
+       "lastmodifiedat": "Sta pagina a l'è stæta cangiâ l'urtima votta o $1 a $2.",
        "viewcount": "'Sta paggina a l'è stæta vista {{PLURAL:$1|solo 'na vòtta|$1 vòtte}}.",
        "protectedpage": "Paggina protetta",
        "jumpto": "Vanni a:",
        "login": "Intra",
        "login-security": "Veifica a to identitæ",
        "nav-login-createaccount": "Intra / Registrate",
-       "userlogin": "Intra / Registrite",
-       "userloginnocreate": "Intra",
        "logout": "Sciorti",
        "userlogout": "Sciorti",
        "notloggedin": "No t'ê introu",
        "userlogin-noaccount": "No ti t'ê ancon registrou?",
        "userlogin-joinproject": "Registrite insce {{SITENAME}}",
-       "nologin": "No ti gh'æ ancon in acesso? '''$1'''.",
-       "nologinlink": "Creâ 'n' utensa",
        "createaccount": "Crea 'n nêuvo account",
-       "gotaccount": "Ti ghe l'æ za 'n' utensa? '''$1'''.",
-       "gotaccountlink": "Intra",
-       "userlogin-resetlink": "T'æ ascordòu i teu dæti de acesso?",
        "userlogin-resetpassword-link": "T'hæ miga ascordou a teu poula segretta?",
        "userlogin-helplink2": "Agiutto pe intrâ",
        "userlogin-loggedin": "Ti t'ê zà connesso comme {{GENDER:$1|$1}}.\nUsa o formulaio sottostante pe accede comme 'n atro utente.",
        "createaccountmail": "Doeuvia una password temporanea abrettio e mandila a l'adresso de posta elettronica speçificou",
        "createaccountmail-help": "O poeu ese doeuviou pe creâ un'utensa pe 'n'atra person-a sensa doveine conosce a password.",
        "createacct-realname": "Nomme reale (opçionâ)",
-       "createaccountreason": "Raxon:",
        "createacct-reason": "Raxon",
        "createacct-reason-ph": "Perché t'ê apreuvo a creâ un'atra utensa",
        "createacct-reason-help": "Messaggio vixualizou into registro da creaçion de l'utença",
        "preview": "Anteprìmma",
        "showpreview": "Veddi l'anteprimma",
        "showdiff": "Veddi i cangiamenti",
-       "blankarticle": "<strong>Attençion:</strong> a paggina che ti çerchi a l'è veua.\nCliccando torna in sce \"{{int:savearticle}}\", a paggina a saiâ creâ sensa contegnui.",
+       "blankarticle": "<strong>Attençion:</strong> a paggina che ti çerchi a l'è veua.\nCliccando torna in sce \"$1\", a paggina a saiâ creâ sensa contegnui.",
        "anoneditwarning": "<strong>Attension:</strong> No t'ê introu. Se ti fæ di cangi o teu adresso IP o saiâ vixibile pubbricamente. Se <strong>[$1 ti intri]</strong> ò <strong>[$2 ti crei un'utensa]</strong>, e teu modifiche saian attribuie a-o teu nomme utente, insemme a di atri benefiççi.",
        "anonpreviewwarning": "No t'hæ fæto l'accesso. Se ti sarvi inta stoia da paggina ghe saiâ solo o to adresso IP",
-       "missingsummary": "<strong>Aregòrdite:</strong> no t'hæ specificòu l'oggetto de questa modiffica. Sciaccando torna \"{{int:savearticle}}\", a modiffica a saiâ sarvâ sensa.",
-       "selfredirect": "<strong>Attençion:</strong> t'ê apreuvo a rendirissâ sta paggina a lê mæxima.\nFoscia t'hæ sballiòu a indicâ a destinaçion pe-o redirect, ò donque ti modiffichi a paggina sbaliâ.\nSe ti clicchi torna \"{{int:savearticle}}\", o redirect o saiâ creòu comunque.",
+       "missingsummary": "<strong>Aregòrdite:</strong> no t'hæ specificòu l'oggetto de questa modiffica. Sciaccando torna \"$1\", a modiffica a saiâ sarvâ sensa.",
+       "selfredirect": "<strong>Attençion:</strong> t'ê apreuvo a rendirissâ sta paggina a lê mæxima.\nFoscia t'hæ sballiòu a indicâ a destinaçion pe-o redirect, ò donque ti modiffichi a paggina sbaliâ.\nSe ti clicchi torna \"$1\", o redirect o saiâ creòu comunque.",
        "missingcommenttext": "Scrivi un commento chi de sotta",
-       "missingcommentheader": "<strong>Aregòrdite:</strong> no t'hæ specificòu o soggetto de sto commento. Sciaccando torna \"{{int:savearticle}}\", a modiffica a saiâ sarvâ sensa.",
+       "missingcommentheader": "<strong>Aregòrdite:</strong> no t'hæ specificòu o soggetto de sto commento. Sciaccando torna \"$1\", a modiffica a saiâ sarvâ sensa.",
        "summary-preview": "Anteprimma oggetto:",
        "subject-preview": "Anteprimma do soggetto:",
        "previewerrortext": "Gh'è stæto un errô mentre se çercava de mostrâ l'anteprimma.",
        "editingsection": "Càngio de $1 (seçión)",
        "editingcomment": "Càngio de $1 (neuva seçion)",
        "editconflict": "Conflito d'ediçion: $1",
-       "explainconflict": "Un atro utente o l'ha sarvòu una neuva verscion da paggina de mentre che t'êi apreuvo a cangiâla.\nA casella de modiffica de d'ato a conten o scrito da paggina coscì comm'o l'è òua.\nE teu modiffiche son invece mostræ inta casella de modiffica de sotta.\nTi g'hæ da stramuâ e teu modiffiche inta casella de d'ato.\nSciaccando o pomello '{{int:savearticle}}', o saiâ sarvòu '''solo''' o scrito contegnuo inta casella de d'ato.",
+       "explainconflict": "Un atro utente o l'ha sarvòu una neuva verscion da paggina de mentre che t'êi apreuvo a cangiâla.\nA casella de modiffica de d'ato a conten o scrito da paggina coscì comm'o l'è òua.\nE teu modiffiche son invece mostræ inta casella de modiffica de sotta.\nTi g'hæ da stramuâ e teu modiffiche inta casella de d'ato.\nSciaccando o pomello '$1', o saiâ sarvòu '''solo''' o scrito contegnuo inta casella de d'ato.",
        "yourtext": "O teu testo",
        "storedversion": "La verscion memorizzâ",
        "nonunicodebrowser": "'''Attençion: o teu navegatô o no l'è compatibbile co-i caratteri Unicode.''' Pe consentî a modiffica de paggine sença problemi, i caratteri non ASCII saian vixualizzæ inta casella de modiffica sotto forma de codiçi esadeximæ.'''",
        "post-expand-template-argument-warning": "'''Atençión:''' sta pàgina a contegne un ò ciù argomenti di template che son tròppo gràndi pe êse espansi. Sti argomenti no saiàn fæti védde.",
        "post-expand-template-argument-category": "Pàgine con di template che ghe mancàn di argoménti",
        "parser-template-loop-warning": "Rilevou loop do template: [[$1]]",
+       "template-loop-category": "Paggine con di template che se reciamman da lô",
+       "template-loop-category-desc": "A paggina a conten un template ch'o se reciamma da lê, saiv'a dî un template into quæ gh'è incruzo o template mæximo.",
        "parser-template-recursion-depth-warning": "Limmite de ricorscion into template superòu($1)",
        "language-converter-depth-warning": "Limmite de profonditæ do convertitô de lengoa superòu ($1)",
        "node-count-exceeded-category": "Paggine dovve l'è superòu o nummero di groppi.",
        "page_first": "primma",
        "page_last": "ûrtima",
        "histlegend": "Confronto tra verscioîn: selession-a e cascette corispondenti a-e verscioîn dexidiæ e schissa Invio oppû o pomello da basso.\n\nLegenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a verscion precedente, '''m''' = modiffica minô",
-       "history-fieldset-title": "Véddi a stöia",
-       "history-show-deleted": "Sôlo scancelæ",
+       "history-fieldset-title": "Çerca de verscioin",
+       "history-show-deleted": "Solo verscioin scassæ",
        "histfirst": "primma",
        "histlast": "urtima",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "search-file-match": "(corrispondença into contegnuo do file)",
        "search-suggest": "Fòscia ti voéivi: $1",
        "search-rewritten": "Mostro i risultæ pe $1. Atrimenti, çerca $2.",
-       "search-interwiki-caption": "Progetti fræ",
+       "search-interwiki-caption": "Risultæ da-i progetti fræ",
        "search-interwiki-default": "Risultæ da $1:",
        "search-interwiki-more": "(atro)",
+       "search-interwiki-more-results": "atri risultæ",
        "search-relatedarticle": "corelæ",
        "searchrelated": "corelæ",
        "searchall": "tùtti",
        "youremail": "Indirìsso email:",
        "username": "{{GENDER:$1|Nomme utente}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do gruppo|di gruppi}}:",
+       "group-membership-link-with-expiry": "$1 (scin a $2)",
        "prefs-registration": "Dæta de registraçion:",
        "yourrealname": "Nomme vêo:",
        "yourlanguage": "Léngoa:",
        "prefs-help-prefershttps": "Questa preferença a l'aviâ effetto da-o proscimo accesso.",
        "prefswarning-warning": "T'hæ fæto de modiffiche a-e teu preferense che no son ancon stæte sarvæ.\nSe ti sciorti da sta paggina sensa sciaccâ \"$1\" e preferense no saian agiornæ.",
        "prefs-tabs-navigation-hint": "Suggeimento: ti peu deuviâ i pomelli co-a freccia scinistra e drita pe navegâ tra e schede inta lista de schede.",
-       "userrights": "Manezzo di driti di utenti",
+       "userrights": "Driti utente",
        "userrights-lookup-user": "Seleçion-a un utente",
        "userrights-user-editname": "Scrivi o teu nomme utente:",
        "editusergroup": "Carrega groppi utente",
        "editinguser": "Apreuvo a cangiâ i driti de l'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Vixualizaçion di driti de l'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modiffica i gruppi di utenti",
-       "userrights-viewusergroup": "Vixualizza groppi utente",
+       "userrights-editusergroup": "Modiffica groppi {{GENDER:$1|utente}}",
+       "userrights-viewusergroup": "Vixualizza groppi {{GENDER:$1|utente}}",
        "saveusergroups": "Sarva groppi {{GENDER:$1|utente}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro impliçito de:",
-       "userrights-groups-help": "L'è poscibile modificâ i groppi de st'utente:\n* Una casella marcâ voeu dî che l'utente o l'è inte quello groppo.\n* Una casella smarcâ voeu dî che l'utente o no l'è inte quello groppo.\n* O scimbolo * o voeu dî che no ti poeu smarcâ o groppo una votta che ti l'hæ azonto (ò viçeversa).",
+       "userrights-groups-help": "L'è poscibile modificâ i groppi de st'utente:\n* Una casella marcâ voeu dî che l'utente o l'è inte quello groppo.\n* Una casella smarcâ voeu dî che l'utente o no l'è inte quello groppo.\n* O scimbolo * o voeu dî che no ti poeu smarcâ o groppo una votta che ti l'hæ azonto (ò viçeversa).\n* O scimbolo # o l'indica che ti poeu solo portâ inderê a dæta da descheita de l'inscriçion a questo groppo; no l'è poscibbile portala avanti",
        "userrights-reason": "Raxon:",
        "userrights-no-interwiki": "No ti g'hæ i permissi pe modificâ i driti di utenti insce di atre wiki.",
        "userrights-nodatabase": "O database $1 o no l'esiste ò o no l'è un database locale.",
        "userrights-expiry-current": "O descazze o $1",
        "userrights-expiry-none": "O no descazze",
        "userrights-expiry": "O descazze:",
+       "userrights-expiry-existing": "Scadença attoale: $2, $3",
+       "userrights-expiry-othertime": "Atra duata:",
+       "userrights-expiry-options": "1 giorno:1 day,1 setteman-a:1 week,1 meise:1 month,3 meixi:3 months,6 meixi:6 months,1 anno:1 year",
+       "userrights-invalid-expiry": "A scadença pe-o groppo \"$1\" a no l'è vallida",
+       "userrights-expiry-in-past": "A scadença pe-o groppo \"$1\" a l'è za passâ.",
+       "userrights-cannot-shorten-expiry": "No ti poeu antiçipâ a descheita de l'inscriçion a-o groppo \"$1\". Soltanto i utenti co-o permisso de azonze e rimoeuve questo groppo poeuan antiçipâ e descheite.",
        "userrights-conflict": "Conflito de modiffica di driti utente! Pe piaxei controlla e conferma e teu modiffiche.",
        "group": "Gruppo:",
        "group-user": "Ûtenti",
        "right-editsemiprotected": "Modifica e pagine protette con \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Modifica o modello de contegnuo de 'na paggina",
        "right-editinterface": "Modiffica l'interfaccia utente",
-       "right-editusercssjs": "Modifica i file CSS e JS di atri utenti",
        "right-editusercss": "Modifica i file CSS di atri utenti",
        "right-edituserjs": "Modiffica i file JS di atri utenti",
        "right-editmyusercss": "Modifica o file CSS do proppio utente",
        "action-upload_by_url": "caregâ sto file da un addreçço URL",
        "action-writeapi": "deuviâ l'API in scrittua",
        "action-delete": "scassâ 'sta paggina",
-       "action-deleterevision": "scassâ sta verscion",
-       "action-deletedhistory": "vixualizzâ a cronologia scassâ de sta pagina",
+       "action-deleterevision": "scassâ verscioin",
+       "action-deletelogentry": "scassâ e voxe de registro",
+       "action-deletedhistory": "vixualizzâ a cronologia scassâ de 'na paggina",
+       "action-deletedtext": "vixualizâ o testo de verscioin scassæ",
        "action-browsearchive": "çercâ paggine scassæ",
-       "action-undelete": "Recuppera sta paggina",
-       "action-suppressrevision": "rivedde e ripristinâ e modiffiche ascose",
+       "action-undelete": "recuperâ paggine",
+       "action-suppressrevision": "rivedde e ripristinâ e verscioin ascose",
        "action-suppressionlog": "vedde questo registro privou",
        "action-block": "bloccâ st'utente in scrittua",
        "action-protect": "modificâ i livelli de proteçion pe questa pagina",
        "action-userrights-interwiki": "modificâ i driti di utenti insce di atre wiki",
        "action-siteadmin": "broccâ e sbroccâ o database",
        "action-sendemail": "mandâ di e-mail",
+       "action-editmyoptions": "modificâ e proppie preferençe",
        "action-editmywatchlist": "modificâ a to lista di öservæ",
        "action-viewmywatchlist": "vedde i to öservæ speçiali",
        "action-viewmyprivateinfo": "vedde i proppi dæti personali",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veddi e [[Special:NewPages|neuve paggine]])",
        "recentchanges-submit": "Fanni vedde",
+       "rcfilters-activefilters": "Filtri attivi",
+       "rcfilters-quickfilters": "Inganci rappidi",
+       "rcfilters-savedqueries-defaultlabel": "Filtri sarvæ",
+       "rcfilters-savedqueries-rename": "Rinommina",
+       "rcfilters-savedqueries-setdefault": "Imposta comme predefinio",
+       "rcfilters-savedqueries-unsetdefault": "Rimoeuvi comme predefinio",
+       "rcfilters-savedqueries-remove": "Leva",
+       "rcfilters-savedqueries-new-name-label": "Nomme",
+       "rcfilters-savedqueries-apply-label": "Crea ingancio rappido",
+       "rcfilters-savedqueries-cancel-label": "Anulla",
+       "rcfilters-savedqueries-add-new-title": "Sarva filtri comme ingancio rappido",
+       "rcfilters-restore-default-filters": "Ripristina i filtri predefinii",
+       "rcfilters-clear-all-filters": "Netezza tutti i filtri",
+       "rcfilters-search-placeholder": "Filtra i urtime modiffiche (navega ò comença a digitâ)",
+       "rcfilters-invalid-filter": "Filtro non vallido",
+       "rcfilters-empty-filter": "Nisciun filtro attivo. Se ghe vedde tutti i contributi.",
+       "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-whatsthis": "Cos'o l'è sto chì?",
+       "rcfilters-filterlist-feedbacklink": "Lascia un commento in sciâ noeuva fonçionalitæ sperimentale",
+       "rcfilters-highlightbutton-title": "Evidençia risultæ",
+       "rcfilters-highlightmenu-title": "Seleçion-a un cô",
+       "rcfilters-highlightmenu-help": "Seleçion-a un cô pe evidençiâ sta propietæ",
+       "rcfilters-filterlist-noresults": "Nisciun filtro atrovou",
+       "rcfilters-noresults-conflict": "Nisciun risultou trovou percose i critei de çerchia son in conflito",
+       "rcfilters-state-message-subset": "Sto filtro chì o no g'ha effetto percose i so risultæ son incluxi con quelli  {{PLURAL:$2|do seguente filtro ciu ampio|di  seguenti filtri ciu ampi}} (proeuva a evidençiâli pe distinguili): $1",
+       "rcfilters-state-message-fullcoverage": "A seleçion de tutti i filtri inte 'n groppo l'è comme no seleçionâne manc'un, coscì che sto filtro o no fa effetto. O groppo o l'includde: $1",
+       "rcfilters-filtergroup-registration": "Registraçion utente",
+       "rcfilters-filter-registered-label": "Registrou",
+       "rcfilters-filter-unregistered-label": "Non registrou",
+       "rcfilters-filtergroup-authorship": "Aotô do contributo",
+       "rcfilters-filter-editsbyself-label": "E to modiffiche",
+       "rcfilters-filter-editsbyself-description": "I to contributi.",
+       "rcfilters-filter-editsbyother-label": "E modiffiche di atri",
+       "rcfilters-filter-editsbyother-description": "Tutte e modiffiche sarvo e to.",
+       "rcfilters-filtergroup-userExpLevel": "Livello d'esperiença (solo pe i utenti registræ)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Noeuvi utenti",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Meno de 10 modiffiche e 4 giorni d'attivitæ.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Utenti con esperiença",
+       "rcfilters-filter-user-experience-level-experienced-description": "Ciù de 30 giorni d'attivitæ e 500 modiffiche.",
+       "rcfilters-filtergroup-automated": "Contributi aotomattichi",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Modiffiche effettoæ da strumenti aotomattichi.",
+       "rcfilters-filter-humans-label": "Umoen (non bot)",
+       "rcfilters-filter-humans-description": "Modiffiche effettoæ da di contributoî umoen.",
+       "rcfilters-filtergroup-reviewstatus": "Stato da revixon",
+       "rcfilters-filter-patrolled-label": "Veificæ",
+       "rcfilters-filter-patrolled-description": "Modiffiche contrassegnæ comme veificæ.",
+       "rcfilters-filter-unpatrolled-label": "Non veificæ",
+       "rcfilters-filter-unpatrolled-description": "Modiffiche non contrassegnæ comme veificæ.",
+       "rcfilters-filtergroup-significance": "Scignificou",
+       "rcfilters-filter-minor-label": "Cangiamenti menoî",
+       "rcfilters-filter-minor-description": "Modiffiche che l'aoto o l'ha indicou comme minoî.",
+       "rcfilters-filter-major-label": "Cangiamenti non menoî",
+       "rcfilters-filter-watchlist-watched-label": "Sotta oservaçion",
+       "rcfilters-filtergroup-changetype": "Tipo de modiffica",
+       "rcfilters-filter-pageedits-label": "Modiffiche a-e paggine",
+       "rcfilters-filter-newpages-label": "Creaçioin de paggine",
+       "rcfilters-filter-logactions-description": "Açioin aministrative, creaçioin utençe, eliminaçioin paggine, caregamenti....",
+       "rcfilters-filtergroup-lastRevision": "Urtima revixon",
+       "rcfilters-filter-lastrevision-label": "Urtima revixon",
+       "rcfilters-filter-lastrevision-description": "I urtime modiffiche a 'na paggina.",
+       "rcfilters-filter-previousrevision-label": "Verscioin precedente",
        "rcnotefrom": "Chì sotta gh'è {{PLURAL:$5|o cangiamento|i cangiamenti}} a partî da <strong>$3, $4</strong> (scin a '''$1''').",
        "rclistfrom": "Fanni vedde e modiffiche apportæ partindo da $3 $2",
        "rcshowhideminor": "$1 cangiaménti minoî",
        "rcshowhidecategorization": "$1 categorizzaçion da pagina",
        "rcshowhidecategorization-show": "Fanni vedde",
        "rcshowhidecategorization-hide": "Ascondi",
-       "rclinks": "Fanni vedde i $1 cangiaménti ciù reçenti fæti inti ùrtimi $2 giorni<br />$3",
+       "rclinks": "Fanni vedde i $1 cangiaménti ciù reçenti fæti inti ùrtimi $2 giorni",
        "diff": "diff",
        "hist": "stö",
        "hide": "Ascondi",
        "wantedfiletext-nocat-noforeign": "I seguenti file son in doeuvia, ma no existan.",
        "wantedtemplates": "Template domandæ",
        "mostlinked": "Paggine ciû collegæ",
-       "mostlinkedcategories": "Categorîe ciû collegæ",
+       "mostlinkedcategories": "Categorie ciu conligæ",
        "mostlinkedtemplates": "Paggine ciu incluse",
        "mostcategories": "Voxe con ciû categorîe",
        "mostimages": "Immaggini con ciû collegamenti",
        "protectedtitles-summary": "Questa pagina a l'elenca i titoli che son attualmente protetti da-a creaçion. Pe 'n elenco de pagine existente che son protette, amia [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Tittoli protezui con sti parammetri pe-o momento no ghe n'è.",
        "protectedtitles-submit": "Mostra tittoli",
-       "listusers": "Lista dtenti",
+       "listusers": "Lista di utenti",
        "listusers-editsonly": "Mostra solo i utenti con di contributi",
        "listusers-creationsort": "Ordina pe dæta de creaçion",
        "listusers-desc": "Ordina in senso decrescente",
        "apisandbox-sending-request": "Invio recesta de API...",
        "apisandbox-loading-results": "Riceçion di risultæ de API in corso...",
        "apisandbox-results-error": "S'è veificou un errô durante o caregamento da risposta a l'interrogaçion API: $1",
+       "apisandbox-request-selectformat-label": "Mostra i dæti recesti comme:",
        "apisandbox-request-url-label": "URL de recesta:",
        "apisandbox-request-time": "Tempo richiesto: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Correzi token e reinvia",
        "magiclink-tracking-rfc-desc": "Sta paggina a l'adoeuevia di inganci maggichi RFC. Amia [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] insce comme ezeguî a migraçion.",
        "magiclink-tracking-pmid": "Paggine ch'adoeuvian di inganci maggichi PMID",
        "magiclink-tracking-pmid-desc": "Sta paggina a l'adoeuvia dio inganci maggichi PMID. Amia [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sciu comme exeguî a migraçion.",
+       "magiclink-tracking-isbn": "Paggine ch'adoeuvian di inganci maggichi ISBN",
+       "magiclink-tracking-isbn-desc": "Sta paggina a l'adoeuvia di inganci maggichi ISBN. Amia [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sciu comme exeguî a migraçion.",
        "specialloguserlabel": "Açion effettuâ da:",
        "speciallogtitlelabel": "Açion effettuâ sciu (tittolo da paggina ò {{ns:user}}:Nomme utente):",
        "log": "Log",
        "listusers-blocked": "(bloccou)",
        "activeusers": "Lista di utenti attivi",
        "activeusers-intro": "Questo o l'è un elenco di utenti ch'han avuo quarche tipo d'attivitæ da $1 {{PLURAL:$1|giorno|giorni}} a questa parte.",
-       "activeusers-count": "$1 {{PLURAL:$1|açione|açioin}} {{PLURAL:$3|inte l'urtimo giorno|inti urtimi $3 giorni}}",
+       "activeusers-count": "$1 {{PLURAL:$1|açion|açioin}} {{PLURAL:$3|inte l'urtimo giorno|inti urtimi $3 giorni}}",
        "activeusers-from": "Mostra i utenti a partî da:",
+       "activeusers-groups": "Vixualizza i utenti ch'apartegnan a di groppi:",
+       "activeusers-excludegroups": "Escluddi i utenti ch'apartegnan a di groppi:",
        "activeusers-noresult": "Nisciun utente o risponde a-i critei impostæ.",
        "activeusers-submit": "Mostra utenti attivi",
        "listgrouprights": "Driti do groppo utente",
        "emailccsubject": "Coppia do messaggio inviou a $1: $2",
        "emailsent": "E-mail spedïa",
        "emailsenttext": "A teu e-mail a l'è stæta spedïa.",
-       "emailuserfooter": "Questa email a l'è stæta {{GENDER:$1|inviâ}} da $1 a {{GENDER:$2|$2}} a traverso a fonçion \"{{int:emailuser}}\" insce {{SITENAME}}.",
+       "emailuserfooter": "Questa email a l'è stæta {{GENDER:$1|inviâ}} da $1 a {{GENDER:$2|$2}} a traverso a fonçion \"{{int:emailuser}}\" insce {{SITENAME}}. Se {{GENDER:$2|ti ghe rispondi}}, a to email de risposta a saiâ spedia direttamente {{GENDER:$1|a-o|a-a}} mittente originâ, rivelando{{GENDER:$1|ghe}} o {{GENDER:$2|to}} adresso de posta elettronica.",
        "usermessage-summary": "Messaggio de scistema",
        "usermessage-editor": "Messaggê de scistema",
        "watchlist": "Sotta osservassion",
        "undeleteviewlink": "fanni védde",
        "undeleteinvert": "Inverti a seleçion",
        "undeletecomment": "Raxon:",
-       "undeletedrevisions": "{{PLURAL:$1|Una verscion recuperâ|$1 verscioin recuperæ}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Una verscion|$1 verscioin}} e $2 file recuperæ",
-       "undeletedfiles": "{{PLURAL:$1|Un file recuperou|$1 file recuperæ}}",
        "cannotundelete": "Çerti ò tutti i ripristini non riuscii:\n$1",
        "undeletedpage": "'''A pagina $1 a l'è stæta recuperâ'''\n\nConsurta o [[Special:Log/delete|registro de scançellaçioin]] pe vedde e scançellaçioin e i recupperi ciù reçente.",
        "undelete-header": "Consurta o [[Special:Log/delete|registro de scançellaçioin]] pe vedde e scassatue ciù reçente.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|o l'ha aggiornou}} i etichette da verscion $4 da paggina $3 ({{PLURAL:$7|azonta|azonte}} $6; {{PLURAL:$9|rimossa|rimosse}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|o l'ha aggiornou}} i etichette da voxe de registro $5 de paggina $3 ({{PLURAL:$7|azonta|azonte}} $6; {{PLURAL:$9|rimossa|rimosse}} $8)",
        "rightsnone": "(nisciun)",
-       "revdelete-summary": "ögetto da modiffica",
        "feedback-adding": "Inseimento do feedback inta paggina...",
        "feedback-back": "Inderê",
        "feedback-bugcheck": "Ottimo! Controlla solo ch'o no segge za fra-i [$1 bug conosciui].",
index 453060c..2a14ffa 100644 (file)
        "yourpasswordagain": "Kēratigid sallisõnā ūtstõ:",
        "login": "Log sīezõ",
        "nav-login-createaccount": "Log sīezõ agā registrīer kȭlbatijizõks",
-       "userlogin": "Sīezõ loggimi agā kȭlbatijiz-konto lūomi",
        "logout": "Log ulzõ",
        "userlogout": "Log ulzõ",
-       "nologin": "Až täddõn äb ūo eņtš konto, '''$1'''.",
-       "nologinlink": "Registrīerõgid täs",
        "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",
        "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",
+       "rclinks": "Nägţ perīži $1 mõitõkši lǟndz $2 pǟva āigal",
        "diff": "vaiţ",
        "hist": "istōrij",
        "hide": "vaŗț",
index 24a123d..79fb84b 100644 (file)
        "login": "إ نۆم هەتن سیستم",
        "login-security": "وژت معرفی‌که",
        "nav-login-createaccount": " إ نؤم هةتن سیستم/ حساوو کاربةری سازین",
-       "userlogin": " إ نؤم هةتن سیستم/ حساوو کاربةری سازین",
-       "userloginnocreate": "نؤم هۀتن سیستم",
        "logout": "دەرچێن|خروج",
        "userlogout": "دەرچێن|خروج",
        "notloggedin": "وارد سیستم نؤینۀ",
        "userlogin-noaccount": "حساوو کاربۀری نرین؟",
        "userlogin-joinproject": "{{SITENAME}}نام نؤیسی کۀن",
-       "nologin": "حساوو کاربۀری نرین؟$1",
-       "nologinlink": "حساووئ أرا ووژتان بِسازِن",
        "createaccount": "حساووئ أرا ووژتان بِسازِن",
-       "gotaccount": "حساوو کاربۀری دِرین؟$1",
-       "gotaccountlink": "إ نۆم هەتن سیستم",
-       "userlogin-resetlink": "جزئیات ورودتە ویر(یاد)چێە؟",
        "userlogin-resetpassword-link": "رۀمزۀتان  ویر/ یاد  چئۀ؟",
        "userlogin-helplink2": "کمک با ورود",
        "userlogin-loggedin": "شما در حال حاضر به عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به عنوان یک کاربر دیگر استفاده کنید.",
        "createaccountmail": "استفاده از رمز عبور موقت تصادفی و ارسال آن به آدرس ایمیل مشخص شده",
        "createaccountmail-help": "تو مه‌تونی یک حساب ایجاد مه‌که‌ی سی کسی دیگر بدون شیفره نه‌زانی",
        "createacct-realname": "*نام راسکانی/واقعی *دل بخواهی",
-       "createaccountreason": ":دةلیل",
        "createacct-reason": "دةلیل",
        "createacct-reason-ph": "ئةرا حساووێ  تر مةسازین؟",
        "createacct-reason-help": "پیام د سیستم ایجاد خساب نمایش داده مه‌شوه",
        "preview": "پیش‌نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "گؤەڕیال(تغییرات) بۆین",
-       "blankarticle": "<strong>هوشدار:</strong> هۆمە وەڵگەتۆن سازیە پەتیە(حالیە).\nأڕ «{{int:savearticle}}» دۆِ گِل کلیک کِین ، وەڵگە بێ  نۆم جِک(محتوا) مەسازێ.",
+       "blankarticle": "<strong>هوشدار:</strong> هۆمە وەڵگەتۆن سازیە پەتیە(حالیە).\nأڕ «$1» دۆِ گِل کلیک کِین ، وەڵگە بێ  نۆم جِک(محتوا) مەسازێ.",
        "anoneditwarning": "<strong>هشدار:</strong> شما وارد نشده‌اید. نشانی آی‌پی شما برای عموم قابل مشاهده خواهد بود اگر هر تغییری ایجاد کنید. اگر <strong>[$1 وارد شوید]</strong> یا <strong>[$2 یک حساب کاربری بسازید]</strong>، ویرایش‌هایتان به نام کاربری‌تان نسبت داده خواهد شد، همراه با مزایای دیگر.",
        "anonpreviewwarning": "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.''",
-       "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
-       "selfredirect": "<strong>هشدار:</strong> شما در حال تغییرمسیر صفحه به خودش هستید.\nامکان دارد هدف اشتباهی را برای تغییرمسیر انتخاب کردید، یا ممکن است صفحهٔ اشتباهی را ویرایش می‌کنید.\n\nاگر بر روی \"{{int:savearticle}}\" دوباره کلیک کنید، تغییرمسیر ساخته خواهد شد.",
+       "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «$1» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
+       "selfredirect": "<strong>هشدار:</strong> شما در حال تغییرمسیر صفحه به خودش هستید.\nامکان دارد هدف اشتباهی را برای تغییرمسیر انتخاب کردید، یا ممکن است صفحهٔ اشتباهی را ویرایش می‌کنید.\n\nاگر بر روی \"$1\" دوباره کلیک کنید، تغییرمسیر ساخته خواهد شد.",
        "missingcommenttext": "لطفاً توضیحی در زیر بیفزایید.",
-       "missingcommentheader": "<strong>یادآوری:</strong> شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
+       "missingcommentheader": "<strong>یادآوری:</strong> شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «$1» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "summary-preview": "پیش‌نمایش خلاصه:",
        "subject-preview": ":پیش‌نمایش موضوع",
        "previewerrortext": "در زمان تلاش برای نمایش دادن تغییرات شما، خطای رخ داد.",
        "editingsection": ")در حال ویرایش $1 (بخش",
        "editingcomment": "در حال ویرایش $1 (بخش تازه)",
        "editconflict": "تعارض ویرایشی: $1",
-       "explainconflict": "از وقتی ویرایش این صفحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده است.\nناحیهٔ متنی بالایی شامل متن صفحه به شکل کنونی آن است.\nتغییرات شما در ناحیهٔ متنی پایینی نشان داده شده‌است.\nشما باید تغییراتتان را با متن کنونی ترکیب کنید.\nبا فشردن دکمهٔ «{{int:savearticle}}» <strong>فقط</strong> متن ناحیهٔ متنی بالایی ذخیره خواهد شد.",
+       "explainconflict": "از وقتی ویرایش این صفحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده است.\nناحیهٔ متنی بالایی شامل متن صفحه به شکل کنونی آن است.\nتغییرات شما در ناحیهٔ متنی پایینی نشان داده شده‌است.\nشما باید تغییراتتان را با متن کنونی ترکیب کنید.\nبا فشردن دکمهٔ «$1» <strong>فقط</strong> متن ناحیهٔ متنی بالایی ذخیره خواهد شد.",
        "yourtext": "متن شما",
        "storedversion": "نسخهٔ ذخیره شده",
        "nonunicodebrowser": "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.'''\nراه حلی به کار گرفته شده تا شما بتوانید صفحات را با امنیت ویرایش کنید: کاراکترهای غیر ASCII به صورت کدهایی در مبنای شانزده به شما نشان داده می‌شوند.",
        "right-editsemiprotected": "ویرایش صفحه حفاظت‌شده به عنوان \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "ویرایش مدل محتوای یک صفحه",
        "right-editinterface": "ویرایش واسط کاربری",
-       "right-editusercssjs": "ویرایش صفحه‌های CSS و JS دیگر کاربرها",
        "right-editusercss": "ویرایش صفحه‌های CSS دیگر کاربرها",
        "right-edituserjs": "ویرایش صفحه‌های JS دیگر کاربرها",
        "right-editmyusercss": "پرونده‌های سی‌اس‌اس کاربری خود را ویرایش کنید",
        "rcshowhidecategorization": "$1 رده‌بندی صفحه‌ها",
        "rcshowhidecategorization-show": "نیشان دائن",
        "rcshowhidecategorization-hide": "ئآشاردن-پنهان کردن",
-       "rclinks": "نمایش آخرین $1 تغییر در $2 روز اخیر<br />$3",
+       "rclinks": "نمایش آخرین $1 تغییر در $2 روز اخیر",
        "diff": "تفاوت",
        "hist": "تاریخچۀ",
        "hide": "ئآشاردن-پنهان کردن",
        "undeleteviewlink": "دیین/سئرکردن",
        "undeleteinvert": "انتخاب بپلئ/برعۀسگ بؤ",
        "undeletecomment": ":دةلیل",
-       "undeletedrevisions": "$1 نسخه احیا {{PLURAL:$1|شد}}",
-       "undeletedrevisions-files": "$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
-       "undeletedfiles": "$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
        "cannotundelete": "احیا ناموفق بود:\n$1",
        "undeletedpage": "'''$1 احیا شد'''\n\nبرای دیدن سیاههٔ حذف‌ها و احیاهای اخیر به  [[Special:Log/delete|سیاههٔ حذف]] رجوع کنید.",
        "undelete-header": "برای دیدن صفحه‌های حذف‌شدهٔ اخیر [[Special:Log/delete|سیاههٔ حذف]] را ببینید.",
        "logentry-tag-update-revision": "$1 برچسب نسخهٔ $4 صفحهٔ $3 را {{GENDER:$2|به‌روز کرد}} ($6 {{PLURAL:$7|افزوده‌شد}}؛ $8 {{PLURAL:$9|حذف شد}})",
        "logentry-tag-update-logentry": "$1 برچسب سیاههٔ $5 صفحهٔ $3 را {{GENDER:$2|به‌روز کرد}} ($6 {{PLURAL:$7|افزوده‌شد}}؛ $8 {{PLURAL:$9|حذف شد}})",
        "rightsnone": "(هؤیچ کام)",
-       "revdelete-summary": "خلاصة دةسکاری",
        "feedback-adding": "افزودن بازخورد به وةڵگة ...",
        "feedback-back": "گِل آوردن/برگشت",
        "feedback-bugcheck": "عالی‌است! فقط بررسی کنید که از [$1 ایرادهای شناخته‌شده] نباشد.",
index 0555632..f2754e6 100644 (file)
        "externaldberror": "Gh'è 'n erùr söl server de autenticasiù estèrno o sedenò se g'ha mìa le autorizasiù nesesàre per agiurnà i dati de registrasiù estèrni.",
        "login": "Va dent",
        "nav-login-createaccount": "Vena denter / Crea un cünt",
-       "userlogin": "Vegní denter - Creè un cünt",
-       "userloginnocreate": "Vegn denter",
        "logout": "Va fö",
        "userlogout": "Và fö",
        "notloggedin": "Te seet minga dent in del sistema",
        "userlogin-noaccount": "Sét gnemò registràt?",
        "userlogin-joinproject": "Regìstret sö {{SITENAME}}",
-       "nologin": "Gh'avii anmò da registrav? $1.",
-       "nologinlink": "Creé un cünt!",
        "createaccount": "Creá un cünt",
-       "gotaccount": "Gh'hee-t giamò un cünt? '''$1'''.",
-       "gotaccountlink": "Va dent in del sistema",
-       "userlogin-resetlink": "Sét desmentegàt i tò dati de autenticasiù?",
        "userlogin-resetpassword-link": "Sét desmentegàt la tò password?",
        "userlogin-helplink2": "G'hét bezògn de 'na mà per autenticàt?",
        "userlogin-loggedin": "Te sét zabèla autenticàt come {{GENDER:$1|$1}}.\nDòpra el mòdulo ché sóta per turnà a autenticàt come 'n óter ütènt.",
        "createacct-another-email-ph": "Mét dét l'indirìs e-mail",
        "createaccountmail": "Dòpra 'na password a càzo temporànea e màndela a l'indirìs e-mail specificàt",
        "createacct-realname": "Nòm véro (upsiunàl)",
-       "createaccountreason": "Mutìf:",
        "createacct-reason": "Mutìf:",
        "createacct-reason-ph": "Che fòza che sét dré a creà 'n ótra ütènsa?",
        "createacct-submit": "Créa la tò ütènsa",
        "editingsection": "Mudifega de $1 (sezión)",
        "editingcomment": "Adree a mudifegà $1 (sezión növa)",
        "editconflict": "Cunflit de edisiù sö $1",
-       "explainconflict": "'N óter ütènt el g'ha salvàt 'na versiù nöa de l'articol entàt che te sìet dré a fà le tò mudìfiche.\nL'area de mudìfica de sura la g'ha dét el test de la pàgina che gh'è on-line adès, isé come che l'è stat agiurnàt de l'óter ütènt.\nLa versiù co le tò mudìfiche envéce te la tróet endèl'area de mudìfica de sòta.\nSemài che te ölarèset confermàle, te g'hét de riportà le tò mudìfiche endèl tèst de l'area de sura.\nA schisà el butù '{{int:savearticle}}', se salvarà '''apéna''' el test che gh'è dét endèl'àrea de mudìfica de sura.",
+       "explainconflict": "'N óter ütènt el g'ha salvàt 'na versiù nöa de l'articol entàt che te sìet dré a fà le tò mudìfiche.\nL'area de mudìfica de sura la g'ha dét el test de la pàgina che gh'è on-line adès, isé come che l'è stat agiurnàt de l'óter ütènt.\nLa versiù co le tò mudìfiche envéce te la tróet endèl'area de mudìfica de sòta.\nSemài che te ölarèset confermàle, te g'hét de riportà le tò mudìfiche endèl tèst de l'area de sura.\nA schisà el butù '$1', se salvarà '''apéna''' el test che gh'è dét endèl'àrea de mudìfica de sura.",
        "yourtext": "El tò test",
        "storedversion": "La versiù en memória",
        "editingold": "<strong>Ocio: Te sét dré a mudificà 'na versiù mìa agiurnàda de chèsta pàgina.</strong> Semài che te la sàlvet, töcc i cambiamèncc facc dòpo de chèsta versiù le narà pèrde.",
        "saveprefs": "Tegn i mudifech",
        "restoreprefs": "Ristabiliss i impustazión de default (en töte le sesiù)",
        "prefs-editing": "Cazèla de mudìfica",
-       "rows": "Riich:",
-       "columns": "Culònn:",
        "searchresultshead": "Cerca",
        "stub-threshold-disabled": "Dezativàt",
        "recentchangesdays": "Dé de fà éder endèi öltem cambiamèncc:",
        "userrights-reason": "Reson:",
        "userrights-no-interwiki": "Te gh'hee mía i permiss necessari per pudè mudifegà i dirit di druvadur di olter wiki.",
        "userrights-nodatabase": "La base dat $1 a gh'é mia, o pura a l'é mia locala.",
-       "userrights-nologin": "Al gh'a da [[Special:UserLogin|rintrà ent el sistema]] con un cunt d'administrator par podé dà di drecc ai dovracc.",
-       "userrights-notallowed": "Te g'hét mìa l'autorizasiù per mudificà i permès de ütènt.",
        "userrights-changeable-col": "Grüp che te pö mudifegà",
        "userrights-unchangeable-col": "Grüp che te pö mia mudifegà",
        "group-user": "Druvadur",
        "rcshowhidemine": "$1 i mè mudifich",
        "rcshowhidemine-show": "Fà ved",
        "rcshowhidemine-hide": "Scond",
-       "rclinks": "Fà vedé i ültim $1 cambiament in di ültim $2 dì<br />$3",
+       "rclinks": "Fà vedé i ültim $1 cambiament in di ültim $2 dì",
        "diff": "dif",
        "hist": "stòria",
        "hide": "Scund",
        "undeleteviewlink": "arda",
        "undeleteinvert": "Invertì la seleziòn",
        "undeletecomment": "Mutìf:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 versiun}} rimetüü a post",
        "undelete-search-title": "Sérca pàgine scancelàde",
        "undelete-search-box": "Sérca pàgine scancelàde",
        "undelete-search-prefix": "Fà ved i paginn che scumenzen per:",
index 7c0baaa..88c1fa4 100644 (file)
        "rcshowhideliu": "$1 basáleli bamíkitólí",
        "rcshowhideanons": "$1 basáleli sóngóló",
        "rcshowhidemine": "$1 mbóngwana ya ngáí",
-       "rclinks": "Komɔ́nisa mbóngwana $1 ya nsúka o mikɔlɔ $2<br />$3",
+       "rclinks": "Komɔ́nisa mbóngwana $1 ya nsúka o mikɔlɔ $2",
        "diff": "mbó.",
        "hist": "mokóló",
        "hide": "kobomba",
index 15b6624..7b5cfb0 100644 (file)
@@ -9,12 +9,12 @@
                ]
        },
        "tog-underline": "ການຂີດເສັ້ນກ້ອງລິງກ໌:",
-       "tog-hideminor": "à»\80àº\8aືà»\88ອàº\87àº\81າàº\99à»\81àº\81à»\89à»\84àº\82à»\80ລັàº\81àº\99à»\89ອàº\8dà»\83àº\99à»\9cà»\89າàº\9bັàº\9aàº\9bຸງລ້າສຸດ",
+       "tog-hideminor": "à»\80àº\8aືà»\88ອàº\87àº\81າàº\99à»\81àº\81à»\89à»\84àº\82à»\80ລັàº\81àº\99à»\89ອàº\8dà»\83àº\99à»\9cà»\89າàº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bງລ້າສຸດ",
        "tog-hidepatrolled": "ເຊື່ອງການແກ້ໄຂທີ່ກວດສອບແລ້ວໃນໜ້າປັບປຸງລ້າສຸດ",
        "tog-newpageshidepatrolled": "ເຊື່ອງໜ້າທີ່ກວດສອບແລ້ວໃນລາຍການໜ້າໃໝ່",
        "tog-hidecategorization": "ເຊື່ອງການຈັດໝວດໝູ່ໜ້າ",
        "tog-extendwatchlist": "ຂະຫຍາຍລາຍການຕິດຕາມໃຫ້ສະແດງການປ່ຽນແປງທັງໝົດ, ບໍ່ແມ່ນພຽງການປ່ຽນແປງລ້າສຸດ",
-       "tog-usenewrc": "àº\88ັàº\94àº\81ຸà»\88ມàº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bàº\87à»\81àº\9aà»\88àº\87àº\95າມà»\9cà»\89າຢູà»\88à»\83àº\99ລາàº\8dàº\81າàº\99àº\9bັàº\9aàº\9bຸງລ້າສຸດແລະລາຍການຕິດຕາມ",
+       "tog-usenewrc": "àº\88ັàº\94àº\81ຸà»\88ມàº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bàº\87à»\81àº\9aà»\88àº\87àº\95າມà»\9cà»\89າຢູà»\88à»\83àº\99ລາàº\8dàº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bງລ້າສຸດແລະລາຍການຕິດຕາມ",
        "tog-numberheadings": "ກຳນົດເລກຫົວເລື່ອງອັດຕະໂນມັດ",
        "tog-showtoolbar": "ສະແດງແຖບເຄື່ອງມືແກ້ໄຂ",
        "tog-editondblclick": "ແກ້ໄຂໜ້າເມື່ອກົດສອງເທື່ອ",
        "login": "ເຂົ້າສູ່ລະບົບ",
        "login-security": "ຢືນຢັນຕົວຕົນຂອງທ່ານ",
        "nav-login-createaccount": "ເຂົ້າສູ່ລະບົບ / ສ້າງບັນຊີ",
-       "userlogin": "ເຂົ້າສູ່ລະບົບ / ສ້າງບັນຊີ",
-       "userloginnocreate": "ເຂົ້າສູ່ລະບົບ",
        "logout": "ອອກຈາກລະບົບ",
        "userlogout": "ອອກຈາກລະບົບ",
        "notloggedin": "ບໍ່ໄດ້ເຂົ້າສູ່ລະບົບ",
        "userlogin-noaccount": "ຍັງບໍ່ມີບັນຊີເທື່ອບໍ່?",
        "userlogin-joinproject": "ເຂົ້າຮ່ວມກັບ {{SITENAME}}",
-       "nologin": "ຍັງບໍ່ມີບັນຊີເທື່ອບໍ່? $1.",
-       "nologinlink": "ສ້າງບັນຊີໃໝ່",
        "createaccount": "ສ້າງບັນຊີ",
-       "gotaccount": "ມີບັນຊີແລ້ວບໍ? $1.",
-       "gotaccountlink": "ເຂົ້າສູ່ລະບົບ",
-       "userlogin-resetlink": "ລືມຂໍ້ມູນການເຂົ້າສູ່ລະບົບຂອງທ່ານບໍ່?",
        "userlogin-resetpassword-link": "ລືມລະຫັດຜ່ານຂອງທ່ານບໍ່?",
        "userlogin-helplink2": "ວິທີໃຊ້ການເຂົ້າສູ່ລະບົບ",
        "userlogin-loggedin": "ທ່ານໄດ້ເຂົ້າສູ່ລະບົບໃນຊື່ {{GENDER:$1|$1}} ແລ້ວ.\nກະລຸນາໃຊ້ແບບຟອມຂ້າງລຸ່ມເພື່ອເຂົ້າສູ່ລະບົບໃນຊື່ອື່ນໆ.",
        "createaccountmail": "ໃຊ້ລະຫັດຜ່ານແບບສຸ່ມຊົ່ວຄາວແລະສົ່ງມັນໄປໃຫ້ທີ່ຢູ່ອີເມວທີ່ລະບຸ",
+       "createacct-another-submit": "ສ້າງບັນຊີ",
        "badretype": "ລະຫັດຜ່ານທີ່ທ່ານໄດ້ພິມຄືນບໍ່ກົງກັບທີ່ພິມກ່ອນ.",
        "loginerror": "ຂໍ້ຜິດພາດໃນການເຂົ້າສູ່ລະບົບ",
        "createacct-error": "ຂໍ້ຜິດພາດໃນການສ້າງບັນຊີ",
        "minoredit": "ນີ້ແມ່ນການດັດແກ້ເລັກນ້ອຍ",
        "watchthis": "ຕິດຕາມໜ້ານີ້",
        "savearticle": "ບັນທຶກ",
+       "publishpage": "ເຜີຍແຜ່ໜ້າ",
+       "publishchanges": "ເຜີຍແຜ່ການປ່ຽນແປງ",
        "preview": "ລອງເບິ່ງຜົນ",
        "showpreview": "ລອງເບິ່ງຜົນ",
        "showdiff": "ສະແດງສ່ວນຕ່າງ",
        "skin-preview": "ລອງເບິ່ງ",
        "datedefault": "ແນວໃດກໍ່ໄດ້",
        "prefs-personal": "ຂໍ້ມູນຫຼັກຜູ້ໃຊ້",
-       "prefs-rc": "àº\81າàº\99àº\94ັàº\94à»\81àº\81à»\89ຫຼ້າສຸດ",
+       "prefs-rc": "àº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bàº\87ຫຼ້າສຸດ",
        "prefs-watchlist": "ລາຍການຕິດຕາມ",
        "prefs-watchlist-days": "ຈຳນວນມື້ສະແດງ ໃນ ລາຍການຕິດຕາມ:",
        "prefs-watchlist-edits": "ຈຳນວນການດັດແກ້ ສະແດງ ໃນ ລາຍການຕິດຕາມທີ່ຂະຫຍາຍອອກ:",
        "saveprefs": "ບັນທຶກ",
        "prefs-editing": "ການດັດແກ້",
        "searchresultshead": "ຊອກຫາ",
-       "recentchangesdays": "ຈຳນວນມື້ສະແດງໃນການປ່ຽນແປງຫຼ້າສຸດ:",
+       "recentchangesdays": "àº\88ຳàº\99ວàº\99ມືà»\89àº\97ີà»\88àº\88ະສະà»\81àº\94àº\87à»\83àº\99àº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bàº\87ຫຼà»\89າສຸàº\94:",
        "recentchangescount": "ຈຳນວນການແກ້ໄຂທີ່ຕ້ອງການສະແດງໂດຍປະລິຍາຍ:",
+       "prefs-help-recentchangescount": "ລາຍການນີ້ປະກອບດ້ວຍການປ່ຽນແປງຫຼ້າສຸດ, ປະຫວັດໜ້າ, ແລະບັນທຶກ.",
        "savedprefs": "ການຕັ້ງຄ່າຂອງທ່ານໄດ້ຖືກບັນທຶກແລ້ວ.",
        "timezonelegend": "ເຂດເວລາ:",
        "localtime": "ເວລາທ້ອງຖິ່ນ:",
        "rcshowhideliu": "$1 ຜູ້ໃຊ້ໄດ້ເຊັນເຂົ້າ",
        "rcshowhideanons": "$1 ຜູ້ໃຊ້ບໍ່ສະແດງຊື່",
        "rcshowhidemine": "$1 ການດັດແກ້ໂດຍຂ້ອຍ",
-       "rclinks": "ສະແດງ $1ການປ່ຽນແປງ ຫຼ້າສຸດ ໃນ  $2ມື້ຫຼ້າສຸດ<br />$3",
+       "rclinks": "ສະແດງ $1ການປ່ຽນແປງ ຫຼ້າສຸດ ໃນ  $2ມື້ຫຼ້າສຸດ",
        "diff": "ສ່ວນຕ່າງ",
        "hist": "ປະຫວັດ",
        "hide": "ເຊື່ອງ",
index 3b90e11..4f6e44d 100644 (file)
        "yourdomainname": "Zwa domeni:",
        "login": "Menuhile",
        "nav-login-createaccount": "Menuhile / ipupezi sebelu",
-       "userlogin": "Menuhile / ipupezi sebelu",
        "logout": "Ile",
        "userlogout": "Ile",
        "notloggedin": "Ile sa akwezi",
-       "nologin": "Ni menuhile? '''$1'''.",
-       "nologinlink": "Ipupezi sebelu",
        "createaccount": "Ipupezi sebelu",
-       "gotaccount": "Xete a sa sebelu? '''$1'''.",
-       "gotaccountlink": "Menuhile",
        "createaccountmail": "dimeli",
        "badretype": "Sebu dafi ni sa identikali.",
        "userexists": "Sebu di sebelu sa sebelize. Hloli veti sebu petuho.",
        "prefs-watchlist": "Mukoloko di kentezi",
        "saveprefs": "Bulukezi",
        "prefs-editing": "Hloli ye ng'i",
-       "rows": "Roo:",
-       "columns": "Kalom:",
        "searchresultshead": "Fatukile",
        "default": "auto",
        "prefs-files": "Imegini",
        "rcshowhideanons": "$1 IP",
        "rcshowhidepatr": "$1 afina patoli",
        "rcshowhidemine": "$1 zwa afina",
-       "rclinks": "Kamukile lapu-lila $1 petuhoni di lapu-lila $2 dia<br />$3",
+       "rclinks": "Kamukile lapu-lila $1 petuhoni di lapu-lila $2 dia",
        "diff": "petuho",
        "hist": "bundau",
        "hide": "Cwankekile",
index 4a39965..b003893 100644 (file)
        "externaldberror": "ئشتئڤایی د ئرتئڤاط ڤا رئسینە گا پیش ئوٙماە یا شوما صئلا یأنە کئ یئ گئل حئساڤ خارجی خوتوٙنە ڤئ هئنگوم سازی بأکیت ناریت.",
        "login": "ڤامین ئوٙمائن",
        "nav-login-createaccount": " ڤامین ئوٙمائن/راس کئردئن حئساڤ",
-       "userlogin": " ڤامین ئوٙمائن/راس کئردئن حئساڤ",
-       "userloginnocreate": "ڤامین ئوٙمائن",
        "logout": "د ساموٙنە دئرئوٙمائن",
        "userlogout": "د ساموٙنە دئرئوٙمائن",
        "notloggedin": "نأبوٙأ بیائیت ڤامین",
        "userlogin-noaccount": "یئ گئل حئساڤ ناریت؟",
        "userlogin-joinproject": "أندوم دیارگە {{SITENAME}} بوٙئیت",
-       "nologin": "یئ گئل حئساڤ کاریاری ناريت؟$1",
-       "nologinlink": "یئ گئل حئساڤ راس بأکیت",
        "createaccount": "حئساڤ راس بأکیت",
-       "gotaccount": "ئیسئنی حئساڤ کاریاری داریت؟$1",
-       "gotaccountlink": "ڤامین ئوٙمائن",
-       "userlogin-resetlink": "جوزییات ڤامین ئوٙمائنئ توٙنە د ڤیر بوردیتە؟",
        "userlogin-resetpassword-link": "رازینە گوڤاردئنتوٙ د ڤیرئتوٙ رأتە؟",
        "userlogin-helplink2": "هومیاری کئردئن د طأریق ڤامین ئوٙمائن",
        "userlogin-loggedin": "شوما ئیسئ چی یئ گئل {{GENDER:$1|$1}} ئوٙمایتە ڤامین.نوم بألگە هاری نە سی ڤامین ئوٙمائن چی یئ گئل کاریار هأنی بلگه هاری سی وا مین اومائن چی یه گل کاریار هنی ڤئ کار بئیریت.",
        "createacct-another-email-ph": "تیرنئشوٙن أنجومانامە توٙنە بأزأنیت",
        "createaccountmail": "یئ گئل رازینە گوڤاردئن موڤأقأتینە ڤئ کار بئیریت و ڤئ نەسی یئ گئل تیرنئشوٙن أنجومانامە تیار بییە کئل بأکیت.",
        "createacct-realname": "نوم راستأکی(مأژبوٙری نی)",
-       "createaccountreason": "دألیل:",
        "createacct-reason": "دألیل",
        "createacct-reason-ph": "سی چی شوما داریت یئ گئل حئساڤ هأنی راس میکید",
        "createacct-submit": "حئسأڤ خوتوٙنە راس بأکیت",
        "preview": "پيش سئيل",
        "showpreview": "نئشوٙ دأئن پیش سئیل",
        "showdiff": "نئشوٙ دأئن آلئشت کاریا",
-       "blankarticle": "<strong>زنئار:</strong> بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"{{int:savearticle}}\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.",
+       "blankarticle": "<strong>زنئار:</strong> بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"$1\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.",
        "anoneditwarning": "<strong>زئنار:</strong> شوما هأنی نیوٙمایتە ڤامین. تیرنئشوٙن آی پی شوما سی هأر گاتی کئ آلئشتکاری بأکیت سی کول خألک دیاری می کە. أر <strong>[$1 روئیت ڤامین]</strong> یا <strong>[$2 یئ گئل حئساڤ کاریاری راس بأکیت]</strong>، ڤیرایئشتیا شوما ڤئ نوم کاریاری خوتوٙ دیاری می کە و سی شوما بیتأرە.",
        "anonpreviewwarning": "<em>شوما نیوٙمایتە ڤامین. تیرنئشوٙن آی پی شوما د ڤیرگار ڤیرایئشت ئی بألگە ئمایە بوٙە.</em>",
-       "missingsummary": "<strong>ڤیر دیارکو:</strong> شوما هأنی یئ گئل چئکئسە ڤیرایئشتی نە نئها ئمایە کاری نأکئردیتە.\nأر شوما د نۊ د ری \"{{int:savearticle}}\" بأپوٙرنیت، ڤیرایئشت کاری شوما حالی ئمایە بوٙە.",
-       "selfredirect": "<strong>هوشدار:</strong> شوما د حال و بال ڤاگأردوٙنی ئی بألگە د خوش هیین.\nگاسی دال ئشتئڤایی سی ڤاگأردوٙنی ئنتئخاڤ کئردیتە، یا گاسی بألگە نە ئشتئڤایی ڤیرایئشت کاری می کیت.\nأر ری \"{{int:savearticle}}\" دۊ گئل بأپوٙرنیت، ڤاگأردوٙنی راس موٙە.",
+       "missingsummary": "<strong>ڤیر دیارکو:</strong> شوما هأنی یئ گئل چئکئسە ڤیرایئشتی نە نئها ئمایە کاری نأکئردیتە.\nأر شوما د نۊ د ری \"$1\" بأپوٙرنیت، ڤیرایئشت کاری شوما حالی ئمایە بوٙە.",
+       "selfredirect": "<strong>هوشدار:</strong> شوما د حال و بال ڤاگأردوٙنی ئی بألگە د خوش هیین.\nگاسی دال ئشتئڤایی سی ڤاگأردوٙنی ئنتئخاڤ کئردیتە، یا گاسی بألگە نە ئشتئڤایی ڤیرایئشت کاری می کیت.\nأر ری \"$1\" دۊ گئل بأپوٙرنیت، ڤاگأردوٙنی راس موٙە.",
        "missingcommenttext": "لوطف بأکیت ئیچئ ڤیر و باڤأرئ خوتوٙنە بأنیست.",
-       "missingcommentheader": "<strong>د ڤیر ڤونا:</strong> شوما هأنی یئ گئل داسوٙن/سأرڤأن سی ئی ڤیر و باڤأر نئها ئمایە نأکئردیتە.\nأر شوما یئ گئل هأنی ری \"{{int:savearticle}}\" بأپوٙرنیت، ڤیرایئشت کاری شوما حالی ئمایە بوٙە.",
+       "missingcommentheader": "<strong>د ڤیر ڤونا:</strong> شوما هأنی یئ گئل داسوٙن/سأرڤأن سی ئی ڤیر و باڤأر نئها ئمایە نأکئردیتە.\nأر شوما یئ گئل هأنی ری \"$1\" بأپوٙرنیت، ڤیرایئشت کاری شوما حالی ئمایە بوٙە.",
        "summary-preview": "چئکئسە پیش سئیل:",
        "subject-preview": "داسوٙن/پیش سئیل سأرخأط:",
        "previewerrortext": "یئ گئل خأطا د گاتی کئ شوما میهاستیت یئ گئل پیش سئل د آلئشتیاتوٙ داشتوٙین پیش ئوٙماە.",
        "editingsection": "د حال و بال ڤیرایئشت $1 (بأرجا$1)",
        "editingcomment": "د حال و بال ڤیرایئشت $1 (بأرجا تازە)",
        "editconflict": "ری ڤئ ری کاری د ڤیرایئشت: $1",
-       "explainconflict": "د گاتی کئ شوما شوروٙ د ڤیرایئشت کاری د بألگە کئردیتە، یئ کأس ھأنی ئی بألگە نئ آلئشت دئە.\nراساگە ڤارو نیسئسە بألگە، نیسئسە نە چی یە کئ ڤوجوٙد داشتوٙە د ڤأر گئرئتە.\nآلئشتکاریا شوم د نیسئسە ھاری دیاری میکە.\nشوما بایأد آلئشت کاریاتوٙنە د نیسئسە یی کئ ھیش سأریأک بأکیت.\nفأقأط نیسئسە یی کئ ھا د ڤارو د گاتی کئ شوما\"{{int:savearticle}}\" نە گوزارئشت میکیت ئمایە بوٙە.",
+       "explainconflict": "د گاتی کئ شوما شوروٙ د ڤیرایئشت کاری د بألگە کئردیتە، یئ کأس ھأنی ئی بألگە نئ آلئشت دئە.\nراساگە ڤارو نیسئسە بألگە، نیسئسە نە چی یە کئ ڤوجوٙد داشتوٙە د ڤأر گئرئتە.\nآلئشتکاریا شوم د نیسئسە ھاری دیاری میکە.\nشوما بایأد آلئشت کاریاتوٙنە د نیسئسە یی کئ ھیش سأریأک بأکیت.\nفأقأط نیسئسە یی کئ ھا د ڤارو د گاتی کئ شوما\"$1\" نە گوزارئشت میکیت ئمایە بوٙە.",
        "yourtext": "نیسئسە شوما",
        "storedversion": "ڤانئیأری ئمایە بییە",
        "nonunicodebrowser": "<strong>د ڤیرئتوٙبا:دوڤارتە نیأر شوما ڤا نیسئسە یا یوٙنیکود سازئگاری نارە.</strong>\nیئ گئل را حأل ڤئ کار گئرئتئ بییە سی یە کئ شوما بألگە یا نە ڤا أمنیأت ڤیرایئشت بأکیت:\nنیسئسە یا غئر-ASCII  د پایە رازینە یا 16 تایی سی توٙ دیاری میکە.",
        "right-editsemiprotected": "ویرایشت بلگه یا پر و پیم بیه چی «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "ویرایشت مدل مینونه یه گل بلگه",
        "right-editinterface": "راوط کاریار نه ویرایشت کو",
-       "right-editusercssjs": "جانیایا جاوا اسکریپت و سی اس اس کاریاریا هنی نه ویرایشت کو",
        "right-editusercss": "جانیایا سی اس اس کاریاریا هنی نه ویرایشت کو",
        "right-edituserjs": "جانیایا جاوا اسکریپت کاریاریا هنی نه ویرایشت کو",
        "right-editmyusercss": "جانیایا سی اس اس کاریار خوتو نه ویرایشت کو",
        "undeleteviewlink": "ديئن",
        "undeleteinvert": "انتخاو برعسك بوئه",
        "undeletecomment": "دألیل:",
-       "undeletedrevisions": "وانئری$1 د نو زنه{{PLURAL:$1|بی}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 وانئری|$1 وانئریا}} و{{PLURAL:$2|1 جانیا|$2 جانیا}} د نو زئنه بینه.",
-       "undeletedfiles": "{{PLURAL:$1|1 جانیا|$1 جانیایا}} د نو زنه بیه",
        "cannotundelete": "زنه کردن انجوم نبی:$1",
        "undeletedpage": "'''$1 د نو زنه بی'''\n\nسی دیئن پهرستنومه پاکساکاریا و د نو زنه کردنیا ایسنی روئیت د [[Special:Log/delete|پهرستنوم پاکساکاری]].",
        "undelete-header": "سی دیئن بلگه یا پاکسا بیه ایسنی [[Special:Log/delete|پهرستونمه پاکسا بیین]] نه سیل بکیت.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|وه هنگوم سازی کرد}} سردیسیا نه د وانئری $4 د بلگه $3 ({{PLURAL:$7|اضاف کرد}} $6; {{PLURAL:$9|جا وه جاکاری کرد}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|وه هنگوم سازی کرد}} سردیسیا نه د پهرستنومه $4 د بلگه $3 ({{PLURAL:$7|اضاف کرد}} $6; {{PLURAL:$9|جا وه جاکاری کرد}} $8)",
        "rightsnone": "(هيش كوم)",
-       "revdelete-summary": "چکسه ویرایشت",
        "feedback-adding": "اضاف کردن هوال حون یار د بلگه....",
        "feedback-back": "دما",
        "feedback-bugcheck": "عالیه! فقط وارسی بکیت که د کنید که [$1 ایراتیا دیار بیه] نبا.",
index 9d4c115..aefa164 100644 (file)
@@ -35,7 +35,8 @@
                        "Macofe",
                        "Zygimantus",
                        "Matma Rex",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Nersip"
                ]
        },
        "tog-underline": "Nuorodos pabraukimas:",
        "login": "Prisijungti",
        "login-security": "Patvirtinkite savo tapatybę",
        "nav-login-createaccount": "Prisijungti / sukurti paskyrą",
-       "userlogin": "Prisijungti / sukurti paskyrą",
-       "userloginnocreate": "Prisijungti",
        "logout": "Atsijungti",
        "userlogout": "Atsijungti",
        "notloggedin": "Neprisijungęs",
        "userlogin-noaccount": "Neturite paskyros?",
        "userlogin-joinproject": "Prisijungti prie {{SITENAME}}",
-       "nologin": "Neturite prisijungimo vardo? '''$1'''.",
-       "nologinlink": "Sukurkite paskyrą",
        "createaccount": "Sukurti paskyrą",
-       "gotaccount": "Jau turite paskyrą? '''$1'''.",
-       "gotaccountlink": "Prisijunkite",
-       "userlogin-resetlink": "Pamiršote savo prisijungimo duomenis?",
        "userlogin-resetpassword-link": "Pamiršote savo slaptažodį?",
        "userlogin-helplink2": "Padėti prisijungti",
        "userlogin-loggedin": "Jūs jau prisijungęs kaip {{GENDER:$1|$1}}.\nNaudokite žemiau pateiktą pavidalą, kad prisijungtumėte kaip kitas naudotojas.",
        "createaccountmail": "Naudokite laikiną atsitiktinį slaptažodį ir nusiųskite jį į elektroninį paštą, nurodytą žemiau.",
        "createaccountmail-help": "Gali būti naudojamas paskyros sukūrimui kitam asmeniui, neatskleidžiant slaptažodžio.",
        "createacct-realname": "Vardas (neprivaloma)",
-       "createaccountreason": "Priežastis:",
        "createacct-reason": "Priežastis",
        "createacct-reason-ph": "Kodėl kuriate kitą paskyrą",
        "createacct-reason-help": "Pranešimas rodomas paskyros sukūrimo žurnale",
        "watchthis": "Stebėti šį puslapį",
        "savearticle": "Išsaugoti puslapį",
        "savechanges": "Išsaugoti pakeitimus",
-       "publishpage": "Skelbti puslapį",
-       "publishchanges": "Skelbti pakeitimus",
+       "publishpage": "Išsaugoti puslapį",
+       "publishchanges": "Išsaugoti pakeitimus",
        "preview": "Peržiūra",
        "showpreview": "Rodyti peržiūrą",
        "showdiff": "Rodyti skirtumus",
-       "blankarticle": "<strong>Dėmesio:</strong> Jūsų kuriamas straipsnis yra tuščias. Jei vėl paspausite \"{{int:savearticle}}\", puslapis bus sukurtas be jokio turinio.",
+       "blankarticle": "<strong>Dėmesio:</strong> Jūsų kuriamas straipsnis yra tuščias. Jei vėl paspausite \"$1\", puslapis bus sukurtas be jokio turinio.",
        "anoneditwarning": "<strong>Dėmesio:</strong> Jūs nesate prisijungęs. Jūsų IP adresas bus viešai matomas, jei atliksite kokius nors keitimus. Jeigu <strong>[$1 prisijungsite]</strong> arba <strong>[$2 sukursite paskyrą]</strong>, jūsų keitimai bus priskirti jūsų naudotojo vardui; drauge įgysite naujų galimybių.",
        "anonpreviewwarning": "''Jūs nesate prisijungęs. Išsaugojant jūsų IP adresas bus rodomas šio puslapio redagavimo istorijoje.''",
-       "missingsummary": "'''Priminimas:''' Jūs nenurodėte keitimo komentaro. Jei vėl paspausite „{{int:savearticle}}“, jūsų keitimas bus išsaugotas be jo.",
-       "selfredirect": "<strong>Dėmesio:</strong> Jūs nukreipiate puslapį atgal į jį patį. Galbūt parinkote netinkamą nukreipimo kreipinį arba taisote ne tą straipsnį. \nJei vėl paspausite \"{{int:savearticle}}\", šis nukreipimas vis vien bus sukurtas.",
+       "missingsummary": "'''Priminimas:''' Jūs nenurodėte keitimo komentaro. Jei vėl paspausite „$1“, jūsų keitimas bus išsaugotas be jo.",
+       "selfredirect": "<strong>Dėmesio:</strong> Jūs nukreipiate puslapį atgal į jį patį. Galbūt parinkote netinkamą nukreipimo kreipinį arba taisote ne tą straipsnį. \nJei vėl paspausite \"$1\", šis nukreipimas vis vien bus sukurtas.",
        "missingcommenttext": "Prašome įvesti komentarą.",
-       "missingcommentheader": "<strong>Priminimas:</strong> Jūs nenurodėte šio komentaro antraštės.\nJei vėl paspausite „{{int:savearticle}}“, jūsų keitimas bus įrašytas be jo.",
+       "missingcommentheader": "<strong>Priminimas:</strong> Jūs nenurodėte šio komentaro antraštės.\nJei vėl paspausite „$1“, jūsų keitimas bus įrašytas be jo.",
        "summary-preview": "Komentaro peržiūra:",
        "subject-preview": "Temos peržiūra:",
        "previewerrortext": "Įvyko klaida bandant peržiūrėti jūsų pakeitimus.",
        "editingsection": "Taisomas $1 (skyrelis)",
        "editingcomment": "Taisomas $1 (naujas skyrius)",
        "editconflict": "Redaguoti konfliktą: $1",
-       "explainconflict": "Kažkas kitas jau pakeitė puslapį nuo tada, kai jūs pradėjote jį redaguoti.\nViršutiniame tekstiniame lauke pateikta šiuo metu esanti puslapio versija.\nJūsų keitimai pateikti žemiau esančiame lauke.\nJums reikia sujungti jūsų pakeitimus su esančia versija.\nKai paspausite „{{int:savearticle}}“, bus įrašytas '''tik''' tekstas viršutiniame tekstiniame lauke.",
+       "explainconflict": "Kažkas kitas jau pakeitė puslapį nuo tada, kai jūs pradėjote jį redaguoti.\nViršutiniame tekstiniame lauke pateikta šiuo metu esanti puslapio versija.\nJūsų keitimai pateikti žemiau esančiame lauke.\nJums reikia sujungti jūsų pakeitimus su esančia versija.\nKai paspausite „$1“, bus įrašytas '''tik''' tekstas viršutiniame tekstiniame lauke.",
        "yourtext": "Jūsų tekstas",
        "storedversion": "Išsaugota versija",
        "nonunicodebrowser": "'''ĮSPĖJIMAS: Jūsų naršyklė nepalaiko unikodo. Kad būtų saugu redaguoti puslapį, ne ASCII simboliai redagavimo lauke bus rodomi kaip šešioliktainiai kodai.'''",
        "contentmodelediterror": "Jūs negalite redaguoti šios versijos, nes jos turinio modelis yra <code>$1</code>, kuris skiriasi nuo dabartinio puslapio turinio modelio, kuris yra <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Dėmesio: Jūs atkuriate puslapį, kuris anksčiau buvo ištrintas.'''\n\nTurėtumėte nuspręsti, ar reikėtų toliau redaguoti šį puslapį.\nJūsų patogumui čia pateikiamas šio puslapio šalinimų ir perkėlimų sąrašas:",
        "moveddeleted-notice": "Šis puslapis buvo ištrintas.\nŽemiau pateikiamas puslapio šalinimų ir pervadinimų sąrašas.",
-       "moveddeleted-notice-recent": "Atsiprašome, šis puslapis nesenai buvo ištrintas (per pastarąsias 24 valandas). Puslapio ištrynimo ir perkėlimo istorija yra pateikiama žemiau kaip nuoroda.",
+       "moveddeleted-notice-recent": "Atsiprašome, šis puslapis neseniai buvo ištrintas (per pastarąsias 24 valandas). Žemiau pateikiama detali puslapio ištrynimo ir perkėlimo istorija.",
        "log-fulllog": "Rodyti visą istoriją",
        "edit-hook-aborted": "Keitimas nutrauktas užlūžimo.\nTam nėra paaiškinimo.",
        "edit-gone-missing": "Negalima atnaujinti puslapio.\nGreičiausiai jis yra ištrintas.",
        "right-editsemiprotected": "Taisyti puslapius, apsaugotus kaip \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Redaguoti puslapio turinio modelį",
        "right-editinterface": "Keisti naudotojo aplinką",
-       "right-editusercssjs": "Redaguoti kitų naudotojų CSS ir JS failus",
        "right-editusercss": "Redaguoti kitų naudotojų CSS failus",
        "right-edituserjs": "Redaguoti kitų naudotojų JS failus",
        "right-editmyusercss": "Redaguoti savo vartotojo CSS failus",
        "rcfilters-clear-all-filters": "Valyti visus filtrus",
        "rcfilters-invalid-filter": "Negalimas filtras",
        "rcfilters-filterlist-title": "Filtrai",
+       "rcfilters-filterlist-whatsthis": "Kas tai?",
+       "rcfilters-highlightmenu-title": "Pasirinkite spalvą",
        "rcfilters-filterlist-noresults": "Nerastas toks filtras",
        "rcfilters-filtergroup-registration": "Vartotojo registracija",
        "rcfilters-filter-registered-label": "Registruoti",
        "rcfilters-filter-unregistered-label": "Neregistruoti",
+       "rcfilters-filter-unregistered-description": "Redaktoriai, kurie nėra prisijungę.",
        "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-user-experience-level-newcomer-label": "Naujokai",
+       "rcfilters-filter-user-experience-level-learner-label": "Mokiniai",
+       "rcfilters-filter-user-experience-level-experienced-label": "Patyrę vartotojai",
+       "rcfilters-filter-user-experience-level-experienced-description": "Daugiau nei 30 dienų veiklos ir 500 keitimų.",
        "rcfilters-filter-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-reviewstatus": "Peržiūrėti statusą",
        "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.",
        "rcshowhidecategorization": "$1 puslapių kategorizavimus",
        "rcshowhidecategorization-show": "Rodyti",
        "rcshowhidecategorization-hide": "Slėpti",
-       "rclinks": "Rodyti paskutinius $1 pakeitimų per paskutiniąsias $2 dienų<br />$3",
+       "rclinks": "Rodyti paskutinius $1 pakeitimų per paskutiniąsias $2 dienų",
        "diff": "skirt",
        "hist": "ist",
        "hide": "Slėpti",
        "notvisiblerev": "Versija buvo ištrinta",
        "watchlist-details": "Stebima {{PLURAL:$1|$1 puslapis|$1 puslapiai|$1 puslapių}}, neskaičiuojant aptarimų puslapių.",
        "wlheader-enotif": "El. pašto pranešimai yra įjungti.",
-       "wlheader-showupdated": "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
+       "wlheader-showupdated": "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra '''paryškinti'''.",
        "wlnote": "{{PLURAL:$1|Rodomas '''$1''' paskutinis pakeitimas, atliktas|Rodomi '''$1''' paskutiniai pakeitimai, atlikti|Rodoma '''$1''' paskutinių pakeitimų, atliktų}} per '''$2''' {{PLURAL:$2|paskutinę valandą|paskutines valandas|paskutinių valandų}}, nuo $3 $4.",
        "wlshowlast": "Rodyti paskutinių $1 valandų, $2 dienų",
        "watchlist-hide": "Slėpti",
        "modifiedarticleprotection": "pakeistas „[[$1]]“ apsaugos lygis",
        "unprotectedarticle": "atrakino „[[$1]]“",
        "movedarticleprotection": "perkelti apsaugos nustatymai iš „[[$2]]“ į „[[$1]]“",
-       "protectedarticle-comment": "{{GENDER:$2|Apsaugojo}} „[[$1]]“",
+       "protectedarticle-comment": "{{GENDER:$2|Užrakino}} „[[$1]]“",
        "modifiedarticleprotection-comment": "{{GENDER:$2|Pakeitė „[[$1]]“ apsaugos lygį}}",
        "unprotectedarticle-comment": "{{GENDER:$2|Pašalino apsaugą}} iš „[[$1]]“",
        "protect-title": "Nustatomas apsaugos lygis puslapiui „$1“",
        "undeleteviewlink": "žiūrėti",
        "undeleteinvert": "Žymėti priešingai",
        "undeletecomment": "Priežastis:",
-       "undeletedrevisions": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}} ir $2 {{PLURAL:$2|failas|failai|failų}}",
-       "undeletedfiles": "{{PLURAL:$1|atkurtas $1 failas|atkurti $1 failai|atkurta $1 failų}}",
        "cannotundelete": "Visi arba kai kurie atkūrimai nepavyko:\n$1",
        "undeletedpage": "'''$1 buvo atkurtas'''\n\nPeržiūrėkite [[Special:Log/delete|trynimų sąrašą]], norėdami rasti paskutinių trynimų ir atkūrimų sąrašą.",
        "undelete-header": "Kad sužinotumėte, kurie puslapiai paskiausiai ištrinti, žiūrėkite [[Special:Log/delete|šalinimų sąrašą]].",
        "newimages-summary": "Šis specialus puslapis rodo paskiausiai įkeltus failus.",
        "newimages-legend": "Filtras",
        "newimages-label": "Failo vardas (ar jo dalis):",
+       "newimages-user": "IP adresas ar vartotojo vardas",
        "newimages-showbots": "Rodyti robotų atliktus įkėlimus",
        "newimages-hidepatrolled": "Paslėpti patruliuotus įkeltus failus",
        "noimages": "Nėra ką parodyti.",
        "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-restore": "$1 atkūrė puslapį $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 atkūrė puslapį $3",
+       "restore-count-files": "{{PLURAL:$1|1 failas|$1 failai}}",
        "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",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|pakeitė}} matomumą žurnalo renginiams $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|atnaujino}} žymes $3 puslapio versijoje $4, ({{PLURAL:$7|pridėjo}} $6; {{PLURAL:$9|pašalino}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|atnaujino}} žymes $3 puslapio žurnalo įraše $5 ({{PLURAL:$7|pridėtas}} $6; {{PLURAL:$9|pašalintas}} $8)",
        "rightsnone": "(jokių)",
-       "revdelete-summary": "keitimo paaiškinimas",
        "rightslogentry-temporary-group": "$1 (laikinai, iki $2)",
        "feedback-adding": "Pridedamas atsiliepimas į puslapį ...",
        "feedback-back": "Atgal",
        "unlinkaccounts": "Atsieti paskyras",
        "unlinkaccounts-success": "Paskyra buvo atsieta.",
        "revid": "apžvalga $1",
-       "pageid": "puslapio ID $1"
+       "pageid": "puslapio ID $1",
+       "rawhtml-notallowed": "&lt;html&gt; negali būti naudojamos ne normaliuose puslapiuose.",
+       "gotointerwiki": "Išeinama iš {{SITENAME}}",
+       "gotointerwiki-invalid": "Nurodytas pavadinimas negalimas."
 }
index 78695da..1959540 100644 (file)
        "yourpassword": "Paroļs:",
        "login": "Dasaslāgt",
        "nav-login-createaccount": "Dasaslāgt / sataiseit jaunu lītuotuoju",
-       "userlogin": "Dasaslāgt / sataiseit jaunu lītuotuoju",
-       "userloginnocreate": "Dasaslāgt",
        "logout": "Atsaslāgt",
        "userlogout": "Atsaslāgt",
-       "nologinlink": "Registrētīs",
        "createaccount": "Sataiseit jaunu lītuotuoju",
-       "gotaccountlink": "Dasaslāgt",
-       "createaccountreason": "Īmesle:",
        "mailmypassword": "Atsyuteit maņ jaunu paroli",
        "loginlanguagelabel": "Volūda: $1",
        "changepassword": "Puormeit paroļu",
        "rcshowhideliu": "$1 dasaslāgtu lītuotuoju",
        "rcshowhideanons": "$1 anonimūs",
        "rcshowhidemine": "$1 munys puormejis",
-       "rclinks": "Paruodeit pādejuos $1 izmainis pādejūs $2 dīnu laikā.<br />$3",
+       "rclinks": "Paruodeit pādejuos $1 izmainis pādejūs $2 dīnu laikā.",
        "diff": "izmainis",
        "hist": "viesture",
        "hide": "Nūglobuot",
index d0fc2b3..c9a4c59 100644 (file)
@@ -4,7 +4,8 @@
                        "Lpachuau",
                        "RMizo",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "Zawmna hnuairinna",
        "externaldberror": "Insawifiahna felfai lo a awm lo a nih loh vëk pawhin i pawnlam siangchan tihdanglam phalsak i ni lo a ni ang.",
        "login": "Luhna",
        "nav-login-createaccount": "Luhna / siangchan siamna",
-       "userlogin": "Luhna/Siangchan siamna",
-       "userloginnocreate": "Inziah luhna",
        "logout": "Chhuahna",
        "userlogout": "Chhuahna",
        "notloggedin": "I la lût lo",
-       "nologin": "Siangchan i la nei lo maw? $1.",
-       "nologinlink": "Siangchan siam rawh",
        "createaccount": "Siangchan siam rawh le",
-       "gotaccount": "Siangchan i nei tawh sa maw? $1.",
-       "gotaccountlink": "Luhna",
-       "userlogin-resetlink": "I inziahluhna i theihnghilh maw?",
        "createaccountmail": "E-lehkhathawnin",
-       "createaccountreason": "Chhan:",
        "badretype": "I thurûk ziahte a inmil lo.",
        "userexists": "Hmangtu hming hman tawh a ni.\nHming dang i thlan a ngai.",
        "loginerror": "Inziahluh sual",
        "showdiff": "Tihdanglam tihlanna",
        "anoneditwarning": "'''Vaukhanna:''' I inziaklût lo tlat.\nI chenhmun-IP he phêk chanchinah chhinchhian a ni ang.",
        "anonpreviewwarning": "''I inziaklût lo. I dahţhat chuan he phêk siamţhat chanchinah i chenhmun-IP hi chhinchhian a ni ang.''",
-       "missingsummary": "'''Hriat reng tur:''' I siamţhat tlangpui kaihtawina i lo ziak lo tlat.\n\"{{int:savearticle}}\" i hmeh leh chuan i thuziah hi a kaihtawina tel lovin dahţhat a ni ang.",
+       "missingsummary": "'''Hriat reng tur:''' I siamţhat tlangpui kaihtawina i lo ziak lo tlat.\n\"$1\" i hmeh leh chuan i thuziah hi a kaihtawina tel lovin dahţhat a ni ang.",
        "missingcommenttext": "Tuihnihna a hnuaiah khuan ziak rawh.",
-       "missingcommentheader": "'''Hriat reng tur:''' I tuihnihna thupui i pe lo.\n\"{{int:savearticle}}\"-ah i hmeh leh chuan i siamţhatna hi a thupui tel lovin dahţhat a ni ang.",
+       "missingcommentheader": "'''Hriat reng tur:''' I tuihnihna thupui i pe lo.\n\"$1\"-ah i hmeh leh chuan i siamţhatna hi a thupui tel lovin dahţhat a ni ang.",
        "summary-preview": "Kaihtawina endikna:",
        "subject-preview": "Thupui endikna:",
        "blockedtitle": "He hmangtu hi danbeh a ni",
        "saveprefs": "Dahţhatna",
        "restoreprefs": "A awmdàn siamsaah dah lêt vek rawh",
        "prefs-editing": "Siamţhat",
-       "rows": "Tlar:",
-       "columns": "Thlur:",
        "searchresultshead": "Zawnna",
        "stub-threshold-disabled": "Tihnun a ni lo",
        "recentchangesdays": "Tihdanglam thar ni tihlan tùr chin:",
        "userrights-reason": "Chhan:",
        "userrights-no-interwiki": "Wiki dangah hmangtute dikna-chanvo siam danglam theihna phalna i nei lo.",
        "userrights-nodatabase": "Database $1 a awm lo a nih loh pawhin khawtual thil a nih loh hmel.",
-       "userrights-nologin": "Hmangtu dikna-chanvo bithliah thei tùr chuan roreltu siangchanin i [[Special:UserLogin| luh]] a ngai.",
-       "userrights-notallowed": "I siangchanin hmangtu dikna-chanvo belh leh paih theihna phalna a nei lo.",
        "userrights-changeable-col": "I thlâk theih pawlte",
        "userrights-unchangeable-col": "I thlâk theih loh pawlte",
        "group": "Pawl:",
        "rcshowhideanons": "hming hriat loh $1",
        "rcshowhidepatr": "siamthat vil $1",
        "rcshowhidemine": "ka siamţhat $1",
-       "rclinks": "Ni $2 kaltaa tihdanglamna hnuhnung $1 tihlanna<br /> $3.",
+       "rclinks": "Ni $2 kaltaa tihdanglamna hnuhnung $1 tihlanna.",
        "diff": "dnglmn",
        "hist": "chanchin",
        "hide": "Tihbona",
index aa8101a..cf870b4 100644 (file)
        "redirectedfrom": "(Pāradresēts no $1)",
        "redirectpagesub": "Pāradresācijas lapa",
        "redirectto": "Pāradresēt uz:",
-       "lastmodifiedat": "Šajā lapā pēdējo izmaiņu izdarīšanas brīdis: $2, $1.",
+       "lastmodifiedat": "Šī lapa pēdējoreiz labota: $1 plkst. $2.",
        "viewcount": "Šī lapa ir tikusi apskatīta $1 {{PLURAL:$1|reizes|reizi|reizes}}.",
        "protectedpage": "Aizsargāta lapa",
        "jumpto": "Pārlēkt uz:",
        "createacct-yourpasswordagain-ph": "Vēlreiz ievadiet paroli",
        "userlogin-remembermypassword": "Atcerēties mani",
        "userlogin-signwithsecure": "Izmantot drošu savienojumu",
+       "cannotlogin-title": "Nevar pieslēgties",
+       "cannotlogin-text": "Pieslēgšanās nav iespējama.",
+       "cannotloginnow-title": "Šobrīd nevar pieslēgties",
        "cannotcreateaccount-title": "Nevar izveidot kontus",
        "yourdomainname": "Tavs domēns",
        "password-change-forbidden": "Šajā wiki paroles nevar mainīt.",
        "login": "Pieslēgties",
        "login-security": "Apstiprini savu identitāti",
        "nav-login-createaccount": "Izveidot jaunu lietotāju vai doties iekšā",
-       "userlogin": "Izveidot jaunu lietotāju vai doties iekšā",
-       "userloginnocreate": "Pieslēgties",
        "logout": "Iziet",
        "userlogout": "Iziet",
        "notloggedin": "Neesi iegājis",
        "userlogin-noaccount": "Nav dalībnieka konta?",
        "userlogin-joinproject": "Pievienojieties {{SITENAME}}",
-       "nologin": "Nav lietotājvārda? $1.",
-       "nologinlink": "Reģistrējies",
        "createaccount": "Izveidot jaunu lietotāju",
-       "gotaccount": "Tev jau ir lietotājvārds? '''$1'''!",
-       "gotaccountlink": "Pieslēgties",
-       "userlogin-resetlink": "Esat aizmirsis savu pieslēgšanās informāciju?",
        "userlogin-resetpassword-link": "Aizmirsi savu paroli?",
        "userlogin-helplink2": "Palīdzība ar pieslēgšanos",
        "userlogin-loggedin": "Tu esi pieslēdzies ar lietotājvārdu {{GENDER:$1|$1}}.\nLai pieslēgtos ar citu lietotājvārdu, aizpildi šo formu.",
        "createacct-another-email-ph": "Ievadiet e-pasta adresi",
        "createaccountmail": "Izmantot nejauši ģenerētu pagaidu paroli un nosūtīt to uz norādīto e-pasta adresi",
        "createacct-realname": "Īstais vārds (nav obligāts)",
-       "createaccountreason": "Iemesls:",
        "createacct-reason": "Iemesls",
        "createacct-reason-ph": "Kāpēc jūs veidojat citu kontu",
        "createacct-submit": "Izveidot savu kontu",
        "botpasswords-label-delete": "Dzēst",
        "botpasswords-label-resetpassword": "Atiestatīt paroli",
        "botpasswords-label-grants-column": "Piešķirts",
+       "botpasswords-bad-appid": "Bota nosaukums \"$1\" nav derīgs.",
        "botpasswords-created-title": "Bota parole izveidota",
        "botpasswords-updated-title": "Bota parole atjaunināta",
        "botpasswords-deleted-title": "Bota parole dzēsta",
        "passwordreset-emailtitle": "Konta informācija {{SITENAME}}",
        "passwordreset-emailelement": "Lietotājvārds: \n$1\n\nPagaidu parole: \n$2",
        "passwordreset-emailsentemail": "Paroles atiestatīšanas e-pasts ir nosūtīts.",
+       "passwordreset-nocaller": "Jānorāda izsaucējs",
        "passwordreset-nosuchcaller": "Izsaucējs nepastāv: $1",
        "passwordreset-invalidemail": "Nederīga e-pasta adrese",
        "changeemail": "Mainīt vai noņemt e-pasta adresi",
        "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ā!",
-       "missingcommentheader": "'''Atgādinājums:''' Tu šim komentāram neesi norādījis virsrakstu/tematu.\nJa tu vēlreiz spiedīsi uz \"{{int:savearticle}}\", tavas izmaiņas tiks saglabātas bez virsraksta.",
-       "summary-preview": "Kopsavilkuma pirmskats:",
+       "missingcommentheader": "'''Atgādinājums:''' Tu šim komentāram neesi norādījis virsrakstu/tematu.\nJa tu vēlreiz spiedīsi uz \"$1\", tavas izmaiņas tiks saglabātas bez virsraksta.",
+       "summary-preview": "Labojuma kopsavilkuma priekšskatījums:",
        "subject-preview": "Temata pirmskats:",
        "blockedtitle": "Dalībnieks ir bloķēts.",
        "blockedtext": "'''Tavs lietotāja vārds vai IP adrese ir nobloķēta.'''\n\n$1 nobloķēja tavu lietotāja vārdu vai IP adresi.\nBloķējot norādītais iemesls bija: ''$2''.\n\n*Bloka sākums: $8\n*Bloka beigas: $6\n*Bija domāts nobloķēt: $7\n\nTu vari sazināties ar $1 vai kādu citu [[{{MediaWiki:Grouppage-sysop}}|administratoru]] lai apspriestu šo bloku.\n\nPievērs uzmanību, tam, ka ja tu neesi norādījis derīgu e-pasta adresi ''[[Special:Preferences|savās izvēlēs]]'', tev nedarbosies \"sūtīt e-pastu\" iespēja.\n\nTava IP adrese ir $3 un bloka identifikators ir #$5. Lūdzu iekļauj vienu no tiem, vai abus, visos turpmākajos pieprasījumos.",
        "newarticletext": "Šajā projektā vēl nav lapas ar šādu nosaukumu.\nLai izveidotu lapu, sāc rakstīt teksta logā apakšā (par teksta formatēšanu un sīkākai informācija skatīt [$1 palīdzības lapu]).\nJa tu šeit nonāci kļūdas pēc, vienkārši uzspied <strong>back</strong> pogu pārlūkprogrammā.",
        "anontalkpagetext": "----''Šī ir diskusiju lapa anonīmam dalībniekam, kurš vēl nav kļuvis par reģistrētu dalībnieku vai arī neizmanto savu dalībnieka vārdu. Tādēļ mums ir jāizmanto skaitliskā IP adrese, lai viņu identificētu.\nŠāda IP adrese var būt vairākiem dalībniekiem.\nJa tu esi anonīms dalībnieks un uzskati, ka tev ir adresēti neatbilstoši komentāri, lūdzu, [[Special:CreateAccount|kļūsti par dalībnieku]] vai arī [[Special:UserLogin|izmanto jau izveidotu dalībnieka vārdu]], lai izvairītos no turpmākām neskaidrībām un tu netiktu sajaukts ar citiem anonīmiem dalībniekiem.''",
        "noarticletext": "Šajā lapā šobrīd nav nekāda teksta, tu vari [[Special:Search/{{PAGENAME}}|meklēt citās lapās pēc šīs lapas nosaukuma]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītos reģistru ierakstos] vai arī [{{fullurl:{{FULLPAGENAME}}|action=edit}} sākt rediģēt šo lapu]</span>.",
-       "noarticletext-nopermission": "Šajā lapā pašlaik nav nekāda teksta.\nTu vari [[Special:Search/{{PAGENAME}}|meklēt šīs lapas nosaukumu]] citās lapās,\nvai <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>, bet jums nav atļauja izveidot si lapu.",
+       "noarticletext-nopermission": "Šajā lapā pašlaik nav nekāda teksta.\nTu vari [[Special:Search/{{PAGENAME}}|meklēt šīs lapas nosaukumu]] citās lapās,\nvai <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>, bet jums nav atļauja izveidot šo lapu.",
        "userpage-userdoesnotexist": "Lietotājs \"<nowiki>$1</nowiki>\" nav reģistrēts.\nLūdzu, pārliecinies vai vēlies izveidot/izmainīt šo lapu.",
        "userpage-userdoesnotexist-view": "Dalībnieks \"$1\" nav reģistrēts.",
        "blocked-notice-logextract": "Šis dalībnieks pašlaik ir nobloķēts.\n\nPēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:",
        "editingsection": "Labot lapas \"$1\" sadaļu",
        "editingcomment": "Labot $1 (jauna sadaļa)",
        "editconflict": "Izmaiņu konflikts: $1",
-       "explainconflict": "Kāds cits ir izmainījis šo lapu pēc tam, kad tu sāki to mainīt.\nAugšējā teksta logā ir lapas teksts tā pašreizējā versijā.\nTevis veiktās izmaiņas ir redzamas apakšējā teksta logā.\nLai saglabātu savas izmaiņas, tev ir jāapvieno savs teksts ar saglabāto pašreizējo variantu.\nKad spiedīsi pogu \"{{int:savearticle}}\", tiks saglabāts '''tikai''' teksts, kas ir augšējā teksta logā.",
+       "explainconflict": "Kāds cits ir izmainījis šo lapu pēc tam, kad tu sāki to mainīt.\nAugšējā teksta logā ir lapas teksts tā pašreizējā versijā.\nTevis veiktās izmaiņas ir redzamas apakšējā teksta logā.\nLai saglabātu savas izmaiņas, tev ir jāapvieno savs teksts ar saglabāto pašreizējo variantu.\nKad spiedīsi pogu \"$1\", tiks saglabāts '''tikai''' teksts, kas ir augšējā teksta logā.",
        "yourtext": "Tavs teksts",
        "storedversion": "Saglabātā versija",
        "nonunicodebrowser": "'''Brīdinājums: Tavs pārlūks neatbalsta unikodu.\nIr pieejams risinājums, kas ļaus tev droši rediģēt lapas: zīmes, kas nav ASCII, parādīsies izmaiņu logā kā heksadecimāli kodi.'''",
        "invalid-content-data": "Nederīgi satura dati",
        "content-not-allowed-here": "\"$1\" saturs nav atļauts lapā [[$2]]",
        "editwarning-warning": "Atstājot šo lapu tu zaudēsi izdarītās izmaiņas. \nJa esi pieteicies, jūs vari atspējot šo brīdinājumu savās izvēlēs sadaļā \"rediģēšana\"",
+       "editpage-invalidcontentmodel-title": "Satura modelis nav atbalstīts",
+       "editpage-invalidcontentmodel-text": "Satura modelis \"$1\" nav atbalstīts.",
        "editpage-notsupportedcontentformat-title": "Satura formāts nav atbalstīts",
+       "editpage-notsupportedcontentformat-text": "Satura formātu $1 neatbalsta satura modelis $2.",
        "content-model-wikitext": "vikiteksts",
        "content-model-text": "vienkāršs teksts",
        "content-model-javascript": "JavaScript kods",
        "youremail": "Tava e-pasta adrese:",
        "username": "{{GENDER:$1|Lietotājvārds}}:",
        "prefs-memberingroups": "Pieder {{PLURAL:$1|grupai|grupām}}:",
+       "group-membership-link-with-expiry": "$1 (līdz $2)",
        "prefs-registration": "Reģistrēšanās datums:",
        "yourrealname": "Tavs īstais vārds:",
        "yourlanguage": "Valoda:",
        "prefs-displaywatchlist": "Pamatuzstādījumi",
        "prefs-diffs": "Izmaiņas",
        "prefs-help-prefershttps": "Šie uzstādījumi stāsies spēkā nākamajā pievienošanās reizē.",
-       "userrights": "Dalībnieku tiesību pārvaldība",
-       "userrights-lookup-user": "Pārvaldīt dalībnieka grupas",
+       "userrights": "Dalībnieka tiesības",
+       "userrights-lookup-user": "Izvēlēties dalībnieku",
        "userrights-user-editname": "Ievadi lietotājvārdu:",
-       "editusergroup": "Izmainīt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
+       "editusergroup": "Ielādēt dalībnieka grupas",
        "editinguser": "Izmainīt lietotāja '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) statusu",
-       "userrights-editusergroup": "Izmainīt lietotāja grupas",
+       "userrights-editusergroup": "Izmainīt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
+       "userrights-viewusergroup": "Apskatīt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
        "saveusergroups": "Saglabāt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
        "userrights-groupsmember": "Šobrīd ietilpst grupās:",
        "userrights-groupsmember-auto": "Netiešs dalībnieks:",
        "userrights-nodatabase": "Datubāze $1 neeksistē vai nav lokāla.",
        "userrights-changeable-col": "Grupas, kuras tu vari izmainīt",
        "userrights-unchangeable-col": "Grupas, kuras tu nevari izmainīt",
+       "userrights-expiry-othertime": "Cits laiks:",
        "group": "Grupa:",
        "group-user": "Dalībnieki",
        "group-autoconfirmed": "Automātiski apstiprinātie dalībnieki",
        "right-editprotected": "Labot aizsargātās lapas (bez kaskādes aizsardzības)",
        "right-editcontentmodel": "Labot lapas satura modeli",
        "right-editinterface": "Izmainīt dalībnieka interfeisu",
-       "right-editusercssjs": "Izmainīt citu dalībnieku CSS un JS failus",
        "right-editusercss": "Izmainīt citu dalībnieku CSS failus",
        "right-edituserjs": "Izmainīt citu dalībnieku JS failus",
        "right-editmyusercss": "Rediģējiet savus dalībnieka CSS failus",
        "right-userrights-interwiki": "Mainīt dalīnieku tiesības citās Vikipēdijās",
        "right-siteadmin": "Bloķēt un atbloķēt datubāzi",
        "right-sendemail": "Sūtīt e-pastu citiem dalībniekiem",
+       "right-deletechangetags": "Dzēst [[Special:Tags|iezīmes]] no datubāzes",
+       "grant-generic": "\"$1\" tiesību paka",
        "grant-group-email": "Sūtīt e-pastu",
        "grant-createaccount": "Izveidot kontu",
        "grant-editmywatchlist": "Labot uzraugāmo rakstu sarakstu",
        "grant-editpage": "Labot esošās lapas",
        "grant-editprotected": "Labot aizsargātās lapas",
+       "grant-uploadfile": "Augšupielādēt jaunus failus",
        "grant-basic": "Pamattiesības",
        "grant-viewdeleted": "Skatīt dzēstos failus un lapas",
        "newuserlogpage": "Jauno dalībnieku reģistrs",
        "action-deletelogentry": "dzēst žurnāla ierakstus",
        "action-deletedhistory": "skatīt šīs lapas dzēsto vēsturi",
        "action-browsearchive": "meklēt dzēstās lapas",
-       "action-undelete": "atjaunot šo lapu",
-       "action-suppressrevision": "pārskatīt un atjaunot šo slēpto versiju",
+       "action-undelete": "atcelt lapu dzēšanu",
+       "action-suppressrevision": "pārskatīt un atjaunot slēptās versijas",
        "action-suppressionlog": "apskatīt šo privāto reģistru",
        "action-block": "bloķēt šo dalībnieku pret rakstu turpmāku labošanu",
        "action-protect": "izmainīt aizsardzības līmeņus šai lapai",
-       "action-import": "importēt šo lapu no citas viki",
+       "action-import": "importēt lapas no citas vikivietnes",
        "action-importupload": "importēt šo lapu no failu augšupielādes",
        "action-patrol": "atzīmēt citu labojumus kā pārbaudītus",
        "action-autopatrol": "iespēja savus labojumus atzīmēt kā pārbaudītus",
        "action-siteadmin": "bloķēt vai atbloķēt datubāzi",
        "action-sendemail": "sūtīt e-pastus",
        "nchanges": "$1 {{PLURAL:$1|izmaiņas|izmaiņa|izmaiņas}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|kopš pēdējā apmeklējuma}}",
        "enhancedrc-history": "vēsture",
        "recentchanges": "Pēdējās izmaiņas",
        "recentchanges-legend": "Pēdējo izmaiņu iespējas",
        "recentchanges-legend-heading": "<strong>Apzīmējumi:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (skatīt arī [[Special:NewPages|jaunās lapas]])",
        "recentchanges-submit": "Rādīt",
+       "rcfilters-activefilters": "Aktīvie filtri",
+       "rcfilters-restore-default-filters": "Atjaunot noklusētos filtrus",
+       "rcfilters-clear-all-filters": "Noņemt visus filtrus",
+       "rcfilters-search-placeholder": "Filtrēt pēdējās izmaiņas (pārlūko vai sāc rakstīt)",
        "rcfilters-invalid-filter": "Nederīgs filtrs",
+       "rcfilters-empty-filter": "Nav aktīvu filtru. Tiek rādītas visas izmaiņas.",
        "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-whatsthis": "Kas tas ir?",
+       "rcfilters-filterlist-feedbacklink": "Sniedz atsauksmes par jaunajiem (bēta) filtriem",
+       "rcfilters-highlightbutton-title": "Izcelt rezultātus",
+       "rcfilters-highlightmenu-title": "Izvēlies krāsu",
+       "rcfilters-highlightmenu-help": "Izvēlies krāsu, lai izceltu šo īpašību",
        "rcfilters-filterlist-noresults": "Filtri nav atrasti",
        "rcfilters-filtergroup-registration": "Lietotāja reģistrācija",
+       "rcfilters-filter-registered-label": "Reģistrēti",
+       "rcfilters-filter-registered-description": "Pieslēgušies redaktori.",
+       "rcfilters-filter-unregistered-label": "Nereģistrēti",
+       "rcfilters-filter-unregistered-description": "Nepieslēgušies redaktori.",
+       "rcfilters-filtergroup-authorship": "Devuma autors",
+       "rcfilters-filter-editsbyself-label": "Tavi labojumi",
+       "rcfilters-filter-editsbyself-description": "Tevis veiktie labojumi.",
+       "rcfilters-filter-editsbyother-label": "Citu labojumi",
+       "rcfilters-filter-editsbyother-description": "Citu dalībnieku veiktie labojumi (bez taviem).",
+       "rcfilters-filtergroup-userExpLevel": "Pieredzes līmenis (tikai reģistrētiem dalībniekiem)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Jaunpienācēji",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Mazāk nekā 10 labojumi un 4 aktīvas dienas.",
+       "rcfilters-filter-user-experience-level-learner-label": "Mācekļi",
+       "rcfilters-filter-user-experience-level-learner-description": "Vairāk aktīvo dienu un labojumu nekā \"Jaunpienācējiem\", bet mazāk nekā \"Pieredzējušiem dalībniekiem\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Pieredzējuši dalībnieki",
+       "rcfilters-filter-user-experience-level-experienced-description": "Vairāk nekā 30 aktivitāte un 500 labojumi.",
+       "rcfilters-filtergroup-automated": "Automatizēts devums",
+       "rcfilters-filter-bots-label": "Boti",
+       "rcfilters-filter-bots-description": "Ar automatizētiem rīkiem veikti labojumi.",
+       "rcfilters-filter-humans-label": "Cilvēki (ne boti)",
+       "rcfilters-filter-humans-description": "Cilvēku veikti labojumi.",
+       "rcfilters-filtergroup-reviewstatus": "Pārskatīšanas statuss",
+       "rcfilters-filter-patrolled-label": "Patrulēti",
+       "rcfilters-filter-patrolled-description": "Labojumi, kas atzīmēti kā patrulēti.",
+       "rcfilters-filter-unpatrolled-label": "Nepatrulēti",
+       "rcfilters-filter-unpatrolled-description": "Labojumi, kas nav atzīmēti kā patrulēti.",
+       "rcfilters-filtergroup-significance": "Nozīmīgums",
+       "rcfilters-filter-minor-label": "Maznozīmīgi labojumi",
+       "rcfilters-filter-minor-description": "Labojumi, kas atzīmēti kā maznozīmīgi.",
+       "rcfilters-filter-major-label": "Nozīmīgi labojumi",
+       "rcfilters-filter-major-description": "Labojumi, kas nav atzīmēti kā maznozīmīgi.",
        "rcfilters-filtergroup-changetype": "Izmaiņu veids",
        "rcfilters-filter-pageedits-label": "Lapu labojumi",
        "rcfilters-filter-pageedits-description": "Labojumi vikivietnes saturā, diskusijā, kategoriju aprakstos...",
        "rcfilters-filter-logactions-label": "Reģistrētās darbības",
        "rcfilters-filter-logactions-description": "Administratīvās darbības, kontu veidošana, lapu dzēšana, augšupielādes...",
        "rcnotefrom": "Šobrīd redzamas izmaiņas kopš '''$2''' (parādītas ne vairāk par '''$1''').",
+       "rclistfromreset": "Atiestatīt datuma izvēli",
        "rclistfrom": "Parādīt jaunas izmaiņas kopš $3 $2",
        "rcshowhideminor": "$1 maznozīmīgos",
        "rcshowhideminor-show": "Rādīt",
        "rcshowhidecategorization": "$1 lapu kategorizēšanu",
        "rcshowhidecategorization-show": "Rādīt",
        "rcshowhidecategorization-hide": "Paslēpt",
-       "rclinks": "Parādīt pēdējās $1 izmaiņas pēdējās $2 dienās.<br />$3",
+       "rclinks": "Parādīt pēdējās $1 izmaiņas pēdējās $2 dienās",
        "diff": "izmaiņas",
        "hist": "hronoloģija",
        "hide": "paslēpt",
        "apisandbox-dynamic-parameters": "Papildu parametri",
        "apisandbox-dynamic-parameters-add-label": "Pievienot parametru:",
        "apisandbox-dynamic-parameters-add-placeholder": "Parametra nosaukums",
+       "apisandbox-deprecated-parameters": "Novecojuši parametri",
        "apisandbox-results": "Rezultāti",
        "apisandbox-request-url-label": "Pieprasījuma URL:",
        "apisandbox-request-json-label": "Pieprasījuma JSON:",
        "rollback-success": "Novērsu izmaiņas, ko izdarīja $1;\natjaunoju versiju, ko saglabāja $2.",
        "sessionfailure-title": "sesijas kļūda",
        "sessionfailure": "Ir radusies problēma ar sesijas autentifikāciju;\nšī darbība ir atcelta, lai novērstu lietotājvārda iespējami ļaunprātīgu izmantošanu.\nLūdzu, spied \"''back''\" un atjaunini iepriekšējo lapu. Tad mēģini vēlreiz.",
+       "changecontentmodel": "Mainīt lapas satura modeli",
+       "changecontentmodel-legend": "Mainīt satura modeli",
        "changecontentmodel-title-label": "Lapas nosaukums",
+       "changecontentmodel-model-label": "Jauns satura modelis",
        "changecontentmodel-reason-label": "Iemesls:",
        "changecontentmodel-submit": "Mainīt",
+       "changecontentmodel-success-title": "Satura modelis tika izmainīts",
+       "changecontentmodel-success-text": "[[:$1]] satura modelis tika izmainīts.",
        "protectlogpage": "Aizsargāšanas reģistrs",
        "protectedarticle": "aizsargāja \"[[$1]]\"",
        "modifiedarticleprotection": "izmainīja aizsardzības līmeni \"[[$1]]\"",
        "undeleteviewlink": "skatīt",
        "undeleteinvert": "Izvēlēties pretēji",
        "undeletecomment": "Iemesls:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|versijas|versija|versijas}} {{PLURAL:$1|atjaunotas|atjaunota|atjaunotas}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|$1 versijas|1 versija|$1 versijas}} un {{PLURAL:$2|$2 faili|1 fails|$2 faili}} atjaunoti",
-       "undeletedfiles": "{{PLURAL:$1|$1 faili atjaunoti|$1 fails atjaunots|$1 faili atjaunoti}}",
        "cannotundelete": "Atjaunošana neizdevās:\n$1",
        "undeletedpage": "'''$1 tika atjaunots'''\n\n[[Special:Log/delete|Dzēšanas reģistrā]] ir informācija par pēdējām dzēšanām un atjaunošanām.",
        "undelete-header": "Nesen dzēstajām lapām skatīt [[Special:Log/delete|dzēšanas reģistru]].",
        "namespace": "Vārdtelpa:",
        "invert": "Izvēlēties pretēji",
        "namespace_association": "Saistītā vārdtelpa",
+       "tooltip-namespace_association": "Atzīmē šo rūtiņu, lai iekļautu diskusijas vai temata vārdtelpu, kas saistīta ar izvēlēto vārdtelpu",
        "blanknamespace": "(Pamatlapa)",
        "contributions": "{{GENDER:$1|Dalībnieka|Dalībnieces|Dalībnieka}} devums",
        "contributions-title": "Dalībnieka $1 devums",
        "sp-contributions-uploads": "augšupielādes",
        "sp-contributions-logs": "reģistri",
        "sp-contributions-talk": "diskusija",
-       "sp-contributions-userrights": "dalībnieka tiesību pārvaldība",
+       "sp-contributions-userrights": "{{GENDER:$1|dalībnieka|dalībnieces}} tiesību pārvaldība",
        "sp-contributions-blocked-notice": "Šis lietotājs pašlaik ir nobloķēts.\nPēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:",
        "sp-contributions-blocked-notice-anon": "Šī IP adrese pašlaik ir nobloķēta.\nPēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:",
        "sp-contributions-search": "Meklēt lietotāju veiktās izmaiņas",
        "unblocked-range": "$1 tika atbloķēts",
        "unblocked-id": "Bloks $1 tika noņemts",
        "blocklist": "Bloķētie lietotāji",
+       "autoblocklist-submit": "Meklēt",
        "ipblocklist": "Bloķētie lietotāji",
        "ipblocklist-legend": "Meklēt bloķētu lietotāju",
        "blocklist-userblocks": "Paslēpt kontu bloķējumus",
        "tooltip-ca-nstab-category": "Apskatīt kategorijas lapu",
        "tooltip-minoredit": "Atzīmēt šo par maznozīmīgu labojumu",
        "tooltip-save": "Saglabāt veiktās izmaiņas",
+       "tooltip-publish": "Publicēt savas izmaiņas",
        "tooltip-preview": "Parādīt izmaiņu priekšskatījumu. Lūdzam izmantot šo iespēju pirms saglabāšanas.",
        "tooltip-diff": "Parādīt, kā esi izmainījis tekstu.",
        "tooltip-compareselectedversions": "Aplūkot atšķirības starp divām izvēlētajām lapas versijām.",
        "tooltip-watch": "Pievienot šo lapu uzraugāmo lapu sarakstam",
+       "tooltip-watchlistedit-normal-submit": "Noņemt nosaukumus",
+       "tooltip-watchlistedit-raw-submit": "Atjaunināt sarakstu",
        "tooltip-recreate": "Atjaunot lapu, lai arī tā ir bijusi izdzēsta",
        "tooltip-upload": "Sākt augšuplādi",
        "tooltip-rollback": "\"Novērst\" atceļ visas šī lietotāja izmaiņas vienā piegājienā",
        "pageinfo-article-id": "Lapas ID",
        "pageinfo-language": "Lappuses satura valoda",
        "pageinfo-content-model": "Lapas satura modelis",
+       "pageinfo-robot-policy": "Indeksācija ar robotiem",
+       "pageinfo-robot-index": "Atļauta",
+       "pageinfo-robot-noindex": "Aizliegta",
        "pageinfo-watchers": "Lapas uzraudzītāju skaits",
        "pageinfo-redirects-name": "Pāradresāciju skaits uz šo lapu",
        "pageinfo-subpages-name": "Šīs lapas apakšlapas",
        "newimages-summary": "Šeit var apskatīt pēdējos augšupielādētos failus.",
        "newimages-legend": "Filtrs",
        "newimages-label": "Faila nosaukums (vai tā daļa):",
+       "newimages-user": "IP adrese vai lietotājvārds",
        "newimages-showbots": "Parādīt botu augšupielādētos failus",
        "newimages-hidepatrolled": "Paslēpt pārbaudītās augšupielādes",
        "noimages": "Nav nekā ko redzēt.",
        "hours": "{{PLURAL:$1|$1 stundas|$1 stunda|$1 stundas}}",
        "days": "{{PLURAL:$1|$1 dienas|$1 diena|$1 dienas}}",
        "ago": "pirms $1",
-       "monday-at": "Pirmdiena $1",
+       "just-now": "tikko",
+       "hours-ago": "pirms $1 {{PLURAL:$1|stundām|stundas|stundām}}",
+       "minutes-ago": "pirms $1 {{PLURAL:$1|minūtēm|minūtes|minūtēm}}",
+       "seconds-ago": "pirms $1 {{PLURAL:$1|sekundēm|sekundes|sekundēm}}",
+       "monday-at": "Pirmdien $1",
+       "tuesday-at": "Otrdien $1",
+       "wednesday-at": "Trešdien $1",
+       "thursday-at": "Ceturtdien $1",
+       "friday-at": "Piektdien $1",
+       "saturday-at": "Sestdien $1",
+       "sunday-at": "Svētdien $1",
+       "yesterday-at": "Vakar $1",
        "bad_image_list": "Formāts:\n\nTiek ņemti vērā tikai ieraksti rindiņā kas sākas ar *\nPirmajai saitei rindiņā ir jābūt uz attiecīgo failu\nJebkuras sekojošas saites tiks uzskatītas par izņēmumiem t.i. lapām kurās fails drīkt tikt izmantots",
        "metadata": "Metadati",
        "metadata-help": "Šis fails satur papildu informāciju, kuru visticamāk ir pievienojis digitālais fotoaparāts vai skeneris, kas šo failu izveidoja. Ja šis fails pēc tam ir ticis modificēts, šie dati var neatbilst izmaiņām (var būt novecojuši).",
        "confirmemail_success": "Tava e-pasta adrese ir apstiprināta.\nTagad vari [[Special:UserLogin|doties iekšā]] ar savu lietotājvārdu un pilnvērtīgi izmantot wiki iespējas.",
        "confirmemail_loggedin": "Tava e-pasta adrese tagad ir apstiprināta.",
        "confirmemail_subject": "E-pasta adreses apstiprinajums no {{grammar:ģenitīvs|{{SITENAME}}}}",
-       "confirmemail_body": "Kads, iespejams, tu pats, no IP adreses $1 ir registrejis {{grammar:ģenitīvs|{{SITENAME}}}} lietotaja vardu \"$2\" ar so e-pasta adresi.\n\nLai apstiprinatu, ka so lietotaja vardu esi izveidojis tu pats, un aktivizetu e-pasta izmantosanu {{SITENAME}}, atver so saiti sava interneta parluka:\n\n$3\n\nJa tu *neesi* registrejis sadu lietotaja vardu, atver sho saiti savaa interneta browserii, lai atceltu shiis e-pasta adreses apstiprinaashanu:\n\n$5\n\nSi apstiprinajuma koda deriguma termins ir $4.",
+       "confirmemail_body": "Kāds, iespējams, tu pats, no IP adreses $1 ir reģistrējis {{grammar:ģenitīvs|{{SITENAME}}}} lietotāja vārdu \"$2\" ar šo e-pasta adresi.\n\nLai apstiprinātu, ka šo lietotāja vārdu esi izveidojis tu pats, un aktivizētu e-pasta izmantošanu {{SITENAME}}, atver šo saiti savā interneta pārlūkprogrammā:\n\n$3\n\nJa tu *neesi* reģistrējis šādu lietotāja vārdu, atver šo saiti savā interneta pārlūkprogrammā, lai atceltu šīs e-pasta adreses apstiprināšanu:\n\n$5\n\nŠi apstiprinājuma koda derīguma termiņš ir $4.",
        "confirmemail_invalidated": "E-pasta adreses apstiprināšana atcelta",
        "invalidateemail": "Atcelt e-pasta adreses apstiprināšanu",
        "scarytranscludedisabled": "[Starpviki saišu iekļaušana ir atspējota.]",
        "watchlistedit-raw-legend": "Izmainīt uzraugāmo rakstu saraksta kodu",
        "watchlistedit-raw-explain": "Uzraugāmo rakstu sarakstā esošās lapas ir redzamas zemāk, un šo sarakstu var izmainīt lapas pievienojot vai izdzēšot no saraksta;\nkatrai rindai te atbilst viena lapa.\nTad, kad pabeigts, uzspied Atjaunot sarakstu.\nVar arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].",
        "watchlistedit-raw-titles": "Lapas:",
-       "watchlistedit-raw-submit": "Atjaunot sarakstu",
+       "watchlistedit-raw-submit": "Atjaunināt sarakstu",
        "watchlistedit-raw-done": "Tavs uzraugāmo rakstu saraksts tika atjaunots.",
        "watchlistedit-raw-added": "{{PLURAL:$1|$1 lapas tika pievienotas|$1 lapa tika pievienota|$1 lapas tika pievienotas}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|$1 lapas tika noņemtas|1 lapa tika noņemta|$1 lapas tika noņemtas}}:",
        "logentry-delete-delete": "$1 {{GENDER:$2|izdzēsa}} lapu $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|izdzēsa}} pāradresāciju $3 pārrakstot",
        "logentry-delete-restore": "$1 {{GENDER:$2|atjaunoja}} lapu $3",
+       "restore-count-files": "{{PLURAL: $1|$1 faili|$1 fails|$1 faili}}",
        "revdelete-content-hid": "saturs slēpts",
        "revdelete-summary-hid": "labojuma kopsavilkums slēpts",
        "revdelete-uname-hid": "lietotājvārds slēpts",
        "logentry-upload-upload": "$1 {{GENDER:$2|augšupielādēja}} $3",
        "logentry-upload-overwrite": "$1 augšupielādēja jaunu $3 versiju",
        "rightsnone": "(nav)",
-       "revdelete-summary": "izmaiņu kopsavilkums",
        "feedback-adding": "Atsauksmes tiek pievienotas lapai...",
        "feedback-back": "Atpakaļ",
        "feedback-bugnew": "Es pārbaudīju. Ziņot par jaunu kļūdu",
        "authmanager-realname-label": "Tavs īstais vārds",
        "authmanager-realname-help": "Dalībnieka īstais vārds",
        "authprovider-resetpass-skip-label": "Izlaist",
-       "specialpage-securitylevel-not-allowed-title": "Nav atļauts"
+       "specialpage-securitylevel-not-allowed-title": "Nav atļauts",
+       "credentialsform-account": "Konta nosaukums:"
 }
index 81906f6..e398d09 100644 (file)
@@ -22,7 +22,8 @@
                        "Macofe",
                        "Bowleerin",
                        "SolidBlock",
-                       "Suchichi02"
+                       "Suchichi02",
+                       "逆襲的天邪鬼"
                ]
        },
        "tog-underline": "鏈墊線:",
        "category_header": "「$1」中之頁",
        "subcategories": "次類",
        "category-media-header": "「$1」中之媒",
-       "category-empty": "''無頁或媒也。''",
+       "category-empty": "<em>斯類無屬也。</em>",
        "hidden-categories": "$1隱類",
        "hidden-category-category": "隱類",
        "category-subcat-count": "{{PLURAL:$2|類有子類如下。|類有$1子類,轄下子類數$2也。}}",
        "poolcounter-usage-error": "用誤:$1",
        "aboutsite": "述{{SITENAME}}",
        "aboutpage": "Project:述",
-       "copyright": "文奉$1行。",
+       "copyright": "若無他述,諸文皆奉$1以行。",
        "copyrightpage": "{{ns:project}}:版權",
        "currentevents": "世事",
        "currentevents-url": "Wikipedia:世事",
        "externaldberror": "認庫之錯,或禁更汝之外簿。",
        "login": "登簿",
        "nav-login-createaccount": "登簿、增簿",
-       "userlogin": "登簿、增簿",
-       "userloginnocreate": "登簿",
        "logout": "去簿",
        "userlogout": "去簿",
        "notloggedin": "尚未登簿",
        "userlogin-noaccount": "尚無簿乎?",
        "userlogin-joinproject": "入{{SITENAME}}",
-       "nologin": "尚無簿乎?惠往$1。",
-       "nologinlink": "增簿",
        "createaccount": "增簿",
-       "gotaccount": "已有簿矣?惠往$1。",
-       "gotaccountlink": "登簿",
-       "userlogin-resetlink": "汝忘登簿所需?",
        "userlogin-resetpassword-link": "亡子符節?",
        "userlogin-helplink2": "助以登簿",
        "userlogin-createanother": "增另一簿",
        "createacct-email-ph": "書君郵址",
        "createaccountmail": "同郵",
        "createacct-realname": "實名(可選)",
-       "createaccountreason": "因:",
        "createacct-reason": "因:",
        "createacct-reason-ph": "汝另立一簿者何哉?",
        "createacct-submit": "增簿",
        "showdiff": "示異",
        "anoneditwarning": "'''警示:'''子未登簿,若確纂,IP將誌。茍[$1 登]或[$2 開戶口],是纂欲存以子名,及他效。",
        "anonpreviewwarning": "''子未登簿,IP將誌。''",
-       "missingsummary": "'''醒示:'''子未概之,復「{{int:savearticle}}」則文倍焉。",
+       "missingsummary": "'''醒示:'''子未概之,復「$1」則文倍焉。",
        "missingcommenttext": "請贊之",
-       "missingcommentheader": "'''醒示:'''子未概標之,復「{{int:savearticle}}」則文倍焉。",
+       "missingcommentheader": "'''醒示:'''子未概標之,復「$1」則文倍焉。",
        "summary-preview": "覽概:",
        "subject-preview": "覽題:",
        "blockedtitle": "汝見禁矣",
        "editingsection": "纂節$1",
        "editingcomment": "撰$1",
        "editconflict": "纂沖$1",
-       "explainconflict": "子纂與他人沖,上者時也,下者子也,望子合之。\n註,'''{{int:savearticle}}'''上文儲焉",
+       "explainconflict": "子纂與他人沖,上者時也,下者子也,望子合之。\n註,'''$1'''上文儲焉",
        "yourtext": "子也",
        "storedversion": "時也",
        "nonunicodebrowser": "'''警示:覽器不識萬國碼,以十六進位數代之,以保纂可也。'''",
        "previousrevision": "←舊",
        "nextrevision": "新→",
        "currentrevisionlink": "今審",
-       "cur": "今",
+       "cur": "今",
        "next": "後",
        "last": "前",
        "page_first": "首",
        "saveprefs": "儲",
        "restoreprefs": "重修",
        "prefs-editing": "在修",
-       "rows": "行數:",
-       "columns": "列數:",
        "searchresultshead": "尋",
        "stub-threshold": "<a href=\"#\" class=\"stub\">短頁連</a>格式門檻(位元組):",
        "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-irreversible-marker": "$1*",
        "right-protect": "改錮級與纂錮頁",
        "right-editprotected": "纂錮頁(無連錮)",
        "right-editinterface": "纂要",
-       "right-editusercssjs": "纂他簿之CSS與JavaScript檔",
        "right-editusercss": "纂他簿之CSS檔",
        "right-edituserjs": "纂他簿之JavaScript檔",
        "right-rollback": "速復上簿頁之纂",
        "rcshowhidemine-hide": "藏",
        "rcshowhidecategorization-show": "示",
        "rcshowhidecategorization-hide": "藏",
-       "rclinks": "$2日內$1近易。<br />$3",
+       "rclinks": "$2日內$1近易。",
        "diff": "辨",
        "hist": "誌",
        "hide": "藏",
        "categories": "類",
        "categoriespagetext": "大典{{PLURAL:$1|類中}}有頁或媒。\n[[Special:UnusedCategories|未類]]無示之。\n閱[[Special:WantedCategories|需類]]也。",
        "categoriesfrom": "示此項起之類:",
-       "deletedcontributions": "å·²å\88ªä¹\8bç©\8d",
+       "deletedcontributions": "å·²å\8e»ä¹\8bæ\96\87",
        "deletedcontributions-title": "所棄之事",
        "sp-deletedcontributions-contribs": "積",
        "linksearch": "尋網連",
        "deletecomment": "因:",
        "deleteotherreason": "另/附之因:",
        "deletereasonotherlist": "另因",
-       "deletereason-dropdown": "*常å\88ªä¹\8bå\9b \n** ä½\9cè\80\85ä¹\8bæ±\82\n** ä¾µç\89\88æ¬\8a\n** ç ´å£\9e",
+       "deletereason-dropdown": "*å\88ªå\89\8a常å\9b \n** å»£å\91\8a宣å\82³\n** æ¯\80å£\9eé \81é\9d¢\n** æ\90\8d害ç\89\88æ¬\8a\n** ä½\9cè\80\85è«\8bæ±\82\n** æ\96·æ¸¡",
        "delete-edit-reasonlist": "纂刪因",
        "delete-toobig": "此頁含大誌,過$1修。刪頁限矣,防於{{SITENAME}}之亂也。",
        "delete-warning-toobig": "此頁含大誌,過$1修。刪之可亂{{SITENAME}}之事也;續時留神之。",
        "undeleteviewlink": "察",
        "undeleteinvert": "反相",
        "undeletecomment": "因:",
-       "undeletedrevisions": "$1審已還",
-       "undeletedrevisions-files": "$1審、$2檔已還",
-       "undeletedfiles": "$1檔已還",
-       "cannotundelete": "無以還檔;或復矣。",
+       "cannotundelete": "有頁未能復還,或皆不可還:\n$1",
        "undeletedpage": "'''$1還矣'''\n近刪新還,見[[Special:Log/delete|刪還誌]]。",
        "undelete-header": "欲覽近刪,見[[Special:Log/delete|誌刪]]。",
        "undelete-search-title": "尋刪頁",
        "pageinfo-robot-index": "可",
        "pageinfo-robot-noindex": "不可",
        "pageinfo-toolboxlink": "文訊",
-       "markaspatrolleddiff": "派哨",
-       "markaspatrolledtext": "å\93¨æ­¤å ±",
-       "markedaspatrolled": "派哨",
-       "markedaspatrolledtext": "[[:$1]]之審哨矣。",
+       "markaspatrolleddiff": "審此本",
+       "markaspatrolledtext": "審此æ\96\87",
+       "markedaspatrolled": "審此文",
+       "markedaspatrolledtext": "[[:$1]]之本審矣。",
        "rcpatroldisabled": "不哨近易",
        "rcpatroldisabledtext": "近易之哨,未准行也。",
-       "markedaspatrollederror": "哨有誤",
-       "markedaspatrollederrortext": "揀一以哨。",
-       "markedaspatrollederror-noautopatrol": "己易不可。",
+       "markedaspatrollederror": "無以定審",
+       "markedaspatrollederrortext": "爾當於誌中,擇一以為審。",
+       "markedaspatrollederror-noautopatrol": "己易不可自審。",
        "patrol-log-page": "誌哨",
        "patrol-log-header": "此乃誌哨也。",
        "log-show-hide-patrol": "$1誌巡",
        "revdelete-unrestricted": "除限自有秩",
        "logentry-newusers-create": "簿$1已{{GENDER:$2|增}}。",
        "rightsnone": "(凡)",
-       "revdelete-summary": "摘",
-       "searchsuggest-search": "尋",
+       "searchsuggest-search": "尋於 {{SITENAME}}",
        "pagelang-language": "語",
        "default-skin-not-found": "嚄!君於<code dir=\"ltr\">$wgDefaultSkin</code>所設之膚無以用也。君所用版本,似需含膚下者也。可於MediaWiki之官網[https://www.mediawiki.org/wiki/Manual:Skin_configuration “設膚”]之冊,以知啟而許膚之法。\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/lzh 群安之器]。若依此道,則將预安膚與拓器些許。君可謄而貼<code>skins/</code>于焉。\n:* 自[https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]獨載下安膚包。\n:* 以git徑謄自<code>mediawiki/skins/*</code>儲物库,至君MediaWiki副本之<code dir=\"ltr\">skins/</code>。\n: 若君MediaWiki開發者也,則為之應擾不及君之git儲物庫。\n\n; 若君MediaWiki新矣:\n: 自MediaWiki 1.24版本始,已安之膚不復自啟(見[https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 冊])。君可謄而貼字下者,至君圍紀之<code>LocalSettings.php</code>以啟膚已安者:\n\n<pre dir=\"ltr\">$3</pre>\n\n; 若君已改<code>LocalSettings.php</code>:\n: 请再查膚名,以保之無誤。",
        "mediastatistics-header-unknown": "未知",
index 7834379..6ed98c0 100644 (file)
@@ -10,7 +10,8 @@
                        "Reedy",
                        "The Evil IP address",
                        "아라",
-                       "Velg"
+                       "Velg",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "Link'iş tude kogu3’uxaçki:",
        "yourdomainname": "Skani domaini:",
        "login": "Sitʼeşa amaxti",
        "nav-login-createaccount": "Sitʼeşa amaxti / hesabi dokʼidi",
-       "userlogin": "Sitʼeşa amaxti / hesabi dokʼidi",
-       "userloginnocreate": "Sitʼeşa amaxti",
        "logout": "Siteşen Kogamaxti",
        "userlogout": "Siteşen Kogamaxti",
        "userlogin-joinproject": "{{SITENAME}}işe ak’ati",
-       "nologin": "Hesabi va giğuni? '''$1'''",
-       "nologinlink": "Hesabi dokʼidi.",
        "createaccount": "Hesabi dokʼidi",
-       "gotaccountlink": "Sitʼeşa amaxti",
-       "createaccountreason": "Muşen:",
        "createacct-reason": "Muşen",
        "mailmypassword": "Ağne pʼarola-çkimi moncğoni",
        "loginlanguagelabel": "Nena: $1",
        "rcshowhidemine": "çkimi oktirobape $1",
        "rcshowhidemine-show": "Ko3ʼiri",
        "rcshowhidemine-hide": "Şinaxi",
-       "rclinks": "Çodinaşi $2 ndğas na ixvenu çodinaşi $1 oktiroba ko3ʼiri;<br /> $3",
+       "rclinks": "Çodinaşi $2 ndğas na ixvenu çodinaşi $1 oktiroba ko3ʼiri;",
        "diff": "farkʼi",
        "hist": "tarixi",
        "hide": "Doşinaxi",
index ef6dbf2..7ec9acf 100644 (file)
@@ -43,7 +43,7 @@
        "tog-watchdeletion": "हमराद्वारा मेटाएल पृष्ठ हमर साकांक्ष सूचीमे राखी",
        "tog-watchrollback": "हमराद्वारा पूर्ववत कएल पृष्ठ हमर सांकक्ष सूचीमे राखी",
        "tog-minordefault": "हमर सभ सम्पादनसभ छोट परिवर्तनक रूपमे चिह्नित करी",
-       "tog-previewontop": "सम्पादन सन्दूक सँ पहिने झलक देखाबी",
+       "tog-previewontop": "सम्पादन सन्दूकसँ पहिने झलक देखाबी",
        "tog-previewonfirst": "पहिल सम्पादनक बाद पूर्वावलोकन देखाबी",
        "tog-enotifwatchlistpages": "जौं हमर ध्यानसूचीक कोनो पन्नामे परिवर्तन हुअए तँ हमरा इमेल पठाबी",
        "tog-enotifusertalkpages": "हमर वार्ता पृष्ठ परिवर्तित भेला पर हमरा इमेल करी",
        "login": "सम्प्रवेश",
        "login-security": "अपन पहचान सत्यापित करी",
        "nav-login-createaccount": "सम्प्रवेश / खाता खोली",
-       "userlogin": "सम्प्रवेश/ खाता बनाबी",
-       "userloginnocreate": "सम्प्रवेश",
        "logout": "निष्क्रमण",
        "userlogout": "फेर आयब",
        "notloggedin": "सम्प्रवेशित नै छी",
        "userlogin-noaccount": "खाता नै अछि?",
        "userlogin-joinproject": "{{SITENAME}}सँ जुडी",
-       "nologin": "खाता नै अछि? $1।",
-       "nologinlink": "नव खाता खोली",
        "createaccount": "खाता खोली",
-       "gotaccount": "पहिनहियेसँ खाता अछि? $1",
-       "gotaccountlink": "सम्प्रवेश",
-       "userlogin-resetlink": "अपन सम्प्रवेश विवरण बिसरि गेलौ?",
        "userlogin-resetpassword-link": "अपन कूटशब्द बिसरि गेलौ?",
        "userlogin-helplink2": "सम्प्रवेशित करवाक लेल मदति",
        "userlogin-loggedin": "अहाँ {{GENDER:$1|$1}}क रूपमे पहिनेसँ सम्प्रवेशित छी।\nकोनो दोसर सदस्यक रुपमे सम्प्रवेशित करवाक लेल देल गेल फारमके प्रयोग करी।",
        "createaccountmail": "एक अस्थायी यादृच्छिक कूटशब्द चुनी आ ओ निर्दिष्ट ई-मेल पता पर भेजी",
        "createaccountmail-help": "एकर उपयोग बिना पासवर्ड जानने कियो आन व्यक्तिके खाता खोलैक लिए उपयोग कएल जा सकैत अछि ।",
        "createacct-realname": "असली नाम (वैकल्पिक)",
-       "createaccountreason": "कारण:",
        "createacct-reason": "कारण:",
        "createacct-reason-ph": "अहाँ एक अन्य खाता कियाक बनाए रहल छी",
        "createacct-reason-help": "खाता निर्माण लगमे ई सन्देस देखाएल जाइत।",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वप्रदर्शन",
        "showdiff": "परिवर्तन देखाबी",
-       "blankarticle": "<strong>चेतावनी:</strong> अहाँ एक रिक्त पन्ना के निर्माण करि रहल छी।\nयदि अहाँ \"{{int:savearticle}}\" क पुनः दाबबै त पन्नाक बिना कोनो सामग्रीक निर्मित भ जाएत।",
+       "blankarticle": "<strong>चेतावनी:</strong> अहाँ एक रिक्त पन्ना के निर्माण करि रहल छी।\nयदि अहाँ \"$1\" क पुनः दाबबै त पन्नाक बिना कोनो सामग्रीक निर्मित भ जाएत।",
        "anoneditwarning": "<strong>चेतौनी:</strong> अहाँ सम्प्रवेश नै केनए छी । यदि अहाँ सम्पादन करबै तहन ई पृष्ठक सम्पादन इतिहासमे अहाँक आइपी ठेगान दर्ज कएल जाएत। यदि अहाँ <strong>[$1 सम्प्रवेश]</strong> करैत छी अथवा <strong>[$2 खाता बनाबैत छी]</strong> तहन अन्य सुविधासभ संगे अहाँक सम्पादनसभक श्रेय अहाँक प्रयोगकर्तानाम पर दएल जाएत।",
        "anonpreviewwarning": "<em>अहाँ सम्प्रवेशित नै छी। अखन रक्षण केलासँ अहाँक अनिकेत पता ई पन्नाक सम्पादन इतिहासमे दर्ज भऽ जाएत।</em>",
-       "missingsummary": "<strong>स्मारक:</strong> अहाँ सम्पादन सार नै देने छी।\nजँ अहाँ फेरसँ क्लिक करब \"{{int:savearticle}}\", अहाँक सम्पादन बिना एकर संरक्षित भऽ जाएत।",
-       "selfredirect": "<strong>चेतावनी:</strong> आहाँ स्वेम के ई पन्ना पुनः निर्देशीत कएर रहल छी।\nआहाँ अनुप्रेषित के लेल गलत लक्ष्य निर्दिष्ट भ्या सकएत अछि, या आहाँ गलत पन्ना कें संपादन कैर सकएत छी।\nआहाँ फेरो से \"{{int:savearticle}}\" क्लिक करएत छी, रीडायरेक्ट ओनाहो भी बनाबल जेल अछि।",
+       "missingsummary": "<strong>स्मारक:</strong> अहाँ सम्पादन सार नै देने छी।\nजँ अहाँ फेरसँ क्लिक करब \"$1\", अहाँक सम्पादन बिना एकर संरक्षित भऽ जाएत।",
+       "selfredirect": "<strong>चेतावनी:</strong> आहाँ स्वेम के ई पन्ना पुनः निर्देशीत कएर रहल छी।\nआहाँ अनुप्रेषित के लेल गलत लक्ष्य निर्दिष्ट भ्या सकएत अछि, या आहाँ गलत पन्ना कें संपादन कैर सकएत छी।\nआहाँ फेरो से \"$1\" क्लिक करएत छी, रीडायरेक्ट ओनाहो भी बनाबल जेल अछि।",
        "missingcommenttext": "कृपा कऽ अपन विचार नीचाँ प्रविष्ट करी।",
-       "missingcommentheader": "<strong>अनुस्मारक:</strong> अहाँ ई टिप्पणीके कोनो शीर्षक नै देनए छी।\nयदि अहाँ \"{{int:savearticle}}\" पर पुन: क्लिक करैत छी तँ अहाँक परिवर्तन बिना शीर्षक रक्षण कएल जाइत।",
+       "missingcommentheader": "<strong>अनुस्मारक:</strong> अहाँ ई टिप्पणीके कोनो शीर्षक नै देनए छी।\nयदि अहाँ \"$1\" पर पुन: क्लिक करैत छी तँ अहाँक परिवर्तन बिना शीर्षक रक्षण कएल जाइत।",
        "summary-preview": "सारांश पूर्वावलोकन",
        "subject-preview": "विषयक झलक:",
        "previewerrortext": "अहाँक परिवर्तनके पूर्वावलोकन करहिक समय एक त्रुटि आएल।",
        "userinvalidcssjstitle": "'''चेतौनी:''' ऐ मे कोनो आवरण \"$1\" नै अछि।\nबनाएल .css आ .js पन्ना लघ्वक्षरक शीर्षकक प्रयोग करैत अछि, जेना {{ns:user}}:Foo/vector.css एकर विरुद्ध {{ns:user}}:Foo/Vector.css ।",
        "updated": "(अद्यतन  कएल)",
        "note": "<strong>टिप्पणी:</strong>",
-       "previewnote": "'''मोन राखू ई मातर पूर्वावलोकन छी।'''\nअहाँक परिवर्तन अखन धरि सँचिआएल नै गेल अछि!",
+       "previewnote": "<strong>मोन राखू ई मात्र पूर्वावलोकन छी।</strong>\nअहाँक परिवर्तन अखन धरि सङ्ग्रह नै कएल गेल अछि!",
        "continue-editing": "सम्पादन क्षेत्र जाए",
        "previewconflict": "ई पूर्वदृश्य देखबैए उपरका सम्पादन क्षेत्रक पाठ, ई आएत जखन अहाँ संरक्षित करब।",
        "session_fail_preview": "'''क्षमा करी! सेशन डाटा नष्ट होमएक कारण अहाँक परिवर्तन रक्षण नै कएल जा सकल।'''\nकृपया पुन: प्रयास करी । यदि एकर बादो सफल नै भेल तँ कृपया [[Special:UserLogout|लग आउट]] करि पुनः सम्प्रवेश करी।",
-       "session_fail_preview_html": "à¤\95à¥\8dषमा à¤\95रà¥\80! à¤¸à¥\87शन à¤¡à¤¾à¤\9fा à¤¨à¤·à¥\8dà¤\9f à¤¹à¥\8bमà¤\8fà¤\95 à¤\95ारण à¤\85हाà¤\81à¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤°à¤\95à¥\8dषण à¤¨à¥\88 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95ल।\n\n<em>à¤\9aà¥\82à¤\81à¤\95ि {{SITENAME}} à¤ªà¤° à¤°à¤µ à¤\8fà¤\9aà¤\9fिà¤\8fमà¤\8fल à¤¸à¤\95à¥\8dषम à¤\85à¤\9bि, à¤\9cाभासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤¹à¤®à¤²à¤¾ à¤¸à¤\81 à¤¬à¤\9aावà¤\95 à¤²à¥\87ल à¤\9dलà¤\95 à¤¨à¥\88 à¤¦à¥\87à¤\96ाà¤\8fल à¤\97à¥\87ल à¤\85à¤\9bि।</em>\n\n<strong>à¤\85à¤\97र à¤\88 à¤\85हाà¤\81à¤\95 à¤µà¥\88ध à¤¸à¤®à¥\8dपादन à¤¯à¤¤à¥\8dन à¤\9bल, à¤¤à¤\81 à¤\95à¥\83पया à¤ªà¥\81नà¤\83 à¤ªà¥\8dरयास à¤\95रà¥\80।</strong>\nयदि à¤\8fà¤\95र à¤¬à¤¾à¤¦à¥\8b à¤¸à¤«à¤² à¤¨à¥\88 à¤­à¥\87ल à¤¤à¤\81 à¤\95à¥\83पया [[Special:UserLogout|लà¤\97 à¤\86à¤\89à¤\9f]] à¤\95रि à¤ªà¥\81नà¤\83 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87श à¤\95रà¥\80 à¤¤à¤¥à¤¾ à¤\9cाà¤\81à¤\9aà¥\80 à¤¯à¤¦à¤¿ à¤\85हाà¤\81à¤\95 à¤¬à¥\8dराà¤\89à¤\9cर à¤\8fहि à¤¸à¤¾à¤\87à¤\9f सँ कुकिजक अनुमति दैत अछि।",
+       "session_fail_preview_html": "à¤\95à¥\8dषमा à¤\95रà¥\80! à¤¸à¥\87शन à¤¡à¤¾à¤\9fा à¤¨à¤·à¥\8dà¤\9f à¤¹à¥\8bमà¤\8fà¤\95 à¤\95ारण à¤\85हाà¤\81à¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤°à¤\95à¥\8dषण à¤¨à¥\88 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95ल।\n\n<em>à¤\9aà¥\82à¤\81à¤\95ि {{SITENAME}} à¤ªà¤° à¤\95à¤\9aà¥\8dà¤\9aा à¤\8fà¤\9aà¤\9fिà¤\8fमà¤\8fल à¤¸à¤\95à¥\8dषम à¤\85à¤\9bि, à¤\9cाभासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤¹à¤®à¤²à¤¾à¤¸à¤\81 à¤¬à¤\9aावà¤\95 à¤²à¥\87ल à¤\9dलà¤\95 à¤¨à¥\88 à¤¦à¥\87à¤\96ाà¤\8fल à¤\97à¥\87ल à¤\85à¤\9bि।</em>\n\n<strong>यदि à¤\88 à¤\85हाà¤\81à¤\95 à¤µà¥\88ध à¤¸à¤®à¥\8dपादन à¤¯à¤¤à¥\8dन à¤\9bल, à¤¤à¤\81 à¤\95à¥\83पया à¤ªà¥\81नà¤\83 à¤ªà¥\8dरयास à¤\95रà¥\80।</strong>\nयदि à¤\8fà¤\95र à¤¬à¤¾à¤¦à¥\8b à¤¸à¤«à¤² à¤¨à¥\88 à¤­à¥\87ल à¤¤à¤\81 à¤\95à¥\83पया [[Special:UserLogout|निषà¥\8dà¤\95à¥\8dरमण]] à¤\95रि à¤ªà¥\81नà¤\83 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87श à¤\95रà¥\80 à¤¤à¤¥à¤¾ à¤\9cाà¤\81à¤\9aà¥\80 à¤¯à¤¦à¤¿ à¤\85हाà¤\81à¤\95 à¤¬à¥\8dराà¤\89à¤\9cर à¤\88 à¤¸à¤¾à¤\87à¤\9fसँ कुकिजक अनुमति दैत अछि।",
        "token_suffix_mismatch": "'''अहाँक सम्पादन अस्वीकार कऽ देल गेल अछि कारण अहाँक ग्राहक प्रेष्यमान अंक विधानक विराम चेन्ह सभकेँ नष्ट कऽ देलन्हि।'''\nई सम्पादन पन्नाक पाठकेँ दूषित होएबासँ बचेबा लेल अमान्य कऽ देल गेल।\nई कखनो काल होइए जखन अहाँ जाल आधारित अनाम दोसरा लेल चल सेवा प्रयुक्त करै छी।",
        "edit_form_incomplete": "<strong>सम्पादन आवेदनक किछु भाग वितरक धरि नै पहुँचल; एक बेर फेर देखी जे अहाँक सम्पादन दुरुस्त अछि आ फेरसँ प्रयास करी।</strong>",
        "editing": "सम्पादन होइए $1",
        "editingsection": "सम्पादन कऽ रहल छी $1 (खण्ड)",
        "editingcomment": "सम्पादन कऽ रहल छी $1 (नव खण्ड)",
        "editconflict": "सम्पादन अन्तर्विरोध: $1",
-       "explainconflict": "जखन अहाँ एकर सम्पादन आरम्भ केने रही तखनसँ कियो आन ऐ पन्नाकेँ बदलि देलक।\nउपरका पाठ क्षेत्र अखन उपस्थित पन्नाक पाठ देखबैत अछि।\nअहाँक परिवर्तन निचुलका पाठ क्षेत्रमे देखाएल अछि।\nअहाँकेँ अपन परिवर्तन वर्तमान पाठमे मिलाबऽ पडत।\n<strong>मात्र</strong> \"{{int:savearticle}}\" दबलापर उपरका पाठ क्षेत्रक पाठ संरक्षित हएत।",
+       "explainconflict": "जखन अहाँ एकर सम्पादन आरम्भ केने रही तखनसँ कियो आन ऐ पन्नाकेँ बदलि देलक।\nउपरका पाठ क्षेत्र अखन उपस्थित पन्नाक पाठ देखबैत अछि।\nअहाँक परिवर्तन निचुलका पाठ क्षेत्रमे देखाएल अछि।\nअहाँकेँ अपन परिवर्तन वर्तमान पाठमे मिलाबऽ पडत।\n<strong>मात्र</strong> \"$1\" दबलापर उपरका पाठ क्षेत्रक पाठ संरक्षित हएत।",
        "yourtext": "अहाँक पाठ",
        "storedversion": "पेटारमे राखल संशोधन",
        "nonunicodebrowser": "'''चेतौनी: अहाँक गवेषक सार्वत्रिकाक्षरकूट सहयोगी नै अछि।'''\nएकटा अस्थायी-परोक्ष तंत्रांश अहाँकेँ सुरक्षित रूपेँ पन्नाक सम्पादनमे मदति करत: गएर-अस्की अक्षर सभ षोडशमान पद्धतिमे सम्पादन बक्सामे आएत।",
        "edit-no-change": "अहाँक सम्पादनपर ध्यान नै देल गेल, कारण ऐ सँ पाठमे कोनो परिवर्तन नै आएल।",
        "postedit-confirmation-created": "पन्ना निर्माण करल गेल अछि ।",
        "postedit-confirmation-restored": "पन्नाके पुराण स्थितिमे लौने गेल अछि ।",
-       "postedit-confirmation-saved": "अहाक सम्पादन सुरक्षित भेल ।",
+       "postedit-confirmation-saved": "à¤\85हाà¤\81à¤\95 à¤¸à¤®à¥\8dपादन à¤¸à¥\81रà¤\95à¥\8dषित à¤­à¥\87ल à¥¤",
        "edit-already-exists": "नव पन्नाक निर्माण नै भऽ सकल।\nई पहिनहियेसँ वर्तमान अछि।",
        "defaultmessagetext": "पूर्वनिर्धारित सन्देश पाठ",
        "content-failed-to-parse": "$1 के लेल $2 सामग्री के बिच्छेदन करए में विफल, त्रुटि: $3",
        "right-editsemiprotected": "संरक्षित पन्ना सम्पादित करू (बिना तराउपड़ी सुरक्षाक)",
        "right-editcontentmodel": "एक पन्ना के सामग्री मॉडल कें सम्पादन।",
        "right-editinterface": "प्रयोक्ता मध्यस्थक सम्पादन करू",
-       "right-editusercssjs": "दोसर प्रयोक्ताक सी.एस.एस. आ जावास्क्रिप्ट संचिका सभक सम्पादन करू",
        "right-editusercss": "दोसर प्रयोक्ता सभक सी.एस.एस. संचिका सभक सम्पादन करू",
        "right-edituserjs": "दोसर प्रयोक्ताक जावास्क्रिप्ट संचिका सभक सम्पादन करू",
        "right-editmyusercss": "अपन प्रयोक्ता स्तरके सी.एस.एस.फाइल स संपादित करु",
        "right-editmyprivateinfo": "अपन व्यक्तिगत डाटा सम्पादित करू (जेना ई-मेल पता, असली नाम)",
        "right-editmyoptions": "अपन वरीयतासभ सम्पादित करु",
        "right-rollback": "कृपा कऽ अन्तिम प्रयोक्ताक सम्पादन सभकेँ प्रत्यावर्तित करू जे एक खास पन्नाकेँ सम्पादित केलन्हि",
-       "right-markbotedits": "प्रत्यावर्तित सम्पादन सभकेँ स्वचालित सम्पादन देखाउ",
+       "right-markbotedits": "प्रत्यावर्तित सम्पादन सभके बोट सम्पादन देखाबी",
        "right-noratelimit": "दरक सीमासँ प्रभावित नै",
-       "right-import": "दà¥\8bसर à¤µà¤¿à¤\95à¥\80सà¤\81 à¤ªà¤¨à¥\8dना à¤²à¤¿à¤\85",
+       "right-import": "à¤\85नà¥\8dय à¤µà¤¿à¤\95à¥\80सà¤\81 à¤ªà¥\83षà¥\8dठ à¤\86यात à¤\95रà¥\80",
        "right-importupload": "पन्नासभकेँ संचिका उपारोपणसँ आनू",
        "right-patrol": "अन्य सदस्यसभक सम्पादन परीक्षित चिन्हित करी",
        "right-autopatrol": "अपन सम्पादन स्वचालित रूपसँ परीक्षित चिन्हित करी",
        "action-block": "ई प्रयोक्ताकेँ सम्पादनसँ रोकू",
        "action-protect": "ई पन्नाक सुरक्षा स्तर बदलू",
        "action-rollback": "कृपा कऽ अन्तिम प्रयोक्ताक सम्पादनकेँ प्रत्यावर्तित करू जे एक खास पन्नाकेँ सम्पादित केलन्हि",
-       "action-import": "à¤\90 à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\81 à¤¦à¥\8bसर à¤µà¤¿à¤\95à¥\80सà¤\81 à¤\86नà¥\82",
+       "action-import": "à¤\95à¥\8bनà¥\8b à¤\85नà¥\8dय à¤µà¤¿à¤\95à¥\80सà¤\81 à¤ªà¥\83षà¥\8dठ à¤\86यात à¤\95रà¥\80",
        "action-importupload": "ऐ पन्नाकेँ संचिका उपारोपणसँ आनू",
        "action-patrol": "अन्य सदस्यसभक सम्पादन परीक्षित करी",
        "action-autopatrol": "अपन सम्पादन स्वचालित रूपसँ परीक्षित करी",
        "action-editmyprivateinfo": "अपन व्यक्तिगत जानकारी सम्पादित करी",
        "action-editcontentmodel": "एक पन्ना के सामग्री मॉडल कें सम्पादन।",
        "action-managechangetags": "ट्याग बनाबी आ सक्षम (असक्षम) करी",
-       "action-applychangetags": "à¤\86हाà¤\81 à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤\9fà¥\88à¤\97 à¤\9cà¥\8bडà¥\82।",
+       "action-applychangetags": "à¤\85हाà¤\81à¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\95 à¤¸à¤\82à¤\97 à¤\9fà¥\8dयाà¤\97 à¤\9cà¥\8bड़à¥\80।",
        "action-changetags": "जमा करु आर हटाबु स्वतंत्र टैग व्यक्तिगत अवतरण आर लॉग प्रविक्ति पे",
        "action-deletechangetags": "डेटाबेस सँ ट्याग मेटाबी",
        "action-purge": "पृष्ठक क्यास खाली करी",
        "rcshowhidecategorization": "$1 पृष्ठ श्रेणीकरण",
        "rcshowhidecategorization-show": "देखाबी",
        "rcshowhidecategorization-hide": "नुकाबी",
-       "rclinks": "पिछला $2 दिनमे भएल $1 परिवर्तन देखाबी<br />$3",
+       "rclinks": "पिछला $2 दिनमे भएल $1 परिवर्तन देखाबी",
        "diff": "अन्तर",
        "hist": "इति.",
        "hide": "नुकाबी",
        "filerevert-legend": "घुराएल संचिका",
        "filerevert-intro": "अहाँ संचिका घुराबैले छी '''[[Media:$1|$1]]''' केँ [$4 संस्करण $3, $2 केँ] लग।",
        "filerevert-comment": "कारण:",
-       "filerevert-defaultcomment": "$2, $1 ($3)à¤\95 à¤\85वतरण à¤ªà¥\82रà¥\8dववत à¤\95à¤\8fलक",
+       "filerevert-defaultcomment": "$2, $1 ($3)à¤\95 à¤\85वतरण à¤ªà¥\82रà¥\8dववत à¤\95à¥\87लक",
        "filerevert-submit": "फेरसँ वएह",
        "filerevert-success": "'''[[Media:$1|$1]]''' घुराएल गेल [$4 version as of $3, $2] लग।",
        "filerevert-badversion": "ओइ कालक कोनो पुरान स्थानीय संस्करण ऐ संचिकाक नै अछि।",
        "emailsent": "ई-पत्र पठेलौं",
        "emailsenttext": "अहाँक ई-पत्र सन्देश पठाएल गेल।",
        "emailuserfooter": "ई ई-मेल $1 {{GENDER:$1|द्वारा}} {{GENDER:$2|$2}}क भेजल गेल छल जेकर लेल \"{{int:emailuser}}\" कार्यके {{SITENAME}} पर प्रयोगमे लाबल गेल छल।",
-       "usermessage-summary": "प्रणाली सन्देश छोडि रहल अछि।",
+       "usermessage-summary": "पà¥\8dरणालà¥\80 à¤¸à¤¨à¥\8dदà¥\87श à¤\9bà¥\8bड़ि à¤°à¤¹à¤² à¤\85à¤\9bि।",
        "usermessage-editor": "प्रणालीक दूत",
        "usermessage-template": "मीडियाविकी:प्रयोक्ता संदेश",
        "watchlist": "साकांक्षसूची",
        "undeleteviewlink": "देखू",
        "undeleteinvert": "उनटा चयन",
        "undeletecomment": "कारण:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisions}} घुराएल",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 संशोधन|$1 संशोधन}} and {{PLURAL:$2|1 संचिका|$2 संचिका}} आनल",
-       "undeletedfiles": "{{PLURAL:$1|1 संचिका|$1 संचिका सभ}} आनल",
        "cannotundelete": "किछ वा सभ मेटाएल वापिस असफल:\n$1",
        "undeletedpage": "'''$1 के पुनर्स्थापित करल गेल अछि'''\n\nलग पास में हटाओल गेल आ पुनर्स्थापित कएल गेल पन्ना सभके जानकारी के लेल [[Special:Log/delete|हटाओल गेल लग]] देखु।",
        "undelete-header": "हालक मेटाएल पन्ना के लेल [[Special:Log/delete|हटाएल लग]] देखू।",
        "sp-contributions-blocked-notice-anon": "ई अनिकेत अखन प्रतिबन्धित अछि।\nअद्यतन प्रतिबन्धित  वृत्तलेख लेखा सन्दर्भ नीचाँ देल अछि:",
        "sp-contributions-search": "अवदानक लेल ताकू",
        "sp-contributions-username": "अनिकेत संकेत वा प्रयोक्तानाम:",
-       "sp-contributions-toponly": "मात्र ओइ सम्पादन देखाबी जे अद्यतन संशोधन छी।",
-       "sp-contributions-newonly": "मात्र ओइ सम्पादन देखाउ जे पृष्ठ निर्मित भेल अछि",
+       "sp-contributions-toponly": "मात्र ओ सम्पादन देखाबी जे नवीनतम संशोधन छी।",
+       "sp-contributions-newonly": "मात्र ओ सम्पादन देखाबी जहिसँ पृष्ठ निर्मित भेल अछि",
        "sp-contributions-hideminor": "अल्प सम्पादन नुकाबी",
        "sp-contributions-submit": "ताकू",
        "whatlinkshere": "एतय कोन लिङ्क अछि",
        "thumbnail_gd-library": "अपूर्ण जी.डी.पुस्तकालय विन्यास: प्रकार्य $1 अनुपस्थित",
        "thumbnail_image-missing": "संचिका लगैए अनुपस्थित अछि: $1",
        "import": "पन्ना सभकेँ आनू",
-       "importinterwiki": "à¤\95à¥\8bनà¥\8b à¤\94र à¤µà¤¿à¤\95ि सँ आयात करी",
+       "importinterwiki": "à¤\95à¥\8bनà¥\8b à¤\85नà¥\8dय à¤µà¤¿à¤\95à¥\80सँ आयात करी",
        "import-interwiki-text": "एकटा विकी आ पन्ना शीर्षक आनैलेल चुनू।\nसंशोधन तिथि आ सम्पादकक नाम सुरक्षित रहत।\nसभटा ट्रान्सविकी आयात क्रिया सम्प्रवेशित [[Special:Log/import|आयात लग]] पर रहत।",
        "import-interwiki-sourcewiki": "मूल विकि:",
        "import-interwiki-sourcepage": "मूल पन्ना:",
        "import-interwiki-submit": "आयात",
        "import-mapping-default": "पूर्व निर्धारित स्थान सभ पर आयात करी",
        "import-mapping-namespace": "कोनो नामस्थान पर आयात करी",
-       "import-mapping-subpage": "निम्न लिखित पृष्ठ के उपपृष्ठ के रूप में आयात करी:",
+       "import-mapping-subpage": "निम्न लिखित पृष्ठके उपपृष्ठक रूपमे आयात करी:",
        "import-upload-filename": "संचिकानाम:",
        "import-comment": "समीक्षा:",
        "importtext": "मूल विकी [[Special:Export|export utility]] क प्रयोग कऽ संचिका पठाउ।\nअपन संगणकमे एकरा सुरक्षित करू आ एतए उपारोपित करू।",
        "xml-error-string": "$1 पाँतीपर $2, col $3 (byte $4): $5",
        "import-upload": "एक्स.एम.एल. दत्तांश उपारोपित करू",
        "import-token-mismatch": "सेशन डाटा नष्ट भेल।\nअहाँ सायद लग आउट क गेल छी।<strong>कृपया जाँच करी की अहाँ सम्प्रवेशित छी</strong>।\nयदि एकर बादो सफल नै भेल तँ कृपया [[Special:UserLogout|लग आउट]] करि पुनः सम्प्रवेश करी।",
-       "import-invalid-interwiki": "विशिषà¥\8dà¤\9f à¤µà¤¿à¤\95à¥\80सà¤\81 à¤\86यात à¤¨à¥\88 à¤\95ऽ à¤¸à¤\95à¥\88 à¤\9bà¥\80।",
+       "import-invalid-interwiki": "à¤\88 à¤µà¤¿à¤\95à¥\80सà¤\81 à¤\86यात à¤¨à¥\88 à¤­à¤½ à¤¸à¤\95à¥\88त à¤\85à¤\9bि।",
        "import-error-edit": "\"$1\" पन्ना आयातित नै कएल गेल अछि कारण अहाँकेँ एकरा सम्पादित करबाक अधिकार नै अछि।",
        "import-error-create": "\"$1\" पन्ना आयातित नै कएल गेल अछि कारण अहाँकेँ एकरा निर्माण करबाक अधिकार नै अछि।",
        "import-error-interwiki": "पृष्ठ \"$1\" आयात नै केल गेल कियाकि एकर नाम अन्तरविकि जडी बनाबै के लेल आरक्षित अछि।",
        "importlogpage": "आयात सूची",
        "importlogpagetext": "पन्ना सभक प्रशासनिक आयात दोसर विकीक सम्पादन इतिहासक संग।",
        "import-logentry-upload-detail": "$1 अवतरण आयात {{PLURAL:$1|केलक|कएल गेल}}",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|सुधार|सुधार सभ}} $2 सँ",
+       "import-logentry-interwiki-detail": "$2 सँ $1 अवतरण आयात {{PLURAL:$1|कएल गेल|केल गेल}}",
        "javascripttest": "जावास्क्रिप्ट परिक्षण",
        "javascripttest-pagetext-unknownaction": "अज्ञात क्रिया \"$1\" ।",
        "javascripttest-qunit-intro": "mediawiki.org पर [$1 परीक्षण के प्रलेखन] देखु।",
        "dberr-problems": "दुखी छी! ई जालस्थल तकनीकी समस्या अनुभव कऽ अछि।",
        "dberr-again": "किछु काल रुकी आ फेरसँ जानकारी भरी।",
        "dberr-info": "(दत्तनिधि वितरकके सम्पर्क नै कऽ सकल: $1)",
-       "dberr-info-hidden": "(दतà¥\8dतनिधि à¤µà¤¿à¤¤à¤°à¤\95à¤\95à¥\87 à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤¨à¥\88 à¤\95ऽ à¤¸à¤\95ल: $1)",
+       "dberr-info-hidden": "(डाà¤\9fाबà¥\87ससà¤\81 à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤¨à¥\88 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95ल)",
        "dberr-usegoogle": "ऐ बीचमे अहाँ गूगलसँ खोज कऽ सकै छी।",
        "dberr-outofdate": "मोन राखू जे हमर सामिग्रीक ओकर सूची पुरान भऽ सकैए।",
        "dberr-cachederror": "ई आग्रह कएल पन्नाक उपस्मृति संरक्षित द्वितीयक अछि, आ भऽ सकैए जे अद्यतन नै हुअए।",
        "revdelete-uname-unhid": "प्रयोक्तानाम सोझाँ",
        "revdelete-restricted": "संचालक लेल प्रायोगिक प्रतिबन्ध",
        "revdelete-unrestricted": "संचालक लेल हटाओल प्रतिबन्ध",
-       "logentry-import-upload": "$1 {{GENDER:$2|आयात केल गेल}} $3 संचिका उपारोपन के माध्यम सँ",
-       "logentry-import-interwiki": "$1 {{GENDER:$2|आयात कएल गेल}} $3 कोनो और विकिसँ",
+       "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 कें ($4 {{PLURAL:$4|अवतरण|अवतरणसभ}})कें $5सँ {{GENDER:$2|आयात}} केलक।",
        "logentry-merge-merge": "$1 {{GENDER:$2|विलय केल गेल}} $3 के $4 में (संशोधन $5 धरि)",
-       "logentry-move-move": "$1दà¥\8dवारा $3 à¤ªà¥\83षà¥\8dठ $4 à¤ªà¤° {{GENDER:$2|सà¥\8dथानानà¥\8dतरित}} à¤\95à¤\8fलक",
-       "logentry-move-move-noredirect": "$1 द्वारा $3 पर पुनर्निर्देशन नै छोडि ओकरा $4 पर {{GENDER:$2|स्थानान्तरित}} केलक",
+       "logentry-move-move": "$1दà¥\8dवारा $3 à¤ªà¥\83षà¥\8dठ $4 à¤ªà¤° {{GENDER:$2|सà¥\8dथानानà¥\8dतरित}} à¤\95à¥\87लक",
+       "logentry-move-move-noredirect": "$1 à¤¦à¥\8dवारा $3 à¤ªà¤° à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤¨à¥\88 à¤\9bà¥\8bड़ि à¤\93à¤\95रा $4 à¤ªà¤° {{GENDER:$2|सà¥\8dथानानà¥\8dतरित}} à¤\95à¥\87लà¤\95",
        "logentry-move-move_redir": "$1 द्वारा $4 सँ पुनर्निर्देशन हटाए $3 क ओहिपर {{GENDER:$2|स्थानान्तरित}} केलक",
        "logentry-move-move_redir-noredirect": "$1 द्वारा $4 सँ पुनार्निर्देश हटाए $3 पर पुनर्निर्देश नै छोडि $3 के $4 पर {{GENDER:$2|स्थानान्तरित}} केलक",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|चिन्हित}} संशोधन $4 $3 पन्नाक निरीक्षित",
        "logentry-upload-upload": "$1 {{GENDER:$2|ए}} $3 अपलोड केलक",
        "log-name-tag": "ट्याग लौग",
        "rightsnone": "(कोनो नै)",
-       "revdelete-summary": "सम्पादन सारांश",
        "feedback-adding": "पन्ना उपर प्रतिक्रिया जोडु ...",
        "feedback-back": "पाछां",
        "feedback-bugcheck": "बहुत निक! जांच करु कि [ $1 known bugs] पहिले स त नै अछि ।",
        "expand_templates_remove_comments": "टिप्पणी हटाउ",
        "expand_templates_remove_nowiki": "परिणाम में <nowiki> ट्याग हटाउ",
        "expand_templates_generate_xml": "XML के पार्स (parse) वृक्ष देखाउ",
+       "expand_templates_preview": "पूर्वावलोकन",
        "pagelanguage": "पृष्ठ भाषा परिवर्तन करी",
        "pagelang-name": "पन्ना",
        "pagelang-language": "भाषा",
index fe20055..507d04f 100644 (file)
        "readonlytext": "Basis data agi dikonci sekang inputan anyar lan modifikasi liyane, ndeyane agi ana perawatan basis data, seuwise kuwe toli bakal mbalik normal maning.\n\nAdministrator sing ngunci kiye aweh katerangan kaya kiye: $1",
        "missing-article": "Basis data ora teyeng nemokna teks paca sing kudune ana, yaiku \"$1\" $2.\n\nKiye biasanye jalaran pranala daluwarsa maring revisi sedurunge sekang kaca sing wis dibusak.\n\nAngger dudu kuwe sebabe, Rika ndeyan nemokna \"bug\" nang software. \nMonggo dilaporna maring [[Special:ListUsers/sysop|administrator]], karo nyebutna URL sing dituju.\n\nA",
        "missingarticle-rev": "(révisi#: $1)",
-       "missingarticle-diff": "(Béda: $1, $2)",
+       "missingarticle-diff": "(Beda: $1, $2)",
        "readonly_lag": "Basis data uwis dikunci otomatis sawetara basis data sekunder lagi nglakokna sinkronisasi karo basis data utama",
        "internalerror": "Kasalahan internal",
        "internalerror_info": "Kasalahan internal: $1",
        "externaldberror": "Ana kesalahan otentikasi basis data utawa Rika ora olih nglakokna pemutakhiran maring akun eksternale Rika.",
        "login": "Melebu",
        "nav-login-createaccount": "Mlebu / gawe kaca anggota (akun)",
-       "userlogin": "Melebu / gawe kaca anggota (account)",
-       "userloginnocreate": "Mlebu log",
        "logout": "Metu Log",
        "userlogout": "Metu Log",
        "notloggedin": "Durung mlebu log",
        "userlogin-noaccount": "Durung duwe akun?",
        "userlogin-joinproject": "Melu {{SITENAME}}",
-       "nologin": "Durung duwe akun? $1.",
-       "nologinlink": "Gawe akun anyar",
        "createaccount": "Gawe akun anyar",
-       "gotaccount": "Wis duwe akun? $1.",
-       "gotaccountlink": "Mlebu log",
-       "userlogin-resetlink": "Apa Rika kelalen info detil nggo mlebune?",
        "userlogin-resetpassword-link": "Rika kelalen tembung sandhine?",
        "userlogin-helplink2": "Pitulung mlebu log",
        "userlogin-loggedin": "Rika uwis mlebu log nganggo jeneng {{GENDER:$1|$1}}.\nGunakna formulir nang ngisor kiye kanggo mlebu log dadi pangganggo sejen.",
        "createacct-another-email-ph": "Lebokna alamat imel",
        "createaccountmail": "Gunakna tembung sandhi acak sementara lan kirimna maring alamat imel",
        "createacct-realname": "Jeneng asli (ora kudu)",
-       "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Kenangapa Rika nggawe akun sejen",
        "createacct-submit": "Gawe akune Rika",
        "passwordreset-emaildisabled": "Fitur imel wis dinonaktifna nang wiki kiye.",
        "passwordreset-username": "Jeneng panganggo:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Deleng imel hasile?",
-       "passwordreset-capture-help": "Angger Rika nyonteng kotak kiye, imel (sing isi tembung sandhi sauntara) bakal ditidokna maring Rika barengan karo dikirimna maring panganggo.",
        "passwordreset-email": "Alamat imel:",
        "passwordreset-emailtitle": "Detil akun nang {{SITENAME}}",
        "passwordreset-emailelement": "Jeneng panganggo: \n$1\n\nTembung sandhi sauntara: \n$2",
        "anonpreviewwarning": "''Rika durung mlebu log. Nyimpen kaca bakal nyatetna alamat IP-ne Rika nang riwayat suntingan kaca kiye.''",
        "missingsummary": "'''Pènget:''' Rika ora nglebokna ringkesan panyuntingan. \nAngger Rika mencèt tombol Simpen maning, suntingane Rika bakal kasimpen tanpa ringkesan panyuntingan.",
        "missingcommenttext": "Tulung lebokna komentar nang ngisor kiye.",
-       "missingcommentheader": "'''Pènget:''' Rika ora nglebokna subjek/judul nggo komentare Rika kiye. \nAngger Rika mencèt \"{{int:savearticle}}\" maning, suntingane Rika bakal kasimpen tanpa komentar kuwe.",
+       "missingcommentheader": "'''Pènget:''' Rika ora nglebokna subjek/judul nggo komentare Rika kiye. \nAngger Rika mencèt \"$1\" maning, suntingane Rika bakal kasimpen tanpa komentar kuwe.",
        "summary-preview": "Pratayang ringkesan:",
        "subject-preview": "Pratayang subyèk/judul:",
        "blockedtitle": "Panganggo diblokir",
        "template-protected": "(direksa)",
        "template-semiprotected": "(semi-pangreksan)",
        "hiddencategories": "Kaca kiye kuwe anggota sekang {{PLURAL:$1|1 kategori sing diumpetna|$1 kategori-kategori sing diumpetna}}:",
-       "nocreatetext": "{{SITENAME}} wis mbatesi panggawean kaca anyar.\nRika teyeng mbalik lan nyunting kaca sing wis ana, utawa [[Special:UserLogin|mlebu utawa gawe akun]]",
+       "nocreatetext": "{{SITENAME}} wis mbatesi panggawean kaca anyar.\nRika teyeng mbalik lan nyunting kaca sing wis ana, utawa [[Special:UserLogin|mlebu]] utawa [[Special:CreateAccount|gawe akun]]",
        "nocreate-loggedin": "Rika ora duwe hak akses nggo gawe kaca anyar.",
        "sectioneditnotsupported-title": "Panyuntingan bagiya ora didukung",
        "permissionserrorstext-withaction": "Rika ora duwé hak aksès kanggo $2, jalaran {{PLURAL:$1|alesan|alesan}} nang ngisor kiye:",
        "saveprefs": "Simpen",
        "restoreprefs": "Balekna kabeh setelan gawane (nang kabeh bagiyan)",
        "prefs-editing": "Panyuntingan",
-       "rows": "Baris:",
        "searchresultshead": "Goleti",
        "stub-threshold": "Ambang wates kanggo format <a href=\"#\" class=\"stub\">pranala rintisan</a> (bita):",
        "stub-threshold-disabled": "Dinonaktifna",
        "userrights-reason": "Alesan:",
        "userrights-no-interwiki": "Rika ora duwe hak kanggo ngowahi hak panganggo nang wiki liyane.",
        "userrights-nodatabase": "Basis data $1 ora ana utawa ora lokal.",
-       "userrights-nologin": "Rika kudu [[Special:UserLogin|mlebu log]] nganggo akun pangurus ben teyeng ngowahi hak panganggo.",
-       "userrights-notallowed": "Akune Rika ora duwe hak kanggo nambah utawa ngilangna hak panganggo.",
        "userrights-changeable-col": "Grup sing teyeng Rika owahi",
        "userrights-unchangeable-col": "Grup sing ora teyeng Rika owahi",
        "group": "Grup:",
        "right-protect": "Nganti tingkatan pangreksan lan nyunting kaca-kaca sing direksa",
        "right-editprotected": "Nyunting kaca-kaca sing direksa (tanpa pangreksan runtun)",
        "right-editinterface": "Nyunting antarmukane panganggo",
-       "right-editusercssjs": "Nyunting berkas CSS lan JavaScript panganggo liyane",
        "right-editusercss": "Nyunting berkas CSS panganggo liyane",
        "right-edituserjs": "Nyunting berkas JavaScript panganggo liyane",
        "right-rollback": "Gelis gole mbalekna suntingane panganggo pungkasan sing nyunting kaca tartamtu",
        "rcshowhideanons": "$1 panganggo anonim",
        "rcshowhidepatr": "$1 suntingan sing dipatroli",
        "rcshowhidemine": "$1 suntingane inyong",
-       "rclinks": "Tidokna $1 owahan pungkasan nang $2 dina pungkasan kiye<br />$3",
+       "rclinks": "Tidokna $1 owahan pungkasan nang $2 dina pungkasan kiye",
        "diff": "bédane",
        "hist": "versi",
        "hide": "Umpetna",
        "statistics-pages": "Kaca",
        "statistics-pages-desc": "Kabeh kaca nang wiki kiye, klebu kaca dhiskusi, pangalihan, lan liya-liyané.",
        "statistics-files": "Berkas sing diunggahna",
-       "statistics-edits": "Jumlah suntingan wiwit {{SITENAME}} dimolai",
+       "statistics-edits": "Jumlah suntingan sapet {{SITENAME}} dimolai",
        "statistics-edits-average": "Rata-rata suntingan saben kaca",
        "statistics-users": "Jumlah [[Special:ListUsers|panganggo sing kedaftar]]",
        "statistics-users-active": "Jumlah panganggo aktif",
        "cantrollback": "Ora teyeng mbatalna suntingan;\nkontributor pungkasane kuwe siji-sijine sing nulis artikel kiye.",
        "alreadyrolled": "Ora teyeng mbalekna suntingan pungkasan [[:$1]] sekang [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nwis ana wong sejen sing nyunting utawa mbalekna artikel kuwe.\n\nSuntingan pungkasan kaca kiye digawe nang [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Ringkesan suntingan yakuwe: <em>$1</em>.",
-       "revertpage": "Suntingane [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dibalekna maring vèrsi pungkasan sekang [[User:$1|$1]]",
+       "revertpage": "Suntingane [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dibalekna maring versi pungkasan sekang [[User:$1|$1]]",
        "revertpage-nouser": "Mbalekna suntingan sekang (jeneng panganggo dibusek) ming revisi pungkasan sekang [[User:$1|$1]]",
        "rollback-success": "Mbalekna suntingane $1;\ndibalekna ming revisi pungkasan sekang $2.",
        "rollback-success-notify": "Mbalekna besutan sekang $1; owah mbalik nggo revisi mburi sekang $2. [$3 Deleng owahane]",
        "exif-lightsource-17": "Cahya standar A",
        "exif-lightsource-18": "Cahya standar B",
        "exif-lightsource-19": "Cahya standar C",
-       "namespacesall": "kabèh",
+       "namespacesall": "kabeh",
        "monthsall": "kabèh",
        "watchlisttools-view": "Tidokna owahan sing ana gandhèngané",
        "watchlisttools-edit": "Tidokna lan sunting daftar pangawasan",
index 3a309a5..c12f069 100644 (file)
        "externaldberror": "Лиссь эльбятькс ушеширень датабазонь вельде кемокстакшнембачк эли тондейть аф мярьгови полафнемс тонь ушеширень сёрматфтомацень.",
        "login": "Сувама",
        "nav-login-createaccount": "Сувама / сёрматфтома",
-       "userlogin": "Сувама / сёрматфтома",
-       "userloginnocreate": "Сувамс",
        "logout": "Лисема",
        "userlogout": "Лисема",
        "notloggedin": "Апак сувак",
-       "nologin": "Аш сувама лемце? '''$1'''.",
-       "nologinlink": "Сёрматфтомс",
        "createaccount": "Тиемс од сёрматфтомась",
-       "gotaccount": "Сёрматфтыть ни? '''$1'''.",
-       "gotaccountlink": "Сувамс",
-       "userlogin-resetlink": "Сувама эрявикснень юкстайть?",
        "createaccountmail": "электрононь сёрма вельде",
-       "createaccountreason": "Туфтал:",
        "badretype": "Сувама валхне тон путыть аф фкат.",
        "userexists": "Тя лемть сявозь ни. \nЭняльттяма, арьсек эстейть иля.",
        "loginerror": "Сувама эльбятькс",
        "passwordreset-disabled": "Сувама валсь аф полафтови тя викить эса.",
        "passwordreset-username": "Тиить лемоц",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Ваномс мекольце е-сёрма?",
-       "passwordreset-capture-help": "Путондярят тяшкс тя паксять эса е-сёрма (пингонь сувама вал мархта) кармай няфтевома кодак кучф тиенди.",
        "passwordreset-emailtitle": "Серматфтомать колга {{SITENAME}}са",
        "bold_sample": "Эчке сёрмадома",
        "bold_tip": "Эчке сёрмадома",
        "editingsection": "Петнемс $1 (пялькс)",
        "editingcomment": "Петнемс $1 (од пакш)",
        "editconflict": "Петнема эльбятькс: $1",
-       "explainconflict": "Кати-кие тя лопать полафтозе мъзярс тон сонь петнить.\nВярдень паксяса тон няйсак текстть стамкс конакс сон кармай няеви «Ванфтомс лопа» пунять люпштамда меле.\nТонь полафнематне няевихть ала, петнема паксять эса.\nТонь полафнематнень текстс нолдаманкса тондейть эряви синь ётафтомс алудонь петнема паксяста вярденнес.\n'''Аньцек''' вярдень паксястонь текстть ванфтови \"{{int:savearticle}}\" пунять люпштамда меле\".",
+       "explainconflict": "Кати-кие тя лопать полафтозе мъзярс тон сонь петнить.\nВярдень паксяса тон няйсак текстть стамкс конакс сон кармай няеви «Ванфтомс лопа» пунять люпштамда меле.\nТонь полафнематне няевихть ала, петнема паксять эса.\nТонь полафнематнень текстс нолдаманкса тондейть эряви синь ётафтомс алудонь петнема паксяста вярденнес.\n'''Аньцек''' вярдень паксястонь текстть ванфтови \"$1\" пунять люпштамда меле\".",
        "yourtext": "Тонь текстце",
        "storedversion": "Ванфтф верзие",
        "nonunicodebrowser": "'''ИНГОЛЕ КАРДАМА: Тонь интернет полатксце аф кирдьсы Unicode. Лопань петемста сембе аф-ASCII тяштьксне кармайхть арама синь кемготувонькърда луфксокс.'''",
        "saveprefs": "Ванфтомс",
        "restoreprefs": "Мърдафтомс васень латцематне",
        "prefs-editing": "Петнема",
-       "rows": "Луфт (строкат):",
-       "columns": "Орват (столбанят):",
        "searchresultshead": "Вешендема",
        "stub-threshold": "Оторсь (лимитсь) <a href=\"#\" class=\"stub\">-нь керф сюлмафкснень</a> латцемаснонды (байтт):",
        "recentchangesdays": "Мъзяра шит няфтемс мекольце полафнемаса:",
        "userrights-reason": "Туфтал:",
        "userrights-no-interwiki": "Тондейть аф мярьгови полафтомс тиихнень видекссна иля Викива.",
        "userrights-nodatabase": "Датабаза $1 аш эли сон аф тястоконь.",
-       "userrights-nologin": "Тондейть эряви [[Special:UserLogin|сувамс]] оцюнянь сёрматфтомать вельде тиихнень видексснон макссеманкса.",
-       "userrights-notallowed": "Тонь сёрматфтомацень вельде аф мярьгови макссемс видекст иля тиихненди.",
        "userrights-changeable-col": "Полгатне конатнень тондейть ули кода полафтомс",
        "userrights-unchangeable-col": "Полгатне, конатнень тондейть аш кода полафтомс",
        "group": "Полга:",
        "right-protect": "Полафтомс араламань куцеманянзон ди петнемс аралаф лопатнень",
        "right-editprotected": "Петнемс аралаф лопатнень (какскадонь араламада башка)",
        "right-editinterface": "Петнемс тиить лопанц арафнеманзон",
-       "right-editusercssjs": "Петнемс иля тиихнень CSS ди JS файлснон",
        "right-editusercss": "Петнемс иля тиихнень CSS файлснон",
        "right-edituserjs": "Петнемс иля тиихнень JS файлснон",
        "right-rollback": "Куроконе мумс мекольце тиить конась петнесь лопат",
        "rcshowhideanons": "$1 лемфтома тиихть",
        "rcshowhidepatr": "$1 ванондоф петнемат",
        "rcshowhidemine": "$1 эсь петнемат",
-       "rclinks": "Няфтемс $1 ётай полафнемат мекольце $2 шис<br />$3",
+       "rclinks": "Няфтемс $1 ётай полафнемат мекольце $2 шис",
        "diff": "яв.",
        "hist": "ист.",
        "hide": "Кяшемс",
        "undeleteviewlink": "ваномс",
        "undeleteinvert": "Валхтомс кочкама",
        "undeletecomment": "Мяльполаткс:",
-       "undeletedrevisions": "{{PLURAL:$1|1 верзие|$1 верзиет}} мърдафтфт",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 верзие|$1 верзиет}} эди {{PLURAL:$2|1 файл|$2 файлхт}} мърдафтфт",
-       "undeletedfiles": "{{PLURAL:$1|1 файл|$1 файлхт}} мърдафтфт",
        "cannotundelete": "Мърдафтома изь лисев; иля тиись, улема, ульсь васенцекс кие сонь мърдафтозе.",
        "undeletedpage": "'''$1 мърдафтфоль'''\n\nВанк [[Special:Log/delete|нардамань лувомась]] мекольце нардаматнень эди мърдафтоматнень няфтеманкса.",
        "undelete-header": "Ванк [[Special:Log/delete|нардамань лувомась]] улхкомба нардаф лопатнень няфтеманкса.",
        "tag-filter": "[[Special:Tags|Tag]] педямась:",
        "revdelete-restricted": "нолдаф тевс кардафксне системонь вятиксненди",
        "revdelete-unrestricted": "системонь вятиксненди кардафксне валхтфт",
-       "rightsnone": "(аш)",
-       "revdelete-summary": "петнемс нюрьхкяня лихтемать"
+       "rightsnone": "(аш)"
 }
index a908160..a57b00d 100644 (file)
        "missingarticle-rev": "(famerenana faha : $1)",
        "missingarticle-diff": "(diff : $1 ; $2)",
        "readonly_lag": "\nMihidy ho azy aloha ny banky angona mandra-pahatratran'ny serveur andevo ny tompony",
+       "nonwrite-api-promise-error": "Ny loha HTTP \"<code>Promise-Non-Write-API-Action:</code>\" dia nalefa fa tsy natao tany amina module fanoratana API ny hataka",
        "internalerror": "Tsy fetezana anatin'ny rindrankajy",
        "internalerror_info": "Tsy fetezana ety anatiny : $1",
        "internalerror-fatal-exception": "Karazana-kadisoana nampijanona \"$1\"",
        "title-invalid-interwiki": "Ahitana rohy interwiki tsy azo ampiasaina amin'ny lohateny ny pejy angatahana.",
        "title-invalid-talk-namespace": "Mampatsiahy pejin-dresaka tsy misy ilay pejy angatahana.",
        "title-invalid-characters": "Ahitana soratra tsy azo ekena ny lohatenim-pejy angatahana: \"$1\".",
+       "title-invalid-relative": "Manana lalana tsy mahaleotena ilay lohateny. Tsy manan-kery ny lohatenim-pejy misy mamana tsy mahaleotena (./, ../) satria tsy ho takatra izy ireo rehefa amin'ny mpitetin'ny mpampiasa sasany.",
+       "title-invalid-magic-tilde": "Ahitana filaharana majika tsy azo raisina ny lohatenim-pejy angatahana (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Lava loatra ny lohatenim-pejy angatahana. Tsy mahazo ho lava noho $1 $1{{PLURAL:$1|}} ôktety ilay izy amin'ny fikaodiana UTF-8.",
+       "title-invalid-leading-colon": "Ahitana teboka roa tsy azo raisina ny lohatenim-pejy angatahana.",
        "perfcached": "Ao amin'ny voatakona ireo data manaraka ireo ary mety tsy voavao. $1{{PLURAL:}} ihany no isan'ireo zavatra voatahiry ao amin'ny voatakona",
        "perfcachedts": "Ao amin'ny voatakona (cache) ny data aseho, ary tamin'ny $1 izy no navaozina farany. $4{{PLURAL:}} no isan'ny valim-pikarohana ao amin'ilay voatakona.",
        "querypage-no-updates": "Amin'izao fotoana izao dia tsy havaozina ny votoatin'ity pejy ity. Noho izany dia tsy mitaratra ny tena zava-misy ny votoatiny ato.",
        "login": "Midira",
        "login-security": "Hamarino ny famantarana anao",
        "nav-login-createaccount": "Ampidiro ny solonanarana",
-       "userlogin": "Hiditra na hanokatra kaonty",
-       "userloginnocreate": "hiditra",
        "logout": "Hiala",
        "userlogout": "Hiala",
        "notloggedin": "Tsy tafiditra",
        "userlogin-noaccount": "Tsy manana kaonty?",
        "userlogin-joinproject": "Midira ho mpikamban'i {{SITENAME}}",
-       "nologin": "Tsy manana solonanarana? '''$1'''.",
-       "nologinlink": "Manokafa kaonty",
        "createaccount": "Hamorona kaonty",
-       "gotaccount": "Efa manana kaonty? '''$1'''.",
-       "gotaccountlink": "Midira",
-       "userlogin-resetlink": "Adinonavo ve ny antsipihan'ny fidiranao ?",
        "userlogin-resetpassword-link": "Hadino ny tenimiafina?",
        "userlogin-helplink2": "Fanampiana amin'ny fidirana",
        "userlogin-loggedin": "Efa tafiditra amin'ny anaran'i {{GENDER:$1|$1}} ianao. Ampiasao ny fôrmiolera eo ambany raha hiditra amin'ny anaran'ny mpikambana hafa.",
        "createaccountmail": "Hampiasa tenimiafina vonjimaika ary handefa azy eo amin'ny adiresy mailaka voalaza",
        "createaccountmail-help": "Azo ampiasaina amin'ny famoronana kaonty ho an'olon-kafa tsy mila mahafantatra ny tenimiafina.",
        "createacct-realname": "Tena anarana (azo tsy atao)",
-       "createaccountreason": "Antony :",
        "createacct-reason": "Antony",
        "createacct-reason-ph": "Inona ny antony hamoronanao kaonty hafa",
        "createacct-reason-help": "Hafatra ho aseho ao amin'ny laogim-pamoronan-kaonty",
        "botpasswords-no-provider": "Tsy afaka antsoina ny BotPasswordsSessionProvider.",
        "botpasswords-restriction-failed": "Manakana ity fidirana ity ny fepetra mifehy ny tenimiafina rôbô.",
        "resetpass_forbidden": "Tsy afaka ovaina ny tenimiafina",
+       "resetpass_forbidden-reason": "Tsy afaka ovaina ny tenimiafina: $1",
        "resetpass-no-info": "Tsy maintsy tafiditra ao amin'ny kaontinao ianao vao afaka mijery ity pejy ity.",
        "resetpass-submit-loggedin": "Ovay ny tenimiafina",
        "resetpass-submit-cancel": "Aoka ihany",
        "passwordreset-emailsentemail": "Lasa ny mailaka famerenana tenimiafina.",
        "passwordreset-nocaller": "Mila manitsy mpiantso",
        "passwordreset-nosuchcaller": "Tsy misy ilay mpiantso: $1",
-       "changeemail": "Hanova ny adiresy imailaka",
-       "changeemail-header": "Hanova ny adiresy imailak'ilay kaonty",
+       "passwordreset-invalidemail": "Adiresy mailaka tsy azo raisina",
+       "passwordreset-nodata": "Tsy nanome anaram-pikambana na adiresy mailaka",
+       "changeemail": "Hanova na hanala adiresy mailaka",
+       "changeemail-header": "Fenoy ity fôrmiolera ity ahafahanao manova ny adiresy mailakao. Raha tianao ho esorina ny fifandraisan'ity mailaka ity amin'ny kaontinao dia avelao ho fotsy ny saha rehefa mandefa fôrmiolera.",
        "changeemail-no-info": "Mila tafiditra ianao vao avaka mijery ity pejy ity.",
        "changeemail-oldemail": "Adiresy imailaka ankehitriny :",
        "changeemail-newemail": "Adiresy imailaka vaovao :",
        "changeemail-password": "Tenimiafinao eo amin'i {{SITENAME}}:",
        "changeemail-submit": "Hanova ny adiresy imailaka",
        "changeemail-throttled": "Betsaka loatra ny andrana nidiranao.\nMiandrasa $1 alohan'ny manandrana indray.",
+       "changeemail-nochange": "Mampidira adiresy mailaka hafa vaovao.",
        "resettokens": "Hamerina ny token",
        "resettokens-text": "Azonao averina eto ny token izay hahafahana mitsidika ny fampahalalana tsy sarababem-bahoaka ao amin'ny kaontinao. Tokony ataonao izany raha voazara tsy fanahy iniana na raha nisy nangalatra ny kaontinao.",
        "resettokens-no-tokens": "Tsy misy token ho averina",
        "preview": "Topi-maso",
        "showpreview": "Asehoy aloha",
        "showdiff": "Asehoy ny fiovana",
-       "blankarticle": "<strong>Tandremo:</strong> Fotsy ny pejy tianao hoforonina.\nRaha manindry an'i \"{{int:savearticle}}\" indray ianao dia hoforonina tsy hisy vontoatiny na inona na innona ilay pejy.",
+       "blankarticle": "<strong>Tandremo:</strong> Fotsy ny pejy tianao hoforonina.\nRaha manindry an'i \"$1\" indray ianao dia hoforonina tsy hisy vontoatiny na inona na innona ilay pejy.",
        "anoneditwarning": "<strong>Fampitandremana :</strong> Tsy niditra tamin'ny kaontinao ianao. Ho hitan'ny vahoaka ny adiresy IP-nao raha manova inona na inona ianao. Raha <strong>[$1 miditra amin'ny kaontinao]</strong> ianao dia ho anisan'ny tombontsoa anananao ny fanaovana ny fiovana amin'ny solonanaranao.",
        "anonpreviewwarning": "''Tsy niditra ianao. Hampitahiry ny adiresy IP anao ao amin'ny tantaram-panovan'ity pejy ity ny fitehirizana ny fanovana.''",
-       "missingsummary": "'''Hafatra fampantsiahivana''' : tsy mbola nanome ny ambangovangom-panovanao ianao.\nRaha mbola tsindriano fanindroany eo amin'ny bokotra {{int:savearticle}}, ho voatahiry tsy fanambarana ny fanovanao.",
+       "missingsummary": "'''Hafatra fampantsiahivana''' : tsy mbola nanome ny ambangovangom-panovanao ianao.\nRaha mbola tsindriano fanindroany eo amin'ny bokotra $1, ho voatahiry tsy fanambarana ny fanovanao.",
        "missingcommenttext": "Ampidiro ny ambangovangony azafady.",
        "missingcommentheader": "'''Fampahatsiahivana :''' Tsy nampiditra lohateny amin'ity resaka ity ianao.\nRaha tsindrianao indray eo amin'ny « {{MediaWiki:Savearticle}} » ho voatahiry tsy misy lohateny ny fanovananao.",
        "summary-preview": "Topi-maso n'ilay ambangovangony :",
        "editingsection": "Fanovana $1 (fizarana)",
        "editingcomment": "Fanovana $1 (fizarana vaovao)",
        "editconflict": "Fanovana mifandona : $1",
-       "explainconflict": "Nisy olon-kafa koa nanova ity pejy ity taorian'ny nanombohanao nanova azy.\nIreto ny votoatin'ny pejy, ilay eo ambony ny votoatiny araka izay endriny ankehitriny,\nilay eo ambany no misy ny fanovana saika hataonao.\nMila mampiditra ny fanovana nataonao ao anatin'ny votoatiny ankehitriny ianao.\nNy lahatsoratra ao amin'ilay faritra ambony '''ihany''' no ho voatahiry rehefa manindry ilay bokotra \"{{int:savearticle}}\" ianao.",
+       "explainconflict": "Nisy olon-kafa koa nanova ity pejy ity taorian'ny nanombohanao nanova azy.\nIreto ny votoatin'ny pejy, ilay eo ambony ny votoatiny araka izay endriny ankehitriny,\nilay eo ambany no misy ny fanovana saika hataonao.\nMila mampiditra ny fanovana nataonao ao anatin'ny votoatiny ankehitriny ianao.\nNy lahatsoratra ao amin'ilay faritra ambony '''ihany''' no ho voatahiry rehefa manindry ilay bokotra \"$1\" ianao.",
        "yourtext": "Lahatsoratrao",
        "storedversion": "Votoatiny voatahiry",
        "nonunicodebrowser": "'''FAMPITANDREMANA: Tsy mifanaraka tanteraka amin'ny unicode ny navigateur-nao. Misy ihany anefa fika napetraka hahafahanao manova ny lahatsoratra: Ny litera tsy ASCII dia hiseho amin'ny fango isa ta-enina ambin'ny folo.'''",
        "search-external": "Hikaroka any ivelany",
        "searchdisabled": "Tsy nalefa ny karoka eto amin'i {{SITENAME}}. Afaka mampiasa an'i Google aloha ianao mandra-paha. Nefa fantaro fa mety ho efa lany daty ny valiny omeny.",
        "search-error": "Hadisoana nitranga tam-pikarohana: $1",
+       "search-warning": "Fampitandremana nitranga teo am-pikarohana: $1",
        "preferences": "Ny momba anao",
        "mypreferences": "Safidy",
        "prefs-edits": "isa ny fanovàna :",
        "editusergroup": "Hampiditra vondrom-pikambana",
        "editinguser": "Fanovana ny zon'ny mpikambana <strong>{{GENDER:$1|}}[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Hanova vondrom-pikambana",
+       "userrights-viewusergroup": "Hijery ny vondrom-mpikambana{{GENDER:$1|}}",
        "saveusergroups": "{{GENDER:$1|}}Tehirizo ny vondrom-pikambana",
        "userrights-groupsmember": "Mpikambana amin'ny vondrona:",
        "userrights-groupsmember-auto": "Mpikambana tsy dia voalazan'i :",
        "right-editsemiprotected": "Hanova ny pejy narovna ho \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Hanova ny modelim-botoatin'ny pejy",
        "right-editinterface": "Manova ny interface ny mpikambana",
-       "right-editusercssjs": "Manova ny rakitra CSS sy JS ny mpikambana hafa",
        "right-editusercss": "Manova ny rakitra CSS ny mpikambana hafa",
        "right-edituserjs": "Manova ny rakitra JS an'ny mpikambana hafa",
        "right-editmyusercss": "Manova ny rakitra CSS-nao",
        "grant-group-high-volume": "Manao zavatra haingana",
        "grant-group-customization": "Fikirakirana ary safidy",
        "grant-group-administration": "Hanao asam-pandrindrana",
+       "grant-group-private-information": "Hijery ny angona tsy sarababembahoaka momba anao",
        "grant-group-other": "Manao hetsika maro samihafa",
        "grant-blockusers": "Manakana sy manala sakan'ny mpikambana",
        "grant-createaccount": "Hamorona kaonty",
        "grant-highvolume": "Manova pejy ambongadiny",
        "grant-oversight": "Manafina mpikambana ary mamafa versiona",
        "grant-patrol": "Manamarika ireo fiovam-pejy ho voatsidika",
+       "grant-privateinfo": "Mijery fampahalalana tsy sarababembahoaka",
        "grant-protect": "Miaro ary manala ny fiavoram-pejy",
        "grant-rollback": "Mamafa fiovana amin'ny pejy",
        "grant-sendemail": "Mandefa mailaka amin'ny mpikambana hafa",
        "grant-basic": "Zo fototra",
        "grant-viewdeleted": "Mitsidika ireo rakitra ary pejy voafafa",
        "grant-viewmywatchlist": "Hijery ny lisitry ny pejy arahanao",
+       "grant-viewrestrictedlogs": "Mijery iditry ny laogy tsy sarababembahoaka",
        "newuserlogpage": "Laogim-panokafana kaontim-pikambana",
        "newuserlogpagetext": "Ity pejy ity dia maneho ny tantaran'asan'ny fampidirana mpikambana vaovao.",
        "rightslog": "Laogim-piovan'ny zom-pikambana",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (jereo koa ny [[Special:NewPage|lisitry ny pejy vaovao]])",
        "recentchanges-submit": "Aseho",
        "rcfilters-activefilters": "Sivana miasa",
+       "rcfilters-quickfilters": "Rohy maika",
+       "rcfilters-savedqueries-defaultlabel": "Sivana voatahiry",
+       "rcfilters-savedqueries-rename": "Hanova ny anarana",
+       "rcfilters-savedqueries-remove": "Esorina",
+       "rcfilters-savedqueries-new-name-label": "Anarana",
+       "rcfilters-savedqueries-apply-label": "Hamorona rohy haingana",
+       "rcfilters-savedqueries-cancel-label": "Avela",
        "rcfilters-restore-default-filters": "Hamerina sivana ampiasaina raha tsy misy",
        "rcfilters-clear-all-filters": "Hamafa ny sivana rehetra",
        "rcfilters-search-placeholder": "Hanivana ny fiovana farany (tetezo na manomboha manoratra)",
        "rcfilters-invalid-filter": "Sivana tsy azo raisina",
        "rcfilters-empty-filter": "Tsy misy sivana miasa. Aseho avokoa ireo fandraisan'anjara.",
        "rcfilters-filterlist-title": "Sivana",
+       "rcfilters-filterlist-whatsthis": "Inona ity?",
+       "rcfilters-filterlist-feedbacklink": "Mamoaka hevitra mikasika ny sivana vaovao (beta)",
        "rcfilters-highlightbutton-title": "Hampibaribary ny valiny",
        "rcfilters-highlightmenu-title": "Hisafidy loko",
+       "rcfilters-highlightmenu-help": "Misafidy loko hampanabaribariana ilay tondro",
        "rcfilters-filterlist-noresults": "Tsy nahitana sivana",
+       "rcfilters-noresults-conflict": "Tsy nahitana valiny satria tsy mifanaraka ny mason-tsivana",
        "rcfilters-filtergroup-registration": "Fisoratan'ny mpikambana",
        "rcfilters-filter-registered-label": "Nisoratra anarana",
        "rcfilters-filter-registered-description": "Mpanova tafiditra.",
        "rcfilters-filter-unregistered-label": "Tsy nisoratra anarana",
        "rcfilters-filter-unregistered-description": "Mpikambana tsy niditra.",
+       "rcfilters-filtergroup-authorship": "Manova ny tompon-tsoratra",
        "rcfilters-filter-editsbyself-label": "Ny fiovanao",
        "rcfilters-filter-editsbyself-description": "Fiovana nataonao",
        "rcfilters-filter-editsbyother-label": "Fiovana nataon'ny hafa",
        "rcfilters-filter-editsbyother-description": "Fiovana noforonin'ny mpikambana hafa (tsy ianao).",
        "rcfilters-filtergroup-userExpLevel": "Lentan'ny traikefa (ho an'ireo mpikambana nisoratra anarana ihany)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Vao tonga",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Latsaky ny fiovana folo ary latsaky ny 4 andro niasana",
-       "rcfilters-filter-userExpLevel-learner-label": "Mpianatra",
-       "rcfilters-filter-userExpLevel-learner-description": "Efa betsaka andro nandraisana anjara ary nanova im-betsaka nohon'ny \"Vao tonga\" fa mbola kely nohon'ny \"Manan-traikefa\".",
-       "rcfilters-filter-userExpLevel-experienced-label": "Mpikambana manan-traikefa",
-       "rcfilters-filter-userExpLevel-experienced-description": "Mahery ny 30 andro nandraisana anjara ary fiovana mahery ny 500.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Vao tonga",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Latsaky ny fiovana folo ary latsaky ny 4 andro niasana",
+       "rcfilters-filter-user-experience-level-learner-label": "Mpianatra",
+       "rcfilters-filter-user-experience-level-learner-description": "Efa betsaka andro nandraisana anjara ary nanova im-betsaka nohon'ny \"Vao tonga\" fa mbola kely nohon'ny \"Manan-traikefa\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Mpikambana manan-traikefa",
+       "rcfilters-filter-user-experience-level-experienced-description": "Mahery ny 30 andro nandraisana anjara ary fiovana mahery ny 500.",
        "rcfilters-filtergroup-automated": "Fandraisan'anjara alefa ho azy",
        "rcfilters-filter-bots-label": "Rôbô",
        "rcfilters-filter-bots-description": "Fiovana nataon'ny rôbô aotômatika.",
        "rcfilters-filter-humans-label": "Olona (tsy rôbô)",
        "rcfilters-filter-humans-description": "Fiovana nataon'ny olombelona mpikambana.",
+       "rcfilters-filtergroup-reviewstatus": "Satan'ny reviziôna",
+       "rcfilters-filter-patrolled-label": "Voatsidika",
+       "rcfilters-filter-patrolled-description": "Fiovana nomarihana ho voatsidika.",
+       "rcfilters-filter-unpatrolled-label": "Tsy mbola voatsidika",
+       "rcfilters-filter-unpatrolled-description": "Fiovana tsy voamarika ho voatsidika.",
        "rcfilters-filtergroup-significance": "Dikany",
        "rcfilters-filter-minor-label": "Fiovana madinika",
        "rcfilters-filter-minor-description": "Fiovana nataon'ny tompony ho madinika.",
        "rcfilters-filter-major-label": "Fiovana tsy madinika",
        "rcfilters-filter-major-description": "Fiovana tsy natao ho madinika.",
+       "rcfilters-filter-watchlist-watched-label": "Amin'ny pejy arahana",
+       "rcfilters-filter-watchlist-notwatched-label": "Tsy amin'ny pejy arahana",
        "rcfilters-filtergroup-changetype": "Karazam-piovana",
        "rcfilters-filter-pageedits-label": "Fiovam-pejy",
+       "rcfilters-filter-pageedits-description": "Manova votoatin'ny wiki, resaka, visavisan-tsokajy...",
+       "rcfilters-filter-newpages-label": "Famoronam-pejy",
+       "rcfilters-filter-newpages-description": "Fiovana nahatonga famoronam-pejy.",
+       "rcfilters-filter-categorization-label": "Fiovana amin'ny sokajy",
+       "rcfilters-filter-categorization-description": "Fandraiketana an'ireo pejy ampiana na esorina amin'ny sokajy.",
+       "rcfilters-filter-logactions-label": "Asa voalaogy",
+       "rcfilters-filtergroup-lastRevision": "Reviziôna farany",
+       "rcfilters-filter-lastrevision-label": "Reviziôna farany",
+       "rcfilters-filter-previousrevision-label": "Reviziôna nialoha",
        "rcnotefrom": "Eo ambany dia ahitana ireo fiovana{{PLURAL:$5}} hatry ny <strong>$3, $4</strong> (naseho hatramin'ny <strong>$1</strong>).",
        "rclistfrom": "Asehoy izay vao niova manomboka ny $3 $2",
        "rcshowhideminor": "$1 ny fanovàna kely",
        "rcshowhidecategorization": "$1 ny fisokajiam-pejy",
        "rcshowhidecategorization-show": "Aseho",
        "rcshowhidecategorization-hide": "Afenina",
-       "rclinks": "Asehoy ny $1 niova farany tato anatin'ny $2 andro<br />$3",
+       "rclinks": "Asehoy ny $1 niova farany tato anatin'ny $2 andro",
        "diff": "Fampitahana",
        "hist": "tant.",
        "hide": "Afeno",
        "uploaddisabledtext": "Tsy afaka andefasana rakitra aloha eto amin'ity wiki ity.",
        "php-uploaddisabledtext": "Ny fampidiran-drakitra dia tsy ampiasaina amin'ny PHP.\nMarino ny option configuration file_uploads.",
        "uploadscripted": "\nMisy kialo HTML na fango script mety tsy ho hain'ny navigateur sasany haseho ity rakitra ity.",
+       "uploaded-script-svg": "Zavatra azo atao ho azy \"$1\" ao amin'ny rakitra SVG nampiakarina.",
+       "uploaded-hostile-svg": "Nahitana CSS tsy azo antoka ao amin'ny zava-pisehoan'ny rakitra SVG nampiakarina.",
        "uploadscriptednamespace": "ahitana valan'anarana \"<nowiki>$1</nowiki>\" ny rakitra SVG.",
        "uploadinvalidxml": "Tsy afaka vakiana ny XML tao anatin'ilay rakitra nafaranao.",
        "uploadvirus": "Misy viriosy io rakitra io! Toy izao ny antsipirihany: $1",
        "upload-copy-upload-invalid-domain": "Tsy misy eto amin'ity dômenina ity ny tahaky ny upload.",
        "upload-dialog-title": "Hanafatra rakitra",
        "upload-dialog-button-cancel": "Aoka",
+       "upload-dialog-button-back": "Hiverina",
        "upload-dialog-button-done": "Vita",
        "upload-dialog-button-save": "Tehirizina",
        "upload-dialog-button-upload": "Mampiditra",
        "uploadstash-badtoken": "Tsy navokatra ny fampandefasana ilay tao, mety efa lany daty angamba ny fampahalalam-pamantarana anao.\nAvereno fanindroany.",
        "uploadstash-errclear": "Tsy navokatra ny famafana rakitra.",
        "uploadstash-refresh": "Vaozina ny lisi-drakitra",
+       "uploadstash-thumbnail": "haneho sarikely",
        "img-auth-accessdenied": "Tsy afa-mankao",
        "img-auth-nopathinfo": "Tsy misy PATH_INFO.\nTsy voaparametatra ny lohamilinao hampita io fampahalalàna io.\nMety mampiasa CGI angamba ilay lohamilina ka tsy mahazaka an'i img_auth\nVangio ny https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Ny lalana nangatahana dia tsy ny petra-drakitra nokaonfigiorena.",
        "fewestrevisions": "Pejy vitsy mpanova",
        "nbytes": "$1 {{PLURAL:$1|oktety|oktety}}",
        "ncategories": "{{PLURAL:$1|vondrona|vondrona}} $1",
+       "ninterwikis": "Interwiki $1{{PLURAL:$1|}}",
        "nlinks": "{{PLURAL:$1|rohy|rohy}} $1",
        "nmembers": "{{PLURAL:$1|mpikambana|mpikambana}} $1",
+       "nmemberschanged": "$1 → $2 Mpikambana{{PLURAL:$2|}}",
        "nrevisions": "{{PLURAL:$1|fanovana|fanovana}} $1",
        "nimagelinks": "Ampiasain'ny pejy miisa{{PLURAL:}} $1",
        "ntransclusions": "Ampiasaina eo amin'ny pejy miisa $1 {{PLURAL:}}",
        "apisandbox-submit": "Hanao hataka",
        "apisandbox-reset": "Diovina",
        "apisandbox-retry": "Andramana indray",
+       "apisandbox-no-parameters": "Tsy manana parametatra ity module API ity.",
        "apisandbox-helpurls": "Rohim-panoroana",
        "apisandbox-examples": "Ohatra",
        "apisandbox-dynamic-parameters": "Parametatra miampy",
        "apisandbox-sending-request": "Mandefa hataka API...",
        "apisandbox-loading-results": "Mandray valiny API...",
        "apisandbox-results-error": "Nisy hadisoana tamin'ny fakàna ny valin-kataka API: $1.",
+       "apisandbox-request-format-url-label": "Tohin-tsora-kataka URL",
        "apisandbox-request-url-label": "Hataka URL:",
+       "apisandbox-request-json-label": "Hangataka JSON:",
        "apisandbox-request-time": "Fotoana nangatahana{{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Ahitsio ny token ary alefaso indray",
        "apisandbox-results-fixtoken-fail": "Tsy afaka naka ny token \"$1\".",
        "apisandbox-alert-page": "Tsy ekena ny votoatin'ny saha ato amin'ity pejy ity.",
+       "apisandbox-alert-field": "Tsy azo raisina ny sandan'ity saha ity.",
+       "apisandbox-continue": "Tohizana",
+       "apisandbox-continue-clear": "Diovina",
+       "apisandbox-multivalue-all-namespaces": "$1 (anaran-tsehatra rehetra)",
+       "apisandbox-multivalue-all-values": "$1 (sanda rehetra)",
        "booksources": "boky tsiahy",
        "booksources-search-legend": "hikaroka anatin'ny boky todika",
        "booksources-search": "Fikarohana",
        "booksources-text": "Ity misy lisitra maneho ny rohy makany amin'ny sehatra mivarotra boky vaovao sy efa vaky ary mety ahitanao fampahalalàna momba ny boky sy soratra notadiavinao :",
        "booksources-invalid-isbn": "Ny ISBN nomena dia mety diso ; marino raha diso ianao teo am-pandikanana ny loharano fotony.",
+       "magiclink-tracking-rfc": "Pejy mampiasa rohy majika RFC",
        "specialloguserlabel": "Mpikambana nanao :",
        "speciallogtitlelabel": "Tanjona (lohateny na mpikambana) :",
        "log": "Tatitr’asa",
        "changecontentmodel-reason-label": "Antony :",
        "changecontentmodel-submit": "Ovaina",
        "changecontentmodel-success-title": "Niova ny môdelim-botoatiny",
+       "changecontentmodel-emptymodels-title": "Tsy nahitana môdelim-botoatiny azo ampiasaina",
+       "changecontentmodel-emptymodels-text": "Tsy afaka avadika ho karazana na inona na inona [[:$1]].",
+       "log-name-contentmodel": "Laogim-panovana môdelim-botoatiny",
        "logentry-contentmodel-change-revertlink": "mamerina",
        "logentry-contentmodel-change-revert": "mamerina",
        "protectlogpage": "Laogim-piarovana",
        "protect-expiry-options": "1 ora:1 hour,1 andro:1 day,1 herinandro:1 week,tapa-bolana:2 weeks,1 volana:1 month,3 volana:3 months,6 volana:6 months,1 taona:1 year,mandrakizay:infinite",
        "restriction-type": "Sata ilaina :",
        "restriction-level": "Sokajy ny fanerena :",
-       "minimum-size": "Hnageza fara-fahakeliny",
+       "minimum-size": "Hangeza fara-fahakeliny",
        "maximum-size": "Habe avo indrindra:",
        "pagesize": "(oktety)",
        "restriction-edit": "Hanova",
        "undeleteviewlink": "hijery",
        "undeleteinvert": "Hampifamaidika ny safidy",
        "undeletecomment": "Antony :",
-       "undeletedrevisions": "voaverina ny {{PLURAL:$1|fanovana|fanovana}} $1",
-       "undeletedfiles": "rakitra voaverina $1 {{PLURAL:$1}}",
        "cannotundelete": "Tsy nandeha soa aman-tsara ilay famerenana ;\nefa nisy mpikambana iray hafa angamba no namerina ilay pejy.",
        "undeletedpage": "'''Voaverina ny pejy $1.'''\n\nVakio ny [[Special:Log/delete|laogim-pamafana]] ho an'ny lisitry ny famafana sy ny famerenana pejy.",
        "undelete-header": "Jereo ny [[Special:Log/delete|laogim-pamafana]] rehefa hanalisitra ny pejy vao voafafa.",
        "mycontris": "Fandraisan'anjara",
        "anoncontribs": "Fandraisan'anjara",
        "contribsub2": "Ho an'i {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Tsy voasoratra anarana ato ny kaontim-pikambana \"$1\".",
        "nocontribs": "Tsy misy fanovana mifanaraka amin'ireo critères ireo.",
        "uctop": "(ankehitriny)",
        "month": "Tamin'ny volana (sy teo aloha) :",
        "sp-contributions-username": "Adiresy IP na anaram-pikambana :",
        "sp-contributions-toponly": "Fiovana izay farany ihany no aseho",
        "sp-contributions-newonly": "Fiovana izay namorom-pejy ihany no aseho",
+       "sp-contributions-hideminor": "Hanafina fiovana kely",
        "sp-contributions-submit": "Hikaroka",
        "whatlinkshere": "Pejy mirohy eto",
        "whatlinkshere-title": "Pejy mirohy any amin'i « $1 »",
        "ipb-unblock": "Hanala ny sakan'ny mpikambana na adiresy IP",
        "ipb-blocklist": "Hijery ny sakana efa misy",
        "ipb-blocklist-contribs": "Fandraisan'anjaran'i $1",
+       "ipb-blocklist-duration-left": "$1 sisa",
        "unblockip": "Esory ny sakana amin'io mpikambana io",
        "unblockiptext": "\nAmpiasao ity fisy eto ambany ity hanalana ny sakana\nmihatra amin'ny adiresy IP na solonanarana iray.",
        "ipusubmit": "Esory ny sakana",
        "unblocked-range": "Afaka ny sakan'i $1.",
        "unblocked-id": "Niala ny sakan'i $1",
        "blocklist": "Mpikambana voasakana",
+       "autoblocklist": "Sakana ho azy",
+       "autoblocklist-submit": "Hikaroka",
+       "autoblocklist-legend": "Hanalisitra ny sakana ho azy",
+       "autoblocklist-localblocks": "Sakana ho azy eto an-toerana{{PLURAL:$1|}}",
+       "autoblocklist-empty": "Tsy misy na inona na inona ny lisitry ny sakana ho azy",
+       "autoblocklist-otherblocks": "Sakana ho azy hafa{{PLURAL:$1|}}",
        "ipblocklist": "Lisitry ny adiresy IP sy mpikambana voasakana",
        "ipblocklist-legend": "Hitady mpikambana voasakana",
        "blocklist-userblocks": "Hanakana ny fanakanana kaonty",
        "blocklist-tempblocks": "Hanakana ny sakana miserana",
        "blocklist-addressblocks": "Hanakana ny fanakanana adiresy IP tokana",
+       "blocklist-rangeblocks": "Hanafina ny sakana araka ny elanelana",
        "blocklist-timestamp": "Daty sy ora",
        "blocklist-target": "Tanjona",
        "blocklist-expiry": "Daty fitsaharana :",
        "block-log-flags-hiddenname": "anaram-pikambana nasitrika",
        "range_block_disabled": "Tsy mandeha ny zo-mpandrindra mamorona fanakanana vondrona IP.",
        "ipb_expiry_invalid": "Tsy mety ilay fotoana hahataperan'ny sakana.",
+       "ipb_expiry_old": "Amina fotoana efa lasa ny daty fitsaharana.",
        "ipb_expiry_temp": "tsy maintsy lalandava ny fanakanana anaram-pikambana nasitrika.",
        "ipb_hide_invalid": "Tsy afaka fafana io kaonty io ; hoatra ny manana fanovana maro loatra izy.",
        "ipb_already_blocked": "Efa voasakana « $1 »",
        "lockdbsuccesstext": "Voahidy ny banky angona\n<br />Aza adino ny manala hidy rehefa vita izay ataonao.",
        "unlockdbsuccesstext": "Voaala soa aman-tsara ny hidin'ny banky angona.",
        "lockfilenotwritable": "Tsy azo soratana ny rakitra fanidiana ny banky angona.\nMba hahafahany manidy na mamoha ny banky angona, mila azo soratan'ny lohamilin-tranonkala izy.",
+       "databaselocked": "Efa voahidy ny banky angona",
        "databasenotlocked": "Tsy voaidy ny banky angona.",
        "lockedbyandtime": "(nataon'i $1 ny $2 tamin'ny $3)",
        "move-page": "Hanova anarana an'i $1",
        "tooltip-ca-nstab-category": "Hijery ny pejin'ilay sokajy",
        "tooltip-minoredit": "Mariho ho fanovana madinika ihany",
        "tooltip-save": "Tehirizo ny fanovana",
+       "tooltip-publish": "Hamoaka ny fiovana",
        "tooltip-preview": "Topazy maso ny fanovana nataonao, iangaviana ianao mba hijery tsipalotra mialoha ny fitahirizana ny fanovana!",
        "tooltip-diff": "Asehoy izay novainao tamin'ny lahatsoratra.",
        "tooltip-compareselectedversions": "Jereo ny fahasamihafana amin'ireo votoatin'ny pejy anankiroa ireo.",
        "pageinfo-length": "Halavam-pejy (oktety)",
        "pageinfo-article-id": "Laharam-pejy",
        "pageinfo-language": "Tenin'ny votoatiny",
+       "pageinfo-language-change": "ovaina",
        "pageinfo-content-model": "Môdelim-botoatim-pejy",
+       "pageinfo-content-model-change": "ovaina",
        "pageinfo-robot-policy": "Fanondroana ataon'ny rôbô",
        "pageinfo-robot-index": "Azo atao",
        "pageinfo-robot-noindex": "Tsy azo tondroina",
        "pageinfo-watchers": "Isan'ny mpandray anjara manaraka",
+       "pageinfo-visiting-watchers": "Isan'ny mpijery pejy nijery ny fiovana vao haingan'ity pejy ity",
        "pageinfo-few-watchers": "Mpanaraka latsaky ny $1{{PLURAL:}}",
        "pageinfo-redirects-name": "Fihodinana manketo amin'ity pejy ity",
        "pageinfo-subpages-name": "Zana-pejin'ity pejy ity",
        "pageinfo-protect-cascading-yes": "Eny",
        "pageinfo-protect-cascading-from": "Ny fiarovana dia miriana avy amin'i",
        "pageinfo-category-info": "Fampahalalana mikasika ny sokajy",
+       "pageinfo-category-total": "Isa manontolon'ny mpikambana",
        "pageinfo-category-pages": "Isam-pejy",
        "pageinfo-category-subcats": "Isan'ny zana-tsokajy",
        "pageinfo-category-files": "Isan'ny rakitra",
+       "pageinfo-user-id": "ID mpikambana",
        "markaspatrolleddiff": "Marihana ho voamarina",
        "markaspatrolledtext": "Marihana ho hita sy voatsara",
+       "markaspatrolledtext-file": "Hanamarika ny versiônan'ity rakitra ity ho voavaky",
        "markedaspatrolled": "Voamarina",
        "markedaspatrolledtext": "Nomarihana ho voamarina ny versiona voafidy an'ny [[:$1]].",
        "rcpatroldisabled": "Tsy nalefa ny fanamarinana ao amin'ny fiovana farany.",
        "patrol-log-page": "Laogin'ny fanovana voamarina",
        "patrol-log-header": "Ity dia laogy mikasikan'ny fanovana voamarina.",
        "log-show-hide-patrol": "$1 ny laogy mikasikan'ny versiona voamarina",
+       "log-show-hide-tag": "$1 laogim-balizy",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Hanamarika ny reviziôna $3 an'i $2 ho voamarina?",
        "deletedrevision": "Fanovana an'i $1 taloha voafafa.",
        "filedeleteerror-short": "Tsi-fetezana teo am-pamafàna ilay rakitra : $1",
        "filedeleteerror-long": "Nisy tsi-fetezana nitranga teo am-pamafàna ilay rakitra :\n\n$1",
        "exif-flash-redeye-1": "Fanoherana ny fisiana maso mena",
        "exif-focalplaneresolutionunit-2": "Posy",
        "exif-sensingmethod-1": "Tsy voafaritra",
+       "exif-scenecapturetype-0": "Ara-penitra",
+       "exif-scenecapturetype-1": "Mandry",
+       "exif-scenecapturetype-2": "Mitsangana",
+       "exif-scenecapturetype-3": "Alina",
        "exif-gaincontrol-0": "Tsy misy",
        "exif-gaincontrol-1": "Fahazoana miabo kely",
        "exif-gaincontrol-2": "Fitomboana miabo be",
        "exif-saturation-2": "Ambony",
        "exif-sharpness-0": "Tsotra",
        "exif-sharpness-1": "Malefaka",
+       "exif-sharpness-2": "Mahery",
        "exif-subjectdistancerange-0": "Tsy fantatra",
        "exif-subjectdistancerange-1": "Makrô",
        "exif-subjectdistancerange-2": "Fijerena akaiky",
        "exif-gpslatitude-s": "Atsimo",
        "exif-gpslongitude-e": "Atsinanana",
        "exif-gpslongitude-w": "Andrefana",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|}}metatra eo ambonin'ny lentan'ny ranomasina",
+       "exif-gpsaltitude-below-sealevel": "$1 metatra{{PLURAL:$1|}} eo ambanin'ny lentan-dranomasina",
        "exif-gpsstatus-a": "Am-pandrefesana",
        "exif-gpsmeasuremode-2": "Fandrefesana 2D",
        "exif-gpsmeasuremode-3": "Fandrefesana 3D",
        "exif-objectcycle-b": "Sady maraina no hariva",
        "exif-gpsdirection-t": "Tena avaratra",
        "exif-gpsdirection-m": "Avaratra arak'andriamby",
+       "exif-ycbcrpositioning-1": "Miafovoany",
+       "exif-ycbcrpositioning-2": "Co-sited",
        "exif-dc-contributor": "Mpandray anjara",
        "exif-dc-date": "Daty",
        "exif-dc-publisher": "Mpamoaka",
+       "exif-dc-relation": "Media misy ifandraisana",
        "exif-dc-rights": "Zo",
        "exif-dc-source": "Haino aman-jery niaviana",
        "exif-dc-type": "Karazana baino aman-jery",
        "confirm-watch-top": "Hanaraka ity pejy ity?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Hanala ity pejy ity amin'ny lisitry ny pejy arahinao?",
+       "confirm-rollback-button": "OK",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← pejy nialoha",
        "imgmultipagenext": "pejy manaraka →",
        "imgmultigo": "Andao !",
        "imgmultigoto": "Handeha any amin'ny pejy $1",
        "img-lang-default": "(fiteny tsipalotra)",
+       "img-lang-info": "Haneho ity sary ity ho $1. $2",
        "img-lang-go": "Alefa",
        "ascending_abbrev": "mihak.",
        "descending_abbrev": "mihid.",
        "autosumm-replace": "Votoatiny novaina ho « $1 »",
        "autoredircomment": "Pejy fihodinana mankany [[$1]]",
        "autosumm-new": "Pejy voaforona amin'ny « $1 »",
+       "autosumm-newblank": "Namorona pejy fotsy",
        "lag-warn-normal": "Ny fanovana vaovao nohon'ny $1 segondra {{PLURAL:}} dia tsy hiseho eo amin'ity lisitra ity.",
        "lag-warn-high": "Noho ny hataraiky ny lohamilin'ny banky angona, tsy hiseho eto ny fanovana natao tao anatin'ny fotoana latsaky ny $1 segondra{{PLURAL:}}.",
        "watchlistedit-normal-title": "Hanova ny lisitra ny pejy arahako maso",
        "watchlistedit-raw-titles": "Lohateny :",
        "watchlistedit-raw-submit": "Havaozina ny lisitra",
        "watchlistedit-raw-done": "Voavao ny lisitrao.",
+       "watchlistedit-clear-title": "Handio ny lisitra arahanao",
+       "watchlistedit-clear-legend": "Handio ny lisitra arahanao",
+       "watchlistedit-clear-explain": "Ho esorina amin'ny lisitry ny pejy arahanao ny lohateny rehetra",
+       "watchlistedit-clear-titles": "Lohateny:",
        "watchlisttools-view": "pejy arahako maso",
        "watchlisttools-edit": "Jereo sy ovao ny lisitra ny pejy fanaraha-maso",
        "watchlisttools-raw": "Ovay ilay pejy arahako maso amizao",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|resaka]])",
+       "timezone-local": "An-toerana",
        "duplicate-defaultsort": "'''Tandremo''' : manitsaka ny sort key taloha \"$1\" ilay sort key ankehitriny \"$2\".",
        "version": "Versiona",
        "version-extensions": "Fanitarana nampidirina",
        "version-other": "Samihafa",
        "version-hook-subscribedby": "Nalefan'i",
        "version-version": "($1)",
+       "version-no-ext-name": "[tsy misy anarana]",
        "version-license": "Lisansa Mediawiki",
        "version-ext-license": "Fahazoan-dalana",
        "version-ext-colheader-name": "Fanitarana",
        "tags-deactivate-submit": "Aza alefa",
        "tags-edit-title": "Hanova balizy",
        "tags-edit-manage-link": "Hikirakira balizy",
+       "tags-edit-existing-tags": "Balizy misy:",
+       "tags-edit-existing-tags-none": "<em>Tsy misy</em>",
        "tags-edit-new-tags": "Balizy vaovao:",
        "tags-edit-add": "Ampiana ireo balizy ireo:",
        "tags-edit-remove": "Hanala ireo balizy ireo:",
        "htmlform-cloner-create": "Hanampy be kokoa",
        "htmlform-cloner-delete": "Esorina",
        "htmlform-cloner-required": "Sanda iray farafahakeliny no ilaina",
+       "htmlform-date-placeholder": "TTTT-VV-AA",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "TTTT-VV-AA HH:MM:SS",
+       "htmlform-date-invalid": "Tsy daty fantatra ny sanda nampidirinao. Andramo ampiasina ny fipetraka TTTT-VV-AA.",
        "htmlform-title-badnamespace": "Tsy ao amin'i anaran-tsehatra \"{{ns:$2}}\" i [[:$1]].",
        "htmlform-title-not-creatable": "Lohatenim-pejy tsy azo foronina \"$1\"",
        "htmlform-title-not-exists": "Tsy misy $1.",
        "logentry-rights-autopromote": "{{GENDER:$2}}Lasa $5 ho azy i $1 izay $4 taloha",
        "logentry-upload-upload": "Nampiditra an'i $3 i $1{{GENDER:$2}}",
        "rightsnone": "(tsy misy)",
-       "revdelete-summary": "ambangovangon'ny fanovàna",
        "feedback-adding": "Manampy ny fahenoan-kevitra amin'ilay pejy...",
+       "feedback-back": "Hiverina",
        "feedback-bugnew": "Efa nomariniko. Hitory baogy iray",
        "feedback-cancel": "Foanana",
        "feedback-close": "Vita",
+       "feedback-dialog-title": "Handefa resaka",
        "feedback-error1": "Hadisoana: Valiny avy amin'ny API tsy fantatra",
        "feedback-error2": "Hadisoana: Tsy voaòva",
        "feedback-error3": "Hadisoana: Tsy nisy valiny avy amin'ny API",
        "feedback-subject": "Lohahevitra:",
        "feedback-submit": "Alefa",
        "feedback-thanks": "Misaotra! lanefa tany amin'ilay pejy ''[$2 $1]'' ilay fanehoan-kevitrao.",
+       "feedback-thanks-title": "Misaotra indrindra!",
        "feedback-useragent": "User agent:",
-       "searchsuggest-search": "Hikaroha eto amin'i {{SITENAME}}",
+       "searchsuggest-search": "Hikaroka eto amin'i {{SITENAME}}",
        "searchsuggest-containing": "misy...",
        "api-error-badtoken": "Hadisoana anaty : \"token\" diso.",
        "api-error-emptypage": "Tsy azo atao ny mamorona pejy vaovao tsy misy votoatiny.",
        "api-error-stashfailed": "Hadisoana anaty: Tsy nahomby ny fitahirizana ilay rakitra vonjimaika ilay lohamilina.",
        "api-error-unknown-warning": "Fampitandremana tsy fantatra : ''$1''.",
        "api-error-unknownerror": "Hadisoana tsy fantatra : ''$1''.",
+       "duration-seconds": "$1 segondra{{PLURAL:$1|}}",
+       "duration-minutes": "$1 minitra{{PLURAL:$1|}}",
+       "duration-hours": "$1 ora{{PLURAL:$1|}}",
+       "duration-days": "$1 andro{{PLURAL:$1|}}",
+       "duration-weeks": "$1{{PLURAL:$1|}} herinandro",
+       "duration-years": "$1 taona{{PLURAL:$1|}}",
+       "duration-decades": "folotaona{{PLURAL:$1|}} $1",
+       "duration-centuries": "taonjato $1{{PLURAL:$1|}}",
+       "limitreport-walltime": "Tena fotoam-pampiasana",
+       "limitreport-walltime-value": "$1 segondra{{PLURAL:$1|}}",
+       "expandtemplates": "Hanitatra ny endrika",
+       "expand_templates_input": "Wikisoratra loharano:",
+       "expand_templates_output": "Valiny",
+       "expand_templates_xml_output": "Famoahana XML",
+       "expand_templates_html_output": "Famoahana HTML",
+       "expand_templates_ok": "OK",
+       "expand_templates_remove_comments": "Hanala resaka",
+       "expand_templates_generate_rawhtml": "Haneho HTML maina",
+       "expand_templates_preview": "Topi-maso",
+       "pagelang-name": "Pejy",
+       "pagelang-language": "Fiteny",
+       "pagelang-use-default": "Hampiasan ny fiteny raha tsy misy",
+       "pagelang-select-lang": "Hisafidy teny",
+       "pagelang-reason": "Antony",
+       "pagelang-submit": "Alefa",
+       "right-pagelang": "Hanova ny fitenin'ny pejy",
+       "action-pagelang": "hanova ny fitenin'ny pejy",
+       "mediastatistics": "Statistikan'ny haino aman-jery",
+       "mediastatistics-table-mimetype": "Karazana MIME",
+       "mediastatistics-table-extensions": "Itatra azo atao",
+       "mediastatistics-table-count": "Isan'ny rakitra",
+       "mediastatistics-header-unknown": "Tsy fantatra",
+       "mediastatistics-header-bitmap": "Sary bitmap",
+       "mediastatistics-header-drawing": "Sary (sary vektôrialy)",
+       "mediastatistics-header-audio": "Feo",
+       "mediastatistics-header-video": "Horonantsary",
+       "mediastatistics-header-multimedia": "Haino aman-jery be harena",
+       "mediastatistics-header-office": "Birao",
+       "mediastatistics-header-text": "Soratra",
+       "mediastatistics-header-executable": "Azo alefa",
+       "mediastatistics-header-total": "Rakitra rehetra",
+       "json-error-syntax": "Hadisoan-drariteny",
        "special-characters-group-latin": "latina",
        "special-characters-group-latinextended": "latina nitarina",
        "special-characters-group-ipa": "AAI",
        "special-characters-group-khmer": "kimera",
        "special-characters-title-endash": "tsipika anglisy",
        "special-characters-title-emdash": "tsipika em",
-       "special-characters-title-minus": "marika mainosy"
+       "special-characters-title-minus": "marika mainosy",
+       "mw-widgets-mediasearch-noresults": "Tsy nahitana valiny",
+       "mw-widgets-titleinput-description-new-page": "Tsy mbola misy ilay pejy",
+       "mw-widgets-usersmultiselect-placeholder": "Hanampy be kokoa",
+       "sessionmanager-tie": "Tsy afaka mampikambana karazan-kataka fampamantarana maromaro: $1.",
+       "log-action-filter-all": "Manontolo",
+       "log-action-filter-block-block": "Bolongana",
+       "log-action-filter-protect-protect": "Fiarovana",
+       "log-action-filter-protect-unprotect": "Fanalana fiarovana",
+       "authmanager-authn-not-in-progress": "Tsy andalam-panaovana ny fampamantarana, na very ny angon'ny sesiôna. Avereno hatramin'ny voalohany azafady.",
+       "authmanager-authplugin-setpass-failed-title": "Tsy nahomby ny fanovana tenimiafina",
+       "authmanager-authplugin-setpass-failed-message": "Nandà ny fanovana tenimiafina ny plugin fampamantarana.",
+       "authmanager-authplugin-create-fail": "Nandà ny famoronan-kaonty ny plugin fampamantarana.",
+       "authmanager-authplugin-setpass-denied": "Tsy ahafahana manova tenimiafina ny plugin fampamantarana.",
+       "authmanager-userlogin-remembermypassword-help": "Milaza raha tsy maintsy tadidiana mihoatra ny halafan'ny fotoam-pitsidihana ny tenimiafina.",
+       "authmanager-username-help": "Anaram-pikambana ho an'ny fampamantarana.S",
+       "authmanager-password-help": "Tenimiafina ho an'ny fampamantarana.",
+       "authmanager-retype-help": "tenimiafina indray hanamarinana.",
+       "authmanager-email-label": "Mailaka",
+       "authmanager-email-help": "Adiresy mailaka:",
+       "authmanager-realname-label": "Tena anarana:",
+       "authmanager-provider-password": "Fampamamtarana mifototra amin'ny tenimiafina",
+       "authmanager-provider-password-domain": "Fampamantarana mifototra amin'ny tenimiafina ary vala",
+       "authmanager-provider-temporarypassword": "Tenimiafina vonjimaika",
+       "authprovider-resetpass-skip-label": "Dinganina",
+       "authprovider-resetpass-skip-help": "Handingana ny famerenam-tenimiafina.",
+       "authform-nosession-login": "nahomby ny fidirana, fa tsy mahatadidy anao tafiditra ny mpitety tranonkalanao.",
+       "specialpage-securitylevel-not-allowed-title": "Voarara",
+       "changecredentials": "Hanova torohay fampahafantarana",
+       "changecredentials-submit": "Ovaina ny torohay fampahafantarana",
+       "changecredentials-invalidsubpage": "Tsy karazan-torohay fampahafantarana azo ekena $1",
+       "changecredentials-success": "Niova ny torohay fampahafantarana anao.",
+       "removecredentials": "Hanala torohay fampahafantarana",
+       "removecredentials-submit": "Esorina ny torohay fampahafantarana",
+       "credentialsform-provider": "Karazan-torohay fampahafantarana:",
+       "credentialsform-account": "Anaran-kaonty:",
+       "restrictionsfield-badip": "Adiresy na valan'IP tsy azo raisina: $1",
+       "restrictionsfield-label": "Valan' IP ekena:",
+       "revid": "versiona $1",
+       "pageid": "ID pejy $1"
 }
index ed783f1..6104b95 100644 (file)
@@ -18,6 +18,7 @@
        "tog-hideminor": "Пытартыш тӧрлатымаш-влак радам гыч изи тӧрлатымаш-влакым кораҥдаш",
        "tog-hidepatrolled": "Тергыме тӧрлатымаш-влакым пытартыш тӧрлатымаш лӱмерыште шылташ",
        "tog-newpageshidepatrolled": "Тергыме лаштык-влакым у лаштык лӱмерыште шылташ",
+       "tog-hidecategorization": "Лаштык категоризацийым шылташ",
        "tog-extendwatchlist": "Чыла вашталтышым, а пытартыш гына огылым ончыкташлан эскерыме лӱмерым кугемдаш",
        "tog-usenewrc": "У тӧрлатымаш саемдыме лӱмерым кучылташ (JavaScript кӱлеш)",
        "tog-numberheadings": "Вуймутым автоматик йӧн дене радамлаш",
@@ -35,6 +36,7 @@
        "tog-watchlisthideown": "Эскерыме лӱмер гыч мыйын тӧрлатымашым кораҥдаш",
        "tog-watchlisthidebots": "Эскерыме лӱмер гыч бот-влакын тӧрлатымашыштым кораҥдаш",
        "tog-watchlisthideminor": "Эскерыме лӱмер гыч изи тӧрлатымаш-влакым кораҥдаш",
+       "tog-watchlisthidecategorization": "Лаштык категоризацийым шылташ",
        "tog-ccmeonemails": "Моло ушнышо-влаклан колтымо серышын копийжым мыламат колташ",
        "tog-diffonly": "Кок версийым таҥастарыме годым лаштыкыште возымым ончыкташ огыл",
        "tog-showhiddencats": "Шылтыме категорийым ончыкташ",
        "mytalk": "Каҥашымаш",
        "anontalk": "Каҥашымаш тиде IP нерген",
        "navigation": "Навигаций",
+       "and": "&#32;да",
        "qbfind": "Муаш",
        "qbedit": "Тӧрлаташ",
        "qbpageoptions": "Тиде лаштык",
-       "qbmyoptions": "Ð\9cÑ\8bйÑ\8bн Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влак",
+       "qbmyoptions": "Ð\9cÑ\8bйÑ\8bн ÐºÐµÐ»Ñ\8bÑ\88Ñ\82аÑ\80Ñ\8bмаÑ\88ем",
        "faq": "ЧӱВаЙо (Чӱчкыдын вашлиялтше йодыш-влак)",
        "actions": "Сомылка-влак",
        "namespaces": "Лӱм-влак ора",
        "view": "Ончалаш",
        "edit": "Тӧрлаташ",
        "create": "Ышташ",
-       "editthispage": "Тӧрлаташ тиде лаштыкым",
+       "editthispage": "Тиде лаштыкым тӧрлаташ",
        "create-this-page": "Тиде лаштыкым ышташ",
        "delete": "Шӧраш",
        "deletethispage": "Тиде лаштыкым шӧраш",
        "newpage": "У лаштык",
        "talkpage": "Тиде лаштыкым каҥашаш",
        "talkpagelinktext": "Каҥашымаш",
-       "specialpage": "Ð\9bӱмÑ\8bн Ñ\8bÑ\88Ñ\82Ñ\8bме лаштык",
+       "specialpage": "СпеÑ\86лаштык",
        "personaltools": "Паша ӱзгар",
        "articlepage": "Лаштыкыште возымым ончыкташ",
        "talk": "Каҥашымаш",
        "nstab-main": "Лаштык",
        "nstab-user": "Пайдаланышын лаштыкше",
        "nstab-media": "Мультимедиа",
-       "nstab-special": "Ð\9bӱмÑ\8bн Ñ\8bÑ\88Ñ\82Ñ\8bме лаштык",
+       "nstab-special": "СпеÑ\86лаштык",
        "nstab-project": "Проект нерген",
        "nstab-image": "Файл",
        "nstab-mediawiki": "Увертыш",
        "yourdomainname": "Тендан домен:",
        "login": "Шке денет палдаре",
        "nav-login-createaccount": "Пураш/Регистрацийым эрте",
-       "userlogin": "Пураш/Регистрацийым эрташ",
        "logout": "Лекташ",
        "userlogout": "Лекташ",
-       "nologin": "Тый регистрацийым эше эртен отыл? '''$1'''.",
-       "nologinlink": "Регистрацийым эрте",
        "createaccount": "Регистрацийым эрте",
-       "gotaccount": "Тый регистрацийым эртенат? '''$1'''.",
-       "gotaccountlink": "Шке денет палдаре",
-       "userlogin-resetlink": "Лӱмдам але шолыпмутдам монденда?",
        "userlogin-resetpassword-link": "Шолыпмутым монденат?",
        "createaccountmail": "Кӱчык жаплан чокым ыштыме шолыпмутым мылам e-mail дене колташ",
        "createacct-benefit-heading": "{{SITENAME}} тендан гаяк еҥ-влак дене ыштен шындалтын.",
        "emailauthenticated": "Тыйын почто адресетым пеҥгыдемдыме $2, $3.",
        "loginlanguagelabel": "Йылме: $1",
        "pt-login": "Пураш",
+       "pt-createaccount": "Регистрацийым эрте",
        "pt-userlogout": "Лекташ",
        "changepassword": "Шолыпмутым вашталташ",
        "oldpassword": "Тошто шолыпмут:",
        "minoredit": "Тиде изи вашталтыш",
        "watchthis": "Тиде лаштыкым эскераш",
        "savearticle": "Лаштыкым аралаш",
+       "savechanges": "Лаштыкым аралаш",
+       "publishchanges": "Лаштыкым аралаш",
        "preview": "Ончылгоч ончымаш",
        "showpreview": "Ончылгоч ончымаш",
        "showdiff": "Тӧрлатымашым ончыкташ",
-       "anoneditwarning": "'''ТӱÑ\82кӧ Ð»Ð¸Ð¹:''': Ð¢Ñ\8bй Ð°Ð²Ñ\82оÑ\80изаÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82ен Ð¾Ñ\82Ñ\8bл. Ð¢Ñ\8bйÑ\8bн IP-адÑ\80еÑ\81еÑ\82 Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð²Ð°Ñ\88Ñ\82алÑ\82Ñ\8bмаÑ\88 Ð¸Ñ\81Ñ\82оÑ\80ийÑ\8bÑ\88Ñ\82Ñ\8bже Ð²Ð¾Ð·Ð°Ð»Ñ\82 ÐºÐ¾Ð´ÐµÑ\88. Ð¨ÐºÐµ Ð»Ó±Ð¼ÐµÑ\82 Ð´ÐµÐ½ Ð¿Ñ\83Ñ\80еÑ\82 Ð°Ð»Ðµ Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82еÑ\82 Ð³Ñ\8bн, Ñ\88каланет пашам ышташ йӧнлырак лиеш.",
+       "anoneditwarning": "'''ТӱÑ\82кӧ Ð»Ð¸Ð¹:''': Ð¢Ñ\8bй Ð°Ð²Ñ\82оÑ\80изаÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82ен Ð¾Ñ\82Ñ\8bл. Ð¢Ñ\8bйÑ\8bн IP-адÑ\80еÑ\81еÑ\82 Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð²Ð°Ñ\88Ñ\82алÑ\82Ñ\8bмаÑ\88 Ð¸Ñ\81Ñ\82оÑ\80ийÑ\8bÑ\88Ñ\82Ñ\8bже Ð²Ð¾Ð·Ð°Ð»Ñ\82 ÐºÐ¾Ð´ÐµÑ\88. Ð¨ÐºÐµ Ð»Ó±Ð¼ÐµÑ\82 Ð´ÐµÐ½ Ð¿Ñ\83Ñ\80еÑ\82 Ð°Ð»Ðµ Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82еÑ\82 Ð³Ñ\8bн, Ñ\82Ñ\8bлат пашам ышташ йӧнлырак лиеш.",
        "summary-preview": "Тӧрлатымаш нерген ончылгоч ончымаш:",
        "accmailtitle": "Шолыпмут колтымо.",
        "newarticle": "(У)",
-       "newarticletext": "Тыгай лӱман лаштык уке.\nЛаштыкым ышташлан ӱлнӧ возаш тӱҥал (сайынрак палашлан [$1 полшыкым] ончал).\nТый тышке йонгылыш логалынат гын, браузерыште '''шенгек''' полдышым темдал.",
+       "newarticletext": "Тыгай лӱман лаштык уке.\nЛаштыкым ышташлан ӱлнӧ возаш тӱҥал (сайынрак палашлан [$1 полшыкым] ончал).\nТый тышке йоҥылыш логалынат гын, браузерыште '''шенгек''' полдышым темдал.",
        "noarticletext": "Кызытсе жаплан тиде лаштыкыште нимом возымо огыл.\nТый тиде лаштыкын лӱмжым вес лаштык-влакыште [[Special:Search/{{PAGENAME}}|кычалын]] кертат, але <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журнал-влакыште кычалын] кертат, але [{{fullurl:{{FULLPAGENAME}}|action=edit}} тыгай лӱман лаштыкым ыштен] кертат</span>.",
        "clearyourcache": "'''Замечание.''' Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.\n* '''Firefox / Safari:''' Удерживая клавишу ''Shift'', нажмите на панели инструментов ''Обновить'' либо нажмите ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac)\n* '''Google Chrome:''' Нажмите ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)\n* '''Internet Explorer:''' Удерживая ''Ctrl'', нажмите ''Обновить'' либо нажмите ''Ctrl-F5''\n* '''Opera:''' Выберите очистку кэша в меню ''Инструменты → Настройки''",
        "previewnote": "'''Тиде ончылгоч ончымаш гына;\nвашталтыш-влакым эше аралыме огыл!'''",
        "searchprofile-articles": "Возымо лаштык-влак",
        "searchprofile-images": "Мультимедий",
        "searchprofile-everything": "Чыла",
-       "searchprofile-advanced": "Кумдарак",
+       "searchprofile-advanced": "Кумда кычалмаш",
        "searchprofile-articles-tooltip": "Кычалмаш $1ште",
        "searchprofile-images-tooltip": "Файл-влакым кычалмаш",
        "searchprofile-everything-tooltip": "Чыла лаштык-влакыште кычалаш (каҥашымаш лаштык-влакыштат)",
-       "searchprofile-advanced-tooltip": "Ð\98Ñ\81каÑ\82Ñ\8c Ð² Ð·Ð°Ð´Ð°Ð½Ð½Ñ\8bÑ\85 Ð¿Ñ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82ваÑ\85 Ð¸Ð¼Ñ\91н",
+       "searchprofile-advanced-tooltip": "Ð\9eйÑ\8bÑ\80Ñ\8bмо Ñ\82Ó±Ñ\88калаÑ\88Ñ\82е ÐºÑ\8bÑ\87алаÑ\88",
        "search-result-size": "$1 ({{PLURAL:$2|1 мут|$2 мут}})",
        "search-result-category-size": "$1 {{PLURAL:$1|вхождение|вхождения|вхождений}} ($2 {{PLURAL:$2|подкатегория|подкатегории|подкатегорий}}, $3 {{PLURAL:$3|файл|файла|файлов}}).",
        "search-redirect": "($1 гыч колтымо)",
        "search-nonefound": "Тыйын йодышет почеш нимо муалтын огыл",
        "powersearch-legend": "Сайынрак кычалаш",
        "powersearch-ns": "Кычалаш тиде лӱм-влакын кумдыкышт-влакыште:",
-       "powersearch-togglelabel": "Сайлаш:",
+       "powersearch-togglelabel": "Ð\9eйÑ\8bÑ\80аш:",
        "powersearch-toggleall": "Чыла",
        "powersearch-togglenone": "Нимо",
        "preferences": "Келыштарымаш",
        "group-bot-member": "бот",
        "grouppage-bot": "{{ns:project}}:Бот-влак",
        "grouppage-sysop": "{{ns:project}}:Сайтвиктарыше-влак",
+       "right-writeapi": "Возымашлан API-ым кучылтмаш",
        "newuserlogpage": "У пайдаланыше регистрацийым эртарыме журнал",
        "rightslog": "Участникын праваже-влакым ончыктышо журнал",
        "action-edit": "тиде лаштыкым тӧрлаташ",
        "recentchanges-label-minor": "Тиде изи тӧрлатымаш",
        "recentchanges-label-bot": "Тиде тӧрлатымашым бот ыштен",
        "recentchanges-label-unpatrolled": "Тиде тӧрлатымашым нигӧ терген огыл",
+       "recentchanges-label-plusminus": "Мыняр байтлан лаштык вашталтын",
        "recentchanges-legend-heading": "<strong>Легенде:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (тыгак [[Special:NewPages|у лаштык-влак лӱмерым]] ончо)",
        "rcnotefrom": "Ниже перечислены изменения с '''$2''' (не более '''$1''').",
        "rcshowhidepatr": "$1 тергыме тӧрлатымаш",
        "rcshowhidemine": "Мыйын тӧрлымым $1",
        "rcshowhidemine-hide": "шылташ",
-       "rclinks": "Пытартыш $2 кечылан $1 вашталтымашым ончыкташ<br />$3",
+       "rcshowhidecategorization": "Лаштык категоризацийым $1",
+       "rclinks": "Пытартыш $2 кечылан $1 вашталтымашым ончыкташ",
        "diff": "ойырт.",
        "hist": "эрт.",
        "hide": "шылташ",
        "minoreditletter": "и",
        "newpageletter": "У",
        "boteditletter": "б",
+       "rc-change-size-new": "Вашталтымаш деч вара $1 {{PLURAL:$1|байт}} лийын",
        "rc-enhanced-expand": "Тичмашын ончыкташ",
        "rc-enhanced-hide": "Рашлык-влакым шылташ",
        "recentchangeslinked": "Ваш кылдалтше тӧрлатымаш-влак",
        "uploadlogpage": "Оптымаш-влак журнал",
        "filedesc": "Файл нерген кӱчыкын увертараш",
        "fileuploadsummary": "Тидын нерген кӱчыкын:",
+       "savefile": "Файлым арален кодаш",
        "watchthisupload": "Тиде файлым эскераш",
        "license-header": "Лицензирований",
        "imgfile": "файл",
        "filedelete-submit": "Шӧраш",
        "filedelete-otherreason": "Вес/ешартыш амал:",
        "filedelete-reason-otherlist": "Вес амал",
+       "unwatchedpages": "Эскерыдыме лаштык-влак",
        "listredirects": "Вес вере колтымаш-влак",
+       "unusedtemplates": "Кучылтдымо кышкар-влак",
        "randompage": "Чокым лаштык",
        "statistics": "Иктешлымаш",
        "statistics-header-pages": "Лаштык коклам иктешлымаш",
        "statistics-header-users": "Пайдаланыше коклам иктешлымаш",
        "statistics-header-hooks": "Тӱрлӧ коклам иктешлымаш",
        "statistics-articles": "Возымо лаштык-влак",
-       "statistics-pages": "Лаштык-влак",
+       "statistics-pages": "Лаштык",
        "statistics-pages-desc": "Чыла лаштык-влак (каҥашымаш-влак, вес вере колтымаш-влак да тулеч моло)",
        "statistics-files": "Пуртымо файл-влак",
        "statistics-edits": "{{SITENAME}} лаштыкым чылажге мыняр гана тӧрлатыме",
        "brokenredirects": "Пудыртымо вес вере колтымаш-влак",
        "brokenredirects-edit": "тӧрлаташ",
        "brokenredirects-delete": "шӧраш",
+       "withoutinterwiki": "Интервики деч посна лаштык-влак",
        "withoutinterwiki-submit": "ончыкташ",
+       "fewestrevisions": "Эн шагал версиян лаштык-влак",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "nmembers": "$1 {{PLURAL:$1|1=лаштык}}",
        "lonelypages": "Тулык лаштык-влак",
+       "uncategorizedpages": "Категоризироватлыдыме лаштык-влак",
+       "uncategorizedcategories": "Категоризироватлыдыме категорий-влак",
+       "uncategorizedimages": "Категоризироватлыдыме файл-влак",
+       "uncategorizedtemplates": "Категоризироватлыдыме кышкар-влак",
+       "unusedcategories": "Кучылтдымо категорий-влак",
+       "unusedimages": "Кучылтдымо файл-влак",
        "wantedcategories": "Ыштыман категорий-влак",
-       "wantedpages": "Ыштышаш лаштык-влак",
+       "wantedpages": "Ышташлан лаштык-влак",
        "wantedfiles": "Ыштыман файл-влак",
        "wantedtemplates": "Ыштыман ямдылык-влак",
        "prefixindex": "Чыла лаштык-влак префикс дене",
        "shortpages": "Кӱчык лаштык-влак",
        "longpages": "Кужу лаштык-влак",
+       "deadendpages": "Ончыко наҥгайдыме лаштык-влак",
        "protectedpages": "Тӧрлатымаш деч аралыме лаштык-влак",
        "usercreated": "$1, $2 шагатлан {{GENDER:$3|регистрацийым эртен|регистрацийым эртен}}",
        "newpages": "У лаштык-влак",
        "newpages-username": "Пайдаланышын лӱмжӧ:",
+       "ancientpages": "Пытартыш тӧрталтымаш-влак почеш ойырымо статья-влак",
        "move": "Лӱмым вашталташ",
        "movethispage": "Тиде лаштыкын лӱмжым вашталташ",
        "pager-newer-n": "{{PLURAL:$1|1=вес|вес}}",
        "listusers-submit": "ончыкташ",
        "listusers-blocked": "(йӧн петырыме)",
        "activeusers": "Чӱчкыдын пайдаланыше-влак",
-       "activeusers-count": "Пытартыш $3 {{PLURAL:$3|1=кечыште|кечылаште}} $1 {{PLURAL:$1|1=тӧрлатымаш|тӧрлатымаш-влак}}",
+       "activeusers-count": "Пытартыш $3 {{PLURAL:$3|1=кечыште|кечылаште}} $1 {{PLURAL:$1|1=тӧрлатымаш|тӧрлатымаш}}",
        "activeusers-submit": "ончыкташ",
        "listgrouprights-members": "(тӱшкаште улшо-влак)",
        "emailuser": "Пайдаланыше дек серыш",
        "unwatchthispage": "Эскерымым чарнаш",
        "watchlist-details": "Эскерымаш лӱмерыштет $1 {{PLURAL:$1|лаштык}}, каҥашымаш лаштык-влакым шотлыде",
        "wlshowlast": "Пытартыш $1 шагат $2 кечылан  ончыкташ",
+       "wlshowhidecategorization": "лаштык категоризацийым",
        "watchlist-options": "Эскерыме лӱмерын келыштарымаш",
        "watching": "Эскерымаш лӱмерыш ешарымаш...",
        "unwatching": "Эскерымаш лӱмер гыч шӧрымаш...",
        "protectexpiry": "Мучашлалтеш:",
        "protect_expiry_invalid": "Йоҥылыш мучашлалтше жап.",
        "protect_expiry_old": "Мучашлалтше жап эртен.",
-       "protect-text": "Тыште тый '''$1''' лаштыкын шыгыремдымашыжым ончалаш да тӧрлаташ кертат.",
+       "protect-text": "Тыште тый '''$1''' лаштыкын аралымаш уровеньжым ончалын але вашталтен кертат.",
        "protect-locked-access": "Тыйын лаштыкын шыгыремдымашыжым тӧрлаш кертмешет шагал.\nӰлнӧ '''$1''' лаштыкын кызытсе келыштарымаш.",
        "protect-cascadeon": "Тиде лаштыкым тӧрлатымаш деч аралыме.  \nКаскадный аралымашан {{PLURAL:$1|лаштык-влак}} тудо пура.",
        "protect-default": "Чыла пайдаланыше-влаклан йӧным пуаш",
        "whatlinkshere-page": "Лаштык:",
        "linkshere": "'''[[:$1]]''' лаштык дене кылдалтше лаштык-влак:",
        "nolinkshere": "'''[[:$1]]''' лаштык дене тетла нимогай лаштык кылдалтын огыл",
-       "nolinkshere-ns": "ТÑ\8bгай Ð»Ó±Ð¼-влакÑ\8bн ÐºÑ\83мдÑ\8bкÑ\8bÑ\88Ñ\82о '''[[:$1]]''' Ð»Ð°Ñ\88Ñ\82Ñ\8bк Ð´ÐµÐ½Ðµ Ð½Ð¸Ð¼Ð¾Ð³Ð°Ð¹ Ð²ÐµÑ\81 Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влак ÐºÑ\8bлÑ\8bм Ð¾Ð³Ñ\8bÑ\82 ÐºÑ\83Ñ\87о.",
+       "nolinkshere-ns": "ТÑ\8bгай Ð»Ó±Ð¼-влакÑ\8bн ÐºÑ\83мдÑ\8bкÑ\8bÑ\88Ñ\82о '''[[:$1]]''' Ð»Ð°Ñ\88Ñ\82Ñ\8bк Ð´ÐµÐ½Ðµ Ð½Ð¸Ð¼Ð¾Ð³Ð°Ð¹ Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влак Ð¾Ð³Ñ\8bÑ\82 ÐºÑ\8bлдалÑ\82.",
        "isredirect": "вес вере колтышо лаштык",
        "istemplate": "пуртымаш",
        "isimage": "файлыш кылвер",
        "tooltip-t-contributions": "{{GENDER:$1|Пайдаланышын ыштыме пашажым}} ончалаш",
        "tooltip-t-emailuser": "Тиде пайдаланышылан электрон серышым возаш",
        "tooltip-t-upload": "Файл-влакым пурташ",
-       "tooltip-t-specialpages": "Ð\9bӱмÑ\8bн Ñ\8bÑ\88Ñ\82Ñ\8bме лаштык-влак",
+       "tooltip-t-specialpages": "СпеÑ\86лаштык-влак",
        "tooltip-t-print": "Савыкташлан келыштараш",
        "tooltip-t-permalink": "Тиде лашткыш кондышо кылвер (ссылка)",
        "tooltip-ca-nstab-main": "Лаштыкыште возымым ончыкташ",
        "file-nohires": "Кугурак чаплык уке.",
        "svg-long-desc": "SVG файл, шкенжын кугытшо: $1 × $2 пиксел, файлын кугытшо: $3",
        "show-big-image": "Тӱҥалтыш файл",
+       "show-big-image-preview": "Ончылгоч ончымо годым кугыт: $1",
        "show-big-image-size": "$1 × $2 пиксел",
        "newimages-legend": "Фильтр",
        "ilsubmit": "Кычал",
        "watchlisttools-edit": "Эскерыме лӱмерым ончалаш да тӧрлаташ",
        "watchlisttools-raw": "Эскерыме лӱмерым текст семын тӧрлаш",
        "duplicate-defaultsort": "Внимание. Ключ сортировки по умолчанию «$2» переопределяет прежний ключ сортировки по умолчанию «$1».",
-       "version-specialpages": "Ð\9bӱмÑ\8bн Ñ\8bÑ\88Ñ\82Ñ\8bме лаштык-влак",
+       "version-specialpages": "СпеÑ\86лаштык-влак",
        "fileduplicatesearch-submit": "Кычалаш",
-       "specialpages": "Ð\9bӱмÑ\8bн Ñ\8bÑ\88Ñ\82Ñ\8bме лаштык-влак",
-       "specialpages-group-other": "Моло лӱмын ыштыме лаштык-влак",
+       "specialpages": "СпеÑ\86лаштык-влак",
+       "specialpages-group-other": "Моло спецлаштык-влак",
        "specialpages-group-login": "Пурымаш / регистрацийым эрташ",
        "specialpages-group-users": "Пайдаланыше-влак да нунын йӧн-влак",
        "specialpages-group-highuse": "Чӱчкыдын кучылтмо лаштык-влак",
        "specialpages-group-pagetools": "Лаштык ӱзгар-влак",
        "specialpages-group-redirects": "Вес вере колтышо спецлаштык-влак",
        "external_image_whitelist": " #Оставьте эту строчку такой, как она есть<pre>\n#Разместите здесь фрагменты регулярных выражений (ту часть, что находится между //)\n#они будут соотнесены с URL внешних изображений.\n#Подходящие будут показаны как изображения, остальные будут показаны как ссылки на изображения.\n#Строки, начинающиеся с # считаются комментариями.\n#Строки не чувствительны к регистру\n\n#Размещайте фрагменты регулярных выражений над этой строчкой. Оставьте эту строчку такой, как она есть.</pre>",
+       "tag-filter": "[[Special:Tags|Метке]] фильтр:",
        "logentry-delete-delete": "$1 {{GENDER:$2|шӧрен|шӧрен}} лаштыкым $3",
-       "revdelete-summary": "тӧрлатымаш-влакым возен ончыктымаш",
-       "searchsuggest-search": "Ð\9aычалаш",
+       "logentry-newusers-create": "Пайдаланыше {{GENDER:$2}} $1 лаштыкым ыштен.",
+       "searchsuggest-search": "кычалаш",
        "expand_templates_ok": "Йӧра",
        "expand_templates_preview": "Ончылгоч ончымаш"
 }
index a41205a..800ae70 100644 (file)
        "externaldberror": "Alah tajadi kasalahan otentikasi basis data eksternal atau Sanak indak diizinan malakuan pabaruan tahadok akun eksternal Sanak.",
        "login": "Masuak log",
        "nav-login-createaccount": "Masuak log / buek akun",
-       "userlogin": "Masuak log / buek akun",
-       "userloginnocreate": "Masuak log",
        "logout": "Kalua log",
        "userlogout": "Kalua log",
        "notloggedin": "Alun masuak log",
        "userlogin-noaccount": "Alun ado akun?",
        "userlogin-joinproject": "Join {{SITENAME}}",
-       "nologin": "Alun ado akun? '''$1'''.",
-       "nologinlink": "Buek akun baru",
        "createaccount": "Buek akun",
-       "gotaccount": "Alah tadaftar sabagai pangguno? '''$1'''.",
-       "gotaccountlink": "Masuak log",
-       "userlogin-resetlink": "Lupo rincian info masuak Sanak?",
        "userlogin-resetpassword-link": "Buek ulang kato sandi",
        "createacct-emailrequired": "Alamaik surel",
        "createacct-emailoptional": "Alamaik surel (opsional)",
        "createacct-email-ph": "Masuakan alamaik surel Sanak",
        "createaccountmail": "Pakai kato sandi sumbarang samantaro, lalu kirim ka alamaik surel nan di bawah ko",
        "createacct-realname": "Namo asli (opsional)",
-       "createaccountreason": "Alasan:",
        "createacct-reason": "Alasan",
        "createacct-reason-ph": "Manga Sanak mambuek akun lain",
        "createacct-submit": "Buek akun Sanak",
        "passwordreset-emaildisabled": "Fitur surel alah dimatian pado wiki iko.",
        "passwordreset-username": "Namo pangguno:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Caliak kaputusannyo?",
-       "passwordreset-capture-help": "Kalau sanak mancentang kotak ko, surel (jo kato sandi samantaro) akan nampak jo Sanak.",
        "passwordreset-email": "Alamaik surel:",
        "passwordreset-emailtitle": "Detail akun di {{SITENAME}}",
        "passwordreset-emailtext-ip": "Sasaurang (mungkin Sanak, dari alamaik IP $1) mamintak parubahan kato sandi untuak {{SITENAME}} ($4). {{PLURAL:$3|Akun}} barikuik takaik jo alamaik surel ko:\n\n$2\n\n{{PLURAL:$3|Sandi samantaro}} barikuik akan habih masonyo dalam {{PLURAL:$5|$5 ari}}.\nSanak harus masuak dan mamiliah sandi baru. Jikok urang lain mambuek pamintaan ko atau jikok Sanak ingek sandi awal dan indak nio maubahnyo, Sanak dapek mangacuahkan pasan ko dan taruih manggunoan kato sandi lamo.",
        "anonpreviewwarning": "''Sanak alun masuak log. Manyimpan laman akan manyababkan alamaik IP Sanak tacatat pado riwayat suntiangan laman iko.''",
        "missingsummary": "'''Paringatan:''' Sanak indak mamasuakan ringkasan panyuntiangan. Jikok Sanak baliak manakan tombol Simpan, suntiangan Sanak akan disimpan tanpa ringkasan panyuntiangan.",
        "missingcommenttext": "Masuakan komentar Sanak di bawah ko.",
-       "missingcommentheader": "'''Paringatan:''' Sanak alun maagihan subjek atau judul untuak komenta Sanak. Jikok Sanak baliak manakan \"{{int:savearticle}}\", suntiangan Sanak akan disimpan tanpa komenta tasabuik.",
+       "missingcommentheader": "'''Paringatan:''' Sanak alun maagihan subjek atau judul untuak komenta Sanak. Jikok Sanak baliak manakan \"$1\", suntiangan Sanak akan disimpan tanpa komenta tasabuik.",
        "summary-preview": "Ringkasan pratayang:",
        "subject-preview": "Pratayang subyek/judul:",
        "blockedtitle": "Pangguno diblokir",
        "editingsection": "Suntiang $1 (bagian)",
        "editingcomment": "Manyuntiang $1 (bagian baru)",
        "editconflict": "Konflik panyuntiangan: $1",
-       "explainconflict": "Urang lain lah manyuntiang laman ko sajak Sanak mulai manyuntiangnyo.\nBagian ateh teks ko manganduang teks laman saat kini ko.\nParubahan nan Sanak lakuan ditunjuakan pado bagian bawah teks.\nSanak hanyo paralu manggabungan parubahan Sanak jo teks nan lah ado.\n'''Hanyo''' teks pado bagian ateh lamanlah nan akan disimpan jikok Sanak manakan \"{{int:savearticle}}\".",
+       "explainconflict": "Urang lain lah manyuntiang laman ko sajak Sanak mulai manyuntiangnyo.\nBagian ateh teks ko manganduang teks laman saat kini ko.\nParubahan nan Sanak lakuan ditunjuakan pado bagian bawah teks.\nSanak hanyo paralu manggabungan parubahan Sanak jo teks nan lah ado.\n'''Hanyo''' teks pado bagian ateh lamanlah nan akan disimpan jikok Sanak manakan \"$1\".",
        "yourtext": "Teks Sanak",
        "storedversion": "Versi tasimpan",
        "nonunicodebrowser": "'''Paringatan: Paramban web Sanak indak mandukuang Unicode.'''\nAlah ado jalan kalua bia Sanak dapek manyuntiang laman sacaro aman: karakter non-ASCII akan muncua dalam kotak suntiang sabagai kode heksadesimal.",
        "saveprefs": "Simpan",
        "restoreprefs": "Baliakan ka setelan awal",
        "prefs-editing": "Panyuntiangan",
-       "rows": "Barih:",
-       "columns": "Kolom:",
        "searchresultshead": "Cari",
        "stub-threshold": "Ambang bateh untuak format <a href=\"#\" class=\"stub\">pautan rancangan</a>:",
        "stub-threshold-disabled": "Nonaktifkan",
        "userrights-reason": "Alasan:",
        "userrights-no-interwiki": "Sanak indak bahak untuak mangubah hak pangguno di wiki lain.",
        "userrights-nodatabase": "Basis data $1 indak ado atau bukan disiko.",
-       "userrights-nologin": "Sanak musti [[Special:UserLogin|masuak log]] jo akun panguruih untuak dapek mangubah hak pangguno.",
-       "userrights-notallowed": "Akun Sanak indak ado izin untuak manambah atau malapeh hak pangguno.",
        "userrights-changeable-col": "Kalompok nan dapek Sanak ubah",
        "userrights-unchangeable-col": "Kalompok nan indak dapek Sanak ubah",
        "group": "Kalompok:",
        "rcshowhideanons": "$1 pangguno anon",
        "rcshowhidepatr": "$1 suntiangan tapatroli",
        "rcshowhidemine": "$1 suntiangan denai",
-       "rclinks": "Tunjuakan $1 parubahan tabaru dalam $2 hari tarakhia<br />$3",
+       "rclinks": "Tunjuakan $1 parubahan tabaru dalam $2 hari tarakhia",
        "diff": "bedo",
        "hist": "sijarah",
        "hide": "Suruakan",
        "undeletebtn": "Baliakan",
        "undeletelink": "caliak/baliakan",
        "undeleteviewlink": "caliak",
-       "undeletedrevisions": "{{PLURAL:$1|$1 revisi}} alah dikambalian",
        "undelete-header": "Caliak [[Special:Log/delete|log pangapuihan]] untuak daftar laman nan baru dihapuih.",
        "undelete-search-title": "Cari laman nan dihapuih",
        "undelete-search-box": "Cari laman nan dihapuih",
index 71ed0c5..24bc97a 100644 (file)
@@ -19,7 +19,8 @@
                        "Macofe",
                        "Nemo bis",
                        "Matma Rex",
-                       "Kaldari"
+                       "Kaldari",
+                       "Xð"
                ]
        },
        "tog-underline": "Потцртување на врски:",
        "mypage": "Страница",
        "mytalk": "разговор",
        "anontalk": "Разговор",
-       "navigation": "Ð\9dавигаÑ\86иÑ\98а",
+       "navigation": "Ð\9fÑ\80егледник",
        "and": "&#32;и",
        "qbfind": "Најди",
        "qbbrowse": "Прелистај",
        "actions": "Дејства",
        "namespaces": "Именски простори",
        "variants": "Варијанти",
-       "navigation-heading": "Ð\9dавигаÑ\86ионо Ð¼ÐµÐ½Ð¸",
+       "navigation-heading": "Ð\9fÑ\80егледник",
        "errorpagetitle": "Грешка",
        "returnto": "Назад на $1.",
        "tagline": "Од {{SITENAME}}",
        "unprotectthispage": "Измена на заштитата на страницава",
        "newpage": "Нова страница",
        "talkpage": "Разговор",
-       "talkpagelinktext": "Разговор",
+       "talkpagelinktext": "разговор",
        "specialpage": "Службена страница",
        "personaltools": "Лични алатки",
        "articlepage": "Преглед на содржината",
        "login": "Најава",
        "login-security": "Потврдете го вашиот идентитет",
        "nav-login-createaccount": "Најава / направи сметка",
-       "userlogin": "Најава / направи сметка",
-       "userloginnocreate": "Најава",
        "logout": "Одјава",
        "userlogout": "Одјава",
        "notloggedin": "Не сте најавени",
        "userlogin-noaccount": "Немате сметка?",
        "userlogin-joinproject": "Зачленете се на {{SITENAME}}",
-       "nologin": "Немате корисничка сметка? '''$1'''.",
-       "nologinlink": "Направете нова корисничка сметка",
        "createaccount": "Направи сметка",
-       "gotaccount": "Веќе имате корисничка сметка? '''$1'''.",
-       "gotaccountlink": "Најавете се",
-       "userlogin-resetlink": "Си ги заборавивте податоците за најава?",
        "userlogin-resetpassword-link": "Ја заборавивте лозинката?",
        "userlogin-helplink2": "Помош за најава",
        "userlogin-loggedin": "Веќе сте најавени како {{GENDER:$1|$1}}.\nСо образецот подолу можете да се најавите како друг корисник.",
        "createaccountmail": "Дај привремена произволна лозинка и испрати ја на укажаната адреса",
        "createaccountmail-help": "Може да се користи за создавање на сметка во туѓо име без да ја знаете лозинката.",
        "createacct-realname": "Вистинско име (незадолжително)",
-       "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Зошто правите друга сметка",
        "createacct-reason-help": "Порака што се прикажува во дневникот на создадени сметки",
        "eauthentsent": "На назначената адреса е испратена потврдна порака.\nПред да се испрати друга порака на корисничката сметка, ќе морате да ги проследите напатствијата во пораката, за да потврдите дека таа корисничка сметка е навистина ваша.",
        "throttled-mailpassword": "Веќе е испратена порака за измена на лозинката во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.\nЗа да се спречи злоупотреба, само едно потсетување може да се праќа на {{PLURAL:$1|секој час|секои $1 часа}}.",
        "mailerror": "Грешка при испраќање на е-поштата: $1",
-       "acct_creation_throttle_hit": "Посетители на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 сметка|$1 сметки}} во последниве $2, при што е достигнат најголемиот допуштен број на кориснички сметки предвиден и овозможен за овој период.\nКако резултат на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
+       "acct_creation_throttle_hit": "Посетители на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 сметка|$1 сметки}} во последниве $2, при што е достигнат најголемиот допуштен број на кориснички сметки предвиден и овозможен за овој период.\nКако последица на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
        "emailauthenticated": "Вашата е-пошта адреса е потврдена на $2 во $3 ч.",
        "emailnotauthenticated": "Вашата е-поштенска адреса сè уште не е потврдена.\nНема да биде испратена е-пошта во ниту еден од следниве случаи.",
        "noemailprefs": "Наведете е-поштенска адреса за да функционираат следниве својства.",
        "preview": "Преглед",
        "showpreview": "Преглед",
        "showdiff": "Прикажи промени",
-       "blankarticle": "<strong>Предупредување:</strong> Страницата што ја создавате е празна.\nАко повторно стиснете на „{{int:savearticle}}“, страницата ќе биде создадена без никаква содржина во неа.",
+       "blankarticle": "<strong>Предупредување:</strong> Страницата што ја создавате е празна.\nАко повторно стиснете на „$1“, страницата ќе биде создадена без никаква содржина во неа.",
        "anoneditwarning": "<strong>Предупредување:</strong> Не сте најавени. Вашата IP-адреса ќе биде јавно видлива ако уредувате. Ако <strong>[$1 се најавите]</strong> или <strong>[$2 направите сметка]</strong>, тогаш уредувањата ќе се припишуваат на вашето корисничко име, покрај другите погодности.",
        "anonpreviewwarning": "''Не сте најавени. Ако ја зачувате, Вашата IP-адреса ќе биде заведена во историјата на уредување на страницата.''",
        "missingsummary": "'''Потсетник:''' Не внесовте опис на измените. Ако притиснете Зачувај повторно, вашите измени ќе се зачуваат без опис.",
-       "selfredirect": "<strong>Предупредување:</strong> Создавате пренасочување кон истата статија.\nМоже да сте укажале грешна целна страница, или пак уредувате погрешна страница.\nАко стиснете на „{{int:savearticle}}“ повторно, тогаш пренасочувањето бездруго ќе се создаде.",
+       "selfredirect": "<strong>Предупредување:</strong> Создавате пренасочување кон истата статија.\nМоже да сте укажале грешна целна страница, или пак уредувате погрешна страница.\nАко стиснете на „$1“ повторно, тогаш пренасочувањето бездруго ќе се создаде.",
        "missingcommenttext": "Ве молиме внесете коментар подолу.",
-       "missingcommentheader": "<strong>Потсетување:</strong> Не внесовте наслов за овој коментар.\nАко повторно стиснете на „{{int:savearticle}}“, уредувањето ќе биде зачувано без наслов.",
+       "missingcommentheader": "<strong>Потсетување:</strong> Не внесовте наслов за овој коментар.\nАко повторно стиснете на „$1“, уредувањето ќе биде зачувано без наслов.",
        "summary-preview": "Преглед на описот:",
        "subject-preview": "Преглед на насловот:",
        "previewerrortext": "Се појави грешка при обидот да се прегледаат промените.",
        "accmailtitle": "Лозинката е испратена.",
        "accmailtext": "На $2 е спратена е случајно создадена лозинка за [[User talk:$1|$1]] е испратена. Истата може да се смени на страницата ''[[Special:ChangePassword|Менување на лозинка]]'' откако ќе се најавите.",
        "newarticle": "(нова)",
-       "newarticletext": "Ð\9fÑ\80оÑ\81ледивÑ\82е Ð²Ñ\80Ñ\81ка Ð´Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86а ÐºÐ¾Ñ\98а не постои.\nЗа да ја создадете страницата, напишете текст во полето подолу ([$1 помош]). Ако сте овде по грешка, само систнете на копчето '''назад''' во вашиот прелистувач.",
+       "newarticletext": "Ð\94оÑ\98довÑ\82е Ð½Ð° Ð²Ñ\80Ñ\81ка Ð´Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\88Ñ\82о не постои.\nЗа да ја создадете страницата, напишете текст во полето подолу ([$1 помош]). Ако сте овде по грешка, само систнете на копчето '''назад''' во вашиот прелистувач.",
        "anontalkpagetext": "----\n<em>Ова е страница за разговор со анонимен корисник кој сè уште не регистрирал корисничка сметка или не ја користи.<em>\nЗатоа мораме да ја користиме неговата бројчена IP-адреса за да го препознаеме.\nЕдна ваква IP-адреса може да ја делат повеќе корисници.\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}}|дали насловот се споменува]] во други статии или пак да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пребарате поврзаните дневници]</span>, но немате дозвола да ја создадете страницата.",
        "editingsection": "Уредување на $1 (пасус)",
        "editingcomment": "Уредување на $1 (ново заглавие)",
        "editconflict": "Спротиставеност во уредувањето: $1",
-       "explainconflict": "Некој друг ја променил страницата откако почнавте да ја уредувате.\nГорниот дел за текст ја содржи страницата како што сега постои.\nВашите промени се прикажани во долниот дел.\nЌе морате да ги внесете вашите промени со постоечкиот текст.\n'''Само''' текстот во горниот дел ќе биде зачуван кога ќе притиснете на „{{int:savearticle}}“.",
+       "explainconflict": "Некој друг ја променил страницата откако почнавте да ја уредувате.\nГорниот дел за текст ја содржи страницата како што сега постои.\nВашите промени се прикажани во долниот дел.\nЌе морате да ги внесете вашите промени со постоечкиот текст.\n'''Само''' текстот во горниот дел ќе биде зачуван кога ќе притиснете на „$1“.",
        "yourtext": "Вашиот текст",
        "storedversion": "Зачувана преработка",
        "nonunicodebrowser": "'''ПРЕДУПРЕДУВАЊЕ: Вашиот прелистувач не поддржува Уникод.\nПостои решение што овозможува безбедно да уредување страници: во полето за уредување не-ASCII знаците ќе се јавуваат како хексадецимални кодови.",
        "readonlywarning": "<strong>Предупредување: Базата на податоци е заклучена заради одржување, и затоа сега нема да можете да ги зачувате промените.</strong>\n\nВи препорачуваме да го прекопирате текстот на страна и да го зачувате за подоцна.\n\nАдминистраторот кој ја заклучил базата на податоци го дал следново образложение: $1",
        "protectedpagewarning": "'''Предупредување:  Оваа страница е заклучена, така што само корисници со администраторски привилегии можат да ја уредуваат.'''\nЗа ваша информација, последната ставка во дневникот на промени е прикажана подолу:",
        "semiprotectedpagewarning": "'''Предупредување:'''  Оваа страница е заштитена, така што може да ја уредуваат само регистрирани корисници.'''\nЗа ваша информација, подолу е прикажана последната ставка во дневникот на измени:",
-       "cascadeprotectedwarning": "<strong>Предупредување:</strong> Оваа страница е заклучена, така што можат да ја уредуваат само корисници со администраторски привилегии, бидејќи е вклучена во {{PLURAL:$1|следнава „преносно-заштитена“ страница|следниве „преносно-заштитени“ страници}}:",
+       "cascadeprotectedwarning": "<strong>Предупредување:</strong> Оваа страница е заклучена, така што можат да ја уредуваат само корисници со [[Special:ListGroupRights|извесни права]], бидејќи е вклучена во {{PLURAL:$1|следнава „преносно-заштитена“ страница|следниве „преносно-заштитени“ страници}}:",
        "titleprotectedwarning": "'''Предупредување:'''  Оваа страница е заклучена, така што се потребни [[Special:ListGroupRights|посебни права]] за да се создаде.''''\nЗа ваша информација, последната ставка во дневникот на промени е прикажана подолу:",
        "templatesused": "{{PLURAL:$1|Шаблон|Шаблони}} на страницава:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон|Шаблони}} на прегледуваната страница:",
        "post-expand-template-argument-warning": "'''Предупредување:''' Оваа страница содржи најмалку еден шаблонски аргумент кој е со преголема должина.\nТаквите аргументи ќе бидат изземени при расчленувањето.",
        "post-expand-template-argument-category": "Страници кои содржат изземени аргументи на шаблони",
        "parser-template-loop-warning": "Пронајдена е јамка во шаблонот: [[$1]]",
+       "template-loop-category": "Страници со шаблонски јамки",
+       "template-loop-category-desc": "Страницава содржи шаблонска јамка, т.е. шаблон кој повторливо се самоповикува",
        "parser-template-recursion-depth-warning": "Пречекорена е границата на длабочината на рекурзијата во шаблонот ($1)",
        "language-converter-depth-warning": "Пречекорена е границата на длабочината на јазичниот претворач ($1)",
        "node-count-exceeded-category": "Страници каде е надминат бројот на јазли",
        "page_first": "прв",
        "page_last": "последен",
        "histlegend": "Разлика помеѓу преработките: Означете ги преработките што сакате да ги споредите и притиснете на Enter или копчето на дното од страницата.<br />\nЛегенда: '''({{int:cur}})''' = разлика со последна преработка, '''({{int:last}})''' = разлика со претходна преработка, '''{{int:minoreditletter}}''' = ситна промена.",
-       "history-fieldset-title": "Ð\9fÑ\80еглед Ð½Ð° Ð¸Ñ\81Ñ\82оÑ\80иÑ\98аÑ\82а",
-       "history-show-deleted": "Само избришани",
+       "history-fieldset-title": "Ð\9fÑ\80ебаÑ\80аÑ\98 Ð¿Ñ\80еÑ\80абоÑ\82ки",
+       "history-show-deleted": "Само избришани преработки",
        "histfirst": "најстари",
        "histlast": "најнови",
        "historysize": "({{PLURAL:$1|1 бајт|$1 бајти}})",
        "nextn": "{{PLURAL:следна $1|следни $1}}",
        "prev-page": "претходна страница",
        "next-page": "следна страница",
-       "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80еÑ\82Ñ\85оден|Ð\9fÑ\80еÑ\82Ñ\85одни}} $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}}",
-       "nextn-title": "{{PLURAL:$1|Следен|Следни}} $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}}",
-       "shown-title": "Ð\9fÑ\80икажи $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82\80езÑ\83лÑ\82аÑ\82и}} Ð½Ð° страница",
+       "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80еÑ\82Ñ\85одна|Ð\9fÑ\80еÑ\82Ñ\85одни}} $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}}",
+       "nextn-title": "{{PLURAL:$1|Следна|Следни}} $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}}",
+       "shown-title": "Ð\9fÑ\80икажи $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}} Ð¿Ð¾ страница",
        "viewprevnext": "Погледајте ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''На ова вики има страница со наслов „[[:$1]]“'''",
        "searchmenu-new": "<strong>Создајте ја страницата „[[:$1]]“ на ова вики!</strong> {{PLURAL:$2|0=|Погледајте ја и страницата најдена со пребарувањето.|Погледајте го и најденото од пребарувањето.}}",
        "search-file-match": "(се совпаѓа со содржината на податотеката)",
        "search-suggest": "Дали мислевте на: $1",
        "search-rewritten": "Исход од $1. Или побарајте го $2.",
-       "search-interwiki-caption": "Ð\97бÑ\80аÑ\82имени проекти",
+       "search-interwiki-caption": "Ð\98Ñ\81Ñ\85од Ð¾Ð´ Ð·Ð±Ñ\80аÑ\82имениÑ\82е проекти",
        "search-interwiki-default": "Најдено на $1:",
        "search-interwiki-more": "(уште)",
        "search-interwiki-more-results": "повеќе ставки",
        "search-relatedarticle": "Поврзано",
        "searchrelated": "поврзано",
        "searchall": "сè",
-       "showingresults": "Подолу {{PLURAL:$1|е прикажан '''1''' резултат|се прикажани '''$1''' резултати}} почнувајќи од бр. '''$2'''.",
-       "showingresultsinrange": "Ð\94олÑ\83 {{PLURAL:$1|е Ð¿Ñ\80икажан Ð´Ð¾ <strong>еден</strong> Ñ\80езÑ\83лÑ\82аÑ\82\81е Ð¿Ñ\80икажани Ð´Ð¾ <strong>$1</strong> Ñ\80езÑ\83лÑ\82аÑ\82и}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|РезÑ\83лÑ\82аÑ\82 <strong>$1</strong> Ð¾Ð´ <strong>$3</strong>|РезÑ\83лÑ\82аÑ\82и <strong>$1 - $2</strong> од <strong>$3</strong>}}",
-       "search-nonefound": "Нема резултати што одговараат на бараното.",
-       "search-nonefound-thiswiki": "Ð\9dема Ñ\80езÑ\83лÑ\82аÑ\82и што одговараат на бараното на ова мрежно место.",
+       "showingresults": "Подолу {{PLURAL:$1|е прикажана <strong>1</strong> ставка|се прикажани <strong>$1</strong> ставки}} почнувајќи од бр. <strong>$2</strong>.",
+       "showingresultsinrange": "Ð\9fодолÑ\83 {{PLURAL:$1|е Ð¿Ñ\80икажана Ð´Ð¾ <strong>една</strong> Ñ\81Ñ\82авка|Ñ\81е Ð¿Ñ\80икажани Ð´Ð¾ <strong>$1</strong> Ñ\81Ñ\82авки}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|СÑ\82авка <strong>$1</strong> Ð¾Ð´ <strong>$3</strong>|СÑ\82авки <strong>$1 - $2</strong> од <strong>$3</strong>}}",
+       "search-nonefound": "Нема исходни ставки што одговараат на бараното.",
+       "search-nonefound-thiswiki": "Ð\9dема Ñ\81Ñ\82авки што одговараат на бараното на ова мрежно место.",
        "powersearch-legend": "Напредно пребарување",
        "powersearch-ns": "Пребарај во следниве именски простори:",
        "powersearch-togglelabel": "Избор:",
        "prefs-help-prefershttps": "Поставката ќе се примени следниот пат кога ќе се најавите.",
        "prefswarning-warning": "Направивте промени во нагодувањата, но не ги зачувавте.\nИзмената нема да се изврши ако ја напуштите страницава без да стиснете на „$1“.",
        "prefs-tabs-navigation-hint": "Совет: Можете да ги користите стрелките на тастатурата за да преоѓате од едно на друго јазиче во списокот на јазичиња.",
-       "userrights": "РаководеÑ\9aе Ñ\81о Ðºориснички права",
+       "userrights": "Ð\9aориснички права",
        "userrights-lookup-user": "Изберете корисник",
        "userrights-user-editname": "Внесете корисничко име:",
        "editusergroup": "Вчитај кориснички групи",
        "saveusergroups": "Зачувај ги {{GENDER:$1|корисничките}} групи",
        "userrights-groupsmember": "Член на:",
        "userrights-groupsmember-auto": "Подразбран член на:",
-       "userrights-groups-help": "Можете да измените на кои групи припаѓа корисник:\n* Штиклирано — корисникот е во таа група.\n* Нештиклирано — корисникот не припаѓа на групата.\n* Ѕвездичка (*) — не можете да ја отстраните групата откако сте ја додале (и обратно).\n* Тараба (#) — можете само да го вратите истекот на групава, но не можете да го поместите нанапред.",
+       "userrights-groups-help": "Можете да измените на кои групи припаѓа корисник:\n* Штиклирано — корисникот е во таа група.\n* Нештиклирано — корисникот не припаѓа на групата.\n* Ѕвездичка (*) — не можете да ја отстраните групата откако сте ја додале (и обратно).\n* Тараба (#) — можете само да го вратите истекот на членството во групава, но не можете да го поместите нанапред.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "Немате дозвола за уредување на кориснички права на други викија.",
        "userrights-nodatabase": "Базата на податоци $1 не постои или не е месна.",
        "userrights-expiry-options": "1 ден:1 day,1 недела:1 week,1 месец:1 month,3 месеци:3 months,6 месеци:6 months,1 година:1 year",
        "userrights-invalid-expiry": "Истекот за групата „$1“ е неважечки.",
        "userrights-expiry-in-past": "Истекот за групата „$1“ е во минатото.",
-       "userrights-cannot-shorten-expiry": "Не можете да го поместити нанапред истекот на групата „$1“. Ова можат да го прават само корисници со дозвола за додавање или одземање на оваа група.",
+       "userrights-cannot-shorten-expiry": "Не можете да го поместити нанапред истекот на членството во групата „$1“. Ова можат да го прават само корисници со дозвола за додавање или одземање на оваа група.",
        "userrights-conflict": "Спротиставеност во измените на корисничките права. Прегледајте ги и потврдете ги.",
        "group": "Група:",
        "group-user": "Корисници",
        "right-editsemiprotected": "Уредување на страници заштитени како „{{int:protect-level-autoconfirmed}}“",
        "right-editcontentmodel": "Уредување на содржинскиот модел на страница",
        "right-editinterface": "Уредување на кориснички посредник",
-       "right-editusercssjs": "Уредување на CSS и JS податотеки на други корисници",
        "right-editusercss": "Уредување на CSS податотеки на други корисници",
        "right-edituserjs": "Уредување на JS податотеки на други корисници",
        "right-editmyusercss": "Уредување на сопствени кориснички каскадни стилски податотеки (CSS)",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Прикажи",
        "rcfilters-activefilters": "Активни филтри",
+       "rcfilters-quickfilters": "Брзи врски",
+       "rcfilters-quickfilters-placeholder-title": "Засега нема зачувани врски",
+       "rcfilters-quickfilters-placeholder-description": "За да ги зачувате вашите филтерски псотавки за да ги употребите другпат, стиснете на иконката за бележник во подрачјето „Активен филтер“ подолу.",
+       "rcfilters-savedqueries-defaultlabel": "Зачувани филтри",
+       "rcfilters-savedqueries-rename": "Преименувај",
+       "rcfilters-savedqueries-setdefault": "Задај како основно",
+       "rcfilters-savedqueries-unsetdefault": "Отстрани од основно",
+       "rcfilters-savedqueries-remove": "Отстрани",
+       "rcfilters-savedqueries-new-name-label": "Назив",
+       "rcfilters-savedqueries-apply-label": "Направи брза врска",
+       "rcfilters-savedqueries-cancel-label": "Откажи",
+       "rcfilters-savedqueries-add-new-title": "Зачувај филтри како брза врска",
        "rcfilters-restore-default-filters": "Поврати основни филтри",
        "rcfilters-clear-all-filters": "Тргни ги сите филтри",
        "rcfilters-search-placeholder": "Филтрирај скорешни промени (прелстајте или почнете да пишувате)",
        "rcfilters-invalid-filter": "Неважечки филтер",
        "rcfilters-empty-filter": "Нема активни филтри. Прикажани се сите придонеси.",
        "rcfilters-filterlist-title": "Филтри",
+       "rcfilters-filterlist-whatsthis": "Што е ова?",
+       "rcfilters-filterlist-feedbacklink": "Дајте мислење за новите (бета) филтри",
+       "rcfilters-highlightbutton-title": "Истакнување на исход",
+       "rcfilters-highlightmenu-title": "Изберете боја",
+       "rcfilters-highlightmenu-help": "Изберете боја за да го истакнете ова својство",
        "rcfilters-filterlist-noresults": "Не пронајдов ниеден филтер",
+       "rcfilters-noresults-conflict": "Не пронајдов ништо бидејќи критериумите на барање се спротиставени.",
+       "rcfilters-state-message-subset": "Филтерот не делува бидејќи неговиот исход веќе се содржи во {{PLURAL:$2|следниов поопфатен филтер|следниве поопфатни филтри}} (истакнете го за да го издвоите): $1",
+       "rcfilters-state-message-fullcoverage": "Избирањето на сите филтри во групата е исто како да не сте избрале ниеден, така што овој филтер не делува. Во групата се опфатени: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "Овој филтер е протиставен со {{PLURAL:$2|следниов филтер|следниве филтри}} за искуство, {{PLURAL:$2|кој наоѓа|кои наоѓаат}} само регистрирани корисници: $1",
+       "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-user-experience-level-conflicts-unregistered": "Филтрите за искуство пронаоѓаат само регистрирани корисници, така што овој филтер е простиставен со филтерот „Нерегистрирани“.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Филтерот „Нерегистрирани“ е спротиставен на еден или повеќе од филтрите за искуство. Тие филтри наоѓаат само регистрирани корисници. Спротиставените филтри погоре се означени во одделот Активни филтри.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Новодојденци",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Помалку од 10 уредувања и 4 дена активност.",
+       "rcfilters-filter-user-experience-level-learner-label": "Ученици",
+       "rcfilters-filter-user-experience-level-learner-description": "Поискусни од „новодојденците“, но помалку од „искусните корисници“.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Искусни корисници",
+       "rcfilters-filter-user-experience-level-experienced-description": "Повеќе од 30 дена активност и 500 уредувања.",
        "rcfilters-filtergroup-automated": "Автоматизирани придонеси",
        "rcfilters-filter-bots-label": "Ботовски",
        "rcfilters-filter-bots-description": "Уредувања со автоматизирани алатки.",
        "rcfilters-filter-humans-label": "Човечки (неботовски)",
        "rcfilters-filter-humans-description": "Уредувања направени од човечки уредници.",
+       "rcfilters-filtergroup-reviewstatus": "Провереност",
+       "rcfilters-filter-patrolled-label": "Проверено",
+       "rcfilters-filter-patrolled-description": "Уредувања кои се означени како проверени.",
+       "rcfilters-filter-unpatrolled-label": "Непроверено",
+       "rcfilters-filter-unpatrolled-description": "Уредувања кои не се означени како проверени.",
        "rcfilters-filtergroup-significance": "Значајност",
        "rcfilters-filter-minor-label": "Ситни уредувања",
        "rcfilters-filter-minor-description": "Уредувања кои авторот ги означил како ситни.",
        "rcfilters-filter-major-label": "Неситни уредувања",
        "rcfilters-filter-major-description": "Уредувања кои не се означени како ситни.",
+       "rcfilters-filtergroup-watchlist": "Набљудувани страници",
+       "rcfilters-filter-watchlist-watched-label": "Во набљудуваните",
+       "rcfilters-filter-watchlist-watched-description": "Промени во страниците од набљудуваните.",
+       "rcfilters-filter-watchlist-watchednew-label": "Нови промени во набљудуваните",
+       "rcfilters-filter-watchlist-watchednew-description": "Промени во набљудуваните страници кои не ги имате посетено откога се случиле промените.",
+       "rcfilters-filter-watchlist-notwatched-label": "Вон набљудуваните",
+       "rcfilters-filter-watchlist-notwatched-description": "Сите освен промените во набљудуваните страници.",
        "rcfilters-filtergroup-changetype": "Вид на промена",
        "rcfilters-filter-pageedits-label": "Уредувања на страници",
        "rcfilters-filter-pageedits-description": "Уредувања во содржината, разговорите, описите на категориите...",
        "rcfilters-filter-categorization-description": "Записи од ставање на страници во категории или нивно отстранување од нив.",
        "rcfilters-filter-logactions-label": "Заведени дејства",
        "rcfilters-filter-logactions-description": "Административни постапки, создавања на сметки, бришења на страници, подигања...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Филтерот „Ситни уредувања“ е спротиставен на еден или повеќе од филтрите за видови измена, бидејќи извеси видови не можат да се означат како ситни. Спротиставените филтри се означени во делот Неактивни филтри погоре.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Извезни видови промени не можат да се означат како „ситни“, па затоа овој филтер е во спротиставеност со следниве филтри за видови промени: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Овој филтер за видови промени е во спротиставеност со филтерот „Ситни уредувања“. Извсни видови промени не можат да се означат како „ситни“.",
+       "rcfilters-filtergroup-lastRevision": "Последна преработка",
+       "rcfilters-filter-lastrevision-label": "Последна преработка",
+       "rcfilters-filter-lastrevision-description": "Најнови преработки на страница.",
+       "rcfilters-filter-previousrevision-label": "Претходни преработки",
+       "rcfilters-filter-previousrevision-description": "Сите промени кои не се најнови преработки на страницата.",
        "rcnotefrom": "Подолу {{PLURAL:$5|е прикажана промената|се прикажани промените}} почнувајќи од <strong>$3, $4</strong>  (се прикажуваат до <b>$1</b>).",
+       "rclistfromreset": "Нов избор на датуми",
        "rclistfrom": "Прикажи нови промени почнувајќи од $3 $2",
        "rcshowhideminor": "$1 ситни промени",
        "rcshowhideminor-show": "Прикажи",
        "rcshowhidecategorization": "$1 ја категоризацијата на страниците",
        "rcshowhidecategorization-show": "Прикажи",
        "rcshowhidecategorization-hide": "Скриј",
-       "rclinks": "Прикажи скорешни $1 промени во последните $2 дена<br />$3",
+       "rclinks": "Прикажи скорешни $1 промени во последните $2 дена",
        "diff": "разл",
        "hist": "истор",
        "hide": "Скриј",
        "php-uploaddisabledtext": "Подигањето на податотеки е оневозможено во PHP. \nПроверете го нагодувањето file_uploads.",
        "uploadscripted": "Податотеката содржи HTML-код или сценарио што може погрешно да се протолкува во прелистувачот.",
        "upload-scripted-pi-callback": "Не можам да подигнам податотека што содржи напатствие за обработка на XML-стилска страница.",
+       "upload-scripted-dtd": "Не можам да подигнам SVG-податотеки што содржат нестандардна DTD-изјава.",
        "uploaded-script-svg": "Пронајдов скриптен елемент „$1“ во подигнатата SVG-податотека.",
        "uploaded-hostile-svg": "Пронајдов небезбеден CSS во стилскиот елемент на подигнатата SVG-податотека.",
        "uploaded-event-handler-on-svg": "Задавањето на атрибути <code>$1=\"$2\"</code> за работа со настани не е дозволено за SVG-податотеки.",
        "wantedcategories": "Потребни категории",
        "wantedpages": "Потребни страници",
        "wantedpages-summary": "Список на непостоечки страници со највеќе врски што водат до нив, исклучувајќи страниците до кои водат само пренасочувања. Список на непостоечки страници до кои водат пренасочувања ќе најдете на [[{{#special:BrokenRedirects}}|списокот на прекинати пренасочувања]].",
-       "wantedpages-badtitle": "Ð\9dевалиден Ð½Ð°Ñ\81лов Ð²Ð¾ Ñ\80езÑ\83лÑ\82аÑ\82ите: $1",
+       "wantedpages-badtitle": "Ð\9dеважеÑ\87ки Ð½Ð°Ñ\81лов Ð²Ð¾ Ñ\81Ñ\82авките: $1",
        "wantedfiles": "Потребни податотеки",
        "wantedfiletext-cat": "Следниве податотеки се користат, но не постојат. Податотеките од други складишта може да се наведени дури и ако постојат. Таквите ќе бидат <del>поништени</del> од списокот. Покрај ова, страниците што содржат податотеки кои не постојат се наведени на [[:$1]].",
        "wantedfiletext-cat-noforeign": "Следниве податотеки се користат, но не постојат. Покрај ова, страниците што ги содржат непостоечките податотеки се наведени во [[:$1]].",
        "apisandbox-fullscreen": "Рашири го полето",
        "apisandbox-fullscreen-tooltip": "Рашири го полето на песочникот колку што е голем прозорецот на прелистувачот.",
        "apisandbox-unfullscreen": "Прикажи страница",
-       "apisandbox-unfullscreen-tooltip": "Смали Ð³Ð¾ Ð¿Ð¾Ð»ÐµÑ\82о Ð½Ð° Ð¿ÐµÑ\81оÑ\87никоÑ\82, Ð·Ð° Ð´Ð° Ñ\81е Ð¿Ð¾ÐºÐ°Ð¶Ñ\83вааÑ\82 Ð½Ð°Ð²Ð¸Ð³Ð°Ñ\86иÑ\81ките врски на МедијаВики.",
+       "apisandbox-unfullscreen-tooltip": "Смали Ð³Ð¾ Ð¿Ð¾Ð»ÐµÑ\82о Ð½Ð° Ð¿ÐµÑ\81оÑ\87никоÑ\82, Ð·Ð° Ð´Ð° Ñ\81е Ð¿Ð¾ÐºÐ°Ð¶Ñ\83вааÑ\82 Ð¿Ñ\80егледниÑ\87ките врски на МедијаВики.",
        "apisandbox-submit": "Постави барање",
        "apisandbox-reset": "Исчисти",
        "apisandbox-retry": "Пробај пак",
        "enotif_body_intro_moved": "Страницата $1 на {{SITENAME}} е преместена на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната преработка ќе ја најдете на $3.",
        "enotif_body_intro_restored": "Страницата $1 на {{SITENAME}} е повратена на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната преработка ќе ја најдете на $3.",
        "enotif_body_intro_changed": "Страницата $1 на {{SITENAME}} е изменета на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната преработка ќе ја најдете на $3.",
-       "enotif_lastvisited": "Ð\92идеÑ\82е $1 Ð·Ð° Ñ\81иÑ\82е Ð¿Ñ\80омени Ð¾Ð´ Ð²Ð°Ñ\88аÑ\82а Ð¿Ð¾Ñ\81ледна Ð¿Ð¾Ñ\81еÑ\82а.",
-       "enotif_lastdiff": "Ð\92идеÑ\82е $1 Ð·Ð° Ð´Ð° Ñ\98а Ð²Ð¸Ð´Ð¸Ñ\82е Ð¾Ð²Ð°Ð° Ð¿Ñ\80омена.",
+       "enotif_lastvisited": "СиÑ\82е Ð¿Ñ\80омени Ð¾Ð´ Ð²Ð°Ñ\88аÑ\82а Ð¿Ð¾Ñ\81ледна Ð¿Ð¾Ñ\81еÑ\82а Ñ\9cе Ð³Ð¸ Ð½Ð°Ñ\98деÑ\82е Ð½Ð° $1",
+       "enotif_lastdiff": "Ð\9eваа Ð¿Ñ\80омена Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\98а Ð²Ð¸Ð´Ð¸Ñ\82е Ð½Ð° $1",
        "enotif_anon_editor": "анонимен корисник $1",
        "enotif_body": "Почитуван(а) $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n$NEWPAGE\n\nОпис од уредникот: $PAGESUMMARY $PAGEMINOREDIT\n\nКонакт на уредникот:\nе-пошта: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\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": "создадена",
        "undeleteviewlink": "преглед",
        "undeleteinvert": "Обратен избор",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "{{PLURAL:$1|1 измена е обновена|$1 измени се обновени}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 измена|$1 измени}} и {{PLURAL:$2|1 податотека|$2 податотеки}} се вратени",
-       "undeletedfiles": "{{PLURAL:$1|1 податотека е вратена|$1 податотеки се вратени}}",
        "cannotundelete": "Враќањето не успеа делумно или целосно:\n$1",
        "undeletedpage": "'''$1 беше обновена'''\n\nПогледнете го [[Special:Log/delete|дневникот на бришења]] за попис на претходни бришења и обновувања.",
        "undelete-header": "Списокот на неодамна избришани страници ќе го најдете на [[Special:Log/delete|дневникот на бришења]].",
        "sp-contributions-uploads": "подигања",
        "sp-contributions-logs": "дневници",
        "sp-contributions-talk": "разговор",
-       "sp-contributions-userrights": "раководење со кориснички права",
+       "sp-contributions-userrights": "раководење со {{GENDER:$1|кориснички}} права",
        "sp-contributions-blocked-notice": "Овој корисник е блокиран. Последните ставки во дневникот на блокирања, за ваша информација се дадени подолу:",
        "sp-contributions-blocked-notice-anon": "Оваа IP-адреса е моментално блокирана.\nПодолу е наведен најновиот дневнички запис на блокирање:",
        "sp-contributions-search": "Пребарување на придонеси",
        "unblocked-id": "Блокирањето $1 беше отстрането",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] е одблокирана.",
        "blocklist": "Блокирани корисници",
+       "autoblocklist": "Автоблокови",
+       "autoblocklist-submit": "Пребарај",
+       "autoblocklist-legend": "Испис на автоблокови",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Месен автоблок|Месни автоблокови}}",
+       "autoblocklist-empty": "Списокот на автоблокови е празен.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Друг автоблок|Други автоблокови}}",
        "ipblocklist": "Блокирани корисници",
        "ipblocklist-legend": "Најди блокиран корисник",
        "blocklist-userblocks": "Скриј блокирања на корис. сметки",
        "tooltip-pt-mycontris": "Список на {{GENDER:|ваши}} придонеси",
        "tooltip-pt-anoncontribs": "Список на уредувања направени од оваа IP-адреса",
        "tooltip-pt-login": "Ви препорачуваме да се најавите, иако тоа не е задолжително.",
+       "tooltip-pt-login-private": "Ќе треба да се најавите за да го користите викито",
        "tooltip-pt-logout": "Одјавување",
        "tooltip-pt-createaccount": "Ви препорачуваме да направите сметка и да се најавите, иако тоа не е задолжително",
        "tooltip-ca-talk": "Разговор за страницата",
        "newimages-summary": "Оваа службена страница ги покажува скоро подигнатите податотеки.",
        "newimages-legend": "Филтрирај",
        "newimages-label": "Име на податотека (или дел од името):",
+       "newimages-user": "IP-адреса или корисничко име",
        "newimages-showbots": "Прикажувај подигања од ботови",
        "newimages-hidepatrolled": "Сокриј испатролриани подигања",
        "noimages": "Нема ништо.",
        "confirmrecreate-noreason": "Корисникот [[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|ја избриша}} страницава откако почнавте да ја уредувате.  Потврдете дека навистина сакате да ја пресоздадете страницата.",
        "recreate": "Пресоздај",
        "unit-pixel": "п",
+       "confirm-purge-title": "Превчитај ја страницава",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Да го исчистам меѓускладот на страницава?",
        "confirm-purge-bottom": "Со оваа постапка се чисти опслужувачкиот меѓусклад и се прикажува најновата верзија.",
        "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-restore": "$1 {{GENDER:$2|ја возобнови}} страницата $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|ја поврати}} страницата $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 преработка|$1 преработки}}",
+       "restore-count-files": "{{PLURAL:$1|1 податотека|$1 податотеки}}",
        "logentry-delete-event": "$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|преработка|$5 преработки}} на страницата $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ја измени}} видливоста на настаните во дневникот на $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|поднови}} ознаки во преработката $4 на страницата $3 ({{PLURAL:$7|додадена|додадени}} $6; {{PLURAL:$9|отстранета|отстранети}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|поднови}} ознаки во дневничкиот запис $5 на страницата $3 ({{PLURAL:$7|додадена|додадени}} $6; {{PLURAL:$9|отстранета|отстранети}} $8)",
        "rightsnone": "(нема)",
-       "revdelete-summary": "опис на уредување",
        "rightslogentry-temporary-group": "$1 (привремено, до $2)",
        "feedback-adding": "Го додавам искажаното мислење во страницата...",
        "feedback-back": "Назад",
        "feedback-external-bug-report-button": "Поднеси техничка задача",
        "feedback-dialog-title": "Поднеси мислење",
        "feedback-dialog-intro": "Послужете се со едноставниот образец подолу за да го поднесете вашето мислење. Коментарот ќе ви биде додаден на страницата „$1“, заедно со вашето корисничко име.",
-       "feedback-error1": "Грешка: Непрепознаен резултат од извршникот",
+       "feedback-error1": "Грешка: Непрепознаен исход од извршникот",
        "feedback-error2": "Грешка: Уредувањето не успеа",
        "feedback-error3": "Грешка: Извршникот не одговара",
        "feedback-error4": "Грешка: Не можам да објавам под дадениот наслов",
        "expand_templates_html_output": "Сиров HTML-извод",
        "expand_templates_ok": "ОК",
        "expand_templates_remove_comments": "Отстрани коментари",
-       "expand_templates_remove_nowiki": "Притаи <nowiki> ознаки во резултатот",
+       "expand_templates_remove_nowiki": "Притаи <nowiki> ознаки во исходот",
        "expand_templates_generate_xml": "Прикажи XML-дрво на расчленувањето",
        "expand_templates_generate_rawhtml": "Прикажувај сиров HTML",
        "expand_templates_preview": "Преглед",
        "special-characters-group-thai": "Тајландски",
        "special-characters-group-lao": "Лаошки",
        "special-characters-group-khmer": "Кмерски",
+       "special-characters-group-canadianaboriginal": "канадски домородни",
        "special-characters-title-endash": "цртичка",
        "special-characters-title-emdash": "тире",
        "special-characters-title-minus": "минус",
        "mw-widgets-titleinput-description-redirect": "пренасочување кон $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Додај категорија...",
        "mw-widgets-usersmultiselect-placeholder": "Додај уште...",
+       "date-range-from": "Од датумот:",
+       "date-range-to": "До датумот:",
        "sessionmanager-tie": "Не можете истовремено да користите повеќе типови барања за заверка: $1.",
        "sessionprovider-generic": "$1 седници",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "седници со колачиња",
        "restrictionsfield-label": "Допуштени IP-опсези:",
        "restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
        "revid": "преработка $1",
-       "pageid": "назнака на страницата $1"
+       "pageid": "назнака на страницата $1",
+       "rawhtml-notallowed": "&lt;html&gt;-ознаките не може да се користат вон нормалните страници.",
+       "gotointerwiki": "Го напуштате {{SITENAME}}",
+       "gotointerwiki-invalid": "Укажаниот наслов е неважечки.",
+       "gotointerwiki-external": "Го напуштате {{SITENAME}} упатени кон [[$2]], кое е посебно мрежно место.\n\n'''[$1 Продолжете кон $1]'''",
+       "undelete-cantedit": "Не можете да ја вратите избришаната страница бидејќи уредувањето на страницава не ви е дозволено.",
+       "undelete-cantcreate": "Не можете да ја вратите страницава бидејќи не постои страница со таков назив и не ви е дозволено да ја создадете."
 }
index a1b4175..d5775fe 100644 (file)
        "externaldberror": "ഒന്നുകിൽ ഡേറ്റാബേസ് സാധൂകരണത്തിൽ പ്രശ്നം ഉണ്ടായിരുന്നു അല്ലെങ്കിൽ നവീകരിക്കുവാൻ താങ്കളുടെ ബാഹ്യ അംഗത്വം താങ്കളെ അനുവദിക്കുന്നില്ല.",
        "login": "പ്രവേശിക്കുക",
        "nav-login-createaccount": "പ്രവേശിക്കുക / അംഗത്വമെടുക്കുക",
-       "userlogin": "പ്രവേശിക്കുക / അംഗത്വമെടുക്കുക",
-       "userloginnocreate": "പ്രവേശിക്കുക",
        "logout": "ലോഗൗട്ട്",
        "userlogout": "ലോഗൗട്ട്",
        "notloggedin": "പ്രവേശിച്ചിട്ടില്ല",
        "userlogin-noaccount": "അംഗത്വമില്ലേ?",
        "userlogin-joinproject": "{{SITENAME}} സം‌രംഭത്തിൽ ചേരുക",
-       "nologin": "അംഗത്വമില്ലേ? '''$1'''.",
-       "nologinlink": "ഒരംഗത്വമെടുക്കുക",
        "createaccount": "അംഗത്വമെടുക്കുക",
-       "gotaccount": "താങ്കൾക്ക് അംഗത്വമുണ്ടോ? '''$1'''.",
-       "gotaccountlink": "പ്രവേശിക്കുക",
-       "userlogin-resetlink": "താങ്കളുടെ ലോഗിൻ വിവരങ്ങൾ മറന്നു പോയോ?",
        "userlogin-resetpassword-link": "താങ്കൾ രഹസ്യവാക്ക് മറന്നോ?",
        "userlogin-helplink2": "പ്രവേശിക്കാൻ സഹായമാവശ്യമെങ്കിൽ",
        "userlogin-loggedin": "താങ്കൾ ഇപ്പോൾ തന്നെ {{GENDER:$1|$1}} ആയി പ്രവേശിച്ചിരിക്കുന്നു.\nതാഴെ ഉള്ള ഫോം ഉപയോഗിച്ച് മറ്റൊരു ഉപയോക്താവായി പ്രവേശിക്കാവുന്നതാണ്.",
        "createacct-another-email-ph": "ഇമെയിൽ വിലാസം നൽകുക",
        "createaccountmail": "തൽക്കാലം ക്രമരഹിതമായി സൃഷ്ടിച്ച ഒരു രഹസ്യവാക്ക് ഉപയോഗിക്കുകയും അത് തന്നിരിക്കുന്ന ഇമെയിൽ വിലാസത്തിലേക്കയക്കുകയും ചെയ്യുക",
        "createacct-realname": "ശരിയായ പേര് (നിർബന്ധമില്ല)",
-       "createaccountreason": "കാരണം:",
        "createacct-reason": "കാരണം",
        "createacct-reason-ph": "താങ്കൾ എന്തുകൊണ്ടാണ് മറ്റൊരു അംഗത്വം എടുക്കുന്നത്",
        "createacct-submit": "താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കുക",
        "preview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showpreview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showdiff": "മാറ്റങ്ങൾ കാണിക്കുക",
-       "blankarticle": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ സൃഷ്ടിക്കുന്ന താൾ ശൂന്യമാണ്.\n\"{{int:savearticle}}\" ഒന്നുകൂടി അമർത്തിയാൽ, ഉള്ളടക്കമൊന്നുമില്ലാതെ താൾ സൃഷ്ടിക്കപ്പെടും.",
+       "blankarticle": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ സൃഷ്ടിക്കുന്ന താൾ ശൂന്യമാണ്.\n\"$1\" ഒന്നുകൂടി അമർത്തിയാൽ, ഉള്ളടക്കമൊന്നുമില്ലാതെ താൾ സൃഷ്ടിക്കപ്പെടും.",
        "anoneditwarning": "<strong>മുന്നറിയിപ്പ്:</strong> താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. താങ്കൾ തിരുത്തുകളെന്തെങ്കിലും ചെയ്യുകയാണെങ്കിൽ താങ്കളുടെ ഐ.പി. വിലാസം എല്ലാവർക്കും ലഭ്യമായിരിക്കും. താങ്കൾ <strong>[$1 ലോഗിൻ ചെയ്യുകയോ]</strong>  <strong>[$2 അംഗത്വമെടുക്കുകയോ]</strong> ചെയ്യുന്നതുവഴി മറ്റ് ഗുണങ്ങളോടൊപ്പം താങ്കളുടെ തിരുത്തുകൾ ഉപയോക്തൃനാമത്തിലാവും അറിയപ്പെടുക.",
        "anonpreviewwarning": "''താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. സേവ് ചെയ്യുമ്പോൾ താളിന്റെ തിരുത്തൽ ചരിത്രത്തിൽ താങ്കളുടെ ഐ.പി. വിലാസം ചേർത്തു സൂക്ഷിക്കപ്പെടും.''",
        "missingsummary": "'''ഓർമ്മക്കുറിപ്പ്:''' താങ്കൾ തിരുത്തലിന്റെ ചുരുക്കരൂപം നൽകിയിട്ടില്ല. ''സേവ് ചെയ്യുക'' ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ താങ്കൾ വരുത്തിയ മാറ്റം കാത്തുസൂക്ഷിക്കുന്നതാണ്.",
-       "selfredirect": "<strong>മുന്നറിയിപ്പ്:</strong> ഈ താളിലേക്ക് തന്നെയുള്ള തിരിച്ചുവിടലാണ് താങ്കൾ സൃഷ്ടിക്കുന്നത്.\nതിരിച്ചുവിടലിനു താങ്കൾ നൽകിയ ലക്ഷ്യം തെറ്റിയിരിക്കാം അല്ലെങ്കിൽ താങ്കൾ തിരുത്തുന്നത് തെറ്റായ താൾ ആയിരിക്കാം.\nഎന്തായാലും, വീണ്ടും \"{{int:savearticle}}\" അമർത്തിയാൽ, തിരിച്ചുവിടൽ സൃഷ്ടിക്കപ്പെടുന്നതാണ്.",
+       "selfredirect": "<strong>മുന്നറിയിപ്പ്:</strong> ഈ താളിലേക്ക് തന്നെയുള്ള തിരിച്ചുവിടലാണ് താങ്കൾ സൃഷ്ടിക്കുന്നത്.\nതിരിച്ചുവിടലിനു താങ്കൾ നൽകിയ ലക്ഷ്യം തെറ്റിയിരിക്കാം അല്ലെങ്കിൽ താങ്കൾ തിരുത്തുന്നത് തെറ്റായ താൾ ആയിരിക്കാം.\nഎന്തായാലും, വീണ്ടും \"$1\" അമർത്തിയാൽ, തിരിച്ചുവിടൽ സൃഷ്ടിക്കപ്പെടുന്നതാണ്.",
        "missingcommenttext": "താങ്കളുടെ അഭിപ്രായം ദയവായി താഴെ രേഖപ്പെടുത്തുക.",
-       "missingcommentheader": "<strong>ഓർമ്മക്കുറിപ്പ്:</strong> ഈ കുറിപ്പിന് താങ്കൾ വിഷയം/തലക്കെട്ട് നൽകിയിട്ടില്ല. ''{{int:savearticle}}'' എന്ന ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ വിഷയം/തലക്കെട്ട് ഇല്ലാതെ തന്നെ കാത്തുസൂക്ഷിക്കുന്നതാവും.",
+       "missingcommentheader": "<strong>ഓർമ്മക്കുറിപ്പ്:</strong> ഈ കുറിപ്പിന് താങ്കൾ വിഷയം/തലക്കെട്ട് നൽകിയിട്ടില്ല. ''$1'' എന്ന ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ വിഷയം/തലക്കെട്ട് ഇല്ലാതെ തന്നെ കാത്തുസൂക്ഷിക്കുന്നതാവും.",
        "summary-preview": "ചുരുക്കരൂപം എങ്ങനെയുണ്ടെന്നു കാണുക:",
        "subject-preview": "വിഷയം എങ്ങനെയുണ്ടെന്ന് കാണുക:",
        "previewerrortext": "താങ്കളുടെ മാറ്റങ്ങൾ എങ്ങനെയുണ്ടെന്ന് കാണാൻ ശ്രമിച്ചപ്പോൾ പിഴവുണ്ടായി.",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" എന്നടയാളപ്പെടുത്തി സംരക്ഷിച്ചിട്ടുള്ള താളുകൾ തിരുത്തുക",
        "right-editcontentmodel": "താളിന്റെ ഉള്ളടക്ക രീതി തിരുത്തുക",
        "right-editinterface": "ഉപയോക്തൃ സമ്പർക്കമുഖത്തിൽ മാറ്റം വരുത്തുക",
-       "right-editusercssjs": "മറ്റ് ഉപയോക്താക്കളുടെ CSS, JS പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-editusercss": "മറ്റ് ഉപയോക്താക്കളുടെ CSS പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-edituserjs": "മറ്റ് ഉപയോക്താക്കളുടെ JS പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-editmyusercss": "താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ സി.എസ്.എസ്. പ്രമാണങ്ങൾ തിരുത്തുക",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|പുതിയ താളുകളുടെ പട്ടികയും]] കാണുക)",
        "recentchanges-submit": "പ്രദർശിപ്പിക്കുക",
        "rcfilters-filterlist-title": "അരിപ്പകൾ",
-       "rcfilters-filter-userExpLevel-newcomer-label": "പുതിയ അംഗങ്ങളുടെ തിരുത്തലുകൾ",
+       "rcfilters-filter-user-experience-level-newcomer-label": "പുതിയ അംഗങ്ങളുടെ തിരുത്തലുകൾ",
        "rcfilters-filter-bots-label": "യന്ത്രം",
        "rcfilters-filter-minor-label": "ചെറുതിരുത്തുകൾ",
        "rcnotefrom": "<strong>$3, $4</strong> മുതലുള്ള {{PLURAL:$5|മാറ്റം|മാറ്റങ്ങൾ}} ആണ് താഴെയുള്ളത്  (<strong>$1</strong> എണ്ണം വരെ കൊടുക്കുന്നതാണ്).",
        "rcshowhidecategorization": "താളുകളുടെ വർഗ്ഗീകരണം $1",
        "rcshowhidecategorization-show": "പ്രദർശിപ്പിക്കുക",
        "rcshowhidecategorization-hide": "മറയ്ക്കുക",
-       "rclinks": "കഴിഞ്ഞ $2 ദിവസങ്ങൾക്കുള്ളിലുണ്ടായ $1 മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക<br />$3",
+       "rclinks": "കഴിഞ്ഞ $2 ദിവസങ്ങൾക്കുള്ളിലുണ്ടായ $1 മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക",
        "diff": "മാറ്റം",
        "hist": "നാൾവഴി",
        "hide": "മറയ്ക്കുക",
        "undeleteviewlink": "കാണുക",
        "undeleteinvert": "വിപരീതം തിരഞ്ഞെടുക്കുക",
        "undeletecomment": "കാരണം:",
-       "undeletedrevisions": "{{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} പുനഃസ്ഥാപിച്ചിരിക്കുന്നു",
-       "undeletedrevisions-files": "{{PLURAL:$1|ഒരു പതിപ്പും|$1 പതിപ്പുകളും}} {{PLURAL:$2|ഒരു പ്രമാണവും|$2 പ്രമാണങ്ങളും}} പുനഃസ്ഥാപിച്ചിരിക്കുന്നു",
-       "undeletedfiles": "{{PLURAL:$1|ഒരു പ്രമാണം|$1 പ്രമാണങ്ങൾ}} പുനഃസ്ഥാപിച്ചു",
        "cannotundelete": "മായ്ക്കൽ തിരസ്കരണം പരാജയപ്പെട്ടു:\n$1",
        "undeletedpage": "'''$1 പുനഃസ്ഥാപിച്ചിരിക്കുന്നു'''\n\nപുതിയതായി നടന്ന ഒഴിവാക്കലുകളുടേയും പുനഃസ്ഥാപനങ്ങളുടേയും വിവരങ്ങൾ കാണാൻ [[Special:Log/delete|മായ്ക്കൽ ലോഗ്]] കാണുക.",
        "undelete-header": "അടുത്തകാലത്ത് നീക്കംചെയ്ത താളുകളുടെ പട്ടികയ്ക്ക് [[Special:Log/delete|നീക്കം ചെയ്യൽ പ്രവർത്തനരേഖ]] കാണുക.",
        "logentry-tag-update-revision": "$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പിൽ ടാഗുകൾ $1 {{GENDER:$2|പുതുക്കി}} ($6 {{PLURAL:$7|ചേർത്തു}}; $8 {{PLURAL:$9|നീക്കംചെയ്തു}})",
        "logentry-tag-update-logentry": "$3 എന്ന താളിന്റെ $5 എന്ന രേഖയിലെ ഉൾപ്പെടുത്തലിൽ ടാഗുകൾ $1 {{GENDER:$2|പുതുക്കി}} ($6 {{PLURAL:$7|ചേർത്തു}}; $8 {{PLURAL:$9|നീക്കംചെയ്തു}})",
        "rightsnone": "(ഒന്നുമില്ല)",
-       "revdelete-summary": "തിരുത്തലിന്റെ ചുരുക്കം",
        "feedback-adding": "താങ്കളുടെ അഭിപ്രായങ്ങൾ താളിലേയ്ക്ക് ചേർക്കുന്നു...",
        "feedback-back": "പുറകോട്ട്",
        "feedback-bugcheck": "കൊള്ളാം! [$1 അറിയാവുന്ന ബഗുകളിൽ] ഒന്നല്ല എന്ന് ഒന്നു പരിശോധിച്ചേക്കുക.",
index bacd0d3..411584d 100644 (file)
        "externaldberror": "Нэг бол гадны баталгаажуулах мэдээллийн сангийн алдаа гарсан, эсвэл та өөрийн гадны бүртгэлээ шинэчлэх эрхгүй байна.",
        "login": "Нэвтрэх",
        "nav-login-createaccount": "Нэвтрэх / Бүртгүүлэх",
-       "userlogin": "Нэвтрэх / Бүртгүүлэх",
-       "userloginnocreate": "Нэвтрэх",
        "logout": "Гарах",
        "userlogout": "Гарах",
        "notloggedin": "Нэвтрээгүй байна",
        "userlogin-noaccount": "Бүртгүүлж амжаагүй юу?",
        "userlogin-joinproject": "{{SITENAME}}-д бүртгүүлэх",
-       "nologin": "Бүртгүүлж амжаагүй юу? '''$1'''.",
-       "nologinlink": "Бүртгүүлэх",
        "createaccount": "Бүртгүүлэх",
-       "gotaccount": "Та бүртгэлтэй юу? '''$1'''",
-       "gotaccountlink": "Нэвтрэх",
-       "userlogin-resetlink": "Нэвтрэх мэдээллээ мартаа юу?",
        "userlogin-resetpassword-link": "Нууц үгээ мартсан уу?",
        "userlogin-helplink2": "Нэвтрэх талаар зөвлөмж",
        "userlogin-loggedin": "Та {{GENDER:$1|$1}} нэрээр нэвтэрсэн байна.\nӨөр нэрээр нэвтрэх бол доорх маягтыг ашиглана уу.",
        "createacct-another-email-ph": "Цахим шуудангийн хаяг оруулна уу",
        "createaccountmail": "Мэйлээр илгээх",
        "createacct-realname": "Жинхэнэ нэр (хоосон орхиж болно)",
-       "createaccountreason": "Шалтгаан:",
        "createacct-reason": "Шалтгаан",
        "createacct-reason-ph": "Өөр бүртгэл үүсгэх шалтгаан",
        "createacct-submit": "Бүртгүүлэх",
        "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$2\n\n{{PLURAL:$3|Уг түр хэрэглэх нууц үг|Уг түр хэрэглэх нууц үгүүд}} нь {{PLURAL:$5|нэг өдрийн|$5 өдрийн}} дотор устах болно.\nТа уг нууц үгээр нэвтэрч, түүнийг шинэчлэх хэрэгтэй. Хэрэв өөр нэгэн уг хүсэлтийг явуулсан бол \nэсвэл өөрийн ориг нууц үгээ санаж байгаад түүнийгээ өөрчлөхийг хүсэхгүй байгаа бол энэ захиаг үл ойшоож \nэнгийнээр нэвтэрч болно.",
        "anonpreviewwarning": "''Та нэвтрээгүй байна. Хадгалвал энэ хуудасны түүхэнд таны IP хаяг бичигдлэх болно.''",
        "missingsummary": "'''Сануулга:''' Та засварынхаа товч агуулгын тухай оруулаагүй байна.\nХэрэв та Хадгалах товчийг дахин дарвал таны засвар товч агуулгагүйгээр хадгалагдана.",
        "missingcommenttext": "Доор санал бодлоо оруулна уу.",
-       "missingcommentheader": "'''Сануулга:''' Та энэхүү санал бодолдоо гарчиг бичээгүй байна.\nХэрэв та {{int:savearticle}} дээр дахин дарвал таны засвар гарчиггүй хадгалагдах болно.",
+       "missingcommentheader": "'''Сануулга:''' Та энэхүү санал бодолдоо гарчиг бичээгүй байна.\nХэрэв та $1 дээр дахин дарвал таны засвар гарчиггүй хадгалагдах болно.",
        "summary-preview": "Товч агуулгын урьдчилж харсан байдал:",
        "subject-preview": "Сэдэв/гарчигийн урьдчилж харсан байдал:",
        "previewerrortext": "Таны өөрчлөлтийг хянахад алдаа гарлаа.",
        "editingsection": "$1-г засварлаж байна (хэсэг)",
        "editingcomment": "$1-г засварлаж байна (шинэ хэсэг)",
        "editconflict": "Засварын зөрөлдөөн боллоо: $1",
-       "explainconflict": "Та энэ хуудсыг засварлаж эхэлснээс хойш өөр хэн нэгэн өөрчилжээ.\nДээд талын бичгийн талбарт одоогийн хуудасны байдал харагдаж байна.\nТаны өөрчлөлтүүд доод талын бичгийн талбарт харагдаж байна.\nТа өөрийн засваруудаа одоогийн хуудасны байдалтай нэгтгэх хэрэгтэй.\n\"{{int:savearticle}}\" товчийг дарахад '''зөвхөн''' дээд талын бичгийн талбарт буй бичиг л хадгалагдана.",
+       "explainconflict": "Та энэ хуудсыг засварлаж эхэлснээс хойш өөр хэн нэгэн өөрчилжээ.\nДээд талын бичгийн талбарт одоогийн хуудасны байдал харагдаж байна.\nТаны өөрчлөлтүүд доод талын бичгийн талбарт харагдаж байна.\nТа өөрийн засваруудаа одоогийн хуудасны байдалтай нэгтгэх хэрэгтэй.\n\"$1\" товчийг дарахад '''зөвхөн''' дээд талын бичгийн талбарт буй бичиг л хадгалагдана.",
        "yourtext": "Таны текст",
        "storedversion": "Хадгалагдсан хувилбар",
        "nonunicodebrowser": "'''АНХААР: Таны броузер юникод стандартыг дагадаггүй юм байна. ASCII-биш үсгүүд засварлах талбарт код байдалтай харагдана. Иймээс броузераа тохируулах, эсвэл өөрчилнө үү.'''",
        "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": "Таны өөрчилж болохгүй бүлгүүд",
        "userrights-conflict": "Хэрэглэгчийн эрхийн өөрчлөлтийн зөрчилдөөн! Өөрийнхөө өөрчлөлтөд итгэлтэй эсэхээ ахин нягтлаарай.",
-       "userrights-removed-self": "Та өөрийнхөө эрхийг авч хаялаа. Тиймээс та энэ хуудсанд нэвтрэх эрхгүй болно.",
        "group": "Бүлэг:",
        "group-user": "Хэрэглэгчид",
        "group-autoconfirmed": "Автоматаар батлагдсан хэрэглэгчид",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" -ээр хамгаалагдсан хуудсыг засах",
        "right-editcontentmodel": "Хуудасны моделын агуулгыг засах",
        "right-editinterface": "Хэрэглэгчийн интерфэйсийг засварлах",
-       "right-editusercssjs": "Бусад хэрэглэгчдийн CSS болон JS файлуудыг засварлах",
        "right-editusercss": "Бусад хэрэглэгчдийн CSS файлуудыг засварлах",
        "right-edituserjs": "Бусад хэрэглэгчдийн JS файлуудыг засварлах",
        "right-editmyusercss": "Өөрийн хэрэглэгчийн CSS файлыг засах",
        "right-siteadmin": "Мэдээллийн баазыг түгжих буюу нээх",
        "right-override-export-depth": "5 хүртэлх гүний хуудсуудыг холбогдсон хуудсуудтай хамт гаргах",
        "right-sendemail": "Бусад хэрэглэгчид руу и-мэйл явуулах",
-       "right-passwordreset": "Цахим шуудангийн нууц үгийг сэргээн харах",
        "right-managechangetags": "[[Special:Tags|tags]] -ыг өгөгдлийн сангаас устгах, нэмэх",
        "right-applychangetags": "[[Special:Tags|tags]] -ыг өөрчлөлтийн хамт хэрэгжүүлэх",
        "right-changetags": "[[Special:Tags|tags]] -ыг хувийн хяналт, логийн бичлэг дагалдуулан нэмэх, хасах",
        "rcshowhidemine": "Миний засваруудыг $1",
        "rcshowhidemine-show": "үзүүлэх",
        "rcshowhidemine-hide": "нуух",
-       "rclinks": "Сүүлийн $2 өдрийн турших $1 засварыг үзүүлэх<br />$3",
+       "rclinks": "Сүүлийн $2 өдрийн турших $1 засварыг үзүүлэх",
        "diff": "ялгаа",
        "hist": "түүх",
        "hide": "нуух",
        "undeleteviewlink": "харах",
        "undeleteinvert": "Зааснаас бусад",
        "undeletecomment": "Шалтгаан:",
-       "undeletedrevisions": "{{PLURAL:$1|1 хувилбар|$1 хувилбар}}  сэргээгдлээ",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 засвар|$1 засвар}} ба {{PLURAL:$2|1 файл|$2 файл}} сэргээгдлээ",
-       "undeletedfiles": "{{PLURAL:$1|1 файл|$1 файл}} сэргээгдлээ",
        "cannotundelete": "Устгал сэргээлт хийж чадсангүй:\n$1",
        "undeletedpage": "'''$1 сэргээгдэв'''\n\nСүүлийн үед устгагдсан ба сэргээгдсэн зүйлүүдийн жагсаалтыг [[Special:Log/delete|устгалын бүртгэл]] дээрээс харна уу.",
        "undelete-header": "[[Special:Log/delete|Устгалын бүртгэл]]ээс сүүлд устгагдсан хуудсуудыг харна уу.",
        "logentry-rights-rights-legacy": "$1 $3 дэхь грүпийн гишүүнчлэлээ сольсон",
        "logentry-rights-autopromote": "$1 $4 аас $5 руу автоматаар дэвшигдлээ",
        "rightsnone": "(байхгүй)",
-       "revdelete-summary": "засварын товч агуулга",
        "feedback-cancel": "Болих",
        "feedback-close": "Болсон",
        "searchsuggest-search": "Хайх",
-       "api-error-filename-tooshort": "Файлын нэр хэтэрхий урт байна.",
-       "api-error-filetype-banned": "Ийм төрлийн файлыг хорьсон байна.",
-       "api-error-illegal-filename": "Ийм хэрэглэгчийн нэр өгөх боломжгүй.",
-       "api-error-internal-error": "Өөрийн алдаа: файлыг чинь upload хийх явцад алдаа гарлаа.",
-       "api-error-mustbeloggedin": "файлаа upload хийхийн тулд эхлээд хэрэглэгчээр нэвтэр.",
-       "api-error-mustbeposted": "Өөрийн алдаа: HTTP POST төрлийн хандалт шаардлагатай.",
-       "api-error-noimageinfo": "upload хийгдсэн боловч файлын талаар ямарч мэдээлэл сервер өгсөнгүй.",
-       "api-error-nomodule": "Өөрийн алдаа: upload хийх модулийг зааж өгөөгүй байна.",
-       "api-error-ok-but-empty": "Өөрийн алдаа: Серверээс хариу ирсэнгүй.",
-       "api-error-overwrite": "Ижил нэртэй файл оруулах хориотой.",
        "api-error-stashfailed": "Өөрийн алдаа: Серверт түр файл хадгалахад алдаа гарлаа.",
-       "api-error-timeout": "Сервер хариу өгөлгүй удлаа.",
-       "api-error-unclassified": "Тодорхойгүй алдаа гарлаа.",
-       "api-error-unknown-code": "Тодорхойгүй алдаа: \"$1\".",
-       "api-error-unknown-error": "Өөрийн алдаа: upload хийх үед алдаа гарлаа.",
        "api-error-unknown-warning": "Тодорхойгүй сануулга: $1",
        "api-error-unknownerror": "Тодорхойгүй алдаа: $1",
-       "api-error-uploaddisabled": "Энэ викид upload хийхийг хориглосон.",
-       "api-error-verification-error": "Файлын төрөл буруу, эсвэл дутуу татагдсан.",
        "duration-seconds": "$1 {{PLURAL:$1|секунд|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|цаг|цаг}}",
index 64e73ff..7af2bf2 100644 (file)
        "rcshowhideliu": "$1 утилизаторь аутентификаць",
        "rcshowhideanons": "$1 утилизаторь анонимь",
        "rcshowhidemine": "$1 едитэриле меле",
-       "rclinks": "Аратэ ултимеле $1 модификэрь дин ултимеле $2 зиле.<br />$3",
+       "rclinks": "Аратэ ултимеле $1 модификэрь дин ултимеле $2 зиле.",
        "diff": "диф",
        "hist": "ист",
        "hide": "аскунде",
index 864bdeb..79281bf 100644 (file)
        "login": "सनोंद-प्रवेश(लॉग-ईन)",
        "login-security": "तुमची ओळख पटवा",
        "nav-login-createaccount": "सनोंद-प्रवेश / सदस्यखाते उघडा",
-       "userlogin": "सनोंद-प्रवेश करा /सदस्यखाते उघडा",
-       "userloginnocreate": "सनोंद-प्रवेश",
        "logout": "सनोंद-निर्गम",
        "userlogout": "सनोंद-निर्गम",
        "notloggedin": "आपण सनोंद-प्रवेशित नाहीत",
        "userlogin-noaccount": "आपले खाते नाही?",
        "userlogin-joinproject": "{{SITENAME}}मध्ये सहभागी व्हा",
-       "nologin": "आपले सदस्यखाते नाही काय? $1.",
-       "nologinlink": "सदस्यखाते तयार करा",
        "createaccount": "नवीन खाते तयार करा",
-       "gotaccount": "पूर्वीचे खाते आहे? $1.",
-       "gotaccountlink": "सनोंद-प्रवेश करा",
-       "userlogin-resetlink": "सनोंद-प्रवेश तपशील विसरला असाल तर येथे टिचकी मारा.",
        "userlogin-resetpassword-link": "आपला परवलीचा शब्द विसरलात?",
        "userlogin-helplink2": "सनोंद प्रवेशासंबंधी साहाय्य",
        "userlogin-loggedin": "आपण पुर्वीच {{GENDER:$1|$1}} म्हणून सनोंद प्रवेशित आहात.वेगळ्या सदस्यनावाने सनोंद प्रवेशासाठी खालील आवेदन वापरा.",
        "createacct-another-email-ph": "आपला विपत्रपत्ता (ई-मेल) टाका",
        "createaccountmail": "तात्पुरता अनियत (रॅन्डम) परवलीचा शब्द तयार करून तो खाली नमूद विपत्रपत्त्यावर पाठवा",
        "createacct-realname": "खरे नाव (ऐच्छिक)",
-       "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आपण दुसरे खाते कां बनवीत आहात",
        "createacct-submit": "आपले खाते निर्माण करा",
        "preview": "झलक",
        "showpreview": "झलक दाखवा",
        "showdiff": "बदल दाखवा",
-       "blankarticle": "<strong>ईशारा:</strong>आपण तयार करीत असलेले पान कोरे आहे.जर आपण पुन्हा \"{{int:savearticle}}\" टिचकले तर,कोणताही आशय/मजकूर नसलेले पान तयार होईल.",
+       "blankarticle": "<strong>ईशारा:</strong>आपण तयार करीत असलेले पान कोरे आहे.जर आपण पुन्हा \"$1\" टिचकले तर,कोणताही आशय/मजकूर नसलेले पान तयार होईल.",
        "anoneditwarning": "<strong>इशारा:</strong> तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेले नाही.आपण काही संपादन केले तर, तुमचा अंकपत्ता (आयपी) सार्वजनिक रित्या दृष्य होईल. जर आपण <strong>[$1 सनोंद प्रवेश केला]</strong> किंवा <strong>[$2 खाते उघडले]</strong>,तर आपण केलेली संपादने ही आपल्या नांवाशी संलग्न होतील, त्याशिवाय याचे इतरही फायदे आहेत.",
        "anonpreviewwarning": "\"'''सावधान:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आय.पी. ॲड्रेस) नोंदला जाईल.\"",
        "missingsummary": "'''आठवण:''' आपण संपादन सारांश पुरवलेला नाही.आपण 'जतन करा' वर पुन्हा टिचकी मारली तर, ते त्याशिवायच जतन होईल.",
-       "selfredirect": "<strong>ईशारा:</strong>आपण या पानास, त्याच पानावर पुनर्निर्देशित करीता आहात.\nआपण पुनर्निर्देशनासाठी चूकिचे लक्ष्य नमूद केले आहे किंवा आपण चूकिच्या पानाचे संपादन करीत आहात.\nजर आपण पुन्हा \"{{int:savearticle}}\" टिचकले तर, कसेहीकरुन ते पुनर्निर्देशन तयार होईल.",
+       "selfredirect": "<strong>ईशारा:</strong>आपण या पानास, त्याच पानावर पुनर्निर्देशित करीता आहात.\nआपण पुनर्निर्देशनासाठी चूकिचे लक्ष्य नमूद केले आहे किंवा आपण चूकिच्या पानाचे संपादन करीत आहात.\nजर आपण पुन्हा \"$1\" टिचकले तर, कसेहीकरुन ते पुनर्निर्देशन तयार होईल.",
        "missingcommenttext": "कृपया खाली प्रतिक्रिया भरा.",
-       "missingcommentheader": "<strong>आठवण:<strong> आपण या लेखनाकरिता विषय दिलेला नाही. आपण पुन्हा \"{{int:savearticle}}\" वर टिचकले तर, तुमचे संपादन त्याशिवायच जतन होईल.",
+       "missingcommentheader": "<strong>आठवण:<strong> आपण या लेखनाकरिता विषय दिलेला नाही. आपण पुन्हा \"$1\" वर टिचकले तर, तुमचे संपादन त्याशिवायच जतन होईल.",
        "summary-preview": "आढाव्याची झलक:",
        "subject-preview": "विषय झलक:",
        "previewerrortext": "आपल्या बदलांची झलक बघण्याचे प्रयत्नादरम्यान त्रुटी उद्भवली.",
        "editingsection": "$1 (विभाग) संपादन",
        "editingcomment": "$1 चे संपादन (प्रतिक्रिया)",
        "editconflict": "संपादन मतभेद: $1",
-       "explainconflict": "आपण संपादनाला सुरूवात केल्यानंतर इतर कोणीतरी या पानात बदल केला आहे.\nयातील वरच्या पाठ्यभागामध्ये सध्या अस्तिवात असलेल्या पृष्ठातील पाठ्य आहे. आपले बदल हे खालच्या बाजूतील पाठ्यभागात दर्शविलेले आहेत.\nआपल्याला हे बदल सध्या अस्तिवात असणाऱ्या पाठ्यासोबत एकत्रित करावे लागतील.\nजर तुम्ही \"{{int:savearticle}}\" ही कळ दाबली तर,'''केवळ''' वरच्या पाठ्यभागामध्ये असलेले पाठ्यच साठविण्यात येईल .",
+       "explainconflict": "आपण संपादनाला सुरूवात केल्यानंतर इतर कोणीतरी या पानात बदल केला आहे.\nयातील वरच्या पाठ्यभागामध्ये सध्या अस्तिवात असलेल्या पृष्ठातील पाठ्य आहे. आपले बदल हे खालच्या बाजूतील पाठ्यभागात दर्शविलेले आहेत.\nआपल्याला हे बदल सध्या अस्तिवात असणाऱ्या पाठ्यासोबत एकत्रित करावे लागतील.\nजर तुम्ही \"$1\" ही कळ दाबली तर,'''केवळ''' वरच्या पाठ्यभागामध्ये असलेले पाठ्यच साठविण्यात येईल .",
        "yourtext": "तुमचा मजकूर",
        "storedversion": "साठविलेली आवृत्ती",
        "nonunicodebrowser": "'''सावधान: तुमचा न्याहाळक युनिकोड आधारित नाही. ASCII नसलेली  अक्षरचिन्हे संपादन खिडकीत सोळाअंकी कूटसंकेत (हेक्झाडेसीमल कोड) स्वरूपात दिसण्याची, सुरक्षितपणे संपादन करू देणारी,  पळवाट उपलब्ध आहे.'''",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" म्हणून नमुद केलेली सुरक्षित पाने संपादा",
        "right-editcontentmodel": "पानाचा आशय नमूना संपादा",
        "right-editinterface": "सदस्य पसंतीक्रम बदला",
-       "right-editusercssjs": "इतर सदस्यांच्या CSS व JS संचिका संपादित करा",
        "right-editusercss": "इतर सदस्यांच्या CSS संचिका संपादित करा",
        "right-edituserjs": "इतर सदस्यांच्या JS संचिका संपादित करा",
        "right-editmyusercss": "स्वत:च्या सदस्यनामाच्या 'सीएसएस' संचिका संपादा",
        "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-user-experience-level-newcomer-label": "नवागत",
+       "rcfilters-filter-user-experience-level-newcomer-description": "१० संपादनांपेक्षा कमी व ४ दिवसांची सक्रियता.",
+       "rcfilters-filter-user-experience-level-learner-label": "शिकाऊ",
        "rcnotefrom": "खाली {{PLURAL:$5|हा बदल आहे|हे बदल आहेत}} <strong>$3, $4</strong>पासून ते(<strong>$1</strong>पर्यंतचे  बदल दाखविले आहेत).",
        "rclistfrom": "$2,$3 पासून सुरुवात करुन, नविन केल्या गेलेले बदल दाखवा.",
        "rcshowhideminor": "छोटे बदल $1",
        "rcshowhidecategorization": "$1 पान वर्गीकरण",
        "rcshowhidecategorization-show": "दाखवा",
        "rcshowhidecategorization-hide": "लपवा",
-       "rclinks": "मागील $2 दिवसांतील $1 बदल पहा.<br />$3",
+       "rclinks": "मागील $2 दिवसांतील $1 बदल पहा.",
        "diff": "फरक",
        "hist": "इति.",
        "hide": "लपवा",
        "undeleteviewlink": "पहा",
        "undeleteinvert": "निवड उलट करा",
        "undeletecomment": "प्रतिक्रिया:",
-       "undeletedrevisions": "{{PLURAL:$1|1 आवर्तन|$1 आवर्तने}} पुनर्स्थापित",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 आवर्तन|$1 आवर्तने}}आणि {{PLURAL:$2|1 संचिका|$2 संचिका}} पुनर्स्थापित",
-       "undeletedfiles": "{{PLURAL:$1|1 संचिका|$1 संचिका}} पुनर्स्थापित",
        "cannotundelete": "काही किंवा सर्वच उलटवणे फसले:$1",
        "undeletedpage": "<strong>$1ला पुनर्स्थापित केले</strong>\n\nअलिकडिल वगळलेल्या आणि पुनर्स्थापितांच्या नोंदीकरिता [[Special:Log/delete|वगळल्याच्या नोंदी]] पहा .",
        "undelete-header": "अलीकडील वगळलेल्या पानांकरिता [[Special:Log/delete|वगळलेल्या नोंदी]] पहा.",
        "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 ने $3 हे पुनर्निर्देशन उपरीलेखन(ओव्हररायटिंग) करून {{GENDER:$2|वगळले}}",
        "logentry-delete-restore": "$1 {{GENDER:$2|पुनर्स्थापित पृष्ठ}} $3",
        "logentry-delete-event": "$1 ने $3 वर{{PLURAL:$5|नोंद-प्रसंग|$5 नोंद प्रसंगांची}} दृष्यता{{GENDER:$2|बदलली}}:$4",
        "logentry-delete-revision": "$1 ने $3 पानावर{{PLURAL:$5|आवृत्ती|$5 आवृत्यांची}} दृष्यता{{GENDER:$2|बदलली}}:$4",
        "logentry-managetags-deactivate": "$1 ने  \"$4\" ही खूणपताका, सदस्यांसाठी व सांगकाम्यांसाठी {{GENDER:$2|अक्रिय केली}}",
        "log-name-tag": "खूणपताका नोंदी",
        "rightsnone": "(काहीही नाही)",
-       "revdelete-summary": "संपादन माहिती",
        "feedback-adding": "आपला पश्चप्रदाय (फिडबॅक)  जोडत आहोत या पानास.......",
        "feedback-back": "परत",
        "feedback-bugcheck": "उत्तम! फक्त एकदा खात्री करा की हा [$1 अगोदरच माहिती असलेला बग] तर नाहीये.",
index bf16968..0c114ec 100644 (file)
        "rcshowhideliu": "$1 тинӓрӹн сирӓлтӹнӹт",
        "rcshowhideanons": "$1 анонимвлӓ",
        "rcshowhidemine": "$1 ӹшке тӧрлӹмӓшвлӓэт",
-       "rclinks": "Пӹтӓрӹтш  $1кечӹвлаштӹш $2 вашталтмашвлӓм  анжыкташ<br />$3",
+       "rclinks": "Пӹтӓрӹтш  $1кечӹвлаштӹш $2 вашталтмашвлӓм  анжыкташ",
        "diff": "ма-шон",
        "hist": "истори",
        "hide": "шӹлтӓш",
index 865fa33..5be1fc5 100644 (file)
        "login": "Log masuk",
        "login-security": "Mengesahkan identiti anda",
        "nav-login-createaccount": "Log masuk / buka akaun",
-       "userlogin": "Log masuk / buka akaun",
-       "userloginnocreate": "Log masuk",
        "logout": "Log keluar",
        "userlogout": "Log keluar",
        "notloggedin": "Belum log masuk",
        "userlogin-noaccount": "Tidak mempunyai akaun?",
        "userlogin-joinproject": "Sertai {{SITENAME}}",
-       "nologin": "Belum mempunyai akaun? '''$1'''.",
-       "nologinlink": "Buka akaun baru",
        "createaccount": "Buka akaun",
-       "gotaccount": "Sudah mempunyai akaun? '''$1'''.",
-       "gotaccountlink": "Log masuk",
-       "userlogin-resetlink": "Lupa nama pengguna/kata laluan anda?",
        "userlogin-resetpassword-link": "Lupa kata laluan anda?",
        "userlogin-helplink2": "Bantuan untuk log masuk",
        "userlogin-loggedin": "Anda sudah log masuk sebagai {{GENDER:$1|$1}}. Gunakan borang di bawah untuk log masuk sebagai pengguna lain.",
        "createaccountmail": "Gunakan kata laluan rawak yang sementara dan hantarnya ke alamat e-mel yang dinyatakan",
        "createaccountmail-help": "Boleh digunakan untuk membuat akaun untuk orang lain tanpa mengetahui kata laluan.",
        "createacct-realname": "Nama sebenar (pilihan)",
-       "createaccountreason": "Sebab:",
        "createacct-reason": "Sebab",
        "createacct-reason-ph": "Mengapa anda membuka satu lagi akaun",
        "createacct-reason-help": "Mesej yang ditunjukkan dalam log penciptaan akaun",
        "botpasswords-label-delete": "Hapuskan",
        "botpasswords-label-resetpassword": "Set semula kata laluan",
        "botpasswords-label-grants": "Pemberian berkenaan:",
+       "botpasswords-help-grants": "Membenarkan pemberian akses kepada hak-hak yang telah dipegang oleh akaun pengguna anda. Membolehkan pemberian di sini tidak menyediakan akses kepada mana-mana hak yang akaun pengguna anda tidak sepatutnya ada. Lihat [[Special:ListGrants|jadual pemberian]] untuk maklumat lanjut.",
+       "botpasswords-label-grants-column": "Diberikan",
+       "botpasswords-bad-appid": "Nama bot \"$1\" adalah tidak sah.",
+       "botpasswords-insert-failed": "Gagal untuk menambah nama bot \"$1\". Adakah ia telah digunakan?",
+       "botpasswords-update-failed": "Gagal untuk mengemas kini nama bot \"$1\". Adakah ia telah dipadam?",
+       "botpasswords-created-title": "Kata laluan bot telah dicipta",
+       "botpasswords-created-body": "Kata laluan bot untuk nama bot \"$1\" bagi pengguna \"$2\" telah dicipta.",
+       "botpasswords-updated-title": "Kata laluan bot telah dikemaskinikan",
+       "botpasswords-updated-body": "Kata laluan bot untuk nama bot \"$1\" bagi pengguna \"$2\" telah dikemaskini.",
+       "botpasswords-deleted-title": "Kata laluan bot telah dipadam",
+       "botpasswords-deleted-body": "Kata laluan bot untuk nama bot \"$1\" bagi pengguna \"$2\" telah dipadam.",
+       "botpasswords-newpassword": "Kata laluan baru untuk log masuk dengan <strong>$1</strong> adalah <strong>$2</strong>. <em>Sila catatkan ini untuk rujukan masa depan.</em> <br> (Untuk bots lama yang memerlukan nama log masuk untuk menjadi sama dengan nama pengguna akhirnya, anda juga boleh menggunakan <strong>$3</strong> sebagai nama pengguna dan <strong>$4</strong> sebagai kata laluan.)",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider tidak tersedia.",
+       "botpasswords-restriction-failed": "Bot sekatan kata laluan menghalang log masuk ini.",
+       "botpasswords-invalid-name": "Nama pengguna yang dinyatakan tidak mengandungi pemisah kata laluan bot (\"$1\").",
        "resetpass_forbidden": "Kata laluan tidak boleh ditukar",
        "resetpass-no-info": "Anda hendaklah log masuk terlebih dahulu untuk mencapai laman ini secara terus.",
        "resetpass-submit-loggedin": "Tukar kata laluan",
        "preview": "Pralihat",
        "showpreview": "Paparkan pralihat",
        "showdiff": "Lihat perubahan",
-       "blankarticle": "<strong>Amaran:</strong> Laman yang anda sedang menciptakan adalah kosong.\nJika akan menklik \"{{int:savearticle}}\" sekali lagi, laman ini akan diciptakan tanpa sebarang kandungan.",
+       "blankarticle": "<strong>Amaran:</strong> Laman yang anda sedang menciptakan adalah kosong.\nJika akan menklik \"$1\" sekali lagi, laman ini akan diciptakan tanpa sebarang kandungan.",
        "anoneditwarning": "<strong>Amaran:</strong> Anda tidak log masuk. Alamat IP anda akan disiarkan kepada umum jika anda membuat sebarang suntingan. Jika anda <strong>[$1 log masuk]</strong> atau <strong>[$2 membuka akaun]</strong>, suntingan anda akan diatribusikan kepada nama pengguna anda di samping manfaat-manfaat lain.",
        "anonpreviewwarning": "''Anda belum log masuk. Jika anda menyimpan laman ini, alamat IP anda akan direkodkan dalam sejarah penyuntingan laman ini.''",
        "missingsummary": "'''Peringatan:''' Anda tidak menyatakan ringkasan suntingan. Klik '''Simpan''' sekali lagi untuk menyimpan suntingan ini tanpa ringkasan.",
-       "selfredirect": "<strong>Amaran:</strong> Anda sedang melencongkan laman ini kepada dirinya sendiri.\nMungkin anda telah menyatakan sasaran yang salah untuk lencongan ini ataupun sedang tersalah menyunting halaman.\nJika anda mengklik \"{{int:savearticle}}\" semula, maka lencongan tetap akan dihasilkan.",
+       "selfredirect": "<strong>Amaran:</strong> Anda sedang melencongkan laman ini kepada dirinya sendiri.\nMungkin anda telah menyatakan sasaran yang salah untuk lencongan ini ataupun sedang tersalah menyunting halaman.\nJika anda mengklik \"$1\" semula, maka lencongan tetap akan dihasilkan.",
        "missingcommenttext": "Sila masukkan komen dalam ruangan di bawah.",
-       "missingcommentheader": "<strong>Peringatan:</strong> Anda belum menyatakan tajuk perkara bagi komen ini.\nJika anda klik '''{{int:savearticle}}''' sekali lagi, suntingan anda akan tersimpan tanpa tajuk.",
+       "missingcommentheader": "<strong>Peringatan:</strong> Anda belum menyatakan tajuk perkara bagi komen ini.\nJika anda klik '''$1''' sekali lagi, suntingan anda akan tersimpan tanpa tajuk.",
        "summary-preview": "Pralihat ringkasan:",
        "subject-preview": "Pralihat perkara:",
        "previewerrortext": "Ralat berlaku ketika cuba mempratayangkan hasil suntingan anda.",
        "editingsection": "Menyunting $1 (bahagian)",
        "editingcomment": "Menyunting $1 (bahagian baru)",
        "editconflict": "Percanggahan penyuntingan: $1",
-       "explainconflict": "Pengguna lain telah menyunting laman ini ketika anda sedang menyuntingnya.\nKawasan teks di atas mengandungi teks semasa.\nPerubahan anda dipaparkan dalam kawasan teks di bawah.\nAnda perlu menggabungkan perubahan anda dengan teks semasa.\n'''Hanya''' teks dalam kawasan teks di atas akan disimpan jika anda menekan \"{{int:savearticle}}\".",
+       "explainconflict": "Pengguna lain telah menyunting laman ini ketika anda sedang menyuntingnya.\nKawasan teks di atas mengandungi teks semasa.\nPerubahan anda dipaparkan dalam kawasan teks di bawah.\nAnda perlu menggabungkan perubahan anda dengan teks semasa.\n'''Hanya''' teks dalam kawasan teks di atas akan disimpan jika anda menekan \"$1\".",
        "yourtext": "Teks anda",
        "storedversion": "Versi yang disimpan",
        "nonunicodebrowser": "'''AMARAN: Pelayar anda tidak mematuhi Unicode. Aksara-aksara bukan ASCII akan dipaparkan dalam kotak sunting sebagai kod perenambelasan.'''",
        "userrights-lookup-user": "Urus kumpulan pengguna",
        "userrights-user-editname": "Masukkan nama pengguna:",
        "editusergroup": "Sunting Kumpulan Pengguna",
-       "editinguser": "Mengubah hak {{GENDER:$1|pengguna}} <strong>[[User:$1|$1]]</strong> $2",
+       "editinguser": "Mengubah hak {{GENDER:$1|pengguna}} bagi <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Melihat hak {{GENDER:$1|pengguna}} bagi <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Ubah kumpulan pengguna",
        "saveusergroups": "Simpan Kumpulan Pengguna",
        "userrights-groupsmember": "Ahli bagi:",
        "right-editsemiprotected": "Menyunting halaman-halaman yang dilindungi sebagai \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Menyunting model kandungan laman",
        "right-editinterface": "Menyunting antara muka pengguna",
-       "right-editusercssjs": "Menyunting fail CSS dan JavaScript pengguna lain",
        "right-editusercss": "Menyunting fail CSS pengguna lain",
        "right-edituserjs": "Menyunting fail JavaScript pengguna lain",
        "right-editmyusercss": "Menyunting fail CSS pengguna sendiri",
        "rcshowhidecategorization": "$1 pengkategorian laman",
        "rcshowhidecategorization-show": "Paparkan",
        "rcshowhidecategorization-hide": "Sorokkan",
-       "rclinks": "Paparkan $1 perubahan terakhir sejak $2 hari yang lalu<br />$3",
+       "rclinks": "Paparkan $1 perubahan terakhir sejak $2 hari yang lalu",
        "diff": "beza",
        "hist": "sej",
        "hide": "Sorokkan",
        "undeleteviewlink": "papar",
        "undeleteinvert": "Kecualikan pilihan",
        "undeletecomment": "Sebab:",
-       "undeletedrevisions": "$1 semakan dipulihkan",
-       "undeletedrevisions-files": "$1 semakan dan $2 fail dipulihkan",
-       "undeletedfiles": "$1 fail dipulihkan",
        "cannotundelete": "Penyahhapusan gagal: $1",
        "undeletedpage": "'''$1 telah dipulihkan'''\n\nSila rujuk [[Special:Log/delete|log penghapusan]] untuk rekod penghapusan terkini.",
        "undelete-header": "Lihat [[Special:Log/delete|log penghapusan]] untuk laman-laman yang baru dihapuskan.",
        "logentry-tag-update-revision": "$1 telah {{GENDER:$2|mengemaskinikan}} teg-teg pada semakan $4 pada $3 ({{PLURAL:$7|menambahkan}} $6; {{PLURAL:$9|menggugurkan}} $8)",
        "logentry-tag-update-logentry": "$1 telah {{GENDER:$2|mengemaskinikan}} teg-teg pada entri log $5 bagi laman $3 ({{PLURAL:$7|menambahkan}} $6; {{PLURAL:$9|menggugurkan}} $8)",
        "rightsnone": "(tiada)",
-       "revdelete-summary": "ringkasan",
        "feedback-adding": "Maklum balas sedang diisikan ke dalam laman...",
        "feedback-back": "Kembali",
        "feedback-bugcheck": "Bagus! Cuma pastikan itu bukan salah satu [$1 pepijat] yang sedia diketahui.",
index 4166acc..5ec3a73 100644 (file)
        "externaldberror": "Kien hemm problema esterna ta' awtentiċitá jew m'għandhekx permess neċċessarju sabiex tagħmel aġġornamenti fuq l-aċċess estern.",
        "login": "Idħol",
        "nav-login-createaccount": "Idħol / Oħloq kont",
-       "userlogin": "Idħol jew oħloq kont ġdid",
-       "userloginnocreate": "Idħol",
        "logout": "Oħroġ",
        "userlogout": "oħroġ",
        "notloggedin": "Għadek ma dħaltx ġewwa",
        "userlogin-noaccount": "M'għandekx kont?",
        "userlogin-joinproject": "Irreġistra fuq {{SITENAME}}",
-       "nologin": "Għad m'għandekx kont? '''$1'''.",
-       "nologinlink": "Oħloq kont",
        "createaccount": "Oħloq kont",
-       "gotaccount": "Diġa għandhek kont? '''$1'''.",
-       "gotaccountlink": "Idħol",
-       "userlogin-resetlink": "Insejt kif tidħol fil-kont tiegħek?",
        "userlogin-resetpassword-link": "Insejt il-kelma tad-dħul (password)?",
        "userlogin-helplink2": "Għajnuna biex tidħol fil-kont",
        "userlogin-loggedin": "Diġà dħalt fil-kont bħala {{GENDER:$1|$1}}.\nUża l-formola t'hawn taħt biex tidħol bħala utent ieħor",
        "createacct-another-email-ph": "Daħħal l-indirizz elettroniku",
        "createaccountmail": "Uża kelma tad-dħul temporanja li tkun u ibgħatha lill-indirizz elettroniku speċifikat",
        "createacct-realname": "Isem proprju (fakultattiv)",
-       "createaccountreason": "Raġuni:",
        "createacct-reason": "Raġuni",
        "createacct-reason-ph": "Għala qiegħed toħloq kont ġdid",
        "createacct-submit": "Oħloq il-kont",
        "preview": "Dehra proviżorja",
        "showpreview": "Dehra proviżorja",
        "showdiff": "Uri t-tibdiliet",
-       "blankarticle": "<strong>Attenzjoni:</strong> Il-paġna li qed toħloq vojta.\nMeta terġa' tikklikkja fuq \"{{int:savearticle}}\", il-paġna tinħoloq bla ebda kontenut.",
+       "blankarticle": "<strong>Attenzjoni:</strong> Il-paġna li qed toħloq vojta.\nMeta terġa' tikklikkja fuq \"$1\", il-paġna tinħoloq bla ebda kontenut.",
        "anoneditwarning": "'''Attenzjoni:''' Ma dħaltx f'kontok.\nL-indirizz tal-IP tiegħek se jkun jidher pubblikament meta tagħmel xi modifika. Jekk <strong>[$1 tidħol f'kontok]</strong> jew <strong>[$2 toħloq kont]</strong>, il-modifiki li tagħmel jiġu attribwiti lill-ismek ta' utent, flimkien ma benefiċċji oħra.",
        "anonpreviewwarning": "''Bħalissa mintix fil-kont tiegħek. Jekk issalva xi modifiki tiegħek, fil-kronoloġija tal-paġna se jiġi reġistrat l-indirizz IP tiegħek.''",
        "missingsummary": "'''Twissija:''' Ma pprovdejt l-ebda taqsira dwar il-modifika.\nJekk terġa' tagħfas Modifika, l-modifika se tiġi salvata mingħajr waħda.",
        "missingcommenttext": "Jekk jogħġbok ħalli kumment hawn taħt.",
-       "missingcommentheader": "'''Twissija:''' Ma ġie speċifikat l-ebda suġġett/titlu għal dan il-kumment.\nJekk terġa' tagħfas \"{{int:savearticle}}\", il-modifika tiegħek se tiġi salvata mingħajr wieħed.",
+       "missingcommentheader": "'''Twissija:''' Ma ġie speċifikat l-ebda suġġett/titlu għal dan il-kumment.\nJekk terġa' tagħfas \"$1\", il-modifika tiegħek se tiġi salvata mingħajr wieħed.",
        "summary-preview": "Dehra proviżorja tat-taqsira:",
        "subject-preview": "Dehra proviżorja tat-taqsira/suġġett:",
        "blockedtitle": "L-utent ġie bblokkjat",
        "editingsection": "Modifika ta' $1 (sezzjoni)",
        "editingcomment": "Qed jiġi editjat $1 (sezzjoni ġdida)",
        "editconflict": "Kunflitt t'editjar: $1",
-       "explainconflict": "Utent ieħor biddel il-paġna meta inti kont qiegħed tagħmel il-modifiki tiegħek.\nIl-kaxxa tal-modifika ta' fuq turi t-test tal-paġna kif inhu bħalissa.\nIl-bidliet li għamilt huma fin-naħa t'isfel.\nJekk trid il-modifiki tiegħek jiġu salvati, hemm bżonn li tgħaqqad il-modifiki personali ma' dawk eżistenti (fil-kaxxa ta' fuq)\nMeta tagħfas il-buttuna \"{{int:savearticle}}\", se jiġi salvat '''biss''' it-test li jinsab fil-kaxxa tal-modifika ta' fuq.",
+       "explainconflict": "Utent ieħor biddel il-paġna meta inti kont qiegħed tagħmel il-modifiki tiegħek.\nIl-kaxxa tal-modifika ta' fuq turi t-test tal-paġna kif inhu bħalissa.\nIl-bidliet li għamilt huma fin-naħa t'isfel.\nJekk trid il-modifiki tiegħek jiġu salvati, hemm bżonn li tgħaqqad il-modifiki personali ma' dawk eżistenti (fil-kaxxa ta' fuq)\nMeta tagħfas il-buttuna \"$1\", se jiġi salvat '''biss''' it-test li jinsab fil-kaxxa tal-modifika ta' fuq.",
        "yourtext": "It-test tiegħek",
        "storedversion": "Il-verżjoni maħżuna",
        "nonunicodebrowser": "'''TWISSIJA: Il-Browser tiegħek m'għandux sapport għal unicode.\nHemm xogħol sabiex iħallik tagħmel modifiki lil paġni mingħajr periklu ta' xejn: karratri li m'humiex ASCII se jidhru fil-kaxxa tal-modifika bħala kodiċi hexadeċimali.'''",
        "right-editprotected": "Modifika paġni protetti",
        "right-editcontentmodel": "Jimmodifika l-mudell ta' kontenut ta' paġna",
        "right-editinterface": "Immodifika l-interfaċċa tal-utent",
-       "right-editusercssjs": "Modifika l-fajls CSS u JS ta' utenti oħrajn",
        "right-editusercss": "Modifika l-fajls CSS ta' utenti oħrajn",
        "right-edituserjs": "Modifika l-fajls JS ta' utenti oħrajn",
        "right-editmyusercss": "Immodifika l-fajls tas-CSS personali",
        "rcshowhidemine": "$1 modifiki tiegħi",
        "rcshowhidemine-show": "Uri",
        "rcshowhidemine-hide": "Aħbi",
-       "rclinks": "Uri l-aħħar $1 modifiki fl-aħħar $2 ġranet<br />$3",
+       "rclinks": "Uri l-aħħar $1 modifiki fl-aħħar $2 ġranet",
        "diff": "diff",
        "hist": "kron",
        "hide": "Aħbi",
        "undeleteviewlink": "uri",
        "undeleteinvert": "Inverti s-selezzjoni",
        "undeletecomment": "Raġuni:",
-       "undeletedrevisions": "{{PLURAL:$1|reviżjoni irkuprata|$1 reviżjonijiet irkuprati}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|reviżjoni waħda|$1 reviżjonijiet}} u {{PLURAL:$2|fajl wieħed irkuprat|$2 fajls irkuprati}}",
-       "undeletedfiles": "{{PLURAL:$1|file wieħed|$1 fajls}} irkuprati",
        "cannotundelete": "L-irkuprar ma rnexxiex:\n$1",
        "undeletedpage": "'''$1 ġie irkuprat'''\n\nIkkonsulta r-[[Special:Log/delete|reġistru tat-tħassir]] biex tara t-tħassir u l-irkuprar ta' paġni l-aktar riċenti.",
        "undelete-header": "Ara r-[[Special:Log/delete|reġistru tat-tħassir]] għal paġni mħassra riċentament.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|aġġorna|aġġornat}} it-tikketti tar-reviżjoni $4 tal-paġna $3 ({{PLURAL:$7|miżjuda}} $6; {{PLURAL:$9|imneħħija}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|aġġorna|aġġornat}} it-tikketti tad-daħla fir-reġistru $5 tal-paġna $3 ({{PLURAL:$7|miżjuda}} $6; {{PLURAL:$9|imneħħija}} $8)",
        "rightsnone": "(xejn)",
-       "revdelete-summary": "Taqsira tal-modifika",
        "feedback-adding": "Qed jiżdied ir-rispons lil din il-paġna...",
        "feedback-back": "Lura",
        "feedback-bugcheck": "Tajjeb ħafna! Ivverifika li mhux diġà fost id-[$1 difetti magħrufa].",
index 41c6a59..472130a 100644 (file)
        "yourdomainname": "L tou domínio",
        "login": "Antrar",
        "nav-login-createaccount": "Antrar / criar cuonta",
-       "userlogin": "Antrar / criar cuonta",
        "logout": "Salir",
        "userlogout": "Salir",
        "notloggedin": "Por outenticar",
-       "nologin": "Nun tenes ua cuonta? '''$1'''.",
-       "nologinlink": "Criar ua cuonta",
        "createaccount": "Criar nuoba cuonta",
-       "gotaccount": "Yá tenes ua cuonta? '''$1'''.",
-       "gotaccountlink": "Antrar",
        "createaccountmail": "por morada eiletrónica",
        "loginerror": "Erro de outenticaçon",
        "loginsuccesstitle": "Antreste cumo debe de ser",
        "prefs-rc": "Redadeiras alteraçones",
        "saveprefs": "Grabar",
        "prefs-editing": "Oupçones de eidiçon",
-       "rows": "Lhinhas:",
        "servertime": "Hora de l serbidor:",
        "timezoneregion-africa": "África",
        "timezoneregion-america": "América",
        "rcshowhideanons": "$1 outelizadores anónimos",
        "rcshowhidepatr": "$1 eidiçones patrulhadas",
        "rcshowhidemine": "$1 mies eidiçones",
-       "rclinks": "Amostrar las redadeiras $1 altaraçones ne ls redadeiros $2 dies<br />$3",
+       "rclinks": "Amostrar las redadeiras $1 altaraçones ne ls redadeiros $2 dies",
        "diff": "defr",
        "hist": "stór",
        "hide": "Scunder",
index 1555a31..f10cdb6 100644 (file)
@@ -23,7 +23,8 @@
                        "9.sinistra",
                        "Ninjastrikers",
                        "Penguinlay",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "လင့်ကို မျဉ်းသားသည့် ပုံစံ -",
        "view": "ကြည့်ရန်",
        "view-foreign": "$1 တွင် ကြည့်ရန်",
        "edit": "ပြင်ဆင်ရန်",
+       "edit-local": "ဒေသတွင်း ဖော်ပြချက် ပြင်ဆင်ရန်",
        "create": "စတင်ရေးသားရန်",
        "create-local": "ဒေသတွင်း ဖော်ပြချက် ထည့်ရန်",
        "editthispage": "ဤစာမျက်နှာကို ပြင်ရန်",
        "protectedpagetext": "ဤစာမျက်နှာအား တည်းဖြတ်ခြင်းနှင့် အခြားလုပ်ဆောင်မှုများ မလုပ်ဆောင်နိုင်အောင် ကာကွယ်ထားသည်။",
        "viewsourcetext": "ဤစာမျက်နှာ၏ ရင်းမြစ်ကို ကြည့်ရှု၍ ကူးယူနိုင်သည်။",
        "viewyourtext": "ဤစာမျက်နှာရှိ <strong>သင့်တည်းဖြတ်မှုများ</strong>၏ ရင်းမြစ်ကို ကြည့်ရှုပြီး ကူးယူနိုင်သည်။",
+       "editinginterface": "<strong>သတိပေးချက်။</strong> သင်သည် ဆော့ဖ်ဝဲလ်၏ အသွင်အပြင်စာသားများကို အထောက်အကူပြုရာတွင် သုံးသော စာမျက်နှာအား တည်းဖြတ်နေသည်။\nဤစာမျက်နှာတွင် ပြောင်းလဲမှုများသည် ဤဝီကီရှိ အခြားအသုံးပြုသူများ၏ အသုံးပြုသူ အသွင်အပြင်များအပေါ် အကျိုးသက်ရောက်ပါလိမ့်မည်။",
        "namespaceprotected": "'''$1''' စာညွှန်းဖြင့် စာမျက်နှာကို တည်းဖြတ်ရန် ခွင့်ပြုချက် မရှိပါ။",
        "mycustomcssprotected": "ဤ CSS စာမျက်နှာကို သင်တည်းဖြတ်ပြင်ဆင်ခွင့် မရှိပါ။",
        "mycustomjsprotected": "ဤ JavaScript စာမျက်နှာကို သင်တည်းဖြတ်ပြင်ဆင်ခွင့် မရှိပါ။",
        "password-change-forbidden": "ဤဝီကီတွင် စကားဝှက်များကို ပြောင်းလဲ၍ မရပါ။",
        "login": "Log in ဝင်ရန်",
        "nav-login-createaccount": "Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန်",
-       "userlogin": "Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန်",
-       "userloginnocreate": "Log in ဝင်ရန်",
        "logout": "ထွက်ရန်",
        "userlogout": "ထွက်ရန်",
        "notloggedin": "log in ဝင်မထားပါ",
        "userlogin-noaccount": "အကောင့် မရှိဘူးလား?",
        "userlogin-joinproject": "{{SITENAME}} ကို ချိတ်ဆက်ရန်",
-       "nologin": "အကောင့်မရှိဘဲ ဖြစ်နေပါသလား။ $1။",
-       "nologinlink": "အကောင့်တစ်ခု ဖန်တီးရန်",
        "createaccount": "အကောင့် ဖန်တီးရန်",
-       "gotaccount": "အကောင့်ရှိပြီးသားလား။ $1။",
-       "gotaccountlink": "Log in ဝင်ရန်",
-       "userlogin-resetlink": "Login ဝင်သည့် အသေးစိတ်တို့ကို မေ့သွားပါသလား?",
        "userlogin-resetpassword-link": "စကားဝှက် မေ့နေသလား?",
        "userlogin-helplink2": "log in အကူအညီ",
        "userlogin-loggedin": "သင်သည် {{GENDER:$1|$1}} အနေဖြင့် လော့အင်ဝင်ထားပြီး ဖြစ်သည်။ အခြားအသုံးပြုသူ အနေဖြင့် ဝင်ရောက်ရန် အောက်ပါပုံစံကို အသုံးပြုပါ။",
        "createacct-another-email-ph": "အီးမေး လိပ်စာ ရိုက်ထည့်ပါ",
        "createaccountmail": "ယာယီ ကျပန်းစကားဝှက်ကို သီးသန့် အီးမေးလ်လိပ်စာသို့ ပေးပို့အသုံးပြုရန်",
        "createacct-realname": "နာမည်ရင်း (ဖြည့်လိုက)",
-       "createaccountreason": "အ​ကြောင်း​ပြ​ချက် -",
        "createacct-reason": "အကြောင်းပြချက်",
        "createacct-reason-ph": "သင်ဘာကြောင့် အခြားအကောင့် ဖန်တီးချင်တာလဲ",
        "createacct-submit": "သင့်အကောင့်ကို ဖန်တီးရန်",
        "post-expand-template-argument-warning": "'''သတိပေးချက် -''' ဤစာမျက်နှာတွင် ပမာဏအားဖြင့် ကြီးမားကျယ်ပြန့်သော template argument တစ်ခုပါဝင်သည်။\nယင်း arguments များကို ဖယ်ထုတ်လိုက်သည်။",
        "post-expand-template-argument-category": "ဖယ်ထုတ်ထားသော template arguments များပါဝင်သည့် စာမျက်နှာများ",
        "parser-template-loop-warning": "တမ်းပလိတ်များ လှည့်ပတ်ဆက်စပ် နေသည်ကို တွေ့ရသည်။ [[$1]]",
-       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ဆွေးနွေး]]) ၏ $1 ပြင်ဆင်ချက် $1 ကို ပြန်လည်ပယ်ဖျက်လိုက်သည်",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ဆွေးနွေး]]) ၏ တည်းဖြတ်မူ $1 ကို ပြန်လည်ပယ်ဖျက်လိုက်သည်",
        "viewpagelogs": "ဤစာမျက်နှာအတွက် မှတ်တမ်းများကို ကြည့်ရန်",
        "nohistory": "ဤစာမျက်နှာတွင် တည်းဖြတ်မှု ရာဇဝင်မရှိပါ",
        "currentrev": "နောက်ဆုံးမူ",
        "rcshowhidecategorization": "စာမျက်နှာ ကဏ္ဍထည့်သွင်းခြင်း $1ရန်",
        "rcshowhidecategorization-show": "ပြ",
        "rcshowhidecategorization-hide": "ဝှက်",
-       "rclinks": "$2 ရက်အတွင်းမှ နောက်ဆုံးပြင်ဆင်ချက် $1 ခုကို ပြရန်</br> $3",
+       "rclinks": "$2 ရက်အတွင်းမှ နောက်ဆုံးပြင်ဆင်ချက် $1 ခုကို ပြရန်",
        "diff": "ကွဲပြားမှု",
        "hist": "မှတ်တမ်း",
        "hide": "ဝှက်",
        "undeleteviewlink": "ကြည့်ရန်",
        "undeleteinvert": "ရွေးချယ်ထားခြင်းကို ပြောင်းပြန်လှန်ရန်",
        "undeletecomment": "အ​ကြောင်း​ပြ​ချက် -",
-       "undeletedrevisions": "{{PLURAL:$1|မူတစ်ခု|မူ $1 ခု}} ကိုပြန်လည် ထိန်းသိမ်းပြီး",
        "undelete-search-box": "ဖျက်ပစ်သည့် စာမျက်နှာများမှ ရှာရန်",
        "undelete-search-submit": "ရှာဖွေရန်",
        "undelete-show-file-submit": "မှန်",
        "logentry-move-move": "$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-move-move_redir-noredirect": "$3 á\80\99á\80¾ $4 á\80\9eá\80­á\80¯á\80· á\80\95á\80¼á\80\94á\80ºá\80\8aá\80½á\80¾á\80\94á\80ºá\80¸á\80\95á\80±á\80«á\80ºá\80\91á\80\95á\80ºá\80¡á\80¯á\80\95á\80ºá\80\80á\80¬ á\80\95á\80¼á\80\94á\80ºá\80\8aá\80½á\80¾á\80\94á\80ºá\80¸á\80\81á\80»á\80\94á\80ºá\80\99á\80\91á\80¬á\80¸á\80\98á\80² $1 á\80\80 {{GENDER:$2|á\80\9bá\80½á\80¾á\80±á\80·á\80\81á\80²á\80·á\80\9eá\80\8aá\80º}}",
        "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": "{{SITENAME}} တွင် ရှာဖွေရန်",
        "api-error-unknown-warning": "အမည်မသိ သတိပေးချက် - $1",
        "pagelanguage": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
index 2a102ec..726c901 100644 (file)
        "password-change-forbidden": "Те викисэнть а полавтсак салававалот.",
        "login": "Совамо",
        "nav-login-createaccount": "Совамо / тейть совамотарка",
-       "userlogin": "Совамо / тейть совамотарка",
-       "userloginnocreate": "Совамо",
        "logout": "Лисеме",
        "userlogout": "Лисеме",
        "notloggedin": "Апак соваво",
        "userlogin-noaccount": "Совамотаркат арась?",
        "userlogin-joinproject": "Совак «{{SITENAME}}» сайтэнь теицякс",
-       "nologin": "Совамотаркат арась? '''$1'''.",
-       "nologinlink": "Тейть совамотарка",
        "createaccount": "Теемс теицянь од лопа",
-       "gotaccount": "Совамотаркат ули? '''$1'''.",
-       "gotaccountlink": "Совамс",
-       "userlogin-resetlink": "Совамо эрявикстнэнь стувтыть?",
        "userlogin-resetpassword-link": "Салававалот стувтовсь?",
        "userlogin-createanother": "Шкак од совамотарка",
        "createaccountmail": "Тейть кодамо понгсь салававал, кучик сонзэ ало максозь е-сёрмапаргонтень",
-       "createaccountreason": "Тувталось:",
        "createacct-reason": "Тувтал",
        "createacct-submit": "Шкик совамотаркат",
        "createacct-another-submit": "Шкак од совамотарка",
        "saveprefs": "Ванстомс",
        "restoreprefs": "Велявтомс мекев весе ушодкс ладсематнень (весе явкстнэва)",
        "prefs-editing": "Витнема-петнема",
-       "rows": "Валчилькстнэ (строкатне):",
-       "columns": "Палманть:",
        "searchresultshead": "Вешнема",
        "recentchangesdays": "Зяро чить невтемс чиень полавтнематнесэ-лиякстомтоматнесэ:",
        "recentchangesdays-max": "Весемеде куватьс $1 {{PLURAL:$1|чис|чис}}",
        "right-block": "Кардамс лия совийтнень-лисийтнень витнемадо-петнемадо",
        "right-blockemail": "Кардамс лия лисийтнень-совийтнень е-сёрмань кучомадо",
        "right-editinterface": "Витнемс-петнемс теицянь интерчаманть (васодема ёжонть)",
-       "right-editusercssjs": "Витнемс-петнемс лия теицятнень CSS ды JS файласт",
        "right-editusercss": "Витнемс-петнемс лия теицятнень CSS файласт",
        "right-edituserjs": "Витнемс-петнемс лия теицятнень JS файласт",
        "right-import": "Ёвкстамс лия Викистэ лопат",
        "right-mergehistory": "Вейсэндямс лопатнень юрост-путовксост",
        "right-userrights": "Витнемс-петнемс совицянь весе видечитнень",
        "right-siteadmin": "Датабазань сёлгомо ды панжомо",
-       "right-passwordreset": "Ваномс теицянь салава валонь полавтома е-сёрмат",
        "newuserlogpage": "Теицянь шкамодо-теемадо конёв",
        "newuserlogpagetext": "Те теицянь шкавксто журнал",
        "rightslog": "Уськетеицянть видечинть кемекстома",
        "rcshowhidemine": "$1 мезе мон витнинь-петнинь",
        "rcshowhidemine-show": "Невтемс",
        "rcshowhidemine-hide": "Кекшемс",
-       "rclinks": "Невтемс меельце $1 полавтнемат меельце $2 чинь перть<br />$3",
+       "rclinks": "Невтемс меельце $1 полавтнемат меельце $2 чинь перть",
        "diff": "кадовикс",
        "hist": "ист",
        "hide": "Кекшемс",
        "undeleteviewlink": "ваномс",
        "undeleteinvert": "Кочказень таркас апаконь кочкамо",
        "undeletecomment": "Тувталось:",
-       "undeletedrevisions": "{{PLURAL:$1|1 лиякстомтома|$1 лиякстомтомат}} вельмевтезь",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 лиякстомтома|$1 лиякстомтомат}} ды {{PLURAL:$2|1 файла|$2 файлат}} вельмевтезь",
-       "undeletedfiles": "{{PLURAL:$1|1 файла|$1 файлат}} вельмевтезь",
        "undelete-search-box": "Вешнемс нардазь лопатнень ютксто",
        "undelete-search-prefix": "Невтемс лопат тестэ саезь:",
        "undelete-search-submit": "Вешнемс",
        "htmlform-reset": "Саемс мекев полавтоматнень",
        "htmlform-selectorother-other": "Лия",
        "rightsnone": "(арасть)",
-       "revdelete-summary": "витнемадо-петнемадо нурькине йовтавкс",
        "feedback-cancel": "А теемс",
        "feedback-close": "Анок",
        "feedback-message": "Пачтямнэсь:",
        "feedback-subject": "Мезде:",
        "searchsuggest-search": "Вешнемс",
-       "api-error-filename-tooshort": "Керьмазлементь а саты кувалмозо",
-       "api-error-illegal-filename": "Керьмазлемесь а маштови.",
        "api-error-unknownerror": "Апак содань ильведевкс: «$1».",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секундат}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минутат}}",
index ecff7b5..056c244 100644 (file)
        "yourdomainname": "Moāxcāyō",
        "login": "Xicalaqui",
        "nav-login-createaccount": "Ximocalaqui / ximomachiyōmaca",
-       "userlogin": "Ximomachiyomaca/Ximocalaqui",
-       "userloginnocreate": "Ximocalaqui",
        "logout": "Xiquīza",
        "userlogout": "Xiquīza",
        "notloggedin": "Ahmō ōtimocalac",
        "userlogin-noaccount": "Cuix ahmo titlapohualeh?",
-       "nologin": "Cuix ahmō titlapōhualeh? $1.",
-       "nologinlink": "Xicchīhua cē tlapōhualli",
        "createaccount": "Xicchīhua tlapōhualli",
-       "gotaccount": "¿Ye ticpiya cē tlapōhualli? '''$1'''.",
-       "gotaccountlink": "Ximocalaqui",
        "createacct-email-ph": "xiquihcuilo mocorreo electrónico",
        "createaccountmail": "Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō in tiquēhualtīz in maltzinteyōtl monetitlanizyeyān",
-       "createaccountreason": "Tleipampa:",
        "createacct-reason": "Tleīpampa",
        "createacct-submit": "Xicchīhua in motlapōhual",
        "badretype": "Ahneneuhqui motlahtōlichtacāyo.",
        "rcshowhidepatr": "$1 tlapatlaliztli mochiyahua",
        "rcshowhidemine": "$1 notlahcuilol",
        "rcshowhidemine-show": "Xicnexti",
-       "rclinks": "Xiquitta yancuic $1 tlapatlaliztli yancuic $2 tonalpan.<br />$3",
+       "rclinks": "Xiquitta yancuic $1 tlapatlaliztli yancuic $2 tonalpan.",
        "diff": "ahneneuhqui",
        "hist": "tlahtollotl",
        "hide": "Tictlatiz",
        "blankpage": "Iztāc zāzanilli",
        "htmlform-selectorother-other": "Occe",
        "rightsnone": "ahtlein",
-       "revdelete-summary": "ticpatlāz tlahcuilōltōn",
        "searchsuggest-search": "Tlatemoliztli",
        "api-error-stashfailed": "Tlâtek îtlakawilistli: In tlatèmakani awel òkeuh in èwalpanòni.",
        "api-error-unknown-warning": "Âmò ìxmatkàyo tlanawatilistli: \"$1\".",
index ef4d79c..3ebaae2 100644 (file)
@@ -8,7 +8,8 @@
                        "唐吉訶德的侍從",
                        "Luuva",
                        "Macofe",
-                       "進也"
+                       "進也",
+                       "Liuxinyu970226"
                ]
        },
        "tog-underline": "Liân-kiat oē té-sûn:",
@@ -36,7 +37,7 @@
        "tog-enotifminoredits": "Sió pian-chi̍p mā kià tiān-tsú-phue hōo guá.",
        "tog-enotifrevealaddr": "Hō͘ pat-lâng khoàⁿ ê tio̍h oá ê tiān-chú-phoe tē-chí",
        "tog-shownumberswatching": "Hián-sī tng leh khoàⁿ ê iōng-chiá sò͘-bo̍k",
-       "tog-oldsig": "Chit-má ê chhiam-miâ:",
+       "tog-oldsig": "Lí kì-sêng ê chhiam-miâ:",
        "tog-fancysig": "共我的簽名當做文章文字,(無需要自動連結)",
        "tog-uselivepreview": "Ēng sui khoàⁿ-māi",
        "tog-forceeditsummary": "Pian-chi̍p khài-iàu bô thiⁿ ê sî-chūn, kā goá thê-chhéⁿ",
@@ -51,9 +52,9 @@
        "tog-ccmeonemails": "Kià hō͘ pa̍t-lâng ê email sūn-soà kià copy hō͘ goá",
        "tog-diffonly": "Diff ē-pêng bián hián-sī ia̍h ê loē-iông",
        "tog-showhiddencats": "Hián-sī chhàng khí--lâi ê lūi-pia̍t",
-       "tog-norollbackdiff": "ká tńg-khí liáu bián-koán cheng-chha goā-chē",
+       "tog-norollbackdiff": "Ká tńg--khí liáu-āu mái tián-sī cheng-chha",
        "tog-useeditwarning": "Goá nā iáu-boē pó-chûn siu-kái--ê ia̍h tō thiàu khai, ài kā goá kóng.",
-       "tog-prefershttps": "我登入的時陣愛用安全連線",
+       "tog-prefershttps": "Teng-ji̍p ê sî lóng ēng an-choân liân-chiap",
        "underline-always": "Tiāⁿ-tio̍h",
        "underline-never": "Tiāⁿ-tio̍h mài",
        "underline-default": "Tòe liû-lám-khì ê siat-piān",
        "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-bih lūi-pia̍t",
        "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}}",
        "newwindow": "(ē khui sin thang-á hián-sī)",
        "cancel": "Chhú-siau",
        "moredotdotdot": "Iáu-ū",
-       "morenotlisted": "這毋是完整的表",
+       "morenotlisted": "Chit-ê lia̍t-toaⁿ khó-lêng iáu bô-chiâu",
        "mypage": "Ia̍h",
        "mytalk": "Thó-lūn",
        "anontalk": "Thó-lūn",
        "tagline": "Ùi {{SITENAME}}",
        "help": "Soat-bêng-su",
        "search": "Chhiau-chhoē",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Tī chhiau-chhōe tang-tiong m̄-chhap ê thâu-pō͘.\n# Tùi che ê piàn-keng ē tòe thâu-pō͘ hông sek-ín ê sî khai-sí chok-iōng.\n# Lí thang lī-ēng khang pian-chi̍p lâi kiông-chè ia̍h-bīn têng-sin sek-ín.\n# Àn-chiàu ē-té ê kù-hoat:\n#   * Só͘-ū tùi \"#\" khai-sí kàu jī-hâng bóe ê jī sī chi̍t-ê chù-kái.\n#   * Só͘-ū hui khang-pe̍h jī-hâng kui--ê tio̍h sī m̄ hông chhap ê tê-bo̍k, hâm tōa-sió-jī chāi-lāi ta̍k hāng lóng sī.\nChham-khó\nHiòng-gōa liân-kiat\nSiong-koan\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "Chhoē",
        "go": "Lâi-khì",
        "searcharticle": "Lâi-khì",
        "history": "Ia̍h le̍k-sú",
        "history_short": "le̍k-sú",
+       "history_small": "le̍k-sú",
        "updatedmarker": "Téng hoê goá lâi chiah liáu ū kái koè--ê",
        "printableversion": "Ìn-soat pán-pún",
        "permalink": "Éng-kiú liân-kiat",
        "talk": "Thó-lūn",
        "views": "Khoàⁿ",
        "toolbox": "Ke-si",
+       "tool-link-userrights": "Piàn-keng {{GENDER:$1|iōng-chiá}} hun-cho͘",
+       "tool-link-userrights-readonly": "Khòaⁿ {{GENDER:$1|iōng-chiá}} hun-cho͘",
+       "tool-link-emailuser": "Email hō͘ chit ūi {{GENDER:$1|iōng-chiá}}",
        "userpage": "Khoàⁿ iōng-chiá ê Ia̍h",
        "projectpage": "Khoàⁿ sū-kang ia̍h",
        "imagepage": "Khoàⁿ tóng-àn ia̍h",
        "title-invalid-empty": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k sī khang--ê he̍k-chiá kaⁿ-taⁿ hâm liáu miâ-khong-kan.",
        "title-invalid-utf8": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k hâm liáu bô chiàⁿ-khak ê 1 lia̍t UTF-8 ê jī.",
        "title-invalid-interwiki": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k pau-hâm liáu 1-ê bē-tàng ēng ùi tê-bo̍k ê interwiki liân-kiat.",
+       "title-invalid-talk-namespace": "Chhéng-kiû ê ia̍h-bīn tê-bo̍k chí-tēng liáu chi̍t phiⁿ bô hoat-tō͘ chûn-chāi ê thó-lūn-ia̍h.",
+       "title-invalid-characters": "Chhéng-kiû ê ia̍h-bīn tê-bo̍k hâm hâm bû-hāu ê bûn-jī: \"$1\".",
+       "title-invalid-relative": "Tê-bo̍k ū siong-tùi lō͘-kèng. Siong-tùi-sek ê ia̍h-bīn tê-bo̍k (./, ../) sī bû-hāu--ê, in-ūi iōng-chiá ê liû-lám-khì tiāⁿ thàng in bē kàu.",
+       "title-invalid-magic-tilde": "Chhéng-kiû ê ia̍h-bīn tê-bo̍k hâm bû-hāu ê mô͘-hoat tilde bûn-jī-lia̍t (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Chhéng-kiû ia̍h-bīn ê tê-bo̍k siuⁿ tn̂g. I ê UTF-8 pian-bé it-tēng bē-tàng tn̂g kòe $1 {{PLURAL:$1|byte}}.",
+       "title-invalid-leading-colon": "Chhéng-kiû ia̍h-bīn tê-bo̍k thâu hâm bû-hāu ê tōa-kù-tiám (:)",
        "perfcached": "Ē-kha ê chu-liāu tùi lâi--ê, só·-í bô it-tēng sī siōng sin ê. Tī khoài-chhûn-khu siōng chē ē-tàng khǹg{{PLURAL:$1| pit|$1 pit}} chu-liāu.",
        "perfcachedts": "Ē-kha ê chu-liāu tùi lâi--ê, tī $1 keng-sin--koè. Tī khoài-chûn-khu siōng chē ē-tàng khǹg {{PLURAL:$4|pit|$4 pit}} chu-liāu.",
        "querypage-no-updates": "Chit-má bē-sái kái chit ia̍h.\nChia ê chu-liāu bē-tàng sui tiông-sin chéng-lí.",
        "viewsource": "Khoàⁿ goân-sú lōe-iông",
        "viewsource-title": "Khoàⁿ \"$1\"--ê goân-sú lōe-iông",
        "actionthrottled": "Tōng-chok hông tóng leh.",
-       "actionthrottledtext": "Ūi-tio̍h thê-hông lah-sap ê chhú-tì,  lí ū hông hān-chè tī té sî-kan lāi chò siuⁿ chē pái chit ê tōng-chok,  taⁿ lí í-keng chhiau-koè hān-chè.\nChhiáⁿ tī kúi hun-cheng hāu chiah koh chhì.",
+       "actionthrottledtext": "Ūi tio̍h thê-hông lām-iōng, lí hông hān-chè tī té sî-kan lāi chò siuⁿ chē pái pún khoán tōng-chok, taⁿ lí í-keng chhiau-koè hān-chè.\nChhiáⁿ tī kúi hun-cheng āu chiah koh chhì.",
        "protectedpagetext": "Chit ia̍h hông só tiâu leh, bē pian-chi̍p tit, mā bē-tàng chò kî-thaⁿ oa̍h-tāng.",
        "viewsourcetext": "Lí ē-sái khoàⁿ ia̍h khó͘-pih chit ia̍h ê goân-sú loē-iông:",
        "viewyourtext": "你會使看<strong>你改的</strong>原始碼,並且khop去這頁:",
        "password-change-forbidden": "Tī chit--ê wiki, lí boē-tàng kái bi̍t-bé.",
        "externaldberror": "這可能是資料庫驗證錯誤,抑是無允准你改外部的口座。",
        "login": "Teng-ji̍p",
+       "login-security": "Khak-jīn lí ê sin-hūn",
        "nav-login-createaccount": "Teng-ji̍p / khui sin kháu-chō",
-       "userlogin": "Teng-ji̍p / khui sin kháu-chō",
-       "userloginnocreate": "Teng-ji̍p",
        "logout": "Teng-chhut",
        "userlogout": "Teng-chhut",
        "notloggedin": "Bô teng-ji̍p",
        "userlogin-noaccount": "Káⁿ bô kháu-chō?",
        "userlogin-joinproject": "Ka-ji̍p {{SITENAME}}",
-       "nologin": "Bô kháu-chō thang teng-ji̍p? $1",
-       "nologinlink": "Khui 1 ê kháu-chō",
        "createaccount": "Khui sin kháu-chō",
-       "gotaccount": "Í-keng ū kháu-chō? '''$1'''.",
-       "gotaccountlink": "Teng-ji̍p",
-       "userlogin-resetlink": "你敢袂記得你登入的資料?",
        "userlogin-resetpassword-link": "Bi̍t-bé boē-kì-tit?",
        "userlogin-helplink2": "Pang-chān goá teng-ji̍p",
        "userlogin-loggedin": "你已經用{{GENDER:$1|$1}}登入,用下跤的表,登入別个名。",
        "createacct-another-email-ph": "Phah lí--ê tiān-chú-phoe tē-chí",
        "createaccountmail": "Iōng chi̍t-ê lîm-sî loān-sò͘ sán-seng ê bi̍t-bé , kià khì goá chí-tēng ê tiān-chú-phoe tē-chí.",
        "createacct-realname": "真正的名",
-       "createaccountreason": "Lí-iû:",
        "createacct-reason": "理由:",
        "createacct-reason-ph": "為啥物你欲開一另外一个口座?",
        "createacct-submit": "Khui lí--ê kháu-chō",
-       "createacct-another-submit": "開另外一个口座",
+       "createacct-another-submit": "Chhòng-kiàn kháu-chō",
+       "createacct-continue-submit": "Kè-sio̍k kháu-chō chhòng-kiàn",
+       "createacct-another-continue-submit": "Kè-sio̍k kháu-chō chhòng-kiàn",
        "createacct-benefit-heading": "{{SITENAME}} sī uī tio̍h chhin-chhiūⁿ lí--ê lâng chiah lâi kiàn-li̍p--ê.",
-       "createacct-benefit-body1": "kái {{PLURAL:$1|pái|pái}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|ia̍h|ia̍h}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|pian-chi̍p}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|ia̍h}}",
        "createacct-benefit-body3": "choè-kīn {{PLURAL:$1|ê lâng ū kòng-hiàn|ê lâng ū kòng-hiàn}}",
        "badretype": "Lí su-ji̍p ê 2-cho· bi̍t-bé bô tùi.",
        "userexists": "Lí phah ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ lí iōng pa̍t-ê miâ.",
        "emailnotauthenticated": "Lí ê e-mail chū-chí iáu-bōe khak-jīn ū-hāu, só·-í ē--kha ê e-mail kong-lêng bē-ēng-tit.",
        "noemailprefs": "Tī lí ê siat-piān chí-tēng chi̍t ê tiān-chú-phoe tē-chí thang hō͘ chia ê kong-lêng ē-tàng ēng.",
        "emailconfirmlink": "Chhiáⁿ khak-jīn lí ê e-mail chū-chí ū-hāu",
+       "accountcreated": "Kháu-chō chhòng-kiàn goân-sêng",
+       "createaccount-title": "Ūi {{SITENAME}} khui kháu-chō",
        "loginlanguagelabel": "Gí-giân: $1",
        "pt-login": "Teng-ji̍p",
        "pt-login-button": "Teng-ji̍p",
        "oldpassword": "Kū bi̍t-bé:",
        "newpassword": "Sin bi̍t-bé:",
        "retypenew": "Têng phah sin bi̍t-bé:",
+       "botpasswords-label-appid": "Bot miâ-hō:",
+       "botpasswords-label-create": "Chhòng-kiàn",
+       "botpasswords-label-update": "Kái-sin",
+       "botpasswords-label-cancel": "Chhú-siau",
+       "botpasswords-label-delete": "Thâi-tiāu",
        "resetpass_forbidden": "Bi̍t-bé bē-sái piàn.",
        "resetpass-submit-loggedin": "Kái bi̍t-bé",
        "resetpass-submit-cancel": "Chhú-siau",
        "sig_tip": "Lí ê chhiam-miâ kap sî-kan ìn-á",
        "hr_tip": "Thán-pîⁿ-chōa (hàn leh ēng)",
        "summary": "Khài-iàu:",
-       "subject": "Tê-bo̍k/piau-tê:",
+       "subject": "Tê-bo̍k:",
        "minoredit": "Che sī sió siu-kái",
        "watchthis": "Kàm-sī chit ia̍h",
        "savearticle": "Pó-chûn chit ia̍h",
        "previewnote": "'''Thê-chhéⁿ lí che sī 1 bīn kiám-cha chho͘-phe ēng--ê \"seng-khoàⁿ-ia̍h\", iáu-bōe pó-chûn--khí-lâi!'''",
        "session_fail_preview": "'''Pháiⁿ-sè! Gún chiām-sî bô hoat-tō͘ chhú-lí lí ê pian-chi̍p (goân-in: \"phàng-kiàn sú-iōng kî-kan ê chu-liāu\"). Lô-hoân têng chhì khoàⁿ-māi. Ká-sú iû-goân bô-hāu, ē-sái teng-chhut koh-chài teng-ji̍p hoān-sè tō ē-tit kái-koat.'''",
        "editing": "Siu-kái $1",
+       "creating": "Chhòng-kiàn $1",
        "editingsection": "Pian-chi̍p $1 (section)",
        "editingcomment": "Teh pian-chi̍p $1 (lâu-oē)",
        "editconflict": "Siu-kái sio-chhiong: $1",
-       "explainconflict": "Ū lâng tī lí tng teh siu-kái pún-ia̍h ê sî-chūn oân-sêng kî-tha ê siu-kái.\nTéng-koân ê bûn-jī-keh hián-sī hiān-chhú-sî siōng sin ê lōe-iông.\nLí ê kái-piàn tī ē-kha ê bûn-jī-keh. Lí su-iàu chiōng lí chò ê kái-piàn kap siōng sin ê lōe-iông chéng-ha̍p.\n'''Kan-na''' téng-koân keh-á ê bûn-jī ē tī lí chhi̍h \"{{int:savearticle}}\" liáu-āu pó-chûn khí lâi.",
+       "explainconflict": "Ū lâng tī lí tng teh siu-kái pún-ia̍h ê sî-chūn oân-sêng kî-tha ê siu-kái.\nTéng-koân ê bûn-jī-keh hián-sī hiān-chhú-sî siōng sin ê lōe-iông.\nLí ê kái-piàn tī ē-kha ê bûn-jī-keh. Lí su-iàu chiōng lí chò ê kái-piàn kap siōng sin ê lōe-iông chéng-ha̍p.\n'''Kan-na''' téng-koân keh-á ê bûn-jī ē tī lí chhi̍h \"$1\" liáu-āu pó-chûn khí lâi.",
        "yourtext": "Lí ê bûn-jī",
        "storedversion": "Chu-liāu-khò· ê pán-pún",
        "editingold": "'''KÉNG-KÒ: Lí tng teh siu-kái chit ia̍h ê 1 ê kū siu-tēng-pún. Lí nā kā pó-chûn khí lâi, chit ê siu-tēng-pún sòa-āu ê jīm-hô kái-piàn ē bô khì.'''",
        "yourdiff": "Chha-pia̍t",
        "readonlywarning": "'''CHÙ-Ì: Chu-liāu-khò· taⁿ só tiâu leh thang pān î-siu khang-khòe, só·-í lí hiān-chú-sî bô thang pó-chûn jīn-hô phian-chi̍p hāng-bo̍k. Lí ē-sái kā siong-koan pō·-hūn tah--ji̍p-khì 1-ê bûn-jī tóng-àn pó-chûn, āu-chhiú chiah koh kè-sio̍k.'''",
        "protectedpagewarning": "'''KÉNG-KÒ: Pún ia̍h só tiâu leh. Kan-taⁿ ū hêng-chèng te̍k-koân ê iōng-chiá (sysop) ē-sái siu-kái.'''",
+       "semiprotectedpagewarning": "'''Chù-ì:''' Pún-ia̍h í-keng siū kàu pó-hō͘ , teng-ji̍p chiah ū hoat-tō͘ siu-kái.\nĒ-kha sī choè-kīn ê ji̍t-chì, ē-sái thê-kiong chham-khó:",
        "templatesused": "Chit ia̍h iōng {{PLURAL:$1| ê pang-bô·}} :",
        "templatesusedpreview": "Chit ê preview iōng chia ê pang-bô͘:",
        "templatesusedsection": "Chit ê section iōng chia ê pang-bô͘:",
        "search-nonefound": "Chhoē m̄ tio̍h",
        "powersearch-legend": "Kiám-sek",
        "preferences": "Siat-tēng",
-       "mypreferences": "Góa ê siat-tēng",
+       "mypreferences": "Siat-tēng",
        "prefs-skin": "Phôe",
        "skin-preview": "Chhì khoàⁿ",
        "datedefault": "Chhìn-chhái",
        "rcshowhidemine": "$1 góa ê pian-chi̍p",
        "rcshowhidemine-show": "hiàn",
        "rcshowhidemine-hide": "am",
-       "rclinks": "Hían-sī $2 ji̍t lāi siōng sin ê $1 hāng kái-piàn<br />$3",
+       "rclinks": "Hían-sī $2 ji̍t lāi siōng sin ê $1 hāng kái-piàn",
        "diff": "Cheng-chha",
        "hist": "ls",
        "hide": "am",
        "pager-newer-n": "khah sin ê $1 hāng",
        "pager-older-n": "khah kū ê $1 hāng",
        "booksources": "Tô͘-su chu-liāu",
+       "magiclink-tracking-rfc": "Sú-iōng RFC mô͘-hoat liân-kiat ê ia̍h",
+       "magiclink-tracking-pmid": "Sú-iōng PMID mô͘-hoat liân-kiat ê ia̍h",
+       "magiclink-tracking-isbn": "Sú-iōng ISBN mô͘-hoat liân-kiat ê ia̍h",
        "specialloguserlabel": "做的人:",
        "speciallogtitlelabel": "目地(標題抑是用者)",
        "log": "記錄",
        "emailsent": "E-mail sàng chhut-khì ah",
        "emailsenttext": "Lí ê e-mail í-keng sàng chhut-khì ah.",
        "watchlist": "Góa ê kàm-sī-toaⁿ",
-       "mywatchlist": "Góa ê kàm-sī-toaⁿ",
+       "mywatchlist": "Kam-sī-toaⁿ",
        "watchlistfor2": "予$1 $2",
        "nowatchlist": "Lí ê kàm-sī-toaⁿ bô pòaⁿ hāng.",
        "watchnologin": "Bô teng-ji̍p",
        "prot_1movedto2": "[[$1]] sóa khì tī [[$2]]",
        "protect-legend": "Khak-tēng beh pó-hō·",
        "protectcomment": "Lí-iû:",
+       "protect-level-autoconfirmed": "Chí ín-chún chū-tōng khak-jīn iōng-chiá",
+       "protect-level-sysop": "Chí ín-chún koán-lí jîn-oân",
        "protect-cascade": "Cascading protection - pó-hō͘ jīm-hô pau-hâm tī chit ia̍h ê ia̍h.",
        "restriction-edit": "Siu-kái",
        "restriction-move": "Sóa khì",
        "undeleteviewlink": "Khoàⁿ",
        "namespace": "Miâ-khong-kan:",
        "invert": "Soán-hāng í-gōa",
-       "tooltip-invert": "勾起來的框;相關的名空間會先藏起來。",
-       "namespace_association": "相關的名空間",
-       "tooltip-namespace_association": "勾起來的框;相關的討論抑物件空間會包括入來",
-       "blanknamespace": "(Thâu-ia̍h)",
+       "tooltip-invert": "Kau khí-lâi ê kheng-á; siong-koan ê miâ-khong-kan ē seng khǹg khí-lâi.",
+       "namespace_association": "Siong-koan ê miâ-khong-kan",
+       "tooltip-namespace_association": "Kau khí-lâi ê kheng-á; siong-koan ê thó-lūn ia̍h mi̍h-kiāⁿ khong-kan ē pau-hâm ji̍p lâi.",
+       "blanknamespace": "(Chú-ia̍h)",
        "contributions": "{{GENDER:$1|Iōng-chiá}} ê kòng-hiàn",
        "contributions-title": "Iōng-chiá $1--ê kòng-hiàn",
-       "mycontris": "Góa ê kòng-hiàn",
-       "anoncontribs": "Kòng-hiān",
+       "mycontris": "Kòng-hiàn",
+       "anoncontribs": "Kòng-hiàn",
        "nocontribs": "Chhōe bô tiâu-kiāⁿ ū-tùi ê hāng-bo̍k.",
        "uctop": "(siōng téng ê)",
        "month": "Kàu tó 1 kó͘ goe̍h ûi-chí:",
        "year": "Kàu tó 1 nî ûi-chí:",
        "sp-contributions-newbies": "Kan-taⁿ hián-sī sin kháu-chō ê kòng-kiàn",
        "sp-contributions-newbies-sub": "Sin lâi--ê",
-       "sp-contributions-deleted": "Hō͘ lâng thâi tiāu ê kòng-hiàn",
+       "sp-contributions-blocklog": "Hong-só ji̍t-chì",
+       "sp-contributions-deleted": "{{GENDER:$1|iōng-chiá}} hō͘ lâng thâi tiāu ê kòng-hiàn",
+       "sp-contributions-uploads": "Ap-ló͘",
+       "sp-contributions-logs": "Ji̍t-chì",
        "sp-contributions-talk": "thó-lūn",
+       "sp-contributions-userrights": "{{GENDER:$1|iōng-chiá}} khoân-hān koán-lí",
        "sp-contributions-search": "Chhoē chhut kòng-kiàn",
        "sp-contributions-username": "IP Chū-chí a̍h iōng-chiá miâ:",
        "sp-contributions-submit": "Chhoē",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] í-keng pī hong-só. <br />Khì [[Special:BlockList|IP hong-só lia̍t-toaⁿ]] review hong-só ê IP.",
        "ipusubmit": "Chhú-siau hong-só chit ê chū-chí",
        "ipblocklist": "Siū hong-só ê IP chū-chí kap iōng-chiá miâ-chheng",
+       "infiniteblock": "éng-oán",
+       "expiringblock": "$1 $2 kàu kî.",
+       "anononlyblock": "Chí bô miâ iōng-chiá",
+       "createaccountblock": "kìm-chí khui kháu-chō",
+       "blocklist-nousertalk": "bô-hoat-tō͘ siu-kái kā-kī ê thó-lūn-ia̍h",
        "blocklink": "hong-só",
-       "unblocklink": "廢除封鎖",
-       "change-blocklink": "改封鎖",
+       "unblocklink": "Kái-tû hong-só",
+       "change-blocklink": "Siu-kái hong-só",
        "contribslink": "kòng-hiàn",
        "autoblocker": "Chū-tōng kìm-chí lí sú-iōng, in-ūi lí kap \"$1\" kong-ke kāng 1 ê IP chū-chí (kìm-chí lí-iû \"$2\").",
        "blocklogentry": "hong-só [[$1]], siat kî-hān chì $2 $3",
        "confirmemail_body_changed": "Ū lâng (IP $1, tāi-khài sī lí pún-lâng) tī {{SITENAME}} ēng chit-ê e-mail chū-chí chù-chheh 1 ê kháu-chō \"$2\".\n\nChhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si̍t-chāi sī lí ê:\n\n$3\n\nNā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.\n\n$5\n\nChit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.",
        "confirmemail_body_set": "Ū lâng (IP $1, tāi-khài sī lí pún-lâng) tī {{SITENAME}} ēng chit-ê e-mail chū-chí chù-chheh 1 ê kháu-chō \"$2\".\n\nChhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si̍t-chāi sī lí ê:\n\n$3\n\nNā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.\n\n$5\n\nChit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.",
        "confirm-purge-top": "Kā chit ia̍h ê cache piàⁿ tiāu?",
+       "colon-separator": ":&#32;",
        "table_pager_next": "Aū-chi̍t-ia̍h",
        "table_pager_prev": "Téng-chi̍t-ia̍h",
        "table_pager_first": "Thâu-chi̍t-ia̍h",
index 47d2bcf..116b216 100644 (file)
        "login": "Tràse",
        "login-security": "Cunferma l'identità",
        "nav-login-createaccount": "Trasite o criate n'acciesso nuovo",
-       "userlogin": "Trasite o criate n'acciesso nuovo",
-       "userloginnocreate": "Tràse",
        "logout": "Jèsce",
        "userlogout": "Jèsce",
        "notloggedin": "Acciesso nun affettuato",
        "userlogin-noaccount": "Nun tenite ancora n'acciesso?",
        "userlogin-joinproject": "Facite 'o riggistro ncopp'a {{SITENAME}}",
-       "nologin": "Nun tenite ancora n'acciesso? '''$1'''.",
-       "nologinlink": "Crialo mmo",
        "createaccount": "Crèa nu cunto nuovo",
-       "gotaccount": "Tiene già nu cunto? '''$1'''.",
-       "gotaccountlink": "Tràse",
-       "userlogin-resetlink": "V'avite scurdato 'e dettaglie d'acciesso vuoste?",
        "userlogin-resetpassword-link": "Te sì scurdat' 'a password?",
        "userlogin-helplink2": "Aiuto cu l'accieso",
        "userlogin-loggedin": "Sì già {{GENDER:$1|connesso comme $1|connessa comme $1|connesso/a comme $1}}.\nUsa 'o modulo ccà abbascio pe trasì com'a n'atu utente.",
        "createaccountmail": "Usa na password qualunque temporanea e manna sta password a l'indirizzo 'e posta e-mail specificato",
        "createaccountmail-help": "Se putess'ausà pe' puté crià nu cunto pe' n'ata perzona senza mparà 'a password.",
        "createacct-realname": "Nomme riale (ozzionale)",
-       "createaccountreason": "Mutivo:",
        "createacct-reason": "Mutivo",
        "createacct-reason-ph": "Pecché staje crianno n'at'utenza",
        "createacct-reason-help": "Mmasciata mmustata dint'o riggistro 'e criazion' 'e cunte",
        "preview": "Anteprimma",
        "showpreview": "Vire anteprimma",
        "showdiff": "Fa veré 'e cagnamiente",
-       "blankarticle": "<strong>Attenziò:</strong> 'a paggena ca staje crianno è abbacante.\nFà click ncopp'a \"{{int:savearticle}}\" n'ata vota, 'a paggena sarrà criata senza cuntenute.",
+       "blankarticle": "<strong>Attenziò:</strong> 'a paggena ca staje crianno è abbacante.\nFà click ncopp'a \"$1\" n'ata vota, 'a paggena sarrà criata senza cuntenute.",
        "anoneditwarning": "'''Attenzione:''' Nun avite fatto l'acciesso. 'A cronologgia d' 'a vosta sarrà visibbele pubbrecamente si facite cocche cagnamiento. Si <strong>[$1 tràse]</strong> o <strong>[$2 crìe nu cunto]</strong>, 'e cagnamiente vuoste ve sarranno attribbuite a vvuje, nzieme a n'ati migliuramente.",
        "anonpreviewwarning": "''Nun avite fatto 'o login. Sarvann' 'a paggena, l'indirizzo IP d' 'o vuosto sarrà riggistrato dint'a cronologgia.''",
-       "missingsummary": "'''Attenziò:''' nun s'è specificato l'oggetto 'e stu cagnamiento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato cu l'oggetto abbacante.",
-       "selfredirect": "<strong>Attenziò:</strong> State crianno nu redirect a 'o stesso articolo.\nPuò darse c'avites specificato 'o pizzo sbagliato p' 'o redirect, o ca stavate cagnanno 'o pizzo sbagliato.\nSi cliccate \"{{int:savearticle}}\" n'ata vota, si criarrà 'o redirect.",
+       "missingsummary": "'''Attenziò:''' nun s'è specificato l'oggetto 'e stu cagnamiento. Clicann' 'a \"$1\" n'ata vota 'o cagnamiento sarrà sarvato cu l'oggetto abbacante.",
+       "selfredirect": "<strong>Attenziò:</strong> State crianno nu redirect a 'o stesso articolo.\nPuò darse c'avites specificato 'o pizzo sbagliato p' 'o redirect, o ca stavate cagnanno 'o pizzo sbagliato.\nSi cliccate \"$1\" n'ata vota, si criarrà 'o redirect.",
        "missingcommenttext": "Pe' piacere scrivete nu commento ccà abbascio.",
-       "missingcommentheader": "<strong>Arricurdateve:</strong> nun s'è specificato l'oggetto/titolo pe stu commento. Clicann' 'a \"{{int:savearticle}}\" n'ata vota 'o cagnamiento sarrà sarvato c' 'o titolo/oggetto abbacante.",
+       "missingcommentheader": "<strong>Arricurdateve:</strong> nun s'è specificato l'oggetto/titolo pe stu commento. Clicann' 'a \"$1\" n'ata vota 'o cagnamiento sarrà sarvato c' 'o titolo/oggetto abbacante.",
        "summary-preview": "Anteprimma'e l'oggetto:",
        "subject-preview": "Anteprimma 'e l'oggetto:",
        "previewerrortext": "È succiesso n'errore quanno se steva a ffà pre-veré 'e cagnamiente vuoste.",
        "editingsection": "Cagnamiénto 'e $1 (sezzione)",
        "editingcomment": "Cagnamiénto 'e $1 (nova sezzione)",
        "editconflict": "Conflitto d'edizzione: $1",
-       "explainconflict": "N'at'utente ave sarvato na nova verziona d' 'a paggena pe' tramente ca stevate a fà 'e cagnamiente.\n'A cascia 'e mudifeca ncoppa cuntene 'o testo d' 'a paggena ca mò sta online, accussì comme è stato agghiurnato a l'at'utente.\n'A verziona ch' 'e cagnamiente vuoste è stata mmece riportata dint'a cascia 'e mudifeca abbascio.\nSi 'e vulite cunfermà avite 'a ripurtà 'e cagnamiente d' 'e vuoste dint'o testo ca esiste (dint'a cascia ncoppa).\nSpremmendo 'o buttón '{{int:savearticle}}', sarrà sarvato '''sulamente''' 'o testo cuntenuto dint'a cascia 'e cagnamiento ncoppa.",
+       "explainconflict": "N'at'utente ave sarvato na nova verziona d' 'a paggena pe' tramente ca stevate a fà 'e cagnamiente.\n'A cascia 'e mudifeca ncoppa cuntene 'o testo d' 'a paggena ca mò sta online, accussì comme è stato agghiurnato a l'at'utente.\n'A verziona ch' 'e cagnamiente vuoste è stata mmece riportata dint'a cascia 'e mudifeca abbascio.\nSi 'e vulite cunfermà avite 'a ripurtà 'e cagnamiente d' 'e vuoste dint'o testo ca esiste (dint'a cascia ncoppa).\nSpremmendo 'o buttón '$1', sarrà sarvato '''sulamente''' 'o testo cuntenuto dint'a cascia 'e cagnamiento ncoppa.",
        "yourtext": "'O testo vuosto",
        "storedversion": "A verziona 'n memoria",
        "nonunicodebrowser": "'''Attenziò: state ausanno nu navigatóre ca nun è compatibbele ch' 'e carattere Unicode. Pe' ve permettere 'o cagnamiento d' 'e paggene senza crià ncunveniente, 'e carattere nun ASCII veneno viste dint' 'a cascia 'e cagnamiento sotto forma 'e codece esadecimale.'''",
        "right-editsemiprotected": "Cagna 'e paggene prutette cu \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Cagna 'o modello 'e cuntenute 'e na paggena",
        "right-editinterface": "Modifeca 'a nterfaccia utente",
-       "right-editusercssjs": "Cagna 'e file CSS e JS e l'at'utente",
        "right-editusercss": "Cagna 'e file CSS 'e l'at'utente",
        "right-edituserjs": "Cagna 'e file JS e l'at'utente",
        "right-editmyusercss": "Cagna 'e proprie file CSS",
        "rcshowhidecategorization": "$1 categorizzaziona d' 'a paggena",
        "rcshowhidecategorization-show": "Faje vedé",
        "rcshowhidecategorization-hide": "Annascunne",
-       "rclinks": "Faje vedé ll'urdeme $1 cagnamiente dint' ll'urdeme $2 juorne<br />$3",
+       "rclinks": "Faje vedé ll'urdeme $1 cagnamiente dint' ll'urdeme $2 juorne",
        "diff": "diff",
        "hist": "cron",
        "hide": "annascunne",
        "undeleteviewlink": "vire",
        "undeleteinvert": "Abbarruca 'a sceveta",
        "undeletecomment": "Mutivo:",
-       "undeletedrevisions": "{{PLURAL:$1|1 verzione|$1 verziune}} arrepigliate",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 verzione|$1 verziune}} e {{PLURAL:$2|1 file|$2 file}} arrepigliate",
-       "undeletedfiles": "{{PLURAL:$1|1 file arrepigliato|$1 file arrepigliate}}",
        "cannotundelete": "Arrepiglio fallito:\n$1",
        "undeletedpage": "'''$1 è stat'arrepigliato'''\n\nLiggiete 'o [[Special:Log/delete|riggistro 'e scancellamiente]] pe n'avé n'elenco 'e l'urdeme scancellamiente e arrepiglie.",
        "undelete-header": "Vedite [[Special:Log/delete|'o riggistro 'e scancellamiente]] pe l'urdeme paggene scancellate",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|agghiurnaje}} tag dint'a verziona $4 d' 'a paggena $3 ({{PLURAL:$7|azzeccaje}} $6; {{PLURAL:$9|luvaje}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|agghiurnaje}} tag dint'a ntrata 'e riggistro $5 d' 'a paggena $3 ({{PLURAL:$7|azzeccaje}} $6; {{PLURAL:$9|luvaje}} $8)",
        "rightsnone": "(nisciuno)",
-       "revdelete-summary": "cagna 'o riepilego",
        "feedback-adding": "Azzecca nu feedback/na segnalazione â paggena..",
        "feedback-back": "Arreto",
        "feedback-bugcheck": "Tutt'appost! Avite surtanto 'a cuntrullà ca chisto nun è unu d' 'e [$1 bug canusciute].",
index 15125c6..2aaf43b 100644 (file)
        "login": "Logg inn",
        "login-security": "Bekreft identiteten din",
        "nav-login-createaccount": "Logg inn eller opprett en konto",
-       "userlogin": "Logg inn eller opprett en konto",
-       "userloginnocreate": "Logg inn",
        "logout": "Logg ut",
        "userlogout": "Logg ut",
        "notloggedin": "Ikke logget inn",
        "userlogin-noaccount": "Ingen konto?",
        "userlogin-joinproject": "Bli med i {{SITENAME}}",
-       "nologin": "Har du ingen konto? $1.",
-       "nologinlink": "Opprett en konto",
        "createaccount": "Opprett konto",
-       "gotaccount": "Har du allerede en konto? $1.",
-       "gotaccountlink": "Logg inn",
-       "userlogin-resetlink": "Har du glemt påloggingsdetaljene dine?",
        "userlogin-resetpassword-link": "Glemt passordet?",
        "userlogin-helplink2": "Hjelp med innlogging",
        "userlogin-loggedin": "Du er allerede logget inn som {{GENDER:$1|$1}}.\nBruk skjemaet nedenfor for å logge inn som en annen bruker.",
        "createaccountmail": "Bruk et midlertidig, tilfeldig passord, og send det til angitt e-postadresse",
        "createaccountmail-help": "Kan brukes til å opprette en konto for en annen person uten at du får vite passordet.",
        "createacct-realname": "Virkelig navn (valgfritt)",
-       "createaccountreason": "Årsak:",
        "createacct-reason": "Årsak",
        "createacct-reason-ph": "Hvorfor lager du en annen bruker",
        "createacct-reason-help": "Beskjed vist i kontoopprettelsesloggen",
        "savearticle": "Lagre siden",
        "savechanges": "Lagre endringer",
        "publishpage": "Publiser siden",
-       "publishchanges": "Publiser endringer",
+       "publishchanges": "Publiser endringene",
        "preview": "Forhåndsvisning",
        "showpreview": "Forhåndsvisning",
        "showdiff": "Vis endringer",
-       "blankarticle": "<strong>Advarsel:</strong> Siden du er i ferd med å opprette er tom.\nHvis du trykker \"{{int:savearticle}}\" en gang til, vil siden opprettes uten innhold.",
+       "blankarticle": "<strong>Advarsel:</strong> Siden du er i ferd med å opprette er tom.\nHvis du trykker «$1» en gang til, vil siden opprettes uten innhold.",
        "anoneditwarning": "<strong>Advarsel:</strong> Du er ikke innlogget. IP-adressen din vil bli vist offentlig om du redigerer. Hvis du <strong>[$1 logger inn]</strong> eller <strong>[$2 oppretter en konto]</strong> vil redigeringene dine tilskrives brukernavnet ditt, og du vil få flere andre fordeler.",
        "anonpreviewwarning": "<em>Du er ikke logget inn. Ved lagring vil IP-adressen din lagres i sidens redigeringshistorikk.</em>",
        "missingsummary": "'''Påminnelse:''' Du har ikke lagt inn en redigeringsforklaring.\nVelger du ''Lagre siden'' en gang til blir endringene lagret uten forklaring.",
-       "selfredirect": "<strong>Advarsel:</strong> Du omdirigerer denne siden til seg selv. Du kan ha oppgitt feil mål for omdirigeringen, eller kanskje du redigerer feil side. Om du klikker «{{int:savearticle}}» igjen vil omdirigeringen bli opprettet uansett.",
+       "selfredirect": "<strong>Advarsel:</strong> Du omdirigerer denne siden til seg selv. Du kan ha oppgitt feil mål for omdirigeringen, eller kanskje du redigerer feil side. Om du klikker «$1» igjen vil omdirigeringen bli opprettet uansett.",
        "missingcommenttext": "Vennligst legg inn en kommentar under.",
-       "missingcommentheader": "<strong>Påminnelse:</strong> Du har ikke angitt et emne/overskrift for denne kommentaren.\nOm du trykker «{{int:savearticle}}» igjen vil redigeringen din bli lagret uten forklaring.",
+       "missingcommentheader": "<strong>Påminnelse:</strong> Du har ikke angitt et emne/overskrift for denne kommentaren.\nOm du trykker «$1» igjen vil redigeringen din bli lagret uten forklaring.",
        "summary-preview": "Forhåndsvisning av redigeringsforklaring:",
        "subject-preview": "Forhåndsvisning av overskrift:",
        "previewerrortext": "En feil oppsto mens dine endringer skulle forhåndsvises.",
        "editingsection": "Redigerer $1 (avsnitt)",
        "editingcomment": "Redigerer $1 (ny seksjon)",
        "editconflict": "Redigeringskollisjon: $1",
-       "explainconflict": "Noen andre har endret teksten siden du begynte å redigere.\nDen øverste boksen inneholder den nåværende teksten.\nDine endringer vises i den nederste boksen.\nDu er nødt til å flette dine endringer sammen med den nåværende teksten.\n'''Kun''' teksten i den øverste tekstboksen blir lagret når du trykker «{{int:savearticle}}».",
+       "explainconflict": "Noen andre har endret teksten siden du begynte å redigere.\nDen øverste boksen inneholder den nåværende teksten.\nDine endringer vises i den nederste boksen.\nDu er nødt til å flette dine endringer sammen med den nåværende teksten.\n'''Kun''' teksten i den øverste tekstboksen blir lagret når du trykker «$1».",
        "yourtext": "Din tekst",
        "storedversion": "Den lagrede versjonen",
        "nonunicodebrowser": "'''Advarsel: Nettleseren din har ikke Unicode-støtte.'''\nFor å unngå problemer blir som ikke er med i ASCII vist som heksadesimale kode i redigeringsruten.",
        "readonlywarning": "<strong>ADVARSEL: Databasen er låst på grunn av vedlikehold,\nså du kan ikke lagre dine endringer akkurat nå.</strong>\nDet kan være en god idé å kopiere teksten din til en tekstfil og lagre den til senere.\n\nSystemadministratoren som låste databasen ga følgende begrunnelse: $1",
        "protectedpagewarning": "'''Advarsel: Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den.'''\nDet siste loggelementet er oppgitt under som referanse:",
        "semiprotectedpagewarning": "'''Merk:''' Denne siden har blitt låst slik at kun registrerte brukere kan endre den.\nDet siste loggelementet er oppgitt under som referanse:",
-       "cascadeprotectedwarning": "<strong>Advarsel:</strong> Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den, fordi den inkluderes på følgende dypbeskyttede {{PLURAL:$1|side|sider}}:",
+       "cascadeprotectedwarning": "<strong>Advarsel:</strong> Denne siden har blitt låst slik at kun brukere med [[Special:ListGroupRights|spesifikke rettigheter]] som kan redigere den, fordi den transkluderes på følgende dypbeskyttede {{PLURAL:$1|side|sider}}:",
        "titleprotectedwarning": "'''Advarsel: Denne siden har blitt låst slik at [[Special:ListGroupRights|bestemte rettigheter]] kreves for å opprette den.'''\nTil orientering vises den siste loggoppføringen under:",
        "templatesused": "{{PLURAL:$1|Mal|Maler}} som brukes på denne siden:",
        "templatesusedpreview": "{{PLURAL:$1|Mal|Maler}} brukt i denne forhåndsvisningen:",
        "post-expand-template-argument-warning": "Advarsel: Siden inneholder ett eller flere malparametere som blir for lange når de utvides.\nDisse parameterne har blitt utelatt.",
        "post-expand-template-argument-category": "Sider med utelatte malparametere",
        "parser-template-loop-warning": "Mal-loop oppdaget: [[$1]]",
+       "template-loop-category": "Sider med malsløyfer",
+       "template-loop-category-desc": "Siden inneholder en malløkke, altså en mal som kaller seg selv rekursivt.",
        "parser-template-recursion-depth-warning": "Mal er brukt for mange ganger ($1)",
        "language-converter-depth-warning": "Dybdegrense for språkkonvertering overskredet ($1)",
        "node-count-exceeded-category": "Sider hvor antallet noder er overskredet",
        "page_first": "første",
        "page_last": "siste",
        "histlegend": "Valg av diff: merk i radioboksene de revisjonene du ønsker å sammenligne og trykk enter eller knappen nederst på siden.<br />\nForklaring: '''({{int:cur}})''' = forskjell fra nåværende revisjon, '''({{int:last}})''' = forskjell fra foregående revisjon, '''{{int:minoreditletter}}''' = mindre endring.",
-       "history-fieldset-title": "Bla i historikken",
-       "history-show-deleted": "Kun slettede",
+       "history-fieldset-title": "Søk etter revisjoner",
+       "history-show-deleted": "Kun slettede revisjoner",
        "histfirst": "eldste",
        "histlast": "nyeste",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "search-file-match": "(matcher filinnhold)",
        "search-suggest": "Mente du: $1",
        "search-rewritten": "Viser resultatet for $1. Søk i stedet for $2.",
-       "search-interwiki-caption": "Søsterprosjekter",
+       "search-interwiki-caption": "Resultater fra søsterprosjekter",
        "search-interwiki-default": "Resultater fra $1:",
        "search-interwiki-more": "(mer)",
        "search-interwiki-more-results": "flere resultater",
        "prefs-help-prefershttps": "Denne preferansen vil virke etter neste innlogging.",
        "prefswarning-warning": "Du har gjort endringer i dine innstillinger som ikke er lagret ennå.\nDersom du forlater denne siden utenk å klikke på \"$1\" blir ikke innstillingene dine oppdatert.",
        "prefs-tabs-navigation-hint": "Tips: Du kan bruke venstre- og høyrepiltastene for å navigere mellom fanene i fanelisten",
-       "userrights": "Bruker&shy;rettighets&shy;kontroll",
+       "userrights": "Bruker&shy;rettigheter",
        "userrights-lookup-user": "Velg en bruker",
        "userrights-user-editname": "Fyll inn et brukernavn:",
        "editusergroup": "Last brukergrupper",
        "saveusergroups": "Lagre {{GENDER:$1|brukergrupper}}",
        "userrights-groupsmember": "Medlem av:",
        "userrights-groupsmember-auto": "Implisitt medlem av:",
-       "userrights-groups-help": "Du kan endre hvilke grupper denne brukeren er medlem av.\n* En avkrysset boks betyr at brukeren er medlem av gruppen.\n* En uavkrysset boks betyr at brukeren ikke er medlem av gruppen.\n* En * betyr at du ikke kan fjerne gruppemedlemskapet når du har lagt det til, eller vice versa.\n* En # betyr at du kun kan forkorte utløpstiden til denne gruppen, du kan ikke forlenge den.",
+       "userrights-groups-help": "Du kan endre hvilke grupper denne brukeren er medlem av.\n* En avkrysset boks betyr at brukeren er medlem av gruppen.\n* En uavkrysset boks betyr at brukeren ikke er medlem av gruppen.\n* En * betyr at du ikke kan fjerne gruppemedlemskapet når du har lagt det til, eller vice versa.\n* En # betyr at du kun kan forkorte utløpstiden til dette gruppemedlemskapet, du kan ikke forlenge den.",
        "userrights-reason": "Årsak:",
        "userrights-no-interwiki": "Du har ikke tillatelse til å endre brukerrettigheter på andre wikier.",
        "userrights-nodatabase": "Databasen $1 finnes ikke, eller er ikke lokal.",
        "userrights-expiry-options": "1 dag:1 day,1 uke:1 week,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year",
        "userrights-invalid-expiry": "Utløpstiden for gruppa «$1» er ugyldig.",
        "userrights-expiry-in-past": "Utløpstiden for gruppa «$1» har vært.",
-       "userrights-cannot-shorten-expiry": "Du kan ikke forlenge utløpstiden til gruppa «$1». Bare brukere med tillatelse til å legge til eller fjerne denne gruppa kan forlenge utløpstider.",
+       "userrights-cannot-shorten-expiry": "Du kan ikke forlenge utløpstiden til gruppemedlemskapet i «$1». Bare brukere med tillatelse til å legge til eller fjerne denne gruppa kan forlenge utløpstider.",
        "userrights-conflict": "En konflikt med endringen av brukerrettigheter! Vær vennlig å sjekke og på nytt bekrefte endringene dine.",
        "group": "Gruppe:",
        "group-user": "Brukere",
        "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": "Redigere sine egne CSS-filer",
        "recentchanges-legend-plusminus": "«(±123)»",
        "recentchanges-submit": "Vis",
        "rcfilters-activefilters": "Aktive filtre",
+       "rcfilters-quickfilters": "Raske lenker",
+       "rcfilters-savedqueries-defaultlabel": "Lagrede filtre",
+       "rcfilters-savedqueries-rename": "Gi nytt navn",
+       "rcfilters-savedqueries-setdefault": "Sett som standard",
+       "rcfilters-savedqueries-unsetdefault": "Fjern som standard",
+       "rcfilters-savedqueries-remove": "Fjern",
+       "rcfilters-savedqueries-new-name-label": "Navn",
+       "rcfilters-savedqueries-apply-label": "Opprett rask lenke",
+       "rcfilters-savedqueries-cancel-label": "Avbryt",
+       "rcfilters-savedqueries-add-new-title": "Lagre filtre som en rask lenke",
        "rcfilters-restore-default-filters": "Gjenopprett standardfiltre",
        "rcfilters-clear-all-filters": "Nullstill alle filtre",
        "rcfilters-search-placeholder": "Filtrer siste endringer (søk eller begyn å skrive)",
        "rcfilters-invalid-filter": "Ugyldig filter",
        "rcfilters-empty-filter": "Ingen aktive filtre. Alle bidrag vises.",
        "rcfilters-filterlist-title": "Filtre",
+       "rcfilters-filterlist-whatsthis": "Hva er dette?",
+       "rcfilters-filterlist-feedbacklink": "Gi tilbakemelding på de nye (beta)filtrene",
+       "rcfilters-highlightbutton-title": "Marker resultater",
+       "rcfilters-highlightmenu-title": "Velg en farge",
+       "rcfilters-highlightmenu-help": "Velg en farge for å merke denne egenskapen",
        "rcfilters-filterlist-noresults": "Ingen filtre funnet",
+       "rcfilters-noresults-conflict": "Ingen resultater funnet fordi søkekriteriene konflikterer",
+       "rcfilters-state-message-subset": "Dette filteret har ingen effekt fordi resultatene dens inkluderes i følgende, bredere {{PLURAL:$2|filter|filtre}} (prøv å merke for å skille det ut): $1",
+       "rcfilters-state-message-fullcoverage": "Å velge alle filtre i en gruppe er det samme som å velge ingen, så dette filteret har ingen effekt. Gruppa inkluderer: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "Dette filteret konflikterer med følgende {{PLURAL:$2|erfaringsfilter|erfaringsfiltre}}, som finner kun registrerte brukere: $1",
+       "rcfilters-filtergroup-authorship": "Bidragets forfatter",
+       "rcfilters-filter-editsbyself-label": "Dine redigeringer",
+       "rcfilters-filter-editsbyself-description": "Dine egne bidrag.",
+       "rcfilters-filter-editsbyother-label": "Endringer av andre",
+       "rcfilters-filter-editsbyother-description": "Alle endringer utenom dine egne.",
        "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-user-experience-level-conflicts-unregistered": "Erfaringsfiltre finner kun registrerte brukere, så dette filteret konflikterer med filteret «Uregistrerte».",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filteret «Uregistrerte» konflikterer med ett eller flere erfaringsfiltre, som kun finner registrerte brukere. De konflikterende filtrene merkes i området for aktive filtre ovenfor.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nykommere",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Færre enn 10 redigeringer og 4 dagers aktivitet.",
+       "rcfilters-filter-user-experience-level-learner-label": "Nybegynnere",
+       "rcfilters-filter-user-experience-level-learner-description": "Mer erfaring enn «Nykommere», men mindre enn «Erfarne brukere».",
+       "rcfilters-filter-user-experience-level-experienced-label": "Erfarne brukere",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Gjennomgangsstatus",
+       "rcfilters-filter-patrolled-label": "Patruljert",
+       "rcfilters-filter-patrolled-description": "Redigeringer merket som patruljert.",
+       "rcfilters-filter-unpatrolled-label": "Upatruljert",
+       "rcfilters-filter-unpatrolled-description": "Redigeringer som ikke er merket som patruljert.",
        "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-watchlist": "Overvåkede sider",
+       "rcfilters-filter-watchlist-watched-label": "På overvåkningslisten",
+       "rcfilters-filter-watchlist-watched-description": "Endringer til sider på overvåkningslista di.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nye endringer på overvåkningslista",
+       "rcfilters-filter-watchlist-watchednew-description": "Endringer i overvåkede sider du ikke har besøkt siden endringen(e) ble gjort.",
+       "rcfilters-filter-watchlist-notwatched-label": "Ikke på overvåkningslista.",
+       "rcfilters-filter-watchlist-notwatched-description": "Alt utenom endringer på sider på overvåkningslista di.",
        "rcfilters-filtergroup-changetype": "Type endring",
        "rcfilters-filter-pageedits-label": "Sideredigeringer",
        "rcfilters-filter-pageedits-description": "Redigeringer til wikiinnhold, diskusjoner, kategoribeskrivelser ...",
        "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 ...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filteret for «Mindre endringer» konflikterer med ett eller flere endringstypefiltre, fordi visse endringstyper ikke kan merkes som «mindre». De konflikterende fultrene merkes i området for aktive filtre ovenfor.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Visse endringstyper kan ikke merkes som «mindre», så dette filteret konflikterer med følgende endringstypefiltre: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Dette endringstypefilteret konflikterer med filteret for «Mindre endringer». Visse endringstyper kan ikke merkes som «mindre».",
+       "rcfilters-filtergroup-lastRevision": "Siste revisjon",
+       "rcfilters-filter-lastrevision-label": "Siste revisjon",
+       "rcfilters-filter-lastrevision-description": "Den nyeste endringen av en side.",
+       "rcfilters-filter-previousrevision-label": "Tidligere revisjoner",
+       "rcfilters-filter-previousrevision-description": "Alle endringer som ikke er den nyeste endringen av en side.",
        "rcnotefrom": "Nedenfor er vist {{PLURAL:$5|endringen|endringene}} som er gjort siden <strong>$3, $4</strong> (frem til <strong>$1</strong>).",
+       "rclistfromreset": "Nullstill datovalg",
        "rclistfrom": "Vis nye endringer fra og med $3 $2",
        "rcshowhideminor": "$1 mindre endringer",
        "rcshowhideminor-show": "Vis",
        "rcshowhidecategorization": "$1 kategorisering av sider",
        "rcshowhidecategorization-show": "Vis",
        "rcshowhidecategorization-hide": "Skjul",
-       "rclinks": "Vis siste $1 endringer i de siste $2 dagene<br />$3",
+       "rclinks": "Vis siste $1 endringer i de siste $2 dagene",
        "diff": "diff",
        "hist": "hist",
        "hide": "Skjul",
        "php-uploaddisabledtext": "PHP-filopplasting er deaktivert. Sjekk innstillingen for file_uploads.",
        "uploadscripted": "Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.",
        "upload-scripted-pi-callback": "Det er ikke tillatt å laste opp en fil som inneholder et kjørbart XML-stilark.",
+       "upload-scripted-dtd": "Kan ikke laste opp SVG-filer som har en ikke-standard DTD-erklæring.",
        "uploaded-script-svg": "Fant et skriptelement \"$1\" i den opplastede SVG-koden.",
        "uploaded-hostile-svg": "Fant usikker CSS i stilelementet til opplastet SVG-fil",
        "uploaded-event-handler-on-svg": "Å sette event-handler-attributtene <code>$1=\"$2\"</code> tillates ikke i SVG-filer.",
        "editcomment": "Redigeringskommentaren var: <em>$1</em>",
        "revertpage": "Tilbakestilte endringer av [[Special:Contributions/$2|$2]] ([[User talk:$2|brukerdiskusjon]]) til siste versjon av [[User:$1|$1]]",
        "revertpage-nouser": "Tilbakestilt endringer av skjult bruker til siste versjon av\n{{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Tilbakestilte endringer av $1; endret til siste versjon av $2.",
+       "rollback-success": "Tilbakestilte endringer av {{GENDER:$3|$1}}; endret til siste versjon av {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Tilbakestilte endringer av $1;\nendret tilbake til siste revisjon av $2. [$3 Vis endringer]",
        "sessionfailure-title": "Sesjonsfeil",
        "sessionfailure": "Det ser ut til å være et problem med innloggingen din, og den ble avbrutt av sikkerhetshensyn. Trykk ''Tilbake'' i nettleseren din, oppdater siden og prøv igjen.",
        "undeleteviewlink": "vis",
        "undeleteinvert": "Inverter valg",
        "undeletecomment": "Årsak:",
-       "undeletedrevisions": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} gjenopprettet",
-       "undeletedrevisions-files": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} og {{PLURAL:$2|én fil|$2 filer}} gjenopprettet",
-       "undeletedfiles": "{{PLURAL:$1|Én fil|$1 filer}} gjenopprettet",
        "cannotundelete": "Deler av eller hele gjennopprettingen feilet:\n$1",
        "undeletedpage": "'''$1 ble gjenopprettet'''\n\nSjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger og gjenopprettelser.",
        "undelete-header": "Se [[Special:Log/delete|slettingsloggen]] for nylig slettede sider.",
        "sp-contributions-uploads": "opplastinger",
        "sp-contributions-logs": "logger",
        "sp-contributions-talk": "diskusjon",
-       "sp-contributions-userrights": "brukerrettighetskontroll",
+       "sp-contributions-userrights": "{{GENDER:$1|bruker&shy;rettighets&shy;kontroll}}",
        "sp-contributions-blocked-notice": "Denne brukeren er for tiden blokkert.\nSiste blokkeringsloggelement kan sees nedenfor.",
        "sp-contributions-blocked-notice-anon": "Denne IP-adressen er for tiden blokkert.\nDen siste oppføringen i blokkeringsloggen er vist nedenfor som referanse:",
        "sp-contributions-search": "Søk etter bidrag",
        "unblocked-id": "Blokkering $1 ble fjernet",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] har blitt avblokkert.",
        "blocklist": "Blokkerte brukere",
+       "autoblocklist": "Automatiske blokkeringer",
+       "autoblocklist-submit": "Søk",
+       "autoblocklist-legend": "Liste over automatiske blokkeringer",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Lokal automatisk blokkering|Lokale automatiske blokkeringer}}",
+       "autoblocklist-empty": "Listen over automatiske blokkeringer er tom.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Annen automatisk blokkering|Andre automatiske blokkeringer}}",
        "ipblocklist": "Blokkerte IP-adresser og brukernavn",
        "ipblocklist-legend": "Finn en blokkert bruker",
        "blocklist-userblocks": "Skjul kontoblokkeringer",
        "tooltip-pt-mycontris": "En liste over {{GENDER:|dine}} bidrag",
        "tooltip-pt-anoncontribs": "En liste over redigeringer gjort fra denne IP-adressen",
        "tooltip-pt-login": "Du oppfordres til å logge inn, men det er ikke obligatorisk",
+       "tooltip-pt-login-private": "Du må logge inn for å bruke denne wikien",
        "tooltip-pt-logout": "Logg ut",
        "tooltip-pt-createaccount": "Du oppfordres til å opprette en konto og logge inn, men det er ikke obligatorisk.",
        "tooltip-ca-talk": "Diskusjon om innholdssiden",
        "newimages-summary": "Denne spesialsiden viser de sist opplastede filene.",
        "newimages-legend": "Filnavn",
        "newimages-label": "Filnavn (helt eller delvis):",
+       "newimages-user": "IP-adresse eller brukernavn",
        "newimages-showbots": "Vis opplastinger av botter",
        "newimages-hidepatrolled": "Skjul patruljerte opplastinger",
        "noimages": "Ingenting å se.",
        "confirmrecreate": "Brukeren [[User:$1|$1]] ([[User talk:$1|diskusjon]]) {{GENDER:$1|slettet}} siden etter at du begynte å redigere den, med begrunnelsen:\n: <em>$2</em>\nVennligst bekreft at du vil gjenopprette siden.",
        "confirmrecreate-noreason": "Brukeren [[User:$1|$1]] ([[User talk:$1|diskusjon]]) {{GENDER:$1|slettet}} denne siden etter at du begynte å redigere. Bekreft at du virkelig ønsker å gjenopprette denne siden.",
        "recreate": "Gjenopprett",
+       "confirm-purge-title": "Slette mellomlagringen av denne siden",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Vil du slette tjenerens mellomlagrede versjon (''cache'') av denne siden?",
        "confirm-purge-bottom": "Rensing av en side sletter mellomlageret og tvinger frem den nyeste versjonen.",
        "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-restore": "$1 {{GENDER:$2|gjenopprettet}} siden $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|gjenopprettet}} siden $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|gjenopprettet}} siden $3",
+       "restore-count-revisions": "{{PLURAL:$1|Én revisjon|$1 revisjoner}}",
+       "restore-count-files": "{{PLURAL:$1|Én fil|$1 filer}}",
        "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",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|endret}} synligheten av logghendelser på $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|oppdaterte}} merker på revisjonen $4 av siden $3\n({{PLURAL:$7|la til}} $6; {{PLURAL:$9|fjernet}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|oppdaterte}} merker på loggposten $5 til siden $3\n({{PLURAL:$7|la til}} $6; {{PLURAL:$9|fjernet}} $8)",
        "rightsnone": "(ingen)",
-       "revdelete-summary": "redigeringssammendrag",
        "rightslogentry-temporary-group": "$1 (midlertidig, til $2)",
        "feedback-adding": "Tilføyer tilbakmelding til side ...",
        "feedback-back": "Tilbake",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laotisk",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Kanadisk stavelsesskrift",
        "special-characters-title-endash": "tankestrek",
        "special-characters-title-emdash": "lang tankestrek",
        "special-characters-title-minus": "minustegn",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Legg til en kategori …",
        "mw-widgets-usersmultiselect-placeholder": "Legg til flere ...",
+       "date-range-from": "Fra dato:",
+       "date-range-to": "Til dato:",
        "sessionmanager-tie": "Kan ikke kombinere flere forespørselsautentiseringstyper: $1",
        "sessionprovider-generic": "$1 sesjoner",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "informasjons&shy;kapsel-baserte sesjoner",
        "restrictionsfield-label": "Tillatte IP-intervaller:",
        "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk: <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisjon $1",
-       "pageid": "side-ID $1"
+       "pageid": "side-ID $1",
+       "rawhtml-notallowed": "&lt;html&gt;-tagger kan ikke brukes utenfor normale sider.",
+       "gotointerwiki": "Forlater {{SITENAME}}",
+       "gotointerwiki-invalid": "Den gitte tittelen var ugyldig.",
+       "gotointerwiki-external": "Du er i ferd med å forlate {{SITENAME}} for å besøke [[$2]], som er et annet nettsted.\n\n[$1 Klikk her for å fortsette til $1].",
+       "undelete-cantedit": "Du kan ikke gjenopprette denne siden fordi du ikke har tillatelse til å redigere den.",
+       "undelete-cantcreate": "Du kan ikke gjenopprette denne siden fordi det ikke er noen eksisterende side med dette navnet, og du ikke har tillatelse til å opprette siden."
 }
index 14f05dc..c4c8b8c 100644 (file)
        "externaldberror": "Der gung iets fout bie de externe authentisering, of je maggen je gebrukersprofiel niet bewarken.",
        "login": "Anmelden",
        "nav-login-createaccount": "Anmelden",
-       "userlogin": "Anmelden / inschrieven",
-       "userloginnocreate": "Anmelden",
        "logout": "Aofmelden",
        "userlogout": "Aofmelden",
        "notloggedin": "Niet an-emeld",
        "userlogin-noaccount": "He'j nog gien gebrukersnaam?",
        "userlogin-joinproject": "Wörd lid van {{SITENAME}}",
-       "nologin": "He'j nog gien gebrukersnaam? $1.",
-       "nologinlink": "Maak n gebrukersprofiel an",
        "createaccount": "Inschrieven",
-       "gotaccount": "Stao'j al in-eschreven? '''$1'''.",
-       "gotaccountlink": "Anmelden",
-       "userlogin-resetlink": "Bi'j de anmeldgegevens kwiet?",
        "userlogin-resetpassword-link": "Joew wachtwoord vergeten?",
        "userlogin-helplink2": "Hulpe bie t anmelden",
        "userlogin-loggedin": "Je bin al an-emeld as {{GENDER:$1|$1}}.\nGebruuk t onderstaonde formulier um an te melden as n aandere gebruker.",
        "createacct-another-email-ph": "Vul joew netpostadres in",
        "createaccountmail": "Gebruuk n tiejelik wachtwoord dat joe netzelde is en stuur t naor t op-egeven netpostadres",
        "createacct-realname": "Echte naam (niet verplicht)",
-       "createaccountreason": "Reden:",
        "createacct-reason": "Reden",
        "createacct-reason-ph": "Waorumme je n aandere gebrukerskonto anmaken",
        "createacct-submit": "Gebrukerskonto anmaken",
        "passwordreset-emaildisabled": "Netpostmeugelikhejen bin uutezet op disse wiki.",
        "passwordreset-username": "Gebruker:",
        "passwordreset-domain": "Domein:",
-       "passwordreset-capture": "De resulterende netpost bekieken?",
-       "passwordreset-capture-help": "A'j dit vakjen anvinken, dan krie'j t netpostbericht te zien (mit t tiejelike wachtwoord) en t wördt naor de gebruker estuurd.",
        "passwordreset-email": "Netpostadres:",
        "passwordreset-emailtitle": "Gebrukersgegevens op {{SITENAME}}",
        "passwordreset-emailtext-ip": "Der hef der ene, waorschienlik jie zelf vanaof t IP-adres $1, n anvraag edaon um joew wachtwoord veur {{SITENAME}} ($4) opniej in te stellen.\nDe volgende {{PLURAL:$3|gebruker is|gebrukers bin}} ekoppeld an dit netpostadres:\n\n$2\n\n{{PLURAL:$3|Dit tiejelike wachtwoord vervölt|Disse tiejelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.\nMeld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon hebben, of a'j t oorspronkelike wachtwoord nog kennen en t niet wiezigen willen, negeer dit bericht dan en blief joew ouwe wachtwoord gebruken.",
        "preview": "Naokieken",
        "showpreview": "Bewarking naokieken",
        "showdiff": "Verschil bekieken",
-       "blankarticle": "<strong>Waorschuwing:</strong> de zied die'j anmaken willen is leeg.\nA'j noen weer op \"{{int:savearticle}}\" klikken, dan wördt de zied an-emaakt zonder enige inhoud.",
+       "blankarticle": "<strong>Waorschuwing:</strong> de zied die'j anmaken willen is leeg.\nA'j noen weer op \"$1\" klikken, dan wördt de zied an-emaakt zonder enige inhoud.",
        "anoneditwarning": "<strong>Waorschuwing:</strong> je bin niet an-emeld.\nJoew IP-adres zal op-esleugen wörden a'j wiezigingen op disse zied anbrengen. A'j je eigen <strong>[$1 anmelden]</strong> of <strong>[$2 inschrieven]</strong> dan koemen joew bewarkingen onder joew gebrukersnaam te staon, samen mit aandere veurdelen.",
        "anonpreviewwarning": "''Je bin niet an-emeld.''\n''Deur de bewarking op te slaon wörden joew IP-adres op-esleugen in de ziedgeschiedenisse.''",
        "missingsummary": "'''Herinnering:''' je hebben gien samenvatting op-egeven veur de bewarking. A'j noen weer op ''Opslaon'' klikken wörden de bewarking zonder samenvatting op-esleugen.",
        "missingcommenttext": "Plaots joew opmarking hieronder.",
-       "missingcommentheader": "<strong>Waorschuwing:</strong> je hebben der gien onderwarptitel bie ezet. A'j noen weer op \"{{int:savearticle}}\" klikken, dan wörden de bewarking op-esleugen zonder onderwarptitel.",
+       "missingcommentheader": "<strong>Waorschuwing:</strong> je hebben der gien onderwarptitel bie ezet. A'j noen weer op \"$1\" klikken, dan wörden de bewarking op-esleugen zonder onderwarptitel.",
        "summary-preview": "Samenvatting naokieken:",
        "subject-preview": "Onderwarp naokieken:",
        "blockedtitle": "Gebruker is eblokkeerd",
        "editingsection": "Bewarken: $1 (deelzied)",
        "editingcomment": "Bewarken: $1 (niej onderwarp)",
        "editconflict": "Tegelieke bewörken: $1",
-       "explainconflict": "'''NB:''' n aander hef disse zied ewiezigd naoda'j an disse bewarking begunnen bin.\nt Bovenste bewarkingsveld löt de zied zien zo as t noen is.\nDaoronder (bie \"Wiezigingen\") staon de verschillen tussen joew versie en de op-esleugen zied.\nHelemaole onderan (bie \"Joew tekste\") steet nog n bewarkingsveld mit joew versie.\nJe zullen je eigen wiezigingen in de nieje tekste in mutten passen.\n'''Allinnig''' de tekste in t bovenste veld wörden beweerd a'j noen kiezen veur \"{{int:savearticle}}\".",
+       "explainconflict": "'''NB:''' n aander hef disse zied ewiezigd naoda'j an disse bewarking begunnen bin.\nt Bovenste bewarkingsveld löt de zied zien zo as t noen is.\nDaoronder (bie \"Wiezigingen\") staon de verschillen tussen joew versie en de op-esleugen zied.\nHelemaole onderan (bie \"Joew tekste\") steet nog n bewarkingsveld mit joew versie.\nJe zullen je eigen wiezigingen in de nieje tekste in mutten passen.\n'''Allinnig''' de tekste in t bovenste veld wörden beweerd a'j noen kiezen veur \"$1\".",
        "yourtext": "Joew tekste",
        "storedversion": "Op-esleugen versie",
        "nonunicodebrowser": "'''Waorschuwing: joew webkieker kan niet goed mit unikode uut de voten, schakel over op n aandere webkieker um de wiezigingen an te brengen!'''",
        "saveprefs": "Veurkeuren opslaon",
        "restoreprefs": "Alle standardinstellingen weerummezetten (veur alle seksies)",
        "prefs-editing": "Bewarkingsveld",
-       "rows": "Regels",
-       "columns": "Kolommen",
        "searchresultshead": "Zeukresultaoten",
        "stub-threshold": "Verwiezingsformattering van beginnetjes ($1):",
        "stub-threshold-sample-link": "veurbeeld",
        "userrights-reason": "Reden:",
        "userrights-no-interwiki": "Je hebben gien rechten um gebrukersrechten op aandere wiki's te wiezigen.",
        "userrights-nodatabase": "Databanke $1 besteet niet of is gien plaotselike databanke.",
-       "userrights-nologin": "Je mutten [[Special:UserLogin|an-emeld]] ween en as gebruker de juuste rechten hebben um gebrukersrechten toe te kunnen wiezen.",
-       "userrights-notallowed": "Je hebben gien rechten um gebrukersrechten toe te kunnen wiezen of in te trekken.",
        "userrights-changeable-col": "Groepen die'j beheren kunnen",
        "userrights-unchangeable-col": "Groepen die'j niet beheren kunnen",
        "userrights-conflict": "Konflikt bie t wiezigen van gebrukersrechten! Kiek joew wiezigingen nao en bevestig t.",
-       "userrights-removed-self": "Je hebben joew eigen bevoegdhejen in-etrökken. Je kunnen disse zied niet meer gebruken.",
        "group": "Groep:",
        "group-user": "gebrukers",
        "group-autoconfirmed": "an-emelde gebrukers",
        "right-editprotected": "Ziejen bewarken die beveiligd bin as \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Ziejen bewarken die beveiligd bin as \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "Systeemteksten bewarken",
-       "right-editusercssjs": "De CSS- en JS-bestaanden van aandere gebrukers bewarken",
        "right-editusercss": "De CSS-bestaanden van aandere gebrukers bewarken",
        "right-edituserjs": "De JS-bestaanden van aandere gebrukers bewarken",
        "right-editmyusercss": "Joew eigen CSS-ziejen bewarken",
        "right-siteadmin": "De databanke blokkeren en weer vriegeven",
        "right-override-export-depth": "Ziejen exporteren, oek de ziejen waor naor verwezen wördt, tot n diepte van 5",
        "right-sendemail": "Bericht versturen naor aandere gebrukers",
-       "right-passwordreset": "Bekiek netpostberichten veur t opniej instellen van joew wachtwoord",
        "newuserlogpage": "Logboek mit anwas",
        "newuserlogpagetext": "Hieronder staon de niej in-eschreven gebrukers",
        "rightslog": "Gebrukersrechtenlogboek",
        "rcshowhidecategorization": "$1 kategorisering van ziejen",
        "rcshowhidecategorization-show": "Bekiek",
        "rcshowhidecategorization-hide": "Verbarg",
-       "rclinks": "Bekiek de leste $1 wiezigingen van de aofgeleupen $2 dagen<br />$3",
+       "rclinks": "Bekiek de leste $1 wiezigingen van de aofgeleupen $2 dagen",
        "diff": "wiez",
        "hist": "gesch",
        "hide": "verbarg",
        "undeleteviewlink": "bekieken",
        "undeleteinvert": "Seleksie ummekeren",
        "undeletecomment": "Reden:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|versie|versies}} weerummeplaotst",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestaand|$2 bestaanden}} bin weerummeplaotst",
-       "undeletedfiles": "{{PLURAL:$1|1 bestaand|$1 bestaanden}} weerummeplaotst",
        "cannotundelete": "t Weerummeplaotsen is mislokt:\n$1",
        "undeletedpage": "'''$1 is weerummeplaotst'''\n\nBekiek t [[Special:Log/delete|vortdologboek]] veur n overzicht van ziejen die kortens vortedaon en weerummeplaotst bin.",
        "undelete-header": "Zie t [[Special:Log/delete|vortdologboek ]] veur spul dat krek vortedaon is.",
        "logentry-upload-upload": "$1 hef $3 {{GENDER:$2|op-estuurd}}",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|hef}} n nieje versie van $3 op-elaojen",
        "rightsnone": "(gien)",
-       "revdelete-summary": "samenvatting bewarken",
        "feedback-adding": "Joew kommentaar wörden op de zied ezet...",
        "feedback-bugcheck": "Mooi! Kiek nao of t niet al één van de [$1 bekende problemen] is.",
        "feedback-bugnew": "Ik heb t nao-ekeken. Meld n nieje programmafout",
        "feedback-thanks": "Bedankt! Joew kommentaar is op de zied \"[$2 $1]\" ezet.",
        "searchsuggest-search": "Zeuken / zuken / zuiken",
        "searchsuggest-containing": "bevat...",
-       "api-error-badaccess-groups": "Je maggen gien bestaanden in disse wiki oplaojen.",
        "api-error-badtoken": "Interne fout: t token klopt niet.",
-       "api-error-copyuploaddisabled": "Bestaanden opsturen via n webadres is uutezet op disse server.",
-       "api-error-duplicate": "Der {{PLURAL:$1|steet al n bestaand|staon al bestaanden}} mit de zelfde inhoud in de wiki.",
-       "api-error-duplicate-archive": "Der {{PLURAL:$1|was al n aander bestaand|waren al $1 aandere bestaanden}}  op de webstee mit de zelfde inhoud, mer {{PLURAL:$1|dat is|die bin}} vortedaon.",
-       "api-error-empty-file": "t Bestaand da'j op-estuurd hebben is leeg.",
        "api-error-emptypage": "Je maggen gien lege nieje ziejen anmaken.",
-       "api-error-fetchfileerror": "Interne fout: der is iets verkeerd egaon mit t ophaolen van t bestaand.",
-       "api-error-fileexists-forbidden": "Der besteet al n bestaand mit de naam \"$1\" die niet overschreven kan wörden.",
-       "api-error-fileexists-shared-forbidden": "Der besteet al n bestaand mit de naam \"$1\" in de edeelden bestaandsarchief dat niet overschreven kan wörden.",
-       "api-error-file-too-large": "t Bestaand da'j op-estuurd hebben is te groot.",
-       "api-error-filename-tooshort": "De bestaandsnaam is te kort.",
-       "api-error-filetype-banned": "Dit bestaandstype is niet toe-estaon.",
-       "api-error-filetype-banned-type": "{{PLURAL:$4|t Bestaandstype $1|De bestaandstypes $1}} wörden niet toe-eleuten. {{PLURAL:$3|t Toe-estaone bestaandstype is|De toe-estaone bestaandstypen bin}} $2.",
-       "api-error-filetype-missing": "t Bestaand hef gien extensie.",
-       "api-error-hookaborted": "De wieziging die'j proberen deur te voeren is aofebreuken deur n extra uutbreiding.",
-       "api-error-http": "Interne fout: der kon gien verbiending emaakt wörden mit de server.",
-       "api-error-illegal-filename": "Disse bestaandsnaam mag niet.",
-       "api-error-internal-error": "Interne fout: der is iets verkeerd egaon tiejens t verwarken van joew op-estuurden bestaand deur de wiki.",
-       "api-error-invalid-file-key": "Interne fout: t bestaand stung niet in de tiedelike opslag.",
-       "api-error-missingparam": "Interne fout: niet alle parameters bin in t verzeuk mee-eleverd.",
-       "api-error-missingresult": "Interne fout: kon niet vaststellen of t kopiëren wel wol lokken.",
-       "api-error-mustbeloggedin": "Je mutten an-emeld ween um bestaanden te kunnen opsturen.",
-       "api-error-mustbeposted": "Der zit n fout in de programmatuur. Der wörden gien gebruukemaakt van de juuste HTTP-methode.",
-       "api-error-noimageinfo": "t Opsturen van t bestaand is aoferond, mer de server hef gien gegevens over t bestaand egeven.",
-       "api-error-nomodule": "Interne fout: der is gien inlaojmodule in-esteld.",
-       "api-error-ok-but-empty": "Interne fout: de server hef gien gegevens weerestuurd.",
-       "api-error-overwrite": "Je maggen gien bestaond bestaand overschrieven.",
-       "api-error-stashfailed": "Interne fout: de server kon t tiedelike bestaand niet opslaon.",
        "api-error-publishfailed": "Interne fout: de server kon t tiejelike bestaand niet publiseren.",
-       "api-error-timeout": "De server hef niet binnen de verwachte tied antwoord egeven.",
-       "api-error-unclassified": "Der is n onbekende fout op-etrejen",
-       "api-error-unknown-code": "Interne fout: \"$1\"",
-       "api-error-unknown-error": "Interne fout: der is iets verkeerd egaon tiejens t opsturen van joew bestaand.",
+       "api-error-stashfailed": "Interne fout: de server kon t tiedelike bestaand niet opslaon.",
        "api-error-unknown-warning": "Onbekende waorschuwing: $1",
        "api-error-unknownerror": "Onbekende fout: \"$1\"",
-       "api-error-uploaddisabled": "Je kunnen gien bestaanden opsturen in deze wiki.",
-       "api-error-verification-error": "Dit bestaand is meugelik beschaodigd of hef n onjuuste extensie.",
        "duration-seconds": "$1 {{PLURAL:$1|sekonde|sekonden}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuut|minuten}}",
        "duration-hours": "$1 {{PLURAL:$1|uur|uren}}",
index b99b7eb..448eb9e 100644 (file)
        "externaldberror": "Dat geev en Fehler bi de externe Authentifizerungsdatenbank oder du dröffst dien extern Brukerkonto nich ännern.",
        "login": "Anmellen",
        "nav-login-createaccount": "Nee Konto anleggen oder anmellen",
-       "userlogin": "Nee Konto anleggen oder anmellen",
-       "userloginnocreate": "Anmellen",
        "logout": "Afmellen",
        "userlogout": "Afmellen",
        "notloggedin": "Nich anmellt",
        "userlogin-joinproject": "Bi {{SITENAME}} anmellen",
-       "nologin": "Wenn du noch keen Brukerkonto hest, denn kannst di anmellen: $1.",
-       "nologinlink": "Brukerkonto inrichten",
        "createaccount": "Nieg Brukerkonto anleggen",
-       "gotaccount": "Hest Du al en Brukerkonto? '''$1'''.",
-       "gotaccountlink": "Anmellen",
-       "userlogin-resetlink": "De Anmelldaten vergaten?",
        "userlogin-resetpassword-link": "Passwoort vergeten?",
        "userlogin-helplink2": "Hülp bi dat anmellen",
        "createaccountmail": "över E-Mail",
-       "createaccountreason": "Grund:",
        "createacct-submit": "Brukerkonto inrichten",
        "badretype": "De beiden Passwöör stimmt nich övereen.",
        "userexists": "Disse Brukernaam is al weg. Bitte söök di en annern ut.",
        "editingsection": "Ännern vun $1 (Afsatz)",
        "editingcomment": "Ännern vun $1 (nee Afsnidd)",
        "editconflict": "Konflikt bi’t Sied ännern: $1",
-       "explainconflict": "En annern Bruker hett disse Sied ännert, na de Tied dat du anfungen hest, de Sied to ännern.\nDat Textfeld baven wiest de aktuelle Sied.\nDat Textfeld ünnen wiest dien Ännern.\nFöög dien Ännern in dat Textfeld baven in.\n'''Blots''' de Text in dat Textfeld baven warrt spiekert, wenn du op \"{{int:savearticle}}\" klickst!",
+       "explainconflict": "En annern Bruker hett disse Sied ännert, na de Tied dat du anfungen hest, de Sied to ännern.\nDat Textfeld baven wiest de aktuelle Sied.\nDat Textfeld ünnen wiest dien Ännern.\nFöög dien Ännern in dat Textfeld baven in.\n'''Blots''' de Text in dat Textfeld baven warrt spiekert, wenn du op \"$1\" klickst!",
        "yourtext": "Dien Text",
        "storedversion": "Spiekerte Version",
        "nonunicodebrowser": "'''Wohrschau: Dien Browser kann keen Unicode, bruuk en annern Browser, wenn du en Siet ännern wist.'''",
        "saveprefs": "Spiekern",
        "restoreprefs": "All Standardinstellungen wedderhalen",
        "prefs-editing": "Grött vun’t Textfeld",
-       "rows": "Regen",
-       "columns": "Spalten",
        "searchresultshead": "Söökresultaten",
        "stub-threshold": "Grött ünner de Lenken op <a href=\"#\" class=\"stub\">Stubbens un lütte Sieden</a> farvlich kenntekent warrn schöölt (in Bytes):",
        "stub-threshold-disabled": "Utstellt",
        "userrights-reason": "Grund:",
        "userrights-no-interwiki": "Du hest nich de Rechten, Brukerrechten in annere Wikis to setten.",
        "userrights-nodatabase": "Datenbank $1 gifft dat nich oder is nich lokal.",
-       "userrights-nologin": "Du musst mit en Administrater-Brukerkonto [[Special:UserLogin|anmellt]] wesen, dat du Brukerrechten ännern kannst.",
-       "userrights-notallowed": "Du hest nich de Rechten, Brukerrechten to setten.",
        "userrights-changeable-col": "Gruppen, de du ännern kannst",
        "userrights-unchangeable-col": "Gruppen, de du nich ännern kannst",
        "group": "Grupp:",
        "right-protect": "Schuulstatus vun Sieden ännern",
        "right-editprotected": "Schuulte Sieden ännern (ahn Kaskadensperr)",
        "right-editinterface": "Systemnarichten ännern",
-       "right-editusercssjs": "Anner Lüüd ehr CSS- un JS-Datein ännern",
        "right-editusercss": "Anner Lüüd ehr CSS-Datein ännern",
        "right-edituserjs": "Anner Lüüd ehr JS-Datein ännern",
        "right-rollback": "Sieden gau trüchdreihn",
        "rcshowhidemine-show": "wiesen",
        "rcshowhidemine-hide": "versteken",
        "rcshowhidecategorization": "kategoriserung vun Sieden $1",
-       "rclinks": "Wies de letzten '''$1''' Ännern vun de letzten '''$2''' Daag. ('''N''' - Ne’e Sieden; '''L''' - Lütte Ännern)<br />$3",
+       "rclinks": "Wies de letzten '''$1''' Ännern vun de letzten '''$2''' Daag. ('''N''' - Ne’e Sieden; '''L''' - Lütte Ännern)",
        "diff": "Ünnerscheed",
        "hist": "Versionen",
        "hide": "Nich wiesen",
        "undeleteviewlink": "bekieken",
        "undeleteinvert": "Utwahl ümkehrn",
        "undeletecomment": "Grund:",
-       "undeletedrevisions": "{{PLURAL:$1|ene Version|$1 Versionen}} wedderhaalt",
-       "undeletedrevisions-files": "{{PLURAL:$1|Ene Version|$1 Versionen}} un {{PLURAL:$2|ene Datei|$2 Datein}} wedderhaalt",
-       "undeletedfiles": "{{PLURAL:$1|ene Datei|$1 Datein}} wedderhaalt",
        "cannotundelete": "Wedderhalen güng nich; en annern hett de Siet al wedderhaalt.",
        "undeletedpage": "'''$1''' wedderhaalt.\n\nIn dat [[Special:Log/delete|Lösch-Logbook]] steiht en Översicht över de wegsmetenen un wedderhaalten Sieden.",
        "undelete-header": "Kiek in dat [[Special:Log/delete|Lösch-Logbook]] för Sieden, de nuletzt wegsmeten worrn sünd.",
        "logentry-block-block": "$1 {{GENDER:$2|block}} {{GENDER:$4|$3}} för en Tiedruum vun $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|block}} {{GENDER:$4|$3}} för en Tiedruum vun $5 $6",
        "rightsnone": "(kene)",
-       "revdelete-summary": "Tosamenfaten",
        "searchsuggest-search": "Söken",
        "expandtemplates": "Vörlagen oplösen",
        "expand_templates_intro": "Mit disse Spezialsied köönt Vörlagen in ingeven Text in Wikitext ümwannelt warrn.\nOk Parserfunkschonen so as\n<nowiki>{{</nowiki>#language:…}}, un Variabeln so as\n<nowiki>{{</nowiki>CURRENTDAY}} warrt ümwannelt. Also so temlich allens, wat twischen swiefte Klammern steit.\nDorto warrt de nödigen Parser-Phasen in MediaWiki direkt opropen.",
index bc84842..d81b569 100644 (file)
@@ -23,7 +23,8 @@
                        "Matma Rex",
                        "जनक राज भट्ट",
                        "Suniltheblue",
-                       "Irus"
+                       "Irus",
+                       "रमेश सिंह बोहरा"
                ]
        },
        "tog-underline": "रेखाङ्कित लिङ्क:",
        "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": "आयोजना पृष्ठ हेर्ने",
        "userlogin-remembermypassword": "मलाई प्रवेश गराइराख्ने",
        "userlogin-signwithsecure": "सुक्षित जडान प्रयोग गर्ने",
        "cannotlogin-title": "मा लग गर्न सक्दैनौं",
+       "cannotlogin-text": "लगइन गर्न सम्भव छैन ।",
+       "cannotloginnow-title": "अहिले लग आउट गर्न सकिन्न",
+       "cannotloginnow-text": "$1 को उपयोग गरुन्जेल लगइन हुन सक्दैन ।",
        "cannotcreateaccount-title": "सिर्जना गर्न सकिँदैन खाता",
        "cannotcreateaccount-text": "प्रत्यक्ष खाता सिर्जना सक्षम छैन on this wiki.",
        "yourdomainname": "तपाईंको ज्ञानक्षेत्र(डोमेन):",
        "password-change-forbidden": "यो विकिमा पासवर्ड परिवर्तन गर्न सक्नुहुन्न।",
        "externaldberror": "यहाँ प्रमाणिकरण डेटाबेस त्रुटि भयो या त तपाईंलाई आफ्नो बाहिरी खाता अद्यतन गर्ने अनुमति छैन।",
        "login": "प्रवेश",
+       "login-security": "तपाईंको परिचर प्रमाणित गर्नुहोस् ।",
        "nav-login-createaccount": "प्रवेश गर्ने/नयाँ खाता बनाउने",
-       "userlogin": "प्रवेश गर्ने / नयाँ खाता बनाउने",
-       "userloginnocreate": "लग इन",
        "logout": "निर्गमन",
        "userlogout": "निर्गमन (लग आउट)",
        "notloggedin": "प्रवेश (लग ईन) नगरिएको",
        "userlogin-noaccount": "के खाता छैन ?",
        "userlogin-joinproject": "{{SITENAME}} मा खाता खोल्नुहोस् ।",
-       "nologin": "तपाईंको खाता छैन ? $1।",
-       "nologinlink": "नयाँ खाता खोल्नुहोस्",
        "createaccount": "खाता खोल्नुहोस्",
-       "gotaccount": "के तपाईँसँग पहिले देखि नै खाता छ ? '''$1''' ।",
-       "gotaccountlink": "लग इन",
-       "userlogin-resetlink": "प्रवेश सम्बन्धी विवरणहरू बिर्सनु भयो?",
        "userlogin-resetpassword-link": "पासवर्ड भुल्नुभयो?",
        "userlogin-helplink2": "प्रवेश गर्नको लागि सहयोग",
        "userlogin-loggedin": "तपाईं {{GENDER:$1|$1}}को रूपमा प्रवेश (लग इन) भइ सक्नु भयो ।\nअर्को प्रयोगकर्ताको रूपमा प्रवेश (लग इन) गर्न तलको फारम प्रयोग गर्नुहोस् ।",
        "createacct-another-email-ph": "इमेल ठेगाना भर्नुहोस्",
        "createaccountmail": "कुनै अस्थाई र श्रिजित पासवर्ड प्रयोग गर्ने र खुलाईएको इमेलमा पठाउने",
        "createacct-realname": "वास्तविक नाम (ऐच्छिक)",
-       "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "किन तपाईं नयाँ खाता खोलिरहनु भएको हो ?",
        "createacct-submit": "तपाईंको खाता सिर्जना गर्नुहोस",
        "eauthentsent": "दिइएको इमेल ठेगानामा इमेल पठाइएको छ ।\nतपाईंको खातामा अरु इमेल पठउनु अघि , इमेलमा लेखिएको मार्गदर्शन अनुसार , त्यो खाता तपाईंकै हो भनेर निश्चित गर्नु पर्नेछ ।",
        "throttled-mailpassword": "बितेको {{PLURAL:$1|घण्टा|$1 घण्टाहरु}} भित्र एउटा पासवर्ड अनुस्मारक पठाई सकिएको छ।\nदुरुपयोगबाट बचाउकोलागि प्रत्येक {{PLURAL:$1|घण्टा|$1 घण्टाहरु}}मा केवल एउटा पासवर्ड अनुस्मारक पठाइन्छ।",
        "mailerror": " चिठी :$1 पठाउँदा त्रुटी भयो",
-       "acct_creation_throttle_hit": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\86à¤\88पà¥\80 à¤ à¥\87à¤\97ानाबाà¤\9f à¤\86à¤\8fà¤\95ा à¤\86à¤\97नà¥\8dतà¥\81à¤\95दà¥\8dवारा à¤¬à¤¿à¤¤à¥\87à¤\95à¥\8b à¤\9aà¥\8cबिस à¤\98णà¥\8dà¤\9fामा à¤¯à¤¸ à¤µà¤¿à¤\95िमा {{PLURAL:$1|à¤\8fà¤\89à¤\9fा à¤\96ाता à¤¬à¤¨à¤¾à¤\87सà¤\95िà¤\8fà¤\95à¥\8b à¤\9b|$1 à¤\96ाताहरà¥\81 à¤¬à¤¨à¤¾à¤\87सà¤\95िà¤\8fà¤\95ा à¤\9bनà¥\8d}}, à¤¯à¤¸ à¤¸à¤®à¤¯à¤¾à¤µà¤§à¤¿à¤®à¤¾ à¤¯à¤¤à¤¿ à¤¨à¥\88à¤\82 à¤\85धिà¤\95तम à¤¸à¥\80मा à¤¹à¥\8b।\nà¤\85तà¤\83 à¤¯à¤¸ à¤¸à¤®à¤¯ à¤¯à¤¸ à¤\86à¤\88पà¥\80 à¤ à¥\87à¤\97ानाà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनà¥\87 à¤\86à¤\97नà¥\8dतà¥\81à¤\95लà¥\87 à¤\85रà¥\81 à¤\96ाता à¤\96à¥\8bलà¥\8dन à¤¸à¤\95à¥\8dनà¥\87à¤\9bà¥\88ननà¥\8d।",
+       "acct_creation_throttle_hit": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\86à¤\88पà¥\80 à¤ à¥\87à¤\97ानाबाà¤\9f à¤\86à¤\8fà¤\95ा à¤\86à¤\97नà¥\8dतà¥\81à¤\95दà¥\8dवारा à¤¬à¤¿à¤¤à¥\87à¤\95à¥\8b à¤\9aà¥\8cबिस à¤\98णà¥\8dà¤\9fामा à¤¯à¤¸ à¤µà¤¿à¤\95िमा {{PLURAL:$1|à¤\8fà¤\89à¤\9fा à¤\96ाता à¤¬à¤¨à¤¾à¤\87सà¤\95िà¤\8fà¤\95à¥\8b à¤\9b|$1 à¤\96ाताहरà¥\82 à¤¬à¤¨à¤¾à¤\87सà¤\95िà¤\8fà¤\95ा à¤\9bनà¥\8d}}, à¤¯à¤¸ à¤¸à¤®à¤¯à¤¾à¤µà¤§à¤¿à¤®à¤¾ à¤¯à¤¤à¤¿ à¤¨à¥\88à¤\82 à¤\85धिà¤\95तम à¤¸à¥\80मा à¤¹à¥\8b à¥¤\nà¤\85तà¤\83 à¤¯à¤¸ à¤¸à¤®à¤¯ à¤¯à¤¸ à¤\86à¤\88पà¥\80 à¤ à¥\87à¤\97ानाà¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनà¥\87 à¤\86à¤\97नà¥\8dतà¥\81à¤\95लà¥\87 à¤\85रà¥\81 à¤\96ाता à¤\96à¥\8bलà¥\8dन à¤¸à¤\95à¥\8dनà¥\87à¤\9bà¥\88ननà¥\8d ।",
        "emailauthenticated": "तपाईंको इमेल ठेगाना $2 को $3 मा प्रमाणित गरिएको थियो।",
        "emailnotauthenticated": "तपाईंको इमेल ठेगाना अहिले सम्म प्रमाणित गरिएको छैन ।\nनिम्न सुविधाको लागि कुनै पनि इमेल पठाइने छैन ।",
        "noemailprefs": "निम्न सुविधाहरू राम्ररी काम गर्नको लागि तपाईंको अभिरुचिमा आफ्नो ई-मेल ठेगाना खुलाउनुहोस् ।",
        "createaccount-title": "{{SITENAME}}कोलागि खाता खोल्ने काम",
        "createaccount-text": "कसैले तपाईंको इमेल ठेगानालाई {{SITENAME}} ($4) मा \"$2\" नामको खाता बनाएको छ, जसको पासवर्ड \"$3\" छ ।\nअब तपाईं तुरुन्त लगइन गरेर आफ्नो प्रवेसशब्द परिवर्तन गर्नुहोला ।\nयदी यो खाता गल्तिले खोलिएको रहेछ भने तपाईं यो सन्देशलाई बेवास्ता गर्न सक्नुहुन्छ ।",
        "login-throttled": "तपाईंले भर्खरै धेरै पल्ट प्रवेशको निम्ति प्रयास गर्नुभएको छ ,कृपया $1 पर्खेर मात्र प्रयास गर्नुहोस्।",
-       "login-abort-generic": "तपाà¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरवà¥\87श à¤\85सफल à¤­à¤¯à¥\8b - à¤\9bà¥\8bड़ियो",
+       "login-abort-generic": "तपाà¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरवà¥\87श à¤\85सफल à¤­à¤¯à¥\8b - à¤°à¥\8bà¤\95ियो",
        "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": "PHP मेल() क्रियामा अज्ञात त्रुटि",
        "resetpass_submit": "पासवर्ड व्यवस्थित गरी र प्रवेशगर्ने",
        "changepassword-success": "तपाईंको पासवर्ड सफलतापूर्वक परिवर्तन भयो!",
        "changepassword-throttled": "तपाईंले भर्खरै धेरै पल्ट प्रवेश (लग इन)को निम्ति प्रयास गर्नुभएको छ। \nकृपया $1 पर्खेर मात्र प्रयास गर्नुहोस्।",
+       "botpasswords": "बोट पासवर्ड",
+       "botpasswords-createnew": "नयाँ बोटको लागि पासवर्ड बनाउने",
+       "botpasswords-label-appid": "बोट नाम",
+       "botpasswords-label-create": "बनाउनुहोस्",
+       "botpasswords-label-update": "अद्यतन गर्ने (अपडेट)",
+       "botpasswords-label-cancel": "रद्द गर्ने",
+       "botpasswords-label-delete": "मेट्ने",
+       "botpasswords-label-resetpassword": "प्रवेसशब्द पुनः तय गर्ने",
        "resetpass_forbidden": "पासवर्ड परिवर्तन गर्न मिल्दैन",
        "resetpass-no-info": "यो पृष्ठ सिधै हेर्नको लागि तपाईंले प्रवेश गर्नुपर्छ ।",
        "resetpass-submit-loggedin": "प्रवेसशब्द परिवर्तन गर्ने",
        "watchthis": "यो पृष्ठ अवलोकन गर्नुहोस्",
        "savearticle": "सङ्ग्रह गर्ने",
        "savechanges": "परिवर्तन सङ्ग्रह गर्नुहोस्",
+       "publishpage": "पृष्ठ प्रकाशित गर्ने",
+       "publishchanges": "परिवर्तनहरू प्रकाशित गर्ने",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वालोकन देखाउनुहोस्",
        "showdiff": "परिवर्तन देखाउनुहोस्",
-       "blankarticle": "<strong>चेतावनी:</strong> तपाईं एउटा खालि पृष्ठको निर्माण गर्दै हुनुहुन्छ।\nयदि तपाईं \"{{int:savearticle}}\" लाई पुनः थिच्नुहुन्छ भने पृष्ठ बिना कुनै सामग्री नै निर्मित गरिनेछ।",
+       "blankarticle": "<strong>चेतावनी:</strong> तपाईं एउटा खालि पृष्ठको निर्माण गर्दै हुनुहुन्छ।\nयदि तपाईं \"$1\" लाई पुनः थिच्नुहुन्छ भने पृष्ठ बिना कुनै सामग्री नै निर्मित गरिनेछ।",
        "anoneditwarning": "<strong>चेतावनी:</strong> तपाईंले प्रवेश गर्नु भएको छैन । तपाईंको आइपि ठेगाना पृष्ठ सम्पादन इतिहासमा दर्ता गरिने छ र यो सबैले हेर्न सक्छन् । यदि तपाईं <strong>[$1 लगईन]</strong> वा <strong>[$2 नयाँ खाता बनाउने] गर्नुभयो भने तपाईंद्वारा गरिएको सम्पादन तपाईंको प्रयोगकर्तानाममा जोडिनेछ ।",
        "anonpreviewwarning": "''तपाईंले प्रवेश गर्नु भएको छैन। संग्रह (Save) गरेको खण्डमा पृष्ठको इतिहासमा तपाईंको IP ठेगाना अंकित गरिनेछ।''",
-       "missingsummary": "'''यादगर्नुहोस् :''' तपाईंले सम्पादन सारांश दिनुभएको छैन ।\nयदि तपाईंले \"{{int:savearticle}}\"  थिच्नुभयो भने , सारांश बिना नै संग्रहित गरिने छ ।",
-       "selfredirect": "<strong>चेतावनी:</strong> तपाईं यस पृष्ठलाई आफुमा पुनः निर्देशित गर्दै हुनुहुन्छ।\nहुनसक्छ तपाईं अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गर्दै हुनुहुन्छ, वा गलत पृष्ठको सम्पादन गर्दै हुनुहुन्छ।\nतपाईं पुनः एकपटक \"{{int:savearticle}}\" क्लिक गर्नुहुन्छ, पुनः निर्देशित त्यसै पनि बनाइनेछ।",
+       "missingsummary": "'''यादगर्नुहोस् :''' तपाईंले सम्पादन सारांश दिनुभएको छैन ।\nयदि तपाईंले \"$1\"  थिच्नुभयो भने , सारांश बिना नै संग्रहित गरिने छ ।",
+       "selfredirect": "<strong>चेतावनी:</strong> तपाईं यस पृष्ठलाई आफुमा पुनः निर्देशित गर्दै हुनुहुन्छ।\nहुनसक्छ तपाईं अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गर्दै हुनुहुन्छ, वा गलत पृष्ठको सम्पादन गर्दै हुनुहुन्छ।\nतपाईं पुनः एकपटक \"$1\" क्लिक गर्नुहुन्छ, पुनः निर्देशित त्यसै पनि बनाइनेछ।",
        "missingcommenttext": "कृपया टिप्पणी प्रविष्ठ गर्नुहोस् ।",
-       "missingcommentheader": "<strong>याद गर्नुहोस् :</strong> तपाईंले टिप्पणीमा विषय /शीर्ष पंक्ति  दिनुभएको छैन ।\nतपाईंले फेरि \"{{int:savearticle}}\"  थिच्नु भएमा , तपाईंको सम्पादन यसै रुपमा सङ्ग्रहित हुनेछ ।",
+       "missingcommentheader": "<strong>याद गर्नुहोस् :</strong> तपाईंले टिप्पणीमा विषय /शीर्ष पंक्ति  दिनुभएको छैन ।\nतपाईंले फेरि \"$1\"  थिच्नु भएमा , तपाईंको सम्पादन यसै रुपमा सङ्ग्रहित हुनेछ ।",
        "summary-preview": "सारांश पूर्वालोकन:",
        "subject-preview": "विषय/शीर्षपंक्ति पूर्वरुप:",
        "previewerrortext": "तपाईंको परिवर्तनको पूर्वावलोकन बनाउन खोज्दा समस्या आएको छ ।",
        "editingsection": "$1 (खण्ड) सम्पादन गरिदै",
        "editingcomment": "$1 सम्पादन गर्दै(नयाँ खण्ड)",
        "editconflict": "सम्पादन बाँझियो: $1",
-       "explainconflict": "तपाईंले सम्पादन कार्य सुरु गरेपछि कसैले यस पृष्टलाई परिवर्तन गरेकोछ।\nमाथिल्लो पाठक्षेत्रमा पृष्ठको वर्तमान पाठ छ।\nतपाईंको परिवर्तन तल्लो भागमा दर्शाइएकोछ। \nतपाईंले गर्नुभएको परिवर्तनलाई वर्तमान पाठसित मिसाउनु पर्नेछ, यदि तपाईंले \"{{int:savearticle}}\" थिच्नु भयो भनें पाठको माथिल्लो भाग '''मात्र''' संग्रह गरिनेछ।",
+       "explainconflict": "तपाईंले सम्पादन कार्य सुरु गरेपछि कसैले यस पृष्टलाई परिवर्तन गरेकोछ।\nमाथिल्लो पाठक्षेत्रमा पृष्ठको वर्तमान पाठ छ।\nतपाईंको परिवर्तन तल्लो भागमा दर्शाइएकोछ। \nतपाईंले गर्नुभएको परिवर्तनलाई वर्तमान पाठसित मिसाउनु पर्नेछ, यदि तपाईंले \"$1\" थिच्नु भयो भनें पाठको माथिल्लो भाग '''मात्र''' संग्रह गरिनेछ।",
        "yourtext": "तपाईंका पाठहरु",
        "storedversion": "संग्रहित पुनरावलोकन",
        "nonunicodebrowser": "<strong>चेतावनी: तपाईंको ब्राउजर युनिकोडलाई स्वीकार गर्दैन।</strong> \nतपाईंद्वारा सहि रुपले पृष्ठ सम्पादनको लागि: गैर-एयससिआइआइ क्यारेक्टर हेक्जाडेसिमल कोड (hexadecimal) मा देखाइनेछ।",
        "search-interwiki-caption": "भगिनी आयोजना",
        "search-interwiki-default": "$1देखिका नतिजाहरू:",
        "search-interwiki-more": "(अझै)",
+       "search-interwiki-more-results": "धेरै परिणामहरू",
        "search-relatedarticle": "सम्बन्धित",
        "searchrelated": "सम्बन्धित",
        "searchall": "सबै",
        "showingresultsinrange": "देखाई रहेको छ{{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> परिणाम}} सम्म पहुँच  #<strong>$2</strong> देखि #<strong>$3</strong> मा।",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> मा बाट <strong>$1</strong> परिणाम|<strong>$3</strong> मा बाट परिणाम <strong>$1 - $2</strong>}}",
        "search-nonefound": "तपाईंको खोजसँग मेल खाने नतिजाहरू भेटिएनन्",
+       "search-nonefound-thiswiki": "तपाईंको खोजसित मेल खाने नतिजाहरू भेटिएन ।",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "नेमस्पेसेजहरूमा खोज्ने :",
        "powersearch-togglelabel": "जाँच्ने :",
        "search-external": "बाह्य खोज",
        "searchdisabled": "{{SITENAME}} खोज निस्क्रिय पारिएको छ ।\nहाललाई तपाईं गूगलद्वारा खोज्न सक्नुहुन्छ ।\nयाद गर्नुहोस् उनीहरूको {{SITENAME}}को सूची सामग्री पुरानो भएको हुनसक्छ ।",
        "search-error": "खोज्ने क्रममा समस्या देखियोः $1",
+       "search-warning": "खोज्ने क्रममा समस्या देखियोः $1",
        "preferences": "रोजाइहरू",
        "mypreferences": "प्राथमिकताहरू",
        "prefs-edits": "सम्पादन संख्या:",
        "restoreprefs": "सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमा)",
        "prefs-editing": "सम्पादन",
        "searchresultshead": "खोज",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
+       "stub-threshold": "ठूटो लिङ्कको लागि थ्रेसहोल्ड स्वरूपण ($1):",
        "stub-threshold-sample-link": "उदाहरण",
        "stub-threshold-disabled": "निष्क्रिय",
        "recentchangesdays": "हालको परिवर्तनमा देखाउने दिनहरू:",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" अनुरूप सुरक्षित गरिएको पृष्ठहरूलाई सम्पादन गर्नुहोस्",
        "right-editcontentmodel": "पृष्ठको सामग्री नमुना सम्पादन",
        "right-editinterface": "प्रयोगकर्ता अन्तरमोहडा सम्पादन गर्ने",
-       "right-editusercssjs": "अरु प्रयोगकर्ताको CSS र JS फाइलहरू सम्पादन गर्ने",
        "right-editusercss": "अरु प्रयोगकर्ताको CSS फाइलहरू सम्पादन गर्ने",
        "right-edituserjs": "अरु प्रयोकर्ताको जाभास्क्रिप्ट फाइलहरू सम्पादन गर्ने",
        "right-editmyusercss": "तपाईंको आफ्नो CSS फाइलहरू सम्पादन गर्नुहोस्",
        "rcshowhidemine-hide": "लुकाउनुहोस्",
        "rcshowhidecategorization-show": "देखाउनुहोस्",
        "rcshowhidecategorization-hide": "लुकाउनुहोस्",
-       "rclinks": "पछिल्ला $1 परिवर्तनहरू पछिल्ला $2 दिनहरूमा<br />$3",
+       "rclinks": "पछिल्ला $1 परिवर्तनहरू पछिल्ला $2 दिनहरूमा",
        "diff": "भिन्न",
        "hist": "इतिहास",
        "hide": "लुकाउनुहोस्",
        "linksearch-text": "\"*.wikipedia.org\" वाइल्डकार्डको रुपमा प्रयोग गर्न सकिने।\nकम्तिमा \".org\" जस्तो कुनै उच्च-स्तरीय डोमेनको आवश्यकता छ।<br />\nसमर्थित प्रोटोकल:$1 (यदि कुनै {{PLURAL:$2|प्रोटोकल|प्रोटोकलहरू}} दिइएको छैन भने http:// को प्रयोग गर्न सकिन्छ)",
        "linksearch-line": "$1 $2सित जोड़िएको छ।",
        "linksearch-error": "मूलनामको सुरुमा मात्र वाइल्डकार्ड देखापर्न सक्छ।",
-       "listusersfrom": "पà¥\8dरयà¥\8bà¤\97हरà¥\81 देखाउन शुरु हुने यहाँ:",
+       "listusersfrom": "पà¥\8dरयà¥\8bà¤\97हरà¥\82 देखाउन शुरु हुने यहाँ:",
        "listusers-submit": "देखाउनुहोस्",
        "listusers-noresult": "प्रयोगकर्ताहरू भेटिएनन्।",
        "listusers-blocked": "(प्रतिबन्धित)",
        "undeleteviewlink": "अवलोकन",
        "undeleteinvert": " चयन उल्ट्याउने",
        "undeletecomment": "कारण :",
-       "undeletedrevisions": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} पुनर्स्थापित गरियो",
-       "undeletedrevisions-files": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} र {{PLURAL:$2|एउटा फाइल|$2 फाइलहरू}} पुनर्स्थापित गरियो",
-       "undeletedfiles": "{{PLURAL:$1|१ फाइल|$1 फाइलहरू }} पूर्वस्थितिमा ल्याइयो",
        "cannotundelete": "मेटाएको रद्द गर्ने काम असफल भयो:\n$1",
        "undeletedpage": "'''$1लाई पूर्वावस्थामा ल्याइयो'''\nभर्खरै मेटाइएको रिकर्डहरु र पुनर्स्थापनाहरु हेर्न [[Special:Log/delete|मेटाइएको लग]]मा जानुहोस्।",
        "undelete-header": "भर्खर मेटिएका पृष्ठहरू हेर्न [[Special:Log/delete|मेटाइएका लग]]मा जानुहोस्।",
        "tooltip-ca-nstab-category": "श्रेणी पृष्ठ हेर्ने",
        "tooltip-minoredit": "यसलाई सामान्य सम्पादनको रुपमा चिनो लगाउने",
        "tooltip-save": "तपाईंका परिवर्तनहरू सङ्ग्रह गर्नुहोस्",
+       "tooltip-publish": "तपाईंका परिवर्तनहरू प्रकाशित गर्नुहोस्",
        "tooltip-preview": "तपाईंको परिवर्तनको पूर्वरूप , कृपया सङ्ग्रह गर्नु अघि यो प्रयोग गर्नुहोला !",
        "tooltip-diff": "तपाईंले पाठमा के के परिवर्तन गर्नुभयो भनेर देखाउने",
        "tooltip-compareselectedversions": "यस पृष्ठको छानिएका दुई पुनरावलोकन बीच फरक हेर्नुहोस्",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|अपडेट गरियो}} ट्याग संशोधन $4 मा पृष्ठ $3 सँग ({{PLURAL:$7|जोडियो}} $6; {{PLURAL:$9|हटाइयो}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|अपडेट गरियो}} ट्याग संशोधन $5 मा पृष्ठ $3 सँग ({{PLURAL:$7|जोडियो}} $6; {{PLURAL:$9|हटाइयो}} $8)",
        "rightsnone": "(कुनैपनि होइन)",
-       "revdelete-summary": "सम्पादन सारांश",
        "feedback-adding": "पृष्ठमा प्रतिक्रिया थप गर्दै...",
        "feedback-back": "अघिल्लो",
        "feedback-bugcheck": "राम्रो! जाँच्नुस की कतै [ $1 ज्ञात बगहरू] पहिले देखि नै नहोस्।",
index f78bf5b..a877206 100644 (file)
@@ -5,7 +5,9 @@
                        "MarkvA",
                        "Siebrand",
                        "Tedjuh10",
-                       "Southparkfan"
+                       "Southparkfan",
+                       "McDutchie",
+                       "Romaine"
                ]
        },
        "view-pool-error": "De servers zijn op het moment helaas overbelast.\nTe veel gebruikers proberen deze pagina te bekijken.\nWacht even voordat je opnieuw toegang probeert te krijgen tot deze pagina.\n\n$1",
@@ -19,7 +21,7 @@
        "nospecialpagetext": "<strong>Je hebt een onbestaande speciale pagina opgevraagd.</strong>\n\nEen lijst met bestaande speciale pagina’s staat op [[Special:SpecialPages|speciale pagina’s]].",
        "missing-article": "In de database is geen inhoud aangetroffen voor de pagina \"$1\" die er wel zou moeten zijn ($2).\n\nDit kan voorkomen als je een verouderde koppeling naar het verschil tussen twee versies van een pagina volgt of een versie opvraagt die is verwijderd.\n\nAls dit niet het geval is, heb je wellicht een fout in de software gevonden.\nMaak hiervan melding bij een [[Special:ListUsers/sysop|beheerder]] van {{SITENAME}} en vermeld daarbij de URL van deze pagina.",
        "actionthrottledtext": "Als maatregel tegen spam is het aantal keren per tijdseenheid dat je deze handeling kunt verrichten beperkt.\nDe limiet is overschreden.\nProbeer het over een aantal minuten opnieuw.",
-       "viewsourcetext": "Je kunt de brontekst van deze pagina bekijken en kopiëren:",
+       "viewsourcetext": "Je kunt de brontekst van deze pagina bekijken en kopiëren.",
        "viewyourtext": "Je kunt '''uw bewerkingen''' aan de brontekst van deze pagina bekijken en kopiëren:",
        "editinginterface": "'''Waarschuwing:''' je bewerkt een pagina die interfacetekst voor de software bevat.\nBewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen op deze wiki.\nGebruik [https://translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki, om vertalingen toe te voegen of te wijzigen voor alle wiki's.",
        "namespaceprotected": "Je hebt geen rechten om pagina's in de naamruimte '''$1''' te bewerken.",
@@ -34,8 +36,7 @@
        "yourdomainname": "Je domein:",
        "password-change-forbidden": "Je kunt je wachtwoord niet wijzigen in deze wiki.",
        "externaldberror": "Er is een fout opgetreden bij het aanmelden bij de database of je hebt geen toestemming je externe gebruiker bij te werken.",
-       "gotaccount": "Heb je al een gebruikersnaam? '''$1'''.",
-       "userlogin-resetlink": "Ben je je aanmeldgegevens vergeten?",
+       "userlogin-reauth": "Je moet opnieuw inloggen om te bevestigen dat je {{GENDER:$1|$1}} bent.",
        "createacct-email-ph": "Geef je e-mailadres op",
        "nocookiesnew": "De gebruiker is geregistreerd, maar jij bent niet aangemeld.\n{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nSchakel die in en meld daarna aan met je nieuwe gebruikersnaam en wachtwoord.",
        "nocookieslogin": "{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nCookies zijn uitgeschakeld in je browser.\nSchakel deze optie aan en probeer het opnieuw.",
        "changepassword-success": "Je wachtwoord is gewijzigd.",
        "resetpass-no-info": "Je moet aangemeld zijn voordat je deze pagina kunt gebruiken.",
        "resetpass-wrong-oldpass": "Het huidige of tijdelijke wachtwoord is ongeldig.\nMogelijk heb je je wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aangevraagd.",
-       "passwordreset-capture-help": "Als je dit vakje aanvinkt, wordt de e-mail (met het tijdelijke wachtwoord) naar de gebruiker verzonden en ook aan jou weergegeven.",
        "passwordreset-emailtext-ip": "Iemand, waarschijnlijk jij, heeft vanaf het IP-adres $1 je gebruikersgegevens voor {{SITENAME}} ($4) opgevraagd.\nDe volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}.\nMeld je aan en wijzig het wachtwoord nu. Als je dit verzoek niet zelf hebt gedaan, of als je het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf je oude wachtwoord gebruiken.",
        "passwordreset-emailtext-user": "Gebruiker $1 op de site {{SITENAME}} heeft je gebruikersgegevens voor {{SITENAME}} ($4) opgevraagd.\nDe volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}.\nMeld je aan en wijzig het wachtwoord nu. Als je dit verzoek niet zelf hebt gedaan, of als je het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf je oude wachtwoord gebruiken.",
-       "changeemail-text": "Vul dit formulier in om je e-mailadres te wijzigen. Je moet je wachtwoord invoeren om deze wijziging te bevestigen.",
+       "changeemail-header": "Vul dit formulier in om je e-mailadres te wijzigen. Je moet je wachtwoord invoeren om deze wijziging te bevestigen.",
        "changeemail-no-info": "Je moet aangemeld zijn om rechtstreeks toegang te hebben tot deze pagina.",
        "changeemail-password": "Jouw wachtwoord voor {{SITENAME}}:",
        "sig_tip": "Je handtekening met datum en tijd",
@@ -73,7 +73,7 @@
        "anonpreviewwarning": "''Je bent niet aangemeld.''\n''Door je bewerking op te slaan wordt je IP-adres opgeslagen in de paginageschiedenis.''",
        "missingsummary": "'''Let op:''' je hebt geen samenvatting opgegeven voor je bewerking.\nAls je nogmaals op ''Pagina opslaan'' klikt wordt de bewerking zonder samenvatting opgeslagen.",
        "missingcommenttext": "Plaats je reactie hieronder.",
-       "missingcommentheader": "'''Let op:''' Je hebt geen onderwerp/kop voor deze reactie opgegeven.\nAls je opnieuw op \"{{int:savearticle}}\" klikt, wordt je wijziging zonder een onderwerp of koptekst opgeslagen.",
+       "missingcommentheader": "'''Let op:''' Je hebt geen onderwerp/kop voor deze reactie opgegeven.\nAls je opnieuw op \"$1\" klikt, wordt je wijziging zonder een onderwerp of koptekst opgeslagen.",
        "blockedtext": "'''Je 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\nJe kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] om de blokkade te bespreken.\nJe kunt geen gebruik maken van de functie \"Deze gebruiker e-mailen\", tenzij je een geldig e-mailadres hebt opgegeven in je [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.\nJe huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als je ergens op deze blokkade reageert.",
        "autoblockedtext": "Je 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\nJe kunt deze blokkade bespreken met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]].\n\nJe kunt geen gebruik maken van de functie \"Deze gebruiker e-mailen\", tenzij je een geldig e-mailadres hebt opgegeven in je [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet is geblokkeerd.\n\nJe huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als je ergens op deze blokkade reageert.",
        "whitelistedittext": "Je moet $1 om pagina's te bewerken.",
@@ -81,7 +81,7 @@
        "nosuchsectiontext": "Je probeerde een subkopje te bewerken dat niet bestaat.\nWellicht is het verplaatst of verwijderd terwijl je de pagina aan het bekijken was.",
        "loginreqpagetext": "Je moet je $1 om andere pagina's te kunnen bekijken.",
        "newarticletext": "Deze pagina bestaat niet.\nTyp in het onderstaande veld om de pagina aan te maken (meer informatie staat op de [$1 hulppagina]).\nGebruik de knop '''vorige''' in je browser als je hier per ongeluk terecht bent gekomen.",
-       "anontalkpagetext": "----''Deze overlegpagina hoort bij een anonieme gebruiker die geen gebruikersnaam heeft of deze niet gebruikt.\nDaarom wordt het IP-adres ter identificatie gebruikt.\nHet is mogelijk dat meerdere personen hetzelfde IP-adres gebruiken.\nMogelijk ontvang je hier berichten die niet voor je bedoeld zijn.\nAls je dat wilt voorkomen, [[Special:UserLogin/signup|registreer je]] of [[Special:UserLogin|meld je aan]] om verwarring met andere anonieme gebruikers te voorkomen.''",
+       "anontalkpagetext": "----''Deze overlegpagina hoort bij een anonieme gebruiker die geen gebruikersnaam heeft of deze niet gebruikt.\nDaarom wordt het IP-adres ter identificatie gebruikt.\nHet is mogelijk dat meerdere personen hetzelfde IP-adres gebruiken.\nMogelijk ontvang je hier berichten die niet voor je bedoeld zijn.\nAls je dat wilt voorkomen, [[Special:CreateAccount|registreer je]] of [[Special:UserLogin|meld je aan]] om verwarring met andere anonieme gebruikers te voorkomen.''",
        "noarticletext": "Deze pagina bevat geen tekst.\nJe kunt [[Special:Search/{{PAGENAME}}|naar deze term zoeken]] in andere pagina's, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken doorzoeken] of [{{fullurl:{{FULLPAGENAME}}|action=edit}} deze pagina bewerken]</span>.",
        "noarticletext-nopermission": "Deze pagina bevat geen tekst.\nJe kunt [[Special:Search/{{PAGENAME}}|naar deze term zoeken]] in andere pagina's of\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken doorzoeken]</span>, maar je mag de pagina niet aanmaken.",
        "userpage-userdoesnotexist": "Je bewerkt een gebruikerspagina van een gebruiker die niet bestaat (gebruiker \"$1\").\nControleer of je deze pagina wel wilt aanmaken/bewerken.",
@@ -97,7 +97,7 @@
        "session_fail_preview_html": "'''Je bewerking is niet verwerkt, omdat sessiegegevens verloren zijn gegaan.'''\n\n''Omdat in {{SITENAME}} ruwe HTML is ingeschakeld, is een voorvertoning niet mogelijk als bescherming tegen aanvallen met JavaScript.''\n\n'''Als dit een legitieme bewerking is, probeer het dan opnieuw.\nAls het dan nog niet lukt, [[Special:UserLogout|meld jezelf dan af]] en weer aan.'''",
        "token_suffix_mismatch": "'''Je bewerking is geweigerd, omdat je browser de leestekens in het bewerkingstoken onjuist heeft behandeld.'''\nDe bewerking is geweigerd om verminking van de paginatekst te voorkomen.\nDit gebeurt soms als er een webgebaseerde proxydienst wordt gebruikt die fouten bevat.",
        "edit_form_incomplete": "'''Sommige onderdelen van het bewerkingsformulier hebben de server niet bereikt. Controleer of je bewerkingen intact zijn en probeer het opnieuw.'''",
-       "explainconflict": "Een andere gebruiker heeft deze pagina bewerkt sinds je met je bewerking bent begonnen.\nIn het bovenste deel van het venster staat de tekst van de huidige pagina.\nJe bewerking staat in het onderste gedeelte.\nJe dient je bewerkingen in te voegen in de bestaande tekst.\n'''Alleen''' de tekst in het bovenste gedeelte wordt opgeslagen als je op \"{{int:savearticle}}\" klikt.",
+       "explainconflict": "Een andere gebruiker heeft deze pagina bewerkt sinds je met je bewerking bent begonnen.\nIn het bovenste deel van het venster staat de tekst van de huidige pagina.\nJe bewerking staat in het onderste gedeelte.\nJe dient je bewerkingen in te voegen in de bestaande tekst.\n'''Alleen''' de tekst in het bovenste gedeelte wordt opgeslagen als je op \"$1\" klikt.",
        "yourtext": "Je tekst",
        "nonunicodebrowser": "'''Waarschuwing: je browser kan niet goed overweg met Unicode.'''\nHiermee wordt door de MediaWiki-software rekening gehouden zodat je toch zonder problemen pagina's kunt bewerken: niet-ASCII tekens worden in het bewerkingsveld weergegeven als hexadecimale codes.",
        "editingold": "'''Waarschuwing: je bewerkt een oude versie van deze pagina.'''\nAls je je bewerking opslaat, gaan alle wijzigingen verloren die na deze versie zijn gemaakt.",
        "prefs-help-email-others": "Je kunt ook anderen in staat stellen per e-mail contact met je op te nemen via een koppeling op uw gebruikers- en overlegpagina zonder dat je je identiteit prijsgeeft.",
        "userrights-groups-help": "Je kunt de groepen wijzigen waar deze gebruiker lid van is.\n* Een aangekruist vakje betekent dat de gebruiker lid is van de groep.\n* Een niet aangekruist vakje betekent dat de gebruiker geen lid is van de groep.\n* Een \"*\" betekent dat je een gebruiker niet uit een groep kunt verwijderen nadat je die hebt toegevoegd of vice versa.",
        "userrights-no-interwiki": "Je hebt geen rechten om gebruikersrechten op andere wiki's te wijzigen.",
-       "userrights-nologin": "Je moet [[Special:UserLogin|aangemeld]] zijn met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.",
-       "userrights-notallowed": "Je hebt geen rechten om gebruikersrechten toe te voegen of te verwijderen.",
        "userrights-changeable-col": "Groepen die je kunt beheren",
        "userrights-unchangeable-col": "Groepen die je niet kunt beheren",
        "recentchangeslinked-summary": "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een opgegeven pagina of op pagina's in een opgegeven categorie.\nPagina's die op [[Special:Watchlist|uw volglijst]] staan worden '''vet''' weergegeven.",
        "file-deleted-duplicate": "Een bestand dat identiek is aan dit bestand ([[:$1]]) is voorheen verwijderd.\nRaadpleeg het verwijderingslogboek voordat je verder gaat.",
        "filewasdeleted": "Er is eerder een bestand met deze naam verwijderd.\nRaadpleeg het $1 voordat je het opnieuw toevoegt.",
        "filename-bad-prefix": "De naam van het bestand dat je aan het uploaden bent begint met '''\"$1\"''', wat een niet-beschrijvende naam is die meestal automatisch door een digitale camera wordt gegeven.\nKies een duidelijke naam voor je bestand.",
-       "upload-success-msg": "Je upload van [$2] is geslaagd en is beschikbaar: [[:{{ns:file}}:$1]]",
-       "upload-failure-msg": "Er was een probleem met je upload van [$2]:\n\n$1",
-       "upload-warning-msg": "Er was een probleem met je upload van [$2].\nGa terug naar het [[Special:Upload/stash/$1|uploadformulier]] om dit probleem te verhelpen.",
        "uploadstash-badtoken": "Het uitvoeren van de handeling is mislukt. Dit komt mogelijk doordat je bewerkingsreferenties zijn verlopen. Probeer het opnieuw.",
-       "img-auth-nopathinfo": "PATH_INFO mist.\nJe server is niet ingesteld om deze gegevens door te geven.\nMisschien gebruikt deze CGI, en dan wordt img_auth niet ondersteund.\nZie https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization voor meer informatie.",
+       "img-auth-nopathinfo": "PATH_INFO ontbreekt.\nJe server is niet ingesteld om deze gegevens door te geven.\nMisschien gebruikt deze CGI, en dan wordt img_auth niet ondersteund.\nZie https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization voor meer informatie.",
        "img-auth-nologinnWL": "Je bent niet aangemeld en \"$1\" staat niet op de witte lijst.",
        "img-auth-isdir": "Je probeert de map \"$1\" te benaderen.\nAlleen toegang tot bestanden is toegestaan.",
        "upload-curl-error28-text": "Het duurde te lang voordat de website antwoordde.\nControleer of de website beschikbaar is, wacht even en probeer het dan opnieuw.\nJe kunt het misschien proberen als het minder druk is.",
        "ipbnounblockself": "Je mag jezelf niet deblokkeren",
        "lockdbtext": "Waarschuwing: de database blokkeren heeft tot gevolg dat geen enkele gebruiker meer in staat is pagina's te bewerken, voorkeuren te wijzigen of iets anders te doen waarvoor wijzigingen in de database nodig zijn.\nBevestig dat je deze handeling wilt uitvoeren en dat je de database vrijgeeft nadat het onderhoud is uitgevoerd.",
        "unlockdbtext": "Na het vrijgeven van de database kunnen gebruikers weer pagina's bewerken, hun voorkeuren wijzigen of iets anders te doen waarvoor er wijzigingen in de database nodig zijn.\nBevestig dat je deze handeling wil uitvoeren.",
-       "locknoconfirm": "Je hebt je keuze niet bevestigd via het vinkvakje.",
+       "locknoconfirm": "Je hebt je keuze niet bevestigd via het selectievakje.",
        "lockdbsuccesstext": "De database is afgesloten.<br />\nVergeet niet de [[Special:UnlockDB|database vrij te geven]] zodra je klaar bent met je onderhoud.",
        "movepagetext": "Door middel van het onderstaande formulier kan je een pagina hernoemen.\nDe geschiedenis gaat mee naar de nieuwe pagina.\n* De oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\n* Koppelingen naar de oude pagina worden niet aangepast.\n* De pagina's die doorverwijzen naar de oorspronkelijke paginanaam worden automatisch bijgewerkt.\nAls je dit niet wilt, controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\n\n'''Waarschuwing!'''\nVoor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat je die gevolgen overziet voordat je deze handeling uitvoert.",
        "movepagetext-noredirectfixer": "Door middel van het onderstaande formulier kunt u een pagina en alle bijbehorende oude versies hernoemen.\nDe oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\nControleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\nJe kunt dus een pagina die per ongeluk is hernoemd terug hernoemen en je kunt een bestaande pagina niet overschrijven. \n\n'''Waarschuwing:''' voor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat je die gevolgen overziet voordat je deze handeling uitvoert.",
        "confirmemail_success": "Je e-mailadres is bevestigd.\nJe kunt jezelf nu [[Special:UserLogin|aanmelden]] en {{SITENAME}} gebruiken.",
        "confirmemail_loggedin": "Je e-mailadres is nu bevestigd.",
        "confirmemail_body": "Iemand, waarschijnlijk jijzelf, met het IP-adres $1,\nheeft zich met dit e-mailadres geregistreerd als gebruiker \"$2\" op {{SITENAME}}.\n\nOpen de volgende koppeling in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} te activeren:\n\n$3\n\nAls je jezelf *niet* hebt aangemeld, volg dan de volgende koppeling om de bevestiging van je e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
-       "confirmemail_body_changed": "Iemand, waarschijnlijk jijzelf, met het IP-adres $1,\nheeft het het e-mailadres geregistreerd voor gebruiker \"$2\" op {{SITENAME}} gewijzigd naar dit e-mailadres.\n\nOpen de volgende koppeling in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls je jezelf *niet* hebt aangemeld, volg dan de volgende koppeling om de bevestiging van je e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
-       "confirmemail_body_set": "Iemand, waarschijnlijk jij, met het IP-adres $1,\nheeft het het e-mailadres voor gebruiker \"$2\" op {{SITENAME}} ingesteld op dit e-mailadres.\n\nOpen de volgende koppeling in je webbrowser om te bevestigen dat jij deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls jij deze wijziging *niet* hebt gemaakt, volg dan de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
+       "confirmemail_body_changed": "Iemand, waarschijnlijk jijzelf, met het IP-adres $1,\nheeft het e-mailadres geregistreerd voor gebruiker \"$2\" op {{SITENAME}} gewijzigd naar dit e-mailadres.\n\nOpen de volgende koppeling in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls je jezelf *niet* hebt aangemeld, volg dan de volgende koppeling om de bevestiging van je e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
+       "confirmemail_body_set": "Iemand, waarschijnlijk jij, 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 je webbrowser om te bevestigen dat jij deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls jij deze wijziging *niet* hebt gemaakt, volg dan de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
        "deletedwhileediting": "'''Let op''': deze pagina is verwijderd terwijl je bezig was met je bewerking!",
        "confirmrecreate": "Nadat je begonnen bent met je wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina verwijderd met opgave van de volgende reden:\n: ''$2''\nBevestig dat je de pagina opnieuw wilt aanmaken.",
        "confirmrecreate-noreason": "Nadat je begonnen bent met je wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina verwijderd.\nBevestig dat je de pagina opnieuw wilt aanmaken.",
        "dberr-usegoogle": "Wellicht kun je in de tussentijd zoeken via Google.",
        "htmlform-float-invalid": "De waarde die je hebt opgegeven is geen getal.",
        "feedback-bugornote": "Als je zover bent om een technisch probleem in detail te beschrijven, [$1 rapporteer dan een bug].\nAnders kan je ook het eenvoudige formulier hieronder gebruiken.\nJe reactie wordt dan toegevoegd aan de pagina \"[$3 $2]\", samen met je gebruikersnaam en de browser die je gebruikt.",
-       "feedback-thanks": "Bedankt! Je terugkoppeling is op de pagina \"[$2 $1]\" geplaatst.",
-       "api-error-badaccess-groups": "Je mag geen bestanden uploaden in deze wiki.",
-       "api-error-empty-file": "Het bestand dat je hebt geüpload is leeg.",
-       "api-error-file-too-large": "Het bestand dat je hebt geüpload is te groot.",
-       "api-error-hookaborted": "De wijziging die je probeert te maken is afgebroken door een uitbreiding.",
-       "api-error-internal-error": "Interne fout: er is iets misgegaan tijdens het verwerken van je upload door de wiki.",
-       "api-error-mustbeloggedin": "Je moet aangemeld zijn om bestanden te kunnen uploaden.",
-       "api-error-unknown-error": "Interne fout: er is iets misgegaan tijdens het uploaden van je bestand."
+       "feedback-thanks": "Bedankt! Je terugkoppeling is op de pagina \"[$2 $1]\" geplaatst."
 }
index fd5ac54..7268687 100644 (file)
@@ -84,7 +84,8 @@
                        "Xxmarijnw",
                        "Mainframe98",
                        "QZanden",
-                       "Huhbakker"
+                       "Huhbakker",
+                       "Jos1950"
                ]
        },
        "tog-underline": "Verwijzingen onderstrepen:",
        "otherlanguages": "In andere talen",
        "redirectedfrom": "(Doorverwezen vanaf $1)",
        "redirectpagesub": "Doorverwijspagina",
-       "redirectto": "Doorverwijzen naar:",
-       "lastmodifiedat": "Deze pagina is het laatst bewerkt op $1 om $2.",
+       "redirectto": "Doorverwijzing naar:",
+       "lastmodifiedat": "Deze pagina is voor het laatst bewerkt op $1 om $2.",
        "viewcount": "Deze pagina is {{PLURAL:$1|één keer|$1 keer}} bekeken.",
        "protectedpage": "Beveiligde pagina",
        "jumpto": "Ga naar:",
        "login": "Aanmelden",
        "login-security": "Uw identiteit controleren",
        "nav-login-createaccount": "Aanmelden / registreren",
-       "userlogin": "Aanmelden / registreren",
-       "userloginnocreate": "Aanmelden",
        "logout": "Afmelden",
        "userlogout": "Afmelden",
        "notloggedin": "Niet aangemeld",
        "userlogin-noaccount": "Hebt u geen account?",
        "userlogin-joinproject": "Word lid van {{SITENAME}}",
-       "nologin": "Hebt u geen account? $1.",
-       "nologinlink": "Registreren",
        "createaccount": "Registreren",
-       "gotaccount": "Hebt u al een account? $1.",
-       "gotaccountlink": "Aanmelden",
-       "userlogin-resetlink": "Bent u uw aanmeldgegevens vergeten?",
        "userlogin-resetpassword-link": "Wachtwoord vergeten?",
        "userlogin-helplink2": "Hulp bij aanmelden",
        "userlogin-loggedin": "U bent al aangemeld als {{GENDER:$1|$1}}.\nGebruik het onderstaande formulier om aan te melden als een andere gebruiker.",
        "createaccountmail": "Gebruik een tijdelijk willekeurig wachtwoord en stuur het naar het opgegeven e-mailadres",
        "createaccountmail-help": "Kan worden gebruikt voor het aanmaken van een gebruiker voor een andere persoon zonder het wachtwoord te leren.",
        "createacct-realname": "Echte naam (optioneel)",
-       "createaccountreason": "Reden:",
        "createacct-reason": "Reden",
        "createacct-reason-ph": "Waarom u een andere account aanmaakt",
        "createacct-reason-help": "Weergegeven bericht in het logbestand van aangemaakte gebruikers",
        "login-migrated-generic": "Uw gebruikersnaam is hernoemd, en uw gebruikersnaam bestaat niet langer op deze wiki.",
        "loginlanguagelabel": "Taal: $1",
        "suspicious-userlogout": "Uw verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.",
-       "createacct-another-realname-tip": "Echte naam is optioneel.\nAls u deze opgeeft, wordt deze naam gebruikt worden om u erkenning te geven voor uw werk.",
+       "createacct-another-realname-tip": "Een echte naam is optioneel.\nAls u deze opgeeft, wordt deze naam gebruikt ter erkenning voor uw werk.",
        "pt-login": "Aanmelden",
        "pt-login-button": "Aanmelden",
        "pt-login-continue-button": "Doorgaan met aanmelden",
        "preview": "Voorvertoning",
        "showpreview": "Bewerking ter controle bekijken",
        "showdiff": "Wijzigingen bekijken",
-       "blankarticle": "<strong>Waarschuwing:</strong> de pagina die u wilt aanmaken is leeg.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt de pagina aangemaakt zonder enige inhoud.",
+       "blankarticle": "<strong>Waarschuwing:</strong> de pagina die u wilt aanmaken is leeg.\nAls u opnieuw op \"$1\" klikt, wordt de pagina aangemaakt zonder enige inhoud.",
        "anoneditwarning": "<strong>Waarschuwing:</strong> u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt. Wanneer u <strong>[$1 aanmeldt]</strong> of <strong>[$2 een gebruiker aanmaakt]</strong> verschijnen uw bewerkingen onder uw gebruikersnaam, naast andere voordelen.",
        "anonpreviewwarning": "''U bent niet aangemeld.''\n''Door uw bewerking op te slaan wordt uw IP-adres opgeslagen in de paginageschiedenis.''",
-       "missingsummary": "'''Let op:''' u hebt geen bewerkingssamenvatting opgegeven.\nAls u nogmaals op \"{{int:savearticle}}\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
-       "selfredirect": "<strong>Waarschuwing:</strong> U heeft een doorverwijzing gemaakt naar deze pagina. Mogelijk heeft u de verkeerde bestemming voor de doorverwijzing gebruikt, of bewerkt u de verkeerde pagina. Door nogmaals op \"{{int:savearticle}}\" te klikken word de doorverwijzing alsnog aangemaakt.",
+       "missingsummary": "'''Let op:''' u hebt geen bewerkingssamenvatting opgegeven.\nAls u nogmaals op \"$1\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
+       "selfredirect": "<strong>Waarschuwing:</strong> U heeft een doorverwijzing gemaakt naar deze pagina. Mogelijk heeft u de verkeerde bestemming voor de doorverwijzing gebruikt, of bewerkt u de verkeerde pagina. Door nogmaals op \"$1\" te klikken word de doorverwijzing alsnog aangemaakt.",
        "missingcommenttext": "Plaats uw reactie hieronder.",
-       "missingcommentheader": "<strong>Let op:</strong> u hebt geen onderwerp/kop voor deze opmerking opgegeven.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
+       "missingcommentheader": "<strong>Let op:</strong> u hebt geen onderwerp/kop voor deze opmerking opgegeven.\nAls u opnieuw op \"$1\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
        "summary-preview": "Voorvertoning van de bewerkingssamenvatting:",
        "subject-preview": "Voorvertoning van het onderwerp:",
        "previewerrortext": "Er is een fout opgetreden tijdens het weergeven van uw wijzigingen.",
        "editingsection": "Bezig met bewerken van $1 (deelpagina)",
        "editingcomment": "Bezig met bewerken van $1 (nieuw kopje)",
        "editconflict": "Bewerkingsconflict: $1",
-       "explainconflict": "Een andere gebruiker heeft deze pagina bewerkt sinds u met uw bewerking bent begonnen.\nIn het bovenste deel van het venster staat de tekst van de huidige pagina.\nUw bewerking staat in het onderste gedeelte.\nU dient uw bewerkingen in te voegen in de bestaande tekst.\n'''Alleen''' de tekst in het bovenste gedeelte wordt opgeslagen als u op \"{{int:savearticle}}\" klikt.",
+       "explainconflict": "Een andere gebruiker heeft deze pagina bewerkt sinds u met uw bewerking bent begonnen.\nIn het bovenste deel van het venster staat de tekst van de huidige pagina.\nUw bewerking staat in het onderste gedeelte.\nU dient uw bewerkingen in te voegen in de bestaande tekst.\n'''Alleen''' de tekst in het bovenste gedeelte wordt opgeslagen als u op \"$1\" klikt.",
        "yourtext": "Uw tekst",
        "storedversion": "Opgeslagen versie",
        "nonunicodebrowser": "'''Waarschuwing: uw browser kan niet goed overweg met Unicode.'''\nHiermee wordt door de MediaWiki-software rekening gehouden zodat u toch zonder problemen pagina's kunt bewerken: niet-ASCII tekens worden in het bewerkingsveld weergegeven als hexadecimale codes.",
        "readonlywarning": "<strong>Waarschuwing: u kunt deze bewerking nu niet opslaan omdat de database is geblokkeerd voor bewerkingen wegens onderhoudswerkzaamheden.</strong>\nHet is misschien verstandig om uw tekst tijdelijk in een tekstbestand op te slaan en te bewaren voor een later moment.\n\nDe systeembeheerder heeft de database geblokkeerd om de volgende reden: $1",
        "protectedpagewarning": "'''Waarschuwing: deze beveiligde pagina kan alleen door gebruikers met beheerdersrechten bewerkt worden.'''\nDe laatste logboekregel staat hieronder:",
        "semiprotectedpagewarning": "'''Let op:''' deze pagina is beveiligd en kan alleen door geregistreerde gebruikers bewerkt worden.\nDe laatste logboekregel staat hieronder:",
-       "cascadeprotectedwarning": "<strong>Waarschuwing:</strong> deze pagina is beveiligd en kan alleen door beheerders bewerkt worden, omdat ze is opgenomen in de volgende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|zijn}} met de cascade-optie:",
+       "cascadeprotectedwarning": "<strong>Waarschuwing:</strong> deze pagina is beveiligd en kan alleen door gebruikers met [[Special:ListGroupRights|specifieke rechten]] bewerkt worden, omdat ze is opgenomen in de volgende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|zijn}} met de cascade-optie:",
        "titleprotectedwarning": "'''Waarschuwing: Deze pagina is beveiligd. Er zijn [[Special:ListGroupRights|speciale rechten]] nodig om de pagina aan te kunnen maken.'''\nDe laatste logboekregel staat hieronder:",
        "templatesused": "Op deze pagina {{PLURAL:$1|gebruikt sjabloon|gebruikte sjablonen}}:",
        "templatesusedpreview": "{{PLURAL:$1|Sjabloon|Sjablonen}} gebruikt in deze voorvertoning:",
        "post-expand-template-argument-warning": "Waarschuwing: deze pagina bevat ten minste een sjabloonparameter met een te grote transclusiegrootte.\nDeze parameters zijn weggelaten.",
        "post-expand-template-argument-category": "Pagina's die missende sjabloonparameters bevatten",
        "parser-template-loop-warning": "Er is een kringloop in sjablonen geconstateerd: [[$1]]",
+       "template-loop-category": "Pagina's met sjablonen die zichzelf insluiten",
+       "template-loop-category-desc": "De pagina bevat een sjabloon dat zichzelf insluit, bijvoorbeeld een sjabloon dat zichzelf recursief aanroept.",
        "parser-template-recursion-depth-warning": "De recursiediepte voor sjablonen is overschreden ($1)",
        "language-converter-depth-warning": "De dieptelimiet voor de taalconvertor is overschreden ($1)",
        "node-count-exceeded-category": "Pagina's waar het maximaal aantal nodes is overschreden",
        "page_first": "eerste",
        "page_last": "laatste",
        "histlegend": "Selectie voor verschillen: selecteer de te vergelijken versies en toets ENTER of de knop onderaan.<br />\nVerklaring afkortingen: '''({{int:cur}})''' = verschil met huidige versie, '''({{int:last}})''' = verschil met voorgaande versie, '''{{int:minoreditletter}}''' = kleine wijziging",
-       "history-fieldset-title": "Door geschiedenis bladeren",
-       "history-show-deleted": "Alleen verwijderd",
+       "history-fieldset-title": "Naar versies zoeken",
+       "history-show-deleted": "Alleen verwijderde versies",
        "histfirst": "oudste",
        "histlast": "nieuwste",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "search-file-match": "(komt overeen met de inhoud van het bestand)",
        "search-suggest": "Bedoelde u: $1",
        "search-rewritten": "De resultaten voor $1 worden weergegeven. Zoek in plaats daarvan naar $2.",
-       "search-interwiki-caption": "Zusterprojecten",
+       "search-interwiki-caption": "Resultaten van zusterprojecten",
        "search-interwiki-default": "Resultaten van $1:",
        "search-interwiki-more": "(meer)",
        "search-interwiki-more-results": "meer resultaten",
        "prefs-help-prefershttps": "Deze voorkeur wordt toegepast bij de volgende keer aanmelden.",
        "prefswarning-warning": "U heeft deze wijzigingen gemaakt in uw voorkeuren die nog niet opgeslagen zijn. Wanneer u de pagina verlaat zonder op \"$1\" te klikken worden uw voorkeuren niet bijgewerkt.",
        "prefs-tabs-navigation-hint": "Tip: u kunt de pijltjestoetsen naar links en naar rechts gebruiken om te navigeren tussen de tabbladen in de lijst.",
-       "userrights": "Gebruikersrechtenbeheer",
+       "userrights": "Gebruikersrechten",
        "userrights-lookup-user": "Een gebruiker selecteren",
        "userrights-user-editname": "Voer een gebruikersnaam in:",
        "editusergroup": "Gebruikersgroepen wijzigen",
        "saveusergroups": "{{GENDER:$1|Gebruikersgroepen}} opslaan",
        "userrights-groupsmember": "Lid van:",
        "userrights-groupsmember-auto": "Impliciet lid van:",
-       "userrights-groups-help": "U kunt de groepen wijzigen waar deze gebruiker lid van is.\n* Een aangekruist vakje betekent dat de gebruiker lid is van de groep.\n* Een niet aangekruist vakje betekent dat de gebruiker geen lid is van de groep.\n* Een \"*\" betekent dat u een gebruiker niet uit een groep kunt verwijderen nadat u die hebt toegevoegd of vice versa.\n* Een \"#\" betekent dat u de verlooptijd van deze groep alleen kunt verkorten. U kunt deze niet verlengen.",
+       "userrights-groups-help": "U kunt de groepen wijzigen waar deze gebruiker lid van is.\n* Een aangekruist vakje betekent dat de gebruiker lid is van de groep.\n* Een niet aangekruist vakje betekent dat de gebruiker geen lid is van de groep.\n* Een \"*\" betekent dat u een gebruiker niet uit een groep kunt verwijderen nadat u die hebt toegevoegd of vice versa.\n* Een \"#\" betekent dat u dit groepslidmaatschap alleen kunt verlengen. U kunt het niet verkorten.",
        "userrights-reason": "Reden:",
        "userrights-no-interwiki": "U hebt geen rechten om gebruikersrechten op andere wiki's te wijzigen.",
        "userrights-nodatabase": "De database $1 bestaat niet of is geen lokale database.",
        "userrights-expiry-options": "1 dag:1 day,1 week:1 week,1 maand:1 month,3 maanden:3 months,6 maanden:6 months,1 jaar:1 year",
        "userrights-invalid-expiry": "De vervaltijd voor de groep \"$1\" is ongeldig.",
        "userrights-expiry-in-past": "De vervaltijd voor de groep \"$1\" is in het verleden.",
-       "userrights-cannot-shorten-expiry": "Kunt de verlooptijd van de groep \"$1\" niet verkorten. Alleen gebruiker met het recht om deze groep toe te voegen of te verwijderen kunnen de verlooptijd verkorten.",
+       "userrights-cannot-shorten-expiry": "U kunt de verlooptijd van het groepslidmaatschip van groep \"$1\" niet verkorten. Alleen gebruikers met het recht om deze groep toe te voegen of te verwijderen kunnen de verlooptijd verkorten.",
        "userrights-conflict": "Er is een probleem opgetreden tijdens het instellen van de gebruikersrechten! Controleer en bevestig uw wijzigingen.",
        "group": "Groep:",
        "group-user": "gebruikers",
        "right-editsemiprotected": "Pagina's bewerken die beveiligd zijn als \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Het paginainhoudmodel bewerken",
        "right-editinterface": "De gebruikersinterface bewerken",
-       "right-editusercssjs": "De CSS- en JavaScriptbestanden van andere gebruikers bewerken",
        "right-editusercss": "De CSS-bestanden van andere gebruikers bewerken",
        "right-edituserjs": "De JavaScriptbestanden van andere gebruikers bewerken",
        "right-editmyusercss": "Uw eigen CSS-pagina's bewerken",
        "recentchanges-label-plusminus": "Deze paginagrootte is met dit aantal bytes gewijzigd",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie ook de [[Special:NewPages|lijst met nieuwe pagina's]])",
-       "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Weergeven",
        "rcfilters-activefilters": "Actieve filters",
+       "rcfilters-quickfilters": "Snelle links",
+       "rcfilters-savedqueries-defaultlabel": "Opgeslagen filters",
+       "rcfilters-savedqueries-rename": "Hernoemen",
+       "rcfilters-savedqueries-setdefault": "Als standaard instellen",
+       "rcfilters-savedqueries-unsetdefault": "Als standaard verwijderen",
+       "rcfilters-savedqueries-remove": "Verwijderen",
+       "rcfilters-savedqueries-new-name-label": "Naam",
+       "rcfilters-savedqueries-apply-label": "Snelle link maken",
+       "rcfilters-savedqueries-cancel-label": "Annuleren",
+       "rcfilters-savedqueries-add-new-title": "Filters als een snelle link opslaan",
        "rcfilters-restore-default-filters": "Standaard filters terugzetten",
        "rcfilters-clear-all-filters": "Alle filters verwijderen",
        "rcfilters-search-placeholder": "Filter recente wijzigingen (blader of begin met intypen)",
        "rcfilters-invalid-filter": "Ongeldig filter",
        "rcfilters-empty-filter": "Geen actieve filters. Alle bijdragen worden weergeven.",
        "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-whatsthis": "Wat is dit?",
+       "rcfilters-filterlist-feedbacklink": "Geef terugkoppeling op de nieuwe (beta)filters",
        "rcfilters-highlightbutton-title": "Resultaten markeren",
        "rcfilters-highlightmenu-title": "Kies een kleur",
+       "rcfilters-highlightmenu-help": "Selecteer een kleur om deze eigenschap uit te lichten",
        "rcfilters-filterlist-noresults": "Geen filters gevonden",
+       "rcfilters-noresults-conflict": "Geen resultaten gevonden omdat de zoekcriteria met elkaar conflicteren",
+       "rcfilters-state-message-subset": "Dit filter heeft geen effect omdat de resultaten ook worden gefilterd door {{PLURAL:$2|het|de}} bredere {{PLURAL:$2|filter|filters}} (probeer ze te markeren om ze te onderscheiden): $1",
+       "rcfilters-state-message-fullcoverage": "Het selecteren van alle filters in deze groep is hetzelfde als geen filter selecteren, waardoor dit filter geen effect heeft. De groep bevat: $1",
        "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-filtergroup-authorship": "Bewerken auteurschap",
-       "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-filter-unregistered-conflicts-user-experience-level": "Het \"Niet geregistreerd\" filter is niet actief, omdat het effect ongedaan wordt gemaakt door de volgende {{PLURAL:$2|filter|filters}} die alleen geregistreerde gebruikers {{PLURAL:$2|vindt|vinden}}: $1",
+       "rcfilters-filtergroup-authorship": "Bijdragen auteurschap",
+       "rcfilters-filter-editsbyself-label": "Uw eigen wijzigingen",
+       "rcfilters-filter-editsbyself-description": "Uw eigen bijdragen.",
+       "rcfilters-filter-editsbyother-label": "Wijzigingen door anderen",
+       "rcfilters-filter-editsbyother-description": "Alle wijzigingen behalve die door u gemaakt zijn.",
        "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-filter-user-experience-level-newcomer-label": "Nieuwkomers",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Minder dan 10 bewerkingen en 4 dagen van activiteit.",
+       "rcfilters-filter-user-experience-level-learner-label": "Leerlingen",
+       "rcfilters-filter-user-experience-level-learner-description": "Meer ervaring dan \"nieuwkomers\", maar minder dan \"ervaren gebruikers\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Ervaren gebruikers",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Beoordelingsstatus",
+       "rcfilters-filter-patrolled-label": "Gecontroleerd",
+       "rcfilters-filter-patrolled-description": "Bewerkingen gemarkeerd als gecontroleerd.",
+       "rcfilters-filter-unpatrolled-label": "Niet gecontroleerd",
+       "rcfilters-filter-unpatrolled-description": "Bewerkingen die niet zijn gemarkeerd als gecontroleerd.",
        "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-watchlist": "Gevolgde pagina's",
+       "rcfilters-filter-watchlist-watched-label": "Op de volglijst",
+       "rcfilters-filter-watchlist-watched-description": "Wijzigingen aan pagina's op uw volglijst.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nieuwe volglijstwijzigingen",
+       "rcfilters-filter-watchlist-watchednew-description": "Wijzigingen aan pagina's die op uw volglijst staan, die u nog niet hebt bezocht sinds de wijziging.",
+       "rcfilters-filter-watchlist-notwatched-label": "Niet op de volglijst",
+       "rcfilters-filter-watchlist-notwatched-description": "Alles behalve wijzigingen op pagina's die op uw Volglijst staan.",
        "rcfilters-filtergroup-changetype": "Soort wijziging",
        "rcfilters-filter-pageedits-label": "Paginabewerkingen",
        "rcfilters-filter-pageedits-description": "Wijzigingen aan de wiki inhoud, discussies, categorie beschrijvingen....",
        "rcfilters-filter-categorization-description": "Categorisatie van pagina's tonen",
        "rcfilters-filter-logactions-label": "Geregistreerde acties",
        "rcfilters-filter-logactions-description": "Administratieve handelingen, account creaties, pagina verwijderingen, uploads....",
+       "rcfilters-hideminor-conflicts-typeofchange": "Bepaalde soorten wijzigingen kunnen niet worden aangemerkt als \"klein\", dus dit filter is in conflict met de volgende soorten wijzigingenfilters: $1",
+       "rcfilters-filtergroup-lastRevision": "Laatste versie",
+       "rcfilters-filter-lastrevision-label": "Laatste versie",
+       "rcfilters-filter-lastrevision-description": "De meest recente wijziging aan de pagina.",
+       "rcfilters-filter-previousrevision-label": "Eerdere versies",
+       "rcfilters-filter-previousrevision-description": "Alle wijzigingen die niet de meest recente wijziging op de pagina zijn.",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
+       "rclistfromreset": "Datum selectie opnieuw instellen",
        "rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
-       "rcshowhideminor": "Kleine bewerkingen $1",
+       "rcshowhideminor": "kleine bewerkingen $1",
        "rcshowhideminor-show": "weergeven",
        "rcshowhideminor-hide": "verbergen",
        "rcshowhidebots": "bots $1",
        "rcshowhidecategorization": "paginacategorisatie $1",
        "rcshowhidecategorization-show": "weergeven",
        "rcshowhidecategorization-hide": "Verbergen",
-       "rclinks": "De $1 laatste wijzigingen bekijken in de laatste $2 dagen<br />$3",
+       "rclinks": "De $1 laatste wijzigingen bekijken in de laatste $2 dagen",
        "diff": "wijz",
        "hist": "gesch",
        "hide": "verbergen",
        "php-uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld in PHP.\nControleer de instelling \"file_uploads\".",
        "uploadscripted": "Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.",
        "upload-scripted-pi-callback": "Het uploaden van een bestand met instructies voor de verwerking van XML-stylesheets is niet mogelijk.",
+       "upload-scripted-dtd": "Kan geen SVG bestanden uploaden die een DTD declaratie bevatten dat niet aan de standaard voldoet.",
        "uploaded-script-svg": "Scriptbaar element \"$1\" in het geüploade SVG-bestand gevonden.",
        "uploaded-hostile-svg": "Onveilige CSS in het \"style\"-element van het geüploade SVG-bestand gevonden.",
        "uploaded-event-handler-on-svg": "Het instellen van de event-handlereigenschappen <code>$1=\"$2\"</code> is niet toegestaan in SVG-bestanden.",
        "enotif_body_intro_moved": "De pagina $1 op {{SITENAME}} is hernoemd door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.",
        "enotif_body_intro_restored": "De pagina $1 op {{SITENAME}} is teruggeplaatst door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.",
        "enotif_body_intro_changed": "De pagina $1 op {{SITENAME}} is bewerkt door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.",
-       "enotif_lastvisited": "Zie $1 voor alle wijzigingen sinds uw laatste bezoek.",
-       "enotif_lastdiff": "Ga naar $1 om deze wijziging te bekijken.",
+       "enotif_lastvisited": "Voor alle wijzigingen sinds uw laatste bezoek, zie $1.",
+       "enotif_lastdiff": "Om deze wijziging te bekijken, ga naar $1.",
        "enotif_anon_editor": "anonieme gebruiker $1",
        "enotif_body": "Beste $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSamenvatting van de wijziging: $PAGESUMMARY $PAGEMINOREDIT\n\nContactgegevens van de auteur:\nE-mailadres: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nTenzij u deze pagina bezoekt, komen er geen verdere berichten. Als u bent aangemeld, kunt u op uw volglijst voor alle gevolgde pagina's de waarschuwingsinstellingen opschonen.\n\nGroet van uw {{SITENAME}}-waarschuwingssysteem.\n\n--\nU kunt uw e-mailinstellingen wijzigen op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nU kunt uw volglijstinstellingen wijzigen op:\n{{canonicalurl:Special:Watchlist/edit}}\n\nU kunt de pagina van uw volglijst verwijderen via de volgende koppeling:\n$UNWATCHURL\n\nTerugkoppeling en verdere assistentie:\n$HELPPAGE",
        "created": "aangemaakt",
        "log-name-contentmodel": "Wijzigingenlogboek van inhoudsmodel",
        "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": "$1 {{GENDER:$2|heeft}} het inhoudsmodel gewijzigd van pagina $3 van \"$4\" naar \"$5\"",
        "logentry-contentmodel-change-revertlink": "terugdraaien",
        "logentry-contentmodel-change-revert": "terugdraaien",
        "protectlogpage": "Beveiligingslogboek",
        "undeleteviewlink": "bekijken",
        "undeleteinvert": "Selectie omkeren",
        "undeletecomment": "Reden:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|versie|versies}} teruggeplaatst",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestand|$2 bestanden}} teruggeplaatst",
-       "undeletedfiles": "{{PLURAL:$1|1 bestand|$1 bestanden}} teruggeplaatst",
        "cannotundelete": "Het terugplaatsen is (gedeeltelijk) mislukt:\n$1",
        "undeletedpage": "'''$1 is teruggeplaatst'''\n\nIn het [[Special:Log/delete|verwijderingslogboek]] staan recente verwijderingen en herstelhandelingen.",
        "undelete-header": "Zie het [[Special:Log/delete|verwijderingslogboek]] voor recent verwijderde pagina's.",
        "sp-contributions-uploads": "uploads",
        "sp-contributions-logs": "logboeken",
        "sp-contributions-talk": "overleg",
-       "sp-contributions-userrights": "gebruikersrechtenbeheer",
+       "sp-contributions-userrights": "{{GENDER:$1|gebruikersrechtenbeheer}}",
        "sp-contributions-blocked-notice": "Deze gebruiker is op het moment geblokkeerd.\nDe laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:",
        "sp-contributions-blocked-notice-anon": "Dit IP-adres is geblokkeerd.\nDe laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:",
        "sp-contributions-search": "Zoeken naar bijdragen",
        "unblocked-id": "Blokkade $1 is opgeheven",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] is gedeblokkeerd.",
        "blocklist": "Geblokkeerde gebruikers",
+       "autoblocklist": "Automatische blokkades",
+       "autoblocklist-submit": "Zoeken",
+       "autoblocklist-legend": "Automatische blokkades tonen",
+       "autoblocklist-localblocks": "Lokale {{PLURAL:$1|automatische blokkades}}",
+       "autoblocklist-empty": "De lijst met automatische blokkades is leeg.",
+       "autoblocklist-otherblocks": "Andere {{PLURAL:$1|automatische blokkades}}",
        "ipblocklist": "Geblokkeerde gebruikers",
        "ipblocklist-legend": "Een geblokkeerde gebruiker zoeken",
        "blocklist-userblocks": "Geblokkeerde accounts verbergen",
        "tooltip-pt-mycontris": "Overzicht van {{GENDER:|uw}} bijdragen",
        "tooltip-pt-anoncontribs": "Een lijst van bewerkingen gemaakt door dit IP-adres",
        "tooltip-pt-login": "U wordt van harte uitgenodigd om aan te melden, maar dit is niet verplicht",
+       "tooltip-pt-login-private": "U moet zich aanmelden om gebruik te kunnen maken van deze wiki",
        "tooltip-pt-logout": "Afmelden",
        "tooltip-pt-createaccount": "Registreer u vooral en meld u aan. Dit is echter niet vereist.",
        "tooltip-ca-talk": "Overleg over deze pagina",
        "anonymous": "Anonieme {{PLURAL:$1|gebruiker|gebruikers}} van {{SITENAME}}",
        "siteuser": "{{SITENAME}}-gebruiker $1",
        "anonuser": "anonieme {{SITENAME}}-gebruiker $1",
-       "lastmodifiedatby": "Deze pagina is het laatst bewerkt op $1 om $2 door $3.",
+       "lastmodifiedatby": "Deze pagina is voor het laatst bewerkt op $1 om $2 door $3.",
        "othercontribs": "Gebaseerd op werk van $1.",
        "others": "anderen",
        "siteusers": "{{SITENAME}}-{{PLURAL:$2|gebruiker|gebruikers}} $1",
        "newimages-summary": "Op deze speciale pagina worden de meest recent toegevoegde bestanden weergegeven.",
        "newimages-legend": "Bestandsnaam",
        "newimages-label": "Bestandsnaam (of deel daarvan):",
+       "newimages-user": "IP-adres of gebruikersnaam",
        "newimages-showbots": "Uploads door bots weergeven",
        "newimages-hidepatrolled": "Gecontroleerde uploads verbergen",
        "noimages": "Er is niets te zien.",
        "ilsubmit": "Zoeken",
        "bydate": "op datum",
        "sp-newimages-showfrom": "Nieuwe bestanden bekijken vanaf $1 om $2.",
-       "hours-abbrev": "$1u",
+       "hours-abbrev": "$1 u",
        "seconds": "{{PLURAL:$1|$1 seconde|$1 seconden}}",
        "minutes": "{{PLURAL:$1|$1 minuut|$1 minuten}}",
        "hours": "{{PLURAL:$1|$1 uur|$1 uur}}",
        "exif-compression-4": "CCITT Groep 4 faxcodering",
        "exif-copyrighted-true": "Auteursrechtelijk beschermd",
        "exif-copyrighted-false": "Auteursrechtelijke status niet ingesteld",
+       "exif-photometricinterpretation-0": "Zwart en wit (Wit is 0)",
        "exif-photometricinterpretation-1": "Zwart-wit (zwart is 0)",
+       "exif-photometricinterpretation-3": "Palet",
        "exif-unknowndate": "Datum onbekend",
        "exif-orientation-1": "Normaal",
        "exif-orientation-2": "Horizontaal gespiegeld",
        "confirmrecreate": "Nadat u begonnen bent met uw wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina {{GENDER:$1|verwijderd}} met opgave van de volgende reden:\n: <em>$2</em>\nBevestig dat u de pagina opnieuw wilt aanmaken.",
        "confirmrecreate-noreason": "Nadat u begonnen bent met uw wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina {{GENDER:$1|verwijderd}}. Bevestig dat u de pagina opnieuw wilt aanmaken.",
        "recreate": "Opnieuw aanmaken",
+       "confirm-purge-title": "Ververs deze pagina",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "De cache van deze pagina legen?",
        "confirm-purge-bottom": "Het opschonen van de cache zorgt ervoor dat de meest recente versie van een pagina wordt weergegeven.",
        "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-restore": "$1 {{GENDER:$2|heeft}} de pagina $3 ($4) teruggeplaatst",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|heeft}} de pagina $3 teruggeplaatst",
+       "restore-count-revisions": "{{PLURAL:$1|1 versie|$1 versies}}",
+       "restore-count-files": "{{PLURAL:$1|1 bestand|$1 bestanden}}",
        "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",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|heeft}} de zichtbaarheid van logboekregels van $3 gewijzigd",
        "logentry-tag-update-revision": "$1 heeft de labels van versie $4 van pagina $3  {{GENDER:$2|bijgewerkt}} ($6 {{PLURAL:$7|toegevoegd}}; $8 {{PLURAL:$9|verwijderd}})",
        "logentry-tag-update-logentry": "$1 heeft de labels van logboekregel $5 van pagina $3 {{GENDER:$2|bijgewerkt}} ($6 {{PLURAL:$7|toegevoegd}}; $8 {{PLURAL:$9|verwijderd}})",
        "rightsnone": "(geen)",
-       "revdelete-summary": "bewerkingssamenvatting",
        "rightslogentry-temporary-group": "$1 (tijdelijk, tot $2)",
        "feedback-adding": "Uw terugkoppeling wordt aan de pagina toegevoegd...",
        "feedback-back": "Terug",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laotiaans",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Canadees Aboriginal",
        "special-characters-title-endash": "liggend streepje",
        "special-characters-title-emdash": "gedachtenstreepje",
        "special-characters-title-minus": "minteken",
        "mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Voeg een categorie toe...",
        "mw-widgets-usersmultiselect-placeholder": "Meer toevoegen...",
+       "date-range-from": "Vanaf datum:",
+       "date-range-to": "Tot datum:",
        "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",
        "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"
+       "pageid": "Pagina-ID $1",
+       "rawhtml-notallowed": "&lt;html&gt; tags kunnen alleen op normale pagina's geplaatst worden.",
+       "gotointerwiki": "{{SITENAME}} verlaten",
+       "gotointerwiki-invalid": "De opgegeven titel is ongeldig.",
+       "gotointerwiki-external": "U staat op het punt om {{SITENAME}} te verlaten en [[$2]] te bezoeken. [[$2]] is een aparte website.\n\n'''[$1 Doorgaan naar $1]'''",
+       "undelete-cantedit": "U kunt deze pagina niet terug plaatsen omdat u niet het recht hebt om deze pagina te bewerken.",
+       "undelete-cantcreate": "U kunt deze pagina niet terugplaatsen omdat er geen bestaande pagina met deze naam is en u geen toestemming hebt om deze pagina aan te maken."
 }
index bfba48c..b6e7ab4 100644 (file)
@@ -33,7 +33,7 @@
        "tog-hideminor": "Gøym småplukk i lista over siste endringar",
        "tog-hidepatrolled": "Gøym patruljerte endringar i lista over siste endringar",
        "tog-newpageshidepatrolled": "Gøym patruljerte sider frå lista over nye sider",
-       "tog-hidecategorization": "Løyn sidekategoriseringa",
+       "tog-hidecategorization": "Gøym kategorisering av sider",
        "tog-extendwatchlist": "Utvid overvakingslista til å vise alle endringane, ikkje berre dei siste",
        "tog-usenewrc": "Grupper endringar etter side i siste endringane og på overvakingslista",
        "tog-numberheadings": "Vis nummererte overskrifter",
@@ -65,7 +65,7 @@
        "tog-watchlistreloadautomatically": "Oppdater overvakingslista automatisk når eit filter vert endra (krev JavaScript)",
        "tog-watchlisthideanons": "Gøym endringar av anonyme brukarar i overvakingslista.",
        "tog-watchlisthidepatrolled": "Gøym patruljerte endringar i overvakingslista",
-       "tog-watchlisthidecategorization": "Løyn sidekategoriseringa",
+       "tog-watchlisthidecategorization": "Gøym kategorisering av sider",
        "tog-ccmeonemails": "Send meg kopi av e-postane eg sender til andre brukarar",
        "tog-diffonly": "Ikkje vis sideinnhaldet under skilnadene mellom versjonane",
        "tog-showhiddencats": "Vis gøymde kategoriar",
        "redirectedfrom": "(Omdirigert frå $1)",
        "redirectpagesub": "Omdirigeringsside",
        "redirectto": "Omdirigering til:",
-       "lastmodifiedat": "Sida vart sist endra $1 kl. $2.",
+       "lastmodifiedat": "Denne sida vart sist endra den $1 kl. $2.",
        "viewcount": "Sida er vist {{PLURAL:$1|éin gong|$1 gonger}}.",
        "protectedpage": "Verna side",
        "jumpto": "Gå til:",
        "login": "Logg inn",
        "login-security": "Stadfest identiteten din",
        "nav-login-createaccount": "Lag brukarkonto / logg inn",
-       "userlogin": "Lag brukarkonto / logg inn",
-       "userloginnocreate": "Logg inn",
        "logout": "Logg ut",
        "userlogout": "Logg ut",
        "notloggedin": "Ikkje innlogga",
        "userlogin-noaccount": "Har du ingen konto?",
        "userlogin-joinproject": "Vert med på {{SITENAME}}",
-       "nologin": "Har du ingen brukarkonto? $1.",
-       "nologinlink": "Registrer deg",
        "createaccount": "Opprett ny konto",
-       "gotaccount": "Har du ein brukarkonto? '''$1'''.",
-       "gotaccountlink": "Logg inn",
-       "userlogin-resetlink": "Har du gløymd påloggingsopplysingane dine?",
        "userlogin-resetpassword-link": "Gløymt passordet ditt?",
        "userlogin-helplink2": "Hjelp med innlogging",
        "userlogin-loggedin": "Du er alt innlogga som {{GENDER:$1|$1}}.\nNytt skjemaet nedanfor for å logga inn som ein annan brukar.",
        "createaccountmail": "Bruk eit mellombels tilfeldig passord og send det til den oppgjevne e-postadressa",
        "createaccountmail-help": "Kan nyttast til å opprette konto for ein annan person utan å lære passordet deira.",
        "createacct-realname": "Sant namn (valfritt)",
-       "createaccountreason": "Årsak:",
        "createacct-reason": "Årsak",
        "createacct-reason-ph": "Kvifor du lagar ein ny konto",
        "createacct-submit": "Opprett kontoen din",
        "anoneditwarning": "'''Åtvaring:''' Du er ikkje innlogga.\nIP-adressa di vil verta lagra i den offentlege endringshistorikken til sida. Om du <strong>[$1 loggar inn]</strong> eller <strong>[$2 lagar ein konto]</strong>, vil endringane dine knytast til brukarnamnet ditt, saman med andre fordelar.",
        "anonpreviewwarning": "''Du er ikkje innlogga. Lagrar du vil IP-adressa di verta ført opp i endringshistorikken til denne sida.''",
        "missingsummary": "'''Påminning:''' Du har ikkje skrive noko endringssamandrag. Dersom du trykkjer «Lagre» ein gong til, vert endringa di lagra utan.",
-       "selfredirect": "<strong>Åtvaring:</strong> Du omdirigerer sida til seg sjølv.\nDu kan ha oppgjeve feil mål for omdirigeringa, eller det kan vera at du endrar feil side.\nKlikkar du «{{int:savearticle}}» på nytt vil omdirigeringa opprettast kor som er.",
+       "selfredirect": "<strong>Åtvaring:</strong> Du omdirigerer sida til seg sjølv.\nDu kan ha oppgjeve feil mål for omdirigeringa, eller det kan vera at du endrar feil side.\nKlikkar du «$1» på nytt vil omdirigeringa opprettast kor som er.",
        "missingcommenttext": "Ver venleg og skriv ein kommentar nedanfor.",
-       "missingcommentheader": "'''Påminning:''' Du har ikkje oppgjeve noko emne/overskrift for denne kommentaren.\nDersom du trykkjer «{{int:savearticle}}» ein gong til, vert endringa di lagra utan.",
+       "missingcommentheader": "'''Påminning:''' Du har ikkje oppgjeve noko emne/overskrift for denne kommentaren.\nDersom du trykkjer «$1» ein gong til, vert endringa di lagra utan.",
        "summary-preview": "Førehandsvising av endringssamandraget:",
        "subject-preview": "Førehandsvising av emne/overskrift:",
        "blockedtitle": "Brukaren er blokkert",
        "editingsection": "Endrar $1 (bolk)",
        "editingcomment": "Endrar $1 (ny bolk)",
        "editconflict": "Endringskonflikt: $1",
-       "explainconflict": "Nokon annan har endra teksten sidan du byrja å skrive.\nDen øvste boksen inneheld den noverande teksten.\nSkilnaden mellom den lagra versjonen og din endra versjon er viste under.\nVersjonen som du har endra er i den nedste boksen.\nDu lyt flette endringane dine saman med den noverande teksten.\n'''Berre''' teksten i den øvste tekstboksen vil bli lagra når du klikkar på «{{int:savearticle}}».",
+       "explainconflict": "Nokon annan har endra teksten sidan du byrja å skrive.\nDen øvste boksen inneheld den noverande teksten.\nSkilnaden mellom den lagra versjonen og din endra versjon er viste under.\nVersjonen som du har endra er i den nedste boksen.\nDu lyt flette endringane dine saman med den noverande teksten.\n'''Berre''' teksten i den øvste tekstboksen vil bli lagra når du klikkar på «$1».",
        "yourtext": "Teksten din",
        "storedversion": "Den lagra versjonen",
        "nonunicodebrowser": "'''ÅTVARING: Nettlesaren din støttar ikkje «Unicode».\nFor å omgå problemet blir teikn utanfor ASCII-standarden viste som heksadesimale kodar.'''<br />",
        "cantcreateaccount-text": "Kontooppretting frå denne IP-adressa ('''$1''') er blokkert av [[User:$3|$3]].\n\nGrunnen som vart gjeven av $3 er ''$2''",
        "viewpagelogs": "Vis loggane for sida",
        "nohistory": "Det finst ikkje nokon historikk for denne sida.",
-       "currentrev": "Versjonen no",
-       "currentrev-asof": "Versjonen no frå $1",
+       "currentrev": "Siste versjonen",
+       "currentrev-asof": "Siste versjonen frå $1",
        "revisionasof": "Versjonen frå $1",
        "revision-info": "Versjonen frå $1 av {{GENDER:$6|$2}}$7",
        "previousrevision": "← Eldre versjon",
        "nextrevision": "Nyare versjon →",
-       "currentrevisionlink": "Versjonen no",
+       "currentrevisionlink": "Siste versjonen",
        "cur": "no",
        "next": "neste",
        "last": "førre",
        "lineno": "Line $1:",
        "compareselectedversions": "Samanlikn valde versjonar",
        "showhideselectedversions": "Vis/løyn valde versjonar",
-       "editundo": "angre",
+       "editundo": "fjern endringa",
        "diff-empty": "(Ingen skilnad)",
        "diff-multi-sameuser": "({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} av den same brukaren er ikkje {{PLURAL:$1|vist|viste}})",
        "diff-multi-otherusers": "({{PLURAL:$1|Éin mellomliggjande versjon|$1 mellomliggjande versjonar}} av {{PLURAL:$2|éin annan brukar|$2 brukarar}} er ikkje {{PLURAL:$1|vist|viste}})",
        "right-deletedtext": "Sjå sletta tekst og endringar i høve til sletta versjonar",
        "right-browsearchive": "Søk i sletta sider",
        "right-undelete": "Attopprett sider",
-       "right-suppressrevision": "Sjå og gjenopprett skjulte siderevisjonar",
+       "right-suppressrevision": "Sjå, skjul og vis fram att siderevisjonar frå einkvar brukar",
        "right-suppressionlog": "Sjå private loggar",
        "right-block": "Blokkere andre brukarar frå å redigere",
        "right-blockemail": "Blokkere brukarar frå å sende e-post",
        "right-protect": "Endra vernenivå og verna sider",
        "right-editprotected": "Endre verna sider",
        "right-editinterface": "Redigere brukargrensesnittet",
-       "right-editusercssjs": "Endre andre brukarar sine CSS- og JS-filer",
        "right-editusercss": "Endre andre brukarar sine CSS-filer",
        "right-edituserjs": "Endre andre brukarar sine JS-filer",
        "right-editmyusercss": "Endra eigne CSS-filer",
        "recentchanges-legend-heading": "<strong>Tyding:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjå dessutan [[Special:NewPages|lista over nye sider]])",
        "recentchanges-submit": "Vis",
+       "rcfilters-activefilters": "Aktive filter",
+       "rcfilters-savedqueries-defaultlabel": "Lagra filter",
+       "rcfilters-clear-all-filters": "Fjern alle filter",
+       "rcfilters-search-placeholder": "Filtrer siste endringar (gå gjennom liste eller skriv filternamn)",
+       "rcfilters-empty-filter": "Ingen aktive filter. Alle bidrag er viste.",
+       "rcfilters-filterlist-title": "Filter",
+       "rcfilters-filterlist-feedbacklink": "Gje attendemelding på dei nye (beta)filtera",
+       "rcfilters-highlightbutton-title": "Uthev resultat",
+       "rcfilters-highlightmenu-title": "Vel ein farge",
+       "rcfilters-filterlist-noresults": "Fann ingen filter",
+       "rcfilters-filtergroup-registration": "Brukarregistrering",
+       "rcfilters-filter-registered-label": "Registrerte",
+       "rcfilters-filter-registered-description": "Innlogga brukarar.",
+       "rcfilters-filter-unregistered-label": "Uregistrerte",
+       "rcfilters-filter-unregistered-description": "Brukarar som ikkje er innlogga.",
+       "rcfilters-filtergroup-authorship": "Forfattar",
+       "rcfilters-filter-editsbyself-label": "Endringar av deg",
+       "rcfilters-filter-editsbyself-description": "Dine eigne bidrag.",
+       "rcfilters-filter-editsbyother-label": "Endringar av andre",
+       "rcfilters-filter-editsbyother-description": "Alle endringar utanom dine eigne.",
+       "rcfilters-filtergroup-userExpLevel": "Røynslenivå (berre for registrerte brukarar)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nykomarar",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Færre enn 10 endringar og 4 dagar med aktivitet.",
+       "rcfilters-filter-user-experience-level-learner-label": "Nybyrjarar",
+       "rcfilters-filter-user-experience-level-learner-description": "Meir røynsle enn «Nykomarar», men mindre enn «Røynde brukarar».",
+       "rcfilters-filter-user-experience-level-experienced-label": "Røynde brukarar",
+       "rcfilters-filter-user-experience-level-experienced-description": "Meir enn 30 dagar med aktivitet og 500 endringar.",
+       "rcfilters-filter-humans-label": "Menneske (ikkje robot)",
+       "rcfilters-filter-pageedits-label": "Sideendringar",
+       "rcfilters-filter-newpages-label": "Sideopprettingar",
+       "rcfilters-filter-logactions-label": "Loggførte handlingar",
        "rcnotefrom": "Nedanfor er endringane gjorde sidan <strong>$2</strong> viste (opp til <strong>$1</strong> stykke)",
        "rclistfrom": "Vis nye endringar sidan $3 $2",
        "rcshowhideminor": "$1 småplukk",
        "rcshowhidemine-hide": "Gøym",
        "rcshowhidecategorization": "$1 kategorisering av sider",
        "rcshowhidecategorization-show": "Vis",
-       "rclinks": "Vis dei siste $1 endringane dei siste $2 dagane<br />$3",
+       "rclinks": "Vis dei siste $1 endringane dei siste $2 dagane",
        "diff": "skil",
        "hist": "hist",
        "hide": "Gøym",
        "recentchangeslinked-summary": "Dette er ei liste over nylege endringar som er gjorde på sider som vert lenkja til frå ei oppgjeven side (eller på medlemer av ein oppgjeven kategori). Sider på [[Special:Watchlist|overvakingslista di]] er '''utheva'''.",
        "recentchangeslinked-page": "Sidenamn:",
        "recentchangeslinked-to": "Vis endringar på sider som lenkjar til den gitte sida i staden",
+       "recentchanges-page-added-to-category": "[[:$1]] vart lagd til kategorien",
+       "recentchanges-page-removed-from-category": "[[:$1]] fjerna frå kategori",
        "upload": "Last opp fil",
        "uploadbtn": "Last opp fil",
        "reuploaddesc": "Attende til opplastingsskjemaet.",
        "listfiles-delete": "slett",
        "listfiles-summary": "Spesialsida viser alle opplasta filer.\nNår ho er filtrert etter brukar, vert berre filene der brukaren lasta opp den siste versjonen viste.",
        "listfiles_search_for": "Søk etter filnamn:",
+       "listfiles-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.",
        "imgfile": "fil",
        "listfiles": "Filliste",
        "listfiles_thumb": "Miniatyrbilete",
        "unusedimages": "Ubrukte filer",
        "wantedcategories": "Etterspurde kategoriar",
        "wantedpages": "Etterspurde sider",
+       "wantedpages-summary": "Liste over uoppretta sider med flest innkomande lenkjer, unnateke sider som berre er lenkja frå omdirigeringar. For ei liste over uoppretta sider som er lenkja frå omdirigeringar, sjå [[{{#special:BrokenRedirects}}|lista over uverksame omdirigeringar]].",
        "wantedpages-badtitle": "Ugyldig tittel mellom resultata: $1",
        "wantedfiles": "Etterspurde filer",
        "wantedfiletext-cat": "Desse filene er nytta men finst ikkje. Filer frå utannettstadlege samlingar kan vera lista opp sjølv om dei finst. Slike falske positivar vert <del>strokne ut</del>. Sider som nyttar filer som ikkje finst vert lista opp i [[:$1]].",
        "undeleteviewlink": "syn",
        "undeleteinvert": "Inverter val",
        "undeletecomment": "Årsak:",
-       "undeletedrevisions": "{{PLURAL:$1|Éin versjon|$1 versjonar}} attoppretta.",
-       "undeletedrevisions-files": "{{PLURAL:$1|Éin versjon|$1 versjonar}} og {{PLURAL:$2|éi fil|$2 filer}} er attoppretta",
-       "undeletedfiles": "{{PLURAL:$1|Éi fil|$1 filer}} er attoppretta",
        "cannotundelete": "Attopprettinga gjekk ikkje:\n$1",
        "undeletedpage": "'''$1 er attoppretta'''\n\nSjå [[Special:Log/delete|sletteloggen]] for eit oversyn over sider som nyleg er sletta eller attoppretta.",
        "undelete-header": "Sjå [[Special:Log/delete|sletteloggen]] for dei sist sletta sidene.",
        "mycontris": "Bidrag",
        "anoncontribs": "Bidrag",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.",
        "nocontribs": "Det vart ikkje funne nokon endringar gjorde av denne brukaren.",
        "uctop": "(gjeldande)",
        "month": "Månad:",
        "logentry-upload-upload": "$1 {{GENDER:$2|lasta opp}} $3",
        "log-name-tag": "Merkelogg",
        "rightsnone": "(ingen)",
-       "revdelete-summary": "Samandrag",
        "feedback-adding": "Legg til attendemeldinga til sida...",
        "feedback-bugcheck": "Bra! No lyt du berre sjå etter om han er ein av dei [$1 kjende feila].",
        "feedback-bugnew": "Eg såg etter. Rapporter ein ny feil",
        "mw-widgets-titleinput-description-new-page": "sida finst ikkje enno",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
        "randomrootpage": "Tilfeldig rotsida",
+       "log-action-filter-rights": "Type endring av rettar:",
+       "authmanager-userdoesnotexist": "Brukarkontoen «$1» er ikkje oppretta.",
        "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 7b3241a..41516fd 100644 (file)
        "rcshowhideminor": "$1 minori modifikos",
        "rcshowhideanons": "$1 anonimi useres",
        "rcshowhidemine": "$1 men modifikos",
-       "rclinks": "Montra lasti $1 chanjes in lasti $2 dies<br />$3",
+       "rclinks": "Montra lasti $1 chanjes in lasti $2 dies",
        "hist": "hist",
        "hide": "Kasha",
        "show": "Montra",
index b3facd6..4b927c6 100644 (file)
        "yourpasswordagain": "Tlanya ditlhaka-tša-siphiri gape:",
        "login": "Tsena",
        "nav-login-createaccount": "Tsena / Tlhola tšhupaleloko (''account'')",
-       "userlogin": "Tsena / tlhola tšhupaleloko (''account'')",
-       "userloginnocreate": "Tsena",
        "logout": "Etšwa/Tswalela",
        "userlogout": "Etšwa/Tswalela",
        "notloggedin": "Ga wa tsena",
-       "nologin": "A  o nale sedi ya go tsena? '''$1'''.",
-       "nologinlink": "Bula tšhupaleloko (''account'')",
        "createaccount": "Bula tšhupaleloko",
-       "gotaccount": "O šetše o nale tšhupaleloko? '''$1'''.",
-       "gotaccountlink": "Tsena",
-       "userlogin-resetlink": "O lebetše dintlha tšago tsena?",
        "createaccountmail": "Re šomiše ditlhaka-tša-siphiri tša sebakanyana tšeo re di kgethilego re di romele ka e-mail",
-       "createaccountreason": "Lebaka:",
        "badretype": "Ditlhaka-tša-siphiri tše o di šomišitšego ga di swane.",
        "noname": "Gawa fana ka leina la mošomiši la go loka.",
        "loginsuccesstitle": "O tsene",
        "rcshowhidepatr": "$1 diphetogo tše ''patrolled''",
        "rcshowhidemine": "$1 diphetogo tsa ka",
        "rcshowhidemine-hide": "Fihla",
-       "rclinks": "Bontšha diphetogo tša bofelo tše $1 matšatšing a  $2  a bofelo <br />$3",
+       "rclinks": "Bontšha diphetogo tša bofelo tše $1 matšatšing a  $2  a bofelo",
        "diff": "phapang",
        "hist": "histori",
        "hide": "Fihla",
index 3cfbe34..1ebb171 100644 (file)
        "login": "Identificacion",
        "login-security": "Verificar vòstra identitat",
        "nav-login-createaccount": "Crear un compte o se connectar",
-       "userlogin": "Crear un compte o se connectar",
-       "userloginnocreate": "Connexion",
        "logout": "Se desconnectar",
        "userlogout": "Desconnexion",
        "notloggedin": "Vos sètz pas identificat(ada)",
        "userlogin-noaccount": "Avètz pas de compte ?",
        "userlogin-joinproject": "Rejonhètz {{SITENAME}}",
-       "nologin": "Avètz pas un compte ? '''$1'''.",
-       "nologinlink": "Creatz un compte",
        "createaccount": "Crear un compte novèl",
-       "gotaccount": "Ja avètz un compte ? '''$1'''.",
-       "gotaccountlink": "Identificatz-vos",
-       "userlogin-resetlink": "Avètz doblidat vòstres detalhs de connexion ?",
        "userlogin-resetpassword-link": "Senhal doblidat ?",
        "userlogin-helplink2": "Ajuda a la connexion",
        "userlogin-loggedin": "Sètz ja connectat en tant que {{GENDER:$1|$1}}.\nUtilizatz lo formulari çaijós per vos connectar amb un autre utilizaire.",
        "createacct-another-email-ph": "Picar l'adreça de corrièr electronic",
        "createaccountmail": "Utilizar un senhal aleatòri temporari e lo mandar a l’adreça de corrièl especificada",
        "createacct-realname": "Nom vertadièr (facultatiu)",
-       "createaccountreason": "Motiu :",
        "createacct-reason": "Motiu",
        "createacct-reason-ph": "Perqué creatz un autre compte",
        "createacct-reason-help": "Messatge afichat dins lo jornal de creacion de compte",
        "preview": "Previsualizar",
        "showpreview": "Previsualizar",
        "showdiff": "Veire los cambiaments",
-       "blankarticle": "<strong>Atencion :</strong> La pagina que creatz es voida.\nSe clicatz tornarmai sus « {{int:savearticle}} », la pagina serà creada sens cap de contengut.",
+       "blankarticle": "<strong>Atencion :</strong> La pagina que creatz es voida.\nSe clicatz tornarmai sus « $1 », la pagina serà creada sens cap de contengut.",
        "anoneditwarning": "<strong>Atencion :<strong> sètz pas connectat.\nVòstra adreça IP serà visibla per tot lo monde se fasètz de modificacions. Se <strong>[$1 vos connectatz]</strong> o <strong>[$2 creatz un compte]</strong>, vòstras modificacions seràn atribuidas a vòstre nom d’utilizaire, entre autres avantatges.",
        "anonpreviewwarning": "''Sètz pas identificat. Salvar enregistrarà vòstra adreça IP dins l’istoric de las modificacions de la pagina.''",
        "missingsummary": "'''Atencion :''' avètz pas modificat lo resumit de vòstra modificacion. Se clicatz tornarmai sul boton « Salvar », lo salvament serà fait sens avertiment mai.",
        "missingcommenttext": "Mercé de metre un comentari çaijós.",
        "missingcommentheader": "<strong>Rapèl :</strong> Avètz pas provesit cap de subjècte per aqueste comentari.\nSe clicatz tornamai sus « {{int:Savearticle}} », vòstra modificacion serà enregistrada sens subjècte.",
-       "summary-preview": "Previsualizacion del resumit :",
-       "subject-preview": "Previsualizacion del subjècte",
+       "summary-preview": "Apercebut del resumit de modificacion :",
+       "subject-preview": "Apercebut del subjècte :",
        "blockedtitle": "L'utilizaire es blocat",
        "blockedtext": "'''Vòstre compte d'utilizaire o vòstra adreça IP es estat blocat'''\n\nLo blocatge es estat efectuat per $1.\nLa rason invocada es la seguenta : ''$2''.\n\n* Començament del blocatge : $8\n* Expiracion del blocatge : $6\n* Compte blocat : $7.\n\nPodètz contactar $1 o un autre [[{{MediaWiki:Grouppage-sysop}}|administrator]] per ne discutir.\nPodètz pas utilizar la foncion « Mandar un corrièr electronic a aqueste utilizaire » que se una adreça de corrièr valida es especificada dins vòstras [[Special:Preferences|preferéncias]].\nVòstra adreça IP actuala es $3 e vòstre identificant de blocatge es #$5.\nIncluissètz aquesta adreça dins tota requèsta.",
        "autoblockedtext": "Vòstra adreça IP es estada blocada automaticament perque es estada utilizada per un autre utilizaire, ele-meteis blocat per $1.\nLa rason invocadaa es :\n\n:''$2''\n\n* Començament del blocatge : $8\n* Expiracion del blocatge : $6\n* Compte blocat : $7\n\nPodètz contactar $1 o un dels autres [[{{MediaWiki:Grouppage-sysop}}|administrators]] per discutir d'aqueste blocatge.\n\nNotatz que podètz pas utilizar la foncionalitat \"Mandar un messatge a aqueste utilizaire\" tant qu'auretz pas  una adreça e-mail enregistrada dins vòstras [[Special:Preferences|preferéncias]] e tant que seretz pas blocat per son utilizacion.\n\nVòstra adreça IP actuala es $3, e lo numèro de blocatge es $5.\nPrecisatz aquestas indicacions dins totas las requèstas que faretz.",
        "undo-failure": "Aquesta modificacion a pas pogut èsser desfaita a causa de conflictes amb de modificacions intermediàrias.",
        "undo-norev": "La modificacion a pas pogut èsser desfaita perque siá es inexistenta siá es estada suprimida.",
        "undo-nochange": "Sembla que la modificacion es ja estada anullada.",
-       "undo-summary": "Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutir]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
+       "undo-summary": "Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])",
        "undo-summary-username-hidden": "Anullar la revision $1 per un utilizaire amagat",
        "cantcreateaccount-text": "La creacion de compte dempuèi aquesta adreça IP ('''$1''') es estada blocada per [[User:$3|$3]].\n\nLa rason balhada per $3 èra ''$2''.",
        "cantcreateaccount-range-text": "La creacion de compte dempuèi las adreças IP dins la plaja <strong>$1</strong>, que compren vòstra agreça IP (<strong>$4</strong>) son estadas blocadas per [[User:$3|$3]].\n\nLo motiu provesit per $3 es <em>$2</em>",
        "page_first": "primièra",
        "page_last": "darrièra",
        "histlegend": "Legenda : ({{MediaWiki:Cur}}) = diferéncia amb la version actuala ,\n({{MediaWiki:Last}}) = diferéncia amb la version precedenta, <b>m</b> = cambiament menor",
-       "history-fieldset-title": "Percórrer l'istoric",
-       "history-show-deleted": "Suprimits solament",
+       "history-fieldset-title": "Recercar de revisions",
+       "history-show-deleted": "Revision suprimida unicament",
        "histfirst": "Las mai ancianas",
        "histlast": "Las mai recentas",
        "historysize": "({{PLURAL:$1|1 octet|$1 octets}})",
        "prefs-diffs": "Diferéncias",
        "prefs-help-prefershttps": "Aquesta preferéncia serà efectiva al moment de vòstra connexion que ven.",
        "prefs-tabs-navigation-hint": "Astúcia : Podètz utilizar las sagetas d'esquèrra e de dreita per navigar entre los onglets.",
-       "userrights": "Gestion dels dreits d'utilizaire",
+       "userrights": "Dreits dels utilizaires",
        "userrights-lookup-user": "Seleccionar un utilizaire",
        "userrights-user-editname": "Entrar un nom d’utilizaire :",
        "editusergroup": "Cargar de gropes d’utilizaires",
        "right-editsemiprotected": "Modificar las paginas protegidas amb « {{int:protect-level-autoconfirmed}} »",
        "right-editcontentmodel": "Modificar lo modèl de contengut d’una pagina",
        "right-editinterface": "Modificar l'interfàcia d'utilizaire",
-       "right-editusercssjs": "Modificar los fichièrs CSS e JS d'autres utilizaires",
        "right-editusercss": "Modificar los fichièrs CSS d'autres utilizaires",
        "right-edituserjs": "Modificar los fichièrs JS d'autres utilizaires",
        "right-editmyusercss": "Modificar vòstres pròpris fichièrs CSS utilizaire",
        "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-filter-user-experience-level-newcomer-label": "Novèls arribants",
+       "rcfilters-filter-user-experience-level-learner-label": "Aprenents",
+       "rcfilters-filter-user-experience-level-experienced-label": "Utilizaires experimentats",
        "rcfilters-filtergroup-automated": "Contribucions automatizadas",
        "rcfilters-filter-bots-label": "Robòt",
        "rcfilters-filter-humans-label": "Èsser uman (pas robòt)",
        "rcshowhidecategorization": "$1 la categorizacion de las paginas",
        "rcshowhidecategorization-show": "Afichar",
        "rcshowhidecategorization-hide": "Amagar",
-       "rclinks": "Afichar los $1 darrièrs cambiaments efectuats al cors dels $2 darrièrs jorns<br />$3.",
+       "rclinks": "Afichar los $1 darrièrs cambiaments efectuats al cors dels $2 darrièrs jorns",
        "diff": "dif",
        "hist": "ist",
        "hide": "amagar",
        "protect-expiry-options": "1 ora:1 hour,1 jorn:1 day,1 setmana:1 week,2 setmanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 an:1 year,indefinidament:infinite",
        "restriction-type": "Permission :",
        "restriction-level": "Nivèl de restriccion :",
-       "minimum-size": "Talha minimoma",
+       "minimum-size": "Talha minimala",
        "maximum-size": "Talha maximala :",
        "pagesize": "(octets)",
        "restriction-edit": "Modificacion",
        "undeleteviewlink": "veire",
        "undeleteinvert": "Inversar la seleccion",
        "undeletecomment": "Motiu :",
-       "undeletedrevisions": "{{PLURAL:$1|1 revision restablida|$1 revisions restablidas}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} e {{PLURAL:$2|1 fichièr restablit|$2 fichièrs restablits}}",
-       "undeletedfiles": "$1 {{PLURAL:$1|fichièr restablit|fichièrs restablits}}",
        "cannotundelete": "Certanas o totas las restitucions an fracassat :\n$1",
        "undeletedpage": "<strong>La pagina $1 es estada restablida</strong>.\n\nConsultatz l’[[Special:Log/delete|istoric de las supressions]] per veire la lista de las supressions e dels restabliments recents.",
        "undelete-header": "Consultatz l’[[Special:Log/delete|istoric de las supressions]] per veire las paginas recentament suprimidas.",
        "log-name-tag": "Jornal de las balisas",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|a mes a jorn}} las balisas de la revision $4 de la pagina $3 ($6 {{PLURAL:$7|aponduda|apondudas}} ; $8 {{PLURAL:$9|suprimida|suprimidas}})",
        "rightsnone": "(cap)",
-       "revdelete-summary": "modificar lo somari",
        "feedback-adding": "Apondon de vòstres comentaris a la pagina...",
        "feedback-back": "Retorn",
        "feedback-bugcheck": "Remirable ! Verificatz simplament qu'es pas un dels [$1 bugs ja coneguts].",
index b77db9d..109a4c8 100644 (file)
        "editlink": "kohendele",
        "viewsourcelink": "Kačo algukoodu",
        "editsectionhint": "Kohendele tädä kohtua: $1",
-       "toc": "Sizäldö",
+       "toc": "Syväindö",
        "showtoc": "ozuttua",
-       "hidetoc": "peittiä",
+       "hidetoc": "peitä",
        "collapsible-collapse": "Peitä",
        "collapsible-expand": "Levitä",
        "confirmable-confirm": "{{GENDER:$1|Oletgo}} varmu?",
        "password-change-forbidden": "Et voi vaihtua peittosanoi täs wikis.",
        "login": "Kirjuttai",
        "nav-login-createaccount": "Kirjuttai libo registriiruiččei",
-       "userlogin": "Kirjuttai libo registriiruiččei",
-       "userloginnocreate": "Kirjuttai",
        "logout": "Kirjuttai ullos",
        "userlogout": "Kirjuttai ullos",
        "notloggedin": "Ei kirjutannuhes",
        "userlogin-noaccount": "Ei ole tilii?",
        "userlogin-joinproject": "Yhty {{SITENAME}}",
-       "nologin": "Ei ole tilii? $1",
-       "nologinlink": "Luaji tili",
        "createaccount": "Registriiruiččei",
-       "gotaccount": "Ollou sinul jo tunnus? $1",
-       "gotaccountlink": "Kirjuttai",
-       "userlogin-resetlink": "Unohtitgo sinun käyttäinimen/peittosanan?",
        "userlogin-resetpassword-link": "Unohtitgo sinun peittosanan?",
        "userlogin-helplink2": "Abuu kirjuttamizeh",
        "userlogin-loggedin": "Olet jo kirjutannuhes nimel {{GENDER:$1|$1}}.\nKäytä al olijua ankiettua ku kirjuttuakseh eri käyttäjänny.",
        "createacct-email-ph": "Kirjuta sinun sähköpoštuadressu",
        "createacct-another-email-ph": "Kirjuta sinun sähköpoštuadressu",
        "createacct-realname": "Tovelline nimi (omatahtoine tiedo)",
-       "createaccountreason": "Syy:",
        "createacct-reason": "Syy",
        "createacct-reason-ph": "Mindäh olet luadimas tostu käyttäitilii",
        "createacct-submit": "Luaji tili",
        "prefs-changeemail": "Vaihta libo ota iäre sähköpoštuadressu",
        "prefs-setemail": "Kirjuta sähköpoštuadressu",
        "saveprefs": "Tallenda",
-       "rows": "Riädyy:",
        "searchresultshead": "Eččie",
        "timezoneregion-africa": "Afriekku",
        "timezoneregion-america": "Ameriekku",
        "rcshowhideanons-show": "Ozuta",
        "rcshowhideanons-hide": "Peitä",
        "rcshowhidepatr-show": "Ozuttua",
-       "rcshowhidepatr-hide": "Peittiä",
+       "rcshowhidepatr-hide": "Peitä",
        "rcshowhidemine": "$1 minun kohendukset",
        "rcshowhidemine-show": "Ozuta",
        "rcshowhidemine-hide": "Peitä",
-       "rclinks": "Ozuta jälgimäzet $1 muutostu jälgimäzen $2 päivän aijannu<br />$3",
+       "rclinks": "Ozuta jälgimäzet $1 muutostu jälgimäzen $2 päivän aijannu",
        "diff": "erot",
        "hist": "Histourii",
        "hide": "Peitä",
index 19e7e17..9c862ad 100644 (file)
        "login": "ଲଗ-ଇନ (Log in)",
        "login-security": "ଆପଣଙ୍କ ପରିଚୟ ଯାଞ୍ଚ କରନ୍ତୁ",
        "nav-login-createaccount": "ଲଗ ଇନ /ନୂଆ ଖାତା ଖୋଲନ୍ତୁ",
-       "userlogin": "ଲଗ ଇନ /ନୂଆ ଖାତା ଖୋଲନ୍ତୁ",
-       "userloginnocreate": "ଲଗ-ଇନ (Log in)",
        "logout": "ଲଗଆଉଟ",
        "userlogout": "ଲଗ ଆଉଟ",
        "notloggedin": "ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି",
        "userlogin-noaccount": "ଖାତାଟିଏ ନାହିଁ?",
        "userlogin-joinproject": "{{SITENAME}}ରେ ଯୋଗଦିଅନ୍ତୁ",
-       "nologin": "ଖାତାଟିଏ ନାହିଁ? $1।",
-       "nologinlink": "ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ",
        "createaccount": "ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ",
-       "gotaccount": "ଆଗରୁ ଖାତାଟିଏ ଅଛି କି? $1.",
-       "gotaccountlink": "ଲଗ ଇନ (Log in)",
-       "userlogin-resetlink": "ଲଗଇନ ତଥ୍ୟ ସବୁ ଭୁଲିଗେଲେକି?",
        "userlogin-resetpassword-link": "ପାସୱାର୍ଡ଼ ମନେପଡୁନାହିଁ?",
        "userlogin-helplink2": "ଲଗ ଇନ ପାଇଁ ସହଯୋଗ କରନ୍ତୁ",
        "userlogin-loggedin": "ଆପଣ {{GENDER:$1|$1}} ନାମରେ ଲଗ ଇନ କରିଛନ୍ତି । ତଳ ଫର୍ମଟି ବ୍ୟବହାର କରି ଆଉ ଜଣେ ସଭ୍ୟ ଭାବେ ଲଗ ଇନ କରନ୍ତୁ ।",
        "createaccountmail": "ଏକ ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରନ୍ତୁ ଏବଂ ଏହାକୁ ତଳେ ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାକୁ ପଠାଇଦିଅନ୍ତୁ",
        "createaccountmail-help": "ପାସୱାର୍ଡ ନ ଜାଣି ମଧ୍ୟ ଆଉ ଜଣେ ବ୍ୟକ୍ତି ଙ୍କ ପାଇଁ ଖାତା ଖୋଲିବାକୁ ବ୍ୟବହାର କରାଯାଇପାରିବ।",
        "createacct-realname": "ପ୍ରକୃତ ନାମ (ଇଚ୍ଛାଧୀନ)",
-       "createaccountreason": "କାରଣ:",
        "createacct-reason": "କାରଣ",
        "createacct-reason-ph": "ଆପଣ ଅନ୍ୟଏକ ଖାତା କାହିଁକି ତିଆରି କରୁଛନ୍ତି",
        "createacct-reason-help": "ଖାତା ଖୋଲିବା ଲଗ ରେ ବାର୍ତା ଦେଖାଯାଇଛି",
        "preview": "ସାଇତିବା ଆଗରୁ ଦେଖନ୍ତୁ",
        "showpreview": "ଦେଖଣା [Preview]",
        "showdiff": "ବଦଳଗୁଡ଼ିକ ଦେଖାଇବେ",
-       "blankarticle": "<strong>ଚେତାବନୀ:</strong> ଆପଣ ସମ୍ପାଦନା କରୁଥିବା ଏହି ପୃଷ୍ଠାଟି ଫାଙ୍କା ଅଛି ।\nଯଦି ଆପଣ \"{{int:savearticle}}\" ଉପରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ପୃଷ୍ଠାଟି କୌଣସି ବିଷୟବସ୍ତୁ ନଥାଇ ତିଆରି ହୋଇଯିବ ।",
+       "blankarticle": "<strong>ଚେତାବନୀ:</strong> ଆପଣ ସମ୍ପାଦନା କରୁଥିବା ଏହି ପୃଷ୍ଠାଟି ଫାଙ୍କା ଅଛି ।\nଯଦି ଆପଣ \"$1\" ଉପରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ପୃଷ୍ଠାଟି କୌଣସି ବିଷୟବସ୍ତୁ ନଥାଇ ତିଆରି ହୋଇଯିବ ।",
        "anoneditwarning": "<strong>ସାବଧାନ:</strong> ଆପଣ ଲଗ-ଇନ କରିନାହାନ୍ତି । ଅଧିକ ସମ୍ପାଦନା କଲେ ଆପଣଙ୍କ IP Address ଟି ସମସ୍ତଙ୍କୁ ଦେଖାଯିବ । <strong>[$1 ଲଗ ଇନ କଲେ]</strong> କିମ୍ବା <strong>[$2 ନୂଆ ଖାତାଟିଏ ତିଆରି କଲେ]</strong>, ଆପଣଙ୍କ ସମ୍ପାଦନାର ଶ୍ରେୟ ଅନ୍ୟାନ୍ୟ ସୁବିଧା ସହିତ ଆପଣଙ୍କ ଇଉଜର ନାମରେ ଦିଆହେବ ।",
        "anonpreviewwarning": "''ଆପଣ ଲଗ ଇନ କରି ନାହାନ୍ତି । ବଦଳକରି ସାଇତିଲେ ଆପଣଙ୍କର IP ଠିକଣା ଏହି ପୃଷ୍ଠାର ଇତିହାସରେ ସାଇତା ହୋଇଯିବ ।''",
-       "missingsummary": "'''ଚେତାବନୀ:''' ଆପଣ ଏକ ସମ୍ପାଦନା ସାରକଥା ଦେଇନାହାନ୍ତି ।\nଯଦି ଆପଣ \"{{int:savearticle}}\"ରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ତେବେ ଆପଣଙ୍କ ବଦଳ ସାରକଥା ବିନା ସାଇତା ହୋଇଯିବ ।",
-       "selfredirect": "<strong>ସାବଧନ :</strong> ଆପଣ ଏହି ପୃଷ୍ଠାଟିକୁ ତା ମଧ୍ୟକୁ ଲେଇଟାଉଛନ୍ତି । ଆପଣ ବୋଧ ହୁଏ ଭୁଲ ଲକ୍ଷସ୍ଥଳ ଦେଇଛନ୍ତି କିମ୍ବା ଭୁଲ ପୃଷ୍ଠଟିକୁ ବଦଳାଉଛନ୍ତି । \nଆପଣ ଯଦି \"{{int:savearticle}}\"ରେ ଆଉଥରେ କ୍ଲିକ କରିବେ ତେବେ ଲେଉଟାଣିଟି ଯାହା ହେଲେ ସାଇତା ହେଇଯିବା ।",
+       "missingsummary": "'''ଚେତାବନୀ:''' ଆପଣ ଏକ ସମ୍ପାଦନା ସାରକଥା ଦେଇନାହାନ୍ତି ।\nଯଦି ଆପଣ \"$1\"ରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ତେବେ ଆପଣଙ୍କ ବଦଳ ସାରକଥା ବିନା ସାଇତା ହୋଇଯିବ ।",
+       "selfredirect": "<strong>ସାବଧନ :</strong> ଆପଣ ଏହି ପୃଷ୍ଠାଟିକୁ ତା ମଧ୍ୟକୁ ଲେଇଟାଉଛନ୍ତି । ଆପଣ ବୋଧ ହୁଏ ଭୁଲ ଲକ୍ଷସ୍ଥଳ ଦେଇଛନ୍ତି କିମ୍ବା ଭୁଲ ପୃଷ୍ଠଟିକୁ ବଦଳାଉଛନ୍ତି । \nଆପଣ ଯଦି \"$1\"ରେ ଆଉଥରେ କ୍ଲିକ କରିବେ ତେବେ ଲେଉଟାଣିଟି ଯାହା ହେଲେ ସାଇତା ହେଇଯିବା ।",
        "missingcommenttext": "ଦୟାକରି ତଳେ ଏକ ମତାମତ ଦିଅନ୍ତୁ ।",
-       "missingcommentheader": "'''ଚେତାବନୀ:''' ଆପଣ ଏହି ମତଟି ନିମନ୍ତେ ଏକ ଶିରୋନାମା/ମୁଖ୍ୟ ନାମ ଦେଇନାହାନ୍ତି ।\nଯଦି ଆପଣ \"{{int:savearticle}}\"ରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ତେବେ ଆପଣଙ୍କ ବଦଳ ସାରକଥା ବିନା ସାଇତା ହୋଇଯିବ ।",
+       "missingcommentheader": "'''ଚେତାବନୀ:''' ଆପଣ ଏହି ମତଟି ନିମନ୍ତେ ଏକ ଶିରୋନାମା/ମୁଖ୍ୟ ନାମ ଦେଇନାହାନ୍ତି ।\nଯଦି ଆପଣ \"$1\"ରେ ଆଉଥରେ କ୍ଲିକ କରନ୍ତି, ତେବେ ଆପଣଙ୍କ ବଦଳ ସାରକଥା ବିନା ସାଇତା ହୋଇଯିବ ।",
        "summary-preview": "ସାରକଥା ଦେଖଣା:",
        "subject-preview": "ବିଷୟ/ଶିରୋନାମା ଦେଖଣା:",
        "previewerrortext": "ଆପଣ ବଦଳାଇଥିବା ବଦଳ ଗୁଡିକୁ ଦେଖାଇବା ବେଳେ ଅସୁବିଧା ହେଲା ।",
        "editingsection": "$1 (ଭାଗ)କୁ ବଦଳାଇବେ",
        "editingcomment": "$1 (ନୂଆ ଭାଗ)କୁ ବଦଳାଉଛୁ",
        "editconflict": "ବଦଳାଇବା ଦ୍ଵନ୍ଦ: $1",
-       "explainconflict": "ଆପଣ ବଦଳାଇବା ଆରମ୍ଭ କରିବା ଭିତରେ କେହିଜଣେ ଏହି ପୃଷ୍ଠାକୁ ବଦଳାଇଛନ୍ତି ।\nଉପର ଲେଖା ଜାଗାଟି ଏହା ଯେମିତି ଅଛି ସେମିତି ଥିବା ଲେଖାଟି ଦେଖାଉଛି ।\nତଳ ଜାଗାଟିରେ ଆପଣ କରିଥିବା ବଦଳ ଦେଖାଉଛି ।\nଏବେ ଥିବା ଲେଖାରେ ଆପଣଙ୍କୁ ନିଜ ବଦଳକୁ ମିଶାଇବାକୁ ହେବ ।\nଯଦି ଆପଣ \"{{int:savearticle}}\" ଦବାନ୍ତି ତେବେ '''କେବଳ''' ଉପର ଲେଖାଟି ସାଇତା ହୋଇଯିବ ।",
+       "explainconflict": "ଆପଣ ବଦଳାଇବା ଆରମ୍ଭ କରିବା ଭିତରେ କେହିଜଣେ ଏହି ପୃଷ୍ଠାକୁ ବଦଳାଇଛନ୍ତି ।\nଉପର ଲେଖା ଜାଗାଟି ଏହା ଯେମିତି ଅଛି ସେମିତି ଥିବା ଲେଖାଟି ଦେଖାଉଛି ।\nତଳ ଜାଗାଟିରେ ଆପଣ କରିଥିବା ବଦଳ ଦେଖାଉଛି ।\nଏବେ ଥିବା ଲେଖାରେ ଆପଣଙ୍କୁ ନିଜ ବଦଳକୁ ମିଶାଇବାକୁ ହେବ ।\nଯଦି ଆପଣ \"$1\" ଦବାନ୍ତି ତେବେ '''କେବଳ''' ଉପର ଲେଖାଟି ସାଇତା ହୋଇଯିବ ।",
        "yourtext": "ଆପଣଙ୍କ ଲେଖା",
        "storedversion": "ସାଇତା ସଙ୍କଳନ",
        "nonunicodebrowser": "'''ଚେତାବନୀ: ଆପଣଙ୍କ ବ୍ରାଉଜରରେ ଇଉନିକୋଡ଼ ସଚଳ କରାଯାଇନାହିଁ ।'''\nଏକ ୱର୍କାଆରାଉଣ୍ଡ ଏକ ଏହିପରି ଜାଗା ଯାହା ଆପଣଙ୍କୁ ନିରାପଦ ଭାବରେ ପୃଷ୍ଠା ସମ୍ପାଦନ କରିବାରେ ସାହାଯ୍ୟ କରିଥାଏ: ଅଣ-ASCII ଅକ୍ଷରସମୂହ ସମ୍ପାଦନା ଘରେ ହେକ୍ସାଡେସିମାଲ କୋଡ଼ ରୂପେ ଦେଖାଯିବ ।",
        "right-editprotected": "କିଳାଯାଇଥିବା ପୃଷ୍ଠାମାନଙ୍କର ସମ୍ପାଦନା କରିବେ (କ୍ୟାସକେଡ଼କରା କିଳଣା ବିନା)",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" ଭାବେ ଲୁଚାଯାଇଥିବା ପୃଷ୍ଠାସବୁ ସମ୍ପାଦନା କରନ୍ତୁ",
        "right-editinterface": "ସଭ୍ୟଙ୍କ ଇଣ୍ଟରଫେସ ବଦଳାଇବେ",
-       "right-editusercssjs": "ବାକି ସଭ୍ୟମାନଙ୍କର CSS ଓ ଜାଭାସ୍କ୍ରିପ୍ଟ ଫାଇଲ ସବୁକୁ ବଦଳାଇବେ",
        "right-editusercss": "ବାକି ସଭ୍ୟମାନଙ୍କ CSS ଫାଇଲସବୁ ବଦଳାଇବେ",
        "right-edituserjs": "ବାକି ସଭ୍ୟମାନଙ୍କର ଜାଭାସ୍କ୍ରିପ୍ଟ ଫାଇଲ ସବୁକୁ ବଦଳାଇବେ",
        "right-editmyusercss": "ନିଜ ସଭ୍ୟ CSS ଫାଇଲସବୁ ସମ୍ପାଦନା କରନ୍ତୁ",
        "rcshowhidemine-show": "ଦେଖାଇବେ",
        "rcshowhidemine-hide": "ଲୁଚାଇବେ",
        "rcshowhidecategorization": "$1 ପୃଷ୍ଠା ଶ୍ରେଣୀବିଭାଗ",
-       "rclinks": "ଗଲା $2 ଦିନର $1 ବଦଳଗୁଡ଼ିକୁ ଦେଖାଇବେ<br />$3",
+       "rclinks": "ଗଲା $2 ଦିନର $1 ବଦଳଗୁଡ଼ିକୁ ଦେଖାଇବେ",
        "diff": "ଅଦଳ ବଦଳ",
        "hist": "ଇତିହାସ",
        "hide": "ଲୁଚାନ୍ତୁ",
        "nimagelinks": "$1 ଟି {{PLURAL:$1|ପୃଷ୍ଠା|ପୃଷ୍ଠା}}ରେ ବ୍ୟବହାର କରାଯାଇଅଛି",
        "ntransclusions": "$1ଟି {{PLURAL:$1|ପୃଷ୍ଠା|ପୃଷ୍ଠା}}ରେ ବ୍ୟବହାର କରାଯାଇଅଛି",
        "specialpage-empty": "ଏହି ଅନୁରୋଧ ପାଇଁ କିଛି ଫଳାଫଳ ମିଳିଲା ନାହିଁ ।",
-       "lonelypages": "à¬\85ନାଥ ପୃଷ୍ଠା ସବୁ",
+       "lonelypages": "à¬\8fà¬\95ାà¬\95à­\80 ପୃଷ୍ଠା ସବୁ",
        "lonelypagestext": "ତଲାଲିଖିତ ପୃଷ୍ଠାମାନ {{SITENAME}}ରେ ଥିବା ବାକି ପୃଷ୍ଠାମାନଙ୍କ ସହ ଯୋଡ଼ାଯାଇନାହିଁ ବା କେବଳ ସେଥିରେ ବ୍ୟବହାର କରାଯାଇନାହିଁ ।",
        "uncategorizedpages": "ଶ୍ରେଣୀହୀନ ପୃଷ୍ଠାସମୂହ",
        "uncategorizedcategories": "ଶ୍ରେଣୀହୀନ ଶ୍ରେଣୀସମୂହ",
        "prefixindex-strip": "ତାଲିକାରୁ ନାମ ଆଗରୁ ଲାଗୁଥିବା ଶବ୍ଦ ହଟାନ୍ତୁ",
        "shortpages": "ଛୋଟ ପୃଷ୍ଠାସମୂହ",
        "longpages": "ଲମ୍ବା ପୃଷ୍ଠା",
-       "deadendpages": "à¬\86à¬\97à¬\95à­\81 à¬¯à¬¾à¬\87ପାରà­\81ନଥିବା ପୃଷ୍ଠା",
+       "deadendpages": "à¬\85ନà­\8dà­\9f à¬ªà­\83ଷà­\8dଠା à¬¸à¬\99à­\8dà¬\97à­\87 à¬¯à­\8bଡ଼ା à¬¹à­\87à¬\87ନଥିବା ପୃଷ୍ଠା",
        "deadendpagestext": "ଏହି ପୃଷ୍ଠାସବୁ {{SITENAME}}ର ବାକି ପୃଷ୍ଠାମାନଙ୍କ ସଙ୍ଗେ ଯୋଡ଼ା ହୋଇ ନାହାନ୍ତି ।",
        "protectedpages": "କିଳାଯାଇଥିବା ପୃଷ୍ଠାମାନ",
        "protectedpages-indef": "କେବଳ ଆସିମୀତ କାଳ ପାଇଁ କିଳିବା",
        "undeleteviewlink": "ଦେଖଣା",
        "undeleteinvert": "ବଛାଯାଇଥିବା ଲେଖାକୁ ଓଲଟେଇଦେବେ",
        "undeletecomment": "କାରଣ:",
-       "undeletedrevisions": "{{PLURAL:$1|ଗୋଟିଏ ସଂକଳନ|$1 ଗୋଟି ସଂକଳନ}} ପୁନସ୍ଥାପନ କରାଗଲା",
-       "undeletedrevisions-files": "{{PLURAL:$1|ଗୋଟିଏ ସଂସ୍କରଣ|$1 ଗୋଟି ସଂସ୍କରଣ}} ଓ {{PLURAL:$2|ଗୋଟିଏ ଫାଇଲ|$2 ଗୋଟି ଫାଇଲ}} ପୁନସ୍ଥାପନ କରାଗଲା",
-       "undeletedfiles": "{{PLURAL:$1|ଗୋଟିଏ ଫାଇଲ|$1 ଗୋଟି ଫାଇଲ}} ପୁନସ୍ଥାପନ କରାଗଲା",
        "cannotundelete": "ଲିଭାଇବାରୁ ରୋକିବା ବିଫଳ ହେଲା;\n$1",
        "undeletedpage": "'''$1ର ପୁନସ୍ଥାପନ କରାଗଲା'''\n\nନଗଦ ଲିଭାଇବା ଓ ପୁନସ୍ଥାପନ ପାଇଁ [[Special:Log/delete|ଲିଭାଇବା ଇତିହାସ]] ଦେଖନ୍ତୁ ।",
        "undelete-header": "ନଗଦ ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାସବୁ ପାଇଁ [[Special:Log/delete|ଲିଭାଇବା ଇତିହାସ]] ଦେଖନ୍ତୁ ।",
        "logentry-upload-revert": "$1, $3 {{GENDER:$2|ଅପଲୋଡ଼ କଲେ}}",
        "log-name-tag": "ଟାଗ ଲଗ",
        "rightsnone": "(କିଛି ନାହିଁ)",
-       "revdelete-summary": "ସାରକଥା ସମ୍ପାଦନା",
        "feedback-adding": "ପୃଷ୍ଠାରେ ମତାମତ ଦେଉଛି...",
        "feedback-back": "ପଛକୁ ଯିବେ",
        "feedback-bugcheck": "ବହୁତ ଭଲ ! ଖାଲି ଦେଖିଦିଅନ୍ତୁ ଯେ ଏହା ଆଗରୁ ଥିବା [$1 known bugs] ମଧ୍ୟରୁ ନୁହେଁ ତ ।",
index bdc8b77..10ac84e 100644 (file)
@@ -7,7 +7,8 @@
                        "HalanTul",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "Æрвитæнты бын хахх:",
        "externaldberror": "Кæнæ аутентификацийы рарддоны рæдыд æрцыдис, кæнæ та дæуæн нæй бар снæуæг кæнын дæ æддаг аккаунт.",
        "login": "Бахизын",
        "nav-login-createaccount": "Бахизын / срегистраци кæнын",
-       "userlogin": "Бахизын / регистраци кæнын",
-       "userloginnocreate": "Бахизын",
        "logout": "Рахизын",
        "userlogout": "Рахизын",
        "notloggedin": "Системæмæ хызт нæ дæ",
        "userlogin-noaccount": "Нæй дын аккаунт?",
        "userlogin-joinproject": "Баиу у {{grammar:comitative|{{SITENAME}}}}",
-       "nologin": "Регистрацигонд нæма дæ? $1.",
-       "nologinlink": "Регистраци",
        "createaccount": "Регистраци кæнын",
-       "gotaccount": "Регистрацигонд дæ? $1.",
-       "gotaccountlink": "Бахизын",
-       "userlogin-resetlink": "Ферох дæ сты дæ бахизæнтæ?",
        "userlogin-resetpassword-link": "Ферох и дæ пароль?",
        "userlogin-helplink2": "Бахизынæн æххуыс",
        "userlogin-loggedin": "Ды бахызтæ куыд $1.\nДæлæ цы формæ уыныс, уый æххуысæй дæ бон у æндæр фæсномыгæй бахизын.",
        "createacct-another-email-ph": "Бафысс дæ эл. посты адрис",
        "createaccountmail": "Рæстæгмæ пароль халæй ист æрцæуæд æмæ амынд электрон посты адрисмæ æрвыст æрцæуæд",
        "createacct-realname": "Æцæг ном (фæндон)",
-       "createaccountreason": "Бындур:",
        "createacct-reason": "Бындур",
        "createacct-reason-ph": "Цæмæн аразыс æндæр аккаунт?",
        "createacct-submit": "Сараз дæ аккаунт",
        "passwordreset-emaildisabled": "Электрон пост ацы викийы хицæн у.",
        "passwordreset-username": "Фæсномыг:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Цы фыстæг рауадис, уый фенис?",
-       "passwordreset-capture-help": "Кæд сæвæрай ацы нысан, уæд дын e-mail (рæстæгмæ паролимæ) æвдыст æрцæудзæн. Архайæгмæ дæр æрвыст æрцæудзæн.",
        "passwordreset-email": "Электрон посты адрис:",
        "passwordreset-emailtitle": "{{grammar:genitive|{{SITENAME}}}} акканты тыххæй",
        "passwordreset-emailtext-ip": "Чидæр (уæццæгæн ды, $1 IP адрисæй) æрдомдта дæ {{grammar:genitive|{{SITENAME}}}} ($4) пароль ногæй сæвæрын. Ацы архайæджы {{PLURAL:$3|аккаунт баст у|аккаунттæ баст сты}} ацы электрон посты адрисимæ:\n\n$2\n\n{{PLURAL:$3|Ацы рæстæгмæ пароль|Ацы рæстæгмæ паролтæ}} кусдзысты {{PLURAL:$5|иу бон|$5 боны}}.\nНыр ды хъуамæ бахизай системæмæ æмæ равзарай ног пароль. Кæд ай æндæр чидæр æрдомдта, кæнæ кæд дæ пароль æрхъуыды кодтай æмæ дæ нал фæды фæивай йæ, уæд дæ бон у мацæмæ дарай ацы фыстæг æмæ дарддæр архайай дæ зæронд паролæй.",
        "showdiff": "Иртасын",
        "anoneditwarning": "'''Сындæггай:''' Ды системæйы нæ дæ.\nДæ IP адрес фыст æрцæудзæнис фарсы историйы.",
        "anonpreviewwarning": "''Ды системæмæ хызт нæ дæ. Бавæрд дын дæ IP адрис ныффысдзæн фарсы историйы.''",
-       "missingsummary": "'''Æрхъуыдыкæнинаг:''' Ды не рхастай ивды афыст.\nКæд ногæй равзарай \"{{int:savearticle}}\", уæд ивд æнæ афыстæй бавæрд уыдзæнис.",
+       "missingsummary": "'''Æрхъуыдыкæнинаг:''' Ды не рхастай ивды афыст.\nКæд ногæй равзарай \"$1\", уæд ивд æнæ афыстæй бавæрд уыдзæнис.",
        "missingcommenttext": "Дæ хорзæхæй, дæлдæр комментари бафысс.",
-       "missingcommentheader": "'''Æрхъуыдыкæнинаг:''' Ды ацы комментарийæн не рхастай темæ/сæр.\nКæд ногæй равзарай \"{{int:savearticle}}\", уæд ивд æнæ уымæй бавæрд уыдзæнис.",
+       "missingcommentheader": "'''Æрхъуыдыкæнинаг:''' Ды ацы комментарийæн не рхастай темæ/сæр.\nКæд ногæй равзарай \"$1\", уæд ивд æнæ уымæй бавæрд уыдзæнис.",
        "summary-preview": "Ивд афыст уыдзæн:",
        "subject-preview": "Темæ/сæр:",
        "blockedtitle": "Архайæг хъодыгонд у",
        "editingsection": "Ивд цæуы $1 (хай)",
        "editingcomment": "Ивд цæуы $1 (ног хай)",
        "editconflict": "Ивыны конфликт: $1",
-       "explainconflict": "Цалынмæ ды ацы фарс ивтай, уæдмæ йæ æндæр чидæр фæивта.\nУæллаг текст ивыны бынаты ды уыныс фарсы текст ныр куыд у, уый хуызы.\nДæ ивдтытæ æвдыст сты дæллаг ивыны бынаты.\nДæуæн хъæудзæн дæ ивдтытæ уæллаг ивæн бынатмæ рахæссын.\n'''Æрмæст''' уæллаг ивæны текст æрцæудзæн æвæрд \"{{int:savearticle}}\"-ыл куы ныххæцай.",
+       "explainconflict": "Цалынмæ ды ацы фарс ивтай, уæдмæ йæ æндæр чидæр фæивта.\nУæллаг текст ивыны бынаты ды уыныс фарсы текст ныр куыд у, уый хуызы.\nДæ ивдтытæ æвдыст сты дæллаг ивыны бынаты.\nДæуæн хъæудзæн дæ ивдтытæ уæллаг ивæн бынатмæ рахæссын.\n'''Æрмæст''' уæллаг ивæны текст æрцæудзæн æвæрд \"$1\"-ыл куы ныххæцай.",
        "yourtext": "Дæ текст",
        "storedversion": "Æвæрд фæлтæр",
        "nonunicodebrowser": "'''Сындæг: Дæ сгарæн Unicode-имæ нæ фидауы.'''\nASCII нысæнттæм чи нæ хауы, уыдон ивыны бынаты сæ æхсæрдæсон кодты хуызы уыдзысты.",
        "prefs-rendering": "Фæлгонц",
        "saveprefs": "Бавæрын",
        "prefs-editing": "Ивын",
-       "rows": "Рæнхъытæ:",
-       "columns": "Рæгътæ:",
        "searchresultshead": "Агуырд",
        "stub-threshold-disabled": "Хицæн",
        "timezonelegend": "Сахаты таг:",
        "rcshowhidemine": "$1 мæ ивдтытæ",
        "rcshowhidemine-show": "Равдис",
        "rcshowhidemine-hide": "Бамбæхс",
-       "rclinks": "Фæстаг $1 ивдтытæ (афæстаг $2 боны дæргъы чи ’рцыдысты) равдис;\n$3",
+       "rclinks": "Фæстаг $1 ивдтытæ (афæстаг $2 боны дæргъы чи ’рцыдысты) равдис;",
        "diff": "хицæн.",
        "hist": "лог",
        "hide": "Айсын",
        "undeleteviewlink": "кæсын",
        "undeleteinvert": "Зыгъуыммæ æвзæрст",
        "undeletecomment": "Аххос:",
-       "undeletedfiles": "{{PLURAL:$1|1 файл рацарæзт æрцыдис|$1 файлы рацарæзт æрцыдысты}}",
        "cannotundelete": "Рацарæзт нæ фæрæстмæ:\n$1",
        "undelete-search-title": "Хафт фæрсты агуырд",
        "undelete-search-box": "Хафт фæрстæ агурын",
        "revdelete-summary-hid": "ивды афыст æмбæхст у",
        "revdelete-uname-hid": "æмбæхст фæсномыг",
        "rightsnone": "(нæй)",
-       "revdelete-summary": "ивддзинады мидис",
        "feedback-back": "Фæстæмæ",
        "feedback-cancel": "Ныууадзын",
        "feedback-close": "Æххæст",
        "feedback-useragent": "Браузер:",
        "searchsuggest-search": "Агурын",
        "searchsuggest-containing": "йæ мидæг ис...",
-       "api-error-badaccess-groups": "Ацы викимæ файлтæ бавгæныны бар дæм нæй.",
-       "api-error-filename-tooshort": "Файлы ном æгæр цыбыр у.",
-       "api-error-filetype-banned": "Файлы хуыз ивæргонд у.",
-       "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-timeout": "Сервер нæ радта дзуапп бадзырд рæстæгмæ.",
-       "api-error-unclassified": "Нæзонгæ рæдыд æрцыд.",
-       "api-error-unknown-code": "Нæзонгæ рæдыд: \"$1\".",
-       "api-error-unknown-error": "Мидæггаг рæдыд: Цыдæр раст нæ ацыдис, файл куы æвгæдтай, уæд.",
        "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 7171bae..1cdd53c 100644 (file)
@@ -24,7 +24,8 @@
                        "Macofe",
                        "ਪ੍ਰਚਾਰਕ",
                        "Tow",
-                       "Sony dandiwal"
+                       "Sony dandiwal",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "ਲਿੰਕ ਹੇਠ-ਲਾਈਨ:",
        "login": "ਦਾਖਲ",
        "login-security": "ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੜਤਾਲ ਕਰਵਾਉ",
        "nav-login-createaccount": "ਲਾਗਇਨ/ਖਾਤਾ ਬਣਾਓ",
-       "userlogin": "ਲਾਗਇਨ/ਖਾਤਾ ਬਣਾਓ",
-       "userloginnocreate": "ਲਾਗਇਨ",
        "logout": "ਵਿਦਾਈ ਲਉ",
        "userlogout": "ਵਿਦਾਈ ਲਉ",
        "notloggedin": "ਲਾਗਇਨ ਨਹੀਂ ਹੋ",
        "userlogin-noaccount": "ਖਾਤਾ ਨਹੀਂ ਹੈ?",
        "userlogin-joinproject": "{{SITENAME}} ਦਾ ਹਿੱਸਾ ਬਣੋ",
-       "nologin": "ਖਾਤਾ ਨਹੀਂ ਹੈ? $1।",
-       "nologinlink": "ਖਾਤਾ ਬਣਾਓ",
        "createaccount": "ਖਾਤਾ ਬਣਾਓ",
-       "gotaccount": "ਖਾਤਾ ਪਹਿਲਾਂ ਹੀ ਹੈ? $1",
-       "gotaccountlink": "ਲਾਗਇਨ",
-       "userlogin-resetlink": "ਆਪਣੀ ਲਾਗਇਨ ਜਾਣਕਾਰੀ ਭੁੱਲ ਗਏ ਹੋ?",
        "userlogin-resetpassword-link": "ਆਪਣਾ ਪਾਸਵਰਡ ਭੁੱਲ ਗਏ ਹੋ?",
        "userlogin-helplink2": "ਦਾਖ਼ਲ ਹੋਣ ਵਿਚ ਮਦਦ",
        "userlogin-loggedin": "ਤੁਸੀਂ ਪਹਿਲੋਂ ਹੀ {{GENDER:$1|$1}} ਵਜੋਂ ਦਾਖ਼ਲ ਹੋ ਚੁੱਕੇ ਹੋਂ।\nਕਿਸੇ ਹੋਰ ਵਰਤੋਂਕਾਰ ਵਜੋਂ ਦਾਖ਼ਲ ਹੋਣ ਵਾਸਤੇ ਹੇਠ ਦਿੱਤਾ ਫਾਰਮ ਭਰੋ।",
        "createacct-another-email-ph": "ਆਪਣਾ ਈਮੇਲ ਐਡਰੈਸ ਦਿਓ",
        "createaccountmail": "ਆਰਜ਼ੀ ਰਲ਼ਵਾਂ ਪਾਸਵਰਡ ਵਰਤੋਂ ਅਤੇ ਇਸ ਨੂੰ ਖਾਸ ਈਮੇਲ ਪਤੇ ਉੱਤੇ ਭੇਜ ਦਿਉ",
        "createacct-realname": "ਅਸਲੀ ਨਾਂ (ਚੋਣਵਾਂ)",
-       "createaccountreason": "ਕਾਰਨ:",
        "createacct-reason": "ਕਾਰਨ",
        "createacct-reason-ph": "ਤੁਸੀਂ ਹੋਰ ਖਾਤਾ ਕਿਉਂ ਬਣਾ ਰਹੇ ਹੋ",
        "createacct-submit": "ਆਪਣਾ ਖਾਤਾ ਬਣਾਓ",
        "showdiff": "ਤਬਦੀਲੀਆਂ ਵਿਖਾਓ",
        "anoneditwarning": "'''ਖ਼ਬਰਦਾਰ:''' ਤੁਸੀਂ ਦਾਖ਼ਲ ਨਹੀਂ ਹੋ। ਕੋਈ ਵੀ ਸੋਧ ਕਰਨ 'ਤੇ ਤੁਹਾਡਾ ਆਈ.ਪੀ. ਪਤਾ ਲੋਕਾਂ ਨੂੰ ਵਿਖਾਈ ਦੇਵੇਗਾ। ਜੇਕਰ ਤੁਸੀਂ <strong>[$1 ਦਾਖ਼ਲ ਹੁੰਦੇ ਹੋ]</strong> ਜਾਂ <strong>[$2 ਖਾਤਾ ਬਣਾਉਂਦੇ ਹੋ]</strong> ਤਾਂ ਤੁਹਾਡੀਆਂ ਸੋਧਾਂ ਦਾ ਸਿਹਰਾ, ਹੋਰ ਫ਼ਾਇਦਿਆਂ ਸਮੇਤ, ਤੁਹਾਡੇ ਵਰਤੋਂਕਾਰ-ਨਾਂ ਸਿਰ ਦਿੱਤਾ ਜਾਵੇਗਾ।",
        "anonpreviewwarning": "''ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ। ਤਬਦੀਲੀ ਸਾਂਭਣ ਨਾਲ਼ ਤੁਹਾਡਾ IP ਪਤਾ ਸਫ਼ੇ ਦੇ ਸੋਧ ਅਤੀਤ ਵਿਚ ਰਿਕਾਰਡ ਹੋ ਜਾਵੇਗਾ।''",
-       "missingsummary": "'''ਯਾਦ-ਦਹਾਨੀ:''' ਤੁਸੀਂ ਸੋਧ ਸਾਰ ਮੁਹੱਈਆ ਨਹੀਂ ਕਰਵਾਇਆ। ਜੇ ਤੁਸੀਂ \"{{int:savearticle}}\" ਤੇ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕੀਤਾ ਤਾਂ ਤੁਹਾਡਾ ਸਫ਼ਾ ਇਸਦੇ ਬਿਨਾਂ ਹੀ ਸਾਂਭਿਆ ਜਾਵੇਗਾ।",
+       "missingsummary": "'''ਯਾਦ-ਦਹਾਨੀ:''' ਤੁਸੀਂ ਸੋਧ ਸਾਰ ਮੁਹੱਈਆ ਨਹੀਂ ਕਰਵਾਇਆ। ਜੇ ਤੁਸੀਂ \"$1\" ਤੇ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕੀਤਾ ਤਾਂ ਤੁਹਾਡਾ ਸਫ਼ਾ ਇਸਦੇ ਬਿਨਾਂ ਹੀ ਸਾਂਭਿਆ ਜਾਵੇਗਾ।",
        "missingcommenttext": "ਹੇਠਾਂ ਇੱਕ ਟਿੱਪਣੀ ਦਿਓ।",
        "summary-preview": "ਸੋਧ ਸਾਰ ਦੀ ਝਲਕ:",
        "subject-preview": "ਵਿਸ਼ੇ ਦੀ ਝਲਕ:",
        "rcshowhidemine-hide": "ਓਹਲੇ",
        "rcshowhidecategorization-show": "ਦਿਖਾਓ",
        "rcshowhidecategorization-hide": "ਲੁਕਾਉ",
-       "rclinks": "ਪਿਛਲੇ $2 ਦਿਨਾਂ ਵਿੱਚ ਹੋਈਆਂ $1 ਤਬਦੀਲੀਆਂ ਵਿਖਾਓ<br /> $3",
+       "rclinks": "ਪਿਛਲੇ $2 ਦਿਨਾਂ ਵਿੱਚ ਹੋਈਆਂ $1 ਤਬਦੀਲੀਆਂ ਵਿਖਾਓ",
        "diff": "ਫ਼ਰਕ",
        "hist": "ਅਤੀਤ",
        "hide": "ਲੁਕਾਓ",
        "logentry-newusers-create2": "ਵਰਤੋਂਕਾਰ ਖਾਤਾ $3, $1 ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ ਸੀ",
        "logentry-upload-upload": "$1 ਨੇ $3 {{GENDER:$2|ਅਪਲੋਡ ਕੀਤਾ}}",
        "rightsnone": "(ਕੋਈ ਨਹੀਂ)",
-       "revdelete-summary": "ਸੰਖੇਪ ਸੋਧ",
        "feedback-adding": "ਸਫ਼ੇ ਨਾਲ਼ ਵਿਚਾਰ ਜੁੜ ਰਹੇ ਹਨ...",
        "feedback-back": "ਪਿੱਛੇ",
        "feedback-bugnew": "ਮੈਂ ਚੈੱਕ ਕੀਤਾ। ਇੱਕ ਨਵੇਂ ਦੋਸ਼ ਦੀ ਰਿਪੋਰਟ ਕਰੋ",
index 95af027..78185ea 100644 (file)
        "permalink": "Suglung a permanenti",
        "print": "I-print",
        "view": "Lawen",
+       "view-foreign": "Lawen king $1",
        "edit": "Alilan",
        "create": "Maglalang",
        "editthispage": "I-edit ya ing bulung a ini",
        "nstab-template": "Ulma (template)",
        "nstab-help": "Saup bulung",
        "nstab-category": "Kategoriya",
+       "mainpage-nstab": "Pun Bulung",
        "nosuchaction": "Alang makanyan a gawa",
        "nosuchactiontext": "E ne kikilalanan ning wiki ing dapat/utus a babanggitan ning URL",
        "nosuchspecialpage": "Alang bulung a makabukud/espesial a anti kanian",
        "logouttext": "'''Maka logout na ka.'''\n\nMalyari mung isundu ing pamangamit mu king {{SITENAME}} a e ka papakilala, o malyari kang mag login pasibayu anting pareu o aliwang talagamit.\nApansingan mung mapalyaring makalto la pa murin deng aliwang bulung a bala mu maka login ka pa murin, anggang e me lilinisan (clear) ing kekang browser cache.",
        "yourname": "Lagyung talagamit (Username):",
        "yourpassword": "Kekang password:",
+       "userlogin-yourpassword": "Udyat (Password)",
        "yourpasswordagain": "Pakisulat meng pasibayu ing password:",
        "yourdomainname": "Ing kekang karinan (domain):",
        "externaldberror": "Mapalyaring mika pamagkamali king external authentication (pamagpatutung panlual) ning database, o ala kang paintulut a i-update ya ing kekang account a panlual (external account).",
        "login": "Mag log in",
        "nav-login-createaccount": "Mag-login / maglalang account",
-       "userlogin": "Mag-login / maglalang account",
        "logout": "Mag-log out",
        "userlogout": "Mag logout",
        "notloggedin": "E maka login",
-       "nologin": "Ala kang login? $1.",
-       "nologinlink": "Maglalang kang account",
        "createaccount": "Maglalang kang account",
-       "gotaccount": "Atin na kang account? '''$1'''.",
-       "gotaccountlink": "Mag log in",
        "createaccountmail": "kapamilatan ning e-mail",
        "badretype": "Ding password a linub mu ela mibabage.",
        "userexists": "Atin nang gagamit king lagyung talagamit (username) a misulat.\nMamili kang aliwang lagyu.",
        "createaccount-title": "Pamaglalang account para king {{SITENAME}}",
        "createaccount-text": "Ating miglalang account para king kekang e-mail address king {{SITENAME}} ($4) a maki lagyung \"$2\", ampong password a \"$3\".\nKailangan mung mag-login ngeni ba meng ayalilan ing kekang password.\n\nMalyari meng e pansinan ining mensahi, nung pamagkamali ing pamaglalang na niting account.",
        "loginlanguagelabel": "Amanu: $1",
+       "pt-login-button": "Maglagda (log in)",
        "changepassword": "Alilan ya ing password",
        "resetpass_announce": "Gagamit kang pansamantalang code a me e-mail keka aniang mig-login ka.\nBang mayari ing kekang pamag-login, kailangan mung mangibiling bayung password keni:",
        "resetpass_header": "Alilan ya ing password",
        "resetpass_submit": "Mangibili kang password at maglogin ka",
        "changepassword-success": "Melaus ing pamanalili mung password! Ngeni mila-login naka...",
        "resetpass_forbidden": "E la malyaring alilan deng password keng wiking ini",
+       "passwordreset": "Alilan udyat (reset password)",
        "bold_sample": "Makapasalang kulitan",
        "bold_tip": "Makapal pangasulat",
        "italic_sample": "Makakiling pangasulat",
        "editingsection": "Alilan (e-edit) ya ing $1 (dake)",
        "editingcomment": "I-edit ya ing $1 (komentu)",
        "editconflict": "Misasalungat a edit: $1",
-       "explainconflict": "Ating aliwang minalili king bulung a ini manibat aniang inumpisan meng i-edit.\nMakabili ya king espasiung pirinan sulat king babo (upper text area)  ing kasalungsungan nang itsura niti.\nAtyu la king espasiung pirinan sulat king lalam (lower text area) deng kekang elilan.\nKailangan mong piyabe deng elilan mu ketang kasalungsungan a makasulat.\nBukud mung ing makasulat king babo ing ma-save katimid mu ketang   \"{{int:savearticle}}\".",
+       "explainconflict": "Ating aliwang minalili king bulung a ini manibat aniang inumpisan meng i-edit.\nMakabili ya king espasiung pirinan sulat king babo (upper text area)  ing kasalungsungan nang itsura niti.\nAtyu la king espasiung pirinan sulat king lalam (lower text area) deng kekang elilan.\nKailangan mong piyabe deng elilan mu ketang kasalungsungan a makasulat.\nBukud mung ing makasulat king babo ing ma-save katimid mu ketang   \"$1\".",
        "yourtext": "Ing kekang sinulat",
        "storedversion": "Bersion a makasimpan",
        "nonunicodebrowser": "'''BABALA: E ya unicode compliant ing kekang browser.\nAting paralan ba kang e mika-prublema king pamag-edit: lunto la antimong hexadecimal code king kahun a pipag-editan deng letra/kulit a e-ASCII (non-ASCII characters).'''",
        "prefs-misc": "Alwp",
        "saveprefs": "I-save",
        "prefs-editing": "Mag-edit",
-       "rows": "Dane (rows):",
-       "columns": "Ding asias:",
        "searchresultshead": "Maintun",
        "stub-threshold": "Angganan ning <a href=\"#\" class=\"stub\">stub link</a> formatting (byte):",
        "recentchangesdays": "Deng aldong ipalto king bayung mengayalili:",
        "userrights-reason": "Sangkan:",
        "userrights-no-interwiki": "Ala kang paintulut a i-edit la reng katuliran da reng talagamit (user rights) kareng aliwang wiki.",
        "userrights-nodatabase": "Alang database a $1 o e ya lokal iti.",
-       "userrights-nologin": "Kailangan mung [[Special:UserLogin|mag-login]] king metung a administrator account ba kang makapamieng katulirang talagamit (user rights).",
-       "userrights-notallowed": "Ala yang paintulut mamieng katulirang talagamit (user rights) ing kekang account.",
        "userrights-changeable-col": "Deng grupung maliari mung alilan",
        "userrights-unchangeable-col": "Deng grupung e mu maliaring alilan",
        "group": "Grupu:",
        "right-protect": "Alilan la reng sikan ning pamangambil (protection level) at i-edit la reng bulung a protektadu/makakambil",
        "right-editprotected": "I-edit la reng bulung a protektadu/makakambil (alang proteksiun a tuki-tuki o cascading protection)",
        "right-editinterface": "I-edit ya ing user interface",
-       "right-editusercssjs": "I-edit la reng simpan (file) dang CSS ampong JS deng aliwang talagamit",
        "right-editusercss": "I-edit la reng simpan (file) dang CSS deng aliwang talagamit",
        "right-edituserjs": "I-edit la reng simpan (file) dang JS deng aliwang talagamit",
        "right-rollback": "Gad yang iurung (revert) ing tauling talagamit a mig-edit king partikular a bulung",
        "action-edit": "i-edit/alilan ya ing bulung a ini",
        "action-managechangetags": "maglalang at magbura tags ibat database",
        "nchanges": "$1 {{PLURAL:$1|miyalilan|miyalilan}}",
+       "enhancedrc-history": "amlat/kasaleselan",
        "recentchanges": "Bayung mengayalili",
        "recentchanges-legend": "Pipamilinan kareng bayung mengayalili",
        "recentchanges-summary": "Talukyan mo reng tawling diling mengayalilan king bulung a ini.",
        "recentchanges-feed-description": "Talukian mo reng bayung diling mengayalili king wiki king feed a ini.",
+       "rcfilters-savedqueries-new-name-label": "Lagyu",
+       "rcfilters-savedqueries-cancel-label": "E taglus",
+       "rcfilters-filtergroup-watchlist": "Deng bulung a yati lu king babanten",
+       "rcfilters-filter-watchlist-watched-label": "Deng atiu babanten",
+       "rcfilters-filter-watchlist-notwatched-label": "Ala lu king babanten",
+       "rcfilters-filtergroup-lastRevision": "Kasalungsungan a pangayalili",
+       "rcfilters-filter-lastrevision-label": "Kasalungsungan a pangayalili",
        "rcnotefrom": "Atilu king lalam deng miyalilan manibat anyang <b>$2</b> (angga king <b>$1</b> makalto).",
        "rclistfrom": "Pakit la reng bayung miyalilan manibat anyang $3 $2",
        "rcshowhideminor": "$1 malating edit",
+       "rcshowhideminor-show": "Pakit",
+       "rcshowhideminor-hide": "Isalikut",
        "rcshowhidebots": "$1 la reng bot",
+       "rcshowhidebots-show": "Pakit",
+       "rcshowhidebots-hide": "Isalikut",
        "rcshowhideliu": "$1 talagamit a maka-log in",
+       "rcshowhideliu-hide": "Isalikut",
        "rcshowhideanons": "$1 talagamit a e migpakilala",
+       "rcshowhideanons-show": "Pakit",
+       "rcshowhideanons-hide": "Isalikut",
        "rcshowhidepatr": "$1 edit a babanten (patrolled edits)",
        "rcshowhidemine": "$1 deng elilan ku",
+       "rcshowhidemine-show": "Pakit",
+       "rcshowhidemine-hide": "Isalikut",
        "rcshowhidecategorization-show": "Pakit",
-       "rclinks": "Pakit la reng tauling $1 miyalilan anyang tauling $2 aldo<br />$3",
+       "rclinks": "Pakit la reng tauling $1 miyalilan anyang tauling $2 aldo",
        "diff": "aliwa",
        "hist": "amlat",
        "hide": "Isalikut",
        "suppress": "Alakton (oversight)",
        "booksources": "Aklat a pikuanan",
        "booksources-search-legend": "Panintunan la reng aklat penibatan",
+       "booksources-search": "Manintun/Manuliksa",
        "booksources-text": "Makabili la king lalam deng suglung kareng aliwang karinan o site a mamisaling librung bayu at megamit na, at mapalyaring atin la muring aliwang informaciun kareng librung paintunan mu.",
        "specialloguserlabel": "Talagamit:",
        "speciallogtitlelabel": "Bansag:",
        "undeletelink": "lon/ibalik",
        "undeleteviewlink": "↓lawen",
        "undeletecomment": "Komentu:",
-       "undeletedrevisions": "{{PLURAL:$1|1 pamagbayung|$1 pamagbayung}} misubli",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 pamagbayung|$1 pamagbayung}} ampong {{PLURAL:$2|1 simpan|$2 simpan}} a misubli",
-       "undeletedfiles": "{{PLURAL:$1|1 simpan|$1 simpan}} a misubli",
        "cannotundelete": "E melaus ing pamamawi king pamamura.  Mapalyaring ati'nang minunang ginawa kaniti.",
        "undeletedpage": "ing '''$1 misubli ya'''\n\nLon me ing [[Special:Log/delete|tala da reng mebura (deletion log)]] para king tala/listaan da reng bayu-bayung mebura ampong misubli.",
        "undelete-header": "Lon me [[Special:Log/delete|tala da reng mebura]] para kareng bulung a bayu-bayung mebura.",
        "namespace": "Pirinan lagyu (Namespace):",
        "invert": "Ibaligtad la pamitukituki",
        "blanknamespace": "(Pun)",
-       "contributions": "Ambag da reng gagamit",
+       "contributions": "{{GENDER:$1|User}} deng ambag",
        "contributions-title": "Deng ambag da reng talagamit para king $1",
        "mycontris": "Deng kakung ambag",
        "anoncontribs": "Deng ambag",
        "whatlinkshere-prev": "{{PLURAL:$1|minunang|minunang $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|next|tutuking $1}}",
        "whatlinkshere-links": "← suglung",
-       "whatlinkshere-hideredirs": "$1 pamanalis direksiun (redirects)",
+       "whatlinkshere-hideredirs": "$1 pamanalis direksyun (redirects)",
        "whatlinkshere-hidetrans": "$1 langkap (transclusions)",
        "whatlinkshere-hidelinks": "$1 suglung",
        "whatlinkshere-filters": "Panialak (filters)",
        "file-info-size": "$1 × $2 pixel, sukad ning simpan: $3, MIME type: $4",
        "file-nohires": "Ala nang mas malino pa.",
        "svg-long-desc": "SVG file, masasabing $1 × $2 pixels, dagul ning simpan: $3",
-       "show-big-image": "Pekamalino",
+       "show-big-image": "Ing minunang simpan (file)",
        "newimages": "Pirinan kareng bayung simpan (new files)",
        "imagelisttext": "Ing makatuki tala yang '''$1''' {{PLURAL:$1|simpan|simpan}} a misamasan $2.",
        "newimages-summary": "Ining bulung a makabukud papakit no reng simpan (file) a tauling milulan.",
        "watchlisttools-view": "Lon la reng miyalilan a makaugne kaniti",
        "watchlisttools-edit": "Lon ya ampong i-edit ing tala ding babanten (watchlist)",
        "watchlisttools-raw": "I-edit ya ing e pa metagin a tala ding babanten (raw watchlist)",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pamisabi-sabi]])",
        "version": "Bersion",
        "version-specialpages": "Bulung a makabukud",
        "version-other": "Aliwa",
        "revdelete-restricted": "ipairal la reng limitasiun kareng sysop",
        "revdelete-unrestricted": "ilako la reng makabawal kareng sysops",
        "rightsnone": "(ala)",
-       "revdelete-summary": "sampulung da reng mibayu (edit summary)",
        "feedback-back": "Mibalik",
        "feedback-submit": "I-sumiti",
        "feedback-thanks-title": "Salamat pu!",
index a82bf86..1e174f8 100644 (file)
        "rcshowhideminor": "$1 kambionan menor",
        "rcshowhidebots": "$1 botnan",
        "rcshowhideanons": "$1 uzadónan anonimo",
-       "rclinks": "Mustra último $1 kambionan den último $2 dianan<br />$3",
+       "rclinks": "Mustra último $1 kambionan den último $2 dianan",
        "hide": "Skonde",
        "show": "Mustra",
        "file-anchor-link": "Imagen",
index 8f3f530..5398d0f 100644 (file)
        "yourdomainname": "Vote donmène:",
        "login": "Intrer",
        "nav-login-createaccount": "Intrer / créer vote conpte",
-       "userlogin": "Intrer / créer vote conpte",
-       "userloginnocreate": "Intrer",
        "logout": "Sortir",
        "userlogout": "Sortir",
        "notloggedin": "Poin connékté",
        "userlogin-noaccount": "os n'avez mie un conpte ?",
        "userlogin-joinproject": "Érgaingnez {{SITENAME}}",
-       "nologin": "os n'avez mie un conpte? '''$1'''.",
-       "nologinlink": "Créer un conpte",
        "createaccount": "Créer un conpte",
-       "gotaccount": "Jou qu'os avez piécha un conpte? '''$1'''.",
-       "gotaccountlink": "Intrer",
-       "userlogin-resetlink": "Vos avez oblié vous détals d'connécsion ?",
        "userlogin-resetpassword-link": "Mot d'passe obliè ?",
        "userlogin-helplink2": "Éyude pour s' connécter",
        "userlogin-loggedin": "Os ètes déjo connécté{{GENDER:$1||e|(e)}} conme $1.\nImplouéyez ch' formuloére in-d'sous pour vous connécter aveuc un eute compte d'uzeu.",
        "createaccountmail": "Uzer un mot d' passe aléatoére timporoére pi l’invouéyer à l’adrèche ed courriel éspécifiée",
        "createaccountmail-help": "Peut ète implouèyé pour créer un compte pour eune eute parsonne sans connouaite ch' mot d'passe.",
        "createacct-realname": "Nom réél (facultatif)",
-       "createaccountreason": "Motif :",
        "createacct-reason": "Motif",
        "createacct-reason-ph": "Porquoé os créez un eute compte ?",
        "createacct-reason-help": "Mot d'billet affiché dins ch' jornal éd créachon d'compte",
        "rcshowhideanons": "$1 uzeus anonimes",
        "rcshowhidepatr": "$1 chés modificacions wardées",
        "rcshowhidemine": "$1 ems éditions",
-       "rclinks": "Afiqher chés $1 darins canjemints din chés $2 darins jours<br />$3",
+       "rclinks": "Afiqher chés $1 darins canjemints din chés $2 darins jours",
        "diff": "dif",
        "hist": "hist",
        "hide": "Mucher",
index 74d9bb6..9dd85ee 100644 (file)
        "yourdomainname": "Dei Domain:",
        "login": "Kumm nei",
        "nav-login-createaccount": "Kumm nei",
-       "userlogin": "Kumm nei",
-       "userloginnocreate": "Kumm nei",
        "logout": "Geh naus",
        "userlogout": "Geh naus",
-       "gotaccountlink": "Kumm nei",
        "createacct-emailrequired": "E-Poschd",
        "createaccountmail": "iwwer E-Mail",
-       "createaccountreason": "Grund:",
        "mailmypassword": "Paesswatt zerricksetze",
        "noemail": "Yuuser „$1“ hot ken E-Mail aagewwe.",
        "loginlanguagelabel": "Schprooch: $1",
        "prefs-resetpass": "Paesswatt ennere",
        "saveprefs": "Uffstellinge beilege",
        "prefs-editing": "Ennere",
-       "columns": "Kallems:",
        "searchresultshead": "Guck uff",
        "recentchangesdays-max": "Max. $1 {{PLURAL:$1|Daag|Daag}}",
        "timezoneregion-africa": "Afrikaa",
        "rcshowhidebots": "Bots $1",
        "rcshowhideanons": "IP-Yuuser $1",
        "rcshowhidemine": "Mei Ardickele $1",
-       "rclinks": "Zeig die letscht $1 Enneringe vun de letscht $2 Daag.<br />$3",
+       "rclinks": "Zeig die letscht $1 Enneringe vun de letscht $2 Daag.",
        "diff": "Unnerschidd",
        "hist": "Gschicht",
        "hide": "verschwinne losse",
index 9ac3ca7..f0e33b1 100644 (file)
        "rcshowhideminor": "$1 kjleene Endanisse",
        "rcshowhideanons": "$1 nomeloose Bruckasch",
        "rcshowhidemine": "$1 miene Endanisse",
-       "rclinks": "Wies de latste $1 Endanisse in de latste $2 Doag<br />$3",
+       "rclinks": "Wies de latste $1 Endanisse in de latste $2 Doag",
        "diff": "Unjascheet",
        "hist": "Jeschicht",
        "hide": "Fe'stäakje",
index 8722398..f18e342 100644 (file)
        "userlogin-remembermypassword": "Oagmeld blaiwe",
        "login": "Oamelde",
        "nav-login-createaccount": "Oamelde / Kondo oaleesche",
-       "userlogin": "Oamelde / Kondo oaleesche",
-       "userloginnocreate": "Oilogge",
        "logout": "Uffhere",
        "userlogout": "Uffhere",
        "notloggedin": "Bischd nedd oagmeld",
        "userlogin-noaccount": "Hoschd kä Kondo?",
        "userlogin-joinproject": "Bai {{SITENAME}} oamelde",
-       "nologin": "Hoschd noch kä Kondo? $1",
-       "nologinlink": "Ä Kondo oaleesche",
        "createaccount": "Kondo oaleesche",
-       "gotaccount": "Hoschd schun ä Kondo? $1",
-       "gotaccountlink": "Oamelde",
-       "userlogin-resetlink": "Hoschd doi Daade vagesse?",
        "userlogin-resetpassword-link": "Hoschd doi Kennwoad vagesse?",
        "userlogin-helplink2": "Hilf baim Oamelde",
        "userlogin-createanother": "Leschda nochä Kondo oa",
        "createacct-email-ph": "Gebb doi E-Mail-Adress oi",
        "createacct-another-email-ph": "Gebb doi E-Mail-Adress oi",
        "createacct-realname": "Wie heschd (mugschds awwa nedd)",
-       "createaccountreason": "Grund:",
        "createacct-reason": "Bgrindung",
        "createacct-submit": "Leschda ä Kondo oa",
        "createacct-another-submit": "Leschda ä onnares Kondo oa",
        "resetpass-expired": "Doi Passwoad isch abgloffe. Gebbä naijes Passwoad oi.",
        "passwordreset": "Kennword zriggsedze",
        "passwordreset-username": "Middawaida:",
-       "passwordreset-capture": "E-Mail õgugge?",
        "changeemail": "E-Mail-Adress ännare",
        "changeemail-none": "(käni)",
        "changeemail-submit": "E-Mail-Adress ännare",
        "prefs-rendering": "Uffdridd",
        "saveprefs": "Oischdellunge schbaischere",
        "prefs-editing": "Schaffe",
-       "rows": "Zaile",
-       "columns": "Schbalde",
        "searchresultshead": "Nochgugge",
        "stub-threshold-disabled": "Abgschdeld",
        "recentchangesdays": "Oazahl vunde Daach inde ledschde Ännarunge:",
        "rcshowhidemine": "Moi Beawaidunge $1",
        "rcshowhidemine-show": "Zaische",
        "rcshowhidemine-hide": "Vaschdeggle",
-       "rclinks": "Zaisch die ledschde $1 Ännarunge inde ledschde $2 Daach<br />$3",
+       "rclinks": "Zaisch die ledschde $1 Ännarunge inde ledschde $2 Daach",
        "diff": "Unnaschied",
        "hist": "Gschischd",
        "hide": "vaschdeggle",
index ef7be20..0bd1f5c 100644 (file)
@@ -86,7 +86,8 @@
                        "Sethakill",
                        "Mateon1",
                        "Jdx",
-                       "Kirsan"
+                       "Kirsan",
+                       "Krottyianock"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "tog-watchlisthidebots": "Ukryj edycje botów na liście obserwowanych",
        "tog-watchlisthideminor": "Ukryj drobne zmiany na liście obserwowanych",
        "tog-watchlisthideliu": "Ukryj edycje zalogowanych użytkowników na liście obserwowanych",
-       "tog-watchlistreloadautomatically": "Automatycznie odświeżaj listę obserwowanych, gdy zmieniany jest filtr (wymagany JavaScript)",
+       "tog-watchlistreloadautomatically": "Automatycznie odświeżaj listę obserwowanych po każdej zmianie filtra (wymagany JavaScript)",
        "tog-watchlisthideanons": "Ukryj edycje anonimowych użytkowników na liście obserwowanych",
        "tog-watchlisthidepatrolled": "Ukryj sprawdzone edycje na liście obserwowanych",
        "tog-watchlisthidecategorization": "Ukryj kategoryzację stron",
        "redirectedfrom": "(Przekierowano z $1)",
        "redirectpagesub": "Strona przekierowująca",
        "redirectto": "Przekierowanie do:",
-       "lastmodifiedat": "Tę stronę ostatnio zmodyfikowano o $2, $1.",
+       "lastmodifiedat": "Tę stronę ostatnio edytowano $2, $1.",
        "viewcount": "Tę stronę obejrzano {{PLURAL:$1|tylko raz|$1 razy}}.",
        "protectedpage": "Strona zabezpieczona",
        "jumpto": "Skocz do:",
        "aboutsite": "O {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "aboutpage": "Project:O {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "copyright": "Treść udostępniana na licencji $1, jeśli nie podano inaczej.",
-       "copyrightpage": "{{ns:project}}:Prawa_autorskie",
+       "copyrightpage": "{{ns:project}}:Prawa autorskie",
        "currentevents": "Bieżące wydarzenia",
        "currentevents-url": "Project:Aktualności",
        "disclaimers": "Informacje prawne",
        "sort-ascending": "Sortuj rosnąco",
        "nstab-main": "Strona",
        "nstab-user": "{{GENDER:{{BASEPAGENAME}}|Strona użytkownika|Strona użytkowniczki}}",
-       "nstab-media": "Pliki",
+       "nstab-media": "Plik",
        "nstab-special": "Strona specjalna",
        "nstab-project": "Strona projektu",
        "nstab-image": "Plik",
        "ns-specialprotected": "Stron specjalnych nie można edytować.",
        "titleprotected": "Utworzenie strony o tej nazwie zostało zablokowane przez [[User:$1|$1]].\nUzasadnienie blokady: <em>$2</em>.",
        "filereadonlyerror": "Nie można zmodyfikować pliku „$1”, ponieważ repozytorium plików „$2” jest w trybie tylko do odczytu.\n\nBlokujący go administrator systemu podał następujący powód: „$3”.",
-       "invalidtitle-knownnamespace": "Nieprawidłowa nazwa w obszarze nazw \"$2\" o treści \"$3\"",
-       "invalidtitle-unknownnamespace": "Nieprawidłowa nazwa z nieznaną liczbą przestrzeni nazw  $1  o treści \"$2\"",
+       "invalidtitle-knownnamespace": "Nieprawidłowa nazwa \"$3\" w przestrzeni nazw \"$2\"",
+       "invalidtitle-unknownnamespace": "Nieprawidłowy tytuł \"$2\" z nieznanym numerem przestrzeni nazw $1",
        "exception-nologin": "Nie jesteś zalogowany/a",
        "exception-nologin-text": "Zaloguj się, aby mieć dostęp do tej strony lub akcji.",
        "exception-nologin-text-manual": "Musisz $1 aby mieć dostęp do tej strony lub akcji.",
        "virus-badscanner": "Zła konfiguracja – nieznany skaner antywirusowy ''$1''",
        "virus-scanfailed": "skanowanie nieudane (błąd $1)",
-       "virus-unknownscanner": "nieznany antivirus:",
+       "virus-unknownscanner": "nieznany program antywirusowy:",
        "logouttext": "'''Nie jesteś już zalogowany.'''\n\nZauważ, że do momentu wyczyszczenia pamięci podręcznej przeglądarki niektóre strony mogą wyglądać tak, jakbyś wciąż był zalogowany.",
        "cannotlogoutnow-title": "Nie możesz się teraz wylogować",
        "cannotlogoutnow-text": "Podczas używania $1 wylogowanie nie jest niemożliwe.",
        "login": "Zaloguj się",
        "login-security": "Potwierdź swoją tożsamość",
        "nav-login-createaccount": "Logowanie i rejestracja",
-       "userlogin": "Logowanie i rejestracja",
-       "userloginnocreate": "Zaloguj się",
        "logout": "Wyloguj",
        "userlogout": "Wyloguj",
        "notloggedin": "Nie jesteś zalogowany",
        "userlogin-noaccount": "Nie masz konta?",
        "userlogin-joinproject": "Dołącz do {{GRAMMAR:D.lp|{{SITENAME}}}}",
-       "nologin": "Nie masz konta? $1.",
-       "nologinlink": "Zarejestruj się",
        "createaccount": "Załóż nowe konto",
-       "gotaccount": "Masz już konto? '''$1'''.",
-       "gotaccountlink": "Zaloguj się",
-       "userlogin-resetlink": "Zapomniałeś danych do zalogowania się?",
        "userlogin-resetpassword-link": "Nie pamiętasz hasła?",
        "userlogin-helplink2": "Pomoc przy logowaniu",
        "userlogin-loggedin": "Zalogowano jako {{GENDER:$1|$1}}.\nUżyj poniższego formularza, aby zalogować się jako inny użytkownik.",
        "createaccountmail": "Użyj tymczasowego hasła wygenerowanego losowo i wyślij je na podany adres e-mail",
        "createaccountmail-help": "Pozwala utworzyć konto dla innej osoby, nie znając jej hasła.",
        "createacct-realname": "Prawdziwe imię i nazwisko (opcjonalnie)",
-       "createaccountreason": "Powód:",
        "createacct-reason": "Powód",
        "createacct-reason-ph": "Dlaczego zakładasz kolejne konto",
        "createacct-reason-help": "Komunikat wyświetlany w rejestrze tworzenia kont",
        "preview": "Podgląd",
        "showpreview": "Pokaż podgląd",
        "showdiff": "Podgląd zmian",
-       "blankarticle": "<strong>Uwaga:</strong> Strona, którą masz zamiar utworzyć jest pusta.\nJeżeli klikniesz \"{{int:savearticle}}\" ponownie, strona zostanie utworzona bez jakiejkolwiek treści.",
+       "blankarticle": "<strong>Uwaga:</strong> Strona, którą masz zamiar utworzyć jest pusta.\nJeżeli klikniesz \"$1\" ponownie, strona zostanie utworzona bez jakiejkolwiek treści.",
        "anoneditwarning": "<strong>Uwaga:</strong> Nie jesteś zalogowany. Jeśli wykonasz jakąkolwiek zmianę, Twój adres IP będzie widoczny publicznie. Jeśli <strong>[$1 zalogujesz się]</strong> lub <strong>[$2 utworzysz konto]</strong>, Twoje zmiany zostaną przypisane do konta, wraz z innymi korzyściami.",
        "anonpreviewwarning": "''Nie jesteś zalogowany. Jeśli zapiszesz zmiany, w historii edycji strony zostanie umieszczony Twój adres IP.''",
        "missingsummary": "'''Uwaga:''' Nie wprowadz{{GENDER:|iłeś|iłaś|ono}} opisu zmian.\nJeżeli nie chcesz go wprowadzać, naciśnij przycisk „Zapisz” jeszcze raz.",
-       "selfredirect": "<strong>Ostrzeżenie:</strong> Przekierowujesz tę stronę do niej samej.\nByć może został przez Ciebie wybrany zły cel przekierowania lub edytujesz niewłaściwą stronę.\nJeżeli ponownie klikniesz „{{int:savearticle}}”, przekierowanie zostanie utworzone.",
+       "selfredirect": "<strong>Ostrzeżenie:</strong> Przekierowujesz tę stronę do niej samej.\nByć może został przez Ciebie wybrany zły cel przekierowania lub edytujesz niewłaściwą stronę.\nJeżeli ponownie klikniesz „$1”, przekierowanie zostanie utworzone.",
        "missingcommenttext": "Wprowadź komentarz poniżej.",
-       "missingcommentheader": "<strong>Uwaga:</strong> treść tytułu komentarza jest pusta.\nJeśli ponownie klikniesz „{{int:savearticle}}”, zmiany zostaną zapisane bez niego.",
+       "missingcommentheader": "<strong>Uwaga:</strong> treść tytułu komentarza jest pusta.\nJeśli ponownie klikniesz „$1”, zmiany zostaną zapisane bez niego.",
        "summary-preview": "Podgląd opisu zmian:",
        "subject-preview": "Podgląd tematu:",
        "previewerrortext": "Wystąpił błąd podczas próby podglądu Twoich zmian.",
        "noarticletext": "Obecnie ta strona nie ma zawartości.\nMożesz [[Special:Search/{{PAGENAME}}|wyszukać ten tytuł na innych stronach]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przeszukać rejestr] \nlub [{{fullurl:{{FULLPAGENAME}}|action=edit}} utworzyć tę stronę]</span>.",
        "noarticletext-nopermission": "Ta strona nie posiada jeszcze zawartości.\nMożesz [[Special:Search/{{PAGENAME}}|wyszukać ten tytuł]] w treści innych stron\nlub <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przeszukać powiązane rejestry]</span>, ale nie masz uprawnień do utworzenia tej strony",
        "missing-revision": "Wersja #$1 strony \"{{FULLPAGENAME}}\" nie istnieje.\n\nZazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powód usunięcia znajduje się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze].",
-       "userpage-userdoesnotexist": "Użytkownik „<nowiki>$1</nowiki>” nie jest zarejestrowany.\nUpewnij się, czy na pewno zamierza{{GENDER:|łeś|łaś|sz}} utworzyć lub zmodyfikować właśnie tę stronę.",
+       "userpage-userdoesnotexist": "Użytkownik „$1” nie jest zarejestrowany.\nUpewnij się, czy na pewno zamierzał{{GENDER:|eś|aś|eś/aś}} utworzyć lub zmodyfikować właśnie tę stronę.",
        "userpage-userdoesnotexist-view": "Konto użytkownika „$1” nie jest zarejestrowane.",
        "blocked-notice-logextract": "{{GENDER:$1|Ten użytkownik|Ta użytkowniczka}} jest obecnie {{GENDER:$1|zablokowany|zablokowana}}.\nOstatni wpis rejestru blokad jest pokazany poniżej.",
        "clearyourcache": "<strong>Uwaga:</strong> aby zobaczyć zmiany po zapisaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.\n* <strong>Firefox / Safari:</strong> Przytrzymaj <em>Shift</em> podczas klikania <em>Odśwież bieżącą stronę</em>, lub naciśnij klawisze <em>Ctrl+F5</em> lub <em>Ctrl+R</em> (<em>⌘-R</em> na komputerze Mac)\n* <strong>Google Chrome:</strong> Naciśnij <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na komputerze Mac)\n* <strong>Internet Explorer:</strong> Przytrzymaj <em>Ctrl</em>, jednocześnie klikając <em>Odśwież</em>, lub naciśnij klawisze <em>Ctrl+F5</em>\n* <strong>Opera:</strong> Przejdź do <em>Menu → Ustawienia</em> (<em>Opera → Preferencje</em> w Mac), a następnie <em>Prywatność i bezpieczeństwo → Wyczyść dane przeglądania → Opróżnij pamięć podręczną</em>.",
        "editingsection": "Edytujesz $1 (sekcja)",
        "editingcomment": "Edytujesz $1 (nowa sekcja)",
        "editconflict": "Konflikt edycji: $1",
-       "explainconflict": "Ktoś zmienił treść strony w trakcie Twojej edycji.\nGórne pole zawiera tekst strony aktualnie zapisany w bazie danych.\nTwoje zmiany znajdują się w dolnym polu.\nBy wprowadzić swoje zmiany, musisz zmodyfikować tekst z górnego pola.\n'''Tylko''' tekst z górnego pola zostanie zapisany w bazie, gdy wciśniesz „{{int:savearticle}}”.",
+       "explainconflict": "Ktoś zmienił treść strony w trakcie Twojej edycji.\nGórne pole zawiera tekst strony aktualnie zapisany w bazie danych.\nTwoje zmiany znajdują się w dolnym polu.\nBy wprowadzić swoje zmiany, musisz zmodyfikować tekst z górnego pola.\n'''Tylko''' tekst z górnego pola zostanie zapisany w bazie, gdy wciśniesz „$1”.",
        "yourtext": "Twój tekst",
        "storedversion": "Zapisana wersja",
        "nonunicodebrowser": "'''Uwaga! Twoja przeglądarka nie rozpoznaje poprawnie kodowania UTF‐8 (Unicode).\nZ tego powodu wszystkie znaki, których przeglądarka nie rozpoznaje, zostały zastąpione ich kodami szesnastkowymi.'''",
        "readonlywarning": "<strong>Uwaga! Baza danych została zablokowana do celów administracyjnych. W tej chwili nie można zapisać nowej wersji strony. Jeśli chcesz, możesz skopiować ją do pliku, aby móc zapisać ją później.</strong>\n\nAdministrator systemu, który zablokował bazę, podał następujący powód: $1",
        "protectedpagewarning": "'''Uwaga! Możliwość modyfikacji tej strony została zabezpieczona. Mogą ją edytować jedynie użytkownicy z uprawnieniami administratora.'''\nOstatni wpis z rejestru jest pokazany poniżej.",
        "semiprotectedpagewarning": "'''Uwaga!''' Ta strona została zabezpieczona i tylko zarejestrowani użytkownicy mogą ją edytować.\nOstatni wpis z rejestru jest pokazany poniżej.",
-       "cascadeprotectedwarning": "<strong>Uwaga:</strong> Ta strona została zabezpieczona i tylko użytkownicy z uprawnieniami administratora mogą ją edytować. Została ona osadzona w {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia:",
+       "cascadeprotectedwarning": "<strong>Uwaga:</strong> Ta strona została zabezpieczona i tylko użytkownicy z [[Special:ListGroupRights|określonymi uprawnieniami]] mogą ją edytować. Została ona osadzona w {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia:",
        "titleprotectedwarning": "'''Uwaga! Utworzenie strony o tej nazwie zostało zabezpieczone. Do jej utworzenia wymagane są [[Special:ListGroupRights|specyficzne uprawnienia]].'''\nOstatni wpis z rejestru jest pokazany poniżej.",
        "templatesused": "{{PLURAL:$1|Szablon użyty|Szablony użyte}} w tym artykule:",
        "templatesusedpreview": "{{PLURAL:$1|Szablon użyty|Szablony użyte}} w tym podglądzie:",
        "post-expand-template-argument-warning": "Uwaga – strona zawiera co najmniej jeden argument szablonu, który po rozwinięciu jest zbyt duży.\nArgument ten będzie pominięty.",
        "post-expand-template-argument-category": "Strony, w których użyto szablon z pominięciem argumentów",
        "parser-template-loop-warning": "Wykryto pętlę w szablonie [[$1]]",
+       "template-loop-category": "Strony z pętlami szablonów",
+       "template-loop-category-desc": "Strona zawiera pętlę szablonów, czyli szablon, który wywołuje sam siebie rekursywnie.",
        "parser-template-recursion-depth-warning": "Przekroczno limit głębokości rekurencji szablonu ($1)",
        "language-converter-depth-warning": "Przekroczono ograniczenie ($1) głębokości zagnieżdżenia konwersji językowej",
        "node-count-exceeded-category": "Strony, gdzie przekroczono liczbę węzłów",
        "page_first": "początek",
        "page_last": "koniec",
        "histlegend": "Wybór porównania – zaznacz kropeczkami dwie wersje do porównania i wciśnij enter lub przycisk ''Porównaj wybrane wersje''.<br />\nLegenda: (bież.) – pokaż zmiany od tej wersji do bieżącej,\n(poprz.) – pokaż zmiany od wersji poprzedzającej, m – mała (drobna) zmiana",
-       "history-fieldset-title": "Przeglądaj historię",
-       "history-show-deleted": "Tylko usunięte",
+       "history-fieldset-title": "Szukaj wersji",
+       "history-show-deleted": "Tylko usunięte edycje",
        "histfirst": "od najstarszych",
        "histlast": "od najświeższych",
        "historysize": "({{PLURAL:$1|1 bajt|$1 bajty|$1 bajtów}})",
        "search-file-match": "(odpowiada zawartości pliku)",
        "search-suggest": "Czy chodziło Ci o: $1",
        "search-rewritten": "Wyświetlone wyniki dla $1. zamiast tego wyszukaj $2.",
-       "search-interwiki-caption": "Projekty siostrzane",
+       "search-interwiki-caption": "Wyniki z projektów siostrzanych",
        "search-interwiki-default": "Wyniki od $1:",
        "search-interwiki-more": "(więcej)",
        "search-interwiki-more-results": "Więcej wyników",
        "prefs-help-prefershttps": "Ta opcja zacznie działać przy twoim następnym zalogowaniu.",
        "prefswarning-warning": "Niektóre z dokonanych zmian w preferencjach nie zostały jeszcze zapisane. Jeśli wyjdziesz bez wciśnięcia „$1”, Twoje zmiany zostaną utracone.",
        "prefs-tabs-navigation-hint": "Wskazówka: do poruszania się między zakładkami możesz użyć klawiszy strzałek w lewo i w prawo",
-       "userrights": "Zarządzanie uprawnieniami użytkowników",
+       "userrights": "Uprawnienia użytkowników",
        "userrights-lookup-user": "Wybierz użytkownika",
        "userrights-user-editname": "Wprowadź nazwę użytkownika:",
        "editusergroup": "Wczytaj grupy użytkownika",
        "saveusergroups": "Zapisz grupy {{GENDER:$1|użytkownika|użytkowniczki}}",
        "userrights-groupsmember": "Należy do:",
        "userrights-groupsmember-auto": "Na stałe należy do:",
-       "userrights-groups-help": "Możesz zmienić przynależność tego użytkownika do podanych grup:\n* Zaznaczone pole oznacza przynależność użytkownika do danej grupy.\n* Niezaznaczone pole oznacza, że użytkownik nie należy do danej grupy.\n* Gwiazdka * informuje, że nie możesz usunąć użytkownika z grupy po dodaniu do niej lub dodać po usunięciu.",
+       "userrights-groups-help": "Możesz zmienić przynależność tego użytkownika do podanych grup:\n* Zaznaczone pole oznacza przynależność użytkownika do danej grupy.\n* Niezaznaczone pole oznacza, że użytkownik nie należy do danej grupy.\n* Gwiazdka * informuje, że nie możesz usunąć użytkownika z grupy po dodaniu do niej lub dodać po usunięciu.\n* Kratka # informuje, że możesz tylko skrócić czas wygaśnięcia członkostwa w danej grupie; nie możesz go wydłużać.",
        "userrights-reason": "Powód:",
        "userrights-no-interwiki": "Nie masz dostępu do edycji uprawnień na innych wiki.",
        "userrights-nodatabase": "Baza danych $1 nie istnieje lub nie jest lokalna.",
        "userrights-expiry-options": "1 dzień:1 day,1 tydzień:1 week,1 miesiąc:1 month,3 miesiące:3 months,6 miesięcy:6 months,1 rok:1 year",
        "userrights-invalid-expiry": "Termin przynależności do grupy „$1“ jest nieprawidłowy.",
        "userrights-expiry-in-past": "Termin przynależności do grupy „$1“ jest z przeszłości.",
+       "userrights-cannot-shorten-expiry": "Nie możesz przedłużyć czasu wygaśnięcia członkostwa w grupie \"$1\". Tylko użytkownicy z uprawnieniem dodawania do i usuwania z tej grupy mogą wydłużać czas wygaśnięcia.",
        "userrights-conflict": "Konflikt zmiany uprawnień użytkownika! Proszę sprawdzić i potwierdzić swoje zmiany.",
        "group": "Grupa:",
        "group-user": "Użytkownicy",
        "right-editsemiprotected": "Edycja stron zabezpieczonych na poziomie „{{int:protect-level-autoconfirmed}}”",
        "right-editcontentmodel": "Edycja modelu zawartości strony",
        "right-editinterface": "Edycja interfejsu użytkownika",
-       "right-editusercssjs": "Edycja plików CSS i JS innych użytkowników",
        "right-editusercss": "Edycja plików CSS innych użytkowników",
        "right-edituserjs": "Edycja plików JS innych użytkowników",
        "right-editmyusercss": "Edycja swoich plików CSS",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Pokaż",
        "rcfilters-activefilters": "Aktywne filtry",
-       "rcfilters-restore-default-filters": "Przywrócić domyślne filtry",
+       "rcfilters-quickfilters": "Szybkie linki",
+       "rcfilters-savedqueries-defaultlabel": "Zapisane filtry",
+       "rcfilters-savedqueries-rename": "Zmień nazwę",
+       "rcfilters-savedqueries-setdefault": "Ustaw jako domyślne",
+       "rcfilters-savedqueries-unsetdefault": "Wyłącz ustawienie jako domyślne",
+       "rcfilters-savedqueries-remove": "Usuń",
+       "rcfilters-savedqueries-new-name-label": "Nazwa",
+       "rcfilters-savedqueries-apply-label": "Utwórz szybki link",
+       "rcfilters-savedqueries-cancel-label": "Anuluj",
+       "rcfilters-savedqueries-add-new-title": "Zapisz szybki link do filtrów",
+       "rcfilters-restore-default-filters": "Przywróć domyślne filtry",
        "rcfilters-clear-all-filters": "Wyczyść filtry",
        "rcfilters-search-placeholder": "Filtruj ostatnie zmiany (przeglądaj lub zacznij wpisywać)",
        "rcfilters-invalid-filter": "Nieprawidłowy filtr",
        "rcfilters-empty-filter": "Brak aktywnych filtrów. Wyświetlane są wszystkie zmiany.",
        "rcfilters-filterlist-title": "Filtry",
+       "rcfilters-filterlist-whatsthis": "Co to jest?",
+       "rcfilters-filterlist-feedbacklink": "Podziel się swoją opinią na temat tych nowych (beta) filtrów",
+       "rcfilters-highlightbutton-title": "Podświetl wyniki",
        "rcfilters-highlightmenu-title": "Wybierz kolor",
+       "rcfilters-highlightmenu-help": "Wybierz kolor, aby podświetlić tę właściwość",
        "rcfilters-filterlist-noresults": "Nie znaleziono filtrów",
+       "rcfilters-noresults-conflict": "Nie znaleziono wyników z powodu konfliktu kryteriów wyszukiwania",
+       "rcfilters-state-message-subset": "Ten filtr nie wywoła efektu, ponieważ pasujące do niego wyniki są zawarte w bardziej {{PLURAL:$2|szczegółowym filtrze|szczegółowych filtrach}} (spróbuj podświetlić, aby je rozróżnić): $1",
+       "rcfilters-state-message-fullcoverage": "Wybranie wszystkich filtrów w grupie działa tak samo jak niewybranie żadnego, więc taki filtr nie da żadnego efektu. W grupie zawarto też: $1",
        "rcfilters-filtergroup-registration": "Rejestracja użytkownika",
-       "rcfilters-filter-registered-label": "Zarejestrowany",
+       "rcfilters-filter-registered-label": "Zarejestrowani",
        "rcfilters-filter-registered-description": "Zalogowani edytorzy.",
-       "rcfilters-filter-unregistered-label": "Niezarejestrowany",
+       "rcfilters-filter-unregistered-label": "Niezarejestrowani",
        "rcfilters-filter-unregistered-description": "Niezalogowani",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ten filtr koliduje z {{PLURAL:$2|poniższym filtrem|poniższymi filtrami}} doświadczenia, {{PLURAL:$2|który wyszukuje|które wyszukują}} tylko zarejestrowanych użytkowników: $1",
        "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 (nie Twoje).",
-       "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-editsbyself-label": "Zmiany dokonane przeze mnie",
+       "rcfilters-filter-editsbyself-description": "Czynności dokonane przez Ciebie.",
+       "rcfilters-filter-editsbyother-label": "Zmiany dokonane przez innych",
+       "rcfilters-filter-editsbyother-description": "Wszystkie zmiany oprócz Twoich.",
+       "rcfilters-filtergroup-userExpLevel": "Poziom doświadczenia (tylko o zarejestrowanych użytkownikach)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Filtry doświadczenia wyszukują tylko edycje zarejestrowanych użytkowników, więc ten filtr koliduje z filtrem „Niezarejestrowani”.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filtr \"Niezarejestrowani\" koliduje z jednym lub więcej filtrów z filtrów poziomu doświadczenia, które służą do wyszukiwania wkładu tylko zarejestrowanych użytkowników. Kolidujące filtry zostały odpowiednio oznaczone na pasku Aktywnych filtrów.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Początkujący",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Mniej niż 10 edycji i 4 dni aktywności.",
+       "rcfilters-filter-user-experience-level-learner-label": "Uczący się",
+       "rcfilters-filter-user-experience-level-learner-description": "Większe doświadczenie niż „Nowicjusze”, ale mniejsze niż „Doświadczeni użytkownicy”.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Doświadczeni użytkownicy",
+       "rcfilters-filter-user-experience-level-experienced-description": "Ponad 30 dni aktywności i 500 edycji.",
        "rcfilters-filtergroup-automated": "Zmiany zautomatyzowane",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Zmiany wykonane z użyciem zautomatyzowanych narzędzi.",
        "rcfilters-filter-humans-label": "Człowiek (nie bot)",
        "rcfilters-filter-humans-description": "Zmiany wprowadzone przez ludzi.",
+       "rcfilters-filtergroup-reviewstatus": "Status przejrzenia",
+       "rcfilters-filter-patrolled-label": "Sprawdzone",
+       "rcfilters-filter-patrolled-description": "Edycje oznaczone jako sprawdzone.",
+       "rcfilters-filter-unpatrolled-label": "Niesprawdzone",
+       "rcfilters-filter-unpatrolled-description": "Edycje nie oznaczone jako sprawdzone.",
        "rcfilters-filtergroup-significance": "Znaczenie",
        "rcfilters-filter-minor-label": "Drobne zmiany",
        "rcfilters-filter-minor-description": "Zmiany, które autor oznaczył jako drobne.",
        "rcfilters-filter-major-label": "Zmiany nie oznaczone jako drobne",
        "rcfilters-filter-major-description": "Zmiany nie oznaczone jako drobne.",
+       "rcfilters-filtergroup-watchlist": "Strony z listy obserwowanych",
+       "rcfilters-filter-watchlist-watched-label": "Z listy obserwowanych",
+       "rcfilters-filter-watchlist-watched-description": "Zmiany na stronach, które masz na liście obserwowanych.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nowe zmiany na obserwowanych stronach",
+       "rcfilters-filter-watchlist-watchednew-description": "Zmiany na obserwowanych stronach, których jeszcze nie odwiedziłeś.",
+       "rcfilters-filter-watchlist-notwatched-label": "Tylko spoza obserwowanych",
+       "rcfilters-filter-watchlist-notwatched-description": "Wszystko oprócz zmian na obserwowanych przez ciebie stronach.",
        "rcfilters-filtergroup-changetype": "Rodzaj zmiany",
        "rcfilters-filter-pageedits-label": "Edycje strony",
        "rcfilters-filter-pageedits-description": "Edycje treści, stron dyskusji, opisów kategorii...",
        "rcfilters-filter-newpages-label": "Tworzenie stron",
-       "rcfilters-filter-newpages-description": "Zmiany, prowadzące do utworzenia nowych stron.",
+       "rcfilters-filter-newpages-description": "Zmiany prowadzące do utworzenia nowych stron.",
        "rcfilters-filter-categorization-label": "Zmiany kategorii",
        "rcfilters-filter-categorization-description": "Dodanie lub usunięcie strony z kategorii",
        "rcfilters-filter-logactions-label": "Działania rejestrowane",
        "rcfilters-filter-logactions-description": "Działania administracyjne, tworzenie kont, usuwanie stron, przesyłanie plików...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filtr „Drobne zmiany” koliduje z jednym lub wieloma filtrami Rodzaju zmian, ponieważ niektóre rodzaje zmian nie mogą być uznawane za  „drobne”. Kolidujące filtry zostały powyżej odpowiednio zaznaczone na pasku aktywnych filtrów.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Niektóre rodzaje zmian nie mogą być uznawane za „drobne”, dlatego ten filtr koliduje z następującymi filtrami Rodzaju zmian: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ten filtr Rodzaju zmian koliduje z filtrem „Drobne zmiany”. Nie wszystkie zmiany mogą być uznawane za „drobne”.",
+       "rcfilters-filtergroup-lastRevision": "Ostatnia wersja",
+       "rcfilters-filter-lastrevision-label": "Ostatnie wersje",
+       "rcfilters-filter-lastrevision-description": "Tylko najnowsze zmiany dla każdej ze stron.",
+       "rcfilters-filter-previousrevision-label": "Wcześniejsze wersje",
+       "rcfilters-filter-previousrevision-description": "Wszystkie edycje, które nie są najnowszą zmianą 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).",
+       "rclistfromreset": "Zresetuj wybór daty",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "rcshowhideminor": "$1 drobne edycje",
        "rcshowhideminor-show": "Pokaż",
        "rcshowhidecategorization": "$1 kategoryzację stron",
        "rcshowhidecategorization-show": "Pokaż",
        "rcshowhidecategorization-hide": "Ukryj",
-       "rclinks": "Pokaż ostatnie $1 zmian w ciągu ostatnich $2 dni.<br />$3",
+       "rclinks": "Pokaż ostatnie $1 zmian w ciągu ostatnich $2 dni.",
        "diff": "różn.",
        "hist": "hist.",
        "hide": "Ukryj",
        "php-uploaddisabledtext": "Przesyłanie plików PHP zostało zablokowane. Sprawdź ustawienie „file_uploads”.",
        "uploadscripted": "Plik zawiera kod HTML lub skrypt, który może zostać błędnie zinterpretowany przez przeglądarkę internetową.",
        "upload-scripted-pi-callback": "Nie można przesłać pliku, zawierającego instrukcję obsługi arkusza stylów XML.",
+       "upload-scripted-dtd": "Nie można przesyłać plików SVG zawierających niestandardową deklarację DTD.",
        "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.",
        "enotif_body_intro_moved": "Strona projektu {{SITENAME}} o nazwie $1 została przeniesiona $PAGEEDITDATE przez {{gender:$2|$2}}, zobacz aktualną wersję na: $3",
        "enotif_body_intro_restored": "Strona projektu {{SITENAME}} o nazwie $1 została przywrócona $PAGEEDITDATE przez {{gender:$2|$2}}, zobacz aktualną wersję na: $3",
        "enotif_body_intro_changed": "Strona projektu {{SITENAME}} o nazwie $1 została zmieniona $PAGEEDITDATE przez {{gender:$2|$2}}, zobacz aktualną wersję na: $3",
-       "enotif_lastvisited": "Zobacz na stronie $1 wszystkie zmiany od Twojej ostatniej wizyty.",
-       "enotif_lastdiff": "Zobacz na stronie $1 tę zmianę.",
+       "enotif_lastvisited": "Aby obejrzeć wszystkie wszystkie zmiany od Twojej ostatniej wizyty, zobacz $1",
+       "enotif_lastdiff": "Aby obejrzeć tę zmianę, zobacz $1",
        "enotif_anon_editor": "użytkownik anonimowy $1",
        "enotif_body": "Szanowny $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nOpis zmiany: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt do autora:\nmail – $PAGEEDITOR_EMAIL\nwiki – $PAGEEDITOR_WIKI\n\nW przypadku kolejnych zmian nowe powiadomienia nie zostaną wysłane, dopóki nie odwiedzisz tej strony jako zalogowany. Możesz także zresetować wszystkie flagi powiadomień na swojej liście stron obserwowanych.\n\nWiadomość z systemu powiadomień {{GRAMMAR:D.lp|{{SITENAME}}}}\n\n--\nW celu zmiany ustawień swojej listy obserwowanych odwiedź\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUsunięcie strony z listy obserwowanych możliwe jest na stronie\n$UNWATCHURL\n\nPomoc\n$HELPPAGE",
        "created": "utworzona",
        "undeleteviewlink": "pokaż",
        "undeleteinvert": "Odwróć zaznaczenie",
        "undeletecomment": "Powód:",
-       "undeletedrevisions": "odtworzono {{PLURAL:$1|1 wersję|$1 wersje|$1 wersji}}",
-       "undeletedrevisions-files": "odtworzono $1 {{PLURAL:$1|wersję|wersje|wersji}} i $2 {{PLURAL:$2|plik|pliki|plików}}",
-       "undeletedfiles": "odtworzył $1 {{PLURAL:$1|plik|pliki|plików}}",
        "cannotundelete": "Niektóre lub wszystkie odtworzenia nie powiodły się:\n$1",
        "undeletedpage": "'''Odtworzono stronę $1.'''\n\nZobacz [[Special:Log/delete|rejestr usunięć]], jeśli chcesz przejrzeć ostatnie operacje usuwania i odtwarzania stron.",
        "undelete-header": "Zobacz [[Special:Log/delete|rejestr usunięć]], aby sprawdzić ostatnio usunięte strony.",
        "sp-contributions-uploads": "przesłane pliki",
        "sp-contributions-logs": "rejestry",
        "sp-contributions-talk": "dyskusja",
-       "sp-contributions-userrights": "zarządzanie uprawnieniami użytkownika",
+       "sp-contributions-userrights": "zarządzanie uprawnieniami {{GENDER:$1|użytkownika|użytkowniczki}}",
        "sp-contributions-blocked-notice": "To konto użytkownika jest obecnie zablokowane. Ostatni wpis rejestru blokad jest pokazany poniżej.",
        "sp-contributions-blocked-notice-anon": "Ten adres IP jest obecnie zablokowany.\nOstatni wpis rejestru blokad jest pokazany poniżej.",
        "sp-contributions-search": "Szukaj wkładu",
        "unblocked-id": "Blokada $1 została zdjęta",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] został odblokowany.",
        "blocklist": "Zablokowani użytkownicy",
+       "autoblocklist": "Blokady automatyczne",
+       "autoblocklist-submit": "Szukaj",
+       "autoblocklist-legend": "Lista blokad automatycznych",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Lokalna blokada automatyczna|Lokalne blokady automatyczne}}",
+       "autoblocklist-empty": "Lista blokad automatycznych jest pusta.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Inna blokada automatyczna|Inne blokady automatyczne}}",
        "ipblocklist": "Zablokowani użytkownicy",
        "ipblocklist-legend": "Znajdź zablokowanego użytkownika",
        "blocklist-userblocks": "Ukryj blokady konta",
        "tooltip-pt-mycontris": "Lista {{GENDER:|moich}} edycji",
        "tooltip-pt-anoncontribs": "Lista edycji wykonanych z tego adresu IP",
        "tooltip-pt-login": "Zachęcamy do zalogowania się, choć nie jest to obowiązkowe.",
+       "tooltip-pt-login-private": "Należy się zalogować, aby korzystać z tej wiki",
        "tooltip-pt-logout": "Wyloguj",
        "tooltip-pt-createaccount": "Zachęcamy do stworzenia konta i zalogowania, ale nie jest to obowiązkowe.",
        "tooltip-ca-talk": "Dyskusja o zawartości tej strony",
        "newimages-summary": "Na tej stronie specjalnej prezentowane są ostatnio przesłane pliki.",
        "newimages-legend": "Filtruj",
        "newimages-label": "Nazwa pliku (lub jej fragment):",
+       "newimages-user": "Adres IP lub nazwa użytkownika",
        "newimages-showbots": "Pokaż pliki przesłane przez boty",
        "newimages-hidepatrolled": "Ukryj sprawdzone pliki",
        "noimages": "Brak plików do pokazania.",
        "confirmrecreate": "{{GENDER:$1|Użytkownik|Użytkowniczka}} [[User:$1|$1]] ([[User talk:$1|dyskusja]]) {{GENDER:$1|usunął|usunęła}} tę stronę po tym, jak rozpocząłeś/rozpoczęłaś jej edycję, podając jako powód usunięcia:\n: <em>$2</em>\nPotwierdź, że na pewno chcesz odtworzyć tę stronę.",
        "confirmrecreate-noreason": "{{GENDER:$1|Użytkownik|Użytkowniczka}} [[User:$1|$1]] ([[User talk:$1|dyskusja]]) {{GENDER:$1|usunął|usunęła}} tę stronę po tym, jak rozpocząłeś/rozpoczęłaś jej edycję. Potwierdź, że naprawdę chcesz odtworzyć tę stronę.",
        "recreate": "Utwórz powtórnie",
+       "confirm-purge-title": "Wyczyść pamięć podręczną tej strony",
        "confirm_purge_button": "Wyczyść",
        "confirm-purge-top": "Wyczyścić pamięć podręczną dla tej strony?",
        "confirm-purge-bottom": "Odświeżenie strony wyczyści pamięć podręczną i wymusi pokazanie jej aktualnej wersji.",
        "imgmultipageprev": "← poprzednia strona",
        "imgmultipagenext": "następna strona →",
        "imgmultigo": "Przejdź",
-       "imgmultigoto": "Idź do $1 strony",
+       "imgmultigoto": "Idź do strony: $1",
        "img-lang-default": "(język domyślny)",
        "img-lang-info": "Wyświetl tę ilustrację w $1. $2",
        "img-lang-go": "Dalej",
        "logentry-delete-delete": "$1 {{GENDER:$2|usunął|usunęła}} stronę $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|usunął|usunęła}} przekierowanie $3 poprzez nadpisanie",
        "logentry-delete-restore": "$1 {{GENDER:$2|odtworzył|odtworzyła}} stronę $3",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|odtworzył|odtworzyła}} stronę $3",
+       "restore-count-revisions": "odtworzono {{PLURAL:$1|1 wersja|$1 wersji}}",
+       "restore-count-files": "{{PLURAL: $1|1 Plik|$1 plików}}",
        "logentry-delete-event": "$1 {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w rejestrze $3, wykonano następujące operacje: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|zmienił|zmieniła}} widoczność zdarzeń w rejestrze strony $3",
        "logentry-managetags-create": "$1 {{GENDER:$2|utworzył|utworzyła}} znacznik „$4”",
        "logentry-managetags-delete": "$1 {{GENDER:$2|usunął|usunęła}} znacznik „$4” (usunięty z $5 {{PLURAL:$5|wersji lub wpisu dziennika|wersji i/lub wpisów dziennika}})",
        "logentry-managetags-activate": "$1 aktywował{{GENDER:$2||a}} znacznik \"$4\" do korzystania przez uczestników i boty",
-       "logentry-managetags-deactivate": "$1 wyłączył{{GENDER:$2||a}} znacznik \"$4\" z korzystania przez uczestników i boty",
+       "logentry-managetags-deactivate": "$1 wyłączył{{GENDER:$2||a}} znacznik \"$4\" z korzystania przez użytkowników i boty",
        "log-name-tag": "Rejestr znaczników",
        "log-description-tag": "Ta strona pokazuje zarejestrowane operacje dodawania lub usuwania [[Special:Tags|znaczników]] z poszczególnych wersji lub wpisów w rejestrze. Niniejszy rejestr nie uwzględnia oznakowań, gdy dokonywane są w trakcie edycji, usuwania lub podobnej operacji.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|dodał|dodała}} {{PLURAL:$7|znacznik|znaczniki}} $6 do wersji $4 strony $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|zmienił|zmieniła}} znaczniki w wersji $4 strony $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|usunięto}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|zmienił|zmieniła}} znaczniki we wpisie w rejestrze $5 strony $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|usunięto}} $8)",
        "rightsnone": "brak",
-       "revdelete-summary": "opis zmian",
        "rightslogentry-temporary-group": "$1 (tymczasowo, do $2)",
        "feedback-adding": "Dodawanie opinii do strony...",
        "feedback-back": "Wstecz",
        "special-characters-group-thai": "Tajskie",
        "special-characters-group-lao": "Laotańskie",
        "special-characters-group-khmer": "Khmerskie",
+       "special-characters-group-canadianaboriginal": "Kanadyjski Aborygen",
        "special-characters-title-endash": "półpauza",
        "special-characters-title-emdash": "pauza",
        "special-characters-title-minus": "minus",
        "mw-widgets-titleinput-description-redirect": "przekierowanie do $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategorię...",
        "mw-widgets-usersmultiselect-placeholder": "Dodaj więcej...",
+       "date-range-from": "Od daty:",
+       "date-range-to": "Do daty:",
        "sessionmanager-tie": "Nie można łączyć kilku rodzajów uwierzytelniania dla zapytania: $1.",
        "sessionprovider-generic": "sesje $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesje na podstawie cookie",
        "log-action-filter-suppress-reblock": "Ukrycie użytkownika poprzez ponowną blokadę",
        "log-action-filter-upload-upload": "Nowe przesłane",
        "log-action-filter-upload-overwrite": "Przesłane ponownie",
+       "authmanager-authn-no-primary": "Podane dane nie mogą być użyte do kontroli poświadczeń.",
+       "authmanager-authn-no-local-user": "Żaden użytkownik nie korzysta z tych danych.",
        "authmanager-authn-autocreate-failed": "Automatyczne tworzenie lokalnego konta nie powiodło się: $1",
        "authmanager-create-disabled": "Utworzenie konta jest wyłączone.",
        "authmanager-create-from-login": "Aby utworzyć konto, wypełnij odpowiednie pola.",
        "authmanager-autocreate-noperm": "Automatyczne tworzenie konta jest niedozwolone.",
        "authmanager-autocreate-exception": "Automatyczne tworzenie konta tymczasowo wyłączone z powodu wcześniejszych błędów.",
        "authmanager-userdoesnotexist": "Konto użytkownika „$1” nie jest zarejestrowane.",
+       "authmanager-userlogin-remembermypassword-help": "Czy hasło powinno być zapamiętane dłużej niż długość sesji.",
        "authmanager-username-help": "Nazwa użytkownika dla uwierzytelniania.",
        "authmanager-password-help": "Hasło do uwierzytelniania.",
        "authmanager-domain-help": "Domena uwierzytelniania zewnętrznego.",
        "restrictionsfield-label": "Dozwolone zakresy adresów IP:",
        "restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "wersja $1",
-       "pageid": "ID strony: $1"
+       "pageid": "ID strony: $1",
+       "rawhtml-notallowed": "Znaczniki &lt;html&gt; nie mogą być stosowane poza zwykłymi stronami.",
+       "gotointerwiki": "Opuszczasz {{SITENAME}}",
+       "gotointerwiki-invalid": "Podany tytuł jest nieprawidłowy.",
+       "gotointerwiki-external": "Zamierzasz przejść z witryny {{SITENAME}} do innej witryny:\n [[$2]].\n\n[$1 Kliknij, aby przejść do: $1].",
+       "undelete-cantedit": "Nie możesz odtworzyć tej strony, ponieważ nie masz uprawnień do edytowania tej strony.",
+       "undelete-cantcreate": "Nie możesz odtworzyć tej strony, ponieważ nie istnieje strona o tej nazwie, a nie masz uprawnień do jej utworzenia."
 }
index 5ac7c99..2d339bb 100644 (file)
        "externaldberror": "Ò che a l'é rivaje n'eror con la base ëd dàit d'autenticassion esterna, ò pura a l'é chiel che a l'é nen autorisà a agiornesse sò cont estern.",
        "login": "Conession",
        "nav-login-createaccount": "Creé un cont o rintré ant ël sistema",
-       "userlogin": "Creé un cont o rintré ant ël sistema",
-       "userloginnocreate": "Conession",
        "logout": "Seurte da 'nt ël sistema",
        "userlogout": "Dësconession",
        "notloggedin": "Nen rintrà ant ël sistema",
        "userlogin-noaccount": "Ha-lo nen un cont?",
        "userlogin-joinproject": "Ch'as gionza a {{SITENAME}}",
-       "nologin": "Ha-lo ancó nen un cont? $1.",
-       "nologinlink": "Creé un cont",
        "createaccount": "Creé un cont",
-       "gotaccount": "Ha-lo già un sò cont? $1.",
-       "gotaccountlink": "Ch'a rintra ant ël sistema",
-       "userlogin-resetlink": "A l'ha dësmentià ij sò detaj për intré ant ël sistema?",
        "userlogin-resetpassword-link": "Ciav dësmentià?",
        "userlogin-helplink2": "Agiut a la conession",
        "userlogin-loggedin": "A l'é già rintrà an ël sistema tanme {{GENDER:$1|$1}}.\nCh'a deuvra ël formolari sì-sota për rintré coma n'àutr n'utent.",
        "createacct-another-email-ph": "Buté l'adrëssa ëd pòsta eletrònica",
        "createaccountmail": "Dovré na ciav temporania d'ancàpit e mandela a l'adrëssa ëd pòsta eletrònica spessificà",
        "createacct-realname": "Nòm ver (opsional)",
-       "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-reason-ph": "Përchè a crea n'àutr cont",
        "createacct-submit": "Ch'a crea sò cont",
        "preview": "Previsualisassion",
        "showpreview": "Mostré na preuva",
        "showdiff": "Smon-me le modìfiche",
-       "blankarticle": "<strong>Atension:</strong> La pàgina ch'a l'ha creà a l'é veuida. S'a sgnaca torna «{{int:savearticle}}», la pàgina a sarà creà sensa contnù.",
+       "blankarticle": "<strong>Atension:</strong> La pàgina ch'a l'ha creà a l'é veuida. S'a sgnaca torna «$1», la pàgina a sarà creà sensa contnù.",
        "anoneditwarning": "<strong>Atension:<strong> A l'é nen rintrà ant ël sistema. Soa adrëssa IP a së sc-iairërà s'a fà dle modìfiche. Si chiel a <strong>[$1 rintra ant ël sistema]</strong> o <strong>[$2 a crea an cont]</strong>, soe modìfiche a saran atribuìe a sò stranòm, ansema a d'àutri vantagg.",
        "anonpreviewwarning": "''A l'é nen rintrà ant ël sistema. An salvand a sarà memorisà soa adrëssa IP ant la stòria dle modìfiche ëd sa pàgina.''",
-       "missingsummary": "'''Nòta:''' a l'ha butà gnun resumé dla modìfica. Se a sgnaca «{{int:savearticle}}» n'àutra vira, soa modìfica a resterà salvà sensa resumé.",
-       "selfredirect": "<strong>Atension:</strong> A l'é an camin ch'a ridiression-a sa pàgina a chila-midema.\nMiraco a l'ha spessificà ël bërsaj sbalià për la ridiression, opura a l'é an camin ch'a modìfica la pàgina sbalià.\nS'a sgnaca torna ansima a «{{int:savearticle}}», la ridiression a sarà creà istess.",
+       "missingsummary": "'''Nòta:''' a l'ha butà gnun resumé dla modìfica. Se a sgnaca «$1» n'àutra vira, soa modìfica a resterà salvà sensa resumé.",
+       "selfredirect": "<strong>Atension:</strong> A l'é an camin ch'a ridiression-a sa pàgina a chila-midema.\nMiraco a l'ha spessificà ël bërsaj sbalià për la ridiression, opura a l'é an camin ch'a modìfica la pàgina sbalià.\nS'a sgnaca torna ansima a «$1», la ridiression a sarà creà istess.",
        "missingcommenttext": "Për piasì, che a buta un coment sì-sota.",
-       "missingcommentheader": "'''Ch'a arcòrda:''' A l'ha pa dàit ëd soget o d'intestassion për cost coment.\nSe a sgnaca torna «{{int:savearticle}}», soa modìfica a sarà salvà sensa gnun-a intestassion.",
+       "missingcommentheader": "'''Ch'a ten-a da ment:''' A l'ha pa dàit ëd soget o d'intestassion për cost coment.\nSe a sgnaca torna «$1», soa modìfica a sarà salvà sensa gnun-a intestassion.",
        "summary-preview": "Preuva dël resumé:",
        "subject-preview": "Preuva dl'oget/intestassion:",
        "previewerrortext": "A l'é rivaje n'eror durant ël tentativ ëd previsualisassion ëd soe modìfiche.",
        "editingsection": "Modìfica ëd $1 (session)",
        "editingcomment": "Modìfica ëd $1 (neuva session)",
        "editconflict": "Conflit ëd modìfica: $1",
-       "explainconflict": "Cheidun d'àutr a l'ha salvà soa version dl'artìcol antramentre che chiel as prontava la soa.\nËl quàder ëd modìfica dë dzora a mostra ël test ëd l'artìcol coma a resta adess (visadì, lòn che a-i é ant sla Ragnà). Soe modìfiche a stan ant ël quàder dë sota.\nËn volend a peul gionté soe modìfiche ant ël quàder dë dzora.\n'''Mach''' ël test ant ël quàder dë dzora a sarà salvà, ën sgnacand ël boton \"{{int:savearticle}}\".",
+       "explainconflict": "Cheidun d'àutr a l'ha salvà soa version dl'artìcol antramentre che chiel as prontava la soa.\nËl quàder ëd modìfica dë dzora a mostra ël test ëd l'artìcol coma a resta adess (visadì, lòn che a-i é ant sla Ragnà). Soe modìfiche a stan ant ël quàder dë sota.\nËn volend a peul gionté soe modìfiche ant ël quàder dë dzora.\n'''Mach''' ël test ant ël quàder dë dzora a sarà salvà, ën sgnacand ël boton \"$1\".",
        "yourtext": "Sò test",
        "storedversion": "La version memorisà",
        "nonunicodebrowser": "'''A L'EUJ! Sò programa ëd navigassion a marcia pa giust con lë stàndard Unicode. I soma obligà a dovré dij truschin përchè a peula salvesse sò artìcoj sensa problema: ij caràter che a son nen ASCII a jë s-ciairerà ant ël quàder ëd modìfica dël test coma còdes esadecimaj.'''",
        "right-editsemiprotected": "Modifiché le pàgine protegiùe con «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "Modifiché ël model ëd contnù ëd na pàgina",
        "right-editinterface": "Modifiché l'antërfacia utent",
-       "right-editusercssjs": "Modifiché j'archivi CSS e JavaScript d'àutri utent",
        "right-editusercss": "Modifiché j'archivi CSS d'àutri utent",
        "right-edituserjs": "Modifiché j'archivi JavaScript d'àutri utent",
        "right-editmyusercss": "Modifiché ij sò archivi CSS utent",
        "rcshowhidemine": "$1 mie modìfiche",
        "rcshowhidemine-show": "Smon-e",
        "rcshowhidemine-hide": "Stërmé",
-       "rclinks": "Mostré j'ùltime $1 modìfiche ëd j'ùltim $2 dì<br />$3",
+       "rclinks": "Mostré j'ùltime $1 modìfiche ëd j'ùltim $2 dì",
        "diff": "dif.",
        "hist": "stòria",
        "hide": "Stërmé",
        "undeleteviewlink": "vëdde",
        "undeleteinvert": "Anvertì la selession",
        "undeletecomment": "Rason:",
-       "undeletedrevisions": "{{PLURAL:$1|Na revision pijàita|$1 revision pijàite}} andré",
-       "undeletedrevisions-files": "{{PLURAL:$1|Na|$1}} revision e {{PLURAL:$2|n'|$2&nbsp;}}archivi pijàit andré",
-       "undeletedfiles": "{{PLURAL:$1|N'|$1&nbsp;}}archivi pijàit andaré",
        "cannotundelete": "Riprìstin falì:\n$1",
        "undeletedpage": "'''$1 a l'é stàit pijait andaré'''\n\nChe as varda ël [[Special:Log/delete|Registr djë scancelament]] për ës-ciairé j'ùltim scancelament e arcuperassion.",
        "undelete-header": "Ch'a varda [[Special:Log/delete|ël registr djë scancelament]] për ës-ciairé j'ùltim dëscancelament.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|a l'ha modificà}} le tichëtte dla revision $4 dla pàgina $3 ({{PLURAL:$7|giontà}} $6; {{PLURAL:$9|gavà}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|a l'ha modificà}} le tichëtte dla vos ëd registr $5 dla pàgina $3 ({{PLURAL:$7|giontà}} $6; {{PLURAL:$9|gavà}} $8)",
        "rightsnone": "(gnun)",
-       "revdelete-summary": "resumé dla modìfica",
        "feedback-adding": "Gionta dij coment a la pàgina...",
        "feedback-back": "André",
        "feedback-bugcheck": "Bin fàit! Ch'a contròla mach ch'a sia pa già un dij [$1 bigat conossù].",
index e90c9ed..81b6f72 100644 (file)
        "externaldberror": "ڈیٹابیس چ توانوں پہچاننے چ کوئی مسئلہ ہویا اے یا فیر تسی اپنا بارلا کھاتا نئیں بدل سکدے۔",
        "login": "اندر آؤ جی",
        "nav-login-createaccount": "اندر آؤ / کھاتہ کھولو",
-       "userlogin": "اندر آؤ / کھاتہ کھولو",
-       "userloginnocreate": "اندر آؤ جی",
        "logout": "لاگ توں باہر",
        "userlogout": "باہر آؤ",
        "notloggedin": "لاگ ان نئیں ہوۓ او",
        "userlogin-noaccount": "تواڈا کھاتہ نہیں اے؟",
        "userlogin-joinproject": "کھاتہ بناؤ",
-       "nologin": "تواڈا کھاتہ نہیں اے؟ '''$1'''۔",
-       "nologinlink": "کھاتہ بناؤ",
        "createaccount": "کھاتہ بناؤ",
-       "gotaccount": "تواڈا پہلے توں کھاتہ ہے؟ '''$1'''",
-       "gotaccountlink": "اندر آؤ",
-       "userlogin-resetlink": "اپنے لاگ ان ہون دیاں شیواں پل گۓ؟",
        "userlogin-resetpassword-link": "اپنی کنجی بھل گۓ او؟",
        "userlogin-helplink2": "لاگ ان ہون وچ ہتھ ونڈائی",
        "createacct-emailoptional": "ای-میل پتہ (مرضی نال)",
        "createacct-email-ph": "اپنا ای-میل پتہ دیؤ",
        "createaccountmail": "ای میل دے نال",
-       "createaccountreason": "وجہ:",
        "createacct-reason": "وجہ",
        "createacct-reason-ph": "تسیں اک ہور کھاتہ کیوں بنا رہے او",
        "createacct-submit": "اپنا کھاتا کھولو",
        "showdiff": "تبدیلیاں وکھاؤ",
        "anoneditwarning": "'''خبردار''': تسی اندر نہیں آۓ\nتواڈا ''آئی پی'' پتہ فائل وچ لکھیا جاۓ گا تے ساریاں نوں دسے گا۔ اگر تسیں $1 اندر آؤ یا $2 کھاتہ کھولو تے تواڈیاں لکھتاں تواڈے ورتن ناں نال جڑیاں ہون گئیاں۔",
        "anonpreviewwarning": "''تسی ہلے لاگ ان نئیں ہوۓ،۔ کم بچاؤ گے تے تواڈا IP پتہ صفحے دی تریخ چ لکھ لیا جاۓ گا۔''",
-       "missingsummary": "'''یادکرائی:''' تساں تبدیلی دی سمری نئیں دتی۔  اگر تسیں \"{{int:savearticle}}\" نوں کلک کروگے تواڈیاں تبدیلیاں اک دے بنا بچ جان گیاں۔",
+       "missingsummary": "'''یادکرائی:''' تساں تبدیلی دی سمری نئیں دتی۔  اگر تسیں \"$1\" نوں کلک کروگے تواڈیاں تبدیلیاں اک دے بنا بچ جان گیاں۔",
        "missingcommenttext": "تھلے اپنی گل لکھو۔",
-       "missingcommentheader": "'''یادکرائی:''' تساں ایس گل تے سرخی / سرناواں نئیں دتا۔\nاگر تسیں  \"{{int:savearticle}}\" دوبارہ کلک کردے اوہ تواڈی تبدیلی اک توں بنا بچاۓ گا۔",
+       "missingcommentheader": "'''یادکرائی:''' تساں ایس گل تے سرخی / سرناواں نئیں دتا۔\nاگر تسیں  \"$1\" دوبارہ کلک کردے اوہ تواڈی تبدیلی اک توں بنا بچاۓ گا۔",
        "summary-preview": "کچے کم دا خلاصہ:",
        "subject-preview": "سرناواں / سرخی وکھالہ:",
        "blockedtitle": "ورتن آلے نوں روکیا ہویا اے",
        "editingsection": "$1 دا حصہ لکھ رہے او",
        "editingcomment": "$1 بدل ریاں (نواں پاسہ)",
        "editconflict": "تبدیلی رپھڑ: $1",
-       "explainconflict": "جدوں تسیں لکھنا شروع کیتا کسے ہور نے صفہ بدل دتا اے۔ اتلا لکھت تھاں چ چ لکھت ہے جیویں اوہ ہن ہیگی اے۔\nتواڈیاں تبدیلیاں تھلویں لکھت چ دسیاں جاریاں نیں۔ توانوں اپنیاں تبدیلیاں ہن دی لکھت چ رلانیاں پین گیاں۔\nتوانوں اپنیاں تبدیلیاںہن دی لکھت چ رلانیاں پین گیا۔\n'''صرف''' اتلی لکھت ددی تھاں بچائی جاسیگی جدوں تسیں \"{{int:savearticle}}\" دباؤ گے",
+       "explainconflict": "جدوں تسیں لکھنا شروع کیتا کسے ہور نے صفہ بدل دتا اے۔ اتلا لکھت تھاں چ چ لکھت ہے جیویں اوہ ہن ہیگی اے۔\nتواڈیاں تبدیلیاں تھلویں لکھت چ دسیاں جاریاں نیں۔ توانوں اپنیاں تبدیلیاں ہن دی لکھت چ رلانیاں پین گیاں۔\nتوانوں اپنیاں تبدیلیاںہن دی لکھت چ رلانیاں پین گیا۔\n'''صرف''' اتلی لکھت ددی تھاں بچائی جاسیگی جدوں تسیں \"$1\" دباؤ گے",
        "yourtext": "تواڈی لکھائی",
        "storedversion": "سانبھی لکھائی",
        "nonunicodebrowser": "'''خبردار: تھواڈے براؤزر اُتے یونیکوڈ نئیں چلدا۔'''\nاک کم تھانوں ایس قابل کریگا جے بچت نال صفے بچا سکو: non-ASCII کیریکٹر تبدیلی ڈبے چ ہیکساڈیسیمل کوڈ دسن گے۔",
        "right-protect": "بچاؤ پدھر نوں بدلو تے بچاۓ صفیاں نوں بدلو",
        "right-editprotected": "بچاۓ صفے بدلو",
        "right-editinterface": "ورتن وکھالہ بدلو",
-       "right-editusercssjs": "دوجے ورتن والیاں دیاں  CSS  تے JavaScript  فائلاں بدلو",
        "right-editusercss": "دوجے ورتن والیاں دیاں CSS  فائلاں بدلو",
        "right-edituserjs": "دوجے ورتن والیاں دیاں  JavaScript  فائلاں بدلو",
        "right-rollback": "جلدی نال آخری ورتن والے دیاں تبدیلیاں اک خاص صفے تے واپس کرو۔",
        "rcshowhidemine": "$1 میرے کم",
        "rcshowhidemine-show": "وکھاو",
        "rcshowhidemine-hide": "لُکاؤ",
-       "rclinks": "آخری $2 دناں دیاں $1 تبدیلیاں وکھاؤ<br />$3",
+       "rclinks": "آخری $2 دناں دیاں $1 تبدیلیاں وکھاؤ",
        "diff": "فرق",
        "hist": "پچھلا کم",
        "hide": "چھپاؤ",
        "undeleteviewlink": "وکھالہ",
        "undeleteinvert": "وچوں چناؤ",
        "undeletecomment": "وجہ",
-       "undeletedrevisions": "{{PLURAL:$1|1 ریوین|$1 ریویناں}} واپس",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 ریوین|$1 ریویناں}} تے {{PLURAL:$2|1 فائل|$2 فائلاں}} واپس",
-       "undeletedfiles": "{{PLURAL:$1|1 فائل|$1 فائلاں}} واپس",
        "cannotundelete": "مٹاؤ واپسی فیل:\nکسے ہور نے حورے پہلے ای صفہ واپس اردتا اے۔",
        "undeletedpage": "'''$1 واپس کردتی گئی اے'''\n\n [[Special:Log/delete|مٹان لاگ]] نوں ویکھو نیڑے دے مٹان تے واپسی دے رکارڈ لئی۔.",
        "undelete-header": "[[خاص:لاگ/مٹاؤ|مٹان لاگ]] نوں ویکھو نیڑے دے مٹاۓ گۓ دے رکارڈ لئی۔.",
        "logentry-newusers-autocreate": "کھاتہ $1 اپنے آپ ای {{GENDER:$2|بنایا گیا}} بنایا گیا۔",
        "logentry-upload-upload": "$1 {{جنس:$2|چڑھائی گئی}} $3",
        "rightsnone": "(کوئی وی نئیں)",
-       "revdelete-summary": "لکھائی دا خلاصہ",
        "feedback-adding": "مشورہ  صفے تے دیو۔۔۔۔۔۔۔",
        "feedback-bugcheck": "بعوت ودیا ! صرف ایہ ویکھو جے کیا ایہ پہلے لبے ہوۓ [$1 known bugs] چو اک تے نئیں۔",
        "feedback-bugnew": "میں ویکھیا اے۔ نویں بگ دی رپورٹ کرو۔",
index fbb364b..976420a 100644 (file)
        "yourdomainname": "Το domain εσούν:",
        "login": "Εμπάτε",
        "nav-login-createaccount": "Εμπάτεν / ποισέστεν λογαρίαν",
-       "userlogin": "Εμπάτεν / ποισέστεν λογαρίαν",
-       "userloginnocreate": "Εμπάτεν",
        "logout": "οξουκά",
        "userlogout": "Οξουκά",
        "notloggedin": "Ευρίσκεζνε οξουκά ασή Βικιπαίδειαν",
-       "nologin": "Λογαρίαν 'κ έχετε; '''$1'''.",
-       "nologinlink": "Ποισέστεν λογαρίαν",
        "createaccount": "Ποίσον λογαρίαν",
-       "gotaccount": "Λογαρίαν έχετε; '''$1'''.",
-       "gotaccountlink": "Εμπάτε",
        "createaccountmail": "με ελεκτρονικόν μένεμαν",
-       "createaccountreason": "Λόγον:",
        "badretype": "Τα σημάδε ντ' εγράψετεν 'κ ταιριάζνε.",
        "userexists": "Τ' όνεμαν έχ' ατό άλλος χρήστες.\nΒαλέστε άλλον όνεμαν.",
        "loginerror": "Σφάλμα εγγραφής",
        "rcshowhideanons": "$1 τ' αναγνώριμους τοι χρήστς",
        "rcshowhidepatr": "$1 αλλαγάς ντ' ωράουνταν",
        "rcshowhidemine": "$1 τ' αλλαγάς ιμ",
-       "rclinks": "Δείξον τα $1 υστερνά τ' αλλαγάς α σα $2 υστερνά τα ημέρας<br />$3",
+       "rclinks": "Δείξον τα $1 υστερνά τ' αλλαγάς α σα $2 υστερνά τα ημέρας",
        "diff": "διαφορά",
        "hist": "ιστ.",
        "hide": "Κρύψον",
        "htmlform-reset": "Κλώσον τ'αλλαγάς",
        "htmlform-selectorother-other": "Άλλον",
        "rightsnone": "(τιδέν)",
-       "revdelete-summary": "σύνοψην",
        "searchsuggest-search": "Αράεμαν",
        "special-characters-group-ipa": "ΔΦΑ",
        "special-characters-group-telugu": "Τελούγκου"
index 010c8f6..5ede032 100644 (file)
        "externaldberror": "Tikka izwinaīnas autentikāntin dātanbazin blānda, anga ni assei enwarīntan kāi etnaunīnlai twajjan izwinaīnan rekkenan.",
        "login": "Enjaīs",
        "nav-login-createaccount": "Enjaīs / teīkeis rekkenan",
-       "userlogin": "Enjaīs / teīkeis rekkenan",
-       "userloginnocreate": "Enjaīs",
        "logout": "Izjaīs",
        "userlogout": "Izjaīs",
        "notloggedin": "Ni assei engūbun",
-       "nologin": "Ni turri tū rekkenan? '''$1'''.",
-       "nologinlink": "Registrīs si",
        "createaccount": "Teīkeis nāunan rekkenan",
-       "gotaccount": "Turri tū jāu rekkenan? '''$1'''!",
-       "gotaccountlink": "Enjaīs",
        "createaccountmail": "Tenginnais e-mail",
        "badretype": "Enwestai kliptaswīrdai šlaitinna si.",
        "userexists": "Etrīnkta tērpautajas pabilisnā jāu ekzistijja.\nEtrīnkais kittan tērpautajas pabilīsnan.",
        "editingsection": "Tū redigijja $1 (sekciōni)",
        "editingcomment": "Tū redigijja $1 (naunā sekciōni)",
        "editconflict": "Redigīsenin kōnfliktan: $1",
-       "explainconflict": "Ainunts kits ast kitawīdinuns šin pāusan ezkērdai tū pagaūwa redigītun din.\nTekstas laūks aūktais turri ēn sen pāusas tekstan, kawīds bigāntei ekzistijja.\nTwajjas kitawīdinsnas ast waidīntan en zemmaišasmu tekstas laūkan.\nTebbei prawerru wīrstwei senlījuns(si) twajjans kitawīdinsnans sen ekzistīntin tekstan.\n'''Tēr''' teksts en aūktaišasmu tekstas laūkan wīrst būwuns enpeisātan, kaddan tu wīrst gnettuns \"{{int:savearticle}}\".",
+       "explainconflict": "Ainunts kits ast kitawīdinuns šin pāusan ezkērdai tū pagaūwa redigītun din.\nTekstas laūks aūktais turri ēn sen pāusas tekstan, kawīds bigāntei ekzistijja.\nTwajjas kitawīdinsnas ast waidīntan en zemmaišasmu tekstas laūkan.\nTebbei prawerru wīrstwei senlījuns(si) twajjans kitawīdinsnans sen ekzistīntin tekstan.\n'''Tēr''' teksts en aūktaišasmu tekstas laūkan wīrst būwuns enpeisātan, kaddan tu wīrst gnettuns \"$1\".",
        "yourtext": "Twājs teksts",
        "storedversion": "Enpeisāta wersiōni",
        "nonunicodebrowser": "\"Ēmpirsergīsenis: Twajā lasātla ni erzinna tikrōmiskai UTF-8 kōdisnan (Unicode).\nStesse paggan wisāi zentlai pastāi mainātan sen tenēisan ušnadesimtiskan kōdan.",
        "prefs-rendering": "Prusna",
        "saveprefs": "Enpeisāis",
        "restoreprefs": "Etwārtai wartinnais wissans auprestaminans pirminiskwans",
-       "rows": "Rīndas:",
-       "columns": "Kōlunis:",
        "searchresultshead": "Laukīs",
        "stub-threshold": "Maksimālin debban stesse pāusan ebzentlitan kāigi <a href=\"#\" class=\"stub\">daīgan (stub)</a>",
        "recentchangesdays": "Dēinan gīrbis, waidīnts en panzdaumamans kitawīdinsnans:",
        "userrights-reason": "Brewīnsli:",
        "userrights-no-interwiki": "Ni assei enwarīntan kāi kitawīdinlai stēisan enwarīnsenin en kitēimans wiki.",
        "userrights-nodatabase": "Dātanbazi $1 ni ekzistijja anga ni ast lōkalin.",
-       "userrights-nologin": "Tū turri [[Special:UserLogin|enēitwei]] kāigi perwaldītajs, kāi dātun tērpautajamans enwarīnsenins.",
-       "userrights-notallowed": "Tū ni assei enwarīntan, kāi dālai tērpautajans enwarīnsenins.",
        "userrights-changeable-col": "Gruppis, kawīdans tu mazzi kitawīdintun",
        "userrights-unchangeable-col": "Gruppis, kawīdans tu ni mazzi kitawīdintun",
        "group": "Gruppi:",
        "right-protect": "Pakūnsnas klādas kitawīdinsna be preiēisenis prei redigīsnan stēisan pakūnstan pāusan",
        "right-editprotected": "Redigīs pakūnstans pāusans (šlāit weldītan pakūnsenin)",
        "right-editinterface": "Redigīs tērpautajas interfācan",
-       "right-editusercssjs": "Redigīs CSS be JavaScript zūrbrukins kitēisan tērpautajan",
        "right-editusercss": "Redigīs CSS zūrbrukins kitēisan tērpautajan",
        "right-edituserjs": "Redigīs JS zūrbrukins kitēisan tērpautajan",
        "right-rollback": "Dīwai etwārtai wartinnais redigīsenin stesse tērpautajan, kawīds redigijja ainuntan pāusan kāigi panzdaums",
        "rcshowhideanons": "$1 anōnimai tērpautajai",
        "rcshowhidepatr": "$1 izbandātai redigīsenei",
        "rcshowhidemine": "$1 majāi redigīsenei",
-       "rclinks": "Waidinnais panzdaumans $1 kitawīdinsnans en panzdaumamans $2 dēinans.<br />$3",
+       "rclinks": "Waidinnais panzdaumans $1 kitawīdinsnans en panzdaumamans $2 dēinans.",
        "diff": "šlaitīn.",
        "hist": "ist.",
        "hide": "Kliptinais",
        "undeleteviewlink": "wīdais",
        "undeleteinvert": "Etwartinnais pazentlisenin",
        "undeletecomment": "Kumentārs:",
-       "undeletedrevisions": "{{PLURAL:$1|1 wersiōni|$1 wersiōnis}} etwārtai wartīntan",
-       "undeletedrevisions-files": "etteīkē di {{PLURAL:$1|1 wersiōnin|$1 wersiōnins}}  be {{PLURAL:$2|1 zūrbrukin|$2 zūrbrukins}}",
-       "undeletedfiles": "ast etteīkuns {{PLURAL:$1|1 zūrbrukin|$1 zūrbrukins}}",
        "cannotundelete": "Etgaūsenis ni izpalla;\nAinunts kits ast jāu etgaūwuns šin pāusan.",
        "undeletedpage": "'''$1 pastāi etwārtai wartīntan'''\n\nJaīs en [[Special:Log/delete|āupausinsenin regīsterin]], kāi widālai panzdaumans āupausinsenins be etteīksenins.",
        "undelete-header": "Jaīs en [[Special:Log/delete|āupausinsenin regīsterin]], kāi widālai panzdaumai āupausintans pāusans.",
        "htmlform-selectorother-other": "Kitā",
        "revdelete-restricted": "ensadinnais arāikinsenins per perwaldītajans",
        "revdelete-unrestricted": "āupausinais arāikinsenins per perwaldītajans",
-       "rightsnone": "(nisātausna)",
-       "revdelete-summary": "kitawīdisnan ebpeisāsenis"
+       "rightsnone": "(nisātausna)"
 }
index fe83af4..f9e7689 100644 (file)
@@ -8,7 +8,8 @@
                        "عثمان خان شاہ",
                        "Macofe",
                        "Amire80",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Ibrahim khashrowdi"
                ]
        },
        "tog-underline": "کرښنې تړنې:",
@@ -79,7 +80,7 @@
        "february": "فبروري",
        "march": "مارچ",
        "april": "اپرېل",
-       "may_long": "Ù\85Û\8c",
+       "may_long": "Ù\85Û\90",
        "june": "جون",
        "july": "جولای",
        "august": "اگسټ",
        "feb": "فبروري",
        "mar": "مارچ",
        "apr": "اپرېل",
-       "may": "Ù\85Û\8c",
+       "may": "Ù\85Û\90",
        "jun": "جون",
        "jul": "جولای",
        "aug": "اگسټ",
        "password-change-forbidden": "تاسې په دې ويکي باندې خپل پټنوم نه شی بدلولی.",
        "login": "ننوتل",
        "nav-login-createaccount": "ننوتل / گڼون جوړول",
-       "userlogin": "ننوتل / گڼون جوړول",
-       "userloginnocreate": "ننوتل",
        "logout": "وتل",
        "userlogout": "وتل",
        "notloggedin": "غونډال کې نه ياست ننوتي",
        "userlogin-noaccount": "گڼون نه لرې؟",
        "userlogin-joinproject": "د {{SITENAME}} سره يوځای شه",
-       "nologin": "کارن-نوم نه لرې؟ $1.",
-       "nologinlink": "يو گڼون جوړول",
        "createaccount": "گڼون جوړول",
-       "gotaccount": "آيا وار دمخې يو گڼون لری؟ $1.",
-       "gotaccountlink": "ننوتل",
-       "userlogin-resetlink": "د ننوتلو مالومات مو هېر شوي؟",
        "userlogin-resetpassword-link": "پټنوم مو هېر شوی؟",
        "userlogin-helplink2": "په ننوتلو کې مرسته",
        "userlogin-loggedin": "تاسې له پخوا څخه د {{GENDER:$1|$1}} په نوم ننوتلي ياست.\nد لاندينۍ فورمې په کارولو سره تاسې د بل کارن په توگه ننوتلی شی.",
        "createacct-another-email-ph": "برېښليک پته مو ورکړئ",
        "createaccountmail": "يو لنډمهاله ناټاکلی پټنوم کارول او ځانگړې شوې برېښليک پتې ته ورلېږل",
        "createacct-realname": "آر نوم (اختياري)",
-       "createaccountreason": "سبب:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "تاسې ولې بل گڼون جوړوئ؟",
        "createacct-submit": "گڼون مو جوړ کړئ",
        "right-unblockself": "په خپل ځان بنديز لرې کول",
        "right-protect": "د ژغورنې کچه بدلول او ځوړاوبېزه ژغورلي مخونه سمول",
        "right-editinterface": "د کارن ليدنمخ سمول",
-       "right-editusercssjs": "د نورو کارنانو د CSS او JS (جاوا سکرېپټ) دوتنې سمول",
        "right-editusercss": "د نورو کارنانو د CSS دوتنې سمول",
        "right-edituserjs": "د نورو کارنانو د JS (جاوا سکرېپټ) دوتنې سمول",
        "right-editmyusercss": "خپل د CSS دوتنې سمول",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "ښکاره کول",
        "rcfilters-filterlist-title": "چاڼگران",
-       "rcfilters-filter-userExpLevel-newcomer-label": "نوي راغلي",
-       "rcfilters-filter-userExpLevel-learner-label": "زده کوونکي",
+       "rcfilters-filter-user-experience-level-newcomer-label": "نوي راغلي",
+       "rcfilters-filter-user-experience-level-learner-label": "زده کوونکي",
        "rcnotefrom": "دلته لاندې د <strong>$2</strong> څخه راپدېخوا پېښ شوي بدلونونه راغلي (تر <strong>$1</strong> پورې ښکاري).",
        "rclistfrom": "نوي بدلونونه چې له $3، $2 څخه پيلېږي ښکاره کول",
        "rcshowhideminor": "وړې سمونې $1",
        "rcshowhidecategorization": "د مخ وېشنيزې $1",
        "rcshowhidecategorization-show": "ښکاره کول",
        "rcshowhidecategorization-hide": "پټول",
-       "rclinks": "هغه وروستي $1 بدلونونه ښکاره کړی چې په $2 ورځو کې پېښ شوي<br />$3",
+       "rclinks": "هغه وروستي $1 بدلونونه ښکاره کړی چې په $2 ورځو کې پېښ شوي",
        "diff": "توپير",
        "hist": "پېښليک",
        "hide": "پټول",
        "undeleteviewlink": "کتل",
        "undeleteinvert": "ټاکنې سرچپه کول",
        "undeletecomment": "سبب:",
-       "undeletedrevisions": "{{PLURAL:$1|1 بڼه بيازېرمه شوه|$1 بڼې بيازېرمې شولې}}",
-       "undeletedfiles": "{{PLURAL:$1|1 دوتنه بيازېرمه شوه|$1 دوتنې بيازېرمه شوې}}",
        "cannotundelete": "ناړنگول نابريال شو:\n$1",
        "undelete-header": "د وروستيو ړنگو شوو مخونو لپاره [[Special:Log/delete|د ړنگولو يادښت]] وگورۍ.",
        "undelete-search-title": "ړنگ شوي مخونه پلټل",
        "log-name-managetags": "د نښلن مهارولو يادښت",
        "log-name-tag": "نښلن يادښت",
        "rightsnone": "(هېڅ)",
-       "revdelete-summary": "لنډيز سمول",
        "feedback-back": "پر شا کېدل",
        "feedback-cancel": "ناگارل",
        "feedback-close": "ترسره شو",
index 69f8df1..f1388c0 100644 (file)
                        "!Silent",
                        "Joao Xavier",
                        "Nahime2015",
-                       "Alex Great"
+                       "Alex Great",
+                       "EVinente",
+                       "Felipe L. Ewald",
+                       "WikiUser22222",
+                       "BarbaraAckles",
+                       "Trigonometria87"
                ]
        },
-       "tog-underline": "Sublinhar links:",
+       "tog-underline": "Link sublinhado:",
        "tog-hideminor": "Ocultar edições menores nas mudanças recentes",
        "tog-hidepatrolled": "Ocultar edições patrulhadas nas mudanças recentes",
        "tog-newpageshidepatrolled": "Ocultar páginas patrulhadas da lista de páginas novas",
        "redirectedfrom": "(Redirecionado de $1)",
        "redirectpagesub": "Página de redirecionamento",
        "redirectto": "Redirecionar para:",
-       "lastmodifiedat": "Esta página foi modificada pela última vez à(s) $2 de $1.",
+       "lastmodifiedat": "Esta página foi modificada pela última vez em $1, às $2",
        "viewcount": "Esta página foi acessada {{PLURAL:$1|uma vez|$1 vezes}}.",
        "protectedpage": "Página protegida",
        "jumpto": "Ir para:",
        "viewsource": "Ver código-fonte",
        "viewsource-title": "Exibir código-fonte para $1",
        "actionthrottled": "Ação controlada",
-       "actionthrottledtext": "Como uma medida anti-abuso, você está impedido de realizar esta operação muitas vezes em um curto espaço de tempo, e já excedeu esse limite. Por favor, tente novamente em alguns minutos.",
+       "actionthrottledtext": "Como uma medida anti-abuso, você está impedido de realizar esta operação muitas vezes em um curto espaço de tempo e você excedeu esse limite. Por favor, tente novamente em alguns minutos.",
        "protectedpagetext": "Esta página foi protegida contra novas edições ou ações relacionadas.",
        "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.",
        "invalidtitle-knownnamespace": "Título inválido para o espaço nominal \"$2\" e texto \"$3\"",
        "invalidtitle-unknownnamespace": "Título inválido para o espaço nominal de número desconhecido ($1) e texto \"$2\"",
        "exception-nologin": "Não está autenticado",
-       "exception-nologin-text": "Por favor clique $1 para poder acessar essa página ou ação.",
+       "exception-nologin-text": "Por favor, faça login para poder acessar esta página ou ação.",
        "exception-nologin-text-manual": "Por favor clique $1 para poder acessar essa página ou ação.",
        "virus-badscanner": "Má configuração: antivírus desconhecido: ''$1''",
        "virus-scanfailed": "a verificação falhou (código $1)",
        "login": "Autenticar-se",
        "login-security": "Verificar sua identidade",
        "nav-login-createaccount": "Entrar / criar conta",
-       "userlogin": "Entrar / criar conta",
-       "userloginnocreate": "Entrar",
        "logout": "Sair",
        "userlogout": "Sair",
        "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.",
-       "nologinlink": "Criar uma conta",
        "createaccount": "Criar conta",
-       "gotaccount": "Já possui uma conta? '''$1'''.",
-       "gotaccountlink": "Autenticar-se",
-       "userlogin-resetlink": "Esqueceu-se do seu nome de usuário ou da senha?",
        "userlogin-resetpassword-link": "Esqueceu sua senha?",
        "userlogin-helplink2": "Ajuda com o login",
        "userlogin-loggedin": "Você já está conectado como {{GENDER:$1|$1}}.\nUse o formulário abaixo para iniciar sessão como outro usuário.",
        "createaccountmail": "Usar uma senha aleatória e temporária que será enviada ao endereço de e-mail especificado a seguir",
        "createaccountmail-help": "Pode ser utilizado para criar uma conta para outra pessoa sem saber a senha.",
        "createacct-realname": "Nome real (opcional)",
-       "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por que você está criando outra conta",
        "createacct-reason-help": "Mensagem mostrada no registro de criação de conta",
        "changeemail-newemail": "Novo endereço de e-mail:",
        "changeemail-newemail-help": "Este campo deve ser deixado em branco se você quiser remover o seu endereço de e-mail. Você não será capaz de redefinir uma senha esquecida e não receber e-mails a partir desta wiki se o endereço de email é removido.",
        "changeemail-none": "(nenhum)",
-       "changeemail-password": "Sua senha para o wiki {{SITENAME}}:",
+       "changeemail-password": "Sua senha {{SITENAME}}:",
        "changeemail-submit": "Alterar e-mail",
        "changeemail-throttled": "Você realizou demasiadas tentativas de se registrar.\nPor favor, aguarde $1 antes de tentar novamente.",
        "changeemail-nochange": "Por favor insira um novo endereço de e-mail.",
        "preview": "Pré-visualização",
        "showpreview": "Mostrar previsão",
        "showdiff": "Mostrar alterações",
-       "blankarticle": "<strong>Aviso:</strong> A página que está prestes a criar está em branco.  \nSe clicar \"{{int:savearticle}}\" outra vez, a página será criada sem qualquer conteúdo.",
-       "anoneditwarning": "'''Atenção''': Você não se encontra autenticado.\nO seu endereço de IP será registrado no histórico de edições desta página.",
+       "blankarticle": "<strong>Aviso:</strong> A página que está prestes a criar está em branco.  \nSe clicar \"$1\" outra vez, a página será criada sem qualquer conteúdo.",
+       "anoneditwarning": "<strong>Aviso:</strong> Você não está conectado. Seu endereço IP será visível publicamente se você fizer alguma edição. Se você <strong>[$1 fizer login]</strong> ou <strong>[$2 criar uma conta]</strong>, suas edições serão atribuídas ao seu nome de usuário, juntamente com outros benefícios.",
        "anonpreviewwarning": "''Você não está logado. Gravar registará o seu endereço IP no histórico de edições desta página.''",
        "missingsummary": "'''Lembrete:''' Você não introduziu um sumário de edição. Se clicar novamente em Salvar, a sua edição será salva sem um sumário.",
-       "selfredirect": "<strong>Aviso:</strong> Você esta redirecionando esta pagina para ela mesmo. Você pode ter especificado o caminho errado para redirecionar, ou você pode estar editando a pagina errada. Se você clicar \"{{int:savearticle}}\" novamente, o redirecionamento será criado de qualquer modo.",
+       "selfredirect": "<strong>Aviso:</strong> Você esta redirecionando esta pagina para ela mesmo. Você pode ter especificado o caminho errado para redirecionar, ou você pode estar editando a pagina errada. Se você clicar \"$1\" novamente, o redirecionamento será criado de qualquer modo.",
        "missingcommenttext": "Por favor, introduzida um comentário abaixo.",
-       "missingcommentheader": "'''Lembrete:''' Você não introduziu um assunto/título para este comentário.\nSe você clicar novamente \"{{int:savearticle}}\", a sua edição será salva sem um assunto/título.",
-       "summary-preview": "Previsão do resumo:",
+       "missingcommentheader": "'''Lembrete:''' Você não introduziu um assunto/título para este comentário.\nSe você clicar novamente \"$1\", a sua edição será salva sem um assunto/título.",
+       "summary-preview": "Previsão do resumo de edição:",
        "subject-preview": "Previsão do assunto/título:",
        "previewerrortext": "Ocorreu um erro ao tentar pré-visualizar suas alterações.",
        "blockedtitle": "O usuário está bloqueado",
        "missing-revision": "A revisão #$1 da página denominada \"{{FULLPAGENAME}}\" não existe.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "userpage-userdoesnotexist": "A conta \"<nowiki>$1</nowiki>\" não se encontra registrada.\nVerifique se deseja mesmo criar/editar esta página.",
        "userpage-userdoesnotexist-view": "A conta de usuário \"$1\" não está registrada.",
-       "blocked-notice-logextract": "Este usuário está atualmente bloqueado.\nO registro de bloqueio mais recente é fornecido abaixo, para referência:",
+       "blocked-notice-logextract": "{{GENDER:$1|Este usuário está atualmente bloqueado|Esta usuária está atualmente bloqueada|Este(a) usuário(a) está atualmente bloqueado(a)}}.\nO registro de bloqueio mais recente é fornecido abaixo, para referência:",
        "clearyourcache": "<strong>Nota:</strong> Após salvar, você pode ter que limpar o \"cache\" do seu navegador para ver as alterações.\n*<strong>Firefox / Safari:</strong> Pressione <em>Shift</em> enquanto clica <em>Recarregar</em>, ou pressione <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> no Mac)\n*<strong>Google Chrome:</strong> Pressione <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> no Mac)\n* <strong>Internet Explorer:</strong> Pressione<em>Ctrl</em> enquanto clica <em>Recarregar</em>, ou Pressione <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Vá para <em>Menu → Configurações</em> (<em>Opera → Preferencias</em> no Mac) e depois para <em>Privacidade e Segurança → Limpar dados de navegação → Imagens e arquivos em cache</em>.",
        "usercssyoucanpreview": "'''Dica:''' Utilize o botão \"{{int:showpreview}}\" para testar seu novo CSS antes de salvar.",
        "userjsyoucanpreview": "'''Dica:''' Utilize o botão \"{{int:showpreview}}\" para testar seu novo JavaScript antes de salvar.",
        "editingsection": "Editando $1 (seção)",
        "editingcomment": "Editando $1 (nova seção)",
        "editconflict": "Conflito de edição: $1",
-       "explainconflict": "Alguém mudou a página enquanto você a estava editando.\nA área de texto acima mostra o texto original.\nSuas mudanças são mostradas na área abaixo.\nVocê terá que mesclar suas modificações no texto existente.\n'''SOMENTE''' o texto na área acima será salvo quando você pressionar \"{{int:savearticle}}\".",
+       "explainconflict": "Alguém mudou a página enquanto você a estava editando.\nA área de texto acima mostra o texto original.\nSuas mudanças são mostradas na área abaixo.\nVocê terá que mesclar suas modificações no texto existente.\n'''SOMENTE''' o texto na área acima será salvo quando você pressionar \"$1\".",
        "yourtext": "Seu texto",
        "storedversion": "Versão guardada",
        "nonunicodebrowser": "'''AVISO: O seu navegador não é compatível com as especificações unicode.'''\nUm contorno terá de ser utilizado para permitir que você possa editar as páginas com segurança: os caracteres não-ASCII aparecerão na caixa de edição no formato de códigos hexadecimais.",
        "readonlywarning": "'''Aviso: O banco de dados foi bloqueado para manutenção, por isso você não poderá salvar a sua edição neste momento.'''\nTalvez você queira copiar o seu texto num editor externo e guardá-lo, para posterior envio.\n\nQuem bloqueou o banco de dados forneceu a seguinte explicação: $1",
        "protectedpagewarning": "'''Atenção: Esta página foi protegida para que apenas usuários com privilégios de administrador possam editá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
        "semiprotectedpagewarning": "'''Nota:''' Esta página foi protegida, sendo que apenas usuários registrados poderão editá-la.\nA última entrada no histórico é fornecida abaixo para referência:",
-       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página foi protegida para que somente usuários com privilégios de administrador possam editá-la porque ela é transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} por cascata:",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página foi protegida para que somente usuários com [[Special:ListGroupRights|grupos com direitos específicos]] possam editá-la porque ela é transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} por cascata:",
        "titleprotectedwarning": "'''Atenção: esta página foi protegida; [[Special:ListGroupRights|privilégios específicos]] são necessários para criá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
        "templatesused": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta página:",
        "templatesusedpreview": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta previsão:",
        "post-expand-template-argument-warning": "Aviso: Esta página contém pelo menos um argumento de predefinição com um tamanho muito grande.\nEstes argumentos foram omitidos.",
        "post-expand-template-argument-category": "Páginas com argumentos de predefinições descartados",
        "parser-template-loop-warning": "Ciclo de predefinições detectado: [[$1]]",
+       "template-loop-category": "Páginas com loops de predefinição",
+       "template-loop-category-desc": "A página contém um loop de predefinição, ou seja, uma predefinição que se chama recursivamente.",
        "parser-template-recursion-depth-warning": "O limite de profundidade de recursividade de predefinição foi ultrapassado ($1)",
        "language-converter-depth-warning": "O limite de profundidade do conversor de línguas excedeu a ($1)",
        "node-count-exceeded-category": "Páginas em que o total de nós é excedido",
        "page_first": "primeira",
        "page_last": "última",
        "histlegend": "Como selecionar: marque as caixas de seleção das versões que deseja comparar e pressione enter ou clique no botão na parte inferior do formulário.<br />\nLegenda: <strong>({{int:cur}})</strong> = diferenças em relação a última versão, <strong>({{int:last}})</strong> = diferenças em relação a versão anterior, <strong>{{int:minoreditletter}}</strong> = edição menor.",
-       "history-fieldset-title": "Navegar pelo histórico",
-       "history-show-deleted": "Apenas as eliminadas",
+       "history-fieldset-title": "Pesquisar revisões",
+       "history-show-deleted": "Apenas as revisões excluídas",
        "histfirst": "Mais antigas",
        "histlast": "Mais novas",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "search-file-match": "(coincide com o conteúdo do arquivo)",
        "search-suggest": "Você quis dizer: $1?",
        "search-rewritten": "Mostrando resultados para $1. Pesquisar ao invés por $2.",
-       "search-interwiki-caption": "Projetos irmãos",
+       "search-interwiki-caption": "Resultados de projetos irmãos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
        "search-interwiki-more-results": "Mais resultados",
        "preferences": "Preferências",
        "mypreferences": "Preferências",
        "prefs-edits": "Número de edições:",
-       "prefsnologintext2": "Por favor clique $1 para alterar suas preferências",
+       "prefsnologintext2": "Por favor, faça login para alterar suas preferências.",
        "prefs-skin": "Tema",
        "skin-preview": "prever",
        "datedefault": "Sem preferência",
        "saveusergroups": "Salvar grupos de{{GENDER:$1|usuário}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implícito de:",
-       "userrights-groups-help": "É possível alterar os grupos em que {{GENDER:$1|este usuário|esta usuária|este(a) usuário(a)}} se encontra:\n* Uma caixa de seleção selecionada significa que {{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} encontra-se no grupo.\n* Uma caixa de seleção não selecionada significa que {{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} não se encontra no grupo.\n* Um * indica que não pode remover o grupo depois de o adicionar, ou vice-versa.",
+       "userrights-groups-help": "É possível alterar os grupos em que {{GENDER:$1|este usuário|esta usuária|este(a) usuário(a)}} se encontra:\n* Uma caixa de seleção selecionada significa que {{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} encontra-se no grupo.\n* Uma caixa de seleção não selecionada significa que {{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} não se encontra no grupo.\n* Um * indica que não pode remover o grupo depois de o adicionar, ou vice-versa.\n* Um # indica que você só pode atrasar o tempo de expiração dos membros deste grupo; você não pode aumentá-lo.",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Você não tem permissão para alterar privilégios de usuários em outros wikis.",
        "userrights-nodatabase": "O banco de dados $1 não existe ou não é um banco de dados local.",
        "userrights-expiry-options": "1 dia:1 day,1 semana:1 week,1 mês:1 month,3 meses:3 months,6 meses:6 months,1 ano:1 year",
        "userrights-invalid-expiry": "O tempo de expiração para o grupo \"$1\" é inválido.",
        "userrights-expiry-in-past": "O tempo de expiração para o grupo \"$1\" está no passado.",
-       "userrights-cannot-shorten-expiry": "Você não pode antecipar a expiração do grupo \"$1\". Somente usuários com permissão para adicionar e remover este grupo pode apresentar tempos de expiração.",
+       "userrights-cannot-shorten-expiry": "Você não pode antecipar a expiração dos membros no grupo \"$1\". Somente usuários com permissão para adicionar e remover este grupo podem.",
        "userrights-conflict": "Há um comflito de permissões de usuário! Por favor, revise e confirme as alterações novamente.",
        "group": "Grupo:",
        "group-user": "Usuários",
        "right-editsemiprotected": "Editar páginas protegidas como \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Editar o modelo de uma pagina",
        "right-editinterface": "Editar a interface de usuário",
-       "right-editusercssjs": "Editar os arquivos CSS e JS de outros usuários",
        "right-editusercss": "Editar os arquivos CSS de outros usuários",
        "right-edituserjs": "Editar os arquivos JS de outros usuários",
        "right-editmyusercss": "Edite seu próprio arquivo CSS de usuário",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Exibir",
        "rcfilters-activefilters": "Filtros ativos",
+       "rcfilters-quickfilters": "Links Rápidos",
+       "rcfilters-quickfilters-placeholder-title": "Ainda não foi gravado nenhum link",
+       "rcfilters-savedqueries-defaultlabel": "Filtros salvos",
+       "rcfilters-savedqueries-rename": "Renomear",
+       "rcfilters-savedqueries-setdefault": "Definir como padrão",
+       "rcfilters-savedqueries-unsetdefault": "Remover como padrão",
+       "rcfilters-savedqueries-remove": "Remover",
+       "rcfilters-savedqueries-new-name-label": "Nome",
+       "rcfilters-savedqueries-apply-label": "Criar link rápido",
+       "rcfilters-savedqueries-cancel-label": "Cancelar",
+       "rcfilters-savedqueries-add-new-title": "Salvar filtros como um link rápido",
        "rcfilters-restore-default-filters": "Restaurar filtros padrão",
        "rcfilters-clear-all-filters": "Limpar todos os filtros",
-       "rcfilters-search-placeholder": "Filtrar alterações recentes (procurar ou começar a digitar)",
+       "rcfilters-search-placeholder": "Filtrar mudanças recentes (procurar ou começar a digitar)",
        "rcfilters-invalid-filter": "Filtro inválido",
        "rcfilters-empty-filter": "Nenhum filtro ativo. Todas as contribuições são mostradas.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "O que é isso?",
+       "rcfilters-filterlist-feedbacklink": "Forneça feedback sobre os novos filtros (beta)",
+       "rcfilters-highlightbutton-title": "Realçar os resultados",
+       "rcfilters-highlightmenu-title": "Selecione uma cor",
+       "rcfilters-highlightmenu-help": "Selecione uma cor para realçar esta propriedade",
        "rcfilters-filterlist-noresults": "Nenhum filtro encontrado",
+       "rcfilters-noresults-conflict": "Nenhum resultado encontrado porque os critérios de pesquisa estão em conflito",
+       "rcfilters-state-message-subset": "Este filtro não tem efeito porque seus resultados estão incluídos com {{PLURAL:$2|o seguinte filtro mais amplo|os seguintes filtros mais amplos}} (tente realçar para distingui-lo): $1",
+       "rcfilters-state-message-fullcoverage": "Selecionar todos os filtros em um grupo é o mesmo que não selecionar nenhum, portanto este filtro não tem efeito. O grupo inclui: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "Este filtro entra em conflito com {{PLURAL:$2|o seguinte filtro|os seguintes filtros}} de Experiência, que {{PLURAL:$2|encontra|encontram}} somente usuários registrados: $1",
+       "rcfilters-filtergroup-authorship": "Autoria da contribuição",
+       "rcfilters-filter-editsbyself-label": "Mudanças por você",
+       "rcfilters-filter-editsbyself-description": "Suas proprias contribuições.",
+       "rcfilters-filter-editsbyother-label": "Mudanças de outros",
+       "rcfilters-filter-editsbyother-description": "Todas as mudanças, exceto a sua.",
        "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-user-experience-level-conflicts-unregistered": "Os filtros de experiência encontram apenas usuários registados, assim este filtro entra em conflito com o filtro “Não registado”.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "O filtro \"Não Registrado\" entra em conflito com um ou mais filtros de Experiência, que localizam apenas usuários registrados. Os filtros em conflito são marcados na área Filtros Ativos, acima.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Recém-chegados",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Menos de 10 edições e 4 dias de atividade.",
+       "rcfilters-filter-user-experience-level-learner-label": "Aprendizes",
+       "rcfilters-filter-user-experience-level-learner-description": "Mais experiência do que \"Novatos\", mas menos do que \"Usuários experientes\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Usuários experientes",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Estado da revisão",
+       "rcfilters-filter-patrolled-label": "Patrulhado",
+       "rcfilters-filter-patrolled-description": "Edições marcadas como patrulhadas.",
+       "rcfilters-filter-unpatrolled-label": "Não patrulhadas",
+       "rcfilters-filter-unpatrolled-description": "Edições não marcadas como patrulhadas.",
        "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-watchlist": "Páginas visualizadas na Watchlist",
+       "rcfilters-filter-watchlist-watched-label": "Na Páginas vigiadas",
+       "rcfilters-filter-watchlist-watched-description": "Modificações de páginas vigiadas.",
+       "rcfilters-filter-watchlist-watchednew-label": "Modificações novas de páginas vigiadas",
+       "rcfilters-filter-watchlist-watchednew-description": "Modificações de páginas vigiadas que ainda não visitou depois de serem modificadas.",
+       "rcfilters-filter-watchlist-notwatched-label": "Ausente da lista de páginas vigiadas",
+       "rcfilters-filter-watchlist-notwatched-description": "Tudo menos modificações das suas páginas vigiadas.",
        "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-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 ...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "O filtro \"Edições menores\" conflita com um ou mais filtros de Tipo de Alteração, porque certos tipos de alteração não podem ser designadas como \"menores\". Os filtros em conflito estão marcados na área Filtros Ativos, acima.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Determinados tipos de alteração não podem ser designados como \"menor\", portanto, este filtro entra em conflito com os seguintes filtros de Tipo de Alteração: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Este filtro de Tipo de Alteração entra em conflito com o filtro \"Edições menores\". Certos tipos de mudança não podem ser designadas como \"menores\".",
+       "rcfilters-filtergroup-lastRevision": "Última revisão",
+       "rcfilters-filter-lastrevision-label": "Última revisão",
+       "rcfilters-filter-lastrevision-description": "A alteração mais recente para uma página.",
+       "rcfilters-filter-previousrevision-label": "Revisões anteriores",
+       "rcfilters-filter-previousrevision-description": "Todas as alterações que não são a alteração mais recente para uma página.",
        "rcnotefrom": "Abaixo {{PLURAL:$5|é a mudança|são as mudanças}} desde <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
+       "rclistfromreset": "Redefinir seleção da data",
        "rclistfrom": "Mostrar as novas alterações a partir das $2 de $3",
        "rcshowhideminor": "$1 edições menores",
        "rcshowhideminor-show": "Exibir",
        "rcshowhidecategorization": "$1 categorização de páginas",
        "rcshowhidecategorization-show": "Exibir",
        "rcshowhidecategorization-hide": "Esconder",
-       "rclinks": "Exibir as $1 alterações recentes feitas nos últimos $2 dias<br />$3",
+       "rclinks": "Exibir as $1 mudanças recentes feitas nos últimos $2 dias",
        "diff": "dif",
        "hist": "his",
        "hide": "Ocultar",
        "rc-enhanced-expand": "Exibir detalhes",
        "rc-enhanced-hide": "Ocultar detalhes",
        "rc-old-title": "criado originalmente como \"$1\"",
-       "recentchangeslinked": "Alterações relacionadas",
-       "recentchangeslinked-feed": "Alterações relacionadas",
-       "recentchangeslinked-toolbox": "Alterações relacionadas",
-       "recentchangeslinked-title": "Alterações relacionadas com \"$1\"",
+       "recentchangeslinked": "Mudanças relacionadas",
+       "recentchangeslinked-feed": "Mudanças relacionadas",
+       "recentchangeslinked-toolbox": "Mudanças relacionadas",
+       "recentchangeslinked-title": "Mudanças relacionadas com “$1”",
        "recentchangeslinked-summary": "Esta página lista alterações feitas recentemente em páginas com links a uma em específico (ou de membros de uma categoria especificada).\nPáginas de sua [[Special:Watchlist|lista de páginas vigiadas]] são exibidas em '''negrito'''.",
        "recentchangeslinked-page": "Nome da página:",
        "recentchangeslinked-to": "Inversamente, mostrar mudanças nas páginas que contêm ligações para esta",
        "tmp-write-error": "Erro ao alterar arquivo temporário.",
        "large-file": "É recomendável que os arquivos não sejam maiores que $1;\neste possui $2.",
        "largefileserver": "Este arquivo é maior do que o servidor está configurado para permitir.",
-       "emptyfile": "O arquivo enviado para estar vazio.\nIsso pode ocorrer devido a um erro de digitação no nome do arquivo.\nVerifique se você realmente deseja enviar este arquivo.",
+       "emptyfile": "O arquivo enviado parece estar vazio.\nIsso pode ter ocorrido por um erro de digitação no nome do arquivo.\nVerifique se você realmente deseja enviar este arquivo.",
        "windows-nonascii-filename": "O wiki não aceita nomes de arquivos com caracteres especiais.",
        "fileexists": "Já existe um arquivo com este nome.\nVerifique <strong>[[:$1]]</strong> caso não tenha certeza se deseja alterar o arquivo atual.\n[[$1|thumb]]",
        "filepageexists": "A página de descrição deste arquivo já foi criada em <strong>[[:$1]]</strong>, mas atualmente não existe nenhum arquivo com este nome.\nO sumário que você inseriu não aparecerá na página de descrição.\nPara que ele apareça, será necessário editá-lo manualmente.\n[[$1|thumb]]",
        "php-uploaddisabledtext": "O envio de arquivos via PHP está desativado.\nVerifique a configuração file_uploads.",
        "uploadscripted": "Este arquivo contém HTML ou código que pode ser erroneamente interpretado por um navegador web.",
        "upload-scripted-pi-callback": "Não é possível fazer upload de um arquivo que contém instruções de processamento de folha de estilo XML.",
+       "upload-scripted-dtd": "Não é possível carregar arquivos SVG que contenham uma declaração DTD não padrão.",
        "uploaded-script-svg": "Encontrado elemento de script \"$1\" no arquivo SVG carregado.",
        "uploaded-hostile-svg": "Encontrado CSS inseguro no elemento de estilo do arquivo SVG carregado.",
        "uploaded-event-handler-on-svg": "Não é permitido configurar atributos que manipulem eventos  <code>$1=\"$2\"</code> em arquivos SVG.",
        "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-legend": "Pesquisar fontes de livros",
        "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.",
        "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": "Edições revertidas por {{GENDER:$3|$1}};\nalterado para a última revisão por {{GENDER:$4|$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.",
        "undeleteviewlink": "visualizar",
        "undeleteinvert": "Inverter seleção",
        "undeletecomment": "Motivo:",
-       "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": "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.",
        "sp-contributions-uploads": "envios",
        "sp-contributions-logs": "registros",
        "sp-contributions-talk": "disc",
-       "sp-contributions-userrights": "gerenciamento de privilégios de usuários",
+       "sp-contributions-userrights": "gerenciamento de privilégios de {{GENDER:$1|usuários}}",
        "sp-contributions-blocked-notice": "Este usuário atualmente está bloqueado. O registro de bloqueio mais recente é fornecido abaixo para referência:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP encontra-se bloqueado.\nSegue, para referência, a entrada mais recente no registro de bloqueios:",
        "sp-contributions-search": "Navegar pelas contribuições",
        "unblocked-id": "O bloqueio de $1 foi removido com sucesso",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] foi desbloqueado.",
        "blocklist": "Usuários bloqueados",
+       "autoblocklist": "Bloqueios automáticos",
+       "autoblocklist-submit": "Pesquisar",
+       "autoblocklist-legend": "Listar bloqueios automáticos",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Bloqueio automático local|Bloqueios automáticos locais}}",
+       "autoblocklist-empty": "A lista de bloqueios automáticos está vazia.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Outro bloqueio automático|Outros bloqueios automáticos}}",
        "ipblocklist": "Usuários bloqueados",
        "ipblocklist-legend": "Procurar por um usuário bloqueado",
        "blocklist-userblocks": "Esconder bloqueios de contas",
        "autoblocker": "Você foi automaticamente bloqueado, pois o seu Endereço IP foi recentemente usado por \"[[User:$1|$1]]\". \nO motivo apresentado para o bloqueio de $1 é: \"$2\".",
        "blocklogpage": "Registro de bloqueios",
        "blocklog-showlog": "Este usuário já foi bloqueado anteriormente.\nO registro de bloqueio é fornecido abaixo, para referência:",
-       "blocklog-showsuppresslog": "O usuário foi bloqueado e ocultado anteriormente.\nO registro de supressão é fornecido abaixo para referência:",
+       "blocklog-showsuppresslog": "{{GENDER:$1|O usuário foi bloqueado e ocultado|A usuária foi bloqueada e ocultada|O(a) usuário(a) foi bloqueado(a) e ocultado(a)}} anteriormente.\nO registro de supressão é fornecido abaixo para referência:",
        "blocklogentry": "bloqueou \"[[$1]]\" por $2. $3",
        "reblock-logentry": "modificou parâmetros de bloqueio de [[$1]] com expiração em $2. $3",
        "blocklogtext": "Este é um registro de ações de bloqueio e desbloqueio.\nEndereços IP sujeitos a bloqueio automático não são listados.\nConsulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloqueios e banimentos em efeito neste momento.",
        "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}}]]\").",
        "exportall": "Exportar todas as páginas",
        "exportcuronly": "Incluir apenas a revisão atual, não o histórico inteiro",
-       "exportnohistory": "----\n'''Nota:''' a exportação do histórico completo das páginas através deste formulário foi desativada devido a questões de performance.",
+       "exportnohistory": "----\n'''Nota:''' a exportação do histórico completo das páginas através deste formulário foi desativada devido a questões de desempenho.",
        "exportlistauthors": "Incluir uma lista completa dos colaboradores de cada página",
        "export-submit": "Exportar",
        "export-addcattext": "Adicionar à listagem páginas da categoria:",
        "tooltip-pt-mycontris": "Listagem das {{GENDER:|suas}} contribuições",
        "tooltip-pt-anoncontribs": "Uma lista de edições feitas a partir deste endereço de IP",
        "tooltip-pt-login": "Você é encorajado a autenticar-se; no entanto, não é obrigatório",
+       "tooltip-pt-login-private": "Você precisa fazer login para usar esta wiki",
        "tooltip-pt-logout": "Sair",
        "tooltip-pt-createaccount": "É recomendado que você crie uma conta e inicie uma seção; todavia, isto não é obrigatório",
        "tooltip-ca-talk": "Discussão sobre o conteúdo da página",
        "anonymous": "{{PLURAL:$1|Usuário anônimo|Usuários anônimos}} da {{SITENAME}}",
        "siteuser": "{{GENDER:$2|um usuário|uma usuária|um usuário}} da {{SITENAME}} ($1)",
        "anonuser": "usuário anônimo $1 da {{SITENAME}}",
-       "lastmodifiedatby": "Esta página foi modificada pela última vez à(s) $2 de $1 por $3.",
+       "lastmodifiedatby": "Esta página foi editada pela última vez à(s) $2 de $1 por $3.",
        "othercontribs": "Baseado no trabalho de $1.",
        "others": "outros",
        "siteusers": "{{PLURAL:$2|{{GENDER:$1|um usuário}}|$2 usuários}} da {{SITENAME}} ($1)",
        "newimages-summary": "Esta página especial mostra os arquivos mais recentemente enviados",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de arquivo (ou parte dele):",
+       "newimages-user": "Endereço IP ou nome do usuário:",
        "newimages-showbots": "Mostrar uploads realizados por robôs",
        "newimages-hidepatrolled": "Ocultar os carregamentos patrulhados.",
        "noimages": "Nada para ver.",
        "exif-pixelydimension": "Altura da imagem",
        "exif-usercomment": "Comentários de usuários",
        "exif-relatedsoundfile": "arquivo áudio relacionado",
-       "exif-datetimeoriginal": "Data e hora de geração de dados",
+       "exif-datetimeoriginal": "Data e hora da geração dos dados",
        "exif-datetimedigitized": "Data e hora de digitalização",
        "exif-subsectime": "Subsegundos DataHora",
        "exif-subsectimeoriginal": "Subsegundos DataHoraOriginal",
        "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-title": "Purgar esta página",
        "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.",
        "autosumm-newblank": "Criar página em branco",
        "size-kilobytes": "$1 kB",
        "bitrate-kilobits": "$1&nbsp;kb/s",
-       "lag-warn-normal": "É possível que as alterações que sejam mais recentes do que $1 {{PLURAL:$1|segundo|segundos}} não sejam exibidas nesta lista.",
-       "lag-warn-high": "Devido a sérios problemas de latência no servidor do banco de dados, as alterações mais recentes que $1 {{PLURAL:$1|segundo|segundos}} poderão não ser exibidas nesta lista.",
+       "lag-warn-normal": "É possível que as mudanças que sejam mais recentes do que $1 {{PLURAL:$1|segundo|segundos}} não sejam exibidas nesta lista.",
+       "lag-warn-high": "Devido a sérios problemas de latência no servidor do banco de dados, as mudanças mais recentes que $1 {{PLURAL:$1|segundo|segundos}} poderão não ser exibidas nesta lista.",
        "watchlistedit-normal-title": "Editar lista de páginas vigiadas",
        "watchlistedit-normal-legend": "Remover títulos da lista de páginas vigiadas",
        "watchlistedit-normal-explain": "Os títulos das páginas de sua lista de vigiadas são exibidos abaixo.\nPara remover um título, marque a caixa ao lado do mesmo e clique \"{{int:Watchlistedit-normal-submit}}\".\nVocê pode também [[Special:EditWatchlist/raw|editar a lista de páginas vigiadas em forma de texto]].",
        "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-restore": "$1 {{GENDER:$2|restaurou}} a página $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|restaurou}} a página $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 revisão|$1 revisões}}",
+       "restore-count-files": "{{PLURAL:$1|1 arquivo|$1 arquivos}}",
        "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-delete-event-legacy": "$1 {{GENDER:$2|alterou}} a visibilidade de entradas de registo em $3",
        "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": "resumo da edição",
        "rightslogentry-temporary-group": "$1 (temporário, até $2)",
        "feedback-adding": "Adicionando os comentários na página...",
        "feedback-back": "Voltar",
        "special-characters-group-thai": "Tailandês",
        "special-characters-group-lao": "Laociano",
        "special-characters-group-khmer": "Cambojano",
+       "special-characters-group-canadianaboriginal": "Aborígine Canadense",
        "special-characters-title-endash": "traço",
        "special-characters-title-emdash": "travessão",
        "special-characters-title-minus": "sinal de menos",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Adicionar uma categoria...",
        "mw-widgets-usersmultiselect-placeholder": "Adicione mais...",
+       "date-range-from": "Da data:",
+       "date-range-to": "Para data:",
        "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",
        "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"
+       "pageid": "ID da página $1",
+       "rawhtml-notallowed": "As tags &lt;html&gt; não podem ser usadas fora das páginas normais.",
+       "gotointerwiki": "Saindo {{SITENAME}}",
+       "gotointerwiki-invalid": "O título especificado é inválido.",
+       "gotointerwiki-external": "Você está prestes a sair {{SITENAME}} para visitar [[$2]] que é um website separado.\n\n[$1 Continuar para $1].",
+       "undelete-cantedit": "Você não pode restaurar esta página, porque você não está autorizado a editar esta página.",
+       "undelete-cantcreate": "Você não pode restaurar esta página, pois não há uma página com este nome e você não está autorizado a criar esta página."
 }
index 0ed8589..fd11859 100644 (file)
        "redirectedfrom": "(Redirecionado de $1)",
        "redirectpagesub": "Página de redirecionamento",
        "redirectto": "Redireciona para:",
-       "lastmodifiedat": "Esta página foi modificada pela última vez à(s) $2 de $1.",
+       "lastmodifiedat": "Esta página foi editada pela última vez à(s) $2 de $1.",
        "viewcount": "Esta página foi acedida {{PLURAL:$1|uma vez|$1 vezes}}.",
        "protectedpage": "Página protegida",
        "jumpto": "Ir para:",
        "aboutsite": "Sobre a wiki {{SITENAME}}",
        "aboutpage": "Project:Sobre",
        "copyright": "Conteúdo disponibilizado nos termos da $1, salvo indicação em contrário.",
-       "copyrightpage": "{{ns:project}}:Direitos_de_autor",
+       "copyrightpage": "{{ns:project}}:Direitos de autor",
        "currentevents": "Notícias",
        "currentevents-url": "Project:Notícias",
        "disclaimers": "Exoneração de responsabilidade",
        "login": "Entrar",
        "login-security": "Verificar a sua identidade",
        "nav-login-createaccount": "Entrar / criar conta",
-       "userlogin": "Criar uma conta ou entrar",
-       "userloginnocreate": "Entrar",
        "logout": "Sair",
        "userlogout": "Sair",
        "notloggedin": "Não autenticado",
        "userlogin-noaccount": "Não tem uma conta?",
        "userlogin-joinproject": "Junte-se ao projeto {{SITENAME}}",
-       "nologin": "Não possui uma conta? $1.",
-       "nologinlink": "Criar uma conta",
        "createaccount": "Criar conta",
-       "gotaccount": "Já possui uma conta? $1.",
-       "gotaccountlink": "Entrar",
-       "userlogin-resetlink": "Esqueceu-se do seu nome de utilizador ou da palavra-passe?",
        "userlogin-resetpassword-link": "Esqueceu-se da sua palavra-passe?",
        "userlogin-helplink2": "Ajuda para iniciar sessão",
        "userlogin-loggedin": "Já está {{GENDER:$1|autenticado|autenticada|autenticado}} com o nome $1.\nUse o formulário abaixo para iniciar sessão com outro nome.",
        "createaccountmail": "Usar uma palavra passe aleatória e temporária e enviar para o endereço de correio eletrónico especificado",
        "createaccountmail-help": "Pode ser utilizado para criar uma conta para outra pessoa sem saber a palavra-passe.",
        "createacct-realname": "Nome verdadeiro (opcional)",
-       "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Porque está a criar outra conta",
        "createacct-reason-help": "Mensagem mostrada no registo de criação de contas",
        "preview": "Antevisão",
        "showpreview": "Antever resultado",
        "showdiff": "Mostrar alterações",
-       "blankarticle": "<strong>Aviso:</strong> A página que está prestes a criar está em branco.  \nSe clicar \"{{int:savearticle}}\" outra vez, a página será criada sem qualquer conteúdo.",
+       "blankarticle": "<strong>Aviso:</strong> A página que está prestes a criar está em branco.  \nSe clicar \"$1\" outra vez, a página será criada sem qualquer conteúdo.",
        "anoneditwarning": "<strong>Aviso</strong>: Não iniciou sessão. O seu endereço IP será registado no histórico de edições desta página. Se <strong>[$1 iniciar sessão]</strong> ou <strong>[$2 criar uma conta]</strong>, as suas edições serão registadas com o seu nome de utilizador(a), bem como usufruir de outros benefícios.",
        "anonpreviewwarning": "''Não iniciou sessão. Ao gravar, registará o seu endereço IP no histórico de edições da página.''",
        "missingsummary": "'''Atenção:''' Não introduziu um resumo da edição.\nSe clicar novamente \"Gravar página\" a sua edição será gravada sem resumo.",
-       "selfredirect": "<strong>Aviso:</strong> Está a redirecionar esta página para si mesma.\nPode ter especificado o destino errado para a página ou até a editar a página errada.\nSe clicar em \"{{int:savearticle}}\" novamente, o redirecionamento será criado na mesma.",
+       "selfredirect": "<strong>Aviso:</strong> Está a redirecionar esta página para si mesma.\nPode ter especificado o destino errado para o redirecionamento ou pode estar a editar a página errada.\nSe clicar em \"$1\" novamente, o redirecionamento será criado na mesma.",
        "missingcommenttext": "Introduza um comentário abaixo, por favor.",
-       "missingcommentheader": "<strong>Atenção:</strong> Não introduziu um assunto para este comentário.\nSe clicar novamente \"{{int:savearticle}}\", a sua edição será gravada sem assunto.",
+       "missingcommentheader": "<strong>Atenção:</strong> Não introduziu um assunto para este comentário.\nSe clicar novamente \"$1\", a sua edição será gravada sem assunto.",
        "summary-preview": "Antevisão do resumo de edição:",
        "subject-preview": "Antevisão do assunto:",
        "previewerrortext": "Ocorreu um erro enquanto tentava antever as suas alterações.",
        "editingsection": "A editar $1 (secção)",
        "editingcomment": "A editar $1 (nova secção)",
        "editconflict": "Conflito de edição: $1",
-       "explainconflict": "A página foi alterada por alguém desde que começou a editá-la.\nA caixa de texto abaixo mostra o texto existente neste momento.\nAs suas mudanças são mostradas na área ao fundo da página.\nTerá de reintegrar as suas mudanças no texto da caixa abaixo.\n'''Só''' o texto desta caixa será gravado quando clicar \"{{int:savearticle}}\".",
+       "explainconflict": "A página foi alterada por alguém desde que começou a editá-la.\nA caixa de texto abaixo mostra o texto existente neste momento.\nAs suas mudanças são mostradas na área ao fundo da página.\nTerá de reintegrar as suas mudanças no texto da caixa abaixo.\n<strong>Só</strong> o texto desta caixa será gravado quando clicar \"$1\".",
        "yourtext": "O seu texto",
        "storedversion": "Versão gravada",
        "nonunicodebrowser": "<strong>Aviso: O seu navegador não é compatível com as especificações Unicode.</strong>\nFoi ativado um sistema de edição alternativo que lhe permite editar as páginas com segurança: os caracteres não-ASCII aparecerão na caixa de edição no formato de códigos hexadecimais.",
        "readonlywarning": "<strong>Atenção: A base de dados foi bloqueada para manutenção, pelo que não poderá gravar as suas edições neste momento.</strong>\nPode, contudo, copiar e colar o seu texto num ficheiro de texto e guardá-lo para mais tarde.\n\nO administrador do sistema que a bloqueou forneceu a seguinte explicação: $1",
        "protectedpagewarning": "'''Aviso: Esta página foi protegida para só poder ser editada por administradores.'''\nO último registo é apresentado abaixo para referência:",
        "semiprotectedpagewarning": "'''Nota:''' Esta página foi protegida de modo a que apenas utilizadores registados a possam editar.\nA última entrada no histórico é fornecida abaixo como referência.",
-       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página está protegida de forma que apenas os administradores possam editá-la, porque se encontra transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} em cascata:",
+       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página está protegida de forma que apenas os utilizadores com [[Special:ListGroupRights|privilégios específicos]] possam editá-la, porque se encontra transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} em cascata:",
        "titleprotectedwarning": "'''Aviso: Esta página foi protegida de forma a que [[Special:ListGroupRights|privilégios específicos]] sejam necessários para criá-la.'''\nPara referência, é apresentada abaixo a última entrada do registo:",
        "templatesused": "{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta página:",
        "templatesusedpreview": "{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta antevisão:",
        "post-expand-template-argument-warning": "Aviso: Esta página contém pelo menos um argumento de predefinição com um tamanho expandido demasiado grande.\nEstes argumentos foram omitidos.",
        "post-expand-template-argument-category": "Páginas com argumentos de predefinições descartados",
        "parser-template-loop-warning": "Ciclo de predefinições detetado: [[$1]]",
+       "template-loop-category": "Páginas com ciclos infinitos de predefinições",
+       "template-loop-category-desc": "Esta página contém um ciclo infinito de predefinições, isto é, uma predefinição que se chama a si própria recursivamente.",
        "parser-template-recursion-depth-warning": "Foi excedido o limite da profundidade de recursividade nas predefinições ($1)",
        "language-converter-depth-warning": "O limite de profundidade do conversor de idiomas excedeu a ($1)",
        "node-count-exceeded-category": "Páginas em que o total de nós é excedido",
        "page_first": "primeira",
        "page_last": "última",
        "histlegend": "Seleção de diferenças: use os botões de opção para marcar as versões que deseja comparar.\nPressione 'Enter' ou clique o botão \"{{int:compareselectedversions}}\".<br />\nLegenda: '''({{int:cur}})''' = diferenças para a versão atual,\n'''({{int:last}})''' = diferenças para a versão anterior,\n'''{{int:minoreditletter}}''' = edição menor",
-       "history-fieldset-title": "Navegar pelo histórico",
-       "history-show-deleted": "Somente eliminadas",
+       "history-fieldset-title": "Pesquisar revisões",
+       "history-show-deleted": "Somente revisões eliminadas",
        "histfirst": "Mais antigas",
        "histlast": "Mais novas",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "search-file-match": "(coincide com o conteúdo do ficheiro)",
        "search-suggest": "Será que quis dizer: $1",
        "search-rewritten": "A mostrar resultados para $1. Pesquise antes por $2.",
-       "search-interwiki-caption": "Projetos irmãos",
+       "search-interwiki-caption": "Resultados de projetos irmãos",
        "search-interwiki-default": "Resultados de $1:",
        "search-interwiki-more": "(mais)",
        "search-interwiki-more-results": "mais resultados",
        "prefs-help-prefershttps": "Esta preferência terá efeito no seu próximo início de sessão.",
        "prefswarning-warning": "Fez alterações às suas preferências que não foram gravadas ainda.\nSe abandonar esta página sem clicar em \"$1\", as suas preferências não serão atualizadas.",
        "prefs-tabs-navigation-hint": "Dica: Pode usar as setas direita e esquerda do teclado para navegar entre os separadores.",
-       "userrights": "Gestão de privilégios {{GENDER:{{BASEPAGENAME}}|do utilizador|da utilizadora|de utilizador(a)}}",
+       "userrights": "Privilégios de utilizador",
        "userrights-lookup-user": "Selecionar um utilizador",
        "userrights-user-editname": "Introduza um nome de utilizador(a):",
        "editusergroup": "Carregar 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:",
-       "userrights-groups-help": "É possível alterar os grupos a que {{GENDER:$1|este utilizador|esta utilizadora}} pertence:\n* Uma caixa de seleção marcada significa que {{GENDER:$1|o utilizador|a utilizadora}} se encontra no grupo.\n* Uma caixa de seleção desmarcada significa que {{GENDER:$1|o utilizador|a utilizadora}} não se encontra no grupo.\n* Um asterisco (*) indica que não pode remover o grupo depois de o adicionar, ou vice-versa.\n* Um símbolo de cardinal (#) indica que só pode atrasar a data de expiração deste grupo; não a pode adiantar.",
+       "userrights-groups-help": "É possível alterar os grupos a que {{GENDER:$1|este utilizador|esta utilizadora}} pertence:\n* Uma caixa de seleção marcada significa que {{GENDER:$1|o utilizador|a utilizadora}} se encontra no grupo.\n* Uma caixa de seleção desmarcada significa que {{GENDER:$1|o utilizador|a utilizadora}} não se encontra no grupo.\n* Um asterisco (*) indica que não pode remover o grupo depois de o adicionar, ou vice-versa.\n* Um símbolo de cardinal (#) indica que só pode atrasar a data de expiração da associação a este grupo; não a pode adiantar.",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Não tem permissões para alterar os privilégios de utilizadores noutras wikis.",
        "userrights-nodatabase": "A base de dados $1 não existe ou não é uma base de dados local.",
        "userrights-expiry-options": "1 dia:1 day,1 semana:1 week,1 mês:1 month,3 meses:3 months,6 meses:6 months,1 ano:1 year",
        "userrights-invalid-expiry": "O prazo de expiração para o grupo \"$1\" é inválido.",
        "userrights-expiry-in-past": "O prazo de expiração para o grupo \"$1\" está no passado.",
-       "userrights-cannot-shorten-expiry": "Não pode adiantar a data de expiração do grupo \"$1\". Só os utilizadores com permissões para adicionar e remover este grupo podem adiantar datas de expiração.",
+       "userrights-cannot-shorten-expiry": "Não pode adiantar a data de expiração da associação ao grupo \"$1\". Só os utilizadores com permissões para adicionar e remover este grupo podem adiantar datas de expiração.",
        "userrights-conflict": "Conflito entre alterações de privilégios de utilizador! Por favor, reveja e confirme as suas mudanças.",
        "group": "Grupo:",
        "group-user": "Utilizadores",
        "right-editsemiprotected": "Editar páginas protegidas com \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Editar o modelo de conteúdo de uma página",
        "right-editinterface": "Editar a interface de utilizador",
-       "right-editusercssjs": "Editar os ficheiros CSS e JS de outros utilizadores",
        "right-editusercss": "Editar os ficheiros CSS de outros utilizadores",
        "right-edituserjs": "Editar os ficheiros JS de outros utilizadores",
        "right-editmyusercss": "Editar os seus próprios ficheiros CSS de utilizador",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Mostrar",
        "rcfilters-activefilters": "Filtros ativos",
+       "rcfilters-quickfilters": "Links rápidos",
+       "rcfilters-quickfilters-placeholder-title": "Ainda não foi gravado nenhum link",
+       "rcfilters-quickfilters-placeholder-description": "Para gravar as suas configurações dos filtros e reutilizá-las mais tarde, clique o ícone do marcador de página, na área Filtro Ativo abaixo.",
+       "rcfilters-savedqueries-defaultlabel": "Filtros gravados",
+       "rcfilters-savedqueries-rename": "Alterar o nome",
+       "rcfilters-savedqueries-setdefault": "Ativar por padrão",
+       "rcfilters-savedqueries-unsetdefault": "Remover por padrão",
+       "rcfilters-savedqueries-remove": "Remover",
+       "rcfilters-savedqueries-new-name-label": "Nome",
+       "rcfilters-savedqueries-apply-label": "Criar link rápido",
+       "rcfilters-savedqueries-cancel-label": "Cancelar",
+       "rcfilters-savedqueries-add-new-title": "Gravar filtros como um link rápido",
        "rcfilters-restore-default-filters": "Restaurar os filtros padrão",
        "rcfilters-clear-all-filters": "Limpar todos os filtros",
        "rcfilters-search-placeholder": "Filtrar mudanças recentes (navegue ou começe a escrever)",
        "rcfilters-invalid-filter": "Filtro inválido",
        "rcfilters-empty-filter": "Não há filtros ativos. São mostradas todas as contribuições.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "O que é isto?",
+       "rcfilters-filterlist-feedbacklink": "Dê-nos a sua opinião sobre os novos filtros (beta)",
+       "rcfilters-highlightbutton-title": "Realçar resultados",
+       "rcfilters-highlightmenu-title": "Selecionar uma cor",
+       "rcfilters-highlightmenu-help": "Selecione uma cor para realçar esta propriedade",
        "rcfilters-filterlist-noresults": "Não foram encontrados filtros",
+       "rcfilters-noresults-conflict": "Não foram encontrados resultados porque os critérios de pesquisa estão em conflito",
+       "rcfilters-state-message-subset": "Este filtro não produz efeito porque os seus resultados já estão incluídos nos {{PLURAL:$2|do seguinte filtro mais abrangente|dos seguintes filtros mais abrangentes}} (tente usar o realce para diferenciá-lo): $1",
+       "rcfilters-state-message-fullcoverage": "Selecionar todos os filtros de um grupo é o mesmo que não selecionar nenhum, portanto este filtro não produz efeito. O grupo inclui: $1",
        "rcfilters-filtergroup-registration": "Registo de utilizador",
        "rcfilters-filter-registered-label": "Registado",
        "rcfilters-filter-registered-description": "Editores autenticados.",
        "rcfilters-filter-unregistered-label": "Não registado",
        "rcfilters-filter-unregistered-description": " Editores que não estão autenticados.",
-       "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-filter-unregistered-conflicts-user-experience-level": "Este filtro entra em conflito com {{PLURAL:$2|o seguinte filtro|os seguintes filtros}} de Experiência, que só {{PLURAL:$2|encontra|encontram}} utilizadores registados: $1",
+       "rcfilters-filtergroup-authorship": "Autoria da contribuição",
+       "rcfilters-filter-editsbyself-label": "Modificações feitas por si",
+       "rcfilters-filter-editsbyself-description": "As suas edições.",
+       "rcfilters-filter-editsbyother-label": "Modificações de outros",
+       "rcfilters-filter-editsbyother-description": "Todas as modificações, exceto as suas.",
        "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.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Os filtros de Experiência só encontram utilizadores registados, portanto este filtro entra em conflito com o filtro “Não registado”.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "O filtro \"Não registado\" entra em conflito com um ou mais filtros de Experiência, que só encontram utilizadores registados. Os filtros em conflito estão marcados na área Filtros Ativos, acima.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novatos",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Menos de 10 edições e 4 dias de atividade.",
+       "rcfilters-filter-user-experience-level-learner-label": "Aprendizes",
+       "rcfilters-filter-user-experience-level-learner-description": "Mais experiência do que \"Novatos\", mas menos do que \"Utilizadores experientes\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Utilizadores experientes",
+       "rcfilters-filter-user-experience-level-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 efectuadas por ferramentas automatizadas.",
        "rcfilters-filter-humans-label": "Ser humano (não robô)",
        "rcfilters-filter-humans-description": "Edições efectuadas por editores humanos.",
+       "rcfilters-filtergroup-reviewstatus": "Estado da revisão",
+       "rcfilters-filter-patrolled-label": "Patrulhadas",
+       "rcfilters-filter-patrolled-description": "Edições marcadas como patrulhadas.",
+       "rcfilters-filter-unpatrolled-label": "Não patrulhadas",
+       "rcfilters-filter-unpatrolled-description": "Edições não marcadas como patrulhadas.",
        "rcfilters-filtergroup-significance": "Significado",
        "rcfilters-filter-minor-label": "Edições menores",
        "rcfilters-filter-minor-description": "Edições marcadas pelo autor como menores.",
        "rcfilters-filter-major-label": "Edições não-menores",
        "rcfilters-filter-major-description": "Edições não marcadas como menores.",
+       "rcfilters-filtergroup-watchlist": "Páginas vigiadas",
+       "rcfilters-filter-watchlist-watched-label": "Nas páginas vigiadas",
+       "rcfilters-filter-watchlist-watched-description": "Modificações de páginas vigiadas.",
+       "rcfilters-filter-watchlist-watchednew-label": "Modificações novas de páginas vigiadas",
+       "rcfilters-filter-watchlist-watchednew-description": "Modificações de páginas vigiadas que ainda não visitou depois de serem modificadas.",
+       "rcfilters-filter-watchlist-notwatched-label": "Ausente da lista de páginas vigiadas",
+       "rcfilters-filter-watchlist-notwatched-description": "Tudo menos modificações das suas páginas vigiadas.",
        "rcfilters-filtergroup-changetype": "Tipo de alteração",
        "rcfilters-filter-pageedits-label": "Edições da página",
        "rcfilters-filter-pageedits-description": "Edições do conteúdo da wiki, de discussões, de descrições de categorias....",
        "rcfilters-filter-categorization-description": "Registos de páginas que estão a ser adicionadas ou removidas das categorias.",
        "rcfilters-filter-logactions-label": "Ações registadas",
        "rcfilters-filter-logactions-description": "Ações administrativas, criação de contas, eliminação de páginas, carregamentos....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "O filtro \"Edições menores\" entra em conflito com um ou mais filtros de Tipo de Modificação, porque certos tipos de modificações não podem ser classificados como \"menores\". Os filtros em conflito estão marcados na área Filtros Ativos, acima.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Certos tipos de modificações não podem ser classificados como \"menores\", portanto este filtro entra em conflito com os seguintes filtros de Tipo de Modificação: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Este filtro de Tipo de Modificação entra em conflito com o filtro \"Edições menores\". Certos tipos de modificações não podem ser classificados como \"menores\".",
+       "rcfilters-filtergroup-lastRevision": "Última revisão",
+       "rcfilters-filter-lastrevision-label": "Última revisão",
+       "rcfilters-filter-lastrevision-description": "A modificação mais recente de uma página.",
+       "rcfilters-filter-previousrevision-label": "Revisões anteriores",
+       "rcfilters-filter-previousrevision-description": "Todas as modificações que não sejam a modificação mais recente de uma página.",
        "rcnotefrom": "Abaixo {{PLURAL:$5|está a mudança|estão as mudanças}} desde <strong>$2</strong> (mostradas até <strong>$1</strong>).",
+       "rclistfromreset": "Reiniciar a seleção da data",
        "rclistfrom": "Mostrar as novas mudanças a partir das $2 de $3",
        "rcshowhideminor": "$1 edições menores",
        "rcshowhideminor-show": "Mostrar",
        "rcshowhidecategorization": "$1 categorização de páginas",
        "rcshowhidecategorization-show": "Mostrar",
        "rcshowhidecategorization-hide": "Ocultar",
-       "rclinks": "Mostrar as últimas $1 mudanças nos últimos $2 dias<br />$3",
+       "rclinks": "Mostrar as últimas $1 mudanças nos últimos $2 dias",
        "diff": "dif",
        "hist": "his",
        "hide": "Ocultar",
        "php-uploaddisabledtext": "O carregamento de ficheiros está desativado no PHP.\nVerifique a configuração file_uploads, por favor.",
        "uploadscripted": "Este ficheiro contém HTML ou código que pode ser erradamente interpretado por um navegador.",
        "upload-scripted-pi-callback": "Não é possível carregar ficheiros que contenham instruções de processamento de páginas de estilo XML.",
+       "upload-scripted-dtd": "Não é possível carregar ficheiros SVG que contêm uma declaração DTD não padronizada.",
        "uploaded-script-svg": "Encontrou um elemento scriptable no ficheiro \"$1\" SVG carregado.",
        "uploaded-hostile-svg": "Encontrou-se um código CSS não seguro no elemento de estilo do ficheiro SVG carregado.",
-       "uploaded-event-handler-on-svg": "Não Ã¡ permitido configurar atributos controladores de eventos <code>$1=\"$2\"</code> nos ficheiros SVG.",
+       "uploaded-event-handler-on-svg": "Não Ã© permitido configurar atributos controladores de eventos <code>$1=\"$2\"</code> nos ficheiros SVG.",
        "uploaded-href-attribute-svg": "Os atributos <code>href</code> em ficheiros SVG só estão autorizados a ligar a endereços http:// ou https://, mas foi encontrado <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "Detetado <code>href</code> para dados inseguros: alvo URI <code>&lt;$1 $2=\"$3\"&gt;</code> no ficheiro SVG carregado.",
        "uploaded-animate-svg": "Foi detetado um elemento \"animate\" que pode estar a alterar <code>href</code>, usando o atributo \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> no ficheiro SVG carregado.",
        "apisandbox-multivalue-all-namespaces": "$1 (Todos os espaços nominais)",
        "apisandbox-multivalue-all-values": "$1 (Todos os valores)",
        "booksources": "Fontes bibliográficas",
-       "booksources-search-legend": "Pesquisar referências bibliográficas",
+       "booksources-search-legend": "Pesquisar fontes de livros",
        "booksources-search": "Pesquisar",
        "booksources-text": "É apresentada abaixo uma lista de ligações para outros sítios na Internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique a existência de erros ao copiar da fonte original.",
        "enotif_body_intro_moved": "A página $1 da wiki {{SITENAME}} foi movida a $PAGEEDITDATE {{GENDER:$2|pelo utilizador|pela utilizadora}} $2. Veja a revisão atual em $3.",
        "enotif_body_intro_restored": "A página $1 da wiki {{SITENAME}} foi restaurada a $PAGEEDITDATE {{GENDER:$2|pelo utilizador|pela utilizadora}} $2. Veja a revisão atual em $3.",
        "enotif_body_intro_changed": "A página $1 da wiki {{SITENAME}} foi alterada a  $PAGEEDITDATE {{GENDER:$2|pelo utilizador|pela utilizadora}} $2. Veja a revisão atual em $3.",
-       "enotif_lastvisited": "Consulte $1 para todas as alterações efetuadas desde a sua última visita.",
-       "enotif_lastdiff": "Consulte $1 para ver esta alteração.",
+       "enotif_lastvisited": "Para ver todas as alterações efetuadas desde a sua última visita, consulte $1",
+       "enotif_lastdiff": "Para ver esta alteração, consulte $1",
        "enotif_anon_editor": "utilizador anónimo $1",
        "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumo da edição: $PAGESUMMARY $PAGEMINOREDIT\n\nContacte o editor:\ncorreio eletrónico: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté se autenticar e visitar novamente esta página, não receberá mais notificações das alterações futuras. Também pode reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da wiki {{SITENAME}}\n\n--\nPara alterar as suas preferências de notificação por correio eletrónico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n$HELPPAGE",
        "created": "criada",
        "editcomment": "O resumo da edição era: <em$1</em>.",
        "revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última revisão de [[User:$1|$1]]",
        "revertpage-nouser": "Foram revertidas as edições de um utilizador 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": "Foram revertidas as edições de {{GENDER:$3|$1}}; reposta a última edição de {{GENDER:$4|$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 detectados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a interceptação de sessões.\nVolte à página anterior, recarregue-a e tente novamente.",
        "undeleteviewlink": "ver",
        "undeleteinvert": "Inverter seleção",
        "undeletecomment": "Motivo:",
-       "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|ficheiro restaurado|ficheiros restaurados}}",
-       "undeletedfiles": "{{PLURAL:$1|ficheiro restaurado|$1 ficheiros restaurados}}",
        "cannotundelete": "Algumas ou todas as restaurações falharam:\n$1",
        "undeletedpage": "'''$1 foi restaurada'''\n\nConsulte o [[Special:Log/delete|registo de eliminações]] para um registo das eliminações e restaurações mais recentes.",
        "undelete-header": "Consulte o [[Special:Log/delete|registo de eliminações]] para ver as páginas eliminadas recentemente.",
        "sp-contributions-uploads": "carregamentos",
        "sp-contributions-logs": "registos",
        "sp-contributions-talk": "discussão",
-       "sp-contributions-userrights": "gestão de privilégios do utilizador",
+       "sp-contributions-userrights": "Gestão de privilégios {{GENDER:$1|do utilizador|da utilizadora}}",
        "sp-contributions-blocked-notice": "Este utilizador está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-search": "Pesquisar contribuições",
        "unblocked-id": "O bloqueio de $1 foi removido com sucesso",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] foi desbloqueado.",
        "blocklist": "Utilizadores bloqueados",
+       "autoblocklist": "Bloqueios automáticos",
+       "autoblocklist-submit": "Pesquisar",
+       "autoblocklist-legend": "Lista de bloqueios automáticos",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Bloqueio automático local|Bloqueios automáticos locais}}",
+       "autoblocklist-empty": "A lista de bloqueio automático está vazia.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Outro bloqueio automático|Outros bloqueios automáticos}}",
        "ipblocklist": "Utilizadores bloqueados",
        "ipblocklist-legend": "Procurar um utilizador bloqueado",
        "blocklist-userblocks": "Ocultar bloqueios de contas",
        "tooltip-pt-mycontris": "Lista das {{GENDER:|suas}} contribuições",
        "tooltip-pt-anoncontribs": "Uma lista de edições feitas a partir deste endereço IP",
        "tooltip-pt-login": "É encorajado que inicie sessão, apesar de não ser obrigatório.",
+       "tooltip-pt-login-private": "Para usar esta wiki tem de se autenticar",
        "tooltip-pt-logout": "Sair da conta",
        "tooltip-pt-createaccount": "É encorajado a criar uma conta e iniciar sessão; no entanto, não é obrigatório",
        "tooltip-ca-talk": "Discussão sobre o conteúdo da página",
        "anonymous": "{{PLURAL:$1|Utilizador anónimo|Utilizadores anónimos}} da wiki {{SITENAME}}",
        "siteuser": "$1 da wiki {{SITENAME}}",
        "anonuser": "utilizador anónimo $1 da wiki {{SITENAME}}",
-       "lastmodifiedatby": "Esta página foi modificada pela última vez à(s) $2 de $1 por $3.",
+       "lastmodifiedatby": "Esta página foi editada pela última vez à(s) $2 de $1 por $3.",
        "othercontribs": "Baseado no trabalho de $1.",
        "others": "outros",
        "siteusers": "{{PLURAL:$2|um utilizador|$2 utilizadores}} da wiki {{SITENAME}} ($1)",
        "newimages-summary": "Esta página especial mostra os ficheiros mais recentemente enviados.",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de ficheiro (ou parte dele):",
+       "newimages-user": "Endereço IP ou nome do utilizador",
        "newimages-showbots": "Mostrar carregamentos feitos por robôs",
        "newimages-hidepatrolled": "Ocultar carregamentos patrulhados",
        "noimages": "Nada para ver.",
        "confirmrecreate": "Depois de ter começado a editar esta página, {{GENDER:$1|o utilizador|a utilizadora|o(a) utilizador(a)}} [[User:$1|$1]] ([[User talk:$1|discussão]]) eliminou-a pelo seguinte motivo:\n: <em>$2</em>\nPor favor, confirme que quer realmente recriar esta página.",
        "confirmrecreate-noreason": "{{GENDER:$1|O utilizador|A utilizadora|O(a) utilizador(a)}} [[User:$1|$1]] ([[User talk:$1|discussão]]) eliminou esta página depois de ter começado a editá-la. Confirme que deseja recriar a página, por favor.",
        "recreate": "Recriar",
+       "confirm-purge-title": "Purgar esta página",
        "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.",
        "htmlform-user-not-valid": "<strong>$1</strong> não é um nome de utilizador 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-restore": "$1 {{GENDER:$2|restaurou}} a página $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|restaurou}} a página $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 revisão|$1 revisões}}",
+       "restore-count-files": "{{PLURAL:$1|1 ficheiro|$1 ficheiros}}",
        "logentry-delete-event": "$1 alterou a visibilidade de {{PLURAL:$5|uma entrada|$5 entradas}} em $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|alterou}} a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} em $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|alterou}} a visibilidade de entradas de registo em $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|atualizou}} as etiquetas na revisão $4 da página $3 ($6 {{PLURAL:$7|adicionadas}}; $8 {{PLURAL:$9|removidas}})",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|atualizou}} as etiquetas na entrada de registo $5 da página $3 ($6 {{PLURAL:$7|adicionadas}}; $8 {{PLURAL:$9|removidas}})",
        "rightsnone": "(nenhum)",
-       "revdelete-summary": "editar resumo",
        "rightslogentry-temporary-group": "$1 (temporário, até $2)",
        "feedback-adding": "A acrescentar os comentários à página...",
        "feedback-back": "Retroceder",
        "special-characters-group-thai": "Tailandês",
        "special-characters-group-lao": "Laociano",
        "special-characters-group-khmer": "Cambojano",
+       "special-characters-group-canadianaboriginal": "Aborígene Canadense",
        "special-characters-title-endash": "hífen",
        "special-characters-title-emdash": "travessão",
        "special-characters-title-minus": "sinal de subtração",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Adicionar uma categoria...",
        "mw-widgets-usersmultiselect-placeholder": "Adicionar mais...",
+       "date-range-from": "Da data:",
+       "date-range-to": "Até à data:",
        "sessionmanager-tie": "Não se pode combinar múltiplas solicitações de tipos de autenticação: $1.",
        "sessionprovider-generic": "Sessões $1",
-       "sessionprovider-mediawiki-session-cookiesessionprovider": "sessões baseadas em cookie",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "sessões baseadas em cookies",
        "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:",
        "restrictionsfield-label": "Gamas de endereços IP permitidas:",
        "restrictionsfield-help": "Um endereço IP ou uma gama CIDR por linha. Para ativar todos,\nuse: <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisão $1",
-       "pageid": "identificador de página $1"
+       "pageid": "identificador de página $1",
+       "rawhtml-notallowed": "As etiquetas &lt;html&gt; não podem ser utilizadas fora de páginas normais.",
+       "gotointerwiki": "A sair de {{SITENAME}}",
+       "gotointerwiki-invalid": "O título especificado é inválido.",
+       "gotointerwiki-external": "Está prestes a sair da wiki {{SITENAME}} para visitar [[$2]], que é um site externo.\n\n'''[$1 Continuar para $1]'''",
+       "undelete-cantedit": "Não pode restaurar esta página, porque não tem privilégios para editar esta página.",
+       "undelete-cantcreate": "Não pode restaurar esta página, porque não existe nenhuma página com este nome e não tem privilégios para criar esta página."
 }
index 7665f80..3c9791e 100644 (file)
                        "Chaduvari",
                        "MarcoAurelio",
                        "Joao Xavier",
-                       "Winstonyin"
+                       "Winstonyin",
+                       "Jhertel",
+                       "Stryn"
                ]
        },
        "sidebar": "{{notranslate}}",
        "search": "{{doc-special|Search}}\nNoun. Text of menu section shown on every page of the wiki above the search form.\n\nSee also:\n* {{msg-mw|Search}}\n* {{msg-mw|Accesskey-search}}\n* {{msg-mw|Tooltip-search}}\n{{Identical|Search}}",
        "search-ignored-headings": "Headings that will be ignored by search. You can translate the text, including \"Leave this line exactly as it is\". Some lines of this messages have one (1) leading space.",
        "searchbutton": "The button you can see in the sidebar, below the search input box. The \"Go\" button is {{msg-mw|Searcharticle}}.\n{{Identical|Search}}",
-       "go": "See also:\n* {{msg-mw|Go}}\n* {{msg-mw|Accesskey-search-go}}\n* {{msg-mw|Tooltip-search-go}}\n{{Identical|Go}}",
+       "go": "Appears next to the search button. Goes directly to the page with that name, if it exists.\n\nSee also:\n* {{msg-mw|Go}}\n* {{msg-mw|Accesskey-search-go}}\n* {{msg-mw|Tooltip-search-go}}\n{{Identical|Go}}",
        "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}}",
        "otherlanguages": "This message is shown under the toolbox. It is used if there are interwiki links added to the page, like <code><nowiki>[[</nowiki>en:Interwiki article]]</code>.\n{{Identical|Otherlanguages}}",
        "redirectedfrom": "The text displayed when a certain page is redirected to another page. Parameters:\n* $1 - the name of the page user came from",
        "redirectpagesub": "Displayed under the page title of a page which is a redirect to another page, see [{{fullurl:Project:Translators|redirect=no}} Project:Translators] for example.\n\n{{Identical|Redirect page}}",
-       "redirectto": "Alt text of the arrow icon shown on redirect pages ([[commons:File:Sample redirect page.jpg]]).\n\n{{Identical|Redirect to}}",
+       "redirectto": "Alt text of the arrow icon shown on redirect pages ([[commons:File:Sample redirect page.jpg]]).\n\n{{Identical|Redirect to}}\n\nOn Wikidata, this message is shown directly on redirect pages.\n\n\"Redirect\" is a noun, not a verb. That is, translate \"redirect\" as in \"This is a redirect to:\"",
        "talkpageheader": "{{notranslate}}",
        "lastmodifiedat": "This message is shown below each page, in the footer with the logos and links.\n\nParameters:\n* $1 - date\n* $2 - time\nSee also:\n* {{msg-mw|Lastmodifiedatby}}",
        "viewcount": "Used as page-view counter. Parameters:\n* $1 - number of pageviews",
        "databaseerror-query": "Identifies, in the list of technical details, the [[wikipedia:SQL|SQL]] statement that failed.\nParameters:\n* $1 - SQL statement (shown within a box)\n{{Identical|Query}}",
        "databaseerror-function": "Identifies, in the list of technical details, the function that tried to execute the database query.\nParameters:\n* $1 - Name of function\n{{Identical|Function}}",
        "databaseerror-error": "Identifies, in the list of technical details, the error message the database server returned.\nParameters:\n* $1 - Error message from the database server, probably in English\n{{Identical|Error}}",
-       "transaction-duration-limit-exceeded": "Plain text error shown when DB updates take too long. Parameters:\n* $1 - time spent in database updates\n* $2 - maximum time allowed in database updates",
+       "transaction-duration-limit-exceeded": "Plain text error shown when DB updates take too long. Parameters:\n* $1 - time spent in database updates\n* $2 - maximum number of seconds allowed in database updates",
        "laggedslavemode": "Used as warning when getting the timestamp of the latest version, if in LaggedSlaveMode.",
        "readonly": "Used as title of error message when database is locked.",
        "enterlockreason": "For developers when locking the database",
        "userlogin-yourpassword": "In login & create account forms, label for password field.\n\nSee examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Password}}",
        "userlogin-yourpassword-ph": "Placeholder text in login form for password field.\n\nSee examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Enter password}}",
        "createacct-yourpassword-ph": "Placeholder text in create account form for password field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Enter password}}",
-       "yourpasswordagain": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED",
+       "yourpasswordagain": "Label for field to re-enter password.",
        "createacct-yourpasswordagain": "In create account form, label for field to re-enter password\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Confirm password}}",
        "createacct-yourpasswordagain-ph": "Placeholder text in create account form for re-enter password field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "userlogin-remembermypassword": "The text for a check box in [[Special:UserLogin]].",
        "login-security": "Used as the title of the login page when the user is already logged in but sent to reauthenticate before getting access to a feature with elevated security.",
        "nav-login-createaccount": "Shown to anonymous users in the upper right corner of the page. When you can't create an account, the message {{msg-mw|login}} is shown.\n{{Identical|Log in / create account}}",
        "loginprompt": "{{ignored}}",
-       "userlogin": "Since 1.22 no longer used in core, but may still be used by extensions. DEPRECATED\n\n{{Identical|Log in / create account}}",
-       "userloginnocreate": "Since 1.22 no longer used in core, but may still be used by some extensions. A variant of {{msg-mw|Userlogin}} when the user is not allowed to create a new account. DEPRECATED\n\n{{Identical|Log in}}",
        "logout": "Used as link text in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Logout}}\n* {{msg-mw|Accesskey-pt-logout}}\n* {{msg-mw|Tooltip-pt-logout}}\n{{Identical|Log out}}",
        "userlogout": "{{doc-special|UserLogout|unlisted=1}}\n{{Identical|Log out}}",
        "userlogout-summary": "{{ignored}}",
        "notloggedin": "This message is displayed in the standard skin when not logged in. The message is placed above the login link in the top right corner of pages.\n\n{{Identical|Not logged in}}",
        "userlogin-noaccount": "In the [[Special:Userlogin]] form, this is the text prior to button inviting user to join project.\n{{Identical|Do not have an account}}",
        "userlogin-joinproject": "Text of button inviting user to create an account.\n\nSee example: [[Special:UserLogin]]",
-       "nologin": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED. Parameters:\n* $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}\n{{Identical|Do not have an account}}",
-       "nologinlink": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.\n{{Identical|Create account}}",
        "createaccount": "{{doc-special|CreateAccount|unlisted=1}}\n{{Identical|Create account}}",
-       "gotaccount": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED. Parameter:\n* $1 - a link to the log in form, and the text of it is {{msg-mw|Gotaccountlink}}",
-       "gotaccountlink": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.\n{{Identical|Log in}}",
-       "userlogin-resetlink": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.",
        "userlogin-resetpassword-link": "Used as link text in the login form.\n\nThe link points to the local page [[Special:PasswordReset]].\n\nSee example: [[Special:UserLogin]]\n\nuserlogin-resetpassword-link may have to be shorter than the old {{msg-mw|userlogin-resetlink}}.\n{{Identical|Forgot your password}}",
        "helplogin-url": "{{doc-important|Do not translate the namespace name <code>Help</code>.}}\nUsed as name of the page that provides information about logging into the wiki.\n\nUsed as a link target in the message {{msg-mw|Userlogin-helplink}}.",
        "userlogin-helplink2": "Label for a link to login help.\n\nSee example: [[Special:UserLogin]]\n\nSee also:\n* {{msg-mw|Helplogin-url}}",
        "createaccountmail": "The label for the checkbox for creating a new account and sending the new password to the specified email address directly, as used on [[Special:CreateAccount]] when one user creates an account for another (if creating accounts by email is allowed).\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "createaccountmail-help": "Account creation API help message for the <code>mailpassword</code> parameter.",
        "createacct-realname": "In vertical-layout create account form, label for field to enter optional real name.",
-       "createaccountreason": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED\n\n{{Identical|Reason}}",
        "createacct-reason": "In create account form, label for field to enter reason to create an account when already logged-in.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Reason}}",
        "createacct-reason-ph": "Placeholder in vertical-layout create account form for reason field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "createacct-reason-help": "Account creation API help message for the <code>reason</code> parameter.",
        "preview": "The title of the Preview page shown after clicking the \"Show preview\" button in the edit page. Since this is a heading, it should probably be translated as a noun and not as a verb.\n\n{{Identical|Preview}}",
        "showpreview": "The text of the button to preview the page you are editing. See also {{msg-mw|showdiff}} and {{msg-mw|savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}\n{{Identical|Show preview}}",
        "showdiff": "Button below the edit page. See also {{msg-mw|Showpreview}} and {{msg-mw|Savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}\n{{Identical|Show change}}",
-       "blankarticle": "Notice displayed once after the user tries to save an empty page.",
+       "blankarticle": "Notice displayed once after the user tries to save an empty page.\n\nParameters:\n* $1 – The label of the save button – one of {{msg-mw|savearticle}} or {{msg-mw|savechanges}} on save-labelled wiki, or {{msg-mw|publishpage}} or {{msg-mw|publishchanges}} on publish-labelled wikis.",
        "anoneditwarning": "Shown when editing a page anonymously.\n\nParameters:\n* $1 – A link to log in, <nowiki>{{fullurl:Special:UserLogin|returnto={{FULLPAGENAMEE}}}}</nowiki>\n* $2 – A link to sign up, <nowiki>{{fullurl:Special:CreateAccount|returnto={{FULLPAGENAMEE}}}}</nowiki>\n\nSee also:\n* {{msg-mw|Mobile-frontend-editor-anonwarning}}",
        "anonpreviewwarning": "See also:\n* {{msg-mw|Anoneditwarning}}",
-       "missingsummary": "The text \"edit summary\" is in {{msg-mw|Summary}}.\n\nSee also:\n* {{msg-mw|Missingcommentheader}}\n* {{msg-mw|Savearticle}}",
-       "selfredirect": "Notice displayed once after the user tries to create a redirect to the same article.",
+       "missingsummary": "The text \"edit summary\" is in {{msg-mw|Summary}}.\n\nSee also:\n* {{msg-mw|Missingcommentheader}}\n* {{msg-mw|Savearticle}}\n\nParameters:\n* $1 – The label of the save button – one of {{msg-mw|savearticle}} or {{msg-mw|savechanges}} on save-labelled wiki, or {{msg-mw|publishpage}} or {{msg-mw|publishchanges}} on publish-labelled wikis.",
+       "selfredirect": "Notice displayed once after the user tries to create a redirect to the same article.\n\nParameters:\n* $1 – The label of the save button – one of {{msg-mw|savearticle}} or {{msg-mw|savechanges}} on save-labelled wiki, or {{msg-mw|publishpage}} or {{msg-mw|publishchanges}} on publish-labelled wikis.",
        "missingcommenttext": "This message is shown, when the textbox by a new-section is empty.",
-       "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}}",
+       "missingcommentheader": "Edit summary that is shown if you enable \"Prompt me when entering a blank summary\" and add a new section without headline to a talk page.\n\nParameters:\n* $1 – The label of the save button – one of {{msg-mw|savearticle}} or {{msg-mw|savechanges}} on save-labelled wiki, or {{msg-mw|publishpage}} or {{msg-mw|publishchanges}} on publish-labelled wikis.\n\n\"Subject\" is {{msg-mw|subject}}.\n\nSee also:\n* {{msg-mw|Missingsummary}}\n* {{msg-mw|Savearticle}}",
        "summary-preview": "Preview of the edit summary, shown under the edit summary itself.\nShould match: {{msg-mw|summary}}.",
        "subject-preview": "Used as label for preview of the section title when adding a new section on a talk page.\n\nShould match {{msg-mw|subject}}.\n\nSee also:\n* {{msg-mw|Summary-preview}}\n\n{{Identical|Subject}}",
        "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.",
        "editingcomment": "This message displays at the top of the page when a user is creating a new section. Parameters:\n* $1 - page name\n{{Related|Editing}}",
        "editconflict": "Alert message when saving a page causes an edit conflict",
        "editnotice-notext": "{{ignored}}\nCustom message on top of the edit page if no edit notices apply to this page.",
-       "explainconflict": "Appears at the top of a page when there is an edit conflict.\n\nSee also:\n* {{msg-mw|Savearticle}}",
+       "explainconflict": "Appears at the top of a page when there is an edit conflict.\n\nParameters:\n* $1 – The label of the save button – one of {{msg-mw|savearticle}} or {{msg-mw|savechanges}} on save-labelled wiki, or {{msg-mw|publishpage}} or {{msg-mw|publishchanges}} on publish-labelled wikis.\n\nSee also:\n* {{msg-mw|Savearticle}}",
        "yourtext": "Used in Diff Preview page. The diff is between {{msg-mw|currentrev}} and {{msg-mw|yourtext}}.\n\nAlso used in Edit Conflict page; the diff between {{msg-mw|yourtext}} and {{msg-mw|storedversion}}.",
        "storedversion": "This is used in an edit conflict as the label for the top revision that has been stored, as opposed to your version {{msg-mw|yourtext}} that has not been stored which is shown at the bottom of the page.",
        "nonunicodebrowser": "Used as warning when editing page.",
        "post-expand-template-argument-warning": "Used as warning in parser limitation.\n\nSee also:\n* {{msg-mw|Post-expand-template-argument-category}}",
        "post-expand-template-argument-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain omitted template arguments.\n\nSee also:\n* {{msg-mw|Post-expand-template-argument-category-desc}}\n* {{msg-mw|Post-expand-template-argument-warning}}",
        "parser-template-loop-warning": "Parameters:\n* $1 - page title",
+       "template-loop-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with template loops will be listed.",
+       "template-loop-category-desc": "Pages with template loops category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Template-loop-category}}",
        "parser-template-recursion-depth-warning": "Parameters:\n* $1 - limit value of recursion depth",
        "language-converter-depth-warning": "Error message shown when a page uses too deeply nested language conversion syntax. Parameters:\n* $1 - the value of the depth limit",
        "node-count-exceeded-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the node-count of the preprocessor exceeds the limit.\n\nSee also:\n* {{msg-mw|Node-count-exceeded-warning}}",
        "previousrevision": "See also:\n* {{msg-mw|Nextrevision}}",
        "nextrevision": "See also:\n* {{msg-mw|Previousrevision}}",
        "currentrevisionlink": "{{Identical|Current revision}}",
-       "cur": "Link in page history ([https://translatewiki.net/w/i.php?title=MediaWiki:Cur/qqq&action=history example])",
+       "cur": "Link in page history ([https://translatewiki.net/w/i.php?title=MediaWiki:Cur/qqq&action=history example]).\n\nThis is short for \"current\".",
        "next": "Link in page history\n\n{{Identical|Next}}",
        "last": "Link in page history",
        "page_first": "This is part of the navigation message on the top and bottom of Special pages which are lists of things in alphabetical order, e.g. the '[[Special:Categories|Categories]]' special page. It is followed by the message {{msg-mw|Viewprevnext}}.\n{{Identical|First}}",
        "shown-title": "Parameters:\n* $1 - number of search results",
        "viewprevnext": "This is part of the navigation message on the top and bottom of Special pages which are lists of things, e.g. the User's contributions page (in date order) or the list of all categories (in alphabetical order). ($1) and ($2) are either {{msg-mw|Pager-older-n}} and {{msg-mw|Pager-newer-n}} (for date order) or {{msg-mw|Prevn}} and {{msg-mw|Nextn}} (for alphabetical order).\n\nIt is also used by [[Special:WhatLinksHere|Whatlinkshere]] pages, where ($1) and ($2) are {{msg-mw|Whatlinkshere-prev}} and {{msg-mw|Whatlinkshere-next}}.\n($3) is made up in all cases of the various proposed numbers of results per page, e.g. \"(20 | 50 | 100 | 250 | 500)\".\nFor Special pages, the navigation bar is prefixed by \"({{msg-mw|Page first}} | {{msg-mw|Page last}})\" (alphabetical order) or \"({{msg-mw|Histfirst}} | {{msg-mw|Histlast}})\" (date order).\n\nViewprevnext is sometimes preceded by the {{msg-mw|Showingresults}} or {{msg-mw|Showingresultsnum}} message (for Special pages) or by the {{msg-mw|Linkshere}} message (for Whatlinkshere pages).\n\nRefers to {{msg-mw|Pipe-separator}}.",
        "searchmenu-exists": "An option shown in a menu beside search form offering a link to the existing page having the specified title (when using the default MediaWiki search engine).\n\nParameters:\n* $1 - page title\n* $2 - the number of search results found",
-       "searchmenu-new": "An option shown in a menu beside search form offering a red link to the not yet existing page having the specified title (when using the default MediaWiki search engine).\nParameters:\n* $1 - page title\n* $2 - the number of search results found\nParameterless gender ({{GENDER:|male|female|unspecified}}) can be used in translations.",
+       "searchmenu-new": "An option shown in a menu beside search form offering a red link to the not yet existing page having the specified title (when using the default MediaWiki search engine).\nParameters:\n* $1 - page title\n* $2 - the number of search results found\nParameterless gender (<code><nowiki>{{GENDER:|male|female|unspecified}}</nowiki></code>) can be used in translations.",
        "searchmenu-new-nocreate": "{{notranslate}}",
        "searchprofile-articles": "A quick link in the advanced search box on [[Special:Search]]. Clicking on this link starts a search in the content pages of the wiki.\n\nA 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\n{{Identical|Content page}}",
        "searchprofile-images": "An option in the [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-images|message}}\n* {{msg-mw|Searchprofile-images-tooltip|tooltip}}\n{{Identical|Muitimedia}}",
        "prefsnologintext2": "Showed on Special:Userlogin when user tries to access their preferences before logging in",
        "prefs-skin": "Used in user preferences.\n{{Identical|Skin}}",
        "skin-preview": "{{doc-actionlink}}\nThe link beside each skin name in [[Special:Preferences|your user preferences]], tab \"skin\".\n{{Identical|Preview}}",
-       "datedefault": "Used as checkbox label in [[Special:Preferences#mw-prefsection-datetime|user preferences]], {{msg-mw|prefs-datetime}} tab.\n\nThis message indicates {{msg-mw|prefs-dateformat}} is default (= not specified).",
+       "datedefault": "Used as checkbox label in [[Special:Preferences#mw-prefsection-rendering|user preferences]], {{msg-mw|prefs-rendering}} tab.\n\nThis message indicates {{msg-mw|prefs-dateformat}} is default (= not specified).",
        "prefs-labs": "Header of a subsection at [[Special:Preferences]], tab ''{{int:prefs-editing}}'', listing features that are experimental",
        "prefs-user-pages": "Header of a subsection at [[Special:Preferences]], tab ''{{int:prefs-misc}}'', listing features that are related to user pages\n{{Identical|User page}}",
        "prefs-personal": "Title of a tab in [[Special:Preferences]].\n{{Identical|User profile}}",
        "prefs-info": "Header for the box giving basic information on the user account, displayed on the 'user profile' tab of the [[Special:Preferences|user preferences]] special page.\n{{Identical|Basic information}}",
        "prefs-i18n": "Field set legend for user preferences regarding the interface language",
        "prefs-signature": "{{Identical|Signature}}",
-       "prefs-dateformat": "Used in [[Special:Preferences#mw-prefsection-datetime|Special:Preferences]], tab \"Date and time\".\n{{Identical|Date format}}",
+       "prefs-dateformat": "Used in [[Special:Preferences#mw-prefsection-datetime|Special:Preferences]], tab \"Appearance\".\n{{Identical|Date format}}",
        "prefs-timeoffset": "Used in [[Special:Preferences]], tab \"Date and time\".",
        "prefs-advancedediting": "Used in [[Special:Preferences]], tab \"Editing\".\nThis used to say \"Advanced options\", the key name is a left over from that.",
        "prefs-editor": "Used in [[Special:Preferences]], tab \"Editing\" ({{int:prefs-editing}}).\n\n{{Identical|Editor}}",
        "userrights-groupsmember": "Used when editing user groups in [[Special:Userrights]].\n\nThe message is followed by a list of group names.\n\nParameters:\n* $1 - (Optional) the number of items in the list following the message, for PLURAL\n* $2 - (Optional) the user name, for GENDER",
        "userrights-groupsmember-auto": "Used when editing user groups in [[Special:Userrights]]. The message is followed by a list of group names.\n\n\"Implicit\" is for groups that the user was automatically added to (such as \"autoconfirmed\"); cf. {{msg-mw|userrights-groupsmember}}\n\nParameters:\n* $1 - (Optional) the number of items in the list following the message, for PLURAL\n* $2 - (Optional) the user name, for GENDER",
        "userrights-groupsmember-type": "{{optional}}\nParameters:\n* $1 - list of group names\n* $2 - list of group member names. Used with labels {{msg-mw|Userrights-groupsmember}} and {{msg-mw|Userrights-groupsmember-auto}}",
-       "userrights-groups-help": "Instructions displayed on [[Special:UserRights]]. Parameters:\n* $1 - (Optional) a username, can be used for GENDER",
+       "userrights-groups-help": "Instructions displayed on [[Special:UserRights]].  \"Bring forward\" is a phrasal verb meaning \"move to an earlier time\". \"Put back\" means the opposite. Parameters:\n* $1 - (Optional) a username, can be used for GENDER",
        "userrights-reason": "Text beside log field when editing user groups\n\n{{Identical|Reason}}",
        "userrights-no-interwiki": "Error message when editing user groups",
        "userrights-nodatabase": "Error message when editing user groups.\n\n\"Local\" means databases/wikis of the same farm/cluster; that is, meta, enwiki, dewiki, commons, etc are all local databases of the Wikimedia Foundation.\n\nSee [{{canonicalurl:meta:Special:Log|type=rights}} meta:Special:Log?type=rights] for a usage of local databases: username@barwiki\n\nParameters:\n* $1 - database name",
        "right-editsemiprotected": "{{doc-right|editsemiprotected}}\nRefers to {{msg-mw|Protect-level-autoconfirmed}}.\n\nSee also:\n* {{msg-mw|Right-editeditorprotected}}\n* {{msg-mw|Right-editextendedsemiprotected}}\n* {{msg-mw|Right-editprotected}}\n* {{msg-mw|Right-editsemiprotected}}",
        "right-editcontentmodel": "{{doc-right|editcontentmodel}}",
        "right-editinterface": "{{doc-right|editinterface}}",
-       "right-editusercssjs": "{{doc-right|editusercssjs}}",
        "right-editusercss": "{{doc-right|editusercss}}\nSee also:\n* {{msg-mw|Right-editmyusercss}}",
        "right-edituserjs": "{{doc-right|edituserjs}}\nSee also:\n* {{msg-mw|Right-editmyuserjs}}",
        "right-editmyusercss": "{{doc-right|editmyusercss}}\nSee also:\n* {{msg-mw|Right-editusercss}}",
        "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-quickfilters": "Label for the button that opens the quick filters menu in [[Special:RecentChanges]]",
+       "rcfilters-quickfilters-placeholder-title": "Title for the text shown in the quick filters menu on [[Special:RecentChanges]] if the user has not saved any quick filters.",
+       "rcfilters-quickfilters-placeholder-description": "Description for the text shown in the quick filters menu on [[Special:RecentChanges]] if the user has not saved any quick filters.",
+       "rcfilters-savedqueries-defaultlabel": "Default name for saving a new set of quick filters [[Special:RecentChanges]]",
+       "rcfilters-savedqueries-rename": "Label for the menu option that edits a quick filter in [[Special:RecentChanges]]\n{{Identical|Rename}}",
+       "rcfilters-savedqueries-setdefault": "Label for the menu option that sets a quick filter as default in [[Special:RecentChanges]]",
+       "rcfilters-savedqueries-unsetdefault": "Label for the menu option that unsets a quick filter as default in [[Special:RecentChanges]]",
+       "rcfilters-savedqueries-remove": "Label for the menu option that removes a quick filter as default in [[Special:RecentChanges]]\n{{Identical|Remove}}",
+       "rcfilters-savedqueries-new-name-label": "Label for the input that holds the name of the new saved filters in [[Special:RecentChanges]]\n{{Identical|Name}}",
+       "rcfilters-savedqueries-apply-label": "Label for the button to apply saving a new quick link in [[Special:RecentChanges]]",
+       "rcfilters-savedqueries-cancel-label": "Label for the button to cancel the saving of a new quick link in [[Special:RecentChanges]]\n{{Identical|Cancel}}",
+       "rcfilters-savedqueries-add-new-title": "Title for the popup to add new quick link in [[Special:RecentChanges]]",
        "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-whatsthis": "Caption for the link that opens a popup with explanations about this filter group.",
+       "rcfilters-filterlist-feedbacklink": "Caption for the link to the feedback page about the filters beta feature.",
        "rcfilters-highlightbutton-title": "Title for the highlight button used to toggle the highlight feature on and off.",
        "rcfilters-highlightmenu-title": "Title for the highlight menu used to select the highlight color for an individual filter.",
+       "rcfilters-highlightmenu-help": "Tooltip for the highlight menu for individual filters.",
        "rcfilters-filterlist-noresults": "Message showing no results found for searching a filter.",
+       "rcfilters-noresults-conflict": "A message displayed in the results area when no results found because there are filters in conflict with one another.",
+       "rcfilters-state-message-subset": "Tooltip shown when hovering over a filter tag when one or more broader filters that contain the hovered filter are also selected. This indicates that the hovered filter has no effect because all the results it matches are also matched by the broader filter(s).  Parameters:\n* $1 - Comma-separated string of selected broader filters that this filter is a subset of\n* $2 - Count of filters in $1, for PLURAL",
+       "rcfilters-state-message-fullcoverage": "Tooltip shown when hovering over a filter tag when all the filters in its group are selected. This indicates that the hovered filter has no effect because the selected filters in the group cover all changes. Parameters:\n* $1 - Comma-separated string of selected filters in the group\n* $2 - Count of filters in $1, for PLURAL",
        "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-filter-unregistered-description": "Description for the filter for showing edits made by logged-out users.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Tooltip shown when hovering over a Unregistered filter tag, when a User Experience Level filter is also selected.\n\n\"Unregistered\" is {{msg-mw|Rcfilters-filter-unregistered-label}}.\n\n\"Experience\" is based on {{msg-mw|Rcfilters-filtergroup-userExpLevel}}.\n\nThis indicates that no results will be shown, because users matched by the User Experience Level groups are never unregistered.  Parameters:\n* $1 - Comma-separated string of selected User Experience Level filters, e.g. \"Newcomer, Experienced\"\n* $2 - Count of selected User Experience Level filters, for PLURAL",
        "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-user-experience-level-conflicts-unregistered": "Tooltip shown when hovering over a User Experience Level filter tag, when only Unregistered users are being shown.  This indicates that no results will be shown, because users matched by the User Experience Level groups are never unregistered.\n\n\"Unregistered\" is {{msg-mw|Rcfilters-filter-unregistered-label}}.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Message shown in the result area when both a User Experience Level filter and the Unregistered filter are selected.  This indicates that no results will be shown because users selected by the User Experience Filter are never unregistered.\n\n\"Unregistered\" is {{msg-mw|Rcfilters-filter-unregistered-label}}.\n\n\"Experience\" is based on {{msg-mw|Rcfilters-filtergroup-userExpLevel}}.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Label for the filter for showing edits made by new editors.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Description for the filter for showing edits made by new editors.",
+       "rcfilters-filter-user-experience-level-learner-label": "Label for the filter for showing edits made by learning editors.",
+       "rcfilters-filter-user-experience-level-learner-description": "Description for the filter for showing edits made by learning editors.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Label for the filter for showing edits made by experienced editors.",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Title for the filter group about review status (in core this is whether it's been patrolled)",
+       "rcfilters-filter-patrolled-label": "Label for the filter for showing patrolled edits",
+       "rcfilters-filter-patrolled-description": "Label for the filter showing patrolled edits",
+       "rcfilters-filter-unpatrolled-label": "Label for the filter for showing unpatrolled edits",
+       "rcfilters-filter-unpatrolled-description": "Description for the filter for showing unpatrolled edits",
        "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-watchlist": "Title for the watchlist filter group",
+       "rcfilters-filter-watchlist-watched-label": "Label for the filter for showing changes to pages on your watchlist.",
+       "rcfilters-filter-watchlist-watched-description": "Description for the filter for showing changes to pages on your watchlist.",
+       "rcfilters-filter-watchlist-watchednew-label": "Label for the filter for showing new changes to pages on your watchlist.",
+       "rcfilters-filter-watchlist-watchednew-description": "Description for the filter for showing new changes to pages on your watchlist.",
+       "rcfilters-filter-watchlist-notwatched-label": "Label for the filter for showing changes to pages not on your watchlist.",
+       "rcfilters-filter-watchlist-notwatched-description": "Description for the filter for showing changes to pages not on your watchlist.",
        "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-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.",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "The \"Minor edits\" filter is conflicting with one or more Type of Change filters, because certain types of change cannot be designated as \"minor.\" The conflicting filters are marked in the Active Filters area, above.\n\n\"Type of Change\" is {{msg-mw|Rcfilters-filtergroup-changetype}}.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Tooltip shown when hovering over the Minor edits tag, when a Type of Change filter is also selected.\n\n\"Minor edits\" is {{msg-mw|rcfilters-filter-minor-label}}.\n\n\"Type of change\" is {{msg-mw|rcfilters-filtergroup-changetype}}.\n\nThis indicates that no results will be shown.  Parameters:\n* $1 - Comma-separated string of selected Type of Change filters, e.g. \"Category, Logged Actions\"\n* $2 - Count of selected User Experience Level filters, for PLURAL",
+       "rcfilters-typeofchange-conflicts-hideminor": "Tooltip shown when hovering over a Type of change filter tag, when the Minor edits filter is also selected.\n\n\"Minor edits\" is {{msg-mw|rcfilters-filter-minor-label}}.\n\n\"Type of change\" is {{msg-mw|rcfilters-filtergroup-changetype}}.\n\nThis indicates that no results will be shown.",
+       "rcfilters-filtergroup-lastRevision": "Title for the filter group for last revision",
+       "rcfilters-filter-lastrevision-label": "Title for the filter for showing changes on last revision of a page.",
+       "rcfilters-filter-lastrevision-description": "Description for the filter for showing changes on last revision of a page.",
+       "rcfilters-filter-previousrevision-label": "Title for the filter for showing changes on previous revisions of a page.",
+       "rcfilters-filter-previousrevision-description": "Description for the filter for showing changes on previous revisions of a page.",
        "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",
+       "rclistfromreset": "Used on [[Special:RecentChanges]] to reset a selection of a certain date range.",
        "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}}",
        "rcshowhideminor-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.\n\nSee also:\n* {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Show}}",
        "rcshowhidecategorization": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhidecategorization-show}} or {{msg-mw|rcshowhidecategorization-hide}}",
        "rcshowhidecategorization-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidecategorization}}.\n\nSee also:\n* {{msg-mw|rcshowhidecategorization-hide}}\n{{Identical|show}}",
        "rcshowhidecategorization-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidecategorization}}.\n\nSee also:\n* {{msg-mw|rcshowhidecategorization-show}}\n{{Identical|hide}}",
-       "rclinks": "Used on [[Special:RecentChanges]].\n* $1 - a list of different choices with number of pages to be shown.<br />&nbsp;Example: \"''50{{int:pipe-separator}}100{{int:pipe-separator}}250{{int:pipe-separator}}500\".\n* $2 - a list of clickable links with a number of days for which recent changes are to be displayed.<br />&nbsp;Example: \"''1{{int:pipe-separator}}3{{int:pipe-separator}}7{{int:pipe-separator}}14{{int:pipe-separator}}30''\".\n* $3 - a block of text that consists of other messages.<br />&nbsp;Example: \"''Hide minor edits{{int:pipe-separator}}Show bots{{int:pipe-separator}}Hide anonymous users{{int:pipe-separator}}Hide logged-in users{{int:pipe-separator}}Hide patrolled edits{{int:pipe-separator}}Hide my edits''\"\nList elements are separated by {{msg-mw|Pipe-separator}} each. Each list element is, or contains, a link.",
+       "rclinks": "Used on [[Special:RecentChanges]].\n* $1 - a list of different choices with number of pages to be shown.<br />&nbsp;Example: \"''50{{int:pipe-separator}}100{{int:pipe-separator}}250{{int:pipe-separator}}500\".\n* $2 - a list of clickable links with a number of days for which recent changes are to be displayed.<br />&nbsp;Example: \"''1{{int:pipe-separator}}3{{int:pipe-separator}}7{{int:pipe-separator}}14{{int:pipe-separator}}30''\".",
        "diff": "Short form of \"differences\". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...\n{{Identical|Diff}}",
        "hist": "Short form of \"history\". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...",
        "hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]], and in [[Special:WhatLinksHere]].\n\nSee also:\n* {{msg-mw|Show}}\n{{Identical|Hide}}",
        "show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]], and in [[Special:WhatLinksHere]].\n\nSee also:\n* {{msg-mw|Hide}}\n{{Identical|Show}}",
-       "minoreditletter": "Very short form of \"'''minor edit'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]], [[Special:Contributions]] and history pages.",
-       "newpageletter": "Very short form of \"'''new page'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]] and [[Special:Contributions]].",
-       "boteditletter": "Abbreviation of \"'''bot'''\". Appears in [[Special:RecentChanges]] and [[Special:Watchlist]].",
+       "minoreditletter": "Very short form of \"'''minor edit'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]], [[Special:Contributions]] and history pages. This should be a single letter.",
+       "newpageletter": "Very short form of \"'''new page'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]] and [[Special:Contributions]]. This should be a single letter.",
+       "boteditletter": "Abbreviation of \"'''bot'''\". Appears in [[Special:RecentChanges]] and [[Special:Watchlist]]. This should be a single letter.",
        "unpatrolledletter": "{{optional}}\n\nUsed in {{msg-mw|Recentchanges-label-legend}}, meaning \"unpatrolled\".",
        "number_of_watching_users_RCview": "{{notranslate}}\nParameters:\n* $1 - number of users who are watching",
        "number_of_watching_users_pageview": "Used if <code>$wgPageShowWatchingUsers</code> is true.\n* $1 - number of watching user(s)",
        "recentchangeslinked-feed": "Used in the feed object.\n\nThis message follows the message {{msg-mw|Recentchangeslinked-title}}.",
        "recentchangeslinked-toolbox": "Used as link text, and also used as link text in the common toolbox.\n\nThese links point to [[Special:RecentChangesLinked]].",
        "recentchangeslinked-title": "Message used as title and page header on [[Special:RecentChangesLinked]] (needs an argument like \"/Main Page\").\n\nRelated changes are all recent change to pages that are linked from ''this page''.\n\nThis message is followed by {{msg-mw|Recentchangeslinked-feed}}.\n\nParameters:\n* $1 - the name of the page for which related changes are shown",
-       "recentchangeslinked-summary": "Summary of [[Special:RecentChangesLinked]].",
+       "recentchangeslinked-summary": "Summary of [[Special:RecentChangesLinked]]. \"Pages on your watchlist\" refers to pages that ''also'' appear on the user's watchlist.",
        "recentchangeslinked-page": "{{Identical|Page name}}",
        "recentchangeslinked-to": "Checkbox in [[Special:RecentChangesLinked]].",
        "recentchanges-page-added-to-category": "Comment message for pages added to a category\n\nParameters:\n* $1 - name of the page being added",
        "php-uploaddisabledtext": "This means that file uploading is disabled in PHP, not upload of PHP-files.",
        "uploadscripted": "Used as error message when uploading a file.\n\nSee also:\n* {{msg-mw|zip-wrong-format}}\n* {{msg-mw|uploadjava}}\n* {{msg-mw|uploadvirus}}",
        "upload-scripted-pi-callback": "Used as error message when uploading an SVG file that contains xml-stylesheet processing instruction.",
+       "upload-scripted-dtd": "Used as an error message when uploading an svg file that contains a DTD declaration where the system identifier of the DTD is for something other than the standard SVG DTDS, or it is a SYSTEM DTD, or the public identifier does not start with -//W3C//. Note that errors related to the internal dtd subset do not use this error message.",
        "uploaded-script-svg": "Used as error message when uploading an SVG file that contains scriptable tags (script, handler, stylesheet, iframe).\n\nParameters:\n* $1 - The scriptable tag that blocked the SVG file from uploading.",
        "uploaded-hostile-svg": "Used as error message when uploading an SVG file that contains unsafe CSS.",
        "uploaded-event-handler-on-svg": "Used as error message when uploading an SVG file that contains event-handler attributes.\n\nParameters:\n* $1 - The event-handler attribute that is being modified in the SVG file.\n* $2 - The value that is given to the event-handler attribute.",
        "listfiles_search_for": "Input label for the form displayed on [[Special:ListFiles]].",
        "listfiles-userdoesnotexist": "This message is displayed on [[Special:ListFiles]] when a invalid username is entered.",
        "imgfile": "{{Identical|File}}",
-       "listfiles": "Page title and grouping label for the form displayed on [[Special:ListFiles]].\n{{Identical|File list}}",
+       "listfiles": "Page title and grouping label for the form displayed on [[Special:ListFiles]].\n{{Identical|List}}",
        "listfiles_thumb": "{{Identical|Thumbnail}}",
        "listfiles_date": "Column header for the result table displayed on [[Special:ListFiles]].\n{{Identical|Date}}",
        "listfiles_name": "Column header for the result table displayed on [[Special:ListFiles]].\n{{Identical|Name}}",
        "undeleteviewlink": "First part of {{msg-mw|undeletelink}}.\nDisplay name of link to view a deleted page used on [[Special:Log/delete]].\n{{Identical|View}}",
        "undeleteinvert": "{{Identical|Invert selection}}",
        "undeletecomment": "{{Identical|Reason}}",
-       "undeletedrevisions": "Used as reason in the log entry. Parameters:\n* $1 - number of revisions\nSee also:\n* {{msg-mw|Undeletedrevisions-files}}\n* {{msg-mw|Undeletedfiles}}",
-       "undeletedrevisions-files": "Used as reason in the log entry. Parameters:\n* $1 - number of revisions\n* $2 - number of files\nSee also:\n* {{msg-mw|Undeletedrevisions}}\n* {{msg-mw|Undeletedfiles}}",
-       "undeletedfiles": "Used as reason in the log entry. Parameters:\n* $1 - number of files\nSee also:\n* {{msg-mw|Undeletedrevisions-files}}\n* {{msg-mw|Undeletedrevisions}}",
        "cannotundelete": "Message shown when undeletion failed for some reason. Parameters:\n* $1 - the combined wikitext of messages for all errors that caused the failure",
        "undeletedpage": "Used as success message. Parameters:\n* $1 - page title, with link",
        "undelete-header": "Used in [[Special:Undelete]].",
        "sp-contributions-suppresslog": "Used as a display name for a link to log entries of suppressed edits made by that user.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]]. Parameters:\n* $1 is a plain text username used for GENDER.\nSee also {{msg-mw|sp-contributions-deleted}}, {{msg-mw|sp-deletedcontributions-contribs}}, {{msg-mw|contributions}}, {{msg-mw|deletedcontributions-title}}.",
        "sp-contributions-deleted": "This is a link anchor used in [[Special:Contributions]]/''name'', when user viewing the page has the right to delete pages, or to restore deleted pages.\n\nUsed as link title in [[Special:Contributions]]. Parameters:\n* $1 is a plain text username used for GENDER.\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-userrights}}",
        "sp-contributions-uploads": "Used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Upload}}",
-       "sp-contributions-logs": "Appears as an action link in the header of the Special:Contributions/''Username'' pages (e.g. \"For Somebody (talk | block log | logs)\").\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Log}}",
-       "sp-contributions-talk": "This is a link anchor used in the [[Special:Contributions]]/''usernamename'' pages.\nThe link appears in a list of similar ones separated by {{msg-mw|pipe-separator}}, e.g. like this:<br />\n( talk | block log | logs | deleted contributions | rights management )\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|change-blocklink}}\n* {{msg-mw|unblocklink}}\n* {{msg-mw|blocklink}}\n* {{msg-mw|sp-contributions-blocklog}}\n* {{msg-mw|sp-contributions-uploads}}\n* {{msg-mw|sp-contributions-logs}}\n* {{msg-mw|sp-contributions-deleted}}\n* {{msg-mw|sp-contributions-userrights}}\n{{Identical|Talk}}",
-       "sp-contributions-userrights": "This is a link anchor used in [[Special:Contributions]]/''name'', if the user viewing the page has the right to set or alter user rights.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}",
+       "sp-contributions-logs": "Appears as an action link in the header of the [[Special:Contributions]]/''username'' pages (e.g. \"For Somebody (talk | block log | logs)\").\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-deleted}}\n* {{msg-mw|Sp-contributions-userrights}}\n{{Identical|Log}}",
+       "sp-contributions-talk": "This is a link anchor used in the [[Special:Contributions]]/''username'' pages.\nThe link appears in a list of similar ones separated by {{msg-mw|pipe-separator}}, e.g. like this:<br />\n( talk | block log | logs | deleted contributions | rights management )\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].\n\nSee also:\n* {{msg-mw|change-blocklink}}\n* {{msg-mw|unblocklink}}\n* {{msg-mw|blocklink}}\n* {{msg-mw|sp-contributions-blocklog}}\n* {{msg-mw|sp-contributions-uploads}}\n* {{msg-mw|sp-contributions-logs}}\n* {{msg-mw|sp-contributions-deleted}}\n* {{msg-mw|sp-contributions-userrights}}\n{{Identical|Talk}}",
+       "sp-contributions-userrights": "This is a link anchor used in [[Special:Contributions]]/''username'' if the user viewing the page has the right to set or alter user rights.\n\nUsed as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]]. Parameters:\n* $1 is a plain text username used for GENDER.\nSee also:\n* {{msg-mw|Sp-contributions-talk}}\n* {{msg-mw|Change-blocklink}}\n* {{msg-mw|Unblocklink}}\n* {{msg-mw|Blocklink}}\n* {{msg-mw|Sp-contributions-blocklog}}\n* {{msg-mw|Sp-contributions-uploads}}\n* {{msg-mw|Sp-contributions-logs}}\n* {{msg-mw|Sp-contributions-deleted}}",
        "sp-contributions-blocked-notice": "Shown on top of contributions special page of currently blocked users.\n\nParameters:\n* $1 - (Optional) the blocked user. Can be used for GENDER\nAnon version:\n* {{msg-mw|Sp-contributions-blocked-notice-anon}}",
        "sp-contributions-blocked-notice-anon": "Same as {{msg-mw|Sp-contributions-blocked-notice}} but for anonymous users.",
        "sp-contributions-search": "Used on [[Special:Contributions]]",
        "nolinkshere": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Nolinkshere-ns}}",
        "nolinkshere-ns": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Nolinkshere}}",
        "isredirect": "Displayed in [[Special:WhatLinksHere]] (see [{{fullurl:Special:WhatLinksHere/Project:Translator|hidelinks=1}} Special:WhatLinksHere/Project:Translator] for example).\n\n{{Identical|Redirect page}}",
-       "istemplate": "Means that a page (a template, specifically) is used as <code><nowiki>{{Page name}}</nowiki></code>.\nDisplayed in [[Special:WhatLinksHere]] (see [[Special:WhatLinksHere/Template:New portal]] for example).\n{{Identical|Transclusion}}",
+       "istemplate": "Means that a page (a template, specifically) is used as <code><nowiki>{{Page name}}</nowiki></code>.\nDisplayed in [[Special:WhatLinksHere]] (see [[Special:WhatLinksHere/Template:New portal]] for example).\nIf you are not sure how to translate this term, think of something like \"inclusion\", \"embedding\", or \"insertion\".\n{{Identical|Transclusion}}",
        "isimage": "This message is displayed on [[Special:WhatLinksHere]] for images. It means that the image is used on the page (as opposed to just being linked to like an non-image page).\n{{Identical|File link}}",
        "whatlinkshere-prev": "This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the first argument of {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\nSpecial pages use {{msg-mw|Prevn}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\nSee also:\n* {{msg-mw|Whatlinkshere-next}}\n{{Identical|Previous}}",
        "whatlinkshere-next": "This is part of the navigation message on the top and bottom of Whatlinkshere pages, where it is used as the second argument of {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\nSpecial pages use {{msg-mw|Nextn}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\nSee also:\n* {{msg-mw|Whatlinkshere-prev}}\n{{Identical|Next}}",
        "unblocked-id": "Used in [[Special:Unblock]]. Parameters:\n* $1 - autoblock ID\nSee also:\n* {{msg-mw|Unblocked}}\n* {{msg-mw|Unblocked-range}}",
        "unblocked-ip": "{{doc-important|Do not translate the title \"Special:Contributions\".}}\nParameters:\n* $1 - the IP address that was unblocked\nSee also:\n* {{msg-mw|Unblocked-range}}\n* {{msg-mw|Unblocked-id}}\n*{{msg-mw|Unblocked}}",
        "blocklist": "{{doc-special|BlockList}}",
+       "autoblocklist": "Title of [[Special:AutoblockList]].",
+       "autoblocklist-submit": "Used as Submit button text in the form on [[Special:AutoblockList]].\n\nSee also:\n* {{msg-mw|Ipblocklist-legend}}\n* {{msg-mw|Autoblocklist-submit}}\n{{Identical|Search}}",
+       "autoblocklist-legend": "Used as legend of the form in [[Special:AutoblockList]].\n\nSee also:\n* {{msg-mw|Autoblocklist-legend}}\n* {{msg-mw|Autoblocklist-submit}}",
+       "autoblocklist-localblocks": "[[File:Special AutoBlockList new.png|thumb|Example]]\nUsed on [[Special:AutoblockList]] as header when global autoblocks exists too.",
+       "autoblocklist-empty": "Used in [[Special:AutoblockList]].",
+       "autoblocklist-otherblocks": "[[File:Special AutoBlockList new.png|thumb|Example]]\nUsed on [[Special:AutoblockList]] as header for other blocks, i.e. from GlobalBlocking or TorBlocks.\n\nParameters:\n* $1 - number of blocks",
        "ipblocklist": "Title of [[Special:Ipblocklist]].",
        "ipblocklist-legend": "Used as legend of the form in [[Special:BlockList]].\n\nSee also:\n* {{msg-mw|Ipblocklist-legend}}\n* {{msg-mw|Ipblocklist-submit}}",
        "blocklist-userblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
        "accesskey-pt-mycontris": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mycontris}}\n* {{msg-mw|Accesskey-pt-mycontris}}\n* {{msg-mw|Tooltip-pt-mycontris}}",
        "accesskey-pt-anoncontribs": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Anoncontribs}}\n* {{msg-mw|Tooltip-pt-anoncontribs}}",
        "accesskey-pt-login": "{{doc-accesskey}}",
+       "accesskey-pt-login-private": "{{doc-accesskey}}",
        "accesskey-pt-logout": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Logout}}\n* {{msg-mw|Accesskey-pt-logout}}\n* {{msg-mw|Tooltip-pt-logout}}",
        "accesskey-pt-createaccount": "{{doc-accesskey}}",
        "accesskey-ca-talk": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Talk}}\n* {{msg-mw|Accesskey-ca-talk}}\n* {{msg-mw|Tooltip-ca-talk}}",
        "tooltip-pt-mycontris": "Tooltip shown when hovering over the {{msg-mw|Mycontris}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Mycontris}}\n* {{msg-mw|Accesskey-pt-mycontris}}\n* {{msg-mw|Tooltip-pt-mycontris}}",
        "tooltip-pt-anoncontribs": "Tooltip shown when hovering over the {{msg-mw|Anoncontribs}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Anoncontribs}}\n* {{msg-mw|Accesskey-pt-anoncontribs}}",
        "tooltip-pt-login": "Tooltip shown when hovering over the link 'Log in' in the upper right corner show on all pages while not logged in.",
+       "tooltip-pt-login-private": "Tooltip shown when hovering over the link 'Log in' in the upper right corner show on all pages while not logged in, and wiki is private.",
        "tooltip-pt-logout": "Tooltip shown when hovering over the {{msg-mw|Logout}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Logout}}\n* {{msg-mw|Accesskey-pt-logout}}\n* {{msg-mw|Tooltip-pt-logout}}\n{{Identical|Log out}}",
        "tooltip-pt-createaccount": "Tooltip shown when hovering over the link 'Create account' in the upper right corner show on all pages while not logged in.",
        "tooltip-ca-talk": "Tooltip shown when hovering over the {{msg-mw|Talk}} tab.\n\nA 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For a technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\nSee also:\n* {{msg-mw|Talk}}\n* {{msg-mw|Accesskey-ca-talk}}\n* {{msg-mw|Tooltip-ca-talk}}\n{{Identical|Content page}}",
        "tooltip-t-whatlinkshere": "Tooltip shown when hovering over the {{msg-mw|whatlinkshere}} message in the toolbox.\n\nSee also:\n* {{msg-mw|Whatlinkshere}}\n* {{msg-mw|Accesskey-t-whatlinkshere}}\n* {{msg-mw|Tooltip-t-whatlinkshere}}",
        "tooltip-t-recentchangeslinked": "Used as tooltip for the link {{msg-mw|Recentchangeslinked}}.\n\nSee also:\n* {{msg-mw|Recentchangeslinked}}\n* {{msg-mw|Accesskey-t-recentchangeslinked}}\n* {{msg-mw|Tooltip-t-recentchangeslinked}}",
        "tooltip-feed-rss": "Used as tooltip for RSS feed link.\n\nSee also:\n* {{msg-mw|Feed-rss}}\n* {{msg-mw|Accesskey-feed-rss}}\n* {{msg-mw|Tooltip-feed-rss}}",
-       "tooltip-feed-atom": "Used as tooltip for Atom feed link.\n\nSee also:\n* {{msg-mw|Feed-atom}}\n* {{msg-mw|Accesskey-feed-atom}}\n* {{msg-mw|Tooltip-feed-atom}}",
+       "tooltip-feed-atom": "Used as tooltip for Atom feed link.\n\n\"Atom\" is a technology for automated updates. See [[w:en:Atom (standard)]].\n\nSee also:\n* {{msg-mw|Feed-atom}}\n* {{msg-mw|Accesskey-feed-atom}}\n* {{msg-mw|Tooltip-feed-atom}}",
        "tooltip-t-contributions": "Tooltip shown when hovering over {{msg-mw|Contributions}} in the toolbox.\n\nParameters:\n* $1 - Name of the user\n\nSee also:\n* {{msg-mw|Contributions}}\n* {{msg-mw|Accesskey-t-contributions}}\n* {{msg-mw|Tooltip-t-contributions}}",
        "tooltip-t-emailuser": "Tooltip shown when hovering over the {{msg-mw|Emailuser}} link in the toolbox (sidebar, below).\n\nParameters:\n* $1 - Name of the user\n\nSee also:\n* {{msg-mw|Emailuser}}\n* {{msg-mw|Accesskey-t-emailuser}}\n* {{msg-mw|Tooltip-t-emailuser}}",
        "tooltip-t-info": "Tooltip shown when hovering over the {{msg-mw|pageinfo-toolboxlink}} link in the toolbox (sidebar, below).",
        "newimages-summary": "This message is displayed at the top of [[Special:NewImages]] to explain what is shown on that special page.",
        "newimages-legend": "Caption of the fieldset for the filter on [[Special:NewImages]]\n\n{{Identical|Filter}}",
        "newimages-label": "Caption of the filter editbox on [[Special:NewImages]]",
+       "newimages-user": "Caption of the username/IP address editbox on [[Special:NewImages]]",
        "newimages-showbots": "Used as label for a checkbox. When checked, [[Special:NewImages]] will also display uploads by users in the bots group.",
        "newimages-hidepatrolled": "Used as label for a checkbox. When checked, [[Special:NewImages]] will not display patrolled uploads.\n\nCf. {{msg-mw|tog-hidepatrolled}} and {{msg-mw|apihelp-feedrecentchanges-param-hidepatrolled}}.",
        "noimages": "This is shown on the special page [[Special:NewImages]], when there aren't any recently uploaded files.",
        "metadata-help": "This message is followed by a table with metadata.",
        "metadata-expand": "On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on this link, you can see more data and information. For the link to hide back the less important data, see {{msg-mw|Metadata-collapse}}.",
        "metadata-collapse": "On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on the link {{msg-mw|Metadata-expand}}, you can see more data and information. This message is for the link to hide back the less important data.",
-       "metadata-fields": "{{doc-important|Do not translate list items, only translate the text! So leave \"<code>* make</code>\" and the other items exactly as they are.}}\nThe sentences are for explanation only and are not shown to the user.",
+       "metadata-fields": "{{doc-important|Do not translate list items, only translate the text! So leave \"<code>* make</code>\" and the other items exactly as they are.}}\nThis message allows wiki admins to edit the list of metadata fields that will be included on image page display when the metadata table is collapsed.\n\nThe sentence at the top is for explanation to the admins and is not shown to the user.",
        "metadata-langitem": "{{optional}}\nThis is used for constructing the list of translations when a metadata property is translated into multiple languages.\n\nParameters:\n* $1 - the value of the property (in one language)\n* $2 - the language name that this translation is for (or language code if language name cannot be determined)\n* $3 - (Unused) the language code",
        "metadata-langitem-default": "{{optional}}\nSimilar to \"metadata-langitem\" but for the case where a multilingual property has a default specified that does not specify what language the default is in. $1 is the value of the property.",
        "exif-imagewidth": "{{exif-qqq}}\n{{Identical|Width}}",
        "exif-exposureprogram-6": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-7": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-8": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
-       "exif-subjectdistance-value": "Parameters:\n* $1 - a distance measured in meters. The value can, and usually does, include decimal places.",
+       "exif-subjectdistance-value": "Parameters:\n* $1 - a distance measured in meters. The value can, and usually does, include decimal places.\n{{Identical|Meter}}",
        "exif-meteringmode-0": "{{Related|Exif-meteringmode}}\n{{Identical|Unknown}}",
        "exif-meteringmode-1": "{{Related|Exif-meteringmode}}\n{{Identical|Average}}",
        "exif-meteringmode-2": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
        "confirmrecreate-noreason": "Followed by the checkbox which has the label {{msg-mw|Recreate}}.\n\nParameters:\n* $1 - username, also used for GENDER support\n* $2 - (Unused) reason\nSee also:\n* {{msg-mw|Confirmrecreate}}",
        "recreate": "Text shown when the editor fails to save the page due to it having been deleted since they opened VE. $1 is the message {{msg-mw|ooui-dialog-process-continue}}.",
        "unit-pixel": "{{optional}}\npx is the abbreviation for \"pixel\".",
+       "confirm-purge-title": "Title for the confirmation form that appears when the user is about to purge the page.",
        "confirm_purge_button": "Used as Submit button text.\n{{Identical|OK}}",
        "confirm-purge-top": "Used as confirmation message.",
        "confirm-purge-bottom": "Additional description for Purge form.",
        "rawmessage": "{{notranslate}} Used to pass arbitrary text as a message specifier array",
        "logentry-delete-delete": "{{Logentry|[[Special:Log/delete]]}}",
        "logentry-delete-delete_redir": "{{Logentry|[[Special:Log/delete]]}}",
-       "logentry-delete-restore": "{{Logentry|[[Special:Log/delete]]}}",
+       "logentry-delete-restore": "{{Logentry|[[Special:Log/delete]]}}\n* $4 - {{msg-mw|restore-count-revisions}} or {{msg-mw|restore-count-files}}, or a combination with both (e.g. \"3 revision and 1 file\")\n\n'''A note for RTL languages''': if $3 is a name of a page or a file written in a different language, the number in the beginning of $4 may be displayed incorrectly. Consider inserting a word or an RLM between $3 and $4.",
+       "logentry-delete-restore-nocount": "{{Logentry|[[Special:Log/delete]]}}",
+       "restore-count-revisions": "Used as parameter in {{msg-mw|logentry-delete-restore}}\n{{Identical|Revision}}",
+       "restore-count-files": "Used as parameter in {{msg-mw|logentry-delete-restore}}\n{{Identical|File}}",
        "logentry-delete-event": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - count of affected log events",
        "logentry-delete-revision": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - the number of affected revisions of the page $3",
        "logentry-delete-event-legacy": "{{Logentry|[[Special:Log/delete]]}}",
        "logentry-tag-update-revision": "{{Logentry|[[Special:Log/tag]]}}\n*$4 - revision ID\n* $6 - list of tags that were added, separated by {{msg-mw|Comma-separator}}\n* $7 - number of added tags\n* $8 - list of tags that were removed, separated by {{msg-mw|Comma-separator}}\n* $9 - number of removed tags",
        "logentry-tag-update-logentry": "{{Logentry|[[Special:Log/tag]]}}\n*$5 - log entry ID\n* $6 - list of tags that were added, separated by {{msg-mw|Comma-separator}}\n* $7 - number of added tags\n* $8 - list of tags that were removed, separated by {{msg-mw|Comma-separator}}\n* $9 - number of removed tags",
        "rightsnone": "Default rights for registered users.\n\n{{Identical|None}}",
-       "revdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for page revisions.\n\nFollowed by the message {{msg-mw|revdelete-log-message}} in brackets.\n\nPreceded by the name of the user doing this task.\n\nParameters:\n* $1 - the page name\nSee also:\n* {{msg-mw|Logdelete-logentry}}",
-       "logdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for log events.\n\nFollowed by the message {{msg-mw|logdelete-log-message}} in brackets.\n\nPreceded by the name of the user who did this task.\n\nParameters:\n* $1 - the log name in brackets\nSee also:\n* {{msg-mw|Revdelete-logentry}}",
-       "revdelete-content": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the content of a revision or event.\n{{Identical|Content}}",
-       "revdelete-summary": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the edit summary of a revision or event.\n{{Identical|Edit summary}}",
-       "revdelete-uname": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the username for a revision or event.\n\n{{Identical|Username}}",
-       "revdelete-hid": "This message is used as <code>$1</code>:\n* in {{msg-mw|revdelete-log-message}} when hiding revisions\n* in {{msg-mw|logdelete-log-message}} when hiding information in the log entry about hiding revisions\nParameters:\n* $1 - any one of the following:\n** {{msg-mw|Revdelete-content}} (when hiding the page content)\n** {{msg-mw|Revdelete-summary}} (when hiding the edit summary)\n** {{msg-mw|Revdelete-uname}} (when hiding the user name)\n** a combination of these three messages\nSee also:\n* {{msg-mw|Revdelete-unhid}}",
-       "revdelete-unhid": "This message is used as <code>$1</code>:\n* in {{msg-mw|Revdelete-log-message}} when unhiding revisions\n* in {{msg-mw|Logdelete-log-message}} when unhiding information in the log entry about unhiding revisions\nParameters:\n* $1 - any one of the following:\n** {{msg-mw|Revdelete-content}} (when unhiding the page content)\n** {{msg-mw|Revdelete-summary}} (when unhiding the edit summary)\n** {{msg-mw|Revdelete-uname}} (when unhiding the user name)\n** a combination of these three messages\nSee also:\n* {{msg-mw|Revdelete-hid}}",
-       "revdelete-log-message": "This log message is used together with {{msg-mw|revdelete-logentry}} in the deletion or suppression logs when changing visibility restrictions for page revisions.\n\nParameters:\n* $1 - any one of the following\n** {{msg-mw|revdelete-hid}} (when hiding data)\n** {{msg-mw|revdelete-unhid}} (when unhiding data)\n** {{msg-mw|revdelete-restricted}} (when applying restrictions for sysops)\n** {{msg-mw|revdelete-unrestricted}} (when removing restrictions for sysops)\n** a combination of those messages\n* $2 - the number of revisions for which the restrictions are changed\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.\n\nSee also:\n* {{msg-mw|Logdelete-log-message}}",
-       "logdelete-log-message": "This log message appears in brackets after the message {{msg-mw|logdelete-logentry}} in the deletion or suppression logs when changing the visibility of a log entry for events. For a brief description of the process of changing the visibility of events and their log entries see this [http://www.mediawiki.org/wiki/RevisionDelete mediawiki explanation].\n\nParameters:\n* $1 - any one of the following\n** {{msg-mw|revdelete-hid}} (when hiding data)\n** {{msg-mw|revdelete-unhid}} (when unhiding data)\n** {{msg-mw|revdelete-restricted}} (when applying restrictions for sysops)\n** {{msg-mw|revdelete-unrestricted}} (when removing restrictions for sysops)\n** a combination of those messages\n* $2 - the number of events for which the restrictions are changed\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.\n\nSee also:\n* {{msg-mw|Revdelete-log-message}}",
        "deletedarticle": "This is a ''logentry'' message. Parameters:\n* $1 - deleted page name\n{{Identical|Deleted}}",
        "suppressedarticle": "Part of a [[mw:Manual:RevisionDelete|RevisionDelete]] log entry. Parameters:\n* $1 - suppressed page name\n{{Identical|Suppressed}}",
        "undeletedarticle": "This is a ''logentry'' message. Parameters:\n* $1 - restored (undeleted) page name",
        "action-pagelang": "{{Doc-action|pagelang}}",
        "log-name-pagelang": "Display entry for log name for changes in page language in Special:Log.",
        "log-description-pagelang": "Display description for log name for changes in page language in Special:Log.",
-       "logentry-pagelang-pagelang": "{{Logentry}}\nAdditional parameters:\n* $4 - old language code, or \"[def]\" (hard-coded)\n* $5 - new language code, or \"[def]\" (hard-coded)",
+       "logentry-pagelang-pagelang": "[[mw:Page language]] explains what this feature is about.\n----\n{{Logentry}}\nAdditional parameters:\n* $4 - old language code, or \"[def]\" (hard-coded)\n* $5 - new language code, or \"[def]\" (hard-coded)",
        "default-skin-not-found": "Message shown when the default skin for this MediaWiki installation can not be found.\n\nParameters:\n* $1: skin identifier for the default skin\n* $2: list of installed skins, composed using {{msg-mw|default-skin-not-found-row-enabled}} and {{msg-mw|default-skin-not-found-row-disabled}}\n* $3: code snippet to use to enable installed skins\n* $4: Number of items in list $2\n* $5: Number of lines in $3, one per skin",
        "default-skin-not-found-no-skins": "Message shown when the default skin for this MediaWiki installation can not be found and the installation has no skins at all.\n\nParameters:\n* $1: name of the default skin",
        "default-skin-not-found-row-enabled": "One row of the list of installed skins shown as a part of the following message (for an enabled skin):\n* {{msg-mw|default-skin-not-found}}\n----\nParameters:\n* $1 - skin identifier\n* $2 - human-readable skin name\nSee also:\n* {{msg-mw|Default-skin-not-found-row-disabled}}",
        "special-characters-group-thai": "The name of the [[w:Thai alphabet|Thai]] character set (alphabet).",
        "special-characters-group-lao": "{{Identical|Lao}}",
        "special-characters-group-khmer": "{{Identical|Khmer}}",
+       "special-characters-group-canadianaboriginal": "The name of the [[w:Canadian Aboriginal syllabics|Canadian Aboriginal]] character set (alphabet).",
        "special-characters-title-endash": "Title tooltip for the en dash character (–); See https://en.wikipedia.org/wiki/Dash",
        "special-characters-title-emdash": "Title tooltip for the em dash character (—); See https://en.wikipedia.org/wiki/Dash",
        "special-characters-title-minus": "Title tooltip for the minus sign character (−), not to be confused with a hyphen",
        "mw-widgets-titleinput-description-redirect": "Description label for a redirect in the title input widget.",
        "mw-widgets-categoryselector-add-category-placeholder": "Placeholder displayed in the category selector widget after the capsules of already added categories.",
        "mw-widgets-usersmultiselect-placeholder": "Placeholder displayed in the input field, where new usernames are entered",
+       "date-range-from": "Label for an input field that specifies the start date of a date range filter.",
+       "date-range-to": " Label for an input field that specifies the end date of a date range filter.",
        "sessionmanager-tie": "Used as an error message when multiple session sources are tied in priority.\n\nParameters:\n* $1 - List of dession type descriptions, from messages like {{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.",
        "sessionprovider-generic": "Used to create a generic session type description when one isn't provided via the proper message. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.\n\nParameters:\n* $1 - PHP classname.",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "Description of the sessions provided by the CookieSessionProvider class, which use HTTP cookies. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.",
        "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).",
        "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."
+       "pageid": "Used to format a page ID number in text. Parameters:\n* $1 - Page ID number.",
+       "rawhtml-notallowed": "Error message given when $wgRawHtml = true; is set and a user uses an &lt;html&gt; tag in a system message or somewhere other than a normal page.",
+       "gotointerwiki": "{{doc-special|GoToInterwiki}}\n\nSpecial:GoToInterwiki is a warning page displayed before redirecting users to external interwiki links. Its triggered by people going to something like [[Special:Search/google:foo]].",
+       "gotointerwiki-invalid": "Message shown on Special:GoToInterwiki if given an invalid title.",
+       "gotointerwiki-external": "Message shown on Special:GoToInterwiki if given a external interwiki link (e.g. [[Special:GoToInterwiki/Google:Foo]]). $1 is the full url the user is trying to get to. $2 is the text of the interwiki link (e.g. \"Google:foo\").",
+       "undelete-cantedit": "Shown if the user tries to undelete a page that they cannot edit",
+       "undelete-cantcreate": "Shown if the user tries to undelete a page which currently does not exist, and they are not allowed to create it. This could for example happen on a wiki with custom protection levels where the page name has been create-protected and the user has the right to undelete but not the right to edit protected pages."
 }
index c0192d2..479404d 100644 (file)
        "externaldberror": "Hawa yaykuna pantasqam karqan, ichataq manam saqillasunkichu hawa rakiqunaykita musuqchayta.",
        "login": "Yaykuy",
        "nav-login-createaccount": "Yaykuy / rakiqunata kamariy",
-       "userlogin": "Yaykuy / rakiqunata kamariy",
-       "userloginnocreate": "Yaykuy",
        "logout": "Lluqsiy",
        "userlogout": "Lluqsiy",
        "notloggedin": "Manam yaykurqankichu",
        "userlogin-noaccount": "Rakiqunaykiri manachu kanchu?",
        "userlogin-joinproject": "{{SITENAME}}man yaykuy",
-       "nologin": "Manaraqchu rakiqunaykichu kachkan? '''$1'''.",
-       "nologinlink": "Kichariy",
        "createaccount": "Musuq rakiqunata kichariy",
-       "gotaccount": "Rakiqunaykiñachu kachkan? '''$1'''.",
-       "gotaccountlink": "Yaykuy",
-       "userlogin-resetlink": "Yaykuna willayniykikunatari qunqarqankichu?",
        "userlogin-resetpassword-link": "Yaykuna rimaykita qunqarqankichu?",
        "userlogin-helplink2": "Yaykuywan yanapay",
        "userlogin-loggedin": "{{GENDER:$1|$1}} sutiyuq kaspa yaykusqañam kachkanki.\nKay qatiq hunt'ana p'anqata llamk'achiy wakin sutiwan yaykunaykipaq.",
        "createacct-another-email-ph": "E-chaski imamaytata yaykuchiy",
        "createaccountmail": "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa akllasqa e-chaski imamaytaman kachay",
        "createacct-realname": "Chiqap suti (munaspayki)",
-       "createaccountreason": "Kayrayku:",
        "createacct-reason": "Kayrayku",
        "createacct-reason-ph": "Imaraykutaq huk rakiqunata kamarichkanki",
        "createacct-submit": "Rakiqunaykita kamariy",
        "watchthis": "Kay qillqata watiqay",
        "savearticle": "P'anqata waqaychay",
        "savechanges": "Hukchasqata waqaychay",
+       "publishpage": "P'anqata uyaychay",
+       "publishchanges": "Hukchasqakunata uyaychay",
        "preview": "Manaraq waqaychaspa qhawariy",
        "showpreview": "Ñawpaqta qhawallay",
        "showdiff": "Hukchasqakunata rikuchiy",
        "anoneditwarning": "<strong>Paqtataq:</strong> Manaraqmi ruraqpa sutiykita qumurqunkichu. Llamk'apuptiykiqa, IP huchhaykim kay p'anqap hukchay hallch'ayninpi wakin runakunapaq rikuna waqaychasqa kanqa. Ruraqpa sutiykiwan <strong>[$1 yaykuptiykiqa]</strong> icha musuq <strong>[$2 rakiqunata kamariptiykiqa]</strong>, llamk'apusqaykikuna ruraqpa sutiykiwanmi hallch'aypi waqaychasqa kanqa, wakin allinkunapas qampaqmi kanqa.",
        "anonpreviewwarning": "''Manam ruraqpa sutiykiwan yaykusqa kachkankichu. Imatapas waqaychaptiykiqa, IP huchhaykim hallch'asqa kanqa kay p'anqap llamk'apuy wiñay kawsayninpi.''",
-       "missingsummary": "'''Paqtataq:''' Manaraqmi llamk'apusqaykimanta pisichaytachu qillqamurqunki. Musuqmanta «{{int:savearticle}}» nisqapi ñit'iptiykiqa, llamk'apusqayki waqaychasqam kanqa mana pisichay kaptinpas.",
+       "missingsummary": "'''Paqtataq:''' Manaraqmi llamk'apusqaykimanta pisichaytachu qillqamurqunki. Musuqmanta «$1» nisqapi ñit'iptiykiqa, llamk'apusqayki waqaychasqam kanqa mana pisichay kaptinpas.",
        "missingcommenttext": "Ama hina kaspa, kay qatiqpi willaspa qillqamuy.",
-       "missingcommentheader": "'''Paqtataq:''' Manaraqmi kay willaypa umallintachu qillqamurqunki. Musuqmanta \"{{int:savearticle}}\" nisqapi ñit'iptiykiqa, llamk'apusqayki waqaychasqam kanqa mana willaypa umallin kaptinpas.",
+       "missingcommentheader": "'''Paqtataq:''' Manaraqmi kay willaypa umallintachu qillqamurqunki. Musuqmanta \"$1\" nisqapi ñit'iptiykiqa, llamk'apusqayki waqaychasqam kanqa mana willaypa umallin kaptinpas.",
        "summary-preview": "Pisichayta ñawpaqta qhawarillay:",
        "subject-preview": "Yachaywata/umallita ñawpaqta qhawarillay:",
        "blockedtitle": "Ruraqqa hark'asqam",
        "content-model-text": "qillqalla",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "Paqtataq: Kay p'anqaqa nisyu achka qullqipaq t'ikrana rurana qayayniyuqmi.\n\n$2-manta aswan pisillam {{PLURAL:$2|qayayniyuq|qayayniyuq}} kanman, kunantaq {{PLURAL:$1|$1 qayayniyuqmi|$1 qayayniyuqmi}} kachkan.",
-       "expensive-parserfunction-category": "Nisyu achka qullqipaq t'ikrana rurana qayayniyuq p'anqakuna",
+       "expensive-parserfunction-warning": "Paqtataq: Kay p'anqaqa nisyu achka qullqipaq k'uskina rurana qayayniyuqmi.\n\n$2-manta aswan pisillam {{PLURAL:$2|qayayniyuq}} kanman, kunantaq {{PLURAL:$1|$1 qayayniyuqmi}} kachkan.",
+       "expensive-parserfunction-category": "Nisyu achka qullqipaq k'uskina rurana qayayniyuq p'anqakuna",
        "post-expand-template-inclusion-warning": "Paqtataq: Nisyum ch'aqtasqa plantillakuna.\nHuk plantillakunaqa manam ch'aqtasqachu kanqa.",
        "post-expand-template-inclusion-category": "Nisyu ch'aqtasqa plantillakunayuq p'anqakuna",
        "post-expand-template-argument-warning": "Paqtataq: Kay p'anqaqa huk icha aswan nisyu ch'aqtasqa plantilla niyniyuqmi.\nChay niykunaqa manam chaninchasqachu.",
        "right-editprotected": "Amachasqa p'anqakunata \"{{int:protect-level-sysop}}\" hina llamk'apuy",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" hina amachasqa p'anqakunata llamk'apuy",
        "right-editinterface": "Ruraqpaq uyapurata llamk'apuy",
-       "right-editusercssjs": "Huk ruraqkunap CSS, JS willañiqinkunata llamk'apuy",
        "right-editusercss": "Huk ruraqkunap CSS willañiqinkunata llamk'apuy",
        "right-edituserjs": "Huk ruraqkunap JS willañiqinkunata llamk'apuy",
        "right-editmyusercss": "Kikiykip ruraqpaq CSS willañiqiykikunata llamk'apuy",
        "rcshowhidemine": "$1 llamk'apusqaykunata",
        "rcshowhidemine-show": "Rikuchiy",
        "rcshowhidemine-hide": "Pakay",
-       "rclinks": "Qhipaq $1 hukchasqata qhipaq $2 p'unchawmanta qhaway.<br />$3",
+       "rclinks": "Qhipaq $1 hukchasqata qhipaq $2 p'unchawmanta qhaway.",
        "diff": "dif",
        "hist": "wñka",
        "hide": "pakay",
        "undeleteviewlink": "qhaway",
        "undeleteinvert": "Akllasqantinta t'ikrachiy",
        "undeletecomment": "Kayrayku:",
-       "undeletedrevisions": "{{PLURAL:$1|Huk paqarichisqa llamk'apusqa|$1 paqarichisqa llamk'apusqakuna}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 llamk'apusqaqa|$1 llamk'apusqakunaqa}} {{PLURAL:$2|1 willañiqipas|$2 willañiqikunapas}} paqarichisqam",
-       "undeletedfiles": "{{PLURAL:$1|1 willañiqiqa|$1 willañiqikunaqa}} paqarichisqam",
        "cannotundelete": "Manam atinichu qullusqata paqarichiyta: $1",
        "undeletedpage": "'''$1 nisqaqa paqarichisqañam'''\n\n[[Special:Log/delete|Qulluy hallch'api]] qhaway ñaqha qullusqakunata paqarichisqakunatapas rikunaykipaq.",
        "undelete-header": "[[Special:Log/delete|Qulluy hallch'apiqa]] qullusqa p'anqakunap sutinkunatam rikunki.",
        "tooltip-ca-nstab-category": "Katiguriyamanta p'anqata qhaway",
        "tooltip-minoredit": "Kayta aslla hukchay nispa sananchay",
        "tooltip-save": "Hukchasqakunata waqaychay",
+       "tooltip-publish": "Hukchasqaykikunata uyaychay",
        "tooltip-preview": "Ñawpaqtaqa hukchasqaykikunata qhawarillay, manaraq waqaychaspa!",
        "tooltip-diff": "Qillqapi hukchasqaykikunata rikuchiy.",
        "tooltip-compareselectedversions": "P'anqap iskay akllasqa hukchasqanpura hukchasqa kayta qhaway.",
        "version-extensions": "Tiyachisqa mast'arinakuna",
        "version-skins": "Churasqa qarakuna",
        "version-specialpages": "Sapaq p'anqakuna",
-       "version-parserhooks": "T'ikrana ch'iwinakuna",
+       "version-parserhooks": "K'uskina ch'iwinakuna",
        "version-variables": "Hukchakuqkuna",
        "version-antispam": "Spam hark'ay",
        "version-other": "Wakin",
        "version-mediahandlers": "Midya llamk'apuq",
        "version-hooks": "Ch'iwinakuna",
-       "version-parser-extensiontags": "T'ikrana mast'arina ruranakuna",
-       "version-parser-function-hooks": "T'ikrana rurana ch'iwinakuna",
+       "version-parser-extensiontags": "K'uskina mast'arina ruranakuna",
+       "version-parser-function-hooks": "K'uskina rurana ch'iwinakuna",
        "version-hook-name": "Ch'iwinap sutin",
        "version-hook-subscribedby": "Kay runap mañaykusqan:",
        "version-version": "($1)",
        "logentry-rights-autopromote": "{{GENDER:$2|}}$1 sutiyuq ruraqqa kikinmantam ñawparikun $4-manta $5-man",
        "logentry-upload-upload": "$1 {{GENDER:$2|churkusqa}} $3",
        "rightsnone": "(-)",
-       "revdelete-summary": "yuyarinata llamk'apuy",
        "feedback-adding": "Willapuyniykita kay p'anqaman yapay: ...",
        "feedback-bugcheck": "Allillanmi! Llanchirillay [$1 riqsisqapura huk pantasqañachu] mana kanmanchu.",
        "feedback-bugnew": "Llanchisqañam. Musuq pantasqamanta willay",
        "duration-centuries": "{{PLURAL:$1|pachakwata|pachakwatakuna}}",
        "duration-millennia": "{{PLURAL:$1|waranqawata|waranqawatakuna}}",
        "rotate-comment": "Rikch'aqa pacha rikuchiqwan $1 {{PLURAL:$1|k'atma}} muyusqam",
+       "limitreport-title": "K'uskina k'utupanapaq qusqakuna:",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sikundu|sikundukuna}}",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sikundu|sikundukuna}}",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte}}",
index e1c2830..c6ab518 100644 (file)
        "yourpasswordagain": "Yaykunapak rimayta kutin killkapay:",
        "login": "Yaykuna",
        "nav-login-createaccount": "Yaykuna",
-       "userlogin": "Yaykuna",
        "logout": "Llukshina",
        "userlogout": "Llukshina",
-       "nologin": "Mana rurak shutita charinchu ? '''$1'''.",
-       "nologinlink": "Shuk rurak shutita akllana",
        "createaccount": "Shuk rurak shutita akllana",
-       "gotaccount": "Ñachu rurak shutita charinchu ? '''$1'''.",
-       "gotaccountlink": "Yaykuna",
-       "userlogin-resetlink": "Kikinpa yaykunaman yuyaykunata kunkapankichu ?",
        "mailmypassword": "Musuq yaykunkapak rimayta e-chaskiwan kachawapay",
        "loginlanguagelabel": "Shimi: $1",
        "bold_sample": "Yanayashka killka",
        "rcshowhideanons": "Mana shutiyuk rurakkunata $1",
        "rcshowhidepatr": "rikushka mushuk killkaykunata $1",
        "rcshowhidemine": "Ñukapa killkaykunata $1",
-       "rclinks": "Ashtawan mushuk $1 killkaykunata, yallishka $2 punchapi rikuna.<br />$3",
+       "rclinks": "Ashtawan mushuk $1 killkaykunata, yallishka $2 punchapi rikuna.",
        "diff": "dif",
        "hist": "wñka",
        "hide": "Pakana",
index 6d75ded..05d40f1 100644 (file)
        "rcshowhideliu": "$1 i patàca registrè",
        "rcshowhideanons": "$1 navigador anònim",
        "rcshowhidemine": "$1 völt a j ò scrètt",
-       "rclinks": "Fam avdè la lèsta d'j $1 cambiamént int j ultum $2 dé<br />$3",
+       "rclinks": "Fam avdè la lèsta d'j $1 cambiamént int j ultum $2 dé",
        "diff": "dif.",
        "hist": "cron",
        "hide": "Ardòpa",
index 8d629e5..1a2dec3 100644 (file)
        "rcshowhideanons": "$1 users war twasnen",
        "rcshowhidepatr": "Tiẓṛigin ig itwaẓrent di $1",
        "rcshowhidemine": "$1 tiẓṛigin inu",
-       "rclinks": "Ẓar $1 tiẓṛigin tinggura di $2 n ussan inggura <br />$3",
+       "rclinks": "Ẓar $1 tiẓṛigin tinggura di $2 n ussan inggura",
        "diff": "imṣebḍan",
        "hist": "Amezruy",
        "hide": "Snuffar",
index 6e54be3..537bd94 100644 (file)
        "aboutsite": "Davart {{SITENAME}}",
        "aboutpage": "Project:Davart",
        "copyright": "Il cuntegn è disponibel sut la licenza $1 sche betg inditgà autramain.",
-       "copyrightpage": "{{ns:project}}:Resguardar_dretgs_d_autur",
+       "copyrightpage": "{{ns:project}}:Resguardar dretgs d autur",
        "currentevents": "Events actuals",
        "currentevents-url": "Project:Events actuals",
        "disclaimers": "Impressum",
        "externaldberror": "U ch'i è capità ina errur cun l'autentificaziun externa u che ti na dastgas betg actualisar tes conto extern.",
        "login": "T'annunziar",
        "nav-login-createaccount": "T'annunziar / crear in conto",
-       "userlogin": "T'annunziar / crear in conto",
-       "userloginnocreate": "T'annunziar",
        "logout": "Sortir",
        "userlogout": "sortir",
        "notloggedin": "Betg s'annunzià",
        "userlogin-noaccount": "Anc nagin conto?",
        "userlogin-joinproject": "Far part da {{SITENAME}}",
-       "nologin": "Anc nagin conto? '''$1'''.",
-       "nologinlink": "Crear in conto d'utilisader",
        "createaccount": "Crear in conto d'utilisader",
-       "gotaccount": "Gia in conto d'utilisader? '''$1'''.",
-       "gotaccountlink": "T'annunziar",
-       "userlogin-resetlink": "Emblidà tias datas per s'annunziar?",
        "userlogin-resetpassword-link": "Has emblidà tes pled-clav?",
        "userlogin-loggedin": "Ti es gia t'annunzià sco {{GENDER:$1|$1}}.\nDovra il suandant formular per t'annunziar cun in auter conto.",
        "userlogin-createanother": "Crear in auter conto",
        "createacct-another-email-ph": "Endatescha in'adressa dad e-mail",
        "createaccountmail": "Dovrar per il mument in pled-clav casual ed inviar el a l'adressa d'e-mail inditgada.",
        "createacct-realname": "Num real (opziunal)",
-       "createaccountreason": "Motiv:",
        "createacct-reason": "Motiv",
        "createacct-reason-ph": "Tes motiv per crear in auter conto",
        "createacct-submit": "Crear tes conto",
        "passwordreset-disabled": "La pussaivladad da redefinir il pled-clav è vegnida deactivada sin questa wiki.",
        "passwordreset-username": "Num d'utilisader:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Mussar l'e-mail che resultescha?",
-       "passwordreset-capture-help": "Sche ti activeschas quest champ vegn l'e-mail (cun il pled-clav temporar) mussà a ti sco era tramess a l'utilisader.",
        "passwordreset-email": "Adressa dad e-mail:",
        "passwordreset-emailtitle": "Detagls davart il conto sn {{SITENAME}}",
        "passwordreset-emailtext-ip": "Insatgi (probablamain ti, da l'adressa IP $1) ha dumandà da redefinir il pled-clav per la pagina {{SITENAME}} ($4). \n{{PLURAL:$3|Il suandant conto d'utilisader è collià|Ils suandants contos d'utilisader èn colliads}} cun questa adressa d'e-mail:\n\n$2\n\n{{PLURAL:$3|Quest pled-clav temporar|Quests pleds-clav temporars}} èn valids {{PLURAL:$5|in di|$5 dis}}.\nTi duessas t'annunziar ussa e tscherner in nov pled-clav. Sch'enzatgi auter ha empustà quests novs pleds-clav u sche ti ta regordas puspè da tes pled-clav original e na vuls betg pli midar el, pos ti ignorar quest messadi e cuntinuar d'utilisar tes pled-clav original.",
        "showdiff": "Mussar midadas",
        "anoneditwarning": "Vus essas betg annunziads. Empè dal num d'utilisader vign l'adressa dad IP registrada en la historia da las versiuns.",
        "anonpreviewwarning": "''Ti n'es betg t'annunzià. Cun memorisar vegn perquai tia adressa IP registrada en la cronologia da la pagina.''",
-       "missingsummary": "'''Avis:''' Ti has betg inditgà ina resumaziun. \nSche ti cliccas danovamain \"{{int:savearticle}}\" vegn tia midada memorisada senza ina tala.",
+       "missingsummary": "'''Avis:''' Ti has betg inditgà ina resumaziun. \nSche ti cliccas danovamain \"$1\" vegn tia midada memorisada senza ina tala.",
        "missingcommenttext": "Endatescha per plaschair ina resumaziun.",
-       "missingcommentheader": "'''Avis:''' Ti n'has betg inditgà in subject/titel per quest commentari.\nSche ti cliccas anc ina giada sin \"{{int:savearticle}}\" vegn il commentari memorisà senza in tal.",
+       "missingcommentheader": "'''Avis:''' Ti n'has betg inditgà in subject/titel per quest commentari.\nSche ti cliccas anc ina giada sin \"$1\" vegn il commentari memorisà senza in tal.",
        "summary-preview": "prevista da la resumaziun:",
        "subject-preview": "Prevista da l'object:",
        "blockedtitle": "Utilisader è bloccà",
        "editingsection": "Modifitgar «$1» (secziun)",
        "editingcomment": "Modifitgar «$1» (nova secziun)",
        "editconflict": "Conflict da modifitgar: $1",
-       "explainconflict": "Insatgi auter ha midà questa pagina dapi che ti has cumenzà a la modifitgar. \nIl champ d'endataziun sura cuntegna il text sco che la pagina vesa ora actualmain. \nTias midadas èn mussadas en il champ d'endataziun sut. \nTi stos integrar tias midadas en il text existent. \n'''Mo''' il text en il champ d'endataziun sura vegn memorià sche ti cliccas sin \"{{int:savearticle}}\".",
+       "explainconflict": "Insatgi auter ha midà questa pagina dapi che ti has cumenzà a la modifitgar. \nIl champ d'endataziun sura cuntegna il text sco che la pagina vesa ora actualmain. \nTias midadas èn mussadas en il champ d'endataziun sut. \nTi stos integrar tias midadas en il text existent. \n'''Mo''' il text en il champ d'endataziun sura vegn memorià sche ti cliccas sin \"$1\".",
        "yourtext": "Tes text",
        "storedversion": "Versiun memorisada",
        "nonunicodebrowser": "'''Attenziun: Tes navigatur na sustegna betg unicode.'''\nPer che ti pos modifitgar las paginas senza ch'i dettia problems vegnan ils caracters betg ASCII mussads en tes champ d'endataziun sco codes exadecimals.",
        "saveprefs": "memorisar",
        "restoreprefs": "Restituir tut las preferenzas da standard (en tut las secziuns)",
        "prefs-editing": "Modifitgar",
-       "rows": "Lingias:",
-       "columns": "Colonnas:",
        "searchresultshead": "Tschertga",
        "stub-threshold": "Limita per la formataziun sco <a href=\"#\" class=\"stub\">colliaziun a stubs</a>, en bytes:",
        "stub-threshold-disabled": "Deactivà",
        "userrights-reason": "Motiv:",
        "userrights-no-interwiki": "Ti n'has betg la permissiun da midar dretgs d'utilisaders sin autras wikis.",
        "userrights-nodatabase": "La banca da datas $1 n'exista betg u n'è betg locala.",
-       "userrights-nologin": "Ti stos [[Special:UserLogin|t'annunziar]] cun in conto d'aministratur per modifitgar ils dretgs d'utilisader.",
-       "userrights-notallowed": "Ti n'has betg la permissiun d'agiuntar u allontanar dretgs d'utilisader.",
        "userrights-changeable-col": "Gruppas che ti pos modifitgar",
        "userrights-unchangeable-col": "Gruppas che ti nas pos betg modifitgar",
        "group": "Gruppa:",
        "right-protect": "Midar il livel da protecziun e modifitgar paginas protegidas",
        "right-editprotected": "Modifitgar paginas protegidas cun «{{int:protect-level-sysop}}»",
        "right-editinterface": "Modifitgar l'interfascha per l'utilisader",
-       "right-editusercssjs": "Modifitgar datotecas da CSS e JavaScript d'auters utilisaders",
        "right-editusercss": "Modifitgar datotecas da CSS d'auters utilisaders",
        "right-edituserjs": "Modifitgar datotecas da JavaScript d'auters utilisaders",
        "right-rollback": "Revocar svelt las modificaziuns da l'ultim utilisader che ha modifitgà ina pagina particulara.",
        "right-siteadmin": "Bloccar u debloccar la banca da datas",
        "right-override-export-depth": "Exportar paginas inclusivamain paginas colliadas fin ad ina profunditad da 5",
        "right-sendemail": "Trametter e-mails ad auters utilisaders",
-       "right-passwordreset": "Vesair l'e-mail per redefinir pleds-clav",
        "newuserlogpage": "Protocol d'utilisaders creads",
        "newuserlogpagetext": "Quai è il protocol dals contos d'utilisader ch'èn vegnids creads.",
        "rightslog": "Protocol dals dretgs d'utilisader",
        "rcshowhidemine": "$1 mias midadas",
        "rcshowhidemine-show": "Mussar",
        "rcshowhidemine-hide": "Zuppentar",
-       "rclinks": "Mussar las davosas $1 midadas dals ultims $2 dis<br />$3",
+       "rclinks": "Mussar las davosas $1 midadas dals ultims $2 dis",
        "diff": "diff",
        "hist": "ist",
        "hide": "Zuppentar",
        "undeleteviewlink": "contemplar",
        "undeleteinvert": "Invertar la selecziun",
        "undeletecomment": "Motiv:",
-       "undeletedrevisions": "Restituì {{PLURAL:$1|1 versiun|$1 versiuns}}",
-       "undeletedrevisions-files": "Restituì {{PLURAL:$1|1 versiun|$1 versiuns}} e {{PLURAL:$2|1 datoteca|$2 datotecas}}",
-       "undeletedfiles": "Restituì {{PLURAL:$1|1 datoteca|$1 datotecas}}",
        "cannotundelete": "Errur cun restaurar:\n$1",
        "undeletedpage": "'''$1 è vegnì restaurà'''\n\nConsultescha il [[Special:Log/delete|protocol d'eliminaziuns]] per retschaiver ina survista da las ultimas paginas stizzadas u restauradas.",
        "undelete-header": "Legia il [[Special:Log/delete|protocol d'eliminaziuns]] per retschaiver ina survista da las ultimas paginas stizzadas u restauradas.",
        "logentry-rights-rights-legacy": "$1 ha {{GENDER:$2|midà}} la commembranza da gruppas per $3",
        "logentry-rights-autopromote": "$1 è vegnì {{GENDER:$2|promovì|promovida}} automaticamain da $4 a $5",
        "rightsnone": "(nagins)",
-       "revdelete-summary": "resumaziun da la midada",
        "feedback-adding": "Agiuntar il resun a la pagina…",
        "feedback-bugcheck": "Grondius! Controllescha simplamain che quai n'è betg gia in da las [$1 errurs enconuschentas].",
        "feedback-bugnew": "Jau hai controllà. Rapportar ina nova errur.",
        "feedback-thanks": "Grazia! Tes resun è vegnì publitgà sin la pagina \"[$2 $1]\".",
        "searchsuggest-search": "Tschertgar",
        "searchsuggest-containing": "cuntegna…",
-       "api-error-badaccess-groups": "Ti na dastgas betg chargiar datotecas en quest wiki.",
        "api-error-badtoken": "Errur interna: Token fauss.",
-       "api-error-copyuploaddisabled": "La funcziun da transferir dad ina URL è deactivada sin quest server.",
-       "api-error-duplicate": "I dat gia {{PLURAL:$1|ina autra datoteca|autras datotecas}} cun il medem cuntegn.",
-       "api-error-duplicate-archive": "I deva gia {{PLURAL:$1|ina autra datoteca|autras datotecas}} cun il medem cuntegn, {{PLURAL:$1|quella è dentant vegnida stizzada|quellas èn dentant vegnidas stizzadas}}.",
-       "api-error-empty-file": "La datoteca tramessa è vida.",
        "api-error-emptypage": "Crear paginas novas e vidas n'è betg lubì.",
-       "api-error-fetchfileerror": "Errur interna: Insatge n'ha betg funcziunà durant retschaiver la datoteca.",
-       "api-error-fileexists-forbidden": "Ina datoteca cun il num \"$1\" exista gia e na po betg vegnir remplazzada.",
-       "api-error-fileexists-shared-forbidden": "Ina datoteca cun il num \"$1\" exista gia en il repository communabel e na po betg vegnir remplazzada.",
-       "api-error-file-too-large": "La datoteca che ti has tramess era memia gronda.",
-       "api-error-filename-tooshort": "Il num da datoteca è memia curt.",
-       "api-error-filetype-banned": "Quest tip da datoteca è scumandà.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|n'è betg in tip da datoteca lubì|n'èn betg tips da datoteca lubids}}. Lubidas èn datotecas {{PLURAL:$3|dal tip|dals tips}} $2.",
-       "api-error-filetype-missing": "Il num da datoteca n'ha betg ina finiziun da datoteca.",
-       "api-error-hookaborted": "La midada che ti has empruvà da far è vegnida interrutta dad ina extensiun.",
-       "api-error-http": "Errur interna: Impussibel da connectar cun il server.",
-       "api-error-illegal-filename": "Il num da datoteca n'è betg lubì.",
-       "api-error-internal-error": "Errur interna: Insatge n'ha betg funcziunà durant transmetter tia datoteca en la vichi.",
-       "api-error-invalid-file-key": "Errur interna: La datoteca n'è betg vegnida chattada en la memoria temporara.",
-       "api-error-missingparam": "Errur interna: Parameters da la dumonda manchants.",
-       "api-error-missingresult": "Errur interna: I na pudeva betg vegnir constatà sch'il process da copiar è reussì.",
-       "api-error-mustbeloggedin": "Ti stos esser t'annunzià per pudair transferir datotecas.",
-       "api-error-mustbeposted": "Errur interna: La dumonda basegna HTTP POST.",
-       "api-error-noimageinfo": "La datoteca è vegnida transferida cun success, ma il server n'ha returnà naginas infurmaziuns davart la datoteca.",
-       "api-error-nomodule": "Errur interna: Nagin modul per chargiar si è definì.",
-       "api-error-ok-but-empty": "Errur interna: Nagina resposta dal server.",
-       "api-error-overwrite": "Recuvrir (surscriver) ina daoteca existenta n'è betg lubì.",
        "api-error-stashfailed": "Errur interna: Errur cun memorisar la datoteca temporara.",
-       "api-error-timeout": "Il server n'ha betg respundì entaifer il temp spetgà.",
-       "api-error-unclassified": "Ina errur nunenconuschenta è capitada.",
-       "api-error-unknown-code": "Errur nunenconuschenta: \"$1\"",
-       "api-error-unknown-error": "Errur interna: Insatge n'ha betg funcziunà durant transferir tia datoteca.",
        "api-error-unknown-warning": "Avertiment nunenconuschent: \"$1\".",
        "api-error-unknownerror": "Errur nunenconuschenta: \"$1\".",
-       "api-error-uploaddisabled": "La funcziun da chargiar datotecas sin quest vichi è deactivada.",
-       "api-error-verification-error": "Questa datoteca pudess esser corrupta ni avair ina extensiun faussa.",
        "duration-seconds": "$1 {{PLURAL:$1|secunda|secundas}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minutas}}",
        "duration-hours": "$1 {{PLURAL:$1|ura|uras}}",
index fe972e0..313aef4 100644 (file)
        "rcshowhideanons": "$1 bijangle jene",
        "rcshowhidepatr": "$1 dikhle paruvimata",
        "rcshowhidemine": "$1 mire editisaripena",
-       "rclinks": "Dikh le palutne $1 paruvimata andar le palutne $2 divesa.<br />$3",
+       "rclinks": "Dikh le palutne $1 paruvimata andar le palutne $2 divesa.",
        "diff": "ververipen",
        "hist": "puranipen",
        "hide": "garav",
index 814f123..98a1316 100644 (file)
@@ -30,7 +30,9 @@
                        "Wintereu",
                        "Rsocol",
                        "Nemo bis",
-                       "Turbojet"
+                       "Turbojet",
+                       "Stephanecbisson",
+                       "Matrafox"
                ]
        },
        "tog-underline": "Sublinierea legăturilor:",
        "searcharticle": "Du-te",
        "history": "Istoricul paginii",
        "history_short": "Istoric",
+       "history_small": "istoric",
        "updatedmarker": "actualizat de la ultima mea vizită",
        "printableversion": "Versiune de tipărit",
        "permalink": "Legătură permanentă",
        "views": "Vizualizări",
        "toolbox": "Unelte",
        "tool-link-userrights": "Schimbă grupurile {{GENDER:$1|utilizatorului|utilizatoarei}}",
+       "tool-link-userrights-readonly": "Vezi grupurile {{GENDER:$1|utilizatorului|utilizatoarei}}",
        "tool-link-emailuser": "Trimiteți un mesaj {{GENDER:$1|acestui utilizator|acestei utilizatoare}}",
        "userpage": "Vizualizați pagina utilizatorului",
        "projectpage": "Vizualizați pagina proiectului",
        "redirectedfrom": "(Redirecționat de la $1)",
        "redirectpagesub": "Pagină de redirecționare",
        "redirectto": "Redirecționare către:",
-       "lastmodifiedat": "Ultima modificare a paginii efectuată la $1, ora $2.",
+       "lastmodifiedat": "Ultima editare a paginii a fost efectuată la $1, ora $2.",
        "viewcount": "Pagina a fost accesată {{PLURAL:$1|o dată|de $1 ori|de $1 de ori}}.",
        "protectedpage": "Pagină protejată",
        "jumpto": "Salt la:",
        "login": "Autentificare",
        "login-security": "Verificați-vă identitatea",
        "nav-login-createaccount": "Creare cont / Autentificare",
-       "userlogin": "Creare cont / Autentificare",
-       "userloginnocreate": "Autentificare",
        "logout": "Închidere sesiune",
        "userlogout": "Închide sesiunea",
        "notloggedin": "Nu sunteți autentificat",
        "userlogin-noaccount": "Nu aveți cont încă?",
        "userlogin-joinproject": "Înscrieți-vă la {{SITENAME}}",
-       "nologin": "Nu aveți cont încă? $1.",
-       "nologinlink": "Creați-vă un cont de utilizator acum",
        "createaccount": "Creare cont",
-       "gotaccount": "Aveți deja un cont de utilizator? '''$1'''.",
-       "gotaccountlink": "Autentificați-vă",
-       "userlogin-resetlink": "Ați uitat datele de autentificare?",
        "userlogin-resetpassword-link": "V-ați uitat parola?",
        "userlogin-helplink2": "Ajutor la autentificare",
        "userlogin-loggedin": "Sunteți deja {{GENDER:$1|autentificat|autentificată}} ca {{GENDER:$1|$1}}.\nUtilizați formularul de mai jos pentru a vă autentifica cu alt nume de utilizator.",
        "createaccountmail": "Utilizează o parolă temporară aleasă la întâmplare și o trimite la adresa de e-mail indicată",
        "createaccountmail-help": "Poate fi folosit pentru a crea un cont pentru o altă persoană fără a cunoaște parola.",
        "createacct-realname": "Nume real (opțional)",
-       "createaccountreason": "Motiv:",
        "createacct-reason": "Motiv",
        "createacct-reason-ph": "De ce creați un alt cont",
        "createacct-reason-help": "Mesaj care apare în jurnalul de creare a conturilor",
        "eauthentsent": "Un e-mail de confirmare a fost trimis către adresa specificată.\nÎnainte ca orice alt e-mail să mai fie trimis către acel cont, trebuie să urmați instrucțiunile prezente în e-mail pentru a confirma că acest cont este într-adevăr al dumneavoastră.",
        "throttled-mailpassword": "Un e-mail pentru resetarea parolei a fost deja trimis în {{PLURAL:$1|ultima oră|ultimele $1 ore|ultimele $1 de ore}}. Pentru a preveni abuzul, se va trimite doar un e-mail de resetare a parolei la un interval de o {{PLURAL:$1|o oră|$1 ore|$1 de ore}}.",
        "mailerror": "Eroare la trimitere e-mail: $1",
-       "acct_creation_throttle_hit": "De la această adresă IP, vizitatorii sitului au creat {{PLURAL:$1|1 cont|$1 conturi|$1 de conturi}} de utilizator în ultimele zile, acest număr de noi conturi fiind maximul admis în această perioadă de timp.\nPrin urmare, vizitatorii care folosesc același IP nu mai pot crea alte conturi pentru moment.",
+       "acct_creation_throttle_hit": "De la această adresă IP, vizitatorii sitului au creat {{PLURAL:$1|1 cont|$1 conturi|$1 de conturi}} de utilizator în ultimele $2, acest număr de noi conturi fiind maximul admis în această perioadă de timp.\nPrin urmare, vizitatorii care folosesc același IP nu mai pot crea alte conturi pentru moment.",
        "emailauthenticated": "Adresa de e-mail a fost autentificată pe $2, la $3.",
        "emailnotauthenticated": "Adresa dumneavoastră de e-mail nu este autentificată încă. Nici un e-mail nu va fi trimis pentru nici una din întrebuințările următoare.",
        "noemailprefs": "Nu a fost specificată o adresă email, următoarele nu vor funcționa.",
        "botpasswords-label-delete": "Șterge",
        "botpasswords-label-resetpassword": "Resetează parola",
        "botpasswords-label-grants": "Permisiuni aplicabile:",
+       "botpasswords-help-grants": "Granturile permit accesul la drepturile deținute deja de contul dvs. de utilizator. Activarea unui grant nu oferă acces la niciunul dintre drepturile pe care contul dvs. de utilizator nu ar avea altfel. Consultați [[Special:ListGrants|table of grants]] pentru mai multe informații.",
        "botpasswords-label-grants-column": "Permise",
        "botpasswords-bad-appid": "Numele de robot „$1” nu este valid.",
+       "botpasswords-insert-failed": "Eroare adăugare nume bot \"$1\". A fost adăugat deja?",
+       "botpasswords-update-failed": "Updatare nume bot $1 eșuat. A fost șters?",
        "botpasswords-created-title": "Parola de robot a fost creată",
+       "botpasswords-created-body": "Parola bot pentru bot nume \"$1\" a utilizatorului \"$2\" a fost creată.",
+       "botpasswords-updated-title": "Parola de robot a fost actualizată",
+       "botpasswords-updated-body": "Parola bot pentru bot nume \"$1\" a utilizatorului \"$2\" a fost actualizată.",
+       "botpasswords-deleted-title": "Parola de bot a fost ștearsă",
+       "botpasswords-deleted-body": "Parola bot pentru bot nume \"$1\" a utilizatorului \"$2\" a fost stearsă.",
+       "botpasswords-newpassword": "Noua parolă pentru autentificare cu <strong>$1</strong> este <strong>$2</strong>. <em>Salvați-l pentru utilizări ulterioare.</em><br>(Pentru roboți mai vechi, care necesită ca numele de autentificare să fie același cu numele de utilizator, puteți utiliza și <strong>$3</strong> ca nume de utilizator și <strong>$4</strong> ca parolă.)",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider nu este disponibil.",
+       "botpasswords-restriction-failed": "Restricțiile privind parola botului împiedică această conectare.",
+       "botpasswords-invalid-name": "Numele de utilizator specificat nu conține separatorul de parole pentru bot (\"$1\").",
+       "botpasswords-not-exist": "Utilizatorul \"$1\" nu are un bot de parole numit \"$2\".",
        "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.",
        "passwordreset-emailelement": "Nume de utilizator: \n$1\n\nParolă temporară: \n$2",
        "passwordreset-emailsentemail": "Dacă această adresă de e-mail este asociată contului dumneavoastră, atunci se va trimite un e-mail de resetare a parolei.",
        "passwordreset-emailsentusername": "Dacă există o adresă de e-mail asociată acestui nume de utilizator, atunci se va trimite un e-mail de resetare a parolei.",
+       "passwordreset-nocaller": "Un apelator trebuie furnizat",
+       "passwordreset-nosuchcaller": "Apelatorul nu există: $1",
+       "passwordreset-ignored": "Nu s-a putut efectua resetarea parolei. Probabil nu a fost configurat un furnizor?",
        "passwordreset-invalidemail": "Adresă de e-mail nevalidă",
        "passwordreset-nodata": "Nu au fost furnizate un nume de utilizator sau o adresă de e-mail",
        "changeemail": "Modificare sau înlăturare adresă de e-mail",
        "preview": "Previzualizare",
        "showpreview": "Previzualizare",
        "showdiff": "Afișare diferențe",
-       "blankarticle": "<strong>Atenție:</strong> Pagina pe care o creați este goală.\nDacă faceți din nou clic pe „{{int:savearticle}}”, pagina va fi creată fără niciun conținut.",
+       "blankarticle": "<strong>Atenție:</strong> Pagina pe care o creați este goală.\nDacă faceți din nou clic pe „$1”, pagina va fi creată fără niciun conținut.",
        "anoneditwarning": "<strong>Atenție:</strong> Nu v-ați autentificat. Adresa dumneavoastră IP va fi vizibilă în mod public dacă efectuați modificări. Dacă vă <strong>[$1 autentificați]</strong> sau vă <strong>[$2 creați un cont]</strong>, modificările dumneavoastră vor fi asociate numelui de utilizator, pe lângă alte beneficii.",
        "anonpreviewwarning": "''Nu v-ați autentificat. Dacă salvați pagina adresa dumneavoastră IP va fi înregistrată în istoric.''",
        "missingsummary": "'''Atenție:''' Nu ați completat caseta „descriere modificări”. Dacă apăsați din nou butonul „salvează pagina” modificările vor fi salvate fără descriere.",
-       "selfredirect": "<strong>Atenție:</strong> Sunteți pe cale să redirecționați această pagină către ea însăși.\nProbabil ați greșit ținta redirecționării sau ați modificat pagina greșită.\nDacă apăsați din nou pe „{{int:savearticle}}”, redirecționarea va fi creată oricum.",
+       "selfredirect": "<strong>Atenție:</strong> Sunteți pe cale să redirecționați această pagină către ea însăși.\nProbabil ați greșit ținta redirecționării sau ați modificat pagina greșită.\nDacă apăsați din nou pe „$1”, redirecționarea va fi creată oricum.",
        "missingcommenttext": "Vă rugăm să introduceți un comentariu.",
-       "missingcommentheader": "<strong>Atenție:</strong> nu ați adăugat niciun titlu sau subiect la acest comentariu.\nDacă dați din nou clic pe „{{int:savearticle}}” modificarea va fi salvată fără titlu.",
+       "missingcommentheader": "<strong>Atenție:</strong> nu ați adăugat niciun titlu sau subiect la acest comentariu.\nDacă dați din nou clic pe „$1” modificarea va fi salvată fără titlu.",
        "summary-preview": "Previzualizare descriere:",
        "subject-preview": "Previzualizare subiect/titlu:",
        "previewerrortext": "A survenit o eroare ca urmare a tentativei de previzualizare a modificărilor dumneavoastră.",
        "blockedtitle": "Utilizatorul este blocat",
        "blockedtext": "'''Adresa IP sau contul dumneavoastră de utilizator a fost blocat.'''\n\nBlocarea a fost făcută de $1.\nMotivul blocării este ''$2''.\n\n* Începutul blocării: $8\n* Sfârșitul blocării: $6\n* Utilizatorul vizat: $7\n\nÎl puteți contacta pe $1 sau pe alt [[{{MediaWiki:Grouppage-sysop}}|administrator]] pentru a discuta blocarea.\nNu puteți folosi opțiunea 'trimite un e-mai utilizatorului' decât dacă o adresă de e-mail validă este specificată în [[Special:Preferences|preferințele contului]] și nu sunteți blocat la folosirea ei.\nAdresa dumneavoastră IP curentă este $3, iar ID-ul blocării este $5. Vă rugăm să includeți oricare sau ambele informații în orice interogări.",
        "autoblockedtext": "Această adresă IP a fost blocată automat deoarece a fost folosită de către un alt utilizator, care a fost blocat de $1.\nMotivul blocării este:\n\n:''$2''\n\n* Începutul blocării: $8\n* Sfârșitul blocării: $6\n* Intervalul blocării: $7\n\nPuteți contacta pe $1 sau pe unul dintre ceilalți [[{{MediaWiki:Grouppage-sysop}}|administratori]] pentru a discuta blocarea.\n\nNu veți putea folosi opțiunea de \"trimite e-mail\" decât dacă aveți înregistrată o adresă de e-mail validă la [[Special:Preferences|preferințe]] și nu sunteți blocat la folosirea ei.\n\nAveți adresa IP $3, iar identificatorul dumneavoastră de blocare este $5.\nVă rugăm să includeți detaliile de mai sus în orice interogări pe care le faceți.",
+       "systemblockedtext": "Numele de utilizator sau adresa IP a fost blocat automat de MediaWiki.\nMotivul indicat este:\n\n:<em>$2</em>\n\n\n* Începutul blocării: $8\n* Expirarea blocării: $6\n* Utilizatorul vizat: $7\n\nAdresa IP curentă a dumneavoastră este $3.\nVă rugăm să includeți toate detaliile de mai sus în orice interogare pe care o veți faceți.",
        "blockednoreason": "nici un motiv oferit",
        "whitelistedittext": "Trebuie să vă $1 pentru a putea modifica pagini.",
        "confirmedittext": "Trebuie să vă confirmați adresa de e-mail înainte de a edita pagini. Vă rugăm să vă setați și să vă validați adresa de e-mail cu ajutorul [[Special:Preferences|preferințelor utilizatorului]].",
        "accmailtext": "O parolă generată aleator pentru [[User talk:$1|$1]] a fost trimisă la $2. Parola poate fi schimbată după autentificare din pagina ''[[Special:ChangePassword|schimbare parolă]]''.",
        "newarticle": "(Nou)",
        "newarticletext": "Ați încercat să ajungeți la o pagină care nu există. Pentru a o crea, începeți să scrieți în caseta de mai jos (vedeți [$1 pagina de ajutor] pentru mai multe informații). Dacă ați ajuns aici din greșeală, întoarceți-vă folosind controalele navigatorului dumneavoastră.",
-       "anontalkpagetext": "---- ''Aceasta este pagina de discuții pentru un utilizator care nu și-a creat un cont încă, sau care nu s-a autentificat.\nDe aceea trebuie să folosim adresă IP pentru a identifica această persoană.\nO adresă IP poate fi folosită în comun de mai mulți utilizatori.\nDacă sunteți un astfel de utilizator și credeți că vă sunt adresate mesaje irelevante, vă rugăm să [[Special:CreateAccount|vă creați un cont]] sau să [[Special:UserLogin|vă autentificați]] pentru a evita confuzii cu alți utilizatori anonimi în viitor.''",
+       "anontalkpagetext": "----\n''Aceasta este pagina de discuții pentru un utilizator care încă nu și-a creat un cont sau care nu s-a autentificat.\nPrin urmare trebuie să folosim adresa IP pentru a identifica această persoană.\nO adresă IP poate fi folosită în comun de mai mulți utilizatori.\nDacă sunteți un astfel de utilizator și credeți că vă sunt adresate mesaje irelevante, vă rugăm să [[Special:CreateAccount|vă creați un cont]] sau să [[Special:UserLogin|vă autentificați]] pentru a evita confuzii cu alți utilizatori anonimi în viitor.''",
        "noarticletext": "Actualmente, această pagină este lipsită de conținut.\nPuteți [[Special:Search/{{PAGENAME}}|căuta titlul acestei pagini]] în alte pagini, puteți <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} căuta înregistrări în jurnalele relevante]\nsau puteți [{{fullurl:{{FULLPAGENAME}}|action=edit}} crea această pagină]</span>.",
        "noarticletext-nopermission": "Actualmente, această pagină este lipsită de conținut.\nPuteți [[Special:Search/{{PAGENAME}}|căuta acest titlu]] în alte pagini sau puteți <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} căuta înregistrări în jurnale]</span>; nu aveți însă permisiunea de a crea această pagină.",
        "missing-revision": "Versiunea nr. $1 a paginii „{{FULLPAGENAME}}” nu există.\n\nAcest lucru se întâmplă de obicei atunci când se accesează o legătură expirată către istoricul unei pagini șterse.\nDetalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
        "userpage-userdoesnotexist": "Contul de utilizator „<nowiki>$1</nowiki>” nu este înregistrat.\nAsigurați-vă că doriți să creați/modificați această pagină.",
        "userpage-userdoesnotexist-view": "Contul de utilizator „$1” nu este înregistrat.",
        "blocked-notice-logextract": "Acest utilizator este momentan blocat.\nUltima intrare în jurnalul blocărilor este afișată mai jos pentru referință:",
-       "clearyourcache": "'''Notă:''' După salvare, trebuie să treceți peste memoria cache a navigatorului pentru a putea vedea modificările:\n* '''Firefox / Safari:''' țineți apăsat pe ''Shift'' în timp ce faceți clic pe ''Reîncărcare'', ori apăsați ''Ctrl-F5'' sau ''Ctrl-R'' (''⌘-R'' pe un sistem Mac);\n* '''Google Chrome:''' apăsați ''Ctrl-Shift-R'' (''⌘-Shift-R'' pe un sistem Mac);\n* '''Internet Explorer:''' țineți apăsat pe ''Ctrl'' în timp ce faceți clic pe ''Reîmprospătare'' sau apăsați ''Ctrl-F5'';\n* '''Opera:''' curățați memoria cache din ''Unelte → Preferințe''.",
+       "clearyourcache": "<strong>Notă:</strong> După salvare, trebuie să treceți peste memoria cache a navigatorului pentru a putea vedea modificările:\n* <strong>Firefox / Safari:</strong> țineți apăsat pe <em>Shift</em> în timp ce faceți clic pe <em>Reîncărcare</em> ori apăsați <em>Ctrl-F5</em> sau <em>Ctrl-R</em> (<em>⌘-R</em> pe un sistem Mac);\n* <strong>Google Chrome:</strong> apăsați <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> pe un sistem Mac);\n* <strong>Internet Explorer:</strong> țineți apăsat pe <em>Ctrl</em> în timp ce faceți clic pe ''Reîmprospătare'' sau apăsați <em>Ctrl-F5</em>;\n* <strong>Opera:</strong> Mergeți la <em>Meniu → Setări</em> (<em>Opera → Preferințe</em> pe un sistem Mac) și apoi la <em>Confidențialitate & securitate → Șterge istoricul de navigare → Imagini și fișiere memorate în cache</em>.",
        "usercssyoucanpreview": "'''Sfat:''' Folosiți butonul „{{int:showpreview}}” pentru a testa noul CSS înainte de a-l salva.",
        "userjsyoucanpreview": "'''Sfat:''' Folosiți butonul „{{int:showpreview}}” pentru a testa noul JavaScript înainte de a-l salva.",
        "usercsspreview": "'''Rețineți că vizualizați doar o previzualizare a CSS-ului dumneavoastră de utilizator.'''\n'''Acesta nu a fost încă salvat!'''",
        "previewnote": "'''Țineți cont că aceasta este doar o previzualizare.'''\nModificările dumneavoastră nu au fost încă salvate!",
        "continue-editing": "Mergi la zona de editare",
        "previewconflict": "Această pre-vizualizare reflectă textul din caseta de sus, respectiv felul în care va arăta articolul dacă alegeți să-l salvați acum.",
-       "session_fail_preview": "'''Ne pare rău! Nu am putut procesa modificarea dumneavoastră din cauza pierderii datelor sesiunii.\nVă rugăm să încercați din nou.\nDacă tot nu funcționează, încercați să [[Special:UserLogout|închideți sesiunea]] și să vă autentificați din nou.'''",
-       "session_fail_preview_html": "'''Ne pare rău! Modificările dvs. nu au putut fi procesate din cauza pierderii datelor sesiunii.'''\n\n''Deoarece {{SITENAME}} are activat HTML brut, previzualizarea este ascunsă ca măsură de precauție împotriva atacurilor JavaScript.''\n\n'''Dacă această încercare de modificare este legitimă, vă rugăm să încercați din nou. Dacă nu funcționează nici în acest fel, [[Special:UserLogout|închideți sesiunea]] și încearcați să vă autentificați din nou.'''",
+       "session_fail_preview": "Ne pare rău! Nu am putut procesa modificarea dumneavoastră din cauza pierderii datelor sesiunii.\n\nEste posibil să vă fi deconectat. <strong>Vă rugăm să verificați dacă sunteți încă conectat și să încercați din nou</strong>.\nDacă tot nu funcționează, încercați să [[Special:UserLogout|închideți sesiunea]] și să vă autentificați din nou. Verificați și dacă navigatorul dumneavoastră permite module cookie de la acest site.",
+       "session_fail_preview_html": "Ne pare rău! Modificările dvs. nu au putut fi procesate din cauza pierderii datelor sesiunii.\n\n<em>Deoarece {{SITENAME}} are activat HTML brut, previzualizarea este ascunsă ca măsură de precauție împotriva atacurilor JavaScript.</em>\n\n<strong>Dacă această încercare de modificare este legitimă, vă rugăm să încercați din nou. Dacă nu funcționează nici în acest fel, [[Special:UserLogout|închideți sesiunea]] și încercați să vă autentificați din nou. Verificați și dacă navigatorul dumneavoastră permite module cookie de la acest site</strong>.",
        "token_suffix_mismatch": "'''Modificarea ta a fost refuzată pentru că clientul tău a deformat caracterele de punctuatie în modificarea semnului.\nModificarea a fost respinsă pentru a preveni deformarea textului paginii.\nAcest fapt se poate întâmpla atunci când folosești un serviciu proxy anonim.'''",
        "edit_form_incomplete": "'''Unele părți ale formularului de modificare nu au ajuns la server; verificați dacă modificările dumneavoastră sunt intacte și reîncercați.'''",
        "editing": "Modificare „$1”",
        "editingsection": "modificare $1 (secțiune)",
        "editingcomment": "Modificare $1 (secțiune nouă)",
        "editconflict": "Conflict de modificare: $1",
-       "explainconflict": "Altcineva a modificat această pagină de când ați început editarea.\nZona de text din partea de sus conține pagina așa cum este ea acum (după editarea celeilalte persoane).\nModificările dumneavoastră sunt afișate în zona de text inferioară.\nVa trebui să vă uniți modificările cu textul deja existent.\n<strong>Doar</strong> textul din zona de text superioară va fi salvat atunci când veți apăsa „{{int:savearticle}}”.",
+       "explainconflict": "Altcineva a modificat această pagină de când ați început editarea.\nZona de text din partea de sus conține ultima versiune.\nModificările dumneavoastră sunt afișate în zona de text inferioară.\nVa trebui să integrați modificările în textul existent.\n<strong>Doar</strong> textul din zona superioară va fi salvat atunci când veți apăsa \"$1\".",
        "yourtext": "Textul dumneavoastră",
        "storedversion": "Versiunea curentă",
        "nonunicodebrowser": "'''Atenție: Navigatorul dumneavoastră nu este compatibil cu Unicode.'''\nÎn schimb, există o soluție care vă permite să modificați paginile în siguranță: caracterele non-ASCII vor fi afișate în caseta de editare drept coduri hexazecimale.",
        "readonlywarning": "<strong>Atenție: Baza de date a fost blocată pentru întreținere, deci nu veți putea salva modificările în acest moment.</strong>\nPuteți copia textul într-un fișier text, păstrându-l pentru mai târziu.\n\nAdministratorul de sistem care a efectuat blocarea a oferit următoarea explicație: $1",
        "protectedpagewarning": "'''Atenție: această pagină a fost protejată astfel încât poate fi modificată doar de către administratori.'''\nUltima intrare în jurnal este afișată mai jos pentru referință:",
        "semiprotectedpagewarning": "'''Observație: această pagină a fost protejată și poate fi modificată doar de către utilizatorii înregistrați.'''\nUltima intrare în jurnal este afișată mai jos pentru referință:",
-       "cascadeprotectedwarning": "<strong>Atenție:</strong> Această pagină a fost protejată, astfel încât numai administratorii o pot modifica, fiind inclusă în {{PLURAL:$1|următoarea pagină protejată|următoarele pagini protejate}} în cascadă:",
+       "cascadeprotectedwarning": "<strong>Atenție:</strong> Această pagină a fost protejată, astfel încât numai [[Special:ListGroupRights|utilizatori cu drepturi specifice]] o pot modifica, fiind inclusă în {{PLURAL:$1|următoarea pagină protejată|următoarele pagini protejate}} în cascadă:",
        "titleprotectedwarning": "'''Atenție: această pagină a fost protejată astfel încât doar anumiți [[Special:ListGroupRights|utilizatori]] o pot crea.'''\nUltima intrare în jurnal este afișată mai jos pentru referință:",
        "templatesused": "{{PLURAL:$1|Format folosit|Formate folosite}} în această pagină:",
        "templatesusedpreview": "{{PLURAL:$1|Format folosit|Formate folosite}} în această previzualizare:",
        "invalid-content-data": "Date de conținut invalide",
        "content-not-allowed-here": "Conținutul de tip „$1” nu este permis pe pagina [[$2]]",
        "editwarning-warning": "Părăsind această pagină, există riscul pierderii modificărilor efectuate.\nDacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „{{int:prefs-editing}}” a preferințelor dumneavoastră.",
+       "editpage-invalidcontentmodel-title": "Modelul de conținut nu este suportat",
+       "editpage-invalidcontentmodel-text": "Modelul de conținut \"$1\" nu este acceptat.",
        "editpage-notsupportedcontentformat-title": "Formatul conținutului nu este acceptat",
        "editpage-notsupportedcontentformat-text": "Formatul de conținut $1 nu este acceptat de modelul de conținut $2.",
        "content-model-wikitext": "wikitext",
        "content-model-css": "CSS",
        "content-json-empty-object": "Obiect vid",
        "content-json-empty-array": "Matrice vidă",
+       "deprecated-self-close-category": "Pagini care utilizează taguri HTML cu auto-închidere invalide",
+       "deprecated-self-close-category-desc": "Pagina conține taguri HTML auto-închise invalide, cum ar fi <code>&lt;b/></code> sau <code>&lt;span/></code>.  \nComportamentul acestora se va schimba în curând pentru a fi în concordanță cu specificația HTML5, astfel încât utilizarea lor în wikitext este depreciată.",
        "duplicate-args-warning": "<strong>Atenție:</strong> [[:$1]] apelează [[:$2]] cu mai mult de o valoare pentru parametrul „$3”. Se va lua în calcul doar ultima valoare specificată.",
        "duplicate-args-category": "Pagini care folosesc argumente duplicate în apelarea formatelor",
        "duplicate-args-category-desc": "Pagina conține apelări ale formatelor care folosesc argumente duplicate, cum ar fi <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> sau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "post-expand-template-argument-warning": "Atenție: Această pagină conține cel puțin un argument al unui format care are o mărime prea mare atunci când este expandat.\nAcsete argumente au fost omise.",
        "post-expand-template-argument-category": "Pagini care conțin formate cu argumente omise",
        "parser-template-loop-warning": "Buclă de formate detectată: [[$1]]",
+       "template-loop-category": "Pagini cu bucle de șabloane",
+       "template-loop-category-desc": "Pagina conține o buclă de șabloane, adică un șablon care se autoapelează recursiv.",
        "parser-template-recursion-depth-warning": "Limită de adâncime a recursiei depășită ($1)",
        "language-converter-depth-warning": "Limita adâncimii convertorului de limbă a fost depășită ($1)",
        "node-count-exceeded-category": "Pagini unde numărul de noduri este depășit",
        "page_first": "prima",
        "page_last": "ultima",
        "histlegend": "Legendă: (actuală) = diferențe față de versiunea curentă,\n(prec) = diferențe față de versiunea precedentă, M = modificare minoră",
-       "history-fieldset-title": "Răsfoire istoric",
-       "history-show-deleted": "Doar șterse",
+       "history-fieldset-title": "Caută versiuni anterioare",
+       "history-show-deleted": "Doar versiuni șterse",
        "histfirst": "cele mai vechi",
        "histlast": "cele mai noi",
        "historysize": "({{PLURAL:$1|1 octet|$1 octeți|$1 de octeți}})",
        "mergehistory-fail-no-change": "Unificarea istoricului nu a unit nicio versiune. Verificați din nou pagina și parametrii temporali.",
        "mergehistory-fail-permission": "Permisiuni insuficiente pentru a uni istoricul.",
        "mergehistory-fail-self-merge": "Paginile sursă și destinație sunt identice.",
+       "mergehistory-fail-timestamps-overlap": "Revizuirile sursă se suprapun sau vin după revizuirile destinației.",
        "mergehistory-fail-toobig": "Nu s-a putut efectua unirea istoricelor întrucât s-ar fi depășit limita de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}} mutat{{PLURAL:$1|ă|e}}.",
        "mergehistory-no-source": "Pagina sursă $1 nu există.",
        "mergehistory-no-destination": "Pagina de destinație $1 nu există.",
        "search-file-match": "(se regăsește în conținutul fișierului)",
        "search-suggest": "V-ați referit la: $1",
        "search-rewritten": "Se afișează rezultatele pentru $1. Căutați, în schimb, după $2.",
-       "search-interwiki-caption": "Proiecte înrudite",
+       "search-interwiki-caption": "Rezultate din proiecte înrudite",
        "search-interwiki-default": "Rezultate de la $1:",
        "search-interwiki-more": "(mai mult)",
+       "search-interwiki-more-results": "Mai multe rezultate",
        "search-relatedarticle": "Relaționat",
        "searchrelated": "relaționat",
        "searchall": "toate",
        "search-external": "Căutare externă",
        "searchdisabled": "<p>Ne pare rău! Căutarea după text a fost dezactivată temporar, din motive de performanță. Între timp puteți folosi căutarea prin Google mai jos, însă aceasta poate să dea rezultate învechite.</p>",
        "search-error": "A apărut o eroare în timpul căutării: $1",
+       "search-warning": "A apărut o eroare în timpul căutării: $1",
        "preferences": "Preferințe",
        "mypreferences": "Preferințe",
        "prefs-edits": "Număr de modificări:",
        "prefs-help-recentchangescount": "Sunt incluse schimbările recente, istoricul paginilor și jurnalele.",
        "prefs-help-watchlist-token2": "Aceasta este cheia secretă pentru fluxul web al listei dumneavoastră de pagini urmărite.\nOricine o cunoaște vă va putea citi lista de pagini urmărite, așa că n-o partajați cu nimeni.\n[[Special:ResetTokens|Faceți clic aici dacă doriți să o resetați]].",
        "savedprefs": "Preferințele dumneavoastră au fost salvate.",
-       "savedrights": "Drepturile utilizatorului {{GENDER:$1|$1}} au fost salvate.",
+       "savedrights": "Grupurile utilizatorului {{GENDER:$1|$1}} au fost salvate.",
        "timezonelegend": "Fus orar:",
        "localtime": "Ora locală:",
        "timezoneuseserverdefault": "Folosește ora implicită a wikiului ($1)",
        "youremail": "Adresă de e-mail:",
        "username": "{{GENDER:$1|Nume de utilizator}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membru|Membră}} în {{PLURAL:$1|grupul|grupurile}}:",
+       "group-membership-link-with-expiry": "$1 (până la $2)",
        "prefs-registration": "Data înregistrării:",
        "yourrealname": "Nume real:",
        "yourlanguage": "Interfață în limba:",
        "prefs-help-prefershttps": "Această preferință va avea efect la următoarea autentificare.",
        "prefswarning-warning": "Ați efectuat modificări asupra preferințelor dumneavoastră, care nu au fost încă salvate.\nDacă părăsiți această pagină fără a apăsa butonul „$1”, preferințele dumnevoastră nu se vor actualiza.",
        "prefs-tabs-navigation-hint": "Sfat: Puteți folosi tastele săgeată stânga și dreapta pentru a naviga între filele din cadrul listei de file.",
-       "userrights": "Administrare permisiuni de utilizator",
-       "userrights-lookup-user": "Administrare grupuri de utilizatori",
+       "userrights": "Permisiuni utilizator",
+       "userrights-lookup-user": "Selectați un utilizator",
        "userrights-user-editname": "Introduceți un nume de utilizator:",
-       "editusergroup": "Modificare grup de {{GENDER:$1|utilizatori}}",
+       "editusergroup": "Încărcare grupuri utilizatori",
        "editinguser": "Modificarea permisiunilor de {{GENDER:$1|utilizator}} pentru <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Modificare grup de utilizatori",
+       "viewinguserrights": "Vizualizarea permisiunilor de utilizator ale {{GENDER:$1|utilizatorului|utilizatoarei}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Modificare grupuri {{GENDER:$1|utilizator}}",
+       "userrights-viewusergroup": "Vezi grupurile {{GENDER:$1|utilizatorului|utilizatoarei}}",
        "saveusergroups": "Salvează grupul de {{GENDER:$1|utilizatori}}",
        "userrights-groupsmember": "Membru al:",
        "userrights-groupsmember-auto": "Membru, implicit, al:",
-       "userrights-groups-help": "Puteți schimba grupul căruia îi aparține utilizatorul:\n*Căsuța bifată înseamnă că utilizatorul aparține grupului respectiv.\n*Căsuța nebifată înseamnă că utilizatorul nu aparține grupului respectiv.\n*Steluța (*) indică faptul că utilizatorul nu poate fi eliminat din grup odată adăugat, sau invers.",
+       "userrights-groups-help": "Puteți schimba grupul căruia îi aparține utilizatorul:\n*Căsuța bifată înseamnă că utilizatorul aparține grupului respectiv.\n*Căsuța nebifată înseamnă că utilizatorul nu aparține grupului respectiv.\n*Steluța (*) indică faptul că utilizatorul nu poate fi eliminat din grup odată adăugat, sau invers.\n* (#) indică faptul că puteti modifica data de expirare in trecut pentru acest grup o singură datăș data poate fi modificată doar in viitor.",
        "userrights-reason": "Motiv:",
        "userrights-no-interwiki": "Nu aveți permisiunea de a modifica permisiunile utilizatorilor pe alte wiki.",
        "userrights-nodatabase": "Baza de date $1 nu există sau nu este locală.",
        "userrights-changeable-col": "Grupuri pe care le puteți schimba",
        "userrights-unchangeable-col": "Grupuri pe care nu le puteți schimba",
+       "userrights-expiry-current": "Expiră pe $1",
+       "userrights-expiry-none": "Nu expiră",
+       "userrights-expiry": "Expiră:",
+       "userrights-expiry-existing": "Data expirării: $2, $3",
+       "userrights-expiry-othertime": "Alt termen:",
+       "userrights-expiry-options": "1 oră:1 hour, 1 zi:1 day, 1 săptămână:1 week, 1 lună:1 month, 3 luni:3 months, 6 luni:6 months, 1 an:1 year",
+       "userrights-invalid-expiry": "Timpul de expirare pentru grupul \"$1\" este invalid",
+       "userrights-expiry-in-past": "Timpul de expirare pentru grupul \"$1\" este în trecut",
+       "userrights-cannot-shorten-expiry": "Nu puteți să evidențiați data de expirare a calității de membru în grupul \"$1\". Numai utilizatorii cu permisiunea de a adăuga și elimina acest grup pot aduce timpii de expirare înainte.",
        "userrights-conflict": "Conflict al schimbării drepturilor de utilizator! Reverificați și confirmați-vă modificările.",
        "group": "Grup:",
        "group-user": "Utilizatori",
        "right-createpage": "Creează pagini (altele decât pagini de discuție)",
        "right-createtalk": "Creează pagini de discuție",
        "right-createaccount": "Creează conturi noi",
+       "right-autocreateaccount": "Conectați-vă cu un cont extern de utilizator",
        "right-minoredit": "Marchează modificările minore",
        "right-move": "Redenumește paginile",
        "right-move-subpages": "Redenumește paginile cu tot cu subpagini",
        "right-editsemiprotected": "Modifică pagini protejate ca „{{int:protect-level-autoconfirmed}}”",
        "right-editcontentmodel": "Modifică modelul de conținut al unei pagini",
        "right-editinterface": "Modifică interfața cu utilizatorul",
-       "right-editusercssjs": "Modifică fișierele CSS și JS ale altor utilizatori",
        "right-editusercss": "Modifică fișierele CSS ale altor utilizatori",
        "right-edituserjs": "Modifică fișierele JS ale altor utilizatori",
        "right-editmyusercss": "Modificați-vă propriile fișiere CSS",
        "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-watchlist-interaction": "Interacționează cu lista de urmăriri",
        "grant-group-email": "Trimite e-mail",
+       "grant-group-high-volume": "Efectuați activitate de volum mare",
+       "grant-group-customization": "Personalizare și preferințe",
+       "grant-group-administration": "Efectuați acțiuni administrative",
+       "grant-group-private-information": "Accesați date confidențiale despre dv.",
+       "grant-group-other": "Activități diverse",
+       "grant-blockusers": "Blocare și deblocare utilizatori",
        "grant-createaccount": "Creare conturi",
        "grant-createeditmovepage": "Creează, editează și redenumește pagini",
+       "grant-delete": "Șterge pagini, revizii și loguri",
+       "grant-editinterface": "Editați spațiul de nume MediaWiki și CSS/JavaScript de utilizator",
+       "grant-editmycssjs": "Editați CSS/JavaScript ale contului dv.",
+       "grant-editmyoptions": "Modificați-vă preferințele de utilizator",
+       "grant-editmywatchlist": "Modificați-vă lista de pagini urmărite",
+       "grant-editpage": "Editați pagini existente",
+       "grant-editprotected": "Editați pagini protejate",
        "grant-highvolume": "Volum mare de editare",
        "grant-oversight": "Ascunde utilizatori și suprimă versiuni",
        "grant-patrol": "Patrulează schimbările paginilor",
+       "grant-privateinfo": "Accesați informații confidențiale",
+       "grant-protect": "Protejați și deprotejați pagini",
+       "grant-rollback": "Reveniți asupra modificărilor paginilor",
+       "grant-sendemail": "Trimite-ți e-mail altor utilizatori",
+       "grant-uploadeditmovefile": "Încărcați, înlocuiți și mutați fișiere",
+       "grant-uploadfile": "Încărcați fișiere noi",
        "grant-basic": "Drepturi de bază",
+       "grant-viewdeleted": "Vizualizați fișierele și paginile șterse",
        "grant-viewmywatchlist": "Vezi lista de pagini urmărite",
+       "grant-viewrestrictedlogs": "Vedeți intrările restricționate din jurnal",
        "newuserlogpage": "Jurnal utilizatori noi",
        "newuserlogpagetext": "Acesta este jurnalul creărilor conturilor de utilizator.",
        "rightslog": "Jurnal permisiuni de utilizator",
        "action-createpage": "creați această pagină",
        "action-createtalk": "creați această pagină de discuție",
        "action-createaccount": "creați acest cont de utilizator",
+       "action-autocreateaccount": "Creați automat acest cont extern de utilizator",
        "action-history": "vizualizați istoricul acestei pagini",
        "action-minoredit": "marcați această modificare ca minoră",
        "action-move": "redenumiți această pagină",
        "action-upload_by_url": "încărcați acest fișier de la o adresă URL",
        "action-writeapi": "utilizați scrierea prin API",
        "action-delete": "ștergeți această pagină",
-       "action-deleterevision": "ștergeți această versiune",
+       "action-deleterevision": "ștergeți versiunile",
        "action-deletelogentry": "ștergeți înregistrări din jurnal",
        "action-deletedhistory": "vizualizați istoricul șters a unei pagini",
+       "action-deletedtext": "vizualizați textul versiunii șterse",
        "action-browsearchive": "căutați pagini șterse",
        "action-undelete": "recuperați această pagină",
        "action-suppressrevision": "revizuiți și să restaurați versiuni ascunse",
        "action-userrights-interwiki": "modificați permisiunile utilizatorilor de pe alte wiki",
        "action-siteadmin": "blocați sau deblocați baza de date",
        "action-sendemail": "trimite e-mailuri",
+       "action-editmyoptions": "Modificați-vă preferințele",
        "action-editmywatchlist": "vă modificați lista de pagini urmărite",
        "action-viewmywatchlist": "vă vizualizați lista de pagini urmărite",
        "action-viewmyprivateinfo": "vă vizualizați informațiile personale",
        "action-applychangetags": "aplicați etichete asociate modificărilor dumneavoastră",
        "action-changetags": "adăugați și să înlăturați etichete arbitrare din versiuni și intrări de jurnal individuale",
        "action-deletechangetags": "ștergeți etichete din baza de date",
+       "action-purge": "curățați cache-ul acestei pagini",
        "nchanges": "$1 {{PLURAL:$1|modificare|modificări|de modificări}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|de la ultima vizită}}",
        "enhancedrc-history": "istoric",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedeți și [[Special:NewPages|lista cu pagini noi]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Afișează",
+       "rcfilters-activefilters": "Filtre active",
+       "rcfilters-quickfilters": "Legături rapide",
+       "rcfilters-quickfilters-placeholder": "Salvați setările de instrumente preferate pentru a le reutiliza mai târziu.",
+       "rcfilters-savedqueries-defaultlabel": "Filtre salvate",
+       "rcfilters-savedqueries-rename": "Redenumește",
+       "rcfilters-savedqueries-setdefault": "Setează ca predefinit",
+       "rcfilters-savedqueries-unsetdefault": "Eliminați ca implicit",
+       "rcfilters-savedqueries-remove": "Elimină",
+       "rcfilters-savedqueries-new-name-label": "Nume",
+       "rcfilters-savedqueries-apply-label": "Crează un link rapid",
+       "rcfilters-savedqueries-cancel-label": "Anulare",
+       "rcfilters-savedqueries-add-new-title": "Salvați filtrele ca un link rapid",
+       "rcfilters-restore-default-filters": "Restaurați filtrele prestabilite",
+       "rcfilters-clear-all-filters": "Ștergeți toate filtrele",
+       "rcfilters-search-placeholder": "Filtrați modificările recente (răsfoiți sau începeți să tastați)",
+       "rcfilters-invalid-filter": "Filtru invalid",
+       "rcfilters-empty-filter": "Nu există filtre active. Toate contribuțiile sunt afișate.",
+       "rcfilters-filterlist-title": "Filtre",
+       "rcfilters-filterlist-whatsthis": "Ce este aceasta?",
+       "rcfilters-filterlist-feedbacklink": "Oferiți feedback cu privire la noile filtre (beta)",
+       "rcfilters-highlightbutton-title": "Evidențiați rezultatele",
+       "rcfilters-highlightmenu-title": "Selectați o culoare",
+       "rcfilters-highlightmenu-help": "Selectați o culoare pentru a evidenția această proprietate",
+       "rcfilters-filterlist-noresults": "Nu s-a găsit niciun filtru",
+       "rcfilters-noresults-conflict": "Nu s-au găsit rezultate deoarece criteriile de căutare sunt în conflict",
+       "rcfilters-state-message-subset": "Acest filtru nu are efecte deoarece rezultatele sale sunt incluse în filtrele cu selectie mai largă {{PLURAL:$2|filtru|filtre}} (încercați să subliniați pentru a o deosebi): $1",
+       "rcfilters-state-message-fullcoverage": "Selectarea tuturor filtrelor dintr-un grup este aceeași cu cea selectată, astfel încât acest filtru nu are efect. Grupul include: $1",
+       "rcfilters-filtergroup-registration": "Înregistrare utilizator",
+       "rcfilters-filter-registered-label": "Înregistrat",
+       "rcfilters-filter-registered-description": "Editorii conectați.",
+       "rcfilters-filter-unregistered-label": "Neînregistrat",
+       "rcfilters-filter-unregistered-description": "Editorii care nu sunt conectați.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Acest filtru contravine {{PLURAL:$2|filtru|filtre}} de Experiență, care {{PLURAL:$2|găsesc|gasește}} doar userii inreistrați: $1",
+       "rcfilters-filtergroup-authorship": "Contribuția autorului",
+       "rcfilters-filter-editsbyself-label": "Modificările tale",
+       "rcfilters-filter-editsbyself-description": "Contribuțiile tale.",
+       "rcfilters-filter-editsbyother-label": "Contribuțiile altora",
+       "rcfilters-filter-editsbyother-description": "Toate modificările mai puțin ale tale.",
+       "rcfilters-filtergroup-userExpLevel": "Nivel de experiență (numai pentru utilizatorii înregistrați)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Filtrele Experiență găsesc numai utilizatori înregistrați, deci acest filtru este în conflict cu filtrul \"Înregistrat\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filtrul \"Înregistrat\" ​​este în conflict cu unul sau mai multe filtre Experiență, care găsește numai utilizatorii înregistrați. Filtrele conflictuale sunt marcate în zona Filtre active, de mai sus.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nou veniți",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Mai puțin de 10 editări și 4 zile de activitate.",
+       "rcfilters-filter-user-experience-level-learner-label": "Cursanți",
+       "rcfilters-filter-user-experience-level-learner-description": "Mai multă experiență decât \"Noi veniți\" dar mai puțină decât \"Useri experimentați\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Utilizatori experimentați",
+       "rcfilters-filter-user-experience-level-experienced-description": "Mai mult de 30 de zile de activitate și 500 de editări.",
+       "rcfilters-filtergroup-automated": "Contribuții automate",
+       "rcfilters-filter-bots-label": "Robot",
+       "rcfilters-filter-bots-description": "Modificări făcute cu unelte automate.",
+       "rcfilters-filter-humans-label": "Om (nu robot)",
+       "rcfilters-filter-humans-description": "Modificări făcute de oameni.",
+       "rcfilters-filtergroup-reviewstatus": "Revizuiți starea",
+       "rcfilters-filter-patrolled-label": "Patrulate",
+       "rcfilters-filter-patrolled-description": "Editări marcate ca patrulate.",
+       "rcfilters-filter-unpatrolled-label": "Nepatrulate",
+       "rcfilters-filter-unpatrolled-description": "Modificări marcate ca nepatrulate.",
+       "rcfilters-filtergroup-significance": "Semnificație",
+       "rcfilters-filter-minor-label": "Modificări minore",
+       "rcfilters-filter-minor-description": "Modificări pe care autorul le-a marcat ca fiind minore.",
+       "rcfilters-filter-major-label": "Modificări non-minore",
+       "rcfilters-filter-major-description": "Modificări care nu sunt etichetate ca minore.",
+       "rcfilters-filtergroup-watchlist": "Pagini urmărite de dv.",
+       "rcfilters-filter-watchlist-watched-label": "Listă de urmărire",
+       "rcfilters-filter-watchlist-watched-description": "Modificări are paginilor urmărite de dv.",
+       "rcfilters-filter-watchlist-watchednew-label": "Modificari ale listei urmărite de dv.",
+       "rcfilters-filter-watchlist-watchednew-description": "Modificările paginilor care nu au fost vizitate de la efectuarea modificărilor.",
+       "rcfilters-filter-watchlist-notwatched-label": "Care nu sunt pe lista urmărită de dv.",
+       "rcfilters-filter-watchlist-notwatched-description": "Totul, cu excepția modificărilor aduse paginilor dvs. vizionate.",
+       "rcfilters-filtergroup-changetype": "Tipul modificării",
+       "rcfilters-filter-pageedits-label": "Editări ale paginii",
+       "rcfilters-filter-pageedits-description": "Editări ale conținutului wiki, discuții, descrieri de categorii...",
+       "rcfilters-filter-newpages-label": "Creare de pagini",
+       "rcfilters-filter-newpages-description": "Modificări care creează pagini noi.",
+       "rcfilters-filter-categorization-label": "Modificări de categorie",
+       "rcfilters-filter-categorization-description": "Înregistrări ale paginilor adăugate sau eliminate din categorii.",
+       "rcfilters-filter-logactions-label": "Acțiuni logate",
+       "rcfilters-filter-logactions-description": "Acțiuni administrative, creare de conturi, ștergere de pagini, încărcări...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filtrul \"Modificări minore\" se află în conflict cu unul sau mai multe filtre de tipul \"Modificare\", deoarece anumite tipuri de schimbări nu pot fi desemnate ca \"minore\". Filtrele conflictuale sunt marcate în zona Filtre Active, de mai sus.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Anumite tipuri de schimbări nu pot fi desemnate ca fiind \"minore\", astfel că acest filtru este în conflict cu următoarele filtre de Tip de schimbare: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Acest tip de filtrare a tipului de schimbare este în conflict cu filtrul \"Modificări minore\". Anumite tipuri de schimbări nu pot fi desemnate ca fiind \"minore\".",
+       "rcfilters-filtergroup-lastRevision": "Ultima revizie",
+       "rcfilters-filter-lastrevision-label": "Ultima revizie",
+       "rcfilters-filter-lastrevision-description": "Cea mai recentă modificare a unei pagini.",
+       "rcfilters-filter-previousrevision-label": "Versiuni recente",
+       "rcfilters-filter-previousrevision-description": "Toate modificările care nu sunt cea mai recentă modificare a unei pagini.",
        "rcnotefrom": "Dedesubt {{PLURAL:$5|se află o modificare|sunt modificările}} începând cu <b>$3, $4</b> (maximum <b>$1</b> afișate).",
-       "rclistfrom": "Se afișează modificările începând cu $3, $2",
+       "rclistfromreset": "Resetați selectarea datei",
+       "rclistfrom": "Afișează modificările începând cu $3, ora $2",
        "rcshowhideminor": "$1 modificările minore",
        "rcshowhideminor-show": "Arată",
        "rcshowhideminor-hide": "Ascunde",
        "rcshowhidecategorization": "$1 categorisirea paginilor",
        "rcshowhidecategorization-show": "Arată",
        "rcshowhidecategorization-hide": "Ascunde",
-       "rclinks": "Se arată ultimele $1 modificări din ultimele $2 zile.<br />\n$3",
+       "rclinks": "Se arată ultimele $1 modificări din ultimele $2 zile.",
        "diff": "dif",
        "hist": "ist",
        "hide": "Ascunde",
        "file-thumbnail-no": "Numele fișierului începe cu <strong>$1</strong>.\nSe pare că este o imagine cu dimensiune redusă''(thumbnail)''.\nDacă ai această imagine la rezoluție mare încarc-o pe aceasta, altfel schimbă numele fișierului.",
        "fileexists-forbidden": "Un fișier cu acest nume există deja și nu poate fi rescris.\nMergeți înapoi și încărcați acest fișier sub un nume nou. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Un fișier cu acest nume există deja în magazia de imagini comune; mergeți înapoi și încărcați fișierul sub un nou nume. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Încărcarea este un duplicat exact al versiunii curente <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "Încărcarea este un duplicat exact al {{PLURAL:$2|versiunii vechi|versiunilor vechi}} a <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Acest fișier este dublura {{PLURAL:$1|fișierului|fișierelor}}:",
        "file-deleted-duplicate": "Un fișier identic cu acesta ([[:$1]]) a fost șters anterior. Verificați istoricul ștergerilor fișierului înainte de a-l reîncărca.",
        "file-deleted-duplicate-notitle": "Un fișier identic cu acesta a fost șters anterior, iar titlul a fost suprimat.\nAr trebui să contactați pe cineva care poate vizualiza datele suprimate ale fișierului pentru a evalua situația înainte de a începe să-l reîncărcați.",
        "php-uploaddisabledtext": "Încărcarea de fișiere este dezactivată în PHP.\nVă rugăm să verificați setările din file_uploads.",
        "uploadscripted": "Fișierul conține HTML sau cod script care poate fi interpretat în mod eronat de un browser.",
        "upload-scripted-pi-callback": "Nu se poate încărca un fișier care conține instrucțiuni de procesare a foii de stil XML.",
+       "upload-scripted-dtd": "Nu se pot încărca fișiere SVG care conțin o declarație DTD neconformă cu standardul.",
        "uploaded-script-svg": "S-a găsit elementul „$1” scriptabil în fișierul SVG încărcat.",
        "uploaded-hostile-svg": "S-a descoperit CSS vulnerabil în elementul de stil al fișierului SVG încărcat.",
        "uploaded-event-handler-on-svg": "Setarea atributelor <code>$1=„$2”</code> de gestionare a evenimentului nu este permisă pentru fișierele SVG.",
-       "uploaded-href-unsafe-target-svg": "S-a găsit href către o destinație nesigură <code>&lt;$1 $2=„$3”&gt;</code> în fișierul SVG încărcat.",
+       "uploaded-href-attribute-svg": "Atributele href din fișierele SVG au permisiunea de a se conecta numai la adrese destinație http:// sau https://, dar a fost găsit <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "S-a găsit href către informații nesigure: destinație URI <code>&lt;$1 $2=„$3”&gt;</code> în fișierul SVG încărcat.",
        "uploaded-animate-svg": "S-a găsit în fișierul SVG încărcat eticheta „animate” care ar putea modifica valoarea href folosind atributul „from” <code>&lt;$1 $2=„$3”&gt;</code>.",
        "uploaded-setting-event-handler-svg": "Setarea atributelor de gestionare a evenimentului nu este permisă; s-a găsit <code>&lt;$1 $2=„$3”&gt;</code> în fișierul SVG încărcat.",
        "uploaded-setting-href-svg": "Este blocată utilizarea etichetei „set” pentru a adăuga atributul „href” în elementul-părinte.",
        "upload-too-many-redirects": "URL-ul conținea prea multe redirecționări",
        "upload-http-error": "A avut loc o eroare HTTP: $1",
        "upload-copy-upload-invalid-domain": "Încărcarea copiilor nu este disponibilă pentru acest domeniu.",
+       "upload-foreign-cant-upload": "Acest wiki nu este configurat pentru a încărca fișiere în depozitul  de fișiere străin solicitat.",
        "upload-dialog-title": "Încărcare fișier",
        "upload-dialog-button-cancel": "Revocare",
+       "upload-dialog-button-back": "Înapoi",
        "upload-dialog-button-done": "Realizat",
        "upload-dialog-button-save": "Salvare",
        "upload-dialog-button-upload": "Încarcă",
        "backend-fail-read": "Imposibil de citit fișierul $1.",
        "backend-fail-create": "Imposibil de scris fișierul $1.",
        "backend-fail-maxsize": "Nu s-a putut scrie fișierul $1 pentru că acesta este mai mare de {{PLURAL:$2|un octet|$2 octeți|$2 de octeți}}.",
-       "backend-fail-readonly": "Suportul de stocare „$1” este în prezent doar în citire. Motivul dat este: „''$2''”",
+       "backend-fail-readonly": "Suportul de stocare \"$1\" este în prezent doar în citire. Motivul dat este: <em>$2</em>",
        "backend-fail-synced": "Fișierul „$1” este într-o stare de inconsistență în suporturile de stocare internă",
        "backend-fail-connect": "Imposibil de conectat la suportul de stocare „$1”.",
        "backend-fail-internal": "O eroare necunoscută s-a produs în suportul de stocare „$1”.",
        "uploadstash-summary": "Această pagină oferă acces la fișierele care sunt încărcate sau sunt în curs de încărcare, dar nu sunt încă publicate pe wiki. Aceste fișiere nu sunt vizibile nimănui, cu excepția celui care le-a încărcat.",
        "uploadstash-clear": "Șterge fișierele din depozitul temporar",
        "uploadstash-nofiles": "Nu aveți fișiere în depozitul temporar.",
-       "uploadstash-badtoken": "Execuția acestei acțiuni nu a reușit, probabil deoarece informațiile dumneavoastră de identificare au expirat. Încercați din nou.",
+       "uploadstash-badtoken": "Execuția acestei acțiuni nu a reușit, probabil deoarece informațiile dumneavoastră de identificare au expirat. Vă rugăm să încercați din nou.",
        "uploadstash-errclear": "Golirea fișierelor nu a reușit.",
        "uploadstash-refresh": "Reîmprospătează lista de fișiere",
        "uploadstash-thumbnail": "arată miniatura",
        "filerevert-submit": "Revenire",
        "filerevert-success": "'''[[Media:$1|$1]]''' a fost readus [la versiunea $4 din $3, $2].",
        "filerevert-badversion": "Nu există o versiune mai veche a fișierului care să corespundă cu data introdusă.",
+       "filerevert-identical": "Versiunea curentă a fișierului este identică cu cea selectată.",
        "filedelete": "Șterge $1",
        "filedelete-legend": "Șterge fișierul",
        "filedelete-intro": "Sunteți pe cale să ștergeți fișierul '''[[Media:$1|$1]]''' cu tot istoricul acestuia.",
        "apisandbox-sending-request": "Se trimite solicitarea API...",
        "apisandbox-loading-results": "Se obțin rezultatele API...",
        "apisandbox-results-error": "A apărut o eroare la încărcarea răspunsului solicitării API: $1.",
+       "apisandbox-request-selectformat-label": "Afișați datele de solicitare ca:",
        "apisandbox-request-url-label": "URL cerere:",
        "apisandbox-request-time": "Durata cererii: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Corectează jetonul și retrimite",
        "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ă",
+       "apisandbox-continue-clear": "Curăță",
+       "apisandbox-multivalue-all-namespaces": "$1 (Toate namespaces)",
+       "apisandbox-multivalue-all-values": "$1 (Toate valorile)",
        "booksources": "Surse de cărți",
        "booksources-search-legend": "Căutare surse pentru cărți",
        "booksources-search": "Caută",
        "undeleteviewlink": "vezi",
        "undeleteinvert": "Exclude spațiul",
        "undeletecomment": "Motiv:",
-       "undeletedrevisions": "{{PLURAL:$1|o versiune restaurată|$1 versiuni restaurate|$1 de versiuni restaurate}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|O versiune|$1 versiuni|$1 de versiuni}} și {{PLURAL:$2|un fișier|$2 fișiere|$2 de fișiere}} recuperate",
-       "undeletedfiles": "{{PLURAL:$1|O versiune recuperată|$1 versiuni recuperate|$1 de versiuni recuperate}}",
        "cannotundelete": "Recuperarea a eșuat:\n$1",
        "undeletedpage": "'''$1 a fost recuperat'''\n\nConsultați [[Special:Log/delete|jurnalul ștergerilor]] pentru a vedea toate ștergerile și recuperările recente.",
        "undelete-header": "Consultați [[Special:Log/delete|jurnalul de ștergeri]] pentru paginile șterse recent.",
        "unblocked-id": "Blocarea $1 a fost eliminată",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] a fost deblocat.",
        "blocklist": "Utilizatori blocați",
+       "autoblocklist": "Blocări automate",
+       "autoblocklist-submit": "Caută",
+       "autoblocklist-empty": "Lista blocărilor automate este goală.",
        "ipblocklist": "Utilizatori blocați",
        "ipblocklist-legend": "Găsire utilizator blocat",
        "blocklist-userblocks": "Ascunde conturile blocate",
        "tooltip-ca-nstab-category": "Vezi categoria",
        "tooltip-minoredit": "Marchează această modificare ca fiind minoră",
        "tooltip-save": "Salvați modificările dumneavoastră",
+       "tooltip-publish": "Publică modificările tale",
        "tooltip-preview": "Previzualizați-vă modificările. Vă rugăm să faceți acest lucru înainte de a salva pagina.",
        "tooltip-diff": "Afișează modificările pe care le-ați efectuat asupra textului",
        "tooltip-compareselectedversions": "Vezi diferențele între cele două versiuni selectate de pe această pagină.",
        "pageinfo-length": "Lungimea paginii (în octeți)",
        "pageinfo-article-id": "ID pagină",
        "pageinfo-language": "Limba conținutului paginii",
+       "pageinfo-language-change": "modificare",
        "pageinfo-content-model": "Modelul conținutului paginii",
+       "pageinfo-content-model-change": "modificare",
        "pageinfo-robot-policy": "Indexare de către roboți",
        "pageinfo-robot-index": "Permisă",
        "pageinfo-robot-noindex": "Nepermisă",
        "pageinfo-category-pages": "Număr de pagini",
        "pageinfo-category-subcats": "Număr de subcategorii",
        "pageinfo-category-files": "Număr de fișiere",
+       "pageinfo-user-id": "ID utilizator",
        "markaspatrolleddiff": "Marchează pagina ca verificată",
        "markaspatrolledtext": "Marchează această pagină ca verificată",
        "markaspatrolledtext-file": "Marchează această versiune a fișierului ca verificată",
        "patrol-log-header": "Aceasta este o listă a tuturor versiunilor marcate ca verificate.",
        "log-show-hide-patrol": "$1 jurnalul versiunilor verificate",
        "log-show-hide-tag": "$1 jurnal etichete",
+       "confirm-markpatrolled-button": "OK",
        "deletedrevision": "A fost ștearsă vechea versiune $1.",
        "filedeleteerror-short": "Eroare la ștergerea fișierului: $1",
        "filedeleteerror-long": "Au apărut erori când se încerca ștergerea fișierului:\n\n$1",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|a actualizat}} etichetele pentru versiunea $4 a paginii $3 ({{PLURAL:$7|adăugat}} $6; {{PLURAL:$9|șters}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|a actualizat}} etichetele intrării din jurnal $5 a paginii $3 ({{PLURAL:$7|adăugat}} $6; {{PLURAL:$9|șters}} $8)",
        "rightsnone": "(niciunul)",
-       "revdelete-summary": "descrierea modificărilor",
        "feedback-adding": "Se adaugă părerea pe pagină...",
        "feedback-back": "Înapoi",
        "feedback-bugcheck": "Minunat! Trebuie doar să verificați dacă nu cumva problema a fost [$1 deja înregistrată].",
        "feedback-thanks": "Mulțumim! Comentariile dumneavoastră au fost publicate pe pagina „[ $2  $1 ]”.",
        "feedback-thanks-title": "Mulțumim!",
        "feedback-useragent": "Agent utilizator:",
-       "searchsuggest-search": "Căutare",
+       "searchsuggest-search": "Căutare în {{SITENAME}}",
        "searchsuggest-containing": "conținând...",
        "api-error-badtoken": "Eroare internă: jeton greșit.",
        "api-error-emptypage": "Crearea paginilor noi, goale nu este permisă.",
index a58a9db..d6f2b73 100644 (file)
        "searcharticle": "Véje",
        "history": "Storie d'a pàgene",
        "history_short": "Cunde",
+       "history_small": "cunde",
        "updatedmarker": "aggiornate da l'urtema visita meje",
        "printableversion": "Versione ca se stambe",
        "permalink": "Collegamende ca remane pe sembre",
        "redirectedfrom": "(Riderette da $1)",
        "redirectpagesub": "Pàgene de redirezione",
        "redirectto": "Redirezione sus a:",
-       "lastmodifiedat": "Sta pàgene a state cangete l'urtema vote da $1, alle $2.",
+       "lastmodifiedat": "Sta pàgene ha state cangiate l'urtema vote 'u $1, a le $2.",
        "viewcount": "Sta pàggene ha state viste {{PLURAL:$1|'na vote|$1 vote}}.",
        "protectedpage": "Pàgene prutette",
        "jumpto": "Zumbe a:",
        "virus-scanfailed": "condrolle fallite (codece $1)",
        "virus-unknownscanner": "antivirus scanusciute:",
        "logouttext": "'''Tu tè scollegate.'''\n\nNote Bbuene ca certe pàggene ponne condinuà a essere viste cumme ce tu ste angore collegate, fine a quanne a cache d'u browser no se sdevache.",
+       "cannotlogoutnow-title": "Non ge puè assè mò",
+       "cannotlogoutnow-text": "Non ge puè assè quanne ste ause $1.",
        "welcomeuser": "Bovègne, $1!",
        "welcomecreation-msg": "'U cunde tue ha state ccrejete.\nNo te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze tue]].",
        "yourname": "Nome utende:",
        "userlogin-remembermypassword": "Arrecuèrdeme",
        "userlogin-signwithsecure": "Ause 'na connessione secure",
        "cannotlogin-title": "Non ge puè trasé",
+       "cannotlogin-text": "Non ge puè trasè.",
+       "cannotloginnow-title": "Non ge puè trasè mò",
        "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.",
        "login": "Tràse",
+       "login-security": "Verifiche l'idendità toje",
        "nav-login-createaccount": "Tràse / Reggistrete",
-       "userlogin": "Tràse / Reggistrete",
-       "userloginnocreate": "Tràse",
        "logout": "Isse",
        "userlogout": "Isse",
        "notloggedin": "Non ge sì colleghete",
        "userlogin-noaccount": "Non ge tìne 'nu cunde?",
        "userlogin-joinproject": "Tràse jndr'à {{SITENAME}}",
-       "nologin": "Non ge tine n'utenze? '''$1'''.",
-       "nologinlink": "Ccreje 'nu cunde utende",
        "createaccount": "Ccreje 'nu cunde",
-       "gotaccount": "Tine già 'nu cunde? '''$1'''.",
-       "gotaccountlink": "Tràse",
-       "userlogin-resetlink": "T'è scurdate le dettaglie pe trasè?",
        "userlogin-resetpassword-link": "T'è scurdate 'a passuord toje?",
        "userlogin-helplink2": "Aijute cu 'a trasute",
        "userlogin-loggedin": "Tu ste jndre ggià cumme a {{GENDER:$1|$1}}.\nAuse 'u module aqquà sotte pe trasè cumme a 'n'otre utende.",
        "createacct-another-email-ph": "Mitte l'indirizze email",
        "createaccountmail": "Ause 'na passuord temboranèe a uecchije e mannale a l'indirizze email specificate",
        "createacct-realname": "Nome vere (opzionale)",
-       "createaccountreason": "Mutive:",
        "createacct-reason": "Mutive",
        "createacct-reason-ph": "Purcé tu ste ccreje 'n'otre cunde utende?",
        "createacct-submit": "Ccreje 'u cunde utende tune",
        "createacct-another-submit": "Ccreje 'nu cunde utende",
+       "createacct-continue-submit": "Condinue 'a ccrejazzione de l'utende",
+       "createacct-another-continue-submit": "Condinue 'a ccrejazzione de l'utende",
        "createacct-benefit-heading": "{{SITENAME}} jè fatte da crestiane cumme a te.",
        "createacct-benefit-body1": "{{PLURAL:$1|cangiamende|cangiaminde}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàgene|pàggene}}",
        "botpasswords-label-cancel": "Annulle",
        "botpasswords-label-delete": "Scangìlle",
        "botpasswords-label-resetpassword": "Azzere 'a passuord",
+       "botpasswords-label-grants-column": "Assegnazziune",
+       "botpasswords-created-title": "Passuord d'u bot ccrejate",
+       "botpasswords-updated-title": "Passuord d'u bot cangiate",
+       "botpasswords-deleted-title": "Passuord d'u bot scangellate",
        "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",
        "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 queste éte 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
+       "passwordreset-nocaller": "'Nu chiamande adda essere mise",
+       "passwordreset-nosuchcaller": "'U chiamande nnon g'esiste: $1",
        "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.",
        "preview": "Andeprime",
        "showpreview": "Vide l'andeprime",
        "showdiff": "Fa vedè le cangiaminde",
-       "blankarticle": "<strong>Attenziò:</strong> 'A pàgene ca ste ccreje jè vianghe.\nCe cazze \"{{int:savearticle}}\" arrete, 'a pàgene avène ccrejate vacande.",
+       "blankarticle": "<strong>Attenziò:</strong> 'A pàgene ca ste ccreje jè vianghe.\nCe cazze \"$1\" arrete, 'a pàgene avène ccrejate vacande.",
        "anoneditwarning": "<strong>Attenziò:</strong> Tu non ge sì collegate..\nL'indirizze IP tune avène fatte vedè ce te face de le cangiaminde. Ce tu <strong>[$1 trase]</strong> o <strong>[$2 ccreje 'nu cunde utende]</strong>, le cangiaminde tune avènene attribbuite a 'u nome utende tune, 'nzieme a otre beneficie.",
        "anonpreviewwarning": "''Tu non ge sì collegate. Reggistranne le cangiaminde jndr'à sta pàgene iesse l'indirizze IP tune jndr'à storie.''",
        "missingsummary": "'''Arrecuèrdete:''' Tu non g'è provvedute a 'nu riepileghe de le cangiaminde.\nCe tu cazze Reggistre 'n'otra vote, 'u cangiamende tue avène memorizzete senze une.",
-       "selfredirect": "<strong>Attenziò:</strong> Tu ste redirezione sta pàgene da sule.\nTu puè avè specificate 'a destinazione sbagliate pe stu redirezionamende, o tu ste cange 'a pàgena sbagliate.\nCe tu cazze \"{{int:savearticle}}\" arrete, 'u redirezionamende avène ccrejate 'u stesse.",
+       "selfredirect": "<strong>Attenziò:</strong> Tu ste redirezione sta pàgene da sule.\nTu puè avè specificate 'a destinazione sbagliate pe stu redirezionamende, o tu ste cange 'a pàgena sbagliate.\nCe tu cazze \"$1\" arrete, 'u redirezionamende avène ccrejate 'u stesse.",
        "missingcommenttext": "Pe piacere mitte 'nu commende aqquà sotte.",
-       "missingcommentheader": "<strong>Arrecuèrdete:</strong> Tu non g'è provvedute a 'nu soggette pe stu commende.\nCe tu cazze \"{{int:savearticle}}\" 'n'otra vote, 'u cangiamende tune avène memorizzate senze jidde.",
-       "summary-preview": "Andeprime d'u riepileghe:",
-       "subject-preview": "Andeprime de l'Oggette:",
+       "missingcommentheader": "<strong>Arrecuèrdete:</strong> Tu non g'è provvedute a 'nu soggette pe stu commende.\nCe tu cazze \"$1\" 'n'otra vote, 'u cangiamende tune avène memorizzate senze jidde.",
+       "summary-preview": "Andeprime d'u riepileghe d'u cangiamende:",
+       "subject-preview": "Andeprime de l'oggette:",
        "previewerrortext": "'N'errore ha assute quanne ste facive l'andeprime de le cangiaminde.",
        "blockedtitle": "L'utende è blocchete",
        "blockedtext": "''''U nome de l'utende o l'indirizze IP ha state bloccate.'''\n\n'U blocche ha state fatte da $1.\n'U mutive date jè ''$2''.\n\n* 'U Blocche accumenze: $8\n* 'U Blocche spicce: $6\n* Tipe de blocche: $7\n\nTu puè condatta $1 o n'otre [[{{MediaWiki:Grouppage-sysop}}|amministratore]] pe 'ngazzarte sus a 'u blocche.\nTu non ge puè ausà 'u strumende 'manne 'na mail a stu utende' senza ca mitte n'indirizze e-mail valide jndr'à le\n[[Special:Preferences|preferenze tue]] e ce è state blocchete sus 'a l'use sue.\nL'IP ca tine mò jè $3 e 'u codece d'u blocche jè #$5.\nPe piacere mitte ste doje 'mbormaziune ce manne 'na richieste de sblocche.",
        "previewnote": "'''Arrecuerdete queste è sole 'n'andeprime.'''\nle cangiaminde non g'onne state angore reggistrate!",
        "continue-editing": "Veje jndr'à l'arèe de le cangiaminde",
        "previewconflict": "Sta andeprime fece vedè 'u teste ca ste jndr'à 'u teste de l'area de sus cumme avène fore ce tu decide cu reggistre.",
-       "session_fail_preview": "'''Ne dispiace! Non ge putime processà 'u cangiamende tue purcè s'a perse 'a sessione de le date.\nPe piacere pruève 'n'otra vote.\nCe angore non ge funzione ninde, [[Special:UserLogout|isse]] e tràse 'n'otre vote.'''",
-       "session_fail_preview_html": "'''Ne dispiace! nuje non ge putime processà 'u cangiamende tue purcè è perse 'a sessione de le date.'''\n\n''Purcè {{SITENAME}} tène abbilitate l'HTML grezze, l'andeprime è scunnute cumme precauzione condre a l'attacche cu 'u JavaScript.''\n\n'''Ce quiste jè 'nu tendative corrette de cangiamende, pe piacere prueve 'n'otra vote.'''\nCe angore tìne probbleme, prueve a [[Special:UserLogout|assè]] e te recolleghe 'n'otra vote.",
+       "session_fail_preview": "Ne dispiace! Non ge putime processà 'u cangiamende tue purcè s'a perse 'a sessione de le date.\n\nPò essere ca tu è assute. <strong>Pe piacere condrolle ce tu ste angore jndre e pruève arrete</strong>.\nCe angore non ge funzione ninde, [[Special:UserLogout|isse]] e tràse 'n'otra vote e condrolle ca 'u browser tune pò ausà le cookie sus a stu site.",
+       "session_fail_preview_html": "Ne dispiace! nuje non ge putime processà 'u cangiamende tue purcè è perse 'a sessione de le date.\n\n<em>Purcè {{SITENAME}} tène abbilitate l'HTML grezze, l'andeprime è scunnute cumme precauzione condre a l'attacche cu 'u JavaScript.</em>\n\n<strong>Ce quiste jè 'nu tendative corrette de cangiamende, pe piacere prueve 'n'otra vote.</strong>\nCe angore tìne probbleme, prueve a [[Special:UserLogout|assè]] e te recolleghe 'n'otra vote e condrolle ca 'u browser tune pò ausà le cookie sus a stu site.",
        "token_suffix_mismatch": "''''U cangiamende tue ha state scettate purcè 'u ''client'' tue non ge tène le carattere de le punde jndr'à 'u gettone de cangiamende.'''\n'U cangiamende ha state scettate pe prevenì corruzione d'u teste d'a pàgene.\nCerte vote, stu fatte succede quanne tu ste ause 'nu servizie proxy cu le bochere e anonime.",
        "edit_form_incomplete": "'''Quacche stuèzze d'u module de le cangiaminde non g'ha state ricevute da 'u server; verifeche arrete ca le cangiaminde tune sonde apposte e pruève arrete.'''",
        "editing": "Cangiaminde de $1",
        "editingsection": "Cangiaminde de $1 (sezione)",
        "editingcomment": "Cangiaminde de $1 (seziona nove)",
        "editconflict": "conflitte de cangiaminde: $1",
-       "explainconflict": "Quacchedune otre ha cangete 'a pàgene apprime ca tu accumenzasse a fà 'u cangiamende tue.\n'U teste ca iacchie sus condene 'u teste d'a pàgene accume se iacchije jndr'à stu mumende.\nLe cangiaminde sonde fatte vedè jndr'à vanne de sotte.\nTu puè scuagghià le cangiaminde jndr'à 'u teste de mò.\n'''Sulamende''' 'u teste ca stè sus avène reggistrate cazzanne 'u buttone \"{{int:savearticle}}\".",
+       "explainconflict": "Quacchedune otre ha cangete 'a pàgene apprime ca tu accumenzasse a fà 'u cangiamende tue.\n'U teste ca iacchie sus condene 'u teste d'a pàgene accume se iacchije jndr'à stu mumende.\nLe cangiaminde sonde fatte vedè jndr'à vanne de sotte.\nTu puè scuagghià le cangiaminde jndr'à 'u teste de mò.\n'''Sulamende''' 'u teste ca stè sus avène reggistrate cazzanne 'u buttone \"$1\".",
        "yourtext": "'U teste tue",
        "storedversion": "Versione archivijete",
        "nonunicodebrowser": "'''FA ATTENZIO': 'U browser tue non ge capisce l'unicode.'''\n'Na fatije ste jndr'à stu poste ca te conzende de reggistrà senza probbleme 'a pàgene: le carattere ca non ge sonde ASCII le vide cumme a tanda scatele cumme a codece esadecimale.",
        "copyrightwarning2": "Pe piacere vide ca tutte le condrebbute de {{SITENAME}} ponne essere cangete, alterate o luvete da otre condrebbutore.\nCe tu non ge vuè ca quidde ca scrive avène cangete da tre, allore non scè scrivenne proprie aqquà.<br />\nTu ne stè promitte ca quidde ca scrive tu, o lè scritte cu 'u penziere tue o lè cupiate da risorse de pubbliche dominie o sembre robba libbere (vide $1 pe cchiù dettaglie).\n'''NO REGGISTRA' FATIJE CUPERTE DA 'U COPYRIGHT SENZA PERMESSE! NO FA STUDECARIE!'''",
        "editpage-cannot-use-custom-model": "'U modelle de condenute de sta pàgene non ge pò essere cangiate.",
        "longpageerror": "'''ERRORE: 'U teste ca tu vuè ccu reggistre è luenghe {{PLURAL:$1|'nu kilobyte|$1 kilobyte}}, invece 'u limite massime jè de {{PLURAL:$2|'nu kilobyte|$2 kilobyte}}.'''\nNon ge puè reggistrà sta pàggene.",
-       "readonlywarning": "'''FA ATTENZIO': 'U database ha state bloccate pe manutenzione, e allore tu non ge puè reggistrà le cangiaminde ca ste face mò.'''\nTu puè fa 'na bella cose, tagghie e 'nzicche le cangiaminde jndr'à 'nu file de teste sus a 'u combiuter tune e pò cchiù tarde le reggistre sus 'a Uicchi.\n\nL'amministratore ca ha bloccate 'u database ha date stu mutive: $1",
+       "readonlywarning": "<strong>FA ATTENZIO': 'U database ha state bloccate pe manutenzione, e allore tu non ge puè reggistrà le cangiaminde ca ste face mò.</strong>\nTu puè fa 'na bella cose, tagghie e 'nzicche le cangiaminde jndr'à 'nu file de teste sus a 'u combiuter tune e pò cchiù tarde le reggistre sus 'a Uicchi.\n\nL'amministratore ca ha bloccate 'u database ha date stu mutive: $1",
        "protectedpagewarning": "'''ATTENZIO': Sta pàgene ha state bloccate e allore sulamende le utinde cu le privilegge de ''sysop'' ponne cangiarle.'''\nL'urteme archivie de le trasute ha state previste aqquà sotte pe referimende:",
        "semiprotectedpagewarning": "'''Fà attenzione:''' Sta pàgene ha state bloccate accussì sulamende l'utinde reggistrete ponne fà cangiaminde.\nL'urteme archivije de le trasute ha state previste aqquà sotte pe referimende:",
-       "cascadeprotectedwarning": "<strong>FA ATTENZIO':</strong> Sta pàgene ha state blocchete accussì sulamende l'utinde ca tènene le deritte de amministratore a ponne cangià, purcè inglude {{PLURAL:$1|pàgene|pàggene}} prutette a cascate:",
+       "cascadeprotectedwarning": "<strong>Fa attenziò:</strong> Sta pàgene ha state protette accussì sulamende l'utinde ca tènene le [[Special:ListGroupRights|deritte de amministratore]] a ponne cangià, purcè inglude {{PLURAL:$1|pàgene|pàggene}} prutette a cascate:",
        "titleprotectedwarning": "'''ATTENZIONE: Sta pàgene ha state bloccate accussì sulamende [[Special:ListGroupRights|specifice diritte]] a ponne ccrejà.'''\nL'urteme archivije de le trasute jè provviste sotte pe referimende:",
        "templatesused": "{{PLURAL:$1|Template|Template}} ausate sus 'a sta pàgene:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Template}} ausate jndr'à sta andeprime:",
        "page_first": "prime",
        "page_last": "urteme",
        "histlegend": "Differenze de selezione: signe le radio box de le versiune ca vuè cu combronde e cazze ''invio'' o 'u buttone ca ste sotte.<br />\nLeggenda: (cur) = differenze cu 'a versiona corrende,\n(last) = differenze ca 'a versione precedende, M = cangiaminde stuédeche.",
-       "history-fieldset-title": "Sfogghje 'a storie",
-       "history-show-deleted": "Sule le scangellate",
+       "history-fieldset-title": "cirche pe revisiune",
+       "history-show-deleted": "Sule le revisiune scangellate",
        "histfirst": "Prime",
        "histlast": "Urteme",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "revdelete-unsuppress": "Live le restriziune sus a le revisiune repristinate",
        "revdelete-log": "Mutive:",
        "revdelete-submit": "Applichesce a {{PLURAL:$1|'a revisione|le revisiune}} selezionate",
-       "revdelete-success": "'''Visibbilità de le revisiune aggiornate correttamende.'''",
+       "revdelete-success": "Visibbilità de le revisiune aggiornate.",
        "revdelete-failure": "''' 'A visibbilità de le revisiune non ge pò essere aggiornate:'''\n$1",
-       "logdelete-success": "'''Log visibility successfully set.'''\n'''Visibbilità de l'archivije 'mbostate correttamende.'''",
+       "logdelete-success": "Visibbilità de l'archivije 'mbostate.",
        "logdelete-failure": "'''L'archivije d'a visibbilità non ge pò essere 'mbostate:'''\n$1",
        "revdel-restore": "Cange 'a visibilità",
        "pagehist": "Storie d'a vôsce",
        "search-file-match": "(combronde 'u condenute d'u file)",
        "search-suggest": "Ce signifeche: $1",
        "search-rewritten": "Stoche a fazze 'ndrucà le resultate pe $1. Cirche invece pe $2.",
-       "search-interwiki-caption": "Pruggette sorelle",
+       "search-interwiki-caption": "Resultate da le pruggette sorelle",
        "search-interwiki-default": "Resultate da $1:",
        "search-interwiki-more": "(de cchiù)",
+       "search-interwiki-more-results": "cchiù resultate",
        "search-relatedarticle": "Colleghete",
        "searchrelated": "colleghete",
        "searchall": "tutte",
        "showingresultsinrange": "Stoche a fazze vedè da sotte 'nzigne a {{PLURAL:$1|<strong>1</strong> resultate|<strong>$1</strong> resultate}} jndr'à l'indervalle #<strong>$2</strong> a #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultate <strong>$1</strong> de <strong>$3</strong>|Resultate <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Non ge stonne resultete ca soddisfecene l'inderrogazione.",
+       "search-nonefound-thiswiki": "Non ge stonne resultate ca soddisfane 'a 'nderrogazione jndr'à stu site.",
        "powersearch-legend": "Ricerche avanzete",
        "powersearch-ns": "Cirche jndr'à le namespace:",
        "powersearch-togglelabel": "Verifiche:",
        "search-external": "Ricerche esterne",
        "searchdisabled": "'A ricerche sus a {{SITENAME}} ha state disabbilitete.\nTu puè cercà ausanne Google.\nPerò fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàggene ca non ge sonde aggiornate.",
        "search-error": "S'ha verificate 'n'errore mendre ste cercave: $1",
+       "search-warning": "'N'avvertimende ave assute mendre ca ste cercave: $1",
        "preferences": "Me piece accussì",
        "mypreferences": "Me piace accussì",
        "prefs-edits": "Numere de cangiaminde:",
        "prefs-help-recentchangescount": "Quiste 'nglude le urteme cangiaminde, le storie de le pàggene e le archivije.",
        "prefs-help-watchlist-token2": "Queste jè 'a chiave segrete a le feed d'u web de l'elenghe de le pàggene condrollate tune.\nCengate vò ccu canosce ce pò leggere l'elenghe de le pàggene condrollate tune, accussì non g'ù pò condividere.\n[[Special:ResetTokens|Cazze aqquà ce tìne abbesogne de azzerarle]].",
        "savedprefs": "Le preferenze tue onne state aggiornete.",
+       "savedrights": "Le gruppe utinde de {{GENDER:$1$1}} onne state reggistrate.",
        "timezonelegend": "Orarie d'a zone:",
        "localtime": "Orarie lochele:",
        "timezoneuseserverdefault": "Ause 'u valore de default de uicchi ($1)",
        "username": "{{GENDER:$1|Nome de l'utende}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membre}} {{PLURAL:$1|d'u gruppe|de le gruppe}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 ('nzigne a $2)",
        "prefs-registration": "Orarie de reggistrazzione:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Nome vere:",
        "prefs-help-prefershttps": "Sta preferenze pigghie effette sulamende quanne tràse arrete.",
        "prefswarning-warning": "Tu è fatte cangiaminde sus a le preferenze tune ca non g'onne state angore reggistrate.\nCe tu lasse sta pàgene senze ca è cazzate \"$1\" le preferenze tune non g'avènene aggiornate.",
        "prefs-tabs-navigation-hint": "Conziglie: Tu puè ausà le freccie de destre e sinistre pe navigà 'mbrà le schede de l'elenghe.",
-       "userrights": "Gestione de le deritte utende",
-       "userrights-lookup-user": "Gestisce le gruppe de l'utinde",
+       "userrights": "Deritte utende",
+       "userrights-lookup-user": "Scacchie 'n'utende",
        "userrights-user-editname": "Mitte 'nu nome utende:",
-       "editusergroup": "Cange le gruppe utinde",
+       "editusergroup": "Careche 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-editusergroup": "Cange le gruppe {{GENDER:$1|utinde}}",
+       "userrights-viewusergroup": "'Ndruche le gruppe {{GENDER:$1|utinde}}",
+       "saveusergroups": "Reggistre le gruppe {{GENDER:$1|utinde}}",
        "userrights-groupsmember": "Membre de:",
        "userrights-groupsmember-auto": "Membre imblicite de:",
        "userrights-groups-help": "Tu puè alterà le gruppe addò de st'utende jè iscritte:\n* 'Na spunde de verifiche significhe ca l'utende stè jndr'à stu gruppe.\n* 'A spunda de verifica luate significhe ca l'utende non ge stè jndr'à stu gruppe.\n* 'Nu * significhe ca tu non ge puè luà 'u gruppe 'na vote ca tu l'è aggiunde, o a smerse.",
        "userrights-changeable-col": "Gruppe ca tu puè cangià",
        "userrights-unchangeable-col": "Gruppe ca tu non ge puè cangià",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "Scade 'u $1",
+       "userrights-expiry-none": "Non ge scade",
+       "userrights-expiry": "Scadenze:",
+       "userrights-expiry-existing": "'U tiembe de scadenze esistende: $3, $2",
+       "userrights-expiry-othertime": "Otre tiembe:",
+       "userrights-expiry-options": "1 sciurne:1 day,1 sumàne:1 week,1 mese:1 month,3 mise:3 mise,6 mesi:6 months,1 anne:1 year",
        "userrights-conflict": "Conflitte sus a le cangiaminde de le deritte utende! Pe piacere revide e conferme le cangiaminde tune.",
        "group": "Gruppe:",
        "group-user": "Utinde",
        "right-editsemiprotected": "Cange le pàggene prutette cumme a \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Cange 'u modelle de condenute de 'na pàgene",
        "right-editinterface": "Cange l'inderfacce utende",
-       "right-editusercssjs": "Cange 'u CSS e 'u JS de l'otre utinde",
        "right-editusercss": "Cange 'u CSS de l'otre utinde",
        "right-edituserjs": "Cange 'u JS de l'otre utinde",
        "right-editmyusercss": "Cange le file tune de CSS",
        "rcshowhidemine": "$1 cangiaminde mie",
        "rcshowhidemine-show": "Fà vedè",
        "rcshowhidemine-hide": "Scunne",
-       "rclinks": "Vide l'urteme $1 cangiaminde jndr'à l'urteme $2 sciurne<br />$3",
+       "rclinks": "Vide l'urteme $1 cangiaminde jndr'à l'urteme $2 sciurne",
        "diff": "diff",
        "hist": "cunde",
        "hide": "Scunne",
        "undeleteviewlink": "vide",
        "undeleteinvert": "Selezione a smerse",
        "undeletecomment": "Mutive:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revisione|$1 revisiune}} ripristinete",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revisione|$1 revisiune}} e {{PLURAL:$2|1 file|$2 file}} ripristinete",
-       "undeletedfiles": "{{PLURAL:$1|1 file|$1 file}} ripristinete",
        "cannotundelete": "Repristine fallite:\n$1",
        "undeletedpage": "'''$1 ha state repristinate'''\n\nLigge l'[[Special:Log/delete|archivije de le scangellaminde]] pe 'nu report de le urteme scangellaminde e repristinaminde.",
        "undelete-header": "Vide [[Special:Log/delete|l'archivije de le scangellaminde]] pe l'urteme pàggene scangellete.",
        "htmlform-user-not-exists": "<strong>$1</strong> non g'esiste.",
        "htmlform-user-not-valid": "<strong>$1</strong> non g'è 'nu nome utende valide.",
        "logentry-delete-delete": "$1 pàgena {{GENDER:$2|scangellate}} $3",
-       "logentry-delete-restore": "$1 pàgena {{GENDER:$2|repristinate}} $3",
+       "logentry-delete-restore": "$1 pàgena {{GENDER:$2|repristinate}} $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|repristinate}} pàgene $3",
        "logentry-delete-event": "$1 {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|cangiate}} 'a vesibbilità d'u archivije de le fatte sus 'a $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|aggiornate}} le tag sus 'a revisione $4 d'a pàgene $3 ({{PLURAL:$7|aggiunde}} $6; {{PLURAL:$9|luate}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|aggiornate}} le tag sus 'a vôsce de l'archivije $5 d'a pàgene $3 ({{PLURAL:$7|aggiunde}} $6; {{PLURAL:$9|luate}} $8)",
        "rightsnone": "(ninde)",
-       "revdelete-summary": "cange 'u riepileghe",
        "feedback-adding": "Aggiunge feedback a 'a pàgene...",
        "feedback-back": "Rrete",
        "feedback-bugcheck": "Granne! Appene verificate ca non g'è une de le [$1 bug canusciute].",
        "mw-widgets-dateinput-no-date": "Nisciune date scacchiate",
        "mw-widgets-titleinput-description-new-page": "'a pàgene non g'esiste angore",
        "mw-widgets-titleinput-description-redirect": "redirezionate sus a $1",
-       "randomrootpage": "Pàgene prengepàle a uecchije"
+       "randomrootpage": "Pàgene prengepàle a uecchije",
+       "gotointerwiki": "Ste lasse {{SITENAME}}"
 }
index fcffcdc..580f184 100644 (file)
                        "Аль-Гимравий",
                        "Gamliel Fishkin",
                        "Ping08",
-                       "Yuryleb"
+                       "Yuryleb",
+                       "Redredsonia",
+                       "Nitch",
+                       "Alexey zakharenkov",
+                       "Ivan-r",
+                       "Choomaq",
+                       "Facenapalm",
+                       "Esukhovnina",
+                       "Av6",
+                       "Санюн Вадик"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
-       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¿Ñ\80авки из списка свежих правок",
+       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f из списка свежих правок",
        "tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
        "tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
        "tog-hidecategorization": "Скрывать категоризацию страниц",
        "tog-watchlisthidebots": "Скрывать правки ботов из списка наблюдения",
        "tog-watchlisthideminor": "Скрывать малые правки из списка наблюдения",
        "tog-watchlisthideliu": "Скрывать правки представившихся участников из списка наблюдения",
-       "tog-watchlistreloadautomatically": "Ð\9fеÑ\80езагÑ\80Ñ\83жать список наблюдения автоматически всякий раз, когда изменяется фильтр (требуется JavaScript)",
+       "tog-watchlistreloadautomatically": "Ð\9eбновлÑ\8fть список наблюдения автоматически всякий раз, когда изменяется фильтр (требуется JavaScript)",
        "tog-watchlisthideanons": "Скрывать правки анонимных участников из списка наблюдения",
        "tog-watchlisthidepatrolled": "Скрывать отпатрулированные правки из списка наблюдения",
        "tog-watchlisthidecategorization": "Скрывать категоризацию страниц",
        "tog-showhiddencats": "Показывать скрытые категории",
        "tog-norollbackdiff": "Не показывать разницу версий после выполнения отката",
        "tog-useeditwarning": "Предупреждать, когда я покидаю страницу с несохранёнными изменениями",
-       "tog-prefershttps": "Всегда использовать защищённое соединение после представления системе",
+       "tog-prefershttps": "Всегда использовать защищённое соединение",
        "underline-always": "Всегда",
        "underline-never": "Никогда",
        "underline-default": "Использовать настройки браузера",
        "category-article-count": "{{PLURAL:$2|1=Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показаны $1 страницы|Показано $1 страниц}} из $2, {{PLURAL:$2|находящейся|находящихся}} в данной категории.}}",
        "category-article-count-limited": "В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц|1=только одна страница}}.",
        "category-file-count": "{{PLURAL:$2|1=Эта категория содержит единственный файл.|{{PLURAL:$1|Показан $1 файл|Показано $1 файла|Показаны $1 файлов}} из $2, {{PLURAL:$2|находящегося|находящихся}} в данной категории.}}",
-       "category-file-count-limited": "В этой категории {{PLURAL:$1|$1 файл|$1 файла|$1 файлов|1=только один файл}}.",
+       "category-file-count-limited": "В этой категории {{PLURAL:$1|1=1 файл|$1 файла|$1 файлов}}.",
        "listingcontinuesabbrev": "(продолжение)",
        "index-category": "Индексируемые страницы",
        "noindex-category": "Неиндексируемые страницы",
        "broken-file-category": "Страницы с неработающими файловыми ссылками",
        "about": "Описание",
        "article": "Статья",
-       "newwindow": "&nbsp;(в новом окне)",
+       "newwindow": "(в новом окне)",
        "cancel": "Отменить",
        "moredotdotdot": "Далее…",
        "morenotlisted": "Этот список может быть неполным.",
        "tagline": "Материал из {{grammar:genitive|{{SITENAME}}}}",
        "help": "Справка",
        "search": "Поиск",
-       "search-ignored-headings": " #<!-- оставьте эту строку как есть --> <pre>\n# Заголовки, которые будут игнорироваться поиском.\n# Изменения вступают в силу, как только страница с заголовком индексируется.\n# Вы можете принудить переиндексировать страницу с помощью нулевой правки.\n# Синтаксис выглядит следующим образом:\n#   * Всё, начинающееся на символ «#» и до конца строки представляет собой комментарий.\n#   * Каждая непустая строка — точное название того, что будет игнорироваться, включая регистр и пр.\nПримечания\nСсылки\nСм. также\n #</pre> <!-- оставьте эту строку как есть -->",
+       "search-ignored-headings": " #<!-- оставьте эту строку как есть --> <pre>\n# Заголовки, которые будут игнорироваться поиском.\n# Изменения вступают в силу после того, как страница с заголовком индексируется.\n# Вы можете принудительно переиндексировать страницу, сделав нулевую правку.\n# Синтаксис выглядит следующим образом:\n#   * Всё, начинающееся на символ «#» и до конца строки представляет собой комментарий.\n#   * Каждая непустая строка — точное название того, что будет игнорироваться, включая регистр и пр.\nПримечания\nСсылки\nСм. также\n #</pre> <!-- оставьте эту строку как есть -->",
        "searchbutton": "Найти",
        "go": "Перейти",
        "searcharticle": "Перейти",
        "edit": "Править",
        "edit-local": "Редактировать локальное описание",
        "create": "Создать",
-       "create-local": "Ð\94обавиÑ\82Ñ\8c Ð»Ð¾ÐºÐ°Ð»Ñ\8cное Ð¾Ð¿Ð¸Ñ\81ание",
+       "create-local": "СоздаÑ\82Ñ\8c Ð»Ð¾ÐºÐ°Ð»Ñ\8cно",
        "editthispage": "Править эту страницу",
        "create-this-page": "Создать эту страницу",
        "delete": "Удалить",
        "deletethispage": "Удалить эту страницу",
        "undeletethispage": "Восстановить эту страницу",
-       "undelete_short": "Восстановить {{PLURAL:$1|$1 правку|$1 правки|$1 правок|1=правку}}",
-       "viewdeleted_short": "Просмотр {{PLURAL:$1|$1 удалённой правки|удалённой правки|$1 удалённых правок}}",
+       "undelete_short": "Восстановить {{PLURAL:$1|1=$1 правку|$1 правки|$1 правок|1=правку}}",
+       "viewdeleted_short": "Просмотр {{PLURAL:$1|1=$1 удалённой правки|удалённой правки|$1 удалённых правок}}",
        "protect": "Защитить",
        "protect_change": "изменить",
        "protectthispage": "Защитить эту страницу",
        "redirectedfrom": "(перенаправлено с «$1»)",
        "redirectpagesub": "Страница-перенаправление",
        "redirectto": "Перенаправление на:",
-       "lastmodifiedat": "Ð\9fоÑ\81леднее Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b: $2, $1.",
-       "viewcount": "К этой странице обращались $1 {{PLURAL:$1|раз|раза|раз}}.",
+       "lastmodifiedat": "ЭÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ð¾Ñ\81ледний Ñ\80аз Ð±Ñ\8bла Ð¾Ñ\82Ñ\80едакÑ\82иÑ\80ована $1 Ð² $2.",
+       "viewcount": "К этой странице обращались $1 {{PLURAL:$1|1=раз|раза|раз}}.",
        "protectedpage": "Защищённая страница",
        "jumpto": "Перейти к:",
        "jumptonavigation": "навигация",
        "jumptosearch": "поиск",
-       "view-pool-error": "Извините, сейчас серверы перегружены.\nПоступило слишком много запросов на просмотр этой страницы.\nПожалуйста, подождите и повторите попытку обращения к странице позже.\n\n$1",
+       "view-pool-error": "Извините, в настоящий момент серверы перегружены.\nСлишком много пользователей пытаются просмотреть этот ресурс.\nПожалуйста, подождите и повторите попытку обращения к нему позже.\n\n$1",
        "generic-pool-error": "Извините, в настоящий момент серверы перегружены.\nСлишком много пользователей пытаются просмотреть этот ресурс.\nПожалуйста, подождите и повторите попытку обращения к нему позже.",
        "pool-timeout": "Истекло время ожидания блокировки",
        "pool-queuefull": "Накопитель запросов полон",
        "pagetitle": "$1 — {{SITENAME}}",
        "retrievedfrom": "Источник — «$1»",
        "youhavenewmessages": "Вы получили $1 ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|Вы получили}} $1 от {{PLURAL:$3|$3 участника|$3 участников|1=другого участника}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Вы получили}} $1 от {{PLURAL:$3|1=$3 участника|$3 участников|1=другого участника}} ($2).",
        "youhavenewmessagesmanyusers": "Вы получили $1 от множества пользователей ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|новое сообщение|999=новые сообщения}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|последнее изменение|999=последние изменения}}",
+       "newmessageslinkplural": "{{PLURAL:$1|1=новое сообщение|999=новые сообщения}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|1=последнее изменение|999=последние изменения}}",
        "youhavenewmessagesmulti": "Вы получили новые сообщения на $1",
        "editsection": "править",
        "editold": "править",
        "title-invalid-characters": "Запрашиваемое название страницы содержит недопустимые символы: «$1».",
        "title-invalid-relative": "Заголовок имеет относительный путь. Заголовки страниц с относительным путем (/,../) являются недействительными, так как они часто недоступны, когда обрабатываются браузером пользователя.",
        "title-invalid-magic-tilde": "Запрашиваемый заголовок страницы содержит недопустимую последовательность тильды (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "Запрашиваемый заголовок страницы слишком длинен. Он должен быть не более $1 {{PLURAL:$1|байта|байт}} в кодировке UTF-8.",
+       "title-invalid-too-long": "Запрашиваемый заголовок страницы слишком длинен. Он должен быть не более $1 {{PLURAL:$1|1=байта|байт}} в кодировке UTF-8.",
        "title-invalid-leading-colon": "Запрашиваемое название страницы содержит недопустимое двоеточие в начале.",
-       "perfcached": "СледÑ\83Ñ\8eÑ\89ие Ð´Ð°Ð½Ð½Ñ\8bе Ð²Ð·Ñ\8fÑ\82Ñ\8b Ð¸Ð· ÐºÑ\8dÑ\88а Ð¸ Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð½Ðµ Ñ\83Ñ\87иÑ\82Ñ\8bваÑ\82Ñ\8c Ð¿Ð¾Ñ\81ледниÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. Ð\92 ÐºÑ\8dÑ\88е Ñ\85Ñ\80аниÑ\82Ñ\81Ñ\8f Ð½Ðµ Ð±Ð¾Ð»ÐµÐµ $1 {{PLURAL:$1|записи|записей}}.",
-       "perfcachedts": "Следующие данные взяты из кэша, последний раз он обновлялся в $1. В кэше хранится не более $4 {{PLURAL:$4|записи|записей}}.",
+       "perfcached": "Ð\94аннÑ\8bе Ð²Ð·Ñ\8fÑ\82Ñ\8b ÐºÑ\8dÑ\88а; Ð¾Ð½Ð¸ Ð¼Ð¾Ð³Ð»Ð¸ Ñ\83Ñ\81Ñ\82аÑ\80еÑ\82Ñ\8c. Ð\92 ÐºÑ\8dÑ\88е Ñ\85Ñ\80аниÑ\82Ñ\81Ñ\8f Ð½Ðµ Ð±Ð¾Ð»ÐµÐµ $1 {{PLURAL:$1|1=записи|записей}}.",
+       "perfcachedts": "Следующие данные взяты из кэша, последний раз он обновлялся в $1. В кэше хранится не более {{PLURAL:$4|1=$1 записи|$1 записей}}.",
        "querypage-no-updates": "Обновление этой страницы сейчас отключено.\nПредставленные здесь данные не будут обновляться.",
        "viewsource": "Просмотр вики-текста",
        "viewsource-title": "Просмотр исходного текста страницы $1",
        "createacct-yourpassword-ph": "Введите пароль",
        "yourpasswordagain": "Повторный набор пароля:",
        "createacct-yourpasswordagain": "Подтвердите пароль",
-       "createacct-yourpasswordagain-ph": "Введите пароль еще раз",
+       "createacct-yourpasswordagain-ph": "Введите пароль ещё раз",
        "userlogin-remembermypassword": "Оставаться в системе",
        "userlogin-signwithsecure": "Защищённое соединение",
        "cannotlogin-title": "Невозможно войти",
        "login": "Войти",
        "login-security": "Подтвердите свою личность",
        "nav-login-createaccount": "Представиться / зарегистрироваться",
-       "userlogin": "Представиться или зарегистрироваться",
-       "userloginnocreate": "Войти",
        "logout": "Завершение сеанса",
        "userlogout": "Завершение сеанса",
        "notloggedin": "Вы не представились системе",
        "userlogin-noaccount": "Нет учётной записи?",
        "userlogin-joinproject": "Присоединиться к проекту",
-       "nologin": "Нет учётной записи? $1.",
-       "nologinlink": "Создать учётную запись",
        "createaccount": "Создать учётную запись",
-       "gotaccount": "Вы уже зарегистрированы? '''$1'''.",
-       "gotaccountlink": "Представьтесь",
-       "userlogin-resetlink": "Забыли данные для входа?",
        "userlogin-resetpassword-link": "Сбросить ваш пароль?",
        "userlogin-helplink2": "Помощь по входу",
        "userlogin-loggedin": "Вы уже вошли как {{GENDER:$1|$1}}.\nИспользуйте форму ниже, чтобы войти под другой учётной записью.",
        "createaccountmail": "Использовать сгенерированный случайным образом временный пароль и выслать его на указанный адрес электронной почты",
        "createaccountmail-help": "\nМожет использоваться, чтобы создать учетную запись для другого лица, не узнавая пароль.",
        "createacct-realname": "Настоящее имя (необязательно)",
-       "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Зачем вы создаёте другую учетную запись",
        "createacct-reason-help": "Сообщение, отображаемое в журнале создания учётных записей",
        "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|участник|участника|участников}} за последнее время",
+       "createacct-benefit-body1": "{{PLURAL:$1|1=$1 правка|$1 правки|$1 правок}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|1=$1 статья|$1 статьи|$1 статей}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|1=$1 участник|$1 участника|$1 участников}} за последнее время",
        "badretype": "Введённые вами пароли не совпадают.",
        "usernameinprogress": "Создание учётной записи для данного имени участника уже выполняется.\nПожалуйста, подождите.",
        "userexists": "Введённое имя участника уже используется.\nПожалуйста, выберите другое имя.",
        "login-userblocked": "Участник заблокирован. Вход в систему запрещен.",
        "wrongpassword": "Введённый вами пароль неверен. Попробуйте ещё раз.",
        "wrongpasswordempty": "Пожалуйста, введите непустой пароль.",
-       "passwordtooshort": "Пароль должен состоять не менее чем из $1 {{PLURAL:$1|символа|символов}}.",
-       "passwordtoolong": "Пароль не может превышать {{PLURAL:$1|1 символ|$1 символов|$1 символа}}.",
+       "passwordtooshort": "Пароль должен состоять не менее, чем из $1 {{PLURAL:$1|1=символа|символов}}.",
+       "passwordtoolong": "Пароль не может содержать более {{PLURAL:$1|1=$1 символа|$1 символов}}.",
        "passwordtoopopular": "Часто выбираемые пароли не могут быть использованы. Пожалуйста, выберите более уникальный пароль.",
        "password-name-match": "Введённый пароль должен отличаться от имени участника.",
        "password-login-forbidden": "Использование этого имени участника и пароля запрещено.",
        "mailmypassword": "Сбросить пароль",
        "passwordremindertitle": "Напоминание пароля участника {{grammar:genitive|{{SITENAME}}}}",
-       "passwordremindertext": "Кто-то (вероятно, вы, с IP-адреса $1) запросил создать\nновый пароль для {{grammar:genitive|{{SITENAME}}}} ($4). Для участника $2\nсоздан временный пароль: $3. Если это был ваш запрос,\nвам следует представиться системе и выбрать новый пароль.\nВаш временный пароль будет действовать в течение $5 {{PLURAL:$5|дня|дней}}.\n\nЕсли вы не посылали запроса на смену пароля, или если вы уже вспомнили свой пароль,\nи не желаете его менять, вы можете проигнорировать данное сообщение и\nпродолжить использовать свой старый пароль.",
+       "passwordremindertext": "Кто-то (вероятно, вы, с IP-адреса $1) запросил создать\nновый пароль для {{grammar:genitive|{{SITENAME}}}} ($4). Для участника $2\nсоздан временный пароль: $3. Если это был ваш запрос,\nвам следует представиться системе и выбрать новый пароль.\nВаш временный пароль будет действовать в течение $5 {{PLURAL:$5|1=дня|дней}}.\n\nЕсли вы не посылали запроса на смену пароля, или если вы уже вспомнили свой пароль,\nи не желаете его менять, вы можете проигнорировать данное сообщение и\nпродолжить использовать свой старый пароль.",
        "noemail": "Для участника с именем $1 электронный адрес указан не был.",
        "noemailcreate": "Вам необходимо указать корректный адрес электронной почты",
        "passwordsent": "Новый пароль был выслан на адрес электронной почты, указанный для участника $1.\n\nПожалуйста, представьтесь системе заново после получения пароля.",
        "blocked-mailpassword": "Редактирование с вашего IP-адреса запрещено. Для предотвращения злоупотреблений для этого IP-адреса заблокирована и функция восстановления пароля.",
        "eauthentsent": "На указанный адрес электронной почты отправлено письмо. \nЧтобы получать письма в дальнейшем, следуйте изложенным там инструкциям для подтверждения, что этот адрес действительно принадлежит вам.",
-       "throttled-mailpassword": "Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|1=последнего часа|последних $1 часов}}.\nДля предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания {{PLURAL:$1|за $1 час|за $1 часов|за $1 часа|1=в час}}.",
+       "throttled-mailpassword": "Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|1=последнего часа|последних $1 часов}}.\nДля предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания {{PLURAL:$1|1=за $1 час|за $1 часов|за $1 часа|1=в час}}.",
        "mailerror": "Ошибка при отправке почты: $1",
        "acct_creation_throttle_hit": "Посетители с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись|было создано $1 учётных записей|были созданы $1 учётных записи}} за последние $2 — это предельное количество для данного отрезка времени.\nВ результате, пользователи с этим IP-адресом в данный момент больше не могут создавать новых учётных записей.",
        "emailauthenticated": "Ваш адрес электронной почты подтверждён $2 в $3.",
        "preview": "Предпросмотр",
        "showpreview": "Предварительный просмотр",
        "showdiff": "Внесённые изменения",
-       "blankarticle": "<strong>Предупреждение:</strong> Страница, которую вы создаёте, пуста.\nЕсли снова нажмёте кнопку «{{int:savearticle}}», страница будет создана без какого-либо содержания.",
+       "blankarticle": "<strong>Предупреждение:</strong> Страница, которую вы создаёте, пуста.\nЕсли снова нажмёте кнопку «$1», страница будет создана без какого-либо содержания.",
        "anoneditwarning": "<strong>Внимание!</strong> Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы <strong>[$1 войдёте]</strong> или <strong>[$2 создадите учётную запись]</strong>, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.",
        "anonpreviewwarning": "''Вы не представились системе. Сохранение приведёт к записи вашего IP-адреса в историю изменений страницы.''",
-       "missingsummary": "'''Напоминание.''' Вы не дали краткого описания изменений. При повторном нажатии на кнопку «{{int:savearticle}}» ваши изменения будут сохранены без комментария.",
-       "selfredirect": "<strong>Внимание:</strong> Вы создаёте перенаправление на ту же самую статью.\nВозможно, Вы выбрали неправильную целевую страницу для перенаправления или редактируете не ту страницу.\nЕсли Вы нажмёте кнопку «{{int:savearticle}}» ещё раз, перенаправление всё же будет создано.",
+       "missingsummary": "'''Напоминание.''' Вы не дали краткого описания изменений. При повторном нажатии на кнопку «$1» ваши изменения будут сохранены без комментария.",
+       "selfredirect": "<strong>Внимание:</strong> Вы создаёте перенаправление на ту же самую статью.\nВозможно, Вы выбрали неправильную целевую страницу для перенаправления или редактируете не ту страницу.\nЕсли Вы нажмёте кнопку «$1» ещё раз, перенаправление всё же будет создано.",
        "missingcommenttext": "Пожалуйста, введите ниже ваше сообщение.",
-       "missingcommentheader": "<strong>Напоминание.</strong> Вы не указали тему/заголовок для этого комментария.\nПри повторном нажатии на кнопку «{{int:savearticle}}», ваша правка будет записана без заголовка.",
+       "missingcommentheader": "<strong>Напоминание.</strong> Вы не указали тему/заголовок для этого комментария.\nПри повторном нажатии на кнопку «$1», ваша правка будет записана без заголовка.",
        "summary-preview": "Предпросмотр описания изменения:",
        "subject-preview": "Предпросмотр темы/заголовка:",
        "previewerrortext": "При попытке отобразить предварительный просмотр ваших изменений произошла ошибка.",
        "missing-revision": "Версия $1 страницы «{{FULLPAGENAME}}» не существует.\n\nЭто обычно бывает, если последовать по устаревшей ссылке на страницу, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "userpage-userdoesnotexist": "Учётной записи «<nowiki>$1</nowiki>» не существует. Убедитесь, что вы действительно желаете создать или изменить эту страницу.",
        "userpage-userdoesnotexist-view": "Не зарегистрировано учётной записи «$1».",
-       "blocked-notice-logextract": "Этот участник в данный момент заблокирован.\nНиже приведена последняя запись из журнала блокировок:",
+       "blocked-notice-logextract": "{{GENDER:$1|Этот участник|Эта участница}} в данный момент {{GENDER:$1|заблокирован|заблокирована}}.\nНиже приведена последняя запись из журнала блокировок:",
        "clearyourcache": "<strong>Замечание.</strong> Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.\n* <strong>Firefox / Safari:</strong> Удерживая клавишу <em>Shift</em>, нажмите на панели инструментов <em>Обновить</em> либо нажмите <em>Ctrl-F5</em> или <em>Ctrl-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Google Chrome:</strong> Нажмите <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer:</strong> Удерживая <em>Ctrl</em>, нажмите <em>Обновить</em> либо нажмите <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Перейдите в <em>Menu → Настройки</em> (<em>Opera → Настройки</em> на Mac), а затем <em>Безопасность → Очистить историю посещений → Кэшированные изображения и файлы</em>",
        "usercssyoucanpreview": "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый CSS-файл перед сохранением.",
        "userjsyoucanpreview": "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый JS-файл перед сохранением.",
        "editingsection": "Редактирование: $1 (раздел)",
        "editingcomment": "Редактирование: $1 (новый раздел)",
        "editconflict": "Конфликт редактирования: $1",
-       "explainconflict": "Пока вы редактировали эту страницу, кто-то внёс в неё изменения.\nВ верхнем окне для редактирования вы видите текущий текст страницы.\nВ нижнем окне находится ваш вариант.\nПеренесите сделанные вами изменения из нижнего окна в верхнее.\nПри нажатии на кнопку «{{int:savearticle}}» будет сохранён текст верхнего окна.",
+       "explainconflict": "Пока вы редактировали эту страницу, кто-то внёс в неё изменения.\nВ верхнем окне для редактирования вы видите текущий текст страницы.\nВ нижнем окне находится ваш вариант.\nПеренесите сделанные вами изменения из нижнего окна в верхнее.\nПри нажатии на кнопку «$1» будет сохранён текст верхнего окна.",
        "yourtext": "Ваш текст",
        "storedversion": "Сохранённая версия",
        "nonunicodebrowser": "'''ПРЕДУПРЕЖДЕНИЕ: Ваш браузер не поддерживает кодировку Юникод. При редактировании статей все не-ASCII символы будут заменены на свои шестнадцатеричные коды.'''",
        "readonlywarning": "<strong>Предупреждение: База данных заблокирована в связи с процедурами обслуживания, поэтому вы не можете записать ваши изменения прямо сейчас.</strong>\nВозможно, вам следует скопировать этот текст в текстовый файл, чтобы сохранить его на будущее.\n\nСистемный администратор, заблокировавший базу данных, оставил следующее объяснение: $1",
        "protectedpagewarning": "'''Предупреждение. Эта страница защищена от изменений, её могут редактировать только участники с полномочиями администратора.'''\nНиже для справки приведена последняя запись журнала:",
        "semiprotectedpagewarning": "'''Замечание.''' Эта страница была защищена; редактировать её могут только зарегистрированные участники.\nНиже для справки приведена последняя запись журнала:",
-       "cascadeprotectedwarning": "<strong>Ð\9fÑ\80едÑ\83пÑ\80еждение:</strong> Ð\94аннÑ\83Ñ\8e Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð¼Ð¾Ð³Ñ\83Ñ\82 Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82ивнÑ\8bми Ð¿Ñ\80авами, поскольку она включена {{PLURAL:$1|1=в следующую страницу, для которой|в следующие страницы, для которых}} включена каскадная защита:",
+       "cascadeprotectedwarning": "<strong>Ð\9fÑ\80едÑ\83пÑ\80еждение:</strong> Ð­Ñ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð±Ñ\8bла Ð·Ð°Ñ\89иÑ\89ена, Ñ\82ак Ñ\87Ñ\82обÑ\8b ÐµÑ\91 Ð¼Ð¾Ð³Ð»Ð¸ Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\82олÑ\8cко Ñ\83Ñ\87аÑ\81Ñ\82ники Ñ\81 [[Special:ListGroupRights|опÑ\80еделÑ\91ннÑ\8bми Ð¿Ñ\80авами]], поскольку она включена {{PLURAL:$1|1=в следующую страницу, для которой|в следующие страницы, для которых}} включена каскадная защита:",
        "titleprotectedwarning": "'''Предупреждение.  Это название защищено. Создать эту страницу могут только участники с [[Special:ListGroupRights|соответствующими правами]].'''\nНиже для справки приведена последняя запись журнала:",
        "templatesused": "{{PLURAL:$1|1=Шаблон, используемый|Шаблоны, используемые}} на этой странице:",
        "templatesusedpreview": "{{PLURAL:$1|1=Шаблон, используемый|Шаблоны, используемые}} в режиме предпросмотра:",
        "post-expand-template-argument-warning": "'''Внимание:''' эта страница содержит по крайней мере один шаблон, аргумент которого имеет слишком большой размер развёртывания.\nПодобные аргументы были опущены.",
        "post-expand-template-argument-category": "Страницы, содержащие пропущенные аргументы шаблонов",
        "parser-template-loop-warning": "Обнаружена петля в шаблонах: [[$1]]",
+       "template-loop-category": "Страницы с петлями в шаблонах",
+       "template-loop-category-desc": "Эта страница содержит петлю в шаблоне, т.е. шаблон, который рекурсивно вызывает сам себя.",
        "parser-template-recursion-depth-warning": "Превышен предел глубины рекурсии шаблона ($1)",
        "language-converter-depth-warning": "Превышен предел глубины преобразователя языков ($1)",
        "node-count-exceeded-category": "Страницы, на которых превышено число узлов",
        "page_first": "первая",
        "page_last": "последняя",
        "histlegend": "Выбор версий: отметьте версии страницы, которые вы хотите сравнить, и нажмите '''{{int:compare-submit}}'''.<br />\nПояснения: '''({{int:cur}})''' — отличия от текущей версии; '''({{int:last}})''' — отличия от предшествующей версии; '''{{int:minoreditletter}}''' — незначительные изменения.",
-       "history-fieldset-title": "Просмотреть историю",
-       "history-show-deleted": "Только удалённые",
+       "history-fieldset-title": "Поиск правок",
+       "history-show-deleted": "Только удалённые правки",
        "histfirst": "старейшие",
        "histlast": "новейшие",
        "historysize": "($1 {{PLURAL:$1|байт|байта|байт}})",
        "search-file-match": "(совпадает с содержимым файла)",
        "search-suggest": "Возможно, вы имели в виду «$1».",
        "search-rewritten": "Показаны результаты для $1. Искать вместо этого $2.",
-       "search-interwiki-caption": "РодÑ\81Ñ\82веннÑ\8bе Ð¿Ñ\80оекÑ\82Ñ\8b",
+       "search-interwiki-caption": "РезÑ\83лÑ\8cÑ\82аÑ\82Ñ\8b Ñ\80одÑ\81Ñ\82веннÑ\8bÑ\85 Ð¿Ñ\80оекÑ\82ов",
        "search-interwiki-default": "Результаты из $1:",
        "search-interwiki-more": "(ещё)",
        "search-interwiki-more-results": "ещё результаты",
        "badsig": "Неверная подпись. Проверьте корректность HTML-тегов.",
        "badsiglength": "Слишком длинная подпись.\nПодпись не должна превышать $1 {{PLURAL:$1|символа|символа|символов}}.",
        "yourgender": "Какое описание вам более подходит?",
-       "gender-unknown": "При упоминании вас, программное обеспечение, когда это возможно, будет использовать гендерно-нейтральные слова",
+       "gender-unknown": "При упоминании вас, программное обеспечение будет по возможности использовать гендерно-нейтральные слова",
        "gender-male": "Он редактирует страницы вики",
        "gender-female": "Онa редактирует страницы вики",
        "prefs-help-gender": "Этот параметр задавать необязательно.\nДвижок использует это значение, чтобы обращаться к вам и упоминать вас в правильном грамматическом роде.\nЭта информация будет общедоступной.",
        "prefs-help-prefershttps": "Эта настройка будет применена после следующего представления системе.",
        "prefswarning-warning": "Вы внесли в свои настройки изменения, которые ещё не были сохранены.\nЕсли вы покинете эту страницу, не нажав «$1», настройки не будут обновлены.",
        "prefs-tabs-navigation-hint": "Совет: Вы можете использовать клавиши стрелок влево и вправо для перехода между вкладками в списке вкладок.",
-       "userrights": "УпÑ\80авление Ð¿Ñ\80авами участника",
+       "userrights": "Ð\9fÑ\80ава участника",
        "userrights-lookup-user": "Выбор участника",
        "userrights-user-editname": "Введите имя учётной записи:",
        "editusergroup": "Загрузить группы участников",
        "saveusergroups": "Сохранить группы {{GENDER:$1|участника|участницы}}",
        "userrights-groupsmember": "Состоит в группах:",
        "userrights-groupsmember-auto": "Неявно состоит в группах:",
-       "userrights-groups-help": "Вы можете изменить группы, в которые входит этот участник.\n* Если около названия группы стоит отметка — участник входит в эту группу.\n* Если отметка не стоит — участник не входит в эту группу.\n* Символ * указывает на то, что вы не сможете удалить участника из группы, если добавите его в неё (или наоборот).\n* Символ # указывает на то, что вы можете только отложить время истечения этой группы, вы не можете перенести его на более ранний срок.",
+       "userrights-groups-help": "Вы можете изменить группы, в которые входит {{GENDER:$1|этот участник|эта участница}}.\n* Если около названия группы стоит отметка — {{GENDER:$1|участник|участница}} входит в эту группу.\n* Если отметка не стоит — {{GENDER:$1|участник|участница}} не входит в эту группу.\n* Символ * указывает на то, что вы не сможете удалить {{GENDER:$1|участника|участницу}} из группы, если добавите {{GENDER:$1|его|её}} в неё (или наоборот).\n* Символ # указывает на то, что вы можете только отложить время истечения членства в этой группы, вы не можете перенести его на более ранний срок.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "У вас нет разрешения изменять права участников в других вики.",
        "userrights-nodatabase": "База данных $1 не существует или расположена не локально.",
        "userrights-expiry-options": "1 день:1 day,1 неделя:1 week,1 месяц:1 mopnth,3 месяца:3 months,6 месяцев:6 months,1 год:1 year",
        "userrights-invalid-expiry": "Время истечения для группы «$1» задано неверно.",
        "userrights-expiry-in-past": "Время истечения для группы «$1» задано в прошлом.",
-       "userrights-cannot-shorten-expiry": "Вы не можете перенести на более ранний срок дату истечения группы «$1». Только участники, имеющие право на добавление и удаление этой группы, могут перенести её на более ранний срок.",
+       "userrights-cannot-shorten-expiry": "Вы не можете перенести на более ранний срок дату истечения членства в группе «$1». Только участники, имеющие право на добавление и удаление этой группы, могут перенести её на более ранний срок.",
        "userrights-conflict": "Конфликт изменения прав участника! Пожалуйста, проверьте и примените изменения заново.",
        "group": "Группа:",
        "group-user": "Участники",
        "right-editsemiprotected": "правка страниц, защищённых как «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "редактирование контентной модели страницы",
        "right-editinterface": "изменение пользовательского интерфейса",
-       "right-editusercssjs": "правка CSS- и JS-файлов других участников",
        "right-editusercss": "правка CSS-файлов других участников",
        "right-edituserjs": "правка JavaScript-файлов других участников",
        "right-editmyusercss": "редактирование своих пользовательских CSS-файлов",
        "recentchanges-legend": "Настройки свежих правок",
        "recentchanges-summary": "Ниже в хронологическом порядке перечислены последние изменения на страницах {{grammar:genitive|{{SITENAME}}}}.",
        "recentchanges-noresult": "Изменений в указанный период, соответствующих указанным условиям, нет.",
-       "recentchanges-feed-description": "Отслеживать в этом потоке последние изменения в вики.",
+       "recentchanges-feed-description": "Отслеживание последних изменений в вики.",
        "recentchanges-label-newpage": "Этой правкой была создана новая страница.",
        "recentchanges-label-minor": "Это незначительное изменение",
        "recentchanges-label-bot": "Эта правка сделана ботом",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Показать",
        "rcfilters-activefilters": "Активные фильтры",
+       "rcfilters-quickfilters": "Быстрые ссылки",
+       "rcfilters-savedqueries-defaultlabel": "Сохранённые фильтры",
+       "rcfilters-savedqueries-rename": "Переименовать",
+       "rcfilters-savedqueries-setdefault": "Установить по умолчанию",
+       "rcfilters-savedqueries-unsetdefault": "Удалить значение по умолчанию",
+       "rcfilters-savedqueries-remove": "Удалить",
+       "rcfilters-savedqueries-new-name-label": "Имя",
+       "rcfilters-savedqueries-apply-label": "Создать быструю ссылку",
+       "rcfilters-savedqueries-cancel-label": "Отмена",
+       "rcfilters-savedqueries-add-new-title": "Сохранить фильтры как быструю ссылку",
        "rcfilters-restore-default-filters": "Восстановить фильтры по умолчанию",
        "rcfilters-clear-all-filters": "Очистить все фильтры",
        "rcfilters-search-placeholder": "Последние изменения фильтров (просмотрите или начните вводить)",
        "rcfilters-invalid-filter": "Недопустимый фильтр",
        "rcfilters-empty-filter": "Нет активных фильтров. Показываются все правки.",
        "rcfilters-filterlist-title": "Фильтры",
+       "rcfilters-filterlist-whatsthis": "Что это?",
+       "rcfilters-filterlist-feedbacklink": "Оставить отзыв о новых (бета) фильтрах",
        "rcfilters-highlightbutton-title": "Выделить результаты",
        "rcfilters-highlightmenu-title": "Выберите цвет",
+       "rcfilters-highlightmenu-help": "Выберите цвет, чтобы подсветить это свойство",
        "rcfilters-filterlist-noresults": "Фильтры не найдены",
+       "rcfilters-noresults-conflict": "Результатов не найдено из-за конфликта критериев поиска",
+       "rcfilters-state-message-subset": "Фильтр не будет иметь эффекта, поскольку его результаты включены в {{PLURAL:$2|следующий более широкий фильтр|следующие более широкие фильтры}} (попробуйте подсвечивание для различения): $1",
+       "rcfilters-state-message-fullcoverage": "Выбор всех фильтров в группе — это то же самое, что и отсутствие какого-либо выбора, поэтому этот фильтр не имеет никакого эффекта. Включённые группы: $1",
        "rcfilters-filtergroup-registration": "Регистрация участников",
        "rcfilters-filter-registered-label": "Зарегистрированные",
        "rcfilters-filter-registered-description": "Вошедшие редакторы.",
        "rcfilters-filter-unregistered-label": "Незарегистрированные",
        "rcfilters-filter-unregistered-description": "Редакторы, которые не вошли в систему.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Этот фильтр конфликтует со {{PLURAL:$2|следующим фильтром|следующими фильтрами}} по опыту, {{PLURAL:$2|который ищет|которые ищут}} только зарегистрированных пользователей: $1",
        "rcfilters-filtergroup-authorship": "Редактировать авторство",
-       "rcfilters-filter-editsbyself-label": "Ð\92аÑ\88и Ñ\81обÑ\81Ñ\82веннÑ\8bе Ð¿Ñ\80авки",
-       "rcfilters-filter-editsbyself-description": "Ваши правки.",
-       "rcfilters-filter-editsbyother-label": "Ð\9fÑ\80авки Ð´Ñ\80Ñ\83гиÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ников",
-       "rcfilters-filter-editsbyother-description": "Ð\9fÑ\80авки, Ñ\81деланнÑ\8bе Ð´Ñ\80Ñ\83гими Ñ\83Ñ\87аÑ\81Ñ\82никами (не Ð²Ð°Ð¼Ð¸).",
+       "rcfilters-filter-editsbyself-label": "Ð\92неÑ\81Ñ\91ннÑ\8bе Ð²Ð°Ð¼Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f",
+       "rcfilters-filter-editsbyself-description": "Ваш вклад.",
+       "rcfilters-filter-editsbyother-label": "Ð\98зменениÑ\8f, Ð²Ð½ÐµÑ\81Ñ\91ннÑ\8bе Ð´Ñ\80Ñ\83гими Ñ\83Ñ\87аÑ\81Ñ\82никами",
+       "rcfilters-filter-editsbyother-description": "Ð\92Ñ\81е Ð¿Ñ\80авки, ÐºÑ\80оме Ð²Ð°Ñ\88иÑ\85 Ñ\81обÑ\81Ñ\82веннÑ\8bÑ\85.",
        "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-user-experience-level-conflicts-unregistered": "Фильтры по опыту ищут только зарегистрированных участников, поэтому этот фильтр конфликтует с фильтром «Незарегистрированные».",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Фильтр «Незарегистрированные» конфликтует с одним или более фильтрами по опыту, которые ищут только незарегистрированных участников. Конфликтующие фильтры отмечены в поле активных фильтров выше.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Новички",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Менее 10 правок и 4 дней работы.",
+       "rcfilters-filter-user-experience-level-learner-label": "Учащиеся",
+       "rcfilters-filter-user-experience-level-learner-description": "Больше опыта, чем у «Новичков», но меньше, чем у «Опытных пользователей».",
+       "rcfilters-filter-user-experience-level-experienced-label": "Опытные пользователи",
+       "rcfilters-filter-user-experience-level-experienced-description": "Более 30 дней активности и 500 правок.",
        "rcfilters-filtergroup-automated": "Автоматизированные вклады",
        "rcfilters-filter-bots-label": "Бот",
        "rcfilters-filter-bots-description": "Правки, сделанные с помощью автоматизированных инструментов.",
        "rcfilters-filter-humans-label": "Человек (не бот)",
        "rcfilters-filter-humans-description": "Правки, внесённые редакторами.",
+       "rcfilters-filtergroup-reviewstatus": "Статус проверки",
+       "rcfilters-filter-patrolled-label": "Отпатрулировано",
+       "rcfilters-filter-patrolled-description": "Правки, помеченные как отпатрулированные.",
+       "rcfilters-filter-unpatrolled-label": "Непатрулированные",
+       "rcfilters-filter-unpatrolled-description": "Правки, не помеченные как отпатрулированные.",
        "rcfilters-filtergroup-significance": "Значение",
        "rcfilters-filter-minor-label": "Малые правки",
        "rcfilters-filter-minor-description": "Правки, которые автор пометил как малые.",
        "rcfilters-filter-major-label": "Обычные правки",
        "rcfilters-filter-major-description": "Правки, не помеченные как малые.",
+       "rcfilters-filtergroup-watchlist": "Страницы в Списке наблюдения",
+       "rcfilters-filter-watchlist-watched-label": "В Списке наблюдения",
+       "rcfilters-filter-watchlist-watched-description": "Изменения страниц в вашем Списке наблюдения.",
+       "rcfilters-filter-watchlist-watchednew-label": "Новые изменения в Списке наблюдения",
+       "rcfilters-filter-watchlist-watchednew-description": "Правки на страницах из вашего списка наблюдения, которые вы не просмотрели с их совершения.",
+       "rcfilters-filter-watchlist-notwatched-label": "Нет в Списке наблюдения",
+       "rcfilters-filter-watchlist-notwatched-description": "Всё, исключая правки со страниц из вашего списка наблюдения.",
        "rcfilters-filtergroup-changetype": "Тип изменения",
        "rcfilters-filter-pageedits-label": "Правки страницы",
        "rcfilters-filter-pageedits-description": "Правки содержимого, обсуждений, описания категорий…",
        "rcfilters-filter-categorization-description": "Записи о страницах, добавленных или удаленных из категорий.",
        "rcfilters-filter-logactions-label": "Протоколируемые действия",
        "rcfilters-filter-logactions-description": "Административные действия, создания учётных записей, удаления страниц, загрузки файлов…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Фильтр \"малые правки\" конфликтует с одним или несколькими фильтрами, поскольку некоторые типы правок не могут быть названы малыми. Конфликтные фильтры отмечены вверху, в области Активных фильтров.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Определённые типы правок не могут быть названы «малыми», поэтому этот фильтр конфликтует со следующим фильтром типа правок: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Этот фильтр типа правок конфликтует с фильтром малых правок. Определённые типы правок не могут быть отмечены «малыми».",
+       "rcfilters-filtergroup-lastRevision": "Текущая версия",
+       "rcfilters-filter-lastrevision-label": "Текущая версия",
+       "rcfilters-filter-lastrevision-description": "Самое последнее изменение на странице.",
+       "rcfilters-filter-previousrevision-label": "Более ранние версии",
+       "rcfilters-filter-previousrevision-description": "Все правки, не являющиеся самыми последними на странице.",
        "rcnotefrom": "Ниже {{PLURAL:$5|указано изменение|перечислены изменения}} с <strong>$3, $4</strong> (показано не более <strong>$1</strong>).",
+       "rclistfromreset": "Сбросить выбор даты",
        "rclistfrom": "Показать изменения с $3 $2.",
        "rcshowhideminor": "$1 малые правки",
        "rcshowhideminor-show": "Показать",
        "rcshowhidecategorization": "$1 категоризацию страниц",
        "rcshowhidecategorization-show": "Показать",
        "rcshowhidecategorization-hide": "Скрыть",
-       "rclinks": "Показать последние $1 изменений за $2 дней<br />$3",
+       "rclinks": "Показать последние $1 изменений за $2 дней",
        "diff": "разн.",
        "hist": "история",
        "hide": "Скрыть",
        "php-uploaddisabledtext": "Загрузка файлов отключена в настройках PHP. Пожалуйста, проверьте значение свойства file_uploads.",
        "uploadscripted": "Файл содержит HTML-код или скрипт, который может быть ошибочно обработан браузером.",
        "upload-scripted-pi-callback": "Невозможно загрузить файл, содержащий инструкции обработки таблицы стилей XML.",
+       "upload-scripted-dtd": "Невозможно загрузить SVG-файлы, которые содержат нестандартное DTD-объявление.",
        "uploaded-script-svg": "Найден небезопасный элемент с поддержкой сценариев «$1» в загруженном SVG-файле.",
        "uploaded-hostile-svg": "Найден небезопасный CSS-код в элементе стиля загруженного SVG-файла.",
        "uploaded-event-handler-on-svg": "Установка атрибутов обработчика событий <code>$1=\"$2\"</code> не разрешено для SVG-файлов.",
        "shared-repo-from": "из $1",
        "shared-repo": "общего хранилища",
        "shared-repo-name-wikimediacommons": "Викисклада",
-       "filepage.css": "/* CSS и помещены сюда входит на странице описания файла, также на зарубежного заказчика Вики */",
+       "filepage.css": "/* Размещённые здесь CSS будут применены на странице описания файла и на сторонних клиентских вики */",
        "upload-disallowed-here": "Вы не можете перезаписать этот файл.",
        "filerevert": "Возврат к старой версии $1",
        "filerevert-legend": "Возвратить версию файла",
        "listgrants-grant": "Разрешение",
        "listgrants-rights": "Права",
        "trackingcategories": "Отслеживающие категории",
-       "trackingcategories-summary": "Ð\9dа Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¿ÐµÑ\80еÑ\87иÑ\81ленÑ\8b Ð¾Ñ\82Ñ\81леживаÑ\8eÑ\89ие ÐºÐ°Ñ\82егоÑ\80ии, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð·Ð°Ð¿Ð¾Ð»Ð½Ñ\8fÑ\8eÑ\82Ñ\81Ñ\8f Ð¿Ñ\80огÑ\80аммнÑ\8bм Ð¾Ð±ÐµÑ\81пеÑ\87ением MediaWiki. Их можно переименовать, изменив соответствующие системные сообщения в пространстве имён {{ns:8}}.",
-       "trackingcategories-msg": "Отслеживающая категория",
+       "trackingcategories-summary": "Ð\9dа Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¿ÐµÑ\80еÑ\87иÑ\81ленÑ\8b ÐºÐ°Ñ\82егоÑ\80ии, Ð·Ð°Ð¿Ð¾Ð»Ð½Ñ\8fемÑ\8bе Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки. Их можно переименовать, изменив соответствующие системные сообщения в пространстве имён {{ns:8}}.",
+       "trackingcategories-msg": "Отслеживаемая категория",
        "trackingcategories-name": "Имя сообщения",
        "trackingcategories-desc": "Критерий включения в категорию",
        "restricted-displaytitle-ignored": "Страницы с игнорируемыми отображаемыми названиями",
        "enotif_body_intro_moved": "$PAGEEDITDATE {{gender:$2|участником|участницей}} $2 была переименована страница проекта «{{SITENAME}}» с именем «$1», см. текущую версию по ссылке: $3",
        "enotif_body_intro_restored": "$PAGEEDITDATE {{gender:$2|участником|участницей}} $2 была восстановлена страница проекта «{{SITENAME}}» с именем «$1», см. текущую версию по ссылке: $3",
        "enotif_body_intro_changed": "$PAGEEDITDATE {{gender:$2|участником|участницей}} $2 была изменена страница проекта «{{SITENAME}}» с именем «$1», см. текущую версию по ссылке: $3",
-       "enotif_lastvisited": "См. $1 для просмотра всех изменений, произошедших с вашего последнего посещения.",
-       "enotif_lastdiff": "См. $1 для ознакомления с изменением.",
+       "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Система оповещения {{grammar:genitive|{{SITENAME}}}}\n\n--\nИзменение настройки уведомлений\n{{canonicalurl:{{#special:Preferences}}}}\n\nИзменение настройки вашего списка наблюдения\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nУдалить страницы из вашего списка наблюдения\n$UNWATCHURL\n\nОбратная связь и помощь\n$HELPPAGE",
        "created": "создана",
        "movedarticleprotection": "перенёс настройки защиты с «[[$2]]» на «[[$1]]»",
        "protectedarticle-comment": "Защитил{{GENDER:$2||а}} «[[$1]]»",
        "modifiedarticleprotection-comment": "Изменил{{GENDER:$2||а}} уровень защиты «[[$1]]»",
-       "unprotectedarticle-comment": "Убрал {{GENDER:$2||а}} защиту с «[[$1]]»",
+       "unprotectedarticle-comment": "Cнял{{GENDER:$2||а}} защиту с «[[$1]]»",
        "protect-title": "Установка уровня защиты для «$1»",
        "protect-title-notallowed": "Просмотр уровня защиты «$1»",
        "prot_1movedto2": "[[$1]] переименована в [[$2]]",
        "undeleteviewlink": "просмотреть",
        "undeleteinvert": "Обратить выделение",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "{{PLURAL:$1|восстановлено|восстановлены}} $1 {{PLURAL:$1|изменение|изменения|изменений}}",
-       "undeletedrevisions-files": "восстановлены $1 {{PLURAL:$1|версия|версии|версий}} и $2 {{PLURAL:$2|файл|файла|файлов}}",
-       "undeletedfiles": "{{PLURAL:$1|восстановлен|восстановлены}} $1 {{PLURAL:$1|файл|файла|файлов}}",
        "cannotundelete": "Некоторые или все ваши восстановления не удались:\n$1",
        "undeletedpage": "'''Страница «$1» была восстановлена.'''\n\nДля просмотра списка последних удалений и восстановлений см. [[Special:Log/delete|журнал удалений]].",
        "undelete-header": "Список недавно удалённых страниц можно посмотреть в [[Special:Log/delete|журнале удалений]].",
        "sp-contributions-uploads": "загрузки",
        "sp-contributions-logs": "журналы",
        "sp-contributions-talk": "обсуждение",
-       "sp-contributions-userrights": "управление правами участника",
+       "sp-contributions-userrights": "управление правами {{GENDER:$1|участника|участницы}}",
        "sp-contributions-blocked-notice": "Этот участник в данный момент заблокирован. Ниже приведена последняя запись из журнала блокировок:",
        "sp-contributions-blocked-notice-anon": "Этот IP-адрес в данный момент заблокирован. Ниже приведена последняя запись из журнала блокировок:",
        "sp-contributions-search": "Поиск вклада",
        "unblocked-id": "Блокировка $1 была снята",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] был разблокирован.",
        "blocklist": "Заблокированные участники",
+       "autoblocklist": "Автоблокировки",
+       "autoblocklist-submit": "Найти",
+       "autoblocklist-legend": "Список автоблокировок",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Локальная автоблокировка|Локальные автоблокировки}}",
+       "autoblocklist-empty": "Список автоблокировок пуст.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Другая автоблокировка|Другие автоблокировки}}",
        "ipblocklist": "Заблокированные участники",
        "ipblocklist-legend": "Поиск заблокированного участника",
        "blocklist-userblocks": "Скрыть блокировки учётных записей",
        "tooltip-pt-mycontris": "Список {{GENDER:|ваших}} правок",
        "tooltip-pt-anoncontribs": "Список правок, сделанных с этого IP-адреса",
        "tooltip-pt-login": "Здесь можно зарегистрироваться в системе, но это необязательно.",
+       "tooltip-pt-login-private": "Вам нужно войти, чтоб использовать эту вики",
        "tooltip-pt-logout": "Завершить сеанс работы",
        "tooltip-pt-createaccount": "Мы предлагаем вам создать учётную запись и войти в систему, хотя это и не обязательно.",
        "tooltip-ca-talk": "Обсуждение основной страницы",
        "print.css": "/* Размещённый здесь CSS будет применяться к версии для печати */",
        "noscript.css": "/* Размещённый здесь CSS будет применяться для участников с отключенным JavaScript  */",
        "group-autoconfirmed.css": "/* Размещённый здесь CSS будет применяться для автоподтверждённых участников */",
-       "group-user.css": "/* CSS для размещен здесь затронут только для зарегистрированных пользователей */",
+       "group-user.css": "/* Размещённый здесь CSS будет применяться только для зарегистрированных пользователей */",
        "group-bot.css": "/* Размещённый здесь CSS будет применяться только для ботов */",
        "group-sysop.css": "/* Размещённый здесь CSS будет применяться только для администраторов */",
        "group-bureaucrat.css": "/* Размещённый здесь CSS будет применяться только для бюрократов */",
        "common.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */",
        "group-autoconfirmed.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус автоподтверждённых (autoconfirmed) */",
-       "group-user.js": "/* Ð\97деÑ\81Ñ\8c Ð»Ñ\8eбой JavaScript Ð±Ñ\83деÑ\82 Ð·Ð°Ð³Ñ\80Ñ\83жаться только для зарегистрированных пользователей */",
+       "group-user.js": "/* Ð Ð°Ð·Ð¼ÐµÑ\89Ñ\91ннÑ\8bй Ð·Ð´ÐµÑ\81Ñ\8c JavaScript Ð±Ñ\83деÑ\82 Ð¿Ñ\80именÑ\8fться только для зарегистрированных пользователей */",
        "group-bot.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус ботов (bots) */",
        "group-sysop.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус администраторов (sysops) */",
        "group-bureaucrat.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус бюрократов (bureaucrats) */",
        "anonymous": "{{PLURAL:$1|1=Анонимный участник|Анонимные участники}} {{grammar:genitive|{{SITENAME}}}}",
        "siteuser": "{{GENDER:$2|участник|участница}} {{grammar:genitive|{{SITENAME}}}} $1",
        "anonuser": "анонимный участник {{grammar:genitive|{{SITENAME}}}} $1",
-       "lastmodifiedatby": "ЭÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ð¾Ñ\81ледний Ñ\80аз Ð±Ñ\8bла Ð¸Ð·Ð¼ÐµÐ½Ðµна $1 в $2, автор изменения — $3.",
+       "lastmodifiedatby": "ЭÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ð¾Ñ\81ледний Ñ\80аз Ð±Ñ\8bла Ð¾Ñ\82Ñ\80едакÑ\82иÑ\80ована $1 в $2, автор изменения — $3.",
        "othercontribs": "В создании приняли участие: $1.",
        "others": "другие",
        "siteusers": "{{PLURAL:$2|1={{GENDER:$1|участник|участница}}|участники}} {{grammar:genitive|{{SITENAME}}}} $1",
        "spam_blanking": "Все версии содержат ссылки на $1, очистка",
        "spam_deleting": "Все версии содержали ссылки на $1, производится удаление",
        "simpleantispam-label": "Анти-спам проверка.\n<strong>Не</strong> заполняйте это!",
-       "pageinfo-title": "СведениÑ\8f Ð¿Ð¾ «$1»",
+       "pageinfo-title": "СведениÑ\8f Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86е «$1»",
        "pageinfo-not-current": "К сожалению, невозможно предоставить эту информацию для старых версий.",
        "pageinfo-header-basic": "Основные сведения",
        "pageinfo-header-edits": "История изменений",
        "newimages-summary": "На этой служебной странице показаны недавно загруженные файлы.",
        "newimages-legend": "Фильтр",
        "newimages-label": "Имя файла (или его часть):",
+       "newimages-user": "IP-адрес или имя участника",
        "newimages-showbots": "Показать загрузки ботов",
        "newimages-hidepatrolled": "Скрыть отпатрулированные загрузки",
        "noimages": "Изображения отсутствуют.",
        "sunday-at": "в воскресенье в $1",
        "yesterday-at": "Вчера в $1",
        "bad_image_list": "Формат должен быть следующим:\n\nБудут учитываться только элементы списка (строки, начинающиеся на символ *).\nПервая ссылка строки должна быть ссылкой на запрещённое для вставки изображение.\nПоследующие ссылки в той же строке будут рассматриваться как исключения, то есть статьи, куда изображение может быть включено.",
-       "variantname-zh-hans": "его",
+       "variantname-zh-hans": "hans",
        "metadata": "Метаданные",
        "metadata-help": "Файл содержит дополнительные данные, обычно добавляемые цифровыми камерами или сканерами. Если файл после создания редактировался, то некоторые параметры могут не соответствовать текущему изображению.",
        "metadata-expand": "Показать дополнительные данные",
        "exif-copyrighted-false": "Авторско-правовой статус не задан",
        "exif-photometricinterpretation-1": "Чёрный и белый (чёрный — 0)",
        "exif-photometricinterpretation-4": "Маска прозрачности",
-       "exif-photometricinterpretation-5": "РазделенÑ\8b (видимо Ð² CMYK)",
+       "exif-photometricinterpretation-5": "РазделенÑ\8b (веÑ\80оÑ\8fÑ\82но CMYK)",
        "exif-unknowndate": "Неизвестная дата",
        "exif-orientation-1": "Нормальная",
        "exif-orientation-2": "Отражено по горизонтали",
        "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_changed": "Адрес электронной почты для {{SITENAME}} был изменён",
        "notificationemail_subject_removed": "{{SITENAME}} зарегистрированный адрес электронной почты был удален",
        "notificationemail_body_changed": "Кто-то, вероятно, вы, с IP-адреса $1,\nизменил адрес электронной почты учетной записи \"$2\" на \"$3\" на {{SITENAME}}.\n\nЕсли это были не вы, обратитесь к администратору сайта немедленно.",
        "notificationemail_body_removed": "Кто-то, вероятно вы, с IP-адреса $1,\nудалил адрес электронной почты учетной записи \"$2\" на {{SITENAME}}.\n\nЕсли это были не вы, обратитесь к администратору сайта немедленно.",
        "confirmrecreate-noreason": "{{GENDER:$1|Участник|Участница|}}&nbsp;[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|удалил|удалила}} эту страницу после того, как вы начали её редактировать. Пожалуйста, подтвердите, что вы действительно хотите вновь создать эту страницу.",
        "recreate": "Создать заново",
        "unit-pixel": " пикс.",
+       "confirm-purge-title": "Очистить кэш этой страницы",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Очистить кэш этой страницы?",
        "confirm-purge-bottom": "После очистки кэша страницы будет показана её последняя версия.",
        "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-restore": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 версия|$1 версии|$1 версий}}",
+       "restore-count-files": "{{PLURAL:$1|1 файл|$1 файла|$1 файлов}}",
        "logentry-delete-event": "$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей|1=записи}} журнала для $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий|1=версии}} страницы $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|изменил|изменила}} видимость записей журнала $3",
        "logentry-tag-update-revision": "$1 обновил{{GENDER:$2||а}} метки у версии $4 страницы $3 (добавлен{{PLURAL:$7|а|ы}} $6; удален{{PLURAL:$9|а|ы}} $8)",
        "logentry-tag-update-logentry": "$1 обновил{{GENDER:$2||а}} метки у записи журнала $5 страницы $3 (добавлен{{PLURAL:$7|а|ы}} $6; удален{{PLURAL:$9|а|ы}} $8)",
        "rightsnone": "(нет)",
-       "revdelete-summary": "описание изменений",
        "rightslogentry-temporary-group": "$1 (временно, до $2)",
        "feedback-adding": "Добавление отзыва на страницу…",
        "feedback-back": "Назад",
        "special-characters-group-thai": "Тайские",
        "special-characters-group-lao": "Лаосские",
        "special-characters-group-khmer": "Кхмерские",
+       "special-characters-group-canadianaboriginal": "Канадское слоговое письмо",
        "special-characters-title-endash": "среднее тире",
        "special-characters-title-emdash": "длинное тире",
        "special-characters-title-minus": "знак минус",
        "mw-widgets-titleinput-description-redirect": "перенаправление на $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Добавить категорию…",
        "mw-widgets-usersmultiselect-placeholder": "Добавить ещё…",
+       "date-range-from": "С даты:",
+       "date-range-to": "По дату:",
        "sessionmanager-tie": "Невозможно использовать одновременно несколько типов проверки подлинности запроса: $1.",
        "sessionprovider-generic": "$1 сессий",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "сессий на основе куки",
        "log-action-filter-contentmodel": "Тип изменения модели содержимого:",
        "log-action-filter-delete": "Тип удаления:",
        "log-action-filter-import": "Тип импорта:",
-       "log-action-filter-managetags": "Тип Ñ\82ега Ñ\83пÑ\80авленÑ\87еÑ\81киÑ\85 Ð´ÐµÐ¹Ñ\81Ñ\82вий:",
+       "log-action-filter-managetags": "Ð\94ейÑ\81Ñ\82вие Ð¿Ð¾ Ñ\83пÑ\80авлениÑ\8e Ñ\82егами:",
        "log-action-filter-move": "Тип переименования:",
        "log-action-filter-newusers": "Тип создания учётной записи:",
        "log-action-filter-patrol": "Тип патрулирования:",
        "log-action-filter-managetags-delete": "Удаление тегов",
        "log-action-filter-managetags-activate": "Активация тегов",
        "log-action-filter-managetags-deactivate": "Отключение тега",
-       "log-action-filter-move-move": "Ð\94вигаÑ\82Ñ\8cÑ\81Ñ\8f Ð±ÐµÐ· Ð¿ÐµÑ\80езапиÑ\81и Ð¿ÐµÑ\80еадÑ\80еÑ\81аÑ\86ий",
-       "log-action-filter-move-move_redir": "Ð\9fеÑ\80емеÑ\81Ñ\82иÑ\82Ñ\8c Ñ\81 Ð·Ð°Ð¼ÐµÐ½Ð¾Ð¹ Ð¿ÐµÑ\80еадÑ\80еÑ\81аÑ\86ий",
+       "log-action-filter-move-move": "Ð\9fеÑ\80еименованиÑ\8f Ð½Ðµ Ð² Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ее Ð¿ÐµÑ\80енапÑ\80авление",
+       "log-action-filter-move-move_redir": "Ð\9fеÑ\80еименованиÑ\8f Ð¿Ð¾Ð²ÐµÑ\80Ñ\85 Ð¿ÐµÑ\80енапÑ\80авлениÑ\8f",
        "log-action-filter-newusers-create": "Создание анонимным участником",
        "log-action-filter-newusers-create2": "Создание зарегистрированным участником",
        "log-action-filter-newusers-autocreate": "Автоматическое создание",
        "restrictionsfield-label": "Разрешённые диапазоны IP-адресов:",
        "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "версия $1",
-       "pageid": "ID страницы $1"
+       "pageid": "ID страницы $1",
+       "rawhtml-notallowed": "&lt;html&gt; теги могут быть использованы только в пределах обычных страниц.",
+       "gotointerwiki": "Покидаем {{grammar:accusative|{{SITENAME}}}}...",
+       "gotointerwiki-invalid": "Указан некорректный заголовок.",
+       "gotointerwiki-external": "Вы покидаете {{grammar:accusative|{{SITENAME}}}} для посещения стороннего сайта [[$2]].\n\n'''[$1 Перейти на $1]'''",
+       "undelete-cantedit": "Вы не можете восстановить эту страницу, поскольку у вас недостаточно прав для ее редактирования.",
+       "undelete-cantcreate": "Вы не можете восстановить эту страницу, поскольку она не существует, а у вас недостаточно прав для ее создания."
 }
index 24f7622..74834bc 100644 (file)
        "printableversion": "Верзія до друку",
        "permalink": "Перманентный одказ",
        "print": "Друк",
-       "view": "Ð\92идÑ\97ти",
+       "view": "Ð\92идÑ\96ти",
        "edit": "Едітовати",
        "create": "Створити",
        "editthispage": "Едітовату тоту сторінку",
        "nstab-template": "Шаблона",
        "nstab-help": "Сторінка помочі",
        "nstab-category": "Катеґорія",
+       "mainpage-nstab": "Головна сторінка",
        "nosuchaction": "Такой дїї не має",
        "nosuchactiontext": "Дїя, уведжена в URL, неправилна.\nМогли сьте неправилно написати URL або перейти через некоректный одказ .\nМоже тыж значіти ґанч в проґрамовім забеспечіню {{GRAMMAR:genitive|{{SITENAME}}}}.",
        "nosuchspecialpage": "Такой шпеціалной сторінкы нїт",
        "externaldberror": "Або ся стала хыба екстерной автентіфікачной датабазы, або не маєте дозволено мінити своє екстерне конто.",
        "login": "Приголошіня",
        "nav-login-createaccount": "Приголошіня / створїня конта",
-       "userlogin": "Приголошіня / створїня конта",
-       "userloginnocreate": "Приголошіня",
        "logout": "Одголосити",
        "userlogout": "Одголошіня",
        "notloggedin": "Не сьте приголошеный(а)",
        "userlogin-noaccount": "Не мате конто?",
        "userlogin-joinproject": "Придайте ся {{grammar:3sg|{{SITENAME}}}}",
-       "nologin": "До теперь не маєте конто? '''$1'''.",
-       "nologinlink": "Створити конто",
        "createaccount": "Вытворити конто",
-       "gotaccount": "Уж сьте реґістрованы? '''$1'''.",
-       "gotaccountlink": "Приголошіня",
-       "userlogin-resetlink": "Забыли сьте вашы даны на приголошіня?",
        "userlogin-resetpassword-link": "Забыли сьте гесло?",
        "userlogin-loggedin": "Уж сьте {{GENDER:$1|приголошеный|приголошена}} як $1.\nХоснуйте формулар долов жебы сьте ся приголосили як другый хоснователь.",
        "userlogin-createanother": "Створити інше конто",
        "createacct-another-email-ph": "Уведьте адресу електронічной пошты",
        "createaccountmail": "Схосновати дочасне гесло та загнати го на вказану адресу електронічной пошты",
        "createacct-realname": "Правдиве імя (не обовязково)",
-       "createaccountreason": "Причіна:",
        "createacct-reason": "Прічіна",
        "createacct-reason-ph": "Чом собі робите друге конто",
        "createacct-submit": "Створити конто",
        "anonpreviewwarning": "''Не сьте приголошеный(а). Уложінём буде ваша IP адреса записана в історії  той сторінкы.''",
        "missingsummary": "'''Припомянутя:''' Не задали сьте згорнутя едітації. Кідь іщі раз кликтете на Уложыти зміны, буде вапа едітація записана без згорнутя.",
        "missingcommenttext": "Задайте коментарь",
-       "missingcommentheader": "'''Припомянутя:''' Не задали сьте тему/надпис про тот коментарь.\nКідь іщі раз кликнете на „{{int:savearticle}}“, буде ваша едітація записана і без того.",
+       "missingcommentheader": "'''Припомянутя:''' Не задали сьте тему/надпис про тот коментарь.\nКідь іщі раз кликнете на „$1“, буде ваша едітація записана і без того.",
        "summary-preview": "Опис буде:",
        "subject-preview": "Нагляд темы/надпису:",
        "blockedtitle": "Хоснователь є блокованый",
        "editingsection": "Едітованя $1 (роздїл)",
        "editingcomment": "Едітованя $1 (нова секція)",
        "editconflict": "Конфлікт едітованя: $1",
-       "explainconflict": "Дахто змінив сторінку по започатю вашой едітації.\nВысше видите актуалный текст сторінкы.\nВашы зміны суть вказаны долов.\nМусите злучіти свої зміны з існуючім текстом.\n'''Лем''' высше вказаный текст зістане всокоченый по кликнутю на  „{{int:savearticle}}“.",
+       "explainconflict": "Дахто змінив сторінку по започатю вашой едітації.\nВысше видите актуалный текст сторінкы.\nВашы зміны суть вказаны долов.\nМусите злучіти свої зміны з існуючім текстом.\n'''Лем''' высше вказаный текст зістане всокоченый по кликнутю на  „$1“.",
        "yourtext": "Ваш текст",
        "storedversion": "Уложена верзія",
        "nonunicodebrowser": "'''Увага: Ваш переглядач не є способный працовати із знаками Unicode. Абы сьте могли тоту сторінку беспечно едітовати: вшыткы знакы мімо  ASCII суть зображены в гексадецімалных кодах.'''",
        "right-editprotected": "Едітованя сторінок замкнутых на „{{int:protect-level-sysop}}“",
        "right-editsemiprotected": "Едітованя сторінок замкнутых на „{{int:protect-level-autoconfirmed}}“",
        "right-editinterface": "Едітованя інтерфейсу хоснователя",
-       "right-editusercssjs": "Едітованя CSS і JS файлів іншых хоснователїв",
        "right-editusercss": "Едітованя CSS файлів іншых хоснователїв",
        "right-edituserjs": "Едітованя JS файлів іншых хоснователїв",
        "right-editmyusercss": "Едітовати вашы властны хосновательскы CSS файлы.",
        "recentchanges-label-unpatrolled": "Тота зміна дотеперь не была патролёвана.",
        "recentchanges-legend-heading": "<strong>Леґенда:</strong>",
        "recentchanges-legend-newpage": "$1 — нова сторінка",
+       "rcfilters-savedqueries-new-name-label": "Назва",
        "rcnotefrom": "Долов суть вказаны зміны од <strong>$2</strong> (до <strong>$1</strong>).",
        "rclistfrom": "Вказати едітованя почінаючі з $3 $2.",
        "rcshowhideminor": "$1 маленькы едітованя",
        "rcshowhidemine": "$1 мої едітованя",
        "rcshowhidemine-show": "Вказати",
        "rcshowhidemine-hide": "Сховати",
-       "rclinks": "Вказати послїднї $1 зміны за $2 днїв<br />$3",
+       "rclinks": "Вказати послїднї $1 зміны за $2 днїв",
        "diff": "різн.",
        "hist": "історія",
        "hide": "сховати",
        "undeleteviewlink": "видїти",
        "undeleteinvert": "Інвертовати селекцію",
        "undeletecomment": "Причіна:",
-       "undeletedrevisions": "{{PLURAL:$1|Обновлена $1 верзія|Обновлены $1 верзії|Обновленых $1 верзій}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Обновлена єдна верзія|Обновлены $1 верзії|Обновленых $1 верзій}} і $2 {{PLURAL:$2|файл|файлы|файлів}}.",
-       "undeletedfiles": "{{PLURAL:$1|обновленый $1 файл|обновлены $1 файлы|обновленых $1 файлів}}",
        "cannotundelete": "Обновлїня ся не вдало:\n$1",
        "undeletedpage": "'''$1 была обновлена'''\n\nЗапис о послїднїх мазанях і обновлїнях найдете в  [[Special:Log/delete|книзї змазаных сторінок]].",
        "undelete-header": "Видьте недавно змазаны сторінкы в [[Special:Log/delete|книзї змазаных сторінок]].",
        "tooltip-pt-mycontris": "Список вашых приспівків",
        "tooltip-pt-login": "Рекомендуєме ся приголосити, але не є то повинне.",
        "tooltip-pt-logout": "Одголошіня",
+       "tooltip-pt-createaccount": "Пропонуємо створити обліковий запис і увійти в систему; однак, це не обов'язково",
        "tooltip-ca-talk": "Діскузія о обсягу сторінкы",
        "tooltip-ca-edit": "Тоту сторінку можете едітовати. Просиме, хоснуйте перегляд перед уложінём.",
        "tooltip-ca-addsection": "Створити нову секцію",
        "tooltip-ca-nstab-main": "Обсяг сторінкы",
        "tooltip-ca-nstab-user": "Видїти сторінку хоснователя",
        "tooltip-ca-nstab-media": "Вказати сторінку файлу",
-       "tooltip-ca-nstab-special": "ШпеÑ\86Ñ\96ална Ñ\81Ñ\82оÑ\80Ñ\96нка, Ñ\82ай Ñ\94й Ð½Ðµ Ð³Ð¾Ð´ÐµÐ½ ÐµÐ´Ñ\96Ñ\82оваÑ\82и.",
+       "tooltip-ca-nstab-special": "Це Ñ\81пеÑ\86Ñ\96алÑ\8cна Ñ\81Ñ\82оÑ\80Ñ\96нка, Ð²Ð¾Ð½Ð° Ð½ÐµÐ´Ð¾Ñ\81Ñ\82Ñ\83пна Ð´Ð»Ñ\8f Ñ\80едагÑ\83ваннÑ\8f",
        "tooltip-ca-nstab-project": "Сторінка проєкту",
        "tooltip-ca-nstab-image": "Видїти код сторінкы",
        "tooltip-ca-nstab-mediawiki": "Вказати повідомлїня сістемы",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$1|змінив|змінила}} членство в ґрупах про $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|быв автоматічно переведеный|была автоматічно переведана}} з $4 на $5",
        "rightsnone": "(жадне)",
-       "revdelete-summary": "коментарь едітованя",
        "feedback-adding": "Коментарь ся придавать на сторінку…",
        "feedback-bugcheck": "Герешнї! Лем перевірьте, ці то не єдна з [$1 уж знамых хыб].",
        "feedback-bugnew": "Перевірив(а) єм то. Хочу повідомити нову хыбу.",
        "feedback-subject": "Предмет:",
        "feedback-submit": "Одослати",
        "feedback-thanks": "Дякуєме! Ваш коментарь быв приданый на сторінку „[$2 $1]“.",
-       "searchsuggest-search": "Глядати",
+       "searchsuggest-search": "Глядати {{SITENAME}}",
        "searchsuggest-containing": "обсягуючій...",
        "api-error-badtoken": "Внутрїшня хыба: планый знак.",
        "api-error-emptypage": "Створїня новых, порожнїх сторінк неслободно.",
index 0992814..7875342 100644 (file)
        "externaldberror": "दत्तांशे प्रामाणिकताविषयकः (authentication database) दोषः  स्यात् । अथवा स्वस्य बाह्यसदस्यतायां  (external account) परिवर्तनं कर्तुम् अनुमतिः न भवेत् ।",
        "login": "प्रविश्यताम्",
        "nav-login-createaccount": "प्रविश्यताम् / सदस्यता प्राप्यताम्",
-       "userlogin": "प्रविश्यताम् / सदस्यता प्राप्यताम्",
-       "userloginnocreate": "प्रविश्यताम्",
        "logout": "निर्गम्यताम्",
        "userlogout": "निर्गम्यताम्",
        "notloggedin": "नैव प्रविष्टः",
        "userlogin-noaccount": "सदस्यता नास्ति किम् ?",
        "userlogin-joinproject": "{{SITENAME}} सह योजनम्",
-       "nologin": "सदस्यता नास्ति किम् ? $1",
-       "nologinlink": "सदस्यता प्राप्यताम्",
        "createaccount": "सदस्यता प्राप्यताम्",
-       "gotaccount": "पूर्वमेव सदस्यः अस्ति किम् ? $1",
-       "gotaccountlink": "प्रविश्यताम्",
-       "userlogin-resetlink": "स्वस्य प्रवेशविवरणानि विस्मृतानि किम् ?",
        "userlogin-resetpassword-link": "स्वस्य कूटशब्दः विस्मृतः किम् ?",
        "userlogin-helplink2": "प्रवेशविषयकं साहाय्यम्",
        "userlogin-loggedin": "भवाता/भवत्या पूर्वमेव {{GENDER:$1|$1}} योजकत्वेन प्रवेशः प्राप्तः अस्ति । भिन्नयोजकत्वेन प्रवेष्टुं निम्नप्रपत्रं पूरयतु ।",
        "createacct-another-email-ph": "वि-पत्रसङ्केतः लिख्यताम्",
        "createaccountmail": "अस्थायिनम् अशृङ्खलितं कूटशब्दम् उपयुज्य योग्याय वि-पत्रसङ्केताय प्रेश्यताम् ।",
        "createacct-realname": "वास्तविकं नाम (ऐच्छिकम्)",
-       "createaccountreason": "कारणम् :",
        "createacct-reason": "कारणम्",
        "createacct-reason-ph": "भवतः/भवत्याः अन्यसदस्यतां प्राप्तुं किं प्रयोजनमस्ति ?",
        "createacct-submit": "स्वसदस्यता प्राप्यताम्",
        "preview": "प्राग्दृश्यम्",
        "showpreview": "प्राग्दृश्यं दृश्यताम्",
        "showdiff": "परिवर्तनानि दृश्यन्ताम्",
-       "blankarticle": "<strong>पूर्वसूचना : </strong> भवान्/भवती एकस्य रिक्तपृष्ठस्य निर्माणं करोति ।\nयदि भवान्/भवती \"{{int:savearticle}}\" इत्येतत् पुनः नोत्स्यति, तर्हि रिक्तपृष्ठस्य निर्माणं भविष्यति ।",
+       "blankarticle": "<strong>पूर्वसूचना : </strong> भवान्/भवती एकस्य रिक्तपृष्ठस्य निर्माणं करोति ।\nयदि भवान्/भवती \"$1\" इत्येतत् पुनः नोत्स्यति, तर्हि रिक्तपृष्ठस्य निर्माणं भविष्यति ।",
        "anoneditwarning": "'''पूर्वसूचना''' भवता/भवत्या प्रवेशः न कृतः !\nअत्र सम्पादनं कर्तुं प्रवेशः अनिवार्यः । अन्यथा अस्य पृष्ठस्य इतिहासे भवतः/भवत्याः अन्तर्जालसंविदः (IP) सङ्ख्या अङ्किता भवति । यदि भवान्/भवती <strong>[$1 प्रविषति]</strong> \nउत <strong>[$2 सदस्यातां प्राप्नोति]</strong>, तर्हि अन्यसुविधाभिः सह भवान्/भवती सम्पादनानां श्रेयम् अपि प्राप्स्यति ।",
        "anonpreviewwarning": "''भवता/भवत्या प्रवेशः न स्वीकृतः । अस्य पृष्ठस्य परिवर्तनस्य इतिहासे भवतः/भवत्याः अन्तर्जालसंविदः (IP) उल्लेखो भविष्यति ।''",
-       "missingsummary": "'''स्मरतु''' भवता/भवत्या सम्पादनस्य सारांशः न प्रदत्तः ।\n\"{{int:savearticle}}\" अत्र यदि भवान्/भवती द्वितीयवारं नोत्स्यति, तर्हि भवतः/भवत्याः सम्पादनसारांशात् ऋते परिवर्तनं रक्षितं भविष्यति ।",
-       "selfredirect": "<strong>पूर्वसूचना :</strong> भवान्/भवती एतत् पृष्ठं एतत्पृष्ठं प्रत्येव प्रेषयति ।\nअनुप्रेषिणाय दोषपूर्णं लक्ष्यनिर्देशं भवितुम् अर्हति, अथवा तु भवान्/भवती अशुद्धपृष्ठस्य सम्पादनाय प्रयतते ।\n\"{{int:savearticle}}\" इत्ययत् भवान्/भवती पुनः नुदति चेत्, पुनर्नर्देशनं स्वयमेव भविष्यति ।",
+       "missingsummary": "'''स्मरतु''' भवता/भवत्या सम्पादनस्य सारांशः न प्रदत्तः ।\n\"$1\" अत्र यदि भवान्/भवती द्वितीयवारं नोत्स्यति, तर्हि भवतः/भवत्याः सम्पादनसारांशात् ऋते परिवर्तनं रक्षितं भविष्यति ।",
+       "selfredirect": "<strong>पूर्वसूचना :</strong> भवान्/भवती एतत् पृष्ठं एतत्पृष्ठं प्रत्येव प्रेषयति ।\nअनुप्रेषिणाय दोषपूर्णं लक्ष्यनिर्देशं भवितुम् अर्हति, अथवा तु भवान्/भवती अशुद्धपृष्ठस्य सम्पादनाय प्रयतते ।\n\"$1\" इत्ययत् भवान्/भवती पुनः नुदति चेत्, पुनर्नर्देशनं स्वयमेव भविष्यति ।",
        "missingcommenttext": "कृपया अधः टिप्पणीं लिखतु ।",
-       "missingcommentheader": "'''स्मरतु''' भवता/भवत्या अस्यै टिप्पण्यै विषयः/शीर्षकं न प्रदत्तम् ।\n\"{{int:savearticle}}\" अत्र यदि भवान्/भवती द्वितीयवारं नोत्स्यति, तर्हि भवतः/भवत्याः सम्पादनसारांशात् ऋते एतत् रक्षितं भविष्यति ।",
+       "missingcommentheader": "'''स्मरतु''' भवता/भवत्या अस्यै टिप्पण्यै विषयः/शीर्षकं न प्रदत्तम् ।\n\"$1\" अत्र यदि भवान्/भवती द्वितीयवारं नोत्स्यति, तर्हि भवतः/भवत्याः सम्पादनसारांशात् ऋते एतत् रक्षितं भविष्यति ।",
        "summary-preview": "सारांशस्य प्राग्दृश्यम् :",
        "subject-preview": "विषयस्य/शीर्षकस्य प्राग्दृश्यम्:",
        "previewerrortext": "भवता/भवत्या कृतस्य परिवर्तनस्य प्राग्दृश्यस्य प्रदर्शनकाले दोषः अभवत् ।",
        "editingsection": "$1 (विभागः) सम्पाद्यते",
        "editingcomment": "$1 (नवीनविभागः) सम्पाद्यते",
        "editconflict": "सम्पादनयोः अन्तर्विरोधः : $1",
-       "explainconflict": "भवता/भवत्या यदा सम्पादनं प्रारब्धं, तदारभ्य अन्यजनः अपि अत्र सम्पादनं कुर्वन् आसीत् ।\nअधुना यथा स्थितिः अस्ति, तथा उपरि पेटिकायां द्रष्टुं शक्यते ।\nअधः पेटिकायां भवता/भवत्या कृतानि परिवर्तनानि प्रदर्शितानि सन्ति । \nअधुना पृष्ठे यत् लिखितं वर्तते, तेन सह स्वस्य परिवर्तनानि योजनीयानि भविष्यति । \nभवान्/भवती यदा \" एतत् {{int:savearticle}}\" नुदति, तदा\n<strong>केवलं</strong> उपरिस्तनपेटिकायां यत् लिखितम् अस्ति, तत् रक्षितं भविष्यति ।",
+       "explainconflict": "भवता/भवत्या यदा सम्पादनं प्रारब्धं, तदारभ्य अन्यजनः अपि अत्र सम्पादनं कुर्वन् आसीत् ।\nअधुना यथा स्थितिः अस्ति, तथा उपरि पेटिकायां द्रष्टुं शक्यते ।\nअधः पेटिकायां भवता/भवत्या कृतानि परिवर्तनानि प्रदर्शितानि सन्ति । \nअधुना पृष्ठे यत् लिखितं वर्तते, तेन सह स्वस्य परिवर्तनानि योजनीयानि भविष्यति । \nभवान्/भवती यदा \" एतत् $1\" नुदति, तदा\n<strong>केवलं</strong> उपरिस्तनपेटिकायां यत् लिखितम् अस्ति, तत् रक्षितं भविष्यति ।",
        "yourtext": "भवतः/भवत्याः पाठः",
        "storedversion": "रक्षितसंस्करणम्",
        "nonunicodebrowser": "<strong>पूर्वसूचना : भवतः/भवत्याः गवेषकं (browser) Unicode न समर्थयति ।</strong>\nअत्र भवान्/भवती योग्यरीत्या सम्पादनं कर्तुं शक्ष्यति :\nये वर्णाः ASCII कूटे न भविष्यन्ति, ते hexadecimal वर्णत्वेन प्रदर्शयन्ते ।",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\"-त्वेन संरक्षितानि पृष्ठानि सम्पाद्यन्ताम्",
        "right-editcontentmodel": "एकस्य पृष्ठस्य विषयोदाहरणं सम्पाद्यताम्",
        "right-editinterface": "योजकमाध्यमं सम्पाद्यताम्",
-       "right-editusercssjs": "अन्यस्य सदस्यस्य CSS, JavaScript सञ्चिकाः सम्पाद्यन्ताम्",
        "right-editusercss": "अन्यस्य सदस्यस्य CSS सञ्चिकाः सम्पाद्यन्ताम्",
        "right-edituserjs": "अन्यस्य सदस्यस्य JavaScript सञ्चिकाः सम्पाद्यन्ताम्",
        "right-editmyusercss": "स्वस्य CSS सञ्चिकाः सम्पाद्यन्ताम्",
        "rcshowhidemine": "$1 मम सम्पादनानि",
        "rcshowhidemine-show": "दृश्यताम्",
        "rcshowhidemine-hide": "गोप्यताम्",
-       "rclinks": "अन्तिमेषु $2 दिनेषु जातानि अन्तिमानि $1 परिवर्तनानि दृश्यन्ताम् <br />$3",
+       "rclinks": "अन्तिमेषु $2 दिनेषु जातानि अन्तिमानि $1 परिवर्तनानि दृश्यन्ताम्",
        "diff": "भेदः",
        "hist": "इतिहासः",
        "hide": "गोप्यताम्",
        "undeleteviewlink": "दृश्यताम्",
        "undeleteinvert": "चयनं परिवर्तयतु ।",
        "undeletecomment": "कारणम् :",
-       "undeletedrevisions": "{{PLURAL:$1|संस्करणं पुनस्थापितं|$1 संस्करणानि पुनस्थापितानि}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 संस्करणं|$1 संस्करणानि}} अपि च {{PLURAL:$2|१ सञ्चिका|$2 सञ्चिकाः}} पुनस्थापिताः सन्ति ।",
-       "undeletedfiles": "{{PLURAL:$1|१सञ्चिका|$1 सञ्चिकाः}} पुनस्थापिताः ।",
        "cannotundelete": "अनपाकरणम् असफलम् :\n$1",
        "undeletedpage": "'''$1 इत्येतत् पुनस्थापितम् अस्ति । \nसद्यः अपनीतानि पुनस्थापितानि च पुटाणि ज्ञातुम् अत्र पश्यतु । [[Special:Log/delete|अपनयनप्रवेशः]] ।",
        "undelete-header": "सद्यः एव अपनीतानां पुटानां दर्शनार्थं अत्र प्रविशतु । [[Special:Log/delete|अपनीतावली]] ।",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|अद्यतनीकृतम्}} $4 संस्करणात् $3 इत्येषु $3 पृष्ठानि ({{PLURAL:$7|स्थापितानि}} $6; {{PLURAL:$9|अपाकृतम्}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|अद्यतनीकृतम्}} $5 संस्करणात् $3 इत्येषु $3 पृष्ठानि ({{PLURAL:$7|स्थापितानि}} $6; {{PLURAL:$9|अपाकृतम्}} $8)",
        "rightsnone": "(नैकम्)",
-       "revdelete-summary": "सम्पादनसांक्षेपिक",
        "feedback-adding": "पृष्ठे प्रतिस्पन्दः योजनीयः ...",
        "feedback-back": "प्रतिगम्यताम्",
        "feedback-bugcheck": "उत्तमम् परिशीलयतु यत्  [ $1 known bugs] पूर्वमेव नासीत् इति ।",
index 8c3e93a..33451a5 100644 (file)
        "redirectedfrom": "(Мантан: $1  көстө)",
        "redirectpagesub": "Утаарар сирэй",
        "redirectto": "Манна утаарыы:",
-       "lastmodifiedat": "Бу сирэй бүтэһигин $2, $1 уларыйбыта.",
+       "lastmodifiedat": "Бу сирэйи бүтэһигин $2 $1 уларыппыт.",
        "viewcount": "Бу сирэй {{PLURAL:$1|биирдэ|$1 төгүл}} көрүллүбүт.",
        "protectedpage": "Уларытыллыбат сирэй",
        "jumpto": "Манна көс:",
        "login": "Киир",
        "login-security": "Ким буоларгын бигэргэт",
        "nav-login-createaccount": "Киир / бэлиэтэн",
-       "userlogin": "Киир / бэлиэтэн",
-       "userloginnocreate": "Киир",
        "logout": "Тахсыы",
        "userlogout": "Тахсыы",
        "notloggedin": "Ааккын эппэтиҥ",
        "userlogin-noaccount": "Бэлиэтэнэ иликкин дуо?",
        "userlogin-joinproject": "{{SITENAME}} ситим-сиргэ киирии",
-       "nologin": "Бэлиэтэнэ иликкин дуо? '''$1'''.",
-       "nologinlink": "Бэлиэтэнии",
        "createaccount": "Бэлиэтэнии",
-       "gotaccount": "Бэлиэтэммитиҥ дуо? '''$1'''.",
-       "gotaccountlink": "Аатыҥ",
-       "userlogin-resetlink": "Киирэр тылгын умнубуккун дуо?",
        "userlogin-resetpassword-link": "Аһарык тылгын санаттараҕын дуо?",
        "userlogin-helplink2": "Киирэргэ көмө",
        "userlogin-loggedin": "Маннык аатынан киирбиккин {{GENDER:$1|$1}}.\nАтын аатынан киирэргэ аллара көстөр форманы туһан.",
        "createaccountmail": "Быстах киирии тылы туһаныы уонна ону ыйыллыбыт аадырыска ыытыы",
        "createaccountmail-help": "Атын киһиэхэ аһарыгын билбэккэ эрэ бэлиэ-ааты оҥорон биэрэргэ туттуллуон сөп.",
        "createacct-realname": "Дьиҥнээх аатыҥ (булгуччута суох)",
-       "createaccountreason": "Төрүөтэ:",
        "createacct-reason": "Төрүөтэ",
        "createacct-reason-ph": "Саҥа аатынан тоҕо киирэҕиний",
        "createacct-reason-help": "Саҥаны суруйуу сурунаалыгар тахсар сурук",
        "preview": "Холоон көрүү",
        "showpreview": "Уларытыах иннинэ көрүү",
        "showdiff": "Уларытыылар",
-       "blankarticle": "<strong>Сэрэтии:</strong> Оҥорор сирэйиҥ кураанах.\nБу тимэҕи «{{int:savearticle}}» хос баттаатаххына кураанах сирэй оҥоһуллуо.",
+       "blankarticle": "<strong>Сэрэтии:</strong> Оҥорор сирэйиҥ кураанах.\nБу тимэҕи «$1» хос баттаатаххына кураанах сирэй оҥоһуллуо.",
        "anoneditwarning": "<strong>Болҕой:</strong> Киирбэтэххин. Онон тугу эрэ уларытар түгэҥҥэр аатыҥ оннугар IP аадырыһыҥ барыларыгар көстүө. бу сирэй историятыгар киириэ. Өскөтө <strong>[$1 киирдэххинэ]</strong> эбэтэр <strong>[$2 бэлиэтэннэххинэ]</strong> уларытыыларыҥ Эн ааккын кытта ситимнэниэхтэрэ, ону таһынан ол атын да көдьүүстэрдээх буолуоҕа.",
        "anonpreviewwarning": "''Эн тиһиккэ ааккын эппэттэххин. Уларытыыгын бигэргэттэххинэ IP-аадырыһыҥ сирэй устуоруйатыгар суруллуо.''",
        "missingsummary": "'''Санатыы:''' Уларыппытыҥ кылгас быһаарыытын суруйбатаххын. Уларытыыны бигэргэттэххинэ улартытыыҥ хос быһаарыыта суох барыа.",
-       "selfredirect": "<strong>Болҕой:</strong> Утаарыыны ыстатыйа бэйэтигэр оҥороору гынныҥ.\nБаҕар, утаарыы сирэйин атыны суруйаары гыммытыҥ буолуо эбэтэр атын сирэйи көннөрө олороҕун. \nОл да буоллар, өскө «{{int:savearticle}}» баттамы хат баттаатаххына, утаары оҥоһуллуо.",
+       "selfredirect": "<strong>Болҕой:</strong> Утаарыыны ыстатыйа бэйэтигэр оҥороору гынныҥ.\nБаҕар, утаарыы сирэйин атыны суруйаары гыммытыҥ буолуо эбэтэр атын сирэйи көннөрө олороҕун. \nОл да буоллар, өскө «$1» баттамы хат баттаатаххына, утаары оҥоһуллуо.",
        "missingcommenttext": "Манна хос быһаарыыны суруй.",
-       "missingcommentheader": "<strong>Санатыы:</strong> Хос быһаарыы аатын суруйбатаххын.\n«{{int:savearticle}}» тимэҕи баттаан бигэргэттэххинэ быһаарыыҥ аата суох барыа.",
-       "summary-preview": "Хос быһаарыыны көрүү:",
+       "missingcommentheader": "<strong>Санатыы:</strong> Хос быһаарыы аатын суруйбатаххын.\n«$1» тимэҕи баттаан бигэргэттэххинэ быһаарыыҥ аата суох барыа.",
+       "summary-preview": "ХоÑ\81 Ð±Ñ\8bһааÑ\80Ñ\8bÑ\8bнÑ\8b Ð±Ð¸Ð³Ñ\8dÑ\80гÑ\8dÑ\82иÑ\8dÑ\85 Ð¸Ð½Ð½Ð¸Ð½Ñ\8d ÐºÓ©Ñ\80Ò¯Ò¯:",
        "subject-preview": "Аата маннык көстүөҕэ:",
        "previewerrortext": "Уларытыыгын бигэргэтиэх иннинэ көрдөрөргө алҕас таҕыста.",
        "blockedtitle": "Кыттааччы уларытар кыаҕа быһылынна",
        "editingsection": "Уларытыы $1 (раздел)",
        "editingcomment": "Уларытыы $1 (саҥа салаа)",
        "editconflict": "Уларытыы мөккүөрэ: $1",
-       "explainconflict": "Ыстатыйаны көннөрө олордоххутуна ким эрэ эмиэ бу ыстатыйаны көннөрбүт.\nҮөһээҥи түннүккэ \"Уларытыыны бигэргэт\" тимэҕи баттаатахха киириэхтээх барыл сурулунна.\nАлларааҥы түннүккэ эн барылыҥ көстөр.\nБэйэҥ уларытыыгын киллэриэххин баҕарар буоллаххына аллараттан үөһээҥи түннүккэ уларытыыларгын көһөр.\n\"{{int:savearticle}}\" баттаатаххына үөһээҥи '''эрэ''' тиэкис хаалыаҕа.",
+       "explainconflict": "Ыстатыйаны көннөрө олордоххутуна ким эрэ эмиэ бу ыстатыйаны көннөрбүт.\nҮөһээҥи түннүккэ \"Уларытыыны бигэргэт\" тимэҕи баттаатахха киириэхтээх барыл сурулунна.\nАлларааҥы түннүккэ эн барылыҥ көстөр.\nБэйэҥ уларытыыгын киллэриэххин баҕарар буоллаххына аллараттан үөһээҥи түннүккэ уларытыыларгын көһөр.\n\"$1\" баттаатаххына үөһээҥи '''эрэ''' тиэкис хаалыаҕа.",
        "yourtext": "Тиэкиһиҥ",
        "storedversion": "Суруллубут барыл",
        "nonunicodebrowser": "'''СЭРЭТИИ: Интэриниэтиҥ бырагырааммата Юникод кодировканы билиммэт эбит. Ыстатыйаны уларытаргар ASCII-тан атын бэлиэлэр шестнадцатиричнай кодка уларытыллыахтара.'''",
        "readonlywarning": "<strong>Сэрэтии: Сиэрбэргэ техническай үлэ бара турар, онон киллэрбит уларытыыларыҥ тута бигэргэнэр кыахтара суох.</strong>\nОнон уларытыыгын тиэкистээх билэҕэ уган хаалларан баран, манна кэлин угуоххун сөп.\n\nХааччаҕы туруорбут дьаһабыл маннык быһаарыыны хаалларбыт: $1",
        "protectedpagewarning": "'''Сэрэтии:  Бу сирэй хатанан турар, администратор бырааптаах эрэ кыттааччылар уларытар кыахтаахтар.'''\nАллара сурунаал бүтэһик суруга көрдөрүлүннэ:",
        "semiprotectedpagewarning": "'''Биллэрии:''' Бу сирэй хатанан турар; ааттарын билиһиннэрбит эрэ кыттааччылар уларытар кыахтаахтар.\nАллара сурунаал бүтэһик суруга көрдөрүлүннэ:",
-       "cascadeprotectedwarning": "<strong>Сэрэтии:</strong> Бу сирэйи дьаһабыллар эрэ уларытар кыахтаахтар, тоҕо диэтэххэ сирэй каскаднай көмүскэллээх {{PLURAL:$1|сирэй бөлөҕөр|сирэйдэр бөлөхтөрүгэр}} киирэр:",
+       "cascadeprotectedwarning": "<strong>Сэрэтии:</strong> Бу сирэйи [[Special:ListGroupRights|анал бырааптаах дьон]] эрэ уларытар кыахтаахтар, тоҕо диэтэххэ сирэй каскаднай көмүскэллээх {{PLURAL:$1|сирэй бөлөҕөр|сирэйдэр бөлөхтөрүгэр}} киирэр:",
        "titleprotectedwarning": "'''Сэрэтии:  Маннык ааттаах сирэйи уларытар бобуллубут, [[Special:ListGroupRights|анал бырааптаах эрэ дьон]] уларытыахтарын сөп .'''\nАллара сурунаал бүтэһик суруга көрдөрүлүннэ:",
        "templatesused": "Манна туттуллубут {{PLURAL:$1|халыып|халыыптар}} :",
        "templatesusedpreview": "Манна туттуллубут {{PLURAL:$1|халыып|халыыптар}} бигэргэтиэх иннинэ көстүүлэрэ:",
        "post-expand-template-argument-warning": "Болҕой. Бу сирэйгэ баар халыып биир эбэтэр элбэх наһаа улахан ыйааһыннаах толоруллар аргуменнаах эбит.\nОннук аргуменнар толоруллубатылар.",
        "post-expand-template-argument-category": "Толоруллубатах (көтүтүллүбүт) аргуменнаах сирэйдэр",
        "parser-template-loop-warning": "Халыыптар бэйэ бэйлэригэр сигэниилэрэ (петля) булулунна: [[$1]]",
+       "template-loop-category": "Халыыптара бэйэ бэйэлэригэр сигэнэр сирэйдэр",
+       "template-loop-category-desc": "Бу сирэй халыыба бэйэтин ыҥырар, ол аата бэйэтин холбуу сатыыр эбит.",
        "parser-template-recursion-depth-warning": "($1) халыып рекурсиятын муҥура бүппүт (Превышен предел глубины рекурсии)",
        "language-converter-depth-warning": "Тыл конвертерын дириҥин хааччаҕа куоһарыллыбыт ($1)",
        "node-count-exceeded-category": "Түмүктэрин ахсаана аһара барбыт сирэйдэр",
        "page_first": "бастакы",
        "page_last": "бүтэһик",
        "histlegend": "Барыллары тэҥнииргэ икки радиокнопканы бэлиэтээ. <br />\nБыһаарыылар: (бил.) = билигин баар барылтан атына,\n(инн.) = инники баар барылтан атына, '''к.''' = улахан суолтата суох көннөрүү.",
-       "history-fieldset-title": "Ð\98Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82Ñ\8bн ÐºÓ©Ñ\80Ò¯Ò¯",
-       "history-show-deleted": "СоÑ\82Ñ\83ллÑ\83бÑ\83Ñ\82Ñ\82аÑ\80Ñ\8b эрэ",
+       "history-fieldset-title": "УлаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8bлаÑ\80Ñ\8b ÐºÓ©Ñ\80дөөһүн",
+       "history-show-deleted": "СоÑ\82Ñ\83ллÑ\83бÑ\83Ñ\82Ñ\83 эрэ",
        "histfirst": "саамай эргэ",
        "histlast": "саамай саҥа",
        "historysize": "({{PLURAL:$1|1 байт|$1 баайтаах}})",
        "search-file-match": "(билэ иһинээҕитин кытта сөп түбэһэр)",
        "search-suggest": "Баҕар маннык диэри гыммытыҥ буолуо: $1",
        "search-rewritten": "Бу түмүктэрэ көстөллөр: $1. Ол оннугар маны көрдөт: $2.",
-       "search-interwiki-caption": "Уруулуу бырайыактар",
+       "search-interwiki-caption": "Уруулуу бырайыактарга",
        "search-interwiki-default": "$1 түмүгэ:",
        "search-interwiki-more": "(өссө)",
+       "search-interwiki-more-results": "эбии көстүбүт",
        "search-relatedarticle": "Сигэнэр",
        "searchrelated": "сибээстэммит",
        "searchall": "бары",
        "youremail": "E-mail-ыҥ:",
        "username": "{{GENDER:$1|Бэлиэтэммит аатыҥ}}:",
        "prefs-memberingroups": "Бу {{PLURAL:$1|бөлөххө|бөлөхтөргө}} {{GENDER:$2|киирэр}}:",
+       "group-membership-link-with-expiry": "$1 (маныаха диэри $2)",
        "prefs-registration": "Бэлиэтэнии кэмэ:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Докумуонунан аатыҥ:",
        "prefs-help-prefershttps": "Аныгыскы киириигэр үлэлиир буолуо.",
        "prefswarning-warning": "Туруорууларгын уларыппыккын ол эрэн бигэргэппэтэххин.\nБу сирэйтэн «$1» баттамы баттаабакка таҕытаххына, барыта уруккутунан хаалыа.",
        "prefs-tabs-navigation-hint": "Сүбэ: Көмпүүтэриҥ клаватууратын стрелкаларын туһанан кыбытыктан кыбытыкка көһүөххүн сөп.",
-       "userrights": "Кыттааччылар бырааптарын салайыы",
+       "userrights": "Кыттааччылар бырааптара",
        "userrights-lookup-user": "Кыттааччыны талыы",
        "userrights-user-editname": "Кыттааччы аата:",
        "editusergroup": "Кыттааччы бөлөхтөрүн көрдөрүү",
        "editinguser": "<strong>[[User:$1|$1]]</strong> кыттааччы $2 быраабын уларытыы",
        "viewinguserrights": "{{GENDER:$1|Кыттааччы}} быраабын көрүү <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Кыттааччы бөлөхтөрүн уларытарга",
-       "userrights-viewusergroup": "Кыттааччы бөлөхтөрүн көрүү",
+       "userrights-editusergroup": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн уларытарга",
+       "userrights-viewusergroup": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн көрүү",
        "saveusergroups": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн бигэргэт",
        "userrights-groupsmember": "Бу бөлөхтөргө киирэр:",
        "userrights-groupsmember-auto": "Көстүбэт чилиэн:",
-       "userrights-groups-help": "Ð\91Ñ\83 ÐºÐ¸Ò»Ð¸ ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80 Ð±Ó©Ð»Ó©Ñ\85Ñ\82Ó©Ñ\80үн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bаÑ\85Ñ\85Ñ\8bн Ñ\81өп:\n* Ð\91өлөÑ\85 Ð°Ð°Ñ\82Ñ\8bн Ñ\82аһÑ\8bгаÑ\80 Ð±Ñ\8dлиÑ\8d Ñ\82Ñ\83Ñ\80аÑ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна Ð±Ñ\83 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ñ\83 Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80.\n* Ð\91Ñ\8dлиÑ\8d Ñ\81Ñ\83оÑ\85 Ð±Ñ\83оллаÒ\95Ñ\8bна - ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80бÑ\8dÑ\82\n* Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8d * ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80ин/кииÑ\80бÑ\8dÑ\82ин Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 ÐºÑ\8bаÒ\95Ñ\8bÒ¥ Ñ\81Ñ\83оÒ\95Ñ\83н ÐºÓ©Ñ\80дөÑ\80Ó©Ñ\80.",
+       "userrights-groups-help": "Ð\91Ñ\83 ÐºÐ¸Ò»Ð¸ ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80 Ð±Ó©Ð»Ó©Ñ\85Ñ\82Ó©Ñ\80үн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bаÑ\85Ñ\85Ñ\8bн Ñ\81өп:\n* Ð\91өлөÑ\85 Ð°Ð°Ñ\82Ñ\8bн Ñ\82аһÑ\8bгаÑ\80 Ð±Ñ\8dлиÑ\8d Ñ\82Ñ\83Ñ\80аÑ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна Ð±Ñ\83 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð¾Ð» Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80.\n* Ð\91Ñ\8dлиÑ\8d Ñ\81Ñ\83оÑ\85 Ð±Ñ\83оллаÒ\95Ñ\8bна - ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð¾Ð» Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80бÑ\8dÑ\82\n* Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8d * ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80ин/кииÑ\80бÑ\8dÑ\82ин Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 ÐºÑ\8bаÒ\95Ñ\8bÒ¥ Ñ\81Ñ\83оÒ\95Ñ\83н ÐºÓ©Ñ\80дөÑ\80Ó©Ñ\80.\n* Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8d # ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b Ð±Ó©Ð»Ó©Ñ\85Ñ\85Ó© ÐºÐ¸Ð¸Ñ\80Ñ\8dÑ\80 Ð±Ð¾Ð»Ð´Ñ\8cоÒ\95Ñ\83н Ñ\85ойÑ\83Ñ\82аÑ\82аÑ\80 Ð±Ñ\8bÑ\80аапÑ\82ааÑ\85Ñ\85Ñ\8bн ÐºÓ©Ñ\80дөÑ\80Ó©Ñ\80, Ð¾Ð» Ñ\8dÑ\80Ñ\8dÑ\8dÑ\80и Ñ\8dÑ\80дÑ\8dлÑ\8dÑ\82Ñ\8dÑ\80 ÐºÑ\8bаÒ\95Ñ\8bÒ¥ Ñ\81Ñ\83оÑ\85.",
        "userrights-reason": "Төрүөтэ:",
        "userrights-no-interwiki": "Атын биикилэргэ кыттааччылар бырааптарын уларытар быраабыҥ суох.",
        "userrights-nodatabase": "$1 билэ тиһигэ (олоҕо, база данных) суох эбэтэр локальнай буолбатах.",
        "userrights-changeable-col": "Эн уларытар кыахтаах бөлөхтөрүҥ",
        "userrights-unchangeable-col": "Бу бөлөхтөрү уларытар кыаҕыҥ суох",
+       "userrights-expiry-current": "Болдьоҕо баччаҕа бүтэр: $1",
+       "userrights-expiry-none": "Хаһан да",
+       "userrights-expiry": "Болдьоҕо баччаҕа бүтэр:",
+       "userrights-expiry-existing": "Билиҥҥи болдьоҕо: $3, $2",
+       "userrights-expiry-othertime": "Атын болдьох:",
+       "userrights-expiry-options": "1 күн:1 күн,1 нэдиэлэ:1 нэдиэлэ,1 ый:1 ый,3 ый:3 ый,6 ый:6 ый,1 сыл:1 сыл",
+       "userrights-invalid-expiry": "«$1» бөлөх болдьоҕо алҕастаах ыйыллыбыт.",
+       "userrights-expiry-in-past": "«$1» бөлөх болдьоҕо ааспыт кэмҥэ ыйыллыбыт.",
+       "userrights-cannot-shorten-expiry": "«$1» бөлөххө чилиэнниир болдьоҕу эрдэтээҥҥигэ көһөрөр кыаҕыҥ суох эбит. Бу бөлөххө дьону эбэр кыахтаах дьон эрэ ону оҥоруохтарын сөп.",
        "userrights-conflict": "Кыттааччы быраабын быһаарарга алҕас таҕыста! Хатылаан көр.",
        "group": "Бөлөх:",
        "group-user": "Кыттааччылар",
        "right-editsemiprotected": "Уларытыллар сирэйдэр \"{{int:protect-level-autoconfirmed}}\" таһымынан көмүскэммиттэр",
        "right-editcontentmodel": "Сирэй ис тутулун уларытыы",
        "right-editinterface": "Кыттааччы интерфейсын уларытыы",
-       "right-editusercssjs": "Атын кыттааччылар CSS- и JS-билэлэрин уларытыы",
        "right-editusercss": "Атын кыттааччылар CSS-билэлэрин уларытыы",
        "right-edituserjs": "Атын кыттааччылар JS-билэлэрин уларытыы",
        "right-editmyusercss": "Кыттааччы CSS-билэтин уларытыы",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
        "recentchanges-submit": "Көрдөр",
        "rcfilters-activefilters": "Холбоммут сиидэлэр",
+       "rcfilters-quickfilters": "Түргэн сигэлэр",
+       "rcfilters-savedqueries-defaultlabel": "Бигэргэммит сиидэлэр",
+       "rcfilters-savedqueries-rename": "Аатын уларыт",
+       "rcfilters-savedqueries-setdefault": "Уларыппаккаҕын хааллар",
+       "rcfilters-savedqueries-unsetdefault": "Эбии этиллибэтэҕинэ талыллары суох гын",
+       "rcfilters-savedqueries-remove": "Сот",
+       "rcfilters-savedqueries-new-name-label": "Аата",
+       "rcfilters-savedqueries-apply-label": "Түргэн сигэни оҥоруу",
+       "rcfilters-savedqueries-cancel-label": "Салҕаама",
+       "rcfilters-savedqueries-add-new-title": "Сиидэлэри түргэн сигэ курдук бигэргэт",
+       "rcfilters-restore-default-filters": "Анаан этиллибэтэҕинэ турар сиидэлэри холбоо",
+       "rcfilters-clear-all-filters": "Сиидэлэри барытын суох гын",
        "rcfilters-search-placeholder": "Сиидэлэри кэнники уларытыы (көр биитэр киллэр)",
        "rcfilters-invalid-filter": "Сатаммат сиидэ",
+       "rcfilters-empty-filter": "Холбоммут сиидэ суох. Улартыы барыта көстөр.",
        "rcfilters-filterlist-title": "Сиидэ",
+       "rcfilters-filterlist-whatsthis": "Бу тугуй?",
+       "rcfilters-filterlist-feedbacklink": "Саҥа (бета) сиидэлэр тустарынан суруй",
+       "rcfilters-highlightbutton-title": "Түмүгүн бэлиэтээ",
+       "rcfilters-highlightmenu-title": "Өҥүн тал",
+       "rcfilters-highlightmenu-help": "Өҥүн талан, көстөр гын",
        "rcfilters-filterlist-noresults": "Сиидэ көстүбэтэ",
+       "rcfilters-noresults-conflict": "Көрдөөһүн мэктиэлэрин мөккүөрэ тахсан, туох да көстүбэтэ",
+       "rcfilters-state-message-subset": "Сиидэ туһата суох, тоҕо диэтэххэ кини түмүгэ атын {{PLURAL:$2|сиидэ түмүгэр|сиидэлэр түмүктэригэр}} киирэр эбит (өҥүн уларытыыны туһанан сиһилии көрүөххүн сөп): $1",
+       "rcfilters-state-message-fullcoverage": "Сиидэни барытын талыы тугу да талбатаҕыҥ тэҥэ, онон сиидэ туһата суох. Холбоммут бөлөхтөр: $1",
+       "rcfilters-filtergroup-registration": "Кыттааччылары бэлиэтээһин",
+       "rcfilters-filter-registered-label": "Бэлиэтэммиттэр",
+       "rcfilters-filter-registered-description": "Киирбит эрэдээктэрдэр.",
+       "rcfilters-filter-unregistered-label": "Бэлиэтэммэтэхтэр",
+       "rcfilters-filter-unregistered-description": "Киирбэтэх эрэдээктэрдэр.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Бу сиидэ бэлиэтэммит эрэ кыттааччылары көрөр {{PLURAL:$2|сиидэни|сиидэлэри}} кытта сөп түбэспэт: $1",
        "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-editsbyother-label": "Атыттар уларытыылара",
+       "rcfilters-filter-editsbyother-description": "Атыттар уларытыылара (Эйиэниттэн ураты).",
+       "rcfilters-filtergroup-userExpLevel": "Кыттааччы уопутун таһымынан (бэлиэтэммиттэргэ эрэ)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Уопуту көрөр сиидэ бэлиэтэммит эрэ кыттааччылары көрөр, онон \"Бэлиэтэммэтэх\" диэнинэн көрдүүр сиидэни кытта бииргэ сатаан туттуллубат.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"Бэлиэтэммэтэх\" диэнинэн көрдүүр сиидэ уопуту көрөр биир дуу хас да дуу сиидэни кытта сатаан туттуллубат, тоҕо диэтэххэ уоупут көрөр сиидэлэр бэлиэтэммит эрэ кыттааччылары көрөллөр. Сөп түбэспэт сиидэлэр үөһэ көстөллөр.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Саҥа киирбиттэр",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Отой саҥалар: 10 көннөрүүттэн аҕыйаҕы оҥорбуттар уонна бэлиэтэмиттэрэ 4 хоно иликтэр.",
+       "rcfilters-filter-user-experience-level-learner-label": "Үөрэнээччилэр",
+       "rcfilters-filter-user-experience-level-learner-description": "\"Саҕалааччыттан\" элбэх, \"уопуттаахтан\" аҕыйах уопуттаах.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Уопуттаах кыттааччылар",
+       "rcfilters-filter-user-experience-level-experienced-description": "30 хонуктан ордук үлэлээбит уонна 500 көннөрүүнү оҥорбуттар.",
+       "rcfilters-filtergroup-automated": "Аптамаат көннөрүүлэр",
+       "rcfilters-filter-bots-label": "Оруобат",
+       "rcfilters-filter-bots-description": "Аптамаатынан оҥоһуллубут көннөрүүлэр.",
+       "rcfilters-filter-humans-label": "Киһи (оруобат буолбатах)",
+       "rcfilters-filter-humans-description": "Кыттааччылар оҥорбут уларытыылара.",
+       "rcfilters-filtergroup-reviewstatus": "Тургутуу туруга",
+       "rcfilters-filter-patrolled-label": "Ботуруулламмыт",
+       "rcfilters-filter-patrolled-description": "Ботуруулламмыт курдук бэлиэтэммит уларытыылар.",
+       "rcfilters-filter-unpatrolled-label": "Ботуруулламматах",
+       "rcfilters-filter-unpatrolled-description": "Ботуруулламмыт курдук бэлиэтэммэтэх уларытыылар.",
+       "rcfilters-filtergroup-significance": "Суолтата",
+       "rcfilters-filter-minor-label": "Кыра уларытыы",
+       "rcfilters-filter-minor-description": "Ааптар суолтата суох курдук бэлиэтээбит уларытыылара.",
+       "rcfilters-filter-major-label": "Көннөрү уларытыылар",
+       "rcfilters-filter-major-description": "Кыра уларытыы курдук бэлиэтэммэтэхтэр.",
+       "rcfilters-filtergroup-watchlist": "Кэтэбил испииһэгин сирэйдэрэ",
+       "rcfilters-filter-watchlist-watched-label": "Испииһэккэ",
+       "rcfilters-filter-watchlist-watched-description": "Кэтэбилиҥ испииһэгэр уларытыылар",
+       "rcfilters-filter-watchlist-watchednew-label": "Саҥа уларытыылар",
+       "rcfilters-filter-watchlist-watchednew-description": "Уларытыыларын көрө илик испииһэккэр баар сирэйдэриҥ.",
+       "rcfilters-filter-watchlist-notwatched-label": "Кэтэбилгэ суох",
+       "rcfilters-filter-watchlist-notwatched-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": "Боротокуолланар дьайыылар",
        "rcnotefrom": "Манна {{PLURAL:$5|уларытыы көрдөрүлүннэ|уларытыылар көһүннүлэр}} баччаттан <strong>$3, $4</strong> (баччаттан элбэх көстүбэт <strong>$1</strong>).",
        "rclistfrom": "Бу кэм $3 $2 кэнниттэн оҥоһуллубуттары көрдөр",
        "rcshowhideminor": "$1 кыра уларыйыылары",
        "rcshowhidecategorization": "$1 сирэй категориялааһынын",
        "rcshowhidecategorization-show": "Көрдөр",
        "rcshowhidecategorization-hide": "Кистээ",
-       "rclinks": "$2 күҥҥэ бүтэһик $1 уларытыыны көрдөр;<br />$3.",
+       "rclinks": "$2 күҥҥэ бүтэһик $1 уларытыыны көрдөр;",
        "diff": "уратыта",
        "hist": "устуоруйата",
        "hide": "Кистээ",
        "undeleteviewlink": "көрүү",
        "undeleteinvert": "Хараардыллыбыты инверсиялаа",
        "undeletecomment": "Төрүөтэ:",
-       "undeletedrevisions": "{{PLURAL:$1|1 уларытыы|$1 уларытыы}} төннөрүлүннэ",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 уларытыы|$1 уларытыы}}  уонна {{PLURAL:$2|1 билэ|$2 билэ}} төннөрүлүннэ",
-       "undeletedfiles": "{{PLURAL:$1|1 билэ|$1 билэ}} төннөрүлүннэ",
        "cannotundelete": "Сөргүтүү сороҕо табыллыбата:\n$1",
        "undeletedpage": "'''$1 төннөрүлүннэ (төннөрүллүбүт)'''\n\nКэнники сотуулар уонна төннөрүүлэр испииһэктэрин [[Special:Log/delete|манна]] көрүөххүн сөп.",
        "undelete-header": "Соторутааҥы [[Special:Log/delete|сотуу испииһэгин]] көрүөххүн сөп.",
        "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-back": "Төнүн",
        "feedback-bugcheck": "Бэрт! Ол гынан баран [$1 биллэр алҕастарын] тиһилигэр майгынныыр сурук суоҕун тургут.",
index 737fc46..a9f13f8 100644 (file)
        "externaldberror": "Hoe daṛeyaḱa jahan bahre reaḱ jacaeaḱ ḍaṭabes vul hoeakana se amaḱ bahre reaḱ ekaunṭ do nahaḱ halot aguire ạidạri bạnuḱa.",
        "login": "bolok' duar",
        "nav-login-createaccount": "Boloḱ́ duạr / ekaunt tearme",
-       "userlogin": "Bhitri bolon / ekaunṭ tear",
-       "userloginnocreate": "Bhitri bolo",
        "logout": "Bahre oḍoń",
        "userlogout": "Bahre oḍoń",
        "notloggedin": "Bhitri baṅ bolokana",
        "userlogin-noaccount": "Cet́ accountge banuḱtama?",
        "userlogin-joinproject": "Seledoḱ {{SITENAME}}",
-       "nologin": "Amaḱ do cet́ wikipeḍiare ekaunṭ banuḱtama? Ado '''$1'''",
-       "nologinlink": "account tear me",
        "createaccount": "Ṭhai benaome",
-       "gotaccount": "Amaḱ do cet́ miṭten ekaunṭ tear menaḱtama? $1 tearmẽ.",
-       "gotaccountlink": "Bhitri bolon",
-       "userlogin-resetlink": "Amaḱ boloḱ talam cạbi sanamem hiṛińkeda?",
        "userlogin-resetpassword-link": "Amaḱ uku nambarem hiṛiń akada?",
        "userlogin-helplink2": "Bolon khạtir go̠ṛo̠",
        "createacct-emailoptional": "Email ṭhikana (iccha lekate)",
        "createacct-email-ph": "Amaḱ e-mail ṭhikana emme",
        "createaccountmail": "E-mail hotete",
-       "createaccountreason": "Karon",
        "createacct-submit": "Amaḱ account tearme",
        "createacct-benefit-heading": "{{SITENAME}} am lekan hoṛ hotete tear akan.",
        "createacct-benefit-body1": "{{PLURAL:$1|joṛao|joṛaoko}}",
        "prefs-changeemail": "E-mail ṭhikạna bodolme",
        "prefs-setemail": "E-mail ṭhikana benaome",
        "saveprefs": "Rukhiyạymẽ",
-       "rows": "Sạrko:",
        "searchresultshead": "Sendra",
        "timezoneregion-africa": "Aphrika",
        "timezoneregion-america": "Amirika",
        "rcshowhidemine": "$1 ińaḱ tońgeko",
        "rcshowhidemine-show": "Uduḱme",
        "rcshowhidemine-hide": "Danaṅ",
-       "rclinks": "$2 din lahare $1 bodol unuduḱme <br />$3",
+       "rclinks": "$2 din lahare $1 bodol unuduḱme",
        "diff": "Judạ",
        "hist": "Jạr",
        "hide": "Danaṅ",
index 2bdc449..76e83d2 100644 (file)
        "nstab-template": "Modellu",
        "nstab-help": "Agiudu",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Pàgina printzipale",
        "nosuchaction": "No esistit custa atzione",
        "nosuchactiontext": "S'atzione ispetzificada in sa URL no est vàlida.\nEst possìbile chi sa URL siat istada carcada male, o si siat sighidu unu ligòngiu non vàlidu.\nCustu diat pòdere èssere unu \"bug\" de {{SITENAME}}.",
        "nosuchspecialpage": "Custa pàgina ispetziale no esistit",
        "password-change-forbidden": "Non podes cambiare sa password in custa wiki.",
        "login": "Intra",
        "nav-login-createaccount": "Intra / crea contu",
-       "userlogin": "Intra / crea contu",
-       "userloginnocreate": "Intra",
        "logout": "Serra sessione",
        "userlogout": "Essida",
        "notloggedin": "Non ses intradu",
        "userlogin-noaccount": "Non tenes unu contu?",
        "userlogin-joinproject": "Registra⋅ti a {{SITENAME}}",
-       "nologin": "Non tenes unu contu? '''$1'''.",
-       "nologinlink": "Crea unu contu",
        "createaccount": "Crea contu",
-       "gotaccount": "Tenes giai unu contu? $1.",
-       "gotaccountlink": "Identìfica·ti",
-       "userlogin-resetlink": "As ismentigadu is datos pro s'atzessu?",
        "userlogin-resetpassword-link": "As ismentigadu sa password?",
        "userlogin-helplink2": "Agiudu pro s'atzessu",
        "userlogin-createanother": "Crea un àteru contu",
        "createacct-another-email-ph": "Inserta s'indiritzu post.el",
        "createaccountmail": "Imprea una password a sorte e ispedidda a su indiritzu post.el ispetzificadu",
        "createacct-realname": "Nùmene beru (optzionale)",
-       "createaccountreason": "Motivu:",
        "createacct-reason": "Motivu",
        "createacct-reason-ph": "Pro ite ses creende un àteru contu",
        "createacct-submit": "Crea su contu tuo",
        "passwordreset-emaildisabled": "Is funtzionalidades de email sunt istadas disabilitadas in custa wiki.",
        "passwordreset-username": "Nùmene impitadore:",
        "passwordreset-domain": "Domìniu:",
-       "passwordreset-capture": "Ammustrare su cuntenutu de sa email?",
        "passwordreset-email": "Indiritzu email:",
        "passwordreset-emailtitle": "Particulares de s'impitadore in {{SITENAME}}",
        "passwordreset-emailelement": "Nùmene utente: \n$1\n\nPassword temporànea: \n$2",
        "editingsection": "Cambiende $1 (setzione)",
        "editingcomment": "Modìfica de $1 (setzione noa)",
        "editconflict": "Cunflitu de editzione: $1",
-       "explainconflict": "Calicunu àteru at cambiadu custa pàgina in su tempus chi dda fias cambiende tue.\nS'àrea de testu de susu cuntènnet su testu de sa pàgina in sa forma atuale.\nIs mudàntzias tuas sunt ammustradas in s'àrea de testu in suta.\nAs a dèper insertare is mudàntzias tuas in su testu atuale, e pro custu a ddas iscrìer in s'àrea de susu.\n<strong>Solu</strong> su testu in s'àrea de susu at a èsser sarbadu si carcas su butone \"{{int:savearticle}}\".",
+       "explainconflict": "Calicunu àteru at cambiadu custa pàgina in su tempus chi dda fias cambiende tue.\nS'àrea de testu de susu cuntènnet su testu de sa pàgina in sa forma atuale.\nIs mudàntzias tuas sunt ammustradas in s'àrea de testu in suta.\nAs a dèper insertare is mudàntzias tuas in su testu atuale, e pro custu a ddas iscrìer in s'àrea de susu.\n<strong>Solu</strong> su testu in s'àrea de susu at a èsser sarbadu si carcas su butone \"$1\".",
        "yourtext": "Su testu tuo",
        "storedversion": "Revisione in archìviu",
        "editingold": "<strong>Atentzione: Ses cambiende una versione non-agiornada de sa pàgina.</strong>\nSi dda sarbas de aici, totus is càmbios fatos a pustis de custa versione ant a bènnere pèrdidos pro semper.",
        "saveprefs": "Sarba",
        "restoreprefs": "Restàura totus is sèberos predefinidos (in totus is setziones)",
        "prefs-editing": "Casella de modìfica",
-       "rows": "Lìnias:",
-       "columns": "Colunnas:",
        "searchresultshead": "Chirca",
        "stub-threshold": "Valore mìnimu pro is <a href=\"#\" class=\"stub\">ligòngios a is abotzos</a>, in bytes:",
        "stub-threshold-disabled": "Disativadu",
        "rcshowhidemine": "$1 is modìficas meas",
        "rcshowhidemine-show": "Ammustra",
        "rcshowhidemine-hide": "Cua",
-       "rclinks": "Ammustra is ùrtimas $1 mudàntzias fatas in is ùrtimas $2 dies<br />$3",
+       "rclinks": "Ammustra is ùrtimas $1 mudàntzias fatas in is ùrtimas $2 dies",
        "diff": "dif",
        "hist": "ist",
        "hide": "Cua",
        "boteditletter": "b",
        "rc_categories_any": "Calesisiat",
        "rc-change-size": "$1",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} a pustis de sa modìfica",
        "newsectionsummary": "/* $1 */ setzione noa",
        "rc-enhanced-expand": "Ammustra particulares",
        "rc-enhanced-hide": "Cua particulares",
        "undeleteviewlink": "ammustra",
        "undeleteinvert": "Fùrria sa seletzione",
        "undeletecomment": "Motivu:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revisione restaurada|$1 revisiones restauradas}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revisione|$1 revisiones}} e {{PLURAL:$2|1 file|$2 files}} restaurados",
-       "undeletedfiles": "{{PLURAL:$1|1 file restauradu|$1 files restaurados}}",
        "undelete-search-title": "Chirca pàginas burradas",
        "undelete-search-box": "Chirca pàginas fuliadas",
        "undelete-search-prefix": "Ammustra is pàginas ca su tìtulu cumentzat cun:",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|carrigadu}} una versione noa de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|carrigadu}} $3",
        "rightsnone": "(nisciunu)",
-       "revdelete-summary": "ogetu de sa modìfica",
        "feedback-cancel": "Annudda",
        "feedback-close": "Fatu",
        "feedback-message": "Messàgiu:",
index d74cacf..7956ec8 100644 (file)
        "externaldberror": "S'havi virificatu n'erruri cû server d'autinticazzioni sternu, oppuru nun si disponi di l'auturizzazzioni nicissari p'aggiurnari lu propiu accessu sternu.",
        "login": "Trasi",
        "nav-login-createaccount": "Trasi / crea nu cuntu",
-       "userlogin": "Trasi / crea nu cuntu",
-       "userloginnocreate": "Trasi",
        "logout": "Nesci",
        "userlogout": "Nesci",
        "notloggedin": "Nun trasutu",
        "userlogin-noaccount": "Nun hai nu cuntu?",
        "userlogin-joinproject": "Scrìviti a {{SITENAME}}",
-       "nologin": "Nun hai nu cuntu? $1.",
-       "nologinlink": "Crea nu cuntu",
        "createaccount": "Criazzioni dûn cuntu",
-       "gotaccount": "Già hai nu cuntu? $1.",
-       "gotaccountlink": "Trasi",
-       "userlogin-resetlink": "Ti scurdasti li dittagghî pâ trasuta?",
        "userlogin-resetpassword-link": "Ti scurdasti la password?",
        "userlogin-helplink2": "Aiutu pâ trasuta",
        "userlogin-loggedin": "Già trasisti comu {{GENDER:$1|$1}}.\nAdòpira lu mòdulu ccassutta pi tràsiri comu n'àutru utenti.",
        "createacct-another-email-ph": "Nzirisci lu nnirizzu di posta elittrònica",
        "createaccountmail": "Adòpira na password timpurània casuali e mànnala ô nnirizzu di posta elittrònica spicificatu",
        "createacct-realname": "Nomu veru (facurtativu)",
-       "createaccountreason": "Mutivu:",
        "createacct-reason": "Mutivu",
        "createacct-reason-ph": "Pirchì stai criannu n'àutru cuntu",
        "createacct-submit": "Crea lu tò cuntu",
        "preview": "Antiprima",
        "showpreview": "Ammustra l'antiprima",
        "showdiff": "Ammustra li canciamenti",
-       "blankarticle": "<strong>Accura:</strong> La pàggina chi stai criannu è vacanti.\nSi clicchi \"{{int:savearticle}}\" n'àutra vota, la pàggina veni criata senza nuddu cuntinutu.",
+       "blankarticle": "<strong>Accura:</strong> La pàggina chi stai criannu è vacanti.\nSi clicchi \"$1\" n'àutra vota, la pàggina veni criata senza nuddu cuntinutu.",
        "anoneditwarning": "<strong>Accura:</strong> Nun trasisti. Lu tò nnirizzu IP addiventa visìbbili pubblicamenti quannu fai nu canciamentu. Si <strong>[$1 trasi]</strong> o puru <strong>[$2 crei nu cuntu]</strong>, li canciamenti chi fai vèninu attribbuiti ô tò nomu utenti, sparti d'àutri vantaggi.",
        "anonpreviewwarning": "''Nun trasisti comu utiliggaturi loggatu. Sarbannu, lu tò nnirizzu IP veni arriggistratu ntâ storia dî canciamenti.''",
        "missingsummary": "'''Accura:''' Nun hà statu spicificatu l'uggettu di stu canciamentu. Primennu di novu '''Sarva''' lu canciamentu veni sarvatu cu l'uggettu vacanti.",
-       "selfredirect": "<strong>Accura:</strong> Stai rimannannu sta pàggina a idda stissa.\nPo èssiri chi spicificasti na distinazzioni sbagghiata pû rimannu, o puru chi stai canciannu la pàggina sbagghiata.\nSi clicchi \"{{int:savearticle}}\" n'àutra vota, lu rimannu veni criatu lu stissu.",
+       "selfredirect": "<strong>Accura:</strong> Stai rimannannu sta pàggina a idda stissa.\nPo èssiri chi spicificasti na distinazzioni sbagghiata pû rimannu, o puru chi stai canciannu la pàggina sbagghiata.\nSi clicchi \"$1\" n'àutra vota, lu rimannu veni criatu lu stissu.",
        "missingcommenttext": "Nziriri un cummentu ccà sutta.",
-       "missingcommentheader": "<strong>Accura:</strong> Nun fu spicificatu l'oggettu/ntistazzioni di stu cummentu. Primennu di novu \"{{int:savearticle}}\", lu canciamentu veni sarvatu senza avìrinni.",
+       "missingcommentheader": "<strong>Accura:</strong> Nun fu spicificatu l'oggettu/ntistazzioni di stu cummentu. Primennu di novu \"$1\", lu canciamentu veni sarvatu senza avìrinni.",
        "summary-preview": "Antiprima dû riassuntu:",
        "subject-preview": "Antiprima di l'oggettu/ntistazzioni:",
        "previewerrortext": "Ammattìu n'erruri nta l'ammustrari li tò canciamenti.",
        "editingsection": "Canciamentu di $1 (sizzioni)",
        "editingcomment": "Canciamentu di $1 (sizzioni nova)",
        "editconflict": "Cunflittu d'edizzioni: $1",
-       "explainconflict": "N'àutru utenti havi sarvatu na virsioni nova dâ pàggina mentri stavi effittuannu li canciamenti.\nLa casella di canciamentu supiriuri cunteni lu testu dâ pàggina attuarmenti online, accussì comu hà statu aggiurnatu di l'àutru utenti.\nLa virsioni cu li tò canciamenti è mmeci ripurtata ntâ casella di canciamentu nfiriuri.\nSiddu addisìi cunfirmàrili, hai a ripurtari li tò canciamenti ntô testu asistenti (casella supiriuri).\nPrimennu lu pulsanti '{{int:savearticle}}', veni sarvatu '''sulu''' lu testu cuntinutu ntâ casella di canciamentu supiriuri.",
+       "explainconflict": "N'àutru utenti havi sarvatu na virsioni nova dâ pàggina mentri stavi effittuannu li canciamenti.\nLa casella di canciamentu supiriuri cunteni lu testu dâ pàggina attuarmenti online, accussì comu hà statu aggiurnatu di l'àutru utenti.\nLa virsioni cu li tò canciamenti è mmeci ripurtata ntâ casella di canciamentu nfiriuri.\nSiddu addisìi cunfirmàrili, hai a ripurtari li tò canciamenti ntô testu asistenti (casella supiriuri).\nPrimennu lu pulsanti '$1', veni sarvatu '''sulu''' lu testu cuntinutu ntâ casella di canciamentu supiriuri.",
        "yourtext": "Lu tò testu",
        "storedversion": "La virsioni mimurizzata",
        "nonunicodebrowser": "<strong>Accura: Lu tò browser nun supporta bonu l'Unicode.</strong>\nFu attivata na contramisura pi cunzintìriti di canciari li pàggini n sicurizza: li caràttiri nun-ASCII spùntanu nta la casedda di canciamentu comu còdici esadicimali.",
        "right-editsemiprotected": "Canciari pàggini cu prutizzioni \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Canciari lu mudellu di cuntinutu di na pàggina",
        "right-editinterface": "Canciari la ntirfaccia utenti",
-       "right-editusercssjs": "Canciari li file CSS e JavaScript di l'àutri utenti",
        "right-editusercss": "Canciari li file CSS di l'àutri utenti",
        "right-edituserjs": "Canciari li file JavaScript di l'àutri utenti",
        "right-editmyusercss": "Canciari li file CSS dû propiu utenti",
        "rcshowhidemine": "$1 li mè canciamenti",
        "rcshowhidemine-show": "Ammustra",
        "rcshowhidemine-hide": "Ammuccia",
-       "rclinks": "Ammustra l'ùrtimi $1 canciamenti nta l'ùrtimi $2 jorna <br />$3",
+       "rclinks": "Ammustra l'ùrtimi $1 canciamenti nta l'ùrtimi $2 jorna",
        "diff": "diff",
        "hist": "storia",
        "hide": "Ammuccia",
        "undeleteviewlink": "talìa",
        "undeleteinvert": "Nverti la silizzioni",
        "undeletecomment": "Mutivu:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|virsioni ricupirata|virsioni ricupirati}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|virsioni ricupirata|virsioni ricupirati}} e $2 {{PLURAL:$2|file ricupiratu|file ricupirati}}",
-       "undeletedfiles": "$1 {{PLURAL:$1|file ricupiratu|file ricupirati}}",
        "cannotundelete": "L'annullamentu dâ cancillazzioni nun arriniscìu:\n$1",
        "undeletedpage": "<strong>La pàggina $1 fu ricupirata</strong>\n\nCunzurta lu [[Special:Log/delete|riggistru dî cancillazzioni]] pi vìdiri li cancillazzioni e li ricùpiri cchiù ricenti.",
        "undelete-header": "Talìa lu [[Special:Log/delete|riggistru dî cancillazzioni]] pî pàggini cancillati di ricenti.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|canciau}} l'etichetti dâ virsioni $4 dâ pàggina $3 ({{PLURAL:$7|nn'agghiuncìu}} $6; {{PLURAL:$9|nni livau}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|aggiurnau}} l'etichetti ntâ vuci di riggistru $5 dâ pàggina $3 ({{PLURAL:$7|nn'agghiuncìu}} $6; {{PLURAL:$9|nni livau}} $8)",
        "rightsnone": "(nuddu)",
-       "revdelete-summary": "riassuntu dô canciamentu",
        "feedback-adding": "Agghiuncimentu dû cummentu â pàggina...",
        "feedback-back": "N'arreri",
        "feedback-bugcheck": "Bonu! Sulu cuntrolla chi nun è unu dî [$1 bug già canusciuti].",
index a6af6a9..d82f2e2 100644 (file)
                        "Matma Rex",
                        "Aursani",
                        "V6rg",
-                       "C.R."
+                       "C.R.",
+                       "Anomie"
                ]
        },
        "tog-underline": "Unnerline airtins:",
        "tog-hideminor": "Skauk smaa eidits in recent chynges",
        "tog-hidepatrolled": "Skauk patrolled eidits in recent chynges",
        "tog-newpageshidepatrolled": "Skauk patrolled pages frae the new page leet",
+       "tog-hidecategorization": "Hide categorisation o pages",
        "tog-extendwatchlist": "Mak watchleet bigger tae shaw aw chynges, no just the maist recent",
        "tog-usenewrc": "Groop chynges bi page in recent chynges n watchleet",
        "tog-numberheadings": "Autæ-nummer heidins",
@@ -40,6 +42,7 @@
        "tog-watchdefault": "Eik pages n files that Ah eedit til ma watchleet",
        "tog-watchmoves": "Eik pages n files that Ah muiv til ma watchleet",
        "tog-watchdeletion": "Eik pages n files that Ah get rid o til ma watchleet",
+       "tog-watchuploads": "Add new files a uplaid tae ma watchleet",
        "tog-watchrollback": "Eik pages whaur Ah'v performed ae rowback tae ma watchleet",
        "tog-minordefault": "Mairk aa eedits \"smaa\" bi defaut",
        "tog-previewontop": "Shaw luikower afore eedit kist n naw efter it",
@@ -49,7 +52,7 @@
        "tog-enotifminoredits": "Send me ae wab-mail fer wee eedits o pages n files ava",
        "tog-enotifrevealaddr": "Shaw ma email address in notification mails",
        "tog-shownumberswatching": "Shaw the nummer o watchin uisers",
-       "tog-oldsig": "Exeestin signatur:",
+       "tog-oldsig": "Yer exeestin seegnatur:",
        "tog-fancysig": "Treat signature as wikitext (wioot aen autæmatic airtin)",
        "tog-uselivepreview": "Uise live luik ower (experimental)",
        "tog-forceeditsummary": "Gie me ae jottin when Ah dinnae put in aen eidit owerview",
@@ -59,6 +62,7 @@
        "tog-watchlisthideliu": "Skauk eidits bi loggit in uisers fae the watchleet",
        "tog-watchlisthideanons": "Skauk eidits bi nameless uisers fae the watchleet",
        "tog-watchlisthidepatrolled": "Skauk patrolled eidits fae the watchleet",
+       "tog-watchlisthidecategorization": "Hide categorisation o pages",
        "tog-ccmeonemails": "Gie me copies o emails Ah write tae ither uisers",
        "tog-diffonly": "Dinna shaw page contents ablo diffs",
        "tog-showhiddencats": "Shaw Skauk't categeries",
        "newwindow": "(apens in new windae)",
        "cancel": "Cancel",
        "moredotdotdot": "Mair...",
-       "morenotlisted": "This leet isna complete.",
+       "morenotlisted": "This leet mey be incomplete.",
        "mypage": "Ma page",
        "mytalk": "Ma tauk",
        "anontalk": "Tauk",
        "searcharticle": "Gang",
        "history": "Page histerie",
        "history_short": "Histerie",
+       "history_small": "history",
        "updatedmarker": "updatit sin ma hintmast visit",
        "printableversion": "Prent version",
        "permalink": "Permanent airtin",
        "view-foreign": "See oan $1",
        "edit": "Eedit",
        "edit-local": "Eedit the local descreeption",
-       "create": "Ceaut",
+       "create": "Creaut",
        "create-local": "Eik local descreeption",
        "editthispage": "Eedit this page",
        "create-this-page": "Creaut this page",
        "talk": "Tauk",
        "views": "Views",
        "toolbox": "Tuilkist",
+       "tool-link-userrights": "Chynge {{GENDER:$1|uiser}} groups",
+       "tool-link-userrights-readonly": "View {{GENDER:$1|uiser}} groups",
+       "tool-link-emailuser": "Email this {{GENDER:$1|uiser}}",
        "userpage": "See the uiser page",
        "projectpage": "See waurk page",
        "imagepage": "See the file page",
        "filecopyerror": "Cuidna copie file \"$1\" til \"$2\".",
        "filerenameerror": "Cuidna rename file \"$1\" til \"$2\".",
        "filedeleteerror": "Cuidna delyte file \"$1\".",
-       "directorycreateerror": "Couldna creat directerie \"$1\".",
+       "directorycreateerror": "Couldna creaut directerie \"$1\".",
        "directoryreadonlyerror": "Directerie \"$1\" is read-yinlie.",
        "directorynotreadableerror": "Directerie \"$1\" is no readable.",
        "filenotfound": "Coudna fynd file \"$1\".",
        "no-null-revision": "Coudna mak new null reveesion fer page \"$1\"",
        "badtitle": "Bad teetle",
        "badtitletext": "The requestit page teitle wis onvalid, tuim, or ae wranglie airtit inter-leid or inter-wiki teitle. It micht contain yin or mair chairacters that canna be uised in teitles.",
+       "title-invalid-interwiki": "The requestit page teetle conteens an interwiki airtin which canna be uised in teetles.",
+       "title-invalid-talk-namespace": "The requestit page teetle refers tae a talk page that canna exeest.",
+       "title-invalid-characters": "The requestit page teetle conteens invalid chairacters: \"$1\".",
+       "title-invalid-magic-tilde": "The requestit page teetle conteens invalid magic tilde sequence (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "The requestit page teetle is too lang. It must be na langer nor $1 {{PLURAL:$1|byte|bytes}} in UTF-8 encodin.",
+       "title-invalid-leading-colon": "The requestit page teetle conteens an invalid colon at the beginnin.",
        "perfcached": "The follaein data is cached n michtna be richt up til date. Ae maist muckle o {{PLURAL:$1|yin result is|$1 results ar}} available in the cache.",
        "perfcachedts": "The follaein data is cached, n wis hindermaist updated $1. Ae maist muckkle o {{PLURAL:$4|yin result is|$4 results ar}} available in the cache.",
        "querypage-no-updates": "Updates fer this page ar disablit at the meenit. Data here will nae be refreshit at the meenit.",
        "virus-unknownscanner": "onken't antivirus:",
        "logouttext": "<strong>Ye'r nou loggit oot.</strong>\n\nMynd that some pages micht continue tae be displeyed aes gif ye were still loggit in, til ye clear yer brouser cache.",
        "cannotlogoutnow-title": "Canna log oot nou",
+       "cannotlogoutnow-text": "Loggin oot isna possible when uisin $1.",
        "welcomeuser": "Weelcome, $1!",
        "welcomecreation-msg": "Yer accoont haes been cræftit.\nYe can chynge yer {{SITENAME}} [[Special:Preferences|preeferences]] gif ye like.",
        "yourname": "Uisername:",
        "createacct-yourpasswordagain-ph": "Enter passwaird again.",
        "userlogin-remembermypassword": "Keep me loggit in",
        "userlogin-signwithsecure": "Uise secure connection",
+       "cannotlogin-title": "Canna log in",
+       "cannotlogin-text": "Logging in isna possible.",
        "cannotloginnow-title": "Canna log in nou",
+       "cannotloginnow-text": "Logging in isna possible when uisin $1.",
+       "cannotcreateaccount-title": "Canna creaut accoonts",
        "yourdomainname": "Yer domain:",
        "password-change-forbidden": "Ye canna chynge passwords oan this wiki.",
        "externaldberror": "Aither thaur wis aen external authentication database mistak, or ye'r naw permitit tae update yer external accoont.",
        "login": "Log in",
        "login-security": "Verify yer identity",
-       "nav-login-createaccount": "Log in / cræft aen accoont",
-       "userlogin": "Cræft aen accoont or log in",
-       "userloginnocreate": "Log in.",
+       "nav-login-createaccount": "Log in / creaut accoont",
        "logout": "Log oot",
        "userlogout": "Log oot",
        "notloggedin": "Naw loggit in",
        "userlogin-noaccount": "Dinna hae aen accoont?",
        "userlogin-joinproject": "Jyn {{SITENAME}}",
-       "nologin": "Dinna hae aen accoont? $1.",
-       "nologinlink": "Cræft aen accoont",
        "createaccount": "Creaut accoont",
-       "gotaccount": "Awreadie hae aen accoont? $1.",
-       "gotaccountlink": "Log in",
-       "userlogin-resetlink": "Fergotten yer login details?",
        "userlogin-resetpassword-link": "Fergot yer password?",
        "userlogin-helplink2": "Heelp wi loggin in",
        "userlogin-loggedin": "Ye'r awreadie loggit in as {{GENDER:$1|$1}}.\nUise the form ablow tae log in as anither uiser.",
        "createacct-another-email-ph": "Enter wab-mail address",
        "createaccountmail": "Uise ae temporarie random passwaird n send it til the speceefied wab-mail address",
        "createacct-realname": "Real name (optional).",
-       "createaccountreason": "Raison:",
        "createacct-reason": "Raison",
        "createacct-reason-ph": "Why ar ye creating anither accoont",
        "createacct-reason-help": "Message shawn in the accoont creation log",
        "createacct-submit": "Mak yer accoont",
-       "createacct-another-submit": "Mak anither accoont",
+       "createacct-another-submit": "Creaut accoont",
        "createacct-continue-submit": "Continue accoont creation",
        "createacct-another-continue-submit": "Continue accoont creation",
        "createacct-benefit-heading": "{{SITENAME}} is makit bi fowk like ye.",
        "eauthentsent": "Ae confirmation wab-mail haes been sent til the speceefied wab-mail address.\nAfore oni ither wab-mail is sent til the accoont, ye'll hae tae follae the instructions in the wab-mail, sae as tae confirm that the accoont is reallie yers.",
        "throttled-mailpassword": "Ae password reset wab-mail haes awreadie been sent, wiin the laist {{PLURAL:$1|hoor|$1 hoors}}.\nTae hinder abuiss, yinly the yin password reset wab-mail will be sent per {{PLURAL:$1|hoor|$1 hoors}}.",
        "mailerror": "Mistak sendin mail: $1",
-       "acct_creation_throttle_hit": "Veesiters tae this wiki uisin yer IP address hae creautit $1 {{PLURAL:$1|accoont|accoonts}} the day, this is the maist alloued in that lang.\nSae veesiters uisin this IP address canna creaut onie mair accoonts juist nou.",
+       "acct_creation_throttle_hit": "Veesitors tae this wiki uisin yer IP address hae creautit {{PLURAL:$1|1 accoont|$1 accoonts}} in the last $2, which is the maximum allaed in this time period.\nAs a result, veesitors uisin this IP address canna creaut ony mair accoonts at the moment.",
        "emailauthenticated": "Yer wab-mail address wis confirmed oan $2 at $3.",
        "emailnotauthenticated": "Yer wab-mail address isna yet confirmed.\nNae wab-mail will be sent fer oni o the follaein features.",
        "noemailprefs": "Specifie aen email address in yer preferances fer thir featurs tae wairk.",
        "invalidemailaddress": "The wab-mail address canna be acceptit sin it seems tae be formattit wrang.\nPlease enter ae weel-formattit address or mak that field tuim.",
        "cannotchangeemail": "Accoont wab-mail addresses canna be chynged oan this wiki.",
        "emaildisabled": "This site canna send wab-mails.",
-       "accountcreated": "Accoont cræftit",
-       "accountcreatedtext": "The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tauk]]) haes been cræftit.",
+       "accountcreated": "Accoont creautit",
+       "accountcreatedtext": "The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tauk]]) haes been creautit.",
        "createaccount-title": "Accoont creaution fer {{SITENAME}}",
        "createaccount-text": "Somebodie cræftit aen accoont fer yer wab-mail address oan {{SITENAME}} ($4) named \"$2\", wi passwaird \"$3\".\nYe shid log in n chynge yer passwaird nou.\n\nYe can ignore this message, gif this accoont wis cræftit bi mistak.",
        "login-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.",
        "resetpass_submit": "Set passwaird n log in",
        "changepassword-success": "Yer passwaird chynge wis braw!",
        "changepassword-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.",
+       "botpasswords-createnew": "Creaut a new bot passwird",
+       "botpasswords-label-create": "Creaut",
+       "botpasswords-created-title": "Bot passwird creautit",
+       "botpasswords-created-body": "The bot passwird for bot name \"$1\" o uiser \"$2\" wis creautit.",
        "resetpass_forbidden": "Passwairds canna be chynged",
        "resetpass-no-info": "Ye maun be loggit in tae access this page directly.",
        "resetpass-submit-loggedin": "Chynge passwaird",
        "passwordreset-emailtext-user": "Uiser $1 oan {{SITENAME}} requested ae reset o yer passwaird fer {{SITENAME}}\n($4). The follaein uiser {{PLURAL:$3|accoont is|accoonts ar}} associated wi this wab-mail address:\n\n$2\n\n{{PLURAL:$3|This temperie passwaird|Thir temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.\nYe shid log in n chuise ae new password nou. Gif some ither bodie haes makit this request, or gif ye'v mynded yer oreeginal passwaird, n ye nae langer wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
        "passwordreset-emailelement": "Uisername: \n$1\n\nTemperie passwaird: \n$2",
        "passwordreset-emailsentemail": "Ae passwaird reset wab-mail haes been sent.",
-       "changeemail": "Chynge wab-mail address",
+       "changeemail": "Chynge or remuive email address",
        "changeemail-header": "Chynge accoont wab-mail address",
        "changeemail-no-info": "Ye maun be loggit in tae access this page directly.",
        "changeemail-oldemail": "Current wab-mail address:",
        "sig_tip": "Yer seignatur wi timestamp",
        "hr_tip": "Horizontal line (dinna ower uise)",
        "summary": "Ootline:",
-       "subject": "Subject/heidline:",
+       "subject": "Subject:",
        "minoredit": "This is ae smaa eedit",
        "watchthis": "Watch this page",
        "savearticle": "Hain page",
        "preview": "Luikower",
        "showpreview": "Shaw luikower",
        "showdiff": "Shaw chynges",
-       "blankarticle": "<strong>Wairnishment:</strong> The page that ye'r creautin is blank.\nGif ye clap \"{{int:savearticle}}\" again, the page will be creautit wioot oniething oan it.",
+       "blankarticle": "<strong>Wairnishment:</strong> The page that ye'r creautin is blank.\nGif ye clap \"$1\" again, the page will be creautit wioot oniething oan it.",
        "anoneditwarning": "<strong>Warnishment:</strong> Ye'r no loggit in. Yer IP address will be publeeclie veesible gif ye mak onie eedits. Gif ye <strong>[$1 log in]</strong> or <strong>[$2 creaute aen accoont]</strong>, yer eedits will be attreebutit tae yer uisername, aes weel aes ither benefits.",
        "anonpreviewwarning": "<em>Ye'r no loggit in. Hainin will record yer IP address in this page's eedit histerie.</em>",
-       "missingsummary": "<strong>Mynd:</strong> Ye'v naw gien aen eedit owerview. Gif ye clap oan \"{{int:savearticle}}\" again, yer eedit will be haint wioot ane.",
+       "missingsummary": "<strong>Mynd:</strong> Ye'v naw gien aen eedit owerview. Gif ye clap oan \"$1\" again, yer eedit will be haint wioot ane.",
+       "selfredirect": "<strong>Wairnin:</strong> Ye are redirectin this page tae itsel.\nYe mey hae specifee'd the wrang tairget for the redirect, or ye mey be eeditin the wrang page.\nIf ye click \"$1\" again, the redirect will be creautit onywey.",
        "missingcommenttext": "Please enter ae comment ablo.",
-       "missingcommentheader": "<strong>Mynd:</strong> Ye'v na gien ae subject/heidline fer this comment.\nGif ye clap \"{{int:savearticle}}\" again, yer eedit will be hained wioot yin.",
-       "summary-preview": "Ootline leuk ower:",
-       "subject-preview": "Subject/heidline leuk ower:",
+       "missingcommentheader": "<strong>Reminder:</strong> Ye hae nae providit a subject for this comment.\nIf ye click \"$1\" again, yer eedit will be saved withoot ane.",
+       "summary-preview": "Preview o eedit summary:",
+       "subject-preview": "Preview o subject:",
+       "previewerrortext": "An error occurred while attemptin tae preview yer chynges.",
        "blockedtitle": "Uiser is blockit",
        "blockedtext": "<strong>Yer uisername or IP address haes been blockit.</strong>\n\nThe block wis makit bi $1.\nThe raison gieen is <em>$2</em>.\n\n* Stairt o block: $8\n* Expirie o block: $6\n* Intended blockee: $7\n\nYe can contact $1 or anither [[{{MediaWiki:Grouppage-sysop}}|admeenistrater]] tae discuss the block.\nYe canna uise the \"wab-mail this uiser\" feature onless ae valid wab-mail address is speceefied in yer [[Special:Preferences|accoont preferences]] n ye'v naw been blockit fae uisin it.\nYer current IP address is $3, n the block ID is #$5.\nPlease incluide aw the abuin details in onie speirins that ye mak.",
        "autoblockedtext": "Yer IP address haes been autæmateeclie blockit cause it wis uised bi anither uiser that wis blockit bi $1.\nThe raison gien is:\n\n:<em>$2</em>\n\n* Stairt o block: $8\n* Expirie o block: $6\n* Intended blockee: $7\n\nYe can contact $1 or yin o the ither [[{{MediaWiki:Grouppage-sysop}}|admeenistraters]] tae discuss the block.\n\nMynd that ye canna uise the \"wab-mail this uiser\" feature onless ye hae ae valid wab-mail address registered in yer [[Special:Preferences|uiser preeferances]] n ye'v na been blockit fae uisin it.\n\nYer current IP address is $3, n the block ID is #$5.\nPlease incluid aw abuin details in onie speirins that ye mak.",
+       "systemblockedtext": "Yer uisername or IP address haes been automatically blocked bi MediaWiki.\nThe raison gien is:\n\n:<em>$2</em>\n\n* Stairt o block: $8\n* Expiration o block: $6\n* Intendit blockee: $7\n\nYer current IP address is $3.\nPlease include aw above details in ony queries ye mak.",
        "blockednoreason": "nae grunds put",
        "whitelistedittext": "Pleas $1 tae eedit pages.",
        "confirmedittext": "Ye maun confirm yer wab-mail address afore eeditin pages. Please set n validate yer wab-mail address throogh yer [[Special:Preferences|uiser settins]].",
        "accmailtext": "Ae randomly generated passwaird fer [[User talk:$1|$1]] haes been sent til $2. It can be chynged oan the <em>[[Special:ChangePassword|chynge passwaird]]</em> page upo loggin in.",
        "newarticle": "(New)",
        "newarticletext": "Ye'v follaed aen airtin til ae page that disna exeest yet. Tae cræft the page, stairt typin in the kist ablo (see the [$1 heelp page] fer mair info). Gif ye'r here bi mistak, jist clap yer brouser's <strong>back</strong> button.",
-       "anontalkpagetext": "----\n<em>This is the discussion page fer aen anonymoos uiser that's naw cræftit aen accoont yet, or that disna uise it.</em>\nWe maun therefore uise the numerical IP address tae identifie him/her.\nSic aen IP address can be shaired bi several uisers.\nGif ye'r aen anonymos uiser n feel that onreelavant comments hae been directed at ye, please [[Special:CreateAccount|cræft aen accoont]] or [[Special:UserLogin|log in]] tae avoid futur confusion wi ither anonymoos uisers.",
-       "noarticletext": "Thaur's naw tex oan this page the nou. \nYe can [[Special:Search/{{PAGENAME}}|rake fer this page teitle]] in ither pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} eedit this page].</span>",
+       "anontalkpagetext": "----\n<em>This is the discussion page for an anonymous uiser wha haes nae creautit an accoont yet, or wha disna uise it.</em>\nWe tharefore hae tae use the numerical IP address tae identifee him/her.\nSuch an IP address can be shared bi several uisers.\nIf ye are an anonymous uiser an feel that irrelevant comments hae been directit at ye, please [[Special:CreateAccount|creaut an accoont]] or [[Special:UserLogin|log in]] tae avoid futur confusion wi ither anonymous uisers.",
+       "noarticletext": "Thare is currently na text in this page.\nYe can [[Special:Search/{{PAGENAME}}|sairch for this page teetle]] in ither pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sairch the relatit logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} creaut this page]</span>.",
        "noarticletext-nopermission": "Thaur's nae tex in this page the nou.\nYe can [[Special:Search/{{PAGENAME}}|rake fer this page title]] in ither pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the relatit logs]</span>, but ye dinna hae permeession tae cræft this page.",
        "missing-revision": "The reveesion #$1 o the page named \"{{FULLPAGENAME}}\" disna exeest.\n\nThis is uissuallie caused bi follaein aen ootdated histerie airtin til ae page that haes been delytit.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
        "userpage-userdoesnotexist": "Uiser accoont \"<nowiki>$1</nowiki>\" hasnae been registerit. Please check gin ye wint tae mak or eidit this page.",
        "editingsection": "Eeditin $1 (section)",
        "editingcomment": "Editin $1 (new section)",
        "editconflict": "Eidit conflict: $1",
-       "explainconflict": "Some ither body haes chynged this page syne ye stertit eiditin it.\nThe upper tex area hauds the page tex aes it currentlie exeests.\nYer chynges is shawn in the lower tex area.\nYe'll hae tae merge yer chynges intil the exeestin tex.\n<strong>Juist</strong> the tex in the upper tex area will be hained whan ye press \"{{int:savearticle}}\".",
+       "explainconflict": "Some ither body haes chynged this page syne ye stertit eiditin it.\nThe upper tex area hauds the page tex aes it currentlie exeests.\nYer chynges is shawn in the lower tex area.\nYe'll hae tae merge yer chynges intil the exeestin tex.\n<strong>Juist</strong> the tex in the upper tex area will be hained whan ye press \"$1\".",
        "yourtext": "Yer tex",
        "storedversion": "Storit version",
        "nonunicodebrowser": "<strong>Warnishmant: Yer brouser isna unicode compliant.</strong> Ae wairkaroond is in place tae lat ye sauflie eedit airticles: non-ASCII chairacters will kythe in the eedit kist aes hexadecimal codes.",
        "copyrightwarning": "Please mynd that aw contreebutions til {{SITENAME}} is conseedert tae be released unner the $2 (see $1 for details). Gif ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it it here.<br /> Forbye thon, ye'r promisin us that ye wrat this yersel, or copied it fae ae publeec domain or siclike free resoorce. <strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
        "copyrightwarning2": "Please mynd that aa contreebutions til {{SITENAME}} micht be eeditit, chynged, or remuived bi ither contreebuters.\nGin ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it in here.<br />\nYe'r promisin us forbye that ye wrat this yersel, or copied it fae ae\npubleec domain or siclike free resoorce (see $1 fer details).\n<strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
        "longpageerror": "<strong>Mistak: The tex ye'v submitted is {{PLURAL:$1|yin kilobyte|$1 kilobytes}} lang, n this is langer than the maist muckle o {{PLURAL:$2|yin kilobyte|$2 kilobytes}}.</strong>\nIt canna be hained.",
-       "readonlywarning": "<strong>Warnishment: The database haes been lockit fer maintenance, sae ye'll no be able tae hain yer eedits richt nou.</strong>\nYe micht wish tae copie n paste yer tex intil ae tex file n hain it fer later.\n\nThe admeenistræter that lockit it affered this explanation: $1",
+       "readonlywarning": "<strong>Wairnin: The database haes been locked for maintenance, sae ye will nae be able tae hain yer eedits richt nou.</strong>\nYe mey wish tae copy an paste yer text intae a text file an hain it for later.\n\nThe seestem admeenistrator wha locked it offered this explanation: $1",
        "protectedpagewarning": "<strong>Warnishment: This page haes been protectit sae that yinlie uisers wi admeenistrater preevileges can eedit it.</strong>\nThe latest log entrie is gien ablo fer referance:",
        "semiprotectedpagewarning": "<strong>Mynd:</strong> This page haes been protectit sae that yinlie registered uisers can eedit it.\nThe latest log entrie is gien ablo fer referance:",
-       "cascadeprotectedwarning": "<strong>Warnishment:</strong> This page haes been lockit sae that yinlie uisers wi admeenisræter richts can eidit it, acause it is inclædit in the follaein cascade-protectit {{PLURAL:$1|page|pages}}:",
+       "cascadeprotectedwarning": "<strong>Wairnin:</strong> This page haes been pertectit sae that anerly uisers wi admeenistrator privileges can eedit it acause it is transcludit in the follaein cascade-pertectit {{PLURAL:$1|page|pages}}:",
        "titleprotectedwarning": "<strong>Warnishment: This page haes been protectit sae that [[Special:ListGroupRights|speceefic richts]] ar needed tae cræft it.</strong>\nThe laitest log entrie is gien ablo fer referance:",
        "templatesused": "{{PLURAL:$1|Template|Templates}} uised oan this page:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} uised in this luikower:",
        "invalid-content-data": "Onvalid content data",
        "content-not-allowed-here": "\"$1\" content isna permited oan the page [[$2]]",
        "editwarning-warning": "Leain this page micht cause ye tae lose oni chynges that ye'v makit.\nGif ye'r loggit in, ye can disable this warnishment in the \"{{int:prefs-editing}}\" section o yer preferences.",
+       "editpage-invalidcontentmodel-title": "Content model nae supportit",
+       "editpage-invalidcontentmodel-text": "The content model \"$1\" isna supportit.",
        "editpage-notsupportedcontentformat-title": "Content format isna supported",
        "editpage-notsupportedcontentformat-text": "The content format $1 isna supported bi the content model $2.",
        "content-model-wikitext": "wikitex",
        "content-model-text": "plain tex",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "deprecated-self-close-category": "Pages uising invalid sel-closed HTML tags",
        "duplicate-args-category": "Pages uisin dupleecate arguments in template caws",
        "duplicate-args-category-desc": "The page contains template caws that uise dupleecates o arguments, lik <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Warnishment:</strong> This page contains ower moni expensive parser function caws.\n\nIt shid hae less than $2 {{PLURAL:$2|caw|caws}}, thaur {{PLURAL:$1|is nou $1 caw|ar noo $1 caws}}.",
        "post-expand-template-argument-warning": "<strong>Warnishment:</strong> This page hauds at least the ae template argument that haes aen ower muckle expansion size.\nThir arguments hae been left oot.",
        "post-expand-template-argument-category": "Pages containing omittit template arguments",
        "parser-template-loop-warning": "Template luip detected: [[$1]]",
+       "template-loop-category": "Pages wi template loops",
+       "template-loop-category-desc": "The page conteens a template loop, ie. a template which caws itsel recursively.",
        "parser-template-recursion-depth-warning": "Template recursion depth limit owershote ($1)",
        "language-converter-depth-warning": "Leid converter depth limit owershote ($1)",
        "node-count-exceeded-category": "Pages whaur node-coont is owershote",
        "page_first": "first",
        "page_last": "hintmaist",
        "histlegend": "Diff selection: Maurk the radio kists o the reveesions tae compare n hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = differance wi laitest reveesion, <strong>({{int:last}})</strong> = differance wi preceedin reveesion, <strong>{{int:minoreditletter}}</strong> = smaa eidit.",
-       "history-fieldset-title": "Brouse histerie",
-       "history-show-deleted": "Delytit yinlie",
+       "history-fieldset-title": "Sairch for reveesions",
+       "history-show-deleted": "Reveesion deletit anerly",
        "histfirst": "auldest",
        "histlast": "newest",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "history-feed-description": "Reveesion histerie fer this page oan the wiki",
        "history-feed-item-nocomment": "$1 at $2",
        "history-feed-empty": "The requestit page disnae exeest.\nIt micht hae been delytit fae the wiki, or the name micht hae been chynged.\nTry [[Special:Search|rakin oan the wiki]] fer new pages ye micht be interestit in.",
+       "history-edit-tags": "Eedit tags o selectit reveesions",
        "rev-deleted-comment": "(eedit ootline remuived)",
        "rev-deleted-user": "(uisername remuivit)",
-       "rev-deleted-event": "(log action remuived)",
+       "rev-deleted-event": "(log details remuived)",
        "rev-deleted-user-contribs": "[uisername or IP address remuived - eidit skauk't fae contreebutions]",
        "rev-deleted-text-permission": "This page reveesion haes been <strong>delytit</strong>.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
        "rev-suppressed-text-permission": "This page reveesion haes been <strong>suppressed</strong>.\nTae fynd oot why the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
        "mergehistory-empty": "Naw reveesions can be merged.",
        "mergehistory-done": "$3 {{PLURAL:$3|reveesion|reveesions}} o $1 successfully merged intil [[:$2]].",
        "mergehistory-fail": "Onable tae perform histerie merge, please recheck the page n time parameters.",
+       "mergehistory-fail-invalid-source": "Soorce page is invalid.",
+       "mergehistory-fail-permission": "Insufficient permissions tae merge history.",
+       "mergehistory-fail-self-merge": "Soorce an destination pages are the same.",
        "mergehistory-fail-toobig": "Canna perform histerie merge cause mair than the leemit o $1 {{PLURAL:$1|reveesion|reveesions}} wid be muivit.",
        "mergehistory-no-source": "Soorce page $1 disna exeest.",
        "mergehistory-no-destination": "Destination page $1 disna exeest.",
        "searchprofile-advanced-tooltip": "Rake in custom namespaces",
        "search-result-size": "$1 ({{PLURAL:$2|1 waird|$2 wairds}})",
        "search-result-category-size": "{{PLURAL:$1|1 memmer|$1 memmers}} ({{PLURAL:$2|1 subcategerie|$2 subcategeries}}, {{PLURAL:$3|1 file|$3 files}})",
-       "search-redirect": "(reguide $1)",
+       "search-redirect": "(reguide frae $1)",
        "search-section": "(section $1)",
        "search-category": "(categerie $1)",
        "search-file-match": "(matches file content.)",
        "search-interwiki-caption": "Sister projec's",
        "search-interwiki-default": "Ootcomes fae $1:",
        "search-interwiki-more": "(mair)",
+       "search-interwiki-more-results": "mair results",
        "search-relatedarticle": "Relatit",
        "searchrelated": "relatit",
        "searchall": "aw",
        "search-external": "Eixternal rake",
        "searchdisabled": "Rakin throu {{SITENAME}} is disabled fer performance raisons. Ye can rake bi wa o Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.",
        "search-error": "Ae mistak haes occurred while rakin: $1",
+       "search-warning": "A wairnin has occured while sairchin: $1",
        "preferences": "Ma preferences",
        "mypreferences": "Ma preferences",
        "prefs-edits": "Nummer o eidits:",
        "prefs-personal": "Uiser data",
        "prefs-rc": "Recent chynges n shawin stubs",
        "prefs-watchlist": "Watchleet",
+       "prefs-editwatchlist": "Eedit watchleet",
+       "prefs-editwatchlist-label": "Eedit entries on yer watchleet:",
+       "prefs-editwatchlist-edit": "View an remuive teetles on yer watchleet",
+       "prefs-editwatchlist-raw": "Eedit raw watchleet",
+       "prefs-editwatchlist-clear": "Clear yer watchleet",
        "prefs-watchlist-days": "Days tae shaw in watchleet:",
        "prefs-watchlist-days-max": "Mucklest $1 {{PLURAL:$1|day|days}}",
        "prefs-watchlist-edits": "Mucklest nummer o chynges tae shaw in expanded watchleet:",
        "prefs-watchlist-token": "Watchleet token:",
        "prefs-misc": "Ither",
        "prefs-resetpass": "Chynge passwaird",
-       "prefs-changeemail": "Chynge Wab-mail address",
+       "prefs-changeemail": "Chynge or remuive email address",
        "prefs-setemail": "Set ae wab-mail address",
        "prefs-email": "Wab-mail opties",
        "prefs-rendering": "Appearence",
        "prefs-help-recentchangescount": "This includes recent chynges, page histories, n logs.",
        "prefs-help-watchlist-token2": "This is the hidlins key til the wab feed o yer watchleet. Onibodie wha kens this can read yer watchleet, sae dinna shair it. Gif ye need to, [[Special:ResetTokens|Ye can reset it]].",
        "savedprefs": "Yer preferences haes been hained.",
+       "savedrights": "The uiser groups o {{GENDER:$1|$1}} hae been hained.",
        "timezonelegend": "Time zone:",
        "localtime": "Local time:",
        "timezoneuseserverdefault": "Uise wiki defaut ($1)",
        "youremail": "Yer email:",
        "username": "{{GENDER:$1|Uisername}}:",
        "prefs-memberingroups": "{{GENDER:$2|Memmer}} o {{PLURAL:$1|groop|groops}}:",
+       "group-membership-link-with-expiry": "$1 (till $2)",
        "prefs-registration": "Regeestration time:",
        "yourrealname": "Yer real name:",
        "yourlanguage": "Interface leid:",
        "badsig": "Raw signature nae guid; check HTML tags.",
        "badsiglength": "Yer signatur is ower lang; it haes tae be $1 {{PLURAL:$1|chairacter|chairacters}} or less.",
        "yourgender": "Hou dae ye prefer tae be described?",
-       "gender-unknown": "Ah prefer tae na say",
+       "gender-unknown": "When mentionin ye, the saftware will uise gender neutral wirds whenever possible",
        "gender-male": "He eedits wiki pages",
        "gender-female": "She eedits wiki pages",
        "prefs-help-gender": "Settin this preference is aen optie.\nThe saffware uises its value tae address ye n tae mention ye til ithers uisin the appropriate grammatical gender.\nThis information will be publeec.",
        "prefs-help-prefershttps": "This preeferance will tak effect oan yer nex login.",
        "prefswarning-warning": "Ye'v makit chynges tae yer preferances that'v no been hained yet.\nGif ye leave this page wioot clapin \"$1\" than yer preferances 'll no be updatit.",
        "prefs-tabs-navigation-hint": "Tip: Ye can uise the cair n richt arrae keys tae naveegate atween the tabs in the tabs leet.",
-       "userrights": "Uiser richts managemant",
-       "userrights-lookup-user": "Manage uiser groops",
+       "userrights": "Uiser richts",
+       "userrights-lookup-user": "Select a uiser",
        "userrights-user-editname": "Enter ae uisername:",
-       "editusergroup": "Eidit uiser boorach",
-       "editinguser": "Chynging uiser richts o uiser <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Eedit uiser groops",
-       "saveusergroups": "Hain uiser groops",
+       "editusergroup": "Laid uiser groups",
+       "editinguser": "Chyngin uiser richts o {{GENDER:$1|uiser}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Viewin uiser richts o {{GENDER:$1|uiser}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Eedit {{GENDER:$1|uiser}} groups",
+       "userrights-viewusergroup": "View {{GENDER:$1|uiser}} groups",
+       "saveusergroups": "Save {{GENDER:$1|uiser}} groups",
        "userrights-groupsmember": "Memmer o:",
        "userrights-groupsmember-auto": "Impleecit memmer o:",
        "userrights-groups-help": "Ye can alter the groops this uiser is in:\n* Ae checkit kist means that the uiser is in that groop.\n* Aen oncheckit kist means that the uiser's na in that groop.\n* Ae * indeecates that ye canna remuiv the groop yince ye'v eikit it, or vice versa.",
        "userrights-nodatabase": "Database $1 disna exeest or isna local.",
        "userrights-changeable-col": "Groops that ye can chynge",
        "userrights-unchangeable-col": "Groops ye canna chynge",
+       "userrights-expiry-none": "Disna expire",
+       "userrights-expiry-othertime": "Ither time:",
        "userrights-conflict": "Conflict o uiser richts chynges! Please luikower n confirm yer chynges.",
        "group": "Groop:",
        "group-user": "Uisers",
        "right-editsemiprotected": "Eedit pages protected aes \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Eedit the content model o ae page",
        "right-editinterface": "Eedit the uiser interface",
-       "right-editusercssjs": "Eedit ither uisers' CSS n JavaScript files",
        "right-editusercss": "Eedit ither uisers' CSS files",
        "right-edituserjs": "Eedit ither uisers' JavaScript files",
        "right-editmyusercss": "Eidit yer ain uiser CSS files",
        "right-siteadmin": "Lock n lowse the database",
        "right-override-export-depth": "Export pages incluidin linked pages up til ae depth o 5",
        "right-sendemail": "Send Wab-mail til ither uisers",
+       "right-managechangetags": "Creaut an (de)activate [[Special:Tags|tags]]",
+       "grant-createaccount": "Creaut accoonts",
+       "grant-rollback": "Rowback chynges tae pages",
+       "grant-sendemail": "Send email tae ither uisers",
+       "grant-basic": "Basic richts",
        "newuserlogpage": "Uiser cræftin log",
        "newuserlogpagetext": "This is ae log o uiser cræftins.",
        "rightslog": "Uiser richts log",
        "rightslogtext": "This is a log o chynges tae uiser richts.",
        "action-read": "read this page",
        "action-edit": "eedit this page",
-       "action-createpage": "cræft pages",
-       "action-createtalk": "cræft discussion pages",
+       "action-createpage": "creaut this page",
+       "action-createtalk": "creaut this discussion page",
        "action-createaccount": "cræft this uiser accoont",
+       "action-autocreateaccount": "automatically creaut this freemit uiser accoont",
        "action-history": "see the histerie o this page",
        "action-minoredit": "maurk this eedit aes smaa",
        "action-move": "muiv this page",
        "action-upload_by_url": "uplaid this file fae ae URL",
        "action-writeapi": "uise the write API",
        "action-delete": "delyte this page",
-       "action-deleterevision": "delyte this reveesion",
-       "action-deletedhistory": "see this page's delytit histerie",
+       "action-deleterevision": "delete reveesions",
+       "action-deletelogentry": "delete log entries",
+       "action-deletedhistory": "view a page's delete history",
+       "action-deletedtext": "view delete reveesion text",
        "action-browsearchive": "rake delytit pages",
-       "action-undelete": "ondelyte this page",
-       "action-suppressrevision": "luikower n restore this skaukt reveesion",
+       "action-undelete": "undelete pages",
+       "action-suppressrevision": "review an restore hidden reveesions",
        "action-suppressionlog": "see this preevate log",
        "action-block": "block this uiser fae eeditin",
        "action-protect": "chynge protection levels fer this page",
        "action-userrights-interwiki": "eedit the uiser richts o uisers oan ither wikis",
        "action-siteadmin": "lock or lowse the database",
        "action-sendemail": "send wab-mails",
+       "action-editmyoptions": "eedit yer preferences",
        "action-editmywatchlist": "eedit yer watchleet",
        "action-viewmywatchlist": "see yer watchleet",
        "action-viewmyprivateinfo": "see yer preevate information",
        "action-editmyprivateinfo": "eedit yer preevate information",
        "action-editcontentmodel": "eedit the content model o ae page",
+       "action-managechangetags": "creaut an (de)activate tags",
        "nchanges": "$1 {{PLURAL:$1|chynge|chynges}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sin laist veesit}}",
        "enhancedrc-history": "histeri",
        "recentchanges-label-plusminus": "The page size chynged bi this nummer o bytes",
        "recentchanges-legend-heading": "<strong>Legend:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (see [[Special:NewPages|leet o new pages]] n aw)",
+       "recentchanges-submit": "Shaw",
+       "rcfilters-filterlist-whatsthis": "Whit's this?",
+       "rcfilters-filter-editsbyself-description": "Eedits bi ye.",
+       "rcfilters-filter-major-description": "Eedits nae labeled as minor.",
+       "rcfilters-filter-pageedits-label": "Page eedits",
        "rcnotefrom": "Ablo {{PLURAL:$5|is the chynge|ar the chynges}} sin <strong>$3, $4</strong> (up tae <strong>$1</strong> shawn).",
        "rclistfrom": "Shaw new chynges stertin fae $3 $2",
        "rcshowhideminor": "$1 smaa eedits",
        "rcshowhidemine": "$1 ma eedits",
        "rcshowhidemine-show": "Shaw",
        "rcshowhidemine-hide": "Skauk",
-       "rclinks": "Shaw last $1 chynges in last $2 days<br />$3",
+       "rcshowhidecategorization-show": "Shaw",
+       "rclinks": "Shaw last $1 chynges in last $2 days",
        "diff": "diff",
        "hist": "hist",
        "hide": "Skauk",
        "upload-too-many-redirects": "The URL contained oewr monie reguidals",
        "upload-http-error": "Aen HTTP mistake occurred: $1",
        "upload-copy-upload-invalid-domain": "Copie uplaids arna available fae this domain.",
+       "upload-dialog-title": "Uplaid file",
+       "upload-dialog-button-cancel": "Cancel",
+       "upload-dialog-button-back": "Back",
+       "upload-dialog-button-done": "Duin",
+       "upload-dialog-button-save": "Hain",
+       "upload-dialog-button-upload": "Uplaid",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Name",
+       "upload-form-label-own-work": "This is ma awn wark",
+       "upload-form-label-own-work-message-generic-local": "A confirm that A am uplaidin this file follaein the terms o service an licensin policies on {{SITENAME}}.",
        "backend-fail-stream": "Coudna stream file \"$1\".",
        "backend-fail-backup": "Coudna backup file \"$1\".",
        "backend-fail-notexists": "The file $1 disna exeest.",
        "randomincategory-nopages": "Thaur's naw pages in the [[:Category:$1|$1]] categerie.",
        "randomincategory-category": "Categerie:",
        "randomincategory-legend": "Random page in categerie",
+       "randomincategory-submit": "Gae",
        "randomredirect": "Random reguidal",
        "randomredirect-nopages": "Thaur's naw reguidals in the namespace \"$1\".",
        "statistics": "Stateestics",
        "apihelp-no-such-module": "Module \"$1\" wis no foond.",
        "apisandbox-loading": "Laidin information for API module \"$1\"...",
        "apisandbox-load-error": "An error occurred while laidin information for API module \"$1\": $2",
+       "apisandbox-multivalue-all-values": "$1 (Aw values)",
        "booksources": "Buik soorces",
        "booksources-search-legend": "Rake fer buik soorces",
        "booksources-search": "Rake",
        "booksources-text": "Ablo is ae leet o airtins til ither steids that sell new n uised buiks, n micht hae further information aneat buiks that ye'r seekin ava:",
        "booksources-invalid-isbn": "The gien ISBN disna seem tae be valid; check fer mistaks copiein fae the oreeginal soorce.",
+       "magiclink-tracking-rfc": "Pages uisin RFC magic airtins",
+       "magiclink-tracking-pmid": "Pages uisin PMID magic airtins",
+       "magiclink-tracking-isbn": "Pages uisin ISBN magic airtins",
        "specialloguserlabel": "Performer:",
        "speciallogtitlelabel": "Target (title or uiser):",
        "log": "Logs",
        "trackingcategories-msg": "The Trackin Categerie",
        "trackingcategories-name": "The Message name",
        "trackingcategories-desc": "Categerie inclusion criteria",
+       "restricted-displaytitle-ignored": "Pages wi ignored display teetles",
        "noindex-category-desc": "The page haes ae <code><nowiki>__NOINDEX__</nowiki></code> mageec waird oan it (n is in ae namespace whaur that flag is alloud), n sae it's no indext bi the robots.",
        "index-category-desc": "The page haes ae <code><nowiki>__INDEX__</nowiki></code> oan it (n is in ae namespace whaur that flag is alloud), n sae it's indext bi the robots whaur it widna normallie be.",
        "post-expand-template-inclusion-category-desc": "The page size is muckler than <code>$wgMaxArticleSize</code>, efter makin aw o the templates muckler, sae some templates were no makit muckler.",
        "watchnologin": "Nae loggit in",
        "addwatch": "Eik til watchleet",
        "addedwatchtext": "The page \"[[:$1]]\" haes been added til yer [[Special:Watchlist|watchleet]].\nFutur chynges til this page n its associated tauk page will be leeted thaur.",
-       "addedwatchtext-short": "The page \"$1\" haes been eikit tae yer watchleet.",
+       "addedwatchtext-short": "The page \"$1\" haes been addit tae yer watchleet.",
        "removewatch": "Remuiv fae watchleet",
        "removedwatchtext": "The page \"[[:$1]]\" haes been remuied fae [[Special:Watchlist|yer watchleet]].",
        "removedwatchtext-short": "The page \"$1\" haes been remuived fae yer watchleet.",
        "modifiedarticleprotection": "chynged protection level fer \"[[$1]]\"",
        "unprotectedarticle": "remuied protection fae \"[[$1]]\"",
        "movedarticleprotection": "muived protection settins fae \"[[$2]]\" til \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Pertectit}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Chynged pertection level}} for \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Remuived protection}} frae \"[[$1]]\"",
        "protect-title": "Chynge protection level fer \"$1\"",
        "protect-title-notallowed": "See protection level o \"$1\"",
        "prot_1movedto2": "[[$1]] muivit tae [[$2]]",
        "undeleteviewlink": "see",
        "undeleteinvert": "Invert the selection",
        "undeletecomment": "Raison:",
-       "undeletedrevisions": "{{PLURAL:$1|1 reveesion|$1 reveesions}} restored",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 reveesion|$1 reveesions}} n {{PLURAL:$2|1 file|$2 files}} restored",
-       "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
        "cannotundelete": "Ondelyte failed:\n$1",
        "undeletedpage": "<strong>$1 haes been restored</strong>\n\nConsult the [[Special:Log/delete|delytion log]] fer ae record o recynt delytions n restorations.",
        "undelete-header": "See [[Special:Log/delete|the delytion log]] fer the recentlie delytit pages.",
        "contributions": "{{GENDER:$1|Uiser}} contributions",
        "contributions-title": "Uiser contreebutions fer $1",
        "mycontris": "Ma contreebutions",
+       "anoncontribs": "Contreibutions",
        "contribsub2": "Fer {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Uiser accoont \"$1\" is no registerit.",
        "nocontribs": "Nae chynges wis funnd matchin thir criteria.",
        "sp-contributions-username": "IP address or uisername:",
        "sp-contributions-toponly": "Ainlie shaw eedits that ar laitest reveesions",
        "sp-contributions-newonly": "Yinlie shaw eidits that ar page cræftins",
+       "sp-contributions-hideminor": "Hide minor eedits",
        "sp-contributions-submit": "Rake",
        "whatlinkshere": "Whit airts here",
        "whatlinkshere-title": "Pages that link til \"$1\"",
        "whatlinkshere-hidelinks": "$1 airtins",
        "whatlinkshere-hideimages": "$1 file airtins",
        "whatlinkshere-filters": "Filters",
+       "whatlinkshere-submit": "Gae",
        "autoblockid": "Autæblock #$1",
        "block": "Block uiser",
        "unblock": "Onblock uiser",
        "thumbnail_image-missing": "File seems tae be missin: $1",
        "thumbnail_image-failure-limit": "Thaur hae been ower monie recynt failed attempts ($1 or mair) tae render this thummnail. Please ettle again later.",
        "import": "Import pages",
-       "importinterwiki": "Transwiki import",
+       "importinterwiki": "Import frae anither wiki",
        "import-interwiki-text": "Select ae wiki n page title tae import.\nReveesion dates n eediters' names will be preserved.\nAw transwiki import actions ar loggit at the [[Special:Log/import|import log]].",
        "import-interwiki-sourcewiki": "The Soorce wiki:",
        "import-interwiki-sourcepage": "The Soorce page:",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|reveesion|reveesions}} importit fae $2",
        "javascripttest": "JavaScript testin",
        "javascripttest-qunit-intro": "See [$1 testin documentation] oan mediawiki.org.",
-       "tooltip-pt-userpage": "Yer uiser page",
+       "tooltip-pt-userpage": "{{GENDER:|Yer uiser}} page",
        "tooltip-pt-anonuserpage": "The uiser page fer the IP address that ye'r eeditin aes",
-       "tooltip-pt-mytalk": "Yer tauk page",
+       "tooltip-pt-mytalk": "{{GENDER:|Yer}} tauk page",
        "tooltip-pt-anontalk": "Discussion aneat eedits fae this IP address",
-       "tooltip-pt-preferences": "Ma preferances",
+       "tooltip-pt-preferences": "{{GENDER:|Yer}} preferences",
        "tooltip-pt-watchlist": "Ae leet o pages ye'r moniterin fer chynges",
-       "tooltip-pt-mycontris": "Leet o yer contreebutions",
+       "tooltip-pt-mycontris": "A leet o {{GENDER:|yer}} contreibutions",
+       "tooltip-pt-anoncontribs": "A leet o eedits made frae this IP address",
        "tooltip-pt-login": "It's ae guid idea tae log in, but ye dinna hae tae.",
        "tooltip-pt-logout": "Log oot",
        "tooltip-pt-createaccount": "We encoorage ye tae creaute aen accoont n log in; houever, it's no strictllie nesisair",
        "tooltip-t-recentchangeslinked": "Recynt chynges in pages linkt fae this page",
        "tooltip-feed-rss": "RSS feed fer this page",
        "tooltip-feed-atom": "Atom feed fer this page",
-       "tooltip-t-contributions": "See ae leet o this uiser's contreebutions",
+       "tooltip-t-contributions": "A leet o contreibutions bi {{GENDER:$1|this uiser}}",
        "tooltip-t-emailuser": "Send ae wab-mail til this uiser",
        "tooltip-t-info": "Mair information aneat this page",
        "tooltip-t-upload": "Uplaid files",
        "lastmodifiedatby": "This page wis laist modified $2, $1 bi $3.",
        "othercontribs": "Based oan wark bi $1.",
        "others": "ithers",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|uiser|uisers}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|uiser}}|uisers}} $1",
        "anonusers": "{{SITENAME}} anonymoos {{PLURAL:$2|uiser|uisers}} $1",
        "creditspage": "Page creeedits",
        "nocredits": "Thaur's nae creedit info available fer this page.",
        "pageinfo-length": "Page langth (in bytes)",
        "pageinfo-article-id": "The Page ID",
        "pageinfo-language": "Page content leid",
+       "pageinfo-language-change": "chynge",
        "pageinfo-content-model": "The Page content model",
        "pageinfo-robot-policy": "Indexin bi robots",
        "pageinfo-robot-index": "Permitit",
        "pageinfo-robot-noindex": "Na permitit",
        "pageinfo-watchers": "Nummer o page watchers",
+       "pageinfo-visiting-watchers": "Nummer o page watchers wha veesitit recent eedits",
        "pageinfo-few-watchers": "Less than $1 {{PLURAL:$1|watcher|watchers}}",
        "pageinfo-redirects-name": "Nummer o reguidals til this page",
        "pageinfo-subpages-name": "Nummer o subpages o this page",
        "newimages-summary": "This byordinair page shaws the last uplaidit files.",
        "newimages-legend": "Filter",
        "newimages-label": "Filename (or ae pairt o it):",
+       "newimages-user": "IP address or uisername",
        "newimages-showbots": "Shaw uplaids bi bots",
        "noimages": "Nawthing tae see.",
        "ilsubmit": "Rake",
        "watchlistedit-raw-done": "Yer watchleet haes been updated.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 title wis|$1 titles were}} added:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 title wis|$1 titles were}} remuived:",
-       "watchlistedit-clear-title": "Cleared watchleet",
+       "watchlistedit-clear-title": "Clear watchleet",
        "watchlistedit-clear-legend": "Clear watchleet",
        "watchlistedit-clear-explain": "Aw o the titles will be remuived fae yer watchleet",
        "watchlistedit-clear-titles": "Titles:",
        "tags-active-no": "Naw",
        "tags-edit": "eedit",
        "tags-hitcount": "$1 {{PLURAL:$1|chynge|chynges}}",
+       "tags-create-submit": "Creaut",
        "tags-edit-logentry-selected": "{{PLURAL:$1|Selectit log event|Selectit log events}}:",
        "tags-edit-logentry-legend": "Add or remuive tags frae {{PLURAL:$1|this log entry|aw $1 log entries}}",
        "tags-edit-logentry-submit": "Apply chynges tae {{PLURAL:$1|this log entry|$1 log entries}}",
        "logentry-managetags-delete": "$1 {{GENDER:$2|deletit}} the tag \"$4\" (remuived frae $5 {{PLURAL:$5|reveesion or log entry|reveesions an/or log entries}})",
        "log-name-tag": "Tag log",
        "rightsnone": "(nane)",
-       "revdelete-summary": "eedit the ootline",
        "feedback-adding": "Eikin feedback til page...",
        "feedback-bugcheck": "Wunnerfu! Just check that it's na awreadie yin o the [$1 knawn bugs].",
        "feedback-bugnew": "Ah checkt. Report ae new bug",
        "feedback-subject": "Aneat:",
        "feedback-submit": "Haun-in",
        "feedback-thanks": "Thanks! Yer feedback haes been posted til the page \"[$2 $1]\".",
-       "searchsuggest-search": "Rake",
+       "searchsuggest-search": "Sairch {{SITENAME}}",
        "searchsuggest-containing": "containin...",
        "api-error-badtoken": "Inby mistak: Bad token.",
        "api-error-emptypage": "Cræftin new, tuim pages isna permittit.",
        "pagelang-language": "Leid",
        "pagelang-use-default": "Uise the defaut leid",
        "pagelang-select-lang": "Pick yer leid",
+       "pagelang-nonexistent-page": "The page $1 disna exeest.",
+       "pagelang-unchanged-language": "The page $1 is already set tae leid $2.",
+       "pagelang-unchanged-language-default": "The page $1 is awready set tae the wiki's default content leid.",
+       "pagelang-db-failed": "The database failed tae chynge the page leid.",
        "right-pagelang": "Chynge page leid",
        "action-pagelang": "chynge the page leid",
        "log-name-pagelang": "Leid chynge log",
        "log-description-pagelang": "This is ae log o chynges in page leids.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|chynged}} page leid fer $3 fae $4 tae $5.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|chynged}} the leid o $3 frae $4 tae $5",
        "default-skin-not-found": "Whoops! The defaut skin fer yer wiki, defined in <code dir=\"ltr\">$wgDefaultSkin</code> aes <code>$1</code>, is no available.\n\nYer instawation seems tae incluid the follaein skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] fer information oan hou tae enable thaim n chuise the defaut.\n\n$2\n\n; Gif ye'v juist instawed MediaWiki:\n: Ye proabablie instawed it fae git, or directlie fae the soorce code uisin some ither method. This is expectie. Gie instawin some skins fae [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] ae shot, bi:\n:* Dounlaidin the [https://www.mediawiki.org/wiki/Download tarball installer], this comes wi several skins n extensions. Ye can than capie n paste the <code>skins/</code> directerie fae this.\n:* Dounlaidin indiveedual skin tarballs frae [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonin one of the <code>mediawiki/skins/*</code> repositries bi wa o git intae the <code dir=\"ltr\">skins/</code> directerie o yer MediaWiki instawation.\n: Daein this shoudna interfere wi yer git repositrie gif ye'r ae MediaWiki deveeloper.\n\n; Gif ye,v juist upgradit MediaWiki:\n: MediaWiki 1.24 n newer nae langer enables instawed skins autæmateeclie (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Ye can paste the follaein lines intae <code>LocalSettings.php</code> tae enable aw nou installed skins:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Gif ye'v juist modified <code>LocalSettings.php</code>:\n: Double-check the skin names fer typos.",
        "default-skin-not-found-no-skins": "Whoops! The defaut skin fer yer wiki, defined in <code>$wgDefaultSkin</code> aes <code>$1</code>, is no available.\n\nYe'v nae instawed skins.\n\n; Gif ye'v juist instawed or upgradit MediaWiki:\n: Ye probably instawed fae git, or directlie fae the soorce code uisin some ither method. This is expectit. MediaWiki 1.24 n newer disna incluid onie skins in the main repositrie. Gie instawin some skins fae [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] ae shot, bi:\n:* Dounlaidin the [https://www.mediawiki.org/wiki/Download tarball installer], this comes wi several skins n extensions. Ye can than capie n paste the <code>skins/</code> directerie fae it.\n:* Dounlaidin individual skin tarballs fae [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Cloning yin o the <code>mediawiki/skins/*</code> repositries bi wa o git intae the <code dir=\"ltr\">skins/</code> directerie o yer MediaWiki instawation.\n: Daein this shoudna interfere wi yer git repositrie gif ye'r ae MediaWiki deveeloper. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] fer information oan hou tae enable skins n chuise the defaut.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enabled)",
        "mediastatistics-header-text": "Texual",
        "mediastatistics-header-executable": "Executables",
        "mediastatistics-header-archive": "Compressed formats",
+       "mediastatistics-header-total": "Aw files",
        "json-warn-trailing-comma": "$1 trailin {{PLURAL:$1|comma wis|commas were}} remuived fae JSON",
        "json-error-unknown": "Thaur wis ae proablem wi the JSON. Mistak: $1",
        "json-error-depth": "The mucklest stack depth haes been exceedit",
        "authmanager-authn-no-local-user-link": "The supplee'd credentials are valid but are nae associatit wi ony uiser on this wiki. Login in a different way, or create a new uiser, an ye will hae an option tae airtin yer previous credentials tae that accoont.",
        "authform-nosession-login": "The authentication wis successfu, but yer brouser canna \"remember\" bein logged in.\n\n$1",
        "authpage-cannot-login": "Unable tae stairt login.",
-       "authpage-cannot-login-continue": "Unable tae continue login. Yer session maist likly timed oot."
+       "authpage-cannot-login-continue": "Unable tae continue login. Yer session maist likly timed oot.",
+       "restrictionsfield-label": "Allaed IP ranges:"
 }
index 9549557..010223b 100644 (file)
@@ -6,7 +6,8 @@
                        "Fayazburiro",
                        "Sindhu",
                        "Mehtab ahmed",
-                       "Macofe"
+                       "Macofe",
+                       "Indus Asia"
                ]
        },
        "tog-underline": "ڳنڍڻي هيٺان لڪير:",
@@ -35,7 +36,7 @@
        "tog-oldsig": "توھان جو موجوده دستخط:",
        "tog-fancysig": "صحيح کي وڪيٽيڪسٽ سمجھو (ڪنھن خوڪار ڳنڍڻي کانسواءِ)",
        "tog-uselivepreview": "سڌي سنئين پيش نگاھہ استعمال ڪريو",
-       "tog-watchlisthideown": "نظر ۾ فھرست مان منهنجون ڪيل ترميمون لڪايو",
+       "tog-watchlisthideown": "نظر ۾ فھرست مان منھنجون ترميمون لڪايو",
        "tog-watchlisthidebots": "نظر ۾ فھرست تان بوٽ جون ترميمون لڪايو",
        "tog-watchlisthideminor": "نظر ۾ فھرست تان معمولي ترميمون لڪايو",
        "tog-watchlisthideliu": "داخل ٿيل يوزرس جون ڪيل ترميمون نظر ۾ فھرست ۾ نہ ڏيکاريو",
        "searcharticle": "وڃو",
        "history": "صفحي جي سوانح",
        "history_short": "سوانح",
+       "history_small": "سوانح",
        "printableversion": "ڇپائتو پرت",
        "permalink": "مسقتل ڳنڍڻو",
        "print": "ڇاپيو",
        "redirectedfrom": "($1 کان چوريل)",
        "redirectpagesub": "چوريل صفحو",
        "redirectto": "ڏانھن چوريو:",
-       "lastmodifiedat": "ھيءُ صفحو آخري دفعو $2، $1ع تي سنواريو ويو ھو",
+       "lastmodifiedat": "ھيءُ صفحو آخري دفعو $2 وڳي، $1ع تي سنواريو ويو ھو.",
        "viewcount": "هيءُ صفحو {{PLURAL:$1|دفعو|$1 دفعا}} ڏسجي چڪو آهي.",
        "protectedpage": "تحفظيل صفحو",
        "jumpto": "ڏانھن ٽپ ڏيو:",
        "login": "داخل ٿيو",
        "login-security": "پنھنجي سڃاڻپ جي خاطري ڪريو",
        "nav-login-createaccount": "داخل ٿيو / کاتو کوليو",
-       "userlogin": "داخل ٿيو / کاتو کوليو",
-       "userloginnocreate": "داخل ٿيو",
        "logout": "خارج ٿيو",
        "userlogout": "خارج ٿيو",
        "notloggedin": "داخل ٿيل نہ آهيو",
        "userlogin-noaccount": "کاتو نہ ٿا رکو؟",
        "userlogin-joinproject": "{{SITENAME}} ۾ شامل ٿيو",
-       "nologin": " کاتو نہ ٿا رکو؟ '''$1'''.",
-       "nologinlink": "نئون کاتو کوليو",
        "createaccount": "کاتو کوليو",
-       "gotaccount": "ڇا اڳي ئي کاتو رکو ٿا؟ '''$1'''.",
-       "gotaccountlink": "داخل ٿيو",
-       "userlogin-resetlink": "پنهنجي داخل ٿيڻ جا تفصيل وساري ويٺا؟",
        "userlogin-resetpassword-link": "ڳجھولفظ وساري ويٺا آهيو؟",
        "userlogin-helplink2": "داخل ٿيڻ ۾ مدد",
        "userlogin-reauth": "اھو پڪ ڪرڻ لاءِ ته توھان {{GENDER:$1|$1}} آھيو توھان کي ٻيھر داخل ٿيڻو پوندو.",
        "userlogin-createanother": "ٻيو کاتو کوليو",
-       "createacct-emailrequired": "برق ٽپال پتو",
+       "createacct-emailrequired": "برقٽپال پتو",
        "createacct-emailoptional": "برقٽپال پتو (مرضيءَ موجب)",
        "createacct-email-ph": "پنھنجو برقٽپال پتو ڄاڻايو",
        "createacct-another-email-ph": "برق ٽپال پتو ڄاڻايو",
        "createaccountmail": "ڪو بہ عارضي ڳجھولفظ استعمال ڪريو ۽ ڄاڻايل برقٽپال پتي تي اماڻيو",
        "createacct-realname": "اصل نالو (مرضيءَ موجب)",
-       "createaccountreason": "سبب:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "توهان ٻيو کاتو ڇو کولي رهيا آهيو",
        "createacct-submit": "پنھنجو کاتو کوليو",
        "pt-createaccount": "کاتو کوليو",
        "pt-userlogout": "خارج ٿيو",
        "php-mail-error-unknown": "پي ايڇ پي جي  ڪاڄ اندر اڻڄاتل چُڪَ.",
-       "user-mail-no-addy": "برقٽپال پتو ڄاڻائڻ کان سواءِ برق ٽپال اماڻڻ جي ڪوشش ڪئي وئي.",
+       "user-mail-no-addy": "برقٽپال پتو ڄاڻائڻ کان سواءِ برقٽپال اماڻڻ جي ڪوشش ڪئي وئي.",
        "changepassword": "ڳجھولفظ تبديل ڪريو",
        "resetpass_announce": "داخل ٿيڻ جو عمل پورو ڪرڻ لاءِ، توهان کي نئون ڳجھولفظ اختيار مقرر ڪرڻو پوندو.",
        "resetpass_header": "کاتي جو ڳجھولفظ بدلايو",
        "botpasswords-label-delete": "ڊاهيو",
        "botpasswords-label-resetpassword": "ڳجھولفظ ٻيھر مقرر ڪريو",
        "botpasswords-label-grants-column": "منظور",
+       "botpasswords-bad-appid": "بوٽ نانءُ \"$1\" قابلِڪار ناھي.",
        "resetpass_forbidden": "ڳجھالفظ بدلائي نٿا سگھجن",
        "resetpass_forbidden-reason": "ڳجھالفظ بدلائي نٿا سگھجن:$1",
        "resetpass-no-info": "هيءُ صفحو پڙهڻ لاءِ داخل ٿيڻ ضروري آهي.",
        "resetpass-submit-loggedin": "ڳجھولفظ بدلايو",
        "resetpass-submit-cancel": "رد",
-       "resetpass-wrong-oldpass": "ناقابل ڪار هاڻوڪو يا عارضي ڳجھولفظ. \nتوهان پنهنجو ڳجھو لفظ اڳ ۾ ئي بدلائي چڪا آهيو يا نئين ڳجھي لفظ لاءِ درخواست ڏئي چڪا آهيو.",
-       "resetpass-recycled": "مهرباني ڪري پنهنجي هاڻوڪي ڳجھي لفظ کان ڪو مختلف ڳجھو لفظ چونڊيو.",
+       "resetpass-wrong-oldpass": "ناقابلِڪار هاڻوڪو يا عارضي ڳجھولفظ. \nتوھان پنھنجو ڳجھولفظ اڳ ۾ ئي بدلائي چڪا آھيو يا نئين ڳجھي لفظ لاءِ درخواست ڏئي چڪا آھيو.",
+       "resetpass-recycled": "مھرباني ڪري پنھنجي ھاڻوڪي ڳجھي لفظ کان ڪو مختلف ڳجھولفظ چونڊيو.",
        "resetpass-temp-emailed": "توهان برقٽپال ذريعي اماڻيل عارضي ڳجھي لفظ سان داخل ٿيا آهيو. داخل ٿيڻ کي مڪمل ڪرڻ لاءِ توهان کي هتي نئون ڳجھولفظ طَي ڪرڻو ئي پوندو:",
        "resetpass-temp-password": "عارضي ڳجھولفظ:",
        "resetpass-expired": "توهان جو ڳجھولفظ مدي خارج ٿي چڪو آهي. نئون ڳجھولفظ مقرر ڪريو ۽ داخل ٿيو.",
        "passwordreset-emaildisabled": "هن وڪيءَ تي برق‌ٽپال واريون خصوصيتون غير فعال بڻايون ويون آهن.",
        "passwordreset-username": "يُوزرنانءُ:",
        "passwordreset-domain": "ميدان:",
-       "passwordreset-email": "برق ٽپال پتو:",
+       "passwordreset-email": "برقٽپال پتو:",
        "passwordreset-emailtitle": "{{SITENAME}} واري کاتي جا تفصيل",
-       "passwordreset-emailelement": "يُوزر نانءُ: \n$1\n\nعارضي ڳجھو لفظ:\n$2",
+       "passwordreset-emailelement": "يُوزرنانءُ: \n$1\n\nعارضي ڳجھولفظ:\n$2",
        "passwordreset-invalidemail": "ناقابلڪار برقٽپال پتو",
        "changeemail": "برقٽپال پتو مِٽايو يا بدلايو",
        "changeemail-oldemail": "هاڻوڪو برقٽپال پتو:",
        "changeemail-newemail": "نئون برقٽپال پتو:",
        "changeemail-none": "(ڪو بہ نہ)",
-       "changeemail-password": "توهان جو {{SITENAME}} ڳجھو لفظ:",
+       "changeemail-password": "توهان جو {{SITENAME}} ڳجھولفظ:",
        "changeemail-submit": "برقٽپال پتو بدلايو",
        "changeemail-throttled": "توھان تازو ئي داخل ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مھرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
        "changeemail-nochange": "مھرباني ڪري مختلف نئون برقٽپال پتو ڄاڻايو.",
        "anoneditwarning": "<strong>چتاءُ:</strong> توھان داخل ٿيل نہ آھيو. توھان جو آءِپي پتو عوامي طور ظاھر ٿيندو جي توھان ڪي ترميمون ڪريو ٿا. جيڪڏھن توھان <strong>[$1 داخل ٿيو]</strong> ٿا يا <strong>[$2 کاتو کوليو]</strong> ٿا، تہ ٻين فائدن سان گڏ توھان جون ترميمون توھان جي يوزرنانءَ سان منسوب ڪيون وينديون.",
        "anonpreviewwarning": "توهان داخل ٿيل نہ آهيو. جيڪڏهن توهان صفحي ۾ تبديليون سانڍيون تہ اهڙين تبديلين ساڻ توهان جو آءِپي پتو درج ڪيو ويندو.",
        "missingcommenttext": "براءِ مھرباني هيٺ پنهنجو تاثر درج ڪندا.",
-       "summary-preview": "تت Øªي پيش نگاھ:",
-       "subject-preview": "موضوع پيش نگاھ:",
+       "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 آهي. مھرباني ڪري ڪنھن بہ پڇا ڳاڇا يا لھوچڙ لاءِ انھن مان ڪنھن ھڪ يا ٻنھي جو حوالو ڏيندا.",
        "blockednoreason": "سبب اڻڄاڻايل",
        "continue-editing": "ترميم گاھ ڏانھن وڃو",
        "editing": "$1 سنواريندي",
        "creating": "$1 سرجيندي",
-       "editingsection": "زÙ\8aر ØªØ±Ù\85Ù\8aÙ\85 $1 (سيڪشن)",
+       "editingsection": "ترÙ\85Ù\8aÙ\85 Ú¾Ù\8aÙº $1 (سيڪشن)",
        "editingcomment": "ترميم هيٺ $1 (نئون سيڪشن)",
        "editconflict": "ترميمي تڪرار: $1",
        "yourtext": "توهان جو ٽيڪسٽ",
        "last": "پويون",
        "page_first": "پهريون",
        "page_last": "آخري",
-       "history-fieldset-title": "جھانگ جي سوانح",
-       "history-show-deleted": "رڳو ڊاٺل",
+       "history-fieldset-title": "مسودا ڳوليو",
+       "history-show-deleted": "رڳو ڊاٺل مسودا",
        "histfirst": "اوائلي ترين",
        "histlast": "تازه ترين",
        "historysize": "({{PLURAL:$1|1 بائيٽ|$1 بائيٽس}})",
        "search-section": "(سيڪشن $1)",
        "search-category": "(ذمرو $1)",
        "search-suggest": "ڇا توهان جو مطلب ھيو: $1",
-       "search-interwiki-caption": "برادر Ø±Ù¿Ø§Ø¦Ù\88Ù\86",
+       "search-interwiki-caption": "برادر Ø±Ù¿Ø§Ø¦Ù\86 Ù\85اÙ\86 Ù\86تÙ\8aجا",
        "search-interwiki-default": "$1 مان نتيجا",
        "search-interwiki-more": "(وڌيڪ)",
        "search-relatedarticle": "لاڳاپيل",
        "prefs-emailconfirm-label": "برقٽپال خاطري:",
        "youremail": "برقٽپال:",
        "username": "{{GENDER:$1|يُوزرنانءُ}}",
+       "prefs-memberingroups": "{{PLURAL:$1|گروھ|گروھن}} جو {{GENDER:$2|رڪن}}:",
        "prefs-registration": "رجسٽريشن جو وقت:",
        "yourrealname": "اصل نالو:",
        "yourlanguage": "ٻولي:",
        "prefs-tokenwatchlist": "ٽوڪن",
        "prefs-diffs": "تفاوت",
        "prefs-help-prefershttps": "هيءَ ترجيح توهان جي ايند داخل ٿيڻ تي عمل ۾ ايندي.",
-       "userrights": "يُوزر حقن جو بندوبست",
+       "userrights": "يُوزر حق",
        "userrights-lookup-user": "ڪو يوزر چونڊيو",
        "userrights-user-editname": "يُوزرنانءُ ڄاڻايو:",
        "editusergroup": "يوزر گروھ اتاريو",
-       "userrights-editusergroup": "يوزر گروپَ سنواريو",
+       "userrights-editusergroup": "{{GENDER:$1|يوزر}} گروھ سنواريو",
        "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-activefilters": "سرگرم ڇاڻيون",
+       "rcfilters-restore-default-filters": "ڏنل ڇاڻيون ريسٽور ڪريو",
+       "rcfilters-search-placeholder": "تازيون تبديليون ڇاڻيو (جھانگيو يا لکڻ شروع ڪريو)",
+       "rcfilters-empty-filter": "ڪي بہ سرگرم ڇاڻيون ناھن. سڀ ڀاڱيداريون ڏيکاريل آھن.",
+       "rcfilters-filterlist-title": "ڇاڻيون",
+       "rcfilters-filterlist-whatsthis": "هي ڇا آهي؟",
+       "rcfilters-highlightbutton-title": "نتيجن کي نمايان (هاءِ لائيٽ) ڪيو",
+       "rcfilters-highlightmenu-title": "رنگ چونڊيو",
+       "rcfilters-filter-registered-label": "رجسٽر ٿيل",
+       "rcfilters-filter-unregistered-label": "اڻ رجسٽر ٿيل",
+       "rcfilters-filter-editsbyself-label": "مون پاران تبديليون",
+       "rcfilters-filter-editsbyother-label": "ٻين پاران تبديليون",
+       "rcfilters-filter-user-experience-level-newcomer-label": "نوان ايندڙ",
+       "rcfilters-filter-user-experience-level-learner-label": "سکندڙ",
+       "rcfilters-filter-user-experience-level-experienced-label": "تجربيڪار واھپ",
+       "rcfilters-filter-bots-label": "بوٽ",
+       "rcfilters-filter-humans-label": "انسان (بوٽ نہ)",
+       "rcfilters-filter-humans-description": "انساني ايڊيٽرن پاران ڪيل ترميمون.",
+       "rcfilters-filter-minor-label": "معمولي ترميمون",
+       "rcfilters-filter-major-label": "غير معمولي ترميمون",
+       "rcfilters-filter-pageedits-label": "صفحي ترميمون",
+       "rcfilters-filter-newpages-label": "صفحي تخليقون",
+       "rcfilters-filter-categorization-label": "زمري ۾ تبديليون",
+       "rcfilters-filter-logactions-label": "لاگڊ عمل",
        "rcnotefrom": "هيٺ {{PLURAL:$5|تبديلي آهي|تبديليون آهن}} کان <strong>$3, $4</strong> (تائين <strong>$1</strong> ) ڏيکاريل آهن.",
        "rclistfrom": "$2، $3 کان شروع ٿيندڙ نيون تبديليون ڏيکاريو",
        "rcshowhideminor": "$1 معمولي ترميمون",
        "rcshowhidecategorization": "$1 صفحاتي زمراڪاري",
        "rcshowhidecategorization-show": "ڏيکاريو",
        "rcshowhidecategorization-hide": "لڪايو",
-       "rclinks": "پوين $2 ڏينھن ۾ آيل پويون $1 تبديليون ڏيکاريو <br />$3",
+       "rclinks": "پوين $2 ڏينھن ۾ آيل پويون $1 تبديليون ڏيکاريو",
        "diff": "تفاوت",
        "hist": "سوانح",
        "hide": "لڪايو",
        "trackingcategories-name": "پيغام جو نالو",
        "trackingcategories-nodesc": "ڪا به تشريح موجود نه آهي.",
        "trackingcategories-disabled": "زمرو ناقابلِ ڪار بڻايل آهي.",
-       "emailuser": "Ù\87Ù\86 Ù\8aÙ\88زر کي برق ٽپال اماڻيو",
+       "emailuser": "Ù\87Ù\86 Ù\88اھپ کي برق ٽپال اماڻيو",
        "emailuser-title-target": "ھن {{GENDER:$1|يوزر}} ڏانھن برقٽپال موڪليو",
-       "emailuser-title-notarget": "Ù\8aÙ\8fÙ\88زر Ú\8fاÙ\86Ù\87Ù\86 Ø¨Ø±Ù\82 ٽپال اماڻيو",
+       "emailuser-title-notarget": "Ù\88اھپ Ú\8fاÙ\86Ú¾Ù\86 Ø¨Ø±Ù\82ٽپال اماڻيو",
        "usermaildisabled": "يوزر ايميل ناقابلِ ڪار بڻيل",
        "usermaildisabledtext": "توهان هن وڪي تي ٻين يوزرس ڏانهن ايميل نٿا موڪلي سگھو",
-       "noemailtitle": "برق ٽپال پتو نامعلوم",
-       "noemailtext": "Ù\87Ù\86 Ù\8aÙ\8fÙ\88زر ÚªÙ\88 Ø¨Û\81 Ù\82ابÙ\84 ÚªØ§Ø± Ø¨Ø±Ù\82 ٽپال پتو نہ ڄاڻايو آهي.",
+       "noemailtitle": "برقٽپال پتو ناھي",
+       "noemailtext": "Ù\87Ù\86 Ù\88اھپ ÚªÙ\88 Ø¨Û\81 Ù\82ابÙ\84Ù\90ڪار Ø¨Ø±Ù\82ٽپال پتو نہ ڄاڻايو آهي.",
        "emailusername": "يُوزرنانءُ:",
        "emailusernamesubmit": "جمع ڪرايو",
        "emailfrom": "طرفان:",
        "wlshowhidebots": "بوٽس",
        "wlshowhideliu": "کاتيدار يُوزرس",
        "wlshowhideanons": "گمنام يُوزرس",
-       "wlshowhidemine": "منهنجون ترميمون",
+       "wlshowhidemine": "منھنجون ترميمون",
        "watchlist-options": "نظر ۾ فھرست جا چارا",
        "watching": "نظر ۾ رکندي...",
        "unwatching": "نظر مان ڪڍندي...",
        "enotif_reset": "سڀ گھميل صفحن تي نشان لڳايو",
        "enotif_impersonal_salutation": "{{SITENAME}} يُوزر",
-       "enotif_lastdiff": "هي تبديلي ڏسڻ لاءِ $1 ڏسو",
+       "enotif_lastdiff": "هي تبديلي ڏسڻ لاءِ، $1 ڏسو",
        "enotif_anon_editor": "گمنام يُوزر $1",
        "created": "ٺهي چڪو",
        "changed": "تبديل ٿي ويو",
        "delete-confirm": "\"$1\" ڊهي چڪو",
        "delete-legend": "ڊاهيو",
        "historywarning": "<strong>خبردار:</strong> جيڪو صفحو توهان ڊاهڻ وڃي رهيا آهيو ان ساڻ هڪ تاريخ آهي $1 {{PLURAL:$1|revision|revisions}}:",
+       "historyaction-submit": "ڏيکاريو",
        "confirmdeletetext": "توهان هڪ صفحي کي ان جي سموري سوانح سميت ڊاهڻ وارا آهيو. مهرباني ڪري پڪ ڪندا ته توهان اهو ئي ڪرڻ گھرو ٿا، ۽ اهو ته توهان ان جي نتيجن کان واقف آهيو، ۽ اهو پڻ ته توهان اهو ڪم [[{{MediaWiki:Policy-url}}|پاليسي]]ءَ مطابق ڪري رهيا آهيو.",
        "actioncomplete": "ڪم پُورو",
        "actionfailed": "عمل ناڪام",
        "sp-contributions-uploads": "چاڙھَ",
        "sp-contributions-logs": "لاگس",
        "sp-contributions-talk": "ڳالھ",
-       "sp-contributions-userrights": "يُوزر حقن جي سنڀال",
+       "sp-contributions-userrights": "{{GENDER:$1|يوُزر}} حقن جي سنڀال",
        "sp-contributions-search": "ڀاڱيدارين لاءِ ڳولا ڪريو",
        "sp-contributions-username": "آءِپي پتو يا يوزرنانءُ:",
        "sp-contributions-submit": "ڳوليو",
        "anononlyblock": "فقط گمنام",
        "noautoblockblock": "خودڪار بندش ناقابلِ ڪار بڻيل",
        "createaccountblock": "کاتو کولڻ جي روڪَ ٿيل",
-       "emailblock": "برق ٽپال غير فعال",
+       "emailblock": "برقٽپال غير فعال",
        "blocklink": "بندشيو",
        "unblocklink": "اڻبندشيو",
        "contribslink": "ڀاڱيداريون",
        "table_pager_limit_label": "وَٿُون في صفحو:",
        "table_pager_limit_submit": "ھلو",
        "table_pager_empty": "ڪو بہ نتيجو نہ مليو",
+       "autoredircomment": "صفحي کي [[$1]] ڏانھن چوريو",
        "watchlistedit-normal-title": "نظر ۾ فھرست کي سنواريو",
        "watchlistedit-raw-titles": "عنوانَ:",
        "watchlistedit-clear-titles": "عنوانَ:",
        "tags-title": "ٽيگس",
        "tags-tag": "ٽيگ نانءُ",
        "tags-source-header": "ذريعو",
+       "tags-active-header": "سرگرم؟",
        "tags-active-yes": "ها",
        "tags-active-no": "نہ",
        "tags-edit": "سنواريو",
        "logentry-newusers-create": "يوزر کاتو $1 {{GENDER:$2|سرجيو ويو}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|چاڙهيو}} $3",
        "rightsnone": "(ڪو بہ نہ)",
-       "revdelete-summary": "ترميمي خلاصو",
        "feedback-back": "پوئتي",
        "feedback-cancel": "رد",
        "feedback-close": "ٿي ويو",
index faafcb4..288db77 100644 (file)
        "externaldberror": "S'è verifiggaddu un errori cu lu server di autentificazioni esthernu, oppuru nò si diponi di l'autorizazioni nezzessàri pa aggiornà la propria registhrazioni estherna.",
        "login": "Intra",
        "nav-login-createaccount": "Intra / registhrazioni",
-       "userlogin": "Intra o cria una noba registhrazioni",
-       "userloginnocreate": "Intra",
        "logout": "Esci",
        "userlogout": "Esci",
        "notloggedin": "Intradda no effettuadda",
-       "nologin": "No ài una registhrazioni? '''$1'''.",
-       "nologinlink": "Crea una noba registhrazioni",
        "createaccount": "Crea una noba registhrazioni",
-       "gotaccount": "Ài già'na registhrazioni? '''$1'''.",
-       "gotaccountlink": "Intra",
-       "userlogin-resetlink": "Hai immintiggaddu li minuddi d'intradda?",
        "createaccountmail": "via postha erettrònica",
-       "createaccountreason": "Mutibu:",
        "createacct-reason": "Mutibu",
        "badretype": "Li paràuri d'órdhini insiriddi nò cuinzidhini tra èddi.",
        "userexists": "L'innòmu utenti insiriddu è già utirizaddu. Pa pazieri chirria un'innòmu utenti dibessu.",
        "editingsection": "Mudifigga di $1 (sezzioni)",
        "editingcomment": "Mudifigga di $1 (cummentu)",
        "editconflict": "Cuntrasthu d'edizioni i $1",
-       "explainconflict": "Un'althru utenti à sàivvaddu una noba versioni di la pàgina primma di lu saivvatàggiu tóiu.\nLa casella di mudìfigga superiori cunteni lu testhu di la pàgina attuarmenti in lìnia, cumenti è isthadda mudìfiggadda da l'althru utenti.\nLa versioni cu' li mudìfigghi tói è i' la casella di mudìfigga in giossu.\nSi vói cunfèimmalli, dévi arriggà li mudìfigghi tói i' lu testhu esisthenti (casella superiori).\n'''Soru''' lu testhu i' la casella superiori sarà sàivvaddu candu tu incalcharé \"{{int:savearticle}}\".",
+       "explainconflict": "Un'althru utenti à sàivvaddu una noba versioni di la pàgina primma di lu saivvatàggiu tóiu.\nLa casella di mudìfigga superiori cunteni lu testhu di la pàgina attuarmenti in lìnia, cumenti è isthadda mudìfiggadda da l'althru utenti.\nLa versioni cu' li mudìfigghi tói è i' la casella di mudìfigga in giossu.\nSi vói cunfèimmalli, dévi arriggà li mudìfigghi tói i' lu testhu esisthenti (casella superiori).\n'''Soru''' lu testhu i' la casella superiori sarà sàivvaddu candu tu incalcharé \"$1\".",
        "yourtext": "Lu testhu tóiu",
        "storedversion": "La versioni mimurizadda",
        "nonunicodebrowser": "'''ATTINZIONI: Lu nabiggadori tóiu nò è cumpatìbiri cu' li caràtteri Unicode. Pa cunsintì la mudìfigga di li pàgini chena crià incunvinienti, i caràtteri nò ASCII so visuarizzaddi i' la casella di mudìfigga cumenti còdizi esadezimari.'''",
        "prefs-misc": "Vari",
        "saveprefs": "Saivva li prifirenzi",
        "prefs-editing": "Casella di mudìfigga",
-       "rows": "Righi:",
-       "columns": "Curonni:",
        "searchresultshead": "Zercha",
        "stub-threshold": "Varori mìminu pa i <a href=\"#\" class=\"stub\">cullegamenti a li sàgumi</a>:",
        "recentchangesdays": "Nùmaru di dì da musthrà i li ulthimi mudìfigghi:",
        "userrights-reason": "Mutibu:",
        "userrights-no-interwiki": "Nò ài lu primmissu pa mudìfiggà li diritti di l'utenti i' althri siti.",
        "userrights-nodatabase": "La bancadati $1 nò isisthi o nò è in lucari.",
-       "userrights-nologin": "Débi [[Special:UserLogin|intrà]] cumenti amministhradori pa assignà li diritti utenti.",
-       "userrights-notallowed": "La registhrazioni tóia nò à lu primissu d'assignà li diritti utenti.",
        "group": "Gruppu:",
        "group-user": "Utenti",
        "group-autoconfirmed": "Utenti autocunfèimmaddi",
        "rcshowhideanons": "$1 li utenti anònimi",
        "rcshowhidepatr": "$1 li mudìfigghi contrulladdi",
        "rcshowhidemine": "$1 li me' mudìfigghi",
-       "rclinks": "Musthra li $1 mudìfigghi più rizzenti arriggaddi i' l'ulthimi $2 dì<br />$3",
+       "rclinks": "Musthra li $1 mudìfigghi più rizzenti arriggaddi i' l'ulthimi $2 dì",
        "diff": "diff",
        "hist": "cron",
        "hide": "Cua",
        "undeletelink": "visuarizza/rimpustha",
        "undeleteviewlink": "vidé",
        "undeletecomment": "Cummentu:",
-       "undeletedrevisions": "{{PLURAL:$1|Una ribisioni ricuparadda|$1 ribisioni ricuparaddi}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Una ribisioni|$1 ribisioni}} e {{PLURAL:$2|un file ricuparaddu|$2 file ricuparaddi}}",
-       "undeletedfiles": "{{PLURAL:$1|Un file ricuparaddu|$1 file ricuparaddi}}",
        "cannotundelete": "Ricùparu falliddu; è pussìbiri chi la pàgina sia già isthadda ricuparadda da un althru utenti.",
        "undelete-header": "Cunsulthà lu [[Special:Log/delete|rigisthru di li canzilladduri]] pa vidé li canzilladduri più rizzenti.",
        "undelete-search-box": "Zercha i' li pàgini canzilladdi",
index 5676eee..b65dfd3 100644 (file)
        "yourpasswordagain": "دیسان تێپەڕوشەگە بنۊسەو:",
        "login": "بچووە ناو",
        "nav-login-createaccount": "بچووە ناو / ھەژمار درس بکە",
-       "userlogin": "بچووە ناو / ھەژمار درس بکە",
-       "userloginnocreate": "بچووە ناو",
        "logout": "بچووە دەیشت",
        "userlogout": "بچووە دەرەو",
-       "nologin": "ھەژمار نەێری؟  $1.",
-       "nologinlink": "ھەژمارێگ درس بکە",
        "createaccount": "ھەژمار درس بکە",
-       "gotaccount": "لێرە ھەژمار دێرید؟ $1.",
-       "gotaccountlink": "بچووە ناو",
-       "userlogin-resetlink": "وردەکاریەیل ناوچینت لە ھۊرەو بردیتە؟",
        "createacct-emailrequired": "ناونیشان ئیمەیل",
-       "createaccountreason": "هووکار:",
        "createacct-reason": "هووکار",
        "nouserspecified": "بایەد ناو ئەوکاربەری دابین بکەی.",
        "login-userblocked": "ئەێ ئەوکاربەرە بلاک کریاێە. چۊنە ناو قەدەغەنە.",
        "rcshowhideanons": "ئەوکاربەرە نەناسیاوەگان $1",
        "rcshowhidepatr": "وێراشتە نەگەردیاێەگان $1",
        "rcshowhidemine": "وێراشتەگانم $1",
-       "rclinks": "دۊایین $1 گووڕانکاری $2 ڕووژ ویەردە نیشان بدە<br />$3",
+       "rclinks": "دۊایین $1 گووڕانکاری $2 ڕووژ ویەردە نیشان بدە",
        "diff": "جیاوازی",
        "hist": "دیرۆک",
        "hide": "بشارەو",
index 0b2b10c..bb7989a 100644 (file)
@@ -12,7 +12,8 @@
                        "Trondtr",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Pyscowicz"
                ]
        },
        "tog-underline": "Liŋkkaid vuolláisárgun",
        "oct": "golg",
        "nov": "skáb",
        "dec": "juov",
+       "january-date": "ođđajagimánnu $1",
+       "february-date": "guovvamánnu $1",
+       "march-date": "njukčamánnu $1",
+       "april-date": "cuoŋománnu $1",
+       "may-date": "miessemánnu $1",
+       "june-date": "geassemánnu $1",
+       "july-date": "suoidnemánnu $1",
+       "august-date": "borgemánnu $1",
+       "september-date": "čakčamánnu $1",
+       "october-date": "golggotmánnu $1",
+       "november-date": "skábmamánnu $1",
+       "december-date": "juovlamánnu $1",
        "pagecategories": "{{PLURAL:$1|Luohkká|Luohkát}}",
        "category_header": "Siiddut, mat gullet luohkkái $1",
        "subcategories": "Vuolleluohkát",
        "searcharticle": "Mana",
        "history": "Siiddu historjá",
        "history_short": "Historjá",
+       "history_small": "historjá",
        "updatedmarker": "beaiváduvvon du ovddit fitnama maŋŋá",
        "printableversion": "Prentenveršuvdna",
        "permalink": "Bissovaš liŋka",
        "yourdomainname": "Fierbmenamma",
        "login": "Čálligoađe sisa",
        "nav-login-createaccount": "Daga ođđa geavaheaddjidovddaldaga dahje čálligoađe sisa",
-       "userlogin": "Logge sisa dahje ráhkat dovddaldaga",
        "logout": "Čálligoađe olggos",
        "userlogout": "Logge olggos",
        "notloggedin": "It leat čálligoahttan sisa",
-       "nologin": "Jus dus ii vel leat geavaheaddjidovddaldat, sáhtát '''$1''' dakkára.",
-       "nologinlink": "ráhkadit",
        "createaccount": "Ráhkat dovddaldaga",
-       "gotaccount": "Jus dus lea jo geavaheaddjidovddaldat, sáhtát '''$1'''.",
-       "gotaccountlink": "Logge sisa",
        "createaccountmail": "e-poasttain",
        "badretype": "Suollemassánit maid čállet eai leat seammalaganat.",
        "userexists": "Geavaheaddjidovddaldat, man evttohit, lea jo anus. Leage buorre ja vállje nubbi geavaheaddjidovddaldaga.",
        "editing": "Rievdadit siiddu $1",
        "editingsection": "Rievdadit oasi siiddus $1",
        "editingcomment": "Rievdadit kommeanta siiddus $1",
-       "explainconflict": "Soames lea rievdadan dán siiddu dan maŋŋel go don leat álgan rievdadit dan.\nBajit oasis oidno siiddu teaksta dálá hámis.\nDu rievdadusat oidnojit vuolit oasis.\nDon fertet dahkat du rievdadusaid dálá tekstii.\n'''Beare''' bajit oasi teaksta vurkejuvvo go deaddilat «{{int:savearticle}}».",
+       "explainconflict": "Soames lea rievdadan dán siiddu dan maŋŋel go don leat álgan rievdadit dan.\nBajit oasis oidno siiddu teaksta dálá hámis.\nDu rievdadusat oidnojit vuolit oasis.\nDon fertet dahkat du rievdadusaid dálá tekstii.\n'''Beare''' bajit oasi teaksta vurkejuvvo go deaddilat «$1».",
        "yourtext": "Iežat teaksta",
        "storedversion": "Vurkejuvvon veršuvdna",
        "yourdiff": "Erohusat",
        "prefs-misc": "Eará",
        "saveprefs": "Vurke ásahusaid",
        "prefs-editing": "Rievdadeapmi",
-       "rows": "Gurgadasa:",
-       "columns": "Kolumnat",
        "searchresultshead": "Ohcan",
        "recentchangescount": "Siiddui mearri varas rievdadusain",
        "savedprefs": "Du ásahusid vurken lihkosmuvai.",
        "rcshowhideanons": "$1 anonyma geavaheaddjit",
        "rcshowhidepatr": "$1 dárkistuvvon rievdadusat",
        "rcshowhidemine": "$1 iežas rievdádusat",
-       "rclinks": "Čájet $1 varas rievdadusa maŋimus $2 beaivve siste.<br />$3",
+       "rclinks": "Čájet $1 varas rievdadusa maŋimus $2 beaivve siste.",
        "diff": "erohus",
        "hist": "hist",
        "hide": "čiega",
        "undeleterevisions": "{{PLURAL:$1|Okta veršuvdna|$1 veršuvnna}} lasihuvvon arkiivii.",
        "undeletebtn": "Máhcat",
        "undeletecomment": "Kommeanta:",
-       "undeletedrevisions": "$1 veršuvnna máhcahuvvui",
-       "undeletedrevisions-files": "$1 veršuvnna ja $2 fiilla máhcahuvvui",
-       "undeletedfiles": "$1 fii(l)la máhcahuvvui",
        "cannotundelete": "Máhcaheapmi ii lihkosmuvvan.",
        "undelete-search-box": "Oza sihkojuvvon siidduid",
        "undelete-search-prefix": "Čájet siidduid, mat álget mearkkaiguin:",
index 62ecd78..5d67afd 100644 (file)
        "externaldberror": "Pos-römjde authenticacionde database extername jöx me necoccebj permiccionde updatan mecaitom externom.",
        "login": "Caápo",
        "nav-login-createaccount": "Caápo / xuatl",
-       "userlogin": "Caápo / xuatl",
        "logout": "Cuípo",
        "userlogout": "Cuípo",
        "notloggedin": "Necaápo",
-       "nologin": "Menecaápo? '''$1'''.",
-       "nologinlink": "Xuatl ö",
        "createaccount": "Xuatl",
-       "gotaccount": "Mecaápo? '''$1'''.",
-       "gotaccountlink": "Caápo",
        "createaccountmail": "caxuatl e-iitom",
        "badretype": "Quimx cánj zo misoj nematchöx.",
        "userexists": "IDde caitom coccebj usadad. Submitom hunnom.",
        "prefs-misc": "Jömc",
        "saveprefs": "Xuniim",
        "prefs-editing": "Ticpatlöx",
-       "rows": "Rowám:",
-       "columns": "Columnám:",
        "searchresultshead": "Yahöx",
        "savedprefs": "Hequáatlaác coccebj xuniimöx.",
        "timezonelegend": "Zonede xepe",
        "rcshowhideanons": "$1 caitóm anoniimóm",
        "rcshowhidepatr": "$1 ticpatlöx patrollöx",
        "rcshowhidemine": "$1 hániideditám",
-       "rclinks": "Cohuatlöx hunquiix $1 zo ixáap $2 zo iti <br />$3",
+       "rclinks": "Cohuatlöx hunquiix $1 zo ixáap $2 zo iti",
        "diff": "quiix",
        "hist": "histó",
        "hide": "Cíiitám",
index 687d41f..25a23de 100644 (file)
        "externaldberror": "Huru",
        "login": "Huru",
        "nav-login-createaccount": "Huru / kontu tee",
-       "userlogin": "Huru / kontu tee",
-       "userloginnocreate": "Huru",
        "logout": "Fatta",
        "userlogout": "Fatta",
        "notloggedin": "Mana huru",
        "userlogin-noaccount": "Šii nda kontu wala?",
        "userlogin-joinproject": "Dii {{SITENAME}}",
-       "nologin": "Šii nda kontu wala? $1.",
-       "nologinlink": "Kontu tee",
        "createaccount": "Kontu tee",
-       "gotaccount": "Huru",
-       "gotaccountlink": "Huru",
-       "userlogin-resetlink": "Dirŋa ni kontu šilbawey?",
        "userlogin-resetpassword-link": "Dirŋa ni šennikufaloo?",
        "userlogin-helplink2": "Ay gaa ka huru",
        "userlogin-loggedin": "N' huru ka ben sanda {{GENDER:$1|$1}}.\nGanda takaddaa zaa ka huru goykaw tana.",
        "createacct-another-email-ph": "Bataga aderesu dam",
        "createaccountmail": "Šiiyan šennikufal dam saaye bande nd'a sanba bataga aderesu tabatantaa do",
        "createacct-realname": "Maa cimi (suubari)",
-       "createaccountreason": "Dalil:",
        "createacct-reason": "Dalil",
        "createacct-reason-ph": "Hayaa kaŋ se war goo ma kontu waana tee",
        "createacct-submit": "War kontoo tee",
        "preview": "Moofur",
        "showpreview": "Moofuryan cebe",
        "showdiff": "Barmawey cebe",
-       "blankarticle": "<strong>Yaamar:</strong> Moɲoo kaŋ war goo m'a tee t'ikoonu.\nNda war na \"{{int:savearticle}}\" naagu, moɲoo ga kaa ta tee bila nda gundekuna.",
+       "blankarticle": "<strong>Yaamar:</strong> Moɲoo kaŋ war goo m'a tee t'ikoonu.\nNda war na \"$1\" naagu, moɲoo ga kaa ta tee bila nda gundekuna.",
        "anoneditwarning": "<strong>Yaamar:</strong> War mana huru. Borey kul hin ka dii war IP aderesoo nda war na barmay kul tee. Nda war <strong>[$1 huru]</strong> wala <strong>[$2 kontu tee]</strong>, war barmawey ga hanga war goykaw maaɲoo bande, nda nafaw taney kul. \\",
        "anonpreviewwarning": "<em>War mana huru. Gaabuyan ga too war IP aderesoo ma jisandi moɲoo woo fasalyan taarikoo ra.</em>",
-       "missingsummary": "<strong>Hongu:</strong> War mana barmay duurandi noo.\nWa \"{{int:savearticle}}\" naagu koyne, kul war barmaa ga gaabundi bila nd'affoo.",
+       "missingsummary": "<strong>Hongu:</strong> War mana barmay duurandi noo.\nWa \"$1\" naagu koyne, kul war barmaa ga gaabundi bila nd'affoo.",
        "missingcommenttext": "Wa feeriyan foo hantum ganda.",
-       "missingcommentheader": "<strong>Hongu:</strong> War mana teekaw/boŋžeeri noo feeriyanoo woo se.\nWa \"{{int:savearticle}}\" naagu koyne, kul war barmaa ga gaabundi bila nd'affoo.",
+       "missingcommentheader": "<strong>Hongu:</strong> War mana teekaw/boŋžeeri noo feeriyanoo woo se.\nWa \"$1\" naagu koyne, kul war barmaa ga gaabundi bila nd'affoo.",
        "summary-preview": "Duurandi moofuryan:",
        "subject-preview": "Teekaw|boŋžeeri moofuryan:",
        "blockedtitle": "Goykaa n' ka gagayandi",
        "editingsection": "Goo ma $1 fasal (dunbu)",
        "editingcomment": "Goo ma $1 fasal (dunbu taaga)",
        "editconflict": "Fasal cerehooyan: $1",
-       "explainconflict": "Boro foo na moɲoo woo barmay za war šintin k'a fasal.\nBeene hantum nungoo goo nda moo hantumoo takaa kaŋ nd'a bara sohõda.\nWar barmawey ga cebandi gandehere hantum nungoo ra.\nWar ga hima ka barmawey marga hantum barantaa ra.\nMoɲoo kan goo beene hantum nungoo ra <strong>hinne</strong> ma gaabundi nda war na \"{{int:savearticle}}\" naagu.",
+       "explainconflict": "Boro foo na moɲoo woo barmay za war šintin k'a fasal.\nBeene hantum nungoo goo nda moo hantumoo takaa kaŋ nd'a bara sohõda.\nWar barmawey ga cebandi gandehere hantum nungoo ra.\nWar ga hima ka barmawey marga hantum barantaa ra.\nMoɲoo kan goo beene hantum nungoo ra <strong>hinne</strong> ma gaabundi nda war na \"$1\" naagu.",
        "yourtext": "War hantumoo",
        "storedversion": "Barmayyan jisante",
        "nonunicodebrowser": "<strong>Yaamar: War ceecikaw ši Unicode kanbe.</strong>\nA workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.War ga hin ka šendaa woo koli nungu foo ra kaŋ naŋ war moɲey ma fasal nda saajaw. Harfey kaŋ manti ASCII ga bangay fasal bataa ra sanda ferši-iddu ašariyayaŋ.",
        "right-editprotected": "Moɲey kaŋ jejebandi sanda \"{{int:protect-level-sysop}}\" fasal",
        "right-editsemiprotected": "Moɲey kaŋ jejebandi sanda \"{{int:protect-level-autoconfirmed}}\" fasal",
        "right-editinterface": "Goykaw diidogoo fasal",
-       "right-editusercssjs": "Goykaw taney CSS nda JavaScript tukey fasal",
        "right-editusercss": "Goykaw taney CSS tukey fasal",
        "right-edituserjs": "Goykaw taney JavaScript tuke fasal",
        "right-editmyusercss": "War boŋ goykaw CSS tukey fasal",
        "rcshowhidemine": "Ay barmay $1",
        "rcshowhidemine-show": "Cebe",
        "rcshowhidemine-hide": "Tugu",
-       "rclinks": "Cebe barmay koraw $1 jirbi $2 korawey ra<br />$3",
+       "rclinks": "Cebe barmay koraw $1 jirbi $2 korawey ra",
        "diff": "zilayyan",
        "hist": "taariki",
        "hide": "Tugu",
        "undeleteviewlink": "guna",
        "undeleteinvert": "Suubaroo bere",
        "undeletecomment": "Dalil:",
-       "undeletedrevisions": "{{PLURAL:$1|Filla $1}} n' ka yeeti",
-       "undeletedrevisions-files": "{{PLURAL:$1|Filla $1}} nda {{PLURAL:$2|tuku $2}} n' ka yeeti",
-       "undeletedfiles": "{{PLURAL:$1|Tuku $1}} n' ka yeeti",
        "cannotundelete": "Tuusuyan naŋ kaŋ:\n$1",
        "undeletedpage": "<strong>$1 n' ka yeeti</strong>\n\nGuna [[Special:Taariki/tuusu|tuusuyan taariki]] ka dii tuusuyan korawey nda yeetiyaney kaŋ jisandi.",
        "undelete-header": "Guna [[Special:Taariki/tuusu|tuusuyan taarikoo]] moɲey kaŋ kokor ka tuusandi se.",
        "logentry-upload-overwrite": "$1 na dumi taaga {{GENDER:$2|zijandi}} $3 se",
        "logentry-upload-revert": "$1 na $3 {{GENDER:$2|zijandi}}",
        "rightsnone": "(baffoo)",
-       "revdelete-summary": "duurandi fasal",
        "feedback-adding": "Goo ma willandi tonton moɲoo ga…",
        "feedback-bugcheck": "A boori! Koroši de wala woo manti [hasaraw bayrandi $1] affaa. \\",
        "feedback-bugnew": "Ay n'a koroši. Hasaraw bayrandi sanba",
index 12051ab..5dd3079 100644 (file)
        "password-change-forbidden": "Negalat tuo wiki keistė slaptažuodiu.",
        "login": "Prėsėjongtė",
        "nav-login-createaccount": "Prėsėjongtė / padėrbtė paskīra",
-       "userlogin": "Prėsėjongtė / padėrbtė paskīra",
-       "userloginnocreate": "Prėsėjongtė",
        "logout": "Atsijongtė",
        "userlogout": "Atsijongtė",
        "notloggedin": "Neprėsėjongis",
        "userlogin-noaccount": "Netorat paskīruos?",
        "userlogin-joinproject": "Jonkėtėis prī {{SITENAME}}",
-       "nologin": "Netorat prėsėjongėma varda? '''$1'''.",
-       "nologinlink": "Sokorkėt paskīra",
        "createaccount": "Pasėdėrbtė paskīra",
-       "gotaccount": "Jau torėt paskīra? '''$1'''.",
-       "gotaccountlink": "Prėsėjonkat",
-       "userlogin-resetlink": "Ožmiršat sava prėsėjongėma doumenis?",
        "userlogin-resetpassword-link": "Ožmiršat sava slaptažuodi?",
        "userlogin-helplink2": "Prėsėjongėma pagelba",
        "userlogin-loggedin": "Tamsta jau īr prėsijongė̄s kāp {{GENDER:$1|$1}}.\nJēb nuorat prisėjongtė kāp kėts žmuogos, nauduokat skvarma apatiuo.",
        "createacct-another-email-ph": "Ožrašīkėt el. pašta adresa",
        "createaccountmail": "Nauduokėt laikėna slaptažuodi ė siōskėt nuruodėtō el. paštō",
        "createacct-realname": "Tėkros vardos (nie būtėns)",
-       "createaccountreason": "Dingstės:",
        "createacct-reason": "Dingstės",
        "createacct-reason-ph": "Kūdie dėrbat kėta nauduotojė poslapi",
        "createacct-submit": "Padėrbkat savėi paskīra",
        "preview": "Parveiza",
        "showpreview": "Ruodītė parveiza",
        "showdiff": "Ruodītė skėrtomus",
-       "blankarticle": "<strong>Atėdės:</strong> Tamsta dėrbat dīka poslapi.\nJēgo apent mīgsat \"{{int:savearticle}}\", ta ons poslapis vės vėin bos padėrbts.",
+       "blankarticle": "<strong>Atėdės:</strong> Tamsta dėrbat dīka poslapi.\nJēgo apent mīgsat \"$1\", ta ons poslapis vės vėin bos padėrbts.",
        "anoneditwarning": "<strong>Atidėsǃ</strong> Tamsta nāsot prėsėjongis. Tamstas IP adresos bos vėišā regėms, jēgo padėrbsat kuoki pakeitėma. Vuo jēgo <strong>[$1 prėsėjongsat]</strong> aba <strong>[$2 pasėdėrbsat nauduotuojė skīriu]</strong>, tumet Tamstas pakeitėmā prėgols prī Tamstas nauduotojė varda.",
        "anonpreviewwarning": "<em>Tamsta nāsat prėsėjongis. Kāp ėšsauguosat poslapi, tāp regiesės Tamstas IP adresos</em>",
        "missingsummary": "'''Priminėms:''' Tamsta nenuruodiet pakeitėma kuomentara. Jēgo viel paspausėt ''Ėšsauguotė'', Tamstas pakeitėms bus ėšsauguots ba anuo.",
-       "selfredirect": "<strong>Atėdės:</strong> Tamsta dėrbat poslapė nosokėma savėsp.\nParašīkat tėkslē, kor ons poslapis tor soktė.\nJēgo apent mīgsat \"{{int:savearticle}}\", ta ons poslapis vės vėin bos padėrbts.",
+       "selfredirect": "<strong>Atėdės:</strong> Tamsta dėrbat poslapė nosokėma savėsp.\nParašīkat tėkslē, kor ons poslapis tor soktė.\nJēgo apent mīgsat \"$1\", ta ons poslapis vės vėin bos padėrbts.",
        "missingcommenttext": "Duokat pāiškėnėma apatiuo.",
-       "missingcommentheader": "'''Primėnėms:''' Tamsta nadaviet pakeitėma paaiškėnėma. Jēgo apent paspausat \"{{int:savearticle}}\", Tamstas pakeitėms būs ėšsauguots ba anuo.",
+       "missingcommentheader": "'''Primėnėms:''' Tamsta nadaviet pakeitėma paaiškėnėma. Jēgo apent paspausat \"$1\", Tamstas pakeitėms būs ėšsauguots ba anuo.",
        "summary-preview": "Pāiškėnėma parvaiza:",
        "subject-preview": "Skėrsnelė/ontraštės parvaiza:",
        "previewerrortext": "Miegėnant parveizietė pakeitėmus nūtėka klaida.",
        "editingsection": "Keitams $1 (skėrsnelis)",
        "editingcomment": "Keitams $1 (naus skėrsnis)",
        "editconflict": "Do keitėmo nesotink: $1",
-       "explainconflict": "Kažėn kas kėts jau pakeitė poslapi nug ton čiesa, kāp Tamsta pradiejuot anon keistė.\nVėršō īr patė vielībuojė straipsnė ėšruoda.\nTamstas pakeitėmā pateiktė apatiuo.\nTamstā rēk sokergtė Tamstas pakeitėmus so tās, katrėi vėršō.\nKumet paspausat „{{int:savearticle}}“, bos ožrašīts '''tėktās''' tas raštos, katros īr ėšgoldīts vėršō.",
+       "explainconflict": "Kažėn kas kėts jau pakeitė poslapi nug ton čiesa, kāp Tamsta pradiejuot anon keistė.\nVėršō īr patė vielībuojė straipsnė ėšruoda.\nTamstas pakeitėmā pateiktė apatiuo.\nTamstā rēk sokergtė Tamstas pakeitėmus so tās, katrėi vėršō.\nKumet paspausat „$1“, bos ožrašīts '''tėktās''' tas raštos, katros īr ėšgoldīts vėršō.",
        "yourtext": "Tamstas raštos",
        "storedversion": "Ėšsauguots atmains",
        "editingold": "'''Atėdės: Tamsta keitat ne vielībiausi poslapė atmaina.\nJēgo ėšsauguosat sava pakeitėmus, īkondin darītė pakeitėmā prapols.'''",
        "rcshowhidecategorization": "$1, kap poslapiam doud kateguorėjės",
        "rcshowhidecategorization-show": "Ruodītė",
        "rcshowhidecategorization-hide": "Kavuotė",
-       "rclinks": "Ruodītė vielībus $1 pakeitėmu par paskuojės $2 dėinas<br />$3",
+       "rclinks": "Ruodītė vielībus $1 pakeitėmu par paskuojės $2 dėinas",
        "diff": "skėrt",
        "hist": "ist",
        "hide": "Kavuotė",
        "undeleteviewlink": "veizietė",
        "undeleteinvert": "Žīmietė atvėrkštē",
        "undeletecomment": "Dingstės:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|pakeitėms sogrōžints|pakeitėmā sogrōžintė|pakeitėmu sogrōžintu}} īr",
-       "undeletedrevisions-files": "sogrōžintaː $1 {{PLURAL:$1|pakeitėms|pakeitėmā|pakeitėmu}} ėr $2 {{PLURAL:$2|abruozdielis|abruozdielē|abruozdieliu}}",
-       "undeletedfiles": "sogrōžintaː {{PLURAL:$1|abruozdielis|abruozdielē|abruozdieliu}}",
        "undeletedpage": "'''$1 bova pargōžints'''\nParveizėkat [[Special:Log/delete|trīnėmu sāroša]], ka regietomiet, kas dabā ėšrinta/grōžinta īr.",
        "undelete-header": "Veizėkat [[Special:Log/delete|trīnėma istuorėjuo]] paskoteniausē ėštrintus poslapius.",
        "undelete-search-box": "Ėiškuotė ėštrintū poslapiu",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ožkruovė}} naujė $3 atmaina",
        "logentry-upload-revert": "$1 {{GENDER:$2|ožkruovė}} $3",
        "rightsnone": "(juokiū)",
-       "revdelete-summary": "keitėma paāškėnėms",
        "feedback-close": "Padėrbt",
        "searchsuggest-search": "Ėiškuotė",
        "searchsuggest-containing": "katrėi tor...",
index 233839f..3e5065f 100644 (file)
@@ -12,7 +12,9 @@
                        "KWiki",
                        "Matma Rex",
                        "Srdjan m",
-                       "Conquistador"
+                       "Conquistador",
+                       "Xð",
+                       "Сербијана"
                ]
        },
        "tog-underline": "Podvuci linkove:",
        "category_header": "Stranice u kategoriji \"$1\"",
        "subcategories": "Potkategorije",
        "category-media-header": "Medijske datoteke u kategoriji \"$1\"",
-       "category-empty": "''Ova kategorija trenutno ne sadrži članke ni medijske datoteke.''",
+       "category-empty": "<em>Ova kategorija trenutno ne sadrži članke ni medijske datoteke.</em>",
        "hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
        "hidden-category-category": "Sakrivene kategorije",
        "category-subcat-count": "{{PLURAL:$2|Ova kategorija ima sljedeću $1 potkategoriju.|Ova kategorija ima {{PLURAL:$1|sljedeće potkategorije|sljedećih $1 potkategorija}}, od $2 ukupno.}}",
        "unprotectthispage": "Promijeni zaštitu za ovu stranicu",
        "newpage": "Nova stranica / Нова страница",
        "talkpage": "Razgovaraj o ovoj stranici - Разговарај о овој страници",
-       "talkpagelinktext": "Razgovor",
+       "talkpagelinktext": "razgovor",
        "specialpage": "Posebna stranica",
        "personaltools": "Lični alati",
        "articlepage": "Vidi stranicu sadržaja",
        "aboutsite": "O projektu {{SITENAME}}",
        "aboutpage": "Project:O_projektu_{{SITENAME}}",
        "copyright": "Pod licencom / Под лиценцом: $1.",
-       "copyrightpage": "{{ns:project}}:Autorska_prava",
+       "copyrightpage": "{{ns:project}}:Autorska prava",
        "currentevents": "Trenutni događaji",
        "currentevents-url": "Project:Novosti",
        "disclaimers": "Odricanje od odgovornosti",
        "internalerror_info": "Interna greška: $1",
        "internalerror-fatal-exception": "Fatalna greška tipa \"$1\"",
        "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
-       "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
+       "filerenameerror": "Ne mogu preimenovati datoteku \"$1\" u \"$2\".",
        "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
        "directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
        "directoryreadonlyerror": "Direktorij \"$1\" je samo za čitanje.",
        "externaldberror": "Došlo je do greške pri vanjskoj autorizaciji baze podataka ili vam nije dopušteno osvježavanje Vašeg vanjskog korisničkog računa.",
        "login": "Prijavi me - Пријави ме",
        "nav-login-createaccount": "Prijavi se / Registruj se",
-       "userlogin": "Prijavi se / Пријави се",
-       "userloginnocreate": "Prijavi se",
        "logout": "Odjava",
        "userlogout": "Odjavi se / Одјави се",
        "notloggedin": "Niste prijavljeni",
        "userlogin-noaccount": "Nemate račun?",
        "userlogin-joinproject": "Pridružite se {{SITENAME}}",
-       "nologin": "Nemate korisničko ime? '''$1'''.",
-       "nologinlink": "Izradi račun",
        "createaccount": "Izradi račun",
-       "gotaccount": "Imate račun? '''$1'''.",
-       "gotaccountlink": "Prijavite se / Пријавите се",
-       "userlogin-resetlink": "Zaboravili ste detalje vaše prijave?",
        "userlogin-resetpassword-link": "Zaboravili ste lozinku?",
        "userlogin-helplink2": "Pomoć pri prijavljivanju",
        "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
        "createacct-another-email-ph": "Postavite E-mail adresu",
        "createaccountmail": "Koristite privremenu, slučajno stvorenu šifru/lozinku i pošaljite na navedenu adrеsu e-pošte",
        "createacct-realname": "Stvarno ime (opcionalno)",
-       "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto stvarate novi račun",
        "createacct-submit": "Stvorite svoj račun",
        "preview": "Pregled",
        "showpreview": "Prikaži pregled",
        "showdiff": "Prikaži izmjene",
-       "blankarticle": "<strong>Upozorenje:</strong> Napravili ste praznu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", napravit ćete praznu stranicu bez sadržaja.",
+       "blankarticle": "<strong>Upozorenje:</strong> Napravili ste praznu stranicu.\nAko ponovno kliknete \"$1\", napravit ćete praznu stranicu bez sadržaja.",
        "anoneditwarning": "<strong>Upozorenje:</strong> Niste prijavljeni. \nVaša IP adresa će biti javno vidljiva ako napravite neku izmjenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 napravite račun]</strong>, vaše izmjene će biti pripisane vašem korisničkom imenu, zajedno sa drugim pogodnostima.",
        "anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabilježena u historiji ove stranice.''",
        "missingsummary": "'''Podsjećanje:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj/Snimi, Vaša izmjena će biti snimljena bez sažetka.",
-       "selfredirect": "<strong>Upozorenje:</strong> Preusmjeravate stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", ipak će nastati preusmjerenje.",
+       "selfredirect": "<strong>Upozorenje:</strong> Preusmjeravate stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"$1\", ipak će nastati preusmjerenje.",
        "missingcommenttext": "Molimo unesite komentar ispod.",
-       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
+       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu za ovaj komentar.\nAko ponovo kliknete na \"$1\", vaša izmjena će biti sačuvana bez teme/naslova.",
        "summary-preview": "Pretpregled sažetka:",
        "subject-preview": "Pretpregled teme:",
        "previewerrortext": "Dogodila se greška prilikom prikazivanja vaših izmjena.",
        "userinvalidcssjstitle": "'''Upozorenje:''' Nema skina pod imenom \"$1\".\nUpamtite da korisničke .css i .js stranice koriste naslov s malim slovom, npr. {{ns:user}}:Foo/monobook.css umjesto {{ns:user}}:Foo/Monobook.css.",
        "updated": "(Osvježeno)",
        "note": "'''Napomena:'''",
-       "previewnote": "'''Ne zaboravite da je ovo samo pregled'''\nIzmjene stranice nisu još sačuvane!",
+       "previewnote": "<strong>Ne zaboravite da je ovo samo pregled</strong>\nIzmjene stranice nisu još sačuvane!",
        "continue-editing": "Idi na područje uređivanja",
        "previewconflict": "Ovaj pretpregled reflektuje tekst u gornjem polju\nkako će izgledati ako pritisnete \"Snimi stranicu\".",
        "session_fail_preview": "'''Izvinjavamo se! Nismo mogli obraditi vašu izmjenu zbog gubitka podataka o prijavi. Molimo pokušajte ponovno. Ako i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]] i ponovno prijaviti.'''",
        "editingsection": "Uređujete $1 (sekciju)",
        "editingcomment": "Uređujete $1 (nova sekcija)",
        "editconflict": "Sukobljenje izmjene: $1",
-       "explainconflict": "Neko drugi je promujenio ovu stranicu otkad ste Vi počeli da je mijenjate.\nGornje tekstualno polje sadrži tekst stranice koji trenutno postoji.\nVaše izmjene su prikazane u donjem tekstu.\nMoraćete da unesete svoje promjene u postojeći tekst.\n'''Samo''' tekst u gornjem tekstualnom polju će biti snimljen kad pritisnete \"{{int:savearticle}}\".",
+       "explainconflict": "Neko drugi je promujenio ovu stranicu otkad ste Vi počeli da je mijenjate.\nGornje tekstualno polje sadrži tekst stranice koji trenutno postoji.\nVaše izmjene su prikazane u donjem tekstu.\nMoraćete da unesete svoje promjene u postojeći tekst.\n'''Samo''' tekst u gornjem tekstualnom polju će biti snimljen kad pritisnete \"$1\".",
        "yourtext": "Vaš tekst / Ваш текст",
        "storedversion": "Uskladištena verzija",
        "nonunicodebrowser": "'''UPOZORENJE: Vaš preglednik ne podržava Unicode zapis znakova.\nMolimo Vas promijenite ga prije sljedećeg uređivanja članaka. Znakovi koji nisu po ASCII standardu će se u prozoru za izmjene pojaviti kao heksadecimalni kodovi.'''",
        "right-editsemiprotected": "Uređivanje stranica zaštićenih kao  \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Uređivanje modela sadržaja stranice",
        "right-editinterface": "Uređivanje korisničkog interfejsa",
-       "right-editusercssjs": "Uređivanje CSS i JS datoteka drugih korisnika",
        "right-editusercss": "Uređivanje CSS datoteka drugih korisnika",
        "right-edituserjs": "Uređivanje Javascript datoteka drugih korisnika",
        "right-editmyusercss": "Uredite svoje vlastite CSS datoteke",
        "rcshowhidecategorization": "$1 kategorizacija stranice",
        "rcshowhidecategorization-show": "Prikaži",
        "rcshowhidecategorization-hide": "Sakrij",
-       "rclinks": "Prikaži najskorijih $1 izmjena u posljednjih $2 dana<br />$3",
+       "rclinks": "Prikaži najskorijih $1 izmjena u posljednjih $2 dana",
        "diff": "razl-разл",
        "hist": "his-пов",
        "hide": "Sakrij",
        "undeleteviewlink": "pogledaj",
        "undeleteinvert": "Sve osim odabranog",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|$1 revizija vraćena|$1 revizije vraćene|$1 revizija vraćeno}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revizija|$1 revizije|$1 revizija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno",
-       "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
        "cannotundelete": "Vraćanje nije uspjelo:\n$1",
        "undeletedpage": "'''$1 je vraćena'''\n\nProvjerite [[Special:Log/delete|evidenciju brisanja]] za zapise najskorijih brisanja i vraćanja.",
        "undelete-header": "Pogledajte [[Special:Log/delete|evidenciju brisanja]] za nedavno obrisane stranice.",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|je automatski unaprijeđen|je automatski unaprijeđena}} iz $4 u $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|postavio|postavila}} je $3",
        "rightsnone": "(nema)",
-       "revdelete-summary": "sažetak izmjene",
        "feedback-adding": "Dodajem povratne informacije na stranicu...",
        "feedback-bugcheck": "Izvrsno! Molimo provjerite da se ne radi o nekom [$1 poznatom \"bugu\"].",
        "feedback-bugnew": "Provereno. Prijavi novu grešku",
index f84e6e2..80f7f9f 100644 (file)
        "externaldberror": "Imma tlla ɣin kra lafut ɣu ukcumnk ulla urak ittuyskar at tsbddelt lkontnk nbrra.",
        "login": "Kcm ɣid",
        "nav-login-createaccount": "kcm / murzm Amidan",
-       "userlogin": "kchem / qiyd amskhdam amaynu",
-       "userloginnocreate": "Kcm ɣid",
        "logout": "Fuɣ",
        "userlogout": "Fuɣ",
        "notloggedin": "Ur tmlit mat git",
-       "nologin": "Ur trzemt amidan (lkunt) nek? $1..",
-       "nologinlink": "Murzm amidan nek (lkunt)..",
        "createaccount": "Murzm amidan nek (lkunt)..",
-       "gotaccount": "Is nit dark amidan(lkunt)? $1.",
-       "gotaccountlink": "Kcm",
-       "userlogin-resetlink": "Ttut ismnk d tasarut n ukccum nk",
        "createaccountmail": "S tirawt taliktunant",
-       "createaccountreason": "Maɣ:",
        "badretype": "Tasarut lin tgit ur dis tucka.",
        "userexists": "Asaɣ nu umsqdac li tskcmt illa yad",
        "loginerror": "Gar akccum",
        "showdiff": "Mel imbddln lli ifttun",
        "anoneditwarning": "Han  ''' ur ttuyssant ''' rad ibayn IP nk ɣ umzrut n tasna yad, ur sul  iḥba tamagit nk",
        "anonpreviewwarning": "ur ittuyssan mat tgit. Iɣ tgdl tawuri nk, tansa nk IP rad tbayn ɣ umzruy n imbdln n tasna yad.",
-       "missingsummary": "'''Adakt nskti :''' ur ta tfit awal imun n imbddln nk.\nIɣ tklikkit tiklit yaḍn f tjrrayt « {{int:savearticle}} », aẓṛig rad ittuyskar blla tsnt",
+       "missingsummary": "'''Adakt nskti :''' ur ta tfit awal imun n imbddln nk.\nIɣ tklikkit tiklit yaḍn f tjrrayt « $1 », aẓṛig rad ittuyskar blla tsnt",
        "missingcommenttext": "Σafak skjm awnnit (aɣfawal) nk ɣ uflla.",
        "summary-preview": "Tiẓṛi  n tagḍwit:",
        "blockedtitle": "lmostkhdim ad itbloka",
        "saveprefs": "sjjl",
        "restoreprefs": "sglbd kollo regalega",
        "prefs-editing": "tahrir",
-       "rows": "sfof:",
-       "columns": "aamida:",
        "searchresultshead": "Cabba",
        "stub-threshold": "wasla n  <a href=\"#\" class=\"stub\">do amzdoy</a> itforma (bytes):",
        "stub-threshold-disabled": "moattal",
        "rcshowhideanons": "$1 midn ur ttuyssan nin",
        "rcshowhidepatr": "$1 Imbddln n tsagga",
        "rcshowhidemine": "$1 iẓṛign inu",
-       "rclinks": "Ml id  $1 n imbddltn immgura li ittuyskarn n id $2 ussan ad gguranin<br />$3.",
+       "rclinks": "Ml id  $1 n imbddltn immgura li ittuyskarn n id $2 ussan ad gguranin",
        "diff": "Gar",
        "hist": "Amzruy",
        "hide": "Ḥbu",
        "htmlform-selectorother-other": "wayya",
        "revdelete-restricted": "iskr aqn i indbaln",
        "revdelete-unrestricted": "Aqn iḥiyd i indbaln",
-       "rightsnone": "(ḥtta yan)",
-       "revdelete-summary": "Awal uflla n imbddln"
+       "rightsnone": "(ḥtta yan)"
 }
index fd6462a..df0461c 100644 (file)
        "category-empty": "<em> လိူင်ႈဢၼ်ၼႆႉ ယၢမ်းလဵဝ် ဢမ်ႇပႆႇမီး ၼႃႈလိၵ်ႈ ဢမ်ႇၼၼ် သိုဝ်ႇသင်ဝႆႉ</em>",
        "hidden-categories": "{{PLURAL:$1|လိူင်ႈဢၼ်လပ်ႉဝႆႉ |လိူင်ႈၸိူဝ်း ဢၼ်လပ်ႉဝႆႉ}}",
        "hidden-category-category": "လိူင်ႈ ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
-       "category-subcat-count": "{{PLURAL:$2|á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\99á\80®á\80¸á\81µá\80­á\80\84á\80ºá\82\87á\81½á\82\84á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\81¼á\82\86á\82\89 á\81¸á\80­á\80°á\80\84á\80ºá\82\89á\81¼á\82\86á\81µá\80½á\81ºá\80ºá\80¸|á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\81¼á\82\86á\82\89 á\80\99á\80®á\80¸ This category has the following {{PLURAL:$1|á\81µá\80­á\80\84á\80ºá\82\87á\81½á\82\84á\80\9cá\80­á\80°á\80\84á\80ºá\82\88|$1 á\81µá\80­á\80\84á\80ºá\82\87á\81½á\82\84á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80\90á\80\84á\80ºá\80¸လၢႆး}}, ၼႂ်းၵႃႊ $2 တင်းသဵင်ႈတင်းမူတ်း}}",
+       "category-subcat-count": "{{PLURAL:$2|á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\99á\80®á\80¸á\81µá\80­á\80\84á\80ºá\82\87á\81½á\82\84á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\81¼á\82\86á\82\89 á\81¸á\80­á\80°á\80\84á\80ºá\82\89á\81¼á\82\86á\81µá\80½á\81ºá\80ºá\80¸|á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\81¼á\82\86á\82\89 á\80\99á\80®á\80¸ This category has the following {{PLURAL:$1|á\81µá\80­á\80\84á\80ºá\82\87á\81½á\82\84á\80\9cá\80­á\80°á\80\84á\80ºá\82\88|$1 á\81µá\80­á\80\84á\80ºá\82\87á\81½á\82\84á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80\90á\80\84á\80ºá\82\87လၢႆး}}, ၼႂ်းၵႃႊ $2 တင်းသဵင်ႈတင်းမူတ်း}}",
        "category-subcat-count-limited": "ၼႂ်းလိူင်ႈၼႆႉ မီးဝႆႉလိူင်ႈၼင်ႇၼႆ {{PLURAL:$1| ၵိင်ႇၽႄလိူင်ႈ |$1 ၵိင်ႇၽႄလိူင်ႈတင်းလၢႆ}}",
-       "category-article-count": "{{PLURAL:$2| á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¼á\80\84á\80ºá\82\87á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89á\81µá\80½á\81ºá\80ºá\80¸ |á\80\90á\81¢á\80\84á\80ºá\80¸á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89{{PLURAL:$1| á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 }} á\80\99á\80®á\80¸á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\81¼á\82\86á\82\89 á\81µá\82\83á\82\8aá\81¼á\82\82á\80ºá\80¸ $2 á\80\90á\80\84á\80ºá\80¸á\80\9eá\80µá\80\84á\80ºá\82\88á\80\90á\80\84á\80ºá\80¸á\80\99á\80°á\80\90á\80ºá\80¸}}",
+       "category-article-count": "{{PLURAL:$2| á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¼á\80\84á\80ºá\82\87á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89á\81µá\80½á\81ºá\80ºá\80¸ |á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 {{PLURAL:$1| á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 }} á\80\90á\80\84á\80ºá\80¸á\80\9eá\80µá\80\84á\80ºá\82\88á\80\90á\80\84á\80ºá\80¸á\80\99á\80°á\80\90á\80ºá\80¸ á\80\99á\80®á\80¸á\80\9dá\82\86á\82\89 $2 á\82\81á\80°á\80\9dá\80º}}á\81\8b",
        "category-article-count-limited": "တၢင်းပႃႈတႂ်ႈၼႆႉ  {{PLURAL:$1| ၼႃႈလိၵ်ႈ }} မီးၼႂ်းလိူင်ႈ တေႃႈလဵဝ်ၼႆႉ",
        "category-file-count": "{{PLURAL:$2| လိူင်ႈဢၼ်ၼႆႉ ပႃးဝႆႉၼႃႈလိၵ်ႈၼင်ႇပႃႈတႂ်ႈၼႆႉၵွၺ်း |တၢင်းပႃႈတႂ်ႈၼႆႉ{{PLURAL:$1| ၾႆႇၼႆႉပဵၼ်|$1 ၾၢႆႇၸိူဝ်းၼႆႉပဵၼ် }} မီးၼႂ်းလိူင်ႈၼႆႉ ၵႃႊၼႂ်း $2 တင်းသဵင်ႈတင်းမူတ်း}}",
        "category-file-count-limited": "ဢၼ်ပဵၼ် {{PLURAL:$1|ၾၢႆႇၼႆႉ|$1 ၾၢႆႇၸိူဝ်းၼႆႉ}} မီးဝႆႉတီႈၼႂ်း တွၼ်ႈၵၼ်ၼႆ့။",
        "redirectedfrom": "(လုၵ်ႉတီး $1 ၼႆႈသေ ၶိုၼ်းပိၼ်ႇဝၢႆႇမႃး)",
        "redirectpagesub": "ပိၼ်ႇႁူဝ်ၼႃႈလိၵ်ႈ",
        "redirectto": "ဝိၼ်ႇၵႂႃႇၸူး:",
-       "lastmodifiedat": "ၼႃႈ​လိၵ်ႈၼႆ့ မႄး​ဝႆႉ ၼင်ႇ​ၵမ်း​လိုၼ်း​သုတ်း မိူဝ်ႈ ဝၼ်း​တီႈ $1 ၶၢဝ်းယၢမ်း $2",
+       "lastmodifiedat": "ၼႃႈ​လိၵ်ႈၼႆ့ မႄးမႃး​ဝႆႉ ၼင်ႇ​ၵမ်း​လိုၼ်း​သုတ်း မိူဝ်ႈ ဝၼ်း​တီႈ $1 ၶၢဝ်းယၢမ်း $2",
        "viewcount": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇၸႂ်ႉဝႆႉ {{PLURAL:$1|ပွၵ်ႈၼိုင်ႈ|$1 ၵမ်း}}.",
        "protectedpage": "ၼႃးလိၵ်ႈ ဢၼ်ႁႄႉၵင်ႈဝႆႉ",
        "jumpto": "ၶၢမ်ႈၸူး :",
        "login": "လွၵ်ႉဢိၼ်ႇ",
        "login-security": "ၼႄႉၼွၼ်း မၢႆၽၢင်ၸဝ်ႈၵဝ်ႇ",
        "nav-login-createaccount": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
-       "userlogin": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
-       "userloginnocreate": "လွၵ်ႉဢိၼ်ႇ",
        "logout": "လွၵ်ႉဢွၵ်ႉ",
        "userlogout": "လွၵ်ႉဢွၵ်ႉ",
        "notloggedin": "ဢမ်ႇလႆႈၶဝ်ႈဝႆ့",
        "userlogin-noaccount": "ပႆႇပႃႈမီးဢၶွင်ႉႁႃႉ?",
        "userlogin-joinproject": "ႁူမ်ႈ {{SITENAME}}",
-       "nologin": "ပႆႇပႃႈမီးဢၶွင်ႉႁႃႉ? $1",
-       "nologinlink": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
        "createaccount": "ႁဵတ်းဢၶွင်ႉ",
-       "gotaccount": "မီးဢၶွင်ႉဝႆႉယဝ်ႉႁႃႉ? $1",
-       "gotaccountlink": "လွၵ်ႉဢိၼ်ႇ",
-       "userlogin-resetlink": "လိုမ်းပႅတ်ႈၵႂႃႇ ႁူဝ်ယွႆႈ လွၵ်ႉဢိၼ်ႉၸဝ်ႈၵဝ်ႇယဝ်ႉႁႃႉ?",
        "userlogin-resetpassword-link": "လိုမ်းၵႂႃႇ ၶေႃႈလပ်ႉၸဝ်ႈၵဝ်ႇႁႃႉ?",
        "userlogin-helplink2": "ၸွႆႈထႅမ်တင်း ၶဝ်ႈလွၵ်ႉဢိၼ်ႇ",
        "userlogin-loggedin": "​ၸဝ်ႈၵဝ်ႇပေႃး ၶဝ်ႈၸႂ်ႉဝႆႉ ၼင်ႇ{{GENDER:$1|$1}} ယဝ်ႈ။\nၸႂ်ႉပၼ် လၢႆးၼင်ႇပႃႈတႂ်ႈၼႆႉသေ လွၵ်ႉဢိၼ်ႇၼင်ႇ ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉ",
        "createaccountmail": "ၸႂ်ႉပၼ် ၶေႃႈလပ်ႉၸူဝ်ႈၵႅပ်ႉ သူင်ႇၼၼ်ႉၵႂႃႇၸူး ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢၼ်မၵ်းမၼ်ႈဝႆႉ ပၼ်ၼၼ်ႉ။",
        "createaccountmail-help": "ပေႃးဢမ်ႇမီး လွင်ႈလဵပ်ႈႁဵၼ်း ၶေႃႈလပ်ႉၼႆ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉ တႃႇတေၵေႃႇတင်ႈ ဢၶွင်ႉတွၼ်ႈတႃႇ ၵူၼ်းတၢင်ႇၵေႃႉ။",
        "createacct-realname": "ၸိုဝ်ႈတႄႉတႄႉ (ဢဝ်ၸႂ်ဝႃႈ)",
-       "createaccountreason": "လွင်ႈတၢင်း :",
        "createacct-reason": "လွင်ႈတၢင်း :",
        "createacct-reason-ph": "ယွၼ်ႉပိူဝ်ႈသင်လႄႈ ၸဝ်ႈၵဝ်ႇ ၵေႃႇသၢင်ႈဢၶွင်ႉတၢင်ႇဢၼ်",
        "createacct-reason-help": "ၶေႃႈၶၢဝ်ႇၼႄဝႆႉ ၵႃႈတီႈၼႂ်း သဵၼ်ႈ​မၢႆၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
        "preview": "တူၺ်းလူင်ႈၼႃႈ",
        "showpreview": "ၼႄတူဝ်ယၢင်ႇ",
        "showdiff": "ၼႄလွင်ႈလႅၵ်ႈလၢႆႈ",
-       "blankarticle": "<strong>ၽၢင်ႉ:</strong> ၼႃႈလိၵ်ႈ ဢၼ်ၸဝ်ႈၵဝ်ႇ ၵေႃႇသၢင်ႈဝႆႉၼႆႉ မၼ်းတိုၵ်ႉပဵၼ် ဢၼ်ပဝ်ႇဝႆႉၵူၺ်း။ ပေႃးၸဝ်ႈၵဝ်ႇ ၼဵၵ်း \"{{int:savearticle}}\" ထႅင်ႈၵမ်းၼိုင်ႈၼႆ, ၼႃႈလိၵ်ႈၼႆႉ မၼ်းတေၵေႃႇသၢင်ႈၵႂႃႇ ၼင်ႇ ဢၼ်ပဝ်ႇ ဢၼ်ဢမ်ႇမီးသင်ၼၼ်ႉယဝ်ႈ။",
+       "blankarticle": "<strong>ၽၢင်ႉ:</strong> ၼႃႈလိၵ်ႈ ဢၼ်ၸဝ်ႈၵဝ်ႇ ၵေႃႇသၢင်ႈဝႆႉၼႆႉ မၼ်းတိုၵ်ႉပဵၼ် ဢၼ်ပဝ်ႇဝႆႉၵူၺ်း။ ပေႃးၸဝ်ႈၵဝ်ႇ ၼဵၵ်း \"$1\" ထႅင်ႈၵမ်းၼိုင်ႈၼႆ, ၼႃႈလိၵ်ႈၼႆႉ မၼ်းတေၵေႃႇသၢင်ႈၵႂႃႇ ၼင်ႇ ဢၼ်ပဝ်ႇ ဢၼ်ဢမ်ႇမီးသင်ၼၼ်ႉယဝ်ႈ။",
        "anoneditwarning": "<strong>ၽၢင်ႉပၼ်:</strong> ၸဝ်ႈၵဝ်ႇဢမ်ႇလႆႈ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆႉ။ သင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇ ႁဵတ်းလွင်ႈလႅၵ်ႈလၢႆႈသေဢၼ်ၼႆႉ ဢၼ်ပဵၼ် မၢႆသၢႆၼႅတ်ႇ - IP address ၸဝ်ႈၵဝ်ႇၼၼ်ႉ တေဢွၵ်ႇၼႄဝႆႉ ႁႂ်ႈၵူၼ်းတၢင်းၼမ်ႁၼ်ၸွမ်း။ သင်ၸိူဝ်ႉၸဝ်ႈၵဝ်ႇ <strong>[$1 log in]</strong> ဢမ်ႇၼၼ် <strong>[$2 create an account]</strong>, ၵၢၼ်ၸဝ်ႈၵဝ်ႇ ႁဵတ်းၼၼ်ႉၵေႃႈ မၼ်းတေၵႂႃႇၶဝ်ႈပဵၼ် လွင်ႈႁူမ်ႈသၢင်ႈ ၵႃႈတီႈ ၸိုဝ်ႈၸဝ်ႈၵဝ်ႇသေ ၸဝ်ႈၵဝ်ႇ ႁူမ်ႈသၢင်ႈသင်ၼႆၵေႃႈ ၵူႈၵေႃႉ တေလႆႈႁၼ်ၵိုၵ်းၸိုဝ်ႈ ၸဝ်ႈၵဝ်ႇယူႇ။",
        "anonpreviewwarning": "<em>ၸဝ်ႈၵဝ်ႇၼႆႉ ဢမ်ႇပႆႇလႆႈ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆႉ။ တေဢဝ် မၢႆဢၢႆႇပီၸဝ်ႈၵဝ်ႇသေ သိမ်းပၼ်ၵႂႃႇ တီႈၼႂ်း ပိုၼ်းမႄးထတ်း ၼႃႈလိၵ်ႈၼႆႉၶႃႈ။",
-       "missingsummary": "<strong>ၶေႃႈၵိုတ်းလိူဝ်:</strong> ၸဝ်ႈၵဝ်ႇဢမ်ႇလႆႈၵမ်ႉထႅမ်ပၼ်ဝႆႉ ႁူဝ်ႁုပ်ၵၢၼ်မႄးထတ်း။ သင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇ ၼဵၵ်း \"{{int:savearticle}}\" ထႅင်ႈၵမ်းၼိုင်ႈၼႆ ၵၢၼ်မႄးထတ်းၸဝ်ႈၵဝ်ႇ ႁဵတ်းဝႆႉၼၼ်ႉ မၼ်းတေသိမ်းၵႂႃႇ ၼင်ႇဢမ်ႇမီးပႃး လွင်ႈႁူဝ်ႁုပ်မၼ်းၼၼ်ႉယဝ်ႈ။",
+       "missingsummary": "<strong>ၶေႃႈၵိုတ်းလိူဝ်:</strong> ၸဝ်ႈၵဝ်ႇဢမ်ႇလႆႈၵမ်ႉထႅမ်ပၼ်ဝႆႉ ႁူဝ်ႁုပ်ၵၢၼ်မႄးထတ်း။ သင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇ ၼဵၵ်း \"$1\" ထႅင်ႈၵမ်းၼိုင်ႈၼႆ ၵၢၼ်မႄးထတ်းၸဝ်ႈၵဝ်ႇ ႁဵတ်းဝႆႉၼၼ်ႉ မၼ်းတေသိမ်းၵႂႃႇ ၼင်ႇဢမ်ႇမီးပႃး လွင်ႈႁူဝ်ႁုပ်မၼ်းၼၼ်ႉယဝ်ႈ။",
        "missingcommenttext": "ၶႅၼ်းတေႃႈ ပေႃႉသႂ်ႇပၼ် တၢင်းၶႆႈၸႂ် ၵႃႈတီႈတႂ်ႈၼႆႉ",
        "previewerrortext": "မိူဝ်ႈၽွင်းၶတ်းၸႂ်ၼႄ တႃႇတူၺ်းလူင်ႈၼႃႈ လွင်ႈလႅၵ်ႈလၢႆႈ ဢၼ်ၸဝ်ႈၵဝ်ႇ ႁဵတ်းမႃးၼၼ်ႉ လႆႈမီးလွင်ႈၽိတ်းပိူင်ႈ ဢွၵ်ႇပဵၼ်ဝႆႉ။",
        "blockedtitle": "ၽူႈၸႂ်ႉတိုဝ်းၼႆႉ ထုၵ်ႇတတ်းၶၢတ်ႇဝႆ့",
        "readonlywarning": "<strong>ၽၢင်ႉ : ယွင်ၶေႃႈမုၼ်းၼႆႉ ထုၵ်ႇၶတ်းဝႆႉ တွၼ်ႈတႃႇ ၵၢၼ်မူၼ်ႉ​​မေး၊ ယွၼ်ႉၼၼ်လႄႈ ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈ သိမ်းဝႆႉ ၵၢၼ်လႅၵ်ႈလၢႆႈ ၸဝ်ႈၵဝ်ႇ ယၢမ်းလဵဝ်</strong>\nၸဝ်ႈဝ်ႇ တေလူဝ်ႇ ထုတ်ႇ ၵေႃႇပီႇ သေ ပႃႉသႂ်ႇ ၽဵတ်ႉသႂ်ႇဝႆႉ တီႈၼႂ်း ၾၢႆႇလိၵ်ႈ သေ သိမ်းဝႆႉ တွၼ်ႈတႃႇၶိုၼ်းၸႂ်ႉဝၢႆးလင်။\nၵေႃႉၵုမ်းထိင်ပိူင်သၢင်ႈ ၵေႃႉဢၼ်ၶတ်းဝႆႉၼႆႉ မၼ်းပၼ်လွင်ႈတၢင်းမၼ်းဝႆႉဝႃႈ : $1",
        "protectedpagewarning": "<strong>ၽၢင်ႉ : ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ၊ ယွၼ်ႉၼၼ်လႄႈ ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ၽူႈၵုမ်းၵၢၼ် ၶဝ်ၵူၺ်းတေၸၢင်ႈမီး သုၼ်ႇမႄးထတ်းလႆႈ။</strong>\nသဵၼ်ႈမၢႆၵမ်းလိုၼ်းၸိူဝ်းၼႆႉ ပၼ်ဝႆႉၽၢႆႇတႂ်ႈၼႆႉ တွၼ်ႈတႃႇႁႂ်ႈပဵၼ် ၵၢၼ်ဢိင် :",
        "semiprotectedpagewarning": "<strong>မၢႆတွင်း:</strong> ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ၊ ယွၼ်ႉၼၼ်လႄႈ ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်တၢင်ႇမၢႆၽၢင်ဝႆႉၼၼ်ႉၵူၺ်း တေၸၢင်ႈ မႄးထတ်းလႆႈ။ \nသဵၼ်ႈမၢႆၵမ်းလိုၼ်းၸိူဝ်းၼႆႉ ပၼ်ဝႆႉၽၢႆႇတႂ်ႈၼႆႉ တွၼ်ႈတႃႇႁႂ်ႈပဵၼ် ၵၢၼ်ဢိင် :",
-       "cascadeprotectedwarning": "<strong>ၽၢင်ႉ :</strong> ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉလႄႈ ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ၽူႈၵုမ်းၵၢၼ်ၶဝ်ၵူၺ်း တေမီးသုၼ်ႇ မႄးထတ်းလႆႈ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ မၼ်းၶဝ်ႈပႃးဝႆႉ ၼႂ်းၵိင်ႇၽႄ ၸိူဝ်းပဵၼ် ဢၼ်ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ {{PLURAL:$1|page|pages}}:",
+       "cascadeprotectedwarning": "<strong>ၽၢင်ႉ :</strong> ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉလႄႈ ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ၽူႈၵုမ်းၵၢၼ်ၶဝ်ၵူၺ်း[[Special:ListGroupRights|specific rights]] တေမီးသုၼ်ႇ မႄးထတ်းလႆႈ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ မၼ်းၶဝ်ႈပႃးဝႆႉ ၼႂ်းၵိင်ႇၽႄ ၸိူဝ်းပဵၼ် ဢၼ်ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ {{PLURAL:$1|page|pages}}:",
        "titleprotectedwarning": "<strong>ၽၢင်ႉ : ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ ယွၼ်ႉၼၼ် [[Special:ListGroupRights|specific rights]] ၸိူဝ်းၼႆႉ ထုၵ်ႇၵေႃႇသၢင်ႈဝႆႉ။</strong>\nသဵၼ်ႈမၢႆၵမ်းလိုၼ်းၸိူဝ်းၼႆႉ ပၼ်ဝႆႉၽၢႆႇတႂ်ႈၼႆႉ တွၼ်ႈတႃႇႁႂ်ႈပဵၼ် ၵၢၼ်ဢိင် :",
        "templatesused": "{{PLURAL:$1|Template|ပိူင်တမ်း}} ၸႂ်ႉဝႆႉတီႈၼႃႈလိၵ်ႈၼႆႉ:",
        "templatesusedpreview": "{{PLURAL:$1|ပိူင်တမ်း|ပိူင်တမ်း၊}} ၸႂ်ႉဝႆႉတီႈၼႂ်း ၵၢၼ်တူၺ်းလူင်ႈၼႃႈ :",
        "last": "ဢွၼ်တၢင်း",
        "page_first": "ဢွၼ်တၢင်း",
        "page_last": "လိုတ်းသုတ်း",
-       "history-fieldset-title": "á\80\95á\80­á\80¯á\81¼á\80ºá\80¸á\80\95á\80­á\80¯á\80\90á\80ºá\82\87á\82\81á\82\83",
-       "history-show-deleted": "ဢၼ်​ယႃႉ​ဝႆႉ​ၼၼ်ႉၵွၺ်း",
+       "history-fieldset-title": "á\80\9eá\80½á\81µá\80ºá\82\88á\82\81á\82\83á\80\90á\82\83 á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87",
+       "history-show-deleted": "á\81¶á\80±á\82\83á\82\88á\81¶á\80°á\81¼á\80ºá\82\89á\80¢á\81¢á\81¼á\80ºá\82\87 á\80¢á\81¼á\80ºâ\80\8bá\80\9aá\82\83á\82\89â\80\8bá\80\9dá\82\86á\82\89â\80\8bá\81¼á\81¼á\80ºá\82\89á\81µá\80½á\81ºá\80ºá\80¸",
        "histfirst": "ၵဝ်ႇသုတ်း",
        "histlast": "မႂ်ႇသုတ်း",
        "historysize": "({{PLURAL:$1|1 ပၢႆႉ|$1 ပၢႆႉ}})",
        "nextn-title": "သိုပ်ႇၵႂႃႇၸူး $1 {{PLURAL:$1|result|ၽွၼ်းလႆႈ}}",
        "shown-title": "ၼႄ $1 {{PLURAL:$1|result|results}} ၼိူဝ်​ၼႃႈ​လိၵ်ႈ​ၼိူင်ႈၼႃႈ",
        "viewprevnext": "တူၺ်း ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "<strong>ၼႃႈလိၵ်ႈ ဢၼ်ပၼ်ၸိုဝ်ႈဝႆႉဝႃႈ  \"[[:$1]]\" တီႈၼႂ်း ဝီႇၶီႇဢၼ်ၼႆႉ။</strong> {{PLURAL:$2|0=|တူၺ်းပႃး ၽွၼ်းလႆႈသွၵ်ႈႁႃ တၢင်ႇၸိူဝ်း ၸိူဝ်းႁၼ်ဝႆႉၼၼ်ႉ။}}",
        "searchmenu-new": "<strong> ၶူင်သၢင်ႈၼႃႈလိၵ်ႈ \"[[:$1]]\" တီႈဝီႇၶီႇၼႆႉ </strong> {{PLURAL:$2|0=|ၼႃႈလိၵ်ႈၼႆႉ ၼႄဝႆႉ ဢၼ်ၸဝ်ႈၵဝ်ႇသွၵ်ႈႁႃ| တူၺ်းၼႃႈလိၵ်ႈဢၼ် ၼႄပၼ် ၸိူဝ်း ဢၼ်ၸဝ်ႈၵဝ်ႇသွၵ်ႈႁႃဝႆ့}}",
-       "searchprofile-articles": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\81¼မ်းၼႂ်း",
+       "searchprofile-articles": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 á\80\9cမ်းၼႂ်း",
        "searchprofile-images": "သႅၼ်သိုဝ်ႇၶၢဝ်ႇ",
        "searchprofile-everything": "ၵူႊဢၼ်",
        "searchprofile-advanced": "ၸၼ်ႉသုင်",
        "search-section": "(တွၼ်ႈၵၼ် $1)",
        "search-category": "(တွၼ်ႈၵၼ် $1)",
        "search-suggest": "ၶႂ်ႈဝႃႈ $1 - ၼႆႁႃႉ",
-       "search-interwiki-caption": "ၼႃႈၵၢၼ် ပီႈၼွင်ႉၵၼ်",
+       "search-interwiki-caption": "á\81½á\80½á\81¼á\80ºá\80¸á\80\9cá\82\86á\82\88 á\81µá\82\83á\82\88á\80\90á\80®á\82\88 á\81¼á\82\83á\82\88á\81µá\81¢á\81¼á\80º á\80\95á\80®á\82\88á\81¼á\80½á\80\84á\80ºá\82\89á\81µá\81¼á\80º",
        "search-interwiki-default": "ၽွၼ်းလႆႈ ၵႃႈတီႈ $1 :",
        "search-interwiki-more": "(လိူဝ်)",
        "search-interwiki-more-results": "ၽွၼ်းလႆႈ ဢၼ်ၼမ်လိူဝ်",
        "prefs-tokenwatchlist": "မၢႆၶပ်ႉ",
        "prefs-diffs": "လွင်ႈပႅၵ်ႇပိူင်ႈ",
        "prefs-help-prefershttps": "ငဝ်ႈၵုမ်းၵၢၼ်ၼႆႉ ပေႃးဝႃႈ ၶိုၼ်းၶဝ်ႈလွၵ်ႉဢိၼ်ႇထႅင်ႈၵမ်းၼင်ႇ ၸင်ႇတေလႅၵ်ႈလၢႆႈ။",
-       "userrights": "á\80\9cá\80½á\80\84á\80ºá\82\88á\81¸á\80\90á\80ºá\80¸á\81µá\81¢á\81¼á\80ºá\80\9eá\80¯á\81¼á\80ºá\82\88á\80\9cá\82\86á\82\88 á\81½á\80°á\82\88á\81¸á\82\82á\80ºá\82\89á\80\90á\80­á\80¯á\80\90်း",
+       "userrights": "á\80\9eá\80¯á\81¼á\80ºá\82\87á\80\9cá\82\86á\82\88 á\81½á\80°á\82\88á\81¸á\82\82á\80ºá\82\89á\80\90á\80­á\80¯á\80\9d်း",
        "userrights-lookup-user": "လိူၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
        "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": "တူၺ်း ၸုမ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
        "saveusergroups": "သိမ်း  ၸိူဝ်းၸုမ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
        "right-editsemiprotected": "မႄးထတ်းၼႃႈလိၵ်ႈၸိူဝ်း ႁႄႉၵင်ႈဝႆႉၼင်ႇ \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "မႄးထတ်း ၽၢင်ႁၢင်ႈတူဝ်ၶဝ်ႈပႃး ၶွင်ၼႃႈလိၵ်ႈ",
        "right-editinterface": "မႄးထတ်း ယူင်ႉႁၢင်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
-       "right-editusercssjs": "မႄးထတ်းၾၢႆႇ CSS လႄႈ JavaScript ၶွင် ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း",
        "right-editusercss": "မႄးထတ်း ၾၢႆႇ CSS ၶွင် ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း",
        "right-edituserjs": "မႄးထတ်း ၾၢႆႇ JavaScript ၶွင် ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း",
        "right-editmyusercss": "မႄးထတ်း ၾၢႆႇ CSS ၶွင်ႁင်းၸဝ်ႈၵဝ်ႇ",
        "recentchanges-summary": "ၸွမ်းတူၺ်းႁွႆး ဢၼ်ပဵၼ်ၵၢၼ် တိုၵ်ႉႁႃလႅၵ်ႈလၢႆႈၵႂႃႇ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈ ဝီႇၶီႇၼႆႉ။",
        "recentchanges-feed-description": "ၸွမ်းတူၺ်းႁွႆး ဢၼ်ပဵၼ်ၵၢၼ် တိုၵ်ႉႁႃလႅၵ်ႈလၢႆႈၵႂႃႇ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈ ဝီႇၶီႇၼႆႉ။",
        "recentchanges-label-newpage": "လွင်ႈမႄးထတ်းဢၼ်ၼႆႉ ၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇယဝ်ႉ",
-       "recentchanges-label-minor": "á\80\95á\80µá\81¼á\80ºá\80\9cá\80½á\80\84á\80ºá\82\88á\80\99á\80°á\81¼á\80ºá\82\89á\80\99á\82\84းဢိတ်းဢီႈ",
-       "recentchanges-label-bot": "á\80\9cá\80½á\80\84á\80ºá\82\88á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\95á\80\99á\81¼á\80ºá\80¸á\80\95á\80µá\81¼á\80º bot á\81µá\80±á\82\83á\82\89á\82\81á\80µá\80\90á\80ºá\80¸á\81µá\82\82á\82\83á\82\87",
+       "recentchanges-label-minor": "á\80\95á\80µá\81¼á\80ºá\80\9cá\80½á\80\84á\80ºá\82\88á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºးဢိတ်းဢီႈ",
+       "recentchanges-label-bot": "လွင်ႈမႄးထတ်းဢၼ်ၼႆႉ မၼ်းပဵၼ် bot ၵေႃႉႁဵတ်းၵႂႃႇ",
        "recentchanges-label-unpatrolled": "ၶေႃႈထတ်းၼႆႉ ပႆႉၼႅၼ်ႈၼႃ",
        "recentchanges-label-plusminus": "သႅၼ်းၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇလႅၵ်ႈလၢႆႈ ၸွမ်းၼင်ႇ မၢႆ bytes ဢၼ်ၼႆႉ",
        "recentchanges-legend-heading": "<strong>ဢပုမ်ႇ:</strong>",
        "rcfilters-filter-registered-description": "ၽူႈမႄးထတ်းၶဝ် ၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆႉ",
        "rcfilters-filter-unregistered-label": "ဢမ်ႇလႆႈတၢင်ႇမၢႆႇၽၢင်ဝႆႉ",
        "rcfilters-filter-unregistered-description": "ၽူႈမႄးထတ်း ၸိူဝ်းဢမ်ႇလႆႈၶဝ်ႈ လွၵ်ႉဢိၼ်ႇဝႆႉ",
-       "rcfilters-filtergroup-authorship": "á\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ ၸဝ်ႈပၢႆၵမ်",
-       "rcfilters-filter-editsbyself-label": "လွင်ႈမႄးထတ်း ၸဝ်ႈၵဝ်ႇ",
-       "rcfilters-filter-editsbyself-description": "á\80¢á\81¼á\80ºá\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\81µá\80±á\82\83á\82\89á\80\91á\80\90á\80ºá\80¸",
-       "rcfilters-filter-editsbyother-label": "á\80¢á\81¼á\80ºá\80\90á\81¢á\80\84á\80ºá\82\87á\81µá\80±á\82\83á\82\89 á\81µá\80±á\82\83á\82\89á\80\91တ်း",
-       "rcfilters-filter-editsbyother-description": "á\81µá\81¢á\81¼á\80ºá\80\99á\82\84á\80¸á\80\91á\80\90á\80ºá\80¸ á\80¢á\81¼á\80ºá\81½á\80°á\82\88á\81¸á\82\82á\80ºá\82\89á\80\90á\80­á\80¯á\80\9dá\80ºá\80¸ á\80\90á\81¢á\80\84á\80ºá\82\87á\81¸á\80­á\80°á\80\9dá\80ºá\80¸ á\81µá\80±á\82\83á\80\9eá\81¢á\80\84á\80ºá\82\88á\80\9dá\82\86á\82\89 (á\80¢á\81¼á\80ºá\80¢á\80\99á\80ºá\82\87á\81¸á\82\82á\80ºá\82\88 á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87)",
+       "rcfilters-filtergroup-authorship": "á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80\9dá\80ºá\82\88á\82\81á\80°á\80\99á\80ºá\82\88 ၸဝ်ႈပၢႆၵမ်",
+       "rcfilters-filter-editsbyself-label": "လွင်ႈ​လႅၵ်ႈလၢႆႈ ၸဝ်ႈၵဝ်ႇႁဵတ်း",
+       "rcfilters-filter-editsbyself-description": "á\80\9cá\80½á\80\84á\80ºá\82\88á\81¶á\80\9dá\80ºá\82\88á\82\81á\80°á\80\99á\80ºá\82\88 á\81¶á\80½á\80\84á\80ºá\80\90á\80°á\80\9dá\80ºá\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87",
+       "rcfilters-filter-editsbyother-label": "á\80\9cá\80½á\80\84á\80ºá\82\88á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88 á\80\90á\81¢á\80\84á\80ºá\82\87á\81µá\80±á\82\83á\82\89á\82\81á\80µတ်း",
+       "rcfilters-filter-editsbyother-description": "á\80\9cá\80½á\80\84á\80ºá\82\88á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88á\80\90á\81¢á\80\84á\80ºá\80¸á\80\9eá\80µá\80\84á\80º á\80\9cá\80­á\80°á\80\9dá\80ºá\80\9eá\80±á\81¶á\80½á\80\84á\80ºá\80\90á\80°á\80\9dá\80ºá\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87",
        "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-filter-user-experience-level-newcomer-label": "ၵူၼ်းၼႃႈမႂ်ႇ",
+       "rcfilters-filter-user-experience-level-newcomer-description": "ဢေႇလိူဝ် ၵၢၼ်မႄးထတ်း ႑႐ ဢၼ် လႄႈ လွင်ႈတူင်ႉၼိုင် တႃႇသီႇဝၼ်း",
+       "rcfilters-filter-user-experience-level-learner-label": "ၽူႈလဵပ်ႈႁဵၼ်း",
+       "rcfilters-filter-user-experience-level-learner-description": "ၵၢၼ်တူဝ်ထပ်းမၼ်း ၼမ်သေ \"ၵူၼ်းၼႃႈမႂ်ႇ\"သေတႃႉ မၼ်းတိုၵ်ႉ​ဢေႇသေ \"ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း\"။",
+       "rcfilters-filter-user-experience-level-experienced-label": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း",
+       "rcfilters-filter-user-experience-level-experienced-description": "လွင်ႈတူင်ႉၼိုင် ၼမ်လိူဝ် ႓႐ ဝၼ်း လႄႈ လွင်ႈမႄးထတ်း ႕႐႐ ။",
        "rcfilters-filtergroup-automated": "ၶဝ်ႈႁူမ်ႈႁင်းၵႂႃႇႁင်းမၼ်း",
        "rcfilters-filter-bots-label": "ပွတ်ႉ",
        "rcfilters-filter-bots-description": "ၶိူင်ႈႁဵတ်းႁင်းၶေႃ ၵေႃႉႁဵတ်းသၢင်ႈဝႆႉ လွင်ႈမႄးထတ်း",
        "rcshowhidecategorization": "$1 ၼႃႈလိၵ်ႈ ပၢႆး-",
        "rcshowhidecategorization-show": "ၼႄ",
        "rcshowhidecategorization-hide": "သိူင်ႇ",
-       "rclinks": "ၼႄလွင်ႈလႅၵ်ႈလၢႆႈ ၵမ်းလိုၼ်းသုတ်း $1 ဢၼ်လႅၵ်ႈလၢႆႈမႃး မိူဝ်ႈ $2 ဝၼ်းၼၼ်ႉ<br />$3",
+       "rclinks": "ၼႄလွင်ႈလႅၵ်ႈလၢႆႈ ၵမ်းလိုၼ်းသုတ်း $1 ဢၼ်လႅၵ်ႈလၢႆႈမႃး မိူဝ်ႈ $2 ဝၼ်းၼၼ်ႉ",
        "diff": "ပႅၵ်ႇပိူင်ႈ",
        "hist": "ပိုၼ်း",
        "hide": "သိူင်ႇ",
        "allpagesto": "ၼႃႈလိၵ်ႈဢၼ်ၼႄ သုတ်းတီႈ :",
        "allarticles": "ၼႃႈ​လိၵ်ႈ​တင်း​သဵင်ႈ",
        "allinnamespace": "ၼႃႈလိၵ်ႈတင်းမူတ်း ($1 ဢွင်ႈၸိုဝ်ႈ)",
-       "allpagessubmit": "á\81¶á\80°á\81¼á\80ºá\82\89á\82\81á\82\83",
+       "allpagessubmit": "á\80\9eá\80­á\80¯á\80\95á\80ºá\82\87á\81µá\82\82á\82\83á\82\87",
        "allpagesprefix": "ၼႃးလိၵ်ႈဢၼ်ၼႄ ဢိၵ်ႇတင်း ၶေႃႈလူင်ႈၼႃႈ",
        "categories": "လိူင်ႈ",
        "sp-deletedcontributions-contribs": "လွင်ႈၶဝ်ႈႁူမ်ႈ",
        "listgrouprights-key": "ၶေႃႈၶႆႈလၢတ်ႈ:\n* <span class=\"listgrouprights-granted\">သုၼ်ႇ ဢၼ်ၶႂၢင်းပၼ်ဝႆႉ</span>\n* <span class=\"listgrouprights-revoked\">သုၼ် ဢၼ်ယႃႉပႅတ်ႈဝႆႉ</span>",
        "listgrouprights-group": "ၸုမ်း :",
        "listgrouprights-rights": "သုၼ်ႇ",
-       "listgrouprights-helppage": "ၸွႆႈထႅမ်:သုၼ်ႇၸုမ်း",
+       "listgrouprights-helppage": "Help:သုၼ်ႇၸုမ်း",
        "listgrouprights-members": "(သဵၼ်ႈမၢႆ ၽူႈၸႂ်ႉတိုဝ်း)",
        "listgrouprights-addgroup": "ထႅမ်သႂ်ႇ {{PLURAL:$2|ၸုမ်း|ၸုမ်း.}}: $1",
        "listgrouprights-removegroup": "ထွၼ်ပႅတ်ႈ {{PLURAL:$2|ၸုမ်း|ၸုမ်း.}}: $1",
        "enotif_body_intro_moved": "ၼႃႈလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|ၶၢႆႉဝႆႉ}} မိူဝ်ႈ $PAGEEDITDATE ၼၼ်ႉ၊ တွၼ်ႈတႃႇ ၵၼ်ၶိုၼ်းဢၢၼ်ႇဢၼ် ယၢမ်းလဵဝ်ၼႆႉၼႆ တူၺ်းတီႈ  $3 ၼၼ်ႉၶႃႈလႄႈ။",
        "enotif_body_intro_restored": "ၼႃႈလိၵ်ႈ {{SITENAME}}  $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|တမ်းဝႆႉၶိုၼ်း}} မိူဝ်ႈ $PAGEEDITDATE  ၼၼ်ႉ၊ တွၼ်ႈတႃႇ ၵၢၼ်ၶူၼ်ႉၶႆႈ ယၢမ်းလဵဝ်ၼႆႉၼႆတူၺ်း တီႈ $3 ၼၼ်ႉၶႃႈလႄႈ။",
        "enotif_body_intro_changed": "ၼႃးလိၵ်ႈ {{SITENAME}} $1 ၼႆႉ ထုၵ်ႇ $2 ၵေႃႉ {{GENDER:$2|လႅၵ်ႈလၢႆႈဝႆႉ}} မိူဝ်ႈ $PAGEEDITDATE ၼၼ်ႉ၊ တွၼ်ႈတႃႇ ၵၼ်ၶိုၼ်းဢၢၼ်ႇဢၼ် ယၢမ်းလဵဝ်ၼႆႉၼႆ တူၺ်းတီႈ  $3 ၼၼ်ႉၶႃႈလႄႈ။",
-       "enotif_lastvisited": "á\81¸á\80µá\80\99á\80ºá\80\99á\80­á\80°á\80\9dá\80ºá\82\88 á\80\9dá\81¢á\82\86á\80¸á\80\9eá\80± á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\99á\82\83á\80¸á\80¢á\82\85á\80\9dá\80ºá\82\87 á\80\95á\80½á\81µá\80ºá\82\87á\80\9cá\80­á\80¯á\81¼á\80ºá\80¸á\80\9eá\80¯á\80\90á\80ºá\80¸á\81¼á\81¼á\80ºá\82\89 á\80\99á\80®á\80¸á\80\9cá\80½á\80\84á\80ºá\82\88á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88á\80\9eá\80\84á\80ºá\81¼á\82\86 တူၺ်းတီႈ $1 ၼႆႈၶႃႈလႄႈ။",
-       "enotif_lastdiff": "á\80\90á\80½á\81¼á\80ºá\82\88á\80\90á\82\83á\82\87á\80\90á\80°á\81ºá\80ºá\80¸ á\80\9cá\80½á\80\84á\80ºá\82\88á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\90á\80°á\81ºá\80ºá\80¸ á\80\90á\80®á\82\88 $1 á\81¼á\82\86á\82\88á\81¶á\82\83á\82\88á\80\9cá\82\84á\82\88á\81\8b",
+       "enotif_lastvisited": "á\80\9cá\80½á\80\84á\80ºá\82\88á\80\9cá\82\85á\81µá\80ºá\82\88á\80\9cá\81¢á\82\86á\82\88á\80\90á\81¢á\80\84á\80ºá\80¸á\80\99á\80°á\80\90á\80ºá\80¸ á\80\9dá\81¢á\82\86á\80¸á\80\9eá\80± á\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\80\99á\82\83á\80¸á\80¢á\82\85á\80\9dá\80ºá\82\87 á\81µá\80\99á\80ºá\80¸á\80\9cá\80­á\80¯á\81¼á\80ºá\80¸á\80\9eá\80¯á\80\90á\80ºá\80¸á\81¼á\81¼á\80ºá\82\89 တူၺ်းတီႈ $1 ၼႆႈၶႃႈလႄႈ။",
+       "enotif_lastdiff": "တႃႇတူၺ်း လွင်ႈလႅၵ်ႈလၢႆႈဢၼ်ၼႆႉ တူၺ်း တီႈ $1 ၼႆႈၶႃႈလႄႈ။",
        "enotif_anon_editor": "ၽူႈၸႂ်ႉတိုဝ်း ဢမ်ႇသႂ်ႇၸိုဝ်ႈ $1",
        "deletepage": "မွတ်ႇပႅတ်ႈ ၼႃႈလိၵ်ႈ",
        "confirm": "ၼႄႉၼွၼ်း",
        "rollbacklinkcount": "ၵိင်ႈၶိုၼ်းလင် $1 {{PLURAL:$1|edit|မႄးထတ်း}}",
        "cantrollback": "ဢမ်ႇၸၢင်ႈ ပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း;\nၽူႈၶဝ်ႈႁူမ်ႈ ​ၵမ်းလိုၼ်းသုတ်းၼႆႉ မၼ်းၵူၺ်းပဵၼ် ၽူႈတႅမ်ႈလိၵ်ႈ တႃႇ ၼႃႈလိၵ်ႈၼႆႉ။",
        "revertpage": " [[Special:Contributions/$2|$2]] ([[User talk:$2|တွၼ်ႈဢုပ်ႇ]]) ၵေႃႉပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း ၸူး မၢႆဢွၵ်ႇ ၵမ်းလိုၼ်းသုတ်း ဢၼ် [[User:$1|$1]] ၵေႃႉႁဵတ်းဝႆႉ",
-       "rollback-success": "$1 ၵေႃႉ ပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း ;\n$2 လႅၵ်ႈလၢႆႈဝႆႉၸူး လွင်ႈၶူၼ်ႉၶႆႈ ၵမ်းလိုၼ်းသုတ်း။",
+       "rollback-success": "Reverted edits by {{GENDER:$3|$1}}; ၵေႃႉ ပိၼ်ႈၶိုၼ်း လွင်ႈမႄးထတ်း ;\n{{GENDER:$4|$2}}. လႅၵ်ႈလၢႆႈဝႆႉၸူး လွင်ႈၶူၼ်ႉၶႆႈ ၵမ်းလိုၼ်းသုတ်း။",
        "changecontentmodel": "လႅၵ်ႈလၢႆႈ ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ၶွင်ၼႃႈလိၵ်ႈ",
        "changecontentmodel-legend": "လႅၵ်ႈလၢႆႈ ပိူင်ႈၵေႃႇသၢင်ႈ လမ်းၼႂ်း",
        "changecontentmodel-title-label": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ",
        "undeleteviewlink": "တူၺ်း",
        "undeleteinvert": "လွင်ႈလိူၵ်ႈသၢင်ႈ ပိၼ်ႈၽူၼ်",
        "undeletecomment": "လွင်ႈတၢင်း :",
-       "undeletedrevisions": "{{PLURAL:$1|1 ၶူၼ်ႉၶႆႈ|$1 ၸိူဝ်းၶူၼ်ႉၶႆႉ}} ဢဝ်ဝႆႉၶိုၼ်းယဝ်ႉ",
-       "undeletedfiles": "ဝႆႉၶိုၼ်း {{PLURAL:$1|1 ၾၢႆႇ}} ယဝ်ႉ",
        "undelete-search-title": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇဝႆႉ",
        "undelete-search-box": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇဝႆႉ",
        "undelete-search-prefix": "ၼႄ ၼႃႈလိၵ်ႈ ၸိူဝ်းတႄႇဝႆႉတင်း :",
        "sp-contributions-uploads": "လူတ်ႇၶိုၼ်ႈ",
        "sp-contributions-logs": "မၢႆတမ်း",
        "sp-contributions-talk": "တွၼ်ႈဢုပ်ႇ",
-       "sp-contributions-userrights": "လွင်ႈၸတ်းၵၢၼ်သုၼ်ႈလႆႈ ၽူႈၸႂ်ႉတိုတ်း",
+       "sp-contributions-userrights": "လွင်ႈၸတ်းၵၢၼ်သုၼ်ႈလႆႈ {{GENDER:$1|user}}",
        "sp-contributions-blocked-notice": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ထုၵ်ႇတတ်းၶၢတ်ႇဝႆႉဢေႃႈ ယၢမ်းလဵဝ်။\nသဵၼ်ႈမၢႆတတ်းၶၢတ်ႇ ၵမ်းလိုၼ်းသုတ်းၼႆႉ ၼႄဝႆႉယူႇၵႃႈတီႈ သဵၼ်ႈမၢႆၽိုၼ်ဢိင် ပႃႈတႂ်ႈၼႆႉ။",
        "sp-contributions-blocked-notice-anon": "ၽူႈၸႂ်ႉတိုဝ်းၵေႃႉၼႆႉ ထုၵ်ႇတတ်းၶၢတ်ႇဝႆႉဢေႃႈ ယၢမ်းလဵဝ်။\nသဵၼ်ႈမၢႆတတ်းၶၢတ်ႇ ၵမ်းလိုၼ်းသုတ်းၼႆႉ ၼႄဝႆႉယူႇၵႃႈတီႈ သဵၼ်ႈမၢႆၽိုၼ်ဢိင် ပႃႈတႂ်ႈၼႆႉ။",
        "sp-contributions-search": "ၶူၼ်ႉႁႃ တႃႇ လွင်ႈၶဝ်ႈႁူမ်ႈ",
        "anonymous": "{{PLURAL:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ဢၼ်ဢမ်ႇမီးၸိုဝ်ႈ ၶွင် {{SITENAME}}",
        "siteuser": "{{SITENAME}} ၽူႈၸႂ်ႉတိုဝ်း $1",
        "anonuser": "{{SITENAME}} ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ဢမ်ႇမီးၸိုဝ်ႈ $1",
-       "lastmodifiedatby": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇ $3 ၵေႃႉမူၼ်ႉမႄးဝႆႉမိူဝ်ႈ $2, $1။",
+       "lastmodifiedatby": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\91á\80¯á\81µá\80ºá\82\87 $3 á\81µá\80±á\82\83á\82\89á\80\99á\80°á\81¼á\80ºá\82\89á\80\99á\82\84á\80¸á\80\9dá\82\86á\82\89á\80\99á\80­á\80°á\80\9dá\80ºá\82\88 $2, $1á\81\8b",
        "spam_reverting": "လွင်ႈပိၼ်ႈၶိုၼ်း လွင်ႈၶူၼ်ႉၶႆႈ ၵမ်းလိုၼ်းသုတ်းၼၼ်ႉ မၼ်းဢမ်ႇၶဝ်ႈပႃးဝႆႉ ႁဵင်းၵွင်ႉ ဢၼ်ၵွင်ႉၸူး $1",
        "simpleantispam-label": "ၵူတ်ႇထတ်း Anti-spam.\n<strong>ယႃႇပေ</strong>ထႅမ်ဢၼ်ၼႆႉသႂ်ႇ!",
        "pageinfo-header-basic": "�လွၼ်ႉၶၢဝ်ႈ ပိုၼ်ႉထၢၼ်",
        "sunday-at": "ဝၼ်းဢႃးတိတ်ႉ မိူဝ်ႈ $1",
        "yesterday-at": "မိူဝ်ႈဝႃး မိူဝ်ႈ $1",
        "metadata": "ၶေႃႈမုၼ်းၼႅပ်ႇ",
-       "metadata-help": "á\81¾á\81¢á\82\86á\82\87á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\99á\81¼á\80ºá\80¸á\81¶á\80\9dá\80ºá\82\88á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\80\9cá\80½á\81¼á\80ºá\82\89á\81¶á\81¢á\80\9dá\80ºá\82\87 á\80\91á\82\85á\80\99á\80ºá\80\9eá\82\82á\80ºá\82\87á\80\99á\82\82á\80ºá\82\87á\81\8a á\80¢á\81¼á\80ºá\80¢á\81¢á\80\95á\80ºá\82\88á\80\91á\80¯á\81µá\80ºá\82\89á\80\90á\80®á\82\88 á\81µá\80½á\80\84á\80ºá\82\88á\80\91á\82\86á\82\87 digital á\80¢á\80\99á\80ºá\82\87á\81¼á\81¼á\80º á\80\90á\80°á\80\9dá\80ºá\81µá\80°á\80\90á\80ºá\82\87 scanner ​ထႅမ်သႂ်ႇသေ သၢင်ႈဝႆႉ ဢမ်ႇၼၼ် လႅၵ်ႈလၢႆႈဝႆႉ။\nသင်ၸိူဝ်ႉၾၢႆႇဢၼ်ၼႆႉ ထုၵ်ႇမႄးၶိုၼ်းဝႆႉၵႃႈတီႈ ၾၢႆႇငဝ်ႈတိုၼ်းမၼ်းၼႆ ၼႂ်းၵႃႈ ၸဝ်ႈၵဝ်ႇမႄးဝႆႉၼၼ်ႉ မၼ်းတေဢမ်ႇထၢင်ႇႁၢင်ႈလႆႈ ၵူႈလွင်ႈ။",
+       "metadata-help": "á\81¾á\81¢á\82\86á\82\87á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\99á\81¼á\80ºá\80¸á\81¶á\80\9dá\80ºá\82\88á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\80\9cá\80½á\81¼á\80ºá\82\89á\81¶á\81¢á\80\9dá\80ºá\82\87 á\80\91á\82\85á\80\99á\80ºá\80\9eá\82\82á\80ºá\82\87á\80\99á\82\82á\80ºá\82\87á\81\8a á\80¢á\81¼á\80ºá\80¢á\81¢á\80\95á\80ºá\82\88á\80\91á\80¯á\81µá\80ºá\82\89á\80\90á\80®á\82\88 á\81µá\80½á\80\84á\80ºá\82\88á\80\91á\82\86á\82\87 digital á\80¢á\80\99á\80ºá\82\87á\81¼á\81¼á\80º á\80¢á\80\9dá\80º scanner ​ထႅမ်သႂ်ႇသေ သၢင်ႈဝႆႉ ဢမ်ႇၼၼ် လႅၵ်ႈလၢႆႈဝႆႉ။\nသင်ၸိူဝ်ႉၾၢႆႇဢၼ်ၼႆႉ ထုၵ်ႇမႄးၶိုၼ်းဝႆႉၵႃႈတီႈ ၾၢႆႇငဝ်ႈတိုၼ်းမၼ်းၼႆ ၼႂ်းၵႃႈ ၸဝ်ႈၵဝ်ႇမႄးဝႆႉၼၼ်ႉ မၼ်းတေဢမ်ႇထၢင်ႇႁၢင်ႈလႆႈ ၵူႈလွင်ႈ။",
        "metadata-fields": "ၸိူဝ်းပဵၼ် လွၵ်းၶေႃႈမုၼ်းႁူဝ်ယွႆႈ တႃႇၶႅပ်းႁၢင်ႈ ဢၼ်မီးဝႆႉတီႈၼႂ်း ၶေႃႈၶၢဝ်ႇပွတ်း message ၼႆႉၼႆ မၼ်းတေၶဝ်ႈပႃးဝႆႉ ၵႃႈတီႈ ၼႃႈလိၵ်ႈၶႅပ်းႁၢင်ႈ ဢၼ်တေၼႄပၼ် ၽွင်းမိူဝ်ႈ လွၵ်းၶေႃႈမုၼ်းႁူဝ်ယွႆႈ လၼ်ႇၼႄပၼ်။\nဢၼ်ၵိုတ်းလိူဝ်ၸိူဝ်းၼၼ်ႉတႄႉ တေထုၵ်ႇလပ်ႉဝႆႉ ၸွမ်းၼင်ႇ ပိူင်ၵႅဝ်ႈမၼ်း။\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": "ႁႅင်းၸိုၼ်ႈသႂ် ၼႃႈသုင်",
index c54d38e..5f8034b 100644 (file)
        "login": "පිවිසෙන්න",
        "login-security": "ඔබේ අනන්‍යතාවය තහවුරු කරන්න",
        "nav-login-createaccount": "පිවිසෙන්න / නව ගිණුමක් තනන්න",
-       "userlogin": "පිවිසෙන්න / නව ගිණුමක් තනන්න",
-       "userloginnocreate": "ප්‍රවිෂ්ට වන්න",
        "logout": "නික්මීම",
        "userlogout": "නික්මීම",
        "notloggedin": "ප්‍රවිසී නැත",
        "userlogin-noaccount": "ගිණුමක් නොමැතිද?",
        "userlogin-joinproject": "{{SITENAME}} හා එක්වන්න",
-       "nologin": "ඔබ හට ගිණුමක් නොමැතිද? '''$1'''.",
-       "nologinlink": "ගිණුමක් තනන්න",
        "createaccount": "අලුත් ගිණුමක් තනන්න",
-       "gotaccount": "දැනටමත් ගිණුමක් තිබේද? $1.",
-       "gotaccountlink": "පිවිසෙන්න",
-       "userlogin-resetlink": "ඔබේ පිවිසුම් තොරතුරු අමතකද?",
        "userlogin-resetpassword-link": "ඔබේ මුරපදය නැති වුනාද?",
        "userlogin-helplink2": "ගිණුම වෙත පිවිසීම සඳහා උදවු",
        "userlogin-loggedin": "ඔබ දැනටමත් {{GENDER:$1|}} ලෙස පිවිසී ඇත.\nනව පරිශීලකයෙකු ලෙස ඇතුළු වීමට පහත ආකෘතිය පුරවන්න.",
        "createacct-another-email-ph": "ඊ මේල් ලිපිනය ඇතුළත් කරන්න.",
        "createaccountmail": "තාවකාලික අහුඹු මුර පදයක් භාවිතා කර එය පහත දක්වා ඇති විද්යුත් තැපැල් ලිපිනයට යවන්න",
        "createacct-realname": "නියම නම (වෛකල්පීය)",
-       "createaccountreason": "හේතුව:",
        "createacct-reason": "හේතුව",
        "createacct-reason-ph": "ඔබ තවත් ගිණුමක් තනන්නේ කුමක් නිසාද",
        "createacct-submit": "ඔබේ ගිණුම තනන්න",
        "preview": "පෙරදසුන",
        "showpreview": "පෙරදසුන පෙන්වන්න",
        "showdiff": "වෙනස්කිරීම් පෙන්වන්න",
-       "blankarticle": "<Strong>අවවාදයයි: </strong> ඔබ නිර්මාණය කරන පිටුව හිස් වේ. ඔබ ක්ලික් නම් \"{{int:savearticle}}\" නැවතත්, පිටුව කවර හෝ අන්තර්ගතයක් නොමැතිව නිර්මාණය කරනු ඇත.",
+       "blankarticle": "<Strong>අවවාදයයි: </strong> ඔබ නිර්මාණය කරන පිටුව හිස් වේ. ඔබ ක්ලික් නම් \"$1\" නැවතත්, පිටුව කවර හෝ අන්තර්ගතයක් නොමැතිව නිර්මාණය කරනු ඇත.",
        "anoneditwarning": "<strong>අවවාදයයි:</strong> ඔබ පරිශීලකයෙකු වශයෙන් පද්ධතියට පිවිස නැත.\nඔබගේ IP යොමුව මෙම පිටුවෙහි සංස්කරණ ඉතිහාසයෙහි වාර්තාගත වෙනු ඇත.\nඔබ <strong>[$1 පිවිසීම]</strong> හෝ <strong>[$2 ගිණුමක් තැනීම]</strong> කලහොත්, ඔබගේ සංස්කරණ ඔබගේ පරිශීලක නමින් දැක්වීම සහ වෙනත් ප්‍රතිලාභ ලැබෙනු ඇත.",
        "anonpreviewwarning": "අවවාදයයි: ඔබ පරිශීලකයෙකු වශයෙන් පද්ධතියට ප්‍රවිෂ්ට වී නොමැත. එමනිසා මෙම පිටුවෙහි සංස්කරණ ඉතිහාසයෙහි, ඔබගේ අන්තර්ජාල ලිපිනය සටහන් කරගැනීමට සිදුවනු ඇත.",
        "missingsummary": "'''සිහිගැන්වීමයි:''' ඔබ විසින් සංස්කරණ සාරාංශයක් සපයා නොමැත.\nඔබ නැවතත් සුරැකීම ක්ලික් කලහොත්, ඔබගේ සංස්කරණය එවැන්නක් විරහිතවම සුරැකෙනු ඇත.",
-       "selfredirect": "<Strong>අවවාදයයි:</strong> ඔබ තමන් වෙත මෙම පිටුව හරවා යවයි ඇත. \nඔබ යළි-යොමුවීම් සඳහා වැරදි ඉලක්කය නිශ්චිතව දක්වා ඇති විය හැක, හෝ ඔබ වැරදි පිටුව සංස්කරණය කල හැක. \nඔබ ක්ලික් නම් \"{{int:savearticle}}\" නැවතත්, යළි-යොමුවීම් කෙසේ හෝ නිර්මාණය කරනු ඇත.",
+       "selfredirect": "<Strong>අවවාදයයි:</strong> ඔබ තමන් වෙත මෙම පිටුව හරවා යවයි ඇත. \nඔබ යළි-යොමුවීම් සඳහා වැරදි ඉලක්කය නිශ්චිතව දක්වා ඇති විය හැක, හෝ ඔබ වැරදි පිටුව සංස්කරණය කල හැක. \nඔබ ක්ලික් නම් \"$1\" නැවතත්, යළි-යොමුවීම් කෙසේ හෝ නිර්මාණය කරනු ඇත.",
        "missingcommenttext": "කරුණාකර පහතින් පරිකථනයක් ඇතුළු කරන්න.",
-       "missingcommentheader": "<strong>සිහිගැන්වීමයි:</strong>  මෙම පරිකථනය සඳහා ඔබ විසින් විෂයයක්/සිරස්තලයක් සපයා නොමැත.\nඔබ නැවතත් \"{{int:savearticle}}\" ක්ලික් කලහොත්, ඔබගේ සංස්කරණය එවැන්නක් විරහිතවම සුරැකෙනු ඇත.",
+       "missingcommentheader": "<strong>සිහිගැන්වීමයි:</strong>  මෙම පරිකථනය සඳහා ඔබ විසින් විෂයයක්/සිරස්තලයක් සපයා නොමැත.\nඔබ නැවතත් \"$1\" ක්ලික් කලහොත්, ඔබගේ සංස්කරණය එවැන්නක් විරහිතවම සුරැකෙනු ඇත.",
        "summary-preview": "සාරාංශ පෙර-දසුන:",
        "subject-preview": "විෂයය හි පෙර දසුන:",
        "previewerrortext": "ඔබේ වෙනස්කම් පෙරදසුන් කිරීමට උත්සාහ දරන අතර දෝෂයක් ඇතිවිය.",
        "editingsection": "$1 (ඡේදය) සංස්කරණය කරමින් පවතියි",
        "editingcomment": "$1 සංස්කරණය කරමින් පවතියි (නව ඡේදයක්)",
        "editconflict": "සංස්කරණ ගැටුම: $1",
-       "explainconflict": "ඔබ මෙම පිටුව සංස්කරණය කිරීමට ඇරඹි පසුව යම් අයෙකු එය වෙනස් කොට ඇත.\nඉහළ පෙළ කොටසේ අඩංගු වනුයේ පිටු පෙළ  දැනට පවතින අයුරිනි.\nපහළ පෙළ කොටසේ ඔබගේ වෙනස්වීම් පෙන්වා ඇත.\nදැනට පවතින පෙළට ඔබගේ වෙනස්කිරීම් ඒකාබද්ධ කිරීම ඔබ විසින් කල යුතුව ඇත.\nඔබ විසින්  \"{{int:savearticle}}\" යන්න එබූ විට සුරැකෙන්නේ ඉහළ කොටසේ පෙළ '''පමණි'''.",
+       "explainconflict": "ඔබ මෙම පිටුව සංස්කරණය කිරීමට ඇරඹි පසුව යම් අයෙකු එය වෙනස් කොට ඇත.\nඉහළ පෙළ කොටසේ අඩංගු වනුයේ පිටු පෙළ  දැනට පවතින අයුරිනි.\nපහළ පෙළ කොටසේ ඔබගේ වෙනස්වීම් පෙන්වා ඇත.\nදැනට පවතින පෙළට ඔබගේ වෙනස්කිරීම් ඒකාබද්ධ කිරීම ඔබ විසින් කල යුතුව ඇත.\nඔබ විසින්  \"$1\" යන්න එබූ විට සුරැකෙන්නේ ඉහළ කොටසේ පෙළ '''පමණි'''.",
        "yourtext": "ඔබගේ පෙළ",
        "storedversion": "ගබඩාකල අනුවාදය",
        "nonunicodebrowser": "'''අවවාදයයි: ඔබගේ බ්‍රවුසරය යුනිකේත  අනුකූල නොවේ.\nමෙම දුෂ්කරතාවය මගහැර පිටු සංස්කරණය  සුරක්ෂිතව සිදුකිරීමට ඔබට ඉඩ සලසන වක් මගක් ඇත: ASCII-නොවන අක්ෂර  සංස්කරණ කොටුවෙහි ෂඩ්දශක කේතයන් ලෙස පෙන්නුම් කෙරේ.'''",
        "right-editsemiprotected": "ලෙස ආරක්ෂා සංස්කරණය කරන්න පිටු \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "පිටුවෙහි ඇති අන්තර්ගතය ආකෘතිය සංස්කරණය කරන්න",
        "right-editinterface": "පරිශීලක අතුරු-මුව සංස්කරණය කරන්න",
-       "right-editusercssjs": "අනෙකුත් පරිශීලකයන්ගේ  CSS හා JS ගොනු සංස්කරණය කරන්න",
        "right-editusercss": "අනෙකුත් පරිශීලකයන්ගේ  CSS ගොනු සංස්කරණය කරන්න",
        "right-edituserjs": "අනෙකුත් පරිශීලකයන්ගේ  JS ගොනු සංස්කරණය කරන්න",
        "right-editmyusercss": "ඔබේ ම පරිශීලක CSS ගොනු සංස්කරණය කරන්න",
        "rcshowhidecategorization": "පිටු ප්‍රවර්ගීකරණය $1",
        "rcshowhidecategorization-show": "පෙන්වන්න",
        "rcshowhidecategorization-hide": "සඟවන්න",
-       "rclinks": "අවසන් දින $2 තුලදී සිදුවී ඇති අවසන් වෙනස්වීම් $1 පෙන්නුම් කරන්න<br />$3",
+       "rclinks": "අවසන් දින $2 තුලදී සිදුවී ඇති අවසන් වෙනස්වීම් $1 පෙන්නුම් කරන්න",
        "diff": "වෙනස",
        "hist": "ඉති",
        "hide": "සඟවන්න",
        "undeleteviewlink": "නරඹන්න",
        "undeleteinvert": "තෝරාගැනුම කණපිට පෙරලන්න",
        "undeletecomment": "හේතුව:",
-       "undeletedrevisions": "{{PLURAL:$1|සංශෝධනයක්|සංශෝධන $1 ක්}} ප්‍රතිෂ්ඨාපනය කරන ලදි",
-       "undeletedrevisions-files": "{{PLURAL:$1|එක් සංශෝධනයක්| සංශෝධන $1 ක්}} සහ {{PLURAL:$2|එක් ගොනුවක්|ගොනු $2 ක්}} ප්‍රතිෂ්ඨාපනය කෙරිණි",
-       "undeletedfiles": "{{PLURAL:$1|එක් ගොනුවක්|ගොනු $1 ක්}} ප්‍රතිෂ්ඨාපනය කෙරිණි",
        "cannotundelete": "මකාදැමීම ප්‍රතිලෝම කිරීම අසාර්ථක විය:\n$1",
        "undeletedpage": "'''$1 ප්‍රතිෂ්ඨාපනය කෙරී ඇත'''\n\nමෑතදී සිදුවූ මකාදැමීම් හා ප්‍රතිෂ්ඨාපනයන් හි වාර්තාවක් උදෙසා [[Special:Log/delete|මකාදැමීම් ලඝු-සටහන]] පරිශීලනය කරන්න.",
        "undelete-header": "මෑතදී මකාදැමුණු පිටු සඳහා  [[Special:Log/delete|මකාදැමුම්  ලඝු-සටහන]] බලන්න.",
        "sp-contributions-search": "දායකත්ව පිළිබඳ ගවේෂණය කරන්න",
        "sp-contributions-username": "පරිශීලක නාමය හෝ IP ලිපිනය:",
        "sp-contributions-toponly": "නවතම අනුවාදයන් වන සංස්කරණයන් පමණක් පෙන්වයි",
+       "sp-contributions-newonly": "පිටු නිර්මාණය කිරීම් වන සංස්කරණ පමණක් පෙන්වන්න",
        "sp-contributions-submit": "සොයන්න",
        "whatlinkshere": "මෙතනට සබැඳෙන්නේ කුමක්ද",
        "whatlinkshere-title": "\"$1\" වෙත සබැ‍ඳෙන පිටු",
        "logentry-newusers-autocreate": "$1 පරිශීලක ගිණුම ස්වංක්‍රීයව {{GENDER:$2|නිර්මිතය}}",
        "logentry-upload-upload": "$1 විසින් $3 {{GENDER:$2|උඩුගත කරන ලදී}}",
        "rightsnone": "(කිසිවක් නොමැත)",
-       "revdelete-summary": "සංස්කරණ සාරාංශය",
        "feedback-adding": "ප්‍රතිචාරය පිටුවට එක් කරමින් ...",
        "feedback-bugcheck": "කදිමයි! දැන් එය දැනටමත් [$1 හඳුනාගත් දෝෂ]වල තිබේ දැයි පිරික්සන්න.",
        "feedback-bugnew": "මම පරික්ෂා කළා. නව දෝෂය වාර්තා කරන්න",
index c8103b6..a49c908 100644 (file)
@@ -34,7 +34,8 @@
                        "Mikulas1",
                        "Hromoslav",
                        "Matma Rex",
-                       "LacoR"
+                       "LacoR",
+                       "Xð"
                ]
        },
        "tog-underline": "Podčiarkovať odkazy:",
        "searcharticle": "Ísť na",
        "history": "História stránky",
        "history_short": "História",
+       "history_small": "história",
        "updatedmarker": "aktualizované od mojej poslednej návštevy",
        "printableversion": "Verzia na tlač",
        "permalink": "Trvalý odkaz",
        "unprotectthispage": "Zmeniť stav ochrany tejto stránky",
        "newpage": "Nová stránka",
        "talkpage": "Diskusia k stránke",
-       "talkpagelinktext": "Diskusia",
+       "talkpagelinktext": "diskusia",
        "specialpage": "Špeciálna stránka",
        "personaltools": "Osobné nástroje",
        "articlepage": "Zobraziť stránku",
        "views": "Zobrazenia",
        "toolbox": "Nástroje",
        "tool-link-userrights": "Zmeniť používateľské skupiny {{GENDER:$1|tohoto použivateľa|tejto používateľky}}",
+       "tool-link-userrights-readonly": "Zobraziť {{GENDER:$1|používateľské}} skupiny",
        "tool-link-emailuser": "Poslať e-mail {{GENDER:$1|tomuto používateľovi|tejto používateľke}}",
        "userpage": "Zobraziť stránku používateľa",
        "projectpage": "Zobraziť projektovú stránku",
        "login": "Prihlásiť",
        "login-security": "Overte svoju identitu",
        "nav-login-createaccount": "Prihlásenie / vytvorenie účtu",
-       "userlogin": "Prihlásenie / vytvorenie účtu",
-       "userloginnocreate": "Prihlásiť",
        "logout": "Odhlásiť",
        "userlogout": "Odhlásiť",
        "notloggedin": "Neprihlásený/á",
        "userlogin-noaccount": "Nemáte ešte účet?",
        "userlogin-joinproject": "Pridajte sa k {{GRAMMAR:lokál|{{SITENAME}}}}",
-       "nologin": "Nemáte ešte účet? $1.",
-       "nologinlink": "Vytvoriť nový účet",
        "createaccount": "Vytvoriť nový účet",
-       "gotaccount": "Máte už vytvorený účet? '''$1'''.",
-       "gotaccountlink": "Prihlásiť",
-       "userlogin-resetlink": "Zabudli ste svoje prihlasovacie údaje?",
        "userlogin-resetpassword-link": "Zabudli ste heslo?",
        "userlogin-helplink2": "Pomoc s prihlásením",
        "userlogin-loggedin": "Ste už {{GENDER:$1|prihlasený|prihlásená}} ako $1.\nPomocou formulára nižšie sa môžete prihlásiť ako iný používateľ.",
        "userlogin-reauth": "Aby ste preukázali, že ste $1, musíte sa znovu prihlásiť.",
        "userlogin-createanother": "Vytvoriť ďalší účet",
-       "createacct-emailrequired": "Emailová adresa",
-       "createacct-emailoptional": "Emailová adresa (nepovinné)",
-       "createacct-email-ph": "Zadajte svoju emailovú adresu",
-       "createacct-another-email-ph": "Zadajte svoju emailovú adresu",
-       "createaccountmail": "Použiť dočasné náhodné heslo a poslať ho na uvedenú emailovú adresu",
+       "createacct-emailrequired": "E-mailová adresa",
+       "createacct-emailoptional": "E-mailová adresa (nepovinné)",
+       "createacct-email-ph": "Zadajte svoju e-mailovú adresu",
+       "createacct-another-email-ph": "Zadajte svoju e-mailovú adresu",
+       "createaccountmail": "Použiť dočasné náhodné heslo a poslať ho na uvedenú e-mailovú adresu",
        "createaccountmail-help": "Môže byť použité na vytvorenie účtu pre inú osobu bez prezradenia hesla.",
        "createacct-realname": "Skutočné meno (nepovinné)",
-       "createaccountreason": "Dôvod:",
        "createacct-reason": "Dôvod",
        "createacct-reason-ph": "Prečo si vytvárate ďalší účet",
        "createacct-reason-help": "Správa zobrazená v knihe nových používateľov",
        "noemailcreate": "Musíte uviesť platnú e-mailovú adresu",
        "passwordsent": "Nové heslo bolo zaslané na e-mailovú adresu\npoužívateľa „$1“.\nProsím, prihláste sa znovu, keď ho dostanete.",
        "blocked-mailpassword": "Boli zablokované úpravy z vašej IP adresy, a tak nie je dovolené použiť funkciu znovuvyžiadania hesla, aby sa zabránilo zneužitiu.",
-       "eauthentsent": "Email s potvrdením bol zaslaný na uvedenú emailovú adresu.\nPredtým ako sa na účet pošle akákoľvek ďalšia pošta, musíte splniť inštrukcie v emaili, aby ste potvrdili, že účet je skutočne váš.",
-       "throttled-mailpassword": "E-mail na obnovenie hesla už bol odoslaný v priebehu {{PLURAL:$1|poslednej $1 hodiny|posledných $1 hodín}}.\nAby sa zabránilo zneužitiu, obnovenie hesla emailom je možné vykonať iba raz za {{PLURAL:$1|$1 hodinu|$1 hodiny|$1 hodín}}.",
+       "eauthentsent": "E-mail s potvrdením bol zaslaný na uvedenú adresu.\nPredtým ako sa na účet pošle akákoľvek ďalšia pošta, musíte splniť inštrukcie v e-maili, aby ste potvrdili, že účet je skutočne váš.",
+       "throttled-mailpassword": "E-mail na obnovenie hesla už bol odoslaný v priebehu {{PLURAL:$1|poslednej $1 hodiny|posledných $1 hodín}}.\nAby sa zabránilo zneužitiu, obnovenie hesla e-mailom je možné vykonať iba raz za {{PLURAL:$1|$1 hodinu|$1 hodiny|$1 hodín}}.",
        "mailerror": "Chyba pri posielaní e-mailu: $1",
        "acct_creation_throttle_hit": "Návštevníci tejto wiki z vašej IP adresy už za posledný deň vytvorili {{PLURAL:$1|$1 účet|$1 účty|$1 účtov}}, čo je maximálny počet povolený za toto časové obdobie.\nZ tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť ďalšie účty.",
-       "emailauthenticated": "Vaša emailová adresa bola overená $2 $3.",
-       "emailnotauthenticated": "Vaša e-mailová adresa ešte nebola overená.\nPreto nemôžete prijať emaily pre žiadnu z nasledovných funkcií.",
-       "noemailprefs": "Tieto nástroje budú prístupné po vyplnení emailovej adresy vo vašich nastaveniach.",
+       "emailauthenticated": "Vaša e-mailová adresa bola overená $2 o $3.",
+       "emailnotauthenticated": "Vaša e-mailová adresa ešte nebola overená.\nPreto nemôžete prijať e-maily pre žiadnu z nasledovných funkcií.",
+       "noemailprefs": "Tieto nástroje budú prístupné po vyplnení e-mailovej adresy vo vašich nastaveniach.",
        "emailconfirmlink": "Potvrďte svoju e-mailovú adresu",
-       "invalidemailaddress": "Emailovú adresu nemožno akceptovať, pretože sa zdá, že má neplatný formát. Zadajte adresu v správnom tvare alebo nechajte príslušné políčko prázdne.",
+       "invalidemailaddress": "E-mailovú adresu nemožno akceptovať, pretože sa zdá, že má neplatný formát. Zadajte adresu v správnom tvare alebo nechajte príslušné políčko prázdne.",
        "cannotchangeemail": "Na tejto wiki nie je možné meniť e-mailové adresy používateľského účtu.",
-       "emaildisabled": "Táto lokalita nedokáže posielať emaily.",
+       "emaildisabled": "Táto lokalita nedokáže posielať e-maily.",
        "accountcreated": "Účet vytvorený",
        "accountcreatedtext": "Používateľský účet [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskusia]]) bol vytvorený.",
        "createaccount-title": "Vytvorenie účtu na {{GRAMMAR:lokál|{{SITENAME}}}}",
-       "createaccount-text": "Niekto vytvoril účet pre vašu emailovú adresu na {{GRAMMAR:lokál|{{SITENAME}}}}\n($4) s názvom „$2“, s heslom „$3“. Mali by ste sa prihlásiť a svoje heslo teraz zmeniť.\n\nAk bol účet vytvorený omylom, túto správu môžete ignorovať.",
+       "createaccount-text": "Niekto vytvoril účet s vašou e-mailovou adresou na {{GRAMMAR:lokál|{{SITENAME}}}}\n($4) s názvom „$2“, s heslom „$3“. Mali by ste sa prihlásiť a svoje heslo teraz zmeniť.\n\nAk bol účet vytvorený omylom, túto správu môžete ignorovať.",
        "login-throttled": "Uskutočnili ste príliš mnoho neúspešných pokusov o prihlásenie.\nProsím, počkajte $1 predtým, než to skúsite znova.",
        "login-abort-generic": "Vaše prihlásenie bolo neúspešné – zrušené",
        "login-migrated-generic": "Váš účet bol presťahovaný a vaše používateľské meno už viac na tejto wiki neexistuje.",
        "pt-userlogout": "Odhlásiť sa",
        "php-mail-error-unknown": "Neznáma chyba vo funkcii PHP mail()",
        "user-mail-no-addy": "Pokus o odoslanie e-mailu bez e-mailovej adresy.",
-       "user-mail-no-body": "Sa pokúsil poslať email s prázdnym alebo neprimerane krátkym telom správy.",
+       "user-mail-no-body": "Pokus o odoslanie prázdneho alebo neprimerane krátkeho e-mailu.",
        "changepassword": "Zmeniť heslo",
        "resetpass_announce": "Pre dokončenie prihlásenia je potrebné nastaviť nové heslo.",
        "resetpass_text": "<!-- Sem pridajte text -->",
        "resetpass-validity-soft": "Vaše heslo je neplatné: $1\n\nVyberte si nové heslo, alebo kliknite na „{{int:authprovider-resetpass-skip-label}}“ a nastavte si ho neskôr.",
        "passwordreset": "Reset hesla",
        "passwordreset-text-one": "Pre získanie nového hesla vyplňte tento formulár.",
-       "passwordreset-text-many": "{{PLURAL:$1|Pre získanie nového hesla emailom, zadajte jeden z údajov.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Pre získanie nového hesla e-mailom, zadajte jeden z údajov.}}",
        "passwordreset-disabled": "Obnovenie hesla bolo na tejto wiki zakázané.",
        "passwordreset-emaildisabled": "E-mailové funkcie boli na tejto wiki vypnuté.",
        "passwordreset-username": "Používateľské meno:",
        "passwordreset-domain": "Doména:",
-       "passwordreset-email": "Emailová adresa:",
+       "passwordreset-email": "E-mailová adresa:",
        "passwordreset-emailtitle": "Podrobnosti o účte na {{GRAMMAR:lokál|{{SITENAME}}}}",
-       "passwordreset-emailtext-ip": "Niekto (pravdepodobne vy z IP adresy $1) požiadal o obnovenie vášho hesla na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský účet je spojený|Nasledujúce používateľské účty sú spojené}}\ns touto emailovou adresou:\n\n$2\n\n{{PLURAL:$3|Platnosť tohto dočasného hesla vyprší|Platnosť týchto dočasných hesiel vyprší}} o {{PLURAL:$5|jeden deň|$5 dni|$5 dní}}.\nMali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo\nak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu\nignorovať a ďalej používať vaše staré heslo.",
-       "passwordreset-emailtext-user": "Používateľ $1 na {{GRAMMAR:genitív|{{SITENAME}}}} požiadal o obnovenie vášho hesla na na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský účet je spojený|Nasledujúce používateľské účty sú spojené}}\ns touto emailovou adresou:\n\n$2\n\n{{PLURAL:$3|Platnosť tohto dočasného hesla vyprší|Platnosť týchto dočasných hesiel vyprší}} o {{PLURAL:$5|jeden deň|$5 dni|$5 dní}}.\nMali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo\nak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu\nignorovať a ďalej používať vaše staré heslo.",
+       "passwordreset-emailtext-ip": "Niekto (pravdepodobne vy z IP adresy $1) požiadal o obnovenie vášho hesla na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský účet je spojený|Nasledujúce používateľské účty sú spojené}}\ns touto e-mailovou adresou:\n\n$2\n\n{{PLURAL:$3|Platnosť tohto dočasného hesla vyprší|Platnosť týchto dočasných hesiel vyprší}} o {{PLURAL:$5|jeden deň|$5 dni|$5 dní}}.\nMali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo\nak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu\nignorovať a ďalej používať vaše staré heslo.",
+       "passwordreset-emailtext-user": "Používateľ $1 na {{GRAMMAR:genitív|{{SITENAME}}}} požiadal o obnovenie vášho hesla na na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský účet je spojený|Nasledujúce používateľské účty sú spojené}}\ns touto e-mailovou adresou:\n\n$2\n\n{{PLURAL:$3|Platnosť tohto dočasného hesla vyprší|Platnosť týchto dočasných hesiel vyprší}} o {{PLURAL:$5|jeden deň|$5 dni|$5 dní}}.\nMali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo\nak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu\nignorovať a ďalej používať vaše staré heslo.",
        "passwordreset-emailelement": "Používateľské meno: \n$1\n\nDočasné heslo:\n$2",
        "passwordreset-emailsentemail": "Pokiaľ je toto e-mailová adresa zaregistrovaná k vášmu účtu, bude na ňu zaslaný e-mail pre získanie nového hesla.",
        "passwordreset-emailsentusername": "Pokiaľ je príslušná mailová adresa zaregistrovaná, bude na ňu zaslaný e-mail s novým heslom.",
+       "passwordreset-nocaller": "Musí byť uvedený volajúci",
+       "passwordreset-nosuchcaller": "Volajúci neexistuje: $1",
+       "passwordreset-ignored": "Žiadosť o nové heslo nebola spracovaná. Možno nie je nakonfigurovaný žiaden poskytovateľ?",
+       "passwordreset-invalidemail": "Neplatná e-mailová adresa",
+       "passwordreset-nodata": "Nebolo zadané používateľské meno ani e-mailová adresa",
        "changeemail": "Zmeniť alebo odstrániť e-mailovú adresu",
-       "changeemail-header": "Vyplňte tento formulár, ak chcete zmeniť svoju emailovú adresu. Ak chcete odstrániť priradenie akejkoľvek emailovej adresy k vášmu účtu, nechajte pri odosielaní formulára emailovú adresu nevyplnenú",
+       "changeemail-header": "Vyplňte tento formulár, ak chcete zmeniť svoju e-mailovú adresu. Ak chcete odstrániť priradenie akejkoľvek e-mailovej adresy k vášmu účtu, nechajte pri odosielaní formulára e-mailovú adresu nevyplnenú",
        "changeemail-no-info": "Na prístup k tejto stránke musíte byť prihlásený.",
        "changeemail-oldemail": "Súčasná e-mailová adresa:",
        "changeemail-newemail": "Nová e-mailová adresa:",
        "preview": "Náhľad",
        "showpreview": "Zobraziť náhľad",
        "showdiff": "Zobraziť rozdiely",
-       "blankarticle": "<strong>Upozornenie:</strong> Stránka, ktorú sa chystáte založiť, je prázdna. Pokiaľ ešte raz kliknete na „{{int:savearticle}}“, bude založená úplne bez obsahu.",
+       "blankarticle": "<strong>Upozornenie:</strong> Stránka, ktorú sa chystáte založiť, je prázdna. Pokiaľ ešte raz kliknete na „$1“, bude založená úplne bez obsahu.",
        "anoneditwarning": "<strong>Upozornenie:</strong> Nie ste prihlásený.\nAk uložíte akúkoľvek úpravu vaša IP adresa bude zverejnená v histórii tejto stránky. Ak sa <strong>[$1 prihlásite]</strong> alebo si <strong>[$2 vytvoríte účet]</strong>, budú vaše úpravy priradené k vášmu používateľskému menu a získate i ďalšie výhody.",
        "anonpreviewwarning": "''Nie ste prihlásený. Uložením zaznamenáte svoju IP adresu do histórie úprav tejto stránky.''",
        "missingsummary": "'''Pripomienka:''' Neposkytli ste zhrnutie úprav. Ak kliknete znova na Uložiť, vaše úpravy sa uložia bez zhrnutia úprav.",
-       "selfredirect": "<strong>Upozornenie:</strong> Snažíte sa túto stránku presmerovať samú na seba.\nMožno ste zadali chybný cieľ presmerovania, alebo editujete nesprávnu stránku.\nAk znova kliknete na „{{int:savearticle}}“, bude presmerovanie aj napriek tomu vytvorené.",
+       "selfredirect": "<strong>Upozornenie:</strong> Snažíte sa túto stránku presmerovať samú na seba.\nMožno ste zadali chybný cieľ presmerovania, alebo editujete nesprávnu stránku.\nAk znova kliknete na „$1“, bude presmerovanie aj napriek tomu vytvorené.",
        "missingcommenttext": "Prosím, dolu napíšte komentár.",
-       "missingcommentheader": "<strong>Pripomienka:</strong> Neposkytli ste predmet/hlavičku tohto komentára.\nAk znova kliknete na tlačidlo „{{int:savearticle}}“, vaša úprava sa uloží bez nej.",
+       "missingcommentheader": "<strong>Pripomienka:</strong> Neposkytli ste predmet/hlavičku tohto komentára.\nAk znova kliknete na tlačidlo „$1“, vaša úprava sa uloží bez nej.",
        "summary-preview": "Náhľad zhrnutia:",
        "subject-preview": "Náhľad predmetu:",
        "previewerrortext": "Pri pokuse o zobrazenie náhľadu došlo k chybe.",
        "blockedtitle": "Používateľ je zablokovaný",
        "blockedtext": "'''Vaše používateľské meno alebo IP adresa bola zablokovaná.'''\n\nZablokoval vás správca $1. Udáva tento dôvod:<br />''$2''\n\n* Blokovanie začalo: $8\n* Blokovanie vyprší: $6\n* Kto mal byť zablokovaný: $7\n\nMôžete kontaktovať $1 alebo s jedného z ďalších [[{{MediaWiki:Grouppage-sysop}}|správcov]] a prediskutovať blokovanie.\nUvedomte si, že nemôžete použiť funkciu „{{int:Emailuser}}“, pokiaľ nemáte registrovanú platnú e-mailovú adresu vo svojich [[Special:Preferences|nastaveniach]].\nVaša IP adresa je $3 a ID blokovania je #$5.\nProsím, uveďte oba tieto údaje do každej správy, ktorú posielate.",
-       "autoblockedtext": "Vaša IP adresa bola automaticky zablokovaná, pretože ju používa iný používateľ, ktorého zablokoval $1.\nUdaný dôvod zablokovania:\n\n:''$2''\n\n* Blokovanie začalo: $8\n* Blokovanie vyprší: $6\n* Blokovanie sa týka: $7\n\nAk potrebujete informácie o blokovaní, môžete kontaktovať $1 alebo niektorého iného\n[[{{MediaWiki:Grouppage-sysop}}|správcu]].\n\nPozn.: Nemôžete použiť funkciu „{{int:emailuser}}“, ak ste si vo svojich\n[[Special:Preferences|používateľských nastaveniach]] nezaregistrovali platnú emailovú adresu.\n\nVaša aktuálna IP adresa je $3. ID vášho blokovania je $5.\nProsím, uveďte tieto podrobnosti v akýchkoľvek otázkach, ktoré sa opýtate.",
+       "autoblockedtext": "Vaša IP adresa bola automaticky zablokovaná, pretože ju používa iný používateľ, ktorého zablokoval $1.\nUdaný dôvod zablokovania:\n\n:''$2''\n\n* Blokovanie začalo: $8\n* Blokovanie vyprší: $6\n* Blokovanie sa týka: $7\n\nAk potrebujete informácie o blokovaní, môžete kontaktovať $1 alebo niektorého iného\n[[{{MediaWiki:Grouppage-sysop}}|správcu]].\n\nPozn.: Nemôžete použiť funkciu „{{int:emailuser}}“, ak ste si vo svojich\n[[Special:Preferences|používateľských nastaveniach]] nezaregistrovali platnú e-mailovú adresu.\n\nVaša aktuálna IP adresa je $3. ID vášho blokovania je $5.\nProsím, uveďte tieto podrobnosti v akýchkoľvek otázkach, ktoré sa opýtate.",
+       "systemblockedtext": "Vaša IP adresa bola automaticky zablokovaná.\nUdaný dôvod zablokovania:\n\n:<em>$2</em>\n\n* Blokovanie začalo: $8\n* Blokovanie vyprší: $6\n* Blokovanie sa týka: $7\n\nVaša aktuálna IP adresa je $3.\nProsím, uveďte tieto podrobnosti v akýchkoľvek otázkach, ktoré sa opýtate.",
        "blockednoreason": "nebol uvedený dôvod",
        "whitelistedittext": "Aby ste mohli upravovať stránky, musíte sa $1",
-       "confirmedittext": "Pred úpravami stránok musíte potvrdiť vašu emailovú adresu. Prosím, nastavte a overte svoju emailovú adresu v [[Special:Preferences|používateľských nastaveniach]].",
+       "confirmedittext": "Pred úpravami stránok musíte potvrdiť vašu e-mailovú adresu. Prosím, nastavte a overte svoju e-mailovú adresu v [[Special:Preferences|používateľských nastaveniach]].",
        "nosuchsectiontitle": "Sekcia nebola nájdená",
        "nosuchsectiontext": "Pokúšali ste sa upravovať sekciu, ktorá neexistuje.\nMožno bola presunutá alebo zmazaná odkedy ste si stránku zobrazili.",
        "loginreqtitle": "Je potrebné prihlásiť sa",
        "accmailtitle": "Heslo bolo odoslané.",
        "accmailtext": "Náhodne vytvorené heslo pre používateľa [[User talk:$1|$1]] bolo poslané na $2. Je možné ho zmeniť na stránke ''[[Special:ChangePassword|zmena hesla]]'' po prihlásení.",
        "newarticle": "(Nový)",
-       "newarticletext": "Sledovali ste odkaz na stránku, ktorá zatiaľ neexistuje.\nStránku vytvoríte tak, že začnete písať do poľa nižšie (viac informácií nájdete na stránkach [$1 nápovedy]).\nAk ste sa sem dostali nechtiac, kliknite na tlačidlo <strong>späť</strong> vo svojom prehliadači.",
+       "newarticletext": "Nasledovali ste odkaz, vedúci na stránku, ktorá zatiaľ neexistuje.\nStránku vytvoríte tak, že začnete písať do políčka nižšie (viac informácií nájdete na stránkach [$1 nápovedy]).\nAk ste sa sem dostali nechtiac, kliknite na tlačidlo <strong>späť</strong> vo svojom prehliadači.",
        "anontalkpagetext": "----\n<em>Toto je diskusná stránka anonymného používateľa, ktorý nemá vytvorené svoje konto alebo ho nepoužíva.</em>\nPreto musíme na jeho identifikáciu použiť numerickú IP adresu. Je možné, že takúto IP adresu používajú viacerí používatelia.\nAk ste anonymný používateľ a máte pocit, že vám boli adresované irelevantné diskusné príspevky, [[Special:CreateAccount|vytvorte si konto]] alebo sa [[Special:UserLogin|prihláste]], aby sa zamedzilo budúcim zámenám s inými anonymnými používateľmi.",
        "noarticletext": "Na tejto stránke sa momentálne nenachádza žiadny text.\nMôžete [[Special:Search/{{PAGENAME}}|vyhľadávať názov tejto stránky]] v obsahu iných stránok,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vyhľadávať v súvisiacich záznamoch] alebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} vytvoriť túto stránku]</span>.",
        "noarticletext-nopermission": "Táto stránka momentálne neobsahuje žiadny text.\nMôžete [[Special:Search/{{PAGENAME}}|hľadať názov tejto stránky]] v texte iných stránok\nalebo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hľadať v súvisiacich záznamoch]</span>, ale nemáte oprávnenie túto stránku vytvoriť.",
        "editingsection": "Úprava stránky $1 (sekcia)",
        "editingcomment": "Úprava stránky $1 (nová sekcia)",
        "editconflict": "Konflikt pri úprave: $1",
-       "explainconflict": "Niekto iný zmenil túto stránku, zatiaľ čo ste ju upravovali vy.\nHorné okno na úpravy obsahuje text stránky tak, ako je momentálne platný.\nVaše úpravy sú uvedené v dolnom okne na úpravy.\nBudete musieť zlúčiť vaše zmeny s existujúcim textom.\n'''Iba''' obsah horného okna sa uloží, keď stlačíte „{{int:savearticle}}“.",
+       "explainconflict": "Niekto iný zmenil túto stránku, zatiaľ čo ste ju upravovali vy.\nHorné okno na úpravy obsahuje text stránky tak, ako je momentálne platný.\nVaše úpravy sú uvedené v dolnom okne na úpravy.\nBudete musieť zlúčiť vaše zmeny s existujúcim textom.\n'''Iba''' obsah horného okna sa uloží, keď stlačíte „$1“.",
        "yourtext": "Váš text",
        "storedversion": "Uložená verzia",
        "nonunicodebrowser": "<strong>UPOZORNENIE: Váš prehliadač nepodporuje Unicode.</strong>\nDočasným riešením ako bezpečne upravovať stránky je, že ne-ASCII znaky sa v upravovacom textovom poli zobrazia ako zodpovedajúce hexadecimálne hodnoty.",
        "rev-deleted-comment": "(zhrnutie úprav odstránené)",
        "rev-deleted-user": "(používateľské meno odstránené)",
        "rev-deleted-event": "(činnosť odstránená zo záznamu)",
-       "rev-deleted-user-contribs": "[používateľské meno alebo IP adresa odstránená - úprava skrytá pred prispievateľmi]",
+       "rev-deleted-user-contribs": "[používateľské meno alebo IP adresa odstránené â\80\93 úprava skrytá pred prispievateľmi]",
        "rev-deleted-text-permission": "Táto revízia stránky bola '''zmazaná'''.\nPodrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zázname mazaní].",
        "rev-suppressed-text-permission": "Táto revízia stránky bola <strong>potlačená</strong>. Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zázname potlačení].",
        "rev-deleted-text-unhide": "Táto revízia stránky bola <strong>zmazaná</strong>.\nPodrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zázname mazaní].\nAko správca máte stále možnosť [$1 zobraziť túto revíziu] ak chcete.",
        "search-interwiki-caption": "Sesterské projekty",
        "search-interwiki-default": "Výsledky z $1:",
        "search-interwiki-more": "(viac)",
+       "search-interwiki-more-results": "ďalšie výsledky",
        "search-relatedarticle": "Súvisiace",
        "searchrelated": "súvisiace",
        "searchall": "všetko",
        "powersearch-remember": "Zapamätať si výber pre budúce vyhľadávania",
        "search-external": "Externé vyhľadávanie",
        "searchdisabled": "Prepáčte! Fulltextové vyhľadávanie bolo dočasne vypnuté z dôvodu preťaženia. Zatiaľ môžete použiť hľadanie pomocou Google, ktoré však nemusí byť aktuálne.",
-       "search-error": "Pri hľadaní sa vyskytla chyba:$1",
+       "search-error": "Pri hľadaní došlo k chybe: $1",
+       "search-warning": "Pri hľadaní došlo k varovaniu: $1",
        "preferences": "Nastavenia",
        "mypreferences": "Nastavenia",
        "prefs-edits": "Počet úprav:",
        "prefs-misc": "Rôzne",
        "prefs-resetpass": "Zmeniť heslo",
        "prefs-changeemail": "Zmeniť alebo odstrániť e-mailovú adresu",
-       "prefs-setemail": "Nastaviť emailovú adresu",
+       "prefs-setemail": "Nastaviť e-mailovú adresu",
        "prefs-email": "Možnosti e-mailu",
        "prefs-rendering": "Vzhľad",
        "saveprefs": "Uložiť nastavenia",
        "restoreprefs": "Obnoviť všetky predvolené nastavenia (vo všetkých sekciách)",
        "prefs-editing": "Úpravy",
-       "rows": "Riadky:",
-       "columns": "Stĺpce:",
        "searchresultshead": "Vyhľadávanie",
        "stub-threshold": "Prah formátovania odkazu ako výhonok ($1):",
        "stub-threshold-sample-link": "príklad",
        "timezoneregion-indian": "Indický oceán",
        "timezoneregion-pacific": "Tichý oceán",
        "allowemail": "Povoliť prijímanie e-mailov od iných používateľov",
-       "prefs-searchoptions": "Hľadanie",
+       "prefs-searchoptions": "Vyhľadávanie",
        "prefs-namespaces": "Menné priestory",
        "default": "predvolený",
        "prefs-files": "Súbory",
        "prefs-custom-js": "Vlastný JS",
        "prefs-common-css-js": "Spoločné CSS/JS pre všetky témy:",
        "prefs-reset-intro": "Túto stránku môžete použiť na vrátenie predvolených hodnôt vašich nastavení.\nTúto operáciu nemožno vrátiť.",
-       "prefs-emailconfirm-label": "Overenie e-emailu:",
+       "prefs-emailconfirm-label": "Overenie e-mailu:",
        "youremail": "Váš e-mail²",
        "username": "{{GENDER:$1|Používateľské meno}}:",
        "prefs-memberingroups": "{{GENDER:$2|Člen|Členovia}} {{PLURAL:$1|skupiny|skupín}}:",
+       "group-membership-link-with-expiry": "$1 (do $2)",
        "prefs-registration": "Čas registrácie:",
        "yourrealname": "Skutočné meno *:",
        "yourlanguage": "Jazyk:",
        "userrights-user-editname": "Zadajte meno používateľa:",
        "editusergroup": "Upraviť skupiny {{GENDER:$1|používateľa|používateľky}}",
        "editinguser": "Zmena práv používateľa '''[[User:$1|$1]]''' $2",
+       "viewinguserrights": "Prehliadanie práv {{GENDER:$1|používateľa|používateľky}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Upraviť skupiny používateľa",
+       "userrights-viewusergroup": "Zobraziť {{GENDER:$1|používateľské}} skupiny",
        "saveusergroups": "Uložiť skupiny {{GENDER:$1|používateľa|používateľky}}",
        "userrights-groupsmember": "{{GENDER:$2|Člen|Členka}} {{PLURAL:$1|skupiny|skupín}}:",
        "userrights-groupsmember-auto": "Implicitne {{GENDER:$2|člen|členka}} {{PLURAL:$1|skupiny|skupín}}:",
        "userrights-conflict": "Konflikt zmien práv používateľov! Prosím, skontrolujte ho a potvrďte svoje zmeny.",
        "group": "Skupina:",
        "group-user": "Používatelia",
-       "group-autoconfirmed": "zaregistrovaní používatelia",
+       "group-autoconfirmed": "Automaticky schválení používatelia",
        "group-bot": "Boti",
        "group-sysop": "Správcovia",
        "group-bureaucrat": "Byrokrati",
        "group-bureaucrat-member": "{{GENDER:$1|byrokrat|byrokratka|byrokrat}}",
        "group-suppress-member": "{{GENDER:$1|dozorca|dozorkyňa|dozorca}}",
        "grouppage-user": "{{ns:project}}:Používatelia",
-       "grouppage-autoconfirmed": "{{ns:project}}:Zaregistrovaní používatelia",
+       "grouppage-autoconfirmed": "{{ns:project}}:Automaticky schválení používatelia",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:Správcovia",
        "grouppage-bureaucrat": "{{ns:project}}:Byrokrati",
        "right-reupload-shared": "Nahrávať lokálne súbory, ktoré majú prednosť pred zdieľaným úložiskom",
        "right-upload_by_url": "Nahrávať súbor z URL adresy",
        "right-purge": "Čistiť vyrovnávaciu pamäť stránky bez potvrdzovacej stránky",
-       "right-autoconfirmed": "Neovplyvnený obmedzeniami na základe IP adresy",
+       "right-autoconfirmed": "Neovplyvnený rýchlostnými limitmi na základe IP adresy",
        "right-bot": "Byť považovaný za automatický proces",
        "right-nominornewtalk": "Pri drobných úpravách diskusnej stránky nevypisovať hlásenie o nových správach",
        "right-apihighlimits": "Používať vyššie limity v požiadavkách API",
        "right-viewsuppressed": "Zobrazovať revízie skryté pred všetkými používateľmi",
        "right-suppressionlog": "Zobrazovať súkromné záznamy",
        "right-block": "Blokovať ostatných používateľov",
-       "right-blockemail": "Zablokovať používateľovi posielanie emailu",
+       "right-blockemail": "Zablokovať používateľovi posielanie e-mailu",
        "right-hideuser": "Zablokovať používateľské meno tak, že bude verejnosti skryté",
        "right-ipblock-exempt": "Obchádzať blokovanie IP adries, rozsahov a automatické blokovanie",
        "right-unblockself": "Odblokovať seba samého",
        "right-editsemiprotected": "Upravovať stránky zamknuté ako „{{int:protect-level-autoconfirmed}}“",
        "right-editcontentmodel": "Upravovať model obsahu stránky",
        "right-editinterface": "Upravovať správy používateľského rozhrania",
-       "right-editusercssjs": "Upravovať CSS a JS súbory ostatných používateľov",
        "right-editusercss": "Upravovať CSS súbory ostatných používateľov",
        "right-edituserjs": "Upravovať JS súbory ostatných používateľov",
        "right-editmyusercss": "Upraviť svoje vlastné používateľské súbory CSS",
        "grant-group-page-interaction": "Interagovať so stránkami",
        "grant-group-file-interaction": "Interagovať s multimédiami",
        "grant-group-watchlist-interaction": "Interagovať s vašim zoznamom sledovaných stránok",
-       "grant-group-email": "Poslať email",
+       "grant-group-email": "Poslať e-mail",
        "grant-group-high-volume": "Vykonávať činnosti vo veľkom objeme",
        "grant-group-customization": "Nastavenie a prispôsobenie",
        "grant-group-administration": "Vykonávať činnosti správcu",
        "grant-privateinfo": "Pristupovať k súkromným informáciám",
        "grant-protect": "Zapínať a vypínať ochranu stránok",
        "grant-rollback": "Vracať zmeny stránok",
-       "grant-sendemail": "Posielať emaily ostatným používateľom",
+       "grant-sendemail": "Posielať e-maily ostatným používateľom",
        "grant-uploadeditmovefile": "Nahrávať, nahradzovať a presúvať súbory",
        "grant-uploadfile": "Nahrávať nové súbory",
        "grant-basic": "Základné oprávnenia",
        "action-writeapi": "použiť API na zápis",
        "action-delete": "zmazať túto stránku",
        "action-deleterevision": "zmazať túto revíziu",
+       "action-deletelogentry": "mazať záznamy",
        "action-deletedhistory": "zobraziť históriu zmazaných revízií tejto stránky",
+       "action-deletedtext": "zobraziť si zmazané texty revízií",
        "action-browsearchive": "vyhľadávať zmazané stránky",
        "action-undelete": "obnoviť túto stránku",
        "action-suppressrevision": "skontrolovať a obnoviť túto skrytú revíziu",
        "action-userrights-interwiki": "upravovať práva používateľov na iných wiki",
        "action-siteadmin": "zamykať alebo odomykať databázu",
        "action-sendemail": "posielať e-maily",
+       "action-editmyoptions": "meniť svoje používateľské nastavenia",
        "action-editmywatchlist": "upraviť zoznam sledovaných stránok",
        "action-viewmywatchlist": "zobraziť zoznam sledovaných stránok",
        "action-viewmyprivateinfo": "zobraziť vaše súkromné údaje",
        "rcshowhidecategorization": "$1 kategorizáciu",
        "rcshowhidecategorization-show": "Zobraziť",
        "rcshowhidecategorization-hide": "Skryť",
-       "rclinks": "Zobraziť posledných $1 úprav za posledných $2 dní<br />$3",
+       "rclinks": "Zobraziť posledných $1 úprav za posledných $2 dní",
        "diff": "rozdiel",
        "hist": "história",
        "hide": "Skryť",
        "upload_directory_read_only": "Webový server nemôže zapisovať do adresára pre nahrávanie ($1).",
        "uploaderror": "Chyba pri nahrávaní",
        "upload-recreate-warning": "'''Upozornenie: Súbor s týmto názvom bol zmazaný alebo presunutý.'''\n\nĎalšie informácie si môžete pozrieť v zázname zmazaní a presunutí:",
-       "uploadtext": "Tento formulár použite na nahrávanie súborov.\nUž nahrané súbory môžete zobraziť alebo hľadať v [[Special:FileList|zozname nahraných súborov]]. Nahrávania a mazania sa tiež zaznamenávajú v [[Special:Log/upload|zázname nahrávaní]].\n\nNa začlenenie obrázka do stránky použite odkaz v tvare\n\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Súbor.jpg]]</nowiki>''' - použije sa plná verzia obrázka\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Súbor.png|alternatívny text]]</nowiki>''' - vykreslí sa v šírke 200 pixelov s okrajom, na ľavom okraji, s popisom v „alt” texte.\n* '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Súbor.ogg]]</nowiki>''' - priamy odkaz na súbor (nezobrazí obrázok na stránke)",
+       "uploadtext": "Tento formulár použite na nahrávanie súborov.\nUž nahrané súbory môžete zobraziť alebo hľadať v [[Special:FileList|zozname nahraných súborov]]. Nahrávania a mazania sa tiež zaznamenávajú v [[Special:Log/upload|zázname nahrávaní]].\n\nPre vloženie obrázka do stránky použite odkaz v tvare:\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Súbor.jpg]]</nowiki>''' – vloží sa originál obrázka,\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Súbor.png|náhľad|Popis]]</nowiki>''' – vloží sa zmenšený náhľad s rámikom a popisom,\n* '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Súbor.ogg]]</nowiki>''' – vloží sa odkaz na súbor (bez zobrazenia obrázku na stránke)",
        "upload-permitted": "{{PLURAL:$2|Povolený formát súboru|Povolené typy súborov}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Uprednostňovaný formát súboru|Uprednostňované typy súborov}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Zakázaný formát súboru|Zakázané formáty súborov}}: $1.",
        "trackingcategories-msg": "Sledovacia kategória",
        "trackingcategories-name": "Názov správy",
        "trackingcategories-desc": "Kritériá pre zaradenie do kategórie",
+       "restricted-displaytitle-ignored": "Stránky s ignorovanými zobrazovanými názvami",
        "noindex-category-desc": "Stránka nie je indexovaná robotmi, pretože obsahuje magické slovo <code><nowiki>__NOINDEX__</nowiki></code> a je v mennom priestore, v ktorom je tento príznak povolený.",
        "index-category-desc": "Stránka obsahuje magické slovo <code><nowiki>__INDEX__</nowiki></code> (a je v mennom prostore, v ktorom je tento príznak povolený), takže je indexovaná robotmi, hoci by normálne nebola.",
        "post-expand-template-inclusion-category-desc": "Stránka je po rozbalení všetkých šablón väčšia než <code>$wgMaxArticleSize</code>, takže niektoré šablóny nemohli byť rozbalené.",
        "emailuser-title-target": "E-mail {{GENDER:$1|tomuto používateľovi|tejto používateľke}}",
        "emailuser-title-notarget": "E-mail používateľovi",
        "emailpagetext": "Pomocou nasledovného formulára môžete {{GENDER:$1|tomuto používateľovi|tejto používateľke}} poslať e-mailovú správu.\nMailová adresa, ktorú ste zadali vo svojich [[Special:Preferences|nastaveniach]] sa zobrazí ako adresa odosielateľa mailu, aby vám mohol príjemca priamo odpovedať.",
-       "defemailsubject": "email {{GRAMMAR:genitív|{{SITENAME}}}} od používateľa „$1“",
-       "usermaildisabled": "Používateľ má vypnuté používanie emailu",
-       "usermaildisabledtext": "Nemôžete posielať emaily ostatným používateľom na tejto wiki",
+       "defemailsubject": "e-mail {{GRAMMAR:genitív|{{SITENAME}}}} od používateľa „$1“",
+       "usermaildisabled": "Používateľ má vypnuté používanie e-mailu",
+       "usermaildisabledtext": "Nemôžete posielať e-maily ostatným používateľom na tejto wiki",
        "noemailtitle": "Chýba e-mailová adresa",
        "noemailtext": "Tento používateľ neuviedol svoju platnú e-mailovú adresu.",
-       "nowikiemailtext": "Tento používateľ sa rozhodol, že si neželá prijímať emaily od ostatných používateľov.",
+       "nowikiemailtext": "Tento používateľ sa rozhodol, že si neželá prijímať e-maily od ostatných používateľov.",
        "emailnotarget": "Neexistujúce alebo neplatné používateľské meno príjemcu.",
        "emailtarget": "Zadajte používateľské meno príjemcu",
        "emailusername": "Používateľské meno:",
        "emailusernamesubmit": "Odoslať",
-       "email-legend": "Poslať email používateľovi {{GRAMMAR:genitív|{{SITENAME}}}}",
+       "email-legend": "Poslať e-mail používateľovi {{GRAMMAR:genitív|{{SITENAME}}}}",
        "emailfrom": "Od:",
        "emailto": "Komu:",
        "emailsubject": "Predmet:",
        "emailmessage": "Správa:",
        "emailsend": "Odoslať",
-       "emailccme": "Pošli mi emailom kópiu mojej správy.",
+       "emailccme": "Pošli mi e-mailom kópiu mojej správy.",
        "emailccsubject": "Kópia správy pre $1: $2",
        "emailsent": "E-mail bol odoslaný",
        "emailsenttext": "Vaša e-mailová správa bola odoslaná.",
        "rollbacklinkcount": "vrátenie $1 {{PLURAL:$1|úpravy|úprav}}",
        "rollbacklinkcount-morethan": "vrátiť viac ako $1 {{PLURAL:$1|úpravu|úprav}}",
        "rollbackfailed": "Rollback neúspešný",
+       "rollback-missingparam": "V požiadavke chýbajú povinné parametre.",
+       "rollback-missingrevision": "Nepodarilo sa načítať údaje k revízii.",
        "cantrollback": "Nie je možné úpravu vrátiť späť, posledný autor je jediný autor tejto stránky.",
        "alreadyrolled": "Nemožno vrátiť späť poslednú úpravu [[:$1]] od [[User:$2|$2]] ([[User talk:$2|Diskusia]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); niekto iný buď upravoval stránku alebo už vrátil úpravy späť.\n\nAutorom poslednej úpravy je [[User:$3|$3]] ([[User talk:$3|Diskusia]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Zhrnutie úpravy bolo: <em>$1</em>.",
        "protect-locked-dblock": "Nie je možné zmeniť úroveň ochrany z dôvodu aktívneho zámku databázy.\nTu sú aktuálne nastavenia stránky '''$1''':",
        "protect-locked-access": "Váš účet nemá oprávnenie meniť úroveň ochrany stránky.\nTu sú aktuálne nastavenia stránky '''$1''':",
        "protect-cascadeon": "Táto stránka je momentálne zamknutá, lebo je vložená v {{PLURAL:$1|nasledovnej stránke, ktorá má|nasledovných stránkach, ktoré majú}} zapnutú kaskádovú ochranu. Zmeny úrovne ochrany tejto stránky neovplyvnia kaskádovú ochranu.",
-       "protect-default": "Povoliť všetkých používateľov",
-       "protect-fallback": "Povoliť iba používateľov s oprávnením „$1“",
-       "protect-level-autoconfirmed": "Povoliť iba používateľov s potvrdeným emailom",
-       "protect-level-sysop": "Povoliť iba správcov",
+       "protect-default": "Povoliť všetkým",
+       "protect-fallback": "Povoliť iba používateľom s oprávnením „$1“",
+       "protect-level-autoconfirmed": "Povoliť iba automaticky schváleným používateľom",
+       "protect-level-sysop": "Povoliť iba správcom",
        "protect-summary-cascade": "kaskáda",
        "protect-expiring": "vyprší o $1 (UTC)",
        "protect-expiring-local": "vyprší $1",
        "protect-expiry-indefinite": "na neurčito",
-       "protect-cascade": "Kaskádové zamknutie - chrániť všetky stránky použité na tejto stránke.",
+       "protect-cascade": "Zamknúť aj stránky použité na tejto stránke (kaskádový zámok)",
        "protect-cantedit": "Nemôžete zmeniť úrovne ochrany tejto stránky, pretože nemáte oprávnenie ju upravovať.",
        "protect-othertime": "Iný čas:",
        "protect-othertime-op": "iný čas",
        "undeleteviewlink": "zobraziť",
        "undeleteinvert": "Invertovať výber",
        "undeletecomment": "Dôvod:",
-       "undeletedrevisions": "{{PLURAL:$1|jedna verzia bola obnovená|$1 verzie boli obnovené|$1 verzií bolo obnovených}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Jedna revízia|$1 revízie|$1 revízií}} a {{PLURAL:$2|jeden súbor bol obnovený|$2 súbory boli obnovené|$2 súborov bolo obnovených}}",
-       "undeletedfiles": "{{PLURAL:$1|Jeden súbor bol obnovený|$1 súbory boli obnovené|$1 súborov bolo obnovených}}",
        "cannotundelete": "Časť alebo celé obnovenie sa nepodarilo:\n$1",
        "undeletedpage": "'''$1 bol obnovený'''\n\nZoznam posledných mazaní a obnovení nájdete v [[Special:Log/delete|Zázname mazaní]].",
        "undelete-header": "Pozri nedávno zmazané stránky v [[Special:Log/delete|zázname mazaní]].",
        "blockip": "Zablokovať {{GENDER:$1|používateľa|používateľku}}",
        "blockip-legend": "Zablokovať používateľa",
        "blockiptext": "Tento formulár použite na zablokovanie možnosti zápisu z konkrétnej IP adresy alebo od konkrétneho používateľa.\nMali by ste to urobiť len na zabránenie vandalizmu a v súlade so [[{{MediaWiki:Policy-url}}|zásadami a smernicami {{GRAMMAR:genitív|{{SITENAME}}}}]].\nNižšie uveďte konkrétny dôvod (napríklad uveďte konkrétne stránky, ktoré padli za obeť vandalizmu).\nRozsahy IP adreies môžete blokovať pomocou syntaxe [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; najväčší povolený rozsah je /$1 v prípade IPv4 a /$2 v prípade IPv6.",
-       "ipaddressorusername": "IP adresa/meno používateľa:",
+       "ipaddressorusername": "IP adresa alebo meno používateľa:",
        "ipbexpiry": "Ukončenie:",
        "ipbreason": "Dôvod:",
        "ipbreason-dropdown": "* Bežné dôvody blokovania\n** Zámerné vkladanie chybných informácií\n** Mazanie obsahu stránok\n** Spam odkazy na externé stránky\n** Vkladanie nezmyslov do stránok\n** Zastrašujúce správanie/obťažovanie\n** Zneužívanie viacerých účtov\n** Neprípustné používateľské meno",
        "ipb-hardblock": "Zabrániť prihláseným používateľom upravovať z tejto IP adresy",
        "ipbcreateaccount": "Zabrániť vytváraniu účtov",
-       "ipbemailban": "Zabrániť používateľovi posielať emaily",
+       "ipbemailban": "Zabrániť používateľovi posielať e-maily",
        "ipbenableautoblock": "Automaticky blokovať poslednú IP adresu, ktorú tento používateľ použil, a všetky ďalšie adresy, z ktorých sa pokúsi upravovať.",
        "ipbsubmit": "Zablokovať tohto používateľa",
        "ipbother": "Iný čas",
        "ipb-confirm": "Potvrdiť blokovanie",
        "badipaddress": "IP adresa má nesprávny formát.",
        "blockipsuccesssub": "Zablokovanie bolo úspešné",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] bol zablokovaný.<br />\n[[Special:BlockList|IP block list]] obsahuje zoznam blokovaní.",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] {{GENDER:$1|bol zablokovaný|bola zablokovaná}}.<br />\nPre prehľad blokov pozri [[Special:BlockList|zoznam zablokovaných používateľov]].",
        "ipb-blockingself": "Chystáte sa zablokovať sám seba! Ste si istí, že to chcete urobiť?",
        "ipb-confirmhideuser": "Chystáte sa zablokovať používateľa so zapnutou funkciou „skryť používateľa“. Tým sa potlačí meno používateľa vo všetkých zoznamoch a záznamoch. Ste si istí, že chcete urobiť?",
        "ipb-confirmaction": "Ak ste si {{GENDER:|istý|istá|istí}}, že to chcete urobiť, zaškrtnite prepínač „{{int:ipb-confirm}}“ nižšie.",
        "anononlyblock": "iba anon.",
        "noautoblockblock": "automatické blokovanie vypnuté",
        "createaccountblock": "tvorba účtov bola zablokovaná",
-       "emailblock": "email blokovaný",
+       "emailblock": "e-mail blokovaný",
        "blocklist-nousertalk": "nemôže upravovať svoju diskusnú stránku",
        "ipblocklist-empty": "Zoznam blokovaní je prázdny.",
        "ipblocklist-no-results": "Požadovaná IP adresa alebo používateľské meno nie je blokovaná.",
        "unblocklink": "odblokovať",
        "change-blocklink": "zmeniť blokovanie",
        "contribslink": "príspevky",
-       "emaillink": "poslať email",
+       "emaillink": "poslať e-mail",
        "autoblocker": "Boli ste automaticky zablokovaný, pretože vašu IP adresu nedávno použil „[[User:$1|$1]]“.\nDôvodom zablokovania redaktora $1 bolo „$2“",
        "blocklogpage": "Záznam blokovaní",
        "blocklog-showlog": "Tento používateľ bol v minulosti zablokovaný. Záznam blokovaní uvádza nasledovný dôvod:",
        "block-log-flags-anononly": "iba anonymní používatelia",
        "block-log-flags-nocreate": "možnosť vytvoriť si účet bola vypnutá",
        "block-log-flags-noautoblock": "autoblokovanie vypnuté",
-       "block-log-flags-noemail": "email blokovaný",
+       "block-log-flags-noemail": "e-mail blokovaný",
        "block-log-flags-nousertalk": "nemôže upravovať vlastnú diskusnú stránku",
        "block-log-flags-angry-autoblock": "rozšírené automatické blokovanie zapnuté",
        "block-log-flags-hiddenname": "používateľské meno skryté",
        "proxyblockreason": "Vaša IP adresa bola zablokovaná, pretože je otvorená proxy. Prosím kontaktujte vášho internetového poskytovateľa alebo technickú podporu a informujte ich o tomto vážnom bezpečnostnom probléme.",
        "sorbsreason": "Vaša IP adresa je vedená ako nezabezpečený proxy server v DNSBL.",
        "sorbs_create_account_reason": "Vaša IP adresa je vedená ako nezabezpečený proxy server v databáze DNSBL, ktorú používa {{SITENAME}}. Nemôžete si vytvoriť účet.",
+       "softblockrangesreason": "Anonymné príspevky z vašej IP adresy ($1) nie sú povolené. Prosím prihláste sa.",
        "xffblockreason": "IP adresa prítomná v hlavičke X-Forwarded-For patriaca buď vám alebo proxy serveru, ktorý používate, je zablokovaná. Pôvodný dôvod zablokovania bol: $1",
        "cant-see-hidden-user": "Používateľ, ktorého sa pokúšate zablokovať už bol zablokovaný a skrytý. Pretože nemáte právo hideuser, nemôžete vidieť ani upravovať blokovanie používateľa.",
        "ipbblocked": "Nemôžete zablokovať ani odblokovať iných používateľov, pretože ste sami zablokovaní",
        "cant-move-to-user-page": "Nemáte oprávnenie presunúť stránku na stránku používateľa (iba na podstránku používateľa).",
        "cant-move-category-page": "Nemáte oprávnenie presúvať stránky kategórií.",
        "cant-move-to-category-page": "Nemáte oprávnenie presunúť stránku na stránku kategórie.",
+       "cant-move-subpages": "Nemáte oprávnenie presúvať podstránky.",
+       "namespace-nosubpages": "V mennom priestore „$1“ nie sú podstránky povolené.",
        "newtitle": "Nový názov:",
        "move-watch": "Sledovať túto stránku",
        "movepagebtn": "Presunúť stránku",
        "pageinfo-length": "Dĺžka stránky (v bajtoch)",
        "pageinfo-article-id": "ID stránky",
        "pageinfo-language": "Jazyk obsahu stránky",
+       "pageinfo-language-change": "zmeniť",
        "pageinfo-content-model": "Model obsahu stránky",
        "pageinfo-content-model-change": "zmeniť",
        "pageinfo-robot-policy": "Indexovanie robotmi",
        "newimages-legend": "Filter",
        "newimages-label": "Názov súboru (alebo jeho časť):",
        "newimages-showbots": "Zobraziť súbory nahrané botmi",
+       "newimages-hidepatrolled": "Skryť preverené nahratia súborov",
        "noimages": "Niet čo zobraziť.",
+       "gallery-slideshow-toggle": "Prepnúť náhľady",
        "ilsubmit": "Hľadať",
        "bydate": "podľa dátumu",
        "sp-newimages-showfrom": "Zobraziť nové súbory počínajúc $2, $1",
        "namespacesall": "všetky",
        "monthsall": "všetky",
        "confirmemail": "Potvrdiť e-mailovú adresu",
-       "confirmemail_noemail": "Nenastavili ste platnú emailovú adresu vo svojich [[Special:Preferences|Nastaveniach]].",
+       "confirmemail_noemail": "Nenastavili ste platnú e-mailovú adresu vo svojich [[Special:Preferences|Nastaveniach]].",
        "confirmemail_text": "{{SITENAME}} vyžaduje, aby ste potvrdili platnosť vašej e-mailovej adresy\npred používaním e-mailových funkcií. Kliknite na tlačidlo dole, aby sa na vašu adresu odoslal potvrdzovací\ne-mail. V e-maili bude aj odkaz obsahujúci kód; otvorte odkaz\nvo vašom prehliadači, čím potvrdíte, že vaša e-mailová adresa je platná.",
-       "confirmemail_pending": "Potvrdzovací kód vám už bol zaslaný; ak ste si účet vytvorili len nedávno\nmali by ste počkať niekoľko minút, kým vám bude email doručený, predtým\nnež si vyžiadate nový kód.",
+       "confirmemail_pending": "Potvrdzovací kód vám už bol zaslaný; ak ste si účet vytvorili len nedávno\nmali by ste počkať niekoľko minút, kým vám bude e-mail doručený, predtým\nnež si vyžiadate nový kód.",
        "confirmemail_send": "Odoslať potvrdzovací kód",
        "confirmemail_sent": "Potvrdzovací e-mail odoslaný.",
-       "confirmemail_oncreate": "Na vašu emailovú adresu bol odoslaný potvrdzovací kód.\nTento kód nie je potrebný na prihlásenie, ale budete ho musieť poskytnúť pred\nzapnutím vlastností wiki využívajcich email.",
-       "confirmemail_sendfailed": "Z {{GRAMMAR:genitív|{{SITENAME}}}} nebolo možné odoslať potvrdzovací e-mail.\nSkontrolujte neplatné znaky vo vašej emailovej adrese.\n\nHlásenie programu, ktorý odosielal poštu: $1",
+       "confirmemail_oncreate": "Na vašu e-mailovú adresu bol odoslaný potvrdzovací kód.\nTento kód nie je potrebný na prihlásenie, ale budete ho musieť poskytnúť pred\nzapnutím vlastností wiki využívajcich e-mail.",
+       "confirmemail_sendfailed": "Z {{GRAMMAR:genitív|{{SITENAME}}}} nebolo možné odoslať potvrdzovací e-mail.\nSkontrolujte neplatné znaky vo vašej e-mailovej adrese.\n\nHlásenie programu, ktorý odosielal poštu: $1",
        "confirmemail_invalid": "Neplatný potvrdzovací kód. Kód možno vypršal.",
-       "confirmemail_needlogin": "Musíte sa $1 na potvrdenie vašej emailovaj adresy.",
+       "confirmemail_needlogin": "Musíte sa $1 na potvrdenie vašej e-mailovaj adresy.",
        "confirmemail_success": "Vaša e-mailová adresa bola potvrdená. Môžete sa prihlásiť a využívať wiki.",
        "confirmemail_loggedin": "Vaša e-mailová adresa bola potvrdená.",
-       "confirmemail_subject": "{{SITENAME}} - potvrdenie e-mailovej adresy",
-       "confirmemail_body": "Niekto, pravdepodobne vy z IP adresy $1, zaregistroval účet\n„$2“ s touto e-mailovou adresou na {{GRAMMAR:lokál|{{SITENAME}}}}.\n\nPre potvrdenie, že tento účet skutočne patrí vám a pre aktivovanie\ne-mailových funkcií na {{GRAMMAR:lokál|{{SITENAME}}}}, otvorte tento odkaz vo vašom prehliadači:\n\n$3\n\nAk ste to *neboli* vy, otvorte tento odkaz,\nčím zrušíte potvrdenie emailovej adresy:\n\n$5\n\nTento potvrdzovací kód vyprší $4.",
+       "confirmemail_subject": "{{SITENAME}}  potvrdenie e-mailovej adresy",
+       "confirmemail_body": "Niekto, pravdepodobne vy z IP adresy $1, zaregistroval účet\n„$2“ s touto e-mailovou adresou na {{GRAMMAR:lokál|{{SITENAME}}}}.\n\nPre potvrdenie, že tento účet skutočne patrí vám a pre aktivovanie\ne-mailových funkcií na {{GRAMMAR:lokál|{{SITENAME}}}}, otvorte tento odkaz vo vašom prehliadači:\n\n$3\n\nAk ste to *neboli* vy, otvorte tento odkaz,\nčím zrušíte potvrdenie e-mailovej adresy:\n\n$5\n\nTento potvrdzovací kód vyprší $4.",
        "confirmemail_body_changed": "Niekto, pravdepodobne vy, z IP adresy $1,\nzmenil e-mailovú adresu účtu „$2“ na túto adresu na {{GRAMMAR:lokál|{{SITENAME}}}}.\n\nAby ste potvrdili, že tento účet skutočne patrí vám a znova\naktivovali funkcie emailu na{{GRAMMAR:lokál|{{SITENAME}}}},\notvorte nasledovný odkaz v prehliadači:\n\n$3\n\nAk vám účet *nepatrí*, otvorte namiesto toho tento odkaz,\nktorý zruší potvrdenie emailovej adresy:\n\n$5\n\nPlatnosť tohoto potvrdzovacieho kódu vyprší $4.",
        "confirmemail_body_set": "Niekto, pravdepodobne vy, z IP adresy $1\nnastavil e-mailovú adresu účtu „$2“ na túto adresu na {{GRAMMAR:genitív|{{SITENAME}}}}.\n\nAk chcete potvrdiť, že tento účet skutočne patrí vám a aktivovať\ne-mailové funkcie na {{GRAMMAR:genitív|{{SITENAME}}}}, otvorte tento odkaz vo vašom prehliadači:\n\n$3\n\nAk účet nie je *nepatrí* patrí k vám, nasledujte tento odkaz,\nktorý zruší potvrdenie e-mailovej adresy:\n\n$5\n\nPlatnosť tohto potvrdzovacieho kódu vyprší $4.",
-       "confirmemail_invalidated": "Potvrdenie emailovej adresy bolo zrušené",
-       "invalidateemail": "Zrušiť potvrdenie emailovej adresy",
-       "notificationemail_subject_changed": "Email zaregistrovaný na {{GRAMMAR:lokál|{{SITENAME}}}} bol zmenený",
-       "notificationemail_subject_removed": "Email zaregistrovaný na {{GRAMMAR:lokál|{{SITENAME}}}} bol odstránený",
-       "notificationemail_body_changed": "Niekoho, pravdepodobne vy, z IP adresy $1, zmenil na {{GRAMMAR:lokál|{{SITENAME}}}} emailovú adresu účtu „$2“ na „$3“.\n\nAk ste to neboli vy, čo najskôr sa obráťte na správcu {{GRAMMAR:akuzatív|{{SITENAME}}}}.",
-       "notificationemail_body_removed": "Niekoho, pravdepodobne vy, z IP adresy $1, odstránil na {{GRAMMAR:lokál|{{SITENAME}}}} emailovú adresu účtu „$2“.\n\nAk ste to neboli vy, čo najskôr sa obráťte na správcu {{GRAMMAR:akuzatív|{{SITENAME}}}}.",
+       "confirmemail_invalidated": "Potvrdenie e-mailovej adresy bolo zrušené",
+       "invalidateemail": "Zrušiť potvrdenie e-mailovej adresy",
+       "notificationemail_subject_changed": "E-mail zaregistrovaný na {{GRAMMAR:lokál|{{SITENAME}}}} bol zmenený",
+       "notificationemail_subject_removed": "E-mail zaregistrovaný na {{GRAMMAR:lokál|{{SITENAME}}}} bol odstránený",
+       "notificationemail_body_changed": "Niekoho, pravdepodobne vy, z IP adresy $1, zmenil na {{GRAMMAR:lokál|{{SITENAME}}}} e-mailovú adresu účtu „$2“ na „$3“.\n\nAk ste to neboli vy, čo najskôr sa obráťte na správcu {{GRAMMAR:akuzatív|{{SITENAME}}}}.",
+       "notificationemail_body_removed": "Niekoho, pravdepodobne vy, z IP adresy $1, odstránil na {{GRAMMAR:lokál|{{SITENAME}}}} e-mailovú adresu účtu „$2“.\n\nAk ste to neboli vy, čo najskôr sa obráťte na správcu {{GRAMMAR:akuzatív|{{SITENAME}}}}.",
        "scarytranscludedisabled": "[Transklúzia interwiki je vypnutá]",
        "scarytranscludefailed": "[Nepodarilo sa priniesť šablónu pre $1]",
        "scarytranscludefailed-httpstatus": "[Stiahnutie šablóny zlyhalo pre $1: HTTP $2]",
        "version-ext-colheader-credits": "Autori",
        "version-license-title": "Licencia pre $1",
        "version-license-not-found": "Nenašli sa žiadne podrobné licenčné informácie k tomuto rozšíreniu.",
+       "version-credits-title": "Autori $1",
+       "version-credits-not-found": "Pre toto rozšírenie neboly nájdené podrobnejšie informácie o autoroch.",
        "version-poweredby-credits": "Táto wiki beží na '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "ďalší",
        "version-poweredby-translators": "prekladatelia na translatewiki.net",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "RRRR-MM-DD HH:MM:SS",
        "logentry-delete-delete": "$1 zmazal stránku $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|zmazal|zmazala}} presunom presmerovanie $3",
        "logentry-delete-restore": "$1 obnovil stránku $3",
        "logentry-delete-event": "$1 zmenil viditeľnosť {{PLURAL:$5|záznamu udalostí|$5 záznamov udalostí}} k stránke $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|zmenil|zmenila}} viditeľnosť {{PLURAL:$5|revízie|$5 revízií}} na stránke $3: $4",
        "logentry-newusers-newusers": "Bol {{GENDER:$2|vytvorený}} používateľský účet $1",
        "logentry-newusers-create": "Bol vytvorený používateľský účet $1",
        "logentry-newusers-create2": "$1 vytvoril používateľský účet $3",
-       "logentry-newusers-byemail": "$1 vytvoril používateľský účet $3 a heslo bolo poslané emailom",
+       "logentry-newusers-byemail": "$1 vytvoril používateľský účet $3 a heslo bolo poslané e-mailom",
        "logentry-newusers-autocreate": "Používateľský účet $1 bol {{GENDER:$2|vytvorený}} automaticky",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|presunul|presunula}} nastavenie zámku zo stránky $4 na $3",
        "logentry-protect-unprotect": "$1 {{GENDER:$2|odomkol|odomkla}} stránku $3",
        "log-name-tag": "Záznam značiek",
        "log-description-tag": "Táto stránka zobrazuje doplnenia a odobratia [[Special:Tags|značiek]] stránok a protokolovacích záznamov používateľmi. Zoznam nezahŕňa označenia stránok, ktoré boli súčasťou editačnej úpravy, zmazania alebo obdobnej akcie.",
        "rightsnone": "(žiadne)",
-       "revdelete-summary": "zhrnutie úprav",
+       "rightslogentry-temporary-group": "$1 (dočasne, do $2)",
        "feedback-adding": "Pridáva sa komentár na stránku...",
        "feedback-back": "Späť",
        "feedback-bugcheck": "Skvelé! Teraz len skontrolujte, či to nie je jedna z už [$1 známych chýb].",
        "feedback-error1": "Chyba: Nerozpoznaný výsledok z API",
        "feedback-error2": "Chyba: Úprava sa nepodarila",
        "feedback-error3": "Chyba: Žiadna odpoveď z API",
+       "feedback-error4": "Chyba: Na uvedenú stránku pre spätnú väzbu nie je možné odosielať",
        "feedback-message": "Správa:",
        "feedback-subject": "Predmet:",
        "feedback-submit": "Odoslať",
        "feedback-useragent": "Prehliadač:",
        "searchsuggest-search": "Hľadať",
        "searchsuggest-containing": "obsahuje...",
-       "api-error-autoblocked": "Vaše IP adresa bola automaticky zablokovaná, pretože ju používal zablokovaný používateľ.",
-       "api-error-badaccess-groups": "Nemáte oprávnenie nahrávať súbory na tejto wiki.",
        "api-error-badtoken": "Vnútorná chyba: Zlý token.",
-       "api-error-blocked": "Možnosť editovať vám bola zablokovaná.",
-       "api-error-copyuploaddisabled": "Nahrávanie z URL je na tomto serveri zakázané.",
-       "api-error-duplicate": "{{PLURAL:$1|ďalší súbor|ďalšie súbory}} s rovnakým obsahom už na tejto wiki existujú",
-       "api-error-duplicate-archive": "{{PLURAL:$1|ďalší súbor|ďalšie súbory}} s rovnakým obsahom už na tejto wiki existoval, ale {{PLURAL:$1|bol zmazaný|boli zmazané}}.",
-       "api-error-empty-file": "Súbor, ktorý ste poslali bol prázdny.",
        "api-error-emptypage": "Vytváranie nových, prázdnych stránok nie je dovolené.",
-       "api-error-fetchfileerror": "Vnútorná chyba: Niečo pokazilo počas sťahovania súboru.",
-       "api-error-fileexists-forbidden": "Súbor s názvom „$1“ už existuje a nie je možné prepísať ho.",
-       "api-error-fileexists-shared-forbidden": "Súbor s názvom „$1“ už neexistuje v repozitári zdieľaných súborov a nie je možné prepísať ho.",
-       "api-error-file-too-large": "Súbor, ktorý ste poslali bol príliš veľký.",
-       "api-error-filename-tooshort": "Názov súboru je príliš krátky.",
-       "api-error-filetype-banned": "Tento typ súboru je zakázaný.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nie je povolený typ súboru|nie sú povolené typy súboru}}. {{PLURAL:$3|Povolený typ súborov je|Povolené typy súborov sú}} $2.",
-       "api-error-filetype-missing": "Súboru chýba prípona.",
-       "api-error-hookaborted": "Zmena, ktorú ste sa pokúsili vykonať bola zrušená prípojným bodom rozšírenia.",
-       "api-error-http": "Vnútorná chyba: Nepodarilo sa pripojiť k serveru.",
-       "api-error-illegal-filename": "Názov súboru nie je povolený.",
-       "api-error-internal-error": "Vnútorná chyba: Niečo pokazilo pri spracovaní súboru, ktorý ste nahrávali na wiki.",
-       "api-error-invalid-file-key": "Vnútorná chyba: Súbor sa nenašiel v dočasnom úložisku.",
-       "api-error-missingparam": "Vnútorná chyba: Chýbajú parametre požiadavky.",
-       "api-error-missingresult": "Vnútorná chyba: Nepodarilo sa určiť, či kopírovanie prebehlo úspešne.",
-       "api-error-mustbeloggedin": "Aby ste mohli nahrávať súbory, musíte sa prihlásiť",
-       "api-error-mustbeposted": "Vnútorná chyba: Požiadavka vyžaduje HTTP POST.",
-       "api-error-noimageinfo": "Nahranie sa podarilo, ale server nám nedal žiadne informácie o súbore.",
-       "api-error-nomodule": "Vnútorná chyba: Nebol nastavený žiaden nahrávací modul.",
-       "api-error-ok-but-empty": "Vnútorná chyba: Žiadna odpoveď zo servera.",
-       "api-error-overwrite": "Prepísanie existujúceho súboru nie je povolené.",
-       "api-error-stashfailed": "Vnútorná chyba: Serveru sa nepodarilo uložiť dočasný súbor.",
        "api-error-publishfailed": "Vnútorná chyba: Serveru sa nepodarilo publikovať dočasný súbor.",
-       "api-error-timeout": "Server neodpovedal v očakávanom čase.",
-       "api-error-unclassified": "Vyskytla sa neznáma chyba.",
-       "api-error-unknown-code": "Neznáma chyba: „$1“",
-       "api-error-unknown-error": "Vnútorná chyba: Niečo pokazilo pri pokuse nahrať váš súbor.",
+       "api-error-stashfailed": "Vnútorná chyba: Serveru sa nepodarilo uložiť dočasný súbor.",
        "api-error-unknown-warning": "Neznáme upozornenie: $1",
        "api-error-unknownerror": "Neznáma chyba: „$1“",
-       "api-error-uploaddisabled": "Nahrávanie je na tejto wiki zakázané.",
-       "api-error-verification-error": "Tento súbor môže byť poškodený, alebo má zlú príponu.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekundy|sekúnd}}",
        "duration-minutes": "$1 {{PLURAL:$1|minúta|minúty|minút}}",
        "duration-hours": "$1 {{PLURAL:$1|hodina|hodiny|hodín}}",
        "pagelang-language": "Jazyk",
        "pagelang-use-default": "Použiť predvolený jazyk",
        "pagelang-select-lang": "Vybrať jazyk",
+       "pagelang-reason": "Dôvod",
        "pagelang-submit": "Odoslať",
        "right-pagelang": "Zmeniť jazyk stránky",
        "action-pagelang": "meniť jazyk stránky",
        "json-error-unknown": "Došlo k problému s JSONom. Chyba: $1",
        "json-error-depth": "Maximálna hĺbka zásobníka bola prekročená",
        "json-error-state-mismatch": "Nesprávny alebo poškodený JSON",
+       "json-error-ctrl-char": "Chybný riadiaci znak, možno nesprávne kódovanie",
        "json-error-syntax": "Syntaktická chyba",
+       "json-error-utf8": "Chybné UTF-8 sekvencie, možno nesprávne kódovanie",
+       "json-error-recursion": "Jeden alebo viacero rekurentných odkazov v kódovanej hodnote",
+       "json-error-inf-or-nan": "Jedna alebo viacero hodnôt NAN nebo INF v kódovanej hodnote",
+       "json-error-unsupported-type": "Odovzdaná hodnota nekódovateľného typu",
        "headline-anchor-title": "Odkaz na túto sekciu",
        "special-characters-group-latin": "Latinka",
        "special-characters-group-latinextended": "Latina rozšírené",
        "mw-widgets-dateinput-no-date": "Nebol zvolený žiaden dátum",
        "mw-widgets-dateinput-placeholder-day": "RRRR-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Hľadať médiá",
+       "mw-widgets-mediasearch-noresults": "Neboli nájdené žiadne výsledky.",
        "mw-widgets-titleinput-description-new-page": "stránka zatiaľ neexistuje",
        "mw-widgets-titleinput-description-redirect": "presmerovanie na $1",
        "randomrootpage": "Náhodná koreňová stránka",
index e1f6f78..f41ade0 100644 (file)
@@ -13,7 +13,8 @@
                        "Skalcaa",
                        "Janezdrilc",
                        "Matma Rex",
-                       "NegativeTwelveDollars"
+                       "NegativeTwelveDollars",
+                       "Xð"
                ]
        },
        "tog-underline": "Podčrtavanje povezav:",
        "unprotectthispage": "Spremeni zaščito strani",
        "newpage": "Nova stran",
        "talkpage": "Pogovorite se o strani",
-       "talkpagelinktext": "Pogovor",
+       "talkpagelinktext": "pogovor",
        "specialpage": "Posebna stran",
        "personaltools": "Osebna orodja",
        "articlepage": "Prikaže članek",
        "redirectedfrom": "(Preusmerjeno s strani $1)",
        "redirectpagesub": "Preusmeritvena stran",
        "redirectto": "Preusmeritev na:",
-       "lastmodifiedat": "Čas zadnje spremembe: $2, $1.",
+       "lastmodifiedat": "Čas zadnje spremembe strani: $2, $1.",
        "viewcount": "Stran je bila naložena {{PLURAL:$1|$1-krat}}.",
        "protectedpage": "Zaščitena stran",
        "jumpto": "Skoči na:",
        "login": "Prijava",
        "login-security": "Potrdite svojo identiteto",
        "nav-login-createaccount": "Prijavite se / registrirajte se",
-       "userlogin": "Prijavite se / registrirajte se",
-       "userloginnocreate": "Prijava",
        "logout": "Odjava",
        "userlogout": "Odjava",
        "notloggedin": "Niste prijavljeni",
        "userlogin-noaccount": "Nimate uporabniškega računa?",
        "userlogin-joinproject": "Pridružite se {{GRAMMAR:dajalnik|{{SITENAME}}}}",
-       "nologin": "Še nimate uporabniškega računa? $1!",
-       "nologinlink": "Registrirajte se",
        "createaccount": "Registracija",
-       "gotaccount": "Račun že imate? $1.",
-       "gotaccountlink": "Prijavite se",
-       "userlogin-resetlink": "Ste pozabili svoje prijavne podatke?",
        "userlogin-resetpassword-link": "Ste pozabili svoje geslo?",
        "userlogin-helplink2": "Pomoč pri prijavi",
        "userlogin-loggedin": "Prijavljeni ste že kot {{GENDER:$1|$1}}.\nUporabite spodnji obrazec, da se prijavite kot drug uporabnik.",
        "createaccountmail": "Ustvari začasno naključno geslo in ga pošlji na spodaj navedeni e-poštni naslov",
        "createaccountmail-help": "Se lahko uporablja za ustvarjanje računa za drugo osebo brez da bi vedeli geslo.",
        "createacct-realname": "Pravo ime (izbirno)",
-       "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zakaj ustvarjate drug račun",
        "createacct-reason-help": "Sporočilo, prikazano v dnevniku ustvarjanja računov",
        "preview": "Predogled",
        "showpreview": "Prikaži predogled",
        "showdiff": "Prikaži spremembe",
-       "blankarticle": "<strong>Opozorilo:</strong> Stran, ki jo ustvarjate, je prazna.\nČe ponovno kliknete »{{int:savearticle}}«, bomo stran ustvarili brez kakršnekoli vsebine.",
+       "blankarticle": "<strong>Opozorilo:</strong> Stran, ki jo ustvarjate, je prazna.\nČe ponovno kliknete »$1«, bomo stran ustvarili brez kakršne koli vsebine.",
        "anoneditwarning": "<strong>Opozorilo:</strong> Niste prijavljeni. Vaš IP-naslov bo javno viden, če naredite kakršnokoli urejanje. Če se <strong>[$1 prijavite]</strong> ali <strong>[$2 ustvarite račun]</strong>, bodo vaša urejanja pripisana vašemu uporabniškemu imenu skupaj z drugimi prednostmi.",
        "anonpreviewwarning": "Niste prijavljeni. Ob spremembi strani se bo vaš IP-naslov zapisal v zgodovini urejanja te strani.",
        "missingsummary": "'''Opozorilo:''' Niste napisali povzetka urejanja. Ob ponovnem kliku gumba ''Shrani'' se bo vaše urejanje shranilo brez njega.",
-       "selfredirect": "<strong>Opozorilo:</strong> Stran preusmerjate na samo nase.\nMorda ste za cilj preusmeritve navedli napačno stran ali pa morda urejate napačno stran.\nČe ponovno kliknete »{{int:savearticle}}«, bomo preusmeritev vseeno ustvarili.",
+       "selfredirect": "<strong>Opozorilo:</strong> Stran preusmerjate na samo nase.\nMorda ste za cilj preusmeritve navedli napačno stran ali pa morda urejate napačno stran.\nČe ponovno kliknete »$1«, bomo preusmeritev vseeno ustvarili.",
        "missingcommenttext": "Prosimo, vpišite v spodnje polje komentar.",
-       "missingcommentheader": "<strong>Opozorilo:</strong> Niste vnesli zadeve za ta komentar.\nČe boste ponovno kliknili »{{int:savearticle}}«, bo vaše urejanje shranjeno brez nje.",
+       "missingcommentheader": "<strong>Opozorilo:</strong> Niste vnesli zadeve za ta komentar.\nČe boste ponovno kliknili »$1«, bo vaše urejanje shranjeno brez nje.",
        "summary-preview": "Predogled povzetka urejanja:",
        "subject-preview": "Predogled zadeve:",
        "previewerrortext": "Med poskusom prikaza predogleda vaših sprememb je prišlo do napake.",
        "editingsection": "Urejanje $1 (razdelek)",
        "editingcomment": "Urejanje $1 (nov razdelek)",
        "editconflict": "Navzkrižje urejanj: $1",
-       "explainconflict": "Med vašim urejanjem je stran spremenil nekdo drug.\nZgornje urejevalno polje vsebuje njeno trenutno vsebino.\nVaše spremembe so prikazane v spodnjem polju, ki jih boste morali združiti z obstoječim besedilom.\n'''Samo''' besedilo v zgornjem polju bo shranjeno, ko boste izbrali ukaz »{{int:savearticle}}«.",
+       "explainconflict": "Med vašim urejanjem je stran spremenil nekdo drug.\nZgornje urejevalno polje vsebuje njeno trenutno vsebino.\nVaše spremembe so prikazane v spodnjem polju, ki jih boste morali združiti z obstoječim besedilom.\n'''Samo''' besedilo v zgornjem polju bo shranjeno, ko boste izbrali ukaz »$1«.",
        "yourtext": "Vaše besedilo",
        "storedversion": "Shranjena redakcija",
        "nonunicodebrowser": "'''Opozorilo: Vaš brskalnik ne podpira Unicode.'''\nZa obhod te težave se bodo ne-ASCII-znaki v urejevalnem polju spodaj pojavili kot šestnajstiške kode.",
        "readonlywarning": "<strong>Opozorilo: Zbirka podatkov je zaradi vzdrževanja začasno zaklenjena, kar pomeni, da sprememb trenutno ne morete shraniti.</strong>\nProsimo, prenesite besedilo v urejevalnik in ga dodajte pozneje.\n\nSistemski skrbnik, ki jo je zaklenil, je podal naslednjo razlago: $1",
        "protectedpagewarning": "'''Opozorilo: Stran je bila zaklenjena in jo lahko urejajo le uporabniki z administratorskimi pravicami.'''\nZadnji vnos v dnevnik je naveden spodaj:",
        "semiprotectedpagewarning": "'''Opomba:''' Stran je bila zaklenjena in jo lahko urejajo le registrirani uporabniki.\nZadnji vnos v dnevnik je naveden spodaj:",
-       "cascadeprotectedwarning": "'''Opozorilo:''' Ta stran je zaklenjena, tako da jo lahko urejajo le administratorji, saj je bila vključena med {{PLURAL:$1|sledečo stran|sledeči strani|sledeče strani}} s kaskadno zaščito:",
+       "cascadeprotectedwarning": "'''Opozorilo:''' Ta stran je zaklenjena, tako da jo lahko urejajo le uporabniki z [[Special:ListGroupRights|določenimi pravicami]], saj je bila vključena med {{PLURAL:$1|sledečo stran|sledeči strani|sledeče strani}} s kaskadno zaščito:",
        "titleprotectedwarning": "'''Opozorilo: Stran je bila zaklenjena in jo lahko urejajo le uporabniki s [[Special:ListGroupRights|specifičnimi pravicami]].'''\nZa sklic je priskrbljen spodnji dnevnik vnosov:",
        "templatesused": "{{PLURAL:$1|Predloga, uporabljena|Predlogi, uporabljeni|Predloge, uporabljene}} na strani:",
        "templatesusedpreview": "{{PLURAL:$1|Predloga, uporabljena|Predlogi, uporabljeni|Predloge, uporabljene}} v predogledu:",
        "post-expand-template-argument-warning": "'''Opozorilo:'''' Ta stran vsebuje vsaj en argument predloge, ki ima preveliko razširitev.\nNaslednji argumenti so bili izpuščeni.",
        "post-expand-template-argument-category": "Strani z izpuščenimi argumenti predloge",
        "parser-template-loop-warning": "V predlogi je bila odkrita zanka: [[$1]]",
+       "template-loop-category": "Strani z zankami predlog",
+       "template-loop-category-desc": "Stran vsebuje zanko predloge, tj. predlogo, ki rekurzivno kliče sama sebe.",
        "parser-template-recursion-depth-warning": "Prekoračena globina rekurzije predlog ($1)",
        "language-converter-depth-warning": "Prekoračena globina pretvorbe jezikov ($1)",
        "node-count-exceeded-category": "Strani s prekoračenim številom vozlišč",
        "page_first": "prva",
        "page_last": "zadnja",
        "histlegend": "Izbira primerjave: označite okroglo polje ob redakciji za primerjavo in stisnite enter ali gumb na dnu strani.<br />\nLegenda: '''({{int:cur}})''' = primerjava s trenutno redakcijo, '''({{int:last}})''' = primerjava s prejšnjo redakcijo, '''{{int:minoreditletter}}''' = manjše urejanje.",
-       "history-fieldset-title": "Zgodovina poizvedovanj",
-       "history-show-deleted": "Samo izbrisani",
+       "history-fieldset-title": "Iskanje redakcij",
+       "history-show-deleted": "Samo izbrisana redakcija",
        "histfirst": "najstarejše",
        "histlast": "najnovejše",
        "historysize": "({{PLURAL:$1|$1 zlog|$1 zloga|$1 zlogi|$1 zlogov}})",
        "search-file-match": "(ujema se z vsebino datoteke)",
        "search-suggest": "Iščete morda: $1",
        "search-rewritten": "Prikazujemo rezultate za $1. Namesto tega poiščite $2.",
-       "search-interwiki-caption": "Sorodni projekti",
+       "search-interwiki-caption": "Rezultati s sorodnih projektov",
        "search-interwiki-default": "Rezultati s strani $1:",
        "search-interwiki-more": "(več)",
        "search-interwiki-more-results": "več zadetkov",
        "prefs-help-prefershttps": "Nastavitev bo začela veljati ob vaši naslednji prijavi.",
        "prefswarning-warning": "V svojih nastavitvah ste naredili spremembe, ki jih še niste shranili. Če odidete s strani brez da bi kliknili »$1«, vaših nastavitev ne bomo posodobili.",
        "prefs-tabs-navigation-hint": "Namig: Za krmarjenje med zavihki na seznamu zavihkov lahko uporabite levo in desno smerno tipko.",
-       "userrights": "Upravljanje s pravicami uporabnikov",
+       "userrights": "Pravice uporabnika",
        "userrights-lookup-user": "Izberite uporabnika",
        "userrights-user-editname": "Vpišite uporabniško ime:",
        "editusergroup": "Naloži uporabniške skupine",
        "saveusergroups": "Shrani {{GENDER:$1|uporabnikove|uporabničine}} skupine",
        "userrights-groupsmember": "Član skupine:",
        "userrights-groupsmember-auto": "Posreden član:",
-       "userrights-groups-help": "Spreminjate lahko skupine uporabnika:\n* Obkljukano polje pomeni uporabnika, ki je v skupini\n* Odkljukano polje pomeni uporabnika, ki ni v skupini\n* Zvezdica (*) kaže, da uporabnika ne boste mogli odstraniti iz skupine, ko ga vanjo dodate oz. obratno.\n* Lojtra (#) kaže, da lahko čas poteka te skupine postavite samo nazaj; ne morete ga postaviti naprej.",
+       "userrights-groups-help": "Spreminjate lahko skupine uporabnika:\n* Obkljukano polje pomeni uporabnika, ki je v skupini\n* Odkljukano polje pomeni uporabnika, ki ni v skupini\n* Zvezdica (*) kaže, da uporabnika ne boste mogli odstraniti iz skupine, ko ga vanjo dodate oz. obratno.\n* Lojtra (#) kaže, da lahko čas poteka članstva v tej skupine postavite samo nazaj; ne morete ga postaviti naprej.",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Za urejanje pravic uporabnikov na drugih wikijih nimate dovoljenja.",
        "userrights-nodatabase": "Podatkovna baza $1 ne obstaja ali ni lokalna.",
        "userrights-expiry-options": "1 dan:1 day,1 teden:1 week,1 mesec:1 month,3 mesece:3 months,6 mesecev:6 months,1 leto:1 year",
        "userrights-invalid-expiry": "Čas poteka skupine »$1« ni veljaven.",
        "userrights-expiry-in-past": "Čas poteka skupine »$1« je v preteklosti.",
-       "userrights-cannot-shorten-expiry": "Časa poteka skupine »$1« ne morete prestaviti naprej. Samo uporabniki z dovoljenjem za dodajanje ali odstranitev te supine lahko prestavijo čase poteka naprej.",
+       "userrights-cannot-shorten-expiry": "Časa poteka članstva v skupini »$1« ne morete prestaviti naprej. Samo uporabniki z dovoljenjem za dodajanje ali odstranitev te skupine lahko prestavijo čase poteka naprej.",
        "userrights-conflict": "Spor sprememb uporabniških pravic! Prosimo, da pregledate in potrdite svoje spremembe.",
        "group": "Skupina:",
        "group-user": "Uporabniki",
        "group-bot": "Boti",
        "group-sysop": "Administratorji",
        "group-bureaucrat": "Birokrati",
-       "group-suppress": "Zatiralci",
+       "group-suppress": "Ukinjevalci",
        "group-all": "(vsi)",
        "group-user-member": "{{GENDER:$1|uporabnik|uporabnica}}",
        "group-autoconfirmed-member": "{{GENDER:$1|samodejno potrjen uporabnik|samodejno potrjena uporabnica}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorka}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratinja}}",
-       "group-suppress-member": "{{GENDER:$1|zatiralec|zatiralka}}",
+       "group-suppress-member": "{{GENDER:$1|ukinjevalec|ukinjevalka}}",
        "grouppage-user": "{{ns:project}}:Uporabniki",
        "grouppage-autoconfirmed": "{{ns:project}}:Samodejno potrjeni uporabniki",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:Administratorji",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
-       "grouppage-suppress": "{{ns:project}}:Zatiralci",
+       "grouppage-suppress": "{{ns:project}}:Ukinjevalci",
        "right-read": "Branje strani",
        "right-edit": "Urejanje strani",
        "right-createpage": "Ustvarjanje strani (ki niso pogovorne)",
        "right-editsemiprotected": "Urejanje strani, zaščitenih kot »{{int:protect-level-autoconfirmed}}«",
        "right-editcontentmodel": "Urejanje vsebinskega modela strani",
        "right-editinterface": "Urejanje uporabniškega vmesnika",
-       "right-editusercssjs": "Urejanje CSS- in JS-datotek drugih uporabnikov",
        "right-editusercss": "Uredi CSS datotek drugih uporabnikov",
        "right-edituserjs": "Uredi JS datotek drugih uporabnikov",
        "right-editmyusercss": "Uredite svoje uporabniške datoteke CSS",
        "recentchanges": "Zadnje spremembe",
        "recentchanges-legend": "Možnosti zadnjih sprememb",
        "recentchanges-summary": "Na tej strani lahko spremljate najnovejše spremembe wikija.",
-       "recentchanges-noresult": "V podanem obdobju nobena sprememba ne ustreza tem merilom.",
+       "recentchanges-noresult": "V danem obdobju nobena sprememba ne ustreza tem merilom.",
        "recentchanges-feed-description": "Spremljajte zadnje spremembe wikija prek tega vira.",
        "recentchanges-label-newpage": "To urejanje je ustvarilo novo stran",
        "recentchanges-label-minor": "To je manjše urejanje",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (glej tudi [[Special:NewPages|seznam novih strani]])",
        "recentchanges-submit": "Prikaži",
        "rcfilters-activefilters": "Dejavni filtri",
+       "rcfilters-quickfilters": "Hitre povezave",
+       "rcfilters-quickfilters-placeholder-title": "Shranjena ni še nobena povezava",
+       "rcfilters-quickfilters-placeholder-description": "Da shranite svoje nastavitve filtrov in jih ponovno uporabite pozneje, kliknite na ikono za zaznamek v območju Dejavni filtri spodaj.",
+       "rcfilters-savedqueries-defaultlabel": "Shranjeni filtri",
+       "rcfilters-savedqueries-rename": "Preimenuj",
+       "rcfilters-savedqueries-setdefault": "Nastavi kot privzeto",
+       "rcfilters-savedqueries-unsetdefault": "Odstrani kot privzeto",
+       "rcfilters-savedqueries-remove": "Odstrani",
+       "rcfilters-savedqueries-new-name-label": "Ime",
+       "rcfilters-savedqueries-apply-label": "Ustvari hitro povezavo",
+       "rcfilters-savedqueries-cancel-label": "Prekliči",
+       "rcfilters-savedqueries-add-new-title": "Shrani filtre kot hitro povezavo",
        "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-whatsthis": "Kaj je to?",
+       "rcfilters-filterlist-feedbacklink": "Podajte povratne informacije o novih (preizkusnih) filtrih",
+       "rcfilters-highlightbutton-title": "Označi rezultate",
+       "rcfilters-highlightmenu-title": "Izberite barvo",
+       "rcfilters-highlightmenu-help": "Izberite barvo za označitev te lastnosti",
        "rcfilters-filterlist-noresults": "Nismo našli nobenega filtra",
+       "rcfilters-noresults-conflict": "Našli nismo nobenih rezultatov, ker si merila za iskanje nasprotujejo",
+       "rcfilters-state-message-subset": "Ta filter nima učinka, saj njegove rezultate {{PLURAL:$2|vključuje naslednji, širši filter|vključujeta naslednja, širša filtra|vključujejo naslednji, širši filtri}} (označite jih, da razlikujete med njimi): $1",
+       "rcfilters-state-message-fullcoverage": "Izbira vseh filtrov v skupini je enako kot izbira nobenega, zato ta filter nima učinka. Skupina vključuje: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "Filter je v sporu z {{PLURAL:$2|naslednjim filtrom|naslednjima filtroma|naslednjimi filtri}} Izkušnje, ki {{PLURAL:$2|najde|najdeta|najdejo}} samo registrirane uporabnike: $1",
+       "rcfilters-filtergroup-authorship": "Avtorstvo prispevka",
+       "rcfilters-filter-editsbyself-label": "Vaše spremembe",
+       "rcfilters-filter-editsbyself-description": "Vaša lastna urejanja.",
+       "rcfilters-filter-editsbyother-label": "Spremembe drugih",
+       "rcfilters-filter-editsbyother-description": "Vse spremembe razen vaše.",
        "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-user-experience-level-conflicts-unregistered": "Napredni filtri najdejo samo registrirane uporabnike, zato je ta filter v sporu s filtrom »Neregistrirani«.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filter »Neregistrirani« je v sporu z enim ali več filtri Izkušnje, ki najdejo samo registrirane uporabnike. Filtri v sporu so označeni zgoraj, v območju Dejavni filtri.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novinci",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Manj kot 10 urejanj in 4 dni dejavnosti.",
+       "rcfilters-filter-user-experience-level-learner-label": "Učenci",
+       "rcfilters-filter-user-experience-level-learner-description": "Več izkušenj kot »Novinci«, vendar manj kot »Izkušeni uporabniki«.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Izkušeni uporabniki",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Stanje pregleda",
+       "rcfilters-filter-patrolled-label": "Nadzorovano",
+       "rcfilters-filter-patrolled-description": "Urejanja, ki so označena kot nadzorovana.",
+       "rcfilters-filter-unpatrolled-label": "Nenadzorovano",
+       "rcfilters-filter-unpatrolled-description": "Urejanja, ki niso označena kot nadzorovana.",
        "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-watchlist": "Nadzorovane strani",
+       "rcfilters-filter-watchlist-watched-label": "Na spisku nadzorov",
+       "rcfilters-filter-watchlist-watched-description": "Spremembe strani na vašems spisku nadzorov.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nove spremembe nadzorovanih strani",
+       "rcfilters-filter-watchlist-watchednew-description": "Spremembe nadzorovanih strani, ki jih niste obiskali, odkar je prišlo do sprememb.",
+       "rcfilters-filter-watchlist-notwatched-label": "Ni na spisku nadzorov",
+       "rcfilters-filter-watchlist-notwatched-description": "Vse razen spremembe strani na vašem spisku nadzorov.",
        "rcfilters-filtergroup-changetype": "Vrsta spremembe",
        "rcfilters-filter-pageedits-label": "Urejanja strani",
        "rcfilters-filter-pageedits-description": "Urejanja vsebine wikija, razprave, opisi 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 ...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filter »Manjša urejanja« je v sporu z enim ali več filtri Vrsta spremembe, ker nekaterih vrst urejanj ni možno označiti kot »manjša«. Filtri v sporu so označeni v območju Dejavni filtri zgoraj.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Nekaterih vrst sprememb ni možno označiti kot »manjše«, zato je ta filter v sporu z naslednjimi filtri Vrsta spremembe: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ta filter Vrsta spremembe je v sporu s filtrom »Manjše urejanje«. Nekaterih vrst sprememb ni možno označiti kot »manjše«.",
+       "rcfilters-filtergroup-lastRevision": "Zadnja redakcija",
+       "rcfilters-filter-lastrevision-label": "Zadnja redakcija",
+       "rcfilters-filter-lastrevision-description": "Najnovejša sprememba strani.",
+       "rcfilters-filter-previousrevision-label": "Zgodnejše redakcije",
+       "rcfilters-filter-previousrevision-description": "Vse spremembe, ki niso najnovejša sprememba strani.",
        "rcnotefrom": "{{PLURAL:$5|Navedena je sprememba|Navedeni sta spremembi|Navedene so spremembe}} od <strong>$3 $4</strong> dalje (prikazujem jih do <strong>$1</strong>).",
+       "rclistfromreset": "Ponastavi izbiro datuma",
        "rclistfrom": "Prikaži spremembe od $3 $2 naprej",
        "rcshowhideminor": "$1 manjša urejanja",
        "rcshowhideminor-show": "Prikaži",
        "rcshowhidecategorization": "$1 kategorizacijo strani",
        "rcshowhidecategorization-show": "Prikaži",
        "rcshowhidecategorization-hide": "Skrij",
-       "rclinks": "Prikaži zadnjih $1 sprememb v zadnjih $2 dneh<br />$3",
+       "rclinks": "Prikaži zadnjih $1 sprememb v zadnjih $2 dneh",
        "diff": "prim",
        "hist": "zgod",
        "hide": "skrij",
        "php-uploaddisabledtext": "Nalaganje datotek je onemogočeno v PHP.\nProsimo preverite file_uploads nastavitev.",
        "uploadscripted": "Datoteka vsebuje HTML- ali skriptno kodo, ki bi jo lahko brskalnik razlagal napačno.",
        "upload-scripted-pi-callback": "Ne moremo naložiti datoteke, ki vsebuje navodila za slogovno obdelavo XML.",
+       "upload-scripted-dtd": "Ne morete naložiti datotek SVG, ki vsebujejo nestandardno najavo DTD.",
        "uploaded-script-svg": "V naloženi datoteki SVG smo našli skriptni element »$1«.",
        "uploaded-hostile-svg": "V slogovnem elementu naložene datoteke SVG smo našli nevaren CSS.",
        "uploaded-event-handler-on-svg": "Določevanje atributov za dogodke <code>$1=\"$2\"</code> v datotekah SVG ni dovoljeno.",
        "enotif_body_intro_moved": "{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|spremenil|spremenila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.",
        "enotif_body_intro_restored": "{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|obnovil|obnovila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.",
        "enotif_body_intro_changed": "{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|spremenil|spremenila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.",
-       "enotif_lastvisited": "Za spremembe po vašem zadnjem obisku glejte $1.",
+       "enotif_lastvisited": "Za vse spremembe po vašem zadnjem obisku si oglejte $1.",
        "enotif_lastdiff": "Glej $1 za to spremembo.",
        "enotif_anon_editor": "brezimni uporabnik $1",
        "enotif_body": "$WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nUrejevalčev povzetek: $PAGESUMMARY $PAGEMINOREDIT\n\nNavežite stik z urejevalcem:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nMedtem ko ste prijavljeni, nadaljnjih obvestil ne boste prejemali. Na spisku nadzorov lahko tudi ponastavite zastavice obveščanj za vse spremljane strani.\n\nVaš opozorilni sistem {{GRAMMAR:rodilnik|{{SITENAME}}}}\n\n--\nZa spremembo nastavitev e-poštnih obvestil obiščite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa spremembo nastavitev spiska nadzorov obiščite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nZa odstranitev strani z vašega spiska nadzorov obiščite\n$UNWATCHURL\n\nPovratna sporočila in pomoč:\n$HELPPAGE",
        "editcomment": "Povzetek urejanja je bil: <em>$1</em>.",
        "revertpage": "vrnitev sprememb uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) na zadnje urejanje uporabnika [[User:$1|$1]]",
        "revertpage-nouser": "vrnitev sprememb skritega uporabnika na zadnjo redakcijo {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Razveljavljene spremembe uporabnika $1;\nvrnjeno na urejanje uporabnika $2.",
+       "rollback-success": "Razveljavljene spremembe {{GENDER:$3|uporabnika|uporabnice}} $1;\nvrnjeno na urejanje {{GENDER:$4|uporabnika|uporabnice}} $2.",
        "rollback-success-notify": "Povrnili smo urejanja $1;\nspremenjeno nazaj na zadnjo redakcijo $2. [$3 Prikaži spremembe]",
        "sessionfailure-title": "Neuspeh seje",
        "sessionfailure": "Vaša prijava ni uspela; da bi preprečili ugrabitev seje, je bilo dejanje preklicano. Prosimo, izberite »Nazaj« in ponovno naložite stran, s katere prihajate, nato poskusite znova.",
        "undeleteviewlink": "ogled",
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|obnovljena $1 redakcija|obnovljeni $1 redakciji|obnovljene $1 redakcije|obnovljenih $1 redakcij}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}} in $2 {{PLURAL:$2|datoteka|datoteki|datoteke|datotek}} {{PLURAL:$1+$2|obnovljena|obnovljeni|obnovljene|obnovljenih}}",
-       "undeletedfiles": "{{PLURAL:$1|obnovljena je $1 datoteka|obnovljeni sta $1 datoteki|obnovljene so $1 datoteke|obnovljenih je $1 datotek}}",
        "cannotundelete": "Nekatere ali vse obnove so spodletele:\n$1",
        "undeletedpage": "'''Obnovili ste stran $1.'''\n\nNedavna brisanja in obnove so zapisani v [[Special:Log/delete|dnevniku brisanja]].",
        "undelete-header": "Glej [[Special:Log/delete|dnevnik brisanja]] za nedavno izbrisane strani.",
        "sp-contributions-uploads": "naložene datoteke",
        "sp-contributions-logs": "dnevniki",
        "sp-contributions-talk": "pogovor",
-       "sp-contributions-userrights": "upravljanje s pravicami uporabnikov",
+       "sp-contributions-userrights": "upravljanje s pravicami {{GENDER:$1|uporabnika|uporabnice}}",
        "sp-contributions-blocked-notice": "Ta uporabnik je trenutno blokiran.\nNajnovejši vnos v dnevniku blokad je naveden spodaj:",
        "sp-contributions-blocked-notice-anon": "Ta IP-naslov je trenutno blokiran.\nNajnovejši vnos v dnevniku blokad je naveden spodaj:",
        "sp-contributions-search": "Išči prispevke",
        "unblocked-id": "Blokada $1 je odstranjena",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] smo odblokirali.",
        "blocklist": "Blokirani uporabniki",
+       "autoblocklist": "Samodejne blokade",
+       "autoblocklist-submit": "Išči",
+       "autoblocklist-legend": "Seznam samodejnih blokad",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Lokalna samodejna blokada|Lokalni samodejni blokadi|Lokalne samodejne blokade}}",
+       "autoblocklist-empty": "Seznam samodejnih blokad je prazen.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Druga samodejna blokada|Drugi samodejni blokadi|Druge samodejne blokade}}",
        "ipblocklist": "Blokirani uporabniki",
        "ipblocklist-legend": "Poišči blokiranega uporabnika",
        "blocklist-userblocks": "skrij blokade računov",
        "tooltip-pt-mycontris": "Seznam {{GENDER:|tvojih}} prispevkov",
        "tooltip-pt-anoncontribs": "Seznam urejanj s tega IP-naslova",
        "tooltip-pt-login": "Prijava ni obvezna, vendar je zaželena",
+       "tooltip-pt-login-private": "Da lahko uporabljate ta wiki, se morate prijaviti",
        "tooltip-pt-logout": "Odjavi se",
        "tooltip-pt-createaccount": "Predlagamo vam, da ustvarite račun in se prijavite, vendar pa to ni obvezno.",
        "tooltip-ca-talk": "Pogovor o strani",
        "anonymous": "{{PLURAL:$1|Brezimni uporabnik|Brezimna uporabnika|Brezimni uporabniki}} {{GRAMMAR:rodilnik|{{SITENAME}}}}",
        "siteuser": "uporabnik {{GRAMMAR:rodilnik|{{SITENAME}}}} $1",
        "anonuser": "Brezimni uporabnik {{GRAMMAR:rodilnik|{{SITENAME}}}} $1",
-       "lastmodifiedatby": "Stran je zadnjič urejal(-a) $3 (čas spremembe: $2, $1).",
+       "lastmodifiedatby": "Stran je zadnjič urejal(-a) $3 dne $2 ob $1.",
        "othercontribs": "Temelji na delu $1.",
        "others": "drugi",
        "siteusers": "{{PLURAL:$2|{{GENDER:$1|uporabnika|uporabnice}}|uporabnikov}} {{GRAMMAR:rodilnik|{{SITENAME}}}} $1",
        "newimages-summary": "Ta posebna stran prikazuje najnovejše naložene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ali njen del):",
+       "newimages-user": "IP-naslov ali uporabniško ime",
        "newimages-showbots": "Prikaži nalaganja botov",
        "newimages-hidepatrolled": "Skrij nadzorovana nalaganja",
        "noimages": "Nič ni videti.",
        "confirmrecreate-noreason": "{{GENDER:$1|Uporabnik|Uporabnica}} [[User:$1|$1]] ([[User talk:$1|pogovor]]) je {{GENDER:$1|izbrisal|izbrisala}} to stran po začetku vašega urejanja. Potrdite, da jo resnično želite znova ustvariti.",
        "recreate": "Ponovno ustvari",
        "unit-pixel": " točk",
+       "confirm-purge-title": "Osveži predpomnilnik strani",
        "confirm_purge_button": "Osveži",
        "confirm-purge-top": "Osvežim predpomnjenje strani?",
        "confirm-purge-bottom": "Osvežitev strani počisti predpomnilnik in prisili prikaz najnovejše različice.",
        "htmlform-user-not-valid": "<strong>$1</strong> ni veljavno uporabniško ime.",
        "logentry-delete-delete": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} stran $3",
        "logentry-delete-delete_redir": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} preusmeritev $3 s prepisom",
-       "logentry-delete-restore": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3",
+       "logentry-delete-restore": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3",
+       "restore-count-revisions": "$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}}",
+       "restore-count-files": "$1 {{PLURAL:$1|datoteka|datoteki|datoteke|datotek}}",
        "logentry-delete-event": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4",
        "logentry-delete-revision": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost dnevniških dogodkov na $3",
        "logentry-tag-update-revision": "$1 je {{GENDER:$2|posodobil|posodobila|posodobil(-a)}} oznake redakcije $4 strani $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|odstranjeno}} $8)",
        "logentry-tag-update-logentry": "$1 je {{GENDER:$2|posodobil|posodobila|posodobil(-a)}} oznake dnevniškega vnosa $5 strani $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|odstranjeno}} $8)",
        "rightsnone": "(nobeno)",
-       "revdelete-summary": "povzetek urejanja",
        "rightslogentry-temporary-group": "$1 (začasno, do $2)",
        "feedback-adding": "Dodajanje povratne informacije na stran ...",
        "feedback-back": "Nazaj",
        "special-characters-group-thai": "Tajski",
        "special-characters-group-lao": "Laoški",
        "special-characters-group-khmer": "Kmerski",
+       "special-characters-group-canadianaboriginal": "Kanadsko aboridžinsko",
        "special-characters-title-endash": "navaden pomišljaj",
        "special-characters-title-emdash": "dolgi pomišljaj",
        "special-characters-title-minus": "znak za minus",
        "mw-widgets-titleinput-description-redirect": "preusmeritev na $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategorijo ...",
        "mw-widgets-usersmultiselect-placeholder": "Dodaj več ...",
+       "date-range-from": "Od datuma:",
+       "date-range-to": "Do datuma:",
        "sessionmanager-tie": "Ne morem združiti več vrst overitvenih zahtev: $1.",
        "sessionprovider-generic": "sej $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sej, ki temeljijo na piškotkih",
        "restrictionsfield-label": "Dovoljeni IP-obsegi:",
        "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite:\n<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "redakcija $1",
-       "pageid": "ID strani $1"
+       "pageid": "ID strani $1",
+       "rawhtml-notallowed": "Oznak &lt;html&gt; ni možno uporabljati izven normalnih strani.",
+       "gotointerwiki": "Zapuščate {{GRAMMAR:tožilnik|{{SITENAME}}}}",
+       "gotointerwiki-invalid": "Naveden naslov je neveljaven.",
+       "gotointerwiki-external": "Zapuščate {{GRAMMAR:tožilnik|{{SITENAME}}}}, da obiščete [[$2]], ki je ločena spletna stran.\n\n'''[$1 Nadaljujte na $1]'''",
+       "undelete-cantedit": "Strani ne morete obnoviti, saj vam ni dovoljeno, da jo urejate.",
+       "undelete-cantcreate": "Strani ne morete obnoviti, saj stran s tem imenom ne obstaja in je nimate dovoljenja ustvariti."
 }
index 5e04c16..5b90dc8 100644 (file)
        "externaldberror": "Entweder is leit a Fahler bei der externa Authentifizierung vur, oder du darfst dei externes Benutzerkonto ne aktualisiera.",
        "login": "Oanmelda",
        "nav-login-createaccount": "Oamelda / a Konto oalega",
-       "userlogin": "Oanmelda / Nutzerkonto erstella",
        "logout": "Oabmelda",
        "userlogout": "Oabmelda",
        "notloggedin": "Nä oangemeldet",
-       "nologin": "Du hast keen Benutzerkonto? $1.",
-       "nologinlink": "Neues Benutzerkonto oanleega",
        "createaccount": "Benutzerkonto oanlega",
-       "gotaccount": "Du hast bereits a Benutzerkonto? '''$1'''.",
-       "gotaccountlink": "Oanmelda",
-       "userlogin-resetlink": "Die Anmeldedaten vergessen?",
        "createaccountmail": "ieber E-Mail",
        "badretype": "De beida Passwörter stimma nä ieberein.",
        "userexists": "Dar delle Benutzernoame ies schunt vergahn. Bitte wähle enn andern.",
        "editingsection": "Bearbta vu $1 (Obschnitt)",
        "editingcomment": "Bearbta vu $1 (Neuer Obschnitt)",
        "editconflict": "Beoarbeetungskonflikt: $1",
-       "explainconflict": "Jemand anders hoot diese Seite geändert, noachdem du oagefanga host diese zu bearbta.\nDoas obere Textfeld enthält dann aktuellen Stand.\nDoas undere Textfeld enthält denne Änderunga.\nBitte fiege denne Änderungen ei doas obere Textfeld a.\n'''Ock''' der Inhalt des oberen Textfeldes werd gespeichert, wenn du uff „{{int:savearticle}}“ klickst!",
+       "explainconflict": "Jemand anders hoot diese Seite geändert, noachdem du oagefanga host diese zu bearbta.\nDoas obere Textfeld enthält dann aktuellen Stand.\nDoas undere Textfeld enthält denne Änderunga.\nBitte fiege denne Änderungen ei doas obere Textfeld a.\n'''Ock''' der Inhalt des oberen Textfeldes werd gespeichert, wenn du uff „$1“ klickst!",
        "yourtext": "Deen Text",
        "nonunicodebrowser": "'''Ochtiche:''' Dei Browser koan Unicode-Zeicha ne richtig verarbta. Bitte verwende anna andern Browser im Seita zu bearbta.",
        "editingold": "'''OCHTICHE: Du beoarbeetest anne aale Version dieser Seite. Wenn du speicherst, waan olle neueren Versionen ieberschrieba.'''",
        "saveprefs": "Eenstallunga speichern",
        "restoreprefs": "Olle Standardeinstallunga wiederherstalla",
        "prefs-editing": "Bearbta",
-       "rows": "Zeila:",
-       "columns": "Spalta:",
        "stub-threshold": "Linkformatierung <a href=\"#\" class=\"stub\">klenner Seyta</a> (ei Byte):",
        "recentchangesdays": "Oazoahl dar Tage, de de Liste dar „Letzta Änderunga“ standardmäßig imfassa sull:",
        "recentchangescount": "Oazoahl dar standardmäßig oagezeigta Beoarbeetunga:",
        "userrights-groups-help": "Du koast de Gruppenzugehierigkeit fier diesen Nutzer ändern:\n* A markiertes Kästchen bedeutet, doaß dar Nutzer Mitglied dieser Gruppe ies\n* A * bedeutet, doaß du doas Nutzerrecht noach Erteilung ne wieder zerrickenahma koast (oder umgekehrt).",
        "userrights-no-interwiki": "Du host kenne Berechtigung, Nutzerrechte ei andern Wikis zu ändern.",
        "userrights-nodatabase": "De Datenbank $1 ies ne vurhanda oder ne lokal.",
-       "userrights-nologin": "Du mußt diech miet a'm Administrator-Nutzerkonto [[Special:UserLogin|oamelda]], im Nutzerrechte zu ändern.",
-       "userrights-notallowed": "Du besitzt ne de erforderlichen Berechtigunga, im Nutzerrechte zu vergahn.",
        "userrights-changeable-col": "Gruppazugehierigkeit, de du ändern koast",
        "userrights-unchangeable-col": "Gruppazugehierigkeit, de du ne ändern koast",
        "group-sysop": "Administratora",
        "right-protect": "Seytaschutzstatus ändern",
        "right-editprotected": "Geschitzte Seita bearbta (ohne Kaskadenschutz)",
        "right-editinterface": "Nutzeräberfläche bearbta",
-       "right-editusercssjs": "Fremde CSS- und JavaScript-Dateien bearbta",
        "right-editusercss": "Fremde CSS-Dateien bearbta",
        "right-edituserjs": "Fremde JavaScript-Dateien bearbta",
        "right-rollback": "Schnelles zerrickesetza",
        "rcshowhideanons": "Unangemeldete Benutzer $1",
        "rcshowhidepatr": "Kontrollierte Änderunga $1",
        "rcshowhidemine": "Eegene Beiträge $1",
-       "rclinks": "Zeige de letzta $1 Änneronga dar letzta $2 Taage.<br />$3",
+       "rclinks": "Zeige de letzta $1 Änneronga dar letzta $2 Taage.",
        "diff": "Unt.",
        "hist": "Versiona",
        "hide": "ausblenda",
        "undeleteviewlink": "oasahn",
        "undeleteinvert": "Auswoahl umkehra",
        "undeletecomment": "Begrindung:",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Version|$1 Versionen}} und {{PLURAL:$2|1 Datei|$2 Dateien}} wurden wiederhergestallt",
        "cannotundelete": "Wiederherstellung fehlgeschlaga; jemand anderes hoot de Seite bereits wiederhergestellt.",
        "undelete-header": "Siehe eim [[Special:Log/delete|Läsch-Logbuch]] noach kierzlich geläschta Seyta.",
        "undelete-search-box": "Noach geläschta Seita sucha",
        "htmlform-reset": "Änderunga rickgängig macha",
        "htmlform-selectorother-other": "Ondere",
        "revdelete-restricted": "Einschränkungen gelten au fier Administratorn",
-       "revdelete-unrestricted": "Einschränkungen fier Administratorn uffgehobn",
-       "revdelete-summary": "Zusommafoassungskommentar"
+       "revdelete-unrestricted": "Einschränkungen fier Administratorn uffgehobn"
 }
index 4d477e9..4095fc8 100644 (file)
        "rcshowhideanons": "$1 anonyyme nuhtjienh",
        "rcshowhidepatr": "$1 dååhkasjehtedh värrhtoedimmieh",
        "rcshowhidemine": "$1 mov värrhtoedimmieh",
-       "rclinks": "Vuesehte männgan $1 värrhtoedimmieh nuelesne männgan $2 biejjieh<br />$3",
+       "rclinks": "Vuesehte männgan $1 värrhtoedimmieh nuelesne männgan $2 biejjieh",
        "diff": "joekehts",
        "hist": "hist",
        "hide": "Gaptjedh",
index 6df0bf4..7d94fa6 100644 (file)
@@ -13,6 +13,7 @@
        "tog-hideminor": "Qari bedelada yar ee isbedelada dhow",
        "tog-hidepatrolled": "Qari wax bedelkii ugu danbeeyay oo la waardiyeeyay",
        "tog-newpageshidepatrolled": "Ka qari maqaalada la waardiyeeyay maqaalada kale ee cusub",
+       "tog-hidecategorization": "Qari qeybinla bogagga",
        "tog-extendwatchlist": "Balaari liiska waardiyaha si loo arko dhamaan isbedelada, ma ahan oo kaliya kuwa dhow",
        "tog-usenewrc": "Isticmaal isbdelada dhowdhow oo la'horumariyey (waxaa loo baahanyahay JavaScript)",
        "tog-numberheadings": "Lambarada automaatik ahaan u tirinaayo Cinwaanada",
        "password-change-forbidden": "Ma badali kartid Eraysir ee wiki.",
        "login": "Gudaha gal",
        "nav-login-createaccount": "Gudaha gal / sameyso akoon",
-       "userlogin": "Gudaha gal / sameyso akoon",
-       "userloginnocreate": "Gudaha gal",
        "logout": "Ka bax",
        "userlogout": "Ka bax",
        "notloggedin": "Gudaha kuma jirtid",
        "userlogin-noaccount": "Akoon ma lihid?",
        "userlogin-joinproject": "Ku biir {{SITENAME}}",
-       "nologin": "Akoon ma lihid? $1.",
-       "nologinlink": "Akoon sameyso",
        "createaccount": "Sameey gudagale",
-       "gotaccount": "Waan heystaa gudagale? '''$1'''.",
-       "gotaccountlink": "Gudaha gal",
-       "userlogin-resetlink": "Ma ilaawday tafaasiisha gudagalahaada?",
        "userlogin-resetpassword-link": "Dib usoo cesho erey sirtaada",
        "userlogin-helplink2": "Caawinaad habka gudagalka",
        "createacct-emailoptional": "Ciwaanka e-mail-ka (dooqasho)",
        "createacct-email-ph": "Gali Ciwaankaada e-mail-ka",
        "createaccountmail": "E-mail ahaan",
-       "createaccountreason": "Sababta:",
        "createacct-submit": "Sameeyso akoonkaada",
        "createacct-benefit-heading": "Bogga {{SITENAME}} waxaa sameeyey dad kula mid ah.",
        "createacct-benefit-body1": "{{PLURAL:$1|bedel|bedelaadyo}}",
        "recentchanges-label-plusminus": "Qaadka bogga wuxuu ku bedelmay tirada halbeega baytka",
        "recentchanges-legend-heading": "<strong>Sharaxaad:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sidoo kale eeg [[Special:NewPages|liiska bogagga cusub]])",
+       "rcfilters-activefilters": "Shaandhayn firfircoon",
+       "rcfilters-clear-all-filters": "Tirtir dhammaan shaandhada",
+       "rcfilters-search-placeholder": "Shaandhee isbeddellada ugu cusub (Mushaax ama gudagal qorista)",
+       "rcfilters-highlightbutton-title": "Barashada natiijooyinka",
+       "rcfilters-filtergroup-registration": "Diiwaan-galinta adeegsadaha",
+       "rcfilters-filter-registered-description": "Wax beddelayaasha gudaha ku jira",
+       "rcfilters-filter-unregistered-label": "Aan diiwaanka ku jirin",
+       "rcfilters-filter-unregistered-description": "Wax baddelayasha aan diiwaanka ku jirin",
+       "rcfilters-filter-humans-label": "Dad (maaha bot)",
+       "rcfilters-filter-pageedits-label": "Beddelka bogga",
+       "rcfilters-filter-newpages-label": "Bogagga la sameeyay",
+       "rcfilters-filter-logactions-label": "Diiwaan-galinta howlaha",
        "rcnotefrom": "Hoostaan waa isbedaladii dhacay  '''$2''' (waxaad arkoosaa ilaa '''$1''' ).",
        "rclistfrom": "Itusi isbedelada cusub oo ka bilaabaneyso $3 $2",
        "rcshowhideminor": "$1 bedelada yar",
        "rcshowhidepatr-show": "I tus",
        "rcshowhidemine": "$1 wax badalkeyga",
        "rcshowhidemine-show": "I tus",
-       "rclinks": "Itusi isbadeladii  $1 ee ugu danbeeyay oo dhacay wixii ka danbeeyay $2 maalmood<br />$3",
+       "rclinks": "Itusi isbadeladii  $1 ee ugu danbeeyay oo dhacay wixii ka danbeeyay $2 maalmood",
        "diff": "duwanaan",
        "hist": "taariikh",
        "hide": "Qari",
        "filedelete-edit-reasonlist": "Wax ka bedel sababta loo tirtiray",
        "mimesearch": "MIME  raadi",
        "randompage": "Ku nasiibso bog",
+       "statistics-edits": "Wax ka bedelka bogagga laga soo bilaabo markii la sameeyay {{SITENAME}}",
        "brokenredirects-edit": "wax ka bedel",
        "brokenredirects-delete": "tirtir",
        "withoutinterwiki-submit": "I tus",
        "undeletebtn": "Sooceli",
        "undeletelink": "fiiri/mar kale sameey",
        "undeleteviewlink": "itusi",
-       "undeletedrevisions": "$1 {{PLURAL:$1|revision|revisions}} restored",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|revision|revisions}} and $2 {{PLURAL:$2|file|files}} restored",
-       "undeletedfiles": "$1 {{PLURAL:$1|file|files}} restored",
        "cannotundelete": "Soo celinta ma' suurto galin; waxaa laga yaabaa in qofkale uu horay u soo celyey bogga.",
        "undelete-search-box": "Raadi bogagga la tirtiray",
        "undelete-search-prefix": "I'tus boggaga ku bilaawda:",
        "sp-contributions-search": "Raadi si aad wax uugu darsatid",
        "sp-contributions-username": "Ciwaanka IP:ga  ama  magaca isticmaalaha:",
        "sp-contributions-toponly": "itusi kaliya badalyada ah kuwii ugu danbeeyay oo wax laga badalay",
+       "sp-contributions-newonly": "Itus kaliya bogagga la sameeyay",
        "sp-contributions-submit": "Raadi",
        "whatlinkshere": "Maxaa meeshaan la xiriiro",
        "whatlinkshere-title": "Boggaga la xiriiro \"$1\"",
        "whatlinkshere-hideredirs": "$1 loo sii toosiyay",
        "whatlinkshere-hidelinks": "$1 wuxuu la xiriiraa",
        "whatlinkshere-hideimages": "$1 sawirka inta oo la xiriiro",
+       "whatlinkshere-filters": "Shaandhooyin",
        "ipboptions": "2 saacadood:2 hours,1 maalin:1 day,3 maalmood:3 days,1 usbuuc:1 week,2 isbuuc:2 weeks,1 bil:1 month,3 bilood:3 months,6 bilood:6 months,1 sano:1 year,daa'im:infinite",
        "ipblocklist": "isticmaalada la mamnuucay",
        "ipblocklist-submit": "Raadi",
        "othercontribs": "Waxay ku saleysantahay shaqada $1.",
        "pageinfo-title": "Macluumaad ku saabsan \"$1\"",
        "pageinfo-header-basic": "Macluumaadka asaasiga ah",
+       "pageinfo-firstuser": "Sameeyaha bogga",
        "pageinfo-toolboxlink": "Macluumad ku saabsan",
        "previousdiff": "← bedelkii ka duqsanaa",
        "nextdiff": "Bedelkii ugu cusbaa →",
        "rightsnone": "(waxna)",
        "feedback-message": "Fariinta:",
        "searchsuggest-search": "Raadi",
-       "api-error-copyuploaddisabled": "Soo gelinta dhinaca URL-ka waa laga damiyay kombiyuutarkaan",
-       "api-error-filename-tooshort": "Magaca faylka aad oo u gaabanyahay",
-       "api-error-filetype-banned": "Faylka nuucaan waa laga mamnuucay",
-       "api-error-http": "Qalad gudaha ah: Ma ku xiro karo kombiyutarka",
-       "api-error-illegal-filename": "Magaca faylkaan lama ogola.",
-       "api-error-mustbeloggedin": "Waa in aad gudaha u soo gashaa hadii aad rabtid in aad fayl soo geliso.",
-       "api-error-ok-but-empty": "Qalad gudaha ah : kombiyutarka maka soo jawaabin",
-       "api-error-unclassified": "Qalad la aqoon aa dhacay",
-       "api-error-unknown-code": "Qalad la aqoon: \"$1\"",
        "api-error-unknown-warning": "Digniin la aqoon: $1",
-       "api-error-uploaddisabled": "Soo gelinta waa laga xiray wikigaan.",
        "limitreport-title": "Faahfaahin caddeymo:",
        "limitreport-cputime": "Waqtiga adeegsiga CPU",
        "limitreport-walltime": "Waqtiga dhabta ah adeegsiga",
index bc98608..8b091e0 100644 (file)
@@ -31,7 +31,9 @@
                        "Liridon",
                        "Ammartivari",
                        "Kosovastar",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Arianit",
+                       "Denisa"
                ]
        },
        "tog-underline": "Nënvizimi i lidhjes:",
@@ -75,7 +77,7 @@
        "tog-diffonly": "Mos trego përmbajtjen e faqes nën diff-e",
        "tog-showhiddencats": "Trego kategoritë e fshehura",
        "tog-norollbackdiff": "Mos trego ndrysh pas kryerjes së një rikthkimi",
-       "tog-useeditwarning": "Më paralajmëro kur unë lë një redaktim faqeje me ndryshime të paruajtura",
+       "tog-useeditwarning": "Më paralajmëro kur lë një redaktim faqeje me ndryshime të paruajtura",
        "tog-prefershttps": "Gjithmonë përdorni një lidhje të sigurt kur të kyçur",
        "underline-always": "Gjithmonë",
        "underline-never": "Asnjëherë",
        "searcharticle": "Shko",
        "history": "Historiku i faqes",
        "history_short": "Historiku",
+       "history_small": "historiku",
        "updatedmarker": "përditësuar që nga vizita ime e fundit",
        "printableversion": "Versioni i printueshëm",
        "permalink": "Lidhje e përhershme",
        "talk": "Diskutimet",
        "views": "Shikime",
        "toolbox": "Mjete",
+       "tool-link-userrights": "Ndrysho grupet e {{GENDER:$1|përdoruesit}}",
+       "tool-link-userrights-readonly": "Shiko grupet e {{GENDER:$1|përdoruesit}}",
        "tool-link-emailuser": "Dërgo email {{GENDER:$1|user}}",
        "userpage": "Shfaq faqen e përdoruesit",
        "projectpage": "Shfaq faqen e projektit",
        "redirectedfrom": "(Përcjellë nga $1)",
        "redirectpagesub": "Ridrejto faqen",
        "redirectto": "Ridrejto tek:",
-       "lastmodifiedat": "Kjo faqe është ndryshuar për herë te fundit më $1, në orën $2.",
+       "lastmodifiedat": "Kjo faqe është redaktuar për herë te fundit më $1, në orën $2.",
        "viewcount": "Kjo faqe është shikuar {{PLURAL:$1|një|$1 herë}} .",
        "protectedpage": "Faqe e mbrojtur",
        "jumpto": "Shko tek:",
        "mypreferencesprotected": "Ti nuk ke leje për të ndryshuar preferencat e tua.",
        "ns-specialprotected": "Faqet speciale nuk mund të redaktohen.",
        "titleprotected": "Ky titull është mbrojtur nga [[User:$1|$1]] dhe nuk mund të krijohet.\nArsyeja e dhënë është <em>$2</em>.",
-       "filereadonlyerror": "Nuk është në gjendje që të ndryshojë skedarin \"$1\" sepse depoja e skedarit \"$2\" është në formën vetëm-lexim.\n\nAdministratori i cili e mbylli atë e dha këtë shpjegim: \"$3\".",
+       "filereadonlyerror": "Nuk është në gjendje që të ndryshojë skedarin \"$1\" sepse depoja e skedarit \"$2\" është në formën vetëm-lexim.\n\nAdministratori sistemit i cili e mbylli atë e dha këtë shpjegim: \"$3\".",
        "invalidtitle-knownnamespace": "Titull jo i vlefshëm me hapësirën \"$2\" dhe teksti \"$3\"",
        "invalidtitle-unknownnamespace": "Titull jo i vlefshëm me numrin e panjohur të hapësirës së emrit $1 dhe tekstit \"$2\"",
        "exception-nologin": "I paqasur",
        "virus-scanfailed": "skanimi dështoi (code $1)",
        "virus-unknownscanner": "antivirus i pa njohur:",
        "logouttext": "'''Ju keni dalë jashtë.''' \n \n Kini parasysh që disa faqe mund të shfaqen sikur të ishit i identifikuar derisa të fshini ''cache''-in e shfletuesit tuaj.",
+       "cannotlogoutnow-title": "Nuk mund të çkyçeni tani",
+       "cannotlogoutnow-text": "Çregjistrimi nuk është i mundur kur përdorni $1.",
        "welcomeuser": "Mirë se vini, $1!",
        "welcomecreation-msg": "Llogaria e jote u krijua. \nMos harro të ndryshosh [[Special:Preferences|{{SITENAME}} parapëlqimet]] e tua.",
        "yourname": "Fusni nofkën tuaj",
        "createacct-yourpasswordagain-ph": "Shtypni fjalëkalimin përsëri",
        "userlogin-remembermypassword": "Më mbaj të kyçur",
        "userlogin-signwithsecure": "Përdor lidhje të sigurtë",
+       "cannotlogin-title": "Nuk mund të kyçeni",
+       "cannotlogin-text": "Identifikimi nuk është i mundur",
+       "cannotloginnow-title": "Nuk mund të identifikoheni tani",
+       "cannotloginnow-text": "Identifikimi nuk është i mundur kur përdorni $1.",
+       "cannotcreateaccount-title": "Nuk mund të krijoni llogari",
+       "cannotcreateaccount-text": "Krijimi direkt i llogarisë nuk është i mundur në këtë wiki.",
        "yourdomainname": "Faqja juaj",
        "password-change-forbidden": "Ju nuk mund të ndryshoni fjalëkalimet në këtë wiki.",
        "externaldberror": "Ose kishte një gabim tek regjistri i identifikimit të jashtëm, ose nuk ju lejohet të përtërini llogarinë tuaje të jashtme.",
        "login": "Hyni",
        "login-security": "Verifiko identitetin tuaj",
        "nav-login-createaccount": "Hyni ose hapni një llogari",
-       "userlogin": "Hyni / hapni llogari",
-       "userloginnocreate": "Hyni",
        "logout": "Dalje",
        "userlogout": "Dalje",
        "notloggedin": "Nuk keni hyrë brenda",
        "userlogin-noaccount": "Nuk keni një llogari?",
        "userlogin-joinproject": "Bashkohu me ne në {{SITENAME}}",
-       "nologin": "Nuk keni një llogari? '''$1'''.",
-       "nologinlink": "Hapeni",
        "createaccount": "Hap një llogari",
-       "gotaccount": "Keni një llogari? '''$1'''.",
-       "gotaccountlink": "Identifikohuni",
-       "userlogin-resetlink": "Ke harruar të dhënat e tua të identifikimit?",
        "userlogin-resetpassword-link": "Keni harruar fjalëkalimin?",
        "userlogin-helplink2": "Ndihmë rreth identifikimit",
        "userlogin-loggedin": "Ju tashmë jeni i regjistruar si {{GENDER:$1|$1}}.\nPërdore formularin më poshtë për të hyrë si një përdorues tjetër.",
+       "userlogin-reauth": "Duhet të identifikoheni përsëri për të verifikuar që jeni {{GENDER:$1|$1}}",
        "userlogin-createanother": "Krijo një llogari tjeter",
        "createacct-emailrequired": "Posta elektronike",
        "createacct-emailoptional": "Adresa Elektronike (me dëshirë)",
        "createacct-email-ph": "Fusni adresën tuaj elektronike",
        "createacct-another-email-ph": "Vendos adresën e postës elektronike",
        "createaccountmail": "Përdorni një fjalëkalim të përkohshëm të rastit dhe  dërgojeni atë në adresën e specifikuar te email",
+       "createaccountmail-help": "Mund të përdoret për të krijuar llogari për një person tjetër pa njohur fjalëkalimin.",
        "createacct-realname": "Emri i vërtetë (me dëshirë)",
-       "createaccountreason": "Arsyeja:",
        "createacct-reason": "Arsyeja",
        "createacct-reason-ph": "Pse ju jeni duke krijuar një llogari tjetër",
+       "createacct-reason-help": "Mesazhi tregohet në identifikimin e krijimit të llogarisë.",
        "createacct-submit": "Krijoni llogarinë tuaj",
        "createacct-another-submit": "Krijo një llogari",
+       "createacct-continue-submit": "Vazhdo krijimin e llogarisë",
+       "createacct-another-continue-submit": "Vazhdo krijimin e llogarisë",
        "createacct-benefit-heading": "{{SITENAME}} është bërë nga njerëz si ju.",
        "createacct-benefit-body1": "{{PLURAL:$1|redaktim|redaktime}}",
        "createacct-benefit-body2": "{{PLURAL:$1|faqe|faqe}}",
        "nocookiesnew": "Llogaria e përdoruesit u krijua por ti nuk je identifikuar akoma.\n{{SITENAME}} shfrytëzon \"cookies\" për të identifikuar përdoruesit.\nTi ke çaktivizuar e \"cookies\".\nTë lutem, avktizo ato, pastaj identifikohu emrin e ri të përdoruesit dhe fjalëkalimin.",
        "nocookieslogin": "{{SITENAME}} shfrytëzon \"cookies\" për identifikimin e përdoruesve.\nYou nuk lejoni shfrytëzimin e \"cookies\".\nJu lutemi, lejoni shfrytëzimin e \"cookies\" dhe provojeni përsëri.",
        "nocookiesfornew": "Llogaria e përdoruesit nuk u krijua, pasi ne nuk mund të konfirmojmë burimin e tij.\nSigurohuni që ju lejoni shfrytëzimin e \"cookies\", rifreskoni këtë faqe dhe provojen përsëri.",
+       "createacct-loginerror": "Llogaria u krijua me sukses, por ju nuk mund të identifikoheni automatikisht. Ju lutem vazhdoni tek [[Special:UserLogin|manual login]].",
        "noname": "Nuk keni dhënë një emër përdoruesi të pranueshëm.",
-       "loginsuccesstitle": "Identifikim i suksesshëm",
+       "loginsuccesstitle": "I/e identifikuar",
        "loginsuccess": "'''Ju tani jeni identifikuar tek {{SITENAME}} si \"$1\".'''",
-       "nosuchuser": "Nuk ka ndonjë përdorues me emrin \"$1\".\nKontrolloni shkrimin ose [[Special:CreateAccount|hapni një llogari të re]].",
+       "nosuchuser": "Nuk ka ndonjë përdorues me emrin \"$1\".\nEmri përdoruesit është i ndjeshëm ndaj madhësisë së gërmave.\nKontrolloni shkrimin ose [[Special:CreateAccount|hapni një llogari të re]].",
        "nosuchusershort": "Nuk ka asnjë përdorues me emrin \"$1\".",
        "nouserspecified": "Ju duhet të jepni një nofkë",
        "login-userblocked": "Ky përdorues është bllokuar. Identifikimi nuk lejohet.",
        "wrongpasswordempty": "Fjalëkalimi juaj ishte bosh. Ju lutemi provoni përsëri.",
        "passwordtooshort": "Fjalëkalimi juaj është i pavlefshëm ose tepër i shkurtër. Ai duhet të ketë së paku {{PLURAL:$1|1 shkronjë|$1 shkronja}} dhe duhet të jetë i ndryshëm nga emri i përdoruesit.",
        "passwordtoolong": "Fjalëkalimet nuk mund të jenë më të gjatë se {{PLURAL:$1|1 karakter|$1 karaktere}}.",
+       "passwordtoopopular": "Fjalëkalimet e zgjedhura rregullisht nuk mund të përdorën. Ju lutemi zgjedhni një fjalëkalim më unik.",
        "password-name-match": "Fjalëkalimi juaj duhet të jetë i ndryshëm nga emri juaj.",
        "password-login-forbidden": "Përdorimi i kësaj nofke dhe fjalëkalimi është i ndaluar.",
        "mailmypassword": "Ridergo fjalekalimin",
        "noemail": "Regjistri nuk ka adresë për përdoruesin \"$1\".",
        "noemailcreate": "Ju duhet të sigurojë një adresë e e-mailit të saktë.",
        "passwordsent": "Një fjalëkalim i ri është dërguar tek adresa e regjistruar për \"$1\". Provojeni përsëri hyrjen mbasi ta keni marrë fjalëkalimin.",
-       "blocked-mailpassword": "IP adresa juaj është bllokuar , si e tillë nuk lejohet të përdor funksionin pë rikthim të fjalkalimit , në mënyrë që të parandalohet abuzimi.",
+       "blocked-mailpassword": "Adresa IP e juaj është bllokuar për redaktim. Për të parandaluar abuzimin, nuk lejohet të përdoret funksioni pë rikthim të fjalëkalimit nga kjo adresë IP.",
        "eauthentsent": "Një email konfirmimi është dërguar në adresën e caktuar  të e-mailit.\nParase te dergohen emaile të tjerë  në llogarinë tuaj, duhet të ndiqni udhëzimet në email, për të konfirmuar se llogaria është  vërtetë e juaja.",
        "throttled-mailpassword": "Një kujtesë e fjalëkalimit është dërguar gjatë {{PLURAL:$1|orës|$1 orëve}} të kaluara. Për t'u mbrojtur nga abuzime vetëm një kujtesë dërgohet çdo {{PLURAL:$1|orë|$1 orë}}.",
        "mailerror": "Gabim duke dërguar postën: $1",
-       "acct_creation_throttle_hit": "Nuk lejoheni të krijoni më llogari pasi keni krijuar {{PLURAL:$1|1|$1}}.",
+       "acct_creation_throttle_hit": "Vizitorët në këtë wiki duke përdorur adresën tuaj IP kanë krijuar {{PLURAL:$1|1 llogari|$1 llogari}} në $2 e fundit, që është maksimumi i lejuar në këtë periudhë kohore.\nSi rezultat, vizitorët duke përdorur këtë adresë IP nuk mund të krijojnë llogari tjetër në këtë moment.",
        "emailauthenticated": "Adresa juaj është vërtetuar më $2 $3.",
        "emailnotauthenticated": "Adresa juaj email nuk është  konfirmuar ende.\nAsnjë email nuk do të dërgohet për ndonjë nga karakteristikat e mëposhtme.",
        "noemailprefs": "Detyrohet një adresë email-i për të përdorur këtë mjet.",
        "createaccount-title": "Hapja e llogarive për {{SITENAME}}",
        "createaccount-text": "Dikush ka përdorur adresën tuaj për të hapur një llogari tek {{SITENAME}} ($4) të quajtur \"$2\" me fjalëkalimin \"$3\".\nDuhet të hyni brenda dhe të ndërroni fjalëkalimin tani nëse ky person jeni ju. Përndryshe shpërfilleni këtë mesazh.",
        "login-throttled": "Keni bërë shumë tentime të njëpasnjëshme në fjalëkalimin e kësaj llogarie. Ju lutemi prisni para se te tentoni përsëri.",
-       "login-abort-generic": "login juaj ishte i pasuksesshëm - Ndërpre",
+       "login-abort-generic": "Regjistrimi juaj ishte i pasuksesshëm - U ndërpre",
        "login-migrated-generic": "Llogaria juaj ka emigruar, dhe emri juaj nuk ekzistojnë më në këtë wiki.",
        "loginlanguagelabel": "Gjuha: $1",
        "suspicious-userlogout": "Kërkesa juaj për të shkëputet u mohua sepse duket sikur është dërguar nga një shfletues të thyer ose caching proxy.",
        "changepassword-success": "Fjalëkalimi yt është ndryshuar.",
        "changepassword-throttled": "Keni bërë shumë tentime të njëpasnjëshme në fjalëkalimin e kësaj llogarie. Ju lutemi prisni para se te tentoni përsëri.",
        "botpasswords": "Bot fjalëkalimet",
+       "botpasswords-summary": "<em>Fjalëkalimi Botit</em> mundëson hyrjen në një llogari përdoruesi nëpërmjet API pa përdorur kredencialet kryesore të identifikimit. Të drejtat e përdoruesit janë të kufizuara kur identifikoheni me një fjalëkalim boti.\n\nNëse nuk e dini përse doni ta bëni këtë, më mirë mos e bëni. Asnjë nuk duhet t'iu kërkoj të gjeneroni një nga këto dhe tua dërgoni atyre.",
+       "botpasswords-disabled": "Fjalëkalimet e botit janë të padisponueshme.",
+       "botpasswords-no-central-id": "Për të përdorur fjalëkalimet e botit, duhet të identifikoheni në një llogari të centralizuar.",
+       "botpasswords-existing": "Fjalëkalimet ekzistuese të boteve.",
+       "botpasswords-createnew": "Krijo një fjalëkalim të ri boti",
+       "botpasswords-editexisting": "Redakto një fjalëkalim ekzistues boti",
+       "botpasswords-label-appid": "Emri botit:",
        "botpasswords-label-create": "Krijo",
        "botpasswords-label-update": "Përditëso",
        "botpasswords-label-cancel": "Anulo",
        "botpasswords-label-delete": "Fshi",
        "botpasswords-label-resetpassword": "Rivendos fjalëkalimin",
+       "botpasswords-label-grants": "Bursa të aplikueshme:",
+       "botpasswords-help-grants": "Bursat lejojnë hyrje në të drejtat e zotëruara nga llogaria juaj e përdoruesit.Mundësimi i një burse këtu nuk mundëson hyrje në asnjë të drejtë që llogaria juaj e përdoruesit nuk mund t'i ketë. Shikoni  [[Special:ListGrants|tabela e bursave]] për më tepër informacion.",
+       "botpasswords-label-grants-column": "Lejuar",
+       "botpasswords-bad-appid": "Emri i botit \"$1\" nuk është i vlefshëm.",
+       "botpasswords-insert-failed": "Dështoi për të shtuar emrin e botit \"$1\". është shtuar tashmë?",
        "botpasswords-update-failed": "Dështoi për të përditësuar emrin e bot \"$1\". Ishte fshirë?",
+       "botpasswords-created-title": "Fjalëkalimi botit u krijua",
+       "botpasswords-updated-title": "Fjalëkalimi i botit u freskua",
+       "botpasswords-deleted-title": "Fjalëkalimi i botit u fshih",
+       "botpasswords-deleted-body": "Fjalëkalimi i botit për botin me emër \"$1\" të përdoruesit \"$2\" u fshi.",
        "resetpass_forbidden": "Fjalëkalimet nuk mund të ndryshohen",
+       "resetpass_forbidden-reason": "Nuk mund të ndërrohet fjalëkalimi: $1",
        "resetpass-no-info": "Duhet të jeni i kyçur që të keni qasje direkte në këtë faqe.",
        "resetpass-submit-loggedin": "Ndrysho fjalëkalimin",
        "resetpass-submit-cancel": "Anulo",
-       "resetpass-wrong-oldpass": "Fjalëkalimi momental ose i përkohshëm nuk është i vlefshëm. Ndoshta tanimë me sukses keni ndërruar fjalëkalimin, ose keni kërkuar fjalëkalim të përkohshëm.",
+       "resetpass-wrong-oldpass": "Fjalëkalimi momental ose i përkohshëm nuk është i vlefshëm. \nNdoshta tanimë me sukses keni ndërruar fjalëkalimin, ose keni kërkuar fjalëkalim të përkohshëm.",
        "resetpass-recycled": "Ju lutemi rivendosni fjalëkalimin tuaj për diçka tjetër përveç fjalëkalimin tuaj të tanishme.",
        "resetpass-temp-emailed": "Ju keni hyrë në me një koditë përkohshme të dërguar me email .\nPër të përfundojë logging in, ju duhet të vendosni një fjalëkalim të ri këtu:",
        "resetpass-temp-password": "Fjalëkalimi i përkohshëm:",
        "resetpass-abort-generic": "Ndryshimi i fjalëkalimi  dështoi nga një zgjerim.",
        "resetpass-expired": "Fjalëkalimin tuaj ka skaduar. Ju lutem vendosni një fjalëkalim të ri për të hyr.",
        "resetpass-expired-soft": "Fjalëkalimi juaj ka skaduar dhe duhet të rivendoset. Ju lutem zgjidhni një fjalëkalim të ri tani, ose klikoni \"{{int:authprovider-resetpass-skip-label}}\" për ta rivendosur më vonë.",
-       "resetpass-validity-soft": "Fjalëkalimi juaj ka skaduar dhe duhet të rivendoset. Ju lutem zgjidhni një fjalëkalim të ri tani, ose klikoni \"{{int:authprovider-resetpass-skip-label}}\" për ta rivendosur më vonë.",
+       "resetpass-validity-soft": "Fjalëkalimi juaj ka skaduar:$1\n\nJu lutem zgjidhni një fjalëkalim të ri tani, ose klikoni \"{{int:authprovider-resetpass-skip-label}}\" për ta rivendosur më vonë.",
        "passwordreset": "Ndrysho fjalkalimin",
        "passwordreset-text-one": "Plotësoni këtë formular për të marrë një fjalëkalim të përkohshëm nëpërmjet postës elektronike.",
        "passwordreset-text-many": "{{PLURAL:$1|Mbush një nga fushat për të marrë një fjalëkalim të përkohshëm nëpërmjet postës elektronike.}}",
        "passwordreset-emailtext-user": "Përdoruesi  $1 në {{SITENAME }} ka kërkuar një kujtesë për të dhënat e llogarisë suaj për {{SITENAME }} ($4). Përdoruesi në vijim {{PLURAL:$3 | llogaria ë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ë në {{PLURAL:$5 | një ditë | $5 ditë}}.\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.",
        "passwordreset-emailelement": "Emri i përdoruesit: \n$1\n\nFjalëkalimi i përkohshëm: \n$2",
        "passwordreset-emailsentemail": "Nëse kjo është një adresë emaili e regjistruar për llogarinë tuaj, atëherë një email për rivendosjen e fjalëkalimit do të dërgohet.",
+       "passwordreset-emailsentusername": "Nëse një adresë emaili e regjistruar për llogarinë tuaj, atëherë një email për rivendosjen e fjalëkalimit do të dërgohet.",
+       "passwordreset-invalidemail": "Adresë e-mail-i e pavlefshme",
+       "passwordreset-nodata": "Nuk është dhënë as emri i përdoruesit e as adresa e emailit",
        "changeemail": "Ndrysho ose hiq postën elektronike",
-       "changeemail-header": "Ndrysho llogarinë e adresës së postës elektronike",
+       "changeemail-header": "Plotësoni këtë formular për të ndryshuar adresën tuaj të postës elektronike. Nëse do të donit për të hequr ndërlidhjen e ndonjë adrese email nga llogaria juaj, lëreni bosh adresën e re të email-it kur të dorëzoni formularin.",
        "changeemail-no-info": "Ju duhet të identifikoheni në mënyrë që të keni të drejtë hyrjeje në këtë faqe.",
        "changeemail-oldemail": "Adresa aktuale e emailit:",
        "changeemail-newemail": "Adresa e re e emailit:",
+       "changeemail-newemail-help": "Kjo fushë duhet të lihet bosh në qoftë se dëshironi të hiqni adresën tuaj të emailit. Nuk do të jeni në gjendje për të resetuar fjalëkalimin e harruar dhe nuk do të merrni email nga kjo wiki nëse adresa e postës elektronike është hequr.",
        "changeemail-none": "(asgjë)",
        "changeemail-password": "Fjalëkalimi juaj i {{SITENAME}}:",
        "changeemail-submit": "Ndrysho postën elektronike",
        "changeemail-throttled": "Ju keni bërë shumë tentativa hyrjeje.\nJu lutemi prisni $1 përpara se të provoni sërish.",
        "changeemail-nochange": "Të lutem shkruaj një tjetër adresë emaili.",
        "resettokens": "Rivendos tokens",
+       "resettokens-no-tokens": "Nuk ka tokena për të resetuar.",
+       "resettokens-tokens": "Tokenët:",
        "resettokens-token-label": "$1 (vlera aktuale: $2)",
+       "resettokens-done": "Tokenët u resetuan.",
+       "resettokens-resetbutton": "Reseto tokenët e zgjedhur",
        "bold_sample": "Stil i theksuar i tekstit",
        "bold_tip": "Stil i theksuar i tekstit",
        "italic_sample": "Tekst i pjerrët",
        "sig_tip": "Firma juaj me gjithë kohë",
        "hr_tip": "vijë horizontale (përdoreni rallë)",
        "summary": "Përmbledhje:",
-       "subject": "Subjekt/titull:",
+       "subject": "Subjekt:",
        "minoredit": "Ky është një redaktim i vogël",
        "watchthis": "Vëzhgoje këtë faqe",
        "savearticle": "Kryej ndryshimet",
        "preview": "Shqyrto",
        "showpreview": "Shfaq për shqyrtim",
        "showdiff": "Trego ndryshimet",
-       "blankarticle": "<strong>Kujdes:</strong> Faqja që po krijoni është boshe.\nNëse klikoni \"{{int:savearticle}}\" përsëri, faqja do të krijohet pa ndonjë përmbajtje.",
+       "blankarticle": "<strong>Kujdes:</strong>Faqja që po krijoni është boshe.\nNëse klikoni \"$1\" përsëri, faqja do të krijohet pa ndonjë përmbajtje.",
        "anoneditwarning": "<strong>Kujdes:</strong> Ju nuk jeni të regjistruar. Adresa juaj IP do të jetë e dukshme publikisht në ju bëni ndonjë redaktim. Nëse <strong>[$1 hyni]</strong> ose <strong>[$2 krijoni një llogari]</strong>, redaktimet tuaja do t'i atribuohen emrit tuaj të përdoruesit, së bashku me përfitime të tjera.",
        "anonpreviewwarning": "\"Ju nuk jeni identifikuar. Ruajtja e ndryshimeve do të bëjë që adresa juaj IP të regjistrohet në historikun e redaktimeve të kësaj faqeje.\"",
-       "missingsummary": "'''Vërejtje:''' Ju nuk keni lënë shënim për redaktimet e kryera.\nNëse klikoni \"{{int:savearticle}}\" përsëri, redaktimet tuaja do të ruhen pa shënim.",
+       "missingsummary": "'''Vërejtje:''' Ju nuk keni lënë shënim për redaktimet e kryera.\nNëse klikoni \"$1\" përsëri, redaktimet tuaja do të ruhen pa shënim.",
        "missingcommenttext": "Ju lutemi bëni një koment më poshtë.",
-       "missingcommentheader": "'''Kujdes:''' Ju nuk keni dhënë një titull për këtë koment.\nNëse kryeni ndryshimet redaktimi juaj do të ruhet pa titull.",
-       "summary-preview": "Shqyrto përmbledhjen:",
-       "subject-preview": "Shqyrto titullin/subjektin:",
+       "missingcommentheader": "<strong>Kujdes:</strong>'''Nuk keni dhënë një titull për këtë koment.\nNëse klikoni \"$1\" prapë, redaktimi juaj do të ruhet pa titull.",
+       "summary-preview": "Parapamje e përmbledhjes së redaktimit:",
+       "subject-preview": "Parapamje e subjektit:",
        "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.",
+       "systemblockedtext": "Emri juaj i përdoruesit ose adresa e IP-së janë bllokuar automatikisht nga MediaWiki. \nArsyeja e dhënë është:\n\n:<em>$2</em>\n\n* Fillimi i bllokimit: $8\n* Kalimi i kohës së bllokimit: $6\n* Zgjatja e bllokimit: $7\n\nAdresa juaj e IP-së është $3.\nJu lutemi jepni të gjitha këto detaje në çfarëdo pyetje që bëni.",
        "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.",
        "accmailtext": "Një fjalëkalim i krijuar në mënyrë të rastësishme për [[User talk:$1|$1]] u dërgua në $2.\n\nFjalëkalimi për këtë llogari mund të ndryshohet në faqen ''[[Special:ChangePassword|ndrysho fjalëkalimin]]'' pasi të jeni identifikuar.",
        "newarticle": "(I ri)",
        "newarticletext": "Ti ke ndjekur nje lidhje drejt një faqeje që nuk ekziston.\nPër ta krijuar këtë faqe, fillo të shkruash në kutinë e mëposhtme (shih [$1 faqen e ndihmës] për më shumë informacion).\nNëse ti ke mbërritur këtu gabimisht, atëherë kliko butonin '''pas''' të shfletuesit tënd.",
-       "anontalkpagetext": "----'' Kjo është një faqe diskutimi për një përdorues anonim i cili nuk ka krijuar akoma një llogari, ose qe nuk e përdor atë. \n Prandaj, ne duhet të përdorim adresën IP numerike për identifikimin e tij. \nKjo adresë IP mund të përdoret nga disa përdorues.\n Në qoftë se jeni një përdorues anonim dhe mendoni se ndaj jush janë bërë komente të parëndësishme, ju lutem [[Special:CreateAccount|krijoni një llogari]] ose [[Special:UserLogin|identifikohuni]] për të shmangur konfuzionin në të ardhmen me përdorues të tjerë anonim .''",
+       "anontalkpagetext": "----\n<em>Kjo është një faqe diskutimi për një përdorues anonim i cili nuk ka krijuar akoma një llogari, ose qe nuk e përdor atë.</em> \nPrandaj, ne duhet të përdorim adresën IP numerike për identifikimin e tij. \nKjo adresë IP mund të përdoret nga disa përdorues.\nNë qoftë se jeni një përdorues anonim dhe mendoni se ndaj jush janë bërë komente të parëndësishme, ju lutem [[Special:CreateAccount|krijoni një llogari]] ose [[Special:UserLogin|identifikohuni]] për të shmangur konfuzionin në të ardhmen me përdorues të tjerë anonim.",
        "noarticletext": "Momentalisht nuk ka tekst në këtë faqe.\nJu mund [[Special:Search/{{PAGENAME}}|ta kërkoni këtë titull]] në faqe tjera,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} të kërkoni ngjarjet e ngjashme në regjistër],\nose [{{fullurl:{{FULLPAGENAME}}|action=edit}} të krijoni këtë faqe]</span>.",
        "noarticletext-nopermission": "Për momentin faqja e kërkuar është bosh.\nJu mund të [[Special:Search/{{PAGENAME}}|kërkoni këtë titiull]] në faqet e tjera, ose të <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} këtkoni regjistrat e ngjashëm]</span>, por ju nuk mundeni ta krijoni këtë faqe.",
        "missing-revision": "Inspektimi #$1 i faqes me emrin \"{{FULLPAGENAME}}\" nuk ekziston.\n\nKjo zakonisht shkaktuar duke ndjekur një lidhje të vjetër tek një faqe që është fshirë. Hollësitë mund të gjenden në [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} regjistrin e fshirjeve].",
        "userpage-userdoesnotexist": "Llogaria e përdoruesit \"<nowiki>$1</nowiki>\" nuk është e regjistruar. \nJu lutem kontrolloni nëse dëshironi të krijoni/redaktoni këtë faqe.",
        "userpage-userdoesnotexist-view": "Llogaria i përdoruesit \"$1\" nuk është e regjistruar.",
        "blocked-notice-logextract": "Ky përdorues është  aktualisht i bllokuar.\nMë poshtë mund t'i referoheni shënimit të regjistruar për bllokimin e fundit:",
-       "clearyourcache": "''Shënim:''' Pas ruajtjes, juve mund t'iu duhet të anashkaloni \"cache-in\" e shfletuesit tuaj për të parë ndryshimet. \n* '''Firefox / Safari:''' Mbaj të shtypur ''Shift'' ndërkohë që klikon ''Reload'', ose shtyp ''Ctrl-F5'' ose ''Ctrl-R'' (''⌘-R'' në Mac)\n* '''Google Chrome:''' Shtyp ''Ctrl-Shift-R'' (''''⌘-R'''' në Mac)\n* '''Internet Explorer:''' Mbaj të shtypur ''Ctrl''  ndërkohë që klikon ''Refresh'', ose shtyp ''Ctrl-F5''\n* '''Konqueror:''' Kliko ''Reload'' ose shtyp ''F5''\n* '''Opera:''' Zbrazni \"cache-in\" tek ''Tools → Preferences''",
+       "clearyourcache": "<strong>Shënim:</strong> Pas ruajtjes, juve mund t'iu duhet të anashkaloni \"cache-in\" e shfletuesit tuaj për të parë ndryshimet. \n* <strong>Firefox/Safari:</strong> Mbaj të shtypur <em>Shift</em> ndërkohë që klikon <em>Reload</em>, ose shtyp <em>Ctrl-F5</strong> ose <em>Ctrl-R</em> (<em>⌘-R</em> në Mac)\n* <strong>Google Chrome:</strong> Shtyp <em>Ctrl-Shift-R</em> (<strong>'⌘-R</strong>' në Mac)\n* <strong>Internet Explorer:</strong> Mbaj të shtypur <em>Ctrl</em>  ndërkohë që klikon <em>Refresh</em>, ose shtyp <em>Ctrl-F5</em> \n* <strong>Opera:</strong> Shkoni në <em>Menu → Settings</em> (<em>Opera → Preferences</em> në Mac) dhe pastaj në <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Këshillë:''' Përdorni butonin '{{int:showpreview}}' për të testuar CSS-në e re para se të ruani ndryshimet e kryera.",
        "userjsyoucanpreview": "'''Këshillë:''' Përdorni butonin '{{int:showpreview}}' për të testuar JavaScripting e ri para se të ruani ndryshimet e kryera.",
        "usercsspreview": "<strong>Vini re! Ju jeni duke inspektuar CSS-në si përdorues!\nNuk është ruajtur ende!</strong>",
        "previewnote": "'''Mos harro që kjo është vetëm një parapamje.'''\nNdryshimet e tua nuk janë ruajtur ende!",
        "continue-editing": "Shko në pjesën për redaktim",
        "previewconflict": "Kjo parapamje reflekton tekstin sipër kutisë së redaktimit siç do të duket kur të kryeni ndryshimin.",
-       "session_fail_preview": "'''Ju kërkojmë ndjesë! Redaktimi juaj nuk mund të perpunohej për shkak të humbjes së të dhënave të seancës.'''\nJu lutemi, provojeni përsëri.\nNëse përsëri nuk punon, provoni të [[Special:UserLogout|dilni nga faqja]] dhe të identifikoheni serish.",
-       "session_fail_preview_html": "'''Ju kërkojmë ndjesë! I pamundur përpunimi i redaktimeve tuaja për shkak të humbjes së të dhënave të seancës.'''\n'' Për shkak se {{SITENAME}} ka të aktivizuar përdorimin e HTML-së së papërpunuar, teksti për shqyrtim është fshehur si masë parandaluese kundër sulmeve JavaScript.''\n'''Nëse kjo është një përpjekje e sinqertë për redaktim, ju lutemi, provojeni përsëri.'''\nNëse përsëri nuk funksiono, provoni [[Special:UserLogout|të dilni nga faqja]] dhe të identifikoheni sërish.",
+       "session_fail_preview": "Ju kërkojmë ndjesë! Redaktimi juaj nuk mund të përpunohej për shkak të humbjes së të dhënave të seancës.'''\n\nNdoshta jeni ç'kyçur. <strong>Ju lutemi verifikoni që ende jeni i kyçur dhe provoni prap</strong>.  \nNëse përsëri nuk punon provoni të [[Special:UserLogout|dilni nga faqja]] dhe të identifikoheni serish, dhe konfirmoni që shfletuesi juaj i lejon biskotat nga ky sajt.",
+       "session_fail_preview_html": "Ju kërkojmë ndjesë! I pamundur përpunimi i redaktimeve tuaja për shkak të humbjes së të dhënave të seancës.'''\nPër<em> shkak se {{SITENAME}} ka të aktivizuar përdorimin e HTML-së së papërpunuar, teksti për shqyrtim është fshehur si masë parandaluese kundër sulmeve JavaScript.\n'</em>\n\n<strong>Nëse kjo është një përpjekje e sinqertë për redaktim, ju lutemi provojeni përsëri.</strong>\nNëse përsëri nuk funksionon provoni [[Special:UserLogout|të dilni nga faqja]] dhe të identifikoheni sërish, dhe konfirmoni që shfletuesi juaj lejon biskotat nga ky sajt.",
        "token_suffix_mismatch": "'''Redaktimi juaj nuk u pranuar pasi shërbimi juaj server  ka keqinterpretuar shenjat e pikësimit të simbolikës së redaktimit.'''\nRedaktimi nuk u pranua për të parandaluar korruptimin e tekstit në faqe.\nKjo ndodh ndonjëherë kur përdoret server anonim dytësor me gabime.",
        "edit_form_incomplete": "'''Disa pjesë të formularit të redaktimit nuk arritën në server; kontrolloni edhe një herë nëse redaktimet tuaja janë të paprekura dhe provojeni përsëri.'''",
        "editing": "Duke redaktuar $1",
        "editingsection": "Duke redaktuar $1 (paragraf)",
        "editingcomment": "Duke redaktuar (paragraf i ri) $1",
        "editconflict": "Konflikt redaktimi: $1",
-       "explainconflict": "Dikush tjetër ka ndryshuar këtë faqe që kur ju filluat redaktimin.\nHpasira e sipërme tregon tekstin e faqes siç është aktualisht.\nNdryshimet tuaja janë shfaqur në hapsirën e poshtme.\nJu duhet t'ia bashkangjisni ndryshimet tuaja teksit ekzistues.\n'''Vetëm''' teksti në hapsirën e sipërme do të ruhet kur të shtypni \"{{int:savearticle}}\".",
+       "explainconflict": "Dikush tjetër ka ndryshuar këtë faqe që kur ju filluat redaktimin.\nHpasira e sipërme tregon tekstin e faqes siç është aktualisht.\nNdryshimet tuaja janë shfaqur në hapsirën e poshtme.\nJu duhet t'ia bashkangjisni ndryshimet tuaja teksit ekzistues.\n<strong>Vetëm</strong> teksti në hapsirën e sipërme do të ruhet kur të shtypni \"$1\".",
        "yourtext": "Teksti juaj",
        "storedversion": "Rishikim i ruajtur",
        "nonunicodebrowser": "'''Kujdes: Shfletuesi juaj ka mospërputhje me standartin unicode.'''\nEkziston një zgjidhje për redaktimin e sigurt të faqeve: Shkronjat jo-ASCII do të duken në kutinë e redaktimit si kod heksadecimal.",
        "copyrightwarning": "Ju lutemi, vini re! Të gjitha kontributet në {{SITENAME}} jepen për publikim sipas $2 (shiko $1 për më shumë detaje).\nNëse ju nuk dëshironi që shkrimet tuaja të redaktohen pa mëshirë dhe të shpërndahen sipas dëshirës, atëherë mos i vendosni këtu.<br />\nGjithashtu, ju po na premtoni ne që gjithçka e keni shkruar vetë, ose e keni kopjuar nga një domain publik ose nga burime të tjera  te hapura.\n'''Mos vendosni material të mbrojtur nga e drejta e autorit pa leje!'''",
        "copyrightwarning2": "Ju lutemi, vini re! Të gjitha kontributet në {{SITENAME}} mund të redaktohen, ndryshohen ose hiqen nga përdorues të tjerë  (shiko $1 për më shumë detaje). \nNëse ju nuk dëshironi që shkrimet tuaja të redaktohen pa mëshirë dhe të shpërndahen sipas dëshirës, atëherë mos i vendosni këtu<br />\nGjithashtu, ju po na premtoni ne që gjithçka e keni shkruar vetë, ose e keni kopjuar nga një domain publik ose nga burime të tjera  te hapura.\n'''Mos vendosni material të mbrojtur nga e drejta e autorit pa leje!'''",
        "longpageerror": "'''Gabim: Teksti që shkruat është  {{PLURAL:$1|një kilobajt|$1 kilobajt}} i gjatë, që është mëtepër se maksimumi i lejuar prej  {{PLURAL:$2|një kilobajt|$2 kilobajtësh}} .'''\nNuk mund të ruhet.",
-       "readonlywarning": "<strong>Kujdes: Baza e të dhënave është mbyllur për mirëmbajtje, prandaj për momentin nuk do të mund të ruash redaktimin tënd.</strong>\nTi mund ta kopjosh/ngjitësh tekstin dhe ta ruash në një dokument tjetër për ta përdorur më vonë .\n\nAdministratori që e bllokoi ka dhënë këtë sqarim: $1.",
+       "readonlywarning": "<strong>Kujdes: Baza e të dhënave është mbyllur për mirëmbajtje, prandaj për momentin nuk do të mund të ruash redaktimin tënd.</strong>\nTi mund ta kopjosh/ngjitësh tekstin dhe ta ruash në një dokument tjetër për ta përdorur më vonë.\n\nAdministratori i sistemit që e bllokoi ka dhënë këtë sqarim: $1.",
        "protectedpagewarning": "'''KUJDES: Kjo faqe është e mbrotjur dhe mund të redaktohet nga përdorues me të drejta administratori.'''\nShënimi i fundit në regjistër është paraqitur më poshtë për reference:",
        "semiprotectedpagewarning": "'''Shënim:''' Kjo faqe është e mbrojtur dhe mund të redaktohet vetëm nga përdorues të regjistruar.\nShënimi i fundit në regjistër është paraqitur më poshtë për reference:",
-       "cascadeprotectedwarning": "'''Vini re:''' Kjo faqe është e mbrojtur dhe vetëm përdoruesit me privilegje administrative mund ta redaktojnë pasi është përfshirë në mbrotjen \"ujëvarë\" të {{PLURAL:$1|faqes së|faqeve të}} mëposhtme:",
+       "cascadeprotectedwarning": "<strong>Vini re:</strong> Kjo faqe është e mbrojtur dhe vetëm përdoruesit me privilegje administrative mund ta redaktojnë pasi është përfshirë në mbrojtjen \"ujëvarë\" të {{PLURAL:$1|faqes së|faqeve të}} më mëposhtme:",
        "titleprotectedwarning": "'''Kujdes:  Kjo faqe është e mbrojtur dhe vetëm [[Special:ListGroupRights|disa përdorues]] mund ta krijojnë.'''\nRegjistri më i vonshëm i hyrjeve është poshtë për referncë:",
        "templatesused": "{{PLURAL:$1|Stamp|Stampa}} të përdorura në këtë faqe:",
        "templatesusedpreview": "{{PLURAL:$1|Stamp|Stampa}} të përdorë në këtë parapâmje:",
        "defaultmessagetext": "Teksti i porosisë së parazgjedhur",
        "invalid-content-data": "Të pavlefshme të dhënave e përmbajtjes",
        "editwarning-warning": "Duke e lënë këtë faqe mund të shkaktojë ju për të humbur të gjitha ndryshimet që keni bërë ju.\nNëse ju jeni regjistruar, ju mund të çaktivizoni këtë paralajmërim në \"{{int:prefs-editing}}\" seksionin e preferencave tuaja.",
+       "editpage-invalidcontentmodel-title": "Modeli i përmbajtjes nuk mbështetet",
+       "editpage-invalidcontentmodel-text": "Modeli i përmbajtjes \"$1\" nuk mbështetet.",
+       "editpage-notsupportedcontentformat-title": "Formati i përmbajtjes nuk mbështetet",
        "content-model-wikitext": "wikitekst",
        "content-model-text": "tekst i thejshtë",
        "content-model-javascript": "JavaScript",
        "page_first": "I parë",
        "page_last": "Së fundmi",
        "histlegend": "Legjenda: <strong>({{int:cur}})</strong> = ndryshimet me versionin e tanishëm, <strong>({{int:last}})</strong> = ndryshimet me versionin e parardhshëm, <strong>{{int:minoreditletter}}</strong> = redaktim i vogël.",
-       "history-fieldset-title": "Shfleto historikun",
-       "history-show-deleted": "Vetëm versionet të grisur",
+       "history-fieldset-title": "Kërko versionin",
+       "history-show-deleted": "Vetëm versionet e grisura",
        "histfirst": "më të vjetër",
        "histlast": "më të rinj",
        "historysize": "({{PLURAL:$1|1 B|$1 B}})",
        "history-feed-description": "Historiku i versioneve për këtë faqe në wiki",
        "history-feed-item-nocomment": "$1 tek $2",
        "history-feed-empty": "Faqja që kërkuat nuk ekziston. Ajo mund të jetë grisur nga wiki ose mund të jetë zhvendosur nën një emër tjetër. Mund të provoni ta gjeni duke e [[Special:Search|kërkuar]].",
+       "history-edit-tags": "Ndrysho etiketat e versioneve të zgjedhura.",
        "rev-deleted-comment": "(Edit përmbledhje larguar)",
        "rev-deleted-user": "(përdoruesi u largua)",
        "rev-deleted-event": "(detajet e regjistrit janë hequr)",
        "revdelete-show-file-submit": "Po",
        "logdelete-selected": "{{PLURAL:$1|Veprimi i zgjedhur në regjistër|Veprimet e zgjedhura në regjistër}}:",
        "revdelete-confirm": "Ju lutem konfirmoni që keni ndër mënd ta bëni këtë, që i kuptoni pasojat, dhe që ju po veproni në përputhje me [[{{MediaWiki:Policy-url}}|politiken]].",
-       "revdelete-suppress-text": "Shuarje duhet'''vetëm'''të përdoret për rastet e mëposhtme: \n * Potencialisht e informacionit shpifës \n * Informacion i pa kriter personal \n *: Adresat në shtëpi''dhe numrat e telefonit, numrat e sigurimeve shoqërore, etj''",
+       "revdelete-suppress-text": "Shuarja duhet të përdoret <strong>vetëm</strong> për rastet e mëposhtme: \n* informacion potencialisht shpifës \n* informacion i papërshtatshëm personal \n*: <em>adresat e shtëpisë dhe numrat e telefonit, numrat e sigurimeve shoqërore, etj.</em>",
        "revdelete-legend": "Vendosni kufizimet për versionin:",
-       "revdelete-hide-text": "Fshihe tekstin e versionit",
+       "revdelete-hide-text": "Teksti i versionit",
        "revdelete-hide-image": "Fshih përmbajtjen skedës",
-       "revdelete-hide-name": "Fshihe veprimin dhe shënjestrën",
-       "revdelete-hide-comment": "fshih komentin e redaktimit",
+       "revdelete-hide-name": "Fshihe cakun dhe parametrat",
+       "revdelete-hide-comment": "Përmbledhje e redaktimit",
        "revdelete-hide-user": "Nofta e redaktuesit/Adresa IP",
        "revdelete-hide-restricted": "Ndalo të dhëna nga administrues si dhe të tjerë",
        "revdelete-radio-same": "(Mos ndryshoni)",
        "revdelete-unsuppress": "Hiq kufizimet nga versionet e restauruara",
        "revdelete-log": "Arsyeja:",
        "revdelete-submit": "Aplikoni tek {{PLURAL:$1|revision|versionet}} e zgjedhura",
-       "revdelete-success": "'''Dukshmëria e versioneve u vendos me sukses.'''",
+       "revdelete-success": "Dukshmëria e versioneve u freskua.",
        "revdelete-failure": "' ' 'Dukshmëria e rivizionit nuk mund të përditëohet\"\n$1",
-       "logdelete-success": "'''Dukshmëria e regjistrave u vendos me sukses.'''",
+       "logdelete-success": "U vendos dukshmëria e regjistrave.",
        "logdelete-failure": "'''Dukshmëria nuk u vendos:'''\n$1",
        "revdel-restore": "Ndrysho dukshmërinë",
        "pagehist": "Historiku i faqes",
        "mergehistory-empty": "Nuk ka versione të bashkueshme.",
        "mergehistory-done": "$3 {{PLURAL:$3|version|versione}} të $1 janë bashkuar me sukses në [[:$2]].",
        "mergehistory-fail": "Nuk munda të bashkoj historikun, ju lutem kontrolloni përzgjedhjen e faqes dhe të kohës.",
+       "mergehistory-fail-bad-timestamp": "Stampa kohore e pavlefshme.",
+       "mergehistory-fail-invalid-source": "Faqja burimore e pavlefshme.",
+       "mergehistory-fail-invalid-dest": "Faqja cak e pavlefshme.",
+       "mergehistory-fail-permission": "Leje të pamjaftueshme për të bashkuar historinë.",
+       "mergehistory-fail-self-merge": "Faqja burim dhe cak nuk mund të jetë e njëjtë.",
        "mergehistory-no-source": "Faqja e burimit $1 nuk ekziston.",
        "mergehistory-no-destination": "Faqja mbledhëse $1 nuk ekzsiton.",
        "mergehistory-invalid-source": "Faqja e burimit duhet të ketë titull të vlefshëm.",
        "searchprofile-advanced-tooltip": "Kërkimi në hapësina",
        "search-result-size": "$1 ({{PLURAL:$2|1 fjalë|$2 fjalë}})",
        "search-result-category-size": "{{PLURAL:$1|1 anëtar|$1 anëtarë}} ({{PLURAL:$2|1 nën-kategori|$2 nën-kategori}}, {{PLURAL:$3|1 skedë|$3 skeda}})",
-       "search-redirect": "(përcjellim $1)",
+       "search-redirect": "(përcjellim nga $1)",
        "search-section": "(seksioni $1)",
        "search-category": "(kategoria $1)",
        "search-suggest": "Mos kishit në mendje: $1",
-       "search-interwiki-caption": "Projekte simotra",
-       "search-interwiki-default": "$1 përfundime:",
+       "search-interwiki-caption": "Rezultate nga projekte simotra",
+       "search-interwiki-default": "Rezultatet nga $1:",
        "search-interwiki-more": "(më shumë)",
+       "search-interwiki-more-results": "më shumë rezultate",
        "search-relatedarticle": "Të ngjashme",
        "searchrelated": "të ngjashme",
        "searchall": "të gjitha",
        "showingresults": "Më poshtë tregohen {{PLURAL:$1|'''1''' përfundim|'''$1''' përfundime}} duke filluar nga #'''$2'''.",
        "search-showingresults": "{{PLURAL:$4|Rezultati <strong>$1</strong> nga <strong>$3</strong>|Rezultatet <strong>$1 - $2</strong> nga <strong>$3</strong>}}",
        "search-nonefound": "Nuk ka rezultate që përputhen me kërkesën.",
+       "search-nonefound-thiswiki": "Nuk ka rezultate që përputhen me kërkesën në këtë sajt.",
        "powersearch-legend": "Kërkim i përparuar",
        "powersearch-ns": "Kërkim në hapësira:",
        "powersearch-togglelabel": "Zgjedh:",
        "powersearch-toggleall": "Të gjitha",
        "powersearch-togglenone": "Asnjë",
+       "powersearch-remember": "Kujtoje përzgjedhjen për kërkesat e ardhshme",
        "search-external": "Kërkim i jashtëm",
        "searchdisabled": "<p>Kërkimi me tekst të plotë është bllokuar tani për tani ngaqë shërbyesi është shumë i ngarkuar; shpresojmë ta nxjerrim prapë në gjendje normale pas disa punimeve. Deri atëherë mund të përdorni Google-in për kërkime:</p>",
+       "search-error": "Ka ndodhë një gabim gjatë kërkimit: $1",
+       "search-warning": "Një paralajmërim ka ndodhur gjatë kërkimit: $1",
        "preferences": "Parapëlqimet",
        "mypreferences": "Parapëlqimet",
        "prefs-edits": "Numri i redaktimeve:",
+       "prefsnologintext2": "Ju lutemi regjistrohuni për të ndryshuar preferencat.",
        "prefs-skin": "Pamja",
        "skin-preview": "Parapamje",
        "datedefault": "E parazgjedhur",
        "prefs-rc": "Ndryshimet e fundit",
        "prefs-watchlist": "Lista mbikqyrëse",
        "prefs-editwatchlist": "Redakto listën mbikqyrëse",
+       "prefs-editwatchlist-label": "Ndrysho listën tuaj mbikëqyrëse:",
+       "prefs-editwatchlist-edit": "Shiko dhe hiq tituj në listë tuaj mbikëqyrëse",
+       "prefs-editwatchlist-raw": "Redakto listën mbikëqyrëse të papërpunuar",
        "prefs-editwatchlist-clear": "Boshatis listën tënde mbikqyrëse",
        "prefs-watchlist-days": "Numri i ditëve të treguara tek lista mbikqyrëse:",
        "prefs-watchlist-days-max": "Maksimumi $1 ditë",
        "prefs-watchlist-token": "Lista mbikqyrëse shenjë:",
        "prefs-misc": "Të ndryshme",
        "prefs-resetpass": "Ndrysho fjalëkalimin",
-       "prefs-changeemail": "Ndrysho postën elektronike",
+       "prefs-changeemail": "Ndrysho ose hiq adresën e postës elektronike",
        "prefs-setemail": "Vendos adresën e postës elektronike",
        "prefs-email": "Opsionet e emailit",
        "prefs-rendering": "Pamja",
        "saveprefs": "Ruaj parapëlqimet",
-       "restoreprefs": "Rikthe të gjitha të dhënat e mëparshme",
+       "restoreprefs": "Rikthe të gjitha të dhënat e parazgjedhura (në të gjitha pjesët)",
        "prefs-editing": "Redaktimi",
-       "rows": "Rreshta:",
-       "columns": "Kollona:",
        "searchresultshead": "Kërkimi",
-       "stub-threshold": "Kufiri për formatin e <a href=\"#\" class=\"stub\">lidhjeve cung</a> (B):",
+       "stub-threshold": "Kufiri për formatimin e lidhjeve cung ($1):",
        "stub-threshold-sample-link": "shembull",
        "stub-threshold-disabled": "Çaktivizuar",
        "recentchangesdays": "Numri i ditëve të treguara në ndryshime së fundmi:",
        "recentchangescount": "Numri i redaktimeve për të treguar:",
        "prefs-help-recentchangescount": "Kjo përfshin ndryshimet e freskëta, historikun e faqes dhe regjistrat.",
        "savedprefs": "Parapëlqimet e tua janë ruajtur.",
+       "savedrights": "Grupet e përdoruesit të {{GENDER:$1|$1}} janë ruajtur.",
        "timezonelegend": "Zona kohore:",
        "localtime": "Ora lokale:",
        "timezoneuseserverdefault": "wiki default Përdorimi ( $1 )",
        "youremail": "Adresa e email-it*",
        "username": "{{GENDER:$1|Emri i përdoruesit|Emri i përdorueses}}:",
        "prefs-memberingroups": "{{GENDER:$2|Anëtar i|Anëtare e}} {{PLURAL:$1|grupit|grupeve}}:",
+       "group-membership-link-with-expiry": "$1 (deri në $2)",
        "prefs-registration": "Koha e regjistrimit:",
        "yourrealname": "Emri juaj i vërtetë*",
        "yourlanguage": "Ndërfaqja gjuhësore",
        "gender-female": "Ajo redakton faqet wiki",
        "prefs-help-gender": "Vendosja e këtij parapëlqimi nuk është e detyrueshme.\nSoftueri përdor vlerat e tij për t'ju adresuar dhe për t'ju përmendur ju te të tjerët duke përdorur gjininë e duhur gramatikore.\nKy informacion do të jetë publik.",
        "email": "Email",
-       "prefs-help-realname": "* Emri i vërtetë nuk është i domosdoshëm: Nëse e jipni do të përmendeni si kontribues për punën që ke bërë.",
+       "prefs-help-realname": "Emri i vërtetë nuk është i domosdoshëm. \n\nNëse e jepni, mund të përmendeni si kontribuues për punën që keni bërë.",
        "prefs-help-email": "Dhënia e adresës së emailit është opsionale, por ju mundëson dërgimin e fjalëkalimit të ri të nëse e harroni atë.",
        "prefs-help-email-others": "Mundeni gjithashtu të zgjidhni të kontaktoheni nga të tjerët përmes faqeve tuaja të diskutimit ose përdoruesit pa e treguar identitetin.",
        "prefs-help-email-required": "Nevojitet e-mail adresa .",
        "prefs-signature": "Firma",
        "prefs-dateformat": "Formati i datës",
        "prefs-timeoffset": "Diferenca kohore",
-       "prefs-advancedediting": "Opsionet e avancuar",
+       "prefs-advancedediting": "Opcionet e përgjithshme",
        "prefs-editor": "redaktor",
        "prefs-preview": "Parapamje",
        "prefs-advancedrc": "Opsione të avancuara",
        "prefs-advancedwatchlist": "Opsione të avancuara",
        "prefs-displayrc": "Shfaq opsionet",
        "prefs-displaywatchlist": "Shfaq opsionet",
+       "prefs-tokenwatchlist": "Tokeni",
        "prefs-diffs": "Ndryshimet",
-       "userrights": "Ndrysho privilegjet e përdoruesve",
-       "userrights-lookup-user": "Ndrysho grupet e përdoruesit",
+       "prefs-help-prefershttps": "Kjo preferencë do të aktivizohet në regjistrimin tuaj të radhës.",
+       "userrights": "Privilegjet e përdoruesit",
+       "userrights-lookup-user": "Zgjedh një përdorues",
        "userrights-user-editname": "Fut emrin e përdoruesit:",
-       "editusergroup": "Redakto grupet e përdoruesve",
+       "editusergroup": "Ngarko grupet e përdoruesve",
        "editinguser": "Duke ndryshuar privilegjet e {{GENDER:$1|përdoruesit|përdorueses}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Anëtarësimi tek grupet",
-       "saveusergroups": "Ruaj Grupin e Përdoruesve",
+       "userrights-editusergroup": "Ndrysho grupet e {{GENDER:$1|përdoruesit}}",
+       "userrights-viewusergroup": "Shiko grupet e {{GENDER:$1|përdoruesit}}",
+       "saveusergroups": "Ruaj grupet e {{GENDER:$1|përdoruesit}}",
        "userrights-groupsmember": "{{GENDER:$2|Anëtar i|Anëtare e}}:",
        "userrights-groupsmember-auto": "{{GENDER:$2|Anëtar i nënkuptuar i|Anëtare e nënkuptuar e}}:",
-       "userrights-groups-help": "Mund të ndryshoni anëtarësimin e {{GENDER:$1|këtij përdoruesi|kësaj përdorueseje}} në grupe:\n* Kutia e zgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Kutia e pazgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} nuk është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Një * tregon që nuk mund ta hiqni grupin pasi ta keni shtuar (dhe anasjelltas).",
+       "userrights-groups-help": "Mund të ndryshoni anëtarësimin e {{GENDER:$1|këtij përdoruesi|kësaj përdorueseje}} në grupe:\n* Kutia e zgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Kutia e pazgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} nuk është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Një * tregon që nuk mund ta hiqni grupin pasi ta keni shtuar (dhe anasjelltas).\n* Një # do të thotë që vetëm mund ta zgjatni kohën e skadimit; nuk mund ta shkurtoni.",
        "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-changeable-col": "Grupe që mund të ndryshoni",
        "userrights-unchangeable-col": "Grupe që s'mund të ndryshoni",
+       "userrights-expiry-current": "Skadon $1",
+       "userrights-expiry-none": "Nuk skadon",
+       "userrights-expiry": "Skadon:",
+       "userrights-expiry-existing": "Koha ekzistuese e skadimit: $3, $2",
+       "userrights-expiry-othertime": "Kohë tjetër:",
+       "userrights-expiry-options": "1 ditë:1 day,1 javë:1 week,1 muaj:1 month,3 muaj:3 months,6 muaj:6 months,1 vit:1 year",
+       "userrights-invalid-expiry": "Koha e skadimit për grupin \"$1\" është jo i vlefshëm.",
+       "userrights-expiry-in-past": "Koha e skadimit për grupin \"$1\" është në të kaluarën.",
        "userrights-conflict": "Konflikt në ndryshimin e të drejtave të përdoruesit! Të lutem të rishiko dhe konfirmo ndryshimet e tua.",
        "group": "Grupi:",
        "group-user": "Përdorues",
        "group-bot-member": "{{GENDER:$1|robot|robote}}",
        "group-sysop-member": "{{GENDER:$1|administrues|administruese}}",
        "group-bureaucrat-member": "{{GENDER:$1|burokrat|burokrate}}",
-       "group-suppress-member": "{{GENDER:$1|kujdestar|kujdestare}}",
+       "group-suppress-member": "{{GENDER:$1|fshehës|fshehëse}}",
        "grouppage-user": "{{ns:project}}:Përdorues",
        "grouppage-autoconfirmed": "{{ns:project}}:Përdorues të vërtetuar automatikisht",
        "grouppage-bot": "{{ns:project}}:Robotë",
        "right-reupload-shared": "Mos pranoni skeda në media magazinën e përbashkët në nivel lokal",
        "right-upload_by_url": "Ngarko skedë nga ndonjë URL",
        "right-purge": "Pastro \"cache\" e site-it për një faqe pa konfirmim",
-       "right-autoconfirmed": "Redakto faqet gjysmë të mbrojtura",
+       "right-autoconfirmed": "Të mos afektohesh nga limitimet e bazuara në IP",
        "right-bot": "Trajtohu si një proces automatik",
        "right-nominornewtalk": "Nuk kanë redaktimet e vogla për faqet e diskutimit të shkaktuar mesazhe të reja e shpejtë",
        "right-apihighlimits": "Vendosni kufijtë më të lartë në pyetjet API",
        "right-deletedtext": "Shiko tekstin dhe ndryshimet e grisura ndërmjet versioneve të grisura",
        "right-browsearchive": "Kërko faqe të grisura",
        "right-undelete": "Rikthe faqen",
-       "right-suppressrevision": "Rishiko dhe rikthe versionet e fshehura nga administratorët",
+       "right-suppressrevision": "Shiko, fshih dhe çfshih versionit specifike të faqeve nga cilido përdorues",
+       "right-viewsuppressed": "Shiko versionet e fshehura nga të gjithë përdoruesit",
        "right-suppressionlog": "Shiko hyrjet private",
        "right-block": "Blloko përdoruesit tjerë nga editimi",
        "right-blockemail": "Blloko përdoruesin që të mos dërgojë postë elektronike",
        "right-ipblock-exempt": "Anashkalo bllokimet e IP-ve, auto-bllokimet dhe linjën e bllokimeve",
        "right-unblockself": "Zhblloko veten",
        "right-protect": "Ndrysho nivelin mbrojtës dhe redakto faqet e mbrojtura",
-       "right-editprotected": "Redakto faqet e mbrojtura (pa ndryshuar mbrojtjen)",
+       "right-editprotected": "Redakto faqet e mbrojtura si \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Redakto faqet e mbrojtura, si \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Redakto modelin e përmbajtjes së një faqeje",
        "right-editinterface": "Ndrysho parapamjen e përdoruesit",
-       "right-editusercssjs": "Redakto skedat CSS dhe JS të përdoruesve tjerë",
        "right-editusercss": "Redakto skedat CSS të përdoruesve tjerë",
        "right-edituserjs": "Redakto skedat JS të përdoruesve tjerë",
        "right-editmyusercss": "Redakto CSS - skedat e tua të përdoruesit",
        "right-editmyuserjs": "Redakto JavaScript - skedat e tua të përdoruesit",
        "right-viewmywatchlist": "Shfaq listën time mbikqyrëse",
+       "right-editmywatchlist": "Ndrysho listën tënde të mbikëqyrjes. Kujdes se disa veprime do të shtojnë faqe edhe pa këtë të drejtë.",
+       "right-viewmyprivateinfo": "Shiko të dhënat tuaja private (p.sh. adresa e email-it, emri i vërtetë)",
+       "right-editmyprivateinfo": "Ndrysho të dhënat tuaja private (p.sh. adresa e email-it, emri i vërtetë)",
        "right-editmyoptions": "Redakto parapëlqimet e tua",
        "right-rollback": "Rikthen shpejt redaktimet  e pedaktuesit të fundit",
        "right-markbotedits": "Shëno rikthimet si redaktime robotësh",
        "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-managechangetags": "Krijoni dhe fshini [[Special:Tags|tags]] nga baza e të dhënave",
+       "right-managechangetags": "Krijoni dhe ç'(aktivizoni) [[Special:Tags|etiketa]]",
        "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",
+       "right-deletechangetags": "Fshij [[Special:Tags|etiketat]] nga databaza",
+       "grant-generic": "\"$1\" pako e të drejtave",
+       "grant-group-page-interaction": "Ndërvepro me faqe",
+       "grant-group-file-interaction": "Ndërvepro me media",
+       "grant-group-watchlist-interaction": "Ndërvepro me listën tuaj të mbikëqyrjes",
        "grant-group-email": "Dërgoni email",
+       "grant-group-high-volume": "Kryej aktivitet me vëllim të lartë",
+       "grant-group-customization": "Rregullime dhe preferenca",
        "grant-group-administration": "Kryej veprime administrative",
        "grant-group-private-information": "Qasu të dhënave private në lidhje me ju",
        "grant-group-other": "Veprimtari të ndryshme",
        "grant-blockusers": "Blloko dhe zhblloko përdoruesit",
        "grant-createaccount": "Krijo llogari",
        "grant-createeditmovepage": "Krijoni, redaktoni, dhe lëvizni faqet",
+       "grant-delete": "Fshij faqet, versionet dhe regjistrimet",
+       "grant-editinterface": "Redakto hapësirën MediaWiki dhe CSS/JavaScript të përdoruesit",
+       "grant-editmycssjs": "Ndrysho CSS/JavaScript të përdoruesit tuaj",
+       "grant-editmyoptions": "Redakto parapëlqimet tua",
        "grant-editmywatchlist": "Redaktoni listën tuaj mbikqyrëse",
        "grant-editpage": "Redaktoni faqet ekzistuese",
        "grant-editprotected": "Redakto faqet e mbrojtura",
+       "grant-highvolume": "Redaktim me vëllim të lartë",
+       "grant-oversight": "Fshih përdorues dhe versione",
+       "grant-patrol": "Patrullo ndryshime në faqe",
+       "grant-privateinfo": "Qasu në informacion privat",
+       "grant-protect": "Mbroj dhe çmbroj faqe",
+       "grant-rollback": "Kthe ndryshime në faqe",
+       "grant-sendemail": "Dërgo e-mail te përdoruesit tjerë",
+       "grant-uploadeditmovefile": "Ngarko, zëvendëso dhe zhvendos skedarë",
+       "grant-uploadfile": "Ngarko skedarë të ri",
+       "grant-basic": "Të drejta bazike",
+       "grant-viewdeleted": "Shiko skedarët dhe faqet e fshira",
+       "grant-viewmywatchlist": "Shiko listën tënde mbikëqyrëse",
+       "grant-viewrestrictedlogs": "Shiko regjistrimet e kufizuara",
        "newuserlogpage": "Regjistri i llogarive",
        "newuserlogpagetext": "Ky është një regjistër i llogarive të fundit që janë hapur",
        "rightslog": "Regjistri i privilegjeve të përdoruesit",
        "rightslogtext": "Ky është një regjistër për ndryshimet e privilegjeve të përdoruesit.",
        "action-read": "lexo këtë faqe",
        "action-edit": "redakto këtë faqe",
-       "action-createpage": "krijo faqe",
-       "action-createtalk": "krijo faqe diskutimi",
+       "action-createpage": "krijo këtë faqe",
+       "action-createtalk": "krijo këtë faqe diskutimi",
        "action-createaccount": "krijo këtë llogari përdoruesi",
+       "action-autocreateaccount": "krijo këtë llogari të përdoruesit të jashtëm vetvetiu",
        "action-history": "shiko historinë e kësaj faqeje",
        "action-minoredit": "shëno këtë redaktim si të vogël",
        "action-move": "zhvendos këtë faqe",
        "action-upload_by_url": "ngarko këtë skedë nga një URL",
        "action-writeapi": "përdor API-në e shkrimit",
        "action-delete": "grise këtë faqe",
-       "action-deleterevision": "grise këtë revizion",
-       "action-deletedhistory": "shiko historinë e kësaj faqeje të grisur",
+       "action-deleterevision": "gris versionet",
+       "action-deletelogentry": "fshij regjistrimet në ditar",
+       "action-deletedhistory": "shiko historinë e grisur të një faqeje",
+       "action-deletedtext": "shiko tekstin e versionit të fshirë",
        "action-browsearchive": "kërko faqe të grisura",
-       "action-undelete": "Restauro këtë faqe",
-       "action-suppressrevision": "rishiko dhe rikthe këtë revizion të fshehur",
+       "action-undelete": "restauro faqe",
+       "action-suppressrevision": "rishiko dhe rikthe versione të fshehura",
        "action-suppressionlog": "shiko këtë regjistër privat",
        "action-block": "blloko përdoruesin",
        "action-protect": "ndrysho nivelin e mbrojtjes për këtë faqe",
        "action-userrights-interwiki": "ndrysho të drejtat e përdoruesve në wiki-t tjera",
        "action-siteadmin": "mbyll ose hap bazën e të dhënave",
        "action-sendemail": "dërgo e-maile",
+       "action-editmyoptions": "redakto parapëlqimet tua",
        "action-editmywatchlist": "redaktoni listën tuaj mbikqyrëse",
        "action-viewmywatchlist": "shikoni listën tuaj mbikqyrëse",
+       "action-viewmyprivateinfo": "shiko informacionin tënd privat",
+       "action-editmyprivateinfo": "ndrysho informacionin tënd privat",
+       "action-editcontentmodel": "ndrysho modelin e përmbajtjes së një faqe",
+       "action-managechangetags": "krijo dhe (ç)aktivizo etiketat",
+       "action-applychangetags": "apliko etiketat bashkë me ndryshimet tuaja",
+       "action-purge": "fshij këtë faqe",
        "nchanges": "$1 {{PLURAL:$1|ndryshim|ndryshime}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|që nga vizita e fundit}}",
        "enhancedrc-history": "historia",
        "recentchanges-legend-heading": "<strong>Legjenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (shiko gjithashtu [[Special:NewPages|listën e faqeve të reja]])",
        "recentchanges-submit": "Shfaq",
+       "rcfilters-activefilters": "Filtrat aktiv",
+       "rcfilters-quickfilters": "Lidhje të shpejta",
+       "rcfilters-savedqueries-defaultlabel": "Filtrat e ruajtur",
+       "rcfilters-savedqueries-rename": "Riemro",
+       "rcfilters-savedqueries-setdefault": "Vendosur si parazgjedhje",
+       "rcfilters-savedqueries-unsetdefault": "Hiqe si parazgjedhje",
+       "rcfilters-savedqueries-remove": "Largo",
+       "rcfilters-savedqueries-new-name-label": "Emri",
+       "rcfilters-savedqueries-apply-label": "Krijo lidhje të shpejt",
+       "rcfilters-savedqueries-cancel-label": "Anulo",
+       "rcfilters-savedqueries-add-new-title": "Ruaj filtrat si lidhje e shpejt",
+       "rcfilters-restore-default-filters": "Kthej filtrat e parazgjedhur",
+       "rcfilters-clear-all-filters": "Pastro të gjithë filtrat",
+       "rcfilters-search-placeholder": "Filtro ndryshimet e fundit (shfleto ose fillo të shtypësh)",
+       "rcfilters-invalid-filter": "Filtër jo i vlefshëm",
+       "rcfilters-empty-filter": "S'ka filtra aktiv. Tregohen të gjitha kontributet.",
+       "rcfilters-filterlist-title": "Filtrat",
+       "rcfilters-filterlist-whatsthis": "Çka është kjo?",
+       "rcfilters-highlightbutton-title": "Thekso rezultatet",
+       "rcfilters-highlightmenu-title": "Zgjedh një ngjërë",
+       "rcfilters-highlightmenu-help": "Zgjedh një ngjyrë për të theksuar këtë tipar",
+       "rcfilters-filterlist-noresults": "Nuk u gjet ndonjë filtër",
+       "rcfilters-noresults-conflict": "Nuk u gjetën rezultate sepse kriteret e kërkimit janë kundërthënës",
+       "rcfilters-filtergroup-registration": "Regjistrimi i përdoruesit",
+       "rcfilters-filter-registered-label": "Regjistruar",
+       "rcfilters-filter-registered-description": "Redaktorët e kyçur",
+       "rcfilters-filter-unregistered-label": "Ç'regjistruar",
+       "rcfilters-filter-unregistered-description": "Redaktorët që nuk janë të kyçur",
+       "rcfilters-filtergroup-authorship": "Autorësia e kontributit",
+       "rcfilters-filter-editsbyself-label": "Ndryshimet nga ti",
+       "rcfilters-filter-editsbyself-description": "Kontributet tuaja.",
+       "rcfilters-filter-editsbyother-label": "Kontributet nga të tjerët",
+       "rcfilters-filter-editsbyother-description": "Të gjitha ndryshimet përveç nga ti.",
+       "rcfilters-filtergroup-userExpLevel": "Niveli i përvojës (vetëm për përdoruesit e regjistruar)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Të rinjtë",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Më pak se 10 redaktime dhe 4 ditë aktivitet.",
+       "rcfilters-filter-user-experience-level-learner-label": "Nxënës",
+       "rcfilters-filter-user-experience-level-experienced-label": "Përdorues me përvojë",
+       "rcfilters-filtergroup-automated": "Kontribute automatike",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Redaktime të bëra nga vegla automatike.",
+       "rcfilters-filter-humans-label": "Njeri (jo bot)",
+       "rcfilters-filter-humans-description": "Redaktimet e bëra nga redaktorët njerëz.",
+       "rcfilters-filtergroup-reviewstatus": "Statusi i rishikimit",
+       "rcfilters-filter-patrolled-label": "Patrolluar",
+       "rcfilters-filter-patrolled-description": "Redaktimet të markuara si të patrolluara",
+       "rcfilters-filter-unpatrolled-label": "E papatrolluar",
+       "rcfilters-filter-unpatrolled-description": "Redaktimet e pashënuara si të patrolluara.",
+       "rcfilters-filtergroup-significance": "Rëndësia",
+       "rcfilters-filter-minor-label": "Redaktime të vogëla",
+       "rcfilters-filter-minor-description": "Redaktimet që autori i ka shënuar si të vogla",
+       "rcfilters-filter-major-label": "Redaktimet jo të vogla",
+       "rcfilters-filter-major-description": "Redaktimet jo të shënuara si të vogla.",
+       "rcfilters-filtergroup-watchlist": "Faqet e mbikëqyrura",
+       "rcfilters-filter-watchlist-watched-label": "Në Listën e Mbikëqyrur",
+       "rcfilters-filter-watchlist-watched-description": "Ndryshimet në faqet në Listën tënde të Mbikëqyrjes.",
+       "rcfilters-filter-watchlist-watchednew-label": "Ndryshimet e reja në Listën e Mbikëqyrjes",
+       "rcfilters-filter-watchlist-watchednew-description": "Ndryshimet në faqet e Mbikëqyrura që nuk keni vizituar që nga ndodhja e ndryshimeve.",
+       "rcfilters-filter-watchlist-notwatched-label": "Jo në Listën e Mbikëqyrjes",
+       "rcfilters-filter-watchlist-notwatched-description": "Çdo gjë përveç ndryshimeve në faqet në Listën e Mbikëqyrjes.",
+       "rcfilters-filtergroup-changetype": "Lloji i ndryshimit",
+       "rcfilters-filter-pageedits-label": "Redaktimet e faqes",
+       "rcfilters-filter-pageedits-description": "Redaktimet e përmbajtjes wiki, diskutimeve, përshkrimit të kategorive...",
+       "rcfilters-filter-newpages-label": "Krijimet e faqeve",
+       "rcfilters-filter-newpages-description": "Redaktimet që krijojnë faqe të reja.",
+       "rcfilters-filter-categorization-label": "Ndryshimet e kategorive",
+       "rcfilters-filter-categorization-description": "Regjistri i faqeve të shtuara ose hequra nga kategoritë.",
+       "rcfilters-filter-logactions-label": "Veprimet e regjistruara",
+       "rcfilters-filter-logactions-description": "Veprimet administrative, krijimet e llogarive, fshirjet e faqeve, ngarkimet...",
+       "rcfilters-filtergroup-lastRevision": "Versioni i fundit",
+       "rcfilters-filter-lastrevision-label": "Versioni i fundit",
+       "rcfilters-filter-lastrevision-description": "Ndryshimet më të fundit në një faqe.",
+       "rcfilters-filter-previousrevision-label": "Versionet më të hershme",
+       "rcfilters-filter-previousrevision-description": "Të gjitha ndryshimet që nuk janë ndryshimet më të fundit në një faqe.",
        "rcnotefrom": "Më poshtë {{PLURAL:$5|është shfaqur ndryshimi|janë shfaqur ndryshimet}} që nga <strong>$3, $4</strong> (deri në <strong>$1</strong>).",
+       "rclistfromreset": "Anulo përzgjedhjen e datës",
        "rclistfrom": "Tregon ndryshime së fundmi duke filluar nga $3 $2",
        "rcshowhideminor": "$1 redaktimet e vogla",
        "rcshowhideminor-show": "Shfaq",
        "rcshowhidemine": "$1 redaktimet e mia",
        "rcshowhidemine-show": "Shfaq",
        "rcshowhidemine-hide": "Fshih",
+       "rcshowhidecategorization": "$1 kategorizim i faqes",
        "rcshowhidecategorization-show": "Shfaq",
        "rcshowhidecategorization-hide": "Fshih",
-       "rclinks": "Trego $1 ndryshime gjatë $2 ditëve<br />$3",
+       "rclinks": "Trego $1 ndryshime gjatë $2 ditëve",
        "diff": "ndrysh",
        "hist": "hist",
        "hide": "fshih",
        "recentchangeslinked-summary": "Kjo është një listë e ndryshimeve së fundmi të faqeve të lidhura nga faqja e dhënë (ose bëjnë pjesë tek kategoria e dhënë).\nFaqet [[Special:Watchlist|nën mbikqyrjen tuaj]] duken të '''theksuara'''.",
        "recentchangeslinked-page": "Emri i faqes:",
        "recentchangeslinked-to": "Trego ndryshimet e faqeve që lidhen tek faqja e dhënë",
+       "recentchanges-page-added-to-category": "[[:$1]] shtuar në kategori",
+       "recentchanges-page-removed-from-category": "[[:$1]] u hoq nga kategoria",
+       "autochange-username": "Ndryshim automatik i MediaWiki-t",
        "upload": "Ngarkoni skeda",
        "uploadbtn": "Ngarkoje",
        "reuploaddesc": "Kthehu tek formulari i dhënies.",
        "uploaderror": "Gabim dhënie",
        "upload-recreate-warning": "'''Kujdes: Një skedarë me atë emër është fshirë apo lëvizur.'''\n\nRegjistri i fshirjes dhe lëvizjes për këtë faqe për lehtësim ofrohen këtu:",
        "uploadtext": "Përdorni formularin e mëposhtëm për të ngarkuar skeda.\nPër të parë ose kërkuar skeda të ngarkuara më parë, shkoni tek [[Special:FileList|lista e ngarkimeve të skedave]],\n(ri)ngarkimet janë gjithashtu të regjistruara tek [[Special:Log/upload|regjistri i ngarkimeve]], grisjet tek [[Special:Log/delete|regjistri i grisjeve]].\n\nPër të përfshirë një skedë në një faqe, përdorni një nga format e mëposhtme:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skeda.jpg]]</nowiki></code>''' për të përdorur versionin e plotë të skedës\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skeda.png|200px|thumb|left|alt text]]</nowiki></code>''' për të përdorur nje interpretim prej 200 piksel në të majtë me 'alt tekst' si përshkrim\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Skeda.ogg]]</nowiki></code>''' për të lidhur skedën direkt, pa e shfaqur atë",
-       "upload-permitted": "Llojet e lejuara të skedave: $1.",
-       "upload-preferred": "Llojet e parapëlqyera të skedave: $1.",
-       "upload-prohibited": "Llojet e ndaluara të skedave: $1.",
+       "upload-permitted": "Skedarët e lejuar {{PLURAL:$2|tipi|tipet}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipi|tipet}} e parapëlqyera të skedave: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Lloji|Llojet}} e ndaluara të skedave: $1.",
        "uploadlogpage": "Regjistri i ngarkimeve",
        "uploadlogpagetext": "Më poshtë është një listë e skedave më të reja që janë ngarkuar.\nTë gjithë orët janë me orën e shërbyesit.",
        "filename": "Emri i skedës",
        "windows-nonascii-filename": "Ky wiki nuk e mbështet emrin e dokumentit me karaktere të veçanta.",
        "fileexists": "Ekziston një skedë me atë emër, ju lutem kontrolloni <strong>[[:$1]]</strong> në qoftë se nuk jeni të sigurt nëse dëshironi ta zëvendësoni.\n[[$1|thumb]]",
        "filepageexists": "Përshkrimi i faqes për këtë skedë është krijuar tek <strong>[[:$1]]</strong>, por asnjë skedë me këtë emër nuk ekziston.\nPërmbledhja që shkruat nuk do të shfaqet në përshkrimin e faqes.\nPër ta bërë përmbledhjen tuaj të dukshme atje, ju duhet ta redaktoni automatikisht.\n[[$1|thumb]]",
-       "fileexists-extension": "Ekziston një skedë me emër të ngjashëm: [[$2|thumb]]\n* Emri i skedës në ngarkim: <strong>[[:$1]]</strong>\n* Emri i skedës ekzistuese: <strong>[[:$2]]</strong>\nJu lutem zgjidhni një emër tjetër.",
+       "fileexists-extension": "Ekziston një skedë me emër të ngjashëm: [[$2|thumb]]\n*Emri i skedës në ngarkim: <strong>[[:$1]]</strong>\n*Emri i skedës ekzistuese: <strong>[[:$2]]</strong>\nMos dëshironi të zgjidhni një emër më të dallueshëm?",
        "fileexists-thumbnail-yes": "Kjo skedë duket se është një figurë me madhësi të zvogëluar ''(figurë përmbledhëse)''. [[$1|thumb]]\nJu lutem kontrolloni skedën <strong>[[:$1]]</strong>.\nNëse skeda e kontrolluar është e së njëjtës madhësi me origjinalen atëherë nuk ka nevojë të ngarkoni një figurë përmbledhëse.",
        "file-thumbnail-no": "Emri i skedës fillon me <strong>$1</strong>.\nDuket se është një figurë me madhësi të zvogëluar ''(thumbnail)''.\nNëse keni këtë figurë me madhësi të plotë ju lutem të ngarkoni atë, përndryshe ju lutem të ndryshoni emrin e skedës.",
        "fileexists-forbidden": "Ekziston një skedë me të njëjtin emër. Ju lutemi kthehuni mbrapsht dhe ngarkoni këtë skedë me një emër të ri. \n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Ekziston një skedë me të njëjtin emër në magazinën e përbashkët. Ju lutem kthehuni mbrapsht dhe ngarkojeni këtë skedë me një emër të ri. \n [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Ky ngarkim është një kopje e saktë e versionit aktual <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Kjo skedë është dyfish i {{PLURAL:$1|skedës|skedave}} në vijim:",
        "file-deleted-duplicate": "Një skedë identike më këtë skedë ([[:$1]]) është grisur më përpara.\nJu duhet të kontrolloni historikun e grisjes të asaj skede përpara se ta ri-ngarkoni atë.",
        "uploadwarning": "Kujdes dhënie",
        "upload-dialog-button-upload": "Ngarko",
        "upload-form-label-infoform-title": "Detaje",
        "upload-form-label-infoform-name": "Emri",
+       "upload-form-label-infoform-description": "Përshkrimi",
        "upload-form-label-usage-title": "Përdorimi",
        "upload-form-label-usage-filename": "Emri i skedarit",
        "upload-form-label-own-work": "Kjo është e puna ime",
        "backend-fail-writetemp": "Nuk mund të shkruajë te skeda e përkohshme.",
        "backend-fail-closetemp": "Nuk mund të mbyllë skedën e përkohshme.",
        "backend-fail-read": "Nuk mund të lexojë skedën $1.",
-       "backend-fail-create": "Nuk mund të krijojë skedën $1.",
+       "backend-fail-create": "Nuk mund të krijonte skedën \"$1\".",
        "backend-fail-maxsize": "Nuk mund të shkruante skedarin \"$1\" sepse ai është më i madh se {{PLURAL:$2|një bajt|$2 bajtë}}",
-       "backend-fail-readonly": "Shërbimi i depos \"$1\" është për momentin vetëm-për-lexim. Arsyeja e dhënë është: \"''$2''\"",
+       "backend-fail-readonly": "Shërbimi i depos \"$1\" është për momentin vetëm-për-lexim. Arsyeja e dhënë është: <em>$2</em>",
        "backend-fail-synced": "Skedari \"$1\" është në një gjendje të parregullt brenda proceseve të depos së brendshme",
        "backend-fail-connect": "Nuk u arrit lidhja me shërbimin e depos \"$1\".",
        "backend-fail-internal": "Një problem i panjohur ndodhi në shërbimin e depos \"$1\".",
        "uploadstash-summary": "Kjo faqe ofron qasje tek skedat të cilat janë ngarkuar (ose janë në proçes ngarkimi) por që nuk janë publikuat akoma në wiki. Këto skeda nuk janë të dukshme për këdo përveç për përdoruesin që i ka ngarkuar ato.",
        "uploadstash-clear": "Spastro skedat e fshehura",
        "uploadstash-nofiles": "Ju nuk keni skeda të fshehura.",
-       "uploadstash-badtoken": "Kryerja e këtij veprimi ishte e pasuksesshme, ndoshta sepse kredencialet e tua redaktuese kanë skaduar. Provo përsëri.",
+       "uploadstash-badtoken": "Kryerja e këtij veprimi ishte e pasuksesshme, ndoshta sepse kredencialet e tua redaktuese kanë skaduar. Provoni përsëri.",
        "uploadstash-errclear": "Spastrimi i skedave ishte i pasuksesshëm.",
        "uploadstash-refresh": "Rifreskoni listën e skedave",
        "invalid-chunk-offset": "Kompensim cope i pavlefshëm",
        "nolicense": "Asnjë nuk është zgjedhur",
        "licenses-edit": "Redakto opsionet e licencës",
        "license-nopreview": "(Nuk ka parapamje)",
-       "upload_source_url": " (URL e vlefshme, publikisht e përdorshme)",
-       "upload_source_file": " (skeda në kompjuterin tuaj)",
+       "upload_source_url": "(skedari i zgjedhur nga një URL e vlefshme, publikisht e qasshme)",
+       "upload_source_file": "(skeda e zgjedhur në kompjuterin tuaj)",
        "listfiles-delete": "fshije",
-       "listfiles-summary": "Kjo faqe speciale tregon tërë skedat e ngarkuara.\nFillimisht skedat e ngarkuara së fundmi jepen më sipër.\nShtypni kolonat e tjera për të ndryshuar radhitjen.",
+       "listfiles-summary": "Kjo faqe e veçantë tregon tërë skedat e ngarkuara.",
        "listfiles_search_for": "Kërko për emrin e figurës:",
        "imgfile": "skeda",
        "listfiles": "Lista e figurave",
        "filedelete-maintenance": "Grisja dhe restaurimi i skedave është çaktivizuar përkohësisht gjatë mirëmbajtjes.",
        "filedelete-maintenance-title": "Nuk mund të grisë skedën",
        "mimesearch": "Kërkime MIME",
-       "mimesearch-summary": "Kjo faqe lejon kërkimin e skedave sipas llojit MIME. Kërkimi duhet të jetë i llojit: contenttype/subtype, p.sh. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Kjo faqe lejon kërkimin e skedave sipas llojit MIME. Kërkimi duhet të jetë i llojit: contenttype/subtype ose contentzype/*, p.sh. <code>image/jpeg</code>.",
        "mimetype": "Lloji MIME:",
        "download": "shkarkim",
        "unwatchedpages": "Faqe të pambikqyrura",
        "unusedtemplateswlh": "lidhje",
        "randompage": "Faqe e rastit",
        "randompage-nopages": "Nuk ka faqe në {{PLURLA:$2|hapësirën|hapësirat}} në vijim: $1",
+       "randomincategory": "Faqe rasti në kategori",
        "randomincategory-invalidcategory": "\"$1\" nuk është emër i vlefshëm kategorie.",
        "randomincategory-nopages": "Nuk ka faqe në kategorinë [[:Category:$1|$1]].",
        "randomincategory-category": "Kategoria:",
        "statistics-users": "[[Special:ListUsers|Përdoruesit]] e regjistruar",
        "statistics-users-active": "Përdoruesit aktiv",
        "statistics-users-active-desc": "Përdoruesit që kanë së paku një veprim në {{PLURAL:$1|ditën|$1 ditët}} e fundit",
+       "pageswithprop": "Faqe me një tipar faqeje",
+       "pageswithprop-legend": "Faqe me një tipar faqeje",
        "pageswithprop-prop": "Emri i pronës:",
        "pageswithprop-submit": "Shko",
        "doubleredirects": "Përcjellime dopjo",
        "doubleredirectstext": "Kjo faqe liston faqet përcjellëse tek faqet e tjera përcjellëse.\nSecili rresht përmban lidhjet tek përcjellimi i parë dhe përcjellimi i dytë, gjithashtu synimin e përcjellimit të dytë, që është zakonisht faqja synuese '''e vërtetë''', që faqja w parë duhej të ishte përcjellëse e kësaj faqeje.\n<del>Kalimet nga</del> hyrjet janë zgjidhur.",
        "double-redirect-fixed-move": "[[$1]] u zhvendos.\n\nËshtë përditësuar automatikisht dhe tani përcjellet tek [[$2]]",
-       "double-redirect-fixed-maintenance": "Duke zgjidhur përcjellimin e dyfishtë nga [[$1]] tek [[$2]].",
+       "double-redirect-fixed-maintenance": "Duke rregulluar përcjellimin e dyfishtë nga [[$1]] tek [[$2]] si mirëmbajtje.",
        "double-redirect-fixer": "Rregullues zhvendosjesh",
        "brokenredirects": "Përcjellime të prishura",
        "brokenredirectstext": "Përcjellimet që vijojnë lidhen tek një artikull që s'ekziston:",
        "wantedtemplates": "Stampat e dëshiruara",
        "mostlinked": "Artikuj më të lidhur",
        "mostlinkedcategories": "Kategori më të lidhura",
-       "mostlinkedtemplates": "Stampa më të lidhur",
+       "mostlinkedtemplates": "Faqet më të përfshira",
        "mostcategories": "Artikuj më të kategorizuar",
        "mostimages": "Figura më të lidhura",
        "mostrevisions": "Artikuj më të redaktuar",
        "protectedpages-cascade": "Vetëm mbrojtjet",
        "protectedpages-noredirect": "Fshih përcjellimet",
        "protectedpagesempty": "Nuk ka faqe të mbrojtura me të dhënat e kërkuara.",
+       "protectedpages-timestamp": "Stampa e kohës",
        "protectedpages-page": "Faqja",
        "protectedpages-expiry": "Skadon",
+       "protectedpages-performer": "Duke mbrojtur përdoruesin",
+       "protectedpages-params": "Parametrat e mbrotjes",
        "protectedpages-reason": "Arsyeja",
        "protectedpages-submit": "Shfaq faqet",
        "protectedpages-unknown-timestamp": "E panjohur",
        "listusers": "Lista e përdoruesve",
        "listusers-editsonly": "Trego vetëm përdoruesit me redaktime",
        "listusers-creationsort": "Radhiti sipas datës së krijimit",
+       "listusers-desc": "Rëndit nga e madhja",
        "usereditcount": "$1 {{PLURAL:$1|redaktim|redaktime}}",
        "usercreated": "{{GENDER:$3|Krijuar}} më $1 në $2",
        "newpages": "Artikuj të rinj",
        "apisandbox": "API livadhi",
        "apisandbox-jsonly": "JavaScript është e domosdoshme që të përdorni API livadhi.",
        "apisandbox-api-disabled": "API nuk është në dispozicion për këtë faqe.",
+       "apisandbox-fullscreen": "Zgjero panelin",
        "apisandbox-unfullscreen": "Shfaq faqen",
        "apisandbox-submit": "Bëj kërkesë",
        "apisandbox-reset": "Pastro",
        "apisandbox-retry": "Riprovo",
+       "apisandbox-helpurls": "Lidhje të ndihmës",
        "apisandbox-examples": "Shembuj",
        "apisandbox-dynamic-parameters": "Parametra shtesë",
        "apisandbox-dynamic-parameters-add-label": "Shto parametër:",
        "apisandbox-dynamic-parameters-add-placeholder": "Emri i parametrit",
+       "apisandbox-dynamic-error-exists": "Një parametër i quajtur \"$1\" tashmë ekziston.",
+       "apisandbox-submit-invalid-fields-title": "Disa fusha janë të pavlefshme",
+       "apisandbox-submit-invalid-fields-message": "Ju lutem korrigjoni fushat e shënuara dhe provoni prap.",
        "apisandbox-results": "Rezultatet",
+       "apisandbox-sending-request": "Po dërgohen kërkesat API...",
+       "apisandbox-loading-results": "Po pranohen rezultatet API...",
+       "apisandbox-request-url-label": "URL e kërkesës:",
+       "apisandbox-request-json-label": "Kërko JSON:",
+       "apisandbox-request-time": "Koha e kërkesës: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "Përmirëso tokenin dhe ridorëzoje",
+       "apisandbox-results-fixtoken-fail": "Dështoi të merr \"$1\" tokenin.",
+       "apisandbox-alert-page": "Fushat në këtë faqe nuk janë të vlefshme.",
+       "apisandbox-alert-field": "Vlera në këtë fushë nuk është e vlefshme.",
+       "apisandbox-continue": "Vazhdo",
+       "apisandbox-continue-clear": "Pastro",
+       "apisandbox-param-limit": "Shkruaj <kbd>max</kbd> për të përdorur maksimumin e limitit",
+       "apisandbox-multivalue-all-namespaces": "$1 (të gjitha hapësirat)",
+       "apisandbox-multivalue-all-values": "$1 (të gjitha vlerat)",
        "booksources": "Burime librash",
        "booksources-search-legend": "Kërkim burimor librash",
        "booksources-search": "Kërko",
        "booksources-text": "Më posht është një listë me lidhje të cilët shesin ose përdorin libra dhe munden të kenë informacione për librat që kërkoni ju:",
        "booksources-invalid-isbn": "ISBN-ja e dhënë nuk duket të jetë e vlefshme; kontrolloni oër gabime gjatë kopjimit nga burimi origjinal.",
        "specialloguserlabel": "Performuesi:",
-       "speciallogtitlelabel": "Objektivi (titulli ose përdoruesi):",
+       "speciallogtitlelabel": "Caku (titulli ose {{ns:user}}:emri i përdoruesit):",
        "log": "Regjistrat",
+       "logeventslist-submit": "Shfaq",
        "all-logs-page": "Të gjitha regjistrat",
        "alllogstext": "Kjo faqe tregon të gjithë regjistrat e mundshëm të {{SITENAME}}.\nJu mund të kufizoni pamje sipas tipit të regjistrit, emrit të përdoruesit (shumë i ndjeshëm), dhe faqes në çështje (edhe rastet e ndjeshme)",
        "logempty": "Nuk ka asnjë përputhje në regjistër.",
        "log-title-wildcard": "Kërko tituj që fillojnë me këtë tekst",
        "showhideselectedlogentries": "Paraqit/fshih shënimet e përzgjedhura të regjistruara.",
+       "checkbox-select": "Zgjedh: $1",
+       "checkbox-all": "Të gjitha",
+       "checkbox-none": "Asnjë",
+       "checkbox-invert": "E kundërta",
        "allpages": "Të gjitha faqet",
        "nextpage": "Faqja tjetër ($1)",
        "prevpage": "Faqja e mëparshme ($1)",
        "cachedspecial-viewing-cached-ts": "Ju jeni duke e parë një version të ruajtur të kësaj faqe, që mund të mos jetë tërësisht e pranishme.",
        "cachedspecial-refresh-now": "Shikoni të fundit.",
        "categories": "Kategori",
+       "categories-submit": "Shfaq",
        "categoriespagetext": "{{PLURAL:$1|kategoria në vijim përmban|kategoritë në vikim përmbajnë}} faqe ose media.\n[[Special:UnusedCategories|Kategoritë e pa përdorura]] nuk janë të paraqitura këtu.\nShikoni edhe [[Special:WantedCategories|kategoritë e dëshiruara]].",
        "categoriesfrom": "Paraqit kategoritë duke filluar në:",
        "deletedcontributions": "Kontribute të grisura",
        "linksearch-pat": "Motivi kërkimor:",
        "linksearch-ns": "Hapësira:",
        "linksearch-ok": "Kërko",
-       "linksearch-text": "Ylli zëvëndësues mund të përdoret si p.sh. \"*.wikipedia.org\".\nDuhet një domen top-nivel, si p.sh. \"*.org.<br />\nProtokolle të mbështetura: <code>$1<code> (mos shtoni ndonjërin nga këta në kërkimin tuaj).",
+       "linksearch-text": "Ylli zëvendësues mund të përdoret si p.sh. \"*.wikipedia.org\".\nDuhet një domen top-nivel, si p.sh. \"*.org.<br />\n{{PLURAL:$2|Protokolli i|Protokollet e}} mbështetura: $1 (vendoset http:/ nëse nuk përcaktohet protokolli).",
        "linksearch-line": "$1 lidhur nga $2",
        "linksearch-error": "Ylli mund të përdoret vetëm në fillim të emrit",
        "listusersfrom": "Trego përdoruesit duke filluar prej te:",
        "listusers-blocked": "(Bllokuar)",
        "activeusers": "Lista e përdoruesve aktivë",
        "activeusers-intro": "Kjo është një listë e përdoruesve që kanë qenë aktivë për $1 {{PLURAL:$1|ditë|ditë}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|redaktim|redaktime}} në {{PLURAL:$3|ditën|$3 ditët}} e fundit",
+       "activeusers-count": "$1 {{PLURAL:$1|veprim|veprime}} në {{PLURAL:$3|ditën|$3 ditët}} e fundit",
        "activeusers-from": "Trego përdoruesit duke filluar prej te:",
        "activeusers-noresult": "Asnjë përdorues nuk u gjet.",
        "listgrouprights": "Grupime përdoruesish me privilegje",
        "listgrouprights-summary": "Më poshtë jepet grupimi i përdoruesve sipas privilegjeve që ju janë dhënë në këtë wiki. Më shumë informacion rreth privilegjeve në veçanti mund të gjendet [[{{MediaWiki:Listgrouprights-helppage}}|këtu]].",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">E drejtë e garantuar</span>\n* <span class=\"listgrouprights-revoked\">E drejtë e revokuar</span>",
+       "listgrouprights-key": "Legjenda:\n* <span class=\"listgrouprights-granted\">E drejtë e dhënë</span>\n* <span class=\"listgrouprights-revoked\">E drejtë e revokuar</span>",
        "listgrouprights-group": "Grupi",
        "listgrouprights-rights": "Privilegjet",
        "listgrouprights-helppage": "Help:Grupime privilegjesh",
        "listgrouprights-removegroup-self": "Hiqni {{PLURAL:$2|grupin|grupet}} nga llogaria: $1",
        "listgrouprights-addgroup-self-all": "Shtoni të gjitha grupet tek llogaria",
        "listgrouprights-removegroup-self-all": "Hiq të gjitha grupet nga llogaria",
+       "listgrants-grant": "Jep",
+       "listgrants-rights": "Privilegjet",
+       "trackingcategories": "Kategoritë përcjellëse",
+       "trackingcategories-msg": "Kategoria përcjellëse",
+       "trackingcategories-name": "Emri i porosisë",
+       "trackingcategories-desc": "Kriteret për përfshirje në kategori",
+       "trackingcategories-disabled": "Kategoria është pamundësuar",
        "mailnologin": "S'ka adresë dërgimi",
        "mailnologintext": "Duhet të keni [[Special:UserLogin|hyrë brenda]] dhe të keni një adresë të saktë në [[Special:Preferences|parapëlqimet]] tuaja për tu dërguar email përdoruesve të tjerë.",
        "emailuser": "Email {{GENDER:{{PAGENAME}}|përdoruesit|përdorueses}}",
+       "emailuser-title-target": "Dërgo email te ky {{GENDER:$1|përdorues}}",
        "emailuser-title-notarget": "Email për përdoruesin",
-       "emailpagetext": "Mund të përdorni formularin e mëposhtëm për të dërguar e-mail tek ky përdorues.\nAdresa e email-it që shkruat tek [[Special:Preferences|preferencat tuaja]] do të duket si \"Nga\" adresa e email-it, pra marrësi do të ketë mundësinë t'ju përgjigjet direkt.",
+       "emailpagetext": "Mund të përdorni formularin e mëposhtëm për të dërguar e-mail tek ky {{GENDER:$1|përdorues}}.\nAdresa e email-it që shkruat tek [[Special:Preferences|preferencat tuaja]] do të duket si \"Nga\" adresa e email-it, pra marrësi do të ketë mundësinë t'ju përgjigjet direkt.",
        "defemailsubject": "{{SITENAME}} emaili nga përdoruesi \"$1\"",
        "usermaildisabled": "Email-i i përdoruesit çaktivizua",
        "usermaildisabledtext": "Ju nuk mund të dërgoni e-mail tek përdoruesit e tjerë në këtë wiki",
        "emailccsubject": "Kopje e emailit tuaj për $1: $2",
        "emailsent": "Email-i u dërgua",
        "emailsenttext": "Email-i është dërguar.",
-       "emailuserfooter": "Kjo porosi elektronike u dërgua nga $1 tek $2 nga \"Dërgoi postë elektronike përdoruesit\" funksion në {{SITENAME}}.",
+       "emailuserfooter": "Kjo porosi elektronike u dërgua nga $1 tek $2 nga \"{{int:emailuser}}\" në {{SITENAME}}. Nëse përgjigjeni në këtë email, emaili juaj do të dërgohet direkt te dërguesi fillestar, duke ua shfaqur adresën tuaj të emailit atyre.",
        "usermessage-summary": "Lënia e mesazhit të sistemit.",
        "usermessage-editor": "I dërguari i sistemit",
        "watchlist": "Lista mbikqyrëse",
        "mywatchlist": "Lista mbikqyrëse",
        "watchlistfor2": "Për $1 $2",
        "nowatchlist": "Nuk keni asnjë faqe në listën mbikqyrëse.",
-       "watchlistanontext": "Ju lutemi $1 për të parë redaktimet e artikujve në listë tuaj mbikqyrëse.",
+       "watchlistanontext": "Ju lutemi kyçuni për të parë ose redaktuar njësitë në listën tuaj mbikëqyrëse.",
        "watchnologin": "Nuk keni hyrë brënda",
        "addwatch": "Shto tek lista mbikqyrëse",
-       "addedwatchtext": "Faqja \"[[:$1]]\"  i është shtuar [[Special:Watchlist|listës mbikqyrëse]] tuaj. Ndryshimet e ardhshme të kësaj faqeje dhe faqes së diskutimit të saj do të jepen më poshtë, dhe emri i faqes do të duket i '''trashë''' në [[Special:RecentChanges|listën e ndryshimeve së fundmi]] për t'i dalluar më kollaj.\n\nNë qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, shtypni \"çmbikqyre\" në tabelën e sipërme.",
+       "addedwatchtext": "\"[[:$1]]\"  dhe faqja e saj e diskutimit i është shtuar [[Special:Watchlist|listës tuaj të mbikëqyrjes]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" dhe faqja e saj e ndërlidhur janë shtuar [[Special:Watchlist|listës tuaj të mbikëqyrjes]].",
+       "addedwatchtext-short": "Faqja \"$1\" i është shtuar listës tuaj të mbikëqyrjes.",
        "removewatch": "Largo nga lista mbikqyrëse",
-       "removedwatchtext": "Faqja \"[[:$1]]\" është hequr nga [[Special:Watchlist|lista mbikqyrëse e juaj]].",
+       "removedwatchtext": "\"[[:$1]]\" dhe faqja e saj e diskutimit janë hequr nga [[Special:Watchlist|lista juaj mbikëqyrëse]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" dhe faqja e saj e ndërlidhur janë hequr nga [[Special:Watchlist|lista juaj e mbikëqyrjes]].",
+       "removedwatchtext-short": "Faqja \"$1\" janë hequr nga lista juaj e mbikëqyrjes.",
        "watch": "Mbikqyre",
        "watchthispage": "Mbikqyre këtë faqe",
        "unwatch": "Çmbikqyre",
        "unwatchthispage": "Mos e mbikqyr",
        "notanarticle": "Nuk është artikull",
        "notvisiblerev": "Revizioni është grisur",
-       "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikqyrje duke mos numëruar faqet e diskutimit.",
-       "wlheader-enotif": "Njoftimi me email është lejuar.",
-       "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
-       "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.",
-       "wlshowlast": "Trego $1 orët $2 ditët",
+       "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikëqyrje duke mos numëruar faqet e diskutimit.",
+       "wlheader-enotif": "Është aktivizuar njoftimi me email.",
+       "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të <strong>trasha<strong>.",
+       "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë <strong>$1</strong>''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|<strong>$2</strong>''' orët e fundit}}, që nga $3, $4.",
+       "wlshowlast": "Trego $1 orët $2 ditët e fundit",
+       "watchlist-hide": "Fshih",
+       "watchlist-submit": "Shfaq",
+       "wlshowtime": "Periudha e kohës për ta treguar:",
+       "wlshowhideminor": "redaktime të vogla",
+       "wlshowhidebots": "botët",
+       "wlshowhideliu": "përdorues të regjistruar",
+       "wlshowhideanons": "përdorues anonim",
+       "wlshowhidepatr": "redaktime të patrulluara",
+       "wlshowhidemine": "redaktimet e mia",
+       "wlshowhidecategorization": "kategorizim i faqes",
        "watchlist-options": "Mundësitë e listës mbikqyrëse",
        "watching": "Duke mbikqyrur...",
        "unwatching": "Mos e mbikqyr më...",
        "watcherrortext": "Është paraqitur një gabim përderisa ndryshuat parametrat e listës suaj mbikqyrëse për \"$1\".",
        "enotif_reset": "Shëno të gjitha faqet e vizituara",
        "enotif_impersonal_salutation": "Përdorues i {{SITENAME}}",
+       "enotif_subject_deleted": "{{SITENAME}} faqja $1 është fshirë nga $2",
        "enotif_subject_created": "{{SITENAME}} faqja $1 është {{GJINIA:$2|krijuar}} nga $2",
-       "enotif_lastvisited": "Shikoni $1 për të gjitha ndryshimet që prej vizitës tuaj të fundit.",
-       "enotif_lastdiff": "Shikoni $1 për ndryshime.",
+       "enotif_subject_moved": "{{SITENAME}} faqja $1 është lëvizuar nga $2",
+       "enotif_subject_restored": "{{SITENAME}} faqja $1 është rikthyer nga $2",
+       "enotif_subject_changed": "{{SITENAME}} faqja $1 është ndryshuar nga $2",
+       "enotif_body_intro_deleted": "{{SITENAME}} faqja $1 është fshirë në $PAGEEDITDATE nga $2, shiko $3.",
+       "enotif_lastvisited": "Për të gjitha ndryshimet që prej vizitës tuaj të fundit, shikoni $1",
+       "enotif_lastdiff": "Për të shikuar këtë ndryshim, shikoni $1",
        "enotif_anon_editor": "përdorues anonim $1",
-       "enotif_body": "I Nderuar $WATCHINGUSERNAME,\n\n\nKjo {{SITENAME}} faqe $PAGETITLE eshte $CHANGEDORCREATED on $PAGEEDITDATE by $PAGEEDITOR, see $PAGETITLE_URL per versioni mo i ri.\n\n$NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\nKontakto:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further changes unless you visit this page.\nYou could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE\n\nFaqja $PAGETITLE tek {{SITENAME}} është $CHANGEDORCREATED më $PAGEEDITDATE nga $PAGEEDITOR, shikoni $PAGETITLE_URL për versionin e tanishëm.\n\n$NEWPAGE\n\nPërmbledhja e redaktorit: $PAGESUMMARY $PAGEMINOREDIT\n\nMund të lidheni me redaktorin nëpërmjet:\nemail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNuk do të ketë njoftime të tjera për ndryshimet e ardhshme përveç nëse e vizitoni faqen. Gjithashtu mund të ktheni gjendjen e njoftimeve për të gjitha faqet nën mbikqyrje.\n\n             Miku juaj njoftues nga {{SITENAME}}\n\n--\nPër të ndryshuar parapëlqimet e mbikqyrjes shikoni {{canonicalurl:Special:Watchlist/edit}}\n\nPër të larguar faqen nga lista juaj mbikqyrëse, shikoni \n$UNWATCHURL\n\nPër të na dhënë përshtypjet tuaja ose për ndihmë të mëtejshme:\n{{canonicalurl:{{MediaWiki:Helpage}}}}",
+       "enotif_body": "I nderuar $WATCHINGUSERNAME, \n\nKjo {{SITENAME}} faqe $PAGETITLE është $CHANGEDORCREATED më $PAGEEDITDATE nga $PAGEEDITOR, shikoni $PAGETITLE_URL për versionin më të ri.\n\n$NEWPAGE\n\nPërmbledhja e redaktorit: $PAGESUMMARY $PAGEMINOREDIT\nKontakto:\nemail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNuk do të ketë njoftime të tjera për ndryshimet e ardhshme përveç nëse e vizitoni faqen. Gjithashtu mund të ktheni gjendjen e njoftimeve për të gjitha faqet nën mbikëqyrje.\n\nMiku juaj njoftues nga {{SITENAME}}\n\n--\nPër të ndryshuar parapëlqimet e mbikëqyrjes, shikoni {{canonicalurl:Special:Watchlist/edit}}\n\nPër të larguar faqen nga lista juaj e mbikëqyrjes, shikoni\n$UNWATCHURL\n\nPër përshtypje dhe ndihmë të mëtejshme:\n$HELPPAGE",
        "created": "u krijua",
        "changed": "ndryshuar",
        "deletepage": "Grise faqen",
        "exbeforeblank": "përmbajtja para boshatisjes ishte: '$1'",
        "delete-confirm": "Grise \"$1\"",
        "delete-legend": "Grise",
-       "historywarning": "'''Kujdes:''' Kjo faqe të cilën po e grisni ka histori me rreth $1 \n{{PLURAL:$1|version|redaktime}}:",
+       "historywarning": "'''Kujdes:''' Kjo faqe të cilën po e grisni ka histori me $1 \n{{PLURAL:$1|redaktim|redaktime}}:",
+       "historyaction-submit": "Shfaq",
        "confirmdeletetext": "Jeni duke grisur një faqe me tërë historinë e saj. Ju lutemi konfirmoni që po e bëni qëllimisht, që i kuptoni pasojat, dhe që po veproni në përputhje me [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Veprimi u krye",
        "actionfailed": "Veprimi dështoi",
        "delete-edit-reasonlist": "Ndrysho arsyet e grisjes",
        "delete-toobig": "Kjo faqe ka një historik të madh redaktimesh, më shumë se $1 {{PLURAL:$1|version|versione}}.\nGrisja e faqeve të tilla ka qenë kufizuar për të parandaluar përçarjen aksidentale të {{SITENAME}}.",
        "delete-warning-toobig": "Kjo faqe ka një historik të madh redaktimesh, më shumë se $1 {{PLURAL:$1|version|versione}}.\nGrisja e saj mund të ndërpresë operacionet e bazës së të dhënave të {{SITENAME}};\nvazhdoni me kujdes.",
+       "deleteprotected": "Nuk mund ta fshini këtë faqet sepse është mbrojtur.",
        "rollback": "Riktheji mbrapsh redaktimet",
        "rollbacklink": "riktheje",
        "rollbacklinkcount": "rikthe $1 {{PLURAL:$1|ndryshim|ndryshime}}",
        "rollbacklinkcount-morethan": "riktheni më tepër $1 {{PLURAL:$1|ndryshim|ndryshime}}",
        "rollbackfailed": "Rikthimi dështoi",
+       "rollback-missingparam": "Mungojnë parametrat e kërkuara mbi kërkesën.",
+       "rollback-missingrevision": "E pamundur të ngarkohen të dhënat e versionit.",
        "cantrollback": "Redaktimi nuk mund të kthehej;\nredaktori i fundit është i vetmi autor i këtij artikulli.",
        "alreadyrolled": "Nuk mund të rikthehej redaktimi i fundit i [[:$1]] nga [[User:$2|$2]] ([[User talk:$2|diskuto]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); dikush tjetër e ka redaktuar ose rikthyer këtë faqe tashmë.\n\nRedaktimi i fundit është bërë nga [[User:$3|$3]] ([[User talk:$3|diskuto]]{{nt:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Përmbledhja e redaktimit ishte: <em>$1</em>.",
        "revertpage": "Ndryshimet e [[Special:Contributions/$2|$2]] ([[User talk:$2|diskutimet]]) u kthyen mbrapsht, artikulli tani ndodhet në versionin e fundit nga [[User:$1|$1]].",
-       "revertpage-nouser": "U rikthyen redaktimet nga (përdoruesi i larguar) në versionin e fundit nga [[User:$1|$1]]",
-       "rollback-success": "Ndryshimet e $1 u kthyen mbrapsh; artikulli ndodhet tek verzioni i $2.",
+       "revertpage-nouser": "U rikthyen redaktimet nga një përdorues i fshehur në versionin e fundit nga {{GENDER:$1|[[User:$1|$1]]}}",
+       "rollback-success": "U kthyen mbrapsht redaktimet e {{GENDER:$3|$1}}; \nu kthye te versioni i fundit nga {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Dështim sesioni",
        "sessionfailure": "Duket se ka një problem me seancën tuaj hyrëse; ky veprim është anuluar për tu mbrojtur nga ndonjë veprim dashakeq kundrejt shfletimit tuaj. Ju lutemi kthehuni mbrapsh, rifreskoni faqen prej nga erdhët dhe provojeni përsëri veprimin.",
+       "changecontentmodel": "Ndrysho modelin e përmbajtjes së një faqeje",
+       "changecontentmodel-legend": "Ndrysho modelin e përmbajtjes",
        "changecontentmodel-title-label": "Titulli i faqes",
+       "changecontentmodel-model-label": "Model i ri i përmbajtjes",
        "changecontentmodel-reason-label": "Arsyeja:",
+       "changecontentmodel-submit": "Ndrysho",
+       "changecontentmodel-success-title": "Modeli i përmbajtjes është ndryshuar",
+       "changecontentmodel-success-text": "Tipi i përmbajtjes së [[:$1]] është ndryshuar.",
+       "changecontentmodel-cannot-convert": "Përmbajtja në [[:$1]] nuk mund të ndryshohet në një lloj të $2.",
+       "changecontentmodel-nodirectediting": "Modeli i përmbajtjes së $1 nuk përkrah redaktim të drejtpërdrejt",
+       "changecontentmodel-emptymodels-title": "Nuk ka ndonjë model të përmbajtjes",
+       "changecontentmodel-emptymodels-text": "Përmbajta në [[:$1]] nuk mund të ndërrohet në ndonjë lloj tjetër.",
+       "log-name-contentmodel": "Ditari i ndryshimeve të modelit të përmbajtjes",
+       "logentry-contentmodel-change-revertlink": "ktheje",
+       "logentry-contentmodel-change-revert": "ktheje",
        "protectlogpage": "Regjistri i mbrojtjeve",
        "protectlogtext": "Më poshtë është lista e kyçjeve dhe çkyçjeve të faqes.\nShih listën e [[Special:ProtectedPages|faqeve të mbrojtura]] nga lista e mbrojtjeve të faqeve tani në veprim.",
        "protectedarticle": "mbrojti [[$1]]",
        "modifiedarticleprotection": "u ndryshua mbrojtja e faqes \"[[$1]]\"",
        "unprotectedarticle": "Largo mbrojtjen nga \" [[$1]] \"",
        "movedarticleprotection": "u bartën të dhënat e mbrojtjes nga \"[[$2]]\" në \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Mbrojtur}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|U ndryshua niveli i mbrojtjes}} për \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Hoqi mbrojtjen}} nga \"[[$1]]\"",
        "protect-title": "Ndryshoni nivelin e mbrojtjes së \"$1\"",
        "protect-title-notallowed": "Shiko nivelin e mbrojtjes së \"$1\"",
        "prot_1movedto2": "[[$1]] u zhvendos tek [[$2]]",
        "protect-badnamespace-title": "Hapësirë e pambrojtshme",
        "protect-badnamespace-text": "Faqet në këtë hapësirë nuk mund të mbrohen.",
+       "protect-norestrictiontypes-text": "Kjo faqe nuk mund të mbrohet sepse nuk ka lloje të kufizimit në dispozicion.",
+       "protect-norestrictiontypes-title": "Faqet e pambrojtshme",
        "protect-legend": "Konfirmoni",
        "protectcomment": "Arsyeja:",
        "protectexpiry": "Afati",
        "protect-locked-access": "Llogaria juaj nuk ka privilegjet e nevojitura për të ndryshuar nivelin e mbrojtjes. Kufizimet e kësaj faqeje janë '''$1''':",
        "protect-cascadeon": "Kjo faqe është e mbrojtur pasi është përfshirë {{PLURAL:$1|këtë faqe që është|këto faqe që janë}} nën mbrojtje \"ujëvarë\".\nMund të ndryshoni nivelin e mbrojtjes të kësaj faqeje por kjo nuk do të ndryshojë mbrojtjen \"ujëvarë\".",
        "protect-default": "Lejoni të gjithë përdoruesit",
-       "protect-fallback": "Kërko leje \"$1\"",
-       "protect-level-autoconfirmed": "Blloko përdoruesit e rinj dhe ata pa llogari",
-       "protect-level-sysop": "Lejo vetëm administruesit",
+       "protect-fallback": "Lejo vetëm përdoruesit me leje \"$1\"",
+       "protect-level-autoconfirmed": "Lejo vetëm përdoruesit e vet-konfirmuar",
+       "protect-level-sysop": "Lejo vetëm administatorët",
        "protect-summary-cascade": "të varura",
        "protect-expiring": "skadon me $1 (UTC)",
        "protect-expiring-local": "Skadon $1",
        "protect-othertime": "Kohë tjetër:",
        "protect-othertime-op": "kohë tjetër",
        "protect-existing-expiry": "Koha ekzistuese e skadimit: $3, $2",
+       "protect-existing-expiry-infinity": "Koha ekzistuese e skadimit: pakufi",
        "protect-otherreason": "Arsye tjera/shtesë:",
        "protect-otherreason-op": "Arsyeja tjetër",
        "protect-dropdown": "*Arsye të përgjithshme të mbrojtjes\n**Vandalizëm i tepërt\n**Spam i tepërt\n**Paralajmërim i redaktimeve joprodukive\n**Faqe me trafik të lartë",
        "undeletepagetext": "{{PLURAL:$1|Faqja në vazhdim është grisur, por akoma është|$1 Faqet në vazhdim janë grisur, por akoma janë}} në arkiv dhe mund të rikthehen.\nArkivi, kohëpaskohe është e mundur të pastrohet.",
        "undelete-fieldset-title": "Rikthe revizionet",
        "undeleteextrahelp": "Per tu rregeluar histori, zbardh gjith kutit '''''{{int:undeletebtn}}'''''.\nTo perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|version u fut|versione u futën}} në arkiv",
+       "undeleterevisions": "$1 {{PLURAL:$1|versioni|versionet}} u fshinë",
        "undeletehistory": "Nëse restauroni një faqe, të gjitha versionet do të restaurohen në histori.\nNëse një faqe e re me të njëjtin titull është krijuar pas grisjes, versionet e restauruara do të paraqiten më mbrapa në histori.",
        "undeleterevdel": "Restaurimi nuk do të performohet n.q.s. do të rezultojë në majë të versioneve të faqes apo skedës duke u grisur pjesërisht.\nNë raste të tilla, ju duhet të çzgjidhni ose shfaqni versionet më të reja të grisura.",
        "undeletehistorynoadmin": "Kjo faqe është grisur. Arsyeja për grisjen është dhënë tek përmbledhja më poshtë bashkë me hollësitë e përdoruesve që e kanë redaktuar.",
        "undeleteviewlink": "Pamje",
        "undeleteinvert": "Selektim anasjelltas",
        "undeletecomment": "Arsyeja:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|version u restaurua|versione u restauruan}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|version|versione}} dhe $2 {{PLURAL:$2|skedë|skeda}} janë restauruar",
-       "undeletedfiles": "$1 {{PLURAL:$1|skedë u restaurua|skeda u restauruan}}",
-       "cannotundelete": "Restaurimi dështoi; dikush tjetër mund ta ketë restauruar faqen para jush.",
+       "cannotundelete": "Disa ose krejt çfshirjet dështuan:\n$1",
        "undeletedpage": "'''$1 është restauruar'''\n\nShikoni [[Special:Log/delete|regjistrin e grisjeve]] për grisjet dhe restaurimet së fundmi.",
        "undelete-header": "Shikoni [[Special:Log/delete|regjistrin e grisjeve]] për faqet e grisura së fundmi.",
        "undelete-search-title": "Kërko faqet e grisura",
        "contributions-title": "Kontributet e përdoruesit për $1",
        "mycontris": "Kontributet",
        "anoncontribs": "Kontribute",
-       "contribsub2": "Për $1 ($2)",
+       "contribsub2": "Për {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Llogaria e përdoruesit \"$1\" nuk është e regjistruar.",
        "nocontribs": "Nuk ka asnjë ndryshim që përputhet me këto kritere.",
        "uctop": "(aktual)",
        "month": "Nga muaji (dhe më herët):",
        "sp-contributions-newbies-sub": "Për newbies",
        "sp-contributions-newbies-title": "Kontributet e përdoruesit për kontot e reja",
        "sp-contributions-blocklog": "Regjistri i bllokimeve",
-       "sp-contributions-suppresslog": "Anëtar me Kontribute të kufizuara",
-       "sp-contributions-deleted": "kontributet e grisura",
+       "sp-contributions-suppresslog": "u fshehën kontributet e {{GENDER:$1|user}}",
+       "sp-contributions-deleted": "kontributet e grisura të {{GENDER:$1|user}}",
        "sp-contributions-uploads": "ngarkimet",
        "sp-contributions-logs": "Regjistrat",
        "sp-contributions-talk": "Diskutoni",
-       "sp-contributions-userrights": "menaxhimi i të drejtave të përdoruesit",
+       "sp-contributions-userrights": "menaxhimi i të drejtave të {{GENDER:$1|përdoruesit}}",
        "sp-contributions-blocked-notice": "Ky përdorues është i bllokuar.\nBllokimi i fundit është shfaqur më poshtë për referencë:",
        "sp-contributions-blocked-notice-anon": "Kjo adresë IP është e bllokuar aktualisht.\nBllokimi i funditë është më poshtë për referencë:",
        "sp-contributions-search": "Kërko tek kontributet",
        "sp-contributions-username": "IP Addresa ose Përdoruesi:",
        "sp-contributions-toponly": "Trego vetëm redaktimet që janë versionet më të fundit",
+       "sp-contributions-newonly": "Trego vetëm redaktimet që janë krijime të faqeve",
+       "sp-contributions-hideminor": "Fshih redaktimet e vogla",
        "sp-contributions-submit": "Kërko",
        "whatlinkshere": "Lidhjet këtu",
        "whatlinkshere-title": "Faqe që lidhen tek $1",
        "whatlinkshere-hidelinks": "$1 lidhjet",
        "whatlinkshere-hideimages": "$1 lidhjet me skedat",
        "whatlinkshere-filters": "Filtra",
+       "whatlinkshere-submit": "Shko",
        "autoblockid": "Autobllokim #$1",
        "block": "Blloko përdoruesin",
        "unblock": "Zhblloko përdoruesin",
-       "blockip": "Blloko përdorues",
+       "blockip": "Blloko {{GENDER:$1|user}}",
        "blockip-legend": "Blloko përdoruesin",
-       "blockiptext": "Përdorni formularin e mëposhtëm për të hequr lejen e shkrimit për një përdorues ose IP specifike.\nKjo duhet bërë vetëm në raste vandalizmi, dhe në përputhje me [[{{MediaWiki:Policy-url}}|rregullat e {{SITENAME}}-s]].\nPlotësoni arsyen specifike më poshtë (p.sh., tregoni faqet specifike që u vandalizuan).",
+       "blockiptext": "Përdorni formularin e mëposhtëm për të hequr lejen e shkrimit për një përdorues ose IP specifike.\nKjo duhet bërë vetëm në raste vandalizmi, dhe në përputhje me [[{{MediaWiki:Policy-url}}|politikat]].\nPlotësoni arsyen specifike më poshtë (p.sh., tregoni faqet specifike që u vandalizuan).\nJu mund të bllokoni vargjet e adresës IP duke përdorur sintaksën [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; vargu më i madh i lejuar është /$1 për IPv4 dhe /$2 për IPv6.",
        "ipaddressorusername": "Adresë IP ose emër përdoruesi",
        "ipbexpiry": "Afati",
        "ipbreason": "Arsyeja:",
        "ipb-confirm": "Konfirmo bllokimin",
        "badipaddress": "Nuk ka asnjë përdorues me atë emër",
        "blockipsuccesssub": "Bllokimi u bë me sukses",
-       "blockipsuccesstext": "Përdoruesi/IP-Adresa [[Special:Contributions/$1|$1]] u bllokua.<br />\nShiko te [[Special:BlockList|Lista e përdoruesve dhe e IP adresave të bllokuara]] për të çbllokuar Përdorues/IP.",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] është bllokuar.<br />\nShiko [[Special:BlockList|listen e bllokimeve]] për të rishikuar bllokimet.",
        "ipb-blockingself": "Ju jeni duke bllokuar vetëveten ! Jeni te sigurte qe doni te bëni këtë?",
        "ipb-confirmhideuser": "Ju jeni gati për të bllokuar një përdorues që ka aktivizuar statusin \"përdorues i fshehur\". Kjo do të shtyp emrin e përdoruesit në të gjitha listat regjistrimet. Jeni të sigurtë që doni ta bëni këtë?",
        "ipb-edit-dropdown": "Redakto arsyet e bllokimit",
        "ipb-unblock": "Çblloko përdorues dhe IP të bllokuara",
        "ipb-blocklist": "Përdorues dhe IP adresa të bllokuara",
        "ipb-blocklist-contribs": "Kontributet për {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "kanë mbetë $1",
        "unblockip": "Zhblloko përdoruesin",
        "unblockiptext": "Përdor formularin e më poshtëm për t'i ridhënë leje shkrimi\nnjë përdoruesi ose IP adreseje të bllokuar.",
        "ipusubmit": "Hiqni këtë bllokim",
        "unblocked-id": "Bllokimi $1 është hequr",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] është zhbllokuar.",
        "blocklist": "Përdorues i Bllokuar",
+       "autoblocklist": "Autobllokimet",
+       "autoblocklist-submit": "Kërko",
+       "autoblocklist-legend": "Rreshto autobllokimet",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Autoblloku lokal|Autobllokimet lokale}}",
+       "autoblocklist-empty": "Lista e autobllokimeve është e zbrazët.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Autoblloku tjetër|Autoblloqet tjera}}",
        "ipblocklist": "Përdorues i Bllokuar",
        "ipblocklist-legend": "Gjej një përdorues të bllokuar",
        "blocklist-userblocks": "Fsheh bllokimin e llogarisë",
        "change-blocklink": "ndryshoje bllokun",
        "contribslink": "kontribute",
        "emaillink": "dërgo e-mail",
-       "autoblocker": "Bllokuar automatikisht sepse adresa juaj IP është përdorur së fundmi nga \"[[User:$1|$1]]\".\nArsyeja e dhënë për bllokimin e $1 është: \"$2\"",
+       "autoblocker": "Bllokuar automatikisht sepse adresa juaj IP është përdorur rishtas nga \"[[User:$1|$1]]\".\nArsyeja e dhënë për bllokimin e $1 është \"$2\"",
        "blocklogpage": "Regjistri i bllokimeve",
        "blocklog-showlog": "Ky përdorues ka qenë bllokuar më parë.\nRegjistri i bllokimeve është poshtë për referncë:",
        "blocklog-showsuppresslog": "Ky përdorues ka qenë i bllokuar dhe i fshehur më parë.\nRegjistri i bllokimeve është poshtë për referncë:",
        "block-log-flags-hiddenname": "emri i përdoruesit i fshehur",
        "range_block_disabled": "Mundësia e administruesve për të bllokuar me shtrirje është çaktivizuar.",
        "ipb_expiry_invalid": "Afati i kohës është gabim.",
+       "ipb_expiry_old": "Data e skadencës është në të shkuarën.",
        "ipb_expiry_temp": "Bllokimet e përdoruesve të fshehur duhet të jenë të përhershme.",
-       "ipb_hide_invalid": "Nuk mund ta prishni këtë llogari; mund të ketë shumë redaktime.",
+       "ipb_hide_invalid": "Nuk mund ta prishni këtë llogari; ka më shumë se {{PLURAL:$1|një redaktim|$1 redaktime}}.",
        "ipb_already_blocked": "\"$1\" është i bllokuar",
        "ipb-needreblock": "$1 është i bllokuar.\nDëshironi t'i ndryshoni parametrat?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Bllokim tjetër|Bllokime të tjera}}",
        "proxyblockreason": "IP adresa juaj është bllokuar sepse është një ndërmjetëse e hapur. Ju lutem lidhuni me kompaninë e shërbimeve të Internetit që përdorni dhe i informoni për këtë problem sigurije.",
        "sorbsreason": "Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL.",
        "sorbs_create_account_reason": "Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL që përdoret nga {{SITENAME}}. Nuk ju lejohet të hapni një llogari.",
+       "softblockrangesreason": "Kontributet anonime nuk lejohen nga adresa IP e juaj ($1)",
        "cant-see-hidden-user": "Përdoruesi që po përpiqeni të bllokoni është i bllokuar dhe i fshehur.\nPërderisa ju nuk keni të drejtën e fshehjes së përdoruesve, ju nuk mund të shikoni ose redaktoni bllokimet e përdoruesit.",
        "ipbblocked": "Ti nuk mund t'i bllokosh ose zhbllokosh përdoruesit e tjerë, sepse je vet i bllokuar",
        "ipbnounblockself": "Ju nuk mund të zhbllokoni veten tuaj",
        "lockdbsuccesstext": "Regjistri është bllokuar.<br />\nKujtohuni ta [[Special:UnlockDB|çbllokoni]] pasi të keni mbaruar mirëmbajtjen.",
        "unlockdbsuccesstext": "Baza e të dhënave {{SITENAME}} është zhbllokuar.",
        "lockfilenotwritable": "Skeda për bllokimin e regjistrit s'mund të shkruhet.\nShërbyesi i rrjetit duhet të jetë në gjendje të shkruaj këtë skedë për të bllokuar ose çbllokuar regjistrin.",
+       "databaselocked": "Baza e të dhënave veç është bllokuar.",
        "databasenotlocked": "Regjistri nuk është bllokuar.",
        "lockedbyandtime": "(nga {{GENDER:$1|$1}} më $2 në $3)",
        "move-page": "Zhvendose $1",
        "move-page-legend": "Zhvendose faqen",
-       "movepagetext": "Duke përdorur formularin e mëposhtëm do të ndërroni titullin e një faqeje, duke zhvendosur gjithë historkun e saj tek titulli i ri.\nTitulli i vjetër do të bëhet një faqe ridrejtuese tek titulli i ri.\nLidhjet tek faqja e vjetër nuk do të ndryshohen;\nduhet të kontrolloni mirëmbajtjen për përcjellime të [[Special:DoubleRedirects|dyfishta]] ose të [[Special:BrokenRedirects|prishura]].\nKeni përgjegjësinë për tu siguruar që lidhjet të vazhdojnë të jenë të sakta.\n\nKini parasysh se kjo faqe '''nuk''' do të zhvendoset n.q.s. ekziston një faqe me titullin e ri, përveçse nëse ajo është bosh ose një përcjellim dhe nuk ka historik të redaktimeve.\nKjo do të thotë se mund ta zhvendosni një faqe prapë tek emri i vjetër n.q.s. keni bërë një gabim, dhe s'mund ta prishësh një faqe që ekziston.\n\n'''KUJDES!'''\nKy mund të jetë një ndryshim i madh dhe i papritur për një faqe të shumë-frekuentuar; ju lutem, kini kujdes dhe mendohuni mirë para se të përdorni këtë funksion.",
-       "movepagetext-noredirectfixer": "Duke përdorur formularin e mëposhtëm do të ndërroni titullin e një faqeje, duke zhvendosur gjithë historinë përkatëse tek titulli i ri.\nTitulli i vjetër do të bëhet një faqe përcjellëse tek titulli i ri.\nLidhjet tek faqja e vjetër nuk do të ndryshohen;\nduhet të kontrolloni mirëmbajtjen për përcjellime të [[Special:DoubleRedirects|dyfishta]] ose të [[Special:BrokenRedirects|prishura]].\nKeni përgjegjësinë për tu siguruar që lidhjet të vazhdojnë të jenë të sakta.\n\nVini re se kjo faqe '''nuk''' do të zhvendoset n.q.s. ekziston një faqe me titullin e ri, përveçse kur ajo të jetë bosh ose një përcjellim dhe të mos ketë një histori të vjetër.\nKjo do të thotë se mund ta zhvendosni një faqe prapë tek emri i vjetër n.q.s. keni bërë një gabim, dhe s'mund ta prishësh një faqe që ekziston.\n\n'''KUJDES!'''\nKy mund të jetë një ndryshim i madh dhe gjëra të papritura mund të ndodhin për një faqe të shumë-frekuentuar; ju lutem, kini kujdes dhe mendohuni mirë para se të përdorni këtë funksion.",
-       "movepagetalktext": "Faqja a bashkangjitur e diskutimit, n.q.s. ekziston, do të zhvendoset automatikisht '''përveçse''' kur:\n*Zhvendosni një faqe midis hapësirave të ndryshme,\n*Një faqe diskutimi jo-boshe ekziston nën titullin e ri, ose\n*Nuk zgjidhni kutinë më poshtë.\n\nNë ato raste, duhet ta zhvendosni ose përpuqni faqen vetë n.q.s. dëshironi.",
+       "movepagetext": "Duke përdorur formularin e mëposhtëm do të ndërroni titullin e një faqeje, duke zhvendosur gjithë historikun e saj tek titulli i ri.\nTitulli i vjetër do të bëhet një faqe ridrejtuese tek titulli i ri.\nLidhjet tek faqja e vjetër nuk do të ndryshohen;\nduhet të kontrolloni mirëmbajtjen për përcjellime të [[Special:DoubleRedirects|dyfishta]] ose të [[Special:BrokenRedirects|prishura]].\nKeni përgjegjësinë për tu siguruar që lidhjet të vazhdojnë të jenë të sakta.\n\nKini parasysh se kjo faqe <strong>nuk</strong>''' do të zhvendoset n.q.s. ekziston një faqe me titullin e ri, përveçse nëse ajo është bosh ose një përcjellim dhe nuk ka historik të redaktimeve.\n\nKjo do të thotë se mund ta zhvendosni një faqe prapë tek emri i vjetër n.q.s. keni bërë një gabim, dhe s'mund ta prishësh një faqe që ekziston.\n\n<strong>Shënim:</strong>\nKy mund të jetë një ndryshim i madh dhe i papritur për një faqe të shumë-frekuentuar; ju lutem, keni kujdes dhe mendohuni mirë para se të përdorni këtë funksion.",
+       "movepagetext-noredirectfixer": "Duke përdorur formularin e mëposhtëm do të ndërroni titullin e një faqeje, duke zhvendosur gjithë historinë përkatëse tek titulli i ri.\nTitulli i vjetër do të bëhet një faqe përcjellëse tek titulli i ri.\nLidhjet tek faqja e vjetër nuk do të ndryshohen;\nduhet të kontrolloni mirëmbajtjen për përcjellime të [[Special:DoubleRedirects|dyfishta]] ose të [[Special:BrokenRedirects|prishura]].\nKeni përgjegjësinë për tu siguruar që lidhjet të vazhdojnë të jenë të sakta.\n\nVini re se kjo faqe <strong>nuk</strong>''' do të zhvendoset n.q.s. ekziston një faqe me titullin e ri, përveçse kur ajo të jetë bosh ose një përcjellim dhe të mos ketë një histori të vjetër.\nKjo do të thotë se mund ta zhvendosni një faqe prapë tek emri i vjetër n.q.s. keni bërë një gabim, dhe s'mund ta prishësh një faqe që ekziston.\n\n<strong>Shënim:</strong>\nKy mund të jetë një ndryshim i madh dhe gjëra të papritura mund të ndodhin për një faqe të shumë-frekuentuar; ju lutem, kini kujdes dhe mendohuni mirë para se të përdorni këtë funksion.",
+       "movepagetalktext": "Nëse e zgjidhni këtë kuti, faqja a bashkangjitur e diskutimit vetvetiu do të zhvendoset te titulli i ri, përveç nëse një faqe jo e zbrazët e diskutimit veç ekziston atje.\n\nNë ato raste duhet ta zhvendosni ose përpuqni faqen vetë n.q.s. dëshironi.",
        "moveuserpage-warning": "'''Kujdes:''' Ju po zhvendosni një faqe përdoruesi. Ju lutemi, kujtoni se vetëm faqja do të zhvendoset dhe përdoruesi ''nuk'' do të ndryshojë emrin.",
        "movenologintext": "Duhet të keni hapur një llogari dhe të keni [[Special:UserLogin|hyrë brenda]] për të zhvendosur një faqe.",
        "movenotallowed": "Nuk ju lejohet të zhvendosni faqe.",
        "movenotallowedfile": "Nuk keni leje për të lëvizur skeda.",
        "cant-move-user-page": "Ju nuk keni të drejat për të lzhvendosur faqet e përdoruesve (përveç nën-faqeve).",
        "cant-move-to-user-page": "Ju nuk keni të drejta për të zhvendosur një faqe tek një faqe përdoruesi (përvç tek një nën-faqe përdoruesi).",
-       "newtitle": "Tek titulli i ri",
+       "cant-move-category-page": "Nuk ju lejohet të zhvendosni kategori.",
+       "newtitle": "Titull i ri:",
        "move-watch": "Mbikqyre këtë faqe",
        "movepagebtn": "Zhvendose faqen",
        "pagemovedsub": "Zhvendosja doli me sukses",
        "movenosubpage": "Kjo faqe nuk ka nën-faqe.",
        "movereason": "Arsyeja:",
        "revertmove": "ktheje",
-       "delete_and_move_text": "==Nevojitet grisje==\n\nFaqja \"[[:$1]]\" ekziston, dëshironi ta grisni për të mundësuar zhvendosjen?",
+       "delete_and_move_text": "Faqja e destinimit \"[[:$1]]\" ekziston. Dëshironi ta grisni për të mundësuar zhvendosjen?",
        "delete_and_move_confirm": "Po, fshi këtë faqe",
        "delete_and_move_reason": "U gris për të liruar vendin për përcjellim të \"[[$1]]\"",
        "selfmove": "Nuk munda ta zhvendos faqen sepse titulli i ri është i njëjtë me të vjetrin.",
        "move-leave-redirect": "Lini një përcjellim prapa",
        "protectedpagemovewarning": "'''Kujdes''': Kjo faqe është mbrojtur, kështu që vetëm përdoruesit me privilegje administratorësh mund ta zhvendosin atë.\nVeprimi i fundit mbi këtë faqe është poshtë për referncë:",
        "semiprotectedpagemovewarning": "'''Kujdes''': Kjo faqe është mbrojtur, kështu që vetëm përdoruesit e regjistruar mund ta zhvendosin atë.\nVeprimi i fundit mbi këtë faqe është poshtë për referncë:",
-       "move-over-sharedrepo": "== Skeda ekziston ==\n[[:$1]] ekziston në një magazinë të përbashkët. Zhvendosja e një skede tek ky titull do të mbishkruajë skedën e përbashkët.",
+       "move-over-sharedrepo": "[[:$1]] ekziston në një magazinë të përbashkët. Zhvendosja e një skede te ky titull do të mbishkruaj skedën e përbashkët.",
        "file-exists-sharedrepo": "Emri i zgjedhur i skedës është në përdorim në një magazinë të përbashkët.\nJu lutemi zgjidhni në emët tjetër.",
        "export": "Eksportoni faqe",
        "exporttext": "Mund të eksportoni tekstin dhe historinë e redaktimit e një faqeje ose disa faqesh të mbështjesha në XML; kjo mund të importohet në një wiki tjetër që përdor softuerin MediaWiki (tani për tani, ky opsion nuk është përfshirë tek {{SITENAME}}).\n\nPër të eksportuar faqe, thjesht shtypni një emër për çdo rresht, ose krijoni lidhje të tipit [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] si [[{{MediaWiki:Mainpage}}]].",
        "thumbnail_gd-library": "Konfigurim librarie GD i paplotë: mungon funksoni $1",
        "thumbnail_image-missing": "Skeda duket se mungon: $1",
        "import": "Importoni faqe",
-       "importinterwiki": "Import ndër-wiki",
-       "import-interwiki-text": "Zgjidhni një wiki dhe titull faqeje për të importuar.\nDatat e versioneve dhe emrat e redaktuesve do të ruhen.\nTë gjitha veprimet e importit transwiki janë të regjistruara tek [[Special:Log/import|registri i importimeve]].",
+       "importinterwiki": "Importo nga një wiki tjetër",
+       "import-interwiki-text": "Zgjidhni një wiki dhe titull faqeje për të importuar.\nDatat e versioneve dhe emrat e redaktuesve do të ruhen.\nTë gjitha importimet nga wikit tjera janë të regjistruara tek [[Special:Log/import|regjistri i importimeve]].",
        "import-interwiki-sourcewiki": "Burimi wiki:",
        "import-interwiki-sourcepage": "Burimi i faqes:",
        "import-interwiki-history": "Kopjo të gjitha versionet e historisë për këtë faqe",
        "importcantopen": "Nuk mund të hapë skedën e importuar",
        "importbadinterwiki": "Lidhje e prishur interwiki",
        "importsuccess": "Importim i sukseshëm!",
-       "importnosources": "Nuk ka asnjë burim importi të përcaktuar dhe ngarkimet historike të drejtpërdrejta janë ndaluar.",
+       "importnosources": "Nuk janë përcaktuar wiki-t nga të cilat mund të importohet dhe ngarkimet historike të drejtpërdrejta janë ndaluar.",
        "importnofile": "Nuk u ngarkua asnjë skedë importi.",
        "importuploaderrorsize": "Ngarkimi ose importimi i skedës dështoi.\nSkeda është më e madhe se madhësia e lejuar.",
        "importuploaderrorpartial": "Ngarkimi ose importimi i skedës dështoi.\nSkeda u ngarkua vetëm pjesërisht.",
        "importuploaderrortemp": "Ngarkimi ose importimi i skedës dështoi.\nNjë dosje e përkohëshme mungon.",
        "import-parse-failure": "Dështim i analizës së importit XML",
        "import-noarticle": "S'ka faqe për tu importuar!",
-       "import-nonewrevisions": "Të gjitha versionet kanë qenë të importuara më parë.",
+       "import-nonewrevisions": "Nuk u importua asnjë version (të gjitha ose ishin prezent ose u kaluan per shkak të gabimeve).",
        "xml-error-string": "$1 në vijën $2, kol $3 (bite $4): $5",
        "import-upload": "Ngarko të dhëna XML",
-       "import-token-mismatch": "Humbje e të dhënave të sesionit.\nJu lutemi provoni përsëri.",
+       "import-token-mismatch": "Humbje e të dhënave të sesionit.\n\nMund të jeni shkyçur. <strong>Ju lutemi verifikoni që jeni akoma i identifikuar dhe provoni përsëri</strong>.\nNëse akoma nuk funksionon, provoni të [[Special:UserLogout|shkyçeni]] dhe kyçeni prap, dhe kontrolloni që shfletuesi juaj lejon biskotat nga kjo faqe.",
        "import-invalid-interwiki": "Nuk mund të importohet nga wiki i specifikuar.",
        "import-error-edit": "Faqja \"$1\" nuk është importuar sepse ju nuk lejoheni ta redaktoni atë.",
        "import-error-create": "Faqja \"$1\" nuk është importuar sepse ju nuk lejoheni ta krijoni atë.",
        "import-error-interwiki": "Faqja \"$1\" nuk është importuar sepse emri i saj është rezervuar për lidhje të jashtme (interwiki)",
-       "import-error-special": "Faqja \"$1\" nuk është importuar sepse ajo i përket një hapësire të veçantë që nuk i lejon faqet.",
-       "import-error-invalid": "Faqja \"$1\" nuk është importuar sepse emri i saj është i palejueshëm.",
+       "import-error-special": "Faqja \"$1\" nuk është importuar sepse ajo i përket një hapësire të veçantë që nuk lejon faqe.",
+       "import-error-invalid": "Faqja \"$1\" nuk është importuar sepse emri me të cilin do të importohej është i palejueshëm në këtë wiki.",
        "importlogpage": "Regjistri i importeve",
        "importlogpagetext": "Importimet administrative të faqeve me historik redaktimi nga wiki-t e tjera.",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versione}}",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$!1|version|versione}} nga $2",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versione}} u importuan",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$!1|version|versione}} u importuan nga $2",
        "javascripttest": "Duke testuar JavaScript",
        "javascripttest-qunit-intro": "Shiko [$1 dokumentacionin e testimit] në mediawiki.org.",
-       "tooltip-pt-userpage": "Faqja jote e përdoruesit",
+       "tooltip-pt-userpage": "{{GENDER:|Faqja juaj}} e përdoruesit",
        "tooltip-pt-anonuserpage": "Faqja e përdoruesve anonim nga kjo adresë IP",
-       "tooltip-pt-mytalk": "Faqja jote e diskutimeve",
+       "tooltip-pt-mytalk": "Faqja juaj e diskutimit",
        "tooltip-pt-anontalk": "Faqja e diskutimeve të përdoruesve anonim për këtë adresë IP",
-       "tooltip-pt-preferences": "Parapëlqimet tua",
+       "tooltip-pt-preferences": "Parapëlqimet tua",
        "tooltip-pt-watchlist": "Lista e faqeve nën mbikqyrjen tuaj.",
        "tooltip-pt-mycontris": "Lista e kontributeve tua",
        "tooltip-pt-login": "Identifikimi nuk është i detyrueshëm, megjithatë ne jua rekomandojmë.",
        "tooltip-t-recentchangeslinked": "Lista e ndryshimeve të faqeve që lidhen tek kjo faqe",
        "tooltip-feed-rss": "Burimi ushqyes \"RSS\" për këtë faqe",
        "tooltip-feed-atom": "Burimi ushqyes \"Atom\" për këtë faqe",
-       "tooltip-t-contributions": "Shiko listën e kontributeve për përdoruesin në fjalë",
-       "tooltip-t-emailuser": "Dërgoni një email {{GENDER:{{PAGENAME}}|përdoruesit|përdorueses}}",
+       "tooltip-t-contributions": "Një listë e kontributeve nga {{GENDER:$1|ky përdorues|kjo përdoruese}}",
+       "tooltip-t-emailuser": "Dërgoni një email te ky {{GENDER:$1|përdorues}}",
+       "tooltip-t-info": "Më shumë informacion për këtë faqe",
        "tooltip-t-upload": "Ngarko skeda",
        "tooltip-t-specialpages": "Lista e të gjitha faqeve speciale.",
        "tooltip-t-print": "Version i shtypshëm i kësaj faqeje",
        "tooltip-ca-nstab-category": "Shikoni faqen e kategorisë",
        "tooltip-minoredit": "Shënoje këtë redaktim të vogël",
        "tooltip-save": "Kryej ndryshimet",
+       "tooltip-publish": "Publiko ndryshimet tuaja",
        "tooltip-preview": "Shqyrtoni ndryshimet tuaj, ju lutemi, bëjeni këtë para se të ruani ndryshimet!",
        "tooltip-diff": "Trego ndryshimet që Ju i keni bërë tekstit.",
        "tooltip-compareselectedversions": "Shikoni krahasimin midis dy versioneve të zgjedhura të kësaj faqeje.",
        "anonymous": "{{PLURAL:$1|Përdoruesi anonim|Përdoruesit anonimë}} të {{SITENAME}}",
        "siteuser": "Përdoruesi $1 nga {{SITENAME}}",
        "anonuser": "Përdorues anonim i {{SITENAME}} $1",
-       "lastmodifiedatby": "Kjo faqe është redaktuar së fundit më $2, $1 nga $3.",
+       "lastmodifiedatby": "Kjo faqe është redaktuar së fundi në ora $2, më $1 nga $3.",
        "othercontribs": "Bazuar në punën e: $1",
        "others": "të tjerë",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|përdorues|përdorues}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|përdoruesi|përdoruesit}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|përdoruesi anonim|përdoruesit anonimë}} $1",
        "creditspage": "Statistika e faqes",
        "nocredits": "Për këtë faqe nuk ka informacione.",
        "spam_deleting": "Të gjitha inspektimet përmbanin lidhje në $1, duke fshirë",
        "simpleantispam-label": "Kontrolli anti-spam.\n<strong>Mos</strong> e plotëso këtë!",
        "pageinfo-title": "Informacion për \" $1 \"",
+       "pageinfo-not-current": "Kërkojmë falje, është e pamundur të jepet ky informacion për versionet e fundit.",
        "pageinfo-header-basic": "Informatat bazike",
        "pageinfo-header-edits": "Historiku i redaktimeve",
        "pageinfo-header-restrictions": "Mbrojtja e faqes",
        "pageinfo-length": "Gjatësia e faqes (në bajt)",
        "pageinfo-article-id": "ID-ja e faqes",
        "pageinfo-language": "Gjuha e përmbajtjes së faqes",
+       "pageinfo-language-change": "ndrysho",
+       "pageinfo-content-model": "Model i përmbajtjes së faqes",
+       "pageinfo-content-model-change": "ndrysho",
+       "pageinfo-robot-policy": "indeksimi nga robotët",
+       "pageinfo-robot-index": "Lejuar",
+       "pageinfo-robot-noindex": "Palejuar",
        "pageinfo-watchers": "Numri i mbikqyrësve të faqes",
+       "pageinfo-redirects-name": "Numri i ridrejtimeve drejt kësaj faqeje",
+       "pageinfo-subpages-name": "Numri i nën-faqeve të kësaj faqeje",
        "pageinfo-firstuser": "Krijuesi i faqes",
        "pageinfo-firsttime": "Data e krijimit të faqes",
        "pageinfo-lastuser": "Redaktori i fundit",
        "pageinfo-edits": "Numri total i redaktimeve",
        "pageinfo-authors": "Numri i përgjithshëm i autorëve të veçantë",
        "pageinfo-recent-edits": "Numri i redaktimeve më të fundit (gjatë $1 ditëve të kaluara)",
+       "pageinfo-recent-authors": "Numri i rishtëm i autorëve të veçantë",
+       "pageinfo-magic-words": "{{PLURAL:$1|Fjala|fjalët}} magjike ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Kategoria|kategoritë}} e fshehura ($1)",
        "pageinfo-toolboxlink": "Informacioni i faqes",
+       "pageinfo-redirectsto": "Ridrejton te",
        "pageinfo-redirectsto-info": "info",
        "pageinfo-contentpage": "Llogaritet si një përmbajtje e faqes",
        "pageinfo-contentpage-yes": "Po",
+       "pageinfo-protect-cascading": "Mbrojtjet po burojnë prej këtu",
        "pageinfo-protect-cascading-yes": "Po",
+       "pageinfo-protect-cascading-from": "Mbrojtjet po burojnë nga",
        "pageinfo-category-info": "Informacioni i kategorisë",
        "pageinfo-category-total": "Numri i përgjithshëm i anëtarëve",
        "pageinfo-category-pages": "Numri i faqeve",
        "pageinfo-category-subcats": "Numri i nënkategorive",
        "pageinfo-category-files": "Numri i skedave",
+       "pageinfo-user-id": "ID e përdoruesit",
        "markaspatrolleddiff": "Shënoje si të patrulluar",
        "markaspatrolledtext": "Shënoje këtë artikull të patrulluar",
+       "markaspatrolledtext-file": "Shënoje këtë version të skedarit si të patrolluar",
        "markedaspatrolled": "Shënoje të patrulluar",
        "markedaspatrolledtext": "Versioni i zgjedhur i [[:$1]] është shënuar si i patrolluar.",
        "rcpatroldisabled": "Kontrollimi i ndryshimeve së fundmi është bllokuar",
        "markedaspatrollederror": "Nuk munda ta shënoj të patrulluar",
        "markedaspatrollederrortext": "Duhet të përcaktoni versionin për tu shënuar i patrulluar.",
        "markedaspatrollederror-noautopatrol": "Ju nuk lejoheni të shënoni ndryshimet tuaj si të patrolluara.",
+       "markedaspatrollednotify": "Ky ndryshim i $1 është shënuar si i patrulluar.",
+       "markedaspatrollederrornotify": "Shënimi si i patrulluar dështoi.",
        "patrol-log-page": "Regjistri i patrollimeve",
        "patrol-log-header": "Këto janë të dhëna të revizioneve të patrulluara.",
        "log-show-hide-patrol": "$1 regjistri i patrollimeve",
+       "log-show-hide-tag": "$1 regjistri i etiketave",
+       "confirm-markpatrolled-button": "Në rregull",
+       "confirm-markpatrolled-top": "Shëno versionin $3 nga $2 si të patrolluar",
        "deletedrevision": "Gris versionin e vjetër $1",
        "filedeleteerror-short": "Gabim gjatë grisjes së skedës: $1",
        "filedeleteerror-long": "U hasën gabime gjatë grisjes së skedës:\n\n$1",
        "file-info-size-pages": "$1 × $2 pixel, madhësia e dokumentit: $3 , MIME tipi: $4 , $5 {{PLURAL:$5| faqe | faqet}}",
        "file-nohires": "Nuk ka rezolucion më të madh.",
        "svg-long-desc": "skedë SVG, fillimisht $1 × $2 pixel, madhësia e skedës: $3",
+       "svg-long-error": "Skedar SVG i parregullt: $1",
        "show-big-image": "Dokument origjinal",
        "show-big-image-preview": "Madhësia e këtij shikimi: $1.",
        "show-big-image-other": "{{PLURAL:$2|Rezolucion tjetër|Rezolucione të tjera}}: $1.",
        "newimages-summary": "Kjo faqe speciale tregon skedat e ngarkuara së fundmi.",
        "newimages-legend": "Filtrues",
        "newimages-label": "Emri i skedës (ose një pjesë e tij):",
+       "newimages-user": "Adresë IP ose emër përdoruesi",
+       "newimages-showbots": "Trego ngarkimet nga robotët",
+       "newimages-hidepatrolled": "Fshih ngarkimet e patrolluara",
        "noimages": "S'ka gjë për të parë.",
        "ilsubmit": "Kërko",
        "bydate": "datës",
        "minutes": "{{PLURAL:$1|$1 minutë|$1 minuta}}",
        "hours": "{{PLURAL:$1|$1 orë|$1 orë}}",
        "days": "{{PLURAL:$1|$1 ditë|$1 ditë}}",
+       "weeks": "{{PLURAL:$1|$1 javë|$1 javë}}",
+       "months": "{{PLURAL:$1|$1 muaj|$1 muaj}}",
+       "years": "{{PLURAL:$1|$1 vit|$1 vite}}",
        "ago": "$1 më parë",
        "just-now": "mu tani",
        "hours-ago": "$1 {{PLURAL:$1|orë|orë}} më parë",
        "exif-compression-4": "CCITT Grupi 4 faks kodimi",
        "exif-copyrighted-true": "E drejtë e autorit",
        "exif-copyrighted-false": "Statusi i së drejtës së autorit nuk u caktua",
+       "exif-photometricinterpretation-1": "Bardh e zi (Zi është 0)",
        "exif-unknowndate": "E dhënë e pa njohur",
        "exif-orientation-1": "Normale",
        "exif-orientation-2": "E kthyer horizontalisht",
        "confirmemail_subject": "Vërtetim adrese nga {{SITENAME}}",
        "confirmemail_body": "Dikush, me gjasë ju, nga IP adresa $1,\nka regjistruar një llogari \"$2\" me këtë e-mail adresë në {{SITENAME}}.\n\nPër të konfirmuar se kjo llogari ju përket me të vërtetë dhe për të aktivizuar\nfunksionet e ''e-mail''-it në {{SITENAME}}, hapni këtë lidhje në shfletuesin tuaj:\n\n$3\n\nNëse llogaria *nuk* ju përket, ndiqni këtë lidhje\npër të anuluar konfirmimin e e-mail adresës:\n\n$5\n\nKy kod i konfirmimit skadon me $4.",
        "confirmemail_body_changed": "Dikush, me gjasë ju, nga IP adresa $1,\nka ndryshuar e-mail adresën e llogarisë \"$2\" me këtë adresë në {{SITENAME}}.\n\nPër të konfirmuar se kjo llogari ju përket me të vërtetë dhe për të rizaktivizuar\nfunksionet e ''e-mail''-it në {{SITENAME}}, hapni këtë lidhje në shfletuesin tuaj:\n\n$3\n\nNëse llogaria *nuk* ju përket, ndiqni këtë lidhje\npër të anuluar konfirmimin e e-mail adresës:\n\n$5\n\nKy kod i konfirmimit skadon me $4.",
-       "confirmemail_body_set": "Dikush, me gjasë ju, nga IP adresa $1,\nka ndryshuar e-mail adresën e llogarisë \"$2\" me këtë adresë në {{SITENAME}}.\n\nPër të konfirmuar se kjo llogari ju përket me të vërtetë dhe për të riaktivizuar\nfunksionet e ''e-mail''-it në {{SITENAME}}, hapni këtë lidhje në shfletuesin tuaj:\n\n$3\n\nNëse llogaria *nuk* ju përket, ndiqni këtë lidhje\npër të anuluar konfirmimin e e-mail adresës:\n\n$5\n\nKy kod i konfirmimit skadon me $4.",
+       "confirmemail_body_set": "Dikush, me gjasë ju, nga IP adresa $1,\nka ndryshuar e-mail adresën e llogarisë \"$2\" me këtë adresë në {{SITENAME}}.\n\nPër të konfirmuar se kjo llogari ju përket me të vërtetë dhe për të aktivizuar funksionet e ''e-mail''-it në {{SITENAME}}, hapni këtë lidhje në shfletuesin tuaj:\n\n$3\n\nNëse llogaria *nuk* ju përket, ndiqni këtë lidhje\npër të anuluar konfirmimin e e-mail adresës:\n\n$5\n\nKy kod i konfirmimit skadon më $4.",
        "confirmemail_invalidated": "Vërtetimi i adresës së email-it është tërhequr",
        "invalidateemail": "Tërhiq vërtetimin e email-it",
+       "notificationemail_subject_changed": "{{SITENAME}} adresa e email-it e regjistruar ka ndryshuar",
+       "notificationemail_subject_removed": "{{SITENAME}} adresa e regjistruar e email-it është hequr",
        "scarytranscludedisabled": "[Lidhja Interwiki nuk është i mundshëm]",
        "scarytranscludefailed": "[Gjetja e stampes deshtoi per $1]",
        "scarytranscludetoolong": "[Adresa URL eshte teper e gjate]",
        "deletedwhileediting": "Kujdes! Kjo faqe është grisur pasi keni filluar redaktimin!",
-       "confirmrecreate": "Përdoruesi [[User:$1|$1]] ([[User talk:$1|diskutime]]) grisi këtë artikull mbasi ju filluat ta redaktoni për arsyen:\n: ''$2''\nJu lutem konfirmoni nëse dëshironi me të vertetë ta rikrijoni këtë artikull.",
-       "confirmrecreate-noreason": "Përdoruesi [[User:$1|$1]] ([[User talk:$1|talk]]) ka fshirë këtë faqe pasi ju filluat ta redaktoni. Ju lutem konfirmoni që ju vërtet doni të ri-krijoni këtë faqe.",
+       "confirmrecreate": "Përdoruesi [[User:$1|$1]] ([[User talk:$1|diskutime]]) grisi këtë artikull mbasi ju filluat ta redaktoni për arsyen:\n: <em>$2</em>''\nJu lutem konfirmoni nëse dëshironi me të vërtetë ta rikrijoni këtë artikull.",
+       "confirmrecreate-noreason": "Përdoruesi [[User:$1|$1]]([[User talk:$1|talk]]) ka fshirë këtë faqe pasi ju filluat ta redaktoni. Ju lutem konfirmoni që vërtet doni të ri-krijoni këtë faqe.",
        "recreate": "Rikrijo",
        "confirm_purge_button": "Shko",
        "confirm-purge-top": "Pastro ''cache''-in për këtë faqe?",
        "confirm-watch-top": "Shto këtë faqe në listën mbikqyrëse tuajen?",
        "confirm-unwatch-button": "Në rregull",
        "confirm-unwatch-top": "Largo këtë faqe nga lista juaj mbikqyrëse ?",
+       "confirm-rollback-button": "Në rregull",
+       "confirm-rollback-top": "Rikthe redaktimet në këtë faqe?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← faqja e mëparshme",
        "imgmultipagenext": "faqja tjetër →",
        "imgmultigo": "Shko!",
        "imgmultigoto": "Shko tek faqja $1",
        "img-lang-default": "(gjuha e parazgjedhur)",
+       "img-lang-go": "Shko",
        "ascending_abbrev": "ngritje",
        "descending_abbrev": "zbritje",
        "table_pager_next": "Faqja tjetër",
        "watchlistedit-raw-done": "Lista mbikëqyrëse u aktualizua.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 titull u shtua|$1 tituj u shtuan}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 titull u largua|$1 tituj u larguan}}:",
+       "watchlistedit-clear-title": "Pastro listën e mbikëqyrjes",
+       "watchlistedit-clear-legend": "Pastro listën e mbikëqyrjes",
+       "watchlistedit-clear-explain": "Të gjithë titujt do të hiqen nga lista juaj e mbikëqyrjes",
+       "watchlistedit-clear-titles": "Titujt:",
+       "watchlistedit-clear-done": "Lista mbikëqyrëse u fshi.",
+       "watchlisttools-clear": "Pastro listën e mbikëqyrjes",
        "watchlisttools-view": "Shih ndryshimet e rëndësishme",
        "watchlisttools-edit": "Shih dhe redakto listën mbikqyrëse.",
        "watchlisttools-raw": "Redaktoje drejtpërdrejt listën",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskutimet]])",
+       "timezone-local": "Lokal",
        "duplicate-defaultsort": "'''Kujdes:''' Renditja kryesore e çelësit \"$2\" refuzon renditjen e mëparshme kryesore të çelësit \"$1\".",
        "version": "Versioni",
        "version-extensions": "Zgjerime të instaluara",
        "version-hook-name": "Emri i goditjes",
        "version-hook-subscribedby": "Abonuar nga",
        "version-version": "($1)",
+       "version-no-ext-name": "[pa emër]",
        "version-license": " Liçenca MediaWiki",
+       "version-ext-license": "Licenca",
+       "version-ext-colheader-name": "Shtojca",
+       "version-skin-colheader-name": "Pamja",
+       "version-ext-colheader-version": "Versioni",
+       "version-ext-colheader-license": "Licenca",
+       "version-ext-colheader-description": "Përshkrimi",
+       "version-ext-colheader-credits": "Autorët",
+       "version-license-title": "Licenca për $1",
+       "version-credits-title": "Atribuuimi për $1",
        "version-poweredby-credits": "Ky wiki është mundësuar nga '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "të tjerë",
+       "version-poweredby-translators": "përkthyesit e translatewiki.net",
+       "version-credits-summary": "Dëshirojmë t'i mirënjohim personat në vazhdim për kontributin e tyre [[Special:Version|MediaWiki]].",
        "version-license-info": "MediaWiki është një softuer i lirë; ju mund ta shpërndani dhe redakatoni atë nën kushtet GNU General Public License si e publikuar nga fondacioni Free Software; ose versioni 2 i licensës, ose çdo version më i vonshëm.\n\nMediaWiki është shpërndarë me shpresën se do të jetë i dobishëm, por PA ASNJË GARANCI; as garancinë e shprehur të SHITJES apo PËRDORIMIT PËR NJË QËLLIM TË CAKTUAR. Shikoni GNU General Public License  për më shumë detaje.\n\nJu duhet të keni marrë [{{SERVER}}{{SCRIPTPATH}}/COPYING një kopje të GNU General Public License] së bashku me këtë program; nëse jo, shkruani tek Free Software Foundation, Inc., 51 Rruga Franklin, Kati i pestë, Boston, MA 02110-1301, ShBA ose [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lexojeni atë online].",
        "version-software": "Softuerët e instaluar",
        "version-software-product": "Produkti",
        "version-software-version": "Versioni",
+       "version-entrypoints": "URL-të hyrëse",
+       "version-entrypoints-header-entrypoint": "Pika hyrëse",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Libraritë e instaluara",
+       "version-libraries-library": "Librari",
+       "version-libraries-version": "Versioni",
+       "version-libraries-license": "Licenca",
+       "version-libraries-description": "Përshkrimi",
+       "version-libraries-authors": "Autorët",
+       "redirect-submit": "Shko",
+       "redirect-lookup": "Kërko:",
+       "redirect-value": "Vlera:",
+       "redirect-user": "ID e përdoruesit",
+       "redirect-page": "ID-ja e faqes",
+       "redirect-revision": "Versioni i faqes",
+       "redirect-file": "Emri i skedës",
+       "redirect-not-exists": "Vlera nuk u gjet",
        "fileduplicatesearch": "Kërkoni për skeda të dyfishta",
        "fileduplicatesearch-summary": "Kërkoni për dyfishime të skedave në bazë të vlerës përmbledhëse («hash»).",
        "fileduplicatesearch-filename": "Emri i skedës:",
        "fileduplicatesearch-result-n": "Skeda \"$1\" ka {{PLURAL:$2|1 dyfishim|$2 dyfishime}}.",
        "fileduplicatesearch-noresults": "Nuk u gjet asnjë skedë me emrin \"$1\".",
        "specialpages": "Faqet speciale",
-       "specialpages-note": "* Faqet speciale normale.\n* <strong class=\"mw-specialpagerestricted\">Faqet speciale të kufizuara.</strong>\n* <span class=\"mw-specialpagecached\">Faqet speciale të fshehtat (mund të jenë vjetëruar).</span>",
+       "specialpages-note-top": "Legjenda",
+       "specialpages-note": "* Faqet speciale normale.\n* <span class=\"mw-specialpagerestricted\">Faqet speciale të kufizuara.</span>",
        "specialpages-group-maintenance": "Përmbledhje mirëmbajtjeje",
        "specialpages-group-other": "Faqe speciale të tjera",
-       "specialpages-group-login": "Hyrje dhe hapje llogarie",
+       "specialpages-group-login": "Hyrë / hap llogari",
        "specialpages-group-changes": "Ndryshimet më të fundit dhe regjistrat",
        "specialpages-group-media": "Përmbledhje media dhe ngarkime",
        "specialpages-group-users": "Përdoruesit dhe privilegjet",
        "specialpages-group-highuse": "Faqe të shumëpërdorura",
        "specialpages-group-pages": "Lista e faqeve",
        "specialpages-group-pagetools": "Mjetet e faqes",
-       "specialpages-group-wiki": "Mjetet dhe të dhënat wiki",
+       "specialpages-group-wiki": "Të dhënat dhe veglat",
        "specialpages-group-redirects": "Përcjellime tek faqet speciale",
        "specialpages-group-spam": "Mjetet për spam",
+       "specialpages-group-developer": "Veglat e zhvilluesit",
        "blankpage": "Faqe e zbrazët",
        "intentionallyblankpage": "Kjo faqe me qëllim është lënë e zbrazët",
        "external_image_whitelist": "#Lëreni këtë rresht ashtu siç është<pre>\n#Vendosni shprehje fragmentesh të rregullta (vetëm pjesën që shkon ndërmjet //) poshtë\n#Këto do të krahasohen me URL-të  e figurave të jashtme\n#Ato që përputhen do të shfaqen si figura, të tjerat do të shfaqen vetëm si një lidhje\n#Rreshtat që fillojnë me # trajtohen si komente\n#Kjo është shumë e ndjeshme\n\n#Vendosini të fragmentet sipër këtij rreshti. Lëreni këtë rresht ashtu siç është</pre>",
        "tags-tag": "Emri i etiketës",
        "tags-display-header": "Pamja në listat e ndryshimeve",
        "tags-description-header": "Përshkrimi i plotë i kuptimit",
+       "tags-source-header": "Burimi",
+       "tags-active-header": "Aktiv?",
        "tags-hitcount-header": "Ndrzshimet e etikuara",
+       "tags-actions-header": "Veprimet",
+       "tags-active-yes": "Po",
+       "tags-active-no": "Jo",
+       "tags-source-extension": "Definuar nga softueri",
+       "tags-source-none": "Nuk përdorët më",
        "tags-edit": "redakto",
+       "tags-delete": "fshi",
+       "tags-activate": "aktivizo",
+       "tags-deactivate": "ç'aktivizo",
        "tags-hitcount": "$1 {{PLURAL:$1|ndryshim|ndryshime}}",
+       "tags-create-heading": "Krijoni një etiketë të re",
+       "tags-create-tag-name": "Emri i etiketës:",
        "tags-create-reason": "Arsyeja:",
+       "tags-create-submit": "Krijoni",
+       "tags-delete-title": "Gris etiketën",
        "tags-delete-reason": "Arsyeja:",
        "tags-activate-reason": "Arsyeja:",
+       "tags-activate-submit": "Aktivizo",
        "tags-deactivate-reason": "Arsyeja:",
+       "tags-edit-title": "Redakto etiketat",
+       "tags-edit-manage-link": "Menaxho etiketat",
+       "tags-edit-existing-tags": "Etiketat ekzistuese:",
+       "tags-edit-existing-tags-none": "<em>Asnjë</em>",
+       "tags-edit-new-tags": "Etiketat e reja:",
+       "tags-edit-add": "Shto këto etiketa:",
+       "tags-edit-remove": "Hiq këto etiketa:",
+       "tags-edit-remove-all-tags": "(hiq krejt etiketat)",
+       "tags-edit-chosen-placeholder": "Zgjedh disa etiketa",
+       "tags-edit-chosen-no-results": "Nuk u gjet ndonjë etiketë që përputhet",
        "tags-edit-reason": "Arsyeja:",
+       "tags-edit-success": "U aplikuan ndryshimet.",
+       "tags-edit-failure": "Ndryshimet nuk mund të aplikoheshin:\n$1",
+       "tags-edit-nooldid-title": "Versioni cak i pavlefshëm",
        "comparepages": "Krahasoni faqet",
        "compare-page1": "Faqe 1",
        "compare-page2": "Faqe 2",
        "compare-revision-not-exists": "Rishikimi që ju specifikuat nuk ekziston",
        "dberr-problems": "Na vjen keq! Kjo faqe po has vështirësi teknike.",
        "dberr-again": "Pritni disa minuta dhe provoni të ringarkoni faqen.",
-       "dberr-info": "(Nuk mund të lidhet me serverin bazë e të dhënave : $1)",
+       "dberr-info": "(Nuk mund të qaset në bazën e të dhënave: $1)",
        "dberr-usegoogle": "Ju mund të provoni të kërkoni përmes Googles në ndërkohë.",
        "dberr-outofdate": "Vini re se indekset e tyre të përmbajtjes tona mund të jetë e vjetëruar.",
        "dberr-cachederror": "Kjo është një kopje e faqes së kërkuar dhe mund të jetë e vjetëruar.",
        "htmlform-submit": "Dërgo",
        "htmlform-reset": "Zhbëj ndryshimin",
        "htmlform-selectorother-other": "Gjitha",
+       "htmlform-no": "Jo",
+       "htmlform-yes": "Po",
+       "htmlform-chosen-placeholder": "Zgjedh një opcion",
+       "htmlform-cloner-create": "Shto më shumë",
+       "htmlform-cloner-delete": "Hiqe",
+       "htmlform-cloner-required": "Kërkohet së paku një vlerë.",
+       "htmlform-date-placeholder": "VVVV-MM-DD",
+       "htmlform-time-placeholder": "OO:MM:SS",
+       "htmlform-datetime-placeholder": "VVVV-MM-DD OO:MM:SS",
+       "htmlform-title-not-exists": "$1 nuk ekziston.",
+       "htmlform-user-not-exists": "<strong>$1</strong> nuk ekziston.",
        "logentry-delete-delete": "$1 {{GENDER:$2|grisi}} faqen $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|riktheu}} faqen $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|riktheu}} faqen $3 ($4)",
        "logentry-delete-event": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|e një ngjarjeje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ka dryshuar}} dukshmërinë e {{PLURAL:$5|një rishikimi|$5 rishikimeve}} në faqen $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e ngjarjeve të regjistit në $3",
        "logentry-delete-revision-legacy": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e rishikimeve në faqen $3",
        "logentry-suppress-delete": "$1 {{GENDER:$2|shtypi}} faqen $3",
-       "logentry-suppress-event": "$1 në mënyrë sekrete ndryshoi dukshmërinë e {{PLURAL:$5|një ngjarje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
+       "logentry-suppress-event": "$1 në mënyrë sekrete {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|një ngjarje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
        "logentry-suppress-revision": "$1 në mënyrë sekrete ndryshoi dukshmërinë e {{PLURAL:$5|një versioni|$5 versioneve}} në $3: $4",
-       "logentry-suppress-event-legacy": "$1 në mënyrë sekrete ndryshoi dukshmërinë e ngjarjeve të regjistrit në $3",
-       "logentry-suppress-revision-legacy": "$1 në mënyrë sekrete ndryshoi dukshmërinë e versioneve në faqen $3",
+       "logentry-suppress-event-legacy": "$1 në mënyrë sekrete {{GENDER:$2|ndryshoi}} dukshmërinë e ngjarjeve të regjistrit në $3",
+       "logentry-suppress-revision-legacy": "$1 në mënyrë sekrete {{GENDER:$2|ndryshoi}} dukshmërinë e versioneve në faqen $3",
        "revdelete-content-hid": "përmbajtja u fsheh",
        "revdelete-summary-hid": "redaktimi i përmbledhjes i fshehur",
        "revdelete-uname-hid": "emri i përdoruesit i fshehur",
        "logentry-move-move-noredirect": "$1 zhvendosi faqen $3 te $4 pa lënë një përcjellim",
        "logentry-move-move_redir": "$1 zhvendosi faqen $3 te $4 nëpërmjet përcjellimit",
        "logentry-move-move_redir-noredirect": "$1 zhvendosi faqen $3 te $4 nëpërmjet një përcjellimi pa lënë një përcjellim",
-       "logentry-patrol-patrol": "$1 shënoi versionin $4 të faqes $3 të patrolluar",
-       "logentry-patrol-patrol-auto": "$1 automatikisht shënoi versionin $4 të faqes $3 të patrolluar",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|shënoi}} versionin $4 të faqes $3 të patrulluar",
+       "logentry-patrol-patrol-auto": "$1 automatikisht {{GENDER:$2|shënoi}} versionin $4 të faqes $3 të patrulluar",
        "logentry-newusers-newusers": "Llogaria e përdoruesit $1 është {{GENDER:$2|krijuar}}",
        "logentry-newusers-create": "Llogaria e {{GENDER:$2|përdoruesit|përdorueses}} $1 u krijua.",
        "logentry-newusers-create2": "Llogaria e përdoruesit $3 është {{GENDER:$2|krijuar}} nga $1",
        "logentry-rights-autopromote": "$1 është {{GENDER:$2|promovuar}} automatikisht nga $4 në $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngarkoi}} $3",
        "rightsnone": "(asgjë)",
-       "revdelete-summary": "përmbledhja redaktimit",
        "feedback-adding": "Duke shtuar përshtypjen te faqja...",
+       "feedback-back": "Prapa",
        "feedback-bugcheck": "Shumë mirë! Thjesht kontrolloni që nuk është një nga [$1 problemet e njohura].",
        "feedback-bugnew": "E kontrollova. Raporto një problem të ri",
        "feedback-bugornote": "Nëse jeni gati për të përshkruar një problem teknik me detaje ju lutemi [$1 raportoni një problem].\nPërndryshe, ju mund të formularin e thjeshtë më poshtë. Komenti juaj do të shtohet te faqja \"[$3 $2]\"\", së bashku me emrin tuaj të përdoruesit dhe shfletuesin të cilin jeni duke përdorur.",
        "feedback-cancel": "Anulo",
        "feedback-close": "Përfunduar",
+       "feedback-dialog-title": "Dërgo përshtypjet",
        "feedback-error1": "Gabim: Rezultat i panjohur nga API",
        "feedback-error2": "Gabim: Redaktimi dështoi",
        "feedback-error3": "Gabim: Nuk ka përgjigje nga API",
        "feedback-submit": "Dërgo",
        "feedback-thanks": "Faleminderit! Përshtypja juaj është postuar në faqen \"[$2 $1]\".",
        "feedback-thanks-title": "Ju faleminderit!",
-       "searchsuggest-search": "Kërko",
+       "searchsuggest-search": "Kërko {{SITENAME}}",
        "searchsuggest-containing": "përmban ...",
-       "api-error-badaccess-groups": "Ju nuk lejoheni të ngarkoni skeda në këtë wiki.",
        "api-error-badtoken": "Gabim i brendshëm: Shenjë e keqe.",
-       "api-error-copyuploaddisabled": "Ngarkimi nga URL-ja është çaktivizuar në këtë server.",
-       "api-error-duplicate": "{{PLURAL:$1|Ekziston një skedë tjetër|Ekzistojnë disa skeda të tjera}} me të njëjtën përmbajtje.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Ekzistonte një skedë tjetër|Ekzistonin disa skeda të tjera}} me të njëjtën përmbajtje, por {{PLURAL:$1|ajo është|ato janë}} fshirë.",
-       "api-error-empty-file": "Skeda që paraqitët ishte bosh.",
        "api-error-emptypage": "Nuk lejohet krijimi i faqeve të reja bosh.",
-       "api-error-fetchfileerror": "Gabim i brendshëm: Diçka shkoi keq gjatë marrjes së skedës.",
-       "api-error-fileexists-forbidden": "Një skedar me emrin \"$1\" tashmë ekziston dhe nuk mund të mbishkruhet.",
-       "api-error-fileexists-shared-forbidden": "Një skedar me emrin \"$1\" tashmë ekziston në depon për skedarët e shpërndarë dhe nuk mund të mbishkruhet.",
-       "api-error-file-too-large": "Skeda që paraqitët ishte shumë e madhe.",
-       "api-error-filename-tooshort": "Emri i skedës është shumë i shkurtër.",
-       "api-error-filetype-banned": "Ky lloj i skedës është përjashtuar.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nuk është një lloj i skedës së lejuar|nuk janë lloje të lejuara të skedave}}. {{PLURAL:$3|Lloji i lejuar i skedës është|Llojet e lejuara të skedave janë}} $2.",
-       "api-error-filetype-missing": "Skedës i mungon një shtesë.",
-       "api-error-hookaborted": "Modifikimi që provuat të bëni u ndërpre nga një goditje shtese.",
-       "api-error-http": "Gabim i brendshëm: Nuk mund të lidhet me serverin.",
-       "api-error-illegal-filename": "Emri i skedës nuk lejohet.",
-       "api-error-internal-error": "Gabim i brendshëm: Diçka shkoi keq me procesimin e ngarkimit tuaj në wiki.",
-       "api-error-invalid-file-key": "Gabim i brendshëm: Skeda nuk u gjet në ruajtjen e përkohshme.",
-       "api-error-missingparam": "Gabim i brendshëm: Mungesë e parametrave në kërkesë.",
-       "api-error-missingresult": "Gabim i brendshëm: Nuk mund të përcaktohet nëse kopjimi doli me sukses.",
-       "api-error-mustbeloggedin": "Ju duhet të identifikoheni për të ngarkuar skeda.",
-       "api-error-mustbeposted": "Gabim i brendshëm: Kërkesa kërkon HTTP POST.",
-       "api-error-noimageinfo": "Ngarkimi u krye me sukses, por serveri nuk na dha ndonjë informacion për këtë skedë.",
-       "api-error-nomodule": "Gabim i brendshëm: Nuk ka modul ngarkimi të vendosur.",
-       "api-error-ok-but-empty": "Gabim i brendshëm: Nuk ka përgjigje nga serveri.",
-       "api-error-overwrite": "Mbishkrimi i një skede ekzistuese nuk lejohet.",
        "api-error-stashfailed": "Gabim i brendshëm: Serveri nuk arriti të ruajë skedën e përkohshme.",
-       "api-error-timeout": "Serveri nuk u përgjigj gjatës kohës që pritej.",
-       "api-error-unclassified": "Një gabim i panjohur ndodhi.",
-       "api-error-unknown-code": "Gabim i panjohur: \"$1\"",
-       "api-error-unknown-error": "Gabim i brendshëm: Diçka shkoi gabim kur provuat të ngarkoni skedën tuaj.",
-       "api-error-unknown-warning": "Paralajmërim i panjohur: $1",
+       "api-error-unknown-warning": "Paralajmërim i panjohur: \"$1\".",
        "api-error-unknownerror": "Gabim i papërcaktuar: \"$1\".",
-       "api-error-uploaddisabled": "Ngarkimi është i çaktivizuar në këte wiki.",
-       "api-error-verification-error": "Skeda mund të jetë e korruptuar ose ka shtesë të gabuar.",
        "duration-seconds": "$1 {{PLURAL:$1|sekondë|sekonda}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutë|minuta}}",
        "duration-hours": "$1 {{PLURAL:$1|orë|orë}}",
        "duration-centuries": "$1 {{PLURAL:$1|shekull|shekuj}}",
        "duration-millennia": "$1 {{PLURAL:$1|milennium|mileniume}}",
        "expandtemplates": "Parapamje stampash",
-       "expand_templates_intro": "Kjo faqe speciale merr tekstin me stampa dhe të tregon se si do të duket teksti pasi të jenë stamposur të tëra. Kjo faqe gjithashtu tregon parapamjen e funksioneve dhe fjalëve magjike si p.sh. <nowiki>{{</nowiki>#language:...}} dhe <nowiki>{{</nowiki>CURRENTDAY}}.",
+       "expand_templates_intro": "Kjo faqe speciale merr tekstin dhe zgjeron të gjitha shabllonet në të në mënyrë rekursive.\nAi gjithashtu zgjeron funksionet e parser të mbështetura si\n<code><nowiki>{{</nowiki>#language: ...}}</code>dhe variablat si\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nNë të vërtetë, ajo zgjeron çdo gjë në kllapa gjarpërore të dyfishta.",
        "expand_templates_title": "Titulli i faqes për rrethanën, si {{FULLPAGENAME}} etj.:",
        "expand_templates_input": "Teksti me stampa:",
        "expand_templates_output": "Parapamja",
+       "expand_templates_xml_output": "Rezultat XML",
        "expand_templates_ok": "Shko",
        "expand_templates_remove_comments": "Hiq komentet",
+       "expand_templates_preview": "Parapamje",
+       "pagelanguage": "Ndrysho gjuhën e faqës",
+       "pagelang-name": "Faqja",
+       "pagelang-language": "Gjuha",
+       "pagelang-use-default": "Përdor gjuhën e parazgjedhur",
+       "pagelang-select-lang": "Zgjedh gjuhën",
+       "pagelang-reason": "Arsyeja",
+       "pagelang-submit": "Dërgo",
+       "pagelang-nonexistent-page": "Faqja $1 nuk ekziston.",
+       "right-pagelang": "Ndrysho gjuhën e faqës",
+       "action-pagelang": "ndrysho gjuhën e faqës",
+       "mediastatistics-table-mimetype": "Lloji MIME",
+       "mediastatistics-table-extensions": "Shtojcat e mundshme",
+       "mediastatistics-table-count": "Numri i skedave",
+       "mediastatistics-table-totalbytes": "Madhësia e kombinuar",
+       "mediastatistics-header-unknown": "I panjohur",
+       "mediastatistics-header-bitmap": "Imazh bitmap",
+       "mediastatistics-header-drawing": "Vizatime (imazhe vektor)",
+       "mediastatistics-header-audio": "Zërim",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-multimedia": "Media e pasur",
+       "mediastatistics-header-office": "Zyrë",
+       "mediastatistics-header-text": "Tekstor",
+       "mediastatistics-header-executable": "Të ekzekutueshmet",
+       "mediastatistics-header-archive": "Formate të komprimuara",
+       "mediastatistics-header-total": "Të gjitha skedat",
+       "json-error-state-mismatch": "JSON i pavlefshëm ose i keqformuar",
+       "json-error-ctrl-char": "Gabim me karakterin e kontrollit, ndoshta i koduar gabimisht",
+       "json-error-syntax": "Gabim sintakse",
+       "headline-anchor-title": "Lidhje në këtë seksion",
        "special-characters-group-latin": "Latinisht",
        "special-characters-group-latinextended": "Latanisht, zgjeruar",
        "special-characters-group-ipa": "Alfabeti Fonetik Ndërkombëtar (IPA)",
        "special-characters-group-symbols": "Simbolet",
        "special-characters-group-greek": "Grezisht",
+       "special-characters-group-greekextended": "Greke e zgjeruar",
        "special-characters-group-cyrillic": "Cirilik",
        "special-characters-group-arabic": "Arabisht",
+       "special-characters-group-arabicextended": "Arabishte e zgjeruar",
        "special-characters-group-persian": "Persisht",
        "special-characters-group-hebrew": "Hebraisht",
        "special-characters-group-bangla": "Bengalisht",
+       "special-characters-group-tamil": "Tamil",
        "special-characters-group-telugu": "Telugu",
        "special-characters-group-sinhala": "Singhalisht",
        "special-characters-group-gujarati": "Guxharati",
+       "special-characters-group-devanagari": "Devanagari",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Aborigjinase Kanadeze",
+       "special-characters-title-endash": "viza e gjatë",
+       "special-characters-title-emdash": "viza më e gjatë",
+       "special-characters-title-minus": "shenja minus",
+       "mw-widgets-dateinput-no-date": "Nuk u zgjedh data",
        "mw-widgets-dateinput-placeholder-day": "VVVV-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "VVVV-MM"
+       "mw-widgets-dateinput-placeholder-month": "VVVV-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Kërko media",
+       "mw-widgets-mediasearch-noresults": "Nuk është gjetur asnjë rezultat.",
+       "mw-widgets-titleinput-description-new-page": "faqja ende nuk ekziston",
+       "mw-widgets-titleinput-description-redirect": "ridrejto te $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Shto një kategori...",
+       "mw-widgets-usersmultiselect-placeholder": "Shto më shumë...",
+       "date-range-from": "Nga data:",
+       "date-range-to": "Te data:",
+       "sessionmanager-tie": "Nuk mund të kombinohen lloje të ndryshme të autentikimit: $1",
+       "sessionprovider-generic": "$1 sesione",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "sesione të bazuara në biskota",
+       "sessionprovider-nocookies": "Biskotat mund të jenë paaftësuar. Sigurohu që keni aktivizuar biskotat dhe filloni prapë.",
+       "log-action-filter-block": "Lloji i bllokimit:",
+       "log-action-filter-contentmodel": "Lloji i ndryshimit të modelit të përmbajtjes:",
+       "log-action-filter-delete": "Lloji i fshirjes:",
+       "log-action-filter-import": "Lloji i importimit:",
+       "log-action-filter-move": "Lloji i lëvizjes:",
+       "log-action-filter-newusers": "Lloji i krijimit të llogarisë:",
+       "log-action-filter-patrol": "Lloji i patrullimit:",
+       "log-action-filter-protect": "Lloji i mbrojtjes:",
+       "log-action-filter-rights": "Lloji i ndryshimit të të drejtave:",
+       "log-action-filter-suppress": "Lloji i heshtjes:",
+       "log-action-filter-upload": "Lloji i ngarkimit:",
+       "log-action-filter-all": "Të gjitha",
+       "log-action-filter-block-block": "Blloko",
+       "log-action-filter-block-reblock": "Blloko ndryshimet",
+       "log-action-filter-block-unblock": "Zhblloko",
+       "log-action-filter-contentmodel-change": "Ndrysho modelin e përmbajtjes",
+       "log-action-filter-delete-delete": "Fshirja e faqes",
+       "log-action-filter-delete-delete_redir": "Ridrejto mbishkrimin",
+       "log-action-filter-delete-restore": "Çfshirja e faqes",
+       "log-action-filter-delete-event": "Fshirja e regjistrit",
+       "log-action-filter-delete-revision": "Fshirja e versionit",
+       "log-action-filter-import-interwiki": "Importim ndër-wiki",
+       "log-action-filter-import-upload": "Importo përmes ngarkimit XML",
+       "log-action-filter-managetags-create": "Krijimi i etiketave",
+       "log-action-filter-managetags-delete": "Fshirja e etiketave",
+       "log-action-filter-managetags-activate": "Aktivizimi i etiketave",
+       "log-action-filter-managetags-deactivate": "Çaktivizimi i etiketave",
+       "log-action-filter-move-move": "Lëviz pa mbishkruar ridrejtimet",
+       "log-action-filter-move-move_redir": "Lëviz me mbishkrim të ridrejtimeve",
+       "log-action-filter-newusers-create": "Krijim nga përdorues anonim",
+       "log-action-filter-newusers-create2": "Krijim nga përdorues i regjistruar",
+       "log-action-filter-newusers-autocreate": "Krijim automatik",
+       "log-action-filter-newusers-byemail": "Krijim me fjalëkalim të dërguar me email",
+       "log-action-filter-patrol-patrol": "Patrullim manual",
+       "log-action-filter-patrol-autopatrol": "Patrullim automatik",
+       "log-action-filter-protect-protect": "Mbrojtje",
+       "log-action-filter-protect-modify": "Ndryshim i mbrotjtjes",
+       "log-action-filter-protect-unprotect": "Çmbrojtje",
+       "log-action-filter-protect-move_prot": "Mbrojtje e lëvizur",
+       "log-action-filter-rights-rights": "Ndryshim manual",
+       "log-action-filter-rights-autopromote": "Ndryshim automatik",
+       "log-action-filter-suppress-event": "Heshtje e regjistrit",
+       "log-action-filter-suppress-revision": "Heshtje e versionit",
+       "log-action-filter-suppress-delete": "Heshtje e faqes",
+       "log-action-filter-upload-upload": "Ngarkim i ri",
+       "log-action-filter-upload-overwrite": "Ringarko",
+       "authmanager-authn-no-primary": "Kredencialet e dhëna nuk mund të vërtetoheshin.",
+       "authmanager-authn-no-local-user": "Kredencialet e dhëna nuk janë të asociuara me ndonjë përdorues në këtë wiki.",
+       "authmanager-change-not-supported": "Kredencialet e dhëna nuk mund të ndryshohen, pasiqë asgjë nuk i përdor ato.",
+       "authmanager-create-disabled": "Krijimi i llogarive është pamundësuar.",
+       "authmanager-create-from-login": "Për të krijuar llogarinë tuaj, ju lutem mbushni fushat.",
+       "authmanager-create-no-primary": "Kredencialet e dhëna nuk mund të përdoreshin për krijim të llogarisë.",
+       "authmanager-link-no-primary": "Kredencialet e dhëna nuk mund të përdoreshin për lidhje të llogarive.",
+       "authmanager-link-not-in-progress": "Lidhja e llogarive nuk është në progres ose të dhënat e sesionit janë humbur. Ju lutem filloni nga fillimi.",
+       "authmanager-authplugin-setpass-failed-title": "Ndryshimi i fjalëkalimit dështoi",
+       "authmanager-authplugin-setpass-failed-message": "Plugin-i i autentikimit mohoi ndërrimin e fjalëkalimit.",
+       "authmanager-authplugin-create-fail": "Plugin-i i autentikimit mohoi krijimin e llogarisë.",
+       "authmanager-authplugin-setpass-denied": "Plugin-i i autentikimit nuk lejon ndërrimin e fjalëkalimeve.",
+       "authmanager-authplugin-setpass-bad-domain": "Domen i pavlefshëm.",
+       "authmanager-autocreate-noperm": "Krijimi automatik i llogarive nuk lejohet.",
+       "authmanager-autocreate-exception": "Krijimi automatik i llogarive përkohësisht i pamundësuar për shkak të gabimeve.",
+       "authmanager-userdoesnotexist": "Llogaria e përdoruesit \"$1\" nuk është e regjistruar.",
+       "authmanager-userlogin-remembermypassword-help": "Nëse fjalëkalimi duhet të kujtohet më gjatë se gjatësia e sesionit.",
+       "authmanager-username-help": "Emri i përdoruesit për vërtetim.",
+       "authmanager-password-help": "Fjalëkalimi për vërtetim.",
+       "authmanager-domain-help": "Domeni për vërtetim të jashtëm.",
+       "authmanager-retype-help": "Prap fjalëkalimi për konfirmim.",
+       "authmanager-email-label": "Email",
+       "authmanager-email-help": "Adresa e emailit:",
+       "authmanager-realname-label": "Emri i vërtetë",
+       "authmanager-realname-help": "Emri i vërtetë i përdoruesit",
+       "authmanager-provider-password": "Vërtetim i bazuar në fjalëkalim",
+       "authmanager-provider-temporarypassword": "Fjalëkalim i përkohshëm",
+       "authprovider-confirmlink-request-label": "Llogaritë të cilat duhet të lidhen",
+       "authprovider-confirmlink-success-line": "$1: U lidh me sukses.",
+       "authprovider-confirmlink-failed": "Lidhja e llogarive nuk pat sukses të plotë: $1",
+       "authprovider-resetpass-skip-label": "Kapërce",
+       "authprovider-resetpass-skip-help": "Kalo rivendosjen e fjalëkalimit.",
+       "authform-newtoken": "Mungon tokeni. $1",
+       "authform-notoken": "Mungon tokeni",
+       "authform-wrongtoken": "Token i gabuar",
+       "specialpage-securitylevel-not-allowed-title": "I palejuar",
+       "specialpage-securitylevel-not-allowed": "Me keqardhje, nuk lejoheni të përdorni këtë faqe sepse identiteti juaj nuk mund të verifikohej.",
+       "authpage-cannot-login": "E pamundur të fillohet hyrja.",
+       "authpage-cannot-login-continue": "E pamundur të vazhdohet hyrja. Sesioni juaj sipas gjitha gjasave ka skaduar.",
+       "authpage-cannot-create": "E pamundur të fillohet krijimi i llogarisë.",
+       "authpage-cannot-create-continue": "E pamundur të vazhdohet krijimi i llogarisë. Sesioni juaj sipas gjitha gjasave ka skaduar.",
+       "authpage-cannot-link": "E pamundur të fillohet lidhja e llogarive.",
+       "authpage-cannot-link-continue": "E pamundur të vazhdohet lidhja e llogarive. Sesioni juaj sipas gjitha gjasave ka skaduar.",
+       "cannotauth-not-allowed-title": "Mohot leja",
+       "cannotauth-not-allowed": "Nuk lejoheni të përdorni këtë faqe",
+       "changecredentials": "Ndërro kredencialet",
+       "changecredentials-submit": "Ndërro kredencialet",
+       "changecredentials-invalidsubpage": "$1 nuk është tip i vlefshëm i kredencialit.",
+       "changecredentials-success": "Kredencialet tuaja kanë ndryshuar.",
+       "removecredentials": "Hiq kredencialet",
+       "removecredentials-submit": "Hiq kredencialet",
+       "removecredentials-invalidsubpage": "$1 nuk është tip i vlefshëm i kredencialit.",
+       "removecredentials-success": "Kredencialet tuaja kanë ndryshuar.",
+       "credentialsform-provider": "Tipi i kredencialit:",
+       "credentialsform-account": "Emri i llogarisë:",
+       "cannotlink-no-provider-title": "Nuk ka llogari të lidhshme",
+       "cannotlink-no-provider": "Nuk ka llogari të lidhshme.",
+       "linkaccounts": "Lidh llogari",
+       "linkaccounts-success-text": "Llogaria është lidhur.",
+       "linkaccounts-submit": "Lidh llogari",
+       "unlinkaccounts": "Ndaj llogaritë",
+       "unlinkaccounts-success": "Llogaria është ndarë.",
+       "restrictionsfield-badip": "Adresë ose varg IP-je e parregulltë: $1",
+       "restrictionsfield-label": "Vargu i lejuar i IP-së:",
+       "revid": "versioni $1",
+       "pageid": "ID e faqes $1",
+       "rawhtml-notallowed": "&lt;html&gt; etiketat nuk mund të përdorën jashtë faqeve normale.",
+       "gotointerwiki": "Po largoheni nga {{SITENAME}}",
+       "gotointerwiki-invalid": "Tiulli i dhënë nuk është i rregullt.",
+       "undelete-cantedit": "Nuk mund ta çfshini këtë faqe pasi që nuk lejoheni ta redaktoni këtë faqe."
 }
index 539bb18..9a53a80 100644 (file)
@@ -32,7 +32,8 @@
                        "Сербијана",
                        "Xð",
                        "Matma Rex",
-                       "Zoranzoki21"
+                       "Zoranzoki21",
+                       "Obsuser"
                ]
        },
        "tog-underline": "Подвлачење веза:",
        "category-file-count-limited": "{{PLURAL:$1|1=Следећа датотека је|Следеће $1 датотеке су|Следећих $1 датотека је}} у овој категорији.",
        "listingcontinuesabbrev": "наст.",
        "index-category": "Пописане странице",
-       "noindex-category": "Ð\9dепопиÑ\81ане странице",
+       "noindex-category": "Ð\9dеиндекÑ\81иÑ\80ане странице",
        "broken-file-category": "Странице с неисправним везама до датотека",
        "about": "О нама",
        "article": "Страница са садржајем",
        "qbedit": "Уреди",
        "qbpageoptions": "Ова страница",
        "qbmyoptions": "Моје странице",
-       "faq": "Ð\9dПП",
+       "faq": "ЧПП",
        "faqpage": "Project:НПП",
        "actions": "Радње",
        "namespaces": "Именски простори",
        "permalink": "Трајна веза",
        "print": "Штампај",
        "view": "Погледај",
-       "view-foreign": "Види на $1",
+       "view-foreign": "Види на пројекту $1",
        "edit": "Уреди",
        "edit-local": "Уреди локални опис",
        "create": "Направи",
        "redirectedfrom": "(преусмерено са $1)",
        "redirectpagesub": "Преусмерење",
        "redirectto": "Преусмерава на:",
-       "lastmodifiedat": "Ова страница је последњи пут измењена $1 у $2.",
+       "lastmodifiedat": "Ова страница је последњи пут уређена на датум $1 у $2 ч.",
        "viewcount": "Ова страница је прегледана {{PLURAL:$1|једанпут|$1 пута|$1 пута}}.",
        "protectedpage": "Заштићена страница",
        "jumpto": "Иди на:",
        "versionrequired": "Потребно је издање $1 Медијавикија",
        "versionrequiredtext": "Потребно је издање $1 Медијавикија да бисте користили ову страницу.\nПогледајте страницу за [[Special:Version|издање]].",
        "ok": "У реду",
-       "pagetitle": "$1 â\80\93 {{SITENAME}}",
+       "pagetitle": "$1 â\80\94 {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "Преузето из „$1“",
        "toc": "Садржај",
        "showtoc": "прикажи",
        "hidetoc": "сакриј",
-       "collapsible-collapse": "скупи",
-       "collapsible-expand": "прошири",
+       "collapsible-collapse": "Скупи",
+       "collapsible-expand": "Ð\9fрошири",
        "confirmable-confirm": "Да ли {{GENDER:$1|сте}} сигурни?",
        "confirmable-yes": "Да",
        "confirmable-no": "Не",
        "title-invalid-magic-tilde": "Тражени наслов странице садржи неважећи след магичног знака тилда (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Тражени назив странице је предугачак. Не сме бити дужи од $1 {{PLURAL:$1|бајта|бајтова}} у UTF-8 кодирању.",
        "title-invalid-leading-colon": "Захтевани наслов странице садржи неважећу двотачку на почетку.",
-       "perfcached": "СледеÑ\9bи Ð¿Ð¾Ð´Ð°Ñ\86и Ñ\81Ñ\83 ÐºÐµÑ\88иÑ\80ани Ð¸ Ð¼Ð¾Ð³Ñ\83 Ð±Ð¸Ñ\82и Ð·Ð°Ñ\81Ñ\82аÑ\80ели. Ð\9aеÑ\88 Ñ\81адÑ\80жи Ð½Ð°Ñ\98виÑ\88е {{PLURAL:$1|Ñ\98едан Ñ\80езÑ\83лÑ\82аÑ\82|$1 Ñ\80езÑ\83лÑ\82аÑ\82а|$1 резултата}}.",
-       "perfcachedts": "Следећи подаци су кеширани и последњи пут су ажурирани $2 у $3. У кешу {{PLURAL:$4|1=је доступан највише један резултат|су доступна највише $4 резултата|је доступно највише $4 резултата}}.",
+       "perfcached": "СледеÑ\9bи Ð¿Ð¾Ð´Ð°Ñ\86и Ñ\81Ñ\83 ÐºÐµÑ\88иÑ\80ани Ð¸ Ð¼Ð¾Ð¶Ð´Ð° Ð½Ð¸Ñ\81Ñ\83 Ð°Ð¶Ñ\83Ñ\80иÑ\80ани. Ð£ ÐºÐµÑ\88Ñ\83 {{PLURAL:$1|Ñ\98е Ð´Ð¾Ñ\81Ñ\82Ñ\83пан Ð½Ð°Ñ\98виÑ\88е Ñ\98едан Ñ\80езÑ\83лÑ\82аÑ\82\81Ñ\83 Ð´Ð¾Ñ\81Ñ\82Ñ\83пна Ð½Ð°Ñ\98виÑ\88е $1 Ñ\80езÑ\83лÑ\82аÑ\82а|Ñ\98е Ð´Ð¾Ñ\81Ñ\82Ñ\83пно Ð½Ð°Ñ\98виÑ\88е $1 резултата}}.",
+       "perfcachedts": "Следећи подаци су кеширани и последњи пут ажурирани на датум $2 у $3 ч. У кешу {{PLURAL:$4|је доступан највише један резултат|су доступна највише $4 резултата|је доступно највише $4 резултата}}.",
        "querypage-no-updates": "Ажурирање ове странице је тренутно онемогућено.\nПодаци који се овде налазе могу бити застарели.",
        "viewsource": "Изворни код",
        "viewsource-title": "Изворни текст странице $1",
        "virus-scanfailed": "неуспешно скенирање (код $1)",
        "virus-unknownscanner": "непознати антивирус:",
        "logouttext": "<strong>Одјављени сте.</strong>\n\nИмајте на уму да неке странице могу наставити да се приказују као да сте још пријављени, све док не очистите привремену меморију свог прегледача.",
+       "cannotlogoutnow-title": "Одјава тренутно није могућа",
+       "cannotlogoutnow-text": "Одјава није могућа током употребе $1.",
        "welcomeuser": "Добро дошли, $1!",
        "welcomecreation-msg": "Ваш налог је отворен.\nНе заборавите да промените своја [[Special:Preferences|подешавања]].",
        "yourname": "Корисничко име:",
        "login": "Пријави ме",
        "login-security": "Верификација вашег индентитета",
        "nav-login-createaccount": "Пријава/регистрација",
-       "userlogin": "Пријава/регистрација",
-       "userloginnocreate": "Пријава",
        "logout": "Одјава",
        "userlogout": "Одјава",
        "notloggedin": "Нисте пријављени",
        "userlogin-noaccount": "Немате налог?",
        "userlogin-joinproject": "Отворите га",
-       "nologin": "Немате налог? Идите на страницу $1.",
-       "nologinlink": "Отварање налога",
        "createaccount": "Отвори налог",
-       "gotaccount": "Већ имате налог? Идите на страницу „$1“.",
-       "gotaccountlink": "Пријава",
-       "userlogin-resetlink": "Заборавили сте податке за пријаву?",
        "userlogin-resetpassword-link": "Заборавили сте лозинку?",
        "userlogin-helplink2": "Помоћ при пријављивању",
        "userlogin-loggedin": "Већ сте пријављени као {{GENDER:$1|$1}}.\nКористите доњи образац да бисте се пријавили као други корисник.",
        "createacct-another-email-ph": "Унесите имејл адресу",
        "createaccountmail": "Користите привремену, случајно створену лозинку и пошаљите на наведену имејл адресу",
        "createacct-realname": "Право име (опционо)",
-       "createaccountreason": "Разлог:",
        "createacct-reason": "Разлог",
        "createacct-reason-ph": "Зашто правите још један налог?",
        "createacct-submit": "Отвори налог",
        "createacct-another-submit": "Отвори налог",
-       "createacct-benefit-heading": "{{SITENAME}} Ñ\98е Ð½Ð°Ð¿Ñ\80авÑ\99ен Ð¾Ð´ Ñ\81Ñ\82Ñ\80ане Ñ\99Ñ\83ди ÐºÐ°Ð¾ Ñ\88Ñ\82о Ñ\81Ñ\82е Ð²Ð¸.",
+       "createacct-benefit-heading": "{{SITENAME}} Ñ\98е Ð¿Ñ\80оÑ\98екаÑ\82 ÐºÐ¾Ñ\98и Ñ\81Ñ\82ваÑ\80аÑ\98Ñ\83 Ñ\99Ñ\83ди Ð¿Ð¾Ð¿Ñ\83Ñ\82 Ð\92аÑ\81.",
        "createacct-benefit-body1": "{{PLURAL:$1|измена}}",
        "createacct-benefit-body2": "{{PLURAL:$1|страница|странице}}",
        "createacct-benefit-body3": "{{PLURAL:$1|активни корисник|активних корисника}}",
        "changepassword-success": "Ваша лозинка је успешно промењена!",
        "changepassword-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
        "botpasswords": "Лозинке ботова",
+       "botpasswords-disabled": "Лозинке ботова су онемогућене.",
        "botpasswords-label-appid": "Име бота:",
        "botpasswords-label-create": "Направи",
        "botpasswords-label-update": "Ажурирај",
        "hr_tip": "Водоравна линија (користити ретко)",
        "summary": "Опис измене:",
        "subject": "Тема:",
-       "minoredit": "мања измена",
-       "watchthis": "надгледај ову страницу",
+       "minoredit": "Ð\9eво Ñ\98е Ð¼Ð°Ñ\9aа Ð¸Ð·Ð¼ÐµÐ½Ð°",
+       "watchthis": "Ð\9dадгледај ову страницу",
        "savearticle": "Сачувај страницу",
        "savechanges": "Сачувај измене",
        "publishpage": "Објави страницу",
        "preview": "Претпреглед",
        "showpreview": "Прикажи претпреглед",
        "showdiff": "Прикажи измене",
-       "blankarticle": "<strong>Упозорење:</strong> страница коју правите нема никакав садржај.\nАко још једном притиснете „{{int:savearticle}}“ направићете празну страницу.",
-       "anoneditwarning": "<strong>УпозоÑ\80еÑ\9aе:</strong> Ð½Ð¸Ñ\81Ñ\82е Ð¿Ñ\80иÑ\98авÑ\99ени. Ð\92аÑ\88а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а Ñ\9bе Ð±Ð¸Ñ\82и Ñ\98авно Ð²Ð¸Ð´Ñ\99ива Ñ\83 Ð¸Ñ\81Ñ\82оÑ\80иÑ\98и Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ð°ÐºÐ¾ Ð½Ð°Ñ\87иниÑ\82е Ð±Ð¸Ð»Ð¾ ÐºÐ°ÐºÐ²Ñ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83. Ð\90ко Ñ\81е <strong>[$1 Ð¿Ñ\80иÑ\98авиÑ\82е]</strong> Ð¸Ð»Ð¸ <strong>[$2 Ð¾Ñ\82воÑ\80иÑ\82е Ð½Ð°Ð»Ð¾Ð³]</strong> Ð²Ð°Ñ\88е Ð¸Ð·Ð¼ÐµÐ½Ðµ Ñ\9bе Ð±Ð¸Ñ\82и Ð¿Ñ\80ипиÑ\81ане Ð²ашем корисничком имену.",
-       "anonpreviewwarning": "''Нисте пријављени. Ваша ИП адреса ће бити забележена у историји ове странице.''",
-       "missingsummary": "'''Ð\9dапомена:''' Ð½Ð¸Ñ\81Ñ\82е Ñ\83нели Ð¾Ð¿Ð¸Ñ\81 Ð¸Ð·Ð¼ÐµÐ½Ðµ.\nÐ\90ко Ð¿Ð¾Ð½Ð¾Ð²Ð¾ ÐºÐ»Ð¸ÐºÐ½ÐµÑ\82е Ð½Ð° â\80\9e{{int:savearticle}}â\80\9c, Ð²аша измена ће бити сачувана без описа.",
-       "selfredirect": "<strong>УпозоÑ\80еÑ\9aе:</strong> Ð¿Ñ\80еÑ\83Ñ\81меÑ\80аваÑ\82е Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð½Ð° Ñ\9aÑ\83 Ñ\81амÑ\83.\nÐ\9cожда Ð²Ð°Ð¼ Ñ\98е Ð¾Ð´Ñ\80едиÑ\88на Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ð¾Ð³Ñ\80еÑ\88на Ð¸Ð»Ð¸ Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98еÑ\82е Ð¿Ð¾Ð³Ñ\80еÑ\88нÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83.\nÐ\90ко Ñ\98оÑ\88 Ñ\98едном Ð¿Ñ\80иÑ\82иÑ\81неÑ\82е â\80\9e{{int:savearticle}}â\80\9c преусмерење ће свеједно бити направљено.",
+       "blankarticle": "<strong>Упозорење:</strong> Страница коју правите је празна.\nАко још једном притиснете „$1”, страница ће бити направљена без икаквог садржаја.",
+       "anoneditwarning": "<strong>УпозоÑ\80еÑ\9aе:</strong> Ð\9dиÑ\81Ñ\82е Ð¿Ñ\80иÑ\98авÑ\99ени. Ð\90ко Ð¾Ð±Ñ\98авиÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, Ð\92аÑ\88а IP Ð°Ð´Ñ\80еÑ\81а Ñ\9bе Ð±Ð¸Ñ\82и Ñ\98авно Ð²Ð¸Ð´Ñ\99ива Ñ\83 Ñ\9aеноÑ\98 Ð¸Ñ\81Ñ\82оÑ\80иÑ\98и Ð¸Ð·Ð¼ÐµÐ½Ð° Ð¸ Ð´Ñ\80Ñ\83где. Ð\90ко Ñ\81е <strong>[$1 Ð¿Ñ\80иÑ\98авиÑ\82е]</strong> Ð¸Ð»Ð¸ <strong>[$2 Ð¾Ñ\82воÑ\80иÑ\82е Ð½Ð°Ð»Ð¾Ð³]</strong>, Ð¿Ð¾Ñ\80ед Ð¾Ñ\81Ñ\82алиÑ\85 Ð¿Ð¾Ð³Ð¾Ð´Ð½Ð¾Ñ\81Ñ\82и ÐºÐ¾Ñ\98е Ð´Ð¾Ð±Ð¸Ñ\98аÑ\82е Ð\92аÑ\88е Ð¸Ð·Ð¼ÐµÐ½Ðµ Ñ\9bе Ð±Ð¸Ñ\82и Ð¿Ñ\80ипиÑ\81иване Ð\92ашем корисничком имену.",
+       "anonpreviewwarning": "<em>Нисте пријављени. Ако објавите страницу, Ваша IP адреса ће бити јавно видљива у њеној историји измена и другде.</em>",
+       "missingsummary": "'''Ð\9fодÑ\81еÑ\82ник:''' Ð\9dиÑ\81Ñ\82е Ñ\83нели Ð¾Ð¿Ð¸Ñ\81 Ð¸Ð·Ð¼ÐµÐ½Ðµ.\nÐ\90ко Ð¿Ð¾Ð½Ð¾Ð²Ð¾ ÐºÐ»Ð¸ÐºÐ½ÐµÑ\82е Ð½Ð° â\80\9e$1â\80\9d, Ð\92аша измена ће бити сачувана без описа.",
+       "selfredirect": "<strong>УпозоÑ\80еÑ\9aе:</strong> Ð\9fÑ\80еÑ\83Ñ\81меÑ\80аваÑ\82е Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð½Ð° Ñ\9aÑ\83 Ñ\81амÑ\83.\nÐ\9cожда Ð²Ð°Ð¼ Ñ\98е Ð¾Ð´Ñ\80едиÑ\88на Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð° Ð¿Ñ\80еÑ\83Ñ\81меÑ\80еÑ\9aе Ð¿Ð¾Ð³Ñ\80еÑ\88на Ð¸Ð»Ð¸ Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98еÑ\82е Ð¿Ð¾Ð³Ñ\80еÑ\88нÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83.\nÐ\90ко Ñ\98оÑ\88 Ñ\98едном Ð¿Ñ\80иÑ\82иÑ\81неÑ\82е â\80\9e$1â\80\9d, преусмерење ће свеједно бити направљено.",
        "missingcommenttext": "Унесите коментар испод.",
-       "missingcommentheader": "<strong>Ð\9dапомена:</strong> Ð½Ð¸Ñ\81Ñ\82е Ñ\83нели Ð½Ð°Ñ\81лов Ð¾Ð²Ð¾Ð³ ÐºÐ¾Ð¼ÐµÐ½Ñ\82аÑ\80а.\nÐ\90ко Ð¿Ð¾Ð½Ð¾Ð²Ð¾ ÐºÐ»Ð¸ÐºÐ½ÐµÑ\82е Ð½Ð° â\80\9e{{int:savearticle}}â\80\9c, Ð²Ð°Ñ\88а измена ће бити сачувана без наслова.",
+       "missingcommentheader": "<strong>Ð\9dапомена:</strong> Ð\9dиÑ\81Ñ\82е Ñ\83нели Ð½Ð°Ñ\81лов Ñ\82еме Ð¾Ð²Ð¾Ð³ ÐºÐ¾Ð¼ÐµÐ½Ñ\82аÑ\80а.\nÐ\90ко Ð¿Ð¾Ð½Ð¾Ð²Ð¾ ÐºÐ»Ð¸ÐºÐ½ÐµÑ\82е Ð½Ð° â\80\9e$1â\80\9d, измена ће бити сачувана без наслова.",
        "summary-preview": "Преглед описа измене:",
        "subject-preview": "Преглед теме:",
        "previewerrortext": "Догодила се грешка приликом приказивања ваших измена.",
        "userinvalidcssjstitle": "<strong>Упозорење:</strong> не постоји тема „$1“.\nПрилагођене странице CSS и јаваскрипт почињу малим словом, нпр. {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
        "updated": "(Ажурирано)",
        "note": "<strong>Напомена:</strong>",
-       "previewnote": "<strong>Ð\9eво Ñ\98е претпреглед.</strong>\nВаше измене још нису сачуване!",
+       "previewnote": "<strong>Ð\9dе Ð·Ð°Ð±Ð¾Ñ\80авиÑ\82е Ð´Ð° Ñ\98е Ð¾Ð²Ð¾ Ñ\81амо претпреглед.</strong>\nВаше измене још нису сачуване!",
        "continue-editing": "Иди на уређивачки оквир",
        "previewconflict": "Овај преглед осликава како ће текст у текстуалном оквиру изгледати.",
-       "session_fail_preview": "Ð\9dиÑ\81мо Ð¼Ð¾Ð³Ð»Ð¸ Ð´Ð° Ð¾Ð±Ñ\80адимо Ð²Ð°Ñ\88Ñ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83 Ð·Ð±Ð¾Ð³ Ð³Ñ\83биÑ\82ка Ð¿Ð¾Ð´Ð°Ñ\82ака Ñ\81еÑ\81иÑ\98е.\n\nÐ\9cожда Ñ\81Ñ\82е Ð¾Ð´Ñ\98авÑ\99ени. <strong>Ð\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\81Ñ\82е Ð¿Ñ\80иÑ\98авÑ\99ен Ð¸ Ð¿Ð¾ÐºÑ\83Ñ\88аÑ\98Ñ\82е Ð¿Ð¾Ð½Ð¾Ð²Ð¾</strong>.\n\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли су на Вашем претраживачу дозвољени колачићи са овог сајта.",
+       "session_fail_preview": "Ð\98звиÑ\9aавамо Ñ\81е! Ð\9dиÑ\81мо Ð¼Ð¾Ð³Ð»Ð¸ Ð´Ð° Ð¾Ð±Ñ\80адимо Ð\92аÑ\88Ñ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83 Ð·Ð±Ð¾Ð³ Ð³Ñ\83биÑ\82ка Ð¿Ð¾Ð´Ð°Ñ\82ака Ñ\81еÑ\81иÑ\98е.\n\nÐ\9cожда Ñ\81Ñ\82е Ð¾Ð´Ñ\98авÑ\99ени. <strong>Ð\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\81Ñ\82е Ð¿Ñ\80иÑ\98авÑ\99ен Ð¸ Ð¿Ð¾ÐºÑ\83Ñ\88аÑ\98Ñ\82е Ð¿Ð¾Ð½Ð¾Ð²Ð¾</strong>.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли су на Вашем претраживачу дозвољени колачићи са овог сајта.",
        "session_fail_preview_html": "Нисмо могли да обрадимо вашу измену због губитка података сесије.\n\n<em>Будући да је на овом викију омогућен унос HTML ознака, преглед је сакривен као мера предострожности против напада преко јаваскрипта.</em>\n\n<strong>Ако сте покушали да направите праву измену, покушајте поново.<strong>\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите и проверите да ли Ваш претраживач дозвољава колачиће са овог сајта.",
        "token_suffix_mismatch": "'''Ваша измена је одбачена јер је ваш прегледач убацио знакове интерпункције у новчић уређивања.\nТо се понекад догађа када се користи неисправан посредник.'''",
        "edit_form_incomplete": "<strong>Неки делови обрасца за уређивање нису стигли до сервера. Проверите да ли су ваше измене непромењене и покушајте поново.</strong>",
        "editingsection": "Уређујете $1 (одељак)",
        "editingcomment": "Уређујете $1 (нови одељак)",
        "editconflict": "Сукобљене измене: $1",
-       "explainconflict": "Ð\9dеко Ð´Ñ\80Ñ\83ги Ñ\98е Ñ\83 Ð¼ÐµÑ\92Ñ\83вÑ\80еменÑ\83 Ð¿Ñ\80оменио Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83.\nÐ\93оÑ\80Ñ\9aи Ð¾ÐºÐ²Ð¸Ñ\80 Ñ\81адÑ\80жи Ñ\81адаÑ\88Ñ\9aи Ñ\82екÑ\81Ñ\82 Ñ\81Ñ\82Ñ\80аниÑ\86е.\nÐ\92аÑ\88е Ð¸Ð·Ð¼ÐµÐ½Ðµ Ñ\81Ñ\83 Ð¿Ñ\80иказане Ñ\83 Ð´Ð¾Ñ\9aем Ð¿Ð¾Ñ\99Ñ\83.\nÐ\9cоÑ\80аÑ\9bеÑ\82е Ð´Ð° Ñ\83неÑ\81еÑ\82е Ñ\81воÑ\98е Ð¿Ñ\80омене Ñ\83 Ñ\81адаÑ\88Ñ\9aи Ñ\82екÑ\81Ñ\82 Ñ\81Ñ\82Ñ\80аниÑ\86е.\n<strong>Само</strong> Ñ\9bе Ñ\82екÑ\81Ñ\82 Ñ\83 Ð³Ð¾Ñ\80Ñ\9aем Ñ\82екÑ\81Ñ\82Ñ\83алном Ð¾ÐºÐ²Ð¸Ñ\80Ñ\83 Ð±Ð¸Ñ\82и Ñ\81аÑ\87Ñ\83ван ÐºÐ°Ð´Ð° ÐºÐ»Ð¸ÐºÐ½ÐµÑ\82е Ð½Ð° â\80\9e{{int:savearticle}}â\80\9c.",
+       "explainconflict": "Ð\9dеко Ð´Ñ\80Ñ\83ги Ñ\98е Ñ\83 Ð¼ÐµÑ\92Ñ\83вÑ\80еменÑ\83 Ð¿Ñ\80оменио Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83.\nÐ\93оÑ\80Ñ\9aи Ð¾ÐºÐ²Ð¸Ñ\80 Ñ\81адÑ\80жи Ñ\81адаÑ\88Ñ\9aи Ñ\82екÑ\81Ñ\82 Ñ\81Ñ\82Ñ\80аниÑ\86е.\nÐ\92аÑ\88е Ð¸Ð·Ð¼ÐµÐ½Ðµ Ñ\81Ñ\83 Ð¿Ñ\80иказане Ñ\83 Ð´Ð¾Ñ\9aем Ð¾ÐºÐ²Ð¸Ñ\80Ñ\83.\nÐ\9cоÑ\80аÑ\9bеÑ\82е Ð´Ð° Ñ\83неÑ\81еÑ\82е Ñ\81воÑ\98е Ð¿Ñ\80омене Ñ\83 Ñ\81адаÑ\88Ñ\9aи Ñ\82екÑ\81Ñ\82 Ñ\81Ñ\82Ñ\80аниÑ\86е.\n<strong>Само</strong> Ñ\9bе Ñ\82екÑ\81Ñ\82 Ñ\83 Ð³Ð¾Ñ\80Ñ\9aем Ð¾ÐºÐ²Ð¸Ñ\80Ñ\83 Ð·Ð° Ñ\83Ñ\80еÑ\92иваÑ\9aе Ð±Ð¸Ñ\82и Ñ\81аÑ\87Ñ\83ван ÐºÐ°Ð´Ð° ÐºÐ»Ð¸ÐºÐ½ÐµÑ\82е Ð½Ð° â\80\9e$1â\80\9d.",
        "yourtext": "Ваш текст",
        "storedversion": "Ускладиштена измена",
        "nonunicodebrowser": "'''Упозорење: ваш прегледач не подржава уникод.'''\nПромените га пре него што почнете с уређивањем.",
        "editingold": "<strong>Упозорење: уређујете застарелу измену ове странице.</strong>\nАко је сачувате, све новије измене ће бити изгубљене.",
        "yourdiff": "Разлике",
-       "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
-       "copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
+       "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\n<strong>Не шаљите радове заштићене ауторским правима без дозволе!</strong>",
+       "copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n<strong>Не шаљите радове заштићене ауторским правима без дозволе!</strong>",
        "editpage-cannot-use-custom-model": "Модел садржаја ове странице се не може променити.",
        "longpageerror": "'''Грешка: текст који сте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.'''\nСтраница не може бити сачувана.",
        "readonlywarning": "<strong>Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.</strong>\nМожда бисте желели сачувати текст за касније у некој текстуалној датотеци.\n\nСистемски администратор је навео следеће објашњење: $1",
        "protectedpagewarning": "<strong>Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.</strong>\nПоследњи запис у дневнику је приказан испод:",
-       "semiprotectedpagewarning": "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је уређују.\nПоследњи запис у дневнику је приказан испод:",
-       "cascadeprotectedwarning": "<strong>УпозоÑ\80еÑ\9aе:</strong> Ð¾Ð²Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\98е Ð·Ð°Ñ\88Ñ\82иÑ\9bена Ñ\82ако Ð´Ð° Ñ\98е Ð¼Ð¾Ð³Ñ\83 Ñ\83Ñ\80еÑ\92иваÑ\82и Ñ\81амо Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80и, Ñ\98еÑ\80 Ñ\98е Ð¾Ð½Ð° Ñ\83кÑ\99Ñ\83Ñ\87ена Ñ\83 {{PLURAL:$1|Ñ\81ледеÑ\9bÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 ÐºÐ¾Ñ\98а Ñ\98е|Ñ\81ледеÑ\9bе Ñ\81Ñ\82Ñ\80аниÑ\86е ÐºÐ¾Ñ\98е Ñ\81Ñ\83}} Ð·Ð°Ñ\88Ñ\82иÑ\9bене â\80\9eпÑ\80еноÑ\81ивомâ\80\9c заштитом:",
+       "semiprotectedpagewarning": "<strong>Напомена:</strong> Ова страница је заштићена, тако да само регистровани корисници могу да је уређују.\nПоследњи запис у дневнику приказан је испод као референца:",
+       "cascadeprotectedwarning": "<strong>УпозоÑ\80еÑ\9aе:</strong> Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\98е Ð·Ð°Ñ\88Ñ\82иÑ\9bена Ñ\82ако Ð´Ð° Ñ\98е Ð¼Ð¾Ð³Ñ\83 Ñ\83Ñ\80еÑ\92иваÑ\82и Ñ\81амо ÐºÐ¾Ñ\80иÑ\81ниÑ\86и Ñ\81а [[Special:ListGroupRights|одÑ\80еÑ\92еним Ð¿Ñ\80авима]] (админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80и), Ñ\98еÑ\80 Ñ\98е Ð¸Ñ\81Ñ\82а Ñ\83кÑ\99Ñ\83Ñ\87ена Ñ\83 {{PLURAL:$1|Ñ\81ледеÑ\9bÑ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 ÐºÐ¾Ñ\98а Ñ\98е Ð·Ð°Ñ\88Ñ\82иÑ\9bена|Ñ\81ледеÑ\9bе Ñ\81Ñ\82Ñ\80аниÑ\86е ÐºÐ¾Ñ\98е Ñ\81Ñ\83 Ð·Ð°Ñ\88Ñ\82иÑ\9bене}} â\80\9eпÑ\80еноÑ\81ивомâ\80\9d заштитом:",
        "titleprotectedwarning": "<strong>Упозорење: ову страницу могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].</strong>\nИспод су наведени последњи записи у дневнику:",
        "templatesused": "{{PLURAL:$1|Шаблон|Шаблони}} на овој страници:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон|Шаблони}} у овом прегледу:",
        "post-expand-template-argument-warning": "'''Упозорење:''' ова страница садржи најмање један аргумент у шаблону који има превелику величину.\nОвакве аргументе би требало избегавати.",
        "post-expand-template-argument-category": "Странице које садрже изостављене аргументе у шаблону",
        "parser-template-loop-warning": "Откривена је петља шаблона: [[$1]]",
+       "template-loop-category": "Странице са петљама шаблона",
+       "template-loop-category-desc": "Страница садржи петљу шаблона, тј. шаблон који позива сам ребе рекурзивно.",
        "parser-template-recursion-depth-warning": "Дубина укључивања шаблона је прекорачена ($1)",
        "language-converter-depth-warning": "Прекорачена је граница дубине језичког претварача ($1)",
        "node-count-exceeded-category": "Странице у којима је прекорачен број чворова",
        "page_first": "прва",
        "page_last": "последња",
        "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> = разлика с тренутном изменом, <strong>({{int:last}})</strong> = разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> = мала измена",
-       "history-fieldset-title": "Преглед историје",
+       "history-fieldset-title": "Преглед измена",
        "history-show-deleted": "Само обрисано",
        "histfirst": "најстарије",
        "histlast": "најновије",
        "difference-multipage": "(разлике између страница)",
        "lineno": "Ред $1:",
        "compareselectedversions": "Упореди изабране измене",
-       "showhideselectedversions": "Ð\9fÑ\80икажи/Ñ\81акÑ\80иÑ\98 Ð¸Ð·Ð°Ð±Ñ\80ане Ð¸Ð·Ð¼ÐµÐ½Ðµ",
+       "showhideselectedversions": "Ð\9fÑ\80омени Ð²Ð¸Ð´Ñ\99ивоÑ\81Ñ\82 Ð¸Ð·Ð°Ð±Ñ\80аниÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð°",
        "editundo": "поништи",
        "diff-empty": "(Нема разлике)",
        "diff-multi-sameuser": "({{PLURAL:$1|Једна међуизмена истог корисника није приказана|$1 међуизмене истог корисника није приказано|$1 међуизмена истог корисника није приказано}})",
        "nextn-title": "$1 {{PLURAL:$1|следећи резултат|следећа резултата|следећих резултата}}",
        "shown-title": "Прикажи $1 {{PLURAL:$1|резултат|резултата|резултата}} по страници",
        "viewprevnext": "Погледај ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "<strong>Постоји и страница под називом „[[:$1]]“.</strong> {{PLURAL:$2|0=|Види такође резултате претраге.}}",
-       "searchmenu-new": "<strong>Ð\9dапÑ\80авиÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e[[:$1]]â\80\9c!</strong> {{PLURAL:$2|0=|Ð\92иди Ñ\82акоÑ\92е резултате претраге.}}",
+       "searchmenu-exists": "<strong>Постоји страница под називом „[[:$1]]”!</strong> {{PLURAL:$2|0=|Такође погледајте друге пронађене резултате претраге.}}",
+       "searchmenu-new": "<strong>Ð\9dапÑ\80авиÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e[[:$1]]â\80\9d!</strong> {{PLURAL:$2|0=|ТакоÑ\92е Ð¿Ð¾Ð³Ð»ÐµÐ´Ð°Ñ\98Ñ\82е Ñ\80езÑ\83лÑ\82аÑ\82 Ð¿Ñ\80еÑ\82Ñ\80аге.|ТакоÑ\92е Ð¿Ð¾Ð³Ð»ÐµÐ´Ð°Ñ\98Ñ\82е резултате претраге.}}",
        "searchprofile-articles": "Чланци",
        "searchprofile-images": "Датотеке",
        "searchprofile-everything": "Све",
        "search-file-match": "(подудара се садржај датотеке)",
        "search-suggest": "Да ли сте мислили на: $1",
        "search-rewritten": "Приказани резултати за $1. Ипак претражи $2.",
-       "search-interwiki-caption": "Ð\91Ñ\80аÑ\82Ñ\81ки Ð¿Ñ\80оÑ\98екÑ\82и",
+       "search-interwiki-caption": "РезÑ\83лÑ\82аÑ\82и Ñ\81а Ñ\81еÑ\81Ñ\82Ñ\80инÑ\81киÑ\85 Ð¿Ñ\80оÑ\98екаÑ\82а",
        "search-interwiki-default": "Резултати са $1:",
        "search-interwiki-more": "(више)",
        "search-relatedarticle": "Повезано",
        "searchrelated": "повезано",
        "searchall": "све",
-       "showingresults": "Испод {{PLURAL:$1|је приказан <strong>1</strong> резултат|су приказана <strong>$1</strong> резултата|је приказано <strong>$1</strong> резултата}} почев од броја <strong>$2</strong>.",
+       "showingresults": "Испод {{PLURAL:$1|је приказан <strong>1</strong> резултат|су приказана <strong>$1</strong> резултата|је приказано <strong>$1</strong> резултата}}, почев од броја <strong>$2</strong>.",
        "showingresultsinrange": "Испод {{PLURAL:$1|је приказан <strong>1</strong> резултат|су приказана <strong>$1</strong> резултата|је приказано <strong>$1</strong> резултата}}, у распону од <strong>$2</strong> до <strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|РезÑ\83лÑ\82аÑ\82 <strong>$1</strong> Ð¾Ð´ <strong>$3</strong>|РезÑ\83лÑ\82аÑ\82а <strong>$1 â\80\93 $2</strong> од <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|РезÑ\83лÑ\82аÑ\82 <strong>$1</strong> Ð¾Ð´ <strong>$3</strong>|РезÑ\83лÑ\82аÑ\82и <strong>$1â\80\94$2</strong> од <strong>$3</strong>}}",
        "search-nonefound": "Нема поклапања.",
        "powersearch-legend": "Напредна претрага",
-       "powersearch-ns": "ТÑ\80ажи Ñ\83 Ñ\81ледеÑ\9bим именским просторима:",
+       "powersearch-ns": "Ð\9fÑ\80еÑ\82Ñ\80ага Ð¿Ð¾ именским просторима:",
        "powersearch-togglelabel": "Изабери:",
-       "powersearch-toggleall": "све",
-       "powersearch-togglenone": "ништа",
+       "powersearch-toggleall": "Све",
+       "powersearch-togglenone": "Ð\9dишта",
        "powersearch-remember": "Запамти мој избор за будуће претраге",
        "search-external": "Спољна претрага",
        "searchdisabled": "Претрага је онемогућена.\nУ међувремену можете тражити преко Гугла.\nУпамтите да његови пописи овог викија могу бити застарели.",
        "prefswarning-warning": "Променили сте ваша подешавања али нисте их још сачували.\nАко не притиснете „$1“ ваша подешавања ће бити изгубљена.",
        "prefs-tabs-navigation-hint": "Савет: можете користити типке са левом и десном стрелицом за кретање кроз картице.",
        "userrights": "Управљање корисничким правима",
-       "userrights-lookup-user": "УпÑ\80авÑ\99аÑ\9aе ÐºÐ¾Ñ\80иÑ\81ниÑ\87ким Ð³Ñ\80Ñ\83пама",
+       "userrights-lookup-user": "Ð\98забеÑ\80и ÐºÐ¾Ñ\80иÑ\81ника",
        "userrights-user-editname": "Корисничко име:",
        "editusergroup": "Учитај корисничке групе",
        "editinguser": "Мењате корисничка права {{GENDER:$1|корисника|кориснице}} <strong>[[User:$1|$1]]</strong> $2",
        "saveusergroups": "Сачувај {{GENDER:$1|корисничке}} групе",
        "userrights-groupsmember": "Члан:",
        "userrights-groupsmember-auto": "Подразумевано члан и:",
-       "userrights-groups-help": "Можете променити групе којима овај корисник припада.\n* Означен квадратић означава да се корисник налази у тој групи.\n* Неозначен квадратић означава да се корисник не налази у тој групи.\n* Звездица означава да не можете уклонити групу ако је додате и обратно.",
+       "userrights-groups-help": "Можете променити групе којима овај корисник припада:\n* Означен квадратић означава да се корисник налази у тој групи.\n* Неозначен квадратић означава да се корисник не налази у тој групи.\n* Звездица (*) означава да не можете уклонити ту групу ако је додате и обратно.\n* Тараба (#) означава да једино можете одложити време истека чланства у тој групи; не можете га убрзати.",
        "userrights-reason": "Разлог:",
        "userrights-no-interwiki": "Немате овлашћења да мењате корисничка права на другим викијима.",
        "userrights-nodatabase": "База података $1 не постоји или није локална.",
        "userrights-changeable-col": "Групе које можете да промените",
        "userrights-unchangeable-col": "Групе које не можете да промените",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "Истиче $1",
+       "userrights-expiry-none": "Не истиче",
+       "userrights-expiry": "Истиче:",
+       "userrights-cannot-shorten-expiry": "Не можете убрзати истек чланства у групи „$1”. Само корисници са дозволом да додају или уклоне ову групу могу да убрзају рок истека.",
        "userrights-conflict": "Сукоб промена корисничких права! Молимо проверите ваше измене.",
        "group": "Група:",
        "group-user": "Корисници",
        "right-createtalk": "прављење страница за разговор",
        "right-createaccount": "отварање нових корисничких налога",
        "right-minoredit": "означавање измена мањим",
-       "right-move": "премештање страница",
+       "right-move": "Ð\9fремештање страница",
        "right-move-subpages": "премештање страница с њиховим подстраницама",
        "right-move-rootuserpages": "премештање основних корисничких страница",
-       "right-move-categorypages": "премештање категорија",
-       "right-movefile": "премештање датотека",
+       "right-move-categorypages": "Ð\9fремештање категорија",
+       "right-movefile": "Ð\9fремештање датотека",
        "right-suppressredirect": "премештање страница без остављања преусмерења",
        "right-upload": "Отпремање датотека",
        "right-reupload": "замењивање постојећих датотека",
        "right-editsemiprotected": "уређивање страница под заштитом „{{int:protect-level-autoconfirmed}}“",
        "right-editcontentmodel": "мењање модела садржаја странице",
        "right-editinterface": "уређивање корисничког окружења",
-       "right-editusercssjs": "уређивање туђих CSS и јаваскрипт датотека",
        "right-editusercss": "уређивање туђих CSS датотека",
        "right-edituserjs": "уређивање туђих JavaScript датотека",
        "right-editmyusercss": "уређивање сопствених CSS датотека",
        "action-writeapi": "писање АПИ-ја",
        "action-delete": "брисање ове странице",
        "action-deleterevision": "брисање измена",
-       "action-deletedhistory": "прегледање обрисане историје ове странице",
+       "action-deletedhistory": "прегледање обрисане историје странице",
        "action-browsearchive": "претраживање обрисаних страница",
        "action-undelete": "враћање страница",
-       "action-suppressrevision": "прегледање и враћање ове сакривене измене",
+       "action-suppressrevision": "прегледање и враћање сакривених измена",
        "action-suppressionlog": "прегледање ове приватне историје",
        "action-block": "блокирање даљих измена овог корисника",
        "action-protect": "мењање степена заштите ове странице",
        "recentchanges-summary": "Пратите скорашње измене на овој страници.",
        "recentchanges-noresult": "Нема промена у задатом времену за задате критеријуме.",
        "recentchanges-feed-description": "Пратите скорашње измене уз помоћ овог довода.",
-       "recentchanges-label-newpage": "Ð\9dова страница",
-       "recentchanges-label-minor": "Ð\9cања измена",
+       "recentchanges-label-newpage": "Ð\9eвом Ð¸Ð·Ð¼ÐµÐ½Ð¾Ð¼ Ð½Ð°Ð¿Ñ\80авÑ\99ена Ñ\98е Ð½ова страница",
+       "recentchanges-label-minor": "Ð\9eво Ñ\98е Ð¼ања измена",
        "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": "Прикажи",
+       "rcfilters-quickfilters": "Брзе везе",
+       "rcfilters-savedqueries-defaultlabel": "Сачувани филтери",
+       "rcfilters-savedqueries-rename": "Преименуј",
+       "rcfilters-savedqueries-setdefault": "Постави као подразумевано",
+       "rcfilters-savedqueries-unsetdefault": "Уклони као подразумевано",
+       "rcfilters-savedqueries-remove": "Уклони",
+       "rcfilters-savedqueries-new-name-label": "Име",
+       "rcfilters-savedqueries-apply-label": "Направи брзу везу",
+       "rcfilters-savedqueries-cancel-label": "Откажи",
+       "rcfilters-savedqueries-add-new-title": "Сачувај филтере као брзу везу",
        "rcfilters-restore-default-filters": "Враћање подразумеваних филтера",
        "rcfilters-clear-all-filters": "Уклони све филтере",
        "rcfilters-empty-filter": "Нема активних филтера. Сви доприноси су приказани.",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Новајлије",
-       "rcfilters-filter-userExpLevel-experienced-label": "Искусни корисници",
+       "rcfilters-noresults-conflict": "Није пронађен ниједан резултат јер су критеријуми претраге сукобљени",
+       "rcfilters-state-message-subset": "Овај филтер нема ефекта јер су његови резултати укључени са онима {{PLURAL:$2|следећег, ширег филтера|следећих, ширих филтера}} (покушајте са означавањем да бисте их распознали): $1",
+       "rcfilters-state-message-fullcoverage": "Одабир свих филтера у групи је исто као и одабир ниједног, тако да овај филтер нема ефекта. Група укључује: $1",
+       "rcfilters-filtergroup-registration": "Регистрација корисника",
+       "rcfilters-filter-registered-label": "Регистровани",
+       "rcfilters-filter-registered-description": "Пријављени уредници.",
+       "rcfilters-filter-unregistered-label": "Нерегистровани",
+       "rcfilters-filter-unregistered-description": "Уредници који нису пријављени.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Овај филтер је у сукобу са следећим {{PLURAL:$2|филтером|филтерима}} за искуство, који {{PLURAL:$2|проналази|проналазе}} само регистроване кориснике: $1",
+       "rcfilters-filtergroup-authorship": "Ауторство доприноса",
+       "rcfilters-filter-editsbyself-label": "Ваше измене",
+       "rcfilters-filter-editsbyself-description": "Ваши доприноси.",
+       "rcfilters-filter-editsbyother-label": "Измене других",
+       "rcfilters-filter-editsbyother-description": "Све измене осим Ваших.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Филтери за искуство проналазе само регистроване кориснике, тако да је овај филтер у сукобу са филтером „Unregistered”.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Филтер „Unregistered” је у сукобу са једним или више филтера за искуство, који проналазе само регистроване кориснике. Сукобљени филтери су означени у подручју Активни филтери, изнад.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Новајлије",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Мање од 10 измјена и 4 дана активности.",
+       "rcfilters-filter-user-experience-level-learner-label": "Ученици",
+       "rcfilters-filter-user-experience-level-learner-description": "Више искуства од „новајлија”, али мање од „искусних корисника”.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Искусни корисници",
+       "rcfilters-filter-user-experience-level-experienced-description": "Преко 30 дана активности и 500 измјена.",
+       "rcfilters-filter-bots-label": "Бот",
+       "rcfilters-filter-minor-label": "Мање измјене",
+       "rcfilters-filtergroup-watchlist": "Странице на списку надгледања",
+       "rcfilters-filter-watchlist-watched-label": "На списку надгледања",
+       "rcfilters-filter-watchlist-watched-description": "Измене страница на Вашем списку надгледања",
+       "rcfilters-filter-watchlist-watchednew-label": "Нове измене у списку надгледања",
+       "rcfilters-filter-watchlist-watchednew-description": "Измене страница на списку надгледања које нисте посетили од када су направљене измене.",
+       "rcfilters-filter-watchlist-notwatched-label": "Није на списку надгледања",
+       "rcfilters-filter-watchlist-notwatched-description": "Све осим измена страница на Вашем списку надгледања.",
+       "rcfilters-filter-pageedits-label": "Измјене страница",
+       "rcfilters-filter-pageedits-description": "Измјене вики садржаја, расправа, описа категорија...",
+       "rcfilters-filter-newpages-label": "Стварање страница",
+       "rcfilters-filter-newpages-description": "Измјене којима се стварају нове странице.",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Филтер за „мање” измене је у сукобу са једним или више филтера типа измена, зато што одређени типови измена не могу да се означе као „мање”. Сукобљени филтери су означени у подручју Активни филтери, изнад.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Одређени типови измена не могу да се означе као „мање”, тако да је овај филтер у сукобу са следећим филтерима типа измена: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Овај филтер типа измене је у сукобу са филтером за „мање” измене. Одређени типови измена не могу да се означе као „мање”.",
+       "rcfilters-filtergroup-lastRevision": "Последња измена",
+       "rcfilters-filter-lastrevision-label": "Последња измена",
+       "rcfilters-filter-lastrevision-description": "Најскорашњија измена странице.",
+       "rcfilters-filter-previousrevision-label": "Раније измене",
+       "rcfilters-filter-previousrevision-description": "Све измене које нису најскорашњије измене странице.",
        "rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
+       "rclistfromreset": "Ресетуј одабир датума",
        "rclistfrom": "Прикажи нове измене почев од $2 $3",
        "rcshowhideminor": "$1 мање измене",
        "rcshowhideminor-show": "Прикажи",
        "rcshowhidecategorization": "$1 категоризацију страница",
        "rcshowhidecategorization-show": "Прикажи",
        "rcshowhidecategorization-hide": "Сакриј",
-       "rclinks": "Прикажи последњих $1 измена {{PLURAL:$2|претходни дан|у последња $2 дана|у последњих $2 дана}}<br />$3",
+       "rclinks": "Прикажи последњих $1 измена {{PLURAL:$2|претходни дан|у последња $2 дана|у последњих $2 дана}}",
        "diff": "разл",
        "hist": "ист",
        "hide": "Сакриј",
        "recentchangeslinked-page": "Назив странице:",
        "recentchangeslinked-to": "Прикажи измене страница које су повезане с датом страницом",
        "recentchanges-page-added-to-category": "[[:$1]] је додата у категорију",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су додате у категорију",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] је додана у категорију, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]",
        "recentchanges-page-removed-from-category": "[[:$1]] је уклоњена из категорије",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су уклоњене из категорије",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] је уклоњена из категорије, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]",
        "autochange-username": "Медијавики аутоматска измена",
        "upload": "Отпреми датотеку",
        "uploadbtn": "Отпреми датотеку",
        "php-uploaddisabledtext": "Отпремање датотека је онемогућено у PHP-у.\nПроверите подешавања file_uploads.",
        "uploadscripted": "Датотека садржи HTML или скриптни код који може бити погрешно протумачен од стране прегледача.",
        "upload-scripted-pi-callback": "Датотека која садржи инструкције за обраду XML стилског облика се не може отпремити.",
+       "upload-scripted-dtd": "Није могуће отпремање SVG датотека које садрже нестандардну DTD декларацију.",
        "uploaded-script-svg": "Пронађен скриптни елеменат „$1“ у постављеној SVG датотеци.",
        "uploaded-hostile-svg": "Пронађен небезбедан CSS у стилском елементу постављене SVG датотеке.",
        "uploaded-event-handler-on-svg": "Није дозвољено постављање атрибута који контролишу догађаје <code>$1=\"$2\"</code> у SVG датотекама.",
        "zip-bad": "Датотека је оштећена или је нечитљива ZIP датотека.\nБезбедносна провера не може да се изврши како треба.",
        "zip-unsupported": "Датотека је формата ZIP који користи могућности које не подржава Медијавики.\nБезбедносна провера не може да се изврши како треба.",
        "uploadstash": "Тајно складиште",
-       "uploadstash-summary": "Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ñ\80Ñ\83жа Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п Ð´Ð°Ñ\82оÑ\82екама ÐºÐ¾Ñ\98е Ñ\81Ñ\83 Ð¿Ð¾Ñ\81лаÑ\82е (или Ñ\81е Ñ\88аÑ\99Ñ\83), Ð°Ð»Ð¸ Ñ\98оÑ\88 Ð½Ð¸Ñ\81Ñ\83 Ð¾Ð±Ñ\98авÑ\99ене. Ð\9eве Ð´Ð°Ñ\82оÑ\82еке Ñ\81Ñ\83 Ð²Ð¸Ð´Ñ\99иве Ñ\81амо ÐºÐ¾Ñ\80иÑ\81никÑ\83 ÐºÐ¾Ñ\98и Ð³Ð° Ñ\98е Ð¿Ð¾Ñ\81лао.",
+       "uploadstash-summary": "Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ñ\80Ñ\83жа Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п Ð´Ð°Ñ\82оÑ\82екама ÐºÐ¾Ñ\98е Ñ\81Ñ\83 Ð¾Ñ\82пÑ\80емÑ\99ене Ð¸Ð»Ð¸ Ñ\81е Ð¾Ñ\82пÑ\80емаÑ\98Ñ\83, Ð°Ð»Ð¸ Ñ\98оÑ\88 Ð½Ð¸Ñ\81Ñ\83 Ð¾Ð±Ñ\98авÑ\99ене. Ð\9eве Ð´Ð°Ñ\82оÑ\82еке Ð½Ð¸Ñ\81Ñ\83 Ð²Ð¸Ð´Ñ\99иве Ð½Ð¸ÐºÐ¾Ð¼Ðµ, Ð¾Ñ\81им ÐºÐ¾Ñ\80иÑ\81никÑ\83 ÐºÐ¾Ñ\98и Ð¸Ñ\85 Ñ\98е Ð¾Ñ\82пÑ\80емио.",
        "uploadstash-clear": "Очисти сакривене датотеке",
        "uploadstash-nofiles": "Немате сакривене датотеке.",
        "uploadstash-badtoken": "Извршавање дате радње није успело, разлог томе може бити истек времена за уређивање. Покушајте поново.",
        "img-auth-nopathinfo": "Недостаје PATH_INFO.\nВаш сервер није подешен да прослеђује овакве податке.\nМожда је заснован на CGI-ју који не подржава img_auth.\nПогледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=sr-ec.",
        "img-auth-notindir": "Захтевана путања није у подешеној фасцикли за отпремање.",
        "img-auth-badtitle": "Не могу да створим исправан наслов за „$1“.",
-       "img-auth-nologinnWL": "Ð\9dиÑ\81Ñ\82е Ð¿Ñ\80иÑ\98авÑ\99ени Ð¸ â\80\9e$1â\80\9c није на списку дозвољених.",
+       "img-auth-nologinnWL": "Ð\9dиÑ\81Ñ\82е Ð¿Ñ\80иÑ\98авÑ\99ени Ð¸ â\80\9e$1â\80\9d није на списку дозвољених.",
        "img-auth-nofile": "Датотека „$1“ не постоји.",
        "img-auth-isdir": "Покушавате да приступите фасцикли „$1“.\nДозвољен је само приступ датотекама.",
        "img-auth-streaming": "Учитавање „$1“.",
        "upload-curl-error28-text": "Сервер не одговара на упит.\nПроверите да ли сајт ради, мало осачекајте и покушајте поново.\nПробајте касније када буде мање оптерећење.",
        "license": "Лиценца:",
        "license-header": "Лиценца:",
-       "nolicense": "није изабрано",
+       "nolicense": "Ð\9dије изабрано",
        "licenses-edit": "Уреди избор лиценци",
        "license-nopreview": "(преглед није доступан)",
        "upload_source_url": "(ваша изабрана датотека од исправних и јавно доступних адреса)",
        "filehist-revert": "врати",
        "filehist-current": "тренутно",
        "filehist-datetime": "Датум/време",
-       "filehist-thumb": "Ð\9cиниÑ\98аÑ\82Ñ\83Ñ\80а",
+       "filehist-thumb": "УмаÑ\9aени Ð¿Ñ\80иказ",
        "filehist-thumbtext": "Умањени приказ за издање од $1",
-       "filehist-nothumb": "Нема минијатуре",
+       "filehist-nothumb": "Нема умањеног приказа",
        "filehist-user": "Корисник",
        "filehist-dimensions": "Димензије",
        "filehist-filesize": "Величина датотеке",
        "wantedcategories": "Тражене категорије",
        "wantedpages": "Тражене странице",
        "wantedpages-summary": "Списак непостојећих страница са највише веза до њих, на овом списку се не налазе странице до којих воде преусмерења. За списак покварених преусмерења погледајте [[{{#special:BrokenRedirects}}|списак покварених преусмерења]].",
-       "wantedpages-badtitle": "Неисправан наслов у низу резултата: $1",
+       "wantedpages-badtitle": "Неисправан наслов у сету резултата: $1",
        "wantedfiles": "Тражене датотеке",
        "wantedfiletext-cat": "Следеће датотеке се користе, али не постоје. Датотеке из других ризница могу бити наведене иако не постоје. Такве датотеке ће бити <del>поништене</del> са списка. Поред тога, странице које садрже непостојеће датотеке се налазе [[:$1|овде]].",
        "wantedfiletext-nocat": "Следеће датотеке се користе, али не постоје. Датотеке из других ризница могу бити наведене иако не постоје. Такве датотеке ће бити <del>поништене</del> са списка.",
        "apihelp-no-such-module": "Модул „$1“ није пронађен.",
        "apisandbox": "API песак",
        "apisandbox-api-disabled": "АПИ је онемогућен на овом сајту.",
+       "apisandbox-unfullscreen": "Прикажи страницу",
        "apisandbox-submit": "Постави захтев",
        "apisandbox-reset": "Очисти",
+       "apisandbox-retry": "Покушај поново",
        "apisandbox-results": "Резултати",
        "apisandbox-request-url-label": "Адреса захтева:",
        "apisandbox-continue": "Настави",
        "showhideselectedlogentries": "Прикажи/сакриј изабране догађаје",
        "log-edit-tags": "Уреди ознаке изабраних уноса у дневницима",
        "checkbox-select": "Изабери: $1",
-       "checkbox-all": "све",
-       "checkbox-none": "ништа",
-       "checkbox-invert": "обрни",
+       "checkbox-all": "Све",
+       "checkbox-none": "Ð\9dишта",
+       "checkbox-invert": "Ð\9eбрни",
        "allpages": "Све странице",
        "nextpage": "Следећа страница ($1)",
        "prevpage": "Претходна страница ($1)",
        "listgrouprights-namespaceprotection-header": "Ограничења именских простора",
        "listgrouprights-namespaceprotection-namespace": "Именски простор",
        "listgrouprights-namespaceprotection-restrictedto": "Права потребна за уређивање",
+       "listgrants": "Дозволе",
        "listgrants-rights": "Права",
        "trackingcategories": "Медијавики категорије",
        "trackingcategories-summary": "Ова посебна страница је списак категорија које су део Медијавикија, оне се аутоматски ажурирају и њихови називи се могу мењати уређивањем системских порука у именском простору {{ns:8}}.",
        "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:$2|Вашу}} имејл адресу.",
        "usermessage-summary": "Слање системске поруке.",
        "usermessage-editor": "Уређивач системских порука",
        "usermessage-template": "MediaWiki:UserMessage",
        "wlshowhidecategorization": "категоризацију страница",
        "watchlist-options": "Поставке списка надгледања",
        "watching": "Надгледање…",
-       "unwatching": "Ð\9fÑ\80екидаÑ\9aе Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aаâ\80¦",
+       "unwatching": "УклаÑ\9aаÑ\9aе Ñ\81а Ñ\81пиÑ\81ка Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа...",
        "watcherrortext": "Дошло је до грешке при промени поставки вашег списка надгледања за „$1“.",
        "enotif_reset": "Означи све странице као посећене",
        "enotif_impersonal_salutation": "{{SITENAME}} корисник",
        "enotif_body_intro_moved": "Страницу $1 на {{SITENAME}} {{GENDER:$2|преместио|преместила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на  $3.",
        "enotif_body_intro_restored": "Страницу $1 на {{SITENAME}} {{GENDER:$2|вратио|вратила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на $3.",
        "enotif_body_intro_changed": "Страницу $1 на {{SITENAME}} {{GENDER:$2|променио|променила}} је $2 дана $PAGEEDITDATE Тренутна измена налази се на $3.",
-       "enotif_lastvisited": "Ð\9fогледаÑ\98Ñ\82е $1 Ð·Ð° Ñ\81ве Ð¸Ð·Ð¼ÐµÐ½Ðµ Ð¾Ð´ Ð²Ð°Ñ\88е Ð¿Ð¾Ñ\81ледÑ\9aе Ð¿Ð¾Ñ\81еÑ\82е.",
-       "enotif_lastdiff": "Ð\9fогледаÑ\98Ñ\82е $1 Ð´Ð° Ð²Ð¸Ð´Ð¸Ñ\82е Ð¾Ð²Ñ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83.",
+       "enotif_lastvisited": "Ð\97а Ñ\81ве Ð¸Ð·Ð¼ÐµÐ½Ðµ Ð¾Ð´ Ð²Ð°Ñ\88е Ð¿Ð¾Ñ\81ледÑ\9aе Ð¿Ð¾Ñ\81еÑ\82е, Ð¿Ð¾Ð³Ð»ÐµÐ´Ð°Ñ\98Ñ\82е $1.",
+       "enotif_lastdiff": "Ð\94а Ð²Ð¸Ð´Ð¸Ñ\82е Ð¾Ð²Ñ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83, Ð¿Ð¾Ð³Ð»ÐµÐ´Ð°Ñ\98Ñ\82е $1.",
        "enotif_anon_editor": "анониман корисник $1",
        "enotif_body": "Поштовани $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nОпис: $PAGESUMMARY $PAGEMINOREDIT\n\nКонтакт:\nмејл: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\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": "направљена",
        "deletepage": "Обриши страницу",
        "confirm": "Потврди",
        "excontent": "садржај је био: „$1“",
-       "excontentauthor": "садржај је био: „$1“, а једини уредник [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])",
+       "excontentauthor": "садржај је био: „$1“, а једини уредник „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|разговор]])",
        "exbeforeblank": "садржај пре брисања је био: „$1“",
        "delete-confirm": "Брисање странице „$1“",
        "delete-legend": "Обриши",
        "editcomment": "Опис измене: <em>$1</em>.",
        "revertpage": "Враћене измене [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену корисника [[User:$1|$1]]",
        "revertpage-nouser": "Враћене су измене скривеног корисника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
-       "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} $1\nна последњу измену {{GENDER:$2|корисника|кориснице}} $2.",
+       "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}}\nна последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Сесија је окончана",
        "sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nВратите се на претходну страницу, поново је учитајте и покушајте поново.",
        "changecontentmodel": "Промени модел садржаја странице",
        "logentry-contentmodel-change": "$1 је {{GENDER:$2|променио|променила}} модел садржаја странице $3 из „$4“ у „$5“",
        "logentry-contentmodel-change-revertlink": "врати",
        "logentry-contentmodel-change-revert": "врати",
-       "protectlogpage": "Дневник закључавања",
+       "protectlogpage": "Дневник заштите",
        "protectlogtext": "Испод је списак заштићених страница.\nПогледајте [[Special:ProtectedPages|списак заштићених страница]] за више детаља.",
        "protectedarticle": "је заштитио „[[$1]]“",
        "modifiedarticleprotection": "промењен степен заштите за „[[$1]]“",
        "protect-locked-dblock": "Степени заштите се не могу мењати јер је активна база података закључана.\nОво су поставке странице '''$1''':",
        "protect-locked-access": "Немате овлашћења за мењање степена заштите странице.\nОво су тренутне поставке странице '''$1''':",
        "protect-cascadeon": "Ова страница је тренутно заштићена јер се налази на {{PLURAL:$1|страници која има|страницама које имају}} преносиву заштиту.\nМожете да промените степен заштите, али то неће утицати на преносиву заштиту.",
-       "protect-default": "Допуштено свима",
+       "protect-default": "Допуштено свим корисницима",
        "protect-fallback": "Дозвољено само корисницима са дозволом „$1“",
        "protect-level-autoconfirmed": "Допуштено само аутоматски потврђеним корисницима",
        "protect-level-sysop": "Допуштено само администраторима",
        "minimum-size": "Најмања величина",
        "maximum-size": "Највећа величина:",
        "pagesize": "(бајтови)",
-       "restriction-edit": "уређивање",
-       "restriction-move": "премештање",
+       "restriction-edit": "Уређивање",
+       "restriction-move": "Ð\9fремештање",
        "restriction-create": "прављење",
        "restriction-upload": "отпремање",
        "restriction-level-sysop": "потпуно заштићено",
        "undeleteviewlink": "погледај",
        "undeleteinvert": "Обрни избор",
        "undeletecomment": "Разлог:",
-       "undeletedrevisions": "{{PLURAL:$1|измена враћено}} $1",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека је враћена|датотеке су враћене|датотека је враћено}}",
-       "undeletedfiles": "{{PLURAL:$1|датотека враћено}} $1",
        "cannotundelete": "Враћање једне или свих ставник није успјело:\n$1",
        "undeletedpage": "<strong>Страница $1 је враћена</strong>\n\nПогледајте [[Special:Log/delete|дневник брисања]] за записе о скорашњим брисањима и враћањима.",
        "undelete-header": "Погледајте [[Special:Log/delete|историјат брисања]] за недавно обрисане странице.",
        "sp-contributions-uploads": "отпремања",
        "sp-contributions-logs": "дневници",
        "sp-contributions-talk": "разговор",
-       "sp-contributions-userrights": "Ñ\83пÑ\80авÑ\99аÑ\9aе ÐºÐ¾Ñ\80иÑ\81ниÑ\87ким Ð¿Ñ\80авима",
+       "sp-contributions-userrights": "Ñ\83пÑ\80авÑ\99аÑ\9aе Ð¿Ñ\80авима {{GENDER:$1|коÑ\80иÑ\81ника|коÑ\80иÑ\81ниÑ\86е|коÑ\80иÑ\81ника}}",
        "sp-contributions-blocked-notice": "Овај корисник је тренутно блокиран. \nИспод су наведени последњи записи у дневнику блокирања:",
        "sp-contributions-blocked-notice-anon": "Ова ИП адреса је тренутно блокирана.\nИспод су наведени последњи записи у дневнику блокирања:",
        "sp-contributions-search": "Претрага доприноса",
        "unblocked-id": "Блокирање $1 је уклоњено",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] је деблокиран.",
        "blocklist": "Блокирани корисници",
+       "autoblocklist": "Аутоблокови",
+       "autoblocklist-submit": "Претражи",
+       "autoblocklist-legend": "Списак аутоблокирања",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Локални аутоблок|Локални аутоблокови}}",
+       "autoblocklist-empty": "Списак аутоблокирања је празан.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Други аутоблок|Други аутоблокови}}",
        "ipblocklist": "Блокирани корисници",
        "ipblocklist-legend": "Проналажење блокираног корисника",
        "blocklist-userblocks": "Сакриј блокирања налога",
        "ipblocklist-no-results": "Тражена ИП адреса или корисничко име није блокирано.",
        "blocklink": "блокирај",
        "unblocklink": "деблокирај",
-       "change-blocklink": "пÑ\80омени Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aе",
+       "change-blocklink": "пÑ\80омени Ð±Ð»Ð¾ÐºÐ°Ð´Ñ\83",
        "contribslink": "доприноси",
        "emaillink": "пошаљи имејл",
        "autoblocker": "Аутоматски сте блокирани јер делите ИП адресу с корисником/цом [[User:$1|$1]].\nРазлог блокирања: „$2“",
        "delete_and_move_confirm": "Да, обриши страницу",
        "delete_and_move_reason": "Обрисано да се ослободи место за премештање из „[[$1]]“",
        "selfmove": "Изворни и одредишни наслови су истоветни;\nне могу да преместим страницу преко саме себе.",
-       "immobile-source-namespace": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80емеÑ\81Ñ\82им Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 â\80\9e$1â\80\9c",
-       "immobile-target-namespace": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80емеÑ\81Ñ\82им Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 â\80\9e$1â\80\9c",
+       "immobile-source-namespace": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð¿Ñ\80емеÑ\81Ñ\82иÑ\82и Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 â\80\9e$1â\80\9c.",
+       "immobile-target-namespace": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð¿Ñ\80емеÑ\81Ñ\82иÑ\82и Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 â\80\9e$1â\80\9c.",
        "immobile-target-namespace-iw": "Међувики веза није исправно одредиште за премештање странице.",
        "immobile-source-page": "Ова страница се не може преместити.",
        "immobile-target-page": "Не могу да преместим на жељени наслов.",
        "fix-double-redirects": "Ажурирајте сва преусмерења која воде до првобитног наслова",
        "move-leave-redirect": "Остави преусмерење",
        "protectedpagemovewarning": "'''Упозорење:''' ова страница је заштићена, тако да само корисници с администраторским овлашћењима могу да је преместе.\nЗа више информација, последњи запис у дневнику измена је приказан испод:",
-       "semiprotectedpagemovewarning": "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је преместе.\nЗа више информација, последњи запис у дневнику измена је приказан испод:",
+       "semiprotectedpagemovewarning": "<strong>Напомена:</strong> Ова страница је заштићена, тако да само регистровани корисници могу да је преместе.\nПоследњи запис у дневнику измена приказан је испод као референца:",
        "move-over-sharedrepo": "[[:$1]] се налази на дељеном складишту. Ако преместите датотеку на овај наслов, то ће заменити дељену датотеку.",
        "file-exists-sharedrepo": "Наведени назив датотеке се већ користи у дељеном складишту.\nИзаберите други назив.",
        "export": "Извоз страница",
        "allmessages-filter-legend": "Филтер",
        "allmessages-filter": "Филтрирај по стању:",
        "allmessages-filter-unmodified": "неизмењене",
-       "allmessages-filter-all": "све",
+       "allmessages-filter-all": "Све",
        "allmessages-filter-modified": "измењене",
        "allmessages-prefix": "Филтрирај по префиксу:",
        "allmessages-language": "Језик:",
        "tooltip-pt-mycontris": "Списак {{GENDER:|ваших}} доприноса",
        "tooltip-pt-anoncontribs": "Списак измена направљених са ове IP адресе",
        "tooltip-pt-login": "Препоручујемо вам да се пријавите, иако то није обавезно.",
+       "tooltip-pt-login-private": "Морате да се пријавите да бисте користили овај Вики",
        "tooltip-pt-logout": "Одјавите се",
        "tooltip-pt-createaccount": "Охрабрујемо вас да отворите налог и пријавите се али то није обавезно",
        "tooltip-ca-talk": "Разговор о страници са садржајем",
        "tooltip-undo": "Поништава ову измену и отвара образац за уређивање.",
        "tooltip-preferences-save": "Сачувај поставке",
        "tooltip-summary": "Унесите кратак опис",
+       "interlanguage-link-title": "$1 — $2",
+       "interlanguage-link-title-nonlang": "$1 — $2",
        "common.css": "/* CSS постављен овде ће се одразити на све теме */",
        "print.css": "/* CSS постављен овде ће утицати на издање за штампу */",
        "noscript.css": "/* CSS постављен овде ће утицати на све кориснике којима је онемогућен јаваскрипт */",
        "group-bot.js": "/* Јаваскрипт постављен овде ће се учитати само за ботове */",
        "group-sysop.js": "/* Јаваскрипт постављен овде ће се учитати само за системске операторе */",
        "group-bureaucrat.js": "/* Јаваскрипт постављен овде ће се учитати само за бирократе */",
-       "anonymous": "Ð\90нонимни {{PLURAL:$1|коÑ\80иÑ\81ник|коÑ\80иÑ\81ниÑ\86и}} Ð½Ð° Ð¿Ñ\80оÑ\98екÑ\82Ñ\83 {{SITENAME}}",
+       "anonymous": "Ð\90нонимни {{PLURAL:$1|коÑ\80иÑ\81ник|коÑ\80иÑ\81ниÑ\86и}} Ð¿Ñ\80оÑ\98екÑ\82а {{SITENAME}}",
        "siteuser": "{{SITENAME}} корисник $1",
        "anonuser": "{{SITENAME}} анониман корисник $1",
-       "lastmodifiedatby": "Ову страницу је последњи пут {{GENDER:$4|изменио|изменила|изменио}} $3, $1 у $2.",
+       "lastmodifiedatby": "Ову страницу је последњи пут {{GENDER:$4|уредио|уредила|уредио}} $3, на датум $1 у $2 ч.",
        "othercontribs": "Засновано на раду корисника $1.",
        "others": "други",
        "siteusers": "{{PLURAL:$2|1={{GENDER:$1|корисник|корисница}}|корисници}} на пројекту {{SITENAME}} $1",
        "file-no-thumb-animation-gif": "'''Напомена: због техничких ограничења, минијатуре GIF слика високе резолуције као што је ова неће се анимирати.'''",
        "newimages": "Галерија нових датотека",
        "imagelisttext": "Испод је списак од '''$1''' {{PLURAL:$1|датотеке|датотеке|датотека}} поређаних $2.",
-       "newimages-summary": "Ð\9eва Ð¿Ð¾Ñ\81ебна Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ñ\80иказÑ\83Ñ\98е Ð¿Ð¾Ñ\81ледÑ\9aе Ð¿Ð¾Ñ\81лаÑ\82е датотеке.",
+       "newimages-summary": "Ð\9eва Ð¿Ð¾Ñ\81ебна Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ñ\80иказÑ\83Ñ\98е Ð¿Ð¾Ñ\81ледÑ\9aе Ð¾Ñ\82пÑ\80емÑ\99ене датотеке.",
        "newimages-legend": "Филтер",
        "newimages-label": "Назив датотеке (или њен део):",
+       "newimages-user": "IP адреса или корисничко име",
        "newimages-showbots": "Прикажи датотеке које су послали ботови",
        "newimages-hidepatrolled": "Сакриј патролирана отпремања",
        "noimages": "Нема ништа.",
        "exif-scenecapturetype": "Врста снимања сцена",
        "exif-gaincontrol": "Контрола сцене",
        "exif-contrast": "Контраст",
-       "exif-saturation": "Засићење",
+       "exif-saturation": "Засићеност",
        "exif-sharpness": "Оштрина",
        "exif-devicesettingdescription": "Опис поставки уређаја",
        "exif-subjectdistancerange": "Опсег удаљености објекта",
        "exif-contrast-1": "Меко",
        "exif-contrast-2": "Тврдо",
        "exif-saturation-0": "Нормално",
-       "exif-saturation-1": "Ð\9dиÑ\81ко Ð·Ð°Ñ\81иÑ\9bеÑ\9aе",
-       "exif-saturation-2": "Ð\92иÑ\81око Ð·Ð°Ñ\81иÑ\9bеÑ\9aе",
+       "exif-saturation-1": "Ð\9dиÑ\81ка Ð·Ð°Ñ\81иÑ\9bеноÑ\81Ñ\82",
+       "exif-saturation-2": "Ð\92иÑ\81ока Ð·Ð°Ñ\81иÑ\9bеноÑ\81Ñ\82",
        "exif-sharpness-0": "Нормално",
        "exif-sharpness-1": "Меко",
        "exif-sharpness-2": "Тврдо",
        "confirmrecreate-noreason": "{{GENDER:$1|Корисник|Корисница}} [[User:$1|$1]] ([[User talk:$1|разговор]]) је {{GENDER:$1|обрисао|обрисала}} ову страницу након што сте почели да је уређујете. Потврдите да стварно желите да поново направите ову страницу.",
        "recreate": "Поново направи",
        "unit-pixel": "px",
+       "confirm-purge-title": "Освежи ову страницу",
        "confirm_purge_button": "У реду",
        "confirm-purge-top": "Очистити привремену меморију ове стране?",
        "confirm-purge-bottom": "Ова радња чисти привремену меморију и приказује најновију измену.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова су уклоњена|$1 наслова је уклоњено}}:",
        "watchlistedit-too-many": "Има превише страница за приказ овде.",
        "watchlisttools-clear": "испразни списак надгледања",
-       "watchlisttools-view": "прикажи сродне измене",
+       "watchlisttools-view": "Ð\9fрикажи сродне измене",
        "watchlisttools-edit": "прикажи и уреди списак надгледања",
        "watchlisttools-raw": "измени сиров списак надгледања",
        "iranian-calendar-m1": "Фарвардин",
        "hebrew-calendar-m12-gen": "Елул",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|разговор]])",
        "timezone-utc": "UTC",
-       "duplicate-defaultsort": "'''Упозорење:''' подразумевани кључ сврставања „$2“ мења некадашњи кључ „$1“.",
+       "duplicate-defaultsort": "<strong>Упозорење:</strong> Подразумевани кључ сврставања „$2“ мења ранији подразумевани кључ сврставања „$1“.",
        "duplicate-displaytitle": "<strong>Упозорење:</strong> наслов за приказ „$2“ замениће постојећи „$1“.",
        "version": "Верзија",
        "version-extensions": "Инсталирана проширења",
        "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-delete_redir": "$1 је {{GENDER:$2|обрисао|обрисала}} преусмерење $3 преписивањем",
+       "logentry-delete-restore": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 измена|$1 измене|$1 измена}}",
+       "restore-count-files": "{{PLURAL:$1|1 датотека|$1 датотеке|$1 датотека}}",
        "logentry-delete-event": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја}} у дневнику $3: $4",
        "logentry-delete-revision": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=једне измене|$5 измене|$5 измена}} на страници $3: $4",
        "logentry-delete-event-legacy": "$1 је {{GENDER:$2|променио|променила}} видљивост догађаја у дневнику $3",
        "logentry-rights-rights": "$1 је {{GENDER:$2|променио|променила}} чланство групе за {{GENDER:$6|$3}} из $4 у $5",
        "logentry-rights-rights-legacy": "$1 је {{GENDER:$2|променио|променила}} чланство групе за $3",
        "logentry-rights-autopromote": "$1 је аутоматски {{GENDER:$2|унапређен|унапређена}} из $4 у $5",
-       "logentry-upload-upload": "$1 Ñ\98е {{GENDER:$2|поÑ\81лао|поÑ\81лала}} $3",
-       "logentry-upload-overwrite": "$1 Ñ\98е {{GENDER:$2|поÑ\81лао|поÑ\81лала}} нову верзију $3",
-       "logentry-upload-revert": "$1 Ñ\98е {{GENDER:$2|поÑ\81лао|поÑ\81лала}} $3",
+       "logentry-upload-upload": "$1 Ñ\98е {{GENDER:$2|оÑ\82пÑ\80емио|оÑ\82пÑ\80емила}} $3",
+       "logentry-upload-overwrite": "$1 Ñ\98е {{GENDER:$2|оÑ\82пÑ\80емио|оÑ\82пÑ\80емила}} нову верзију $3",
+       "logentry-upload-revert": "$1 Ñ\98е {{GENDER:$2|оÑ\82пÑ\80емио|оÑ\82пÑ\80емила}} $3",
        "log-name-managetags": "Дневник уређивања ознака",
        "log-description-managetags": "Овај дневник садржи списак измена у вези [[Special:Tags|ознака]]. Дневник садржи само радње извршене од стране администратора, уноси за ознаке направљене или обрисане од стране вики софтвера се не налазе у овом дневнику.",
        "logentry-managetags-create": "$1 је {{GENDER:$2|направио|направила}} ознаку „$4“",
        "log-name-tag": "Дневник ознака",
        "log-description-tag": "Овај дневник приказује додавање/уклањање [[Special:Tags|ознака]] на појединачне измене или уносе у дневницима. Овај дневник не приказује означавање када су она део уређивања, брисања или неке друге радње.",
        "rightsnone": "(нема)",
-       "revdelete-summary": "опис измене",
+       "rightslogentry-temporary-group": "$1 (привремено, до $2)",
        "feedback-adding": "Додајем повратну информацију на страницу…",
        "feedback-back": "Назад",
        "feedback-bugcheck": "Одлично! Проверите да ли је грешка [$1 позната од пре].",
        "duration-centuries": "$1 {{PLURAL:$1|век|века|векова}}",
        "duration-millennia": "$1 {{PLURAL:$1|миленијум|миленијума|миленијума}}",
        "rotate-comment": "Слика је ротирана за $1° у смеру казаљке на сату",
+       "limitreport-title": "Подаци профилисања анализатора:",
+       "limitreport-cputime": "Време коришћења CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунд|секунди}}",
        "limitreport-walltime": "Коришћење у реалном времену",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунди}}",
+       "limitreport-ppvisitednodes": "Број предпроцесираних посећених нодова",
+       "limitreport-ppgeneratednodes": "Број предпроцесираних генерисаних нодова",
+       "limitreport-postexpandincludesize": "Укључена величина након проширења",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
+       "limitreport-templateargumentsize": "Величина аргумената шаблона",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
+       "limitreport-expansiondepth": "Највећа дубина проширења",
+       "limitreport-expensivefunctioncount": "Број „скупих” функција анализатора",
        "expandtemplates": "Замена шаблона",
        "expand_templates_intro": "Ова посебна страница узима текст и мења све шаблоне у њему рекурзивно.\nТакође мења функције парсера као што је <code><nowiki>{{</nowiki>#language:…}}</code> и променљиве као што је <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nЗаправо практично све што се налази између витичастих заграда.",
        "expand_templates_title": "Назив контекста; за {{СТРАНИЦА}} итд.:",
        "json-error-syntax": "Грешка у синтакси",
        "headline-anchor-title": "Веза до овог одељка",
        "special-characters-group-latin": "Латиница",
-       "special-characters-group-latinextended": "проширена латиница",
+       "special-characters-group-latinextended": "Ð\9fроширена латиница",
        "special-characters-group-ipa": "ИПА",
-       "special-characters-group-symbols": "симболи",
-       "special-characters-group-greek": "грчки",
-       "special-characters-group-cyrillic": "ћирилица",
-       "special-characters-group-arabic": "арапски",
-       "special-characters-group-arabicextended": "проширени арапски",
+       "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-telugu": "телугу",
-       "special-characters-group-sinhala": "синхалски",
-       "special-characters-group-gujarati": "гуџарати",
-       "special-characters-group-devanagari": "деванагари",
-       "special-characters-group-thai": "тајландски",
-       "special-characters-group-lao": "лаоски",
-       "special-characters-group-khmer": "кмерски",
+       "special-characters-group-hebrew": "Хебрејски",
+       "special-characters-group-bangla": "Бенгалски",
+       "special-characters-group-tamil": "Тамилски",
+       "special-characters-group-telugu": "Телугу",
+       "special-characters-group-sinhala": "Синхалски",
+       "special-characters-group-gujarati": "Гуџарати",
+       "special-characters-group-devanagari": "Деванагари",
+       "special-characters-group-thai": "Тајландски",
+       "special-characters-group-lao": "Лаоски",
+       "special-characters-group-khmer": "Кмерски",
+       "special-characters-group-canadianaboriginal": "Канадски абориџински",
        "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",
+       "date-range-from": "Од датума:",
+       "date-range-to": "До датума:",
        "randomrootpage": "Случајна коренска страница",
        "log-action-filter-block": "Тип блокирања:",
        "log-action-filter-contentmodel": "Тип промене модела садржаја:",
        "log-action-filter-protect": "Тип закључавања:",
        "log-action-filter-rights": "Тип промене корисничких права:",
        "log-action-filter-upload": "Тип отпремања:",
-       "log-action-filter-all": "све",
+       "log-action-filter-all": "Све",
        "log-action-filter-block-block": "блокирање",
        "log-action-filter-block-reblock": "измена блокирања",
        "log-action-filter-block-unblock": "деблокирање",
        "log-action-filter-managetags-activate": "активирање ознаке",
        "log-action-filter-managetags-deactivate": "деактивирање ознаке",
        "log-action-filter-move-move": "премештање без преснимавања преусмерења",
-       "log-action-filter-move-move_redir": "пÑ\80емеÑ\88Ñ\82аÑ\9aе Ñ\81а Ð¿Ñ\80еÑ\81нимавањем преусмерења",
+       "log-action-filter-move-move_redir": "Ð\9fÑ\80емеÑ\88Ñ\82аÑ\9aе Ñ\81а Ð¿Ñ\80епиÑ\81ивањем преусмерења",
        "log-action-filter-newusers-create": "отворио анониман корисник",
        "log-action-filter-newusers-create2": "отворио регистрован корисник",
        "log-action-filter-newusers-autocreate": "аутоматски отворен",
        "log-action-filter-protect-protect": "закључавање",
        "log-action-filter-protect-modify": "измена закључавања",
        "log-action-filter-protect-unprotect": "уклањање закључавања",
-       "log-action-filter-protect-move_prot": "премештање заштите",
+       "log-action-filter-protect-move_prot": "Ð\9fремештање заштите",
        "log-action-filter-rights-rights": "ручно",
        "log-action-filter-rights-autopromote": "аутоматски",
        "log-action-filter-upload-upload": "Ново отпремање",
        "authprovider-resetpass-skip-label": "Прескочи",
        "changecredentials": "Промјена акредитива",
        "changecredentials-submit": "Промени",
+       "removecredentials": "Уклањање акредитива",
        "credentialsform-provider": "Врста акредитива:",
-       "credentialsform-account": "Назив налога:"
+       "credentialsform-account": "Назив налога:",
+       "rawhtml-notallowed": "&lt;html&gt; тагови не могу да се користе ван нормалних страница.",
+       "gotointerwiki": "Напуштам пројекат {{SITENAME}}",
+       "gotointerwiki-invalid": "Одабрани наслов је невалидан.",
+       "gotointerwiki-external": "Управо ћете да напустите пројекат {{SITENAME}} да бисте на засебном веб-сајту посетили [[$2]].\n\n'''[$1 Продужи на $1]'''",
+       "undelete-cantedit": "Не можете повратити ову страницу јер немате дозволу да је уређујете.",
+       "undelete-cantcreate": "Не можете повратити ову страницу јер нема постојеће странице са овим именом и немате дозволу да направите ову страницу."
 }
index 45a83ca..7c7000c 100644 (file)
                        "Macofe",
                        "Сербијана",
                        "Xð",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Mega Aleksandar",
+                       "Asmen",
+                       "Obsuser",
+                       "Zoranzoki21"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
@@ -40,6 +44,7 @@
        "tog-watchdefault": "Dodaj stranice i datoteke koje izmenim u spisak nadgledanja",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premestim u spisak nadgledanja",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje obrišem u spisak nadgledanja",
+       "tog-watchuploads": "Dodaj datoteke koje otpremim u spisak nadgledanja",
        "tog-watchrollback": "Dodaj stranice na kojima sam vratio izmene u spisak nadgledanja",
        "tog-minordefault": "Označavaj sve izmene kao manje",
        "tog-previewontop": "Prikaži pregled pre okvira za uređivanje",
@@ -49,9 +54,9 @@
        "tog-enotifminoredits": "Pošalji mi imejl i za manje izmene u stranicama i datotekama",
        "tog-enotifrevealaddr": "Prikaži moju imejl adresu u porukama obaveštenja",
        "tog-shownumberswatching": "Prikaži broj korisnika koji nadgledaju",
-       "tog-oldsig": "Tekući potpis:",
+       "tog-oldsig": "Potpis:",
        "tog-fancysig": "Smatraj potpis kao vikitekst (bez samopovezivanja)",
-       "tog-uselivepreview": "Koristi trenutan pregled",
+       "tog-uselivepreview": "Koristi trenutni pregled",
        "tog-forceeditsummary": "Upozori me kada ne unesem opis izmene",
        "tog-watchlisthideown": "Sakrij moje izmene sa spiska nadgledanja",
        "tog-watchlisthidebots": "Sakrij izmene botova sa spiska nadgledanja",
@@ -64,9 +69,9 @@
        "tog-ccmeonemails": "Pošalji mi kopije imejlova koje pošaljem drugim korisnicima",
        "tog-diffonly": "Ne prikazuj sadržaj stranice ispod razlika",
        "tog-showhiddencats": "Prikaži skrivene kategorije",
-       "tog-norollbackdiff": "Izostavi razliku nakon izvršenog vraćanja",
+       "tog-norollbackdiff": "Ne prikazuj razliku nakon izvršenog vraćanja",
        "tog-useeditwarning": "Upozori me kada napuštam stranicu sa nesačuvanim promenama",
-       "tog-prefershttps": "Uvek koristi sigurnu konekciju kada sam prijavljen.",
+       "tog-prefershttps": "Uvek koristi bezbednu konekciju dok sam prijavljen.",
        "underline-always": "uvek podvlači",
        "underline-never": "nikad ne podvlači",
        "underline-default": "prema temi ili pregledaču",
        "october-date": "$1. oktobar",
        "november-date": "$1. novembar",
        "december-date": "$1. decembar",
+       "period-am": "prepodne",
+       "period-pm": "popodne",
        "pagecategories": "{{PLURAL:$1|Kategorija|Kategorije}}",
        "category_header": "Stranice u kategoriji „$1“",
        "subcategories": "Potkategorije",
        "category-media-header": "Datoteke u kategoriji „$1“",
-       "category-empty": "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ova kategorija trenutno ne sadrži stranice ili datoteke.''</div>",
+       "category-empty": "<em>Ova kategorija trenutno ne sadrži stranice ili datoteke.</em>",
        "hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
        "hidden-category-category": "Skrivene kategorije",
        "category-subcat-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sledeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|1=sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}, od ukupno $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|1=Sledeća datoteka je|Sledeće $1 datoteke su|Sledećih $1 datoteka je}} u ovoj kategoriji.",
        "listingcontinuesabbrev": "nast.",
        "index-category": "Popisane stranice",
-       "noindex-category": "Nepopisane stranice",
+       "noindex-category": "Neindeksirane stranice",
        "broken-file-category": "Stranice s neispravnim vezama do datoteka",
        "about": "O nama",
        "article": "Stranica sa sadržajem",
        "newwindow": "(otvara se u novom prozoru)",
        "cancel": "Otkaži",
        "moredotdotdot": "Više…",
-       "morenotlisted": "Ova lista nije kompletna.",
+       "morenotlisted": "Ova lista je možda nepotpuna",
        "mypage": "Stranica",
        "mytalk": "Razgovor",
        "anontalk": "Razgovor",
        "qbedit": "Uredi",
        "qbpageoptions": "Ova stranica",
        "qbmyoptions": "Moje stranice",
-       "faq": "NPP",
+       "faq": "ČPP",
        "faqpage": "Project:NPP",
        "actions": "Radnje",
        "namespaces": "Imenski prostori",
        "tagline": "Izvor: {{SITENAME}}",
        "help": "Pomoć",
        "search": "Pretraga",
+       "search-ignored-headings": "#<!-- ovu liniju ostavite kakva jeste --> <pre>\n# Naslovi koji će biti ignorisani upitom\n# Promene su vidljive odmah nakon što stranica sa naslovom bude popisana\n# Možete iznuditi ponovno popisivanje sa \"null\" promenom\n# Sintaksa je sledeća:\n# * Svaka vrsta koja započinje \"#\" znakom pa sve do kraja je komentar\n# * Svaka ne prazna vrsta je tačan naslov za zanemariti, u tačnom obliku\nReference\nSpoljašnje veze\nPogledajte\n#</pre> <!-- ovu liniju ostavite kakva jeste -->",
        "searchbutton": "Pretraži",
        "go": "Idi",
        "searcharticle": "Idi",
        "history": "Istorija stranice",
        "history_short": "Istorija",
+       "history_small": "istorija",
        "updatedmarker": "ažurirano od moje poslednje posete",
        "printableversion": "Za štampanje",
        "permalink": "Trajna veza",
        "print": "Štampaj",
        "view": "Pogledaj",
-       "view-foreign": "Vidi na $1",
+       "view-foreign": "Vidi na projektu $1",
        "edit": "Uredi",
        "edit-local": "Uredi lokalni opis",
        "create": "Napravi",
        "talk": "Razgovor",
        "views": "Pregledi",
        "toolbox": "Alatke",
+       "tool-link-userrights": "Promeni {{GENDER:$1|korisnik}} grupe",
+       "tool-link-userrights-readonly": "Prikaži {{GENDER:$1|korisnik}} grupe",
+       "tool-link-emailuser": "Pošalji imejl",
        "userpage": "Pogledaj korisničku stranicu",
        "projectpage": "Pogledaj stranicu projekta",
        "imagepage": "Pogledaj stranicu datoteke",
        "redirectedfrom": "(preusmereno sa $1)",
        "redirectpagesub": "Preusmerenje",
        "redirectto": "Preusmerava na:",
-       "lastmodifiedat": "Ova stranica je poslednji put izmenjena $1 u $2.",
+       "lastmodifiedat": "Ova stranica je poslednji put uređena na datum $1 u $2 č.",
        "viewcount": "Ova stranica je pregledana {{PLURAL:$1|jedanput|$1 puta|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "jumpto": "Idi na:",
        "pool-timeout": "Istek vremena čeka na zaključavanje",
        "pool-queuefull": "Red je pun zahteva",
        "pool-errorunknown": "Nepoznata greška",
+       "pool-servererror": "Brojač fonda trenutno nije dostupan ($1)",
+       "poolcounter-usage-error": "Greška tokom upotrebe: $1",
        "aboutsite": "O projektu {{SITENAME}}",
        "aboutpage": "Project:O nama",
        "copyright": "Sadržaj je dostupan pod licencom $1 osim ako je drugačije navedeno.",
        "versionrequired": "Potrebno je izdanje $1 Medijavikija",
        "versionrequiredtext": "Potrebno je izdanje $1 Medijavikija da biste koristili ovu stranicu.\nPogledajte stranicu za [[Special:Version|izdanje]].",
        "ok": "U redu",
-       "pagetitle": "$1 â\80\93 {{SITENAME}}",
+       "pagetitle": "$1 â\80\94 {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "Preuzeto iz „$1“",
        "toc": "Sadržaj",
        "showtoc": "prikaži",
        "hidetoc": "sakrij",
-       "collapsible-collapse": "skupi",
-       "collapsible-expand": "proširi",
+       "collapsible-collapse": "Skupi",
+       "collapsible-expand": "Proširi",
        "confirmable-confirm": "Da li {{GENDER:$1|ste}} sigurni?",
        "confirmable-yes": "Da",
        "confirmable-no": "Ne",
        "databaseerror-query": "Upit: $1",
        "databaseerror-function": "Funkcija: $1",
        "databaseerror-error": "Greška: $1",
+       "transaction-duration-limit-exceeded": "Zbog izbegavanja velikih kopirajućih zaostajanja, ova transakcija je prekinuta zbog toga što je trajanje zapisivanja ($1) premašilo ($2) sekundi ograničenja. \nUkoliko menjate puno artikala odjednom, pokušajte sa više manjih operacija.",
        "laggedslavemode": "<strong>Upozorenje:</strong> stranica je možda zastarela.",
        "readonly": "Baza podataka je zaključana",
        "enterlockreason": "Unesite razlog za zaključavanje, uključujući i vreme otključavanja",
        "readonly_lag": "Baza podataka je automatski zaključana da bi se sekundarni serveri baze podataka uskladili s glavnim.",
        "internalerror": "Unutrašnja greška",
        "internalerror_info": "Unutrašnja greška: $1",
+       "internalerror-fatal-exception": "Kritični izuzetak tipa $1",
        "filecopyerror": "Ne mogu da umnožim datoteku „$1“ u „$2“.",
        "filerenameerror": "Ne mogu da preimenujem datoteku „$1“ u „$2“.",
        "filedeleteerror": "Ne mogu da obrišem datoteku „$1“.",
        "cannotdelete": "Ne mogu da obrišem stranicu ili datoteku „$1“.\nVerovatno ju je neko drugi obrisao.",
        "cannotdelete-title": "Ne mogu da obrišem stranicu „$1“",
        "delete-hook-aborted": "Brisanje je prekinula kuka.\nNije dato nikakvo obrazloženje.",
+       "no-null-revision": "Nije moguće napraviti \"null\" reviziju za stranicu $1",
        "badtitle": "Neispravan naslov",
        "badtitletext": "Naslov stranice je neispravan, prazan ili je međujezički ili međuviki naslov pogrešno povezan.\nMožda sadrži znakove koji se ne mogu koristiti u naslovima.",
+       "title-invalid-empty": "Zatraženi naslov strane je prazan ili sadrži samo razmak.",
+       "title-invalid-utf8": "Zatraženi naslov stranice sadrži nevažeći UTF-8 niz.",
+       "title-invalid-interwiki": "Zatraženi naslov stranice sadrži \"interwiki\" vezu koja ne može biti upotrebljenja za naslove.",
+       "title-invalid-talk-namespace": "Zatraženi naslov strane se odnosi na stranicu za razgovor koja ne može da postoji.",
        "title-invalid-characters": "Traženi naslov ima nevažeće karaktere: „$1“.",
-       "perfcached": "Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.",
-       "perfcachedts": "Sledeći podaci su keširani i poslednji put su ažurirani $2 u $3. U kešu {{PLURAL:$4|1=je dostupan najviše jedan rezultat|su dostupna najviše $4 rezultata|je dostupno najviše $4 rezultata}}.",
+       "title-invalid-relative": "Naslov ima relativan put. Relativni naslovi (./, ../) su nevažeći, zato što će često biti nedostupni kroz korisnički pretraživač.",
+       "title-invalid-magic-tilde": "Naslov stranice koju ste tražili je nevažeći jer sadrži magični niz tildi (<nowiki>~~~</nowiki>)",
+       "title-invalid-too-long": "Naslov stranice koju ste tražili je predugačak. Ne sme da bude duži od $1 {{PLURAL:$1|bajt|bajtovi}} u UTF-8 znacima.",
+       "title-invalid-leading-colon": "Naslov stranice koju ste tražili sadrži dvotačku na početku.",
+       "perfcached": "Sledeći podaci su keširani i možda nisu ažurirani. U kešu {{PLURAL:$1|je dostupan najviše jedan rezultat|su dostupna najviše $1 rezultata|je dostupno najviše $1 rezultata}}.",
+       "perfcachedts": "Sledeći podaci su keširani i poslednji put ažurirani na datum $2 u $3 č. U kešu {{PLURAL:$4|je dostupan najviše jedan rezultat|su dostupna najviše $4 rezultata|je dostupno najviše $4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je trenutno onemogućeno.\nPodaci koji se ovde nalaze mogu biti zastareli.",
        "viewsource": "Izvorni kod",
        "viewsource-title": "Izvorni tekst stranice $1",
        "actionthrottled": "Radnja je usporena",
-       "actionthrottledtext": "U cilju borbe protiv nepoželjnih poruka, ograničene su vam izmene u određenom vremenu, a upravo ste prešli to ograničenje. Pokušajte ponovo za nekoliko minuta.",
+       "actionthrottledtext": "Kao meru protiv zloupotrebe, ograničeno vam je izvođenje ove radnje previše puta u kratkom vremenskom periodu, a vi ste premašili ovo ograničenje.\nMolimo pokušajte ponovo za nekoliko minuta.",
        "protectedpagetext": "Ova stranica je zaključana za izmene i druge radnje.",
        "viewsourcetext": "Možete čitati i kopirati sadržaj ove stranice.",
        "viewyourtext": "Možete da pogledate i kopirate izvorni tekst <strong>vaših izmena</strong> na ovoj stranici.",
        "externaldberror": "Došlo je do greške pri prepoznavanju baze podataka ili nemate ovlašćenja da ažurirate svoj spoljni nalog.",
        "login": "Prijavi me",
        "nav-login-createaccount": "Prijava/registracija",
-       "userlogin": "Prijava/registracija",
-       "userloginnocreate": "Prijava",
        "logout": "Odjava",
        "userlogout": "Odjava",
        "notloggedin": "Niste prijavljeni",
        "userlogin-noaccount": "Nemate nalog?",
        "userlogin-joinproject": "Otvorite ga",
-       "nologin": "Nemate nalog? Idite na stranicu $1.",
-       "nologinlink": "Otvaranje naloga",
        "createaccount": "Otvori nalog",
-       "gotaccount": "Već imate nalog? Idite na stranicu „$1“.",
-       "gotaccountlink": "Prijava",
-       "userlogin-resetlink": "Zaboravili ste podatke za prijavu?",
        "userlogin-resetpassword-link": "Zaboravili ste lozinku?",
        "userlogin-helplink2": "Pomoć pri prijavljivanju",
        "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
        "createacct-another-email-ph": "Unesite imejl adresu",
        "createaccountmail": "Koristite privremenu, slučajno stvorenu lozinku i pošaljite na navedenu adresu elektronske pošte",
        "createacct-realname": "Pravo ime (opciono)",
-       "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto pravite još jedan nalog?",
        "createacct-submit": "Otvori nalog",
        "createacct-another-submit": "Otvori nalog",
-       "createacct-benefit-heading": "{{SITENAME}} je napravljen od strane ljudi kao što ste vi.",
+       "createacct-benefit-heading": "{{SITENAME}} je projekat koji stvaraju ljudi poput Vas.",
        "createacct-benefit-body1": "{{PLURAL:$1|izmena|izmene}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice}}",
        "createacct-benefit-body3": "{{PLURAL:$1|aktivni korisnik|aktivnih korisnika}}",
        "hr_tip": "Vodoravna linija (koristiti retko)",
        "summary": "Opis izmene:",
        "subject": "Tema:",
-       "minoredit": "manja izmena",
-       "watchthis": "nadgledaj ovu stranicu",
+       "minoredit": "Ovo je manja izmena",
+       "watchthis": "Nadgledaj ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
        "savechanges": "Sačuvaj izmene",
        "publishpage": "Objavi stranicu",
        "preview": "Pretpregled",
        "showpreview": "Prikaži pretpregled",
        "showdiff": "Prikaži izmene",
-       "blankarticle": "<strong>Upozorenje:</strong> stranica koju pravite nema nikakav sadržaj.\nAko još jednom pritisnete „{{int:savearticle}}“ napravićete praznu stranicu.",
-       "anoneditwarning": "<strong>Upozorenje:</strong> niste prijavljeni. Vaša IP adresa će biti javno vidljiva u istoriji ove stranice ako načinite bilo kakvu izmenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 otvorite nalog]</strong> vaše izmene će biti pripisane vašem korisničkom imenu.",
-       "anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabeležena u istoriji ove stranice.''",
-       "missingsummary": "'''Napomena:''' niste uneli opis izmene.\nAko ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvana bez opisa.",
-       "selfredirect": "<strong>Upozorenje:</strong> preusmeravate ovu stranicu na nju samu.\nMožda vam je odredišna stranica pogrešna ili uređujete pogrešnu stranicu.\nAko još jednom pritisnete „{{int:savearticle}}“ preusmerenje će svejedno biti napravljeno.",
+       "blankarticle": "<strong>Upozorenje:</strong> Stranica koju pravite je prazna.\nAko još jednom pritisnete „$1”, stranica će biti napravljena bez ikakvog sadržaja.",
+       "anoneditwarning": "<strong>Upozorenje:</strong> Niste prijavljeni. Ako objavite stranicu, Vaša IP adresa će biti javno vidljiva u njenoj istoriji izmena i drugde. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 otvorite nalog]</strong>, pored ostalih pogodnosti koje dobijate Vaše izmene će biti pripisivane Vašem korisničkom imenu.",
+       "anonpreviewwarning": "<em>Niste prijavljeni. Ako objavite stranicu, Vaša IP adresa će biti javno vidljiva u njenoj istoriji izmena i drugde.</em>",
+       "missingsummary": "'''Podsetnik:''' Niste uneli opis izmene.\nAko ponovo kliknete na „$1”, Vaša izmena će biti sačuvana bez opisa.",
+       "selfredirect": "<strong>Upozorenje:</strong> Preusmeravate ovu stranicu na nju samu.\nMožda vam je odredišna stranica za preusmerenje pogrešna ili uređujete pogrešnu stranicu.\nAko još jednom pritisnete „$1”, preusmerenje će svejedno biti napravljeno.",
        "missingcommenttext": "Unesite komentar ispod.",
-       "missingcommentheader": "<strong>Napomena:</strong> niste uneli naslov ovog komentara.\nAko ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvana bez naslova.",
+       "missingcommentheader": "<strong>Napomena:</strong> Niste uneli naslov teme ovog komentara.\nAko ponovo kliknete na „$1”, izmena će biti sačuvana bez naslova.",
        "summary-preview": "Pregled opisa:",
        "subject-preview": "Pregled tema:",
        "blockedtitle": "Korisnik je blokiran",
        "userinvalidcssjstitle": "<strong>Upozorenje:</strong> ne postoji tema „$1“.\nPrilagođene stranice CSS i javaskript počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
        "updated": "(Ažurirano)",
        "note": "<strong>Napomena:</strong>",
-       "previewnote": "<strong>Ovo je pretpregled.</strong>\nVaše izmene još nisu sačuvane!",
+       "previewnote": "<strong>Ne zaboravite da je ovo samo pretpregled.</strong>\nVaše izmene još nisu sačuvane!",
        "continue-editing": "Idi na uređivački okvir",
        "previewconflict": "Ovaj pregled oslikava kako će tekst u tekstualnom okviru izgledati.",
-       "session_fail_preview": "'''Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.'''\nPokušajte ponovo.\nAko i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite.",
+       "session_fail_preview": "Izvinjavamo se! Nismo mogli da obradimo Vašu izmenu zbog gubitka podataka sesije.\n\nMožda ste odjavljeni. <strong>Proverite da li ste prijavljen i pokušajte ponovo</strong>.\nAko i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite i proverite da li su na Vašem pretraživaču dozvoljeni kolačići sa ovog sajta.",
        "session_fail_preview_html": "'''Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.'''\n\n''Budući da je na ovom vikiju omogućen unos HTML oznaka, pregled je sakriven kao mera predostrožnosti protiv napada preko javaskripta.''\n\n'''Ako ste pokušali da napravite pravu izmenu, pokušajte ponovo.\nAko i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite.'''",
        "token_suffix_mismatch": "'''Vaša izmena je odbačena jer je vaš pregledač ubacio znakove interpunkcije u novčić uređivanja.\nTo se ponekad događa kada se koristi neispravan posrednik.'''",
        "edit_form_incomplete": "<strong>Neki delovi obrasca za uređivanje nisu stigli do servera. Proverite da li su vaše izmene nepromenjene i pokušajte ponovo.</strong>",
        "editingsection": "Uređujete $1 (odeljak)",
        "editingcomment": "Uređujete $1 (novi odeljak)",
        "editconflict": "Sukobljene izmene: $1",
-       "explainconflict": "Neko drugi je u međuvremenu promenio ovu stranicu.\nGornji okvir sadrži sadašnji tekst stranice.\nVaše izmene su prikazane u donjem polju.\nMoraćete da unesete svoje promene u sadašnji tekst stranice.\n<strong>Samo</strong> će tekst u gornjem tekstualnom okviru biti sačuvan kada kliknete na „{{int:savearticle}}“.",
+       "explainconflict": "Neko drugi je u međuvremenu promenio ovu stranicu.\nGornji okvir sadrži sadašnji tekst stranice.\nVaše izmene su prikazane u donjem okviru.\nMoraćete da unesete svoje promene u sadašnji tekst stranice.\n<strong>Samo</strong> će tekst u gornjem okviru za uređivanje biti sačuvan kada kliknete na „$1”.",
        "yourtext": "Vaš tekst",
        "storedversion": "Uskladištena izmena",
        "nonunicodebrowser": "'''Upozorenje: vaš pregledač ne podržava unikod.'''\nPromenite ga pre nego što počnete s uređivanjem.",
        "longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
        "readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nSistemski administrator je naveo sledeće objašnjenje: $1",
        "protectedpagewarning": "<strong>Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.</strong>\nPoslednji zapis u dnevniku je prikazan ispod:",
-       "semiprotectedpagewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.\nPoslednji zapis u dnevniku je prikazan ispod:",
-       "cascadeprotectedwarning": "<strong>Upozorenje:</strong> ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:$1|sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:",
+       "semiprotectedpagewarning": "<strong>Napomena:</strong> Ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.\nPoslednji zapis u dnevniku prikazan je ispod kao referenca:",
+       "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaštićena tako da je mogu uređivati samo korisnici sa [[Special:ListGroupRights|određenim pravima]] (administratori), jer je ista uključena u {{PLURAL:$1|sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom” zaštitom:",
        "titleprotectedwarning": "<strong>Upozorenje: ovu stranicu mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].</strong>\nIspod su navedeni poslednji zapisi u dnevniku:",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} u ovom pregledu:",
        "page_first": "prva",
        "page_last": "poslednja",
        "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: <strong>({{int:cur}})</strong> = razlika s trenutnom izmenom, <strong>({{int:last}})</strong> = razlika s prethodnom izmenom, <strong>{{int:minoreditletter}}</strong> = mala izmena",
-       "history-fieldset-title": "Pregled istorije",
+       "history-fieldset-title": "Pregled izmena",
        "history-show-deleted": "Samo obrisane",
        "histfirst": "najstarije",
        "histlast": "najnovije",
        "difference-multipage": "(razlike između stranica)",
        "lineno": "Red $1:",
        "compareselectedversions": "Uporedi izabrane izmene",
-       "showhideselectedversions": "Prikaži/sakrij izabrane izmene",
+       "showhideselectedversions": "Promeni vidljivost izabranih izmena",
        "editundo": "poništi",
        "diff-empty": "(Nema razlike)",
        "diff-multi-sameuser": "({{PLURAL:$1|Jedna međuizmena istog korisnika nije prikazana|$1 međuizmene istog korisnika nije prikazano|$1 međuizmena istog korisnika nije prikazano}})",
        "nextn-title": "$1 {{PLURAL:$1|sledeći rezultat|sledeća rezultata|sledećih rezultata}}",
        "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata|rezultata}} po stranici",
        "viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "<strong>Postoji i stranica pod nazivom „[[:$1]]“.</strong> {{PLURAL:$2|0=|Vidi takođe rezultate pretrage.}}",
-       "searchmenu-new": "<strong>Napravite stranicu â\80\9e[[:$1]]â\80\9c!</strong> {{PLURAL:$2|0=|Vidi takoÄ\91e rezultate pretrage.}}",
+       "searchmenu-exists": "<strong>Postoji stranica pod nazivom „[[:$1]]”!</strong> {{PLURAL:$2|0=|Takođe pogledajte druge pronađene rezultate pretrage.}}",
+       "searchmenu-new": "<strong>Napravite stranicu â\80\9e[[:$1]]â\80\9d!</strong> {{PLURAL:$2|0=|TakoÄ\91e pogledajte rezultat pretrage.|TakoÄ\91e pogledajte rezultate pretrage.}}",
        "searchprofile-articles": "Članci",
        "searchprofile-images": "Datoteke",
        "searchprofile-everything": "Sve",
        "search-relatedarticle": "Povezano",
        "searchrelated": "povezano",
        "searchall": "sve",
-       "showingresults": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}} počev od broja <strong>$2</strong>.",
+       "showingresults": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, počev od broja <strong>$2</strong>.",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultata <strong>$1 – $2</strong> od <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1—$2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Nema poklapanja.",
        "powersearch-legend": "Napredna pretraga",
-       "powersearch-ns": "Traži u sledećim imenskim prostorima:",
+       "powersearch-ns": "Pretraga po imenskim prostorima:",
        "powersearch-togglelabel": "Izaberi:",
-       "powersearch-toggleall": "sve",
-       "powersearch-togglenone": "ništa",
+       "powersearch-toggleall": "Sve",
+       "powersearch-togglenone": "Ništa",
        "powersearch-remember": "Zapamti moj izbor za buduće pretrage",
        "search-external": "Spoljna pretraga",
        "searchdisabled": "Pretraga je onemogućena.\nU međuvremenu možete tražiti preko Gugla.\nUpamtite da njegovi popisi ovog vikija mogu biti zastareli.",
        "username": "{{GENDER:$1|Korisničko ime}}:",
        "prefs-memberingroups": "{{PLURAL:$1|Grupa|Grupe}}:",
        "prefs-memberingroups-type": "$1",
-       "prefs-registration": "Vreme upisa:",
+       "prefs-registration": "Vreme registracije:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Pravo ime:",
        "yourlanguage": "Jezik:",
        "right-createtalk": "pravljenje stranica za razgovor",
        "right-createaccount": "otvaranje novih korisničkih naloga",
        "right-minoredit": "označavanje izmena manjim",
-       "right-move": "premeštanje stranica",
+       "right-move": "Premeštanje stranica",
        "right-move-subpages": "premeštanje stranica s njihovim podstranicama",
        "right-move-rootuserpages": "premeštanje osnovnih korisničkih stranica",
-       "right-move-categorypages": "premeštanje kategorija",
-       "right-movefile": "premeštanje datoteka",
+       "right-move-categorypages": "Premeštanje kategorija",
+       "right-movefile": "Premeštanje datoteka",
        "right-suppressredirect": "premeštanje stranica bez ostavljanja preusmerenja",
        "right-upload": "Otpremanje datoteka",
        "right-reupload": "zamenjivanje postojećih datoteka",
        "right-editprotected": "uređivanje stranice pod zaštitom „{{int:protect-level-sysop}}“",
        "right-editsemiprotected": "uređivanje stranica pod zaštitom „{{int:protect-level-autoconfirmed}}“",
        "right-editinterface": "uređivanje korisničkog okruženja",
-       "right-editusercssjs": "uređivanje tuđih CSS i javaskript datoteka",
        "right-editusercss": "uređivanje tuđih CSS datoteka",
        "right-edituserjs": "uređivanje tuđih JavaScript datoteka",
        "right-editmyusercss": "uređivanje sopstvenih CSS datoteka",
        "recentchanges-summary": "Pratite skorašnje izmene na ovoj stranici.",
        "recentchanges-noresult": "Nema promena u zadatom vremenu za zadate kriterijume.",
        "recentchanges-feed-description": "Pratite skorašnje izmene uz pomoć ovog dovoda.",
-       "recentchanges-label-newpage": "Nova stranica",
-       "recentchanges-label-minor": "Manja izmena",
+       "recentchanges-label-newpage": "Ovom izmenom napravljena je nova izmena",
+       "recentchanges-label-minor": "Ovo je manja izmena",
        "recentchanges-label-bot": "Ovu izmenu je napravio bot",
        "recentchanges-label-unpatrolled": "Ova izmena još nije patrolirana",
        "recentchanges-label-plusminus": "Promena veličine stranice u bajtovima",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
        "recentchanges-submit": "Prikaži",
+       "rcfilters-filtergroup-registration": "Registracija korisnika",
+       "rcfilters-filter-registered-label": "Registrovani",
+       "rcfilters-filter-registered-description": "Prijavljeni urednici.",
+       "rcfilters-filter-unregistered-label": "Neregistrovani",
+       "rcfilters-filter-unregistered-description": "Urednici koji nisu prijavljeni.",
+       "rcfilters-filtergroup-authorship": "Autorstvo doprinosa",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novajlije",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Manje od 10 izmjena i 4 dana aktivnosti.",
+       "rcfilters-filter-user-experience-level-learner-label": "Učenici",
+       "rcfilters-filter-user-experience-level-learner-description": "Više dana aktivnosti i izmjena od „novajlija”, ali manje od „iskusnih korisnika”.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Iskusni korisnici",
+       "rcfilters-filter-user-experience-level-experienced-description": "Preko 30 dana aktivnosti i 500 izmjena.",
+       "rcfilters-filter-minor-label": "Manje izmjene",
+       "rcfilters-filter-pageedits-label": "Izmjene stranica",
+       "rcfilters-filter-pageedits-description": "Izmjene viki sadržaja, rasprava, opisa kategorija...",
+       "rcfilters-filter-newpages-label": "Stvaranje stranica",
+       "rcfilters-filter-newpages-description": "Izmjene kojima se stvaraju nove stranice.",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmena|su izmene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove izmene počev od $2 $3",
        "rcshowhideminor": "$1 manje izmene",
        "rcshowhidecategorization": "$1 kategorizaciju stranica",
        "rcshowhidecategorization-show": "Prikaži",
        "rcshowhidecategorization-hide": "Sakrij",
-       "rclinks": "Prikaži poslednjih $1 izmena {{PLURAL:$2|prethodni dan|u poslednja $2 dana|u poslednjih $2 dana}}<br />$3",
+       "rclinks": "Prikaži poslednjih $1 izmena {{PLURAL:$2|prethodni dan|u poslednja $2 dana|u poslednjih $2 dana}}",
        "diff": "razl",
        "hist": "ist",
        "hide": "Sakrij",
        "zip-bad": "Datoteka je oštećena ili je nečitljiva ZIP datoteka.\nBezbednosna provera ne može da se izvrši kako treba.",
        "zip-unsupported": "Datoteka je formata ZIP koji koristi mogućnosti koje ne podržava Medijaviki.\nBezbednosna provera ne može da se izvrši kako treba.",
        "uploadstash": "Tajno skladište",
-       "uploadstash-summary": "Ova stranica pruža pristup datotekama koje su poslate (ili se šalju), ali još nisu objavljene. Ove datoteke su vidljive samo korisniku koji ga je poslao.",
+       "uploadstash-summary": "Ova stranica pruža pristup datotekama koje su otpremljene ili se otpremaju, ali još nisu objavljene. Ove datoteke nisu vidljive nikome, osim korisniku koji ih je otpremio.",
        "uploadstash-clear": "Očisti sakrivene datoteke",
        "uploadstash-nofiles": "Nemate sakrivene datoteke.",
        "uploadstash-badtoken": "Izvršavanje date radnje nije uspelo. Razlog tome može biti istek vremena za uređivanje. Pokušajte ponovo.",
        "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš server nije podešen da prosleđuje ovakve podatke.\nMožda je zasnovan na CGI-ju koji ne podržava img_auth.\nPogledajte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=sr-ec.",
        "img-auth-notindir": "Zahtevana putanja nije u podešenoj fascikli za otpremanje.",
        "img-auth-badtitle": "Ne mogu da stvorim ispravan naslov za „$1“.",
-       "img-auth-nologinnWL": "Niste prijavljeni i â\80\9e$1â\80\9c nije na spisku dozvoljenih.",
+       "img-auth-nologinnWL": "Niste prijavljeni i â\80\9e$1â\80\9d nije na spisku dozvoljenih.",
        "img-auth-nofile": "Datoteka „$1“ ne postoji.",
        "img-auth-isdir": "Pokušavate da pristupite fascikli „$1“.\nDozvoljen je samo pristup datotekama.",
        "img-auth-streaming": "Učitavanje „$1“.",
        "upload-curl-error28-text": "Server ne odgovara na upit.\nProverite da li sajt radi, malo osačekajte i pokušajte ponovo.\nProbajte kasnije kada bude manje opterećenje.",
        "license": "Licenca:",
        "license-header": "Licenca:",
-       "nolicense": "nije izabrano",
+       "nolicense": "Nije izabrano",
        "licenses-edit": "Uredi izbor licenci",
        "license-nopreview": "(pregled nije dostupan)",
        "upload_source_url": "(vaša izabrana datoteka od ispravnih i javno dostupnih adresa)",
        "filehist-revert": "vrati",
        "filehist-current": "trenutno",
        "filehist-datetime": "Datum/vreme",
-       "filehist-thumb": "Minijatura",
+       "filehist-thumb": "Umanjeni prikaz",
        "filehist-thumbtext": "Umanjeni prikaz za izdanje od $1",
-       "filehist-nothumb": "Nema minijature",
+       "filehist-nothumb": "Nema umanjenog prikaza",
        "filehist-user": "Korisnik",
        "filehist-dimensions": "Dimenzije",
        "filehist-filesize": "Veličina datoteke",
        "wantedcategories": "Tražene kategorije",
        "wantedpages": "Tražene stranice",
        "wantedpages-summary": "Spisak nepostojećih stranica sa najviše veza do njih, na ovom spisku se ne nalaze stranice do kojih vode preusmerenja. Za spisak pokvarenih preusmerenja pogledajte [[{{#special:BrokenRedirects}}|spisak pokvarenih preusmerenja]].",
-       "wantedpages-badtitle": "Neispravan naslov u nizu rezultata: $1",
+       "wantedpages-badtitle": "Neispravan naslov u setu rezultata: $1",
        "wantedfiles": "Tražene datoteke",
        "wantedfiletext-cat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih riznica mogu biti navedene iako ne postoje. Takve datoteke će biti <del>poništene</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze [[:$1|ovde]].",
        "wantedfiletext-nocat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih riznica mogu biti navedene iako ne postoje. Takve datoteke će biti <del>poništene</del> sa spiska.",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane događaje",
        "log-edit-tags": "Uredi oznake izabranih unosa u dnevnicima",
        "checkbox-select": "Izaberi: $1",
-       "checkbox-all": "sve",
-       "checkbox-none": "ništa",
-       "checkbox-invert": "obrni",
+       "checkbox-all": "Sve",
+       "checkbox-none": "Ništa",
+       "checkbox-invert": "Obrni",
        "allpages": "Sve stranice",
        "nextpage": "Sledeća stranica ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "listgrouprights-namespaceprotection-header": "Ograničenja imenskih prostora",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
        "listgrouprights-namespaceprotection-restrictedto": "Prava potrebna za uređivanje",
+       "listgrants": "Dozvole",
        "listgrants-rights": "Prava",
        "trackingcategories": "Medijaviki kategorije",
        "trackingcategories-summary": "Ova posebna stranica je spisak kategorija koje su deo Medijavikija, one se automatski ažuriraju i njihovi nazivi se mogu menjati uređivanjem sistemskih poruka u imenskom prostoru {{ns:8}}.",
        "wlshowhidecategorization": "kategorizaciju stranica",
        "watchlist-options": "Postavke spiska nadgledanja",
        "watching": "Nadgledanje…",
-       "unwatching": "Prekidanje nadgledanja…",
+       "unwatching": "Uklanjanje sa spiska nadgledanja...",
        "watcherrortext": "Došlo je do greške pri promeni postavki vašeg spiska nadgledanja za „$1“.",
        "enotif_reset": "Označi sve stranice kao posećene",
        "enotif_impersonal_salutation": "{{SITENAME}} korisnik",
        "enotif_body_intro_moved": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|premestio|premestila}} je $2 dana $PAGEEDITDATE Trenutna izmena nalazi se na  $3.",
        "enotif_body_intro_restored": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|vratio|vratila}} je $2 dana $PAGEEDITDATE Trenutna izmena nalazi se na $3.",
        "enotif_body_intro_changed": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|promenio|promenila}} je $2 dana $PAGEEDITDATE Trenutna izmena nalazi se na $3.",
-       "enotif_lastvisited": "Pogledajte $1 za sve izmene od vaše poslednje posete.",
-       "enotif_lastdiff": "Pogledajte $1 da vidite ovu izmenu.",
+       "enotif_lastvisited": "Za sve izmene od vaše poslednje posete, pogledajte $1.",
+       "enotif_lastdiff": "Da vidite ovu izmenu, pogledajte $1.",
        "enotif_anon_editor": "anoniman korisnik $1",
        "enotif_body": "Poštovani $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nOpis: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt:\nmejl: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obaveštenja u slučaju daljih izmena ukoliko ne posetite ovu stranicu kada ste prijavljeni.\nMožete i da poništite postavke obaveštenja za sve stranice u vašem spisku nadgledanja.\n\nSrdačan pozdrav, {{SITENAME}}\n\n--\nDa biste promenili postavke imejl obaveštenja, posetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nDa biste promenili postavke spiska nadgledanja, posetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa biste uklonili ovu stranicu sa spiska nadgledanja, posetite\n$UNWATCHURL\n\nPodrška i dalja pomoć:\n$HELPPAGE",
        "created": "napravljena",
        "logentry-contentmodel-change": "$1 je {{GENDER:$2|promenio|promenila}} model sadržaja stranice $3 iz „$4“ u „$5“",
        "logentry-contentmodel-change-revertlink": "vrati",
        "logentry-contentmodel-change-revert": "vrati",
-       "protectlogpage": "Dnevnik zaključavanja",
+       "protectlogpage": "Dnevnik zaštite",
        "protectlogtext": "Ispod je spisak zaštićenih stranica.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više detalja.",
        "protectedarticle": "je zaštitio „[[$1]]“",
        "modifiedarticleprotection": "promenjen stepen zaštite za „[[$1]]“",
        "protect-locked-dblock": "Stepeni zaštite se ne mogu menjati jer je aktivna baza podataka zaključana.\nOvo su postavke stranice '''$1''':",
        "protect-locked-access": "Nemate ovlašćenja za menjanje stepena zaštite stranice.\nOvo su trenutne postavke stranice '''$1''':",
        "protect-cascadeon": "Ova stranica je trenutno zaštićena jer se nalazi na {{PLURAL:$1|stranici koja ima|stranicama koje imaju}} prenosivu zaštitu.\nMožete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu.",
-       "protect-default": "Dopušteno svima",
+       "protect-default": "Dopušteno svim korisnicima",
        "protect-fallback": "Dozvoljeno samo korisnicima sa dozvolom „$1“",
        "protect-level-autoconfirmed": "Dopušteno samo automatski potvrđenim korisnicima",
        "protect-level-sysop": "Dopušteno samo administratorima",
        "minimum-size": "Najmanja veličina",
        "maximum-size": "Najveća veličina:",
        "pagesize": "(bajtovi)",
-       "restriction-edit": "uređivanje",
-       "restriction-move": "premeštanje",
+       "restriction-edit": "Uređivanje",
+       "restriction-move": "Premeštanje",
        "restriction-create": "pravljenje",
        "restriction-upload": "otpremanje",
        "restriction-level-sysop": "potpuno zaštićeno",
        "undeleteviewlink": "pogledaj",
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|izmena vraćeno}} $1",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka je vraćena|datoteke su vraćene|datoteka je vraćeno}}",
-       "undeletedfiles": "{{PLURAL:$1|datoteka vraćeno}} $1",
        "cannotundelete": "Vraćanje nije uspelo:\n$1",
        "undeletedpage": "<strong>Stranica $1 je vraćena</strong>\n\nPogledajte [[Special:Log/delete|dnevnik brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
        "undelete-header": "Pogledajte [[Special:Log/delete|istorijat brisanja]] za nedavno obrisane stranice.",
        "sp-contributions-uploads": "otpremanja",
        "sp-contributions-logs": "dnevnici",
        "sp-contributions-talk": "razgovor",
-       "sp-contributions-userrights": "upravljanje korisničkim pravima",
+       "sp-contributions-userrights": "upravljanje pravima {{GENDER:$1|korisnika|korisnice|korisnika}}",
        "sp-contributions-blocked-notice": "Ovaj korisnik je trenutno blokiran. \nIspod su navedeni poslednji zapisi u dnevniku blokiranja:",
        "sp-contributions-blocked-notice-anon": "Ova IP adresa je trenutno blokirana.\nIspod su navedeni poslednji zapisi u dnevniku blokiranja:",
        "sp-contributions-search": "Pretraga doprinosa",
        "ipblocklist-no-results": "Tražena IP adresa ili korisničko ime nije blokirano.",
        "blocklink": "blokiraj",
        "unblocklink": "deblokiraj",
-       "change-blocklink": "promeni blokiranje",
+       "change-blocklink": "promeni blokadu",
        "contribslink": "doprinosi",
        "emaillink": "pošalji imejl",
        "autoblocker": "Automatski ste blokirani jer delite IP adresu s korisnikom/com [[User:$1|$1]].\nRazlog blokiranja: „$2“",
        "delete_and_move_confirm": "Da, obriši stranicu",
        "delete_and_move_reason": "Obrisano da se oslobodi mesto za premeštanje iz „[[$1]]“",
        "selfmove": "Izvorni i odredišni naslovi su istovetni;\nne mogu da premestim stranicu preko same sebe.",
-       "immobile-source-namespace": "Ne mogu da premestim stranice u imenskom prostoru „$1“",
-       "immobile-target-namespace": "Ne mogu da premestim stranice u imenskom prostoru „$1“",
+       "immobile-source-namespace": "Ne mogu premestiti stranice u imenski prostor „$1“.",
+       "immobile-target-namespace": "Ne mogu premestiti stranice u imenski prostor „$1“.",
        "immobile-target-namespace-iw": "Međuviki veza nije ispravno odredište za premeštanje stranice.",
        "immobile-source-page": "Ova stranica se ne može premestiti.",
        "immobile-target-page": "Ne mogu da premestim na željeni naslov.",
        "fix-double-redirects": "Ažurirajte sva preusmerenja koja vode do prvobitnog naslova",
        "move-leave-redirect": "Ostavi preusmerenje",
        "protectedpagemovewarning": "'''Upozorenje:''' ova stranica je zaštićena, tako da samo korisnici s administratorskim ovlašćenjima mogu da je premeste.\nZa više informacija, poslednji zapis u dnevniku izmena je prikazan ispod:",
-       "semiprotectedpagemovewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je premeste.\nZa više informacija, poslednji zapis u dnevniku izmena je prikazan ispod:",
+       "semiprotectedpagemovewarning": "<strong>Napomena:</strong> Ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je premeste.\nPoslednji zapis u dnevniku izmena prikazan je ispod kao referenca:",
        "move-over-sharedrepo": "[[:$1]] se nalazi na deljenom skladištu. Ako premestite datoteku na ovaj naslov, to će zameniti deljenu datoteku.",
        "file-exists-sharedrepo": "Navedeni naziv datoteke se već koristi u deljenom skladištu.\nIzaberite drugi naziv.",
        "export": "Izvoz stranica",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filtriraj po stanju:",
        "allmessages-filter-unmodified": "neizmenjene",
-       "allmessages-filter-all": "sve",
+       "allmessages-filter-all": "Sve",
        "allmessages-filter-modified": "izmenjene",
        "allmessages-prefix": "Filtriraj po prefiksu:",
        "allmessages-language": "Jezik:",
        "tooltip-watchlistedit-raw-submit": "Ažuriraj spisak",
        "tooltip-recreate": "Ponovo napravite stranicu iako je obrisana",
        "tooltip-upload": "Započnite otpremanje",
-       "tooltip-rollback": "Opcija „Vrati“ vraća izmene poslednjeg korisnika",
+       "tooltip-rollback": "„Vrati“ vraća izmene poslednjeg korisnika jednim klikom",
        "tooltip-undo": "Poništava ovu izmenu i otvara obrazac za uređivanje.",
        "tooltip-preferences-save": "Sačuvaj postavke",
        "tooltip-summary": "Unesite kratak opis",
+       "interlanguage-link-title": "$1 — $2",
+       "interlanguage-link-title-nonlang": "$1 — $2",
        "common.css": "/* CSS postavljen ovde će se odraziti na sve teme */",
        "print.css": "/* CSS postavljen ovde će uticati na izdanje za štampu */",
        "noscript.css": "/* CSS postavljen ovde će uticati na sve korisnike kojima je onemogućen javaskript */",
        "group-bot.js": "/* Javaskript postavljen ovde će se učitati samo za botove */",
        "group-sysop.js": "/* Javaskript postavljen ovde će se učitati samo za sistemske operatore */",
        "group-bureaucrat.js": "/* Javaskript postavljen ovde će se učitati samo za birokrate */",
-       "anonymous": "Anonimni {{PLURAL:$1|korisnik|korisnici}} na projektu {{SITENAME}}",
+       "anonymous": "Anonimni {{PLURAL:$1|korisnik|korisnici}} projekta {{SITENAME}}",
        "siteuser": "{{SITENAME}} korisnik $1",
        "anonuser": "{{SITENAME}} anoniman korisnik $1",
-       "lastmodifiedatby": "Ovu stranicu je poslednji put {{GENDER:$4|izmenio|izmenila|izmenio}} $3, $1 u $2.",
+       "lastmodifiedatby": "Ovu stranicu je poslednji put {{GENDER:$4|uredio|uredila|uredio}} $3, na datum $1 u $2 č.",
        "othercontribs": "Zasnovano na radu korisnika $1.",
        "others": "drugi",
        "siteusers": "{{PLURAL:$2|1={{GENDER:$1|korisnik|korisnica}}|korisnici}} na projektu {{SITENAME}} $1",
        "file-no-thumb-animation-gif": "'''Napomena: zbog tehničkih ograničenja, minijature GIF slika visoke rezolucije kao što je ova neće se animirati.'''",
        "newimages": "Galerija novih datoteka",
        "imagelisttext": "Ispod je spisak od '''$1''' {{PLURAL:$1|datoteke|datoteke|datoteka}} poređanih $2.",
-       "newimages-summary": "Ova posebna stranica prikazuje poslednje poslate datoteke.",
+       "newimages-summary": "Ova posebna stranica prikazuje poslednje otpremljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Naziv datoteke (ili njen deo):",
        "newimages-showbots": "Prikaži datoteke koje su poslali botovi",
        "exif-scenecapturetype": "Vrsta snimanja scena",
        "exif-gaincontrol": "Kontrola scene",
        "exif-contrast": "Kontrast",
-       "exif-saturation": "Zasićenje",
+       "exif-saturation": "Zasićenost",
        "exif-sharpness": "Oštrina",
        "exif-devicesettingdescription": "Opis postavki uređaja",
        "exif-subjectdistancerange": "Opseg udaljenosti objekta",
        "exif-contrast-1": "Meko",
        "exif-contrast-2": "Tvrdo",
        "exif-saturation-0": "Normalno",
-       "exif-saturation-1": "Nisko zasićenje",
-       "exif-saturation-2": "Visoko zasićenje",
+       "exif-saturation-1": "Niska zasićenost",
+       "exif-saturation-2": "Visoka zasićenost",
        "exif-sharpness-0": "Normalno",
        "exif-sharpness-1": "Meko",
        "exif-sharpness-2": "Tvrdo",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova su uklonjena|$1 naslova je uklonjeno}}:",
        "watchlistedit-too-many": "Ima previše stranica za prikaz ovde.",
        "watchlisttools-clear": "isprazni spisak nadgledanja",
-       "watchlisttools-view": "prikaži srodne izmene",
+       "watchlisttools-view": "Prikaži srodne izmene",
        "watchlisttools-edit": "prikaži i uredi spisak nadgledanja",
        "watchlisttools-raw": "izmeni sirov spisak nadgledanja",
        "iranian-calendar-m1": "Farvardin",
        "hebrew-calendar-m6": "Adar",
        "hebrew-calendar-m6a": "Adar I",
        "hebrew-calendar-m6b": "Adar II",
-       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m7": "Nisane",
        "hebrew-calendar-m8": "Ijar",
        "hebrew-calendar-m9": "Sivan",
        "hebrew-calendar-m10": "Tamuz",
        "hebrew-calendar-m6-gen": "Adar",
        "hebrew-calendar-m6a-gen": "Adar I",
        "hebrew-calendar-m6b-gen": "Adar II",
-       "hebrew-calendar-m7-gen": "Nisan",
+       "hebrew-calendar-m7-gen": "Nisane",
        "hebrew-calendar-m8-gen": "Ijar",
        "hebrew-calendar-m9-gen": "Sivan",
        "hebrew-calendar-m10-gen": "Tamuz",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
        "timezone-utc": "UTC",
-       "duplicate-defaultsort": "'''Upozorenje:''' podrazumevani ključ svrstavanja „$2“ menja nekadašnji ključ „$1“.",
+       "duplicate-defaultsort": "<strong>Upozorenje:</strong> Podrazumevani ključ svrstavanja „$2“ menja raniji podrazumevani ključ svrstavanja „$1“.",
        "duplicate-displaytitle": "<strong>Upozorenje:</strong> naslov za prikaz „$2“ zameniće postojeći „$1“.",
        "version": "Verzija",
        "version-extensions": "Instalirana proširenja",
        "htmlform-user-not-exists": "<strong>$1</strong> ne postoji.",
        "htmlform-user-not-valid": "<strong>$1</strong> nije ispravno korisničko ime.",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
+       "logentry-delete-delete_redir": "$1 je {{GENDER:$2|obrisao|obrisala}} preusmerenje $3 prepisivanjem",
        "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja}} u dnevniku $3: $4",
        "logentry-delete-revision": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=jedne izmene|$5 izmene|$5 izmena}} na stranici $3: $4",
        "logentry-rights-rights": "$1 je {{GENDER:$2|promenio|promenila}} članstvo grupe za {{GENDER:$6|$3}} iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promenio|promenila}} čalnstvo grupe za $3",
        "logentry-rights-autopromote": "$1 je automatski {{GENDER:$1|unapređen|unapređena}} iz $4 u $5",
-       "logentry-upload-upload": "$1 je {{GENDER:$2|poslao|poslala}} $3",
-       "logentry-upload-overwrite": "$1 je {{GENDER:$2|poslao|poslala}} novu verziju $3",
-       "logentry-upload-revert": "$1 je {{GENDER:$2|poslao|poslala}} $3",
+       "logentry-upload-upload": "$1 je {{GENDER:$2|otpremio|otpremila}} $3",
+       "logentry-upload-overwrite": "$1 je {{GENDER:$2|otpremio|otpremila}} novu verziju $3",
+       "logentry-upload-revert": "$1 je {{GENDER:$2|otpremio|otpremila}} $3",
        "log-name-managetags": "Dnevnik uređivanja oznaka",
        "log-description-managetags": "Ovaj dnevnik sadrži spisak izmena u vezi [[Special:Tags|oznaka]]. Dnevnik sadrži samo radnje izvršene od strane administratora, unosi za oznake napravljene ili obrisane od strane viki softvera se ne nalaze u ovom dnevniku.",
        "logentry-managetags-create": "$1 je {{GENDER:$2|napravio|napravila}} oznaku „$4“",
        "log-name-tag": "Dnevnik oznaka",
        "log-description-tag": "Ovaj dnevnik prikazuje dodavanje/uklanjanje [[Special:Tags|oznaka]] na pojedinačne izmene ili unose u dnevnicima. Ovaj dnevnik ne prikazuje označavanje kada su ona deo uređivanja, brisanja ili neke druge radnje.",
        "rightsnone": "(nema)",
-       "revdelete-summary": "opis izmene",
+       "rightslogentry-temporary-group": "$1 (privremeno, do $2)",
        "feedback-adding": "Dodajem povratnu informaciju na stranicu…",
        "feedback-back": "Nazad",
        "feedback-bugcheck": "Odlično! Proverite da li je greška [$1 poznata od pre].",
        "duration-centuries": "$1 {{PLURAL:$1|vek|veka|vekova}}",
        "duration-millennia": "$1 {{PLURAL:$1|milenijum|milenijuma|milenijuma}}",
        "rotate-comment": "Slika je rotirana za $1° u smeru kazaljke na satu",
+       "limitreport-title": "Podaci profilisanja analizatora:",
+       "limitreport-cputime": "Vreme korišćenja CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sekunda|sekund|sekundi}}",
+       "limitreport-walltime": "Korišćenje u realnom vremenu",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sekund|sekunde|sekundi}}",
+       "limitreport-ppvisitednodes": "Broj predprocesiranih posećenih nodova",
+       "limitreport-ppgeneratednodes": "Broj predprocesiranih generisanih nodova",
+       "limitreport-postexpandincludesize": "Uključena veličina nakon proširenja",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
+       "limitreport-templateargumentsize": "Veličina argumenata šablona",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
+       "limitreport-expansiondepth": "Najveća dubina proširenja",
+       "limitreport-expensivefunctioncount": "Broj „skupih” funkcija analizatora",
        "expandtemplates": "Zamena šablona",
        "expand_templates_intro": "Ova posebna stranica uzima tekst i menja sve šablone u njemu rekurzivno.\nTakođe menja funkcije parsera kao što je <code><nowiki>{{</nowiki>#language:…}}</code> i promenljive kao što je <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nZapravo praktično sve što se nalazi između vitičastih zagrada.",
        "expand_templates_title": "Naziv konteksta; za {{STRANICA}} itd.:",
        "json-error-syntax": "Greška u sintaksi",
        "headline-anchor-title": "Veza do ovog odeljka",
        "special-characters-group-latin": "Latinica",
-       "special-characters-group-latinextended": "proširena latinica",
+       "special-characters-group-latinextended": "Proširena latinica",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Simboli",
-       "special-characters-group-greek": "grčki",
-       "special-characters-group-cyrillic": "ćirilica",
-       "special-characters-group-arabic": "arapski",
-       "special-characters-group-arabicextended": "prošireni arapski",
+       "special-characters-group-greek": "Grčki",
+       "special-characters-group-greekextended": "Prošireni grčki",
+       "special-characters-group-cyrillic": "Ćirilica",
+       "special-characters-group-arabic": "Arapski",
+       "special-characters-group-arabicextended": "Prošireni arapski",
        "special-characters-group-persian": "persijski",
-       "special-characters-group-hebrew": "jevrejsko",
-       "special-characters-group-bangla": "Bangla",
-       "special-characters-group-tamil": "tamilski",
-       "special-characters-group-telugu": "telugu",
-       "special-characters-group-sinhala": "sinhalski",
+       "special-characters-group-hebrew": "Hebrejski",
+       "special-characters-group-bangla": "Bengalski",
+       "special-characters-group-tamil": "Tamilski",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhalski",
        "special-characters-group-gujarati": "Gudžarati",
-       "special-characters-group-devanagari": "devanagari",
-       "special-characters-group-thai": "tajlandski",
-       "special-characters-group-lao": "laoski",
-       "special-characters-group-khmer": "kmerski",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Tajlandski",
+       "special-characters-group-lao": "Laoski",
+       "special-characters-group-khmer": "Kmerski",
        "mw-widgets-dateinput-no-date": "Datum nije izabran",
        "mw-widgets-dateinput-placeholder-day": "GGGG-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "GGGG-MM",
        "mw-widgets-titleinput-description-new-page": "stranica još uvek ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmerava na $1",
        "randomrootpage": "Slučajna korenska stranica",
+       "log-action-filter-all": "Sve",
+       "log-action-filter-move-move_redir": "Premeštanje sa prepisivanjem preusmerenja",
+       "log-action-filter-protect-move_prot": "Premeštanje zaštite",
        "log-action-filter-upload-upload": "Novo otpremanje",
        "authmanager-email-label": "Imejl",
        "authmanager-email-help": "Imejl adresa",
-       "changecredentials": "Promjena akreditiva"
+       "changecredentials": "Promjena akreditiva",
+       "removecredentials": "Uklanjanje akreditiva",
+       "gotointerwiki-external": "Upravo ćete da napustite projekat {{SITENAME}} da biste na zasebnom veb-sajtu posetili [[$2]].\n\n'''[$1 Produži na $1]'''"
 }
index 6b3bcec..a7acabc 100644 (file)
        "yourdomainname": "Yu domein:",
        "login": "Psa kon",
        "nav-login-createaccount": "Psa kon / meki wan account",
-       "userlogin": "Psa kon / meki wan account",
        "logout": "Psa gwe",
        "userlogout": "Psa gwe",
        "notloggedin": "No psa kon",
-       "nologin": "No abi wan kebroikiman nen ete? '''$1'''.",
-       "nologinlink": "Meki wan account",
        "createaccount": "Meki wan account",
-       "gotaccount": "Abi wan kebroikiman nen kba? '''$1'''.",
-       "gotaccountlink": "Psa kon",
        "createaccountmail": "via e-mail",
        "badretype": "Den tu psa wortu no de srefi.",
        "userexists": "A kebroikiman nen disi de kaba.\nTeki wan tra nen.",
        "prefs-misc": "Diversi",
        "saveprefs": "Oponaki",
        "prefs-editing": "Kenki",
-       "rows": "Rei:",
-       "columns": "Kolum:",
        "searchresultshead": "Suku",
        "stub-threshold": "Dupolo fu seti <a href=\"#\" class=\"stub\">stub</a>:",
        "recentchangesdays": "Teki fu dey tu libi si ini bakaseywan kenki:",
        "rcshowhideanons": "$1 den kebroikiman sondro nen",
        "rcshowhidepatr": "$1 den kenki di kisi luku",
        "rcshowhidemine": "$1 mi kenki",
-       "rclinks": "Sori den laste $1 kenki ini den $2 laste dei<br />$3",
+       "rclinks": "Sori den laste $1 kenki ini den $2 laste dei",
        "diff": "kenki",
        "hist": "hist",
        "hide": "kibri",
index 68b29f0..c1a4c05 100644 (file)
        "externaldberror": "Äntweeder deer lait n Failer bie ju externe Authentifizierenge foar, of du duurst din extern Benutzerkonto nit aktualisierje.",
        "login": "Anmäldje",
        "nav-login-createaccount": "Anmäldje",
-       "userlogin": "Anmäldje / Benutserkonto moakje",
-       "userloginnocreate": "Anmäldje",
        "logout": "Oumäldje",
        "userlogout": "Oumäldje",
        "notloggedin": "Nit anmälded",
-       "nologin": "Du hääst neen Benutserkonto? '''$1'''.",
-       "nologinlink": "Hier laist du n Konto an.",
        "createaccount": "Benutserkonto anlääse",
-       "gotaccount": "Du hääst al n Konto? '''$1'''.",
-       "gotaccountlink": "Hier gungt dät ätter dän Login",
-       "userlogin-resetlink": "\n↓Do Anmäldedoaten ferjeeten?",
        "createaccountmail": "Uur Email",
-       "createaccountreason": "Gruund:",
        "badretype": "Do bee Paaswoude stimme nit uureen.",
        "userexists": "Dissen Benutsernoome is al ferroat. Wääl jädden n uur.",
        "loginerror": "Failer bie ju Anmäldenge",
        "passwordreset-disabled": "Dät Touräächsätten fon Paaswoude wuud in dissen Wiki deaktivierd.",
        "passwordreset-username": "Benutsernoome:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Ju E-Mail-Ättergjucht bekiekje?",
-       "passwordreset-capture-help": "Wan du disse Kaste ankjuusest, wäd ju E-Mail-Ättergjucht mäd dät temporäre Paaswoud, die wiesed, as uk dän Benutser tousoand.",
        "passwordreset-email": "E-Mail-Adresse:",
        "passwordreset-emailtitle": "Benutserkontoinformatione ap {{SITENAME}}",
        "passwordreset-emailelement": "↓Benutsernoome: \n$1\n\nTemporär Paaswoud: \n$2",
        "anonpreviewwarning": "\"Du bäst nit ounmälded. Bie dät Spiekerjen wäd dien IP-Adrässe in ju Versionsgeskichte apteekend.\"",
        "missingsummary": "'''Waiwiesenge:''' Du hääst neen Touhoopefoatenge anroat. Wan du fonnäien ap „Siede spiekerje“ klikst, wäd dien Annerenge sunner Touhoopefoatenge uurnuumen.",
        "missingcommenttext": "Reek jädden ne Touhoopefoatenge ien.",
-       "missingcommentheader": "'''OACHTENGE:''' Du hääst neen Uurskrift in dät Fäild „Beträft:“ ienroat. Wan du fonnäien ap „{{int:savearticle}}“ klikst, wäd dien Beoarbaidenge sunner Uurskrift spiekerd.",
+       "missingcommentheader": "'''OACHTENGE:''' Du hääst neen Uurskrift in dät Fäild „Beträft:“ ienroat. Wan du fonnäien ap „$1“ klikst, wäd dien Beoarbaidenge sunner Uurskrift spiekerd.",
        "summary-preview": "Foarbekiek fon ju Touhoopefoatengsriege:",
        "subject-preview": "Themoa bekiekje:",
        "blockedtitle": "Benutser is blokkierd",
        "editingsection": "Beoarbaidje fon $1 (Apsats)",
        "editingcomment": "Beoarbaidjen fon $1 (Näi Stuk)",
        "editconflict": "Beoarbaidengs-Konflikt: \"$1\"",
-       "explainconflict": "Uurswäl häd dissen Artikkel annerd, ätterdät du anfangd bäst, him tou beoarbaidjen.\nDät buppere Textfäild änthaalt dän aktuälle Artikkel.\nDät unnere Textfäild änthaalt dien Annerengen.\nFöige jädden dien Annerengen in dät buppere Textfäild ien.\n'''Bloot''' die Inhoold fon dät buppere Textfäild wäd spiekerd, wan du ap \"{{int:savearticle}}\" klikst.",
+       "explainconflict": "Uurswäl häd dissen Artikkel annerd, ätterdät du anfangd bäst, him tou beoarbaidjen.\nDät buppere Textfäild änthaalt dän aktuälle Artikkel.\nDät unnere Textfäild änthaalt dien Annerengen.\nFöige jädden dien Annerengen in dät buppere Textfäild ien.\n'''Bloot''' die Inhoold fon dät buppere Textfäild wäd spiekerd, wan du ap \"$1\" klikst.",
        "yourtext": "Dien Text",
        "storedversion": "Spiekerde Version",
        "nonunicodebrowser": "'''Oachtenge: Dien Browser kon Unicode-Teekene nit gjucht feroarbaidje. Benutse jädden n uur Browser uum Artikkele tou beoarbaidjen.'''",
        "saveprefs": "Ienstaalengen spiekerje",
        "restoreprefs": "Aal Standoard-Ienstaalengen wier häärstaale",
        "prefs-editing": "Beoarbaidje",
-       "rows": "Riegen",
-       "columns": "Spalten",
        "searchresultshead": "Säike (010)",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Kuute Artikkele</a> markierje bi (in Byte):",
        "stub-threshold-disabled": "Deaktivierd",
        "userrights-reason": "Gruund:",
        "userrights-no-interwiki": "Du hääst neen Begjuchtigenge, do Benutsergjuchte in uur Wikis tou annerjen.",
        "userrights-nodatabase": "Ju Doatenboank $1 is nit deer of nit lokoal.",
-       "userrights-nologin": "Du moast die mäd n Administrator-Benutserkonto [[Special:UserLogin|anmäldje]], uum Benutsergjuchte tou annerjen.",
-       "userrights-notallowed": "Du hääst neen Begjuchtigenge, uum Benutsergjuchte tou reeken of ientouluuken.",
        "userrights-changeable-col": "Gruppentouheeregaid, ju du annerje koast",
        "userrights-unchangeable-col": "Gruppentouheeregaid, ju du nit annerje koast",
        "group": "Gruppe:",
        "right-protect": "Siedenskutsstatus annerje",
        "right-editprotected": "Skutsede Sieden beoarbaidje (sunner Kaskadenskuts)",
        "right-editinterface": "Benutserinterface beoarbaidje",
-       "right-editusercssjs": "Beoarbaidjen fon CSS- un JS-Doatäie fon uur Benutsere",
        "right-editusercss": "Beoarbaidjen fon CSS-Doatäie fon uur Benutsere",
        "right-edituserjs": "Beoarbaidjen fon JS-Doatäie fon uur Benutsere",
        "right-rollback": "Gau räägels Traalen",
        "right-siteadmin": "Doatenboank speere un äntspeere",
        "right-override-export-depth": "Exportier Sieden touhoope mäd ferlinkede Sieden bit tou ne Djüpte fon 5",
        "right-sendemail": "E-Mails an uur Benutsere seende",
-       "right-passwordreset": "Paaswoud fon n Benutser touräächsätte ([[Special:PasswordReset|Spezioalsiede]])",
        "newuserlogpage": "Näianmäldengs-Logbouk",
        "newuserlogpagetext": "Dit is dät Logbouk fon näi anmäldede Benutsere.",
        "rightslog": "Gjuchte-Logbouk",
        "rcshowhideanons": "Anonyme Benutsere $1",
        "rcshowhidepatr": "Pröiwede Annerengen $1",
        "rcshowhidemine": "Oaine Biedraage $1",
-       "rclinks": "Wies do lääste $1 Annerengen; wies do lääste $2 Deege.<br />$3",
+       "rclinks": "Wies do lääste $1 Annerengen; wies do lääste $2 Deege.",
        "diff": "Unnerskeed",
        "hist": "Versione",
        "hide": "ferbierge",
        "undeleteviewlink": "bekiekje",
        "undeleteinvert": "Uutwoal uumekiere",
        "undeletecomment": "Gruund:",
-       "undeletedrevisions": "{{PLURAL:$1|1 Version wuude|$1 Versione wuuden}} wier häärstoald",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Version|$1 Versione}} un {{PLURAL:$2|1 Doatäi|$2 Doatäie}} wuuden wier häärstoald",
-       "undeletedfiles": "{{PLURAL:$1|1 Doatäie wuude|$1 Doatäie wuuden}} wier häärstoald",
        "cannotundelete": "Wier Moakjen failsloain; uurswäl häd ju Siede al wier moaked.",
        "undeletedpage": "'''$1''' wuude wier moaked.\n\nIn dät [[Special:Log/delete|Läsk-Logbouk]] finst du ne Uursicht fon do läskede un wier moakede Sieden.",
        "undelete-header": "Sjuch dät [[Special:Log/delete|Läsk-Logbouk]] foar knu läskede Sieden.",
        "revdelete-restricted": "Einskränkengen jäilde uk foar Administratore",
        "revdelete-unrestricted": "Ienskränkengen foar Administratore wächhoald",
        "rightsnone": "(-)",
-       "revdelete-summary": "Touhoopefoatengskommentoar",
        "searchsuggest-search": "Säik",
        "searchsuggest-containing": "Fultextsäike ätter ...",
        "expandtemplates": "Foarloagen expandierje",
index f191865..4163e03 100644 (file)
                        "Urhixidur",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Uchup19",
+                       "WikiKaruhun",
+                       "Dipusparaga"
                ]
        },
        "tog-underline": "Gurat-handapan tutumbu",
-       "tog-hideminor": "Sumputkeun éditan minor dina nu anyar robah",
+       "tog-hideminor": "Sumputkeun éditan minor dina anyar robah",
        "tog-hidepatrolled": "Sumputkeun anu geus diroris ti béréndélan nu anyar robah",
        "tog-newpageshidepatrolled": "Sumputkeun nu geus diroris tina béréndélan kaca anyar",
+       "tog-hidecategorization": "Sumputkeun pangkategorian kaca",
        "tog-extendwatchlist": "Legaan béréndélan ngarah sakabéh parobahanana kaawaskeun",
        "tog-usenewrc": "Parobahan grup dumasar kaca dina béréndélan anu anyar robah jeung awaskeuneun",
        "tog-numberheadings": "Nomeran lulugu sacara otomatis",
@@ -28,6 +32,7 @@
        "tog-watchdefault": "Tambahkeun kaca jeung berkas anu diédit ku kuring kana awaskeuneun",
        "tog-watchmoves": "Tambahkeun kaca jeung berkas anu dipindahkeun ka awaskeuneun",
        "tog-watchdeletion": "Tambahkeun kaca jeung berkas anu dihapus kana awaskeuneun",
+       "tog-watchuploads": "Tambahkeun berkas anyar nu cik kénéh ku kuring diunjal kana daptar awaskeuneun",
        "tog-watchrollback": "Tambahkeun kaca anu jujutanana kungsi dibalikkeun kana awaskeuneun",
        "tog-minordefault": "Tandaan sadaya éditan salaku minor luyu jeung ti dituna",
        "tog-previewontop": "Témbongkeun sawangan méméh kotak édit (lain sanggeusna)",
        "tog-enotifminoredits": "Béjaan ogé (ngaliwatan surélék) lamun aya parobahan leutik dina kaca jeung berkasna",
        "tog-enotifrevealaddr": "Témbongkeun alamat surélék kuring dina surat émbaran",
        "tog-shownumberswatching": "Témbongkeun jumlah nu ngawaskeun",
-       "tog-oldsig": "Paraf nu geus aya:",
-       "tog-fancysig": "Témbongkeun paraf salaku wikitext (tanpa tumbu otomatis)",
+       "tog-oldsig": "Tawisan anjeun nu nyampak:",
+       "tog-fancysig": "Témbongkeun tanda tangan salaku wikitext (tanpa tutumbu otomatis)",
        "tog-uselivepreview": "Paké pratayang langsung",
        "tog-forceeditsummary": "Mun kotak ringkesan éditan masih kosong, béjaan!",
        "tog-watchlisthideown": "Sumputkeun éditan kuring dina daptar awaskeuneun",
        "tog-watchlisthidebots": "Sumputkeun éditan bot dina daptar awaskeuneun",
        "tog-watchlisthideminor": "Sumputkeun éditan leutik dina daptar awaskeuneun",
        "tog-watchlisthideliu": "Sumputkeun éditan pamaké nu asup log tina daptar awaskeun",
+       "tog-watchlistreloadautomatically": "Muat deui awaskeuneun kalawan otomatis nalika hiji saringan dirobah (diperlukeun JavaScript)",
        "tog-watchlisthideanons": "Sumputkeun éditan pamaké anonim tina daptar awaskeun",
        "tog-watchlisthidepatrolled": "Sumputkeun éditan nu geus diroris tina béréndélan awaskeuneun",
+       "tog-watchlisthidecategorization": "Sumputkeun pangkategorian kaca",
        "tog-ccmeonemails": "Kirimkeun ogé salinan surélékna ka alamat kuring",
        "tog-diffonly": "Ulah némbongkeun eusi kaca di handapeun béda éditan",
        "tog-showhiddencats": "Témbongkeun kategori nyumput",
-       "tog-norollbackdiff": "Liwat béda sanggeus malikkeun révisi",
+       "tog-norollbackdiff": "Ulah némbongkeun bébéda sanggeus ngalakonan pamalikan",
        "tog-useeditwarning": "Béjaan kuring lamun ninggalkeun kaca édit anu parobahanana can disimpen",
-       "tog-prefershttps": "Salawasna paké sambungan aman nalika asup log",
+       "tog-prefershttps": "Teterusan paké sambungan aman nalika asup log",
        "underline-always": "Salawasna",
        "underline-never": "Ulah",
-       "underline-default": "Buhunna kulit atawa panyungsi",
-       "editfont-style": "Gaya aksara dina kotak éditan:",
-       "editfont-default": "Luyu jeung buhunna panyungsi",
-       "editfont-monospace": "Aksara monospasi",
+       "underline-default": "Kalakop atawa panyungsi bawaan",
+       "editfont-style": "Gaya tulisan komputer dina kotak éditan:",
+       "editfont-default": "Bawaan panyungsi",
+       "editfont-monospace": "Tulisan monospasi",
        "editfont-sansserif": "Aksara Sans-serif",
        "editfont-serif": "Aksara Serif",
-       "sunday": "Minggu",
+       "sunday": "Ahad",
        "monday": "Senén",
        "tuesday": "Salasa",
        "wednesday": "Rebo",
        "thursday": "Kemis",
        "friday": "Jumaah",
        "saturday": "Saptu",
-       "sun": "Ming",
+       "sun": "Min",
        "mon": "Sen",
        "tue": "Sal",
        "wed": "Reb",
        "october-date": "$1 Oktober",
        "november-date": "$1 Nopémber",
        "december-date": "$1 Désémber",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategori}}",
        "category_header": "Artikel-artikel na kategori \"$1\"",
        "subcategories": "Subkategori",
        "category-media-header": "Média dina kategori \"$1\"",
-       "category-empty": "''Kategori ieu, ayeuna teu ngabogaan artikel atawa gambar.''",
+       "category-empty": "<em>Ieu kategori kiwari teu ngandung kaca atawa média.</em>",
        "hidden-categories": "{{PLURAL:$1|Kategori nyumput|Kategori nyumput}}",
        "hidden-category-category": "Kategori nu nyarumput",
        "category-subcat-count": "{{PLURAL:$2|Ieu kategori ngan boga subkategori di handap.|Kategori ieu ngawengku {{PLURAL:$1|subkategori|$1 subkategori}} ti $2.}}",
        "category-subcat-count-limited": "Ieu kategori ngawengku {{PLURAL:$1|subkategori|$1 subkategori}}.",
-       "category-article-count": "{{PLURAL:$2|Ieu kategori ngan ngawengku nu di handap.|{{PLURAL:$1|kaca|$1 kaca}} ti $2 di handap asup kana ieu kategori.}}",
-       "category-article-count-limited": "{{PLURAL:$1|Kaca|$1 kaca}} di handap kaasup kana kategori.",
-       "category-file-count": "{{PLURAL:$2|Kategori didieu ngan boga gambar ieu.|Tembongkeun {{PLURAL:$1|gambar|$1 gambar}} nukaasup dina kategori ieu ti kabeh $2.}}",
-       "category-file-count-limited": "Kategori didieu ngabogaan {{PLURAL:$1|gambar|$1 gambar}} ieu.",
+       "category-article-count": "{{PLURAL:$2|Ieu kategori ngan ngawengku kaca di handap.|{{PLURAL:$1|kaca|$1 kaca}} ti $2 di handap asup kana ieu kategori.}}",
+       "category-article-count-limited": "{{PLURAL:$1|Kaca|$1 kaca}} di handap kaasup kana ieu kategori.",
+       "category-file-count": "{{PLURAL:$2|Ieu kategori ngan boga berkas di handap.|{{PLURAL:$1|berkas|$1 berkas}} di handap aya dina ieu kategori, ti jumlah $2.}}",
+       "category-file-count-limited": "{{PLURAL:$1|berkas|$1 berkas}} di handap aya dina ieu kategori.",
        "listingcontinuesabbrev": "(samb.)",
        "index-category": "Kaca nu diindéks",
-       "noindex-category": "Kaca nu teu diindéks",
+       "noindex-category": "Kaca nu teu kaindéks",
        "broken-file-category": "Kaca anu ngandung tutumbu buntu",
        "about": "Ngeunaan",
        "article": "Kaca eusi",
        "newwindow": "(buka na jandéla anyar)",
        "cancel": "Bolay",
        "moredotdotdot": "Deui...",
-       "morenotlisted": "Ieu béréndélan tacan lengkep.",
+       "morenotlisted": "Ieu béréndélan bangun can lengkep.",
        "mypage": "Kaca",
        "mytalk": "Obrolan",
-       "anontalk": "Obrolan pikeun alamat IP ieu",
+       "anontalk": "Obrolan",
        "navigation": "Pituduh",
        "and": "&#32;jeung",
        "qbfind": "Panggihan",
        "qbmyoptions": "Kaca kuring",
        "faq": "NLD",
        "faqpage": "Project:NLD",
-       "actions": "Peta",
-       "namespaces": "Spasi ngaran",
+       "actions": "Tarékah",
+       "namespaces": "Ngaranspasi",
        "variants": "Varian",
-       "navigation-heading": "Ménu navigasi",
+       "navigation-heading": "Menu navigasi",
        "errorpagetitle": "Kasalahan",
        "returnto": "Balik deui ka $1.",
        "tagline": "Ti {{SITENAME}}",
        "help": "Pitulung",
-       "search": "Sungsi",
-       "searchbutton": "Sungsi",
+       "search": "Paluruh",
+       "search-ignored-headings": "# <!-- antepkeun ieu baris sakumaha ayana wé --> <pre>\n# Judul anu bakal diantep ku pamaluruhan.\n# Éditan kana ieu bakal dilarapkeun geuwat kalayan judul nu kaindéks\n# Anjeun bisa maksa pangindékan deui ieu kaca ku cara ngédit kosong (''null édit'')\n# Sintaksisna mah siga kieu yeuh:\n#   * Sagalaning ti karakter \"#\" nepi ka ahir baris éta téh mangrupa koméntar.\n#   * Unggal baris teu-kosong mah judul perenah bakal diantepkeun.\nRujukan\nTutumbu luar\nTempo ogé\n #</pre>",
+       "searchbutton": "Paluruh",
        "go": "Jung",
        "searcharticle": "Jung",
        "history": "Jujutan kaca",
        "history_short": "Jujutan",
+       "history_small": "jujutan",
        "updatedmarker": "dirobah saprak pamungkas datangna kuring",
        "printableversion": "Vérsi citakeun",
        "permalink": "Tutumbu permanén",
        "edit-local": "Edit déskripsi lokal",
        "create": "Jieun",
        "create-local": "Tambah déskripsi lokal",
-       "editthispage": "Édit kaca ieu",
-       "create-this-page": "Jieun kaca ieu",
-       "delete": "Hapus",
-       "deletethispage": "Hapus kaca ieu",
-       "undeletethispage": "Bolaykeun ngahapus ieu kaca",
-       "undelete_short": "Bolaykeun ngahapus {{PLURAL:$1|hiji éditan|$1 éditan}}",
-       "viewdeleted_short": "Témbongkeun {{PLURAL:$1|hiji éditan nu dihapus|$1 éditan nu dihapus}}",
+       "editthispage": "Édit ieu kaca",
+       "create-this-page": "Jieun ieu kaca",
+       "delete": "Pupus",
+       "deletethispage": "Pupus ieu kaca",
+       "undeletethispage": "Tong jadi mupus ieu kaca",
+       "undelete_short": "Tong jadi mupus {{PLURAL:$1|hiji éditan|$1 éditan}}",
+       "viewdeleted_short": "Témbongkeun {{PLURAL:$1|hiji éditan nu dipupus|$1 éditan nu dipupus}}",
        "protect": "Konci",
        "protect_change": "robah",
-       "protectthispage": "Konci kaca ieu",
+       "protectthispage": "Konci ieu kaca",
        "unprotect": "Robah protéksi",
        "unprotectthispage": "Robah protéksi ieu kaca",
        "newpage": "Kaca anyar",
-       "talkpage": "Sawalakeun kaca ieu",
-       "talkpagelinktext": "Obrolan",
+       "talkpage": "Sawalakeun ieu kaca",
+       "talkpagelinktext": "obrolan",
        "specialpage": "Kaca Husus",
        "personaltools": "Parabot pribadi",
-       "articlepage": "Témbongkeun kaca eusi",
+       "articlepage": "Témbongkeun eusi kaca",
        "talk": "Sawala",
        "views": "Témbongan",
        "toolbox": "Parabot",
+       "tool-link-userrights": "Robah kelompok {{GENDER:$1|pamaké}}",
+       "tool-link-userrights-readonly": "Témbong kelompok {{GENDER:$1|pamaké}}",
+       "tool-link-emailuser": "Kirim surélék ka ieu {{GENDER:$1|pamaké}}",
        "userpage": "Témbongkeun kaca pamaké",
        "projectpage": "Témbongkeun kaca proyék",
-       "imagepage": "Tempo kaca gambar",
+       "imagepage": "Tempo kaca berkas",
        "mediawikipage": "Témbongkeun kaca talatah",
        "templatepage": "Témbongkeun kaca citakan",
        "viewhelppage": "Témbongkeun kaca pitulung",
        "categorypage": "Tempo kaca kategori",
        "viewtalkpage": "Témbongkeun sawala",
        "otherlanguages": "Dina séjén basa",
-       "redirectedfrom": "(dipindahkeun ti $1)",
+       "redirectedfrom": "(dialihkeun ti $1)",
        "redirectpagesub": "Kaca alihan",
        "redirectto": "Alihkeun ka:",
-       "lastmodifiedat": "Kaca ieu panungtungan dirobah $2, $1.",
+       "lastmodifiedat": "Kaca ieu panungtungan diédit $1, jam $2.",
        "viewcount": "Kaca ieu geus dibuka {{PLURAL:$1|sakali|$1 kali}}.<br />",
        "protectedpage": "Kaca nu dikonci",
        "jumpto": "Luncat ka:",
        "jumptonavigation": "pituduh",
-       "jumptosearch": "sungsi",
-       "view-pool-error": "Punten, serverna keur pinuh.\nLoba teuing nu nyoba muka ieu kaca.\nMangga cobian sanés waktos.\n\n$1",
-       "generic-pool-error": "Hampura, serverna keur pinuh.\nLoba teuing nu nyoba muka ieu sumberdaya.\nAntosan sakedap, engké cobaan deui.",
+       "jumptosearch": "paluruh",
+       "view-pool-error": "Punten, serverna keur pinuh ayeuna mah.\nLoba teuing nu nyoba muka ieu kaca.\nMangga tunguan heula méméh anjeun nyobaan deui muka ieu kaca.\n\n$1",
+       "generic-pool-error": "Hampura, serverna keur pinuh ayeuna mah.\nLoba teuing nu nyoba muka ieu sumberdaya.\nTunguan heula méméh anjeun nyobaan deui muka ieu sumberdaya.",
        "pool-timeout": "Béakeun waktu nungguan konci",
        "pool-queuefull": "Antrian geus pinuh",
-       "pool-errorunknown": "Éror teu dipikawanoh",
-       "pool-servererror": "Palayanan ''pool counter'' teu disadiakeun ($1).",
+       "pool-errorunknown": "Éror teu dipikanyaho",
+       "pool-servererror": "Layanan ''pool counter'' teu sayaga ($1).",
        "poolcounter-usage-error": "Galat pamakéan: $1",
        "aboutsite": "Ngeunaan {{SITENAME}}",
        "aboutpage": "Project:Ngeunaan",
        "privacypage": "Project:Kawijakan privasi",
        "badaccess": "Kasalahan widi",
        "badaccess-group0": "Anjeun teu wenang ngalaksanakeun peta nu dipundut.",
-       "badaccess-groups": "Peta nu dipundut ngan bisa laksana pikeun pamaké ti salah sahiji {{PLURAL:$2|gorombolan|salah sahiji gorombolan}}: $1.",
+       "badaccess-groups": "Tarékah nu dipundut kur bisa laksana ajang pamaké ti {{PLURAL:$2|gorombolan|salah sahiji gorombolan}}: $1.",
        "versionrequired": "Butuh MediaWiki vérsi $1",
        "versionrequiredtext": "Butuh MediaWiki vérsi $1 pikeun migunakeun ieu kaca. Mangga tingal [[Special:Version|kaca vérsi]]",
        "ok": "Heug",
-       "retrievedfrom": "Disalin ti \"$1\"",
-       "youhavenewmessages": "Anjeun boga $1 ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|Anjeun boga}} $1 ti {{PLURAL:$3|pamaké séjén|$3 pamaké}} ($2).",
-       "youhavenewmessagesmanyusers": "Anjeun boga $1 ti pamaké lian ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|obrolan anyar|obrolan anyar}}",
+       "retrievedfrom": "Dicomot ti \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|Anjeun meunang}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Anjeun meunang}} $1 ti {{PLURAL:$3|pamaké séjén|$3 pamaké}} ($2).",
+       "youhavenewmessagesmanyusers": "Anjeun meunang $1 ti pamaké lian ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|hiji talatah anyar|999=talatah anyar}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|parobahan|999=parobahan}} panungtung",
-       "youhavenewmessagesmulti": "Anjeun boga talatah anyar di $1",
+       "youhavenewmessagesmulti": "Anjeun meunang talatah anyar di $1",
        "editsection": "édit",
        "editold": "édit",
        "viewsourceold": "tempo sumber",
        "editlink": "édit",
        "viewsourcelink": "témbongkeun sumber",
        "editsectionhint": "Édit bab: $1",
-       "toc": "Daptar eusi",
+       "toc": "Eusi",
        "showtoc": "témbongkeun",
        "hidetoc": "sumputkeun",
        "collapsible-collapse": "Tilepkeun",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Tepas",
        "nosuchaction": "Teu aya peta kitu",
-       "nosuchactiontext": "Peta nu diketik na URL teu dipikawanoh ku wiki.\nKadé bisi salah ketik atawa nuturkeun tumbu nu salah.\nHal ieu bisa ogé kulantaran ayana kutu (bug) dina sopwér nu dipaké ku {{SITENAME}}.",
+       "nosuchactiontext": "Peta nu diketik dina URL henteu sah.\nKadé bisi salah ketik atawa nuturkeun tutumbu anu salah.\nHal ieu bisa ogé kulantaran ayana kutu (bug) dina sopwér anu dipaké ku {{SITENAME}}.",
        "nosuchspecialpage": "Teu aya kaca husus nu kitu",
        "nospecialpagetext": "<strong>Anjeun ménta kaca husus nu teu dipikawanoh.</strong>\nKaca husus anu bener bisa ditempo béréndélanana dina [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Kasalahan",
        "title-invalid-talk-namespace": "Judul kaca anu dipénta nujul ka kaca obrolan anu teu mungkin aya.",
        "title-invalid-characters": "Judul kaca anu dipénta ngandung karakter anu henteu sah: \"$1\".",
        "title-invalid-relative": "Judul ngandung jalur rélatip. Judul kaca rélatip (./, ../) henteu sah, kusabab bakal mindeng teu kahontal nalika dibuka maké browser pamaké.",
-       "title-invalid-magic-tilde": "Judul kaca anu dipénta ngandung sékuéns gelombang sulap (<nowiki>~~~</nowiki>).",
+       "title-invalid-magic-tilde": "Judul kaca anu dipénta ngandung tilda anu teu sah (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Judul kaca anu dipundut panjang teuing. Ulah leuwih ti $1 {{PLURAL:$1|bit}} dina panyandi UTF-8.",
        "title-invalid-leading-colon": "Judul kaca anu dipénta dimimitian ku kolon anu henteu sah.",
        "perfcached": "Data di handap ieu mangrupa 'cache' sahingga bisa jadi henteu mutahir. 'Cache' nyadiakeun paling loba {{PLURAL:$1|hiji hasil|$1 hasil}}.",
        "actionthrottled": "Peta diwates",
        "actionthrottledtext": "Salaku tetengger anti-spam, anjeun teu diwenangkeun loba kitu peta dina jangka waktu anu sakitu heureutna. Mangga lajengkeun deui sanggeus sababaraha menit ka payun.",
        "protectedpagetext": "Ieu kaca dijaga tina éditan atawa peta lianna.",
-       "viewsourcetext": "Anjeun bisa némbongkeun sarta nyalin sumber ieu kaca:",
+       "viewsourcetext": "Anjeun bisa nempo sarta néplak sumber ieu kaca.",
        "viewyourtext": "Anjeun bisa némbongkeun sarta nyalin sumber '''éditan anjeun''' ka ieu kaca:",
        "protectedinterface": "Ieu kaca nyadiakeun téks antarmuka pikeun sopwér di ieu wiki, ku kkituna dikonci pikeun nyingkahan \nanu ngaruksak.\nPikeun nambahkeun atawa ngarobah tarjamahan pikeun sakabéh wiki, buka [https://translatewiki.net/ translatewiki.net], proyék lokalisasi MediaWiki.",
        "editinginterface": "<strong>Awas:</strong> Anjeun keur ngédit kaca nu dipaké pikeun nyadiakeun téks antarmuka pikeun sopwérna.\nParobahan kana ieu kaca bakal mangaruhan pidangan antarmuka pikeun pamaké séjén di ieu wiki.",
        "virus-scanfailed": "nyekén gagal (kode $1)",
        "virus-unknownscanner": "antivirus teu dipikawanoh:",
        "logouttext": "<strong>Anjeun ayeuna geus kaluar log.<strong>\n\nMangkahadé, sababaraha kaca bakal tetep némbongkeun saolah-olah asup kénéh log nepi ka anjeun ngosongkeun ''cache'' dina panyungsi.",
+       "cannotlogoutnow-title": "Teu bisa kaluar log ayeuna",
+       "cannotlogoutnow-text": "Kaluar log teu mungkin bisa nalika keur ngagunakeun $1.",
        "welcomeuser": "Bagéa, $1!",
        "welcomecreation-msg": "Akun anjeun geus dijieun.\nLamun minat, Anjeun bisa ngarobah [[Special:Preferences|préferénsi]] {{SITENAME}}.",
        "yourname": "Sandiasma:",
        "createacct-yourpasswordagain-ph": "Asupkeun deui kecap sandi",
        "userlogin-remembermypassword": "Jaga ngarah angger asup log",
        "userlogin-signwithsecure": "Paké sambungan aman",
+       "cannotlogin-title": "Teu bisa asup log",
+       "cannotlogin-text": "Asup log teu mungkin bisa",
+       "cannotloginnow-title": "Teu bisa asup log ayeuna",
+       "cannotloginnow-text": "Kaluar log teu mungkin bisa nalika keur ngagunakeun $1.",
+       "cannotcreateaccount-title": "Teu bisa nyieun akun",
        "yourdomainname": "Domain anjeun",
        "password-change-forbidden": "Anjeun teu bisa ngarobah kecap sandi dina ieu wiki.",
-       "externaldberror": "Aya kasalahan dina pangkalan data oténtikasi luar, atawa anjeun mémang teu diwenangkeun pikeun ngaropéa rekening luar anjeun.",
+       "externaldberror": "Aya kasalahan dina pangkalan data oténtikasi luar, atawa anjeun mémang teu diwenangkeun pikeun ngaropéa akun luar anjeun.",
        "login": "Asup log",
+       "login-security": "Buktikeun idéntitas anjeun",
        "nav-login-createaccount": "Nyieun akun/asup log",
-       "userlogin": "Asup log / jieun akun",
-       "userloginnocreate": "Asup log",
        "logout": "Kaluar log",
        "userlogout": "Kaluar log",
        "notloggedin": "Can asup log",
        "userlogin-noaccount": "Teu boga akun?",
        "userlogin-joinproject": "Ngiluan {{SITENAME}}",
-       "nologin": "Teu boga akun? '''$1'''.",
-       "nologinlink": "Jieun akun",
        "createaccount": "Jieun akun",
-       "gotaccount": "Geus boga akun? '''$1'''.",
-       "gotaccountlink": "Asup log",
-       "userlogin-resetlink": "Poho akun sorangan?",
        "userlogin-resetpassword-link": "Poho kecap sandi?",
        "userlogin-helplink2": "Pitulung asup log",
        "userlogin-loggedin": "Anjeun geus asup log salaku {{GENDER:$1|$1}}.\nPaké pormulir di handap pikeun asup log salaku pamaké séjén.",
        "createacct-another-email-ph": "Asupkeun alamat surélék",
        "createaccountmail": "Paké kecap sandi acak sarta kirim ka alamat surélék",
        "createacct-realname": "Ngaran asli (teu wajib)",
-       "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Naha bet nyieun akun séjén",
        "createacct-submit": "Jieun akun anjeun",
-       "createacct-another-submit": "Jieun akun séjén",
+       "createacct-another-submit": "Jieun akun",
+       "createacct-continue-submit": "Tuluykeun panyieunan akun",
+       "createacct-another-continue-submit": "Tuluykeun panyieunan akun",
        "createacct-benefit-heading": "{{SITENAME}} téh dijieun ku jalma-jalma siga anjeun.",
        "createacct-benefit-body1": "{{PLURAL:$1|édit|édit}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca|kaca}}",
        "userexists": "Sandiasma nu diasupkeun geus aya nu maké.\nMangga pilih sandiasma nu séjén.",
        "loginerror": "Kasalahan asup log",
        "createacct-error": "Nyieun akun éror",
-       "createaccounterror": "Teu bisa nyieun rekening: $1",
-       "nocookiesnew": "Rekening pamaké geus dijieun, tapi anjeun can asup log. {{SITENAME}} maké ''cookies'' pikeun ngasupkeun log pamaké. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga fungsikeun, teras asup log migunakeun ngaran pamaké sarta sandi nu anyar.",
+       "createaccounterror": "Teu bisa nyieun akun: $1",
+       "nocookiesnew": "Akun pamaké geus dijieun, tapi anjeun can asup log. {{SITENAME}} maké ''cookies'' pikeun ngalog pamaké. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga fungsikeun, teras asup log migunakeun sandiasma sarta kecap sandi anu anyar.",
        "nocookieslogin": "{{SITENAME}} migunakeun ''cookies'' pikeun ngasupkeun pamaké kana log. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga pungsikeun sarta cobian deui.",
        "nocookiesfornew": "Akun pamaké teu bisa dijieun, kusabab sumberna teu bisa dipastikeun.\nPariksa kukisna bisi tumpur, terus cobaan muat ulang ieu kaca.",
        "noname": "Anjeun teu nuliskeun ngaran pamaké nu sah.",
-       "loginsuccesstitle": "Asup log geus hasil",
+       "loginsuccesstitle": "Geus asup log",
        "loginsuccess": "Anjeun ayeuna geus asup log ka {{SITENAME}} salaku \"$1\".",
-       "nosuchuser": "Euweuh pamaké nu ngaranna \"$1\".\nNgaran pamaké ngabedakeun hurup kapital.\nPariksa éjahanana, atawa paké formulir di handap pikeun [[Special:CreateAccount|nyieun rekening anyar]].",
+       "nosuchuser": "Euweuh pamaké nu ngaranna \"$1\".\nNgaran pamaké ngabedakeun gedé leutikna hurup.\nPariksa éjahanana, atawa [[Special:CreateAccount|nyieun akun anyar]].",
        "nosuchusershort": "Taya pamaké nu ngaranna \"$1\", pariksa éjahanana!",
        "nouserspecified": "Anjeun kudu ngeusian ngaran landihan.",
        "login-userblocked": "Ieu pamaké keur dipeungpeuk, teu diwenangkeun asup log.",
        "wrongpasswordempty": "Sandina can kaeusian. Cobaan deui!",
        "passwordtooshort": "Sandina kudu diwangun ku sahanteuna {{PLURAL:$1|1 karakter|$1 karakter}}.",
        "passwordtoolong": "Kecap sandi teu bisa leuwih ti {{PLURAL:$1|1 karakter|$1 karakter}}.",
-       "password-name-match": "Sandi anjeun kudu béda ti landihan.",
+       "password-name-match": "Kecap sandi anjeun kudu béda ti sandiasma.",
        "password-login-forbidden": "Sandiasma jeung sandina teu bisa dipaké.",
        "mailmypassword": "Setél ulang kecap sandi",
        "passwordremindertitle": "Pangéling sandi ti {{SITENAME}}",
        "noemail": "Teu aya alamat surélék karékam pikeun \"$1\".",
        "noemailcreate": "Anjeun kudu nyadiakeun alamat surélék anu bener",
        "passwordsent": "Sandi anyar geus dikirim ka alamat surélék nu kadaptar pikeun \"$1\". Mangga asup log deui satutasna katarima.",
-       "blocked-mailpassword": "Alamat IP anjeun dipeungpeuk tina kabisa ngédit, sarta moal bisa maké fungsi ganti kecap sandi ngarah hanteu disalahgunakeun.",
+       "blocked-mailpassword": "Alamat IP anjeun dipeungpeuk tina kabisa ngédit. Pikeun nyingkahan panyalahgunaan, Anjeun teu dimeunangkeun pikeun mermanakeun kecap sandi liwat ieu alamat IP.",
        "eauthentsent": "Surélék konfirmasi geus dikirim ka alamat bieu.\nMéméh aya surat séjén asup ka akunna, anjeun kudu nuturkeun pituduh dina surélékna pikeun mastikeun yén akun éta téh bener boga anjeun.",
        "throttled-mailpassword": "Surélék pikeun ngarobah kecap sandi geus dikirim {{PLURAL:$1|jam|$1 jam}} kaliwat.\nNgarah hanteu disalahgunakeun, ngan hiji surélék anu bakal dikirim saban {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Kasalahan ngirim surat: $1",
-       "acct_creation_throttle_hit": "Punten,pamaké alamat IP anjeun geus nyieun {{PLURAL:$1|1 rekening|$1 rekening}} dina sapoé ieu. mangrupa jumlah nu di idinan dina sapoé.\nanjeun teu bisa nyieun deui samentara waktu.",
+       "acct_creation_throttle_hit": "Anu ngaranjang ka ieu wiki maké alamat IP anjeun geus nyieun {{PLURAL:$1|1 akun|$1 akun}} salila $2, mangrupa jumlah anu diidinan dina sapoé.\nKu kituna, anu ngaranjang maké ieu alamat IP samentawis mah moal bisa nyieun akun deui heula.",
        "emailauthenticated": "Alamat surélék anjeun geus dikonfirmasi $2 tabuh $3.",
        "emailnotauthenticated": "Alamat surélék anjeun can dikonfirmasi.\nMoal aya surélék nu bakal dikirim pikeun fitur-fitur di handap ieu.",
        "noemailprefs": "Teu aya alamat surélék, fitur di handap moal bisa jalan.",
        "invalidemailaddress": "Alamat surélék teu bisa ditarima sabab formatna salah.\nMangga lebetkeun alamat nu formatna bener atawa kosongkeun baé.",
        "cannotchangeemail": "Alamat surat-é akun hanteu bisa dirobah di ieu wiki.",
        "emaildisabled": "Ieu loka teu bisa ngirim surélék.",
-       "accountcreated": "Rekening geus dijieun.",
+       "accountcreated": "Akun geus dijieun",
        "accountcreatedtext": "Akun pamaké [[{{ns:Pamaké}}:$1|$1]] ([[{{ns:Obrolan pamaké}}:$1|obrolan]]) geus dijieun.",
-       "createaccount-title": "Nyieun rekening keur {{SITENAME}}",
-       "createaccount-text": "Aya nu nyieun rekening pikeun alamat surélék anjeun di {{SITENAME}} ($4) maké landihan \"$2\" sarta sandi \"$3\". Anjeun kudu asup log sarta ngaganti sandina ayeuna kénéh.\n\nMun ieu rekening balukar ayana éror, teu kudu diwaro.",
+       "createaccount-title": "Nyieun akun pikeun {{SITENAME}}",
+       "createaccount-text": "Aya nu nyieun akun pikeun alamat surélék anjeun di {{SITENAME}} ($4) maké sandiasma \"$2\" kalawan kecap sandi \"$3\". Anjeun kudu asup log sarta ngaganti kecap sandina.\n\nMun ieu akun dijieun alatan éror, ulah diwaro.",
        "login-throttled": "Anjeun geus loba teuing nyobaan asup log.\nTungguan $1, laju cobaan deui.",
-       "login-abort-generic": "Login gagal - Dibolaykeun",
+       "login-abort-generic": "Asup log anjeun gagal - Dibolaykeun",
        "login-migrated-generic": "Akun anjeun geus pindah, ku kituna sandiasma anjeun geus leungit ti ieu wiki.",
        "loginlanguagelabel": "Basa: $1",
        "suspicious-userlogout": "Pamundut anjeun pikeun kaluar log ditolak ku sabab sigana dikirim ku pangaprak buntu atawa ''cache'' proxi.",
        "createacct-another-realname-tip": "Ngaran asli hanteu diwajibkeun.\nLamun anjeun milih ngeusian, ieu ngaran bakal dipaké pikeun nandaan kontribusi anjeun.",
        "pt-login": "Asup log",
        "pt-login-button": "Asup log",
+       "pt-login-continue-button": "Tuluykeun asup log",
        "pt-createaccount": "Jieun akun",
        "pt-userlogout": "Kaluar log",
        "php-mail-error-unknown": "Kasalahan nu teu kanyahoan dina fungsi PHP surélék().",
        "changepassword": "Robah sandi",
        "resetpass_announce": "Pikeun nganggeuskeun asup log, anjeun kudu nyieun kecap sandi anyar.",
        "resetpass_text": "<!-- Tambahkeun téks di dieu -->",
-       "resetpass_header": "Ganti sandi rekening",
+       "resetpass_header": "Robah kecap sandi akun",
        "oldpassword": "Sandi heubeul",
        "newpassword": "Sandi anyar:",
        "retypenew": "Ketik ulang sandi",
        "resetpass_submit": "Setél log asup katut sandina",
        "changepassword-success": "Kecap sandi Anjeun geus laksana dirobah!",
        "changepassword-throttled": "Anjeun geus loba teuing nyobaan asup log.\nTungguan $1 méméh nyobaan deui.",
+       "botpasswords": "Kecap sandi bot",
+       "botpasswords-disabled": "Kecap sandi bot dipareuman.",
+       "botpasswords-no-central-id": "Pikeun migunakeun kecap sandi bot, anjeun kudu asup log ka akun museur heula.",
+       "botpasswords-existing": "Kecap sandi bot sayaga",
+       "botpasswords-createnew": "Jieun kecap sandi bot anyar",
+       "botpasswords-editexisting": "Édit kecap sandi bot nu sayaga",
+       "botpasswords-label-appid": "Ngaran bot:",
+       "botpasswords-label-create": "Jieun",
+       "botpasswords-label-update": "Anyarkeun",
+       "botpasswords-label-cancel": "Bolay",
+       "botpasswords-label-delete": "Pupus",
+       "botpasswords-label-resetpassword": "Balikeun deui kecap sandi",
+       "botpasswords-label-grants": "Aksés nu dibikeun:",
+       "botpasswords-label-grants-column": "Diwidian",
+       "botpasswords-bad-appid": "Ngaran bot \"$1\" teu sah.",
+       "botpasswords-created-title": "Kecap sandi bot dijieun",
+       "botpasswords-updated-title": "Kecap sandi bot dianyarkeun",
+       "botpasswords-deleted-title": "Kecap sandi bot dihapus",
        "resetpass_forbidden": "Sandi henteu bisa dirobah",
+       "resetpass_forbidden-reason": "Kecap sandi teu bisa diganti: $1",
        "resetpass-no-info": "Anjeun kudu asup log pkeun bisa muka ieu kaca sacara langsung.",
-       "resetpass-submit-loggedin": "Ganti kecap sandi rekening",
+       "resetpass-submit-loggedin": "Robah kecap sandi",
        "resetpass-submit-cancel": "Bolay",
-       "resetpass-wrong-oldpass": "Salah sandi.\nBisa jadi anjeun geus ngaganti sandina atawa ménta sandi saheulaanan anu anyar.",
+       "resetpass-wrong-oldpass": "Kecap sandi panungtungtung atawa samentara teu sah.\nMeureun anjeun geus ngaganti sandina atawa ménta sandi saheulaanan anu anyar.",
        "resetpass-recycled": "Mangga ganti kecap sandi anjeun ku nu anyar.",
        "resetpass-temp-emailed": "Anjeun asup log migunakeun sandi témporér. Pikeun nganggeuskeun asup log, anjeun kudu nyieun kecap sandi anyar di dieu:",
        "resetpass-temp-password": "Sandi samentara:",
        "passwordreset-emaildisabled": "Fitur surélék ditumpurkeun di ieu wiki.",
        "passwordreset-username": "Sandiasma:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Témbongkeun surat-é hasilna?",
-       "passwordreset-capture-help": "Upama anjeun nyéntang ieu kotak, surélék (anu ngirimkeun kecap sandi saheulaanan) bakal ditémbongkeun ka anjeun sarta dikirimkeun ka pamakéna.",
        "passwordreset-email": "Alamat surélék:",
        "passwordreset-emailtitle": "Wincikan akun di {{SITENAME}}",
        "passwordreset-emailtext-ip": "Aya (sigana anjeun, ti alamat IP $1) ménta nyetél ulang kecap sandi pikeun {{SITENAME}} ($4). {{PLURAL:$3|Akun}} di handap tumali jeung alamat ieu surélék:\n\n$2\n\n{{PLURAL:$3|Ieu sandi saheulaanan}} bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun teu rumasa nyieun ieu paménta, atawa lamun geus inget sandi aslina sarta moal dirobah, ieu surat teu kudu diwaro.",
        "passwordreset-emailtext-user": "Pamaké $1 di {{SITENAME}} ménta nyetél ulang sandi anjeun di {{SITENAME}} ($4). {{PLURAL:$3|Akun}} di handap tumali jeung alamat surélék ieu:\n\n$2\n\n{{PLURAL:$3|Ieu sandi saheulaanan}} bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun henteu rumasa nyieun ieu pamundut atawa lamun geus inget sandi asli sarta moal ngarobah deui, ieu talatah teu kudu dipaliré.",
        "passwordreset-emailelement": "Sandiasma: \n$1\n\nSandi saheulaanan: \n$2",
-       "passwordreset-emailsentemail": "Surélék pikeun nyetél ulang kecap sandi geus dikirim.",
+       "passwordreset-emailsentemail": "Mun ieu alamat surélék patalian jeung akun anjeun, mangka surélék pikeun nyetél ulang kecap sandi bakal dikirim.",
+       "passwordreset-nocaller": "Panggero kudu dibikeun",
+       "passwordreset-nosuchcaller": "Panggero can aya: $1",
+       "passwordreset-invalidemail": "Alamat surélék teu sah",
        "changeemail": "Ganti alamat surélék",
        "changeemail-header": "Ganti alamat surélék akun",
        "changeemail-no-info": "Anjeun kudu asup log pikeun bisa muka ieu kaca sacara langsung.",
        "changeemail-password": "Kecap sandi {{SITENAME}} Anjeun:",
        "changeemail-submit": "Ganti surélék",
        "changeemail-throttled": "Anjeun loba teuing gagal asup log.\nTungguan $1 saméméh nyobaan deui.",
+       "changeemail-nochange": "Pék asupkeun alamat surélék anyar anu béda.",
        "resettokens": "Rését token",
        "resettokens-text": "Anjeun bisa ngarését token sangkan bisa muka sababaraha data-data pribadi anu tumali jeung akun anjeun di dieu.\n\nAnjeun kudu ngarését lamun kungsi teu kahaja ngabéjaan anu séjén atawa lamun aya anu nyusup kana akun anjeun.",
        "resettokens-no-tokens": "Taya token pikeun dirését.",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (ajén ayeuna: $2)",
        "resettokens-watchlist-token": "Token pikeun asupan raramat (Atom/RSS) [[Special:Watchlist|parobahan kana kaca-kaca anu diponcorong]]",
+       "resettokens-done": "Reset token.",
        "resettokens-resetbutton": "Setél token anu dipilih",
        "bold_sample": "Téks kandel",
        "bold_tip": "Téks kandel",
        "sig_tip": "Paraf anjeun katut cap titimangsa",
        "hr_tip": "Garis horisontal",
        "summary": "Ringkesan:",
-       "subject": "Jejer/Judul:",
+       "subject": "Subyék:",
        "minoredit": "Ieu éditan minor",
        "watchthis": "Awaskeun kaca ieu",
        "savearticle": "Simpen",
+       "savechanges": "Simpen parobahan",
+       "publishpage": "Pedalkeun kaca",
+       "publishchanges": "Pedalkeun parobahan",
        "preview": "Pramidang",
        "showpreview": "Témbongkeun pramidang",
        "showdiff": "Témbongkeun parobahan",
-       "blankarticle": "<strong>Awas:</strong> Kaca anu dijieun ku anjeun kosong kénéh.\nUpama anjeun ngaklik \"{{int:savearticle}}\" deui, kacana bakal dijieun tanpa eusi.",
+       "blankarticle": "<strong>Awas:</strong> Kaca anu dijieun ku anjeun kosong kénéh.\nUpama anjeun ngaklik \"$1\" deui, kacana bakal dijieun tanpa eusi.",
        "anoneditwarning": "<strong>Awas:</strong> Anjeun can asup log. Lamun ngédit, alamat IP anjeun bakal katempo ku balaréa. Lamun anjeun <strong>[$1 asup log]</strong> atawa <strong>[$2 nyieun akun]</strong>, ngaran anjeun bakal natrat dina jujutan éditanana, kalayan sababaraha kauntungan lianna.",
        "anonpreviewwarning": "\"Anjeun can asup log. Mun disimpen, alamat IP anjeun bakal kacatet dina jujutan ieu kaca.\"",
        "missingsummary": "'''Pépéling:''' Anjeun can ngeusian sari éditan. Mun anjeun ngaklik deui Simpen, éditan anjeun bakal disimpen tanpa sari éditan",
-       "selfredirect": "<strong>Awas:</strong> Anjeun ngalihkeun ieu kaca ka asalna.\nAnjeun sigana salah ngasupkeun tujul alihan, atawa ngédit kaca anu salah.\nUpama anjeun ngaklik deui \"{{int:savearticle}}\", alihanana bakal angger dijieun.",
+       "selfredirect": "<strong>Awas:</strong> Anjeun ngalihkeun ieu kaca ka asalna.\nAnjeun sigana salah ngasupkeun tujul alihan, atawa ngédit kaca anu salah.\nUpama anjeun ngaklik deui \"$1\", alihanana bakal angger dijieun.",
        "missingcommenttext": "Mangga tulis koméntar di handapeun ieu.",
-       "missingcommentheader": "'''Pépéling''': Anjeun can ngeusian judul pikeun ieu koméntar.\nMun anjeun ngaklik deui \"{{int:savearticle}}\", éditan anjeun bakal disimpen tanpa koméntar.",
-       "summary-preview": "Ringkesan pramidang:",
-       "subject-preview": "Sawangan subyek/tajuk:",
+       "missingcommentheader": "<strong>Pépéling</strong>: Anjeun can ngeusian judul pikeun ieu koméntar.\nMun anjeun ngaklik deui \"$1\", éditan anjeun bakal disimpen tanpa koméntar.",
+       "summary-preview": "Pramidang tingkesan édit:",
+       "subject-preview": "Pramidang subyék:",
        "previewerrortext": "Aya éror nalika nyobaan nyawang robahan anjeun.",
        "blockedtitle": "Pamaké dipeungpeuk",
        "blockedtext": "'''Ngaran pamaké atawa alamat IP anjeun dipeungpeuk.'''\n\nDipeungpeuk ku $1.\nAlesanana ''$2''.\n\n* Mimiti dipeungpeuk : $8\n* dipeungpeuk kadaluarsa dina: $6\n* Sasaran nudipeungpeuk : $7\n\nAnjeun bisa nepungan $1 atawa salasahiji [[{{MediaWiki:Grouppage-sysop}}|kuncén]] séjén pikeun nyawalakeun hal ieu.\n'''Catet''': yén anjeun teu bisa maké fungsi \"surélékan pamaké ieu\" mun anjeun teu ngadaptarkeun alamat surélék nu sah kana [[Special:Preferences|préferénsi pamaké]] anjeun.\n\nAlamat IP anjeun $3 jeung ID na #$5.\nLampirkeun informasi ieu dina unggal ''query'' anjeun.",
        "noarticletext": "Kiwari can aya téks dina ieu kaca.\nAnjeun bisa [[Special:Search/{{PAGENAME}}|nyusud judul ieu kaca]] dina kaca séjén,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nyusud log nu tumali],\natawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} nyieun ieu kaca]</span>.",
        "noarticletext-nopermission": "Kiwari can aya téks dina ieu kaca.\nAnjeun bisa [[Special:Search/{{PAGENAME}}|nyusud judul ieu kaca]] dina kaca séjén,atawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nyusud log nu tumali]</span>, tapi teu wenang pikeun nyieun ieu kaca.",
        "missing-revision": "Révisi #$1 kaca \"{{FULLPAGENAME}}\" teu aya.\n\nKajadian ieu biasana kusabab nuturkeun tutumbu jujutan kaca anu geus dihapus.\nWincikanana bisa ditempo di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].",
-       "userpage-userdoesnotexist": "Rekening pamaké \"<nowiki>$1</nowiki>\" tacan kadaptar. Mangga tilikan lamun anjeun hoyong ngadamel/ngédit kaca ieu.",
-       "userpage-userdoesnotexist-view": "Rekening pamaké \"$1\" teu aya dina daptar.",
+       "userpage-userdoesnotexist": "Akun pamaké \"<nowiki>$1</nowiki>\" tacan kadaptar. Mangga riksa lamun anjeun hoyong ngadamel/ngédit ieu kaca.",
+       "userpage-userdoesnotexist-view": "Akun pamaké \"$1\" teu aya dina daptar.",
        "blocked-notice-logextract": "Ieu pamaké keur dipeungpeuk.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
        "clearyourcache": "<strong>Catet:</strong> Sanggeus nyimpen, anjeun kudu narabas singgahan panyungsi anjeun pikeun nempo parobahanana.\n* <strong>Firefox/Safari:</strong> Tahan <em>Shift</em> bari ngaklik <em>Reload</em>, atawa pencét boh <em>Ctrl-F5</em> atawa <em>Ctrl-R</em> (<em>⌘-R</em> dina Mac)\n* <strong>Google Chrome:</strong> Pencét <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> dina Mac)\n* <strong>Internet Explorer:</strong> Tahan <em>Ctrl</em> bari ngaklik <em>Refresh</em>, atawa pencét <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Kosongkeun singgahan dina <em>Tools → Preferences</em>",
        "usercssyoucanpreview": "Tip:''' Paké tombol \"{{int:showpreview}}\" pikeun nyobaan CSS anyar anjeun méméh nyimpen.",
        "continue-editing": "Miang ka bagian ngédit",
        "previewconflict": "Sawangan ieu mangrupa eunteung pikeun téks na rohangan ngédit sakumaha bakal katémbong mun ku anjeun disimpen.",
        "session_fail_preview": "'''Punten! Kami teu bisa ngolah éditan anjeun alatan leungitna data rintakan. Mangga cobian deui. Mun tetep teu bisa, cobi kaluar log lajeng lebet deui.'''",
-       "session_fail_preview_html": "'''Punten! Kami teu bisa ngolah éditan anjeun sabab leungitna data rintakan.'''\n\n''Kusabab {{SITENAME}} ngawenangkeun dipakéna HTML atah, pramidangna disumputkeun pikeun nyegah panarajang JavaScript.''\n\n'''Mun ieu éditan bener, mangga cobian deui. Mun tetep teu metu, cobi [[Special:UserLogout|kaluar log]] heula, lajeng lebet deui.'''",
+       "session_fail_preview_html": "Hampura! Kami teu bisa ngolah éditan anjeun lantaran leungitna data rintakan.\n\n<em>Kusabab {{SITENAME}} ngawenangkeun dipakéna HTML atah, pramidangna disumputkeun pikeun nyegah panarajang JavaScript.''</em>\n\n<strong>Mun ieu éditan bener, mangga cobian deui. Mun tetep teu metu, coba [[Special:UserLogout|kaluar log]] heula, terus asup deui.</strong>",
        "token_suffix_mismatch": "'''Éditan anjeun ditolak sabab aplikasi klien Anjeun ngarobah karakter tanda baca dina éditan. Éditan kasebut ditolak keur nyegah kasalahan dina artikel téks. Hal ieu kadang-kadang kajadian lamun Anjeun maké proksi anonim basis web nu masalah.'''",
        "edit_form_incomplete": "'''Sawatara bagian tina wangun éditan teu nepi ka sérver; pariksa deui naha éditan Anjeun tetep gembleng sarta cobaan deui.'''",
        "editing": "Ngédit $1",
        "editingsection": "Ngédit $1 (bagian)",
        "editingcomment": "Ngédit $1 (bagian anyar)",
        "editconflict": "Konflik éditan: $1",
-       "explainconflict": "Aya nu geus ngarobah kaca ieu saprak anjeun mimiti ngédit.\nTéks béh luhur ngandung téks kaca nu aya kiwari, parobahan anjeun ditémbongkeun di béh handap.\nAnjeun kudu ngagabungkeun parobahan anjeun kana téks nu kiwari.\n'''Ngan''' téks nu béh luhur nu bakal disimpen nalika anjeun mencét \"{{int:savearticle}}\".",
+       "explainconflict": "Aya nu geus ngarobah kaca ieu saprak anjeun mimiti ngédit.\nTéks béh luhur ngandung téks kaca nu aya kiwari, parobahan anjeun ditémbongkeun di béh handap.\nAnjeun kudu ngagabungkeun parobahan anjeun kana téks nu kiwari.\n'''Ngan''' téks nu béh luhur nu bakal disimpen nalika anjeun mencét \"$1\".",
        "yourtext": "Tulisan anjeun",
        "storedversion": "Vérsi nu disimpen",
        "nonunicodebrowser": "'''AWAS: Panyungsi anjeung teu maké unicode, mangga robah heula méméh ngédit artikel.'''",
        "yourdiff": "Béda",
        "copyrightwarning": "Perhatikeun yén sadaya kontribusi ka MediaWiki dianggap medal dina panangtayungan lisénsi $2 (tempo $1 pikeun jéntréna). Mun anjeun teu miharep tulisan anjeun dirobah sarta disebarkeun deui, ulah dilebetkeun ka dieu.<br />\nAnjeun ogé jangji yén tulisan ieu dijieun ku sorangan, atawa disalin ti ''domain'' umum atawa sumberdaya bébas séjénna. '''ULAH NGASUPKEUN KARYA NU MIBANDA HAK CIPTA TANPA IDIN!'''",
        "copyrightwarning2": "Catet yén sadaya kontribusi ka {{SITENAME}} bisa diédit, dirobah, atawa dihapus ku kontributor séjén. Mun anjeun teu miharep tulisan anjeun dirobah, ulah ngintunkeun ka dieu.<br />\nAnjeun ogé mastikeun yén ieu téh pituin tulisan anjeun, atawa salinan ti domain umum atawa sumberdaya bébas séjénna (tempo $1 pikeun écésna).\n'''ULAH NGINTUNKEUN KARYA NU MIBANDA HAK CIPTA TANPA WIDI!'''",
+       "editpage-cannot-use-custom-model": "Modél kontén ieu kaca teu bisa dirobah.",
        "longpageerror": "<strong>Éror: téks anu dikirimkeun panjangna {{PLURAL:$1|hiji kilobit|$1 kilobit}}, leuwih ti maksimum {{PLURAL:$2|hiji kilobit|$2 kilobit}}.</strong>\nTeu bisa disimpen.",
        "readonlywarning": "<strong>Awas: pangkalan data dikonci pikeun diropéa, anjeun moal bisa nyimpen éditan anjeun ayeuna.</strong>\nMun perlu, simpen heula téksna kana berkas téks pikeun diasupkeun deui séjén mangsa.\n\nKuncén anu ngonci pangkalan data méré katerangan: $1",
        "protectedpagewarning": "'''AWAS: ieu kaca dikonci sarta ngan bisa dirobah ku pamaké nu statusna kuncén.'''\nÉntri log panungtungan ditémbongkeun di handap:",
        "edit-conflict": "Éditan bantrok",
        "edit-no-change": "Éditan anjeun teu diwaro, kusabab taya nu robah dina tulisanana.",
        "postedit-confirmation-created": "Kaca geus dijieun.",
+       "postedit-confirmation-restored": "Kaca geus dibalikkeun deui.",
        "postedit-confirmation-saved": "Éditan anjeun tos disimpen.",
        "edit-already-exists": "Teu bisa nyieun kaca anyar.\nArtikelna geus aya.",
        "defaultmessagetext": "Téks ti dituna",
        "invalid-content-data": "Data eusi henteu valid",
        "content-not-allowed-here": "Eusi \"$1\" teu diijinan di kaca [[$2]]",
        "editwarning-warning": "Ninggalkeun ieu kaca bakal ngaleungitkeun parobahan anu tas dijieun.\nUpama anjeun geus asup log, anjeun bisa numpurkeun ieu talatah dina bagian \"{{int:prefs-editing}}\" préferénsi anjeun.",
+       "editpage-invalidcontentmodel-title": "Modél kontén teu dirojong",
        "editpage-notsupportedcontentformat-title": "Format eusi teu dirojong",
        "editpage-notsupportedcontentformat-text": "Format eusi $1 teu dirojong ku modél eusi $2.",
        "content-model-wikitext": "wikitéks",
        "expansion-depth-exceeded-category": "Kaca-kaca anu jero ékspansina leuwih ti wates",
        "expansion-depth-exceeded-category-desc": "Kacana ngaleuwihan wates jero ékspansina.",
        "expansion-depth-exceeded-warning": "Kaca ngaleuwihan jero ékspansi",
+       "parser-unstrip-loop-warning": "Luncatan buni kanyahoan",
+       "parser-unstrip-recursion-limit": "Wates rékursi buni kaleuwihi ($1)",
+       "converter-manual-rule-error": "Kasalahan kanyahoan dina aturan tarjamahan basa manual",
        "undo-success": "Éditan ieu bisa dibolaykeun. Mangga pariksa babandingan di handap pikeun mastikeun mémang anjeun miharep éta parobahan. Mun geus yakin, mangga simpen parobahanana pikeun ngabolaykeun éditan.",
        "undo-failure": "Éditan teu bisa dibolaykeun alatan kaselang ku éditan séjén.",
        "undo-norev": "Éditan ieu henteu bisa bolaykeun alatan kaca henteu kapanggih atawa geus dihapus.",
+       "undo-nochange": "Éditan nu patingpucunghul geus teu bisa dibolaykeun",
        "undo-summary": "←Ngabolaykeun révisi $1 ku [[Special:Contributions/$2|$2]] ([[User talk:$2|Obrolan]])",
        "undo-summary-username-hidden": "Bolaykeun révisi $1 ku pamaké nyumput",
-       "cantcreateaccount-text": "Nyieun rekening ti ieu alamat IP ('''$1''') dipeungpeuk ku [[User:$3|$3]].\n\nAlesanana $3 cenah ''$2''.",
+       "cantcreateaccount-text": "Nyieun akun ti ieu alamat IP ('''$1''') dipeungpeuk ku [[User:$3|$3]].\n\nAlesana $3 cenah ''$2''.",
        "cantcreateaccount-range-text": "Nyieun akun ti alamat IP dina rentang <strong>$1</strong>, kaasup alamat IP anjeun (<strong>$4</strong>), dipeungpeuk ku [[User:$3|$3]].\n\nAlesan $3 nyaéta <em>$2</em>",
        "viewpagelogs": "Tempo log kaca ieu",
        "nohistory": "Teu aya jujutan édit pikeun kaca ieu.",
        "page_first": "mimiti",
        "page_last": "tung-tung",
        "histlegend": "Pilihan béda: tandaan wadah buleud vérsina pikeun ngabandingkeun sarta pencét énter atawa tombol di handap.<br />\nKaterangan: (kiw) = bédana jeung vérsi kiwari,\n(ahir) = bédana jeung vérsi nu harita, m = éditan minor.",
-       "history-fieldset-title": "Sungsi jujutan",
-       "history-show-deleted": "Ukur nu dihapus",
+       "history-fieldset-title": "Paluruh vérsi heubeul",
+       "history-show-deleted": "Ukur ngahapus révisi",
        "histfirst": "pangheubeulna",
        "histlast": "panganyarna",
        "historysize": "($1 {{PLURAL:$1|bit|bit}})",
        "history-feed-title": "Sajarah révisi",
        "history-feed-description": "Sajarah révisi kaca ieu di wiki",
        "history-feed-item-nocomment": "$1 dina $2",
-       "history-feed-empty": "Kaca nu dipundut teu kapanggih.\nBisa jadi geus dihapus ti wiki atawa diganti ngaranna.\nCobaan [[Special:Search|sungsi di wiki]] pikeun kaca-kaca nu sarimbag.",
+       "history-feed-empty": "Kaca nu dipundut teu kapanggih.\nMeureun geus dihapus ti wiki atawa diganti ngaranna.\nCoba [[Special:Search|paluruh di wiki]] pikeun kaca-kaca anyar nu luyu.",
        "history-edit-tags": "Édit tag révisi anu dipilih",
        "rev-deleted-comment": "(rangkuman éditan dihapus)",
        "rev-deleted-user": "(ngaran pamaké geus dihapus)",
        "revdelete-legend": "Setél réstriksi révisi:",
        "revdelete-hide-text": "Téks révisi",
        "revdelete-hide-image": "Sumputkeun eusi gambar",
-       "revdelete-hide-name": "Sumputkeun lampah sarta udagan",
-       "revdelete-hide-comment": "Sumputkeun koméntar ngédit",
-       "revdelete-hide-user": "Sumputkeun ngaran pamaké/IP éditor",
+       "revdelete-hide-name": "Sumputkeun udagan sarta paraméter",
+       "revdelete-hide-comment": "Tingkesan ngédit",
+       "revdelete-hide-user": "Sandiasma/alamat IP éditor",
        "revdelete-hide-restricted": "Sumputkeun data boh ti kuncén atawa nu séjénna",
        "revdelete-radio-same": "(ulah dirobah)",
        "revdelete-radio-set": "Nyumput",
        "revdelete-unsuppress": "Hapus watesan kana révisi anu geus dipulangkeun",
        "revdelete-log": "Alesan:",
        "revdelete-submit": "Larapkeun kana {{PLURAL:$1|révisi|révisi}} nu dipilih",
-       "revdelete-success": "Visibilitas révisi geus dimutahirkeun.",
+       "revdelete-success": "Visibilitas révisi dianyarkeun.",
        "revdelete-failure": "'''Visibilitas révisi teu bisa diapdét:'''\n$1",
-       "logdelete-success": "Log pangatur nyumputkeun junun dilarapkeun.",
+       "logdelete-success": "Visibilitas log dilarapkeun.",
        "logdelete-failure": "'''Visibilitas log teu bisa disét:'''\n$1",
        "revdel-restore": "robah panémbong",
        "pagehist": "Sajarah kaca",
        "revdelete-hide-current": "Éror nyumputkeun anu titimangsana $2, $1: ieu téh révisi kiwari.\nTeu bisa disumputkeun.",
        "revdelete-show-no-access": "Éror némbongkeun anu titimangsana $2, $1: geus ditandaan \"diwates\".\nAnjeun teu diwenangkeun asup.",
        "revdelete-modify-no-access": "Éror ngarobah anu titimangsana $2, $1: geus ditandaan \"diwates\".\nAnjeun teu diwenangkeun asup.",
-       "revdelete-modify-missing": "Éror ngarobah anu IDna $2, $1: leungit ti pangkalan data!",
+       "revdelete-modify-missing": "Kasalahan ngaropéa ID $1: Horéng leungit ti pangkalan data!",
+       "revdelete-no-change": "<strong>Mangkahadé:</strong>Item tanggal $2, $1 geus mibanda  pangaturan visibilitas nu dipundut.",
        "revdelete-reason-dropdown": "*Alesan ngahapus umumna\n** Ngarumpak hakcipta\n** Émbaran pribadi anu teu perlu\n** Émbaranana bisa jadi pitnah",
        "revdelete-otherreason": "Alesan lianna:",
        "revdelete-reasonotherlist": "Alesan séjén",
        "mergehistory-empty": "Euweuh révisi nu bisa digabungkeun.",
        "mergehistory-done": "$3 {{PLURAL:$3|révisi|révisi}} tina $1 parantos digabung ka [[:$2]].",
        "mergehistory-fail": "Jujutan teu bisa digabungkeun! Mangga pariiksa deui paraméter kaca jeung titimangsana.",
+       "mergehistory-fail-bad-timestamp": "Stémpel waktu teu sah.",
+       "mergehistory-fail-invalid-source": "Kaca sumber teu sah.",
+       "mergehistory-fail-invalid-dest": "Kaca tujuan teu sah.",
        "mergehistory-no-source": "Sumber kaca $1 teu aya.",
        "mergehistory-no-destination": "Kaca nu dituju ($1) teu aya.",
        "mergehistory-invalid-source": "Kaca sumber kudu sohéh judulna.",
        "searchprofile-advanced-tooltip": "Paluruh di rohang ngaran anu tangtu",
        "search-result-size": "$1 ({{PLURAL:$2|1 kecap|$2 kecap}})",
        "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": "(alihan $1)",
+       "search-redirect": "(dipindahkeun ti $1)",
        "search-section": "(bagean $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(cocog jeung eusi berkas)",
        "search-interwiki-caption": "Proyék sawargi",
        "search-interwiki-default": "Hasil ti $1:",
        "search-interwiki-more": "(saterusna)",
+       "search-interwiki-more-results": "hasil lianna",
        "search-relatedarticle": "Patula-patali",
        "searchrelated": "patula-patali",
        "searchall": "sadayana",
        "mypreferences": "Préferénsi",
        "prefs-edits": "Jumlah éditan:",
        "prefsnologintext2": "Mangga asup log pikeun ngarobah préferénsi anjeun.",
-       "prefs-skin": "Kulit",
+       "prefs-skin": "Kalakop",
        "skin-preview": "Pramidang",
        "datedefault": "Tanpa préferénsi",
        "prefs-labs": "Fitur Labs",
        "prefs-watchlist": "Awaskeuneun",
        "prefs-editwatchlist": "Ropéa awaskeuneun",
        "prefs-editwatchlist-label": "Ropéa éntri anu aya dina awaskeuneun:",
+       "prefs-editwatchlist-clear": "Bersihan aawaseun anjeun",
        "prefs-watchlist-days": "Jumlah poé anu ditémbongkeun dina daptar awaskeuneun:",
        "prefs-watchlist-days-max": "Panglilana $1 {{PLURAL:$1|poé|poé}}",
        "prefs-watchlist-edits": "Jumlah parobahan maksimum nu ditémbongkeun dina daptar panjang awaskeuneun:",
        "prefs-watchlist-edits-max": "Panglobana: 1000",
+       "prefs-watchlist-token": "Token awaskeuneun:",
        "prefs-misc": "Pangaturan rupa-rupa",
        "prefs-resetpass": "Ganti sandi",
-       "prefs-changeemail": "Ganti alamat surélék",
+       "prefs-changeemail": "Ganti atawa pupus alamat surélék",
        "prefs-setemail": "Asupkeun alamat surélék",
        "prefs-email": "Pilihan surélék",
        "prefs-rendering": "Pidangan",
        "saveprefs": "Simpen préferénsi",
        "restoreprefs": "Larapkeun setélan buhun (sakabéh bab)",
        "prefs-editing": "Ukuran kotak téks",
-       "rows": "Baris",
-       "columns": "Kolom",
        "searchresultshead": "Aturan hasil néang",
        "stub-threshold": "Wates ambang pikeun format <a href=\"#\" class=\"stub\">tumbu taratas</a> (bit):",
+       "stub-threshold-sample-link": "conto",
        "stub-threshold-disabled": "Tumpur",
        "recentchangesdays": "Jumlah poé nu dipidangkeun dina Nu anyar robah:",
        "recentchangesdays-max": "Panglilana $1 {{PLURAL:$1|poé|poé}}",
        "youremail": "Surélék:",
        "username": "{{GENDER:$1|Sandiasma}}:",
        "prefs-memberingroups": "{{GENDER:$2|Anggota}} {{PLURAL:$1|kelompok|kelompok}}:",
+       "group-membership-link-with-expiry": "$1 (nepi ka $2)",
        "prefs-registration": "Waktu daptar:",
        "yourrealname": "Ngaran anjeun*",
        "yourlanguage": "Basa antarbeungeut",
        "yourvariant": "Varian basa eusi:",
-       "yournick": "Landihan anjeun (pikeun tawis leungeun)",
+       "yournick": "Tanda tangan:",
        "prefs-help-signature": "Pamanggih dina kaca sawala/obrolan kudu ditandaan \"<nowiki>~~~~</nowiki>\" nu bakal robah jadi tanda tangan anjeun jeung titimangsana.",
        "badsig": "Parafna teu valid; pariksa tag HTML-na geura.",
        "badsiglength": "Tawis leungeun panjang teuing. Kuduna kurang ti $1 {{PLURAL:$1|karaktér|karaktér}}.",
        "prefs-diffs": "Béda",
        "userrights": "Manajemén hak pamaké",
        "userrights-lookup-user": "Atur gorombolan pamaké",
-       "userrights-user-editname": "Asupkeun landihan:",
-       "editusergroup": "Édit Golongan Pamaké",
+       "userrights-user-editname": "Asupkeun sandiasma:",
+       "editusergroup": "Muat gorombolan pamaké",
        "editinguser": "Ngarobah hak kontributor '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Édit gorombolan pamaké",
        "saveusergroups": "Simpen Grup Pamaké",
        "userrights-reason": "Alesan:",
        "userrights-no-interwiki": "Anjeung teu diwenangkeun ngarobah hak pamaké dina wiki séjén.",
        "userrights-nodatabase": "Pangkalan data $1 euweuh atawa henteu lokal.",
-       "userrights-nologin": "Pikeun ngatur hak pamaké, anjeun kudu [[Special:UserLogin|asup log]] migunakeun rekening kuncén.",
-       "userrights-notallowed": "Akun anjeun teu boga kawenangan pikeun ngatur hak pamaké.",
        "userrights-changeable-col": "Jumplukan anu bisa Anjeun robah",
        "userrights-unchangeable-col": "Jumplukan anu teu bisa Anjeun robah",
+       "userrights-expiry-current": "Kadaluwarsa $1",
+       "userrights-expiry-none": "Teu kadaluwarsa",
+       "userrights-expiry": "Kadaluwarsa:",
+       "userrights-expiry-othertime": "Séjén waktu:",
        "group": "Gorombolan:",
        "group-user": "Pamaké",
        "group-autoconfirmed": "Pamaké anu otomatis dikonfirmasi",
        "group-bot": "Bot",
        "group-sysop": "Kuncén",
        "group-bureaucrat": "Birokrat",
-       "group-suppress": "Oversights",
+       "group-suppress": "Paneueul",
        "group-all": "(sadayana)",
        "group-user-member": "{{GENDER:$1|kontributor}}",
        "group-autoconfirmed-member": "{{GENDER:$1|kontributor anu otomatis dikonfirmasi}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|kuncén}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat}}",
-       "group-suppress-member": "{{GENDER:$1|pangawas}}",
+       "group-suppress-member": "{{GENDER:$1|paneueul}}",
        "grouppage-user": "{{ns:project}}:Pamaké",
        "grouppage-autoconfirmed": "{{ns:project}}:Pamaké anu otomatis dikonfirmasi",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Kuncén",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrat",
-       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "grouppage-suppress": "{{ns:project}}:Paneueul",
        "right-read": "Maca kaca",
        "right-edit": "Ngédit kaca",
        "right-createpage": "Nyieun kaca anyar (nu lain kaca obrolan)",
        "right-createtalk": "Nyieun kaca obrolan",
-       "right-createaccount": "Nyieun rekening anyar",
+       "right-createaccount": "Nyieun akun anyar",
        "right-minoredit": "Nandaan éditan minor",
        "right-move": "Mindahkeun kaca",
        "right-move-subpages": "Pindahkeun kaca katut sakabéh subkacana",
        "right-move-categorypages": "Pindahkeun kaca kategori",
        "right-movefile": "Mindahkeun berkas",
        "right-suppressredirect": "Henteu nyieun hiji alihan ti ngaran lila sabot mindahkeun kaca",
-       "right-upload": "Muatkeun koropak",
+       "right-upload": "Unjal berkas",
        "right-reupload": "Nimpah koropak nu geus aya",
        "right-reupload-own": "Nimpah koropak nu geus aya nu dimuat ku sorangan",
        "right-reupload-shared": "Nampik gambar-gambar dina média lokal babarengan",
-       "right-upload_by_url": "Muatkeun koropak ti hiji alamat URL",
+       "right-upload_by_url": "Unjal berkas tina alamat URL",
        "right-purge": "Ngahapus sindangan tina kaca tanpa kaca konfirmasi",
        "right-autoconfirmed": "Ngédit kaca nu semi dikonci",
        "right-bot": "Anggap salaku prosés otomatis",
        "right-protect": "Ngarobah hambalan protéksi jeung édit kaca anu dikonci",
        "right-editprotected": "Edit kaca anu dikonci salaku \"{{int:protect-level-sysop}}\"",
        "right-editinterface": "Édit antarbenget pamaké",
-       "right-editusercssjs": "Édit berkas CSS jeung JS pamaké séjén",
        "right-editusercss": "Édit berkas CSS pamaké séjén",
        "right-edituserjs": "Ngédit berkas JS pamaké séjén",
        "right-viewmywatchlist": "Tempo awaskeuneun anjeun",
        "right-userrights-interwiki": "Ngédit hak kontributor di wiki lianna",
        "right-siteadmin": "Ngonci jeung muka konci databés",
        "right-sendemail": "Kirim surélék ka pamaké séjén",
+       "grant-generic": "\"$1\" buntel hak aksés",
+       "grant-group-page-interaction": "Interaksi jeung kaca",
+       "grant-group-file-interaction": "Interaksi jeung média",
+       "grant-group-watchlist-interaction": "Interaksi jeung aawaseun anjeun",
+       "grant-group-email": "Kirim surélék",
+       "grant-group-private-information": "Aksés data pribadi ngeunaan anjeun",
+       "grant-group-other": "Lalampahan macem-macem",
+       "grant-blockusers": "Peungpeuk sarta teu meungpeuk pamaké",
+       "grant-createaccount": "Jieun akun",
+       "grant-createeditmovepage": "Jieun, édit, jeung alihkeun kaca",
+       "grant-delete": "Pupus kaca, révisi, jeung éntri log",
+       "grant-editmycssjs": "Édit CSS/JavaScript pamaké anjeun",
+       "grant-editmyoptions": "Édit préférénsi pamaké anjeun",
+       "grant-editmywatchlist": "Édit awaskeuneun anjeun",
+       "grant-editpage": "Édit kaca nu nyangkaruk",
+       "grant-editprotected": "Édit kaca nu dikonci",
+       "grant-highvolume": "Éditan nu rohaka",
+       "grant-oversight": "Sumputkeun pamaké jeung révisi neken",
+       "grant-patrol": "Aawas parobahan kaca",
+       "grant-privateinfo": "Info aksés pribadi",
+       "grant-protect": "Konci sarta buka konci kaca",
+       "grant-rollback": "Balikkeun parobahan kaca",
+       "grant-sendemail": "Kirim surélék ka pamaké séjén",
+       "grant-uploadeditmovefile": "Unjal, ganti, jeung alihkeun berkas",
+       "grant-uploadfile": "Unjal berkas anyar",
+       "grant-basic": "Aksés dasar",
+       "grant-viewdeleted": "Tempo berkas jeung kaca nu dihapus",
+       "grant-viewmywatchlist": "Tempo aawaseun anjeun",
        "newuserlogpage": "Log akun anyar",
        "newuserlogpagetext": "Di handap ieu béréndélan log pamaké anyar.",
        "rightslog": "Log hak pamaké",
        "action-edit": "édit kaca ieu",
        "action-createpage": "mitembeyan kaca anyar",
        "action-createtalk": "mitembeyan kaca obrolan",
-       "action-createaccount": "nyieun rekening pamaké ieu",
+       "action-createaccount": "jieun ieu akun pamaké",
        "action-history": "tempo jujutan ieu kaca",
        "action-minoredit": "nandaan ieu éditan salaku minor",
        "action-move": "mindahkeun ieu kaca",
        "action-upload_by_url": "ngamuat ieu berkas ti URL",
        "action-writeapi": "maké API",
        "action-delete": "ngahapus ieu kaca",
-       "action-deleterevision": "ngahapus ieu révisi",
+       "action-deleterevision": "mupus révisi",
+       "action-deletelogentry": "pupus éntri log",
        "action-deletedhistory": "nempo jujutan anu geus dihapus ti ieu kaca",
        "action-browsearchive": "milari kaca nu geus dihapus",
        "action-undelete": "ngabolaykeun hapusan ieu kaca",
        "action-editmywatchlist": "robah awaskeuneun anjeun",
        "action-viewmyprivateinfo": "tempo émbaran pribadi anjeun",
        "action-editmyprivateinfo": "robah émbaran pribadi anjeun",
+       "action-purge": "hapus sindangan ieu kaca",
        "nchanges": "$1 {{PLURAL:$1|parobahan|parobahan}}",
        "enhancedrc-history": "jujutan",
        "recentchanges": "Anyar robah",
        "recentchanges-label-plusminus": "Ukuran kaca robah sajumlah ieu bit",
        "recentchanges-legend-heading": "<strong>Pedaran:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (tempo ogé [[Special:NewPages|béréndélan kaca anyar]])",
+       "recentchanges-submit": "Témbongkeun",
+       "rcfilters-activefilters": "Panyaringan aktif",
+       "rcfilters-savedqueries-rename": "Robah ngaran",
+       "rcfilters-savedqueries-remove": "Hapus",
+       "rcfilters-savedqueries-new-name-label": "Ngaran",
+       "rcfilters-savedqueries-cancel-label": "Bolay",
+       "rcfilters-restore-default-filters": "Balikeun panyaringan bawaan",
+       "rcfilters-clear-all-filters": "Pupus sakumna panyaringan",
+       "rcfilters-search-placeholder": "Sarinh parobahan panganyarna (langlang atawa mimitian ngetik)",
+       "rcfilters-invalid-filter": "Panyaringan teu sah",
+       "rcfilters-filterlist-title": "Saringan",
+       "rcfilters-filterlist-whatsthis": "Naon ieu téh?",
+       "rcfilters-highlightbutton-title": "Hasil sorotan",
+       "rcfilters-highlightmenu-title": "Pilih warna",
+       "rcfilters-highlightmenu-help": "Pilih warna pikeun nyorot ieu properti",
+       "rcfilters-filterlist-noresults": "Taya saringan nu kapanggih",
+       "rcfilters-filtergroup-registration": "Padaptaran pamaké",
+       "rcfilters-filter-registered-label": "Kadaptar",
+       "rcfilters-filter-registered-description": "Éditor asup log",
+       "rcfilters-filter-unregistered-label": "Teu kadaptar",
+       "rcfilters-filter-unregistered-description": "Éditor nu teu asup log.",
+       "rcfilters-filtergroup-authorship": "Kontribusi kapangarangan",
+       "rcfilters-filter-editsbyself-label": "Éditan meunang anjeun",
+       "rcfilters-filter-editsbyself-description": "Kontribusi anjeun.",
+       "rcfilters-filter-editsbyother-label": "Éditan ku batur",
+       "rcfilters-filter-editsbyother-description": "Sakumna éditan iwal nu kuring.",
+       "rcfilters-filtergroup-userExpLevel": "Undakan mahér (pikeun pamaké kadaptar hungkul)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Padatang anyar",
+       "rcfilters-filter-user-experience-level-learner-label": "Palajar",
+       "rcfilters-filter-user-experience-level-experienced-label": "Pamaké pangpangalaman",
+       "rcfilters-filter-user-experience-level-experienced-description": "Leuwih ti 30 poé tina aktivitas jeung 500 éditan.",
+       "rcfilters-filtergroup-automated": "Kontribusi otomatis",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Éditan dipigawé ku parabot otomatis.",
+       "rcfilters-filter-humans-label": "Jalma (lain bot)",
+       "rcfilters-filter-humans-description": "Éditan dipigawé ku éditor jalma.",
+       "rcfilters-filtergroup-reviewstatus": "Status ulasan",
+       "rcfilters-filter-patrolled-label": "Diaawas",
+       "rcfilters-filter-patrolled-description": "Éditan ditandaan geus diaawas.",
+       "rcfilters-filter-unpatrolled-label": "Teu kaawaskeun",
+       "rcfilters-filter-unpatrolled-description": "Éditan teu ditandaan geus diawaskeun.",
+       "rcfilters-filtergroup-significance": "Kapentingan",
+       "rcfilters-filter-minor-label": "Éditan minor",
+       "rcfilters-filter-major-label": "Lain éditan minor",
+       "rcfilters-filter-major-description": "Éditan teu ditandaan minangka minor.",
+       "rcfilters-filtergroup-changetype": "Jinis parobahan",
+       "rcfilters-filter-pageedits-label": "Éditan kaca",
+       "rcfilters-filter-newpages-label": "Panyieunan kaca",
+       "rcfilters-filter-newpages-description": "Éditan nu nyieun kaca anyar.",
+       "rcfilters-filter-categorization-label": "Parobahan kategori",
+       "rcfilters-filter-logactions-label": "Tarékah kacatet",
+       "rcfilters-filtergroup-lastRevision": "Révisi kiwari",
+       "rcfilters-filter-lastrevision-label": "Révisi kiwari",
        "rcnotefrom": "Di handap ieu parobahan saprak <b>$2</b> (nu ditémbongkeun nepi ka <b>$1</b>).",
+       "rclistfromreset": "Rését pilihan kaping",
        "rclistfrom": "Témbongkeun nu anyar robah nepi ka $3 $2",
        "rcshowhideminor": "$1 éditan minor",
        "rcshowhideminor-show": "Témbongkeun",
        "rcshowhidemine": "$1 éditan kuring",
        "rcshowhidemine-show": "Témbongkeun",
        "rcshowhidemine-hide": "Sumputkeun",
-       "rclinks": "Témbongkeun $1 parobahan ahir dina $2 poé ahir<br />$3",
+       "rcshowhidecategorization": "$1 kategorisasi kaca",
+       "rcshowhidecategorization-show": "Témbongkeun",
+       "rcshowhidecategorization-hide": "Sumputkeun",
+       "rclinks": "Témbongkeun $1 parobahan panungtung ti $2 poé ka tukang",
        "diff": "béda",
        "hist": "juj",
        "hide": "sumputkeun",
        "newpageletter": "A",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ngawaskeun|ngawaskeun}}]",
-       "rc_categories": "Watesan nepi ka kategori (dipisah ku \"|\")",
-       "rc_categories_any": "Naon bae",
+       "rc_categories": "Watesan nepi ka kategori (dipisah ku \"|\"):",
+       "rc_categories_any": "Unggal nu kapilih",
        "rc-change-size-new": "$1 {{PLURAL:$1|bit|bit}} sanggeus robah",
        "newsectionsummary": "/* $1 */ bagean anyar",
-       "rc-enhanced-expand": "Témbongkeun rincian (butuh JavaScript)",
+       "rc-enhanced-expand": "Témbongkeun rincian",
        "rc-enhanced-hide": "Sumputkeun rincian",
        "rc-old-title": "Mimitina dijieun salaku \"$1\"",
        "recentchangeslinked": "Parobahan nu patali",
        "recentchangeslinked-summary": "Ieu kaca husus ngabéréndélkeun parobahan anyar anu numbu ti kaca husus (atawa uesi katagori husus). Kaca anu [[Special:Watchlist|diawaskeun]] némbongan '''kandel'''.",
        "recentchangeslinked-page": "Ngaran kaca:",
        "recentchangeslinked-to": "Témbongkeun parobahan ka kaca-kaca nu ditumbukeun ka kaca nu dimaksud",
-       "upload": "Muat berkas",
-       "uploadbtn": "Muatkeun koropak",
+       "recentchanges-page-added-to-category": "[[:$1]] ditambahkeun kana kategori",
+       "recentchanges-page-removed-from-category": "[[:$1]] dipupus tina kategori",
+       "autochange-username": "Parobahan otomatis MédiaWiki",
+       "upload": "Unjal berkas",
+       "uploadbtn": "Unjal berkas",
        "reuploaddesc": "Balik ka formulir muatan.",
+       "upload-tryagain": "Kirim paropéaan pedaran berkas",
        "uploadnologin": "Can asup log",
        "uploadnologintext": "Mangga $1 pikeun ngunggah berkas.",
        "upload_directory_read_only": "Diréktori muatan ($1) teu bisa ditulis ku server ramat.",
        "uploaderror": "Kasalahan muat",
        "upload-recreate-warning": "'''Awas: berkas nu ngaranna kitu geus kungsi dihapus atawa dipindahkeun.'''\n\nLog hahapus jeung pipindah pikeun ieu kaca dipidangkeun di handap:",
-       "uploadtext": "<strong>HEUP!</strong> Méméh anjeun ngamuat di dieu, pastikeun yén anjeun geus maca sarta tumut ka kawijakan maké gambar.\n\nMun geus aya koropak na wiki nu ngaranna sarua jeung nu disebutkeun ku anjeun, koropak nu geus lila bakal diganti otomatis. Mangka, iwal ti pikeun ngaropéa hiji koropak, tangtu leuwih hadé mun anjeun mariksa heula bisi koropak nu sarupa geus aya.\n\nPikeun némbongkeun atawa néang gambar-gambar nu pernah dimuat saméméhna, mangga lebet ka [[Special:FileList|daptar gambar nu dimuat]]. Muatan sarta hapusan kadaptar dina log [[Special:Log/upload|log muatan]].\n\nPaké formulir di handap pikeun ngamuat koropak gambar anyar pikeun ilustrasi kaca anjeun. Na kalolobaan panyungsi, anjeun bakal manggihan tombol \"Sungsi/''Browse''...\", nu bakal nganteur ka dialog muka-koropak nu baku na sistim operasi anjeun. Milih hiji koropak bakal ngeusian ngaran koropakna kana rohangan téks gigireun tombol nu tadi. Anjeun ogé kudu nyontréng kotak nu nandakeun yén anjeun teu ngarumpak hak cipta batur ku dimuatna ieu koropak. Pencét tombol \"Muatkeun/''Upload''\" pikeun ngeréngsékeun muatan. Prosés ieu bisa lila mun anjeun migunakeun sambungan internét nu lambat.\n\nFormat nu dianjurkeun nyéta JPEG pikeun gambar fotografik, PNG pikeun hasil ngagambar sarta gambar séjénna, sarta OGG pikeun sora. Pilih ngaran koropak nu déskriptif sangkan teu ngalieurkeun. Pikeun ngasupkeun gambarna na kaca séjén, pigunakeun tumbu dina wujud\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Gambar.jpg]]</nowiki></code>''' pikeun gambar dina ukuran aslina\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' pikeun sora.\n\nCatet yén salaku kaca wiki, nu séjén bisa ngarobah atawa ngahapus muatan anjeun mun maranéhna nganggap ieu saluyu jeung kapentingan proyék, sarta anjeun bisa waé dipeungpeuk ti ngamuat koropak mun anjeun ngaruksak/ngaganggu sistim.",
+       "uploadtext": "Gunakeun formulir di handap pikeun ngunjal berkas.\nPikeun midangkeun atawa maluruh berkas anu saméméhna diunjal, sorang [[Special:FileList|daptar berkas]]. Unjalan (ulang) ogé kacatet kana [[Special:Log/upload|log unjalan]], sedengkeun pamupusan mah kacatetna dina [[Special:Log/delete|log pamupusan]].\n\nPikeun midangkeun atawa nerapkeun berkas kana kaca mah migunakeun tutumbu salah sahiji format di handap:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></code>''' pikeun midangkeun berkas dina ukuran aslina\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|téks alternatif]]</nowiki></code>''' pikeun midangkeun berkas nu rubakna 200px na jero kotak, nitih di kéncaeun kaca bari aya tulisan 'téks alternatif' minangka kamandang gambar\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' minangka tutumbu langsung kana berkas anu dimaksud tanpa kudu midangkeun éta berkas liwat wiki",
        "upload-permitted": "Tipeu koropak nu diwidian: $1.",
        "upload-preferred": "Tipeu koropak nu dianjurkeun: $1.",
        "upload-prohibited": "Tipeu koropak nu dicaram: $1.",
        "filetype-banned": "Jenis berkas ieu dipahing.",
        "verification-error": "Ieu berkas teu lulus vérifikasi.",
        "illegal-filename": "Ngaran berkas dipahing.",
+       "unknown-error": "Aya kasalahan anu teu dikanyahoankeun.",
        "tmp-create-error": "Teu bisa nyieun berkas sementara.",
        "tmp-write-error": "Éror nulis berkas sementara.",
        "large-file": "Hadéna mah koropak nu dimuat téh teu leuwih ti $1 bit; ieu koropak gedéna $2 bit.",
        "largefileserver": "Ieu koropak badag teuing, ngaleuwihan wates nu diwenangkeun ku server.",
        "emptyfile": "Koropak nu dimuatkeun ku anjeun jigana kosong. Hal ieu bisa jadi alatan sarupaning ''typo'' na ngaran koropakna. Mangga parios deui yén anjeun leres-leres hoyong ngamuat koropak éta.",
        "windows-nonascii-filename": "Ieu wiki teu ngarojong ngaran berkas anu maké aksara husus.",
-       "fileexists": "Koropak nu ngaranna kieu geus aya, mangga parios <strong>[[:$1]]</strong> mun anjeun teu yakin rék ngaganti.\n[[$1|thumb]]",
+       "fileexists": "Berkas nu ngaranna kieu geus aya, mangga parios <strong>[[:$1]]</strong> mun {{GENDER:|anjeun}} teu yakin rék ngaganti.\n[[$1|thumb]]",
        "fileexists-extension": "Geus aya berkas anu ngaranna sarupa: [[$2|thumb]]\n* Ngaran berkas nu dimuat: <strong>[[:$1]]</strong>\n* Ngaran berkas nu geus aya: <strong>[[:$2]]</strong>\nPilih ngaran séjén.",
        "fileexists-forbidden": "Berkas  nu ngaranna kitu geus aya sarta teu bisa ditimpah.\nMun anjeun keukeuh rék ngunggahkeun berkas anjeun, mangga balik deui sarta paké ngaran anyar.\n[[File:$1|thumb|center|$1]]",
-       "fileexists-shared-forbidden": "Koropak nu ngaranna ieu geus aya dina gudang koropak babagi (''shared file repository''); mangga balik deui sarta muatkeun koropak ieu maké ngaran nu béda. [[File:$1|thumb|center|$1]]",
-       "file-exists-duplicate": "Gambar ieu duplikat sareng {{PLURAL:$1|gambar|gambar}}:",
+       "fileexists-shared-forbidden": "Gening berkas téh geus aya nu ngaranna sarua dina répositori berkas reujeung.\nMun anjeun keukeuh hayang ngunjal ieu berkas, sok ganti heula ngaranna ku ngaran nu béda. [[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "Ieu berkas téh duplikat jeung nu di handap {{PLURAL:$1|berkas}}:",
        "file-deleted-duplicate": "Berkas anu sarua jeung [[:$1]] geus kungsi dihapus.\nPariksa heula jujutan hapusanana saméméh neruskeun ngamuat deui éta berkas.",
        "uploadwarning": "Pépéling ngamuat",
        "uploadwarning-text": "Ropéa pedaran berkas di handap terus cobaan deui.",
        "copyuploaddisabled": "Unggahan dumasar URL ditumpurkeun.",
        "uploaddisabledtext": "Fungsi ngamuat koropak ditumpurkeun.",
        "uploadscripted": "Koropak ieu ngandung kode HTML atawa skrip nu bisa dibaca ngaco ku panyungsi ramat (''web browser'').",
+       "uploadinvalidxml": "XML na berkas nu diunjal teu bisa didadarkeun.",
        "uploadvirus": "Koropakna ngandung virus! Katrangan: $1",
        "upload-source": "Koropak sumber",
        "sourcefilename": "Ngaran koropak sumber:",
        "upload-file-error": "Kasalahan internal",
        "upload-misc-error": "Kasalahan muat anu teu kanyahoan",
        "upload-http-error": "Aya galat HTTP: $1",
+       "upload-dialog-title": "Unjal berkas",
+       "upload-dialog-button-cancel": "Bolay",
+       "upload-dialog-button-back": "Balik deui",
+       "upload-dialog-button-done": "Anggeus",
+       "upload-dialog-button-save": "Simpen",
+       "upload-dialog-button-upload": "Unjal",
+       "upload-form-label-infoform-title": "Wincikan",
+       "upload-form-label-infoform-name": "Ngaran",
+       "upload-form-label-infoform-description": "Pedaran",
+       "upload-form-label-usage-title": "Pamakéan",
+       "upload-form-label-usage-filename": "Ngaran berkas",
+       "upload-form-label-own-work": "Ieu mah karya kuring sorangan",
+       "upload-form-label-infoform-categories": "Kategori",
+       "upload-form-label-infoform-date": "Ping",
+       "backend-fail-stream": "Teu bisa malidkeun berkas \"$1\"",
        "backend-fail-backup": "Teu bisa nyadangkeun berkas \"$1\".",
        "backend-fail-notexists": "Berkas $1 euweuh.",
        "backend-fail-notsame": "Berkas anu teu-identik geus aya di $1.",
        "lockmanager-fail-db-release": "Teu bisa ngaleupaskeun konci dina databés $1.",
        "lockmanager-fail-svr-release": "Teu bisa ngaleupaskeun konci dina server $1.",
        "zip-wrong-format": "Berkas anu dipilih lain berkas ZIP.",
+       "uploadstash": "Unjal engkeunan",
+       "uploadstash-clear": "Bersihan berkas engkeunan",
+       "uploadstash-nofiles": "Anjeun teu boga berkas engkeunan.",
+       "uploadstash-errclear": "Mersihan berkas nu garagal.",
+       "uploadstash-refresh": "Nyegerken deui daptar berkas",
+       "uploadstash-thumbnail": "tempo miniatur",
        "img-auth-accessdenied": "Aksés ditolak",
        "img-auth-nofile": "Berkas \"$1\" henteu aya.",
+       "img-auth-streaming": "Palidan \"$1\".",
        "img-auth-noread": "Pamaké teu boga kawenangan maca \"$1\".",
        "http-invalid-url": "URL teu bener: $1",
        "http-invalid-scheme": "URL anu skémana \"$1\" teu karojong",
+       "http-read-error": "Kasalahan maca HTTP.",
+       "http-timed-out": "Pamundutan HTTP béakeun waktu.",
+       "http-curl-error": "Kasalahan keur nyokot URL: $1",
        "upload-curl-error6": "URL teu kahontal",
        "upload-curl-error28": "Seep waktos kanggo muatkeun",
        "license": "Lisénsi:",
        "upload_source_file": " (koropak dina komputer salira)",
        "listfiles-delete": "hapus",
        "listfiles-summary": "Ieu kaca husus némbongkeun sakabéh berkas anu geus diunggah.",
-       "listfiles_search_for": "Sungsi ngaran média:",
+       "listfiles_search_for": "Paluruh ngaran média:",
+       "listfiles-userdoesnotexist": "Akun pamaké \"$1\" teu kadaptar.",
        "imgfile": "Berkas",
        "listfiles": "Daptar gambar",
+       "listfiles_thumb": "Miniatur",
        "listfiles_date": "Titimangsa",
        "listfiles_name": "Ngaran",
        "listfiles_user": "Pamaké",
        "listfiles-latestversion-yes": "Enya",
        "listfiles-latestversion-no": "Henteu",
        "file-anchor-link": "Gambar",
-       "filehist": "Sajarah gambar",
+       "filehist": "Jujutan berkas",
        "filehist-help": "Klik dina titimangsa pikeun nempo koropak nu aya dina mangsa éta.",
        "filehist-deleteall": "hapus kabéh",
        "filehist-deleteone": "hapus",
        "filehist-datetime": "Titimangsa",
        "filehist-thumb": "Miniatur",
        "filehist-thumbtext": "'Thumbnail' pikeun vérsi mangsa $1",
+       "filehist-nothumb": "Taya miniatur",
        "filehist-user": "Kontributor",
        "filehist-dimensions": "Ukuran",
        "filehist-filesize": "Ukuran koropak",
        "nolinkstoimage": "Teu aya kaca anu nutumbu ka ieu berkas.",
        "sharedupload": "Ieu koropak téh ti $1 nu bisa jadi dipaké ku proyék-proyék lianna.",
        "sharedupload-desc-here": "Ieu berkas asalna ti $1 anu bisa jadi dipaké ku proyék séjén. \nPedaran ti [$2 kaca pedaranana] dipidangkeun di handap.",
+       "filepage-nofile": "Taya berkas nu ngaranna kieu.",
        "uploadnewversion-linktext": "ngamuatkeun vérsi anyar koropak ieu",
        "shared-repo-from": "ti $1",
        "upload-disallowed-here": "Anjeun teu bisa nimpah ieu berkas.",
        "filedelete-reason-dropdown": "*Alesan nu ilahar\n** Ngarumpak hak cipta\n** Koropak geus aya",
        "filedelete-edit-reasonlist": "Alesan ngahapus éditan",
        "filedelete-maintenance-title": "Henteu bisa ngahapus berkas",
-       "mimesearch": "Sungsi MIME",
+       "mimesearch": "Pamaluruhan MIME",
        "mimesearch-summary": "Ieu kaca bisa dipaké nyaring koropak dumasar tipeu MIME-na. Asupan: contenttype/subtype, contona <code>image/jpeg</code>.",
        "mimetype": "Tipeu MIME:",
        "download": "pulut",
        "unwatchedpages": "Kaca nu teu diawaskeun",
        "listredirects": "Daptar alihan",
+       "listduplicatedfiles": "Daptar berkas duplikat.",
        "unusedtemplates": "Citakan nu teu kapaké",
-       "unusedtemplatestext": "Ieu kaca ngabéréndélkeun sakabéh kaca dina spasi ngaran {{ns:template}} nu teu diwengku ku kaca séjén.\nSaméméh ngahapus, pariksa heula bisi aya tumbu ka ieu citakan.",
-       "unusedtemplateswlh": "tumbu lianna",
+       "unusedtemplatestext": "Ieu kaca ngabéréndélkeun sakabéh kaca dina rohang ngaran {{ns:template}} anu teu diwengku ku kaca séjén.\nSaméméh ngahapus, pariksa heula bisi aya tumbu ka ieu citakan.",
+       "unusedtemplateswlh": "tutumbu lianna",
        "randompage": "Kaca acak",
        "randompage-nopages": "Euweuh kaca dina ieu spasi ngaran \"$1\".",
        "randomincategory-category": "Kategori:",
+       "randomincategory-legend": "Kaca acak dina kategori",
+       "randomincategory-submit": "Jung",
        "randomredirect": "Alihan acak",
        "randomredirect-nopages": "Euweuh alihan dina ieu spasi ngaran \"$1\".",
        "statistics": "Statistik",
        "statistics-articles": "Halaman eusi",
        "statistics-pages": "Kaca",
        "statistics-pages-desc": "Sakabéh kaca di ieu wiki, kaasup kaca obrolan, alihan, jeung nu lianna.",
-       "statistics-files": "Koropak nu geus dimuat",
+       "statistics-files": "Berkas nu geus diunjal",
        "statistics-edits": "Ëditan kaca ti saprak {{SITENAME}} mimiti dibuka",
        "statistics-edits-average": "Rata-rata éditan unggal kaca",
        "statistics-users": "[[Special:ListUsers|Kontributor]] kadaptar",
        "statistics-users-active": "Pamaké getol",
        "statistics-users-active-desc": "Kontributor nu ngoprék salila {{PLURAL:$1|poé|$1 poé}} panungtung",
+       "pageswithprop": "Kaca ku kaca properti",
+       "pageswithprop-prop": "Ngarab properti:",
        "pageswithprop-submit": "Jung",
        "doubleredirects": "Alihan ganda",
        "doubleredirectstext": "Ieu kaca ngabéréndélkeun kaca-kaca alihan ka kaca alihan lianna. Unggal baris ngandung tutumbu ka alihan kahiji jeung kadua, ogé tujul alihan kadua anu biasana tujul kaca anu \"bener\", anu sakuduna dituju ku alihan kahiji. Ëntri nu <del>dicorét</del> geus diropéa.",
        "brokenredirectstext": "Alihan di handap numbu ka kaca nu teu aya:",
        "brokenredirects-edit": "édit",
        "brokenredirects-delete": "hapus",
-       "withoutinterwiki": "Kaca-kaca tanpa tumbu basa",
+       "withoutinterwiki": "Kaca-kaca tanpa tutumbu basa",
        "withoutinterwiki-summary": "Kaca-kaca di handap ieu teu numbu ka vérsi basa séjén:",
        "withoutinterwiki-legend": "Prefiks",
        "withoutinterwiki-submit": "Témbongkeun",
        "nbytes": "$1 {{PLURAL:$1|bait|bait}}",
        "ncategories": "$1 {{PLURAL:$1|kategori|kategori}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwiki}}",
-       "nlinks": "$1 {{PLURAL:$1|tumbu|tumbu}}",
+       "nlinks": "$1 {{PLURAL:$1|tutumbu}}",
        "nmembers": "$1 {{PLURAL:$1|kontributor|kontributor}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|anggota|anggota}}",
        "nrevisions": "$1 {{PLURAL:$1|révisi|révisi}}",
        "lonelypagestext": "Kaca-kaca di handap ieu teu numbu ti kaca séjén di {{SITENAME}}.",
        "uncategorizedpages": "Kaca nu can dikategorikeun",
        "uncategorizedcategories": "Kategori nu can dikategorikeun",
-       "uncategorizedimages": "Gambar nu can dikategorikeun",
+       "uncategorizedimages": "Berkas anu can dikategorikeun",
        "uncategorizedtemplates": "Citakan nu can boga kategori",
        "unusedcategories": "Kategori nu teu kapaké",
-       "unusedimages": "Gambar-gambar nu teu kapaké",
+       "unusedimages": "Berkas nu teu kaparaké",
        "wantedcategories": "Kategori nu dipikabutuh",
        "wantedpages": "Kaca nu dipikabutuh",
+       "wantedpages-badtitle": "Judul teu sah dina kumpulan hasil: $1",
        "wantedfiles": "Berkas nu dipikabutuh",
        "wantedtemplates": "Citakan nu dipikabutuh",
        "mostlinked": "Nu panglobana numbu ka kaca séjén",
        "mostlinkedcategories": "Paling loba ditumbukeun ka kategori",
        "mostlinkedtemplates": "Citakan nu panglobana ditumbu",
        "mostcategories": "Artikel nu paling loba ngandung kategori",
-       "mostimages": "Nu panglobana numbu ka gambar",
+       "mostimages": "Berkas anu panglobana ditumbukeun",
        "mostrevisions": "Artikel nu pangmindengna dirévisi",
        "prefixindex": "Kabeh kaca maké awalan",
+       "prefixindex-submit": "Témbongkeun",
        "shortpages": "Kaca-kaca parondok",
        "longpages": "Kaca-kaca paranjang",
        "deadendpages": "Kaca buntu",
        "deadendpagestext": "Kaca-kaca di handap ieu teu numbu ka kaca séjén di {{SITENAME}}:",
        "protectedpages": "Kaca-kaca nu dikonci",
        "protectedpages-indef": "Ngan pikeun panangtayungan kalawan waktu nuteu kawates",
+       "protectedpages-noredirect": "Sumputkeun pangalihan",
        "protectedpagesempty": "Dina danget ieu, teu aya kaca nu dikonci dumasar kana ieu paraméter.",
        "protectedpages-timestamp": "Cap titimangsa",
        "protectedpages-page": "Kaca",
        "protectedpages-expiry": "Kadaluwarsa",
+       "protectedpages-performer": "Nangtayungan pamaké",
        "protectedpages-params": "Paraméter protéksi",
        "protectedpages-reason": "Alesan",
+       "protectedpages-submit": "Kaca pidangan",
        "protectedpages-unknown-timestamp": "Teu kanyahoan",
        "protectedpages-unknown-performer": "Pamaké henteu dipikawanoh",
        "protectedtitles": "Judul nu dikonci",
        "protectedtitlesempty": "Dina danget ieu, euweuh judul nu keur dikonci tina paraméter-paraméter éta.",
+       "protectedtitles-submit": "Judul pidangan",
        "listusers": "Daptar pamaké",
        "listusers-editsonly": "Témbongkeun ukur kontributor anu ngédit",
        "listusers-creationsort": "Éntépkeun dumasar titimangsa dijieun",
+       "listusers-desc": "Runtuykeun mudun",
        "usereditcount": "$1 {{PLURAL:$1|édit|édit}}",
        "usercreated": "{{GENDER:$3|Dijieun}} ping $1 tabuh $2",
        "newpages": "Kaca anyar",
-       "newpages-username": "Landihan:",
+       "newpages-submit": "Témbongkeun",
+       "newpages-username": "Sandiasma:",
        "ancientpages": "Kaca pangheubeulna",
        "move": "Pindahkeun",
        "movethispage": "Pindahkeun kaca ieu",
        "nopagetext": "Kaca anu Anjeun maksud henteu kapanggih.",
        "pager-newer-n": "{{PLURAL:$1|leuwih anyar 1|leuwih anyar $1}}",
        "pager-older-n": "{{PLURAL:$1|leuwih heubeul 1|leuwih heubeul $1}}",
-       "suppress": "Oversight",
+       "suppress": "Neueul",
        "querypage-disabled": "Ieu kaca husus ditumpurkeun ku alesan kinerja.",
+       "apihelp": "Pitulung API",
+       "apihelp-no-such-module": "Modul \"$1\" teu kapanggih.",
+       "apisandbox": "Kotrétan API",
+       "apisandbox-fullscreen": "Mekarkeun panél",
+       "apisandbox-unfullscreen": "Témbongkeun kaca",
+       "apisandbox-submit": "Jieun pundutan",
+       "apisandbox-reset": "Bersihan",
+       "apisandbox-retry": "Cobaan deui",
+       "apisandbox-loading": "Muatkeun info pikeun modul API \"$1\"...",
+       "apisandbox-helpurls": "Tutumbu pitulung",
+       "apisandbox-examples": "Conto",
+       "apisandbox-dynamic-parameters-add-label": "Tambah paraméter:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Ngaran paraméter",
+       "apisandbox-deprecated-parameters": "Paraméter basi",
+       "apisandbox-fetch-token": "Eusi token kalayan otomatis",
+       "apisandbox-submit-invalid-fields-title": "Sawatara kolom teu sah",
+       "apisandbox-results": "Hasil",
+       "apisandbox-sending-request": "Ngirim pundutan API...",
+       "apisandbox-loading-results": "Nampa hasil API...",
+       "apisandbox-request-selectformat-label": "Témbongkeun pundutan data minangka:",
+       "apisandbox-request-url-label": "URL pundutan:",
+       "apisandbox-request-json-label": "Pundut JSON:",
+       "apisandbox-continue": "Tuluykeun",
+       "apisandbox-continue-clear": "Bersihan",
+       "apisandbox-multivalue-all-values": "$1 (Kabéh ajén)",
        "booksources": "Sumber pustaka",
-       "booksources-search-legend": "Sungsi sumber buku",
+       "booksources-search-legend": "Paluruh sumber buku",
        "booksources-search": "Paluruh",
-       "booksources-text": "Di handap ieu ngabéréndélkeun tumbu ka loka-loka nu ngical buku, boh nu anyar atawa loakan, nu sugan uninga kana buku anu nuju dipilari:",
-       "booksources-invalid-isbn": "ISBN-na sigana henteu bener; pariksa deui bisi aya salah salin ti sumber aslina.",
-       "specialloguserlabel": "Pamaké:",
-       "speciallogtitlelabel": "Sasaran (judul atawa pamaké):",
+       "booksources-text": "Di handap ieu ngabéréndélkeun tutumbu ka loka-loka nu ngical buku, boh nu anyar atawa loakan, nu sugan uninga kana buku anu nuju dipilari:",
+       "booksources-invalid-isbn": "Sigana ISBN-na teu bener; pariksa deui bisi aya salah téplak ti sumber aslina.",
+       "specialloguserlabel": "Palaku:",
+       "speciallogtitlelabel": "Sasaran (judul atawa {{ns:user}}:sandiasma pikeun pamaké):",
        "log": "Log",
+       "logeventslist-submit": "Témbongkeun",
        "all-logs-page": "Sakabéh log umum",
        "alllogstext": "Béréndélan sakabéh log nu aya di {{SITENAME}}.\nBisa dipondokkeun ku cara milih tipe log, ngaran pamaké, atawa kaca nu dimaksud.",
        "logempty": "Taya item nu cocog dina log.",
        "log-title-wildcard": "Téangan judul nu dimimitian ku tulisan ieu",
+       "checkbox-select": "Pilih: $1",
+       "checkbox-all": "Sakumna",
+       "checkbox-none": "Kosong",
+       "checkbox-invert": "Balikkeun",
        "allpages": "Sadaya kaca",
        "nextpage": "Kaca salajengna ($1)",
        "prevpage": "Kaca saméméhna ($1)",
        "allpagesprefix": "Pintonkeun kaca dimimitian ku:",
        "allpagesbadtitle": "Judul kaca nu dibikeun teu bener atawa mibanda awalan antarbasa atawa antarwiki, nu ngandung karakter nu teu bisa dipaké dina judul.",
        "allpages-bad-ns": "{{SITENAME}} teu boga spasi ngaran \"$1\".",
+       "allpages-hide-redirects": "Sumputkeun pangalihan",
+       "cachedspecial-refresh-now": "Tempo nu panganyarna.",
        "categories": "Kategori",
+       "categories-submit": "Témbongkeun",
        "categoriespagetext": "{{PLURAL:$1|Kategori|Kategori}} ngandung kaca atawa média.\n[[Special:UnusedCategories|Kategori nu teu kapaké]] henteu ditémbongkeun di dieu.\nBaca ogé [[Special:WantedCategories|kategori nu dipikabutuh]].",
        "categoriesfrom": "Tembongkeun kategori-kategori dimimitian ku:",
        "deletedcontributions": "Kontribusi nu dihapus",
        "deletedcontributions-title": "Kontribusi nu dihapus",
        "sp-deletedcontributions-contribs": "kontribusi",
-       "linksearch": "Tumbu kaluar",
-       "linksearch-pat": "Pola sungsi:",
+       "linksearch": "Pamaluruhan tutumbu luar",
+       "linksearch-pat": "Pola pamaluruhan:",
        "linksearch-ns": "Spasi ngaran:",
-       "linksearch-ok": "Sungsi",
+       "linksearch-ok": "Paluruh",
        "linksearch-text": "''Wildcard'' sarupaning \"*.wikipedia.org\" bisa dipaké.<br />Protokol nu dirojong: $1",
        "linksearch-line": "$1 ditumbu ti $2",
        "linksearch-error": "''Wildcard'' ngan bisa némbongan dina awal ngaran indung (''host'').",
        "listgrouprights-removegroup-self": "Piceun {{PLURAL:$2|grup|grups}} ti akun sorangan: $1",
        "listgrouprights-addgroup-self-all": "Tambahkeun sakabéh grup ka akun sorangan",
        "listgrouprights-removegroup-self-all": "Piceun sakabéh grup ti akun sorangan",
+       "listgrants": "Idin",
+       "listgrants-grant": "Idin",
+       "listgrants-rights": "Hak",
+       "trackingcategories": "Kategori palacak",
+       "trackingcategories-msg": "Kategori palacak",
+       "trackingcategories-name": "Ngaran talatah",
+       "trackingcategories-desc": "Kritéria inklusi kategori",
+       "trackingcategories-nodesc": "Taya pedaran nu sayaga",
+       "trackingcategories-disabled": "Kategori dipareuman",
        "mailnologin": "Euweuh alamat ngirim",
        "mailnologintext": "Anjeun kudu '''[[Special:UserLogin|asup log]]''' sarta boga alamat surélék nu sah na [[Special:Preferences|préferénsi]] anjeun sangkan bisa nyurélékan pamaké séjén.",
        "emailuser": "Surélékan pamaké ieu",
+       "emailuser-title-target": "Kirim surélék ka ieu {{GENDER:$1|pamaké}}",
+       "emailuser-title-notarget": "Surélék pamaké",
        "emailpagetext": "Anjeun bisa maké formulir di handap pikeun ngirim surélék ka ieu pamaké.\nAlamat surélék nu diasupkeun kana [[Special:Preferences|préferénsi pamaké anjeun]] bakal katémbong salaku alamat \"Ti\" dina surélékna, sahingga nu dituju bisa males langsung.",
        "defemailsubject": "Surélék {{SITENAME}} ti pamaké \"$1\"",
        "usermaildisabled": "Surélék kontributor ditumpurkeun",
        "emailsenttext": "Surélék anjeun geus dikirim.",
        "emailuserfooter": "Ieu surélék dikirim ku $1 ka $2 migunakeun fungsi \"Surélékan pamaké ieu\" di {{SITENAME}}.",
        "usermessage-summary": "Ninggalkeun talatah sistem.",
+       "usermessage-editor": "Talatah sistim",
        "watchlist": "Awaskeuneun",
        "mywatchlist": "Awaskeuneun",
        "watchlistfor2": "Pikeun $1 $2",
        "nowatchlist": "Anjeun teu boga awaskeuneun.",
        "watchlistanontext": "Mangga asup log pikeun nempo atawa ngarobah béréndélan awaskeuneun anjeun.",
        "watchnologin": "Can asup log",
+       "addwatch": "Tambahkeun ka aawaseun",
        "addedwatchtext": "Kaca \"[[:$1]]\" geus ditambahkeun ka [[Special:Watchlist|awaskeuneun]] anjeun.\nJaga, parobahan na kaca ieu katut kaca obrolanana bakal dibéréndélkeun di dinya, sarta kacana bakal katémbong '''dikandelan''' dina kaca [[Special:RecentChanges|Nu anyar robah]] sangkan leuwih gampang ngawaskeunana.\n\n<p>Mun jaga anjeun moal deui ngawaskeun parobahan na kaca éta, klik tumbu \"Eureun ngawaskeun\" na lajursisi.",
        "removewatch": "Piceun tina béréndélan awaskeuneun",
        "removedwatchtext": "Kaca \"[[:$1]]\" geus dikaluarkeun tina [[Special:Watchlist|daptar awaskeuneun]] anjeun.",
        "wlheader-showupdated": "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
        "wlnote": "Di handap ieu mangrupa $1 {{PLURAL:$1|robahan|robahan}} ahir salila '''$2''' jam.",
        "wlshowlast": "Témbongkeun $1 jam $2 poé  ahir",
+       "watchlist-hide": "Sumputkeun",
+       "watchlist-submit": "Témbongkeun",
+       "wlshowtime": "Periodeu waktu ajang dipidangkeun:",
+       "wlshowhideminor": "éditan minor",
+       "wlshowhidebots": "bot",
+       "wlshowhideliu": "pamaké kadaptar",
+       "wlshowhideanons": "pamaké anonim",
+       "wlshowhidepatr": "éditan karoris",
+       "wlshowhidemine": "éditan kuring",
+       "wlshowhidecategorization": "kategorisasi kaca",
        "watchlist-options": "Pilihan awaskeuneun",
        "watching": "Ngawaskeun...",
        "unwatching": "Eureun ngawaskeun...",
        "enotif_reset": "Tandaan sadaya kaca nu geus dilongok",
        "enotif_impersonal_salutation": "Pamaké {{SITENAME}}",
        "enotif_subject_deleted": "Kaca {{SITENAME}} $1 geus {{GENDER:$2|dihapus}} ku $2",
-       "enotif_lastvisited": "Tempo $1 pikeun sadaya parobahan ti saprak anjeun ninggalkeun ieu kaca.",
-       "enotif_lastdiff": "Buka $1 pikeun nempo ieu parobahan.",
+       "enotif_lastvisited": "Pikeun sakumna parobahan ti saprak jebulan panungtung, tempo $1",
+       "enotif_lastdiff": "Pikeun nempo parobahan, ilikan $1",
        "enotif_anon_editor": "pamaké anonim $1",
        "enotif_body": "Sadérék $WATCHINGUSERNAME,\n\nKaca $PAGETITLE na {{SITENAME}} geus $CHANGEDORCREATED tanggal $PAGEEDITDATE ku $PAGEEDITOR. Mangga tingal {{SERVER}}{{localurl:$PAGETITLE}} pikeun vérsi kiwari.\n\n$NEWPAGE\n\nRingkesan éditor: $PAGESUMMARY $PAGEMINOREDIT\n\nKontak éditor:\nsurat {{SERVER}}{{localurl:Husus:Emailuser|target=$PAGEEDITOR}}\nwiki {{SERVER}}{{localurl:Pamaké:$PAGEEDITOR}}\n\nMun anjeun teu sindang deui ka ieu kaca, parobahan salajengna moal diémbarkeun. Anjeun bisa ogé nyetél deui umbul-umbul pikeun sadaya kaca nu aya na daptar awaseun anjeun.\n\n             Sistim émbaran {{SITENAME}} pikeun anjeun\n\n--\nPikeun ngarobah setélan dabtar awaseun anjeun, sindang ka {{SERVER}}{{localurl:Husus:Watchlist|edit=yes}}\n\nAsupan jeung bantuan salajengna:\n$HELPPAGE",
        "created": "geus dijieun",
        "delete-confirm": "Hapus \"$1\"",
        "delete-legend": "Hapus",
        "historywarning": "'''Awas:''' kaca nu rék dihapus mibanda jujutan kira $1  {{PLURAL:$1|révisi|révisi}}:",
+       "historyaction-submit": "Témbongkeun",
        "confirmdeletetext": "Anjeun rék ngahapus hiji kaca atawa gambar katut jujutanana tina pangkalan data, mangga yakinkeun yén anjeun mémang niat midamel ieu, yén anjeun ngartos kana sagala konsékuénsina, sarta yén anjeun ngalakukeun ieu saluyu jeung [[{{MediaWiki:Policy-url}}|kawijakan {{SITENAME}}]].",
        "actioncomplete": "Tarékah geus hasil",
        "actionfailed": "Tarékah gagal",
        "rollbacklink": "balikkeun",
        "rollbacklinkcount": "balikkeun $1 {{PLURAL:$1|éditan}}",
        "rollbackfailed": "Gagal malikkeun",
+       "rollback-missingrevision": "Teu bisa muatkeun révisi data.",
        "cantrollback": "Éditan teu bisa dibalikkeun; kontribusi panungtung ngarupakeun hiji-hijina panulis kaca ieu.",
        "alreadyrolled": "Teu bisa mulangkeun édit ahir [[$1]] ku [[User:$2|$2]] ([[User talk:$2|Obrolan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); geus aya nu ngédit atawa mulangkeun kacana.\n\nÉdit ahir ku [[User:$3|$3]] ([[User talk:$3|Obrolan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Komentar ngéditna: <em>$1</em>.",
        "revertpage": "Malikkeun éditan $2, diganti deui ka vérsi ahir ku $1",
        "rollback-success": "Mulangkeun éditan $1; balik deui ka vérsi panungtung ku $2.",
+       "sessionfailure-title": "Kagagalan sési",
        "sessionfailure": "Sigana aya masalah jeung termin log anjeun; peta ieu geus dibolaykeun salaku pépéling pikeun ngalawan ayana pangbajak. Mangga pencét \"back\" jeung muat ulang ti kaca asal anjeun, lajeng cobaan deui.",
+       "changecontentmodel-legend": "Robah modél kontén",
+       "changecontentmodel-title-label": "Judul kaca",
+       "changecontentmodel-model-label": "Modél kontén anyar",
+       "changecontentmodel-reason-label": "Alesan:",
+       "changecontentmodel-submit": "Parobahan",
+       "changecontentmodel-success-title": "Modél ieu kontén geus dirobah",
+       "changecontentmodel-emptymodels-title": "Taya modél kontén nu sayaga",
+       "log-name-contentmodel": "Log parobahan modél kontén",
+       "logentry-contentmodel-change-revertlink": "balikkeun",
+       "logentry-contentmodel-change-revert": "balikkeun",
        "protectlogpage": "Log_koncian",
        "protectlogtext": "Di handap ieu mangrupa daptar koncian kaca. Tempo [[Special:ProtectedPages|kaca nu dikonci]] pikeun iber leuwih lengkep.",
        "protectedarticle": "ngonci $1",
        "modifiedarticleprotection": "hambalan koncian \"[[$1]]\" geus dirobah",
-       "unprotectedarticle": "muka konci $1",
+       "unprotectedarticle": "muka konci tina \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Nangtayungan}} \"[[$1]]\"",
        "protect-title": "Ngonci \"$1\"",
        "prot_1movedto2": "mindahkeun [[$1]] ka [[$2]]",
+       "protect-norestrictiontypes-title": "Kaca nu teu karaksa",
        "protect-legend": "Konfirmasi ngonci",
        "protectcomment": "Alesan:",
        "protectexpiry": "Kadaluwarsa",
        "protect_expiry_old": "Waktu kadaluwarsa geus kaliwat.",
        "protect-text": "Di dieu anjeun bisa nempo sarta ngarobah hambalan pangonci pikeun kaca '''$1'''.",
        "protect-locked-blocked": "Anjeun teu bisa ngarobah hambalan koncian sabab keur dipeungpeuk. Setélan ayeuna pikeun kaca '''$1''' nyaéta:",
-       "protect-locked-access": "Rekening anjeun teu wenang ngarobah hambalan pangonci kaca. Kaca '''$1''' disetél:",
+       "protect-locked-access": "Akun anjeun teu wenang ngarobah hambalan pangonci kaca.\nSetélan kiwari pikeun kaca <strong>$1</strong>:",
        "protect-cascadeon": "Ieu kaca dikonci sabab kaasup {{PLURAL:$1|kaca nu|kaca-kaca nu}} ngajalankeun pangonci ngaruntuy. Anjeun bisa ngarobah hambalan koncian ieu kaca, tapi ieu moal mangaruhan pangonci ngaruntuyna.",
        "protect-default": "Bisa ku sakabeh pamaké",
-       "protect-fallback": "Kudu aya kawenangan \"$1\"",
+       "protect-fallback": "Ngan pikeun pamaké kalawan idin \"$1\"",
        "protect-level-autoconfirmed": "Peungpeuk pamaké anyar jeung nu teu daptar",
        "protect-level-sysop": "Ngan bisa ku kuncén",
        "protect-summary-cascade": "ngaruntuykeun",
        "restriction-edit": "Édit",
        "restriction-move": "Pindahkeun",
        "restriction-create": "Jieun",
-       "restriction-upload": "Muatkeun koropak",
+       "restriction-upload": "Unjal berkas",
        "restriction-level-sysop": "konci rékép",
        "restriction-level-autoconfirmed": "konci logor",
        "restriction-level-all": "sadaya hambalan",
        "undeletepagetitle": "'''Béréndélan révisi [[:$1]]''' anu dihapus.",
        "viewdeletedpage": "Témbongkeun kaca nu dihapus",
        "undeletepagetext": "{{PLURAL:$1|Kaca di handap ieu|Aya $1 kaca}}  geus dihapus tapi masih kénéh aya na arsip sarta bisa disimpen deui. Arsip aya kalana dibersihan.",
-       "undeleterevisions": "$1 {{PLURAL:$1|révisi|révisi}} diarsipkeun",
+       "undelete-fieldset-title": "Malikkeun révisi",
+       "undeleterevisions": "$1 {{PLURAL:$1|révisi}} dipupus",
        "undeletehistory": "Mun anjeun nyimpen deui kacana, sadaya révisi bakal disimpen deui dina jujutan.\nMun aya kaca anyar nu ngaranna sarua dijieun deui satutasna dihapus, révisi nu disimpen tadi bakal némbongan salaku jujutan nu ti heula, sarta révisi kiwari kaca nu hirup moal otomatis kaganti.",
        "undeletehistorynoadmin": "Artikel ieu geus dihapus.\nAlesanana bisa dibaca dina katrangan di handap, katut saha waé nu geus ngédit ieu artikel saméméh dihapus.\nTéks aktual révisi nu geus dihapus ieu ngan bisa dibuka ku kuncén.",
        "undelete-revision": "Révisi nu dihapus ti $1 (dina $5, $4) ku $3:",
        "undeletebtn": "Simpen deui!",
        "undeletelink": "tempo/pulangkeun",
        "undeleteviewlink": "tempo",
+       "undeleteinvert": "Balikkeun pilihan",
        "undeletecomment": "Alesan:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|révisi|révisi}} disimpen deui",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 révisi|$1 révisi}} jeung {{PLURAL:$2|1 berkas|$2 berkas}} geus dibalikkeun",
-       "undeletedfiles": "{{PLURAL:$1|1 berkas|$1 berkas}} dibalikkeun",
        "cannotundelete": "Gagal ngabolaykeun hapusan; sigana kapiheulaan ngabolaykeun hapusan ku nu séjén.",
        "undeletedpage": "'''$1 hasil dibalikeun'''\n\nTempo [[Special:Log/delete|log hapusan]] keur data ngahapus jeung malikeun.",
        "undelete-header": "Tempo [[Special:Log/delete|log hapusan]] pikeun béréndélan kaca nu anyar dihapus.",
+       "undelete-search-title": "Paluruh kaca kahapus",
        "undelete-search-box": "Téang kaca nu dihapus",
        "undelete-search-prefix": "Témbongkeun kaca dimimitian ku",
        "undelete-search-submit": "Téang",
        "undelete-bad-store-key": "Hanteu bisa ngabolaykeun hapusan révisi berkas titimangsa $1: Berkas leungit méméh dihapus.",
        "undelete-cleanup-error": "Éror ngahapus berkas arsip \"$1\" anu teu kapaké.",
        "undelete-missing-filearchive": "Hanteu bisa mulangkeun arsip berkas ID $1 kusabab teu kapanggih dina pangkalan data. Bisa jadi éta koropak bolay dihapus.",
+       "undelete-error": "Kasalahan malikkeun kaca",
        "undelete-error-short": "Éror ngabolaykeun hapusan: $1",
        "undelete-error-long": "Aya éror nalika ngabolaykeun hapusan:\n\n$1",
        "undelete-show-file-submit": "Enya",
        "namespace": "Ngaranspasi:",
        "invert": "Balikkeun pilihan",
        "tooltip-invert": "Contang ieu kotak pikeun nyumputkeun parobahan kaca-kaca dina ruang nama anu dipilih (jeung ruang nama anu tumali, lamun dicontang)",
+       "namespace_association": "Ngaranspasi nu patali",
+       "tooltip-namespace_association": "Céklis ieu kotak pikeun ngaitkeun ngaranspasi atawa judul ngaranspasi jeung ngaranspasi nu dipilih",
        "blanknamespace": "(Utama)",
        "contributions": "Kontribusi {{GENDER:$1|pamaké}}",
        "contributions-title": "Sumbangan tulisan ti $1",
        "month": "Ti bulan (jeung saméméhna):",
        "year": "Ti taun (jeung saméméhna):",
        "sp-contributions-newbies": "Témbongkeun kontribusi ti akun anyar wungkul",
-       "sp-contributions-newbies-sub": "Pikeun rekening anyar",
+       "sp-contributions-newbies-sub": "Pikeun akun anyar",
        "sp-contributions-blocklog": "log peungpeuk",
        "sp-contributions-deleted": "kontribusi nu dihapus",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-search": "Paluruh kontribusi",
        "sp-contributions-username": "Alamat IP atawa sandiasma:",
        "sp-contributions-toponly": "Témbongkeun éditan anu révisi panungtung wungkul",
+       "sp-contributions-hideminor": "Sumputkeun éditan minor",
        "sp-contributions-submit": "Paluruh",
        "whatlinkshere": "Anu nutumbu ka dieu",
        "whatlinkshere-title": "Kaca anu nutumbu ka \"$1\"",
        "whatlinkshere-prev": "$1 {{PLURAL:$1|saméméhna}}",
        "whatlinkshere-next": "$1 {{PLURAL:$1|salajengna}}",
        "whatlinkshere-links": "← tutumbu",
-       "whatlinkshere-hideredirs": "$1 alihan",
+       "whatlinkshere-hideredirs": "$1 pangalihan",
        "whatlinkshere-hidetrans": "$1 transklusi",
        "whatlinkshere-hidelinks": "$1 tutumbu",
        "whatlinkshere-hideimages": "$1 tutumbu berkas",
        "whatlinkshere-filters": "Saringan",
+       "whatlinkshere-submit": "Jung",
+       "autoblockid": "Otomatis peungpeuk #$1",
        "block": "Peungpeuk kontributor",
        "unblock": "Buka peungpeuk kontributor",
-       "blockip": "Peungpeuk pamaké",
+       "blockip": "Peungpeuk {{GENDER:$1|pamaké}}",
        "blockip-legend": "Peungpeuk pamaké",
        "blockiptext": "Paké formulir di handap pikeun meungpeuk aksés nulis ti alamat IP atawa ngaran pamaké husus. Ieu sakuduna ditujukeun pikeun nyegah vandalisme, sarta saluyu jeung [[{{MediaWiki:Policy-url}}|kawijakan]]. Eusi alesan nu jéntré (misal, ngarujuk kaca tinangtu nu geus diruksak).",
        "ipaddressorusername": "Alamat IP atawa sandiasma:",
        "ipbexpiry": "Kadaluarsa",
        "ipbreason": "Alesan:",
        "ipb-hardblock": "Nyegah pamaké anu asup log pikeun ngédit ti ieu alamat IP",
-       "ipbcreateaccount": "Tong bisa nyieun rekening",
+       "ipbcreateaccount": "Ulah bisa nyieun akun",
        "ipbemailban": "Henteu kaci pamaké ngirimkeun surélék",
        "ipbenableautoblock": "Peungpeuk sacara otomatis alamat IP anu panungtungan dipaké ku pamaké sarta sakabéh alamat IP anu kungsi dipaké.",
        "ipbsubmit": "Peungpeuk pamaké ieu",
        "ipboptions": "2 jam:2 hours,sapoé:1 day,3 poé:3 days,saminggu:1 week,2 minggu:2 weeks,sabulan:1 month,3 bulan:3 months,6 bulan:6 months,sataun:1 year,tanpa wates:infinite",
        "ipbhidename": "Sumputkeun ngaran pamaké tina éditan jeung daptar pamaké",
        "ipbwatchuser": "Awaskeun kaca pamaké jeung kaca obrolan pamaké ieu",
+       "ipb-confirm": "Konfirmasi peungpeuk",
        "badipaddress": "Alamat IP teu sah",
        "blockipsuccesssub": "Meungpeuk geus hasil",
        "blockipsuccesstext": "\"$1\" dipeungpeuk.\n<br />Tempo [[Special:BlockList|daptar peungpeuk IP]] pikeun nempoan deui peungpeuk.",
        "ipb-unblock": "Nyabut peungpeuk pamaké atawa alamat IP",
        "ipb-blocklist": "Tempo peungpeuk nu diteurapkeun",
        "ipb-blocklist-contribs": "Ilubiung $1",
+       "ipb-blocklist-duration-left": "Nyésa $1",
        "unblockip": "Buka peungpeuk pamaké",
        "unblockiptext": "Paké formulir di handap pikeun mulangkeun aksés nulis ka alamat IP atawa ngaran pamaké nu saméméhna dipeungpeuk.",
        "ipusubmit": "Buka peungpeuk pikeun pamaké ieu",
        "unblocked-range": "$1 geus teu dipeungpeuk",
        "unblocked-id": "peungpeuk $1 geus dicabut",
        "blocklist": "Kontributor nu dipeungpeuk",
+       "autoblocklist": "Otomatis peungpeuk",
+       "autoblocklist-submit": "Paluruh",
+       "autoblocklist-legend": "Daptar otomatis peungpeuk",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Otomatis peungpeuk}} lokal",
        "ipblocklist": "Pamaké nu dipeungpeuk",
        "ipblocklist-legend": "Téang pamaké nu dipeungpeuk",
+       "blocklist-userblocks": "Sumputkeun peungpeukan akun",
+       "blocklist-tempblocks": "Sumputkeun peungpeukan saheulaanan",
        "blocklist-timestamp": "Cap titimangsa",
+       "blocklist-target": "Udagan",
+       "blocklist-expiry": "Kadaluwarsa",
        "blocklist-by": "Kuncén nu meungpeuk",
+       "blocklist-params": "Paraméter peungpeukan",
        "blocklist-reason": "Alesan",
        "ipblocklist-submit": "Téang",
        "ipblocklist-localblock": "Blok lokal",
+       "ipblocklist-otherblocks": "{{PLURAL:$1|Peungpeukan}} lian",
        "infiniteblock": "tanpa wates",
        "expiringblock": "kadaluwarsa $1 jam $2",
        "anononlyblock": "ngan nu teu daptar",
        "noautoblockblock": "Otopeungpeuk ditumpurkeun",
-       "createaccountblock": "nyieun rekening dipeungpeuk",
+       "createaccountblock": "nyieun akun ditumpurkeun",
        "emailblock": "surélek di peungpeuk",
        "blocklist-nousertalk": "teu bisa ngarobah kaca obrolan sorangan",
        "ipblocklist-empty": "Daptar peungpeuk kosong.",
-       "ipblocklist-no-results": "Alamat IP atawa landihan pamaké nu dipundut teu dipeungpeuk.",
+       "ipblocklist-no-results": "Alamat IP atawa sandiasma nu dipundut teu dipeungpeuk.",
        "blocklink": "blokir",
        "unblocklink": "buka blokir",
        "change-blocklink": "Robah status blokir",
        "proxyblocker": "Pameungpeuk proxy",
        "proxyblockreason": "Alamat IP anjeun dipeungpeuk sabab mangrupa proxy muka. Mangga tepungan ''Internet service provider'' atanapi ''tech support'' anjeun, béjakeun masalah serius ieu.",
        "sorbsreason": "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL anu dipaké ku {{SITENAME}}.",
-       "sorbs_create_account_reason": "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL. Anjeun teu bisa nyieun rekening",
+       "sorbs_create_account_reason": "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL. Anjeun teu bisa nyieun akun",
        "ipbblocked": "Anjeun teu bisa meungpeuk atawa muka peungpeuk séjén kontributor ku sabab anjeun sorangan keur dipeungpeuk",
        "lockdb": "Konci pangkalan data",
        "unlockdb": "Buka konci pangkalan data",
        "unlockdbsuccesssub": "Konci pangkalan data geus dibuka",
        "lockdbsuccesstext": "pangkalan data dikonci.\n<br />Ulah poho muka konci mun geus bérés diropéa.",
        "unlockdbsuccesstext": "pangkalan data geus teu dikonci.",
+       "databaselocked": "Basis data geus kakonci.",
        "databasenotlocked": "Gudang data teu kakonci.",
        "move-page": "Pindahkeun $1",
        "move-page-legend": "Pindahkeun kaca",
        "movenologintext": "Anjeun kudu jadi pamaké nu kadaptar tur [[Special:UserLogin|asup log]] pikeun mindahkeun kaca.",
        "movenotallowed": "Anjeung teu boga kawenangan mindahkeun kaca.",
        "movenotallowedfile": "Anjeung teu boga kawenangan mindahkeun kaca.",
-       "newtitle": "Ka judul anyar",
+       "newtitle": "Judul anyar:",
        "move-watch": "Awaskeuneun kaca ieu",
        "movepagebtn": "Pindahkeun kaca",
        "pagemovedsub": "Mindahkeun geus hasil!",
        "movepage-moved": "'''\"$1\" geus dipindahkeun ka \"$2\"'''",
+       "movepage-moved-redirect": "Alihan geus dijieunkeun.",
        "articleexists": "Kaca nu ngaranna kitu geus aya, atawa ngaran nu dipilih ku anjeun teu sah. Mangga pilih ngaran séjén.",
        "cantmove-titleprotected": "Anjeun teu bisa mindahkeun kaca ka dieu, sabab éta judul dikonci",
        "movetalk": "Mun bisa, kaca \"obrolan\" ogé pindahkeun.",
        "imagetypemismatch": "Éksténsi berkas anyar teu cocog jeung tipena",
        "imageinvalidfilename": "Ngaran berkas tujuan teu sah",
        "fix-double-redirects": "Hadéan sakabéh alihan ganda nu mungkin kajadian",
+       "move-leave-redirect": "Tinggalkeun alihan di tukang",
        "protectedpagemovewarning": "'''Awas:''' ieu kaca geus dikonci sarta ngan bisa dipindahkeun ku pamaké nu boga kawenangan kuncén.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
        "semiprotectedpagemovewarning": "'''Awas:''' ieu kaca geus dikonci sarta ukur bisa dipindahkeun ku pamaké nu geus asup log.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
        "export": "Ékspor kaca",
        "exporttext": "Anjeun bisa ngékspor téks sarta jujutan éditan ti kaca tinangtu atawa ti sababaraha kaca nu ngagunduk na sababaraha XML; ieu salajengna tiasa diimpor ka wiki séjén nu ngajalankeun software MediaWiki, ditransformasikeun, atawa ukur disimpen pikeun kaperluan anjeun pribadi.",
+       "exportall": "Ékspor sakumna kaca",
        "exportcuronly": "Asupkeun ukur révisi kiwari, teu sakabéh jujutan",
        "exportnohistory": "----\n'''Catetan:''' Ngékspor sakabéh jujutan éditan kaca ngaliwatan form ieu geus henteu diaktifkeun alatan alesan performance.",
        "export-submit": "Ékspor",
        "export-addns": "Tambahkeun",
        "export-download": "Simpen salaku berkas",
        "export-templates": "Kaasup citakan",
+       "export-manual": "Tambahkeun kaca manual:",
        "allmessages": "Talatah sistim",
        "allmessagesname": "Ngaran",
        "allmessagesdefault": "Téks ti dituna",
        "allmessagestext": "Ieu mangrupa daptar talatah sistim nu aya na spasi ngaran MediaWiki:.",
        "allmessagesnotsupportedDB": "Kaca ieu teu dirojong sabab '''$wgUseDatabaseMessages''' pareum.",
        "allmessages-filter-legend": "Ayakan",
+       "allmessages-filter-unmodified": "Teu diropéa",
        "allmessages-filter-all": "Kabéh",
+       "allmessages-filter-modified": "Diropéa",
        "allmessages-prefix": "Saring dumasar awalan:",
        "allmessages-language": "Basa:",
        "allmessages-filter-submit": "Jung",
+       "allmessages-filter-translate": "Tarjamahkeun",
        "thumbnail-more": "Gedéan",
        "filemissing": "Berkas leungit",
        "thumbnail_error": "Kasalahan sawaktu nyieun gambar leutik (thumbnail): $1",
        "import-interwiki-text": "Pilih wiki jeung judul kaca nu rék diimpor.\nTanggal révisi katut ngaran nu ngédit bakal dipertahankeun.\nSadaya aktivitas impor transwiki baris kacatet dina [[Special:Log/import|log impor]].",
        "import-interwiki-sourcewiki": "Wiki sumber:",
        "import-interwiki-sourcepage": "Kaca sumber:",
-       "import-interwiki-history": "Salin sakabéh vérsi jujutan pikeun ieu kaca",
+       "import-interwiki-history": "Téplak sakabéh vérsi jujutan pikeun ieu kaca",
        "import-interwiki-templates": "Kaasup sakabéh citakan",
        "import-interwiki-submit": "Impor",
        "import-upload-filename": "Ngaran berkas:",
        "importfailed": "Ngimpor gagal: $1",
        "importunknownsource": "Tipeu sumber impor teu dipikawanoh",
        "importcantopen": "Teu bisa muka koropak impor",
-       "importbadinterwiki": "Tumbu interwiki ruksak",
+       "importbadinterwiki": "Tutumbu antarwiki awon",
        "importsuccess": "Ngimpor geus hasil!",
        "importnosources": "Teu aya sumber impor transwiki nu geus dijieun tur ngamuat jujutan sacara langsung geus dinon-aktifkeun.",
        "importnofile": "Euweuh koropak impor nu dimuat.",
        "xml-error-string": "$1 dina baris $2, kolom $3 (bit $4): $5",
        "import-upload": "Ngamuat data XML",
        "import-invalid-interwiki": "Teu bisa ngimpor ti wiki nu dipilih.",
+       "import-rootpage-invalid": "Kaca turunan nu dibikeun judulna salah.",
        "importlogpage": "Log impor",
        "importlogpagetext": "Impor administratif kaca-kaca ti wiki séjén katut jujutanana.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|vérsi heubeul}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|vérsi heubel}} ti $2",
        "javascripttest": "Nguji JavaScript",
+       "javascripttest-pagetext-unknownaction": "Tarékah \"$1\" teu dipikanyaho.",
        "tooltip-pt-userpage": "Kaca {{GENDER:|pamaké anjeun}}",
        "tooltip-pt-anonuserpage": "Kaca pamaké pikeun IP nu ku anjeun keur diédit",
        "tooltip-pt-mytalk": "Kaca obrolan {{GENDER:|anjeun}}",
        "tooltip-pt-preferences": "Préferénsi {{GENDER:|anjeun}}",
        "tooltip-pt-watchlist": "Daptar kaca nu diawaskeun ku anjeun parobahanana.",
        "tooltip-pt-mycontris": "Béréndélan kontribusi {{GENDER:|anjeun}}",
-       "tooltip-pt-login": "Leuwih hadé asup log, sanajan teu wajib",
+       "tooltip-pt-login": "Leuwih hadé asup log, sok sanajan teu wajib",
+       "tooltip-pt-login-private": "Anjeun perlu asup log pikeun migunakeun ieu wiki",
        "tooltip-pt-logout": "Kaluar log",
        "tooltip-pt-createaccount": "Najan henteu kudu, Anjeun leuwih hadé nyieun akun sarta asup log",
        "tooltip-ca-talk": "Sawala ngeunaan eusi kaca",
        "tooltip-ca-viewsource": "Kaca ieu dikonci, tapi anjeun masih bisa muka sumberna.",
        "tooltip-ca-history": "Vérsi heubeul ieu kaca",
        "tooltip-ca-protect": "Konci kaca ieu",
+       "tooltip-ca-unprotect": "Robah protéksi ieu kaca",
        "tooltip-ca-delete": "Hapus kaca ieu",
        "tooltip-ca-undelete": "Simpen deui éditan kaca ieu nu geus dijieun saméméh dihapus",
        "tooltip-ca-move": "Pindahkeun kaca ieu",
        "tooltip-ca-watch": "Tambahkeun kaca ieu kana awaskeuneun kuring",
        "tooltip-ca-unwatch": "Kaluarkeun kaca ieu tina awaskeuneun kuring",
-       "tooltip-search": "Sungsi di {{SITENAME}}",
+       "tooltip-search": "Paluruh di {{SITENAME}}",
        "tooltip-search-go": "Jugjug kaca nu ngaranna ciples kieu (mun aya)",
-       "tooltip-search-fulltext": "Sungsi kaca-kaca nu ngandung tulisan ieu",
-       "tooltip-p-logo": "Tepas",
+       "tooltip-search-fulltext": "Paluruh kaca-kaca nu ngandung ieu tulisan",
+       "tooltip-p-logo": "Jugjug tepas",
        "tooltip-n-mainpage": "Sindang ka Tepas",
-       "tooltip-n-mainpage-description": "Jugjug Tepas",
+       "tooltip-n-mainpage-description": "Jugjug tepas",
        "tooltip-n-portal": "Ngeunaan proyékna, naon nu bisa dipigawé, di mana néanganana",
        "tooltip-n-currentevents": "Panggihan iber ngeunaan naon baé nu keur lumangsung",
        "tooltip-n-recentchanges": "Béréndélan nu anyar robah dina wiki",
-       "tooltip-n-randompage": "Muatkeun kaca naon baé",
+       "tooltip-n-randompage": "Muatkeun kaca acak",
        "tooltip-n-help": "Tempat pikeun néangan pitulung",
        "tooltip-t-whatlinkshere": "Béréndélan sakabéh kaca wiki anu nutumbu ka dieu",
        "tooltip-t-recentchangeslinked": "Anu anyar robah dina kaca-kaca anu nutumbu ti dieu",
        "tooltip-feed-rss": "Asupan RSS pikeun kaca ieu",
        "tooltip-feed-atom": "Asupan atom pikeun kaca ieu",
        "tooltip-t-contributions": "Béréndélan kontribusi ti {{GENDER:$1|ieu pamaké}}",
-       "tooltip-t-emailuser": "Kirim surélék ka ieu kontributor",
-       "tooltip-t-upload": "Ngunggahkeun berkas",
+       "tooltip-t-emailuser": "Kirim surélék ka {{GENDER:$1|ieu kontributor}}",
+       "tooltip-t-upload": "Unjal berkas",
        "tooltip-t-specialpages": "Daptar sadaya kaca husus",
        "tooltip-t-print": "Vérsi citakeun ieu kaca",
        "tooltip-t-permalink": "Tutumbu permanén ka ieu ieu vérsi",
        "tooltip-ca-nstab-category": "Témbongkeun kaca kategori",
        "tooltip-minoredit": "Tandaan ieu salaku éditan minor",
        "tooltip-save": "Simpen parobahan anjeun",
+       "tooltip-publish": "Pedalkeun parobahan anjeun",
        "tooltip-preview": "Tempo parobahanana, lamun geus bener pék simpen!",
        "tooltip-diff": "Témbongkeun parobahan mana nu geus dijieun.",
        "tooltip-compareselectedversions": "Tempo béda antara dua vérsi kaca ieu nu dipilih.",
        "tooltip-watch": "Tambahkeun kaca ieu kana awaskeuneun kuring",
-       "tooltip-upload": "Muatkeun",
+       "tooltip-watchlistedit-normal-submit": "Pupus judul",
+       "tooltip-watchlistedit-raw-submit": "Anyarkeun aawaseun",
+       "tooltip-upload": "Prung unjalkeun",
        "tooltip-rollback": "Mulangkeun éditan ka panulis panungtung dina sakali klik",
        "tooltip-undo": "\"Bolay\" malikkeun ieu éditan sarta muka kotak édit dina modeu pramidang.\nCara kieu bisa nambahkeun alesan dina ringkesanana.",
        "tooltip-preferences-save": "Simpen préferénsi",
        "common.js": "/* JavaScript nu aya didieu di angé ku kabeh ''skin'' */",
        "anonymous": "{{PLURAL:$1|Pamaké|Pamaké-pamaké}} anonim di {{SITENAME}}",
        "siteuser": "Pamaké $1 {{SITENAME}}",
-       "lastmodifiedatby": "Kaca ieu panungtungan dirobah $2, $1 ku $3.",
+       "anonuser": "Pamaké anonim {{SITENAME}} $1",
+       "lastmodifiedatby": "Kaca ieu panungtungan diédit $2, $1 ku $3.",
        "othercontribs": "Dumasar karya $1.",
        "others": "Séjénna",
        "siteusers": "{{PLURAL:$2|Pamaké|Pamaké-pamaké}} {{SITENAME}} $1",
        "creditspage": "Pangajén kaca",
        "nocredits": "Teu aya émbaran pangajén pikeun kaca ieu.",
        "spamprotectiontitle": "Saringan spam",
-       "spamprotectiontext": "Kaca nu rék disimpen dipeungpeuk ku saringan spam.\nSigana mah ieu téh alatan tumbu ka loka luar.",
+       "spamprotectiontext": "Kaca anu rék disimpen dipeungpeuk ku saringan spam.\nSigana mah ieu téh alatan tutumbu ka loka luar anu dibléklis.",
        "simpleantispam-label": "Pamariksaan anti-spam.\nAnu ieu <strong>ulah</strong> dieusian!",
        "pageinfo-title": "Émbaran pikeun \"$1\"",
        "pageinfo-header-basic": "Émbaran dasar",
        "pageinfo-header-edits": "Jujutan édit",
        "pageinfo-header-restrictions": "Protéksi kaca",
-       "pageinfo-watchers": "Jumlah nu ngawaskeun",
+       "pageinfo-header-properties": "Properti kaca",
+       "pageinfo-display-title": "Judul pidangan",
+       "pageinfo-article-id": "ID kaca",
+       "pageinfo-language": "Basa eusi kaca",
+       "pageinfo-language-change": "robah",
+       "pageinfo-content-model": "Modél kontén kaca",
+       "pageinfo-content-model-change": "robah",
+       "pageinfo-robot-policy": "Pangindékan ku robot",
+       "pageinfo-robot-index": "Digaékeun",
+       "pageinfo-robot-noindex": "Dicaram",
+       "pageinfo-watchers": "Jumlah paroris kaca",
+       "pageinfo-firstuser": "Panyieun kaca",
+       "pageinfo-lastuser": "Pangédit panungtung",
        "pageinfo-edits": "Jumlah éditan",
        "pageinfo-authors": "Jumlah kontributor nu béda",
        "pageinfo-toolboxlink": "Émbaran kaca",
+       "pageinfo-redirectsto": "Alihkeun ka",
+       "pageinfo-redirectsto-info": "info",
        "pageinfo-contentpage-yes": "Enya",
        "pageinfo-protect-cascading-yes": "Enya",
+       "pageinfo-category-info": "Info kategori",
+       "pageinfo-category-total": "Jumlah anggahota",
+       "pageinfo-category-pages": "Jumlah kaca",
+       "pageinfo-category-subcats": "Jumlah subkategori",
+       "pageinfo-category-files": "Jumlah berkas",
+       "pageinfo-user-id": "ID pamaké",
        "markaspatrolleddiff": "Tandaan salaku geus diriksa",
        "markaspatrolledtext": "Tandaan artikel ieu salaku geus diriksa",
        "markedaspatrolled": "Tandaan salaku geus diriksa",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Ieu minangka log pikeun révisi nu geus diroris.",
        "log-show-hide-patrol": "$1 log rorisan",
+       "log-show-hide-tag": "log tag $1",
+       "confirm-markpatrolled-button": "Heug",
        "deletedrevision": "Révisi heubeul nu dihapus $1",
        "filedeleteerror-short": "Éror nalika ngahapus koropak $1",
        "filedeleteerror-long": "Aya kasalahan sawaktu ngahapus koropak:\n\n$1",
        "previousdiff": "← Éditan saméméhna",
        "nextdiff": "Éditan salajengna →",
        "imagemaxsize": "Watesan gambar na kaca dadaran gambar nepi ka:",
+       "thumbsize": "Ukuran miniatur:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|kaca|kaca}}",
        "file-info": "ukuran koropak: $1, tipeu MIME: $2",
        "file-info-size": "$1 × $2 piksel, ukuran koropak: $3, tipeu MIME: $4",
        "file-info-size-pages": "$1 × $2 pixel, ukuran berkas: $3, tipeu MIME: $4, $5 {{PLURAL:$5|kaca|kaca}}",
        "file-nohires": "Euweuh résolusi nu leuwih luhur.",
        "svg-long-desc": "Koropak SVG, nominalna $1 × $2 piksel, ukuranana $3",
+       "svg-long-desc-animated": "Berkas SVG animasi, biasana $1 x $2 piksel, ukuran gambar: $3",
+       "svg-long-error": "Berkas SVG teu sah: $1",
        "show-big-image": "Berkas asli",
        "show-big-image-preview": "Ukuran ieu pramidang: $1.",
        "show-big-image-other": "{{PLURAL:$2|Resolusi}} lianna: $1.",
        "show-big-image-size": "$1 × $2 pixel",
+       "file-info-gif-looped": "nguriling",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|bingkéy}}",
+       "file-info-png-looped": "kuriling",
+       "file-info-png-repeat": "dipaénkeun $1 {{PLURAL:$1|kali}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|bingkéy}}",
        "newimages": "Galeri gambar anyar",
        "imagelisttext": "Di handap ieu daptar '''$1''' {{PLURAL:$1|gambar|gambar}} nu disusun $2.",
        "newimages-summary": "Ieu kaca husus ngabéréndélkeun koropak nu alanyar dimuat.",
+       "newimages-legend": "Saringan",
        "newimages-label": "Ngaran berkas (atawa sawaréh tina ngaranna):",
+       "newimages-user": "Alamat IP atawa sandiasma",
        "noimages": "Taya nanaon.",
-       "ilsubmit": "Sungsi",
+       "gallery-slideshow-toggle": "''Toggle'' miniatur",
+       "ilsubmit": "Paluruh",
        "bydate": "dumasar titimangsa",
        "sp-newimages-showfrom": "Témbongkeun gambar anyar ti $2, $1",
+       "seconds": "{{PLURAL:$1|sadetik|$1 detik}}",
+       "minutes": "{{PLURAL:$1|$1 menit}}",
+       "hours": "{{PLURAL:$1|$1 jam}}",
+       "days": "{{PLURAL:$1|$1 poé}}",
+       "weeks": "{{PLURAL:$1|$1 minggu}}",
+       "months": "{{PLURAL:$1|$1 bulan}}",
+       "years": "{{PLURAL:$1|$1 taun}}",
+       "ago": "$1 ka tukang",
+       "just-now": "cik kénéh",
+       "hours-ago": "$1 {{PLURAL:$1|jam}} ka tukang",
+       "minutes-ago": "$1 {{PLURAL:$1|menit}} ka tukang",
+       "seconds-ago": "$1 {{PLURAL:$1|detik}} ka tukang",
+       "monday-at": "Senén jam $1",
+       "tuesday-at": "Salasa jam $1",
+       "wednesday-at": "Rebo jam $1",
+       "thursday-at": "Kemis jam $1",
+       "friday-at": "Jumaah jam $1",
+       "saturday-at": "Saptu jam $1",
        "sunday-at": "Minggu jam $1",
+       "yesterday-at": "Kamari jam $1",
        "bad_image_list": "Formatna kieu:\n\nNgan daptar butiran (baris anu dimimitian ku tanda *) anu diitung. \nTutumbu kahiji dina hiji baris dianggap numbu ka berkas anu goréng. \nTutumbu sanggeusna dina baris anu sarua dianggap bener, nyaéta artikel anu midangkeun éta berkas.",
        "metadata": "Métadata",
        "metadata-help": "Ieu koropak ngandung émbaran tambahan, nu sigana asalna tina kaméra digital atawa paminday nu dipaké pikeun ngadigitalkeunana. Mun ieu koropak geus dirobah tina bentuk aslina, datana bisa jadi teu bener.",
        "metadata-fields": "Widang métadata gambar nu dibéréndélkeun di handap bakal dipidangkeun dina kaca gambar mun tabél métadata disumputkeun.\nNu séjénna bakal disumputkeun sakumaha asalna.\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": "Lega",
        "exif-imagelength": "Luhur",
+       "exif-bitspersample": "Bit per komponén",
        "exif-compression": "Skéma komprési",
        "exif-photometricinterpretation": "Komposisi piksel",
        "exif-orientation": "Oriéntasi",
        "exif-fnumber": "Nomer F",
        "exif-exposureprogram": "Program pajanan",
        "exif-spectralsensitivity": "Sénsitivitas spéktral",
-       "exif-brightnessvalue": "Lenglang",
+       "exif-isospeedratings": "Réting gagancangan ISO",
+       "exif-shutterspeedvalue": "Gagancangan rana APEX",
+       "exif-aperturevalue": "Bukaan APEX",
+       "exif-brightnessvalue": "Cacaangan APEX",
        "exif-exposurebiasvalue": "Bias pajanan",
+       "exif-maxaperturevalue": "Bukaan taneuh maksimum",
        "exif-subjectdistance": "Jarak subjék",
+       "exif-meteringmode": "Modeu pangukuran",
        "exif-lightsource": "Sumber cahya",
+       "exif-flash": "Buricak",
        "exif-focallength": "Panjang fokus lénsa",
+       "exif-subjectarea": "Aréa subyék",
+       "exif-flashenergy": "Énérgi burinyay",
        "exif-focalplanexresolution": "Résolusi X datar fokus",
        "exif-focalplaneyresolution": "Résolusi Y datar fokus",
        "exif-focalplaneresolutionunit": "Unit résolusi datar fokus",
        "exif-subjectlocation": "Perenah subjék",
+       "exif-exposureindex": "Indéks pajanan",
+       "exif-sensingmethod": "Metodeu panginderaan",
        "exif-filesource": "Sumber berkas",
        "exif-scenetype": "Tipe adegan",
+       "exif-customrendered": "Prosés jijieunan gambar",
        "exif-exposuremode": "Modeu pajanan",
+       "exif-whitebalance": "Kasaimbangan bodas",
        "exif-digitalzoomratio": "Rasio zum digital",
        "exif-focallengthin35mmfilm": "Panjang fokus dina film 35 mm",
        "exif-contrast": "Kontras",
        "exif-datetimeexpires": "Ulah dipaké sanggeus",
        "exif-datetimereleased": "Dirilis ping",
        "exif-originaltransmissionref": "Kodeu lokasi transmisi asli",
+       "exif-identifier": "Pawanoh",
        "exif-lens": "Lénsa nu dipaké",
        "exif-serialnumber": "Nomer séri kaméra",
        "exif-cameraownername": "Nu boga kaméra",
        "exif-copyrighted": "Status hak cipta",
        "exif-copyrightowner": "Nu nyepeng hak cipta",
        "exif-usageterms": "Katangtuan pamakéan",
-       "exif-webstatement": "Pertélaan hak salin onlén",
+       "exif-webstatement": "Pertélaan hak cipta onlén",
        "exif-originaldocumentid": "ID unik dokumén asli",
        "exif-licenseurl": "URL pikeun lisénsi hak cipta",
        "exif-morepermissionsurl": "Ëmbaran lisénsi lianna",
        "exif-personinimage": "Jalma nu digambarkeun",
        "exif-originalimageheight": "Jangkung gambar saméméh diteukteuk",
        "exif-originalimagewidth": "Lébar gambar saméméh diteukteuk",
+       "exif-compression-1": "Teu kakompres",
+       "exif-copyrighted-true": "Mihak cipta",
        "exif-copyrighted-false": "Domain publik",
        "exif-unknowndate": "Titimangsa teu kanyahoan",
        "exif-orientation-1": "Normal",
        "exif-lightsource-19": "Cahya baku C",
        "exif-lightsource-24": "Tungsten studio ISO",
        "exif-lightsource-255": "Sumber cahya séjén",
+       "exif-flash-fired-1": "Buricak hurung",
+       "exif-flash-mode-3": "modeu otomatis",
        "exif-focalplaneresolutionunit-2": "inci",
+       "exif-sensingmethod-1": "Teu kadéfinisi",
        "exif-scenetype-1": "Gambar poto langsung",
        "exif-customrendered-0": "Prosés normal",
        "exif-customrendered-1": "Prosés biasa",
        "exif-iimcategory-edu": "Atikan",
        "exif-iimcategory-evn": "Lingkungan",
        "exif-iimcategory-hth": "Kawaluyaan",
+       "exif-iimcategory-lab": "Katanagakerjaan",
+       "exif-iimcategory-lif": "Gaya hirup jeung rékréasi",
        "exif-iimcategory-pol": "Politik",
        "exif-iimcategory-rel": "Ageman jeung kayakinan",
+       "exif-iimcategory-sci": "Sayen jeung téknologi",
        "exif-iimcategory-soi": "Isu sosial",
        "exif-iimcategory-spo": "Olahraga",
        "exif-iimcategory-wea": "Cuaca",
        "exif-urgency-normal": "Normal ($1)",
+       "exif-urgency-low": "Landeuh ($1)",
+       "exif-urgency-high": "Luhur ($1)",
        "namespacesall": "kabéh",
        "monthsall": "kabéh",
        "confirmemail": "Konfirmasi alamat surélék",
        "confirmemail_noemail": "Alamat surélék anu didaptarkeun dina [[Special:Preferences|préferénsi pamaké]] anjeun teu sah.",
-       "confirmemail_text": "Wiki ieu merlukeun anjeun sangkan méré konfirmasi alamat surélék saméméh migunakeun fitur surélék. Aktifkeun tombol di handap pikeun ngirimkeun surat konfirmasi ka alamat anjeun. Suratna ngandung tumbu nu ngandung sandina; muatkeun tumbuna kana panyungsi anjeun pikeun ngonfirmasi yén alamat surélék anjeun sah.",
-       "confirmemail_pending": "Sandi konfirmasi geus dikirimkeun ka alamat surélék anjeun; mun kakara nyieun rekening, mangga antos sababaraha menit saméméh mundut sandi anyar.",
+       "confirmemail_text": "{{SITENAME}} téh anjeun kudu ngonfirmasi alamat surélék sangkan bisa migunakeun fiturna.\nKlik tombol di handap pikeun ngirimkeun talatah nu eusina konfirmasieun kana alamat anjeun. Eusi talatahna ngandung tutumbu kodeu; muatkeun tumbuna kana panyungsi anjeun pikeun ngonfirmasi yén alamat surélék anjeun sah.",
+       "confirmemail_pending": "Kecap sandi konfirmasi geus dikirimkeun ka alamat surélék anjeun; mun anyar nyieun akun, mangga antos sababaraha menit saméméh mundut kecap sandi anyar.",
        "confirmemail_send": "Kirimkeun surat konfirmasi sandi",
        "confirmemail_sent": "Surélék konfirmasi geus dikirim.",
        "confirmemail_oncreate": "Sandi konfirmasi geus dikirim ka alamat surélék anjeun. Éta sandi dipaké pikeun ngajalankeun fitur-fitur nu maké surélék di ieu wiki.",
        "confirmemail_success": "Alamat surélék anjeun geus dikonfirmasi, ayeuna anjeun geus bisa migunakeun wikina.",
        "confirmemail_loggedin": "Alamat surélék anjeun geus dikonfirmasi.",
        "confirmemail_subject": "Konfirmasi alamat surélék {{SITENAME}}",
-       "confirmemail_body": "Aya, sigana mah anjeun ti alamat IP $1, geus ngadaptarkeun rekening \"$2\" maké alamat surélék ieu na {{SITENAME}}.\n\nPikeun mastikeun yén rekening ieu mémang kagungan sarta ngakifkeun fitur surélék di {{SITENAME}}, buka tumbu di handap ieu kana panyungsi/''browser'' anjeun:\n\n$3\n\nLamun anjeun teu ngadaptarkeun rekening, turutkeun tumbu ieu pikeun ngabolaykeun konfirmasi alamat surélék:\n\n$5\n\nSandi konfirmasi ieu bakal kadaluwarsa dina $4.",
+       "confirmemail_body": "Aya, sigana mah anjeun, ti alamat IP $1,\ngeus ngadaptarkeun akun \"$2\" maké alamat surélék ieu di {{SITENAME}}.\n\nPikeun mastikeun yén ieu akun mémang kagungan, sarta ngaktipkeun fitur surélék di {{SITENAME}}, buka tutumbu di handap ieu dina panyungsi (''browser'') anjeun:\n\n$3\n\nLamun anjeun teu ngadaptarkeun ieu akun, turutkeun ieu tutumbu pikeun ngabolaykeun konfirmasi alamat surélék:\n\n$5\n\nSandi konfirmasi ieu bakal kadaluwarsa dina $4.",
        "confirmemail_invalidated": "Konfirmasi alamat surélék dibolaykeun",
        "invalidateemail": "Bolaykeun konfirmasi surélék",
        "scarytranscludedisabled": "[Transklusi interwiki ditumpurkeun]",
        "deletedwhileediting": "'''Awas''': ieu kaca geus dihapus nalika anjeun mitembeyan ngédit!",
        "confirmrecreate": "Pamaké [[User:$1|$1]] ([[User talk:$1|ngobrol]]) geus ngahapus artikel ieu nalika anjeun ngédit kalawan alesan:\n: ''$2''\nmangga pastikeun yén anjeun rék nyieun deui artikel ieu.",
        "recreate": "Jieun deui",
+       "confirm-purge-title": "Hapus sindangan ieu",
        "confirm_purge_button": "Heug",
        "confirm-purge-top": "Hapus sindangan kaca ieu?",
+       "confirm-watch-button": "Heug",
+       "confirm-unwatch-button": "Heug",
+       "confirm-unwatch-top": "Pupus ieu kaca tina aawaseun anjeun?",
+       "confirm-rollback-button": "Heug",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "&larr; kaca saacana",
        "imgmultipagenext": "kaca salajengna →",
        "imgmultigo": "Téang!",
        "imgmultigoto": "Jung ka kaca $1",
+       "img-lang-default": "(basa default)",
+       "img-lang-go": "Jung",
        "ascending_abbrev": "naék",
        "descending_abbrev": "turun",
        "table_pager_next": "Kaca salajengna",
        "table_pager_first": "Kaca mimiti",
        "table_pager_last": "Kaca tung-tung",
        "table_pager_limit": "Pidangkeun $1 éntri pér halaman",
+       "table_pager_limit_label": "Item per kaca:",
        "table_pager_limit_submit": "Téang",
        "table_pager_empty": "Nyamos",
        "autosumm-blank": "Ngosongkeun eusi kaca",
        "autosumm-replace": "Ngaganti kaca ku '$1'",
        "autoredircomment": "Mindahkeun ka [[$1]]",
        "autosumm-new": "Nyieun kaca anyar  $1",
+       "autosumm-newblank": "Nyieun kaca kosong",
        "lag-warn-normal": "Parobahan nu leuwih anyar ti $1 {{PLURAL:$1|detik|detik}} moal ditémbongkeun dina ieu béréndélan.",
        "lag-warn-high": "Kusabab kasibukan lag server pangkalan data, parobahan nu leuwih anyar $1 {{PLURAL:$1|detik|detik}} moal ditémbongkeun dina ieu béréndélan.",
        "watchlistedit-normal-title": "Édit daptar awaskeuneun",
        "watchlistedit-raw-done": "Daptar awaskeuneun geus diropéa.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 judul geus|$1 judul geus}} ditambahkeun:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 judul geus|$1 judul geus}} dikaluarkeun:",
+       "watchlistedit-clear-title": "Bersihan aawaseun",
+       "watchlistedit-clear-legend": "Bersihan aawaseun",
+       "watchlistedit-clear-titles": "Judul:",
        "watchlisttools-view": "Témbongkeun parobahan nu patali",
        "watchlisttools-edit": "Témbongkeun sarta édit béréndélan awaskeuneun",
        "watchlisttools-raw": "Robah béréndélan awaskeuneun",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|obrolan]])",
+       "timezone-local": "Lokal",
        "duplicate-defaultsort": "'''Awas''': Konci runtuyan asal \"$2\" ngalindih konci runtuyan asal \"$1\" anu saméméhna.",
        "version": "Vérsi",
        "version-extensions": "Éksténsi nu diinstal",
+       "version-skins": "Kalakop nu diinstal",
        "version-specialpages": "Kaca husus",
        "version-parserhooks": "Kait parser",
        "version-variables": "Variabel",
        "version-hook-subscribedby": "Didaptarkeun ku",
        "version-version": "($1)",
        "version-license": "Lisénsi MediaWiki",
+       "version-ext-license": "Lisénsi",
+       "version-ext-colheader-name": "Éksténsi",
+       "version-skin-colheader-name": "Kalakop",
+       "version-ext-colheader-version": "Vérsi",
+       "version-ext-colheader-license": "Lisénsi",
+       "version-ext-colheader-description": "Pedaran",
+       "version-ext-colheader-credits": "Pangarang",
+       "version-license-title": "Lisénsi pikeun $1",
+       "version-credits-title": "Krédit pikeun $1",
+       "version-poweredby-others": "séjénna",
        "version-poweredby-translators": "darmamurcaya translatewiki.net",
        "version-software": "Sopwér nu geus diinstal",
        "version-software-product": "Produk",
        "version-software-version": "Vérsi",
-       "fileduplicatesearch": "Sungsi gambar duplikat",
+       "version-entrypoints-header-url": "URL",
+       "version-libraries": "Pabukon kapasang",
+       "version-libraries-library": "Pabukon",
+       "version-libraries-version": "Vérsi",
+       "version-libraries-license": "Lisénsi",
+       "version-libraries-description": "Pedaran",
+       "version-libraries-authors": "Pangarang",
+       "redirect-submit": "Jung",
+       "redirect-lookup": "Ilikan:",
+       "redirect-value": "Ajén:",
+       "redirect-user": "ID pamaké",
+       "redirect-page": "ID kaca",
+       "redirect-revision": "Révisi kaca",
+       "redirect-file": "Ngaran berkas",
+       "redirect-logid": "ID log",
+       "redirect-not-exists": "Ajén teu kapanggih",
+       "fileduplicatesearch": "Paluruh gambar duplikat",
        "fileduplicatesearch-filename": "Ngaran koropak:",
-       "fileduplicatesearch-submit": "Sungsi",
+       "fileduplicatesearch-submit": "Paluruh",
        "fileduplicatesearch-info": "$1 × $2 piksel<br />Ukuran koropak: $3<br />Tipeu MIME: $4",
        "fileduplicatesearch-result-1": "Koropak \"$1\" teu boga duplikat idéntik.",
        "fileduplicatesearch-result-n": "Koropak \"$1\" mibanda {{PLURAL:$2|1 duplikat idéntik|$2 duplikat idéntik}}.",
        "specialpages": "Kaca husus",
+       "specialpages-note-top": "Kamandang",
        "specialpages-note": "* Kaca husus normal.\n* <span class=\"mw-specialpagerestricted\">Kaca husus diwates.</span>",
        "specialpages-group-maintenance": "Laporan pigawéeun",
        "specialpages-group-other": "Kaca husus lainna",
        "specialpages-group-login": "Asup log / jieun akun",
        "specialpages-group-changes": "Nuanyar robah sarta log",
-       "specialpages-group-media": "Laporan sarta muatkeun koropak",
+       "specialpages-group-media": "Laporan jeung unjalan berkas",
        "specialpages-group-users": "Pamaké sarta hak pamaké",
        "specialpages-group-highuse": "Pamakéan kaca nu badag",
        "specialpages-group-pages": "Daptar kaca",
        "specialpages-group-wiki": "Data jeung parabot",
        "specialpages-group-redirects": "Alihan kaca husus",
        "specialpages-group-spam": "Parabot Spam",
+       "specialpages-group-developer": "Parabot pangembang",
        "blankpage": "Kaca kosong",
        "intentionallyblankpage": "Ieu kaca ngahaja dikosongkeun.",
        "external_image_whitelist": " #Antepkeun ieu baris sakumaha ayana<pre>\n#Paké fragmén éxprési régulér (ukur bagian anu aya di antara //) di handap\n#Ieu fragmén bakal dicocogkeun jeung URL gambar-gambar éksternal\n#Fragmén anu cocog bakal dipidangkeun minangka gambar, lamun henteu nu katémbong ukur tutumbuna #Baris nu dimimitian ku # bakal dianggap koméntar\n#Ieu teu ngabédakeun gedé leutikna aksara\n#Teundeun sakabéh fragmén éxprési régulér luhureun ieu baris. Antepkeun ieu baris sakumaha ayana</pre>",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
        "tags-title": "Tag",
        "tags-tag": "Ngaran tag",
+       "tags-source-header": "Sumber",
+       "tags-active-header": "Hurung?",
+       "tags-actions-header": "Tarékah",
+       "tags-active-yes": "Enya",
+       "tags-active-no": "Teu",
        "tags-edit": "édit",
+       "tags-activate": "hurungkeun",
+       "tags-deactivate": "pareuman",
        "tags-hitcount": "$1 {{PLURAL:$1|parobahan|parobahan}}",
+       "tags-create-heading": "Nyieun tag anyar",
+       "tags-create-tag-name": "Ngaran tag:",
+       "tags-create-reason": "Alesan:",
+       "tags-create-submit": "Jieun",
+       "tags-delete-title": "Pupus tag",
+       "tags-delete-reason": "Alesan:",
+       "tags-activate-title": "Hurungkeun tag",
+       "tags-activate-reason": "Alesan:",
+       "tags-activate-submit": "Hurungkeun",
+       "tags-deactivate-title": "Pareuman tag",
+       "tags-deactivate-reason": "Alesan:",
+       "tags-deactivate-submit": "Pareuman",
+       "tags-edit-title": "Édit tag",
+       "tags-edit-existing-tags-none": "<em>Taya</em>",
+       "tags-edit-new-tags": "Tag anyar:",
+       "tags-edit-reason": "Alesan:",
        "comparepages": "Bandinkeun kaca",
        "compare-page1": "Kaca 1",
        "compare-page2": "Kaca 2",
        "htmlform-submit": "Kirim",
        "htmlform-reset": "Bolaykeun parobahan",
        "htmlform-selectorother-other": "Lianna",
+       "htmlform-no": "Henteu",
+       "htmlform-yes": "Enya",
+       "htmlform-chosen-placeholder": "Pilih opsi",
+       "htmlform-cloner-delete": "Pupus",
+       "htmlform-date-placeholder": "TTTT-BB-HH",
+       "htmlform-time-placeholder": "JJ:MM:DD",
+       "htmlform-datetime-placeholder": "TTTT-BB-HH JJ:MM:DD",
+       "htmlform-title-not-exists": "$1 euweuh.",
+       "htmlform-user-not-exists": "<strong>$1</strong> taya.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ngahapus}} kaca $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|dibalikkeun}} kaca $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|dibalikkeun}} kaca $3",
+       "restore-count-revisions": "$1 {{PLURAL:$1|1 révisi|$1 révisi}}",
+       "restore-count-files": "{{PLURAL:$1|1 berkas|$1 berkas}}",
+       "revdelete-content-hid": "kontén disumputkeun",
+       "revdelete-summary-hid": "tingkesan édit disumputkeun",
+       "revdelete-uname-hid": "sandiasma disumputkeun",
+       "revdelete-content-unhid": "kontén teu disumputkeun",
+       "revdelete-summary-unhid": "tingkesan édit teu disumputkeun",
+       "revdelete-uname-unhid": "sandiasma teu disumputkeun",
        "revdelete-restricted": "akses geus dibatesan ukur keur kuncén",
        "revdelete-unrestricted": "Watesan akses kuncén dihapuskeun",
+       "logentry-import-upload": "$1 {{GENDER:$2|ngimpor}} $3 ku pangunjalan berkas",
        "logentry-move-move": "$1 {{GENDER:$2|mindahkeun}} kaca $3 ka $4",
-       "logentry-newusers-create": "Akun pamaké $1 jeus {{GENDER:$2|dijieun}}",
+       "logentry-newusers-create": "Akun pamaké $1 geus {{GENDER:$2|dijieun}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngamuat}} $3",
        "rightsnone": "(euweuh)",
-       "revdelete-summary": "ringkesan ngédit",
+       "feedback-back": "Balik deui",
        "feedback-cancel": "Bolay",
+       "feedback-close": "Anggeus",
+       "feedback-error2": "Kasalahan: Édit gagal",
        "feedback-message": "Surat:",
        "feedback-subject": "Ngeunaan:",
-       "searchsuggest-search": "Sungsi",
+       "feedback-submit": "Kirim",
+       "feedback-thanks-title": "Hatur nuhun!",
+       "feedback-useragent": "Agén pamaké:",
+       "searchsuggest-search": "Paluruh {{SITENAME}}",
        "searchsuggest-containing": "ngandung...",
-       "api-error-file-too-large": "Berkas nu dikirim gedé teuing.",
-       "api-error-filename-tooshort": "Ngaran berkas pondok teuing.",
-       "api-error-filetype-banned": "Jenis berkas ieu dipahing.",
-       "api-error-filetype-banned-type": "$1 kaasup tipeu koropak nu teu dicaram. {{PLURAL:$3|Nu diwidian nyaéta|Nu diwidian nyaéta}} $2.",
-       "api-error-filetype-missing": "Ngaran berkas euweuh éxténsian.",
-       "api-error-illegal-filename": "Ngaran berkas kitu dipahing.",
-       "api-error-mustbeloggedin": "Anjeun kudu asup log pikeun ngunggahkeun berkas.",
        "duration-seconds": "$1 {{PLURAL:$1|detik|detik}}",
        "duration-minutes": "$1 {{PLURAL:$1|menit|menit}}",
        "duration-hours": "$1 {{PLURAL:$1|jam|jam}}",
        "expand_templates_xml_output": "Output XML",
        "expand_templates_ok": "Heug",
        "expand_templates_preview": "Pramidang",
+       "pagelang-name": "Kaca",
+       "pagelang-language": "Basa",
+       "pagelang-select-lang": "Pilih basa",
+       "pagelang-reason": "Alesan",
+       "pagelang-submit": "Kirim",
+       "pagelang-nonexistent-page": "Kaca $1 euweuh.",
+       "mediastatistics": "Statistik média",
+       "mediastatistics-table-mimetype": "Tipeu MIME",
+       "mediastatistics-table-count": "Jumlah berkas",
+       "mediastatistics-table-totalbytes": "Ukuran gabungan",
+       "mediastatistics-header-unknown": "Teu dipikanyaho",
+       "mediastatistics-header-bitmap": "Gambar bitmap",
+       "mediastatistics-header-drawing": "Ngagambar (Gambar véktor)",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Vidio",
+       "mediastatistics-header-multimedia": "Média beunghar",
+       "mediastatistics-header-text": "Tékstual",
+       "mediastatistics-header-total": "Sakumna berkas",
        "special-characters-group-latin": "Latin",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Lambang",
        "special-characters-group-gujarati": "Gujarati",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
-       "special-characters-group-khmer": "Khmer"
+       "special-characters-group-khmer": "Khmer",
+       "log-action-filter-all": "Sakumna",
+       "log-action-filter-block-block": "Peungpeuk",
+       "gotointerwiki": "Ninggalkeun{{SITENAME}}",
+       "gotointerwiki-invalid": "Judul spésipik henteu valid"
 }
index 380310b..bb3100b 100644 (file)
@@ -74,7 +74,8 @@
                        "McDutchie",
                        "Larske",
                        "Rockyfelle",
-                       "Johan"
+                       "Johan",
+                       "Martin Wiss"
                ]
        },
        "tog-underline": "Stryk under länkar:",
        "redirectedfrom": "(Omdirigerad från $1)",
        "redirectpagesub": "Omdirigeringssida",
        "redirectto": "Omdirigering till:",
-       "lastmodifiedat": "Sidan ändrades senast den $1 kl. $2.",
+       "lastmodifiedat": "Sidan redigerades senast den $1 kl. $2.",
        "viewcount": "Den här sidan har visats {{PLURAL:$1|en gång|$1 gånger}}.",
        "protectedpage": "Skrivskyddad sida",
        "jumpto": "Hoppa till:",
        "login": "Logga in",
        "login-security": "Verifiera din identitet",
        "nav-login-createaccount": "Logga in / skapa konto",
-       "userlogin": "Logga in / skapa konto",
-       "userloginnocreate": "Logga in",
        "logout": "Logga ut",
        "userlogout": "Logga ut",
        "notloggedin": "Inte inloggad",
        "userlogin-noaccount": "Har du inget konto?",
        "userlogin-joinproject": "Gå med i {{SITENAME}}",
-       "nologin": "Har du inget konto? $1.",
-       "nologinlink": "Skapa ett konto",
        "createaccount": "Skapa ett konto",
-       "gotaccount": "Har du redan ett konto? '''$1'''.",
-       "gotaccountlink": "Logga in",
-       "userlogin-resetlink": "Har du glömt dina inloggningsuppgifter?",
        "userlogin-resetpassword-link": "Glömt ditt lösenord?",
        "userlogin-helplink2": "Hjälp med inloggning",
        "userlogin-loggedin": "Du är redan inloggad som {{GENDER:$1|$1}}.\nAnvänd formuläret nedan för att logga in som en annan användare.",
        "createaccountmail": "Använd ett tillfälligt slumpvis valt lösenord och skicka det till den angivna e-postadressen",
        "createaccountmail-help": "Kan användas för att skapa ett konto åt en annan person utan att kunna lösenordet.",
        "createacct-realname": "Riktigt namn (valfritt)",
-       "createaccountreason": "Orsak:",
        "createacct-reason": "Orsak",
        "createacct-reason-ph": "Varför du skapar ett annat konto",
        "createacct-reason-help": "Meddelande som visas i loggen för skapade konton",
        "preview": "Förhandsgranska",
        "showpreview": "Visa förhandsgranskning",
        "showdiff": "Visa ändringar",
-       "blankarticle": "<strong>Varning:</strong> Sidan du skapar är tom.\nOm du klickar på \"{{int:savearticle}}\" igen kommer sidan skapas utan något innehåll.",
+       "blankarticle": "<strong>Varning:</strong> Sidan du skapar är tom.\nOm du klickar på \"$1\" igen kommer sidan skapas utan något innehåll.",
        "anoneditwarning": "<strong>Varning:</strong> Du är inte inloggad. Din IP-adress kommer att vara publikt synlig om du gör några redigeringar. Om du <strong>[$1 loggar in]</strong> eller <strong>[$2 skapar ett konto]</strong> kommer dina redigeringar att tillskrivas ditt användarnamn, tillsammans med andra fördelar.",
        "anonpreviewwarning": "''Du är inte inloggad. Om du sparar kommer din IP-adress registreras på denna sidas redigeringshistorik.''",
-       "missingsummary": "<strong>Påminnelse:</strong> Du har inte skrivit någon redigeringskommentar.\nOm du klickar på \"{{int:savearticle}}\" igen kommer din redigering att sparas utan en sådan.",
-       "selfredirect": "<strong>Varning:</strong> Du omdirigerar denna sida till sig själv.\nDu kanske angav fel mål för din omdirigering, eller redigerar fel sida.\nOm du klickar på \"{{int:savearticle}}\" igen kommer omdirigeringen att skapas trots detta.",
+       "missingsummary": "<strong>Påminnelse:</strong> Du har inte skrivit någon redigeringskommentar.\nOm du klickar på \"$1\" igen kommer din redigering att sparas utan en sådan.",
+       "selfredirect": "<strong>Varning:</strong> Du omdirigerar denna sida till sig själv.\nDu kanske angav fel mål för din omdirigering, eller redigerar fel sida.\nOm du klickar på \"$1\" igen kommer omdirigeringen att skapas trots detta.",
        "missingcommenttext": "Var god och skriv in en kommentar nedan.",
-       "missingcommentheader": "<strong>Påminnelse:</strong> Du har inte skrivit något ämne för den här kommentaren.\nOm du trycker på \"{{int:savearticle}}\" igen kommer din redigering sparas utan rubrik.",
+       "missingcommentheader": "<strong>Påminnelse:</strong> Du har inte skrivit något ämne för den här kommentaren.\nOm du trycker på \"$1\" igen kommer din redigering sparas utan rubrik.",
        "summary-preview": "Förhandsgranskning av redigeringssammanfattning:",
        "subject-preview": "Förhandsgranskning av ämne:",
        "previewerrortext": "Ett fel uppstod när dina ändringar skulle förhandsgranskas.",
        "editingsection": "Redigerar $1 (avsnitt)",
        "editingcomment": "Redigerar $1 (nytt avsnitt)",
        "editconflict": "Redigeringskonflikt: $1",
-       "explainconflict": "Någon har ändrat den här sidan efter att du började att redigera den.\nDen översta textrutan innehåller den nuvarande sparade versionen av texten.\nDin ändrade version visas i den nedre rutan.\nOm du vill spara dina ändringar så måste du infoga dem i den övre texten.\n'''Endast''' texten i den översta textrutan kommer att sparas när du trycker på \"{{int:savearticle}}\".",
+       "explainconflict": "Någon har ändrat den här sidan efter att du började att redigera den.\nDen översta textrutan innehåller den nuvarande sparade versionen av texten.\nDin ändrade version visas i den nedre rutan.\nOm du vill spara dina ändringar så måste du infoga dem i den övre texten.\n<strong>Endast</strong> texten i den översta textrutan kommer att sparas när du trycker på \"$1\".",
        "yourtext": "Din text",
        "storedversion": "Den sparade versionen",
        "nonunicodebrowser": "'''VARNING: Din webbläsare saknar stöd för unicode. För att du ska kunna redigera sidor utan problem, så visas icke-ASCII-tecken som hexadecimala koder i redigeringsrutan.'''",
        "readonlywarning": "<strong>VARNING: Databasen är tillfälligt låst för underhåll. Du kommer inte att kunna spara dina ändringar just nu.</strong>\nDet kan vara klokt att kopiera texten till ett textdokument som sparas på din dator tills vidare.\n\nSystemadministratören som låste databasen gav följande förklaring: $1",
        "protectedpagewarning": "'''Varning: Den här sidan har låsts så att bara användare med administratörsrättigheter kan redigera den.'''\nDen senaste loggposten tillhandahålls nedan som referens:",
        "semiprotectedpagewarning": "'''Observera:''' Denna sida har låsts så att endast registrerade användare kan redigera den.\nDen senaste loggposten tillhandahålls nedan som referens:",
-       "cascadeprotectedwarning": "'''Varning:''' Den här sidan har låsts så att bara användare med administratörsrättigheter kan redigera den, eftersom den är inkluderad på följande {{PLURAL:$1|sida|sidor}} som skyddats med kaskaderande skrivskydd:",
+       "cascadeprotectedwarning": "<strong>Varning</strong> Den här sidan har låsts så att bara användare med [[Special:ListGroupRights|specifika rättigheter]] kan redigera den, eftersom den är inkluderad på följande {{PLURAL:$1|sida|sidor}} som skyddats med kaskaderande skrivskydd:",
        "titleprotectedwarning": "'''Varning: Denna sida har låsts så att [[Special:ListGroupRights|specifika rättigheter]] krävs för att skapa den.'''\nDen senaste loggposten tillhandahålls nedan som referens:",
        "templatesused": "{{PLURAL:$1|Mall|Mallar}} som används på den här sidan:",
        "templatesusedpreview": "{{PLURAL:$1|Mall|Mallar}} som används i denna förhandsgranskning:",
        "post-expand-template-argument-warning": "Varning: Sidan innehåller en eller flera mallparametrar som blir för långa när de expanderas.\nDessa parametrar har uteslutits.",
        "post-expand-template-argument-category": "Sidor med uteslutna mallparametrar",
        "parser-template-loop-warning": "Mall-loop upptäckt: [[$1]]",
+       "template-loop-category": "Sidor med loopade mallar",
+       "template-loop-category-desc": "Sidan innehåller en loopad mall, d.v.s. en mall som anropar sig själv rekursivt.",
        "parser-template-recursion-depth-warning": "Gräns för mallrekursionsdjup överskriden ($1)",
        "language-converter-depth-warning": "Gräns för språkkonverteringsdjup överskriden ($1)",
        "node-count-exceeded-category": "Sidor där antalet noder har överskridits",
        "page_first": "första",
        "page_last": "sista",
        "histlegend": "Val av diff: markera i klickrutorna för att jämföra versioner och tryck enter eller knappen längst ner.<br />\nFörklaring: '''({{int:cur}})''' = skillnad mot senaste version; '''({{int:last}})''' = skillnad mot föregående version; '''{{int:minoreditletter}}''' = mindre ändring.",
-       "history-fieldset-title": "Bläddra i historiken",
-       "history-show-deleted": "Endast borttagna",
+       "history-fieldset-title": "Sök efter sidversioner",
+       "history-show-deleted": "Endast raderade sidversioner",
        "histfirst": "äldsta",
        "histlast": "nyaste",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "search-file-match": "(överensstämmer filens innehåll)",
        "search-suggest": "Menade du: $1",
        "search-rewritten": "Visar resultat för $1. Sök istället efter $2.",
-       "search-interwiki-caption": "Systerprojekt",
+       "search-interwiki-caption": "Resultat från systerprojekt",
        "search-interwiki-default": "Resultat från $1:",
        "search-interwiki-more": "(mer)",
        "search-interwiki-more-results": "fler resultat",
        "prefs-help-prefershttps": "Ändringar av denna inställning börjar gälla nästa gång du loggar in",
        "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": "Användarrättigheter",
        "userrights-lookup-user": "Välj en användare",
        "userrights-user-editname": "Skriv in ett användarnamn:",
        "editusergroup": "Läs in användargrupper",
        "saveusergroups": "Spara {{GENDER:$1|användargrupper}}",
        "userrights-groupsmember": "Medlem i:",
        "userrights-groupsmember-auto": "Implicit medlem av:",
-       "userrights-groups-help": "Du kan ändra vilka grupper denna användare är medlem i.\n* En ikryssad ruta betyder användaren är medlem i den gruppen.\n* En okryssad ruta betyder att användaren inte är medlem i den gruppen.\n* En asterisk (*) betyder att du inte kan ta bort gruppen när du har lagt till den, eller vice versa.\n* Ett nummertecken (#) betyder att du endast kan flytta tillbaka förfallotiden för denna grupp; du kan inte flytta fram den.",
+       "userrights-groups-help": "Du kan ändra vilka grupper denna användare är medlem i.\n* En ikryssad ruta betyder användaren är medlem i den gruppen.\n* En okryssad ruta betyder att användaren inte är medlem i den gruppen.\n* En asterisk (*) betyder att du inte kan ta bort gruppen när du har lagt till den, eller vice versa.\n* Ett nummertecken (#) betyder att du endast kan flytta tillbaka förfallotiden för detta gruppmedlemskap; du kan inte flytta fram den.",
        "userrights-reason": "Anledning:",
        "userrights-no-interwiki": "Du har inte behörighet att ändra användarrättigheter på andra wikis.",
        "userrights-nodatabase": "Databasen $1 finns inte eller så är den inte lokal.",
        "userrights-expiry-options": "1 dag:1 dag,1 vecka:1 vecka,1 månad:1 månad,3 månader:3 månader,6 månader:6 månader,1 år:1 år",
        "userrights-invalid-expiry": "Förfallotiden för gruppen \"$1\" är ogiltig.",
        "userrights-expiry-in-past": "Förfallotiden för gruppen \"$1\" är i det förflutna.",
-       "userrights-cannot-shorten-expiry": "Du kan inte flytta fram förfallotiden för gruppen \"$1\". Endast användare med behörighet att lägga till och ta bort denna grupp kan flytta fram förfallodatum.",
+       "userrights-cannot-shorten-expiry": "Du kan inte flytta fram förfallotiden för medlemskapet i gruppen \"$1\". Endast användare med behörighet att lägga till och ta bort denna grupp kan flytta fram förfallodatum.",
        "userrights-conflict": "Konflikt vid ändringar av användarrättigheter! Var god granska och bekräfta dina ändringar.",
        "group": "Grupp:",
        "group-user": "Användare",
        "right-editsemiprotected": "Redigera skyddade sidor som \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Ändra innehållsmodellen för en sida",
        "right-editinterface": "Redigera användargränssnittet",
-       "right-editusercssjs": "Redigera andra användares CSS- och JS-filer",
        "right-editusercss": "Redigera andra användares CSS-filer",
        "right-edituserjs": "Redigera andra användares JavaScript-filer",
        "right-editmyusercss": "Redigera din egen användares CSS-filer",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Visa",
        "rcfilters-activefilters": "Aktiva filter",
+       "rcfilters-quickfilters": "Snabblänkar",
+       "rcfilters-quickfilters-placeholder-title": "Inga länkar har sparats ännu",
+       "rcfilters-quickfilters-placeholder-description": "För att spara dina filterinställningar och återanvända dem senare, klicka på bokmärkesikonen under \"Aktiva filter\" nedan.",
+       "rcfilters-savedqueries-defaultlabel": "Sparade filter",
+       "rcfilters-savedqueries-rename": "Döp om",
+       "rcfilters-savedqueries-setdefault": "Ange som standard",
+       "rcfilters-savedqueries-unsetdefault": "Ta bort som standard",
+       "rcfilters-savedqueries-remove": "Ta bort",
+       "rcfilters-savedqueries-new-name-label": "Namn",
+       "rcfilters-savedqueries-apply-label": "Skapa snabblänk",
+       "rcfilters-savedqueries-cancel-label": "Avbryt",
+       "rcfilters-savedqueries-add-new-title": "Spara filter som en snabblänk",
        "rcfilters-restore-default-filters": "Återställ standardfilter",
        "rcfilters-clear-all-filters": "Rensa alla filter",
        "rcfilters-search-placeholder": "Filtrera senaste ändringar (bläddra eller börja skriva)",
        "rcfilters-invalid-filter": "Ogiltigt filter",
        "rcfilters-empty-filter": "Inga aktiva filter. Alla bidrag visas.",
        "rcfilters-filterlist-title": "Filter",
+       "rcfilters-filterlist-whatsthis": "Vad är detta?",
+       "rcfilters-filterlist-feedbacklink": "Ge återkoppling på nya (beta)filter",
+       "rcfilters-highlightbutton-title": "Markera resultat",
+       "rcfilters-highlightmenu-title": "Välj en färg",
+       "rcfilters-highlightmenu-help": "Välj en färg att markera denna egenskap",
        "rcfilters-filterlist-noresults": "Inga filter hittades",
+       "rcfilters-noresults-conflict": "Inga resultat hittades eftersom sökkriterierna är i konflikt",
+       "rcfilters-state-message-subset": "Detta filter har ingen effekt, eftersom resultaten inkluderar följande, bredare {{PLURAL:$2|filter}} (försök att markera för att särskilja det): $1",
+       "rcfilters-state-message-fullcoverage": "Att markera alla filter i en grupp är detsamma som att markera inget alls, så detta filter har igen effekt. Grupper som inkluderas: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "Detta filter är i konflikt med följande {{PLURAL:$2|upplevelsefilter}}, som endast {{PLURAL:$2|hittar}} registrerade användare: $1",
+       "rcfilters-filtergroup-authorship": "Författarskap av bidrag",
+       "rcfilters-filter-editsbyself-label": "Redigeringar av dig",
+       "rcfilters-filter-editsbyself-description": "Dina egna bidrag.",
+       "rcfilters-filter-editsbyother-label": "Ändringar av andra",
+       "rcfilters-filter-editsbyother-description": "Alla ändringar förutom dina egna.",
        "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-user-experience-level-conflicts-unregistered": "Upplevelsefilter hittar endast registrerade användare, så detta filter är i konflikt med filtret \"Oregistrerade\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filtret \"Oregistrerade\" är i konflikt med en eller flera upplevelsefilter, som endast hittar registrerade användare. Filtren som är i konflikt är markerade i området med aktiva filter ovan.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nykomlingar",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Färre än 10 redigeringar och 4 dagars aktivitet.",
+       "rcfilters-filter-user-experience-level-learner-label": "Nybörjare",
+       "rcfilters-filter-user-experience-level-learner-description": "Mer erfarenhet än \"Nybörjare\" men mindre än \"Erfarna användare\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Erfarna användare",
+       "rcfilters-filter-user-experience-level-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-reviewstatus": "Granskningsstatus",
+       "rcfilters-filter-patrolled-label": "Patrullerade",
+       "rcfilters-filter-patrolled-description": "Redigeringar markerade som patrullerade.",
+       "rcfilters-filter-unpatrolled-label": "Inte patrullerade",
+       "rcfilters-filter-unpatrolled-description": "Redigeringar som inte är markerade som patrullerade.",
        "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-watchlist": "Bevakade sidor",
+       "rcfilters-filter-watchlist-watched-label": "I bevakningslistan",
+       "rcfilters-filter-watchlist-watched-description": "Ändringar i sidor på din bevakningslista.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nya ändringar i bevakningslistan",
+       "rcfilters-filter-watchlist-watchednew-description": "Ändringar i bevakade sidor som du inte har besökt sedan ändringarna ägde rum.",
+       "rcfilters-filter-watchlist-notwatched-label": "Inte i bevakningslistan",
+       "rcfilters-filter-watchlist-notwatched-description": "Allting förutom ändringar i sidor på din bevakningslista.",
        "rcfilters-filtergroup-changetype": "Typ av ändring",
        "rcfilters-filter-pageedits-label": "Sidredigeringar",
        "rcfilters-filter-pageedits-description": "Redigeringar till wikiinnehåll, diskussioner, kategoribeskrivningar...",
        "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....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filtret \"Mindre redigering\" är i konflikt med en eller flera ändringstypfilter, eftersom vissa ändringstyper inte kan betecknas som \"mindre\". Filtren som är i konflikt är markerade i området med aktiva filter ovan.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Vissa ändringstyper kan inte betecknas som \"mindre\", så detta filter är i konflikt med följande ändringstypfilter: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Detta ändringstypfilter är i konflikt med filtret \"Mindre ändringar\". Vissa ändringstyper kan inte betecknas som \"mindre\".",
+       "rcfilters-filtergroup-lastRevision": "Senaste version",
+       "rcfilters-filter-lastrevision-label": "Senaste version",
+       "rcfilters-filter-lastrevision-description": "Den senaste ändringen av en sida.",
+       "rcfilters-filter-previousrevision-label": "Tidigare versioner",
+       "rcfilters-filter-previousrevision-description": "Alla ändringar som inte är den senaste ändringen av en sida.",
        "rcnotefrom": "Nedan visas {{PLURAL:$5|ändringen|ändringar}} sedan <strong>$3, $4</strong> (upp till <strong>$1</strong> ändringar visas).",
+       "rclistfromreset": "Återställ datumval",
        "rclistfrom": "Visa nya ändringar från och med $2 $3",
        "rcshowhideminor": "$1 mindre ändringar",
        "rcshowhideminor-show": "Visa",
        "rcshowhidecategorization": "$1 kategorisering av sidor",
        "rcshowhidecategorization-show": "Visa",
        "rcshowhidecategorization-hide": "Dölj",
-       "rclinks": "Visa senaste $1 ändringar under de senaste $2 dygnen<br />$3",
+       "rclinks": "Visa senaste $1 ändringar under de senaste $2 dygnen",
        "diff": "skillnad",
        "hist": "historik",
        "hide": "Dölj",
        "php-uploaddisabledtext": "Filuppladdningar i PHP är avaktiverade. \nKolla inställningarna för file_uploads.",
        "uploadscripted": "Denna fil innehåller HTML eller script som felaktigt kan komma att tolkas av webbläsare.",
        "upload-scripted-pi-callback": "Kan inte ladda upp en fil som innehåller instruktioner för behandling av XML-stylesheet.",
+       "upload-scripted-dtd": "Kan inte ladda upp SVG-filer som innehåller en icke-standardiserad DTD-deklaration.",
        "uploaded-script-svg": "Hittade skriptelementet \"$1\" i den uppladdade SVG-filen.",
        "uploaded-hostile-svg": "Hittade osäker CSS i den uppladdade filens stilelement.",
        "uploaded-event-handler-on-svg": "Att ange event-handler-attribut <code>$1=\"$2\"</code> är inte tillåtet i SVG-filer.",
        "enotif_body_intro_moved": "{{SITENAME}}sidan $1 flyttades den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.",
        "enotif_body_intro_restored": "{{SITENAME}}sidan $1 återställdes den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.",
        "enotif_body_intro_changed": "{{SITENAME}}sidan $1 ändrades den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.",
-       "enotif_lastvisited": "På $1 återfinner du alla ändringar sedan ditt senaste besök.",
-       "enotif_lastdiff": "Se denna ändring på $1",
+       "enotif_lastvisited": "För alla ändringar sedan ditt senaste besök, se $1",
+       "enotif_lastdiff": "För att se denna ändring, se $1",
        "enotif_anon_editor": "anonym användare $1",
        "enotif_body": "Hej $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nAngiven sammanfattning av redigeringen: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakta användaren:\ne-post: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nSåvida du inte besöker sidan, kommer du inte att få flera meddelanden om aktivitet på sidan när du är inloggad. Du kan också ta bort flaggan för meddelanden om ändringar på alla sidor i din bevakningslista.\n\nHälsningar från {{SITENAME}}s meddelandesystem\n\n--\nFör att ändra inställningarna för dina uppdateringar via e-post, besök\n{{canonicalurl:{{#special:Preferences}}}}\n\nFör att ändra inställningarna i din bevakningslista, besök\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFör att radera sidan från din bevakningslista, besök\n$UNWATCHURL\n\nFeedback och ytterligare hjälp:\n$HELPPAGE",
        "created": "skapad",
        "editcomment": "Redigeringskommentaren var: <em>$1</em>.",
        "revertpage": "Återställde redigeringar av  [[Special:Contributions/$2|$2]] ([[User talk:$2|användardiskussion]]) till senaste versionen av [[User:$1|$1]]",
        "revertpage-nouser": "Återställde redigeringar av en dold användare till den senaste versionen av {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Återställde ändringar av $1;\nändrade tillbaka till senaste version av $2.",
+       "rollback-success": "Återställde ändringar av {{GENDER:$3|$1}};\nändrade tillbaka till senaste versionen av {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Återställde ändringar av $1;\nändrade tillbaka till senaste sidversion av $2. [$3 Visa ändringar]",
        "sessionfailure-title": "Sessionsfel",
        "sessionfailure": "Något med din session som inloggad är på tok. Din begärda åtgärd har avbrutits, för att förhindra att någon kapar din session. Klicka på \"Tillbaka\" i din webbläsare och ladda om den sida du kom ifrån. Försök sedan igen.",
        "undeleteviewlink": "visa",
        "undeleteinvert": "Invertera urval",
        "undeletecomment": "Anledning:",
-       "undeletedrevisions": "{{PLURAL:$1|en version återställd|$1 versioner återställda}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|version|versioner}} och $2 {{PLURAL:$2|fil|filer}} återställda",
-       "undeletedfiles": "{{PLURAL:$1|en fil återställd|$1 filer återställda}}",
        "cannotundelete": "En del eller alla återställningar misslyckades:\n$1",
        "undeletedpage": "'''$1 har återställts'''\n\nSe [[Special:Log/delete|raderingsloggen]] för en förteckning över de senaste raderingarna och återställningarna.",
        "undelete-header": "Se [[Special:Log/delete|raderingsloggen]] för nyligen raderade sidor.",
        "sp-contributions-uploads": "uppladdningar",
        "sp-contributions-logs": "loggar",
        "sp-contributions-talk": "diskussion",
-       "sp-contributions-userrights": "hantering av användarrättigheter",
+       "sp-contributions-userrights": "hantering av {{GENDER:$1|användarrättigheter}}",
        "sp-contributions-blocked-notice": "Användaren är blockerad.\nDen senaste posten i blockeringsloggen visas nedan som referens:",
        "sp-contributions-blocked-notice-anon": "Denna IP-adress är för närvarande blockerad.\nDen senaste posten i blockeringsloggen visas nedan som referens:",
        "sp-contributions-search": "Sök efter användarbidrag",
        "whatlinkshere-hideimages": "$1 fillänkar",
        "whatlinkshere-filters": "Filter",
        "whatlinkshere-submit": "Gå",
-       "autoblockid": "Autoblockera #$1",
+       "autoblockid": "Autoblockering #$1",
        "block": "Blockera användare",
        "unblock": "Upphäv blockering av användare",
        "blockip": "Blockera {{GENDER:$1|användare}}",
        "unblocked-id": "Blockeringen $1 har hävts",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] har avblockerats.",
        "blocklist": "Blockerade användare",
+       "autoblocklist": "Autoblockeringar",
+       "autoblocklist-submit": "Sök",
+       "autoblocklist-legend": "Lista autoblockeringar",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Lokal autoblockering|Lokala autoblockeringar}}",
+       "autoblocklist-empty": "Listan över autoblockeringar är tom.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Annan autoblockering|Andra autoblockeringar}}",
        "ipblocklist": "Blockerade användare",
        "ipblocklist-legend": "Sök efter en blockerad användare",
        "blocklist-userblocks": "Dölj kontoblockeringar",
        "ipb_hide_invalid": "Kan inte undanhålla detta konto; det har fler än {{PLURAL:$1|en redigering|$1 redigeringar}}.",
        "ipb_already_blocked": "\"$1\" är redan blockerad",
        "ipb-needreblock": "$1 är redan blockerad. Vill du ändra inställningarna?",
-       "ipb-otherblocks-header": "Andra {{PLURAL:$1|blockering|blockeringar}}",
+       "ipb-otherblocks-header": "{{PLURAL:$1|Annan blockering|Andra blockeringar}}",
        "unblock-hideuser": "Du kan inte ta bort blockeringen här användaren, eftersom dens användarnamn har dolts.",
        "ipb_cant_unblock": "Fel: Hittade inte blockering $1. Det är möjligt att den redan har upphävts.",
        "ipb_blocked_as_range": "Fel: IP-adressen $1 är inte direkt blockerad, och kan därför inte avblockeras. Adressen är blockerad som en del av IP-intervallet $2, som kan avblockeras.",
        "tooltip-pt-mycontris": "Lista över {{GENDER:|dina}} bidrag",
        "tooltip-pt-anoncontribs": "En lista över redigeringar från denna IP-adress",
        "tooltip-pt-login": "Du uppmuntras att logga in, men det är inget krav",
+       "tooltip-pt-login-private": "Du måste logga in på denna wiki",
        "tooltip-pt-logout": "Logga ut",
        "tooltip-pt-createaccount": "Du uppmuntras att skapa ett konto och logga in, men det är inte obligatoriskt",
        "tooltip-ca-talk": "Diskussion om innehållssidan",
        "anonymous": "{{PLURAL:$1|Anonym användare|Anonyma användare}} på {{SITENAME}}",
        "siteuser": "användaren $1 på {{SITENAME}}",
        "anonuser": "{{SITENAME}} anonym användare $1",
-       "lastmodifiedatby": "Den här sidan ändrades senast kl. $2 den $1 av $3.",
+       "lastmodifiedatby": "Den här sidan redigerades senast kl. $2 den $1 av $3.",
        "othercontribs": "Baserad på arbete av $1.",
        "others": "andra",
        "siteusers": "{{SITENAME}}-{{PLURAL:$2|{{GENDER:$1|användaren}}|användarna}} $1",
        "newimages-summary": "Den här specialsidan visar de senast uppladdade filerna.",
        "newimages-legend": "Filter",
        "newimages-label": "Filnamn (eller en del av det):",
+       "newimages-user": "IP-adress eller användarnamn",
        "newimages-showbots": "Visa uppladdningar av botar",
        "newimages-hidepatrolled": "Dölj patrullerade uppladdningar",
        "noimages": "Ingenting att se.",
        "confirmrecreate": "Användaren [[User:$1|$1]] ([[User talk:$1|diskussion]]) raderade den här sidan efter att du började redigera den med motiveringen:\n: <em>$2</em>\nBekräfta att du verkligen vill återskapa sidan.",
        "confirmrecreate-noreason": "Användare [[User:$1|$1]] ([[User talk:$1|diskussion]]) {{GENDER:$1|raderade}} den här sidan efter att du började redigera. Bekräfta att du verkligen vill återskapa sidan.",
        "recreate": "Återskapa",
+       "confirm-purge-title": "Rensa cachen för denna sida",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Rensa denna sidas cache?",
        "confirm-purge-bottom": "Rensning av en sida tömmer cachen och tvingar fram den senaste versionen.",
        "htmlform-user-not-valid": "<strong>$1</strong> är inte ett giltigt användarnamn.",
        "logentry-delete-delete": "$1 {{GENDER:$2|raderade}} sidan $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|raderade}} omdirigeringen $3 genom att skriva över den",
-       "logentry-delete-restore": "$1 {{GENDER:$2|återställde}} sidan $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|återställde}} sidan $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|återställde}} sidan $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 sidversion|$1 sidversioner}}",
+       "restore-count-files": "{{PLURAL:$1|1 fil|$1 filer}}",
        "logentry-delete-event": "$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ändrade}} synligheten för logghändelser på $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|uppdaterade}} märken på sidversionen $4 för sidan $3 ({{PLURAL:$7|lade till}} $6; {{PLURAL:$9|tog bort}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|uppdaterade}} märken på loggposten $5 för sidan $3 ({{PLURAL:$7|lade till}} $6; {{PLURAL:$9|tog bort}} $8)",
        "rightsnone": "(inga)",
-       "revdelete-summary": "sammanfattning",
        "rightslogentry-temporary-group": "$1 (temporärt, tills $2)",
        "feedback-adding": "Ge feedback till sida...",
        "feedback-back": "Tillbaka",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laotiska",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Kanadensisk stavelseskrift",
        "special-characters-title-endash": "tankstreck",
        "special-characters-title-emdash": "långt tankstreck",
        "special-characters-title-minus": "minustecken",
        "mw-widgets-titleinput-description-redirect": "omdirigerar till $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Lägg till en kategori...",
        "mw-widgets-usersmultiselect-placeholder": "Lägg till fler...",
+       "date-range-from": "From. den",
+       "date-range-to": "Till datum:",
        "sessionmanager-tie": "Kan inte kombinera flera begäransautentiseringstyper: $1.",
        "sessionprovider-generic": "$1-sessioner",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebaserade sessioner",
        "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>",
        "revid": "sidversion $1",
-       "pageid": "sid-ID $1"
+       "pageid": "sid-ID $1",
+       "rawhtml-notallowed": "&lt;html&gt;-taggar kan inte användas utanför normala sidor.",
+       "gotointerwiki": "Lämnar {{SITENAME}}",
+       "gotointerwiki-invalid": "Den angivna titeln är ogiltig.",
+       "gotointerwiki-external": "Du håller på att lämna {{SITENAME}} för att besöka [[$2]] som är en separat webbplats.\n\n'''[$1 Fortsätt till $1]'''",
+       "undelete-cantedit": "Du kan inte återställa denna sida eftersom du är inte tillåten att redigera denna sida.",
+       "undelete-cantcreate": "Du kan inte återställa denna sida eftersom det inte finns någon befintlig sida med detta namn och du tillåts inte att skapa denna sida."
 }
index c4148df..2fa9bab 100644 (file)
        "externaldberror": "Huenda kulikuwa na hitilafu ya database au labda hauruhusiwi kubadilisha akaunti yako ya nje.",
        "login": "Ingia",
        "nav-login-createaccount": "Ingia/ sajili akaunti",
-       "userlogin": "Ingia/ sajili akaunti",
-       "userloginnocreate": "Ingia",
        "logout": "Toka",
        "userlogout": "Toka",
        "notloggedin": "Hujaingia",
        "userlogin-noaccount": "Huna akaunti ya kuingilia?",
        "userlogin-joinproject": "Jiunga na {{SITENAME}}",
-       "nologin": "Huna akaunti ya kuingilia? '''$1'''.",
-       "nologinlink": "Sajili akaunti",
        "createaccount": "Sajili akaunti",
-       "gotaccount": "Unayo akaunti tayari? '''$1'''",
-       "gotaccountlink": "Ingia",
-       "userlogin-resetlink": "Umesahau maelezo yako ya kuingia?",
        "userlogin-resetpassword-link": "Je, umesahau neno la siri?",
        "userlogin-helplink2": "Saidia na kuingia",
        "userlogin-loggedin": "Haujaingia kama {{GENDER:$1|$1}}.\nTumia fomu hapa chini ili uweze kuingia kama mtumiaji mwingine.",
        "createacct-another-email-ph": "Weka anwani ya barua pepe",
        "createaccountmail": "Tumia neno la siri la muda tu na kulituma kwa anwani ya barua pepe ilivyoingizwa",
        "createacct-realname": "Jina la kweli (sio lazima)",
-       "createaccountreason": "Sababu:",
        "createacct-reason": "Sababu",
        "createacct-reason-ph": "Mbona unaunda akaunti mpya",
        "createacct-submit": "Unda akaunti yako",
        "preview": "Hakiki",
        "showpreview": "Onyesha hakikisho la mabadiliko",
        "showdiff": "Onyesha mabadiliko",
-       "blankarticle": "<strong>Ilani:</strong>Ukurasa uliounda ni mtupu.\nUlibofya  \"{{int:savearticle}}\" tena, ukurasa utaundwa bila maudhui yoyote.",
+       "blankarticle": "<strong>Ilani:</strong>Ukurasa uliounda ni mtupu.\nUlibofya  \"$1\" tena, ukurasa utaundwa bila maudhui yoyote.",
        "anoneditwarning": "<strong>Ilani:</strong> Wewe hujaingia rasmi kwenye tovuti. Anwani ya IP ya tarakilishi itaonekana na umma. Uki <strong>[$1 log in]</strong> au <strong>[$2 create an account]</strong>, hariri zako zitahusishwa na jina lako la mtumiaji pamoja na manufaa mengine.",
        "anonpreviewwarning": "''Hujaingia rasmi kwenye tovuti. Ukihifadhi ukurasa anwani ya IP ya tarakilishi yako itahifadhiwa katika historia ya uhariri wa ukurasa huu.''",
        "missingsummary": "'''Taarifa:''' Hujaandika muhtasari ya kuhariri.\nUkibonyeza 'Hifadhi ukurasa' tena, badilisho lako litahifadhiwa bila muhtasari.",
        "editingsection": "Unahariri $1 (fungu)",
        "editingcomment": "Una hariri $1 (sehemu mpya)",
        "editconflict": "Mgongano wa kuhariri: $1",
-       "explainconflict": "Mtu mwingine amebadilisha ukurasa huu tangu ulipoanza kuihariri.\nSanduku la juu inaonyesha maandiko yaliyopo sasa hivi kwenye ukurasa.\nMabadiliko yako yanaonyeshwa kwenye sanduku la chini.\nInabidi uingize mabadiliko yako ndani ya sanduku la juu.\nNi maandiko yaliyopo ndani ya sanduku la juu '''tu''' ambayo yatahifadhiwa utakapobonyeza \"{{int:savearticle}}\".",
+       "explainconflict": "Mtu mwingine amebadilisha ukurasa huu tangu ulipoanza kuihariri.\nSanduku la juu inaonyesha maandiko yaliyopo sasa hivi kwenye ukurasa.\nMabadiliko yako yanaonyeshwa kwenye sanduku la chini.\nInabidi uingize mabadiliko yako ndani ya sanduku la juu.\nNi maandiko yaliyopo ndani ya sanduku la juu '''tu''' ambayo yatahifadhiwa utakapobonyeza \"$1\".",
        "yourtext": "Maandishi yako",
        "storedversion": "Pitio lililohifadhiwa mwishoni",
        "nonunicodebrowser": "'''Ilani: Kivinjari chako hakikubaliani na Unicode.''' \nIli uweze kuhariri kurasa sawasawa, herufi zisizo za ASCII zitaonekana katika sanduku la kuhariri kama msimbo wa hexadecimali.",
        "right-editsemiprotected": "Hariri kurasa zilizozuiwa kama \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Hariri yaliyomo katika ukurasa",
        "right-editinterface": "Kuhariri kusano ya mtumiaji",
-       "right-editusercssjs": "Hariri mafaili ya CSS na Hatijava ya watumiaji wengine",
        "right-editusercss": "Hariri mafaili ya CSS ya watumiaji wengine",
        "right-edituserjs": "Hariri mafaili ya JavaScript ya watumiaji wengine",
        "right-editmyusercss": "Hariri faili zako za CSS",
        "rcshowhidemine": "$1 masahihisho yangu",
        "rcshowhidemine-show": "Onyesha",
        "rcshowhidemine-hide": "Ficha",
-       "rclinks": "Onyesha mabadiliko $1 yaliyofanywa wakati wa siku $2 zilizopita<br />$3",
+       "rclinks": "Onyesha mabadiliko $1 yaliyofanywa wakati wa siku $2 zilizopita",
        "diff": "tofauti",
        "hist": "hist",
        "hide": "Ficha",
        "undeleteviewlink": "tazama",
        "undeleteinvert": "Geuza uteuzi",
        "undeletecomment": "Sababu:",
-       "undeletedrevisions": "{{PLURAL:$1|pitio 1 lilirudishwa|mapitio $1 yalirudishwa}}",
-       "undeletedfiles": "{{PLURAL:$1|faili 1 lilirudishwa|mafaili $1 yalirudishwa}}",
        "cannotundelete": "Kurudisha ukurasa imeshindikana;\nhuenda ikawa mtu mwingine ameurudisha tayari.",
        "undelete-header": "Tazama [[Special:Log/delete|kumbukumbu za ufutaji]] ili kujua kurasa zipi zilizofutwa hivi karibuni.",
        "undelete-search-title": "Tafuta kwenye kurasa zilizofutwa",
        "logentry-newusers-create2": "$1 alianzisha akaunti ya mtumiaji $3",
        "logentry-newusers-autocreate": "Akaunti ya mtumiaji $1 {{GENDER:$2|ilianzishwa}} na mashine",
        "rightsnone": "(hana)",
-       "revdelete-summary": "muhtasari wa kuhariri",
        "feedback-adding": "Maoni yanaongezwa katika ukurasa...",
        "feedback-back": "Rudi",
        "feedback-cancel": "Batilisha",
index 70344cf..13812a5 100644 (file)
        "externaldberror": "Je jaki feler we zewnyntrznyj baźe autentyfikacyjnyj, abo ńy mosz uprawńyń potrzebnych do aktualizacyji zewnyntrznego kůnta.",
        "login": "Zaloguj śe",
        "nav-login-createaccount": "Logowańy / Tworzyńy kůnta",
-       "userlogin": "Logowańy / Tworzyńy kůnta",
-       "userloginnocreate": "Zaloguj śe",
        "logout": "Wyloguj",
        "userlogout": "Uodloguj śe",
        "notloggedin": "Ńy jeżeś zalogowany",
        "userlogin-noaccount": "Ńy mosz kůnta?",
        "userlogin-joinproject": "Doćep śe do {{SITENAME}}",
-       "nologin": "Ńy mosz kůnta? '''$1'''.",
-       "nologinlink": "Twůrz kůnto",
        "createaccount": "Twůrz nowe kůnto",
-       "gotaccount": "Mosz już kůnto? '''$1'''.",
-       "gotaccountlink": "Naloguj śe",
-       "userlogin-resetlink": "Zapomńoł żeś dane lo nalogowańo?",
        "userlogin-resetpassword-link": "Ńy pamjyntosz hasła?",
        "userlogin-helplink2": "Hilfa przi logůwańu",
        "userlogin-loggedin": "Zalogowano kej {{GENDER:$1|$1}}. Użyj formulara půńiżyj, coby zalogować śe kej inkszy używocz.",
        "createacct-another-email-ph": "Nastow e-brif",
        "createaccountmail": "Użyj chwilowygo hasła losowo genyrowanygo a wyślij je na wrychtowany adres e-brifa.",
        "createacct-realname": "Prawdźiwe imje a nazwisko (uopcjůnalńe)",
-       "createaccountreason": "Kůmyntorz:",
        "createacct-reason": "Powůd:",
        "createacct-reason-ph": "Pojakymu tworzisz nowe kůnta",
        "createacct-submit": "Twůrz kůnto",
        "passwordreset-disabled": "No tyj wiki zamkńynto resytowańy hasył.",
        "passwordreset-username": "Miano ôd używŏcza:",
        "passwordreset-domain": "Domyna:",
-       "passwordreset-capture": "Pokozać treść e-brifa?",
-       "passwordreset-capture-help": "Eli zaznaczysz to pole, uobejrzisz wjadůmość e-brifa ze hasłym.",
        "passwordreset-email": "E-brif:",
        "passwordreset-emailtitle": "Kůnto na {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Ftoś (cheba Ty, s IP $1)\npado, aże chce informacyji lo konta do {{GRAMMAR:MS.lp{{SITENAME}}}} ($4).\nZe tym ausdrukym sům powjůnzane kůnta:\n$2\n\n{{PLURAL:$3|Tymczasowygo hasła|Tymczasowych hasył}} możno użyć we {{PLURAL:$5|jedyn dźyń|$5 dńi}}.\n\nJak chćołżeś gynał to zrobjyć, to zaloguj śe terozki a podej swoje hasło.\n\nJak ftoś inkszy chćoł nowe hasło abo jak Ci śe przipůmńoło stare a ńy chcysz nowygo, to zignoruj to a używej starygo hasła.",
        "editingsection": "Sprowjosz $1 (sekcyjo)",
        "editingcomment": "Sprowjosz \"$1\" (nowy kůmyntorz)",
        "editconflict": "Kůnflikt sprowjyń: $1",
-       "explainconflict": "Ftoś zdůnżůł wćepać swoja wersyjo artikla ńim żeś naszkryflou sprowjyńy.\nWe polu edycyji na wjyrchu mosz tekst zajty aktuelńy naszkryflany we baźe danych.\nTwoje pomjyńańo sům we polu edycyji půńiżyj.\nBy wćepać swoje pomjyńańo muśisz pomjyńać tekst we polu na wjyrchu.\n'''Ino''' tekst ze pola na wjyrchu bydźe naszkryflany we baźe jak \nwciśńesz knefel \"{{int:savearticle}}\".",
+       "explainconflict": "Ftoś zdůnżůł wćepać swoja wersyjo artikla ńim żeś naszkryflou sprowjyńy.\nWe polu edycyji na wjyrchu mosz tekst zajty aktuelńy naszkryflany we baźe danych.\nTwoje pomjyńańo sům we polu edycyji půńiżyj.\nBy wćepać swoje pomjyńańo muśisz pomjyńać tekst we polu na wjyrchu.\n'''Ino''' tekst ze pola na wjyrchu bydźe naszkryflany we baźe jak \nwciśńesz knefel \"$1\".",
        "yourtext": "Twůj tekst",
        "storedversion": "Naszkryflano wersyjo",
        "nonunicodebrowser": "'''Pozůr! Twoja przeglůndorka ńy umi poprawńe rozpoznować kodowańo UTF-8 (Unicode). Bestůż wszyjske znoki, kerych Twojo przeglůndorka ńy umi rozpoznować, zamjeńůno na jejich kody heksadecymalne.'''",
        "saveprefs": "Spamjyntej",
        "restoreprefs": "Wćep wszyjskie důmyślne preferencyje",
        "prefs-editing": "Sprowjańy",
-       "rows": "Wjyrsze:",
-       "columns": "Kolůmny:",
        "searchresultshead": "Sznupańy",
        "stub-threshold": "Maksymalny rozmjar artikla uoznaczanygo kej <a href=\"#\" class=\"stub\">stub (kůnsek)</a>",
        "stub-threshold-disabled": "Uodymkńynte",
        "userrights-reason": "Czymu:",
        "userrights-no-interwiki": "Ńy mosz dostympu do sprowjańo uprawńyń.",
        "userrights-nodatabase": "Baza danych $1 ńy istńije abo ńy je lokalno.",
-       "userrights-nologin": "Muśisz [[Special:UserLogin|zalůgować śe]] na kůnto admińistratora, coby nadować uprawńyńo użytkowńikům.",
-       "userrights-notallowed": "Ńy mosz dostympu do nadawańo uprawńyń używaczom.",
        "userrights-changeable-col": "Grupy, kere moges wybrać",
        "userrights-unchangeable-col": "Grupy, kerych ńy moges wybrać",
        "group": "Grupa:",
        "right-protect": "Zmjyń poźůmy zawarć i sprowjej zawarte zajty",
        "right-editprotected": "Sprowjej zawarte zajty (ze zawarćym kaskadowym)",
        "right-editinterface": "Sprowjej interfejs użytkowńika",
-       "right-editusercssjs": "Sprowjej pliki CSS i JS inkszych użytkowńikůw",
        "right-editusercss": "Sprowjej pliki CSS inkszych użytkowńikůw",
        "right-edituserjs": "Sprowjej pliki JS inkšych užytkowńikůw",
        "right-rollback": "Rewert drap sprawjyńo uostatńygo użytkowńika kery sprowjoł dano zajta",
        "rcshowhidemine": "$1 uody mje sprowjůne",
        "rcshowhidemine-show": "Pokoż",
        "rcshowhidemine-hide": "Schrůń",
-       "rclinks": "Ukoż uostatńe $1 sprowjyń bez uostatńe $2 dńi.<br />$3",
+       "rclinks": "Ukoż uostatńe $1 sprowjyń bez uostatńe $2 dńi.",
        "diff": "zmj.",
        "hist": "gysz.",
        "hide": "Schrůń",
        "undeleteviewlink": "ukoż",
        "undeleteinvert": "Zaznocz na uopy",
        "undeletecomment": "Powůd wćepańo nazod:",
-       "undeletedrevisions": "Wćepano nazod {{PLURAL:$1|1 wersyja|$1 wersyje|$1 wersyji}}",
-       "undeletedrevisions-files": "Wćepano nazod $1 {{PLURAL:$1|wersyja|wersyje|wersyji}} i $2 {{PLURAL:$2|plik|pliki|plikůw}}",
-       "undeletedfiles": "wćepou nazod $1 {{PLURAL:$1|plik|pliki|plikůw}}",
        "cannotundelete": "Wćepańy nazod ńy powjodo śe.\nKto inkšy můgu wćepać nazod zajta pjyrwšy.",
        "undeletedpage": "'''Wćepano nazod zajta $1.'''\n\nUobejřij [[Special:Log/delete|rejer wyćepań]], kejbyś chćou přeglůndnůnć uostatnie uoperacyje wyćepywańo i wćepywańo nazod zajtůw.",
        "undelete-header": "Uobejřij [[Special:Log/delete|rejer wyćepań]] coby sprawdźić uostatńo wyćepane zajty.",
        "logentry-newusers-create": "Kůnto {{GENDER:$2|używocza}} $1 uostało stworzůne",
        "logentry-upload-upload": "$1 {{GENDER:$2|posłoł|posłała}} $3",
        "rightsnone": "podstawowo",
-       "revdelete-summary": "uopis pomjyńań",
        "searchsuggest-search": "Sznupej we {{SITENAME}}",
        "expand_templates_ok": "OK"
 }
index f244230..9a4bfb6 100644 (file)
@@ -69,6 +69,7 @@
        "tog-watchdefault": "நான் தொகுக்கும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்",
        "tog-watchmoves": "நான் நகர்த்தும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்.",
        "tog-watchdeletion": "நான் நீக்கும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்",
+       "tog-watchuploads": "நான் பதிவேற்றும் புதிய கோப்புகளை எனது கவனிப்புப் பட்டியலில் சேர்க்கவும்",
        "tog-watchrollback": "நான் பின்மாற்றம் செய்த எனது கவனிப்பு பட்டியலில் பக்கங்களை சேர்",
        "tog-minordefault": "இயல்பிருப்பாக அனைத்து தொகுப்புகளையும் சிறியது எனக் குறித்துக்கொள்.",
        "tog-previewontop": "தொகுப்புப் பெட்டிக்கு முன்பு முன்தோற்றத்தைக் காட்டு",
@@ -93,7 +94,7 @@
        "tog-ccmeonemails": "ஏனைய பயனர்களுக்கு நான் அனுப்பும் மின்னஞ்சல்களின் நகலொன்றை எனக்கு அனுப்பு",
        "tog-diffonly": "மாற்றங்களை ஒப்பிடும் போது அதன் கீழ் பக்க உள்ளடக்கத்தைக் காட்டாதே",
        "tog-showhiddencats": "மறைக்கப்பட்ட பகுப்புகளைக் காட்டு",
-       "tog-norollbackdiff": "à®®à¯\81னà¯\8dபிரà¯\81நà¯\8dத à®¨à®¿à®²à¯\88à®\95à¯\8dà®\95à¯\81à®\95à¯\8d à®\95à¯\8aணà¯\8dà®\9fà¯\81வநà¯\8dதபினà¯\8d à®µà®¿à®¤à¯\8dதியாà®\9aà®\99à¯\8dà®\95ளà¯\88 à®µà®¿à®\9fà¯\8dà®\9fà¯\81விà®\9fவà¯\81à®®à¯\8d (à®\95ாà®\9fà¯\8dà®\9fதà¯\8dதà¯\87வà¯\88யிலà¯\8dலà¯\88).",
+       "tog-norollbackdiff": "à®®à¯\81னà¯\8dபிரà¯\81நà¯\8dத à®¨à®¿à®²à¯\88à®\95à¯\8dà®\95à¯\81à®\95à¯\8d à®\95à¯\8aணà¯\8dà®\9fà¯\81வநà¯\8dதபினà¯\8d à®µà®¿à®¤à¯\8dதியாà®\9aà®\99à¯\8dà®\95ளà¯\88 à®\95ாà®\9fà¯\8dà®\9fதà¯\8dதà¯\87வà¯\88யிலà¯\8dலà¯\88",
        "tog-useeditwarning": "தொகுத்துக் கொண்டிருக்கும் பக்கத்தை சேமிக்காமல் வெளியேறினால் எனக்கு எச்சரிக்கை செய்",
        "tog-prefershttps": "புகுபதிகை செய்யும்போது எப்போதுமே பாதுகாப்பான இணைப்பை பயன்படுத்தவும்",
        "underline-always": "எப்பொழுதும்",
        "password-change-forbidden": "நீங்கள் விக்கிகளில் கடவுச் சொற்களை மாற்ற முடியாது",
        "externaldberror": "வெளி உறுதிப்படுத்தலில் ஏற்பட்ட தவறு காரணமாக உங்கள் வெளி கணக்கை இற்றைப்படுத்த முடியாது.",
        "login": "புகுபதிகை",
+       "login-security": "தங்கள் அடையாளத்தை உறுதிப்படுத்தவும்",
        "nav-login-createaccount": "புகுபதிகை/பயனர் கணக்கு தொடக்கம்",
-       "userlogin": "புகுபதிகை/பயனர் கணக்கு தொடக்கம்",
-       "userloginnocreate": "புகுபதிகை",
        "logout": "விடுபதிகை",
        "userlogout": "விடுபதிகை",
        "notloggedin": "புகுபதிகை செய்யப்படவில்லை",
        "userlogin-noaccount": "பயனர் கணக்கு இல்லையா?",
        "userlogin-joinproject": "{{SITENAME}}-இல் இணைக",
-       "nologin": "பயனர் கணக்கு இல்லையா? '''$1'''.",
-       "nologinlink": "கணக்கு ஒன்றை உருவாக்கவும்",
        "createaccount": "புதிய கணக்கை உருவாக்கு",
-       "gotaccount": "ஏற்கனவே பயனர் கணக்கு உள்ளதா? '''$1'''.",
-       "gotaccountlink": "புகுபதிகை",
-       "userlogin-resetlink": "உங்கள் புகுபதிகைக் குறிப்புகளை மறந்துவிட்டீர்களா?",
        "userlogin-resetpassword-link": "உங்கள் கடவுச் சொல்லை மறந்து விட்டீர்களா?",
        "userlogin-helplink2": "உள்நுழைவதற்கு உதவி",
        "userlogin-loggedin": "நீங்கள் {{GENDER:$1|$1}} ஆக புகுபதியவில்லை.\nகீழ் உள்ள படிவத்தை பயன்படுத்தி இன்னொரு பயனராக புகுபதிவு செய்க.",
        "createacct-another-email-ph": "உங்கள் மின்னஞ்சல் முகவரியை உள்ளிடுக",
        "createaccountmail": "தற்காலிகமாக எழுந்தமான ஒரு கடவுச்சொல்லை பயன்படுத்துக, அதை குறித்துள்ள மின்னஞ்சலுக்கு அனுப்புக",
        "createacct-realname": "உண்மைப் பெயர் (விருப்பத்தேர்வு)",
-       "createaccountreason": "காரணம்:",
        "createacct-reason": "காரணம்",
        "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-another-realname-tip": "உண்மையான பெயர் கட்டாயமற்றது.\nநீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.",
        "pt-login": "உள்நுழை",
        "pt-login-button": "புகுபதிகை",
+       "pt-login-continue-button": "உள்நுழைவை தொடரவும்",
        "pt-createaccount": "புதிய கணக்கை உருவாக்கவும்",
        "pt-userlogout": "விடுபதிகை",
        "php-mail-error-unknown": "PHP 's mail() செயல்பாட்டில் அறியப்படாத பிழை.",
        "newpassword": "புதிய கடவுச்சொல்:",
        "retypenew": "புதிய கடவுச்சொல்லை மீண்டும் தட்டச்சிடு",
        "resetpass_submit": "கடவுச்சொல்லை பதிவுசெய்து புகுபதிகை செய்",
-       "changepassword-success": "à®\89à®\99à¯\8dà®\95ளதà¯\81 à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®µà¯\86à®±à¯\8dறிà®\95ரமாà®\95 à®®à®¾à®±à¯\8dறபà¯\8dபà®\9fà¯\8dà®\9fà¯\81ளà¯\8dளது!",
+       "changepassword-success": "à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à®¾à®±à¯\8dறபà¯\8dபà®\9fà¯\8dà®\9fது!",
        "changepassword-throttled": "தாங்கள் மிக அண்மையில் பலமுறை புகுபதிகை செய்ய முயற்சி செய்துள்ளீர்கள்.\nமீண்டும் முயற்சிக்கும் முன் $1 காத்திருக்கவும்.",
        "botpasswords": "தானியங்கி கடவுச்சொற்கள்",
        "botpasswords-disabled": "தானியங்கி கடவுச்சொற்கள் பயன்பாட்டில் இல்லை.",
        "botpasswords-insert-failed": "\"$1\" என்ற தானியங்கி பெயரை இணைக்க முடியவில்லை. ஏற்கனவே இருக்குமோ?",
        "botpasswords-update-failed": "\"$1\" என்ற தானியங்கி பெயரை புதிப்பிக்க முடியவில்லை. அது நீக்கப்பட்டதா?",
        "botpasswords-created-title": "தானியங்கி கடவுச்சொல் உருவாக்கப்பட்டது.",
-       "botpasswords-created-body": "\"$1\"-க்கான தானியங்கி கடவுச்சொல் முழுமையாக உருவாக்கப்பட்டது.",
+       "botpasswords-created-body": "\"$2\" பயனரின் \"$1\"-க்கான தானியங்கி கடவுச்சொல் முழுமையாக உருவாக்கப்பட்டது.",
        "botpasswords-updated-title": "தானியங்கி கடவுச்சொல் புதுப்பிக்கப்பட்டது",
-       "botpasswords-updated-body": "\"$1\" தானியங்கி கடவுச்சொல் முழுமையாக புதிப்பிக்கப்பட்டது.",
+       "botpasswords-updated-body": "\"$2\" பயனரின் \"$1\" தானியங்கி கடவுச்சொல் முழுமையாக புதிப்பிக்கப்பட்டது.",
        "botpasswords-deleted-title": "தானியங்கி கடவுச்சொல் நீக்கப்பட்டது",
-       "botpasswords-deleted-body": "\"$1\"-க்கான தானியங்கி கடவுச்சொல் நீக்கப்பட்டது.",
+       "botpasswords-deleted-body": "\"$2\" பயனரின் \"$1\"-க்கான தானியங்கி கடவுச்சொல் நீக்கப்பட்டது.",
        "botpasswords-newpassword": "<strong>$1</strong>-இற்கு புகுபதிகை செய்வதற்கான புதிய கடவுச்சொல் <strong>$2</strong> ஆகும். <em>தயவு செய்து வருங்கால மேற்கோளுக்கு இதனை பதிக.</em><br>(பழைய முகவர்கள்  பயனாளர் பெயரை உள்ளீட்டிற்கு பயன்படுத்தலாம், மேலும் நீங்கள் <strong>$3</strong> ஐ பயனாளர் பெயராகவும் <strong>$4</strong>  ஐ கடவுச்சொல்லாகவும் பயன்படுத்தலாம்.)",
        "botpasswords-no-provider": "தானியங்கிகடவுச்சொல்அமர்வுவழங்குநர் பயன்பாட்டில் இல்லை.",
        "botpasswords-restriction-failed": "தானியங்கி கடவுச்சொல் புகுபதிகை செய்ய தடுக்கிறது.",
        "botpasswords-invalid-name": "தானியங்கி கடவுச்சொல் பிரிப்பானை (\"$1\") குறிக்கப்பட்ட பயனர் பெயர் கொண்டிருக்கவில்லை.",
        "botpasswords-not-exist": "\"$1\" என்ற பயனர் \"$2\" என்ற தானியங்கி கடவுச்சொல்லை கொண்டிருக்கவில்லை.",
        "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-invalidemail": "செல்லுபடியற்ற அஞ்சல் முகவரி",
+       "passwordreset-nodata": "பயனர் பெயர் மற்றும் மின்னஞ்சல் முகவரி கொடுக்கப்படவில்லை",
        "changeemail": "மின்னஞ்சல் முகவரியை மாற்று / நீக்கு",
        "changeemail-header": "இந்த படிவத்தை உங்கள் மின்னஞ்சல் முகவரியை மாற்ற பூர்த்தி செய்யவும். நீங்கள் இந்த மாற்றத்தை உறுதிசெய்ய உங்கள் கடவுச்சொல்லை உள்ளிட வேண்டிவரும்.  உங்கள் கணக்கிலிருந்து ஏதாவது மின்னஞ்சலை நீக்க விரும்பினால், படிவத்தை சமர்ப்பிக்கும்போது மின்னஞ்சல் முகவரியை காலியாக விடவும்.",
        "changeemail-no-info": "இப்பக்கத்தை நேரடியாக அணுகுவதற்கு நீங்கள் புகுபதிகை செய்திருக்கவேண்டும்.",
        "preview": "முன்தோற்றம்",
        "showpreview": "முன்தோற்றம் காட்டு",
        "showdiff": "மாற்றங்களைக் காட்டு",
-       "blankarticle": "<strong>எச்சரிக்கை:</strong> நீங்கள் வெற்றுப்பக்கத்தை உருவாக்குகிறீர்கள்.\n\"{{int:savearticle}}\" ஐ மீண்டும் அழுத்தினால், எந்த உள்ளடக்கமும் இன்றி பக்கம் உருவாக்கப்படும்.",
+       "blankarticle": "<strong>எச்சரிக்கை:</strong> நீங்கள் வெற்றுப்பக்கத்தை உருவாக்குகிறீர்கள்.\n\"$1\" ஐ மீண்டும் அழுத்தினால், எந்த உள்ளடக்கமும் இன்றி பக்கம் உருவாக்கப்படும்.",
        "anoneditwarning": "<strong>எச்சரிக்கை:</strong> நீங்கள் புகுபதிகை செய்யவில்லை. நீங்கள் தொகுத்தால் உங்கள் ஐ.பி. முகவரி எல்லோருக்கும் தெரியும்படி இருக்கும். நீங்கள் <strong>[$1 புகுபதிகை செய்தாலோ]</strong> அல்லது <strong>[$2 புதிய கணக்கு உருவாக்கினாலோ]</strong>, பிற பயன்களோடு நீங்கள் செய்யும் தொகுப்புகள் உங்கள் பயனர் பெயரோடு தொடர்புப்படுத்திக்காட்டப்படும்.",
        "anonpreviewwarning": "நீங்கள் புகுபதிகை செய்யவில்லை. இந்த பக்கத்தை சேமித்தால் உஙகள் ஐ.பி. முகவரி இதன் வரலாற்றுப் பக்கத்தில் பதிவாகும்.",
        "missingsummary": "'''நினைவூட்டல்:''' நீர் தொகுப்புச் சுருக்கமொன்றைக் கொடுக்கவில்லை.\nஇன்னொரு முறை பக்கத்தை சேமி என்பதை அழுத்தினால் உங்கள் தொகுப்பு சுருக்கமெதுவுமில்லாமல் சேமிக்கப்படும்.",
-       "selfredirect": "<strong>எச்சரிக்கை:</strong> நீங்கள் இப்பக்கத்தை இதற்கே வழிமாற்றுகிறீர்கள்.\nநீங்கள் வழிமாற்றுக்கான இலக்கை தவறாக குறிப்பிட்டிருக்கலாம், அல்லது தவறான பக்கத்தை திருத்திக் கொண்டிருக்கலாம்.\n\"{{int:savearticle}}\" ஐ மீண்டும் அழுத்தினால், எவ்வகையிலாது வழிமாற்று உருவாக்கப்படும்.",
+       "selfredirect": "<strong>எச்சரிக்கை:</strong> நீங்கள் இப்பக்கத்தை இதற்கே வழிமாற்றுகிறீர்கள்.\nநீங்கள் வழிமாற்றுக்கான இலக்கை தவறாக குறிப்பிட்டிருக்கலாம், அல்லது தவறான பக்கத்தை திருத்திக் கொண்டிருக்கலாம்.\n\"$1\" ஐ மீண்டும் அழுத்தினால், எவ்வகையிலாது வழிமாற்று உருவாக்கப்படும்.",
        "missingcommenttext": "கீழே சுருக்கமொன்றக் குறிப்பிடவும்.",
        "missingcommentheader": "'''நினைவூட்டல்:'''  தாங்கள் தொகுத்தற்கான சுருக்கமான உரையை கொடுக்கவில்லை.\n\nஇன்னொருமுறை 'சேமி' என்பதனை அழுத்தினால் எந்தவித சுருக்கமான உரையின்றி சேமிக்கப்படும்.",
        "summary-preview": "சுருக்க முன்தோற்றம்:",
        "editingsection": "தொகுப்பு $1 (பிரிவு)",
        "editingcomment": "$1 தொகுக்கப்படுகிறது (புதிய பிரிவு)",
        "editconflict": "முரண்பாடுகளைத் தொகுக்கவும்: $1",
-       "explainconflict": "நீங்கள் தொகுக்கத் தொடங்கியதின் பின்னர் வேறு பயனரொருவர் இப் பக்கத்தில் மாற்றங்கள்ச் செய்துள்ளார்.\nஉரைப் பகுதியின்  மேற்பக்கம் தற்போதுள்ள உரைகளைக் கொண்டிருகிறது.\nநீங்கள் செய்த மாற்றங்கள் உரையின் கீழே தரப்பட்டுள்ளன.\nநீங்கள் உங்களுடைய மாற்றங்களை ஏற்கெனவேயிருக்கும் உரையுடன் ஒருங்கிணைக்க வேண்டியிருக்கும்.\n\"{{int:savearticle}}\" என்ற பொத்தானை அழுத்தும்போது உரைப்பகுதியின் மேற்பக்கத்திலுள்ள உரை '''மட்டுமே''' சேமிக்கப்படும்.",
+       "explainconflict": "நீங்கள் தொகுக்கத் தொடங்கியதின் பின்னர் வேறு பயனரொருவர் இப் பக்கத்தில் மாற்றங்கள்ச் செய்துள்ளார்.\nஉரைப் பகுதியின்  மேற்பக்கம் தற்போதுள்ள உரைகளைக் கொண்டிருகிறது.\nநீங்கள் செய்த மாற்றங்கள் உரையின் கீழே தரப்பட்டுள்ளன.\nநீங்கள் உங்களுடைய மாற்றங்களை ஏற்கெனவேயிருக்கும் உரையுடன் ஒருங்கிணைக்க வேண்டியிருக்கும்.\n\"$1\" என்ற பொத்தானை அழுத்தும்போது உரைப்பகுதியின் மேற்பக்கத்திலுள்ள உரை '''மட்டுமே''' சேமிக்கப்படும்.",
        "yourtext": "உங்கள் உரை",
        "storedversion": "சேமிக்கப்பட்ட பதிப்பு",
        "nonunicodebrowser": "'''எச்சரிக்கை: உங்களது உலாவி ஒருங்குக்குறியை ஆதரிக்கவில்லை. உங்கள் தொகுப்புக்களைத் பாதுகாப்பகத் தொடர்ந்துச் செய்ய வழிமுறையொன்றுள்ளது: அஸ்கியில்லாத எழுத்துகள் அடி பதினாறைக் கொண்ட குறிகளாக தொகுப்புக் கட்டத்தில் தென்படும்.'''",
        "content-model-css": "சிஎஸ்எஸ்",
        "content-json-empty-object": "காலி பொருள்",
        "content-json-empty-array": "காலி அணி",
+       "deprecated-self-close-category": "தவறாக சுய மூடப்பட்ட HTML குறிச்சொற்களை பயன்படுத்தும் பக்கங்கள்",
        "duplicate-args-category": "வார்ப்புரு அழைப்பில் ஒத்த விவாதங்களை கொண்ட பக்கங்கள்",
        "duplicate-args-category-desc": "இப்பக்கம் விவாதங்களின் ஒத்த வடிவங்களைப் பயன்படுத்தும் வார்ப்புருக்களை, எடுத்துக்காட்டக <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code> கொண்டுள்ளது.",
        "expensive-parserfunction-warning": "எச்சரிக்கை: இப்பக்கம் அதிகளவு இலக்கணப் பாகுபடுத்திச் சார்புகளைக் கொண்டுள்ளது.\n\nஇது $2 {{PLURAL:$2|சார்புக்கும்|சார்புகளுக்கும் }} குறைவான இலக்கணப் பாகுபடுத்திச் சார்புகளைக் கொண்டிருக்க வேண்டும், ஆனால் தற்போது இதில் {{PLURAL:$1|$1 சார்பு|$1 சார்புகள்}} உள்ளன.",
        "mergehistory-empty": "இணைக்கப்படக்கூடிய திருத்தங்கள் எதுவுமில்லை.",
        "mergehistory-done": "$1 பக்கத்தின் {{PLURAL:$3|ஒரு திருத்தம்|$3 திருத்தங்கள்}} வெற்றிகரமாக [[:$2]] பக்கத்தில் இணைக்கப்பட்ட{{PLURAL:$3|து|ன}}.",
        "mergehistory-fail": "வரலாற்றை இணைக்க முடியவில்லை. அருள் கூர்ந்து நேரங்களை ஒரு முறை சரி பார்க்கவும்.",
+       "mergehistory-fail-bad-timestamp": "செல்லுப்படியாகாத நேர முத்திரை.",
        "mergehistory-fail-invalid-source": "மூலப்பக்கம் பயன்பாட்டில் இல்லை.",
        "mergehistory-fail-invalid-dest": "இலக்குப் பக்கம் செல்லுபடியற்றது.",
+       "mergehistory-fail-permission": "வரலாறுகளை ஒன்றினைக்க தேவையாக அதிகாரங்கள் இல்லை.",
        "mergehistory-fail-toobig": "$1 அளவுக்கு மேல் வரலாறு இணைப்பு செய்ய இயலவில்லை {{PLURAL:$1|revision|திருத்தங்கள்}} நகர்த்தப்படும்.",
        "mergehistory-no-source": "மூலப் பக்கம் $1 இல்லை.",
        "mergehistory-no-destination": "இலக்குப் பக்கம் $1 இல்லை.",
        "search-interwiki-caption": "உறவுத் திட்டங்கள்",
        "search-interwiki-default": "$1 தளத்திலிருந்து முடிவுகள்:",
        "search-interwiki-more": "(மேலும்)",
+       "search-interwiki-more-results": "மேலும் முடிவுகள்",
        "search-relatedarticle": "தொடர்புடையவை",
        "searchrelated": "தொடர்புடையவை",
        "searchall": "அனைத்தும்",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" ஆல் பாதுகாக்கப்பட்ட பக்கங்களை திருத்து",
        "right-editcontentmodel": "பக்கத்தின் உள்ளடக்க வகையைத் திருத்து",
        "right-editinterface": "பயனர் இடைமுகப்பை தொகுக்கவும்",
-       "right-editusercssjs": "மற்ற பயனர்களின் CSS மற்றும் JavaScript கோப்புகளை திருத்து",
        "right-editusercss": "மற்ற பயனர்களின் CSS கோப்புகளை திருத்து",
        "right-edituserjs": "மற்ற பயனர்களின் சாவாநிரல் (JavaScript) கோப்புகளைத் திருத்து",
        "right-editmyusercss": "உங்களின் CSS கோப்புகளைத் திருத்து",
        "action-userrights-interwiki": "ஏனைய விக்கித் தளங்களின் பயனர் உரிமைகளைத் தொகு",
        "action-siteadmin": "தரவுதளத்தை பூட்டு அல்லது  பூட்டாதே",
        "action-sendemail": "மின்னஞ்சல்கள் அனுப்பு",
+       "action-editmyoptions": "உங்கள் விருப்பத்தேர்வுகளை தொகு",
        "action-editmywatchlist": "உங்கள் கவனிப்பு பட்டியலை தொகு",
        "action-viewmywatchlist": "உங்கள் கவனிப்பு பட்டியலை பார்",
        "action-viewmyprivateinfo": "உங்கள் தனிப்பட்ட தகவல்களைப் பார்",
        "action-managechangetags": "தரவுதளத்திலிருந்து அடையாளங்களை உருவாக்கு அல்லது நீக்கு",
        "action-applychangetags": "உங்கள் மாற்றங்களுடன் அடையாளங்களைச் செயற்படுத்து",
        "action-changetags": "தனியொருவரின் திருத்தம் மற்றும் செயற்பாட்டு பதிவுகளில் அடையாளங்களைச் சேர் அல்லது நீக்கு",
+       "action-purge": "இப்பக்கத்தினை துப்புரவாக்கு",
        "nchanges": "{{PLURAL:$1|ஓர் மாற்றம்|$1 மாற்றங்கள்}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|கடந்த வருகையிலிருந்து}}",
        "enhancedrc-history": "வரலாறு",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|புதிய பக்கங்கள் பட்டியலையும்]] காணவும்)",
        "recentchanges-submit": "காட்டு",
        "rcfilters-filterlist-title": "வடிப்பான்கள்",
+       "rcfilters-highlightmenu-title": "ஒரு நிறத்தை தேர்ந்தெடுக்கவும்",
+       "rcfilters-filterlist-noresults": "எந்த வடிப்பானும் காணப்படவில்லை",
        "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-editsbyself-description": "தங்களது தொகுப்புகள்.",
+       "rcfilters-filter-editsbyother-label": "மற்றவர் தொகுப்புகள்",
+       "rcfilters-filter-user-experience-level-newcomer-label": "புது வரவுகள்",
+       "rcfilters-filter-user-experience-level-learner-label": "கற்போர்",
+       "rcfilters-filter-user-experience-level-experienced-label": "அனுபவமுள்ள பயனர்கள்",
+       "rcfilters-filter-user-experience-level-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-filtergroup-changetype": "மாற்ற வகை",
+       "rcfilters-filter-pageedits-label": "பக்க தொகுப்புகள்",
        "rcfilters-filter-newpages-label": "பக்க உருவாக்கங்கள்",
        "rcnotefrom": "கீழே காணப்படுவது <strong>$3, $4</strong> இலிருந்து செய்யப்பட்ட (<strong>$1</strong> வரைக் காட்டப்பட்டுள்ளது) {{PLURAL:$5|மாற்றமாகும்.|மாற்றங்களாகும்.}}",
        "rclistfrom": "$2, $3 முதல் இன்று வரை செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்",
        "rcshowhidecategorization": "பக்க பகுப்பாக்கத்தை $1",
        "rcshowhidecategorization-show": "காட்டு",
        "rcshowhidecategorization-hide": "மறை",
-       "rclinks": "கடைசி $2 நாட்களில் கடைசி $1 மாற்றங்களைக் காட்டு.<br />$3",
+       "rclinks": "கடைசி $2 நாட்களில் கடைசி $1 மாற்றங்களைக் காட்டு.",
        "diff": "வேறுபாடு",
        "hist": "வரலாறு",
        "hide": "மறை",
        "apisandbox-request-url-label": "URL வேண்டுகோள்:",
        "apisandbox-request-time": "வேண்டுகோள் நேரம்: {{PLURAL:$1|$1 மிசெ}}",
        "apisandbox-results-fixtoken": "அட்டையை திருத்தி மீண்டும் சமர்பிக்கவும்",
+       "apisandbox-continue": "தொடரவும்",
+       "apisandbox-continue-clear": "வெறுமையாக்குக",
        "booksources": "நூல் மூலங்கள்",
        "booksources-search-legend": "நூல் மூலங்களைத் தேடு",
        "booksources-search": "தேடுக",
        "listgrouprights-namespaceprotection-header": "பெயர்வெளி கட்டுப்பாடு",
        "listgrouprights-namespaceprotection-namespace": "பெயர்வெளி",
        "listgrouprights-namespaceprotection-restrictedto": "பயனரை திருத்த அனுமதிக்கும் உரிமை(கள்)",
+       "listgrants-grant": "நல்கை",
        "listgrants-rights": "அணுக்கங்கள்",
        "trackingcategories": "பகுப்புகளை தடமறி",
        "trackingcategories-msg": "பகுப்புகளை தடமறிதல்",
        "changecontentmodel-title-label": "பக்கத் தலைப்பு",
        "changecontentmodel-model-label": "புது உள்ளடக்க மாதிரி",
        "changecontentmodel-reason-label": "காரணம்:",
+       "changecontentmodel-submit": "மாற்றுக",
        "changecontentmodel-success-title": "உள்ளடக்க மாதிரி மாற்றப்பட்டது",
        "changecontentmodel-success-text": "[[:$1]]-இன் உள்ளடக்க வகை மாற்றப்பட்டது",
        "log-name-contentmodel": "உள்ளடக்க மாதிரி மாற்றப் பதிகை",
        "undeleteviewlink": "பார்வையிடு",
        "undeleteinvert": "தேர்வு செய்ததை ரத்து  செய்",
        "undeletecomment": "காரணம்:",
-       "undeletedrevisions": "{{PLURAL:$1|1 திருத்தம் மீட்கப்பட்டது|$1 திருத்தங்கள் மீட்கப்பட்டன}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 திருத்தம்|$1 திருத்தங்கள்}} மற்றும் {{PLURAL:$2|1 கோப்பு|$2 கோப்புகள்}} மீட்கப்பட்டன.",
-       "undeletedfiles": "{{PLURAL:$1|ஒரு கோப்பு மீட்டெடுக்கப்பட்டது|$1 கோப்புகள் மீட்டெடுக்கப்பட்டன}}",
        "cannotundelete": "மீள்வித்தல் தோல்வி:\n$1",
        "undeletedpage": "'''$1 மீட்கப்பட்டது'''\n\nஅண்மைய நீக்கல்களுக்கும் மீட்புக்களுக்கும் [[Special:Log/delete|நீக்கல் பதிவைப்]] பார்க்கவும்.",
        "undelete-header": "அண்மையில் நீக்கப்பட்ட பக்கங்களைக் காண [[Special:Log/delete|நீக்கல் பதிவைப்]] பார்க்க.",
        "ipb-unblock": "ஐ.பி. அல்லது பயனருக்கான தடையை நீக்கு",
        "ipb-blocklist": "தற்போதுள்ள தடுப்புகளைப் பார்",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}}க்கு பங்களிப்புகள்",
+       "ipb-blocklist-duration-left": "$1 வெளியேறினர்",
        "unblockip": "பயனர் தடையை நீக்கு",
        "unblockiptext": "முன்னர் தடுக்கப்பட்ட ஐ.பி. முகவரி அல்லது பயனர்பெயரின் எழுத்து அணுக்கத்தை மீழ்விப்பதற்கு கீழேயுள்ள படிவத்தை பயன்படுத்தவும்.",
        "ipusubmit": "இந்தத் தடையை நீக்கு",
        "lockdbsuccesstext": "தரவுத்தளம் பூட்டப் பட்டது.<br />பராமரிப்பு முடிவடைந்ததும் [[Special:UnlockDB|பூட்டை நீக்க]] மறவாதீர்.",
        "unlockdbsuccesstext": "தரவுத்தளம் திறக்கப்பட்டது.",
        "lockfilenotwritable": "தரவுதள பூட்டு கோப்பு எழுதுமாறு  இல்லை.\nஇத்தரவுதளத்தை பூட்ட அல்லது பூட்டியதை நீக்க , இது  வலை சேவகன் எழுதுவதற்க்கேற்றவாறு இருக்க வேண்டும்.",
+       "databaselocked": "தரவுத்தளம் ஏற்கனவே பூட்டப்பட்டுள்ளது.",
        "databasenotlocked": "தரவுத்தளம் பூட்டப்படவில்லை.",
        "lockedbyandtime": "(இதன்படி{{GENDER:$1|$1}} on $2 at $3)",
        "move-page": "$1 பக்கத்தை நகர்த்து",
        "export-download": "கோப்பாக சேமி",
        "export-templates": "வார்ப்புருக்களையும் உள்ளடக்கு",
        "export-pagelinks": "இணைத்த பக்கங்களை கீழ்வரும்  ஆழம் வரை சேர்:",
+       "export-manual": "கைமுறையாக பக்கங்களை சேர்க:",
        "allmessages": "அனைத்து முறைமைசார் தகவல்கள் அட்டவணை",
        "allmessagesname": "பெயர்",
        "allmessagesdefault": "இயல்பிருப்பு உரை",
        "tooltip-ca-nstab-category": "பகுப்புப் பக்கத்தை பார்க்க",
        "tooltip-minoredit": "இம்மாற்றத்தை சிறிய தொகுப்பாக கருது",
        "tooltip-save": "உங்கள் மாற்றங்களைச் சேமிக்கவும்.",
+       "tooltip-publish": "மாற்றங்களைப் பதிப்பிடுக",
        "tooltip-preview": "நீங்கள் செய்த மாற்றங்களின் முன்தோற்றம் பார்க்கவும்! தயவுசெய்து, மாற்றங்களை சேமிக்கும் முன்னர் இதனைப் பயன்படுத்தவும்!",
        "tooltip-diff": "உரையில் நீங்கள் செய்த மாற்றங்களைக் காட்டவும்.",
        "tooltip-compareselectedversions": "இப் பக்கத்தின் தெரிவு செய்யப்பட்ட இரண்டு பதிப்புக்களுக்கு இடையிலான வேறுபாடுகளைப் பார்க்கவும்.",
        "pageinfo-category-pages": "பக்கங்களின் எண்ணிக்கை",
        "pageinfo-category-subcats": "துணைபகுப்புகளின் எண்ணிக்கை",
        "pageinfo-category-files": "கோப்புகளின் எண்ணிக்கை",
+       "pageinfo-user-id": "பயனர் அடையாளம்",
        "markaspatrolleddiff": "ரோந்திட்டதாக குறி",
        "markaspatrolledtext": "இதனை சுற்றுக்காவல் செய்ததாகக் குறி",
        "markaspatrolledtext-file": "இக்கோப்பு பதிப்பினை ரோந்திட்டதாக குறி",
        "patrol-log-header": "இது ரோந்து செய்யப்பட்ட  பரிசீலனைகளுக்கான  குறிப்பேடு.",
        "log-show-hide-patrol": "$1 ரோந்து குறிப்பேடு",
        "log-show-hide-tag": "$1 அடையாள பதிவு",
+       "confirm-markpatrolled-button": "சரி",
        "deletedrevision": "பழைய திருத்தம் $1 நீக்கப்பட்டது",
        "filedeleteerror-short": "பின்வரும் கோப்பை நீக்குவதில் தவறு: $1",
        "filedeleteerror-long": "கோப்பை நீக்கும் போது தவறுகள் ஏற்பட்டுள்ளன:\n\n$1",
        "newimages-showbots": "தானியிங்கி பதிவேற்றங்களைக் காட்டு",
        "newimages-hidepatrolled": "ரோந்திட்ட பதிவேற்றங்களை மறை",
        "noimages": "பார்வைக்கு ஓன்றுமில்லை.",
+       "gallery-slideshow-toggle": "வில்லைப்படங்களை ஊசலாடு",
        "ilsubmit": "தேடுக",
        "bydate": "நாள் வழி",
        "sp-newimages-showfrom": "$1, $2க்குப் பின்னரான புதியக் கோப்புக்களைக் காட்டுக",
        "confirm-watch-top": "இப்பக்கத்தை உங்கள் கவனிப்புப் பட்டியலில் சேர்க்க வேண்டுமா?",
        "confirm-unwatch-button": "சரி",
        "confirm-unwatch-top": "இப்பக்கத்தை உங்கள்  கவனிப்புப் பட்டியலிருந்து நீக்கா வேண்டுமா?",
+       "confirm-rollback-button": "சரி",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← முந்திய பக்கம்",
        "imgmultipagenext": "அடுத்தப் பக்கம் →",
        "htmlform-cloner-create": "மேலும் சேர்க",
        "htmlform-cloner-delete": "நீக்குக",
        "htmlform-cloner-required": "குறைந்து ஒரு மதிப்பு தேவைப்படும்.",
+       "htmlform-date-placeholder": "வவவவ-மாமா-தேதே",
+       "htmlform-time-placeholder": "மம:நிநி:நொநொ",
+       "htmlform-datetime-placeholder": "வவவவ-மாமா-தேதே மம:நிநி:நொநொ",
        "htmlform-title-badnamespace": "\"{{ns:$2}}\" பெயர்வெளியில் [[:$1]] இல்லை",
        "htmlform-title-not-creatable": "\"$1\" ஒரு உருவாக்கத்தக்க பக்கத் தலைப்பு அல்ல",
        "htmlform-title-not-exists": "$1 இ்டம்பெறவில்லை.",
        "logentry-managetags-deactivate": "$1 பயனர் மற்றும் தானியங்கிகள் பயன்படுத்துவதற்காக \"$4\" தொடுப்பை {{GENDER:$2|செயற்பாட்டை நிறுத்தினார்}}",
        "log-name-tag": "குறிச்சொல் குறிப்பு",
        "rightsnone": "(எதுவுமில்லை)",
-       "revdelete-summary": "தொகுப்பு சுருக்கத்தை",
        "feedback-adding": "பக்கத்தில் கருத்தைச் சேர்க்கிறது...",
        "feedback-back": "பின்செல்க",
        "feedback-bugcheck": "சிறப்பு! அது ஏற்கனவே  [ $1 தெரிந்த  bugs ] என்பதை மட்டும்  சரிபார்க்கவும்,",
        "pagelang-select-lang": "மொழியைத் தேர்ந்தெடு",
        "pagelang-reason": "காரணம்",
        "pagelang-submit": "சமர்ப்பி",
+       "pagelang-nonexistent-page": "பக்கம் $1 காணப்படவில்லை.",
        "right-pagelang": "பக்க மொழியை மாற்றுக",
        "action-pagelang": "பக்க மொழியை மாற்றுக",
        "log-name-pagelang": "மொழி பதிவை மாற்றுக",
        "log-description-pagelang": "இது பக்க மொழி மாற்றச் செயல்பாட்டின் பதிவு.",
        "logentry-pagelang-pagelang": "$3 க்கான பக்க மொழியை $4 இலிருந்து $5 க்கு $1 {{GENDER:$2|மாற்றினார்}}.",
+       "mediastatistics": "ஊடகம் பற்றிய புள்ளிவிவரங்கள்",
        "mediastatistics-bytespertype": "இந்த பிரிவக்கான மொத்த கோப்பளவு: $1 எண்ணுண்மி",
        "mediastatistics-allbytes": "அனைத்து கோப்புகளின் மொத்த கோப்பளவு: $1 எண்ணுண்மி",
        "mediastatistics-table-count": "கோப்புகளின் எண்ணிக்கை",
        "mediastatistics-header-video": "காணொளிகள்",
        "mediastatistics-header-office": "அலுவலகம்",
        "mediastatistics-header-text": "உரை வடிவ",
+       "mediastatistics-header-archive": "அமுக்கிய வடிவங்கள்",
        "mediastatistics-header-total": "அனைத்துக் கோப்புக்களும்",
        "json-error-syntax": "தொடரியல் பிழை",
        "special-characters-group-latin": "இலத்தீன்",
        "special-characters-group-ipa": "பன்னாட்டு ஒலிப்பு அரிச்சுவடி",
        "special-characters-group-symbols": "குறியீடுகள்",
        "special-characters-group-greek": "கிரேக்கம்",
+       "special-characters-group-greekextended": "நீடித்த கிரேக்கம்",
        "special-characters-group-cyrillic": "சைரிலிக் (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-noresults": "முடிவுகள் எதுவும் காணப்படவில்லை.",
        "mw-widgets-titleinput-description-new-page": "இப்பக்கம் இன்னும் உருவாக்கப்படவில்லை",
        "mw-widgets-titleinput-description-redirect": "$1-க்கு வழிமாற்று",
+       "mw-widgets-categoryselector-add-category-placeholder": "ஒரு பகுப்பைச் சேர்க...",
+       "mw-widgets-usersmultiselect-placeholder": "மேலும் சேர்க...",
        "sessionprovider-generic": "$1 பகுதி",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "குக்கீயை அடிபடையாக்கக் கொண்ட பகுதிகள்",
        "sessionprovider-nocookies": "குக்கீசு செயலற்று இருக்கலாம். உங்களது குக்கீசு செயலில் உள்ளது என உறுதிப்படுத்திவிட்டு மீண்டும் முயல்க.",
index a4911dc..196c581 100644 (file)
        "december-date": "ದಸಂಬರ $1",
        "period-am": "ಕಾಂಡೆ",
        "period-pm": "ಬೈಯ್ಯ",
-       "pagecategories": "{{PLURAL:$1|ವರ್ಗೊ|ವರ್ಗೊಲು}}",
+       "pagecategories": "{{PLURAL:$1|Category|ವರ್ಗೊಲು}}",
        "category_header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಲೇಕನೊಲು",
        "subcategories": "ಉಪ ವರ್ಗೊಲು",
        "category-media-header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಚಿತ್ರೊ/ಶಬ್ಧೊ ಫೈಲ್‍ಲು",
        "category-empty": "''ಈ ವರ್ಗೊಡು ಸದ್ಯಗ್ ಓವುಲ ಪುಟೊಲಾವಡ್ ಅತ್ತ್’ನ್ಡ ಚಿತ್ರೊಲಾವಡ್ ಇಜ್ಜಿ.''",
-       "hidden-categories": "{{PLURAL:$1|ದೆಂಗಾದ್ ದೀಡ್‍ನ ವರ್ಗೊ|ದೆಂಗಾದ್ ದೀಡ್‍ನ ವರ್ಗೊಲು}}",
+       "hidden-categories": "{{PLURAL:$1|Hidden category|ದೆಂಗಾದ್ ದೀಡ್‍ನ ವರ್ಗೊಲು}}",
        "hidden-category-category": "ದೆಂಗಾದ್ ದೀತಿನ ವರ್ಗೊಲು",
-       "category-subcat-count": "{{PLURAL:$2|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ ಉಪವರ್ಗ ಉಂಡು.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|ಉಪವರ್ಗೊನು|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
+       "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|subcategory|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
        "category-subcat-count-limited": "ಈ ವರ್ಗೊಡು ತಿರ್ತ್ ತೊಜ್ಪಾದಿನ {{PLURAL:$1|ಉಪವರ್ಗ|$1 ಉಪವರ್ಗೊಲು}} ಉಂಡು.",
-       "category-article-count": "{{PLURAL:$2|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ ಕಾಲಿ ಒಂಜಿ ಪುಟೊ ಉಂಡು.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|ಪುಟೊನು|$1 ಪುಟೊಲೆನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಪುಟೊಲು ಉಂಡು.}}",
+       "category-article-count": "{{PLURAL:$2|This category contains only the following page.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|page is|$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 ಫೈಲ್’ಲು ಉಂಡು}}.",
        "welcomecreation-msg": "ಈರೆನ ಕಾತೆನ್ ದೆತ್ತ್‌ದಾತ್ಂಡ್.  ಈರೆನ [[Special:Preferences|{{SITENAME}} ಆಯ್ಕೆನ್]]ಬದಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ.",
        "yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
        "userlogin-yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್",
-       "userlogin-yourname-ph": "ಈರೆನ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
+       "userlogin-yourname-ph": "ಈರೆನ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
        "createacct-another-username-ph": "ಈರೆನೆ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
        "yourpassword": "ಪಾಸ್-ವರ್ಡ್:",
        "userlogin-yourpassword": "ಪ್ರವೇಸೊಪದೊ",
        "password-change-forbidden": "ಈರ್ ಈ ವಿಕಿಡ್ ಪ್ರರವೇಸ ಪದೊನು ಬದಲ್ಪೆರೆ ಸಾದ್ಯೊ ಇದ್ದಿ.",
        "login": "ಲಾಗಿನ್ ಆಲೆ",
        "nav-login-createaccount": "ಲಾಗ್-ಇನ್ / ಅಕೌಂಟ್ ಸೃಷ್ಟಿ ಮಲ್ಪುಲೆ",
-       "userlogin": "ಲಾಗ್-ಇನ್ / ಅಕೌಂಟ್ ಸೃಷ್ಟಿ ಮಲ್ಪುಲೆ",
-       "userloginnocreate": "ಲಾಗಿನ್ ಆಲೆ",
        "logout": "ಲಾಗ್ ಔಟ್",
        "userlogout": "ಲಾಗ್ ಔಟ್",
        "notloggedin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
-       "userlogin-noaccount": "à²\95ಾತà³\86 à²\87ದà³\8dದಿಯಾ?",
+       "userlogin-noaccount": "à²\88ರà³\86ನ à²\96ಾತà³\86 à²\87à²\9cà³\8dà²\9cà³\87?",
        "userlogin-joinproject": "{{SITENAME}}ಗ್ ಸೇರ್ಲೆ",
-       "nologin": "ಈರೆನ ಖಾತೆ ಇಜ್ಜೇ?'''$1'''",
-       "nologinlink": "ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "createaccount": "ಪೊಸ ಅಕ್ಕೌಂಟ್ ಸುರು ಮಲ್ಪುಲೆ",
-       "gotaccount": "ಈರೆನ ಖಾತೆ ಉಂಡೇ?'''$1'''",
-       "gotaccountlink": "ಲಾಗಿನ್ ಆಲೆ",
-       "userlogin-resetlink": "ಈರೆನ ಲಾಗಿನ್ ವಿವರ ಮರತ್ತ್ಂಡೇ?",
        "userlogin-resetpassword-link": "ಈರೆನೆ ಪ್ರವೇಸೊ ಪದೊ ಮರತ್ತ್‌ಂಡಾ?",
        "userlogin-helplink2": "ಲಾಗಿನ್ ಆಯರ ಸಹಾಯೊ",
        "userlogin-createanother": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "createacct-another-email-ph": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "createaccountmail": "(ರಾಂಡಮ್) ತಾತ್ಕಾಲಿಕವಾದ್ ಯಾದೃಚ್ಛಿಕ ಪಾಸ್ವರ್ಡ್ ಆಯ್ಕೆ ಮಾಲ್ಪುಲೆ ಬುಕ್ಕೊ ಇಮೇಲ್ ವಿಳಾಸೊನು ಸೂಚಿಸದ್ : ಕಡಪುಡುಲೆ",
        "createacct-realname": "ನಿಜವಾಯಿನ ಪುದರ್(ಐಚ್ಛಿಕೊ)",
-       "createaccountreason": "ಕಾರಣ",
        "createacct-reason": "ಕಾರಣೊ",
        "createacct-reason-ph": "ಈರ್ ದಾಯೆ ನಾನಲ ಒಂಜಿ ಕಾತೆ ದೆತ್ತೊಂದುಲ್ಲರ್?",
        "createacct-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "createacct-another-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
-       "createacct-benefit-heading": "{{SITENAME}}ನಿà²\95à³\8dಲà³\86ನà²\82à²\9aಿತà³\8dತಿನ à²\9cನà³\8aà²\95à³\8dಲà³\86ಡà³\8dದà³\8d à²\89à²\82ಡಾಪà³\81à²\82ಡà³\81.",
-       "createacct-benefit-body1": "{{PLURAL:$1|ಸಂಪೊದನೆ|ಸಂಪದೊನೆಲು}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|ಪುಟೊ|ಪುಟೊಕ್ಕುಲು}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|ಇನಾಮು|ಇನಾಮುಲು}}",
+       "createacct-benefit-heading": "{{SITENAME}}à²\89à²\82ಡà³\8d à²¨à²¿à²\95à³\8dಲà³\86ನà²\82à²\9aಿತà³\8dತಿನ à²\8eಡà³\8dದà³\86ನà³\8dತà²\82à²\95à³\8dಲà³\86ಡà³\8dದà³\8d à²\89à²\82ಡಾತà³\81à²\82ಡà³\8d.",
+       "createacct-benefit-body1": "{{PLURAL:$1|edit|ಸಂಪದೊನೆಲು}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|page|ಪುಟೊಕ್ಕುಲು}}",
+       "createacct-benefit-body3": "ಇಂಚಿಪೊ{{PLURAL:$1|contributor|ಕಾಣಿಕೆ ಕೊರ್ನರ್}}",
        "badretype": "ಈರ್ ಕೊರ್ನ ಪ್ರವೇಶ ಪದೆ ಬೇತೆ ಬೇತೆ ಅತ್ಂಡ್",
        "userexists": "ಈರ್ ಕೊರ್ನ ಸದಸ್ಯರ ಪುದರ್ ಬಳಕೆಡ್ ಉಂಡು. ದಯದೀದ್ ಬೇತೆ ಪುದರ್ ಕೊರ್ಲೆ",
        "loginerror": "ಲಾಗಿನ್ ದೋಷ",
        "link_sample": "ಕೊಂಡಿದ ಸೀರ್ಸಿಕೆ",
        "link_tip": "ಉಲಯಿದ ಕೊಂಡಿ",
        "extlink_sample": "http://www.example.com ಕೊಂಡಿದ ಸೀರ್ಸಿಕೆ",
-       "extlink_tip": "ಪಿದಯಿದ ಕೊಂಡಿ(http://ರ್ದ್ ಸುರು ಮಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ)",
+       "extlink_tip": "ಪಿದಯಿದ ಕೊಂಡಿ(http:// ರ್ದ್ ಸುರು ಮಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ)",
        "headline_sample": "ಪಟ್ಯೊದ ಸೀರ್ಸಿಕೆ",
        "headline_tip": "2ನೇ ಮಟ್ಟೊದ ಸೀರ್ಸಿಕೆ",
        "nowiki_sample": "ಮುಲ್ಪ ಫಾರ್ಮೇಟ್ ಆವಂದಿನಂಚಿನ ಪಟ್ಯೊನು ಸೇರಲೆ",
        "newarticle": "(ಪೊಸತ್)",
        "newarticletext": "ನನಲ ಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪಂದಿನ ಪುಟೊಗು ಈರ್ ಬೈದರ್.\nಈ ಪುಟೊನು ಸ್ರಿಸ್ಟಿ ಮಲ್ಪೆರೆ ತಿರ್ತ್‍ದ ಚೌಕೊಡು ಬರೆಯೆರೆ ಸುರು ಮಲ್ಪುಲೆ.\n(ಜಾಸ್ತಿ ಮಾಹಿತಿಗ್ [$1 ಸಹಾಯ ಪುಟೊನು] ತೂಲೆ).\nಈ ಪುಟೊಕು ಈರ್ ತಪ್ಪಾದ್ ಬತ್ತಿತ್ತ್ಂಡ ಇರೆನ ಬ್ರೌಸರ್‍ದ '''back''' ಬಟನ್’ನ್ ಒತ್ತ್’ಲೆ.",
        "noarticletext": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತಿನ ದಾಕಲೆನ್ ನಾಡ್‍ಲೆ], ಅತ್ತಾಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
-       "noarticletext-nopermission": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತ್‌ನ ಲಾಗ್‌ನ್ ನಾಡ್‍ಲೆ], ಅತ್ತ್ಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
+       "noarticletext-nopermission": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತ್‌ನ ಲಾಗ್‌ನ್ ನಾಡ್‍ಲೆ],[{{fullurl:{{FULLPAGENAME}}|action=edit}} ಅಂಡ ಇರೆಗ್ ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿಪುನೆಗ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಿ]</span>.",
        "userpage-userdoesnotexist": "ಬಳಕೆದಾರ ಖಾತೆ \"<nowiki>$1</nowiki>\" ದಾಖಲಾತ್‘ಜ್ಜಿ. ಈರ್ ಉಂದುವೇ ಪುಟನ್ ಸಂಪಾದನೆ ಮಲ್ಪರ ಉಂಡಾಂದ್ ಖಾತ್ರಿ ಮಲ್ತೊನಿ.",
        "previewnote": "'''ಉಂದು ಕೇವಲ ಮುನ್ನೋಟ; ಪುಟೊನು ನನಲ ಒರಿಪಾದಿಜಿ ಪನ್ಪುನೇನ್ ಮರಪೊರ್ಚಿ!'''",
        "editing": "$1 ಲೇಕನೊನು ಈರ್ ಸಂಪಾದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
        "yourtext": "ಇರೆನ ಸಂಪಾದನೆ",
        "yourdiff": "ವ್ಯತ್ಯಾಸೊಲು",
        "copyrightwarning": "ದಯಮಲ್ತ್’ದ್ ಗಮನಿಸ್’ಲೆ: {{SITENAME}} ಸೈಟ್’ಡ್ ಇರೆನ ಪೂರಾ ಕಾಣಿಕೆಲುಲಾ $2 ಅಡಿಟ್ ಬಿಡುಗಡೆ ಆಪುಂಡು (ಮಾಹಿತಿಗ್ $1 ನ್ ತೂಲೆ). ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಬೇತೆಕುಲು ನಿರ್ಧಾಕ್ಷಿಣ್ಯವಾದ್ ಬದಲ್ ಮಲ್ತ್’ದ್ ಬೇತೆ ಕಡೆಲೆಡ್ ಪಟ್ಟೆರ್. ಇಂದೆಕ್ ಇರೆನ ಒಪ್ಪಿಗೆ ಇತ್ತ್’ನ್ಡ ಮಾತ್ರ ಮುಲ್ಪ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ.<br />\nಅತ್ತಂದೆ ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಈರ್ ಸ್ವತಃ ಬರೆತರ್, ಅತ್ತ್’ನ್ಡ ಕೃತಿಸ್ವಾಮ್ಯತೆ ಇಜ್ಜಂದಿನ ಕಡೆರ್ದ್ ದೆತೊನ್ದರ್ ಪಂಡ್’ದ್ ಪ್ರಮಾಣಿಸೊಂದುಲ್ಲರ್.\n'''ಕೃತಿಸ್ವಾಮ್ಯತೆದ ಅಡಿಟುಪ್ಪುನಂಚಿನ ಕೃತಿಲೆನ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಂದೆ ಮುಲ್ಪ ಪಾಡೊಚಿ!'''",
-       "templatesused": "ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|ಟೆಂಪ್ಲೇಟು|ಟೆಂಪ್ಲೇಟುಗಳು}}:",
+       "templatesused": "ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|Template|ಟೆಂಪ್ಲೇಟುಲೂ}}:",
        "templatesusedpreview": "ಈ ಮುನ್ನೋಟೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ{{PLURAL:$1|Template|Templates}}:",
        "templatesusedsection": "ಈ ಇಬಾಗೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|Template|Templates}}:",
        "template-protected": "(ಸಂರಕ್ಷಿತೊ)",
        "template-semiprotected": "(ಅರೆ-ಸಂರಕ್ಷಿತೊ)",
-       "hiddencategories": "ಈ ಪುಟೊ {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗೊಗ್|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್‍ನ್ಡ್:",
+       "hiddencategories": "ಈ ಪುಟೊನ್ {{PLURAL:$1|1 hidden category|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್‍ನ್ಡ್:",
        "permissionserrors": "ಅನುಮತಿ ದೋಷ",
-       "permissionserrorstext-withaction": "$2 ಗ್ ಇರೆಗ್ ಅನುಮತಿ ಇದ್ದಿ, ಅಯಿಕ್ {{PLURAL:$1|ಕಾರಣೊ|ಕಾರಣೊಲು}}:",
+       "permissionserrorstext-withaction": "$2 ಗ್ ಇರೆಗ್ ಅನುಮತಿ ಇದ್ದಿ, ಅಯಿಕ್ {{PLURAL:$1||reason|ಕಾರಣೊಲು}}:",
        "moveddeleted-notice": "ಈ ಪುಟೊ ಅಸ್ತಿತ್ವೊಡ್ ಇದ್ದಿ.\nಪುಟೊದ ಡಿಲೀಶನ್ ಅತ್ತ್ಂಡ್ ಕಡಪ್ಪುಡುನೆ ಲಾಗ್‍ನ್ ತೂಯರೆ ತಿರ್ತ್ ಕೊರ್ತ್ಂಡ್.",
        "postedit-confirmation-created": "ಈ ಪುಟೋನು ಉಂಡು ಮಾನ್ತುಂಡು.",
        "postedit-confirmation-saved": "ಇರೇನಾ ಸಂಪಾದನೆನ್ ಒರಿಪಾತುಂಡು.",
        "revisionasof": "$1ದಿನೊತ ಆವೃತ್ತಿ",
        "revision-info": "ಬದಲಾವಣೆ $1 ಲೆಕ್ಕೊ {{GENDER:$6|$2}} ಇಂಬೆರೆಡ್ದ್ $7",
        "previousrevision": "←ದುಂಬೊರೊ ತೂಯಿನ",
-       "nextrevision": "ದುಂಬುದ ತಿದ್ದುಪಡಿ",
+       "nextrevision": "ದುಂಬುದ ತಿದ್ದುಪಡಿ →",
        "currentrevisionlink": "ಇತ್ತೆದ ತಿದ್ದುಪಡಿ",
        "cur": "ಸದ್ಯೊ",
        "next": "ಬೊಕ್ಕದ",
        "searchresults": "ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
        "searchresults-title": "\"$1\"ಕ್ ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
        "notextmatches": "ವಾ ಪುಟೊತ ಪಠ್ಯೊಡುಲಾ ಹೋಲಿಕೆ ಇಜ್ಜಿ",
-       "prevn": "ದುಂಬು {{PLURAL:$1|$1}}",
+       "prevn": "ದುಂಬುತ್ತ {{PLURAL:$1|$1}}",
        "nextn": "ಬೊಕ್ಕೊ {{PLURAL:$1|$1}}",
        "prev-page": "ದುಂಬುತ ಪುಟೊ",
        "next-page": "ನನತಾ ಪುಟ",
        "nextn-title": "ದುಂಬುದ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊಲು}}",
        "shown-title": "ಪ್ರತಿ ಪುಟೊಡುಲಾ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊ}} ತೋಜಿಪಾವು",
-       "viewprevnext": "ತೂಲೆ($1 {{int:pipe-separator}} $2) ($3)",
+       "viewprevnext": "ತೂಲೆ ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "<strong>ಈ ಪುಟೊನು ರಚಿಸಲೆ \"[[:$1]]\" ಈ ವಿಕಿಡ್!</strong> {{PLURAL:$2|0=|See also the page found with your search.|ನಾಡ್‍ನಗ ತೋಜಿದ್ ಬರ್ಪುನ ಪಲಿತಾಂಸೊನು ತೂಲೆ.}}",
        "searchprofile-articles": "ಲೇಕನೊ ಪುಟೊ",
        "searchprofile-images": "ಮಲ್ಟಿಮೀಡಿಯೊ",
        "searchprofile-everything-tooltip": "ಮಾತ ಮಾಹಿತಿಲೆನ್ ನಾಡ್‍ಲೆ (ಪಾತೆರದ ಪುಟೊಲ ಸೇರ್ದ್)",
        "searchprofile-advanced-tooltip": "ಬಳಕೆದ ನಾಮೊವರ್ಗೊಡು ನಾಡ್‍ಲೆ",
        "search-result-size": "$1 ({{PLURAL:$2|೧ ಪದೊ|$2 ಪದೊಕುಲು}})",
-       "search-redirect": "($1 ಡ್ದ್ ಪಿರ ನಿರ್ದೇಸನೊ)",
+       "search-redirect": "($1 ಡ್ದ್ ಪಿರ ನಿರ್ದೇಸನೊ)",
        "search-section": "(ವಿಬಾಗೊ $1)",
        "search-suggest": "ಇಂದೆನ್ ನಾಡೊಂದುಲ್ಲರೆ: $1",
        "search-interwiki-caption": "ಬಳಗದ ಇತರ ಯೋಜನೆಲು",
        "recentchanges-label-bot": "ಈ ಸಂಪದನೆ ಒಂಜಿ ಬಾಟ್‍ಡ್ ಆತ್ಂಡ್",
        "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆನ್ ನನಲಾ ಪರೀಕ್ಷೆ ಮಲ್ತ್‌ಜಿ.",
        "recentchanges-label-plusminus": "ಬೈಟ್ಸ್‌ದ ಲೆಕ್ಕೊಡು ಈ ಪಾಲೆದ ಗಾತ್ರೊ ಬದಲಾತ್ಂಡ್",
-       "recentchanges-legend-heading": "<strong>ಲà³\86à²\9cà³\86à²\82ಡà³\8d:</strong>",
+       "recentchanges-legend-heading": "<strong>ಪರಿವಿಡಿ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
        "recentchanges-submit": "ತೋಜಾಲೆ",
-       "rcfilters-filter-userExpLevel-learner-label": "ಕಲ್ಪುನರ್",
+       "rcfilters-filterlist-whatsthis": "ಉಂದು ದಾದಾ?",
+       "rcfilters-filter-user-experience-level-learner-label": "ಕಲ್ಪುನರ್",
        "rclistfrom": "$3 $2 ರ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
        "rcshowhideminor-show": "ತೋಜಾಲೆ",
        "rcshowhidemine-hide": "ಅಡೆಂಗಾವು",
        "rcshowhidecategorization-show": "ತೋಜಾಲೆ",
        "rcshowhidecategorization-hide": "ಅಡೆಂಗಾವು",
-       "rclinks": "ದುಂಬುದ $2 ದಿನೊಲೆಡ್ ಮಲ್ತಿನ $1 ಪಿರವುದ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ <br />$3",
+       "rclinks": "ದುಂಬುದ $2 ದಿನೊಲೆಡ್ ಮಲ್ತಿನ $1 ಪಿರವುದ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ",
        "diff": "ವ್ಯತ್ಯಾಸೊ",
        "hist": "ಇತಿಹಾಸೊ",
        "hide": "ಅಡೆಂಗಾವು",
        "filehist-filesize": "ಫೈಲ್’ದ ಗಾತ್ರ",
        "filehist-comment": "ಅಬಿಪ್ರಾಯೊ",
        "imagelinks": "ಫೈಲ್‍ದ ಬಳಕೆ",
-       "linkstoimage": "ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|ಪುಟ|$1 ಪುಟೊಲೆ ಕೊಂಡಿ}}ಈ ಫೈಲ್‍ಗ್ ಕೊರ್ಪುಂಡು.",
+       "linkstoimage": "ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|page links|$1 ಪುಟೊಲೆ ಕೊಂಡಿ}}ಈ ಫೈಲ್‍ಗ್ ಕೊನಪೋಪುಂಡು.",
        "nolinkstoimage": "ಈ ಫೈಲ್‍ಗ್ ಸಂಪರ್ಕೊ ಉಪ್ಪುನ ವಾ ಪುಟೊಲಾ ಇದ್ದಿ.",
        "sharedupload": "ಈ ಫೈಲ್’ನ್ ಮಸ್ತ್ ಜನ ಪಟ್ಟ್’ದುಲ್ಲೆರ್ ಅಂಚೆನೆ ಉಂದು ಮಸ್ತ್ ಪ್ರೊಜೆಕ್ಟ್’ಲೆಡ್ ಉಪಯೋಗಿಸೊಲಿ",
        "sharedupload-desc-here": "ಈ ಪುಟೊ $1ಡ್ದ್ ಬೊಕ್ಕ ಬೇತೆ ಯೋಜನೆಡ್ದ್ ಗಳಸೊಲಿ.\nಈ ಪುಟೊತ ವಿವರೊ [$2 ಪುಟೊತ ವಿವರೊ] ತಿರ್ತ ಸಾಲ್‍ಡ್ ತೋಜಾದ್ಂಡ್",
        "brokenredirects-edit": "ಸಂಪೊಲಿಪುಲೆ",
        "brokenredirects-delete": "ಮಾಜಾಲೆ",
        "withoutinterwiki-submit": "ತೋಜಾಲೆ",
-       "nbytes": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}",
-       "nmembers": "$1 {{PLURAL:$1|ಸದಸ್ಯೆ|ಸದಸ್ಯೆರ್}}",
+       "nbytes": "$1 {{PLURAL:$1|byte|ಬೈಟ್‍ಲು}}",
+       "nmembers": "$1 {{PLURAL:$1|member|ಸದಸ್ಯೆರ್}}",
        "wantedfiles": "ಬೋಡಾಯಿನ ಕಡತೊಲು",
        "prefixindex": "ಪೂರ್ವನಾಮೊಲ್ದ ಸೂಚಿಕೆ",
        "prefixindex-submit": "ತೋಜಾಲೆ",
        "move": "ಮೂವ್(ಸ್ಥಳಾಂತರ) ಮಲ್ಪುಲೆ",
        "movethispage": "ಈ ಪುಟೊನು ಮೂವ್ ಮಲ್ಪುಲೆ",
        "pager-newer-n": "{{PLURAL:$1|ಪೊಸ ೧|ಪೊಸ $1}}",
-       "pager-older-n": "{{PLURAL:$1|ಪರತ್ತ್ ೧|ಪರತ್ತ್ $1}}",
+       "pager-older-n": "{{PLURAL:$1|older 1|ಪರತ್ತ್ $1}}",
        "apisandbox-reset": "ಮಾಜಲೇ",
        "apisandbox-retry": "ನನೊರ ಪ್ರಯತ್ನ ಮಾನ್ಪುಲೇ",
        "apisandbox-examples": "ಉದಾಹರಣೆಲು",
        "namespace_association": "ಜತೆಟಿತ್ತಿನ ಪುದರ್",
        "tooltip-namespace_association": "ಈ ಚೌಕೊನು ಚರ್ಚೆನ್ ಸೇರಾದ್ ಪರೀಕ್ಷಿಸಲೆ ಅತ್ತ್ಂಡ ವಿಸಯೊಗು ಸರಿಯಾಯಿನ ಪುದರ್ದ ಜತೆಟ್ ಸೇರಾಲೆ",
        "blanknamespace": "(ಮುಖ್ಯ)",
-       "contributions": "{{$1ಸದಸ್ಯೆರ್ನ}}ಕಾಣಿಕೆಲು",
+       "contributions": "{{GENDER:$1|ಸದಸ್ಯೆರ್ನ}} ಕಾಣಿಕೆಲು",
        "contributions-title": "$1 ಗ್ ಸದಸ್ಯೆರ್ನ ಕಾಣಿಕೆ",
        "mycontris": "ಎನ್ನ ಕಾನಿಕೆಲು",
        "anoncontribs": "ಕಾನಿಕೆಲು",
        "whatlinkshere": "ಇಡೆ ವಾ ಪುಟೊ ಕೊಂಡಿ ಕೊರ್ಪುಂಡು",
        "whatlinkshere-title": "\"$1\" ಪುಟೊಗು ಕೊಂಡಿ ಕೊರ್ಪುನ ಪುಟೊಲು",
        "whatlinkshere-page": "ಪುಟೊ:",
-       "linkshere": "'''[[:$1]]'''ಗ್ ಈ ತಿರ್ತ್‍ದ ಪುಟೊಗು ಕೊಂಡಿ ಕೊರ್ಪುಂಡು.",
+       "linkshere": "</strong>[[:$1]]<strong>ಗ್ ಈ ತಿರ್ತ್‍ದ ಪುಟೊಗು ಕೊಂಡಿ ಕೊರ್ಪುಂಡು.",
        "nolinkshere": "'''[[:$1]]''' ಗ್ ವಾ ಪುಟೊಲುಲಾ ಲಿಂಕ್ ಕೊರ್ಪುಜಿ.",
        "isredirect": "ಪಿರ ನಿರ್ದೇಶನೊದ ಪುಟೊ",
        "istemplate": "ಸೇರಾವುನೆ",
        "isimage": "ಫೈಲ್‍ದ ಕೊಂಡಿ",
-       "whatlinkshere-prev": "{{PLURAL:$1|ದುಂಬುದ|ದುಂಬುದ $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|ಬೊಕ್ಕದ|ಬೊಕ್ಕದ $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|previous|ದುಂಬುದ $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|next|ಬೊಕ್ಕದ $1}}",
        "whatlinkshere-links": "← ಕೊಂಡಿಲು",
        "whatlinkshere-hideredirs": "$1 ಪಿರನಿರ್ದೇಶನೊಲು",
        "whatlinkshere-hidetrans": "$1 ಸೇರಾವುನವು",
        "import-interwiki-submit": "ಆಮದು",
        "import-upload-filename": "ಕಡತದ ಪುದರ್:",
        "import-comment": "ಅಭಿಪ್ರಾಯೊ:",
-       "tooltip-pt-userpage": "{{GENDER:|ಎನ್ನ ಸದಸ್ಯ}} ಪುಟೊ",
-       "tooltip-pt-mytalk": "{{GENDER:|ಎನ್ನ}} ಚರ್ಚೆ ಪುಟೊ",
+       "tooltip-pt-userpage": "{{GENDER:|ಎನ್ನ ಸದಸ್ಯ}}  ಪುಟೊ",
+       "tooltip-pt-mytalk": "{{GENDER:|ಎನ್ನ}} ಚರ್ಚೆತಾ ಪುಟೊ",
        "tooltip-pt-preferences": "{{GENDER:|ಎನ್ನ}} ಇಸ್ಟೊಲು",
        "tooltip-pt-watchlist": "ಈರ್ ಬದಲಾವಣೆಗಾದ್ ನಿಗಾ ದೀತಿನಂಚಿನ ಪುಟೊಲೆನ ಪಟ್ಟಿ",
-       "tooltip-pt-mycontris": "{{GENDER:|ಎನ್ನ}} ಕಾನಿಕೆಲೆ ಪಟ್ಟಿ",
+       "tooltip-pt-mycontris": "{{GENDER:|ಎನ್ನ}} ಕಾನಿಕೆಲೆ ಪಟ್ಟಿ",
        "tooltip-pt-login": "ಈರ್ ಲಾಗಿನ್ ಆವೊಡುಂದು ಕೇನೊಂದುಲ್ಲೊ, ಆಂಡ ಉಂದು ದಾಲ ಕಡ್ಡಾಯ ಅತ್ತ್.",
        "tooltip-pt-logout": "ಲಾಗ್ ಔಟ್",
-       "tooltip-pt-createaccount": "ನಿà²\95à³\81ಲà³\81 à²ªà³\8aಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಾà²\82ತà³\8dâ\80\8dದà³\8d à²²à²¾à²\97ಿನà³\8d à²\86ಪà³\81ನà³\88ನà³\8d à²ªà³\8dರà³\8bತà³\8dಸಾಹಿಸವà³\8a, à²\86à²\82ಡಲಾ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
+       "tooltip-pt-createaccount": "à²\87ರà³\8d  à²ªà³\8bಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಾà²\82ತà³\8dâ\80\8dದà³\8d, à²²à²¾à²\97ಿನà³\8d à²\86ಪà³\81ನà³\88ನà³\8d à²¬à³\86ರಿ à²¬à³\8aà²\9fà³\8dà²\9fà³\81ಪà³\8b, à²\86à²\82ಡ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
        "tooltip-ca-talk": "ಮಾಹಿತಿ ಪುಟೊತ ಬಗೆಟ್ ಚರ್ಚೆ",
        "tooltip-ca-edit": "ಈ ಪುಟೊನ್ ಸಂಪೊಲಿಪುಲೆ",
        "tooltip-ca-addsection": "ಪೊಸ ವಿಬಾಗೊನು ಸುರು ಮಲ್ಪುಲೆ",
        "tooltip-t-recentchangeslinked": "ಈ ಪುಟೊಡ್ದ್ ಸಂಪರ್ಕೊ ಉಪ್ಪುನಂಚಿನ ಪುಟೊಡ್ ಇಂಚಿಪೊದ ಬದಲಾವಣೆಲು",
        "tooltip-feed-rss": "ಈ ಪುಟೊಗು ಆರ್.ಎಸ್.ಎಸ್ ಫೀಡ್",
        "tooltip-feed-atom": "ಈ ಪುಟೊಗು ಆಟಮ್ ಫೀಡ್ ಮಲ್ಪುಲೆ",
-       "tooltip-t-contributions": "{{GENDER:$1|à²\88 à²¬à²³à²\95à³\86ದಾರà³\86ರà³\8d}}à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ ಕಾಣಿಕೆದ ಪಟ್ಟಿನ್ ತೋಜಾವು",
+       "tooltip-t-contributions": "{{GENDER:$1|à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ}} ಕಾಣಿಕೆದ ಪಟ್ಟಿನ್ ತೋಜಾವು",
        "tooltip-t-emailuser": "ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೇಲ್ ಕಡಪುಡ್ಲೆ",
        "tooltip-t-upload": "ಫೈಲನ್ ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
        "tooltip-t-specialpages": "ಪೂರ  ವಿಸೇಸೊ ಪುಟೊಲೆನ ಪಟ್ಟಿ",
        "svg-long-desc": "ಎಸ್.ವಿ.ಜಿ ಫೈಲ್, ಸುಮಾರಾದ್ $1 × $2 ಚಿತ್ರೊಬಿಂದು, ಫೈಲ್‍ದ ಗಾತ್ರ: $3",
        "show-big-image": "ಮೂಲೊ ಫೈಲ್",
        "show-big-image-preview": "ಪಿರವುದ ಪುಟೊದ ಗಾತ್ರೊ: $1.",
-       "show-big-image-other": "ಬà³\87ತà³\86{{PLURAL:$2|resolution|ನಿರà³\8dನಯà³\8aಲà³\81}}: $1.",
-       "show-big-image-size": "$1 × $2 ಚಿತ್ರೊಬಿಂದುಲು",
+       "show-big-image-other": "ಬà³\87ತà³\86{{PLURAL:$2|resolution|ಪà²\9fà³\8aತà³\8dತ à²\97ಾತà³\8dರà³\8a }}: $1.",
+       "show-big-image-size": "$1 × $2 ಚಿತ್ರೊ ಬಿಂದುಲು",
        "newimages-legend": "ಅರಿಪೆ",
        "ilsubmit": "ನಾಡ್‍ಲೆ",
        "bad_image_list": "ವ್ಯವಸ್ಥೆದ ಆಕಾರ ಈ ರೀತಿ ಉಂಡು:\n\nಪಟ್ಟಿಡುಪ್ಪುನಂಚಿನ ದಾಖಲೆಲೆನ್ (* ರ್ದ್ ಶುರು ಆಪುನ ಸಾಲ್’ಲು) ಮಾತ್ರ ಪರಿಗಣನೆಗ್ ದೆತೊನೆರಾಪುಂಡು.\nಪ್ರತಿ ಸಾಲ್’ದ ಶುರುತ ಲಿಂಕ್ ಒಂಜಿ ದೋಷ ಉಪ್ಪುನಂಚಿನ ಫೈಲ್’ಗ್ ಲಿಂಕಾದುಪ್ಪೊಡು.\nಅವ್ವೇ ಸಾಲ್’ದ ಶುರುತ ಪೂರಾ ಲಿಂಕ್’ಲೆನ್ ಪರಿಗನೆರ್ದ್ ದೆಪ್ಪೆರಾಪುಂಡು, ಪಂಡ ಓವು ಪುಟೊಲೆಡ್ ಫೈಲ್’ದ ಬಗ್ಗೆ ಬರ್ಪುಂಡೋ ಔಲು.",
        "exif-imagewidth": "ಅಗೆಲ",
        "exif-imagelength": "ಎತ್ತರೊ",
        "exif-orientation": "ದಿಕ್ಕ್ ದಿಸೆ",
-       "exif-xresolution": "à²\85ಡà³\8dಡà²\97ಲà³\8aದ à²°à³\86à²\9c಼ಲ್ಯೂಶನ್",
-       "exif-yresolution": "à²\89ದà³\8dದà³\8aದ à²°à³\86à²\9c಼ಲ್ಯೂಶನ್",
+       "exif-xresolution": "à²\85ಡà³\8dಡà²\97ಲà³\8aದ à²°à³\87ಸಲ್ಯೂಶನ್",
+       "exif-yresolution": "à²\89ದà³\8dದà³\8aದ à²°à³\87ಸಲ್ಯೂಶನ್",
        "exif-datetime": "ಫೈಲ್‍ನ್ ಬದಲಾವಣೆ ಮಲ್ತ್‌ನ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
        "exif-make": "ಕ್ಯಾಮರೊದ ತಯಾರೆಕೆರ್",
        "exif-model": "ಕ್ಯಾಮರೊದ ಮಾದರಿ",
        "exif-subjectdistancerange-0": "ಗೊತ್ತಿಜ್ಜಾಂದಿನ",
        "exif-iimcategory-hth": "ಆರೋಗ್ಯ",
        "namespacesall": "ಮಾತ",
-       "monthsall": "ಮಾತ",
+       "monthsall": "ಮಾà²\82ತಾ",
        "confirm_purge_button": "ಸರಿ",
        "confirm-watch-button": "ಸರಿ",
        "confirm-unwatch-button": "ಸರಿ",
        "tags-create-submit": "ಸೃಷ್ಟಿಸಾಲೆ",
        "tags-delete-reason": "ಕಾರಣ:",
        "tags-deactivate-reason": "ಕಾರಣ:",
-       "logentry-delete-delete": "$1{{GENDER:$2|ಮಾಜಾದ್‍ಂಡ್}}ಪುಟೊ $3",
+       "logentry-delete-delete": "$1{{GENDER:$2|ಮಾಜಾತುಂಡ್}}ಪುಟೊ $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restored}} ಪುಟೊ $3 ($4)",
+       "restore-count-files": "{{PLURAL:$1|1 file|$1 ವಿಸಯೊಲು}}",
        "logentry-move-move": "$1 {{GENDER:$2|ಜಾರಲೆ}} ಪುಟೊ $3 ಡ್ದ್ $4",
-       "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ನು {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತಾಂಡ್}}",
+       "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತಾಂಡ್}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3",
        "searchsuggest-search": "{{SITENAME}}ನ್ ನಾಡ್‍ಲೆ",
        "pagelang-reason": "ಕಾರಣೊ",
index 9fcaacf..f54c390 100644 (file)
        "login": "లాగినవండి",
        "login-security": "మీ ఐడీని ధ్రువపరచుకోండి",
        "nav-login-createaccount": "లాగినవండి / ఖాతాని సృష్టించుకోండి",
-       "userlogin": "లాగినవండి / ఖాతాను సృష్టించుకోండి",
-       "userloginnocreate": "లాగినవండి",
        "logout": "నిష్క్రమించు",
        "userlogout": "లాగౌట్",
        "notloggedin": "లాగిన్‌ అయిలేరు",
        "userlogin-noaccount": "మీకు ఖాతా లేదా?",
        "userlogin-joinproject": "{{SITENAME}}లో చేరండి",
-       "nologin": "ఖాతా లేదా? $1.",
-       "nologinlink": "ఖాతాని సృష్టించుకోండి",
        "createaccount": "ఖాతాని సృష్టించు",
-       "gotaccount": "ఇప్పటికే మీకు ఖాతా ఉందా? $1.",
-       "gotaccountlink": "లాగినవండి",
-       "userlogin-resetlink": "మీ లాగిన్ వివరాలను మరచిపోయారా?",
        "userlogin-resetpassword-link": "మీ సంకేతపదాన్ని మర్చిపోయారా?",
        "userlogin-helplink2": "లాగినవడంలో సహాయం",
        "userlogin-loggedin": "మీరు ఈసరికే {{GENDER:$1|$1}} గా లాగిన్ అయి ఉన్నారు.\nవేరే వాడుకరిగా లాగినయేందుకు కింది ఫారమును వాడండి.",
        "createaccountmail": "ఏదో ఒక తాత్కాలిక సంకేతపదాన్ని వాడి దాన్ని పేర్కొన్న ఈమెయిలు చిరునామాకు పంపించు",
        "createaccountmail-help": "సంకేతపదం తెలుసుకోనవసరం లేకుండా వేరొకరి కోసం ఖాతా సృష్టించేందుకు వాడవచ్చు.",
        "createacct-realname": "అసలు పేరు (ఐచ్చికం)",
-       "createaccountreason": "కారణం:",
        "createacct-reason": "కారణం",
        "createacct-reason-ph": "మీరు మరో ఖాతాను ఎందుకు సృష్టించుకుంటున్నారు",
        "createacct-submit": "మీ ఖాతాను సృష్టించుకోండి",
        "preview": "మునుజూపు",
        "showpreview": "మునుజూపు చూపు",
        "showdiff": "తేడాలను చూపించు",
-       "blankarticle": "<strong>హెచ్చరిక:</strong> మీరు ఖాళీ పేజీని రూపొందిస్తున్నారు. మళ్ళీ  \"{{int:savearticle}}\" ను నొక్కితే ఖాళీ పేజీ సృష్టించబడుతుంది.",
+       "blankarticle": "<strong>హెచ్చరిక:</strong> మీరు ఖాళీ పేజీని రూపొందిస్తున్నారు. మళ్ళీ  \"$1\" ను నొక్కితే ఖాళీ పేజీ సృష్టించబడుతుంది.",
        "anoneditwarning": "<strong>హెచ్చరిక:</strong> మీరు లాగినవలేదు. మీరు ఏమైనా మార్పులు చేస్తే మీ ఐపీ చిరునామా బహిరంగంగా అందరికీ కనిపిస్తుంది. మీరు   <strong>[$1 ప్రవేశించినా]</strong> లేక <strong>[$2 ఖాతా సృష్టించినా]</strong> మీ మార్పులు మీ పేరుతో ఉండటమే కాకుండా మరెన్నో సదుపాయాలుంటాయి.",
        "anonpreviewwarning": "<em>మీరు లాగినవలేదు. భద్రపరిస్తే ఈ పేజీ యొక్క దిద్దుబాటు చరిత్రలో మీ ఐపీ చిరునామా నమోదవుతుంది.</em>",
        "missingsummary": "<strong>గుర్తు చేస్తున్నాం:</strong> మీరు దిద్దుబాటు సారాంశమేమీ ఇవ్వలేదు. పేజీని మళ్ళీ భద్రపరచమని చెబితే సారాంశమేమీ లేకుండానే దిద్దుబాటును భద్రపరుస్తాం.",
-       "selfredirect": "<strong>హెచ్చరిక:</strong> మీరు ఈ పేజీని దానికే దారిమార్పు చేస్తున్నారు. బహుశా మీరు తప్పు దారిమార్పును సూచించి ఉండవచ్చు, లేదా మీరు తప్పుడు పేజీని మారుస్తున్నారు. \nమీరు \"{{int:savearticle}}\" ను నొక్కితే దారిమార్పు పేజీ ఖచ్చితంగా సృష్టించబడుతుంది.",
+       "selfredirect": "<strong>హెచ్చరిక:</strong> మీరు ఈ పేజీని దానికే దారిమార్పు చేస్తున్నారు. బహుశా మీరు తప్పు దారిమార్పును సూచించి ఉండవచ్చు, లేదా మీరు తప్పుడు పేజీని మారుస్తున్నారు. \nమీరు \"$1\" ను నొక్కితే దారిమార్పు పేజీ ఖచ్చితంగా సృష్టించబడుతుంది.",
        "missingcommenttext": "కింద ఓ వ్యాఖ్య రాయండి.",
-       "missingcommentheader": "<strong>గుర్తు చేస్తున్నాం:</strong> ఈ వ్యాఖ్యకు మీరు విషయం పెట్టలేదు.\n\"{{int:savearticle}}\"ని మళ్ళీ నొక్కితే, అది లేకుండానే మీ మార్పును భద్రపరుస్తాం.",
+       "missingcommentheader": "<strong>గుర్తు చేస్తున్నాం:</strong> ఈ వ్యాఖ్యకు మీరు విషయం పెట్టలేదు.\n\"$1\"ని మళ్ళీ నొక్కితే, అది లేకుండానే మీ మార్పును భద్రపరుస్తాం.",
        "summary-preview": "దిద్దుబాటు సారాంశం మునుజూపు:",
        "subject-preview": "విషయపు మునుజూపు:",
        "previewerrortext": "మీ మార్పులు మునుజూపు చూడటంలో తప్పిదమయింది.",
        "editingsection": "$1 ని సవరిస్తున్నారు (విభాగం)",
        "editingcomment": "$1 ని సవరిస్తున్నారు (కొత్త విభాగం)",
        "editconflict": "దిద్దుబాటు ఘర్షణ: $1",
-       "explainconflict": "మీరు మార్పులు చెయ్యడం మొదలుపెట్టిన తరువాత, వేరే ఎవరో ఈ పుటని మార్పారు.\nపైన ఉన్న పాఠ్య పేటికలో ఈ పుట యొక్క ప్రస్తుతపు పాఠ్యం ఉంది.\nమీరు చేసిన మార్పులు క్రింది పాఠ్య పేటికలో చూపించబడ్డాయి.\nమీరు మీ మార్పులను ప్రస్తుతపు పాఠ్యంలో విలీనం చెయ్యవలసి ఉంటుంది.\nమీరు \"{{int:savearticle}}\"ను నొక్కినపుడు, పై పాఠ్య పేటికలో ఉన్న పాఠ్యం '''మాత్రమే''' భద్రపరచబడుతుంది.",
+       "explainconflict": "మీరు మార్పులు చెయ్యడం మొదలుపెట్టిన తరువాత, వేరే ఎవరో ఈ పుటని మార్పారు.\nపైన ఉన్న పాఠ్య పేటికలో ఈ పుట యొక్క ప్రస్తుతపు పాఠ్యం ఉంది.\nమీరు చేసిన మార్పులు క్రింది పాఠ్య పేటికలో చూపించబడ్డాయి.\nమీరు మీ మార్పులను ప్రస్తుతపు పాఠ్యంలో విలీనం చెయ్యవలసి ఉంటుంది.\nమీరు \"$1\"ను నొక్కినపుడు, పై పాఠ్య పేటికలో ఉన్న పాఠ్యం '''మాత్రమే''' భద్రపరచబడుతుంది.",
        "yourtext": "మీ పాఠ్యం",
        "storedversion": "భద్రపరచిన కూర్పు",
        "nonunicodebrowser": "<strong>హెచ్చరిక: మీ బ్రౌజరు యూనికోడుకు అనుకూలంగా లేదు.</strong>\nపేజీలను క్షేమంగా సవరించేందుకు ఓ దారి ఉంది: ASCII యేతర కారెక్టర్లు ఎడిట్ పెట్టెలో హెక్సాడెసిమల్ కోడ్‍లుగా కనిపిస్తాయి.",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" గా సంరక్షించబడ్డ పేజీలను మార్చు",
        "right-editcontentmodel": "పేజీ యొక్క కంటెంటు మోడలును సవరించు",
        "right-editinterface": "యూజరు ఇంటరుఫేసులో దిద్దుబాటు చెయ్యి",
-       "right-editusercssjs": "ఇతర వాడుకరుల CSS, JS ఫైళ్ళలో దిద్దుబాటు చెయ్యి",
        "right-editusercss": "ఇతర వాడుకరుల CSS ఫైళ్ళలో దిద్దుబాటు చెయ్యడం",
        "right-edituserjs": "ఇతర వాడుకరుల JS ఫైళ్ళలో దిద్దుబాటు చెయ్యడం",
        "right-editmyusercss": "మీ స్వంత వాడుకరి CSS ఫైళ్ళను సరిదిద్దండి",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)",
        "recentchanges-submit": "చూపించు",
        "rcfilters-filterlist-title": "వడపోతలు",
+       "rcfilters-highlightmenu-title": "ఒక రంగును ఎంచుకోండి",
        "rcfilters-filtergroup-registration": "వాడుకరి నమోదు",
        "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-filter-user-experience-level-newcomer-label": "కొత్తవారు",
+       "rcfilters-filter-user-experience-level-newcomer-description": "10 కంటే తక్కువ దిద్దుబాట్లు, 4 రోజుల కంటే తక్కువ పని.",
+       "rcfilters-filter-user-experience-level-learner-label": "నేర్చుకుంటున్నవారు",
+       "rcfilters-filter-user-experience-level-learner-description": "\"కొత్తవారి\" కంటే ఎక్కువ, \"అనుభవజ్ఞులైన వాడుకరుల\" కంటే తక్కువ పనిరోజులు.",
+       "rcfilters-filter-user-experience-level-experienced-label": "అనుభవజ్ఞులైన వాడుకరులు",
+       "rcfilters-filter-user-experience-level-experienced-description": "30 రోజుల కంటే ఎక్కువ పని, 500 పైచిలుకు దిద్దుబాట్లు.",
        "rcfilters-filtergroup-significance": "ప్రాముఖ్యం",
        "rcfilters-filter-minor-label": "చిన్న మార్పులు",
        "rcfilters-filter-minor-description": "రచయిత చిన్నవిగా గుర్తు పెట్టిన దిద్దుబాట్లు.",
        "rcshowhidecategorization": "పేజి  వర్గీకరణ $1",
        "rcshowhidecategorization-show": "చూపించు",
        "rcshowhidecategorization-hide": "దాచు",
-       "rclinks": "గత  $2 రోజుల లోని చివరి $1 మార్పులను చూపించు <br />$3",
+       "rclinks": "గత  $2 రోజుల లోని చివరి $1 మార్పులను చూపించు",
        "diff": "తేడాలు",
        "hist": "చరిత్ర",
        "hide": "దాచు",
        "undeleteviewlink": "చూడండి",
        "undeleteinvert": "ఎంపికని తిరగవెయ్యి",
        "undeletecomment": "కారణం:",
-       "undeletedrevisions": "{{PLURAL:$1|ఒక సంచిక|$1 సంచికల}} పునఃస్థాపన జరిగింది",
-       "undeletedrevisions-files": "{{PLURAL:$1|ఒక కూర్పు|$1 కూర్పులు}} మరియు {{PLURAL:$2|ఒక ఫైలు|$2 ఫైళ్ళ}}ను పునస్థాపించాం",
-       "undeletedfiles": "{{PLURAL:$1|ఒక ఫైలును|$1 ఫైళ్లను}} పునఃస్థాపించాం",
        "cannotundelete": "తొలగింపు రద్దులు పూర్తిగానో, కొన్నిగానీ విఫలమయ్యాయి:\n$1",
        "undeletedpage": "'''$1 ను పునస్థాపించాం'''\n\nఇటీవల జరిగిన తొలగింపులు, పునస్థాపనల కొరకు [[Special:Log/delete|తొలగింపు చిట్టా]]ని చూడండి.",
        "undelete-header": "ఇటీవల తొలగించిన పేజీల కొరకు [[Special:Log/delete|తొలగింపు చిట్టా]]ని చూడండి.",
        "logentry-managetags-create": "\"$4\" ట్యాగును $1 {{GENDER:$2|సృష్టించారు}}",
        "log-name-tag": "ట్యాగుల చిట్టా",
        "rightsnone": "(ఏమీలేవు)",
-       "revdelete-summary": "మార్పు సంగ్రహం",
        "rightslogentry-temporary-group": "$1 (తాత్కాలికం, $2 వరకు)",
        "feedback-adding": "ఫీడ్‍బ్యాకును పేజీలోకి చేరుస్తున్నాం...",
        "feedback-back": "వెనుకకు",
index fb73ae7..a2114de 100644 (file)
@@ -4,7 +4,8 @@
                        "MF-Warburg",
                        "Nemo bis",
                        "Reedy",
-                       "아라"
+                       "아라",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Subliña ligasaun sira:",
        "printableversion": "Versaun ba impresaun",
        "permalink": "Ligasaun mahelak",
        "print": "Imprime",
+       "view": "Lee",
        "edit": "Edita",
        "create": "Kria",
        "editthispage": "Edita pájina ne'e",
        "aboutsite": "Kona-ba {{SITENAME}}",
        "aboutpage": "Project:Kona-ba",
        "copyright": "Testu pájina nian iha $1 okos.",
-       "copyrightpage": "{{ns:project}}:Direitu_autór_nian",
+       "copyrightpage": "{{ns:project}}:Direitu autór nian",
        "currentevents": "Mamosuk atuál sira",
        "currentevents-url": "Project:Mamosuk atuál sira",
        "disclaimers": "Avisu legál",
        "yourname": "Naran uza-na'in:",
        "login": "Log in",
        "nav-login-createaccount": "Log in / kriar konta ida",
-       "userlogin": "Log in / kriar konta ida",
        "logout": "Husik",
        "userlogout": "Husik",
-       "nologin": "La iha konta ida? '''$1'''.",
-       "nologinlink": "Registrar",
        "createaccount": "Registrar uza-na'in",
-       "gotaccount": "Ó iha konta ona? '''$1'''.",
-       "gotaccountlink": "Log in",
        "userexists": "Naran uza-na'in ne'e ona iha wiki.\nFavór ida lori naran seluk.",
        "nosuchuser": "Konta uza-na'in (naran \"$1\") la iha.\nUser names are case sensitive.\nCheck your spelling, ka [[Special:CreateAccount|kria konta foun]].",
        "nouserspecified": "Ó tenke espesífiku naran uza-na'in ida.",
        "revdelete-radio-set": "Sin",
        "revdelete-radio-unset": "Lae",
        "revdelete-edit-reasonlist": "Edita lista motivu nian",
+       "history-title": "$1: Istória revisaun nian",
        "lineno": "Liña $1:",
        "searchresults": "Rezultadu sira",
        "searchresults-title": "Rezultadu sira ba buka \"$1\"",
        "undeletelink": "lee/restaurar",
        "undeleteviewlink": "haree",
        "undeletecomment": "Razaun:",
-       "undeletedrevisions": "restaurar {{PLURAL:$1|versaun|versaun}} $1",
        "undelete-search-submit": "Buka",
        "undelete-show-file-submit": "Sin",
        "namespace": "Espasu pájina nian:",
index f4ddfcc..32fbc7f 100644 (file)
        "externaldberror": "Хатое дар иртибот бо пойгоҳи дода рух дода аст ё ин ки шумо иҷозат ба рӯзрасонии ҳисоби берунии худро надоред.",
        "login": "Вуруд",
        "nav-login-createaccount": "Вуруд / Сохтани ҳисоби ҷадид",
-       "userlogin": "Вуруд / Сохтани ҳисоби ҷадид",
-       "userloginnocreate": "Вуруд",
        "logout": "Хуруҷ аз систем",
        "userlogout": "Хуруҷ аз систем",
        "notloggedin": "Ба систем вуруд нашудаед",
        "userlogin-noaccount": "Ҳисоби корбарӣ надоред?",
        "userlogin-joinproject": "Ба {{SITENAME}} ҳамроҳ шавед",
-       "nologin": "Номи корбар надоред? '''$1'''.",
-       "nologinlink": "Ҳисоберо созед",
        "createaccount": "Ҳисоби ҷадидеро созед",
-       "gotaccount": "Ҳисоби корбарӣ доред? '''$1'''.",
-       "gotaccountlink": "Вуруд шавед",
-       "userlogin-resetlink": "Ҷузъиёти вурудро фаромӯш кардаед?",
        "userlogin-resetpassword-link": "Гузарвожаро фаромӯш кардед?",
        "userlogin-helplink2": "Роҳнамои вуруд",
        "userlogin-loggedin": "Шумо дар ҳол чун {{GENDER:$1|$1}} вуруд шудаед.\nБо истифода аз форми зер чун корбари дигар вориди систем шавед.",
        "createacct-another-email-ph": "Нишонаи email-ро ворид кунед",
        "createaccountmail": "Аз гузарвожаи муваққатӣ ва тасодуфӣ истифода кунед ва онро нишонаи электронии мушаххасшуда бифиристед",
        "createacct-realname": "Номи аслӣ (ихтиёрӣ)",
-       "createaccountreason": "Сабаб:",
        "createacct-reason": "Сабаб",
        "createacct-reason-ph": "Барои чӣ ҳисоби дигареро эҷод карда истодаед",
        "createacct-submit": "Ҳисоби худро созед",
        "anonpreviewwarning": "<em>Шумо вориди нашудаед. Захиракунӣ IP нишонаи шуморо дар таърихи вироиши ин саҳифа захира хоҳад кард.</em>",
        "missingsummary": "'''Ёдоварӣ:''' Шумо хулосаи вироиш нанавиштаед.\nАгар дубора тугмаи \"Захира\"-ро клик кунед, вироишатон бидуни хулоса захира хоҳад шуд.",
        "missingcommenttext": "Лутфан тавсифе дар зер бинависед.",
-       "missingcommentheader": "<strong>Ёдоварӣ:</strong> Шумо мавзӯъ/унвони ин ёддоштро мушаххас накардед.\nАгар дубора \"{{int:savearticle}}\" пахш кунед, вироишатон бидуни он захира хоҳад шуд.",
+       "missingcommentheader": "<strong>Ёдоварӣ:</strong> Шумо мавзӯъ/унвони ин ёддоштро мушаххас накардед.\nАгар дубора \"$1\" пахш кунед, вироишатон бидуни он захира хоҳад шуд.",
        "summary-preview": "Пешнамоиши хулоса:",
        "subject-preview": "Пешнамоиши мавзӯъ/унвон:",
        "blockedtitle": "Корбар баста шудааст",
        "editingsection": "Дар ҳоли вироиши $1 (қисмат)",
        "editingcomment": "Дар ҳоли вироиши $1 (қисми нав)",
        "editconflict": "Бархӯрди вироишӣ: $1",
-       "explainconflict": "Аз вақте ки шумо вироиши ин саҳифаро оғоз кардаед, шахси дигаре онро тағйир дода аст.\nНоҳияи матни болои шомили матни саҳифа ба шакли феълии он аст.\nТағйироти шумо дар ноҳияи матни поёни нишон дода шудааст.\nШумо бояд тағйиротатонро бо матни феълӣ таркиб кунед.\n'''Фақат''', вақте, ки тугмаи \"{{int:savearticle}}\"-ро фишор диҳед матни ноҳияи матни болои захира хоҳад шуд.",
+       "explainconflict": "Аз вақте ки шумо вироиши ин саҳифаро оғоз кардаед, шахси дигаре онро тағйир дода аст.\nНоҳияи матни болои шомили матни саҳифа ба шакли феълии он аст.\nТағйироти шумо дар ноҳияи матни поёни нишон дода шудааст.\nШумо бояд тағйиротатонро бо матни феълӣ таркиб кунед.\n'''Фақат''', вақте, ки тугмаи \"$1\"-ро фишор диҳед матни ноҳияи матни болои захира хоҳад шуд.",
        "yourtext": "Матни Шумо",
        "storedversion": "Нусхаи сабтшуда",
        "nonunicodebrowser": "'''Ҳушдор: Муругари шумо бо стандарти Юникод ҷавобгӯ нест. Аломатҳои ғайр аз ASC11 ба сурати адад ба коди шонздаҳ ба шумо нишон дода мешаванд.'''",
        "right-hideuser": "Бастани корбар, бо пинҳон кардани он аз омма",
        "right-editprotected": "Вироиши саҳифаҳои ҳифзшуда чун \"{{int:protect-level-sysop}}\"",
        "right-editinterface": "Вироиши намоиши корбарӣ",
-       "right-editusercssjs": "Вироиши парвандаҳои CSS ва JS дигар корбарон",
        "right-editusercss": "Вироиши парвандаҳои CSS дигар корбарон",
        "right-edituserjs": "Вироиши парвандаҳои JS дигар корбарон",
        "right-rollback": "Вогардонии тези вироишҳои охирин корбаре, ки як саҳифаро вироиш кардааст",
        "rcshowhidemine": "$1 вироишҳои ман",
        "rcshowhidemine-show": "Намоиш",
        "rcshowhidemine-hide": "Пинҳон",
-       "rclinks": "Нишон додани $1 тағйироти охирин дар $2 рӯзи охир<br />$3",
+       "rclinks": "Нишон додани $1 тағйироти охирин дар $2 рӯзи охир",
        "diff": "фарқият",
        "hist": "таърих",
        "hide": "Пинҳон кардани",
        "undeletelink": "дидан/барқарор кардан",
        "undeleteviewlink": "намоиш",
        "undeletecomment": "Сабаб:",
-       "undeletedrevisions": "$1 нусха бақарор {{PLURAL:$1|шуд|шуданд}}",
-       "undeletedrevisions-files": "$1 нусха ва $2 парванда барқарор {{PLURAL:$1|шуд|шуданд}}",
-       "undeletedfiles": "$1 парванда барқарор {{PLURAL:$1|шуд|шуданд}}",
        "cannotundelete": "Барқароркунӣ нашуд; мумкин аст касе дигаре пештар ин саҳифаро барқарор карда бошад.",
        "undeletedpage": "'''$1 барқарор шуд'''\n\nБарои дидани гузориши ҳазфҳо ва барқароркуниҳои охирин ба [[Special:Log/delete|гузориши ҳазф]] нигаред.",
        "undelete-header": "Барои дидани саҳифаҳои ҳазфшудаи охир [[Special:Log/delete|гузоришҳои ҳазфро]] нигаред.",
        "revdelete-restricted": "маҳдудиятҳо ба мудирон амалӣ шуданд",
        "revdelete-unrestricted": "маҳдудиятҳо аз мудирон бардошта шуданд",
        "rightsnone": "(ҳеҷ)",
-       "revdelete-summary": "вироиши хулоса",
        "feedback-cancel": "Лағв",
        "feedback-close": "Анҷом шуд.",
        "feedback-message": "Пайём:",
index a577ebe..f0a4c41 100644 (file)
        "externaldberror": "Xatoe dar irtibot bo pojgohi doda rux doda ast jo in ki şumo içozat ba rūzrasoniji hisobi beruniji xudro nadored.",
        "login": "Vurud",
        "nav-login-createaccount": "Vurud / Soxtani hisobi çadid",
-       "userlogin": "Vurud / Soxtani hisobi çadid",
-       "userloginnocreate": "Vurud",
        "logout": "Xuruç az sistem",
        "userlogout": "Xuruç az sistem",
        "notloggedin": "Ba sistem vurud naşudaed",
-       "nologin": "Nomi korbar nadored? '''$1'''.",
-       "nologinlink": "Hisobero sozed",
        "createaccount": "Hisobi çadidero sozed",
-       "gotaccount": "Hisobi korbarī dored? '''$1'''.",
-       "gotaccountlink": "Vurud şaved",
        "createaccountmail": "bo poctai elektronī",
-       "createaccountreason": "Sabab:",
        "badretype": "Kalimahoi ubure, ki vorid kardaed bo hamdigar muvofiqat namekunand.",
        "userexists": "Nomi korbariji doxil kardaşuda mavridi istifoda ast.\nNomi digareroro intixob kuned.",
        "loginerror": "Iştiboh dar vurud",
        "editing": "Dar holi viroiş $1",
        "editingsection": "Dar holi viroişi $1 (qismat)",
        "editconflict": "Barxūrdi viroişī: $1",
-       "explainconflict": "Az vaqte ki şumo viroişi in sahifaro oƣoz kardaed, şaxsi digare onro taƣjir doda ast.\nNohijai matni boloi şomili matni sahifa ba şakli fe'liji on ast.\nTaƣjiroti şumo dar nohijai matni pojoni nişon doda şudaast.\nŞumo bojad taƣjirotatonro bo matni fe'lī tarkib kuned.\n'''Faqat''', vaqte, ki tugmai \"{{int:savearticle}}\"-ro fişor dihed matni nohijai matni boloi zaxira xohad şud.",
+       "explainconflict": "Az vaqte ki şumo viroişi in sahifaro oƣoz kardaed, şaxsi digare onro taƣjir doda ast.\nNohijai matni boloi şomili matni sahifa ba şakli fe'liji on ast.\nTaƣjiroti şumo dar nohijai matni pojoni nişon doda şudaast.\nŞumo bojad taƣjirotatonro bo matni fe'lī tarkib kuned.\n'''Faqat''', vaqte, ki tugmai \"$1\"-ro fişor dihed matni nohijai matni boloi zaxira xohad şud.",
        "yourtext": "Matni Şumo",
        "storedversion": "Nusxai sabtşuda",
        "nonunicodebrowser": "'''Huşdor: Murugari şumo bo standarti Junikod çavobgū nest. Alomathoi ƣajr az ASC11 ba surati adad ba kodi şonzdah ba şumo nişon doda meşavand.'''",
        "prefs-resetpass": "Taƣjiri guzarvoƶa",
        "saveprefs": "Zaxirai tarçihot",
        "prefs-editing": "Dar holi viroiş",
-       "rows": "Te'dodi satrho:",
-       "columns": "Te'dodi sutunho:",
        "searchresultshead": "Çustuçū",
        "stub-threshold": "Ostonai viroişi pajvandhoi <a href=\"#\" class=\"stub\">noqis</a>:",
        "recentchangesdays": "Te'dodi rūzhoi namoiş dodaşuda dar taƣjiroti oxir:",
        "userrights-reason": "Sabab:",
        "userrights-no-interwiki": "Şumo içozati taƣjiri ixtijoroti korbaroni digar vikihoro nadored.",
        "userrights-nodatabase": "Pojgohi doda $1 vuçud nadorad jo mahallī nest.",
-       "userrights-nologin": "Şumo bojad bo jak hisobi korbarī doroi ixtijoroti mudirijatī [[Special:UserLogin|ba sistem vurud kuned]], to bitavoned ixtijoroti korbaronro ta'jid kuned.",
-       "userrights-notallowed": "Hisobi korbariji şumo içozati taƣjiri ixtijoroti korbariro nadorad.",
        "userrights-changeable-col": "Gurūhhoe, ki şumo metavoned taƣjir dihed",
        "userrights-unchangeable-col": "Gurūhhoe, ki şumo nametavoned taƣjir dihed",
        "group": "Gurūh:",
        "right-hideuser": "Bastani korbar, bo pinhon kardani on az omma",
        "right-editprotected": "Viroişi sahifahoi hifzşuda (biduni hifzi obşorī)",
        "right-editinterface": "Viroişi namoişi korbarī",
-       "right-editusercssjs": "Viroişi parvandahoi CSS va JS digar korbaron",
        "right-editusercss": "Viroişi parvandahoi CSS digar korbaron",
        "right-edituserjs": "Viroişi parvandahoi JS digar korbaron",
        "right-rollback": "Vogardoniji tezi viroişhoi oxirin korbare, ki jak sahifaro viroiş kardaast",
        "rcshowhideanons": "$1 korbaroni vurudnaşuda",
        "rcshowhidepatr": "$1 viroişhoi gaştī",
        "rcshowhidemine": "$1 viroişhoi man",
-       "rclinks": "Nişon dodani $1 taƣjiroti oxirin dar $2 rūzi oxir<br />$3",
+       "rclinks": "Nişon dodani $1 taƣjiroti oxirin dar $2 rūzi oxir",
        "diff": "farqijat",
        "hist": "ta'rix",
        "hide": "Pinhon kardani",
        "undeletelink": "didan/barqaror kardan",
        "undeleteviewlink": "namoiş",
        "undeletecomment": "Tavzeh:",
-       "undeletedrevisions": "$1 nusxa baqaror {{PLURAL:$1|şud|şudand}}",
-       "undeletedrevisions-files": "$1 nusxa va $2 parvanda barqaror {{PLURAL:$1|şud|şudand}}",
-       "undeletedfiles": "$1 parvanda barqaror {{PLURAL:$1|şud|şudand}}",
        "cannotundelete": "Barqarorkunī naşud; mumkin ast kase digare peştar in sahifaro barqaror karda boşad.",
        "undeletedpage": "'''$1 barqaror şud'''\n\nBaroi didani guzorişi hazfho va barqarorkunihoi oxirin ba [[Special:Log/delete|guzorişi hazf]] nigared.",
        "undelete-header": "Baroi didani sahifahoi hazfşudai oxir [[Special:Log/delete|guzorişhoi hazfro]] nigared.",
        "revdelete-restricted": "mahdudijatho ba mudiron amalī şudand",
        "revdelete-unrestricted": "mahdudijatho az mudiron bardoşta şudand",
        "rightsnone": "(heç)",
-       "revdelete-summary": "viroişi xulosa",
        "expandtemplates": "Bastdodani şablonho",
        "expand_templates_intro": "In sahifai viƶa matnero darjoft karda va tamomi şablonhoi ba kor rafta dar onro ba tavri bozgaşte bast medihad. Hamcunin tobehoi taçzeh\n<nowiki>{{</nowiki>#language:...}}, va mutaƣjirhoe cun\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash;ro ham bast medihad – dar voqe' taqriban har ciro ki doxili du akulot boşad.\nIn kor bo sado zadani marhilai taçzehi marbut dar xudi MediaViki surat megirad.",
        "expand_templates_title": "Unvoni mavzū', baroi {{FULLPAGENAME}} va ƣajra.:",
index 546c32c..6aa52c2 100644 (file)
@@ -68,7 +68,7 @@
        "tog-watchlisthidepatrolled": "ซ่อนการแก้ไขที่ตรวจสอบแล้วจากรายการเฝ้าดู",
        "tog-watchlisthidecategorization": "ซ่อนการจัดหมวดหมู่หน้า",
        "tog-ccmeonemails": "ส่งสำเนาอีเมลที่ฉันส่งหาผู้อื่นให้ฉัน",
-       "tog-diffonly": "à¹\84มà¹\88à¹\81สà¸\94à¸\87à¹\80à¸\99ืà¹\89อหาหà¸\99à¹\89าà¹\83à¸\95à¹\89à¸\9cลà¸\95à¹\88าà¸\87",
+       "tog-diffonly": "à¹\84มà¹\88à¹\81สà¸\94à¸\87à¹\80à¸\99ืà¹\89อหาหà¸\99à¹\89าà¹\83à¸\95à¹\89à¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87ระหวà¹\88าà¸\87รุà¹\88à¸\99",
        "tog-showhiddencats": "แสดงหมวดหมู่ที่ซ่อนอยู่",
        "tog-norollbackdiff": "ไม่แสดงผลต่างหลังดำเนินการย้อนกลับฉุกเฉิน",
        "tog-useeditwarning": "เตือนฉันเมื่อออกหน้าแก้ไขโดยมีการเปลี่ยนแปลงที่ยังไม่บันทึก",
        "tagline": "จาก {{SITENAME}}",
        "help": "วิธีใช้",
        "search": "ค้นหา",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# อธิบายหัวข้อที่จะละเว้นในการค้นหา\n# การเปลี่ยนแปลงนี้จะมีผลเมื่อหน้าหัวเรื่องถูกจัดทำดัชนี\n# บังคับให้จัดทำดัชนีหน้าใหม่ด้วยการแก้ไขที่ว่างเปล่า\n# ไวยากรณ์เป็นดังนี้:\n#   * ทุกๆ บรรทัดที่ขึ้นต้นด้วย \"#\" จะเป็นคำอธิบายจนถึงจุดสิ้นสุดของบรรทัด\n#   * บรรทัดที่ไม่ใช่บรรทัดว่างจะเป็นบรรทัดแรกที่คุณต้องการละเลย รวมทั้งการใช้อักษรตัวพิมพ์ใหญ่และทุกๆ อย่างด้วย\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "ค้นหา",
        "go": "ไป",
        "searcharticle": "ไป",
        "history": "ประวัติหน้า",
        "history_short": "ประวัติ",
        "history_small": "ประวัติ",
-       "updatedmarker": "à¸\96ูà¸\81à¸\9bรัà¸\9aà¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\81ารà¹\80ยีà¹\88ยมà¸\8aมà¸\84รัà¹\89à¸\87สุà¸\94à¸\97à¹\89ายของฉัน",
+       "updatedmarker": "à¸\96ูà¸\81à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\95ัà¹\89à¸\87à¹\81à¸\95à¹\88à¸\81ารà¹\80ยีà¹\88ยมà¸\8aมà¸\84รัà¹\89à¸\87ลà¹\88าสุà¸\94ของฉัน",
        "printableversion": "รุ่นพร้อมพิมพ์",
        "permalink": "ลิงก์ถาวร",
        "print": "พิมพ์",
        "redirectedfrom": "(เปลี่ยนทางจาก $1)",
        "redirectpagesub": "หน้าเปลี่ยนทาง",
        "redirectto": "เปลี่ยนทางไป:",
-       "lastmodifiedat": "à¸\94ัà¸\94à¹\81à¸\9bรหà¸\99à¹\89าà¸\99ีà¹\89ล่าสุดเมื่อวันที่ $1 เวลา $2",
+       "lastmodifiedat": "หà¸\99à¹\89าà¸\99ีà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82ล่าสุดเมื่อวันที่ $1 เวลา $2",
        "viewcount": "มีการเข้าถึงหน้านี้ $1 ครั้ง",
        "protectedpage": "หน้าถูกป้องกัน",
        "jumpto": "ข้ามไป:",
        "policy-url": "Project:นโยบาย",
        "portal": "ศูนย์รวมชุมชน",
        "portal-url": "Project:ศูนย์รวมชุมชน",
-       "privacy": "à¸\99à¹\82ยà¸\9aายสิà¸\97à¸\98ิสà¹\88วà¸\99à¸\9aุà¸\84à¸\84ล",
-       "privacypage": "Project:à¸\99à¹\82ยà¸\9aายสิà¸\97à¸\98ิสà¹\88วà¸\99à¸\9aุà¸\84à¸\84ล",
+       "privacy": "à¸\99à¹\82ยà¸\9aายà¸\84วามà¹\80à¸\9bà¹\87à¸\99สà¹\88วà¸\99à¸\95ัว",
+       "privacypage": "Project:à¸\99à¹\82ยà¸\9aายà¸\84วามà¹\80à¸\9bà¹\87à¸\99สà¹\88วà¸\99à¸\95ัว",
        "badaccess": "มีข้อผิดพลาดในการใช้สิทธิ",
        "badaccess-group0": "คุณไม่ได้รับอนุญาตให้ดำเนินการตามที่ขอ",
        "badaccess-groups": "ปฏิบัติการที่คุณขอนี้สงวนไว้เฉพาะผู้ใช้ใน{{PLURAL:$2|กลุ่ม|กลุ่มเหล่านี้}}: $1",
        "viewsourcetext": "คุณสามารถดูและคัดลอกโค้ดของหน้านี้",
        "viewyourtext": "คุณสามารถดูและคัดลอกต้นฉบับ<strong>การแก้ไขของคุณ</strong>มาหน้านี้ได้",
        "protectedinterface": "หน้านี้เป็นข้อความส่วนต่อประสานสำหรับซอฟต์แวร์บนวิกินี้ และถูกล็อกเพื่อป้องกันการกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [https://translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
-       "editinginterface": "<strong>à¸\84ำà¹\80à¸\95ือà¸\99:</strong> à¸\84ุà¸\93à¸\81ำลัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¸\88ัà¸\94หาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะมีผลต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้",
+       "editinginterface": "<strong>à¸\84ำà¹\80à¸\95ือà¸\99:</strong> à¸\84ุà¸\93à¸\81ำลัà¸\87à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¸\88ัà¸\94à¹\80à¸\95รียมข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะมีผลต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้",
        "translateinterface": "ในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [https://translatewiki.net/ translatewiki.net] โครงการแปลเป็นภาษาถิ่นของมีเดียวิกิ",
        "cascadeprotected": "หน้านี้ถูกป้องกันมิให้แก้ไข เพราะถูกรวมอยู่ใน{{PLURAL:$1|page, which is|หน้าต่อไปนี้}} ซึ่งถูกล็อกโดยเปิดตัวเลือก \"ต่อเรียง\":\n$2",
        "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
        "login": "ล็อกอิน",
        "login-security": "ยืนยันตัวตนของคุณ",
        "nav-login-createaccount": "ล็อกอิน / สร้างบัญชี",
-       "userlogin": "ล็อกอิน / สร้างบัญชี",
-       "userloginnocreate": "ล็อกอิน",
        "logout": "ล็อกเอาต์",
        "userlogout": "ล็อกเอาต์",
        "notloggedin": "ไม่ได้ล็อกอิน",
        "userlogin-noaccount": "ไม่มีบัญชีหรือ",
        "userlogin-joinproject": "เข้าร่วมกับ{{SITENAME}}",
-       "nologin": "ไม่มีบัญชีหรือ $1",
-       "nologinlink": "สร้างบัญชี",
        "createaccount": "สร้างบัญชี",
-       "gotaccount": "มีบัญชีแล้วใช่ไหม $1",
-       "gotaccountlink": "ล็อกอิน",
-       "userlogin-resetlink": "ลืมรายละเอียดล็อกอินของคุณหรือ",
        "userlogin-resetpassword-link": "ลืมรหัสผ่านหรือ",
        "userlogin-helplink2": "วิธีใช้เรื่องการล็อกอิน",
        "userlogin-loggedin": "คุณล็อกอินในชื่อ {{GENDER:$1|$1}} แล้ว\nใช้แบบด้านล่างเพื่อล็อกอินเป็นอีกผู้ใช้หนึ่ง",
        "createaccountmail": "ใช้รหัสผ่านสุ่มชั่วคราวและส่งไปยังที่อยู่อีเมลที่ระบุ",
        "createaccountmail-help": "สามารถใช้สร้างบัญชีสำหรับบุคคลอื่นๆ โดยที่ไม่ต้องเรียนรู้รหัสผ่านก็ได้",
        "createacct-realname": "ชื่อจริง (เลือกไม่ใส่ได้)",
-       "createaccountreason": "เหตุผล:",
        "createacct-reason": "เหตุผล",
        "createacct-reason-ph": "เหตุใดคุณจึงสร้างอีกบัญชี",
        "createacct-reason-help": "ข้อความที่แสดงในล็อกการสร้างบัญชี",
        "botpasswords-label-delete": "ลบ",
        "botpasswords-label-resetpassword": "ตั้งรหัสผ่านใหม่",
        "botpasswords-label-grants": "การอนุญาตที่นำไปใช้ได้:",
+       "botpasswords-help-grants": "การอนุญาตจะอนุญาตให้เข้าถึงสิทธิ์ต่างๆ ที่บัญชีผู้ใช้ปัจจุบันมีอยู่ การเปิดใช้งานการอนุญาตที่นี่ไม่ใช่การอนุญาตการเข้าถึงที่บัญชีผู้ใช้ของคุณไม่มี สำหรับข้อมูลเพิ่มเติม โปรดดูที่ [[Special:ListGrants|ตารางการอนุญาต]]",
        "botpasswords-label-grants-column": "อนุญาตแล้ว",
        "botpasswords-bad-appid": "ชื่อบอต \"$1\" ไม่ถูกต้อง",
        "botpasswords-insert-failed": "การเพิ่มชื่อบอต \"$1\" ล้มเหลว คุณได้เพิ่มมันไว้แล้วหรือเปล่า?",
        "botpasswords-updated-body": "รหัสผานบอตสำหรับชื่อบอต \"$1\" ของผู้ใช้ \"$2\" ถูกอัปเดตแล้ว",
        "botpasswords-deleted-title": "ลบรหัสผ่านบอตแล้ว",
        "botpasswords-deleted-body": "รหัสผ่านบอตสำหรับชื่อบอต \"$1\" ของผู้ใช้ชื่อ \"$2\" ถูกลบออกแล้ว",
+       "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\")",
        "botpasswords-not-exist": "ผู้ใช้ \"$1\" ไม่มีรหัสผ่านบอต \"$2\".",
        "resetpass_forbidden": "ไม่สามารถเปลี่ยนรหัสผ่านได้",
        "resetpass_forbidden-reason": "ไม่สามารถเปลี่ยนรหัสผ่านได้: $1",
-       "resetpass-no-info": "คุณต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง",
+       "resetpass-no-info": "à¸\84ุà¸\93à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87ลà¹\87อà¸\81อิà¸\99à¹\80à¸\9eืà¹\88อà¹\80à¸\82à¹\89าà¸\96ึà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¹\82à¸\94ยà¸\95รà¸\87",
        "resetpass-submit-loggedin": "เปลี่ยนรหัสผ่าน",
        "resetpass-submit-cancel": "ยกเลิก",
        "resetpass-wrong-oldpass": "รหัสผ่านชั่วคราวหรือปัจจุบันไม่ถูกต้อง\nคุณอาจเปลี่ยนรหัสผ่านของคุณสำเร็จแล้ว หรือขอรหัสผ่านชั่วคราวใหม่แล้ว",
        "resettokens-tokens": "โทเค็น:",
        "resettokens-token-label": "$1 (ค่าปัจจุบัน: $2)",
        "resettokens-watchlist-token": "โทเค็นสำหรับเว็บฟีด (Atom/RSS) ของ[[Special:Watchlist|การเปลี่ยนแปลงแก่หน้าในรายการเฝ้าดูของคุณ]]",
-       "resettokens-done": "ตั้งโทเค็นใหม่แล้ว",
+       "resettokens-done": "à¸\95ัà¹\89à¸\87à¸\84à¹\88าà¹\82à¸\97à¹\80à¸\84à¹\87à¸\99à¹\83หมà¹\88à¹\81ลà¹\89ว",
        "resettokens-resetbutton": "ตั้งโทเค็นที่เลือกใหม่",
        "bold_sample": "ข้อความตัวหนา",
        "bold_tip": "ทำตัวหนา",
        "preview": "ตัวอย่าง",
        "showpreview": "แสดงตัวอย่าง",
        "showdiff": "แสดงการเปลี่ยนแปลง",
-       "blankarticle": "<strong>คำเตือน:</strong> หน้าที่คุณกำลังสร้างว่าง หากคุณคลิก \"{{int:savearticle}}\" อีกครั้ง จะสร้างหน้าโดยไม่มีเนื้อหาใด",
+       "blankarticle": "<strong>คำเตือน:</strong> หน้าที่คุณกำลังสร้างว่าง หากคุณคลิก \"$1\" อีกครั้ง จะสร้างหน้าโดยไม่มีเนื้อหาใด",
        "anoneditwarning": "<strong>คำเตือน:</strong> คุณมิได้ล็อกอิน สาธารณะจะเห็นเลขที่อยู่ไอพีของคุณหากคุณแก้ไข หากคุณ<strong>[$1 ล็อกอิน]</strong>หรือ<strong>[$2 สร้างบัญชี]</strong> การแก้ไขของคุณจะถือว่าเป็นของชื่อผู้ใช้ของคุณ ร่วมกับประโยชน์อื่น",
        "anonpreviewwarning": "<em>คุณมิได้ล็อกอิน การบันทึกจะเก็บเลขที่อยู่ไอพีของคุณในประวัติการแก้ไขของหน้านี้</em>",
-       "missingsummary": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ให้คำอธิบายการแก้ไข \nถ้าคุณคลิก \"{{int:savearticle}}\" อีก จะบันทึกการแก้ไขของคุณโดยไม่มีคำอธิบายการแก้ไข",
-       "selfredirect": "<strong>คำเตือน:</strong> คุณกำลังสร้างการเปลี่ยนทางไปบทความเดียวกัน\nคุณอาจระบุเป้าหมายของการเปลี่ยนทางผิด หรือคถณอาจแก้ไขหน้าผิด \nหากคุณคลิก \"{{int:savearticle}}\" อีกครั้ง จะสร้างการเปลี่ยนทาง",
+       "missingsummary": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ให้คำอธิบายการแก้ไข \nถ้าคุณคลิก \"$1\" อีก จะบันทึกการแก้ไขของคุณโดยไม่มีคำอธิบายการแก้ไข",
+       "selfredirect": "<strong>คำเตือน:</strong> คุณกำลังสร้างการเปลี่ยนทางไปบทความเดียวกัน\nคุณอาจระบุเป้าหมายของการเปลี่ยนทางผิด หรือคถณอาจแก้ไขหน้าผิด \nหากคุณคลิก \"$1\" อีกครั้ง จะสร้างการเปลี่ยนทาง",
        "missingcommenttext": "กรุณากรอกความเห็นด้านล่าง",
-       "missingcommentheader": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ใส่เรื่องสำหรับความเห็นนี้ \nถ้าคุณคลิก \"{{int:savearticle}}\" อีก จะบันทึกการแก้ไขของคุณโดยไม่ระบุเรื่อง",
+       "missingcommentheader": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ใส่เรื่องสำหรับความเห็นนี้ \nถ้าคุณคลิก \"$1\" อีก จะบันทึกการแก้ไขของคุณโดยไม่ระบุเรื่อง",
        "summary-preview": "ตัวอย่างคำอธิบายการแก้ไข:",
        "subject-preview": "ตัวอย่างชื่อเรื่อง:",
        "previewerrortext": "เกิดข้อผิดพลาดขณะกำลังพยายามดูตัวอย่างการเปลี่ยนแปลงของคุณ",
        "editingsection": "กำลังแก้ไข $1 (เฉพาะส่วน)",
        "editingcomment": "กำลังแก้ไข $1 (ส่วนใหม่)",
        "editconflict": "แก้ไขชนกัน: $1",
-       "explainconflict": "มีผู้เปลี่ยนแปลงหน้านี้ตั้งแต่คุณเริ่มแก้ไข\nพื้นที่ข้อความส่วนบนมีข้อความหน้าที่มีอยู่ในปัจจุบัน\nการแก้ไขของคุณแสดงอยู่ในพื้นที่ข้อความส่วนล่าง\nคุณจะต้องรวมการเปลี่ยนแปลงของคุณเข้ากับข้อความที่มีอยู่\n<strong>เฉพาะ</strong>ข้อความในพื้นที่ข้อความส่วนบนเท่านั้นที่จะถูกบันทึก เมื่อกด \"{{int:savearticle}}\"",
+       "explainconflict": "มีผู้เปลี่ยนแปลงหน้านี้ตั้งแต่คุณเริ่มแก้ไข\nพื้นที่ข้อความส่วนบนมีข้อความหน้าที่มีอยู่ในปัจจุบัน\nการแก้ไขของคุณแสดงอยู่ในพื้นที่ข้อความส่วนล่าง\nคุณจะต้องรวมการเปลี่ยนแปลงของคุณเข้ากับข้อความที่มีอยู่\n<strong>เฉพาะ</strong>ข้อความในพื้นที่ข้อความส่วนบนเท่านั้นที่จะถูกบันทึก เมื่อกด \"$1\"",
        "yourtext": "ข้อความของคุณ",
        "storedversion": "รุ่นที่เก็บไว้",
        "nonunicodebrowser": "<strong>คำเตือน: เบราว์เซอร์ของคุณไม่สนับสนุนยูนิโคด</strong> \nการแก้ไขไปพลางจะทำให้คุณแก้ไขหน้าได้อย่างปลอดภัย: อักขระที่มิใช่ ASCII จะปรากฏในกล่องแก้ไขเป็นรหัสฐานสิบหก",
        "invalid-content-data": "ข้อมูลเนื้อหาไม่ถูกต้อง",
        "content-not-allowed-here": "ไม่อนุญาตเนื้อหา \"$1\" ในหน้า [[$2]]",
        "editwarning-warning": "การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณดำเนินการสูญหาย\nถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน \"{{int:prefs-editing}}\" ในการตั้งค่าของคุณ",
+       "editpage-invalidcontentmodel-title": "ไม่รองรับรูปแบบเนื้อหานี้",
        "editpage-notsupportedcontentformat-title": "รูปแบบเนื้อหาไม่ได้รับการรองรับ",
        "editpage-notsupportedcontentformat-text": "ตัวแบบเนื้อหา $2 ไม่รองรับตัวแบบเนื้อหา $1",
        "content-model-wikitext": "ข้อความวิกิ",
        "page_last": "ท้ายสุด",
        "histlegend": "การเลือกผลต่าง: เลือกปุ่มของสองรุ่นที่ต้องการเปรียบเทียบ และกดป้อนเข้าหรือปุ่มด้านล่าง<br />\nคำอธิบาย: <strong>({{int:cur}})</strong> = ผลต่างกับรุ่นปัจจุบัน, <strong>({{int:last}})</strong> = ผลต่างกับรุ่นก่อนหน้า, <strong>{{int:minoreditletter}}</strong> = การแก้ไขเล็กน้อย",
        "history-fieldset-title": "ค้นดูประวัติ",
-       "history-show-deleted": "เฉพาะที่ถูกลบ",
+       "history-show-deleted": "à¹\80à¸\89à¸\9eาะรุà¹\88à¸\99à¸\97ีà¹\88à¸\96ูà¸\81ลà¸\9a",
        "histfirst": "แรกสุด",
        "histlast": "ล่าสุด",
        "historysize": "($1 ไบต์)",
        "mergehistory-fail-bad-timestamp": "สแตมป์เวลาไม่ถูกต้อง",
        "mergehistory-fail-invalid-source": "หน้าต้นทางไม่ถูกต้อง",
        "mergehistory-fail-invalid-dest": "หน้าปลายทางไม่ถูกต้อง",
+       "mergehistory-fail-no-change": "ไม่ได้มีการควบรวมรุ่นใดๆ ในการควบรวมประวัติหน้า  โปรดตรวจดูค่าตัวแปร หน้า และ เวลา ใหม่อีกครั้ง",
        "mergehistory-fail-permission": "มีสิทธิไม่เพียงพอที่จะผสานประวัติ",
        "mergehistory-fail-self-merge": "หน้าต้นทางและปลายทางเป็นหน้าเดียวกัน",
        "mergehistory-fail-toobig": "ไม่สามารถผสานประวัติได้ เนื่องจาก $1 รุ่นแก้ไขเก่าที่เกินขีดจำกัดสูงสุดจะต้องถูกย้ายไปก่อน",
        "mergelog": "ปูมการรวม",
        "revertmerge": "เลิกรวม",
        "mergelogpagetext": "ด้านล่างนี้เป็นรายการการรวมประวัติหน้าหนึ่งกับของอีกหน้าหนึ่งล่าสุด",
-       "history-title": "à¸\9bระวัà¸\95ิรุà¹\88à¸\99ปรับปรุงของ \"$1\"",
+       "history-title": "à¸\9bระวัà¸\95ิà¸\81ารปรับปรุงของ \"$1\"",
        "difference-title": "ผลต่างระหว่างรุ่นของ \"$1\"",
        "difference-title-multipage": "ผลต่างระหว่างหน้า \"$1\" และ \"$2\"",
        "difference-multipage": "(ผลต่างระหว่างหน้า)",
        "prefsnologintext2": "โปรดล็อกอินเพื่อเปลี่ยนการตั้งค่าของคุณ",
        "prefs-skin": "หน้าตา",
        "skin-preview": "ตัวอย่าง",
-       "datedefault": "à¹\84มà¹\88มีà¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88า",
+       "datedefault": "ไม่ตั้งค่า",
        "prefs-labs": "คุณสมบัติทดลอง",
        "prefs-user-pages": "หน้าผู้ใช้",
-       "prefs-personal": "à¹\82à¸\9eรà¹\84à¸\9fลà¹\8cผู้ใช้",
+       "prefs-personal": "à¸\82à¹\89อมูลผู้ใช้",
        "prefs-rc": "ปรับปรุงล่าสุด",
        "prefs-watchlist": "รายการเฝ้าดู",
        "prefs-editwatchlist": "แก้ไขรายการเฝ้าดู",
        "prefs-changeemail": "เปลี่ยนหรือลบที่อยู่อีเมล",
        "prefs-setemail": "ตั้งที่อยู่อีเมล",
        "prefs-email": "ตัวเลือกอีเมล",
-       "prefs-rendering": "รูà¸\9bลัà¸\81ษà¸\93à¹\8c",
+       "prefs-rendering": "à¸\81ารà¹\81สà¸\94à¸\87à¸\9cล",
        "saveprefs": "บันทึก",
        "restoreprefs": "คืนการตั้งค่าโดยปริยายทั้งหมด (ในทุกส่วน)",
        "prefs-editing": "การแก้ไข",
        "searchresultshead": "ค้นหา",
-       "stub-threshold": "à¸\82ีà¸\94à¹\81à¸\9aà¹\88à¸\87สำหรัà¸\9aà¸\81ารà¸\88ัà¸\94รูà¸\9bà¹\81à¸\9aà¸\9aลิà¸\87à¸\81à¹\8cโครง ($1):",
+       "stub-threshold": "à¸\84วามยาวà¸\82อà¸\87หà¸\99à¹\89าà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¹\80à¸\9bà¹\87à¸\99à¹\80สà¹\89à¸\99à¹\81à¸\9aà¹\88à¸\87à¹\83à¸\99à¸\81ารระà¸\9aุหà¸\99à¹\89าà¹\82à¸\84รà¸\87 à¹\80à¸\9eืà¹\88อà¸\88ะà¹\83หà¹\89มีà¸\81ารà¸\88ัà¸\94รูà¸\9bà¹\81à¸\9aà¸\9aà¹\80à¸\89à¸\9eาะà¸\95ัว à¸ªà¸³à¸«à¸£à¸±à¸\9aลิà¸\87à¸\81à¹\8cà¸\97ีà¹\88à¹\82ยà¸\87มายัà¸\87โครง ($1):",
        "stub-threshold-sample-link": "ตัวอย่าง",
        "stub-threshold-disabled": "ปิดใช้งาน",
        "recentchangesdays": "จำนวนวันที่แสดงในปรับปรุงล่าสุด:",
        "timezoneregion-europe": "ยุโรป",
        "timezoneregion-indian": "มหาสมุทรอินเดีย",
        "timezoneregion-pacific": "มหาสมุทรแปซิฟิก",
-       "allowemail": "à¹\80à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99อีเมลจากผู้ใช้อื่น",
+       "allowemail": "à¹\80à¸\9bิà¸\94รัà¸\9aอีเมลจากผู้ใช้อื่น",
        "prefs-searchoptions": "ค้นหา",
        "prefs-namespaces": "เนมสเปซ",
        "default": "ค่าโดยปริยาย",
        "prefs-emailconfirm-label": "การยืนยันอีเมล:",
        "youremail": "อีเมล:",
        "username": "{{GENDER:$1|ชื่อผู้ใช้}}:",
-       "prefs-memberingroups": "{{GENDER:$2|สมาชิก}}ใน{{PLURAL:$1|กลุ่ม|กลุ่ม}}:",
+       "prefs-memberingroups": "เป็น{{GENDER:$2|สมาชิก}}ใน{{PLURAL:$1|กลุ่ม|กลุ่ม}}:",
+       "group-membership-link-with-expiry": "$1 (จนกระทั่ง $2)",
        "prefs-registration": "เวลาลงทะเบียน:",
        "yourrealname": "ชื่อจริง:",
        "yourlanguage": "ภาษา:",
        "prefs-help-email": "ไม่จำเป็นต้องใส่ที่อยู่อีเมล แต่จำเป็นสำหรับการตั้งรหัสผ่านใหม่หากคุณลืมรหัสผ่าน",
        "prefs-help-email-others": "คุณยังสามารถเลือกให้ผู้อื่นติดต่อคุณโดยอีเมลผ่านลิงก์บนหน้าผู้ใช้หรือหน้าพูดคุยกับผู้ใช้ของคุณ\nไม่เปิดเผยที่อยู่อีเมลของคุณเมื่อผู้ใช้อื่นติดต่อคุณ",
        "prefs-help-email-required": "ต้องการที่อยู่อีเมล",
-       "prefs-info": "สารสà¸\99à¹\80à¸\97ศเบื้องต้น",
+       "prefs-info": "à¸\82à¹\89อมูลเบื้องต้น",
        "prefs-i18n": "สากลวิวัตน์",
        "prefs-signature": "ลายเซ็น",
-       "prefs-dateformat": "รูปแบบวัน",
+       "prefs-dateformat": "รูปแบบวันที่",
        "prefs-timeoffset": "ส่วนต่างเวลา",
        "prefs-advancedediting": "ตัวเลือกทั่วไป",
        "prefs-editor": "ตัวแก้ไข",
        "prefs-displayrc": "ตัวเลือกผลแสดง",
        "prefs-displaywatchlist": "ตัวเลือกผลแสดง",
        "prefs-tokenwatchlist": "โทเค็น",
-       "prefs-diffs": "à¸\9cลà¸\95à¹\88าà¸\87",
+       "prefs-diffs": "à¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87ระหวà¹\88าà¸\87รุà¹\88à¸\99",
        "prefs-help-prefershttps": "การตั้งค่านี้จะมีผลเมื่อคุณล็อกอินครั้งถัดไป",
        "prefswarning-warning": "คุณเปลี่ยนแปลงการตั้งค่าของคุณที่ยังไม่ได้บันทึก\nหากคุณออกจากหน้านี้โดยไม่คลิก \"$1\" จะไม่ปรับการตั้งค่าของคุณ",
        "prefs-tabs-navigation-hint": "แนะนำ: คุณสามารถใช้แป้นลูกศรซ้ายและขวาเพื่อนำทางระหว่างแถบในรายการแถบได้",
        "userrights-nodatabase": "ไม่มีฐานข้อมูล $1 หรือฐานข้อมูลอยู่บนเครื่องอื่น",
        "userrights-changeable-col": "กลุ่มที่คุณสามารถเปลี่ยนได้",
        "userrights-unchangeable-col": "กลุ่มที่คุณไม่สามารถเปลี่ยนได้",
+       "userrights-expiry-current": "หมดอายุ $1",
+       "userrights-expiry-none": "ไม่มีวันหมดอายุ",
+       "userrights-expiry": "หมดอายุ:",
        "userrights-conflict": "พบการเปลี่ยนแปลงสิทธิผู้ใช้ขัดกัน! โปรดทบทวนและยืนยันการเปลี่ยนแปลงของคุณ",
        "group": "กลุ่ม:",
        "group-user": "ผู้ใช้",
        "right-editsemiprotected": "แก้ไขหน้าที่ถูกล็อกในฐานะ \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "แก้ไขตัวแบบเนื้อหาของหน้า",
        "right-editinterface": "แก้ไขอินเตอร์เฟซผู้ใช้",
-       "right-editusercssjs": "แก้ไขไฟล์ CSS และจาวาสคริปต์ของผู้ใช้อื่น",
        "right-editusercss": "แก้ไขไฟล์ CSS ของผู้ใช้อื่น",
        "right-edituserjs": "แก้ไขไฟล์จาวาสคริปต์ของผู้ใช้อื่น",
        "right-editmyusercss": "แก้ไขไฟล์ซีเอสเอสผู้ใช้ของคุณเอง",
        "grant-group-watchlist-interaction": "โต้ตอบกับรายการเฝ้าดูของคุณ",
        "grant-group-email": "ส่งอีเมล",
        "grant-group-customization": "การปรับแต่งและการตั้งค่า",
+       "grant-group-private-information": "เข้าถึงข้อมูลส่วนตัวเกี่ยวกับตัวคุณ",
        "grant-group-other": "กิจกรรมเบ็ดเตล็ด",
        "grant-blockusers": "บล็อกและปลดบล็อกผู้ใช้ต่าง ๆ",
        "grant-createaccount": "สร้างบัญชี",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ดูเพิ่มที่ [[Special:NewPages|รายชื่อหน้าใหม่]])",
        "recentchanges-submit": "แสดง",
        "rcfilters-activefilters": "ตัวกรองที่ทำงาน",
+       "rcfilters-quickfilters": "ลิงก์ด่วน",
+       "rcfilters-savedqueries-new-name-label": "ชื่อ",
+       "rcfilters-savedqueries-apply-label": "สร้างลิงก์ด่วน",
+       "rcfilters-savedqueries-cancel-label": "ยกเลิก",
+       "rcfilters-savedqueries-add-new-title": "บันทึกตัวกรองเป็นลิงก์ด่วน",
        "rcfilters-restore-default-filters": "คืนค่าตัวกรองปริยาย",
        "rcfilters-clear-all-filters": "ล้างตัวกรองทั้งหมด",
        "rcfilters-invalid-filter": "ตัวกรองไม่ถูกต้อง",
        "rcfilters-filterlist-title": "ตัวกรอง",
+       "rcfilters-highlightmenu-title": "เลือกสี",
        "rcfilters-filterlist-noresults": "ไม่พบตัวกรองใด ๆ",
+       "rcfilters-noresults-conflict": "ไม่พบผลลัพธ์ เนื่องจากเงื่อนไขการค้นขัดแย้งกัน",
        "rcfilters-filtergroup-registration": "การลงทะเบียนผู้ใช้",
        "rcfilters-filter-registered-label": "ลงทะเบียน",
        "rcfilters-filter-registered-description": "ผู้แก้ไขที่ล็อกอินแล้ว",
        "rcfilters-filter-editsbyother-label": "การแก้ไขต่าง ๆ ที่ผู้อื่นทำ",
        "rcfilters-filter-editsbyother-description": "การแก้ไขต่าง ๆ ที่ผู้ใช้อื่นทำ (ไม่ใช่คุณ)",
        "rcfilters-filtergroup-userExpLevel": "ระดับผู้เชี่ยวชาญ (สำหรับผู้ใช้ที่ลงทะเบียนเท่านั้น)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "ผู้ที่มาใหม่",
-       "rcfilters-filter-userExpLevel-experienced-label": "ผู้ใช้ที่มีความเชี่ยวชาญ",
+       "rcfilters-filter-user-experience-level-newcomer-label": "ผู้ที่มาใหม่",
+       "rcfilters-filter-user-experience-level-experienced-label": "ผู้ใช้ที่มีความเชี่ยวชาญ",
+       "rcfilters-filter-minor-label": "การแก้ไขเล็กน้อย",
+       "rcfilters-filter-major-label": "ไม่ใช่การแก้ไขเล็กน้อย",
+       "rcfilters-filter-major-description": "การแก้ไขที่ไม่ได้ทำเครื่องหมายเป็นการแก้ไขเล็กน้อย",
+       "rcfilters-filtergroup-watchlist": "หน้าในรายการเฝ้าดู",
+       "rcfilters-filter-watchlist-watched-label": "ในรายการเฝ้าดู",
+       "rcfilters-filter-watchlist-watched-description": "การปรับปรุงของหน้าในรายการเฝ้าดูของคุณ",
+       "rcfilters-filter-watchlist-notwatched-label": "ไม่อยู่ในรายการเฝ้าดู",
+       "rcfilters-filter-watchlist-notwatched-description": "ทั้งหมดยกเว้นการปรับปรุงของหน้าในรายการเฝ้าดูของคุณ",
+       "rcfilters-filtergroup-changetype": "ประเภทการปรับปรุง",
+       "rcfilters-filter-pageedits-label": "จำนวนการแก้ไขหน้า",
+       "rcfilters-filter-newpages-label": "จำนวนการสร้างหน้า",
+       "rcfilters-filter-categorization-label": "การปรับเปลี่ยนหมวดหมู่",
+       "rcfilters-filtergroup-lastRevision": "รุ่นล่าสุด",
+       "rcfilters-filter-lastrevision-label": "รุ่นล่าสุด",
+       "rcfilters-filter-lastrevision-description": "การปรับปรุงล่าสุดของหน้า",
+       "rcfilters-filter-previousrevision-label": "รุ่นก่อน",
+       "rcfilters-filter-previousrevision-description": "การปรับปรุงทั้งหมดที่ไม่ใช่การปรับปรุงล่าสุดของหน้า",
        "rcnotefrom": "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$3, $4</strong> (แสดงมากสุด <strong>$1</strong>)",
+       "rclistfromreset": "กลับค่าเดิมของการเลือกวันที่",
        "rclistfrom": "แสดงการเปลี่ยนแปลงใหม่เริ่มตั้งแต่ $2, $3",
        "rcshowhideminor": "$1การแก้ไขเล็กน้อย",
        "rcshowhideminor-show": "แสดง",
        "rcshowhidecategorization": "$1การจัดหมวดหมู่หน้า",
        "rcshowhidecategorization-show": "แสดง",
        "rcshowhidecategorization-hide": "ซ่อน",
-       "rclinks": "แสดงการปรับปรุงล่าสุด $1 รายการ ในช่วง $2 วันที่ผ่านมา<br />$3",
+       "rclinks": "แสดงการปรับปรุงล่าสุด $1 รายการ ในช่วง $2 วันที่ผ่านมา",
        "diff": "ต่าง",
        "hist": "ประวัติ",
        "hide": "ซ่อน",
        "php-uploaddisabledtext": "ปิดการใช้งานการอัปโหลดไฟล์ในพีเอชพี\nกรุณาตรวจสอบการตั้งค่า file_uploads",
        "uploadscripted": "ไฟล์นี้มีโค้ดเอชทีเอ็มแอลหรือสคริปต์ ซึ่งอาจก่อให้การแปลคำสั่งของเบราว์เซอร์ผิดพลาด",
        "uploadscriptednamespace": "ไฟล์ SVG นี้มีเนมสเปซไม่ถูกต้อง \"<nowiki>$1</nowiki>\"",
+       "uploadinvalidxml": "ไม่สามารถตีความ XML ในไฟลืที่อัปโหลด",
        "uploadvirus": "ไฟล์นี้มีไวรัส! \nรายละเอียด: $1",
        "upload-source": "ไฟล์ต้นทาง",
        "sourcefilename": "ชื่อไฟล์ต้นทาง:",
        "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": "อัปโหลด",
        "upload-form-label-infoform-description": "คำอธิบาย",
        "upload-form-label-usage-title": "การใช้",
        "upload-form-label-usage-filename": "ชื่อไฟล์",
+       "upload-form-label-own-work": "นี่เป็นงานสร้างสรรค์ของฉันเอง",
        "upload-form-label-infoform-categories": "หมวดหมู่",
        "upload-form-label-infoform-date": "วันที่",
        "backend-fail-backup": "ไม่สามารถสำรองไฟล์ \"$1\"",
        "backend-fail-notexists": "ไม่มีไฟล์ $1",
+       "backend-fail-hashes": "ไม่สามารถดึง hash ของไฟล์ เพื่อใช้เปรียบเทียบ",
        "backend-fail-delete": "ไม่สามารถลบไฟล์ \"$1\"",
+       "backend-fail-describe": "ไม่สามารถเปลี่ยน metadata ของไฟล์ \"$1\"",
        "backend-fail-alreadyexists": "มีไฟล์ \"$1\" อยู่แล้ว",
        "backend-fail-store": "ไม่สามารถเก็บไฟล์ \"$1\" ที่ \"$2\" ได้",
        "backend-fail-copy": "ไม่สามารถคัดลอกไฟล์ \"$1\" ไปยัง \"$2\" ได้",
        "download": "ดาวน์โหลด",
        "unwatchedpages": "หน้าที่ไม่มีผู้เฝ้าดู",
        "listredirects": "รายการหน้าเปลี่ยนทาง",
+       "listduplicatedfiles": "รายการไฟล์ที่ซ้ำกัน",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] มีไฟล์ซ้ำ[[$3|{{PLURAL:$2|ไฟล์เดียว| $2 ไฟล์}}]].",
        "unusedtemplates": "แม่แบบไม่ได้ใช้",
        "unusedtemplatestext": "หน้านี้แสดงรายการหน้าทั้งหมดในเนมสเปซ {{ns:template}} ซึ่งไม่ได้ถูกรวมอยู่ในหน้าอื่น \nอย่าลืมตรวจสอบการเชื่อมโยงมายังแม่แบบอื่นก่อนลบ",
        "unusedtemplateswlh": "การเชื่อมโยงอื่น",
        "suppress": "ผู้ดูแลประวัติ",
        "querypage-disabled": "หน้าพิเศษนี้ถูกปิดใช้งานด้วยเหตุผลด้านสมรรถภาพ",
        "apihelp-no-such-module": "ไม่พบมอดูล \"$1\"",
+       "apisandbox-api-disabled": "ไซต์นี้ไม่เปิดใช้ API",
        "apisandbox-unfullscreen": "แสดงหน้า",
+       "apisandbox-submit": "ส่งคำขอ",
        "apisandbox-reset": "ล้าง",
        "apisandbox-retry": "ลองใหม่",
+       "apisandbox-loading": "กำลังดึงข้อมูลสำหรับ API module \"$1\"...",
+       "apisandbox-load-error": "เกิดความผิดพลาดขณะดึงข้อมูลสำหรับ API module \"$1\": $2",
+       "apisandbox-no-parameters": "ไม่มีตัวแปรใน API module นี้",
+       "apisandbox-helpurls": "ลิงก์วิธีใช้",
        "apisandbox-examples": "ตัวอย่าง",
+       "apisandbox-dynamic-parameters": "ตัวแปรเพิ่มเติม",
+       "apisandbox-dynamic-parameters-add-label": "เพิ่มตัวแปร:",
+       "apisandbox-dynamic-error-exists": "ชื่อตัวแปร",
+       "apisandbox-deprecated-parameters": "ตัวแปรที่ไม่แนะนำให้ใช้",
        "apisandbox-results": "ผลลัพธ์",
+       "apisandbox-sending-request": "กำลังส่งคำขอ API...",
+       "apisandbox-loading-results": "กำลังรับผลลัพธ์ของ API...",
        "apisandbox-request-url-label": "ขอ URL:",
+       "apisandbox-request-json-label": "คำขอในรูปแบบ JSON:",
+       "apisandbox-request-time": "ระยะเวลาที่คำขอใช้: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-alert-page": "ค่าข้อมูลในหน้านี้ไม่ถูกต้อง",
+       "apisandbox-alert-field": "ค่าของข้อมูลส่วนนี้ไม่ถูกต้อง",
+       "apisandbox-continue": "ดำเนินการต่อ",
+       "apisandbox-continue-clear": "ล้าง",
+       "apisandbox-param-limit": "ใส่ค่า <kbd>max</kbd> เพื่อใช้ ค่าสูงสุดของขีดจำกัด",
+       "apisandbox-multivalue-all-values": "$1 (ค่าทั้งหมด)",
        "booksources": "แหล่งหนังสือ",
        "booksources-search-legend": "ค้นหาแหล่งหนังสือ",
        "booksources-search": "ค้นหา",
        "categories-submit": "แสดง",
        "categoriespagetext": "{{PLURAL:$1|หมวดหมู่นี้|หมวดหมู่ต่อไปนี้}}มีหน้าหรือสื่อต่าง ๆ\n[[Special:UnusedCategories|หมวดหมู่ที่ไม่ได้ใช้]]จะไม่แสดงในที่นี้\nดูเพิ่มที่ [[Special:WantedCategories|หมวดหมู่ที่ต้องการ]]",
        "categoriesfrom": "แสดงหมวดหมู่เริ่มจาก:",
-       "deletedcontributions": "à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¹\80à¸\82ียà¸\99à¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89ที่ถูกลบ",
-       "deletedcontributions-title": "à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¹\80à¸\82ียà¸\99à¸\82อà¸\87à¸\9cูà¹\89à¹\83à¸\8aà¹\89ที่ถูกลบ",
+       "deletedcontributions": "à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¸\9cูà¹\89à¹\83à¸\8aà¹\80à¸\82ียà¸\99ที่ถูกลบ",
+       "deletedcontributions-title": "à¹\80รืà¹\88อà¸\87à¸\97ีà¹\88à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\80à¸\82ียà¸\99ที่ถูกลบ",
        "sp-deletedcontributions-contribs": "เรื่องที่เขียน",
        "linksearch": "ค้นหาลิงก์ภายนอก",
        "linksearch-pat": "รูปแบบการค้นหา:",
        "listgrouprights-namespaceprotection-header": "การจำกัดเนมสเปซ",
        "listgrouprights-namespaceprotection-namespace": "เนมสเปซ",
        "listgrouprights-namespaceprotection-restrictedto": "สิทธิอนุญาตให้ผู้ใช้แก้ไข",
+       "listgrants": "สิทธิแต่งตั้ง",
+       "listgrants-grant": "สิทธิแต่งตั้ง",
        "listgrants-rights": "สิทธิ",
        "trackingcategories": "หมวดหมู่ค้นหาและติดตาม",
        "trackingcategories-summary": "หน้านี้แสดงรายการหมวดหมู่ค้นหาและติดตามซึ่งซอฟต์แวร์มีเดียวิกิจัดการอัตโนมัติ สามารถเปลี่ยนชื่อเหล่านี้ได้โดยการเปลี่ยนสารระบบที่เกี่ยวข้องในเนมสเปซ {{ns:8}}",
        "trackingcategories-desc": "เกณฑ์การรวมหมวดหมู่",
        "noindex-category-desc": "โรบอตไม่สามารถทำดัชนีหน้านี้เพราะมีเมจิกเวิร์ด <code><nowiki>__NOINDEX__</nowiki></code> อยู่และอยู่ในเนมสเปซซึ่งอนุญาตตัวบ่งชี้นี้",
        "index-category-desc": "หน้านี้มี <code><nowiki>__INDEX__</nowiki></code> อยู่ (และอยู่ในเนมสเปซซึ่งอนุญาตตัวบ่งชี้นี้) ฉะนั้น โรบอตจึงทำดัชนี้ได้ ซึ่งปกติไม่สามารถทำได้",
+       "post-expand-template-inclusion-category-desc": "การแทนที่แม่แบบทั้งหมดทำให้ขนาดของหน้าใหญ่กว่า <code>$wgMaxArticleSize</code> จึงไม่มีการแทนที่แม่แบบบางตัว",
        "broken-file-category-desc": "หน้ามีลิงก์ไฟล์เสีย (ลิงก์เพื่อฝังตัวไฟล์เมื่อไม่มีไฟล์)",
        "hidden-category-category-desc": "หมวดหมู่นี้มี <code><nowiki>__HIDDENCAT__</nowiki></code> ในเนื้อหาหน้า ซึ่งป้องกันมิให้แสดงในกล่องลิงก์หมวดหมู่ในหน้าโดยปริยาย",
        "trackingcategories-nodesc": "ไม่มีคำอธิบาย",
        "enotif_body_intro_restored": "$2 กู้คืนหน้า $1 บน {{SITENAME}} เมื่อ $PAGEEDITDATE ดูรุ่นปัจจุบันที่ $3",
        "enotif_body_intro_changed": "$2 เปลี่ยนแปลงหน้า $1 บน {{SITENAME}} เมื่อ $PAGEEDITDATE ดูรุ่นปัจจุบันที่ $3",
        "enotif_lastvisited": "ดู $1 สำหรับการเปลี่ยนแปลงทั้งหมดตั้งแต่คุณเยี่ยมชมครั้งสุดท้าย",
-       "enotif_lastdiff": "à¸\94ู $1 à¹\80à¸\9eืà¹\88อà¸\94ูà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\99ีà¹\89",
+       "enotif_lastdiff": "à¹\80à¸\9eืà¹\88อà¸\94ูà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\99ีà¹\89 à¹\83หà¹\89à¸\94ู $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",
        "created": "ถูกสร้าง",
        "rollbacklinkcount": "ย้อนกลับฉุกเฉิน $1 การแก้ไข",
        "rollbacklinkcount-morethan": "ย้อนกลับฉุกเฉินกว่า $1 การแก้ไข",
        "rollbackfailed": "ย้อนกลับฉุกเฉินล้มเหลว",
+       "rollback-missingparam": "ในคำขอไม่มีตัวแปรที่ต้องการ",
+       "rollback-missingrevision": "ไม่สามารถดึงข้อมูลรุ่น",
        "cantrollback": "ไม่สามารถย้อนการแก้ไขได้ ผู้เขียนคนล่าสุดเป็นผู้เขียนคนเดียวของหน้านี้",
        "alreadyrolled": "ไม่สามารถย้อนกลับฉุกเฉินการแก้ไขสุดท้ายโดย [[User:$2|$2]] ([[User talk:$2|พูดคุย]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ในหน้า [[:$1]] มีผู้อื่นได้แก้ไขหรือย้อนกลับฉุกเฉินหน้านี้ไปก่อนแล้ว\n\nผู้แก้ไขล่าสุดของหน้านี้คือ [[User:$3|$3]] ([[User talk:$3|พูดคุย]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])",
        "editcomment": "คำอธิบายการแก้ไขคือ: <em>$1</em>",
        "undeleteviewlink": "ดู",
        "undeleteinvert": "กลับการเลือก",
        "undeletecomment": "เหตุผล:",
-       "undeletedrevisions": "กู้คืนการแก้ไข $1 รุ่นแล้ว",
-       "undeletedrevisions-files": "กู้คืน $1 รุ่นและ $2 ไฟล์แล้ว",
-       "undeletedfiles": "กู้คืน $1 ไฟล์แล้ว",
        "cannotundelete": "การกู้คืนล้มเหลว:\n$1",
        "undeletedpage": "<strong>กู้คืน $1 แล้ว</strong>\n\nดู[[Special:Log/delete|ปูมการลบ]] สำหรับบันทึกรายชื่อการลบและการกู้คืนล่าสุด",
        "undelete-header": "ดู [[Special:Log/delete|ปูมการลบ]] สำหรับหน้าที่ถูกลบล่าสุด",
        "previousdiff": "← การแก้ไขก่อนหน้า",
        "nextdiff": "การแก้ไขถัดไป →",
        "mediawarning": "'''คำเตือน''': ไฟล์รูปแบบนี้อาจมีโค้ดที่ไม่พึงประสงค์\nระบบของท่านอาจเสียหายอันเนื่องจากโค้ดทำงาน",
-       "imagemaxsize": "à¸\82à¸\99าà¸\94ภาà¸\9eà¸\97ีà¹\88à¸\88ำà¸\81ัà¸\94:<br />''(สำหรัà¸\9aหà¸\99à¹\89าอà¸\98ิà¸\9aายภาà¸\9e)''",
+       "imagemaxsize": "à¸\88ำà¸\81ัà¸\94à¸\82à¸\99าà¸\94รูà¸\9bภาà¸\9e:<br /><em>(สำหรัà¸\9aหà¸\99à¹\89าà¸\84ำอà¸\98ิà¸\9aายà¹\84à¸\9fลà¹\8c)</em>",
        "thumbsize": "ขนาดรูปย่อ:",
        "widthheightpage": "{{PLURAL:$3|หน้า|หน้า}} $1 × $2, $3",
        "file-info": "ขนาดไฟล์: $1, ชนิดไมม์: $2",
        "log-name-tag": "ปูมป้ายระบุ",
        "log-description-tag": "หน้านี้แสดงเมื่อผู้ใช้เพิ่มหรือลบ[[Special:Tags|ป้ายระบุ]]จากรุ่นแก้ไขหรือรายการปูมอันใดอันหนึ่ง ปูมนี้ไม่แสดงรายการการกระทำติดป้ายระบุเมื่อเกิดเป็นส่้วนหนึ่งของการแก้ไข การลบหรือการกระทำที่คล้ายกัน",
        "rightsnone": "(ไม่มี)",
-       "revdelete-summary": "คำอธิบายโดยย่อ",
        "feedback-adding": "เพิ่มคำติชมเข้าไปที่หน้า...",
        "feedback-bugcheck": "ยอดเยี่ยม! เพียงตรวจสอบว่าจุดบกพร่องนั้นมิใช่หนึ่งใน[$1 จุดบกพร่องที่ทราบแล้ว]",
        "feedback-bugnew": "ฉันตรวจสอบแล้ว รายงานจุดบกพร่องใหม่",
index 5d6b0b2..a156a1a 100644 (file)
@@ -10,7 +10,8 @@
                        "Runningfridgesrule",
                        "The Evil IP address",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "Çykgytlaryň aşagyny çyz:",
        "externaldberror": "Ýa tassyklama maglumat bazasynyň säwligi bar ýa-da öz ulanyjy hasabyňyzy täzelemegiňize rugsat berilmeýär.",
        "login": "Hasaba gir",
        "nav-login-createaccount": "Hasaba gir / Hasap döret",
-       "userlogin": "Hasaba gir / täze hasap aç",
-       "userloginnocreate": "Sessiýa aç",
        "logout": "Hasapdan çyk",
        "userlogout": "Hasapdan çyk",
        "notloggedin": "Hasaba girmänsiňiz",
-       "nologin": "Siziň heniz hasabyňyz ýokmy? '''$1'''",
-       "nologinlink": "Onda özüňize bir hasap ediniň",
        "createaccount": "Täze hasap aç",
-       "gotaccount": "Eýýäm hasap açdyňyzmy? '''$1'''.",
-       "gotaccountlink": "Onda giriberiň!",
-       "userlogin-resetlink": "Giriş maglumatlaryňyzy ýatdan çykardyňyzmy?",
        "createaccountmail": "e-poçta bilen",
-       "createaccountreason": "Sebäp:",
        "badretype": "Girizen parollaryňyz biri-birine gabat gelmeýär.",
        "userexists": "Girizen ulanyjy adyňyz ulanylýar.\nBaşga bir at saýlamagyňyzy haýyş edýäris.",
        "loginerror": "Hasaba girmekde säwlik",
        "anonpreviewwarning": "''Sessiýa açmadyňyz. Ýazdyrsaňyz, sahypanyň redaktirleme geçmişine IP adresiňiz ýazylar.''",
        "missingsummary": "'''Ýatlatma:''' Redaktirleme mazmunyny ýazmadyňyz.\nSahypany ýazdyr düwmesine ýene bir gezek bassaňyz, özgerdişiňiz mazmunsyz ýazdyrylar.",
        "missingcommenttext": "Aşakda teswir ýazmagyňyzy haýyş edýäris.",
-       "missingcommentheader": "'''Ýatladyjy:''' Bu teswir üçin tema/setirbaş görkezmediňiz. \nEger \"{{int:savearticle}}\" düwmesine gaýtadan bassaňyz, özgerdişiňiz temasyz/setirbaşsyz ýazdyrylar.",
+       "missingcommentheader": "'''Ýatladyjy:''' Bu teswir üçin tema/setirbaş görkezmediňiz. \nEger \"$1\" düwmesine gaýtadan bassaňyz, özgerdişiňiz temasyz/setirbaşsyz ýazdyrylar.",
        "summary-preview": "Deslapky synyň mazmuny:",
        "subject-preview": "Temanyň/adyň deslapky syny:",
        "blockedtitle": "Ulanyjy blokirlenen",
        "editingsection": "\"$1\" sahypasynda bölüm redaktirleýärsiňiz",
        "editingcomment": "$1 redaktirlenýär (täze bölüm)",
        "editconflict": "Özgerdiş çaknyşmasy: $1",
-       "explainconflict": "Siz bu sahypany redaktirleýärkäňiz başga biri ony üýtgedipdir.\nÝokardaky redaktirleme penjiresinde häzirki bar bolan tekst görkezilýär.\nSiziň üýtgeşmeleriňiz aşakdaky redaktirleme penjiresinde görkezilýär.\nÖz üýtgeşmeleriňizi bar bolan tekst bilen birleşdirmeli bolduňyz.\n\"{{int:savearticle}}\" düwmesine basanyňyzda '''diňe''' ýokardaky tekst ýazdyrylar.",
+       "explainconflict": "Siz bu sahypany redaktirleýärkäňiz başga biri ony üýtgedipdir.\nÝokardaky redaktirleme penjiresinde häzirki bar bolan tekst görkezilýär.\nSiziň üýtgeşmeleriňiz aşakdaky redaktirleme penjiresinde görkezilýär.\nÖz üýtgeşmeleriňizi bar bolan tekst bilen birleşdirmeli bolduňyz.\n\"$1\" düwmesine basanyňyzda '''diňe''' ýokardaky tekst ýazdyrylar.",
        "yourtext": "Siziň tekstiňiz",
        "storedversion": "Ýazdyrylan wersiýa",
        "nonunicodebrowser": "'''Duvduryş: Brauzeriňiz unicode kodirowkasyny goldamaýar.'''\nSahypalary howpsuz ýagdaýda rdaktirlemegiňiz şeýle aýlawly ýol bar: ASCII däl simwollar redaktirleme penjiresinde onaltylyk kodlar görnüşinde peýda bolar.",
        "saveprefs": "Ýazdyr",
        "restoreprefs": "Ähli gaýybana sazlamalary dikelt",
        "prefs-editing": "Redaktirleme",
-       "rows": "Hatarlar:",
-       "columns": "Sütünler:",
        "searchresultshead": "Gözleg",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Ownuk makala çykgydynyň</a> formaty üçin bosaga (baýt):",
        "stub-threshold-disabled": "Ýapyk",
        "userrights-reason": "Sebäp:",
        "userrights-no-interwiki": "Başga wikilerdäki ulanyjy hukuklaryny redaktirlemäge ygtyýaryňyz ýok.",
        "userrights-nodatabase": "$1 maglumat bazasy ýok ýa-da ol lokal däl.",
-       "userrights-nologin": "Ulanyjy hukuklaryny bermek üçin administrator hasaby bilen [[Special:UserLogin|sessiýa açmagyňyz]] zerurdyr.",
-       "userrights-notallowed": "Siziň hasabyňyzyň ulanyjy hukuklaryny bermäge ygtyýary ýok.",
        "userrights-changeable-col": "Üýtgedip bilýän toparlaryňyz",
        "userrights-unchangeable-col": "Üýtgedip bilmeýän toparlaryňyz",
        "group": "Topar:",
        "right-protect": "Gorag derejelerini üýtget we goragly sahypalary redaktirle",
        "right-editprotected": "Goragly sahypalary redaktirle (goragy kaskadlamazdan)",
        "right-editinterface": "Ulanyjy interfeýsini redaktirle",
-       "right-editusercssjs": "Başga ulanyjylaryň CSS we JS faýllaryny redaktirle",
        "right-editusercss": "Başga ulanyjylaryň CSS faýllaryny redaktirle",
        "right-edituserjs": "Başga ulanyjylaryň JS faýllaryny redaktirle",
        "right-rollback": "Belli bir sahypany redaktirlän iň soňky ulanyjynyň özgerdişlerini dessine öňki katdyna getir",
        "rcshowhideanons": "anonim ulanyjylary $1",
        "rcshowhidepatr": "patrullyk edilen özgerdişleri $1",
        "rcshowhidemine": "özgerdişlerimi $1",
-       "rclinks": "Soňky $2 günde edilen iň soňky $1 üýtgeşmäni görkez;<br /> $3",
+       "rclinks": "Soňky $2 günde edilen iň soňky $1 üýtgeşmäni görkez;",
        "diff": "tapawut",
        "hist": "taryh",
        "hide": "Gizle",
        "undeleteviewlink": "gör",
        "undeleteinvert": "Saýlanmadyklar",
        "undeletecomment": "Sebäp:",
-       "undeletedrevisions": "{{PLURAL:$1|1 wersiýa|$1 wersiýa}} dikeldildi",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 wersiýa|$1 wersiýa}} we {{PLURAL:$2|1 faýl|$2 faýl}} dikeldildi",
-       "undeletedfiles": "{{PLURAL:$1|1 faýl|$1 faýl}} dikeldildi",
        "cannotundelete": "Yzyna dikeltmeklik başa barmady;\nkimdir biri eýýäm sahypany yzyna dikelden bolmagy ahmal.",
        "undeletedpage": "'''$1 yzyna dikeldildi'''\n\nÝaňy-ýakyndaky öçürmeleriň we dikeltmeleriň ýazgysy üçin [[Special:Log/delete|öçürme gündeligine]] serediň.",
        "undelete-header": "Ýaňy-ýakynda öçürilen sahypalary görmek üçin [[Special:Log/delete|öçürme gündeligine]] serediň.",
        "revdelete-restricted": "administratorlara goýlan çäklendirmeler",
        "revdelete-unrestricted": "administratorlardan aýyrylan çäklendirmeler",
        "rightsnone": "(hiç biri)",
-       "revdelete-summary": "özgerdiş mazmuny",
        "searchsuggest-search": "Gözleg",
        "searchsuggest-containing": "öz içine alýar...",
        "expandtemplates": "Şablonlary giňelt",
index 30fe744..2ea966a 100644 (file)
@@ -18,7 +18,9 @@
                        "Macofe",
                        "Matma Rex",
                        "Stranger195",
-                       "Emem.calist"
+                       "Emem.calist",
+                       "Asmen",
+                       "MJPCubelo"
                ]
        },
        "tog-underline": "Pagsasalungguhit ng link:",
@@ -36,6 +38,7 @@
        "tog-watchdefault": "Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang binago ko",
        "tog-watchmoves": "Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang inilipat ko",
        "tog-watchdeletion": "Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang binura ko",
+       "tog-watchuploads": "Magdagdag ng mga bagong file sa aking mga sinusubaybayang listahan.",
        "tog-watchrollback": "Magdagdag ng mga pahina kung saan ako nag-rollback sa aking bantayan",
        "tog-minordefault": "Markahan ang lahat ng pagbabago bilang maliit nang nakatakda",
        "tog-previewontop": "Ipakita ang paunang tingin bago ang kahon ng pagbabago",
@@ -62,7 +65,7 @@
        "tog-showhiddencats": "Ipakita ang mga nakatagong kategorya",
        "tog-norollbackdiff": "Alisin ang mga pagkakaiba pagkatapos isagawa ang pagpapagulong na pabalik sa dati",
        "tog-useeditwarning": "Magbabala sa akin kapag umalis ako sa isang pahina ng pampatnugot na hindi pa nasasagip ang mga pagbabago",
-       "tog-prefershttps": "Laging gamitin ang isang matibay na koneksiyon kapag naka-login",
+       "tog-prefershttps": "Laging gamitin ang isang walang panganib na koneksiyon kapag naka-login",
        "underline-always": "Palagi",
        "underline-never": "Hindi magpakailanman",
        "underline-default": "Tinakda ng pambasa-basa o balat",
        "newwindow": "(magbubukas sa bagong window)",
        "cancel": "Kanselahin",
        "moredotdotdot": "Damihan pa...",
-       "morenotlisted": "Hindi kumpleto ang talang ito.",
+       "morenotlisted": "Maaring hindi kumpleto ang talang ito.",
        "mypage": "Pahina ko",
        "mytalk": "Usapan",
        "anontalk": "Usapan",
        "externaldberror": "Maaaring may kamalian sa pagpapatotoo ng database o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na account.",
        "login": "Lumagda",
        "nav-login-createaccount": "Lumagda / lumikha ng account",
-       "userlogin": "Lumagda / lumikha ng account",
-       "userloginnocreate": "Lumagda",
        "logout": "Umalis sa pagkaka-login",
        "userlogout": "Umalis sa pagkaka-login",
        "notloggedin": "Hindi naka-login",
        "userlogin-noaccount": "Wala ka pa bang account?",
        "userlogin-joinproject": "Sumali sa {{SITENAME}}",
-       "nologin": "Wala ka pang account? $1.",
-       "nologinlink": "Lumikha ng account",
        "createaccount": "Lumikha ng account",
-       "gotaccount": "May account ka na ba? $1.",
-       "gotaccountlink": "Lumagda",
-       "userlogin-resetlink": "Nakalimutan mo ang iyong mga detalyeng pang-login?",
        "userlogin-resetpassword-link": "Nakalimutan ba ang iyong password?",
        "userlogin-helplink2": "Tulong sa pag-login",
        "userlogin-loggedin": "Naka-login ka na bilang {{GENDER:$1|$1}}. Gamitin ang form sa ibaba upang maka-login bilang ibang tagagamit o user.",
        "createacct-another-email-ph": "Ipasok ang email address",
        "createaccountmail": "Gumamit ng pansamantalang random na password at ipadala ito sa email na nakasaad sa ibaba",
        "createacct-realname": "Tunay na pangalan (maaaring wala)",
-       "createaccountreason": "Dahilan:",
        "createacct-reason": "Dahilan",
        "createacct-reason-ph": "Bakit ka gagawa ng isa pang account?",
        "createacct-submit": "Likhain ang iyong account",
        "anonpreviewwarning": "''Hindi ka nakalagda.  Itatala sa inyong pagtatala ang inyong direksiyong IP sa kasaysayan ng pagbabago ng pahinang ito.''",
        "missingsummary": "'''Paalala:''' Hindi ka nagbigay ng buod ng pagbabago.\nKapag pinindot mo uli ang Sagip, masasagip ang pagbabago mo na wala nito.",
        "missingcommenttext": "Magbigay ng isang kumento/puna sa ibaba.",
-       "missingcommentheader": "'''Paalala:''' Hindi ka nagbigay ng isang paksa/paulo para sa punang ito.\nKapag pinindot mo uli ang \"{{int:savearticle}}\", masasagip ang pagbabago mo na wala nito.",
+       "missingcommentheader": "'''Paalala:''' Hindi ka nagbigay ng isang paksa/paulo para sa punang ito.\nKapag pinindot mo uli ang \"$1\", masasagip ang pagbabago mo na wala nito.",
        "summary-preview": "Paunang tingin sa buod:",
        "subject-preview": "Paunang tingin sa paksa/paulo:",
        "blockedtitle": "Hinarang ang tagagamit",
        "editingsection": "Binabago ang $1 (bahagi)",
        "editingcomment": "Binabago ang $1 (bagong seksyon)",
        "editconflict": "Alitan sa pagbabago: $1",
-       "explainconflict": "Mayroon nagbago ng pahinang ito simula nang baguhin mo ito.\nNaglalaman ang mga nasa taas na teksto ng mga pahinang teksto at kasalukuyang mayroon ito.\nIpinapakita sa ibabang teksto ang mga binago mo.\nKailangan mong pagsamahin ang mga binago mo sa kasalukuyang teksto.\nMaitatala '''lamang''' ang nasa taas na teksto kapag pinindot ang \"{{int:savearticle}}\".",
+       "explainconflict": "Mayroon nagbago ng pahinang ito simula nang baguhin mo ito.\nNaglalaman ang mga nasa taas na teksto ng mga pahinang teksto at kasalukuyang mayroon ito.\nIpinapakita sa ibabang teksto ang mga binago mo.\nKailangan mong pagsamahin ang mga binago mo sa kasalukuyang teksto.\nMaitatala '''lamang''' ang nasa taas na teksto kapag pinindot ang \"$1\".",
        "yourtext": "Teksto mo",
        "storedversion": "Nakatagong rebisyon",
        "nonunicodebrowser": "'''Babala: Hindi sumusunod sa unicode ang browser mo.'''\nMay ginawang solusyon para pahintulutan kang magbago ng mga pahina nang ligtas: ang mga 'di-ASCII na karakter ay magpapakita sa kahon ng pagbabago bilang mga kodigong heksadesimal.",
        "post-expand-template-argument-warning": "Babala: Naglalamang ang pahinang ito ng kahit isang pagaalitan ng padron na napakalaki ng sukat ng paglawak.  Tinanggal ang mga alitang ito.",
        "post-expand-template-argument-category": "Mga pahinang naglalaman ng mga tinanggal na mga alitan ng padron",
        "parser-template-loop-warning": "Nadiskubreng silo ng suleras: [[$1]]",
+       "template-loop-category-desc": "Ang pahina ay naglalaman ng kodigong-makapanguulit, halimbawa. Isang kodigo na magpapahiwatig sa sarili ng paguulit.",
        "parser-template-recursion-depth-warning": "Lumabis na sa nakatakdang lalim ng rekursyon (pormula) ng suleras ($1)",
        "language-converter-depth-warning": "Lumampas sa ($1) ang hangganan ng lalim ng pampalit ng wika",
        "node-count-exceeded-category": "Mga pahina kung saan nalampasan ang bilang ng buko",
        "right-protect": "Baguhin ang mga antas ng panananggalang at baguhin ang mga pahinang nakasanggalang",
        "right-editprotected": "Baguhin ang mga pahinang nakasanggalang (walang baita-baitang na panananggalang)",
        "right-editinterface": "Baguhin ang ugnayang-hangganan ng tagagamit",
-       "right-editusercssjs": "Baguhin ang mga talaksang CSS at JS ng ibang mga tagagamit",
        "right-editusercss": "Baguhin ang mga talaksang CSS ng ibang mga tagagamit",
        "right-edituserjs": "Baguhin ang mga talaksang JS ng ibang mga tagagamit",
        "right-rollback": "Mabilisang pagulungin pabalik sa dati ang mga pagbabago ng huling tagagamit na nagbago ng isang partikular na pahina",
        "recentchanges-label-plusminus": "Nagbago ang laki ng pahina sa ganitong bilang ng mga byte",
        "recentchanges-legend-heading": "<strong>Gabay:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (tingnan din [[Special:NewPages|ang talaan ng mga bagong pahina]])",
+       "rcfilters-quickfilters": "Mga mabilisang kawing",
+       "rcfilters-savedqueries-rename": "Pangalanang muli",
+       "rcfilters-savedqueries-remove": "Alisin",
+       "rcfilters-savedqueries-new-name-label": "Pangalan",
+       "rcfilters-savedqueries-cancel-label": "Balewalain",
        "rcfilters-restore-default-filters": "Ibalik ang mga napagkaukulang 'filters'",
        "rcfilters-clear-all-filters": "Burahin lahat ng mga 'filters'",
        "rcfilters-empty-filter": "Walang aktibong panangga. Lahat ay ipinamalas.",
        "rcshowhidemine": "$1 ang mga pagbabago ko",
        "rcshowhidemine-show": "Ipakita",
        "rcshowhidemine-hide": "Itago",
-       "rclinks": "Ipakita ang huling $1 mga pagbabago sa loob ng huling $2 mga araw<br />$3",
+       "rclinks": "Ipakita ang huling $1 mga pagbabago sa loob ng huling $2 mga araw",
        "diff": "pagkakaiba",
        "hist": "kasaysayan",
        "hide": "Itago",
        "undeleteviewlink": "tingnan",
        "undeleteinvert": "Baligtarin ang pagpili/pilian",
        "undeletecomment": "Dahilan:",
-       "undeletedrevisions": "{{PLURAL:$1|1 pagbabago|$1 mga pagbabagong}} naibalik na",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 pagbabago|$1 mga pagbabago}} at {{PLURAL:$2|1 talaksang|$2 mga talaksang}} naibalik na",
-       "undeletedfiles": "{{PLURAL:$1|1 talaksang|$1 mga talaksang}} naibalik na",
        "cannotundelete": "Hindi matagumpay ang pagpapabalik mula sa pagkakabura; maaaring may isang nakauna na sa pagpapabalik ng pahina mula sa pagkakabura.",
        "undeletedpage": "'''Naibalik na ang $1'''\n\nTingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa isang talaan ng mga kamakailan lamang na mga pagbubura at mga pagbabalik mula sa pagkakabura.",
        "undelete-header": "Tingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa kamakailan lamang na  binura/naburang mga pahina.",
        "confirmrecreate-noreason": "Binura ng tagagamit na si [[User:$1|$1]] ([[User talk:$1|talk]]) ang pahinang ito pagkaraang simulan mo ang pagbago.  Mangyaring tiyakan na nais mo talagang muling likhain ang pahinang ito.",
        "recreate": "Likhain muli",
        "unit-pixel": "px",
+       "confirm-purge-title": "Paglilinis ng pahina",
        "confirm_purge_button": "Sige/Ayos 'yan/Okey",
        "confirm-purge-top": "Linisin/hawiin ang taguan ng pahinang ito?",
        "confirm-purge-bottom": "Nililinis ng pagdadalisay ng isang pahina ang taguan at mapipilitang palitawin ang pinakapangkasalukuyang bersyon.",
        "hebrew-calendar-m6": "Adar",
        "hebrew-calendar-m6a": "Adar I",
        "hebrew-calendar-m6b": "Adar II",
-       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m7": "Nisane",
        "hebrew-calendar-m8": "Iyar",
        "hebrew-calendar-m9": "Sivan",
        "hebrew-calendar-m10": "Tamuz",
        "hebrew-calendar-m6-gen": "Adar",
        "hebrew-calendar-m6a-gen": "Adar I",
        "hebrew-calendar-m6b-gen": "Adar II",
-       "hebrew-calendar-m7-gen": "Nisan",
+       "hebrew-calendar-m7-gen": "Nisane",
        "hebrew-calendar-m8-gen": "Iyar",
        "hebrew-calendar-m9-gen": "Sivan",
        "hebrew-calendar-m10-gen": "Tamuz",
        "logentry-newusers-autocreate": "Automatikong {{GENDER:$2|inilikha}} ang account ng tagagamit na $1",
        "logentry-upload-upload": "{{GENDER:$2|Ikinarga}} ni $1 ang $3",
        "rightsnone": "(wala)",
-       "revdelete-summary": "buod ng pagbabago",
        "feedback-adding": "Idinaragdag ang pakaing-tugon sa pahina...",
        "feedback-back": "Magbalik",
        "feedback-bugcheck": "Mahusay! Suriin lang na hindi pa ito isa sa [$1 nalalamang mga depekto].",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
        "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
-       "randomrootpage": "Alin mang pinag-ugatang/pinagmulang pahina"
+       "date-range-from": "Mula sa petsang:",
+       "randomrootpage": "Alin mang pinag-ugatang/pinagmulang pahina",
+       "gotointerwiki-invalid": "Di-wasto ang tinukoy na pamagat."
 }
index b9f1bc2..ab7005d 100644 (file)
        "yourpasswordagain": "Пароли сәнибәтон гырдә карде:",
        "login": "Ыштәни едаштеј",
        "nav-login-createaccount": "Ыштәни едаштеј / ыштәни ғејд кардовнијеј",
-       "userlogin": "Ыштәни едаштеј / ыштәни ғејд кардовнијеј",
-       "userloginnocreate": "Ыштәни едаштеј",
        "logout": "Системәдә кој орохнијеј",
        "userlogout": "Системәдә кој орохнијеј",
        "notloggedin": "Ыштәни едаштәнијоне",
-       "nologin": "Иштирок кардәкәси сәһифә ни? '''$1'''.",
-       "nologinlink": "Иштирокәкә сәһифә офәје",
        "createaccount": "Нујә иштирокәкә ғејд кардеј",
-       "gotaccount": "Шымә ыштәни ғејд кардәјоне? $1.",
-       "gotaccountlink": "Ыштәни едаштеј",
-       "userlogin-resetlink": "Бә системә дәше мәлумоти јодәдә бекардәјоне?",
        "createaccountmail": "бә е-номә",
-       "createaccountreason": "Сәбәб:",
        "mailmypassword": "Нујә парол вығандеј бә Е-номә.",
        "loginlanguagelabel": "Зывон: $1",
        "pt-login": "Dəşi",
        "prefs-changeemail": "Е-номә дәгиш кардеј",
        "prefs-email": "Е-номә кукон",
        "saveprefs": "Огәтеј",
-       "rows": "Сәтырон:",
        "searchresultshead": "Нәве",
        "timezoneregion-america": "Америка",
        "timezoneregion-europe": "Авропа",
        "rcshowhideanons": "$1 әнәномә иштирокәкон",
        "rcshowhidepatr": "$1 осә кардә быә дәгишон",
        "rcshowhidemine": "$1 ыштә дәгишон",
-       "rclinks": "Нишо дој охонә $1 дәгишон бә охонәни $2 ружон<br />$3",
+       "rclinks": "Нишо дој охонә $1 дәгишон бә охонәни $2 ружон",
        "diff": "фәрғ.",
        "hist": "тарых",
        "hide": "Нијо кардеј",
index 812e34d..9c77dc6 100644 (file)
        "yourdomainname": "ho ngāueʻanga",
        "login": "Kau ki ai",
        "nav-login-createaccount": "Kau ki ai",
-       "userlogin": "Kau ki ai",
        "logout": "ʻAlu mamaʻo",
        "userlogout": "ʻAlu mamaʻo",
        "notloggedin": "ʻIkai kau-ki-ai",
-       "nologin": "Teʻeki maʻu haʻo tohi-kau-ki-ai? '''$1'''.",
-       "nologinlink": "Fakatupu hoʻo tohi-kau-ki-ai",
        "createaccount": "Fakatupu ʻa e tohi-kau-ki-ai",
-       "gotaccount": "ʻOsi maʻu ʻa e tohi-kau-ki-ai? '''$1'''.",
-       "gotaccountlink": "Kau ki ai",
        "createaccountmail": "ʻi he tohila",
        "badretype": "ʻOku kehe hoʻo ongo leatapu.",
        "loginerror": "Halaʻi kau-ki-ai",
        "editingsection": "ʻOku fatuʻi $1 (vahe)",
        "editingcomment": "ʻOku fatuʻi $1 (fakamatala foʻou)",
        "editconflict": "Fepaki fatu: $1",
-       "explainconflict": "Naʻe liliu ʻa e pēsí ni ʻe he ʻetita ʻe taha lolotonga he taimi kuo ke kamata hoʻo fatu.\nKo e konga ʻi olunga, ko e kupu ia he onopooni.\nKo e konga ʻi lalo, ko hoʻo ngaahi liliu ia.\nʻE pau te ke fakataha hoʻo liliu ʻi loto ʻo e kupu ʻoku tuʻu.\nKo e konga ʻi olunga, ko e '''konga pē ʻe taha''' ʻe haofaki ʻi he lomiʻi ʻo e meʻalolomi \"{{int:savearticle}}\".",
+       "explainconflict": "Naʻe liliu ʻa e pēsí ni ʻe he ʻetita ʻe taha lolotonga he taimi kuo ke kamata hoʻo fatu.\nKo e konga ʻi olunga, ko e kupu ia he onopooni.\nKo e konga ʻi lalo, ko hoʻo ngaahi liliu ia.\nʻE pau te ke fakataha hoʻo liliu ʻi loto ʻo e kupu ʻoku tuʻu.\nKo e konga ʻi olunga, ko e '''konga pē ʻe taha''' ʻe haofaki ʻi he lomiʻi ʻo e meʻalolomi \"$1\".",
        "yourtext": "tohi ʻaʻau",
        "storedversion": "Ko e paaki kuo tuku",
        "editingold": "'''FAKATOKANGA: ʻOku ke fatu ʻi he paaki fakaonoʻaho ʻo e pēsi. Kapau te ke haofaki ia, ʻe mole ʻa e ngaahi liliu kotoa talu mei ai.'''",
        "prefs-misc": "Kehekehe",
        "saveprefs": "Haofaki",
        "prefs-editing": "ʻOku fatu",
-       "rows": "Ngaahi ʻotu:",
-       "columns": "Vahaʻa laini:",
        "searchresultshead": "Kumi",
        "recentchangescount": "Ngaahi ʻuluʻitohi ʻoku ʻasi ʻi he toki liliu, hisitōlia peesi, mo e hokohoko:",
        "savedprefs": "Kuo haofaki hoʻo faʻiteliha.",
        "rcshowhideliu": "$1 kau ʻetita ʻoku kau-ki-ai",
        "rcshowhideanons": "$1 kau ʻetita taʻehingoa",
        "rcshowhidemine": "$1 fatu ʻaʻaku",
-       "rclinks": "ʻAsi mai ha liliu ʻe $1 lolotonga ha ʻaho ʻe $2 fakamuimui<br />$3",
+       "rclinks": "ʻAsi mai ha liliu ʻe $1 lolotonga ha ʻaho ʻe $2 fakamuimui",
        "diff": "kehe",
        "hist": "hisi",
        "hide": "Toi",
        "undeletebtn": "Fakafoki",
        "undeletelink": "fakafoki",
        "undeletecomment": "Fakamatala:",
-       "undeletedrevisions": "Kuo fakafoki ʻa e paaki ʻe $1",
-       "undeletedfiles": "Kuo fakafoki ʻa e faile ʻe $1",
        "cannotundelete": "Naʻe movete ʻa e taʻetāmateʻi; mahalo pē kuo taʻetāmateʻi ʻuluaki ia ʻe he ʻetita kehe.",
        "undeletedpage": "'''Kuo fakafoki ko e $1'''\n\nVakai ki he [[Special:Log/delete|hokohoko tāmateʻi]] ki he lekooti ʻo e ngaahi tāmateʻi mo e taʻetāmateʻi onopooni.",
        "namespace": "Vā hingoa:",
index 1b2cb44..ba31f03 100644 (file)
                        "Superyetkin",
                        "Alikaan",
                        "By erdo can",
-                       "1917 Ekim Devrimi"
+                       "1917 Ekim Devrimi",
+                       "Asmen",
+                       "Stephanecbisson",
+                       "Alerque",
+                       "Bulgu"
                ]
        },
        "tog-underline": "Bağlantıların altını çizme:",
        "tog-hideminor": "Son değişiklikler sayfasında küçük düzenlemeleri gizle",
-       "tog-hidepatrolled": "Son değişikliklerdeki devriyenin gördüğü düzenlemeleri gizle",
+       "tog-hidepatrolled": "Son değişiklikler sayfasında devriyenin gördüğü düzenlemeleri gizle",
        "tog-newpageshidepatrolled": "Yeni sayfalar listesinde devriyenin gördüğü sayfaları gizle",
        "tog-hidecategorization": "Sayfa kategorilendirmesini gizle",
        "tog-extendwatchlist": "İzleme listesini sadece en son değil, tüm değişiklikleri gösterecek şekilde genişlet",
        "tog-watchdeletion": "Sildiğim sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchuploads": "Yüklediğim yeni dosyaları izleme listeme ekle",
        "tog-watchrollback": "Eski hâline getirdiğim sayfaları izleme listeme ekle",
-       "tog-minordefault": "Varsayılan olarak, bütün düzenlemeleri küçük düzenleme olarak işaretle",
-       "tog-previewontop": "Ön izlemeyi, düzenleme kutusunun öncesinde göster",
-       "tog-previewonfirst": "İlk düzenlemede ön izlemeyi göster",
+       "tog-minordefault": "Tüm düzenlemeleri varsayılan olarak küçük düzenleme olarak işaretle",
+       "tog-previewontop": "Düzenleme kutusu öncesinde önizleme göster",
+       "tog-previewonfirst": "İlk düzenlemede önizleme göster",
        "tog-enotifwatchlistpages": "İzleme listemdeki bir sayfa veya dosya değiştirilirse bana e-posta gönder",
        "tog-enotifusertalkpages": "Kullanıcı mesaj sayfamda değişiklik olduğunda bana e-posta gönder",
-       "tog-enotifminoredits": "Sayfalardaki ve dosyalardaki küçük değişikliklerde de bana e-posta gönder",
-       "tog-enotifrevealaddr": "Bildirim postalarında benim eposta adresimi açıkça göster",
+       "tog-enotifminoredits": "Sayfalardaki ve dosyalardaki küçük düzenlemelerde de bana e-posta gönder",
+       "tog-enotifrevealaddr": "Bildirim e-postalarında e-posta adresimi açıkça göster",
        "tog-shownumberswatching": "İzleyen kullanıcı sayısını göster",
        "tog-oldsig": "Mevcut imzanız:",
-       "tog-fancysig": "İmzaya vikimetin muamelesi yap (otomatik bir bağlantı olmadan)",
-       "tog-uselivepreview": "Canlı ön izlemeyi kullan",
-       "tog-forceeditsummary": "Özeti boş bıraktığımda beni uyar",
-       "tog-watchlisthideown": "İzleme listemde benim değişkliklerimi gizle",
-       "tog-watchlisthidebots": "İzleme listemde bot değişikliklerini gizle",
-       "tog-watchlisthideminor": "İzleme listemde küçük değişiklikleri gizle",
-       "tog-watchlisthideliu": "İzleme listemde, kayıtlı kullanıcılar tarafından yapılan değişiklikleri gizle",
-       "tog-watchlistreloadautomatically": "Filtre değiştiğinde izleme listesini otomatik yenile (JavaScript gerekir)",
-       "tog-watchlisthideanons": "İzleme listemde, anonim kullanıcılar tarafından yapılan değişiklikleri gizle",
-       "tog-watchlisthidepatrolled": "İzleme listesinde, devriye görmüş değişiklikleri gizle",
+       "tog-fancysig": "İmzayı viki metni olarak (otomatik bağlantı olmadan) işle",
+       "tog-uselivepreview": "Canlı önizleme kullan",
+       "tog-forceeditsummary": "Boş bir düzenleme özeti girdiğimde bana sor",
+       "tog-watchlisthideown": "Düzenlemelerimi izleme listesinde gizle",
+       "tog-watchlisthidebots": "Bot düzenlemelerini izleme listesinde gizle",
+       "tog-watchlisthideminor": "Küçük düzenlemeleri izleme listesinde gizle",
+       "tog-watchlisthideliu": "Oturum açmış kullanıcıların düzenlemelerini izleme listesinde gizle",
+       "tog-watchlistreloadautomatically": "Her süzgeç değişikliği olduğunda izleme listesini otomatik olarak yeniden yükle (JavaScript gerekir)",
+       "tog-watchlisthideanons": "Anonim kullanıcıların düzenlemelerini izleme listesinde gizle",
+       "tog-watchlisthidepatrolled": "Devriyenin gördüğü düzenlemeleri izleme listesinde gizle",
        "tog-watchlisthidecategorization": "Sayfa kategorilendirmesini gizle",
-       "tog-ccmeonemails": "Diğer kullanıcılara gönderdiğim e-postaların bir kopyasını bana da gönder",
-       "tog-diffonly": "Sayfa içeriğini, sürüm farklarının altında gösterme",
+       "tog-ccmeonemails": "Diğer kullanıcılara gönderdiğim e-postaların kopyalarını bana gönder",
+       "tog-diffonly": "Farkların altında sayfa içeriğini gösterme",
        "tog-showhiddencats": "Gizli kategorileri göster",
-       "tog-norollbackdiff": "Geri döndürme uygulandıktan sonra farkları gösterme",
-       "tog-useeditwarning": "Yaptığım değişiklikleri kaydetmeden sayfayı kapatırken beni uyar",
-       "tog-prefershttps": "Oturum açarken her zaman güvenli bağlantı kullanın",
-       "underline-always": "Daima",
-       "underline-never": "Asla",
-       "underline-default": "Tema ya da tarayıcı varsayılanı",
-       "editfont-style": "Düzenleme alanının yazı tipi:",
+       "tog-norollbackdiff": "Eski hâline getirdikten sonra farkı gösterme",
+       "tog-useeditwarning": "Bir düzenleme sayfasından değişiklikleri kaydetmeden ayrılırken beni uyar",
+       "tog-prefershttps": "Oturum açıkken her zaman güvenli bir bağlantı kullan",
+       "underline-always": "Her zaman",
+       "underline-never": "Hiçbir zaman",
+       "underline-default": "Görünüm ya da tarayıcı varsayılanı",
+       "editfont-style": "Düzenleme alanının yazı tipi biçemi:",
        "editfont-default": "Tarayıcı varsayılanı",
-       "editfont-monospace": "Sabit aralıklı yazı tipi",
-       "editfont-sansserif": "Çıkıntısız (Sans-serif) yazı tipi",
-       "editfont-serif": "Çıkıntılı (serif) yazı tipi",
+       "editfont-monospace": "Tek aralıklı yazı tipi",
+       "editfont-sansserif": "Sans-serif yazı tipi",
+       "editfont-serif": "Serif yazı tipi",
        "sunday": "Pazar",
        "monday": "Pazartesi",
        "tuesday": "Salı",
        "december-date": "$1 Aralık",
        "period-am": "ÖÖ",
        "period-pm": "ÖS",
-       "pagecategories": "{{PLURAL:$1|Kategori|Kategoriler}}",
+       "pagecategories": "$1 kategori",
        "category_header": "\"$1\" kategorisindeki sayfalar",
        "subcategories": "Alt kategoriler",
-       "category-media-header": "\"$1\" kategorisindeki dosyalar",
-       "category-empty": "<em>Bu kategoride henüz herhangi bir sayfa ya da dosya bulunmamaktadır.</em>",
-       "hidden-categories": "{{PLURAL:$1|Gizli kategori|Gizli kategoriler}}",
+       "category-media-header": "\"$1\" kategorisindeki ortamlar",
+       "category-empty": "<em>Şu anda bu kategoride herhangi bir sayfa ya da Ortam bulunmuyor.</em>",
+       "hidden-categories": "$1 gizli kategori",
        "hidden-category-category": "Gizli kategoriler",
-       "category-subcat-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki alt kategoriyi içermektedir.|Bu kategoride aşağıdaki {{PLURAL:$1|alt kategori|$1 alt kategori}} dahil $2 alt kategori vardır.}}",
-       "category-subcat-count-limited": "Bu kategori aşağıdaki {{PLURAL:$1|alt kategoriye|$1 alt kategoriye}} sahiptir.",
+       "category-subcat-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki alt kategoriyi içermektedir.|Bu kategoride aşağıdaki $1 alt kategori dâhil toplam $2 alt kategori vardır.}}",
+       "category-subcat-count-limited": "Bu kategori aşağıdaki $1 alt kategoriye sahiptir.",
        "category-article-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki sayfayı içermektedir.|Toplam $2 taneden, aşağıdaki {{PLURAL:$1|sayfa|$1 sayfa}} bu kategoridedir.}}",
        "category-article-count-limited": "Bu kategoride {{PLURAL:$1|sayfa|$1 sayfa}} bulunmaktadır.",
        "category-file-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki dosyayı içerir.|Toplam $2 taneden, aşağıdaki {{PLURAL:$1|dosya|$1 dosya}} bu kategoridedir.}}",
        "category-file-count-limited": "Aşağıdaki {{PLURAL:$1|dosya|$1 dosya}} bu kategoridedir.",
-       "listingcontinuesabbrev": "(devam)",
+       "listingcontinuesabbrev": "devam",
        "index-category": "Dizinlenmiş sayfalar",
        "noindex-category": "Dizinlenmemiş sayfalar",
        "broken-file-category": "Bozuk dosya bağlantıları içeren sayfalar",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Hakkında",
        "article": "İçerik sayfası",
-       "newwindow": "(yeni bir pencerede açılır)",
+       "newwindow": "(yeni pencerede açılır)",
        "cancel": "İptal",
        "moredotdotdot": "Dahası...",
        "morenotlisted": "Bu liste eksik olabilir.",
        "navigation": "Gezinti",
        "and": "&#32;ve",
        "qbfind": "Bul",
-       "qbbrowse": "Tara",
-       "qbedit": "Değiştir",
+       "qbbrowse": "Gözat",
+       "qbedit": "Düzenle",
        "qbpageoptions": "Bu sayfa",
        "qbmyoptions": "Sayfalarım",
        "faq": "SSS",
        "edit-local": "Yerel açıklamayı düzenle",
        "create": "Oluştur",
        "create-local": "Yerel açıklama ekle",
-       "editthispage": "Bu sayfayı değiştir",
+       "editthispage": "Bu sayfayı düzenle",
        "create-this-page": "Bu sayfayı oluştur",
        "delete": "Sil",
        "deletethispage": "Bu sayfayı sil",
        "unprotectthispage": "Bu sayfanın korumasını değiştir",
        "newpage": "Yeni sayfa",
        "talkpage": "Tartışma sayfası",
-       "talkpagelinktext": "Mesaj",
+       "talkpagelinktext": "mesaj",
        "specialpage": "Özel sayfa",
        "personaltools": "Kişisel araçlar",
        "articlepage": "İçerik sayfasını gör",
        "templatepage": "Şablon sayfasını görüntüle",
        "viewhelppage": "Yardım sayfasına görüntüle",
        "categorypage": "Kategori sayfasını görüntüle",
-       "viewtalkpage": "Tartışma sayfasını görüntüle",
+       "viewtalkpage": "Tartışmayı gör",
        "otherlanguages": "Diğer dillerde",
        "redirectedfrom": "($1 sayfasından yönlendirildi)",
        "redirectpagesub": "Yönlendirme sayfası",
        "redirectto": "Şuraya yönlendir:",
-       "lastmodifiedat": "Bu sayfa son olarak $1 tarihinde ve $2 saatinde güncellenmiştir.",
+       "lastmodifiedat": "Bu sayfa son olarak $1 tarihinde ve $2 saatinde düzenlenmiştir.",
        "viewcount": "Bu sayfaya {{PLURAL:$1|bir|$1}} defa erişilmiş.",
        "protectedpage": "Korumalı sayfa",
        "jumpto": "Şuraya atla:",
        "currentevents-url": "Project:Güncel olaylar",
        "disclaimers": "Sorumluluk reddi",
        "disclaimerpage": "Project:Genel sorumluluk reddi",
-       "edithelp": "Nasıl değiştirilir?",
+       "edithelp": "Düzenleme yardımı",
        "helppage-top-gethelp": "Yardım",
-       "mainpage": "Ana Sayfa",
-       "mainpage-description": "Ana sayfa",
-       "policy-url": "Project:İlkeler",
+       "mainpage": "Anasayfa",
+       "mainpage-description": "Anasayfa",
+       "policy-url": "Project:Politika",
        "portal": "Topluluk portali",
        "portal-url": "Project:Topluluk portali",
        "privacy": "Gizlilik politikası",
        "privacypage": "Project:Gizlilik Politikası",
        "badaccess": "İzin hatası",
        "badaccess-group0": "Bu işlemi yapma yetkiniz yok.",
-       "badaccess-groups": "Yapmak istediğiniz işlem, sadece {{PLURAL:$2|şu gruptaki|şu gruplardaki}} kullanıcılar tarafından yapılabilir: $1",
+       "badaccess-groups": "İstediğiniz işlem, $1 {{PLURAL:$2|grubundaki|gruplarındaki}} kullanıcılarla sınırlıdır.",
        "versionrequired": "MediaWiki'nin $1 sürümü gerekiyor",
        "versionrequiredtext": "Bu sayfayı kullanmak için MediaWiki'nin $1 sürümü gerekmektedir. [[Special:Version|Sürüm sayfasına]] bakınız.",
        "ok": "Tamam",
        "newmessageslinkplural": "{{PLURAL:$1|yeni mesajınız|yeni mesajlarınız}}",
        "newmessagesdifflinkplural": "son {{PLURAL:$1|değişiklik|değişiklik}}",
        "youhavenewmessagesmulti": "$1'de yeni mesajınız var",
-       "editsection": "değiştir",
-       "editold": "değiştir",
+       "editsection": "düzenle",
+       "editold": "düzenle",
        "viewsourceold": "kaynağı gör",
-       "editlink": "değiştir",
+       "editlink": "düzenle",
        "viewsourcelink": "kaynağı gör",
        "editsectionhint": "Değiştirilen bölüm: $1",
        "toc": "İçindekiler",
        "nstab-template": "Şablon",
        "nstab-help": "Yardım sayfası",
        "nstab-category": "Kategori",
-       "mainpage-nstab": "Ana sayfa",
+       "mainpage-nstab": "Anasayfa",
        "nosuchaction": "Böyle bir eylem yok",
        "nosuchactiontext": "URL tarafından tanımlanan eylem geçersiz.\nURL'yi yanlış yazmış olabilir, ya da doğru olmayan bir bağlantıyı takip etmiş olabilirsiniz.\nBu, {{SITENAME}} sitesindeki bir hatayı da belirtebilir.",
        "nosuchspecialpage": "Böyle bir özel sayfa yok",
        "unexpected": "beklenmeyen değer: \"$1\"=\"$2\".",
        "formerror": "Hata: Form gönderilemiyor.",
        "badarticleerror": "Bu işlem bu sayfada gerçekleştirilemez.",
-       "cannotdelete": "\"$1\" sayfa ya da dosyası silinemedi.\nBaşka bir kullanıcı tarafından zaten silinmiş olabilir.",
+       "cannotdelete": "\"$1\" adlı sayfa veya dosya silinemedi.\nBaşka bir kullanıcı tarafından daha önce silinmiş olabilir.",
        "cannotdelete-title": "\"$1\" sayfası silinemiyor",
        "delete-hook-aborted": "Silme işlemi uzantı kancası tarafından durduruldu. \nBir açıklama sunulmadı.",
        "no-null-revision": "\"$1\" sayfası için yeni boş bir sürüm oluşturulamadı",
        "login": "Oturum aç",
        "login-security": "Kimliğinizi doğrulayın",
        "nav-login-createaccount": "Oturum aç / hesap oluştur",
-       "userlogin": "Oturum aç / hesap oluştur",
-       "userloginnocreate": "Giriş yap",
        "logout": "Oturumu kapat",
        "userlogout": "Oturumu kapat",
        "notloggedin": "Oturum açık değil",
        "userlogin-noaccount": "Bir hesabınız yok mu?",
        "userlogin-joinproject": "{{SITENAME}} sitesine katılın",
-       "nologin": "Bir hesabınız yok mu? $1.",
-       "nologinlink": "Hesap oluşturun",
        "createaccount": "Hesap oluştur",
-       "gotaccount": "Zaten bir hesabınız var mı? $1.",
-       "gotaccountlink": "Oturum açın",
-       "userlogin-resetlink": "Giriş bilgilerinizi mi unuttunuz?",
        "userlogin-resetpassword-link": "Parolanızı mı unuttunuz?",
        "userlogin-helplink2": "Oturum açma konusunda yardım alın",
        "userlogin-loggedin": "Zaten {{GENDER:$1|$1}} olarak oturum açtınız.\nBaşka bir kullanıcı olarak oturum açmak için aşağıdaki formu kullanın.",
        "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-benefit-body1": "{{PLURAL:$1|düzenleme|düzenleme}}",
        "createacct-benefit-body2": "{{PLURAL:$1|madde|madde}}",
        "createacct-benefit-body3": "yakın zamanda {{PLURAL:$1|katkı yapan|katkı yapan}} kişi",
-       "badretype": "Girdiğiniz şifreler birbirleriyle uyuşmuyor.",
+       "badretype": "Girdiğiniz parolalar eşleşmiyor.",
        "usernameinprogress": "Bu kullanıcı adı için bir hesap oluşturma zaten sürüyor. Lütfen bekleyin.",
        "userexists": "Girdiğiniz kullanıcı adı zaten kullanımda.\nLütfen farklı bir kullanıcı adı seçiniz.",
        "loginerror": "Oturum açma hatası.",
        "wrongpassword": "Parolayı yanlış girdiniz. Lütfen tekrar deneyiniz.",
        "wrongpasswordempty": "Boş parola girdiniz. Lütfen tekrar deneyiniz.",
        "passwordtooshort": "Parolalar en az {{PLURAL:$1|1 karakter|$1 karakter}} uzunluğunda olmalı.",
-       "passwordtoolong": "Parolalar en az {{PLURAL:$1|1 karakter|$1 karakter}} uzunluğunda olmalı.",
+       "passwordtoolong": "Parolalar $1 karakterden uzun olamaz.",
        "passwordtoopopular": "Sıklıkla seçilen parolalar kullanılamaz. Lütfen daha özgün bir parola belirleyin.",
-       "password-name-match": "Şifreniz kullanıcı adınızdan farklı olmalıdır.",
-       "password-login-forbidden": "Bu kullanıcı adı ve şifre kullanımı yasaklanmıştır",
+       "password-name-match": "Parolanız kullanıcı adınızdan farklı olmalıdır.",
+       "password-login-forbidden": "Bu kullanıcı adı ve parolanın kullanımı yasaklanmıştır.",
        "mailmypassword": "Parolayı sıfırla",
-       "passwordremindertitle": "{{SITENAME}} için yeni geçici şifre",
+       "passwordremindertitle": "{{SITENAME}} için yeni geçici parola",
        "passwordremindertext": "Birisi (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için yeni bir parola gönderilmesi istedi. \"$2\" kullanıcısına geçici olarak \"$3\" parolası oluşturuldu. Eğer bu sizin isteğiniz ise, oturum açıp yeni bir parola oluşturmanız gerekmektedir. Geçici parolanızın süresi {{PLURAL:$5|1 gün|$5 gün}} içinde dolacaktır.\n\nParola değişimini siz istemediyseniz veya parolanızı hatırladıysanız ve artık parolanızı değiştirmek istemiyorsanız; bu mesajı önemsemeyerek eski parolanızı kullanmaya devam edebilirsiniz.",
        "noemail": "\"$1\" adlı kullanıcıya kayıtlı bir e-posta adresi yok.",
        "noemailcreate": "Geçerli bir e-posta adresi sağlamalısınız",
        "passwordsent": "\"$1\" adına kayıtlı e-posta adresine yeni bir parola gönderildi. Oturumu, lütfen, iletiyi aldıktan sonra açın.",
-       "blocked-mailpassword": "IP adresiniz düzenleme yapmaya engellenmiştir. Kötüye kullanımın önüne geçmek için söz konusu IP adresinden şifre kurtarmaya izin verilmemektedir.",
+       "blocked-mailpassword": "IP adresinizin düzenleme yapması engellenmiştir. Kötüye kullanımı önlemek için, bu IP adresinin parola kurtarmadan yararlanmasına izin verilmemektedir.",
        "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 $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.",
+       "acct_creation_throttle_hit": "Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler son $2 içinde $1 hesap oluşturdu ve 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.",
        "emaildisabled": "Bu siteden e-posta gönderemezsiniz.",
        "accountcreated": "Hesap açıldı",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|msj]])   için kullanıcı hesabı oluşturuldu.",
-       "createaccount-title": "{{SITENAME}} için yeni kullanıcı hesabı oluşturulması",
+       "createaccount-title": "{{SITENAME}} için hesap oluşturma",
        "createaccount-text": "Birisi {{SITENAME}} sitesinde ($4) sizin e-posta adresinizi kullarak, şifresi \"$3\" olan, \"$2\" isimli bir hesap oluşturdu.\n\nSiteye giriş yapmalı ve parolanızı değiştirmelisiniz.\n\nEğer kullanıcı hesabını yanlışlıkla oluşturmuş iseniz, bu mesajı yoksayabilirsiniz.",
-       "login-throttled": "Çok fazla yeni oturum açma girişiminde bulundunuz.\nDevam etmeden önce $1 bekleyin.",
+       "login-throttled": "Yakın zamanda çok fazla oturum açma girişiminde bulundunuz.\nLütfen yeniden denemeden önce $1 süreyle bekleyin.",
        "login-abort-generic": "Giriş başarısız - Durduruldu",
        "login-migrated-generic": "Hesabınız aktarılmış ve kullanıcı adınız artık bu vikide yok.",
        "loginlanguagelabel": "Dil: $1",
        "createacct-another-realname-tip": "Gerçek adınız isteğe bağlıdır.\nEğer gerçek adınızı belirtirseniz, çalışmalarınıza atıfta bulunulması için de kullanılacaktır.",
        "pt-login": "Giriş yap",
        "pt-login-button": "Oturum aç",
-       "pt-login-continue-button": "Oturum açmaya devam edin",
+       "pt-login-continue-button": "Oturum açmaya devam et",
        "pt-createaccount": "Hesap oluştur",
        "pt-userlogout": "Oturumu kapat",
-       "php-mail-error-unknown": "PHP's mail() fonksiyonunda bilinmeyen hata",
+       "php-mail-error-unknown": "PHP'nin mail() işlevinde bilinmeyen hata.",
        "user-mail-no-addy": "Bir e-posta adresi olmadan e-posta göndermeye çalıştı.",
        "user-mail-no-body": "Boş veya geçerli olmayan bir şekilde e-posta gönderilmeye çalışıldı.",
        "changepassword": "Parolayı değiştir",
        "resetpass_announce": "Girişinizi tamamlayabilmeniz için, yeni bir parola oluşturmanız gereklidir.",
        "resetpass_text": "<!-- Metini buraya ekleyin -->",
-       "resetpass_header": "Hesap şifresini değiştir",
+       "resetpass_header": "Hesap parolasını değiştir",
        "oldpassword": "Eski parola",
        "newpassword": "Yeni parola",
        "retypenew": "Yeni parolayı tekrar girin",
-       "resetpass_submit": "Şifreyi ayarlayın ve oturum açın",
+       "resetpass_submit": "Parola belirle ve oturum aç",
        "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": "Bot parolaları",
        "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",
-       "botpasswords-createnew": "Yeni bir bot şifresi oluştur",
-       "botpasswords-editexisting": "Mevcut bir bot şifresini düzenle",
+       "botpasswords-disabled": "Bot parolaları devre dışı.",
+       "botpasswords-no-central-id": "Bot parolaları kullanmak için, merkezi bir hesap ile oturum açmalısınız.",
+       "botpasswords-existing": "Mevcut bot parolaları",
+       "botpasswords-createnew": "Yeni bir bot parolası oluştur",
+       "botpasswords-editexisting": "Mevcut bir bot parolasını düzenle",
        "botpasswords-label-appid": "Bot ismi:",
        "botpasswords-label-create": "Oluştur",
        "botpasswords-label-update": "Güncelle",
        "botpasswords-label-cancel": "İptal",
        "botpasswords-label-delete": "Sil",
-       "botpasswords-label-resetpassword": "Şifreyi sıfırla",
+       "botpasswords-label-resetpassword": "Parolayı sıfırla",
        "botpasswords-label-grants": "Geçerli ayrıcalıklar:",
        "botpasswords-label-grants-column": "Verilen",
        "botpasswords-bad-appid": "Bot ismi \"$1\" geçerli değil.",
        "botpasswords-insert-failed": "Bot adı \"$1\" eklenemedi. Zaten eklenmiş olmalı?",
        "botpasswords-update-failed": "Bot ismini \"$1\" olarak güncelleme başarısız oldu. Silinmiş olabilir mi?",
-       "botpasswords-created-title": "Bot şifresi oluşturuldu.",
-       "botpasswords-created-body": "\"$2\" adlı kullanıcının \"$1\" isimli botu için şifre oluşturuldu.",
-       "botpasswords-updated-title": "Bot şifresi guncellendi",
-       "botpasswords-updated-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi güncellendi.",
-       "botpasswords-deleted-title": "Bot şifresi silindi.",
-       "botpasswords-deleted-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi silindi.",
+       "botpasswords-created-title": "Bot parolası oluşturuldu",
+       "botpasswords-created-body": "\"$2\" adlı kullanıcının \"$1\" adlı botu için bot parolası oluşturuldu.",
+       "botpasswords-updated-title": "Bot parolası güncellendi",
+       "botpasswords-updated-body": "\"$2\" adlı kullanıcının \"$1\" adlı botunun bot parolası güncellendi.",
+       "botpasswords-deleted-title": "Bot parolası silindi",
+       "botpasswords-deleted-body": "\"$2\" adlı kullanıcının \"$1\" adlı botunun bot parolası silindi.",
        "botpasswords-newpassword": "<strong>$1</strong> ile oturum açmak için yeni şifre: <strong>$2</strong>. <em>İlerde başvurmak için lütfen kaydedin.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider kullanılamaz.",
-       "botpasswords-restriction-failed": "Bot şifresi sınırlamaları oturum açmayı engelledi.",
-       "botpasswords-invalid-name": "Belirtilen kullanıcı adı bot şifresi ayırıcısını içermiyor (\"$1\").",
+       "botpasswords-restriction-failed": "Bot parolası kısıtlamaları bu oturum açma işlemini önlemektedir.",
+       "botpasswords-invalid-name": "Belirtilen kullanıcı adı bot parolası ayırıcısı içermiyor (\"$1\").",
        "resetpass_forbidden": "Parolalar değiştirilememektedir",
-       "resetpass_forbidden-reason": "Şifre değiştirilemedi: $1",
+       "resetpass_forbidden-reason": "Parolalar değiştirilemez: $1",
        "resetpass-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
        "resetpass-submit-loggedin": "Parolayı değiştir",
        "resetpass-submit-cancel": "İptal",
-       "resetpass-wrong-oldpass": "Geçersiz geçici veya güncel şifre.\nŞifrenizi zaten başarıyla değiştirdiniz ya da yeni bir geçici şifre istediniz.",
+       "resetpass-wrong-oldpass": "Geçersiz geçici veya güncel parola.\nParolanızı daha önce değiştirmiş veya yeni bir geçici parola istemiş olabilirsiniz.",
        "resetpass-recycled": "Lütfen parolanızı eski parolanızdan farklı olarak değiştirin.",
        "resetpass-temp-emailed": "E-postayla gönderilmiş geçici kodla giriş yaptınız. Oturum açmayı tamamlamak için yeni bir şifre belirlemeniz gerekiyor:",
        "resetpass-temp-password": "Geçici parola:",
        "preview": "Önizleme",
        "showpreview": "Önizlemeyi göster",
        "showdiff": "Değişiklikleri göster",
-       "blankarticle": "<strong>Uyarı:</strong> Oluşturduğunuz sayfa boş.\nEğer \"{{int:savearticle}}\" düğmesine tekrar tıklarsanız, sayfa içerik olmadan oluşturulacaktır.",
+       "blankarticle": "<strong>Uyarı:</strong> Oluşturduğunuz sayfa boş.\nEğer \"$1\" düğmesine tekrar tıklarsanız, sayfa içerik olmadan oluşturulacaktır.",
        "anoneditwarning": "<strong>Uyarı:</strong> Giriş yapmadınız. Herhangi bir değişiklik yapmanız durumunda IP adresiniz herkese gözükecektir. Eğer <strong>[$1 giriş yaparsanız]</strong> veya <strong>[$2 bir hesap oluşturursanız]</strong>, edineceğiniz çeşitli yararların yanı sıra yaptığınız değişiklikler de kullanıcı adınıza atfedilecektir.",
        "anonpreviewwarning": "''Giriş yapmadınız. Kaydederseniz, sayfanın değişiklik geçmişine IP adresiniz yazılır.''",
        "missingsummary": "'''Uyarı:''' Herhangi bir özet yazmadın.\nKaydet tuşuna tekrar basarsan sayfa özetsiz kaydedilecek.",
-       "selfredirect": "<strong>Uyarı:</strong> Bu sayfanın kendisine yönlendirme vardır.\nYönlendirme için yanlış hedef belirtmiş olabilirsiniz, ya da yanlış sayfa düzenlemeye çalışmış olabilirsiniz.\n\n\"{{int:savearticle}}\" sayfasına tıklayarak, yönlendirmeyi zaten oluşturabilirsiniz.",
+       "selfredirect": "<strong>Uyarı:</strong> Bu sayfanın kendisine yönlendirme vardır.\nYönlendirme için yanlış hedef belirtmiş olabilirsiniz, ya da yanlış sayfa düzenlemeye çalışmış olabilirsiniz.\n\n\"$1\" sayfasına tıklayarak, yönlendirmeyi zaten oluşturabilirsiniz.",
        "missingcommenttext": "Lütfen aşağıda bir açıklama yazınız.",
        "missingcommentheader": "<strong>Hatırlatma:</strong> Bu yorum için bir konu girmediniz.\nEğer \"{{int: savearticle}}\" tuşuna tekrar basarsanız, değişikliğiniz konu olmadan kaydedilecektir.",
        "summary-preview": "Değişiklik özeti ön izlemesi:",
        "token_suffix_mismatch": "'''Değişikliğiniz geri çevrildi çünkü alıcınız düzenleme kutucuğundaki noktalama işaretlerini bozdu.\nDeğişikliğiniz, sayfa metninde bozulmayı önlemek için geri çevrildi.\nEğer sorunlu bir web-tabanlı anonim proksi servisi kullanıyorsanız bu olay bazen gerçekleşebilir.'''",
        "edit_form_incomplete": "'''Değişiklik formu için bazı sunuculara erişilemedi; yaptığınız değişiklikler bozulmamıştır, gözden geçirip tekrar deneyiniz.'''",
        "editing": "\"$1\" sayfasını değiştirmektesiniz",
-       "creating": "Oluşturuluyor $1",
+       "creating": "$1 sayfasını oluşturuyorsunuz",
        "editingsection": "\"$1\" sayfasında bölüm değiştirmektesiniz",
-       "editingcomment": "$1 değiştiriliyor (yeni bölüm)",
+       "editingcomment": "$1 düzenleniyor (yeni bölüm)",
        "editconflict": "Değişiklik çakışması: $1",
-       "explainconflict": "Siz sayfayı değiştirirken başka biri de değişiklik yaptı.\nYukarıdaki yazı sayfanın şu anki halini göstermektedir.\nSizin değişiklikleriniz alta gösterilmiştir. Son değişiklerinizi yazının içine eklemeniz gerekecektir.\n\"{{int:savearticle}}\"e bastığınızda '''sadece''' yukarıdaki yazı kaydedilecektir.",
+       "explainconflict": "Siz sayfayı değiştirirken başka biri de değişiklik yaptı.\nYukarıdaki yazı sayfanın şu anki halini göstermektedir.\nSizin değişiklikleriniz alta gösterilmiştir. Son değişiklerinizi yazının içine eklemeniz gerekecektir.\n\"$1\"e bastığınızda '''sadece''' yukarıdaki yazı kaydedilecektir.",
        "yourtext": "Sizin metniniz",
        "storedversion": "Kaydedilmiş metin",
        "nonunicodebrowser": "'''UYARI: Tarayıcınız unicode uyumlu değil.\nSayfaları güvenle değiştirmenize izin vermek için: ASCII olmayan karakterler değiştirme kutusunda onaltılık kodlar olarak görünecektir.'''",
        "sectioneditnotsupported-text": "Bölüm değiştirmesi bu sayfada desteklenmiyor.",
        "permissionserrors": "İzin hatası",
        "permissionserrorstext": "Aşağıdaki {{PLURAL:$1|sebep|sebepler}}den dolayı, bunu yapmaya yetkiniz yok:",
-       "permissionserrorstext-withaction": "Aşağıdaki {{PLURAL:$1|neden|nedenler}}den dolayı $2 yetkiniz yok:",
-       "recreate-moveddeleted-warn": "'''Uyarı: Daha önceden silinmiş bir sayfayı tekrar oluşturuyorsunuz.'''\n\nSayfayı değiştirmeye devam etmenin uygun olup olmadığını düşünmelisiniz.\nSayfanın silme ve taşıma kaydı kolaylık için burada verilmiştir:",
+       "permissionserrorstext-withaction": "Aşağıdaki {{PLURAL:$1|neden|nedenler}}den dolayı $2 için yetkiniz yok:",
+       "recreate-moveddeleted-warn": "<strong>Uyarı: Daha önceden silinmiş bir sayfayı tekrar oluşturuyorsunuz.</strong>\n\nBu sayfayı düzenlemeye devam etmenin uygun olup olmadığını düşünmelisiniz.\nBu sayfanın silme ve taşıma günlüğü kolaylık için burada verilmiştir:",
        "moveddeleted-notice": "Bu sayfa silinmiş.\nSayfanın silme ve taşıma kaydı referans için aşağıda verilmiştir.",
        "log-fulllog": "Tam günlüğü gör",
        "edit-hook-aborted": "Değişiklik çengelle durduruldu.\nBir açıklama verilmedi.",
        "invalid-content-data": "Geçersiz içerik verisi",
        "content-not-allowed-here": "\"$1\" içeriğine, [[$2]] sayfasında izin verilmemekte.",
        "editwarning-warning": "Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.\nEğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin \"{{int:prefs-editing}}\" bölümünde devre dışı bırakabilirsiniz.",
+       "editpage-invalidcontentmodel-text": "\"$1\" içerik modeli desteklenmemektedir.",
        "editpage-notsupportedcontentformat-title": "İçerik biçimi desteklenmiyor",
        "editpage-notsupportedcontentformat-text": "$1 içerik biçimi $2 içerik modeli tarafından desteklenmiyor.",
        "content-model-wikitext": "vikimetin",
        "undo-summary-username-hidden": "Gizli bir kullanıcı tarafından $1 sürümü geri alınıyor",
        "cantcreateaccount-text": "Bu IP adresinden ('''$1''') kullanıcı hesabı oluşturulması [[User:$3|$3]] tarafından engellenmiştir.\n\n$3 tarafından verilen sebep ''$2''",
        "cantcreateaccount-range-text": "<strong>$1</strong> aralığındaki IP'ler için hesap oluşturma [[User:$3|$3]] tarafından engellendi, bu sizin IP adresinizi de (<strong>$4</strong>) içeriyor.\n\n$3 tarafından verilen gerekçe <em>$2</em>",
-       "viewpagelogs": "Bu sayfa ile ilgili kayıtları göster",
+       "viewpagelogs": "Bu sayfa için günlükleri gör",
        "nohistory": "Bu sayfanın geçmiş sürümü yok.",
        "currentrev": "Güncel sürüm",
        "currentrev-asof": "$1 itibarı ile sayfanın şu anki hâli",
        "previousrevision": "← Önceki hâli",
        "nextrevision": "Sonraki hâli →",
        "currentrevisionlink": "En güncel hâli",
-       "cur": "fark",
+       "cur": "gün",
        "next": "sonraki",
        "last": "son",
        "page_first": "ilk",
        "revdelete-reasonotherlist": "Diğer sebep",
        "revdelete-edit-reasonlist": "Silme nedenlerini değiştir",
        "revdelete-offender": "Revizyon yazarı:",
-       "suppressionlog": "Gizleme kayıtları",
+       "suppressionlog": "Gizleme günlüğü",
        "suppressionlogtext": "Aşağıdaki, hizmetlilerden gizlenen içerik içeren silinmelerin ve engellemelerin listesidir.\nŞu anda işlevsel olan yasak ve engellemelerin listesi için [[Special:BlockList|engelleme listesine]] bakın.",
-       "mergehistory": "Sayfa geçmişlerini takas et.",
+       "mergehistory": "Sayfa geçmişlerini birleştir",
        "mergehistory-header": "Bu sayfa, bir kaynak sayfanın geçmiş revizyonlarını yeni bir sayfaya birleştirmenize olanak sağlar.\nBu değişikliğin geçmişe ait sayfa devamlılığını devam ettirdiğinden emin olun.",
        "mergehistory-box": "İki sayfanın revizyonlarını birleştir:",
        "mergehistory-from": "Kaynak sayfa:",
        "mergehistory-same-destination": "Kaynak ve hedef sayfaları aynı olamaz",
        "mergehistory-reason": "Sebep:",
        "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
-       "mergelog": "Birleştirme kaydı",
+       "mergelog": "Birleştirme günlüğü",
        "revertmerge": "Ayır",
        "mergelogpagetext": "Aşağıdaki liste, sayfaların geçmiş versiyonlarının birbirleriyle en son birleştirilmelerini içerir",
        "history-title": "\"$1\" sayfasının geçmişi",
        "searchprofile-images-tooltip": "Dosya ara",
        "searchprofile-everything-tooltip": "Tüm içerikte ara (tartışma sayfaları dahil)",
        "searchprofile-advanced-tooltip": "Özel ad alanlarında ara",
-       "search-result-size": "$1 ({{PLURAL:$2|1 kelime|$2 kelime}})",
+       "search-result-size": "$1 ($2 sözcük)",
        "search-result-category-size": "{{PLURAL:$1|1 üye|$1 üye}} ({{PLURAL:$2|1 altkategori|$2 altkategori}}, {{PLURAL:$3|1 dosya|$3 dosya}})",
        "search-redirect": "($1 sayfasından yönlendirme)",
        "search-section": "($1 bölümü)",
        "prefs-help-prefershttps": "Bu tercih bir sonraki girişinizde etkili olacaktır.",
        "prefswarning-warning": "Henüz kaydedilmemiş değişiklikler yaptınız. \"$\"'e basmadığınız takdirde tercihleriniz güncellenmeyecektir.",
        "prefs-tabs-navigation-hint": "İpucu: Sekmeler listesindeki sekmeler arasında gezinmek için sağ ve sol ok tuşlarını kullanabilirsiniz.",
-       "userrights": "Kullanıcı hakları yönetimi",
+       "userrights": "Kullanıcı hakları",
        "userrights-lookup-user": "Bir kullanıcı seç",
        "userrights-user-editname": "Kullanıcı adı giriniz:",
        "editusergroup": "Kullanıcı gruplarını gör",
        "userrights-no-interwiki": "Diğer vikilerdeki kullanıcıların izinlerini değiştirmeye yetkiniz yok.",
        "userrights-nodatabase": "$1 veritabanı mevcut veya bölgesel değil",
        "userrights-changeable-col": "Değiştirebildiğiniz gruplar",
-       "userrights-unchangeable-col": "Değiştirebilmediğiniz gruplar",
+       "userrights-unchangeable-col": "Değiştiremediğiniz gruplar",
+       "userrights-expiry-current": "$1 tarihi itibarıyla sona eriyor",
+       "userrights-expiry-none": "Süresiz",
+       "userrights-expiry": "Bitiş:",
+       "userrights-expiry-existing": "Mevcut bitiş süresi: $2 $3",
+       "userrights-expiry-othertime": "Diğer süre:",
+       "userrights-expiry-options": "1 gün:1 day,1 hafta:1 week,1 ay:1 month,3 ay:3 months,6 ay:6 months,1 yıl:1 year",
+       "userrights-expiry-in-past": "\"$1\" grubunun bitiş süresi geçmişte.",
        "userrights-conflict": "Kullanıcı hakları değişikliklerinde çakışma! Lütfen değişikliklerinizi gözden geçirin ve onaylayın.",
        "group": "Grup:",
        "group-user": "Kullanıcılar",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokratlar",
        "grouppage-suppress": "{{ns:project}}:Gözetmen",
        "right-read": "Sayfaları oku",
-       "right-edit": "Sayfaları değiştir",
+       "right-edit": "Sayfaları düzenle",
        "right-createpage": "Sayfa oluştur (tartışma sayfası olmayan)",
        "right-createtalk": "Tartışma sayfaları oluştur",
        "right-createaccount": "Yeni kullanıcı hesapları yarat",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" olarak korunan sayfalarda değişiklik yap",
        "right-editcontentmodel": "Sayfanın içerik modelini düzenle",
        "right-editinterface": "Kullanıcı arayüzünü değiştirmek",
-       "right-editusercssjs": "Diğer kullanıcıların CSS ve JS dosyalarında değişiklik yap",
        "right-editusercss": "Diğer kullanıcıların CSS dosyalarında değişiklik yap",
        "right-edituserjs": "Diğer kullanıcıların JS dosyalarında değişiklik yap",
        "right-editmyusercss": "Kendi kullanıcı CSS dosyaları düzenle",
        "grant-basic": "Basit haklar",
        "grant-viewdeleted": "Silinen dosya ve sayfaları görüntüle",
        "grant-viewmywatchlist": "İzleme listeni gör",
-       "newuserlogpage": "Yeni kullanıcı kayıtları",
-       "newuserlogpagetext": "En son kaydolan kullanıcı kayıtları.",
-       "rightslog": "Kullanıcı hakları kayıtları",
-       "rightslogtext": "Kullanıcı hakları değişiklikleri kayıtları.",
+       "newuserlogpage": "Kullanıcı oluşturma günlüğü",
+       "newuserlogpagetext": "Bu bir kullanıcı oluşturma günlüğüdür.",
+       "rightslog": "Kullanıcı hakları günlüğü",
+       "rightslogtext": "Bu, kullanıcı hakları değişiklikleri için bir günlüktür.",
        "action-read": "bu sayfayı okumaya",
        "action-edit": "bu sayfayı değiştirmeye",
        "action-createpage": "sayfa oluşturmaya",
        "action-deleterevision": "bu revizyonu silmeye",
        "action-deletedhistory": "bu sayfanın silinme geçmişini görmeye",
        "action-browsearchive": "silinen sayfaları aramaya",
-       "action-undelete": "bu sayfanın silme işlemini geri almaya",
-       "action-suppressrevision": "bu gizli revizyonu gözden geçirip geri yüklemeye",
+       "action-undelete": "sayfaları geri getir",
+       "action-suppressrevision": "gizli sürümleri gözden geçir ve geri getir",
        "action-suppressionlog": "bu özel günlüğü görmeye",
        "action-block": "bu kullanıcının değişiklik yapmasını engellemeye",
        "action-protect": "bu sayfa için koruma düzeylerini değiştirmeye",
        "action-userrights-interwiki": "diğer vikilerde kullanıcıların, kullanıcı haklarını değiştirmeye",
        "action-siteadmin": "veritabanını kilitleyip açmaya",
        "action-sendemail": "e-posta gönder",
+       "action-editmyoptions": "tercihlerinizi düzenleyin",
        "action-editmywatchlist": "izleme listeni düzenle",
        "action-viewmywatchlist": "izleme listeni gör",
        "action-viewmyprivateinfo": "kendi özel bilgilerinizi görmeye",
        "action-editmyprivateinfo": "kendi özel bilgilerinizi değiştirmeye",
        "action-editcontentmodel": "bir sayfanın içerik modelini düzenle",
-       "action-managechangetags": "veritabanındaki etiketleri yarat ve sil",
+       "action-managechangetags": "etiket oluştur ve etkinleştir (veya devre dışı bırak)",
        "action-applychangetags": "değişikliklerle beraber etiketlendirmeyi de uygula",
        "action-changetags": "tekil sürümlere veya günlük kayıtlarına etiket ekleme veya çıkarma",
+       "action-deletechangetags": "etiketleri veritabanından sil",
+       "action-purge": "bu sayfayı temizle",
        "nchanges": "$1 {{PLURAL:$1|değişiklik|değişiklik}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|son ziyaretten bu yana}}",
        "enhancedrc-history": "geçmiş",
        "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",
+       "rcfilters-activefilters": "Etkin süzgeçler",
+       "rcfilters-restore-default-filters": "Varsayılan süzgeçleri geri getir",
+       "rcfilters-clear-all-filters": "Tüm süzgeçleri temizle",
+       "rcfilters-search-placeholder": "Son değişiklikleri filtrele (gözatın veya yazmaya başlayın)",
+       "rcfilters-invalid-filter": "Geçersiz süzgeç",
+       "rcfilters-empty-filter": "Etkin süzgeç bulunmuyor. Tüm katkıları gösteriliyor.",
+       "rcfilters-filterlist-title": "Süzgeçler",
+       "rcfilters-filterlist-whatsthis": "Bu nedir?",
+       "rcfilters-filterlist-feedbacklink": "Yeni (beta) süzgeçler konusunda geribildirim verin",
+       "rcfilters-highlightbutton-title": "Sonuçları vurgula",
+       "rcfilters-highlightmenu-title": "Bir renk seçin",
+       "rcfilters-highlightmenu-help": "Bu özelliği vurgulamak için bir renk seçin",
+       "rcfilters-filterlist-noresults": "Süzgeç bulunamadı",
+       "rcfilters-filtergroup-registration": "Kullanıcı kaydı",
+       "rcfilters-filter-registered-label": "Kayıtlı",
+       "rcfilters-filter-registered-description": "Oturum açmış editörler.",
+       "rcfilters-filter-unregistered-label": "Kayıtsız",
+       "rcfilters-filter-unregistered-description": "Oturum açmamış editörler.",
+       "rcfilters-filtergroup-authorship": "Düzenleme sahipliği",
+       "rcfilters-filter-editsbyself-label": "Senin değişiklikleriniz",
+       "rcfilters-filter-editsbyself-description": "Kendi katkılarınız.",
+       "rcfilters-filter-editsbyother-label": "Başkalarının düzenlemeleri",
+       "rcfilters-filter-editsbyother-description": "Kendi düzenlemeleriniz hariç bütün düzenlemeler.",
+       "rcfilters-filtergroup-userExpLevel": "Deneyim düzeyi (yalnızca kayıtlı kullanıcılar için)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Bu süzgeç etkin değildir, çünkü yalnızca kayıtlı kullanıcıları bulmaktadır, yani \"Kayıtsız\" süzgeci etkisini ortadan kaldırmaktadır.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"Kayıtsız\" süzgeci bir veya daha fazla Deneyim süzgeciyle çakışmaktadır. Deneyim süzgeçleri yalnızca kayıtlı kullanıcıları bulmaktadır. Çakışan süzgeçler yukarıda etkin değil şeklinde işaretlenmiştir.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Yeni gelenler",
+       "rcfilters-filter-user-experience-level-newcomer-description": "10'dan az düzenleme ve 4 günden az etkinlik.",
+       "rcfilters-filter-user-experience-level-learner-label": "Öğreniciler",
+       "rcfilters-filter-user-experience-level-learner-description": "\"Yeni gelenler\"den daha fazla gün boyunca etkinlik ve daha fazla düzenleme, ancak \"Deneyimli kullanıcılar\"dan daha az etkinlik ve düzenleme.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Deneyimli kullanıcılar",
+       "rcfilters-filter-user-experience-level-experienced-description": "30'dan fazla gün etkinlik ve 500'den fazla düzenleme.",
+       "rcfilters-filtergroup-automated": "Otomatikleştirilmiş katkılar",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Otomatikleştirilmiş araçlar tarafından yapılan düzenlemeler.",
+       "rcfilters-filter-humans-label": "İnsan (bot değil)",
+       "rcfilters-filter-humans-description": "İnsan editörler tarafından yapılan düzenlemeler.",
+       "rcfilters-filtergroup-reviewstatus": "İnceleme durumu",
+       "rcfilters-filter-patrolled-label": "Devriye onayından geçmiş",
+       "rcfilters-filter-patrolled-description": "Devriye onayından geçmiş olarak işaretlenen düzenlemeler.",
+       "rcfilters-filter-unpatrolled-label": "Devriye onayından geçmemiş",
+       "rcfilters-filter-unpatrolled-description": "Devriye onayından geçmiş olarak işaretlenmeyen düzenlemeler.",
+       "rcfilters-filtergroup-significance": "Önem",
+       "rcfilters-filter-minor-label": "Küçük düzenlemeler",
+       "rcfilters-filter-minor-description": "Yazarın küçük olarak etiketlediği düzenlemeler.",
+       "rcfilters-filter-major-label": "Küçük olmayan düzenlemeler",
+       "rcfilters-filter-major-description": "Küçük olarak etiketlenmemiş düzenlemeler.",
+       "rcfilters-filtergroup-changetype": "Değişiklik türü",
+       "rcfilters-filter-pageedits-label": "Sayfa düzenlemeleri",
+       "rcfilters-filter-pageedits-description": "Viki içeriği, tartışmalar, kategori açıklamalarındaki düzenlemeler....",
+       "rcfilters-filter-newpages-label": "Sayfa oluşturmalar",
+       "rcfilters-filter-newpages-description": "Yeni sayfa oluşturan düzenlemeler.",
+       "rcfilters-filter-categorization-label": "Kategori değişiklikleri",
+       "rcfilters-filter-categorization-description": "Kategorilere eklenen veya kaldırılan sayfaların kayıtları.",
+       "rcfilters-filter-logactions-label": "Günlüğü tutulan işlemler",
+       "rcfilters-filter-logactions-description": "Hizmetli işlemleri, hesap oluşturmalar, sayfa silmeler, yüklemeler....",
        "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",
        "rcshowhidecategorization": "sayfa kategorizasyonunu $1",
        "rcshowhidecategorization-show": "göster",
        "rcshowhidecategorization-hide": "gizle",
-       "rclinks": "Son $2 günde yapılan son $1 değişikliği göster;<br /> $3",
+       "rclinks": "Son $2 günde yapılan son $1 değişikliği göster",
        "diff": "fark",
        "hist": "geçmiş",
        "hide": "gizle",
        "upload-permitted": "İzin verilen dosya {{PLURAL:$2|türü|türleri}}: $1.",
        "upload-preferred": "Tercih edilen dosya {{PLURAL:$2|türü|türleri}}: $1.",
        "upload-prohibited": "Yasaklanan dosya {{PLURAL:$2|türü|türleri}}: $1.",
-       "uploadlogpage": "Dosya yükleme kaydı",
+       "uploadlogpage": "Yükleme günlüğü",
        "uploadlogpagetext": "Aşağıda en son eklenen [[Special:NewFiles|dosyaların bir listesi]] bulunmaktadır.",
        "filename": "Dosya adı",
        "filedesc": "Açıklama",
        "filerevert-submit": "Eski haline döndür",
        "filerevert-success": "'''[[Media:$1|$1]]''' dosyası [$4 $3, $2 tarihli sürüme] geri döndürüldü.",
        "filerevert-badversion": "Bu dosyanın verilen zaman bilgisine sahip önceki bir yerel sürümü yok.",
-       "filedelete": "Sil $1",
+       "filedelete": "$1 adlı dosyayı sil",
        "filedelete-legend": "Dosya sil",
        "filedelete-intro": "'''[[Media:$1|$1]]''' dosyasını tüm geçmişiyle birlikte silmek üzeresiniz.",
        "filedelete-intro-old": "'''[[Media:$1|$1]]''' dosyasının [$4 $3, $2] tarihli sürümünü siliyorsunuz.",
        "filedelete-comment": "Neden:",
-       "filedelete-submit": "sil",
+       "filedelete-submit": "Sil",
        "filedelete-success": "'''$1''' silindi.",
        "filedelete-success-old": "'''[[Media:$1|$1]]''' dosyasının $3, $2 tarihli sürümü silindi.",
        "filedelete-nofile": "'''$1''' mevcut değildir.",
        "pageswithprop-submit": "Git",
        "pageswithprop-prophidden-long": "uzun metin özellik değeri gizlendi ($1)",
        "pageswithprop-prophidden-binary": "ikili özellik değeri gizlendi ($1)",
-       "doubleredirects": "Çift yönlendirmeler",
+       "doubleredirects": "Yönlendirmeye olan yönlendirmeler",
        "doubleredirectstext": "Bu sayfa diğer yönlendirme sayfalarına yönlendirme yapan sayfaları listeler.\nHer satırın içerdiği bağlantılar; birinci ve ikinci yönlendirme, ayrıca ikinci yönlendirmenin hedefi, ki bu genelde birinci yönlendirmenin göstermesi gereken \"gerçek\" hedef sayfasıdır.\n<del>Üstü çizili</del> girdiler çözülmüştür.",
        "double-redirect-fixed-move": "[[$1]] taşındı.\nYönlendirme otomatik olarak güncellendi ve [[$2]] sayfasına yönlendirildi.",
        "double-redirect-fixed-maintenance": "[[$1]] sayfasından [[$2]] sayfasına yapılan çift yönlendirme otomatik olarak düzeltiliyor.",
        "double-redirect-fixer": "Yönlendirme tamircisi",
-       "brokenredirects": "Boş yönlendirmeler",
+       "brokenredirects": "Var olmayan sayfalara yönlendirmeler",
        "brokenredirectstext": "Aşağıdaki yönlendirmeler varolmayan sayfalara bağlantı veriyor:",
-       "brokenredirects-edit": "değiştir",
+       "brokenredirects-edit": "düzenle",
        "brokenredirects-delete": "sil",
        "withoutinterwiki": "Diğer dillere bağlantısı olmayan sayfalar",
        "withoutinterwiki-summary": "Aşağıda listelenen sayfalar diğer dillere bağlantı içermemektedir:",
        "mostlinkedtemplates": "En çok dahil edilen sayfalar",
        "mostcategories": "En fazla kategoriye bağlanmış sayfalar",
        "mostimages": "En çok bağlantı verilmiş dosyalar",
-       "mostinterwikis": "En çok interwiki'ye sahip sayfalar",
+       "mostinterwikis": "En çok intervikiye sahip sayfalar",
        "mostrevisions": "En çok değişikliğe uğramış sayfalar",
        "prefixindex": "Önek ile tüm sayfalar",
        "prefixindex-namespace": "Önek ile tüm sayfalar ($1 ad alanında)",
        "magiclink-tracking-isbn": "ISBN sihirli bağlantısını kullanan sayfalar",
        "specialloguserlabel": "Kullanıcı:",
        "speciallogtitlelabel": "Hedef (başlık ya da kullanıcı):",
-       "log": "Kayıtlar",
+       "log": "Günlükler",
        "logeventslist-submit": "Göster",
-       "all-logs-page": "Tüm ortak günlükler",
+       "all-logs-page": "Tüm genel günlükler",
        "alllogstext": "{{SITENAME}} için mevcut tüm günlüklerin birleşik gösterimi.\nGünlük tipini, kullanıcı adını (büyük-küçük harf duyarlı), ya da etkilenen sayfayı (yine büyük-küçük harf duyarlı) seçerek görünümü daraltabilirsiniz.",
        "logempty": "Kayıtlarda eşleşen bilgi yok.",
        "log-title-wildcard": "Bu metinle başlayan başlıklar ara",
        "allarticles": "Tüm maddeler",
        "allinnamespace": "Tüm sayfalar ($1 sayfaları)",
        "allpagessubmit": "Getir",
-       "allpagesprefix": "Buraya yazdığınız harflerle başlayan sayfaları listeleyin:",
+       "allpagesprefix": "Şu öneke sahip sayfaları görüntüle:",
        "allpagesbadtitle": "Girilen sayfa ismi diller arası bağlantı ya da vikiler arası bağlantı içerdiğinden geçerli değil. Başlıklarda kullanılması yasak olan bir ya da daha çok karakter içeriyor olabilir.",
        "allpages-bad-ns": "{{SITENAME}} sitesinde \"$1\" ad alanı yok.",
        "allpages-hide-redirects": "Yönlendirmeleri gizle",
        "listgrouprights-namespaceprotection-namespace": "Ad alanı",
        "listgrouprights-namespaceprotection-restrictedto": "Kullanıcının değişiklik yapmasına izin veren hak(lar)",
        "listgrants-rights": "Haklar",
-       "trackingcategories": "Eşleşen kategoriler",
+       "trackingcategories": "Takip kategorileri",
        "trackingcategories-summary": "Bu sayfa MediaWiki yazılımı tarafından otomatik olarak doldurulan takip kategorilerini listelemektedir. {{ns:8}} ad alanındaki ilgili sistem mesajları değiştirilerek isimleri düzenlenebilir.",
        "trackingcategories-msg": "İzleme kategorisi",
        "trackingcategories-name": "Mesaj Duvarı",
        "emailuser-title-target": "Bu {{GENDER:$1|kullanıcıya}} e-posta gönder",
        "emailuser-title-notarget": "Kullanıcı e-posta",
        "emailpagetext": "Bu {{GENDER:$1|kullanıcıya}} e-posta iletisi göndermek için aşağıdaki formu kullanabilirsiniz.\n[[Special:Preferences|Kullanıcı tercihlerinizde]] girdiğiniz e-posta adresiniz, e-postanın \"From (Kimden)\" adresinde görünecektir, bu yüzden alıcı size doğrudan yanıt verebilecektir.",
-       "defemailsubject": "\"$1\" kullanıcısından {{SITENAME}} e-postası",
+       "defemailsubject": "\"$1\" adlı kullanıcıdan {{SITENAME}} e-postası",
        "usermaildisabled": "Kullanıcı e-postası devre dışı",
        "usermaildisabledtext": "Bu vikide diğer kullanıcılara e-posta gönderemezsiniz",
        "noemailtitle": "e-posta adresi yok",
        "emailfrom": "Kimden:",
        "emailto": "Kime:",
        "emailsubject": "Konu:",
-       "emailmessage": "E-posta:",
+       "emailmessage": "İleti:",
        "emailsend": "Gönder",
        "emailccme": "Mesajın bir kopyasını da bana gönder.",
        "emailccsubject": "$1'e gönderdiğiniz mesajın kopyası: $2",
        "emailsent": "E-posta gönderildi",
-       "emailsenttext": "E-postaz gönderildi.",
+       "emailsenttext": "E-posta iletiniz gönderildi.",
        "emailuserfooter": "Bu e-posta $1 tarafından $2 kullanıcısına, {{SITENAME}} sitesindeki \"Kullanıcıya e-posta gönder\" (\"{{int:emailuser}}\") fonksiyonu ile gönderilmiştir.",
        "usermessage-summary": "Sistem mesajı bırakın.",
        "usermessage-editor": "Sistem habercisi",
        "addedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenize]] eklenmiştir.\nBundan sonra, bu sayfaya ve ilgili tartışma sayfasına yapılacak değişiklikler burada listelenecek.",
        "addedwatchtext-short": "\"$1\" sayfası izleme listenize eklendi.",
        "removewatch": "İzleme listesinden kaldır",
-       "removedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenizden]] silinmiştir.",
+       "removedwatchtext": "\"[[:$1]]\" sayfası, tartışma sayfası ile birlikte [[Special:Watchlist|izleme listenizden]] silinmiştir.",
        "removedwatchtext-short": "\"$1\" sayfası izleme listenizden çıkarıldı.",
        "watch": "izle",
        "watchthispage": "Sayfayı izle",
        "excontent": "eski içerik: '$1'",
        "excontentauthor": "eski içerik: '$1' ('[[Special:Contributions/$2|$2]]' katkıda bulunmuş olan tek kullanıcı)",
        "exbeforeblank": "Silinmeden önceki içerik: '$1'",
-       "delete-confirm": "\"$1\" sil",
-       "delete-legend": "sil",
+       "delete-confirm": "\"$1\" sayfasını sil",
+       "delete-legend": "Sil",
        "historywarning": "<strong>Uyarı:</strong> Silmek üzere olduğunuz sayfanın yaklaşık olarak $1 sürüme sahip bir geçmişi var:",
        "historyaction-submit": "Göster",
        "confirmdeletetext": "Bu sayfayı veya dosyayı tüm geçmişi ile birlikte veritabanından kalıcı olarak silmek üzeresiniz.\nBu işlemden kaynaklı doğabilecek sonuçların farkında iseniz ve işlemin [[{{MediaWiki:Policy-url}}|Silme kurallarına]] uygun olduğuna eminseniz, işlemi onaylayın.",
        "actioncomplete": "İşlem tamamlandı",
        "actionfailed": "İşlem başarısız oldu",
        "deletedtext": "\"$1\" silindi.\nYakın zamanda silinenleri görmek için: $2.",
-       "dellogpage": "Silme kayıtları",
-       "dellogpagetext": "Aşağıdaki liste son silme kayıtlarıdır.",
-       "deletionlog": "silme kayıtları",
+       "dellogpage": "Silme günlüğü",
+       "dellogpagetext": "Aşağıda en son silme işlemlerinin bir listesi bulunmaktadır.",
+       "deletionlog": "silme günlüğü",
        "reverted": "Önceki sürüm geri getirildi",
        "deletecomment": "Neden:",
        "deleteotherreason": "Diğer/ilave neden:",
        "rollbackfailed": "geri alma işlemi başarısız",
        "cantrollback": "Sayfaya son katkıda bulunan kullanıcı, sayfaya katkıda bulunmuş tek kişi olduğu için, değişiklikler geri alınamıyor.",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tarafından [[:$1]] sayfasında yapılmış son değişiklik geri döndürülemiyor;\nbaşka birisi sayfada değişiklik yaptı ya da sayfayı geri döndürdü.\n\nSon değişikliği yapan: [[User:$3|$3]] ([[User talk:$3|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "Değişiklik özeti: <em>$1</em> idi.",
+       "editcomment": "Düzenleme özeti şöyleydi: <em>$1</em>.",
        "revertpage": "[[Special:Contributions/$2|$2]] [[User talk:$2|mesaj]] tarafından yapılan değişiklikler geri alınarak, [[User:$1|$1]] tarafından değiştirilmiş önceki sürüm geri getirildi.",
        "revertpage-nouser": "Gizli bir kullanıcı tarafından yapılan değişiklikler geri alınarak {{GENDER:$1|[[User:$1|$1]]}} tarafından yapılan son revizyon geri getirildi",
        "rollback-success": "$1 tarafından yapılan değişiklikler geri alınarak;\n$2 tarafından değiştirilmiş önceki sürüme geri dönüldü.",
        "sessionfailure-title": "Oturum başarısızlığı",
        "sessionfailure": "Giriş oturumunuzla ilgili bir sorun var gibi görünüyor;\nbu eylem, oturum gaspına karşı önlem olarak iptal edildi.\nLütfen \"geri\" gidin ve geldiğiniz sayfayı yeniden yükleyin, sonra tekrar deneyin.",
+       "changecontentmodel": "Bir sayfanın içerik modelini değiştir",
        "changecontentmodel-title-label": "Sayfa başlığı",
        "changecontentmodel-model-label": "Yeni içerik modeli",
        "changecontentmodel-reason-label": "Gerekçe:",
        "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ı",
+       "protectlogpage": "Koruma günlüğü",
        "protectlogtext": "Aşağıdaki, sayfa korumalarına değişikliklerin bir listesidir.\nŞu anda uygulanan sayfa korumaları için [[Special:ProtectedPages|koruma altına alınmış sayfalar listesine]] bakabilirsiniz.",
-       "protectedarticle": "\"[[$1]]\" koruma altında alındı",
+       "protectedarticle": "\"[[$1]]\" adlı sayfayı koruma altına aldı",
        "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ı",
+       "protectedarticle-comment": "\"[[$1]]\" adlı sayfayı {{GENDER:$2|koruma altına aldı}}",
        "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",
        "minimum-size": "En küçük boyut",
        "maximum-size": "En büyük boyut:",
        "pagesize": "(bayt)",
-       "restriction-edit": "değiştir",
+       "restriction-edit": "Düzenle",
        "restriction-move": "Taşı",
        "restriction-create": "Oluştur",
        "restriction-upload": "Yükle",
        "undeletepagetext": "Aşağıdaki {{PLURAL:$1|sayfa|$1 sayfa}} silinmiştir ama hala arşivdedir ve geri getirilebilir.\nArşiv düzenli olarak temizlenebilir.",
        "undelete-fieldset-title": "Revizyonları geri yükle",
        "undeleteextrahelp": "Sayfanın tüm geçmişini geri getirmek için onay kutularını boş bırakarak '''''{{int:undeletebtn}}''''' tuşuna tıklayın.\nSayfanın geçmişini ayrı ayrı getirmek için geri getirmek istediğiniz değişikliklerin onay kutularını seçip '''''{{int:undeletebtn}}''''' tuşuna tıklayın.",
-       "undeleterevisions": "$1 {{PLURAL:$1|revizyon|revizyon}} arşivlendi",
+       "undeleterevisions": "$1 revizyon silindi",
        "undeletehistory": "Eğer sayfayı geri getirirseniz, tüm revizyonlar geçmişe geri getirilecektir.\nSilindikten sonra aynı isimle yeni bir sayfa oluşturulmuşsa, geri gelen revizyonlar varolan sayfanın geçmişinde görünecektir.",
        "undeleterevdel": "Eğer üst sayfada sonuçlanacaksa ya da dosya revizyonu kısmen silinmiş ise, silmeyi geri alma uygulanamaz.\nBöyle durumlarda, en yeni silinen revizyonu seçmemeli ya da gizlemesini kaldırmalısınız.",
        "undeletehistorynoadmin": "Bu madde silinmiştir. Silinme sebebi ve silinme öncesinde maddeyi düzenleyen kullanıcıların detayları aşağıdaki özette verilmiştir. Bu silinmiş sürümlerin metinleri ise sadece hizmetliler tarafından görülebilir.",
        "undeleteviewlink": "görüntüle",
        "undeleteinvert": "Seçimi ters çevir",
        "undeletecomment": "Neden:",
-       "undeletedrevisions": "Toplam {{PLURAL:$1|1 kayıt|$1 kayıt}} geri getirildi.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revizyon|$1 revizyon}} ve {{PLURAL:$2|1 dosya|$2 dosya}} eski konumuna getirildi",
-       "undeletedfiles": "{{PLURAL:$1|1 dosya|$1 dosya}} geri getirildi.",
-       "cannotundelete": "Silme başarısız oldu:\n$1",
+       "cannotundelete": "Geri getirme işlemlerinden bazıları veya tümü başarısız oldu:\n$1",
        "undeletedpage": "'''$1 sayfası geri getirildi'''\n\nÖnceki silme ve geri getirme işlemleri için [[Special:Log/delete|silme kayıtları]]na bakınız.",
-       "undelete-header": "Daha önce silinmiş sayfaları görmek için bakınız: [[Special:Log/delete|silme kayıtları]].",
+       "undelete-header": "Yakın zamanda silinen sayfaları görmek için [[Special:Log/delete|silme günlüğü]]ne bakın.",
        "undelete-search-title": "Silinen sayfaları ara",
        "undelete-search-box": "Silinmiş sayfaları ara",
        "undelete-search-prefix": "Şununla başlayan sayfaları göster:",
        "sp-contributions-newbies": "Sadece yeni kullanıcıların katkılarını göster",
        "sp-contributions-newbies-sub": "Yeni kullanıcılar için",
        "sp-contributions-newbies-title": "Yeni hesaplar için kullanıcı katkıları",
-       "sp-contributions-blocklog": "Engel kaydı",
+       "sp-contributions-blocklog": "engelleme günlüğü",
        "sp-contributions-suppresslog": "kullanıcının silinen katkıları",
        "sp-contributions-deleted": "kullanıcının silinen katkıları",
        "sp-contributions-uploads": "yüklenenler",
-       "sp-contributions-logs": "kayıtlar",
+       "sp-contributions-logs": "günlükler",
        "sp-contributions-talk": "mesaj",
        "sp-contributions-userrights": "kullanıcı hakları yönetimi",
        "sp-contributions-blocked-notice": "Bu kullanıcı engellenmiştir. Referans için en son engellenme kaydı aşağıda belirtilmiştir:",
        "sp-contributions-hideminor": "Küçük değişiklikleri gizle",
        "sp-contributions-submit": "Ara",
        "whatlinkshere": "Sayfaya bağlantılar",
-       "whatlinkshere-title": "\"$1\" maddesine bağlantı veren sayfalar",
+       "whatlinkshere-title": "\"$1\" sayfasına bağlantı veren sayfalar",
        "whatlinkshere-page": "Sayfa:",
        "linkshere": "'''[[:$1]]''' sayfasına bağlantısı olan sayfalar:",
        "nolinkshere": "'''[[:$1]]''' sayfasına bağlantı veren sayfa yok.",
        "blockip": "{{GENDER:$1|Kullanıcıyı}} engelle",
        "blockip-legend": "Kullanıcıyı engelle",
        "blockiptext": "Aşağıdaki formu kullanarak belli bir IP'nin veya kayıtlı kullanıcının değişiklik yapmasını engelleyebilirsiniz. Bu sadece vandalizmi engellemek için ve [[{{MediaWiki:Policy-url}}|kurallara]] uygun olarak yapılmalı. Aşağıya mutlaka engelleme ile ilgili bir açıklama yazınız. (örnek: -Şu- sayfalarda vandalizm yapmıştır).",
-       "ipaddressorusername": "IP adresi veya kullanıcı adı",
+       "ipaddressorusername": "IP adresi veya kullanıcı adı:",
        "ipbexpiry": "Bitiş süresi",
        "ipbreason": "Neden:",
        "ipbreason-dropdown": "*Genel engelleme nedenleri\n** Yanlış bilgi eklemek\n** Sayfalardan içeriği çıkarmak\n** Dış sitelere spam bağlantı vermek\n** Sayfalara mantıksız/anlaşılmaz sözler eklemek\n** Tehditvari davranış/Taciz\n** Birden fazla hesabı kötüye kullanmak\n** Kabul edilemez kullanıcı adı",
        "ipb-change-block": "Bu ayarlarla kullanıcıyı yeniden engelle",
        "ipb-confirm": "Engeli onayla",
        "badipaddress": "Geçersiz IP adresi",
-       "blockipsuccesssub": "IP adresi engelleme işlemi başarılı oldu",
+       "blockipsuccesssub": "Engelleme başarılı oldu",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] engellendi.<br />\nEngellemeleri gözden geçirmek için [[Special:BlockList|engel listesine]] bakınız.",
        "ipb-blockingself": "Kendinizi engellemek üzeresiniz! Bunu yapmak istediğinizden emin misiniz?",
        "ipb-confirmhideuser": "\"Kullanıcıyı gizle\" seçiliyken bir kullanıcı engellemek üzeresiniz. Bu, kullanıcının adını tüm listeler ile günlük girişlerinde bastıracaktır. Bunu yapmak istediğinizden emin misiniz?",
        "ipb-confirmaction": "Bunu gerçekten yapmak istediğinize eminseniz, lütfen en alttaki \"{{int:ipb-confirm}}\" alanını işaretleyin.",
        "ipb-edit-dropdown": "Engelleme nedenleri düzenle",
        "ipb-unblock-addr": "$1 için engellemeyi kaldır",
-       "ipb-unblock": "Engellemeyi kaldır",
+       "ipb-unblock": "Bir kullanıcı adı veya IP adresinin engellemesini kaldır",
        "ipb-blocklist": "Mevcut olan engellemeleri göster",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} için katkılar",
        "unblockip": "Kullanıcının engellemesini kaldır",
        "unblockiptext": "Daha önceden engellenmiş bir IP adresine ya da kullanıcı adına yazma erişimini geri vermek için aşağıdaki formu kullanın.",
        "ipusubmit": "Bu engellemeyi kaldır",
        "unblocked": "[[User:$1|$1]] - engelleme kaldırıldı",
-       "unblocked-range": "$1 engeli kaldırıldı",
+       "unblocked-range": "$1 adlı kullanıcının engeli kaldırıldı.",
        "unblocked-id": "$1 engeli çıkarıldı",
-       "unblocked-ip": "[[Special:Contributions/$1|$1]] engellenmiştir.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] adlı kullanıcının engeli kaldırıldı.",
        "blocklist": "Engellenmiş kullanıcılar",
        "ipblocklist": "Engellenmiş kullanıcılar",
        "ipblocklist-legend": "Engellenen kullanıcı ara",
        "blocklist-target": "Hedef",
        "blocklist-expiry": "Bitiş tarihi",
        "blocklist-by": "Engeli veren hizmetli",
-       "blocklist-params": "Engel parametreleri",
+       "blocklist-params": "Engelleme parametreleri",
        "blocklist-reason": "Gerekçe",
        "ipblocklist-submit": "Ara",
        "ipblocklist-localblock": "Yerel engelleme",
        "ipblocklist-otherblocks": "Diğer {{PLURAL:$1|engelleme|engellemeler}}",
        "infiniteblock": "Süresiz",
        "expiringblock": "$1 $2 tarihinde doluyor",
-       "anononlyblock": "sadece anonim",
+       "anononlyblock": "yalnızca anonim",
        "noautoblockblock": "otomatik engelleme devre dışı bırakıldı",
-       "createaccountblock": "hesap açımı engellendi",
+       "createaccountblock": "hesap oluşturma devre dışı bırakıldı",
        "emailblock": "e-posta engellendi",
        "blocklist-nousertalk": "kendi mesaj sayfasını değiştiremez",
        "ipblocklist-empty": "Engelleme listesi boş.",
        "ipblocklist-no-results": "İstenen IP adresi ya da kullanıcı adı engellenmedi.",
        "blocklink": "engelle",
-       "unblocklink": "engeli kaldır",
+       "unblocklink": "engellemeyi kaldır",
        "change-blocklink": "engeli değiştir",
        "contribslink": "katkılar",
        "emaillink": "e-posta gönder",
        "autoblocker": "Otomatik olarak engellendiniz çünkü yakın zamanda IP adresiniz \"[[User:$1|$1]]\" kullanıcısı tarafından  kullanılmıştır. $1 isimli kullanıcının engellenmesi için verilen sebep: \"'''$2'''\"",
-       "blocklogpage": "Engel kaydı",
+       "blocklogpage": "Engelleme günlüğü",
        "blocklog-showlog": "Bu kullanıcı daha önceden engellenmiş.\nEngelleme günlüğü referans için aşağıda sağlanmıştır:",
        "blocklog-showsuppresslog": "Bu kullanıcı daha önceden engellenmiş ve gizlenmiş.\nGizleme günlüğü referans için aşağıda sağlanmıştır:",
-       "blocklogentry": ", [[$1]] kullanıcısını engelledi, engelleme süresi: $2 $3",
-       "reblock-logentry": "[[$1]] için bitiş tarihi $2 $3 olmak üzere engelleme ayarlarını değiştirdi",
-       "blocklogtext": "Burada kullanıcı erişimine yönelik engelleme ya da engelleme kaldırma kayıtları listelenmektedir. Otomatik  IP adresi engellemeleri listeye dahil değildir. Şu anda erişimi durdurulmuş kullanıcıları [[Special:BlockList|engelleme listesi]] sayfasından görebilirsiniz.",
-       "unblocklogentry": "$1 kullanıcının engellemesi kaldırıldı",
+       "blocklogentry": ", [[$1]] adlı kullanıcıyı $2 süreyle ve $3 gerekçesiyle engelledi.",
+       "reblock-logentry": ", [[$1]] adlı kullanıcı için engelleme ayarlarını değiştirdi ve bitiş süresini $2 olarak belirledi $3",
+       "blocklogtext": "Bu, kullanıcı engelleme ve engel kaldırma işlemlerinin bir günlüğüdür.\nOtomatik olarak engellenen IP adresleri listelenmemiştir.\nŞu anda geçerli yasaklama ve engellemelerin listesi için [[Special:BlockList|engelleme listesi]]ne bakın.",
+       "unblocklogentry": ", $1 adlı kullanıcının engellemesini kaldırdı",
        "block-log-flags-anononly": "sadece anonim kullanıcılar",
-       "block-log-flags-nocreate": "hesap yaratımı engellendi",
+       "block-log-flags-nocreate": "hesap oluşturma devre dışı bırakıldı",
        "block-log-flags-noautoblock": "Otomatik engelleme iptal edildi",
        "block-log-flags-noemail": "e-posta engellendi",
        "block-log-flags-nousertalk": "kendi mesaj sayfasını değiştiremez",
        "lockdbsuccesssub": "Veritabanı kilitlendi",
        "unlockdbsuccesssub": "Veritabanı kiliti açıldı.",
        "lockdbsuccesstext": "Veritabanı kilitlendi.<br />\nBakımın işleriniz bittiğinde veritabanının [[Special:UnlockDB|kilidini açmayı]] unutmayın.",
-       "unlockdbsuccesstext": "Veritanı kilidi açıldı.",
+       "unlockdbsuccesstext": "Veritabanı kilidi kaldırıldı.",
        "lockfilenotwritable": "Veritabanı kilitleme dosyası yazılabilir değil.\nBu, veritabanını kilitleyip açabilmek için, web sunucusu tarafından yazılabilir olmalıdır.",
        "databasenotlocked": "Veritabanı kilitli değil.",
        "lockedbyandtime": "({{GENDER:$1|$1}} tarafından $2 $3 itibariyle)",
        "cant-move-to-category-page": "Bir sayfayı, bir kategoriye taşımaya izniniz yok.",
        "newtitle": "Yeni başlık:",
        "move-watch": "Bu sayfayı izle",
-       "movepagebtn": "İsmi değiştir",
+       "movepagebtn": "Sayfayı taşı",
        "pagemovedsub": "İsim değişikliği tamamlandı.",
        "movepage-moved": "'''\"$1\",  \"$2\" sayfasına taşındı'''",
        "movepage-moved-redirect": "Bir yönlendirme oluşturuldu.",
        "movepage-page-moved": "$1 sayfası $2 sayfasına taşındı.",
        "movepage-page-unmoved": "$1 sayfası $2 başlığına taşınamıyor.",
        "movepage-max-pages": "En fazla $1 {{PLURAL:$1|sayfa|sayfa}} taşındı ve daha fazlası otomatik olarak taşınamaz.",
-       "movelogpage": "Taşıma kaydı",
+       "movelogpage": "Taşıma günlüğü",
        "movelogpagetext": "Aşağıda bulunan liste adı değiştirilmiş sayfaları gösterir.",
        "movesubpage": "{{PLURAL:$1|Alt sayfa|Alt sayfalar}}",
        "movesubpagetext": "Bu sayfanın aşağıda gösterilen $1 {{PLURAL:$1|altsayfası|altsayfası}} vardır.",
        "export-pagelinks": "Bağlı sayfaları içerecek derinlik:",
        "allmessages": "Sistem iletileri",
        "allmessagesname": "Ad",
-       "allmessagesdefault": "Varsayılan mesaj metni",
+       "allmessagesdefault": "Varsayılan ileti metni",
        "allmessagescurrent": "Kullanımdaki metin",
-       "allmessagestext": "Bu liste  MediaWiki ad alanında mevcut olan sistem mesajlarının listesidir.\nGenel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Yerelleştirmesi] ve [https://translatewiki.net translatewiki.net] sayfalarını ziyaret edin.",
-       "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' kapalı olduğu için '''{{ns:special}}:Allmessages''' kullanıma açık değil.",
+       "allmessagestext": "Bu liste, MediaWiki ad alanında bulunan sistem iletilerinin listesidir.\nGenel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Yerelleştirmesi] ve [https://translatewiki.net translatewiki.net] sayfalarını ziyaret edin.",
+       "allmessagesnotsupportedDB": "Bu sayfa kullanılamıyor, çünkü <strong>$wgUseDatabaseMessages</strong> devre dışı bırakıldı.",
        "allmessages-filter-legend": "Filtre",
        "allmessages-filter": "Özelleştirme durumuna göre filtrele:",
        "allmessages-filter-unmodified": "Değiştirilmemiş",
        "thumbnail_gd-library": "Eksik GD kütüphanesi yapılandırması: kayıp fonksiyon $1",
        "thumbnail_image-missing": "Dosya kayıp gibi görünüyor: $1",
        "thumbnail_image-failure-limit": "Yakın zamanda bu küçük resmin oluşturulması için çok fazla başarısız  girişim oldu ($1 ya da daha fazla). Lütfen daha sonra yeniden deneyin.",
-       "import": "Sayfaları aktar",
+       "import": "Sayfaları içe aktar",
        "importinterwiki": "Başka bir vikiden içe aktar",
        "import-interwiki-text": "İçe aktarmak için bir viki ve sayfa başlığı seçin.\nRevizyon tarihleri ve yazarların isimleri korunacaktır.\nBütün vikilerarası içe aktarım eylemleri [[Special:Log/import|içe aktarım günlüğünde]] kaydedilmektedir.",
        "import-interwiki-sourcewiki": "Kaynak viki:",
        "tooltip-pt-watchlist": "Değişiklikler için izlemeye aldığınız sayfaların listesi",
        "tooltip-pt-mycontris": "{{GENDER:|Katkılarınızın}} listesi",
        "tooltip-pt-anoncontribs": "Bu IP adresinden yapılmış değişiklikler listesi",
-       "tooltip-pt-login": "Oturum açmanız tavsiye edilmektedir; ancak bu zorunda değildir",
+       "tooltip-pt-login": "Oturum açmanız tavsiye edilmektedir; ancak bu zorunlu değildir",
        "tooltip-pt-logout": "Sistemden çık",
        "tooltip-pt-createaccount": "Bir hesap oluşturup oturum açmanız tavsiye edilmektedir ancak bu zorunlu değildir",
        "tooltip-ca-talk": "İçerik ile ilgili tartışma",
        "tooltip-search": "{{SITENAME}} içinde ara",
        "tooltip-search-go": "Eğer varsa, aynı isimli sayfaya gidin",
        "tooltip-search-fulltext": "Sayfalarda bu metni ara",
-       "tooltip-p-logo": "Ana sayfayı ziyaret edin",
+       "tooltip-p-logo": "Anasayfayı ziyaret edin",
        "tooltip-n-mainpage": "Ana sayfaya git",
-       "tooltip-n-mainpage-description": "Ana sayfaya git",
+       "tooltip-n-mainpage-description": "Anasayfayı ziyaret et",
        "tooltip-n-portal": "Proje hakkında, neler yapabilirsiniz, ne nerdedir",
        "tooltip-n-currentevents": "Güncel olaylarla ilgili son bilgiler",
        "tooltip-n-recentchanges": "Vikide yapılmış son değişikliklerin listesi",
        "markedaspatrollederror-noautopatrol": "Kendi değişikliklerinizi kontrol edilmiş olarak işaretleyemezsiniz.",
        "markedaspatrollednotify": "$1 için bu değişiklik kontrol edildi olarak işaretlendi.",
        "markedaspatrollederrornotify": "Kontrol edildi olarak işaretleme başarısız oldu.",
-       "patrol-log-page": "Kontrol kaydı",
+       "patrol-log-page": "Devriye günlüğü",
        "patrol-log-header": "Bu gözlenmiş revizyonların günlüğüdür.",
        "log-show-hide-patrol": "Gözetim günlüğünü $1",
-       "log-show-hide-tag": "$1 Etiket günlüğü",
+       "log-show-hide-tag": "Etiket günlüğünü $1",
        "deletedrevision": "$1 sayılı eski sürüm silindi.",
        "filedeleteerror-short": "$1 dosyanın silinmesinde hata oldu",
        "filedeleteerror-long": "Dosyayı silerken hatalarla karşılaşıldı:\n\n$1",
        "scarytranscludefailed-httpstatus": "[$1 için şablon alımı başarısız oldu: HTTP $2]",
        "scarytranscludetoolong": "[URL çok uzun]",
        "deletedwhileediting": "'''Uyarı''': Bu sayfa siz değişiklik yapmaya başladıktan sonra silinmiş!",
-       "confirmrecreate": "Bu sayfayı [[User:$1|$1]] ([[User talk:$1|mesaj]]) kullanıcısı siz sayfada değişiklik yaparken silmiştir, nedeni:\n: ''$2''\nSayfayı baştan açmak isityorsanız, lütfen onaylayın.",
+       "confirmrecreate": "Bu sayfayı [[User:$1|$1]] ([[User talk:$1|mesaj]]) kullanıcısı siz sayfada değişiklik yaparken silmiştir, nedeni:\n: ''$2''\nSayfayı baştan açmak istiyorsanız, lütfen onaylayın.",
        "confirmrecreate-noreason": "[[User:$1|$1]] ([[User talk:$1|mesaj]]) adlı kullanıcı, siz değişiklik yapmaya başladıktan sonra bu sayfayı sildi. Lütfen bu sayfayı gerçekten yeniden oluşturmak istediğinizi onaylayın.",
        "recreate": "Canlandır",
        "unit-pixel": "px",
+       "confirm-purge-title": "Bu sayfayı temizle",
        "confirm_purge_button": "Tamam",
        "confirm-purge-top": "Sayfa önbelleği temizlensin mi?",
-       "confirm-purge-bottom": "Bir sayfayı tasfiye etmek önbelleği temizler ve en güncel sürümün görünmesine zorlar.",
+       "confirm-purge-bottom": "Sayfa temizleme işlemi önbelleğin temizlenmesini sağlar ve güncel sürümü görünmeye zorlar.",
        "confirm-watch-button": "TAMAM",
        "confirm-watch-top": "Bu sayfayı izleme listenize ekleyin",
        "confirm-unwatch-button": "TAMAM",
        "table_pager_limit_label": "Sayfa başına öğe:",
        "table_pager_limit_submit": "Git",
        "table_pager_empty": "Sonuç yok",
-       "autosumm-blank": "Sayfayı boşalttı",
-       "autosumm-replace": "Sayfa içeriği '$1' ile değiştiriliyor",
+       "autosumm-blank": "Sayfa boşaltıldı",
+       "autosumm-replace": "Sayfa içeriği '$1' ile değiştirildi",
        "autoredircomment": "[[$1]] sayfasına yönlendirildi",
-       "autosumm-new": "Yeni sayfa: \"$1\"",
+       "autosumm-new": "\"$1\" içeriğiyle yeni sayfa oluşturdu",
        "autosumm-newblank": "Boş bir sayfa oluşturdu",
        "lag-warn-normal": "$1 {{PLURAL:$1|saniyeden|saniyeden}} yeni değişiklikler bu listede görünmeyebilir.",
        "lag-warn-high": "Veritabanı sunucusundaki aşırı gecikmeden dolayı, $1 {{PLURAL:$1|saniyeden|saniyeden}} yeni değişiklikler bu listede görünmeyebilir.",
        "watchlisttools-edit": "İzleme listesini gör ve düzenle",
        "watchlisttools-raw": "Ham izleme listesini düzenle",
        "hijri-calendar-m1": "Muharrem",
+       "hijri-calendar-m7": "Recep",
        "hijri-calendar-m8": "Şaban",
        "hijri-calendar-m9": "Ramazan",
        "hijri-calendar-m10": "Şevval",
        "specialpages-group-maintenance": "Bakım raporları",
        "specialpages-group-other": "Diğer özel sayfalar",
        "specialpages-group-login": "Oturum aç / hesap edin",
-       "specialpages-group-changes": "Son değişiklikler ve kayıtlar",
+       "specialpages-group-changes": "Son değişiklikler ve günlükler",
        "specialpages-group-media": "Dosya raporları ve yüklemeler",
        "specialpages-group-users": "Kullanıcılar ve hakları",
        "specialpages-group-highuse": "Çok kullanılan sayfalar",
        "revdelete-uname-unhid": "kullanıcı adı gösterildi",
        "revdelete-restricted": "hizmetliler için uygulanmış kısıtlamalar",
        "revdelete-unrestricted": "hizmetliler için kaldırılmış kısıtlamalar",
-       "logentry-block-block": "$1 {{GENDER:$2|engelledi}} {{GENDER:$4|$3}} engelleme süresi: $5 $6",
-       "logentry-block-unblock": "$1 kullanıcısının {{GENDER:$2|engeli kaldırıldı}} {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1, {{GENDER:$4|$3}} kullanıcısının engellenme süresini $5 $6 olarak {{GENDER:$2|değiştirdi}}",
+       "logentry-block-block": "$1, {{GENDER:$4|$3}} adlı kullanıcıyı $5 süreyle {{GENDER:$2|engelledi}} $6",
+       "logentry-block-unblock": "$1, {{GENDER:$4|$3}} adlı kullanıcının {{GENDER:$2|engelini kaldırdı}}",
+       "logentry-block-reblock": "$1, {{GENDER:$4|$3}} adlı kullanıcının engellenme süresini $5 olarak {{GENDER:$2|değiştirdi}} $6",
        "logentry-suppress-block": "{{GENDER:$4|$3}} $1 tarafından {{GENDER:$2|engellendi}} Zamanaşımı: $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} engelleme süresi $5 $6",
        "logentry-import-upload": "$1 dosya yükleme ile {{GENDER:$2|içe aktardı}}: $3",
        "logentry-newusers-newusers": "Kullanıcı hesabı $1 {{GENDER:$2|oluşturuldu}}",
        "logentry-newusers-create": "Kullanıcı hesabı $1 {{GENDER:$2|oluşturuldu}}",
        "logentry-newusers-create2": "$3 kullanıcı hesabı $1 tarafından {{GENDER:$2|oluşturuldu}}",
-       "logentry-newusers-byemail": "$3 kullanıcı hesabı $1 tarafından {{GENDER:$2|oluşturuldu}} ve şifre e-posta ile gönderildi",
+       "logentry-newusers-byemail": "$3 kullanıcı hesabı $1 tarafından {{GENDER:$2|oluşturuldu}} ve parola e-posta ile gönderildi",
        "logentry-newusers-autocreate": "$1 kullanıcı hesabı otomatik olarak {{GENDER:$2|oluşturuldu}}",
+       "logentry-protect-move_prot": "$1, koruma ayarlarını $4 adlı sayfadan $3 adlı sayfaya {{GENDER:$2|taşıdı}}",
+       "logentry-protect-unprotect": "$1, $3 adlı sayfanın korumasını {{GENDER:$2|kaldırdı}}",
+       "logentry-protect-protect": "$1, $3 adlı sayfayı {{GENDER:$2|korumaya aldı}} $4",
+       "logentry-protect-protect-cascade": "$1, $3 adlı sayfayı {{GENDER:$2|korumaya aldı}} $4 [kademeli]",
+       "logentry-protect-modify": "$1, $3 adlı sayfa için koruma düzeyini {{GENDER:$2|değiştirdi}} $4",
+       "logentry-protect-modify-cascade": "$1, $3 adlı sayfa için koruma düzeyini {{GENDER:$2|değiştirdi}} $4 [kademeli]",
        "logentry-rights-rights": "$1, $3 için grup üyeliğini $4 iken $5 olarak {{GENDER:$2|değiştirdi}}",
        "logentry-rights-rights-legacy": "$1, $3 için grup üyeliğini {{GENDER:$2|değiştirdi}}",
        "logentry-rights-autopromote": "$1, $4 iken $5 olarak otomatik {{GENDER:$2|terfi edildi}}",
        "logentry-tag-update-revision": "$1, $3 sayfasının $4 numaralı sürümündeki etiketleri  {{GENDER:$2|güncelledi}}. Eklenen {{PLURAL:$7|etiket|etiket}}: $6; kaldırılan {{PLURAL:$9|etiket|etiket}}: $8",
        "logentry-tag-update-logentry": "$1, $3 sayfasının $5 numaralı günlük kaydındaki etiketleri {{GENDER:$2|güncelledi}}. Eklenen {{PLURAL:$7|etiket|etiket}}: $6; kaldırılan {{PLURAL:$9|etiket|etiket}}: $8",
        "rightsnone": "(hiçbiri)",
-       "revdelete-summary": "değişiklik özeti",
+       "rightslogentry-temporary-group": "$1 ($3 günü $4 saatine kadar geçici)",
        "feedback-adding": "Sayfaya geribildirim ekleniyor...",
        "feedback-back": "Geri",
        "feedback-bugcheck": "Harika! Sadece [bilinen $1 hatalarından] olmadığını kontrol et.",
        "feedback-thanks": "Teşekkürler! Görüşleriniz \"[$2 $1]\" sayfasında paylaşılmıştır.",
        "feedback-thanks-title": "Teşekkürler!",
        "feedback-useragent": "Kullanıcı temsilcisi",
-       "searchsuggest-search": "Ara",
+       "searchsuggest-search": "{{SITENAME}} üzerinde ara",
        "searchsuggest-containing": "içeren...",
        "api-error-badtoken": "İç hata: Bozuk anahtar.",
        "api-error-emptypage": "Yeni, boş bir sayfa oluşturmaya izin verilmez.",
        "api-error-stashfailed": "İç hata: Sunucu, geçici dosyaları kaybetti.",
        "api-error-unknown-warning": "Bilinmeyen uyarı: $1",
        "api-error-unknownerror": "Bilinmeyen hata: \"$1\".",
-       "duration-seconds": "$1 {{PLURAL:$1|saniye|saniye}}",
+       "duration-seconds": "$1 saniye",
        "duration-minutes": "$1 {{PLURAL:$1|dakika|dakika}}",
        "duration-hours": "$1 {{PLURAL:$1|saat|saat}}",
        "duration-days": "$1 {{PLURAL:$1|gün|gün}}",
        "headline-anchor-title": "Bu bölüme bağlantı",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Genişletilmiş Latince",
-       "special-characters-group-ipa": "UFA",
+       "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Simgeler",
        "special-characters-group-greek": "Yunan",
        "special-characters-group-greekextended": "Genişletilmiş Yunanca",
        "mw-widgets-mediasearch-noresults": "Sonuç bulunamadı.",
        "mw-widgets-titleinput-description-new-page": "sayfa henüz mevcut değil",
        "mw-widgets-titleinput-description-redirect": "$1'e yönlendirildi",
+       "mw-widgets-categoryselector-add-category-placeholder": "Bir kategori ekle...",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "çerez tabanlı oturumlar",
        "sessionprovider-nocookies": "Çerezler devre dışı olabilir. Çerkezlerin aktif olduğuna emin olun ve yeniden başlatin.",
        "randomrootpage": "Rastgele kök sayfası",
        "log-action-filter-block": "Blok türü:",
        "log-action-filter-delete": "Silme türü:",
+       "log-action-filter-newusers": "Hesap oluşturma türü:",
        "log-action-filter-patrol": "Devriye türü:",
        "log-action-filter-protect": "Koruma tipi:",
        "log-action-filter-rights": "Hak türü seçimi:",
index a32a979..3af41fc 100644 (file)
        "yourpasswordagain": "Naqla ḥreto kṭaw uQliḍo:",
        "login": "3bar",
        "nav-login-createaccount": "3bar / Hway Hadomo",
-       "userlogin": "3bar / Hway Hadomo",
-       "userloginnocreate": "3bar",
        "logout": "Nfoqo",
        "userlogout": "Nfoqo",
        "notloggedin": "Heş lo3abirat.",
-       "nologin": "Heş lawit Hadomo? $1",
-       "nologinlink": "Hway Hadomo",
        "createaccount": "Hway Hadomo",
-       "gotaccount": "Ma hawit ste Hadomo? $1",
-       "gotaccountlink": "3bar",
-       "userlogin-resetlink": "Ṫa³at uQliḍayḍox?",
        "createaccountmail": "buEmail",
        "wrongpassword": "uQliḍayḍux fawdo yo.\nMjarab Naqla ḥreto.",
        "wrongpasswordempty": "Lo msta³melux uQliḍayḍux.\nMjarab Naqla ḥreto.",
        "rcshowhideanons": "$1 Hadomo nuxroyo",
        "rcshowhidepatr": "$1 patrolled edits",
        "rcshowhidemine": "aMaṫwoṭayḍi ($1)",
-       "rclinks": "Maḥway li $1 aŞuḥlofe ḥaroye men meqım $2 Yawme hul u³do. <br />$3",
+       "rclinks": "Maḥway li $1 aŞuḥlofe ḥaroye men meqım $2 Yawme hul u³do.",
        "diff": "Frişuṭo",
        "hist": "Maktabzabno",
        "hide": "Tlay",
index 6d971d5..fb9184f 100644 (file)
        "yourpasswordagain": "Thlela u hoxa ritompfungulo ra wena:",
        "login": "Pfula u nghena",
        "nav-login-createaccount": "Pfula unghena / Tumbuluxa akhawunti",
-       "userlogin": "Pfula unghena / Tumbuluxa akhawunti",
-       "userloginnocreate": "Pfula unghena",
        "logout": "Pfala u famba",
        "userlogout": "Pfala u famba",
        "notloggedin": "A wusipfula unghena",
-       "nologin": "Xana upfumala akhawunti? $1.",
-       "nologinlink": "Tumbuluxa akhawunti",
        "createaccount": "Tumbuluxa akhawunti",
-       "gotaccount": "Xna una akhawunti hi khale? $1.",
-       "gotaccountlink": "Pfula unghena",
-       "userlogin-resetlink": "Xana u rivele vuxokoxoko bya wena byo pfula unghena?",
-       "createaccountreason": "Xivangelo:",
        "loginsuccess": "'''Ule ndzeni ka {{SITENAME}} tani hi \"$1\".'''",
        "mailmypassword": "Rhumela vito-mpfungulo lerintwsa",
        "loginlanguagelabel": "Ririmi: $1",
        "rcshowhideanons": "$1 wa vatirhisi lava tumbeleke",
        "rcshowhidepatr": "$1 mundzulamiso leyi languteriweke",
        "rcshowhidemine": "$1 wa mindzulamiso ya mina",
-       "rclinks": "Kumba $1 ya ku cinca eka $2 wa masiku lamahundzeke<br />$3",
+       "rclinks": "Kumba $1 ya ku cinca eka $2 wa masiku lamahundzeke",
        "diff": "Hamban",
        "hist": "Matimu",
        "hide": "Tumbeta",
index f907c59..6b8aeed 100644 (file)
@@ -45,7 +45,7 @@
        "tog-watchdefault": "Мин үзгәрткән битләр һәм файллар күзәтү исемлегемә өстәлсен",
        "tog-watchmoves": "Мин күчергән битләр һәм файллар күзәтү исемлегемә өстәлсен",
        "tog-watchdeletion": "Мин бетергән битләр һәм файлларны күзәтү исемлегемгә өстәлсен",
-       "tog-watchuploads": "Минем тарафтан йөкләнелгән файлларны күзәтү исемлегемә кертергә",
+       "tog-watchuploads": "Минем тарафтан йөкләнелгән файлларны күзәтү исемлегемә кертелсен",
        "tog-watchrollback": "Мин үткәрмәгән битләрне күзәтү исемлегемә өстәргә",
        "tog-minordefault": "Барлык үзгәртүләрне килешү буенча кече дип билгеләнсен",
        "tog-previewontop": "Үзгәртү тәрәзәсеннән өстәрәк битне алдан карау өлкәсен күрсәтелсен",
@@ -71,8 +71,8 @@
        "tog-diffonly": "Юрама чагыштыру астында бит эчтәлеге күрсәтелмәсен",
        "tog-showhiddencats": "Яшерен төркемнәр күрсәтелсен",
        "tog-norollbackdiff": "Кире кайтару ясагач юрамалар аермасы күрсәтелмәсен",
-       "tog-useeditwarning": "Битне сакламыйча китү вакытында мине кисәтергә",
-       "tog-prefershttps": "Системага керргәндә һәрвакыт саклаулы тоташуны кулланырга",
+       "tog-useeditwarning": "Битне сакламыйча киткәндә мине кисәтергә",
+       "tog-prefershttps": "Системага кергәндә һәрвакыт саклаулы тоташу кулланылсын",
        "underline-always": "Һәрвакыт",
        "underline-never": "Бервакытта да",
        "underline-default": "Браузер көйләнмәләре кулланылсын",
        "view": "Карау",
        "view-foreign": "$1 сәхифәсендә карау",
        "edit": "Үзгәртү",
-       "edit-local": "Локаль тасвирламаны үзгәртергә",
+       "edit-local": "Локаль тасвирламаны үзгәртү",
        "create": "Төзү",
-       "create-local": "Локаль тасвирлама өстәргә",
+       "create-local": "Локаль тасвирлама өстәү",
        "editthispage": "Бу битне үзгәртү",
        "create-this-page": "Бу битне төзү",
        "delete": "Бетерү",
        "deletethispage": "Бу битне бетерү",
-       "undeletethispage": "Ð\91Ñ\83 Ð±Ð¸Ñ\82не ÐºÐ°Ð¹Ñ\82аÑ\80Ñ\8bÑ\80га",
+       "undeletethispage": "Ð\91Ñ\83 Ð±Ð¸Ñ\82не ÐºÐ°Ð¹Ñ\82аÑ\80Ñ\83",
        "undelete_short": "$1 {{PLURAL:$1|төзәтмәне|$1 төзәтмә}} торгызу",
        "viewdeleted_short": "{{PLURAL:$1|1=1 бетерелгән үзгәртүне|$1 бетерелгән үзгәртүне}} карау\n{{PLURAL:$1|бетерелгән төзәтмәне|$1 бетерелгән төзәтмәне}} карау",
        "protect": "Яклау",
        "redirectedfrom": "($1 битеннән юнәлтелде)",
        "redirectpagesub": "Башка биткә юнәлтү бите",
        "redirectto": "Шунда юнәлтелә:",
-       "lastmodifiedat": "Бу битне соңгы үзгәртү: $2, $1.",
+       "lastmodifiedat": "Бу бит соңгы тапкыр $2 $1 үзгәртелә.",
        "viewcount": "Бу биткә $1 {{PLURAL:$1|бер тапкыр|$1 тапкыр}} мөрәҗәгать иттеләр.",
        "protectedpage": "Якланган бит",
        "jumpto": "Моңа күчү:",
        "createacct-yourpasswordagain-ph": "Серсүзне кабаттан кертегез",
        "userlogin-remembermypassword": "Системада калырга",
        "userlogin-signwithsecure": "Якланган кушылу",
-       "yourdomainname": "Сезнең Ð´оменыгыз:",
+       "yourdomainname": "Ð\94оменыгыз:",
        "password-change-forbidden": "Сез бу викидә серсүзне үзгәртә алмыйсыз.",
        "externaldberror": "Тышкы мәгълүмат базасы ярдәмендә аутентификация үткәндә хата чыкты, яисә тышкы хисап язмагызга үзгәрешләр кертү хокукыгыз юк.",
        "login": "Керү",
        "login-security": "Шәхесегезне раслагыз",
        "nav-login-createaccount": "Керү / теркәлү",
-       "userlogin": "Керү / теркәлү",
-       "userloginnocreate": "Керү",
        "logout": "Чыгу",
        "userlogout": "Чыгу",
        "notloggedin": "Сез хисап язмагызга кермәгәнсез",
        "userlogin-noaccount": "Хисап язмагыз юкмы?",
        "userlogin-joinproject": "{{SITENAME}} проектына керү",
-       "nologin": "Кулланучы исемең юкмы? '''$1'''",
-       "nologinlink": "Хисап язмасы төзү",
        "createaccount": "Яңа кулланучыны теркәү",
-       "gotaccount": "Сез инде теркәлдегезме? '''$1'''.",
-       "gotaccountlink": "Керү",
-       "userlogin-resetlink": "Серсүзегезне оныттыгызмы?",
-       "userlogin-resetpassword-link": "Серсүзне алыштырыргамы?",
+       "userlogin-resetpassword-link": "Серсүзегезне оныттыгызмы?",
        "userlogin-helplink2": "Керү буенча ярдәм",
        "userlogin-createanother": "Башка хисап язмасы төзү",
        "createacct-emailrequired": "Электрон почта юлламагыз",
        "createacct-another-email-ph": "Электрон почта юлламагызны кертегез",
        "createaccountmail": "Очраклы рәвештә ясалган ваҡытлыча серсузне файдаланырга һәм аны минем электрон почтама җибәрергә",
        "createacct-realname": "Чын исем (мәҗбүри түгел)",
-       "createaccountreason": "Сәбәп:",
        "createacct-reason": "Сәбәп",
        "createacct-reason-ph": "Нигә сез яңа зисап язмасы төзисез",
        "createacct-submit": "Хисап язмасы төзү",
        "anonpreviewwarning": "''Сез системада теркәлмәдегез.Сезнең тарафтан эшләнгән барлык үзгәртүләр дә сезнең IP-юлламагызны саклауга китерә.''",
        "missingsummary": "'''Искәртү.''' Сез үзгәртүгә кыскача тасвирлау язмадыгыз. Сез «Битне саклау» төймәсенә тагын бер тапкыр бассагыз, үзгәртүләр тасвирламасыз сакланачак.",
        "missingcommenttext": "Аска тасвирлама язуыгыз сорала.",
-       "missingcommentheader": "<strong>Искәртү:</strong> Сез шәрехнең темасын күрсәтмәгәнсез.\n«{{int:savearticle}}» төймәсенә кабат бассагыз, үзгәртүләр темасыз язылачак.",
-       "summary-preview": "Тасвирламаны алдан карау:",
-       "subject-preview": "Башисем шушындый булачак:",
+       "missingcommentheader": "<strong>Искәртү:</strong> Сез шәрехнең темасын күрсәтмәгәнсез.\n«$1» төймәсенә кабат бассагыз, үзгәртүләр темасыз язылачак.",
+       "summary-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Хатларда бу мәгълүматны күрсәтергә онытмагыз.",
        "nosuchsectiontitle": "Мондый бүлекне табып булмый.",
        "nosuchsectiontext": "Сез булмаган бүлекне төзәтергә телисез.\nСез бу сәхифәне караганда ул бетерелә алды.",
        "loginreqtitle": "Керү кирәк",
-       "loginreqlink": "керергә",
+       "loginreqlink": "керү",
        "loginreqpagetext": "Сез башка битләр карау өчен $1 тиеш.",
        "accmailtitle": "Серсүз җибәрелде.",
        "accmailtext": "[[User talk:$1|$1]] кулланучысы өчен төзелгән серсүз $2 адресына җибәрелде.\n\nАвторизация узгач, үз хисап язмагызда сез ''[[Special:ChangePassword|серсүзегезне үзгәртә аласыз]]''.",
        "editingsection": "«$1» битендә бүлек үзгәртүе",
        "editingcomment": "«$1» битен үзгәртү (яңа бүлек)",
        "editconflict": "Үзгәртү конфликты: $1",
-       "explainconflict": "Сез бу битне төзәткән вакытта кемдер аңа үзгәрешләр кертте.\nӨстәге тәрәзәдә Сез хәзерге текстны күрәсез.\nАстагы тәрәзәдә Сезнең вариант урнашкан.\nЭшләгән үзгәртүләрегезне астагы тәрәзәдән өстәгенә күчерегез.\n«{{int:savearticle}}» төймәсенә баскач өстәге битнең тексты сакланаячак.",
+       "explainconflict": "Сез бу битне төзәткән вакытта кемдер аңа үзгәрешләр кертте.\nӨстәге тәрәзәдә Сез хәзерге текстны күрәсез.\nАстагы тәрәзәдә Сезнең вариант урнашкан.\nЭшләгән үзгәртүләрегезне астагы тәрәзәдән өстәгенә күчерегез.\n«$1» төймәсенә баскач өстәге битнең тексты сакланаячак.",
        "yourtext": "Сезнең текст",
        "storedversion": "Сакланган юрама",
        "nonunicodebrowser": "'''Кисәтү: Сезнең браузер Юникод кодлавын танымый.'''\nҮзгәртү вакытында ASCII булмаган символлар махсус уналтылы кодларга алыштырылачак.",
        "page_first": "беренче",
        "page_last": "соңгы",
        "histlegend": "Аңлатмалар: '''({{int:cur}})''' = хәзерге юрамадан аерымлыклар, '''({{int:last}})''' = баягы юрамадан аерымлыклар, '''{{int:minoreditletter}}''' = кече үзгәртүләр.",
-       "history-fieldset-title": "Тарихын карау",
-       "history-show-deleted": "Бары тик бетерү",
+       "history-fieldset-title": "Үзгәртүләрне эзләү",
+       "history-show-deleted": "Бары тик бетерелгән төзәтмәләр",
        "histfirst": "иң иске",
        "histlast": "иң яңа",
        "historysize": "($1 {{PLURAL:$1|байт}})",
        "search-category": "($1 категориясе)",
        "search-file-match": "(файл эчтәлеге белән туры килә)",
        "search-suggest": "Бәлки, сез моны эзлисез: $1",
-       "search-interwiki-caption": "Тугандаш проектлар",
+       "search-interwiki-caption": "Тугандаш проектлар нәтиҗәсе",
        "search-interwiki-default": "$1 нәтиҗә:",
        "search-interwiki-more": "(тагын)",
        "search-relatedarticle": "Бәйле",
        "search-nonefound": "Сорауга туры килгән нәтиҗәләр табылмады.",
        "powersearch-legend": "Өстәмә эзләү",
        "powersearch-ns": "исемнәрендә эзләү",
-       "powersearch-togglelabel": "ТамгалаÑ\80га:",
+       "powersearch-togglelabel": "ТамгалаÑ\83:",
        "powersearch-toggleall": "Барысы",
        "powersearch-togglenone": "Берни юк",
-       "powersearch-remember": "Сайланганны алдагы эзләүләр өчен истә калдырырга",
+       "powersearch-remember": "Сайланган алдагы эзләүләр өчен истә калдырылсын",
        "search-external": "Читтән эзләү",
        "search-error": "Эзләгән вакытта хата килеп чыкты:$1",
        "preferences": "Көйләнмәләр",
        "prefs-editwatchlist-edit": "Күзәтү исемлегеннән исемнәрне карау һәм сөртү",
        "prefs-editwatchlist-raw": "Күзәтү исемлеген текстсыман үзгәртү",
        "prefs-editwatchlist-clear": "Күзәтү исемлеген чистарту",
-       "prefs-watchlist-days": "Күзәтү исемлегендә көннәр санын күрсәтергә:",
+       "prefs-watchlist-days": "Күзәтү исемлегендә күрсәтелгән көннәр саны:",
        "prefs-watchlist-days-max": "Иң күбе $1 {{PLURAL:$1|1=көн|көн}}",
        "prefs-watchlist-edits": "Киңәйтелгән күзәтү исемлегендә күрсәтелүче төзәтмәләрнең максималь саны:",
        "prefs-watchlist-edits-max": "Максимум сан: 1000",
        "prefs-displaywatchlist": "Күрсәтү көйләнмәләре",
        "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Юрамалар аермасы",
-       "userrights": "Кулланучы хокуклары белән идарә итү",
+       "userrights": "Кулланучы хокуклары",
        "userrights-lookup-user": "Кулланучыны сайлау",
        "userrights-user-editname": "Кулланучының исемен кертегез:",
        "editusergroup": "Кулланучының төркемнәрен кую",
        "editinguser": "{{GENDER:$1|Кулланучы}} <strong>[[User:$1|$1]]</strong> $2 хокукларын үзгәртү",
-       "userrights-editusergroup": "Кулланучының төркемнәрен алмаштыру",
+       "userrights-editusergroup": " {{GENDER:$1|Кулланучының}} төркемнәрен алмаштыру",
        "saveusergroups": "{{GENDER:$1|Кулланучы}} төркемнәрен саклау",
        "userrights-groupsmember": "Әгъза:",
        "userrights-groupsmember-auto": "Билгесез әгъза:",
        "right-movefile": "файлларның исемен алмаштыру",
        "right-suppressredirect": "Элекке исемнән юнәлтү ясамыйча исемне алмаштыру",
        "right-upload": "файлларны йөкләү",
-       "right-reupload": "Булган файллар өстеннән язарга",
+       "right-reupload": "Булган файллар өстеннән язу",
        "right-writeapi": "Язма өчен API куллану",
        "right-delete": "битләрне бетерү",
        "right-browsearchive": "Бетерелгән битләрне эзләү",
        "right-undelete": "Битләрне торгызу",
+       "right-suppressionlog": "Шәхси журналларны карау",
        "right-editinterface": "Кулланучы интерфейсын үзгәртү",
        "grant-group-email": "Хатлар җибәрү",
        "grant-uploadfile": "Яңа файллар йөкләү",
        "newuserlogpage": "Кулланучыларны теркәү көндәлеге",
        "newuserlogpagetext": "Яңа теркәлгән кулланучылар исемлеге",
        "rightslog": "Кулланучының хокуклары көндәлеге",
-       "action-read": "бÑ\83 Ð±Ð¸Ñ\82не Ñ\83кÑ\8bÑ\80га",
-       "action-edit": "бу битне үзгәртергә",
+       "action-read": "бÑ\83 Ð±Ð¸Ñ\82не Ñ\83кÑ\83",
+       "action-edit": "бу битне үзгәртү",
        "action-createpage": "бу битне төзү",
        "action-createtalk": "бу бәхәс битен төзү",
-       "action-move": "бу битне күчерерге",
+       "action-move": "бу битне күчерергә",
        "action-sendemail": "электрон хат җибәрү",
        "nchanges": "$1 {{PLURAL:$1|үзгәртү}}",
        "enhancedrc-history": "тарих",
        "recentchanges-legend-heading": "<strong>Аңлатма:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (шулай ук [[Special:NewPages|яңа битләр исемлеген]] карагыз)",
        "recentchanges-submit": "Күрсәт",
+       "rcfilters-clear-all-filters": "Барлык филтерләрне чистарту",
+       "rcfilters-filter-registered-label": "Теркәлгән",
+       "rcfilters-filter-registered-description": "Теркәлгән мөхәррирләр.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Тәҗрибәле кулланучылар",
+       "rcfilters-filter-humans-label": "Кеше (бот түгел)",
+       "rcfilters-filter-minor-description": "«Кече үзгәртү» дип тамгаланган үзгәртүләр",
+       "rcfilters-filter-pageedits-label": "Бит үзгәртүләре",
+       "rcfilters-filter-newpages-label": "Бит төзүләре",
+       "rcfilters-filter-logactions-label": "Беркетмәләнә торган гамәлләр",
+       "rcfilters-filter-logactions-description": "Административ гамәлләр, хисап язмасын төзүләр, битне бетерүләр, файл йөкләүләр...",
        "rcnotefrom": "Астарак <strong>$3, $4</strong> өчен {{PLURAL:$5|үзгәртүләр күрсәтелгән}} (<strong>$1</strong> артык түгел).",
        "rclistfrom": "$3 $2 башлап яңа үзгәртүләрне күрсәт",
        "rcshowhideminor": "кече үзгәртүләрне $1",
        "rcshowhidecategorization": "битләрне төркемләүне $1",
        "rcshowhidecategorization-show": "Күрсәт",
        "rcshowhidecategorization-hide": "Яшер",
-       "rclinks": "Соңгы $2 көн эчендә ясалган $1 үзгәртүне күрсәт<br />$3",
+       "rclinks": "Соңгы $2 көн эчендә ясалган $1 үзгәртүне күрсәт",
        "diff": "аерма",
        "hist": "тарих",
        "hide": "Яшер",
        "emailtarget": "Кулланучы-хатны алучының исемен языгыз",
        "emailusername": "Кулланучы исеме:",
        "emailusernamesubmit": "Җибәрү",
-       "email-legend": "{{SITENAME}} проектының башка кулланучысына хат җибәрергә",
+       "email-legend": "{{SITENAME}} проектының башка кулланучысына хат җибәрү",
        "emailfrom": "Кемнән:",
        "emailto": "Кемгә:",
        "emailsubject": "Тема:",
        "undeleteviewlink": "карау",
        "undeleteinvert": "Киресен сайлау",
        "undeletecomment": "Сәбәп:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|үзгәреш}} яңадан {{PLURAL:$1|торгызылды}}",
        "undelete-search-submit": "Эзләү",
        "undelete-error-long": "Файлны торгызу вакытында хаталар чыкты:\n\n$1",
        "undelete-show-file-submit": "Әйе",
        "logentry-newusers-autocreate": "{{GENDER:$2|кулланучының}} автоматик рәвештә $1 хисап язмасы төзелде",
        "logentry-upload-upload": "$1 {{GENDER:$2|йөкләде}} $3",
        "rightsnone": "(юк)",
-       "revdelete-summary": "үзгәртүләр тасвирламасы",
        "feedback-adding": "Фикерне сәхифәгә өстәү ...",
        "feedback-back": "Артка",
        "feedback-bugnew": "Мин тикшердем. Яңа хата турында хәбәр итү",
        "special-characters-group-thai": "Тай",
        "special-characters-group-lao": "Лаос",
        "special-characters-group-khmer": "Кһмер",
+       "special-characters-group-canadianaboriginal": "Канада иҗек язуы",
        "log-action-filter-all": "Барысы",
        "log-action-filter-block-block": "Тыю",
        "authmanager-email-label": "Электрон почта",
index 8e77204..ce1929b 100644 (file)
        "externaldberror": "Tışqı mäğlümat bazası yärdämendä awtentifikatsiä ütkändä xata çıqtı, yäisä tışqı xisap yazmağızğa üzgäreşlär kertü xoquqığız yuq.",
        "login": "Kerü",
        "nav-login-createaccount": "Kerü / terkälü",
-       "userlogin": "Kerü / terkälü",
-       "userloginnocreate": "Kerü",
        "logout": "Çığu",
        "userlogout": "Çığu",
        "notloggedin": "Sez xisap yazmağızğa kermägänsez",
-       "nologin": "Qullanuçı isemeñ yuqmı? '''$1'''",
-       "nologinlink": "Xisap yazması tözegez",
        "createaccount": "Yaña qullanuçı terkäw",
-       "gotaccount": "Sez inde terkäldegezme? '''$1'''.",
-       "gotaccountlink": "Kerü",
        "userlogin-resetpassword-link": "Sersüzegezne onıttığızmı?",
        "createacct-emailrequired": "Email adresı",
        "createacct-emailoptional": "Email adresı (kürsätü mäcbür tügel)",
        "createacct-another-email-ph": "Elektron xatlaşu adresığıznı kertegez",
        "createaccountmail": "Waqıtlıça oçraqlı sersüz qullan häm anı kürsätelgän elektron xatlaşu adresına yulla",
        "createacct-realname": "Çın isemegez (kürsätü mäcbüri tügel)",
-       "createaccountreason": "Säbäp:",
        "createacct-reason": "Säbäp",
        "createacct-reason-ph": "İkençe xisap yazmanı buldıru säbäben",
        "createacct-submit": "Xisap yazmağıznı tözegez",
        "anonpreviewwarning": "''Sez sistemada terkälmädegez.Sezneñ taraftan eşlängän barlıq üzgärtülär dä sezneñ IP-yullamağıznı saqlawğa kiterä.''",
        "missingsummary": "'''İskärtü.''' Sez üzgärtügä qısqaça taswirlaw yazmadığız. Sez «Bitne saqlaw» töymäsenä tağın ber tapqır bassağız, üzgärtülär taswirlamasız saqlanaçaq.",
        "missingcommenttext": "Asqa taswirlama yazuığız sorala.",
-       "missingcommentheader": "''İskärtü:''' Sez taswirlamağa isem birmädegez.\n«{{int:savearticle}}» töymäsenä qabat bassağız, üzgärtülär isemsez yazılaçaq.",
+       "missingcommentheader": "''İskärtü:''' Sez taswirlamağa isem birmädegez.\n«$1» töymäsenä qabat bassağız, üzgärtülär isemsez yazılaçaq.",
        "summary-preview": "Taswirlamanı aldan qaraw:",
        "subject-preview": "Başisemne aldan qaraw:",
        "blockedtitle": "Qullanuçı tıyıldı",
        "editingsection": "«$1» bitendä bülek üzgärtüe",
        "editingcomment": "«$1» biten üzgärtü (yaña bülek)",
        "editconflict": "Üzgärtü konfliktı: $1",
-       "explainconflict": "Sez bu bitne tözätkän waqıtta kemder aña üzgäreşlär kertte.\nÖstäge täräzädä Sez xäzerge tekstnı küräsez.\nAstağı täräzädä Sezneñ wariant urnaşqan.\nEşlägän üzgärtüläregezne astağı täräzädän östägenä küçeregez.\n«{{int:savearticle}}» töymäsenä basqaç östäge bitneñ tekstı saqlanayaçaq.",
+       "explainconflict": "Sez bu bitne tözätkän waqıtta kemder aña üzgäreşlär kertte.\nÖstäge täräzädä Sez xäzerge tekstnı küräsez.\nAstağı täräzädä Sezneñ wariant urnaşqan.\nEşlägän üzgärtüläregezne astağı täräzädän östägenä küçeregez.\n«$1» töymäsenä basqaç östäge bitneñ tekstı saqlanayaçaq.",
        "yourtext": "Sezneñ tekst",
        "storedversion": "Saqlanğan yurama",
        "nonunicodebrowser": "'''Kisätü: Sezneñ brauzer Yünikod kodlawın tanımıy.'''\nÜzgärtü waqıtında ASCII bulmağan simvollar maxsus unaltılı kodlarğa alıştırılaçaq.",
        "saveprefs": "Saqlaw",
        "restoreprefs": "Baştağı köylänmälärne kire qaytaru",
        "prefs-editing": "Üzgärtü",
-       "rows": "Yullar:",
-       "columns": "Bağanalar:",
        "searchresultshead": "Ezläw",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Yasalma sıltamalarnıñ</a> bizäleşe buyınça çikläwlär (baytlarda):",
        "stub-threshold-disabled": "Yabılğan",
        "rcshowhidemine": "minem üzgärtüläremne $1",
        "rcshowhidemine-show": "Kürsätü",
        "rcshowhidemine-hide": "Yäşerü",
-       "rclinks": "Soñğı $2 kön eçendä soñğı $1 üzgärtüne kürsät<br />$3",
+       "rclinks": "Soñğı $2 kön eçendä soñğı $1 üzgärtüne kürsät",
        "diff": "ayırma",
        "hist": "tarix",
        "hide": "yäşer",
        "revdelete-restricted": "çikläwlär idaräçelärgä dä qullanıla",
        "logentry-newusers-create": "$1 qullanuçı xisap yazması {{GENDER:$2|tözelde}}",
        "rightsnone": "(yuq)",
-       "revdelete-summary": "üzgärtülär taswirlaması",
        "feedback-back": "Kire qaytu",
        "feedback-cancel": "Baş tartu",
        "feedback-close": "Yasaldı",
index bac27db..fd51e98 100644 (file)
        "yourpasswordagain": "Чажыт сөзүңерни катап бижиңер:",
        "login": "Кирери",
        "nav-login-createaccount": "Кирери / бүрүткел бижикти чогаадыры",
-       "userlogin": "Кирери / бүрүткел бижикти чогаадыры",
-       "userloginnocreate": "Кирери",
        "logout": "Үнери",
        "userlogout": "Үнери",
        "notloggedin": "Кирбес",
-       "nologin": "Силерде бүрүткел бижик чок? $1",
-       "nologinlink": "Бүрүткел бижикти бүдүрери",
        "createaccount": "Бүрүткел бижикти бүдүрери",
-       "gotaccount": "Силер бүрүтекнип алдыңар де? '''$1'''.",
-       "gotaccountlink": "Кирер",
-       "userlogin-resetlink": "Кирер бижик-саныңар уттуп алдыңар бе?",
        "createaccountmail": "Э-чагаадан",
-       "createaccountreason": "Чылдагаан:",
        "badretype": "Силерниң парлаан чажыт сөзүңер таарышпас.",
        "userexists": "Силерниң парлаан адыңар амгы үеде ажыглаттынып турар.\nӨске аттан шилип алыңар.",
        "loginerror": "Кирип шыдавадың, сени танываан боор",
        "saveprefs": "Шыгжаары",
        "restoreprefs": "Шупту баштайгы ниити шилилгелерни restore",
        "prefs-editing": "Өскертир",
-       "rows": "Одуруглар:",
-       "columns": "Баганалар:",
        "searchresultshead": "Дилээр",
        "timezoneuseserverdefault": "Викиниң ниити шилилгезин ажыглаары ($1)",
        "servertime": "Серверниң шагы:",
        "prefs-signature": "Хол үжүү",
        "prefs-diffs": "Ылгалдар",
        "editusergroup": "Ажыглакчының бөлгүмнерни өскертири",
-       "editinguser": "Changing user rights of user '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
        "userrights-editusergroup": "Ажыглакчының бөлгүмнерни өскертири",
        "saveusergroups": "{{GENDER:$1|Ажыглакчының|Ажыглакчының}} бөлгүмнерин шыгжаар",
        "userrights-reason": "Чылдагаан:",
        "right-move": "Арыннарны шимчээри",
        "right-movefile": "Файлдарны шимчээри",
        "right-writeapi": "API-ни бижикке ажыглаары",
-       "right-editusercssjs": "Өске ажыглакчыларның CSS база Javascript файлдарын өскертири.",
        "right-editusercss": "Өске ажыглакчыларның CSS файлдарын өскертири.",
        "right-edituserjs": "Өске ажыглакчыларның JavaScript файлдарын өскертири.",
        "newuserlogpage": "Киржикчилер бүрүткээр дептер",
        "rcshowhidemine": "$1 боттуң эдилгелери",
        "rcshowhidemine-show": "көргүзер",
        "rcshowhidemine-hide": "чажырар",
-       "rclinks": "Чоокку $2 хүн иштинде сөөлгү $1 өскерлиишкиннерни көргүзер<br />$3",
+       "rclinks": "Чоокку $2 хүн иштинде сөөлгү $1 өскерлиишкиннерни көргүзер",
        "diff": "ылгал",
        "hist": "төөгү",
        "hide": "Чажырар",
        "hours": "{{PLURAL:$1|1=$1 шак|$1 шак}}",
        "days": "{{PLURAL:$1|1=$1 хүн|$1 хүн}}",
        "ago": "$1 бурунгаар",
-       "bad_image_list": "ФоÑ\80мадÑ\8b Ð¼Ñ\8bндÑ\8bг Ð±Ð¾Ð¾Ñ\80 Ñ\83жÑ\83Ñ\80лÑ\83г:\n\nЧүгле Ð´Ð°Ò£Ð·Ñ\8bнÑ\8bÒ£ Ð¸Ð´ÐµÐ³ÐµÑ\82Ñ\82еÑ\80и (Ñ\8dлеменÑ\82илеÑ\80и) Ñ\81анаÑ\82Ñ\8bнаÑ\80 Ð±Ð¾Ð¾Ñ\80 (* Ð´ÐµÐ¿ Ð´ÐµÐ¼Ð´ÐµÐºÑ\82ен Ñ\8dгелÑ\8dÑ\8dн Ð¾Ð´Ñ\83Ñ\80Ñ\83глаÑ\80).\nÐ\9eдÑ\83Ñ\80Ñ\83гнÑ\83Ò£ Ð±Ð¸Ñ\80ги Ñ\88өлүдүү Ñ\81алдÑ\8bнмаÑ\81 Ñ\87Ñ\83Ñ\80Ñ\83малÑ\87е Ñ\88өлүдүг Ð±Ð¾Ð»Ñ\83Ñ\80Ñ\83 Ð°Ð»Ð±Ð°Ð½.\nÐ\9eл-ла Ð¾Ð´Ñ\83Ñ\80Ñ\83гнÑ\83Ò£ Ð°Ñ\80Ñ\82кан Ñ\88өлүдүглеÑ\80и Ð¾Ð½Ð·Ð°Ð³Ð°Ð¹ ÐºÑ\8bлдÑ\8bÑ\80 Ð°Ð·Ñ\8b Ñ\87Ñ\83Ñ\80Ñ\83мал ÐºÐ°Ð¿Ñ\81Ñ\8bÑ\80Ñ\8bп Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\87үүлдеÑ\80 ÐºÑ\8bлдÑ\8bÑ\80 Ñ\81анаÑ\82Ñ\82Ñ\8bнар.",
+       "bad_image_list": "ФоÑ\80мадÑ\8b Ð¼Ñ\8bндÑ\8bг Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\83жÑ\83Ñ\80лÑ\83г:\n\nÐ\94аңзÑ\8bда Ñ\87үгле Ñ\8dлеменÑ\82илеÑ\80 Ñ\81анаÑ\82Ñ\8bнаÑ\80 (* Ð´ÐµÐ¿ Ð´ÐµÐ¼Ð´ÐµÐºÑ\82ен Ñ\8dгелÑ\8dÑ\8dн Ð¾Ð´Ñ\83Ñ\80Ñ\83глаÑ\80).\nÐ\9eдÑ\83Ñ\80Ñ\83гда Ð±Ð¸Ñ\80 Ð´Ñ\83гааÑ\80 Ð°Ð¹Ñ\82Ñ\8bг Ð±Ð¾Ð»Ð·Ð° ÐºÐ¸Ð¸Ñ\80 Ð±Ð¸Ð¶Ð¸Ñ\82Ñ\82инмеÑ\81 Ñ\87Ñ\83Ñ\80Ñ\83кÑ\87е Ð°Ð¹Ñ\82Ñ\8bÑ\80 Ñ\83жÑ\83Ñ\80лÑ\83г.\nÐ\9eл-ла Ð¾Ð´Ñ\83Ñ\80Ñ\83гнÑ\83Ò£ Ó©Ñ\81ке Ð°Ð¹Ñ\82Ñ\8bглаÑ\80Ñ\8b, Ñ\87Ñ\83Ñ\80Ñ\83кÑ\82аÑ\80нÑ\8b ÐºÐ¸Ð¸Ñ\80 Ð±Ð¸Ð¶Ð¸Ð´Ð¸Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80 Ð°Ñ\80Ñ\8bннаÑ\80же Ð°Ð¹Ñ\82Ñ\8bп Ñ\82Ñ\83Ñ\80ар.",
        "metadata": "Чурумал дугайында медээлер",
        "metadata-help": "Бо файлда цифралыг камераларның болгаш сканерлерниң немеп каары немелде медээлер бар. Файлды кылган соонда эдип турган болза, ооң чамдык параметрлери ооң амгы чуруунга дүүшпес бооп болур.",
        "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",
index a5dbfef..7694902 100644 (file)
        "category_header": "«$1» категориысь бамъёс",
        "subcategories": "Подкатегориос",
        "category-media-header": "«$1» категориысь файлъёс",
-       "category-empty": "''Та категориын али бамъёс но, файлъёс но ӧвӧл.''",
+       "category-empty": "<em>Та категориын али бамъёс но, файлъёс но ӧвӧл.</em>",
        "hidden-categories": "{{PLURAL:$1|1=Ватэм категория|Ватэм категориос}}",
        "hidden-category-category": "Ватэм категориос",
        "category-subcat-count": "{{PLURAL:$2|1=Со категориын одӥг подкатегория гинэ.|Возьматэмын $1 {{PLURAL:$1|подкатегория|подкатегориос}} $2 пӧлысь.}}",
        "viewyourtext": "Тӥ быгатӥськоды та бамез <strong>тӥляд тупатонъёстылэсь</strong> кодзэс учкыны но кӧчырыны.",
        "protectedinterface": "Та бам возе интерфейс текстэз та викилэн программной обеспечениезлы. Вандализмез палэнтон понна со утемын воштонъёслэсь.\nВань викиослы берыктэмъёсты ватсалляны яке вошъяны вылысь, тауна, MediaWiki локализацияя сайтэ выжелэ — [https://translatewiki.net/ translatewiki.net].",
        "editinginterface": "<strong>Сак луэ:</strong> Тӥ тупатӥськоды бамез, кудӥз возе программной обеспеченилэсь интерфейс текстсэ.\nТа бамез тупатон воштоз интерфейсэз возьматонэз мукет викиавторъёслы та викиын.",
-       "namespaceprotected": "Тон дорын редактировать карыны бам ӧвӧл юаське <кужмо>$1</strong> инты нимъёс.",
+       "namespaceprotected": "Тон дорын редактировать карыны бам ӧвӧл юаське <strong>$1</strong> инты нимъёс.",
        "exception-nologin": "Ӧд пыре системае",
        "logouttext": "<strong>Тӥ ужан сеансэз йылпумъяды.</strong>\n\nКуд-огез бамъёс возьматӥськыны на быгато озьы, тӥ авторизовать каремын на кадь. Талы пумит нюръяськон понна бушатэ браузерлэсь кэшсэ.",
        "welcomeuser": "Гажаса ӧтиськом, $1!",
        "yourdomainname": "Тӥляд доменды:",
        "login": "Пырыны",
        "nav-login-createaccount": "Нимдэс вераны / Регистрациез ортчытыны",
-       "userlogin": "Регистрациез ортчытыны яке Википедие пырыны",
-       "userloginnocreate": "Пырыны",
        "logout": "Кошкыны",
        "userlogout": "Потыны",
        "notloggedin": "Ӧд пыре системае",
        "userlogin-noaccount": "Ас учётной записьты ӧвӧл?",
        "userlogin-joinproject": "Проектэ пыриськоно",
-       "nologin": "Учётной запись ӧвӧл? $1.",
-       "nologinlink": "Учётной записез кылдытыны",
        "createaccount": "Выль викиавторлэн регистрациез",
-       "gotaccountlink": "Пырелэ",
        "userlogin-resetpassword-link": "Тӥлесьтыд парольдэс куштыны?",
        "userlogin-helplink2": "Пыронъя юрттэт",
        "createacct-emailrequired": "Электрон почталэн адресэз",
        "currentrevisionlink": "Алиез версия",
        "cur": "али",
        "last": "азьв.",
-       "history-fieldset-title": "Ð\98Ñ\81Ñ\82оÑ\80иез Ñ\83Ñ\87кÑ\8bны",
-       "history-show-deleted": "Ӵушылэмъёссэ гинэ",
+       "history-fieldset-title": "ТÑ\83паÑ\82онÑ\8aÑ\91Ñ\81Ñ\82Ñ\8b Ñ\83Ñ\82Ñ\87аны",
+       "history-show-deleted": "Ӵушылэм тупатонъёссэ гинэ",
        "rev-delundel": "возьматыны/ватыны",
        "rev-showdeleted": "возьматоно",
        "revdelete-show-file-submit": "Бен",
        "prefs-editing": "Тупатон",
        "yourlanguage": "Интерфейслэн кылыз:",
        "prefs-preview": "Бамез эскерон",
-       "userrights": "Ð\9fÑ\8bÑ\80иÑ\81Ñ\8cкиÑ\81Ñ\8cлÑ\8dн Ð¿Ñ\80авооÑ\81Ñ\8bнÑ\8bз ÐºÐ¸Ð²Ð°Ð»Ñ\82он",
+       "userrights": "Ð\92икиавÑ\82оÑ\80лÑ\8dн Ð¿Ñ\80авооÑ\81Ñ\8bз",
        "editusergroup": "Викиавторлэсь группаоссэ возьматыны",
        "group-autoconfirmed": "Авто-юнматэм викиавторъёс",
        "group-bot": "Ботъёс",
        "rcshowhidemine-hide": "Ватыны",
        "rcshowhidecategorization-show": "Возьматыны",
        "rcshowhidecategorization-hide": "Ватыны",
-       "rclinks": "Возьматыны $1 берло воштонэз $2 нуналскын<br />$3",
+       "rclinks": "Возьматыны $1 берло воштонэз $2 нуналскын",
        "diff": "пӧрт.",
        "hist": "история",
        "hide": "Ватыны",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Метка|Меткаос}}]]: $2)",
        "tags-title": "Меткаос",
        "logentry-delete-delete": "$1 {{GENDER:$2|быдтӥз}} $3 бамез",
-       "logentry-delete-restore": "$1 {{GENDER:$2|берен сётӥз}} $3 бамез",
+       "logentry-delete-restore": "$1 {{GENDER:$2|берен сётӥз}} $3 бамез ($4)",
        "logentry-block-block": "$1 {{GENDER:$2|заблокировать кариз}} {{GENDER:$4|$3}} дырлы: $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|разблокировать кариз}} {{GENDER:$4|$3}}",
        "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",
index edd0508..d942cd8 100644 (file)
        "externaldberror": "بۇ سانداننى دەلىللەش خاتالىقى ياكى سىرتقى ھېساباتىڭىزنى يېڭىلاشنى چەكلىگەنلىكتىن بولغان بولۇشى مۇمكىن.",
        "login": "تىزىمغا كىر",
        "nav-login-createaccount": "تىزىمغا كىر/ھېسابات قۇر",
-       "userlogin": "تىزىمغا كىر/ھېسابات قۇر",
-       "userloginnocreate": "تىزىمغا كىر",
        "logout": "تىزىمدىن چىق",
        "userlogout": "تىزىمدىن چىق",
        "notloggedin": "تىزىمغا كىرمىدى",
        "userlogin-noaccount": "ھېساباتىڭىز يوقمۇ؟",
        "userlogin-joinproject": "{{SITENAME}} قا ئەزا بولۇڭ",
-       "nologin": "ھېساباتىڭىز يوقمۇ؟ '''$1'''.",
-       "nologinlink": "ھېساباتتىن بىرنى قۇر",
        "createaccount": "ھېسابات قۇر",
-       "gotaccount": "ھېساباتىم بار؟ '''$1'''.",
-       "gotaccountlink": "تىزىمغا كىر",
-       "userlogin-resetlink": "تىزىمغا كىرىش تەپسىلاتىنى ئۇنۇتتىڭىز؟",
        "userlogin-resetpassword-link": "پارولىڭىزنى ئۇنتۇپ قالدىڭىزمۇ؟",
        "userlogin-loggedin": "سىز ئاللىقاچان {{GENDER:$1|$1}} ھالىتىدە تىزىمغا كىرىپ بولدىڭىز. تۆۋەندىكىلەرنى تولدۇرۇپ باشقا ئىشلەتكۈچى ھالىتىدە تىزىمغا كىرىڭ.",
        "userlogin-createanother": "باشقا ھېسابات قۇرىمەن",
        "createacct-another-email-ph": "ئېلخەت ئادرېسى كىرگۈزۈڭ",
        "createaccountmail": "ۋاقىتلىق ئىختىيارىي پارولنى ئىشلەت ھەمدە بەلگىلەنگەن ئېلېكتىرونلۇق خەت ئادرېسىغا ئەۋەت",
        "createacct-realname": "ھەقىقى ئىسمىڭىز (ئىختىيارى)",
-       "createaccountreason": "سەۋەب:",
        "createacct-reason": "سەۋەبى",
        "createacct-reason-ph": "نېمىشقا باشقا ھېسابات قۇرماقچى بولدىڭىز",
        "createacct-submit": "ھېساباتىڭىزنى قۇرۇڭ",
        "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$2\n\n{{PLURAL:$3|بۇ ۋاقىتلىق پارول|بۇ ۋاقىتلىق پارول}} {{PLURAL:$5|بىر كۈن|$5 كۈن}}دە ۋاقتى ئۆتىدۇ. ئەگەر بۇ مەشغۇلاتنى سىز ئىلتىماس قىلغان بولسىڭىز، دەرھال تىزىمغا كىرىپ يېڭى پارولدىن بىرنى تاللاڭ.\nسىز بەلگىلىگەن يېڭى پارول  {{PLURAL:$5|كۈن|$5 كۈن}}دە ۋاقتى توشىدۇ. ئەگەر باشقىلار ئىلتىماس قىلغان بولسا ياكى ئۆزىڭىز بەلگىلىگەن پارول ئېسىڭىزگە كېلىپ ئۇنى ئۆزگەرتمىسىڭىز، \nبۇ ئۇچۇرغا پەرۋا قىلماي ئۆزىڭىزنىڭ كونا پارولىنى ئىشلىتىۋېرىڭ.",
        "anonpreviewwarning": "''سىز تېخى تىزىمغا كىرمىدىڭىز. سىزنىڭ IP ئادرېسىڭىز بۇ بەتنىڭ تەھرىرلەش تارىخىغا خاتىرىلىنىدۇ.''",
        "missingsummary": "'''ئەسكەرتىش:''' سىز تەھرىرلەش ئۈزۈندىسى تەمىنلىمىدىڭىز. .\nئەگەر ساقلانى يەنە بىر قېتىم چەكسىڭىز، تەھرىرلىگىنىڭىزنى ئۈزۈندە يوق ھالەتتە ساقلايدۇ.",
        "missingcommenttext": "تۆۋەندە ئىزاھات كىرگۈزۈڭ.",
-       "missingcommentheader": "'''ئەسكەرتىش:''' سىز ئىزاھاتقا ماۋزۇ تەمىنلىمىدىڭىز.\nئەگەر \"{{int:savearticle}}\"نى يەنە بىر قېتىم چەكسىڭىز، تەھرىرلىگىنىڭىزنى ماۋزۇسىز ھالەتتە ساقلايدۇ.",
+       "missingcommentheader": "'''ئەسكەرتىش:''' سىز ئىزاھاتقا ماۋزۇ تەمىنلىمىدىڭىز.\nئەگەر \"$1\"نى يەنە بىر قېتىم چەكسىڭىز، تەھرىرلىگىنىڭىزنى ماۋزۇسىز ھالەتتە ساقلايدۇ.",
        "summary-preview": "ئۈزۈندە ئالدىن كۆزىتىش:",
        "subject-preview": "تېما/ماۋزۇنى ئالدىن كۆزەت:",
        "blockedtitle": "ئىشلەتكۈچى چەكلەنگەن",
        "saveprefs": "ساقلا",
        "restoreprefs": "بارلىق كۆڭۈلدىكى تەڭشەكنى ئەسلىگە كەلتۈر (بارلىق بۆلەكلەردە)",
        "prefs-editing": "تەھرىر",
-       "rows": "قۇر:",
-       "columns": "ستون:",
        "searchresultshead": "ئىزدە",
        "stub-threshold": "<a href=\"#\" class=\"stub\">قىسقا بەت ئۇلانمىسى</a> فورمات چەك قىممىتى (بايت) :",
        "stub-threshold-disabled": "چەكلەنگەن",
        "userrights-reason": "سەۋەب:",
        "userrights-no-interwiki": "باشقا wiki دىكى ئىشلەتكۈچىلەرنىڭ ھوقۇقىنى ئۆزگەرتىش ھوقۇقىڭىز يوق.",
        "userrights-nodatabase": "$1 ساندان مەۋجۇد ئەمەس ياكى يەرلىك ئوروندا ئەمەس.",
-       "userrights-nologin": "سىز چوقۇم باشقۇرغۇچى سۈپىتىدە [[Special:UserLogin|تىزىمغا كىر]]ىپ ئاندىن ئىشلەتكۈچى ھوقۇقىنى بەلگىلىيەلەيسىز.",
-       "userrights-notallowed": "ھېساباتىڭىزنىڭ ئىشلەتكۈچى ھوقۇقىنى قوشۇش ياكى ئۆزگەرتىش ھوقۇقى يوق.",
        "userrights-changeable-col": "سىز ئۆزگەرتەلەيدىغان گۇرۇپپا",
        "userrights-unchangeable-col": "سىز ئۆزگەرتەلمەيدىغان گۇرۇپپا",
        "userrights-irreversible-marker": "$1*",
        "right-protect": "قوغداش دەرىجىسىنى ئۆزگەرتىپ، قوغدالغان بەتنى تەھرىرلە",
        "right-editprotected": "قوغدالغان بەتنى تەھرىرلە (زەنجىرسىمان قۇلۇپلانمىغان)",
        "right-editinterface": "ئىشلەتكۈچى كۆرۈنمە يۈزىنى تەھرىرلە",
-       "right-editusercssjs": "باشقا ئىشلەتكۈچىنىڭ CSS ۋە JS ھۆججىتىنى تەھرىرلە",
        "right-editusercss": "باشقا ئىشلەتكۈچىنىڭ CSS ھۆججىتىنى تەھرىرلە",
        "right-edituserjs": "باشقا ئىشلەتكۈچىنىڭ  JS ھۆججىتىنى تەھرىرلە",
        "right-editmyusercss": "ئۆزىڭىزنىڭ CSS ھۆججىتىڭىزنى تەھرىرلەڭ",
        "right-siteadmin": "ساندان قۇلۇپلا ۋە قۇلۇپ ئاچ",
        "right-override-export-depth": "بەت قەۋەتلىك ئۇلىنىشى بار بەتنى چىقار",
        "right-sendemail": "باشقا ئىشلەتكۈچىگە ئېلخەت يوللا",
-       "right-passwordreset": "پارول ئەسلىگە قايتۇرۇش ئېلخەت ئادرېس كۆرۈش.",
        "newuserlogpage": "ئىشلەتكۈچى قۇرغان خاتىرە",
        "newuserlogpagetext": "(چەكلەنگەن)",
        "rightslog": "ئىشلەتكۈچى ھوقۇق خاتىرىسى",
        "rcshowhideanons": "$1 ئىمزاسىز ئىشلەتكۈچى تەھرىرى",
        "rcshowhidepatr": "$1 كۆزىتىلگەن تەھرىر",
        "rcshowhidemine": "$1 مېنىڭ تەھرىرىم",
-       "rclinks": "يېقىنقى $2 كۈن ئىچىدىكى ئەڭ يېڭى  $1 قېتىملىق ئۆزگەرتىشنى كۆرسەت. <br />$3",
+       "rclinks": "يېقىنقى $2 كۈن ئىچىدىكى ئەڭ يېڭى  $1 قېتىملىق ئۆزگەرتىشنى كۆرسەت.",
        "diff": "پەرق",
        "hist": "تارىخ",
        "hide": "يوشۇر",
        "undeleteviewlink": "كۆرسەت",
        "undeleteinvert": "ئەكسىچە تاللا",
        "undeletecomment": "سەۋەب:",
-       "undeletedrevisions": "{{PLURAL:$1|1 تۈزىتىش|$1 تۈزىتىش}} ئەسلىگە كەلتۈرۈلدى",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 تۈزىتىش|$1 تۈزىتىش}} ۋە {{PLURAL:$2|1 ھۆججەت|$2 ھۆججەت}}  ئەسلىگە كەلتۈرۈلدى",
-       "undeletedfiles": "{{PLURAL:$1|1 ھۆججەت|$1 ھۆججەت}}  ئەسلىگە كەلتۈرۈلدى",
        "cannotundelete": "ئەسلىگە كەلتۈرۈش مەغلۇپ بولدى:\n$1",
        "undeletedpage": "'''$1 ئەسلىگە كەلتۈرۈلدى'''\n\n [[Special:Log/delete|ئۆچۈرۈش خاتىرىسى]]دىن پايدىلىنىپ ئۆچۈر ۋە ئەسلىگە كەلتۈر خاتىرىسىنى كۆرۈڭ.",
        "undelete-header": "يېقىنقى خاتىرىنى سۈرۈشتۈرمەكچى بولسىڭىز [[Special:Log/delete|ئۆچۈرۈش خاتىرىسى]]دىن پايدىلىنىڭ.",
        "logentry-rights-rights-legacy": "$3 نىڭ ئىشلەتكۈچى گۇرۇپپىسىنى $1 ئۆزگەرتتى",
        "logentry-rights-autopromote": "$1 نىڭ ئىشلەتكۈچى گۇرۇپپىسى ئۆزلۈكىدىن $4 دىن $5 غا يۈكسەلدى",
        "rightsnone": "(يوق)",
-       "revdelete-summary": "ئۈزۈندە تەھرىرلە",
        "feedback-adding": "قايتۇرما ئىنكاسنى بەتكە قوشۇۋاتىدۇ…",
        "feedback-bugcheck": "قالتىس! كەمتۈكنىڭ ئاللىبۇرۇن يوللانغان [$1 مەلۇملۇق كەمتۈك] ياكى ئەمەسلىكىنى تەكشۈرۈڭ.",
        "feedback-bugnew": "تەكشۈردۈم. يېڭى بىر كەمتۈك دوكلات قىل",
        "feedback-thanks": "كۆپ رەھمەت! قايتۇرما ئىنكاسىڭىز \"[$2 $1]\" بەتكە يوللاندى.",
        "searchsuggest-search": "ئىزدەش",
        "searchsuggest-containing": "ئىچىدە…",
-       "api-error-badaccess-groups": "ھۆججەتنى بۇ ۋىكىغا يۈكلەش ھوقۇقىڭىز يوق.",
        "api-error-badtoken": "ئىچكى خاتالىق: سۆزلىشىش ئىناۋەتسىز.",
-       "api-error-copyuploaddisabled": "URL ئارقىلىق يوللايدىغان ئىقتىدارنى بۇ مۇلازىمېتىر چەكلىگەن.",
-       "api-error-duplicate": "تورتۇرادا ئوخشاش مەزمۇندىكى {{PLURAL:$1|is باشقا ھۆججەت|بەزى باشقا ھۆججەتلەر}} مەۋجۇت.",
-       "api-error-duplicate-archive": "تورتۇرادا ئىلگىرى ئوخشاش مەزمۇن بار {{PLURAL:$1|was باشقا بىر ھۆججەت|were باشقا ھۆججەتلەر}} مەۋجۇت ئەمما ئۆچۈرۈلگەن.",
-       "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-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 a976001..077becc 100644 (file)
@@ -68,7 +68,8 @@
                        "Visem",
                        "MMH",
                        "Олександр",
-                       "Similartothissimilartothat"
+                       "Similartothissimilartothat",
+                       "Bunyk"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
        "redirectedfrom": "(Перенаправлено з $1)",
        "redirectpagesub": "Сторінка-перенаправлення",
        "redirectto": "Перенаправити на:",
-       "lastmodifiedat": "ЦÑ\8e Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83 Ð²Ð¾Ñ\81Ñ\82аннÑ\94 Ð·Ð¼Ñ\96нено: $2, $1.",
+       "lastmodifiedat": "ЦÑ\8e Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83 Ð²Ð¾Ñ\81Ñ\82аннÑ\94 Ð²Ñ\96дÑ\80едаговано Ð¾ $2, $1.",
        "viewcount": "Цю сторінку переглядали $1 {{PLURAL:$1|раз|рази|разів}}.",
        "protectedpage": "Захищена сторінка",
        "jumpto": "Перейти до:",
        "login": "Вхід до системи",
        "login-security": "Підтвердіть свою особу",
        "nav-login-createaccount": "Вхід / реєстрація",
-       "userlogin": "Вхід / реєстрація",
-       "userloginnocreate": "Увійти",
        "logout": "Вихід із системи",
        "userlogout": "Вихід із системи",
        "notloggedin": "Ви не увійшли до системи",
        "userlogin-noaccount": "Немає облікового запису?",
        "userlogin-joinproject": "Приєднатися до {{GRAMMAR:genitive|{{SITENAME}}}}",
-       "nologin": "Ви ще не зареєструвались? $1.",
-       "nologinlink": "Створити обліковий запис",
        "createaccount": "Зареєструватися",
-       "gotaccount": "Ви вже зареєстровані? '''$1'''.",
-       "gotaccountlink": "Увійти",
-       "userlogin-resetlink": "Забули дані, потрібні для входу?",
        "userlogin-resetpassword-link": "Забули пароль?",
        "userlogin-helplink2": "Допомога з входом у систему",
        "userlogin-loggedin": "Ви вже увійшли як {{GENDER:$1|$1}}.\nВикористайте нижче форму для входу як інший користувач.",
        "createaccountmail": "Використати тимчасовий випадковий пароль і надіслати його на вказану адресу електронної пошти",
        "createaccountmail-help": "Може використовуватися, щоб створити обліковий запис для іншої особи, не дізнаючись пароль.",
        "createacct-realname": "Справжнє ім'я (не обов'язково)",
-       "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Чому ви створюєте інший обліковий запис",
        "createacct-reason-help": "Повідомлення, що показується в журналі створення облікових записів",
        "createacct-benefit-body1": "{{PLURAL:$1|редагування|редагування|редагувань}}",
        "createacct-benefit-body2": "{{PLURAL:$1|сторінка|сторінки|сторінок}}",
        "createacct-benefit-body3": "{{PLURAL:$1|дописувач|дописувачі|дописувачів}} цього місяця",
-       "badretype": "Введені паролі не співпадають.",
+       "badretype": "Введені паролі не збігаються.",
        "usernameinprogress": "Створення облікового запису для цього імені користувача уже виконується.\nБудь ласка, зачекайте.",
        "userexists": "Введене ім'я користувача вже існує.\nБудь ласка оберіть інше ім'я.",
        "loginerror": "Помилка при вході до системи",
        "preview": "Попередній перегляд",
        "showpreview": "Попередній перегляд",
        "showdiff": "Показати зміни",
-       "blankarticle": "'''Попередження:''' Створена вами сторінка порожня.\nЯкщо Ви знову натиснете «{{int:savearticle}}», сторінку буде створено без вмісту.",
+       "blankarticle": "'''Попередження:''' Створена вами сторінка порожня.\nЯкщо Ви знову натиснете «$1», сторінку буде створено без вмісту.",
        "anoneditwarning": "<strong>Увага!</strong> Ви не авторизувалися на сайті. Ваша IP-адреса буде публічно видима, якщо Ви будете вносити будь-які редагування. Якщо Ви <strong>[$1 увійдете]</strong> або <strong>[$2 створите обліковий запис]</strong>, редагування будуть натомість пов'язані з Вашим іменем користувача, а ще у Вас з'являться інші переваги.",
        "anonpreviewwarning": "''Ви не увійшли в систему. Якщо ви виконаєте збереження, то в історію сторінки буде записана ваша IP-адреса.''",
        "missingsummary": "'''Нагадування''': Ви не дали короткого опису змін.\nНатиснувши кнопку «Зберегти» ще раз, ви збережете зміни без коментаря.",
-       "selfredirect": "<strong>Попередження:</strong> Ви створюєте перенаправлення на цю ж сторінку.\nВи могли вказати невірну цільову сторінку, або ж редагуєте хибну сторінку.\nЯкщо Ви натиснете \"{{int:savearticle}}\" ще раз, перенаправлення буде створено.",
+       "selfredirect": "<strong>Попередження:</strong> Ви створюєте перенаправлення на цю ж сторінку.\nВи могли вказати невірну цільову сторінку, або ж редагуєте хибну сторінку.\nЯкщо Ви натиснете \"$1\" ще раз, перенаправлення буде створено.",
        "missingcommenttext": "Будь ласка, введіть нижче ваше повідомлення.",
-       "missingcommentheader": "<strong>Нагадування</strong>: Ви не вказали тему для цього коментаря.\nНатиснувши кнопку «{{int:savearticle}}» ще раз, Ви збережете редагування без заголовка.",
-       "summary-preview": "Ð\9eпиÑ\81 Ð±Ñ\83де:",
-       "subject-preview": "Тема Ð±Ñ\83де:",
+       "missingcommentheader": "<strong>Нагадування</strong>: Ви не вказали тему для цього коментаря.\nНатиснувши кнопку «$1» ще раз, Ви збережете редагування без заголовка.",
+       "summary-preview": "Ð\9fопеÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд Ð¾Ð¿Ð¸Ñ\81Ñ\83 Ñ\80едагÑ\83ваннÑ\8f:",
+       "subject-preview": "Ð\9fопеÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд Ñ\82еми:",
        "previewerrortext": "Сталася помилка при спробі попереднього перегляду Ваших змін.",
        "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. Будь ласка, зазначайте ці дані у своїх запитах.",
        "missing-revision": "Версія #$1 сторінки «{{FULLPAGENAME}}» не існує.\n\nІмовірно, Ви перейшли за застарілим посиланням на вилучену сторінку.\nПодробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].",
        "userpage-userdoesnotexist": "Користувач під назвою \"<nowiki>$1</nowiki>\" не зареєстрований. Переконайтеся, що ви хочете створити/редагувати цю сторінку.",
        "userpage-userdoesnotexist-view": "Обліковий запис користувача «$1» не зареєстровано.",
-       "blocked-notice-logextract": "Цей користувач наразі заблокований.\nОстанній запис у журналі блокувань такий:",
+       "blocked-notice-logextract": "{{GENDER:$1|Цей користувач|Ця користувачка}} наразі {{GENDER:$1|заблокований|заблокована}}.\nОстанній запис у журналі блокувань такий:",
        "clearyourcache": "<strong>Увага:</strong> Після збереження слід очистити кеш оглядача, щоб побачити зміни.\n* <strong>Firefox / Safari:</strong> тримайте <em>Shift</em>, коли натискаєте <em>Оновити</em>, або натисніть <em>Ctrl-F5</em> чи <em>Ctrl-Shift-R</em> (<em>⌘-R</em> на Apple Mac)\n* <strong>Google Chrome:</strong> натисніть <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Apple Mac)\n* <strong>Internet Explorer:</strong> тримайте <em>Ctrl</em>, коли натискаєте <em>Оновити</em>, або натисніть <em>Ctrl-F5</em>\n* <strong>Opera:</strong> очистіть кеш за допомогою <em>Інструменти → Налаштування</em> (<em>Opera → Побажання</em> на Apple Mac) та перейдіть на <em>Приватність & безпека → очистити дані браузера → кеш</em>",
        "usercssyoucanpreview": "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий css-файл перед збереженням.",
        "userjsyoucanpreview": "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий код JavaScript перед збереженням.",
        "editingsection": "Редагування $1 (розділ)",
        "editingcomment": "Редагування $1 (новий розділ)",
        "editconflict": "Конфлікт редагування: $1",
-       "explainconflict": "Ще хтось змінив цю сторінку з того часу, як ви розпочали її правити.\nУ верхньому вікні показано поточний текст сторінки.\nВаші зміни показані в нижньому вікні.\nВам необхідно перенести ваші зміни в існуючий текст.\nЯкщо ви натиснете «{{int:savearticle}}», то буде збережено '''лише''' текст з верхнього вікна редагування.",
+       "explainconflict": "Ще хтось змінив цю сторінку з того часу, як ви розпочали її правити.\nУ верхньому вікні показано поточний текст сторінки.\nВаші зміни показані в нижньому вікні.\nВам необхідно перенести ваші зміни в існуючий текст.\nЯкщо ви натиснете «$1», то буде збережено '''лише''' текст з верхнього вікна редагування.",
        "yourtext": "Ваш текст",
        "storedversion": "Збережена версія",
        "nonunicodebrowser": "'''Попередження: Ваш браузер не підтримує Юнікод.''' \nЩоб подолати це обмеження та дозволити вам безпечно редагувати сторінки, усі не-ASCII символи буде показано їх шістнадцятковими кодами.",
        "readonlywarning": "<strong>Попередження: База даних заблокована на обслуговування, тому, на даний момент, ви не можете записати ваші зміни.\n</strong>\nМожливо, вам варто скопіювати текст у файл на вашому комп'ютері й зберегти його на пізніше.\n\nАдміністратор, що заблокував базу даних, залишив наступне пояснення: $1",
        "protectedpagewarning": "'''Попередження: Ця сторінка була захищена від змін так, що тільки користувачі з правами адміністратора можуть її редагувати.'''\nОстанній запис журналу наведений нижче для довідки:",
        "semiprotectedpagewarning": "'''Зауваження:''' Ця сторінка захищена так, що її можуть редагувати тільки зареєстровані користувачі.\nОстанній запис журналу наведений нижче для довідки:",
-       "cascadeprotectedwarning": "<strong>Попередження:</strong> Цю сторінку можуть редагувати лише користувачі з правами адміністратора, оскільки вона включена на {{PLURAL:$1|1=сторінці|сторінках}}, де встановлено каскадний захист:",
+       "cascadeprotectedwarning": "<strong>Попередження:</strong> Цю сторінку можуть редагувати лише користувачі зі [[Special:ListGroupRights|специфічними правами]], оскільки вона включена на {{PLURAL:$1|1=сторінці|сторінках}}, де встановлено каскадний захист:",
        "titleprotectedwarning": "'''Попередження. Ця сторінка була захищена так, що для її створення потрібні [[Special:ListGroupRights|особливі права]].'''\nОстанній запис журналу наведений нижче для довідки:",
        "templatesused": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} на цій сторінці:",
        "templatesusedpreview": "{{PLURAL:$1|1=Шаблон, використаний|Шаблони, використані}} у цьому попередньому перегляді:",
        "post-expand-template-argument-warning": "'''Увага:''' Ця сторінка містить принаймні один аргумент шаблону, який має надто великий розмір для розгортання.\nЦі аргументи були проігноровані.",
        "post-expand-template-argument-category": "Сторінки, які містять пропущені аргументи шаблонів",
        "parser-template-loop-warning": "Виявлена петля у шаблонах: [[$1]]",
+       "template-loop-category": "Сторінки з петлями шаблонів",
+       "template-loop-category-desc": "Ця сторінка містить петлю шаблонів, тобто шаблон, який рекурсивно викликає сам себе.",
        "parser-template-recursion-depth-warning": "Перевищене обмеження глибини рекурсії шаблону ($1)",
        "language-converter-depth-warning": "Перевищене обмеження глибини мовного конвертора ($1)",
        "node-count-exceeded-category": "Сторінки, на яких перевищено лічильник вузлів",
        "last": "попер.",
        "page_first": "перша",
        "page_last": "остання",
-       "histlegend": "Ð\92ибÑ\96Ñ\80 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97: Ð\9fознаÑ\87Ñ\82е Ñ\83 ÐºÑ\80Ñ\83глиÑ\85 Ð²Ñ\96конÑ\86Ñ\8fх версії для порівняння і натисніть «Enter» або кнопку внизу.\n\nПояснення: (поточн.) = відмінності від поточної версії,\n(ост.) = відмінності від попередньої версії, '''м''' = незначне редагування",
-       "history-fieldset-title": "Ð\9fеÑ\80еглÑ\8fнÑ\83Ñ\82и Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\8e",
-       "history-show-deleted": "ТÑ\96лÑ\8cки Ð²Ð¸Ð»Ñ\83Ñ\87енÑ\96",
+       "histlegend": "Ð\92ибÑ\96Ñ\80 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97: Ð¿Ð¾Ð·Ð½Ð°Ñ\87Ñ\82е Ñ\83 ÐºÑ\80Ñ\83жеÑ\87ках версії для порівняння і натисніть «Enter» або кнопку внизу.\n\nПояснення: (поточн.) = відмінності від поточної версії,\n(ост.) = відмінності від попередньої версії, '''м''' = незначне редагування",
+       "history-fieldset-title": "Ð\9fоÑ\88Ñ\83к Ð²ÐµÑ\80Ñ\81Ñ\96й",
+       "history-show-deleted": "Ð\9bиÑ\88е Ð²Ð¸Ð»Ñ\83Ñ\87енÑ\96 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97",
        "histfirst": "найдавніші",
        "histlast": "найновіші",
        "historysize": "($1 {{PLURAL:$1|байт|байти|байтів}})",
        "search-file-match": "(збігається із вмістом файлу)",
        "search-suggest": "Можливо, ви мали на увазі: $1",
        "search-rewritten": "Показуються результати для $1. Шукати натомість $2.",
-       "search-interwiki-caption": "Ð\91Ñ\80аÑ\82нÑ\96 Ð¿Ñ\80оекÑ\82и",
+       "search-interwiki-caption": "РезÑ\83лÑ\8cÑ\82аÑ\82и Ð· Ð±Ñ\80аÑ\82нÑ\96Ñ\85 Ð¿Ñ\80оекÑ\82Ñ\96в",
        "search-interwiki-default": "Результати із $1:",
        "search-interwiki-more": "(більше)",
        "search-interwiki-more-results": "більше результатів",
        "prefs-help-prefershttps": "Цей параметр набуде чинності при вашому наступному вході у систему.",
        "prefswarning-warning": "Ви внесли в свої налаштування зміни, які ще не були збережені.\nЯкщо ви залишите цю сторінку, не натиснувши \"$1\", налаштування не будуть оновлені.",
        "prefs-tabs-navigation-hint": "Порада: Ви можете використовувати клавіші стрілок вліво і вправо для переходу між вкладками в списку вкладок.",
-       "userrights": "Ð\9aеÑ\80Ñ\83ваннÑ\8f Ð¿Ñ\80авами користувачів",
+       "userrights": "Ð\9fÑ\80ава користувачів",
        "userrights-lookup-user": "Виберіть користувача",
        "userrights-user-editname": "Введіть ім'я користувача:",
        "editusergroup": "Завантажити групи користувачів",
-       "editinguser": "Зміна прав {{GENDER:$1|користувача}} <strong>[[User:$1|$1]]</strong> $2",
+       "editinguser": "Зміна прав {{GENDER:$1|користувача|користувачки}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Перегляд прав {{GENDER:$1|користувача|користувачки}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Змінити групи {{GENDER:$1|користувача|користувачки}}",
        "userrights-viewusergroup": "Перегляд груп {{GENDER:$1|користувача|користувачки}}",
        "saveusergroups": "Зберегти групи {{GENDER:$1|користувачів}}",
        "userrights-groupsmember": "Член груп:",
        "userrights-groupsmember-auto": "Неявний член:",
-       "userrights-groups-help": "Ви можете змінити групи, до яких належить цей користувач:\n* Якщо біля назви групи стоїть позначка, то користувач належить до цієї групи.\n* Якщо позначка не стоїть — користувач не належить до відповідної групи.\n* Зірочка «*» означає, що ви не можете вилучити користувача з групи, якщо додасте його до неї, і навпаки.\n* Ґратка «#» означає, що ви можете зменшити строк членства в групі, але не збільшити.",
+       "userrights-groups-help": "Ви можете змінити групи, до яких належить {{GENDER:$1|цей користувач|ця користувачка}}:\n* Якщо біля назви групи стоїть позначка, то {{GENDER:$1|користувач|користувачка}} належить до цієї групи.\n* Якщо позначка не стоїть — {{GENDER:$1|користувач|користувачка}} не належить до відповідної групи.\n* Зірочка «*» означає, що Ви не можете вилучити {{GENDER:$1|користувача|користувачку}} з групи, якщо додасте {{GENDER:$1|його|її}} до неї, і навпаки.\n* Решітка «#» означає, що Ви можете зменшити строк членства в групі, але не збільшити.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "У вас нема дозволу змінювати права користувачів на інших вікі.",
        "userrights-nodatabase": "База даних $1 не існує або не є локальною.",
        "right-editsemiprotected": "редагування сторінок з рівнем захисту «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "Редагувати модель вмісту сторінки",
        "right-editinterface": "редагування інтерфейсу користувача",
-       "right-editusercssjs": "редагування CSS- і JS-файлів інших користувачів",
        "right-editusercss": "редагування CSS-файлів інших користувачів",
        "right-edituserjs": "редагування JS-файлів інших користувачів",
        "right-editmyusercss": "редагування власних CSS-файлів користувача",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Показати",
        "rcfilters-activefilters": "Активні фільтри",
+       "rcfilters-quickfilters": "Швидкі посилання",
+       "rcfilters-savedqueries-defaultlabel": "Збережені фільтри",
+       "rcfilters-savedqueries-rename": "Перейменувати",
+       "rcfilters-savedqueries-setdefault": "Зробити стандартним",
+       "rcfilters-savedqueries-unsetdefault": "Прибрати зі стандартних",
+       "rcfilters-savedqueries-remove": "Вилучити",
+       "rcfilters-savedqueries-new-name-label": "Назва",
+       "rcfilters-savedqueries-apply-label": "Створити швидке посилання",
+       "rcfilters-savedqueries-cancel-label": "Скасувати",
+       "rcfilters-savedqueries-add-new-title": "Зберегти фільтри як швидке посилання",
        "rcfilters-restore-default-filters": "Відновити стандартні фільтри",
        "rcfilters-clear-all-filters": "Очистити фільтри",
        "rcfilters-search-placeholder": "Фільтруйте нові редагування (переглядайте або почніть вводити)",
        "rcfilters-invalid-filter": "Недійсний фільтр",
        "rcfilters-empty-filter": "Без фільтрів. Показано всі зміни.",
        "rcfilters-filterlist-title": "Фільтри",
+       "rcfilters-filterlist-whatsthis": "Що це?",
+       "rcfilters-filterlist-feedbacklink": "Надайте відгук про нові (бета) фільтри",
+       "rcfilters-highlightbutton-title": "Виділити результати",
+       "rcfilters-highlightmenu-title": "Вибрати колір",
+       "rcfilters-highlightmenu-help": "Вибрати колір, щоб виділити цю властивість",
        "rcfilters-filterlist-noresults": "Фільтри не знайдено",
+       "rcfilters-noresults-conflict": "Результатів не знайдено через конфлікт у пошукових критеріях",
+       "rcfilters-state-message-subset": "Цей фільтр не має впливу, оскільки його результати включені в результати {{PLURAL:$2|цього, ширшого, фільтра|цих, ширших, фільтрів}} (спробуйте увімкнути виділення, щоб вирізнити їх): $1",
+       "rcfilters-state-message-fullcoverage": "Вибір усіх фільтрів у групі — це все одно, що не вибирати жодного з них, тобто таке фільтрування не має впливу. Гупа містить: $1",
        "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-filter-unregistered-conflicts-user-experience-level": "Цей фільтр конфліктує з {{PLURAL:$2|таким фільтром|такими фільтрами}} досвіду, {{PLURAL:$2|який знаходить|які знаходять}} лише зареєстрованих користувачів: $1",
+       "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-user-experience-level-conflicts-unregistered": "Фільтри досвіду знаходять лише зареєстрованих користувачів, тож цей фільтр конфліктує з фільтром «Незареєстровані».",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Фільтр «Незареєстровані» конфліктує з одним або більше фільтрами досвіду, які знаходять лише зареєстрованих користувачів. Конфліктні фільтри позначені вище в ділянці активних фільтрів.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Новачки",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Менше ніж 10 редагувань і 4 дні активності.",
+       "rcfilters-filter-user-experience-level-learner-label": "Учні",
+       "rcfilters-filter-user-experience-level-learner-description": "Більше досвіду, ніж у «новачків», але менше, ніж у «досвідчених користувачів».",
+       "rcfilters-filter-user-experience-level-experienced-label": "Досвідчені користувачі",
+       "rcfilters-filter-user-experience-level-experienced-description": "Більше 30 днів активності і понад 500 редагувань.",
        "rcfilters-filtergroup-automated": "Автоматизовані редагування",
        "rcfilters-filter-bots-label": "Бот",
        "rcfilters-filter-bots-description": "Редагування, зроблені з допомогою автоматизованих засобів.",
        "rcfilters-filter-humans-label": "Людина (не бот)",
        "rcfilters-filter-humans-description": "Редагування, зроблені людиною.",
+       "rcfilters-filtergroup-reviewstatus": "Статус перевірки",
+       "rcfilters-filter-patrolled-label": "Перевірені",
+       "rcfilters-filter-patrolled-description": "Редагування, позначені як перевірені",
+       "rcfilters-filter-unpatrolled-label": "Неперевірені",
+       "rcfilters-filter-unpatrolled-description": "Редагування, не позначені як перевірені",
        "rcfilters-filtergroup-significance": "Важливість",
        "rcfilters-filter-minor-label": "Незначні редагування",
        "rcfilters-filter-minor-description": "Редагування, позначені авторами як незначні.",
        "rcfilters-filter-major-label": "Звичайні редагування",
        "rcfilters-filter-major-description": "Редагування, не позначені як незначні.",
+       "rcfilters-filtergroup-watchlist": "Сторінки зі списку спостереження",
+       "rcfilters-filter-watchlist-watched-label": "У списку спостереження",
+       "rcfilters-filter-watchlist-watched-description": "Зміни до сторінок з Вашого списку спостереження",
+       "rcfilters-filter-watchlist-watchednew-label": "Нові зміни в списку спостереження",
+       "rcfilters-filter-watchlist-watchednew-description": "Зміни до сторінок зі списку спостереження, які Ви не відвідували з моменту здійснення змін.",
+       "rcfilters-filter-watchlist-notwatched-label": "Не в списку спостереження",
+       "rcfilters-filter-watchlist-notwatched-description": "Усе, за винятком змін до сторінок з Вашого списку спостереження",
        "rcfilters-filtergroup-changetype": "Вид зміни",
        "rcfilters-filter-pageedits-label": "Редагування сторінок",
        "rcfilters-filter-pageedits-description": "Редагування вікі-вмісту, обговорень, опису категорій тощо.",
        "rcfilters-filter-categorization-description": "Записи про додавання або вилучення сторінок з категорій.",
        "rcfilters-filter-logactions-label": "Журнальні дії",
        "rcfilters-filter-logactions-description": "Адміністративні дії, створення облікових записів, видалення сторінок, завантаження файлів тощо.",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Фільтр «Незначні редагування» конфліктує з одним або більше фільтрів за типом змін, оскільки певні типи змін не можна позначити як «незначні». Конфліктні фільтри позначені в ділянці активних фільтрів угорі.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Певні типи змін не можна позначити як «незначні», тож цей фільтр конфліктує з такими фільтрами за типом змін: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Цей фільтр за типом змін конфліктує з фільтром «Незначні редагування». Певні типи змін не можна позначати як «незначні».",
+       "rcfilters-filtergroup-lastRevision": "Поточна версія",
+       "rcfilters-filter-lastrevision-label": "Поточна версія",
+       "rcfilters-filter-lastrevision-description": "Остання зміна на сторінці.",
+       "rcfilters-filter-previousrevision-label": "Попередні версії",
+       "rcfilters-filter-previousrevision-description": "Усі зміни, які не є поточною версією сторінки.",
        "rcnotefrom": "Нижче знаходяться {{PLURAL:$5|редагування}} з <strong>$3, $4</strong> (відображено до <strong>$1</strong>).",
+       "rclistfromreset": "Скинути вибір дати",
        "rclistfrom": "Показати редагування починаючи з $3 $2.",
        "rcshowhideminor": "$1 незначні редагування",
        "rcshowhideminor-show": "Показати",
        "rcshowhidecategorization": "$1 категоризацію сторінок",
        "rcshowhidecategorization-show": "Показати",
        "rcshowhidecategorization-hide": "Приховати",
-       "rclinks": "Показати останні $1 редагувань за $2 днів<br />$3",
+       "rclinks": "Показати останні $1 редагувань за $2 днів",
        "diff": "різн.",
        "hist": "історія",
        "hide": "сховати",
        "php-uploaddisabledtext": "Завантаження файлів вимкнене у налаштуваннях PHP. Будь ласка, перевірте значення file_uploads.",
        "uploadscripted": "Файл містить HTML-код або скрипт, який може неправильно обробитися браузером.",
        "upload-scripted-pi-callback": "Неможливо завантажити файл, що містить інструкції опрацювання таблиці стилів XML.",
+       "upload-scripted-dtd": "Неможливо завантажувати SVG-файли, які містять нестандартну декларацію DTD.",
        "uploaded-script-svg": " \t\t\nЗнайдений небезпечний елемент з підтримкою сценаріїв «$1» в завантаженому файлі SVG.",
        "uploaded-hostile-svg": " \t\nЗнайдений небезпечний CSS-код в елементі стилю завантаженого файлу SVG.",
        "uploaded-event-handler-on-svg": " \t\nУстановка атрибутів обробника подій <code>$1=\"$2\"</code> не дозволено для SVG-файлів.",
        "noindex-category-desc": "Сторінка не індексується пошуковими роботами, тому що на ній є «чарівне слово» <code><nowiki>__NOINDEX__</nowiki></code>, і вона знаходиться в просторі імен, де дозволений цей прапор).",
        "index-category-desc": "На сторінці є «чарівне слово» <code><nowiki>__INDEX__</nowiki></code> (і сторінка знаходиться в просторі назв, де дозволений цей прапор), тому вона індексується пошуковими роботами в тих випадках, коли цього зазвичай не відбувається.",
        "post-expand-template-inclusion-category-desc": "Розмір сторінки стане більший за <code>$wgMaxArticleSize</code> після показу всіх шаблонів, тому деякі з них не були показані повністю.",
-       "post-expand-template-argument-category-desc": "Сторінка стане більшою за <code>$wgMaxArticleSize</code> після розкриття аргументу шаблона (що-небудь в потрійних фігурних дужках, наприклад, <code>{{{Foo}}})</code>).",
+       "post-expand-template-argument-category-desc": "Сторінка стане більшою за <code>$wgMaxArticleSize</code> після розкриття аргументу шаблону (щось у потрійних фігурних дужках, наприклад, <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "На сторінці також використовується занадто багато ресурсомістких функцій (таких, як <code>#ifexist</code>). Детальніше - на сторінці [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Сторінка містить некоректне файлове посилання (посилання на неіснуючий файл).",
        "hidden-category-category-desc": "Ця категорія містить мітку <code><nowiki>__HIDDENCAT__</nowiki></code> у вмісті сторінки, що типово запобігає її відображенню на сторінках в розділі категорій.",
        "enotif_body_intro_moved": "Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було перейменовано $PAGEEDITDATE {{GENDER:$2|користувачем|користувачкою}} $2, див. поточну версію $3.",
        "enotif_body_intro_restored": "Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було відновлено $PAGEEDITDATE {{GENDER:$2|користувачем|користувачкою}} $2, див. поточну версію $3.",
        "enotif_body_intro_changed": "Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було змінено $PAGEEDITDATE {{GENDER:$2|користувачем|користувачкою}} $2, див. поточну версію $3.",
-       "enotif_lastvisited": "Див. $1 для перегляду всіх змін, що відбулися після вашого останнього перегляду.",
-       "enotif_lastdiff": "Ð\94ив. $1 Ð´Ð»Ñ\8f Ð¾Ð·Ð½Ð°Ð¹Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ\8f Ð· Ñ\86Ñ\96Ñ\94Ñ\8e Ð·Ð¼Ñ\96ноÑ\8e.",
+       "enotif_lastvisited": "Див. $1, щоб переглянути всі зміни, які відбулися після вашого останнього відвідування.",
+       "enotif_lastdiff": "Щоб Ð¿ÐµÑ\80еглÑ\8fнÑ\83Ñ\82и Ñ\86Ñ\8e Ð·Ð¼Ñ\96нÑ\83, Ð´Ð¸Ð². $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Ваша дружня система сповіщення {{grammar:genitive|{{SITENAME}}}}\n\n--\nЗміна налаштувань повідомлень електронною поштою\n{{canonicalurl:{{#special:Preferences}}}}\n\nЩоб змінити налаштування списку спостереження, перейдіть за посиланням\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nЩоб вилучити сторінку зі списку спостереження, відвідайте сторінку\n$UNWATCHURL\n\nЗворотній зв'язок і допомога:\n$HELPPAGE",
        "created": "створена",
        "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": "Відкинуті редагування {{GENDER:$3|користувача|користувачки}} $1; повернення до версії {{GENDER:$4|користувача|користувачки}} $2.",
        "rollback-success-notify": "Відкинуті редагування користувача $1; \nповернено до останньої версії користувача $2. [$3 Показати зміни]",
        "sessionfailure-title": "Помилка сеансу",
        "sessionfailure": "Здається, виникли проблеми з поточним сеансом роботи;\nця дія була скасована з метою попередити «захоплення сеансу».\nБудь ласка, натисніть кнопку «Назад» і перезавантажте сторінку, з якої ви прийшли.",
        "undeleteviewlink": "переглянути",
        "undeleteinvert": "Інвертувати виділення",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|редагування|редагування|редагувань}} відновлено",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|версія|версії|версій}} та $2 {{PLURAL:$2|файл|файли|файлів}} відновлено",
-       "undeletedfiles": "$1 {{PLURAL:$1|файл|файли|файлів}} відновлено",
        "cannotundelete": "Частина або вся процедура відновлення зазнала невдачі:\n$1",
        "undeletedpage": "'''Сторінка «$1» відновлена'''\n\nДив. [[Special:Log/delete|список вилучень]], щоб дізнатися про останні вилучення та відновлення.",
        "undelete-header": "Список нещодавно вилучених сторінок можна переглянути в [[Special:Log/delete|журналі вилучень]].",
        "sp-contributions-uploads": "завантаження",
        "sp-contributions-logs": "журнали",
        "sp-contributions-talk": "обговорення",
-       "sp-contributions-userrights": "управління правами користувача",
+       "sp-contributions-userrights": "управління правами {{GENDER:$1|користувача|користувачки}}",
        "sp-contributions-blocked-notice": "Цей користувач наразі заблокований. Останній запис у журналі блокувань такий:",
        "sp-contributions-blocked-notice-anon": "Доступ з цієї IP-адреси зараз заблокований.\nДалі наведено останній запис з журналу блокувань:",
        "sp-contributions-search": "Пошук внеску",
        "unblocked-id": "Блокування $1 було зняте.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] розблоковано.",
        "blocklist": "Заблоковані користувачі",
+       "autoblocklist": "Автоблокування",
+       "autoblocklist-submit": "Пошук",
+       "autoblocklist-legend": "Вивести список автоблокувань",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Локальне|Локальні}} автоблокування",
+       "autoblocklist-empty": "Список автоблокувань порожній.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Інше|Інші}} автоблокування",
        "ipblocklist": "Список заблокованих адрес та користувачів",
        "ipblocklist-legend": "Пошук заблокованого користувача",
        "blocklist-userblocks": "Сховати блокування облікових записів",
        "delete_and_move_text": "Сторінка з назвою [[:$1|«$1»]] вже існує.\nБажаєте вилучити її для можливості перейменування?",
        "delete_and_move_confirm": "Так, вилучити для перейменування",
        "delete_and_move_reason": "Вилучена для можливості перейменування сторінки «[[$1]]»",
-       "selfmove": "Неможливо перейменувати сторінку: поточна й нова назви сторінки співпадають.",
+       "selfmove": "Неможливо перейменувати сторінку: поточна й нова назви сторінки збігаються.",
        "immobile-source-namespace": "Не можна перейменовувати сторінки з простору назв «$1»",
        "immobile-target-namespace": "Не можна перейменовувати сторінки до простору назв «$1»",
        "immobile-target-namespace-iw": "Інтервікі-посилання не підходить для перейменування сторінки.",
        "tooltip-pt-mycontris": "{{GENDER:|Ваш}} внесок",
        "tooltip-pt-anoncontribs": "Список редагувань, зроблених з цієї IP-адреси",
        "tooltip-pt-login": "Заохочуємо Вас увійти в систему, але це необов'язково.",
+       "tooltip-pt-login-private": "Вам треба увійти в систему, щоб використовувати цю вікі",
        "tooltip-pt-logout": "Вийти з системи",
        "tooltip-pt-createaccount": "Пропонуємо створити обліковий запис і увійти в систему; однак, це не обов'язково",
        "tooltip-ca-talk": "Обговорення змісту сторінки",
        "anonymous": "{{PLURAL:$1|1=Анонімний користувач|Анонімні користувачі}} {{grammar:genitive|{{SITENAME}}}}",
        "siteuser": "Користувач {{grammar:genitive|{{SITENAME}}}} $1",
        "anonuser": "анонімний користувач {{grammar:genitive|{{SITENAME}}}} $1",
-       "lastmodifiedatby": "Ð\9eÑ\81Ñ\82аннÑ\8f Ð·Ð¼Ñ\96на $2, $1 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87ем $3.",
+       "lastmodifiedatby": "ЦÑ\8e Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83 Ð²Ð¾Ñ\81Ñ\82аннÑ\94 Ð²Ñ\96дÑ\80едаговано $3 Ð¾ $2, $1.",
        "othercontribs": "Базується на праці $1.",
        "others": "інші",
        "siteusers": "{{PLURAL:$2|1={{GENDER:$1|Користувач|Користувачка}}|Користувачі}} {{grammar:genitive|{{SITENAME}}}} $1",
        "svg-long-error": "неправильний SVG-файл: $1",
        "show-big-image": "Повна роздільність",
        "show-big-image-preview": "Розмір при попередньому перегляді: $1.",
-       "show-big-image-preview-differ": "Розмір цього $3-превью для вихідного $2-файлу: $1.",
+       "show-big-image-preview-differ": "Розмір цього попереднього перегляду $3 для вихідного $2-файлу: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Інша роздільність|Інші роздільності}}: $1.",
        "show-big-image-size": "$1 × $2 пікселів",
        "file-info-gif-looped": "кільцеве",
        "newimages-summary": "Ця спеціальна сторінка показує останні завантажені файли.",
        "newimages-legend": "Фільтр",
        "newimages-label": "Назва файлу (або її частина):",
+       "newimages-user": "IP-адреса або ім'я користувача.",
        "newimages-showbots": "Показати завантаження ботами",
        "newimages-hidepatrolled": "Приховати відпатрульовані завантаження",
        "noimages": "Файли відсутні.",
        "confirmrecreate-noreason": "{{GENDER:$1|Користувач|Користувачка}} [[User:$1|$1]] ([[User talk:$1|обговорення]]) {{GENDER:$1|вилучив|вилучила}} цю сторінку після того, як Ви її почали редагувати. Будь ласка, підтвердіть, що Ви дійсно хочете її відновити.",
        "recreate": "Повторно створити",
        "unit-pixel": " пікс.",
+       "confirm-purge-title": "Очистити кеш цієї сторінки",
        "confirm_purge_button": "Гаразд",
        "confirm-purge-top": "Очистити кеш цієї сторінки?",
        "confirm-purge-bottom": "Після очищення кешу сторінки буде показана її остання версія.",
        "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-restore": "$1 {{GENDER:$2|відновив|відновила}} сторінку $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|відновив|відновила}} сторінку $3",
+       "restore-count-revisions": "{{PLURAL:$1|$1 версія|$1 версії|$1 версій}}",
+       "restore-count-files": "{{PLURAL:$1|$1 файл|$1 файли|$1 файлів}}",
        "logentry-delete-event": "$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5 запису журналу|$5 записів журналу}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5|$5 версії|$5 версій}} на сторінці $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|змінив|змінила}} видимість записів журналу подій $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|оновив|оновила}} мітки версії $4 сторінки $3 ({{PLURAL:$7|додано}} $6; {{PLURAL:$9|вилучено}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|оновив|оновила}} мітки запису журналу $5 сторінки $3 ({{PLURAL:$7|додано}} $6; {{PLURAL:$9|вилучено}} $8)",
        "rightsnone": "(нема)",
-       "revdelete-summary": "коментар до редагування",
        "rightslogentry-temporary-group": "$1 (тимчасово, до $2)",
        "feedback-adding": "Додавання відгуку на сторінку ...",
        "feedback-back": "Назад",
        "special-characters-group-thai": "Тайські",
        "special-characters-group-lao": "Лаоські",
        "special-characters-group-khmer": "Кхмерські",
+       "special-characters-group-canadianaboriginal": "Письмо канадських аборигенів",
        "special-characters-title-endash": "коротке тире",
        "special-characters-title-emdash": "довге тире",
        "special-characters-title-minus": "мінус",
        "mw-widgets-titleinput-description-redirect": "перенаправлення на $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Додати категорію...",
        "mw-widgets-usersmultiselect-placeholder": "Додати ще...",
+       "date-range-from": "Від дати:",
+       "date-range-to": "До дати:",
        "sessionmanager-tie": "Не можна поєднувати кілька типів автентифікації запиту: $1.",
        "sessionprovider-generic": "сесій $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "сесій на основі кук",
        "restrictionsfield-label": "Дозволені діапазони IP-адрес:",
        "restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "версія $1",
-       "pageid": "ID сторінки $1"
+       "pageid": "ID сторінки $1",
+       "rawhtml-notallowed": "Теги &lt;html&gt; не можна використовувати за межами звичайних сторінок.",
+       "gotointerwiki": "Ви покидаєте сайт {{SITENAME}}",
+       "gotointerwiki-invalid": "Вказана назва неприпустима.",
+       "gotointerwiki-external": "Ви збираєтесь покинути сайт {{SITENAME}}, щоб відвідати проект [[$2]], який є окремим веб-сайтом.\n\n[$1 Клацніть тут, щоб продовжити, перейшовши до $1].",
+       "undelete-cantedit": "Ви не можете відновити цю сторінку, оскільки Ви не маєте прав на редагування цієї сторінки.",
+       "undelete-cantcreate": "Ви не можете відновити цю сторінку, оскільки сторінка з такою назвою не існує, і Ви не маєте прав на створення цієї сторінки."
 }
index 860697d..48c50c5 100644 (file)
@@ -30,7 +30,8 @@
                        "امین اکبر",
                        "Jdforrester",
                        "قیصرانی",
-                       "Junaid Ahmad"
+                       "Junaid Ahmad",
+                       "Abuaneeqa"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "searcharticle": "چلیں",
        "history": "تاریخچۂ صفحہ",
        "history_short": "تاریخچہ",
+       "history_small": "تاریخچہ",
        "updatedmarker": "میری آخری آمد کے بعد تجدید شدہ",
        "printableversion": "قابل طبع نسخہ",
        "permalink": "مستقل ربط",
        "login": "داخل ہوں",
        "login-security": "اپنی شناخت کی تصدیق کریں",
        "nav-login-createaccount": "کھاتہ کھولیں یا اندراج کریں",
-       "userlogin": "کھاتہ کھولیں یا اندراج کریں",
-       "userloginnocreate": "داخلِ نوشتہ ہوجائیے",
        "logout": "اخراج",
        "userlogout": "خارج ہوجائیں",
        "notloggedin": "داخل نہیں",
        "userlogin-noaccount": "کیا آپ نے کھاتہ نہیں بنایا ہوا؟",
        "userlogin-joinproject": "منسلک ہو {{SITENAME}} سے",
-       "nologin": "کیا آپ نے کھاتہ نہیں بنایا ہوا؟ '''$1'''۔",
-       "nologinlink": "کھاتا بنائیں",
        "createaccount": "کھاتہ کھولیں",
-       "gotaccount": "پہلے سے کھاتہ بنا ہوا ہے؟ '''$1'''۔",
-       "gotaccountlink": "داخل ہوجائیے",
-       "userlogin-resetlink": "داخلِ نوشتہ ہونے کی تفاصیل بھول گئے ہیں؟",
        "userlogin-resetpassword-link": "کلمہ شناخت بھول گئے؟",
        "userlogin-helplink2": "داخل نوشتگی میں معاونت درکار ہے؟",
        "userlogin-loggedin": "آپ ویکیپیڈیا میں بطور صارف {{GENDER:$1|$1}}  پہلے سے داخل نوشتہ (logged in) ہیں۔\nدوسرے کھاتہ سے داخل ہونے کے لیے درج ذیل خانے پر کریں۔",
        "createaccountmail": "عارضی پاسورڈ استعمال کریں اور اسے متعینہ برقی ڈاک پتہ پر ارسال کریں",
        "createaccountmail-help": "پاس ورڈ معلوم کیے بغیر کسی دوسرے شخص کا کھاتہ بنانے کے لیے اسے استعمال کیا جا سکتا ہے۔",
        "createacct-realname": "اصلی نام (اختیاری)",
-       "createaccountreason": "وجہ:",
        "createacct-reason": "وجہ",
        "createacct-reason-ph": "آپ دوسرا کھاتہ کیوں تخلیق کررہے ہیں",
        "createacct-reason-help": "نوشتہ کھاتہ سازی میں نظر آنے والا پیغام",
        "preview": "نمائش",
        "showpreview": "نمائش",
        "showdiff": "تبدیلیاں دکھائیں",
-       "blankarticle": "<strong>انتباہ:</strong> آپ خالی صفحہ تخلیق کر رہے ہیں۔\nاگر آپ «{{int:savearticle}}» پر دوبارہ کلک کریں تو یہ صفحہ بغیر کسی مواد کے محفوظ ہو جائے گا۔",
+       "blankarticle": "<strong>انتباہ:</strong> آپ خالی صفحہ تخلیق کر رہے ہیں۔\nاگر آپ «$1» پر دوبارہ کلک کریں تو یہ صفحہ بغیر کسی مواد کے محفوظ ہو جائے گا۔",
        "anoneditwarning": "<strong>انتباہ:</strong> آپ ویکیپیڈیا میں داخل نہیں ہوئے ہیں۔ لہذا اگر آپ اس صفحہ میں کوئی ترمیم کرتے ہیں تو آپکا آئی پی ایڈریس (IP) اس صفحہ کے تاریخچہ ترمیم میں محفوظ ہوجائے گا۔ اگر آپ  <strong>[$1 لاگ ان]</strong> ہوتے ہیں یا کھاتہ نہ ہونے کی صورت میں <strong>[$2 کھاتہ بنا لیتے ہیں]</strong> تو تو آپ کی ترامیم آپ کے صارف نام سے محفوظ ہوگی، جنھیں آپ کسی بھی وقت ملاحظہ کر سکتے ہیں۔",
        "anonpreviewwarning": "<em>آپ داخل نہیں ہیں، چنانچہ تبدیلیاں محفوظ کرنے کی صورت میں اس صفحہ کا تاریخچہ آپ کا آئی پی پتا محفوظ کر لے گا۔</em>",
        "missingsummary": "'''انتباہ:''' آپ نے ترمیمی خلاصہ مہیّا نہیں کیا.\nاگر آپ نے محفوظ کا بٹن دوبارہ دبایا تو آپ کی ترمیم بغیر کسی خلاصہ کے محفوظ ہوجائے گی.",
-       "selfredirect": "<strong>انتباہ:</strong> آپ پیش نظر صفحہ کو خود اسی کی جانب رجوع مکرر کر رہے ہیں۔\nشاید آپ نے رجوع مکرر کا غلط ہدف درج کیا ہے یا غلط صفحہ میں ترمیم کر رہے ہیں۔\nتاہم اگر آپ «{{int:savearticle}}» پر دوبارہ کلک کریں تو بہرصورت اس رجوع مکرر کو بنا دیا جائے گا۔",
+       "selfredirect": "<strong>انتباہ:</strong> آپ پیش نظر صفحہ کو خود اسی کی جانب رجوع مکرر کر رہے ہیں۔\nشاید آپ نے رجوع مکرر کا غلط ہدف درج کیا ہے یا غلط صفحہ میں ترمیم کر رہے ہیں۔\nتاہم اگر آپ «$1» پر دوبارہ کلک کریں تو بہرصورت اس رجوع مکرر کو بنا دیا جائے گا۔",
        "missingcommenttext": "براہِ کرم! تبصرہ نیچے درج کیجئے.",
-       "missingcommentheader": "<strong>یاددہانی:</strong>  آپ نے اِس تبصرہ کیلئے عنوان یا شہ سرخی مہیّا نہیں کی ہے۔\nاگر آپ نے \"{{int:savearticle}}\" کا بٹن دوبارہ دبایا تو آپ کا تبصرہ بغیر کسی عنوان کے محفوظ ہوجائے گا۔",
+       "missingcommentheader": "<strong>یاددہانی:</strong>  آپ نے اِس تبصرہ کیلئے عنوان یا شہ سرخی مہیّا نہیں کی ہے۔\nاگر آپ نے \"$1\" کا بٹن دوبارہ دبایا تو آپ کا تبصرہ بغیر کسی عنوان کے محفوظ ہوجائے گا۔",
        "summary-preview": "نمائش خلاصہ:",
        "subject-preview": "عنوان/شہ سرخی کی نمائش:",
        "previewerrortext": "آپ کی تبدیلیوں کی نمائش دکھانے کے دوران میں کوئی نقص واقع ہو گیا ہے۔",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" کے طور پر محفوظ صفحات میں ترمیم",
        "right-editcontentmodel": "صفحہ کے مواد کے ماڈل میں ترمیم",
        "right-editinterface": "صارف انٹرفیس میں ترمیم",
-       "right-editusercssjs": "دیگر صارفین کی سی ایس ایس اور جاوا اسکرپٹ فائلوں میں ترمیم",
        "right-editusercss": "دیگر صارفین کی سی ایس ایس فائلوں میں ترمیم",
        "right-edituserjs": "دیگر صارفین کی جاوا اسکرپٹ فائلوں میں ترمیم",
        "right-editmyusercss": "اپنی ذاتی سی ایس ایس فائلوں میں ترمیم",
        "action-applychangetags": "اپنی تبدیلیوں پر ٹیگ گاری کرنے",
        "action-changetags": "انفرادی نسخوں اور نوشتہ کے اندراج پر ٹیگوں کو لگانے اور ہٹانے",
        "action-deletechangetags": "ڈیٹابیس سے ٹیگوں کو حذف کرنے",
-       "action-purge": "اس صفحہ کا کیشے خالی کرنے",
+       "action-purge": "اس صفحہ کا کیشے خالی کریں",
        "nchanges": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|آخری آمد کے بعد سے}}",
        "enhancedrc-history": "تاریخچہ",
        "recentchanges-legend-heading": "<strong>اختصارات:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (نیز [[Special:NewPages|جدید صفحات کی فہرست]]) ملاحظہ فرمائیں",
        "recentchanges-submit": "دکھائیں",
+       "rcfilters-filter-user-experience-level-experienced-label": "تجربہ کار صارف",
        "rcnotefrom": "ذیل میں <strong>$2</strong> سے کی گئی {{PLURAL:$5|تبدیلی|تبدیلیاں}} <strong>$1</strong> تک دکھائی جا رہی ہیں۔",
        "rclistfrom": "$2، $3ء سے ہونے والی نئی تبدیلیاں دکھائیں",
        "rcshowhideminor": "معمولی ترامیم $1",
        "rcshowhidecategorization": "صفحاتی زمرہ بندی $1",
        "rcshowhidecategorization-show": "دکھائیں",
        "rcshowhidecategorization-hide": "چھپائیں",
-       "rclinks": "آخری $2 روز میں ہونے والی $1 تبدیلیوں کا مشاہدہ کریں<br />$3",
+       "rclinks": "آخری $2 روز میں ہونے والی $1 تبدیلیوں کا مشاہدہ کریں",
        "diff": "فرق",
        "hist": "تاریخچہ",
        "hide": "چھـپائیں",
        "undeleteviewlink": "دکھاؤ",
        "undeleteinvert": "انتخاب بالعکس",
        "undeletecomment": "وجہ:",
-       "undeletedrevisions": "{{PLURAL:$1|1 نظر ثانی|$1 نظر ثانیاں}} بحال",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 نسخہ|$1 نسخے}} اور {{PLURAL:$2|1 فائل|$2 فائلیں}} بحال",
-       "undeletedfiles": "{{PLURAL:$1|1 فائل|$1 فائل}} بحال کی {{PLURAL:$1|گئی|گئیں}}",
        "cannotundelete": "کلی یا جزوی طور پر بحالی کا اقدام ناکام رہا:\n$1",
        "undeletedpage": "<strong>$1 کو بحال کر دیا گیا</strong>\n\nحالیہ حذف شدگیوں اور بحالیوں کا نوشتہ دیکھنے کے لیے [[Special:Log/delete|نوشتہ حذف شدگی]] ملاحظہ فرمائیں۔",
        "undelete-header": "حالیہ حذف شدہ صفحات کے لیے [[Special:Log/delete|نوشتۂ حذف شدگی]] دیکھیں۔",
        "logentry-tag-update-revision": "$1 نے صفحہ $3 کے نسخہ $4 پر موجود ٹیگوں کو {{GENDER:$2|تازہ کیا}} ({{PLURAL:$7|شامل کیا گیا|شامل کیے گئے}} $6؛ {{PLURAL:$9|حذف کیا گیا|حذف کیے گئے}} $8)",
        "logentry-tag-update-logentry": "$1 نے صفحہ $3 کے اندراج نوشتہ $5 پر موجود ٹیگوں کو {{GENDER:$2|تازہ کیا}} ({{PLURAL:$7|شامل کیا گیا|شامل کیے گئے}} $6؛ {{PLURAL:$9|حذف کیا گیا|حذف کیے گئے}} $8)",
        "rightsnone": "(کچھ نہیں)",
-       "revdelete-summary": "خلاصۂ تدوین",
        "feedback-adding": "صفحہ میں تبصرہ درج کیا جا رہا ہے۔۔۔",
        "feedback-back": "واپس",
        "feedback-bugcheck": "زبردست! جانچ لیں کہ کہیں پہلے ہی [$1 اس کی اطلاع نہ دے دی گئی ہو]۔",
index 99ab540..29cd8c3 100644 (file)
        "password-change-forbidden": "Siz bu vikida maxfiy soʻzni oʻzgartira olmaysiz.",
        "login": "Kirish",
        "nav-login-createaccount": "Kirish / Hisob yaratish",
-       "userlogin": "Kirish / Hisob yaratish",
-       "userloginnocreate": "Kirish",
        "logout": "Chiqish",
        "userlogout": "Chiqish",
        "notloggedin": "Siz tizimga kirmagansiz",
        "userlogin-noaccount": "Hisobingiz yoʻqmi?",
        "userlogin-joinproject": "{{SITENAME}}ga aʼzo boʻlish",
-       "nologin": "Hisobingiz yoʻqmi? '''$1'''.",
-       "nologinlink": "Hisob yaratish",
        "createaccount": "Hisob yaratish",
-       "gotaccount": "Hisobingiz bormi? '''$1'''.",
-       "gotaccountlink": "Kirish",
-       "userlogin-resetlink": "Kirish maʻlumotlaringiz esdan chiqdimi?",
        "userlogin-resetpassword-link": "Maxfiy so‘zni unutib qoʻydingizmi?",
        "userlogin-helplink2": "Kirish uchun yordam",
        "userlogin-loggedin": "Siz {{GENDER:$1|$1}} nomi bilan kirgansiz.\nBoshqa hisob raqami orqali kirish uchun quyidagi formadan foydalaning.",
        "createacct-another-email-ph": "Elektron pochta manzilini kiriting",
        "createaccountmail": "Tasodifan tanlab beriladigan vaqtinchalik maxfiy soʻzdan foydalanish (elektron pochta manzilingizga joʻnatiladi)",
        "createacct-realname": "Haqiqiy ismi (ixtiyoriy)",
-       "createaccountreason": "Sabab:",
        "createacct-reason": "Sabab",
        "createacct-reason-ph": "Nimaga yana boshqa hisob yaratyapsiz",
        "createacct-submit": "Hisob yaratish",
        "passwordreset-emaildisabled": "Email xususiyatlari ushbu vikida oʻchirib qoʻyilgan.",
        "passwordreset-username": "Foydalanuvchi nomi:",
        "passwordreset-domain": "Domen:",
-       "passwordreset-capture": "Xatni koʻrmoqchimisiz?",
        "passwordreset-email": "Elektron pochta manzilingiz:",
        "passwordreset-emailelement": "Foydalanuvchi ismi: \n$1\n\nVaqtinchalik maxfiy so'z: \n$2",
        "changeemail": "Elektron pochta manzilini oʻzgartirish",
        "editingsection": "Tahrirlanmoqda — $1 (boʻlimi)",
        "editingcomment": "Yangi mavzu yaratilmoqda — $1",
        "editconflict": "Tahrirlash toʻqnashuvi: $1",
-       "explainconflict": "Sahifani tahrirlayotgan mahalingizda boshqa birov unga oʻzgarish kiritib ulgurdi.\nYuqoridagi tahrir oynasida sahifaning joriy matnini koʻrishingiz mumkin.\nPastdagida esa siz kiritgan oʻzgarishlar koʻrsatilgan.\nKiritmoqchi boʻlgan oʻzgarishlaringizni pastdagi oynadan yuqoridagiga oʻtkazing.\n«{{int:savearticle}}» tugmasini bossangiz <strong>faqat</strong> yuqoridagi matn saqlanadi.",
+       "explainconflict": "Sahifani tahrirlayotgan mahalingizda boshqa birov unga oʻzgarish kiritib ulgurdi.\nYuqoridagi tahrir oynasida sahifaning joriy matnini koʻrishingiz mumkin.\nPastdagida esa siz kiritgan oʻzgarishlar koʻrsatilgan.\nKiritmoqchi boʻlgan oʻzgarishlaringizni pastdagi oynadan yuqoridagiga oʻtkazing.\n«$1» tugmasini bossangiz <strong>faqat</strong> yuqoridagi matn saqlanadi.",
        "yourtext": "Sizning matningiz",
        "editingold": "<strong>Ogohlantirish: Siz sahifaning eski nusxasini tahrirlayapsiz.</strong> Uni shunday holicha saqlasangiz, keyingi nusxalardagi oʻzgarishlar yoʻqotiladi.",
        "yourdiff": "Farqlar",
        "saveprefs": "Saqlash",
        "restoreprefs": "Barcha moslamalarni dastlabki holatiga qaytarish",
        "prefs-editing": "Tahrirlash",
-       "rows": "Qatorlar soni:",
-       "columns": "Ustunlar soni:",
        "searchresultshead": "Qidiruv",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Chala maqolalarga</a> ishorat keltirish uchun pastki chegara:",
        "stub-threshold-disabled": "Oʻchirib qoʻyilgan",
        "rcshowhidemine": "Oʻz tahrirlarimni $1",
        "rcshowhidemine-show": "koʻrsat",
        "rcshowhidemine-hide": "yashir",
-       "rclinks": "Oxirgi $2 kun ichida sodir boʻlgan $1 ta oʻzgarish koʻrsatildi<br />$3",
+       "rclinks": "Oxirgi $2 kun ichida sodir boʻlgan $1 ta oʻzgarish koʻrsatildi",
        "diff": "farq",
        "hist": "tarix",
        "hide": "yashir",
        "undeleteviewlink": "koʻrib chiqish",
        "undeleteinvert": "Tanlash tartibini almashtirish",
        "undeletecomment": "Sababi:",
-       "undeletedrevisions": "{{PLURAL:$1|1 ta oʻzgarish|$1 ta tahrirlar}} tiklandi",
-       "undeletedfiles": "{{PLURAL:$1|Bitta fayl|$1 ta fayl}} tiklandi",
        "undelete-search-title": "O'chirilgan sahifalarni qidirish",
        "undelete-search-box": "O'chirilgan sahifalarni qidirish",
        "undelete-search-prefix": "Bundan boshlangan sahifalarni koʻrsatish:",
        "feedback-close": "Bajarildi",
        "searchsuggest-search": "Qidiruv",
        "searchsuggest-containing": "ichida bu boʻlgan...",
-       "api-error-unknown-code": "Noaniq xato: \"$1\".",
        "api-error-unknownerror": "Noaniq xato: \"$1\".",
        "limitreport-title": "Tahlillagich maʼlumotlari:",
        "special-characters-group-latin": "Lotin",
index c72fc02..fc13881 100644 (file)
        "externaldberror": "Se xè verifegà n'erore con el server de autenticasion esterno, opure no se dispone de łe autorizasion nesesarie par ajornare el proprio aceso esterno.",
        "login": "Entra",
        "nav-login-createaccount": "Entra / Regìstrete",
-       "userlogin": "Entra / Regìstrete",
-       "userloginnocreate": "Entra",
        "logout": "Và fora",
        "userlogout": "và fora",
        "notloggedin": "No te sì entrà col to nome utente",
        "userlogin-noaccount": "Gheto mia na utensa?",
        "userlogin-joinproject": "Unìssete a {{SITENAME}}",
-       "nologin": "No te sito gnancora iscrito? '''$1'''.",
-       "nologinlink": "Falo desso",
        "createaccount": "Crea un utente novo",
-       "gotaccount": "Sito zà iscrito? '''$1'''.",
-       "gotaccountlink": "Entra",
-       "userlogin-resetlink": "Desmentegà i to dati d'aceso?",
        "userlogin-resetpassword-link": "Te gheto desmentegà ła paroła d'ordine?",
        "userlogin-helplink2": "Ajuto par 'ndar drento",
        "createacct-emailrequired": "Indirisso e-mail",
        "createacct-another-email-ph": "Inserissi l'indirizo de e-mail",
        "createaccountmail": "Dopara na password caxuałe tenporanea e inviała al indiriso e-mail spesifegà cuà soto",
        "createacct-realname": "Nome reale (opsionale)",
-       "createaccountreason": "Motivassion:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Com'èla te sì drio crear n'altra utensa",
        "createacct-submit": "Crea la to utensa",
        "anonpreviewwarning": "\"No te ghe eseguio el login. Salvando el to indiriso IP sarà rejistrà ne ła cronołosia de sta voxe.\"",
        "missingsummary": "'''Ocio:''' No te ghè indicà l'ogeto de la modifica. Macando de novo 'Salva la pagina' la modifica la vegnerà con l'ogeto vodo.",
        "missingcommenttext": "Inserissi un comento qua soto.",
-       "missingcommentheader": "'''Ocio:''' No te ghè fornìo un ogeto par sto comento. Macando da novo \"{{int:savearticle}}\" la modifica la vegnarà salvà sensa ogeto.",
+       "missingcommentheader": "'''Ocio:''' No te ghè fornìo un ogeto par sto comento. Macando da novo \"$1\" la modifica la vegnarà salvà sensa ogeto.",
        "summary-preview": "Anteprima del comento:",
        "subject-preview": "Anteprima ogeto/intestazion:",
        "blockedtitle": "Utente blocà",
        "editingsection": "Canbia $1 (sezion)",
        "editingcomment": "Modifica de $1 (sezion nova)",
        "editconflict": "Conflito de edizion: $1",
-       "explainconflict": "Qualcun altro el ga salvà na so version de ła voxe nel tempo in cui te stavi preparando ła to version.\nLa casela de modifica de sora contegne el testo de la voxe ne ła so forma atuałe (el testo atualmente online).\nLe to modifiche łe xè invese contegnue ne ła caseła de modifica de soto.\nTe dovarè inserire, se te vołi, le to modifiche nel testo esistente, e perciò scrivarle ne ła caseła de sora.\n'''Soltanto''' el testo ne ła caseła de sora el sarà salvà se te struchi el botón \"{{int:savearticle}}\".",
+       "explainconflict": "Qualcun altro el ga salvà na so version de ła voxe nel tempo in cui te stavi preparando ła to version.\nLa casela de modifica de sora contegne el testo de la voxe ne ła so forma atuałe (el testo atualmente online).\nLe to modifiche łe xè invese contegnue ne ła caseła de modifica de soto.\nTe dovarè inserire, se te vołi, le to modifiche nel testo esistente, e perciò scrivarle ne ła caseła de sora.\n'''Soltanto''' el testo ne ła caseła de sora el sarà salvà se te struchi el botón \"$1\".",
        "yourtext": "El to testo",
        "storedversion": "Version in archivio",
        "nonunicodebrowser": "'''OCIO: Te stè doparando un browser mìa conpatibile coi caràteri Unicode. Par consentir la modifica de le pagine senza crear inconvenienti, i caràteri non ASCII i vien mostrà ne la casela de modifica soto forma de codici esadecimali.'''",
        "right-protect": "Canbiar i livèi de protezion e modificar le pagine protete ricorsivamente",
        "right-editprotected": "Modifica pagine protete",
        "right-editinterface": "Modifica l'interfacia utente",
-       "right-editusercssjs": "Modifica i file CSS e JS de altri utenti",
        "right-editusercss": "Modifica i file CSS de altri utenti",
        "right-edituserjs": "Modifica i file JS de altri utenti",
        "right-rollback": "Anula in prèssia le modifiche fate da l'ultimo utente su na pagina particolar.",
        "rcshowhidemine": "$1 i me canbiamenti",
        "rcshowhidemine-show": "Mostra",
        "rcshowhidemine-hide": "Scondi",
-       "rclinks": "Fà védar i ultimi $1 canbiamenti fati in tei ultimi $2 zorni<br />$3",
+       "rclinks": "Fà védar i ultimi $1 canbiamenti fati in tei ultimi $2 zorni",
        "diff": "dif",
        "hist": "stor",
        "hide": "scondi",
        "undeleteviewlink": "varda",
        "undeleteinvert": "Inverti selession",
        "undeletecomment": "Motivassion:",
-       "undeletedrevisions": "{{PLURAL:$1|Una revision recuperà|$1 revision recuperà}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Una revision|$1 revision}} e $2 file recuperà",
-       "undeletedfiles": "{{PLURAL:$1|Un file recuperà|$1 file recuperà}}",
        "cannotundelete": "Ripristino nó riusìo:\n$1",
        "undeletedpage": "'''$1 la xè stà recuperà'''\n\nConsulta el [[Special:Log/delete|registro de le scancełassion]] par vardare łe scancełassion e i recuperi pì reçenti.",
        "undelete-header": "Varda el [[Special:Log/delete|registro de le scancelazion]] par védar le scancelazion piassè reçenti.",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|el|la}} xe stà automategamente promoso/a da $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|el|la}} gà cargà $3",
        "rightsnone": "(nissun)",
-       "revdelete-summary": "modifica ogeto",
        "feedback-adding": "Inserimento del feedback inte ła pàjina...",
        "feedback-back": "Indrìo",
        "feedback-bugcheck": "Otimo! Verifega che nó 'l sia xà infrà i [$1 bug conosui].",
index f22471c..52aad7f 100644 (file)
        "externaldberror": "Ozaižihe petuz autentifikacijan, kudamb tehtihe andmusiden irdbazan turbiš, aigan, vai teile ei ulotu oiktusid toižetada ičetoi irdregistracijad.",
        "login": "Kirjutadas sistemha",
        "nav-login-createaccount": "Kirjutadas / Sada registracii",
-       "userlogin": "Kirjutadas / Sada registracii",
-       "userloginnocreate": "Kirjutagatoiš sistemha",
        "logout": "Lähtta",
        "userlogout": "Lähtta",
        "notloggedin": "Tö et olgoi kirjutanus sistemha",
        "userlogin-joinproject": "Ühtne {{SITENAME}}-saiha",
-       "nologin": "Ku tö et völ olgoi sanuded registracijad, '''$1'''.",
-       "nologinlink": "Sada registracii",
        "createaccount": "Sada registracii",
-       "gotaccount": "Ku teil om jo registracii, '''$1'''.",
-       "gotaccountlink": "Kirjutagatoiš sistemha",
-       "userlogin-resetlink": "Unohtid-ik andmused tulendan täht?",
        "userlogin-helplink2": "Abu tulendanke sistemha",
        "createacct-emailrequired": "E-počtal adres",
        "createacct-email-ph": "Kirjutagat teiden e-počtan adres",
        "createacct-another-email-ph": "Kirjutagat e-počtan adres",
        "createaccountmail": "Kävutagat aigaline statjaline peitsana i oigekat ozutadud e-počtan adresale",
        "createacct-realname": "Todesine nimi (opcionaline)",
-       "createaccountreason": "Sü:",
        "createacct-reason": "Sü",
        "createacct-reason-ph": "Mikš sädad kävutajanprofilid?",
        "createacct-submit": "Säta kävutajanprofil'",
        "passwordreset": "Peitsanan alustuz",
        "passwordreset-username": "Kävutajan nimi:",
        "passwordreset-domain": "Domen",
-       "passwordreset-capture": "Ozutada-k loptud kirjeine?",
        "passwordreset-email": "E-počtan adres:",
        "passwordreset-emailelement": "Kävutajannimi: \n$1\n\nAigaline peitsana: \n$2",
        "passwordreset-emailsentemail": "Muštatai kirjeine uden peitsananke oigetihe e-počtadme.",
        "anoneditwarning": "<strong>Homaikat:<strong> Tö et olgoi kirjutanus sistemha. Teiden IP-adres kirjutadas necen lehtpolen redaktiruindan istorijaha, ku toižetaškandet sidä. Ku tö <strong>[$1 kirjutatoiš sistemha]</strong> vai <strong>[$2 sat registracijan]</strong>, ka teiden redakcijad sidotas teiden kävutajannimehe. Siloi teil linneb toižid-ki ližavoimuzid.",
        "missingsummary": "'''Muštatez:''' Tö et olgoi andnuded toižetusiden lühüdad ümbrikacundad.\nKu tö valičet völ kerdan \"Kirjutada lehtpol'\", ka teiden toižetused kirjutase ningoižeta ümbrikacundata.",
        "missingcommenttext": "Olgat hüväd, pangat teiden tedotuz alahaks.",
-       "missingcommentheader": "'''Muštatez:''' Tö et olgoi andnuded toižetusiden ümbrikacundoiden pälkirjutest.\nKu tö valičet völ kerdan ”{{int:savearticle}}” \"Kirjutada lehtpol'\", ka teiden toižetusiden ümbrikacund kirjutase ningoižeta pälkirjuteseta.",
+       "missingcommentheader": "'''Muštatez:''' Tö et olgoi andnuded toižetusiden ümbrikacundoiden pälkirjutest.\nKu tö valičet völ kerdan ”$1” \"Kirjutada lehtpol'\", ka teiden toižetusiden ümbrikacund kirjutase ningoižeta pälkirjuteseta.",
        "summary-preview": "Ümbrikacund linneb mugoi:",
        "subject-preview": "Ümbrikacundan pälkirjutez linneb mugoi:",
        "blockedtitle": "Kävutai om blokiruidud",
        "saveprefs": "Kirjutada",
        "restoreprefs": "Endištada kaik augotižjärgendused (kaikiš sekcijoiš)",
        "prefs-editing": "Redaktiruind",
-       "rows": "Rivid:",
-       "columns": "Pachid:",
        "searchresultshead": "Ecind",
        "stub-threshold": "Nägutesen märitamižen künduz <a href=\"#\" class=\"stub\">kosketust otetile</a> (baitoiš)",
        "stub-threshold-disabled": "Ei ole kävutamas",
        "userrights-reason": "Sü:",
        "userrights-no-interwiki": "Teile ei sa toižetada toižiden wikiden kävutajiden oiktusid.",
        "userrights-nodatabase": "Andmusiden $1-bazad ei ole vai se ei ole lokaline.",
-       "userrights-nologin": "Teile pidab [[Special:UserLogin|kirjutadas sistemha]] administratoran oiktusidenke, miše antta oiktusid kävutajile.",
-       "userrights-notallowed": "Teiden kävutajan registracijanke ei sa antta oiktusid toižile kävutajile da heitta toižiden kävutajiden oiktusid.",
        "userrights-changeable-col": "Gruppad, kudambad teile sab toižetada",
        "userrights-unchangeable-col": "Gruppad, kudambid teile ei sa toižetada",
        "userrights-irreversible-marker": "$1*",
        "right-protect": "Vajehtada lehtpoliden kaičendan tazopind i redaktiruida kaitud lehtpoled",
        "right-editprotected": "Redaktiruida kaitud lehtpoled (kaskadkaičemata)",
        "right-editinterface": "Redaktiruida kävutajan intefeis",
-       "right-editusercssjs": "Redaktiruida toižiden kävutajiden CSS- da JS-failad",
        "right-editusercss": "Redaktiruida toižiden kävutajiden CSS-failad",
        "right-edituserjs": "Redaktiruida toižiden kävutajiden JS-failad",
        "right-noratelimit": "Ei ole kaidendust piguden mödhe",
        "right-userrights-interwiki": "Toižetada toižiden wiki-saitoiden kävutajiden oiktused",
        "right-siteadmin": "Luklostada da avaita andmusiden baz",
        "right-sendemail": "Oigeta e-počtad toižile kävutajile",
-       "right-passwordreset": "Kacta e-kirjeižid peitsanan toižetandanke",
        "newuserlogpage": "Kävutajiden registracijan aigkirj",
        "newuserlogpagetext": "Tantoi registriruidud kävutajiden nimikirjutez.",
        "rightslog": "Kävutajan oiktusiden aigkirj",
        "rcshowhidemine": "$1 ičein redakcijad",
        "rcshowhidemine-show": "Ozutada",
        "rcshowhidemine-hide": "Peitta",
-       "rclinks": "Ozutada jäl'gmäižed $1 toižetust $2 päiväs<br />$3",
+       "rclinks": "Ozutada jäl'gmäižed $1 toižetust $2 päiväs",
        "diff": "erod",
        "hist": "istorii",
        "hide": "Peitta",
        "undeleteviewlink": "nähta",
        "undeleteinvert": "Käta erigoittud sanad vastkarin",
        "undeletecomment": "Kommentarii:",
-       "undeletedrevisions": "{{PLURAL:$1|1 toižetuz|$1 toižetust}} om endištadud",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 toižetuz|$1 toižetust}} da {{PLURAL:$2|1 fail|$2 failad}} oma endištadud",
-       "undeletedfiles": "{{PLURAL:$1|1 fail om|$1 failad oma}} endištadud",
        "cannotundelete": "Endištandan petuz:\n$1",
        "undeletedpage": "'''$1-lehtpol' om endištadud'''\n\nKc. [[Special:Log/delete|čudandoiden aigkirj]], miše tedištada tantoižiš čudandoiš da endištandoiš.",
        "undelete-header": "Kc. [[Special:Log/delete|čudendoiden aigkirj]], miše tedištada tantoi čudud lehtpoliš.",
        "revdelete-unrestricted": "kaidendused heittud administratoriden täht",
        "logentry-newusers-create": "{{GENDER:$2|tegihe}} $1-kävutajaks",
        "rightsnone": "(ei ole)",
-       "revdelete-summary": "kaik toižetused",
        "feedback-cancel": "Heitta pätand",
        "feedback-close": "Vaumiž",
        "feedback-error2": "Petuz. Ei voi redaktiruida",
        "feedback-subject": "Tem:",
        "searchsuggest-search": "Ectä",
        "searchsuggest-containing": "mülütajad...",
-       "api-error-empty-file": "Teil oigetud fail om pall'az.",
-       "api-error-fetchfileerror": "Südäipetuz: mi-se läksi värin failad sades.",
-       "api-error-filename-tooshort": "Lühudahk failannimi.",
-       "api-error-filetype-banned": "Nece failtip om kel'tud.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|om laskmatoi failantip|oma laskmatomad failantipad}}. Lasktud {{PLURAL:$3|failantip om|failantipad oma}} $2.",
-       "api-error-illegal-filename": "Kel'tud failannimi.",
-       "api-error-unclassified": "Tundmatoi petuz.",
-       "api-error-unknown-code": "Tundmatoi petuz: \"$1\"",
        "api-error-unknown-warning": "Tadmatoi varutuz: $1",
        "api-error-unknownerror": "Tundmatoi petuz: \"$1\"",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunad}}",
index ca65ea9..d673d2f 100644 (file)
@@ -34,7 +34,9 @@
                        "Quenhitran",
                        "Matma Rex",
                        "Xð",
-                       "Nguyên Lê"
+                       "Nguyên Lê",
+                       "Asmen",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "login": "Đăng nhập",
        "login-security": "Xác minh danh tính của bạn",
        "nav-login-createaccount": "Đăng nhập / Mở tài khoản",
-       "userlogin": "Đăng nhập / Mở tài khoản",
-       "userloginnocreate": "Đăng nhập",
        "logout": "Đăng xuất",
        "userlogout": "Đăng xuất",
        "notloggedin": "Chưa đăng nhập",
        "userlogin-noaccount": "Bạn chưa có tài khoản?",
        "userlogin-joinproject": "Tham gia {{SITENAME}}",
-       "nologin": "Bạn chưa có tài khoản ở đây? '''$1'''.",
-       "nologinlink": "Mở tài khoản mới",
        "createaccount": "Mở tài khoản",
-       "gotaccount": "Đã mở tài khoản rồi? '''$1'''.",
-       "gotaccountlink": "Đăng nhập",
-       "userlogin-resetlink": "Quên mất thông tin đăng nhập?",
        "userlogin-resetpassword-link": "Quên mật khẩu?",
        "userlogin-helplink2": "Trợ giúp đăng nhập",
        "userlogin-loggedin": "Bạn đã đăng nhập với tên {{GENDER:$1}}$1.\nHãy sử dụng biểu mẫu ở dưới để đăng nhập với tài khoản người dùng khác.",
        "createaccountmail": "Sử dụng mật khẩu ngẫu nhiên tạm và gửi nó cho địa chỉ thư điện tử được chỉ định",
        "createaccountmail-help": "Có thể sử dụng để tạo tài khoản cho người khác mà không được biết mật khẩu.",
        "createacct-realname": "Tên thật (tùy chọn)",
-       "createaccountreason": "Lý do:",
        "createacct-reason": "Lý do",
        "createacct-reason-ph": "Nhập lý do tạo một tài khoản khác",
        "createacct-reason-help": "Thông điệp xuất hiện trong nhật trình tạo tài khoản",
        "preview": "Xem trước",
        "showpreview": "Xem trước",
        "showdiff": "Xem thay đổi",
-       "blankarticle": "<strong>Cảnh báo:</strong> Bạn sẽ tạo ra một trang trống.\nNếu bấm “{{int:savearticle}}” lần nữa, một trang không có nội dung sẽ được tạo ra.",
+       "blankarticle": "<strong>Cảnh báo:</strong> Bạn sẽ tạo ra một trang trống.\nNếu bấm “$1” lần nữa, một trang không có nội dung sẽ được tạo ra.",
        "anoneditwarning": "<strong>Cảnh báo:</strong> Bạn chưa đăng nhập. Địa chỉ IP của bạn sẽ bị hiển thị công khai nếu bạn thực hiện bất kỳ sửa đổi nào. Nếu bạn <strong>[$1 đăng nhập]</strong> hoặc <strong>[$2 mở tài khoản]</strong>, sửa đổi của bạn sẽ được gán bởi tên đăng nhập của bạn, cùng nhiều lợi ích khác.",
        "anonpreviewwarning": "''Bạn chưa đăng nhập. Khi lưu trang này, địa chỉ IP của bạn sẽ được ghi vào lịch sử trang.''",
        "missingsummary": "'''Nhắc nhở:''' Bạn đã không ghi lại tóm lược sửa đổi. Nếu bạn nhấn Lưu trang một lần nữa, sửa đổi của bạn sẽ được lưu mà không có tóm lược.",
-       "selfredirect": "<strong>Cảnh báo:</strong> Bạn sắp đổi hướng trang này đến chính trang này.\nCó lẽ bạn đã định rõ mục tiêu sai hoặc bạn đang sửa trang sai.\nNếu bạn bấm “{{int:savearticle}}” lần nữa, trang đổi hướng sẽ được tạo ra.",
+       "selfredirect": "<strong>Cảnh báo:</strong> Bạn sắp đổi hướng trang này đến chính trang này.\nCó lẽ bạn đã định rõ mục tiêu sai hoặc bạn đang sửa trang sai.\nNếu bạn bấm “$1” lần nữa, trang đổi hướng sẽ được tạo ra.",
        "missingcommenttext": "Xin hãy gõ vào lời bàn luận ở dưới.",
-       "missingcommentheader": "<strong>Nhắc nhở:</strong> Bạn chưa ghi chủ đề/tiêu đề cho bàn luận này.\nNếu bạn nhấn nút “{{int:savearticle}}” lần nữa, sửa đổi của bạn sẽ được lưu mà không có đề mục.",
+       "missingcommentheader": "<strong>Nhắc nhở:</strong> Bạn chưa ghi chủ đề/tiêu đề cho bàn luận này.\nNếu bạn nhấn nút “$1” lần nữa, sửa đổi của bạn sẽ được lưu mà không có đề mục.",
        "summary-preview": "Xem trước dòng tóm lược:",
        "subject-preview": "Xem trước đề mục:",
        "previewerrortext": "Có lỗi xảy ra khi xem trước những thay đổi của bạn.",
        "editingsection": "Sửa đổi $1 (đề mục)",
        "editingcomment": "Sửa đổi $1 (đề mục mới)",
        "editconflict": "Sửa đổi mâu thuẫn: $1",
-       "explainconflict": "Trang này có đã được lưu bởi người khác sau khi bạn bắt đầu sửa.\nPhía trên là bản hiện tại.\nPhía dưới là sửa đổi của bạn.\nBạn sẽ phải trộn thay đổi của bạn với bản hiện tại.\n'''Chỉ có''' phần văn bản ở phía trên là sẽ được lưu khi bạn nhất nút “{{int:savearticle}}”.",
+       "explainconflict": "Trang này có đã được lưu bởi người khác sau khi bạn bắt đầu sửa.\nPhía trên là bản hiện tại.\nPhía dưới là sửa đổi của bạn.\nBạn sẽ phải trộn thay đổi của bạn với bản hiện tại.\n'''Chỉ có''' phần văn bản ở phía trên là sẽ được lưu khi bạn nhất nút “$1”.",
        "yourtext": "Nội dung bạn nhập",
        "storedversion": "Phiên bản lưu",
        "nonunicodebrowser": "'''CHU' Y': Tri`nh duye^.t cu?a ba.n kho^ng ho^~ tro+. unicode. Mo^.t ca'ch dde^? ba.n co' the^? su+?a ddo^?i an toa`n trang na`y: ca'c ky' tu+. kho^ng pha?i ASCII se~ xua^'t hie^.n trong ho^.p soa.n tha?o du+o+'i da.ng ma~ tha^.p lu.c pha^n.'''",
        "right-editsemiprotected": "Sửa trang khóa ở mức “{{int:protect-level-autoconfirmed}}”",
        "right-editcontentmodel": "Sửa kiểu nội dung của trang",
        "right-editinterface": "Sửa giao diện người dùng",
-       "right-editusercssjs": "Sửa tập tin CSS và JS của người dùng khác",
        "right-editusercss": "Sửa tập tin CSS của người dùng khác",
        "right-edituserjs": "Sửa đổi tập tin JavaScript của người dùng khác",
        "right-editmyusercss": "Sửa đổi tập tin CSS cá nhân của mình",
        "rcfilters-filter-editsbyother-label": "Người khác",
        "rcfilters-filter-editsbyother-description": "Các sửa đổi của người khác.",
        "rcfilters-filtergroup-userExpLevel": "Trình độ (chỉ người dùng đã đăng ký)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Người mới đến",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Chưa tới 10 sửa đổi và 4 ngày hoạt động.",
-       "rcfilters-filter-userExpLevel-learner-label": "Người đang tập",
-       "rcfilters-filter-userExpLevel-learner-description": "Nhiều ngày hoạt động và sửa đổi hơn “Người mới đến” mà ít hơn “Người có kinh nghiệm”.",
-       "rcfilters-filter-userExpLevel-experienced-label": "Người có kinh nghiệm",
-       "rcfilters-filter-userExpLevel-experienced-description": "Hơn 30 ngày hoạt động và 500 sửa đổi.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Người mới đến",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Chưa tới 10 sửa đổi và 4 ngày hoạt động.",
+       "rcfilters-filter-user-experience-level-learner-label": "Người đang tập",
+       "rcfilters-filter-user-experience-level-learner-description": "Nhiều ngày hoạt động và sửa đổi hơn “Người mới đến” mà ít hơn “Người có kinh nghiệm”.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Người có kinh nghiệm",
+       "rcfilters-filter-user-experience-level-experienced-description": "Hơn 30 ngày hoạt động và 500 sửa đổi.",
        "rcfilters-filtergroup-automated": "Đóng góp tự động",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Các sửa đổi của công cụ tự động.",
        "rcshowhidecategorization": "$1 tác vụ xếp thể loại",
        "rcshowhidecategorization-show": "Hiện",
        "rcshowhidecategorization-hide": "Ẩn",
-       "rclinks": "Xem $1 sửa đổi gần đây nhất trong $2 ngày qua; $3.",
+       "rclinks": "Xem $1 sửa đổi gần đây nhất trong $2 ngày qua;",
        "diff": "khác",
        "hist": "sử",
        "hide": "Ẩn",
        "undeleteviewlink": "xem",
        "undeleteinvert": "Đảo sự lựa chọn",
        "undeletecomment": "Lý do:",
-       "undeletedrevisions": "$1 phiên bản được phục hồi",
-       "undeletedrevisions-files": "$1 phiên bản và $2 tập tin đã được phục hồi",
-       "undeletedfiles": "$1 tập tin đã được phục hồi",
        "cannotundelete": "Phục hồi bị thất bại một phần hoặc hoàn toàn:\n$1",
        "undeletedpage": "'''$1 đã được khôi phục'''\n\nXem nhật trình xóa và phục hồi các trang gần đây tại [[Special:Log/delete|nhật trình xóa]].",
        "undelete-header": "Xem các trang bị xóa gần đây tại [[Special:Log/delete|nhật trình xóa]].",
        "logentry-tag-update-revision": "$1 {{GENDER:$2}}đã cập nhật thẻ của phiên bản $4 của trang $3 ({{PLURAL:$7}}đã thêm $6; {{PLURAL:$9}}loại bỏ $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2}}đã cập nhật thẻ của mục nhật trình $5 của trang $3 ({{PLURAL:$7}}đã thêm $6; {{PLURAL:$9}}loại bỏ $8)",
        "rightsnone": "(không có)",
-       "revdelete-summary": "tóm lược sửa đổi",
        "rightslogentry-temporary-group": "$1 (tạm thời cho đến $2)",
        "feedback-adding": "Đang thêm thông tin phản hồi vào trang…",
        "feedback-back": "Lùi",
index c4d76c3..802c49c 100644 (file)
        "yourpasswordagain": "Bassworrd widderhulln:",
        "login": "Ôômeldn",
        "nav-login-createaccount": "Oomeldn / Ghondoo ooleeng",
-       "userlogin": "Ôômeldn / Als Bajdräächâr ajschrajm",
        "logout": "Abmeldn",
        "userlogout": "Abmeldn",
-       "nologin": "Du hast ka Nutzergonto? $1",
-       "nologinlink": "Sich als najâr Ôôgmeldâr ôômäldn",
        "createaccount": "Nutzergonto olegn",
-       "gotaccount": "Du host scho a Benudtzergondo? $1",
-       "gotaccountlink": "Omeldn",
-       "userlogin-resetlink": "Omeldedadn vergessn?",
        "mailmypassword": " najs passwôrd iwâr iimejl dsuschign lasn",
        "loginlanguagelabel": "Sproch: $1",
        "changepassword": "S'bhaswôrd ändârn",
        "saveprefs": "Aâjschdelungn schbajchrn",
        "restoreprefs": "Uf dii uur-ajschdelungn dsrig",
        "prefs-editing": "Bearbajdungs-fenschdâr",
-       "rows": "Soofiil dsajln:",
-       "columns": "Soofiil schbaldn",
        "searchresultshead": "Suuchn",
        "recentchangesdays": "Wiifiil dääch dsrig baj  „Ledschdn ändrungn“",
        "recentchangesdays-max": "Hegschdns $1 {{PLURAL:$1|daach|dääch}}",
        "rcshowhideanons": "$1 uuôôgmäldâde bearbajdâr",
        "rcshowhidepatr": "Gondrollierde Ändrunga $1",
        "rcshowhidemine": "Ajchne bajdrääch $1",
-       "rclinks": "Dsajch dii ledsdn $1 ändrunga fo di ledsdn $2 dooch.<br />$3",
+       "rclinks": "Dsajch dii ledsdn $1 ändrunga fo di ledsdn $2 dooch.",
        "diff": "undârschiid",
        "hist": "Wärsjoonsfolche",
        "hide": "fârschdegn",
index 52d2d5b..979f214 100644 (file)
        "externaldberror": "U ejenon fümükamapöl plödik nünödema, u no dalol atimükön kali plödik ola.",
        "login": "Nunädolös obi",
        "nav-login-createaccount": "Nunädön oki / jafön kali",
-       "userlogin": "Nunädön oki / jafön kali",
-       "userloginnocreate": "Nunädön oki",
        "logout": "Senunädön oki",
        "userlogout": "Senunädön oki",
        "notloggedin": "No enunädol oli",
        "userlogin-noaccount": "No labol-li kali?",
        "userlogin-joinproject": "Sogolös oki lä {{SITENAME}}",
-       "nologin": "No labol-li kali? $1.",
-       "nologinlink": "Jafolös bali",
        "createaccount": "Jafön kali",
-       "gotaccount": "Ya labol-li kali? '''$1'''.",
-       "gotaccountlink": "Nunädolös obi",
-       "userlogin-resetlink": "Eglömol-li nünis kala olik?",
        "userlogin-resetpassword-link": "Eglömol-li letavödi olik?",
        "createacct-emailrequired": "Ladet leäktronik",
        "createaccountmail": "me pot leäktronik",
-       "createaccountreason": "Kod:",
        "createacct-reason": "Kod",
        "createacct-submit": "Jafön kali olik",
        "createacct-benefit-body1": "{{PLURAL:$1|redakam|redakams}}",
        "anoneditwarning": "'''Nuned:''' No enunädol oli. Ladet-IP olik poregistaron su redakamajenotem pada at.",
        "missingsummary": "'''Noet:''' No epenol redakamipläni. If ovälol dönu knopi: Dakipolöd, redakam olik podakipon nen plän.",
        "missingcommenttext": "Penolös, begö! küpeti dono.",
-       "missingcommentheader": "'''Meib:''' No epenol yegädi/tiädi küpete at.\nIf ovälol dönu knopi: \"{{int:savearticle}}\", redakam olik podakipon nen on.",
+       "missingcommentheader": "'''Meib:''' No epenol yegädi/tiädi küpete at.\nIf ovälol dönu knopi: \"$1\", redakam olik podakipon nen on.",
        "summary-preview": "Büologed brefik:",
        "subject-preview": "Büologed yegäda/diläda:",
        "blockedtitle": "Geban peblokon",
        "editingsection": "Redakam pada: $1 (diläd)",
        "editingcomment": "Redakam pada: $1 (diläd nulik)",
        "editconflict": "Redakamakonflit: $1",
-       "explainconflict": "Ek evotükon padi at sisä äprimol ad redakön oni.\nVödem balid jonon padi soäsä dabinon anu.\nVotükams olik pajonons in vödem telid.\nSludolös, vio fomams tel at mutons pabalön.\nKanol kopiedön se vödem telid ini balid.\n'''Te''' vödem balid podakipon ven knopol knopi: \"{{int:savearticle}}\".",
+       "explainconflict": "Ek evotükon padi at sisä äprimol ad redakön oni.\nVödem balid jonon padi soäsä dabinon anu.\nVotükams olik pajonons in vödem telid.\nSludolös, vio fomams tel at mutons pabalön.\nKanol kopiedön se vödem telid ini balid.\n'''Te''' vödem balid podakipon ven knopol knopi: \"$1\".",
        "yourtext": "Vödem olik",
        "storedversion": "Fomam pedakipöl",
        "nonunicodebrowser": "'''NÜNED: Bevüresodatävöm olik no kanon gebön eli Unicode.\nAd dälön ole ad redakön padis, malats no-ASCII opubons in redakamabog as kots degmälnumatik.'''",
        "saveprefs": "Dakipolöd",
        "restoreprefs": "Geikön lü paramets kösömik valik",
        "prefs-editing": "Redakam",
-       "rows": "Kedets:",
-       "columns": "Padüls:",
        "searchresultshead": "Suk",
        "stub-threshold": "Soliad pro fomätam <a href=\"#\" class=\"stub\">sidayümas</a> (jöläts):",
        "recentchangesdays": "Dels ad pajonön in votükams nulik:",
        "userrights-reason": "Kod:",
        "userrights-no-interwiki": "No labol däli ad votükön gebanagitätis in vüks votik.",
        "userrights-nodatabase": "Nünodem: $1 no dabinon, u no binon topik.",
-       "userrights-nologin": "Mutol [[Special:UserLogin|nunädön oli]] me guvanakal ad dalön gevön gitätis gebanes.",
-       "userrights-notallowed": "No labol däli ad läükön u moükön gebanagitätis.",
        "userrights-changeable-col": "Grups fa ol votükoviks",
        "userrights-unchangeable-col": "Grups fa ol nevotükoviks",
        "group": "Grup:",
        "right-protect": "Votükön jelanivodis e redakön padis pejelöl",
        "right-editprotected": "Bevobön padis pejelöl äs \"{{int:protect-level-sysop}}\"",
        "right-editinterface": "Votükön gebanaloveikömi",
-       "right-editusercssjs": "Redakön ragivis-CSS e -JS gebanas votik",
        "right-editusercss": "Redakön ragivis-CSS gebanas votik",
        "right-edituserjs": "Redakön ragivis-JS gebanas votik",
        "right-rollback": "Sädunön vifiko redakamis gebana lätik, kel äredakon padi semik.",
        "rcshowhidemine": "$1 redakamis obik",
        "rcshowhidemine-show": "Jonön",
        "rcshowhidemine-hide": "Klänedön",
-       "rclinks": "Jonön votükamis lätik $1 ün dels lätik $2<br />$3",
+       "rclinks": "Jonön votükamis lätik $1 ün dels lätik $2",
        "diff": "dif",
        "hist": "jen",
        "hide": "Klänedön",
        "undeleteviewlink": "logön",
        "undeleteinvert": "Väli güükön",
        "undeletecomment": "Kod:",
-       "undeletedrevisions": "Moükam {{PLURAL:$1|revida 1 pesädunon|revidas $1 pesädunons}}",
-       "undeletedrevisions-files": "Moükam {{PLURAL:$1|revida 1|revidas $1}} e {{PLURAL:$2|ragiva 1|ragivas $2}} pesädunons",
-       "undeletedfiles": "Moükam {{PLURAL:$1|ragiva 1|ragivas $1}} pesädunon",
        "cannotundelete": "Sädunam moükama no eplöpon: $1",
        "undeletedpage": "'''Moükam pada: $1 pesädunon'''\n\nLogolös [[Special:Log/delete|lisedi moükamas]] if vilol kontrolön moükamis e sädunamis brefabüikis.",
        "undelete-header": "Logolös [[Special:Log/delete|jenotalisedi moükamas]] ad tuvön padis brefabüo pemoükölis.",
        "logentry-block-unblock": "$1 {{GENDER:$2|eblokon}} {{GENDER:$4|hieli $3|jieli $3|eli $3}}",
        "logentry-newusers-create": "Gebanakal: $1 pejafon",
        "rightsnone": "(nonik)",
-       "revdelete-summary": "plän redakama",
        "feedback-subject": "Yegäd:",
        "searchsuggest-search": "Suk",
        "searchsuggest-containing": "ninädöl...",
index d1460b8..6976ff0 100644 (file)
        "yourpasswordagain": "Tõissaga salain-sõna:",
        "login": "Cirjut süäme",
        "nav-login-createaccount": "Cirjut süäme vai registriiroit cäüttijässi",
-       "userlogin": "Cirjut süäme",
-       "userloginnocreate": "Cirjut süäme",
        "logout": "Cirjut uloz",
        "userlogout": "Cirjut uloz",
-       "nologin": "Kui Teille veel ebõõ cäüttijänimi, '''$1'''.",
-       "nologinlink": "võitta loovva luguu",
        "createaccount": "Uusi cäüttijää",
-       "gotaccount": "Tüü õõttõ jo registreerittu? $1.",
-       "gotaccountlink": "Cirjut süäme",
-       "userlogin-resetlink": "Vai unõhtittõ õma loginass?",
-       "createaccountreason": "Süü:",
        "mailmypassword": "Lähet uusi salasõna elektropoštiikaa",
        "loginlanguagelabel": "Ceeli: $1",
        "resetpass-submit-cancel": "Otmeńoit",
        "rcshowhideanons": "$1 anonüümid cäüttijäd",
        "rcshowhidepatr": "Tarkasõttu kõrjausije $1",
        "rcshowhidemine": "$1 õmad muutussõd",
-       "rclinks": "Näüt viimõiss $1 muutuhsõiss viimõizõ $2 päivää ajalt.<br />$3",
+       "rclinks": "Näüt viimõiss $1 muutuhsõiss viimõizõ $2 päivää ajalt.",
        "diff": "vahõ",
        "hist": "istori",
        "hide": "Salauta",
index 84edb29..c48e262 100644 (file)
@@ -9,7 +9,8 @@
                        "Trixt",
                        "Võrok",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Stephanecbisson"
                ]
        },
        "tog-underline": "Lingiq ala tõmmadaq",
        "externaldberror": "Välitsen kimmästegemisteedüskogon om viga vai olõ-i sul lubat umma pruukjanimme muutaq.",
        "login": "Nimega sisseminek",
        "nav-login-createaccount": "Mineq nimega sisse",
-       "userlogin": "Mineq nimega sisse vai luuq pruukjanimi",
-       "userloginnocreate": "Nimega sisseminek",
        "logout": "Nime alt välläminek",
        "userlogout": "Mineq nime alt vällä",
        "notloggedin": "Olõ-i nimega sisse mint",
        "userlogin-noaccount": "Sul olõ-i viil pruukjanimme?",
        "userlogin-joinproject": "Nakkaq {{SITENAME}} pruukjas!",
-       "nologin": "Sul olõ-i viil pruukjanimme? '''$1'''.",
-       "nologinlink": "Tiiq hindäle pruukjanimi",
        "createaccount": "Tiiq pruukjanimi ärq",
-       "gotaccount": "Ku sul jo om uma pruukjanimi, sis '''$1'''.",
-       "gotaccountlink": "võit nimega sisse minnäq",
-       "userlogin-resetlink": "Kas olõt uma salasõna ärq unõhtanuq?",
        "userlogin-resetpassword-link": "Kas salasõna läts' meelest ärq?",
        "userlogin-helplink2": "Nimega sisseminemise abi",
        "userlogin-createanother": "Luuq tõõnõ konto",
        "createacct-another-email-ph": "Kirodaq e-postiaadrõss",
        "createaccountmail": "Pruugiq aotlist johuslist salasõnna ja saadaq tuu annõdu aadrõsi pääle",
        "createacct-realname": "Peris nimi (või ka kirotamalda jättäq)",
-       "createaccountreason": "Põhjus:",
        "createacct-reason": "Põhjus",
        "createacct-reason-ph": "Mille tahat luvvaq tõõsõ pruukjakonto?",
        "createacct-submit": "Luuq konto",
        "editingsection": "Toimõndõdas lõiku artiklist $1",
        "editingcomment": "Toimõndõdas kommõntaari lehe $1 pääl",
        "editconflict": "Toimõndamisvastaolo: $1",
-       "explainconflict": "Kiäki om muutnuq seod lehte perän tuud, ku saq taad toimõndama naksiq.\nÜlemädsen toimõnduskastin om teksti perämäne kujo.\nSuq muutmisõq ommaq alomadsõn kastin.\nSul tulõ naaq viimätsehe kujjo üle viiäq.\nKu klõpsahtat nuppi \"{{int:savearticle}}\", sis pästetäs '''õnnõ''' ülembädse toimõnduskasti tekst.",
+       "explainconflict": "Kiäki om muutnuq seod lehte perän tuud, ku saq taad toimõndama naksiq.\nÜlemädsen toimõnduskastin om teksti perämäne kujo.\nSuq muutmisõq ommaq alomadsõn kastin.\nSul tulõ naaq viimätsehe kujjo üle viiäq.\nKu klõpsahtat nuppi \"$1\", sis pästetäs '''õnnõ''' ülembädse toimõnduskasti tekst.",
        "yourtext": "Suq tekst",
        "storedversion": "Pästet kujo",
        "nonunicodebrowser": "'''Hoiatus: su võrgokaeja tukõ-i Unicode'i. Olõq hüä, võtaq toimõndamisõs leht vallalõ tõõsõn võrgokaejan.'''",
        "prefs-misc": "Muuq säädmiseq",
        "saveprefs": "Pästäq säädmiseq ärq",
        "prefs-editing": "Toimõnduskasti suurus",
-       "rows": "Rito",
-       "columns": "Tulpõ",
        "searchresultshead": "Otsminõ",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Kehväkese lehe</a> näütämispiir (baidõn):",
        "recentchangesdays": "Päivi, midä näüdädäq viimätsin muutmiisin",
        "rcshowhidemine": "$1 mu toimõndusõq.",
        "rcshowhidemine-show": "näütäq",
        "rcshowhidemine-hide": "Käkiq ärq",
-       "rclinks": "Näütäq viimädseq $1 muutmist, miä ommaq tettüq viimädse $2 päävä seen. $3",
+       "rclinks": "Näütäq viimädseq $1 muutmist, miä ommaq tettüq viimädse $2 päävä seen.",
        "diff": "lahk",
        "hist": "aol",
        "hide": "Käkitäseq",
        "undeletelink": "kaeq/tiiq tagasi",
        "undeleteviewlink": "näütäq",
        "undeletecomment": "Kommõntaar:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|kujo|kujjo}} tagasi tett",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|kujo|kujjo}} ja $2 {{PLURAL:$2|teedüstü|teedüstüt}} tagasi tett",
-       "undeletedfiles": "$1 {{PLURAL:$1|teedüstü|teedüstüt}} tagasi tett",
        "cannotundelete": "Tagasitegemine lää-s kõrda; kiäki tõõnõ või-ollaq lehe jo tagasi tennüq.",
        "undeletedpage": "'''$1 om tagasi tett'''\n\nPerämäidsi kistutuisi ja tagasitegemiisi saat kaiaq [[Special:Log/delete|kistutamiisi nimekiräst]].",
        "undelete-header": "Perämäidsi kistutuisi saat kaiaq [[Special:Log/delete|kistutamiisi nimekiräst]].",
index de1dd5f..da54fcd 100644 (file)
        "yourdomainname": "Vosse dominne",
        "login": "S' elodjî",
        "nav-login-createaccount": "Ahiver on conte, udon-bén s' elodjî",
-       "userlogin": "S' elodjî",
-       "userloginnocreate": "S' elodjî",
        "logout": "Si dislodjî",
        "userlogout": "Si dislodjî",
        "notloggedin": "Nén elodjî",
        "userlogin-joinproject": "S' edjîstrer so {{SITENAME}}",
-       "nologin": "Vos n' avoz nén d' conte so ç' wiki ci? $1.",
-       "nologinlink": "Ahivez on conte da vosse",
        "createaccount": "Ahiver on novea conte",
-       "gotaccount": "Vos avoz ddja on conte so ç' wiki ci? '''$1'''.",
-       "gotaccountlink": "Elodjîz vs",
-       "userlogin-resetlink": "Avoz rovyî les pondants et djondants po s' elodjî?",
        "createaccountmail": "Eployî on scret timporaire a l' astcheyance eyet l' evoyî so l' emile diné",
        "createacct-realname": "Vraiy no (opcionel)",
-       "createaccountreason": "Råjhon:",
        "createacct-reason": "Råjhon",
        "createacct-another-submit": "Ahiver èn ôte conte",
        "createacct-benefit-body1": "{{PLURAL:$1|candjmint|candjmints}}",
        "passwordreset-disabled": "Li rfijhaedje di screts a stî dismetou so ç' wiki ci.",
        "passwordreset-username": "No d' elodjaedje:",
        "passwordreset-domain": "Dominne:",
-       "passwordreset-capture": "Vey li messaedje di l' emile?",
-       "passwordreset-capture-help": "Si vos clitchîz cisse boesse ci, l' emile (eyet li scret timporaire) vos srè håyné e minme tins k' il est emilé.",
        "passwordreset-email": "Adresse emile:",
        "passwordreset-emailtitle": "Detays do contre so {{SITENAME}}",
        "changeemail": "Candjî ou disfacer l' adresse emile",
        "watchthis": "Shuve cist årtike",
        "savearticle": "Schaper l' pådje",
        "savechanges": "Schaper l' pådje",
+       "publishpage": "Schaper l' pådje",
+       "publishchanges": "Schaper les candjmints",
        "preview": "Vey divant",
        "showpreview": "Vey divant",
        "showdiff": "Vey les candjmints",
        "editingsection": "Candjant $1 (seccion)",
        "editingcomment": "Candjant $1 (novele seccion)",
        "editconflict": "Ecramiaedje inte deus candjmints: $1",
-       "explainconflict": "Ene sakî a candjî l' pådje do tins ki vos estîz a scrire.\nLi boesse di tecse do dzeur mostere li tecse del pådje come il est\npol moumint sol sierveu. Li tecse da vosse est sol boesse di tecse do dzo.\nLes diferinces sont håynêyes å mitan. Vos dvoz mete vos candjmints dins\nl' tecse d' asteure (å dzeur) si vos lez vloz co evoyî.\n'''Seulmint''' li tecse do dzeur serè candjî cwand vos clitchroz sol boton «{{int:savearticle}}».",
+       "explainconflict": "Ene sakî a candjî l' pådje do tins ki vos estîz a scrire.\nLi boesse di tecse do dzeur mostere li tecse del pådje come il est\npol moumint sol sierveu. Li tecse da vosse est sol boesse di tecse do dzo.\nLes diferinces sont håynêyes å mitan. Vos dvoz mete vos candjmints dins\nl' tecse d' asteure (å dzeur) si vos lez vloz co evoyî.\n'''Seulmint''' li tecse do dzeur serè candjî cwand vos clitchroz sol boton «$1».",
        "yourtext": "Li tecse da vosse",
        "storedversion": "Modêye sol sierveu",
        "nonunicodebrowser": "'''ASTEME: li betchteu waibe da vosse ni sopoite nén l' ecôdaedje unicôde, cåze di çoula les caracteres nén-ASCII vont aparexhe dins l' boesse di tecse come des côdes hecsadecimås, insi vos pôroz tot l' minme candjî l' pådje.'''",
        "saveprefs": "Schaper les preferinces",
        "restoreprefs": "Rimete totes les prémetowès valixhances",
        "prefs-editing": "Boesse di tecse",
-       "rows": "Royes",
-       "columns": "Colones",
        "searchresultshead": "Håynaedje des rzultats di cweraedje",
        "stub-threshold": "Limite pol formataedje des loyéns djermons ($1):",
        "stub-threshold-sample-link": "egzimpe",
        "userrights-reason": "Råjhon:",
        "userrights-no-interwiki": "Vos n' avoz nén les permissions po candjî les droets des uzeus so ds ôtes wikis.",
        "userrights-nodatabase": "Li båze di dnêyes «$1» n' egzistêye nén ou n' est nén locåle.",
-       "userrights-nologin": "Vos vs divoz [[Special:UserLogin|elodjî]] avou on conte manaedjeu por vos pleur candjî les droets des uzeus.",
-       "userrights-notallowed": "Li conte da vosse n' pout nén radjouter ou rsaetchî des droets des uzeus.",
        "userrights-changeable-col": "Groupes ki vos ploz candjî",
        "userrights-unchangeable-col": "Groupes ki vos n' poloz nén candjî",
        "group": "Groupe:",
        "rcshowhidecategorization": "$1 li categorijhaedjes des pådjes",
        "rcshowhidecategorization-show": "Mostrer",
        "rcshowhidecategorization-hide": "Catchî",
-       "rclinks": "Mostrer les $1 dierins candjmints des dierins $2 djoûs.<br />$3",
+       "rclinks": "Mostrer les $1 dierins candjmints des dierins $2 djoûs.",
        "diff": "dif.",
        "hist": "ist.",
        "hide": "catch.",
        "undeletelink": "vey/rapexhî",
        "undeleteviewlink": "vey",
        "undeletecomment": "Råjhon:",
-       "undeletedrevisions": "{{PLURAL:$1|1 modêye|$1 modêyes}} di rapexheyes",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 modêye|$1 modêyes}} et {{PLURAL:$2|1 fitchî|$2 fitchîs}} di rapexhîs",
-       "undeletedfiles": "{{PLURAL:$1|1 fitchî|$1 fitchîs}} di rapexhîs",
        "cannotundelete": "Li rapexhaedje a fwait berwete; motoit bén k' ene ôte sakî l' a ddja rapexhî.",
        "undeletedpage": "'''Li pådje $1 a stî rapexheye.'''\n\nLoukîz l' [[Special:Log/delete|djournå des disfaçaedjes]] po ene djivêye des dierins disfaçaedjes eyet rapexhaedjes.",
        "undelete-search-submit": "Cweri",
        "feedback-submit": "Evoyî",
        "searchsuggest-search": "Cweri",
        "searchsuggest-containing": "ki contént...",
-       "api-error-badaccess-groups": "Vos n' avoz nén l' droet d' eberweter des fitchîs so ç' wiki cial",
-       "api-error-copyuploaddisabled": "Les eberwetaedjes pa URL ni vont nén so ç' sierveu cial.",
-       "api-error-duplicate": "N a ddja {{PLURAL:$1|èn ôte fitchî|des ôtes fitchîs}} avou l' minme contnou so nosse waibe",
-       "api-error-duplicate-archive": "N aveut ddja {{PLURAL:$1|èn ôte fitchî|des ôtes fitchîs}} avou l' minme contnou so nosse waibe, mins {{PLURAL:$1|il a stî rsaetchî|il ont stî rsaetchîs}}.",
-       "api-error-empty-file": "Vosse fitchî est vude.",
        "api-error-emptypage": "C' est nén permetou d' ahiver ene novele pådje et l' leyî vude.",
-       "api-error-fetchfileerror": "Aroke divintrinne : ene sacwè a fwait berwete cwand on-z a volou rawè vosse fitchî",
-       "api-error-file-too-large": "Vosse fitchî est trop pezant",
-       "api-error-filename-tooshort": "Li no do fitchî est trop court",
-       "api-error-filetype-banned": "On n' pout nén eberweter des sfwaits fitchîs",
-       "api-error-filetype-missing": "I manke li cawete do fitchî",
-       "api-error-hookaborted": "Li candjmint ki vos vlîz fé a stî espaitchî pa on module di rawete.",
-       "api-error-http": "Aroke divintrinne : nou raloyaedje å sierveu",
-       "api-error-illegal-filename": "On n' pout nén prinde ci no la pol fitchî",
-       "api-error-internal-error": "Aroke divintrinne : gn a ene sacwè k' a må stî tins d' l' eredjistrumint d' vost eberwetêye",
-       "api-error-invalid-file-key": "Aroke divintrinne : Li fitchî n' a nén stî rtrové dins l' eredjistrumint provizwere",
-       "api-error-missingparam": "Aroke divintrinne : i manke des dnêyes dins vosse dimande",
-       "api-error-missingresult": "Aroke divintrinne : on n' såreut dire si l' fitchî a bén passé",
-       "api-error-mustbeloggedin": "Vos dvoz esse elodjî (eye) po-z aberweter des fitchîs",
-       "api-error-mustbeposted": "Aroke divintrinne : li programe n' eploye nén li boune hårdêye HTTP",
-       "api-error-noimageinfo": "L' eberwetaedje a bén stî, mins l' sierveu n' a pont dné d' racsegnes sol fitchî",
-       "api-error-nomodule": "Aroke divintrinne : pont d' voye d' eberwetaedje tchoezeye",
-       "api-error-ok-but-empty": "Aroke divintrinne : li sierveu n' respond nén",
-       "api-error-overwrite": "Vos n' ploz nén spotchî on fitchî k' egzistêye dedja",
        "api-error-stashfailed": "Aroke divintrinne : li sierveu a pierdou les dnêyes provizweres",
-       "api-error-timeout": "Li sierveu n' a nén respondou dins les tins",
-       "api-error-unclassified": "Aroke nén cnoxhowe",
-       "api-error-unknown-code": "Aroke nén cnoxhowe: «$1».",
-       "api-error-unknown-error": "Aroke divintrinne : gn a ene sacwè ki n' a nén stî tins d' l' eberwetaedje",
        "api-error-unknown-warning": "Adviertixhmint nén cnoxhou: «$1».",
        "api-error-unknownerror": "Aroke nén cnoxhowe: «$1».",
-       "api-error-uploaddisabled": "L' eberwetaedje ni va nén so ç' wiki cial",
-       "api-error-verification-error": "Ci fitchî la est cron, oudon-bén si cawete n' est nén boune",
        "duration-seconds": "$1 segonde{{PLURAL:$1||s}}",
        "duration-minutes": "$1 munute{{PLURAL:$1||s}}",
        "duration-hours": "$1 eure{{PLURAL:$1||s}}",
index 172f08b..3fd3cf9 100644 (file)
        "externaldberror": "Mayda authenticaton database error o diri ka tinutugotan pag-update an imo akwant ha gawas.",
        "login": "Mag ''log in''",
        "nav-login-createaccount": "Magpalista nga masakob / paghimo hin bag-o nga akawnt",
-       "userlogin": "Magpasabot nga masakob / paghimo hin akawnt",
-       "userloginnocreate": "Magpasabot nga masakob",
        "logout": "Mag ''log out''",
        "userlogout": "Mag ''log out''",
        "notloggedin": "Diri naka-log in",
        "userlogin-noaccount": "Waray ka akawnt?",
        "userlogin-joinproject": "Tambong ha {{SITENAME}}",
-       "nologin": "Waray ka akawnt? $1.",
-       "nologinlink": "Paghimo hin akawnt",
        "createaccount": "Himo-a an akawnt",
-       "gotaccount": "¿Mayda kana akawnt? $1.",
-       "gotaccountlink": "Sakob",
-       "userlogin-resetlink": "Nangalimot han imo detalye han pagsakob?",
        "userlogin-resetpassword-link": "¿Nangalimot ka han imo tigaman-pansulod?",
        "userlogin-helplink2": "Pabúlig hin pagsakob",
        "userlogin-loggedin": "Nakalog-in kana komo hi {{GENDER:$1|$1}}.\nGamiti an porma ha ubos para makalog-in komo iba nga gumaramit.",
        "createacct-another-email-ph": "Igbutang an email address",
        "createaccountmail": "Gamiti hin temporaryo nga bisan ano nag password ngan igpadangat ngada ha espesipikado nga e-mail address",
        "createacct-realname": "Tinuod nga ngaran (opsyonal)",
-       "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-reason-ph": "Kay ano nahimo ka hin usa pa nga akawnt",
        "createacct-submit": "Ighimo an im account",
        "showdiff": "Igpakita an mga ginliwat",
        "anoneditwarning": "<strong>Pahimatngon:</strong> Diri ka nakalog-in. An imo IP address in makikit-an han publiko kun magbuhat ka hin mga pagliwat. Kun ikaw in <strong>[$1 maglog-in]</strong> o <strong>[$2 maghimo hin account]</strong>, an imo mga pagliwat in maa-attribute ha imo agnay-hit-gumaramit, upod han pipira pa nga mga benepisyo.",
        "anonpreviewwarning": "''Diri ka naka-log in.  Mahisusurat an imo IP address ngada ha kanan pakli kaagi hit pagliwat kun igtipig nimo.''",
-       "missingsummary": "<strong>Pahinumdom:</strong> Waray ka humatag hin halipotay nga masisiring hiton pagliwat. Kun pidliton mo an \"{{int:savearticle}}\" utro, an imo ginliwat in matitipig bisan waray hini.",
+       "missingsummary": "<strong>Pahinumdom:</strong> Waray ka humatag hin halipotay nga masisiring hiton pagliwat. Kun pidliton mo an \"$1\" utro, an imo ginliwat in matitipig bisan waray hini.",
        "missingcommenttext": "Alayon pagbutang hin komento ha ilarom.",
-       "missingcommentheader": "<strong>Pahinumdom:</strong> Waray ka humatag hin subject para hinin nga komento.  Kun pinduton mo an \"{{int:savearticle}}\" utro, an imo pagliwat in matitipig bisan waray hini.",
+       "missingcommentheader": "<strong>Pahinumdom:</strong> Waray ka humatag hin subject para hinin nga komento.  Kun pinduton mo an \"$1\" utro, an imo pagliwat in matitipig bisan waray hini.",
        "summary-preview": "Pahiuna nga pagawas han dalikyat nga pulong:",
        "subject-preview": "Pahiuna nga pagawas hit himangrawan:",
        "blockedtitle": "Ginpugngan ini nga gumaramit",
        "right-hideuser": "Pugnga an uska agnay-hin-gumaramit, tago-a ito tikang ha publiko",
        "right-unblockself": "Lugaring nga makakatanggal han pagpugong",
        "right-editinterface": "Igliwat an user interface",
-       "right-editusercssjs": "Igliwat an kanan iba mga gumaramit nga mga paypay han CSS ngan JavaScript",
        "right-editusercss": "Igliwat an kanan iba mga gumaramit nga mga paypay han CSS",
        "right-edituserjs": "Iliwat an kanan iba mga gumaramit nga paypay han JavaScript",
        "right-viewmywatchlist": "Kitaa an imo kalugaringon nga talaan hin barantayon",
        "rcshowhidemine-hide": "Tago-a",
        "rcshowhidecategorization-show": "Pakit-a",
        "rcshowhidecategorization-hide": "Tago-a",
-       "rclinks": "Igpakita an katapusan nga $1 nga pagbabag-o ha sulod han urhi nga $2 ka mga adlaw<br />$3",
+       "rclinks": "Igpakita an katapusan nga $1 nga pagbabag-o ha sulod han urhi nga $2 ka mga adlaw",
        "diff": "kaibhan",
        "hist": "kaagi",
        "hide": "Tago-a",
index dbee858..fffb4fa 100644 (file)
        "externaldberror": "Njuumte judd na ci dàttub njoxe bi, walla day ni rekk amuloo sañ-sañu yeesal sa sàqum biti.",
        "login": "xammeeku",
        "nav-login-createaccount": "Dugg / Bindu",
-       "userlogin": "Dugg / Bindu",
        "logout": "Génnu",
        "userlogout": "Génnu",
        "notloggedin": "Duggoo de",
        "userlogin-noaccount": "Amagoo am sàq?",
        "userlogin-joinproject": "Bindu ci {{SITENAME}}",
-       "nologin": "Sosagoo am sàq ? '''$1'''.",
-       "nologinlink": "Sos ko leegi",
        "createaccount": "Sos am sàq",
-       "gotaccount": "Sos nga am sàq? '''$1'''.",
-       "gotaccountlink": "Dugg",
        "userlogin-resetpassword-link": "Danga fàtte sa baatujàll?",
        "userlogin-helplink2": "Ndimbal ñeel dugg gi",
        "createacct-emailoptional": "Màkkaanu m-bataaxal (mu-neex-la)",
        "saveprefs": "Wattu",
        "restoreprefs": "Delloo say tànneef nañu meloon ca sag mbindu",
        "prefs-editing": "Boyotu coppite",
-       "rows": "Rëdd:",
-       "columns": "Kenu :",
        "searchresultshead": "Seet",
        "recentchangesdays": "Limu bes yi nga koy wone ci coppite yu mujj yi :",
        "recentchangesdays-max": "(bi ëpp $1 {{PLURAL:$1|bés|bés}})",
        "userrights-reason": "Ngirte :",
        "userrights-no-interwiki": "Amoo sañ-sañu soppi sañ-sañi jëfandikukat yi ci yeneen wiki",
        "userrights-nodatabase": "Dàttub njoxe bii « $1 » amul walla nekkul ci barab bi.",
-       "userrights-nologin": "Faaw nga  [[Special:UserLogin|dugg]] ak sàqum ab yorkat ngir man a soppi sañ-sañi ab jëfandukukat.",
-       "userrights-notallowed": "Sa sàq amul sañ-sañ ngir man a joxi sañ-sañ ab jëfandikukat.",
        "userrights-changeable-col": "Mbooloo yees man a soppi",
        "userrights-unchangeable-col": "Mbooloo yees manuta soppi",
        "userrights-irreversible-marker": "$1*",
        "right-protect": "Soppi tolluwaayu kaaraange gi te soppi xët yees aar",
        "right-editprotected": "Soppi xët yees aar",
        "right-editinterface": "Soppi jokkalekaayu jëfandikukat bi",
-       "right-editusercssjs": "Soppi dencukaay yu CSS ak  JS yu yeneen jëfandikukat",
        "right-editusercss": "Soppi dencukaay yu CSS yu yeneen jëfandikukat",
        "right-edituserjs": "Soppi dencukaay yu JS yu yeneen jëfandikukat",
        "right-rollback": "Loppanti gu gaaw gu coppite yub jëfandikukat bu mujj ci wenn xët wi",
        "rcshowhidemine": "$1 samay cëru",
        "rcshowhidemine-show": "Wone",
        "rcshowhidemine-hide": "Nëbb",
-       "rclinks": "Wone $1 coppite yi mujj ci $2  fan yi mujj <br />$3.",
+       "rclinks": "Wone $1 coppite yi mujj ci $2  fan yi mujj",
        "diff": "wuute",
        "hist": "jaar",
        "hide": "Nëbb",
        "undeleteviewlink": "wone",
        "undeleteinvert": "Jallarbi fal gi",
        "undeletecomment": "Tënk :",
-       "undeletedrevisions": "$1 {{PLURAL:$1|delloowaat nañ ab sumb|delloowaat nañ $1 sumb}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|sumb|sumb}} ak $2 {{PLURAL:$2|ŋara|ŋara}} loppanti nañu leen",
-       "undeletedfiles": "{{PLURAL:$1|1 dencukaay|$1 dencukaay}} lañu delloowaat",
        "cannotundelete": "Delloowaat gi antuwul. Xéj-na keneen delloowaat na ko ba noppi.",
        "undeletedpage": "'''Xët wii di $1 delloowaat nañu ko.'''\n\nSaytul [[Special:Log/delete|jaar-jaaru far bi]] ngir xool far yi ak delloowaat yu mujj yi.",
        "undelete-header": "Saltul [[Special:Log/delete|jaar-jaaru far bi ]] ngir xool far yi mujj.",
        "logentry-newusers-create": "Sàqum jëfandikukat $1 sos nañu ko",
        "logentry-upload-upload": "$1 {{GENDER:$2|moo yeb}} $3",
        "rightsnone": "(menn)",
-       "revdelete-summary": "soppi tënk gi",
        "searchsuggest-search": "Seet"
 }
index 5f342a8..0c75fc5 100644 (file)
        "externaldberror": "迭个作兴是由于验证数据库错误或者侬拨禁止更新侬个外部账号。",
        "login": "登进去",
        "nav-login-createaccount": "登进去 / 建账号",
-       "userlogin": "登进去 / 建账号",
-       "userloginnocreate": "登录",
        "logout": "登出",
        "userlogout": "登出",
        "notloggedin": "弗曾登录",
        "userlogin-noaccount": "呒不账号?",
        "userlogin-joinproject": "加进{{SITENAME}}",
-       "nologin": "还呒不账号?$1。",
-       "nologinlink": "建新账号",
        "createaccount": "建账号",
-       "gotaccount": "已经有仔帐号哉? '''$1'''。",
-       "gotaccountlink": "登录",
-       "userlogin-resetlink": "忘记登录细节?",
        "userlogin-resetpassword-link": "忘脱密码?",
        "userlogin-helplink2": "登录帮忙",
        "userlogin-loggedin": "你侬用{{GENDER:$1|$1}}登进来哉。用下向个表以别样身份登进。",
        "createacct-another-email-ph": "电子信地址打进去",
        "createaccountmail": "拿临时随机密码发到指定个电邮地址",
        "createacct-realname": "真名字(随意)",
-       "createaccountreason": "理由:",
        "createacct-reason": "理由:",
        "createacct-reason-ph": "为何物建别样账号",
        "createacct-submit": "建立侬个账号",
        "preview": "望望相",
        "showpreview": "显示预览",
        "showdiff": "显示变化",
-       "blankarticle": "<strong>警告:</strong>侬要创建个页面是空白个。如果侬再次点击“{{int:savearticle}}”,一只呒不任何内容个页面会畀创建。",
+       "blankarticle": "<strong>警告:</strong>侬要创建个页面是空白个。如果侬再次点击“$1”,一只呒不任何内容个页面会畀创建。",
        "anoneditwarning": "<strong>警告:</strong>侬弗曾登录。如果侬做仔啥编辑,箇么侬个IP地址会公开可见。如果侬<strong>[$1 登录]</strong>或者<strong>[$2 建立只账号]</strong>,侬个编辑会归功到侬用户名下底,而且有其他优点。",
        "anonpreviewwarning": "''侬弗曾登录。侬个IP位址会得记录拉此页个编辑历史里向。''",
        "missingsummary": "'''提示:''' 侬弗曾提供编辑摘要。假使侬再次单击保存,侬个编辑将弗带编辑摘要保存。",
-       "selfredirect": "<strong>警告:</strong>侬来上拿本页面重定向到它自家。侬可能搞错著重定向个目标,或者侬来上编辑错个页面。如果侬再次点击“{{int:savearticle}}”,重定向弗管哪亨会畀创建。",
+       "selfredirect": "<strong>警告:</strong>侬来上拿本页面重定向到它自家。侬可能搞错著重定向个目标,或者侬来上编辑错个页面。如果侬再次点击“$1”,重定向弗管哪亨会畀创建。",
        "missingcommenttext": "请垃下头输入备注。",
-       "missingcommentheader": "<strong>提示:</strong>侬弗曾为此评论提供标题。如果侬再次单击“{{int:savearticle}}”,侬个编辑将弗带标题保存。",
+       "missingcommentheader": "<strong>提示:</strong>侬弗曾为此评论提供标题。如果侬再次单击“$1”,侬个编辑将弗带标题保存。",
        "summary-preview": "摘要预览:",
        "subject-preview": "主题预览:",
        "blockedtitle": "用户畀查封",
        "editingsection": "来里编写“$1”(段落)",
        "editingcomment": "垃许编辑 $1 (新段落)",
        "editconflict": "编辑冲突: $1",
-       "explainconflict": "有人垃拉侬开始编辑之后更改仔页面。上头个文字框内显示个是箇歇本页个内容。侬个修改显示垃拉下底只文字框里向。侬应当拿侬个修改合并到现有个文本里向。<strong>只有</strong>上头文字框里向个内容会得垃侬点击“{{int:savearticle}}”之后畀保存。",
+       "explainconflict": "有人垃拉侬开始编辑之后更改仔页面。上头个文字框内显示个是箇歇本页个内容。侬个修改显示垃拉下底只文字框里向。侬应当拿侬个修改合并到现有个文本里向。<strong>只有</strong>上头文字框里向个内容会得垃侬点击“$1”之后畀保存。",
        "yourtext": "侬个文字",
        "storedversion": "已保存版本",
        "nonunicodebrowser": "'''警告:侬个浏览器弗兼容Unicode编码。'''箇搭有一只工作区将使侬可以安全编辑页面:非ASCII字符将以十六进制编码方式出现垃拉编辑框里向。",
        "saveprefs": "保存",
        "restoreprefs": "复原全部默认设定",
        "prefs-editing": "编辑",
-       "rows": "行数:",
-       "columns": "列数:",
        "searchresultshead": "搜索",
        "stub-threshold": "短链接格式阈值($1):",
        "stub-threshold-disabled": "停用",
        "rcshowhidemine-show": "显示",
        "rcshowhidemine-hide": "囥脱",
        "rcshowhidecategorization-hide": "囥脱",
-       "rclinks": "显示来拉上个 $2 日里向个最近 $1 趟改动<br />$3",
+       "rclinks": "显示来拉上个 $2 日里向个最近 $1 趟改动",
        "diff": "两样",
        "hist": "历史",
        "hide": "囥脱",
        "logentry-rights-rights": "$1{{GENDER:$2|更改}}{{GENDER:$6|$3}}个用户组从$4到$5",
        "logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
        "rightsnone": "(呒)",
-       "revdelete-summary": "编辑摘要",
        "feedback-thanks-title": "谢谢侬!",
        "searchsuggest-search": "搜寻{{SITENAME}}",
        "pagelang-language": "闲话"
index c27fc60..f8d6a09 100644 (file)
        "yourdomainname": "Тана домен:",
        "login": "Орлһн",
        "nav-login-createaccount": "Орх/бүрткгдх",
-       "userlogin": "Орх/бүрткгдх",
-       "userloginnocreate": "Орх",
        "logout": "Һарх",
        "userlogout": "Һарх",
        "notloggedin": "Та орсн уга",
-       "nologin": "Бичгдлһгот? '''$1'''.",
-       "nologinlink": "Бичгдлһн бүтәх",
        "createaccount": "Бичгдлһн бүтәх",
-       "gotaccount": "Бичгдлһтәт? '''$1'''.",
-       "gotaccountlink": "Ортн",
        "createaccountmail": "электрона улаһар",
        "userexists": "Эн нер олзлдг юмн.\nБуйн болтха, талдан нернь автн.",
        "loginerror": "Орлһна эндү",
        "saveprefs": "Хадһлх",
        "restoreprefs": "Хамг таарсн көг босхх (цуг салвр)",
        "prefs-editing": "Ясвр",
-       "rows": "Мөрд:",
-       "columns": "Бахд:",
        "savedprefs": "Тана көгүдиг хадһлв.",
        "timezonelegend": "Цагин бүс:",
        "localtime": "Бәәрн цаг:",
        "rcshowhideliu": "$1 бүрткгдсн демнәч",
        "rcshowhideanons": "нерго демнәчнр $1",
        "rcshowhidemine": "мини ясвр $1",
-       "rclinks": "Отхн $1 ясвр, сүл $2 өдрмүдт үзүлх<br />$3",
+       "rclinks": "Отхн  $2 өдрә $1 ясвр үзүлх",
        "diff": "йилһ",
        "hist": "тууҗ",
        "hide": "Нуух",
index 6b8e5a5..26dbb79 100644 (file)
@@ -16,7 +16,8 @@
                        "Silovan",
                        "David1010",
                        "Macofe",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Otogi"
                ]
        },
        "tog-underline": "რცხუეფიშ ათოღაზუა:",
        "viewyourtext": "თქვა შეილებუნა ქოძირათ '''თქვანი რედაქტირაფეფიშ''' დაჭყაფური ტექსტი თე ხასჷლას დო გეჭოფათ თიშ ანგი.",
        "protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
        "editinginterface": "<strong>ყურადღება:</strong> თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც.",
-       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
+       "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკების ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "ეს გვერდი რედაქტირებისგან დაცულია, რადგან იგი ჩართულია შემდეგ {{PLURAL:$1|გვერდში, რომლის |გვერდებში, რომელთა}} დასაცავადაც ჩართულია პარამეტრი \"იერარქიული\":\n$2",
        "namespaceprotected": "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
        "customcssprotected": "თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.",
        "externaldberror": "საგარეო მონაცემთა ბაზაში აუტენტიფიკაციის შეცდომაა, ან თქვენ არ გაქვთ საკმარისი უფლებები საგარეო ანგარიშში ცვლილებების შესატანად.",
        "login": "მიშულა",
        "nav-login-createaccount": "მიშულა/ანგარიშიშ გონწყუმა",
-       "userlogin": "მიშულა/ანგარიშიშ გონწყუმა",
-       "userloginnocreate": "მიშულა",
        "logout": "გიშულა",
        "userlogout": "გიშულა",
        "notloggedin": "შესვლა არ განხორციელდა",
        "userlogin-noaccount": "ვაიღჷნანო ანგარიში?",
        "userlogin-joinproject": "ქაკათით {{SITENAME}}",
-       "nologin": "დიორდე ვარეთო რეგისტრირებული? $1.",
-       "nologinlink": "გონწყით ანგარიში",
        "createaccount": "ანგარიშიშ გონწყუმა",
-       "gotaccount": "უკვე რეგისტრირებული რეთო? '''$1'''",
-       "gotaccountlink": "მინულა",
-       "userlogin-resetlink": "გუგოჭყორდესო მიშაულარო საჭირო ინფორმაციაქ?",
        "userlogin-resetpassword-link": "დუგოჭყორდესო პაროლქ?",
        "userlogin-helplink2": "მოხვარა:მიშულა",
        "userlogin-loggedin": "თქვენ უკვე შეხვედით როგორც {{GENDER:$1|$1}}.\nგამოიყენეთ ფორმა ქვემოთ, რათა შეხვიდეთ სხვა ანგარიშიდან.",
        "createacct-another-email-ph": "გენშიონით თქვანი ელ. ფოსტაშ ოწურაფუ",
        "createaccountmail": "გამოიყენეთ შემთხვევითობის მეთოდით შერჩეული დროებითი პაროლი და გააგზავნეთ მითითებულ ელ.ფოსტის მისამართზე",
        "createacct-realname": "ნამდვილი სახელი (არააუცილებელი)",
-       "createaccountreason": "მიზეზი:",
        "createacct-reason": "მიზეზი",
        "createacct-reason-ph": "რატომ ქმნით ახალ ანგარიშს?",
        "createacct-submit": "გონწყით თქვენ ანგარიში",
        "preview": "გიწოთოლორაფა",
        "showpreview": "ქაძირე გიწოთოლორაფა",
        "showdiff": "თირაფეფიშ ძირაფა",
-       "blankarticle": "გაფრთხილება: გვერდი, რომელსაც ქმნით, ცარიელია. თუკი კვლავ დააჭერთ ღილაკს \"{{int:savearticle}}\", გვერდი შეიქმნება შემცვლელობის გარეშე.",
+       "blankarticle": "გაფრთხილება: გვერდი, რომელსაც ქმნით, ცარიელია. თუკი კვლავ დააჭერთ ღილაკს \"$1\", გვერდი შეიქმნება შემცვლელობის გარეშე.",
        "anoneditwarning": "<strong>გათხილება:</strong> თქვა ვარეთ ავტორიზაფილი. თქანი IP მიოწურაფუ საარძოთ იძირაფედას იჸი, თუ თქვა შეასრულენთ რედაქტირაფას. თუ თქვა გენკურთ <strong>[$1 ავტორიზაციას]</strong> ვარდა <strong>[$2 გონწყუნთ ანგარიშის]</strong>, შხვა ნარსხუნეფწკჷმა ართო, თქვანი რედაქტირაფეფი ქიმიარსხუ თქვან მახვარებუშ ჯოხოს.",
        "anonpreviewwarning": "''თქვენ არ შესულხართ სისტემაში. თქვენი IP მისამართი შეინახება გვერდის ისტორიაში. ''",
        "missingsummary": "<strong>ეხსენება:</strong> თქვენ არ მიგითითებიათ რედაქტირების რეზიუმე.\nთუ ისევ დააწკაპუნებთ შენახვაზე, თქვენი რედაქტირება რეზიუმეს გარეშე დამახსოვრდება.",
-       "selfredirect": "გაფრთხილება: თქვენ გადამისამართებას იმავე გვერდზე ქმნით. შესაძლოა, თქვენ გადამისამართებისთვის აირჩიეთ არასწორი სამიზნე გვერდი ან არედაქტირებთ არასამიზნე გვერდს. \n\nთუ თქვენ კიდევ ერთხელ დააჭერთ ღილაკს \"{{int:savearticle}}\", გადამისამართება შეიქმნება.",
+       "selfredirect": "გაფრთხილება: თქვენ გადამისამართებას იმავე გვერდზე ქმნით. შესაძლოა, თქვენ გადამისამართებისთვის აირჩიეთ არასწორი სამიზნე გვერდი ან არედაქტირებთ არასამიზნე გვერდს. \n\nთუ თქვენ კიდევ ერთხელ დააჭერთ ღილაკს \"$1\", გადამისამართება შეიქმნება.",
        "missingcommenttext": "გთხოვთ კომენტარი შეიყვანოთ ქვემოთ.",
-       "missingcommentheader": "'''შეხსენება:''' თქვენ ამ კომენტარისთვის სათაური/თემა არ მიგითითებიათ. თუ შენახვაზე \"{{int:savearticle}}\" დააწკაპუნებთ, თქვენი ცვლილება მის გარეშე იქნება შენახული.",
+       "missingcommentheader": "'''შეხსენება:''' თქვენ ამ კომენტარისთვის სათაური/თემა არ მიგითითებიათ. თუ შენახვაზე \"$1\" დააწკაპუნებთ, თქვენი ცვლილება მის გარეშე იქნება შენახული.",
        "summary-preview": "რეზიუმეშ გიწოთოლორაფა",
        "subject-preview": "თემის/სათაურის წინასწარი გადახედვა:",
        "previewerrortext": "თქვენი ცვლილებების წინასწარი გადახედვის მცდელობის დროს მოხდა შეცდომა.",
        "editingsection": "$1–იშ (სექციაშ) რედაქტირაფა",
        "editingcomment": "რედაქტირაფა: $1 (ახალი სექცია)",
        "editconflict": "რედაქტირების კონფლიქტი: $1",
-       "explainconflict": "სხვა მომხმარებელმა შეცვალა ეს გვერდი მას შემდეგ რაც თქვენ დაიწყეთ მისი რედატირება.\nზედა ტექსტური ველი შეიცავს გვერდის შიგთავსს მისი ამჟამინდელი სახით.\nთქვენი ცვლილებები ნაჩვენებია ქვედა ტექსტურ ველში.\nთქვენ მოგიწევთ თქვენი ცვლილებების შერწყმა არსებულ ტექსტთან.\n'''მხოლოდ''' ზედა ველში არსებული ტექსტი იქნება შენახული, როდესაც „{{int:savearticle}}“ დააჭერთ.",
+       "explainconflict": "სხვა მომხმარებელმა შეცვალა ეს გვერდი მას შემდეგ რაც თქვენ დაიწყეთ მისი რედატირება.\nზედა ტექსტური ველი შეიცავს გვერდის შიგთავსს მისი ამჟამინდელი სახით.\nთქვენი ცვლილებები ნაჩვენებია ქვედა ტექსტურ ველში.\nთქვენ მოგიწევთ თქვენი ცვლილებების შერწყმა არსებულ ტექსტთან.\n'''მხოლოდ''' ზედა ველში არსებული ტექსტი იქნება შენახული, როდესაც „$1“ დააჭერთ.",
        "yourtext": "თქვან ტექსტი",
        "storedversion": "შენახული ვერსია",
        "nonunicodebrowser": "<strong>გაფრთხილება: თქვენი ბრაუზერი უნიკოდთან თავსებადი არ არის.</strong> \nჩვენ ვცდილობთ ამ პრობლემის გადაჭრას, რათა თქვენ შეძლოთ უსაფრთხოდ შეიტანოთ ცვლილებები გვერდებზე: არა-ASCII ნიშნები რედაქტირების ფანჯარაში გამოჩნდება როგორც ჰექსადეციმალური კოდები.",
        "right-editsemiprotected": "გვერდების რედაქტირება რომლებიც დაცულია როგორც „{{int:protect-level-autoconfirmed}}“",
        "right-editcontentmodel": "გვერდის კონტენტური მოდელის რედაქტირება",
        "right-editinterface": "მომხმარებლის ინტერფეისის შეცვლა",
-       "right-editusercssjs": "სხვა მომხმარებლების CSS და JavaScript ფაილების შესწორება",
        "right-editusercss": "სხვა მომხმარებლების CSS-ფაილების შესწორება",
        "right-edituserjs": "სხვა მომხმარებლების JavaScript-ფაილების შესწორება",
        "right-editmyusercss": "თქვენი საკუთარი CSS-ფაილების რედაქტირება",
        "rcshowhidecategorization": "$1 ხასჷლაშ კატეროტიზაცია",
        "rcshowhidecategorization-show": "ძირაფა",
        "rcshowhidecategorization-hide": "ტყობინაფა",
-       "rclinks": "ეკონია $2 დღას ღოლამირ ეკონია $1 თირაფეფიშ ძირაფა <br />$3",
+       "rclinks": "ეკონია $2 დღას ღოლამირ ეკონია $1 თირაფეფიშ ძირაფა",
        "diff": "შხვანერობა",
        "hist": "ისტ.",
        "hide": "ტყობინაფა",
        "logentry-newusers-create": "{{GENDER:$2|დორსხუაფილი რე}} მახვარებუშ ანგარიში $1",
        "logentry-upload-upload": "მახვარებუქ $1 {{GENDER:$2|ეხარგუ}} $3",
        "rightsnone": "(არცერთი)",
-       "revdelete-summary": "ცვლილებების აღწერა",
        "feedback-adding": "თქვენი შეფასების შენახვა...",
        "feedback-back": "უკან",
        "feedback-bugcheck": "კარგია! გთხოვთ, კიდევ ერთხელ შეამოწმეთ, ხომ არ არის აქ რომელიმე უკვე [$1 ნაცნობი შეცდომა].",
index b4fd680..a38386a 100644 (file)
@@ -18,7 +18,8 @@
                        "Matma Rex",
                        "Macofe",
                        "Nemo bis",
-                       "Alefbeis"
+                       "Alefbeis",
+                       "Sol lemon"
                ]
        },
        "tog-underline": "שטרייכט אונטער לינקען",
        "redirectedfrom": "(אַריבערגעפֿירט פון $1)",
        "redirectpagesub": "ווייטערפירן בלאט",
        "redirectto": "ווײַטערפירן צו:",
-       "lastmodifiedat": "×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×\9cעצ×\98 ×\92×¢×\95×\95×\90ר×\9f ×\9e×\90×\93×\99פ×\99צירט $2, $1.",
+       "lastmodifiedat": "×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×\9cעצ×\98 ×\92×¢×\95×\95×\90ר×\9f ×¨×¢×\93×\90ק×\98ירט $2, $1.",
        "viewcount": "דער בלאט איז געווארן געליינט {{PLURAL:$1|איין מאל|$1 מאל}}.",
        "protectedpage": "באשיצטער בלאט",
        "jumpto": "שפּרינג צו:",
        "login": "אַרײַנלאָגירן",
        "login-security": "וועריפיצירט אייער אידענטיטעט",
        "nav-login-createaccount": "ארײַנלאָגירן / זיך אײַנשרײַבן",
-       "userlogin": "ארײַנלאָגירן / זיך אײַנשרײַבן",
-       "userloginnocreate": "אַרײַנלאגירן",
        "logout": "אַרױסלאָגירן",
        "userlogout": "אַרױסלאָגירן",
        "notloggedin": "נישט איינגעשריבן",
        "userlogin-noaccount": "איר האט נישט קיין קאנטע?",
        "userlogin-joinproject": "איינטרעטן ביי {{SITENAME}}",
-       "nologin": "איר האט נישט קיין קאנטע? '''$1'''.",
-       "nologinlink": "שאַפֿן אַ קאנטע",
        "createaccount": "שאַפֿן אַ נײַע קאנטע",
-       "gotaccount": "האסטו שוין א קאנטע? '''$1'''.",
-       "gotaccountlink": "אַרײַנלאגירן",
-       "userlogin-resetlink": "פארגעסן אײַערע אַרײַנלאָגירן פרטים?",
        "userlogin-resetpassword-link": "פֿאַרגעסן אײַער פאַסווארט?",
        "userlogin-helplink2": "הילף מיט ארײַנלאגירן",
        "userlogin-loggedin": "איר זענט שוין אריינלאגירט ווי {{GENDER:$1|$1}}.\nניצט די פארעם אונטן כדי אריינלאגירן ווי אן אנדער באניצער.",
        "createaccountmail": "ניצן א פראוויזאריש פאסווארט און שיקן צום געצייכנטן ע-פאסט אדרעס",
        "createaccountmail-help": "קען ווערן באניצט צו שאפֿן קאנטע פֿאר א צווייטן אן צו דערגיין דאס פאסווארט.",
        "createacct-realname": "עכטער נאמען (אפציאנאל)",
-       "createaccountreason": "אורזאַך:",
        "createacct-reason": "אורזאך",
        "createacct-reason-ph": "פֿארוואס שאפֿט איר נאך א קאנטע",
        "createacct-reason-help": "מעלדונג געוויזן אין קאנטע־שאפֿונג לאגבוך",
        "nocookiesnew": "די באניצער קאנטע איז באשאפן, אבער איר זענט נישט אריינלאגירט.\n{{SITENAME}} ניצט קיכלעך אריינצולאגירן באניצער.\nאיר האט קיכלעך נישט-ערמעגלעכט.\nביטע ערמעגלעכט זיי, דאן טוט אריינלאגירן מיט אייערע נייע באניצער נאמען און פאסווארט.",
        "nocookieslogin": "{{SITENAME}} נוצט קיכלעך כדי אַרײַנלאגירן באַניצער.\nבײַ אײַך זענען קיכלעך אומדערמעגלעכט.\nביטע אַקטיווירט זיי און פרובירט נאכאַמאָל.",
        "nocookiesfornew": "מען האט נישט געשאַפֿן די באַניצער קאנטע, ווײַל מען האט נישט געקענט באַשטעטיקן איר מקור.\nטוט פֿעסטשטעלן אָז קיכלעך זענען אַקטיווירט, לאָדט אָן נאכאַמאל דעם בלאַט און פרואווט ווידער.",
+       "createacct-loginerror": "מען האט געשאפן די קאנטע דערפאלגרייך; איר קענט אבער נישט אריינלאגירן אויטאמאטיש. זייט אזוי גוט און גייט צום [[Special:UserLogin|מאנועלן אריינלאגירן]].",
        "noname": "איר האט נישט אַרײַנגעשטעלט קײַן גילטיקן באַניצער נאָמען.",
        "loginsuccesstitle": "אריינלאגירט",
        "loginsuccess": "'''איר זענט אַצינד אַרײַנלאָגירט אין {{SITENAME}} ווי \"$1\".'''",
        "preview": "פֿאראויסקוק",
        "showpreview": "ווייזן פאָרױסקוק",
        "showdiff": "ווײַז די ענדערונגען",
-       "blankarticle": "<strong>×\90×\96×\94ר×\94:</strong> ×\93ער ×\91×\9c×\90×\98 ×\90×\99ר ×\92×\99×\99×\98 ×©×\90פ×\9f ×\90×\99×\96 ×\9c×\99×\99×\93×\99ק.\n×\98×\90×\9eער ×\90×\99ר ×\95×\95×¢×\98 ×\93ר×\99ק×\9f ×\90×\95×\99×£ \"{{int:savearticle}}\" נאכאמאל, וועט דער בלאט ווערן געשאפן אן קיין אינהאלט.",
+       "blankarticle": "<strong>×\90×\96×\94ר×\94:</strong> ×\93ער ×\91×\9c×\90×\98 ×\95×\95×\90ס ×\90×\99ר ×\92×\99×\99×\98 ×©×\90פ×\9f ×\90×\99×\96 ×\9c×\99×\99×\93×\99×\92.\n×\98×\90×\9eער ×\90×\99ר ×\95×\95×¢×\98 ×\93ר×\99ק×\9f ×\90×\95×\99×£ \"$1\" נאכאמאל, וועט דער בלאט ווערן געשאפן אן קיין אינהאלט.",
        "anoneditwarning": "<strong>ווארענונג:</strong> איר זענט נישט אריינלאגירט. אייער איי פי אדרעס וועט ווערן עפנטלעך זעבאר ווען איר פירט דורך  ענדערונגען . אז איר <strong>[$1 לאגירט ארײַן]</strong> אדער <strong>[$2 שאפט א קאנטע]</strong>, וועלן אײַערע רעדאקטירונגען ווערן צוגעשריבן צו אײַער באניצער-נאמען, ווי אויך אנדערע טובות.",
        "anonpreviewwarning": "''איר זענט נישט אַרײַנלאגירט. אויפֿהיטן וועט ארײַנשרײַבן אײַער IP אַדרעס אין דער רעדאַקטירונג היסטאריע פונעם בלאַט.''",
        "missingsummary": "'''דערמאנונג:''' איר האט נישט אויסגעפילט דעם קורץ ווארט אויפקלערונג אויף אייער עדיט. אויב וועט איר דרוקן נאכאמאל אויף  \"היט אפ דעם בלאט\", וועט אייער ענדערונג ווערן געהיטן אן דעם.",
-       "selfredirect": "<strong>×\95×\95×\90רענ×\95× ×\92:</strong> ×\90×\99ר ×\98×\95×\98 ×\95×\95ײַ×\98ערפ×\99ר×\9f ×\93×¢×\9d ×\91×\9c×\90×\98 ×¦×\95 ×\96×\99×\9a ×\90×\9c×\99×\99×\9f.\n×\90×\99ר ×\94×¢×\98 ×\90פשר ×¡×¤×¢×¦×\99פ×\99צ×\99ר×\98 ×\90 ×¤×\90×\9cש×\9f ×\95×\95ײַ×\98ערפ×\99ר×\95× ×\92־צ×\99×\9c  ×\90×\93ער ×\90×\99ר ×¨×¢×\93×\90ק×\98×\99ר×\98 ×\93×¢×\9d ×¤×\90×\9cש×\9f ×\91×\9c×\90×\98.\n×\98×\90×\9eער ×§×\9c×\99ק×\98 ×\90×\99ר × ×\90×\9b×\90×\9e×\90×\9c \"{{int:savearticle}}\", ×\95×\95×¢×\98 ×\9e×¢×\9f ×\98×\90קע ×©×\90פ×\9f ×\93×\99 ×\95×\95ײַטערפירונג.",
+       "selfredirect": "<strong>×\95×\95×\90רענ×\95× ×\92:</strong> ×\90×\99ר ×\98×\95×\98 ×\95×\95ײַ×\98ערפ×\99ר×\9f ×\93×¢×\9d ×\91×\9c×\90×\98 ×¦×\95 ×\96×\99×\9a ×\90×\9c×\99×\99×\9f.\nקע×\9f ×\96×\99×\99×\9f ×\90×\99ר ×\94×\90×\98 ×¡×¤×¢×¦×\99פ×\99צ×\99ר×\98 ×\90 ×¤×\90×\9cש×\9f ×\95×\95ײ×\98ערפ×\99ר×\95× ×\92־צ×\99×\9c  ×\90×\93ער ×\90×\99ר ×¨×¢×\93×\90ק×\98×\99ר×\98 ×\93×¢×\9d ×¤×\90×\9cש×\9f ×\91×\9c×\90×\98.\n×\98×\90×\9eער ×§×\9c×\99ק×\98 ×\90×\99ר × ×\90×\9b×\90×\9e×\90×\9c \"$1\", ×\95×\95×¢×\98 ×\9e×¢×\9f ×\98×\90קע ×©×\90פ×\9f ×\93×\99 ×\95×\95ײטערפירונג.",
        "missingcommenttext": "ביטע שטעלט אריין א אנמערקונג פון אונטן.",
-       "missingcommentheader": "'''דערמאַנונג:''' איר האט נישט אַרײַנגעשטעלט א טעמע פאר דער אנמערקונג. אויב וועט איר דרוקן נאכאמאל אויפן \"{{int:savearticle}}\", וועט אייער ענדערונג ווערן אפגעהיטן אן דעם.",
+       "missingcommentheader": "'''דערמאַנונג:''' איר האט נישט אַרײַנגעשטעלט א טעמע פאר דער אנמערקונג. אויב וועט איר דרוקן נאכאמאל אויפן \"$1\", וועט אייער ענדערונג ווערן אפגעהיטן אן דעם.",
        "summary-preview": "פאראויסקוק פֿון רעדאקטירונג־רעזומע:",
        "subject-preview": " פאראויסקוק פֿון טעמע:",
        "previewerrortext": "א פעלער האט פאסירט ביים פרובירן פארויסקוקן אײַערע ענדערונגען.",
        "readonlywarning": "<strong>ווארענונג: די דאטנבאזע איז געווארן פארשלאסן פאר אויפהאלטונג, ממילא וועט איר נישט קענען אפהיטן אייערע ענדערונגען אצינד.</strong>\nאיר קענט קאפירן און ארײַנלייגן דעם טעקסט אריין צו א טעקסט טעקע און דאס דארטן אפהיטן אויף שפעטער.\n\nדער אדמיניסטראטאר וואס האט זי פארשלאסן האט מסביר געווען אזוי: $1",
        "protectedpagewarning": "'''ווארענונג:  דער בלאט איז געווארן פארשפארט אז בלויז באניצערס מיט סיסאפ פריווילעגיעס קענען אים ענדערן.'''\nדי פארגאנגענע לאגבוך באשרײַבונג ווערט געוויזן דא:",
        "semiprotectedpagewarning": "'''באמערקונג:''' דער דאָזיקער בלאַט איז פאַרשפּאַרט, אַזוי אַז בלויז איינגעשריבענע באַניצער קענען אים ענדערן.\nדאָס פאַרגאַנגענע לאָגבוך באַשרייבונג ווערט געוויזן דאָ:",
-       "cascadeprotectedwarning": "<strong>×\95×\95×\90רענ×\95× ×\92:</strong> ×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×¤×\90רשפ×\90ר×\98 ×\90×\96 ×\91×\9c×\95×\99×\96 ×¡×\99ס×\90פ×\9f קענען אים ענדערן, וויבאלד ער איז איינגעשלאסן אין {{PLURAL:$1| דעם פאלגנדן בלאט, וואס איז|די פאלגנדע בלעטער, וואס זענען}} קאסקאד באשיצט:",
+       "cascadeprotectedwarning": "<strong>×\95×\95×\90רענ×\95× ×\92:</strong> ×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×¤×\90רשפ×\90ר×\98 ×\90×\96 ×\91×\9c×\95×\99×\96 ×\91×\90× ×\99צער ×\9e×\99×\98 [[Special:ListGroupRights|ספעצ×\99פֿ×\99שע ×¨×¢×\9b×\98×\9f]] קענען אים ענדערן, וויבאלד ער איז איינגעשלאסן אין {{PLURAL:$1| דעם פאלגנדן בלאט, וואס איז|די פאלגנדע בלעטער, וואס זענען}} קאסקאד באשיצט:",
        "titleprotectedwarning": "'''אזהרה: דער בלאט איז פֿארשפאַרט טא דארף מען [[Special:ListGroupRights|ספעציפֿישע רעכטן]] צו שאפֿן אים.'''\nדי פֿאַרגאַנגענע לאגבוך באשרײַבונג ווערט געוויזן דאָ:",
        "templatesused": "{{PLURAL:$1|מוסטער|מוסטערן}} באנוצט אויף דעם בלאט:",
        "templatesusedpreview": "{{PLURAL:$1|מוסטער| מוסטערן}}  באַניצט  אין דעם פֿאָראױסקוק:",
        "page_first": "ערשט",
        "page_last": "לעצט",
        "histlegend": "פֿארגלייכן  אויסקלויב: צייכנט די קנעפלעך פֿון די ווערסיעס צו פֿארגלײַכן, און קלאפט  Enter אדער דאס קנעפל '''{{int:compareselectedversions}}'''.<br />\nשליסל: '''({{int:cur}})''' = אונטערשייד פֿון לויפֿיגער ווערסיע, '''({{int:last}})''' = אונטערשייד פֿון פֿריערדיגער ווערסיע, '''({{int:last}})''' = מינערדיקע רעדאקטירונג",
-       "history-fieldset-title": "×\91×\9c×¢×\98ער×\98 ×\93×\99 ×\94×\99ס×\98×\90ר×\99×¢",
-       "history-show-deleted": "נאר אויסגעמעקט",
+       "history-fieldset-title": "×\96×\95×\9b×\9f ×\95×\95ערס×\99עס",
+       "history-show-deleted": "נאר אויסגעמעקטע ווערסיעס",
        "histfirst": "עלטסטע",
        "histlast": "נײַעסטע",
        "historysize": "({{PLURAL:$1|1 בייט|$1 בייטן}})",
        "search-file-match": "(פאסט צו טעקע אינהאלט)",
        "search-suggest": "צי האט איר געמיינט: $1",
        "search-rewritten": "רעזולטאטן וועגן $1 ווערן געוויזן. איר קענט אויך זוכן $2.",
-       "search-interwiki-caption": "שוועסטער פראיעקטן",
+       "search-interwiki-caption": "×\90ר×\95×\99סק×\95×\9e×¢×\9f ×¤Ö¿×\95×\9f ×©×\95×\95עס×\98ער ×¤×¨×\90×\99עק×\98×\9f",
        "search-interwiki-default": "רעזולטאטן פון $1:",
        "search-interwiki-more": "(נאך)",
        "search-interwiki-more-results": "נאך רעזולטאטן",
        "prefs-help-prefershttps": "דער פרעפערענץ וועט ארבעטן ביי אײַער נעקסטער ארײַנלאגירונג.",
        "prefswarning-warning": "איר האט געמאכט ענדערונגען צו אײַערע פרעפערענצן וואס זענען נאך נישט אויפגעהיטן.\nאז איר פארלאזט דעם בלאט אן קליקן ״$1״ וועלן אײַערע פרעפערענצן נישט ווערן דערהײַנטיקט.",
        "prefs-tabs-navigation-hint": "טיפ: איר קענט ניצן די רעכטס און לינקס פייל־קלאווישן צו נאוויגירן צווישן די צינגלעך אין דער צינגלעך־ליסטע.",
-       "userrights": "באַניצער רעכטן פֿאַרוואַלטערשאפט",
+       "userrights": "באַניצער רעכטן",
        "userrights-lookup-user": "אויסוויילן א באניצער",
        "userrights-user-editname": "לייגט אריין א באַניצער-נאמען:",
        "editusergroup": "לאדן באַניצער גרופּעס",
        "saveusergroups": "אויפֿהיטן {{GENDER:$1|באַניצער}} גרופעס",
        "userrights-groupsmember": "מיטגליד פון:",
        "userrights-groupsmember-auto": "אויטאמטישער מיטגליד פֿון:",
-       "userrights-groups-help": "איר מעגט ענדערן די גרופעס צו וועמען {{GENDER:$1|דער באַניצער|די באַניצערין}} געהערט:\n*א מאַרקירט קעסטל באַדײַט אָז דער באַניצער איז א מיטגליד אין דער גרופע.\n* אַן אוממאַרקירט קעסטל באַדײַט אָז דער באַניצער איז נישט קיין מיטגליד אין דער גרופע.\n* א * ווײַזט אַז איר קענט נישט אַראפנעמען די גרופע נאָך דעם וואָט איר האט זי צוגעלייגט, אדער פֿאַרקערט.",
+       "userrights-groups-help": "איר מעגט ענדערן די גרופעס צו וועמען {{GENDER:$1|דער באַניצער|די באַניצערין}} געהערט:\n*א מאַרקירט קעסטל באַדײַט אָז דער באַניצער איז א מיטגליד אין דער גרופע.\n* אַן אוממאַרקירט קעסטל באַדײַט אָז דער באַניצער איז נישט קיין מיטגליד אין דער גרופע.\n* א * ווײַזט אַז איר קענט נישט אַראפנעמען די גרופע נאָך דעם וואָט איר האט זי צוגעלייגט, אדער פֿאַרקערט.\n* א 3 ווײַזט אַז איר קענט נאר מאכן שפעטער די אויסלאז צייט פון דער גרופע־מיטגלידשאפֿט; איר קענט זי נישט מאכן פֿריער.",
        "userrights-reason": "אורזאַך:",
        "userrights-no-interwiki": "איר האט נישט קיין ערלויבניש צו רעדאַקטירן באַניצער רעכטן אויף אַנדערע וויקיס.",
        "userrights-nodatabase": "דאַטנבאַזע $1 אדער עקזיסטירט נישט אדער איז נישט ארטיק.",
        "userrights-expiry-existing": "עקזיסטירנדע אויסלאז צײַט: $3, $2",
        "userrights-expiry-othertime": "אַנדער צײט:",
        "userrights-expiry-options": "1 טאג:1 day,1 וואך:1 week,1 Monat:1 month,3 מאנאט:3 months,6 מאנאטן:6 months,1 יאר:1 year",
+       "userrights-invalid-expiry": "די אויסלאז צייט פאר גרופע \"$1\" איז אומגילטיק.",
+       "userrights-expiry-in-past": "די אויסלאז צייט פאר גרופע \"$1\" איז שוין געווען.",
        "userrights-conflict": "קאנפֿליקט פון באניצער־רעכטן ענדערונגען! זייט אזוי גוט רעצענזירן און באשטעטיקן אײַערע ענדערונגען.",
        "group": "גרופע:",
        "group-user": "באניצערס",
        "right-editsemiprotected": "רעדאַגירן בלעטער געשיצט ווי \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "רעדאקטירן אינהאלט־מאדעל פון א בלאט",
        "right-editinterface": "רעדאַקטירן די באַניצער אייבערפֿלאַך",
-       "right-editusercssjs": "רעדאַקטירן אַנדערע באַניצערס CSS און JS טעקעס",
        "right-editusercss": "רעדאַקטירן אַנדערע באַניצערס CSS טעקעס",
        "right-edituserjs": "רעדאַקטירן אַנדערע באַניצערס JS טעקעס",
        "right-editmyusercss": "רעדאקטירע אײַערע אייגענע באניצער CSS טעקעס",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "ווייזן",
+       "rcfilters-activefilters": "אַקטיווע פילטערס",
+       "rcfilters-savedqueries-rename": "ענדערן נאמען",
+       "rcfilters-savedqueries-setdefault": "האלטן ווי גרונט",
+       "rcfilters-savedqueries-remove": "אראפנעמען",
+       "rcfilters-savedqueries-new-name-label": "נאָמען",
+       "rcfilters-savedqueries-cancel-label": "אַנולירן",
        "rcfilters-invalid-filter": "אומגילטיגער פֿילטער",
+       "rcfilters-empty-filter": "קיין אַקטיווע פילטערס. אלע ביישטייערונגען געוויזן.",
        "rcfilters-filterlist-title": "פֿילטערס",
+       "rcfilters-filterlist-whatsthis": "וואס איז דאס?",
        "rcfilters-filterlist-noresults": "קיין פֿילטערס נישט געטראפֿן",
        "rcfilters-filter-bots-label": "באט",
        "rcnotefrom": "פֿאלגנד {{PLURAL:$5|איז די ענדערונג| זענען די ענדערונגען}} זײַט <strong>$3, $4</strong> (ביז <strong>$1</strong>).",
        "rcshowhidecategorization": "$1 בלאט קאטעגאריזירונג",
        "rcshowhidecategorization-show": "ווײַזן",
        "rcshowhidecategorization-hide": "באַהאַלטן",
-       "rclinks": "װײַזן די לעצטע $1 ענדערונגען אין די לעצטע $2 טעג.<br />$3",
+       "rclinks": "װײַזן די לעצטע $1 ענדערונגען אין די לעצטע $2 טעג.",
        "diff": "אונטערשייד",
        "hist": "היסטאריע",
        "hide": "באַהאַלטן",
        "unusedimages": "נישט געניצטע טעקעס",
        "wantedcategories": "געזוכטע קאטעגאריעס",
        "wantedpages": "געזוכטע בלעטער",
+       "wantedpages-summary": "ליסטע פֿון נישט־פֿאראנע בלעטער מיט די מערסטע לינקען צו זיי, אויסשליסנדיק בלעטער וואס האבן נאר ווייטערפֿירונגען צו זיי. פֿאר א ליסטע פון נישט־פֿאראנע בלעטער מיט ווייטערפֿירונגען צו זיי, זעט [[{{#special:BrokenRedirects}}|די ליסטע פון צעבראכענע ווייטערפֿירונגען]].",
        "wantedpages-badtitle": "אומגילטיקער טיטל אין רעזולטאַט: $1",
        "wantedfiles": "געזוכטע טעקעס",
        "wantedfiletext-cat": "די פֿאלגנדע טעקעס ווערן געניצט אבער זיי עקזיסטירן נישט. טעקעס פון פֿרעמדע רעפאזיטאריעס קענען ווערן אריינגערעכנט טראץ זיי עקזיסטירן יא. אזעלכע גרייזן וועלן ווערן <del>אויסגעשריכן </del>. דערצו, בלעטער וואס ניצן אומעקזיסטירנדע טעקעס ווערן אריינגערעכנט אין [[:$1]].",
        "enotif_body_intro_moved": "דער {{SITENAME}} בלאט $1 איז באוועגט געווארן אום $PAGEEDITDATE דורך {{gender:$2|$2}}, זעט $3 פאר דער לויפיקער רעוויזיע.",
        "enotif_body_intro_restored": "דער {{SITENAME}} בלאט $1 איז צוריקגעשטעלט געווארן אום $PAGEEDITDATE דורך {{gender:$2|$2}}, זעט $3 פאר דער לויפיקער רעוויזיע.",
        "enotif_body_intro_changed": "דער {{SITENAME}} בלאט $1 איז געענדערט געווארן אום $PAGEEDITDATE דורך {{gender:$2|$2}}, זעט $3 פאר דער לויפיקער רעוויזיע.",
-       "enotif_lastvisited": "×\96×¢×\98 $1 ×¤Ö¿×\90ַר ×\90×\9c×¢ ×¢× ×\93ער×\95× ×\92×¢×\9f ×\96×\99× ×\98 ×\90ײַער ×\9cעצ×\98×\9f ×\95×\95×\99×\96×\99×\98.",
-       "enotif_lastdiff": "×\96×¢×\98 $1 ×¤×\90ר ×\93ער ×¢× ×\93ער×\95× ×\92.",
+       "enotif_lastvisited": "פֿ×\90ַר ×\90×\9c×¢ ×¢× ×\93ער×\95× ×\92×¢×\9f ×\96×\99× ×\98 ×\90ײַער ×\9cעצ×\98×\9f ×\95×\95×\99×\96×\99×\98, ×\96×¢×\98 $1",
+       "enotif_lastdiff": "צ×\95 ×\91×\90ק×\95ק×\9f ×\93×\99 ×¢× ×\93ער×\95× ×\92, ×\96×¢×\98 $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\nאייער פֿריינטליכע  {{SITENAME}} מעלדונגען סיסטעם\n\n--\nצו ענדערן אייער ע־פאסט נאטיפיקאציע שטעלונגען, באזוכט\n{{canonicalurl:{{#special:Preferences}}}}\n\nצו ענדערן אייער אויפֿפאסונג ליסטע, באזוכט\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nכדי אויסמעקן דעם בלאט פון אײַער אויפֿפאַסונג ליסטע, באַזוכט\n$UNWATCHURL\n\nפאר מער הילף:\n$HELPPAGE",
        "created": "געשאַפֿן",
        "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": "צוריקגעדרייט רעדאַקטירונגען פֿון {{GENDER:$3|$1}};\nגעענדערט צו דער לעצטע ווערסיע פֿון {{GENDER:$4|$2}}.",
        "sessionfailure-title": "זיצונג דורכפֿאַל",
        "sessionfailure": "ווײַזט אויס אז ס'איז דא א פראבלעם מיט אייער ארײַנלאגירן; די פעולה איז געווארן אנולירט צו פֿאַרהיטן קעגן פֿאַרשטעלן אייער סעסיע. זייט אזוי גוט און גייט צוריק צום פֿריערדיקן בלאט, און פרובירט נאכאַמאָל.",
        "changecontentmodel": "ענדערן אינהאלט־מאדעל פון א בלאט",
        "undeleteviewlink": "באַקוקן",
        "undeleteinvert": "איבערקערן דעם אויסקלויב",
        "undeletecomment": "אורזאַך:",
-       "undeletedrevisions": "{{PLURAL:$1|1 רעוויזיע|$1 רעוויזיעס}} צוריקגעשטעלט",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 רעוויזיע|$1 רעוויזיעס}} און  {{PLURAL:$2|1 טעקע|$2 טעקעס}} צוריקגעשטעלט",
-       "undeletedfiles": "{{PLURAL:$1|1 טעקע|$1 טעקעס}} צוריקגעשטעלט",
        "cannotundelete": "טייל אדער גארע צוריקשטעלונג איז דורכגעפאלן: $1",
        "undeletedpage": "'''דער בלאט $1 איז געווארן צוריקגעשטעלט.'''\n\nזעט דעם [[Special:Log/delete| אויסמעקן לאג]] פֿאר א ליסטע פון די לעצטע אויסגעמעקטע און צוריקגעשטעלטע בלעטער.",
        "undelete-header": "זעט [[Special:Log/delete|דעם אויסמעקונג זשורנאַל]] פֿאַר בלעטער וואָס זענען לעצטנס געווארן אויסגעמעקט recently deleted pages.",
        "sp-contributions-uploads": "אַרויפֿלאָדונגען",
        "sp-contributions-logs": "לאגביכער",
        "sp-contributions-talk": "שמועס",
-       "sp-contributions-userrights": "באַניצער רעכטן פֿאַרוואַלטונג",
+       "sp-contributions-userrights": "{{GENDER:$1|באַניצער|באַניצערין}} רעכטן פֿאַרוואַלטונג",
        "sp-contributions-blocked-notice": "דער באַניצער איז אַצינד בלאקירט. פֿאלגנד איז די לעצטע אַקציע אינעם פֿאַרשפאַרונג לאגבוך:",
        "sp-contributions-blocked-notice-anon": "דער IP אַדרעס איז דערווייַל פֿאַרשפאַרט.\nדי לעצטע בלאָקירן לאג אַקציע איז צוגעשטעלט אונטן:",
        "sp-contributions-search": "זוכן בײַשטײַערונגען",
        "anonymous": "{{PLURAL:$1|אַנאנימער באַניצער| אַנאנימע באַניצערס}} פֿון {{SITENAME}}",
        "siteuser": "באַניצער {{SITENAME}} $1",
        "anonuser": "{{SITENAME}} אַנאנימער באַניצער $1",
-       "lastmodifiedatby": "×\93×\99 ×\9cעצ×\98×¢ ×¢× ×\93ער×\95× ×\92 ×¤Ö¿×\95×\9f ×\93×¢×\9d ×\91×\9c×\90Ö·×\98 ×\90×\99×\96 ×\92×¢×\95×\95×¢×\9f $2, $1 דורך $3.",
+       "lastmodifiedatby": "×\93ער ×\91×\9c×\90Ö·×\98 ×\90×\99×\96 ×\92×¢×\95×\95×\90ר×\9f ×\92×¢×¢× ×\93ער×\98 ×\9cעצ×\98 $2, $1 דורך $3.",
        "othercontribs": "באזירט אויף ארבעט פון $1.",
        "others": "אנדערע",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1| באַניצער}}| באַניצערס}} $1",
        "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-restore": "$1 {{GENDER:$2|האט צוריקגעשטעלט }} בלאט $3 ($4)",
        "logentry-delete-event": "$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3",
        "logentry-rights-autopromote": "$1 אויטאמאטיש  {{GENDER:$2|פראמאווירט}} פון $4 צו $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|האט ארויפגעלאדן}} $3",
        "rightsnone": "(גארנישט)",
-       "revdelete-summary": "רעדאקטירונג קיצור",
        "feedback-adding": "צולייגן פֿידבעק צו בלאַט...",
        "feedback-bugcheck": "געוואלדיק! אבער זייט בודק אז עס איז נישט איינער פון די [$1 באוואוסטע באגן].",
        "feedback-bugnew": "כ'האב בודק געווען. רעפארטירט א נייעם באג.",
        "special-characters-title-emdash": "עם טירע",
        "special-characters-title-minus": "מינוס",
        "mw-widgets-titleinput-description-new-page": "דער בלאט עקזיסטירט נאך נישט",
+       "date-range-from": "פֿון דאטע",
+       "date-range-to": "ביז דאטע:",
        "log-action-filter-upload": "טיפ ארויפֿלאד:",
        "log-action-filter-all": "אַלע",
        "log-action-filter-delete-delete": "אויסמעקן בלאט",
index bd8577c..9cab67c 100644 (file)
        "redirectedfrom": "(Àtúnjúwe láti $1)",
        "redirectpagesub": "Ojúewé àtúnjúwe",
        "redirectto": "Àtúnjúwe sí:",
-       "lastmodifiedat": "Àtunṣe ojúewé yi gbẹ̀yìn wáyé ni ago $2, ọjọ́ọdún $1.",
+       "lastmodifiedat": "Àtunṣe ojúewé yi gbẹ̀yìn wáyé ni ọjọ́ $1, ni ago $2.",
        "viewcount": "A ti wo ojúewé yi ni {{PLURAL:$1|ẹ̀kan péré|iye ìgbà $1}}.",
        "protectedpage": "Ojúewé oníàbò",
        "jumpto": "Lọ sí:",
        "cannotdelete": "Ojúewé tàbí fáìlì \"$1\" kò ṣe é parẹ́.\nOníṣe mìíràn le ti paárẹ́.",
        "cannotdelete-title": "Kò le pa ojúewè \"$1\" rẹ́",
        "delete-hook-aborted": "Hook ti ṣe ìdádúró ìparẹ́.\nKò ṣe àlàyé kankan.",
-       "badtitle": "Àkọ́lé búrurú",
+       "badtitle": "Àkọ́lé búburú",
        "badtitletext": "Àkọlé ojúewé tí ẹ bèrè fún kò ní ìbáramu, jẹ́ òfo, tàbí áṣìṣe wà nínú ìjápọ̀ àkọlé láàrin èdè tàbí láàrin wiki.\nÓ ṣe é ṣe kó jẹ́pé ó ní ìkan tàbí ọ̀pọ̀ àmi-lẹ́tà tí kò ṣe é lò nínú àkọlé.",
        "perfcached": "Ìwònyí jẹ́ dátà láti inú cache nítoríẹ̀ ó le mọ́ jẹ̀ẹ́ tuntun. Ó pọ̀jùlọ {{PLURAL:$1|èsì kan|èsì $1}} wà nínú cache.",
        "perfcachedts": "Ìwònyí jẹ́ dátà láti inú cache, ọjọ́ tí a ṣe àtúnṣe rẹ̀ gbẹ̀yìn ni $1. Ó pọ̀jùlọ {{PLURAL:$4|èsì kan|èsì $4}} wà nínú cache.",
        "externaldberror": "Bóyá àsìṣe ìfidájú ibùdó dátà ló ṣẹlẹ̀ tàbí ẹ kò jẹ́ gbígbà ní ààyè láti sọ àpamọ́ òde yín di ọ̀tun.",
        "login": "Ìjáwọlé",
        "nav-login-createaccount": "Ìwọlé / Ìforúkọ sílẹ̀",
-       "userlogin": "Ìwọlé / ìforúkọ sílẹ̀",
-       "userloginnocreate": "Ìjáwọlé",
        "logout": "Ìjáde",
        "userlogout": "Ìjáde",
        "notloggedin": "Ẹ kò tí w'ọlé",
        "userlogin-noaccount": "Ṣé ẹ kò ní àkópamọ́?",
        "userlogin-joinproject": "Ẹ darapọ̀mọ́ {{SITENAME}}",
-       "nologin": "Ṣé ẹ fẹ́ wọlé? '''$1'''.",
-       "nologinlink": "Ìforúkọsílẹ̀",
        "createaccount": "Ẹ fi orúkọ sílẹ̀",
-       "gotaccount": "Ṣé ẹ ti ní àpamọ́ tẹ́lẹ̀? '''$1'''.",
-       "gotaccountlink": "Ẹ w'ọlé",
-       "userlogin-resetlink": "À bí ẹ gbàgbé ìwọlé yín?",
        "userlogin-resetpassword-link": "Ṣé ẹ ti gbàgbé ọ̀rọ̀ìpamọ́ yín?",
        "userlogin-helplink2": "Ìrànlọ́wọ́ láti wọlé",
        "userlogin-loggedin": "Ẹ pilẹ̀ ti jáwọlé bíi {{GENDER:$1|$1}}.\nẸ lo fọ́ọ̀mù ìsàlẹ̀ látí jáwọlé gẹ́gẹ́ bíi oníṣe míràn.",
        "createacct-email-ph": "Ẹ kọ àdírẹ̀sì email yín",
        "createaccountmail": "Lo ọ̀rọ̀ìpamọ́ àrìnnàkò ìgbàdíẹ̀ ná, kí o sì fi ránsẹ́ sí àdírẹ̀sì email tó wà nísàlẹ̀",
        "createacct-realname": "Orúkọ yín gangan (kò pọndandan)",
-       "createaccountreason": "Ìdíẹ̀:",
        "createacct-reason": "Ìdí",
        "createacct-reason-ph": "Ìdí tí ẹ ṣe fẹ́ dá àkópamọ́ míràn",
        "createacct-submit": "Ìdá àkópamọ́ yín",
        "anonpreviewwarning": "''Ẹ kò tíì wọlé. Àdírẹ́ẹ̀sì IP yín yíò jẹ́ kíkọsílẹ̀ sínú ìwé ìtàn àtúnṣe ojúewé yìí tí ẹ bá ṣàmúpamọ́ rẹ̀.''",
        "missingsummary": "'''Ìránlétí:''' Ẹ kò pèsè àkótán fún àtúnṣe yìí\nTí ẹ bá tẹ Ìmúpamọ́ lẹ́ẹ̀kansi, àtúnṣe yín yíò jẹ̀ mímúpamọ́ láìní kankan.",
        "missingcommenttext": "Ẹjọ̀wọ́ ẹ ṣe áríwí ní ìsàlẹ̀",
-       "missingcommentheader": "'''Ìránlétí:''' Ẹ kò pèsè àkọlé/oríọ̀rọ̀ kankan fún àríwí yìí.\nTí ẹ bá tẹ \"{{int:savearticle}}\" lẹ́ẹ̀kansi, àtúnṣe yín yíò jẹ́ mímúpamọ́ láìní kankan.",
+       "missingcommentheader": "'''Ìránlétí:''' Ẹ kò pèsè àkọlé/oríọ̀rọ̀ kankan fún àríwí yìí.\nTí ẹ bá tẹ \"$1\" lẹ́ẹ̀kansi, àtúnṣe yín yíò jẹ́ mímúpamọ́ láìní kankan.",
        "summary-preview": "Àkọ́yẹ̀wò àkótán:",
        "subject-preview": "Àyẹ̀wò àkọlé",
        "blockedtitle": "Ìdínà oníṣe",
        "editingsection": "Àtúnṣe sí $1 (abala)",
        "editingcomment": "Àtúnṣe sí $1 (abala tuntun)",
        "editconflict": "Ìtakora àtúnṣe: $1",
-       "explainconflict": "Ẹlòmíràn ti ṣàyípadà ojúewé yìí látìgbà tí ẹ ti bèrẹ̀ àtúnṣẹ rẹ̀.\nÀlà ìkọ̀rọ̀ òkè lóní ìkọ̀rọ̀ ojúewé bó ṣe wà lọ́wọ́lọ́wọ́ báyìí.\nÀwọn àtúnṣe yín ni wọ́n hàn yìí nínú àlà ìkọ̀rọ̀ ìsàlẹ̀.\nẸ gbọdọ̀ kó àwọn àtúnṣe yín papọ̀ sínú ìkọ̀rọ̀ tó wà lọ́wọ́lọ́wọ́ báyìí.\nÌkọ̀rọ̀ inú àlà ìkọ̀rọ̀ òkè '''nìkan''' ni yíò jẹ́ mímúpamọ́ tí ẹ bá tẹ \"{{int:savearticle}}\".",
+       "explainconflict": "Ẹlòmíràn ti ṣàyípadà ojúewé yìí látìgbà tí ẹ ti bèrẹ̀ àtúnṣẹ rẹ̀.\nÀlà ìkọ̀rọ̀ òkè lóní ìkọ̀rọ̀ ojúewé bó ṣe wà lọ́wọ́lọ́wọ́ báyìí.\nÀwọn àtúnṣe yín ni wọ́n hàn yìí nínú àlà ìkọ̀rọ̀ ìsàlẹ̀.\nẸ gbọdọ̀ kó àwọn àtúnṣe yín papọ̀ sínú ìkọ̀rọ̀ tó wà lọ́wọ́lọ́wọ́ báyìí.\nÌkọ̀rọ̀ inú àlà ìkọ̀rọ̀ òkè '''nìkan''' ni yíò jẹ́ mímúpamọ́ tí ẹ bá tẹ \"$1\".",
        "yourtext": "Ìkọ̀ yín",
        "storedversion": "Àtúnyẹ̀wò tí à múpamọ́",
        "nonunicodebrowser": "'''Ìkìlọ̀: Awòtakùn yín kò ṣe é lò fún unicode.'''\nBáyìí ná ẹ le ṣàtúnṣe àwọn ojúewé láì ṣéwu: áwọn àmììkọ̀rọ̀ àìjẹ́-ASCII yíò hàn nínú àpótí àtúnṣe bíi àmíọ̀rọ̀ onímẹ́rìndínlọ́gún.",
        "saveprefs": "Ìmúpamọ́",
        "restoreprefs": "Ìdápadà gbogbo áwọn ìtò àtìbẹ̀rẹ̀ (nínú gbogbo àwọn abala)",
        "prefs-editing": "Àtúnṣe ṣíṣẹ",
-       "rows": "Àwọn ìtẹ̀lé gbọlọjọ:",
-       "columns": "Àwọn ìtẹ̀lé gogoro:",
        "searchresultshead": "Àwárí",
        "stub-threshold": "Àlà fún idárú <a href=\"#\" class=\"stub\">àjàpọ̀ ẹ̀kúnrẹ́rẹ́</a> (bytes):",
        "stub-threshold-disabled": "Dídálẹ́kun",
        "right-protect": "Ìyípadà àwọn ìpele àbò àti àtúnṣe àwọn ojúewé aláàbò",
        "right-editprotected": "Àtúnṣe àwọn ojúewé aláàbò (láìsí àbò àjámọ́ra)",
        "right-editinterface": "Àtúnṣe ìfojúkojú oníṣe",
-       "right-editusercssjs": "Àtúnṣe àwọn fáìlì CSS àti JS ti àwọn oníṣe mìíràn",
        "right-editusercss": "Àtúnṣe àwọn fáìlì CSS ti àwọn oníṣe mìíràn",
        "right-edituserjs": "Àtúnṣe àwọn fáìlì JS ti àwọn oníṣe mìíràn",
        "right-rollback": "Kíákíá yí àwọn àtúnṣe oníṣe tó ṣàtúnṣe ojúewé kan pàtó gbẹ̀yìn sẹ́yìn",
        "rcshowhidemine": "$1 àwọn àtúnṣe mi",
        "rcshowhidemine-show": "Fi hàn",
        "rcshowhidemine-hide": "Ìbòmọ́lẹ̀",
-       "rclinks": "Ṣ'àfihàn àtúnṣe $1 tó kẹ̀yìn ní ọjọ́ $2 sẹ́yìn<br />$3",
+       "rclinks": "Ṣ'àfihàn àtúnṣe $1 tó kẹ̀yìn ní ọjọ́ $2 sẹ́yìn",
        "diff": "ìyàtọ̀",
        "hist": "ìtàn",
        "hide": "Ìbòmọ́lẹ̀",
        "undeleteviewlink": "wo",
        "undeleteinvert": "Pàṣípààrọ̀ àsàyàn",
        "undeletecomment": "Ìdíẹ̀:",
-       "undeletedrevisions": "{{PLURAL:$1|Àtúnyẹ̀wò 1|Àwọn àtúnyẹ̀wò $1}} ti jẹ́ dídápadà",
-       "undeletedrevisions-files": "{{PLURAL:$1|Àtúnyẹ̀wò 1|Àwọn àtúnyẹ̀wò $1}} àti {{PLURAL:$2|fáìlì 1|àwọn fáìlì $2}} ti jẹ́ dídápadà",
-       "undeletedfiles": "{{PLURAL:$1|Fáílì 1|Àwọn fáìlì $1}} ti jẹ́ dídápadà",
        "cannotundelete": "Ìdápadà ìparẹ́ kùnà:\n$1",
        "undeletedpage": "'''$1 ti jẹ́ dídápadà'''\n\nẸ wo [[Special:Log/delete|àkọọ́lẹ̀ ìparẹ́]] fún àkọpamọ́ àwọn ìparẹ́ àti ìdápadà àìpẹ́.",
        "undelete-header": "Ẹ wo [[Special:Log/delete|àkọọ́lẹ̀ ìparẹ́]] fún àwọn ojúewé píparẹ́ láìpẹ́",
        "logentry-rights-autopromote": "$1 jẹ́ {{GENDER:$2|gbígbénípòga}} nífúnraẹni láti $4 sí $5",
        "logentry-upload-upload": "Ó dàfikún",
        "rightsnone": "(kòsí)",
-       "revdelete-summary": "àkótán àtúnṣe",
        "feedback-adding": "Ìfikún ìdáhùn sí ojúewé...",
        "feedback-bugcheck": "Ó dáa bẹ́ẹ̀! Ẹ rí pé kò í ṣe ìkan nínú [$1 àwọn ìsòrò tí a ti mọ̀ tẹ́lẹ̀].",
        "feedback-bugnew": "Mo ti yẹ́wò. Fi ìsòrò sùn",
        "feedback-thanks": "Adúpẹ́! Ìdáhùn yín ti jẹ́ fífikún sí ojúewé \"[$2 $1]\".",
        "searchsuggest-search": "Ṣàwárí",
        "searchsuggest-containing": "tó ní...",
-       "api-error-badaccess-groups": "Ẹ kò ní àṣẹ láti ru fáìlì wọlé sí orí wiki yìí.",
        "api-error-badtoken": "Àsìṣe inú: Ìdáramọ̀ búburú.",
-       "api-error-copyuploaddisabled": "Ìrùsókè pẹ̀lú URL jẹ́ dídálẹ́kun lórí ẹ̀rọ-ìpèsè yìí.",
-       "api-error-duplicate": "{{PLURAL:$1|Fáìlì míràn|Àwọn fáìlì míràn}} kan tilẹ̀ wà lórí ibiìtàkùn pẹ̀lú àkóónú kannáà.",
-       "api-error-duplicate-archive": "{{PLURAL:$1|Fáìlì míràn|Àwọn fáìlì míràn}} kan tilẹ̀ wà lórí ibiìtàkùn pẹ̀lú àkóónú kannáà, sùgbọ́n {{PLURAL:$1|ó|wọ́n}} ti jẹ́ píparẹ́.",
-       "api-error-empty-file": "Fáílì tí ẹ fisílẹ̀ jẹ́ òfo.",
        "api-error-emptypage": "Ẹ kò ní àyè láti dá ojúewé tuntun tó jẹ́ òfo.",
-       "api-error-fetchfileerror": "Àsìṣe inú: Kò le mú fáìlì ná jáde nítorí àsìṣe.",
-       "api-error-fileexists-forbidden": "Fáìlì kan wà pẹ̀lú orúkọ \"$1\", kò ṣe é kọlélórí.",
-       "api-error-fileexists-shared-forbidden": "Fáìlì kan wà pẹ̀lú orúkọ \"$1\" nínú ibi àkójọsí fáìlì, kò ṣe é kọlélórí.",
-       "api-error-file-too-large": "Fáílì tí ẹ fisílẹ̀ jẹ́ tí tóbijù.",
-       "api-error-filename-tooshort": "Orúkọ fáílì kéréjú bó ṣe yẹ lọ.",
-       "api-error-filetype-banned": "Irú fáílì yìí ti jẹ́ dídí lọ́nà.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|kíì ṣe|kìí ṣe àwọn}} irú fáìlì tí à gbàláyè. {{PLURAL:$3|Irú fáìlì|Àwọn irú fáìlì}} tí à gbàláyè ni $2.",
-       "api-error-filetype-missing": "Orúkọ fáìlì kò ní ìfàgùn.",
-       "api-error-hookaborted": "Ìtúndáṣe tí ẹ fẹ́ ṣe ti jẹ́ dídálẹ́kun látọwọ́ ìfàgùn.",
-       "api-error-http": "Àsìṣe inú: Ìfarakan ẹ̀rọ-ìpèsè kò ṣe é ṣe.",
-       "api-error-illegal-filename": "Orúkọ fáílì yìí kò jẹ́ gbígbàláàyè.",
-       "api-error-internal-error": "Àsìṣe inú: Wàhálà wáyé láti ṣe ìgbéṣe ìrùsókè yín lórí wiki yìí.",
-       "api-error-invalid-file-key": "Àsìṣe inú: Fáìlì kò sí nínú ibi ìfipamọ́ ìgbàdíẹ̀.",
-       "api-error-missingparam": "Àsìṣe inú: Kò sí pàrámítà tó tọrọ.",
-       "api-error-missingresult": "Àsìṣe inú: Kò le sọ bóyá àwòkọ yọrí sí rere.",
-       "api-error-mustbeloggedin": "Ẹ gbọ́dọ̀ wọlé láti ru fáìlì sókè.",
-       "api-error-mustbeposted": "Àsìṣe inú: Ìtọrọ bèèrè fún HTTP POST.",
-       "api-error-noimageinfo": "Ìrùsòkè jásí rere, sùgbọ́n ẹ̀rọ-ìpèsè kò sọ ohùn kankan nípa fáìlì ọ̀hún.",
-       "api-error-nomodule": "Àsìṣe inú: Ẹyọ ìrùsókè kankan kò sí.",
-       "api-error-ok-but-empty": "Àsìṣe inú: Kò sí ìdáhùn látọwọ́ ẹ̀rọ-ìpèsè.",
-       "api-error-overwrite": "Ìkọlélórí fáìlì tó wà kò jẹ́ gbígbà ní àyè.",
-       "api-error-stashfailed": "Àsìṣe inú: Ẹ̀rọ-ìpèsè kùnà láti fi fáìlì ìgbàdíẹ̀ pamọ́.",
        "api-error-publishfailed": "Àṣìṣe inú: Ẹ̀rọ-ìpèsè kùnà láti tẹ fáìlì ìgbàdíẹ̀ jáde.",
-       "api-error-timeout": "Ẹ̀rọ-ìpèsè kò dáhùn ní àrin àsìkò tó yẹ.",
-       "api-error-unclassified": "Àsìṣe àìdámọ̀ kan ti ṣẹlẹ̀.",
-       "api-error-unknown-code": "Àsìṣe aláìlójúùtú: \"$1\".",
-       "api-error-unknown-error": "Àsìṣe inú: Àsìṣe ṣẹlẹ̀ láti ṣe ìrùsókè fáìlì yín.",
+       "api-error-stashfailed": "Àsìṣe inú: Ẹ̀rọ-ìpèsè kùnà láti fi fáìlì ìgbàdíẹ̀ pamọ́.",
        "api-error-unknown-warning": "Ìkìlọ̀ àìmọ̀: \"$1\".",
        "api-error-unknownerror": "Àsìṣe aláìlójúùtú: \"$1\".",
-       "api-error-uploaddisabled": "Ìdálẹ́kun ìrùsókè lórí wiki yìí.",
-       "api-error-verification-error": "Fáìlì náà le ti bàjẹ́, tàbí ó ní ìfàgún tí kò yẹ.",
        "duration-seconds": "{{PLURAL:$1|ìṣẹ́júkejì|ìṣẹ́júkejì}} $1",
        "duration-minutes": "{{PLURAL:$1|ìṣẹ́jú|ìṣẹ́jú}} $1",
        "duration-hours": "{{PLURAL:$1|wákàtí|wákàtí}} $1",
index f57c71b..2774757 100644 (file)
        "talk": "討論",
        "views": "去睇",
        "toolbox": "架撐",
+       "tool-link-userrights": "改{{GENDER:$1|用戶}}組",
+       "tool-link-userrights-readonly": "睇{{GENDER:$1|用戶}}組",
        "tool-link-emailuser": "電郵畀呢個{{GENDER:$1|用戶}}",
        "userpage": "去睇用戶頁",
        "projectpage": "去睇專題頁",
        "virus-unknownscanner": "未知嘅防病毒:",
        "logouttext": "<strong>你而家已經簽退咗。</strong>\n\n但係留意某啲頁面可能會繼續話你未登入,除非等你清除瀏覽器嘅快取儲存。",
        "cannotlogoutnow-title": "而家簽走唔到",
+       "cannotlogoutnow-text": "用緊$1嗰陣唔可以簽走。",
        "welcomeuser": "歡迎,$1!",
        "welcomecreation-msg": "你個戶口已經起好。\n唔好唔記得去改改你嘅{{SITENAME}}[[Special:Preferences|喜好設定]]喎。",
        "yourname": "用戶名:",
        "cannotlogin-title": "簽到唔到",
        "cannotlogin-text": "冇可能簽到",
        "cannotloginnow-title": "而家簽到唔到",
+       "cannotloginnow-text": "用緊$1嗰陣唔可以簽到。",
        "cannotcreateaccount-title": "開唔到新戶口",
        "cannotcreateaccount-text": "呢個維基唔准直接開戶",
        "yourdomainname": "你嘅網域:",
        "login": "登入",
        "login-security": "確認你嘅身份",
        "nav-login-createaccount": "登入/開新戶口",
-       "userlogin": "登入/開新戶口",
-       "userloginnocreate": "登入",
        "logout": "登出",
        "userlogout": "登出",
        "notloggedin": "未登入",
        "userlogin-noaccount": "重未有戶口?",
        "userlogin-joinproject": "入{{SITENAME}}",
-       "nologin": "重未有戶口? $1。",
-       "nologinlink": "開個新戶口",
        "createaccount": "開戶口",
-       "gotaccount": "已經有戶口? $1。",
-       "gotaccountlink": "登入",
-       "userlogin-resetlink": "唔記得簽到資料?",
        "userlogin-resetpassword-link": "唔記得密碼?",
        "userlogin-helplink2": "幫我簽到",
        "userlogin-loggedin": "您目前用{{GENDER:$1|$1}}身份簽到,\n請用下面表格用另一身份簽到。",
        "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-benefit-body1": "{{PLURAL:$1|次編輯|次編輯}}",
        "createacct-benefit-body2": "{{PLURAL:$1|版|版}}",
        "createacct-benefit-body3": "最近{{PLURAL:$1|貢獻者|貢獻者}}",
-       "badretype": "ä½ å\85¥å\98\85å¯\86碼å\94\94ä¸\80è\87´。",
+       "badretype": "ä½ å\85¥å\98\85å¯\86碼å\89\8då¾\8cä¸\8dä¸\80。",
        "usernameinprogress": "呢個名嘅戶口已經開緊。\n請等等。",
        "userexists": "你入嘅用戶名已經有人用咗。\n唔該揀過個名啦。",
        "loginerror": "登入錯誤",
        "nocookiesnew": "已經開咗戶口,但你未登入。 {{SITENAME}} 要用 cookies 嚟登入。你已經熄咗佢。請你開咗再試。",
        "nocookieslogin": "{{SITENAME}} 登入要開 cookies。熄咗佢。請你開咗再試。",
        "nocookiesfornew": "呢位用戶嘅戶開未開,我哋唔能夠確認佢嘅來源。\n請肯定你已經開咗 cookies,重新載入再試。",
+       "createacct-loginerror": "開戶成功但自動簽到失敗。煩請[[Special:UserLogin|手動簽到]]。",
        "noname": "你未指定一個有效嘅用戶名。",
        "loginsuccesstitle": "簽到成功",
        "loginsuccess": "'''「$1」登入咗{{SITENAME}}。'''",
        "wrongpasswordempty": "你都未入密碼,唔該再試多次啦。",
        "passwordtooshort": "你嘅密碼最少要有$1個半形字元。",
        "passwordtoolong": "密碼唔可以長過{{PLURAL:$1|1個字元|$1個字元}}。",
+       "passwordtoopopular": "呢個密碼太常見,唔俾用。唔該揀個獨特啲嘅密碼。",
        "password-name-match": "你嘅密碼一定要同你嘅用戶名唔一樣。",
        "password-login-forbidden": "呢個用戶名同密碼嘅利用係被禁止嘅。",
        "mailmypassword": "重設密碼",
        "changepassword-throttled": "你已經試咗太多次簽到動作。\n請等$1再試過。",
        "botpasswords": "機械人密碼",
        "botpasswords-disabled": "唔俾用機械人密碼。",
+       "botpasswords-existing": "而家已經有嘅機械人密碼",
+       "botpasswords-createnew": "整一個新嘅機械人密碼",
        "botpasswords-label-create": "創造",
        "botpasswords-label-update": "上載",
        "botpasswords-label-cancel": "取消",
        "botpasswords-label-delete": "刪除",
        "botpasswords-label-resetpassword": "改過個個密碼",
+       "botpasswords-created-title": "生成咗機械人密碼",
+       "botpasswords-updated-title": "改咗機械人密碿",
+       "botpasswords-deleted-title": "鏟咗機械人密碼",
+       "botpasswords-restriction-failed": "機械人密碼限制令到呢次簽到失敗。",
+       "botpasswords-invalid-name": "呢個用戶名無機械人密碼分隔字(「$1」)",
        "resetpass_forbidden": "唔可以更改密碼",
+       "resetpass_forbidden-reason": "改唔到密碼:$1",
        "resetpass-no-info": "你一定要登入咗去直接入來呢一版。",
        "resetpass-submit-loggedin": "改密碼",
        "resetpass-submit-cancel": "取消",
        "preview": "預覽",
        "showpreview": "顯示預覽",
        "showdiff": "顯示差異",
-       "blankarticle": "<strong>警告</strong>:閣下開緊爾版係空白嘅,撳多次「{{int:savearticle}}」就會開一個乜都無嘅版(可能被視為破壞)。",
+       "blankarticle": "<strong>警告</strong>:閣下開緊爾版係空白嘅,撳多次「$1」就會開一個乜都無嘅版(可能被視為破壞)。",
        "anoneditwarning": "'''警告:'''閣下重未登入。閣下嘅 IP 地址會喺爾一版嘅修訂歷史裡邊記錄落嚟。",
        "anonpreviewwarning": "''你重未登入,你嘅 IP 位址會喺呢個頁面嘅修訂歷史中記錄落嚟。''",
-       "missingsummary": "'''提醒:''' 你未提供編輯摘要。如果你再撳多一下「{{int:savearticle}}」嘅話,咁你儲存嘅編輯就會無摘要。",
-       "selfredirect": "<strong>警告:</strong> 你個跳轉彈返去自己度。\n你可能設錯咗跳轉目標,或者改錯咗版。\n如果你再撳多「{{int:savearticle}}」一下,就會照幫你開呢個跳轉。",
+       "missingsummary": "'''提醒:''' 你未提供編輯摘要。如果你再撳多一下「$1」嘅話,咁你儲存嘅編輯就會無摘要。",
+       "selfredirect": "<strong>警告:</strong> 你個跳轉彈返去自己度。\n你可能設錯咗跳轉目標,或者改錯咗版。\n如果你再撳多「$1」一下,就會照幫你開呢個跳轉。",
        "missingcommenttext": "請輸入一個註解。",
-       "missingcommentheader": "<strong>提醒:</strong>你響呢個註解度並無提供一個主題/標題。如果你再撳一次「{{int:savearticle}}」,你嘅編輯就會無題。",
-       "summary-preview": "摘要預覽:",
-       "subject-preview": "題預覽:",
+       "missingcommentheader": "<strong>提醒:</strong>你響呢個註解度並無提供一個主題/標題。如果你再撳一次「$1」,你嘅編輯就會無題。",
+       "summary-preview": "編輯摘要預覽:",
+       "subject-preview": "題預覽:",
        "previewerrortext": "預覽你嘅修改嗰陣出錯。",
        "blockedtitle": "用戶已經封鎖",
        "blockedtext": "你嘅用戶名或者 IP 位址已經被 $1 封咗。\n\n呢次封鎖係由$1所封嘅。當中嘅原因係''$2''。\n\n* 呢次封鎖嘅開始時間係:$8\n* 呢次封鎖嘅到期時間係:$6\n* 對於被封鎖者:$7\n\n你可以聯絡 $1 或者其他嘅[[{{MediaWiki:Grouppage-sysop}}|管理員]],討論呢次封鎖。\n除非你已經響你嘅[[Special:Preferences|戶口喜好設定]]入面設定咗有效嘅電郵地址,否則你係唔可以用「電郵呢個用戶」嘅功能。當設定咗一個有效嘅電郵地址之後,呢個功能係唔會封鎖嘅。\n\n你現時嘅 IP 位址係 $3 ,而個封鎖 ID 係 #$5。 請你喺你嘅查詢都註明以上封鎖嘅資料。",
        "editingsection": "而家喺度編輯$1 (小節)",
        "editingcomment": "而家喺度編輯$1 (新小節)",
        "editconflict": "由於編輯衝突,{{GENDER:|你|妳|你}}喺$1嘅修改記唔低。{{GENDER:|你|妳|你}}想唔想人手解決呢個衝突?",
-       "explainconflict": "有其他人喺你開始編輯之後已經更改呢一頁。\n喺上面嗰個空間而家現存嘅頁面文字。\n你嘅更改會喺下面嘅文字空間顯示。\n你需要合併你嘅更改到原有嘅文字。\n喺你撳「{{int:savearticle}}」之後,'''只有'''喺上面嘅文字區會被儲存。",
+       "explainconflict": "有其他人喺你開始編輯之後已經更改呢一頁。\n喺上面嗰個空間而家現存嘅頁面文字。\n你嘅更改會喺下面嘅文字空間顯示。\n你需要合併你嘅更改到原有嘅文字。\n喺你撳「$1」之後,'''只有'''喺上面嘅文字區會被儲存。",
        "yourtext": "你嘅文字",
        "storedversion": "已經儲存咗嘅修訂",
        "nonunicodebrowser": "'''警告:你嘅瀏覽器係唔係用緊 Unicode 。'''而家暫時有個解決方法,方便你可以安全咁編輯呢版:唔係 ASCII 嘅字元會喺編輯框裏面用十六進位編碼顯示。",
        "prefs-help-prefershttps": "呢項喜好設定會喺你下次簽到先至開始生效。",
        "prefswarning-warning": "你改嘅喜好設定改動重未記低。\n如果你未撳「$1」就走咗,你嘅喜好設定唔會有更新。",
        "prefs-tabs-navigation-hint": "貼士:可以用鍵盤嘅←或→掣睇一覽內嘅分頁",
-       "userrights": "用戶權限管理",
-       "userrights-lookup-user": "管理用戶組",
+       "userrights": "用戶嘅權限",
+       "userrights-lookup-user": "揀一個用戶",
        "userrights-user-editname": "輸入一個用戶名:",
        "editusergroup": "編輯用戶組",
        "editinguser": "改緊<strong>[[User:$1|$1]]</strong>嘅用戶權限 $2",
        "userrights-editusergroup": "編輯用戶組",
-       "saveusergroups": "儲存用戶組",
+       "saveusergroups": "儲存{{GENDER:$1|用戶}}組",
        "userrights-groupsmember": "屬於:",
        "userrights-groupsmember-auto": "固有屬於:",
-       "userrights-groups-help": "你可以改呢位用戶所屬嘅組:\n* 剔咗嘅盒代表個用戶係屬於嗰組。\n* 未剔嘅盒代表個用戶唔係屬於嗰組。\n* 一個 * 表示你加入咗佢之後唔可以拎走,反之亦然。",
+       "userrights-groups-help": "你可以改呢位用戶所屬嘅組:\n* 剔咗嘅盒代表個用戶係屬於嗰組。\n* 未剔嘅盒代表個用戶唔係屬於嗰組。\n* 一個 * 表示你加入咗佢之後唔可以拎走,反之亦然。\n* 一個 # 表示你只可以推遲嗰組嘅失效日期,唔可以提早。",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "你並無權限去編輯響其它wiki嘅用戶權限。",
        "userrights-nodatabase": "資料庫$1唔存在或者唔係本地嘅。",
        "userrights-changeable-col": "你可以改嘅組",
        "userrights-unchangeable-col": "你唔可以改嘅組",
+       "userrights-expiry-current": "$1 到期",
+       "userrights-expiry-none": "唔會到期",
+       "userrights-expiry": "到期:",
+       "userrights-expiry-existing": "現時到期嘅時間: $2 $3",
+       "userrights-expiry-othertime": "其它時間:",
+       "userrights-invalid-expiry": "組\"$1\"嘅過期時間冇效",
        "userrights-conflict": "用戶權限更改有衝突!請再睇過同確認你嘅改動。",
        "group": "組:",
        "group-user": "用戶",
        "right-editsemiprotected": "改保護等級係「{{int:protect-level-autoconfirmed}}」嘅版面",
        "right-editcontentmodel": "改版面嘅內容模型",
        "right-editinterface": "編輯用戶界面",
-       "right-editusercssjs": "編輯其他用戶嘅CSS同埋JavaScript檔",
        "right-editusercss": "編輯其他用戶嘅CSS檔",
        "right-edituserjs": "編輯其他用戶嘅JavaScript檔",
        "right-editmyusercss": "編輯戶口嘅CSS文件",
        "rightslogtext": "呢個係用戶權力嘅修改日誌。",
        "action-read": "讀呢版",
        "action-edit": "編輯呢版",
-       "action-createpage": "開版",
+       "action-createpage": "建立呢頁",
        "action-createtalk": "開討論版",
        "action-createaccount": "開呢個用戶戶口",
        "action-history": "睇呢頁嘅歷史",
        "action-suppressionlog": "睇呢個私有日誌",
        "action-block": "封鎖呢位用戶嘅編輯",
        "action-protect": "改呢版嘅保護等級",
+       "action-rollback": "速還原某版最後修改人之修改",
        "action-import": "由其它wiki度倒入版",
        "action-importupload": "由檔案上載度倒入版",
        "action-patrol": "標示其它嘅編輯做已巡查嘅",
        "action-userrights": "編輯全部嘅權限",
        "action-userrights-interwiki": "編輯響其它wiki用戶嘅權限",
        "action-siteadmin": "鎖同解鎖資料庫",
-       "action-sendemail": "電郵",
+       "action-sendemail": "電郵",
        "action-editmywatchlist": "改監視清單",
        "action-viewmywatchlist": "睇監視清單",
        "action-viewmyprivateinfo": "睇你嘅私人資料",
        "recentchanges-legend-heading": "<strong>標記:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (睇埋[[Special:NewPages|新開版]])",
        "recentchanges-submit": "顯示",
+       "rcfilters-filter-editsbyself-description": "你改嘅嘢。",
+       "rcfilters-filter-editsbyother-label": "其他人改嘅嘢",
+       "rcfilters-filter-editsbyother-description": "其他人(唔係你)改嘅嘢",
+       "rcfilters-filtergroup-userExpLevel": "經驗級別(只限簽咗到嘅用戶)",
+       "rcfilters-filter-user-experience-level-newcomer-label": "新手",
+       "rcfilters-filter-user-experience-level-newcomer-description": "少過4日、10次編輯",
+       "rcfilters-filter-user-experience-level-learner-label": "學徒",
+       "rcfilters-filter-user-experience-level-learner-description": "編輯數同經驗多過「新手」但少過「老手」。",
+       "rcfilters-filter-user-experience-level-experienced-label": "老手",
+       "rcfilters-filter-user-experience-level-experienced-description": "超過30日同埋500次編輯",
+       "rcfilters-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": "修改類別",
        "rcnotefrom": "下面嘅{{PLURAL:$5|改動}}由 <strong>$3 $4</strong> 開始(顯示到'''$1''')。",
        "rclistfrom": "顯示由$3 $2嘅新更改",
        "rcshowhideminor": "$1小編輯",
        "rcshowhidecategorization": "$1 頁面分類",
        "rcshowhidecategorization-show": "顯示",
        "rcshowhidecategorization-hide": "收埋",
-       "rclinks": "顯示最後$1次喺$2日內嘅更改<br />$3",
+       "rclinks": "顯示最後$1次喺$2日內嘅更改",
        "diff": "差異",
        "hist": "歷史",
        "hide": "隱藏",
        "allpagesbadtitle": "提供嘅頁面名無效,又或者有一個跨語言或跨wiki嘅字頭。佢可能包括一個或多個字係唔可以用響標題度嘅。",
        "allpages-bad-ns": "{{SITENAME}}係無一個空間名叫做\"$1\"。",
        "allpages-hide-redirects": "收埋跳轉",
+       "cachedspecial-viewing-cached-ttl": "以下資料,來自暫存,上次更新係$1之前嘅事。",
        "cachedspecial-refresh-now": "睇最新。",
        "categories": "類",
        "categoriespagetext": "下面嘅{{PLURAL:$1|類}}有版或媒體。\n[[Special:UnusedCategories|未用類]]唔會響呢度列示。\n請同時參閱[[Special:WantedCategories|需要嘅分類]]。",
        "delete-legend": "刪除",
        "historywarning": "<strong>警告:</strong>你要刪除嘅頁面有大約$1次嘅修訂:",
        "confirmdeletetext": "你準備刪除一個頁面或者圖像,包括佢嘅所有歷史版本。\n請確認你打算噉做,而且你知道後果係點,加上確認你噉做冇違反到[[{{MediaWiki:Policy-url}}]]。",
-       "actioncomplete": "æ\93\8dä½\9cå®\8cæ\88\90",
-       "actionfailed": "æ\93\8dä½\9c失æ\95\97",
+       "actioncomplete": "æ\90\9eæ\8e\82",
+       "actionfailed": "æ\90\9eå\94\94æ\8e\82",
        "deletedtext": "\"$1\"已經刪除。最近嘅刪除記錄請睇$2。",
        "dellogpage": "刪除日誌",
        "dellogpagetext": "以下係最近嘅刪除清單。",
        "undeleteviewlink": "睇",
        "undeleteinvert": "反選",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "$1個修訂已經救返",
-       "undeletedrevisions-files": "$1個修訂同$2個檔案已經救返",
-       "undeletedfiles": "$1個檔案已經救返",
        "cannotundelete": "救唔到:\n$1",
        "undeletedpage": "'''$1已經成功救返'''\n\n最近嘅刪除同恢復記錄請睇[[Special:Log/delete]]。",
        "undelete-header": "睇吓[[Special:Log/delete|刪除日誌]]去睇之前刪除嘅頁頁。",
        "whatlinkshere-hideredirs": "$1跳轉",
        "whatlinkshere-hidetrans": "$1嵌入",
        "whatlinkshere-hidelinks": "$1連結",
-       "whatlinkshere-hideimages": "$1檔案連結",
+       "whatlinkshere-hideimages": "$1檔案連結",
        "whatlinkshere-filters": "過濾器",
        "whatlinkshere-submit": "去",
        "autoblockid": "自動封鎖 #$1",
        "logentry-newusers-create": "戶口$1經已{{GENDER:$2|開咗}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|上傳咗}} $3",
        "rightsnone": "(冇)",
-       "revdelete-summary": "編輯摘要",
        "feedback-back": "返轉頭",
        "feedback-cancel": "取消",
        "feedback-close": "搞掂",
        "special-characters-title-emdash": "長破折號",
        "special-characters-title-minus": "減號",
        "mw-widgets-titleinput-description-new-page": "冇呢頁",
-       "mw-widgets-titleinput-description-redirect": "跳轉到$1"
+       "mw-widgets-titleinput-description-redirect": "跳轉到$1",
+       "authmanager-authplugin-setpass-failed-title": "改唔到密碼"
 }
index 9a3a44f..a97b24e 100644 (file)
        "externaldberror": "Der is een fout opetreeën bie 't anmelden bie de database of je ei hin toestemmieng jen externe gebruker bie te werken.",
        "login": "Anmelden",
        "nav-login-createaccount": "Anmelden / Inschrieven",
-       "userlogin": "Anmelden / Inschrieven",
        "logout": "Ofmelden",
        "userlogout": "Ofmelden",
        "notloggedin": "Nie anemeld",
-       "nologin": "Nog hin gebrukersnaem? $1.",
-       "nologinlink": "Mik een gebruker an",
        "createaccount": "Gebruker anmaeken",
-       "gotaccount": "È je a een gebrukersnaem? '''$1'''.",
-       "gotaccountlink": "Anmelden",
-       "userlogin-resetlink": "Ben jie je anmeldgegevens vergeet'n?",
        "createaccountmail": "per e-mail",
        "badretype": "De wachtwoôrden die-a je ingegeven typ bin nie eênder.",
        "userexists": "De hekozen gebrukersnaem is a in gebruuk.\nKies asjeblieft een aore naem.",
        "editingsection": "Bezig mie bewerken van $1 (deêlpagina)",
        "editingcomment": "Bezig mie bewerken van $1 (opmerkieng)",
        "editconflict": "Bewerkiengsconflict: $1",
-       "explainconflict": "Een aore gebruker ei deêze pagina bewerkt sins a je mie je bewerkieng bin behonnen.\nIn 't bovenste deêl van 't venster sti de tekst van de udihe pagina.\nJe bewerkieng sti in 't onderste hedeêlte.\nJe dien je bewerkiengen in te voehen in de bestaende tekst.\n'''Alleên''' de tekst in 't bovenste hedeêlte wor opeslogen a je op \"{{int:savearticle}}\" klik.",
+       "explainconflict": "Een aore gebruker ei deêze pagina bewerkt sins a je mie je bewerkieng bin behonnen.\nIn 't bovenste deêl van 't venster sti de tekst van de udihe pagina.\nJe bewerkieng sti in 't onderste hedeêlte.\nJe dien je bewerkiengen in te voehen in de bestaende tekst.\n'''Alleên''' de tekst in 't bovenste hedeêlte wor opeslogen a je op \"$1\" klik.",
        "yourtext": "Joe tekst",
        "storedversion": "Opeslogen versie",
        "nonunicodebrowser": "'''WAERSCHUWIENG: Je browser kan nie hoed overwig mie unicode.\nIermie wor deur de MediaWiki-software rekenienge ehouwen zoda je toch zonder probleemn pagina's kan bewerken: nie-ASCII karakters worn in 't bewerkiengsveld weereheven as hexadecimale codes.'''",
        "prefs-misc": "Rest",
        "saveprefs": "Opslaene",
        "prefs-editing": "Bewerken",
-       "rows": "Rehels:",
-       "columns": "Kolomm'n:",
        "searchresultshead": "Zoek",
        "stub-threshold": "Drempel voe markerieng <a href=\"#\" class=\"stub\">stompje</a>:",
        "recentchangesdays": "Antal daehen weer te heven in Juust angepast:",
        "userrights-reason": "Reeën voe 't verandern:",
        "userrights-no-interwiki": "Je ei hin rechen om gebrukersrechen op aore wiki's te wiezigen.",
        "userrights-nodatabase": "Database $1 besti nie of is hin plaetselijke database.",
-       "userrights-nologin": "Je mò jen eihen[[Special:UserLogin|anmelden]] mie een gebruker mie de juuste rechen om gebrukersrechen toe te wiezen.",
-       "userrights-notallowed": "Je ei hin rechen om gebrukersrechen toe te wiezen.",
        "userrights-changeable-col": "Hroep'n die a je kan beheern",
        "userrights-unchangeable-col": "Hroep'n die a je nie kan beheern",
        "group": "Hroep:",
        "rcshowhideanons": "$1 anonieme gebrukers",
        "rcshowhidepatr": "hecontroleerde bewerkiengen $1",
        "rcshowhidemine": "$1 mien bewerkiengen",
-       "rclinks": "Bekiek de lèste $1 wiezigingen in de lèste $2 daegen<br />$3",
+       "rclinks": "Bekiek de lèste $1 wiezigingen in de lèste $2 daegen",
        "diff": "wiez",
        "hist": "hesch",
        "hide": "Verberge",
        "revdelete-restricted": "ei beperkiengen an beheêrders opeleid",
        "revdelete-unrestricted": "ei beperkiengen voe beheêrders opeheven",
        "rightsnone": "(hin)",
-       "revdelete-summary": "saemenvattieng bewerken",
        "searchsuggest-search": "Zoek"
 }
index 1837c4b..8cff68a 100644 (file)
                        "Myy730",
                        "SolidBlock",
                        "D41D8CD98F",
-                       "Wmr"
+                       "Wmr",
+                       "逆襲的天邪鬼"
                ]
        },
        "tog-underline": "链接下划线:",
        "tog-hideminor": "在最近更改中隐藏小编辑",
-       "tog-hidepatrolled": "在最近更改中隐藏已巡查的编辑",
+       "tog-hidepatrolled": "在最近更改中隐藏已检查过的编辑",
        "tog-newpageshidepatrolled": "在新页面列表中隐藏已巡查页面",
        "tog-hidecategorization": "隐藏页面的分类",
        "tog-extendwatchlist": "扩展监视列表以显示所有更改,而不仅是最近的更改",
        "redirectedfrom": "(重定向自$1)",
        "redirectpagesub": "重定向页面",
        "redirectto": "重定向至:",
-       "lastmodifiedat": "本页面最后修改于$1 $2。",
+       "lastmodifiedat": "本页面最后编辑于$1 $2。",
        "viewcount": "本页面已经被访问过{{PLURAL:$1|$1次}}。",
        "protectedpage": "受保护页面",
        "jumpto": "跳转至:",
        "login": "登录",
        "login-security": "证明您的身份",
        "nav-login-createaccount": "登录/创建账户",
-       "userlogin": "登录/创建账户",
-       "userloginnocreate": "登录",
        "logout": "退出",
        "userlogout": "退出",
        "notloggedin": "未登录",
        "userlogin-noaccount": "没有账户?",
        "userlogin-joinproject": "加入{{SITENAME}}",
-       "nologin": "没有账户?$1。",
-       "nologinlink": "创建账户",
        "createaccount": "创建账户",
-       "gotaccount": "已经拥有账户?请$1。",
-       "gotaccountlink": "登录",
-       "userlogin-resetlink": "忘记您的登录信息?",
        "userlogin-resetpassword-link": "忘记密码?",
        "userlogin-helplink2": "登录帮助",
        "userlogin-loggedin": "您已经以{{GENDER:$1|$1}}的身份登录。使用下面的表格以其他用户的身份登录。",
        "createaccountmail": "使用一个临时的随机密码并将其发送到指定的电子邮件地址中",
        "createaccountmail-help": "可被用于为另一个人创建账户而不需要得知密码。",
        "createacct-realname": "真实姓名(可选)",
-       "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "您为什么要创建另一个账户",
        "createacct-reason-help": "在账户创建日志中显示的消息",
        "resettokens": "重置密钥",
        "resettokens-text": "您可以在这里重置允许访问与您的账户有关的特定私人数据的密钥。\n\n如果您意外将它们分享给他人,或是您的账户已经被入侵,您应该重置它们。",
        "resettokens-no-tokens": "没有可以重置的密钥。",
-       "resettokens-tokens": "密钥:",
+       "resettokens-tokens": "令牌:",
        "resettokens-token-label": "$1(当前值:$2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|对你的监视列表中的页面的更改]]的网页feed(Atom/RSS)的密钥",
        "resettokens-done": "密钥已重置。",
        "preview": "预览",
        "showpreview": "显示预览",
        "showdiff": "显示更改",
-       "blankarticle": "<strong>警告</strong>:您创建的页面是空白的。如果您再次点击“{{int:savearticle}}”,您将真的创建没有任何内容的页面。",
+       "blankarticle": "<strong>警告</strong>:您创建的页面是空白的。如果您再次点击“$1”,您将真的创建没有任何内容的页面。",
        "anoneditwarning": "<strong>警告:</strong>您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您<strong>[$1 登录]</strong>或<strong>[$2 创建]</strong>一个账户,您的编辑将归属于您的用户名,且将享受其他好处。",
        "anonpreviewwarning": "<em>您没有登录。保存将您的IP地址记录至此页面的编辑历史中。</em>",
-       "missingsummary": "<strong>提示:</strong>您没有提供编辑摘要。如果您再次点击“{{int:savearticle}}”,您的编辑将不带摘要保存。",
-       "selfredirect": "<strong>警告:</strong>您正在将此页面重定向至它自己。您可能指定了错误的重定向目标,或者您正在编辑错误的页面。如果您再次点击“{{int:savearticle}}”,重定向仍将被创建。",
+       "missingsummary": "<strong>提示:</strong>您没有提供编辑摘要。如果您再次点击“$1”,您的编辑将不带摘要保存。",
+       "selfredirect": "<strong>警告:</strong>您正在将此页面重定向至它自己。您可能指定了错误的重定向目标,或者您正在编辑错误的页面。如果您再次点击“$1”,重定向仍将被创建。",
        "missingcommenttext": "请在下面输入评论。",
-       "missingcommentheader": "<strong>提示:</strong>您还没有为此评论提供一个标题。如果您再次点击“{{int:savearticle}}”,您的编辑将不带标题保存。",
+       "missingcommentheader": "<strong>提示:</strong>您还没有为此评论提供一个标题。如果您再次点击“$1”,您的编辑将不带标题保存。",
        "summary-preview": "编辑摘要的预览:",
        "subject-preview": "主题的预览:",
        "previewerrortext": "尝试预览您的更改时发生未知错误。",
        "editingsection": "编辑“$1”(章节)",
        "editingcomment": "编辑“$1”(新章节)",
        "editconflict": "编辑冲突:$1",
-       "explainconflict": "其他用户在您开始编辑后更改了该页面。上面的文字区含有该页面当前的文字。下面的文字区显示您的更改。您必须把您的更改合并至现有文字。<strong>只有</strong>当您单击“{{int:savearticle}}”后,上面的文字区中的文字才会被保存。",
+       "explainconflict": "其他用户在您开始编辑后更改了该页面。上面的文字区含有该页面当前的文字。下面的文字区显示您的更改。您必须把您的更改合并至现有文字。<strong>只有</strong>当您单击“$1”后,上面的文字区中的文字才会被保存。",
        "yourtext": "您的文字",
        "storedversion": "已保存的版本",
        "nonunicodebrowser": "<strong>警告:您的浏览器不兼容Unicode编码。</strong>这里有一个工作区将使您能安全地编辑页面:非ASCII字符将以十六进制编码方式出现在编辑框中。",
        "readonlywarning": "<strong>警告:数据库被锁定以进行维护,所以您目前将无法保存您的编辑。</strong>您可以将您的文本复制粘贴到一个文本文档并保存它,以便稍后更改。\n\n锁定数据库的系统管理员做出如下解释:$1",
        "protectedpagewarning": "<strong>警告:本页面已被保护,只有拥有管理员权限的用户可以编辑。</strong>下面提供最后的日志条目以供参考:",
        "semiprotectedpagewarning": "<strong>注意:</strong>本页面已被保护,只有注册用户可以编辑。下面提供最后的日志条目以供参考:",
-       "cascadeprotectedwarning": "<strong>警告:</strong>本页面已经被保护,只有拥有管理员权限的用户可以编辑,因为它被嵌入于以下启用连锁保护的{{PLURAL:$1|页面}}中:",
+       "cascadeprotectedwarning": "<strong>警告:</strong>本页面已经被保护,只有拥有[[Special:ListGroupRights|特定权限]]的用户可以编辑,因为它被嵌入于以下启用连锁保护的{{PLURAL:$1|页面}}中:",
        "titleprotectedwarning": "<strong>警告:本页面已被保护,创建本页面需要[[Special:ListGroupRights|特定权限]]。</strong>下面提供最后的日志条目以供参考:",
        "templatesused": "该页面使用的{{PLURAL:$1|模板}}:",
        "templatesusedpreview": "本预览使用的{{PLURAL:$1|模板}}:",
        "post-expand-template-argument-warning": "<strong>警告:</strong>本页面包含至少一个展开后过大的模板参数。这些参数会被忽略。",
        "post-expand-template-argument-category": "含有略过模板参数的页面",
        "parser-template-loop-warning": "检查到模板循环:[[$1]]",
+       "template-loop-category": "有模板循环的页面",
+       "template-loop-category-desc": "页面存在模板循环,就是递归进行自我调用的模板。",
        "parser-template-recursion-depth-warning": "模板递归深度越限($1)",
        "language-converter-depth-warning": "字词转换器深度越限($1)",
        "node-count-exceeded-category": "页面的节点数超出限制",
        "page_first": "首页",
        "page_last": "末页",
        "histlegend": "差异选择:选中要对比的版本的单选按钮,按Enter键或下方的按钮。<br />说明:<strong>({{int:cur}})</strong>=与最后版本之间的差异,<strong>({{int:last}})</strong>=与上一版本之间的差异,<strong>{{int:minoreditletter}}</strong>=小编辑。",
-       "history-fieldset-title": "æµ\8fè§\88å\8e\86å\8f²",
-       "history-show-deleted": "仅显示已删除的版本",
+       "history-fieldset-title": "æ\90\9c索修订ç\89\88æ\9c¬",
+       "history-show-deleted": "仅限修订版本删除",
        "histfirst": "最旧",
        "histlast": "最新",
        "historysize": "($1字节)",
        "search-file-match": "(匹配文件内容)",
        "search-suggest": "您是不是要找:$1",
        "search-rewritten": "显示用于$1的结果。而不是寻找$2。",
-       "search-interwiki-caption": "姊妹项目",
+       "search-interwiki-caption": "来自姊妹项目的结果",
        "search-interwiki-default": "来自$1的结果:",
        "search-interwiki-more": "(更多)",
        "search-interwiki-more-results": "更多结果",
        "gender-unknown": "当提及您时,软件将尽可能使用性别中性的词法",
        "gender-male": "他",
        "gender-female": "她",
-       "prefs-help-gender": "该设置为可选项。软件根据该值在称呼您及对他人提及您时使用适当的语法性别。该信息会被公开。",
+       "prefs-help-gender": "该设置为可选项。系统会使用您选择的方式来称呼您,对他人提及您时也会使用适当语法称呼。该信息会公开。",
        "email": "电子邮件",
        "prefs-help-realname": "真实姓名是选填项目。如果提供,它可能用于署名您的贡献。",
        "prefs-help-email": "电子邮件地址是选填项,但是当您忘记您的密码要重置密码时,需要该信息。",
        "prefs-advancedwatchlist": "高级选项",
        "prefs-displayrc": "显示",
        "prefs-displaywatchlist": "显示",
-       "prefs-tokenwatchlist": "密钥",
+       "prefs-tokenwatchlist": "令牌",
        "prefs-diffs": "差异对比",
        "prefs-help-prefershttps": "该设置将在下次登录时生效。",
        "prefswarning-warning": "您对您的参数设置的更改尚未保存。如果您不点击“$1”就离开,您的设置就不会更新。",
        "prefs-tabs-navigation-hint": "提示:您可以通过左、右箭头键在选项卡之间切换。",
-       "userrights": "用户权限管理",
+       "userrights": "用户权限",
        "userrights-lookup-user": "选择用户",
        "userrights-user-editname": "输入用户名:",
        "editusergroup": "加载用户组",
        "saveusergroups": "保存{{GENDER:$1|用户}}组",
        "userrights-groupsmember": "用户组:",
        "userrights-groupsmember-auto": "自动用户组:",
-       "userrights-groups-help": "您可以更改该用户的用户组:\n* 选中的选项框表示该用户属于该用户组。\n* 未选中的选项框表示该用户不属于该用户组。\n* 星号(*)表示一旦您被添加至该用户组后,您不能亲自移除其权限,反之亦然。\n* 井号(#)表示您只可以推迟该用户组的过期时间;您不能将其提前。",
+       "userrights-groups-help": "您可以更改该用户的用户组:\n* 选中的选项框表示该用户属于该用户组。\n* 未选中的选项框表示该用户不属于该用户组。\n* 星号(*)表示一旦您被添加至该用户组后,您不能亲自移除其权限,反之亦然。\n* 井号(#)表示您只可以推迟该用户组成员的过期时间;您不能将其提前。",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "您并没有权限去编辑在其它wiki上的用户权限。",
        "userrights-nodatabase": "数据库$1不存在或并非为本地的。",
        "userrights-expiry-options": "1天:1 day,1周:1 week,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year",
        "userrights-invalid-expiry": "组“$1”的终止时间无效。",
        "userrights-expiry-in-past": "组“$1”的终止时间是在过去。",
-       "userrights-cannot-shorten-expiry": "您不能将用户组“$1”的过期时间提前。只有拥有添加或移除该组权限的用户可以将其提前。",
+       "userrights-cannot-shorten-expiry": "您不能将用户组“$1”成员的过期时间提前。只有拥有添加或移除该组权限的用户可以将其提前。",
        "userrights-conflict": "用户权限的更改存在冲突!请检查并确认您的更改。",
        "group": "用户组:",
        "group-user": "用户",
        "right-editsemiprotected": "编辑保护级别为“{{int:protect-level-autoconfirmed}}”的页面",
        "right-editcontentmodel": "编辑页面的内容模型",
        "right-editinterface": "编辑用户界面",
-       "right-editusercssjs": "编辑其他用户的CSS和JavaScript文件",
        "right-editusercss": "编辑其他用户的CSS文件",
        "right-edituserjs": "编辑其他用户的JavaScript文件",
        "right-editmyusercss": "编辑您的用户CSS文件",
        "action-deletechangetags": "从数据库删除标签",
        "action-purge": "刷新此页面",
        "nchanges": "$1次更改",
-       "enhancedrc-since-last-visit": "{{PLURAL:$1|上次访问后}}$1个",
+       "enhancedrc-since-last-visit": "{{PLURAL:$1|自上次访问}}有$1次",
        "enhancedrc-history": "历史",
        "recentchanges": "最近更改",
        "recentchanges-legend": "最近更改选项",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}(见[[Special:NewPages|新页面列表]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "显示",
-       "rcfilters-activefilters": "活跃的过滤器",
+       "rcfilters-activefilters": "激活的过滤器",
+       "rcfilters-quickfilters": "快速链接",
+       "rcfilters-quickfilters-placeholder-title": "尚未保存链接",
+       "rcfilters-quickfilters-placeholder-description": "要保存您的过滤器设置并供日后再利用,点击下方激活的过滤器区域内的书签图标。",
+       "rcfilters-savedqueries-defaultlabel": "保存的过滤器",
+       "rcfilters-savedqueries-rename": "重命名",
+       "rcfilters-savedqueries-setdefault": "设置为默认",
+       "rcfilters-savedqueries-unsetdefault": "移除为默认",
+       "rcfilters-savedqueries-remove": "移除",
+       "rcfilters-savedqueries-new-name-label": "名称",
+       "rcfilters-savedqueries-apply-label": "创建快速链接",
+       "rcfilters-savedqueries-cancel-label": "取消",
+       "rcfilters-savedqueries-add-new-title": "将过滤器保存为快速链接",
        "rcfilters-restore-default-filters": "恢复默认过滤器",
        "rcfilters-clear-all-filters": "清空所有过滤器",
        "rcfilters-search-placeholder": "过滤器最近更改(浏览或开始输入)",
        "rcfilters-invalid-filter": "无效过滤器",
-       "rcfilters-empty-filter": "没æ\9c\89æ´»è·\83的过滤器。已显示所有贡献。",
+       "rcfilters-empty-filter": "没æ\9c\89æ¿\80æ´»的过滤器。已显示所有贡献。",
        "rcfilters-filterlist-title": "过滤器",
+       "rcfilters-filterlist-whatsthis": "这是什么?",
+       "rcfilters-filterlist-feedbacklink": "在新(测试版)过滤器中提供反馈",
        "rcfilters-highlightbutton-title": "高亮结果",
        "rcfilters-highlightmenu-title": "选择颜色",
+       "rcfilters-highlightmenu-help": "选择颜色来高亮该属性",
        "rcfilters-filterlist-noresults": "找不到过滤器",
+       "rcfilters-noresults-conflict": "找不到结果,因为搜索条件不一致",
+       "rcfilters-state-message-subset": "该过滤器没有影响,因为其结果已包含在以下影响更广的{{PLURAL:$2|过滤器}}中(尝试高亮来区别它):$1",
+       "rcfilters-state-message-fullcoverage": "组中选择的所有过滤器与选定过滤器相同,因此该过滤器没有影响。组包含:$1",
        "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-filter-unregistered-conflicts-user-experience-level": "该过滤器与以下体验{{PLURAL:$2|过滤器}}相冲突,而它只{{PLURAL:$2|寻找}}注册用户:$1",
+       "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-user-experience-level-conflicts-unregistered": "体验过滤器只寻找注册用户,因此该过滤器与“未注册”过滤器相冲突。",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "“未注册”过滤器与一个或更多体验过滤器相冲突,而它只寻找注册用户。冲突过滤器已在上方激活过滤器区域中被标记。",
+       "rcfilters-filter-user-experience-level-newcomer-label": "新手",
+       "rcfilters-filter-user-experience-level-newcomer-description": "少于10次编辑和4天活跃。",
+       "rcfilters-filter-user-experience-level-learner-label": "初学者",
+       "rcfilters-filter-user-experience-level-learner-description": "比“新手”拥有更多经验,但少于“有经验的用户”。",
+       "rcfilters-filter-user-experience-level-experienced-label": "有经验的用户",
+       "rcfilters-filter-user-experience-level-experienced-description": "超过30天活跃和500次编辑。",
        "rcfilters-filtergroup-automated": "自动化贡献者",
        "rcfilters-filter-bots-label": "机器人",
        "rcfilters-filter-bots-description": "由自动化工具做出的编辑。",
-       "rcfilters-filter-humans-label": "人类(不是机器人)",
+       "rcfilters-filter-humans-label": "人类(机器人)",
        "rcfilters-filter-humans-description": "由人类编辑者做出的编辑。",
+       "rcfilters-filtergroup-reviewstatus": "巡查状态",
+       "rcfilters-filter-patrolled-label": "已巡查",
+       "rcfilters-filter-patrolled-description": "已将编辑标记为已巡查。",
+       "rcfilters-filter-unpatrolled-label": "未巡查",
+       "rcfilters-filter-unpatrolled-description": "编辑未标记为已巡查。",
        "rcfilters-filtergroup-significance": "意义",
        "rcfilters-filter-minor-label": "小编辑",
        "rcfilters-filter-minor-description": "作者已标记为小编辑的编辑。",
        "rcfilters-filter-major-label": "不是小编辑",
        "rcfilters-filter-major-description": "未标记为小编辑的编辑。",
+       "rcfilters-filtergroup-watchlist": "监视列表中的页面",
+       "rcfilters-filter-watchlist-watched-label": "在监视列表上",
+       "rcfilters-filter-watchlist-watched-description": "对您的监视列表上页面做出的更改。",
+       "rcfilters-filter-watchlist-watchednew-label": "新监视列表更改",
+       "rcfilters-filter-watchlist-watchednew-description": "自从更改发生以来,对您没有访问的监视页面做出的更改。",
+       "rcfilters-filter-watchlist-notwatched-label": "未在监视列表上",
+       "rcfilters-filter-watchlist-notwatched-description": "除了对您监视的页面做出更改以外的任何事项。",
        "rcfilters-filtergroup-changetype": "更改类型",
        "rcfilters-filter-pageedits-label": "页面编辑",
        "rcfilters-filter-pageedits-description": "对wiki内容、讨论、分类描述的编辑....",
        "rcfilters-filter-newpages-description": "做出新页面的编辑。",
        "rcfilters-filter-categorization-label": "分类更改",
        "rcfilters-filter-categorization-description": "从分类中添加或移除页面的记录。",
-       "rcfilters-filter-logactions-label": "记录的操作",
+       "rcfilters-filter-logactions-label": "日志操作",
        "rcfilters-filter-logactions-description": "管理操作、账户创建、页面删除、上传....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "“小编辑”过滤器与一个或多个更改类型过滤器冲突,因为其中某种更改类型不可指定为“小编辑”。冲突过滤器已在上方活跃过滤器中被标记。",
+       "rcfilters-hideminor-conflicts-typeofchange": "某种更改类型不可指定为“小编辑”,因此该过滤器与以下更改类型过滤器相冲突:$1",
+       "rcfilters-typeofchange-conflicts-hideminor": "这种更改类型过滤器与“小编辑”过滤器相冲突。某种更改类型不可指定为“小编辑”。",
+       "rcfilters-filtergroup-lastRevision": "最新版本",
+       "rcfilters-filter-lastrevision-label": "最新版本",
+       "rcfilters-filter-lastrevision-description": "对页面的最近更改。",
+       "rcfilters-filter-previousrevision-label": "早期版本",
+       "rcfilters-filter-previousrevision-description": "除最近更改外,所有对某一页面的更改。",
        "rcnotefrom": "下面{{PLURAL:$5|是}}<strong>$3 $4</strong>之后的更改(最多显示<strong>$1</strong>个)。",
+       "rclistfromreset": "重置时间选择",
        "rclistfrom": "显示$3 $2之后的新更改",
        "rcshowhideminor": "$1小编辑",
        "rcshowhideminor-show": "显示",
        "rcshowhidecategorization": "$1页面分类",
        "rcshowhidecategorization-show": "显示",
        "rcshowhidecategorization-hide": "隐藏",
-       "rclinks": "显示过去$2天的最后$1个更改<br />$3",
+       "rclinks": "显示过去$2天的最后$1个更改",
        "diff": "差异",
        "hist": "历史",
        "hide": "隐藏",
        "php-uploaddisabledtext": "PHP文件上传停用。请检查file_uploads设置。",
        "uploadscripted": "该文件包含可能被网络浏览器错误解释的 HTML 或脚本代码。",
        "upload-scripted-pi-callback": "不能上传包含XML-stylesheet处理命令的文件。",
+       "upload-scripted-dtd": "不能上传包含非标准DTD声明的SVG文件。",
        "uploaded-script-svg": "在上传的SVG文件中找到可编写脚本的元素“$1”。",
        "uploaded-hostile-svg": "在上传的SVG文件中的样式元素中找到不安全CSS。",
        "uploaded-event-handler-on-svg": "在SVG文件中不允许设置event-handler属性<code>$1=\"$2\"</code>。",
        "upload-description": "文件说明",
        "upload-options": "上传选项",
        "watchthisupload": "监视这个文件",
-       "filewasdeleted": "之前已经有一个同名文件被上传后又被删除了。在上传此文件之前您需要检查$1。",
+       "filewasdeleted": "之前已经上传过一个同名文件,后来又删除了。在上传此文件之前您应该检查$1。",
        "filename-thumb-name": "这看起来像是缩略图标题。请不要将缩略图上传回同一wiki。否则,请修改文件名使其更有意义,并且没有缩略图前缀。",
        "filename-bad-prefix": "您上传的文件名称是以<strong>“$1”</strong>作为开头,通常这种没有含意的文件名称是由数码相机中自动编排。请在您的文件中重新选择一个更加有意义的文件名称。",
        "filename-prefix-blacklist": " #<!-- 请将本行保留为原样 --> <pre>\n# 语法如下:\n#  * 任何以“#”开头到结尾的行为注释\n#  * 任何非空行是根据相机自动分配特定文件名的前缀\nCIMG # 卡西欧\nDSC_ # 尼康\nDSCF # 富士\nDSCN # 尼康\nDUW # 部分手机\nIMG # 一般\nJD # 业纳\nMGP # 宾得\nPICT # 其他\n #</pre> <!-- 请将本行保留为原样 -->",
        "ancientpages": "最老页面",
        "move": "移动",
        "movethispage": "移动本页",
-       "unusedimagestext": "存在以下没有插入任何页面的文件。请注意,其他网站可能会使用直接URL链接某个文件,因此它即使被实际使用也可能在这里列出。",
+       "unusedimagestext": "下面为未被任何页面使用的文件。请注意,其他网站可能会通过URL直接链接某个文件,因此列表中的文件有可能仍在使用。",
        "unusedcategoriestext": "以下分类页面实际存在,即使没有其它页面或分类利用它们。",
        "notargettitle": "无目标",
        "notargettext": "您还没有指定一个目标页面或用户以进行此项操作。",
        "enotif_body_intro_moved": "{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|移动}},请浏览<$3>查看当前版本。",
        "enotif_body_intro_restored": "{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|还原}},请浏览$3查看当前版本。",
        "enotif_body_intro_changed": "{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|更改}},请浏览 $3 查看当前版本。",
-       "enotif_lastvisited": "请æµ\8fè§\88 $1 æ\9f¥ç\9c\8bå\9c¨ä½ ä¸\8a次访é\97®å\90\8eç\9a\84æ\89\80æ\9c\89æ\9b´æ\94¹ã\80\82",
-       "enotif_lastdiff": "请æµ\8fè§\88 $1 æ\9f¥ç\9c\8b该æ\9b´æ\94¹ã\80\82",
+       "enotif_lastvisited": "è¦\81æ\9f¥ç\9c\8bæ\82¨ä¸\8a次访é\97®ä»¥æ\9d¥ç\9a\84æ\89\80æ\9c\89æ\9b´æ\94¹ï¼\8c请å\8f\82è§\81$1",
+       "enotif_lastdiff": "è¦\81æµ\8fè§\88此次æ\9b´æ\94¹ï¼\8c请å\8f\82è§\81$1",
        "enotif_anon_editor": "匿名用户$1",
        "enotif_body": "亲爱的$WATCHINGUSERNAME:\n\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{{canonicalurl:{{#special:EditWatchlist}}}}\n从监视列表中删除该页面:\n$UNWATCHURL\n反馈与其他帮助:\n$HELPPAGE",
        "created": "创建",
        "undeletepage": "查看和还原被删除的页面",
        "undeletepagetitle": "<strong>以下包含[[:$1|$1]]的已删除之版本</strong>。",
        "viewdeletedpage": "查看被删页面",
-       "undeletepagetext": "以下{{PLURAL:$1|页面|$1个页面}}已被删除,但依然在归档中并可以被恢复。归档可能会被定时清理。",
+       "undeletepagetext": "以下{{PLURAL:$1|页面|$1个页面}}已删除,但内容仍然在存档中,而且可以恢复。存档可能会定时清理。",
        "undelete-fieldset-title": "还原版本",
        "undeleteextrahelp": "要恢复该页面的整个历史记录时,不选中任何复选框直接点击<strong><em>{{int:undeletebtn}}</em></strong>。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击<strong><em>{{int:undeletebtn}}</em></strong>。",
        "undeleterevisions": "$1个{{PLURAL:$1|修订版本}}已删除",
        "undeleteviewlink": "查看",
        "undeleteinvert": "反向选择",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "还原{{PLURAL:$1|$1个版本}}",
-       "undeletedrevisions-files": "还原{{PLURAL:$1|$1个版本}}和{{PLURAL:$2|$2个文件}}",
-       "undeletedfiles": "还原{{PLURAL:$1|$1个文件}}",
        "cannotundelete": "部分或全部还原删除失败:$1",
        "undeletedpage": "<strong>$1已经被还原</strong>\n\n最近的删除和还原记录请见[[Special:Log/delete|删除日志]]。",
        "undelete-header": "如要查询最近的记录请参阅[[Special:Log/delete|删除日志]]。",
        "sp-contributions-uploads": "上传",
        "sp-contributions-logs": "日志",
        "sp-contributions-talk": "讨论",
-       "sp-contributions-userrights": "用户权限管理",
+       "sp-contributions-userrights": "{{GENDER:$1|用户}}权限管理",
        "sp-contributions-blocked-notice": "这位用户目前正在被封禁。最近的封禁日志记录在下面提供以供参考:",
        "sp-contributions-blocked-notice-anon": "这个IP地址目前正在被封禁。最近的封禁日志记录在下面提供以供参考:",
        "sp-contributions-search": "搜索贡献",
        "unblocked-id": "封禁$1已被解除",
        "unblocked-ip": "[[Special:Contributions/$1|$1]]已解封。",
        "blocklist": "被封禁用户",
+       "autoblocklist": "自动封禁",
+       "autoblocklist-submit": "搜索",
+       "autoblocklist-legend": "自动封禁列表",
+       "autoblocklist-localblocks": "本地{{PLURAL:$1|自动封禁}}",
+       "autoblocklist-empty": "自动封禁列表为空。",
+       "autoblocklist-otherblocks": "其他{{PLURAL:$1|自动封禁}}",
        "ipblocklist": "被封禁用户",
        "ipblocklist-legend": "查找被封禁用户",
        "blocklist-userblocks": "隐藏账户封禁",
        "tooltip-pt-mycontris": "{{GENDER:|您}}的贡献的列表",
        "tooltip-pt-anoncontribs": "来自此IP地址的编辑列表",
        "tooltip-pt-login": "我们鼓励您登录;然而,这不是强制性的",
+       "tooltip-pt-login-private": "您需要登录以使用此wiki",
        "tooltip-pt-logout": "退出登录",
        "tooltip-pt-createaccount": "建议您创建一个账户并登录,但这不是强制的",
        "tooltip-ca-talk": "关于内容页面的讨论",
        "anonymous": "{{SITENAME}}匿名{{PLURAL:$1|用户}}",
        "siteuser": "{{SITENAME}}用户$1",
        "anonuser": "{{SITENAME}}匿名用户$1",
-       "lastmodifiedatby": "本页面被$3最后修改于$1 $2。",
+       "lastmodifiedatby": "本页面被$3最后编辑于$1 $2。",
        "othercontribs": "基于$1的劳动成果。",
        "others": "其他",
        "siteusers": "{{SITENAME}}{{PLURAL:$2|{{GENDER:$1|用户}}}}$1",
        "newimages-summary": "本特殊页面展示最后上传的文件。",
        "newimages-legend": "过滤",
        "newimages-label": "文件名(或它的一部份):",
+       "newimages-user": "IP地址或用户名",
        "newimages-showbots": "显示机器人上传",
        "newimages-hidepatrolled": "隐藏已巡查的上传",
        "noimages": "无可查看文件。",
        "metadata-help": "此文件中包含有额外的信息。这些信息可能是由数码相机或扫描仪在创建或数字化过程中所添加的。如果文件自初始状态已受到修改,一些详细说明可能无法反映修改后的文件。",
        "metadata-expand": "显示详细资料",
        "metadata-collapse": "隐藏详细资料",
-       "metadata-fields": "在本信息中所列出的 EXIF 元数据域将包含在图片显示页面,当元数据表损坏时只显示以下信息。\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",
+       "metadata-fields": "在本信息中所列出的 EXIF 元数据域将包含在图片显示页面,当元数据表损坏时只显示以下信息。其他的元数据默认为隐藏。\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": "每像素字节数",
        "confirmrecreate": "在您开始编辑后,[[User:$1|$1]]([[User talk:$1|讨论]])因以下列原因{{GENDER:$1|删除}}了该页面:\n: <em>$2</em>\n请确认在您重新创建页面前三思。",
        "confirmrecreate-noreason": "用户 [[User:$1|$1]]([[User talk:$1|talk]]) 在您开始编辑之后{{GENDER:$1|删除}}此页面。请确认您确实要重新创建此页面。",
        "recreate": "重新创建",
+       "confirm-purge-title": "刷新本页",
        "confirm_purge_button": "确定",
        "confirm-purge-top": "要清除此页面的缓存吗?",
        "confirm-purge-bottom": "清除页面数据会清除缓存并强制显示最近的版本。",
        "colon-separator": ":",
        "pipe-separator": "&#32;|&#32;",
        "word-separator": "",
+       "ellipsis": "…",
        "parentheses": "($1)",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← 上一页",
        "version-skin-colheader-name": "皮肤",
        "version-ext-colheader-version": "版本",
        "version-ext-colheader-license": "许可协议",
-       "version-ext-colheader-description": "说明",
+       "version-ext-colheader-description": "描述",
        "version-ext-colheader-credits": "作者",
        "version-license-title": "$1的许可协议",
        "version-license-not-found": "未找到此扩展相关的详细授权信息。",
        "specialpages-group-spam": "反垃圾链接工具",
        "specialpages-group-developer": "开发者工具",
        "blankpage": "空白页面",
-       "intentionallyblankpage": "这个页面被故意留为空白",
+       "intentionallyblankpage": "此页特意留白。",
        "external_image_whitelist": " #请原样保留本行文字<pre>\n#请在下面输入正则表达式片段(//之间的部份)\n#这些项目将会匹配外部图像的URL\n#匹配的项目将显示为图像,否则只会显示图像的链接\n#以#开头的行被视为评论\n#不区分大小写\n\n#请在本行上面输入所有正则表达式片段。请原样保留本行文字</pre>",
        "tags": "有效的更改标签",
        "tag-filter": "[[Special:Tags|标签]]过滤器:",
        "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-restore": "$1{{GENDER:$2|还原}}页面$3($4)",
+       "logentry-delete-restore-nocount": "$1{{GENDER:$2|还原}}页面$3",
+       "restore-count-revisions": "{{PLURAL:$1|$1个修订版本}}",
+       "restore-count-files": "{{PLURAL:$1|$1个文件}}",
        "logentry-delete-event": "$1{{GENDER:$2|更改}}$3的{{PLURAL:$5|$5个日志事件}}的可见性:$4",
        "logentry-delete-revision": "$1{{GENDER:$2|更改}}页面$3的{{PLURAL:$5|$5个版本}}的可见性:$4",
        "logentry-delete-event-legacy": "$1{{GENDER:$2|更改}}$3的日志事件的可见性",
        "logentry-tag-update-revision": "$1{{GENDER:$2|更新了}}在页面$3的修订版本$4上的标签({{PLURAL:$7|添加了}}$6;并{{PLURAL:$9|移除了}}$8)",
        "logentry-tag-update-logentry": "$1在页面$3的日志记录$5中{{GENDER:$2|更新了}}标签({{PLURAL:$7|添加了}}$6;并{{PLURAL:$9|移除了}}$8)",
        "rightsnone": "(无)",
-       "revdelete-summary": "编辑摘要",
        "rightslogentry-temporary-group": "$1(临时,直到$2)",
        "feedback-adding": "正在添加反馈至页面...",
        "feedback-back": "返回",
        "special-characters-group-thai": "泰语",
        "special-characters-group-lao": "老挝语",
        "special-characters-group-khmer": "高棉语字母",
+       "special-characters-group-canadianaboriginal": "加拿大原住民音节文字",
        "special-characters-title-endash": "短划线",
        "special-characters-title-emdash": "长划线",
        "special-characters-title-minus": "减号",
        "mw-widgets-titleinput-description-redirect": "重定向至$1",
        "mw-widgets-categoryselector-add-category-placeholder": "添加分类...",
        "mw-widgets-usersmultiselect-placeholder": "添加更多...",
+       "date-range-from": "起始日:",
+       "date-range-to": "截止日:",
        "sessionmanager-tie": "不能结合多个请求的身份验证类型:$1。",
        "sessionprovider-generic": "$1会话",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "基于cookie的会话",
        "restrictionsfield-label": "允许的IP段:",
        "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用任何地址或地址段,可使用:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "修订版本$1",
-       "pageid": "页面ID$1"
+       "pageid": "页面ID$1",
+       "rawhtml-notallowed": "&lt;html&gt;标签不能在一般页面以外使用。",
+       "gotointerwiki": "离开{{SITENAME}}",
+       "gotointerwiki-invalid": "指定的标题无效。",
+       "gotointerwiki-external": "您将要离开{{SITENAME}}来访问[[$2]],这是一个独立网站。\n\n'''[$1 继续访问$1]'''",
+       "undelete-cantedit": "您不能还原该页面,因为您未被允许编辑该页面。",
+       "undelete-cantcreate": "您不能还原该页面,因为没有使用该页面名称的现有页面,并且您未被允许编辑该页面。"
 }
index 844dc45..6cd6d63 100644 (file)
                        "Maskers",
                        "Knch903",
                        "Winstonyin",
-                       "Wmr"
+                       "Wmr",
+                       "烈羽",
+                       "和平奮鬥救地球",
+                       "Arthur2e5",
+                       "逆襲的天邪鬼"
                ]
        },
        "tog-underline": "底線標示連結:",
-       "tog-hideminor": "隱藏近期變更中的修訂",
+       "tog-hideminor": "隱藏近期變更中的次要修訂",
        "tog-hidepatrolled": "隱藏近期變更中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
        "tog-hidecategorization": "隱藏頁面分類",
@@ -92,7 +96,7 @@
        "tog-usenewrc": "依近期變更與監視清單的頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示編輯工具列",
-       "tog-editondblclick": "é\9b\99æ\93\8aæ»\91é¼ 編輯頁面",
+       "tog-editondblclick": "é»\9eé\81¸å\85©æ¬¡ä»¥編輯頁面",
        "tog-editsectiononrightclick": "開啟滑鼠右鍵點選章節標題編輯",
        "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視清單",
        "tog-watchdefault": "將我編輯的頁面和檔案加入監視清單",
        "tog-watchdeletion": "將我刪除的頁面和檔案加入監視清單",
        "tog-watchuploads": "加入我上傳的新檔案至我的監視清單",
        "tog-watchrollback": "將我曾經還原的頁面新增至監視清單",
-       "tog-minordefault": "預設標記所有的編輯為修訂",
+       "tog-minordefault": "預設標記所有的編輯為次要修訂",
        "tog-previewontop": "顯示預覽於編輯框上方",
        "tog-previewonfirst": "第一次編輯時顯示預覽",
        "tog-enotifwatchlistpages": "當我的監視清單中的頁面或檔案有變更時,傳送電子郵件通知我",
        "tog-enotifusertalkpages": "當我的對話頁面有變更時,傳送電子郵件通知我",
-       "tog-enotifminoredits": "當頁面與檔案有修訂時,傳送電子郵件通知我",
+       "tog-enotifminoredits": "當頁面與檔案有次要修訂時,傳送電子郵件通知我",
        "tog-enotifrevealaddr": "在通知郵件中顯示我的電子郵件地址",
        "tog-shownumberswatching": "顯示監視使用者數量",
        "tog-oldsig": "您現有的簽名:",
        "tog-forceeditsummary": "未填寫編輯摘要時提示我",
        "tog-watchlisthideown": "隱藏監視清單中我自己的編輯",
        "tog-watchlisthidebots": "隱藏監視清單中機器人的編輯",
-       "tog-watchlisthideminor": "隱藏監視清單中的修訂",
+       "tog-watchlisthideminor": "隱藏監視清單中的次要修訂",
        "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
        "tog-watchlistreloadautomatically": "查詢條件變更時自動重新讀取監視清單 (需要使用 JavaScript)",
        "tog-watchlisthideanons": "隱藏監視清單中匿名使用者的編輯",
        "tog-watchlisthidepatrolled": "隱藏監視清單中已巡查的編輯",
        "tog-watchlisthidecategorization": "隱藏頁面分類",
-       "tog-ccmeonemails": "我給他人寄出郵件時,也寄出一份副本到我的電子郵件信箱",
+       "tog-ccmeonemails": "我寄出郵件給其他使用者時,也寄給我一份副本",
        "tog-diffonly": "比對差異時下方不顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏分類",
        "tog-norollbackdiff": "執行還原後略過差異比對",
        "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>",
        "talk": "討論",
        "views": "檢視",
        "toolbox": "工具",
-       "tool-link-userrights": "更改{{GENDER:$1|使用者}}群組",
+       "tool-link-userrights": "變更{{GENDER:$1|使用者}}群組",
        "tool-link-userrights-readonly": "檢視{{GENDER:$1|使用者}}群組",
        "tool-link-emailuser": "寄信給這位{{GENDER:$1|使用者}}",
        "userpage": "檢視使用者頁面",
        "redirectedfrom": "(已重新導向自 $1)",
        "redirectpagesub": "重新導向頁面",
        "redirectto": "重新導向至:",
-       "lastmodifiedat": "此頁面最後修改於 $1 $2。",
-       "viewcount": "此頁面已被檢è¦\96é\81\8e {{PLURAL:$1|$1 æ¬¡}}ã\80\82",
+       "lastmodifiedat": "此頁面最後編輯於 $1 $2。",
+       "viewcount": "此頁面已被å­\98å\8f\96é\81\8e {{PLURAL:$1|$1 æ¬¡}}ã\80\82",
        "protectedpage": "受保護頁面",
        "jumpto": "前往:",
        "jumptonavigation": "導覽",
        "viewsourcetext": "您可以檢視並複製此頁面的原始碼。",
        "viewyourtext": "您可以檢視並複製此頁面中<strong>您編輯</strong>的原始碼。",
        "protectedinterface": "本頁用來提供此 Wiki 軟體介面上的文字,並且已被設為保護以防止惡意修改。\n如欲增加或修改 Wiki 的翻譯,請至 [https://translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。",
-       "editinginterface": "<strong>警告:</strong>您正在編輯的頁面文字是用來作為軟體介面使用。\n變更此頁面將會影響其他使用者在此 Wiki 上看到的使用者介面。",
+       "editinginterface": "<strong>警告:</strong>您正在編輯的頁面文字是用來提供軟體介面使用。\n變更此頁面將會影響其他使用者在此 Wiki 上看到的使用者介面。",
        "translateinterface": "如欲修改 Wiki 的翻譯,請至 [https://translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。",
        "cascadeprotected": "此頁面被保護無法編輯,因為此頁面被以下開啟 \"連鎖保護\" 選項的{{PLURAL:$1|一頁|數頁}}保護頁面引用:\n$2",
        "namespaceprotected": "您沒有權限編輯 <strong>$1</strong> 命名空間的頁面。",
        "userlogin-remembermypassword": "記住我的登入狀態",
        "userlogin-signwithsecure": "使用安全連線",
        "cannotlogin-title": "無法登入",
-       "cannotlogin-text": "無法登入",
+       "cannotlogin-text": "無法登入",
        "cannotloginnow-title": "現在無法登入",
        "cannotloginnow-text": "使用 $1 時無法登入。",
        "cannotcreateaccount-title": "無法建立帳號",
        "login": "登入",
        "login-security": "驗証您的 ID",
        "nav-login-createaccount": "登入/建立帳號",
-       "userlogin": "登入/建立帳號",
-       "userloginnocreate": "登入",
        "logout": "登出",
        "userlogout": "登出",
        "notloggedin": "尚未登入",
        "userlogin-noaccount": "沒有帳號嗎?",
        "userlogin-joinproject": "加入 {{SITENAME}}",
-       "nologin": "您還沒有帳號嗎? $1。",
-       "nologinlink": "建立帳號",
        "createaccount": "建立帳號",
-       "gotaccount": "您已經擁有帳號了嗎? $1。",
-       "gotaccountlink": "登入",
-       "userlogin-resetlink": "忘了您登入的詳細資料?",
        "userlogin-resetpassword-link": "忘記密碼?",
        "userlogin-helplink2": "登入協助",
        "userlogin-loggedin": "您目前已登入 {{GENDER:$1|$1}} 使用者,\n請使用下列表單改登入另一位使用者。",
        "createaccountmail": "使用臨時的隨機密碼,並將它寄至指定的電子郵件地址",
        "createaccountmail-help": "可用來建立其他人的帳號 (不需要知道密碼)。",
        "createacct-realname": "真實姓名 (選填)",
-       "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "您為什麼要建立另一個帳號",
        "createacct-reason-help": "顯示於帳號建立日誌的訊息",
        "password-login-forbidden": "此使用者名稱和密碼已被禁止使用。",
        "mailmypassword": "重設密碼",
        "passwordremindertitle": "{{SITENAME}} 的新臨時密碼",
-       "passwordremindertext": "ä¸\8dæ\98\8e人士 (å\8f¯è\83½æ\98¯æ\82¨è\87ªå·±ï¼\8cä¾\86è\87ª IP ä½\8då\9d\80 $1) è¦\81æ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ã\80\82\n給使ç\94¨è\80\85 \"$2\" ç\9a\84è\87¨æ\99\82å¯\86碼設ç\82º \"$3\"ã\80\82\nå¦\82æ\9e\9cé\80\99å\80\8bå\8b\95ä½\9cæ\98¯æ\82¨å\81\9aç\9a\84ï¼\8cæ\82¨é\9c\80è¦\81ç«\8bå\8d³ç\99»å\85¥ä¸¦è¨­å®\9aä¸\80å\80\8bæ\96°ç\9a\84å¯\86碼ï¼\8c\næ\82¨ç\9a\84è\87¨æ\99\82å¯\86碼å°\87æ\96¼{{PLURAL:$5|ä¸\80|$5}}天å\85§é\81\8eæ\9c\9fã\80\82\n\nå¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è¦\81求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
+       "passwordremindertext": "ä¸\8dæ\98\8e人士 (å\8f¯è\83½æ\98¯æ\82¨è\87ªå·±ï¼\8cä¾\86è\87ª IP ä½\8då\9d\80 $1) è«\8bæ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ã\80\82\n給使ç\94¨è\80\85 \"$2\" ç\9a\84è\87¨æ\99\82å¯\86碼設ç\82º \"$3\"ã\80\82\nå¦\82æ\9e\9cé\80\99å\80\8bå\8b\95ä½\9cæ\98¯æ\82¨å\81\9aç\9a\84ï¼\8cæ\82¨é\9c\80è¦\81ç«\8bå\8d³ç\99»å\85¥ä¸¦è¨­å®\9aä¸\80å\80\8bæ\96°ç\9a\84å¯\86碼ï¼\8c\næ\82¨ç\9a\84è\87¨æ\99\82å¯\86碼å°\87æ\96¼{{PLURAL:$5|ä¸\80|$5}}天å\85§é\81\8eæ\9c\9fã\80\82\n\nå¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è«\8b求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "noemail": "使用者 \"$1\" 沒有電子郵件地址記錄。",
        "noemailcreate": "您需要提供一個有效的電子郵件地址。",
        "passwordsent": "使用者 \"$1\" 的新密碼已寄至當出登記的電子郵件地址,\n請稍後收到郵件後再登入。",
        "noemailprefs": "在您的偏好設定中設定電子郵件地址,讓您可以使用這些功能。",
        "emailconfirmlink": "確認您的電子郵件地址",
        "invalidemailaddress": "無法接受格式不正確的電子郵件地址,請輸入正確的電子郵件地址格式或略過填寫該欄位。",
-       "cannotchangeemail": "此 Wiki 禁止變更帳號的電子郵件地址。",
+       "cannotchangeemail": "此 Wiki 禁止更改帳號的電子郵件地址。",
        "emaildisabled": "此網站不能傳送電子郵件。",
        "accountcreated": "已建立帳號",
        "accountcreatedtext": "使用者帳號 [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|對話]]) 已建立。",
        "passwordreset-domain": "網域名稱:",
        "passwordreset-email": "電子郵件地址:",
        "passwordreset-emailtitle": "在 {{SITENAME}} 的帳號詳細資料",
-       "passwordreset-emailtext-ip": "ä¸\8dæ\98\8e人士 (å\8f¯è\83½æ\98¯æ\82¨è\87ªå·±ï¼\8cä¾\86è\87ª IP ä½\8då\9d\80 $1) è¦\81æ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ï¼\8cä¸\8bå\88\97æ\98¯è\88\87æ­¤é\9b»å­\90é\83µä»¶å\9c°å\9d\80æ\9c\89é\97\9cç\9a\84使ç\94¨è\80\85{{PLURAL:$3|帳è\99\9f}}ï¼\9a\n\n$2\n\n{{PLURAL:$3|é\80\99å\80\8bè\87¨æ\99\82å¯\86碼|é\80\99äº\9bè\87¨æ\99\82å¯\86碼}}å°\87æ\9c\83å\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\85§å\88°æ\9c\9fï¼\8c\næ\82¨æ\87\89ç«\8bå\8d³ç\99»å\85¥ä¸¦æ\9b´æ\94¹æ\96°ç\9a\84å¯\86碼ã\80\82å¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è¦\81求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略本訊息並且繼續使用您原本的密碼。",
-       "passwordreset-emailtext-user": "使ç\94¨è\80\85 $1 è¦\81æ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ï¼\8cä¸\8bå\88\97æ\98¯è\88\87æ­¤é\9b»å­\90é\83µä»¶ä½\8då\9d\80æ\9c\89é\97\9cç\9a\84使ç\94¨è\80\85{{PLURAL:$3|帳è\99\9f}}ï¼\9a\n\n$2\n\n{{PLURAL:$3|é\80\99å\80\8bè\87¨æ\99\82å¯\86碼|é\80\99äº\9bè\87¨æ\99\82å¯\86碼}}å°\87æ\9c\83å\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\85§å\88°æ\9c\9fï¼\8c\næ\82¨æ\87\89ç«\8bå\8d³ç\99»å\85¥ä¸¦æ\9b´æ\94¹æ\96°ç\9a\84å¯\86碼ã\80\82å¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è¦\81求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
+       "passwordreset-emailtext-ip": "ä¸\8dæ\98\8e人士 (å\8f¯è\83½æ\98¯æ\82¨è\87ªå·±ï¼\8cä¾\86è\87ª IP ä½\8då\9d\80 $1) è«\8bæ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ï¼\8cä¸\8bå\88\97æ\98¯è\88\87æ­¤é\9b»å­\90é\83µä»¶å\9c°å\9d\80æ\9c\89é\97\9cç\9a\84使ç\94¨è\80\85{{PLURAL:$3|帳è\99\9f}}ï¼\9a\n\n$2\n\n{{PLURAL:$3|é\80\99å\80\8bè\87¨æ\99\82å¯\86碼|é\80\99äº\9bè\87¨æ\99\82å¯\86碼}}å°\87æ\9c\83å\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\85§å\88°æ\9c\9fï¼\8c\næ\82¨æ\87\89ç«\8bå\8d³ç\99»å\85¥ä¸¦æ\9b´æ\94¹æ\96°ç\9a\84å¯\86碼ã\80\82å¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è«\8b求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略本訊息並且繼續使用您原本的密碼。",
+       "passwordreset-emailtext-user": "使ç\94¨è\80\85 $1 è«\8bæ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ï¼\8cä¸\8bå\88\97æ\98¯è\88\87æ­¤é\9b»å­\90é\83µä»¶å\9c°å\9d\80æ\9c\89é\97\9cç\9a\84使ç\94¨è\80\85{{PLURAL:$3|帳è\99\9f}}ï¼\9a\n\n$2\n\n{{PLURAL:$3|é\80\99å\80\8bè\87¨æ\99\82å¯\86碼|é\80\99äº\9bè\87¨æ\99\82å¯\86碼}}å°\87æ\9c\83å\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\85§å\88°æ\9c\9fï¼\8c\næ\82¨æ\87\89ç«\8bå\8d³ç\99»å\85¥ä¸¦æ\9b´æ\94¹æ\96°ç\9a\84å¯\86碼ã\80\82å¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è«\8b求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailelement": "使用者名稱:\n$1\n\n臨時密碼:\n$2",
        "passwordreset-emailsentemail": "若此確實為您帳號所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
        "passwordreset-emailsentusername": "若此確實為您使用者名稱所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
        "hr_tip": "水平線 (少用)",
        "summary": "摘要:",
        "subject": "主旨:",
-       "minoredit": "這是一個修訂",
+       "minoredit": "這是一個次要修訂",
        "watchthis": "監視此頁面",
        "savearticle": "儲存頁面",
        "savechanges": "儲存變更",
        "preview": "預覽",
        "showpreview": "顯示預覽",
        "showdiff": "顯示變更",
-       "blankarticle": "<strong>警告:</strong>您正在建立的頁面是空白的。\n如果您再按一下\"{{int:savearticle}}\",將建立沒有任何內容的頁面。",
+       "blankarticle": "<strong>警告:</strong>您正在建立的頁面是空白的。\n如果您再按一下\"$1\",將建立沒有任何內容的頁面。",
        "anoneditwarning": "<strong>警告:</strong>您尚未登入。 若您進行任何的編輯您的 IP 位置將會被公開。 若您 <strong>[$1 登入]</strong> 或 <strong>[$2 建立帳號]</strong>,您的編輯將會以您的使用者名稱標示,擁有其他優點。",
        "anonpreviewwarning": "<em>您尚未登入。儲存頁面會將您的 IP 位址記錄在此頁面的編輯歷史中。</em>",
-       "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
-       "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n您可能指定錯要重新導向的目標頁面或者編輯錯頁面。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
+       "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"$1\" 一次,將略過摘要直接儲存您的編輯。",
+       "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n您可能指定錯要重新導向的目標頁面或者編輯錯頁面。\n若您再點選 \"$1\" 一次,將會繼續建立重新導向。",
        "missingcommenttext": "請在下方輸入評論。",
-       "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
-       "summary-preview": "摘要預覽:",
-       "subject-preview": "主旨預覽:",
+       "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨。\n若您再點選 \"$1\" 一次,將略過主旨/標題直接儲存您的評論。",
+       "summary-preview": "編輯摘要預覽:",
+       "subject-preview": "預覽主旨:",
        "previewerrortext": "嘗試預覽您的變更時發生錯誤。",
        "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。請在作出任何查詢時包含上述所有詳情。",
+       "systemblockedtext": "您的使用者名稱或 IP 位址已被 MediaWiki 自動封鎖,原因如下:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 被封鎖的使用者:$7\n\n您目前的 IP 位址為 $3。\n請在做詢問時附上以上資訊。",
        "blockednoreason": "未說明原因",
        "whitelistedittext": "請先 $1 才可編輯頁面。",
        "confirmedittext": "在編輯此頁之前您必須確認您的電子郵件地址。\n請透過 [[Special:Preferences|偏好設定]] 設定並驗證您的電子郵件地址。",
        "newarticle": "(新)",
        "newarticletext": "您正連結至一頁不存在頁面。\n要建立該頁面,請在下方的編輯方塊中輸入內容 (詳情請參考 [$1 使用說明頁面]) 。\n如果您是不小心來到此頁面,請點選瀏覽器的 <strong>返回</strong> 按鈕。",
        "anontalkpagetext": "----\n<em>此討論頁面是給尚未建立帳號的匿名使用者使用</em>\n因此我們必須使用 IP 位址來辨識身份,但相同的 IP 位址可能由許多不同的使用者所共用。\n如果您是匿名使用者並且覺得評論的內容與您無關,請 [[Special:CreateAccount|建立新帳號]] 或 [[Special:UserLogin|登入]] 避免與其他匿名使用者混淆。",
-       "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[Special:Search/{{PAGENAME}}|搜尋此頁面標題]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 建立此頁]</span>。",
+       "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[Special:Search/{{PAGENAME}}|搜尋此頁面標題]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 建立此頁]</span>。",
        "noarticletext-nopermission": "此頁面目前沒有內容,\n您可以在其它頁面中 [[Special:Search/{{PAGENAME}}|搜尋此頁面標題]],或 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]</span>,但您沒有權限建立此頁面。",
        "missing-revision": "頁面名稱 \"{{FULLPAGENAME}}\" 的 #$1 修訂版本不存在。\n\n通常是因連結到過期的歷史頁面,該頁面已被刪除。\n詳情請參考 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "userpage-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。\n若您要建立/編輯此頁面,請先檢查是否正確。",
        "continue-editing": "前往編輯框",
        "previewconflict": "此預覽顯示了您於上方文字編輯框中的內容儲存之後將會顯示的結果。",
        "session_fail_preview": "很抱歉!由於連線階段的資料遺失,以至於我們無法處理您的編輯動作。\n您可能已經登出了。<strong>請您確認您仍然在登入狀態,並請再試一次</strong>。\n請再試一次。\n如果仍然失敗,請 [[Special:UserLogout|登出]] 後重新登入,並請您確認您的瀏覽器允許此網站的 Cookie。",
-       "session_fail_preview_html": "<strong>抱歉!由於是次登入時段出現資料遺失,我們無法處理您所作出的編輯。</strong>\n\n<em> {{SITENAME}} 已開啟了原始 HTML 模式,故此預覽畫面將不會顯示以避免 JavaScript 攻擊。</em>\n\n<strong>如您希望真正能夠作出這次編輯,請再試一次。</strong>\n如果仍不成功,請 [[Special:UserLogout|登出]] 後再重新登入,並確保瀏覽器設定為「允許這個網域的cookie」。",
+       "session_fail_preview_html": "<strong>抱歉!由於是次登入時段出現資料遺失,我們無法處理您所作出的編輯。</strong>\n\n<em> {{SITENAME}} 已開啟了原始 HTML 模式,故此預覽畫面將不會顯示以避免 JavaScript 攻擊。</em>\n\n<strong>如您希望真正能夠作出這次編輯,請再試一次。</strong>\n如果仍不成功,請 [[Special:UserLogout|登出]] 後再重新登入,並確保瀏覽器設定為 \"允許這個網域的 cookie\" 。",
        "token_suffix_mismatch": "<strong>因您使用的瀏覽器破壞了編輯密鑰中的特殊符號,您的編輯已被拒絕。</strong>\n為了避免破壞頁面內容,已拒絕此次編輯動作,\n會發生這個問題通常是因為您使用了有問題的匿名網頁代理伺服器。",
        "edit_form_incomplete": "<strong>部份編輯的內容未送至伺服器,請檢查您的編輯內容是否完整並再試一次。</strong>",
        "editing": "正在編輯 $1",
        "editingsection": "正在編輯 $1 (章節)",
        "editingcomment": "正在編輯 $1 (新章節)",
        "editconflict": "編輯衝突:$1",
-       "explainconflict": "在您開始編輯之後已有其他人儲存了此頁面。\n上方的文字框內顯示了目前頁面中的文字內容,\n您所變更的文字內容顯示在下方文字框中。\n您須要將您所變更的文字內容合併到已儲存的文字內容當中。\n若您直接點選 \"{{int:savearticle}}\" <strong>只有</strong> 上方文字框中的內容會被儲存。",
+       "explainconflict": "在您開始編輯之後已有其他人儲存了此頁面。\n上方的文字框內顯示了目前頁面中的文字內容,\n您所變更的文字內容顯示在下方文字框中。\n您須要將您所變更的文字內容合併到已儲存的文字內容當中。\n若您直接點選 \"$1\" <strong>只有</strong> 上方文字框中的內容會被儲存。",
        "yourtext": "您的文字",
        "storedversion": "已儲存修訂",
        "nonunicodebrowser": "<strong>警告:您的瀏覽器與 Unicode 不相容。</strong>\n暫時解決的方式是先在您可安全編輯頁面的地方編輯:非 ASCII 字元在編輯框中會以 16 進位編碼顯示。",
        "readonlywarning": "<strong>警告:資料庫已被鎖定以進行維護,因此無法儲存您目前所做的編輯動作。</strong>\n您可先複製您的文字並貼上到文字檔案中儲存,稍後再儲存您編輯。\n\n鎖定資料庫的系統管理員有以下說明:$1",
        "protectedpagewarning": "<strong>警告:本頁已經被保護,只有擁有管理員權限的使用者才可編輯。</strong>\n以下提供最近的日誌以便參考:",
        "semiprotectedpagewarning": "<strong>注意:</strong>本頁已經被保護,只有已註冊的使用者才可編輯。\n以下提供最近的日誌以便參考:",
-       "cascadeprotectedwarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可編輯,此頁面被下列{{PLURAL:$1|頁面|頁面}}引用因此連鎖保護:",
+       "cascadeprotectedwarning": "<strong>警告:</strong>由於本頁被下列{{PLURAL:$1|頁面|頁面}}嵌入,所以受連鎖保護。只有得到[[Special:ListGroupRights|特殊權限]]的使用者才可編輯。",
        "titleprotectedwarning": "<strong>警告:本頁面已被保護,需要 [[Special:ListGroupRights|特殊權限]] 方可建立。</strong>\n以下提供最近的日誌以便參考:",
        "templatesused": "此頁面使用了以下{{PLURAL:$1|模板}}:",
        "templatesusedpreview": "此預覽使用了以下{{PLURAL:$1|模板}}:",
        "post-expand-template-argument-warning": "<strong>警告:</strong>此頁面有一個以上的模板參數過長。\n過長的參數會被直接忽略。",
        "post-expand-template-argument-category": "模板參數有部份被忽略的頁面",
        "parser-template-loop-warning": "偵測到模板迴圈:[[$1]]",
+       "template-loop-category": "有樣板迴圈的頁面",
+       "template-loop-category-desc": "頁面含有樣板迴圈,即會自己不斷呼叫自己樣板。",
        "parser-template-recursion-depth-warning": "超出模板遞迴深度限制 ($1)",
        "language-converter-depth-warning": "已超出語言轉換器深度限制 ($1)",
        "node-count-exceeded-category": "節點數量超出限制的頁面",
        "last": "前筆",
        "page_first": "第一頁",
        "page_last": "最後頁",
-       "histlegend": "比對選擇的版本差異:選擇要比對修訂版本的單選方塊並點選底部的按鈕進行比對。<br />\n符號說明:<strong>({{int:cur}})</strong> = 與最新的修訂版本比對,<strong>({{int:last}})</strong> = 與前一筆修訂版本比對,<strong>{{int:minoreditletter}}</strong> = 修訂。",
-       "history-fieldset-title": "瀏覽歷史",
+       "histlegend": "比對選擇的版本差異:選擇要比對修訂版本的單選方塊並點選底部的按鈕進行比對。<br />\n符號說明:<strong>({{int:cur}})</strong> = 與最新的修訂版本比對,<strong>({{int:last}})</strong> = 與前一筆修訂版本比對,<strong>{{int:minoreditletter}}</strong> = 次要修訂。",
+       "history-fieldset-title": "搜尋修訂",
        "history-show-deleted": "只顯示已刪除的修訂",
        "histfirst": "最舊",
        "histlast": "最新",
        "search-file-match": "(符合檔案內容)",
        "search-suggest": "您指的是不是:$1",
        "search-rewritten": "顯示 $1 的搜尋結果,改搜尋 $2。",
-       "search-interwiki-caption": "姐妹專案",
+       "search-interwiki-caption": "源自姐妹專案的結果",
        "search-interwiki-default": "來自 $1 的結果:",
        "search-interwiki-more": "(更多)",
+       "search-interwiki-more-results": "更多結果",
        "search-relatedarticle": "相關",
        "searchrelated": "相關",
        "searchall": "全部",
        "prefs-labs": "實驗中的功能",
        "prefs-user-pages": "使用者頁面",
        "prefs-personal": "使用者基本資料",
-       "prefs-rc": "最近變更",
+       "prefs-rc": "近期變更",
        "prefs-watchlist": "監視清單",
        "prefs-editwatchlist": "編輯監視清單",
        "prefs-editwatchlist-label": "編輯在您監視清單上的項目:",
        "stub-threshold": "短頁面連結格式門檻值 ($1):",
        "stub-threshold-sample-link": "樣本",
        "stub-threshold-disabled": "已停用",
-       "recentchangesdays": "最近變更顯示的天數:",
+       "recentchangesdays": "近期變更顯示的天數:",
        "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "recentchangescount": "預設顯示的編輯數:",
-       "prefs-help-recentchangescount": "這包含最近更改、頁面歷史以及日誌。",
+       "prefs-help-recentchangescount": "這包含近期變更、頁面歷史以及日誌。",
        "prefs-help-watchlist-token2": "訂閱您的監視清單所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視清單,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
        "savedprefs": "已儲存您的偏好設定。",
        "savedrights": "已儲存 {{GENDER:$1|$1}} 的使用者權限。",
        "youremail": "Email:",
        "username": "{{GENDER:$1|使用者名稱}}:",
        "prefs-memberingroups": "{{GENDER:$2|所屬}}{{PLURAL:$1|群組}}:",
+       "group-membership-link-with-expiry": "$1 (直到 $2)",
        "prefs-registration": "註冊時間:",
        "yourrealname": "真實姓名:",
        "yourlanguage": "語言:",
        "prefs-help-prefershttps": "此偏好設定將於您下次登入時生效。",
        "prefswarning-warning": "您對您的偏好設定所做的變更尚未儲存。\n若您未點選 \"$1\" 離開此頁面,將不會更新您的偏好設定。",
        "prefs-tabs-navigation-hint": "提示:您可使用左、右方向鍵切換頁籤。",
-       "userrights": "使用者權限管理",
-       "userrights-lookup-user": "選擇用戶",
+       "userrights": "使用者權限",
+       "userrights-lookup-user": "選擇使用者",
        "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-editusergroup": "編輯{{GENDER:$1|使用者}}群組",
        "userrights-viewusergroup": "檢視{{GENDER:$1|使用者}}群組",
        "saveusergroups": "儲存{{GENDER:$1|使用者}}群組",
        "userrights-groupsmember": "所屬群組:",
        "userrights-groupsmember-auto": "所屬隱含群組:",
-       "userrights-groups-help": "您可以更改此使用者所屬的群組:\n* 已勾選的核選方塊代表該使用者屬於該群組。\n* 未勾選的核選方塊代表該使用者不屬於該群組。\n* 有 * 號標示代表一旦加入該群組後便不能移除,反之亦然。",
+       "userrights-groups-help": "您可以更改此使用者所屬的群組:\n* 已勾選的核選方塊代表該使用者屬於該群組。\n* 未勾選的核選方塊代表該使用者不屬於該群組。\n* 有 * 號標示代表一旦加入該群組後便不能移除,反之亦然。\n* 有 # 號標示代表您只能延後此群組成員的期限,您無法將其提前。",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "您沒有權限去編輯其他 Wiki 上的使用者權限。",
        "userrights-nodatabase": "資料庫 $1 不存在或不在本地主機的。",
        "userrights-changeable-col": "您可變更的群組",
        "userrights-unchangeable-col": "您不可變更的群組",
+       "userrights-expiry-current": "期限至 $1",
+       "userrights-expiry-none": "沒有期限",
+       "userrights-expiry": "期限:",
+       "userrights-expiry-existing": "現有的期限:$3, $2",
        "userrights-expiry-othertime": "其他時間:",
+       "userrights-expiry-options": "1 天:1 day,1 週:1 week,1 個月:1 month,3 個月:3 months,6 個月:6 months,1 年:1 year",
+       "userrights-invalid-expiry": "群組 \"$1\" 的期限無效。",
+       "userrights-expiry-in-past": "群組 \"$1\" 的期限已過。",
+       "userrights-cannot-shorten-expiry": "您無法提前群組 \"$1\" 中成員的期限。只有擁有新增與移除此群組權限的使用者可以將期限提前。",
        "userrights-conflict": "使用者權限變更發生衝突!請檢閱並確認你的變更。",
        "group": "群組:",
        "group-user": "使用者",
        "right-createtalk": "建立討論頁面",
        "right-createaccount": "建立新的使用者帳號",
        "right-autocreateaccount": "使用外部使用者帳號自動登入",
-       "right-minoredit": "標示編輯為小修訂",
+       "right-minoredit": "標示編輯為次要",
        "right-move": "移動頁面",
        "right-move-subpages": "移動頁面與其子頁面",
        "right-move-rootuserpages": "移動根使用者頁面",
        "right-purge": "不須確認即清除網站的頁面快取",
        "right-autoconfirmed": "不受 IP-based 的註冊頻率限制",
        "right-bot": "將其視為自動程序",
-       "right-nominornewtalk": "不顯示討論頁面中小修訂的新訊息提示",
+       "right-nominornewtalk": "不顯示討論頁面中次要編輯的新訊息提示",
        "right-apihighlimits": "使用 API 查詢的最高上限值",
        "right-writeapi": "使用寫入 API",
        "right-delete": "刪除頁面",
        "right-editsemiprotected": "編輯保護層級為 \"{{int:protect-level-autoconfirmed}}\" 的頁面",
        "right-editcontentmodel": "編輯頁面的內容模型",
        "right-editinterface": "編輯使用者介面",
-       "right-editusercssjs": "編輯其他使用者的 CSS 與 JavaScript 檔",
        "right-editusercss": "編輯其他使用者的 CSS 檔",
        "right-edituserjs": "編輯其他使用者的 JavaScript 檔",
        "right-editmyusercss": "編輯自己的使用者 CSS 檔",
        "right-importupload": "由檔案上傳匯入頁面",
        "right-patrol": "標示其他人的編輯爲已巡查",
        "right-autopatrol": "將自己的編輯自動標示為已巡查",
-       "right-patrolmarks": "檢視最近變更的巡查標記",
+       "right-patrolmarks": "檢視近期變更的巡查標記",
        "right-unwatchedpages": "檢視未監視的頁面",
        "right-mergehistory": "合併頁面歷史",
        "right-userrights": "編輯所有使用者的權限",
        "action-createaccount": "建立此使用者帳號",
        "action-autocreateaccount": "自動建立此外部使用者帳號",
        "action-history": "檢視此頁面歷史",
-       "action-minoredit": "標示此編輯為小修訂",
+       "action-minoredit": "標示此編輯為次要",
        "action-move": "移動此頁面",
        "action-move-subpages": "移動此頁面與它的子頁面",
        "action-move-rootuserpages": "移動根使用者頁面",
        "action-writeapi": "使用寫入 API",
        "action-delete": "刪除此頁面",
        "action-deleterevision": "刪除修訂",
-       "action-deletelogentry": "å\88 é\99¤æ\97¥èª\8cè¨\98é\8c\84",
+       "action-deletelogentry": "å\88ªé\99¤æ\97¥èª\8cé \85ç\9b®",
        "action-deletedhistory": "檢視頁面的刪除歷史",
        "action-deletedtext": "查看已刪除的修訂版本文字",
        "action-browsearchive": "搜尋已刪除頁面",
        "action-deletechangetags": "從資料庫刪除標籤",
        "action-purge": "清除此頁面",
        "nchanges": "$1 次變更",
-       "enhancedrc-since-last-visit": "{{PLURAL:$1|自上次拜訪}}已有 $1",
+       "enhancedrc-since-last-visit": "{{PLURAL:$1|自上次拜訪}}有$1次",
        "enhancedrc-history": "歷史",
-       "recentchanges": "最近變更",
-       "recentchanges-legend": "最近變更選項",
-       "recentchanges-summary": "追蹤 Wiki 中此頁面的最近更改。",
+       "recentchanges": "近期變更",
+       "recentchanges-legend": "近期變更選項",
+       "recentchanges-summary": "追蹤 Wiki 中此頁面的近期變更。",
        "recentchanges-noresult": "於指定時間內沒有符合條件的變更。",
-       "recentchanges-feed-description": "追蹤 Wiki 中此摘要的最近變更。",
+       "recentchanges-feed-description": "追蹤 Wiki 中此摘要的近期變更。",
        "recentchanges-label-newpage": "該編輯建立了新頁面",
-       "recentchanges-label-minor": "該編輯是一個小修訂",
+       "recentchanges-label-minor": "此為次要編輯",
        "recentchanges-label-bot": "該編輯由機器人執行",
        "recentchanges-label-unpatrolled": "該編輯尚未巡查",
        "recentchanges-label-plusminus": "該頁面變更的大小 (位元組)",
        "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-activefilters": "使用中的過濾條件",
+       "rcfilters-quickfilters": "快速連結",
+       "rcfilters-savedqueries-defaultlabel": "儲存過濾器",
+       "rcfilters-savedqueries-rename": "重新命名",
+       "rcfilters-savedqueries-setdefault": "定為預設",
+       "rcfilters-savedqueries-unsetdefault": "取消預設",
+       "rcfilters-savedqueries-remove": "移除",
+       "rcfilters-savedqueries-new-name-label": "名稱",
+       "rcfilters-savedqueries-apply-label": "建立快速連結",
+       "rcfilters-savedqueries-cancel-label": "取消",
+       "rcfilters-savedqueries-add-new-title": "把過濾器存為快速連結",
+       "rcfilters-restore-default-filters": "還原預設過濾條件",
+       "rcfilters-clear-all-filters": "清除所有過濾條件",
+       "rcfilters-search-placeholder": "過濾條件近期變更 (瀏覽或開始輸入)",
+       "rcfilters-invalid-filter": "無效的過濾條件",
+       "rcfilters-empty-filter": "沒有使用中的過濾條件。已顯示所有的貢獻。",
+       "rcfilters-filterlist-title": "過濾條件",
+       "rcfilters-filterlist-whatsthis": "這是什麼?",
+       "rcfilters-filterlist-feedbacklink": "提供新 (測試版) 過濾條件的意見回饋",
+       "rcfilters-highlightbutton-title": "明顯標示結果",
+       "rcfilters-highlightmenu-title": "選擇顏色",
+       "rcfilters-highlightmenu-help": "選擇要明顯標示此屬性的色彩",
+       "rcfilters-filterlist-noresults": "查無過濾條件",
+       "rcfilters-noresults-conflict": "因搜尋條件衝突,查無結果",
+       "rcfilters-state-message-subset": "此過濾條件沒有效果,因其結果包含了以下範圍更廣的{{PLURAL:$2|過濾條件|過濾條件}}其中之一 (嘗試以明顯標示來區別它):$1",
+       "rcfilters-state-message-fullcoverage": "選擇在群組中的所有過濾條件與沒選擇時相同,代表此過濾條件沒有效果。群組包含了:$1",
+       "rcfilters-filtergroup-registration": "使用者註冊",
+       "rcfilters-filter-registered-label": "已註冊",
+       "rcfilters-filter-registered-description": "已登入的編輯者。",
+       "rcfilters-filter-unregistered-label": "未註冊",
+       "rcfilters-filter-unregistered-description": "尚未登入的編輯者。",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "此過濾條件與以下經歷{{PLURAL:$2|過濾條件|過濾條件}}衝突,因其只會{{PLURAL:$2|尋找|尋找}}已註冊的使用者:$1",
+       "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-user-experience-level-conflicts-unregistered": "經歷過濾條件只會尋找已註冊的使用者,所以此過濾條件會與 \"未註冊\" 的過濾條件衝突。",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"未註冊\" 的過濾條件與一個或多個經歷過濾條件衝突,該過濾條件只會尋找已註冊使用者。衝突的過濾條件已在上方使用的過濾條件區域中標示。",
+       "rcfilters-filter-user-experience-level-newcomer-label": "新手",
+       "rcfilters-filter-user-experience-level-newcomer-description": "編輯數低於 10 次,活躍低於 4 天。",
+       "rcfilters-filter-user-experience-level-learner-label": "初學者",
+       "rcfilters-filter-user-experience-level-learner-description": "比「新手」資深,但比「有經驗的使用者」資淺。",
+       "rcfilters-filter-user-experience-level-experienced-label": "有經驗的使用者",
+       "rcfilters-filter-user-experience-level-experienced-description": "活躍超過 30 天,編輯超過 500 次。",
+       "rcfilters-filtergroup-automated": "自動化貢獻",
+       "rcfilters-filter-bots-label": "機器人",
+       "rcfilters-filter-bots-description": "由自動化工具所做的編輯。",
+       "rcfilters-filter-humans-label": "人類 (非機器人)",
+       "rcfilters-filter-humans-description": "由人類編輯者做出的編輯",
+       "rcfilters-filtergroup-reviewstatus": "審查狀態",
+       "rcfilters-filter-patrolled-label": "已巡查",
+       "rcfilters-filter-patrolled-description": "標記為己巡查的編輯。",
+       "rcfilters-filter-unpatrolled-label": "未巡查",
+       "rcfilters-filter-unpatrolled-description": "標記為未巡查的編輯。",
+       "rcfilters-filtergroup-significance": "重要性",
+       "rcfilters-filter-minor-label": "次要編輯",
+       "rcfilters-filter-minor-description": "作者已標示為次要的編輯。",
+       "rcfilters-filter-major-label": "非次要編輯",
+       "rcfilters-filter-major-description": "未標記為次要的編輯。",
+       "rcfilters-filtergroup-watchlist": "監視列表的頁面",
+       "rcfilters-filter-watchlist-watched-label": "監視列表上",
+       "rcfilters-filter-watchlist-watched-description": "在您監視列表的更改",
+       "rcfilters-filter-watchlist-watchednew-label": "新監視列表的更改",
+       "rcfilters-filter-watchlist-notwatched-label": "不在監視列表上",
+       "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": "管理動作、帳號建立、頁面刪除、上傳....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "\"次要編輯\" 過濾條件與一個或多個變更類型過濾條件衝突,因為某些變更類型無法指定為 \"次要\"。衝突的過濾條件已在上方使用的過濾條件區域中標示。",
+       "rcfilters-hideminor-conflicts-typeofchange": "某些變更類型無法指定為 \"次要\",所以此過濾條件與以下變更類型的過濾條件衝突:$1",
+       "rcfilters-typeofchange-conflicts-hideminor": "此變更類型過濾條件與 \"次要編輯\" 過濾條件衝突,某些變更類型無法指定為 \"次要\"。",
+       "rcfilters-filtergroup-lastRevision": "最新版本",
+       "rcfilters-filter-lastrevision-label": "最新版本",
+       "rcfilters-filter-previousrevision-label": "早期版本",
        "rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
        "rclistfrom": "顯示自 $3 $2 以來的新變更",
-       "rcshowhideminor": "$1 小修訂",
+       "rcshowhideminor": "$1 次要編輯",
        "rcshowhideminor-show": "顯示",
        "rcshowhideminor-hide": "隱藏",
        "rcshowhidebots": "$1 機器人",
        "rcshowhidecategorization": "$1 頁面分類",
        "rcshowhidecategorization-show": "顯示",
        "rcshowhidecategorization-hide": "隱藏",
-       "rclinks": "顯示最近 $2 天內的 $1 次變更。<br />$3",
+       "rclinks": "顯示最近 $2 天內的 $1 次變更。",
        "diff": "差異",
        "hist": "歷史",
        "hide": "隱藏",
        "uploadstash-summary": "此頁面可存取已上傳或還在上傳程序但尚未在 Wiki 公開的檔案,這些檔案除了上傳的使用者本身外,其他人尚無法查看。",
        "uploadstash-clear": "清除儲藏庫檔案",
        "uploadstash-nofiles": "您沒有儲藏的檔案。",
-       "uploadstash-badtoken": "執行動作失敗。您的編輯資訊可能已經過期,請重新再試。",
+       "uploadstash-badtoken": "執行動作失敗。您的編輯憑証可能已經過期,請重新再試。",
        "uploadstash-errclear": "清除檔案失敗。",
        "uploadstash-refresh": "更新檔案清單",
        "uploadstash-thumbnail": "檢視縮圖",
        "uncategorizedcategories": "未分類的分類",
        "uncategorizedimages": "未分類的檔案",
        "uncategorizedtemplates": "待分類模板",
+       "uncategorized-categories-exceptionlist": "# 包含了不應在 Special:UncategorizedCategories 被提及的分類清單,一個分類一行,以 \"*\" 開始,以其他字元 (包含空白) 做為行首將會被忽略。使用 \"#\" 代表註解。",
        "unusedcategories": "未使用的分類",
        "unusedimages": "未使用的檔案",
        "wantedcategories": "需要的分類",
        "ancientpages": "最舊頁面",
        "move": "移動",
        "movethispage": "移動此頁面",
-       "unusedimagestext": "下列為未被任何頁面使用的檔案。\n請注意,其它網站可能直接透過 URL 連結至檔案,所以這裡列出的檔案仍有可能被使用。",
+       "unusedimagestext": "下列為未被任何頁面使用的檔案。\n請注意,其它網站可能直接透過 URL 連結至檔案,所以這裡列出的檔案有可能仍在使用。",
        "unusedcategoriestext": "下列分類沒有被其它頁面或者分類所使用。",
        "notargettitle": "無目標",
        "notargettext": "您尚未指定目標頁面或使用者以進行此項操作。",
        "apisandbox-sending-request": "傳送 API 請求中...",
        "apisandbox-loading-results": "接收 API 結果中...",
        "apisandbox-results-error": "讀取 API 查詢回應時發生錯誤:$1。",
+       "apisandbox-request-selectformat-label": "顯示請求資料為:",
+       "apisandbox-request-format-url-label": "URL 查詢字串",
        "apisandbox-request-url-label": "請求 URL:",
+       "apisandbox-request-json-label": "請求 JSON:",
        "apisandbox-request-time": "請求時間:{{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "更正密鑰並重新送出",
        "apisandbox-results-fixtoken-fail": "取得 \"$1\" 密鑰失敗。",
        "emailccsubject": "您寄給 $1 的訊息副本:$2",
        "emailsent": "已寄出電子郵件",
        "emailsenttext": "已寄出您的電子郵件訊息。",
-       "emailuserfooter": "這封電子郵件是由$1透過{{SITENAME}}的「{{int:emailuser}}」功能{{GENDER:$1|寄給}}{{GENDER:$1|$2}}的。{{GENDER:$2|您的}}郵件將直接寄往{{GENDER:$1|原發件人}},{{GENDER:$1|他|她|他}}將能夠看到您的電子郵件地址。",
+       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"{{int:emailuser}}\" 功能{{GENDER:$1|寄給}}{{GENDER:$1|$2}}的。若{{GENDER:$2|您}}回覆此電子郵件,{{GENDER:$2|您的}}郵件將直接寄往{{GENDER:$1|原發件人}},{{GENDER:$1|他|她|他}}將能夠看到{{GENDER:$2|您的}}電子郵件地址。",
        "usermessage-summary": "留訊息至系統。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視清單",
        "watchlist-hide": "隱藏",
        "watchlist-submit": "顯示",
        "wlshowtime": "要顯示的時間長度:",
-       "wlshowhideminor": "編輯",
+       "wlshowhideminor": "次要編輯",
        "wlshowhidebots": "機器人",
        "wlshowhideliu": "已註冊使用者",
        "wlshowhideanons": "匿名使用者",
        "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 所做的編輯;\n變更回由 $2 修訂的最後一個版本。",
+       "rollback-success": "已還原 {{GENDER:$3|$1}} 所做的編輯;\n變更回由 {{GENDER:$4|$2}} 修訂的最後一個版本。",
        "rollback-success-notify": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。[$3 顯示變更]",
        "sessionfailure-title": "連線階段失敗",
        "sessionfailure": "您的登入連線階段似乎有問題,\n為了預防連線階段受到劫持攻擊,此動作已經被取消。\n請返回上一頁,重新讀取該頁面再試一次。",
        "changecontentmodel-emptymodels-title": "沒有內容模型可用",
        "changecontentmodel-emptymodels-text": "[[:$1]]上的內容不能轉換為任何類型。",
        "log-name-contentmodel": "內容模型變更日誌",
-       "log-description-contentmodel": "æ­¤é \81å\88\97è\88\89é \81é\9d¢å\85§å®¹æ¨¡å\9e\8bç\9a\84è®\8aæ\9b´è¨\98é\8c\84以å\8f\8a使ç\94¨é\9d\9eé \90設ç\9a\84å\85§å®¹æ¨¡å\9e\8bæ\89\80å\89µå»º的頁面。",
+       "log-description-contentmodel": "æ­¤é \81å\88\97è\88\89é \81é\9d¢å\85§å®¹æ¨¡å\9e\8bç\9a\84è®\8aæ\9b´è¨\98é\8c\84以å\8f\8a使ç\94¨é\9d\9eé \90設ç\9a\84å\85§å®¹æ¨¡å\9e\8bæ\89\80建ç«\8b的頁面。",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|已使用}}非預設的內容模型 \"$5\" 建立頁面 $3",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|已變更}}頁面 $3 的內容模型自 \"$4\" 至 \"$5\"",
        "logentry-contentmodel-change-revertlink": "還原",
        "undeleteviewlink": "檢視",
        "undeleteinvert": "反向選擇",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "{{PLURAL:$1|$1 個修訂}}已還原",
-       "undeletedrevisions-files": "{{PLURAL:$1|$1 個修訂}}與 {{PLURAL:$2|$2 個檔案}}已還原",
-       "undeletedfiles": "{{PLURAL:$1|$1}} 個檔案已還原",
        "cannotundelete": "部份或全部的取消刪除失敗:\n$1",
        "undeletedpage": "<strong>$1 已還原</strong>\n\n請參考 [[Special:Log/delete|刪除日誌]] 以查詢最近刪除及還原的記錄。",
        "undelete-header": "請參考 [[Special:Log/delete|刪除日誌]] 查詢最近刪除的頁面。",
        "sp-contributions-username": "IP 位址或使用者名稱:",
        "sp-contributions-toponly": "只顯示最新修訂的編輯",
        "sp-contributions-newonly": "只顯示建立頁面的編輯",
-       "sp-contributions-hideminor": "隱藏小修訂",
+       "sp-contributions-hideminor": "隱藏次要編輯",
        "sp-contributions-submit": "搜尋",
        "whatlinkshere": "連結至此的頁面",
        "whatlinkshere-title": "連結至 \"$1\" 的頁面",
        "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",
        "ipbhidename": "在編輯及清單中隱藏使用者名稱",
        "ipbwatchuser": "監視這位使用者的使用者頁面及其對話頁面",
-       "ipb-disableusertalk": "阻止此使用者在封期間編輯自己的對話頁面",
+       "ipb-disableusertalk": "阻止此使用者在封期間編輯自己的對話頁面",
        "ipb-change-block": "使用現有設定重新封鎖使用者",
        "ipb-confirm": "確認封鎖",
        "badipaddress": "無效的 IP 位址",
        "unblocked-id": "已經移除 $1 的封鎖。",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] 已解除封鎖。",
        "blocklist": "已封鎖的使用者",
+       "autoblocklist-submit": "搜尋",
        "ipblocklist": "已封鎖的使用者",
        "ipblocklist-legend": "搜尋已封鎖的使用者",
        "blocklist-userblocks": "隱藏帳號封鎖",
        "emailblock": "停用電子郵件",
        "blocklist-nousertalk": "無法編輯自己的對話頁面",
        "ipblocklist-empty": "封鎖清單為空。",
-       "ipblocklist-no-results": "è¦\81求的 IP 位址或使用者名稱尚未被封鎖。",
+       "ipblocklist-no-results": "è«\8b求的 IP 位址或使用者名稱尚未被封鎖。",
        "blocklink": "封鎖",
        "unblocklink": "解除封鎖",
        "change-blocklink": "變更封鎖",
        "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯絡您的網路服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
        "sorbsreason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。",
        "sorbs_create_account_reason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。\n您不能建立帳號。",
-       "softblockrangesreason": "您的IP位址($1)不允許匿名貢獻,請登入。",
+       "softblockrangesreason": "您的 IP 位址 ($1) 不允許匿名貢獻,請登入。",
        "xffblockreason": "您的 IP 位址使用 X-Forwarded-For 標頭,您或您使用的代理伺服器已被封鎖。\n封鎖的原因為:$1",
        "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
        "ipbblocked": "因您已被封鎖,故無法封鎖或解除封鎖其他使用者。",
        "cant-move-category-page": "您沒有權限移動分類頁面。",
        "cant-move-to-category-page": "您沒有權限移動頁面至分類頁面。",
        "cant-move-subpages": "您沒有權限移動子頁面。",
-       "namespace-nosubpages": "å\90\8då­\97空é\96\93ã\80\8c$1ã\80\8d不允許有子頁面。",
+       "namespace-nosubpages": "å\91½å\90\8d空é\96\93 \"$1\" 不允許有子頁面。",
        "newtitle": "新標題:",
        "move-watch": "監視來源以及目標頁面",
        "movepagebtn": "移動頁面",
        "import": "匯入頁面",
        "importinterwiki": "從其他 wiki 匯入",
        "import-interwiki-text": "請選擇一個 Wiki 與頁面標題以進行匯入。\n會同時記錄修訂日期和編輯者的名稱。\n所有的從跨 Wiki 匯入操作都會被記錄在 [[Special:Log/import|匯入日誌]]。",
-       "import-interwiki-sourcewiki": "來源 wiki:",
+       "import-interwiki-sourcewiki": "來源 Wiki:",
        "import-interwiki-sourcepage": "來源頁面:",
        "import-interwiki-history": "複製此頁面的所有歷史修訂",
        "import-interwiki-templates": "包含所有模板",
        "tooltip-n-mainpage-description": "前往首頁",
        "tooltip-n-portal": "關於本專案、您可以做什麼、哪裡可以找到您需要的事物",
        "tooltip-n-currentevents": "於新聞事件中找到相關背景資料",
-       "tooltip-n-recentchanges": "列出此 Wiki 中的最近變更清單",
+       "tooltip-n-recentchanges": "列出此 Wiki 中的近期變更清單",
        "tooltip-n-randompage": "隨機進入一個頁面",
        "tooltip-n-help": "尋求協助的地方",
        "tooltip-t-whatlinkshere": "列出所有連結此頁面的頁面",
-       "tooltip-t-recentchangeslinked": "此頁面連結至其他頁面的最近變更",
+       "tooltip-t-recentchangeslinked": "此頁面連結至其他頁面的近期變更",
        "tooltip-feed-rss": "此頁面的 RSS 來源",
        "tooltip-feed-atom": "此頁面的 Atom 來源",
        "tooltip-t-contributions": "{{GENDER:$1|此使用者}}的貢獻清單",
        "tooltip-ca-nstab-template": "檢視模板",
        "tooltip-ca-nstab-help": "檢視說明頁面",
        "tooltip-ca-nstab-category": "檢視分類頁面",
-       "tooltip-minoredit": "標記為小修訂",
+       "tooltip-minoredit": "標記此為次要編輯",
        "tooltip-save": "儲存您的變更",
        "tooltip-publish": "發佈您的更改",
        "tooltip-preview": "請在儲存前預覽您的變更!",
        "markaspatrolledtext-file": "標記此檔案版本為己巡查",
        "markedaspatrolled": "標記為已巡查",
        "markedaspatrolledtext": "已標記選擇的修訂 [[:$1]] 為已巡查。",
-       "rcpatroldisabled": "最近變更巡查已停用",
+       "rcpatroldisabled": "近期變更巡查已停用",
        "rcpatroldisabledtext": "最新變更巡查的功能目前已停用。",
        "markedaspatrollederror": "無法標記為已巡查",
        "markedaspatrollederrortext": "您需指定要標記為已巡查的修訂。",
        "newimages-summary": "此特殊頁面中顯示最新上傳的檔案。",
        "newimages-legend": "搜尋",
        "newimages-label": "檔案名稱 (或部份檔名):",
+       "newimages-user": "IP 位址或使用者名稱",
        "newimages-showbots": "顯示由機器人上傳的檔案",
        "newimages-hidepatrolled": "隱藏己巡查上傳",
        "noimages": "無任何圖片。",
        "variantname-gan-hans": "‪中文(简体)",
        "variantname-gan-hant": "‪中文(繁體)",
        "metadata": "詮釋資料",
-       "metadata-help": "æ­¤æ\96\87件中å\8c\85å\90«é¡\8då¤\96ä¿¡æ\81¯ã\80\82é\80\99äº\9bä¿¡æ\81¯å\8f¯è\83½æ\98¯ç\94±æ\95¸ç¢¼ç\9b¸æ©\9fæ\88\96æ\8e\83æ\8f\8få\84\80å\9c¨å\89µå»ºæ\88\96æ\95¸å­\97å\8c\96é\81\8eç¨\8b中æ\89\80æ·»å\8a ç\9a\84ã\80\82å¦\82æ\9e\9cæ\96\87件è\87ªå\88\9då§\8bç\8b\80æ\85\8bå·²å\8f\97å\88°ä¿®æ\94¹ï¼\8cä¸\80äº\9b詳細說æ\98\8eå\8f¯è\83½ç\84¡æ³\95å\8f\8dæ\98 ä¿®æ\94¹å¾\8cç\9a\84æ\96\87件。",
+       "metadata-help": "æ­¤æª\94æ¡\88中å\8c\85å\90«å\85¶ä»\96è³\87è¨\8aï¼\8cé\80\99äº\9bè³\87è¨\8aå\8f¯è\83½æ\98¯ç\94±æ\95¸ä½\8dç\9b¸æ©\9fæ\88\96æ\8e\83æ\8f\8få\99¨å\9c¨å»ºç«\8bæ\88\96æ\95¸ä½\8då\8c\96é\81\8eç¨\8b中æ\89\80æ\96°å¢\9eç\9a\84ã\80\82è\8b¥æª\94æ¡\88è\87ªå\8e\9få§\8bç\8b\80æ\85\8b已被修æ\94¹ï¼\8cä¸\80äº\9b詳細è³\87æ\96\99å\8f¯è\83½ç\84¡æ³\95å®\8cæ\95´å\8f\8dæ\98 å\87ºå·²ä¿®æ\94¹ç\9a\84æª\94æ¡\88。",
        "metadata-expand": "顯示詳細資料",
        "metadata-collapse": "隱藏詳細資料",
        "metadata-fields": "在本訊息中所列出的 EXIF 詮釋資料域將包含在圖片顯示頁面,當詮釋資料表損壞時只顯示以下訊息。\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",
        "confirmemail_body_set": "不明人士 (可能是您自己,來自 IP 位址 $1) 已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件地址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以開啟在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_invalidated": "已取消電子郵件地址確認",
        "invalidateemail": "取消電子郵件確認",
-       "notificationemail_subject_changed": "{{SITENAME}} 註冊的電子郵件址已變更",
-       "notificationemail_subject_removed": "{{SITENAME}} 註冊的電子郵件址已移除",
-       "notificationemail_body_changed": "來自IP位址$1的某個人(可能是您),在{{SITENAME}}上將帳號\"$2\"的電子郵件位址改成\"$3\"。\n\n如果非您本人所為,請立即跟網站管理員聯繫。",
-       "notificationemail_body_removed": "來自IP位址$1的某人(可能是您),在{{SITENAME}}上移除了帳號$2的電子郵件位址。\n\n如果非您本人所為,請立即跟網站管理員聯繫。",
+       "notificationemail_subject_changed": "{{SITENAME}} 註冊的電子郵件址已變更",
+       "notificationemail_subject_removed": "{{SITENAME}} 註冊的電子郵件址已移除",
+       "notificationemail_body_changed": "來自 IP 位址 $1 的某個人 (可能是您) ,在{{SITENAME}}上將帳號\"$2\"的電子郵件地址改成\"$3\"。\n\n如果非您本人所為,請立即跟網站管理員聯繫。",
+       "notificationemail_body_removed": "來自 IP 位址 $1 的某人 (可能是您) ,在{{SITENAME}}上移除了帳號 $2 的電子郵件地址。\n\n如果非您本人所為,請立即跟網站管理員聯繫。",
        "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
        "scarytranscludefailed": "[模板 $1 讀取失敗]",
        "scarytranscludefailed-httpstatus": "[模板 $1 讀取失敗:HTTP $2]",
        "comma-separator": ",",
        "colon-separator": ":",
        "word-separator": "",
+       "ellipsis": "…",
        "parentheses": " ($1)",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← 上一頁",
        "specialpages-group-maintenance": "維護報表",
        "specialpages-group-other": "其它特殊頁面",
        "specialpages-group-login": "登入 / 建立帳號",
-       "specialpages-group-changes": "最近變更與日誌",
+       "specialpages-group-changes": "近期變更與日誌",
        "specialpages-group-media": "媒體上傳與報表",
        "specialpages-group-users": "使用者與權限",
        "specialpages-group-highuse": "常用頁面",
        "specialpages-group-spam": "反垃圾訊息工具",
        "specialpages-group-developer": "開發人員工具",
        "blankpage": "空白頁面",
-       "intentionallyblankpage": "此頁面被故意設為空白。",
+       "intentionallyblankpage": "此頁故意留白。",
        "external_image_whitelist": " #請勿修改本行文字<pre>\n#請於下方填寫正規表示法 (只需 // 之間的內容)\n#將會檢查外部連結的圖片是否符合這些條件\n#符合條件的連結會以圖片顯示,否則只顯示連結\n#以 # 開頭的行會被做為註解\n#此條件不區分大小寫\n\n#請將所有正規表示法輸入在此行上方,請勿修改本行文字</pre>",
        "tags": "有效變更標籤",
        "tag-filter": "[[Special:Tags|標籤]]搜尋:",
        "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-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",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|已暗中變更}} $3 中日誌的可見性",
        "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|已暗中更改}}頁面 $3 中修訂的可見性",
        "revdelete-content-hid": "已隱藏內容",
-       "revdelete-summary-hid": "已隱藏摘要",
+       "revdelete-summary-hid": "已隱藏編輯摘要",
        "revdelete-uname-hid": "隱藏使用者名稱",
        "revdelete-content-unhid": "取消隱藏內容",
        "revdelete-summary-unhid": "取消隱藏編輯摘要",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|已更新}}標籤於頁面 $3 的修訂 $4 ({{PLURAL:$7|加入}} $6; {{PLURAL:$9|移除}} $8)。",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|已更新}}標籤於頁面 $3 的日誌項目 $5 ({{PLURAL:$7|加入}} $6; {{PLURAL:$9|移除}} $8)。",
        "rightsnone": "(無)",
-       "revdelete-summary": "編輯摘要",
+       "rightslogentry-temporary-group": "$1 (臨時,直到 $2)",
        "feedback-adding": "正在新增意見回饋至頁面...",
        "feedback-back": "返回",
        "feedback-bugcheck": "很好! 檢查一下您的意見是不是已經被列為 [$1 已知問題]。",
        "pagelang-reason": "原因",
        "pagelang-submit": "送出",
        "pagelang-nonexistent-page": "頁面 $1 不存在。",
-       "pagelang-unchanged-language": "頁面$1的語言已經設為$2。",
-       "pagelang-unchanged-language-default": "頁面$1的語言已經設為wiki的預設內容語言。",
+       "pagelang-unchanged-language": "頁面 $1 的語言已經設為 $2。",
+       "pagelang-unchanged-language-default": "頁面 $1 的語言已經設為 wiki 的預設內容語言。",
        "pagelang-db-failed": "資料庫更改頁面語言失敗。",
        "right-pagelang": "變更頁面語言",
        "action-pagelang": "變更頁面語言",
        "mw-widgets-titleinput-description-new-page": "頁面不存在",
        "mw-widgets-titleinput-description-redirect": "重新導向至 $1",
        "mw-widgets-categoryselector-add-category-placeholder": "加入分類...",
+       "mw-widgets-usersmultiselect-placeholder": "加入更多...",
        "sessionmanager-tie": "無法合併多個請求認証類型:$1。",
        "sessionprovider-generic": "$1 連線階段",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "以 cookie 為基礎的連線階段",
        "authmanager-authn-no-local-user": "提供的憑證沒有與任何在此 wiki 上的使用者相關聯。",
        "authmanager-authn-no-local-user-link": "提供的憑證有效但沒有與任何在此 wiki 上的使用者相關聯。請採用其他方式登入,或建立新使用者,您將會有選項可以連結您先前的憑證到新帳號。",
        "authmanager-authn-autocreate-failed": "自動建立本地帳號失敗:$1",
-       "authmanager-change-not-supported": "提供的認證無法變更,因為尚無法使用。",
+       "authmanager-change-not-supported": "提供的憑証無法變更,因為尚無法使用。",
        "authmanager-create-disabled": "已關閉帳號自動建立。",
        "authmanager-create-from-login": "要建立您的帳號,請先填寫此欄位。",
        "authmanager-create-not-in-progress": "帳號建立尚未進行或連線階段資料已遺失,請重頭再開始。",
        "authpage-cannot-link-continue": "無法繼續帳號連結,您的連線階段似乎已逾時。",
        "cannotauth-not-allowed-title": "權限不足",
        "cannotauth-not-allowed": "您不被允許使用此頁面",
-       "changecredentials": "變更認證",
+       "changecredentials": "變更憑証",
        "changecredentials-submit": "變更認證",
        "changecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
        "changecredentials-success": "已變更您的認證。",
-       "removecredentials": "移除認證",
+       "removecredentials": "移除憑証",
        "removecredentials-submit": "移除認證",
        "removecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
        "removecredentials-success": "已移除您的憑證。",
-       "credentialsform-provider": "認證類型:",
+       "credentialsform-provider": "憑証類型:",
        "credentialsform-account": "帳號名稱:",
        "cannotlink-no-provider-title": "沒有可連結的帳號",
        "cannotlink-no-provider": "沒有可連結的帳號。",
        "unlinkaccounts": "取消連結帳號",
        "unlinkaccounts-success": "已取消連結帳號。",
        "authenticationdatachange-ignored": "認証資料變更未被處理,可能未設定提供者?",
-       "userjsispublic": "è«\8b注æ\84\8fï¼\9aJavaScript å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ\86\91証資料。",
-       "usercssispublic": "è«\8b注æ\84\8fï¼\9aCSS å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ\86\91証資料。",
+       "userjsispublic": "è«\8b注æ\84\8fï¼\9aJavaScript å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ©\9få¯\86資料。",
+       "usercssispublic": "è«\8b注æ\84\8fï¼\9aCSS å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ©\9få¯\86資料。",
        "restrictionsfield-badip": "無效的 IP 位址或範圍:$1",
        "restrictionsfield-label": "允許的 IP 範圍:",
        "restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "修訂 $1",
-       "pageid": "頁面 ID $1"
+       "pageid": "頁面 ID $1",
+       "rawhtml-notallowed": "&lt;html&gt; 標籤無法在一般頁面之外使用。"
 }
index d99a721..8a43998 100644 (file)
@@ -317,7 +317,7 @@ $magicWords = [
        'pagesincategory_files'     => [ '0', 'فايلات', 'ملفات', 'files' ],
 ];
 
-// (bug 16469) Override Eastern Arabic numberals, use Western
+// (T18469) Override Eastern Arabic numberals, use Western
 $digitTransformTable = [
        '0' => '0',
        '1' => '1',
diff --git a/languages/messages/MessagesAtj.php b/languages/messages/MessagesAtj.php
new file mode 100644 (file)
index 0000000..69bcaa5
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Atikamekw
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'fr';
index b38287e..3ccd3c4 100644 (file)
@@ -129,20 +129,79 @@ $specialPageAliases = [
 
 $magicWords = [
        'redirect'                  => [ '0', '#REDIRECCIÓ', '#REDIRECCIO', '#REDIRECT' ],
-       'numberofarticles'          => [ '1', 'NOMBRED\'ARTICLES', 'NUMBEROFARTICLES' ],
-       'numberoffiles'             => [ '1', 'NOMBRED\'ARXIUS', 'NUMBEROFFILES' ],
-       'numberofusers'             => [ '1', 'NOMBRED\'USUARIS', 'NUMBEROFUSERS' ],
-       'numberofedits'             => [ '1', 'NOMBRED\'EDICIONS', 'NUMBEROFEDITS' ],
-       'pagename'                  => [ '1', 'NOMDELAPLANA', 'PAGENAME' ],
+       'notoc'                     => [ '0', '__CAPTAULA__', '__NOTAULA__', '__NOTOC__' ],
+       'nogallery'                 => [ '0', '__CAPGALERIA__', '__NOGALERIA__', '__NOGALLERY__' ],
+       'forcetoc'                  => [ '0', '__FORÇATAULA__', '__FORCETOC__' ],
+       'toc'                       => [ '0', '__TAULA__', '__RESUM__', '__TDM__', '__TOC__' ],
+       'noeditsection'             => [ '0', '__SECCIÓNOEDITABLE__', '__SECCIONOEDITABLE__', '__NOEDITSECTION__' ],
+       'currentmonth'              => [ '1', 'MESACTUAL', 'CURRENTMONTH', 'CURRENTMONTH2' ],
+       'currentmonthname'          => [ '1', 'NOMMESACTUAL', 'CURRENTMONTHNAME' ],
+       'currentmonthnamegen'       => [ '1', 'NOMGENMESACTUAL', 'CURRENTMONTHNAMEGEN' ],
+       'currentmonthabbrev'        => [ '1', 'ABREVMESACTUAL', 'CURRENTMONTHABBREV' ],
+       'currentday'                => [ '1', 'DIAACTUAL', 'CURRENTDAY' ],
+       'currentday2'               => [ '1', 'DIAACTUAL2', 'CURRENTDAY2' ],
+       'currentdayname'            => [ '1', 'NOMDIAACTUAL', 'CURRENTDAYNAME' ],
+       'currentyear'               => [ '1', 'ANYACTUAL', 'CURRENTYEAR' ],
+       'currenttime'               => [ '1', 'HORARICTUAL', 'CURRENTTIME' ],
+       'currenthour'               => [ '1', 'HORAACTUAL', 'CURRENTHOUR' ],
+       'localmonth'                => [ '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ],
+       'localmonthname'            => [ '1', 'NOMMESLOCAL', 'LOCALMONTHNAME' ],
+       'localmonthnamegen'         => [ '1', 'NOMGENMESLOCAL', 'LOCALMONTHNAMEGEN' ],
+       'localmonthabbrev'          => [ '1', 'ABREVMESLOCAL', 'LOCALMONTHABBREV' ],
+       'localday'                  => [ '1', 'DIALOCAL', 'LOCALDAY' ],
+       'localday2'                 => [ '1', 'DIALOCAL2', 'LOCALDAY2' ],
+       'localdayname'              => [ '1', 'NOMDIALOCAL', 'LOCALDAYNAME' ],
+       'localyear'                 => [ '1', 'ANYLOCAL', 'LOCALYEAR' ],
+       'localtime'                 => [ '1', 'HORARILOCAL', 'LOCALTIME' ],
+       'localhour'                 => [ '1', 'HORALOCAL', 'LOCALHOUR' ],
+       'numberofarticles'          => [ '1', 'NOMBREARTICLES', 'NOMBRED\'ARTICLES', 'NUMBEROFARTICLES' ],
+       'numberoffiles'             => [ '1', 'NOMBREFITXERS', 'NOMBRED\'ARXIUS', 'NUMBEROFFILES' ],
+       'numberofusers'             => [ '1', 'NOMBREUSUARIS', 'NOMBRED\'USUARIS', 'NUMBEROFUSERS' ],
+       'numberofedits'             => [ '1', 'NOMBREEDICIONS', 'NOMBRED\'EDICIONS', 'NUMBEROFEDITS' ],
+       'pagename'                  => [ '1', 'NOMPÀGINA', 'NOMPAGINA', 'NOMDELAPLANA', 'PAGENAME' ],
+       'img_thumbnail'             => [ '1', 'miniatura', 'thumb', 'thumbnail' ],
+       'img_manualthumb'           => [ '1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ],
        'img_right'                 => [ '1', 'dreta', 'right' ],
        'img_left'                  => [ '1', 'esquerra', 'left' ],
+       'img_none'                  => [ '1', 'cap', 'none' ],
+       'img_width'                 => [ '1', '$1px' ],
+       'img_center'                => [ '1', 'center', 'centre' ],
+       'img_framed'                => [ '1', 'marc', 'frame', 'framed', 'enframed' ],
+       'img_frameless'             => [ '1', 'sense marc', 'frameless' ],
+       'img_lang'                  => [ '1', 'lang=$1', 'llengua=$1', 'idioma=$1' ],
+       'img_page'                  => [ '1', 'pàgina=$1', 'pàgina $1', 'page=$1', 'page $1' ],
+       'img_upright'               => [ '1', 'redreçat', 'upright', 'redreçat=$1', 'upright=$1', 'redreçat $1', 'upright $1' ],
        'img_border'                => [ '1', 'vora', 'border' ],
+       'img_baseline'              => [ '1', 'línia de base', 'baseline' ],
+       'img_sub'                   => [ '1', 'sub' ],
+       'img_super'                 => [ '1', 'super', 'sup' ],
+       'img_top'                   => [ '1', 'dalt', 'top' ],
+       'img_text_top'              => [ '1', 'dalt-text', 'text-top' ],
+       'img_middle'                => [ '1', 'mitjà', 'middle' ],
+       'img_bottom'                => [ '1', 'baix', 'bottom' ],
+       'img_text_bottom'           => [ '1', 'baix-text', 'text-bottom' ],
        'img_link'                  => [ '1', 'enllaç=$1', 'link=$1' ],
-       'displaytitle'              => [ '1', 'TÍTOL', 'DISPLAYTITLE' ],
-       'language'                  => [ '0', '#IDIOMA:', '#LANGUAGE:' ],
+       'img_alt'                   => [ '1', 'alt=$1' ],
+       'img_class'                 => [ '1', 'class=$1' ],
+       'displaytitle'              => [ '1', 'TÍTOL', 'TITOL', 'DISPLAYTITLE' ],
+       'currentversion'            => [ '1', 'VERSIÓACTUAL', 'VERSIOACTUAL', 'CURRENTVERSION' ],
+       'language'                  => [ '0', '#IDIOMA:', '#LLENGUA:', '#LANGUAGE:' ],
+       'contentlanguage'           => [ '1', 'IDIOMACONTINGUT', 'LLENGUACONTINGUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ],
+       'pagesinnamespace'          => [ '1', 'PÀGINESENESPAINOMS:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ],
+       'numberofadmins'            => [ '1', 'NOMBREADMINS', 'NUMBEROFADMINS' ],
+       'formatnum'                 => [ '0', 'FORMATNOMBRE', 'FORMATNUM' ],
+       'padleft'                   => [ '0', 'SEPARACIÓESQUERRA', 'SEPARACIOESQUERRA', 'PADLEFT' ],
+       'padright'                  => [ '0', 'SEPARACIÓDRETA', 'SEPARACIODRETA', 'PADRIGHT' ],
        'special'                   => [ '0', 'especial', 'special' ],
        'defaultsort'               => [ '1', 'ORDENA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ],
-       'pagesize'                  => [ '1', 'MIDADELAPLANA', 'PAGESIZE' ],
+       'filepath'                  => [ '0', 'CAMÍ:', 'CAMI:', 'FILEPATH:' ],
+       'tag'                       => [ '0', 'etiqueta', 'marcador', 'tag' ],
+       'hiddencat'                 => [ '1', '__CATAMAGADA__', '__HIDDENCAT__' ],
+       'pagesincategory'           => [ '1', 'PÀGINESENCATEGORIA', 'PAGINESENCATEGORIA', 'PAGINESENCAT', 'PAGESINCATEGORY', 'PAGESINCAT' ],
+       'pagesize'                  => [ '1', 'MIDAPÀGINA', 'MIDAPAGINA', 'MIDADELAPLANA', 'PAGESIZE' ],
+       'noindex'                   => [ '1', '__CAPINDEX__', '__NOINDEX__' ],
+       'staticredirect'            => [ '1', '__REDIRECCIÓESTATICA__', '__REDIRECCIOESTATICA__', '__STATICREDIRECT__' ],
+       'protectionlevel'           => [ '1', 'NIVELLPROTECCIÓ', 'NIVELLPROTECCIO', 'PROTECTIONLEVEL' ],
 ];
 
 $separatorTransformTable = [ ',' => '.', '.' => ',' ];
index 90f1128..94b0a34 100644 (file)
@@ -106,10 +106,10 @@ $specialPageAliases = [
        'Mostlinkedtemplates'       => [ 'Nejpoužívanější_šablony', 'Nejpouzivanejsi_sablony' ],
        'Mostrevisions'             => [ 'Stránky_s_nejvíce_editacemi', 'Stranky_s_nejvice_editacemi', 'Stránky_s_nejvyšším_počtem_editací' ],
        'Movepage'                  => [ 'Přesunout_stránku', 'Přejmenovat_stránku' ],
-       'Mycontributions'           => [ 'Mé_příspěvky', 'Me_prispevky' ],
+       'Mycontributions'           => [ 'Moje_příspěvky', 'Mé_příspěvky', 'Me_prispevky' ],
        'MyLanguage'                => [ 'V_mém_jazyce', 'Můj_jazyk' ],
-       'Mypage'                    => [ 'Moje_stránka', 'Moje_stranka' ],
-       'Mytalk'                    => [ 'Moje_diskuse' ],
+       'Mypage'                    => [ 'Moje_stránka', 'Moje_stranka', 'Má_stránka' ],
+       'Mytalk'                    => [ 'Moje_diskuse', 'Má_diskuse' ],
        'Myuploads'                 => [ 'Moje_soubory', 'Mé_soubory' ],
        'Newimages'                 => [ 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ],
        'Newpages'                  => [ 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ],
index 160f57d..60e08cc 100644 (file)
@@ -217,8 +217,8 @@ $magicWords = [
        'img_framed'                => [ '1', 'gerahmt', 'frame', 'framed', 'enframed' ],
        'img_frameless'             => [ '1', 'rahmenlos', 'frameless' ],
        'img_lang'                  => [ '1', 'sprache=$1', 'lang=$1' ],
-       'img_page'                  => [ '1', 'seite=$1', 'seite_$1', 'page=$1', 'page $1' ],
-       'img_upright'               => [ '1', 'hochkant', 'hochkant=$1', 'hochkant_$1', 'upright', 'upright=$1', 'upright $1' ],
+       'img_page'                  => [ '1', 'seite=$1', 'seite $1', 'seite_$1', 'page=$1', 'page $1' ],
+       'img_upright'               => [ '1', 'hochkant', 'hochkant=$1', 'hochkant $1', 'hochkant_$1', 'upright', 'upright=$1', 'upright $1' ],
        'img_border'                => [ '1', 'rand', 'border' ],
        'img_baseline'              => [ '1', 'grundlinie', 'baseline' ],
        'img_sub'                   => [ '1', 'tief', 'tiefgestellt', 'sub' ],
diff --git a/languages/messages/MessagesDin.php b/languages/messages/MessagesDin.php
new file mode 100644 (file)
index 0000000..8b3d09d
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+/** Dinka (Thuɔŋjäŋ)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$namespaceNames = [
+       NS_MEDIA            => 'Ciɛl',
+       NS_SPECIAL          => 'Këcëweek',
+       NS_TALK             => 'Jam',
+       NS_USER             => 'Dulooi',
+       NS_USER_TALK        => 'Jam_kekë_dulooi',
+       NS_PROJECT_TALK     => 'Jam_wɛ̈t_ë_$1',
+       NS_FILE             => 'Apamduööt',
+       NS_FILE_TALK        => 'Jam_wɛ̈t_ë_apamduööt',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'Jam_wɛ̈t_ë_MediaWiki',
+       NS_TEMPLATE         => 'Macuëc',
+       NS_TEMPLATE_TALK    => 'Jam_wɛ̈t_ë_macuëc',
+       NS_HELP             => 'Kuɔny',
+       NS_HELP_TALK        => 'Jam_wɛ̈t_ë_kuɔny',
+       NS_CATEGORY         => 'Bekätakthook',
+       NS_CATEGORY_TALK    => 'Jam_wɛ̈t_ë_bekätakthook',
+];
+
+$linkTrail = '/^([äëɛɛ̈éɣïŋöɔɔ̈óa-z]+)(.*)$/sDu';
index 4dedc47..7adf9c0 100644 (file)
@@ -8,4 +8,23 @@
  *
  */
 
+$namespaceNames = [
+       NS_MEDIA            => 'मिडिया',
+       NS_SPECIAL          => 'बिशेष',
+       NS_TALK             => 'कुरणि',
+       NS_USER             => 'प्रयोगकर्ता',
+       NS_USER_TALK        => 'प्रयोगकर्ता_कुरणि',
+       NS_PROJECT_TALK     => '$1_वार्ता',
+       NS_FILE             => 'चित्र',
+       NS_FILE_TALK        => 'चित्र_कुरणि',
+       NS_MEDIAWIKI        => 'मिडियाविकि',
+       NS_MEDIAWIKI_TALK   => 'मिडियाविकि_कुरणि',
+       NS_TEMPLATE         => 'ढाँचा',
+       NS_TEMPLATE_TALK    => 'ढाँचा_कुरणि',
+       NS_HELP             => 'मद्दत',
+       NS_HELP_TALK        => 'मद्दत_कुरणि',
+       NS_CATEGORY         => 'श्रेणी',
+       NS_CATEGORY_TALK    => 'श्रेणी_कुरणि',
+];
+
 $fallback = 'ne';
index 689586b..ac9f1b7 100644 (file)
@@ -105,7 +105,7 @@ $namespaceAliases = [];
  * Example:
  * @code
  * $namespaceGenderAliases = [
- *     NS_USER => [ 'male' => 'Male_user', 'female' => 'Female_user' ],
+ *   NS_USER => [ 'male' => 'Male_user', 'female' => 'Female_user' ],
  * ];
  * @endcode
  */
@@ -400,6 +400,7 @@ $specialPageAliases = [
        'ApiHelp'                   => [ 'ApiHelp' ],
        'ApiSandbox'                => [ 'ApiSandbox' ],
        'Ancientpages'              => [ 'AncientPages' ],
+       'AutoblockList'             => [ 'AutoblockList', 'ListAutoblocks' ],
        'Badtitle'                  => [ 'Badtitle' ],
        'Blankpage'                 => [ 'BlankPage' ],
        'Block'                     => [ 'Block', 'BlockIP', 'BlockUser' ],
@@ -427,6 +428,7 @@ $specialPageAliases = [
        'Fewestrevisions'           => [ 'FewestRevisions' ],
        'FileDuplicateSearch'       => [ 'FileDuplicateSearch' ],
        'Filepath'                  => [ 'FilePath' ],
+       'GoToInterwiki'             => [ 'GoToInterwiki' ],
        'Import'                    => [ 'Import' ],
        'Invalidateemail'           => [ 'InvalidateEmail' ],
        'JavaScriptTest'            => [ 'JavaScriptTest' ],
index 01bd00c..d7a780e 100644 (file)
@@ -44,7 +44,7 @@ $specialPageAliases = [
        'Allpages'                  => [ 'Todas', 'Todas_las_páginas' ],
        'Ancientpages'              => [ 'PáginasAntiguas', 'Páginas_antiguas' ],
        'Badtitle'                  => [ 'Título_incorrecto' ],
-       'Blankpage'                 => [ 'Blanquear_página', 'PáginaEnBlanco', 'BlanquearPágina', 'Página_en_blanco' ],
+       'Blankpage'                 => [ 'PáginaEnBlanco', 'Blanquear_página', 'BlanquearPágina', 'Página_en_blanco' ],
        'Block'                     => [ 'Bloquear' ],
        'Booksources'               => [ 'FuentesDeLibros', 'Fuentes_de_libros' ],
        'BrokenRedirects'           => [ 'RedireccionesRotas', 'Redirecciones_rotas' ],
index 28c69df..fcc12c9 100644 (file)
@@ -15,8 +15,8 @@ $namespaceNames = [
        NS_USER             => 'Kasutaja',
        NS_USER_TALK        => 'Kasutaja_arutelu',
        NS_PROJECT_TALK     => '{{GRAMMAR:genitive|$1}}_arutelu',
-       NS_FILE             => 'Pilt',
-       NS_FILE_TALK        => 'Pildi_arutelu',
+       NS_FILE             => 'Fail',
+       NS_FILE_TALK        => 'Faili_arutelu',
        NS_MEDIAWIKI        => 'MediaWiki',
        NS_MEDIAWIKI_TALK   => 'MediaWiki_arutelu',
        NS_TEMPLATE         => 'Mall',
@@ -29,6 +29,8 @@ $namespaceNames = [
 
 $namespaceAliases = [
        '$1_arutelu' => NS_PROJECT_TALK,
+       'Pilt' => NS_FILE,
+       'Pildi_arutelu' => NS_FILE_TALK,
 ];
 
 $specialPageAliases = [
index bf65812..c74d37b 100644 (file)
@@ -105,4 +105,4 @@ $magicWords = [
        'img_center'                => [ '1', 'erdian', 'center', 'centre' ],
 ];
 
-$separatorTransformTable = [ ',' => '.', '.' => ',' ]; /* Bug 15717 */
+$separatorTransformTable = [ ',' => '.', '.' => ',' ]; /* T17717 */
index 6281208..e034035 100644 (file)
@@ -28,5 +28,5 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Ñemohenda_myangekõi',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
index 256abd7..d5f8f75 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 
-# $fallback = 'ru'; // bug 27785
+# $fallback = 'ru'; // T29785
 
 $namespaceNames = [
        NS_MEDIA            => 'Медиа',
diff --git a/languages/messages/MessagesKbp.php b/languages/messages/MessagesKbp.php
new file mode 100644 (file)
index 0000000..c473933
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Kabiyè (Kabɩyɛ)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'fr';
index bb18959..f12be20 100644 (file)
@@ -70,7 +70,7 @@ $namespaceAliases = [
        'Diskusyón_de_Katēggoría'  => NS_CATEGORY_TALK,
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
 
 $specialPageAliases = [
index a44e0ac..6a71ca7 100644 (file)
@@ -18,5 +18,5 @@ $namespaceGenderAliases = [];
 
 $linkPrefixExtension = true;
 
-# Same as the French (bug 8485)
+# Same as the French (T10485)
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
index 767a305..2aa25ad 100644 (file)
@@ -36,7 +36,7 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Neneuhcāyōtl_tēixnāmiquiliztli',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
 
 $namespaceAliases = [
index d7b5bea..01a9d1a 100644 (file)
@@ -120,7 +120,7 @@ $dateFormats = [
 
 $fallback8bitEncoding = 'iso-8859-2';
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", // @bug 2749
+       ',' => "\xc2\xa0", // T4749
        '.' => ','
 ];
 
index fcbdac4..65ce3d8 100644 (file)
@@ -37,3 +37,11 @@ $namespaceNames = [
        NS_CATEGORY         => 'گٹھ',
        NS_CATEGORY_TALK    => 'گٹھ_گل_بات',
 ];
+
+$namespaceAliases = [
+       'تصویر' => NS_FILE,
+];
+
+$magicWords = [
+       'redirect' => [ '0', '#مڑجوڑ', '#REDIRECT' ],
+];
index f020303..78503cc 100644 (file)
@@ -111,7 +111,7 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-$linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # Bug 21168, 27633
+$linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # T23168, T29633
 
 $specialPageAliases = [
        'Activeusers'               => [ 'Utilizadores_activos' ],
index d8282dc..8488159 100644 (file)
@@ -36,7 +36,7 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Katiguriya_rimanakuy',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
 
 $specialPageAliases = [
index 523783e..e960abd 100644 (file)
@@ -32,5 +32,5 @@ $namespaceNames = [
        NS_CATEGORY_TALK    => 'Samiyachiy_rimanakuy',
 ];
 
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
 $namespaceGenderAliases = [];
index 01c33ee..d2ce357 100644 (file)
@@ -321,7 +321,7 @@ $magicWords = [
 
 $linkTrail = '/^([a-zåäöéÅÄÖÉ]+)(.*)$/sDu';
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", // @bug 2749
+       ',' => "\xc2\xa0", // T4749
        '.' => ','
 ];
 
index 797e443..c30e963 100644 (file)
@@ -44,7 +44,7 @@ $namespaceNames = [
 ];
 
 $namespaceAliases = [
-       // Aliases for Polish namespaces (bug 34988).
+       // Aliases for Polish namespaces (T36988).
        'Specjalna'            => NS_SPECIAL,
        'Dyskusja'             => NS_TALK,
        'Użytkownik'           => NS_USER,
index 8e1020b..4f385cf 100644 (file)
@@ -50,7 +50,7 @@ $namespaceNames = [
 $namespaceAliases = [
        'సభ్యులు' => NS_USER,
        'సభ్యులపై_చర్చ' => NS_USER_TALK,
-       'సభ్యుడు' => NS_USER, # set for bug 11615
+       'సభ్యుడు' => NS_USER, # set for T13615
        'సభ్యునిపై_చర్చ' => NS_USER_TALK,
        'బొమ్మ' => NS_FILE,
        'బొమ్మపై_చర్చ' => NS_FILE_TALK,
index 480d94f..d851e1c 100644 (file)
@@ -51,6 +51,7 @@
  * @author Дар'я Козлова
  * @author Максим Підліснюк
  * @author Тест
+ * @author Eugene Gvozdetsky
  */
 
 $separatorTransformTable = [
@@ -102,6 +103,11 @@ $namespaceAliases = [
        'Обсуждение_изображения' => NS_FILE_TALK,
 ];
 
+$namespaceGenderAliases = [
+       NS_USER      => [ 'male' => 'Користувач', 'female' => 'Користувачка' ],
+       NS_USER_TALK => [ 'male' => 'Обговорення_користувача', 'female' => 'Обговорення_користувачки' ],
+];
+
 $dateFormats = [
        'mdy time' => 'H:i',
        'mdy date' => 'xg j, Y',
index a7978be..f62614b 100644 (file)
@@ -20,7 +20,7 @@ $fallback = 'nl';
 
 /**
  * Namespace names
- * (bug 8708)
+ * (T10708)
  */
 $namespaceNames = [
        NS_MEDIA            => 'Media',
index 62dc36c..478a0c4 100644 (file)
@@ -25,6 +25,8 @@
 require_once __DIR__ . '/../includes/PHPVersionCheck.php';
 wfEntryPointCheck( 'cli' );
 
+use Wikimedia\Rdbms\DBReplicationWaitError;
+
 /**
  * @defgroup MaintenanceArchive Maintenance archives
  * @ingroup Maintenance
@@ -36,9 +38,11 @@ define( 'DO_MAINTENANCE', RUN_MAINTENANCE_IF_MAIN ); // original name, harmless
 
 $maintClass = false;
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
  * Abstract maintenance class for quickly writing and churning out
@@ -105,7 +109,7 @@ abstract class Maintenance {
 
        /**
         * Used by getDB() / setDB()
-        * @var Database
+        * @var IMaintainableDatabase
         */
        private $mDb = null;
 
@@ -205,7 +209,7 @@ abstract class Maintenance {
         * @param string $description The description of the param to show on --help
         * @param bool $required Is the param required?
         * @param bool $withArg Is an argument required with this option?
-        * @param string $shortName Character to use as short name
+        * @param string|bool $shortName Character to use as short name
         * @param bool $multiOccurrence Can this option be passed multiple times?
         */
        protected function addOption( $name, $description, $required = false,
@@ -1242,7 +1246,7 @@ abstract class Maintenance {
         * @param integer $db DB index (DB_REPLICA/DB_MASTER)
         * @param array $groups; default: empty array
         * @param string|bool $wiki; default: current wiki
-        * @return Database
+        * @return IMaintainableDatabase
         */
        protected function getDB( $db, $groups = [], $wiki = false ) {
                if ( is_null( $this->mDb ) ) {
@@ -1255,7 +1259,7 @@ abstract class Maintenance {
        /**
         * Sets database object to be returned by getDB().
         *
-        * @param IDatabase $db Database object to be used
+        * @param IDatabase $db
         */
        public function setDB( IDatabase $db ) {
                $this->mDb = $db;
@@ -1317,7 +1321,7 @@ abstract class Maintenance {
 
        /**
         * Lock the search index
-        * @param Database &$db
+        * @param IMaintainableDatabase &$db
         */
        private function lockSearchindex( $db ) {
                $write = [ 'searchindex' ];
@@ -1335,7 +1339,7 @@ abstract class Maintenance {
 
        /**
         * Unlock the tables
-        * @param Database &$db
+        * @param IMaintainableDatabase &$db
         */
        private function unlockSearchindex( $db ) {
                $db->unlockTables( __CLASS__ . '::' . __METHOD__ );
@@ -1344,7 +1348,7 @@ abstract class Maintenance {
        /**
         * Unlock and lock again
         * Since the lock is low-priority, queued reads will be able to complete
-        * @param Database &$db
+        * @param IMaintainableDatabase &$db
         */
        private function relockSearchindex( $db ) {
                $this->unlockSearchindex( $db );
@@ -1355,7 +1359,7 @@ abstract class Maintenance {
         * Perform a search index update with locking
         * @param int $maxLockTime The maximum time to keep the search index locked.
         * @param string $callback The function that will update the function.
-        * @param Database $dbw
+        * @param IMaintainableDatabase $dbw
         * @param array $results
         */
        public function updateSearchIndex( $maxLockTime, $callback, $dbw, $results ) {
@@ -1391,7 +1395,7 @@ abstract class Maintenance {
 
        /**
         * Update the searchindex table for a given pageid
-        * @param Database $dbw A database write handle
+        * @param IDatabase $dbw A database write handle
         * @param int $pageId The page ID to update.
         * @return null|string
         */
diff --git a/maintenance/addSite.php b/maintenance/addSite.php
new file mode 100755 (executable)
index 0000000..1ebc4f6
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+
+use MediaWiki\MediaWikiServices;
+
+$basePath = getenv( 'MW_INSTALL_PATH' ) !== false ? getenv( 'MW_INSTALL_PATH' ) : __DIR__ . '/..';
+
+require_once $basePath . '/maintenance/Maintenance.php';
+
+/**
+ * Maintenance script for adding a site definition into the sites table.
+ *
+ * @since 1.29
+ *
+ * @license GNU GPL v2+
+ * @author Florian Schmidt
+ */
+class AddSite extends Maintenance {
+
+       public function __construct() {
+               $this->addDescription( 'Add a site definition into the sites table.' );
+
+               $this->addArg( 'globalid', 'The global id of the site to add, e.g. "wikipedia".', true );
+               $this->addArg( 'group', 'In which group this site should be sorted in.', true );
+               $this->addOption( 'language', 'The language code of the site, e.g. "de".' );
+               $this->addOption( 'interwiki-id', 'The interwiki ID of the site.' );
+               $this->addOption( 'navigation-id', 'The navigation ID of the site.' );
+               $this->addOption( 'pagepath', 'The URL to pages of this site, e.g.' .
+                       ' https://example.com/wiki/\$1.' );
+               $this->addOption( 'filepath', 'The URL to files of this site, e.g. https://example
+               .com/w/\$1.' );
+
+               parent::__construct();
+       }
+
+       /**
+        * Imports the site described by the parameters (see self::__construct()) passed to this
+        * maintenance sccript into the sites table of MediaWiki.
+        */
+       public function execute() {
+               $siteStore = MediaWikiServices::getInstance()->getSiteStore();
+               $siteStore->reset();
+
+               $globalId = $this->getArg( 0 );
+               $group = $this->getArg( 1 );
+               $language = $this->getOption( 'language' );
+               $interwikiId = $this->getOption( 'interwiki-id' );
+               $navigationId = $this->getOption( 'navigation-id' );
+               $pagepath = $this->getOption( 'pagepath' );
+               $filepath = $this->getOption( 'filepath' );
+
+               if ( !is_string( $globalId ) || !is_string( $group ) ) {
+                       echo "Arguments globalid and group need to be strings.\n";
+                       return false;
+               }
+
+               if ( $siteStore->getSite( $globalId ) !== null ) {
+                       echo "Site with global id $globalId already exists.\n";
+                       return false;
+               }
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( $globalId );
+               $site->setGroup( $group );
+               if ( $language !== null ) {
+                       $site->setLanguageCode( $language );
+               }
+               if ( $interwikiId !== null ) {
+                       $site->addInterwikiId( $interwikiId );
+               }
+               if ( $navigationId !== null ) {
+                       $site->addNavigationId( $navigationId );
+               }
+               if ( $pagepath !== null ) {
+                       $site->setPagePath( $pagepath );
+               }
+               if ( $filepath !== null ) {
+                       $site->setFilePath( $filepath );
+               }
+
+               $siteStore->saveSites( [ $site ] );
+
+               if ( method_exists( $siteStore, 'reset' ) ) {
+                       $siteStore->reset();
+               }
+
+               echo "Done.\n";
+       }
+}
+
+$maintClass = 'AddSite';
+require_once RUN_MAINTENANCE_IF_MAIN;
index ddd1d7b..08287cd 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-archive-ar_id.sql
 --
--- Bug 39675. Add archive.ar_id.
+-- T41675. Add archive.ar_id.
 
 ALTER TABLE /*$wgDBprefix*/archive
     ADD COLUMN ar_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
index f5ff1f1..f8b6340 100644 (file)
@@ -1,11 +1,11 @@
 --
 -- patch-categorylinks-better-collation.sql
 --
--- Bugs 164, 1211, 23682.  This is the second version of this patch; the
+-- T2164, T3211, T25682.  This is the second version of this patch; the
 -- changes are also incorporated into patch-categorylinks-better-collation2.sql,
 -- for the benefit of trunk users who applied the original.
 --
--- Due to bug 25254, the length limit of 255 bytes for cl_sortkey_prefix
+-- Due to T27254, the length limit of 255 bytes for cl_sortkey_prefix
 -- is also enforced in php. If you change the length of that field, make
 -- sure to also change the check in LinksUpdate.php.
 ALTER TABLE /*$wgDBprefix*/categorylinks
index d4b51b5..ded8454 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-extenallinks-el_id.sql
 --
--- Bug 15441. Add externallinks.el_id.
+-- T17441. Add externallinks.el_id.
 
 ALTER TABLE /*$wgDBprefix*/externallinks
     ADD COLUMN el_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
diff --git a/maintenance/archives/patch-image-user-index-2.sql b/maintenance/archives/patch-image-user-index-2.sql
new file mode 100644 (file)
index 0000000..8b19d82
--- /dev/null
@@ -0,0 +1 @@
+CREATE INDEX /*i*/img_user_timestamp ON /*_*/image (img_user,img_timestamp);
index a74d7bd..b44930f 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- image-user-index.sql
 --
--- Add user/timestamp index to current image versions
+-- Add user_text/timestamp index to current image versions
 --
 
 ALTER TABLE /*$wgDBprefix*/image
diff --git a/maintenance/archives/patch-rename-ar_usertext_timestamp.sql b/maintenance/archives/patch-rename-ar_usertext_timestamp.sql
new file mode 100644 (file)
index 0000000..658c179
--- /dev/null
@@ -0,0 +1,7 @@
+-- Rename the archive.ar_usertext_timestamp index to usertext_timestamp.
+-- This is for MySQL only and is only necessary on wikis freshly installed on
+-- 1.28.0 when bug T154872 was present. The patch will probably be removed in
+-- 1.29 since we plan on renaming the index properly to ar_usertext_timestamp.
+ALTER TABLE /*$wgDBprefix*/archive
+       DROP INDEX ar_usertext_timestamp,
+       ADD INDEX usertext_timestamp (ar_user_text,ar_timestamp);
index 742841e..c516aaf 100644 (file)
@@ -1,4 +1,4 @@
--- Increase the length of up_property from 32 -> 255 bytes. Bug 19408
+-- Increase the length of up_property from 32 -> 255 bytes. T21408
 
 ALTER TABLE /*_*/user_properties
        MODIFY up_property varbinary(255);
index 0beff7c..13362e0 100644 (file)
@@ -23,6 +23,8 @@
 
 require __DIR__ . '/../commandLine.inc';
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script that upgrade for log_id/log_deleted fields in a
  * replication-safe way.
@@ -32,7 +34,7 @@ require __DIR__ . '/../commandLine.inc';
 class UpdateLogging {
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        public $dbw;
        public $batchSize = 1000;
index 286fb58..60b8a7a 100644 (file)
@@ -28,6 +28,7 @@ require_once __DIR__ . '/Maintenance.php';
 require_once __DIR__ . '/../includes/export/DumpFilter.php';
 
 use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup Dump Maintenance
index 265800e..6a2d3bf 100644 (file)
@@ -40,6 +40,7 @@
  * @ingroup Maintenance
  */
 class BaseDump {
+       /** @var XMLReader */
        protected $reader = null;
        protected $atEnd = false;
        protected $atPageEnd = false;
index 5fab082..0039d20 100644 (file)
@@ -34,67 +34,104 @@ require_once __DIR__ . '/../Maintenance.php';
  * @ingroup Benchmark
  */
 abstract class Benchmarker extends Maintenance {
-       private $results;
+       protected $defaultCount = 100;
 
        public function __construct() {
                parent::__construct();
-               $this->addOption( 'count', "How many times to run a benchmark", false, true );
+               $this->addOption( 'count', 'How many times to run a benchmark', false, true );
        }
 
        public function bench( array $benchs ) {
-               $bench_number = 0;
-               $count = $this->getOption( 'count', 100 );
+               $this->startBench();
+               $count = $this->getOption( 'count', $this->defaultCount );
+               foreach ( $benchs as $key => $bench ) {
+                       // Shortcut for simple functions
+                       if ( is_callable( $bench ) ) {
+                               $bench = [ 'function' => $bench ];
+                       }
 
-               foreach ( $benchs as $bench ) {
-                       // handle empty args
-                       if ( !array_key_exists( 'args', $bench ) ) {
+                       // Default to no arguments
+                       if ( !isset( $bench['args'] ) ) {
                                $bench['args'] = [];
                        }
 
-                       $bench_number++;
-                       $start = microtime( true );
+                       // Optional setup called outside time measure
+                       if ( isset( $bench['setup'] ) ) {
+                               call_user_func( $bench['setup'] );
+                       }
+
+                       // Run benchmarks
+                       $times = [];
                        for ( $i = 0; $i < $count; $i++ ) {
+                               $t = microtime( true );
                                call_user_func_array( $bench['function'], $bench['args'] );
+                               $t = ( microtime( true ) - $t ) * 1000;
+                               $times[] = $t;
+                       }
+
+                       // Collect metrics
+                       sort( $times, SORT_NUMERIC );
+                       $min = $times[0];
+                       $max = end( $times );
+                       if ( $count % 2 ) {
+                               $median = $times[ ( $count - 1 ) / 2 ];
+                       } else {
+                               $median = ( $times[$count / 2] + $times[$count / 2 - 1] ) / 2;
                        }
-                       $delta = microtime( true ) - $start;
+                       $total = array_sum( $times );
+                       $mean = $total / $count;
 
-                       // function passed as a callback
-                       if ( is_array( $bench['function'] ) ) {
-                               $ret = get_class( $bench['function'][0] ) . '->' . $bench['function'][1];
-                               $bench['function'] = $ret;
+                       // Name defaults to name of called function
+                       if ( is_string( $key ) ) {
+                               $name = $key;
+                       } else {
+                               if ( is_array( $bench['function'] ) ) {
+                                       $name = get_class( $bench['function'][0] ) . '::' . $bench['function'][1];
+                               } else {
+                                       $name = strval( $bench['function'] );
+                               }
+                               $name = sprintf( "%s(%s)",
+                                       $name,
+                                       implode( ', ', $bench['args'] )
+                               );
                        }
 
-                       $this->results[$bench_number] = [
-                               'function' => $bench['function'],
-                               'arguments' => $bench['args'],
+                       $this->addResult( [
+                               'name' => $name,
                                'count' => $count,
-                               'delta' => $delta,
-                               'average' => $delta / $count,
-                       ];
+                               'total' => $total,
+                               'min' => $min,
+                               'median' => $median,
+                               'mean' => $mean,
+                               'max' => $max,
+                       ] );
                }
        }
 
-       public function getFormattedResults() {
-               $ret = sprintf( "Running PHP version %s (%s) on %s %s %s\n\n",
-                       phpversion(),
-                       php_uname( 'm' ),
-                       php_uname( 's' ),
-                       php_uname( 'r' ),
-                       php_uname( 'v' )
+       public function startBench() {
+               $this->output(
+                       sprintf( "Running PHP version %s (%s) on %s %s %s\n\n",
+                               phpversion(),
+                               php_uname( 'm' ),
+                               php_uname( 's' ),
+                               php_uname( 'r' ),
+                               php_uname( 'v' )
+                       )
                );
-               foreach ( $this->results as $res ) {
-                       // show function with args
-                       $ret .= sprintf( "%s times: function %s(%s) :\n",
-                               $res['count'],
-                               $res['function'],
-                               implode( ', ', $res['arguments'] )
-                       );
-                       $ret .= sprintf( "   %6.2fms (%6.2fms each)\n",
-                               $res['delta'] * 1000,
-                               $res['average'] * 1000
+       }
+
+       public function addResult( $res ) {
+               $ret = sprintf( "%s\n  %' 6s: %d\n",
+                       $res['name'],
+                       'times',
+                       $res['count']
+               );
+               foreach ( [ 'total', 'min', 'median', 'mean', 'max' ] as $metric ) {
+                       $ret .= sprintf( "  %' 6s: %6.2fms\n",
+                               $metric,
+                               $res[$metric]
                        );
                }
-
-               return $ret;
+               $this->output( "$ret\n" );
        }
 }
index c021abd..27da9de 100644 (file)
@@ -5,3 +5,6 @@ To get somehow accurate result, you might want to bound the PHP process
 to a specific CPU with `taskset` and raise its priority with `nice`. Example:
 
  $ taskset 1 nice -n-10 php bench_wfIsWindows.php
+
+australia-untidy.html.gz contains representative input text for
+benchmarkTidy.php. It needs to be decompressed before use.
diff --git a/maintenance/benchmarks/australia-untidy.html.gz b/maintenance/benchmarks/australia-untidy.html.gz
new file mode 100644 (file)
index 0000000..148481d
Binary files /dev/null and b/maintenance/benchmarks/australia-untidy.html.gz differ
index 5b64bee..0e3cd73 100644 (file)
@@ -42,20 +42,19 @@ class BenchHttpHttps extends Benchmarker {
                        [ 'function' => [ $this, 'getHTTP' ] ],
                        [ 'function' => [ $this, 'getHTTPS' ] ],
                ] );
-               print $this->getFormattedResults();
        }
 
-       static function doRequest( $proto ) {
+       private function doRequest( $proto ) {
                Http::get( "$proto://localhost/", [], __METHOD__ );
        }
 
        // bench function 1
-       function getHTTP() {
+       protected function getHTTP() {
                $this->doRequest( 'http' );
        }
 
        // bench function 2
-       function getHTTPS() {
+       protected function getHTTPS() {
                $this->doRequest( 'https' );
        }
 }
index c8a9055..86bcc8a 100644 (file)
@@ -60,13 +60,11 @@ class BenchWikimediaBaseConvert extends Benchmarker {
                                'args' => [ $number, $inbase, $outbase, 0, true, 'gmp' ]
                        ],
                ] );
-
-               $this->output( $this->getFormattedResults() );
        }
 
        protected static function makeRandomNumber( $base, $length ) {
-               $baseChars = "0123456789abcdefghijklmnopqrstuvwxyz";
-               $res = "";
+               $baseChars = '0123456789abcdefghijklmnopqrstuvwxyz';
+               $res = '';
                for ( $i = 0; $i < $length; $i++ ) {
                        $res .= $baseChars[mt_rand( 0, $base - 1 )];
                }
index 2a8d79a..0a999ec 100644 (file)
 
 require_once __DIR__ . '/Benchmarker.php';
 
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script that benchmarks SQL DELETE vs SQL TRUNCATE.
  *
  * @ingroup Benchmark
  */
 class BenchmarkDeleteTruncate extends Benchmarker {
+       protected $defaultCount = 10;
+
        public function __construct() {
                parent::__construct();
                $this->addDescription( 'Benchmarks SQL DELETE vs SQL TRUNCATE.' );
@@ -43,33 +48,30 @@ class BenchmarkDeleteTruncate extends Benchmarker {
   text varbinary(255) NOT NULL
 );" );
 
-               $this->insertData( $dbw );
-
-               $start = microtime( true );
-
-               $this->delete( $dbw );
-
-               $end = microtime( true );
-
-               echo "Delete: " . sprintf( "%6.3fms", ( $end - $start ) * 1000 );
-               echo "\r\n";
-
-               $this->insertData( $dbw );
-
-               $start = microtime( true );
-
-               $this->truncate( $dbw );
-
-               $end = microtime( true );
-
-               echo "Truncate: " . sprintf( "%6.3fms", ( $end - $start ) * 1000 );
-               echo "\r\n";
+               $this->bench( [
+                       'Delete' => [
+                               'setup' => function () use ( $dbw ) {
+                                       $this->insertData( $dbw );
+                               },
+                               'function' => function () use ( $dbw ) {
+                                       $this->delete( $dbw );
+                               }
+                       ],
+                       'Truncate' => [
+                               'setup' => function () use ( $dbw ) {
+                                       $this->insertData( $dbw );
+                               },
+                               'function' => function () use ( $dbw ) {
+                                       $this->truncate( $dbw );
+                               }
+                       ]
+               ] );
 
                $dbw->dropTable( 'test' );
        }
 
        /**
-        * @param Database $dbw
+        * @param IDatabase $dbw
         * @return void
         */
        private function insertData( $dbw ) {
@@ -82,7 +84,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        }
 
        /**
-        * @param Database $dbw
+        * @param IDatabase $dbw
         * @return void
         */
        private function delete( $dbw ) {
@@ -90,7 +92,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        }
 
        /**
-        * @param Database $dbw
+        * @param IMaintainableDatabase $dbw
         * @return void
         */
        private function truncate( $dbw ) {
@@ -99,5 +101,5 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        }
 }
 
-$maintClass = "BenchmarkDeleteTruncate";
+$maintClass = 'BenchmarkDeleteTruncate';
 require_once RUN_MAINTENANCE_IF_MAIN;
index 46c9d39..843ef7c 100644 (file)
@@ -42,11 +42,10 @@ class BenchIfSwitch extends Benchmarker {
                        [ 'function' => [ $this, 'doElseIf' ] ],
                        [ 'function' => [ $this, 'doSwitch' ] ],
                ] );
-               print $this->getFormattedResults();
        }
 
        // bench function 1
-       function doElseIf() {
+       protected function doElseIf() {
                $a = 'z';
                if ( $a == 'a' ) {
                } elseif ( $a == 'b' ) {
@@ -69,7 +68,7 @@ class BenchIfSwitch extends Benchmarker {
        }
 
        // bench function 2
-       function doSwitch() {
+       protected function doSwitch() {
                $a = 'z';
                switch ( $a ) {
                        case 'b':
index 156f8fc..55c7159 100644 (file)
@@ -51,22 +51,21 @@ class BenchStrtrStrReplace extends Benchmarker {
                        [ 'function' => [ $this, 'benchstrtr_indirect' ] ],
                        [ 'function' => [ $this, 'benchstr_replace_indirect' ] ],
                ] );
-               print $this->getFormattedResults();
        }
 
-       function benchstrtr() {
+       protected function benchstrtr() {
                strtr( "[[MediaWiki:Some_random_test_page]]", "_", " " );
        }
 
-       function benchstr_replace() {
+       protected function benchstr_replace() {
                str_replace( "_", " ", "[[MediaWiki:Some_random_test_page]]" );
        }
 
-       function benchstrtr_indirect() {
+       protected function benchstrtr_indirect() {
                bfNormalizeTitleStrTr( "[[MediaWiki:Some_random_test_page]]" );
        }
 
-       function benchstr_replace_indirect() {
+       protected function benchstr_replace_indirect() {
                bfNormalizeTitleStrReplace( "[[MediaWiki:Some_random_test_page]]" );
        }
 }
index c92a720..3091de6 100644 (file)
@@ -32,6 +32,8 @@ require_once __DIR__ . '/Benchmarker.php';
 class BenchUtf8TitleCheck extends Benchmarker {
        private $data;
 
+       private $isutf8;
+
        public function __construct() {
                parent::__construct();
 
@@ -41,7 +43,7 @@ class BenchUtf8TitleCheck extends Benchmarker {
                        "United States of America", // 7bit ASCII
                        "S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e",
                        "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn",
-                       // This comes from bug 36839
+                       // This comes from T38839
                        "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn%7C"
                        . "Catherine%20Willows%7CDavid%20Hodges%7CDavid%20Phillips%7CGil%20Grissom%7CGreg%20Sanders%7CHodges%7C"
                        . "Internet%20Movie%20Database%7CJim%20Brass%7CLady%20Heather%7C"
@@ -84,29 +86,26 @@ class BenchUtf8TitleCheck extends Benchmarker {
                        ];
                }
                $this->bench( $benchmarks );
-               print $this->getFormattedResults();
        }
 
-       private $isutf8;
-
-       function use_regexp( $s ) {
+       protected function use_regexp( $s ) {
                $this->isutf8 = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
                        '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
        }
 
-       function use_regexp_non_capturing( $s ) {
+       protected function use_regexp_non_capturing( $s ) {
                // Same as above with a non-capturing subgroup.
                $this->isutf8 = preg_match( '/^(?:[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
                        '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
        }
 
-       function use_regexp_once_only( $s ) {
+       protected function use_regexp_once_only( $s ) {
                // Same as above with a once-only subgroup.
                $this->isutf8 = preg_match( '/^(?>[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
                        '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
        }
 
-       function use_mb_check_encoding( $s ) {
+       protected function use_mb_check_encoding( $s ) {
                $this->isutf8 = mb_check_encoding( $s, 'UTF-8' );
        }
 }
index ac0caf6..960ef0e 100644 (file)
@@ -42,20 +42,19 @@ class BenchWfIsWindows extends Benchmarker {
                        [ 'function' => [ $this, 'wfIsWindows' ] ],
                        [ 'function' => [ $this, 'wfIsWindowsCached' ] ],
                ] );
-               print $this->getFormattedResults();
        }
 
-       static function is_win() {
+       protected static function is_win() {
                return substr( php_uname(), 0, 7 ) == 'Windows';
        }
 
        // bench function 1
-       function wfIsWindows() {
+       protected function wfIsWindows() {
                return self::is_win();
        }
 
        // bench function 2
-       function wfIsWindowsCached() {
+       protected function wfIsWindowsCached() {
                static $isWindows = null;
                if ( $isWindows == null ) {
                        $isWindows = self::is_win();
diff --git a/maintenance/benchmarks/benchmarkCSSMin.php b/maintenance/benchmarks/benchmarkCSSMin.php
new file mode 100644 (file)
index 0000000..3eaa88d
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Benchmark
+ * @author Timo Tijhof
+ */
+
+require_once __DIR__ . '/Benchmarker.php';
+
+/**
+ * Maintenance script that benchmarks CSSMin.
+ *
+ * @ingroup Benchmark
+ */
+class BenchmarkCSSMin extends Benchmarker {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Benchmarks CSSMin.' );
+               $this->addOption( 'file', 'Path to CSS file (may be gzipped)', false, true );
+               $this->addOption( 'out', 'Echo output of one run to stdout for inspection', false, false );
+       }
+
+       public function execute() {
+               $file = $this->getOption( 'file', __DIR__ . '/cssmin/styles.css' );
+               $filename = basename( $file );
+               $css = $this->loadFile( $file );
+
+               if ( $this->hasOption( 'out' ) ) {
+                       echo "## minify\n\n",
+                               CSSMin::minify( $css ),
+                               "\n\n";
+                       echo "## remap\n\n",
+                               CSSMin::remap( $css, dirname( $file ), 'https://example.org/test/', true ),
+                               "\n";
+                       return;
+               }
+
+               $this->bench( [
+                       "minify ($filename)" => [
+                               'function' => [ 'CSSMin', 'minify' ],
+                               'args' => [ $css ]
+                       ],
+                       "remap ($filename)" => [
+                               'function' => [ 'CSSMin', 'remap' ],
+                               'args' => [ $css, dirname( $file ), 'https://example.org/test/', true ]
+                       ],
+               ] );
+       }
+
+       private function loadFile( $file ) {
+               $css = file_get_contents( $file );
+               // Detect GZIP compression header
+               if ( substr( $css, 0, 2 ) === "\037\213" ) {
+                       $css = gzdecode( $css );
+               }
+               return $css;
+       }
+}
+
+$maintClass = 'BenchmarkCSSMin';
+require_once RUN_MAINTENANCE_IF_MAIN;
index c59ce0d..d49fa1d 100644 (file)
@@ -29,50 +29,36 @@ require_once __DIR__ . '/Benchmarker.php';
  * @ingroup Benchmark
  */
 class BenchmarkHooks extends Benchmarker {
+       protected $defaultCount = 10;
+
        public function __construct() {
                parent::__construct();
                $this->addDescription( 'Benchmark MediaWiki Hooks.' );
        }
 
        public function execute() {
-               global $wgHooks;
-               $wgHooks['Test'] = [];
-
-               $time = $this->benchHooks();
-               $this->output( 'Empty hook: ' . $time . "\n" );
-
-               $wgHooks['Test'][] = [ $this, 'test' ];
-               $time = $this->benchHooks();
-               $this->output( 'Loaded (one) hook: ' . $time . "\n" );
-
-               for ( $i = 0; $i < 9; $i++ ) {
-                       $wgHooks['Test'][] = [ $this, 'test' ];
-               }
-               $time = $this->benchHooks();
-               $this->output( 'Loaded (ten) hook: ' . $time . "\n" );
-
-               for ( $i = 0; $i < 90; $i++ ) {
-                       $wgHooks['Test'][] = [ $this, 'test' ];
+               $cases = [
+                       'Loaded 0 hooks' => 0,
+                       'Loaded 1 hook' => 1,
+                       'Loaded 10 hooks' => 10,
+                       'Loaded 100 hooks' => 100,
+               ];
+               $benches = [];
+               foreach ( $cases as $label => $load ) {
+                       $benches[$label] = [
+                               'setup' => function () use ( $load ) {
+                                       global $wgHooks;
+                                       $wgHooks['Test'] = [];
+                                       for ( $i = 1; $i <= $load; $i++ ) {
+                                               $wgHooks['Test'][] = [ $this, 'test' ];
+                                       }
+                               },
+                               'function' => function () {
+                                       Hooks::run( 'Test' );
+                               }
+                       ];
                }
-               $time = $this->benchHooks();
-               $this->output( 'Loaded (one hundred) hook: ' . $time . "\n" );
-               $this->output( "\n" );
-       }
-
-       /**
-        * @param int $trials
-        * @return string
-        */
-       private function benchHooks( $trials = 10 ) {
-               $start = microtime( true );
-               for ( $i = 0; $i < $trials; $i++ ) {
-                       Hooks::run( 'Test' );
-               }
-               $delta = microtime( true ) - $start;
-               $pertrial = $delta / $trials;
-
-               return sprintf( "Took %6.3fms",
-                       $pertrial * 1000 );
+               $this->bench( $benches );
        }
 
        /**
diff --git a/maintenance/benchmarks/benchmarkTidy.php b/maintenance/benchmarks/benchmarkTidy.php
new file mode 100644 (file)
index 0000000..1479174
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+require __DIR__ . '/../Maintenance.php';
+
+class BenchmarkTidy extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addOption( 'file', 'A filename which contains the input text', true, true );
+               $this->addOption( 'driver', 'The Tidy driver name, or false to use the configured instance',
+                       false,  true );
+               $this->addOption( 'tidy-config', 'JSON encoded value for the tidy configuration array',
+                       false, true );
+       }
+
+       public function execute() {
+               $html = file_get_contents( $this->getOption( 'file' ) );
+               if ( $html === false ) {
+                       $this->error( "Unable to open input file", 1 );
+               }
+               if ( $this->hasOption( 'driver' ) || $this->hasOption( 'tidy-config' ) ) {
+                       $config = json_decode( $this->getOption( 'tidy-config', '{}' ), true );
+                       if ( !is_array( $config ) ) {
+                               $this->error( "Invalid JSON tidy config", 1 );
+                       }
+                       $config += [ 'driver' => $this->getOption( 'driver', 'RemexHtml' ) ];
+                       $driver = MWTidy::factory( $config );
+               } else {
+                       $driver = MWTidy::singleton();
+                       if ( !$driver ) {
+                               $this->error( "Tidy disabled or not installed", 1 );
+                       }
+               }
+
+               $this->benchmark( $driver, $html );
+       }
+
+       private function benchmark( $driver, $html ) {
+               global $wgContLang;
+
+               $times = [];
+               $innerCount = 10;
+               $outerCount = 10;
+               for ( $j = 1; $j <= $outerCount; $j++ ) {
+                       $t = microtime( true );
+                       for ( $i = 0; $i < $innerCount; $i++ ) {
+                               $driver->tidy( $html );
+                               print $wgContLang->formatSize( memory_get_usage( true ) ) . "\n";
+                       }
+                       $t = ( ( microtime( true ) - $t ) / $innerCount ) * 1000;
+                       $times[] = $t;
+                       print "Run $j: $t\n";
+               }
+               print "\n";
+
+               sort( $times, SORT_NUMERIC );
+               $n = $outerCount;
+               $min = $times[0];
+               $max = end( $times );
+               if ( $n % 2 ) {
+                       $median = $times[ ( $n - 1 ) / 2 ];
+               } else {
+                       $median = ( $times[$n / 2] + $times[$n / 2 - 1] ) / 2;
+               }
+               $mean = array_sum( $times ) / $n;
+
+               print "Minimum: $min ms\n";
+               print "Median: $median ms\n";
+               print "Mean: $mean ms\n";
+               print "Maximum: $max ms\n";
+               print "Memory usage: " .
+                       $wgContLang->formatSize( memory_get_usage( true ) ) . "\n";
+               print "Peak memory usage: " .
+                       $wgContLang->formatSize( memory_get_peak_usage( true ) ) . "\n";
+       }
+}
+
+$maintClass = 'BenchmarkTidy';
+require RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/cssmin/circle.svg b/maintenance/benchmarks/cssmin/circle.svg
new file mode 100644 (file)
index 0000000..6b7d1af
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8">
+<circle cx="4" cy="4" r="2"/>
+</svg>
diff --git a/maintenance/benchmarks/cssmin/styles.css b/maintenance/benchmarks/cssmin/styles.css
new file mode 100644 (file)
index 0000000..3cc1520
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * Header
+ */
+
+.foo {
+       background: url(wiki.png);
+}
+
+.foo {
+       background: url(unknown.png);
+}
+
+.foo {
+       background: url(https://example.org/foo.png);
+       background: url('https://example.org/foo.png');
+       background: url("https://example.org/foo.png");
+}
+
+.foo {
+       /* @embed */
+       background: url(wiki.png);
+}
+
+.foo {
+       /* @embed */
+       background: url(circle.svg);
+}
+
+.foo {
+       /* @embed */
+       background: url(wiki.png), url(wiki.png);
+}
diff --git a/maintenance/benchmarks/cssmin/wiki.png b/maintenance/benchmarks/cssmin/wiki.png
new file mode 100644 (file)
index 0000000..8c42118
Binary files /dev/null and b/maintenance/benchmarks/cssmin/wiki.png differ
index c8f393d..e0da027 100644 (file)
@@ -146,7 +146,7 @@ class ImageCleanup extends TableCleanup {
                 * if the target title exists in the image table, or if both the
                 * original and target titles exist in the page table, append
                 * increasing version numbers until the target title exists in
-                * neither.  (See also bug 16916.)
+                * neither.  (See also T18916.)
                 */
                $version = 0;
                $final = $new;
diff --git a/maintenance/cleanupInvalidDbKeys.php b/maintenance/cleanupInvalidDbKeys.php
new file mode 100644 (file)
index 0000000..b487f89
--- /dev/null
@@ -0,0 +1,311 @@
+<?php
+/**
+ * Cleans up invalid titles in various tables.
+ *
+ * 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 that cleans up invalid titles in various tables.
+ *
+ * @since 1.29
+ * @ingroup Maintenance
+ */
+class CleanupInvalidDbKeys extends Maintenance {
+       /** @var array List of tables to clean up, and the field prefix for that table */
+       protected static $tables = [
+               // Data tables
+               [ 'page', 'page' ],
+               [ 'redirect', 'rd', 'idField' => 'rd_from' ],
+               [ 'archive', 'ar' ],
+               [ 'logging', 'log' ],
+               [ 'protected_titles', 'pt', 'idField' => 0 ],
+               [ 'category', 'cat', 'nsField' => 14 ],
+               [ 'recentchanges', 'rc' ],
+               [ 'watchlist', 'wl' ],
+               // The querycache tables' qc(c)_title and qcc_titletwo may contain titles,
+               // but also usernames or other things like that, so we leave them alone
+
+               // Links tables
+               [ 'pagelinks', 'pl', 'idField' => 'pl_from' ],
+               [ 'templatelinks', 'tl', 'idField' => 'tl_from' ],
+               [ 'categorylinks', 'cl', 'idField' => 'cl_from', 'nsField' => 14, 'titleField' => 'cl_to' ],
+       ];
+
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( <<<'TEXT'
+This script cleans up the title fields in various tables to remove entries that
+will be rejected by the constructor of TitleValue.  This constructor throws an
+exception when invalid data is encountered, which will not normally occur on
+regular page views, but can happen on query special pages.
+
+The script targets titles matching the regular expression /^_|[ \r\n\t]|_$/.
+Because any foreign key relationships involving these titles will already be
+broken, the titles are corrected to a valid version or the rows are deleted
+entirely, depending on the table.
+
+The script runs with the expectation that STDOUT is redirected to a file.
+TEXT
+               );
+               $this->addOption( 'fix', 'Actually clean up invalid titles. If this parameter is ' .
+                       'not specified, the script will report invalid titles but not clean them up.',
+                       false, false );
+               $this->addOption( 'table', 'The table(s) to process. This option can be specified ' .
+                       'more than once (e.g. -t category -t watchlist). If not specified, all available ' .
+                       'tables will be processed. Available tables are: ' .
+                       implode( ', ', array_column( static::$tables, 0 ) ), false, true, 't', true );
+
+               $this->setBatchSize( 500 );
+       }
+
+       public function execute() {
+               $tablesToProcess = $this->getOption( 'table' );
+               foreach ( static::$tables as $tableParams ) {
+                       if ( !$tablesToProcess || in_array( $tableParams[0], $tablesToProcess ) ) {
+                               $this->cleanupTable( $tableParams );
+                       }
+               }
+
+               $this->outputStatus( 'Done!' );
+               if ( $this->hasOption( 'fix' ) ) {
+                       $this->outputStatus( ' Cleaned up invalid DB keys on ' . wfWikiID() . "!\n" );
+               }
+       }
+
+       /**
+        * Prints text to STDOUT, and STDERR if STDOUT was redirected to a file.
+        * Used for progress reporting.
+        *
+        * @param string $str Text to write to both places
+        * @param string|null $channel Ignored
+        */
+       protected function outputStatus( $str, $channel = null ) {
+               // Make it easier to find progress lines in the STDOUT log
+               if ( trim( $str ) ) {
+                       fwrite( STDOUT, '*** ' . trim( $str ) . "\n" );
+               }
+               fwrite( STDERR, $str );
+       }
+
+       /**
+        * Prints text to STDOUT. Used for logging output.
+        *
+        * @param string $str Text to write
+        */
+       protected function writeToReport( $str ) {
+               fwrite( STDOUT, $str );
+       }
+
+       /**
+        * Identifies, and optionally cleans up, invalid titles.
+        *
+        * @param array $tableParams A child array of self::$tables
+        */
+       protected function cleanupTable( $tableParams ) {
+               $table = $tableParams[0];
+               $prefix = $tableParams[1];
+               $idField = isset( $tableParams['idField'] ) ?
+                       $tableParams['idField'] :
+                       "{$prefix}_id";
+               $nsField = isset( $tableParams['nsField'] ) ?
+                       $tableParams['nsField'] :
+                       "{$prefix}_namespace";
+               $titleField = isset( $tableParams['titleField'] ) ?
+                       $tableParams['titleField'] :
+                       "{$prefix}_title";
+
+               $this->outputStatus( "Looking for invalid $titleField entries in $table...\n" );
+
+               // Do all the select queries on the replicas, as they are slow (they use
+               // unanchored LIKEs). Naturally this could cause problems if rows are
+               // modified after selecting and before deleting/updating, but working on
+               // the hypothesis that invalid rows will be old and in all likelihood
+               // unreferenced, we should be fine to do it like this.
+               $dbr = $this->getDB( DB_REPLICA, 'vslow' );
+
+               // Find all TitleValue-invalid titles.
+               $percent = $dbr->anyString(); // DBMS-agnostic equivalent of '%' LIKE wildcard
+               $res = $dbr->select(
+                       $table,
+                       [
+                               'id' => $idField,
+                               'ns' => $nsField,
+                               'title' => $titleField,
+                       ],
+                       // The REGEXP operator is not cross-DBMS, so we have to use lots of LIKEs
+                       [ $dbr->makeList( [
+                               $titleField . $dbr->buildLike( $percent, ' ', $percent ),
+                               $titleField . $dbr->buildLike( $percent, "\r", $percent ),
+                               $titleField . $dbr->buildLike( $percent, "\n", $percent ),
+                               $titleField . $dbr->buildLike( $percent, "\t", $percent ),
+                               $titleField . $dbr->buildLike( '_', $percent ),
+                               $titleField . $dbr->buildLike( $percent, '_' ),
+                       ], LIST_OR ) ],
+                       __METHOD__,
+                       [ 'LIMIT' => $this->mBatchSize ]
+               );
+
+               $this->outputStatus( "Number of invalid rows: " . $res->numRows() . "\n" );
+               if ( !$res->numRows() ) {
+                       $this->outputStatus( "\n" );
+                       return;
+               }
+
+               // Write a table of titles to the report file. Also keep a list of the found
+               // IDs, as we might need it later for DB updates
+               $this->writeToReport( sprintf( "%10s |  ns | dbkey\n", $idField ) );
+               $ids = [];
+               foreach ( $res as $row ) {
+                       $this->writeToReport( sprintf( "%10d | %3d | %s\n", $row->id, $row->ns, $row->title ) );
+                       $ids[] = $row->id;
+               }
+
+               // If we're doing a dry run, output the new titles we would use for the UPDATE
+               // queries (if relevant), and finish
+               if ( !$this->hasOption( 'fix' ) ) {
+                       if ( $table === 'logging' || $table === 'archive' ) {
+                               $this->writeToReport( "The following updates would be run with the --fix flag:\n" );
+                               foreach ( $res as $row ) {
+                                       $newTitle = self::makeValidTitle( $row->title );
+                                       $this->writeToReport(
+                                               "$idField={$row->id}: update '{$row->title}' to '$newTitle'\n" );
+                               }
+                       }
+
+                       if ( $table !== 'page' && $table !== 'redirect' ) {
+                               $this->outputStatus( "Run with --fix to clean up these rows\n" );
+                       }
+                       $this->outputStatus( "\n" );
+                       return;
+               }
+
+               // Fix the bad data, using different logic for the various tables
+               $dbw = $this->getDB( DB_MASTER );
+               switch ( $table ) {
+                       case 'page':
+                       case 'redirect':
+                               // This shouldn't happen on production wikis, and we already have a script
+                               // to handle 'page' rows anyway, so just notify the user and let them decide
+                               // what to do next.
+                               $this->outputStatus( <<<TEXT
+IMPORTANT: This script does not fix invalid entries in the $table table.
+Consider repairing these rows, and rows in related tables, by hand.
+You may like to run, or borrow logic from, the cleanupTitles.php script.
+
+TEXT
+                               );
+                               break;
+
+                       case 'archive':
+                       case 'logging':
+                               // Rename the title to a corrected equivalent. Any foreign key relationships
+                               // to the page_title field are already broken, so this will just make sure
+                               // users can still access the log entries/deleted revisions from the interface
+                               // using a valid page title.
+                               $this->outputStatus(
+                                       "Updating these rows, setting $titleField to the closest valid DB key...\n" );
+                               $affectedRowCount = 0;
+                               foreach ( $res as $row ) {
+                                       $newTitle = self::makeValidTitle( $row->title );
+                                       $this->writeToReport(
+                                               "$idField={$row->id}: updating '{$row->title}' to '$newTitle'\n" );
+
+                                       $dbw->update( $table,
+                                               [ $titleField => $newTitle ],
+                                               [ $idField => $row->id ],
+                                               __METHOD__ );
+                                       $affectedRowCount += $dbw->affectedRows();
+                               }
+                               wfWaitForSlaves();
+                               $this->outputStatus( "Updated $affectedRowCount rows on $table.\n" );
+
+                               break;
+
+                       case 'recentchanges':
+                       case 'watchlist':
+                       case 'category':
+                               // Since these broken titles can't exist, there's really nothing to watch,
+                               // nothing can be categorised in them, and they can't have been changed
+                               // recently, so we can just remove these rows.
+                               $this->outputStatus( "Deleting invalid $table rows...\n" );
+                               $dbw->delete( $table, [ $idField => $ids ], __METHOD__ );
+                               wfWaitForSlaves();
+                               $this->outputStatus( 'Deleted ' . $dbw->affectedRows() . " rows from $table.\n" );
+                               break;
+
+                       case 'protected_titles':
+                               // Since these broken titles can't exist, there's really nothing to protect,
+                               // so we can just remove these rows. Made more complicated by this table
+                               // not having an ID field
+                               $this->outputStatus( "Deleting invalid $table rows...\n" );
+                               $affectedRowCount = 0;
+                               foreach ( $res as $row ) {
+                                       $dbw->delete( $table,
+                                               [ $nsField => $row->ns, $titleField => $row->title ],
+                                               __METHOD__ );
+                                       $affectedRowCount += $dbw->affectedRows();
+                               }
+                               wfWaitForSlaves();
+                               $this->outputStatus( "Deleted $affectedRowCount rows from $table.\n" );
+                               break;
+
+                       case 'pagelinks':
+                       case 'templatelinks':
+                       case 'categorylinks':
+                               // Update links tables for each page where these bogus links are supposedly
+                               // located. If the invalid rows don't go away after these jobs go through,
+                               // they're probably being added by a buggy hook.
+                               $this->outputStatus( "Queueing link update jobs for the pages in $idField...\n" );
+                               foreach ( $res as $row ) {
+                                       $wp = WikiPage::newFromID( $row->id );
+                                       if ( $wp ) {
+                                               RefreshLinks::fixLinksFromArticle( $row->id );
+                                       } else {
+                                               // This link entry points to a nonexistent page, so just get rid of it
+                                               $dbw->delete( $table,
+                                                       [ $idField => $row->id, $nsField => $row->ns, $titleField => $row->title ],
+                                                       __METHOD__ );
+                                       }
+                               }
+                               wfWaitForSlaves();
+                               $this->outputStatus( "Link update jobs have been added to the job queue.\n" );
+                               break;
+               }
+
+               $this->outputStatus( "\n" );
+               return;
+       }
+
+       /**
+        * Fix possible validation issues in the given title (DB key).
+        *
+        * @param string $invalidTitle
+        * @return string
+        */
+       protected static function makeValidTitle( $invalidTitle ) {
+               return strtr( trim( $invalidTitle, '_' ),
+                       [ ' ' => '_', "\r" => '', "\n" => '', "\t" => '_' ] );
+       }
+}
+
+$maintClass = 'CleanupInvalidDbKeys';
+require_once RUN_MAINTENANCE_IF_MAIN;
index 863d74a..dbaf643 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
 
@@ -38,31 +39,43 @@ class CleanupRemovedModules extends Maintenance {
                parent::__construct();
                $this->addDescription(
                        'Remove cache entries for removed ResourceLoader modules from the database' );
-               $this->addOption( 'batchsize', 'Delete rows in batches of this size. Default: 500', false, true );
+               $this->setBatchSize( 500 );
        }
 
        public function execute() {
+               $this->output( "Cleaning up module_deps table...\n" );
+
                $dbw = $this->getDB( DB_MASTER );
                $rl = new ResourceLoader( MediaWikiServices::getInstance()->getMainConfig() );
                $moduleNames = $rl->getModuleNames();
-               $moduleList = implode( ', ', array_map( [ $dbw, 'addQuotes' ], $moduleNames ) );
-               $limit = max( 1, intval( $this->getOption( 'batchsize', 500 ) ) );
+               $res = $dbw->select( 'module_deps',
+                       [ 'md_module', 'md_skin' ],
+                       $moduleNames ? 'md_module NOT IN (' . $dbw->makeList( $moduleNames ) . ')' : '1=1',
+                       __METHOD__
+               );
+               $rows = iterator_to_array( $res, false );
 
-               $this->output( "Cleaning up module_deps table...\n" );
-               $i = 1;
                $modDeps = $dbw->tableName( 'module_deps' );
-               do {
-                       // $dbw->delete() doesn't support LIMIT :(
-                       $where = $moduleList ? "md_module NOT IN ($moduleList)" : '1=1';
-                       $dbw->query( "DELETE FROM $modDeps WHERE $where LIMIT $limit", __METHOD__ );
+               $i = 1;
+               foreach ( array_chunk( $rows, $this->mBatchSize ) as $chunk ) {
+                       // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) ..
+                       $conds = array_map( function ( stdClass $row ) use ( $dbw ) {
+                               return $dbw->makeList( (array)$row, IDatabase::LIST_AND );
+                       }, $chunk );
+                       $conds = $dbw->makeList( $conds, IDatabase::LIST_OR );
+
+                       $this->beginTransaction( $dbw, __METHOD__ );
+                       $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ );
                        $numRows = $dbw->affectedRows();
                        $this->output( "Batch $i: $numRows rows\n" );
+                       $this->commitTransaction( $dbw, __METHOD__ );
+
                        $i++;
-                       wfWaitForSlaves();
-               } while ( $numRows > 0 );
-               $this->output( "done\n" );
+               }
+
+               $this->output( "Done\n" );
        }
 }
 
-$maintClass = "CleanupRemovedModules";
+$maintClass = 'CleanupRemovedModules';
 require_once RUN_MAINTENANCE_IF_MAIN;
index 650fae0..ccc6406 100644 (file)
@@ -138,14 +138,14 @@ class TitleCleanup extends TableCleanup {
                                $prior = $title->getDBkey();
                        }
 
-                       # Old cleanupTitles could move articles there. See bug 23147.
+                       # Old cleanupTitles could move articles there. See T25147.
                        $ns = $row->page_namespace;
                        if ( $ns < 0 ) {
                                $ns = 0;
                        }
 
                        # Namespace which no longer exists. Put the page in the main namespace
-                       # since we don't have any idea of the old namespace name. See bug 68501.
+                       # since we don't have any idea of the old namespace name. See T70501.
                        if ( !MWNamespace::exists( $ns ) ) {
                                $ns = 0;
                        }
index b8001a4..675d069 100644 (file)
@@ -23,6 +23,9 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script to convert user options to the new `user_properties` table.
  *
@@ -74,7 +77,7 @@ class ConvertUserOptions extends Maintenance {
 
        /**
         * @param ResultWrapper $res
-        * @param Database $dbw
+        * @param IDatabase $dbw
         * @return null|int
         */
        function convertOptionBatch( $res, $dbw ) {
index 388ad8a..f7e0c0f 100644 (file)
@@ -26,9 +26,11 @@ require_once __DIR__ . '/Maintenance.php';
 /**
  * Maintenance script to create common password cdb database.
  *
- * Meant to take a file like
- * https://github.com/danielmiessler/SecLists/blob/master/Passwords/rockyou.txt?raw=true
- * as input.
+ * Meant to take a file like those from
+ * https://github.com/danielmiessler/SecLists
+ * For example:
+ * https://github.com/danielmiessler/SecLists/blob/fe2b40dd84/Passwords/rockyou.txt?raw=true
+ *
  * @see serialized/commonpasswords.cdb and PasswordPolicyChecks::checkPopularPasswordBlacklist
  * @since 1.27
  * @ingroup Maintenance
index df496d4..e99f2b0 100644 (file)
@@ -26,6 +26,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script that deletes revisions which refer to a nonexisting page.
  *
@@ -83,7 +85,7 @@ class DeleteOrphanedRevisions extends Maintenance {
         * Do this inside a transaction
         *
         * @param array $id Array of revision id values
-        * @param Database $dbw Database class (needs to be a master)
+        * @param IDatabase $dbw Master DB handle
         */
        private function deleteRevs( $id, &$dbw ) {
                if ( !is_array( $id ) ) {
index 0111ac5..3abbdab 100644 (file)
@@ -86,7 +86,6 @@ class DeleteRevision extends Maintenance {
                                );
                                $dbw->delete( 'revision', [ 'rev_id' => $revID ] );
                                if ( $pageLatest == $revID ) {
-                                       // Database integrity
                                        $newLatest = $dbw->selectField(
                                                'revision',
                                                'rev_id',
index a2a06d2..e7ba8fa 100644 (file)
@@ -1322,7 +1322,6 @@ edittoken
 edittools
 editurl
 editusercss
-editusercssjs
 edituserjs
 edoe
 egrave
@@ -1398,7 +1397,6 @@ epcampus
 epcoordinator
 epinstructor
 eponline
-eqiad
 erevoke
 errno
 error
@@ -4571,7 +4569,6 @@ wmls
 wmlsc
 wmlscript
 wmlscriptc
-wmnet
 wordcount
 wordprocessingml
 wordwg
index 9f983c1..6dbad94 100644 (file)
@@ -117,7 +117,7 @@ abstract class DumpIterator extends Maintenance {
        /**
         * Callback function for each revision, child classes should override
         * processRevision instead.
-        * @param Database $rev
+        * @param WikiRevision $rev
         */
        public function handleRevision( $rev ) {
                $title = $rev->getTitle();
index 5d92eec..c6e9aad 100644 (file)
 require_once __DIR__ . '/backup.inc';
 require_once __DIR__ . '/../includes/export/WikiExporter.php';
 
-use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
  * @ingroup Maintenance
  */
 class TextPassDumper extends BackupDumper {
+       /** @var BaseDump */
        public $prefetch = null;
+       /** @var string|bool */
+       private $thisPage;
+       /** @var string|bool */
+       private $thisRev;
 
        // when we spend more than maxTimeAllowed seconds on this run, we continue
        // processing until we write out the next complete page, then save output file(s),
@@ -88,7 +93,7 @@ class TextPassDumper extends BackupDumper {
        protected $checkpointFiles = [];
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        protected $db;
 
@@ -583,8 +588,7 @@ TEXT
                                if ( $text === false && isset( $this->prefetch ) && $prefetchNotTried ) {
                                        $prefetchNotTried = false;
                                        $tryIsPrefetch = true;
-                                       $text = $this->prefetch->prefetch( intval( $this->thisPage ),
-                                               intval( $this->thisRev ) );
+                                       $text = $this->prefetch->prefetch( (int)$this->thisPage, (int)$this->thisRev );
 
                                        if ( $text === null ) {
                                                $text = false;
index d98e5cd..40d29ef 100644 (file)
  * @ingroup Maintenance
  */
 
+use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\Logger\ConsoleSpi;
+use MediaWiki\MediaWikiServices;
+
 $optionsWithArgs = [ 'd' ];
 
 require_once __DIR__ . "/commandLine.inc";
@@ -37,16 +41,13 @@ require_once __DIR__ . "/commandLine.inc";
 if ( isset( $options['d'] ) ) {
        $d = $options['d'];
        if ( $d > 0 ) {
-               $wgDebugLogFile = '/dev/stdout';
+               LoggerFactory::registerProvider( new ConsoleSpi );
+               // Some services hold Logger instances in object properties
+               MediaWikiServices::resetGlobalInstance();
        }
        if ( $d > 1 ) {
-               $lb = wfGetLB();
-               $serverCount = $lb->getServerCount();
-               for ( $i = 0; $i < $serverCount; $i++ ) {
-                       $server = $lb->getServerInfo( $i );
-                       $server['flags'] |= DBO_DEBUG;
-                       $lb->setServerInfo( $i, $server );
-               }
+               wfGetDB( DB_MASTER )->setFlag( DBO_DEBUG );
+               wfGetDB( DB_REPLICA )->setFlag( DBO_DEBUG );
        }
 }
 
index 9dee6e5..9c5a375 100644 (file)
@@ -24,6 +24,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script used to fetch page text in a subprocess.
  *
@@ -71,7 +73,7 @@ class FetchText extends Maintenance {
 
        /**
         * May throw a database error if, say, the server dies during query.
-        * @param Database $db
+        * @param IDatabase $db
         * @param int $id The old_id
         * @return string
         */
index 1d6f31d..79f75ef 100644 (file)
@@ -72,7 +72,7 @@ class FixDoubleRedirects extends Maintenance {
                        'rd_from = pa.page_id',
                        'rd_namespace = pb.page_namespace',
                        'rd_title = pb.page_title',
-                       'rd_interwiki IS NULL OR rd_interwiki = ' . $dbr->addQuotes( '' ), // bug 40352
+                       'rd_interwiki IS NULL OR rd_interwiki = ' . $dbr->addQuotes( '' ), // T42352
                        'pb.page_is_redirect' => 1,
                ];
 
index 87af5b8..fb00bed 100644 (file)
@@ -523,7 +523,7 @@ class GenerateSitemap extends Maintenance {
        function fileEntry( $url, $date, $priority ) {
                return
                        "\t<url>\n" .
-                       // bug 34666: $url may contain bad characters such as ampersands.
+                       // T36666: $url may contain bad characters such as ampersands.
                        "\t\t<loc>" . htmlspecialchars( $url ) . "</loc>\n" .
                        "\t\t<lastmod>$date</lastmod>\n" .
                        "\t\t<priority>$priority</priority>\n" .
@@ -545,7 +545,7 @@ class GenerateSitemap extends Maintenance {
         * @param int $namespace
         */
        function generateLimit( $namespace ) {
-               // bug 17961: make a title with the longest possible URL in this namespace
+               // T19961: make a title with the longest possible URL in this namespace
                $title = Title::makeTitle( $namespace, str_repeat( "\xf0\xa8\xae\x81", 63 ) . "\xe5\x96\x83" );
 
                $this->limit = [
index 677bfa2..ad2fdf8 100644 (file)
@@ -38,30 +38,37 @@ class GetLagTimes extends Maintenance {
        }
 
        public function execute() {
-               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
-               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
+               $services = MediaWikiServices::getInstance();
+               $lbFactory = $services->getDBLoadBalancerFactory();
+               $stats = $services->getStatsdDataFactory();
+               $lbsByType = [
+                       'main' => $lbFactory->getAllMainLBs(),
+                       'external' => $lbFactory->getAllExternalLBs()
+               ];
 
-               $lbs = $lbFactory->getAllMainLBs() + $lbFactory->getAllExternalLBs();
-               foreach ( $lbs as $cluster => $lb ) {
-                       if ( $lb->getServerCount() <= 1 ) {
-                               continue;
-                       }
-                       $lags = $lb->getLagTimes();
-                       foreach ( $lags as $serverIndex => $lag ) {
-                               $host = $lb->getServerName( $serverIndex );
-                               if ( IP::isValid( $host ) ) {
-                                       $ip = $host;
-                                       $host = gethostbyaddr( $host );
-                               } else {
-                                       $ip = gethostbyname( $host );
+               foreach ( $lbsByType as $type => $lbs ) {
+                       foreach ( $lbs as $cluster => $lb ) {
+                               if ( $lb->getServerCount() <= 1 ) {
+                                       continue;
                                }
+                               $lags = $lb->getLagTimes();
+                               foreach ( $lags as $serverIndex => $lag ) {
+                                       $host = $lb->getServerName( $serverIndex );
+                                       if ( IP::isValid( $host ) ) {
+                                               $ip = $host;
+                                               $host = gethostbyaddr( $host );
+                                       } else {
+                                               $ip = gethostbyname( $host );
+                                       }
 
-                               $starLen = min( intval( $lag ), 40 );
-                               $stars = str_repeat( '*', $starLen );
-                               $this->output( sprintf( "%10s %20s %3d %s\n", $ip, $host, $lag, $stars ) );
+                                       $starLen = min( intval( $lag ), 40 );
+                                       $stars = str_repeat( '*', $starLen );
+                                       $this->output( sprintf( "%10s %20s %3d %s\n", $ip, $host, $lag, $stars ) );
 
-                               if ( $this->hasOption( 'report' ) ) {
-                                       $stats->gauge( "loadbalancer.lag.$cluster.$host", $lag );
+                                       if ( $this->hasOption( 'report' ) ) {
+                                               $group = ( $type === 'external' ) ? 'external' : $cluster;
+                                               $stats->gauge( "loadbalancer.lag.$group.$host", intval( $lag * 1e3 ) );
+                                       }
                                }
                        }
                }
index a0fe381..2a102b2 100644 (file)
@@ -106,7 +106,7 @@ class HHVMMakeRepo extends Maintenance {
                $cmd = wfEscapeShellArg(
                        $hhvm,
                        '--hphp',
-                   '--target', 'hhbc',
+                       '--target', 'hhbc',
                        '--format', 'binary',
                        '--force', '1',
                        '--keep-tempdir', '1',
index 4a3d2d6..d396703 100644 (file)
@@ -307,7 +307,11 @@ class ImportImages extends Maintenance {
                                        $publishOptions = [];
                                        $handler = MediaHandler::getHandler( $props['mime'] );
                                        if ( $handler ) {
-                                               $publishOptions['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+                                               $metadata = MediaWiki\quietCall( 'unserialize', $props['metadata'] );
+
+                                               $publishOptions['headers'] = $handler->getContentHeaders(
+                                                       $metadata, $props['width'], $props['height']
+                                               );
                                        } else {
                                                $publishOptions['headers'] = [];
                                        }
@@ -497,7 +501,7 @@ class ImportImages extends Maintenance {
        # (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';
+                       . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
                $body = Http::get( $url, [], __METHOD__ );
                if ( preg_match( '#<ii comment="([^"]*)" />#', $body, $matches ) == 0 ) {
                        return false;
@@ -508,7 +512,7 @@ class ImportImages extends Maintenance {
 
        private function getFileUserFromSourceWiki( $wiki_host, $file ) {
                $url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
-                          . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
+                       . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
                $body = Http::get( $url, [], __METHOD__ );
                if ( preg_match( '#<ii user="([^"]*)" />#', $body, $matches ) == 0 ) {
                        return false;
diff --git a/maintenance/initUserPreference.php b/maintenance/initUserPreference.php
new file mode 100644 (file)
index 0000000..f4da570
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Initialize a user preference based on the value
+ * of another preference.
+ *
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that initializes a user preference
+ * based on the value of another preference.
+ *
+ * @ingroup Maintenance
+ */
+class InitUserPreference extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addOption(
+                       'target',
+                       'Name of the user preference to initialize',
+                       true,
+                       true,
+                       't'
+               );
+               $this->addOption(
+                       'source',
+                       'Name of the user preference to take the value from',
+                       true,
+                       true,
+                       's'
+               );
+               $this->setBatchSize( 300 );
+       }
+
+       public function execute() {
+               $target = $this->getOption( 'target' );
+               $source = $this->getOption( 'source' );
+               $this->output( "Initializing '$target' based on the value of '$source'\n" );
+
+               $dbr = $this->getDB( DB_REPLICA );
+               $dbw = $this->getDB( DB_MASTER );
+
+               $iterator = new BatchRowIterator(
+                       $dbr,
+                       'user_properties',
+                       [ 'up_user', 'up_property' ],
+                       $this->mBatchSize
+               );
+               $iterator->setFetchColumns( [ 'up_user', 'up_value' ] );
+               $iterator->addConditions( [
+                       'up_property' => $source,
+                       'up_value IS NOT NULL',
+                       'up_value != 0',
+               ] );
+
+               $processed = 0;
+               foreach ( $iterator as $batch ) {
+                       foreach ( $batch as $row ) {
+                               $values = [
+                                       'up_user' => $row->up_user,
+                                       'up_property' => $target,
+                                       'up_value' => $row->up_value,
+                               ];
+                               $dbw->upsert(
+                                       'user_properties',
+                                       $values,
+                                       [ 'up_user', 'up_property' ],
+                                       $values,
+                                       __METHOD__
+                               );
+
+                               $processed += $dbw->affectedRows();
+                       }
+               }
+
+               $this->output( "Processed $processed user(s)\n" );
+               $this->output( "Finished!\n" );
+       }
+}
+
+$maintClass = 'InitUserPreference'; // Tells it to run the class
+require_once RUN_MAINTENANCE_IF_MAIN;
index 9fe5009..2c8c8b0 100644 (file)
@@ -33,7 +33,8 @@
                                        "mw.plugin.*",
                                        "mw.cookie",
                                        "mw.experiments",
-                                       "mw.viewport"
+                                       "mw.viewport",
+                                       "mw.htmlform.*"
                                ]
                        },
                        {
index 2b59735..e7fdd7d 100644 (file)
                };
        </script>
        <script>
-               // Emulate startup.js
-               var mwPerformance = { mark: function () {} };
+               // Mock startup.js
+               var mwPerformance = { mark: function () {} },
+                       mwNow = Date.now;
 
                function startUp() {
                        mw.config = new mw.Map();
                }
        </script>
        <script src="modules/lib/jquery/jquery.js"></script>
-       <script src="modules/lib/phpjs-sha1/sha1.js"></script>
        <script src="modules/src/mediawiki/mediawiki.js"></script>
        <script src="modules/src/mediawiki/mediawiki.errorLogger.js"></script>
-       <script src="modules/src/mediawiki/mediawiki.startUp.js"></script>
        <script src="modules/lib/oojs/oojs.jquery.js"></script>
        <script src="modules/lib/oojs-ui/oojs-ui-core.js"></script>
        <script src="modules/lib/oojs-ui/oojs-ui-widgets.js"></script>
@@ -88,7 +87,7 @@
                        background: #fff;
                }
        </style>
-       <link rel="stylesheet" href="modules/src/oojs-ui/oojs-ui-local.css">
+       <link rel="stylesheet" href="modules/src/oojs-ui-local.css">
        <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-core-mediawiki.css">
        <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-widgets-mediawiki.css">
        <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css">
index ed94fc8..6975e25 100644 (file)
 奈及利亞   尼日利亚
 尼日爾      尼日尔
 巴貝多      巴巴多斯
-巴布亞紐幾內亞  巴布亚新几内亚
 布吉納法索        布基纳法索
 蒲隆地      布隆迪
 帛琉 帕劳
 厄利垂亚   厄立特里亚
 亞歷山卓   亚历山大
 雅穆索戈   亚穆苏克罗
-畿內亞      几内亚
 索馬利蘭   索马里兰
 吉力馬札羅        乞力马扎罗
 索馬利亞   索马里
 千里達      特立尼达
 托巴哥      多巴哥
 多明尼加   多米尼加
+斯堪地那維亞     斯堪的纳维亚
 頻寬 带宽
 數位相機   数码相机
 數位照相機        数码照相机
index d21ba55..7a07259 100644 (file)
@@ -10,6 +10,7 @@
 計畫 計劃
 吧台 吧枱
 坐台 坐枱
+坐台铁      坐台鐵
 妆台 妝枱
 弹珠台      彈珠枱
 折台 摺枱
 占有五不   占有五不
 吞占 吞佔
 一地里      一地裏
-一年里      一年裏
 中文里      中文裏
 英文里      英文裏
 古文里      古文裏
 市里的      市裏的
 年代里      年代裏
 年里 年裏
+年里约      年里約 #里约奧運
 店里 店裏
 庙里 廟裏
 往里 往裏
 点里 點裏
 点里程      點里程
 鼓里 鼓裏
+殿里 殿裏
+队里 隊裏
 世纪里      世紀裏
 夜晚里      夜晚裏
 参数里      參數裏
 塞席爾      塞舌爾
 安地卡及巴布達  安提瓜和巴布達
 巴貝多      巴巴多斯
-巴布亞紐幾內亞  巴布亞新畿內亞
+紐幾內亞   新幾內亞
 布吉納法索        布基納法索
 蒲隆地      布隆迪
 帕劳 帛琉
 阿拉伯聯合大公國       阿拉伯聯合酋長國
 馬爾地夫   馬爾代夫
 馬利共和國        馬里共和國
+斯堪地那維亞     斯堪的納維亞
 台球 桌球
 撞球 桌球
 冰淇淋      雪糕
 亞斯文      阿斯旺
 奈及利亞   尼日利亞
 雅穆索戈   雅穆蘇克雷
-幾內亞      畿內亞
-几内亚      畿內亞
 衣索匹亞   埃塞俄比亚
 吉力馬札羅        乞力馬札羅
 厄利垂亚   厄立特里亞
index 4df3f02..6f3304f 100644 (file)
@@ -75,6 +75,7 @@
 於梨华      於梨华
 於潜 於潜
 於志贺      於志贺
+於戏 於戏
 憑藉 凭借
 藉端 借端
 藉故 借故
index bc99cfa..d983932 100644 (file)
 尼日尔      尼日
 尼日爾      尼日
 巴巴多斯   巴貝多
-巴布亚新几内亚  巴布亞紐幾內亞
-巴布亞新畿內亞  巴布亞紐幾內亞
 布基纳法索        布吉納法索
 布基納法索        布吉納法索
 布隆迪      蒲隆地
 波利尼西亚        玻里尼西亞
 波利尼西亞        玻里尼西亞
 新几内亚   紐幾內亞
+新幾內亞   紐幾內亞
 约翰斯顿岛        強斯頓環礁
 巴尔米拉环礁     帕邁拉環礁
 马恩岛      曼島
 阿斯旺      亞斯文
 雅穆苏克雷        雅穆索戈
 雅穆蘇克雷        雅穆索戈
-畿內亞      幾內亞
 索马里兰   索馬利蘭
 索馬里蘭   索馬利蘭
 乞力马扎罗        吉力馬札羅
 得克薩斯   德克薩斯
 蒙特利尔   蒙特婁
 蒙特利爾   蒙特婁
+斯堪的纳维亚     斯堪地那維亞
+斯堪的納維亞     斯堪地那維亞
 麦克尔      麥可
 迈克尔      麥可
 魯賓斯·巴里切羅        魯本·巴瑞切羅
index f106db1..1d53615 100644 (file)
 杜琪峰      杜琪峯
 單向 單向
 轉向 轉向 #分詞用
+十出頭      十出頭
index 21946a1..9b2e081 100644 (file)
 布穀鳥
 穀祿
 穀城縣
+穀氨
+穀胱
 颳雪
 广部
 亂鬨鬨
 喧鬨
 起鬨
 內鬨
-於後
 猜三划五
 划龍舟
 划龍船
 叶韻
 叶音
 叶恭弘
-置於
-散於
-播於
-國於
-敗於
-畢於
-畢業於
-寒於
-任於
-拘於
-插於
-中於
-敏於
-聽於
-短於
-成於
-樊於期
-淡於
-禍於
-格於
-猛於
-施於
-拒人於
-拒於
-潰於
-窮於
-相於
-形於
-半於
-詢於
-美於
-醜於
-好於
-坏於
-強於
-弱於
-差於
-劣於
-染指於
-存於
-隱於
-藏於
-嚴於
-寬於
-給於
-危於
-於徵
-離於
-麗於
-下於
-亞於
-同於
-屑於
-絕於
-致於
-遜於
-任教於
-教於
-自於
-來於
-附於
-阻於
-囿於
-直於
-建於
-都於
-役於
-助於
-害於
-損於
-益於
-從於
-隨於
-順於
-汲於
-溺於
-迷於
-醉於
-行於
-泥於
-身於
-足於
-溢於
-畏於
-視於
-衷於
-狃於
-疲於
-通於
-老於
-耿於
-服於
-臻於
-匿於
-因於
-似於
-遷於
-怒於
-心於
-集於
-容於
 新紮
 紙紮
 紮鐵
 影相弔
 哀弔
 唁弔
-安於
-迫於
-罷於
-蹪於
-甚於
-等於
-定於
-利於
-對於
-歸於
-難於
-移禍於
-生於
-立於
-多於
-勝於
-傳於
-流於
-過於
-關於
-毀於
-基於
-急於
-嫁禍於
-見於
-鑒於
-始於
-出於
-輕於
-幸於
-怠於
-止於
-至於
-拙於
-忠於
-終於
-重於
-垂於
-善於
-死於
-屬於
-浮於
-在於
-易於
-精於
-由於
-補於
-位於
-寓於
-源於
-且於
-長於
-現於
-較於
-分布於
-散於
-優於
-早於
-晚於
-感於
-用於
-處於
-助於
-便於
-戰於
-葬於
-困於
-適於
-苦於
-落於
-取決於
-着眼於
 鬼谷子
 谷子敬
 洪谷子
 精制服
 經有云
 編制法
+防制法
 能干休
 能干戈
 能干擾
 瑞城里
 金城里
 西湖里
+坑口里
 子里甲
 水里商工
 車里雅賓斯克
 區裡有
 實驗裡
 註裡
+殿裡
+隊裡
 裏白 #植物常用名
 烏蘇里 #分詞用
 首發
 高后
 升高後
 提高後
-0年 # 協助分詞
-1年
-2年
-3年
-4年
-5年
-6年
-7年
-8年
-9年
-〇年
-零年
-一年
-兩年
-二年
-三年
-四年
-五年
-六年
-七年
-八年
-九年
-十年
-百年
-千年
-萬年
-億年
 周后
 0周後
 1周後
 伊達里子
 濱田里佳子
 王田里
+田里穗
 小井里
 西井里
 碧河里
 于海
 於海邊
 於海上
+於海拔
+於山東
+於山西
 于凌辰
 于魁智
 于鬯
 吧檯
 賭檯
 坐檯
+坐台鐵
 妝檯
 餐檯
 工作檯
 蒸製
 烹製
 醃製
+鐵製
+鋼製
+銅製
+鋅製
 和製漢
 和製英語
 壓製機
 短發生
 頭發現
 蛋白發
+發狀態
+發狀況
 古人有云
 昔人有云
 云敞
 金聖歎
 天台 #分詞用
 性別扭曲
+箇舊市
+雲南箇舊
index eda0939..c622560 100644 (file)
@@ -86,6 +86,7 @@
 獃氣
 獃子
 獃頭獃腦
+發獃
 希腊
 腊肉
 瞭如
 颳去
 刮去
 么
+換髮
+谷氨酸
+幸免於難
+勝于
+善于
+安于
+寓于
+對于
+屬于
+忠于
+急于
+歸于
+生于
+由于
+終于
+見于
+過于
+長于
+關于
+難于
+箇舊
index 396be1d..597a876 100644 (file)
@@ -79,7 +79,7 @@ class MigrateUserGroup extends Maintenance {
                        $affected += $dbw->affectedRows();
                        $this->commitTransaction( $dbw, __METHOD__ );
 
-                       // Clear cache for the affected users (bug 40340)
+                       // Clear cache for the affected users (T42340)
                        if ( $affected > 0 ) {
                                // XXX: This also invalidates cache of unaffected users that
                                // were in the new group and not in the group.
diff --git a/maintenance/mssql/archives/patch-alter-table-oldimage.sql b/maintenance/mssql/archives/patch-alter-table-oldimage.sql
new file mode 100644 (file)
index 0000000..fb31d6a
--- /dev/null
@@ -0,0 +1 @@
+DROP INDEX /*i*/oi_name_archive_name ON /*_*/oldimage;
index 1c633be..3babb39 100644 (file)
@@ -301,7 +301,7 @@ CREATE TABLE /*_*/categorylinks (
   -- conversion algorithm is run.  We store this so that we can update
   -- collations without reparsing all pages.
   -- Note: If you change the length of this field, you also need to change
-  -- code in LinksUpdate.php. See bug 25254.
+  -- code in LinksUpdate.php. See T27254.
   cl_sortkey_prefix varbinary(255) NOT NULL default 0x,
 
   -- This isn't really used at present. Provided for an optional
@@ -528,7 +528,7 @@ CREATE TABLE /*_*/ipblocks (
   -- Size chosen to allow IPv6
   -- FIXME: these fields were originally blank for single-IP blocks,
   -- but now they are populated. No migration was ever done. They
-  -- should be fixed to be blank again for such blocks (bug 49504).
+  -- should be fixed to be blank again for such blocks (T51504).
   ipb_range_start varchar(255) NOT NULL,
   ipb_range_end varchar(255) NOT NULL,
 
@@ -661,7 +661,6 @@ CREATE TABLE /*_*/oldimage (
 
 CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
 CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
-CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name);
 CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);
 
 
index 07aa282..feaad12 100644 (file)
@@ -38,6 +38,7 @@
  * DEALINGS IN THE SOFTWARE.
  */
 
+// Warning: Converting this to a Maintenance script may reduce performance.
 if ( PHP_SAPI != 'cli' ) {
        die( "This filter can only be run from the command line.\n" );
 }
index dc2eccd..d005629 100644 (file)
@@ -72,7 +72,7 @@ class MWDocGen extends Maintenance {
        }
 
        protected function init() {
-               global $IP;
+               global $wgPhpCli, $IP;
 
                $this->doxygen = $this->getOption( 'doxygen', 'doxygen' );
                $this->mwVersion = $this->getOption( 'version', 'master' );
@@ -86,7 +86,13 @@ class MWDocGen extends Maintenance {
 
                $this->output = $this->getOption( 'output', "$IP/docs" );
 
-               $this->inputFilter = wfShellWikiCmd( $IP . '/maintenance/mwdoc-filter.php' );
+               // Do not use wfShellWikiCmd, because mwdoc-filter.php is not
+               // a Maintenance script.
+               $this->inputFilter = wfEscapeShellArg( [
+                       $wgPhpCli,
+                       $IP . '/maintenance/mwdoc-filter.php'
+               ] );
+
                $this->template = $IP . '/maintenance/Doxyfile';
                $this->excludes = [
                        'vendor',
index 522871d..0bd627f 100644 (file)
  * @ingroup Maintenance
  */
 
+require_once __DIR__ . '/Maintenance.php';
+
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
-
-require_once __DIR__ . '/Maintenance.php';
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
  * Maintenance script that checks for articles to fix after
@@ -38,7 +40,7 @@ require_once __DIR__ . '/Maintenance.php';
 class NamespaceConflictChecker extends Maintenance {
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        protected $db;
 
@@ -571,7 +573,7 @@ class NamespaceConflictChecker extends Maintenance {
        /**
         * Merge page histories
         *
-        * @param integer $id The page_id
+        * @param stdClass $row Page row
         * @param Title $newTitle The new title
         * @return bool
         */
index ba1e879..48c3d37 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Maintenance
  */
 
+use Wikimedia\Rdbms\DBQueryError;
+
 /**
  * When using shared tables that are referenced by foreign keys on local
  * tables you have to change the constraints on local tables.
index 2da8830..e36c5b6 100644 (file)
@@ -30,6 +30,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script that looks for 'orphan' revisions hooked to pages which
  * don't exist and 'childless' pages with no revisions.
@@ -56,7 +58,7 @@ class Orphans extends Maintenance {
 
        /**
         * Lock the appropriate tables for the script
-        * @param Database $db
+        * @param IMaintainableDatabase $db
         * @param string[] $extraTable The name of any extra tables to lock (eg: text)
         */
        private function lockTables( $db, $extraTable = [] ) {
index 17a8d2e..6279a34 100644 (file)
@@ -68,6 +68,7 @@ class CLIParser extends Maintenance {
                        false,
                        true
                );
+               $this->addOption( 'tidy', 'Tidy the output' );
                $this->addArg( 'file', 'File containing wikitext (Default: stdin)', false );
        }
 
@@ -127,10 +128,14 @@ class CLIParser extends Maintenance {
         * @return ParserOutput
         */
        protected function parse( $wikitext ) {
+               $options = new ParserOptions;
+               if ( $this->getOption( 'tidy' ) ) {
+                       $options->setTidy( true );
+               }
                return $this->parser->parse(
                        $wikitext,
                        $this->getTitle(),
-                       new ParserOptions()
+                       $options
                );
        }
 }
index b41e0e0..7d83180 100644 (file)
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Usage:
  *  populateContentModel.php --ns=1 --table=page
  */
 class PopulateContentModel extends Maintenance {
        protected $wikiId;
-
+       /** @var WANObjectCache */
        protected $wanCache;
 
        public function __construct() {
@@ -78,7 +80,7 @@ class PopulateContentModel extends Maintenance {
                $this->wanCache->delete( $revisionKey );
        }
 
-       private function updatePageRows( Database $dbw, $pageIds, $model ) {
+       private function updatePageRows( IDatabase $dbw, $pageIds, $model ) {
                $count = count( $pageIds );
                $this->output( "Setting $count rows to $model..." );
                $dbw->update(
@@ -91,7 +93,7 @@ class PopulateContentModel extends Maintenance {
                $this->output( "done.\n" );
        }
 
-       protected function populatePage( Database $dbw, $ns ) {
+       protected function populatePage( IDatabase $dbw, $ns ) {
                $toSave = [];
                $lastId = 0;
                $nsCondition = $ns === 'all' ? [] : [ 'page_namespace' => $ns ];
@@ -123,7 +125,7 @@ class PopulateContentModel extends Maintenance {
                }
        }
 
-       private function updateRevisionOrArchiveRows( Database $dbw, $ids, $model, $table ) {
+       private function updateRevisionOrArchiveRows( IDatabase $dbw, $ids, $model, $table ) {
                $prefix = $table === 'archive' ? 'ar' : 'rev';
                $model_column = "{$prefix}_content_model";
                $format_column = "{$prefix}_content_format";
@@ -142,7 +144,7 @@ class PopulateContentModel extends Maintenance {
                $this->output( "done.\n" );
        }
 
-       protected function populateRevisionOrArchive( Database $dbw, $table, $ns ) {
+       protected function populateRevisionOrArchive( IDatabase $dbw, $table, $ns ) {
                $prefix = $table === 'archive' ? 'ar' : 'rev';
                $model_column = "{$prefix}_content_model";
                $format_column = "{$prefix}_content_format";
index ac87cf3..5d5da89 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script to populate the rc_source field.
  *
@@ -83,7 +85,7 @@ class PopulateRecentChangesSource extends LoggedUpdateMaintenance {
                return __CLASS__;
        }
 
-       protected function buildUpdateCondition( Database $dbw ) {
+       protected function buildUpdateCondition( IDatabase $dbw ) {
                $rcNew = $dbw->addQuotes( RC_NEW );
                $rcSrcNew = $dbw->addQuotes( RecentChange::SRC_NEW );
                $rcEdit = $dbw->addQuotes( RC_EDIT );
index 5e44faf..a9457c2 100644 (file)
@@ -136,7 +136,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
 
                $content = $rev->getContent();
                if ( !$content ) {
-                       # This should not happen, but sometimes does (bug 20757)
+                       # This should not happen, but sometimes does (T22757)
                        $id = $row->$idCol;
                        $this->output( "Content of $table $id unavailable!\n" );
 
index 095c266..fb97e91 100644 (file)
@@ -156,10 +156,10 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                } catch ( Exception $e ) {
                        $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
 
-                       return false; // bug 22624?
+                       return false; // T24624?
                }
                if ( !is_string( $text ) ) {
-                       # This should not happen, but sometimes does (bug 20757)
+                       # This should not happen, but sometimes does (T22757)
                        $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
 
                        return false;
@@ -185,11 +185,11 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                } catch ( Exception $e ) {
                        $this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
 
-                       return false; // bug 22624?
+                       return false; // T24624?
                }
                $text = $rev->getSerializedData();
                if ( !is_string( $text ) ) {
-                       # This should not happen, but sometimes does (bug 20757)
+                       # This should not happen, but sometimes does (T22757)
                        $this->output( "Data of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
 
                        return false;
index b354399..cf65c69 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+
 /**
  * Maintenance script that sends purge requests for pages edited in a date
  * range to squid/varnish.
diff --git a/maintenance/purgeModuleDeps.php b/maintenance/purgeModuleDeps.php
new file mode 100644 (file)
index 0000000..feeeb65
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Remove all cache entries for ResourceLoader modules from the database.
+ *
+ * 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 Timo Tijhof
+ */
+
+use Wikimedia\Rdbms\IDatabase;
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to purge the module_deps database cache table.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeModuleDeps extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription(
+                       'Remove all cache entries for ResourceLoader modules from the database' );
+               $this->setBatchSize( 500 );
+       }
+
+       public function execute() {
+               $this->output( "Cleaning up module_deps table...\n" );
+
+               $dbw = $this->getDB( DB_MASTER );
+               $res = $dbw->select( 'module_deps', [ 'md_module', 'md_skin' ], [], __METHOD__ );
+               $rows = iterator_to_array( $res, false );
+
+               $modDeps = $dbw->tableName( 'module_deps' );
+               $i = 1;
+               foreach ( array_chunk( $rows, $this->mBatchSize ) as $chunk ) {
+                       // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) ..
+                       $conds = array_map( function ( stdClass $row ) use ( $dbw ) {
+                               return $dbw->makeList( (array)$row, IDatabase::LIST_AND );
+                       }, $chunk );
+                       $conds = $dbw->makeList( $conds, IDatabase::LIST_OR );
+
+                       $this->beginTransaction( $dbw, __METHOD__ );
+                       $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ );
+                       $numRows = $dbw->affectedRows();
+                       $this->output( "Batch $i: $numRows rows\n" );
+                       $this->commitTransaction( $dbw, __METHOD__ );
+
+                       $i++;
+               }
+
+               $this->output( "Done\n" );
+       }
+}
+
+$maintClass = 'PurgeModuleDeps';
+require_once RUN_MAINTENANCE_IF_MAIN;
index d073282..04ac967 100644 (file)
@@ -41,7 +41,7 @@ class RebuildFileCache extends Maintenance {
        }
 
        public function finalSetup() {
-               global $wgDebugToolbar, $wgUseFileCache, $wgReadOnly;
+               global $wgDebugToolbar, $wgUseFileCache;
 
                $this->enabled = $wgUseFileCache;
                // Script will handle capturing output and saving it itself
@@ -50,7 +50,8 @@ class RebuildFileCache extends Maintenance {
                // Has to be done before Setup.php initialize MWDebug
                $wgDebugToolbar = false;
                //  Avoid DB writes (like enotif/counters)
-               $wgReadOnly = 'Building cache'; // avoid DB writes (like enotif/counters)
+               MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode()
+                       ->setReason( 'Building cache' );
 
                parent::finalSetup();
        }
@@ -140,7 +141,7 @@ class RebuildFileCache extends Maintenance {
 
                                        MediaWiki\suppressWarnings(); // header notices
                                        // Cache ?action=view
-                                       $wgRequestTime = microtime( true ); # bug 22852
+                                       $wgRequestTime = microtime( true ); # T24852
                                        ob_start();
                                        $article->view();
                                        $context->getOutput()->output();
@@ -148,7 +149,7 @@ class RebuildFileCache extends Maintenance {
                                        $viewHtml = ob_get_clean();
                                        $viewCache->saveToFileCache( $viewHtml );
                                        // Cache ?action=history
-                                       $wgRequestTime = microtime( true ); # bug 22852
+                                       $wgRequestTime = microtime( true ); # T24852
                                        ob_start();
                                        Action::factory( 'history', $article, $context )->show();
                                        $context->getOutput()->output();
index 6aa1f37..109350c 100644 (file)
@@ -32,6 +32,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script to update image metadata records.
  *
@@ -40,7 +42,7 @@ require_once __DIR__ . '/Maintenance.php';
 class ImageBuilder extends Maintenance {
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        protected $dbw;
 
@@ -61,7 +63,8 @@ class ImageBuilder extends Maintenance {
                $this->dbw = $this->getDB( DB_MASTER );
                $this->dryrun = $this->hasOption( 'dry-run' );
                if ( $this->dryrun ) {
-                       $GLOBALS['wgReadOnly'] = 'Dry run mode, image upgrades are suppressed';
+                       MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode()
+                               ->setReason( 'Dry run mode, image upgrades are suppressed' );
                }
 
                if ( $this->hasOption( 'missing' ) ) {
index 458dacf..142a4e5 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 require_once __DIR__ . '/Maintenance.php';
+use MediaWiki\MediaWikiServices;
 
 /**
  * Maintenance script that rebuilds recent changes from scratch.
@@ -478,15 +479,16 @@ class RebuildRecentchanges extends Maintenance {
        }
 
        /**
-        * Purge cached feeds in $messageMemc
+        * Purge cached feeds in $wanCache
         */
        private function purgeFeeds() {
-               global $wgFeedClasses, $messageMemc;
+               global $wgFeedClasses;
 
                $this->output( "Deleting feed timestamps.\n" );
 
+               $wanCache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                foreach ( $wgFeedClasses as $feed => $className ) {
-                       $messageMemc->delete( wfMemcKey( 'rcfeed', $feed, 'timestamp' ) ); # Good enough for now.
+                       $wanCache->delete( $wanCache->makeKey( 'rcfeed', $feed, 'timestamp' ) ); # Good enough for now.
                }
        }
 }
index b7f0762..faa4d96 100644 (file)
@@ -27,6 +27,9 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+use Wikimedia\Rdbms\DatabaseSqlite;
+
 /**
  * Maintenance script that rebuilds search index table from scratch.
  *
@@ -36,7 +39,7 @@ class RebuildTextIndex extends Maintenance {
        const RTI_CHUNK_SIZE = 500;
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        private $db;
 
index e075501..e252256 100644 (file)
@@ -48,41 +48,65 @@ class RefreshFileHeaders extends Maintenance {
 
                $count = 0;
                $dbr = $this->getDB( DB_REPLICA );
+
                do {
                        $conds = [ "img_name > {$dbr->addQuotes( $start )}" ];
+
                        if ( strlen( $end ) ) {
                                $conds[] = "img_name <= {$dbr->addQuotes( $end )}";
                        }
+
                        $res = $dbr->select( 'image', '*', $conds,
                                __METHOD__, [ 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'img_name ASC' ] );
+
+                       if ( $res->numRows() > 0 ) {
+                               $row1 = $res->current();
+                               $this->output( "Processing next {$res->numRows()} row(s) starting with {$row1->img_name}.\n" );
+                               $res->rewind();
+                       }
+
+                       $backendOperations = [];
+
                        foreach ( $res as $row ) {
                                $file = $repo->newFileFromRow( $row );
-                               $headers = $file->getStreamHeaders();
+                               $headers = $file->getContentHeaders();
+
                                if ( count( $headers ) ) {
-                                       $this->updateFileHeaders( $file, $headers );
+                                       $backendOperations[] = [
+                                               'op' => 'describe', 'src' => $file->getPath(), 'headers' => $headers
+                                       ];
                                }
+
                                // Do all of the older file versions...
                                foreach ( $file->getHistory() as $oldFile ) {
-                                       $headers = $oldFile->getStreamHeaders();
+                                       $headers = $oldFile->getContentHeaders();
                                        if ( count( $headers ) ) {
-                                               $this->updateFileHeaders( $oldFile, $headers );
+                                               $backendOperations[] = [
+                                                       'op' => 'describe', 'src' => $oldFile->getPath(), 'headers' => $headers
+                                               ];
                                        }
                                }
+
                                if ( $this->hasOption( 'verbose' ) ) {
-                                       $this->output( "Updated headers for file '{$row->img_name}'.\n" );
+                                       $this->output( "Queued headers update for file '{$row->img_name}'.\n" );
                                }
-                               ++$count;
+
                                $start = $row->img_name; // advance
                        }
-               } while ( $res->numRows() > 0 );
+
+                       $backendOperationsCount = count( $backendOperations );
+                       $count += $backendOperationsCount;
+
+                       $this->output( "Updating headers for {$backendOperationsCount} file(s).\n" );
+                       $this->updateFileHeaders( $repo, $backendOperations );
+               } while ( $res->numRows() === $this->mBatchSize );
 
                $this->output( "Done. Updated headers for $count file(s).\n" );
        }
 
-       protected function updateFileHeaders( File $file, array $headers ) {
-               $status = $file->getRepo()->getBackend()->describe( [
-                       'src' => $file->getPath(), 'headers' => $headers
-               ] );
+       protected function updateFileHeaders( $repo, $backendOperations ) {
+               $status = $repo->getBackend()->doQuickOperations( $backendOperations );
+
                if ( !$status->isGood() ) {
                        $this->error( "Encountered error: " . print_r( $status, true ) );
                }
index 372c352..f6e9e9c 100644 (file)
@@ -29,6 +29,9 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script to refresh image metadata fields.
  *
@@ -37,7 +40,7 @@ require_once __DIR__ . '/Maintenance.php';
 class RefreshImageMetadata extends Maintenance {
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        protected $dbw;
 
@@ -132,10 +135,8 @@ class RefreshImageMetadata extends Maintenance {
 
                        if ( $res->numRows() > 0 ) {
                                $row1 = $res->current();
-                               $this->output( "Processing next {$this->mBatchSize} rows starting with {$row1->img_name}.\n" );
+                               $this->output( "Processing next {$res->numRows()} row(s) starting with {$row1->img_name}.\n" );
                                $res->rewind();
-                       } else {
-                               $this->error( "No images to process.", 4 );
                        }
 
                        foreach ( $res as $row ) {
@@ -205,7 +206,7 @@ class RefreshImageMetadata extends Maintenance {
        }
 
        /**
-        * @param Database $dbw
+        * @param IDatabase $dbw
         * @return array
         */
        function getConditions( $dbw ) {
index fb24a1d..9f3552a 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -272,8 +274,11 @@ class RefreshLinks extends Maintenance {
                        return;
                }
 
-               foreach ( $content->getSecondaryDataUpdates( $page->getTitle() ) as $update ) {
+               $updates = $content->getSecondaryDataUpdates(
+                       $page->getTitle(), /* $old = */ null, /* $recursive = */ false );
+               foreach ( $updates as $update ) {
                        DeferredUpdates::addUpdate( $update );
+                       DeferredUpdates::doUpdates();
                }
        }
 
@@ -386,7 +391,7 @@ class RefreshLinks extends Maintenance {
         * By specifying a null $start or $end, it is also possible to create
         * half-bounded or unbounded intervals using this function.
         *
-        * @param IDatabase $db Database connection
+        * @param IDatabase $db
         * @param string $var Field name
         * @param mixed $start First value to include or null
         * @param mixed $end Last value to include or null
index dbce7a7..516038d 100755 (executable)
@@ -44,15 +44,15 @@ mkdir -p "$REPO_DIR/$TARGET_DIR/i18n"
 mkdir -p "$REPO_DIR/$TARGET_DIR/images"
 mkdir -p "$REPO_DIR/$TARGET_DIR/themes/mediawiki/images"
 mkdir -p "$REPO_DIR/$TARGET_DIR/themes/apex/images"
-cp ./node_modules/oojs-ui/dist/oojs-ui-core.js "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/oojs-ui-core.js{,.map} "$REPO_DIR/$TARGET_DIR"
 cp ./node_modules/oojs-ui/dist/oojs-ui-core-{mediawiki,apex}.css "$REPO_DIR/$TARGET_DIR"
-cp ./node_modules/oojs-ui/dist/oojs-ui-widgets.js "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/oojs-ui-widgets.js{,.map} "$REPO_DIR/$TARGET_DIR"
 cp ./node_modules/oojs-ui/dist/oojs-ui-widgets-{mediawiki,apex}.css "$REPO_DIR/$TARGET_DIR"
-cp ./node_modules/oojs-ui/dist/oojs-ui-toolbars.js "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/oojs-ui-toolbars.js{,.map} "$REPO_DIR/$TARGET_DIR"
 cp ./node_modules/oojs-ui/dist/oojs-ui-toolbars-{mediawiki,apex}.css "$REPO_DIR/$TARGET_DIR"
-cp ./node_modules/oojs-ui/dist/oojs-ui-windows.js "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/oojs-ui-windows.js{,.map} "$REPO_DIR/$TARGET_DIR"
 cp ./node_modules/oojs-ui/dist/oojs-ui-windows-{mediawiki,apex}.css "$REPO_DIR/$TARGET_DIR"
-cp ./node_modules/oojs-ui/dist/oojs-ui-{mediawiki,apex}.js "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/oojs-ui-{mediawiki,apex}.js{,.map} "$REPO_DIR/$TARGET_DIR"
 cp -R ./node_modules/oojs-ui/dist/i18n "$REPO_DIR/$TARGET_DIR"
 cp -R ./node_modules/oojs-ui/dist/images "$REPO_DIR/$TARGET_DIR"
 cp -R ./node_modules/oojs-ui/dist/themes/mediawiki/images "$REPO_DIR/$TARGET_DIR/themes/mediawiki"
index f8eedb3..b0a2b92 100644 (file)
@@ -25,6 +25,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script to run a database query in batches and wait for replica DBs.
  *
index 47ef804..65c353a 100644 (file)
  * @author Gergő Tisza <tgr.huwiki@gmail.com>
  */
 
+use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\Logger\ConsoleSpi;
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -46,8 +50,8 @@ class MediaWikiShell extends Maintenance {
                parent::__construct();
                $this->addOption( 'd',
                        'For back compatibility with eval.php. ' .
-                       '0 send debug to stdout. ' .
-                       'With 1 additionally initialize database with debugging ',
+                       '1 send debug to stderr. ' .
+                       'With 2 additionally initialize database with debugging ',
                        false, true
                );
        }
@@ -77,22 +81,16 @@ class MediaWikiShell extends Maintenance {
         * For back compatibility with eval.php
         */
        protected function setupLegacy() {
-               global $wgDebugLogFile;
-
                $d = intval( $this->getOption( 'd' ) );
                if ( $d > 0 ) {
-                       $wgDebugLogFile = 'php://stdout';
+                       LoggerFactory::registerProvider( new ConsoleSpi );
+                       // Some services hold Logger instances in object properties
+                       MediaWikiServices::resetGlobalInstance();
                }
                if ( $d > 1 ) {
                        # Set DBO_DEBUG (equivalent of $wgDebugDumpSql)
-                       # XXX copy pasted from eval.php :(
-                       $lb = wfGetLB();
-                       $serverCount = $lb->getServerCount();
-                       for ( $i = 0; $i < $serverCount; $i++ ) {
-                               $server = $lb->getServerInfo( $i );
-                               $server['flags'] |= DBO_DEBUG;
-                               $lb->setServerInfo( $i, $server );
-                       }
+                       wfGetDB( DB_MASTER )->setFlag( DBO_DEBUG );
+                       wfGetDB( DB_REPLICA )->setFlag( DBO_DEBUG );
                }
        }
 
index cc976ed..36e55f3 100644 (file)
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBQueryError;
+
 /**
  * Maintenance script that sends SQL queries from the specified file to the database.
  *
@@ -50,7 +54,7 @@ class MwSql extends Maintenance {
                $wiki = $this->hasOption( 'wikidb' ) ? $this->getOption( 'wikidb' ) : false;
                // Get the appropriate load balancer (for this wiki)
                if ( $this->hasOption( 'cluster' ) ) {
-                       $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ), $wiki );
+                       $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) );
                } else {
                        $lb = wfGetLB( $wiki );
                }
@@ -74,7 +78,7 @@ class MwSql extends Maintenance {
                        $index = DB_MASTER;
                }
 
-               /** @var Database $db DB handle for the appropriate cluster/wiki */
+               /** @var IDatabase $db DB handle for the appropriate cluster/wiki */
                $db = $lb->getConnection( $index, [], $wiki );
                if ( $replicaDB != '' && $db->getLBInfo( 'master' ) !== null ) {
                        $this->error( "The server selected ({$db->getServer()}) is not a replica DB.", 1 );
@@ -137,7 +141,7 @@ class MwSql extends Maintenance {
                        }
                        if ( $historyFile ) {
                                # Delimiter is eated by streamStatementEnd, we add it
-                               # up in the history (bug 37020)
+                               # up in the history (T39020)
                                readline_add_history( $wholeLine . ';' );
                                readline_write_history( $historyFile );
                        }
@@ -159,7 +163,7 @@ class MwSql extends Maintenance {
 
        /**
         * Print the results, callback for $db->sourceStream()
-        * @param ResultWrapper $res The results object
+        * @param ResultWrapper|bool $res The results object
         * @param IDatabase $db
         */
        public function sqlPrintResult( $res, $db ) {
index 33ca0ff..117e9cc 100644 (file)
@@ -21,6 +21,9 @@
  * @ingroup Maintenance
  */
 
+use Wikimedia\Rdbms\DatabaseSqlite;
+use Wikimedia\Rdbms\DBError;
+
 /**
  * This class contains code common to different SQLite-related maintenance scripts
  *
index f322a03..2d0c9ee 100644 (file)
@@ -3,7 +3,7 @@
 -- Unique indexes need to be handled with INSERT SELECT since just running
 -- the CREATE INDEX statement will fail if there are duplicate values.
 --
--- Ignore duplicates, several tables will have them (e.g. bug 16966) but in
+-- Ignore duplicates, several tables will have them (e.g. T18966) but in
 -- most cases it's harmless to discard them.
 
 --------------------------------------------------------------------------------
diff --git a/maintenance/storage/fixBug20757.php b/maintenance/storage/fixBug20757.php
deleted file mode 100644 (file)
index b444f31..0000000
+++ /dev/null
@@ -1,349 +0,0 @@
-<?php
-/**
- * Script to fix bug 20757.
- *
- * 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 ExternalStorage
- */
-
-require_once __DIR__ . '/../Maintenance.php';
-
-/**
- * Maintenance script to fix bug 20757.
- *
- * @ingroup Maintenance ExternalStorage
- */
-class FixBug20757 extends Maintenance {
-       public $batchSize = 10000;
-       public $mapCache = [];
-       public $mapCacheSize = 0;
-       public $maxMapCacheSize = 1000000;
-
-       function __construct() {
-               parent::__construct();
-               $this->addDescription( 'Script to fix bug 20757 assuming that blob_tracking is intact' );
-               $this->addOption( 'dry-run', 'Report only' );
-               $this->addOption( 'start', 'old_id to start at', false, true );
-       }
-
-       function execute() {
-               $dbr = $this->getDB( DB_REPLICA );
-               $dbw = $this->getDB( DB_MASTER );
-
-               $dryRun = $this->getOption( 'dry-run' );
-               if ( $dryRun ) {
-                       print "Dry run only.\n";
-               }
-
-               $startId = $this->getOption( 'start', 0 );
-               $numGood = 0;
-               $numFixed = 0;
-               $numBad = 0;
-
-               $totalRevs = $dbr->selectField( 'text', 'MAX(old_id)', false, __METHOD__ );
-
-               // In MySQL 4.1+, the binary field old_text has a non-working LOWER() function
-               $lowerLeft = 'LOWER(CONVERT(LEFT(old_text,22) USING latin1))';
-
-               while ( true ) {
-                       print "ID: $startId / $totalRevs\r";
-
-                       $res = $dbr->select(
-                               'text',
-                               [ 'old_id', 'old_flags', 'old_text' ],
-                               [
-                                       'old_id > ' . intval( $startId ),
-                                       'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\'',
-                                       "$lowerLeft = 'o:15:\"historyblobstub\"'",
-                               ],
-                               __METHOD__,
-                               [
-                                       'ORDER BY' => 'old_id',
-                                       'LIMIT' => $this->batchSize,
-                               ]
-                       );
-
-                       if ( !$res->numRows() ) {
-                               break;
-                       }
-
-                       $secondaryIds = [];
-                       $stubs = [];
-
-                       foreach ( $res as $row ) {
-                               $startId = $row->old_id;
-
-                               // Basic sanity checks
-                               $obj = unserialize( $row->old_text );
-                               if ( $obj === false ) {
-                                       print "{$row->old_id}: unrecoverable: cannot unserialize\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               if ( !is_object( $obj ) ) {
-                                       print "{$row->old_id}: unrecoverable: unserialized to type " .
-                                               gettype( $obj ) . ", possible double-serialization\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               if ( strtolower( get_class( $obj ) ) !== 'historyblobstub' ) {
-                                       print "{$row->old_id}: unrecoverable: unexpected object class " .
-                                               get_class( $obj ) . "\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               // Process flags
-                               $flags = explode( ',', $row->old_flags );
-                               if ( in_array( 'utf-8', $flags ) || in_array( 'utf8', $flags ) ) {
-                                       $legacyEncoding = false;
-                               } else {
-                                       $legacyEncoding = true;
-                               }
-
-                               // Queue the stub for future batch processing
-                               $id = intval( $obj->mOldId );
-                               $secondaryIds[] = $id;
-                               $stubs[$row->old_id] = [
-                                       'legacyEncoding' => $legacyEncoding,
-                                       'secondaryId' => $id,
-                                       'hash' => $obj->mHash,
-                               ];
-                       }
-
-                       $secondaryIds = array_unique( $secondaryIds );
-
-                       if ( !count( $secondaryIds ) ) {
-                               continue;
-                       }
-
-                       // Run the batch query on blob_tracking
-                       $res = $dbr->select(
-                               'blob_tracking',
-                               '*',
-                               [
-                                       'bt_text_id' => $secondaryIds,
-                               ],
-                               __METHOD__
-                       );
-                       $trackedBlobs = [];
-                       foreach ( $res as $row ) {
-                               $trackedBlobs[$row->bt_text_id] = $row;
-                       }
-
-                       // Process the stubs
-                       foreach ( $stubs as $primaryId => $stub ) {
-                               $secondaryId = $stub['secondaryId'];
-                               if ( !isset( $trackedBlobs[$secondaryId] ) ) {
-                                       // No tracked blob. Work out what went wrong
-                                       $secondaryRow = $dbr->selectRow(
-                                               'text',
-                                               [ 'old_flags', 'old_text' ],
-                                               [ 'old_id' => $secondaryId ],
-                                               __METHOD__
-                                       );
-                                       if ( !$secondaryRow ) {
-                                               print "$primaryId: unrecoverable: secondary row is missing\n";
-                                               ++$numBad;
-                                       } elseif ( $this->isUnbrokenStub( $stub, $secondaryRow ) ) {
-                                               // Not broken yet, and not in the tracked clusters so it won't get
-                                               // broken by the current RCT run.
-                                               ++$numGood;
-                                       } elseif ( strpos( $secondaryRow->old_flags, 'external' ) !== false ) {
-                                               print "$primaryId: unrecoverable: secondary gone to {$secondaryRow->old_text}\n";
-                                               ++$numBad;
-                                       } else {
-                                               print "$primaryId: unrecoverable: miscellaneous corruption of secondary row\n";
-                                               ++$numBad;
-                                       }
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-                               $trackRow = $trackedBlobs[$secondaryId];
-
-                               // Check that the specified text really is available in the tracked source row
-                               $url = "DB://{$trackRow->bt_cluster}/{$trackRow->bt_blob_id}/{$stub['hash']}";
-                               $text = ExternalStore::fetchFromURL( $url );
-                               if ( $text === false ) {
-                                       print "$primaryId: unrecoverable: source text missing\n";
-                                       ++$numBad;
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-                               if ( md5( $text ) !== $stub['hash'] ) {
-                                       print "$primaryId: unrecoverable: content hashes do not match\n";
-                                       ++$numBad;
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-
-                               // Find the page_id and rev_id
-                               // The page is probably the same as the page of the secondary row
-                               $pageId = intval( $trackRow->bt_page );
-                               if ( !$pageId ) {
-                                       $revId = $pageId = 0;
-                               } else {
-                                       $revId = $this->findTextIdInPage( $pageId, $primaryId );
-                                       if ( !$revId ) {
-                                               // Actually an orphan
-                                               $pageId = $revId = 0;
-                                       }
-                               }
-
-                               $newFlags = $stub['legacyEncoding'] ? 'external' : 'external,utf-8';
-
-                               if ( !$dryRun ) {
-                                       // Reset the text row to point to the original copy
-                                       $this->beginTransaction( $dbw, __METHOD__ );
-                                       $dbw->update(
-                                               'text',
-                                               // SET
-                                               [
-                                                       'old_flags' => $newFlags,
-                                                       'old_text' => $url
-                                               ],
-                                               // WHERE
-                                               [ 'old_id' => $primaryId ],
-                                               __METHOD__
-                                       );
-
-                                       // Add a blob_tracking row so that the new reference can be recompressed
-                                       // without needing to run trackBlobs.php again
-                                       $dbw->insert( 'blob_tracking',
-                                               [
-                                                       'bt_page' => $pageId,
-                                                       'bt_rev_id' => $revId,
-                                                       'bt_text_id' => $primaryId,
-                                                       'bt_cluster' => $trackRow->bt_cluster,
-                                                       'bt_blob_id' => $trackRow->bt_blob_id,
-                                                       'bt_cgz_hash' => $stub['hash'],
-                                                       'bt_new_url' => null,
-                                                       'bt_moved' => 0,
-                                               ],
-                                               __METHOD__
-                                       );
-                                       $this->commitTransaction( $dbw, __METHOD__ );
-                                       $this->waitForSlaves();
-                               }
-
-                               print "$primaryId: resolved to $url\n";
-                               ++$numFixed;
-                       }
-               }
-
-               print "\n";
-               print "Fixed: $numFixed\n";
-               print "Unrecoverable: $numBad\n";
-               print "Good stubs: $numGood\n";
-       }
-
-       function waitForSlaves() {
-               static $iteration = 0;
-               ++$iteration;
-               if ( ++$iteration > 50 == 0 ) {
-                       wfWaitForSlaves();
-                       $iteration = 0;
-               }
-       }
-
-       function findTextIdInPage( $pageId, $textId ) {
-               $ids = $this->getRevTextMap( $pageId );
-               if ( !isset( $ids[$textId] ) ) {
-                       return null;
-               } else {
-                       return $ids[$textId];
-               }
-       }
-
-       function getRevTextMap( $pageId ) {
-               if ( !isset( $this->mapCache[$pageId] ) ) {
-                       // Limit cache size
-                       while ( $this->mapCacheSize > $this->maxMapCacheSize ) {
-                               $key = key( $this->mapCache );
-                               $this->mapCacheSize -= count( $this->mapCache[$key] );
-                               unset( $this->mapCache[$key] );
-                       }
-
-                       $dbr = $this->getDB( DB_REPLICA );
-                       $map = [];
-                       $res = $dbr->select( 'revision',
-                               [ 'rev_id', 'rev_text_id' ],
-                               [ 'rev_page' => $pageId ],
-                               __METHOD__
-                       );
-                       foreach ( $res as $row ) {
-                               $map[$row->rev_text_id] = $row->rev_id;
-                       }
-                       $this->mapCache[$pageId] = $map;
-                       $this->mapCacheSize += count( $map );
-               }
-
-               return $this->mapCache[$pageId];
-       }
-
-       /**
-        * This is based on part of HistoryBlobStub::getText().
-        * Determine if the text can be retrieved from the row in the normal way.
-        * @param array $stub
-        * @param stdClass $secondaryRow
-        * @return bool
-        */
-       function isUnbrokenStub( $stub, $secondaryRow ) {
-               $flags = explode( ',', $secondaryRow->old_flags );
-               $text = $secondaryRow->old_text;
-               if ( in_array( 'external', $flags ) ) {
-                       $url = $text;
-                       MediaWiki\suppressWarnings();
-                       list( /* $proto */, $path ) = explode( '://', $url, 2 );
-                       MediaWiki\restoreWarnings();
-
-                       if ( $path == "" ) {
-                               return false;
-                       }
-                       $text = ExternalStore::fetchFromURL( $url );
-               }
-               if ( !in_array( 'object', $flags ) ) {
-                       return false;
-               }
-
-               if ( in_array( 'gzip', $flags ) ) {
-                       $obj = unserialize( gzinflate( $text ) );
-               } else {
-                       $obj = unserialize( $text );
-               }
-
-               if ( !is_object( $obj ) ) {
-                       // Correct for old double-serialization bug.
-                       $obj = unserialize( $obj );
-               }
-
-               if ( !is_object( $obj ) ) {
-                       return false;
-               }
-
-               $obj->uncompress();
-               $text = $obj->getItem( $stub['hash'] );
-
-               return $text !== false;
-       }
-}
-
-$maintClass = 'FixBug20757';
-require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/fixT22757.php b/maintenance/storage/fixT22757.php
new file mode 100644 (file)
index 0000000..e8bd23d
--- /dev/null
@@ -0,0 +1,349 @@
+<?php
+/**
+ * Script to fix T22757.
+ *
+ * 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 ExternalStorage
+ */
+
+require_once __DIR__ . '/../Maintenance.php';
+
+/**
+ * Maintenance script to fix T22757.
+ *
+ * @ingroup Maintenance ExternalStorage
+ */
+class FixT22757 extends Maintenance {
+       public $batchSize = 10000;
+       public $mapCache = [];
+       public $mapCacheSize = 0;
+       public $maxMapCacheSize = 1000000;
+
+       function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Script to fix T22757 assuming that blob_tracking is intact' );
+               $this->addOption( 'dry-run', 'Report only' );
+               $this->addOption( 'start', 'old_id to start at', false, true );
+       }
+
+       function execute() {
+               $dbr = $this->getDB( DB_REPLICA );
+               $dbw = $this->getDB( DB_MASTER );
+
+               $dryRun = $this->getOption( 'dry-run' );
+               if ( $dryRun ) {
+                       print "Dry run only.\n";
+               }
+
+               $startId = $this->getOption( 'start', 0 );
+               $numGood = 0;
+               $numFixed = 0;
+               $numBad = 0;
+
+               $totalRevs = $dbr->selectField( 'text', 'MAX(old_id)', false, __METHOD__ );
+
+               // In MySQL 4.1+, the binary field old_text has a non-working LOWER() function
+               $lowerLeft = 'LOWER(CONVERT(LEFT(old_text,22) USING latin1))';
+
+               while ( true ) {
+                       print "ID: $startId / $totalRevs\r";
+
+                       $res = $dbr->select(
+                               'text',
+                               [ 'old_id', 'old_flags', 'old_text' ],
+                               [
+                                       'old_id > ' . intval( $startId ),
+                                       'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\'',
+                                       "$lowerLeft = 'o:15:\"historyblobstub\"'",
+                               ],
+                               __METHOD__,
+                               [
+                                       'ORDER BY' => 'old_id',
+                                       'LIMIT' => $this->batchSize,
+                               ]
+                       );
+
+                       if ( !$res->numRows() ) {
+                               break;
+                       }
+
+                       $secondaryIds = [];
+                       $stubs = [];
+
+                       foreach ( $res as $row ) {
+                               $startId = $row->old_id;
+
+                               // Basic sanity checks
+                               $obj = unserialize( $row->old_text );
+                               if ( $obj === false ) {
+                                       print "{$row->old_id}: unrecoverable: cannot unserialize\n";
+                                       ++$numBad;
+                                       continue;
+                               }
+
+                               if ( !is_object( $obj ) ) {
+                                       print "{$row->old_id}: unrecoverable: unserialized to type " .
+                                               gettype( $obj ) . ", possible double-serialization\n";
+                                       ++$numBad;
+                                       continue;
+                               }
+
+                               if ( strtolower( get_class( $obj ) ) !== 'historyblobstub' ) {
+                                       print "{$row->old_id}: unrecoverable: unexpected object class " .
+                                               get_class( $obj ) . "\n";
+                                       ++$numBad;
+                                       continue;
+                               }
+
+                               // Process flags
+                               $flags = explode( ',', $row->old_flags );
+                               if ( in_array( 'utf-8', $flags ) || in_array( 'utf8', $flags ) ) {
+                                       $legacyEncoding = false;
+                               } else {
+                                       $legacyEncoding = true;
+                               }
+
+                               // Queue the stub for future batch processing
+                               $id = intval( $obj->mOldId );
+                               $secondaryIds[] = $id;
+                               $stubs[$row->old_id] = [
+                                       'legacyEncoding' => $legacyEncoding,
+                                       'secondaryId' => $id,
+                                       'hash' => $obj->mHash,
+                               ];
+                       }
+
+                       $secondaryIds = array_unique( $secondaryIds );
+
+                       if ( !count( $secondaryIds ) ) {
+                               continue;
+                       }
+
+                       // Run the batch query on blob_tracking
+                       $res = $dbr->select(
+                               'blob_tracking',
+                               '*',
+                               [
+                                       'bt_text_id' => $secondaryIds,
+                               ],
+                               __METHOD__
+                       );
+                       $trackedBlobs = [];
+                       foreach ( $res as $row ) {
+                               $trackedBlobs[$row->bt_text_id] = $row;
+                       }
+
+                       // Process the stubs
+                       foreach ( $stubs as $primaryId => $stub ) {
+                               $secondaryId = $stub['secondaryId'];
+                               if ( !isset( $trackedBlobs[$secondaryId] ) ) {
+                                       // No tracked blob. Work out what went wrong
+                                       $secondaryRow = $dbr->selectRow(
+                                               'text',
+                                               [ 'old_flags', 'old_text' ],
+                                               [ 'old_id' => $secondaryId ],
+                                               __METHOD__
+                                       );
+                                       if ( !$secondaryRow ) {
+                                               print "$primaryId: unrecoverable: secondary row is missing\n";
+                                               ++$numBad;
+                                       } elseif ( $this->isUnbrokenStub( $stub, $secondaryRow ) ) {
+                                               // Not broken yet, and not in the tracked clusters so it won't get
+                                               // broken by the current RCT run.
+                                               ++$numGood;
+                                       } elseif ( strpos( $secondaryRow->old_flags, 'external' ) !== false ) {
+                                               print "$primaryId: unrecoverable: secondary gone to {$secondaryRow->old_text}\n";
+                                               ++$numBad;
+                                       } else {
+                                               print "$primaryId: unrecoverable: miscellaneous corruption of secondary row\n";
+                                               ++$numBad;
+                                       }
+                                       unset( $stubs[$primaryId] );
+                                       continue;
+                               }
+                               $trackRow = $trackedBlobs[$secondaryId];
+
+                               // Check that the specified text really is available in the tracked source row
+                               $url = "DB://{$trackRow->bt_cluster}/{$trackRow->bt_blob_id}/{$stub['hash']}";
+                               $text = ExternalStore::fetchFromURL( $url );
+                               if ( $text === false ) {
+                                       print "$primaryId: unrecoverable: source text missing\n";
+                                       ++$numBad;
+                                       unset( $stubs[$primaryId] );
+                                       continue;
+                               }
+                               if ( md5( $text ) !== $stub['hash'] ) {
+                                       print "$primaryId: unrecoverable: content hashes do not match\n";
+                                       ++$numBad;
+                                       unset( $stubs[$primaryId] );
+                                       continue;
+                               }
+
+                               // Find the page_id and rev_id
+                               // The page is probably the same as the page of the secondary row
+                               $pageId = intval( $trackRow->bt_page );
+                               if ( !$pageId ) {
+                                       $revId = $pageId = 0;
+                               } else {
+                                       $revId = $this->findTextIdInPage( $pageId, $primaryId );
+                                       if ( !$revId ) {
+                                               // Actually an orphan
+                                               $pageId = $revId = 0;
+                                       }
+                               }
+
+                               $newFlags = $stub['legacyEncoding'] ? 'external' : 'external,utf-8';
+
+                               if ( !$dryRun ) {
+                                       // Reset the text row to point to the original copy
+                                       $this->beginTransaction( $dbw, __METHOD__ );
+                                       $dbw->update(
+                                               'text',
+                                               // SET
+                                               [
+                                                       'old_flags' => $newFlags,
+                                                       'old_text' => $url
+                                               ],
+                                               // WHERE
+                                               [ 'old_id' => $primaryId ],
+                                               __METHOD__
+                                       );
+
+                                       // Add a blob_tracking row so that the new reference can be recompressed
+                                       // without needing to run trackBlobs.php again
+                                       $dbw->insert( 'blob_tracking',
+                                               [
+                                                       'bt_page' => $pageId,
+                                                       'bt_rev_id' => $revId,
+                                                       'bt_text_id' => $primaryId,
+                                                       'bt_cluster' => $trackRow->bt_cluster,
+                                                       'bt_blob_id' => $trackRow->bt_blob_id,
+                                                       'bt_cgz_hash' => $stub['hash'],
+                                                       'bt_new_url' => null,
+                                                       'bt_moved' => 0,
+                                               ],
+                                               __METHOD__
+                                       );
+                                       $this->commitTransaction( $dbw, __METHOD__ );
+                                       $this->waitForSlaves();
+                               }
+
+                               print "$primaryId: resolved to $url\n";
+                               ++$numFixed;
+                       }
+               }
+
+               print "\n";
+               print "Fixed: $numFixed\n";
+               print "Unrecoverable: $numBad\n";
+               print "Good stubs: $numGood\n";
+       }
+
+       function waitForSlaves() {
+               static $iteration = 0;
+               ++$iteration;
+               if ( ++$iteration > 50 == 0 ) {
+                       wfWaitForSlaves();
+                       $iteration = 0;
+               }
+       }
+
+       function findTextIdInPage( $pageId, $textId ) {
+               $ids = $this->getRevTextMap( $pageId );
+               if ( !isset( $ids[$textId] ) ) {
+                       return null;
+               } else {
+                       return $ids[$textId];
+               }
+       }
+
+       function getRevTextMap( $pageId ) {
+               if ( !isset( $this->mapCache[$pageId] ) ) {
+                       // Limit cache size
+                       while ( $this->mapCacheSize > $this->maxMapCacheSize ) {
+                               $key = key( $this->mapCache );
+                               $this->mapCacheSize -= count( $this->mapCache[$key] );
+                               unset( $this->mapCache[$key] );
+                       }
+
+                       $dbr = $this->getDB( DB_REPLICA );
+                       $map = [];
+                       $res = $dbr->select( 'revision',
+                               [ 'rev_id', 'rev_text_id' ],
+                               [ 'rev_page' => $pageId ],
+                               __METHOD__
+                       );
+                       foreach ( $res as $row ) {
+                               $map[$row->rev_text_id] = $row->rev_id;
+                       }
+                       $this->mapCache[$pageId] = $map;
+                       $this->mapCacheSize += count( $map );
+               }
+
+               return $this->mapCache[$pageId];
+       }
+
+       /**
+        * This is based on part of HistoryBlobStub::getText().
+        * Determine if the text can be retrieved from the row in the normal way.
+        * @param array $stub
+        * @param stdClass $secondaryRow
+        * @return bool
+        */
+       function isUnbrokenStub( $stub, $secondaryRow ) {
+               $flags = explode( ',', $secondaryRow->old_flags );
+               $text = $secondaryRow->old_text;
+               if ( in_array( 'external', $flags ) ) {
+                       $url = $text;
+                       MediaWiki\suppressWarnings();
+                       list( /* $proto */, $path ) = explode( '://', $url, 2 );
+                       MediaWiki\restoreWarnings();
+
+                       if ( $path == "" ) {
+                               return false;
+                       }
+                       $text = ExternalStore::fetchFromURL( $url );
+               }
+               if ( !in_array( 'object', $flags ) ) {
+                       return false;
+               }
+
+               if ( in_array( 'gzip', $flags ) ) {
+                       $obj = unserialize( gzinflate( $text ) );
+               } else {
+                       $obj = unserialize( $text );
+               }
+
+               if ( !is_object( $obj ) ) {
+                       // Correct for old double-serialization bug.
+                       $obj = unserialize( $obj );
+               }
+
+               if ( !is_object( $obj ) ) {
+                       return false;
+               }
+
+               $obj->uncompress();
+               $text = $obj->getItem( $stub['hash'] );
+
+               return $text !== false;
+       }
+}
+
+$maintClass = 'FixT22757';
+require_once RUN_MAINTENANCE_IF_MAIN;
index a2dc376..b4514ec 100644 (file)
@@ -22,6 +22,8 @@
  * @see wfWaitForSlaves()
  */
 
+use Wikimedia\Rdbms\DBConnectionError;
+
 require __DIR__ . '/../commandLine.inc';
 
 if ( count( $args ) < 1 ) {
@@ -69,7 +71,7 @@ class TrackBlobs {
                echo "Doing integrity check...\n";
                $dbr = wfGetDB( DB_REPLICA );
 
-               // Scan for HistoryBlobStub objects in the text table (bug 20757)
+               // Scan for HistoryBlobStub objects in the text table (T22757)
 
                $exists = $dbr->selectField( 'text', 1,
                        'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\' ' .
@@ -84,7 +86,7 @@ class TrackBlobs {
                        exit( 1 );
                }
 
-               // Scan the archive table for HistoryBlobStub objects or external flags (bug 22624)
+               // Scan the archive table for HistoryBlobStub objects or external flags (T24624)
                $flags = $dbr->selectField( 'archive', 'ar_flags',
                        'ar_flags LIKE \'%external%\' OR (' .
                        'ar_flags LIKE \'%object%\' ' .
index 892f799..d4147f4 100644 (file)
@@ -311,9 +311,21 @@ CREATE TABLE /*_*/page (
   page_lang varbinary(35) DEFAULT NULL
 ) /*$wgDBTableOptions*/;
 
+-- The title index. Care must be taken to always specify a namespace when
+-- by title, so that the index is used. Even listing all known namespaces
+-- with IN() is better than omitting page_namespace from the WHERE clause.
 CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
+
+-- The index for Special:Random
 CREATE INDEX /*i*/page_random ON /*_*/page (page_random);
+
+-- Questionable utility, used by ProofreadPage, possibly DynamicPageList.
+-- ApiQueryAllPages unconditionally filters on namespace and so hopefully does
+-- not use it.
 CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
+
+-- The index for Special:Shortpages and Special:Longpages. Also SiteStats::articles()
+-- in 'comma' counting mode, MessageCache::loadFromDB().
 CREATE INDEX /*i*/page_redirect_namespace_len ON /*_*/page (page_is_redirect, page_namespace, page_len);
 
 --
@@ -375,11 +387,27 @@ CREATE TABLE /*_*/revision (
 ) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
 -- In case tables are created as MyISAM, use row hints for MySQL <5.0 to avoid 4GB limit
 
+-- The index is proposed for removal, do not use it in new code: T163532.
+-- Used for ordering revisions within a page by rev_id, which is usually
+-- incorrect, since rev_timestamp is normally the correct order. It can also
+-- be used by dumpBackup.php, if a page and rev_id range is specified.
 CREATE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
+
+-- Used by ApiQueryAllRevisions
 CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
+
+-- History index
 CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
+
+-- Logged-in user contributions index
 CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);
+
+-- Anonymous user countributions index
 CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp);
+
+-- Credits index. This is scanned in order to compile credits lists for pages,
+-- in ApiQueryContributors. Also for ApiQueryRevisions if rvuser is specified
+-- and is a logged-in user.
 CREATE INDEX /*i*/page_user_timestamp ON /*_*/revision (rev_page,rev_user,rev_timestamp);
 
 --
@@ -499,8 +527,14 @@ CREATE TABLE /*_*/archive (
   ar_content_format varbinary(64) DEFAULT NULL
 ) /*$wgDBTableOptions*/;
 
+-- Index for Special:Undelete to page through deleted revisions
 CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
+
+-- Index for Special:DeletedContributions
 CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
+
+-- Index for linking archive rows with tables that normally link with revision
+-- rows, such as change_tag.
 CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
 
 
@@ -521,8 +555,13 @@ CREATE TABLE /*_*/pagelinks (
   pl_title varchar(255) binary NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
+-- Forward index, for page edit, save
 CREATE UNIQUE INDEX /*i*/pl_from ON /*_*/pagelinks (pl_from,pl_namespace,pl_title);
+
+-- Reverse index, for Special:Whatlinkshere
 CREATE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from);
+
+-- Index for Special:Whatlinkshere with namespace filter
 CREATE INDEX /*i*/pl_backlinks_namespace ON /*_*/pagelinks (pl_from_namespace,pl_namespace,pl_title,pl_from);
 
 
@@ -543,8 +582,13 @@ CREATE TABLE /*_*/templatelinks (
   tl_title varchar(255) binary NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
+-- Forward index, for page edit, save
 CREATE UNIQUE INDEX /*i*/tl_from ON /*_*/templatelinks (tl_from,tl_namespace,tl_title);
+
+-- Reverse index, for Special:Whatlinkshere
 CREATE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from);
+
+-- Index for Special:Whatlinkshere with namespace filter
 CREATE INDEX /*i*/tl_backlinks_namespace ON /*_*/templatelinks (tl_from_namespace,tl_namespace,tl_title,tl_from);
 
 
@@ -565,8 +609,13 @@ CREATE TABLE /*_*/imagelinks (
   il_to varchar(255) binary NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
+-- Forward index, for cache invalidation on file update, etc.
 CREATE UNIQUE INDEX /*i*/il_from ON /*_*/imagelinks (il_from,il_to);
+
+-- Reverse index, for Special:Whatlinkshere and file description page local usage
 CREATE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from);
+
+-- Index for Special:Whatlinkshere with namespace filter
 CREATE INDEX /*i*/il_backlinks_namespace ON /*_*/imagelinks (il_from_namespace,il_to,il_from);
 
 
@@ -594,7 +643,7 @@ CREATE TABLE /*_*/categorylinks (
   -- conversion algorithm is run.  We store this so that we can update
   -- collations without reparsing all pages.
   -- Note: If you change the length of this field, you also need to change
-  -- code in LinksUpdate.php. See bug 25254.
+  -- code in LinksUpdate.php. See T27254.
   cl_sortkey_prefix varchar(255) binary NOT NULL default '',
 
   -- This isn't really used at present. Provided for an optional
@@ -690,9 +739,16 @@ CREATE TABLE /*_*/externallinks (
   el_index_60 varbinary(60) NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
+-- Forward index, for page edit, save
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
+
+-- Index for Special:LinkSearch exact search
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
+
+-- For Special:LinkSearch wildcard search
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
+
+-- For Special:LinkSearch wildcard search with efficient paging by el_id
 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);
 
@@ -710,7 +766,10 @@ CREATE TABLE /*_*/langlinks (
   ll_title varchar(255) binary NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
+-- Forward index, for page edit, save, ApiQueryLanglinks
 CREATE UNIQUE INDEX /*i*/ll_from ON /*_*/langlinks (ll_from, ll_lang);
+
+-- Index for ApiQueryLangbacklinks
 CREATE INDEX /*i*/ll_lang ON /*_*/langlinks (ll_lang, ll_title);
 
 
@@ -728,8 +787,13 @@ CREATE TABLE /*_*/iwlinks (
   iwl_title varchar(255) binary NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
+-- Forward index, for page edit, save, ApiQueryIWLinks
 CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title);
+
+-- Index for ApiQueryIWBacklinks
 CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
+
+-- Index for ApiQueryIWLinks
 CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
 
 
@@ -816,7 +880,7 @@ CREATE TABLE /*_*/ipblocks (
   -- Size chosen to allow IPv6
   -- FIXME: these fields were originally blank for single-IP blocks,
   -- but now they are populated. No migration was ever done. They
-  -- should be fixed to be blank again for such blocks (bug 49504).
+  -- should be fixed to be blank again for such blocks (T51504).
   ipb_range_start tinyblob NOT NULL,
   ipb_range_end tinyblob NOT NULL,
 
@@ -841,10 +905,19 @@ CREATE TABLE /*_*/ipblocks (
 -- Any new options which prevent collisions should be included
 CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
 
+-- For querying whether a logged-in user is blocked
 CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
+
+-- For querying whether an IP address is in any range
 CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
+
+-- Index for Special:BlockList
 CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
+
+-- Index for table pruning
 CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
+
+-- Index for removing autoblocks when a parent block is removed
 CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
 
 
@@ -899,6 +972,8 @@ CREATE TABLE /*_*/image (
   img_sha1 varbinary(32) NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
+-- Used by Special:Newimages and ApiQueryAllImages
+CREATE INDEX /*i*/img_user_timestamp ON /*_*/image (img_user,img_timestamp);
 CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
 -- Used by Special:ListFiles for sort-by-size
 CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
@@ -1142,13 +1217,29 @@ CREATE TABLE /*_*/recentchanges (
   rc_params blob NULL
 ) /*$wgDBTableOptions*/;
 
+-- Special:Recentchanges
 CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
+
+-- Special:Watchlist
 CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
+
+-- Special:Recentchangeslinked when finding changes in pages linked from a page
 CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
+
+-- Special:Newpages
 CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
+
+-- Blank unless $wgPutIPinRC=true (false at WMF), possibly used by extensions,
+-- but mostly replaced by CheckUser.
 CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
+
+-- Probably intended for Special:NewPages namespace filter
 CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
+
+-- SiteStats active user count, Special:ActiveUsers, Special:NewPages user filter
 CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
+
+-- ApiQueryRecentChanges (T140108)
 CREATE INDEX /*i*/rc_name_type_patrolled_timestamp ON /*_*/recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
 
 
@@ -1170,8 +1261,13 @@ CREATE TABLE /*_*/watchlist (
 
 ) /*$wgDBTableOptions*/;
 
+-- Special:Watchlist
 CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title);
+
+-- Special:Movepage (WatchedItemStore::duplicateEntry)
 CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title);
+
+-- ApiQueryWatchlistRaw changed filter
 CREATE INDEX /*i*/wl_user_notificationtimestamp ON /*_*/watchlist (wl_user, wl_notificationtimestamp);
 
 
@@ -1305,14 +1401,32 @@ CREATE TABLE /*_*/logging (
   log_deleted tinyint unsigned NOT NULL default 0
 ) /*$wgDBTableOptions*/;
 
+-- Special:Log type filter
 CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp);
+
+-- Special:Log performer filter
 CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp);
+
+-- Special:Log title filter, log extract
 CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp);
+
+-- Special:Log unfiltered
 CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
+
+-- Special:Log filter by performer and type
 CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp);
+
+-- Apparently just used for a few maintenance pages (findMissingFiles.php, Flow).
+-- Could be removed?
 CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp);
+
+-- Special:Log action filter
 CREATE INDEX /*i*/type_action ON /*_*/logging (log_type, log_action, log_timestamp);
+
+-- Special:Log filter by type and anonymous performer
 CREATE INDEX /*i*/log_user_text_type_time ON /*_*/logging (log_user_text, log_type, log_timestamp);
+
+-- Special:Log filter by anonymous performer
 CREATE INDEX /*i*/log_user_text_time ON /*_*/logging (log_user_text, log_timestamp);
 
 
index a672e29..5f705ba 100755 (executable)
@@ -27,6 +27,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script to run database schema updates.
  *
@@ -112,7 +114,7 @@ class UpdateMediaWiki extends Maintenance {
                }
 
                $lang = Language::factory( 'en' );
-               // Set global language to ensure localised errors are in English (bug 20633)
+               // Set global language to ensure localised errors are in English (T22633)
                RequestContext::getMain()->setLanguage( $lang );
                $wgLang = $lang; // BackCompat
 
@@ -145,7 +147,7 @@ class UpdateMediaWiki extends Maintenance {
 
                $this->output( "Going to run database updates for " . wfWikiID() . "\n" );
                if ( $db->getType() === 'sqlite' ) {
-                       /** @var Database|DatabaseSqlite $db */
+                       /** @var IMaintainableDatabase|DatabaseSqlite $db */
                        $this->output( "Using SQLite file: '{$db->getDbFilePath()}'\n" );
                }
                $this->output( "Depending on the size of your database this may take a while!\n" );
@@ -203,7 +205,7 @@ class UpdateMediaWiki extends Maintenance {
 
                # Don't try to access the database
                # This needs to be disabled early since extensions will try to use the l10n
-               # cache from $wgExtensionFunctions (bug 20471)
+               # cache from $wgExtensionFunctions (T22471)
                $wgLocalisationCacheConf = [
                        'class' => 'LocalisationCache',
                        'storeClass' => 'LCStoreNull',
index e70a176..84fc2d2 100644 (file)
@@ -26,6 +26,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script that will find all rows in the categorylinks table
  * whose collation is out-of-date.
@@ -242,7 +244,7 @@ TEXT
         * Return an SQL expression selecting rows which sort above the given row,
         * assuming an ordering of cl_collation, cl_to, cl_type, cl_from
         * @param stdClass $row
-        * @param Database $dbw
+        * @param IDatabase $dbw
         * @return string
         */
        function getBatchCondition( $row, $dbw ) {
index eb717e8..287a40c 100644 (file)
@@ -59,7 +59,7 @@ unset( $lines );
 
 $lines = explode( "\n", shell_exec( 'git log --format="%aN"' ) );
 foreach ( $lines as $line ) {
-       if ( empty( $line ) )  {
+       if ( empty( $line ) ) {
                continue;
        }
        if ( substr( $line, 0, 5 ) === '[BOT]' ) {
index 9893342..69c9265 100644 (file)
@@ -195,7 +195,7 @@ class UserDupes {
                        "SELECT user_name,COUNT(*) AS n
                                FROM $user
                        GROUP BY user_name
-                         HAVING n > 1", __METHOD__ );
+                               HAVING n > 1", __METHOD__ );
 
                $list = [];
                foreach ( $result as $row ) {
index 10a6de8..ea5835d 100644 (file)
 }
 
 .config-plainlink a {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .config-download-link {
index b868295..66c13cd 100644 (file)
@@ -3,24 +3,33 @@
   "scripts": {
     "test": "grunt test",
     "doc": "jsduck",
-    "postdoc": "grunt copy:jsduck"
+    "postdoc": "grunt copy:jsduck",
+    "selenium": "killall -0 chromedriver 2>/dev/null || chromedriver --url-base=/wd/hub --port=4444 & grunt webdriver:test; killall chromedriver"
   },
   "devDependencies": {
+    "deepmerge": "1.3.2",
     "eslint": "3.12.2",
-    "eslint-config-wikimedia": "0.3.0",
+    "eslint-config-wikimedia": "0.4.0",
     "grunt": "1.0.1",
-    "grunt-banana-checker": "0.5.0",
+    "grunt-banana-checker": "0.6.0",
     "grunt-contrib-copy": "1.0.0",
     "grunt-contrib-watch": "1.0.0",
     "grunt-eslint": "19.0.0",
     "grunt-jsonlint": "1.1.0",
     "grunt-karma": "2.0.0",
     "grunt-stylelint": "0.7.0",
-    "karma": "1.1.0",
+    "grunt-webdriver": "2.0.3",
+    "karma": "1.5.0",
     "karma-chrome-launcher": "2.0.0",
-    "karma-firefox-launcher": "1.0.0",
+    "karma-firefox-launcher": "1.0.1",
+    "karma-mocha-reporter": "2.2.3",
     "karma-qunit": "1.0.0",
-    "qunitjs": "1.22.0",
-    "stylelint-config-wikimedia": "0.4.1"
+    "qunitjs": "1.23.1",
+    "stylelint-config-wikimedia": "0.4.1",
+    "wdio-junit-reporter": "0.2.0",
+    "wdio-mocha-framework": "0.5.8",
+    "wdio-sauce-service": "^0.3.1",
+    "wdio-spec-reporter": "0.0.5",
+    "webdriverio": "4.6.2"
   }
 }
index 4693b42..b2c8d89 100644 (file)
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -1,6 +1,32 @@
 <?xml version="1.0"?>
 <ruleset name="MediaWiki">
-       <rule ref="vendor/mediawiki/mediawiki-codesniffer/MediaWiki" />
+       <rule ref="vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
+               <!-- Disable rules added in 0.8.0 that don't pass yet -->
+               <exclude name="MediaWiki.Commenting.FunctionComment.ExtraParamComment" />
+               <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamComment" />
+               <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamName" />
+               <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamTag" />
+               <exclude name="MediaWiki.Commenting.FunctionComment.MissingReturn" />
+               <exclude name="MediaWiki.Commenting.FunctionComment.Missing.Protected" />
+               <exclude name="MediaWiki.Commenting.FunctionComment.Missing.Public" />
+               <exclude name="MediaWiki.Commenting.FunctionComment.ParamNameNoMatch" />
+               <exclude name="MediaWiki.Commenting.FunctionComment.SpacingAfter" />
+               <exclude name="MediaWiki.Commenting.FunctionComment.SpacingAfterParamName" />
+               <exclude name="MediaWiki.Commenting.FunctionComment.SpacingAfterParamType" />
+               <exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentStart" />
+               <exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentEnd" />
+               <exclude name="MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures" />
+               <exclude name="MediaWiki.ExtraCharacters.ParenthesesAroundKeyword.ParenthesesAroundKeywords" />
+               <exclude name="MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName" />
+               <exclude name="MediaWiki.WhiteSpace.DisallowEmptyLineFunctions.NoEmptyLine" />
+               <exclude name="MediaWiki.WhiteSpace.SpaceBeforeControlStructureBrace.EmptyLines" />
+               <exclude name="MediaWiki.WhiteSpace.SpaceBeforeClassBrace.NoSpaceBeforeBrace" />
+               <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment" />
+               <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.SingleSpaceBeforeSingleLineComment" />
+               <exclude name="MediaWiki.Usage.DbrQueryUsage.DbrQueryFound" />
+               <exclude name="MediaWiki.Usage.ExtendClassUsage.FunctionVarUsage" />
+               <exclude name="MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals" />
+       </rule>
        <rule ref="MediaWiki.NamingConventions.PrefixedGlobalFunctions">
                <properties>
                        <property name="ignoreList" type="array" value="bfNormalizeTitleStrReplace,bfNormalizeTitleStrTr,cdbShowHelp,codepointToUtf8,compare_point,cssfilter,escapeSingleString,findAuxFile,findFiles,getEscapedProfileUrl,getFileCommentFromSourceWiki,getFileUserFromSourceWiki,hexSequenceToUtf8,mccGetHelp,mccShowUsage,mimeTypeMatch,moveToExternal,NothingFunction,NothingFunctionData,resolveStub,resolveStubs,showUsage,splitFilename,utf8ToCodepoint,utf8ToHexSequence" />
        <rule ref="PSR2.Methods.MethodDeclaration.Underscore">
                <exclude-pattern>*/includes/StubObject.php</exclude-pattern>
        </rule>
-       <rule ref="MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures">
+       <rule ref="Generic.ControlStructures.InlineControlStructure.NotAllowed">
                <severity>0</severity>
        </rule>
-       <rule ref="Generic.ControlStructures.InlineControlStructure.NotAllowed">
+       <rule ref="Generic.Formatting.NoSpaceAfterCast.SpaceFound">
                <severity>0</severity>
        </rule>
        <exclude-pattern>node_modules/</exclude-pattern>
index d6cb43f..976b1fb 100644 (file)
@@ -132,9 +132,14 @@ return [
        /* jQuery */
 
        'jquery' => [
-               'scripts' => [
-                       'resources/lib/jquery/jquery.js',
-               ],
+               'scripts' => ( $GLOBALS['wgUsejQueryThree'] ?
+                       [
+                               'resources/lib/jquery/jquery3.js',
+                               'resources/lib/jquery/jquery.migrate.js',
+                       ] : [
+                               'resources/lib/jquery/jquery.js',
+                       ]
+               ),
                'raw' => true,
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -151,21 +156,14 @@ return [
                'targets' => [ 'mobile', 'desktop' ],
        ],
        'jquery.appear' => [
-               'deprecated' => [
-                       'message' => 'Please use "mediawiki.viewport" instead.',
-               ],
+               'deprecated' => 'Please use "mediawiki.viewport" instead.',
                'scripts' => 'resources/lib/jquery/jquery.appear.js',
        ],
-       'jquery.arrowSteps' => [
-               'deprecated' => true,
-               'scripts' => 'resources/src/jquery/jquery.arrowSteps.js',
-               'styles' => 'resources/src/jquery/jquery.arrowSteps.css',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'jquery.async' => [
                'scripts' => 'resources/lib/jquery/jquery.async.js',
        ],
        'jquery.autoEllipsis' => [
+               'deprecated' => 'Use CSS text-overflow instead.',
                'scripts' => 'resources/src/jquery/jquery.autoEllipsis.js',
                'dependencies' => 'jquery.highlightText',
                'targets' => [ 'desktop', 'mobile' ],
@@ -251,7 +249,6 @@ return [
                'scripts' => 'resources/src/jquery/jquery.highlightText.js',
                'dependencies' => [
                        'mediawiki.RegExp',
-                       'dom-level2-shim',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -308,6 +305,8 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.placeholder' => [
+               'deprecated' => 'Use of "jquery.placeholder" is deprecated since MediaWiki 1.29.0',
+
                'scripts' => 'resources/src/jquery/jquery.placeholder.js',
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -316,20 +315,13 @@ return [
                'styles' => 'resources/lib/qunitjs/qunit.css',
                'targets' => [ 'desktop', 'mobile' ],
        ],
-       'jquery.qunit.completenessTest' => [
-               'scripts' => 'resources/src/jquery/jquery.qunit.completenessTest.js',
-               'dependencies' => 'jquery.qunit',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'jquery.spinner' => [
                'scripts' => 'resources/src/jquery/jquery.spinner.js',
                'styles' => 'resources/src/jquery/jquery.spinner.css',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.jStorage' => [
-               'deprecated' => [
-                       'message' => 'Please use "mediawiki.storage" instead.',
-               ],
+               'deprecated' => 'Please use "mediawiki.storage" instead.',
                'scripts' => 'resources/lib/jquery/jquery.jStorage.js',
        ],
        'jquery.suggestions' => [
@@ -345,7 +337,6 @@ return [
                'styles' => 'resources/src/jquery/jquery.tablesorter.less',
                'messages' => [ 'sort-descending', 'sort-ascending' ],
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.RegExp',
                        'mediawiki.language.months',
                ],
@@ -374,9 +365,7 @@ return [
        /* jQuery UI */
 
        'jquery.ui.core' => [
-               'deprecated' => [
-                       'message' => 'Please use "mediawiki.ui.button" or "oojs-ui" instead.',
-               ],
+               'deprecated' => 'Please use "mediawiki.ui.button" or "oojs-ui" instead.',
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.core.js',
                'dependencies' => [
                        'jquery.ui.core.styles',
@@ -733,10 +722,8 @@ return [
        ],
 
        /* json2 */
-
-       // Deprecated since MediaWiki 1.29.0
        'json' => [
-               'deprecated' => 'Use of the "json" MediaWiki module is deprecated since MediaWiki 1.29.0',
+               'deprecated' => 'Use of the "json" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
        ],
 
@@ -917,6 +904,7 @@ return [
                'dependencies' => [
                        'mediawiki.api',
                        'mediawiki.Title',
+                       'mediawiki.user',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -937,7 +925,6 @@ return [
        'mediawiki.api.upload' => [
                'scripts' => 'resources/src/mediawiki/api/upload.js',
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.api',
                        'mediawiki.api.edit',
                ],
@@ -1095,6 +1082,12 @@ return [
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.htmlform.checker' => [
+               'scripts' => [
+                       'resources/src/mediawiki/htmlform/htmlform.Checker.js',
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.htmlform.ooui' => [
                'scripts' => [
                        'resources/src/mediawiki/htmlform/htmlform.Element.js',
@@ -1156,7 +1149,9 @@ return [
                        'default' => 'resources/src/mediawiki/mediawiki.notification.css',
                ],
                'scripts' => 'resources/src/mediawiki/mediawiki.notification.js',
-               'dependencies' => 'mediawiki.page.startup',
+               'dependencies' => [
+                       'mediawiki.util',
+               ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.notify' => [
@@ -1191,7 +1186,6 @@ return [
                        'searchsuggest-containing',
                ],
                'dependencies' => [
-                       'jquery.placeholder',
                        'jquery.suggestions',
                        'jquery.getAttrs',
                        'mediawiki.api',
@@ -1220,7 +1214,6 @@ return [
        'mediawiki.Upload' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.Upload.js',
                'dependencies' => [
-                       'dom-level2-shim',
                        'mediawiki.api.upload',
                ],
        ],
@@ -1316,7 +1309,7 @@ return [
                'dependencies' => [
                        'mediawiki.ForeignStructuredUpload',
                        'mediawiki.Upload.BookletLayout',
-                       'mediawiki.widgets.CategorySelector',
+                       'mediawiki.widgets.CategoryMultiselectWidget',
                        'mediawiki.widgets.DateInputWidget',
                        'mediawiki.jqueryMsg',
                        'mediawiki.api.messages',
@@ -1356,17 +1349,12 @@ return [
                'dependencies' => 'mediawiki.util',
                'targets' => [ 'desktop', 'mobile' ],
        ],
-       'mediawiki.user.blockcookie' => [
-               'scripts' => 'resources/src/mediawiki/mediawiki.user.blockcookie.js',
-               'dependencies' => [ 'mediawiki.cookie', 'mediawiki.storage' ],
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'mediawiki.user' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.user.js',
                'dependencies' => [
-                       'mediawiki.cookie',
                        'mediawiki.api',
                        'mediawiki.api.user',
+                       'mediawiki.storage',
                        'user.options',
                        'user.tokens',
                ],
@@ -1437,7 +1425,7 @@ return [
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css',
                'dependencies' => [
                        'jquery.makeCollapsible',
-                       'mediawiki.cookie',
+                       'mediawiki.storage',
                        'mediawiki.icon',
                ],
        ],
@@ -1488,7 +1476,6 @@ return [
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js',
                'dependencies' => [
                        'mediawiki.util',
-                       'mediawiki.page.startup',
                        'user.options',
                ],
        ],
@@ -1505,14 +1492,11 @@ return [
                'targets' => [ 'desktop', 'mobile' ]
        ],
        'mediawiki.action.view.postEdit' => [
-               'templates' => [
-                       'postEdit.html' => 'resources/src/mediawiki.action/templates/postEdit.html',
-               ],
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.js',
-               'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.css',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.less',
                'dependencies' => [
-                       'mediawiki.cookie',
-                       'mediawiki.jqueryMsg'
+                       'mediawiki.jqueryMsg',
+                       'mediawiki.notification'
                ],
                'messages' => [
                        'postedit-confirmation-created',
@@ -1612,7 +1596,6 @@ return [
                        'mediawiki.util',
                        'mediawiki.language',
                        'user.options',
-                       'dom-level2-shim',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -1675,21 +1658,17 @@ return [
                'dependencies' => [
                        'jquery.accessKeyLabel',
                        'jquery.checkboxShiftClick',
-                       'jquery.makeCollapsible',
-                       'jquery.placeholder',
                        'jquery.mw-jump',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.page.startup' => [
                'scripts' => 'resources/src/mediawiki/page/startup.js',
-               'dependencies' => 'mediawiki.util',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.page.patrol.ajax' => [
                'scripts' => 'resources/src/mediawiki/page/patrol.ajax.js',
                'dependencies' => [
-                       'mediawiki.page.startup',
                        'mediawiki.api',
                        'mediawiki.util',
                        'mediawiki.Title',
@@ -1734,6 +1713,7 @@ return [
                'dependencies' => [
                        'mediawiki.api.rollback',
                        'mediawiki.notify',
+                       'mediawiki.util',
                        'jquery.spinner',
                ],
                'messages' => [
@@ -1751,30 +1731,45 @@ return [
 
        /* MediaWiki Special pages */
 
+       'mediawiki.rcfilters.filters.base.styles' => [
+               'styles' => [
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less',
+               ],
+       ],
        'mediawiki.rcfilters.filters.dm' => [
                'scripts' => [
                        'resources/src/mediawiki.rcfilters/mw.rcfilters.js',
+                       'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ItemModel.js',
                        'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js',
                        'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js',
                        'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js',
+                       'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js',
+                       'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js',
                        'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js',
                        'resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js',
                ],
                'dependencies' => [
                        'oojs',
                        'mediawiki.Uri',
+                       'mediawiki.user',
                ],
        ],
        'mediawiki.rcfilters.filters.ui' => [
                'scripts' => [
                        'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.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.CapsuleItemWidget.js',
-                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ItemMenuOptionWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.TagItemWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagItemWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FloatingMenuSelectWidget.js',
                        'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js',
                        'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js',
+                       'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js',
                        'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js',
                        'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js',
                        'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js',
@@ -1786,71 +1781,69 @@ return [
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.less',
-                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less',
-                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less',
-                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.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.FilterTagMultiselectWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuSectionOptionWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.TagItemWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuHeaderWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FloatingMenuSelectWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less',
-                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less',
+                       'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less',
+               ],
+               'skinStyles' => [
+                       'monobook' => [
+                               'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less',
+                               'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less',
+                               'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.monobook.less',
+                       ],
                ],
                'messages' => [
                        'rcfilters-activefilters',
+                       'rcfilters-quickfilters',
+                       'rcfilters-quickfilters-placeholder-title',
+                       'rcfilters-quickfilters-placeholder-description',
+                       'rcfilters-savedqueries-defaultlabel',
+                       'rcfilters-savedqueries-rename',
+                       'rcfilters-savedqueries-setdefault',
+                       'rcfilters-savedqueries-unsetdefault',
+                       'rcfilters-savedqueries-remove',
+                       'rcfilters-savedqueries-new-name-label',
+                       'rcfilters-savedqueries-add-new-title',
+                       'rcfilters-savedqueries-apply-label',
+                       'rcfilters-savedqueries-cancel-label',
                        'rcfilters-restore-default-filters',
                        'rcfilters-clear-all-filters',
                        'rcfilters-search-placeholder',
                        'rcfilters-invalid-filter',
                        'rcfilters-empty-filter',
                        'rcfilters-filterlist-title',
+                       'rcfilters-filterlist-feedbacklink',
                        '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',
+                       'rcfilters-filterlist-whatsthis',
                        'rcfilters-highlightbutton-title',
                        'rcfilters-highlightmenu-title',
+                       'rcfilters-highlightmenu-help',
+                       'rcfilters-noresults-conflict',
+                       'rcfilters-state-message-subset',
+                       'rcfilters-state-message-fullcoverage',
                        'recentchanges-noresult',
+                       'quotation-marks',
                ],
                'dependencies' => [
                        'oojs-ui',
+                       'mediawiki.language',
+                       'mediawiki.user',
                        'mediawiki.rcfilters.filters.dm',
                        'oojs-ui.styles.icons-moderation',
                        'oojs-ui.styles.icons-editing-core',
+                       'oojs-ui.styles.icons-editing-styling',
+                       'oojs-ui.styles.icons-interactions',
                ],
        ],
        'mediawiki.special' => [
@@ -1868,6 +1861,7 @@ return [
                'dependencies' => [
                        'mediawiki.api',
                        'mediawiki.jqueryMsg',
+                       'mediawiki.util',
                        'oojs-ui',
                        'mediawiki.widgets.datetime',
                ],
@@ -1926,8 +1920,18 @@ return [
        ],
        'mediawiki.special.block' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.block.js',
-               'styles' => 'resources/src/mediawiki.special/mediawiki.special.block.css',
-               'dependencies' => 'mediawiki.util',
+               'dependencies' => [
+                       'mediawiki.util',
+                       'mediawiki.htmlform',
+               ],
+       ],
+       'mediawiki.special.changecredentials.js' => [
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.changecredentials.js',
+               'dependencies' => [
+                       'mediawiki.api',
+                       'mediawiki.htmlform.ooui'
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.changeslist' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css',
@@ -1980,6 +1984,12 @@ return [
        'mediawiki.special.movePage.styles' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.movePage.css',
        ],
+       'mediawiki.special.newFiles' => [
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.newFiles.js',
+               'dependencies' => [
+                       'mediawiki.widgets.datetime',
+               ],
+       ],
        'mediawiki.special.pageLanguage' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.pageLanguage.js',
                'dependencies' => [
@@ -2044,7 +2054,7 @@ return [
                ],
                'targets' => [ 'desktop', 'mobile' ],
                'messages' => [
-                       'search-interwiki-more',
+                       'search-interwiki-more-results',
                        'searchprofile-images'
                ],
        ],
@@ -2100,7 +2110,6 @@ return [
        'mediawiki.special.userlogin.signup.js' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js',
                'messages' => [
-                       'createacct-error',
                        'createacct-emailrequired',
                        'noname',
                        'userexists',
@@ -2109,6 +2118,7 @@ return [
                        'mediawiki.api',
                        'mediawiki.jqueryMsg',
                        'jquery.throttle-debounce',
+                       'mediawiki.htmlform.checker',
                ],
        ],
        'mediawiki.special.unwatchedPages' => [
@@ -2177,7 +2187,6 @@ return [
        ],
        'mediawiki.legacy.wikibits' => [
                'scripts' => 'resources/src/mediawiki.legacy/wikibits.js',
-               'dependencies' => 'mediawiki.util',
                'targets' => [ 'desktop', 'mobile' ],
        ],
 
@@ -2274,7 +2283,7 @@ return [
                        'mediawiki.api',
                        'jquery.byteLimit',
                        // TitleOptionWidget
-                       'jquery.autoEllipsis',
+                       'jquery.highlightText',
                ],
                'messages' => [
                        // NamespaceInputWidget
@@ -2381,9 +2390,15 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.widgets.CategorySelector' => [
+               'deprecated' => 'Use "mw.widgets.CategoryMultiselectWidget" instead. See T161285.',
+               'dependencies' => [
+                       'mediawiki.widgets.CategoryMultiselectWidget',
+               ],
+       ],
+       'mediawiki.widgets.CategoryMultiselectWidget' => [
                'scripts' => [
                        'resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js',
                ],
                'dependencies' => [
                        'oojs-ui-widgets',
@@ -2393,10 +2408,22 @@ return [
                ],
                'messages' => [
                        'red-link-title',
-                       'mw-widgets-categoryselector-add-category-placeholder'
+                       'mw-widgets-categoryselector-add-category-placeholder',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.widgets.SelectWithInputWidget' => [
+               'scripts' => 'resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js',
+               'dependencies' => [
+                       'mediawiki.widgets.SelectWithInputWidget.styles',
+                       'oojs-ui-widgets',
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
+       'mediawiki.widgets.SelectWithInputWidget.styles' => [
+               'styles' => 'resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.base.css',
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.widgets.MediaSearch' => [
                'scripts' => [
                        'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js',
@@ -2416,6 +2443,7 @@ return [
                        'oojs-ui-widgets',
                        'mediawiki.ForeignApi',
                        'mediawiki.Title',
+                       'mediawiki.util',
                ],
                'messages' => [
                        'mw-widgets-mediasearch-noresults',
@@ -2472,22 +2500,17 @@ return [
                        'oojs-ui-core',
                ],
        ],
+
        /* es5-shim */
        'es5-shim' => [
-               'scripts' => [
-                       'resources/lib/es5-shim/es5-shim.js',
-                       'resources/src/polyfill-object-create.js',
-               ],
+               'deprecated' => 'Use of the "es5-shim" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
-               'skipFunction' => 'resources/src/es5-skip.js',
        ],
 
        /* dom-level2-shim */
-       // IE 8
        'dom-level2-shim' => [
-               'scripts' => 'resources/src/polyfill-nodeTypes.js',
+               'deprecated' => 'Use of the "dom-level2-shim" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
-               'skipFunction' => 'resources/src/dom-level2-skip.js',
        ],
 
        /* OOjs */
@@ -2497,9 +2520,6 @@ return [
                        'resources/src/oojs-global.js',
                ],
                'targets' => [ 'desktop', 'mobile' ],
-               'dependencies' => [
-                       'es5-shim',
-               ],
        ],
 
        'mediawiki.router' => [
index c3a287d..9339e98 100644 (file)
@@ -65,7 +65,6 @@ return call_user_func( function () {
                ],
                'skinScripts' => $getSkinSpecific( null, 'js' ),
                'dependencies' => [
-                       'es5-shim',
                        'oojs',
                        'oojs-ui-core.styles',
                        'oojs-ui.styles.icons',
diff --git a/resources/lib/es5-shim/es5-shim.js b/resources/lib/es5-shim/es5-shim.js
deleted file mode 100644 (file)
index 91a7a39..0000000
+++ /dev/null
@@ -1,2051 +0,0 @@
-/*!
- * https://github.com/es-shims/es5-shim
- * @license es5-shim Copyright 2009-2015 by contributors, MIT License
- * see https://github.com/es-shims/es5-shim/blob/master/LICENSE
- */
-
-// vim: ts=4 sts=4 sw=4 expandtab
-
-// Add semicolon to prevent IIFE from being passed as argument to concatenated code.
-;
-
-// UMD (Universal Module Definition)
-// see https://github.com/umdjs/umd/blob/master/templates/returnExports.js
-(function (root, factory) {
-    'use strict';
-
-    /* global define, exports, module */
-    if (typeof define === 'function' && define.amd) {
-        // AMD. Register as an anonymous module.
-        define(factory);
-    } else if (typeof exports === 'object') {
-        // Node. Does not work with strict CommonJS, but
-        // only CommonJS-like enviroments that support module.exports,
-        // like Node.
-        module.exports = factory();
-    } else {
-        // Browser globals (root is window)
-        root.returnExports = factory();
-    }
-}(this, function () {
-
-/**
- * Brings an environment as close to ECMAScript 5 compliance
- * as is possible with the facilities of erstwhile engines.
- *
- * Annotated ES5: http://es5.github.com/ (specific links below)
- * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
- * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/
- */
-
-// Shortcut to an often accessed properties, in order to avoid multiple
-// dereference that costs universally. This also holds a reference to known-good
-// functions.
-var $Array = Array;
-var ArrayPrototype = $Array.prototype;
-var $Object = Object;
-var ObjectPrototype = $Object.prototype;
-var $Function = Function;
-var FunctionPrototype = $Function.prototype;
-var $String = String;
-var StringPrototype = $String.prototype;
-var $Number = Number;
-var NumberPrototype = $Number.prototype;
-var array_slice = ArrayPrototype.slice;
-var array_splice = ArrayPrototype.splice;
-var array_push = ArrayPrototype.push;
-var array_unshift = ArrayPrototype.unshift;
-var array_concat = ArrayPrototype.concat;
-var array_join = ArrayPrototype.join;
-var call = FunctionPrototype.call;
-var apply = FunctionPrototype.apply;
-var max = Math.max;
-var min = Math.min;
-
-// Having a toString local variable name breaks in Opera so use to_string.
-var to_string = ObjectPrototype.toString;
-
-/* global Symbol */
-/* eslint-disable one-var-declaration-per-line, no-redeclare, max-statements-per-line */
-var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
-var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, constructorRegex = /^\s*class /, isES6ClassFn = function isES6ClassFn(value) { try { var fnStr = fnToStr.call(value); var singleStripped = fnStr.replace(/\/\/.*\n/g, ''); var multiStripped = singleStripped.replace(/\/\*[.\s\S]*\*\//g, ''); var spaceStripped = multiStripped.replace(/\n/mg, ' ').replace(/ {2}/g, ' '); return constructorRegex.test(spaceStripped); } catch (e) { return false; /* not a function */ } }, tryFunctionObject = function tryFunctionObject(value) { try { if (isES6ClassFn(value)) { return false; } fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]', isCallable = function isCallable(value) { if (!value) { return false; } if (typeof value !== 'function' && typeof value !== 'object') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } if (isES6ClassFn(value)) { return false; } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
-
-var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; };
-var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; };
-/* eslint-enable one-var-declaration-per-line, no-redeclare, max-statements-per-line */
-
-/* inlined from http://npmjs.com/define-properties */
-var supportsDescriptors = $Object.defineProperty && (function () {
-    try {
-        var obj = {};
-        $Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
-        for (var _ in obj) { return false; }
-        return obj.x === obj;
-    } catch (e) { /* this is ES3 */
-        return false;
-    }
-}());
-var defineProperties = (function (has) {
-  // Define configurable, writable, and non-enumerable props
-  // if they don't exist.
-  var defineProperty;
-  if (supportsDescriptors) {
-      defineProperty = function (object, name, method, forceAssign) {
-          if (!forceAssign && (name in object)) { return; }
-          $Object.defineProperty(object, name, {
-              configurable: true,
-              enumerable: false,
-              writable: true,
-              value: method
-          });
-      };
-  } else {
-      defineProperty = function (object, name, method, forceAssign) {
-          if (!forceAssign && (name in object)) { return; }
-          object[name] = method;
-      };
-  }
-  return function defineProperties(object, map, forceAssign) {
-      for (var name in map) {
-          if (has.call(map, name)) {
-            defineProperty(object, name, map[name], forceAssign);
-          }
-      }
-  };
-}(ObjectPrototype.hasOwnProperty));
-
-//
-// Util
-// ======
-//
-
-/* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */
-var isPrimitive = function isPrimitive(input) {
-    var type = typeof input;
-    return input === null || (type !== 'object' && type !== 'function');
-};
-
-var isActualNaN = $Number.isNaN || function (x) { return x !== x; };
-
-var ES = {
-    // ES5 9.4
-    // http://es5.github.com/#x9.4
-    // http://jsperf.com/to-integer
-    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */
-    ToInteger: function ToInteger(num) {
-        var n = +num;
-        if (isActualNaN(n)) {
-            n = 0;
-        } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
-            n = (n > 0 || -1) * Math.floor(Math.abs(n));
-        }
-        return n;
-    },
-
-    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */
-    ToPrimitive: function ToPrimitive(input) {
-        var val, valueOf, toStr;
-        if (isPrimitive(input)) {
-            return input;
-        }
-        valueOf = input.valueOf;
-        if (isCallable(valueOf)) {
-            val = valueOf.call(input);
-            if (isPrimitive(val)) {
-                return val;
-            }
-        }
-        toStr = input.toString;
-        if (isCallable(toStr)) {
-            val = toStr.call(input);
-            if (isPrimitive(val)) {
-                return val;
-            }
-        }
-        throw new TypeError();
-    },
-
-    // ES5 9.9
-    // http://es5.github.com/#x9.9
-    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */
-    ToObject: function (o) {
-        if (o == null) { // this matches both null and undefined
-            throw new TypeError("can't convert " + o + ' to object');
-        }
-        return $Object(o);
-    },
-
-    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */
-    ToUint32: function ToUint32(x) {
-        return x >>> 0;
-    }
-};
-
-//
-// Function
-// ========
-//
-
-// ES-5 15.3.4.5
-// http://es5.github.com/#x15.3.4.5
-
-var Empty = function Empty() {};
-
-defineProperties(FunctionPrototype, {
-    bind: function bind(that) { // .length is 1
-        // 1. Let Target be the this value.
-        var target = this;
-        // 2. If IsCallable(Target) is false, throw a TypeError exception.
-        if (!isCallable(target)) {
-            throw new TypeError('Function.prototype.bind called on incompatible ' + target);
-        }
-        // 3. Let A be a new (possibly empty) internal list of all of the
-        //   argument values provided after thisArg (arg1, arg2 etc), in order.
-        // XXX slicedArgs will stand in for "A" if used
-        var args = array_slice.call(arguments, 1); // for normal call
-        // 4. Let F be a new native ECMAScript object.
-        // 11. Set the [[Prototype]] internal property of F to the standard
-        //   built-in Function prototype object as specified in 15.3.3.1.
-        // 12. Set the [[Call]] internal property of F as described in
-        //   15.3.4.5.1.
-        // 13. Set the [[Construct]] internal property of F as described in
-        //   15.3.4.5.2.
-        // 14. Set the [[HasInstance]] internal property of F as described in
-        //   15.3.4.5.3.
-        var bound;
-        var binder = function () {
-
-            if (this instanceof bound) {
-                // 15.3.4.5.2 [[Construct]]
-                // When the [[Construct]] internal method of a function object,
-                // F that was created using the bind function is called with a
-                // list of arguments ExtraArgs, the following steps are taken:
-                // 1. Let target be the value of F's [[TargetFunction]]
-                //   internal property.
-                // 2. If target has no [[Construct]] internal method, a
-                //   TypeError exception is thrown.
-                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
-                //   property.
-                // 4. Let args be a new list containing the same values as the
-                //   list boundArgs in the same order followed by the same
-                //   values as the list ExtraArgs in the same order.
-                // 5. Return the result of calling the [[Construct]] internal
-                //   method of target providing args as the arguments.
-
-                var result = apply.call(
-                    target,
-                    this,
-                    array_concat.call(args, array_slice.call(arguments))
-                );
-                if ($Object(result) === result) {
-                    return result;
-                }
-                return this;
-
-            } else {
-                // 15.3.4.5.1 [[Call]]
-                // When the [[Call]] internal method of a function object, F,
-                // which was created using the bind function is called with a
-                // this value and a list of arguments ExtraArgs, the following
-                // steps are taken:
-                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
-                //   property.
-                // 2. Let boundThis be the value of F's [[BoundThis]] internal
-                //   property.
-                // 3. Let target be the value of F's [[TargetFunction]] internal
-                //   property.
-                // 4. Let args be a new list containing the same values as the
-                //   list boundArgs in the same order followed by the same
-                //   values as the list ExtraArgs in the same order.
-                // 5. Return the result of calling the [[Call]] internal method
-                //   of target providing boundThis as the this value and
-                //   providing args as the arguments.
-
-                // equiv: target.call(this, ...boundArgs, ...args)
-                return apply.call(
-                    target,
-                    that,
-                    array_concat.call(args, array_slice.call(arguments))
-                );
-
-            }
-
-        };
-
-        // 15. If the [[Class]] internal property of Target is "Function", then
-        //     a. Let L be the length property of Target minus the length of A.
-        //     b. Set the length own property of F to either 0 or L, whichever is
-        //       larger.
-        // 16. Else set the length own property of F to 0.
-
-        var boundLength = max(0, target.length - args.length);
-
-        // 17. Set the attributes of the length own property of F to the values
-        //   specified in 15.3.5.1.
-        var boundArgs = [];
-        for (var i = 0; i < boundLength; i++) {
-            array_push.call(boundArgs, '$' + i);
-        }
-
-        // XXX Build a dynamic function with desired amount of arguments is the only
-        // way to set the length property of a function.
-        // In environments where Content Security Policies enabled (Chrome extensions,
-        // for ex.) all use of eval or Function costructor throws an exception.
-        // However in all of these environments Function.prototype.bind exists
-        // and so this code will never be executed.
-        bound = $Function('binder', 'return function (' + array_join.call(boundArgs, ',') + '){ return binder.apply(this, arguments); }')(binder);
-
-        if (target.prototype) {
-            Empty.prototype = target.prototype;
-            bound.prototype = new Empty();
-            // Clean up dangling references.
-            Empty.prototype = null;
-        }
-
-        // TODO
-        // 18. Set the [[Extensible]] internal property of F to true.
-
-        // TODO
-        // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
-        // 20. Call the [[DefineOwnProperty]] internal method of F with
-        //   arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
-        //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
-        //   false.
-        // 21. Call the [[DefineOwnProperty]] internal method of F with
-        //   arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
-        //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
-        //   and false.
-
-        // TODO
-        // NOTE Function objects created using Function.prototype.bind do not
-        // have a prototype property or the [[Code]], [[FormalParameters]], and
-        // [[Scope]] internal properties.
-        // XXX can't delete prototype in pure-js.
-
-        // 22. Return F.
-        return bound;
-    }
-});
-
-// _Please note: Shortcuts are defined after `Function.prototype.bind` as we
-// use it in defining shortcuts.
-var owns = call.bind(ObjectPrototype.hasOwnProperty);
-var toStr = call.bind(ObjectPrototype.toString);
-var arraySlice = call.bind(array_slice);
-var arraySliceApply = apply.bind(array_slice);
-var strSlice = call.bind(StringPrototype.slice);
-var strSplit = call.bind(StringPrototype.split);
-var strIndexOf = call.bind(StringPrototype.indexOf);
-var pushCall = call.bind(array_push);
-var isEnum = call.bind(ObjectPrototype.propertyIsEnumerable);
-var arraySort = call.bind(ArrayPrototype.sort);
-
-//
-// Array
-// =====
-//
-
-var isArray = $Array.isArray || function isArray(obj) {
-    return toStr(obj) === '[object Array]';
-};
-
-// ES5 15.4.4.12
-// http://es5.github.com/#x15.4.4.13
-// Return len+argCount.
-// [bugfix, ielt8]
-// IE < 8 bug: [].unshift(0) === undefined but should be "1"
-var hasUnshiftReturnValueBug = [].unshift(0) !== 1;
-defineProperties(ArrayPrototype, {
-    unshift: function () {
-        array_unshift.apply(this, arguments);
-        return this.length;
-    }
-}, hasUnshiftReturnValueBug);
-
-// ES5 15.4.3.2
-// http://es5.github.com/#x15.4.3.2
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray
-defineProperties($Array, { isArray: isArray });
-
-// The IsCallable() check in the Array functions
-// has been replaced with a strict check on the
-// internal class of the object to trap cases where
-// the provided function was actually a regular
-// expression literal, which in V8 and
-// JavaScriptCore is a typeof "function".  Only in
-// V8 are regular expression literals permitted as
-// reduce parameters, so it is desirable in the
-// general case for the shim to match the more
-// strict and common behavior of rejecting regular
-// expressions.
-
-// ES5 15.4.4.18
-// http://es5.github.com/#x15.4.4.18
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach
-
-// Check failure of by-index access of string characters (IE < 9)
-// and failure of `0 in boxedString` (Rhino)
-var boxedString = $Object('a');
-var splitString = boxedString[0] !== 'a' || !(0 in boxedString);
-
-var properlyBoxesContext = function properlyBoxed(method) {
-    // Check node 0.6.21 bug where third parameter is not boxed
-    var properlyBoxesNonStrict = true;
-    var properlyBoxesStrict = true;
-    var threwException = false;
-    if (method) {
-        try {
-            method.call('foo', function (_, __, context) {
-                if (typeof context !== 'object') {
-                    properlyBoxesNonStrict = false;
-                }
-            });
-
-            method.call([1], function () {
-                'use strict';
-
-                properlyBoxesStrict = typeof this === 'string';
-            }, 'x');
-        } catch (e) {
-            threwException = true;
-        }
-    }
-    return !!method && !threwException && properlyBoxesNonStrict && properlyBoxesStrict;
-};
-
-defineProperties(ArrayPrototype, {
-    forEach: function forEach(callbackfn/*, thisArg*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var i = -1;
-        var length = ES.ToUint32(self.length);
-        var T;
-        if (arguments.length > 1) {
-          T = arguments[1];
-        }
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.forEach callback must be a function');
-        }
-
-        while (++i < length) {
-            if (i in self) {
-                // Invoke the callback function with call, passing arguments:
-                // context, property value, property key, thisArg object
-                if (typeof T === 'undefined') {
-                    callbackfn(self[i], i, object);
-                } else {
-                    callbackfn.call(T, self[i], i, object);
-                }
-            }
-        }
-    }
-}, !properlyBoxesContext(ArrayPrototype.forEach));
-
-// ES5 15.4.4.19
-// http://es5.github.com/#x15.4.4.19
-// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
-defineProperties(ArrayPrototype, {
-    map: function map(callbackfn/*, thisArg*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-        var result = $Array(length);
-        var T;
-        if (arguments.length > 1) {
-            T = arguments[1];
-        }
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.map callback must be a function');
-        }
-
-        for (var i = 0; i < length; i++) {
-            if (i in self) {
-                if (typeof T === 'undefined') {
-                    result[i] = callbackfn(self[i], i, object);
-                } else {
-                    result[i] = callbackfn.call(T, self[i], i, object);
-                }
-            }
-        }
-        return result;
-    }
-}, !properlyBoxesContext(ArrayPrototype.map));
-
-// ES5 15.4.4.20
-// http://es5.github.com/#x15.4.4.20
-// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
-defineProperties(ArrayPrototype, {
-    filter: function filter(callbackfn/*, thisArg*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-        var result = [];
-        var value;
-        var T;
-        if (arguments.length > 1) {
-            T = arguments[1];
-        }
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.filter callback must be a function');
-        }
-
-        for (var i = 0; i < length; i++) {
-            if (i in self) {
-                value = self[i];
-                if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) {
-                    pushCall(result, value);
-                }
-            }
-        }
-        return result;
-    }
-}, !properlyBoxesContext(ArrayPrototype.filter));
-
-// ES5 15.4.4.16
-// http://es5.github.com/#x15.4.4.16
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every
-defineProperties(ArrayPrototype, {
-    every: function every(callbackfn/*, thisArg*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-        var T;
-        if (arguments.length > 1) {
-            T = arguments[1];
-        }
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.every callback must be a function');
-        }
-
-        for (var i = 0; i < length; i++) {
-            if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
-                return false;
-            }
-        }
-        return true;
-    }
-}, !properlyBoxesContext(ArrayPrototype.every));
-
-// ES5 15.4.4.17
-// http://es5.github.com/#x15.4.4.17
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some
-defineProperties(ArrayPrototype, {
-    some: function some(callbackfn/*, thisArg */) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-        var T;
-        if (arguments.length > 1) {
-            T = arguments[1];
-        }
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.some callback must be a function');
-        }
-
-        for (var i = 0; i < length; i++) {
-            if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
-                return true;
-            }
-        }
-        return false;
-    }
-}, !properlyBoxesContext(ArrayPrototype.some));
-
-// ES5 15.4.4.21
-// http://es5.github.com/#x15.4.4.21
-// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce
-var reduceCoercesToObject = false;
-if (ArrayPrototype.reduce) {
-    reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) {
-        return list;
-    }) === 'object';
-}
-defineProperties(ArrayPrototype, {
-    reduce: function reduce(callbackfn/*, initialValue*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.reduce callback must be a function');
-        }
-
-        // no value to return if no initial value and an empty array
-        if (length === 0 && arguments.length === 1) {
-            throw new TypeError('reduce of empty array with no initial value');
-        }
-
-        var i = 0;
-        var result;
-        if (arguments.length >= 2) {
-            result = arguments[1];
-        } else {
-            do {
-                if (i in self) {
-                    result = self[i++];
-                    break;
-                }
-
-                // if array contains no values, no initial value to return
-                if (++i >= length) {
-                    throw new TypeError('reduce of empty array with no initial value');
-                }
-            } while (true);
-        }
-
-        for (; i < length; i++) {
-            if (i in self) {
-                result = callbackfn(result, self[i], i, object);
-            }
-        }
-
-        return result;
-    }
-}, !reduceCoercesToObject);
-
-// ES5 15.4.4.22
-// http://es5.github.com/#x15.4.4.22
-// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight
-var reduceRightCoercesToObject = false;
-if (ArrayPrototype.reduceRight) {
-    reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) {
-        return list;
-    }) === 'object';
-}
-defineProperties(ArrayPrototype, {
-    reduceRight: function reduceRight(callbackfn/*, initial*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.reduceRight callback must be a function');
-        }
-
-        // no value to return if no initial value, empty array
-        if (length === 0 && arguments.length === 1) {
-            throw new TypeError('reduceRight of empty array with no initial value');
-        }
-
-        var result;
-        var i = length - 1;
-        if (arguments.length >= 2) {
-            result = arguments[1];
-        } else {
-            do {
-                if (i in self) {
-                    result = self[i--];
-                    break;
-                }
-
-                // if array contains no values, no initial value to return
-                if (--i < 0) {
-                    throw new TypeError('reduceRight of empty array with no initial value');
-                }
-            } while (true);
-        }
-
-        if (i < 0) {
-            return result;
-        }
-
-        do {
-            if (i in self) {
-                result = callbackfn(result, self[i], i, object);
-            }
-        } while (i--);
-
-        return result;
-    }
-}, !reduceRightCoercesToObject);
-
-// ES5 15.4.4.14
-// http://es5.github.com/#x15.4.4.14
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
-var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !== -1;
-defineProperties(ArrayPrototype, {
-    indexOf: function indexOf(searchElement/*, fromIndex */) {
-        var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);
-        var length = ES.ToUint32(self.length);
-
-        if (length === 0) {
-            return -1;
-        }
-
-        var i = 0;
-        if (arguments.length > 1) {
-            i = ES.ToInteger(arguments[1]);
-        }
-
-        // handle negative indices
-        i = i >= 0 ? i : max(0, length + i);
-        for (; i < length; i++) {
-            if (i in self && self[i] === searchElement) {
-                return i;
-            }
-        }
-        return -1;
-    }
-}, hasFirefox2IndexOfBug);
-
-// ES5 15.4.4.15
-// http://es5.github.com/#x15.4.4.15
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf
-var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1;
-defineProperties(ArrayPrototype, {
-    lastIndexOf: function lastIndexOf(searchElement/*, fromIndex */) {
-        var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);
-        var length = ES.ToUint32(self.length);
-
-        if (length === 0) {
-            return -1;
-        }
-        var i = length - 1;
-        if (arguments.length > 1) {
-            i = min(i, ES.ToInteger(arguments[1]));
-        }
-        // handle negative indices
-        i = i >= 0 ? i : length - Math.abs(i);
-        for (; i >= 0; i--) {
-            if (i in self && searchElement === self[i]) {
-                return i;
-            }
-        }
-        return -1;
-    }
-}, hasFirefox2LastIndexOfBug);
-
-// ES5 15.4.4.12
-// http://es5.github.com/#x15.4.4.12
-var spliceNoopReturnsEmptyArray = (function () {
-    var a = [1, 2];
-    var result = a.splice();
-    return a.length === 2 && isArray(result) && result.length === 0;
-}());
-defineProperties(ArrayPrototype, {
-    // Safari 5.0 bug where .splice() returns undefined
-    splice: function splice(start, deleteCount) {
-        if (arguments.length === 0) {
-            return [];
-        } else {
-            return array_splice.apply(this, arguments);
-        }
-    }
-}, !spliceNoopReturnsEmptyArray);
-
-var spliceWorksWithEmptyObject = (function () {
-    var obj = {};
-    ArrayPrototype.splice.call(obj, 0, 0, 1);
-    return obj.length === 1;
-}());
-defineProperties(ArrayPrototype, {
-    splice: function splice(start, deleteCount) {
-        if (arguments.length === 0) { return []; }
-        var args = arguments;
-        this.length = max(ES.ToInteger(this.length), 0);
-        if (arguments.length > 0 && typeof deleteCount !== 'number') {
-            args = arraySlice(arguments);
-            if (args.length < 2) {
-                pushCall(args, this.length - start);
-            } else {
-                args[1] = ES.ToInteger(deleteCount);
-            }
-        }
-        return array_splice.apply(this, args);
-    }
-}, !spliceWorksWithEmptyObject);
-var spliceWorksWithLargeSparseArrays = (function () {
-    // Per https://github.com/es-shims/es5-shim/issues/295
-    // Safari 7/8 breaks with sparse arrays of size 1e5 or greater
-    var arr = new $Array(1e5);
-    // note: the index MUST be 8 or larger or the test will false pass
-    arr[8] = 'x';
-    arr.splice(1, 1);
-    // note: this test must be defined *after* the indexOf shim
-    // per https://github.com/es-shims/es5-shim/issues/313
-    return arr.indexOf('x') === 7;
-}());
-var spliceWorksWithSmallSparseArrays = (function () {
-    // Per https://github.com/es-shims/es5-shim/issues/295
-    // Opera 12.15 breaks on this, no idea why.
-    var n = 256;
-    var arr = [];
-    arr[n] = 'a';
-    arr.splice(n + 1, 0, 'b');
-    return arr[n] === 'a';
-}());
-defineProperties(ArrayPrototype, {
-    splice: function splice(start, deleteCount) {
-        var O = ES.ToObject(this);
-        var A = [];
-        var len = ES.ToUint32(O.length);
-        var relativeStart = ES.ToInteger(start);
-        var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) : min(relativeStart, len);
-        var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len - actualStart);
-
-        var k = 0;
-        var from;
-        while (k < actualDeleteCount) {
-            from = $String(actualStart + k);
-            if (owns(O, from)) {
-                A[k] = O[from];
-            }
-            k += 1;
-        }
-
-        var items = arraySlice(arguments, 2);
-        var itemCount = items.length;
-        var to;
-        if (itemCount < actualDeleteCount) {
-            k = actualStart;
-            var maxK = len - actualDeleteCount;
-            while (k < maxK) {
-                from = $String(k + actualDeleteCount);
-                to = $String(k + itemCount);
-                if (owns(O, from)) {
-                    O[to] = O[from];
-                } else {
-                    delete O[to];
-                }
-                k += 1;
-            }
-            k = len;
-            var minK = len - actualDeleteCount + itemCount;
-            while (k > minK) {
-                delete O[k - 1];
-                k -= 1;
-            }
-        } else if (itemCount > actualDeleteCount) {
-            k = len - actualDeleteCount;
-            while (k > actualStart) {
-                from = $String(k + actualDeleteCount - 1);
-                to = $String(k + itemCount - 1);
-                if (owns(O, from)) {
-                    O[to] = O[from];
-                } else {
-                    delete O[to];
-                }
-                k -= 1;
-            }
-        }
-        k = actualStart;
-        for (var i = 0; i < items.length; ++i) {
-            O[k] = items[i];
-            k += 1;
-        }
-        O.length = len - actualDeleteCount + itemCount;
-
-        return A;
-    }
-}, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays);
-
-var originalJoin = ArrayPrototype.join;
-var hasStringJoinBug;
-try {
-    hasStringJoinBug = Array.prototype.join.call('123', ',') !== '1,2,3';
-} catch (e) {
-    hasStringJoinBug = true;
-}
-if (hasStringJoinBug) {
-    defineProperties(ArrayPrototype, {
-        join: function join(separator) {
-            var sep = typeof separator === 'undefined' ? ',' : separator;
-            return originalJoin.call(isString(this) ? strSplit(this, '') : this, sep);
-        }
-    }, hasStringJoinBug);
-}
-
-var hasJoinUndefinedBug = [1, 2].join(undefined) !== '1,2';
-if (hasJoinUndefinedBug) {
-    defineProperties(ArrayPrototype, {
-        join: function join(separator) {
-            var sep = typeof separator === 'undefined' ? ',' : separator;
-            return originalJoin.call(this, sep);
-        }
-    }, hasJoinUndefinedBug);
-}
-
-var pushShim = function push(item) {
-    var O = ES.ToObject(this);
-    var n = ES.ToUint32(O.length);
-    var i = 0;
-    while (i < arguments.length) {
-        O[n + i] = arguments[i];
-        i += 1;
-    }
-    O.length = n + i;
-    return n + i;
-};
-
-var pushIsNotGeneric = (function () {
-    var obj = {};
-    var result = Array.prototype.push.call(obj, undefined);
-    return result !== 1 || obj.length !== 1 || typeof obj[0] !== 'undefined' || !owns(obj, 0);
-}());
-defineProperties(ArrayPrototype, {
-    push: function push(item) {
-        if (isArray(this)) {
-            return array_push.apply(this, arguments);
-        }
-        return pushShim.apply(this, arguments);
-    }
-}, pushIsNotGeneric);
-
-// This fixes a very weird bug in Opera 10.6 when pushing `undefined
-var pushUndefinedIsWeird = (function () {
-    var arr = [];
-    var result = arr.push(undefined);
-    return result !== 1 || arr.length !== 1 || typeof arr[0] !== 'undefined' || !owns(arr, 0);
-}());
-defineProperties(ArrayPrototype, { push: pushShim }, pushUndefinedIsWeird);
-
-// ES5 15.2.3.14
-// http://es5.github.io/#x15.4.4.10
-// Fix boxed string bug
-defineProperties(ArrayPrototype, {
-    slice: function (start, end) {
-        var arr = isString(this) ? strSplit(this, '') : this;
-        return arraySliceApply(arr, arguments);
-    }
-}, splitString);
-
-var sortIgnoresNonFunctions = (function () {
-    try {
-        [1, 2].sort(null);
-        [1, 2].sort({});
-        return true;
-    } catch (e) { /**/ }
-    return false;
-}());
-var sortThrowsOnRegex = (function () {
-    // this is a problem in Firefox 4, in which `typeof /a/ === 'function'`
-    try {
-        [1, 2].sort(/a/);
-        return false;
-    } catch (e) { /**/ }
-    return true;
-}());
-var sortIgnoresUndefined = (function () {
-    // applies in IE 8, for one.
-    try {
-        [1, 2].sort(undefined);
-        return true;
-    } catch (e) { /**/ }
-    return false;
-}());
-defineProperties(ArrayPrototype, {
-    sort: function sort(compareFn) {
-        if (typeof compareFn === 'undefined') {
-            return arraySort(this);
-        }
-        if (!isCallable(compareFn)) {
-            throw new TypeError('Array.prototype.sort callback must be a function');
-        }
-        return arraySort(this, compareFn);
-    }
-}, sortIgnoresNonFunctions || !sortIgnoresUndefined || !sortThrowsOnRegex);
-
-//
-// Object
-// ======
-//
-
-// ES5 15.2.3.14
-// http://es5.github.com/#x15.2.3.14
-
-// http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
-var hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString');
-var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');
-var hasStringEnumBug = !owns('x', '0');
-var equalsConstructorPrototype = function (o) {
-    var ctor = o.constructor;
-    return ctor && ctor.prototype === o;
-};
-var blacklistedKeys = {
-    $window: true,
-    $console: true,
-    $parent: true,
-    $self: true,
-    $frame: true,
-    $frames: true,
-    $frameElement: true,
-    $webkitIndexedDB: true,
-    $webkitStorageInfo: true,
-    $external: true
-};
-var hasAutomationEqualityBug = (function () {
-    /* globals window */
-    if (typeof window === 'undefined') { return false; }
-    for (var k in window) {
-        try {
-            if (!blacklistedKeys['$' + k] && owns(window, k) && window[k] !== null && typeof window[k] === 'object') {
-                equalsConstructorPrototype(window[k]);
-            }
-        } catch (e) {
-            return true;
-        }
-    }
-    return false;
-}());
-var equalsConstructorPrototypeIfNotBuggy = function (object) {
-    if (typeof window === 'undefined' || !hasAutomationEqualityBug) { return equalsConstructorPrototype(object); }
-    try {
-        return equalsConstructorPrototype(object);
-    } catch (e) {
-        return false;
-    }
-};
-var dontEnums = [
-    'toString',
-    'toLocaleString',
-    'valueOf',
-    'hasOwnProperty',
-    'isPrototypeOf',
-    'propertyIsEnumerable',
-    'constructor'
-];
-var dontEnumsLength = dontEnums.length;
-
-// taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js
-// can be replaced with require('is-arguments') if we ever use a build process instead
-var isStandardArguments = function isArguments(value) {
-    return toStr(value) === '[object Arguments]';
-};
-var isLegacyArguments = function isArguments(value) {
-    return value !== null &&
-        typeof value === 'object' &&
-        typeof value.length === 'number' &&
-        value.length >= 0 &&
-        !isArray(value) &&
-        isCallable(value.callee);
-};
-var isArguments = isStandardArguments(arguments) ? isStandardArguments : isLegacyArguments;
-
-defineProperties($Object, {
-    keys: function keys(object) {
-        var isFn = isCallable(object);
-        var isArgs = isArguments(object);
-        var isObject = object !== null && typeof object === 'object';
-        var isStr = isObject && isString(object);
-
-        if (!isObject && !isFn && !isArgs) {
-            throw new TypeError('Object.keys called on a non-object');
-        }
-
-        var theKeys = [];
-        var skipProto = hasProtoEnumBug && isFn;
-        if ((isStr && hasStringEnumBug) || isArgs) {
-            for (var i = 0; i < object.length; ++i) {
-                pushCall(theKeys, $String(i));
-            }
-        }
-
-        if (!isArgs) {
-            for (var name in object) {
-                if (!(skipProto && name === 'prototype') && owns(object, name)) {
-                    pushCall(theKeys, $String(name));
-                }
-            }
-        }
-
-        if (hasDontEnumBug) {
-            var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
-            for (var j = 0; j < dontEnumsLength; j++) {
-                var dontEnum = dontEnums[j];
-                if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) {
-                    pushCall(theKeys, dontEnum);
-                }
-            }
-        }
-        return theKeys;
-    }
-});
-
-var keysWorksWithArguments = $Object.keys && (function () {
-    // Safari 5.0 bug
-    return $Object.keys(arguments).length === 2;
-}(1, 2));
-var keysHasArgumentsLengthBug = $Object.keys && (function () {
-    var argKeys = $Object.keys(arguments);
-    return arguments.length !== 1 || argKeys.length !== 1 || argKeys[0] !== 1;
-}(1));
-var originalKeys = $Object.keys;
-defineProperties($Object, {
-    keys: function keys(object) {
-        if (isArguments(object)) {
-            return originalKeys(arraySlice(object));
-        } else {
-            return originalKeys(object);
-        }
-    }
-}, !keysWorksWithArguments || keysHasArgumentsLengthBug);
-
-//
-// Date
-// ====
-//
-
-var hasNegativeMonthYearBug = new Date(-3509827329600292).getUTCMonth() !== 0;
-var aNegativeTestDate = new Date(-1509842289600292);
-var aPositiveTestDate = new Date(1449662400000);
-var hasToUTCStringFormatBug = aNegativeTestDate.toUTCString() !== 'Mon, 01 Jan -45875 11:59:59 GMT';
-var hasToDateStringFormatBug;
-var hasToStringFormatBug;
-var timeZoneOffset = aNegativeTestDate.getTimezoneOffset();
-if (timeZoneOffset < -720) {
-    hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Tue Jan 02 -45875';
-    hasToStringFormatBug = !(/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString());
-} else {
-    hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Mon Jan 01 -45875';
-    hasToStringFormatBug = !(/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString());
-}
-
-var originalGetFullYear = call.bind(Date.prototype.getFullYear);
-var originalGetMonth = call.bind(Date.prototype.getMonth);
-var originalGetDate = call.bind(Date.prototype.getDate);
-var originalGetUTCFullYear = call.bind(Date.prototype.getUTCFullYear);
-var originalGetUTCMonth = call.bind(Date.prototype.getUTCMonth);
-var originalGetUTCDate = call.bind(Date.prototype.getUTCDate);
-var originalGetUTCDay = call.bind(Date.prototype.getUTCDay);
-var originalGetUTCHours = call.bind(Date.prototype.getUTCHours);
-var originalGetUTCMinutes = call.bind(Date.prototype.getUTCMinutes);
-var originalGetUTCSeconds = call.bind(Date.prototype.getUTCSeconds);
-var originalGetUTCMilliseconds = call.bind(Date.prototype.getUTCMilliseconds);
-var dayName = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
-var monthName = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
-var daysInMonth = function daysInMonth(month, year) {
-    return originalGetDate(new Date(year, month, 0));
-};
-
-defineProperties(Date.prototype, {
-    getFullYear: function getFullYear() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetFullYear(this);
-        if (year < 0 && originalGetMonth(this) > 11) {
-            return year + 1;
-        }
-        return year;
-    },
-    getMonth: function getMonth() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetFullYear(this);
-        var month = originalGetMonth(this);
-        if (year < 0 && month > 11) {
-            return 0;
-        }
-        return month;
-    },
-    getDate: function getDate() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetFullYear(this);
-        var month = originalGetMonth(this);
-        var date = originalGetDate(this);
-        if (year < 0 && month > 11) {
-            if (month === 12) {
-                return date;
-            }
-            var days = daysInMonth(0, year + 1);
-            return (days - date) + 1;
-        }
-        return date;
-    },
-    getUTCFullYear: function getUTCFullYear() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetUTCFullYear(this);
-        if (year < 0 && originalGetUTCMonth(this) > 11) {
-            return year + 1;
-        }
-        return year;
-    },
-    getUTCMonth: function getUTCMonth() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetUTCFullYear(this);
-        var month = originalGetUTCMonth(this);
-        if (year < 0 && month > 11) {
-            return 0;
-        }
-        return month;
-    },
-    getUTCDate: function getUTCDate() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetUTCFullYear(this);
-        var month = originalGetUTCMonth(this);
-        var date = originalGetUTCDate(this);
-        if (year < 0 && month > 11) {
-            if (month === 12) {
-                return date;
-            }
-            var days = daysInMonth(0, year + 1);
-            return (days - date) + 1;
-        }
-        return date;
-    }
-}, hasNegativeMonthYearBug);
-
-defineProperties(Date.prototype, {
-    toUTCString: function toUTCString() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var day = originalGetUTCDay(this);
-        var date = originalGetUTCDate(this);
-        var month = originalGetUTCMonth(this);
-        var year = originalGetUTCFullYear(this);
-        var hour = originalGetUTCHours(this);
-        var minute = originalGetUTCMinutes(this);
-        var second = originalGetUTCSeconds(this);
-        return dayName[day] + ', ' +
-            (date < 10 ? '0' + date : date) + ' ' +
-            monthName[month] + ' ' +
-            year + ' ' +
-            (hour < 10 ? '0' + hour : hour) + ':' +
-            (minute < 10 ? '0' + minute : minute) + ':' +
-            (second < 10 ? '0' + second : second) + ' GMT';
-    }
-}, hasNegativeMonthYearBug || hasToUTCStringFormatBug);
-
-// Opera 12 has `,`
-defineProperties(Date.prototype, {
-    toDateString: function toDateString() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var day = this.getDay();
-        var date = this.getDate();
-        var month = this.getMonth();
-        var year = this.getFullYear();
-        return dayName[day] + ' ' +
-            monthName[month] + ' ' +
-            (date < 10 ? '0' + date : date) + ' ' +
-            year;
-    }
-}, hasNegativeMonthYearBug || hasToDateStringFormatBug);
-
-// can't use defineProperties here because of toString enumeration issue in IE <= 8
-if (hasNegativeMonthYearBug || hasToStringFormatBug) {
-    Date.prototype.toString = function toString() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var day = this.getDay();
-        var date = this.getDate();
-        var month = this.getMonth();
-        var year = this.getFullYear();
-        var hour = this.getHours();
-        var minute = this.getMinutes();
-        var second = this.getSeconds();
-        var timezoneOffset = this.getTimezoneOffset();
-        var hoursOffset = Math.floor(Math.abs(timezoneOffset) / 60);
-        var minutesOffset = Math.floor(Math.abs(timezoneOffset) % 60);
-        return dayName[day] + ' ' +
-            monthName[month] + ' ' +
-            (date < 10 ? '0' + date : date) + ' ' +
-            year + ' ' +
-            (hour < 10 ? '0' + hour : hour) + ':' +
-            (minute < 10 ? '0' + minute : minute) + ':' +
-            (second < 10 ? '0' + second : second) + ' GMT' +
-            (timezoneOffset > 0 ? '-' : '+') +
-            (hoursOffset < 10 ? '0' + hoursOffset : hoursOffset) +
-            (minutesOffset < 10 ? '0' + minutesOffset : minutesOffset);
-    };
-    if (supportsDescriptors) {
-        $Object.defineProperty(Date.prototype, 'toString', {
-            configurable: true,
-            enumerable: false,
-            writable: true
-        });
-    }
-}
-
-// ES5 15.9.5.43
-// http://es5.github.com/#x15.9.5.43
-// This function returns a String value represent the instance in time
-// represented by this Date object. The format of the String is the Date Time
-// string format defined in 15.9.1.15. All fields are present in the String.
-// The time zone is always UTC, denoted by the suffix Z. If the time value of
-// this object is not a finite Number a RangeError exception is thrown.
-var negativeDate = -62198755200000;
-var negativeYearString = '-000001';
-var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1;
-var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString() !== '1969-12-31T23:59:59.999Z';
-
-var getTime = call.bind(Date.prototype.getTime);
-
-defineProperties(Date.prototype, {
-    toISOString: function toISOString() {
-        if (!isFinite(this) || !isFinite(getTime(this))) {
-            // Adope Photoshop requires the second check.
-            throw new RangeError('Date.prototype.toISOString called on non-finite value.');
-        }
-
-        var year = originalGetUTCFullYear(this);
-
-        var month = originalGetUTCMonth(this);
-        // see https://github.com/es-shims/es5-shim/issues/111
-        year += Math.floor(month / 12);
-        month = (month % 12 + 12) % 12;
-
-        // the date time string format is specified in 15.9.1.15.
-        var result = [month + 1, originalGetUTCDate(this), originalGetUTCHours(this), originalGetUTCMinutes(this), originalGetUTCSeconds(this)];
-        year = (
-            (year < 0 ? '-' : (year > 9999 ? '+' : '')) +
-            strSlice('00000' + Math.abs(year), (0 <= year && year <= 9999) ? -4 : -6)
-        );
-
-        for (var i = 0; i < result.length; ++i) {
-          // pad months, days, hours, minutes, and seconds to have two digits.
-          result[i] = strSlice('00' + result[i], -2);
-        }
-        // pad milliseconds to have three digits.
-        return (
-            year + '-' + arraySlice(result, 0, 2).join('-') +
-            'T' + arraySlice(result, 2).join(':') + '.' +
-            strSlice('000' + originalGetUTCMilliseconds(this), -3) + 'Z'
-        );
-    }
-}, hasNegativeDateBug || hasSafari51DateBug);
-
-// ES5 15.9.5.44
-// http://es5.github.com/#x15.9.5.44
-// This function provides a String representation of a Date object for use by
-// JSON.stringify (15.12.3).
-var dateToJSONIsSupported = (function () {
-    try {
-        return Date.prototype.toJSON &&
-            new Date(NaN).toJSON() === null &&
-            new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 &&
-            Date.prototype.toJSON.call({ // generic
-                toISOString: function () { return true; }
-            });
-    } catch (e) {
-        return false;
-    }
-}());
-if (!dateToJSONIsSupported) {
-    Date.prototype.toJSON = function toJSON(key) {
-        // When the toJSON method is called with argument key, the following
-        // steps are taken:
-
-        // 1.  Let O be the result of calling ToObject, giving it the this
-        // value as its argument.
-        // 2. Let tv be ES.ToPrimitive(O, hint Number).
-        var O = $Object(this);
-        var tv = ES.ToPrimitive(O);
-        // 3. If tv is a Number and is not finite, return null.
-        if (typeof tv === 'number' && !isFinite(tv)) {
-            return null;
-        }
-        // 4. Let toISO be the result of calling the [[Get]] internal method of
-        // O with argument "toISOString".
-        var toISO = O.toISOString;
-        // 5. If IsCallable(toISO) is false, throw a TypeError exception.
-        if (!isCallable(toISO)) {
-            throw new TypeError('toISOString property is not callable');
-        }
-        // 6. Return the result of calling the [[Call]] internal method of
-        //  toISO with O as the this value and an empty argument list.
-        return toISO.call(O);
-
-        // NOTE 1 The argument is ignored.
-
-        // NOTE 2 The toJSON function is intentionally generic; it does not
-        // require that its this value be a Date object. Therefore, it can be
-        // transferred to other kinds of objects for use as a method. However,
-        // it does require that any such object have a toISOString method. An
-        // object is free to use the argument key to filter its
-        // stringification.
-    };
-}
-
-// ES5 15.9.4.2
-// http://es5.github.com/#x15.9.4.2
-// based on work shared by Daniel Friesen (dantman)
-// http://gist.github.com/303249
-var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;
-var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z'));
-var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z'));
-if (doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {
-    // XXX global assignment won't work in embeddings that use
-    // an alternate object for the context.
-    /* global Date: true */
-    /* eslint-disable no-undef */
-    var maxSafeUnsigned32Bit = Math.pow(2, 31) - 1;
-    var hasSafariSignedIntBug = isActualNaN(new Date(1970, 0, 1, 0, 0, 0, maxSafeUnsigned32Bit + 1).getTime());
-    /* eslint-disable no-implicit-globals */
-    Date = (function (NativeDate) {
-    /* eslint-enable no-implicit-globals */
-    /* eslint-enable no-undef */
-        // Date.length === 7
-        var DateShim = function Date(Y, M, D, h, m, s, ms) {
-            var length = arguments.length;
-            var date;
-            if (this instanceof NativeDate) {
-                var seconds = s;
-                var millis = ms;
-                if (hasSafariSignedIntBug && length >= 7 && ms > maxSafeUnsigned32Bit) {
-                    // work around a Safari 8/9 bug where it treats the seconds as signed
-                    var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;
-                    var sToShift = Math.floor(msToShift / 1e3);
-                    seconds += sToShift;
-                    millis -= sToShift * 1e3;
-                }
-                date = length === 1 && $String(Y) === Y ? // isString(Y)
-                    // We explicitly pass it through parse:
-                    new NativeDate(DateShim.parse(Y)) :
-                    // We have to manually make calls depending on argument
-                    // length here
-                    length >= 7 ? new NativeDate(Y, M, D, h, m, seconds, millis) :
-                    length >= 6 ? new NativeDate(Y, M, D, h, m, seconds) :
-                    length >= 5 ? new NativeDate(Y, M, D, h, m) :
-                    length >= 4 ? new NativeDate(Y, M, D, h) :
-                    length >= 3 ? new NativeDate(Y, M, D) :
-                    length >= 2 ? new NativeDate(Y, M) :
-                    length >= 1 ? new NativeDate(Y instanceof NativeDate ? +Y : Y) :
-                                  new NativeDate();
-            } else {
-                date = NativeDate.apply(this, arguments);
-            }
-            if (!isPrimitive(date)) {
-              // Prevent mixups with unfixed Date object
-              defineProperties(date, { constructor: DateShim }, true);
-            }
-            return date;
-        };
-
-        // 15.9.1.15 Date Time String Format.
-        var isoDateExpression = new RegExp('^' +
-            '(\\d{4}|[+-]\\d{6})' + // four-digit year capture or sign +
-                                      // 6-digit extended year
-            '(?:-(\\d{2})' + // optional month capture
-            '(?:-(\\d{2})' + // optional day capture
-            '(?:' + // capture hours:minutes:seconds.milliseconds
-                'T(\\d{2})' + // hours capture
-                ':(\\d{2})' + // minutes capture
-                '(?:' + // optional :seconds.milliseconds
-                    ':(\\d{2})' + // seconds capture
-                    '(?:(\\.\\d{1,}))?' + // milliseconds capture
-                ')?' +
-            '(' + // capture UTC offset component
-                'Z|' + // UTC capture
-                '(?:' + // offset specifier +/-hours:minutes
-                    '([-+])' + // sign capture
-                    '(\\d{2})' + // hours offset capture
-                    ':(\\d{2})' + // minutes offset capture
-                ')' +
-            ')?)?)?)?' +
-        '$');
-
-        var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];
-
-        var dayFromMonth = function dayFromMonth(year, month) {
-            var t = month > 1 ? 1 : 0;
-            return (
-                months[month] +
-                Math.floor((year - 1969 + t) / 4) -
-                Math.floor((year - 1901 + t) / 100) +
-                Math.floor((year - 1601 + t) / 400) +
-                365 * (year - 1970)
-            );
-        };
-
-        var toUTC = function toUTC(t) {
-            var s = 0;
-            var ms = t;
-            if (hasSafariSignedIntBug && ms > maxSafeUnsigned32Bit) {
-                // work around a Safari 8/9 bug where it treats the seconds as signed
-                var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;
-                var sToShift = Math.floor(msToShift / 1e3);
-                s += sToShift;
-                ms -= sToShift * 1e3;
-            }
-            return $Number(new NativeDate(1970, 0, 1, 0, 0, s, ms));
-        };
-
-        // Copy any custom methods a 3rd party library may have added
-        for (var key in NativeDate) {
-            if (owns(NativeDate, key)) {
-                DateShim[key] = NativeDate[key];
-            }
-        }
-
-        // Copy "native" methods explicitly; they may be non-enumerable
-        defineProperties(DateShim, {
-            now: NativeDate.now,
-            UTC: NativeDate.UTC
-        }, true);
-        DateShim.prototype = NativeDate.prototype;
-        defineProperties(DateShim.prototype, {
-            constructor: DateShim
-        }, true);
-
-        // Upgrade Date.parse to handle simplified ISO 8601 strings
-        var parseShim = function parse(string) {
-            var match = isoDateExpression.exec(string);
-            if (match) {
-                // parse months, days, hours, minutes, seconds, and milliseconds
-                // provide default values if necessary
-                // parse the UTC offset component
-                var year = $Number(match[1]),
-                    month = $Number(match[2] || 1) - 1,
-                    day = $Number(match[3] || 1) - 1,
-                    hour = $Number(match[4] || 0),
-                    minute = $Number(match[5] || 0),
-                    second = $Number(match[6] || 0),
-                    millisecond = Math.floor($Number(match[7] || 0) * 1000),
-                    // When time zone is missed, local offset should be used
-                    // (ES 5.1 bug)
-                    // see https://bugs.ecmascript.org/show_bug.cgi?id=112
-                    isLocalTime = Boolean(match[4] && !match[8]),
-                    signOffset = match[9] === '-' ? 1 : -1,
-                    hourOffset = $Number(match[10] || 0),
-                    minuteOffset = $Number(match[11] || 0),
-                    result;
-                var hasMinutesOrSecondsOrMilliseconds = minute > 0 || second > 0 || millisecond > 0;
-                if (
-                    hour < (hasMinutesOrSecondsOrMilliseconds ? 24 : 25) &&
-                    minute < 60 && second < 60 && millisecond < 1000 &&
-                    month > -1 && month < 12 && hourOffset < 24 &&
-                    minuteOffset < 60 && // detect invalid offsets
-                    day > -1 &&
-                    day < (dayFromMonth(year, month + 1) - dayFromMonth(year, month))
-                ) {
-                    result = (
-                        (dayFromMonth(year, month) + day) * 24 +
-                        hour +
-                        hourOffset * signOffset
-                    ) * 60;
-                    result = (
-                        (result + minute + minuteOffset * signOffset) * 60 +
-                        second
-                    ) * 1000 + millisecond;
-                    if (isLocalTime) {
-                        result = toUTC(result);
-                    }
-                    if (-8.64e15 <= result && result <= 8.64e15) {
-                        return result;
-                    }
-                }
-                return NaN;
-            }
-            return NativeDate.parse.apply(this, arguments);
-        };
-        defineProperties(DateShim, { parse: parseShim });
-
-        return DateShim;
-    }(Date));
-    /* global Date: false */
-}
-
-// ES5 15.9.4.4
-// http://es5.github.com/#x15.9.4.4
-if (!Date.now) {
-    Date.now = function now() {
-        return new Date().getTime();
-    };
-}
-
-//
-// Number
-// ======
-//
-
-// ES5.1 15.7.4.5
-// http://es5.github.com/#x15.7.4.5
-var hasToFixedBugs = NumberPrototype.toFixed && (
-  (0.00008).toFixed(3) !== '0.000' ||
-  (0.9).toFixed(0) !== '1' ||
-  (1.255).toFixed(2) !== '1.25' ||
-  (1000000000000000128).toFixed(0) !== '1000000000000000128'
-);
-
-var toFixedHelpers = {
-  base: 1e7,
-  size: 6,
-  data: [0, 0, 0, 0, 0, 0],
-  multiply: function multiply(n, c) {
-      var i = -1;
-      var c2 = c;
-      while (++i < toFixedHelpers.size) {
-          c2 += n * toFixedHelpers.data[i];
-          toFixedHelpers.data[i] = c2 % toFixedHelpers.base;
-          c2 = Math.floor(c2 / toFixedHelpers.base);
-      }
-  },
-  divide: function divide(n) {
-      var i = toFixedHelpers.size;
-      var c = 0;
-      while (--i >= 0) {
-          c += toFixedHelpers.data[i];
-          toFixedHelpers.data[i] = Math.floor(c / n);
-          c = (c % n) * toFixedHelpers.base;
-      }
-  },
-  numToString: function numToString() {
-      var i = toFixedHelpers.size;
-      var s = '';
-      while (--i >= 0) {
-          if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {
-              var t = $String(toFixedHelpers.data[i]);
-              if (s === '') {
-                  s = t;
-              } else {
-                  s += strSlice('0000000', 0, 7 - t.length) + t;
-              }
-          }
-      }
-      return s;
-  },
-  pow: function pow(x, n, acc) {
-      return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc)));
-  },
-  log: function log(x) {
-      var n = 0;
-      var x2 = x;
-      while (x2 >= 4096) {
-          n += 12;
-          x2 /= 4096;
-      }
-      while (x2 >= 2) {
-          n += 1;
-          x2 /= 2;
-      }
-      return n;
-  }
-};
-
-var toFixedShim = function toFixed(fractionDigits) {
-    var f, x, s, m, e, z, j, k;
-
-    // Test for NaN and round fractionDigits down
-    f = $Number(fractionDigits);
-    f = isActualNaN(f) ? 0 : Math.floor(f);
-
-    if (f < 0 || f > 20) {
-        throw new RangeError('Number.toFixed called with invalid number of decimals');
-    }
-
-    x = $Number(this);
-
-    if (isActualNaN(x)) {
-        return 'NaN';
-    }
-
-    // If it is too big or small, return the string value of the number
-    if (x <= -1e21 || x >= 1e21) {
-        return $String(x);
-    }
-
-    s = '';
-
-    if (x < 0) {
-        s = '-';
-        x = -x;
-    }
-
-    m = '0';
-
-    if (x > 1e-21) {
-        // 1e-21 < x < 1e21
-        // -70 < log2(x) < 70
-        e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;
-        z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1));
-        z *= 0x10000000000000; // Math.pow(2, 52);
-        e = 52 - e;
-
-        // -18 < e < 122
-        // x = z / 2 ^ e
-        if (e > 0) {
-            toFixedHelpers.multiply(0, z);
-            j = f;
-
-            while (j >= 7) {
-                toFixedHelpers.multiply(1e7, 0);
-                j -= 7;
-            }
-
-            toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);
-            j = e - 1;
-
-            while (j >= 23) {
-                toFixedHelpers.divide(1 << 23);
-                j -= 23;
-            }
-
-            toFixedHelpers.divide(1 << j);
-            toFixedHelpers.multiply(1, 1);
-            toFixedHelpers.divide(2);
-            m = toFixedHelpers.numToString();
-        } else {
-            toFixedHelpers.multiply(0, z);
-            toFixedHelpers.multiply(1 << (-e), 0);
-            m = toFixedHelpers.numToString() + strSlice('0.00000000000000000000', 2, 2 + f);
-        }
-    }
-
-    if (f > 0) {
-        k = m.length;
-
-        if (k <= f) {
-            m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m;
-        } else {
-            m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f);
-        }
-    } else {
-        m = s + m;
-    }
-
-    return m;
-};
-defineProperties(NumberPrototype, { toFixed: toFixedShim }, hasToFixedBugs);
-
-var hasToPrecisionUndefinedBug = (function () {
-    try {
-        return 1.0.toPrecision(undefined) === '1';
-    } catch (e) {
-        return true;
-    }
-}());
-var originalToPrecision = NumberPrototype.toPrecision;
-defineProperties(NumberPrototype, {
-    toPrecision: function toPrecision(precision) {
-        return typeof precision === 'undefined' ? originalToPrecision.call(this) : originalToPrecision.call(this, precision);
-    }
-}, hasToPrecisionUndefinedBug);
-
-//
-// String
-// ======
-//
-
-// ES5 15.5.4.14
-// http://es5.github.com/#x15.5.4.14
-
-// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]
-// Many browsers do not split properly with regular expressions or they
-// do not perform the split correctly under obscure conditions.
-// See http://blog.stevenlevithan.com/archives/cross-browser-split
-// I've tested in many browsers and this seems to cover the deviant ones:
-//    'ab'.split(/(?:ab)*/) should be ["", ""], not [""]
-//    '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""]
-//    'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not
-//       [undefined, "t", undefined, "e", ...]
-//    ''.split(/.?/) should be [], not [""]
-//    '.'.split(/()()/) should be ["."], not ["", "", "."]
-
-if (
-    'ab'.split(/(?:ab)*/).length !== 2 ||
-    '.'.split(/(.?)(.?)/).length !== 4 ||
-    'tesst'.split(/(s)*/)[1] === 't' ||
-    'test'.split(/(?:)/, -1).length !== 4 ||
-    ''.split(/.?/).length ||
-    '.'.split(/()()/).length > 1
-) {
-    (function () {
-        var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group
-        var maxSafe32BitInt = Math.pow(2, 32) - 1;
-
-        StringPrototype.split = function (separator, limit) {
-            var string = String(this);
-            if (typeof separator === 'undefined' && limit === 0) {
-                return [];
-            }
-
-            // If `separator` is not a regex, use native split
-            if (!isRegex(separator)) {
-                return strSplit(this, separator, limit);
-            }
-
-            var output = [];
-            var flags = (separator.ignoreCase ? 'i' : '') +
-                        (separator.multiline ? 'm' : '') +
-                        (separator.unicode ? 'u' : '') + // in ES6
-                        (separator.sticky ? 'y' : ''), // Firefox 3+ and ES6
-                lastLastIndex = 0,
-                // Make `global` and avoid `lastIndex` issues by working with a copy
-                separator2, match, lastIndex, lastLength;
-            var separatorCopy = new RegExp(separator.source, flags + 'g');
-            if (!compliantExecNpcg) {
-                // Doesn't need flags gy, but they don't hurt
-                separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);
-            }
-            /* Values for `limit`, per the spec:
-             * If undefined: 4294967295 // maxSafe32BitInt
-             * If 0, Infinity, or NaN: 0
-             * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
-             * If negative number: 4294967296 - Math.floor(Math.abs(limit))
-             * If other: Type-convert, then use the above rules
-             */
-            var splitLimit = typeof limit === 'undefined' ? maxSafe32BitInt : ES.ToUint32(limit);
-            match = separatorCopy.exec(string);
-            while (match) {
-                // `separatorCopy.lastIndex` is not reliable cross-browser
-                lastIndex = match.index + match[0].length;
-                if (lastIndex > lastLastIndex) {
-                    pushCall(output, strSlice(string, lastLastIndex, match.index));
-                    // Fix browsers whose `exec` methods don't consistently return `undefined` for
-                    // nonparticipating capturing groups
-                    if (!compliantExecNpcg && match.length > 1) {
-                        /* eslint-disable no-loop-func */
-                        match[0].replace(separator2, function () {
-                            for (var i = 1; i < arguments.length - 2; i++) {
-                                if (typeof arguments[i] === 'undefined') {
-                                    match[i] = void 0;
-                                }
-                            }
-                        });
-                        /* eslint-enable no-loop-func */
-                    }
-                    if (match.length > 1 && match.index < string.length) {
-                        array_push.apply(output, arraySlice(match, 1));
-                    }
-                    lastLength = match[0].length;
-                    lastLastIndex = lastIndex;
-                    if (output.length >= splitLimit) {
-                        break;
-                    }
-                }
-                if (separatorCopy.lastIndex === match.index) {
-                    separatorCopy.lastIndex++; // Avoid an infinite loop
-                }
-                match = separatorCopy.exec(string);
-            }
-            if (lastLastIndex === string.length) {
-                if (lastLength || !separatorCopy.test('')) {
-                    pushCall(output, '');
-                }
-            } else {
-                pushCall(output, strSlice(string, lastLastIndex));
-            }
-            return output.length > splitLimit ? arraySlice(output, 0, splitLimit) : output;
-        };
-    }());
-
-// [bugfix, chrome]
-// If separator is undefined, then the result array contains just one String,
-// which is the this value (converted to a String). If limit is not undefined,
-// then the output array is truncated so that it contains no more than limit
-// elements.
-// "0".split(undefined, 0) -> []
-} else if ('0'.split(void 0, 0).length) {
-    StringPrototype.split = function split(separator, limit) {
-        if (typeof separator === 'undefined' && limit === 0) { return []; }
-        return strSplit(this, separator, limit);
-    };
-}
-
-var str_replace = StringPrototype.replace;
-var replaceReportsGroupsCorrectly = (function () {
-    var groups = [];
-    'x'.replace(/x(.)?/g, function (match, group) {
-        pushCall(groups, group);
-    });
-    return groups.length === 1 && typeof groups[0] === 'undefined';
-}());
-
-if (!replaceReportsGroupsCorrectly) {
-    StringPrototype.replace = function replace(searchValue, replaceValue) {
-        var isFn = isCallable(replaceValue);
-        var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source);
-        if (!isFn || !hasCapturingGroups) {
-            return str_replace.call(this, searchValue, replaceValue);
-        } else {
-            var wrappedReplaceValue = function (match) {
-                var length = arguments.length;
-                var originalLastIndex = searchValue.lastIndex;
-                searchValue.lastIndex = 0;
-                var args = searchValue.exec(match) || [];
-                searchValue.lastIndex = originalLastIndex;
-                pushCall(args, arguments[length - 2], arguments[length - 1]);
-                return replaceValue.apply(this, args);
-            };
-            return str_replace.call(this, searchValue, wrappedReplaceValue);
-        }
-    };
-}
-
-// ECMA-262, 3rd B.2.3
-// Not an ECMAScript standard, although ECMAScript 3rd Edition has a
-// non-normative section suggesting uniform semantics and it should be
-// normalized across all browsers
-// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE
-var string_substr = StringPrototype.substr;
-var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b';
-defineProperties(StringPrototype, {
-    substr: function substr(start, length) {
-        var normalizedStart = start;
-        if (start < 0) {
-            normalizedStart = max(this.length + start, 0);
-        }
-        return string_substr.call(this, normalizedStart, length);
-    }
-}, hasNegativeSubstrBug);
-
-// ES5 15.5.4.20
-// whitespace from: http://es5.github.io/#x15.5.4.20
-var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' +
-    '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' +
-    '\u2029\uFEFF';
-var zeroWidth = '\u200b';
-var wsRegexChars = '[' + ws + ']';
-var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*');
-var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$');
-var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim());
-defineProperties(StringPrototype, {
-    // http://blog.stevenlevithan.com/archives/faster-trim-javascript
-    // http://perfectionkills.com/whitespace-deviations/
-    trim: function trim() {
-        if (typeof this === 'undefined' || this === null) {
-            throw new TypeError("can't convert " + this + ' to object');
-        }
-        return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, '');
-    }
-}, hasTrimWhitespaceBug);
-var trim = call.bind(String.prototype.trim);
-
-var hasLastIndexBug = StringPrototype.lastIndexOf && 'abcあい'.lastIndexOf('あい', 2) !== -1;
-defineProperties(StringPrototype, {
-    lastIndexOf: function lastIndexOf(searchString) {
-        if (typeof this === 'undefined' || this === null) {
-            throw new TypeError("can't convert " + this + ' to object');
-        }
-        var S = $String(this);
-        var searchStr = $String(searchString);
-        var numPos = arguments.length > 1 ? $Number(arguments[1]) : NaN;
-        var pos = isActualNaN(numPos) ? Infinity : ES.ToInteger(numPos);
-        var start = min(max(pos, 0), S.length);
-        var searchLen = searchStr.length;
-        var k = start + searchLen;
-        while (k > 0) {
-            k = max(0, k - searchLen);
-            var index = strIndexOf(strSlice(S, k, start + searchLen), searchStr);
-            if (index !== -1) {
-                return k + index;
-            }
-        }
-        return -1;
-    }
-}, hasLastIndexBug);
-
-var originalLastIndexOf = StringPrototype.lastIndexOf;
-defineProperties(StringPrototype, {
-    lastIndexOf: function lastIndexOf(searchString) {
-        return originalLastIndexOf.apply(this, arguments);
-    }
-}, StringPrototype.lastIndexOf.length !== 1);
-
-// ES-5 15.1.2.2
-/* eslint-disable radix */
-if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) {
-/* eslint-enable radix */
-    /* global parseInt: true */
-    parseInt = (function (origParseInt) {
-        var hexRegex = /^[\-+]?0[xX]/;
-        return function parseInt(str, radix) {
-            var string = trim(str);
-            var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10);
-            return origParseInt(string, defaultedRadix);
-        };
-    }(parseInt));
-}
-
-// https://es5.github.io/#x15.1.2.3
-if (1 / parseFloat('-0') !== -Infinity) {
-    /* global parseFloat: true */
-    parseFloat = (function (origParseFloat) {
-        return function parseFloat(string) {
-            var inputString = trim(string);
-            var result = origParseFloat(inputString);
-            return result === 0 && strSlice(inputString, 0, 1) === '-' ? -0 : result;
-        };
-    }(parseFloat));
-}
-
-if (String(new RangeError('test')) !== 'RangeError: test') {
-    var errorToStringShim = function toString() {
-        if (typeof this === 'undefined' || this === null) {
-            throw new TypeError("can't convert " + this + ' to object');
-        }
-        var name = this.name;
-        if (typeof name === 'undefined') {
-            name = 'Error';
-        } else if (typeof name !== 'string') {
-            name = $String(name);
-        }
-        var msg = this.message;
-        if (typeof msg === 'undefined') {
-            msg = '';
-        } else if (typeof msg !== 'string') {
-            msg = $String(msg);
-        }
-        if (!name) {
-            return msg;
-        }
-        if (!msg) {
-            return name;
-        }
-        return name + ': ' + msg;
-    };
-    // can't use defineProperties here because of toString enumeration issue in IE <= 8
-    Error.prototype.toString = errorToStringShim;
-}
-
-if (supportsDescriptors) {
-    var ensureNonEnumerable = function (obj, prop) {
-        if (isEnum(obj, prop)) {
-            var desc = Object.getOwnPropertyDescriptor(obj, prop);
-            if (desc.configurable) {
-              desc.enumerable = false;
-              Object.defineProperty(obj, prop, desc);
-            }
-        }
-    };
-    ensureNonEnumerable(Error.prototype, 'message');
-    if (Error.prototype.message !== '') {
-      Error.prototype.message = '';
-    }
-    ensureNonEnumerable(Error.prototype, 'name');
-}
-
-if (String(/a/mig) !== '/a/gim') {
-    var regexToString = function toString() {
-        var str = '/' + this.source + '/';
-        if (this.global) {
-            str += 'g';
-        }
-        if (this.ignoreCase) {
-            str += 'i';
-        }
-        if (this.multiline) {
-            str += 'm';
-        }
-        return str;
-    };
-    // can't use defineProperties here because of toString enumeration issue in IE <= 8
-    RegExp.prototype.toString = regexToString;
-}
-
-}));
diff --git a/resources/lib/jquery.ui/PATCHES b/resources/lib/jquery.ui/PATCHES
new file mode 100644 (file)
index 0000000..bcff2ac
--- /dev/null
@@ -0,0 +1,34 @@
+jquery.ui.core.js
+* I7ffbfd2e5 Avoid deprecated jQuery.expr[":"].
+
+
+jquery.ui.draggable.js
+* 71e11de2a3 Fix positioning error with draggable, revert and grid.
+             https://phabricator.wikimedia.org/T140965#2944610
+
+             https://bugs.jqueryui.com/ticket/4696
+
+
+jquery.ui.datepicker
+* 19531f3c23 Add translations in de-AT and de-CH
+
+
+jquery.ui.widget.js
+* I7ffbfd2e5 Avoid deprecated jQuery.expr[":"].
+
+
+themes/smoothness/jquery.ui.theme.css
+* 5e772e39dd Remove dark color from links inside dialogs
+             https://phabricator.wikimedia.org/T85857
+
+             Removed ".ui-widget-content a { color: #222222; }"
+             and ".ui-widget-header a { color: #222222; }"
+
+
+themes/smoothness/jquery.ui.core.css:
+* dc1c29f204 Collapse border in ui-helper-clearfix
+             https://phabricator.wikimedia.org/T73601
+
+             Backport of upstream change released in jQuery UI v1.10.1
+             - http://bugs.jqueryui.com/ticket/8442
+             - https://github.com/jquery/jquery-ui/commit/cb42ee7ccd
index 4ef4b76..19f0069 100644 (file)
@@ -157,7 +157,7 @@ function visible( element ) {
                }).length;
 }
 
-$.extend( $.expr[ ":" ], {
+$.extend( $.expr.pseudos, {
        data: $.expr.createPseudo ?
                $.expr.createPseudo(function( dataName ) {
                        return function( elem ) {
index 067476d..4d84afc 100644 (file)
@@ -36,7 +36,7 @@ $.widget = function( name, base, prototype ) {
        }
 
        // create selector for plugin
-       $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
+       $.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) {
                return !!$.data( elem, fullName );
        };
 
diff --git a/resources/lib/jquery.ui/themes/smoothness/PATCHES b/resources/lib/jquery.ui/themes/smoothness/PATCHES
deleted file mode 100644 (file)
index 53fbe1f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-jquery.ui.theme.css
-* Removed ".ui-widget-content a { color: #222222; }" and
-  ".ui-widget-header a { color: #222222; }" due to bug T85857.
diff --git a/resources/lib/jquery/jquery.migrate.js b/resources/lib/jquery/jquery.migrate.js
new file mode 100644 (file)
index 0000000..05b1a80
--- /dev/null
@@ -0,0 +1,540 @@
+/*!
+ * jQuery Migrate - v3.0.0 - 2016-06-09
+ * Copyright jQuery Foundation and other contributors
+ */
+(function( jQuery, window ) {
+"use strict";
+
+
+jQuery.migrateVersion = "3.0.0";
+
+
+( function() {
+
+       // Support: IE9 only
+       // IE9 only creates console object when dev tools are first opened
+       // Also, avoid Function#bind here to simplify PhantomJS usage
+       var log = window.console && window.console.log &&
+                       function() { window.console.log.apply( window.console, arguments ); },
+               rbadVersions = /^[12]\./;
+
+       if ( !log ) {
+               return;
+       }
+
+       // Need jQuery 3.0.0+ and no older Migrate loaded
+       if ( !jQuery || rbadVersions.test( jQuery.fn.jquery ) ) {
+               log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" );
+       }
+       if ( jQuery.migrateWarnings ) {
+               log( "JQMIGRATE: Migrate plugin loaded multiple times" );
+       }
+
+       // Show a message on the console so devs know we're active
+       log( "JQMIGRATE: Migrate is installed" +
+               ( jQuery.migrateMute ? "" : " with logging active" ) +
+               ", version " + jQuery.migrateVersion );
+
+} )();
+
+var warnedAbout = {};
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+       jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+       warnedAbout = {};
+       jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( msg ) {
+       var console = window.console;
+       if ( !warnedAbout[ msg ] ) {
+               warnedAbout[ msg ] = true;
+               jQuery.migrateWarnings.push( msg );
+               if ( console && console.warn && !jQuery.migrateMute ) {
+                       console.warn( "JQMIGRATE: " + msg );
+                       if ( jQuery.migrateTrace && console.trace ) {
+                               console.trace();
+                       }
+               }
+       }
+}
+
+function migrateWarnProp( obj, prop, value, msg ) {
+       Object.defineProperty( obj, prop, {
+               configurable: true,
+               enumerable: true,
+               get: function() {
+                       migrateWarn( msg );
+                       return value;
+               }
+       } );
+}
+
+if ( document.compatMode === "BackCompat" ) {
+
+       // JQuery has never supported or tested Quirks Mode
+       migrateWarn( "jQuery is not compatible with Quirks Mode" );
+}
+
+
+var oldInit = jQuery.fn.init,
+       oldIsNumeric = jQuery.isNumeric,
+       oldFind = jQuery.find,
+       rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
+       rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g;
+
+jQuery.fn.init = function( arg1 ) {
+       var args = Array.prototype.slice.call( arguments );
+
+       if ( typeof arg1 === "string" && arg1 === "#" ) {
+
+               // JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0
+               migrateWarn( "jQuery( '#' ) is not a valid selector" );
+               args[ 0 ] = [];
+       }
+
+       return oldInit.apply( this, args );
+};
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.find = function( selector ) {
+       var args = Array.prototype.slice.call( arguments );
+
+       // Support: PhantomJS 1.x
+       // String#match fails to match when used with a //g RegExp, only on some strings
+       if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
+
+               // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
+               // First see if qS thinks it's a valid selector, if so avoid a false positive
+               try {
+                       document.querySelector( selector );
+               } catch ( err1 ) {
+
+                       // Didn't *look* valid to qSA, warn and try quoting what we think is the value
+                       selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) {
+                               return "[" + attr + op + "\"" + value + "\"]";
+                       } );
+
+                       // If the regexp *may* have created an invalid selector, don't update it
+                       // Note that there may be false alarms if selector uses jQuery extensions
+                       try {
+                               document.querySelector( selector );
+                               migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] );
+                               args[ 0 ] = selector;
+                       } catch ( err2 ) {
+                               migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] );
+                       }
+               }
+       }
+
+       return oldFind.apply( this, args );
+};
+
+// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
+var findProp;
+for ( findProp in oldFind ) {
+       if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
+               jQuery.find[ findProp ] = oldFind[ findProp ];
+       }
+}
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+       migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" );
+       return this.length;
+};
+
+jQuery.parseJSON = function() {
+       migrateWarn( "jQuery.parseJSON is deprecated; use JSON.parse" );
+       return JSON.parse.apply( null, arguments );
+};
+
+jQuery.isNumeric = function( val ) {
+
+       // The jQuery 2.2.3 implementation of isNumeric
+       function isNumeric2( obj ) {
+               var realStringObj = obj && obj.toString();
+               return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
+       }
+
+       var newValue = oldIsNumeric( val ),
+               oldValue = isNumeric2( val );
+
+       if ( newValue !== oldValue ) {
+               migrateWarn( "jQuery.isNumeric() should not be called on constructed objects" );
+       }
+
+       return oldValue;
+};
+
+migrateWarnProp( jQuery, "unique", jQuery.uniqueSort,
+       "jQuery.unique is deprecated, use jQuery.uniqueSort" );
+
+// Now jQuery.expr.pseudos is the standard incantation
+migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos,
+       "jQuery.expr.filters is now jQuery.expr.pseudos" );
+migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos,
+       "jQuery.expr[\":\"] is now jQuery.expr.pseudos" );
+
+
+var oldAjax = jQuery.ajax;
+
+jQuery.ajax = function( ) {
+       var jQXHR = oldAjax.apply( this, arguments );
+
+       // Be sure we got a jQXHR (e.g., not sync)
+       if ( jQXHR.promise ) {
+               migrateWarnProp( jQXHR, "success", jQXHR.done,
+                       "jQXHR.success is deprecated and removed" );
+               migrateWarnProp( jQXHR, "error", jQXHR.fail,
+                       "jQXHR.error is deprecated and removed" );
+               migrateWarnProp( jQXHR, "complete", jQXHR.always,
+                       "jQXHR.complete is deprecated and removed" );
+       }
+
+       return jQXHR;
+};
+
+
+var oldRemoveAttr = jQuery.fn.removeAttr,
+       oldToggleClass = jQuery.fn.toggleClass,
+       rmatchNonSpace = /\S+/g;
+
+jQuery.fn.removeAttr = function( name ) {
+       var self = this;
+
+       jQuery.each( name.match( rmatchNonSpace ), function( i, attr ) {
+               if ( jQuery.expr.match.bool.test( attr ) ) {
+                       migrateWarn( "jQuery.fn.removeAttr no longer sets boolean properties: " + attr );
+                       self.prop( attr, false );
+               }
+       } );
+
+       return oldRemoveAttr.apply( this, arguments );
+};
+
+jQuery.fn.toggleClass = function( state ) {
+
+       // Only deprecating no-args or single boolean arg
+       if ( state !== undefined && typeof state !== "boolean" ) {
+               return oldToggleClass.apply( this, arguments );
+       }
+
+       migrateWarn( "jQuery.fn.toggleClass( boolean ) is deprecated" );
+
+       // Toggle entire class name of each element
+       return this.each( function() {
+               var className = this.getAttribute && this.getAttribute( "class" ) || "";
+
+               if ( className ) {
+                       jQuery.data( this, "__className__", className );
+               }
+
+               // If the element has a class name or if we're passed `false`,
+               // then remove the whole classname (if there was one, the above saved it).
+               // Otherwise bring back whatever was previously saved (if anything),
+               // falling back to the empty string if nothing was stored.
+               if ( this.setAttribute ) {
+                       this.setAttribute( "class",
+                               className || state === false ?
+                               "" :
+                               jQuery.data( this, "__className__" ) || ""
+                       );
+               }
+       } );
+};
+
+
+var internalSwapCall = false;
+
+// If this version of jQuery has .swap(), don't false-alarm on internal uses
+if ( jQuery.swap ) {
+       jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
+               var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
+
+               if ( oldHook ) {
+                       jQuery.cssHooks[ name ].get = function() {
+                               var ret;
+
+                               internalSwapCall = true;
+                               ret = oldHook.apply( this, arguments );
+                               internalSwapCall = false;
+                               return ret;
+                       };
+               }
+       } );
+}
+
+jQuery.swap = function( elem, options, callback, args ) {
+       var ret, name,
+               old = {};
+
+       if ( !internalSwapCall ) {
+               migrateWarn( "jQuery.swap() is undocumented and deprecated" );
+       }
+
+       // Remember the old values, and insert the new ones
+       for ( name in options ) {
+               old[ name ] = elem.style[ name ];
+               elem.style[ name ] = options[ name ];
+       }
+
+       ret = callback.apply( elem, args || [] );
+
+       // Revert the old values
+       for ( name in options ) {
+               elem.style[ name ] = old[ name ];
+       }
+
+       return ret;
+};
+
+var oldData = jQuery.data;
+
+jQuery.data = function( elem, name, value ) {
+       var curData;
+
+       // If the name is transformed, look for the un-transformed name in the data object
+       if ( name && name !== jQuery.camelCase( name ) ) {
+               curData = jQuery.hasData( elem ) && oldData.call( this, elem );
+               if ( curData && name in curData ) {
+                       migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name );
+                       if ( arguments.length > 2 ) {
+                               curData[ name ] = value;
+                       }
+                       return curData[ name ];
+               }
+       }
+
+       return oldData.apply( this, arguments );
+};
+
+var oldTweenRun = jQuery.Tween.prototype.run;
+
+jQuery.Tween.prototype.run = function( percent ) {
+       if ( jQuery.easing[ this.easing ].length > 1 ) {
+               migrateWarn(
+                       "easing function " +
+                       "\"jQuery.easing." + this.easing.toString() +
+                       "\" should use only first argument"
+               );
+
+               jQuery.easing[ this.easing ] = jQuery.easing[ this.easing ].bind(
+                       jQuery.easing,
+                       percent, this.options.duration * percent, 0, 1, this.options.duration
+               );
+       }
+
+       oldTweenRun.apply( this, arguments );
+};
+
+var oldLoad = jQuery.fn.load,
+       originalFix = jQuery.event.fix;
+
+jQuery.event.props = [];
+jQuery.event.fixHooks = {};
+
+jQuery.event.fix = function( originalEvent ) {
+       var event,
+               type = originalEvent.type,
+               fixHook = this.fixHooks[ type ],
+               props = jQuery.event.props;
+
+       if ( props.length ) {
+               migrateWarn( "jQuery.event.props are deprecated and removed: " + props.join() );
+               while ( props.length ) {
+                       jQuery.event.addProp( props.pop() );
+               }
+       }
+
+       if ( fixHook && !fixHook._migrated_ ) {
+               fixHook._migrated_ = true;
+               migrateWarn( "jQuery.event.fixHooks are deprecated and removed: " + type );
+               if ( ( props = fixHook.props ) && props.length ) {
+                       while ( props.length ) {
+                          jQuery.event.addProp( props.pop() );
+                       }
+               }
+       }
+
+       event = originalFix.call( this, originalEvent );
+
+       return fixHook && fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+};
+
+jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
+
+       jQuery.fn[ name ] = function() {
+               var args = Array.prototype.slice.call( arguments, 0 );
+
+               // If this is an ajax load() the first arg should be the string URL;
+               // technically this could also be the "Anything" arg of the event .load()
+               // which just goes to show why this dumb signature has been deprecated!
+               // jQuery custom builds that exclude the Ajax module justifiably die here.
+               if ( name === "load" && typeof args[ 0 ] === "string" ) {
+                       return oldLoad.apply( this, args );
+               }
+
+               migrateWarn( "jQuery.fn." + name + "() is deprecated" );
+
+               args.splice( 0, 0, name );
+               if ( arguments.length ) {
+                       return this.on.apply( this, args );
+               }
+
+               // Use .triggerHandler here because:
+               // - load and unload events don't need to bubble, only applied to window or image
+               // - error event should not bubble to window, although it does pre-1.7
+               // See http://bugs.jquery.com/ticket/11820
+               this.triggerHandler.apply( this, args );
+               return this;
+       };
+
+} );
+
+// Trigger "ready" event only once, on document ready
+jQuery( function() {
+       jQuery( document ).triggerHandler( "ready" );
+} );
+
+jQuery.event.special.ready = {
+       setup: function() {
+               if ( this === document ) {
+                       migrateWarn( "'ready' event is deprecated" );
+               }
+       }
+};
+
+jQuery.fn.extend( {
+
+       bind: function( types, data, fn ) {
+               migrateWarn( "jQuery.fn.bind() is deprecated" );
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               migrateWarn( "jQuery.fn.unbind() is deprecated" );
+               return this.off( types, null, fn );
+       },
+       delegate: function( selector, types, data, fn ) {
+               migrateWarn( "jQuery.fn.delegate() is deprecated" );
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+               migrateWarn( "jQuery.fn.undelegate() is deprecated" );
+               return arguments.length === 1 ?
+                       this.off( selector, "**" ) :
+                       this.off( types, selector || "**", fn );
+       }
+} );
+
+
+var oldOffset = jQuery.fn.offset;
+
+jQuery.fn.offset = function() {
+       var docElem,
+               elem = this[ 0 ],
+               origin = { top: 0, left: 0 };
+
+       if ( !elem || !elem.nodeType ) {
+               migrateWarn( "jQuery.fn.offset() requires a valid DOM element" );
+               return origin;
+       }
+
+       docElem = ( elem.ownerDocument || document ).documentElement;
+       if ( !jQuery.contains( docElem, elem ) ) {
+               migrateWarn( "jQuery.fn.offset() requires an element connected to a document" );
+               return origin;
+       }
+
+       return oldOffset.apply( this, arguments );
+};
+
+
+var oldParam = jQuery.param;
+
+jQuery.param = function( data, traditional ) {
+       var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+
+       if ( traditional === undefined && ajaxTraditional ) {
+
+               migrateWarn( "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" );
+               traditional = ajaxTraditional;
+       }
+
+       return oldParam.call( this, data, traditional );
+};
+
+var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
+
+jQuery.fn.andSelf = function() {
+       migrateWarn( "jQuery.fn.andSelf() replaced by jQuery.fn.addBack()" );
+       return oldSelf.apply( this, arguments );
+};
+
+
+var oldDeferred = jQuery.Deferred,
+       tuples = [
+
+               // Action, add listener, callbacks, .then handlers, final state
+               [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+                       jQuery.Callbacks( "once memory" ), "resolved" ],
+               [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+                       jQuery.Callbacks( "once memory" ), "rejected" ],
+               [ "notify", "progress", jQuery.Callbacks( "memory" ),
+                       jQuery.Callbacks( "memory" ) ]
+       ];
+
+jQuery.Deferred = function( func ) {
+       var deferred = oldDeferred(),
+               promise = deferred.promise();
+
+       deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
+               var fns = arguments;
+
+               migrateWarn( "deferred.pipe() is deprecated" );
+
+               return jQuery.Deferred( function( newDefer ) {
+                       jQuery.each( tuples, function( i, tuple ) {
+                               var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+
+                               // Deferred.done(function() { bind to newDefer or newDefer.resolve })
+                               // deferred.fail(function() { bind to newDefer or newDefer.reject })
+                               // deferred.progress(function() { bind to newDefer or newDefer.notify })
+                               deferred[ tuple[ 1 ] ]( function() {
+                                       var returned = fn && fn.apply( this, arguments );
+                                       if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                               returned.promise()
+                                                       .done( newDefer.resolve )
+                                                       .fail( newDefer.reject )
+                                                       .progress( newDefer.notify );
+                                       } else {
+                                               newDefer[ tuple[ 0 ] + "With" ](
+                                                       this === promise ? newDefer.promise() : this,
+                                                       fn ? [ returned ] : arguments
+                                               );
+                                       }
+                               } );
+                       } );
+                       fns = null;
+               } ).promise();
+
+       };
+
+       if ( func ) {
+               func.call( deferred, deferred );
+       }
+
+       return deferred;
+};
+
+
+
+})( jQuery, window );
diff --git a/resources/lib/jquery/jquery3.js b/resources/lib/jquery/jquery3.js
new file mode 100644 (file)
index 0000000..d2d8ca4
--- /dev/null
@@ -0,0 +1,10253 @@
+/*!
+ * jQuery JavaScript Library v3.2.1
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2017-03-20T18:59Z
+ */
+( function( global, factory ) {
+
+       "use strict";
+
+       if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+               // For CommonJS and CommonJS-like environments where a proper `window`
+               // is present, execute the factory and get jQuery.
+               // For environments that do not have a `window` with a `document`
+               // (such as Node.js), expose a factory as module.exports.
+               // This accentuates the need for the creation of a real `window`.
+               // e.g. var jQuery = require("jquery")(window);
+               // See ticket #14549 for more info.
+               module.exports = global.document ?
+                       factory( global, true ) :
+                       function( w ) {
+                               if ( !w.document ) {
+                                       throw new Error( "jQuery requires a window with a document" );
+                               }
+                               return factory( w );
+                       };
+       } else {
+               factory( global );
+       }
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var document = window.document;
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+
+
+       function DOMEval( code, doc ) {
+               doc = doc || document;
+
+               var script = doc.createElement( "script" );
+
+               script.text = code;
+               doc.head.appendChild( script ).parentNode.removeChild( script );
+       }
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+       version = "3.2.1",
+
+       // Define a local copy of jQuery
+       jQuery = function( selector, context ) {
+
+               // The jQuery object is actually just the init constructor 'enhanced'
+               // Need init if jQuery is called (just allow error to be thrown if not included)
+               return new jQuery.fn.init( selector, context );
+       },
+
+       // Support: Android <=4.0 only
+       // Make sure we trim BOM and NBSP
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+       // Matches dashed string for camelizing
+       rmsPrefix = /^-ms-/,
+       rdashAlpha = /-([a-z])/g,
+
+       // Used by jQuery.camelCase as callback to replace()
+       fcamelCase = function( all, letter ) {
+               return letter.toUpperCase();
+       };
+
+jQuery.fn = jQuery.prototype = {
+
+       // The current version of jQuery being used
+       jquery: version,
+
+       constructor: jQuery,
+
+       // The default length of a jQuery object is 0
+       length: 0,
+
+       toArray: function() {
+               return slice.call( this );
+       },
+
+       // Get the Nth element in the matched element set OR
+       // Get the whole matched element set as a clean array
+       get: function( num ) {
+
+               // Return all the elements in a clean array
+               if ( num == null ) {
+                       return slice.call( this );
+               }
+
+               // Return just the one element from the set
+               return num < 0 ? this[ num + this.length ] : this[ num ];
+       },
+
+       // Take an array of elements and push it onto the stack
+       // (returning the new matched element set)
+       pushStack: function( elems ) {
+
+               // Build a new jQuery matched element set
+               var ret = jQuery.merge( this.constructor(), elems );
+
+               // Add the old object onto the stack (as a reference)
+               ret.prevObject = this;
+
+               // Return the newly-formed element set
+               return ret;
+       },
+
+       // Execute a callback for every element in the matched set.
+       each: function( callback ) {
+               return jQuery.each( this, callback );
+       },
+
+       map: function( callback ) {
+               return this.pushStack( jQuery.map( this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               } ) );
+       },
+
+       slice: function() {
+               return this.pushStack( slice.apply( this, arguments ) );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
+       },
+
+       eq: function( i ) {
+               var len = this.length,
+                       j = +i + ( i < 0 ? len : 0 );
+               return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+       },
+
+       end: function() {
+               return this.prevObject || this.constructor();
+       },
+
+       // For internal use only.
+       // Behaves like an Array's method, not like a jQuery method.
+       push: push,
+       sort: arr.sort,
+       splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+       var options, name, src, copy, copyIsArray, clone,
+               target = arguments[ 0 ] || {},
+               i = 1,
+               length = arguments.length,
+               deep = false;
+
+       // Handle a deep copy situation
+       if ( typeof target === "boolean" ) {
+               deep = target;
+
+               // Skip the boolean and the target
+               target = arguments[ i ] || {};
+               i++;
+       }
+
+       // Handle case when target is a string or something (possible in deep copy)
+       if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+               target = {};
+       }
+
+       // Extend jQuery itself if only one argument is passed
+       if ( i === length ) {
+               target = this;
+               i--;
+       }
+
+       for ( ; i < length; i++ ) {
+
+               // Only deal with non-null/undefined values
+               if ( ( options = arguments[ i ] ) != null ) {
+
+                       // Extend the base object
+                       for ( name in options ) {
+                               src = target[ name ];
+                               copy = options[ name ];
+
+                               // Prevent never-ending loop
+                               if ( target === copy ) {
+                                       continue;
+                               }
+
+                               // Recurse if we're merging plain objects or arrays
+                               if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+                                       ( copyIsArray = Array.isArray( copy ) ) ) ) {
+
+                                       if ( copyIsArray ) {
+                                               copyIsArray = false;
+                                               clone = src && Array.isArray( src ) ? src : [];
+
+                                       } else {
+                                               clone = src && jQuery.isPlainObject( src ) ? src : {};
+                                       }
+
+                                       // Never move original objects, clone them
+                                       target[ name ] = jQuery.extend( deep, clone, copy );
+
+                               // Don't bring in undefined values
+                               } else if ( copy !== undefined ) {
+                                       target[ name ] = copy;
+                               }
+                       }
+               }
+       }
+
+       // Return the modified object
+       return target;
+};
+
+jQuery.extend( {
+
+       // Unique for each copy of jQuery on the page
+       expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+       // Assume jQuery is ready without the ready module
+       isReady: true,
+
+       error: function( msg ) {
+               throw new Error( msg );
+       },
+
+       noop: function() {},
+
+       isFunction: function( obj ) {
+               return jQuery.type( obj ) === "function";
+       },
+
+       isWindow: function( obj ) {
+               return obj != null && obj === obj.window;
+       },
+
+       isNumeric: function( obj ) {
+
+               // As of jQuery 3.0, isNumeric is limited to
+               // strings and numbers (primitives or objects)
+               // that can be coerced to finite numbers (gh-2662)
+               var type = jQuery.type( obj );
+               return ( type === "number" || type === "string" ) &&
+
+                       // parseFloat NaNs numeric-cast false positives ("")
+                       // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+                       // subtraction forces infinities to NaN
+                       !isNaN( obj - parseFloat( obj ) );
+       },
+
+       isPlainObject: function( obj ) {
+               var proto, Ctor;
+
+               // Detect obvious negatives
+               // Use toString instead of jQuery.type to catch host objects
+               if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+                       return false;
+               }
+
+               proto = getProto( obj );
+
+               // Objects with no prototype (e.g., `Object.create( null )`) are plain
+               if ( !proto ) {
+                       return true;
+               }
+
+               // Objects with prototype are plain iff they were constructed by a global Object function
+               Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+               return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+       },
+
+       isEmptyObject: function( obj ) {
+
+               /* eslint-disable no-unused-vars */
+               // See https://github.com/eslint/eslint/issues/6125
+               var name;
+
+               for ( name in obj ) {
+                       return false;
+               }
+               return true;
+       },
+
+       type: function( obj ) {
+               if ( obj == null ) {
+                       return obj + "";
+               }
+
+               // Support: Android <=2.3 only (functionish RegExp)
+               return typeof obj === "object" || typeof obj === "function" ?
+                       class2type[ toString.call( obj ) ] || "object" :
+                       typeof obj;
+       },
+
+       // Evaluates a script in a global context
+       globalEval: function( code ) {
+               DOMEval( code );
+       },
+
+       // Convert dashed to camelCase; used by the css and data modules
+       // Support: IE <=9 - 11, Edge 12 - 13
+       // Microsoft forgot to hump their vendor prefix (#9572)
+       camelCase: function( string ) {
+               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+       },
+
+       each: function( obj, callback ) {
+               var length, i = 0;
+
+               if ( isArrayLike( obj ) ) {
+                       length = obj.length;
+                       for ( ; i < length; i++ ) {
+                               if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+                                       break;
+                               }
+                       }
+               } else {
+                       for ( i in obj ) {
+                               if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+                                       break;
+                               }
+                       }
+               }
+
+               return obj;
+       },
+
+       // Support: Android <=4.0 only
+       trim: function( text ) {
+               return text == null ?
+                       "" :
+                       ( text + "" ).replace( rtrim, "" );
+       },
+
+       // results is for internal usage only
+       makeArray: function( arr, results ) {
+               var ret = results || [];
+
+               if ( arr != null ) {
+                       if ( isArrayLike( Object( arr ) ) ) {
+                               jQuery.merge( ret,
+                                       typeof arr === "string" ?
+                                       [ arr ] : arr
+                               );
+                       } else {
+                               push.call( ret, arr );
+                       }
+               }
+
+               return ret;
+       },
+
+       inArray: function( elem, arr, i ) {
+               return arr == null ? -1 : indexOf.call( arr, elem, i );
+       },
+
+       // Support: Android <=4.0 only, PhantomJS 1 only
+       // push.apply(_, arraylike) throws on ancient WebKit
+       merge: function( first, second ) {
+               var len = +second.length,
+                       j = 0,
+                       i = first.length;
+
+               for ( ; j < len; j++ ) {
+                       first[ i++ ] = second[ j ];
+               }
+
+               first.length = i;
+
+               return first;
+       },
+
+       grep: function( elems, callback, invert ) {
+               var callbackInverse,
+                       matches = [],
+                       i = 0,
+                       length = elems.length,
+                       callbackExpect = !invert;
+
+               // Go through the array, only saving the items
+               // that pass the validator function
+               for ( ; i < length; i++ ) {
+                       callbackInverse = !callback( elems[ i ], i );
+                       if ( callbackInverse !== callbackExpect ) {
+                               matches.push( elems[ i ] );
+                       }
+               }
+
+               return matches;
+       },
+
+       // arg is for internal usage only
+       map: function( elems, callback, arg ) {
+               var length, value,
+                       i = 0,
+                       ret = [];
+
+               // Go through the array, translating each of the items to their new values
+               if ( isArrayLike( elems ) ) {
+                       length = elems.length;
+                       for ( ; i < length; i++ ) {
+                               value = callback( elems[ i ], i, arg );
+
+                               if ( value != null ) {
+                                       ret.push( value );
+                               }
+                       }
+
+               // Go through every key on the object,
+               } else {
+                       for ( i in elems ) {
+                               value = callback( elems[ i ], i, arg );
+
+                               if ( value != null ) {
+                                       ret.push( value );
+                               }
+                       }
+               }
+
+               // Flatten any nested arrays
+               return concat.apply( [], ret );
+       },
+
+       // A global GUID counter for objects
+       guid: 1,
+
+       // Bind a function to a context, optionally partially applying any
+       // arguments.
+       proxy: function( fn, context ) {
+               var tmp, args, proxy;
+
+               if ( typeof context === "string" ) {
+                       tmp = fn[ context ];
+                       context = fn;
+                       fn = tmp;
+               }
+
+               // Quick check to determine if target is callable, in the spec
+               // this throws a TypeError, but we will just return undefined.
+               if ( !jQuery.isFunction( fn ) ) {
+                       return undefined;
+               }
+
+               // Simulated bind
+               args = slice.call( arguments, 2 );
+               proxy = function() {
+                       return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+               };
+
+               // Set the guid of unique handler to the same of original handler, so it can be removed
+               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+               return proxy;
+       },
+
+       now: Date.now,
+
+       // jQuery.support is not used in Core but other projects attach their
+       // properties to it so it needs to exist.
+       support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+       jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+       // Support: real iOS 8.2 only (not reproducible in simulator)
+       // `in` check used to prevent JIT error (gh-2145)
+       // hasOwn isn't used here due to false negatives
+       // regarding Nodelist length in IE
+       var length = !!obj && "length" in obj && obj.length,
+               type = jQuery.type( obj );
+
+       if ( type === "function" || jQuery.isWindow( obj ) ) {
+               return false;
+       }
+
+       return type === "array" || length === 0 ||
+               typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.3
+ * https://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-08-08
+ */
+(function( window ) {
+
+var i,
+       support,
+       Expr,
+       getText,
+       isXML,
+       tokenize,
+       compile,
+       select,
+       outermostContext,
+       sortInput,
+       hasDuplicate,
+
+       // Local document vars
+       setDocument,
+       document,
+       docElem,
+       documentIsHTML,
+       rbuggyQSA,
+       rbuggyMatches,
+       matches,
+       contains,
+
+       // Instance-specific data
+       expando = "sizzle" + 1 * new Date(),
+       preferredDoc = window.document,
+       dirruns = 0,
+       done = 0,
+       classCache = createCache(),
+       tokenCache = createCache(),
+       compilerCache = createCache(),
+       sortOrder = function( a, b ) {
+               if ( a === b ) {
+                       hasDuplicate = true;
+               }
+               return 0;
+       },
+
+       // Instance methods
+       hasOwn = ({}).hasOwnProperty,
+       arr = [],
+       pop = arr.pop,
+       push_native = arr.push,
+       push = arr.push,
+       slice = arr.slice,
+       // Use a stripped-down indexOf as it's faster than native
+       // https://jsperf.com/thor-indexof-vs-for/5
+       indexOf = function( list, elem ) {
+               var i = 0,
+                       len = list.length;
+               for ( ; i < len; i++ ) {
+                       if ( list[i] === elem ) {
+                               return i;
+                       }
+               }
+               return -1;
+       },
+
+       booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+       // Regular expressions
+
+       // http://www.w3.org/TR/css3-selectors/#whitespace
+       whitespace = "[\\x20\\t\\r\\n\\f]",
+
+       // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+       identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+
+       // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+       attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+               // Operator (capture 2)
+               "*([*^$|!~]?=)" + whitespace +
+               // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+               "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+               "*\\]",
+
+       pseudos = ":(" + identifier + ")(?:\\((" +
+               // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+               // 1. quoted (capture 3; capture 4 or capture 5)
+               "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+               // 2. simple (capture 6)
+               "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+               // 3. anything else (capture 2)
+               ".*" +
+               ")\\)|)",
+
+       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+       rwhitespace = new RegExp( whitespace + "+", "g" ),
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+       rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+       rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+       rpseudo = new RegExp( pseudos ),
+       ridentifier = new RegExp( "^" + identifier + "$" ),
+
+       matchExpr = {
+               "ID": new RegExp( "^#(" + identifier + ")" ),
+               "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+               "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+               "ATTR": new RegExp( "^" + attributes ),
+               "PSEUDO": new RegExp( "^" + pseudos ),
+               "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+               "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+               // For use in libraries implementing .is()
+               // We use this for POS matching in `select`
+               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+                       whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+       },
+
+       rinputs = /^(?:input|select|textarea|button)$/i,
+       rheader = /^h\d$/i,
+
+       rnative = /^[^{]+\{\s*\[native \w/,
+
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors
+       rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+       rsibling = /[+~]/,
+
+       // CSS escapes
+       // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+       runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+       funescape = function( _, escaped, escapedWhitespace ) {
+               var high = "0x" + escaped - 0x10000;
+               // NaN means non-codepoint
+               // Support: Firefox<24
+               // Workaround erroneous numeric interpretation of +"0x"
+               return high !== high || escapedWhitespace ?
+                       escaped :
+                       high < 0 ?
+                               // BMP codepoint
+                               String.fromCharCode( high + 0x10000 ) :
+                               // Supplemental Plane codepoint (surrogate pair)
+                               String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+       },
+
+       // CSS string/identifier serialization
+       // https://drafts.csswg.org/cssom/#common-serializing-idioms
+       rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+       fcssescape = function( ch, asCodePoint ) {
+               if ( asCodePoint ) {
+
+                       // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+                       if ( ch === "\0" ) {
+                               return "\uFFFD";
+                       }
+
+                       // Control characters and (dependent upon position) numbers get escaped as code points
+                       return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+               }
+
+               // Other potentially-special ASCII characters get backslash-escaped
+               return "\\" + ch;
+       },
+
+       // Used for iframes
+       // See setDocument()
+       // Removing the function wrapper causes a "Permission Denied"
+       // error in IE
+       unloadHandler = function() {
+               setDocument();
+       },
+
+       disabledAncestor = addCombinator(
+               function( elem ) {
+                       return elem.disabled === true && ("form" in elem || "label" in elem);
+               },
+               { dir: "parentNode", next: "legend" }
+       );
+
+// Optimize for push.apply( _, NodeList )
+try {
+       push.apply(
+               (arr = slice.call( preferredDoc.childNodes )),
+               preferredDoc.childNodes
+       );
+       // Support: Android<4.0
+       // Detect silently failing push.apply
+       arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+       push = { apply: arr.length ?
+
+               // Leverage slice if possible
+               function( target, els ) {
+                       push_native.apply( target, slice.call(els) );
+               } :
+
+               // Support: IE<9
+               // Otherwise append directly
+               function( target, els ) {
+                       var j = target.length,
+                               i = 0;
+                       // Can't trust NodeList.length
+                       while ( (target[j++] = els[i++]) ) {}
+                       target.length = j - 1;
+               }
+       };
+}
+
+function Sizzle( selector, context, results, seed ) {
+       var m, i, elem, nid, match, groups, newSelector,
+               newContext = context && context.ownerDocument,
+
+               // nodeType defaults to 9, since context defaults to document
+               nodeType = context ? context.nodeType : 9;
+
+       results = results || [];
+
+       // Return early from calls with invalid selector or context
+       if ( typeof selector !== "string" || !selector ||
+               nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+               return results;
+       }
+
+       // Try to shortcut find operations (as opposed to filters) in HTML documents
+       if ( !seed ) {
+
+               if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+                       setDocument( context );
+               }
+               context = context || document;
+
+               if ( documentIsHTML ) {
+
+                       // If the selector is sufficiently simple, try using a "get*By*" DOM method
+                       // (excepting DocumentFragment context, where the methods don't exist)
+                       if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+                               // ID selector
+                               if ( (m = match[1]) ) {
+
+                                       // Document context
+                                       if ( nodeType === 9 ) {
+                                               if ( (elem = context.getElementById( m )) ) {
+
+                                                       // Support: IE, Opera, Webkit
+                                                       // TODO: identify versions
+                                                       // getElementById can match elements by name instead of ID
+                                                       if ( elem.id === m ) {
+                                                               results.push( elem );
+                                                               return results;
+                                                       }
+                                               } else {
+                                                       return results;
+                                               }
+
+                                       // Element context
+                                       } else {
+
+                                               // Support: IE, Opera, Webkit
+                                               // TODO: identify versions
+                                               // getElementById can match elements by name instead of ID
+                                               if ( newContext && (elem = newContext.getElementById( m )) &&
+                                                       contains( context, elem ) &&
+                                                       elem.id === m ) {
+
+                                                       results.push( elem );
+                                                       return results;
+                                               }
+                                       }
+
+                               // Type selector
+                               } else if ( match[2] ) {
+                                       push.apply( results, context.getElementsByTagName( selector ) );
+                                       return results;
+
+                               // Class selector
+                               } else if ( (m = match[3]) && support.getElementsByClassName &&
+                                       context.getElementsByClassName ) {
+
+                                       push.apply( results, context.getElementsByClassName( m ) );
+                                       return results;
+                               }
+                       }
+
+                       // Take advantage of querySelectorAll
+                       if ( support.qsa &&
+                               !compilerCache[ selector + " " ] &&
+                               (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+                               if ( nodeType !== 1 ) {
+                                       newContext = context;
+                                       newSelector = selector;
+
+                               // qSA looks outside Element context, which is not what we want
+                               // Thanks to Andrew Dupont for this workaround technique
+                               // Support: IE <=8
+                               // Exclude object elements
+                               } else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+                                       // Capture the context ID, setting it first if necessary
+                                       if ( (nid = context.getAttribute( "id" )) ) {
+                                               nid = nid.replace( rcssescape, fcssescape );
+                                       } else {
+                                               context.setAttribute( "id", (nid = expando) );
+                                       }
+
+                                       // Prefix every selector in the list
+                                       groups = tokenize( selector );
+                                       i = groups.length;
+                                       while ( i-- ) {
+                                               groups[i] = "#" + nid + " " + toSelector( groups[i] );
+                                       }
+                                       newSelector = groups.join( "," );
+
+                                       // Expand context for sibling selectors
+                                       newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+                                               context;
+                               }
+
+                               if ( newSelector ) {
+                                       try {
+                                               push.apply( results,
+                                                       newContext.querySelectorAll( newSelector )
+                                               );
+                                               return results;
+                                       } catch ( qsaError ) {
+                                       } finally {
+                                               if ( nid === expando ) {
+                                                       context.removeAttribute( "id" );
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       // All others
+       return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ *     property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *     deleting the oldest entry
+ */
+function createCache() {
+       var keys = [];
+
+       function cache( key, value ) {
+               // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+               if ( keys.push( key + " " ) > Expr.cacheLength ) {
+                       // Only keep the most recent entries
+                       delete cache[ keys.shift() ];
+               }
+               return (cache[ key + " " ] = value);
+       }
+       return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+       fn[ expando ] = true;
+       return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+       var el = document.createElement("fieldset");
+
+       try {
+               return !!fn( el );
+       } catch (e) {
+               return false;
+       } finally {
+               // Remove from its parent by default
+               if ( el.parentNode ) {
+                       el.parentNode.removeChild( el );
+               }
+               // release memory in IE
+               el = null;
+       }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+       var arr = attrs.split("|"),
+               i = arr.length;
+
+       while ( i-- ) {
+               Expr.attrHandle[ arr[i] ] = handler;
+       }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+       var cur = b && a,
+               diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+                       a.sourceIndex - b.sourceIndex;
+
+       // Use IE sourceIndex if available on both nodes
+       if ( diff ) {
+               return diff;
+       }
+
+       // Check if b follows a
+       if ( cur ) {
+               while ( (cur = cur.nextSibling) ) {
+                       if ( cur === b ) {
+                               return -1;
+                       }
+               }
+       }
+
+       return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return name === "input" && elem.type === type;
+       };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return (name === "input" || name === "button") && elem.type === type;
+       };
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+       // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+       return function( elem ) {
+
+               // Only certain elements can match :enabled or :disabled
+               // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+               // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+               if ( "form" in elem ) {
+
+                       // Check for inherited disabledness on relevant non-disabled elements:
+                       // * listed form-associated elements in a disabled fieldset
+                       //   https://html.spec.whatwg.org/multipage/forms.html#category-listed
+                       //   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+                       // * option elements in a disabled optgroup
+                       //   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+                       // All such elements have a "form" property.
+                       if ( elem.parentNode && elem.disabled === false ) {
+
+                               // Option elements defer to a parent optgroup if present
+                               if ( "label" in elem ) {
+                                       if ( "label" in elem.parentNode ) {
+                                               return elem.parentNode.disabled === disabled;
+                                       } else {
+                                               return elem.disabled === disabled;
+                                       }
+                               }
+
+                               // Support: IE 6 - 11
+                               // Use the isDisabled shortcut property to check for disabled fieldset ancestors
+                               return elem.isDisabled === disabled ||
+
+                                       // Where there is no isDisabled, check manually
+                                       /* jshint -W018 */
+                                       elem.isDisabled !== !disabled &&
+                                               disabledAncestor( elem ) === disabled;
+                       }
+
+                       return elem.disabled === disabled;
+
+               // Try to winnow out elements that can't be disabled before trusting the disabled property.
+               // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+               // even exist on them, let alone have a boolean value.
+               } else if ( "label" in elem ) {
+                       return elem.disabled === disabled;
+               }
+
+               // Remaining elements are neither :enabled nor :disabled
+               return false;
+       };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+       return markFunction(function( argument ) {
+               argument = +argument;
+               return markFunction(function( seed, matches ) {
+                       var j,
+                               matchIndexes = fn( [], seed.length, argument ),
+                               i = matchIndexes.length;
+
+                       // Match elements found at the specified indexes
+                       while ( i-- ) {
+                               if ( seed[ (j = matchIndexes[i]) ] ) {
+                                       seed[j] = !(matches[j] = seed[j]);
+                               }
+                       }
+               });
+       });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+       return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+       // documentElement is verified for cases where it doesn't yet exist
+       // (such as loading iframes in IE - #4833)
+       var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+       return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+       var hasCompare, subWindow,
+               doc = node ? node.ownerDocument || node : preferredDoc;
+
+       // Return early if doc is invalid or already selected
+       if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+               return document;
+       }
+
+       // Update global variables
+       document = doc;
+       docElem = document.documentElement;
+       documentIsHTML = !isXML( document );
+
+       // Support: IE 9-11, Edge
+       // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+       if ( preferredDoc !== document &&
+               (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
+
+               // Support: IE 11, Edge
+               if ( subWindow.addEventListener ) {
+                       subWindow.addEventListener( "unload", unloadHandler, false );
+
+               // Support: IE 9 - 10 only
+               } else if ( subWindow.attachEvent ) {
+                       subWindow.attachEvent( "onunload", unloadHandler );
+               }
+       }
+
+       /* Attributes
+       ---------------------------------------------------------------------- */
+
+       // Support: IE<8
+       // Verify that getAttribute really returns attributes and not properties
+       // (excepting IE8 booleans)
+       support.attributes = assert(function( el ) {
+               el.className = "i";
+               return !el.getAttribute("className");
+       });
+
+       /* getElement(s)By*
+       ---------------------------------------------------------------------- */
+
+       // Check if getElementsByTagName("*") returns only elements
+       support.getElementsByTagName = assert(function( el ) {
+               el.appendChild( document.createComment("") );
+               return !el.getElementsByTagName("*").length;
+       });
+
+       // Support: IE<9
+       support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+       // Support: IE<10
+       // Check if getElementById returns elements by name
+       // The broken getElementById methods don't pick up programmatically-set names,
+       // so use a roundabout getElementsByName test
+       support.getById = assert(function( el ) {
+               docElem.appendChild( el ).id = expando;
+               return !document.getElementsByName || !document.getElementsByName( expando ).length;
+       });
+
+       // ID filter and find
+       if ( support.getById ) {
+               Expr.filter["ID"] = function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               return elem.getAttribute("id") === attrId;
+                       };
+               };
+               Expr.find["ID"] = function( id, context ) {
+                       if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+                               var elem = context.getElementById( id );
+                               return elem ? [ elem ] : [];
+                       }
+               };
+       } else {
+               Expr.filter["ID"] =  function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               var node = typeof elem.getAttributeNode !== "undefined" &&
+                                       elem.getAttributeNode("id");
+                               return node && node.value === attrId;
+                       };
+               };
+
+               // Support: IE 6 - 7 only
+               // getElementById is not reliable as a find shortcut
+               Expr.find["ID"] = function( id, context ) {
+                       if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+                               var node, i, elems,
+                                       elem = context.getElementById( id );
+
+                               if ( elem ) {
+
+                                       // Verify the id attribute
+                                       node = elem.getAttributeNode("id");
+                                       if ( node && node.value === id ) {
+                                               return [ elem ];
+                                       }
+
+                                       // Fall back on getElementsByName
+                                       elems = context.getElementsByName( id );
+                                       i = 0;
+                                       while ( (elem = elems[i++]) ) {
+                                               node = elem.getAttributeNode("id");
+                                               if ( node && node.value === id ) {
+                                                       return [ elem ];
+                                               }
+                                       }
+                               }
+
+                               return [];
+                       }
+               };
+       }
+
+       // Tag
+       Expr.find["TAG"] = support.getElementsByTagName ?
+               function( tag, context ) {
+                       if ( typeof context.getElementsByTagName !== "undefined" ) {
+                               return context.getElementsByTagName( tag );
+
+                       // DocumentFragment nodes don't have gEBTN
+                       } else if ( support.qsa ) {
+                               return context.querySelectorAll( tag );
+                       }
+               } :
+
+               function( tag, context ) {
+                       var elem,
+                               tmp = [],
+                               i = 0,
+                               // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+                               results = context.getElementsByTagName( tag );
+
+                       // Filter out possible comments
+                       if ( tag === "*" ) {
+                               while ( (elem = results[i++]) ) {
+                                       if ( elem.nodeType === 1 ) {
+                                               tmp.push( elem );
+                                       }
+                               }
+
+                               return tmp;
+                       }
+                       return results;
+               };
+
+       // Class
+       Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+               if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+                       return context.getElementsByClassName( className );
+               }
+       };
+
+       /* QSA/matchesSelector
+       ---------------------------------------------------------------------- */
+
+       // QSA and matchesSelector support
+
+       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+       rbuggyMatches = [];
+
+       // qSa(:focus) reports false when true (Chrome 21)
+       // We allow this because of a bug in IE8/9 that throws an error
+       // whenever `document.activeElement` is accessed on an iframe
+       // So, we allow :focus to pass through QSA all the time to avoid the IE error
+       // See https://bugs.jquery.com/ticket/13378
+       rbuggyQSA = [];
+
+       if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+               // Build QSA regex
+               // Regex strategy adopted from Diego Perini
+               assert(function( el ) {
+                       // Select is set to empty string on purpose
+                       // This is to test IE's treatment of not explicitly
+                       // setting a boolean content attribute,
+                       // since its presence should be enough
+                       // https://bugs.jquery.com/ticket/12359
+                       docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
+                               "<select id='" + expando + "-\r\\' msallowcapture=''>" +
+                               "<option selected=''></option></select>";
+
+                       // Support: IE8, Opera 11-12.16
+                       // Nothing should be selected when empty strings follow ^= or $= or *=
+                       // The test attribute must be unknown in Opera but "safe" for WinRT
+                       // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+                       if ( el.querySelectorAll("[msallowcapture^='']").length ) {
+                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+                       }
+
+                       // Support: IE8
+                       // Boolean attributes and "value" are not treated correctly
+                       if ( !el.querySelectorAll("[selected]").length ) {
+                               rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+                       }
+
+                       // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+                       if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+                               rbuggyQSA.push("~=");
+                       }
+
+                       // Webkit/Opera - :checked should return selected option elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       // IE8 throws error here and will not see later tests
+                       if ( !el.querySelectorAll(":checked").length ) {
+                               rbuggyQSA.push(":checked");
+                       }
+
+                       // Support: Safari 8+, iOS 8+
+                       // https://bugs.webkit.org/show_bug.cgi?id=136851
+                       // In-page `selector#id sibling-combinator selector` fails
+                       if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+                               rbuggyQSA.push(".#.+[+~]");
+                       }
+               });
+
+               assert(function( el ) {
+                       el.innerHTML = "<a href='' disabled='disabled'></a>" +
+                               "<select disabled='disabled'><option/></select>";
+
+                       // Support: Windows 8 Native Apps
+                       // The type and name attributes are restricted during .innerHTML assignment
+                       var input = document.createElement("input");
+                       input.setAttribute( "type", "hidden" );
+                       el.appendChild( input ).setAttribute( "name", "D" );
+
+                       // Support: IE8
+                       // Enforce case-sensitivity of name attribute
+                       if ( el.querySelectorAll("[name=d]").length ) {
+                               rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+                       }
+
+                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+                       // IE8 throws error here and will not see later tests
+                       if ( el.querySelectorAll(":enabled").length !== 2 ) {
+                               rbuggyQSA.push( ":enabled", ":disabled" );
+                       }
+
+                       // Support: IE9-11+
+                       // IE's :disabled selector does not pick up the children of disabled fieldsets
+                       docElem.appendChild( el ).disabled = true;
+                       if ( el.querySelectorAll(":disabled").length !== 2 ) {
+                               rbuggyQSA.push( ":enabled", ":disabled" );
+                       }
+
+                       // Opera 10-11 does not throw on post-comma invalid pseudos
+                       el.querySelectorAll("*,:x");
+                       rbuggyQSA.push(",.*:");
+               });
+       }
+
+       if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+               docElem.webkitMatchesSelector ||
+               docElem.mozMatchesSelector ||
+               docElem.oMatchesSelector ||
+               docElem.msMatchesSelector) )) ) {
+
+               assert(function( el ) {
+                       // Check to see if it's possible to do matchesSelector
+                       // on a disconnected node (IE 9)
+                       support.disconnectedMatch = matches.call( el, "*" );
+
+                       // This should fail with an exception
+                       // Gecko does not error, returns false instead
+                       matches.call( el, "[s!='']:x" );
+                       rbuggyMatches.push( "!=", pseudos );
+               });
+       }
+
+       rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+       rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+       /* Contains
+       ---------------------------------------------------------------------- */
+       hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+       // Element contains another
+       // Purposefully self-exclusive
+       // As in, an element does not contain itself
+       contains = hasCompare || rnative.test( docElem.contains ) ?
+               function( a, b ) {
+                       var adown = a.nodeType === 9 ? a.documentElement : a,
+                               bup = b && b.parentNode;
+                       return a === bup || !!( bup && bup.nodeType === 1 && (
+                               adown.contains ?
+                                       adown.contains( bup ) :
+                                       a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+                       ));
+               } :
+               function( a, b ) {
+                       if ( b ) {
+                               while ( (b = b.parentNode) ) {
+                                       if ( b === a ) {
+                                               return true;
+                                       }
+                               }
+                       }
+                       return false;
+               };
+
+       /* Sorting
+       ---------------------------------------------------------------------- */
+
+       // Document order sorting
+       sortOrder = hasCompare ?
+       function( a, b ) {
+
+               // Flag for duplicate removal
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
+               // Sort on method existence if only one input has compareDocumentPosition
+               var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+               if ( compare ) {
+                       return compare;
+               }
+
+               // Calculate position if both inputs belong to the same document
+               compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+                       a.compareDocumentPosition( b ) :
+
+                       // Otherwise we know they are disconnected
+                       1;
+
+               // Disconnected nodes
+               if ( compare & 1 ||
+                       (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+                       // Choose the first element that is related to our preferred document
+                       if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+                               return -1;
+                       }
+                       if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+                               return 1;
+                       }
+
+                       // Maintain original order
+                       return sortInput ?
+                               ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+                               0;
+               }
+
+               return compare & 4 ? -1 : 1;
+       } :
+       function( a, b ) {
+               // Exit early if the nodes are identical
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
+               var cur,
+                       i = 0,
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       ap = [ a ],
+                       bp = [ b ];
+
+               // Parentless nodes are either documents or disconnected
+               if ( !aup || !bup ) {
+                       return a === document ? -1 :
+                               b === document ? 1 :
+                               aup ? -1 :
+                               bup ? 1 :
+                               sortInput ?
+                               ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+                               0;
+
+               // If the nodes are siblings, we can do a quick check
+               } else if ( aup === bup ) {
+                       return siblingCheck( a, b );
+               }
+
+               // Otherwise we need full lists of their ancestors for comparison
+               cur = a;
+               while ( (cur = cur.parentNode) ) {
+                       ap.unshift( cur );
+               }
+               cur = b;
+               while ( (cur = cur.parentNode) ) {
+                       bp.unshift( cur );
+               }
+
+               // Walk down the tree looking for a discrepancy
+               while ( ap[i] === bp[i] ) {
+                       i++;
+               }
+
+               return i ?
+                       // Do a sibling check if the nodes have a common ancestor
+                       siblingCheck( ap[i], bp[i] ) :
+
+                       // Otherwise nodes in our document sort first
+                       ap[i] === preferredDoc ? -1 :
+                       bp[i] === preferredDoc ? 1 :
+                       0;
+       };
+
+       return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+       return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
+
+       // Make sure that attribute selectors are quoted
+       expr = expr.replace( rattributeQuotes, "='$1']" );
+
+       if ( support.matchesSelector && documentIsHTML &&
+               !compilerCache[ expr + " " ] &&
+               ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+               ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+               try {
+                       var ret = matches.call( elem, expr );
+
+                       // IE 9's matchesSelector returns false on disconnected nodes
+                       if ( ret || support.disconnectedMatch ||
+                                       // As well, disconnected nodes are said to be in a document
+                                       // fragment in IE 9
+                                       elem.document && elem.document.nodeType !== 11 ) {
+                               return ret;
+                       }
+               } catch (e) {}
+       }
+
+       return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+       // Set document vars if needed
+       if ( ( context.ownerDocument || context ) !== document ) {
+               setDocument( context );
+       }
+       return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
+
+       var fn = Expr.attrHandle[ name.toLowerCase() ],
+               // Don't get fooled by Object.prototype properties (jQuery #13807)
+               val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+                       fn( elem, name, !documentIsHTML ) :
+                       undefined;
+
+       return val !== undefined ?
+               val :
+               support.attributes || !documentIsHTML ?
+                       elem.getAttribute( name ) :
+                       (val = elem.getAttributeNode(name)) && val.specified ?
+                               val.value :
+                               null;
+};
+
+Sizzle.escape = function( sel ) {
+       return (sel + "").replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+       throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+       var elem,
+               duplicates = [],
+               j = 0,
+               i = 0;
+
+       // Unless we *know* we can detect duplicates, assume their presence
+       hasDuplicate = !support.detectDuplicates;
+       sortInput = !support.sortStable && results.slice( 0 );
+       results.sort( sortOrder );
+
+       if ( hasDuplicate ) {
+               while ( (elem = results[i++]) ) {
+                       if ( elem === results[ i ] ) {
+                               j = duplicates.push( i );
+                       }
+               }
+               while ( j-- ) {
+                       results.splice( duplicates[ j ], 1 );
+               }
+       }
+
+       // Clear input after sorting to release objects
+       // See https://github.com/jquery/sizzle/pull/225
+       sortInput = null;
+
+       return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+       var node,
+               ret = "",
+               i = 0,
+               nodeType = elem.nodeType;
+
+       if ( !nodeType ) {
+               // If no nodeType, this is expected to be an array
+               while ( (node = elem[i++]) ) {
+                       // Do not traverse comment nodes
+                       ret += getText( node );
+               }
+       } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+               // Use textContent for elements
+               // innerText usage removed for consistency of new lines (jQuery #11153)
+               if ( typeof elem.textContent === "string" ) {
+                       return elem.textContent;
+               } else {
+                       // Traverse its children
+                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+                               ret += getText( elem );
+                       }
+               }
+       } else if ( nodeType === 3 || nodeType === 4 ) {
+               return elem.nodeValue;
+       }
+       // Do not include comment or processing instruction nodes
+
+       return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+       // Can be adjusted by the user
+       cacheLength: 50,
+
+       createPseudo: markFunction,
+
+       match: matchExpr,
+
+       attrHandle: {},
+
+       find: {},
+
+       relative: {
+               ">": { dir: "parentNode", first: true },
+               " ": { dir: "parentNode" },
+               "+": { dir: "previousSibling", first: true },
+               "~": { dir: "previousSibling" }
+       },
+
+       preFilter: {
+               "ATTR": function( match ) {
+                       match[1] = match[1].replace( runescape, funescape );
+
+                       // Move the given value to match[3] whether quoted or unquoted
+                       match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+                       if ( match[2] === "~=" ) {
+                               match[3] = " " + match[3] + " ";
+                       }
+
+                       return match.slice( 0, 4 );
+               },
+
+               "CHILD": function( match ) {
+                       /* matches from matchExpr["CHILD"]
+                               1 type (only|nth|...)
+                               2 what (child|of-type)
+                               3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+                               4 xn-component of xn+y argument ([+-]?\d*n|)
+                               5 sign of xn-component
+                               6 x of xn-component
+                               7 sign of y-component
+                               8 y of y-component
+                       */
+                       match[1] = match[1].toLowerCase();
+
+                       if ( match[1].slice( 0, 3 ) === "nth" ) {
+                               // nth-* requires argument
+                               if ( !match[3] ) {
+                                       Sizzle.error( match[0] );
+                               }
+
+                               // numeric x and y parameters for Expr.filter.CHILD
+                               // remember that false/true cast respectively to 0/1
+                               match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+                               match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+                       // other types prohibit arguments
+                       } else if ( match[3] ) {
+                               Sizzle.error( match[0] );
+                       }
+
+                       return match;
+               },
+
+               "PSEUDO": function( match ) {
+                       var excess,
+                               unquoted = !match[6] && match[2];
+
+                       if ( matchExpr["CHILD"].test( match[0] ) ) {
+                               return null;
+                       }
+
+                       // Accept quoted arguments as-is
+                       if ( match[3] ) {
+                               match[2] = match[4] || match[5] || "";
+
+                       // Strip excess characters from unquoted arguments
+                       } else if ( unquoted && rpseudo.test( unquoted ) &&
+                               // Get excess from tokenize (recursively)
+                               (excess = tokenize( unquoted, true )) &&
+                               // advance to the next closing parenthesis
+                               (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+                               // excess is a negative index
+                               match[0] = match[0].slice( 0, excess );
+                               match[2] = unquoted.slice( 0, excess );
+                       }
+
+                       // Return only captures needed by the pseudo filter method (type and argument)
+                       return match.slice( 0, 3 );
+               }
+       },
+
+       filter: {
+
+               "TAG": function( nodeNameSelector ) {
+                       var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+                       return nodeNameSelector === "*" ?
+                               function() { return true; } :
+                               function( elem ) {
+                                       return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+                               };
+               },
+
+               "CLASS": function( className ) {
+                       var pattern = classCache[ className + " " ];
+
+                       return pattern ||
+                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+                               classCache( className, function( elem ) {
+                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+                               });
+               },
+
+               "ATTR": function( name, operator, check ) {
+                       return function( elem ) {
+                               var result = Sizzle.attr( elem, name );
+
+                               if ( result == null ) {
+                                       return operator === "!=";
+                               }
+                               if ( !operator ) {
+                                       return true;
+                               }
+
+                               result += "";
+
+                               return operator === "=" ? result === check :
+                                       operator === "!=" ? result !== check :
+                                       operator === "^=" ? check && result.indexOf( check ) === 0 :
+                                       operator === "*=" ? check && result.indexOf( check ) > -1 :
+                                       operator === "$=" ? check && result.slice( -check.length ) === check :
+                                       operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+                                       operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+                                       false;
+                       };
+               },
+
+               "CHILD": function( type, what, argument, first, last ) {
+                       var simple = type.slice( 0, 3 ) !== "nth",
+                               forward = type.slice( -4 ) !== "last",
+                               ofType = what === "of-type";
+
+                       return first === 1 && last === 0 ?
+
+                               // Shortcut for :nth-*(n)
+                               function( elem ) {
+                                       return !!elem.parentNode;
+                               } :
+
+                               function( elem, context, xml ) {
+                                       var cache, uniqueCache, outerCache, node, nodeIndex, start,
+                                               dir = simple !== forward ? "nextSibling" : "previousSibling",
+                                               parent = elem.parentNode,
+                                               name = ofType && elem.nodeName.toLowerCase(),
+                                               useCache = !xml && !ofType,
+                                               diff = false;
+
+                                       if ( parent ) {
+
+                                               // :(first|last|only)-(child|of-type)
+                                               if ( simple ) {
+                                                       while ( dir ) {
+                                                               node = elem;
+                                                               while ( (node = node[ dir ]) ) {
+                                                                       if ( ofType ?
+                                                                               node.nodeName.toLowerCase() === name :
+                                                                               node.nodeType === 1 ) {
+
+                                                                               return false;
+                                                                       }
+                                                               }
+                                                               // Reverse direction for :only-* (if we haven't yet done so)
+                                                               start = dir = type === "only" && !start && "nextSibling";
+                                                       }
+                                                       return true;
+                                               }
+
+                                               start = [ forward ? parent.firstChild : parent.lastChild ];
+
+                                               // non-xml :nth-child(...) stores cache data on `parent`
+                                               if ( forward && useCache ) {
+
+                                                       // Seek `elem` from a previously-cached index
+
+                                                       // ...in a gzip-friendly way
+                                                       node = parent;
+                                                       outerCache = node[ expando ] || (node[ expando ] = {});
+
+                                                       // Support: IE <9 only
+                                                       // Defend against cloned attroperties (jQuery gh-1709)
+                                                       uniqueCache = outerCache[ node.uniqueID ] ||
+                                                               (outerCache[ node.uniqueID ] = {});
+
+                                                       cache = uniqueCache[ type ] || [];
+                                                       nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+                                                       diff = nodeIndex && cache[ 2 ];
+                                                       node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+                                                               // Fallback to seeking `elem` from the start
+                                                               (diff = nodeIndex = 0) || start.pop()) ) {
+
+                                                               // When found, cache indexes on `parent` and break
+                                                               if ( node.nodeType === 1 && ++diff && node === elem ) {
+                                                                       uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+                                                                       break;
+                                                               }
+                                                       }
+
+                                               } else {
+                                                       // Use previously-cached element index if available
+                                                       if ( useCache ) {
+                                                               // ...in a gzip-friendly way
+                                                               node = elem;
+                                                               outerCache = node[ expando ] || (node[ expando ] = {});
+
+                                                               // Support: IE <9 only
+                                                               // Defend against cloned attroperties (jQuery gh-1709)
+                                                               uniqueCache = outerCache[ node.uniqueID ] ||
+                                                                       (outerCache[ node.uniqueID ] = {});
+
+                                                               cache = uniqueCache[ type ] || [];
+                                                               nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+                                                               diff = nodeIndex;
+                                                       }
+
+                                                       // xml :nth-child(...)
+                                                       // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+                                                       if ( diff === false ) {
+                                                               // Use the same loop as above to seek `elem` from the start
+                                                               while ( (node = ++nodeIndex && node && node[ dir ] ||
+                                                                       (diff = nodeIndex = 0) || start.pop()) ) {
+
+                                                                       if ( ( ofType ?
+                                                                               node.nodeName.toLowerCase() === name :
+                                                                               node.nodeType === 1 ) &&
+                                                                               ++diff ) {
+
+                                                                               // Cache the index of each encountered element
+                                                                               if ( useCache ) {
+                                                                                       outerCache = node[ expando ] || (node[ expando ] = {});
+
+                                                                                       // Support: IE <9 only
+                                                                                       // Defend against cloned attroperties (jQuery gh-1709)
+                                                                                       uniqueCache = outerCache[ node.uniqueID ] ||
+                                                                                               (outerCache[ node.uniqueID ] = {});
+
+                                                                                       uniqueCache[ type ] = [ dirruns, diff ];
+                                                                               }
+
+                                                                               if ( node === elem ) {
+                                                                                       break;
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+
+                                               // Incorporate the offset, then check against cycle size
+                                               diff -= last;
+                                               return diff === first || ( diff % first === 0 && diff / first >= 0 );
+                                       }
+                               };
+               },
+
+               "PSEUDO": function( pseudo, argument ) {
+                       // pseudo-class names are case-insensitive
+                       // http://www.w3.org/TR/selectors/#pseudo-classes
+                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+                       // Remember that setFilters inherits from pseudos
+                       var args,
+                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+                                       Sizzle.error( "unsupported pseudo: " + pseudo );
+
+                       // The user may use createPseudo to indicate that
+                       // arguments are needed to create the filter function
+                       // just as Sizzle does
+                       if ( fn[ expando ] ) {
+                               return fn( argument );
+                       }
+
+                       // But maintain support for old signatures
+                       if ( fn.length > 1 ) {
+                               args = [ pseudo, pseudo, "", argument ];
+                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+                                       markFunction(function( seed, matches ) {
+                                               var idx,
+                                                       matched = fn( seed, argument ),
+                                                       i = matched.length;
+                                               while ( i-- ) {
+                                                       idx = indexOf( seed, matched[i] );
+                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );
+                                               }
+                                       }) :
+                                       function( elem ) {
+                                               return fn( elem, 0, args );
+                                       };
+                       }
+
+                       return fn;
+               }
+       },
+
+       pseudos: {
+               // Potentially complex pseudos
+               "not": markFunction(function( selector ) {
+                       // Trim the selector passed to compile
+                       // to avoid treating leading and trailing
+                       // spaces as combinators
+                       var input = [],
+                               results = [],
+                               matcher = compile( selector.replace( rtrim, "$1" ) );
+
+                       return matcher[ expando ] ?
+                               markFunction(function( seed, matches, context, xml ) {
+                                       var elem,
+                                               unmatched = matcher( seed, null, xml, [] ),
+                                               i = seed.length;
+
+                                       // Match elements unmatched by `matcher`
+                                       while ( i-- ) {
+                                               if ( (elem = unmatched[i]) ) {
+                                                       seed[i] = !(matches[i] = elem);
+                                               }
+                                       }
+                               }) :
+                               function( elem, context, xml ) {
+                                       input[0] = elem;
+                                       matcher( input, null, xml, results );
+                                       // Don't keep the element (issue #299)
+                                       input[0] = null;
+                                       return !results.pop();
+                               };
+               }),
+
+               "has": markFunction(function( selector ) {
+                       return function( elem ) {
+                               return Sizzle( selector, elem ).length > 0;
+                       };
+               }),
+
+               "contains": markFunction(function( text ) {
+                       text = text.replace( runescape, funescape );
+                       return function( elem ) {
+                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+                       };
+               }),
+
+               // "Whether an element is represented by a :lang() selector
+               // is based solely on the element's language value
+               // being equal to the identifier C,
+               // or beginning with the identifier C immediately followed by "-".
+               // The matching of C against the element's language value is performed case-insensitively.
+               // The identifier C does not have to be a valid language name."
+               // http://www.w3.org/TR/selectors/#lang-pseudo
+               "lang": markFunction( function( lang ) {
+                       // lang value must be a valid identifier
+                       if ( !ridentifier.test(lang || "") ) {
+                               Sizzle.error( "unsupported lang: " + lang );
+                       }
+                       lang = lang.replace( runescape, funescape ).toLowerCase();
+                       return function( elem ) {
+                               var elemLang;
+                               do {
+                                       if ( (elemLang = documentIsHTML ?
+                                               elem.lang :
+                                               elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+                                               elemLang = elemLang.toLowerCase();
+                                               return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+                                       }
+                               } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+                               return false;
+                       };
+               }),
+
+               // Miscellaneous
+               "target": function( elem ) {
+                       var hash = window.location && window.location.hash;
+                       return hash && hash.slice( 1 ) === elem.id;
+               },
+
+               "root": function( elem ) {
+                       return elem === docElem;
+               },
+
+               "focus": function( elem ) {
+                       return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+               },
+
+               // Boolean properties
+               "enabled": createDisabledPseudo( false ),
+               "disabled": createDisabledPseudo( true ),
+
+               "checked": function( elem ) {
+                       // In CSS3, :checked should return both checked and selected elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       var nodeName = elem.nodeName.toLowerCase();
+                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+               },
+
+               "selected": function( elem ) {
+                       // Accessing this property makes selected-by-default
+                       // options in Safari work properly
+                       if ( elem.parentNode ) {
+                               elem.parentNode.selectedIndex;
+                       }
+
+                       return elem.selected === true;
+               },
+
+               // Contents
+               "empty": function( elem ) {
+                       // http://www.w3.org/TR/selectors/#empty-pseudo
+                       // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+                       //   but not by others (comment: 8; processing instruction: 7; etc.)
+                       // nodeType < 6 works because attributes (2) do not appear as children
+                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+                               if ( elem.nodeType < 6 ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               },
+
+               "parent": function( elem ) {
+                       return !Expr.pseudos["empty"]( elem );
+               },
+
+               // Element/input types
+               "header": function( elem ) {
+                       return rheader.test( elem.nodeName );
+               },
+
+               "input": function( elem ) {
+                       return rinputs.test( elem.nodeName );
+               },
+
+               "button": function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return name === "input" && elem.type === "button" || name === "button";
+               },
+
+               "text": function( elem ) {
+                       var attr;
+                       return elem.nodeName.toLowerCase() === "input" &&
+                               elem.type === "text" &&
+
+                               // Support: IE<8
+                               // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+               },
+
+               // Position-in-collection
+               "first": createPositionalPseudo(function() {
+                       return [ 0 ];
+               }),
+
+               "last": createPositionalPseudo(function( matchIndexes, length ) {
+                       return [ length - 1 ];
+               }),
+
+               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       return [ argument < 0 ? argument + length : argument ];
+               }),
+
+               "even": createPositionalPseudo(function( matchIndexes, length ) {
+                       var i = 0;
+                       for ( ; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "odd": createPositionalPseudo(function( matchIndexes, length ) {
+                       var i = 1;
+                       for ( ; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       var i = argument < 0 ? argument + length : argument;
+                       for ( ; --i >= 0; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       var i = argument < 0 ? argument + length : argument;
+                       for ( ; ++i < length; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               })
+       }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+       Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+       Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+       var matched, match, tokens, type,
+               soFar, groups, preFilters,
+               cached = tokenCache[ selector + " " ];
+
+       if ( cached ) {
+               return parseOnly ? 0 : cached.slice( 0 );
+       }
+
+       soFar = selector;
+       groups = [];
+       preFilters = Expr.preFilter;
+
+       while ( soFar ) {
+
+               // Comma and first run
+               if ( !matched || (match = rcomma.exec( soFar )) ) {
+                       if ( match ) {
+                               // Don't consume trailing commas as valid
+                               soFar = soFar.slice( match[0].length ) || soFar;
+                       }
+                       groups.push( (tokens = []) );
+               }
+
+               matched = false;
+
+               // Combinators
+               if ( (match = rcombinators.exec( soFar )) ) {
+                       matched = match.shift();
+                       tokens.push({
+                               value: matched,
+                               // Cast descendant combinators to space
+                               type: match[0].replace( rtrim, " " )
+                       });
+                       soFar = soFar.slice( matched.length );
+               }
+
+               // Filters
+               for ( type in Expr.filter ) {
+                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+                               (match = preFilters[ type ]( match ))) ) {
+                               matched = match.shift();
+                               tokens.push({
+                                       value: matched,
+                                       type: type,
+                                       matches: match
+                               });
+                               soFar = soFar.slice( matched.length );
+                       }
+               }
+
+               if ( !matched ) {
+                       break;
+               }
+       }
+
+       // Return the length of the invalid excess
+       // if we're just parsing
+       // Otherwise, throw an error or return tokens
+       return parseOnly ?
+               soFar.length :
+               soFar ?
+                       Sizzle.error( selector ) :
+                       // Cache the tokens
+                       tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+       var i = 0,
+               len = tokens.length,
+               selector = "";
+       for ( ; i < len; i++ ) {
+               selector += tokens[i].value;
+       }
+       return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+       var dir = combinator.dir,
+               skip = combinator.next,
+               key = skip || dir,
+               checkNonElements = base && key === "parentNode",
+               doneName = done++;
+
+       return combinator.first ?
+               // Check against closest ancestor/preceding element
+               function( elem, context, xml ) {
+                       while ( (elem = elem[ dir ]) ) {
+                               if ( elem.nodeType === 1 || checkNonElements ) {
+                                       return matcher( elem, context, xml );
+                               }
+                       }
+                       return false;
+               } :
+
+               // Check against all ancestor/preceding elements
+               function( elem, context, xml ) {
+                       var oldCache, uniqueCache, outerCache,
+                               newCache = [ dirruns, doneName ];
+
+                       // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+                       if ( xml ) {
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( elem.nodeType === 1 || checkNonElements ) {
+                                               if ( matcher( elem, context, xml ) ) {
+                                                       return true;
+                                               }
+                                       }
+                               }
+                       } else {
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( elem.nodeType === 1 || checkNonElements ) {
+                                               outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+                                               // Support: IE <9 only
+                                               // Defend against cloned attroperties (jQuery gh-1709)
+                                               uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+                                               if ( skip && skip === elem.nodeName.toLowerCase() ) {
+                                                       elem = elem[ dir ] || elem;
+                                               } else if ( (oldCache = uniqueCache[ key ]) &&
+                                                       oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+                                                       // Assign to newCache so results back-propagate to previous elements
+                                                       return (newCache[ 2 ] = oldCache[ 2 ]);
+                                               } else {
+                                                       // Reuse newcache so results back-propagate to previous elements
+                                                       uniqueCache[ key ] = newCache;
+
+                                                       // A match means we're done; a fail means we have to keep checking
+                                                       if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+                                                               return true;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+                       return false;
+               };
+}
+
+function elementMatcher( matchers ) {
+       return matchers.length > 1 ?
+               function( elem, context, xml ) {
+                       var i = matchers.length;
+                       while ( i-- ) {
+                               if ( !matchers[i]( elem, context, xml ) ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               } :
+               matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+       var i = 0,
+               len = contexts.length;
+       for ( ; i < len; i++ ) {
+               Sizzle( selector, contexts[i], results );
+       }
+       return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+       var elem,
+               newUnmatched = [],
+               i = 0,
+               len = unmatched.length,
+               mapped = map != null;
+
+       for ( ; i < len; i++ ) {
+               if ( (elem = unmatched[i]) ) {
+                       if ( !filter || filter( elem, context, xml ) ) {
+                               newUnmatched.push( elem );
+                               if ( mapped ) {
+                                       map.push( i );
+                               }
+                       }
+               }
+       }
+
+       return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+       if ( postFilter && !postFilter[ expando ] ) {
+               postFilter = setMatcher( postFilter );
+       }
+       if ( postFinder && !postFinder[ expando ] ) {
+               postFinder = setMatcher( postFinder, postSelector );
+       }
+       return markFunction(function( seed, results, context, xml ) {
+               var temp, i, elem,
+                       preMap = [],
+                       postMap = [],
+                       preexisting = results.length,
+
+                       // Get initial elements from seed or context
+                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+                       // Prefilter to get matcher input, preserving a map for seed-results synchronization
+                       matcherIn = preFilter && ( seed || !selector ) ?
+                               condense( elems, preMap, preFilter, context, xml ) :
+                               elems,
+
+                       matcherOut = matcher ?
+                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+                                       // ...intermediate processing is necessary
+                                       [] :
+
+                                       // ...otherwise use results directly
+                                       results :
+                               matcherIn;
+
+               // Find primary matches
+               if ( matcher ) {
+                       matcher( matcherIn, matcherOut, context, xml );
+               }
+
+               // Apply postFilter
+               if ( postFilter ) {
+                       temp = condense( matcherOut, postMap );
+                       postFilter( temp, [], context, xml );
+
+                       // Un-match failing elements by moving them back to matcherIn
+                       i = temp.length;
+                       while ( i-- ) {
+                               if ( (elem = temp[i]) ) {
+                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+                               }
+                       }
+               }
+
+               if ( seed ) {
+                       if ( postFinder || preFilter ) {
+                               if ( postFinder ) {
+                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts
+                                       temp = [];
+                                       i = matcherOut.length;
+                                       while ( i-- ) {
+                                               if ( (elem = matcherOut[i]) ) {
+                                                       // Restore matcherIn since elem is not yet a final match
+                                                       temp.push( (matcherIn[i] = elem) );
+                                               }
+                                       }
+                                       postFinder( null, (matcherOut = []), temp, xml );
+                               }
+
+                               // Move matched elements from seed to results to keep them synchronized
+                               i = matcherOut.length;
+                               while ( i-- ) {
+                                       if ( (elem = matcherOut[i]) &&
+                                               (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+                                               seed[temp] = !(results[temp] = elem);
+                                       }
+                               }
+                       }
+
+               // Add elements to results, through postFinder if defined
+               } else {
+                       matcherOut = condense(
+                               matcherOut === results ?
+                                       matcherOut.splice( preexisting, matcherOut.length ) :
+                                       matcherOut
+                       );
+                       if ( postFinder ) {
+                               postFinder( null, results, matcherOut, xml );
+                       } else {
+                               push.apply( results, matcherOut );
+                       }
+               }
+       });
+}
+
+function matcherFromTokens( tokens ) {
+       var checkContext, matcher, j,
+               len = tokens.length,
+               leadingRelative = Expr.relative[ tokens[0].type ],
+               implicitRelative = leadingRelative || Expr.relative[" "],
+               i = leadingRelative ? 1 : 0,
+
+               // The foundational matcher ensures that elements are reachable from top-level context(s)
+               matchContext = addCombinator( function( elem ) {
+                       return elem === checkContext;
+               }, implicitRelative, true ),
+               matchAnyContext = addCombinator( function( elem ) {
+                       return indexOf( checkContext, elem ) > -1;
+               }, implicitRelative, true ),
+               matchers = [ function( elem, context, xml ) {
+                       var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+                               (checkContext = context).nodeType ?
+                                       matchContext( elem, context, xml ) :
+                                       matchAnyContext( elem, context, xml ) );
+                       // Avoid hanging onto element (issue #299)
+                       checkContext = null;
+                       return ret;
+               } ];
+
+       for ( ; i < len; i++ ) {
+               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+                       matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+               } else {
+                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+                       // Return special upon seeing a positional matcher
+                       if ( matcher[ expando ] ) {
+                               // Find the next relative operator (if any) for proper handling
+                               j = ++i;
+                               for ( ; j < len; j++ ) {
+                                       if ( Expr.relative[ tokens[j].type ] ) {
+                                               break;
+                                       }
+                               }
+                               return setMatcher(
+                                       i > 1 && elementMatcher( matchers ),
+                                       i > 1 && toSelector(
+                                               // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+                                               tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+                                       ).replace( rtrim, "$1" ),
+                                       matcher,
+                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),
+                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+                                       j < len && toSelector( tokens )
+                               );
+                       }
+                       matchers.push( matcher );
+               }
+       }
+
+       return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+       var bySet = setMatchers.length > 0,
+               byElement = elementMatchers.length > 0,
+               superMatcher = function( seed, context, xml, results, outermost ) {
+                       var elem, j, matcher,
+                               matchedCount = 0,
+                               i = "0",
+                               unmatched = seed && [],
+                               setMatched = [],
+                               contextBackup = outermostContext,
+                               // We must always have either seed elements or outermost context
+                               elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+                               // Use integer dirruns iff this is the outermost matcher
+                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+                               len = elems.length;
+
+                       if ( outermost ) {
+                               outermostContext = context === document || context || outermost;
+                       }
+
+                       // Add elements passing elementMatchers directly to results
+                       // Support: IE<9, Safari
+                       // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+                       for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+                               if ( byElement && elem ) {
+                                       j = 0;
+                                       if ( !context && elem.ownerDocument !== document ) {
+                                               setDocument( elem );
+                                               xml = !documentIsHTML;
+                                       }
+                                       while ( (matcher = elementMatchers[j++]) ) {
+                                               if ( matcher( elem, context || document, xml) ) {
+                                                       results.push( elem );
+                                                       break;
+                                               }
+                                       }
+                                       if ( outermost ) {
+                                               dirruns = dirrunsUnique;
+                                       }
+                               }
+
+                               // Track unmatched elements for set filters
+                               if ( bySet ) {
+                                       // They will have gone through all possible matchers
+                                       if ( (elem = !matcher && elem) ) {
+                                               matchedCount--;
+                                       }
+
+                                       // Lengthen the array for every element, matched or not
+                                       if ( seed ) {
+                                               unmatched.push( elem );
+                                       }
+                               }
+                       }
+
+                       // `i` is now the count of elements visited above, and adding it to `matchedCount`
+                       // makes the latter nonnegative.
+                       matchedCount += i;
+
+                       // Apply set filters to unmatched elements
+                       // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+                       // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+                       // no element matchers and no seed.
+                       // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+                       // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+                       // numerically zero.
+                       if ( bySet && i !== matchedCount ) {
+                               j = 0;
+                               while ( (matcher = setMatchers[j++]) ) {
+                                       matcher( unmatched, setMatched, context, xml );
+                               }
+
+                               if ( seed ) {
+                                       // Reintegrate element matches to eliminate the need for sorting
+                                       if ( matchedCount > 0 ) {
+                                               while ( i-- ) {
+                                                       if ( !(unmatched[i] || setMatched[i]) ) {
+                                                               setMatched[i] = pop.call( results );
+                                                       }
+                                               }
+                                       }
+
+                                       // Discard index placeholder values to get only actual matches
+                                       setMatched = condense( setMatched );
+                               }
+
+                               // Add matches to results
+                               push.apply( results, setMatched );
+
+                               // Seedless set matches succeeding multiple successful matchers stipulate sorting
+                               if ( outermost && !seed && setMatched.length > 0 &&
+                                       ( matchedCount + setMatchers.length ) > 1 ) {
+
+                                       Sizzle.uniqueSort( results );
+                               }
+                       }
+
+                       // Override manipulation of globals by nested matchers
+                       if ( outermost ) {
+                               dirruns = dirrunsUnique;
+                               outermostContext = contextBackup;
+                       }
+
+                       return unmatched;
+               };
+
+       return bySet ?
+               markFunction( superMatcher ) :
+               superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+       var i,
+               setMatchers = [],
+               elementMatchers = [],
+               cached = compilerCache[ selector + " " ];
+
+       if ( !cached ) {
+               // Generate a function of recursive functions that can be used to check each element
+               if ( !match ) {
+                       match = tokenize( selector );
+               }
+               i = match.length;
+               while ( i-- ) {
+                       cached = matcherFromTokens( match[i] );
+                       if ( cached[ expando ] ) {
+                               setMatchers.push( cached );
+                       } else {
+                               elementMatchers.push( cached );
+                       }
+               }
+
+               // Cache the compiled function
+               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+               // Save selector and tokenization
+               cached.selector = selector;
+       }
+       return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+       var i, tokens, token, type, find,
+               compiled = typeof selector === "function" && selector,
+               match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+       results = results || [];
+
+       // Try to minimize operations if there is only one selector in the list and no seed
+       // (the latter of which guarantees us context)
+       if ( match.length === 1 ) {
+
+               // Reduce context if the leading compound selector is an ID
+               tokens = match[0] = match[0].slice( 0 );
+               if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+                               context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
+
+                       context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+                       if ( !context ) {
+                               return results;
+
+                       // Precompiled matchers will still verify ancestry, so step up a level
+                       } else if ( compiled ) {
+                               context = context.parentNode;
+                       }
+
+                       selector = selector.slice( tokens.shift().value.length );
+               }
+
+               // Fetch a seed set for right-to-left matching
+               i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+               while ( i-- ) {
+                       token = tokens[i];
+
+                       // Abort if we hit a combinator
+                       if ( Expr.relative[ (type = token.type) ] ) {
+                               break;
+                       }
+                       if ( (find = Expr.find[ type ]) ) {
+                               // Search, expanding context for leading sibling combinators
+                               if ( (seed = find(
+                                       token.matches[0].replace( runescape, funescape ),
+                                       rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+                               )) ) {
+
+                                       // If seed is empty or no tokens remain, we can return early
+                                       tokens.splice( i, 1 );
+                                       selector = seed.length && toSelector( tokens );
+                                       if ( !selector ) {
+                                               push.apply( results, seed );
+                                               return results;
+                                       }
+
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       // Compile and execute a filtering function if one is not provided
+       // Provide `match` to avoid retokenization if we modified the selector above
+       ( compiled || compile( selector, match ) )(
+               seed,
+               context,
+               !documentIsHTML,
+               results,
+               !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+       );
+       return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( el ) {
+       // Should return 1, but returns 4 (following)
+       return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( el ) {
+       el.innerHTML = "<a href='#'></a>";
+       return el.firstChild.getAttribute("href") === "#" ;
+}) ) {
+       addHandle( "type|href|height|width", function( elem, name, isXML ) {
+               if ( !isXML ) {
+                       return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+               }
+       });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( el ) {
+       el.innerHTML = "<input/>";
+       el.firstChild.setAttribute( "value", "" );
+       return el.firstChild.getAttribute( "value" ) === "";
+}) ) {
+       addHandle( "value", function( elem, name, isXML ) {
+               if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+                       return elem.defaultValue;
+               }
+       });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( el ) {
+       return el.getAttribute("disabled") == null;
+}) ) {
+       addHandle( booleans, function( elem, name, isXML ) {
+               var val;
+               if ( !isXML ) {
+                       return elem[ name ] === true ? name.toLowerCase() :
+                                       (val = elem.getAttributeNode( name )) && val.specified ?
+                                       val.value :
+                               null;
+               }
+       });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+       var matched = [],
+               truncate = until !== undefined;
+
+       while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+               if ( elem.nodeType === 1 ) {
+                       if ( truncate && jQuery( elem ).is( until ) ) {
+                               break;
+                       }
+                       matched.push( elem );
+               }
+       }
+       return matched;
+};
+
+
+var siblings = function( n, elem ) {
+       var matched = [];
+
+       for ( ; n; n = n.nextSibling ) {
+               if ( n.nodeType === 1 && n !== elem ) {
+                       matched.push( n );
+               }
+       }
+
+       return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+};
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep( elements, function( elem, i ) {
+                       return !!qualifier.call( elem, i, elem ) !== not;
+               } );
+       }
+
+       // Single element
+       if ( qualifier.nodeType ) {
+               return jQuery.grep( elements, function( elem ) {
+                       return ( elem === qualifier ) !== not;
+               } );
+       }
+
+       // Arraylike of elements (jQuery, arguments, Array)
+       if ( typeof qualifier !== "string" ) {
+               return jQuery.grep( elements, function( elem ) {
+                       return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+               } );
+       }
+
+       // Simple selector that can be filtered directly, removing non-Elements
+       if ( risSimple.test( qualifier ) ) {
+               return jQuery.filter( qualifier, elements, not );
+       }
+
+       // Complex selector, compare the two sets, removing non-Elements
+       qualifier = jQuery.filter( qualifier, elements );
+       return jQuery.grep( elements, function( elem ) {
+               return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
+       } );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+       var elem = elems[ 0 ];
+
+       if ( not ) {
+               expr = ":not(" + expr + ")";
+       }
+
+       if ( elems.length === 1 && elem.nodeType === 1 ) {
+               return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+       }
+
+       return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+               return elem.nodeType === 1;
+       } ) );
+};
+
+jQuery.fn.extend( {
+       find: function( selector ) {
+               var i, ret,
+                       len = this.length,
+                       self = this;
+
+               if ( typeof selector !== "string" ) {
+                       return this.pushStack( jQuery( selector ).filter( function() {
+                               for ( i = 0; i < len; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
+                                       }
+                               }
+                       } ) );
+               }
+
+               ret = this.pushStack( [] );
+
+               for ( i = 0; i < len; i++ ) {
+                       jQuery.find( selector, self[ i ], ret );
+               }
+
+               return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+       },
+       filter: function( selector ) {
+               return this.pushStack( winnow( this, selector || [], false ) );
+       },
+       not: function( selector ) {
+               return this.pushStack( winnow( this, selector || [], true ) );
+       },
+       is: function( selector ) {
+               return !!winnow(
+                       this,
+
+                       // If this is a positional/relative selector, check membership in the returned set
+                       // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                       typeof selector === "string" && rneedsContext.test( selector ) ?
+                               jQuery( selector ) :
+                               selector || [],
+                       false
+               ).length;
+       }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       // Strict HTML recognition (#11290: must start with <)
+       // Shortcut simple #id case for speed
+       rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+       init = jQuery.fn.init = function( selector, context, root ) {
+               var match, elem;
+
+               // HANDLE: $(""), $(null), $(undefined), $(false)
+               if ( !selector ) {
+                       return this;
+               }
+
+               // Method init() accepts an alternate rootjQuery
+               // so migrate can support jQuery.sub (gh-2101)
+               root = root || rootjQuery;
+
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       if ( selector[ 0 ] === "<" &&
+                               selector[ selector.length - 1 ] === ">" &&
+                               selector.length >= 3 ) {
+
+                               // Assume that strings that start and end with <> are HTML and skip the regex check
+                               match = [ null, selector, null ];
+
+                       } else {
+                               match = rquickExpr.exec( selector );
+                       }
+
+                       // Match html or make sure no context is specified for #id
+                       if ( match && ( match[ 1 ] || !context ) ) {
+
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[ 1 ] ) {
+                                       context = context instanceof jQuery ? context[ 0 ] : context;
+
+                                       // Option to run scripts is true for back-compat
+                                       // Intentionally let the error be thrown if parseHTML is not present
+                                       jQuery.merge( this, jQuery.parseHTML(
+                                               match[ 1 ],
+                                               context && context.nodeType ? context.ownerDocument || context : document,
+                                               true
+                                       ) );
+
+                                       // HANDLE: $(html, props)
+                                       if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+                                               for ( match in context ) {
+
+                                                       // Properties of context are called as methods if possible
+                                                       if ( jQuery.isFunction( this[ match ] ) ) {
+                                                               this[ match ]( context[ match ] );
+
+                                                       // ...and otherwise set as attributes
+                                                       } else {
+                                                               this.attr( match, context[ match ] );
+                                                       }
+                                               }
+                                       }
+
+                                       return this;
+
+                               // HANDLE: $(#id)
+                               } else {
+                                       elem = document.getElementById( match[ 2 ] );
+
+                                       if ( elem ) {
+
+                                               // Inject the element directly into the jQuery object
+                                               this[ 0 ] = elem;
+                                               this.length = 1;
+                                       }
+                                       return this;
+                               }
+
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || root ).find( selector );
+
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( selector );
+                       }
+
+               // HANDLE: $(DOMElement)
+               } else if ( selector.nodeType ) {
+                       this[ 0 ] = selector;
+                       this.length = 1;
+                       return this;
+
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return root.ready !== undefined ?
+                               root.ready( selector ) :
+
+                               // Execute immediately if ready is not present
+                               selector( jQuery );
+               }
+
+               return jQuery.makeArray( selector, this );
+       };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+       // Methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
+
+jQuery.fn.extend( {
+       has: function( target ) {
+               var targets = jQuery( target, this ),
+                       l = targets.length;
+
+               return this.filter( function() {
+                       var i = 0;
+                       for ( ; i < l; i++ ) {
+                               if ( jQuery.contains( this, targets[ i ] ) ) {
+                                       return true;
+                               }
+                       }
+               } );
+       },
+
+       closest: function( selectors, context ) {
+               var cur,
+                       i = 0,
+                       l = this.length,
+                       matched = [],
+                       targets = typeof selectors !== "string" && jQuery( selectors );
+
+               // Positional selectors never match, since there's no _selection_ context
+               if ( !rneedsContext.test( selectors ) ) {
+                       for ( ; i < l; i++ ) {
+                               for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+                                       // Always skip document fragments
+                                       if ( cur.nodeType < 11 && ( targets ?
+                                               targets.index( cur ) > -1 :
+
+                                               // Don't pass non-elements to Sizzle
+                                               cur.nodeType === 1 &&
+                                                       jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+                                               matched.push( cur );
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+       },
+
+       // Determine the position of an element within the set
+       index: function( elem ) {
+
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+               }
+
+               // Index in selector
+               if ( typeof elem === "string" ) {
+                       return indexOf.call( jQuery( elem ), this[ 0 ] );
+               }
+
+               // Locate the position of the desired element
+               return indexOf.call( this,
+
+                       // If it receives a jQuery object, the first element is used
+                       elem.jquery ? elem[ 0 ] : elem
+               );
+       },
+
+       add: function( selector, context ) {
+               return this.pushStack(
+                       jQuery.uniqueSort(
+                               jQuery.merge( this.get(), jQuery( selector, context ) )
+                       )
+               );
+       },
+
+       addBack: function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter( selector )
+               );
+       }
+} );
+
+function sibling( cur, dir ) {
+       while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+       return cur;
+}
+
+jQuery.each( {
+       parent: function( elem ) {
+               var parent = elem.parentNode;
+               return parent && parent.nodeType !== 11 ? parent : null;
+       },
+       parents: function( elem ) {
+               return dir( elem, "parentNode" );
+       },
+       parentsUntil: function( elem, i, until ) {
+               return dir( elem, "parentNode", until );
+       },
+       next: function( elem ) {
+               return sibling( elem, "nextSibling" );
+       },
+       prev: function( elem ) {
+               return sibling( elem, "previousSibling" );
+       },
+       nextAll: function( elem ) {
+               return dir( elem, "nextSibling" );
+       },
+       prevAll: function( elem ) {
+               return dir( elem, "previousSibling" );
+       },
+       nextUntil: function( elem, i, until ) {
+               return dir( elem, "nextSibling", until );
+       },
+       prevUntil: function( elem, i, until ) {
+               return dir( elem, "previousSibling", until );
+       },
+       siblings: function( elem ) {
+               return siblings( ( elem.parentNode || {} ).firstChild, elem );
+       },
+       children: function( elem ) {
+               return siblings( elem.firstChild );
+       },
+       contents: function( elem ) {
+        if ( nodeName( elem, "iframe" ) ) {
+            return elem.contentDocument;
+        }
+
+        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+        // Treat the template element as a regular one in browsers that
+        // don't support it.
+        if ( nodeName( elem, "template" ) ) {
+            elem = elem.content || elem;
+        }
+
+        return jQuery.merge( [], elem.childNodes );
+       }
+}, function( name, fn ) {
+       jQuery.fn[ name ] = function( until, selector ) {
+               var matched = jQuery.map( this, fn, until );
+
+               if ( name.slice( -5 ) !== "Until" ) {
+                       selector = until;
+               }
+
+               if ( selector && typeof selector === "string" ) {
+                       matched = jQuery.filter( selector, matched );
+               }
+
+               if ( this.length > 1 ) {
+
+                       // Remove duplicates
+                       if ( !guaranteedUnique[ name ] ) {
+                               jQuery.uniqueSort( matched );
+                       }
+
+                       // Reverse order for parents* and prev-derivatives
+                       if ( rparentsprev.test( name ) ) {
+                               matched.reverse();
+                       }
+               }
+
+               return this.pushStack( matched );
+       };
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+       var object = {};
+       jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+               object[ flag ] = true;
+       } );
+       return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *     options: an optional list of space-separated options that will change how
+ *                     the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *     once:                   will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *     memory:                 will keep track of previous values and will call any callback added
+ *                                     after the list has been fired right away with the latest "memorized"
+ *                                     values (like a Deferred)
+ *
+ *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *     stopOnFalse:    interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+       // Convert options from String-formatted to Object-formatted if needed
+       // (we check in cache first)
+       options = typeof options === "string" ?
+               createOptions( options ) :
+               jQuery.extend( {}, options );
+
+       var // Flag to know if list is currently firing
+               firing,
+
+               // Last fire value for non-forgettable lists
+               memory,
+
+               // Flag to know if list was already fired
+               fired,
+
+               // Flag to prevent firing
+               locked,
+
+               // Actual callback list
+               list = [],
+
+               // Queue of execution data for repeatable lists
+               queue = [],
+
+               // Index of currently firing callback (modified by add/remove as needed)
+               firingIndex = -1,
+
+               // Fire callbacks
+               fire = function() {
+
+                       // Enforce single-firing
+                       locked = locked || options.once;
+
+                       // Execute callbacks for all pending executions,
+                       // respecting firingIndex overrides and runtime changes
+                       fired = firing = true;
+                       for ( ; queue.length; firingIndex = -1 ) {
+                               memory = queue.shift();
+                               while ( ++firingIndex < list.length ) {
+
+                                       // Run callback and check for early termination
+                                       if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+                                               options.stopOnFalse ) {
+
+                                               // Jump to end and forget the data so .add doesn't re-fire
+                                               firingIndex = list.length;
+                                               memory = false;
+                                       }
+                               }
+                       }
+
+                       // Forget the data if we're done with it
+                       if ( !options.memory ) {
+                               memory = false;
+                       }
+
+                       firing = false;
+
+                       // Clean up if we're done firing for good
+                       if ( locked ) {
+
+                               // Keep an empty list if we have data for future add calls
+                               if ( memory ) {
+                                       list = [];
+
+                               // Otherwise, this object is spent
+                               } else {
+                                       list = "";
+                               }
+                       }
+               },
+
+               // Actual Callbacks object
+               self = {
+
+                       // Add a callback or a collection of callbacks to the list
+                       add: function() {
+                               if ( list ) {
+
+                                       // If we have memory from a past run, we should fire after adding
+                                       if ( memory && !firing ) {
+                                               firingIndex = list.length - 1;
+                                               queue.push( memory );
+                                       }
+
+                                       ( function add( args ) {
+                                               jQuery.each( args, function( _, arg ) {
+                                                       if ( jQuery.isFunction( arg ) ) {
+                                                               if ( !options.unique || !self.has( arg ) ) {
+                                                                       list.push( arg );
+                                                               }
+                                                       } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+
+                                                               // Inspect recursively
+                                                               add( arg );
+                                                       }
+                                               } );
+                                       } )( arguments );
+
+                                       if ( memory && !firing ) {
+                                               fire();
+                                       }
+                               }
+                               return this;
+                       },
+
+                       // Remove a callback from the list
+                       remove: function() {
+                               jQuery.each( arguments, function( _, arg ) {
+                                       var index;
+                                       while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+                                               list.splice( index, 1 );
+
+                                               // Handle firing indexes
+                                               if ( index <= firingIndex ) {
+                                                       firingIndex--;
+                                               }
+                                       }
+                               } );
+                               return this;
+                       },
+
+                       // Check if a given callback is in the list.
+                       // If no argument is given, return whether or not list has callbacks attached.
+                       has: function( fn ) {
+                               return fn ?
+                                       jQuery.inArray( fn, list ) > -1 :
+                                       list.length > 0;
+                       },
+
+                       // Remove all callbacks from the list
+                       empty: function() {
+                               if ( list ) {
+                                       list = [];
+                               }
+                               return this;
+                       },
+
+                       // Disable .fire and .add
+                       // Abort any current/pending executions
+                       // Clear all callbacks and values
+                       disable: function() {
+                               locked = queue = [];
+                               list = memory = "";
+                               return this;
+                       },
+                       disabled: function() {
+                               return !list;
+                       },
+
+                       // Disable .fire
+                       // Also disable .add unless we have memory (since it would have no effect)
+                       // Abort any pending executions
+                       lock: function() {
+                               locked = queue = [];
+                               if ( !memory && !firing ) {
+                                       list = memory = "";
+                               }
+                               return this;
+                       },
+                       locked: function() {
+                               return !!locked;
+                       },
+
+                       // Call all callbacks with the given context and arguments
+                       fireWith: function( context, args ) {
+                               if ( !locked ) {
+                                       args = args || [];
+                                       args = [ context, args.slice ? args.slice() : args ];
+                                       queue.push( args );
+                                       if ( !firing ) {
+                                               fire();
+                                       }
+                               }
+                               return this;
+                       },
+
+                       // Call all the callbacks with the given arguments
+                       fire: function() {
+                               self.fireWith( this, arguments );
+                               return this;
+                       },
+
+                       // To know if the callbacks have already been called at least once
+                       fired: function() {
+                               return !!fired;
+                       }
+               };
+
+       return self;
+};
+
+
+function Identity( v ) {
+       return v;
+}
+function Thrower( ex ) {
+       throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+       var method;
+
+       try {
+
+               // Check for promise aspect first to privilege synchronous behavior
+               if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
+                       method.call( value ).done( resolve ).fail( reject );
+
+               // Other thenables
+               } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
+                       method.call( value, resolve, reject );
+
+               // Other non-thenables
+               } else {
+
+                       // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+                       // * false: [ value ].slice( 0 ) => resolve( value )
+                       // * true: [ value ].slice( 1 ) => resolve()
+                       resolve.apply( undefined, [ value ].slice( noValue ) );
+               }
+
+       // For Promises/A+, convert exceptions into rejections
+       // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+       // Deferred#then to conditionally suppress rejection.
+       } catch ( value ) {
+
+               // Support: Android 4.0 only
+               // Strict mode functions invoked without .call/.apply get global-object context
+               reject.apply( undefined, [ value ] );
+       }
+}
+
+jQuery.extend( {
+
+       Deferred: function( func ) {
+               var tuples = [
+
+                               // action, add listener, callbacks,
+                               // ... .then handlers, argument index, [final state]
+                               [ "notify", "progress", jQuery.Callbacks( "memory" ),
+                                       jQuery.Callbacks( "memory" ), 2 ],
+                               [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+                                       jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+                               [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+                                       jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+                       ],
+                       state = "pending",
+                       promise = {
+                               state: function() {
+                                       return state;
+                               },
+                               always: function() {
+                                       deferred.done( arguments ).fail( arguments );
+                                       return this;
+                               },
+                               "catch": function( fn ) {
+                                       return promise.then( null, fn );
+                               },
+
+                               // Keep pipe for back-compat
+                               pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+                                       var fns = arguments;
+
+                                       return jQuery.Deferred( function( newDefer ) {
+                                               jQuery.each( tuples, function( i, tuple ) {
+
+                                                       // Map tuples (progress, done, fail) to arguments (done, fail, progress)
+                                                       var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+                                                       // deferred.progress(function() { bind to newDefer or newDefer.notify })
+                                                       // deferred.done(function() { bind to newDefer or newDefer.resolve })
+                                                       // deferred.fail(function() { bind to newDefer or newDefer.reject })
+                                                       deferred[ tuple[ 1 ] ]( function() {
+                                                               var returned = fn && fn.apply( this, arguments );
+                                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                       returned.promise()
+                                                                               .progress( newDefer.notify )
+                                                                               .done( newDefer.resolve )
+                                                                               .fail( newDefer.reject );
+                                                               } else {
+                                                                       newDefer[ tuple[ 0 ] + "With" ](
+                                                                               this,
+                                                                               fn ? [ returned ] : arguments
+                                                                       );
+                                                               }
+                                                       } );
+                                               } );
+                                               fns = null;
+                                       } ).promise();
+                               },
+                               then: function( onFulfilled, onRejected, onProgress ) {
+                                       var maxDepth = 0;
+                                       function resolve( depth, deferred, handler, special ) {
+                                               return function() {
+                                                       var that = this,
+                                                               args = arguments,
+                                                               mightThrow = function() {
+                                                                       var returned, then;
+
+                                                                       // Support: Promises/A+ section 2.3.3.3.3
+                                                                       // https://promisesaplus.com/#point-59
+                                                                       // Ignore double-resolution attempts
+                                                                       if ( depth < maxDepth ) {
+                                                                               return;
+                                                                       }
+
+                                                                       returned = handler.apply( that, args );
+
+                                                                       // Support: Promises/A+ section 2.3.1
+                                                                       // https://promisesaplus.com/#point-48
+                                                                       if ( returned === deferred.promise() ) {
+                                                                               throw new TypeError( "Thenable self-resolution" );
+                                                                       }
+
+                                                                       // Support: Promises/A+ sections 2.3.3.1, 3.5
+                                                                       // https://promisesaplus.com/#point-54
+                                                                       // https://promisesaplus.com/#point-75
+                                                                       // Retrieve `then` only once
+                                                                       then = returned &&
+
+                                                                               // Support: Promises/A+ section 2.3.4
+                                                                               // https://promisesaplus.com/#point-64
+                                                                               // Only check objects and functions for thenability
+                                                                               ( typeof returned === "object" ||
+                                                                                       typeof returned === "function" ) &&
+                                                                               returned.then;
+
+                                                                       // Handle a returned thenable
+                                                                       if ( jQuery.isFunction( then ) ) {
+
+                                                                               // Special processors (notify) just wait for resolution
+                                                                               if ( special ) {
+                                                                                       then.call(
+                                                                                               returned,
+                                                                                               resolve( maxDepth, deferred, Identity, special ),
+                                                                                               resolve( maxDepth, deferred, Thrower, special )
+                                                                                       );
+
+                                                                               // Normal processors (resolve) also hook into progress
+                                                                               } else {
+
+                                                                                       // ...and disregard older resolution values
+                                                                                       maxDepth++;
+
+                                                                                       then.call(
+                                                                                               returned,
+                                                                                               resolve( maxDepth, deferred, Identity, special ),
+                                                                                               resolve( maxDepth, deferred, Thrower, special ),
+                                                                                               resolve( maxDepth, deferred, Identity,
+                                                                                                       deferred.notifyWith )
+                                                                                       );
+                                                                               }
+
+                                                                       // Handle all other returned values
+                                                                       } else {
+
+                                                                               // Only substitute handlers pass on context
+                                                                               // and multiple values (non-spec behavior)
+                                                                               if ( handler !== Identity ) {
+                                                                                       that = undefined;
+                                                                                       args = [ returned ];
+                                                                               }
+
+                                                                               // Process the value(s)
+                                                                               // Default process is resolve
+                                                                               ( special || deferred.resolveWith )( that, args );
+                                                                       }
+                                                               },
+
+                                                               // Only normal processors (resolve) catch and reject exceptions
+                                                               process = special ?
+                                                                       mightThrow :
+                                                                       function() {
+                                                                               try {
+                                                                                       mightThrow();
+                                                                               } catch ( e ) {
+
+                                                                                       if ( jQuery.Deferred.exceptionHook ) {
+                                                                                               jQuery.Deferred.exceptionHook( e,
+                                                                                                       process.stackTrace );
+                                                                                       }
+
+                                                                                       // Support: Promises/A+ section 2.3.3.3.4.1
+                                                                                       // https://promisesaplus.com/#point-61
+                                                                                       // Ignore post-resolution exceptions
+                                                                                       if ( depth + 1 >= maxDepth ) {
+
+                                                                                               // Only substitute handlers pass on context
+                                                                                               // and multiple values (non-spec behavior)
+                                                                                               if ( handler !== Thrower ) {
+                                                                                                       that = undefined;
+                                                                                                       args = [ e ];
+                                                                                               }
+
+                                                                                               deferred.rejectWith( that, args );
+                                                                                       }
+                                                                               }
+                                                                       };
+
+                                                       // Support: Promises/A+ section 2.3.3.3.1
+                                                       // https://promisesaplus.com/#point-57
+                                                       // Re-resolve promises immediately to dodge false rejection from
+                                                       // subsequent errors
+                                                       if ( depth ) {
+                                                               process();
+                                                       } else {
+
+                                                               // Call an optional hook to record the stack, in case of exception
+                                                               // since it's otherwise lost when execution goes async
+                                                               if ( jQuery.Deferred.getStackHook ) {
+                                                                       process.stackTrace = jQuery.Deferred.getStackHook();
+                                                               }
+                                                               window.setTimeout( process );
+                                                       }
+                                               };
+                                       }
+
+                                       return jQuery.Deferred( function( newDefer ) {
+
+                                               // progress_handlers.add( ... )
+                                               tuples[ 0 ][ 3 ].add(
+                                                       resolve(
+                                                               0,
+                                                               newDefer,
+                                                               jQuery.isFunction( onProgress ) ?
+                                                                       onProgress :
+                                                                       Identity,
+                                                               newDefer.notifyWith
+                                                       )
+                                               );
+
+                                               // fulfilled_handlers.add( ... )
+                                               tuples[ 1 ][ 3 ].add(
+                                                       resolve(
+                                                               0,
+                                                               newDefer,
+                                                               jQuery.isFunction( onFulfilled ) ?
+                                                                       onFulfilled :
+                                                                       Identity
+                                                       )
+                                               );
+
+                                               // rejected_handlers.add( ... )
+                                               tuples[ 2 ][ 3 ].add(
+                                                       resolve(
+                                                               0,
+                                                               newDefer,
+                                                               jQuery.isFunction( onRejected ) ?
+                                                                       onRejected :
+                                                                       Thrower
+                                                       )
+                                               );
+                                       } ).promise();
+                               },
+
+                               // Get a promise for this deferred
+                               // If obj is provided, the promise aspect is added to the object
+                               promise: function( obj ) {
+                                       return obj != null ? jQuery.extend( obj, promise ) : promise;
+                               }
+                       },
+                       deferred = {};
+
+               // Add list-specific methods
+               jQuery.each( tuples, function( i, tuple ) {
+                       var list = tuple[ 2 ],
+                               stateString = tuple[ 5 ];
+
+                       // promise.progress = list.add
+                       // promise.done = list.add
+                       // promise.fail = list.add
+                       promise[ tuple[ 1 ] ] = list.add;
+
+                       // Handle state
+                       if ( stateString ) {
+                               list.add(
+                                       function() {
+
+                                               // state = "resolved" (i.e., fulfilled)
+                                               // state = "rejected"
+                                               state = stateString;
+                                       },
+
+                                       // rejected_callbacks.disable
+                                       // fulfilled_callbacks.disable
+                                       tuples[ 3 - i ][ 2 ].disable,
+
+                                       // progress_callbacks.lock
+                                       tuples[ 0 ][ 2 ].lock
+                               );
+                       }
+
+                       // progress_handlers.fire
+                       // fulfilled_handlers.fire
+                       // rejected_handlers.fire
+                       list.add( tuple[ 3 ].fire );
+
+                       // deferred.notify = function() { deferred.notifyWith(...) }
+                       // deferred.resolve = function() { deferred.resolveWith(...) }
+                       // deferred.reject = function() { deferred.rejectWith(...) }
+                       deferred[ tuple[ 0 ] ] = function() {
+                               deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+                               return this;
+                       };
+
+                       // deferred.notifyWith = list.fireWith
+                       // deferred.resolveWith = list.fireWith
+                       // deferred.rejectWith = list.fireWith
+                       deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+               } );
+
+               // Make the deferred a promise
+               promise.promise( deferred );
+
+               // Call given func if any
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
+
+               // All done!
+               return deferred;
+       },
+
+       // Deferred helper
+       when: function( singleValue ) {
+               var
+
+                       // count of uncompleted subordinates
+                       remaining = arguments.length,
+
+                       // count of unprocessed arguments
+                       i = remaining,
+
+                       // subordinate fulfillment data
+                       resolveContexts = Array( i ),
+                       resolveValues = slice.call( arguments ),
+
+                       // the master Deferred
+                       master = jQuery.Deferred(),
+
+                       // subordinate callback factory
+                       updateFunc = function( i ) {
+                               return function( value ) {
+                                       resolveContexts[ i ] = this;
+                                       resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+                                       if ( !( --remaining ) ) {
+                                               master.resolveWith( resolveContexts, resolveValues );
+                                       }
+                               };
+                       };
+
+               // Single- and empty arguments are adopted like Promise.resolve
+               if ( remaining <= 1 ) {
+                       adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+                               !remaining );
+
+                       // Use .then() to unwrap secondary thenables (cf. gh-3000)
+                       if ( master.state() === "pending" ||
+                               jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+                               return master.then();
+                       }
+               }
+
+               // Multiple arguments are aggregated like Promise.all array elements
+               while ( i-- ) {
+                       adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+               }
+
+               return master.promise();
+       }
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+       // Support: IE 8 - 9 only
+       // Console exists when dev tools are open, which can happen at any time
+       if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+               window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+       }
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+       window.setTimeout( function() {
+               throw error;
+       } );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+       readyList
+               .then( fn )
+
+               // Wrap jQuery.readyException in a function so that the lookup
+               // happens at the time of error handling instead of callback
+               // registration.
+               .catch( function( error ) {
+                       jQuery.readyException( error );
+               } );
+
+       return this;
+};
+
+jQuery.extend( {
+
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
+
+       // A counter to track how many items to wait for before
+       // the ready event fires. See #6781
+       readyWait: 1,
+
+       // Handle when the DOM is ready
+       ready: function( wait ) {
+
+               // Abort if there are pending holds or we're already ready
+               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+                       return;
+               }
+
+               // Remember that the DOM is ready
+               jQuery.isReady = true;
+
+               // If a normal DOM Ready event fired, decrement, and wait if need be
+               if ( wait !== true && --jQuery.readyWait > 0 ) {
+                       return;
+               }
+
+               // If there are functions bound, to execute
+               readyList.resolveWith( document, [ jQuery ] );
+       }
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+       document.removeEventListener( "DOMContentLoaded", completed );
+       window.removeEventListener( "load", completed );
+       jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+       ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+       // Handle it asynchronously to allow scripts the opportunity to delay ready
+       window.setTimeout( jQuery.ready );
+
+} else {
+
+       // Use the handy event callback
+       document.addEventListener( "DOMContentLoaded", completed );
+
+       // A fallback to window.onload, that will always work
+       window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+       var i = 0,
+               len = elems.length,
+               bulk = key == null;
+
+       // Sets many values
+       if ( jQuery.type( key ) === "object" ) {
+               chainable = true;
+               for ( i in key ) {
+                       access( elems, fn, i, key[ i ], true, emptyGet, raw );
+               }
+
+       // Sets one value
+       } else if ( value !== undefined ) {
+               chainable = true;
+
+               if ( !jQuery.isFunction( value ) ) {
+                       raw = true;
+               }
+
+               if ( bulk ) {
+
+                       // Bulk operations run against the entire set
+                       if ( raw ) {
+                               fn.call( elems, value );
+                               fn = null;
+
+                       // ...except when executing function values
+                       } else {
+                               bulk = fn;
+                               fn = function( elem, key, value ) {
+                                       return bulk.call( jQuery( elem ), value );
+                               };
+                       }
+               }
+
+               if ( fn ) {
+                       for ( ; i < len; i++ ) {
+                               fn(
+                                       elems[ i ], key, raw ?
+                                       value :
+                                       value.call( elems[ i ], i, fn( elems[ i ], key ) )
+                               );
+                       }
+               }
+       }
+
+       if ( chainable ) {
+               return elems;
+       }
+
+       // Gets
+       if ( bulk ) {
+               return fn.call( elems );
+       }
+
+       return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+var acceptData = function( owner ) {
+
+       // Accepts only:
+       //  - Node
+       //    - Node.ELEMENT_NODE
+       //    - Node.DOCUMENT_NODE
+       //  - Object
+       //    - Any
+       return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+       this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+       cache: function( owner ) {
+
+               // Check if the owner object already has a cache
+               var value = owner[ this.expando ];
+
+               // If not, create one
+               if ( !value ) {
+                       value = {};
+
+                       // We can accept data for non-element nodes in modern browsers,
+                       // but we should not, see #8335.
+                       // Always return an empty object.
+                       if ( acceptData( owner ) ) {
+
+                               // If it is a node unlikely to be stringify-ed or looped over
+                               // use plain assignment
+                               if ( owner.nodeType ) {
+                                       owner[ this.expando ] = value;
+
+                               // Otherwise secure it in a non-enumerable property
+                               // configurable must be true to allow the property to be
+                               // deleted when data is removed
+                               } else {
+                                       Object.defineProperty( owner, this.expando, {
+                                               value: value,
+                                               configurable: true
+                                       } );
+                               }
+                       }
+               }
+
+               return value;
+       },
+       set: function( owner, data, value ) {
+               var prop,
+                       cache = this.cache( owner );
+
+               // Handle: [ owner, key, value ] args
+               // Always use camelCase key (gh-2257)
+               if ( typeof data === "string" ) {
+                       cache[ jQuery.camelCase( data ) ] = value;
+
+               // Handle: [ owner, { properties } ] args
+               } else {
+
+                       // Copy the properties one-by-one to the cache object
+                       for ( prop in data ) {
+                               cache[ jQuery.camelCase( prop ) ] = data[ prop ];
+                       }
+               }
+               return cache;
+       },
+       get: function( owner, key ) {
+               return key === undefined ?
+                       this.cache( owner ) :
+
+                       // Always use camelCase key (gh-2257)
+                       owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
+       },
+       access: function( owner, key, value ) {
+
+               // In cases where either:
+               //
+               //   1. No key was specified
+               //   2. A string key was specified, but no value provided
+               //
+               // Take the "read" path and allow the get method to determine
+               // which value to return, respectively either:
+               //
+               //   1. The entire cache object
+               //   2. The data stored at the key
+               //
+               if ( key === undefined ||
+                               ( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+                       return this.get( owner, key );
+               }
+
+               // When the key is not a string, or both a key and value
+               // are specified, set or extend (existing objects) with either:
+               //
+               //   1. An object of properties
+               //   2. A key and value
+               //
+               this.set( owner, key, value );
+
+               // Since the "set" path can have two possible entry points
+               // return the expected data based on which path was taken[*]
+               return value !== undefined ? value : key;
+       },
+       remove: function( owner, key ) {
+               var i,
+                       cache = owner[ this.expando ];
+
+               if ( cache === undefined ) {
+                       return;
+               }
+
+               if ( key !== undefined ) {
+
+                       // Support array or space separated string of keys
+                       if ( Array.isArray( key ) ) {
+
+                               // If key is an array of keys...
+                               // We always set camelCase keys, so remove that.
+                               key = key.map( jQuery.camelCase );
+                       } else {
+                               key = jQuery.camelCase( key );
+
+                               // If a key with the spaces exists, use it.
+                               // Otherwise, create an array by matching non-whitespace
+                               key = key in cache ?
+                                       [ key ] :
+                                       ( key.match( rnothtmlwhite ) || [] );
+                       }
+
+                       i = key.length;
+
+                       while ( i-- ) {
+                               delete cache[ key[ i ] ];
+                       }
+               }
+
+               // Remove the expando if there's no more data
+               if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+                       // Support: Chrome <=35 - 45
+                       // Webkit & Blink performance suffers when deleting properties
+                       // from DOM nodes, so set to undefined instead
+                       // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+                       if ( owner.nodeType ) {
+                               owner[ this.expando ] = undefined;
+                       } else {
+                               delete owner[ this.expando ];
+                       }
+               }
+       },
+       hasData: function( owner ) {
+               var cache = owner[ this.expando ];
+               return cache !== undefined && !jQuery.isEmptyObject( cache );
+       }
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+//     Implementation Summary
+//
+//     1. Enforce API surface and semantic compatibility with 1.9.x branch
+//     2. Improve the module's maintainability by reducing the storage
+//             paths to a single mechanism.
+//     3. Use the same single mechanism to support "private" and "user" data.
+//     4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+//     5. Avoid exposing implementation details on user objects (eg. expando properties)
+//     6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+       rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+       if ( data === "true" ) {
+               return true;
+       }
+
+       if ( data === "false" ) {
+               return false;
+       }
+
+       if ( data === "null" ) {
+               return null;
+       }
+
+       // Only convert to a number if it doesn't change the string
+       if ( data === +data + "" ) {
+               return +data;
+       }
+
+       if ( rbrace.test( data ) ) {
+               return JSON.parse( data );
+       }
+
+       return data;
+}
+
+function dataAttr( elem, key, data ) {
+       var name;
+
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
+               name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+               data = elem.getAttribute( name );
+
+               if ( typeof data === "string" ) {
+                       try {
+                               data = getData( data );
+                       } catch ( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       dataUser.set( elem, key, data );
+               } else {
+                       data = undefined;
+               }
+       }
+       return data;
+}
+
+jQuery.extend( {
+       hasData: function( elem ) {
+               return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+       },
+
+       data: function( elem, name, data ) {
+               return dataUser.access( elem, name, data );
+       },
+
+       removeData: function( elem, name ) {
+               dataUser.remove( elem, name );
+       },
+
+       // TODO: Now that all calls to _data and _removeData have been replaced
+       // with direct calls to dataPriv methods, these can be deprecated.
+       _data: function( elem, name, data ) {
+               return dataPriv.access( elem, name, data );
+       },
+
+       _removeData: function( elem, name ) {
+               dataPriv.remove( elem, name );
+       }
+} );
+
+jQuery.fn.extend( {
+       data: function( key, value ) {
+               var i, name, data,
+                       elem = this[ 0 ],
+                       attrs = elem && elem.attributes;
+
+               // Gets all values
+               if ( key === undefined ) {
+                       if ( this.length ) {
+                               data = dataUser.get( elem );
+
+                               if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+                                       i = attrs.length;
+                                       while ( i-- ) {
+
+                                               // Support: IE 11 only
+                                               // The attrs elements can be null (#14894)
+                                               if ( attrs[ i ] ) {
+                                                       name = attrs[ i ].name;
+                                                       if ( name.indexOf( "data-" ) === 0 ) {
+                                                               name = jQuery.camelCase( name.slice( 5 ) );
+                                                               dataAttr( elem, name, data[ name ] );
+                                                       }
+                                               }
+                                       }
+                                       dataPriv.set( elem, "hasDataAttrs", true );
+                               }
+                       }
+
+                       return data;
+               }
+
+               // Sets multiple values
+               if ( typeof key === "object" ) {
+                       return this.each( function() {
+                               dataUser.set( this, key );
+                       } );
+               }
+
+               return access( this, function( value ) {
+                       var data;
+
+                       // The calling jQuery object (element matches) is not empty
+                       // (and therefore has an element appears at this[ 0 ]) and the
+                       // `value` parameter was not undefined. An empty jQuery object
+                       // will result in `undefined` for elem = this[ 0 ] which will
+                       // throw an exception if an attempt to read a data cache is made.
+                       if ( elem && value === undefined ) {
+
+                               // Attempt to get data from the cache
+                               // The key will always be camelCased in Data
+                               data = dataUser.get( elem, key );
+                               if ( data !== undefined ) {
+                                       return data;
+                               }
+
+                               // Attempt to "discover" the data in
+                               // HTML5 custom data-* attrs
+                               data = dataAttr( elem, key );
+                               if ( data !== undefined ) {
+                                       return data;
+                               }
+
+                               // We tried really hard, but the data doesn't exist.
+                               return;
+                       }
+
+                       // Set the data...
+                       this.each( function() {
+
+                               // We always store the camelCased key
+                               dataUser.set( this, key, value );
+                       } );
+               }, null, value, arguments.length > 1, null, true );
+       },
+
+       removeData: function( key ) {
+               return this.each( function() {
+                       dataUser.remove( this, key );
+               } );
+       }
+} );
+
+
+jQuery.extend( {
+       queue: function( elem, type, data ) {
+               var queue;
+
+               if ( elem ) {
+                       type = ( type || "fx" ) + "queue";
+                       queue = dataPriv.get( elem, type );
+
+                       // Speed up dequeue by getting out quickly if this is just a lookup
+                       if ( data ) {
+                               if ( !queue || Array.isArray( data ) ) {
+                                       queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+                               } else {
+                                       queue.push( data );
+                               }
+                       }
+                       return queue || [];
+               }
+       },
+
+       dequeue: function( elem, type ) {
+               type = type || "fx";
+
+               var queue = jQuery.queue( elem, type ),
+                       startLength = queue.length,
+                       fn = queue.shift(),
+                       hooks = jQuery._queueHooks( elem, type ),
+                       next = function() {
+                               jQuery.dequeue( elem, type );
+                       };
+
+               // If the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+                       startLength--;
+               }
+
+               if ( fn ) {
+
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift( "inprogress" );
+                       }
+
+                       // Clear up the last queue stop function
+                       delete hooks.stop;
+                       fn.call( elem, next, hooks );
+               }
+
+               if ( !startLength && hooks ) {
+                       hooks.empty.fire();
+               }
+       },
+
+       // Not public - generate a queueHooks object, or return the current one
+       _queueHooks: function( elem, type ) {
+               var key = type + "queueHooks";
+               return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+                       empty: jQuery.Callbacks( "once memory" ).add( function() {
+                               dataPriv.remove( elem, [ type + "queue", key ] );
+                       } )
+               } );
+       }
+} );
+
+jQuery.fn.extend( {
+       queue: function( type, data ) {
+               var setter = 2;
+
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+                       setter--;
+               }
+
+               if ( arguments.length < setter ) {
+                       return jQuery.queue( this[ 0 ], type );
+               }
+
+               return data === undefined ?
+                       this :
+                       this.each( function() {
+                               var queue = jQuery.queue( this, type, data );
+
+                               // Ensure a hooks for this queue
+                               jQuery._queueHooks( this, type );
+
+                               if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+                                       jQuery.dequeue( this, type );
+                               }
+                       } );
+       },
+       dequeue: function( type ) {
+               return this.each( function() {
+                       jQuery.dequeue( this, type );
+               } );
+       },
+       clearQueue: function( type ) {
+               return this.queue( type || "fx", [] );
+       },
+
+       // Get a promise resolved when queues of a certain type
+       // are emptied (fx is the type by default)
+       promise: function( type, obj ) {
+               var tmp,
+                       count = 1,
+                       defer = jQuery.Deferred(),
+                       elements = this,
+                       i = this.length,
+                       resolve = function() {
+                               if ( !( --count ) ) {
+                                       defer.resolveWith( elements, [ elements ] );
+                               }
+                       };
+
+               if ( typeof type !== "string" ) {
+                       obj = type;
+                       type = undefined;
+               }
+               type = type || "fx";
+
+               while ( i-- ) {
+                       tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+                       if ( tmp && tmp.empty ) {
+                               count++;
+                               tmp.empty.add( resolve );
+                       }
+               }
+               resolve();
+               return defer.promise( obj );
+       }
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHiddenWithinTree = function( elem, el ) {
+
+               // isHiddenWithinTree might be called from jQuery#filter function;
+               // in that case, element will be second argument
+               elem = el || elem;
+
+               // Inline style trumps all
+               return elem.style.display === "none" ||
+                       elem.style.display === "" &&
+
+                       // Otherwise, check computed style
+                       // Support: Firefox <=43 - 45
+                       // Disconnected elements can have computed display: none, so first confirm that elem is
+                       // in the document.
+                       jQuery.contains( elem.ownerDocument, elem ) &&
+
+                       jQuery.css( elem, "display" ) === "none";
+       };
+
+var swap = function( elem, options, callback, args ) {
+       var ret, name,
+               old = {};
+
+       // Remember the old values, and insert the new ones
+       for ( name in options ) {
+               old[ name ] = elem.style[ name ];
+               elem.style[ name ] = options[ name ];
+       }
+
+       ret = callback.apply( elem, args || [] );
+
+       // Revert the old values
+       for ( name in options ) {
+               elem.style[ name ] = old[ name ];
+       }
+
+       return ret;
+};
+
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+       var adjusted,
+               scale = 1,
+               maxIterations = 20,
+               currentValue = tween ?
+                       function() {
+                               return tween.cur();
+                       } :
+                       function() {
+                               return jQuery.css( elem, prop, "" );
+                       },
+               initial = currentValue(),
+               unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+               // Starting value computation is required for potential unit mismatches
+               initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+                       rcssNum.exec( jQuery.css( elem, prop ) );
+
+       if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+               // Trust units reported by jQuery.css
+               unit = unit || initialInUnit[ 3 ];
+
+               // Make sure we update the tween properties later on
+               valueParts = valueParts || [];
+
+               // Iteratively approximate from a nonzero starting point
+               initialInUnit = +initial || 1;
+
+               do {
+
+                       // If previous iteration zeroed out, double until we get *something*.
+                       // Use string for doubling so we don't accidentally see scale as unchanged below
+                       scale = scale || ".5";
+
+                       // Adjust and apply
+                       initialInUnit = initialInUnit / scale;
+                       jQuery.style( elem, prop, initialInUnit + unit );
+
+               // Update scale, tolerating zero or NaN from tween.cur()
+               // Break the loop if scale is unchanged or perfect, or if we've just had enough.
+               } while (
+                       scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
+               );
+       }
+
+       if ( valueParts ) {
+               initialInUnit = +initialInUnit || +initial || 0;
+
+               // Apply relative offset (+=/-=) if specified
+               adjusted = valueParts[ 1 ] ?
+                       initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+                       +valueParts[ 2 ];
+               if ( tween ) {
+                       tween.unit = unit;
+                       tween.start = initialInUnit;
+                       tween.end = adjusted;
+               }
+       }
+       return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+       var temp,
+               doc = elem.ownerDocument,
+               nodeName = elem.nodeName,
+               display = defaultDisplayMap[ nodeName ];
+
+       if ( display ) {
+               return display;
+       }
+
+       temp = doc.body.appendChild( doc.createElement( nodeName ) );
+       display = jQuery.css( temp, "display" );
+
+       temp.parentNode.removeChild( temp );
+
+       if ( display === "none" ) {
+               display = "block";
+       }
+       defaultDisplayMap[ nodeName ] = display;
+
+       return display;
+}
+
+function showHide( elements, show ) {
+       var display, elem,
+               values = [],
+               index = 0,
+               length = elements.length;
+
+       // Determine new display value for elements that need to change
+       for ( ; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+
+               display = elem.style.display;
+               if ( show ) {
+
+                       // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+                       // check is required in this first loop unless we have a nonempty display value (either
+                       // inline or about-to-be-restored)
+                       if ( display === "none" ) {
+                               values[ index ] = dataPriv.get( elem, "display" ) || null;
+                               if ( !values[ index ] ) {
+                                       elem.style.display = "";
+                               }
+                       }
+                       if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+                               values[ index ] = getDefaultDisplay( elem );
+                       }
+               } else {
+                       if ( display !== "none" ) {
+                               values[ index ] = "none";
+
+                               // Remember what we're overwriting
+                               dataPriv.set( elem, "display", display );
+                       }
+               }
+       }
+
+       // Set the display of the elements in a second loop to avoid constant reflow
+       for ( index = 0; index < length; index++ ) {
+               if ( values[ index ] != null ) {
+                       elements[ index ].style.display = values[ index ];
+               }
+       }
+
+       return elements;
+}
+
+jQuery.fn.extend( {
+       show: function() {
+               return showHide( this, true );
+       },
+       hide: function() {
+               return showHide( this );
+       },
+       toggle: function( state ) {
+               if ( typeof state === "boolean" ) {
+                       return state ? this.show() : this.hide();
+               }
+
+               return this.each( function() {
+                       if ( isHiddenWithinTree( this ) ) {
+                               jQuery( this ).show();
+                       } else {
+                               jQuery( this ).hide();
+                       }
+               } );
+       }
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
+
+var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+       // Support: IE <=9 only
+       option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+       // XHTML parsers do not magically insert elements in the
+       // same way that tag soup parsers do. So we cannot shorten
+       // this by omitting <tbody> or other required elements.
+       thead: [ 1, "<table>", "</table>" ],
+       col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+       tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+       td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+       _default: [ 0, "", "" ]
+};
+
+// Support: IE <=9 only
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+       // Support: IE <=9 - 11 only
+       // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+       var ret;
+
+       if ( typeof context.getElementsByTagName !== "undefined" ) {
+               ret = context.getElementsByTagName( tag || "*" );
+
+       } else if ( typeof context.querySelectorAll !== "undefined" ) {
+               ret = context.querySelectorAll( tag || "*" );
+
+       } else {
+               ret = [];
+       }
+
+       if ( tag === undefined || tag && nodeName( context, tag ) ) {
+               return jQuery.merge( [ context ], ret );
+       }
+
+       return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+       var i = 0,
+               l = elems.length;
+
+       for ( ; i < l; i++ ) {
+               dataPriv.set(
+                       elems[ i ],
+                       "globalEval",
+                       !refElements || dataPriv.get( refElements[ i ], "globalEval" )
+               );
+       }
+}
+
+
+var rhtml = /<|&#?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+       var elem, tmp, tag, wrap, contains, j,
+               fragment = context.createDocumentFragment(),
+               nodes = [],
+               i = 0,
+               l = elems.length;
+
+       for ( ; i < l; i++ ) {
+               elem = elems[ i ];
+
+               if ( elem || elem === 0 ) {
+
+                       // Add nodes directly
+                       if ( jQuery.type( elem ) === "object" ) {
+
+                               // Support: Android <=4.0 only, PhantomJS 1 only
+                               // push.apply(_, arraylike) throws on ancient WebKit
+                               jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+                       // Convert non-html into a text node
+                       } else if ( !rhtml.test( elem ) ) {
+                               nodes.push( context.createTextNode( elem ) );
+
+                       // Convert html into DOM nodes
+                       } else {
+                               tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+                               // Deserialize a standard representation
+                               tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+                               wrap = wrapMap[ tag ] || wrapMap._default;
+                               tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+                               // Descend through wrappers to the right content
+                               j = wrap[ 0 ];
+                               while ( j-- ) {
+                                       tmp = tmp.lastChild;
+                               }
+
+                               // Support: Android <=4.0 only, PhantomJS 1 only
+                               // push.apply(_, arraylike) throws on ancient WebKit
+                               jQuery.merge( nodes, tmp.childNodes );
+
+                               // Remember the top-level container
+                               tmp = fragment.firstChild;
+
+                               // Ensure the created nodes are orphaned (#12392)
+                               tmp.textContent = "";
+                       }
+               }
+       }
+
+       // Remove wrapper from fragment
+       fragment.textContent = "";
+
+       i = 0;
+       while ( ( elem = nodes[ i++ ] ) ) {
+
+               // Skip elements already in the context collection (trac-4087)
+               if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+                       if ( ignored ) {
+                               ignored.push( elem );
+                       }
+                       continue;
+               }
+
+               contains = jQuery.contains( elem.ownerDocument, elem );
+
+               // Append to fragment
+               tmp = getAll( fragment.appendChild( elem ), "script" );
+
+               // Preserve script evaluation history
+               if ( contains ) {
+                       setGlobalEval( tmp );
+               }
+
+               // Capture executables
+               if ( scripts ) {
+                       j = 0;
+                       while ( ( elem = tmp[ j++ ] ) ) {
+                               if ( rscriptType.test( elem.type || "" ) ) {
+                                       scripts.push( elem );
+                               }
+                       }
+               }
+       }
+
+       return fragment;
+}
+
+
+( function() {
+       var fragment = document.createDocumentFragment(),
+               div = fragment.appendChild( document.createElement( "div" ) ),
+               input = document.createElement( "input" );
+
+       // Support: Android 4.0 - 4.3 only
+       // Check state lost if the name is set (#11217)
+       // Support: Windows Web Apps (WWA)
+       // `name` and `type` must use .setAttribute for WWA (#14901)
+       input.setAttribute( "type", "radio" );
+       input.setAttribute( "checked", "checked" );
+       input.setAttribute( "name", "t" );
+
+       div.appendChild( input );
+
+       // Support: Android <=4.1 only
+       // Older WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+       // Support: IE <=11 only
+       // Make sure textarea (and checkbox) defaultValue is properly cloned
+       div.innerHTML = "<textarea>x</textarea>";
+       support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+var documentElement = document.documentElement;
+
+
+
+var
+       rkeyEvent = /^key/,
+       rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+       rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+       return true;
+}
+
+function returnFalse() {
+       return false;
+}
+
+// Support: IE <=9 only
+// See #13393 for more info
+function safeActiveElement() {
+       try {
+               return document.activeElement;
+       } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+       var origFn, type;
+
+       // Types can be a map of types/handlers
+       if ( typeof types === "object" ) {
+
+               // ( types-Object, selector, data )
+               if ( typeof selector !== "string" ) {
+
+                       // ( types-Object, data )
+                       data = data || selector;
+                       selector = undefined;
+               }
+               for ( type in types ) {
+                       on( elem, type, selector, data, types[ type ], one );
+               }
+               return elem;
+       }
+
+       if ( data == null && fn == null ) {
+
+               // ( types, fn )
+               fn = selector;
+               data = selector = undefined;
+       } else if ( fn == null ) {
+               if ( typeof selector === "string" ) {
+
+                       // ( types, selector, fn )
+                       fn = data;
+                       data = undefined;
+               } else {
+
+                       // ( types, data, fn )
+                       fn = data;
+                       data = selector;
+                       selector = undefined;
+               }
+       }
+       if ( fn === false ) {
+               fn = returnFalse;
+       } else if ( !fn ) {
+               return elem;
+       }
+
+       if ( one === 1 ) {
+               origFn = fn;
+               fn = function( event ) {
+
+                       // Can use an empty set, since event contains the info
+                       jQuery().off( event );
+                       return origFn.apply( this, arguments );
+               };
+
+               // Use same guid so caller can remove using origFn
+               fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+       }
+       return elem.each( function() {
+               jQuery.event.add( this, types, fn, data, selector );
+       } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+       global: {},
+
+       add: function( elem, types, handler, data, selector ) {
+
+               var handleObjIn, eventHandle, tmp,
+                       events, t, handleObj,
+                       special, handlers, type, namespaces, origType,
+                       elemData = dataPriv.get( elem );
+
+               // Don't attach events to noData or text/comment nodes (but allow plain objects)
+               if ( !elemData ) {
+                       return;
+               }
+
+               // Caller can pass in an object of custom data in lieu of the handler
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+                       selector = handleObjIn.selector;
+               }
+
+               // Ensure that invalid selectors throw exceptions at attach time
+               // Evaluate against documentElement in case elem is a non-element node (e.g., document)
+               if ( selector ) {
+                       jQuery.find.matchesSelector( documentElement, selector );
+               }
+
+               // Make sure that the handler has a unique ID, used to find/remove it later
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
+               }
+
+               // Init the element's event structure and main handler, if this is the first
+               if ( !( events = elemData.events ) ) {
+                       events = elemData.events = {};
+               }
+               if ( !( eventHandle = elemData.handle ) ) {
+                       eventHandle = elemData.handle = function( e ) {
+
+                               // Discard the second event of a jQuery.event.trigger() and
+                               // when an event is called after a page has unloaded
+                               return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+                                       jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+                       };
+               }
+
+               // Handle multiple events separated by a space
+               types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+               t = types.length;
+               while ( t-- ) {
+                       tmp = rtypenamespace.exec( types[ t ] ) || [];
+                       type = origType = tmp[ 1 ];
+                       namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+                       // There *must* be a type, no attaching namespace-only handlers
+                       if ( !type ) {
+                               continue;
+                       }
+
+                       // If event changes its type, use the special event handlers for the changed type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // If selector defined, determine special event api type, otherwise given type
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+
+                       // Update special based on newly reset type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // handleObj is passed to all event handlers
+                       handleObj = jQuery.extend( {
+                               type: type,
+                               origType: origType,
+                               data: data,
+                               handler: handler,
+                               guid: handler.guid,
+                               selector: selector,
+                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+                               namespace: namespaces.join( "." )
+                       }, handleObjIn );
+
+                       // Init the event handler queue if we're the first
+                       if ( !( handlers = events[ type ] ) ) {
+                               handlers = events[ type ] = [];
+                               handlers.delegateCount = 0;
+
+                               // Only use addEventListener if the special events handler returns false
+                               if ( !special.setup ||
+                                       special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+                                       if ( elem.addEventListener ) {
+                                               elem.addEventListener( type, eventHandle );
+                                       }
+                               }
+                       }
+
+                       if ( special.add ) {
+                               special.add.call( elem, handleObj );
+
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
+                               }
+                       }
+
+                       // Add to the element's handler list, delegates in front
+                       if ( selector ) {
+                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+                       } else {
+                               handlers.push( handleObj );
+                       }
+
+                       // Keep track of which events have ever been used, for event optimization
+                       jQuery.event.global[ type ] = true;
+               }
+
+       },
+
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, selector, mappedTypes ) {
+
+               var j, origCount, tmp,
+                       events, t, handleObj,
+                       special, handlers, type, namespaces, origType,
+                       elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+               if ( !elemData || !( events = elemData.events ) ) {
+                       return;
+               }
+
+               // Once for each type.namespace in types; type may be omitted
+               types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+               t = types.length;
+               while ( t-- ) {
+                       tmp = rtypenamespace.exec( types[ t ] ) || [];
+                       type = origType = tmp[ 1 ];
+                       namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+                       // Unbind all events (on this namespace, if provided) for the element
+                       if ( !type ) {
+                               for ( type in events ) {
+                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+                               }
+                               continue;
+                       }
+
+                       special = jQuery.event.special[ type ] || {};
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+                       handlers = events[ type ] || [];
+                       tmp = tmp[ 2 ] &&
+                               new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+                       // Remove matching events
+                       origCount = j = handlers.length;
+                       while ( j-- ) {
+                               handleObj = handlers[ j ];
+
+                               if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                       ( !handler || handler.guid === handleObj.guid ) &&
+                                       ( !tmp || tmp.test( handleObj.namespace ) ) &&
+                                       ( !selector || selector === handleObj.selector ||
+                                               selector === "**" && handleObj.selector ) ) {
+                                       handlers.splice( j, 1 );
+
+                                       if ( handleObj.selector ) {
+                                               handlers.delegateCount--;
+                                       }
+                                       if ( special.remove ) {
+                                               special.remove.call( elem, handleObj );
+                                       }
+                               }
+                       }
+
+                       // Remove generic event handler if we removed something and no more handlers exist
+                       // (avoids potential for endless recursion during removal of special event handlers)
+                       if ( origCount && !handlers.length ) {
+                               if ( !special.teardown ||
+                                       special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+                                       jQuery.removeEvent( elem, type, elemData.handle );
+                               }
+
+                               delete events[ type ];
+                       }
+               }
+
+               // Remove data and the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       dataPriv.remove( elem, "handle events" );
+               }
+       },
+
+       dispatch: function( nativeEvent ) {
+
+               // Make a writable jQuery.Event from the native event object
+               var event = jQuery.event.fix( nativeEvent );
+
+               var i, j, ret, matched, handleObj, handlerQueue,
+                       args = new Array( arguments.length ),
+                       handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+                       special = jQuery.event.special[ event.type ] || {};
+
+               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               args[ 0 ] = event;
+
+               for ( i = 1; i < arguments.length; i++ ) {
+                       args[ i ] = arguments[ i ];
+               }
+
+               event.delegateTarget = this;
+
+               // Call the preDispatch hook for the mapped type, and let it bail if desired
+               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+                       return;
+               }
+
+               // Determine handlers
+               handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+               // Run delegates first; they may want to stop propagation beneath us
+               i = 0;
+               while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+                       event.currentTarget = matched.elem;
+
+                       j = 0;
+                       while ( ( handleObj = matched.handlers[ j++ ] ) &&
+                               !event.isImmediatePropagationStopped() ) {
+
+                               // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+                               // a subset or equal to those in the bound event (both can have no namespace).
+                               if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+                                       event.handleObj = handleObj;
+                                       event.data = handleObj.data;
+
+                                       ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+                                               handleObj.handler ).apply( matched.elem, args );
+
+                                       if ( ret !== undefined ) {
+                                               if ( ( event.result = ret ) === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               // Call the postDispatch hook for the mapped type
+               if ( special.postDispatch ) {
+                       special.postDispatch.call( this, event );
+               }
+
+               return event.result;
+       },
+
+       handlers: function( event, handlers ) {
+               var i, handleObj, sel, matchedHandlers, matchedSelectors,
+                       handlerQueue = [],
+                       delegateCount = handlers.delegateCount,
+                       cur = event.target;
+
+               // Find delegate handlers
+               if ( delegateCount &&
+
+                       // Support: IE <=9
+                       // Black-hole SVG <use> instance trees (trac-13180)
+                       cur.nodeType &&
+
+                       // Support: Firefox <=42
+                       // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+                       // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+                       // Support: IE 11 only
+                       // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+                       !( event.type === "click" && event.button >= 1 ) ) {
+
+                       for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+                               // Don't check non-elements (#13208)
+                               // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+                               if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+                                       matchedHandlers = [];
+                                       matchedSelectors = {};
+                                       for ( i = 0; i < delegateCount; i++ ) {
+                                               handleObj = handlers[ i ];
+
+                                               // Don't conflict with Object.prototype properties (#13203)
+                                               sel = handleObj.selector + " ";
+
+                                               if ( matchedSelectors[ sel ] === undefined ) {
+                                                       matchedSelectors[ sel ] = handleObj.needsContext ?
+                                                               jQuery( sel, this ).index( cur ) > -1 :
+                                                               jQuery.find( sel, this, null, [ cur ] ).length;
+                                               }
+                                               if ( matchedSelectors[ sel ] ) {
+                                                       matchedHandlers.push( handleObj );
+                                               }
+                                       }
+                                       if ( matchedHandlers.length ) {
+                                               handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+                                       }
+                               }
+                       }
+               }
+
+               // Add the remaining (directly-bound) handlers
+               cur = this;
+               if ( delegateCount < handlers.length ) {
+                       handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+               }
+
+               return handlerQueue;
+       },
+
+       addProp: function( name, hook ) {
+               Object.defineProperty( jQuery.Event.prototype, name, {
+                       enumerable: true,
+                       configurable: true,
+
+                       get: jQuery.isFunction( hook ) ?
+                               function() {
+                                       if ( this.originalEvent ) {
+                                                       return hook( this.originalEvent );
+                                       }
+                               } :
+                               function() {
+                                       if ( this.originalEvent ) {
+                                                       return this.originalEvent[ name ];
+                                       }
+                               },
+
+                       set: function( value ) {
+                               Object.defineProperty( this, name, {
+                                       enumerable: true,
+                                       configurable: true,
+                                       writable: true,
+                                       value: value
+                               } );
+                       }
+               } );
+       },
+
+       fix: function( originalEvent ) {
+               return originalEvent[ jQuery.expando ] ?
+                       originalEvent :
+                       new jQuery.Event( originalEvent );
+       },
+
+       special: {
+               load: {
+
+                       // Prevent triggered image.load events from bubbling to window.load
+                       noBubble: true
+               },
+               focus: {
+
+                       // Fire native event if possible so blur/focus sequence is correct
+                       trigger: function() {
+                               if ( this !== safeActiveElement() && this.focus ) {
+                                       this.focus();
+                                       return false;
+                               }
+                       },
+                       delegateType: "focusin"
+               },
+               blur: {
+                       trigger: function() {
+                               if ( this === safeActiveElement() && this.blur ) {
+                                       this.blur();
+                                       return false;
+                               }
+                       },
+                       delegateType: "focusout"
+               },
+               click: {
+
+                       // For checkbox, fire native event so checked state will be right
+                       trigger: function() {
+                               if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
+                                       this.click();
+                                       return false;
+                               }
+                       },
+
+                       // For cross-browser consistency, don't fire native .click() on links
+                       _default: function( event ) {
+                               return nodeName( event.target, "a" );
+                       }
+               },
+
+               beforeunload: {
+                       postDispatch: function( event ) {
+
+                               // Support: Firefox 20+
+                               // Firefox doesn't alert if the returnValue field is not set.
+                               if ( event.result !== undefined && event.originalEvent ) {
+                                       event.originalEvent.returnValue = event.result;
+                               }
+                       }
+               }
+       }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+       // This "if" is needed for plain objects
+       if ( elem.removeEventListener ) {
+               elem.removeEventListener( type, handle );
+       }
+};
+
+jQuery.Event = function( src, props ) {
+
+       // Allow instantiation without the 'new' keyword
+       if ( !( this instanceof jQuery.Event ) ) {
+               return new jQuery.Event( src, props );
+       }
+
+       // Event object
+       if ( src && src.type ) {
+               this.originalEvent = src;
+               this.type = src.type;
+
+               // Events bubbling up the document may have been marked as prevented
+               // by a handler lower down the tree; reflect the correct value.
+               this.isDefaultPrevented = src.defaultPrevented ||
+                               src.defaultPrevented === undefined &&
+
+                               // Support: Android <=2.3 only
+                               src.returnValue === false ?
+                       returnTrue :
+                       returnFalse;
+
+               // Create target properties
+               // Support: Safari <=6 - 7 only
+               // Target should not be a text node (#504, #13143)
+               this.target = ( src.target && src.target.nodeType === 3 ) ?
+                       src.target.parentNode :
+                       src.target;
+
+               this.currentTarget = src.currentTarget;
+               this.relatedTarget = src.relatedTarget;
+
+       // Event type
+       } else {
+               this.type = src;
+       }
+
+       // Put explicitly provided properties onto the event object
+       if ( props ) {
+               jQuery.extend( this, props );
+       }
+
+       // Create a timestamp if incoming event doesn't have one
+       this.timeStamp = src && src.timeStamp || jQuery.now();
+
+       // Mark it as fixed
+       this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+       constructor: jQuery.Event,
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse,
+       isSimulated: false,
+
+       preventDefault: function() {
+               var e = this.originalEvent;
+
+               this.isDefaultPrevented = returnTrue;
+
+               if ( e && !this.isSimulated ) {
+                       e.preventDefault();
+               }
+       },
+       stopPropagation: function() {
+               var e = this.originalEvent;
+
+               this.isPropagationStopped = returnTrue;
+
+               if ( e && !this.isSimulated ) {
+                       e.stopPropagation();
+               }
+       },
+       stopImmediatePropagation: function() {
+               var e = this.originalEvent;
+
+               this.isImmediatePropagationStopped = returnTrue;
+
+               if ( e && !this.isSimulated ) {
+                       e.stopImmediatePropagation();
+               }
+
+               this.stopPropagation();
+       }
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+       altKey: true,
+       bubbles: true,
+       cancelable: true,
+       changedTouches: true,
+       ctrlKey: true,
+       detail: true,
+       eventPhase: true,
+       metaKey: true,
+       pageX: true,
+       pageY: true,
+       shiftKey: true,
+       view: true,
+       "char": true,
+       charCode: true,
+       key: true,
+       keyCode: true,
+       button: true,
+       buttons: true,
+       clientX: true,
+       clientY: true,
+       offsetX: true,
+       offsetY: true,
+       pointerId: true,
+       pointerType: true,
+       screenX: true,
+       screenY: true,
+       targetTouches: true,
+       toElement: true,
+       touches: true,
+
+       which: function( event ) {
+               var button = event.button;
+
+               // Add which for key events
+               if ( event.which == null && rkeyEvent.test( event.type ) ) {
+                       return event.charCode != null ? event.charCode : event.keyCode;
+               }
+
+               // Add which for click: 1 === left; 2 === middle; 3 === right
+               if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
+                       if ( button & 1 ) {
+                               return 1;
+                       }
+
+                       if ( button & 2 ) {
+                               return 3;
+                       }
+
+                       if ( button & 4 ) {
+                               return 2;
+                       }
+
+                       return 0;
+               }
+
+               return event.which;
+       }
+}, jQuery.event.addProp );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+       mouseenter: "mouseover",
+       mouseleave: "mouseout",
+       pointerenter: "pointerover",
+       pointerleave: "pointerout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = {
+               delegateType: fix,
+               bindType: fix,
+
+               handle: function( event ) {
+                       var ret,
+                               target = this,
+                               related = event.relatedTarget,
+                               handleObj = event.handleObj;
+
+                       // For mouseenter/leave call the handler if related is outside the target.
+                       // NB: No relatedTarget if the mouse left/entered the browser window
+                       if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+                               event.type = handleObj.origType;
+                               ret = handleObj.handler.apply( this, arguments );
+                               event.type = fix;
+                       }
+                       return ret;
+               }
+       };
+} );
+
+jQuery.fn.extend( {
+
+       on: function( types, selector, data, fn ) {
+               return on( this, types, selector, data, fn );
+       },
+       one: function( types, selector, data, fn ) {
+               return on( this, types, selector, data, fn, 1 );
+       },
+       off: function( types, selector, fn ) {
+               var handleObj, type;
+               if ( types && types.preventDefault && types.handleObj ) {
+
+                       // ( event )  dispatched jQuery.Event
+                       handleObj = types.handleObj;
+                       jQuery( types.delegateTarget ).off(
+                               handleObj.namespace ?
+                                       handleObj.origType + "." + handleObj.namespace :
+                                       handleObj.origType,
+                               handleObj.selector,
+                               handleObj.handler
+                       );
+                       return this;
+               }
+               if ( typeof types === "object" ) {
+
+                       // ( types-object [, selector] )
+                       for ( type in types ) {
+                               this.off( type, selector, types[ type ] );
+                       }
+                       return this;
+               }
+               if ( selector === false || typeof selector === "function" ) {
+
+                       // ( types [, fn] )
+                       fn = selector;
+                       selector = undefined;
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               }
+               return this.each( function() {
+                       jQuery.event.remove( this, types, fn, selector );
+               } );
+       }
+} );
+
+
+var
+
+       /* eslint-disable max-len */
+
+       // See https://github.com/eslint/eslint/issues/3229
+       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+
+       /* eslint-enable */
+
+       // Support: IE <=10 - 11, Edge 12 - 13
+       // In IE/Edge using regex groups here causes severe slowdowns.
+       // See https://connect.microsoft.com/IE/feedback/details/1736512/
+       rnoInnerhtml = /<script|<style|<link/i,
+
+       // checked="checked" or checked
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+       rscriptTypeMasked = /^true\/(.*)/,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+
+// Prefer a tbody over its parent table for containing new rows
+function manipulationTarget( elem, content ) {
+       if ( nodeName( elem, "table" ) &&
+               nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
+
+               return jQuery( ">tbody", elem )[ 0 ] || elem;
+       }
+
+       return elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+       elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
+       return elem;
+}
+function restoreScript( elem ) {
+       var match = rscriptTypeMasked.exec( elem.type );
+
+       if ( match ) {
+               elem.type = match[ 1 ];
+       } else {
+               elem.removeAttribute( "type" );
+       }
+
+       return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+       var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+       if ( dest.nodeType !== 1 ) {
+               return;
+       }
+
+       // 1. Copy private data: events, handlers, etc.
+       if ( dataPriv.hasData( src ) ) {
+               pdataOld = dataPriv.access( src );
+               pdataCur = dataPriv.set( dest, pdataOld );
+               events = pdataOld.events;
+
+               if ( events ) {
+                       delete pdataCur.handle;
+                       pdataCur.events = {};
+
+                       for ( type in events ) {
+                               for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                                       jQuery.event.add( dest, type, events[ type ][ i ] );
+                               }
+                       }
+               }
+       }
+
+       // 2. Copy user data
+       if ( dataUser.hasData( src ) ) {
+               udataOld = dataUser.access( src );
+               udataCur = jQuery.extend( {}, udataOld );
+
+               dataUser.set( dest, udataCur );
+       }
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+       var nodeName = dest.nodeName.toLowerCase();
+
+       // Fails to persist the checked state of a cloned checkbox or radio button.
+       if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+               dest.checked = src.checked;
+
+       // Fails to return the selected option to the default selected state when cloning options
+       } else if ( nodeName === "input" || nodeName === "textarea" ) {
+               dest.defaultValue = src.defaultValue;
+       }
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+       // Flatten any nested arrays
+       args = concat.apply( [], args );
+
+       var fragment, first, scripts, hasScripts, node, doc,
+               i = 0,
+               l = collection.length,
+               iNoClone = l - 1,
+               value = args[ 0 ],
+               isFunction = jQuery.isFunction( value );
+
+       // We can't cloneNode fragments that contain checked, in WebKit
+       if ( isFunction ||
+                       ( l > 1 && typeof value === "string" &&
+                               !support.checkClone && rchecked.test( value ) ) ) {
+               return collection.each( function( index ) {
+                       var self = collection.eq( index );
+                       if ( isFunction ) {
+                               args[ 0 ] = value.call( this, index, self.html() );
+                       }
+                       domManip( self, args, callback, ignored );
+               } );
+       }
+
+       if ( l ) {
+               fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+               first = fragment.firstChild;
+
+               if ( fragment.childNodes.length === 1 ) {
+                       fragment = first;
+               }
+
+               // Require either new content or an interest in ignored elements to invoke the callback
+               if ( first || ignored ) {
+                       scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+                       hasScripts = scripts.length;
+
+                       // Use the original fragment for the last item
+                       // instead of the first because it can end up
+                       // being emptied incorrectly in certain situations (#8070).
+                       for ( ; i < l; i++ ) {
+                               node = fragment;
+
+                               if ( i !== iNoClone ) {
+                                       node = jQuery.clone( node, true, true );
+
+                                       // Keep references to cloned scripts for later restoration
+                                       if ( hasScripts ) {
+
+                                               // Support: Android <=4.0 only, PhantomJS 1 only
+                                               // push.apply(_, arraylike) throws on ancient WebKit
+                                               jQuery.merge( scripts, getAll( node, "script" ) );
+                                       }
+                               }
+
+                               callback.call( collection[ i ], node, i );
+                       }
+
+                       if ( hasScripts ) {
+                               doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+                               // Reenable scripts
+                               jQuery.map( scripts, restoreScript );
+
+                               // Evaluate executable scripts on first document insertion
+                               for ( i = 0; i < hasScripts; i++ ) {
+                                       node = scripts[ i ];
+                                       if ( rscriptType.test( node.type || "" ) &&
+                                               !dataPriv.access( node, "globalEval" ) &&
+                                               jQuery.contains( doc, node ) ) {
+
+                                               if ( node.src ) {
+
+                                                       // Optional AJAX dependency, but won't run scripts if not present
+                                                       if ( jQuery._evalUrl ) {
+                                                               jQuery._evalUrl( node.src );
+                                                       }
+                                               } else {
+                                                       DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return collection;
+}
+
+function remove( elem, selector, keepData ) {
+       var node,
+               nodes = selector ? jQuery.filter( selector, elem ) : elem,
+               i = 0;
+
+       for ( ; ( node = nodes[ i ] ) != null; i++ ) {
+               if ( !keepData && node.nodeType === 1 ) {
+                       jQuery.cleanData( getAll( node ) );
+               }
+
+               if ( node.parentNode ) {
+                       if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
+                               setGlobalEval( getAll( node, "script" ) );
+                       }
+                       node.parentNode.removeChild( node );
+               }
+       }
+
+       return elem;
+}
+
+jQuery.extend( {
+       htmlPrefilter: function( html ) {
+               return html.replace( rxhtmlTag, "<$1></$2>" );
+       },
+
+       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+               var i, l, srcElements, destElements,
+                       clone = elem.cloneNode( true ),
+                       inPage = jQuery.contains( elem.ownerDocument, elem );
+
+               // Fix IE cloning issues
+               if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+                               !jQuery.isXMLDoc( elem ) ) {
+
+                       // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
+                       destElements = getAll( clone );
+                       srcElements = getAll( elem );
+
+                       for ( i = 0, l = srcElements.length; i < l; i++ ) {
+                               fixInput( srcElements[ i ], destElements[ i ] );
+                       }
+               }
+
+               // Copy the events from the original to the clone
+               if ( dataAndEvents ) {
+                       if ( deepDataAndEvents ) {
+                               srcElements = srcElements || getAll( elem );
+                               destElements = destElements || getAll( clone );
+
+                               for ( i = 0, l = srcElements.length; i < l; i++ ) {
+                                       cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+                               }
+                       } else {
+                               cloneCopyEvent( elem, clone );
+                       }
+               }
+
+               // Preserve script evaluation history
+               destElements = getAll( clone, "script" );
+               if ( destElements.length > 0 ) {
+                       setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+               }
+
+               // Return the cloned set
+               return clone;
+       },
+
+       cleanData: function( elems ) {
+               var data, elem, type,
+                       special = jQuery.event.special,
+                       i = 0;
+
+               for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
+                       if ( acceptData( elem ) ) {
+                               if ( ( data = elem[ dataPriv.expando ] ) ) {
+                                       if ( data.events ) {
+                                               for ( type in data.events ) {
+                                                       if ( special[ type ] ) {
+                                                               jQuery.event.remove( elem, type );
+
+                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
+                                                       } else {
+                                                               jQuery.removeEvent( elem, type, data.handle );
+                                                       }
+                                               }
+                                       }
+
+                                       // Support: Chrome <=35 - 45+
+                                       // Assign undefined instead of using delete, see Data#remove
+                                       elem[ dataPriv.expando ] = undefined;
+                               }
+                               if ( elem[ dataUser.expando ] ) {
+
+                                       // Support: Chrome <=35 - 45+
+                                       // Assign undefined instead of using delete, see Data#remove
+                                       elem[ dataUser.expando ] = undefined;
+                               }
+                       }
+               }
+       }
+} );
+
+jQuery.fn.extend( {
+       detach: function( selector ) {
+               return remove( this, selector, true );
+       },
+
+       remove: function( selector ) {
+               return remove( this, selector );
+       },
+
+       text: function( value ) {
+               return access( this, function( value ) {
+                       return value === undefined ?
+                               jQuery.text( this ) :
+                               this.empty().each( function() {
+                                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                                               this.textContent = value;
+                                       }
+                               } );
+               }, null, value, arguments.length );
+       },
+
+       append: function() {
+               return domManip( this, arguments, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                               var target = manipulationTarget( this, elem );
+                               target.appendChild( elem );
+                       }
+               } );
+       },
+
+       prepend: function() {
+               return domManip( this, arguments, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                               var target = manipulationTarget( this, elem );
+                               target.insertBefore( elem, target.firstChild );
+                       }
+               } );
+       },
+
+       before: function() {
+               return domManip( this, arguments, function( elem ) {
+                       if ( this.parentNode ) {
+                               this.parentNode.insertBefore( elem, this );
+                       }
+               } );
+       },
+
+       after: function() {
+               return domManip( this, arguments, function( elem ) {
+                       if ( this.parentNode ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       }
+               } );
+       },
+
+       empty: function() {
+               var elem,
+                       i = 0;
+
+               for ( ; ( elem = this[ i ] ) != null; i++ ) {
+                       if ( elem.nodeType === 1 ) {
+
+                               // Prevent memory leaks
+                               jQuery.cleanData( getAll( elem, false ) );
+
+                               // Remove any remaining nodes
+                               elem.textContent = "";
+                       }
+               }
+
+               return this;
+       },
+
+       clone: function( dataAndEvents, deepDataAndEvents ) {
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+               return this.map( function() {
+                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+               } );
+       },
+
+       html: function( value ) {
+               return access( this, function( value ) {
+                       var elem = this[ 0 ] || {},
+                               i = 0,
+                               l = this.length;
+
+                       if ( value === undefined && elem.nodeType === 1 ) {
+                               return elem.innerHTML;
+                       }
+
+                       // See if we can take a shortcut and just use innerHTML
+                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                               !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+                               value = jQuery.htmlPrefilter( value );
+
+                               try {
+                                       for ( ; i < l; i++ ) {
+                                               elem = this[ i ] || {};
+
+                                               // Remove element nodes and prevent memory leaks
+                                               if ( elem.nodeType === 1 ) {
+                                                       jQuery.cleanData( getAll( elem, false ) );
+                                                       elem.innerHTML = value;
+                                               }
+                                       }
+
+                                       elem = 0;
+
+                               // If using innerHTML throws an exception, use the fallback method
+                               } catch ( e ) {}
+                       }
+
+                       if ( elem ) {
+                               this.empty().append( value );
+                       }
+               }, null, value, arguments.length );
+       },
+
+       replaceWith: function() {
+               var ignored = [];
+
+               // Make the changes, replacing each non-ignored context element with the new content
+               return domManip( this, arguments, function( elem ) {
+                       var parent = this.parentNode;
+
+                       if ( jQuery.inArray( this, ignored ) < 0 ) {
+                               jQuery.cleanData( getAll( this ) );
+                               if ( parent ) {
+                                       parent.replaceChild( elem, this );
+                               }
+                       }
+
+               // Force callback invocation
+               }, ignored );
+       }
+} );
+
+jQuery.each( {
+       appendTo: "append",
+       prependTo: "prepend",
+       insertBefore: "before",
+       insertAfter: "after",
+       replaceAll: "replaceWith"
+}, function( name, original ) {
+       jQuery.fn[ name ] = function( selector ) {
+               var elems,
+                       ret = [],
+                       insert = jQuery( selector ),
+                       last = insert.length - 1,
+                       i = 0;
+
+               for ( ; i <= last; i++ ) {
+                       elems = i === last ? this : this.clone( true );
+                       jQuery( insert[ i ] )[ original ]( elems );
+
+                       // Support: Android <=4.0 only, PhantomJS 1 only
+                       // .get() because push.apply(_, arraylike) throws on ancient WebKit
+                       push.apply( ret, elems.get() );
+               }
+
+               return this.pushStack( ret );
+       };
+} );
+var rmargin = ( /^margin/ );
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+
+               // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
+               // IE throws on elements created in popups
+               // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+               var view = elem.ownerDocument.defaultView;
+
+               if ( !view || !view.opener ) {
+                       view = window;
+               }
+
+               return view.getComputedStyle( elem );
+       };
+
+
+
+( function() {
+
+       // Executing both pixelPosition & boxSizingReliable tests require only one layout
+       // so they're executed at the same time to save the second computation.
+       function computeStyleTests() {
+
+               // This is a singleton, we need to execute it only once
+               if ( !div ) {
+                       return;
+               }
+
+               div.style.cssText =
+                       "box-sizing:border-box;" +
+                       "position:relative;display:block;" +
+                       "margin:auto;border:1px;padding:1px;" +
+                       "top:1%;width:50%";
+               div.innerHTML = "";
+               documentElement.appendChild( container );
+
+               var divStyle = window.getComputedStyle( div );
+               pixelPositionVal = divStyle.top !== "1%";
+
+               // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
+               reliableMarginLeftVal = divStyle.marginLeft === "2px";
+               boxSizingReliableVal = divStyle.width === "4px";
+
+               // Support: Android 4.0 - 4.3 only
+               // Some styles come back with percentage values, even though they shouldn't
+               div.style.marginRight = "50%";
+               pixelMarginRightVal = divStyle.marginRight === "4px";
+
+               documentElement.removeChild( container );
+
+               // Nullify the div so it wouldn't be stored in the memory and
+               // it will also be a sign that checks already performed
+               div = null;
+       }
+
+       var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
+               container = document.createElement( "div" ),
+               div = document.createElement( "div" );
+
+       // Finish early in limited (non-browser) environments
+       if ( !div.style ) {
+               return;
+       }
+
+       // Support: IE <=9 - 11 only
+       // Style of cloned element affects source element cloned (#8908)
+       div.style.backgroundClip = "content-box";
+       div.cloneNode( true ).style.backgroundClip = "";
+       support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+       container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
+               "padding:0;margin-top:1px;position:absolute";
+       container.appendChild( div );
+
+       jQuery.extend( support, {
+               pixelPosition: function() {
+                       computeStyleTests();
+                       return pixelPositionVal;
+               },
+               boxSizingReliable: function() {
+                       computeStyleTests();
+                       return boxSizingReliableVal;
+               },
+               pixelMarginRight: function() {
+                       computeStyleTests();
+                       return pixelMarginRightVal;
+               },
+               reliableMarginLeft: function() {
+                       computeStyleTests();
+                       return reliableMarginLeftVal;
+               }
+       } );
+} )();
+
+
+function curCSS( elem, name, computed ) {
+       var width, minWidth, maxWidth, ret,
+
+               // Support: Firefox 51+
+               // Retrieving style before computed somehow
+               // fixes an issue with getting wrong values
+               // on detached elements
+               style = elem.style;
+
+       computed = computed || getStyles( elem );
+
+       // getPropertyValue is needed for:
+       //   .css('filter') (IE 9 only, #12537)
+       //   .css('--customProperty) (#3144)
+       if ( computed ) {
+               ret = computed.getPropertyValue( name ) || computed[ name ];
+
+               if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+                       ret = jQuery.style( elem, name );
+               }
+
+               // A tribute to the "awesome hack by Dean Edwards"
+               // Android Browser returns percentage for some values,
+               // but width seems to be reliably pixels.
+               // This is against the CSSOM draft spec:
+               // https://drafts.csswg.org/cssom/#resolved-values
+               if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+                       // Remember the original values
+                       width = style.width;
+                       minWidth = style.minWidth;
+                       maxWidth = style.maxWidth;
+
+                       // Put in the new values to get a computed value out
+                       style.minWidth = style.maxWidth = style.width = ret;
+                       ret = computed.width;
+
+                       // Revert the changed values
+                       style.width = width;
+                       style.minWidth = minWidth;
+                       style.maxWidth = maxWidth;
+               }
+       }
+
+       return ret !== undefined ?
+
+               // Support: IE <=9 - 11 only
+               // IE returns zIndex value as an integer.
+               ret + "" :
+               ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+       // Define the hook, we'll check on the first run if it's really needed.
+       return {
+               get: function() {
+                       if ( conditionFn() ) {
+
+                               // Hook not needed (or it's not possible to use it due
+                               // to missing dependency), remove it.
+                               delete this.get;
+                               return;
+                       }
+
+                       // Hook needed; redefine it so that the support test is not executed again.
+                       return ( this.get = hookFn ).apply( this, arguments );
+               }
+       };
+}
+
+
+var
+
+       // Swappable if display is none or starts with table
+       // except "table", "table-cell", or "table-caption"
+       // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+       rcustomProp = /^--/,
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssNormalTransform = {
+               letterSpacing: "0",
+               fontWeight: "400"
+       },
+
+       cssPrefixes = [ "Webkit", "Moz", "ms" ],
+       emptyStyle = document.createElement( "div" ).style;
+
+// Return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( name ) {
+
+       // Shortcut for names that are not vendor prefixed
+       if ( name in emptyStyle ) {
+               return name;
+       }
+
+       // Check for vendor prefixed names
+       var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
+               i = cssPrefixes.length;
+
+       while ( i-- ) {
+               name = cssPrefixes[ i ] + capName;
+               if ( name in emptyStyle ) {
+                       return name;
+               }
+       }
+}
+
+// Return a property mapped along what jQuery.cssProps suggests or to
+// a vendor prefixed property.
+function finalPropName( name ) {
+       var ret = jQuery.cssProps[ name ];
+       if ( !ret ) {
+               ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
+       }
+       return ret;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+
+       // Any relative (+/-) values have already been
+       // normalized at this point
+       var matches = rcssNum.exec( value );
+       return matches ?
+
+               // Guard against undefined "subtract", e.g., when used as in cssHooks
+               Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
+               value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+       var i,
+               val = 0;
+
+       // If we already have the right measurement, avoid augmentation
+       if ( extra === ( isBorderBox ? "border" : "content" ) ) {
+               i = 4;
+
+       // Otherwise initialize for horizontal or vertical properties
+       } else {
+               i = name === "width" ? 1 : 0;
+       }
+
+       for ( ; i < 4; i += 2 ) {
+
+               // Both box models exclude margin, so add it if we want it
+               if ( extra === "margin" ) {
+                       val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+               }
+
+               if ( isBorderBox ) {
+
+                       // border-box includes padding, so remove it if we want content
+                       if ( extra === "content" ) {
+                               val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+                       }
+
+                       // At this point, extra isn't border nor margin, so remove border
+                       if ( extra !== "margin" ) {
+                               val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+                       }
+               } else {
+
+                       // At this point, extra isn't content, so add padding
+                       val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+                       // At this point, extra isn't content nor padding, so add border
+                       if ( extra !== "padding" ) {
+                               val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+                       }
+               }
+       }
+
+       return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+       // Start with computed style
+       var valueIsBorderBox,
+               styles = getStyles( elem ),
+               val = curCSS( elem, name, styles ),
+               isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+       // Computed unit is not pixels. Stop here and return.
+       if ( rnumnonpx.test( val ) ) {
+               return val;
+       }
+
+       // Check for style in case a browser which returns unreliable values
+       // for getComputedStyle silently falls back to the reliable elem.style
+       valueIsBorderBox = isBorderBox &&
+               ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+       // Fall back to offsetWidth/Height when value is "auto"
+       // This happens for inline elements with no explicit setting (gh-3571)
+       if ( val === "auto" ) {
+               val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
+       }
+
+       // Normalize "", auto, and prepare for extra
+       val = parseFloat( val ) || 0;
+
+       // Use the active box-sizing model to add/subtract irrelevant styles
+       return ( val +
+               augmentWidthOrHeight(
+                       elem,
+                       name,
+                       extra || ( isBorderBox ? "border" : "content" ),
+                       valueIsBorderBox,
+                       styles
+               )
+       ) + "px";
+}
+
+jQuery.extend( {
+
+       // Add in style property hooks for overriding the default
+       // behavior of getting and setting a style property
+       cssHooks: {
+               opacity: {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+
+                                       // We should always get a number back from opacity
+                                       var ret = curCSS( elem, "opacity" );
+                                       return ret === "" ? "1" : ret;
+                               }
+                       }
+               }
+       },
+
+       // Don't automatically add "px" to these possibly-unitless properties
+       cssNumber: {
+               "animationIterationCount": true,
+               "columnCount": true,
+               "fillOpacity": true,
+               "flexGrow": true,
+               "flexShrink": true,
+               "fontWeight": true,
+               "lineHeight": true,
+               "opacity": true,
+               "order": true,
+               "orphans": true,
+               "widows": true,
+               "zIndex": true,
+               "zoom": true
+       },
+
+       // Add in properties whose names you wish to fix before
+       // setting or getting the value
+       cssProps: {
+               "float": "cssFloat"
+       },
+
+       // Get and set the style property on a DOM Node
+       style: function( elem, name, value, extra ) {
+
+               // Don't set styles on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+                       return;
+               }
+
+               // Make sure that we're working with the right name
+               var ret, type, hooks,
+                       origName = jQuery.camelCase( name ),
+                       isCustomProp = rcustomProp.test( name ),
+                       style = elem.style;
+
+               // Make sure that we're working with the right name. We don't
+               // want to query the value if it is a CSS custom property
+               // since they are user-defined.
+               if ( !isCustomProp ) {
+                       name = finalPropName( origName );
+               }
+
+               // Gets hook for the prefixed version, then unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // Check if we're setting a value
+               if ( value !== undefined ) {
+                       type = typeof value;
+
+                       // Convert "+=" or "-=" to relative numbers (#7345)
+                       if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+                               value = adjustCSS( elem, name, ret );
+
+                               // Fixes bug #9237
+                               type = "number";
+                       }
+
+                       // Make sure that null and NaN values aren't set (#7116)
+                       if ( value == null || value !== value ) {
+                               return;
+                       }
+
+                       // If a number was passed in, add the unit (except for certain CSS properties)
+                       if ( type === "number" ) {
+                               value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+                       }
+
+                       // background-* props affect original clone's values
+                       if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+                               style[ name ] = "inherit";
+                       }
+
+                       // If a hook was provided, use that value, otherwise just set the specified value
+                       if ( !hooks || !( "set" in hooks ) ||
+                               ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+                               if ( isCustomProp ) {
+                                       style.setProperty( name, value );
+                               } else {
+                                       style[ name ] = value;
+                               }
+                       }
+
+               } else {
+
+                       // If a hook was provided get the non-computed value from there
+                       if ( hooks && "get" in hooks &&
+                               ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+                               return ret;
+                       }
+
+                       // Otherwise just get the value from the style object
+                       return style[ name ];
+               }
+       },
+
+       css: function( elem, name, extra, styles ) {
+               var val, num, hooks,
+                       origName = jQuery.camelCase( name ),
+                       isCustomProp = rcustomProp.test( name );
+
+               // Make sure that we're working with the right name. We don't
+               // want to modify the value if it is a CSS custom property
+               // since they are user-defined.
+               if ( !isCustomProp ) {
+                       name = finalPropName( origName );
+               }
+
+               // Try prefixed name followed by the unprefixed name
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // If a hook was provided get the computed value from there
+               if ( hooks && "get" in hooks ) {
+                       val = hooks.get( elem, true, extra );
+               }
+
+               // Otherwise, if a way to get the computed value exists, use that
+               if ( val === undefined ) {
+                       val = curCSS( elem, name, styles );
+               }
+
+               // Convert "normal" to computed value
+               if ( val === "normal" && name in cssNormalTransform ) {
+                       val = cssNormalTransform[ name ];
+               }
+
+               // Make numeric if forced or a qualifier was provided and val looks numeric
+               if ( extra === "" || extra ) {
+                       num = parseFloat( val );
+                       return extra === true || isFinite( num ) ? num || 0 : val;
+               }
+
+               return val;
+       }
+} );
+
+jQuery.each( [ "height", "width" ], function( i, name ) {
+       jQuery.cssHooks[ name ] = {
+               get: function( elem, computed, extra ) {
+                       if ( computed ) {
+
+                               // Certain elements can have dimension info if we invisibly show them
+                               // but it must have a current display style that would benefit
+                               return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+
+                                       // Support: Safari 8+
+                                       // Table columns in Safari have non-zero offsetWidth & zero
+                                       // getBoundingClientRect().width unless display is changed.
+                                       // Support: IE <=11 only
+                                       // Running getBoundingClientRect on a disconnected node
+                                       // in IE throws an error.
+                                       ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
+                                               swap( elem, cssShow, function() {
+                                                       return getWidthOrHeight( elem, name, extra );
+                                               } ) :
+                                               getWidthOrHeight( elem, name, extra );
+                       }
+               },
+
+               set: function( elem, value, extra ) {
+                       var matches,
+                               styles = extra && getStyles( elem ),
+                               subtract = extra && augmentWidthOrHeight(
+                                       elem,
+                                       name,
+                                       extra,
+                                       jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+                                       styles
+                               );
+
+                       // Convert to pixels if value adjustment is needed
+                       if ( subtract && ( matches = rcssNum.exec( value ) ) &&
+                               ( matches[ 3 ] || "px" ) !== "px" ) {
+
+                               elem.style[ name ] = value;
+                               value = jQuery.css( elem, name );
+                       }
+
+                       return setPositiveNumber( elem, value, subtract );
+               }
+       };
+} );
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+       function( elem, computed ) {
+               if ( computed ) {
+                       return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
+                               elem.getBoundingClientRect().left -
+                                       swap( elem, { marginLeft: 0 }, function() {
+                                               return elem.getBoundingClientRect().left;
+                                       } )
+                               ) + "px";
+               }
+       }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+       margin: "",
+       padding: "",
+       border: "Width"
+}, function( prefix, suffix ) {
+       jQuery.cssHooks[ prefix + suffix ] = {
+               expand: function( value ) {
+                       var i = 0,
+                               expanded = {},
+
+                               // Assumes a single number if not a string
+                               parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+                       for ( ; i < 4; i++ ) {
+                               expanded[ prefix + cssExpand[ i ] + suffix ] =
+                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+                       }
+
+                       return expanded;
+               }
+       };
+
+       if ( !rmargin.test( prefix ) ) {
+               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+       }
+} );
+
+jQuery.fn.extend( {
+       css: function( name, value ) {
+               return access( this, function( elem, name, value ) {
+                       var styles, len,
+                               map = {},
+                               i = 0;
+
+                       if ( Array.isArray( name ) ) {
+                               styles = getStyles( elem );
+                               len = name.length;
+
+                               for ( ; i < len; i++ ) {
+                                       map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+                               }
+
+                               return map;
+                       }
+
+                       return value !== undefined ?
+                               jQuery.style( elem, name, value ) :
+                               jQuery.css( elem, name );
+               }, name, value, arguments.length > 1 );
+       }
+} );
+
+
+function Tween( elem, options, prop, end, easing ) {
+       return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+       constructor: Tween,
+       init: function( elem, options, prop, end, easing, unit ) {
+               this.elem = elem;
+               this.prop = prop;
+               this.easing = easing || jQuery.easing._default;
+               this.options = options;
+               this.start = this.now = this.cur();
+               this.end = end;
+               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+       },
+       cur: function() {
+               var hooks = Tween.propHooks[ this.prop ];
+
+               return hooks && hooks.get ?
+                       hooks.get( this ) :
+                       Tween.propHooks._default.get( this );
+       },
+       run: function( percent ) {
+               var eased,
+                       hooks = Tween.propHooks[ this.prop ];
+
+               if ( this.options.duration ) {
+                       this.pos = eased = jQuery.easing[ this.easing ](
+                               percent, this.options.duration * percent, 0, 1, this.options.duration
+                       );
+               } else {
+                       this.pos = eased = percent;
+               }
+               this.now = ( this.end - this.start ) * eased + this.start;
+
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
+               }
+
+               if ( hooks && hooks.set ) {
+                       hooks.set( this );
+               } else {
+                       Tween.propHooks._default.set( this );
+               }
+               return this;
+       }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+       _default: {
+               get: function( tween ) {
+                       var result;
+
+                       // Use a property on the element directly when it is not a DOM element,
+                       // or when there is no matching style property that exists.
+                       if ( tween.elem.nodeType !== 1 ||
+                               tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
+                               return tween.elem[ tween.prop ];
+                       }
+
+                       // Passing an empty string as a 3rd parameter to .css will automatically
+                       // attempt a parseFloat and fallback to a string if the parse fails.
+                       // Simple values such as "10px" are parsed to Float;
+                       // complex values such as "rotate(1rad)" are returned as-is.
+                       result = jQuery.css( tween.elem, tween.prop, "" );
+
+                       // Empty strings, null, undefined and "auto" are converted to 0.
+                       return !result || result === "auto" ? 0 : result;
+               },
+               set: function( tween ) {
+
+                       // Use step hook for back compat.
+                       // Use cssHook if its there.
+                       // Use .style if available and use plain properties where available.
+                       if ( jQuery.fx.step[ tween.prop ] ) {
+                               jQuery.fx.step[ tween.prop ]( tween );
+                       } else if ( tween.elem.nodeType === 1 &&
+                               ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
+                                       jQuery.cssHooks[ tween.prop ] ) ) {
+                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+                       } else {
+                               tween.elem[ tween.prop ] = tween.now;
+                       }
+               }
+       }
+};
+
+// Support: IE <=9 only
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+       set: function( tween ) {
+               if ( tween.elem.nodeType && tween.elem.parentNode ) {
+                       tween.elem[ tween.prop ] = tween.now;
+               }
+       }
+};
+
+jQuery.easing = {
+       linear: function( p ) {
+               return p;
+       },
+       swing: function( p ) {
+               return 0.5 - Math.cos( p * Math.PI ) / 2;
+       },
+       _default: "swing"
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+       fxNow, inProgress,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rrun = /queueHooks$/;
+
+function schedule() {
+       if ( inProgress ) {
+               if ( document.hidden === false && window.requestAnimationFrame ) {
+                       window.requestAnimationFrame( schedule );
+               } else {
+                       window.setTimeout( schedule, jQuery.fx.interval );
+               }
+
+               jQuery.fx.tick();
+       }
+}
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       window.setTimeout( function() {
+               fxNow = undefined;
+       } );
+       return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+       var which,
+               i = 0,
+               attrs = { height: type };
+
+       // If we include width, step value is 1 to do all cssExpand values,
+       // otherwise step value is 2 to skip over Left and Right
+       includeWidth = includeWidth ? 1 : 0;
+       for ( ; i < 4; i += 2 - includeWidth ) {
+               which = cssExpand[ i ];
+               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+       }
+
+       if ( includeWidth ) {
+               attrs.opacity = attrs.width = type;
+       }
+
+       return attrs;
+}
+
+function createTween( value, prop, animation ) {
+       var tween,
+               collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
+               index = 0,
+               length = collection.length;
+       for ( ; index < length; index++ ) {
+               if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
+
+                       // We're done with this property
+                       return tween;
+               }
+       }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+       var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
+               isBox = "width" in props || "height" in props,
+               anim = this,
+               orig = {},
+               style = elem.style,
+               hidden = elem.nodeType && isHiddenWithinTree( elem ),
+               dataShow = dataPriv.get( elem, "fxshow" );
+
+       // Queue-skipping animations hijack the fx hooks
+       if ( !opts.queue ) {
+               hooks = jQuery._queueHooks( elem, "fx" );
+               if ( hooks.unqueued == null ) {
+                       hooks.unqueued = 0;
+                       oldfire = hooks.empty.fire;
+                       hooks.empty.fire = function() {
+                               if ( !hooks.unqueued ) {
+                                       oldfire();
+                               }
+                       };
+               }
+               hooks.unqueued++;
+
+               anim.always( function() {
+
+                       // Ensure the complete handler is called before this completes
+                       anim.always( function() {
+                               hooks.unqueued--;
+                               if ( !jQuery.queue( elem, "fx" ).length ) {
+                                       hooks.empty.fire();
+                               }
+                       } );
+               } );
+       }
+
+       // Detect show/hide animations
+       for ( prop in props ) {
+               value = props[ prop ];
+               if ( rfxtypes.test( value ) ) {
+                       delete props[ prop ];
+                       toggle = toggle || value === "toggle";
+                       if ( value === ( hidden ? "hide" : "show" ) ) {
+
+                               // Pretend to be hidden if this is a "show" and
+                               // there is still data from a stopped show/hide
+                               if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+                                       hidden = true;
+
+                               // Ignore all other no-op show/hide data
+                               } else {
+                                       continue;
+                               }
+                       }
+                       orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+               }
+       }
+
+       // Bail out if this is a no-op like .hide().hide()
+       propTween = !jQuery.isEmptyObject( props );
+       if ( !propTween && jQuery.isEmptyObject( orig ) ) {
+               return;
+       }
+
+       // Restrict "overflow" and "display" styles during box animations
+       if ( isBox && elem.nodeType === 1 ) {
+
+               // Support: IE <=9 - 11, Edge 12 - 13
+               // Record all 3 overflow attributes because IE does not infer the shorthand
+               // from identically-valued overflowX and overflowY
+               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+               // Identify a display type, preferring old show/hide data over the CSS cascade
+               restoreDisplay = dataShow && dataShow.display;
+               if ( restoreDisplay == null ) {
+                       restoreDisplay = dataPriv.get( elem, "display" );
+               }
+               display = jQuery.css( elem, "display" );
+               if ( display === "none" ) {
+                       if ( restoreDisplay ) {
+                               display = restoreDisplay;
+                       } else {
+
+                               // Get nonempty value(s) by temporarily forcing visibility
+                               showHide( [ elem ], true );
+                               restoreDisplay = elem.style.display || restoreDisplay;
+                               display = jQuery.css( elem, "display" );
+                               showHide( [ elem ] );
+                       }
+               }
+
+               // Animate inline elements as inline-block
+               if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
+                       if ( jQuery.css( elem, "float" ) === "none" ) {
+
+                               // Restore the original display value at the end of pure show/hide animations
+                               if ( !propTween ) {
+                                       anim.done( function() {
+                                               style.display = restoreDisplay;
+                                       } );
+                                       if ( restoreDisplay == null ) {
+                                               display = style.display;
+                                               restoreDisplay = display === "none" ? "" : display;
+                                       }
+                               }
+                               style.display = "inline-block";
+                       }
+               }
+       }
+
+       if ( opts.overflow ) {
+               style.overflow = "hidden";
+               anim.always( function() {
+                       style.overflow = opts.overflow[ 0 ];
+                       style.overflowX = opts.overflow[ 1 ];
+                       style.overflowY = opts.overflow[ 2 ];
+               } );
+       }
+
+       // Implement show/hide animations
+       propTween = false;
+       for ( prop in orig ) {
+
+               // General show/hide setup for this element animation
+               if ( !propTween ) {
+                       if ( dataShow ) {
+                               if ( "hidden" in dataShow ) {
+                                       hidden = dataShow.hidden;
+                               }
+                       } else {
+                               dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
+                       }
+
+                       // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
+                       if ( toggle ) {
+                               dataShow.hidden = !hidden;
+                       }
+
+                       // Show elements before animating them
+                       if ( hidden ) {
+                               showHide( [ elem ], true );
+                       }
+
+                       /* eslint-disable no-loop-func */
+
+                       anim.done( function() {
+
+                       /* eslint-enable no-loop-func */
+
+                               // The final step of a "hide" animation is actually hiding the element
+                               if ( !hidden ) {
+                                       showHide( [ elem ] );
+                               }
+                               dataPriv.remove( elem, "fxshow" );
+                               for ( prop in orig ) {
+                                       jQuery.style( elem, prop, orig[ prop ] );
+                               }
+                       } );
+               }
+
+               // Per-property setup
+               propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+               if ( !( prop in dataShow ) ) {
+                       dataShow[ prop ] = propTween.start;
+                       if ( hidden ) {
+                               propTween.end = propTween.start;
+                               propTween.start = 0;
+                       }
+               }
+       }
+}
+
+function propFilter( props, specialEasing ) {
+       var index, name, easing, value, hooks;
+
+       // camelCase, specialEasing and expand cssHook pass
+       for ( index in props ) {
+               name = jQuery.camelCase( index );
+               easing = specialEasing[ name ];
+               value = props[ index ];
+               if ( Array.isArray( value ) ) {
+                       easing = value[ 1 ];
+                       value = props[ index ] = value[ 0 ];
+               }
+
+               if ( index !== name ) {
+                       props[ name ] = value;
+                       delete props[ index ];
+               }
+
+               hooks = jQuery.cssHooks[ name ];
+               if ( hooks && "expand" in hooks ) {
+                       value = hooks.expand( value );
+                       delete props[ name ];
+
+                       // Not quite $.extend, this won't overwrite existing keys.
+                       // Reusing 'index' because we have the correct "name"
+                       for ( index in value ) {
+                               if ( !( index in props ) ) {
+                                       props[ index ] = value[ index ];
+                                       specialEasing[ index ] = easing;
+                               }
+                       }
+               } else {
+                       specialEasing[ name ] = easing;
+               }
+       }
+}
+
+function Animation( elem, properties, options ) {
+       var result,
+               stopped,
+               index = 0,
+               length = Animation.prefilters.length,
+               deferred = jQuery.Deferred().always( function() {
+
+                       // Don't match elem in the :animated selector
+                       delete tick.elem;
+               } ),
+               tick = function() {
+                       if ( stopped ) {
+                               return false;
+                       }
+                       var currentTime = fxNow || createFxNow(),
+                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+
+                               // Support: Android 2.3 only
+                               // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+                               temp = remaining / animation.duration || 0,
+                               percent = 1 - temp,
+                               index = 0,
+                               length = animation.tweens.length;
+
+                       for ( ; index < length; index++ ) {
+                               animation.tweens[ index ].run( percent );
+                       }
+
+                       deferred.notifyWith( elem, [ animation, percent, remaining ] );
+
+                       // If there's more to do, yield
+                       if ( percent < 1 && length ) {
+                               return remaining;
+                       }
+
+                       // If this was an empty animation, synthesize a final progress notification
+                       if ( !length ) {
+                               deferred.notifyWith( elem, [ animation, 1, 0 ] );
+                       }
+
+                       // Resolve the animation and report its conclusion
+                       deferred.resolveWith( elem, [ animation ] );
+                       return false;
+               },
+               animation = deferred.promise( {
+                       elem: elem,
+                       props: jQuery.extend( {}, properties ),
+                       opts: jQuery.extend( true, {
+                               specialEasing: {},
+                               easing: jQuery.easing._default
+                       }, options ),
+                       originalProperties: properties,
+                       originalOptions: options,
+                       startTime: fxNow || createFxNow(),
+                       duration: options.duration,
+                       tweens: [],
+                       createTween: function( prop, end ) {
+                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
+                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
+                               animation.tweens.push( tween );
+                               return tween;
+                       },
+                       stop: function( gotoEnd ) {
+                               var index = 0,
+
+                                       // If we are going to the end, we want to run all the tweens
+                                       // otherwise we skip this part
+                                       length = gotoEnd ? animation.tweens.length : 0;
+                               if ( stopped ) {
+                                       return this;
+                               }
+                               stopped = true;
+                               for ( ; index < length; index++ ) {
+                                       animation.tweens[ index ].run( 1 );
+                               }
+
+                               // Resolve when we played the last frame; otherwise, reject
+                               if ( gotoEnd ) {
+                                       deferred.notifyWith( elem, [ animation, 1, 0 ] );
+                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
+                               } else {
+                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
+                               }
+                               return this;
+                       }
+               } ),
+               props = animation.props;
+
+       propFilter( props, animation.opts.specialEasing );
+
+       for ( ; index < length; index++ ) {
+               result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
+               if ( result ) {
+                       if ( jQuery.isFunction( result.stop ) ) {
+                               jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
+                                       jQuery.proxy( result.stop, result );
+                       }
+                       return result;
+               }
+       }
+
+       jQuery.map( props, createTween, animation );
+
+       if ( jQuery.isFunction( animation.opts.start ) ) {
+               animation.opts.start.call( elem, animation );
+       }
+
+       // Attach callbacks from options
+       animation
+               .progress( animation.opts.progress )
+               .done( animation.opts.done, animation.opts.complete )
+               .fail( animation.opts.fail )
+               .always( animation.opts.always );
+
+       jQuery.fx.timer(
+               jQuery.extend( tick, {
+                       elem: elem,
+                       anim: animation,
+                       queue: animation.opts.queue
+               } )
+       );
+
+       return animation;
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+       tweeners: {
+               "*": [ function( prop, value ) {
+                       var tween = this.createTween( prop, value );
+                       adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
+                       return tween;
+               } ]
+       },
+
+       tweener: function( props, callback ) {
+               if ( jQuery.isFunction( props ) ) {
+                       callback = props;
+                       props = [ "*" ];
+               } else {
+                       props = props.match( rnothtmlwhite );
+               }
+
+               var prop,
+                       index = 0,
+                       length = props.length;
+
+               for ( ; index < length; index++ ) {
+                       prop = props[ index ];
+                       Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
+                       Animation.tweeners[ prop ].unshift( callback );
+               }
+       },
+
+       prefilters: [ defaultPrefilter ],
+
+       prefilter: function( callback, prepend ) {
+               if ( prepend ) {
+                       Animation.prefilters.unshift( callback );
+               } else {
+                       Animation.prefilters.push( callback );
+               }
+       }
+} );
+
+jQuery.speed = function( speed, easing, fn ) {
+       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+               complete: fn || !fn && easing ||
+                       jQuery.isFunction( speed ) && speed,
+               duration: speed,
+               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+       };
+
+       // Go to the end state if fx are off
+       if ( jQuery.fx.off ) {
+               opt.duration = 0;
+
+       } else {
+               if ( typeof opt.duration !== "number" ) {
+                       if ( opt.duration in jQuery.fx.speeds ) {
+                               opt.duration = jQuery.fx.speeds[ opt.duration ];
+
+                       } else {
+                               opt.duration = jQuery.fx.speeds._default;
+                       }
+               }
+       }
+
+       // Normalize opt.queue - true/undefined/null -> "fx"
+       if ( opt.queue == null || opt.queue === true ) {
+               opt.queue = "fx";
+       }
+
+       // Queueing
+       opt.old = opt.complete;
+
+       opt.complete = function() {
+               if ( jQuery.isFunction( opt.old ) ) {
+                       opt.old.call( this );
+               }
+
+               if ( opt.queue ) {
+                       jQuery.dequeue( this, opt.queue );
+               }
+       };
+
+       return opt;
+};
+
+jQuery.fn.extend( {
+       fadeTo: function( speed, to, easing, callback ) {
+
+               // Show any hidden elements after setting opacity to 0
+               return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
+
+                       // Animate to the value specified
+                       .end().animate( { opacity: to }, speed, easing, callback );
+       },
+       animate: function( prop, speed, easing, callback ) {
+               var empty = jQuery.isEmptyObject( prop ),
+                       optall = jQuery.speed( speed, easing, callback ),
+                       doAnimation = function() {
+
+                               // Operate on a copy of prop so per-property easing won't be lost
+                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+                               // Empty animations, or finishing resolves immediately
+                               if ( empty || dataPriv.get( this, "finish" ) ) {
+                                       anim.stop( true );
+                               }
+                       };
+                       doAnimation.finish = doAnimation;
+
+               return empty || optall.queue === false ?
+                       this.each( doAnimation ) :
+                       this.queue( optall.queue, doAnimation );
+       },
+       stop: function( type, clearQueue, gotoEnd ) {
+               var stopQueue = function( hooks ) {
+                       var stop = hooks.stop;
+                       delete hooks.stop;
+                       stop( gotoEnd );
+               };
+
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
+               }
+
+               return this.each( function() {
+                       var dequeue = true,
+                               index = type != null && type + "queueHooks",
+                               timers = jQuery.timers,
+                               data = dataPriv.get( this );
+
+                       if ( index ) {
+                               if ( data[ index ] && data[ index ].stop ) {
+                                       stopQueue( data[ index ] );
+                               }
+                       } else {
+                               for ( index in data ) {
+                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+                                               stopQueue( data[ index ] );
+                                       }
+                               }
+                       }
+
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this &&
+                                       ( type == null || timers[ index ].queue === type ) ) {
+
+                                       timers[ index ].anim.stop( gotoEnd );
+                                       dequeue = false;
+                                       timers.splice( index, 1 );
+                               }
+                       }
+
+                       // Start the next in the queue if the last step wasn't forced.
+                       // Timers currently will call their complete callbacks, which
+                       // will dequeue but only if they were gotoEnd.
+                       if ( dequeue || !gotoEnd ) {
+                               jQuery.dequeue( this, type );
+                       }
+               } );
+       },
+       finish: function( type ) {
+               if ( type !== false ) {
+                       type = type || "fx";
+               }
+               return this.each( function() {
+                       var index,
+                               data = dataPriv.get( this ),
+                               queue = data[ type + "queue" ],
+                               hooks = data[ type + "queueHooks" ],
+                               timers = jQuery.timers,
+                               length = queue ? queue.length : 0;
+
+                       // Enable finishing flag on private data
+                       data.finish = true;
+
+                       // Empty the queue first
+                       jQuery.queue( this, type, [] );
+
+                       if ( hooks && hooks.stop ) {
+                               hooks.stop.call( this, true );
+                       }
+
+                       // Look for any active animations, and finish them
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+                                       timers[ index ].anim.stop( true );
+                                       timers.splice( index, 1 );
+                               }
+                       }
+
+                       // Look for any animations in the old queue and finish them
+                       for ( index = 0; index < length; index++ ) {
+                               if ( queue[ index ] && queue[ index ].finish ) {
+                                       queue[ index ].finish.call( this );
+                               }
+                       }
+
+                       // Turn off finishing flag
+                       delete data.finish;
+               } );
+       }
+} );
+
+jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
+       var cssFn = jQuery.fn[ name ];
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return speed == null || typeof speed === "boolean" ?
+                       cssFn.apply( this, arguments ) :
+                       this.animate( genFx( name, true ), speed, easing, callback );
+       };
+} );
+
+// Generate shortcuts for custom animations
+jQuery.each( {
+       slideDown: genFx( "show" ),
+       slideUp: genFx( "hide" ),
+       slideToggle: genFx( "toggle" ),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+} );
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+       var timer,
+               i = 0,
+               timers = jQuery.timers;
+
+       fxNow = jQuery.now();
+
+       for ( ; i < timers.length; i++ ) {
+               timer = timers[ i ];
+
+               // Run the timer and safely remove it when done (allowing for external removal)
+               if ( !timer() && timers[ i ] === timer ) {
+                       timers.splice( i--, 1 );
+               }
+       }
+
+       if ( !timers.length ) {
+               jQuery.fx.stop();
+       }
+       fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+       jQuery.timers.push( timer );
+       jQuery.fx.start();
+};
+
+jQuery.fx.interval = 13;
+jQuery.fx.start = function() {
+       if ( inProgress ) {
+               return;
+       }
+
+       inProgress = true;
+       schedule();
+};
+
+jQuery.fx.stop = function() {
+       inProgress = null;
+};
+
+jQuery.fx.speeds = {
+       slow: 600,
+       fast: 200,
+
+       // Default speed
+       _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+       time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+       type = type || "fx";
+
+       return this.queue( type, function( next, hooks ) {
+               var timeout = window.setTimeout( next, time );
+               hooks.stop = function() {
+                       window.clearTimeout( timeout );
+               };
+       } );
+};
+
+
+( function() {
+       var input = document.createElement( "input" ),
+               select = document.createElement( "select" ),
+               opt = select.appendChild( document.createElement( "option" ) );
+
+       input.type = "checkbox";
+
+       // Support: Android <=4.3 only
+       // Default value for a checkbox should be "on"
+       support.checkOn = input.value !== "";
+
+       // Support: IE <=11 only
+       // Must access selectedIndex to make default options select
+       support.optSelected = opt.selected;
+
+       // Support: IE <=11 only
+       // An input loses its value after becoming a radio
+       input = document.createElement( "input" );
+       input.value = "t";
+       input.type = "radio";
+       support.radioValue = input.value === "t";
+} )();
+
+
+var boolHook,
+       attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend( {
+       attr: function( name, value ) {
+               return access( this, jQuery.attr, name, value, arguments.length > 1 );
+       },
+
+       removeAttr: function( name ) {
+               return this.each( function() {
+                       jQuery.removeAttr( this, name );
+               } );
+       }
+} );
+
+jQuery.extend( {
+       attr: function( elem, name, value ) {
+               var ret, hooks,
+                       nType = elem.nodeType;
+
+               // Don't get/set attributes on text, comment and attribute nodes
+               if ( nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               // Fallback to prop when attributes are not supported
+               if ( typeof elem.getAttribute === "undefined" ) {
+                       return jQuery.prop( elem, name, value );
+               }
+
+               // Attribute hooks are determined by the lowercase version
+               // Grab necessary hook if one is defined
+               if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+                       hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
+                               ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
+               }
+
+               if ( value !== undefined ) {
+                       if ( value === null ) {
+                               jQuery.removeAttr( elem, name );
+                               return;
+                       }
+
+                       if ( hooks && "set" in hooks &&
+                               ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+                               return ret;
+                       }
+
+                       elem.setAttribute( name, value + "" );
+                       return value;
+               }
+
+               if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+                       return ret;
+               }
+
+               ret = jQuery.find.attr( elem, name );
+
+               // Non-existent attributes return null, we normalize to undefined
+               return ret == null ? undefined : ret;
+       },
+
+       attrHooks: {
+               type: {
+                       set: function( elem, value ) {
+                               if ( !support.radioValue && value === "radio" &&
+                                       nodeName( elem, "input" ) ) {
+                                       var val = elem.value;
+                                       elem.setAttribute( "type", value );
+                                       if ( val ) {
+                                               elem.value = val;
+                                       }
+                                       return value;
+                               }
+                       }
+               }
+       },
+
+       removeAttr: function( elem, value ) {
+               var name,
+                       i = 0,
+
+                       // Attribute names can contain non-HTML whitespace characters
+                       // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+                       attrNames = value && value.match( rnothtmlwhite );
+
+               if ( attrNames && elem.nodeType === 1 ) {
+                       while ( ( name = attrNames[ i++ ] ) ) {
+                               elem.removeAttribute( name );
+                       }
+               }
+       }
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+       set: function( elem, value, name ) {
+               if ( value === false ) {
+
+                       // Remove boolean attributes when set to false
+                       jQuery.removeAttr( elem, name );
+               } else {
+                       elem.setAttribute( name, name );
+               }
+               return name;
+       }
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+       var getter = attrHandle[ name ] || jQuery.find.attr;
+
+       attrHandle[ name ] = function( elem, name, isXML ) {
+               var ret, handle,
+                       lowercaseName = name.toLowerCase();
+
+               if ( !isXML ) {
+
+                       // Avoid an infinite loop by temporarily removing this function from the getter
+                       handle = attrHandle[ lowercaseName ];
+                       attrHandle[ lowercaseName ] = ret;
+                       ret = getter( elem, name, isXML ) != null ?
+                               lowercaseName :
+                               null;
+                       attrHandle[ lowercaseName ] = handle;
+               }
+               return ret;
+       };
+} );
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i,
+       rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+       prop: function( name, value ) {
+               return access( this, jQuery.prop, name, value, arguments.length > 1 );
+       },
+
+       removeProp: function( name ) {
+               return this.each( function() {
+                       delete this[ jQuery.propFix[ name ] || name ];
+               } );
+       }
+} );
+
+jQuery.extend( {
+       prop: function( elem, name, value ) {
+               var ret, hooks,
+                       nType = elem.nodeType;
+
+               // Don't get/set properties on text, comment and attribute nodes
+               if ( nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+                       // Fix name and attach hooks
+                       name = jQuery.propFix[ name ] || name;
+                       hooks = jQuery.propHooks[ name ];
+               }
+
+               if ( value !== undefined ) {
+                       if ( hooks && "set" in hooks &&
+                               ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+                               return ret;
+                       }
+
+                       return ( elem[ name ] = value );
+               }
+
+               if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+                       return ret;
+               }
+
+               return elem[ name ];
+       },
+
+       propHooks: {
+               tabIndex: {
+                       get: function( elem ) {
+
+                               // Support: IE <=9 - 11 only
+                               // elem.tabIndex doesn't always return the
+                               // correct value when it hasn't been explicitly set
+                               // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                               // Use proper attribute retrieval(#12072)
+                               var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+                               if ( tabindex ) {
+                                       return parseInt( tabindex, 10 );
+                               }
+
+                               if (
+                                       rfocusable.test( elem.nodeName ) ||
+                                       rclickable.test( elem.nodeName ) &&
+                                       elem.href
+                               ) {
+                                       return 0;
+                               }
+
+                               return -1;
+                       }
+               }
+       },
+
+       propFix: {
+               "for": "htmlFor",
+               "class": "className"
+       }
+} );
+
+// Support: IE <=11 only
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+// eslint rule "no-unused-expressions" is disabled for this code
+// since it considers such accessions noop
+if ( !support.optSelected ) {
+       jQuery.propHooks.selected = {
+               get: function( elem ) {
+
+                       /* eslint no-unused-expressions: "off" */
+
+                       var parent = elem.parentNode;
+                       if ( parent && parent.parentNode ) {
+                               parent.parentNode.selectedIndex;
+                       }
+                       return null;
+               },
+               set: function( elem ) {
+
+                       /* eslint no-unused-expressions: "off" */
+
+                       var parent = elem.parentNode;
+                       if ( parent ) {
+                               parent.selectedIndex;
+
+                               if ( parent.parentNode ) {
+                                       parent.parentNode.selectedIndex;
+                               }
+                       }
+               }
+       };
+}
+
+jQuery.each( [
+       "tabIndex",
+       "readOnly",
+       "maxLength",
+       "cellSpacing",
+       "cellPadding",
+       "rowSpan",
+       "colSpan",
+       "useMap",
+       "frameBorder",
+       "contentEditable"
+], function() {
+       jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+
+
+
+       // Strip and collapse whitespace according to HTML spec
+       // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
+       function stripAndCollapse( value ) {
+               var tokens = value.match( rnothtmlwhite ) || [];
+               return tokens.join( " " );
+       }
+
+
+function getClass( elem ) {
+       return elem.getAttribute && elem.getAttribute( "class" ) || "";
+}
+
+jQuery.fn.extend( {
+       addClass: function( value ) {
+               var classes, elem, cur, curValue, clazz, j, finalValue,
+                       i = 0;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each( function( j ) {
+                               jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+                       } );
+               }
+
+               if ( typeof value === "string" && value ) {
+                       classes = value.match( rnothtmlwhite ) || [];
+
+                       while ( ( elem = this[ i++ ] ) ) {
+                               curValue = getClass( elem );
+                               cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+                               if ( cur ) {
+                                       j = 0;
+                                       while ( ( clazz = classes[ j++ ] ) ) {
+                                               if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+                                                       cur += clazz + " ";
+                                               }
+                                       }
+
+                                       // Only assign if different to avoid unneeded rendering.
+                                       finalValue = stripAndCollapse( cur );
+                                       if ( curValue !== finalValue ) {
+                                               elem.setAttribute( "class", finalValue );
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       removeClass: function( value ) {
+               var classes, elem, cur, curValue, clazz, j, finalValue,
+                       i = 0;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each( function( j ) {
+                               jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+                       } );
+               }
+
+               if ( !arguments.length ) {
+                       return this.attr( "class", "" );
+               }
+
+               if ( typeof value === "string" && value ) {
+                       classes = value.match( rnothtmlwhite ) || [];
+
+                       while ( ( elem = this[ i++ ] ) ) {
+                               curValue = getClass( elem );
+
+                               // This expression is here for better compressibility (see addClass)
+                               cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+                               if ( cur ) {
+                                       j = 0;
+                                       while ( ( clazz = classes[ j++ ] ) ) {
+
+                                               // Remove *all* instances
+                                               while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+                                                       cur = cur.replace( " " + clazz + " ", " " );
+                                               }
+                                       }
+
+                                       // Only assign if different to avoid unneeded rendering.
+                                       finalValue = stripAndCollapse( cur );
+                                       if ( curValue !== finalValue ) {
+                                               elem.setAttribute( "class", finalValue );
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value;
+
+               if ( typeof stateVal === "boolean" && type === "string" ) {
+                       return stateVal ? this.addClass( value ) : this.removeClass( value );
+               }
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each( function( i ) {
+                               jQuery( this ).toggleClass(
+                                       value.call( this, i, getClass( this ), stateVal ),
+                                       stateVal
+                               );
+                       } );
+               }
+
+               return this.each( function() {
+                       var className, i, self, classNames;
+
+                       if ( type === "string" ) {
+
+                               // Toggle individual class names
+                               i = 0;
+                               self = jQuery( this );
+                               classNames = value.match( rnothtmlwhite ) || [];
+
+                               while ( ( className = classNames[ i++ ] ) ) {
+
+                                       // Check each className given, space separated list
+                                       if ( self.hasClass( className ) ) {
+                                               self.removeClass( className );
+                                       } else {
+                                               self.addClass( className );
+                                       }
+                               }
+
+                       // Toggle whole class name
+                       } else if ( value === undefined || type === "boolean" ) {
+                               className = getClass( this );
+                               if ( className ) {
+
+                                       // Store className if set
+                                       dataPriv.set( this, "__className__", className );
+                               }
+
+                               // If the element has a class name or if we're passed `false`,
+                               // then remove the whole classname (if there was one, the above saved it).
+                               // Otherwise bring back whatever was previously saved (if anything),
+                               // falling back to the empty string if nothing was stored.
+                               if ( this.setAttribute ) {
+                                       this.setAttribute( "class",
+                                               className || value === false ?
+                                               "" :
+                                               dataPriv.get( this, "__className__" ) || ""
+                                       );
+                               }
+                       }
+               } );
+       },
+
+       hasClass: function( selector ) {
+               var className, elem,
+                       i = 0;
+
+               className = " " + selector + " ";
+               while ( ( elem = this[ i++ ] ) ) {
+                       if ( elem.nodeType === 1 &&
+                               ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
+                                       return true;
+                       }
+               }
+
+               return false;
+       }
+} );
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend( {
+       val: function( value ) {
+               var hooks, ret, isFunction,
+                       elem = this[ 0 ];
+
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.type ] ||
+                                       jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+                               if ( hooks &&
+                                       "get" in hooks &&
+                                       ( ret = hooks.get( elem, "value" ) ) !== undefined
+                               ) {
+                                       return ret;
+                               }
+
+                               ret = elem.value;
+
+                               // Handle most common string cases
+                               if ( typeof ret === "string" ) {
+                                       return ret.replace( rreturn, "" );
+                               }
+
+                               // Handle cases where value is null/undef or number
+                               return ret == null ? "" : ret;
+                       }
+
+                       return;
+               }
+
+               isFunction = jQuery.isFunction( value );
+
+               return this.each( function( i ) {
+                       var val;
+
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
+
+                       if ( isFunction ) {
+                               val = value.call( this, i, jQuery( this ).val() );
+                       } else {
+                               val = value;
+                       }
+
+                       // Treat null/undefined as ""; convert numbers to string
+                       if ( val == null ) {
+                               val = "";
+
+                       } else if ( typeof val === "number" ) {
+                               val += "";
+
+                       } else if ( Array.isArray( val ) ) {
+                               val = jQuery.map( val, function( value ) {
+                                       return value == null ? "" : value + "";
+                               } );
+                       }
+
+                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+                       // If set returns undefined, fall back to normal setting
+                       if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+                               this.value = val;
+                       }
+               } );
+       }
+} );
+
+jQuery.extend( {
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+
+                               var val = jQuery.find.attr( elem, "value" );
+                               return val != null ?
+                                       val :
+
+                                       // Support: IE <=10 - 11 only
+                                       // option.text throws exceptions (#14686, #14858)
+                                       // Strip and collapse whitespace
+                                       // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+                                       stripAndCollapse( jQuery.text( elem ) );
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, option, i,
+                                       options = elem.options,
+                                       index = elem.selectedIndex,
+                                       one = elem.type === "select-one",
+                                       values = one ? null : [],
+                                       max = one ? index + 1 : options.length;
+
+                               if ( index < 0 ) {
+                                       i = max;
+
+                               } else {
+                                       i = one ? index : 0;
+                               }
+
+                               // Loop through all the selected options
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
+
+                                       // Support: IE <=9 only
+                                       // IE8-9 doesn't update selected after form reset (#2551)
+                                       if ( ( option.selected || i === index ) &&
+
+                                                       // Don't return options that are disabled or in a disabled optgroup
+                                                       !option.disabled &&
+                                                       ( !option.parentNode.disabled ||
+                                                               !nodeName( option.parentNode, "optgroup" ) ) ) {
+
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
+
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
+                                               }
+
+                                               // Multi-Selects return an array
+                                               values.push( value );
+                                       }
+                               }
+
+                               return values;
+                       },
+
+                       set: function( elem, value ) {
+                               var optionSet, option,
+                                       options = elem.options,
+                                       values = jQuery.makeArray( value ),
+                                       i = options.length;
+
+                               while ( i-- ) {
+                                       option = options[ i ];
+
+                                       /* eslint-disable no-cond-assign */
+
+                                       if ( option.selected =
+                                               jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
+                                       ) {
+                                               optionSet = true;
+                                       }
+
+                                       /* eslint-enable no-cond-assign */
+                               }
+
+                               // Force browsers to behave consistently when non-matching value is set
+                               if ( !optionSet ) {
+                                       elem.selectedIndex = -1;
+                               }
+                               return values;
+                       }
+               }
+       }
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = {
+               set: function( elem, value ) {
+                       if ( Array.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+                       }
+               }
+       };
+       if ( !support.checkOn ) {
+               jQuery.valHooks[ this ].get = function( elem ) {
+                       return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+               };
+       }
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
+
+jQuery.extend( jQuery.event, {
+
+       trigger: function( event, data, elem, onlyHandlers ) {
+
+               var i, cur, tmp, bubbleType, ontype, handle, special,
+                       eventPath = [ elem || document ],
+                       type = hasOwn.call( event, "type" ) ? event.type : event,
+                       namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+               cur = tmp = elem = elem || document;
+
+               // Don't do events on text and comment nodes
+               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+                       return;
+               }
+
+               // focus/blur morphs to focusin/out; ensure we're not firing them right now
+               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                       return;
+               }
+
+               if ( type.indexOf( "." ) > -1 ) {
+
+                       // Namespaced trigger; create a regexp to match event type in handle()
+                       namespaces = type.split( "." );
+                       type = namespaces.shift();
+                       namespaces.sort();
+               }
+               ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+               // Caller can pass in a jQuery.Event object, Object, or just an event type string
+               event = event[ jQuery.expando ] ?
+                       event :
+                       new jQuery.Event( type, typeof event === "object" && event );
+
+               // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+               event.isTrigger = onlyHandlers ? 2 : 3;
+               event.namespace = namespaces.join( "." );
+               event.rnamespace = event.namespace ?
+                       new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+                       null;
+
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               if ( !event.target ) {
+                       event.target = elem;
+               }
+
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data == null ?
+                       [ event ] :
+                       jQuery.makeArray( data, [ event ] );
+
+               // Allow special events to draw outside the lines
+               special = jQuery.event.special[ type ] || {};
+               if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+                       return;
+               }
+
+               // Determine event propagation path in advance, per W3C events spec (#9951)
+               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+                       bubbleType = special.delegateType || type;
+                       if ( !rfocusMorph.test( bubbleType + type ) ) {
+                               cur = cur.parentNode;
+                       }
+                       for ( ; cur; cur = cur.parentNode ) {
+                               eventPath.push( cur );
+                               tmp = cur;
+                       }
+
+                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                       if ( tmp === ( elem.ownerDocument || document ) ) {
+                               eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+                       }
+               }
+
+               // Fire handlers on the event path
+               i = 0;
+               while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+
+                       event.type = i > 1 ?
+                               bubbleType :
+                               special.bindType || type;
+
+                       // jQuery handler
+                       handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
+                               dataPriv.get( cur, "handle" );
+                       if ( handle ) {
+                               handle.apply( cur, data );
+                       }
+
+                       // Native handler
+                       handle = ontype && cur[ ontype ];
+                       if ( handle && handle.apply && acceptData( cur ) ) {
+                               event.result = handle.apply( cur, data );
+                               if ( event.result === false ) {
+                                       event.preventDefault();
+                               }
+                       }
+               }
+               event.type = type;
+
+               // If nobody prevented the default action, do it now
+               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+                       if ( ( !special._default ||
+                               special._default.apply( eventPath.pop(), data ) === false ) &&
+                               acceptData( elem ) ) {
+
+                               // Call a native DOM method on the target with the same name as the event.
+                               // Don't do default actions on window, that's where global variables be (#6170)
+                               if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+                                       // Don't re-trigger an onFOO event when we call its FOO() method
+                                       tmp = elem[ ontype ];
+
+                                       if ( tmp ) {
+                                               elem[ ontype ] = null;
+                                       }
+
+                                       // Prevent re-triggering of the same event, since we already bubbled it above
+                                       jQuery.event.triggered = type;
+                                       elem[ type ]();
+                                       jQuery.event.triggered = undefined;
+
+                                       if ( tmp ) {
+                                               elem[ ontype ] = tmp;
+                                       }
+                               }
+                       }
+               }
+
+               return event.result;
+       },
+
+       // Piggyback on a donor event to simulate a different one
+       // Used only for `focus(in | out)` events
+       simulate: function( type, elem, event ) {
+               var e = jQuery.extend(
+                       new jQuery.Event(),
+                       event,
+                       {
+                               type: type,
+                               isSimulated: true
+                       }
+               );
+
+               jQuery.event.trigger( e, null, elem );
+       }
+
+} );
+
+jQuery.fn.extend( {
+
+       trigger: function( type, data ) {
+               return this.each( function() {
+                       jQuery.event.trigger( type, data, this );
+               } );
+       },
+       triggerHandler: function( type, data ) {
+               var elem = this[ 0 ];
+               if ( elem ) {
+                       return jQuery.event.trigger( type, data, elem, true );
+               }
+       }
+} );
+
+
+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup contextmenu" ).split( " " ),
+       function( i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
+} );
+
+jQuery.fn.extend( {
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+       }
+} );
+
+
+
+
+support.focusin = "onfocusin" in window;
+
+
+// Support: Firefox <=44
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+       jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+               // Attach a single capturing handler on the document while someone wants focusin/focusout
+               var handler = function( event ) {
+                       jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+               };
+
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               var doc = this.ownerDocument || this,
+                                       attaches = dataPriv.access( doc, fix );
+
+                               if ( !attaches ) {
+                                       doc.addEventListener( orig, handler, true );
+                               }
+                               dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
+                       },
+                       teardown: function() {
+                               var doc = this.ownerDocument || this,
+                                       attaches = dataPriv.access( doc, fix ) - 1;
+
+                               if ( !attaches ) {
+                                       doc.removeEventListener( orig, handler, true );
+                                       dataPriv.remove( doc, fix );
+
+                               } else {
+                                       dataPriv.access( doc, fix, attaches );
+                               }
+                       }
+               };
+       } );
+}
+var location = window.location;
+
+var nonce = jQuery.now();
+
+var rquery = ( /\?/ );
+
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+       var xml;
+       if ( !data || typeof data !== "string" ) {
+               return null;
+       }
+
+       // Support: IE 9 - 11 only
+       // IE throws on parseFromString with invalid input.
+       try {
+               xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
+       } catch ( e ) {
+               xml = undefined;
+       }
+
+       if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+               jQuery.error( "Invalid XML: " + data );
+       }
+       return xml;
+};
+
+
+var
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+       rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+       var name;
+
+       if ( Array.isArray( obj ) ) {
+
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
+
+                       } else {
+
+                               // Item is non-scalar (array or object), encode its numeric index.
+                               buildParams(
+                                       prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+                                       v,
+                                       traditional,
+                                       add
+                               );
+                       }
+               } );
+
+       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+
+               // Serialize object item.
+               for ( name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
+
+       } else {
+
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+       var prefix,
+               s = [],
+               add = function( key, valueOrFunction ) {
+
+                       // If value is a function, invoke it and use its return value
+                       var value = jQuery.isFunction( valueOrFunction ) ?
+                               valueOrFunction() :
+                               valueOrFunction;
+
+                       s[ s.length ] = encodeURIComponent( key ) + "=" +
+                               encodeURIComponent( value == null ? "" : value );
+               };
+
+       // If an array was passed in, assume that it is an array of form elements.
+       if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+               // Serialize the form elements
+               jQuery.each( a, function() {
+                       add( this.name, this.value );
+               } );
+
+       } else {
+
+               // If traditional, encode the "old" way (the way 1.3.2 or older
+               // did it), otherwise encode params recursively.
+               for ( prefix in a ) {
+                       buildParams( prefix, a[ prefix ], traditional, add );
+               }
+       }
+
+       // Return the resulting serialization
+       return s.join( "&" );
+};
+
+jQuery.fn.extend( {
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+       serializeArray: function() {
+               return this.map( function() {
+
+                       // Can add propHook for "elements" to filter or add form elements
+                       var elements = jQuery.prop( this, "elements" );
+                       return elements ? jQuery.makeArray( elements ) : this;
+               } )
+               .filter( function() {
+                       var type = this.type;
+
+                       // Use .is( ":disabled" ) so that fieldset[disabled] works
+                       return this.name && !jQuery( this ).is( ":disabled" ) &&
+                               rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+                               ( this.checked || !rcheckableType.test( type ) );
+               } )
+               .map( function( i, elem ) {
+                       var val = jQuery( this ).val();
+
+                       if ( val == null ) {
+                               return null;
+                       }
+
+                       if ( Array.isArray( val ) ) {
+                               return jQuery.map( val, function( val ) {
+                                       return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                               } );
+                       }
+
+                       return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               } ).get();
+       }
+} );
+
+
+var
+       r20 = /%20/g,
+       rhash = /#.*$/,
+       rantiCache = /([?&])_=[^&]*/,
+       rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+
+       // #7653, #8125, #8152: local protocol detection
+       rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+       rnoContent = /^(?:GET|HEAD)$/,
+       rprotocol = /^\/\//,
+
+       /* Prefilters
+        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+        * 2) These are called:
+        *    - BEFORE asking for a transport
+        *    - AFTER param serialization (s.data is a string if s.processData is true)
+        * 3) key is the dataType
+        * 4) the catchall symbol "*" can be used
+        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+        */
+       prefilters = {},
+
+       /* Transports bindings
+        * 1) key is the dataType
+        * 2) the catchall symbol "*" can be used
+        * 3) selection will start with transport dataType and THEN go to "*" if needed
+        */
+       transports = {},
+
+       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+       allTypes = "*/".concat( "*" ),
+
+       // Anchor tag for parsing the document origin
+       originAnchor = document.createElement( "a" );
+       originAnchor.href = location.href;
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+       // dataTypeExpression is optional and defaults to "*"
+       return function( dataTypeExpression, func ) {
+
+               if ( typeof dataTypeExpression !== "string" ) {
+                       func = dataTypeExpression;
+                       dataTypeExpression = "*";
+               }
+
+               var dataType,
+                       i = 0,
+                       dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
+
+               if ( jQuery.isFunction( func ) ) {
+
+                       // For each dataType in the dataTypeExpression
+                       while ( ( dataType = dataTypes[ i++ ] ) ) {
+
+                               // Prepend if requested
+                               if ( dataType[ 0 ] === "+" ) {
+                                       dataType = dataType.slice( 1 ) || "*";
+                                       ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
+
+                               // Otherwise append
+                               } else {
+                                       ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
+                               }
+                       }
+               }
+       };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+       var inspected = {},
+               seekingTransport = ( structure === transports );
+
+       function inspect( dataType ) {
+               var selected;
+               inspected[ dataType ] = true;
+               jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+                       var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+                       if ( typeof dataTypeOrTransport === "string" &&
+                               !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+
+                               options.dataTypes.unshift( dataTypeOrTransport );
+                               inspect( dataTypeOrTransport );
+                               return false;
+                       } else if ( seekingTransport ) {
+                               return !( selected = dataTypeOrTransport );
+                       }
+               } );
+               return selected;
+       }
+
+       return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+       var key, deep,
+               flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+       for ( key in src ) {
+               if ( src[ key ] !== undefined ) {
+                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+               }
+       }
+       if ( deep ) {
+               jQuery.extend( true, target, deep );
+       }
+
+       return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+       var ct, type, finalDataType, firstDataType,
+               contents = s.contents,
+               dataTypes = s.dataTypes;
+
+       // Remove auto dataType and get content-type in the process
+       while ( dataTypes[ 0 ] === "*" ) {
+               dataTypes.shift();
+               if ( ct === undefined ) {
+                       ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
+               }
+       }
+
+       // Check if we're dealing with a known content-type
+       if ( ct ) {
+               for ( type in contents ) {
+                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
+                               dataTypes.unshift( type );
+                               break;
+                       }
+               }
+       }
+
+       // Check to see if we have a response for the expected dataType
+       if ( dataTypes[ 0 ] in responses ) {
+               finalDataType = dataTypes[ 0 ];
+       } else {
+
+               // Try convertible dataTypes
+               for ( type in responses ) {
+                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
+                               finalDataType = type;
+                               break;
+                       }
+                       if ( !firstDataType ) {
+                               firstDataType = type;
+                       }
+               }
+
+               // Or just use first one
+               finalDataType = finalDataType || firstDataType;
+       }
+
+       // If we found a dataType
+       // We add the dataType to the list if needed
+       // and return the corresponding response
+       if ( finalDataType ) {
+               if ( finalDataType !== dataTypes[ 0 ] ) {
+                       dataTypes.unshift( finalDataType );
+               }
+               return responses[ finalDataType ];
+       }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+       var conv2, current, conv, tmp, prev,
+               converters = {},
+
+               // Work with a copy of dataTypes in case we need to modify it for conversion
+               dataTypes = s.dataTypes.slice();
+
+       // Create converters map with lowercased keys
+       if ( dataTypes[ 1 ] ) {
+               for ( conv in s.converters ) {
+                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
+               }
+       }
+
+       current = dataTypes.shift();
+
+       // Convert to each sequential dataType
+       while ( current ) {
+
+               if ( s.responseFields[ current ] ) {
+                       jqXHR[ s.responseFields[ current ] ] = response;
+               }
+
+               // Apply the dataFilter if provided
+               if ( !prev && isSuccess && s.dataFilter ) {
+                       response = s.dataFilter( response, s.dataType );
+               }
+
+               prev = current;
+               current = dataTypes.shift();
+
+               if ( current ) {
+
+                       // There's only work to do if current dataType is non-auto
+                       if ( current === "*" ) {
+
+                               current = prev;
+
+                       // Convert response if prev dataType is non-auto and differs from current
+                       } else if ( prev !== "*" && prev !== current ) {
+
+                               // Seek a direct converter
+                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+                               // If none found, seek a pair
+                               if ( !conv ) {
+                                       for ( conv2 in converters ) {
+
+                                               // If conv2 outputs current
+                                               tmp = conv2.split( " " );
+                                               if ( tmp[ 1 ] === current ) {
+
+                                                       // If prev can be converted to accepted input
+                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
+                                                               converters[ "* " + tmp[ 0 ] ];
+                                                       if ( conv ) {
+
+                                                               // Condense equivalence converters
+                                                               if ( conv === true ) {
+                                                                       conv = converters[ conv2 ];
+
+                                                               // Otherwise, insert the intermediate dataType
+                                                               } else if ( converters[ conv2 ] !== true ) {
+                                                                       current = tmp[ 0 ];
+                                                                       dataTypes.unshift( tmp[ 1 ] );
+                                                               }
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // Apply converter (if not an equivalence)
+                               if ( conv !== true ) {
+
+                                       // Unless errors are allowed to bubble, catch and return them
+                                       if ( conv && s.throws ) {
+                                               response = conv( response );
+                                       } else {
+                                               try {
+                                                       response = conv( response );
+                                               } catch ( e ) {
+                                                       return {
+                                                               state: "parsererror",
+                                                               error: conv ? e : "No conversion from " + prev + " to " + current
+                                                       };
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return { state: "success", data: response };
+}
+
+jQuery.extend( {
+
+       // Counter for holding the number of active queries
+       active: 0,
+
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {},
+
+       ajaxSettings: {
+               url: location.href,
+               type: "GET",
+               isLocal: rlocalProtocol.test( location.protocol ),
+               global: true,
+               processData: true,
+               async: true,
+               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+
+               /*
+               timeout: 0,
+               data: null,
+               dataType: null,
+               username: null,
+               password: null,
+               cache: null,
+               throws: false,
+               traditional: false,
+               headers: {},
+               */
+
+               accepts: {
+                       "*": allTypes,
+                       text: "text/plain",
+                       html: "text/html",
+                       xml: "application/xml, text/xml",
+                       json: "application/json, text/javascript"
+               },
+
+               contents: {
+                       xml: /\bxml\b/,
+                       html: /\bhtml/,
+                       json: /\bjson\b/
+               },
+
+               responseFields: {
+                       xml: "responseXML",
+                       text: "responseText",
+                       json: "responseJSON"
+               },
+
+               // Data converters
+               // Keys separate source (or catchall "*") and destination types with a single space
+               converters: {
+
+                       // Convert anything to text
+                       "* text": String,
+
+                       // Text to html (true = no transformation)
+                       "text html": true,
+
+                       // Evaluate text as a json expression
+                       "text json": JSON.parse,
+
+                       // Parse text as xml
+                       "text xml": jQuery.parseXML
+               },
+
+               // For options that shouldn't be deep extended:
+               // you can add your own custom options here if
+               // and when you create one that shouldn't be
+               // deep extended (see ajaxExtend)
+               flatOptions: {
+                       url: true,
+                       context: true
+               }
+       },
+
+       // Creates a full fledged settings object into target
+       // with both ajaxSettings and settings fields.
+       // If target is omitted, writes into ajaxSettings.
+       ajaxSetup: function( target, settings ) {
+               return settings ?
+
+                       // Building a settings object
+                       ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+                       // Extending ajaxSettings
+                       ajaxExtend( jQuery.ajaxSettings, target );
+       },
+
+       ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+       ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+       // Main method
+       ajax: function( url, options ) {
+
+               // If url is an object, simulate pre-1.5 signature
+               if ( typeof url === "object" ) {
+                       options = url;
+                       url = undefined;
+               }
+
+               // Force options to be an object
+               options = options || {};
+
+               var transport,
+
+                       // URL without anti-cache param
+                       cacheURL,
+
+                       // Response headers
+                       responseHeadersString,
+                       responseHeaders,
+
+                       // timeout handle
+                       timeoutTimer,
+
+                       // Url cleanup var
+                       urlAnchor,
+
+                       // Request state (becomes false upon send and true upon completion)
+                       completed,
+
+                       // To know if global events are to be dispatched
+                       fireGlobals,
+
+                       // Loop variable
+                       i,
+
+                       // uncached part of the url
+                       uncached,
+
+                       // Create the final options object
+                       s = jQuery.ajaxSetup( {}, options ),
+
+                       // Callbacks context
+                       callbackContext = s.context || s,
+
+                       // Context for global events is callbackContext if it is a DOM node or jQuery collection
+                       globalEventContext = s.context &&
+                               ( callbackContext.nodeType || callbackContext.jquery ) ?
+                                       jQuery( callbackContext ) :
+                                       jQuery.event,
+
+                       // Deferreds
+                       deferred = jQuery.Deferred(),
+                       completeDeferred = jQuery.Callbacks( "once memory" ),
+
+                       // Status-dependent callbacks
+                       statusCode = s.statusCode || {},
+
+                       // Headers (they are sent all at once)
+                       requestHeaders = {},
+                       requestHeadersNames = {},
+
+                       // Default abort message
+                       strAbort = "canceled",
+
+                       // Fake xhr
+                       jqXHR = {
+                               readyState: 0,
+
+                               // Builds headers hashtable if needed
+                               getResponseHeader: function( key ) {
+                                       var match;
+                                       if ( completed ) {
+                                               if ( !responseHeaders ) {
+                                                       responseHeaders = {};
+                                                       while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
+                                                               responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
+                                                       }
+                                               }
+                                               match = responseHeaders[ key.toLowerCase() ];
+                                       }
+                                       return match == null ? null : match;
+                               },
+
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return completed ? responseHeadersString : null;
+                               },
+
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       if ( completed == null ) {
+                                               name = requestHeadersNames[ name.toLowerCase() ] =
+                                                       requestHeadersNames[ name.toLowerCase() ] || name;
+                                               requestHeaders[ name ] = value;
+                                       }
+                                       return this;
+                               },
+
+                               // Overrides response content-type header
+                               overrideMimeType: function( type ) {
+                                       if ( completed == null ) {
+                                               s.mimeType = type;
+                                       }
+                                       return this;
+                               },
+
+                               // Status-dependent callbacks
+                               statusCode: function( map ) {
+                                       var code;
+                                       if ( map ) {
+                                               if ( completed ) {
+
+                                                       // Execute the appropriate callbacks
+                                                       jqXHR.always( map[ jqXHR.status ] );
+                                               } else {
+
+                                                       // Lazy-add the new callbacks in a way that preserves old ones
+                                                       for ( code in map ) {
+                                                               statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+                                                       }
+                                               }
+                                       }
+                                       return this;
+                               },
+
+                               // Cancel the request
+                               abort: function( statusText ) {
+                                       var finalText = statusText || strAbort;
+                                       if ( transport ) {
+                                               transport.abort( finalText );
+                                       }
+                                       done( 0, finalText );
+                                       return this;
+                               }
+                       };
+
+               // Attach deferreds
+               deferred.promise( jqXHR );
+
+               // Add protocol if not provided (prefilters might expect it)
+               // Handle falsy url in the settings object (#10093: consistency with old signature)
+               // We also use the url parameter if available
+               s.url = ( ( url || s.url || location.href ) + "" )
+                       .replace( rprotocol, location.protocol + "//" );
+
+               // Alias method option to type as per ticket #12004
+               s.type = options.method || options.type || s.method || s.type;
+
+               // Extract dataTypes list
+               s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
+
+               // A cross-domain request is in order when the origin doesn't match the current origin.
+               if ( s.crossDomain == null ) {
+                       urlAnchor = document.createElement( "a" );
+
+                       // Support: IE <=8 - 11, Edge 12 - 13
+                       // IE throws exception on accessing the href property if url is malformed,
+                       // e.g. http://example.com:80x/
+                       try {
+                               urlAnchor.href = s.url;
+
+                               // Support: IE <=8 - 11 only
+                               // Anchor's host property isn't correctly set when s.url is relative
+                               urlAnchor.href = urlAnchor.href;
+                               s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
+                                       urlAnchor.protocol + "//" + urlAnchor.host;
+                       } catch ( e ) {
+
+                               // If there is an error parsing the URL, assume it is crossDomain,
+                               // it can be rejected by the transport if it is invalid
+                               s.crossDomain = true;
+                       }
+               }
+
+               // Convert data if not already a string
+               if ( s.data && s.processData && typeof s.data !== "string" ) {
+                       s.data = jQuery.param( s.data, s.traditional );
+               }
+
+               // Apply prefilters
+               inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+               // If request was aborted inside a prefilter, stop there
+               if ( completed ) {
+                       return jqXHR;
+               }
+
+               // We can fire global events as of now if asked to
+               // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+               fireGlobals = jQuery.event && s.global;
+
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger( "ajaxStart" );
+               }
+
+               // Uppercase the type
+               s.type = s.type.toUpperCase();
+
+               // Determine if request has content
+               s.hasContent = !rnoContent.test( s.type );
+
+               // Save the URL in case we're toying with the If-Modified-Since
+               // and/or If-None-Match header later on
+               // Remove hash to simplify url manipulation
+               cacheURL = s.url.replace( rhash, "" );
+
+               // More options handling for requests with no content
+               if ( !s.hasContent ) {
+
+                       // Remember the hash so we can put it back
+                       uncached = s.url.slice( cacheURL.length );
+
+                       // If data is available, append data to url
+                       if ( s.data ) {
+                               cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
+
+                               // #9682: remove data so that it's not used in an eventual retry
+                               delete s.data;
+                       }
+
+                       // Add or update anti-cache param if needed
+                       if ( s.cache === false ) {
+                               cacheURL = cacheURL.replace( rantiCache, "$1" );
+                               uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
+                       }
+
+                       // Put hash and anti-cache on the URL that will be requested (gh-1732)
+                       s.url = cacheURL + uncached;
+
+               // Change '%20' to '+' if this is encoded form body content (gh-2658)
+               } else if ( s.data && s.processData &&
+                       ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
+                       s.data = s.data.replace( r20, "+" );
+               }
+
+               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+               if ( s.ifModified ) {
+                       if ( jQuery.lastModified[ cacheURL ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+                       }
+                       if ( jQuery.etag[ cacheURL ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+                       }
+               }
+
+               // Set the correct header, if data is being sent
+               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
+               }
+
+               // Set the Accepts header for the server, depending on the dataType
+               jqXHR.setRequestHeader(
+                       "Accept",
+                       s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
+                               s.accepts[ s.dataTypes[ 0 ] ] +
+                                       ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+                               s.accepts[ "*" ]
+               );
+
+               // Check for headers option
+               for ( i in s.headers ) {
+                       jqXHR.setRequestHeader( i, s.headers[ i ] );
+               }
+
+               // Allow custom headers/mimetypes and early abort
+               if ( s.beforeSend &&
+                       ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
+
+                       // Abort if not done already and return
+                       return jqXHR.abort();
+               }
+
+               // Aborting is no longer a cancellation
+               strAbort = "abort";
+
+               // Install callbacks on deferreds
+               completeDeferred.add( s.complete );
+               jqXHR.done( s.success );
+               jqXHR.fail( s.error );
+
+               // Get transport
+               transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+               // If no transport, we auto-abort
+               if ( !transport ) {
+                       done( -1, "No Transport" );
+               } else {
+                       jqXHR.readyState = 1;
+
+                       // Send global event
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+                       }
+
+                       // If request was aborted inside ajaxSend, stop there
+                       if ( completed ) {
+                               return jqXHR;
+                       }
+
+                       // Timeout
+                       if ( s.async && s.timeout > 0 ) {
+                               timeoutTimer = window.setTimeout( function() {
+                                       jqXHR.abort( "timeout" );
+                               }, s.timeout );
+                       }
+
+                       try {
+                               completed = false;
+                               transport.send( requestHeaders, done );
+                       } catch ( e ) {
+
+                               // Rethrow post-completion exceptions
+                               if ( completed ) {
+                                       throw e;
+                               }
+
+                               // Propagate others as results
+                               done( -1, e );
+                       }
+               }
+
+               // Callback for when everything is done
+               function done( status, nativeStatusText, responses, headers ) {
+                       var isSuccess, success, error, response, modified,
+                               statusText = nativeStatusText;
+
+                       // Ignore repeat invocations
+                       if ( completed ) {
+                               return;
+                       }
+
+                       completed = true;
+
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               window.clearTimeout( timeoutTimer );
+                       }
+
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
+
+                       // Cache response headers
+                       responseHeadersString = headers || "";
+
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
+
+                       // Determine if successful
+                       isSuccess = status >= 200 && status < 300 || status === 304;
+
+                       // Get response data
+                       if ( responses ) {
+                               response = ajaxHandleResponses( s, jqXHR, responses );
+                       }
+
+                       // Convert no matter what (that way responseXXX fields are always set)
+                       response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+                       // If successful, handle type chaining
+                       if ( isSuccess ) {
+
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
+                                       modified = jqXHR.getResponseHeader( "Last-Modified" );
+                                       if ( modified ) {
+                                               jQuery.lastModified[ cacheURL ] = modified;
+                                       }
+                                       modified = jqXHR.getResponseHeader( "etag" );
+                                       if ( modified ) {
+                                               jQuery.etag[ cacheURL ] = modified;
+                                       }
+                               }
+
+                               // if no content
+                               if ( status === 204 || s.type === "HEAD" ) {
+                                       statusText = "nocontent";
+
+                               // if not modified
+                               } else if ( status === 304 ) {
+                                       statusText = "notmodified";
+
+                               // If we have data, let's convert it
+                               } else {
+                                       statusText = response.state;
+                                       success = response.data;
+                                       error = response.error;
+                                       isSuccess = !error;
+                               }
+                       } else {
+
+                               // Extract error from statusText and normalize for non-aborts
+                               error = statusText;
+                               if ( status || !statusText ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
+
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
+
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+                                       [ jqXHR, s, isSuccess ? success : error ] );
+                       }
+
+                       // Complete
+                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger( "ajaxStop" );
+                               }
+                       }
+               }
+
+               return jqXHR;
+       },
+
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
+
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
+       }
+} );
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
+
+               // Shift arguments if data argument was omitted
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = undefined;
+               }
+
+               // The url can be an options object (which then must have .url)
+               return jQuery.ajax( jQuery.extend( {
+                       url: url,
+                       type: method,
+                       dataType: type,
+                       data: data,
+                       success: callback
+               }, jQuery.isPlainObject( url ) && url ) );
+       };
+} );
+
+
+jQuery._evalUrl = function( url ) {
+       return jQuery.ajax( {
+               url: url,
+
+               // Make this explicit, since user can override this through ajaxSetup (#11264)
+               type: "GET",
+               dataType: "script",
+               cache: true,
+               async: false,
+               global: false,
+               "throws": true
+       } );
+};
+
+
+jQuery.fn.extend( {
+       wrapAll: function( html ) {
+               var wrap;
+
+               if ( this[ 0 ] ) {
+                       if ( jQuery.isFunction( html ) ) {
+                               html = html.call( this[ 0 ] );
+                       }
+
+                       // The elements to wrap the target around
+                       wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+                       if ( this[ 0 ].parentNode ) {
+                               wrap.insertBefore( this[ 0 ] );
+                       }
+
+                       wrap.map( function() {
+                               var elem = this;
+
+                               while ( elem.firstElementChild ) {
+                                       elem = elem.firstElementChild;
+                               }
+
+                               return elem;
+                       } ).append( this );
+               }
+
+               return this;
+       },
+
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each( function( i ) {
+                               jQuery( this ).wrapInner( html.call( this, i ) );
+                       } );
+               }
+
+               return this.each( function() {
+                       var self = jQuery( this ),
+                               contents = self.contents();
+
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
+
+                       } else {
+                               self.append( html );
+                       }
+               } );
+       },
+
+       wrap: function( html ) {
+               var isFunction = jQuery.isFunction( html );
+
+               return this.each( function( i ) {
+                       jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
+               } );
+       },
+
+       unwrap: function( selector ) {
+               this.parent( selector ).not( "body" ).each( function() {
+                       jQuery( this ).replaceWith( this.childNodes );
+               } );
+               return this;
+       }
+} );
+
+
+jQuery.expr.pseudos.hidden = function( elem ) {
+       return !jQuery.expr.pseudos.visible( elem );
+};
+jQuery.expr.pseudos.visible = function( elem ) {
+       return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
+};
+
+
+
+
+jQuery.ajaxSettings.xhr = function() {
+       try {
+               return new window.XMLHttpRequest();
+       } catch ( e ) {}
+};
+
+var xhrSuccessStatus = {
+
+               // File protocol always yields status code 0, assume 200
+               0: 200,
+
+               // Support: IE <=9 only
+               // #1450: sometimes IE returns 1223 when it should be 204
+               1223: 204
+       },
+       xhrSupported = jQuery.ajaxSettings.xhr();
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport( function( options ) {
+       var callback, errorCallback;
+
+       // Cross domain only allowed if supported through XMLHttpRequest
+       if ( support.cors || xhrSupported && !options.crossDomain ) {
+               return {
+                       send: function( headers, complete ) {
+                               var i,
+                                       xhr = options.xhr();
+
+                               xhr.open(
+                                       options.type,
+                                       options.url,
+                                       options.async,
+                                       options.username,
+                                       options.password
+                               );
+
+                               // Apply custom fields if provided
+                               if ( options.xhrFields ) {
+                                       for ( i in options.xhrFields ) {
+                                               xhr[ i ] = options.xhrFields[ i ];
+                                       }
+                               }
+
+                               // Override mime type if needed
+                               if ( options.mimeType && xhr.overrideMimeType ) {
+                                       xhr.overrideMimeType( options.mimeType );
+                               }
+
+                               // X-Requested-With header
+                               // For cross-domain requests, seeing as conditions for a preflight are
+                               // akin to a jigsaw puzzle, we simply never set it to be sure.
+                               // (it can always be set on a per-request basis or even using ajaxSetup)
+                               // For same-domain requests, won't change header if already provided.
+                               if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
+                                       headers[ "X-Requested-With" ] = "XMLHttpRequest";
+                               }
+
+                               // Set headers
+                               for ( i in headers ) {
+                                       xhr.setRequestHeader( i, headers[ i ] );
+                               }
+
+                               // Callback
+                               callback = function( type ) {
+                                       return function() {
+                                               if ( callback ) {
+                                                       callback = errorCallback = xhr.onload =
+                                                               xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
+
+                                                       if ( type === "abort" ) {
+                                                               xhr.abort();
+                                                       } else if ( type === "error" ) {
+
+                                                               // Support: IE <=9 only
+                                                               // On a manual native abort, IE9 throws
+                                                               // errors on any property access that is not readyState
+                                                               if ( typeof xhr.status !== "number" ) {
+                                                                       complete( 0, "error" );
+                                                               } else {
+                                                                       complete(
+
+                                                                               // File: protocol always yields status 0; see #8605, #14207
+                                                                               xhr.status,
+                                                                               xhr.statusText
+                                                                       );
+                                                               }
+                                                       } else {
+                                                               complete(
+                                                                       xhrSuccessStatus[ xhr.status ] || xhr.status,
+                                                                       xhr.statusText,
+
+                                                                       // Support: IE <=9 only
+                                                                       // IE9 has no XHR2 but throws on binary (trac-11426)
+                                                                       // For XHR2 non-text, let the caller handle it (gh-2498)
+                                                                       ( xhr.responseType || "text" ) !== "text"  ||
+                                                                       typeof xhr.responseText !== "string" ?
+                                                                               { binary: xhr.response } :
+                                                                               { text: xhr.responseText },
+                                                                       xhr.getAllResponseHeaders()
+                                                               );
+                                                       }
+                                               }
+                                       };
+                               };
+
+                               // Listen to events
+                               xhr.onload = callback();
+                               errorCallback = xhr.onerror = callback( "error" );
+
+                               // Support: IE 9 only
+                               // Use onreadystatechange to replace onabort
+                               // to handle uncaught aborts
+                               if ( xhr.onabort !== undefined ) {
+                                       xhr.onabort = errorCallback;
+                               } else {
+                                       xhr.onreadystatechange = function() {
+
+                                               // Check readyState before timeout as it changes
+                                               if ( xhr.readyState === 4 ) {
+
+                                                       // Allow onerror to be called first,
+                                                       // but that will not handle a native abort
+                                                       // Also, save errorCallback to a variable
+                                                       // as xhr.onerror cannot be accessed
+                                                       window.setTimeout( function() {
+                                                               if ( callback ) {
+                                                                       errorCallback();
+                                                               }
+                                                       } );
+                                               }
+                                       };
+                               }
+
+                               // Create the abort callback
+                               callback = callback( "abort" );
+
+                               try {
+
+                                       // Do send the request (this may raise an exception)
+                                       xhr.send( options.hasContent && options.data || null );
+                               } catch ( e ) {
+
+                                       // #14683: Only rethrow if this hasn't been notified as an error yet
+                                       if ( callback ) {
+                                               throw e;
+                                       }
+                               }
+                       },
+
+                       abort: function() {
+                               if ( callback ) {
+                                       callback();
+                               }
+                       }
+               };
+       }
+} );
+
+
+
+
+// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
+jQuery.ajaxPrefilter( function( s ) {
+       if ( s.crossDomain ) {
+               s.contents.script = false;
+       }
+} );
+
+// Install script dataType
+jQuery.ajaxSetup( {
+       accepts: {
+               script: "text/javascript, application/javascript, " +
+                       "application/ecmascript, application/x-ecmascript"
+       },
+       contents: {
+               script: /\b(?:java|ecma)script\b/
+       },
+       converters: {
+               "text script": function( text ) {
+                       jQuery.globalEval( text );
+                       return text;
+               }
+       }
+} );
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+       if ( s.cache === undefined ) {
+               s.cache = false;
+       }
+       if ( s.crossDomain ) {
+               s.type = "GET";
+       }
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+
+       // This transport only deals with cross domain requests
+       if ( s.crossDomain ) {
+               var script, callback;
+               return {
+                       send: function( _, complete ) {
+                               script = jQuery( "<script>" ).prop( {
+                                       charset: s.scriptCharset,
+                                       src: s.url
+                               } ).on(
+                                       "load error",
+                                       callback = function( evt ) {
+                                               script.remove();
+                                               callback = null;
+                                               if ( evt ) {
+                                                       complete( evt.type === "error" ? 404 : 200, evt.type );
+                                               }
+                                       }
+                               );
+
+                               // Use native DOM manipulation to avoid our domManip AJAX trickery
+                               document.head.appendChild( script[ 0 ] );
+                       },
+                       abort: function() {
+                               if ( callback ) {
+                                       callback();
+                               }
+                       }
+               };
+       }
+} );
+
+
+
+
+var oldCallbacks = [],
+       rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup( {
+       jsonp: "callback",
+       jsonpCallback: function() {
+               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+               this[ callback ] = true;
+               return callback;
+       }
+} );
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+       var callbackName, overwritten, responseContainer,
+               jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+                       "url" :
+                       typeof s.data === "string" &&
+                               ( s.contentType || "" )
+                                       .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
+                               rjsonp.test( s.data ) && "data"
+               );
+
+       // Handle iff the expected data type is "jsonp" or we have a parameter to set
+       if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+               // Get callback name, remembering preexisting value associated with it
+               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+                       s.jsonpCallback() :
+                       s.jsonpCallback;
+
+               // Insert callback into url or form data
+               if ( jsonProp ) {
+                       s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+               } else if ( s.jsonp !== false ) {
+                       s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+               }
+
+               // Use data converter to retrieve json after script execution
+               s.converters[ "script json" ] = function() {
+                       if ( !responseContainer ) {
+                               jQuery.error( callbackName + " was not called" );
+                       }
+                       return responseContainer[ 0 ];
+               };
+
+               // Force json dataType
+               s.dataTypes[ 0 ] = "json";
+
+               // Install callback
+               overwritten = window[ callbackName ];
+               window[ callbackName ] = function() {
+                       responseContainer = arguments;
+               };
+
+               // Clean-up function (fires after converters)
+               jqXHR.always( function() {
+
+                       // If previous value didn't exist - remove it
+                       if ( overwritten === undefined ) {
+                               jQuery( window ).removeProp( callbackName );
+
+                       // Otherwise restore preexisting value
+                       } else {
+                               window[ callbackName ] = overwritten;
+                       }
+
+                       // Save back as free
+                       if ( s[ callbackName ] ) {
+
+                               // Make sure that re-using the options doesn't screw things around
+                               s.jsonpCallback = originalSettings.jsonpCallback;
+
+                               // Save the callback name for future use
+                               oldCallbacks.push( callbackName );
+                       }
+
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+                               overwritten( responseContainer[ 0 ] );
+                       }
+
+                       responseContainer = overwritten = undefined;
+               } );
+
+               // Delegate to script
+               return "script";
+       }
+} );
+
+
+
+
+// Support: Safari 8 only
+// In Safari 8 documents created via document.implementation.createHTMLDocument
+// collapse sibling forms: the second one becomes a child of the first one.
+// Because of that, this security measure has to be disabled in Safari 8.
+// https://bugs.webkit.org/show_bug.cgi?id=137337
+support.createHTMLDocument = ( function() {
+       var body = document.implementation.createHTMLDocument( "" ).body;
+       body.innerHTML = "<form></form><form></form>";
+       return body.childNodes.length === 2;
+} )();
+
+
+// Argument "data" should be string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+       if ( typeof data !== "string" ) {
+               return [];
+       }
+       if ( typeof context === "boolean" ) {
+               keepScripts = context;
+               context = false;
+       }
+
+       var base, parsed, scripts;
+
+       if ( !context ) {
+
+               // Stop scripts or inline event handlers from being executed immediately
+               // by using document.implementation
+               if ( support.createHTMLDocument ) {
+                       context = document.implementation.createHTMLDocument( "" );
+
+                       // Set the base href for the created document
+                       // so any parsed elements with URLs
+                       // are based on the document's URL (gh-2965)
+                       base = context.createElement( "base" );
+                       base.href = document.location.href;
+                       context.head.appendChild( base );
+               } else {
+                       context = document;
+               }
+       }
+
+       parsed = rsingleTag.exec( data );
+       scripts = !keepScripts && [];
+
+       // Single tag
+       if ( parsed ) {
+               return [ context.createElement( parsed[ 1 ] ) ];
+       }
+
+       parsed = buildFragment( [ data ], context, scripts );
+
+       if ( scripts && scripts.length ) {
+               jQuery( scripts ).remove();
+       }
+
+       return jQuery.merge( [], parsed.childNodes );
+};
+
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+       var selector, type, response,
+               self = this,
+               off = url.indexOf( " " );
+
+       if ( off > -1 ) {
+               selector = stripAndCollapse( url.slice( off ) );
+               url = url.slice( 0, off );
+       }
+
+       // If it's a function
+       if ( jQuery.isFunction( params ) ) {
+
+               // We assume that it's the callback
+               callback = params;
+               params = undefined;
+
+       // Otherwise, build a param string
+       } else if ( params && typeof params === "object" ) {
+               type = "POST";
+       }
+
+       // If we have elements to modify, make the request
+       if ( self.length > 0 ) {
+               jQuery.ajax( {
+                       url: url,
+
+                       // If "type" variable is undefined, then "GET" method will be used.
+                       // Make value of this field explicit since
+                       // user can override it through ajaxSetup method
+                       type: type || "GET",
+                       dataType: "html",
+                       data: params
+               } ).done( function( responseText ) {
+
+                       // Save response for use in complete callback
+                       response = arguments;
+
+                       self.html( selector ?
+
+                               // If a selector was specified, locate the right elements in a dummy div
+                               // Exclude scripts to avoid IE 'Permission Denied' errors
+                               jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+                               // Otherwise use the full result
+                               responseText );
+
+               // If the request succeeds, this function gets "data", "status", "jqXHR"
+               // but they are ignored because response was set above.
+               // If it fails, this function gets "jqXHR", "status", "error"
+               } ).always( callback && function( jqXHR, status ) {
+                       self.each( function() {
+                               callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
+                       } );
+               } );
+       }
+
+       return this;
+};
+
+
+
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [
+       "ajaxStart",
+       "ajaxStop",
+       "ajaxComplete",
+       "ajaxError",
+       "ajaxSuccess",
+       "ajaxSend"
+], function( i, type ) {
+       jQuery.fn[ type ] = function( fn ) {
+               return this.on( type, fn );
+       };
+} );
+
+
+
+
+jQuery.expr.pseudos.animated = function( elem ) {
+       return jQuery.grep( jQuery.timers, function( fn ) {
+               return elem === fn.elem;
+       } ).length;
+};
+
+
+
+
+jQuery.offset = {
+       setOffset: function( elem, options, i ) {
+               var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+                       position = jQuery.css( elem, "position" ),
+                       curElem = jQuery( elem ),
+                       props = {};
+
+               // Set position first, in-case top/left are set even on static elem
+               if ( position === "static" ) {
+                       elem.style.position = "relative";
+               }
+
+               curOffset = curElem.offset();
+               curCSSTop = jQuery.css( elem, "top" );
+               curCSSLeft = jQuery.css( elem, "left" );
+               calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+                       ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
+
+               // Need to be able to calculate position if either
+               // top or left is auto and position is either absolute or fixed
+               if ( calculatePosition ) {
+                       curPosition = curElem.position();
+                       curTop = curPosition.top;
+                       curLeft = curPosition.left;
+
+               } else {
+                       curTop = parseFloat( curCSSTop ) || 0;
+                       curLeft = parseFloat( curCSSLeft ) || 0;
+               }
+
+               if ( jQuery.isFunction( options ) ) {
+
+                       // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+                       options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+               }
+
+               if ( options.top != null ) {
+                       props.top = ( options.top - curOffset.top ) + curTop;
+               }
+               if ( options.left != null ) {
+                       props.left = ( options.left - curOffset.left ) + curLeft;
+               }
+
+               if ( "using" in options ) {
+                       options.using.call( elem, props );
+
+               } else {
+                       curElem.css( props );
+               }
+       }
+};
+
+jQuery.fn.extend( {
+       offset: function( options ) {
+
+               // Preserve chaining for setter
+               if ( arguments.length ) {
+                       return options === undefined ?
+                               this :
+                               this.each( function( i ) {
+                                       jQuery.offset.setOffset( this, options, i );
+                               } );
+               }
+
+               var doc, docElem, rect, win,
+                       elem = this[ 0 ];
+
+               if ( !elem ) {
+                       return;
+               }
+
+               // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
+               // Support: IE <=11 only
+               // Running getBoundingClientRect on a
+               // disconnected node in IE throws an error
+               if ( !elem.getClientRects().length ) {
+                       return { top: 0, left: 0 };
+               }
+
+               rect = elem.getBoundingClientRect();
+
+               doc = elem.ownerDocument;
+               docElem = doc.documentElement;
+               win = doc.defaultView;
+
+               return {
+                       top: rect.top + win.pageYOffset - docElem.clientTop,
+                       left: rect.left + win.pageXOffset - docElem.clientLeft
+               };
+       },
+
+       position: function() {
+               if ( !this[ 0 ] ) {
+                       return;
+               }
+
+               var offsetParent, offset,
+                       elem = this[ 0 ],
+                       parentOffset = { top: 0, left: 0 };
+
+               // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
+               // because it is its only offset parent
+               if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+                       // Assume getBoundingClientRect is there when computed position is fixed
+                       offset = elem.getBoundingClientRect();
+
+               } else {
+
+                       // Get *real* offsetParent
+                       offsetParent = this.offsetParent();
+
+                       // Get correct offsets
+                       offset = this.offset();
+                       if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
+                               parentOffset = offsetParent.offset();
+                       }
+
+                       // Add offsetParent borders
+                       parentOffset = {
+                               top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
+                               left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
+                       };
+               }
+
+               // Subtract parent offsets and element margins
+               return {
+                       top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+                       left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+               };
+       },
+
+       // This method will return documentElement in the following cases:
+       // 1) For the element inside the iframe without offsetParent, this method will return
+       //    documentElement of the parent window
+       // 2) For the hidden or detached element
+       // 3) For body or html element, i.e. in case of the html node - it will return itself
+       //
+       // but those exceptions were never presented as a real life use-cases
+       // and might be considered as more preferable results.
+       //
+       // This logic, however, is not guaranteed and can change at any point in the future
+       offsetParent: function() {
+               return this.map( function() {
+                       var offsetParent = this.offsetParent;
+
+                       while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
+                               offsetParent = offsetParent.offsetParent;
+                       }
+
+                       return offsetParent || documentElement;
+               } );
+       }
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+       var top = "pageYOffset" === prop;
+
+       jQuery.fn[ method ] = function( val ) {
+               return access( this, function( elem, method, val ) {
+
+                       // Coalesce documents and windows
+                       var win;
+                       if ( jQuery.isWindow( elem ) ) {
+                               win = elem;
+                       } else if ( elem.nodeType === 9 ) {
+                               win = elem.defaultView;
+                       }
+
+                       if ( val === undefined ) {
+                               return win ? win[ prop ] : elem[ method ];
+                       }
+
+                       if ( win ) {
+                               win.scrollTo(
+                                       !top ? val : win.pageXOffset,
+                                       top ? val : win.pageYOffset
+                               );
+
+                       } else {
+                               elem[ method ] = val;
+                       }
+               }, method, val, arguments.length );
+       };
+} );
+
+// Support: Safari <=7 - 9.1, Chrome <=37 - 49
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+       jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+               function( elem, computed ) {
+                       if ( computed ) {
+                               computed = curCSS( elem, prop );
+
+                               // If curCSS returns percentage, fallback to offset
+                               return rnumnonpx.test( computed ) ?
+                                       jQuery( elem ).position()[ prop ] + "px" :
+                                       computed;
+                       }
+               }
+       );
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
+               function( defaultExtra, funcName ) {
+
+               // Margin is only for outerHeight, outerWidth
+               jQuery.fn[ funcName ] = function( margin, value ) {
+                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+                       return access( this, function( elem, type, value ) {
+                               var doc;
+
+                               if ( jQuery.isWindow( elem ) ) {
+
+                                       // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
+                                       return funcName.indexOf( "outer" ) === 0 ?
+                                               elem[ "inner" + name ] :
+                                               elem.document.documentElement[ "client" + name ];
+                               }
+
+                               // Get document width or height
+                               if ( elem.nodeType === 9 ) {
+                                       doc = elem.documentElement;
+
+                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+                                       // whichever is greatest
+                                       return Math.max(
+                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
+                                               doc[ "client" + name ]
+                                       );
+                               }
+
+                               return value === undefined ?
+
+                                       // Get width or height on the element, requesting but not forcing parseFloat
+                                       jQuery.css( elem, type, extra ) :
+
+                                       // Set width or height on the element
+                                       jQuery.style( elem, type, value, extra );
+                       }, type, chainable ? margin : undefined, chainable );
+               };
+       } );
+} );
+
+
+jQuery.fn.extend( {
+
+       bind: function( types, data, fn ) {
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               return this.off( types, null, fn );
+       },
+
+       delegate: function( selector, types, data, fn ) {
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+
+               // ( namespace ) or ( selector, types [, fn] )
+               return arguments.length === 1 ?
+                       this.off( selector, "**" ) :
+                       this.off( types, selector || "**", fn );
+       }
+} );
+
+jQuery.holdReady = function( hold ) {
+       if ( hold ) {
+               jQuery.readyWait++;
+       } else {
+               jQuery.ready( true );
+       }
+};
+jQuery.isArray = Array.isArray;
+jQuery.parseJSON = JSON.parse;
+jQuery.nodeName = nodeName;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+       define( "jquery", [], function() {
+               return jQuery;
+       } );
+}
+
+
+
+
+var
+
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+       if ( window.$ === jQuery ) {
+               window.$ = _$;
+       }
+
+       if ( deep && window.jQuery === jQuery ) {
+               window.jQuery = _jQuery;
+       }
+
+       return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( !noGlobal ) {
+       window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+} );
index 67ec517..ed56521 100644 (file)
@@ -18,6 +18,7 @@
        "ooui-dialog-process-retry": "Probeer weer",
        "ooui-dialog-process-continue": "Gaan voort",
        "ooui-selectfile-button-select": "Kies 'n lêer",
+       "ooui-selectfile-not-supported": "Lêers kan nie gekies word nie",
        "ooui-selectfile-placeholder": "Geen lêer is gekies nie",
        "ooui-selectfile-dragdrop-placeholder": "Laat val die lêer hier"
 }
index 8b85a20..a0e53b3 100644 (file)
@@ -4,13 +4,19 @@
                        "Mogoeilor"
                ]
        },
+       "ooui-outline-control-move-down": "ڤا دڤۈن بوردن آیتم",
+       "ooui-outline-control-move-up": "ڤارو بردن آیتم",
+       "ooui-outline-control-remove": "ڤورداشتن آیتم",
        "ooui-toolbar-more": "بیشتر",
        "ooui-toolgroup-expand": "بیشتر",
        "ooui-toolgroup-collapse": "کمتر",
        "ooui-dialog-message-accept": "خۈڤإ",
        "ooui-dialog-message-reject": "أنجومشيڤ کردن",
+       "ooui-dialog-process-error": "یأ چي ايچو إشتوا إ",
        "ooui-dialog-process-retry": "ز نۉ تلاش کونين",
        "ooui-dialog-process-continue": "ديندا گرهڌن",
        "ooui-selectfile-button-select": "گولإڤورچين کردن جانیا",
-       "ooui-selectfile-placeholder": "هيژ جانيایي گولإ ڤورچين نڤابيڌإ"
+       "ooui-selectfile-not-supported": "گول ڤورچی کردن جانیا کونشتکاری نڤابیڌ",
+       "ooui-selectfile-placeholder": "هيژ جانيایي گولإ ڤورچين نڤابيڌإ",
+       "ooui-selectfile-dragdrop-placeholder": "جانيانأ ڤأنين ايچو"
 }
index 83af863..cbfcab0 100644 (file)
@@ -18,5 +18,9 @@
        "ooui-dialog-process-error": "Un dra bennak a-dreuz a zo bet",
        "ooui-dialog-process-dismiss": "Disteurel",
        "ooui-dialog-process-retry": "Klask en-dro",
-       "ooui-dialog-process-continue": "Kenderc'hel"
+       "ooui-dialog-process-continue": "Kenderc'hel",
+       "ooui-selectfile-button-select": "Diuzañ ur restr",
+       "ooui-selectfile-not-supported": "N'eo ket skoret an diuzañ restroù",
+       "ooui-selectfile-placeholder": "N'eus bet diuzet restr ebet",
+       "ooui-selectfile-dragdrop-placeholder": "Lezel ar restr amañ"
 }
index 5674a78..7ef5a51 100644 (file)
@@ -13,7 +13,7 @@
        "ooui-toolgroup-expand": "Više",
        "ooui-toolgroup-collapse": "Manje",
        "ooui-dialog-message-accept": "U redu",
-       "ooui-dialog-message-reject": "Odustani",
+       "ooui-dialog-message-reject": "Otkaži",
        "ooui-dialog-process-error": "Nešto je pošlo naopako",
        "ooui-dialog-process-dismiss": "Odbaci",
        "ooui-dialog-process-retry": "Pokušaj ponovo",
index 546cc47..25aff68 100644 (file)
        "ooui-toolbar-more": "Liyané",
        "ooui-toolgroup-expand": "Liyané",
        "ooui-toolgroup-collapse": "Sacukupé",
-       "ooui-dialog-message-accept": "Ha'a",
+       "ooui-dialog-message-accept": "Oké",
        "ooui-dialog-message-reject": "Wurung",
        "ooui-dialog-process-error": "Ana sing klèru",
        "ooui-dialog-process-dismiss": "Tutup",
        "ooui-dialog-process-retry": "Jajal manèh",
-       "ooui-dialog-process-continue": "Banjuraké",
+       "ooui-dialog-process-continue": "Bacutaké",
        "ooui-selectfile-button-select": "Pilih barkas",
-       "ooui-selectfile-not-supported": "Barkas pilihan ora disengkuyung",
+       "ooui-selectfile-not-supported": "Ora bisa milih barkas",
        "ooui-selectfile-placeholder": "Ora ana barkas sing dipilih",
        "ooui-selectfile-dragdrop-placeholder": "Dèkèk barkas ing kéné"
 }
index af97d17..722b3e2 100644 (file)
@@ -3,5 +3,21 @@
                "authors": [
                        "Jagwar"
                ]
-       }
+       },
+       "ooui-outline-control-move-down": "Hampidina ilay zavatra",
+       "ooui-outline-control-move-up": "Hampiakatra ilay zavatra",
+       "ooui-outline-control-remove": "Hanala iay zavatra",
+       "ooui-toolbar-more": "Be kokoa",
+       "ooui-toolgroup-expand": "Be kokoa",
+       "ooui-toolgroup-collapse": "Kely kokoa",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Avela",
+       "ooui-dialog-process-error": "Nisy hadisoana nitranga",
+       "ooui-dialog-process-dismiss": "Esorina",
+       "ooui-dialog-process-retry": "Andramana indray",
+       "ooui-dialog-process-continue": "Tohizana",
+       "ooui-selectfile-button-select": "Misafidia rakitra iray",
+       "ooui-selectfile-not-supported": "Tsy zaka ny fisafidiana rakitra",
+       "ooui-selectfile-placeholder": "Tsy misy rakitra voafidy",
+       "ooui-selectfile-dragdrop-placeholder": "Hametraka rakitra eto"
 }
index c8fba3d..e3f3e11 100644 (file)
@@ -7,7 +7,13 @@
        },
        "ooui-outline-control-move-down": "Flytt element ned",
        "ooui-outline-control-move-up": "Flytt element opp",
-       "ooui-toolbar-more": "Fleire",
+       "ooui-toolbar-more": "Meir",
+       "ooui-toolgroup-expand": "Meir",
+       "ooui-toolgroup-collapse": "Færre",
+       "ooui-dialog-message-reject": "Bryt av",
+       "ooui-dialog-process-error": "Noko gjekk gale",
+       "ooui-dialog-process-dismiss": "Lat att",
+       "ooui-dialog-process-continue": "Hald fram",
        "ooui-selectfile-button-select": "Vel ei fil",
        "ooui-selectfile-placeholder": "Inga fil er vald"
 }
index 8bd4be8..386871c 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Saanvel"
+                       "Saanvel",
+                       "Abbas dhothar"
                ]
        },
        "ooui-outline-control-move-down": "شیہ تھلے کرو",
@@ -9,6 +10,7 @@
        "ooui-outline-control-remove": "شیہ مٹاؤ",
        "ooui-toolbar-more": "ہور",
        "ooui-toolgroup-expand": "ہور",
+       "ooui-toolgroup-collapse": "گھٹ",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "مکاؤ",
        "ooui-dialog-process-error": "کوئی رپھڑ پے گیا اے۔",
index 9d3b926..87b7c2b 100644 (file)
@@ -4,11 +4,12 @@
                        "Milicevic01",
                        "Nikola Smolenski",
                        "Милан Јелисавчић",
-                       "Zoranzoki21"
+                       "Zoranzoki21",
+                       "Obsuser"
                ]
        },
-       "ooui-outline-control-move-down": "Премести ставку на доле",
-       "ooui-outline-control-move-up": "Премести ставку на горе",
+       "ooui-outline-control-move-down": "Премести ставку надоле",
+       "ooui-outline-control-move-up": "Премести ставку нагоре",
        "ooui-outline-control-remove": "Уклони ставку",
        "ooui-toolbar-more": "Више",
        "ooui-toolgroup-expand": "Више",
index f206a72..84048e7 100644 (file)
@@ -18,6 +18,7 @@
        "ooui-dialog-process-dismiss": "צומאַכן",
        "ooui-dialog-process-retry": "פרובירט נאכאמאל",
        "ooui-dialog-process-continue": "פֿארזעצן",
+       "ooui-selectfile-button-select": "קלויבט א טעקע",
        "ooui-selectfile-not-supported": "טעקע אויסווייל נישט געשטיצט",
        "ooui-selectfile-placeholder": "קיין טעקע נישט אויסגעוויילט"
 }
index 2307413..bc4761c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-05-16T22:31:39Z
  */
 ( 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
diff --git a/resources/lib/oojs-ui/oojs-ui-apex.js.map b/resources/lib/oojs-ui/oojs-ui-apex.js.map
new file mode 100644 (file)
index 0000000..f509343
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/intro.js.txt","../src/themes/apex/ApexTheme.js","../src/outro.js.txt"],"names":[],"mappings":";;;;;;;;;;AAAA,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnB;AACA,CAAC,GAAG,CAAC,MAAM,EAAE;;ACFb,GAAG;AACH,CAAC,CAAC,CAAC,CAAC,KAAK;AACT,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK;AACvB,CAAC,CAAC;AACF,CAAC,CAAC,CAAC,CAAC,WAAW;AACf,CAAC,EAAE;AACH,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;AAC5C,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW;AACtB,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;AACrC,EAAE;AACF;AACA,EAAE,CAAC,KAAK,CAAC,EAAE;AACX;AACA,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;AAChD;AACA,EAAE,CAAC,OAAO,CAAC,EAAE;AACb;AACA,GAAG;AACH,CAAC,CAAC,CAAC,CAAC,UAAU;AACd,CAAC,EAAE;AACH,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACrE,CAAC,MAAM,CAAC,GAAG,CAAC;AACZ,EAAE;AACF;AACA,EAAE,CAAC,aAAa,CAAC,EAAE;AACnB;AACA,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,GAAG;;AC1BpC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE","file":"oojs-ui-apex.js","sourcesContent":["( function ( OO ) {\n\n'use strict';\n","/**\n * @class\n * @extends OO.ui.Theme\n *\n * @constructor\n */\nOO.ui.ApexTheme = function OoUiApexTheme() {\n\t// Parent constructor\n\tOO.ui.ApexTheme.parent.call( this );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ApexTheme, OO.ui.Theme );\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.ApexTheme.prototype.getDialogTransitionDuration = function () {\n\treturn 250;\n};\n\n/* Instantiation */\n\nOO.ui.theme = new OO.ui.ApexTheme();\n","}( OO ) );\n"]}
\ No newline at end of file
index 524c16b..73953bc 100644 (file)
@@ -1,37 +1,40 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-05-16T22:31:46Z
  */
 .oo-ui-element-hidden {
   display: none !important;
-  /* stylelint-disable-line declaration-no-important */
 }
 .oo-ui-buttonElement {
   display: inline-block;
+  line-height: normal;
   vertical-align: middle;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
   cursor: pointer;
   display: inline-block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
-  line-height: normal;
   white-space: nowrap;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button::-moz-focus-inner {
+  border-color: transparent;
+  padding: 0;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
@@ -41,8 +44,8 @@
   cursor: default;
 }
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   display: inline-block;
   vertical-align: middle;
 }
@@ -67,7 +70,7 @@
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
-  outline: none;
+  outline: 0;
 }
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
   text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
   border: 1px #c9c9c9 solid;
   -webkit-transition: border-color 100ms ease;
-     -moz-transition: border-color 100ms ease;
-          transition: border-color 100ms ease;
+  -moz-transition: border-color 100ms ease;
+  transition: border-color 100ms ease;
   background-color: #eeeeee;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #ddd));
   background-image: -webkit-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:    -moz-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:         linear-gradient(to bottom, #fff 0, #ddd 100%);
+  background-image: -moz-linear-gradient(top, #fff 0, #ddd 100%);
+  background-image: linear-gradient(to bottom, #fff 0, #ddd 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
   border-color: #aaa;
-  outline: none;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
   background-color: #eeeeee;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #ddd), color-stop(100%, #fff));
   background-image: -webkit-linear-gradient(top, #ddd 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #ddd 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #ddd 0, #fff 100%);
+  background-image: -moz-linear-gradient(top, #ddd 0, #fff 100%);
+  background-image: linear-gradient(to bottom, #ddd 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffdddddd', endColorstr='#ffffffff' )";
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   margin-left: -0.5em;
   margin-right: -0.5em;
+  display: inline-block;
+  vertical-align: middle;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   margin-right: 0.3em;
   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%);
-  background-image:    -moz-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
-  background-image:         linear-gradient(to bottom, #eaf4fa 0, #b0d9ee 100%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
+  background-image: linear-gradient(to bottom, #eaf4fa 0, #b0d9ee 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffeaf4fa', endColorstr='#ffb0d9ee' )";
 }
 .oo-ui-buttonElement-framed.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover,
   background-color: #cde7f4;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #b0d9ee), color-stop(100%, #eaf4fa));
   background-image: -webkit-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
-  background-image:    -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
-  background-image:         linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
+  background-image: linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffb0d9ee', endColorstr='#ffeaf4fa' )";
 }
 .oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
   background-color: #daf0bd;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f0fbe1), color-stop(100%, #c3e59a));
   background-image: -webkit-linear-gradient(top, #f0fbe1 0, #c3e59a 100%);
-  background-image:    -moz-linear-gradient(top, #f0fbe1 0, #c3e59a 100%);
-  background-image:         linear-gradient(to bottom, #f0fbe1 0, #c3e59a 100%);
+  background-image: -moz-linear-gradient(top, #f0fbe1 0, #c3e59a 100%);
+  background-image: linear-gradient(to bottom, #f0fbe1 0, #c3e59a 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff0fbe1', endColorstr='#ffc3e59a' )";
 }
 .oo-ui-buttonElement-framed.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover,
   background-color: #daf0bd;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #c3e59a), color-stop(100%, #f0fbe1));
   background-image: -webkit-linear-gradient(top, #c3e59a 0, #f0fbe1 100%);
-  background-image:    -moz-linear-gradient(top, #c3e59a 0, #f0fbe1 100%);
-  background-image:         linear-gradient(to bottom, #c3e59a 0, #f0fbe1 100%);
+  background-image: -moz-linear-gradient(top, #c3e59a 0, #f0fbe1 100%);
+  background-image: linear-gradient(to bottom, #c3e59a 0, #f0fbe1 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffc3e59a', endColorstr='#fff0fbe1' )";
 }
 .oo-ui-buttonElement-framed.oo-ui-flaggedElement-destructive > .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: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
   box-shadow: none;
   color: #333;
   background: #eee;
 }
 .oo-ui-clippableElement-clippable {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   min-height: 3.125em;
 }
 .oo-ui-floatableElement {
 }
 .oo-ui-fieldLayout {
   display: block;
-  margin-bottom: 1em;
+  margin-top: 1em;
 }
 .oo-ui-fieldLayout:before,
 .oo-ui-fieldLayout:after {
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   width: 1px;
 }
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+  display: block;
+}
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help {
   float: right;
 }
 .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:first-child {
+  margin-top: 0;
 }
 .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 {
   padding-top: 0.5em;
 }
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
-  margin-bottom: 1.25em;
+  margin-top: 1.25em;
 }
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
   max-width: 50em;
@@ -472,9 +481,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
 }
 .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
+  overflow: auto;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
 }
 .oo-ui-panelLayout-expanded {
   position: absolute;
@@ -524,7 +533,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-optionWidget.oo-ui-widget-disabled {
   cursor: default;
 }
-.oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+.oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
   display: block;
   white-space: nowrap;
   text-overflow: ellipsis;
@@ -550,8 +559,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-decoratedOptionWidget {
   padding: 0.5em 2em 0.5em 3em;
 }
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
   position: absolute;
 }
 .oo-ui-decoratedOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
@@ -570,7 +579,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   opacity: 0.2;
 }
 .oo-ui-radioOptionWidget {
-  cursor: default;
   padding: 0;
   background-color: transparent;
 }
@@ -650,7 +658,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-popupWidget {
   position: absolute;
-  left: 0;
 }
 .oo-ui-popupWidget-popup {
   position: relative;
@@ -664,16 +671,55 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
   display: block;
   position: absolute;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+  content: '';
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-style: solid;
+  border-color: transparent;
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor {
+  left: 0;
   /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
+  border-top: 0;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
   left: 0;
-  background-repeat: no-repeat;
+  /* `bottom` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+  border-bottom: 0;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+  top: 0;
+  /* `left` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+  border-left: 0;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+  top: 0;
+  /* `right` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+  border-right: 0;
 }
 .oo-ui-popupWidget-head {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-popupWidget-head > .oo-ui-buttonWidget {
   float: right;
@@ -694,38 +740,82 @@ 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-anchored-top {
   margin-top: 6px;
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+.oo-ui-popupWidget-anchored-top .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: '';
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-style: solid;
-  border-color: transparent;
-  border-top: 0;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before {
   bottom: -7px;
   left: -6px;
   border-bottom-color: #aaa;
   border-width: 7px;
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
   bottom: -7px;
   left: -5px;
   border-bottom-color: #fff;
   border-width: 6px;
 }
+.oo-ui-popupWidget-anchored-bottom {
+  margin-bottom: 6px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+  bottom: -6px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before {
+  top: -7px;
+  left: -6px;
+  border-top-color: #aaa;
+  border-width: 7px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+  top: -7px;
+  left: -5px;
+  border-top-color: #fff;
+  border-width: 6px;
+}
+.oo-ui-popupWidget-anchored-start {
+  margin-left: 6px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+  left: -6px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before {
+  right: -7px;
+  top: -6px;
+  border-right-color: #aaa;
+  border-width: 7px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+  right: -7px;
+  top: -5px;
+  border-right-color: #fff;
+  border-width: 6px;
+}
+.oo-ui-popupWidget-anchored-end {
+  margin-right: 6px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+  right: -6px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before {
+  left: -7px;
+  top: -6px;
+  border-left-color: #aaa;
+  border-width: 7px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+  left: -7px;
+  top: -5px;
+  border-left-color: #fff;
+  border-width: 6px;
+}
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
   -webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-     -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-          transition: width 100ms ease, height 100ms ease, left 100ms ease;
+  -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
+  transition: width 100ms ease, height 100ms ease, left 100ms ease;
 }
 .oo-ui-popupWidget-head {
   height: 2.5em;
@@ -748,12 +838,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
   cursor: auto;
 }
-.oo-ui-popupWidget.oo-ui-popupButtonWidget-frameless-popup {
-  margin-left: 0.9375em;
-}
-.oo-ui-popupWidget.oo-ui-popupButtonWidget-framed-popup {
-  margin-left: 1.2375em;
-}
 .oo-ui-inputWidget {
   margin-right: 0.5em;
 }
@@ -773,8 +857,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
   vertical-align: middle;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: 100%;
   max-width: 50em;
 }
@@ -783,11 +867,15 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
 }
 .oo-ui-dropdownInputWidget select {
+  background-position: -9999em 0;
+  background-repeat: no-repeat;
   width: 100%;
-  cursor: pointer;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
+  cursor: pointer;
 }
 .oo-ui-dropdownInputWidget select {
   background-color: #fff;
@@ -807,7 +895,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
   border-color: rgba(0, 0, 0, 0.2);
-  outline: none;
+  outline: 0;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
   color: #ccc;
@@ -821,8 +909,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
   vertical-align: middle;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: 100%;
   max-width: 50em;
 }
@@ -831,8 +919,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
   width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-textInputWidget textarea {
   overflow: auto;
@@ -847,7 +935,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin: 0;
 }
 .oo-ui-textInputWidget [type='search'] {
-  -webkit-appearance: textfield;
+  -webkit-appearance: none;
 }
 .oo-ui-textInputWidget [type='search']::-ms-clear {
   display: none;
@@ -869,9 +957,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 100%;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
@@ -881,19 +969,13 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   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;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
   display: block;
@@ -927,22 +1009,47 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   box-shadow: 0 0 0 #fff, inset 0 0.1em 0.2em #ddd;
   border-radius: 0.25em;
   -webkit-transition: border-color 250ms ease, box-shadow 250ms ease;
-     -moz-transition: border-color 250ms ease, box-shadow 250ms ease;
-          transition: border-color 250ms ease, box-shadow 250ms ease;
+  -moz-transition: border-color 250ms ease, box-shadow 250ms ease;
+  transition: border-color 250ms ease, box-shadow 250ms ease;
 }
 .oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
   background-color: transparent;
 }
+.oo-ui-textInputWidget input::-webkit-input-placeholder,
+.oo-ui-textInputWidget textarea::-webkit-input-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input:-ms-input-placeholder,
+.oo-ui-textInputWidget textarea:-ms-input-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input::-moz-placeholder,
+.oo-ui-textInputWidget textarea::-moz-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input:-moz-placeholder,
+.oo-ui-textInputWidget textarea:-moz-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-textInputWidget input::placeholder,
+.oo-ui-textInputWidget textarea::placeholder {
+  color: #767676;
+  opacity: 1;
+}
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-  outline: none;
+  outline: 0;
   border-color: #a7dcff;
   box-shadow: 0 0 0.3em #a7dcff, 0 0 0 #fff;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
-  color: #777;
+  color: #767676;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
@@ -982,7 +1089,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
   padding: 0.4em;
   line-height: 1.5em;
-  color: #888;
+  color: #767676;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
   margin-right: 2.0875em;
@@ -1000,39 +1107,41 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 0 0 0.25em 0.25em;
   box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
 }
-.oo-ui-menuSelectWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
 .oo-ui-menuSelectWidget.oo-ui-clippableElement-clippable {
   min-height: 2.6em;
 }
 .oo-ui-menuSelectWidget-invisible {
   display: none;
 }
-.oo-ui-menuOptionWidget {
-  position: relative;
-}
-.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
-  display: none;
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
+  background-color: transparent;
 }
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+  background-image: url('themes/apex/images/icons/check.png');
+  background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url('themes/apex/images/icons/check.svg');
+  background-image: linear-gradient(transparent, transparent), /* @embed */ url('themes/apex/images/icons/check.svg');
+  background-image: -o-linear-gradient(transparent, transparent), url('themes/apex/images/icons/check.png');
+  background-position: center center;
+  background-repeat: no-repeat;
+  background-size: contain;
   display: block;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
-  background-color: transparent;
+  left: 0.5em;
+  top: 0;
+  min-width: 24px;
+  width: 1.875em;
+  min-height: 24px;
+  height: 100%;
 }
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
   background-color: #e1f3ff;
 }
 .oo-ui-menuSectionOptionWidget {
-  cursor: default;
   padding: 0.33em 0.75em;
-  color: #888;
+  color: #767676;
+}
+.oo-ui-menuSectionOptionWidget.oo-ui-widget-enabled {
+  cursor: default;
 }
 .oo-ui-dropdownWidget {
   display: inline-block;
@@ -1043,6 +1152,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0.5em;
 }
 .oo-ui-dropdownWidget-handle {
+  position: relative;
   width: 100%;
   display: block;
   white-space: nowrap;
@@ -1051,16 +1161,18 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   cursor: default;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
   cursor: pointer;
@@ -1076,20 +1188,18 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownWidget-handle:hover {
   border-color: rgba(0, 0, 0, 0.2);
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-  top: 0;
-  right: 0;
-  margin: 0.775em;
-}
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
   left: 0.25em;
-  margin: 0.3em;
+  margin: 0 0.3em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
   line-height: 2.5em;
   margin: 0 0.5em;
 }
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
+}
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
   color: #ccc;
   text-shadow: 0 1px 1px #fff;
@@ -1145,7 +1255,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 2.5em;
   padding: 0;
 }
-.oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
+.oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorWidget {
+  display: block;
+  position: absolute;
+  top: 0;
+  height: 100%;
   pointer-events: none;
 }
 .oo-ui-comboBoxInputWidget:last-child {
@@ -1164,6 +1278,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   visibility: visible;
   margin: 0.775em;
 }
+.oo-ui-comboBoxInputWidget-php .oo-ui-indicatorWidget {
+  right: 0;
+  max-height: 2.375em;
+  margin: 0;
+  margin-right: 0.775em;
+}
 .oo-ui-comboBoxInputWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
   cursor: default;
   opacity: 0.2;
@@ -1191,7 +1311,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   color: #ccc;
 }
 .oo-ui-checkboxMultioptionWidget {
-  cursor: default;
   padding: 0;
 }
 .oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget,
@@ -1206,6 +1325,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0;
 }
 .oo-ui-progressBarWidget {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   max-width: 50em;
   background-color: #fff;
   border: 1px solid #ccc;
@@ -1216,24 +1338,24 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 1em;
   border-right: 1px solid #ccc;
   -webkit-transition: width 250ms ease;
-     -moz-transition: width 250ms ease;
-          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%);
-  background-image:    -moz-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
-  background-image:         linear-gradient(to bottom, #eaf4fa 0, #b0d9ee 100%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
+  background-image: linear-gradient(to bottom, #eaf4fa 0, #b0d9ee 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffeaf4fa', endColorstr='#ffb0d9ee' )";
 }
 .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;
+  -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+  animation: oo-ui-progressBarWidget-slide 2s infinite linear;
   width: 40%;
   -webkit-transform: translate(-25%);
-     -moz-transform: translate(-25%);
-      -ms-transform: translate(-25%);
-          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 {
@@ -1242,42 +1364,42 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
 @-moz-keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
 @keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
index f3b3fce..e3f86cf 100644 (file)
@@ -1,37 +1,40 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-05-16T22:31:46Z
  */
 .oo-ui-element-hidden {
   display: none !important;
-  /* stylelint-disable-line declaration-no-important */
 }
 .oo-ui-buttonElement {
   display: inline-block;
+  line-height: normal;
   vertical-align: middle;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
   cursor: pointer;
   display: inline-block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
-  line-height: normal;
   white-space: nowrap;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button::-moz-focus-inner {
+  border-color: transparent;
+  padding: 0;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
@@ -41,8 +44,8 @@
   cursor: default;
 }
 .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   display: inline-block;
   vertical-align: middle;
 }
   text-align: center;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
+  position: relative;
   font-weight: bold;
   text-decoration: none;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button:focus {
-  border-radius: 2px;
   outline: 0;
 }
-.oo-ui-buttonElement > .oo-ui-buttonElement-button:focus::-moz-focus-inner {
-  border-color: transparent;
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  margin-left: 0;
+  display: block;
 }
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  margin-right: 0.25em;
-  margin-left: 0.46875em;
+.oo-ui-buttonElement > input.oo-ui-buttonElement-button {
+  -webkit-appearance: none;
+}
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button {
+  line-height: 1;
+}
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  line-height: 1.172em;
+}
+.oo-ui-buttonElement.oo-ui-labelElement.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  padding-left: 2.03125em;
+}
+.oo-ui-buttonElement.oo-ui-labelElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+  padding-right: 2.5em;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  display: block;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-indicatorElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  right: 0.9375em;
 }
 .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
   -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
 }
 .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   opacity: 0.87;
   -webkit-transition: opacity 100ms;
-     -moz-transition: opacity 100ms;
-          transition: opacity 100ms;
+  -moz-transition: opacity 100ms;
+  transition: opacity 100ms;
 }
 .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon.oo-ui-image-invert,
 .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator.oo-ui-image-invert {
 .oo-ui-buttonElement.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   opacity: 1;
 }
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button .oo-ui-indicatorElement-indicator {
-  margin-right: 0;
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button {
+  border-radius: 1px;
 }
-.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  margin-left: 0.25em;
-  margin-right: 0.25em;
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  min-width: 1.875em;
+  min-height: 1.875em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  left: 0;
 }
-.oo-ui-buttonElement-frameless > input.oo-ui-buttonElement-button {
-  padding-left: 0.25em;
-  padding-right: 0.25em;
+.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button {
+  margin-left: -1px;
+  border-color: #fff;
+  border-color: transparent;
+  border-style: solid;
+  border-width: 1px;
+  padding: 0.3125em 0;
+}
+.oo-ui-buttonElement-frameless.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+  min-width: 0.9375em;
+  min-height: 0.9375em;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
   color: #222;
   color: #444;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
-  box-shadow: inset 0 0 0 1px #36c, 0 0 0 1px #36c;
+  box-shadow: 0 0 0 2px #36c;
 }
 .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 {
 .oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   opacity: 0.51;
 }
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
-  padding-left: 2.4em;
-}
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-  padding: 0.546875em 1em;
-  min-height: 2.5em;
-  min-width: 3.125em;
   border-radius: 2px;
-  position: relative;
+  padding-left: 0.9375em;
+  padding-right: 0.9375em;
 }
-.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  line-height: 1.25;
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  padding-top: 2.34375em;
+  padding-bottom: 0;
+  padding-left: 2.03125em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  position: absolute;
-  top: 0.2em;
-  left: 0.5625em;
+  left: 0.546875em;
 }
-.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  margin-left: 0.3em;
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+  padding-left: 2.5em;
 }
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-iconElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  margin-left: 0.46875em;
-  margin-right: -0.275em;
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  left: 0.46875em;
 }
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-  position: relative;
-  left: 0.2em;
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+  padding-top: 2.34375em;
+  padding-right: 2.03125em;
+  padding-bottom: 0;
+}
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  right: 1.015625em;
+}
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  padding-right: 2.5em;
+}
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button {
+  padding-top: 0.625em;
+  padding-bottom: 0.546875em;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
   background-color: #c8ccd1;
   color: #fff;
   border: 1px solid #c8ccd1;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled + .oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-  border-left-color: #fff;
-}
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
   background-color: #f8f9fa;
   color: #222;
 .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-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   background-color: #eff3fa;
   color: #2a4b8d;
   border-color: #2a4b8d;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
   border-color: #36c;
   box-shadow: inset 0 0 0 1px #36c;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
   color: #36c;
 .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-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   background-color: #eff3fa;
   color: #2a4b8d;
   border-color: #2a4b8d;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
   border-color: #36c;
   box-shadow: inset 0 0 0 1px #36c;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-  color: #d33;
+  color: #d73333;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
   background-color: #fff;
 .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,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   background-color: #ffffff;
   color: #b32424;
   border-color: #b32424;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
   border-color: #d33;
   box-shadow: inset 0 0 0 1px #d33;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
   color: #fff;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active:focus,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   color: #fff;
   background-color: #2a4b8d;
   border-color: #2a4b8d;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
   border-color: #36c;
   box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
   color: #fff;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:active:focus,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   color: #fff;
   background-color: #2a4b8d;
   border-color: #2a4b8d;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
   border-color: #36c;
   box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
   color: #fff;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active:focus,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
   color: #fff;
   background-color: #b32424;
   border-color: #b32424;
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
   border-color: #d33;
   box-shadow: inset 0 0 0 1px #d33, inset 0 0 0 2px #fff;
+  outline: 0;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
 }
 .oo-ui-clippableElement-clippable {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   min-height: 3.125em;
 }
 .oo-ui-floatableElement {
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   width: 1px;
 }
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+  display: block;
+}
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help {
   float: right;
 }
@@ -613,9 +666,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
 }
 .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
+  overflow: auto;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
 }
 .oo-ui-panelLayout-expanded {
   position: absolute;
@@ -654,13 +707,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0;
 }
 .oo-ui-horizontalLayout > .oo-ui-layout {
-  margin-bottom: 0;
+  margin-top: 0;
 }
 .oo-ui-optionWidget {
   position: relative;
   display: block;
-  border: 0;
-  padding: 0.25em 0.5em;
 }
 .oo-ui-optionWidget.oo-ui-widget-enabled {
   cursor: pointer;
@@ -668,7 +719,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-optionWidget.oo-ui-widget-disabled {
   cursor: default;
 }
-.oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+.oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
   display: block;
   white-space: nowrap;
   text-overflow: ellipsis;
@@ -684,10 +735,11 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   color: #72777d;
 }
 .oo-ui-decoratedOptionWidget {
-  padding: 0.5em 2em 0.5em 3em;
+  padding: 0.703125em 0.9375em 0.625em;
+  line-height: 1;
 }
-.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
-.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
   position: absolute;
 }
 .oo-ui-decoratedOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
@@ -695,11 +747,20 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   top: 0;
   height: 100%;
 }
+.oo-ui-decoratedOptionWidget.oo-ui-iconElement {
+  padding-left: 2.5em;
+}
 .oo-ui-decoratedOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
-  left: 0.5em;
+  left: 0.46875em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-labelElement-label {
+  line-height: 1.172em;
+}
+.oo-ui-decoratedOptionWidget.oo-ui-indicatorElement {
+  padding-right: 1.875em;
 }
 .oo-ui-decoratedOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  right: 0.5em;
+  right: 0.9375em;
 }
 .oo-ui-decoratedOptionWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
 .oo-ui-decoratedOptionWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
@@ -712,22 +773,15 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-color: #fff;
 }
 .oo-ui-radioOptionWidget {
-  cursor: default;
-  padding: 0.25em 0;
-  background-color: transparent;
+  padding: 0.3125em 0;
 }
 .oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
 .oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
   display: inline-block;
   vertical-align: middle;
 }
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
-}
 .oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-  padding: 0.25em 0.25em 0.25em 0.46875em;
+  padding-left: 0.46875em;
 }
 .oo-ui-radioOptionWidget .oo-ui-radioInputWidget {
   margin-right: 0;
@@ -779,19 +833,21 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
-  border-radius: 0;
   margin-left: -1px;
+  border-radius: 0;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+  margin-left: 0;
   border-bottom-left-radius: 2px;
   border-top-left-radius: 2px;
-  margin-left: 0;
 }
 .oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
   border-bottom-right-radius: 2px;
   border-top-right-radius: 2px;
 }
-.oo-ui-buttonGroupWidget.oo-ui-widget-enabled .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed.oo-ui-widget-disabled + .oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  border-left-color: #fff;
+}
 .oo-ui-buttonGroupWidget.oo-ui-widget-enabled .oo-ui-buttonElement.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active {
   z-index: 1;
 }
@@ -804,9 +860,13 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-buttonGroupWidget.oo-ui-widget-enabled .oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
   z-index: -1;
 }
+.oo-ui-buttonGroupWidget.oo-ui-widget-enabled .oo-ui-buttonElement.oo-ui-toggleWidget-on + .oo-ui-toggleWidget-on > .oo-ui-buttonElement-button,
+.oo-ui-buttonGroupWidget.oo-ui-widget-enabled .oo-ui-buttonElement.oo-ui-toggleWidget-on + .oo-ui-toggleWidget-on > .oo-ui-buttonElement-button:active {
+  border-left-color: #a2a9b1;
+  z-index: 3;
+}
 .oo-ui-popupWidget {
   position: absolute;
-  left: 0;
 }
 .oo-ui-popupWidget-popup {
   position: relative;
@@ -820,16 +880,55 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
   display: block;
   position: absolute;
+  background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+  content: '';
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-style: solid;
+  border-color: transparent;
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor {
+  left: 0;
   /* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
+  border-top: 0;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
   left: 0;
-  background-repeat: no-repeat;
+  /* `bottom` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+  border-bottom: 0;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+  top: 0;
+  /* `left` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+  border-left: 0;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+  top: 0;
+  /* `right` property is to be set in theme's selector due to specific `@size-anchor` values */
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+  border-right: 0;
 }
 .oo-ui-popupWidget-head {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-popupWidget-head > .oo-ui-buttonWidget {
   float: right;
@@ -850,38 +949,82 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 2px;
   box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
 }
-.oo-ui-popupWidget-anchored {
+.oo-ui-popupWidget-anchored-top {
   margin-top: 9px;
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+.oo-ui-popupWidget-anchored-top .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: '';
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-style: solid;
-  border-color: transparent;
-  border-top: 0;
-}
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before {
   bottom: -10px;
   left: -9px;
   border-bottom-color: #a2a9b1;
   border-width: 10px;
 }
-.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+.oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after {
   bottom: -10px;
   left: -8px;
   border-bottom-color: #fff;
   border-width: 9px;
 }
+.oo-ui-popupWidget-anchored-bottom {
+  margin-bottom: 9px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor {
+  bottom: -9px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before {
+  top: -10px;
+  left: -9px;
+  border-top-color: #a2a9b1;
+  border-width: 10px;
+}
+.oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after {
+  top: -10px;
+  left: -8px;
+  border-top-color: #fff;
+  border-width: 9px;
+}
+.oo-ui-popupWidget-anchored-start {
+  margin-left: 9px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor {
+  left: -9px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:before {
+  right: -10px;
+  top: -9px;
+  border-right-color: #a2a9b1;
+  border-width: 10px;
+}
+.oo-ui-popupWidget-anchored-start .oo-ui-popupWidget-anchor:after {
+  right: -10px;
+  top: -8px;
+  border-right-color: #fff;
+  border-width: 9px;
+}
+.oo-ui-popupWidget-anchored-end {
+  margin-right: 9px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor {
+  right: -9px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:before {
+  left: -10px;
+  top: -9px;
+  border-left-color: #a2a9b1;
+  border-width: 10px;
+}
+.oo-ui-popupWidget-anchored-end .oo-ui-popupWidget-anchor:after {
+  left: -10px;
+  top: -8px;
+  border-left-color: #fff;
+  border-width: 9px;
+}
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
   -webkit-transition: width 100ms, height 100ms, left 100ms;
-     -moz-transition: width 100ms, height 100ms, left 100ms;
-          transition: width 100ms, height 100ms, left 100ms;
+  -moz-transition: width 100ms, height 100ms, left 100ms;
+  transition: width 100ms, height 100ms, left 100ms;
 }
 .oo-ui-popupWidget-head {
   height: 2.5em;
@@ -904,12 +1047,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupButtonWidget .oo-ui-popupWidget {
   cursor: auto;
 }
-.oo-ui-popupWidget.oo-ui-popupButtonWidget-frameless-popup {
-  margin-left: 0.9375em;
-}
-.oo-ui-popupWidget.oo-ui-popupButtonWidget-framed-popup {
-  margin-left: 1.5em;
-}
 .oo-ui-inputWidget {
   margin-right: 0.5em;
 }
@@ -947,8 +1084,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-repeat: no-repeat;
   background-size: 0 0;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   position: absolute;
   left: 0;
   width: 1.5625em;
@@ -959,8 +1096,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-checkboxInputWidget [type='checkbox']:checked + span {
   background-image: url('themes/mediawiki/images/icons/check-invert.png');
   background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-invert.svg');
-  background-image:         linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-invert.svg');
-  background-image:      -o-linear-gradient(transparent, transparent), url('themes/mediawiki/images/icons/check-invert.png');
+  background-image: linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-invert.svg');
+  background-image: -o-linear-gradient(transparent, transparent), url('themes/mediawiki/images/icons/check-invert.png');
   background-size: 90% 90%;
 }
 .oo-ui-checkboxInputWidget [type='checkbox']:disabled + span {
@@ -977,8 +1114,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type='checkbox'] + span {
   cursor: pointer;
   -webkit-transition: background-color 100ms, background-size 100ms, border-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, background-size 100ms, border-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, background-size 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, background-size 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, background-size 100ms, border-color 100ms, box-shadow 100ms;
 }
 .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type='checkbox']:hover + span,
 .oo-ui-checkboxInputWidget.oo-ui-widget-enabled [type='checkbox']:focus:hover + span {
@@ -1019,7 +1156,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-top: 0;
 }
 .oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body {
-  padding: 0.25em 0;
+  padding: 0.3125em 0;
 }
 .oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body .oo-ui-labelElement-label {
   line-height: 1.5;
@@ -1028,8 +1165,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
   vertical-align: middle;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: 100%;
   max-width: 50em;
 }
@@ -1038,39 +1175,74 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
 }
 .oo-ui-dropdownInputWidget select {
+  background-position: -9999em 0;
+  background-repeat: no-repeat;
   width: 100%;
-  cursor: pointer;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
+  cursor: pointer;
+}
+.oo-ui-dropdownInputWidget-php {
+  border-right: 1px solid #a2a9b1;
+  border-radius: 2px;
+  overflow-x: hidden;
 }
 .oo-ui-dropdownInputWidget select {
-  background-color: #fff;
-  height: 2.275em;
-  font-size: inherit;
-  font-family: inherit;
+  -webkit-appearance: none;
+  -moz-appearance: none;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  padding-left: 1em;
+  padding: 0.625em 0.9375em 0.546875em;
+  font-size: inherit;
+  font-family: inherit;
   vertical-align: middle;
 }
+.oo-ui-dropdownInputWidget select::-ms-expand {
+  display: none;
+}
+.oo-ui-dropdownInputWidget select:not( [no-ie] ) {
+  background-position: right 1.75em center;
+  width: calc( 100% + 1em );
+  height: 2.5em;
+  padding: 0 0 0 0.9375em;
+}
 .oo-ui-dropdownInputWidget option {
   font-size: inherit;
   font-family: inherit;
   height: 1.5em;
-  padding: 0.5em 1em;
+  padding: 0.625em 0.9375em;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
+  background-color: #f8f9fa;
+  color: #222;
+  -webkit-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover {
+  background-color: #fff;
+  color: #444;
+  border-color: #a2a9b1;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:active {
+  color: #000;
+  border-color: #72777d;
 }
-.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
+  border-color: #36c;
   outline: 0;
+  box-shadow: inset 0 0 0 1px #36c;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
+  background-color: #eaecf0;
   color: #72777d;
   border-color: #c8ccd1;
-  background-color: #eaecf0;
 }
 .oo-ui-radioInputWidget {
   position: relative;
@@ -1095,8 +1267,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: absolute;
   left: 0;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: 1.5625em;
   height: 1.5625em;
   border: 1px solid #72777d;
@@ -1132,8 +1304,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-radioInputWidget.oo-ui-widget-enabled [type='radio'] + span {
   cursor: pointer;
   -webkit-transition: background-color 100ms, border-color 100ms, border-width 100ms;
-     -moz-transition: background-color 100ms, border-color 100ms, border-width 100ms;
-          transition: background-color 100ms, border-color 100ms, border-width 100ms;
+  -moz-transition: background-color 100ms, border-color 100ms, border-width 100ms;
+  transition: background-color 100ms, border-color 100ms, border-width 100ms;
 }
 .oo-ui-radioInputWidget.oo-ui-widget-enabled [type='radio']:hover + span {
   border-color: #36c;
@@ -1175,7 +1347,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-top: 0;
 }
 .oo-ui-radioSelectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body {
-  padding: 0.25em 0;
+  padding: 0.3125em 0;
 }
 .oo-ui-radioSelectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body .oo-ui-labelElement-label {
   line-height: 1.5;
@@ -1184,8 +1356,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
   vertical-align: middle;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: 100%;
   max-width: 50em;
 }
@@ -1194,8 +1366,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
   width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-textInputWidget textarea {
   overflow: auto;
@@ -1210,7 +1382,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin: 0;
 }
 .oo-ui-textInputWidget [type='search'] {
-  -webkit-appearance: textfield;
+  -webkit-appearance: none;
 }
 .oo-ui-textInputWidget [type='search']::-ms-clear {
   display: none;
@@ -1232,9 +1404,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 100%;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
@@ -1244,19 +1416,13 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   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;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
   display: block;
@@ -1280,6 +1446,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
+  -webkit-appearance: none;
   margin: 0;
   font-size: inherit;
   font-family: inherit;
@@ -1287,7 +1454,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   color: #000;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  padding: 0.625em 0.546875em 0.546875em;
+  padding: 0.625em 0.625em 0.546875em;
 }
 .oo-ui-textInputWidget input {
   line-height: 1.172em;
@@ -1300,10 +1467,10 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea {
-  box-shadow: inset 0 0 0 1px #fff;
+  box-shadow: inset 0 0 0 1px transparent;
   -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);
+  -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);
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:hover,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:hover {
@@ -1317,7 +1484,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
-  color: #72777d;
+  background-color: #f8f9fa;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:hover,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:hover {
@@ -1325,31 +1492,38 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus {
-  border-color: #c8ccd1;
-  box-shadow: inset 0 0 0 1px #c8ccd1;
-}
-@media screen and (min-width: 0) {
-  .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
-    outline: 1px solid #36c;
-    outline-offset: -2px;
-  }
+  border-color: #36c;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled :-moz-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::-webkit-input-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-webkit-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled ::-moz-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:-ms-input-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-ms-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled :-ms-input-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::-moz-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled ::-webkit-input-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:-moz-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-textInputWidget.oo-ui-widget-enabled :placeholder-shown {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::placeholder {
   color: #72777d;
+  opacity: 1;
+}
+@media screen and (min-width: 0) {
+  .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+    outline: 1px solid #36c;
+    outline-offset: -2px;
+  }
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
@@ -1367,6 +1541,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
 .oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
   background-color: #eaecf0;
+  -webkit-text-fill-color: #72777d;
   color: #72777d;
   text-shadow: 0 1px 1px #fff;
   border-color: #c8ccd1;
@@ -1375,40 +1550,39 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .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 {
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
   color: #72777d;
   text-shadow: 0 1px 1px #fff;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
-  padding-left: 2.875em;
+  padding-left: 2.5em;
 }
 .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;
+  left: 0.46875em;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement textarea + .oo-ui-iconElement-icon {
+  max-height: 2.5em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 .oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
-  padding-right: 2.4875em;
+  padding-right: 2.1875em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  height: 100%;
-  max-height: 2.375em;
-  margin: 0 0.775em;
+  max-height: 2.5em;
+  margin-right: 0.9375em;
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
   color: #72777d;
-  padding: 0.4em;
-  line-height: 1.5;
+  margin-top: 1px;
+  padding: 0.625em 0 0.546875em 0.625em;
+  line-height: 1.172em;
 }
 .oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
-  margin-right: 2.0875em;
+  margin-right: 2.5em;
 }
 .oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
-  margin-left: 2.475em;
+  padding-left: 2.5em;
 }
 .oo-ui-menuSelectWidget {
   position: absolute;
@@ -1420,13 +1594,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-radius: 0 0 2px 2px;
   box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
 }
-.oo-ui-menuSelectWidget input {
-  position: absolute;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  opacity: 0;
-}
 .oo-ui-menuSelectWidget.oo-ui-clippableElement-clippable {
   min-height: 2.6em;
 }
@@ -1434,17 +1601,9 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: none;
 }
 .oo-ui-menuOptionWidget {
-  position: relative;
-  padding: 0.5em 1em;
   -webkit-transition: background-color 100ms, color 100ms;
-     -moz-transition: background-color 100ms, color 100ms;
-          transition: background-color 100ms, color 100ms;
-}
-.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
-  display: none;
-}
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-  display: block;
+  -moz-transition: background-color 100ms, color 100ms;
+  transition: background-color 100ms, color 100ms;
 }
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted {
   background-color: #eaecf0;
@@ -1454,18 +1613,18 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   background-color: #eaf3ff;
   color: #36c;
 }
-.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
-  display: none;
-}
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-selected.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,
 .oo-ui-menuOptionWidget.oo-ui-optionWidget-pressed.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted {
   background-color: rgba(41, 98, 204, 0.1);
   color: #36c;
 }
 .oo-ui-menuSectionOptionWidget {
-  cursor: default;
   color: #72777d;
-  padding: 0.33em 0.75em;
+  padding: 0.703125em 0.9375em 0.3125em;
+  font-weight: bold;
+}
+.oo-ui-menuSectionOptionWidget.oo-ui-widget-enabled {
+  cursor: default;
 }
 .oo-ui-dropdownWidget {
   display: inline-block;
@@ -1475,6 +1634,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0.5em;
 }
 .oo-ui-dropdownWidget-handle {
+  position: relative;
   width: 100%;
   display: block;
   white-space: nowrap;
@@ -1483,16 +1643,18 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   cursor: default;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
   cursor: pointer;
@@ -1501,31 +1663,33 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-right: 0;
 }
 .oo-ui-dropdownWidget-handle {
-  padding: 0.546875em 0;
-  height: 2.5em;
-  line-height: 1.275;
+  min-height: 2.5em;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-  top: 0;
-  right: 0;
-  margin: 0.775em;
+  padding: 0.625em 0.9375em 0.546875em;
+  line-height: 1;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-  top: 0;
-  left: 0.25em;
-  margin: 0.3em;
+  left: 0.46875em;
+}
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
+  right: 0.9375em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-  margin: 0 1em;
+  line-height: 1.172em;
+}
+.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle {
+  padding-left: 2.5em;
+}
+.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle {
+  padding-right: 1.875em;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
   background-color: #f8f9fa;
   color: #222;
   -webkit-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle:hover {
   background-color: #fff;
@@ -1549,8 +1713,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
   opacity: 0.87;
   -webkit-transition: opacity 100ms;
-     -moz-transition: opacity 100ms;
-          transition: opacity 100ms;
+  -moz-transition: opacity 100ms;
+  transition: opacity 100ms;
 }
 .oo-ui-dropdownWidget.oo-ui-widget-enabled.oo-ui-dropdownWidget-open .oo-ui-dropdownWidget-handle {
   background-color: #fff;
@@ -1571,12 +1735,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
   opacity: 0.15;
 }
-.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-  margin-left: 3em;
-}
-.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
-  margin-right: 2em;
-}
 .oo-ui-comboBoxInputWidget {
   display: inline-block;
   position: relative;
@@ -1611,33 +1769,44 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   height: 2.5em;
   padding: 0;
 }
-.oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
+.oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorWidget {
+  display: block;
+  position: absolute;
+  top: 0;
+  height: 100%;
   pointer-events: none;
 }
-.oo-ui-comboBoxInputWidget input,
-.oo-ui-comboBoxInputWidget textarea {
+.oo-ui-comboBoxInputWidget input {
   height: 2.5em;
   border-top-right-radius: 0;
   border-bottom-right-radius: 0;
   border-right-width: 0;
 }
-.oo-ui-comboBoxInputWidget-dropdownButton {
+.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input,
+.oo-ui-comboBoxInputWidget-php input {
+  border-top-right-radius: 2px;
+  border-bottom-right-radius: 2px;
+  border-right-width: 1px;
+}
+.oo-ui-comboBoxInputWidget-dropdownButton.oo-ui-indicatorElement {
   width: 2.5em;
 }
-.oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button {
+.oo-ui-comboBoxInputWidget-dropdownButton.oo-ui-indicatorElement .oo-ui-buttonElement-button {
   min-width: 2.5em;
   min-height: 2.5em;
   padding-left: 0;
-  padding-right: 0;
 }
-.oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button,
-.oo-ui-comboBoxInputWidget-dropdownButton .oo-ui-buttonElement-button:focus {
+.oo-ui-comboBoxInputWidget-dropdownButton.oo-ui-indicatorElement .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  right: 0.703125em;
+}
+.oo-ui-comboBoxInputWidget-dropdownButton.oo-ui-indicatorElement .oo-ui-buttonElement-button,
+.oo-ui-comboBoxInputWidget-dropdownButton.oo-ui-indicatorElement .oo-ui-buttonElement-button:focus {
   border-top-left-radius: 0;
   border-bottom-left-radius: 0;
 }
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input,
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty textarea {
-  border-right-width: 1px;
+.oo-ui-comboBoxInputWidget-php .oo-ui-indicatorWidget {
+  right: 0.9375em;
+  margin: 0;
 }
 .oo-ui-comboBoxInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
   opacity: 1;
@@ -1662,8 +1831,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   color: #72777d;
 }
 .oo-ui-checkboxMultioptionWidget {
-  cursor: default;
-  padding: 0.25em 0;
+  padding: 0.3125em 0;
 }
 .oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget,
 .oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
@@ -1671,12 +1839,15 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   vertical-align: middle;
 }
 .oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-  padding: 0.25em 0.25em 0.25em 0.46875em;
+  padding-left: 0.46875em;
 }
 .oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget {
   margin-right: 0;
 }
 .oo-ui-progressBarWidget {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   max-width: 50em;
   background-color: #fff;
   border: 1px solid #a2a9b1;
@@ -1686,18 +1857,18 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-progressBarWidget-bar {
   height: 1em;
   -webkit-transition: width 200ms;
-     -moz-transition: width 200ms;
-          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;
+  -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+  animation: oo-ui-progressBarWidget-slide 2s infinite linear;
   width: 40%;
   -webkit-transform: translate(-25%);
-     -moz-transform: translate(-25%);
-      -ms-transform: translate(-25%);
-          transform: translate(-25%);
+  -moz-transform: translate(-25%);
+  -ms-transform: translate(-25%);
+  transform: translate(-25%);
   border-left-width: 1px;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-enabled .oo-ui-progressBarWidget-bar {
@@ -1709,42 +1880,42 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
 @-moz-keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
 @keyframes oo-ui-progressBarWidget-slide {
   from {
     -webkit-transform: translate(-100%);
-       -moz-transform: translate(-100%);
-        -ms-transform: translate(-100%);
-            transform: translate(-100%);
+    -moz-transform: translate(-100%);
+    -ms-transform: translate(-100%);
+    transform: translate(-100%);
   }
   to {
     -webkit-transform: translate(350%);
-       -moz-transform: translate(350%);
-        -ms-transform: translate(350%);
-            transform: translate(350%);
+    -moz-transform: translate(350%);
+    -ms-transform: translate(350%);
+    transform: translate(350%);
   }
 }
index e327e5f..9b66300 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-05-16T22:31:39Z
  */
 ( function ( OO ) {
 
@@ -73,10 +73,10 @@ OO.ui.generateElementId = function () {
 
 /**
  * Check if an element is focusable.
- * Inspired from :focusable in jQueryUI v1.11.4 - 2015-04-14
+ * Inspired by :focusable in jQueryUI v1.11.4 - 2015-04-14
  *
  * @param {jQuery} $element Element to test
- * @return {boolean}
+ * @return {boolean} Element is focusable
  */
 OO.ui.isFocusableElement = function ( $element ) {
        var nodeName,
@@ -90,7 +90,7 @@ OO.ui.isFocusableElement = function ( $element ) {
        // Check if the element is visible
        if ( !(
                // This is quicker than calling $element.is( ':visible' )
-               $.expr.filters.visible( element ) &&
+               $.expr.pseudos.visible( element ) &&
                // Check that all parents are visible
                !$element.parents().addBack().filter( function () {
                        return $.css( this, 'visibility' ) === 'hidden';
@@ -131,7 +131,7 @@ OO.ui.isFocusableElement = function ( $element ) {
  *
  * @param {jQuery} $container Container to search in
  * @param {boolean} [backwards] Search backwards
- * @return {jQuery} Focusable child, an empty jQuery object if none found
+ * @return {jQuery} Focusable child, or an empty jQuery object if none found
  */
 OO.ui.findFocusable = function ( $container, backwards ) {
        var $focusable = $( [] ),
@@ -235,10 +235,10 @@ OO.ui.contains = function ( containers, contained, matchContainers ) {
  *
  * Ported from: http://underscorejs.org/underscore.js
  *
- * @param {Function} func
- * @param {number} wait
- * @param {boolean} immediate
- * @return {Function}
+ * @param {Function} func Function to debounce
+ * @param {number} [wait=0] Wait period in milliseconds
+ * @param {boolean} [immediate] Trigger on leading edge
+ * @return {Function} Debounced function
  */
 OO.ui.debounce = function ( func, wait, immediate ) {
        var timeout;
@@ -264,7 +264,7 @@ OO.ui.debounce = function ( func, wait, immediate ) {
 /**
  * Puts a console warning with provided message.
  *
- * @param {string} message
+ * @param {string} message Message
  */
 OO.ui.warnDeprecation = function ( message ) {
        if ( OO.getProp( window, 'console', 'warn' ) !== undefined ) {
@@ -282,9 +282,9 @@ OO.ui.warnDeprecation = function ( message ) {
  * when the wrapper is called, return values from the function are entirely
  * discarded.
  *
- * @param {Function} func
- * @param {number} wait
- * @return {Function}
+ * @param {Function} func Function to throttle
+ * @param {number} wait Throttle window length, in milliseconds
+ * @return {Function} Throttled function
  */
 OO.ui.throttle = function ( func, wait ) {
        var context, args, timeout,
@@ -319,7 +319,7 @@ OO.ui.throttle = function ( func, wait ) {
 /**
  * A (possibly faster) way to get the current timestamp as an integer
  *
- * @return {number} Current timestamp
+ * @return {number} Current timestamp, in milliseconds since the Unix epoch
  */
 OO.ui.now = Date.now || function () {
        return new Date().getTime();
@@ -584,6 +584,7 @@ OO.ui.Element = function OoUiElement( config ) {
 
        // Properties
        this.$ = $;
+       this.elementId = null;
        this.visible = true;
        this.data = config.data;
        this.$element = config.$element ||
@@ -595,7 +596,7 @@ OO.ui.Element = function OoUiElement( config ) {
                this.$element.addClass( config.classes.join( ' ' ) );
        }
        if ( config.id ) {
-               this.$element.attr( 'id', config.id );
+               this.setElementId( config.id );
        }
        if ( config.text ) {
                this.$element.text( config.text );
@@ -719,7 +720,7 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
                throw new Error( 'No infusion data found: ' + id );
        }
        try {
-               data = $.parseJSON( data );
+               data = JSON.parse( data );
        } catch ( _ ) {
                data = null;
        }
@@ -883,7 +884,7 @@ OO.ui.Element.static.getDocument = function ( obj ) {
                // Window
                obj.document ||
                // HTMLDocument
-               ( obj.nodeType === 9 && obj ) ||
+               ( obj.nodeType === Node.DOCUMENT_NODE && obj ) ||
                null;
 };
 
@@ -912,7 +913,7 @@ OO.ui.Element.static.getDir = function ( obj ) {
        if ( obj instanceof jQuery ) {
                obj = obj[ 0 ];
        }
-       isDoc = obj.nodeType === 9;
+       isDoc = obj.nodeType === Node.DOCUMENT_NODE;
        isWin = obj.document !== undefined;
        if ( isDoc || isWin ) {
                if ( isWin ) {
@@ -1073,17 +1074,85 @@ OO.ui.Element.static.getDimensions = function ( el ) {
 };
 
 /**
- * Get scrollable object parent
+ * Get the number of pixels that an element's content is scrolled to the left.
+ *
+ * Adapted from <https://github.com/othree/jquery.rtl-scroll-type>.
+ * Original code copyright 2012 Wei-Ko Kao, licensed under the MIT License.
+ *
+ * This function smooths out browser inconsistencies (nicely described in the README at
+ * <https://github.com/othree/jquery.rtl-scroll-type>) and produces a result consistent
+ * with Firefox's 'scrollLeft', which seems the sanest.
+ *
+ * @static
+ * @method
+ * @param {HTMLElement|Window} el Element to measure
+ * @return {number} Scroll position from the left.
+ *  If the element's direction is LTR, this is a positive number between `0` (initial scroll position)
+ *  and `el.scrollWidth - el.clientWidth` (furthest possible scroll position).
+ *  If the element's direction is RTL, this is a negative number between `0` (initial scroll position)
+ *  and `-el.scrollWidth + el.clientWidth` (furthest possible scroll position).
+ */
+OO.ui.Element.static.getScrollLeft = ( function () {
+       var rtlScrollType = null;
+
+       function test() {
+               var $definer = $( '<div dir="rtl" style="font-size: 14px; width: 1px; height: 1px; position: absolute; top: -1000px; overflow: scroll">A</div>' ),
+                       definer = $definer[ 0 ];
+
+               $definer.appendTo( 'body' );
+               if ( definer.scrollLeft > 0 ) {
+                       // Safari, Chrome
+                       rtlScrollType = 'default';
+               } else {
+                       definer.scrollLeft = 1;
+                       if ( definer.scrollLeft === 0 ) {
+                               // Firefox, old Opera
+                               rtlScrollType = 'negative';
+                       } else {
+                               // Internet Explorer, Edge
+                               rtlScrollType = 'reverse';
+                       }
+               }
+               $definer.remove();
+       }
+
+       return function getScrollLeft( el ) {
+               var isRoot = el.window === el ||
+                               el === el.ownerDocument.body ||
+                               el === el.ownerDocument.documentElement,
+                       scrollLeft = isRoot ? $( window ).scrollLeft() : el.scrollLeft,
+                       // All browsers use the correct scroll type ('negative') on the root, so don't
+                       // do any fixups when looking at the root element
+                       direction = isRoot ? 'ltr' : $( el ).css( 'direction' );
+
+               if ( direction === 'rtl' ) {
+                       if ( rtlScrollType === null ) {
+                               test();
+                       }
+                       if ( rtlScrollType === 'reverse' ) {
+                               scrollLeft = -scrollLeft;
+                       } else if ( rtlScrollType === 'default' ) {
+                               scrollLeft = scrollLeft - el.scrollWidth + el.clientWidth;
+                       }
+               }
+
+               return scrollLeft;
+       };
+}() );
+
+/**
+ * Get the root scrollable element of given element's document.
  *
- * documentElement can't be used to get or set the scrollTop
- * property on Blink. Changing and testing its value lets us
- * use 'body' or 'documentElement' based on what is working.
+ * On Blink-based browsers (Chrome etc.), `document.documentElement` can't be used to get or set
+ * the scrollTop property; instead we have to use `document.body`. Changing and testing the value
+ * lets us use 'body' or 'documentElement' based on what is working.
  *
  * https://code.google.com/p/chromium/issues/detail?id=303131
  *
  * @static
- * @param {HTMLElement} el Element to find scrollable parent for
- * @return {HTMLElement} Scrollable parent
+ * @param {HTMLElement} el Element to find root scrollable parent for
+ * @return {HTMLElement} Scrollable parent, `document.body` or `document.documentElement`
+ *     depending on browser
  */
 OO.ui.Element.static.getRootScrollableElement = function ( el ) {
        var scrollTop, body;
@@ -1107,8 +1176,8 @@ OO.ui.Element.static.getRootScrollableElement = function ( el ) {
 /**
  * Get closest scrollable container.
  *
- * Traverses up until either a scrollable element or the root is reached, in which case the window
- * will be returned.
+ * Traverses up until either a scrollable element or the root is reached, in which case the root
+ * scrollable element will be returned (see #getRootScrollableElement).
  *
  * @static
  * @param {HTMLElement} el Element to find scrollable container for
@@ -1117,7 +1186,8 @@ OO.ui.Element.static.getRootScrollableElement = function ( el ) {
  */
 OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension ) {
        var i, val,
-               // props = [ 'overflow' ] doesn't work due to https://bugzilla.mozilla.org/show_bug.cgi?id=889091
+               // Browsers do not correctly return the computed value of 'overflow' when 'overflow-x' and
+               // 'overflow-y' have different values, so we need to check the separate properties.
                props = [ 'overflow-x', 'overflow-y' ],
                $parent = $( el ).parent();
 
@@ -1125,6 +1195,12 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
                props = [ 'overflow-' + dimension ];
        }
 
+       // Special case for the document root (which doesn't really have any scrollable container, since
+       // it is the ultimate scrollable container, but this is probably saner than null or exception)
+       if ( $( el ).is( 'html, body' ) ) {
+               return this.getRootScrollableElement( el );
+       }
+
        while ( $parent.length ) {
                if ( $parent[ 0 ] === this.getRootScrollableElement( el ) ) {
                        return $parent[ 0 ];
@@ -1132,13 +1208,19 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
                i = props.length;
                while ( i-- ) {
                        val = $parent.css( props[ i ] );
+                       // We assume that elements with 'overflow' (in any direction) set to 'hidden' will never be
+                       // scrolled in that direction, but they can actually be scrolled programatically. The user can
+                       // unintentionally perform a scroll in such case even if the application doesn't scroll
+                       // programatically, e.g. when jumping to an anchor, or when using built-in find functionality.
+                       // This could cause funny issues...
                        if ( val === 'auto' || val === 'scroll' ) {
                                return $parent[ 0 ];
                        }
                }
                $parent = $parent.parent();
        }
-       return this.getDocument( el ).body;
+       // The element is unattached... return something mostly sane
+       return this.getRootScrollableElement( el );
 };
 
 /**
@@ -1150,22 +1232,16 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
  * @param {string} [config.duration='fast'] jQuery animation duration value
  * @param {string} [config.direction] Scroll in only one direction, e.g. 'x' or 'y', omit
  *  to scroll in both directions
- * @param {Function} [config.complete] Function to call when scrolling completes.
- *  Deprecated since 0.15.4, use the return promise instead.
  * @return {jQuery.Promise} Promise which resolves when the scroll is complete
  */
 OO.ui.Element.static.scrollIntoView = function ( el, config ) {
-       var position, animations, callback, container, $container, elementDimensions, containerDimensions, $window,
+       var position, animations, container, $container, elementDimensions, containerDimensions, $window,
                deferred = $.Deferred();
 
        // Configuration initialization
        config = 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 );
@@ -1208,16 +1284,10 @@ OO.ui.Element.static.scrollIntoView = function ( el, config ) {
        if ( !$.isEmptyObject( animations ) ) {
                $container.stop( true ).animate( animations, config.duration === undefined ? 'fast' : config.duration );
                $container.queue( function ( next ) {
-                       if ( callback ) {
-                               callback();
-                       }
                        deferred.resolve();
                        next();
                } );
        } else {
-               if ( callback ) {
-                       callback();
-               }
                deferred.resolve();
        }
        return deferred.promise();
@@ -1306,6 +1376,31 @@ OO.ui.Element.prototype.setData = function ( data ) {
        return this;
 };
 
+/**
+ * Set the element has an 'id' attribute.
+ *
+ * @param {string} id
+ * @chainable
+ */
+OO.ui.Element.prototype.setElementId = function ( id ) {
+       this.elementId = id;
+       this.$element.attr( 'id', id );
+       return this;
+};
+
+/**
+ * Ensure that the element has an 'id' attribute, setting it to an unique value if it's missing,
+ * and return its value.
+ *
+ * @return {string}
+ */
+OO.ui.Element.prototype.getElementId = function () {
+       if ( this.elementId === null ) {
+               this.setElementId( OO.ui.generateElementId() );
+       }
+       return this.elementId;
+};
+
 /**
  * Check if element supports one or more methods.
  *
@@ -1537,19 +1632,6 @@ OO.ui.Widget = function OoUiWidget( config ) {
 OO.inheritClass( OO.ui.Widget, OO.ui.Element );
 OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
 
-/* Static Properties */
-
-/**
- * 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.
- *
- * @static
- * @inheritable
- * @property {boolean}
- */
-OO.ui.Widget.static.supportsSimpleLabel = false;
-
 /* Events */
 
 /**
@@ -1615,6 +1697,16 @@ OO.ui.Widget.prototype.updateDisabled = function () {
        return this;
 };
 
+/**
+ * Get an ID of a labelable node which is part of this widget, if any, to be used for `<label for>`
+ * value.
+ *
+ * @return {string|null} The ID of the labelable element
+ */
+OO.ui.Widget.prototype.getInputId = function () {
+       return null;
+};
+
 /**
  * Theme logic.
  *
@@ -1852,6 +1944,78 @@ OO.ui.mixin.TabIndexedElement.prototype.getTabIndex = function () {
        return this.tabIndex;
 };
 
+/**
+ * Get an ID of a focusable element of this widget, if any, to be used for `<label for>` value.
+ *
+ * If the element already has an ID then that is returned, otherwise unique ID is
+ * generated, set on the element, and returned.
+ *
+ * @return {string|null} The ID of the focusable element
+ */
+OO.ui.mixin.TabIndexedElement.prototype.getInputId = function () {
+       var id;
+
+       if ( !this.$tabIndexed ) {
+               return null;
+       }
+       if ( !this.isLabelableNode( this.$tabIndexed ) ) {
+               return null;
+       }
+
+       id = this.$tabIndexed.attr( 'id' );
+       if ( id === undefined ) {
+               id = OO.ui.generateElementId();
+               this.$tabIndexed.attr( 'id', id );
+       }
+
+       return id;
+};
+
+/**
+ * Whether the node is 'labelable' according to the HTML spec
+ * (i.e., whether it can be interacted with through a `<label for="…">`).
+ * See: <https://html.spec.whatwg.org/multipage/forms.html#category-label>.
+ *
+ * @private
+ * @param {jQuery} $node
+ * @return {boolean}
+ */
+OO.ui.mixin.TabIndexedElement.prototype.isLabelableNode = function ( $node ) {
+       var
+               labelableTags = [ 'button', 'meter', 'output', 'progress', 'select', 'textarea' ],
+               tagName = $node.prop( 'tagName' ).toLowerCase();
+
+       if ( tagName === 'input' && $node.attr( 'type' ) !== 'hidden' ) {
+               return true;
+       }
+       if ( labelableTags.indexOf( tagName ) !== -1 ) {
+               return true;
+       }
+       return false;
+};
+
+/**
+ * Focus this element.
+ *
+ * @chainable
+ */
+OO.ui.mixin.TabIndexedElement.prototype.focus = function () {
+       if ( !this.isDisabled() ) {
+               this.$tabIndexed.focus();
+       }
+       return this;
+};
+
+/**
+ * Blur this element.
+ *
+ * @chainable
+ */
+OO.ui.mixin.TabIndexedElement.prototype.blur = function () {
+       this.$tabIndexed.blur();
+       return this;
+};
+
 /**
  * ButtonElement is often mixed into other classes to generate a button, which is a clickable
  * interface element that can be configured with access keys for accessibility.
@@ -2120,6 +2284,7 @@ OO.ui.mixin.ButtonElement.prototype.isActive = function () {
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Elements/Groups
  *
  * @abstract
+ * @mixins OO.EmitterList
  * @class
  *
  * @constructor
@@ -2131,15 +2296,20 @@ OO.ui.mixin.GroupElement = function OoUiMixinGroupElement( config ) {
        // Configuration initialization
        config = config || {};
 
+       // Mixin constructors
+       OO.EmitterList.call( this, config );
+
        // Properties
        this.$group = null;
-       this.items = [];
-       this.aggregateItemEvents = {};
 
        // Initialization
        this.setGroupElement( config.$group || $( '<div>' ) );
 };
 
+/* Setup */
+
+OO.mixinClass( OO.ui.mixin.GroupElement, OO.EmitterList );
+
 /* Events */
 
 /**
@@ -2168,28 +2338,6 @@ OO.ui.mixin.GroupElement.prototype.setGroupElement = function ( $group ) {
        }
 };
 
-/**
- * Check if a group contains no items.
- *
- * @return {boolean} Group is empty
- */
-OO.ui.mixin.GroupElement.prototype.isEmpty = function () {
-       return !this.items.length;
-};
-
-/**
- * Get all items in the group.
- *
- * The method returns an array of item references (e.g., [button1, button2, button3]) and is useful
- * when synchronizing groups of items, or whenever the references are required (e.g., when removing items
- * from a group).
- *
- * @return {OO.ui.Element[]} An array of items.
- */
-OO.ui.mixin.GroupElement.prototype.getItems = function () {
-       return this.items.slice( 0 );
-};
-
 /**
  * Get an item by its data.
  *
@@ -2236,62 +2384,6 @@ OO.ui.mixin.GroupElement.prototype.getItemsFromData = function ( data ) {
        return items;
 };
 
-/**
- * Aggregate the events emitted by the group.
- *
- * When events are aggregated, the group will listen to all contained items for the event,
- * and then emit the event under a new name. The new event will contain an additional leading
- * parameter containing the item that emitted the original event. Other arguments emitted from
- * the original event are passed through.
- *
- * @param {Object.<string,string|null>} events An object keyed by the name of the event that should be
- *  aggregated  (e.g., ‘click’) and the value of the new name to use (e.g., ‘groupClick’).
- *  A `null` value will remove aggregated events.
-
- * @throws {Error} An error is thrown if aggregation already exists.
- */
-OO.ui.mixin.GroupElement.prototype.aggregate = function ( events ) {
-       var i, len, item, add, remove, itemEvent, groupEvent;
-
-       for ( itemEvent in events ) {
-               groupEvent = events[ itemEvent ];
-
-               // Remove existing aggregated event
-               if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
-                       // Don't allow duplicate aggregations
-                       if ( groupEvent ) {
-                               throw new Error( 'Duplicate item event aggregation for ' + itemEvent );
-                       }
-                       // Remove event aggregation from existing items
-                       for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               item = this.items[ i ];
-                               if ( item.connect && item.disconnect ) {
-                                       remove = {};
-                                       remove[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
-                                       item.disconnect( this, remove );
-                               }
-                       }
-                       // Prevent future items from aggregating event
-                       delete this.aggregateItemEvents[ itemEvent ];
-               }
-
-               // Add new aggregate event
-               if ( groupEvent ) {
-                       // Make future items aggregate event
-                       this.aggregateItemEvents[ itemEvent ] = groupEvent;
-                       // Add event aggregation to existing items
-                       for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               item = this.items[ i ];
-                               if ( item.connect && item.disconnect ) {
-                                       add = {};
-                                       add[ itemEvent ] = [ 'emit', groupEvent, item ];
-                                       item.connect( this, add );
-                               }
-                       }
-               }
-       }
-};
-
 /**
  * Add items to the group.
  *
@@ -2303,46 +2395,54 @@ OO.ui.mixin.GroupElement.prototype.aggregate = function ( events ) {
  * @chainable
  */
 OO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {
-       var i, len, item, itemEvent, events, currentIndex,
-               itemElements = [];
+       // Mixin method
+       OO.EmitterList.prototype.addItems.call( this, items, index );
 
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[ i ];
+       this.emit( 'change', this.getItems() );
+       return this;
+};
 
-               // Check if item exists then remove it first, effectively "moving" it
-               currentIndex = this.items.indexOf( item );
-               if ( currentIndex >= 0 ) {
-                       this.removeItems( [ item ] );
-                       // Adjust index to compensate for removal
-                       if ( currentIndex < index ) {
-                               index--;
-                       }
-               }
-               // Add the item
-               if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
-                       events = {};
-                       for ( itemEvent in this.aggregateItemEvents ) {
-                               events[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
-                       }
-                       item.connect( this, events );
-               }
-               item.setElementGroup( this );
-               itemElements.push( item.$element.get( 0 ) );
-       }
+/**
+ * @inheritdoc
+ */
+OO.ui.mixin.GroupElement.prototype.moveItem = function ( items, newIndex ) {
+       // insertItemElements expects this.items to not have been modified yet, so call before the mixin
+       this.insertItemElements( items, newIndex );
+
+       // Mixin method
+       newIndex = OO.EmitterList.prototype.moveItem.call( this, items, newIndex );
+
+       return newIndex;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.mixin.GroupElement.prototype.insertItem = function ( item, index ) {
+       item.setElementGroup( this );
+       this.insertItemElements( item, index );
 
+       // Mixin method
+       index = OO.EmitterList.prototype.insertItem.call( this, item, index );
+
+       return index;
+};
+
+/**
+ * Insert elements into the group
+ *
+ * @private
+ * @param {OO.ui.Element} itemWidget Item to insert
+ * @param {number} index Insertion index
+ */
+OO.ui.mixin.GroupElement.prototype.insertItemElements = function ( itemWidget, index ) {
        if ( index === undefined || index < 0 || index >= this.items.length ) {
-               this.$group.append( itemElements );
-               this.items.push.apply( this.items, items );
+               this.$group.append( itemWidget.$element );
        } else if ( index === 0 ) {
-               this.$group.prepend( itemElements );
-               this.items.unshift.apply( this.items, items );
+               this.$group.prepend( itemWidget.$element );
        } else {
-               this.items[ index ].$element.before( itemElements );
-               this.items.splice.apply( this.items, [ index, 0 ].concat( items ) );
+               this.items[ index ].$element.before( itemWidget.$element );
        }
-
-       this.emit( 'change', this.getItems() );
-       return this;
 };
 
 /**
@@ -2355,26 +2455,21 @@ OO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {
  * @chainable
  */
 OO.ui.mixin.GroupElement.prototype.removeItems = function ( items ) {
-       var i, len, item, index, events, itemEvent;
+       var i, len, item, index;
 
-       // Remove specific items
+       // Remove specific items elements
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[ i ];
                index = this.items.indexOf( item );
                if ( index !== -1 ) {
-                       if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
-                               events = {};
-                               for ( itemEvent in this.aggregateItemEvents ) {
-                                       events[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
-                               }
-                               item.disconnect( this, events );
-                       }
                        item.setElementGroup( null );
-                       this.items.splice( index, 1 );
                        item.$element.detach();
                }
        }
 
+       // Mixin method
+       OO.EmitterList.prototype.removeItems.call( this, items );
+
        this.emit( 'change', this.getItems() );
        return this;
 };
@@ -2388,27 +2483,18 @@ OO.ui.mixin.GroupElement.prototype.removeItems = function ( items ) {
  * @chainable
  */
 OO.ui.mixin.GroupElement.prototype.clearItems = function () {
-       var i, len, item, remove, itemEvent;
+       var i, len;
 
-       // Remove all items
+       // Remove all item elements
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               item = this.items[ i ];
-               if (
-                       item.connect && item.disconnect &&
-                       !$.isEmptyObject( this.aggregateItemEvents )
-               ) {
-                       remove = {};
-                       if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
-                               remove[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
-                       }
-                       item.disconnect( this, remove );
-               }
-               item.setElementGroup( null );
-               item.$element.detach();
+               this.items[ i ].setElementGroup( null );
+               this.items[ i ].$element.detach();
        }
 
+       // Mixin method
+       OO.EmitterList.prototype.clearItems.call( this );
+
        this.emit( 'change', this.getItems() );
-       this.items = [];
        return this;
 };
 
@@ -3468,6 +3554,12 @@ OO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.AccessKeyedElement );
  */
 OO.ui.ButtonWidget.static.cancelButtonMouseDownEvents = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.ButtonWidget.static.tagName = 'span';
+
 /* Methods */
 
 /**
@@ -3586,9 +3678,11 @@ OO.ui.ButtonWidget.prototype.setNoFollow = function ( noFollow ) {
 // Override method visibility hints from ButtonElement
 /**
  * @method setActive
+ * @inheritdoc
  */
 /**
  * @method isActive
+ * @inheritdoc
  */
 
 /**
@@ -3645,6 +3739,14 @@ OO.ui.ButtonGroupWidget = function OoUiButtonGroupWidget( config ) {
 OO.inheritClass( OO.ui.ButtonGroupWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.mixin.GroupElement );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.ButtonGroupWidget.static.tagName = 'span';
+
 /**
  * IconWidget is a generic widget for {@link OO.ui.mixin.IconElement icons}. In general, IconWidgets should be used with OO.ui.LabelWidget,
  * which creates a label that identifies the icon’s function. See the [OOjs UI documentation on MediaWiki] [1]
@@ -3815,9 +3917,14 @@ OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
        this.input = config.input;
 
        // Initialization
-       if ( this.input instanceof OO.ui.InputWidget ) {
+       if ( this.input ) {
                if ( this.input.getInputId() ) {
                        this.$element.attr( 'for', this.input.getInputId() );
+               } else {
+                       this.$label.on( 'click', function () {
+                               this.input.focus();
+                               return false;
+                       }.bind( this ) );
                }
        }
        this.$element.addClass( 'oo-ui-labelWidget' );
@@ -3971,8 +4078,8 @@ OO.ui.mixin.PendingElement.prototype.popPending = function () {
 };
 
 /**
- * Element that will stick under a specified container, even when it is inserted elsewhere in the
- * document (for example, in a OO.ui.Window's $overlay).
+ * Element that will stick adjacent to a specified container, even when it is inserted elsewhere
+ * in the document (for example, in an OO.ui.Window's $overlay).
  *
  * The elements's position is automatically calculated and maintained when window is resized or the
  * page is scrolled. If you reposition the container manually, you have to call #position to make
@@ -3988,7 +4095,21 @@ OO.ui.mixin.PendingElement.prototype.popPending = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {jQuery} [$floatable] Node to position, assigned to #$floatable, omit to use #$element
- * @cfg {jQuery} [$floatableContainer] Node to position below
+ * @cfg {jQuery} [$floatableContainer] Node to position adjacent to
+ * @cfg {string} [verticalPosition='below'] Where to position $floatable vertically:
+ *  'below': Directly below $floatableContainer, aligning f's top edge with fC's bottom edge
+ *  'above': Directly above $floatableContainer, aligning f's bottom edge with fC's top edge
+ *  'top': Align the top edge with $floatableContainer's top edge
+ *  'bottom': Align the bottom edge with $floatableContainer's bottom edge
+ *  'center': Vertically align the center with $floatableContainer's center
+ * @cfg {string} [horizontalPosition='start'] Where to position $floatable horizontally:
+ *  'before': Directly before $floatableContainer, aligning f's end edge with fC's start edge
+ *  'after': Directly after $floatableContainer, algining f's start edge with fC's end edge
+ *  'start': Align the start (left in LTR, right in RTL) edge with $floatableContainer's start edge
+ *  'end': Align the end (right in LTR, left in RTL) edge with $floatableContainer's end edge
+ *  'center': Horizontally align the center with $floatableContainer's center
+ * @cfg {boolean} [hideWhenOutOfView=true] Whether to hide the floatable element if the container
+ *  is out of view
  */
 OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
        // Configuration initialization
@@ -4005,6 +4126,9 @@ OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
        // Initialization
        this.setFloatableContainer( config.$floatableContainer );
        this.setFloatableElement( config.$floatable || this.$element );
+       this.setVerticalPosition( config.verticalPosition || 'below' );
+       this.setHorizontalPosition( config.horizontalPosition || 'start' );
+       this.hideWhenOutOfView = config.hideWhenOutOfView === undefined ? true : !!config.hideWhenOutOfView;
 };
 
 /* Methods */
@@ -4029,7 +4153,7 @@ OO.ui.mixin.FloatableElement.prototype.setFloatableElement = function ( $floatab
 /**
  * Set floatable container.
  *
- * The element will be always positioned under the specified container.
+ * The element will be positioned relative to the specified container.
  *
  * @param {jQuery|null} $floatableContainer Container to keep visible, or null to unset
  */
@@ -4040,6 +4164,40 @@ OO.ui.mixin.FloatableElement.prototype.setFloatableContainer = function ( $float
        }
 };
 
+/**
+ * Change how the element is positioned vertically.
+ *
+ * @param {string} position 'below', 'above', 'top', 'bottom' or 'center'
+ */
+OO.ui.mixin.FloatableElement.prototype.setVerticalPosition = function ( position ) {
+       if ( [ 'below', 'above', 'top', 'bottom', 'center' ].indexOf( position ) === -1 ) {
+               throw new Error( 'Invalid value for vertical position: ' + position );
+       }
+       if ( this.verticalPosition !== position ) {
+               this.verticalPosition = position;
+               if ( this.$floatable ) {
+                       this.position();
+               }
+       }
+};
+
+/**
+ * Change how the element is positioned horizontally.
+ *
+ * @param {string} position 'before', 'after', 'start', 'end' or 'center'
+ */
+OO.ui.mixin.FloatableElement.prototype.setHorizontalPosition = function ( position ) {
+       if ( [ 'before', 'after', 'start', 'end', 'center' ].indexOf( position ) === -1 ) {
+               throw new Error( 'Invalid value for horizontal position: ' + position );
+       }
+       if ( this.horizontalPosition !== position ) {
+               this.horizontalPosition = position;
+               if ( this.$floatable ) {
+                       this.position();
+               }
+       }
+};
+
 /**
  * Toggle positioning.
  *
@@ -4057,11 +4215,20 @@ OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positionin
 
        positioning = positioning === undefined ? !this.positioning : !!positioning;
 
+       if ( positioning && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'FloatableElement#togglePositioning: Before calling this method, the element must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
        if ( this.positioning !== positioning ) {
                this.positioning = positioning;
 
+               this.needsCustomPosition =
+                       this.verticalPostion !== 'below' ||
+                       this.horizontalPosition !== 'start' ||
+                       !OO.ui.contains( this.$floatableContainer[ 0 ], this.$floatable[ 0 ] );
+
                closestScrollableOfContainer = OO.ui.Element.static.getClosestScrollableContainer( this.$floatableContainer[ 0 ] );
-               this.needsCustomPosition = !OO.ui.contains( this.$floatableContainer[ 0 ], this.$floatable[ 0 ] );
                // If the scrollable is the root, we have to listen to scroll events
                // on the window because of browser inconsistencies.
                if ( $( closestScrollableOfContainer ).is( 'html, body' ) ) {
@@ -4104,10 +4271,9 @@ OO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positionin
  * @return {boolean}
  */
 OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element, $container ) {
-       var elemRect, contRect,
-               leftEdgeInBounds = false,
-               bottomEdgeInBounds = false,
-               rightEdgeInBounds = false;
+       var elemRect, contRect, topEdgeInBounds, bottomEdgeInBounds, leftEdgeInBounds, rightEdgeInBounds,
+               startEdgeInBounds, endEdgeInBounds,
+               direction = $element.css( 'direction' );
 
        elemRect = $element[ 0 ].getBoundingClientRect();
        if ( $container[ 0 ] === window ) {
@@ -4121,20 +4287,35 @@ OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element
                contRect = $container[ 0 ].getBoundingClientRect();
        }
 
-       // For completeness, if we still cared about topEdgeInBounds, that'd be:
-       // elemRect.top >= contRect.top && elemRect.top <= contRect.bottom
-       if ( elemRect.left >= contRect.left && elemRect.left <= contRect.right ) {
-               leftEdgeInBounds = true;
+       topEdgeInBounds = elemRect.top >= contRect.top && elemRect.top <= contRect.bottom;
+       bottomEdgeInBounds = elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom;
+       leftEdgeInBounds = elemRect.left >= contRect.left && elemRect.left <= contRect.right;
+       rightEdgeInBounds = elemRect.right >= contRect.left && elemRect.right <= contRect.right;
+       if ( direction === 'rtl' ) {
+               startEdgeInBounds = rightEdgeInBounds;
+               endEdgeInBounds = leftEdgeInBounds;
+       } else {
+               startEdgeInBounds = leftEdgeInBounds;
+               endEdgeInBounds = rightEdgeInBounds;
+       }
+
+       if ( this.verticalPosition === 'below' && !bottomEdgeInBounds ) {
+               return false;
        }
-       if ( elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom ) {
-               bottomEdgeInBounds = true;
+       if ( this.verticalPosition === 'above' && !topEdgeInBounds ) {
+               return false;
+       }
+       if ( this.horizontalPosition === 'before' && !startEdgeInBounds ) {
+               return false;
        }
-       if ( elemRect.right >= contRect.left && elemRect.right <= contRect.right ) {
-               rightEdgeInBounds = true;
+       if ( this.horizontalPosition === 'after' && !endEdgeInBounds ) {
+               return false;
        }
 
-       // We only care that any part of the bottom edge is visible
-       return bottomEdgeInBounds && ( leftEdgeInBounds || rightEdgeInBounds );
+       // The other positioning values are all about being inside the container,
+       // so in those cases all we care about is that any part of the container is visible.
+       return elemRect.top <= contRect.bottom && elemRect.bottom >= contRect.top &&
+               elemRect.left <= contRect.right && elemRect.right >= contRect.left;
 };
 
 /**
@@ -4145,33 +4326,36 @@ OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element
  * @chainable
  */
 OO.ui.mixin.FloatableElement.prototype.position = function () {
-       var pos;
-
        if ( !this.positioning ) {
                return this;
        }
 
-       if ( !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
+       if ( !(
+               // To continue, some things need to be true:
+               // The element must actually be in the DOM
+               this.isElementAttached() && (
+                       // The closest scrollable is the current window
+                       this.$floatableClosestScrollable[ 0 ] === this.getElementWindow() ||
+                       // OR is an element in the element's DOM
+                       $.contains( this.getElementDocument(), this.$floatableClosestScrollable[ 0 ] )
+               )
+       ) ) {
+               // Abort early if important parts of the widget are no longer attached to the DOM
+               return this;
+       }
+
+       if ( this.hideWhenOutOfView && !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
                this.$floatable.addClass( 'oo-ui-element-hidden' );
-               return;
+               return this;
        } else {
                this.$floatable.removeClass( 'oo-ui-element-hidden' );
        }
 
        if ( !this.needsCustomPosition ) {
-               return;
+               return this;
        }
 
-       pos = OO.ui.Element.static.getRelativePosition( this.$floatableContainer, this.$floatable.offsetParent() );
-       // Position under container
-       pos.top += this.$floatableContainer.height();
-       // In LTR, we position from the left, and pos.left is already set
-       // In RTL, we position from the right instead.
-       if ( this.$floatableContainer.css( 'direction' ) === 'rtl' ) {
-               pos.right = this.$floatable.offsetParent().width() - pos.left - this.$floatableContainer.outerWidth();
-               delete pos.left;
-       }
-       this.$floatable.css( pos );
+       this.$floatable.css( this.computePosition() );
 
        // We updated the position, so re-evaluate the clipping state.
        // (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so
@@ -4185,6 +4369,120 @@ OO.ui.mixin.FloatableElement.prototype.position = function () {
        return this;
 };
 
+/**
+ * Compute how #$floatable should be positioned based on the position of #$floatableContainer
+ * and the positioning settings. This is a helper for #position that shouldn't be called directly,
+ * but may be overridden by subclasses if they want to change or add to the positioning logic.
+ *
+ * @return {Object} New position to apply with .css(). Keys are 'top', 'left', 'bottom' and 'right'.
+ */
+OO.ui.mixin.FloatableElement.prototype.computePosition = function () {
+       var isBody, scrollableX, scrollableY, containerPos,
+               horizScrollbarHeight, vertScrollbarWidth, scrollTop, scrollLeft,
+               newPos = { top: '', left: '', bottom: '', right: '' },
+               direction = this.$floatableContainer.css( 'direction' ),
+               $offsetParent = this.$floatable.offsetParent();
+
+       if ( $offsetParent.is( 'html' ) ) {
+               // The innerHeight/Width and clientHeight/Width calculations don't work well on the
+               // <html> element, but they do work on the <body>
+               $offsetParent = $( $offsetParent[ 0 ].ownerDocument.body );
+       }
+       isBody = $offsetParent.is( 'body' );
+       scrollableX = $offsetParent.css( 'overflow-x' ) === 'scroll' || $offsetParent.css( 'overflow-x' ) === 'auto';
+       scrollableY = $offsetParent.css( 'overflow-y' ) === 'scroll' || $offsetParent.css( 'overflow-y' ) === 'auto';
+
+       vertScrollbarWidth = $offsetParent.innerWidth() - $offsetParent.prop( 'clientWidth' );
+       horizScrollbarHeight = $offsetParent.innerHeight() - $offsetParent.prop( 'clientHeight' );
+       // We don't need to compute and add scrollTop and scrollLeft if the scrollable container is the body,
+       // or if it isn't scrollable
+       scrollTop = scrollableY && !isBody ? $offsetParent.scrollTop() : 0;
+       scrollLeft = scrollableX && !isBody ? OO.ui.Element.static.getScrollLeft( $offsetParent[ 0 ] ) : 0;
+
+       // Avoid passing the <body> to getRelativePosition(), because it won't return what we expect
+       // if the <body> has a margin
+       containerPos = isBody ?
+               this.$floatableContainer.offset() :
+               OO.ui.Element.static.getRelativePosition( this.$floatableContainer, $offsetParent );
+       containerPos.bottom = containerPos.top + this.$floatableContainer.outerHeight();
+       containerPos.right = containerPos.left + this.$floatableContainer.outerWidth();
+       containerPos.start = direction === 'rtl' ? containerPos.right : containerPos.left;
+       containerPos.end = direction === 'rtl' ? containerPos.left : containerPos.right;
+
+       if ( this.verticalPosition === 'below' ) {
+               newPos.top = containerPos.bottom;
+       } else if ( this.verticalPosition === 'above' ) {
+               newPos.bottom = $offsetParent.outerHeight() - containerPos.top;
+       } else if ( this.verticalPosition === 'top' ) {
+               newPos.top = containerPos.top;
+       } else if ( this.verticalPosition === 'bottom' ) {
+               newPos.bottom = $offsetParent.outerHeight() - containerPos.bottom;
+       } else if ( this.verticalPosition === 'center' ) {
+               newPos.top = containerPos.top +
+                       ( this.$floatableContainer.height() - this.$floatable.height() ) / 2;
+       }
+
+       if ( this.horizontalPosition === 'before' ) {
+               newPos.end = containerPos.start;
+       } else if ( this.horizontalPosition === 'after' ) {
+               newPos.start = containerPos.end;
+       } else if ( this.horizontalPosition === 'start' ) {
+               newPos.start = containerPos.start;
+       } else if ( this.horizontalPosition === 'end' ) {
+               newPos.end = containerPos.end;
+       } else if ( this.horizontalPosition === 'center' ) {
+               newPos.left = containerPos.left +
+                       ( this.$floatableContainer.width() - this.$floatable.width() ) / 2;
+       }
+
+       if ( newPos.start !== undefined ) {
+               if ( direction === 'rtl' ) {
+                       newPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.start;
+               } else {
+                       newPos.left = newPos.start;
+               }
+               delete newPos.start;
+       }
+       if ( newPos.end !== undefined ) {
+               if ( direction === 'rtl' ) {
+                       newPos.left = newPos.end;
+               } else {
+                       newPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.end;
+               }
+               delete newPos.end;
+       }
+
+       // Account for scroll position
+       if ( newPos.top !== '' ) {
+               newPos.top += scrollTop;
+       }
+       if ( newPos.bottom !== '' ) {
+               newPos.bottom -= scrollTop;
+       }
+       if ( newPos.left !== '' ) {
+               newPos.left += scrollLeft;
+       }
+       if ( newPos.right !== '' ) {
+               newPos.right -= scrollLeft;
+       }
+
+       // Account for scrollbar gutter
+       if ( newPos.bottom !== '' ) {
+               newPos.bottom -= horizScrollbarHeight;
+       }
+       if ( direction === 'rtl' ) {
+               if ( newPos.left !== '' ) {
+                       newPos.left -= vertScrollbarWidth;
+               }
+       } else {
+               if ( newPos.right !== '' ) {
+                       newPos.right -= vertScrollbarWidth;
+               }
+       }
+
+       return newPos;
+};
+
 /**
  * Element that can be automatically clipped to visible boundaries.
  *
@@ -4281,6 +4579,11 @@ OO.ui.mixin.ClippableElement.prototype.setClippableContainer = function ( $clipp
 OO.ui.mixin.ClippableElement.prototype.toggleClipping = function ( clipping ) {
        clipping = clipping === undefined ? !this.clipping : !!clipping;
 
+       if ( clipping && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'ClippableElement#toggleClipping: Before calling this method, the element must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
        if ( this.clipping !== clipping ) {
                this.clipping = clipping;
                if ( clipping ) {
@@ -4354,7 +4657,7 @@ OO.ui.mixin.ClippableElement.prototype.isClippedVertically = function () {
 };
 
 /**
- * Set the ideal size. These are the dimensions the element will have when it's not being clipped.
+ * Set the ideal size. These are the dimensions #$clippable will have when it's not being clipped.
  *
  * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix
  * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix
@@ -4439,7 +4742,7 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
        } else {
                this.$clippable.css( {
                        overflowX: '',
-                       width: this.idealWidth ? this.idealWidth - extraWidth : '',
+                       width: this.idealWidth || '',
                        maxWidth: Math.max( 0, allotedWidth )
                } );
        }
@@ -4455,7 +4758,7 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
        } else {
                this.$clippable.css( {
                        overflowY: '',
-                       height: this.idealHeight ? this.idealHeight - extraHeight : '',
+                       height: this.idealHeight || '',
                        maxHeight: Math.max( 0, allotedHeight )
                } );
        }
@@ -4476,6 +4779,8 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
  * By default, each popup has an anchor that points toward its origin.
  * Please see the [OOjs UI documentation on Mediawiki] [1] for more information and examples.
  *
+ * Unlike most widgets, PopupWidget is initially hidden and must be shown by calling #toggle.
+ *
  *     @example
  *     // A popup widget.
  *     var popup = new OO.ui.PopupWidget( {
@@ -4501,13 +4806,26 @@ OO.ui.mixin.ClippableElement.prototype.clip = function () {
  * @cfg {number} [width=320] Width of popup in pixels
  * @cfg {number} [height] Height of popup in pixels. Omit to use the automatic height.
  * @cfg {boolean} [anchor=true] Show anchor pointing to origin of popup
- * @cfg {string} [align='center'] Alignment of the popup: `center`, `force-left`, `force-right`, `backwards` or `forwards`.
- *  If the popup is forced-left the popup body is leaning towards the left. For force-right alignment, the body of the
- *  popup is leaning towards the right of the screen.
- *  Using 'backwards' is a logical direction which will result in the popup leaning towards the beginning of the sentence
- *  in the given language, which means it will flip to the correct positioning in right-to-left languages.
- *  Using 'forward' will also result in a logical alignment where the body of the popup leans towards the end of the
- *  sentence in the given language.
+ * @cfg {string} [position='below'] Where to position the popup relative to $floatableContainer
+ *  'above': Put popup above $floatableContainer; anchor points down to the horizontal center
+ *           of $floatableContainer
+ *  'below': Put popup below $floatableContainer; anchor points up to the horizontal center
+ *           of $floatableContainer
+ *  'before': Put popup to the left (LTR) / right (RTL) of $floatableContainer; anchor points
+ *            endwards (right/left) to the vertical center of $floatableContainer
+ *  'after': Put popup to the right (LTR) / left (RTL) of $floatableContainer; anchor points
+ *            startwards (left/right) to the vertical center of $floatableContainer
+ * @cfg {string} [align='center'] How to align the popup to $floatableContainer
+ *  'forwards': If position is above/below, move the popup as far endwards (right in LTR, left in RTL)
+ *              as possible while still keeping the anchor within the popup;
+ *              if position is before/after, move the popup as far downwards as possible.
+ *  'backwards': If position is above/below, move the popup as far startwards (left in LTR, right in RTL)
+ *               as possible while still keeping the anchor within the popup;
+ *               if position in before/after, move the popup as far upwards as possible.
+ *  'center': Horizontally (if position is above/below) or vertically (before/after) align the center
+ *            of the popup with the center of $floatableContainer.
+ * 'force-left': Alias for 'forwards' in LTR and 'backwards' in RTL
+ * 'force-right': Alias for 'backwards' in RTL and 'forwards' in LTR
  * @cfg {jQuery} [$container] Constrain the popup to the boundaries of the specified container.
  *  See the [OOjs UI docs on MediaWiki][3] for an example.
  *  [3]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Popups#containerExample
@@ -4550,15 +4868,16 @@ OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
        this.autoClose = !!config.autoClose;
        this.$autoCloseIgnore = config.$autoCloseIgnore;
        this.transitionTimeout = null;
-       this.anchor = null;
+       this.anchored = false;
        this.width = config.width !== undefined ? config.width : 320;
        this.height = config.height !== undefined ? config.height : null;
-       this.setAlignment( config.align );
        this.onMouseDownHandler = this.onMouseDown.bind( this );
        this.onDocumentKeyDownHandler = this.onDocumentKeyDown.bind( this );
 
        // Initialization
        this.toggleAnchor( config.anchor === undefined || config.anchor );
+       this.setAlignment( config.align || 'center' );
+       this.setPosition( config.position || 'below' );
        this.$body.addClass( 'oo-ui-popupWidget-body' );
        this.$anchor.addClass( 'oo-ui-popupWidget-anchor' );
        this.$popup
@@ -4607,6 +4926,14 @@ OO.mixinClass( OO.ui.PopupWidget, OO.ui.mixin.LabelElement );
 OO.mixinClass( OO.ui.PopupWidget, OO.ui.mixin.ClippableElement );
 OO.mixinClass( OO.ui.PopupWidget, OO.ui.mixin.FloatableElement );
 
+/* Events */
+
+/**
+ * @event ready
+ *
+ * The popup is ready: it is visible and has been positioned and clipped.
+ */
+
 /* Methods */
 
 /**
@@ -4700,12 +5027,31 @@ OO.ui.PopupWidget.prototype.toggleAnchor = function ( show ) {
        if ( this.anchored !== show ) {
                if ( show ) {
                        this.$element.addClass( 'oo-ui-popupWidget-anchored' );
+                       this.$element.addClass( 'oo-ui-popupWidget-anchored-' + this.anchorEdge );
                } else {
                        this.$element.removeClass( 'oo-ui-popupWidget-anchored' );
+                       this.$element.removeClass( 'oo-ui-popupWidget-anchored-' + this.anchorEdge );
                }
                this.anchored = show;
        }
 };
+/**
+ * Change which edge the anchor appears on.
+ *
+ * @param {string} edge 'top', 'bottom', 'start' or 'end'
+ */
+OO.ui.PopupWidget.prototype.setAnchorEdge = function ( edge ) {
+       if ( [ 'top', 'bottom', 'start', 'end' ].indexOf( edge ) === -1 ) {
+               throw new Error( 'Invalid value for edge: ' + edge );
+       }
+       if ( this.anchorEdge !== null ) {
+               this.$element.removeClass( 'oo-ui-popupWidget-anchored-' + this.anchorEdge );
+       }
+       this.anchorEdge = edge;
+       if ( this.anchored ) {
+               this.$element.addClass( 'oo-ui-popupWidget-anchored-' + edge );
+       }
+};
 
 /**
  * Check if the anchor is visible.
@@ -4713,10 +5059,19 @@ OO.ui.PopupWidget.prototype.toggleAnchor = function ( show ) {
  * @return {boolean} Anchor is visible
  */
 OO.ui.PopupWidget.prototype.hasAnchor = function () {
-       return this.anchor;
+       return this.anchored;
 };
 
 /**
+ * Toggle visibility of the popup. The popup is initially hidden and must be shown by calling
+ * `.toggle( true )` after its #$element is attached to the DOM.
+ *
+ * Do not show the popup while it is not attached to the DOM. The calculations required to display
+ * it in the right place and with the right dimensions only work correctly while it is attached.
+ * Side-effects may include broken interface and exceptions being thrown. This wasn't always
+ * strictly enforced, so currently it only generates a warning in the browser console.
+ *
+ * @fires ready
  * @inheritdoc
  */
 OO.ui.PopupWidget.prototype.toggle = function ( show ) {
@@ -4725,6 +5080,15 @@ OO.ui.PopupWidget.prototype.toggle = function ( show ) {
 
        change = show !== this.isVisible();
 
+       if ( show && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'PopupWidget#toggle: Before calling this method, the popup must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+       if ( show && !this.$floatableContainer && this.isElementAttached() ) {
+               // Fall back to the parent node if the floatableContainer is not set
+               this.setFloatableContainer( this.$element.parent() );
+       }
+
        // Parent method
        OO.ui.PopupWidget.parent.prototype.toggle.call( this, show );
 
@@ -4738,6 +5102,7 @@ OO.ui.PopupWidget.prototype.toggle = function ( show ) {
                        }
                        this.updateDimensions();
                        this.toggleClipping( true );
+                       this.emit( 'ready' );
                } else {
                        this.toggleClipping( false );
                        if ( this.autoClose ) {
@@ -4778,9 +5143,37 @@ OO.ui.PopupWidget.prototype.setSize = function ( width, height, transition ) {
  * @chainable
  */
 OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
-       var popupOffset, originOffset, containerLeft, containerWidth, containerRight,
-               popupLeft, popupRight, overlapLeft, overlapRight, anchorWidth, direction,
-               dirFactor, align,
+       var widget = this;
+
+       // Prevent transition from being interrupted
+       clearTimeout( this.transitionTimeout );
+       if ( transition ) {
+               // Enable transition
+               this.$element.addClass( 'oo-ui-popupWidget-transitioning' );
+       }
+
+       this.position();
+
+       if ( transition ) {
+               // Prevent transitioning after transition is complete
+               this.transitionTimeout = setTimeout( function () {
+                       widget.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
+               }, 200 );
+       } else {
+               // Prevent transitioning immediately
+               this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.PopupWidget.prototype.computePosition = function () {
+       var direction, align, vertical, start, end, near, far, sizeProp, popupSize, anchorSize, anchorPos,
+               anchorOffset, anchorMargin, parentPosition, positionProp, positionAdjustment, floatablePos,
+               offsetParentPos, containerPos,
+               popupPos = {},
+               anchorCss = { left: '', right: '', top: '', bottom: '' },
                alignMap = {
                        ltr: {
                                'force-left': 'backwards',
@@ -4791,77 +5184,118 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
                                'force-right': 'backwards'
                        }
                },
-               widget = this;
+               anchorEdgeMap = {
+                       above: 'bottom',
+                       below: 'top',
+                       before: 'end',
+                       after: 'start'
+               },
+               hPosMap = {
+                       forwards: 'start',
+                       center: 'center',
+                       backwards: 'before'
+               },
+               vPosMap = {
+                       forwards: 'top',
+                       center: 'center',
+                       backwards: 'bottom'
+               };
 
        if ( !this.$container ) {
                // Lazy-initialize $container if not specified in constructor
                this.$container = $( this.getClosestScrollableElementContainer() );
        }
        direction = this.$container.css( 'direction' );
-       dirFactor = direction === 'rtl' ? -1 : 1;
-       align = alignMap[ direction ][ this.align ] || this.align;
 
-       // Set height and width before measuring things, since it might cause our measurements
-       // to change (e.g. due to scrollbars appearing or disappearing)
+       // Set height and width before we do anything else, since it might cause our measurements
+       // to change (e.g. due to scrollbars appearing or disappearing), and it also affects centering
        this.$popup.css( {
                width: this.width,
-               height: this.height !== null ? this.height : 'auto'
-       } );
-
-       // Compute initial popupOffset based on alignment
-       popupOffset = this.width * ( { backwards: -1, center: -0.5, forwards: 0 } )[ align ];
-
-       // Figure out if this will cause the popup to go beyond the edge of the container
-       originOffset = this.$element.offset().left;
-       containerLeft = this.$container.offset().left;
-       containerWidth = this.$container.innerWidth();
-       containerRight = containerLeft + containerWidth;
-       popupLeft = dirFactor * popupOffset - this.containerPadding;
-       popupRight = dirFactor * popupOffset + this.containerPadding + this.width + this.containerPadding;
-       overlapLeft = ( originOffset + popupLeft ) - containerLeft;
-       overlapRight = containerRight - ( originOffset + popupRight );
-
-       // Adjust offset to make the popup not go beyond the edge, if needed
-       if ( overlapRight < 0 ) {
-               popupOffset += dirFactor * overlapRight;
-       } else if ( overlapLeft < 0 ) {
-               popupOffset -= dirFactor * overlapLeft;
-       }
-
-       // Adjust offset to avoid anchor being rendered too close to the edge
-       // $anchor.width() doesn't work with the pure CSS anchor (returns 0)
-       // TODO: Find a measurement that works for CSS anchors and image anchors
-       anchorWidth = this.$anchor[ 0 ].scrollWidth * 2;
-       if ( popupOffset + this.width < anchorWidth ) {
-               popupOffset = anchorWidth - this.width;
-       } else if ( -popupOffset < anchorWidth ) {
-               popupOffset = -anchorWidth;
-       }
-
-       // Prevent transition from being interrupted
-       clearTimeout( this.transitionTimeout );
-       if ( transition ) {
-               // Enable transition
-               this.$element.addClass( 'oo-ui-popupWidget-transitioning' );
-       }
+               height: this.height !== null ? this.height : 'auto'
+       } );
 
-       // Position body relative to anchor
-       this.$popup.css( direction === 'rtl' ? 'margin-right' : 'margin-left', popupOffset );
+       align = alignMap[ direction ][ this.align ] || this.align;
+       // If the popup is positioned before or after, then the anchor positioning is vertical, otherwise horizontal
+       vertical = this.popupPosition === 'before' || this.popupPosition === 'after';
+       start = vertical ? 'top' : ( direction === 'rtl' ? 'right' : 'left' );
+       end = vertical ? 'bottom' : ( direction === 'rtl' ? 'left' : 'right' );
+       near = vertical ? 'top' : 'left';
+       far = vertical ? 'bottom' : 'right';
+       sizeProp = vertical ? 'Height' : 'Width';
+       popupSize = vertical ? ( this.height || this.$popup.height() ) : this.width;
+
+       this.setAnchorEdge( anchorEdgeMap[ this.popupPosition ] );
+       this.horizontalPosition = vertical ? this.popupPosition : hPosMap[ align ];
+       this.verticalPosition = vertical ? vPosMap[ align ] : this.popupPosition;
 
-       if ( transition ) {
-               // Prevent transitioning after transition is complete
-               this.transitionTimeout = setTimeout( function () {
-                       widget.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
-               }, 200 );
+       // Parent method
+       parentPosition = OO.ui.mixin.FloatableElement.prototype.computePosition.call( this );
+       // Find out which property FloatableElement used for positioning, and adjust that value
+       positionProp = vertical ?
+               ( parentPosition.top !== '' ? 'top' : 'bottom' ) :
+               ( parentPosition.left !== '' ? 'left' : 'right' );
+
+       // Figure out where the near and far edges of the popup and $floatableContainer are
+       floatablePos = this.$floatableContainer.offset();
+       floatablePos[ far ] = floatablePos[ near ] + this.$floatableContainer[ 'outer' + sizeProp ]();
+       // Measure where the offsetParent is and compute our position based on that and parentPosition
+       offsetParentPos = this.$element.offsetParent().offset();
+
+       if ( positionProp === near ) {
+               popupPos[ near ] = offsetParentPos[ near ] + parentPosition[ near ];
+               popupPos[ far ] = popupPos[ near ] + popupSize;
        } else {
-               // Prevent transitioning immediately
-               this.$element.removeClass( 'oo-ui-popupWidget-transitioning' );
+               popupPos[ far ] = offsetParentPos[ near ] +
+                       this.$element.offsetParent()[ 'inner' + sizeProp ]() - parentPosition[ far ];
+               popupPos[ near ] = popupPos[ far ] - popupSize;
+       }
+
+       // Position the anchor (which is positioned relative to the popup) to point to $floatableContainer
+       anchorPos = ( floatablePos[ start ] + floatablePos[ end ] ) / 2;
+       anchorOffset = ( start === far ? -1 : 1 ) * ( anchorPos - popupPos[ start ] );
+
+       // If the anchor is less than 2*anchorSize from either edge, move the popup to make more space
+       // this.$anchor.width()/height() returns 0 because of the CSS trickery we use, so use scrollWidth/Height
+       anchorSize = this.$anchor[ 0 ][ 'scroll' + sizeProp ];
+       anchorMargin = parseFloat( this.$anchor.css( 'margin-' + start ) );
+       if ( anchorOffset + anchorMargin < 2 * anchorSize ) {
+               // Not enough space for the anchor on the start side; pull the popup startwards
+               positionAdjustment = ( positionProp === start ? -1 : 1 ) *
+                       ( 2 * anchorSize - ( anchorOffset + anchorMargin ) );
+       } else if ( anchorOffset + anchorMargin > popupSize - 2 * anchorSize ) {
+               // Not enough space for the anchor on the end side; pull the popup endwards
+               positionAdjustment = ( positionProp === end ? -1 : 1 ) *
+                       ( anchorOffset + anchorMargin - ( popupSize - 2 * anchorSize ) );
+       } else {
+               positionAdjustment = 0;
        }
 
-       // Reevaluate clipping state since we've relocated and resized the popup
-       this.clip();
+       // Check if the popup will go beyond the edge of this.$container
+       containerPos = this.$container.offset();
+       containerPos[ far ] = containerPos[ near ] + this.$container[ 'inner' + sizeProp ]();
+       // Take into account how much the popup will move because of the adjustments we're going to make
+       popupPos[ near ] += ( positionProp === near ? 1 : -1 ) * positionAdjustment;
+       popupPos[ far ] += ( positionProp === near ? 1 : -1 ) * positionAdjustment;
+       if ( containerPos[ near ] + this.containerPadding > popupPos[ near ] ) {
+               // Popup goes beyond the near (left/top) edge, move it to the right/bottom
+               positionAdjustment += ( positionProp === near ? 1 : -1 ) *
+                       ( containerPos[ near ] + this.containerPadding - popupPos[ near ] );
+       } else if ( containerPos[ far ] - this.containerPadding < popupPos[ far ] ) {
+               // Popup goes beyond the far (right/bottom) edge, move it to the left/top
+               positionAdjustment += ( positionProp === far ? 1 : -1 ) *
+                       ( popupPos[ far ] - ( containerPos[ far ] - this.containerPadding ) );
+       }
 
-       return this;
+       // Adjust anchorOffset for positionAdjustment
+       anchorOffset += ( positionProp === start ? -1 : 1 ) * positionAdjustment;
+
+       // Position the anchor
+       anchorCss[ start ] = anchorOffset;
+       this.$anchor.css( anchorCss );
+       // Move the popup if needed
+       parentPosition[ positionProp ] += positionAdjustment;
+
+       return parentPosition;
 };
 
 /**
@@ -4871,30 +5305,47 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
  *  `backwards` or `forwards`.
  */
 OO.ui.PopupWidget.prototype.setAlignment = function ( 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';
        }
+       this.position();
 };
 
 /**
  * Get popup alignment
  *
- * @return {string} align Alignment of the popup, `center`, `force-left`, `force-right`,
+ * @return {string} Alignment of the popup, `center`, `force-left`, `force-right`,
  *  `backwards` or `forwards`.
  */
 OO.ui.PopupWidget.prototype.getAlignment = function () {
        return this.align;
 };
 
+/**
+ * Change the positioning of the popup.
+ *
+ * @param {string} position 'above', 'below', 'before' or 'after'
+ */
+OO.ui.PopupWidget.prototype.setPosition = function ( position ) {
+       if ( [ 'above', 'below', 'before', 'after' ].indexOf( position ) === -1 ) {
+               position = 'below';
+       }
+       this.popupPosition = position;
+       this.position();
+};
+
+/**
+ * Get popup positioning.
+ *
+ * @return {string} 'above', 'below', 'before' or 'after'
+ */
+OO.ui.PopupWidget.prototype.getPosition = function () {
+       return this.popupPosition;
+};
+
 /**
  * PopupElement is mixed into other classes to generate a {@link OO.ui.PopupWidget popup widget}.
  * A popup is a container for content. It is overlaid and positioned absolutely. By default, each
@@ -4915,9 +5366,14 @@ OO.ui.mixin.PopupElement = function OoUiMixinPopupElement( config ) {
 
        // Properties
        this.popup = new OO.ui.PopupWidget( $.extend(
-               { autoClose: true },
+               {
+                       autoClose: true,
+                       $floatableContainer: this.$element
+               },
                config.popup,
-               { $autoCloseIgnore: this.$element.add( config.popup && config.popup.$autoCloseIgnore ) }
+               {
+                       $autoCloseIgnore: this.$element.add( config.popup && config.popup.$autoCloseIgnore )
+               }
        ) );
 };
 
@@ -4959,17 +5415,14 @@ OO.ui.mixin.PopupElement.prototype.getPopup = function () {
  * @cfg {jQuery} [$overlay] Render the popup into a separate layer. This configuration is useful in cases where
  *  the expanded popup is larger than its containing `<div>`. The specified overlay layer is usually on top of the
  *  containing `<div>` and has a larger area. By default, the popup uses relative positioning.
+ *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.
  */
 OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
        // Parent constructor
        OO.ui.PopupButtonWidget.parent.call( this, config );
 
        // Mixin constructors
-       OO.ui.mixin.PopupElement.call( this, $.extend( true, {}, config, {
-               popup: {
-                       $floatableContainer: this.$element
-               }
-       } ) );
+       OO.ui.mixin.PopupElement.call( this, config );
 
        // Properties
        this.$overlay = config.$overlay || this.$element;
@@ -5407,6 +5860,7 @@ OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
        this.$element
                .addClass( 'oo-ui-selectWidget oo-ui-selectWidget-depressed' )
                .attr( 'role', 'listbox' );
+       this.setFocusOwner( this.$element );
        if ( Array.isArray( config.items ) ) {
                this.addItems( config.items );
        }
@@ -5499,7 +5953,7 @@ OO.ui.SelectWidget.prototype.onFocus = function ( event ) {
        }
 
        if ( event.target !== this.$element[ 0 ] ) {
-               this.$element.focus();
+               this.$focusOwner.focus();
        }
 };
 
@@ -5913,6 +6367,11 @@ OO.ui.SelectWidget.prototype.highlightItem = function ( item ) {
                }
        }
        if ( changed ) {
+               if ( item ) {
+                       this.$focusOwner.attr( 'aria-activedescendant', item.getElementId() );
+               } else {
+                       this.$focusOwner.removeAttr( 'aria-activedescendant' );
+               }
                this.emit( 'highlight', item );
        }
 
@@ -6011,6 +6470,13 @@ OO.ui.SelectWidget.prototype.selectItem = function ( item ) {
                }
        }
        if ( changed ) {
+               if ( item && !item.constructor.static.highlightable ) {
+                       if ( item ) {
+                               this.$focusOwner.attr( 'aria-activedescendant', item.getElementId() );
+                       } else {
+                               this.$focusOwner.removeAttr( 'aria-activedescendant' );
+                       }
+               }
                this.emit( 'select', item );
        }
 
@@ -6187,6 +6653,18 @@ OO.ui.SelectWidget.prototype.clearItems = function () {
        return this;
 };
 
+/**
+ * Set the DOM element which has focus while the user is interacting with this SelectWidget.
+ *
+ * Currently this is just used to set `aria-activedescendant` on it.
+ *
+ * @protected
+ * @param {jQuery} $focusOwner
+ */
+OO.ui.SelectWidget.prototype.setFocusOwner = function ( $focusOwner ) {
+       this.$focusOwner = $focusOwner;
+};
+
 /**
  * DecoratedOptionWidgets are {@link OO.ui.OptionWidget options} that can be configured
  * with an {@link OO.ui.mixin.IconElement icon} and/or {@link OO.ui.mixin.IndicatorElement indicator}.
@@ -6257,16 +6735,11 @@ OO.mixinClass( OO.ui.DecoratedOptionWidget, OO.ui.mixin.IndicatorElement );
  * @param {Object} [config] Configuration options
  */
 OO.ui.MenuOptionWidget = function OoUiMenuOptionWidget( config ) {
-       // Configuration initialization
-       config = $.extend( { icon: 'check' }, config );
-
        // Parent constructor
        OO.ui.MenuOptionWidget.parent.call( this, config );
 
        // Initialization
-       this.$element
-               .attr( 'role', 'menuitem' )
-               .addClass( 'oo-ui-menuOptionWidget' );
+       this.$element.addClass( 'oo-ui-menuOptionWidget' );
 };
 
 /* Setup */
@@ -6323,7 +6796,8 @@ OO.ui.MenuSectionOptionWidget = function OoUiMenuSectionOptionWidget( config ) {
        OO.ui.MenuSectionOptionWidget.parent.call( this, config );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-menuSectionOptionWidget' );
+       this.$element.addClass( 'oo-ui-menuSectionOptionWidget' )
+               .removeAttr( 'role aria-selected' );
 };
 
 /* Setup */
@@ -6362,12 +6836,15 @@ OO.ui.MenuSectionOptionWidget.static.highlightable = false;
  * - Down-arrow key: highlight the next menu option
  * - Esc key: hide the menu
  *
+ * Unlike most widgets, MenuSelectWidget is initially hidden and must be shown by calling #toggle.
+ *
  * Please see the [OOjs UI documentation on MediaWiki][1] for more information.
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
  *
  * @class
  * @extends OO.ui.SelectWidget
  * @mixins OO.ui.mixin.ClippableElement
+ * @mixins OO.ui.mixin.FloatableElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -6381,7 +6858,11 @@ OO.ui.MenuSectionOptionWidget.static.highlightable = false;
  *  that toggles the menu's visibility on click, the menu will be hidden then re-shown when the user clicks
  *  that button, unless the button (or its parent widget) is passed in here.
  * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu.
+ * @cfg {jQuery} [$autoCloseIgnore] If these elements are clicked, don't auto-hide the menu.
+ * @cfg {boolean} [hideOnChoose=true] Hide the menu when the user chooses an option.
  * @cfg {boolean} [filterFromInput=false] Filter the displayed options from the input
+ * @cfg {boolean} [highlightOnFilter] Highlight the first result when filtering
+ * @cfg {number} [width] Width of the menu
  */
 OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
        // Configuration initialization
@@ -6392,19 +6873,25 @@ OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
 
        // Mixin constructors
        OO.ui.mixin.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );
+       OO.ui.mixin.FloatableElement.call( this, config );
 
        // Properties
        this.autoHide = config.autoHide === undefined || !!config.autoHide;
+       this.hideOnChoose = config.hideOnChoose === undefined || !!config.hideOnChoose;
        this.filterFromInput = !!config.filterFromInput;
        this.$input = config.$input ? config.$input : config.input ? config.input.$input : null;
        this.$widget = config.widget ? config.widget.$element : null;
+       this.$autoCloseIgnore = config.$autoCloseIgnore || $( [] );
        this.onDocumentMouseDownHandler = this.onDocumentMouseDown.bind( this );
        this.onInputEditHandler = OO.ui.debounce( this.updateItemVisibility.bind( this ), 100 );
+       this.highlightOnFilter = !!config.highlightOnFilter;
+       this.width = config.width;
 
        // Initialization
-       this.$element
-               .addClass( 'oo-ui-menuSelectWidget' )
-               .attr( 'role', 'menu' );
+       this.$element.addClass( 'oo-ui-menuSelectWidget' );
+       if ( config.widget ) {
+               this.setFocusOwner( config.widget.$tabIndexed );
+       }
 
        // Initially hidden - using #toggle may cause errors if subclasses override toggle with methods
        // that reference properties not initialized at that time of parent class construction
@@ -6417,6 +6904,15 @@ OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
 
 OO.inheritClass( OO.ui.MenuSelectWidget, OO.ui.SelectWidget );
 OO.mixinClass( OO.ui.MenuSelectWidget, OO.ui.mixin.ClippableElement );
+OO.mixinClass( OO.ui.MenuSelectWidget, OO.ui.mixin.FloatableElement );
+
+/* Events */
+
+/**
+ * @event ready
+ *
+ * The menu is ready: it is visible and has been positioned and clipped.
+ */
 
 /* Methods */
 
@@ -6428,8 +6924,12 @@ OO.mixinClass( OO.ui.MenuSelectWidget, OO.ui.mixin.ClippableElement );
  */
 OO.ui.MenuSelectWidget.prototype.onDocumentMouseDown = function ( e ) {
        if (
-               !OO.ui.contains( this.$element[ 0 ], e.target, true ) &&
-               ( !this.$widget || !OO.ui.contains( this.$widget[ 0 ], e.target, true ) )
+               this.isVisible() &&
+               !OO.ui.contains(
+                               this.$element.add( this.$widget ).add( this.$autoCloseIgnore ).get(),
+                               e.target,
+                               true
+               )
        ) {
                this.toggle( false );
        }
@@ -6475,20 +6975,47 @@ OO.ui.MenuSelectWidget.prototype.onKeyDown = function ( e ) {
  * @protected
  */
 OO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {
-       var i, item, visible,
+       var i, item, visible, section, sectionEmpty,
+               firstItemFound = false,
                anyVisible = false,
                len = this.items.length,
                showAll = !this.isVisible(),
-               filter = showAll ? null : this.getItemMatcher( this.$input.val() );
+               filter = showAll ? null : this.getItemMatcher( this.$input.val() ),
+               exactFilter = this.getItemMatcher( this.$input.val(), true ),
+               exactMatch = false;
 
+       // Hide non-matching options, and also hide section headers if all options
+       // in their section are hidden.
        for ( i = 0; i < len; i++ ) {
                item = this.items[ i ];
-               if ( item instanceof OO.ui.OptionWidget ) {
+               if ( item instanceof OO.ui.MenuSectionOptionWidget ) {
+                       if ( section ) {
+                               // If the previous section was empty, hide its header
+                               section.toggle( showAll || !sectionEmpty );
+                       }
+                       section = item;
+                       sectionEmpty = true;
+               } else if ( item instanceof OO.ui.OptionWidget ) {
                        visible = showAll || filter( item );
+                       exactMatch = exactMatch || exactFilter( item );
                        anyVisible = anyVisible || visible;
+                       sectionEmpty = sectionEmpty && !visible;
                        item.toggle( visible );
+                       if ( this.highlightOnFilter && visible && !firstItemFound ) {
+                               // Highlight the first item in the list
+                               this.highlightItem( item );
+                               firstItemFound = true;
+                       }
                }
        }
+       // Process the final section
+       if ( section ) {
+               section.toggle( showAll || !sectionEmpty );
+       }
+
+       if ( anyVisible && this.items.length && !exactMatch ) {
+               this.scrollItemIntoView( this.items[ 0 ] );
+       }
 
        this.$element.toggleClass( 'oo-ui-menuSelectWidget-invisible', !anyVisible );
 
@@ -6525,6 +7052,7 @@ OO.ui.MenuSelectWidget.prototype.bindKeyPressListener = function () {
        if ( this.$input ) {
                if ( this.filterFromInput ) {
                        this.$input.on( 'keydown mouseup cut paste change input select', this.onInputEditHandler );
+                       this.updateItemVisibility();
                }
        } else {
                OO.ui.MenuSelectWidget.parent.prototype.bindKeyPressListener.call( this );
@@ -6548,7 +7076,7 @@ OO.ui.MenuSelectWidget.prototype.unbindKeyPressListener = function () {
 /**
  * Choose an item.
  *
- * When a user chooses an item, the menu is closed.
+ * When a user chooses an item, the menu is closed, unless the hideOnChoose config option is set to false.
  *
  * Note that ‘choose’ should never be modified programmatically. A user can choose an option with the keyboard
  * or mouse and it becomes selected. To select an item programmatically, use the #selectItem method.
@@ -6558,7 +7086,9 @@ OO.ui.MenuSelectWidget.prototype.unbindKeyPressListener = function () {
  */
 OO.ui.MenuSelectWidget.prototype.chooseItem = function ( item ) {
        OO.ui.MenuSelectWidget.parent.prototype.chooseItem.call( this, item );
-       this.toggle( false );
+       if ( this.hideOnChoose ) {
+               this.toggle( false );
+       }
        return this;
 };
 
@@ -6602,6 +7132,15 @@ OO.ui.MenuSelectWidget.prototype.clearItems = function () {
 };
 
 /**
+ * Toggle visibility of the menu. The menu is initially hidden and must be shown by calling
+ * `.toggle( true )` after its #$element is attached to the DOM.
+ *
+ * Do not show the menu while it is not attached to the DOM. The calculations required to display
+ * it in the right place and with the right dimensions only work correctly while it is attached.
+ * Side-effects may include broken interface and exceptions being thrown. This wasn't always
+ * strictly enforced, so currently it only generates a warning in the browser console.
+ *
+ * @fires ready
  * @inheritdoc
  */
 OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
@@ -6610,6 +7149,15 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
        visible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;
        change = visible !== this.isVisible();
 
+       if ( visible && !this.warnedUnattached && !this.isElementAttached() ) {
+               OO.ui.warnDeprecation( 'MenuSelectWidget#toggle: Before calling this method, the menu must be attached to the DOM.' );
+               this.warnedUnattached = true;
+       }
+
+       if ( change && visible && ( this.width || this.$floatableContainer ) ) {
+               this.setIdealSize( this.width || this.$floatableContainer.width() );
+       }
+
        // Parent method
        OO.ui.MenuSelectWidget.parent.prototype.toggle.call( this, visible );
 
@@ -6618,9 +7166,11 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
                        this.bindKeyDownListener();
                        this.bindKeyPressListener();
 
+                       this.togglePositioning( !!this.$floatableContainer );
                        this.toggleClipping( true );
 
                        if ( this.getSelectedItem() ) {
+                               this.$focusOwner.attr( 'aria-activedescendant', this.getSelectedItem().getElementId() );
                                this.getSelectedItem().scrollElementIntoView( { duration: 0 } );
                        }
 
@@ -6628,10 +7178,14 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
                        if ( this.autoHide ) {
                                this.getElementDocument().addEventListener( 'mousedown', this.onDocumentMouseDownHandler, true );
                        }
+
+                       this.emit( 'ready' );
                } else {
+                       this.$focusOwner.removeAttr( 'aria-activedescendant' );
                        this.unbindKeyDownListener();
                        this.unbindKeyPressListener();
                        this.getElementDocument().removeEventListener( 'mousedown', this.onDocumentMouseDownHandler, true );
+                       this.togglePositioning( false );
                        this.toggleClipping( false );
                }
        }
@@ -6689,10 +7243,11 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {Object} [menu] Configuration options to pass to {@link OO.ui.FloatingMenuSelectWidget menu select widget}
+ * @cfg {Object} [menu] Configuration options to pass to {@link OO.ui.MenuSelectWidget menu select widget}
  * @cfg {jQuery} [$overlay] Render the menu into a separate layer. This configuration is useful in cases where
  *  the expanded menu is larger than its containing `<div>`. The specified overlay layer is usually on top of the
  *  containing `<div>` and has a larger area. By default, the menu uses relative positioning.
+ *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.
  */
 OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
        // Configuration initialization
@@ -6713,9 +7268,9 @@ OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
        OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$handle } ) );
 
        // Properties
-       this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend( {
+       this.menu = new OO.ui.MenuSelectWidget( $.extend( {
                widget: this,
-               $container: this.$element
+               $floatableContainer: this.$element
        }, config.menu ) );
 
        // Events
@@ -6734,6 +7289,11 @@ OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
        // Initialization
        this.$handle
                .addClass( 'oo-ui-dropdownWidget-handle' )
+               .attr( {
+                       role: 'combobox',
+                       'aria-owns': this.menu.getElementId(),
+                       'aria-autocomplete': 'list'
+               } )
                .append( this.$icon, this.$label, this.$indicator );
        this.$element
                .addClass( 'oo-ui-dropdownWidget' )
@@ -7429,19 +7989,14 @@ OO.ui.CheckboxMultiselectWidget.prototype.onClick = function ( e ) {
 };
 
 /**
- * FloatingMenuSelectWidget is a menu that will stick under a specified
- * container, even when it is inserted elsewhere in the document (for example,
- * in a OO.ui.Window's $overlay). This is sometimes necessary to prevent the
- * menu from being clipped too aggresively.
- *
- * The menu's position is automatically calculated and maintained when the menu
- * is toggled or the window is resized.
- *
- * See OO.ui.ComboBoxInputWidget for an example of a widget that uses this class.
+ * FloatingMenuSelectWidget was a menu that would stick under a specified
+ * container, even when it is inserted elsewhere in the document.
+ * This functionality is now included in MenuSelectWidget, and FloatingMenuSelectWidget
+ * is preserved for backwards-compatibility.
  *
  * @class
  * @extends OO.ui.MenuSelectWidget
- * @mixins OO.ui.mixin.FloatableElement
+ * @deprecated since v0.21.3, use MenuSelectWidget instead.
  *
  * @constructor
  * @param {OO.ui.Widget} [inputWidget] Widget to provide the menu for.
@@ -7450,6 +8005,8 @@ OO.ui.CheckboxMultiselectWidget.prototype.onClick = function ( e ) {
  * @cfg {jQuery} [$container=inputWidget.$element] Element to render menu under
  */
 OO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWidget, config ) {
+       OO.ui.warnDeprecation( 'FloatingMenuSelectWidget is deprecated. Use the MenuSelectWidget instead.' );
+
        // Allow 'inputWidget' parameter and config for backwards compatibility
        if ( OO.isPlainObject( inputWidget ) && config === undefined ) {
                config = inputWidget;
@@ -7459,15 +8016,12 @@ OO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWid
        // Configuration initialization
        config = config || {};
 
-       // Parent constructor
-       OO.ui.FloatingMenuSelectWidget.parent.call( this, config );
-
-       // Properties (must be set before mixin constructors)
+       // Properties
        this.inputWidget = inputWidget; // For backwards compatibility
-       this.$container = config.$container || this.inputWidget.$element;
+       this.$container = config.$floatableContainer || config.$container || this.inputWidget.$element;
 
-       // Mixins constructors
-       OO.ui.mixin.FloatableElement.call( this, $.extend( {}, config, { $floatableContainer: this.$container } ) );
+       // Parent constructor
+       OO.ui.FloatingMenuSelectWidget.parent.call( this, $.extend( {}, config, { $floatableContainer: this.$container } ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-floatingMenuSelectWidget' );
@@ -7478,50 +8032,6 @@ OO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWid
 /* Setup */
 
 OO.inheritClass( OO.ui.FloatingMenuSelectWidget, OO.ui.MenuSelectWidget );
-OO.mixinClass( OO.ui.FloatingMenuSelectWidget, OO.ui.mixin.FloatableElement );
-
-/* Methods */
-
-/**
- * @inheritdoc
- */
-OO.ui.FloatingMenuSelectWidget.prototype.toggle = function ( visible ) {
-       var change;
-       visible = visible === undefined ? !this.isVisible() : !!visible;
-       change = visible !== this.isVisible();
-
-       if ( change && visible ) {
-               // Make sure the width is set before the parent method runs.
-               this.setIdealSize( this.$container.width() );
-       }
-
-       // Parent method
-       // This will call this.clip(), which is nonsensical since we're not positioned yet...
-       OO.ui.FloatingMenuSelectWidget.parent.prototype.toggle.call( this, visible );
-
-       if ( change ) {
-               this.togglePositioning( this.isVisible() );
-       }
-
-       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,
@@ -7692,14 +8202,6 @@ OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.TabIndexedElement );
 OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.TitledElement );
 OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.AccessKeyedElement );
 
-/* Static Properties */
-
-/**
- * @static
- * @inheritdoc
- */
-OO.ui.InputWidget.static.supportsSimpleLabel = true;
-
 /* Static Methods */
 
 /**
@@ -7751,25 +8253,6 @@ OO.ui.InputWidget.prototype.getInputElement = function () {
        return $( '<input>' );
 };
 
-/**
- * Get input element's ID.
- *
- * If the element already has an ID then that is returned, otherwise unique ID is
- * generated, set on the element, and returned.
- *
- * @return {string} The ID of the element
- */
-OO.ui.InputWidget.prototype.getInputId = function () {
-       var id = this.$input.attr( 'id' );
-
-       if ( id === undefined ) {
-               id = OO.ui.generateElementId();
-               this.$input.attr( 'id', id );
-       }
-
-       return id;
-};
-
 /**
  * Handle potentially value-changing events.
  *
@@ -7880,26 +8363,6 @@ OO.ui.InputWidget.prototype.setDisabled = function ( state ) {
        return this;
 };
 
-/**
- * Focus the input.
- *
- * @chainable
- */
-OO.ui.InputWidget.prototype.focus = function () {
-       this.$input[ 0 ].focus();
-       return this;
-};
-
-/**
- * Blur the input.
- *
- * @chainable
- */
-OO.ui.InputWidget.prototype.blur = function () {
-       this.$input[ 0 ].blur();
-       return this;
-};
-
 /**
  * @inheritdoc
  */
@@ -7988,13 +8451,10 @@ OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.TitledElement );
 /* Static Properties */
 
 /**
- * Disable generating `<label>` elements for buttons. One would very rarely need additional label
- * for a button, and it's already a big clickable target, and it causes unexpected rendering.
- *
  * @static
  * @inheritdoc
  */
-OO.ui.ButtonInputWidget.static.supportsSimpleLabel = false;
+OO.ui.ButtonInputWidget.static.tagName = 'span';
 
 /* Methods */
 
@@ -8050,6 +8510,15 @@ OO.ui.ButtonInputWidget.prototype.setValue = function ( value ) {
        return this;
 };
 
+/**
+ * @inheritdoc
+ */
+OO.ui.ButtonInputWidget.prototype.getInputId = function () {
+       // Disable generating `<label>` elements for buttons. One would very rarely need additional label
+       // for a button, and it's already a big clickable target, and it causes unexpected rendering.
+       return null;
+};
+
 /**
  * CheckboxInputWidgets, like HTML checkboxes, can be selected and/or configured with a value.
  * Note that these {@link OO.ui.InputWidget input widgets} are best laid out
@@ -8110,6 +8579,14 @@ OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
 
 OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.CheckboxInputWidget.static.tagName = 'span';
+
 /* Static Methods */
 
 /**
@@ -8245,6 +8722,7 @@ OO.ui.DropdownInputWidget = function OoUiDropdownInputWidget( config ) {
        this.$element
                .addClass( 'oo-ui-dropdownInputWidget' )
                .append( this.dropdownWidget.$element );
+       this.setTabIndexedElement( null );
 };
 
 /* Setup */
@@ -8276,8 +8754,12 @@ OO.ui.DropdownInputWidget.prototype.onMenuSelect = function ( item ) {
  * @inheritdoc
  */
 OO.ui.DropdownInputWidget.prototype.setValue = function ( value ) {
+       var selected;
        value = this.cleanUpValue( value );
        this.dropdownWidget.getMenu().selectItemByData( value );
+       // Only allow setting values that are actually present in the dropdown
+       selected = this.dropdownWidget.getMenu().getSelectedItem();
+       value = selected ? selected.getData() : '';
        OO.ui.DropdownInputWidget.parent.prototype.setValue.call( this, value );
        return this;
 };
@@ -8307,10 +8789,17 @@ OO.ui.DropdownInputWidget.prototype.setOptions = function ( options ) {
                .clearItems()
                .addItems( options.map( function ( opt ) {
                        var optValue = widget.cleanUpValue( opt.data );
-                       return new OO.ui.MenuOptionWidget( {
-                               data: optValue,
-                               label: opt.label !== undefined ? opt.label : optValue
-                       } );
+
+                       if ( opt.optgroup === undefined ) {
+                               return new OO.ui.MenuOptionWidget( {
+                                       data: optValue,
+                                       label: opt.label !== undefined ? opt.label : optValue
+                               } );
+                       } else {
+                               return new OO.ui.MenuSectionOptionWidget( {
+                                       label: opt.optgroup
+                               } );
+                       }
                } ) );
 
        // Restore the previous value, or reset to something sensible
@@ -8331,7 +8820,7 @@ OO.ui.DropdownInputWidget.prototype.setOptions = function ( options ) {
  * @inheritdoc
  */
 OO.ui.DropdownInputWidget.prototype.focus = function () {
-       this.dropdownWidget.getMenu().toggle( true );
+       this.dropdownWidget.focus();
        return this;
 };
 
@@ -8339,7 +8828,7 @@ OO.ui.DropdownInputWidget.prototype.focus = function () {
  * @inheritdoc
  */
 OO.ui.DropdownInputWidget.prototype.blur = function () {
-       this.dropdownWidget.getMenu().toggle( false );
+       this.dropdownWidget.blur();
        return this;
 };
 
@@ -8403,6 +8892,14 @@ OO.ui.RadioInputWidget = function OoUiRadioInputWidget( config ) {
 
 OO.inheritClass( OO.ui.RadioInputWidget, OO.ui.InputWidget );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.RadioInputWidget.static.tagName = 'span';
+
 /* Static Methods */
 
 /**
@@ -8508,20 +9005,13 @@ OO.ui.RadioSelectInputWidget = function OoUiRadioSelectInputWidget( config ) {
        this.$element
                .addClass( 'oo-ui-radioSelectInputWidget' )
                .append( this.radioSelectWidget.$element );
+       this.setTabIndexedElement( null );
 };
 
 /* Setup */
 
 OO.inheritClass( OO.ui.RadioSelectInputWidget, OO.ui.InputWidget );
 
-/* Static Properties */
-
-/**
- * @static
- * @inheritdoc
- */
-OO.ui.RadioSelectInputWidget.static.supportsSimpleLabel = false;
-
 /* Static Methods */
 
 /**
@@ -8618,6 +9108,22 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
        return this;
 };
 
+/**
+ * @inheritdoc
+ */
+OO.ui.RadioSelectInputWidget.prototype.focus = function () {
+       this.radioSelectWidget.focus();
+       return this;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.RadioSelectInputWidget.prototype.blur = function () {
+       this.radioSelectWidget.blur();
+       return this;
+};
+
 /**
  * CheckboxMultiselectInputWidget is a
  * {@link OO.ui.CheckboxMultiselectWidget CheckboxMultiselectWidget} intended to be used within a
@@ -8673,14 +9179,6 @@ OO.ui.CheckboxMultiselectInputWidget = function OoUiCheckboxMultiselectInputWidg
 
 OO.inheritClass( OO.ui.CheckboxMultiselectInputWidget, OO.ui.InputWidget );
 
-/* Static Properties */
-
-/**
- * @static
- * @inheritdoc
- */
-OO.ui.CheckboxMultiselectInputWidget.static.supportsSimpleLabel = false;
-
 /* Static Methods */
 
 /**
@@ -8711,7 +9209,7 @@ OO.ui.CheckboxMultiselectInputWidget.static.reusePreInfuseDOM = function ( node,
  */
 OO.ui.CheckboxMultiselectInputWidget.prototype.getInputElement = function () {
        // Actually unused
-       return $( '<div>' );
+       return $( '<unused>' );
 };
 
 /**
@@ -8833,7 +9331,7 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options )
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {string} [type='text'] The value of the HTML `type` attribute: 'text', 'password', 'search',
- *  'email', 'url', 'date', 'month' or 'number'. Ignored if `multiline` is true.
+ *  'email', 'url' or 'number'. Ignored if `multiline` is true.
  *
  *  Some values of `type` result in additional behaviors:
  *
@@ -8849,7 +9347,7 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options )
  *  specifies minimum number of rows to display.
  * @cfg {boolean} [autosize=false] Automatically resize the text input to fit its content.
  *  Use the #maxRows config to specify a maximum number of displayed rows.
- * @cfg {boolean} [maxRows] Maximum number of rows to display when #autosize is set to true.
+ * @cfg {number} [maxRows] Maximum number of rows to display when #autosize is set to true.
  *  Defaults to the maximum of `10` and `2 * rows`, or `10` if `rows` isn't provided.
  * @cfg {string} [labelPosition='after'] The position of the inline label relative to that of
  *  the value or placeholder text: `'before'` or `'after'`
@@ -9018,7 +9516,7 @@ OO.ui.TextInputWidget.static.gatherPreInfuseState = function ( node, config ) {
  */
 OO.ui.TextInputWidget.prototype.onIconMouseDown = function ( e ) {
        if ( e.which === OO.ui.MouseButtons.LEFT ) {
-               this.$input[ 0 ].focus();
+               this.focus();
                return false;
        }
 };
@@ -9035,7 +9533,7 @@ OO.ui.TextInputWidget.prototype.onIndicatorMouseDown = function ( e ) {
                        // Clear the text field
                        this.setValue( '' );
                }
-               this.$input[ 0 ].focus();
+               this.focus();
                return false;
        }
 };
@@ -9164,14 +9662,14 @@ OO.ui.TextInputWidget.prototype.setRequired = function ( state ) {
        this.required = !!state;
        if ( this.required ) {
                this.$input
-                       .attr( 'required', 'required' )
+                       .prop( 'required', true )
                        .attr( 'aria-required', 'true' );
                if ( this.getIndicator() === null ) {
                        this.setIndicator( 'required' );
                }
        } else {
                this.$input
-                       .removeAttr( 'required' )
+                       .prop( 'required', false )
                        .removeAttr( 'aria-required' );
                if ( this.getIndicator() === 'required' ) {
                        this.setIndicator( null );
@@ -9360,8 +9858,6 @@ OO.ui.TextInputWidget.prototype.getSaneType = function ( config ) {
                'search',
                'email',
                'url',
-               'date',
-               'month',
                'number'
        ];
        return allowedTypes.indexOf( config.type ) !== -1 ? config.type : 'text';
@@ -9750,7 +10246,7 @@ OO.ui.SearchInputWidget.prototype.onIndicatorMouseDown = function ( e ) {
        if ( e.which === OO.ui.MouseButtons.LEFT ) {
                // Clear the text field
                this.setValue( '' );
-               this.$input[ 0 ].focus();
+               this.focus();
                return false;
        }
 };
@@ -9805,6 +10301,10 @@ 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.
  *
+ * After the user chooses an option, its `data` will be used as a new value for the widget.
+ * A `label` also can be specified for each option: if given, it will be shown instead of the
+ * `data` in the dropdown menu.
+ *
  * 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].
@@ -9812,32 +10312,33 @@ OO.ui.SearchInputWidget.prototype.setReadOnly = function ( state ) {
  *     @example
  *     // Example: A ComboBoxInputWidget.
  *     var comboBox = new OO.ui.ComboBoxInputWidget( {
- *         label: 'ComboBoxInputWidget',
  *         value: 'Option 1',
- *         menu: {
- *             items: [
- *                 new OO.ui.MenuOptionWidget( {
- *                     data: 'Option 1',
- *                     label: 'Option One'
- *                 } ),
- *                 new OO.ui.MenuOptionWidget( {
- *                     data: 'Option 2',
- *                     label: 'Option Two'
- *                 } ),
- *                 new OO.ui.MenuOptionWidget( {
- *                     data: 'Option 3',
- *                     label: 'Option Three'
- *                 } ),
- *                 new OO.ui.MenuOptionWidget( {
- *                     data: 'Option 4',
- *                     label: 'Option Four'
- *                 } ),
- *                 new OO.ui.MenuOptionWidget( {
- *                     data: 'Option 5',
- *                     label: 'Option Five'
- *                 } )
- *             ]
- *         }
+ *         options: [
+ *             { data: 'Option 1' },
+ *             { data: 'Option 2' },
+ *             { data: 'Option 3' }
+ *         ]
+ *     } );
+ *     $( 'body' ).append( comboBox.$element );
+ *
+ *     @example
+ *     // Example: A ComboBoxInputWidget with additional option labels.
+ *     var comboBox = new OO.ui.ComboBoxInputWidget( {
+ *         value: 'Option 1',
+ *         options: [
+ *             {
+ *                 data: 'Option 1',
+ *                 label: 'Option One'
+ *             },
+ *             {
+ *                 data: 'Option 2',
+ *                 label: 'Option Two'
+ *             },
+ *             {
+ *                 data: 'Option 3',
+ *                 label: 'Option Three'
+ *             }
+ *         ]
  *     } );
  *     $( 'body' ).append( comboBox.$element );
  *
@@ -9849,10 +10350,11 @@ OO.ui.SearchInputWidget.prototype.setReadOnly = function ( state ) {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`
- * @cfg {Object} [menu] Configuration options to pass to the {@link OO.ui.FloatingMenuSelectWidget menu select widget}.
+ * @cfg {Object} [menu] Configuration options to pass to the {@link OO.ui.MenuSelectWidget menu select widget}.
  * @cfg {jQuery} [$overlay] Render the menu into a separate layer. This configuration is useful in cases where
  *  the expanded menu is larger than its containing `<div>`. The specified overlay layer is usually on top of the
  *  containing `<div>` and has a larger area. By default, the menu uses relative positioning.
+ *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.
  */
 OO.ui.ComboBoxInputWidget = function OoUiComboBoxInputWidget( config ) {
        // Configuration initialization
@@ -9860,9 +10362,14 @@ OO.ui.ComboBoxInputWidget = function OoUiComboBoxInputWidget( config ) {
                autocomplete: false
        }, config );
 
-       // ComboBoxInputWidget shouldn't support multiline
+       // ComboBoxInputWidget shouldn't support `multiline`
        config.multiline = false;
 
+       // See InputWidget#reusePreInfuseDOM about `config.$input`
+       if ( config.$input ) {
+               config.$input.removeAttr( 'list' );
+       }
+
        // Parent constructor
        OO.ui.ComboBoxInputWidget.parent.call( this, config );
 
@@ -9873,11 +10380,11 @@ OO.ui.ComboBoxInputWidget = function OoUiComboBoxInputWidget( config ) {
                indicator: 'down',
                disabled: this.disabled
        } );
-       this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend(
+       this.menu = new OO.ui.MenuSelectWidget( $.extend(
                {
                        widget: this,
                        input: this,
-                       $container: this.$element,
+                       $floatableContainer: this.$element,
                        disabled: this.isDisabled()
                },
                config.menu
@@ -9900,6 +10407,7 @@ OO.ui.ComboBoxInputWidget = function OoUiComboBoxInputWidget( config ) {
        // Initialization
        this.$input.attr( {
                role: 'combobox',
+               'aria-owns': this.menu.getElementId(),
                'aria-autocomplete': 'list'
        } );
        // Do not override options set via config.menu.items
@@ -9925,7 +10433,7 @@ OO.inheritClass( OO.ui.ComboBoxInputWidget, OO.ui.TextInputWidget );
 /**
  * Get the combobox's menu.
  *
- * @return {OO.ui.FloatingMenuSelectWidget} Menu widget
+ * @return {OO.ui.MenuSelectWidget} Menu widget
  */
 OO.ui.ComboBoxInputWidget.prototype.getMenu = function () {
        return this.menu;
@@ -9977,7 +10485,7 @@ OO.ui.ComboBoxInputWidget.prototype.onInputEnter = function () {
  */
 OO.ui.ComboBoxInputWidget.prototype.onDropdownButtonClick = function () {
        this.menu.toggle();
-       this.$input[ 0 ].focus();
+       this.focus();
 };
 
 /**
@@ -10077,6 +10585,8 @@ OO.ui.ComboBoxInputWidget.prototype.setOptions = function ( options ) {
  * @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a "help" icon will appear
  *  in the upper-right corner of the rendered field; clicking it will display the text in a popup.
  *  For important messages, you are advised to use `notices`, as they are always shown.
+ * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.
+ *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.
  *
  * @throws {Error} An error is thrown if no widget is specified
  */
@@ -10108,13 +10618,14 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.fieldWidget = fieldWidget;
        this.errors = [];
        this.notices = [];
-       this.$field = $( '<div>' );
+       this.$field = this.isFieldInline() ? $( '<span>' ) : $( '<div>' );
        this.$messages = $( '<ul>' );
-       this.$header = $( '<div>' );
+       this.$header = $( '<span>' );
        this.$body = $( '<div>' );
        this.align = null;
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       $overlay: config.$overlay,
                        popup: {
                                padded: true
                        },
@@ -10136,10 +10647,13 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.fieldWidget.connect( this, { disable: 'onFieldDisable' } );
 
        // Initialization
-       if ( fieldWidget.constructor.static.supportsSimpleLabel ) {
-               if ( this.fieldWidget.getInputId() ) {
-                       this.$label.attr( 'for', this.fieldWidget.getInputId() );
-               }
+       if ( this.fieldWidget.getInputId() ) {
+               this.$label.attr( 'for', this.fieldWidget.getInputId() );
+       } else {
+               this.$label.on( 'click', function () {
+                       this.fieldWidget.focus();
+                       return false;
+               }.bind( this ) );
        }
        this.$element
                .addClass( 'oo-ui-fieldLayout' )
@@ -10184,6 +10698,17 @@ OO.ui.FieldLayout.prototype.getField = function () {
        return this.fieldWidget;
 };
 
+/**
+ * Return `true` if the given field widget can be used with `'inline'` alignment (see
+ * #setAlignment). Return `false` if it can't or if this can't be determined.
+ *
+ * @return {boolean}
+ */
+OO.ui.FieldLayout.prototype.isFieldInline = function () {
+       // This is very simplistic, but should be good enough.
+       return this.getField().$element.prop( 'tagName' ).toLowerCase() === 'span';
+};
+
 /**
  * @protected
  * @param {string} kind 'error' or 'notice'
@@ -10220,6 +10745,10 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
                if ( [ 'left', 'right', 'top', 'inline' ].indexOf( value ) === -1 ) {
                        value = 'left';
                }
+               // Validate
+               if ( value === 'inline' && !this.isFieldInline() ) {
+                       value = 'top';
+               }
                // Reorder elements
                if ( value === 'top' ) {
                        this.$header.append( this.$label, this.$help );
@@ -10355,8 +10884,8 @@ OO.ui.ActionFieldLayout = function OoUiActionFieldLayout( fieldWidget, buttonWid
 
        // Properties
        this.buttonWidget = buttonWidget;
-       this.$button = $( '<div>' );
-       this.$input = $( '<div>' );
+       this.$button = $( '<span>' );
+       this.$input = this.isFieldInline() ? $( '<span>' ) : $( '<div>' );
 
        // Initialization
        this.$element
@@ -10419,6 +10948,8 @@ OO.inheritClass( OO.ui.ActionFieldLayout, OO.ui.FieldLayout );
  * @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a "help" icon will appear
  *  in the upper-right corner of the rendered field; clicking it will display the text in a popup.
  *  For important messages, you are advised to use `notices`, as they are always shown.
+ * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.
+ *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.
  */
 OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
        // Configuration initialization
@@ -10436,6 +10967,7 @@ OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
        this.$header = $( '<div>' );
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+                       $overlay: config.$overlay,
                        popup: {
                                padded: true
                        },
@@ -10728,3 +11260,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
diff --git a/resources/lib/oojs-ui/oojs-ui-core.js.map b/resources/lib/oojs-ui/oojs-ui-core.js.map
new file mode 100644 (file)
index 0000000..ef74490
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/intro.js.txt","../src/core.js","../src/mixin.js","../src/Element.js","../src/HtmlSnippet.js","../src/Layout.js","../src/Widget.js","../src/Theme.js","../src/mixins/TabIndexedElement.js","../src/mixins/ButtonElement.js","../src/mixins/GroupElement.js","../src/mixins/IconElement.js","../src/mixins/IndicatorElement.js","../src/mixins/LabelElement.js","../src/mixins/FlaggedElement.js","../src/mixins/TitledElement.js","../src/mixins/AccessKeyedElement.js","../src/widgets/ButtonWidget.js","../src/widgets/ButtonGroupWidget.js","../src/widgets/IconWidget.js","../src/widgets/IndicatorWidget.js","../src/widgets/LabelWidget.js","../src/mixins/PendingElement.js","../src/mixins/FloatableElement.js","../src/mixins/ClippableElement.js","../src/widgets/PopupWidget.js","../src/mixins/PopupElement.js","../src/widgets/PopupButtonWidget.js","../src/mixins/GroupWidget.js","../src/mixins/ItemWidget.js","../src/widgets/OptionWidget.js","../src/widgets/SelectWidget.js","../src/widgets/DecoratedOptionWidget.js","../src/widgets/MenuOptionWidget.js","../src/widgets/MenuSectionOptionWidget.js","../src/widgets/MenuSelectWidget.js","../src/widgets/DropdownWidget.js","../src/widgets/RadioOptionWidget.js","../src/widgets/RadioSelectWidget.js","../src/widgets/MultioptionWidget.js","../src/widgets/MultiselectWidget.js","../src/widgets/CheckboxMultioptionWidget.js","../src/widgets/CheckboxMultiselectWidget.js","../src/widgets/FloatingMenuSelectWidget.js","../src/widgets/ProgressBarWidget.js","../src/widgets/InputWidget.js","../src/widgets/ButtonInputWidget.js","../src/widgets/CheckboxInputWidget.js","../src/widgets/DropdownInputWidget.js","../src/widgets/RadioInputWidget.js","../src/widgets/RadioSelectInputWidget.js","../src/widgets/CheckboxMultiselectInputWidget.js","../src/widgets/TextInputWidget.js","../src/widgets/SearchInputWidget.js","../src/widgets/ComboBoxInputWidget.js","../src/layouts/FieldLayout.js","../src/layouts/ActionFieldLayout.js","../src/layouts/FieldsetLayout.js","../src/layouts/FormLayout.js","../src/layouts/PanelLayout.js","../src/layouts/HorizontalLayout.js","../src/outro.js.txt"],"names":[],"mappings":"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","file":"oojs-ui-core.js","sourcesContent":["( function ( OO ) {\n\n'use strict';\n","/**\n * Namespace for all classes, static methods and static properties.\n *\n * @class\n * @singleton\n */\nOO.ui = {};\n\nOO.ui.bind = $.proxy;\n\n/**\n * @property {Object}\n */\nOO.ui.Keys = {\n\tUNDEFINED: 0,\n\tBACKSPACE: 8,\n\tDELETE: 46,\n\tLEFT: 37,\n\tRIGHT: 39,\n\tUP: 38,\n\tDOWN: 40,\n\tENTER: 13,\n\tEND: 35,\n\tHOME: 36,\n\tTAB: 9,\n\tPAGEUP: 33,\n\tPAGEDOWN: 34,\n\tESCAPE: 27,\n\tSHIFT: 16,\n\tSPACE: 32\n};\n\n/**\n * Constants for MouseEvent.which\n *\n * @property {Object}\n */\nOO.ui.MouseButtons = {\n\tLEFT: 1,\n\tMIDDLE: 2,\n\tRIGHT: 3\n};\n\n/**\n * @property {number}\n * @private\n */\nOO.ui.elementId = 0;\n\n/**\n * Generate a unique ID for element\n *\n * @return {string} ID\n */\nOO.ui.generateElementId = function () {\n\tOO.ui.elementId++;\n\treturn 'oojsui-' + OO.ui.elementId;\n};\n\n/**\n * Check if an element is focusable.\n * Inspired by :focusable in jQueryUI v1.11.4 - 2015-04-14\n *\n * @param {jQuery} $element Element to test\n * @return {boolean} Element is focusable\n */\nOO.ui.isFocusableElement = function ( $element ) {\n\tvar nodeName,\n\t\telement = $element[ 0 ];\n\n\t// Anything disabled is not focusable\n\tif ( element.disabled ) {\n\t\treturn false;\n\t}\n\n\t// Check if the element is visible\n\tif ( !(\n\t\t// This is quicker than calling $element.is( ':visible' )\n\t\t$.expr.pseudos.visible( element ) &&\n\t\t// Check that all parents are visible\n\t\t!$element.parents().addBack().filter( function () {\n\t\t\treturn $.css( this, 'visibility' ) === 'hidden';\n\t\t} ).length\n\t) ) {\n\t\treturn false;\n\t}\n\n\t// Check if the element is ContentEditable, which is the string 'true'\n\tif ( element.contentEditable === 'true' ) {\n\t\treturn true;\n\t}\n\n\t// Anything with a non-negative numeric tabIndex is focusable.\n\t// Use .prop to avoid browser bugs\n\tif ( $element.prop( 'tabIndex' ) >= 0 ) {\n\t\treturn true;\n\t}\n\n\t// Some element types are naturally focusable\n\t// (indexOf is much faster than regex in Chrome and about the\n\t// same in FF: https://jsperf.com/regex-vs-indexof-array2)\n\tnodeName = element.nodeName.toLowerCase();\n\tif ( [ 'input', 'select', 'textarea', 'button', 'object' ].indexOf( nodeName ) !== -1 ) {\n\t\treturn true;\n\t}\n\n\t// Links and areas are focusable if they have an href\n\tif ( ( nodeName === 'a' || nodeName === 'area' ) && $element.attr( 'href' ) !== undefined ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n/**\n * Find a focusable child\n *\n * @param {jQuery} $container Container to search in\n * @param {boolean} [backwards] Search backwards\n * @return {jQuery} Focusable child, or an empty jQuery object if none found\n */\nOO.ui.findFocusable = function ( $container, backwards ) {\n\tvar $focusable = $( [] ),\n\t\t// $focusableCandidates is a superset of things that\n\t\t// could get matched by isFocusableElement\n\t\t$focusableCandidates = $container\n\t\t\t.find( 'input, select, textarea, button, object, a, area, [contenteditable], [tabindex]' );\n\n\tif ( backwards ) {\n\t\t$focusableCandidates = Array.prototype.reverse.call( $focusableCandidates );\n\t}\n\n\t$focusableCandidates.each( function () {\n\t\tvar $this = $( this );\n\t\tif ( OO.ui.isFocusableElement( $this ) ) {\n\t\t\t$focusable = $this;\n\t\t\treturn false;\n\t\t}\n\t} );\n\treturn $focusable;\n};\n\n/**\n * Get the user's language and any fallback languages.\n *\n * These language codes are used to localize user interface elements in the user's language.\n *\n * In environments that provide a localization system, this function should be overridden to\n * return the user's language(s). The default implementation returns English (en) only.\n *\n * @return {string[]} Language codes, in descending order of priority\n */\nOO.ui.getUserLanguages = function () {\n\treturn [ 'en' ];\n};\n\n/**\n * Get a value in an object keyed by language code.\n *\n * @param {Object.<string,Mixed>} obj Object keyed by language code\n * @param {string|null} [lang] Language code, if omitted or null defaults to any user language\n * @param {string} [fallback] Fallback code, used if no matching language can be found\n * @return {Mixed} Local value\n */\nOO.ui.getLocalValue = function ( obj, lang, fallback ) {\n\tvar i, len, langs;\n\n\t// Requested language\n\tif ( obj[ lang ] ) {\n\t\treturn obj[ lang ];\n\t}\n\t// Known user language\n\tlangs = OO.ui.getUserLanguages();\n\tfor ( i = 0, len = langs.length; i < len; i++ ) {\n\t\tlang = langs[ i ];\n\t\tif ( obj[ lang ] ) {\n\t\t\treturn obj[ lang ];\n\t\t}\n\t}\n\t// Fallback language\n\tif ( obj[ fallback ] ) {\n\t\treturn obj[ fallback ];\n\t}\n\t// First existing language\n\tfor ( lang in obj ) {\n\t\treturn obj[ lang ];\n\t}\n\n\treturn undefined;\n};\n\n/**\n * Check if a node is contained within another node\n *\n * Similar to jQuery#contains except a list of containers can be supplied\n * and a boolean argument allows you to include the container in the match list\n *\n * @param {HTMLElement|HTMLElement[]} containers Container node(s) to search in\n * @param {HTMLElement} contained Node to find\n * @param {boolean} [matchContainers] Include the container(s) in the list of nodes to match, otherwise only match descendants\n * @return {boolean} The node is in the list of target nodes\n */\nOO.ui.contains = function ( containers, contained, matchContainers ) {\n\tvar i;\n\tif ( !Array.isArray( containers ) ) {\n\t\tcontainers = [ containers ];\n\t}\n\tfor ( i = containers.length - 1; i >= 0; i-- ) {\n\t\tif ( ( matchContainers && contained === containers[ i ] ) || $.contains( containers[ i ], contained ) ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/**\n * Return a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n *\n * Ported from: http://underscorejs.org/underscore.js\n *\n * @param {Function} func Function to debounce\n * @param {number} [wait=0] Wait period in milliseconds\n * @param {boolean} [immediate] Trigger on leading edge\n * @return {Function} Debounced function\n */\nOO.ui.debounce = function ( func, wait, immediate ) {\n\tvar timeout;\n\treturn function () {\n\t\tvar context = this,\n\t\t\targs = arguments,\n\t\t\tlater = function () {\n\t\t\t\ttimeout = null;\n\t\t\t\tif ( !immediate ) {\n\t\t\t\t\tfunc.apply( context, args );\n\t\t\t\t}\n\t\t\t};\n\t\tif ( immediate && !timeout ) {\n\t\t\tfunc.apply( context, args );\n\t\t}\n\t\tif ( !timeout || wait ) {\n\t\t\tclearTimeout( timeout );\n\t\t\ttimeout = setTimeout( later, wait );\n\t\t}\n\t};\n};\n\n/**\n * Puts a console warning with provided message.\n *\n * @param {string} message Message\n */\nOO.ui.warnDeprecation = function ( message ) {\n\tif ( OO.getProp( window, 'console', 'warn' ) !== undefined ) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn( message );\n\t}\n};\n\n/**\n * Returns a function, that, when invoked, will only be triggered at most once\n * during a given window of time. If called again during that window, it will\n * wait until the window ends and then trigger itself again.\n *\n * As it's not knowable to the caller whether the function will actually run\n * when the wrapper is called, return values from the function are entirely\n * discarded.\n *\n * @param {Function} func Function to throttle\n * @param {number} wait Throttle window length, in milliseconds\n * @return {Function} Throttled function\n */\nOO.ui.throttle = function ( func, wait ) {\n\tvar context, args, timeout,\n\t\tprevious = 0,\n\t\trun = function () {\n\t\t\ttimeout = null;\n\t\t\tprevious = OO.ui.now();\n\t\t\tfunc.apply( context, args );\n\t\t};\n\treturn function () {\n\t\t// Check how long it's been since the last time the function was\n\t\t// called, and whether it's more or less than the requested throttle\n\t\t// period. If it's less, run the function immediately. If it's more,\n\t\t// set a timeout for the remaining time -- but don't replace an\n\t\t// existing timeout, since that'd indefinitely prolong the wait.\n\t\tvar remaining = wait - ( OO.ui.now() - previous );\n\t\tcontext = this;\n\t\targs = arguments;\n\t\tif ( remaining <= 0 ) {\n\t\t\t// Note: unless wait was ridiculously large, this means we'll\n\t\t\t// automatically run the first time the function was called in a\n\t\t\t// given period. (If you provide a wait period larger than the\n\t\t\t// current Unix timestamp, you *deserve* unexpected behavior.)\n\t\t\tclearTimeout( timeout );\n\t\t\trun();\n\t\t} else if ( !timeout ) {\n\t\t\ttimeout = setTimeout( run, remaining );\n\t\t}\n\t};\n};\n\n/**\n * A (possibly faster) way to get the current timestamp as an integer\n *\n * @return {number} Current timestamp, in milliseconds since the Unix epoch\n */\nOO.ui.now = Date.now || function () {\n\treturn new Date().getTime();\n};\n\n/**\n * Reconstitute a JavaScript object corresponding to a widget created by\n * the PHP implementation.\n *\n * This is an alias for `OO.ui.Element.static.infuse()`.\n *\n * @param {string|HTMLElement|jQuery} idOrNode\n *   A DOM id (if a string) or node for the widget to infuse.\n * @return {OO.ui.Element}\n *   The `OO.ui.Element` corresponding to this (infusable) document node.\n */\nOO.ui.infuse = function ( idOrNode ) {\n\treturn OO.ui.Element.static.infuse( idOrNode );\n};\n\n( function () {\n\t/**\n\t * Message store for the default implementation of OO.ui.msg\n\t *\n\t * Environments that provide a localization system should not use this, but should override\n\t * OO.ui.msg altogether.\n\t *\n\t * @private\n\t */\n\tvar messages = {\n\t\t// Tool tip for a button that moves items in a list down one place\n\t\t'ooui-outline-control-move-down': 'Move item down',\n\t\t// Tool tip for a button that moves items in a list up one place\n\t\t'ooui-outline-control-move-up': 'Move item up',\n\t\t// Tool tip for a button that removes items from a list\n\t\t'ooui-outline-control-remove': 'Remove item',\n\t\t// Label for the toolbar group that contains a list of all other available tools\n\t\t'ooui-toolbar-more': 'More',\n\t\t// Label for the fake tool that expands the full list of tools in a toolbar group\n\t\t'ooui-toolgroup-expand': 'More',\n\t\t// Label for the fake tool that collapses the full list of tools in a toolbar group\n\t\t'ooui-toolgroup-collapse': 'Fewer',\n\t\t// Default label for the accept button of a confirmation dialog\n\t\t'ooui-dialog-message-accept': 'OK',\n\t\t// Default label for the reject button of a confirmation dialog\n\t\t'ooui-dialog-message-reject': 'Cancel',\n\t\t// Title for process dialog error description\n\t\t'ooui-dialog-process-error': 'Something went wrong',\n\t\t// Label for process dialog dismiss error button, visible when describing errors\n\t\t'ooui-dialog-process-dismiss': 'Dismiss',\n\t\t// Label for process dialog retry action button, visible when describing only recoverable errors\n\t\t'ooui-dialog-process-retry': 'Try again',\n\t\t// Label for process dialog retry action button, visible when describing only warnings\n\t\t'ooui-dialog-process-continue': 'Continue',\n\t\t// Label for the file selection widget's select file button\n\t\t'ooui-selectfile-button-select': 'Select a file',\n\t\t// Label for the file selection widget if file selection is not supported\n\t\t'ooui-selectfile-not-supported': 'File selection is not supported',\n\t\t// Label for the file selection widget when no file is currently selected\n\t\t'ooui-selectfile-placeholder': 'No file is selected',\n\t\t// Label for the file selection widget's drop target\n\t\t'ooui-selectfile-dragdrop-placeholder': 'Drop file here'\n\t};\n\n\t/**\n\t * Get a localized message.\n\t *\n\t * After the message key, message parameters may optionally be passed. In the default implementation,\n\t * any occurrences of $1 are replaced with the first parameter, $2 with the second parameter, etc.\n\t * Alternative implementations of OO.ui.msg may use any substitution system they like, as long as\n\t * they support unnamed, ordered message parameters.\n\t *\n\t * In environments that provide a localization system, this function should be overridden to\n\t * return the message translated in the user's language. The default implementation always returns\n\t * English messages. An example of doing this with [jQuery.i18n](https://github.com/wikimedia/jquery.i18n)\n\t * follows.\n\t *\n\t *     @example\n\t *     var i, iLen, button,\n\t *         messagePath = 'oojs-ui/dist/i18n/',\n\t *         languages = [ $.i18n().locale, 'ur', 'en' ],\n\t *         languageMap = {};\n\t *\n\t *     for ( i = 0, iLen = languages.length; i < iLen; i++ ) {\n\t *         languageMap[ languages[ i ] ] = messagePath + languages[ i ].toLowerCase() + '.json';\n\t *     }\n\t *\n\t *     $.i18n().load( languageMap ).done( function() {\n\t *         // Replace the built-in `msg` only once we've loaded the internationalization.\n\t *         // OOjs UI uses `OO.ui.deferMsg` for all initially-loaded messages. So long as\n\t *         // you put off creating any widgets until this promise is complete, no English\n\t *         // will be displayed.\n\t *         OO.ui.msg = $.i18n;\n\t *\n\t *         // A button displaying \"OK\" in the default locale\n\t *         button = new OO.ui.ButtonWidget( {\n\t *             label: OO.ui.msg( 'ooui-dialog-message-accept' ),\n\t *             icon: 'check'\n\t *         } );\n\t *         $( 'body' ).append( button.$element );\n\t *\n\t *         // A button displaying \"OK\" in Urdu\n\t *         $.i18n().locale = 'ur';\n\t *         button = new OO.ui.ButtonWidget( {\n\t *             label: OO.ui.msg( 'ooui-dialog-message-accept' ),\n\t *             icon: 'check'\n\t *         } );\n\t *         $( 'body' ).append( button.$element );\n\t *     } );\n\t *\n\t * @param {string} key Message key\n\t * @param {...Mixed} [params] Message parameters\n\t * @return {string} Translated message with parameters substituted\n\t */\n\tOO.ui.msg = function ( key ) {\n\t\tvar message = messages[ key ],\n\t\t\tparams = Array.prototype.slice.call( arguments, 1 );\n\t\tif ( typeof message === 'string' ) {\n\t\t\t// Perform $1 substitution\n\t\t\tmessage = message.replace( /\\$(\\d+)/g, function ( unused, n ) {\n\t\t\t\tvar i = parseInt( n, 10 );\n\t\t\t\treturn params[ i - 1 ] !== undefined ? params[ i - 1 ] : '$' + n;\n\t\t\t} );\n\t\t} else {\n\t\t\t// Return placeholder if message not found\n\t\t\tmessage = '[' + key + ']';\n\t\t}\n\t\treturn message;\n\t};\n}() );\n\n/**\n * Package a message and arguments for deferred resolution.\n *\n * Use this when you are statically specifying a message and the message may not yet be present.\n *\n * @param {string} key Message key\n * @param {...Mixed} [params] Message parameters\n * @return {Function} Function that returns the resolved message when executed\n */\nOO.ui.deferMsg = function () {\n\tvar args = arguments;\n\treturn function () {\n\t\treturn OO.ui.msg.apply( OO.ui, args );\n\t};\n};\n\n/**\n * Resolve a message.\n *\n * If the message is a function it will be executed, otherwise it will pass through directly.\n *\n * @param {Function|string} msg Deferred message, or message text\n * @return {string} Resolved message\n */\nOO.ui.resolveMsg = function ( msg ) {\n\tif ( $.isFunction( msg ) ) {\n\t\treturn msg();\n\t}\n\treturn msg;\n};\n\n/**\n * @param {string} url\n * @return {boolean}\n */\nOO.ui.isSafeUrl = function ( url ) {\n\t// Keep this function in sync with php/Tag.php\n\tvar i, protocolWhitelist;\n\n\tfunction stringStartsWith( haystack, needle ) {\n\t\treturn haystack.substr( 0, needle.length ) === needle;\n\t}\n\n\tprotocolWhitelist = [\n\t\t'bitcoin', 'ftp', 'ftps', 'geo', 'git', 'gopher', 'http', 'https', 'irc', 'ircs',\n\t\t'magnet', 'mailto', 'mms', 'news', 'nntp', 'redis', 'sftp', 'sip', 'sips', 'sms', 'ssh',\n\t\t'svn', 'tel', 'telnet', 'urn', 'worldwind', 'xmpp'\n\t];\n\n\tif ( url === '' ) {\n\t\treturn true;\n\t}\n\n\tfor ( i = 0; i < protocolWhitelist.length; i++ ) {\n\t\tif ( stringStartsWith( url, protocolWhitelist[ i ] + ':' ) ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// This matches '//' too\n\tif ( stringStartsWith( url, '/' ) || stringStartsWith( url, './' ) ) {\n\t\treturn true;\n\t}\n\tif ( stringStartsWith( url, '?' ) || stringStartsWith( url, '#' ) ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n/**\n * Check if the user has a 'mobile' device.\n *\n * For our purposes this means the user is primarily using an\n * on-screen keyboard, touch input instead of a mouse and may\n * have a physically small display.\n *\n * It is left up to implementors to decide how to compute this\n * so the default implementation always returns false.\n *\n * @return {boolean} Use is on a mobile device\n */\nOO.ui.isMobile = function () {\n\treturn false;\n};\n","/*!\n * Mixin namespace.\n */\n\n/**\n * Namespace for OOjs UI mixins.\n *\n * Mixins are named according to the type of object they are intended to\n * be mixed in to.  For example, OO.ui.mixin.GroupElement is intended to be\n * mixed in to an instance of OO.ui.Element, and OO.ui.mixin.GroupWidget\n * is intended to be mixed in to an instance of OO.ui.Widget.\n *\n * @class\n * @singleton\n */\nOO.ui.mixin = {};\n","/**\n * Each Element represents a rendering in the DOM—a button or an icon, for example, or anything\n * that is visible to a user. Unlike {@link OO.ui.Widget widgets}, plain elements usually do not have events\n * connected to them and can't be interacted with.\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string[]} [classes] The names of the CSS classes to apply to the element. CSS styles are added\n *  to the top level (e.g., the outermost div) of the element. See the [OOjs UI documentation on MediaWiki][2]\n *  for an example.\n *  [2]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Buttons_and_Switches#cssExample\n * @cfg {string} [id] The HTML id attribute used in the rendered tag.\n * @cfg {string} [text] Text to insert\n * @cfg {Array} [content] An array of content elements to append (after #text).\n *  Strings will be html-escaped; use an OO.ui.HtmlSnippet to append raw HTML.\n *  Instances of OO.ui.Element will have their $element appended.\n * @cfg {jQuery} [$content] Content elements to append (after #text).\n * @cfg {jQuery} [$element] Wrapper element. Defaults to a new element with #getTagName.\n * @cfg {Mixed} [data] Custom data of any type or combination of types (e.g., string, number, array, object).\n *  Data can also be specified with the #setData method.\n */\nOO.ui.Element = function OoUiElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.$ = $;\n\tthis.elementId = null;\n\tthis.visible = true;\n\tthis.data = config.data;\n\tthis.$element = config.$element ||\n\t\t$( document.createElement( this.getTagName() ) );\n\tthis.elementGroup = null;\n\n\t// Initialization\n\tif ( Array.isArray( config.classes ) ) {\n\t\tthis.$element.addClass( config.classes.join( ' ' ) );\n\t}\n\tif ( config.id ) {\n\t\tthis.setElementId( config.id );\n\t}\n\tif ( config.text ) {\n\t\tthis.$element.text( config.text );\n\t}\n\tif ( config.content ) {\n\t\t// The `content` property treats plain strings as text; use an\n\t\t// HtmlSnippet to append HTML content.  `OO.ui.Element`s get their\n\t\t// appropriate $element appended.\n\t\tthis.$element.append( config.content.map( function ( v ) {\n\t\t\tif ( typeof v === 'string' ) {\n\t\t\t\t// Escape string so it is properly represented in HTML.\n\t\t\t\treturn document.createTextNode( v );\n\t\t\t} else if ( v instanceof OO.ui.HtmlSnippet ) {\n\t\t\t\t// Bypass escaping.\n\t\t\t\treturn v.toString();\n\t\t\t} else if ( v instanceof OO.ui.Element ) {\n\t\t\t\treturn v.$element;\n\t\t\t}\n\t\t\treturn v;\n\t\t} ) );\n\t}\n\tif ( config.$content ) {\n\t\t// The `$content` property treats plain strings as HTML.\n\t\tthis.$element.append( config.$content );\n\t}\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.Element );\n\n/* Static Properties */\n\n/**\n * The name of the HTML tag used by the element.\n *\n * The static value may be ignored if the #getTagName method is overridden.\n *\n * @static\n * @inheritable\n * @property {string}\n */\nOO.ui.Element.static.tagName = 'div';\n\n/* Static Methods */\n\n/**\n * Reconstitute a JavaScript object corresponding to a widget created\n * by the PHP implementation.\n *\n * @param {string|HTMLElement|jQuery} idOrNode\n *   A DOM id (if a string) or node for the widget to infuse.\n * @return {OO.ui.Element}\n *   The `OO.ui.Element` corresponding to this (infusable) document node.\n *   For `Tag` objects emitted on the HTML side (used occasionally for content)\n *   the value returned is a newly-created Element wrapping around the existing\n *   DOM node.\n */\nOO.ui.Element.static.infuse = function ( idOrNode ) {\n\tvar obj = OO.ui.Element.static.unsafeInfuse( idOrNode, false );\n\t// Verify that the type matches up.\n\t// FIXME: uncomment after T89721 is fixed (see T90929)\n\t/*\n\tif ( !( obj instanceof this['class'] ) ) {\n\t\tthrow new Error( 'Infusion type mismatch!' );\n\t}\n\t*/\n\treturn obj;\n};\n\n/**\n * Implementation helper for `infuse`; skips the type check and has an\n * extra property so that only the top-level invocation touches the DOM.\n *\n * @private\n * @param {string|HTMLElement|jQuery} idOrNode\n * @param {jQuery.Promise|boolean} domPromise A promise that will be resolved\n *     when the top-level widget of this infusion is inserted into DOM,\n *     replacing the original node; or false for top-level invocation.\n * @return {OO.ui.Element}\n */\nOO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {\n\t// look for a cached result of a previous infusion.\n\tvar id, $elem, data, cls, parts, parent, obj, top, state, infusedChildren;\n\tif ( typeof idOrNode === 'string' ) {\n\t\tid = idOrNode;\n\t\t$elem = $( document.getElementById( id ) );\n\t} else {\n\t\t$elem = $( idOrNode );\n\t\tid = $elem.attr( 'id' );\n\t}\n\tif ( !$elem.length ) {\n\t\tthrow new Error( 'Widget not found: ' + id );\n\t}\n\tif ( $elem[ 0 ].oouiInfused ) {\n\t\t$elem = $elem[ 0 ].oouiInfused;\n\t}\n\tdata = $elem.data( 'ooui-infused' );\n\tif ( data ) {\n\t\t// cached!\n\t\tif ( data === true ) {\n\t\t\tthrow new Error( 'Circular dependency! ' + id );\n\t\t}\n\t\tif ( domPromise ) {\n\t\t\t// pick up dynamic state, like focus, value of form inputs, scroll position, etc.\n\t\t\tstate = data.constructor.static.gatherPreInfuseState( $elem, data );\n\t\t\t// restore dynamic state after the new element is re-inserted into DOM under infused parent\n\t\t\tdomPromise.done( data.restorePreInfuseState.bind( data, state ) );\n\t\t\tinfusedChildren = $elem.data( 'ooui-infused-children' );\n\t\t\tif ( infusedChildren && infusedChildren.length ) {\n\t\t\t\tinfusedChildren.forEach( function ( data ) {\n\t\t\t\t\tvar state = data.constructor.static.gatherPreInfuseState( $elem, data );\n\t\t\t\t\tdomPromise.done( data.restorePreInfuseState.bind( data, state ) );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\treturn data;\n\t}\n\tdata = $elem.attr( 'data-ooui' );\n\tif ( !data ) {\n\t\tthrow new Error( 'No infusion data found: ' + id );\n\t}\n\ttry {\n\t\tdata = JSON.parse( data );\n\t} catch ( _ ) {\n\t\tdata = null;\n\t}\n\tif ( !( data && data._ ) ) {\n\t\tthrow new Error( 'No valid infusion data found: ' + id );\n\t}\n\tif ( data._ === 'Tag' ) {\n\t\t// Special case: this is a raw Tag; wrap existing node, don't rebuild.\n\t\treturn new OO.ui.Element( { $element: $elem } );\n\t}\n\tparts = data._.split( '.' );\n\tcls = OO.getProp.apply( OO, [ window ].concat( parts ) );\n\tif ( cls === undefined ) {\n\t\t// The PHP output might be old and not including the \"OO.ui\" prefix\n\t\t// TODO: Remove this back-compat after next major release\n\t\tcls = OO.getProp.apply( OO, [ OO.ui ].concat( parts ) );\n\t\tif ( cls === undefined ) {\n\t\t\tthrow new Error( 'Unknown widget type: id: ' + id + ', class: ' + data._ );\n\t\t}\n\t}\n\n\t// Verify that we're creating an OO.ui.Element instance\n\tparent = cls.parent;\n\n\twhile ( parent !== undefined ) {\n\t\tif ( parent === OO.ui.Element ) {\n\t\t\t// Safe\n\t\t\tbreak;\n\t\t}\n\n\t\tparent = parent.parent;\n\t}\n\n\tif ( parent !== OO.ui.Element ) {\n\t\tthrow new Error( 'Unknown widget type: id: ' + id + ', class: ' + data._ );\n\t}\n\n\tif ( domPromise === false ) {\n\t\ttop = $.Deferred();\n\t\tdomPromise = top.promise();\n\t}\n\t$elem.data( 'ooui-infused', true ); // prevent loops\n\tdata.id = id; // implicit\n\tinfusedChildren = [];\n\tdata = OO.copy( data, null, function deserialize( value ) {\n\t\tvar infused;\n\t\tif ( OO.isPlainObject( value ) ) {\n\t\t\tif ( value.tag ) {\n\t\t\t\tinfused = OO.ui.Element.static.unsafeInfuse( value.tag, domPromise );\n\t\t\t\tinfusedChildren.push( infused );\n\t\t\t\t// Flatten the structure\n\t\t\t\tinfusedChildren.push.apply( infusedChildren, infused.$element.data( 'ooui-infused-children' ) || [] );\n\t\t\t\tinfused.$element.removeData( 'ooui-infused-children' );\n\t\t\t\treturn infused;\n\t\t\t}\n\t\t\tif ( value.html !== undefined ) {\n\t\t\t\treturn new OO.ui.HtmlSnippet( value.html );\n\t\t\t}\n\t\t}\n\t} );\n\t// allow widgets to reuse parts of the DOM\n\tdata = cls.static.reusePreInfuseDOM( $elem[ 0 ], data );\n\t// pick up dynamic state, like focus, value of form inputs, scroll position, etc.\n\tstate = cls.static.gatherPreInfuseState( $elem[ 0 ], data );\n\t// rebuild widget\n\t// eslint-disable-next-line new-cap\n\tobj = new cls( data );\n\t// now replace old DOM with this new DOM.\n\tif ( top ) {\n\t\t// An efficient constructor might be able to reuse the entire DOM tree of the original element,\n\t\t// so only mutate the DOM if we need to.\n\t\tif ( $elem[ 0 ] !== obj.$element[ 0 ] ) {\n\t\t\t$elem.replaceWith( obj.$element );\n\t\t\t// This element is now gone from the DOM, but if anyone is holding a reference to it,\n\t\t\t// let's allow them to OO.ui.infuse() it and do what they expect (T105828).\n\t\t\t// Do not use jQuery.data(), as using it on detached nodes leaks memory in 1.x line by design.\n\t\t\t$elem[ 0 ].oouiInfused = obj.$element;\n\t\t}\n\t\ttop.resolve();\n\t}\n\tobj.$element.data( 'ooui-infused', obj );\n\tobj.$element.data( 'ooui-infused-children', infusedChildren );\n\t// set the 'data-ooui' attribute so we can identify infused widgets\n\tobj.$element.attr( 'data-ooui', '' );\n\t// restore dynamic state after the new element is inserted into DOM\n\tdomPromise.done( obj.restorePreInfuseState.bind( obj, state ) );\n\treturn obj;\n};\n\n/**\n * Pick out parts of `node`'s DOM to be reused when infusing a widget.\n *\n * This method **must not** make any changes to the DOM, only find interesting pieces and add them\n * to `config` (which should then be returned). Actual DOM juggling should then be done by the\n * constructor, which will be given the enhanced config.\n *\n * @protected\n * @param {HTMLElement} node\n * @param {Object} config\n * @return {Object}\n */\nOO.ui.Element.static.reusePreInfuseDOM = function ( node, config ) {\n\treturn config;\n};\n\n/**\n * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of an HTML DOM node\n * (and its children) that represent an Element of the same class and the given configuration,\n * generated by the PHP implementation.\n *\n * This method is called just before `node` is detached from the DOM. The return value of this\n * function will be passed to #restorePreInfuseState after the newly created widget's #$element\n * is inserted into DOM to replace `node`.\n *\n * @protected\n * @param {HTMLElement} node\n * @param {Object} config\n * @return {Object}\n */\nOO.ui.Element.static.gatherPreInfuseState = function () {\n\treturn {};\n};\n\n/**\n * Get a jQuery function within a specific document.\n *\n * @static\n * @param {jQuery|HTMLElement|HTMLDocument|Window} context Context to bind the function to\n * @param {jQuery} [$iframe] HTML iframe element that contains the document, omit if document is\n *   not in an iframe\n * @return {Function} Bound jQuery function\n */\nOO.ui.Element.static.getJQuery = function ( context, $iframe ) {\n\tfunction wrapper( selector ) {\n\t\treturn $( selector, wrapper.context );\n\t}\n\n\twrapper.context = this.getDocument( context );\n\n\tif ( $iframe ) {\n\t\twrapper.$iframe = $iframe;\n\t}\n\n\treturn wrapper;\n};\n\n/**\n * Get the document of an element.\n *\n * @static\n * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Object to get the document for\n * @return {HTMLDocument|null} Document object\n */\nOO.ui.Element.static.getDocument = function ( obj ) {\n\t// jQuery - selections created \"offscreen\" won't have a context, so .context isn't reliable\n\treturn ( obj[ 0 ] && obj[ 0 ].ownerDocument ) ||\n\t\t// Empty jQuery selections might have a context\n\t\tobj.context ||\n\t\t// HTMLElement\n\t\tobj.ownerDocument ||\n\t\t// Window\n\t\tobj.document ||\n\t\t// HTMLDocument\n\t\t( obj.nodeType === Node.DOCUMENT_NODE && obj ) ||\n\t\tnull;\n};\n\n/**\n * Get the window of an element or document.\n *\n * @static\n * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Context to get the window for\n * @return {Window} Window object\n */\nOO.ui.Element.static.getWindow = function ( obj ) {\n\tvar doc = this.getDocument( obj );\n\treturn doc.defaultView;\n};\n\n/**\n * Get the direction of an element or document.\n *\n * @static\n * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Context to get the direction for\n * @return {string} Text direction, either 'ltr' or 'rtl'\n */\nOO.ui.Element.static.getDir = function ( obj ) {\n\tvar isDoc, isWin;\n\n\tif ( obj instanceof jQuery ) {\n\t\tobj = obj[ 0 ];\n\t}\n\tisDoc = obj.nodeType === Node.DOCUMENT_NODE;\n\tisWin = obj.document !== undefined;\n\tif ( isDoc || isWin ) {\n\t\tif ( isWin ) {\n\t\t\tobj = obj.document;\n\t\t}\n\t\tobj = obj.body;\n\t}\n\treturn $( obj ).css( 'direction' );\n};\n\n/**\n * Get the offset between two frames.\n *\n * TODO: Make this function not use recursion.\n *\n * @static\n * @param {Window} from Window of the child frame\n * @param {Window} [to=window] Window of the parent frame\n * @param {Object} [offset] Offset to start with, used internally\n * @return {Object} Offset object, containing left and top properties\n */\nOO.ui.Element.static.getFrameOffset = function ( from, to, offset ) {\n\tvar i, len, frames, frame, rect;\n\n\tif ( !to ) {\n\t\tto = window;\n\t}\n\tif ( !offset ) {\n\t\toffset = { top: 0, left: 0 };\n\t}\n\tif ( from.parent === from ) {\n\t\treturn offset;\n\t}\n\n\t// Get iframe element\n\tframes = from.parent.document.getElementsByTagName( 'iframe' );\n\tfor ( i = 0, len = frames.length; i < len; i++ ) {\n\t\tif ( frames[ i ].contentWindow === from ) {\n\t\t\tframe = frames[ i ];\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Recursively accumulate offset values\n\tif ( frame ) {\n\t\trect = frame.getBoundingClientRect();\n\t\toffset.left += rect.left;\n\t\toffset.top += rect.top;\n\t\tif ( from !== to ) {\n\t\t\tthis.getFrameOffset( from.parent, offset );\n\t\t}\n\t}\n\treturn offset;\n};\n\n/**\n * Get the offset between two elements.\n *\n * The two elements may be in a different frame, but in that case the frame $element is in must\n * be contained in the frame $anchor is in.\n *\n * @static\n * @param {jQuery} $element Element whose position to get\n * @param {jQuery} $anchor Element to get $element's position relative to\n * @return {Object} Translated position coordinates, containing top and left properties\n */\nOO.ui.Element.static.getRelativePosition = function ( $element, $anchor ) {\n\tvar iframe, iframePos,\n\t\tpos = $element.offset(),\n\t\tanchorPos = $anchor.offset(),\n\t\telementDocument = this.getDocument( $element ),\n\t\tanchorDocument = this.getDocument( $anchor );\n\n\t// If $element isn't in the same document as $anchor, traverse up\n\twhile ( elementDocument !== anchorDocument ) {\n\t\tiframe = elementDocument.defaultView.frameElement;\n\t\tif ( !iframe ) {\n\t\t\tthrow new Error( '$element frame is not contained in $anchor frame' );\n\t\t}\n\t\tiframePos = $( iframe ).offset();\n\t\tpos.left += iframePos.left;\n\t\tpos.top += iframePos.top;\n\t\telementDocument = iframe.ownerDocument;\n\t}\n\tpos.left -= anchorPos.left;\n\tpos.top -= anchorPos.top;\n\treturn pos;\n};\n\n/**\n * Get element border sizes.\n *\n * @static\n * @param {HTMLElement} el Element to measure\n * @return {Object} Dimensions object with `top`, `left`, `bottom` and `right` properties\n */\nOO.ui.Element.static.getBorders = function ( el ) {\n\tvar doc = el.ownerDocument,\n\t\twin = doc.defaultView,\n\t\tstyle = win.getComputedStyle( el, null ),\n\t\t$el = $( el ),\n\t\ttop = parseFloat( style ? style.borderTopWidth : $el.css( 'borderTopWidth' ) ) || 0,\n\t\tleft = parseFloat( style ? style.borderLeftWidth : $el.css( 'borderLeftWidth' ) ) || 0,\n\t\tbottom = parseFloat( style ? style.borderBottomWidth : $el.css( 'borderBottomWidth' ) ) || 0,\n\t\tright = parseFloat( style ? style.borderRightWidth : $el.css( 'borderRightWidth' ) ) || 0;\n\n\treturn {\n\t\ttop: top,\n\t\tleft: left,\n\t\tbottom: bottom,\n\t\tright: right\n\t};\n};\n\n/**\n * Get dimensions of an element or window.\n *\n * @static\n * @param {HTMLElement|Window} el Element to measure\n * @return {Object} Dimensions object with `borders`, `scroll`, `scrollbar` and `rect` properties\n */\nOO.ui.Element.static.getDimensions = function ( el ) {\n\tvar $el, $win,\n\t\tdoc = el.ownerDocument || el.document,\n\t\twin = doc.defaultView;\n\n\tif ( win === el || el === doc.documentElement ) {\n\t\t$win = $( win );\n\t\treturn {\n\t\t\tborders: { top: 0, left: 0, bottom: 0, right: 0 },\n\t\t\tscroll: {\n\t\t\t\ttop: $win.scrollTop(),\n\t\t\t\tleft: $win.scrollLeft()\n\t\t\t},\n\t\t\tscrollbar: { right: 0, bottom: 0 },\n\t\t\trect: {\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tbottom: $win.innerHeight(),\n\t\t\t\tright: $win.innerWidth()\n\t\t\t}\n\t\t};\n\t} else {\n\t\t$el = $( el );\n\t\treturn {\n\t\t\tborders: this.getBorders( el ),\n\t\t\tscroll: {\n\t\t\t\ttop: $el.scrollTop(),\n\t\t\t\tleft: $el.scrollLeft()\n\t\t\t},\n\t\t\tscrollbar: {\n\t\t\t\tright: $el.innerWidth() - el.clientWidth,\n\t\t\t\tbottom: $el.innerHeight() - el.clientHeight\n\t\t\t},\n\t\t\trect: el.getBoundingClientRect()\n\t\t};\n\t}\n};\n\n/**\n * Get the number of pixels that an element's content is scrolled to the left.\n *\n * Adapted from <https://github.com/othree/jquery.rtl-scroll-type>.\n * Original code copyright 2012 Wei-Ko Kao, licensed under the MIT License.\n *\n * This function smooths out browser inconsistencies (nicely described in the README at\n * <https://github.com/othree/jquery.rtl-scroll-type>) and produces a result consistent\n * with Firefox's 'scrollLeft', which seems the sanest.\n *\n * @static\n * @method\n * @param {HTMLElement|Window} el Element to measure\n * @return {number} Scroll position from the left.\n *  If the element's direction is LTR, this is a positive number between `0` (initial scroll position)\n *  and `el.scrollWidth - el.clientWidth` (furthest possible scroll position).\n *  If the element's direction is RTL, this is a negative number between `0` (initial scroll position)\n *  and `-el.scrollWidth + el.clientWidth` (furthest possible scroll position).\n */\nOO.ui.Element.static.getScrollLeft = ( function () {\n\tvar rtlScrollType = null;\n\n\tfunction test() {\n\t\tvar $definer = $( '<div dir=\"rtl\" style=\"font-size: 14px; width: 1px; height: 1px; position: absolute; top: -1000px; overflow: scroll\">A</div>' ),\n\t\t\tdefiner = $definer[ 0 ];\n\n\t\t$definer.appendTo( 'body' );\n\t\tif ( definer.scrollLeft > 0 ) {\n\t\t\t// Safari, Chrome\n\t\t\trtlScrollType = 'default';\n\t\t} else {\n\t\t\tdefiner.scrollLeft = 1;\n\t\t\tif ( definer.scrollLeft === 0 ) {\n\t\t\t\t// Firefox, old Opera\n\t\t\t\trtlScrollType = 'negative';\n\t\t\t} else {\n\t\t\t\t// Internet Explorer, Edge\n\t\t\t\trtlScrollType = 'reverse';\n\t\t\t}\n\t\t}\n\t\t$definer.remove();\n\t}\n\n\treturn function getScrollLeft( el ) {\n\t\tvar isRoot = el.window === el ||\n\t\t\t\tel === el.ownerDocument.body ||\n\t\t\t\tel === el.ownerDocument.documentElement,\n\t\t\tscrollLeft = isRoot ? $( window ).scrollLeft() : el.scrollLeft,\n\t\t\t// All browsers use the correct scroll type ('negative') on the root, so don't\n\t\t\t// do any fixups when looking at the root element\n\t\t\tdirection = isRoot ? 'ltr' : $( el ).css( 'direction' );\n\n\t\tif ( direction === 'rtl' ) {\n\t\t\tif ( rtlScrollType === null ) {\n\t\t\t\ttest();\n\t\t\t}\n\t\t\tif ( rtlScrollType === 'reverse' ) {\n\t\t\t\tscrollLeft = -scrollLeft;\n\t\t\t} else if ( rtlScrollType === 'default' ) {\n\t\t\t\tscrollLeft = scrollLeft - el.scrollWidth + el.clientWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn scrollLeft;\n\t};\n}() );\n\n/**\n * Get the root scrollable element of given element's document.\n *\n * On Blink-based browsers (Chrome etc.), `document.documentElement` can't be used to get or set\n * the scrollTop property; instead we have to use `document.body`. Changing and testing the value\n * lets us use 'body' or 'documentElement' based on what is working.\n *\n * https://code.google.com/p/chromium/issues/detail?id=303131\n *\n * @static\n * @param {HTMLElement} el Element to find root scrollable parent for\n * @return {HTMLElement} Scrollable parent, `document.body` or `document.documentElement`\n *     depending on browser\n */\nOO.ui.Element.static.getRootScrollableElement = function ( el ) {\n\tvar scrollTop, body;\n\n\tif ( OO.ui.scrollableElement === undefined ) {\n\t\tbody = el.ownerDocument.body;\n\t\tscrollTop = body.scrollTop;\n\t\tbody.scrollTop = 1;\n\n\t\tif ( body.scrollTop === 1 ) {\n\t\t\tbody.scrollTop = scrollTop;\n\t\t\tOO.ui.scrollableElement = 'body';\n\t\t} else {\n\t\t\tOO.ui.scrollableElement = 'documentElement';\n\t\t}\n\t}\n\n\treturn el.ownerDocument[ OO.ui.scrollableElement ];\n};\n\n/**\n * Get closest scrollable container.\n *\n * Traverses up until either a scrollable element or the root is reached, in which case the root\n * scrollable element will be returned (see #getRootScrollableElement).\n *\n * @static\n * @param {HTMLElement} el Element to find scrollable container for\n * @param {string} [dimension] Dimension of scrolling to look for; `x`, `y` or omit for either\n * @return {HTMLElement} Closest scrollable container\n */\nOO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension ) {\n\tvar i, val,\n\t\t// Browsers do not correctly return the computed value of 'overflow' when 'overflow-x' and\n\t\t// 'overflow-y' have different values, so we need to check the separate properties.\n\t\tprops = [ 'overflow-x', 'overflow-y' ],\n\t\t$parent = $( el ).parent();\n\n\tif ( dimension === 'x' || dimension === 'y' ) {\n\t\tprops = [ 'overflow-' + dimension ];\n\t}\n\n\t// Special case for the document root (which doesn't really have any scrollable container, since\n\t// it is the ultimate scrollable container, but this is probably saner than null or exception)\n\tif ( $( el ).is( 'html, body' ) ) {\n\t\treturn this.getRootScrollableElement( el );\n\t}\n\n\twhile ( $parent.length ) {\n\t\tif ( $parent[ 0 ] === this.getRootScrollableElement( el ) ) {\n\t\t\treturn $parent[ 0 ];\n\t\t}\n\t\ti = props.length;\n\t\twhile ( i-- ) {\n\t\t\tval = $parent.css( props[ i ] );\n\t\t\t// We assume that elements with 'overflow' (in any direction) set to 'hidden' will never be\n\t\t\t// scrolled in that direction, but they can actually be scrolled programatically. The user can\n\t\t\t// unintentionally perform a scroll in such case even if the application doesn't scroll\n\t\t\t// programatically, e.g. when jumping to an anchor, or when using built-in find functionality.\n\t\t\t// This could cause funny issues...\n\t\t\tif ( val === 'auto' || val === 'scroll' ) {\n\t\t\t\treturn $parent[ 0 ];\n\t\t\t}\n\t\t}\n\t\t$parent = $parent.parent();\n\t}\n\t// The element is unattached... return something mostly sane\n\treturn this.getRootScrollableElement( el );\n};\n\n/**\n * Scroll element into view.\n *\n * @static\n * @param {HTMLElement} el Element to scroll into view\n * @param {Object} [config] Configuration options\n * @param {string} [config.duration='fast'] jQuery animation duration value\n * @param {string} [config.direction] Scroll in only one direction, e.g. 'x' or 'y', omit\n *  to scroll in both directions\n * @return {jQuery.Promise} Promise which resolves when the scroll is complete\n */\nOO.ui.Element.static.scrollIntoView = function ( el, config ) {\n\tvar position, animations, container, $container, elementDimensions, containerDimensions, $window,\n\t\tdeferred = $.Deferred();\n\n\t// Configuration initialization\n\tconfig = config || {};\n\n\tanimations = {};\n\tcontainer = this.getClosestScrollableContainer( el, config.direction );\n\t$container = $( container );\n\telementDimensions = this.getDimensions( el );\n\tcontainerDimensions = this.getDimensions( container );\n\t$window = $( this.getWindow( el ) );\n\n\t// Compute the element's position relative to the container\n\tif ( $container.is( 'html, body' ) ) {\n\t\t// If the scrollable container is the root, this is easy\n\t\tposition = {\n\t\t\ttop: elementDimensions.rect.top,\n\t\t\tbottom: $window.innerHeight() - elementDimensions.rect.bottom,\n\t\t\tleft: elementDimensions.rect.left,\n\t\t\tright: $window.innerWidth() - elementDimensions.rect.right\n\t\t};\n\t} else {\n\t\t// Otherwise, we have to subtract el's coordinates from container's coordinates\n\t\tposition = {\n\t\t\ttop: elementDimensions.rect.top - ( containerDimensions.rect.top + containerDimensions.borders.top ),\n\t\t\tbottom: containerDimensions.rect.bottom - containerDimensions.borders.bottom - containerDimensions.scrollbar.bottom - elementDimensions.rect.bottom,\n\t\t\tleft: elementDimensions.rect.left - ( containerDimensions.rect.left + containerDimensions.borders.left ),\n\t\t\tright: containerDimensions.rect.right - containerDimensions.borders.right - containerDimensions.scrollbar.right - elementDimensions.rect.right\n\t\t};\n\t}\n\n\tif ( !config.direction || config.direction === 'y' ) {\n\t\tif ( position.top < 0 ) {\n\t\t\tanimations.scrollTop = containerDimensions.scroll.top + position.top;\n\t\t} else if ( position.top > 0 && position.bottom < 0 ) {\n\t\t\tanimations.scrollTop = containerDimensions.scroll.top + Math.min( position.top, -position.bottom );\n\t\t}\n\t}\n\tif ( !config.direction || config.direction === 'x' ) {\n\t\tif ( position.left < 0 ) {\n\t\t\tanimations.scrollLeft = containerDimensions.scroll.left + position.left;\n\t\t} else if ( position.left > 0 && position.right < 0 ) {\n\t\t\tanimations.scrollLeft = containerDimensions.scroll.left + Math.min( position.left, -position.right );\n\t\t}\n\t}\n\tif ( !$.isEmptyObject( animations ) ) {\n\t\t$container.stop( true ).animate( animations, config.duration === undefined ? 'fast' : config.duration );\n\t\t$container.queue( function ( next ) {\n\t\t\tdeferred.resolve();\n\t\t\tnext();\n\t\t} );\n\t} else {\n\t\tdeferred.resolve();\n\t}\n\treturn deferred.promise();\n};\n\n/**\n * Force the browser to reconsider whether it really needs to render scrollbars inside the element\n * and reserve space for them, because it probably doesn't.\n *\n * Workaround primarily for <https://code.google.com/p/chromium/issues/detail?id=387290>, but also\n * similar bugs in other browsers. \"Just\" forcing a reflow is not sufficient in all cases, we need\n * to first actually detach (or hide, but detaching is simpler) all children, *then* force a reflow,\n * and then reattach (or show) them back.\n *\n * @static\n * @param {HTMLElement} el Element to reconsider the scrollbars on\n */\nOO.ui.Element.static.reconsiderScrollbars = function ( el ) {\n\tvar i, len, scrollLeft, scrollTop, nodes = [];\n\t// Save scroll position\n\tscrollLeft = el.scrollLeft;\n\tscrollTop = el.scrollTop;\n\t// Detach all children\n\twhile ( el.firstChild ) {\n\t\tnodes.push( el.firstChild );\n\t\tel.removeChild( el.firstChild );\n\t}\n\t// Force reflow\n\tvoid el.offsetHeight;\n\t// Reattach all children\n\tfor ( i = 0, len = nodes.length; i < len; i++ ) {\n\t\tel.appendChild( nodes[ i ] );\n\t}\n\t// Restore scroll position (no-op if scrollbars disappeared)\n\tel.scrollLeft = scrollLeft;\n\tel.scrollTop = scrollTop;\n};\n\n/* Methods */\n\n/**\n * Toggle visibility of an element.\n *\n * @param {boolean} [show] Make element visible, omit to toggle visibility\n * @fires visible\n * @chainable\n */\nOO.ui.Element.prototype.toggle = function ( show ) {\n\tshow = show === undefined ? !this.visible : !!show;\n\n\tif ( show !== this.isVisible() ) {\n\t\tthis.visible = show;\n\t\tthis.$element.toggleClass( 'oo-ui-element-hidden', !this.visible );\n\t\tthis.emit( 'toggle', show );\n\t}\n\n\treturn this;\n};\n\n/**\n * Check if element is visible.\n *\n * @return {boolean} element is visible\n */\nOO.ui.Element.prototype.isVisible = function () {\n\treturn this.visible;\n};\n\n/**\n * Get element data.\n *\n * @return {Mixed} Element data\n */\nOO.ui.Element.prototype.getData = function () {\n\treturn this.data;\n};\n\n/**\n * Set element data.\n *\n * @param {Mixed} data Element data\n * @chainable\n */\nOO.ui.Element.prototype.setData = function ( data ) {\n\tthis.data = data;\n\treturn this;\n};\n\n/**\n * Set the element has an 'id' attribute.\n *\n * @param {string} id\n * @chainable\n */\nOO.ui.Element.prototype.setElementId = function ( id ) {\n\tthis.elementId = id;\n\tthis.$element.attr( 'id', id );\n\treturn this;\n};\n\n/**\n * Ensure that the element has an 'id' attribute, setting it to an unique value if it's missing,\n * and return its value.\n *\n * @return {string}\n */\nOO.ui.Element.prototype.getElementId = function () {\n\tif ( this.elementId === null ) {\n\t\tthis.setElementId( OO.ui.generateElementId() );\n\t}\n\treturn this.elementId;\n};\n\n/**\n * Check if element supports one or more methods.\n *\n * @param {string|string[]} methods Method or list of methods to check\n * @return {boolean} All methods are supported\n */\nOO.ui.Element.prototype.supports = function ( methods ) {\n\tvar i, len,\n\t\tsupport = 0;\n\n\tmethods = Array.isArray( methods ) ? methods : [ methods ];\n\tfor ( i = 0, len = methods.length; i < len; i++ ) {\n\t\tif ( $.isFunction( this[ methods[ i ] ] ) ) {\n\t\t\tsupport++;\n\t\t}\n\t}\n\n\treturn methods.length === support;\n};\n\n/**\n * Update the theme-provided classes.\n *\n * @localdoc This is called in element mixins and widget classes any time state changes.\n *   Updating is debounced, minimizing overhead of changing multiple attributes and\n *   guaranteeing that theme updates do not occur within an element's constructor\n */\nOO.ui.Element.prototype.updateThemeClasses = function () {\n\tOO.ui.theme.queueUpdateElementClasses( this );\n};\n\n/**\n * Get the HTML tag name.\n *\n * Override this method to base the result on instance information.\n *\n * @return {string} HTML tag name\n */\nOO.ui.Element.prototype.getTagName = function () {\n\treturn this.constructor.static.tagName;\n};\n\n/**\n * Check if the element is attached to the DOM\n *\n * @return {boolean} The element is attached to the DOM\n */\nOO.ui.Element.prototype.isElementAttached = function () {\n\treturn $.contains( this.getElementDocument(), this.$element[ 0 ] );\n};\n\n/**\n * Get the DOM document.\n *\n * @return {HTMLDocument} Document object\n */\nOO.ui.Element.prototype.getElementDocument = function () {\n\t// Don't cache this in other ways either because subclasses could can change this.$element\n\treturn OO.ui.Element.static.getDocument( this.$element );\n};\n\n/**\n * Get the DOM window.\n *\n * @return {Window} Window object\n */\nOO.ui.Element.prototype.getElementWindow = function () {\n\treturn OO.ui.Element.static.getWindow( this.$element );\n};\n\n/**\n * Get closest scrollable container.\n *\n * @return {HTMLElement} Closest scrollable container\n */\nOO.ui.Element.prototype.getClosestScrollableElementContainer = function () {\n\treturn OO.ui.Element.static.getClosestScrollableContainer( this.$element[ 0 ] );\n};\n\n/**\n * Get group element is in.\n *\n * @return {OO.ui.mixin.GroupElement|null} Group element, null if none\n */\nOO.ui.Element.prototype.getElementGroup = function () {\n\treturn this.elementGroup;\n};\n\n/**\n * Set group element is in.\n *\n * @param {OO.ui.mixin.GroupElement|null} group Group element, null if none\n * @chainable\n */\nOO.ui.Element.prototype.setElementGroup = function ( group ) {\n\tthis.elementGroup = group;\n\treturn this;\n};\n\n/**\n * Scroll element into view.\n *\n * @param {Object} [config] Configuration options\n * @return {jQuery.Promise} Promise which resolves when the scroll is complete\n */\nOO.ui.Element.prototype.scrollElementIntoView = function ( config ) {\n\tif (\n\t\t!this.isElementAttached() ||\n\t\t!this.isVisible() ||\n\t\t( this.getElementGroup() && !this.getElementGroup().isVisible() )\n\t) {\n\t\treturn $.Deferred().resolve();\n\t}\n\treturn OO.ui.Element.static.scrollIntoView( this.$element[ 0 ], config );\n};\n\n/**\n * Restore the pre-infusion dynamic state for this widget.\n *\n * This method is called after #$element has been inserted into DOM. The parameter is the return\n * value of #gatherPreInfuseState.\n *\n * @protected\n * @param {Object} state\n */\nOO.ui.Element.prototype.restorePreInfuseState = function () {\n};\n","/**\n * Wraps an HTML snippet for use with configuration values which default\n * to strings.  This bypasses the default html-escaping done to string\n * values.\n *\n * @class\n *\n * @constructor\n * @param {string} [content] HTML content\n */\nOO.ui.HtmlSnippet = function OoUiHtmlSnippet( content ) {\n\t// Properties\n\tthis.content = content;\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.HtmlSnippet );\n\n/* Methods */\n\n/**\n * Render into HTML.\n *\n * @return {string} Unchanged HTML snippet.\n */\nOO.ui.HtmlSnippet.prototype.toString = function () {\n\treturn this.content;\n};\n","/**\n * Layouts are containers for elements and are used to arrange other widgets of arbitrary type in a way\n * that is centrally controlled and can be updated dynamically. Layouts can be, and usually are, combined.\n * See {@link OO.ui.FieldsetLayout FieldsetLayout}, {@link OO.ui.FieldLayout FieldLayout}, {@link OO.ui.FormLayout FormLayout},\n * {@link OO.ui.PanelLayout PanelLayout}, {@link OO.ui.StackLayout StackLayout}, {@link OO.ui.PageLayout PageLayout},\n * {@link OO.ui.HorizontalLayout HorizontalLayout}, and {@link OO.ui.BookletLayout BookletLayout} for more information and examples.\n *\n * @abstract\n * @class\n * @extends OO.ui.Element\n * @mixins OO.EventEmitter\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.Layout = function OoUiLayout( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.Layout.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-layout' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.Layout, OO.ui.Element );\nOO.mixinClass( OO.ui.Layout, OO.EventEmitter );\n","/**\n * Widgets are compositions of one or more OOjs UI elements that users can both view\n * and interact with. All widgets can be configured and modified via a standard API,\n * and their state can change dynamically according to a model.\n *\n * @abstract\n * @class\n * @extends OO.ui.Element\n * @mixins OO.EventEmitter\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [disabled=false] Disable the widget. Disabled widgets cannot be used and their\n *  appearance reflects this state.\n */\nOO.ui.Widget = function OoUiWidget( config ) {\n\t// Initialize config\n\tconfig = $.extend( { disabled: false }, config );\n\n\t// Parent constructor\n\tOO.ui.Widget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\n\t// Properties\n\tthis.disabled = null;\n\tthis.wasDisabled = null;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-widget' );\n\tthis.setDisabled( !!config.disabled );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.Widget, OO.ui.Element );\nOO.mixinClass( OO.ui.Widget, OO.EventEmitter );\n\n/* Events */\n\n/**\n * @event disable\n *\n * A 'disable' event is emitted when the disabled state of the widget changes\n * (i.e. on disable **and** enable).\n *\n * @param {boolean} disabled Widget is disabled\n */\n\n/**\n * @event toggle\n *\n * A 'toggle' event is emitted when the visibility of the widget changes.\n *\n * @param {boolean} visible Widget is visible\n */\n\n/* Methods */\n\n/**\n * Check if the widget is disabled.\n *\n * @return {boolean} Widget is disabled\n */\nOO.ui.Widget.prototype.isDisabled = function () {\n\treturn this.disabled;\n};\n\n/**\n * Set the 'disabled' state of the widget.\n *\n * When a widget is disabled, it cannot be used and its appearance is updated to reflect this state.\n *\n * @param {boolean} disabled Disable widget\n * @chainable\n */\nOO.ui.Widget.prototype.setDisabled = function ( disabled ) {\n\tvar isDisabled;\n\n\tthis.disabled = !!disabled;\n\tisDisabled = this.isDisabled();\n\tif ( isDisabled !== this.wasDisabled ) {\n\t\tthis.$element.toggleClass( 'oo-ui-widget-disabled', isDisabled );\n\t\tthis.$element.toggleClass( 'oo-ui-widget-enabled', !isDisabled );\n\t\tthis.$element.attr( 'aria-disabled', isDisabled.toString() );\n\t\tthis.emit( 'disable', isDisabled );\n\t\tthis.updateThemeClasses();\n\t}\n\tthis.wasDisabled = isDisabled;\n\n\treturn this;\n};\n\n/**\n * Update the disabled state, in case of changes in parent widget.\n *\n * @chainable\n */\nOO.ui.Widget.prototype.updateDisabled = function () {\n\tthis.setDisabled( this.disabled );\n\treturn this;\n};\n\n/**\n * Get an ID of a labelable node which is part of this widget, if any, to be used for `<label for>`\n * value.\n *\n * @return {string|null} The ID of the labelable element\n */\nOO.ui.Widget.prototype.getInputId = function () {\n\treturn null;\n};\n","/**\n * Theme logic.\n *\n * @abstract\n * @class\n *\n * @constructor\n */\nOO.ui.Theme = function OoUiTheme() {\n\tthis.elementClassesQueue = [];\n\tthis.debouncedUpdateQueuedElementClasses = OO.ui.debounce( this.updateQueuedElementClasses );\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.Theme );\n\n/* Methods */\n\n/**\n * Get a list of classes to be applied to a widget.\n *\n * The 'on' and 'off' lists combined MUST contain keys for all classes the theme adds or removes,\n * otherwise state transitions will not work properly.\n *\n * @param {OO.ui.Element} element Element for which to get classes\n * @return {Object.<string,string[]>} Categorized class names with `on` and `off` lists\n */\nOO.ui.Theme.prototype.getElementClasses = function () {\n\treturn { on: [], off: [] };\n};\n\n/**\n * Update CSS classes provided by the theme.\n *\n * For elements with theme logic hooks, this should be called any time there's a state change.\n *\n * @param {OO.ui.Element} element Element for which to update classes\n */\nOO.ui.Theme.prototype.updateElementClasses = function ( element ) {\n\tvar $elements = $( [] ),\n\t\tclasses = this.getElementClasses( element );\n\n\tif ( element.$icon ) {\n\t\t$elements = $elements.add( element.$icon );\n\t}\n\tif ( element.$indicator ) {\n\t\t$elements = $elements.add( element.$indicator );\n\t}\n\n\t$elements\n\t\t.removeClass( classes.off.join( ' ' ) )\n\t\t.addClass( classes.on.join( ' ' ) );\n};\n\n/**\n * @private\n */\nOO.ui.Theme.prototype.updateQueuedElementClasses = function () {\n\tvar i;\n\tfor ( i = 0; i < this.elementClassesQueue.length; i++ ) {\n\t\tthis.updateElementClasses( this.elementClassesQueue[ i ] );\n\t}\n\t// Clear the queue\n\tthis.elementClassesQueue = [];\n};\n\n/**\n * Queue #updateElementClasses to be called for this element.\n *\n * @localdoc QUnit tests override this method to directly call #queueUpdateElementClasses,\n *   to make them synchronous.\n *\n * @param {OO.ui.Element} element Element for which to update classes\n */\nOO.ui.Theme.prototype.queueUpdateElementClasses = function ( element ) {\n\t// Keep items in the queue unique. Use lastIndexOf to start checking from the end because that's\n\t// the most common case (this method is often called repeatedly for the same element).\n\tif ( this.elementClassesQueue.lastIndexOf( element ) !== -1 ) {\n\t\treturn;\n\t}\n\tthis.elementClassesQueue.push( element );\n\tthis.debouncedUpdateQueuedElementClasses();\n};\n\n/**\n * Get the transition duration in milliseconds for dialogs opening/closing\n *\n * The dialog should be fully rendered this many milliseconds after the\n * ready process has executed.\n *\n * @return {number} Transition duration in milliseconds\n */\nOO.ui.Theme.prototype.getDialogTransitionDuration = function () {\n\treturn 0;\n};\n","/**\n * The TabIndexedElement class is an attribute mixin used to add additional functionality to an\n * element created by another class. The mixin provides a ‘tabIndex’ property, which specifies the\n * order in which users will navigate through the focusable elements via the \"tab\" key.\n *\n *     @example\n *     // TabIndexedElement is mixed into the ButtonWidget class\n *     // to provide a tabIndex property.\n *     var button1 = new OO.ui.ButtonWidget( {\n *         label: 'fourth',\n *         tabIndex: 4\n *     } );\n *     var button2 = new OO.ui.ButtonWidget( {\n *         label: 'second',\n *         tabIndex: 2\n *     } );\n *     var button3 = new OO.ui.ButtonWidget( {\n *         label: 'third',\n *         tabIndex: 3\n *     } );\n *     var button4 = new OO.ui.ButtonWidget( {\n *         label: 'first',\n *         tabIndex: 1\n *     } );\n *     $( 'body' ).append( button1.$element, button2.$element, button3.$element, button4.$element );\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$tabIndexed] The element that should use the tabindex functionality. By default,\n *  the functionality is applied to the element created by the class ($element). If a different element is specified, the tabindex\n *  functionality will be applied to it instead.\n * @cfg {number|null} [tabIndex=0] Number that specifies the element’s position in the tab-navigation\n *  order (e.g., 1 for the first focusable element). Use 0 to use the default navigation order; use -1\n *  to remove the element from the tab-navigation flow.\n */\nOO.ui.mixin.TabIndexedElement = function OoUiMixinTabIndexedElement( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( { tabIndex: 0 }, config );\n\n\t// Properties\n\tthis.$tabIndexed = null;\n\tthis.tabIndex = null;\n\n\t// Events\n\tthis.connect( this, { disable: 'onTabIndexedElementDisable' } );\n\n\t// Initialization\n\tthis.setTabIndex( config.tabIndex );\n\tthis.setTabIndexedElement( config.$tabIndexed || this.$element );\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.mixin.TabIndexedElement );\n\n/* Methods */\n\n/**\n * Set the element that should use the tabindex functionality.\n *\n * This method is used to retarget a tabindex mixin so that its functionality applies\n * to the specified element. If an element is currently using the functionality, the mixin’s\n * effect on that element is removed before the new element is set up.\n *\n * @param {jQuery} $tabIndexed Element that should use the tabindex functionality\n * @chainable\n */\nOO.ui.mixin.TabIndexedElement.prototype.setTabIndexedElement = function ( $tabIndexed ) {\n\tvar tabIndex = this.tabIndex;\n\t// Remove attributes from old $tabIndexed\n\tthis.setTabIndex( null );\n\t// Force update of new $tabIndexed\n\tthis.$tabIndexed = $tabIndexed;\n\tthis.tabIndex = tabIndex;\n\treturn this.updateTabIndex();\n};\n\n/**\n * Set the value of the tabindex.\n *\n * @param {number|null} tabIndex Tabindex value, or `null` for no tabindex\n * @chainable\n */\nOO.ui.mixin.TabIndexedElement.prototype.setTabIndex = function ( tabIndex ) {\n\ttabIndex = typeof tabIndex === 'number' ? tabIndex : null;\n\n\tif ( this.tabIndex !== tabIndex ) {\n\t\tthis.tabIndex = tabIndex;\n\t\tthis.updateTabIndex();\n\t}\n\n\treturn this;\n};\n\n/**\n * Update the `tabindex` attribute, in case of changes to tab index or\n * disabled state.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.TabIndexedElement.prototype.updateTabIndex = function () {\n\tif ( this.$tabIndexed ) {\n\t\tif ( this.tabIndex !== null ) {\n\t\t\t// Do not index over disabled elements\n\t\t\tthis.$tabIndexed.attr( {\n\t\t\t\ttabindex: this.isDisabled() ? -1 : this.tabIndex,\n\t\t\t\t// Support: ChromeVox and NVDA\n\t\t\t\t// These do not seem to inherit aria-disabled from parent elements\n\t\t\t\t'aria-disabled': this.isDisabled().toString()\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.$tabIndexed.removeAttr( 'tabindex aria-disabled' );\n\t\t}\n\t}\n\treturn this;\n};\n\n/**\n * Handle disable events.\n *\n * @private\n * @param {boolean} disabled Element is disabled\n */\nOO.ui.mixin.TabIndexedElement.prototype.onTabIndexedElementDisable = function () {\n\tthis.updateTabIndex();\n};\n\n/**\n * Get the value of the tabindex.\n *\n * @return {number|null} Tabindex value\n */\nOO.ui.mixin.TabIndexedElement.prototype.getTabIndex = function () {\n\treturn this.tabIndex;\n};\n\n/**\n * Get an ID of a focusable element of this widget, if any, to be used for `<label for>` value.\n *\n * If the element already has an ID then that is returned, otherwise unique ID is\n * generated, set on the element, and returned.\n *\n * @return {string|null} The ID of the focusable element\n */\nOO.ui.mixin.TabIndexedElement.prototype.getInputId = function () {\n\tvar id;\n\n\tif ( !this.$tabIndexed ) {\n\t\treturn null;\n\t}\n\tif ( !this.isLabelableNode( this.$tabIndexed ) ) {\n\t\treturn null;\n\t}\n\n\tid = this.$tabIndexed.attr( 'id' );\n\tif ( id === undefined ) {\n\t\tid = OO.ui.generateElementId();\n\t\tthis.$tabIndexed.attr( 'id', id );\n\t}\n\n\treturn id;\n};\n\n/**\n * Whether the node is 'labelable' according to the HTML spec\n * (i.e., whether it can be interacted with through a `<label for=\"…\">`).\n * See: <https://html.spec.whatwg.org/multipage/forms.html#category-label>.\n *\n * @private\n * @param {jQuery} $node\n * @return {boolean}\n */\nOO.ui.mixin.TabIndexedElement.prototype.isLabelableNode = function ( $node ) {\n\tvar\n\t\tlabelableTags = [ 'button', 'meter', 'output', 'progress', 'select', 'textarea' ],\n\t\ttagName = $node.prop( 'tagName' ).toLowerCase();\n\n\tif ( tagName === 'input' && $node.attr( 'type' ) !== 'hidden' ) {\n\t\treturn true;\n\t}\n\tif ( labelableTags.indexOf( tagName ) !== -1 ) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n/**\n * Focus this element.\n *\n * @chainable\n */\nOO.ui.mixin.TabIndexedElement.prototype.focus = function () {\n\tif ( !this.isDisabled() ) {\n\t\tthis.$tabIndexed.focus();\n\t}\n\treturn this;\n};\n\n/**\n * Blur this element.\n *\n * @chainable\n */\nOO.ui.mixin.TabIndexedElement.prototype.blur = function () {\n\tthis.$tabIndexed.blur();\n\treturn this;\n};\n","/**\n * ButtonElement is often mixed into other classes to generate a button, which is a clickable\n * interface element that can be configured with access keys for accessibility.\n * See the [OOjs UI documentation on MediaWiki] [1] for examples.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Buttons_and_Switches#Buttons\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$button] The button element created by the class.\n *  If this configuration is omitted, the button element will use a generated `<a>`.\n * @cfg {boolean} [framed=true] Render the button with a frame\n */\nOO.ui.mixin.ButtonElement = function OoUiMixinButtonElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.$button = null;\n\tthis.framed = null;\n\tthis.active = config.active !== undefined && config.active;\n\tthis.onMouseUpHandler = this.onMouseUp.bind( this );\n\tthis.onMouseDownHandler = this.onMouseDown.bind( this );\n\tthis.onKeyDownHandler = this.onKeyDown.bind( this );\n\tthis.onKeyUpHandler = this.onKeyUp.bind( this );\n\tthis.onClickHandler = this.onClick.bind( this );\n\tthis.onKeyPressHandler = this.onKeyPress.bind( this );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-buttonElement' );\n\tthis.toggleFramed( config.framed === undefined || config.framed );\n\tthis.setButtonElement( config.$button || $( '<a>' ) );\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.mixin.ButtonElement );\n\n/* Static Properties */\n\n/**\n * Cancel mouse down events.\n *\n * This property is usually set to `true` to prevent the focus from changing when the button is clicked.\n * Classes such as {@link OO.ui.mixin.DraggableElement DraggableElement} and {@link OO.ui.ButtonOptionWidget ButtonOptionWidget}\n * use a value of `false` so that dragging behavior is possible and mousedown events can be handled by a\n * parent widget.\n *\n * @static\n * @inheritable\n * @property {boolean}\n */\nOO.ui.mixin.ButtonElement.static.cancelButtonMouseDownEvents = true;\n\n/* Events */\n\n/**\n * A 'click' event is emitted when the button element is clicked.\n *\n * @event click\n */\n\n/* Methods */\n\n/**\n * Set the button element.\n *\n * This method is used to retarget a button mixin so that its functionality applies to\n * the specified button element instead of the one created by the class. If a button element\n * is already set, the method will remove the mixin’s effect on that element.\n *\n * @param {jQuery} $button Element to use as button\n */\nOO.ui.mixin.ButtonElement.prototype.setButtonElement = function ( $button ) {\n\tif ( this.$button ) {\n\t\tthis.$button\n\t\t\t.removeClass( 'oo-ui-buttonElement-button' )\n\t\t\t.removeAttr( 'role accesskey' )\n\t\t\t.off( {\n\t\t\t\tmousedown: this.onMouseDownHandler,\n\t\t\t\tkeydown: this.onKeyDownHandler,\n\t\t\t\tclick: this.onClickHandler,\n\t\t\t\tkeypress: this.onKeyPressHandler\n\t\t\t} );\n\t}\n\n\tthis.$button = $button\n\t\t.addClass( 'oo-ui-buttonElement-button' )\n\t\t.on( {\n\t\t\tmousedown: this.onMouseDownHandler,\n\t\t\tkeydown: this.onKeyDownHandler,\n\t\t\tclick: this.onClickHandler,\n\t\t\tkeypress: this.onKeyPressHandler\n\t\t} );\n\n\t// Add `role=\"button\"` on `<a>` elements, where it's needed\n\t// `toUppercase()` is added for XHTML documents\n\tif ( this.$button.prop( 'tagName' ).toUpperCase() === 'A' ) {\n\t\tthis.$button.attr( 'role', 'button' );\n\t}\n};\n\n/**\n * Handles mouse down events.\n *\n * @protected\n * @param {jQuery.Event} e Mouse down event\n */\nOO.ui.mixin.ButtonElement.prototype.onMouseDown = function ( e ) {\n\tif ( this.isDisabled() || e.which !== OO.ui.MouseButtons.LEFT ) {\n\t\treturn;\n\t}\n\tthis.$element.addClass( 'oo-ui-buttonElement-pressed' );\n\t// Run the mouseup handler no matter where the mouse is when the button is let go, so we can\n\t// reliably remove the pressed class\n\tthis.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );\n\t// Prevent change of focus unless specifically configured otherwise\n\tif ( this.constructor.static.cancelButtonMouseDownEvents ) {\n\t\treturn false;\n\t}\n};\n\n/**\n * Handles mouse up events.\n *\n * @protected\n * @param {MouseEvent} e Mouse up event\n */\nOO.ui.mixin.ButtonElement.prototype.onMouseUp = function ( e ) {\n\tif ( this.isDisabled() || e.which !== OO.ui.MouseButtons.LEFT ) {\n\t\treturn;\n\t}\n\tthis.$element.removeClass( 'oo-ui-buttonElement-pressed' );\n\t// Stop listening for mouseup, since we only needed this once\n\tthis.getElementDocument().removeEventListener( 'mouseup', this.onMouseUpHandler, true );\n};\n\n/**\n * Handles mouse click events.\n *\n * @protected\n * @param {jQuery.Event} e Mouse click event\n * @fires click\n */\nOO.ui.mixin.ButtonElement.prototype.onClick = function ( e ) {\n\tif ( !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) {\n\t\tif ( this.emit( 'click' ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n};\n\n/**\n * Handles key down events.\n *\n * @protected\n * @param {jQuery.Event} e Key down event\n */\nOO.ui.mixin.ButtonElement.prototype.onKeyDown = function ( e ) {\n\tif ( this.isDisabled() || ( e.which !== OO.ui.Keys.SPACE && e.which !== OO.ui.Keys.ENTER ) ) {\n\t\treturn;\n\t}\n\tthis.$element.addClass( 'oo-ui-buttonElement-pressed' );\n\t// Run the keyup handler no matter where the key is when the button is let go, so we can\n\t// reliably remove the pressed class\n\tthis.getElementDocument().addEventListener( 'keyup', this.onKeyUpHandler, true );\n};\n\n/**\n * Handles key up events.\n *\n * @protected\n * @param {KeyboardEvent} e Key up event\n */\nOO.ui.mixin.ButtonElement.prototype.onKeyUp = function ( e ) {\n\tif ( this.isDisabled() || ( e.which !== OO.ui.Keys.SPACE && e.which !== OO.ui.Keys.ENTER ) ) {\n\t\treturn;\n\t}\n\tthis.$element.removeClass( 'oo-ui-buttonElement-pressed' );\n\t// Stop listening for keyup, since we only needed this once\n\tthis.getElementDocument().removeEventListener( 'keyup', this.onKeyUpHandler, true );\n};\n\n/**\n * Handles key press events.\n *\n * @protected\n * @param {jQuery.Event} e Key press event\n * @fires click\n */\nOO.ui.mixin.ButtonElement.prototype.onKeyPress = function ( e ) {\n\tif ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {\n\t\tif ( this.emit( 'click' ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n};\n\n/**\n * Check if button has a frame.\n *\n * @return {boolean} Button is framed\n */\nOO.ui.mixin.ButtonElement.prototype.isFramed = function () {\n\treturn this.framed;\n};\n\n/**\n * Render the button with or without a frame. Omit the `framed` parameter to toggle the button frame on and off.\n *\n * @param {boolean} [framed] Make button framed, omit to toggle\n * @chainable\n */\nOO.ui.mixin.ButtonElement.prototype.toggleFramed = function ( framed ) {\n\tframed = framed === undefined ? !this.framed : !!framed;\n\tif ( framed !== this.framed ) {\n\t\tthis.framed = framed;\n\t\tthis.$element\n\t\t\t.toggleClass( 'oo-ui-buttonElement-frameless', !framed )\n\t\t\t.toggleClass( 'oo-ui-buttonElement-framed', framed );\n\t\tthis.updateThemeClasses();\n\t}\n\n\treturn this;\n};\n\n/**\n * Set the button's active state.\n *\n * The active state can be set on:\n *\n *  - {@link OO.ui.ButtonOptionWidget ButtonOptionWidget} when it is selected\n *  - {@link OO.ui.ToggleButtonWidget ToggleButtonWidget} when it is toggle on\n *  - {@link OO.ui.ButtonWidget ButtonWidget} when clicking the button would only refresh the page\n *\n * @protected\n * @param {boolean} value Make button active\n * @chainable\n */\nOO.ui.mixin.ButtonElement.prototype.setActive = function ( value ) {\n\tthis.active = !!value;\n\tthis.$element.toggleClass( 'oo-ui-buttonElement-active', this.active );\n\tthis.updateThemeClasses();\n\treturn this;\n};\n\n/**\n * Check if the button is active\n *\n * @protected\n * @return {boolean} The button is active\n */\nOO.ui.mixin.ButtonElement.prototype.isActive = function () {\n\treturn this.active;\n};\n","/**\n * Any OOjs UI widget that contains other widgets (such as {@link OO.ui.ButtonWidget buttons} or\n * {@link OO.ui.OptionWidget options}) mixes in GroupElement. Adding, removing, and clearing\n * items from the group is done through the interface the class provides.\n * For more information, please see the [OOjs UI documentation on MediaWiki] [1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Elements/Groups\n *\n * @abstract\n * @mixins OO.EmitterList\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$group] The container element created by the class. If this configuration\n *  is omitted, the group element will use a generated `<div>`.\n */\nOO.ui.mixin.GroupElement = function OoUiMixinGroupElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Mixin constructors\n\tOO.EmitterList.call( this, config );\n\n\t// Properties\n\tthis.$group = null;\n\n\t// Initialization\n\tthis.setGroupElement( config.$group || $( '<div>' ) );\n};\n\n/* Setup */\n\nOO.mixinClass( OO.ui.mixin.GroupElement, OO.EmitterList );\n\n/* Events */\n\n/**\n * @event change\n *\n * A change event is emitted when the set of selected items changes.\n *\n * @param {OO.ui.Element[]} items Items currently in the group\n */\n\n/* Methods */\n\n/**\n * Set the group element.\n *\n * If an element is already set, items will be moved to the new element.\n *\n * @param {jQuery} $group Element to use as group\n */\nOO.ui.mixin.GroupElement.prototype.setGroupElement = function ( $group ) {\n\tvar i, len;\n\n\tthis.$group = $group;\n\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\tthis.$group.append( this.items[ i ].$element );\n\t}\n};\n\n/**\n * Get an item by its data.\n *\n * Only the first item with matching data will be returned. To return all matching items,\n * use the #getItemsFromData method.\n *\n * @param {Object} data Item data to search for\n * @return {OO.ui.Element|null} Item with equivalent data, `null` if none exists\n */\nOO.ui.mixin.GroupElement.prototype.getItemFromData = function ( data ) {\n\tvar i, len, item,\n\t\thash = OO.getHash( data );\n\n\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\titem = this.items[ i ];\n\t\tif ( hash === OO.getHash( item.getData() ) ) {\n\t\t\treturn item;\n\t\t}\n\t}\n\n\treturn null;\n};\n\n/**\n * Get items by their data.\n *\n * All items with matching data will be returned. To return only the first match, use the #getItemFromData method instead.\n *\n * @param {Object} data Item data to search for\n * @return {OO.ui.Element[]} Items with equivalent data\n */\nOO.ui.mixin.GroupElement.prototype.getItemsFromData = function ( data ) {\n\tvar i, len, item,\n\t\thash = OO.getHash( data ),\n\t\titems = [];\n\n\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\titem = this.items[ i ];\n\t\tif ( hash === OO.getHash( item.getData() ) ) {\n\t\t\titems.push( item );\n\t\t}\n\t}\n\n\treturn items;\n};\n\n/**\n * Add items to the group.\n *\n * Items will be added to the end of the group array unless the optional `index` parameter specifies\n * a different insertion point. Adding an existing item will move it to the end of the array or the point specified by the `index`.\n *\n * @param {OO.ui.Element[]} items An array of items to add to the group\n * @param {number} [index] Index of the insertion point\n * @chainable\n */\nOO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {\n\t// Mixin method\n\tOO.EmitterList.prototype.addItems.call( this, items, index );\n\n\tthis.emit( 'change', this.getItems() );\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.mixin.GroupElement.prototype.moveItem = function ( items, newIndex ) {\n\t// insertItemElements expects this.items to not have been modified yet, so call before the mixin\n\tthis.insertItemElements( items, newIndex );\n\n\t// Mixin method\n\tnewIndex = OO.EmitterList.prototype.moveItem.call( this, items, newIndex );\n\n\treturn newIndex;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.mixin.GroupElement.prototype.insertItem = function ( item, index ) {\n\titem.setElementGroup( this );\n\tthis.insertItemElements( item, index );\n\n\t// Mixin method\n\tindex = OO.EmitterList.prototype.insertItem.call( this, item, index );\n\n\treturn index;\n};\n\n/**\n * Insert elements into the group\n *\n * @private\n * @param {OO.ui.Element} itemWidget Item to insert\n * @param {number} index Insertion index\n */\nOO.ui.mixin.GroupElement.prototype.insertItemElements = function ( itemWidget, index ) {\n\tif ( index === undefined || index < 0 || index >= this.items.length ) {\n\t\tthis.$group.append( itemWidget.$element );\n\t} else if ( index === 0 ) {\n\t\tthis.$group.prepend( itemWidget.$element );\n\t} else {\n\t\tthis.items[ index ].$element.before( itemWidget.$element );\n\t}\n};\n\n/**\n * Remove the specified items from a group.\n *\n * Removed items are detached (not removed) from the DOM so that they may be reused.\n * To remove all items from a group, you may wish to use the #clearItems method instead.\n *\n * @param {OO.ui.Element[]} items An array of items to remove\n * @chainable\n */\nOO.ui.mixin.GroupElement.prototype.removeItems = function ( items ) {\n\tvar i, len, item, index;\n\n\t// Remove specific items elements\n\tfor ( i = 0, len = items.length; i < len; i++ ) {\n\t\titem = items[ i ];\n\t\tindex = this.items.indexOf( item );\n\t\tif ( index !== -1 ) {\n\t\t\titem.setElementGroup( null );\n\t\t\titem.$element.detach();\n\t\t}\n\t}\n\n\t// Mixin method\n\tOO.EmitterList.prototype.removeItems.call( this, items );\n\n\tthis.emit( 'change', this.getItems() );\n\treturn this;\n};\n\n/**\n * Clear all items from the group.\n *\n * Cleared items are detached from the DOM, not removed, so that they may be reused.\n * To remove only a subset of items from a group, use the #removeItems method.\n *\n * @chainable\n */\nOO.ui.mixin.GroupElement.prototype.clearItems = function () {\n\tvar i, len;\n\n\t// Remove all item elements\n\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\tthis.items[ i ].setElementGroup( null );\n\t\tthis.items[ i ].$element.detach();\n\t}\n\n\t// Mixin method\n\tOO.EmitterList.prototype.clearItems.call( this );\n\n\tthis.emit( 'change', this.getItems() );\n\treturn this;\n};\n","/**\n * IconElement is often mixed into other classes to generate an icon.\n * Icons are graphics, about the size of normal text. They are used to aid the user\n * in locating a control or to convey information in a space-efficient way. See the\n * [OOjs UI documentation on MediaWiki] [1] for a list of icons\n * included in the library.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Icons\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$icon] The icon element created by the class. If this configuration is omitted,\n *  the icon element will use a generated `<span>`. To use a different HTML tag, or to specify that\n *  the icon element be set to an existing icon instead of the one generated by this class, set a\n *  value using a jQuery selection. For example:\n *\n *      // Use a <div> tag instead of a <span>\n *     $icon: $(\"<div>\")\n *     // Use an existing icon element instead of the one generated by the class\n *     $icon: this.$element\n *     // Use an icon element from a child widget\n *     $icon: this.childwidget.$element\n * @cfg {Object|string} [icon=''] The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of\n *  symbolic names.  A map is used for i18n purposes and contains a `default` icon\n *  name and additional names keyed by language code. The `default` name is used when no icon is keyed\n *  by the user's language.\n *\n *  Example of an i18n map:\n *\n *     { default: 'bold-a', en: 'bold-b', de: 'bold-f' }\n *  See the [OOjs UI documentation on MediaWiki] [2] for a list of icons included in the library.\n * [2]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Icons\n * @cfg {string|Function} [iconTitle] A text string used as the icon title, or a function that returns title\n *  text. The icon title is displayed when users move the mouse over the icon.\n */\nOO.ui.mixin.IconElement = function OoUiMixinIconElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.$icon = null;\n\tthis.icon = null;\n\tthis.iconTitle = null;\n\n\t// Initialization\n\tthis.setIcon( config.icon || this.constructor.static.icon );\n\tthis.setIconTitle( config.iconTitle || this.constructor.static.iconTitle );\n\tthis.setIconElement( config.$icon || $( '<span>' ) );\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.mixin.IconElement );\n\n/* Static Properties */\n\n/**\n * The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names. A map is used\n * for i18n purposes and contains a `default` icon name and additional names keyed by\n * language code. The `default` name is used when no icon is keyed by the user's language.\n *\n * Example of an i18n map:\n *\n *     { default: 'bold-a', en: 'bold-b', de: 'bold-f' }\n *\n * Note: the static property will be overridden if the #icon configuration is used.\n *\n * @static\n * @inheritable\n * @property {Object|string}\n */\nOO.ui.mixin.IconElement.static.icon = null;\n\n/**\n * The icon title, displayed when users move the mouse over the icon. The value can be text, a\n * function that returns title text, or `null` for no title.\n *\n * The static property will be overridden if the #iconTitle configuration is used.\n *\n * @static\n * @inheritable\n * @property {string|Function|null}\n */\nOO.ui.mixin.IconElement.static.iconTitle = null;\n\n/* Methods */\n\n/**\n * Set the icon element. This method is used to retarget an icon mixin so that its functionality\n * applies to the specified icon element instead of the one created by the class. If an icon\n * element is already set, the mixin’s effect on that element is removed. Generated CSS classes\n * and mixin methods will no longer affect the element.\n *\n * @param {jQuery} $icon Element to use as icon\n */\nOO.ui.mixin.IconElement.prototype.setIconElement = function ( $icon ) {\n\tif ( this.$icon ) {\n\t\tthis.$icon\n\t\t\t.removeClass( 'oo-ui-iconElement-icon oo-ui-icon-' + this.icon )\n\t\t\t.removeAttr( 'title' );\n\t}\n\n\tthis.$icon = $icon\n\t\t.addClass( 'oo-ui-iconElement-icon' )\n\t\t.toggleClass( 'oo-ui-icon-' + this.icon, !!this.icon );\n\tif ( this.iconTitle !== null ) {\n\t\tthis.$icon.attr( 'title', this.iconTitle );\n\t}\n\n\tthis.updateThemeClasses();\n};\n\n/**\n * Set icon by symbolic name (e.g., ‘remove’ or ‘menu’). Use `null` to remove an icon.\n * The icon parameter can also be set to a map of icon names. See the #icon config setting\n * for an example.\n *\n * @param {Object|string|null} icon A symbolic icon name, a {@link #icon map of icon names} keyed\n *  by language code, or `null` to remove the icon.\n * @chainable\n */\nOO.ui.mixin.IconElement.prototype.setIcon = function ( icon ) {\n\ticon = OO.isPlainObject( icon ) ? OO.ui.getLocalValue( icon, null, 'default' ) : icon;\n\ticon = typeof icon === 'string' && icon.trim().length ? icon.trim() : null;\n\n\tif ( this.icon !== icon ) {\n\t\tif ( this.$icon ) {\n\t\t\tif ( this.icon !== null ) {\n\t\t\t\tthis.$icon.removeClass( 'oo-ui-icon-' + this.icon );\n\t\t\t}\n\t\t\tif ( icon !== null ) {\n\t\t\t\tthis.$icon.addClass( 'oo-ui-icon-' + icon );\n\t\t\t}\n\t\t}\n\t\tthis.icon = icon;\n\t}\n\n\tthis.$element.toggleClass( 'oo-ui-iconElement', !!this.icon );\n\tthis.updateThemeClasses();\n\n\treturn this;\n};\n\n/**\n * Set the icon title. Use `null` to remove the title.\n *\n * @param {string|Function|null} iconTitle A text string used as the icon title,\n *  a function that returns title text, or `null` for no title.\n * @chainable\n */\nOO.ui.mixin.IconElement.prototype.setIconTitle = function ( iconTitle ) {\n\ticonTitle = typeof iconTitle === 'function' ||\n\t\t( typeof iconTitle === 'string' && iconTitle.length ) ?\n\t\t\tOO.ui.resolveMsg( iconTitle ) : null;\n\n\tif ( this.iconTitle !== iconTitle ) {\n\t\tthis.iconTitle = iconTitle;\n\t\tif ( this.$icon ) {\n\t\t\tif ( this.iconTitle !== null ) {\n\t\t\t\tthis.$icon.attr( 'title', iconTitle );\n\t\t\t} else {\n\t\t\t\tthis.$icon.removeAttr( 'title' );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Get the symbolic name of the icon.\n *\n * @return {string} Icon name\n */\nOO.ui.mixin.IconElement.prototype.getIcon = function () {\n\treturn this.icon;\n};\n\n/**\n * Get the icon title. The title text is displayed when a user moves the mouse over the icon.\n *\n * @return {string} Icon title text\n */\nOO.ui.mixin.IconElement.prototype.getIconTitle = function () {\n\treturn this.iconTitle;\n};\n","/**\n * IndicatorElement is often mixed into other classes to generate an indicator.\n * Indicators are small graphics that are generally used in two ways:\n *\n * - To draw attention to the status of an item. For example, an indicator might be\n *   used to show that an item in a list has errors that need to be resolved.\n * - To clarify the function of a control that acts in an exceptional way (a button\n *   that opens a menu instead of performing an action directly, for example).\n *\n * For a list of indicators included in the library, please see the\n * [OOjs UI documentation on MediaWiki] [1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Indicators\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$indicator] The indicator element created by the class. If this\n *  configuration is omitted, the indicator element will use a generated `<span>`.\n * @cfg {string} [indicator] Symbolic name of the indicator (e.g., ‘alert’ or  ‘down’).\n *  See the [OOjs UI documentation on MediaWiki][2] for a list of indicators included\n *  in the library.\n * [2]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Indicators\n * @cfg {string|Function} [indicatorTitle] A text string used as the indicator title,\n *  or a function that returns title text. The indicator title is displayed when users move\n *  the mouse over the indicator.\n */\nOO.ui.mixin.IndicatorElement = function OoUiMixinIndicatorElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.$indicator = null;\n\tthis.indicator = null;\n\tthis.indicatorTitle = null;\n\n\t// Initialization\n\tthis.setIndicator( config.indicator || this.constructor.static.indicator );\n\tthis.setIndicatorTitle( config.indicatorTitle || this.constructor.static.indicatorTitle );\n\tthis.setIndicatorElement( config.$indicator || $( '<span>' ) );\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.mixin.IndicatorElement );\n\n/* Static Properties */\n\n/**\n * Symbolic name of the indicator (e.g., ‘alert’ or  ‘down’).\n * The static property will be overridden if the #indicator configuration is used.\n *\n * @static\n * @inheritable\n * @property {string|null}\n */\nOO.ui.mixin.IndicatorElement.static.indicator = null;\n\n/**\n * A text string used as the indicator title, a function that returns title text, or `null`\n * for no title. The static property will be overridden if the #indicatorTitle configuration is used.\n *\n * @static\n * @inheritable\n * @property {string|Function|null}\n */\nOO.ui.mixin.IndicatorElement.static.indicatorTitle = null;\n\n/* Methods */\n\n/**\n * Set the indicator element.\n *\n * If an element is already set, it will be cleaned up before setting up the new element.\n *\n * @param {jQuery} $indicator Element to use as indicator\n */\nOO.ui.mixin.IndicatorElement.prototype.setIndicatorElement = function ( $indicator ) {\n\tif ( this.$indicator ) {\n\t\tthis.$indicator\n\t\t\t.removeClass( 'oo-ui-indicatorElement-indicator oo-ui-indicator-' + this.indicator )\n\t\t\t.removeAttr( 'title' );\n\t}\n\n\tthis.$indicator = $indicator\n\t\t.addClass( 'oo-ui-indicatorElement-indicator' )\n\t\t.toggleClass( 'oo-ui-indicator-' + this.indicator, !!this.indicator );\n\tif ( this.indicatorTitle !== null ) {\n\t\tthis.$indicator.attr( 'title', this.indicatorTitle );\n\t}\n\n\tthis.updateThemeClasses();\n};\n\n/**\n * Set the indicator by its symbolic name: ‘alert’, ‘down’, ‘next’, ‘previous’, ‘required’, ‘up’. Use `null` to remove the indicator.\n *\n * @param {string|null} indicator Symbolic name of indicator, or `null` for no indicator\n * @chainable\n */\nOO.ui.mixin.IndicatorElement.prototype.setIndicator = function ( indicator ) {\n\tindicator = typeof indicator === 'string' && indicator.length ? indicator.trim() : null;\n\n\tif ( this.indicator !== indicator ) {\n\t\tif ( this.$indicator ) {\n\t\t\tif ( this.indicator !== null ) {\n\t\t\t\tthis.$indicator.removeClass( 'oo-ui-indicator-' + this.indicator );\n\t\t\t}\n\t\t\tif ( indicator !== null ) {\n\t\t\t\tthis.$indicator.addClass( 'oo-ui-indicator-' + indicator );\n\t\t\t}\n\t\t}\n\t\tthis.indicator = indicator;\n\t}\n\n\tthis.$element.toggleClass( 'oo-ui-indicatorElement', !!this.indicator );\n\tthis.updateThemeClasses();\n\n\treturn this;\n};\n\n/**\n * Set the indicator title.\n *\n * The title is displayed when a user moves the mouse over the indicator.\n *\n * @param {string|Function|null} indicatorTitle Indicator title text, a function that returns text, or\n *   `null` for no indicator title\n * @chainable\n */\nOO.ui.mixin.IndicatorElement.prototype.setIndicatorTitle = function ( indicatorTitle ) {\n\tindicatorTitle = typeof indicatorTitle === 'function' ||\n\t\t( typeof indicatorTitle === 'string' && indicatorTitle.length ) ?\n\t\t\tOO.ui.resolveMsg( indicatorTitle ) : null;\n\n\tif ( this.indicatorTitle !== indicatorTitle ) {\n\t\tthis.indicatorTitle = indicatorTitle;\n\t\tif ( this.$indicator ) {\n\t\t\tif ( this.indicatorTitle !== null ) {\n\t\t\t\tthis.$indicator.attr( 'title', indicatorTitle );\n\t\t\t} else {\n\t\t\t\tthis.$indicator.removeAttr( 'title' );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Get the symbolic name of the indicator (e.g., ‘alert’ or  ‘down’).\n *\n * @return {string} Symbolic name of indicator\n */\nOO.ui.mixin.IndicatorElement.prototype.getIndicator = function () {\n\treturn this.indicator;\n};\n\n/**\n * Get the indicator title.\n *\n * The title is displayed when a user moves the mouse over the indicator.\n *\n * @return {string} Indicator title text\n */\nOO.ui.mixin.IndicatorElement.prototype.getIndicatorTitle = function () {\n\treturn this.indicatorTitle;\n};\n","/**\n * LabelElement is often mixed into other classes to generate a label, which\n * helps identify the function of an interface element.\n * See the [OOjs UI documentation on MediaWiki] [1] for more information.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Labels\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$label] The label element created by the class. If this\n *  configuration is omitted, the label element will use a generated `<span>`.\n * @cfg {jQuery|string|Function|OO.ui.HtmlSnippet} [label] The label text. The label can be specified\n *  as a plaintext string, a jQuery selection of elements, or a function that will produce a string\n *  in the future. See the [OOjs UI documentation on MediaWiki] [2] for examples.\n *  [2]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Labels\n */\nOO.ui.mixin.LabelElement = function OoUiMixinLabelElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.$label = null;\n\tthis.label = null;\n\n\t// Initialization\n\tthis.setLabel( config.label || this.constructor.static.label );\n\tthis.setLabelElement( config.$label || $( '<span>' ) );\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.mixin.LabelElement );\n\n/* Events */\n\n/**\n * @event labelChange\n * @param {string} value\n */\n\n/* Static Properties */\n\n/**\n * The label text. The label can be specified as a plaintext string, a function that will\n * produce a string in the future, or `null` for no label. The static value will\n * be overridden if a label is specified with the #label config option.\n *\n * @static\n * @inheritable\n * @property {string|Function|null}\n */\nOO.ui.mixin.LabelElement.static.label = null;\n\n/* Static methods */\n\n/**\n * Highlight the first occurrence of the query in the given text\n *\n * @param {string} text Text\n * @param {string} query Query to find\n * @return {jQuery} Text with the first match of the query\n *  sub-string wrapped in highlighted span\n */\nOO.ui.mixin.LabelElement.static.highlightQuery = function ( text, query ) {\n\tvar $result = $( '<span>' ),\n\t\toffset = text.toLowerCase().indexOf( query.toLowerCase() );\n\n\tif ( !query.length || offset === -1 ) {\n\t\treturn $result.text( text );\n\t}\n\t$result.append(\n\t\tdocument.createTextNode( text.slice( 0, offset ) ),\n\t\t$( '<span>' )\n\t\t\t.addClass( 'oo-ui-labelElement-label-highlight' )\n\t\t\t.text( text.slice( offset, offset + query.length ) ),\n\t\tdocument.createTextNode( text.slice( offset + query.length ) )\n\t);\n\treturn $result.contents();\n};\n\n/* Methods */\n\n/**\n * Set the label element.\n *\n * If an element is already set, it will be cleaned up before setting up the new element.\n *\n * @param {jQuery} $label Element to use as label\n */\nOO.ui.mixin.LabelElement.prototype.setLabelElement = function ( $label ) {\n\tif ( this.$label ) {\n\t\tthis.$label.removeClass( 'oo-ui-labelElement-label' ).empty();\n\t}\n\n\tthis.$label = $label.addClass( 'oo-ui-labelElement-label' );\n\tthis.setLabelContent( this.label );\n};\n\n/**\n * Set the label.\n *\n * An empty string will result in the label being hidden. A string containing only whitespace will\n * be converted to a single `&nbsp;`.\n *\n * @param {jQuery|string|OO.ui.HtmlSnippet|Function|null} label Label nodes; text; a function that returns nodes or\n *  text; or null for no label\n * @chainable\n */\nOO.ui.mixin.LabelElement.prototype.setLabel = function ( label ) {\n\tlabel = typeof label === 'function' ? OO.ui.resolveMsg( label ) : label;\n\tlabel = ( ( typeof label === 'string' || label instanceof jQuery ) && label.length ) || ( label instanceof OO.ui.HtmlSnippet && label.toString().length ) ? label : null;\n\n\tif ( this.label !== label ) {\n\t\tif ( this.$label ) {\n\t\t\tthis.setLabelContent( label );\n\t\t}\n\t\tthis.label = label;\n\t\tthis.emit( 'labelChange' );\n\t}\n\n\tthis.$element.toggleClass( 'oo-ui-labelElement', !!this.label );\n\n\treturn this;\n};\n\n/**\n * Set the label as plain text with a highlighted query\n *\n * @param {string} text Text label to set\n * @param {string} query Substring of text to highlight\n * @chainable\n */\nOO.ui.mixin.LabelElement.prototype.setHighlightedQuery = function ( text, query ) {\n\treturn this.setLabel( this.constructor.static.highlightQuery( text, query ) );\n};\n\n/**\n * Get the label.\n *\n * @return {jQuery|string|Function|null} Label nodes; text; a function that returns nodes or\n *  text; or null for no label\n */\nOO.ui.mixin.LabelElement.prototype.getLabel = function () {\n\treturn this.label;\n};\n\n/**\n * Set the content of the label.\n *\n * Do not call this method until after the label element has been set by #setLabelElement.\n *\n * @private\n * @param {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or\n *  text; or null for no label\n */\nOO.ui.mixin.LabelElement.prototype.setLabelContent = function ( label ) {\n\tif ( typeof label === 'string' ) {\n\t\tif ( label.match( /^\\s*$/ ) ) {\n\t\t\t// Convert whitespace only string to a single non-breaking space\n\t\t\tthis.$label.html( '&nbsp;' );\n\t\t} else {\n\t\t\tthis.$label.text( label );\n\t\t}\n\t} else if ( label instanceof OO.ui.HtmlSnippet ) {\n\t\tthis.$label.html( label.toString() );\n\t} else if ( label instanceof jQuery ) {\n\t\tthis.$label.empty().append( label );\n\t} else {\n\t\tthis.$label.empty();\n\t}\n};\n","/**\n * The FlaggedElement class is an attribute mixin, meaning that it is used to add\n * additional functionality to an element created by another class. The class provides\n * a ‘flags’ property assigned the name (or an array of names) of styling flags,\n * which are used to customize the look and feel of a widget to better describe its\n * importance and functionality.\n *\n * The library currently contains the following styling flags for general use:\n *\n * - **progressive**:  Progressive styling is applied to convey that the widget will move the user forward in a process.\n * - **destructive**: Destructive styling is applied to convey that the widget will remove something.\n * - **constructive**: Constructive styling is applied to convey that the widget will create something.\n *\n * The flags affect the appearance of the buttons:\n *\n *     @example\n *     // FlaggedElement is mixed into ButtonWidget to provide styling flags\n *     var button1 = new OO.ui.ButtonWidget( {\n *         label: 'Constructive',\n *         flags: 'constructive'\n *     } );\n *     var button2 = new OO.ui.ButtonWidget( {\n *         label: 'Destructive',\n *         flags: 'destructive'\n *     } );\n *     var button3 = new OO.ui.ButtonWidget( {\n *         label: 'Progressive',\n *         flags: 'progressive'\n *     } );\n *     $( 'body' ).append( button1.$element, button2.$element, button3.$element );\n *\n * {@link OO.ui.ActionWidget ActionWidgets}, which are a special kind of button that execute an action, use these flags: **primary** and **safe**.\n * Please see the [OOjs UI documentation on MediaWiki] [1] for more information.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Elements/Flagged\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string|string[]} [flags] The name or names of the flags (e.g., 'constructive' or 'primary') to apply.\n *  Please see the [OOjs UI documentation on MediaWiki] [2] for more information about available flags.\n *  [2]: https://www.mediawiki.org/wiki/OOjs_UI/Elements/Flagged\n * @cfg {jQuery} [$flagged] The flagged element. By default,\n *  the flagged functionality is applied to the element created by the class ($element).\n *  If a different element is specified, the flagged functionality will be applied to it instead.\n */\nOO.ui.mixin.FlaggedElement = function OoUiMixinFlaggedElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.flags = {};\n\tthis.$flagged = null;\n\n\t// Initialization\n\tthis.setFlags( config.flags );\n\tthis.setFlaggedElement( config.$flagged || this.$element );\n};\n\n/* Events */\n\n/**\n * @event flag\n * A flag event is emitted when the #clearFlags or #setFlags methods are used. The `changes`\n * parameter contains the name of each modified flag and indicates whether it was\n * added or removed.\n *\n * @param {Object.<string,boolean>} changes Object keyed by flag name. A Boolean `true` indicates\n * that the flag was added, `false` that the flag was removed.\n */\n\n/* Methods */\n\n/**\n * Set the flagged element.\n *\n * This method is used to retarget a flagged mixin so that its functionality applies to the specified element.\n * If an element is already set, the method will remove the mixin’s effect on that element.\n *\n * @param {jQuery} $flagged Element that should be flagged\n */\nOO.ui.mixin.FlaggedElement.prototype.setFlaggedElement = function ( $flagged ) {\n\tvar classNames = Object.keys( this.flags ).map( function ( flag ) {\n\t\treturn 'oo-ui-flaggedElement-' + flag;\n\t} ).join( ' ' );\n\n\tif ( this.$flagged ) {\n\t\tthis.$flagged.removeClass( classNames );\n\t}\n\n\tthis.$flagged = $flagged.addClass( classNames );\n};\n\n/**\n * Check if the specified flag is set.\n *\n * @param {string} flag Name of flag\n * @return {boolean} The flag is set\n */\nOO.ui.mixin.FlaggedElement.prototype.hasFlag = function ( flag ) {\n\t// This may be called before the constructor, thus before this.flags is set\n\treturn this.flags && ( flag in this.flags );\n};\n\n/**\n * Get the names of all flags set.\n *\n * @return {string[]} Flag names\n */\nOO.ui.mixin.FlaggedElement.prototype.getFlags = function () {\n\t// This may be called before the constructor, thus before this.flags is set\n\treturn Object.keys( this.flags || {} );\n};\n\n/**\n * Clear all flags.\n *\n * @chainable\n * @fires flag\n */\nOO.ui.mixin.FlaggedElement.prototype.clearFlags = function () {\n\tvar flag, className,\n\t\tchanges = {},\n\t\tremove = [],\n\t\tclassPrefix = 'oo-ui-flaggedElement-';\n\n\tfor ( flag in this.flags ) {\n\t\tclassName = classPrefix + flag;\n\t\tchanges[ flag ] = false;\n\t\tdelete this.flags[ flag ];\n\t\tremove.push( className );\n\t}\n\n\tif ( this.$flagged ) {\n\t\tthis.$flagged.removeClass( remove.join( ' ' ) );\n\t}\n\n\tthis.updateThemeClasses();\n\tthis.emit( 'flag', changes );\n\n\treturn this;\n};\n\n/**\n * Add one or more flags.\n *\n * @param {string|string[]|Object.<string, boolean>} flags A flag name, an array of flag names,\n *  or an object keyed by flag name with a boolean value that indicates whether the flag should\n *  be added (`true`) or removed (`false`).\n * @chainable\n * @fires flag\n */\nOO.ui.mixin.FlaggedElement.prototype.setFlags = function ( flags ) {\n\tvar i, len, flag, className,\n\t\tchanges = {},\n\t\tadd = [],\n\t\tremove = [],\n\t\tclassPrefix = 'oo-ui-flaggedElement-';\n\n\tif ( typeof flags === 'string' ) {\n\t\tclassName = classPrefix + flags;\n\t\t// Set\n\t\tif ( !this.flags[ flags ] ) {\n\t\t\tthis.flags[ flags ] = true;\n\t\t\tadd.push( className );\n\t\t}\n\t} else if ( Array.isArray( flags ) ) {\n\t\tfor ( i = 0, len = flags.length; i < len; i++ ) {\n\t\t\tflag = flags[ i ];\n\t\t\tclassName = classPrefix + flag;\n\t\t\t// Set\n\t\t\tif ( !this.flags[ flag ] ) {\n\t\t\t\tchanges[ flag ] = true;\n\t\t\t\tthis.flags[ flag ] = true;\n\t\t\t\tadd.push( className );\n\t\t\t}\n\t\t}\n\t} else if ( OO.isPlainObject( flags ) ) {\n\t\tfor ( flag in flags ) {\n\t\t\tclassName = classPrefix + flag;\n\t\t\tif ( flags[ flag ] ) {\n\t\t\t\t// Set\n\t\t\t\tif ( !this.flags[ flag ] ) {\n\t\t\t\t\tchanges[ flag ] = true;\n\t\t\t\t\tthis.flags[ flag ] = true;\n\t\t\t\t\tadd.push( className );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Remove\n\t\t\t\tif ( this.flags[ flag ] ) {\n\t\t\t\t\tchanges[ flag ] = false;\n\t\t\t\t\tdelete this.flags[ flag ];\n\t\t\t\t\tremove.push( className );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( this.$flagged ) {\n\t\tthis.$flagged\n\t\t\t.addClass( add.join( ' ' ) )\n\t\t\t.removeClass( remove.join( ' ' ) );\n\t}\n\n\tthis.updateThemeClasses();\n\tthis.emit( 'flag', changes );\n\n\treturn this;\n};\n","/**\n * TitledElement is mixed into other classes to provide a `title` attribute.\n * Titles are rendered by the browser and are made visible when the user moves\n * the mouse over the element. Titles are not visible on touch devices.\n *\n *     @example\n *     // TitledElement provides a 'title' attribute to the\n *     // ButtonWidget class\n *     var button = new OO.ui.ButtonWidget( {\n *         label: 'Button with Title',\n *         title: 'I am a button'\n *     } );\n *     $( 'body' ).append( button.$element );\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$titled] The element to which the `title` attribute is applied.\n *  If this config is omitted, the title functionality is applied to $element, the\n *  element created by the class.\n * @cfg {string|Function} [title] The title text or a function that returns text. If\n *  this config is omitted, the value of the {@link #static-title static title} property is used.\n */\nOO.ui.mixin.TitledElement = function OoUiMixinTitledElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.$titled = null;\n\tthis.title = null;\n\n\t// Initialization\n\tthis.setTitle( config.title !== undefined ? config.title : this.constructor.static.title );\n\tthis.setTitledElement( config.$titled || this.$element );\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.mixin.TitledElement );\n\n/* Static Properties */\n\n/**\n * The title text, a function that returns text, or `null` for no title. The value of the static property\n * is overridden if the #title config option is used.\n *\n * @static\n * @inheritable\n * @property {string|Function|null}\n */\nOO.ui.mixin.TitledElement.static.title = null;\n\n/* Methods */\n\n/**\n * Set the titled element.\n *\n * This method is used to retarget a titledElement mixin so that its functionality applies to the specified element.\n * If an element is already set, the mixin’s effect on that element is removed before the new element is set up.\n *\n * @param {jQuery} $titled Element that should use the 'titled' functionality\n */\nOO.ui.mixin.TitledElement.prototype.setTitledElement = function ( $titled ) {\n\tif ( this.$titled ) {\n\t\tthis.$titled.removeAttr( 'title' );\n\t}\n\n\tthis.$titled = $titled;\n\tif ( this.title ) {\n\t\tthis.$titled.attr( 'title', this.title );\n\t}\n};\n\n/**\n * Set title.\n *\n * @param {string|Function|null} title Title text, a function that returns text, or `null` for no title\n * @chainable\n */\nOO.ui.mixin.TitledElement.prototype.setTitle = function ( title ) {\n\ttitle = typeof title === 'function' ? OO.ui.resolveMsg( title ) : title;\n\ttitle = ( typeof title === 'string' && title.length ) ? title : null;\n\n\tif ( this.title !== title ) {\n\t\tif ( this.$titled ) {\n\t\t\tif ( title !== null ) {\n\t\t\t\tthis.$titled.attr( 'title', title );\n\t\t\t} else {\n\t\t\t\tthis.$titled.removeAttr( 'title' );\n\t\t\t}\n\t\t}\n\t\tthis.title = title;\n\t}\n\n\treturn this;\n};\n\n/**\n * Get title.\n *\n * @return {string} Title string\n */\nOO.ui.mixin.TitledElement.prototype.getTitle = function () {\n\treturn this.title;\n};\n","/**\n * AccessKeyedElement is mixed into other classes to provide an `accesskey` attribute.\n * Accesskeys allow an user to go to a specific element by using\n * a shortcut combination of a browser specific keys + the key\n * set to the field.\n *\n *     @example\n *     // AccessKeyedElement provides an 'accesskey' attribute to the\n *     // ButtonWidget class\n *     var button = new OO.ui.ButtonWidget( {\n *         label: 'Button with Accesskey',\n *         accessKey: 'k'\n *     } );\n *     $( 'body' ).append( button.$element );\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$accessKeyed] The element to which the `accesskey` attribute is applied.\n *  If this config is omitted, the accesskey functionality is applied to $element, the\n *  element created by the class.\n * @cfg {string|Function} [accessKey] The key or a function that returns the key. If\n *  this config is omitted, no accesskey will be added.\n */\nOO.ui.mixin.AccessKeyedElement = function OoUiMixinAccessKeyedElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.$accessKeyed = null;\n\tthis.accessKey = null;\n\n\t// Initialization\n\tthis.setAccessKey( config.accessKey || null );\n\tthis.setAccessKeyedElement( config.$accessKeyed || this.$element );\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.mixin.AccessKeyedElement );\n\n/* Static Properties */\n\n/**\n * The access key, a function that returns a key, or `null` for no accesskey.\n *\n * @static\n * @inheritable\n * @property {string|Function|null}\n */\nOO.ui.mixin.AccessKeyedElement.static.accessKey = null;\n\n/* Methods */\n\n/**\n * Set the accesskeyed element.\n *\n * This method is used to retarget a AccessKeyedElement mixin so that its functionality applies to the specified element.\n * If an element is already set, the mixin's effect on that element is removed before the new element is set up.\n *\n * @param {jQuery} $accessKeyed Element that should use the 'accesskeyes' functionality\n */\nOO.ui.mixin.AccessKeyedElement.prototype.setAccessKeyedElement = function ( $accessKeyed ) {\n\tif ( this.$accessKeyed ) {\n\t\tthis.$accessKeyed.removeAttr( 'accesskey' );\n\t}\n\n\tthis.$accessKeyed = $accessKeyed;\n\tif ( this.accessKey ) {\n\t\tthis.$accessKeyed.attr( 'accesskey', this.accessKey );\n\t}\n};\n\n/**\n * Set accesskey.\n *\n * @param {string|Function|null} accessKey Key, a function that returns a key, or `null` for no accesskey\n * @chainable\n */\nOO.ui.mixin.AccessKeyedElement.prototype.setAccessKey = function ( accessKey ) {\n\taccessKey = typeof accessKey === 'string' ? OO.ui.resolveMsg( accessKey ) : null;\n\n\tif ( this.accessKey !== accessKey ) {\n\t\tif ( this.$accessKeyed ) {\n\t\t\tif ( accessKey !== null ) {\n\t\t\t\tthis.$accessKeyed.attr( 'accesskey', accessKey );\n\t\t\t} else {\n\t\t\t\tthis.$accessKeyed.removeAttr( 'accesskey' );\n\t\t\t}\n\t\t}\n\t\tthis.accessKey = accessKey;\n\t}\n\n\treturn this;\n};\n\n/**\n * Get accesskey.\n *\n * @return {string} accessKey string\n */\nOO.ui.mixin.AccessKeyedElement.prototype.getAccessKey = function () {\n\treturn this.accessKey;\n};\n","/**\n * ButtonWidget is a generic widget for buttons. A wide variety of looks,\n * feels, and functionality can be customized via the class’s configuration options\n * and methods. Please see the [OOjs UI documentation on MediaWiki] [1] for more information\n * and examples.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Buttons_and_Switches\n *\n *     @example\n *     // A button widget\n *     var button = new OO.ui.ButtonWidget( {\n *         label: 'Button with Icon',\n *         icon: 'remove',\n *         iconTitle: 'Remove'\n *     } );\n *     $( 'body' ).append( button.$element );\n *\n * NOTE: HTML form buttons should use the OO.ui.ButtonInputWidget class.\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.ButtonElement\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.TitledElement\n * @mixins OO.ui.mixin.FlaggedElement\n * @mixins OO.ui.mixin.TabIndexedElement\n * @mixins OO.ui.mixin.AccessKeyedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [active=false] Whether button should be shown as active\n * @cfg {string} [href] Hyperlink to visit when the button is clicked.\n * @cfg {string} [target] The frame or window in which to open the hyperlink.\n * @cfg {boolean} [noFollow] Search engine traversal hint (default: true)\n */\nOO.ui.ButtonWidget = function OoUiButtonWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.ButtonWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ButtonElement.call( this, config );\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\tOO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$button } ) );\n\tOO.ui.mixin.FlaggedElement.call( this, config );\n\tOO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$button } ) );\n\tOO.ui.mixin.AccessKeyedElement.call( this, $.extend( {}, config, { $accessKeyed: this.$button } ) );\n\n\t// Properties\n\tthis.href = null;\n\tthis.target = null;\n\tthis.noFollow = false;\n\n\t// Events\n\tthis.connect( this, { disable: 'onDisable' } );\n\n\t// Initialization\n\tthis.$button.append( this.$icon, this.$label, this.$indicator );\n\tthis.$element\n\t\t.addClass( 'oo-ui-buttonWidget' )\n\t\t.append( this.$button );\n\tthis.setActive( config.active );\n\tthis.setHref( config.href );\n\tthis.setTarget( config.target );\n\tthis.setNoFollow( config.noFollow );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ButtonWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.ButtonElement );\nOO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.TitledElement );\nOO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.FlaggedElement );\nOO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.TabIndexedElement );\nOO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.AccessKeyedElement );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.ButtonWidget.static.cancelButtonMouseDownEvents = false;\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.ButtonWidget.static.tagName = 'span';\n\n/* Methods */\n\n/**\n * Get hyperlink location.\n *\n * @return {string} Hyperlink location\n */\nOO.ui.ButtonWidget.prototype.getHref = function () {\n\treturn this.href;\n};\n\n/**\n * Get hyperlink target.\n *\n * @return {string} Hyperlink target\n */\nOO.ui.ButtonWidget.prototype.getTarget = function () {\n\treturn this.target;\n};\n\n/**\n * Get search engine traversal hint.\n *\n * @return {boolean} Whether search engines should avoid traversing this hyperlink\n */\nOO.ui.ButtonWidget.prototype.getNoFollow = function () {\n\treturn this.noFollow;\n};\n\n/**\n * Set hyperlink location.\n *\n * @param {string|null} href Hyperlink location, null to remove\n */\nOO.ui.ButtonWidget.prototype.setHref = function ( href ) {\n\thref = typeof href === 'string' ? href : null;\n\tif ( href !== null && !OO.ui.isSafeUrl( href ) ) {\n\t\thref = './' + href;\n\t}\n\n\tif ( href !== this.href ) {\n\t\tthis.href = href;\n\t\tthis.updateHref();\n\t}\n\n\treturn this;\n};\n\n/**\n * Update the `href` attribute, in case of changes to href or\n * disabled state.\n *\n * @private\n * @chainable\n */\nOO.ui.ButtonWidget.prototype.updateHref = function () {\n\tif ( this.href !== null && !this.isDisabled() ) {\n\t\tthis.$button.attr( 'href', this.href );\n\t} else {\n\t\tthis.$button.removeAttr( 'href' );\n\t}\n\n\treturn this;\n};\n\n/**\n * Handle disable events.\n *\n * @private\n * @param {boolean} disabled Element is disabled\n */\nOO.ui.ButtonWidget.prototype.onDisable = function () {\n\tthis.updateHref();\n};\n\n/**\n * Set hyperlink target.\n *\n * @param {string|null} target Hyperlink target, null to remove\n */\nOO.ui.ButtonWidget.prototype.setTarget = function ( target ) {\n\ttarget = typeof target === 'string' ? target : null;\n\n\tif ( target !== this.target ) {\n\t\tthis.target = target;\n\t\tif ( target !== null ) {\n\t\t\tthis.$button.attr( 'target', target );\n\t\t} else {\n\t\t\tthis.$button.removeAttr( 'target' );\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Set search engine traversal hint.\n *\n * @param {boolean} noFollow True if search engines should avoid traversing this hyperlink\n */\nOO.ui.ButtonWidget.prototype.setNoFollow = function ( noFollow ) {\n\tnoFollow = typeof noFollow === 'boolean' ? noFollow : true;\n\n\tif ( noFollow !== this.noFollow ) {\n\t\tthis.noFollow = noFollow;\n\t\tif ( noFollow ) {\n\t\t\tthis.$button.attr( 'rel', 'nofollow' );\n\t\t} else {\n\t\t\tthis.$button.removeAttr( 'rel' );\n\t\t}\n\t}\n\n\treturn this;\n};\n\n// Override method visibility hints from ButtonElement\n/**\n * @method setActive\n * @inheritdoc\n */\n/**\n * @method isActive\n * @inheritdoc\n */\n","/**\n * A ButtonGroupWidget groups related buttons and is used together with OO.ui.ButtonWidget and\n * its subclasses. Each button in a group is addressed by a unique reference. Buttons can be added,\n * removed, and cleared from the group.\n *\n *     @example\n *     // Example: A ButtonGroupWidget with two buttons\n *     var button1 = new OO.ui.PopupButtonWidget( {\n *         label: 'Select a category',\n *         icon: 'menu',\n *         popup: {\n *             $content: $( '<p>List of categories...</p>' ),\n *             padded: true,\n *             align: 'left'\n *         }\n *     } );\n *     var button2 = new OO.ui.ButtonWidget( {\n *         label: 'Add item'\n *     });\n *     var buttonGroup = new OO.ui.ButtonGroupWidget( {\n *         items: [button1, button2]\n *     } );\n *     $( 'body' ).append( buttonGroup.$element );\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {OO.ui.ButtonWidget[]} [items] Buttons to add\n */\nOO.ui.ButtonGroupWidget = function OoUiButtonGroupWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.ButtonGroupWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, $.extend( {}, config, { $group: this.$element } ) );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-buttonGroupWidget' );\n\tif ( Array.isArray( config.items ) ) {\n\t\tthis.addItems( config.items );\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ButtonGroupWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.mixin.GroupElement );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.ButtonGroupWidget.static.tagName = 'span';\n","/**\n * IconWidget is a generic widget for {@link OO.ui.mixin.IconElement icons}. In general, IconWidgets should be used with OO.ui.LabelWidget,\n * which creates a label that identifies the icon’s function. See the [OOjs UI documentation on MediaWiki] [1]\n * for a list of icons included in the library.\n *\n *     @example\n *     // An icon widget with a label\n *     var myIcon = new OO.ui.IconWidget( {\n *         icon: 'help',\n *         iconTitle: 'Help'\n *      } );\n *      // Create a label.\n *      var iconLabel = new OO.ui.LabelWidget( {\n *          label: 'Help'\n *      } );\n *      $( 'body' ).append( myIcon.$element, iconLabel.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Icons\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.TitledElement\n * @mixins OO.ui.mixin.FlaggedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.IconWidget = function OoUiIconWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.IconWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.IconElement.call( this, $.extend( {}, config, { $icon: this.$element } ) );\n\tOO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$element } ) );\n\tOO.ui.mixin.FlaggedElement.call( this, $.extend( {}, config, { $flagged: this.$element } ) );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-iconWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.IconWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.IconWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.IconWidget, OO.ui.mixin.TitledElement );\nOO.mixinClass( OO.ui.IconWidget, OO.ui.mixin.FlaggedElement );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.IconWidget.static.tagName = 'span';\n","/**\n * IndicatorWidgets create indicators, which are small graphics that are generally used to draw\n * attention to the status of an item or to clarify the function of a control. For a list of\n * indicators included in the library, please see the [OOjs UI documentation on MediaWiki][1].\n *\n *     @example\n *     // Example of an indicator widget\n *     var indicator1 = new OO.ui.IndicatorWidget( {\n *         indicator: 'alert'\n *     } );\n *\n *     // Create a fieldset layout to add a label\n *     var fieldset = new OO.ui.FieldsetLayout();\n *     fieldset.addItems( [\n *         new OO.ui.FieldLayout( indicator1, { label: 'An alert indicator:' } )\n *     ] );\n *     $( 'body' ).append( fieldset.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Indicators\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.TitledElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.IndicatorWidget = function OoUiIndicatorWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.IndicatorWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.IndicatorElement.call( this, $.extend( {}, config, { $indicator: this.$element } ) );\n\tOO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$element } ) );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-indicatorWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.IndicatorWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.IndicatorWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.IndicatorWidget, OO.ui.mixin.TitledElement );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.IndicatorWidget.static.tagName = 'span';\n","/**\n * LabelWidgets help identify the function of interface elements. Each LabelWidget can\n * be configured with a `label` option that is set to a string, a label node, or a function:\n *\n * - String: a plaintext string\n * - jQuery selection: a jQuery selection, used for anything other than a plaintext label, e.g., a\n *   label that includes a link or special styling, such as a gray color or additional graphical elements.\n * - Function: a function that will produce a string in the future. Functions are used\n *   in cases where the value of the label is not currently defined.\n *\n * In addition, the LabelWidget can be associated with an {@link OO.ui.InputWidget input widget}, which\n * will come into focus when the label is clicked.\n *\n *     @example\n *     // Examples of LabelWidgets\n *     var label1 = new OO.ui.LabelWidget( {\n *         label: 'plaintext label'\n *     } );\n *     var label2 = new OO.ui.LabelWidget( {\n *         label: $( '<a href=\"default.html\">jQuery label</a>' )\n *     } );\n *     // Create a fieldset layout with fields for each example\n *     var fieldset = new OO.ui.FieldsetLayout();\n *     fieldset.addItems( [\n *         new OO.ui.FieldLayout( label1 ),\n *         new OO.ui.FieldLayout( label2 )\n *     ] );\n *     $( 'body' ).append( fieldset.$element );\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.TitledElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {OO.ui.InputWidget} [input] {@link OO.ui.InputWidget Input widget} that uses the label.\n *  Clicking the label will focus the specified input field.\n */\nOO.ui.LabelWidget = function OoUiLabelWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.LabelWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.LabelElement.call( this, $.extend( {}, config, { $label: this.$element } ) );\n\tOO.ui.mixin.TitledElement.call( this, config );\n\n\t// Properties\n\tthis.input = config.input;\n\n\t// Initialization\n\tif ( this.input ) {\n\t\tif ( this.input.getInputId() ) {\n\t\t\tthis.$element.attr( 'for', this.input.getInputId() );\n\t\t} else {\n\t\t\tthis.$label.on( 'click', function () {\n\t\t\t\tthis.input.focus();\n\t\t\t\treturn false;\n\t\t\t}.bind( this ) );\n\t\t}\n\t}\n\tthis.$element.addClass( 'oo-ui-labelWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.LabelWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.LabelWidget, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.LabelWidget, OO.ui.mixin.TitledElement );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.LabelWidget.static.tagName = 'label';\n","/**\n * PendingElement is a mixin that is used to create elements that notify users that something is happening\n * and that they should wait before proceeding. The pending state is visually represented with a pending\n * texture that appears in the head of a pending {@link OO.ui.ProcessDialog process dialog} or in the input\n * field of a {@link OO.ui.TextInputWidget text input widget}.\n *\n * Currently, {@link OO.ui.ActionWidget Action widgets}, which mix in this class, can also be marked as pending, but only when\n * used in {@link OO.ui.MessageDialog message dialogs}. The behavior is not currently supported for action widgets used\n * in process dialogs.\n *\n *     @example\n *     function MessageDialog( config ) {\n *         MessageDialog.parent.call( this, config );\n *     }\n *     OO.inheritClass( MessageDialog, OO.ui.MessageDialog );\n *\n *     MessageDialog.static.name = 'myMessageDialog';\n *     MessageDialog.static.actions = [\n *         { action: 'save', label: 'Done', flags: 'primary' },\n *         { label: 'Cancel', flags: 'safe' }\n *     ];\n *\n *     MessageDialog.prototype.initialize = function () {\n *         MessageDialog.parent.prototype.initialize.apply( this, arguments );\n *         this.content = new OO.ui.PanelLayout( { $: this.$, padded: true } );\n *         this.content.$element.append( '<p>Click the \\'Done\\' action widget to see its pending state. Note that action widgets can be marked pending in message dialogs but not process dialogs.</p>' );\n *         this.$body.append( this.content.$element );\n *     };\n *     MessageDialog.prototype.getBodyHeight = function () {\n *         return 100;\n *     }\n *     MessageDialog.prototype.getActionProcess = function ( action ) {\n *         var dialog = this;\n *         if ( action === 'save' ) {\n *             dialog.getActions().get({actions: 'save'})[0].pushPending();\n *             return new OO.ui.Process()\n *             .next( 1000 )\n *             .next( function () {\n *                 dialog.getActions().get({actions: 'save'})[0].popPending();\n *             } );\n *         }\n *         return MessageDialog.parent.prototype.getActionProcess.call( this, action );\n *     };\n *\n *     var windowManager = new OO.ui.WindowManager();\n *     $( 'body' ).append( windowManager.$element );\n *\n *     var dialog = new MessageDialog();\n *     windowManager.addWindows( [ dialog ] );\n *     windowManager.openWindow( dialog );\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$pending] Element to mark as pending, defaults to this.$element\n */\nOO.ui.mixin.PendingElement = function OoUiMixinPendingElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.pending = 0;\n\tthis.$pending = null;\n\n\t// Initialisation\n\tthis.setPendingElement( config.$pending || this.$element );\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.mixin.PendingElement );\n\n/* Methods */\n\n/**\n * Set the pending element (and clean up any existing one).\n *\n * @param {jQuery} $pending The element to set to pending.\n */\nOO.ui.mixin.PendingElement.prototype.setPendingElement = function ( $pending ) {\n\tif ( this.$pending ) {\n\t\tthis.$pending.removeClass( 'oo-ui-pendingElement-pending' );\n\t}\n\n\tthis.$pending = $pending;\n\tif ( this.pending > 0 ) {\n\t\tthis.$pending.addClass( 'oo-ui-pendingElement-pending' );\n\t}\n};\n\n/**\n * Check if an element is pending.\n *\n * @return {boolean} Element is pending\n */\nOO.ui.mixin.PendingElement.prototype.isPending = function () {\n\treturn !!this.pending;\n};\n\n/**\n * Increase the pending counter. The pending state will remain active until the counter is zero\n * (i.e., the number of calls to #pushPending and #popPending is the same).\n *\n * @chainable\n */\nOO.ui.mixin.PendingElement.prototype.pushPending = function () {\n\tif ( this.pending === 0 ) {\n\t\tthis.$pending.addClass( 'oo-ui-pendingElement-pending' );\n\t\tthis.updateThemeClasses();\n\t}\n\tthis.pending++;\n\n\treturn this;\n};\n\n/**\n * Decrease the pending counter. The pending state will remain active until the counter is zero\n * (i.e., the number of calls to #pushPending and #popPending is the same).\n *\n * @chainable\n */\nOO.ui.mixin.PendingElement.prototype.popPending = function () {\n\tif ( this.pending === 1 ) {\n\t\tthis.$pending.removeClass( 'oo-ui-pendingElement-pending' );\n\t\tthis.updateThemeClasses();\n\t}\n\tthis.pending = Math.max( 0, this.pending - 1 );\n\n\treturn this;\n};\n","/**\n * Element that will stick adjacent to a specified container, even when it is inserted elsewhere\n * in the document (for example, in an OO.ui.Window's $overlay).\n *\n * The elements's position is automatically calculated and maintained when window is resized or the\n * page is scrolled. If you reposition the container manually, you have to call #position to make\n * sure the element is still placed correctly.\n *\n * As positioning is only possible when both the element and the container are attached to the DOM\n * and visible, it's only done after you call #togglePositioning. You might want to do this inside\n * the #toggle method to display a floating popup, for example.\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$floatable] Node to position, assigned to #$floatable, omit to use #$element\n * @cfg {jQuery} [$floatableContainer] Node to position adjacent to\n * @cfg {string} [verticalPosition='below'] Where to position $floatable vertically:\n *  'below': Directly below $floatableContainer, aligning f's top edge with fC's bottom edge\n *  'above': Directly above $floatableContainer, aligning f's bottom edge with fC's top edge\n *  'top': Align the top edge with $floatableContainer's top edge\n *  'bottom': Align the bottom edge with $floatableContainer's bottom edge\n *  'center': Vertically align the center with $floatableContainer's center\n * @cfg {string} [horizontalPosition='start'] Where to position $floatable horizontally:\n *  'before': Directly before $floatableContainer, aligning f's end edge with fC's start edge\n *  'after': Directly after $floatableContainer, algining f's start edge with fC's end edge\n *  'start': Align the start (left in LTR, right in RTL) edge with $floatableContainer's start edge\n *  'end': Align the end (right in LTR, left in RTL) edge with $floatableContainer's end edge\n *  'center': Horizontally align the center with $floatableContainer's center\n * @cfg {boolean} [hideWhenOutOfView=true] Whether to hide the floatable element if the container\n *  is out of view\n */\nOO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.$floatable = null;\n\tthis.$floatableContainer = null;\n\tthis.$floatableWindow = null;\n\tthis.$floatableClosestScrollable = null;\n\tthis.onFloatableScrollHandler = this.position.bind( this );\n\tthis.onFloatableWindowResizeHandler = this.position.bind( this );\n\n\t// Initialization\n\tthis.setFloatableContainer( config.$floatableContainer );\n\tthis.setFloatableElement( config.$floatable || this.$element );\n\tthis.setVerticalPosition( config.verticalPosition || 'below' );\n\tthis.setHorizontalPosition( config.horizontalPosition || 'start' );\n\tthis.hideWhenOutOfView = config.hideWhenOutOfView === undefined ? true : !!config.hideWhenOutOfView;\n};\n\n/* Methods */\n\n/**\n * Set floatable element.\n *\n * If an element is already set, it will be cleaned up before setting up the new element.\n *\n * @param {jQuery} $floatable Element to make floatable\n */\nOO.ui.mixin.FloatableElement.prototype.setFloatableElement = function ( $floatable ) {\n\tif ( this.$floatable ) {\n\t\tthis.$floatable.removeClass( 'oo-ui-floatableElement-floatable' );\n\t\tthis.$floatable.css( { left: '', top: '' } );\n\t}\n\n\tthis.$floatable = $floatable.addClass( 'oo-ui-floatableElement-floatable' );\n\tthis.position();\n};\n\n/**\n * Set floatable container.\n *\n * The element will be positioned relative to the specified container.\n *\n * @param {jQuery|null} $floatableContainer Container to keep visible, or null to unset\n */\nOO.ui.mixin.FloatableElement.prototype.setFloatableContainer = function ( $floatableContainer ) {\n\tthis.$floatableContainer = $floatableContainer;\n\tif ( this.$floatable ) {\n\t\tthis.position();\n\t}\n};\n\n/**\n * Change how the element is positioned vertically.\n *\n * @param {string} position 'below', 'above', 'top', 'bottom' or 'center'\n */\nOO.ui.mixin.FloatableElement.prototype.setVerticalPosition = function ( position ) {\n\tif ( [ 'below', 'above', 'top', 'bottom', 'center' ].indexOf( position ) === -1 ) {\n\t\tthrow new Error( 'Invalid value for vertical position: ' + position );\n\t}\n\tif ( this.verticalPosition !== position ) {\n\t\tthis.verticalPosition = position;\n\t\tif ( this.$floatable ) {\n\t\t\tthis.position();\n\t\t}\n\t}\n};\n\n/**\n * Change how the element is positioned horizontally.\n *\n * @param {string} position 'before', 'after', 'start', 'end' or 'center'\n */\nOO.ui.mixin.FloatableElement.prototype.setHorizontalPosition = function ( position ) {\n\tif ( [ 'before', 'after', 'start', 'end', 'center' ].indexOf( position ) === -1 ) {\n\t\tthrow new Error( 'Invalid value for horizontal position: ' + position );\n\t}\n\tif ( this.horizontalPosition !== position ) {\n\t\tthis.horizontalPosition = position;\n\t\tif ( this.$floatable ) {\n\t\t\tthis.position();\n\t\t}\n\t}\n};\n\n/**\n * Toggle positioning.\n *\n * Do not turn positioning on until after the element is attached to the DOM and visible.\n *\n * @param {boolean} [positioning] Enable positioning, omit to toggle\n * @chainable\n */\nOO.ui.mixin.FloatableElement.prototype.togglePositioning = function ( positioning ) {\n\tvar closestScrollableOfContainer;\n\n\tif ( !this.$floatable || !this.$floatableContainer ) {\n\t\treturn this;\n\t}\n\n\tpositioning = positioning === undefined ? !this.positioning : !!positioning;\n\n\tif ( positioning && !this.warnedUnattached && !this.isElementAttached() ) {\n\t\tOO.ui.warnDeprecation( 'FloatableElement#togglePositioning: Before calling this method, the element must be attached to the DOM.' );\n\t\tthis.warnedUnattached = true;\n\t}\n\n\tif ( this.positioning !== positioning ) {\n\t\tthis.positioning = positioning;\n\n\t\tthis.needsCustomPosition =\n\t\t\tthis.verticalPostion !== 'below' ||\n\t\t\tthis.horizontalPosition !== 'start' ||\n\t\t\t!OO.ui.contains( this.$floatableContainer[ 0 ], this.$floatable[ 0 ] );\n\n\t\tclosestScrollableOfContainer = OO.ui.Element.static.getClosestScrollableContainer( this.$floatableContainer[ 0 ] );\n\t\t// If the scrollable is the root, we have to listen to scroll events\n\t\t// on the window because of browser inconsistencies.\n\t\tif ( $( closestScrollableOfContainer ).is( 'html, body' ) ) {\n\t\t\tclosestScrollableOfContainer = OO.ui.Element.static.getWindow( closestScrollableOfContainer );\n\t\t}\n\n\t\tif ( positioning ) {\n\t\t\tthis.$floatableWindow = $( this.getElementWindow() );\n\t\t\tthis.$floatableWindow.on( 'resize', this.onFloatableWindowResizeHandler );\n\n\t\t\tthis.$floatableClosestScrollable = $( closestScrollableOfContainer );\n\t\t\tthis.$floatableClosestScrollable.on( 'scroll', this.onFloatableScrollHandler );\n\n\t\t\t// Initial position after visible\n\t\t\tthis.position();\n\t\t} else {\n\t\t\tif ( this.$floatableWindow ) {\n\t\t\t\tthis.$floatableWindow.off( 'resize', this.onFloatableWindowResizeHandler );\n\t\t\t\tthis.$floatableWindow = null;\n\t\t\t}\n\n\t\t\tif ( this.$floatableClosestScrollable ) {\n\t\t\t\tthis.$floatableClosestScrollable.off( 'scroll', this.onFloatableScrollHandler );\n\t\t\t\tthis.$floatableClosestScrollable = null;\n\t\t\t}\n\n\t\t\tthis.$floatable.css( { left: '', right: '', top: '' } );\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Check whether the bottom edge of the given element is within the viewport of the given container.\n *\n * @private\n * @param {jQuery} $element\n * @param {jQuery} $container\n * @return {boolean}\n */\nOO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element, $container ) {\n\tvar elemRect, contRect, topEdgeInBounds, bottomEdgeInBounds, leftEdgeInBounds, rightEdgeInBounds,\n\t\tstartEdgeInBounds, endEdgeInBounds,\n\t\tdirection = $element.css( 'direction' );\n\n\telemRect = $element[ 0 ].getBoundingClientRect();\n\tif ( $container[ 0 ] === window ) {\n\t\tcontRect = {\n\t\t\ttop: 0,\n\t\t\tleft: 0,\n\t\t\tright: document.documentElement.clientWidth,\n\t\t\tbottom: document.documentElement.clientHeight\n\t\t};\n\t} else {\n\t\tcontRect = $container[ 0 ].getBoundingClientRect();\n\t}\n\n\ttopEdgeInBounds = elemRect.top >= contRect.top && elemRect.top <= contRect.bottom;\n\tbottomEdgeInBounds = elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom;\n\tleftEdgeInBounds = elemRect.left >= contRect.left && elemRect.left <= contRect.right;\n\trightEdgeInBounds = elemRect.right >= contRect.left && elemRect.right <= contRect.right;\n\tif ( direction === 'rtl' ) {\n\t\tstartEdgeInBounds = rightEdgeInBounds;\n\t\tendEdgeInBounds = leftEdgeInBounds;\n\t} else {\n\t\tstartEdgeInBounds = leftEdgeInBounds;\n\t\tendEdgeInBounds = rightEdgeInBounds;\n\t}\n\n\tif ( this.verticalPosition === 'below' && !bottomEdgeInBounds ) {\n\t\treturn false;\n\t}\n\tif ( this.verticalPosition === 'above' && !topEdgeInBounds ) {\n\t\treturn false;\n\t}\n\tif ( this.horizontalPosition === 'before' && !startEdgeInBounds ) {\n\t\treturn false;\n\t}\n\tif ( this.horizontalPosition === 'after' && !endEdgeInBounds ) {\n\t\treturn false;\n\t}\n\n\t// The other positioning values are all about being inside the container,\n\t// so in those cases all we care about is that any part of the container is visible.\n\treturn elemRect.top <= contRect.bottom && elemRect.bottom >= contRect.top &&\n\t\telemRect.left <= contRect.right && elemRect.right >= contRect.left;\n};\n\n/**\n * Position the floatable below its container.\n *\n * This should only be done when both of them are attached to the DOM and visible.\n *\n * @chainable\n */\nOO.ui.mixin.FloatableElement.prototype.position = function () {\n\tif ( !this.positioning ) {\n\t\treturn this;\n\t}\n\n\tif ( !(\n\t\t// To continue, some things need to be true:\n\t\t// The element must actually be in the DOM\n\t\tthis.isElementAttached() && (\n\t\t\t// The closest scrollable is the current window\n\t\t\tthis.$floatableClosestScrollable[ 0 ] === this.getElementWindow() ||\n\t\t\t// OR is an element in the element's DOM\n\t\t\t$.contains( this.getElementDocument(), this.$floatableClosestScrollable[ 0 ] )\n\t\t)\n\t) ) {\n\t\t// Abort early if important parts of the widget are no longer attached to the DOM\n\t\treturn this;\n\t}\n\n\tif ( this.hideWhenOutOfView && !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {\n\t\tthis.$floatable.addClass( 'oo-ui-element-hidden' );\n\t\treturn this;\n\t} else {\n\t\tthis.$floatable.removeClass( 'oo-ui-element-hidden' );\n\t}\n\n\tif ( !this.needsCustomPosition ) {\n\t\treturn this;\n\t}\n\n\tthis.$floatable.css( this.computePosition() );\n\n\t// We updated the position, so re-evaluate the clipping state.\n\t// (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so\n\t// will not notice the need to update itself.)\n\t// TODO: This is terrible, we shouldn't need to know about ClippableElement at all here. Why does\n\t// it not listen to the right events in the right places?\n\tif ( this.clip ) {\n\t\tthis.clip();\n\t}\n\n\treturn this;\n};\n\n/**\n * Compute how #$floatable should be positioned based on the position of #$floatableContainer\n * and the positioning settings. This is a helper for #position that shouldn't be called directly,\n * but may be overridden by subclasses if they want to change or add to the positioning logic.\n *\n * @return {Object} New position to apply with .css(). Keys are 'top', 'left', 'bottom' and 'right'.\n */\nOO.ui.mixin.FloatableElement.prototype.computePosition = function () {\n\tvar isBody, scrollableX, scrollableY, containerPos,\n\t\thorizScrollbarHeight, vertScrollbarWidth, scrollTop, scrollLeft,\n\t\tnewPos = { top: '', left: '', bottom: '', right: '' },\n\t\tdirection = this.$floatableContainer.css( 'direction' ),\n\t\t$offsetParent = this.$floatable.offsetParent();\n\n\tif ( $offsetParent.is( 'html' ) ) {\n\t\t// The innerHeight/Width and clientHeight/Width calculations don't work well on the\n\t\t// <html> element, but they do work on the <body>\n\t\t$offsetParent = $( $offsetParent[ 0 ].ownerDocument.body );\n\t}\n\tisBody = $offsetParent.is( 'body' );\n\tscrollableX = $offsetParent.css( 'overflow-x' ) === 'scroll' || $offsetParent.css( 'overflow-x' ) === 'auto';\n\tscrollableY = $offsetParent.css( 'overflow-y' ) === 'scroll' || $offsetParent.css( 'overflow-y' ) === 'auto';\n\n\tvertScrollbarWidth = $offsetParent.innerWidth() - $offsetParent.prop( 'clientWidth' );\n\thorizScrollbarHeight = $offsetParent.innerHeight() - $offsetParent.prop( 'clientHeight' );\n\t// We don't need to compute and add scrollTop and scrollLeft if the scrollable container is the body,\n\t// or if it isn't scrollable\n\tscrollTop = scrollableY && !isBody ? $offsetParent.scrollTop() : 0;\n\tscrollLeft = scrollableX && !isBody ? OO.ui.Element.static.getScrollLeft( $offsetParent[ 0 ] ) : 0;\n\n\t// Avoid passing the <body> to getRelativePosition(), because it won't return what we expect\n\t// if the <body> has a margin\n\tcontainerPos = isBody ?\n\t\tthis.$floatableContainer.offset() :\n\t\tOO.ui.Element.static.getRelativePosition( this.$floatableContainer, $offsetParent );\n\tcontainerPos.bottom = containerPos.top + this.$floatableContainer.outerHeight();\n\tcontainerPos.right = containerPos.left + this.$floatableContainer.outerWidth();\n\tcontainerPos.start = direction === 'rtl' ? containerPos.right : containerPos.left;\n\tcontainerPos.end = direction === 'rtl' ? containerPos.left : containerPos.right;\n\n\tif ( this.verticalPosition === 'below' ) {\n\t\tnewPos.top = containerPos.bottom;\n\t} else if ( this.verticalPosition === 'above' ) {\n\t\tnewPos.bottom = $offsetParent.outerHeight() - containerPos.top;\n\t} else if ( this.verticalPosition === 'top' ) {\n\t\tnewPos.top = containerPos.top;\n\t} else if ( this.verticalPosition === 'bottom' ) {\n\t\tnewPos.bottom = $offsetParent.outerHeight() - containerPos.bottom;\n\t} else if ( this.verticalPosition === 'center' ) {\n\t\tnewPos.top = containerPos.top +\n\t\t\t( this.$floatableContainer.height() - this.$floatable.height() ) / 2;\n\t}\n\n\tif ( this.horizontalPosition === 'before' ) {\n\t\tnewPos.end = containerPos.start;\n\t} else if ( this.horizontalPosition === 'after' ) {\n\t\tnewPos.start = containerPos.end;\n\t} else if ( this.horizontalPosition === 'start' ) {\n\t\tnewPos.start = containerPos.start;\n\t} else if ( this.horizontalPosition === 'end' ) {\n\t\tnewPos.end = containerPos.end;\n\t} else if ( this.horizontalPosition === 'center' ) {\n\t\tnewPos.left = containerPos.left +\n\t\t\t( this.$floatableContainer.width() - this.$floatable.width() ) / 2;\n\t}\n\n\tif ( newPos.start !== undefined ) {\n\t\tif ( direction === 'rtl' ) {\n\t\t\tnewPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.start;\n\t\t} else {\n\t\t\tnewPos.left = newPos.start;\n\t\t}\n\t\tdelete newPos.start;\n\t}\n\tif ( newPos.end !== undefined ) {\n\t\tif ( direction === 'rtl' ) {\n\t\t\tnewPos.left = newPos.end;\n\t\t} else {\n\t\t\tnewPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.end;\n\t\t}\n\t\tdelete newPos.end;\n\t}\n\n\t// Account for scroll position\n\tif ( newPos.top !== '' ) {\n\t\tnewPos.top += scrollTop;\n\t}\n\tif ( newPos.bottom !== '' ) {\n\t\tnewPos.bottom -= scrollTop;\n\t}\n\tif ( newPos.left !== '' ) {\n\t\tnewPos.left += scrollLeft;\n\t}\n\tif ( newPos.right !== '' ) {\n\t\tnewPos.right -= scrollLeft;\n\t}\n\n\t// Account for scrollbar gutter\n\tif ( newPos.bottom !== '' ) {\n\t\tnewPos.bottom -= horizScrollbarHeight;\n\t}\n\tif ( direction === 'rtl' ) {\n\t\tif ( newPos.left !== '' ) {\n\t\t\tnewPos.left -= vertScrollbarWidth;\n\t\t}\n\t} else {\n\t\tif ( newPos.right !== '' ) {\n\t\t\tnewPos.right -= vertScrollbarWidth;\n\t\t}\n\t}\n\n\treturn newPos;\n};\n","/**\n * Element that can be automatically clipped to visible boundaries.\n *\n * Whenever the element's natural height changes, you have to call\n * {@link OO.ui.mixin.ClippableElement#clip} to make sure it's still\n * clipping correctly.\n *\n * The dimensions of #$clippableContainer will be compared to the boundaries of the\n * nearest scrollable container. If #$clippableContainer is too tall and/or too wide,\n * then #$clippable will be given a fixed reduced height and/or width and will be made\n * scrollable. By default, #$clippable and #$clippableContainer are the same element,\n * but you can build a static footer by setting #$clippableContainer to an element that contains\n * #$clippable and the footer.\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$clippable] Node to clip, assigned to #$clippable, omit to use #$element\n * @cfg {jQuery} [$clippableContainer] Node to keep visible, assigned to #$clippableContainer,\n *   omit to use #$clippable\n */\nOO.ui.mixin.ClippableElement = function OoUiMixinClippableElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.$clippable = null;\n\tthis.$clippableContainer = null;\n\tthis.clipping = false;\n\tthis.clippedHorizontally = false;\n\tthis.clippedVertically = false;\n\tthis.$clippableScrollableContainer = null;\n\tthis.$clippableScroller = null;\n\tthis.$clippableWindow = null;\n\tthis.idealWidth = null;\n\tthis.idealHeight = null;\n\tthis.onClippableScrollHandler = this.clip.bind( this );\n\tthis.onClippableWindowResizeHandler = this.clip.bind( this );\n\n\t// Initialization\n\tif ( config.$clippableContainer ) {\n\t\tthis.setClippableContainer( config.$clippableContainer );\n\t}\n\tthis.setClippableElement( config.$clippable || this.$element );\n};\n\n/* Methods */\n\n/**\n * Set clippable element.\n *\n * If an element is already set, it will be cleaned up before setting up the new element.\n *\n * @param {jQuery} $clippable Element to make clippable\n */\nOO.ui.mixin.ClippableElement.prototype.setClippableElement = function ( $clippable ) {\n\tif ( this.$clippable ) {\n\t\tthis.$clippable.removeClass( 'oo-ui-clippableElement-clippable' );\n\t\tthis.$clippable.css( { width: '', height: '', overflowX: '', overflowY: '' } );\n\t\tOO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );\n\t}\n\n\tthis.$clippable = $clippable.addClass( 'oo-ui-clippableElement-clippable' );\n\tthis.clip();\n};\n\n/**\n * Set clippable container.\n *\n * This is the container that will be measured when deciding whether to clip. When clipping,\n * #$clippable will be resized in order to keep the clippable container fully visible.\n *\n * If the clippable container is unset, #$clippable will be used.\n *\n * @param {jQuery|null} $clippableContainer Container to keep visible, or null to unset\n */\nOO.ui.mixin.ClippableElement.prototype.setClippableContainer = function ( $clippableContainer ) {\n\tthis.$clippableContainer = $clippableContainer;\n\tif ( this.$clippable ) {\n\t\tthis.clip();\n\t}\n};\n\n/**\n * Toggle clipping.\n *\n * Do not turn clipping on until after the element is attached to the DOM and visible.\n *\n * @param {boolean} [clipping] Enable clipping, omit to toggle\n * @chainable\n */\nOO.ui.mixin.ClippableElement.prototype.toggleClipping = function ( clipping ) {\n\tclipping = clipping === undefined ? !this.clipping : !!clipping;\n\n\tif ( clipping && !this.warnedUnattached && !this.isElementAttached() ) {\n\t\tOO.ui.warnDeprecation( 'ClippableElement#toggleClipping: Before calling this method, the element must be attached to the DOM.' );\n\t\tthis.warnedUnattached = true;\n\t}\n\n\tif ( this.clipping !== clipping ) {\n\t\tthis.clipping = clipping;\n\t\tif ( clipping ) {\n\t\t\tthis.$clippableScrollableContainer = $( this.getClosestScrollableElementContainer() );\n\t\t\t// If the clippable container is the root, we have to listen to scroll events and check\n\t\t\t// jQuery.scrollTop on the window because of browser inconsistencies\n\t\t\tthis.$clippableScroller = this.$clippableScrollableContainer.is( 'html, body' ) ?\n\t\t\t\t$( OO.ui.Element.static.getWindow( this.$clippableScrollableContainer ) ) :\n\t\t\t\tthis.$clippableScrollableContainer;\n\t\t\tthis.$clippableScroller.on( 'scroll', this.onClippableScrollHandler );\n\t\t\tthis.$clippableWindow = $( this.getElementWindow() )\n\t\t\t\t.on( 'resize', this.onClippableWindowResizeHandler );\n\t\t\t// Initial clip after visible\n\t\t\tthis.clip();\n\t\t} else {\n\t\t\tthis.$clippable.css( {\n\t\t\t\twidth: '',\n\t\t\t\theight: '',\n\t\t\t\tmaxWidth: '',\n\t\t\t\tmaxHeight: '',\n\t\t\t\toverflowX: '',\n\t\t\t\toverflowY: ''\n\t\t\t} );\n\t\t\tOO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );\n\n\t\t\tthis.$clippableScrollableContainer = null;\n\t\t\tthis.$clippableScroller.off( 'scroll', this.onClippableScrollHandler );\n\t\t\tthis.$clippableScroller = null;\n\t\t\tthis.$clippableWindow.off( 'resize', this.onClippableWindowResizeHandler );\n\t\t\tthis.$clippableWindow = null;\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Check if the element will be clipped to fit the visible area of the nearest scrollable container.\n *\n * @return {boolean} Element will be clipped to the visible area\n */\nOO.ui.mixin.ClippableElement.prototype.isClipping = function () {\n\treturn this.clipping;\n};\n\n/**\n * Check if the bottom or right of the element is being clipped by the nearest scrollable container.\n *\n * @return {boolean} Part of the element is being clipped\n */\nOO.ui.mixin.ClippableElement.prototype.isClipped = function () {\n\treturn this.clippedHorizontally || this.clippedVertically;\n};\n\n/**\n * Check if the right of the element is being clipped by the nearest scrollable container.\n *\n * @return {boolean} Part of the element is being clipped\n */\nOO.ui.mixin.ClippableElement.prototype.isClippedHorizontally = function () {\n\treturn this.clippedHorizontally;\n};\n\n/**\n * Check if the bottom of the element is being clipped by the nearest scrollable container.\n *\n * @return {boolean} Part of the element is being clipped\n */\nOO.ui.mixin.ClippableElement.prototype.isClippedVertically = function () {\n\treturn this.clippedVertically;\n};\n\n/**\n * Set the ideal size. These are the dimensions #$clippable will have when it's not being clipped.\n *\n * @param {number|string} [width] Width as a number of pixels or CSS string with unit suffix\n * @param {number|string} [height] Height as a number of pixels or CSS string with unit suffix\n */\nOO.ui.mixin.ClippableElement.prototype.setIdealSize = function ( width, height ) {\n\tthis.idealWidth = width;\n\tthis.idealHeight = height;\n\n\tif ( !this.clipping ) {\n\t\t// Update dimensions\n\t\tthis.$clippable.css( { width: width, height: height } );\n\t}\n\t// While clipping, idealWidth and idealHeight are not considered\n};\n\n/**\n * Clip element to visible boundaries and allow scrolling when needed. You should call this method\n * when the element's natural height changes.\n *\n * Element will be clipped the bottom or right of the element is within 10px of the edge of, or\n * overlapped by, the visible area of the nearest scrollable container.\n *\n * Because calling clip() when the natural height changes isn't always possible, we also set\n * max-height when the element isn't being clipped. This means that if the element tries to grow\n * beyond the edge, something reasonable will happen before clip() is called.\n *\n * @chainable\n */\nOO.ui.mixin.ClippableElement.prototype.clip = function () {\n\tvar $container, extraHeight, extraWidth, ccOffset,\n\t\t$scrollableContainer, scOffset, scHeight, scWidth,\n\t\tccWidth, scrollerIsWindow, scrollTop, scrollLeft,\n\t\tdesiredWidth, desiredHeight, allotedWidth, allotedHeight,\n\t\tnaturalWidth, naturalHeight, clipWidth, clipHeight,\n\t\tbuffer = 7; // Chosen by fair dice roll\n\n\tif ( !this.clipping ) {\n\t\t// this.$clippableScrollableContainer and this.$clippableWindow are null, so the below will fail\n\t\treturn this;\n\t}\n\n\t$container = this.$clippableContainer || this.$clippable;\n\textraHeight = $container.outerHeight() - this.$clippable.outerHeight();\n\textraWidth = $container.outerWidth() - this.$clippable.outerWidth();\n\tccOffset = $container.offset();\n\tif ( this.$clippableScrollableContainer.is( 'html, body' ) ) {\n\t\t$scrollableContainer = this.$clippableWindow;\n\t\tscOffset = { top: 0, left: 0 };\n\t} else {\n\t\t$scrollableContainer = this.$clippableScrollableContainer;\n\t\tscOffset = $scrollableContainer.offset();\n\t}\n\tscHeight = $scrollableContainer.innerHeight() - buffer;\n\tscWidth = $scrollableContainer.innerWidth() - buffer;\n\tccWidth = $container.outerWidth() + buffer;\n\tscrollerIsWindow = this.$clippableScroller[ 0 ] === this.$clippableWindow[ 0 ];\n\tscrollTop = scrollerIsWindow ? this.$clippableScroller.scrollTop() : 0;\n\tscrollLeft = scrollerIsWindow ? this.$clippableScroller.scrollLeft() : 0;\n\tdesiredWidth = ccOffset.left < 0 ?\n\t\tccWidth + ccOffset.left :\n\t\t( scOffset.left + scrollLeft + scWidth ) - ccOffset.left;\n\tdesiredHeight = ( scOffset.top + scrollTop + scHeight ) - ccOffset.top;\n\t// It should never be desirable to exceed the dimensions of the browser viewport... right?\n\tdesiredWidth = Math.min( desiredWidth, document.documentElement.clientWidth );\n\tdesiredHeight = Math.min( desiredHeight, document.documentElement.clientHeight );\n\tallotedWidth = Math.ceil( desiredWidth - extraWidth );\n\tallotedHeight = Math.ceil( desiredHeight - extraHeight );\n\tnaturalWidth = this.$clippable.prop( 'scrollWidth' );\n\tnaturalHeight = this.$clippable.prop( 'scrollHeight' );\n\tclipWidth = allotedWidth < naturalWidth;\n\tclipHeight = allotedHeight < naturalHeight;\n\n\tif ( clipWidth ) {\n\t\t// The order matters here. If overflow is not set first, Chrome displays bogus scrollbars. (T157672)\n\t\t// Forcing a reflow is a smaller workaround than calling reconsiderScrollbars() for this case.\n\t\tthis.$clippable.css( 'overflowX', 'scroll' );\n\t\tvoid this.$clippable[ 0 ].offsetHeight; // Force reflow\n\t\tthis.$clippable.css( {\n\t\t\twidth: Math.max( 0, allotedWidth ),\n\t\t\tmaxWidth: ''\n\t\t} );\n\t} else {\n\t\tthis.$clippable.css( {\n\t\t\toverflowX: '',\n\t\t\twidth: this.idealWidth || '',\n\t\t\tmaxWidth: Math.max( 0, allotedWidth )\n\t\t} );\n\t}\n\tif ( clipHeight ) {\n\t\t// The order matters here. If overflow is not set first, Chrome displays bogus scrollbars. (T157672)\n\t\t// Forcing a reflow is a smaller workaround than calling reconsiderScrollbars() for this case.\n\t\tthis.$clippable.css( 'overflowY', 'scroll' );\n\t\tvoid this.$clippable[ 0 ].offsetHeight; // Force reflow\n\t\tthis.$clippable.css( {\n\t\t\theight: Math.max( 0, allotedHeight ),\n\t\t\tmaxHeight: ''\n\t\t} );\n\t} else {\n\t\tthis.$clippable.css( {\n\t\t\toverflowY: '',\n\t\t\theight: this.idealHeight || '',\n\t\t\tmaxHeight: Math.max( 0, allotedHeight )\n\t\t} );\n\t}\n\n\t// If we stopped clipping in at least one of the dimensions\n\tif ( ( this.clippedHorizontally && !clipWidth ) || ( this.clippedVertically && !clipHeight ) ) {\n\t\tOO.ui.Element.static.reconsiderScrollbars( this.$clippable[ 0 ] );\n\t}\n\n\tthis.clippedHorizontally = clipWidth;\n\tthis.clippedVertically = clipHeight;\n\n\treturn this;\n};\n","/**\n * PopupWidget is a container for content. The popup is overlaid and positioned absolutely.\n * By default, each popup has an anchor that points toward its origin.\n * Please see the [OOjs UI documentation on Mediawiki] [1] for more information and examples.\n *\n * Unlike most widgets, PopupWidget is initially hidden and must be shown by calling #toggle.\n *\n *     @example\n *     // A popup widget.\n *     var popup = new OO.ui.PopupWidget( {\n *         $content: $( '<p>Hi there!</p>' ),\n *         padded: true,\n *         width: 300\n *     } );\n *\n *     $( 'body' ).append( popup.$element );\n *     // To display the popup, toggle the visibility to 'true'.\n *     popup.toggle( true );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Popups\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.ClippableElement\n * @mixins OO.ui.mixin.FloatableElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {number} [width=320] Width of popup in pixels\n * @cfg {number} [height] Height of popup in pixels. Omit to use the automatic height.\n * @cfg {boolean} [anchor=true] Show anchor pointing to origin of popup\n * @cfg {string} [position='below'] Where to position the popup relative to $floatableContainer\n *  'above': Put popup above $floatableContainer; anchor points down to the horizontal center\n *           of $floatableContainer\n *  'below': Put popup below $floatableContainer; anchor points up to the horizontal center\n *           of $floatableContainer\n *  'before': Put popup to the left (LTR) / right (RTL) of $floatableContainer; anchor points\n *            endwards (right/left) to the vertical center of $floatableContainer\n *  'after': Put popup to the right (LTR) / left (RTL) of $floatableContainer; anchor points\n *            startwards (left/right) to the vertical center of $floatableContainer\n * @cfg {string} [align='center'] How to align the popup to $floatableContainer\n *  'forwards': If position is above/below, move the popup as far endwards (right in LTR, left in RTL)\n *              as possible while still keeping the anchor within the popup;\n *              if position is before/after, move the popup as far downwards as possible.\n *  'backwards': If position is above/below, move the popup as far startwards (left in LTR, right in RTL)\n *               as possible while still keeping the anchor within the popup;\n *               if position in before/after, move the popup as far upwards as possible.\n *  'center': Horizontally (if position is above/below) or vertically (before/after) align the center\n *            of the popup with the center of $floatableContainer.\n * 'force-left': Alias for 'forwards' in LTR and 'backwards' in RTL\n * 'force-right': Alias for 'backwards' in RTL and 'forwards' in LTR\n * @cfg {jQuery} [$container] Constrain the popup to the boundaries of the specified container.\n *  See the [OOjs UI docs on MediaWiki][3] for an example.\n *  [3]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Popups#containerExample\n * @cfg {number} [containerPadding=10] Padding between the popup and its container, specified as a number of pixels.\n * @cfg {jQuery} [$content] Content to append to the popup's body\n * @cfg {jQuery} [$footer] Content to append to the popup's footer\n * @cfg {boolean} [autoClose=false] Automatically close the popup when it loses focus.\n * @cfg {jQuery} [$autoCloseIgnore] Elements that will not close the popup when clicked.\n *  This config option is only relevant if #autoClose is set to `true`. See the [OOjs UI docs on MediaWiki][2]\n *  for an example.\n *  [2]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Popups#autocloseExample\n * @cfg {boolean} [head=false] Show a popup header that contains a #label (if specified) and close\n *  button.\n * @cfg {boolean} [padded=false] Add padding to the popup's body\n */\nOO.ui.PopupWidget = function OoUiPopupWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.PopupWidget.parent.call( this, config );\n\n\t// Properties (must be set before ClippableElement constructor call)\n\tthis.$body = $( '<div>' );\n\tthis.$popup = $( '<div>' );\n\n\t// Mixin constructors\n\tOO.ui.mixin.LabelElement.call( this, config );\n\tOO.ui.mixin.ClippableElement.call( this, $.extend( {}, config, {\n\t\t$clippable: this.$body,\n\t\t$clippableContainer: this.$popup\n\t} ) );\n\tOO.ui.mixin.FloatableElement.call( this, config );\n\n\t// Properties\n\tthis.$anchor = $( '<div>' );\n\t// If undefined, will be computed lazily in updateDimensions()\n\tthis.$container = config.$container;\n\tthis.containerPadding = config.containerPadding !== undefined ? config.containerPadding : 10;\n\tthis.autoClose = !!config.autoClose;\n\tthis.$autoCloseIgnore = config.$autoCloseIgnore;\n\tthis.transitionTimeout = null;\n\tthis.anchored = false;\n\tthis.width = config.width !== undefined ? config.width : 320;\n\tthis.height = config.height !== undefined ? config.height : null;\n\tthis.onMouseDownHandler = this.onMouseDown.bind( this );\n\tthis.onDocumentKeyDownHandler = this.onDocumentKeyDown.bind( this );\n\n\t// Initialization\n\tthis.toggleAnchor( config.anchor === undefined || config.anchor );\n\tthis.setAlignment( config.align || 'center' );\n\tthis.setPosition( config.position || 'below' );\n\tthis.$body.addClass( 'oo-ui-popupWidget-body' );\n\tthis.$anchor.addClass( 'oo-ui-popupWidget-anchor' );\n\tthis.$popup\n\t\t.addClass( 'oo-ui-popupWidget-popup' )\n\t\t.append( this.$body );\n\tthis.$element\n\t\t.addClass( 'oo-ui-popupWidget' )\n\t\t.append( this.$popup, this.$anchor );\n\t// Move content, which was added to #$element by OO.ui.Widget, to the body\n\t// FIXME This is gross, we should use '$body' or something for the config\n\tif ( config.$content instanceof jQuery ) {\n\t\tthis.$body.append( config.$content );\n\t}\n\n\tif ( config.padded ) {\n\t\tthis.$body.addClass( 'oo-ui-popupWidget-body-padded' );\n\t}\n\n\tif ( config.head ) {\n\t\tthis.closeButton = new OO.ui.ButtonWidget( { framed: false, icon: 'close' } );\n\t\tthis.closeButton.connect( this, { click: 'onCloseButtonClick' } );\n\t\tthis.$head = $( '<div>' )\n\t\t\t.addClass( 'oo-ui-popupWidget-head' )\n\t\t\t.append( this.$label, this.closeButton.$element );\n\t\tthis.$popup.prepend( this.$head );\n\t}\n\n\tif ( config.$footer ) {\n\t\tthis.$footer = $( '<div>' )\n\t\t\t.addClass( 'oo-ui-popupWidget-footer' )\n\t\t\t.append( config.$footer );\n\t\tthis.$popup.append( this.$footer );\n\t}\n\n\t// Initially hidden - using #toggle may cause errors if subclasses override toggle with methods\n\t// that reference properties not initialized at that time of parent class construction\n\t// TODO: Find a better way to handle post-constructor setup\n\tthis.visible = false;\n\tthis.$element.addClass( 'oo-ui-element-hidden' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.PopupWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.PopupWidget, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.PopupWidget, OO.ui.mixin.ClippableElement );\nOO.mixinClass( OO.ui.PopupWidget, OO.ui.mixin.FloatableElement );\n\n/* Events */\n\n/**\n * @event ready\n *\n * The popup is ready: it is visible and has been positioned and clipped.\n */\n\n/* Methods */\n\n/**\n * Handles mouse down events.\n *\n * @private\n * @param {MouseEvent} e Mouse down event\n */\nOO.ui.PopupWidget.prototype.onMouseDown = function ( e ) {\n\tif (\n\t\tthis.isVisible() &&\n\t\t!OO.ui.contains( this.$element.add( this.$autoCloseIgnore ).get(), e.target, true )\n\t) {\n\t\tthis.toggle( false );\n\t}\n};\n\n/**\n * Bind mouse down listener.\n *\n * @private\n */\nOO.ui.PopupWidget.prototype.bindMouseDownListener = function () {\n\t// Capture clicks outside popup\n\tthis.getElementWindow().addEventListener( 'mousedown', this.onMouseDownHandler, true );\n};\n\n/**\n * Handles close button click events.\n *\n * @private\n */\nOO.ui.PopupWidget.prototype.onCloseButtonClick = function () {\n\tif ( this.isVisible() ) {\n\t\tthis.toggle( false );\n\t}\n};\n\n/**\n * Unbind mouse down listener.\n *\n * @private\n */\nOO.ui.PopupWidget.prototype.unbindMouseDownListener = function () {\n\tthis.getElementWindow().removeEventListener( 'mousedown', this.onMouseDownHandler, true );\n};\n\n/**\n * Handles key down events.\n *\n * @private\n * @param {KeyboardEvent} e Key down event\n */\nOO.ui.PopupWidget.prototype.onDocumentKeyDown = function ( e ) {\n\tif (\n\t\te.which === OO.ui.Keys.ESCAPE &&\n\t\tthis.isVisible()\n\t) {\n\t\tthis.toggle( false );\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t}\n};\n\n/**\n * Bind key down listener.\n *\n * @private\n */\nOO.ui.PopupWidget.prototype.bindKeyDownListener = function () {\n\tthis.getElementWindow().addEventListener( 'keydown', this.onDocumentKeyDownHandler, true );\n};\n\n/**\n * Unbind key down listener.\n *\n * @private\n */\nOO.ui.PopupWidget.prototype.unbindKeyDownListener = function () {\n\tthis.getElementWindow().removeEventListener( 'keydown', this.onDocumentKeyDownHandler, true );\n};\n\n/**\n * Show, hide, or toggle the visibility of the anchor.\n *\n * @param {boolean} [show] Show anchor, omit to toggle\n */\nOO.ui.PopupWidget.prototype.toggleAnchor = function ( show ) {\n\tshow = show === undefined ? !this.anchored : !!show;\n\n\tif ( this.anchored !== show ) {\n\t\tif ( show ) {\n\t\t\tthis.$element.addClass( 'oo-ui-popupWidget-anchored' );\n\t\t\tthis.$element.addClass( 'oo-ui-popupWidget-anchored-' + this.anchorEdge );\n\t\t} else {\n\t\t\tthis.$element.removeClass( 'oo-ui-popupWidget-anchored' );\n\t\t\tthis.$element.removeClass( 'oo-ui-popupWidget-anchored-' + this.anchorEdge );\n\t\t}\n\t\tthis.anchored = show;\n\t}\n};\n/**\n * Change which edge the anchor appears on.\n *\n * @param {string} edge 'top', 'bottom', 'start' or 'end'\n */\nOO.ui.PopupWidget.prototype.setAnchorEdge = function ( edge ) {\n\tif ( [ 'top', 'bottom', 'start', 'end' ].indexOf( edge ) === -1 ) {\n\t\tthrow new Error( 'Invalid value for edge: ' + edge );\n\t}\n\tif ( this.anchorEdge !== null ) {\n\t\tthis.$element.removeClass( 'oo-ui-popupWidget-anchored-' + this.anchorEdge );\n\t}\n\tthis.anchorEdge = edge;\n\tif ( this.anchored ) {\n\t\tthis.$element.addClass( 'oo-ui-popupWidget-anchored-' + edge );\n\t}\n};\n\n/**\n * Check if the anchor is visible.\n *\n * @return {boolean} Anchor is visible\n */\nOO.ui.PopupWidget.prototype.hasAnchor = function () {\n\treturn this.anchored;\n};\n\n/**\n * Toggle visibility of the popup. The popup is initially hidden and must be shown by calling\n * `.toggle( true )` after its #$element is attached to the DOM.\n *\n * Do not show the popup while it is not attached to the DOM. The calculations required to display\n * it in the right place and with the right dimensions only work correctly while it is attached.\n * Side-effects may include broken interface and exceptions being thrown. This wasn't always\n * strictly enforced, so currently it only generates a warning in the browser console.\n *\n * @fires ready\n * @inheritdoc\n */\nOO.ui.PopupWidget.prototype.toggle = function ( show ) {\n\tvar change;\n\tshow = show === undefined ? !this.isVisible() : !!show;\n\n\tchange = show !== this.isVisible();\n\n\tif ( show && !this.warnedUnattached && !this.isElementAttached() ) {\n\t\tOO.ui.warnDeprecation( 'PopupWidget#toggle: Before calling this method, the popup must be attached to the DOM.' );\n\t\tthis.warnedUnattached = true;\n\t}\n\tif ( show && !this.$floatableContainer && this.isElementAttached() ) {\n\t\t// Fall back to the parent node if the floatableContainer is not set\n\t\tthis.setFloatableContainer( this.$element.parent() );\n\t}\n\n\t// Parent method\n\tOO.ui.PopupWidget.parent.prototype.toggle.call( this, show );\n\n\tif ( change ) {\n\t\tthis.togglePositioning( show && !!this.$floatableContainer );\n\n\t\tif ( show ) {\n\t\t\tif ( this.autoClose ) {\n\t\t\t\tthis.bindMouseDownListener();\n\t\t\t\tthis.bindKeyDownListener();\n\t\t\t}\n\t\t\tthis.updateDimensions();\n\t\t\tthis.toggleClipping( true );\n\t\t\tthis.emit( 'ready' );\n\t\t} else {\n\t\t\tthis.toggleClipping( false );\n\t\t\tif ( this.autoClose ) {\n\t\t\t\tthis.unbindMouseDownListener();\n\t\t\t\tthis.unbindKeyDownListener();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Set the size of the popup.\n *\n * Changing the size may also change the popup's position depending on the alignment.\n *\n * @param {number} width Width in pixels\n * @param {number} height Height in pixels\n * @param {boolean} [transition=false] Use a smooth transition\n * @chainable\n */\nOO.ui.PopupWidget.prototype.setSize = function ( width, height, transition ) {\n\tthis.width = width;\n\tthis.height = height !== undefined ? height : null;\n\tif ( this.isVisible() ) {\n\t\tthis.updateDimensions( transition );\n\t}\n};\n\n/**\n * Update the size and position.\n *\n * Only use this to keep the popup properly anchored. Use #setSize to change the size, and this will\n * be called automatically.\n *\n * @param {boolean} [transition=false] Use a smooth transition\n * @chainable\n */\nOO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {\n\tvar widget = this;\n\n\t// Prevent transition from being interrupted\n\tclearTimeout( this.transitionTimeout );\n\tif ( transition ) {\n\t\t// Enable transition\n\t\tthis.$element.addClass( 'oo-ui-popupWidget-transitioning' );\n\t}\n\n\tthis.position();\n\n\tif ( transition ) {\n\t\t// Prevent transitioning after transition is complete\n\t\tthis.transitionTimeout = setTimeout( function () {\n\t\t\twidget.$element.removeClass( 'oo-ui-popupWidget-transitioning' );\n\t\t}, 200 );\n\t} else {\n\t\t// Prevent transitioning immediately\n\t\tthis.$element.removeClass( 'oo-ui-popupWidget-transitioning' );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.PopupWidget.prototype.computePosition = function () {\n\tvar direction, align, vertical, start, end, near, far, sizeProp, popupSize, anchorSize, anchorPos,\n\t\tanchorOffset, anchorMargin, parentPosition, positionProp, positionAdjustment, floatablePos,\n\t\toffsetParentPos, containerPos,\n\t\tpopupPos = {},\n\t\tanchorCss = { left: '', right: '', top: '', bottom: '' },\n\t\talignMap = {\n\t\t\tltr: {\n\t\t\t\t'force-left': 'backwards',\n\t\t\t\t'force-right': 'forwards'\n\t\t\t},\n\t\t\trtl: {\n\t\t\t\t'force-left': 'forwards',\n\t\t\t\t'force-right': 'backwards'\n\t\t\t}\n\t\t},\n\t\tanchorEdgeMap = {\n\t\t\tabove: 'bottom',\n\t\t\tbelow: 'top',\n\t\t\tbefore: 'end',\n\t\t\tafter: 'start'\n\t\t},\n\t\thPosMap = {\n\t\t\tforwards: 'start',\n\t\t\tcenter: 'center',\n\t\t\tbackwards: 'before'\n\t\t},\n\t\tvPosMap = {\n\t\t\tforwards: 'top',\n\t\t\tcenter: 'center',\n\t\t\tbackwards: 'bottom'\n\t\t};\n\n\tif ( !this.$container ) {\n\t\t// Lazy-initialize $container if not specified in constructor\n\t\tthis.$container = $( this.getClosestScrollableElementContainer() );\n\t}\n\tdirection = this.$container.css( 'direction' );\n\n\t// Set height and width before we do anything else, since it might cause our measurements\n\t// to change (e.g. due to scrollbars appearing or disappearing), and it also affects centering\n\tthis.$popup.css( {\n\t\twidth: this.width,\n\t\theight: this.height !== null ? this.height : 'auto'\n\t} );\n\n\talign = alignMap[ direction ][ this.align ] || this.align;\n\t// If the popup is positioned before or after, then the anchor positioning is vertical, otherwise horizontal\n\tvertical = this.popupPosition === 'before' || this.popupPosition === 'after';\n\tstart = vertical ? 'top' : ( direction === 'rtl' ? 'right' : 'left' );\n\tend = vertical ? 'bottom' : ( direction === 'rtl' ? 'left' : 'right' );\n\tnear = vertical ? 'top' : 'left';\n\tfar = vertical ? 'bottom' : 'right';\n\tsizeProp = vertical ? 'Height' : 'Width';\n\tpopupSize = vertical ? ( this.height || this.$popup.height() ) : this.width;\n\n\tthis.setAnchorEdge( anchorEdgeMap[ this.popupPosition ] );\n\tthis.horizontalPosition = vertical ? this.popupPosition : hPosMap[ align ];\n\tthis.verticalPosition = vertical ? vPosMap[ align ] : this.popupPosition;\n\n\t// Parent method\n\tparentPosition = OO.ui.mixin.FloatableElement.prototype.computePosition.call( this );\n\t// Find out which property FloatableElement used for positioning, and adjust that value\n\tpositionProp = vertical ?\n\t\t( parentPosition.top !== '' ? 'top' : 'bottom' ) :\n\t\t( parentPosition.left !== '' ? 'left' : 'right' );\n\n\t// Figure out where the near and far edges of the popup and $floatableContainer are\n\tfloatablePos = this.$floatableContainer.offset();\n\tfloatablePos[ far ] = floatablePos[ near ] + this.$floatableContainer[ 'outer' + sizeProp ]();\n\t// Measure where the offsetParent is and compute our position based on that and parentPosition\n\toffsetParentPos = this.$element.offsetParent().offset();\n\n\tif ( positionProp === near ) {\n\t\tpopupPos[ near ] = offsetParentPos[ near ] + parentPosition[ near ];\n\t\tpopupPos[ far ] = popupPos[ near ] + popupSize;\n\t} else {\n\t\tpopupPos[ far ] = offsetParentPos[ near ] +\n\t\t\tthis.$element.offsetParent()[ 'inner' + sizeProp ]() - parentPosition[ far ];\n\t\tpopupPos[ near ] = popupPos[ far ] - popupSize;\n\t}\n\n\t// Position the anchor (which is positioned relative to the popup) to point to $floatableContainer\n\tanchorPos = ( floatablePos[ start ] + floatablePos[ end ] ) / 2;\n\tanchorOffset = ( start === far ? -1 : 1 ) * ( anchorPos - popupPos[ start ] );\n\n\t// If the anchor is less than 2*anchorSize from either edge, move the popup to make more space\n\t// this.$anchor.width()/height() returns 0 because of the CSS trickery we use, so use scrollWidth/Height\n\tanchorSize = this.$anchor[ 0 ][ 'scroll' + sizeProp ];\n\tanchorMargin = parseFloat( this.$anchor.css( 'margin-' + start ) );\n\tif ( anchorOffset + anchorMargin < 2 * anchorSize ) {\n\t\t// Not enough space for the anchor on the start side; pull the popup startwards\n\t\tpositionAdjustment = ( positionProp === start ? -1 : 1 ) *\n\t\t\t( 2 * anchorSize - ( anchorOffset + anchorMargin ) );\n\t} else if ( anchorOffset + anchorMargin > popupSize - 2 * anchorSize ) {\n\t\t// Not enough space for the anchor on the end side; pull the popup endwards\n\t\tpositionAdjustment = ( positionProp === end ? -1 : 1 ) *\n\t\t\t( anchorOffset + anchorMargin - ( popupSize - 2 * anchorSize ) );\n\t} else {\n\t\tpositionAdjustment = 0;\n\t}\n\n\t// Check if the popup will go beyond the edge of this.$container\n\tcontainerPos = this.$container.offset();\n\tcontainerPos[ far ] = containerPos[ near ] + this.$container[ 'inner' + sizeProp ]();\n\t// Take into account how much the popup will move because of the adjustments we're going to make\n\tpopupPos[ near ] += ( positionProp === near ? 1 : -1 ) * positionAdjustment;\n\tpopupPos[ far ] += ( positionProp === near ? 1 : -1 ) * positionAdjustment;\n\tif ( containerPos[ near ] + this.containerPadding > popupPos[ near ] ) {\n\t\t// Popup goes beyond the near (left/top) edge, move it to the right/bottom\n\t\tpositionAdjustment += ( positionProp === near ? 1 : -1 ) *\n\t\t\t( containerPos[ near ] + this.containerPadding - popupPos[ near ] );\n\t} else if ( containerPos[ far ] - this.containerPadding < popupPos[ far ] ) {\n\t\t// Popup goes beyond the far (right/bottom) edge, move it to the left/top\n\t\tpositionAdjustment += ( positionProp === far ? 1 : -1 ) *\n\t\t\t( popupPos[ far ] - ( containerPos[ far ] - this.containerPadding ) );\n\t}\n\n\t// Adjust anchorOffset for positionAdjustment\n\tanchorOffset += ( positionProp === start ? -1 : 1 ) * positionAdjustment;\n\n\t// Position the anchor\n\tanchorCss[ start ] = anchorOffset;\n\tthis.$anchor.css( anchorCss );\n\t// Move the popup if needed\n\tparentPosition[ positionProp ] += positionAdjustment;\n\n\treturn parentPosition;\n};\n\n/**\n * Set popup alignment\n *\n * @param {string} [align=center] Alignment of the popup, `center`, `force-left`, `force-right`,\n *  `backwards` or `forwards`.\n */\nOO.ui.PopupWidget.prototype.setAlignment = function ( align ) {\n\t// Validate alignment\n\tif ( [ 'force-left', 'force-right', 'backwards', 'forwards', 'center' ].indexOf( align ) > -1 ) {\n\t\tthis.align = align;\n\t} else {\n\t\tthis.align = 'center';\n\t}\n\tthis.position();\n};\n\n/**\n * Get popup alignment\n *\n * @return {string} Alignment of the popup, `center`, `force-left`, `force-right`,\n *  `backwards` or `forwards`.\n */\nOO.ui.PopupWidget.prototype.getAlignment = function () {\n\treturn this.align;\n};\n\n/**\n * Change the positioning of the popup.\n *\n * @param {string} position 'above', 'below', 'before' or 'after'\n */\nOO.ui.PopupWidget.prototype.setPosition = function ( position ) {\n\tif ( [ 'above', 'below', 'before', 'after' ].indexOf( position ) === -1 ) {\n\t\tposition = 'below';\n\t}\n\tthis.popupPosition = position;\n\tthis.position();\n};\n\n/**\n * Get popup positioning.\n *\n * @return {string} 'above', 'below', 'before' or 'after'\n */\nOO.ui.PopupWidget.prototype.getPosition = function () {\n\treturn this.popupPosition;\n};\n","/**\n * PopupElement is mixed into other classes to generate a {@link OO.ui.PopupWidget popup widget}.\n * A popup is a container for content. It is overlaid and positioned absolutely. By default, each\n * popup has an anchor, which is an arrow-like protrusion that points toward the popup’s origin.\n * See {@link OO.ui.PopupWidget PopupWidget} for an example.\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {Object} [popup] Configuration to pass to popup\n * @cfg {boolean} [popup.autoClose=true] Popup auto-closes when it loses focus\n */\nOO.ui.mixin.PopupElement = function OoUiMixinPopupElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.popup = new OO.ui.PopupWidget( $.extend(\n\t\t{\n\t\t\tautoClose: true,\n\t\t\t$floatableContainer: this.$element\n\t\t},\n\t\tconfig.popup,\n\t\t{\n\t\t\t$autoCloseIgnore: this.$element.add( config.popup && config.popup.$autoCloseIgnore )\n\t\t}\n\t) );\n};\n\n/* Methods */\n\n/**\n * Get popup.\n *\n * @return {OO.ui.PopupWidget} Popup widget\n */\nOO.ui.mixin.PopupElement.prototype.getPopup = function () {\n\treturn this.popup;\n};\n","/**\n * PopupButtonWidgets toggle the visibility of a contained {@link OO.ui.PopupWidget PopupWidget},\n * which is used to display additional information or options.\n *\n *     @example\n *     // Example of a popup button.\n *     var popupButton = new OO.ui.PopupButtonWidget( {\n *         label: 'Popup button with options',\n *         icon: 'menu',\n *         popup: {\n *             $content: $( '<p>Additional options here.</p>' ),\n *             padded: true,\n *             align: 'force-left'\n *         }\n *     } );\n *     // Append the button to the DOM.\n *     $( 'body' ).append( popupButton.$element );\n *\n * @class\n * @extends OO.ui.ButtonWidget\n * @mixins OO.ui.mixin.PopupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$overlay] Render the popup into a separate layer. This configuration is useful in cases where\n *  the expanded popup is larger than its containing `<div>`. The specified overlay layer is usually on top of the\n *  containing `<div>` and has a larger area. By default, the popup uses relative positioning.\n *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.\n */\nOO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {\n\t// Parent constructor\n\tOO.ui.PopupButtonWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.PopupElement.call( this, config );\n\n\t// Properties\n\tthis.$overlay = config.$overlay || this.$element;\n\n\t// Events\n\tthis.connect( this, { click: 'onAction' } );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-popupButtonWidget' )\n\t\t.attr( 'aria-haspopup', 'true' );\n\tthis.popup.$element\n\t\t.addClass( 'oo-ui-popupButtonWidget-popup' )\n\t\t.toggleClass( 'oo-ui-popupButtonWidget-framed-popup', this.isFramed() )\n\t\t.toggleClass( 'oo-ui-popupButtonWidget-frameless-popup', !this.isFramed() );\n\tthis.$overlay.append( this.popup.$element );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.PopupButtonWidget, OO.ui.ButtonWidget );\nOO.mixinClass( OO.ui.PopupButtonWidget, OO.ui.mixin.PopupElement );\n\n/* Methods */\n\n/**\n * Handle the button action being triggered.\n *\n * @private\n */\nOO.ui.PopupButtonWidget.prototype.onAction = function () {\n\tthis.popup.toggle();\n};\n","/**\n * Mixin for OO.ui.Widget subclasses to provide OO.ui.mixin.GroupElement.\n *\n * Use together with OO.ui.mixin.ItemWidget to make disabled state inheritable.\n *\n * @private\n * @abstract\n * @class\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.mixin.GroupWidget = function OoUiMixinGroupWidget( config ) {\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, config );\n};\n\n/* Setup */\n\nOO.mixinClass( OO.ui.mixin.GroupWidget, OO.ui.mixin.GroupElement );\n\n/* Methods */\n\n/**\n * Set the disabled state of the widget.\n *\n * This will also update the disabled state of child widgets.\n *\n * @param {boolean} disabled Disable widget\n * @chainable\n */\nOO.ui.mixin.GroupWidget.prototype.setDisabled = function ( disabled ) {\n\tvar i, len;\n\n\t// Parent method\n\t// Note: Calling #setDisabled this way assumes this is mixed into an OO.ui.Widget\n\tOO.ui.Widget.prototype.setDisabled.call( this, disabled );\n\n\t// During construction, #setDisabled is called before the OO.ui.mixin.GroupElement constructor\n\tif ( this.items ) {\n\t\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\t\tthis.items[ i ].updateDisabled();\n\t\t}\n\t}\n\n\treturn this;\n};\n","/**\n * Mixin for widgets used as items in widgets that mix in OO.ui.mixin.GroupWidget.\n *\n * Item widgets have a reference to a OO.ui.mixin.GroupWidget while they are attached to the group. This\n * allows bidirectional communication.\n *\n * Use together with OO.ui.mixin.GroupWidget to make disabled state inheritable.\n *\n * @private\n * @abstract\n * @class\n *\n * @constructor\n */\nOO.ui.mixin.ItemWidget = function OoUiMixinItemWidget() {\n\t//\n};\n\n/* Methods */\n\n/**\n * Check if widget is disabled.\n *\n * Checks parent if present, making disabled state inheritable.\n *\n * @return {boolean} Widget is disabled\n */\nOO.ui.mixin.ItemWidget.prototype.isDisabled = function () {\n\treturn this.disabled ||\n\t\t( this.elementGroup instanceof OO.ui.Widget && this.elementGroup.isDisabled() );\n};\n\n/**\n * Set group element is in.\n *\n * @param {OO.ui.mixin.GroupElement|null} group Group element, null if none\n * @chainable\n */\nOO.ui.mixin.ItemWidget.prototype.setElementGroup = function ( group ) {\n\t// Parent method\n\t// Note: Calling #setElementGroup this way assumes this is mixed into an OO.ui.Element\n\tOO.ui.Element.prototype.setElementGroup.call( this, group );\n\n\t// Initialize item disabled states\n\tthis.updateDisabled();\n\n\treturn this;\n};\n","/**\n * OptionWidgets are special elements that can be selected and configured with data. The\n * data is often unique for each option, but it does not have to be. OptionWidgets are used\n * with OO.ui.SelectWidget to create a selection of mutually exclusive options. For more information\n * and examples, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.ItemWidget\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.FlaggedElement\n * @mixins OO.ui.mixin.AccessKeyedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.OptionWidget = function OoUiOptionWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.OptionWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ItemWidget.call( this );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\tOO.ui.mixin.FlaggedElement.call( this, config );\n\tOO.ui.mixin.AccessKeyedElement.call( this, config );\n\n\t// Properties\n\tthis.selected = false;\n\tthis.highlighted = false;\n\tthis.pressed = false;\n\n\t// Initialization\n\tthis.$element\n\t\t.data( 'oo-ui-optionWidget', this )\n\t\t// Allow programmatic focussing (and by accesskey), but not tabbing\n\t\t.attr( 'tabindex', '-1' )\n\t\t.attr( 'role', 'option' )\n\t\t.attr( 'aria-selected', 'false' )\n\t\t.addClass( 'oo-ui-optionWidget' )\n\t\t.append( this.$label );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.OptionWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.OptionWidget, OO.ui.mixin.ItemWidget );\nOO.mixinClass( OO.ui.OptionWidget, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.OptionWidget, OO.ui.mixin.FlaggedElement );\nOO.mixinClass( OO.ui.OptionWidget, OO.ui.mixin.AccessKeyedElement );\n\n/* Static Properties */\n\n/**\n * Whether this option can be selected. See #setSelected.\n *\n * @static\n * @inheritable\n * @property {boolean}\n */\nOO.ui.OptionWidget.static.selectable = true;\n\n/**\n * Whether this option can be highlighted. See #setHighlighted.\n *\n * @static\n * @inheritable\n * @property {boolean}\n */\nOO.ui.OptionWidget.static.highlightable = true;\n\n/**\n * Whether this option can be pressed. See #setPressed.\n *\n * @static\n * @inheritable\n * @property {boolean}\n */\nOO.ui.OptionWidget.static.pressable = true;\n\n/**\n * Whether this option will be scrolled into view when it is selected.\n *\n * @static\n * @inheritable\n * @property {boolean}\n */\nOO.ui.OptionWidget.static.scrollIntoViewOnSelect = false;\n\n/* Methods */\n\n/**\n * Check if the option can be selected.\n *\n * @return {boolean} Item is selectable\n */\nOO.ui.OptionWidget.prototype.isSelectable = function () {\n\treturn this.constructor.static.selectable && !this.isDisabled() && this.isVisible();\n};\n\n/**\n * Check if the option can be highlighted. A highlight indicates that the option\n * may be selected when a user presses enter or clicks. Disabled items cannot\n * be highlighted.\n *\n * @return {boolean} Item is highlightable\n */\nOO.ui.OptionWidget.prototype.isHighlightable = function () {\n\treturn this.constructor.static.highlightable && !this.isDisabled() && this.isVisible();\n};\n\n/**\n * Check if the option can be pressed. The pressed state occurs when a user mouses\n * down on an item, but has not yet let go of the mouse.\n *\n * @return {boolean} Item is pressable\n */\nOO.ui.OptionWidget.prototype.isPressable = function () {\n\treturn this.constructor.static.pressable && !this.isDisabled() && this.isVisible();\n};\n\n/**\n * Check if the option is selected.\n *\n * @return {boolean} Item is selected\n */\nOO.ui.OptionWidget.prototype.isSelected = function () {\n\treturn this.selected;\n};\n\n/**\n * Check if the option is highlighted. A highlight indicates that the\n * item may be selected when a user presses enter or clicks.\n *\n * @return {boolean} Item is highlighted\n */\nOO.ui.OptionWidget.prototype.isHighlighted = function () {\n\treturn this.highlighted;\n};\n\n/**\n * Check if the option is pressed. The pressed state occurs when a user mouses\n * down on an item, but has not yet let go of the mouse. The item may appear\n * selected, but it will not be selected until the user releases the mouse.\n *\n * @return {boolean} Item is pressed\n */\nOO.ui.OptionWidget.prototype.isPressed = function () {\n\treturn this.pressed;\n};\n\n/**\n * Set the option’s selected state. In general, all modifications to the selection\n * should be handled by the SelectWidget’s {@link OO.ui.SelectWidget#selectItem selectItem( [item] )}\n * method instead of this method.\n *\n * @param {boolean} [state=false] Select option\n * @chainable\n */\nOO.ui.OptionWidget.prototype.setSelected = function ( state ) {\n\tif ( this.constructor.static.selectable ) {\n\t\tthis.selected = !!state;\n\t\tthis.$element\n\t\t\t.toggleClass( 'oo-ui-optionWidget-selected', state )\n\t\t\t.attr( 'aria-selected', state.toString() );\n\t\tif ( state && this.constructor.static.scrollIntoViewOnSelect ) {\n\t\t\tthis.scrollElementIntoView();\n\t\t}\n\t\tthis.updateThemeClasses();\n\t}\n\treturn this;\n};\n\n/**\n * Set the option’s highlighted state. In general, all programmatic\n * modifications to the highlight should be handled by the\n * SelectWidget’s {@link OO.ui.SelectWidget#highlightItem highlightItem( [item] )}\n * method instead of this method.\n *\n * @param {boolean} [state=false] Highlight option\n * @chainable\n */\nOO.ui.OptionWidget.prototype.setHighlighted = function ( state ) {\n\tif ( this.constructor.static.highlightable ) {\n\t\tthis.highlighted = !!state;\n\t\tthis.$element.toggleClass( 'oo-ui-optionWidget-highlighted', state );\n\t\tthis.updateThemeClasses();\n\t}\n\treturn this;\n};\n\n/**\n * Set the option’s pressed state. In general, all\n * programmatic modifications to the pressed state should be handled by the\n * SelectWidget’s {@link OO.ui.SelectWidget#pressItem pressItem( [item] )}\n * method instead of this method.\n *\n * @param {boolean} [state=false] Press option\n * @chainable\n */\nOO.ui.OptionWidget.prototype.setPressed = function ( state ) {\n\tif ( this.constructor.static.pressable ) {\n\t\tthis.pressed = !!state;\n\t\tthis.$element.toggleClass( 'oo-ui-optionWidget-pressed', state );\n\t\tthis.updateThemeClasses();\n\t}\n\treturn this;\n};\n\n/**\n * Get text to match search strings against.\n *\n * The default implementation returns the label text, but subclasses\n * can override this to provide more complex behavior.\n *\n * @return {string|boolean} String to match search string against\n */\nOO.ui.OptionWidget.prototype.getMatchText = function () {\n\tvar label = this.getLabel();\n\treturn typeof label === 'string' ? label : this.$label.text();\n};\n","/**\n * A SelectWidget is of a generic selection of options. The OOjs UI library contains several types of\n * select widgets, including {@link OO.ui.ButtonSelectWidget button selects},\n * {@link OO.ui.RadioSelectWidget radio selects}, and {@link OO.ui.MenuSelectWidget\n * menu selects}.\n *\n * This class should be used together with OO.ui.OptionWidget or OO.ui.DecoratedOptionWidget. For more\n * information, please see the [OOjs UI documentation on MediaWiki][1].\n *\n *     @example\n *     // Example of a select widget with three options\n *     var select = new OO.ui.SelectWidget( {\n *         items: [\n *             new OO.ui.OptionWidget( {\n *                 data: 'a',\n *                 label: 'Option One',\n *             } ),\n *             new OO.ui.OptionWidget( {\n *                 data: 'b',\n *                 label: 'Option Two',\n *             } ),\n *             new OO.ui.OptionWidget( {\n *                 data: 'c',\n *                 label: 'Option Three',\n *             } )\n *         ]\n *     } );\n *     $( 'body' ).append( select.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options\n *\n * @abstract\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.GroupWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {OO.ui.OptionWidget[]} [items] An array of options to add to the select.\n *  Options are created with {@link OO.ui.OptionWidget OptionWidget} classes. See\n *  the [OOjs UI documentation on MediaWiki] [2] for examples.\n *  [2]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options\n */\nOO.ui.SelectWidget = function OoUiSelectWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.SelectWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupWidget.call( this, $.extend( {}, config, { $group: this.$element } ) );\n\n\t// Properties\n\tthis.pressed = false;\n\tthis.selecting = null;\n\tthis.onMouseUpHandler = this.onMouseUp.bind( this );\n\tthis.onMouseMoveHandler = this.onMouseMove.bind( this );\n\tthis.onKeyDownHandler = this.onKeyDown.bind( this );\n\tthis.onKeyPressHandler = this.onKeyPress.bind( this );\n\tthis.keyPressBuffer = '';\n\tthis.keyPressBufferTimer = null;\n\tthis.blockMouseOverEvents = 0;\n\n\t// Events\n\tthis.connect( this, {\n\t\ttoggle: 'onToggle'\n\t} );\n\tthis.$element.on( {\n\t\tfocusin: this.onFocus.bind( this ),\n\t\tmousedown: this.onMouseDown.bind( this ),\n\t\tmouseover: this.onMouseOver.bind( this ),\n\t\tmouseleave: this.onMouseLeave.bind( this )\n\t} );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-selectWidget oo-ui-selectWidget-depressed' )\n\t\t.attr( 'role', 'listbox' );\n\tthis.setFocusOwner( this.$element );\n\tif ( Array.isArray( config.items ) ) {\n\t\tthis.addItems( config.items );\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.SelectWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.SelectWidget, OO.ui.mixin.GroupWidget );\n\n/* Events */\n\n/**\n * @event highlight\n *\n * A `highlight` event is emitted when the highlight is changed with the #highlightItem method.\n *\n * @param {OO.ui.OptionWidget|null} item Highlighted item\n */\n\n/**\n * @event press\n *\n * A `press` event is emitted when the #pressItem method is used to programmatically modify the\n * pressed state of an option.\n *\n * @param {OO.ui.OptionWidget|null} item Pressed item\n */\n\n/**\n * @event select\n *\n * A `select` event is emitted when the selection is modified programmatically with the #selectItem method.\n *\n * @param {OO.ui.OptionWidget|null} item Selected item\n */\n\n/**\n * @event choose\n * A `choose` event is emitted when an item is chosen with the #chooseItem method.\n * @param {OO.ui.OptionWidget} item Chosen item\n */\n\n/**\n * @event add\n *\n * An `add` event is emitted when options are added to the select with the #addItems method.\n *\n * @param {OO.ui.OptionWidget[]} items Added items\n * @param {number} index Index of insertion point\n */\n\n/**\n * @event remove\n *\n * A `remove` event is emitted when options are removed from the select with the #clearItems\n * or #removeItems methods.\n *\n * @param {OO.ui.OptionWidget[]} items Removed items\n */\n\n/* Methods */\n\n/**\n * Handle focus events\n *\n * @private\n * @param {jQuery.Event} event\n */\nOO.ui.SelectWidget.prototype.onFocus = function ( event ) {\n\tvar item;\n\tif ( event.target === this.$element[ 0 ] ) {\n\t\t// This widget was focussed, e.g. by the user tabbing to it.\n\t\t// The styles for focus state depend on one of the items being selected.\n\t\tif ( !this.getSelectedItem() ) {\n\t\t\titem = this.getFirstSelectableItem();\n\t\t}\n\t} else {\n\t\t// One of the options got focussed (and the event bubbled up here).\n\t\t// They can't be tabbed to, but they can be activated using accesskeys.\n\t\titem = this.getTargetItem( event );\n\t}\n\n\tif ( item ) {\n\t\tif ( item.constructor.static.highlightable ) {\n\t\t\tthis.highlightItem( item );\n\t\t} else {\n\t\t\tthis.selectItem( item );\n\t\t}\n\t}\n\n\tif ( event.target !== this.$element[ 0 ] ) {\n\t\tthis.$focusOwner.focus();\n\t}\n};\n\n/**\n * Handle mouse down events.\n *\n * @private\n * @param {jQuery.Event} e Mouse down event\n */\nOO.ui.SelectWidget.prototype.onMouseDown = function ( e ) {\n\tvar item;\n\n\tif ( !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) {\n\t\tthis.togglePressed( true );\n\t\titem = this.getTargetItem( e );\n\t\tif ( item && item.isSelectable() ) {\n\t\t\tthis.pressItem( item );\n\t\t\tthis.selecting = item;\n\t\t\tthis.getElementDocument().addEventListener( 'mouseup', this.onMouseUpHandler, true );\n\t\t\tthis.getElementDocument().addEventListener( 'mousemove', this.onMouseMoveHandler, true );\n\t\t}\n\t}\n\treturn false;\n};\n\n/**\n * Handle mouse up events.\n *\n * @private\n * @param {MouseEvent} e Mouse up event\n */\nOO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {\n\tvar item;\n\n\tthis.togglePressed( false );\n\tif ( !this.selecting ) {\n\t\titem = this.getTargetItem( e );\n\t\tif ( item && item.isSelectable() ) {\n\t\t\tthis.selecting = item;\n\t\t}\n\t}\n\tif ( !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT && this.selecting ) {\n\t\tthis.pressItem( null );\n\t\tthis.chooseItem( this.selecting );\n\t\tthis.selecting = null;\n\t}\n\n\tthis.getElementDocument().removeEventListener( 'mouseup', this.onMouseUpHandler, true );\n\tthis.getElementDocument().removeEventListener( 'mousemove', this.onMouseMoveHandler, true );\n\n\treturn false;\n};\n\n/**\n * Handle mouse move events.\n *\n * @private\n * @param {MouseEvent} e Mouse move event\n */\nOO.ui.SelectWidget.prototype.onMouseMove = function ( e ) {\n\tvar item;\n\n\tif ( !this.isDisabled() && this.pressed ) {\n\t\titem = this.getTargetItem( e );\n\t\tif ( item && item !== this.selecting && item.isSelectable() ) {\n\t\t\tthis.pressItem( item );\n\t\t\tthis.selecting = item;\n\t\t}\n\t}\n};\n\n/**\n * Handle mouse over events.\n *\n * @private\n * @param {jQuery.Event} e Mouse over event\n */\nOO.ui.SelectWidget.prototype.onMouseOver = function ( e ) {\n\tvar item;\n\tif ( this.blockMouseOverEvents ) {\n\t\treturn;\n\t}\n\tif ( !this.isDisabled() ) {\n\t\titem = this.getTargetItem( e );\n\t\tthis.highlightItem( item && item.isHighlightable() ? item : null );\n\t}\n\treturn false;\n};\n\n/**\n * Handle mouse leave events.\n *\n * @private\n * @param {jQuery.Event} e Mouse over event\n */\nOO.ui.SelectWidget.prototype.onMouseLeave = function () {\n\tif ( !this.isDisabled() ) {\n\t\tthis.highlightItem( null );\n\t}\n\treturn false;\n};\n\n/**\n * Handle key down events.\n *\n * @protected\n * @param {KeyboardEvent} e Key down event\n */\nOO.ui.SelectWidget.prototype.onKeyDown = function ( e ) {\n\tvar nextItem,\n\t\thandled = false,\n\t\tcurrentItem = this.getHighlightedItem() || this.getSelectedItem();\n\n\tif ( !this.isDisabled() && this.isVisible() ) {\n\t\tswitch ( e.keyCode ) {\n\t\t\tcase OO.ui.Keys.ENTER:\n\t\t\t\tif ( currentItem && currentItem.constructor.static.highlightable ) {\n\t\t\t\t\t// Was only highlighted, now let's select it. No-op if already selected.\n\t\t\t\t\tthis.chooseItem( currentItem );\n\t\t\t\t\thandled = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase OO.ui.Keys.UP:\n\t\t\tcase OO.ui.Keys.LEFT:\n\t\t\t\tthis.clearKeyPressBuffer();\n\t\t\t\tnextItem = this.getRelativeSelectableItem( currentItem, -1 );\n\t\t\t\thandled = true;\n\t\t\t\tbreak;\n\t\t\tcase OO.ui.Keys.DOWN:\n\t\t\tcase OO.ui.Keys.RIGHT:\n\t\t\t\tthis.clearKeyPressBuffer();\n\t\t\t\tnextItem = this.getRelativeSelectableItem( currentItem, 1 );\n\t\t\t\thandled = true;\n\t\t\t\tbreak;\n\t\t\tcase OO.ui.Keys.ESCAPE:\n\t\t\tcase OO.ui.Keys.TAB:\n\t\t\t\tif ( currentItem && currentItem.constructor.static.highlightable ) {\n\t\t\t\t\tcurrentItem.setHighlighted( false );\n\t\t\t\t}\n\t\t\t\tthis.unbindKeyDownListener();\n\t\t\t\tthis.unbindKeyPressListener();\n\t\t\t\t// Don't prevent tabbing away / defocusing\n\t\t\t\thandled = false;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( nextItem ) {\n\t\t\tif ( nextItem.constructor.static.highlightable ) {\n\t\t\t\tthis.highlightItem( nextItem );\n\t\t\t} else {\n\t\t\t\tthis.chooseItem( nextItem );\n\t\t\t}\n\t\t\tthis.scrollItemIntoView( nextItem );\n\t\t}\n\n\t\tif ( handled ) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\t}\n};\n\n/**\n * Bind key down listener.\n *\n * @protected\n */\nOO.ui.SelectWidget.prototype.bindKeyDownListener = function () {\n\tthis.getElementWindow().addEventListener( 'keydown', this.onKeyDownHandler, true );\n};\n\n/**\n * Unbind key down listener.\n *\n * @protected\n */\nOO.ui.SelectWidget.prototype.unbindKeyDownListener = function () {\n\tthis.getElementWindow().removeEventListener( 'keydown', this.onKeyDownHandler, true );\n};\n\n/**\n * Scroll item into view, preventing spurious mouse highlight actions from happening.\n *\n * @param {OO.ui.OptionWidget} item Item to scroll into view\n */\nOO.ui.SelectWidget.prototype.scrollItemIntoView = function ( item ) {\n\tvar widget = this;\n\t// Chromium's Blink engine will generate spurious 'mouseover' events during programmatic scrolling\n\t// and around 100-150 ms after it is finished.\n\tthis.blockMouseOverEvents++;\n\titem.scrollElementIntoView().done( function () {\n\t\tsetTimeout( function () {\n\t\t\twidget.blockMouseOverEvents--;\n\t\t}, 200 );\n\t} );\n};\n\n/**\n * Clear the key-press buffer\n *\n * @protected\n */\nOO.ui.SelectWidget.prototype.clearKeyPressBuffer = function () {\n\tif ( this.keyPressBufferTimer ) {\n\t\tclearTimeout( this.keyPressBufferTimer );\n\t\tthis.keyPressBufferTimer = null;\n\t}\n\tthis.keyPressBuffer = '';\n};\n\n/**\n * Handle key press events.\n *\n * @protected\n * @param {KeyboardEvent} e Key press event\n */\nOO.ui.SelectWidget.prototype.onKeyPress = function ( e ) {\n\tvar c, filter, item;\n\n\tif ( !e.charCode ) {\n\t\tif ( e.keyCode === OO.ui.Keys.BACKSPACE && this.keyPressBuffer !== '' ) {\n\t\t\tthis.keyPressBuffer = this.keyPressBuffer.substr( 0, this.keyPressBuffer.length - 1 );\n\t\t\treturn false;\n\t\t}\n\t\treturn;\n\t}\n\tif ( String.fromCodePoint ) {\n\t\tc = String.fromCodePoint( e.charCode );\n\t} else {\n\t\tc = String.fromCharCode( e.charCode );\n\t}\n\n\tif ( this.keyPressBufferTimer ) {\n\t\tclearTimeout( this.keyPressBufferTimer );\n\t}\n\tthis.keyPressBufferTimer = setTimeout( this.clearKeyPressBuffer.bind( this ), 1500 );\n\n\titem = this.getHighlightedItem() || this.getSelectedItem();\n\n\tif ( this.keyPressBuffer === c ) {\n\t\t// Common (if weird) special case: typing \"xxxx\" will cycle through all\n\t\t// the items beginning with \"x\".\n\t\tif ( item ) {\n\t\t\titem = this.getRelativeSelectableItem( item, 1 );\n\t\t}\n\t} else {\n\t\tthis.keyPressBuffer += c;\n\t}\n\n\tfilter = this.getItemMatcher( this.keyPressBuffer, false );\n\tif ( !item || !filter( item ) ) {\n\t\titem = this.getRelativeSelectableItem( item, 1, filter );\n\t}\n\tif ( item ) {\n\t\tif ( this.isVisible() && item.constructor.static.highlightable ) {\n\t\t\tthis.highlightItem( item );\n\t\t} else {\n\t\t\tthis.chooseItem( item );\n\t\t}\n\t\tthis.scrollItemIntoView( item );\n\t}\n\n\te.preventDefault();\n\te.stopPropagation();\n};\n\n/**\n * Get a matcher for the specific string\n *\n * @protected\n * @param {string} s String to match against items\n * @param {boolean} [exact=false] Only accept exact matches\n * @return {Function} function ( OO.ui.OptionWidget ) => boolean\n */\nOO.ui.SelectWidget.prototype.getItemMatcher = function ( s, exact ) {\n\tvar re;\n\n\tif ( s.normalize ) {\n\t\ts = s.normalize();\n\t}\n\ts = exact ? s.trim() : s.replace( /^\\s+/, '' );\n\tre = '^\\\\s*' + s.replace( /([\\\\{}()|.?*+\\-\\^$\\[\\]])/g, '\\\\$1' ).replace( /\\s+/g, '\\\\s+' );\n\tif ( exact ) {\n\t\tre += '\\\\s*$';\n\t}\n\tre = new RegExp( re, 'i' );\n\treturn function ( item ) {\n\t\tvar matchText = item.getMatchText();\n\t\tif ( matchText.normalize ) {\n\t\t\tmatchText = matchText.normalize();\n\t\t}\n\t\treturn re.test( matchText );\n\t};\n};\n\n/**\n * Bind key press listener.\n *\n * @protected\n */\nOO.ui.SelectWidget.prototype.bindKeyPressListener = function () {\n\tthis.getElementWindow().addEventListener( 'keypress', this.onKeyPressHandler, true );\n};\n\n/**\n * Unbind key down listener.\n *\n * If you override this, be sure to call this.clearKeyPressBuffer() from your\n * implementation.\n *\n * @protected\n */\nOO.ui.SelectWidget.prototype.unbindKeyPressListener = function () {\n\tthis.getElementWindow().removeEventListener( 'keypress', this.onKeyPressHandler, true );\n\tthis.clearKeyPressBuffer();\n};\n\n/**\n * Visibility change handler\n *\n * @protected\n * @param {boolean} visible\n */\nOO.ui.SelectWidget.prototype.onToggle = function ( visible ) {\n\tif ( !visible ) {\n\t\tthis.clearKeyPressBuffer();\n\t}\n};\n\n/**\n * Get the closest item to a jQuery.Event.\n *\n * @private\n * @param {jQuery.Event} e\n * @return {OO.ui.OptionWidget|null} Outline item widget, `null` if none was found\n */\nOO.ui.SelectWidget.prototype.getTargetItem = function ( e ) {\n\treturn $( e.target ).closest( '.oo-ui-optionWidget' ).data( 'oo-ui-optionWidget' ) || null;\n};\n\n/**\n * Get selected item.\n *\n * @return {OO.ui.OptionWidget|null} Selected item, `null` if no item is selected\n */\nOO.ui.SelectWidget.prototype.getSelectedItem = function () {\n\tvar i, len;\n\n\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\tif ( this.items[ i ].isSelected() ) {\n\t\t\treturn this.items[ i ];\n\t\t}\n\t}\n\treturn null;\n};\n\n/**\n * Get highlighted item.\n *\n * @return {OO.ui.OptionWidget|null} Highlighted item, `null` if no item is highlighted\n */\nOO.ui.SelectWidget.prototype.getHighlightedItem = function () {\n\tvar i, len;\n\n\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\tif ( this.items[ i ].isHighlighted() ) {\n\t\t\treturn this.items[ i ];\n\t\t}\n\t}\n\treturn null;\n};\n\n/**\n * Toggle pressed state.\n *\n * Press is a state that occurs when a user mouses down on an item, but\n * has not yet let go of the mouse. The item may appear selected, but it will not be selected\n * until the user releases the mouse.\n *\n * @param {boolean} pressed An option is being pressed\n */\nOO.ui.SelectWidget.prototype.togglePressed = function ( pressed ) {\n\tif ( pressed === undefined ) {\n\t\tpressed = !this.pressed;\n\t}\n\tif ( pressed !== this.pressed ) {\n\t\tthis.$element\n\t\t\t.toggleClass( 'oo-ui-selectWidget-pressed', pressed )\n\t\t\t.toggleClass( 'oo-ui-selectWidget-depressed', !pressed );\n\t\tthis.pressed = pressed;\n\t}\n};\n\n/**\n * Highlight an option. If the `item` param is omitted, no options will be highlighted\n * and any existing highlight will be removed. The highlight is mutually exclusive.\n *\n * @param {OO.ui.OptionWidget} [item] Item to highlight, omit for no highlight\n * @fires highlight\n * @chainable\n */\nOO.ui.SelectWidget.prototype.highlightItem = function ( item ) {\n\tvar i, len, highlighted,\n\t\tchanged = false;\n\n\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\thighlighted = this.items[ i ] === item;\n\t\tif ( this.items[ i ].isHighlighted() !== highlighted ) {\n\t\t\tthis.items[ i ].setHighlighted( highlighted );\n\t\t\tchanged = true;\n\t\t}\n\t}\n\tif ( changed ) {\n\t\tif ( item ) {\n\t\t\tthis.$focusOwner.attr( 'aria-activedescendant', item.getElementId() );\n\t\t} else {\n\t\t\tthis.$focusOwner.removeAttr( 'aria-activedescendant' );\n\t\t}\n\t\tthis.emit( 'highlight', item );\n\t}\n\n\treturn this;\n};\n\n/**\n * Fetch an item by its label.\n *\n * @param {string} label Label of the item to select.\n * @param {boolean} [prefix=false] Allow a prefix match, if only a single item matches\n * @return {OO.ui.Element|null} Item with equivalent label, `null` if none exists\n */\nOO.ui.SelectWidget.prototype.getItemFromLabel = function ( label, prefix ) {\n\tvar i, item, found,\n\t\tlen = this.items.length,\n\t\tfilter = this.getItemMatcher( label, true );\n\n\tfor ( i = 0; i < len; i++ ) {\n\t\titem = this.items[ i ];\n\t\tif ( item instanceof OO.ui.OptionWidget && item.isSelectable() && filter( item ) ) {\n\t\t\treturn item;\n\t\t}\n\t}\n\n\tif ( prefix ) {\n\t\tfound = null;\n\t\tfilter = this.getItemMatcher( label, false );\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\titem = this.items[ i ];\n\t\t\tif ( item instanceof OO.ui.OptionWidget && item.isSelectable() && filter( item ) ) {\n\t\t\t\tif ( found ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tfound = item;\n\t\t\t}\n\t\t}\n\t\tif ( found ) {\n\t\t\treturn found;\n\t\t}\n\t}\n\n\treturn null;\n};\n\n/**\n * Programmatically select an option by its label. If the item does not exist,\n * all options will be deselected.\n *\n * @param {string} [label] Label of the item to select.\n * @param {boolean} [prefix=false] Allow a prefix match, if only a single item matches\n * @fires select\n * @chainable\n */\nOO.ui.SelectWidget.prototype.selectItemByLabel = function ( label, prefix ) {\n\tvar itemFromLabel = this.getItemFromLabel( label, !!prefix );\n\tif ( label === undefined || !itemFromLabel ) {\n\t\treturn this.selectItem();\n\t}\n\treturn this.selectItem( itemFromLabel );\n};\n\n/**\n * Programmatically select an option by its data. If the `data` parameter is omitted,\n * or if the item does not exist, all options will be deselected.\n *\n * @param {Object|string} [data] Value of the item to select, omit to deselect all\n * @fires select\n * @chainable\n */\nOO.ui.SelectWidget.prototype.selectItemByData = function ( data ) {\n\tvar itemFromData = this.getItemFromData( data );\n\tif ( data === undefined || !itemFromData ) {\n\t\treturn this.selectItem();\n\t}\n\treturn this.selectItem( itemFromData );\n};\n\n/**\n * Programmatically select an option by its reference. If the `item` parameter is omitted,\n * all options will be deselected.\n *\n * @param {OO.ui.OptionWidget} [item] Item to select, omit to deselect all\n * @fires select\n * @chainable\n */\nOO.ui.SelectWidget.prototype.selectItem = function ( item ) {\n\tvar i, len, selected,\n\t\tchanged = false;\n\n\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\tselected = this.items[ i ] === item;\n\t\tif ( this.items[ i ].isSelected() !== selected ) {\n\t\t\tthis.items[ i ].setSelected( selected );\n\t\t\tchanged = true;\n\t\t}\n\t}\n\tif ( changed ) {\n\t\tif ( item && !item.constructor.static.highlightable ) {\n\t\t\tif ( item ) {\n\t\t\t\tthis.$focusOwner.attr( 'aria-activedescendant', item.getElementId() );\n\t\t\t} else {\n\t\t\t\tthis.$focusOwner.removeAttr( 'aria-activedescendant' );\n\t\t\t}\n\t\t}\n\t\tthis.emit( 'select', item );\n\t}\n\n\treturn this;\n};\n\n/**\n * Press an item.\n *\n * Press is a state that occurs when a user mouses down on an item, but has not\n * yet let go of the mouse. The item may appear selected, but it will not be selected until the user\n * releases the mouse.\n *\n * @param {OO.ui.OptionWidget} [item] Item to press, omit to depress all\n * @fires press\n * @chainable\n */\nOO.ui.SelectWidget.prototype.pressItem = function ( item ) {\n\tvar i, len, pressed,\n\t\tchanged = false;\n\n\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\tpressed = this.items[ i ] === item;\n\t\tif ( this.items[ i ].isPressed() !== pressed ) {\n\t\t\tthis.items[ i ].setPressed( pressed );\n\t\t\tchanged = true;\n\t\t}\n\t}\n\tif ( changed ) {\n\t\tthis.emit( 'press', item );\n\t}\n\n\treturn this;\n};\n\n/**\n * Choose an item.\n *\n * Note that ‘choose’ should never be modified programmatically. A user can choose\n * an option with the keyboard or mouse and it becomes selected. To select an item programmatically,\n * use the #selectItem method.\n *\n * This method is identical to #selectItem, but may vary in subclasses that take additional action\n * when users choose an item with the keyboard or mouse.\n *\n * @param {OO.ui.OptionWidget} item Item to choose\n * @fires choose\n * @chainable\n */\nOO.ui.SelectWidget.prototype.chooseItem = function ( item ) {\n\tif ( item ) {\n\t\tthis.selectItem( item );\n\t\tthis.emit( 'choose', item );\n\t}\n\n\treturn this;\n};\n\n/**\n * Get an option by its position relative to the specified item (or to the start of the option array,\n * if item is `null`). The direction in which to search through the option array is specified with a\n * number: -1 for reverse (the default) or 1 for forward. The method will return an option, or\n * `null` if there are no options in the array.\n *\n * @param {OO.ui.OptionWidget|null} item Item to describe the start position, or `null` to start at the beginning of the array.\n * @param {number} direction Direction to move in: -1 to move backward, 1 to move forward\n * @param {Function} [filter] Only consider items for which this function returns\n *  true. Function takes an OO.ui.OptionWidget and returns a boolean.\n * @return {OO.ui.OptionWidget|null} Item at position, `null` if there are no items in the select\n */\nOO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direction, filter ) {\n\tvar currentIndex, nextIndex, i,\n\t\tincrease = direction > 0 ? 1 : -1,\n\t\tlen = this.items.length;\n\n\tif ( item instanceof OO.ui.OptionWidget ) {\n\t\tcurrentIndex = this.items.indexOf( item );\n\t\tnextIndex = ( currentIndex + increase + len ) % len;\n\t} else {\n\t\t// If no item is selected and moving forward, start at the beginning.\n\t\t// If moving backward, start at the end.\n\t\tnextIndex = direction > 0 ? 0 : len - 1;\n\t}\n\n\tfor ( i = 0; i < len; i++ ) {\n\t\titem = this.items[ nextIndex ];\n\t\tif (\n\t\t\titem instanceof OO.ui.OptionWidget && item.isSelectable() &&\n\t\t\t( !filter || filter( item ) )\n\t\t) {\n\t\t\treturn item;\n\t\t}\n\t\tnextIndex = ( nextIndex + increase + len ) % len;\n\t}\n\treturn null;\n};\n\n/**\n * Get the next selectable item or `null` if there are no selectable items.\n * Disabled options and menu-section markers and breaks are not selectable.\n *\n * @return {OO.ui.OptionWidget|null} Item, `null` if there aren't any selectable items\n */\nOO.ui.SelectWidget.prototype.getFirstSelectableItem = function () {\n\treturn this.getRelativeSelectableItem( null, 1 );\n};\n\n/**\n * Add an array of options to the select. Optionally, an index number can be used to\n * specify an insertion point.\n *\n * @param {OO.ui.OptionWidget[]} items Items to add\n * @param {number} [index] Index to insert items after\n * @fires add\n * @chainable\n */\nOO.ui.SelectWidget.prototype.addItems = function ( items, index ) {\n\t// Mixin method\n\tOO.ui.mixin.GroupWidget.prototype.addItems.call( this, items, index );\n\n\t// Always provide an index, even if it was omitted\n\tthis.emit( 'add', items, index === undefined ? this.items.length - items.length - 1 : index );\n\n\treturn this;\n};\n\n/**\n * Remove the specified array of options from the select. Options will be detached\n * from the DOM, not removed, so they can be reused later. To remove all options from\n * the select, you may wish to use the #clearItems method instead.\n *\n * @param {OO.ui.OptionWidget[]} items Items to remove\n * @fires remove\n * @chainable\n */\nOO.ui.SelectWidget.prototype.removeItems = function ( items ) {\n\tvar i, len, item;\n\n\t// Deselect items being removed\n\tfor ( i = 0, len = items.length; i < len; i++ ) {\n\t\titem = items[ i ];\n\t\tif ( item.isSelected() ) {\n\t\t\tthis.selectItem( null );\n\t\t}\n\t}\n\n\t// Mixin method\n\tOO.ui.mixin.GroupWidget.prototype.removeItems.call( this, items );\n\n\tthis.emit( 'remove', items );\n\n\treturn this;\n};\n\n/**\n * Clear all options from the select. Options will be detached from the DOM, not removed,\n * so that they can be reused later. To remove a subset of options from the select, use\n * the #removeItems method.\n *\n * @fires remove\n * @chainable\n */\nOO.ui.SelectWidget.prototype.clearItems = function () {\n\tvar items = this.items.slice();\n\n\t// Mixin method\n\tOO.ui.mixin.GroupWidget.prototype.clearItems.call( this );\n\n\t// Clear selection\n\tthis.selectItem( null );\n\n\tthis.emit( 'remove', items );\n\n\treturn this;\n};\n\n/**\n * Set the DOM element which has focus while the user is interacting with this SelectWidget.\n *\n * Currently this is just used to set `aria-activedescendant` on it.\n *\n * @protected\n * @param {jQuery} $focusOwner\n */\nOO.ui.SelectWidget.prototype.setFocusOwner = function ( $focusOwner ) {\n\tthis.$focusOwner = $focusOwner;\n};\n","/**\n * DecoratedOptionWidgets are {@link OO.ui.OptionWidget options} that can be configured\n * with an {@link OO.ui.mixin.IconElement icon} and/or {@link OO.ui.mixin.IndicatorElement indicator}.\n * This class is used with OO.ui.SelectWidget to create a selection of mutually exclusive\n * options. For more information about options and selects, please see the\n * [OOjs UI documentation on MediaWiki][1].\n *\n *     @example\n *     // Decorated options in a select widget\n *     var select = new OO.ui.SelectWidget( {\n *         items: [\n *             new OO.ui.DecoratedOptionWidget( {\n *                 data: 'a',\n *                 label: 'Option with icon',\n *                 icon: 'help'\n *             } ),\n *             new OO.ui.DecoratedOptionWidget( {\n *                 data: 'b',\n *                 label: 'Option with indicator',\n *                 indicator: 'next'\n *             } )\n *         ]\n *     } );\n *     $( 'body' ).append( select.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options\n *\n * @class\n * @extends OO.ui.OptionWidget\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.IndicatorElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.DecoratedOptionWidget = function OoUiDecoratedOptionWidget( config ) {\n\t// Parent constructor\n\tOO.ui.DecoratedOptionWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-decoratedOptionWidget' )\n\t\t.prepend( this.$icon )\n\t\t.append( this.$indicator );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.DecoratedOptionWidget, OO.ui.OptionWidget );\nOO.mixinClass( OO.ui.DecoratedOptionWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.DecoratedOptionWidget, OO.ui.mixin.IndicatorElement );\n","/**\n * MenuOptionWidget is an option widget that looks like a menu item. The class is used with\n * OO.ui.MenuSelectWidget to create a menu of mutually exclusive options. Please see\n * the [OOjs UI documentation on MediaWiki] [1] for more information.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options\n *\n * @class\n * @extends OO.ui.DecoratedOptionWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.MenuOptionWidget = function OoUiMenuOptionWidget( config ) {\n\t// Parent constructor\n\tOO.ui.MenuOptionWidget.parent.call( this, config );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-menuOptionWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.MenuOptionWidget, OO.ui.DecoratedOptionWidget );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.MenuOptionWidget.static.scrollIntoViewOnSelect = true;\n","/**\n * MenuSectionOptionWidgets are used inside {@link OO.ui.MenuSelectWidget menu select widgets} to group one or more related\n * {@link OO.ui.MenuOptionWidget menu options}. MenuSectionOptionWidgets cannot be highlighted or selected.\n *\n *     @example\n *     var myDropdown = new OO.ui.DropdownWidget( {\n *         menu: {\n *             items: [\n *                 new OO.ui.MenuSectionOptionWidget( {\n *                     label: 'Dogs'\n *                 } ),\n *                 new OO.ui.MenuOptionWidget( {\n *                     data: 'corgi',\n *                     label: 'Welsh Corgi'\n *                 } ),\n *                 new OO.ui.MenuOptionWidget( {\n *                     data: 'poodle',\n *                     label: 'Standard Poodle'\n *                 } ),\n *                 new OO.ui.MenuSectionOptionWidget( {\n *                     label: 'Cats'\n *                 } ),\n *                 new OO.ui.MenuOptionWidget( {\n *                     data: 'lion',\n *                     label: 'Lion'\n *                 } )\n *             ]\n *         }\n *     } );\n *     $( 'body' ).append( myDropdown.$element );\n *\n * @class\n * @extends OO.ui.DecoratedOptionWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.MenuSectionOptionWidget = function OoUiMenuSectionOptionWidget( config ) {\n\t// Parent constructor\n\tOO.ui.MenuSectionOptionWidget.parent.call( this, config );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-menuSectionOptionWidget' )\n\t\t.removeAttr( 'role aria-selected' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.MenuSectionOptionWidget, OO.ui.DecoratedOptionWidget );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.MenuSectionOptionWidget.static.selectable = false;\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.MenuSectionOptionWidget.static.highlightable = false;\n","/**\n * MenuSelectWidget is a {@link OO.ui.SelectWidget select widget} that contains options and\n * is used together with OO.ui.MenuOptionWidget. It is designed be used as part of another widget.\n * See {@link OO.ui.DropdownWidget DropdownWidget}, {@link OO.ui.ComboBoxInputWidget ComboBoxInputWidget},\n * and {@link OO.ui.mixin.LookupElement LookupElement} for examples of widgets that contain menus.\n * MenuSelectWidgets themselves are not instantiated directly, rather subclassed\n * and customized to be opened, closed, and displayed as needed.\n *\n * By default, menus are clipped to the visible viewport and are not visible when a user presses the\n * mouse outside the menu.\n *\n * Menus also have support for keyboard interaction:\n *\n * - Enter/Return key: choose and select a menu option\n * - Up-arrow key: highlight the previous menu option\n * - Down-arrow key: highlight the next menu option\n * - Esc key: hide the menu\n *\n * Unlike most widgets, MenuSelectWidget is initially hidden and must be shown by calling #toggle.\n *\n * Please see the [OOjs UI documentation on MediaWiki][1] for more information.\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options\n *\n * @class\n * @extends OO.ui.SelectWidget\n * @mixins OO.ui.mixin.ClippableElement\n * @mixins OO.ui.mixin.FloatableElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {OO.ui.TextInputWidget} [input] Text input used to implement option highlighting for menu items that match\n *  the text the user types. This config is used by {@link OO.ui.ComboBoxInputWidget ComboBoxInputWidget}\n *  and {@link OO.ui.mixin.LookupElement LookupElement}\n * @cfg {jQuery} [$input] Text input used to implement option highlighting for menu items that match\n *  the text the user types. This config is used by {@link OO.ui.CapsuleMultiselectWidget CapsuleMultiselectWidget}\n * @cfg {OO.ui.Widget} [widget] Widget associated with the menu's active state. If the user clicks the mouse\n *  anywhere on the page outside of this widget, the menu is hidden. For example, if there is a button\n *  that toggles the menu's visibility on click, the menu will be hidden then re-shown when the user clicks\n *  that button, unless the button (or its parent widget) is passed in here.\n * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu.\n * @cfg {jQuery} [$autoCloseIgnore] If these elements are clicked, don't auto-hide the menu.\n * @cfg {boolean} [hideOnChoose=true] Hide the menu when the user chooses an option.\n * @cfg {boolean} [filterFromInput=false] Filter the displayed options from the input\n * @cfg {boolean} [highlightOnFilter] Highlight the first result when filtering\n * @cfg {number} [width] Width of the menu\n */\nOO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.MenuSelectWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );\n\tOO.ui.mixin.FloatableElement.call( this, config );\n\n\t// Properties\n\tthis.autoHide = config.autoHide === undefined || !!config.autoHide;\n\tthis.hideOnChoose = config.hideOnChoose === undefined || !!config.hideOnChoose;\n\tthis.filterFromInput = !!config.filterFromInput;\n\tthis.$input = config.$input ? config.$input : config.input ? config.input.$input : null;\n\tthis.$widget = config.widget ? config.widget.$element : null;\n\tthis.$autoCloseIgnore = config.$autoCloseIgnore || $( [] );\n\tthis.onDocumentMouseDownHandler = this.onDocumentMouseDown.bind( this );\n\tthis.onInputEditHandler = OO.ui.debounce( this.updateItemVisibility.bind( this ), 100 );\n\tthis.highlightOnFilter = !!config.highlightOnFilter;\n\tthis.width = config.width;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-menuSelectWidget' );\n\tif ( config.widget ) {\n\t\tthis.setFocusOwner( config.widget.$tabIndexed );\n\t}\n\n\t// Initially hidden - using #toggle may cause errors if subclasses override toggle with methods\n\t// that reference properties not initialized at that time of parent class construction\n\t// TODO: Find a better way to handle post-constructor setup\n\tthis.visible = false;\n\tthis.$element.addClass( 'oo-ui-element-hidden' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.MenuSelectWidget, OO.ui.SelectWidget );\nOO.mixinClass( OO.ui.MenuSelectWidget, OO.ui.mixin.ClippableElement );\nOO.mixinClass( OO.ui.MenuSelectWidget, OO.ui.mixin.FloatableElement );\n\n/* Events */\n\n/**\n * @event ready\n *\n * The menu is ready: it is visible and has been positioned and clipped.\n */\n\n/* Methods */\n\n/**\n * Handles document mouse down events.\n *\n * @protected\n * @param {MouseEvent} e Mouse down event\n */\nOO.ui.MenuSelectWidget.prototype.onDocumentMouseDown = function ( e ) {\n\tif (\n\t\tthis.isVisible() &&\n\t\t!OO.ui.contains(\n\t\t\t\tthis.$element.add( this.$widget ).add( this.$autoCloseIgnore ).get(),\n\t\t\t\te.target,\n\t\t\t\ttrue\n\t\t)\n\t) {\n\t\tthis.toggle( false );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MenuSelectWidget.prototype.onKeyDown = function ( e ) {\n\tvar currentItem = this.getHighlightedItem() || this.getSelectedItem();\n\n\tif ( !this.isDisabled() && this.isVisible() ) {\n\t\tswitch ( e.keyCode ) {\n\t\t\tcase OO.ui.Keys.LEFT:\n\t\t\tcase OO.ui.Keys.RIGHT:\n\t\t\t\t// Do nothing if a text field is associated, arrow keys will be handled natively\n\t\t\t\tif ( !this.$input ) {\n\t\t\t\t\tOO.ui.MenuSelectWidget.parent.prototype.onKeyDown.call( this, e );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase OO.ui.Keys.ESCAPE:\n\t\t\tcase OO.ui.Keys.TAB:\n\t\t\t\tif ( currentItem ) {\n\t\t\t\t\tcurrentItem.setHighlighted( false );\n\t\t\t\t}\n\t\t\t\tthis.toggle( false );\n\t\t\t\t// Don't prevent tabbing away, prevent defocusing\n\t\t\t\tif ( e.keyCode === OO.ui.Keys.ESCAPE ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tOO.ui.MenuSelectWidget.parent.prototype.onKeyDown.call( this, e );\n\t\t\t\treturn;\n\t\t}\n\t}\n};\n\n/**\n * Update menu item visibility after input changes.\n *\n * @protected\n */\nOO.ui.MenuSelectWidget.prototype.updateItemVisibility = function () {\n\tvar i, item, visible, section, sectionEmpty,\n\t\tfirstItemFound = false,\n\t\tanyVisible = false,\n\t\tlen = this.items.length,\n\t\tshowAll = !this.isVisible(),\n\t\tfilter = showAll ? null : this.getItemMatcher( this.$input.val() ),\n\t\texactFilter = this.getItemMatcher( this.$input.val(), true ),\n\t\texactMatch = false;\n\n\t// Hide non-matching options, and also hide section headers if all options\n\t// in their section are hidden.\n\tfor ( i = 0; i < len; i++ ) {\n\t\titem = this.items[ i ];\n\t\tif ( item instanceof OO.ui.MenuSectionOptionWidget ) {\n\t\t\tif ( section ) {\n\t\t\t\t// If the previous section was empty, hide its header\n\t\t\t\tsection.toggle( showAll || !sectionEmpty );\n\t\t\t}\n\t\t\tsection = item;\n\t\t\tsectionEmpty = true;\n\t\t} else if ( item instanceof OO.ui.OptionWidget ) {\n\t\t\tvisible = showAll || filter( item );\n\t\t\texactMatch = exactMatch || exactFilter( item );\n\t\t\tanyVisible = anyVisible || visible;\n\t\t\tsectionEmpty = sectionEmpty && !visible;\n\t\t\titem.toggle( visible );\n\t\t\tif ( this.highlightOnFilter && visible && !firstItemFound ) {\n\t\t\t\t// Highlight the first item in the list\n\t\t\t\tthis.highlightItem( item );\n\t\t\t\tfirstItemFound = true;\n\t\t\t}\n\t\t}\n\t}\n\t// Process the final section\n\tif ( section ) {\n\t\tsection.toggle( showAll || !sectionEmpty );\n\t}\n\n\tif ( anyVisible && this.items.length && !exactMatch ) {\n\t\tthis.scrollItemIntoView( this.items[ 0 ] );\n\t}\n\n\tthis.$element.toggleClass( 'oo-ui-menuSelectWidget-invisible', !anyVisible );\n\n\t// Reevaluate clipping\n\tthis.clip();\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MenuSelectWidget.prototype.bindKeyDownListener = function () {\n\tif ( this.$input ) {\n\t\tthis.$input.on( 'keydown', this.onKeyDownHandler );\n\t} else {\n\t\tOO.ui.MenuSelectWidget.parent.prototype.bindKeyDownListener.call( this );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MenuSelectWidget.prototype.unbindKeyDownListener = function () {\n\tif ( this.$input ) {\n\t\tthis.$input.off( 'keydown', this.onKeyDownHandler );\n\t} else {\n\t\tOO.ui.MenuSelectWidget.parent.prototype.unbindKeyDownListener.call( this );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MenuSelectWidget.prototype.bindKeyPressListener = function () {\n\tif ( this.$input ) {\n\t\tif ( this.filterFromInput ) {\n\t\t\tthis.$input.on( 'keydown mouseup cut paste change input select', this.onInputEditHandler );\n\t\t\tthis.updateItemVisibility();\n\t\t}\n\t} else {\n\t\tOO.ui.MenuSelectWidget.parent.prototype.bindKeyPressListener.call( this );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MenuSelectWidget.prototype.unbindKeyPressListener = function () {\n\tif ( this.$input ) {\n\t\tif ( this.filterFromInput ) {\n\t\t\tthis.$input.off( 'keydown mouseup cut paste change input select', this.onInputEditHandler );\n\t\t\tthis.updateItemVisibility();\n\t\t}\n\t} else {\n\t\tOO.ui.MenuSelectWidget.parent.prototype.unbindKeyPressListener.call( this );\n\t}\n};\n\n/**\n * Choose an item.\n *\n * When a user chooses an item, the menu is closed, unless the hideOnChoose config option is set to false.\n *\n * Note that ‘choose’ should never be modified programmatically. A user can choose an option with the keyboard\n * or mouse and it becomes selected. To select an item programmatically, use the #selectItem method.\n *\n * @param {OO.ui.OptionWidget} item Item to choose\n * @chainable\n */\nOO.ui.MenuSelectWidget.prototype.chooseItem = function ( item ) {\n\tOO.ui.MenuSelectWidget.parent.prototype.chooseItem.call( this, item );\n\tif ( this.hideOnChoose ) {\n\t\tthis.toggle( false );\n\t}\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MenuSelectWidget.prototype.addItems = function ( items, index ) {\n\t// Parent method\n\tOO.ui.MenuSelectWidget.parent.prototype.addItems.call( this, items, index );\n\n\t// Reevaluate clipping\n\tthis.clip();\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MenuSelectWidget.prototype.removeItems = function ( items ) {\n\t// Parent method\n\tOO.ui.MenuSelectWidget.parent.prototype.removeItems.call( this, items );\n\n\t// Reevaluate clipping\n\tthis.clip();\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MenuSelectWidget.prototype.clearItems = function () {\n\t// Parent method\n\tOO.ui.MenuSelectWidget.parent.prototype.clearItems.call( this );\n\n\t// Reevaluate clipping\n\tthis.clip();\n\n\treturn this;\n};\n\n/**\n * Toggle visibility of the menu. The menu is initially hidden and must be shown by calling\n * `.toggle( true )` after its #$element is attached to the DOM.\n *\n * Do not show the menu while it is not attached to the DOM. The calculations required to display\n * it in the right place and with the right dimensions only work correctly while it is attached.\n * Side-effects may include broken interface and exceptions being thrown. This wasn't always\n * strictly enforced, so currently it only generates a warning in the browser console.\n *\n * @fires ready\n * @inheritdoc\n */\nOO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {\n\tvar change;\n\n\tvisible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;\n\tchange = visible !== this.isVisible();\n\n\tif ( visible && !this.warnedUnattached && !this.isElementAttached() ) {\n\t\tOO.ui.warnDeprecation( 'MenuSelectWidget#toggle: Before calling this method, the menu must be attached to the DOM.' );\n\t\tthis.warnedUnattached = true;\n\t}\n\n\tif ( change && visible && ( this.width || this.$floatableContainer ) ) {\n\t\tthis.setIdealSize( this.width || this.$floatableContainer.width() );\n\t}\n\n\t// Parent method\n\tOO.ui.MenuSelectWidget.parent.prototype.toggle.call( this, visible );\n\n\tif ( change ) {\n\t\tif ( visible ) {\n\t\t\tthis.bindKeyDownListener();\n\t\t\tthis.bindKeyPressListener();\n\n\t\t\tthis.togglePositioning( !!this.$floatableContainer );\n\t\t\tthis.toggleClipping( true );\n\n\t\t\tif ( this.getSelectedItem() ) {\n\t\t\t\tthis.$focusOwner.attr( 'aria-activedescendant', this.getSelectedItem().getElementId() );\n\t\t\t\tthis.getSelectedItem().scrollElementIntoView( { duration: 0 } );\n\t\t\t}\n\n\t\t\t// Auto-hide\n\t\t\tif ( this.autoHide ) {\n\t\t\t\tthis.getElementDocument().addEventListener( 'mousedown', this.onDocumentMouseDownHandler, true );\n\t\t\t}\n\n\t\t\tthis.emit( 'ready' );\n\t\t} else {\n\t\t\tthis.$focusOwner.removeAttr( 'aria-activedescendant' );\n\t\t\tthis.unbindKeyDownListener();\n\t\t\tthis.unbindKeyPressListener();\n\t\t\tthis.getElementDocument().removeEventListener( 'mousedown', this.onDocumentMouseDownHandler, true );\n\t\t\tthis.togglePositioning( false );\n\t\t\tthis.toggleClipping( false );\n\t\t}\n\t}\n\n\treturn this;\n};\n","/**\n * DropdownWidgets are not menus themselves, rather they contain a menu of options created with\n * OO.ui.MenuOptionWidget. The DropdownWidget takes care of opening and displaying the menu so that\n * users can interact with it.\n *\n * If you want to use this within an HTML form, such as a OO.ui.FormLayout, use\n * OO.ui.DropdownInputWidget instead.\n *\n *     @example\n *     // Example: A DropdownWidget with a menu that contains three options\n *     var dropDown = new OO.ui.DropdownWidget( {\n *         label: 'Dropdown menu: Select a menu option',\n *         menu: {\n *             items: [\n *                 new OO.ui.MenuOptionWidget( {\n *                     data: 'a',\n *                     label: 'First'\n *                 } ),\n *                 new OO.ui.MenuOptionWidget( {\n *                     data: 'b',\n *                     label: 'Second'\n *                 } ),\n *                 new OO.ui.MenuOptionWidget( {\n *                     data: 'c',\n *                     label: 'Third'\n *                 } )\n *             ]\n *         }\n *     } );\n *\n *     $( 'body' ).append( dropDown.$element );\n *\n *     dropDown.getMenu().selectItemByData( 'b' );\n *\n *     dropDown.getMenu().getSelectedItem().getData(); // returns 'b'\n *\n * For more information, please see the [OOjs UI documentation on MediaWiki] [1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.TitledElement\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {Object} [menu] Configuration options to pass to {@link OO.ui.MenuSelectWidget menu select widget}\n * @cfg {jQuery} [$overlay] Render the menu into a separate layer. This configuration is useful in cases where\n *  the expanded menu is larger than its containing `<div>`. The specified overlay layer is usually on top of the\n *  containing `<div>` and has a larger area. By default, the menu uses relative positioning.\n *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.\n */\nOO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( { indicator: 'down' }, config );\n\n\t// Parent constructor\n\tOO.ui.DropdownWidget.parent.call( this, config );\n\n\t// Properties (must be set before TabIndexedElement constructor call)\n\tthis.$handle = this.$( '<span>' );\n\tthis.$overlay = config.$overlay || this.$element;\n\n\t// Mixin constructors\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\tOO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$label } ) );\n\tOO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$handle } ) );\n\n\t// Properties\n\tthis.menu = new OO.ui.MenuSelectWidget( $.extend( {\n\t\twidget: this,\n\t\t$floatableContainer: this.$element\n\t}, config.menu ) );\n\n\t// Events\n\tthis.$handle.on( {\n\t\tclick: this.onClick.bind( this ),\n\t\tkeydown: this.onKeyDown.bind( this ),\n\t\t// Hack? Handle type-to-search when menu is not expanded and not handling its own events\n\t\tkeypress: this.menu.onKeyPressHandler,\n\t\tblur: this.menu.clearKeyPressBuffer.bind( this.menu )\n\t} );\n\tthis.menu.connect( this, {\n\t\tselect: 'onMenuSelect',\n\t\ttoggle: 'onMenuToggle'\n\t} );\n\n\t// Initialization\n\tthis.$handle\n\t\t.addClass( 'oo-ui-dropdownWidget-handle' )\n\t\t.attr( {\n\t\t\trole: 'combobox',\n\t\t\t'aria-owns': this.menu.getElementId(),\n\t\t\t'aria-autocomplete': 'list'\n\t\t} )\n\t\t.append( this.$icon, this.$label, this.$indicator );\n\tthis.$element\n\t\t.addClass( 'oo-ui-dropdownWidget' )\n\t\t.append( this.$handle );\n\tthis.$overlay.append( this.menu.$element );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.DropdownWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.DropdownWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.DropdownWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.DropdownWidget, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.DropdownWidget, OO.ui.mixin.TitledElement );\nOO.mixinClass( OO.ui.DropdownWidget, OO.ui.mixin.TabIndexedElement );\n\n/* Methods */\n\n/**\n * Get the menu.\n *\n * @return {OO.ui.MenuSelectWidget} Menu of widget\n */\nOO.ui.DropdownWidget.prototype.getMenu = function () {\n\treturn this.menu;\n};\n\n/**\n * Handles menu select events.\n *\n * @private\n * @param {OO.ui.MenuOptionWidget} item Selected menu item\n */\nOO.ui.DropdownWidget.prototype.onMenuSelect = function ( item ) {\n\tvar selectedLabel;\n\n\tif ( !item ) {\n\t\tthis.setLabel( null );\n\t\treturn;\n\t}\n\n\tselectedLabel = item.getLabel();\n\n\t// If the label is a DOM element, clone it, because setLabel will append() it\n\tif ( selectedLabel instanceof jQuery ) {\n\t\tselectedLabel = selectedLabel.clone();\n\t}\n\n\tthis.setLabel( selectedLabel );\n};\n\n/**\n * Handle menu toggle events.\n *\n * @private\n * @param {boolean} isVisible Menu toggle event\n */\nOO.ui.DropdownWidget.prototype.onMenuToggle = function ( isVisible ) {\n\tthis.$element.toggleClass( 'oo-ui-dropdownWidget-open', isVisible );\n};\n\n/**\n * Handle mouse click events.\n *\n * @private\n * @param {jQuery.Event} e Mouse click event\n */\nOO.ui.DropdownWidget.prototype.onClick = function ( e ) {\n\tif ( !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) {\n\t\tthis.menu.toggle();\n\t}\n\treturn false;\n};\n\n/**\n * Handle key down events.\n *\n * @private\n * @param {jQuery.Event} e Key down event\n */\nOO.ui.DropdownWidget.prototype.onKeyDown = function ( e ) {\n\tif (\n\t\t!this.isDisabled() &&\n\t\t(\n\t\t\te.which === OO.ui.Keys.ENTER ||\n\t\t\t(\n\t\t\t\t!this.menu.isVisible() &&\n\t\t\t\t(\n\t\t\t\t\te.which === OO.ui.Keys.SPACE ||\n\t\t\t\t\te.which === OO.ui.Keys.UP ||\n\t\t\t\t\te.which === OO.ui.Keys.DOWN\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t) {\n\t\tthis.menu.toggle();\n\t\treturn false;\n\t}\n};\n","/**\n * RadioOptionWidget is an option widget that looks like a radio button.\n * The class is used with OO.ui.RadioSelectWidget to create a selection of radio options.\n * Please see the [OOjs UI documentation on MediaWiki] [1] for more information.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Button_selects_and_option\n *\n * @class\n * @extends OO.ui.OptionWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.RadioOptionWidget = function OoUiRadioOptionWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties (must be done before parent constructor which calls #setDisabled)\n\tthis.radio = new OO.ui.RadioInputWidget( { value: config.data, tabIndex: -1 } );\n\n\t// Parent constructor\n\tOO.ui.RadioOptionWidget.parent.call( this, config );\n\n\t// Initialization\n\t// Remove implicit role, we're handling it ourselves\n\tthis.radio.$input.attr( 'role', 'presentation' );\n\tthis.$element\n\t\t.addClass( 'oo-ui-radioOptionWidget' )\n\t\t.attr( 'role', 'radio' )\n\t\t.attr( 'aria-checked', 'false' )\n\t\t.removeAttr( 'aria-selected' )\n\t\t.prepend( this.radio.$element );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.RadioOptionWidget, OO.ui.OptionWidget );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.RadioOptionWidget.static.highlightable = false;\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.RadioOptionWidget.static.scrollIntoViewOnSelect = true;\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.RadioOptionWidget.static.pressable = false;\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.RadioOptionWidget.static.tagName = 'label';\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.RadioOptionWidget.prototype.setSelected = function ( state ) {\n\tOO.ui.RadioOptionWidget.parent.prototype.setSelected.call( this, state );\n\n\tthis.radio.setSelected( state );\n\tthis.$element\n\t\t.attr( 'aria-checked', state.toString() )\n\t\t.removeAttr( 'aria-selected' );\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.RadioOptionWidget.prototype.setDisabled = function ( disabled ) {\n\tOO.ui.RadioOptionWidget.parent.prototype.setDisabled.call( this, disabled );\n\n\tthis.radio.setDisabled( this.isDisabled() );\n\n\treturn this;\n};\n","/**\n * RadioSelectWidget is a {@link OO.ui.SelectWidget select widget} that contains radio\n * options and is used together with OO.ui.RadioOptionWidget. The RadioSelectWidget provides\n * an interface for adding, removing and selecting options.\n * Please see the [OOjs UI documentation on MediaWiki][1] for more information.\n *\n * If you want to use this within an HTML form, such as a OO.ui.FormLayout, use\n * OO.ui.RadioSelectInputWidget instead.\n *\n *     @example\n *     // A RadioSelectWidget with RadioOptions.\n *     var option1 = new OO.ui.RadioOptionWidget( {\n *         data: 'a',\n *         label: 'Selected radio option'\n *     } );\n *\n *     var option2 = new OO.ui.RadioOptionWidget( {\n *         data: 'b',\n *         label: 'Unselected radio option'\n *     } );\n *\n *     var radioSelect=new OO.ui.RadioSelectWidget( {\n *         items: [ option1, option2 ]\n *      } );\n *\n *     // Select 'option 1' using the RadioSelectWidget's selectItem() method.\n *     radioSelect.selectItem( option1 );\n *\n *     $( 'body' ).append( radioSelect.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options\n\n *\n * @class\n * @extends OO.ui.SelectWidget\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.RadioSelectWidget = function OoUiRadioSelectWidget( config ) {\n\t// Parent constructor\n\tOO.ui.RadioSelectWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.TabIndexedElement.call( this, config );\n\n\t// Events\n\tthis.$element.on( {\n\t\tfocus: this.bindKeyDownListener.bind( this ),\n\t\tblur: this.unbindKeyDownListener.bind( this )\n\t} );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-radioSelectWidget' )\n\t\t.attr( 'role', 'radiogroup' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.RadioSelectWidget, OO.ui.SelectWidget );\nOO.mixinClass( OO.ui.RadioSelectWidget, OO.ui.mixin.TabIndexedElement );\n","/**\n * MultioptionWidgets are special elements that can be selected and configured with data. The\n * data is often unique for each option, but it does not have to be. MultioptionWidgets are used\n * with OO.ui.SelectWidget to create a selection of mutually exclusive options. For more information\n * and examples, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Multioptions\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.ItemWidget\n * @mixins OO.ui.mixin.LabelElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [selected=false] Whether the option is initially selected\n */\nOO.ui.MultioptionWidget = function OoUiMultioptionWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.MultioptionWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ItemWidget.call( this );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\n\t// Properties\n\tthis.selected = null;\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-multioptionWidget' )\n\t\t.append( this.$label );\n\tthis.setSelected( config.selected );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.MultioptionWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.MultioptionWidget, OO.ui.mixin.ItemWidget );\nOO.mixinClass( OO.ui.MultioptionWidget, OO.ui.mixin.LabelElement );\n\n/* Events */\n\n/**\n * @event change\n *\n * A change event is emitted when the selected state of the option changes.\n *\n * @param {boolean} selected Whether the option is now selected\n */\n\n/* Methods */\n\n/**\n * Check if the option is selected.\n *\n * @return {boolean} Item is selected\n */\nOO.ui.MultioptionWidget.prototype.isSelected = function () {\n\treturn this.selected;\n};\n\n/**\n * Set the option’s selected state. In general, all modifications to the selection\n * should be handled by the SelectWidget’s {@link OO.ui.SelectWidget#selectItem selectItem( [item] )}\n * method instead of this method.\n *\n * @param {boolean} [state=false] Select option\n * @chainable\n */\nOO.ui.MultioptionWidget.prototype.setSelected = function ( state ) {\n\tstate = !!state;\n\tif ( this.selected !== state ) {\n\t\tthis.selected = state;\n\t\tthis.emit( 'change', state );\n\t\tthis.$element.toggleClass( 'oo-ui-multioptionWidget-selected', state );\n\t}\n\treturn this;\n};\n","/**\n * MultiselectWidget allows selecting multiple options from a list.\n *\n * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options\n *\n * @class\n * @abstract\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.GroupWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {OO.ui.MultioptionWidget[]} [items] An array of options to add to the multiselect.\n */\nOO.ui.MultiselectWidget = function OoUiMultiselectWidget( config ) {\n\t// Parent constructor\n\tOO.ui.MultiselectWidget.parent.call( this, config );\n\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupWidget.call( this, config );\n\n\t// Events\n\tthis.aggregate( { change: 'select' } );\n\t// This is mostly for compatibility with CapsuleMultiselectWidget... normally, 'change' is emitted\n\t// by GroupElement only when items are added/removed\n\tthis.connect( this, { select: [ 'emit', 'change' ] } );\n\n\t// Initialization\n\tif ( config.items ) {\n\t\tthis.addItems( config.items );\n\t}\n\tthis.$group.addClass( 'oo-ui-multiselectWidget-group' );\n\tthis.$element.addClass( 'oo-ui-multiselectWidget' )\n\t\t.append( this.$group );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.MultiselectWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.MultiselectWidget, OO.ui.mixin.GroupWidget );\n\n/* Events */\n\n/**\n * @event change\n *\n * A change event is emitted when the set of items changes, or an item is selected or deselected.\n */\n\n/**\n * @event select\n *\n * A select event is emitted when an item is selected or deselected.\n */\n\n/* Methods */\n\n/**\n * Get options that are selected.\n *\n * @return {OO.ui.MultioptionWidget[]} Selected options\n */\nOO.ui.MultiselectWidget.prototype.getSelectedItems = function () {\n\treturn this.items.filter( function ( item ) {\n\t\treturn item.isSelected();\n\t} );\n};\n\n/**\n * Get the data of options that are selected.\n *\n * @return {Object[]|string[]} Values of selected options\n */\nOO.ui.MultiselectWidget.prototype.getSelectedItemsData = function () {\n\treturn this.getSelectedItems().map( function ( item ) {\n\t\treturn item.data;\n\t} );\n};\n\n/**\n * Select options by reference. Options not mentioned in the `items` array will be deselected.\n *\n * @param {OO.ui.MultioptionWidget[]} items Items to select\n * @chainable\n */\nOO.ui.MultiselectWidget.prototype.selectItems = function ( items ) {\n\tthis.items.forEach( function ( item ) {\n\t\tvar selected = items.indexOf( item ) !== -1;\n\t\titem.setSelected( selected );\n\t} );\n\treturn this;\n};\n\n/**\n * Select items by their data. Options not mentioned in the `datas` array will be deselected.\n *\n * @param {Object[]|string[]} datas Values of items to select\n * @chainable\n */\nOO.ui.MultiselectWidget.prototype.selectItemsByData = function ( datas ) {\n\tvar items,\n\t\twidget = this;\n\titems = datas.map( function ( data ) {\n\t\treturn widget.getItemFromData( data );\n\t} );\n\tthis.selectItems( items );\n\treturn this;\n};\n","/**\n * CheckboxMultioptionWidget is an option widget that looks like a checkbox.\n * The class is used with OO.ui.CheckboxMultiselectWidget to create a selection of checkbox options.\n * Please see the [OOjs UI documentation on MediaWiki] [1] for more information.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Button_selects_and_option\n *\n * @class\n * @extends OO.ui.MultioptionWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.CheckboxMultioptionWidget = function OoUiCheckboxMultioptionWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties (must be done before parent constructor which calls #setDisabled)\n\tthis.checkbox = new OO.ui.CheckboxInputWidget();\n\n\t// Parent constructor\n\tOO.ui.CheckboxMultioptionWidget.parent.call( this, config );\n\n\t// Events\n\tthis.checkbox.on( 'change', this.onCheckboxChange.bind( this ) );\n\tthis.$element.on( 'keydown', this.onKeyDown.bind( this ) );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-checkboxMultioptionWidget' )\n\t\t.prepend( this.checkbox.$element );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.CheckboxMultioptionWidget, OO.ui.MultioptionWidget );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.CheckboxMultioptionWidget.static.tagName = 'label';\n\n/* Methods */\n\n/**\n * Handle checkbox selected state change.\n *\n * @private\n */\nOO.ui.CheckboxMultioptionWidget.prototype.onCheckboxChange = function () {\n\tthis.setSelected( this.checkbox.isSelected() );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CheckboxMultioptionWidget.prototype.setSelected = function ( state ) {\n\tOO.ui.CheckboxMultioptionWidget.parent.prototype.setSelected.call( this, state );\n\tthis.checkbox.setSelected( state );\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CheckboxMultioptionWidget.prototype.setDisabled = function ( disabled ) {\n\tOO.ui.CheckboxMultioptionWidget.parent.prototype.setDisabled.call( this, disabled );\n\tthis.checkbox.setDisabled( this.isDisabled() );\n\treturn this;\n};\n\n/**\n * Focus the widget.\n */\nOO.ui.CheckboxMultioptionWidget.prototype.focus = function () {\n\tthis.checkbox.focus();\n};\n\n/**\n * Handle key down events.\n *\n * @protected\n * @param {jQuery.Event} e\n */\nOO.ui.CheckboxMultioptionWidget.prototype.onKeyDown = function ( e ) {\n\tvar\n\t\telement = this.getElementGroup(),\n\t\tnextItem;\n\n\tif ( e.keyCode === OO.ui.Keys.LEFT || e.keyCode === OO.ui.Keys.UP ) {\n\t\tnextItem = element.getRelativeFocusableItem( this, -1 );\n\t} else if ( e.keyCode === OO.ui.Keys.RIGHT || e.keyCode === OO.ui.Keys.DOWN ) {\n\t\tnextItem = element.getRelativeFocusableItem( this, 1 );\n\t}\n\n\tif ( nextItem ) {\n\t\te.preventDefault();\n\t\tnextItem.focus();\n\t}\n};\n","/**\n * CheckboxMultiselectWidget is a {@link OO.ui.MultiselectWidget multiselect widget} that contains\n * checkboxes and is used together with OO.ui.CheckboxMultioptionWidget. The\n * CheckboxMultiselectWidget provides an interface for adding, removing and selecting options.\n * Please see the [OOjs UI documentation on MediaWiki][1] for more information.\n *\n * If you want to use this within an HTML form, such as a OO.ui.FormLayout, use\n * OO.ui.CheckboxMultiselectInputWidget instead.\n *\n *     @example\n *     // A CheckboxMultiselectWidget with CheckboxMultioptions.\n *     var option1 = new OO.ui.CheckboxMultioptionWidget( {\n *         data: 'a',\n *         selected: true,\n *         label: 'Selected checkbox'\n *     } );\n *\n *     var option2 = new OO.ui.CheckboxMultioptionWidget( {\n *         data: 'b',\n *         label: 'Unselected checkbox'\n *     } );\n *\n *     var multiselect=new OO.ui.CheckboxMultiselectWidget( {\n *         items: [ option1, option2 ]\n *      } );\n *\n *     $( 'body' ).append( multiselect.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options\n *\n * @class\n * @extends OO.ui.MultiselectWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.CheckboxMultiselectWidget = function OoUiCheckboxMultiselectWidget( config ) {\n\t// Parent constructor\n\tOO.ui.CheckboxMultiselectWidget.parent.call( this, config );\n\n\t// Properties\n\tthis.$lastClicked = null;\n\n\t// Events\n\tthis.$group.on( 'click', this.onClick.bind( this ) );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-checkboxMultiselectWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.CheckboxMultiselectWidget, OO.ui.MultiselectWidget );\n\n/* Methods */\n\n/**\n * Get an option by its position relative to the specified item (or to the start of the option array,\n * if item is `null`). The direction in which to search through the option array is specified with a\n * number: -1 for reverse (the default) or 1 for forward. The method will return an option, or\n * `null` if there are no options in the array.\n *\n * @param {OO.ui.CheckboxMultioptionWidget|null} item Item to describe the start position, or `null` to start at the beginning of the array.\n * @param {number} direction Direction to move in: -1 to move backward, 1 to move forward\n * @return {OO.ui.CheckboxMultioptionWidget|null} Item at position, `null` if there are no items in the select\n */\nOO.ui.CheckboxMultiselectWidget.prototype.getRelativeFocusableItem = function ( item, direction ) {\n\tvar currentIndex, nextIndex, i,\n\t\tincrease = direction > 0 ? 1 : -1,\n\t\tlen = this.items.length;\n\n\tif ( item ) {\n\t\tcurrentIndex = this.items.indexOf( item );\n\t\tnextIndex = ( currentIndex + increase + len ) % len;\n\t} else {\n\t\t// If no item is selected and moving forward, start at the beginning.\n\t\t// If moving backward, start at the end.\n\t\tnextIndex = direction > 0 ? 0 : len - 1;\n\t}\n\n\tfor ( i = 0; i < len; i++ ) {\n\t\titem = this.items[ nextIndex ];\n\t\tif ( item && !item.isDisabled() ) {\n\t\t\treturn item;\n\t\t}\n\t\tnextIndex = ( nextIndex + increase + len ) % len;\n\t}\n\treturn null;\n};\n\n/**\n * Handle click events on checkboxes.\n *\n * @param {jQuery.Event} e\n */\nOO.ui.CheckboxMultiselectWidget.prototype.onClick = function ( e ) {\n\tvar $options, lastClickedIndex, nowClickedIndex, i, direction, wasSelected, items,\n\t\t$lastClicked = this.$lastClicked,\n\t\t$nowClicked = $( e.target ).closest( '.oo-ui-checkboxMultioptionWidget' )\n\t\t\t.not( '.oo-ui-widget-disabled' );\n\n\t// Allow selecting multiple options at once by Shift-clicking them\n\tif ( $lastClicked && $nowClicked.length && e.shiftKey ) {\n\t\t$options = this.$group.find( '.oo-ui-checkboxMultioptionWidget' );\n\t\tlastClickedIndex = $options.index( $lastClicked );\n\t\tnowClickedIndex = $options.index( $nowClicked );\n\t\t// If it's the same item, either the user is being silly, or it's a fake event generated by the\n\t\t// browser. In either case we don't need custom handling.\n\t\tif ( nowClickedIndex !== lastClickedIndex ) {\n\t\t\titems = this.items;\n\t\t\twasSelected = items[ nowClickedIndex ].isSelected();\n\t\t\tdirection = nowClickedIndex > lastClickedIndex ? 1 : -1;\n\n\t\t\t// This depends on the DOM order of the items and the order of the .items array being the same.\n\t\t\tfor ( i = lastClickedIndex; i !== nowClickedIndex; i += direction ) {\n\t\t\t\tif ( !items[ i ].isDisabled() ) {\n\t\t\t\t\titems[ i ].setSelected( !wasSelected );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// For the now-clicked element, use immediate timeout to allow the browser to do its own\n\t\t\t// handling first, then set our value. The order in which events happen is different for\n\t\t\t// clicks on the <input> and on the <label> and there are additional fake clicks fired for\n\t\t\t// non-click actions that change the checkboxes.\n\t\t\te.preventDefault();\n\t\t\tsetTimeout( function () {\n\t\t\t\tif ( !items[ nowClickedIndex ].isDisabled() ) {\n\t\t\t\t\titems[ nowClickedIndex ].setSelected( !wasSelected );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\tif ( $nowClicked.length ) {\n\t\tthis.$lastClicked = $nowClicked;\n\t}\n};\n","/**\n * FloatingMenuSelectWidget was a menu that would stick under a specified\n * container, even when it is inserted elsewhere in the document.\n * This functionality is now included in MenuSelectWidget, and FloatingMenuSelectWidget\n * is preserved for backwards-compatibility.\n *\n * @class\n * @extends OO.ui.MenuSelectWidget\n * @deprecated since v0.21.3, use MenuSelectWidget instead.\n *\n * @constructor\n * @param {OO.ui.Widget} [inputWidget] Widget to provide the menu for.\n *   Deprecated, omit this parameter and specify `$container` instead.\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$container=inputWidget.$element] Element to render menu under\n */\nOO.ui.FloatingMenuSelectWidget = function OoUiFloatingMenuSelectWidget( inputWidget, config ) {\n\tOO.ui.warnDeprecation( 'FloatingMenuSelectWidget is deprecated. Use the MenuSelectWidget instead.' );\n\n\t// Allow 'inputWidget' parameter and config for backwards compatibility\n\tif ( OO.isPlainObject( inputWidget ) && config === undefined ) {\n\t\tconfig = inputWidget;\n\t\tinputWidget = config.inputWidget;\n\t}\n\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.inputWidget = inputWidget; // For backwards compatibility\n\tthis.$container = config.$floatableContainer || config.$container || this.inputWidget.$element;\n\n\t// Parent constructor\n\tOO.ui.FloatingMenuSelectWidget.parent.call( this, $.extend( {}, config, { $floatableContainer: this.$container } ) );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-floatingMenuSelectWidget' );\n\t// For backwards compatibility\n\tthis.$element.addClass( 'oo-ui-textInputMenuSelectWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.FloatingMenuSelectWidget, OO.ui.MenuSelectWidget );\n","/**\n * Progress bars visually display the status of an operation, such as a download,\n * and can be either determinate or indeterminate:\n *\n * - **determinate** process bars show the percent of an operation that is complete.\n *\n * - **indeterminate** process bars use a visual display of motion to indicate that an operation\n *   is taking place. Because the extent of an indeterminate operation is unknown, the bar does\n *   not use percentages.\n *\n * The value of the `progress` configuration determines whether the bar is determinate or indeterminate.\n *\n *     @example\n *     // Examples of determinate and indeterminate progress bars.\n *     var progressBar1 = new OO.ui.ProgressBarWidget( {\n *         progress: 33\n *     } );\n *     var progressBar2 = new OO.ui.ProgressBarWidget();\n *\n *     // Create a FieldsetLayout to layout progress bars\n *     var fieldset = new OO.ui.FieldsetLayout;\n *     fieldset.addItems( [\n *        new OO.ui.FieldLayout( progressBar1, {label: 'Determinate', align: 'top'}),\n *        new OO.ui.FieldLayout( progressBar2, {label: 'Indeterminate', align: 'top'})\n *     ] );\n *     $( 'body' ).append( fieldset.$element );\n *\n * @class\n * @extends OO.ui.Widget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {number|boolean} [progress=false] The type of progress bar (determinate or indeterminate).\n *  To create a determinate progress bar, specify a number that reflects the initial percent complete.\n *  By default, the progress bar is indeterminate.\n */\nOO.ui.ProgressBarWidget = function OoUiProgressBarWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.ProgressBarWidget.parent.call( this, config );\n\n\t// Properties\n\tthis.$bar = $( '<div>' );\n\tthis.progress = null;\n\n\t// Initialization\n\tthis.setProgress( config.progress !== undefined ? config.progress : false );\n\tthis.$bar.addClass( 'oo-ui-progressBarWidget-bar' );\n\tthis.$element\n\t\t.attr( {\n\t\t\trole: 'progressbar',\n\t\t\t'aria-valuemin': 0,\n\t\t\t'aria-valuemax': 100\n\t\t} )\n\t\t.addClass( 'oo-ui-progressBarWidget' )\n\t\t.append( this.$bar );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ProgressBarWidget, OO.ui.Widget );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.ProgressBarWidget.static.tagName = 'div';\n\n/* Methods */\n\n/**\n * Get the percent of the progress that has been completed. Indeterminate progresses will return `false`.\n *\n * @return {number|boolean} Progress percent\n */\nOO.ui.ProgressBarWidget.prototype.getProgress = function () {\n\treturn this.progress;\n};\n\n/**\n * Set the percent of the process completed or `false` for an indeterminate process.\n *\n * @param {number|boolean} progress Progress percent or `false` for indeterminate\n */\nOO.ui.ProgressBarWidget.prototype.setProgress = function ( progress ) {\n\tthis.progress = progress;\n\n\tif ( progress !== false ) {\n\t\tthis.$bar.css( 'width', this.progress + '%' );\n\t\tthis.$element.attr( 'aria-valuenow', this.progress );\n\t} else {\n\t\tthis.$bar.css( 'width', '' );\n\t\tthis.$element.removeAttr( 'aria-valuenow' );\n\t}\n\tthis.$element.toggleClass( 'oo-ui-progressBarWidget-indeterminate', progress === false );\n};\n","/**\n * InputWidget is the base class for all input widgets, which\n * include {@link OO.ui.TextInputWidget text inputs}, {@link OO.ui.CheckboxInputWidget checkbox inputs},\n * {@link OO.ui.RadioInputWidget radio inputs}, and {@link OO.ui.ButtonInputWidget button inputs}.\n * See the [OOjs UI documentation on MediaWiki] [1] for more information and examples.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs\n *\n * @abstract\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.FlaggedElement\n * @mixins OO.ui.mixin.TabIndexedElement\n * @mixins OO.ui.mixin.TitledElement\n * @mixins OO.ui.mixin.AccessKeyedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string} [name=''] The value of the input’s HTML `name` attribute.\n * @cfg {string} [value=''] The value of the input.\n * @cfg {string} [dir] The directionality of the input (ltr/rtl).\n * @cfg {Function} [inputFilter] The name of an input filter function. Input filters modify the value of an input\n *  before it is accepted.\n */\nOO.ui.InputWidget = function OoUiInputWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.InputWidget.parent.call( this, config );\n\n\t// Properties\n\t// See #reusePreInfuseDOM about config.$input\n\tthis.$input = config.$input || this.getInputElement( config );\n\tthis.value = '';\n\tthis.inputFilter = config.inputFilter;\n\n\t// Mixin constructors\n\tOO.ui.mixin.FlaggedElement.call( this, config );\n\tOO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$input } ) );\n\tOO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$input } ) );\n\tOO.ui.mixin.AccessKeyedElement.call( this, $.extend( {}, config, { $accessKeyed: this.$input } ) );\n\n\t// Events\n\tthis.$input.on( 'keydown mouseup cut paste change input select', this.onEdit.bind( this ) );\n\n\t// Initialization\n\tthis.$input\n\t\t.addClass( 'oo-ui-inputWidget-input' )\n\t\t.attr( 'name', config.name )\n\t\t.prop( 'disabled', this.isDisabled() );\n\tthis.$element\n\t\t.addClass( 'oo-ui-inputWidget' )\n\t\t.append( this.$input );\n\tthis.setValue( config.value );\n\tif ( config.dir ) {\n\t\tthis.setDir( config.dir );\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.InputWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.FlaggedElement );\nOO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.TabIndexedElement );\nOO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.TitledElement );\nOO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.AccessKeyedElement );\n\n/* Static Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.InputWidget.static.reusePreInfuseDOM = function ( node, config ) {\n\tconfig = OO.ui.InputWidget.parent.static.reusePreInfuseDOM( node, config );\n\t// Reusing $input lets browsers preserve inputted values across page reloads (T114134)\n\tconfig.$input = $( node ).find( '.oo-ui-inputWidget-input' );\n\treturn config;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.InputWidget.static.gatherPreInfuseState = function ( node, config ) {\n\tvar state = OO.ui.InputWidget.parent.static.gatherPreInfuseState( node, config );\n\tif ( config.$input && config.$input.length ) {\n\t\tstate.value = config.$input.val();\n\t\t// Might be better in TabIndexedElement, but it's awkward to do there because mixins are awkward\n\t\tstate.focus = config.$input.is( ':focus' );\n\t}\n\treturn state;\n};\n\n/* Events */\n\n/**\n * @event change\n *\n * A change event is emitted when the value of the input changes.\n *\n * @param {string} value\n */\n\n/* Methods */\n\n/**\n * Get input element.\n *\n * Subclasses of OO.ui.InputWidget use the `config` parameter to produce different elements in\n * different circumstances. The element must have a `value` property (like form elements).\n *\n * @protected\n * @param {Object} config Configuration options\n * @return {jQuery} Input element\n */\nOO.ui.InputWidget.prototype.getInputElement = function () {\n\treturn $( '<input>' );\n};\n\n/**\n * Handle potentially value-changing events.\n *\n * @private\n * @param {jQuery.Event} e Key down, mouse up, cut, paste, change, input, or select event\n */\nOO.ui.InputWidget.prototype.onEdit = function () {\n\tvar widget = this;\n\tif ( !this.isDisabled() ) {\n\t\t// Allow the stack to clear so the value will be updated\n\t\tsetTimeout( function () {\n\t\t\twidget.setValue( widget.$input.val() );\n\t\t} );\n\t}\n};\n\n/**\n * Get the value of the input.\n *\n * @return {string} Input value\n */\nOO.ui.InputWidget.prototype.getValue = function () {\n\t// Resynchronize our internal data with DOM data. Other scripts executing on the page can modify\n\t// it, and we won't know unless they're kind enough to trigger a 'change' event.\n\tvar value = this.$input.val();\n\tif ( this.value !== value ) {\n\t\tthis.setValue( value );\n\t}\n\treturn this.value;\n};\n\n/**\n * Set the directionality of the input.\n *\n * @param {string} dir Text directionality: 'ltr', 'rtl' or 'auto'\n * @chainable\n */\nOO.ui.InputWidget.prototype.setDir = function ( dir ) {\n\tthis.$input.prop( 'dir', dir );\n\treturn this;\n};\n\n/**\n * Set the value of the input.\n *\n * @param {string} value New value\n * @fires change\n * @chainable\n */\nOO.ui.InputWidget.prototype.setValue = function ( value ) {\n\tvalue = this.cleanUpValue( value );\n\t// Update the DOM if it has changed. Note that with cleanUpValue, it\n\t// is possible for the DOM value to change without this.value changing.\n\tif ( this.$input.val() !== value ) {\n\t\tthis.$input.val( value );\n\t}\n\tif ( this.value !== value ) {\n\t\tthis.value = value;\n\t\tthis.emit( 'change', this.value );\n\t}\n\treturn this;\n};\n\n/**\n * Clean up incoming value.\n *\n * Ensures value is a string, and converts undefined and null to empty string.\n *\n * @private\n * @param {string} value Original value\n * @return {string} Cleaned up value\n */\nOO.ui.InputWidget.prototype.cleanUpValue = function ( value ) {\n\tif ( value === undefined || value === null ) {\n\t\treturn '';\n\t} else if ( this.inputFilter ) {\n\t\treturn this.inputFilter( String( value ) );\n\t} else {\n\t\treturn String( value );\n\t}\n};\n\n/**\n * Simulate the behavior of clicking on a label bound to this input. This method is only called by\n * {@link OO.ui.LabelWidget LabelWidget} and {@link OO.ui.FieldLayout FieldLayout}. It should not be\n * called directly.\n */\nOO.ui.InputWidget.prototype.simulateLabelClick = function () {\n\tOO.ui.warnDeprecation( 'InputWidget: simulateLabelClick() is deprecated.' );\n\tif ( !this.isDisabled() ) {\n\t\tif ( this.$input.is( ':checkbox, :radio' ) ) {\n\t\t\tthis.$input.click();\n\t\t}\n\t\tif ( this.$input.is( ':input' ) ) {\n\t\t\tthis.$input[ 0 ].focus();\n\t\t}\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.InputWidget.prototype.setDisabled = function ( state ) {\n\tOO.ui.InputWidget.parent.prototype.setDisabled.call( this, state );\n\tif ( this.$input ) {\n\t\tthis.$input.prop( 'disabled', this.isDisabled() );\n\t}\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.InputWidget.prototype.restorePreInfuseState = function ( state ) {\n\tOO.ui.InputWidget.parent.prototype.restorePreInfuseState.call( this, state );\n\tif ( state.value !== undefined && state.value !== this.getValue() ) {\n\t\tthis.setValue( state.value );\n\t}\n\tif ( state.focus ) {\n\t\tthis.focus();\n\t}\n};\n","/**\n * ButtonInputWidget is used to submit HTML forms and is intended to be used within\n * a OO.ui.FormLayout. If you do not need the button to work with HTML forms, you probably\n * want to use OO.ui.ButtonWidget instead. Button input widgets can be rendered as either an\n * HTML `<button>` (the default) or an HTML `<input>` tags. See the\n * [OOjs UI documentation on MediaWiki] [1] for more information.\n *\n *     @example\n *     // A ButtonInputWidget rendered as an HTML button, the default.\n *     var button = new OO.ui.ButtonInputWidget( {\n *         label: 'Input button',\n *         icon: 'check',\n *         value: 'check'\n *     } );\n *     $( 'body' ).append( button.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs#Button_inputs\n *\n * @class\n * @extends OO.ui.InputWidget\n * @mixins OO.ui.mixin.ButtonElement\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.TitledElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string} [type='button'] The value of the HTML `'type'` attribute: 'button', 'submit' or 'reset'.\n * @cfg {boolean} [useInputTag=false] Use an `<input>` tag instead of a `<button>` tag, the default.\n *  Widgets configured to be an `<input>` do not support {@link #icon icons} and {@link #indicator indicators},\n *  non-plaintext {@link #label labels}, or {@link #value values}. In general, useInputTag should only\n *  be set to `true` when there’s need to support IE 6 in a form with multiple buttons.\n */\nOO.ui.ButtonInputWidget = function OoUiButtonInputWidget( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( { type: 'button', useInputTag: false }, config );\n\n\t// See InputWidget#reusePreInfuseDOM about config.$input\n\tif ( config.$input ) {\n\t\tconfig.$input.empty();\n\t}\n\n\t// Properties (must be set before parent constructor, which calls #setValue)\n\tthis.useInputTag = config.useInputTag;\n\n\t// Parent constructor\n\tOO.ui.ButtonInputWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ButtonElement.call( this, $.extend( {}, config, { $button: this.$input } ) );\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\tOO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$input } ) );\n\n\t// Initialization\n\tif ( !config.useInputTag ) {\n\t\tthis.$input.append( this.$icon, this.$label, this.$indicator );\n\t}\n\tthis.$element.addClass( 'oo-ui-buttonInputWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ButtonInputWidget, OO.ui.InputWidget );\nOO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.ButtonElement );\nOO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.TitledElement );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.ButtonInputWidget.static.tagName = 'span';\n\n/* Methods */\n\n/**\n * @inheritdoc\n * @protected\n */\nOO.ui.ButtonInputWidget.prototype.getInputElement = function ( config ) {\n\tvar type;\n\ttype = [ 'button', 'submit', 'reset' ].indexOf( config.type ) !== -1 ? config.type : 'button';\n\treturn $( '<' + ( config.useInputTag ? 'input' : 'button' ) + ' type=\"' + type + '\">' );\n};\n\n/**\n * Set label value.\n *\n * If #useInputTag is `true`, the label is set as the `value` of the `<input>` tag.\n *\n * @param {jQuery|string|Function|null} label Label nodes, text, a function that returns nodes or\n *  text, or `null` for no label\n * @chainable\n */\nOO.ui.ButtonInputWidget.prototype.setLabel = function ( label ) {\n\tif ( typeof label === 'function' ) {\n\t\tlabel = OO.ui.resolveMsg( label );\n\t}\n\n\tif ( this.useInputTag ) {\n\t\t// Discard non-plaintext labels\n\t\tif ( typeof label !== 'string' ) {\n\t\t\tlabel = '';\n\t\t}\n\n\t\tthis.$input.val( label );\n\t}\n\n\treturn OO.ui.mixin.LabelElement.prototype.setLabel.call( this, label );\n};\n\n/**\n * Set the value of the input.\n *\n * This method is disabled for button inputs configured as {@link #useInputTag <input> tags}, as\n * they do not support {@link #value values}.\n *\n * @param {string} value New value\n * @chainable\n */\nOO.ui.ButtonInputWidget.prototype.setValue = function ( value ) {\n\tif ( !this.useInputTag ) {\n\t\tOO.ui.ButtonInputWidget.parent.prototype.setValue.call( this, value );\n\t}\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ButtonInputWidget.prototype.getInputId = function () {\n\t// Disable generating `<label>` elements for buttons. One would very rarely need additional label\n\t// for a button, and it's already a big clickable target, and it causes unexpected rendering.\n\treturn null;\n};\n","/**\n * CheckboxInputWidgets, like HTML checkboxes, can be selected and/or configured with a value.\n * Note that these {@link OO.ui.InputWidget input widgets} are best laid out\n * in {@link OO.ui.FieldLayout field layouts} that use the {@link OO.ui.FieldLayout#align inline}\n * alignment. For more information, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.\n *\n *     @example\n *     // An example of selected, unselected, and disabled checkbox inputs\n *     var checkbox1=new OO.ui.CheckboxInputWidget( {\n *          value: 'a',\n *          selected: true\n *     } );\n *     var checkbox2=new OO.ui.CheckboxInputWidget( {\n *         value: 'b'\n *     } );\n *     var checkbox3=new OO.ui.CheckboxInputWidget( {\n *         value:'c',\n *         disabled: true\n *     } );\n *     // Create a fieldset layout with fields for each checkbox.\n *     var fieldset = new OO.ui.FieldsetLayout( {\n *         label: 'Checkboxes'\n *     } );\n *     fieldset.addItems( [\n *         new OO.ui.FieldLayout( checkbox1, { label: 'Selected checkbox', align: 'inline' } ),\n *         new OO.ui.FieldLayout( checkbox2, { label: 'Unselected checkbox', align: 'inline' } ),\n *         new OO.ui.FieldLayout( checkbox3, { label: 'Disabled checkbox', align: 'inline' } ),\n *     ] );\n *     $( 'body' ).append( fieldset.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs\n *\n * @class\n * @extends OO.ui.InputWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [selected=false] Select the checkbox initially. By default, the checkbox is not selected.\n */\nOO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.CheckboxInputWidget.parent.call( this, config );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-checkboxInputWidget' )\n\t\t// Required for pretty styling in MediaWiki theme\n\t\t.append( $( '<span>' ) );\n\tthis.setSelected( config.selected !== undefined ? config.selected : false );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.CheckboxInputWidget.static.tagName = 'span';\n\n/* Static Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.CheckboxInputWidget.static.gatherPreInfuseState = function ( node, config ) {\n\tvar state = OO.ui.CheckboxInputWidget.parent.static.gatherPreInfuseState( node, config );\n\tstate.checked = config.$input.prop( 'checked' );\n\treturn state;\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n * @protected\n */\nOO.ui.CheckboxInputWidget.prototype.getInputElement = function () {\n\treturn $( '<input>' ).attr( 'type', 'checkbox' );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CheckboxInputWidget.prototype.onEdit = function () {\n\tvar widget = this;\n\tif ( !this.isDisabled() ) {\n\t\t// Allow the stack to clear so the value will be updated\n\t\tsetTimeout( function () {\n\t\t\twidget.setSelected( widget.$input.prop( 'checked' ) );\n\t\t} );\n\t}\n};\n\n/**\n * Set selection state of this checkbox.\n *\n * @param {boolean} state `true` for selected\n * @chainable\n */\nOO.ui.CheckboxInputWidget.prototype.setSelected = function ( state ) {\n\tstate = !!state;\n\tif ( this.selected !== state ) {\n\t\tthis.selected = state;\n\t\tthis.$input.prop( 'checked', this.selected );\n\t\tthis.emit( 'change', this.selected );\n\t}\n\treturn this;\n};\n\n/**\n * Check if this checkbox is selected.\n *\n * @return {boolean} Checkbox is selected\n */\nOO.ui.CheckboxInputWidget.prototype.isSelected = function () {\n\t// Resynchronize our internal data with DOM data. Other scripts executing on the page can modify\n\t// it, and we won't know unless they're kind enough to trigger a 'change' event.\n\tvar selected = this.$input.prop( 'checked' );\n\tif ( this.selected !== selected ) {\n\t\tthis.setSelected( selected );\n\t}\n\treturn this.selected;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CheckboxInputWidget.prototype.restorePreInfuseState = function ( state ) {\n\tOO.ui.CheckboxInputWidget.parent.prototype.restorePreInfuseState.call( this, state );\n\tif ( state.checked !== undefined && state.checked !== this.isSelected() ) {\n\t\tthis.setSelected( state.checked );\n\t}\n};\n","/**\n * DropdownInputWidget is a {@link OO.ui.DropdownWidget DropdownWidget} intended to be used\n * within an HTML form, such as a OO.ui.FormLayout. The selected value is synchronized with the value\n * of a hidden HTML `input` tag. Please see the [OOjs UI documentation on MediaWiki][1] for\n * more information about input widgets.\n *\n * A DropdownInputWidget always has a value (one of the options is always selected), unless there\n * are no options. If no `value` configuration option is provided, the first option is selected.\n * If you need a state representing no value (no option being selected), use a DropdownWidget.\n *\n * This and OO.ui.RadioSelectInputWidget support the same configuration options.\n *\n *     @example\n *     // Example: A DropdownInputWidget with three options\n *     var dropdownInput = new OO.ui.DropdownInputWidget( {\n *         options: [\n *             { data: 'a', label: 'First' },\n *             { data: 'b', label: 'Second'},\n *             { data: 'c', label: 'Third' }\n *         ]\n *     } );\n *     $( 'body' ).append( dropdownInput.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs\n *\n * @class\n * @extends OO.ui.InputWidget\n * @mixins OO.ui.mixin.TitledElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`\n * @cfg {Object} [dropdown] Configuration options for {@link OO.ui.DropdownWidget DropdownWidget}\n */\nOO.ui.DropdownInputWidget = function OoUiDropdownInputWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// See InputWidget#reusePreInfuseDOM about config.$input\n\tif ( config.$input ) {\n\t\tconfig.$input.addClass( 'oo-ui-element-hidden' );\n\t}\n\n\t// Properties (must be done before parent constructor which calls #setDisabled)\n\tthis.dropdownWidget = new OO.ui.DropdownWidget( config.dropdown );\n\n\t// Parent constructor\n\tOO.ui.DropdownInputWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.TitledElement.call( this, config );\n\n\t// Events\n\tthis.dropdownWidget.getMenu().connect( this, { select: 'onMenuSelect' } );\n\n\t// Initialization\n\tthis.setOptions( config.options || [] );\n\tthis.$element\n\t\t.addClass( 'oo-ui-dropdownInputWidget' )\n\t\t.append( this.dropdownWidget.$element );\n\tthis.setTabIndexedElement( null );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.DropdownInputWidget, OO.ui.InputWidget );\nOO.mixinClass( OO.ui.DropdownInputWidget, OO.ui.mixin.TitledElement );\n\n/* Methods */\n\n/**\n * @inheritdoc\n * @protected\n */\nOO.ui.DropdownInputWidget.prototype.getInputElement = function () {\n\treturn $( '<input>' ).attr( 'type', 'hidden' );\n};\n\n/**\n * Handles menu select events.\n *\n * @private\n * @param {OO.ui.MenuOptionWidget} item Selected menu item\n */\nOO.ui.DropdownInputWidget.prototype.onMenuSelect = function ( item ) {\n\tthis.setValue( item.getData() );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.DropdownInputWidget.prototype.setValue = function ( value ) {\n\tvar selected;\n\tvalue = this.cleanUpValue( value );\n\tthis.dropdownWidget.getMenu().selectItemByData( value );\n\t// Only allow setting values that are actually present in the dropdown\n\tselected = this.dropdownWidget.getMenu().getSelectedItem();\n\tvalue = selected ? selected.getData() : '';\n\tOO.ui.DropdownInputWidget.parent.prototype.setValue.call( this, value );\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.DropdownInputWidget.prototype.setDisabled = function ( state ) {\n\tthis.dropdownWidget.setDisabled( state );\n\tOO.ui.DropdownInputWidget.parent.prototype.setDisabled.call( this, state );\n\treturn this;\n};\n\n/**\n * Set the options available for this input.\n *\n * @param {Object[]} options Array of menu options in the format `{ data: …, label: … }`\n * @chainable\n */\nOO.ui.DropdownInputWidget.prototype.setOptions = function ( options ) {\n\tvar\n\t\tvalue = this.getValue(),\n\t\twidget = this;\n\n\t// Rebuild the dropdown menu\n\tthis.dropdownWidget.getMenu()\n\t\t.clearItems()\n\t\t.addItems( options.map( function ( opt ) {\n\t\t\tvar optValue = widget.cleanUpValue( opt.data );\n\n\t\t\tif ( opt.optgroup === undefined ) {\n\t\t\t\treturn new OO.ui.MenuOptionWidget( {\n\t\t\t\t\tdata: optValue,\n\t\t\t\t\tlabel: opt.label !== undefined ? opt.label : optValue\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\treturn new OO.ui.MenuSectionOptionWidget( {\n\t\t\t\t\tlabel: opt.optgroup\n\t\t\t\t} );\n\t\t\t}\n\t\t} ) );\n\n\t// Restore the previous value, or reset to something sensible\n\tif ( this.dropdownWidget.getMenu().getItemFromData( value ) ) {\n\t\t// Previous value is still available, ensure consistency with the dropdown\n\t\tthis.setValue( value );\n\t} else {\n\t\t// No longer valid, reset\n\t\tif ( options.length ) {\n\t\t\tthis.setValue( options[ 0 ].data );\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.DropdownInputWidget.prototype.focus = function () {\n\tthis.dropdownWidget.focus();\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.DropdownInputWidget.prototype.blur = function () {\n\tthis.dropdownWidget.blur();\n\treturn this;\n};\n","/**\n * RadioInputWidget creates a single radio button. Because radio buttons are usually used as a set,\n * in most cases you will want to use a {@link OO.ui.RadioSelectWidget radio select}\n * with {@link OO.ui.RadioOptionWidget radio options} instead of this class. For more information,\n * please see the [OOjs UI documentation on MediaWiki][1].\n *\n * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.\n *\n *     @example\n *     // An example of selected, unselected, and disabled radio inputs\n *     var radio1 = new OO.ui.RadioInputWidget( {\n *         value: 'a',\n *         selected: true\n *     } );\n *     var radio2 = new OO.ui.RadioInputWidget( {\n *         value: 'b'\n *     } );\n *     var radio3 = new OO.ui.RadioInputWidget( {\n *         value: 'c',\n *         disabled: true\n *     } );\n *     // Create a fieldset layout with fields for each radio button.\n *     var fieldset = new OO.ui.FieldsetLayout( {\n *         label: 'Radio inputs'\n *     } );\n *     fieldset.addItems( [\n *         new OO.ui.FieldLayout( radio1, { label: 'Selected', align: 'inline' } ),\n *         new OO.ui.FieldLayout( radio2, { label: 'Unselected', align: 'inline' } ),\n *         new OO.ui.FieldLayout( radio3, { label: 'Disabled', align: 'inline' } ),\n *     ] );\n *     $( 'body' ).append( fieldset.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs\n *\n * @class\n * @extends OO.ui.InputWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [selected=false] Select the radio button initially. By default, the radio button is not selected.\n */\nOO.ui.RadioInputWidget = function OoUiRadioInputWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.RadioInputWidget.parent.call( this, config );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-radioInputWidget' )\n\t\t// Required for pretty styling in MediaWiki theme\n\t\t.append( $( '<span>' ) );\n\tthis.setSelected( config.selected !== undefined ? config.selected : false );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.RadioInputWidget, OO.ui.InputWidget );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.RadioInputWidget.static.tagName = 'span';\n\n/* Static Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.RadioInputWidget.static.gatherPreInfuseState = function ( node, config ) {\n\tvar state = OO.ui.RadioInputWidget.parent.static.gatherPreInfuseState( node, config );\n\tstate.checked = config.$input.prop( 'checked' );\n\treturn state;\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n * @protected\n */\nOO.ui.RadioInputWidget.prototype.getInputElement = function () {\n\treturn $( '<input>' ).attr( 'type', 'radio' );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.RadioInputWidget.prototype.onEdit = function () {\n\t// RadioInputWidget doesn't track its state.\n};\n\n/**\n * Set selection state of this radio button.\n *\n * @param {boolean} state `true` for selected\n * @chainable\n */\nOO.ui.RadioInputWidget.prototype.setSelected = function ( state ) {\n\t// RadioInputWidget doesn't track its state.\n\tthis.$input.prop( 'checked', state );\n\treturn this;\n};\n\n/**\n * Check if this radio button is selected.\n *\n * @return {boolean} Radio is selected\n */\nOO.ui.RadioInputWidget.prototype.isSelected = function () {\n\treturn this.$input.prop( 'checked' );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.RadioInputWidget.prototype.restorePreInfuseState = function ( state ) {\n\tOO.ui.RadioInputWidget.parent.prototype.restorePreInfuseState.call( this, state );\n\tif ( state.checked !== undefined && state.checked !== this.isSelected() ) {\n\t\tthis.setSelected( state.checked );\n\t}\n};\n","/**\n * RadioSelectInputWidget is a {@link OO.ui.RadioSelectWidget RadioSelectWidget} intended to be used\n * within an HTML form, such as a OO.ui.FormLayout. The selected value is synchronized with the value\n * of a hidden HTML `input` tag. Please see the [OOjs UI documentation on MediaWiki][1] for\n * more information about input widgets.\n *\n * This and OO.ui.DropdownInputWidget support the same configuration options.\n *\n *     @example\n *     // Example: A RadioSelectInputWidget with three options\n *     var radioSelectInput = new OO.ui.RadioSelectInputWidget( {\n *         options: [\n *             { data: 'a', label: 'First' },\n *             { data: 'b', label: 'Second'},\n *             { data: 'c', label: 'Third' }\n *         ]\n *     } );\n *     $( 'body' ).append( radioSelectInput.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs\n *\n * @class\n * @extends OO.ui.InputWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`\n */\nOO.ui.RadioSelectInputWidget = function OoUiRadioSelectInputWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties (must be done before parent constructor which calls #setDisabled)\n\tthis.radioSelectWidget = new OO.ui.RadioSelectWidget();\n\n\t// Parent constructor\n\tOO.ui.RadioSelectInputWidget.parent.call( this, config );\n\n\t// Events\n\tthis.radioSelectWidget.connect( this, { select: 'onMenuSelect' } );\n\n\t// Initialization\n\tthis.setOptions( config.options || [] );\n\tthis.$element\n\t\t.addClass( 'oo-ui-radioSelectInputWidget' )\n\t\t.append( this.radioSelectWidget.$element );\n\tthis.setTabIndexedElement( null );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.RadioSelectInputWidget, OO.ui.InputWidget );\n\n/* Static Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.RadioSelectInputWidget.static.gatherPreInfuseState = function ( node, config ) {\n\tvar state = OO.ui.RadioSelectInputWidget.parent.static.gatherPreInfuseState( node, config );\n\tstate.value = $( node ).find( '.oo-ui-radioInputWidget .oo-ui-inputWidget-input:checked' ).val();\n\treturn state;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.RadioSelectInputWidget.static.reusePreInfuseDOM = function ( node, config ) {\n\tconfig = OO.ui.RadioSelectInputWidget.parent.static.reusePreInfuseDOM( node, config );\n\t// Cannot reuse the `<input type=radio>` set\n\tdelete config.$input;\n\treturn config;\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n * @protected\n */\nOO.ui.RadioSelectInputWidget.prototype.getInputElement = function () {\n\treturn $( '<input>' ).attr( 'type', 'hidden' );\n};\n\n/**\n * Handles menu select events.\n *\n * @private\n * @param {OO.ui.RadioOptionWidget} item Selected menu item\n */\nOO.ui.RadioSelectInputWidget.prototype.onMenuSelect = function ( item ) {\n\tthis.setValue( item.getData() );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.RadioSelectInputWidget.prototype.setValue = function ( value ) {\n\tvalue = this.cleanUpValue( value );\n\tthis.radioSelectWidget.selectItemByData( value );\n\tOO.ui.RadioSelectInputWidget.parent.prototype.setValue.call( this, value );\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.RadioSelectInputWidget.prototype.setDisabled = function ( state ) {\n\tthis.radioSelectWidget.setDisabled( state );\n\tOO.ui.RadioSelectInputWidget.parent.prototype.setDisabled.call( this, state );\n\treturn this;\n};\n\n/**\n * Set the options available for this input.\n *\n * @param {Object[]} options Array of menu options in the format `{ data: …, label: … }`\n * @chainable\n */\nOO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {\n\tvar\n\t\tvalue = this.getValue(),\n\t\twidget = this;\n\n\t// Rebuild the radioSelect menu\n\tthis.radioSelectWidget\n\t\t.clearItems()\n\t\t.addItems( options.map( function ( opt ) {\n\t\t\tvar optValue = widget.cleanUpValue( opt.data );\n\t\t\treturn new OO.ui.RadioOptionWidget( {\n\t\t\t\tdata: optValue,\n\t\t\t\tlabel: opt.label !== undefined ? opt.label : optValue\n\t\t\t} );\n\t\t} ) );\n\n\t// Restore the previous value, or reset to something sensible\n\tif ( this.radioSelectWidget.getItemFromData( value ) ) {\n\t\t// Previous value is still available, ensure consistency with the radioSelect\n\t\tthis.setValue( value );\n\t} else {\n\t\t// No longer valid, reset\n\t\tif ( options.length ) {\n\t\t\tthis.setValue( options[ 0 ].data );\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.RadioSelectInputWidget.prototype.focus = function () {\n\tthis.radioSelectWidget.focus();\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.RadioSelectInputWidget.prototype.blur = function () {\n\tthis.radioSelectWidget.blur();\n\treturn this;\n};\n","/**\n * CheckboxMultiselectInputWidget is a\n * {@link OO.ui.CheckboxMultiselectWidget CheckboxMultiselectWidget} intended to be used within a\n * HTML form, such as a OO.ui.FormLayout. The selected values are synchronized with the value of\n * HTML `<input type=checkbox>` tags. Please see the [OOjs UI documentation on MediaWiki][1] for\n * more information about input widgets.\n *\n *     @example\n *     // Example: A CheckboxMultiselectInputWidget with three options\n *     var multiselectInput = new OO.ui.CheckboxMultiselectInputWidget( {\n *         options: [\n *             { data: 'a', label: 'First' },\n *             { data: 'b', label: 'Second'},\n *             { data: 'c', label: 'Third' }\n *         ]\n *     } );\n *     $( 'body' ).append( multiselectInput.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs\n *\n * @class\n * @extends OO.ui.InputWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: …, disabled: … }`\n */\nOO.ui.CheckboxMultiselectInputWidget = function OoUiCheckboxMultiselectInputWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties (must be done before parent constructor which calls #setDisabled)\n\tthis.checkboxMultiselectWidget = new OO.ui.CheckboxMultiselectWidget();\n\n\t// Parent constructor\n\tOO.ui.CheckboxMultiselectInputWidget.parent.call( this, config );\n\n\t// Properties\n\tthis.inputName = config.name;\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-checkboxMultiselectInputWidget' )\n\t\t.append( this.checkboxMultiselectWidget.$element );\n\t// We don't use this.$input, but rather the CheckboxInputWidgets inside each option\n\tthis.$input.detach();\n\tthis.setOptions( config.options || [] );\n\t// Have to repeat this from parent, as we need options to be set up for this to make sense\n\tthis.setValue( config.value );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.CheckboxMultiselectInputWidget, OO.ui.InputWidget );\n\n/* Static Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.CheckboxMultiselectInputWidget.static.gatherPreInfuseState = function ( node, config ) {\n\tvar state = OO.ui.CheckboxMultiselectInputWidget.parent.static.gatherPreInfuseState( node, config );\n\tstate.value = $( node ).find( '.oo-ui-checkboxInputWidget .oo-ui-inputWidget-input:checked' )\n\t\t.toArray().map( function ( el ) { return el.value; } );\n\treturn state;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CheckboxMultiselectInputWidget.static.reusePreInfuseDOM = function ( node, config ) {\n\tconfig = OO.ui.CheckboxMultiselectInputWidget.parent.static.reusePreInfuseDOM( node, config );\n\t// Cannot reuse the `<input type=checkbox>` set\n\tdelete config.$input;\n\treturn config;\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n * @protected\n */\nOO.ui.CheckboxMultiselectInputWidget.prototype.getInputElement = function () {\n\t// Actually unused\n\treturn $( '<unused>' );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CheckboxMultiselectInputWidget.prototype.getValue = function () {\n\tvar value = this.$element.find( '.oo-ui-checkboxInputWidget .oo-ui-inputWidget-input:checked' )\n\t\t.toArray().map( function ( el ) { return el.value; } );\n\tif ( this.value !== value ) {\n\t\tthis.setValue( value );\n\t}\n\treturn this.value;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CheckboxMultiselectInputWidget.prototype.setValue = function ( value ) {\n\tvalue = this.cleanUpValue( value );\n\tthis.checkboxMultiselectWidget.selectItemsByData( value );\n\tOO.ui.CheckboxMultiselectInputWidget.parent.prototype.setValue.call( this, value );\n\treturn this;\n};\n\n/**\n * Clean up incoming value.\n *\n * @param {string[]} value Original value\n * @return {string[]} Cleaned up value\n */\nOO.ui.CheckboxMultiselectInputWidget.prototype.cleanUpValue = function ( value ) {\n\tvar i, singleValue,\n\t\tcleanValue = [];\n\tif ( !Array.isArray( value ) ) {\n\t\treturn cleanValue;\n\t}\n\tfor ( i = 0; i < value.length; i++ ) {\n\t\tsingleValue =\n\t\t\tOO.ui.CheckboxMultiselectInputWidget.parent.prototype.cleanUpValue.call( this, value[ i ] );\n\t\t// Remove options that we don't have here\n\t\tif ( !this.checkboxMultiselectWidget.getItemFromData( singleValue ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tcleanValue.push( singleValue );\n\t}\n\treturn cleanValue;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CheckboxMultiselectInputWidget.prototype.setDisabled = function ( state ) {\n\tthis.checkboxMultiselectWidget.setDisabled( state );\n\tOO.ui.CheckboxMultiselectInputWidget.parent.prototype.setDisabled.call( this, state );\n\treturn this;\n};\n\n/**\n * Set the options available for this input.\n *\n * @param {Object[]} options Array of menu options in the format `{ data: …, label: …, disabled: … }`\n * @chainable\n */\nOO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options ) {\n\tvar widget = this;\n\n\t// Rebuild the checkboxMultiselectWidget menu\n\tthis.checkboxMultiselectWidget\n\t\t.clearItems()\n\t\t.addItems( options.map( function ( opt ) {\n\t\t\tvar optValue, item, optDisabled;\n\t\t\toptValue =\n\t\t\t\tOO.ui.CheckboxMultiselectInputWidget.parent.prototype.cleanUpValue.call( widget, opt.data );\n\t\t\toptDisabled = opt.disabled !== undefined ? opt.disabled : false;\n\t\t\titem = new OO.ui.CheckboxMultioptionWidget( {\n\t\t\t\tdata: optValue,\n\t\t\t\tlabel: opt.label !== undefined ? opt.label : optValue,\n\t\t\t\tdisabled: optDisabled\n\t\t\t} );\n\t\t\t// Set the 'name' and 'value' for form submission\n\t\t\titem.checkbox.$input.attr( 'name', widget.inputName );\n\t\t\titem.checkbox.setValue( optValue );\n\t\t\treturn item;\n\t\t} ) );\n\n\t// Re-set the value, checking the checkboxes as needed.\n\t// This will also get rid of any stale options that we just removed.\n\tthis.setValue( this.getValue() );\n\n\treturn this;\n};\n","/**\n * TextInputWidgets, like HTML text inputs, can be configured with options that customize the\n * size of the field as well as its presentation. In addition, these widgets can be configured\n * with {@link OO.ui.mixin.IconElement icons}, {@link OO.ui.mixin.IndicatorElement indicators}, an optional\n * validation-pattern (used to determine if an input value is valid or not) and an input filter,\n * which modifies incoming values rather than validating them.\n * Please see the [OOjs UI documentation on MediaWiki] [1] for more information and examples.\n *\n * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.\n *\n *     @example\n *     // Example of a text input widget\n *     var textInput = new OO.ui.TextInputWidget( {\n *         value: 'Text input'\n *     } )\n *     $( 'body' ).append( textInput.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs\n *\n * @class\n * @extends OO.ui.InputWidget\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.PendingElement\n * @mixins OO.ui.mixin.LabelElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string} [type='text'] The value of the HTML `type` attribute: 'text', 'password', 'search',\n *  'email', 'url' or 'number'. Ignored if `multiline` is true.\n *\n *  Some values of `type` result in additional behaviors:\n *\n *  - `search`: implies `icon: 'search'` and `indicator: 'clear'`; when clicked, the indicator\n *    empties the text field\n * @cfg {string} [placeholder] Placeholder text\n * @cfg {boolean} [autofocus=false] Use an HTML `autofocus` attribute to\n *  instruct the browser to focus this widget.\n * @cfg {boolean} [readOnly=false] Prevent changes to the value of the text input.\n * @cfg {number} [maxLength] Maximum number of characters allowed in the input.\n * @cfg {boolean} [multiline=false] Allow multiple lines of text\n * @cfg {number} [rows] If multiline, number of visible lines in textarea. If used with `autosize`,\n *  specifies minimum number of rows to display.\n * @cfg {boolean} [autosize=false] Automatically resize the text input to fit its content.\n *  Use the #maxRows config to specify a maximum number of displayed rows.\n * @cfg {number} [maxRows] Maximum number of rows to display when #autosize is set to true.\n *  Defaults to the maximum of `10` and `2 * rows`, or `10` if `rows` isn't provided.\n * @cfg {string} [labelPosition='after'] The position of the inline label relative to that of\n *  the value or placeholder text: `'before'` or `'after'`\n * @cfg {boolean} [required=false] Mark the field as required. Implies `indicator: 'required'`.\n * @cfg {boolean} [autocomplete=true] Should the browser support autocomplete for this field\n * @cfg {RegExp|Function|string} [validate] Validation pattern: when string, a symbolic name of a\n *  pattern defined by the class: 'non-empty' (the value cannot be an empty string) or 'integer'\n *  (the value must contain only numbers); when RegExp, a regular expression that must match the\n *  value for it to be considered valid; when Function, a function receiving the value as parameter\n *  that must return true, or promise resolving to true, for it to be considered valid.\n */\nOO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( {\n\t\ttype: 'text',\n\t\tlabelPosition: 'after'\n\t}, config );\n\n\tif ( config.type === 'search' ) {\n\t\tOO.ui.warnDeprecation( 'TextInputWidget: config.type=\\'search\\' is deprecated. Use the SearchInputWidget instead. See T148471 for details.' );\n\t\tif ( config.icon === undefined ) {\n\t\t\tconfig.icon = 'search';\n\t\t}\n\t\t// indicator: 'clear' is set dynamically later, depending on value\n\t}\n\n\t// Parent constructor\n\tOO.ui.TextInputWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$input } ) );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\n\t// Properties\n\tthis.type = this.getSaneType( config );\n\tthis.readOnly = false;\n\tthis.required = false;\n\tthis.multiline = !!config.multiline;\n\tthis.autosize = !!config.autosize;\n\tthis.minRows = config.rows !== undefined ? config.rows : '';\n\tthis.maxRows = config.maxRows || Math.max( 2 * ( this.minRows || 0 ), 10 );\n\tthis.validate = null;\n\tthis.styleHeight = null;\n\tthis.scrollWidth = null;\n\n\t// Clone for resizing\n\tif ( this.autosize ) {\n\t\tthis.$clone = this.$input\n\t\t\t.clone()\n\t\t\t.insertAfter( this.$input )\n\t\t\t.attr( 'aria-hidden', 'true' )\n\t\t\t.addClass( 'oo-ui-element-hidden' );\n\t}\n\n\tthis.setValidation( config.validate );\n\tthis.setLabelPosition( config.labelPosition );\n\n\t// Events\n\tthis.$input.on( {\n\t\tkeypress: this.onKeyPress.bind( this ),\n\t\tblur: this.onBlur.bind( this ),\n\t\tfocus: this.onFocus.bind( this )\n\t} );\n\tthis.$icon.on( 'mousedown', this.onIconMouseDown.bind( this ) );\n\tthis.$indicator.on( 'mousedown', this.onIndicatorMouseDown.bind( this ) );\n\tthis.on( 'labelChange', this.updatePosition.bind( this ) );\n\tthis.connect( this, {\n\t\tchange: 'onChange',\n\t\tdisable: 'onDisable'\n\t} );\n\tthis.on( 'change', OO.ui.debounce( this.onDebouncedChange.bind( this ), 250 ) );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-textInputWidget oo-ui-textInputWidget-type-' + this.type )\n\t\t.append( this.$icon, this.$indicator );\n\tthis.setReadOnly( !!config.readOnly );\n\tthis.setRequired( !!config.required );\n\tthis.updateSearchIndicator();\n\tif ( config.placeholder !== undefined ) {\n\t\tthis.$input.attr( 'placeholder', config.placeholder );\n\t}\n\tif ( config.maxLength !== undefined ) {\n\t\tthis.$input.attr( 'maxlength', config.maxLength );\n\t}\n\tif ( config.autofocus ) {\n\t\tthis.$input.attr( 'autofocus', 'autofocus' );\n\t}\n\tif ( config.autocomplete === false ) {\n\t\tthis.$input.attr( 'autocomplete', 'off' );\n\t\t// Turning off autocompletion also disables \"form caching\" when the user navigates to a\n\t\t// different page and then clicks \"Back\". Re-enable it when leaving. Borrowed from jQuery UI.\n\t\t$( window ).on( {\n\t\t\tbeforeunload: function () {\n\t\t\t\tthis.$input.removeAttr( 'autocomplete' );\n\t\t\t}.bind( this ),\n\t\t\tpageshow: function () {\n\t\t\t\t// Browsers don't seem to actually fire this event on \"Back\", they instead just reload the\n\t\t\t\t// whole page... it shouldn't hurt, though.\n\t\t\t\tthis.$input.attr( 'autocomplete', 'off' );\n\t\t\t}.bind( this )\n\t\t} );\n\t}\n\tif ( this.multiline && config.rows ) {\n\t\tthis.$input.attr( 'rows', config.rows );\n\t}\n\tif ( this.label || config.autosize ) {\n\t\tthis.isWaitingToBeAttached = true;\n\t\tthis.installParentChangeDetector();\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.TextInputWidget, OO.ui.InputWidget );\nOO.mixinClass( OO.ui.TextInputWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.TextInputWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.TextInputWidget, OO.ui.mixin.PendingElement );\nOO.mixinClass( OO.ui.TextInputWidget, OO.ui.mixin.LabelElement );\n\n/* Static Properties */\n\nOO.ui.TextInputWidget.static.validationPatterns = {\n\t'non-empty': /.+/,\n\tinteger: /^\\d+$/\n};\n\n/* Static Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.TextInputWidget.static.gatherPreInfuseState = function ( node, config ) {\n\tvar state = OO.ui.TextInputWidget.parent.static.gatherPreInfuseState( node, config );\n\tif ( config.multiline ) {\n\t\tstate.scrollTop = config.$input.scrollTop();\n\t}\n\treturn state;\n};\n\n/* Events */\n\n/**\n * An `enter` event is emitted when the user presses 'enter' inside the text box.\n *\n * Not emitted if the input is multiline.\n *\n * @event enter\n */\n\n/**\n * A `resize` event is emitted when autosize is set and the widget resizes\n *\n * @event resize\n */\n\n/* Methods */\n\n/**\n * Handle icon mouse down events.\n *\n * @private\n * @param {jQuery.Event} e Mouse down event\n */\nOO.ui.TextInputWidget.prototype.onIconMouseDown = function ( e ) {\n\tif ( e.which === OO.ui.MouseButtons.LEFT ) {\n\t\tthis.focus();\n\t\treturn false;\n\t}\n};\n\n/**\n * Handle indicator mouse down events.\n *\n * @private\n * @param {jQuery.Event} e Mouse down event\n */\nOO.ui.TextInputWidget.prototype.onIndicatorMouseDown = function ( e ) {\n\tif ( e.which === OO.ui.MouseButtons.LEFT ) {\n\t\tif ( this.type === 'search' ) {\n\t\t\t// Clear the text field\n\t\t\tthis.setValue( '' );\n\t\t}\n\t\tthis.focus();\n\t\treturn false;\n\t}\n};\n\n/**\n * Handle key press events.\n *\n * @private\n * @param {jQuery.Event} e Key press event\n * @fires enter If enter key is pressed and input is not multiline\n */\nOO.ui.TextInputWidget.prototype.onKeyPress = function ( e ) {\n\tif ( e.which === OO.ui.Keys.ENTER && !this.multiline ) {\n\t\tthis.emit( 'enter', e );\n\t}\n};\n\n/**\n * Handle blur events.\n *\n * @private\n * @param {jQuery.Event} e Blur event\n */\nOO.ui.TextInputWidget.prototype.onBlur = function () {\n\tthis.setValidityFlag();\n};\n\n/**\n * Handle focus events.\n *\n * @private\n * @param {jQuery.Event} e Focus event\n */\nOO.ui.TextInputWidget.prototype.onFocus = function () {\n\tif ( this.isWaitingToBeAttached ) {\n\t\t// If we've received focus, then we must be attached to the document, and if\n\t\t// isWaitingToBeAttached is still true, that means the handler never fired. Fire it now.\n\t\tthis.onElementAttach();\n\t}\n\tthis.setValidityFlag( true );\n};\n\n/**\n * Handle element attach events.\n *\n * @private\n * @param {jQuery.Event} e Element attach event\n */\nOO.ui.TextInputWidget.prototype.onElementAttach = function () {\n\tthis.isWaitingToBeAttached = false;\n\t// Any previously calculated size is now probably invalid if we reattached elsewhere\n\tthis.valCache = null;\n\tthis.adjustSize();\n\tthis.positionLabel();\n};\n\n/**\n * Handle change events.\n *\n * @param {string} value\n * @private\n */\nOO.ui.TextInputWidget.prototype.onChange = function () {\n\tthis.updateSearchIndicator();\n\tthis.adjustSize();\n};\n\n/**\n * Handle debounced change events.\n *\n * @param {string} value\n * @private\n */\nOO.ui.TextInputWidget.prototype.onDebouncedChange = function () {\n\tthis.setValidityFlag();\n};\n\n/**\n * Handle disable events.\n *\n * @param {boolean} disabled Element is disabled\n * @private\n */\nOO.ui.TextInputWidget.prototype.onDisable = function () {\n\tthis.updateSearchIndicator();\n};\n\n/**\n * Check if the input is {@link #readOnly read-only}.\n *\n * @return {boolean}\n */\nOO.ui.TextInputWidget.prototype.isReadOnly = function () {\n\treturn this.readOnly;\n};\n\n/**\n * Set the {@link #readOnly read-only} state of the input.\n *\n * @param {boolean} state Make input read-only\n * @chainable\n */\nOO.ui.TextInputWidget.prototype.setReadOnly = function ( state ) {\n\tthis.readOnly = !!state;\n\tthis.$input.prop( 'readOnly', this.readOnly );\n\tthis.updateSearchIndicator();\n\treturn this;\n};\n\n/**\n * Check if the input is {@link #required required}.\n *\n * @return {boolean}\n */\nOO.ui.TextInputWidget.prototype.isRequired = function () {\n\treturn this.required;\n};\n\n/**\n * Set the {@link #required required} state of the input.\n *\n * @param {boolean} state Make input required\n * @chainable\n */\nOO.ui.TextInputWidget.prototype.setRequired = function ( state ) {\n\tthis.required = !!state;\n\tif ( this.required ) {\n\t\tthis.$input\n\t\t\t.prop( 'required', true )\n\t\t\t.attr( 'aria-required', 'true' );\n\t\tif ( this.getIndicator() === null ) {\n\t\t\tthis.setIndicator( 'required' );\n\t\t}\n\t} else {\n\t\tthis.$input\n\t\t\t.prop( 'required', false )\n\t\t\t.removeAttr( 'aria-required' );\n\t\tif ( this.getIndicator() === 'required' ) {\n\t\t\tthis.setIndicator( null );\n\t\t}\n\t}\n\tthis.updateSearchIndicator();\n\treturn this;\n};\n\n/**\n * Support function for making #onElementAttach work across browsers.\n *\n * This whole function could be replaced with one line of code using the DOMNodeInsertedIntoDocument\n * event, but it's not supported by Firefox and allegedly deprecated, so we only use it as fallback.\n *\n * Due to MutationObserver performance woes, #onElementAttach is only somewhat reliably called the\n * first time that the element gets attached to the documented.\n */\nOO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {\n\tvar mutationObserver, onRemove, topmostNode, fakeParentNode,\n\t\tMutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,\n\t\twidget = this;\n\n\tif ( MutationObserver ) {\n\t\t// The new way. If only it wasn't so ugly.\n\n\t\tif ( this.isElementAttached() ) {\n\t\t\t// Widget is attached already, do nothing. This breaks the functionality of this function when\n\t\t\t// the widget is detached and reattached. Alas, doing this correctly with MutationObserver\n\t\t\t// would require observation of the whole document, which would hurt performance of other,\n\t\t\t// more important code.\n\t\t\treturn;\n\t\t}\n\n\t\t// Find topmost node in the tree\n\t\ttopmostNode = this.$element[ 0 ];\n\t\twhile ( topmostNode.parentNode ) {\n\t\t\ttopmostNode = topmostNode.parentNode;\n\t\t}\n\n\t\t// We have no way to detect the $element being attached somewhere without observing the entire\n\t\t// DOM with subtree modifications, which would hurt performance. So we cheat: we hook to the\n\t\t// parent node of $element, and instead detect when $element is removed from it (and thus\n\t\t// probably attached somewhere else). If there is no parent, we create a \"fake\" one. If it\n\t\t// doesn't get attached, we end up back here and create the parent.\n\n\t\tmutationObserver = new MutationObserver( function ( mutations ) {\n\t\t\tvar i, j, removedNodes;\n\t\t\tfor ( i = 0; i < mutations.length; i++ ) {\n\t\t\t\tremovedNodes = mutations[ i ].removedNodes;\n\t\t\t\tfor ( j = 0; j < removedNodes.length; j++ ) {\n\t\t\t\t\tif ( removedNodes[ j ] === topmostNode ) {\n\t\t\t\t\t\tsetTimeout( onRemove, 0 );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tonRemove = function () {\n\t\t\t// If the node was attached somewhere else, report it\n\t\t\tif ( widget.isElementAttached() ) {\n\t\t\t\twidget.onElementAttach();\n\t\t\t}\n\t\t\tmutationObserver.disconnect();\n\t\t\twidget.installParentChangeDetector();\n\t\t};\n\n\t\t// Create a fake parent and observe it\n\t\tfakeParentNode = $( '<div>' ).append( topmostNode )[ 0 ];\n\t\tmutationObserver.observe( fakeParentNode, { childList: true } );\n\t} else {\n\t\t// Using the DOMNodeInsertedIntoDocument event is much nicer and less magical, and works for\n\t\t// detachment and reattachment, but it's not supported by Firefox and allegedly deprecated.\n\t\tthis.$element.on( 'DOMNodeInsertedIntoDocument', this.onElementAttach.bind( this ) );\n\t}\n};\n\n/**\n * Automatically adjust the size of the text input.\n *\n * This only affects #multiline inputs that are {@link #autosize autosized}.\n *\n * @chainable\n * @fires resize\n */\nOO.ui.TextInputWidget.prototype.adjustSize = function () {\n\tvar scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError,\n\t\tidealHeight, newHeight, scrollWidth, property;\n\n\tif ( this.isWaitingToBeAttached ) {\n\t\t// #onElementAttach will be called soon, which calls this method\n\t\treturn this;\n\t}\n\n\tif ( this.multiline && this.$input.val() !== this.valCache ) {\n\t\tif ( this.autosize ) {\n\t\t\tthis.$clone\n\t\t\t\t.val( this.$input.val() )\n\t\t\t\t.attr( 'rows', this.minRows )\n\t\t\t\t// Set inline height property to 0 to measure scroll height\n\t\t\t\t.css( 'height', 0 );\n\n\t\t\tthis.$clone.removeClass( 'oo-ui-element-hidden' );\n\n\t\t\tthis.valCache = this.$input.val();\n\n\t\t\tscrollHeight = this.$clone[ 0 ].scrollHeight;\n\n\t\t\t// Remove inline height property to measure natural heights\n\t\t\tthis.$clone.css( 'height', '' );\n\t\t\tinnerHeight = this.$clone.innerHeight();\n\t\t\touterHeight = this.$clone.outerHeight();\n\n\t\t\t// Measure max rows height\n\t\t\tthis.$clone\n\t\t\t\t.attr( 'rows', this.maxRows )\n\t\t\t\t.css( 'height', 'auto' )\n\t\t\t\t.val( '' );\n\t\t\tmaxInnerHeight = this.$clone.innerHeight();\n\n\t\t\t// Difference between reported innerHeight and scrollHeight with no scrollbars present.\n\t\t\t// This is sometimes non-zero on Blink-based browsers, depending on zoom level.\n\t\t\tmeasurementError = maxInnerHeight - this.$clone[ 0 ].scrollHeight;\n\t\t\tidealHeight = Math.min( maxInnerHeight, scrollHeight + measurementError );\n\n\t\t\tthis.$clone.addClass( 'oo-ui-element-hidden' );\n\n\t\t\t// Only apply inline height when expansion beyond natural height is needed\n\t\t\t// Use the difference between the inner and outer height as a buffer\n\t\t\tnewHeight = idealHeight > innerHeight ? idealHeight + ( outerHeight - innerHeight ) : '';\n\t\t\tif ( newHeight !== this.styleHeight ) {\n\t\t\t\tthis.$input.css( 'height', newHeight );\n\t\t\t\tthis.styleHeight = newHeight;\n\t\t\t\tthis.emit( 'resize' );\n\t\t\t}\n\t\t}\n\t\tscrollWidth = this.$input[ 0 ].offsetWidth - this.$input[ 0 ].clientWidth;\n\t\tif ( scrollWidth !== this.scrollWidth ) {\n\t\t\tproperty = this.$element.css( 'direction' ) === 'rtl' ? 'left' : 'right';\n\t\t\t// Reset\n\t\t\tthis.$label.css( { right: '', left: '' } );\n\t\t\tthis.$indicator.css( { right: '', left: '' } );\n\n\t\t\tif ( scrollWidth ) {\n\t\t\t\tthis.$indicator.css( property, scrollWidth );\n\t\t\t\tif ( this.labelPosition === 'after' ) {\n\t\t\t\t\tthis.$label.css( property, scrollWidth );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.scrollWidth = scrollWidth;\n\t\t\tthis.positionLabel();\n\t\t}\n\t}\n\treturn this;\n};\n\n/**\n * @inheritdoc\n * @protected\n */\nOO.ui.TextInputWidget.prototype.getInputElement = function ( config ) {\n\tif ( config.multiline ) {\n\t\treturn $( '<textarea>' );\n\t} else if ( this.getSaneType( config ) === 'number' ) {\n\t\treturn $( '<input>' )\n\t\t\t.attr( 'step', 'any' )\n\t\t\t.attr( 'type', 'number' );\n\t} else {\n\t\treturn $( '<input>' ).attr( 'type', this.getSaneType( config ) );\n\t}\n};\n\n/**\n * Get sanitized value for 'type' for given config.\n *\n * @param {Object} config Configuration options\n * @return {string|null}\n * @private\n */\nOO.ui.TextInputWidget.prototype.getSaneType = function ( config ) {\n\tvar allowedTypes = [\n\t\t'text',\n\t\t'password',\n\t\t'search',\n\t\t'email',\n\t\t'url',\n\t\t'number'\n\t];\n\treturn allowedTypes.indexOf( config.type ) !== -1 ? config.type : 'text';\n};\n\n/**\n * Check if the input supports multiple lines.\n *\n * @return {boolean}\n */\nOO.ui.TextInputWidget.prototype.isMultiline = function () {\n\treturn !!this.multiline;\n};\n\n/**\n * Check if the input automatically adjusts its size.\n *\n * @return {boolean}\n */\nOO.ui.TextInputWidget.prototype.isAutosizing = function () {\n\treturn !!this.autosize;\n};\n\n/**\n * Focus the input and select a specified range within the text.\n *\n * @param {number} from Select from offset\n * @param {number} [to] Select to offset, defaults to from\n * @chainable\n */\nOO.ui.TextInputWidget.prototype.selectRange = function ( from, to ) {\n\tvar isBackwards, start, end,\n\t\tinput = this.$input[ 0 ];\n\n\tto = to || from;\n\n\tisBackwards = to < from;\n\tstart = isBackwards ? to : from;\n\tend = isBackwards ? from : to;\n\n\tthis.focus();\n\n\ttry {\n\t\tinput.setSelectionRange( start, end, isBackwards ? 'backward' : 'forward' );\n\t} catch ( e ) {\n\t\t// IE throws an exception if you call setSelectionRange on a unattached DOM node.\n\t\t// Rather than expensively check if the input is attached every time, just check\n\t\t// if it was the cause of an error being thrown. If not, rethrow the error.\n\t\tif ( this.getElementDocument().body.contains( input ) ) {\n\t\t\tthrow e;\n\t\t}\n\t}\n\treturn this;\n};\n\n/**\n * Get an object describing the current selection range in a directional manner\n *\n * @return {Object} Object containing 'from' and 'to' offsets\n */\nOO.ui.TextInputWidget.prototype.getRange = function () {\n\tvar input = this.$input[ 0 ],\n\t\tstart = input.selectionStart,\n\t\tend = input.selectionEnd,\n\t\tisBackwards = input.selectionDirection === 'backward';\n\n\treturn {\n\t\tfrom: isBackwards ? end : start,\n\t\tto: isBackwards ? start : end\n\t};\n};\n\n/**\n * Get the length of the text input value.\n *\n * This could differ from the length of #getValue if the\n * value gets filtered\n *\n * @return {number} Input length\n */\nOO.ui.TextInputWidget.prototype.getInputLength = function () {\n\treturn this.$input[ 0 ].value.length;\n};\n\n/**\n * Focus the input and select the entire text.\n *\n * @chainable\n */\nOO.ui.TextInputWidget.prototype.select = function () {\n\treturn this.selectRange( 0, this.getInputLength() );\n};\n\n/**\n * Focus the input and move the cursor to the start.\n *\n * @chainable\n */\nOO.ui.TextInputWidget.prototype.moveCursorToStart = function () {\n\treturn this.selectRange( 0 );\n};\n\n/**\n * Focus the input and move the cursor to the end.\n *\n * @chainable\n */\nOO.ui.TextInputWidget.prototype.moveCursorToEnd = function () {\n\treturn this.selectRange( this.getInputLength() );\n};\n\n/**\n * Insert new content into the input.\n *\n * @param {string} content Content to be inserted\n * @chainable\n */\nOO.ui.TextInputWidget.prototype.insertContent = function ( content ) {\n\tvar start, end,\n\t\trange = this.getRange(),\n\t\tvalue = this.getValue();\n\n\tstart = Math.min( range.from, range.to );\n\tend = Math.max( range.from, range.to );\n\n\tthis.setValue( value.slice( 0, start ) + content + value.slice( end ) );\n\tthis.selectRange( start + content.length );\n\treturn this;\n};\n\n/**\n * Insert new content either side of a selection.\n *\n * @param {string} pre Content to be inserted before the selection\n * @param {string} post Content to be inserted after the selection\n * @chainable\n */\nOO.ui.TextInputWidget.prototype.encapsulateContent = function ( pre, post ) {\n\tvar start, end,\n\t\trange = this.getRange(),\n\t\toffset = pre.length;\n\n\tstart = Math.min( range.from, range.to );\n\tend = Math.max( range.from, range.to );\n\n\tthis.selectRange( start ).insertContent( pre );\n\tthis.selectRange( offset + end ).insertContent( post );\n\n\tthis.selectRange( offset + start, offset + end );\n\treturn this;\n};\n\n/**\n * Set the validation pattern.\n *\n * The validation pattern is either a regular expression, a function, or the symbolic name of a\n * pattern defined by the class: 'non-empty' (the value cannot be an empty string) or 'integer' (the\n * value must contain only numbers).\n *\n * @param {RegExp|Function|string|null} validate Regular expression, function, or the symbolic name\n *  of a pattern (either ‘integer’ or ‘non-empty’) defined by the class.\n */\nOO.ui.TextInputWidget.prototype.setValidation = function ( validate ) {\n\tif ( validate instanceof RegExp || validate instanceof Function ) {\n\t\tthis.validate = validate;\n\t} else {\n\t\tthis.validate = this.constructor.static.validationPatterns[ validate ] || /.*/;\n\t}\n};\n\n/**\n * Sets the 'invalid' flag appropriately.\n *\n * @param {boolean} [isValid] Optionally override validation result\n */\nOO.ui.TextInputWidget.prototype.setValidityFlag = function ( isValid ) {\n\tvar widget = this,\n\t\tsetFlag = function ( valid ) {\n\t\t\tif ( !valid ) {\n\t\t\t\twidget.$input.attr( 'aria-invalid', 'true' );\n\t\t\t} else {\n\t\t\t\twidget.$input.removeAttr( 'aria-invalid' );\n\t\t\t}\n\t\t\twidget.setFlags( { invalid: !valid } );\n\t\t};\n\n\tif ( isValid !== undefined ) {\n\t\tsetFlag( isValid );\n\t} else {\n\t\tthis.getValidity().then( function () {\n\t\t\tsetFlag( true );\n\t\t}, function () {\n\t\t\tsetFlag( false );\n\t\t} );\n\t}\n};\n\n/**\n * Get the validity of current value.\n *\n * This method returns a promise that resolves if the value is valid and rejects if\n * it isn't. Uses the {@link #validate validation pattern}  to check for validity.\n *\n * @return {jQuery.Promise} A promise that resolves if the value is valid, rejects if not.\n */\nOO.ui.TextInputWidget.prototype.getValidity = function () {\n\tvar result;\n\n\tfunction rejectOrResolve( valid ) {\n\t\tif ( valid ) {\n\t\t\treturn $.Deferred().resolve().promise();\n\t\t} else {\n\t\t\treturn $.Deferred().reject().promise();\n\t\t}\n\t}\n\n\t// Check browser validity and reject if it is invalid\n\tif (\n\t\tthis.$input[ 0 ].checkValidity !== undefined &&\n\t\tthis.$input[ 0 ].checkValidity() === false\n\t) {\n\t\treturn rejectOrResolve( false );\n\t}\n\n\t// Run our checks if the browser thinks the field is valid\n\tif ( this.validate instanceof Function ) {\n\t\tresult = this.validate( this.getValue() );\n\t\tif ( result && $.isFunction( result.promise ) ) {\n\t\t\treturn result.promise().then( function ( valid ) {\n\t\t\t\treturn rejectOrResolve( valid );\n\t\t\t} );\n\t\t} else {\n\t\t\treturn rejectOrResolve( result );\n\t\t}\n\t} else {\n\t\treturn rejectOrResolve( this.getValue().match( this.validate ) );\n\t}\n};\n\n/**\n * Set the position of the inline label relative to that of the value: `‘before’` or `‘after’`.\n *\n * @param {string} labelPosition Label position, 'before' or 'after'\n * @chainable\n */\nOO.ui.TextInputWidget.prototype.setLabelPosition = function ( labelPosition ) {\n\tthis.labelPosition = labelPosition;\n\tif ( this.label ) {\n\t\t// If there is no label and we only change the position, #updatePosition is a no-op,\n\t\t// but it takes really a lot of work to do nothing.\n\t\tthis.updatePosition();\n\t}\n\treturn this;\n};\n\n/**\n * Update the position of the inline label.\n *\n * This method is called by #setLabelPosition, and can also be called on its own if\n * something causes the label to be mispositioned.\n *\n * @chainable\n */\nOO.ui.TextInputWidget.prototype.updatePosition = function () {\n\tvar after = this.labelPosition === 'after';\n\n\tthis.$element\n\t\t.toggleClass( 'oo-ui-textInputWidget-labelPosition-after', !!this.label && after )\n\t\t.toggleClass( 'oo-ui-textInputWidget-labelPosition-before', !!this.label && !after );\n\n\tthis.valCache = null;\n\tthis.scrollWidth = null;\n\tthis.adjustSize();\n\tthis.positionLabel();\n\n\treturn this;\n};\n\n/**\n * Update the 'clear' indicator displayed on type: 'search' text fields, hiding it when the field is\n * already empty or when it's not editable.\n */\nOO.ui.TextInputWidget.prototype.updateSearchIndicator = function () {\n\tif ( this.type === 'search' ) {\n\t\tif ( this.getValue() === '' || this.isDisabled() || this.isReadOnly() ) {\n\t\t\tthis.setIndicator( null );\n\t\t} else {\n\t\t\tthis.setIndicator( 'clear' );\n\t\t}\n\t}\n};\n\n/**\n * Position the label by setting the correct padding on the input.\n *\n * @private\n * @chainable\n */\nOO.ui.TextInputWidget.prototype.positionLabel = function () {\n\tvar after, rtl, property;\n\n\tif ( this.isWaitingToBeAttached ) {\n\t\t// #onElementAttach will be called soon, which calls this method\n\t\treturn this;\n\t}\n\n\t// Clear old values\n\tthis.$input\n\t\t// Clear old values if present\n\t\t.css( {\n\t\t\t'padding-right': '',\n\t\t\t'padding-left': ''\n\t\t} );\n\n\tif ( this.label ) {\n\t\tthis.$element.append( this.$label );\n\t} else {\n\t\tthis.$label.detach();\n\t\treturn;\n\t}\n\n\tafter = this.labelPosition === 'after';\n\trtl = this.$element.css( 'direction' ) === 'rtl';\n\tproperty = after === rtl ? 'padding-left' : 'padding-right';\n\n\tthis.$input.css( property, this.$label.outerWidth( true ) + ( after ? this.scrollWidth : 0 ) );\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.TextInputWidget.prototype.restorePreInfuseState = function ( state ) {\n\tOO.ui.TextInputWidget.parent.prototype.restorePreInfuseState.call( this, state );\n\tif ( state.scrollTop !== undefined ) {\n\t\tthis.$input.scrollTop( state.scrollTop );\n\t}\n};\n","/**\n * @class\n * @extends OO.ui.TextInputWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.SearchInputWidget = function OoUiSearchInputWidget( config ) {\n\tconfig = $.extend( {\n\t\ticon: 'search'\n\t}, config );\n\n\t// Set type to text so that TextInputWidget doesn't\n\t// get stuck in an infinite loop.\n\tconfig.type = 'text';\n\n\t// Parent constructor\n\tOO.ui.SearchInputWidget.parent.call( this, config );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-textInputWidget-type-search' );\n\tthis.updateSearchIndicator();\n\tthis.connect( this, {\n\t\tdisable: 'onDisable'\n\t} );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.SearchInputWidget, OO.ui.TextInputWidget );\n\n/* Methods */\n\n/**\n * @inheritdoc\n * @protected\n */\nOO.ui.SearchInputWidget.prototype.getInputElement = function () {\n\treturn $( '<input>' ).attr( 'type', 'search' );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.SearchInputWidget.prototype.onIndicatorMouseDown = function ( e ) {\n\tif ( e.which === OO.ui.MouseButtons.LEFT ) {\n\t\t// Clear the text field\n\t\tthis.setValue( '' );\n\t\tthis.focus();\n\t\treturn false;\n\t}\n};\n\n/**\n * Update the 'clear' indicator displayed on type: 'search' text\n * fields, hiding it when the field is already empty or when it's not\n * editable.\n */\nOO.ui.SearchInputWidget.prototype.updateSearchIndicator = function () {\n\tif ( this.getValue() === '' || this.isDisabled() || this.isReadOnly() ) {\n\t\tthis.setIndicator( null );\n\t} else {\n\t\tthis.setIndicator( 'clear' );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.SearchInputWidget.prototype.onChange = function () {\n\tOO.ui.SearchInputWidget.parent.prototype.onChange.call( this );\n\tthis.updateSearchIndicator();\n};\n\n/**\n * Handle disable events.\n *\n * @param {boolean} disabled Element is disabled\n * @private\n */\nOO.ui.SearchInputWidget.prototype.onDisable = function () {\n\tthis.updateSearchIndicator();\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.SearchInputWidget.prototype.setReadOnly = function ( state ) {\n\tOO.ui.SearchInputWidget.parent.prototype.setReadOnly.call( this, state );\n\tthis.updateSearchIndicator();\n\treturn this;\n};\n","/**\n * ComboBoxInputWidgets combine a {@link OO.ui.TextInputWidget text input} (where a value\n * can be entered manually) and a {@link OO.ui.MenuSelectWidget menu of options} (from which\n * a value can be chosen instead). Users can choose options from the combo box in one of two ways:\n *\n * - by typing a value in the text input field. If the value exactly matches the value of a menu\n *   option, that option will appear to be selected.\n * - by choosing a value from the menu. The value of the chosen option will then appear in the text\n *   input field.\n *\n * After the user chooses an option, its `data` will be used as a new value for the widget.\n * A `label` also can be specified for each option: if given, it will be shown instead of the\n * `data` in the dropdown menu.\n *\n * This widget can be used inside an HTML form, such as a OO.ui.FormLayout.\n *\n * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].\n *\n *     @example\n *     // Example: A ComboBoxInputWidget.\n *     var comboBox = new OO.ui.ComboBoxInputWidget( {\n *         value: 'Option 1',\n *         options: [\n *             { data: 'Option 1' },\n *             { data: 'Option 2' },\n *             { data: 'Option 3' }\n *         ]\n *     } );\n *     $( 'body' ).append( comboBox.$element );\n *\n *     @example\n *     // Example: A ComboBoxInputWidget with additional option labels.\n *     var comboBox = new OO.ui.ComboBoxInputWidget( {\n *         value: 'Option 1',\n *         options: [\n *             {\n *                 data: 'Option 1',\n *                 label: 'Option One'\n *             },\n *             {\n *                 data: 'Option 2',\n *                 label: 'Option Two'\n *             },\n *             {\n *                 data: 'Option 3',\n *                 label: 'Option Three'\n *             }\n *         ]\n *     } );\n *     $( 'body' ).append( comboBox.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options\n *\n * @class\n * @extends OO.ui.TextInputWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`\n * @cfg {Object} [menu] Configuration options to pass to the {@link OO.ui.MenuSelectWidget menu select widget}.\n * @cfg {jQuery} [$overlay] Render the menu into a separate layer. This configuration is useful in cases where\n *  the expanded menu is larger than its containing `<div>`. The specified overlay layer is usually on top of the\n *  containing `<div>` and has a larger area. By default, the menu uses relative positioning.\n *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.\n */\nOO.ui.ComboBoxInputWidget = function OoUiComboBoxInputWidget( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( {\n\t\tautocomplete: false\n\t}, config );\n\n\t// ComboBoxInputWidget shouldn't support `multiline`\n\tconfig.multiline = false;\n\n\t// See InputWidget#reusePreInfuseDOM about `config.$input`\n\tif ( config.$input ) {\n\t\tconfig.$input.removeAttr( 'list' );\n\t}\n\n\t// Parent constructor\n\tOO.ui.ComboBoxInputWidget.parent.call( this, config );\n\n\t// Properties\n\tthis.$overlay = config.$overlay || this.$element;\n\tthis.dropdownButton = new OO.ui.ButtonWidget( {\n\t\tclasses: [ 'oo-ui-comboBoxInputWidget-dropdownButton' ],\n\t\tindicator: 'down',\n\t\tdisabled: this.disabled\n\t} );\n\tthis.menu = new OO.ui.MenuSelectWidget( $.extend(\n\t\t{\n\t\t\twidget: this,\n\t\t\tinput: this,\n\t\t\t$floatableContainer: this.$element,\n\t\t\tdisabled: this.isDisabled()\n\t\t},\n\t\tconfig.menu\n\t) );\n\n\t// Events\n\tthis.connect( this, {\n\t\tchange: 'onInputChange',\n\t\tenter: 'onInputEnter'\n\t} );\n\tthis.dropdownButton.connect( this, {\n\t\tclick: 'onDropdownButtonClick'\n\t} );\n\tthis.menu.connect( this, {\n\t\tchoose: 'onMenuChoose',\n\t\tadd: 'onMenuItemsChange',\n\t\tremove: 'onMenuItemsChange'\n\t} );\n\n\t// Initialization\n\tthis.$input.attr( {\n\t\trole: 'combobox',\n\t\t'aria-owns': this.menu.getElementId(),\n\t\t'aria-autocomplete': 'list'\n\t} );\n\t// Do not override options set via config.menu.items\n\tif ( config.options !== undefined ) {\n\t\tthis.setOptions( config.options );\n\t}\n\tthis.$field = $( '<div>' )\n\t\t.addClass( 'oo-ui-comboBoxInputWidget-field' )\n\t\t.append( this.$input, this.dropdownButton.$element );\n\tthis.$element\n\t\t.addClass( 'oo-ui-comboBoxInputWidget' )\n\t\t.append( this.$field );\n\tthis.$overlay.append( this.menu.$element );\n\tthis.onMenuItemsChange();\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ComboBoxInputWidget, OO.ui.TextInputWidget );\n\n/* Methods */\n\n/**\n * Get the combobox's menu.\n *\n * @return {OO.ui.MenuSelectWidget} Menu widget\n */\nOO.ui.ComboBoxInputWidget.prototype.getMenu = function () {\n\treturn this.menu;\n};\n\n/**\n * Get the combobox's text input widget.\n *\n * @return {OO.ui.TextInputWidget} Text input widget\n */\nOO.ui.ComboBoxInputWidget.prototype.getInput = function () {\n\treturn this;\n};\n\n/**\n * Handle input change events.\n *\n * @private\n * @param {string} value New value\n */\nOO.ui.ComboBoxInputWidget.prototype.onInputChange = function ( value ) {\n\tvar match = this.menu.getItemFromData( value );\n\n\tthis.menu.selectItem( match );\n\tif ( this.menu.getHighlightedItem() ) {\n\t\tthis.menu.highlightItem( match );\n\t}\n\n\tif ( !this.isDisabled() ) {\n\t\tthis.menu.toggle( true );\n\t}\n};\n\n/**\n * Handle input enter events.\n *\n * @private\n */\nOO.ui.ComboBoxInputWidget.prototype.onInputEnter = function () {\n\tif ( !this.isDisabled() ) {\n\t\tthis.menu.toggle( false );\n\t}\n};\n\n/**\n * Handle button click events.\n *\n * @private\n */\nOO.ui.ComboBoxInputWidget.prototype.onDropdownButtonClick = function () {\n\tthis.menu.toggle();\n\tthis.focus();\n};\n\n/**\n * Handle menu choose events.\n *\n * @private\n * @param {OO.ui.OptionWidget} item Chosen item\n */\nOO.ui.ComboBoxInputWidget.prototype.onMenuChoose = function ( item ) {\n\tthis.setValue( item.getData() );\n};\n\n/**\n * Handle menu item change events.\n *\n * @private\n */\nOO.ui.ComboBoxInputWidget.prototype.onMenuItemsChange = function () {\n\tvar match = this.menu.getItemFromData( this.getValue() );\n\tthis.menu.selectItem( match );\n\tif ( this.menu.getHighlightedItem() ) {\n\t\tthis.menu.highlightItem( match );\n\t}\n\tthis.$element.toggleClass( 'oo-ui-comboBoxInputWidget-empty', this.menu.isEmpty() );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ComboBoxInputWidget.prototype.setDisabled = function ( disabled ) {\n\t// Parent method\n\tOO.ui.ComboBoxInputWidget.parent.prototype.setDisabled.call( this, disabled );\n\n\tif ( this.dropdownButton ) {\n\t\tthis.dropdownButton.setDisabled( this.isDisabled() );\n\t}\n\tif ( this.menu ) {\n\t\tthis.menu.setDisabled( this.isDisabled() );\n\t}\n\n\treturn this;\n};\n\n/**\n * Set the options available for this input.\n *\n * @param {Object[]} options Array of menu options in the format `{ data: …, label: … }`\n * @chainable\n */\nOO.ui.ComboBoxInputWidget.prototype.setOptions = function ( options ) {\n\tthis.getMenu()\n\t\t.clearItems()\n\t\t.addItems( options.map( function ( opt ) {\n\t\t\treturn new OO.ui.MenuOptionWidget( {\n\t\t\t\tdata: opt.data,\n\t\t\t\tlabel: opt.label !== undefined ? opt.label : opt.data\n\t\t\t} );\n\t\t} ) );\n\n\treturn this;\n};\n","/**\n * FieldLayouts are used with OO.ui.FieldsetLayout. Each FieldLayout requires a field-widget,\n * which is a widget that is specified by reference before any optional configuration settings.\n *\n * Field layouts can be configured with help text and/or labels. Labels are aligned in one of four ways:\n *\n * - **left**: The label is placed before the field-widget and aligned with the left margin.\n *   A left-alignment is used for forms with many fields.\n * - **right**: The label is placed before the field-widget and aligned to the right margin.\n *   A right-alignment is used for long but familiar forms which users tab through,\n *   verifying the current field with a quick glance at the label.\n * - **top**: The label is placed above the field-widget. A top-alignment is used for brief forms\n *   that users fill out from top to bottom.\n * - **inline**: The label is placed after the field-widget and aligned to the left.\n *   An inline-alignment is best used with checkboxes or radio buttons.\n *\n * Help text is accessed via a help icon that appears in the upper right corner of the rendered field layout.\n * Please see the [OOjs UI documentation on MediaWiki] [1] for examples and more information.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Layouts/Fields_and_Fieldsets\n *\n * @class\n * @extends OO.ui.Layout\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.TitledElement\n *\n * @constructor\n * @param {OO.ui.Widget} fieldWidget Field widget\n * @param {Object} [config] Configuration options\n * @cfg {string} [align='left'] Alignment of the label: 'left', 'right', 'top' or 'inline'\n * @cfg {Array} [errors] Error messages about the widget, which will be displayed below the widget.\n *  The array may contain strings or OO.ui.HtmlSnippet instances.\n * @cfg {Array} [notices] Notices about the widget, which will be displayed below the widget.\n *  The array may contain strings or OO.ui.HtmlSnippet instances.\n * @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a \"help\" icon will appear\n *  in the upper-right corner of the rendered field; clicking it will display the text in a popup.\n *  For important messages, you are advised to use `notices`, as they are always shown.\n * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.\n *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.\n *\n * @throws {Error} An error is thrown if no widget is specified\n */\nOO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( fieldWidget ) && config === undefined ) {\n\t\tconfig = fieldWidget;\n\t\tfieldWidget = config.fieldWidget;\n\t}\n\n\t// Make sure we have required constructor arguments\n\tif ( fieldWidget === undefined ) {\n\t\tthrow new Error( 'Widget not found' );\n\t}\n\n\t// Configuration initialization\n\tconfig = $.extend( { align: 'left' }, config );\n\n\t// Parent constructor\n\tOO.ui.FieldLayout.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.LabelElement.call( this, $.extend( {}, config, {\n\t\t$label: $( '<label>' )\n\t} ) );\n\tOO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$label } ) );\n\n\t// Properties\n\tthis.fieldWidget = fieldWidget;\n\tthis.errors = [];\n\tthis.notices = [];\n\tthis.$field = this.isFieldInline() ? $( '<span>' ) : $( '<div>' );\n\tthis.$messages = $( '<ul>' );\n\tthis.$header = $( '<span>' );\n\tthis.$body = $( '<div>' );\n\tthis.align = null;\n\tif ( config.help ) {\n\t\tthis.popupButtonWidget = new OO.ui.PopupButtonWidget( {\n\t\t\t$overlay: config.$overlay,\n\t\t\tpopup: {\n\t\t\t\tpadded: true\n\t\t\t},\n\t\t\tclasses: [ 'oo-ui-fieldLayout-help' ],\n\t\t\tframed: false,\n\t\t\ticon: 'info'\n\t\t} );\n\t\tif ( config.help instanceof OO.ui.HtmlSnippet ) {\n\t\t\tthis.popupButtonWidget.getPopup().$body.html( config.help.toString() );\n\t\t} else {\n\t\t\tthis.popupButtonWidget.getPopup().$body.text( config.help );\n\t\t}\n\t\tthis.$help = this.popupButtonWidget.$element;\n\t} else {\n\t\tthis.$help = $( [] );\n\t}\n\n\t// Events\n\tthis.fieldWidget.connect( this, { disable: 'onFieldDisable' } );\n\n\t// Initialization\n\tif ( this.fieldWidget.getInputId() ) {\n\t\tthis.$label.attr( 'for', this.fieldWidget.getInputId() );\n\t} else {\n\t\tthis.$label.on( 'click', function () {\n\t\t\tthis.fieldWidget.focus();\n\t\t\treturn false;\n\t\t}.bind( this ) );\n\t}\n\tthis.$element\n\t\t.addClass( 'oo-ui-fieldLayout' )\n\t\t.toggleClass( 'oo-ui-fieldLayout-disabled', this.fieldWidget.isDisabled() )\n\t\t.append( this.$body );\n\tthis.$body.addClass( 'oo-ui-fieldLayout-body' );\n\tthis.$header.addClass( 'oo-ui-fieldLayout-header' );\n\tthis.$messages.addClass( 'oo-ui-fieldLayout-messages' );\n\tthis.$field\n\t\t.addClass( 'oo-ui-fieldLayout-field' )\n\t\t.append( this.fieldWidget.$element );\n\n\tthis.setErrors( config.errors || [] );\n\tthis.setNotices( config.notices || [] );\n\tthis.setAlignment( config.align );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.FieldLayout, OO.ui.Layout );\nOO.mixinClass( OO.ui.FieldLayout, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.FieldLayout, OO.ui.mixin.TitledElement );\n\n/* Methods */\n\n/**\n * Handle field disable events.\n *\n * @private\n * @param {boolean} value Field is disabled\n */\nOO.ui.FieldLayout.prototype.onFieldDisable = function ( value ) {\n\tthis.$element.toggleClass( 'oo-ui-fieldLayout-disabled', value );\n};\n\n/**\n * Get the widget contained by the field.\n *\n * @return {OO.ui.Widget} Field widget\n */\nOO.ui.FieldLayout.prototype.getField = function () {\n\treturn this.fieldWidget;\n};\n\n/**\n * Return `true` if the given field widget can be used with `'inline'` alignment (see\n * #setAlignment). Return `false` if it can't or if this can't be determined.\n *\n * @return {boolean}\n */\nOO.ui.FieldLayout.prototype.isFieldInline = function () {\n\t// This is very simplistic, but should be good enough.\n\treturn this.getField().$element.prop( 'tagName' ).toLowerCase() === 'span';\n};\n\n/**\n * @protected\n * @param {string} kind 'error' or 'notice'\n * @param {string|OO.ui.HtmlSnippet} text\n * @return {jQuery}\n */\nOO.ui.FieldLayout.prototype.makeMessage = function ( kind, text ) {\n\tvar $listItem, $icon, message;\n\t$listItem = $( '<li>' );\n\tif ( kind === 'error' ) {\n\t\t$icon = new OO.ui.IconWidget( { icon: 'alert', flags: [ 'warning' ] } ).$element;\n\t} else if ( kind === 'notice' ) {\n\t\t$icon = new OO.ui.IconWidget( { icon: 'info' } ).$element;\n\t} else {\n\t\t$icon = '';\n\t}\n\tmessage = new OO.ui.LabelWidget( { label: text } );\n\t$listItem\n\t\t.append( $icon, message.$element )\n\t\t.addClass( 'oo-ui-fieldLayout-messages-' + kind );\n\treturn $listItem;\n};\n\n/**\n * Set the field alignment mode.\n *\n * @private\n * @param {string} value Alignment mode, either 'left', 'right', 'top' or 'inline'\n * @chainable\n */\nOO.ui.FieldLayout.prototype.setAlignment = function ( value ) {\n\tif ( value !== this.align ) {\n\t\t// Default to 'left'\n\t\tif ( [ 'left', 'right', 'top', 'inline' ].indexOf( value ) === -1 ) {\n\t\t\tvalue = 'left';\n\t\t}\n\t\t// Validate\n\t\tif ( value === 'inline' && !this.isFieldInline() ) {\n\t\t\tvalue = 'top';\n\t\t}\n\t\t// Reorder elements\n\t\tif ( value === 'top' ) {\n\t\t\tthis.$header.append( this.$label, this.$help );\n\t\t\tthis.$body.append( this.$header, this.$field );\n\t\t} else if ( value === 'inline' ) {\n\t\t\tthis.$header.append( this.$label, this.$help );\n\t\t\tthis.$body.append( this.$field, this.$header );\n\t\t} else {\n\t\t\tthis.$header.append( this.$label );\n\t\t\tthis.$body.append( this.$header, this.$help, this.$field );\n\t\t}\n\t\t// Set classes. The following classes can be used here:\n\t\t// * oo-ui-fieldLayout-align-left\n\t\t// * oo-ui-fieldLayout-align-right\n\t\t// * oo-ui-fieldLayout-align-top\n\t\t// * oo-ui-fieldLayout-align-inline\n\t\tif ( this.align ) {\n\t\t\tthis.$element.removeClass( 'oo-ui-fieldLayout-align-' + this.align );\n\t\t}\n\t\tthis.$element.addClass( 'oo-ui-fieldLayout-align-' + value );\n\t\tthis.align = value;\n\t}\n\n\treturn this;\n};\n\n/**\n * Set the list of error messages.\n *\n * @param {Array} errors Error messages about the widget, which will be displayed below the widget.\n *  The array may contain strings or OO.ui.HtmlSnippet instances.\n * @chainable\n */\nOO.ui.FieldLayout.prototype.setErrors = function ( errors ) {\n\tthis.errors = errors.slice();\n\tthis.updateMessages();\n\treturn this;\n};\n\n/**\n * Set the list of notice messages.\n *\n * @param {Array} notices Notices about the widget, which will be displayed below the widget.\n *  The array may contain strings or OO.ui.HtmlSnippet instances.\n * @chainable\n */\nOO.ui.FieldLayout.prototype.setNotices = function ( notices ) {\n\tthis.notices = notices.slice();\n\tthis.updateMessages();\n\treturn this;\n};\n\n/**\n * Update the rendering of error and notice messages.\n *\n * @private\n */\nOO.ui.FieldLayout.prototype.updateMessages = function () {\n\tvar i;\n\tthis.$messages.empty();\n\n\tif ( this.errors.length || this.notices.length ) {\n\t\tthis.$body.after( this.$messages );\n\t} else {\n\t\tthis.$messages.remove();\n\t\treturn;\n\t}\n\n\tfor ( i = 0; i < this.notices.length; i++ ) {\n\t\tthis.$messages.append( this.makeMessage( 'notice', this.notices[ i ] ) );\n\t}\n\tfor ( i = 0; i < this.errors.length; i++ ) {\n\t\tthis.$messages.append( this.makeMessage( 'error', this.errors[ i ] ) );\n\t}\n};\n","/**\n * ActionFieldLayouts are used with OO.ui.FieldsetLayout. The layout consists of a field-widget, a button,\n * and an optional label and/or help text. The field-widget (e.g., a {@link OO.ui.TextInputWidget TextInputWidget}),\n * is required and is specified before any optional configuration settings.\n *\n * Labels can be aligned in one of four ways:\n *\n * - **left**: The label is placed before the field-widget and aligned with the left margin.\n *   A left-alignment is used for forms with many fields.\n * - **right**: The label is placed before the field-widget and aligned to the right margin.\n *   A right-alignment is used for long but familiar forms which users tab through,\n *   verifying the current field with a quick glance at the label.\n * - **top**: The label is placed above the field-widget. A top-alignment is used for brief forms\n *   that users fill out from top to bottom.\n * - **inline**: The label is placed after the field-widget and aligned to the left.\n *   An inline-alignment is best used with checkboxes or radio buttons.\n *\n * Help text is accessed via a help icon that appears in the upper right corner of the rendered field layout when help\n * text is specified.\n *\n *     @example\n *     // Example of an ActionFieldLayout\n *     var actionFieldLayout = new OO.ui.ActionFieldLayout(\n *         new OO.ui.TextInputWidget( {\n *             placeholder: 'Field widget'\n *         } ),\n *         new OO.ui.ButtonWidget( {\n *             label: 'Button'\n *         } ),\n *         {\n *             label: 'An ActionFieldLayout. This label is aligned top',\n *             align: 'top',\n *             help: 'This is help text'\n *         }\n *     );\n *\n *     $( 'body' ).append( actionFieldLayout.$element );\n *\n * @class\n * @extends OO.ui.FieldLayout\n *\n * @constructor\n * @param {OO.ui.Widget} fieldWidget Field widget\n * @param {OO.ui.ButtonWidget} buttonWidget Button widget\n * @param {Object} config\n */\nOO.ui.ActionFieldLayout = function OoUiActionFieldLayout( fieldWidget, buttonWidget, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( fieldWidget ) && config === undefined ) {\n\t\tconfig = fieldWidget;\n\t\tfieldWidget = config.fieldWidget;\n\t\tbuttonWidget = config.buttonWidget;\n\t}\n\n\t// Parent constructor\n\tOO.ui.ActionFieldLayout.parent.call( this, fieldWidget, config );\n\n\t// Properties\n\tthis.buttonWidget = buttonWidget;\n\tthis.$button = $( '<span>' );\n\tthis.$input = this.isFieldInline() ? $( '<span>' ) : $( '<div>' );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-actionFieldLayout' );\n\tthis.$button\n\t\t.addClass( 'oo-ui-actionFieldLayout-button' )\n\t\t.append( this.buttonWidget.$element );\n\tthis.$input\n\t\t.addClass( 'oo-ui-actionFieldLayout-input' )\n\t\t.append( this.fieldWidget.$element );\n\tthis.$field\n\t\t.append( this.$input, this.$button );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ActionFieldLayout, OO.ui.FieldLayout );\n","/**\n * FieldsetLayouts are composed of one or more {@link OO.ui.FieldLayout FieldLayouts},\n * which each contain an individual widget and, optionally, a label. Each Fieldset can be\n * configured with a label as well. For more information and examples,\n * please see the [OOjs UI documentation on MediaWiki][1].\n *\n *     @example\n *     // Example of a fieldset layout\n *     var input1 = new OO.ui.TextInputWidget( {\n *         placeholder: 'A text input field'\n *     } );\n *\n *     var input2 = new OO.ui.TextInputWidget( {\n *         placeholder: 'A text input field'\n *     } );\n *\n *     var fieldset = new OO.ui.FieldsetLayout( {\n *         label: 'Example of a fieldset layout'\n *     } );\n *\n *     fieldset.addItems( [\n *         new OO.ui.FieldLayout( input1, {\n *             label: 'Field One'\n *         } ),\n *         new OO.ui.FieldLayout( input2, {\n *             label: 'Field Two'\n *         } )\n *     ] );\n *     $( 'body' ).append( fieldset.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Layouts/Fields_and_Fieldsets\n *\n * @class\n * @extends OO.ui.Layout\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {OO.ui.FieldLayout[]} [items] An array of fields to add to the fieldset. See OO.ui.FieldLayout for more information about fields.\n * @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a \"help\" icon will appear\n *  in the upper-right corner of the rendered field; clicking it will display the text in a popup.\n *  For important messages, you are advised to use `notices`, as they are always shown.\n * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.\n *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.\n */\nOO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.FieldsetLayout.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.LabelElement.call( this, $.extend( {}, config, { $label: $( '<div>' ) } ) );\n\tOO.ui.mixin.GroupElement.call( this, config );\n\n\t// Properties\n\tthis.$header = $( '<div>' );\n\tif ( config.help ) {\n\t\tthis.popupButtonWidget = new OO.ui.PopupButtonWidget( {\n\t\t\t$overlay: config.$overlay,\n\t\t\tpopup: {\n\t\t\t\tpadded: true\n\t\t\t},\n\t\t\tclasses: [ 'oo-ui-fieldsetLayout-help' ],\n\t\t\tframed: false,\n\t\t\ticon: 'info'\n\t\t} );\n\t\tif ( config.help instanceof OO.ui.HtmlSnippet ) {\n\t\t\tthis.popupButtonWidget.getPopup().$body.html( config.help.toString() );\n\t\t} else {\n\t\t\tthis.popupButtonWidget.getPopup().$body.text( config.help );\n\t\t}\n\t\tthis.$help = this.popupButtonWidget.$element;\n\t} else {\n\t\tthis.$help = $( [] );\n\t}\n\n\t// Initialization\n\tthis.$header\n\t\t.addClass( 'oo-ui-fieldsetLayout-header' )\n\t\t.append( this.$icon, this.$label, this.$help );\n\tthis.$group.addClass( 'oo-ui-fieldsetLayout-group' );\n\tthis.$element\n\t\t.addClass( 'oo-ui-fieldsetLayout' )\n\t\t.prepend( this.$header, this.$group );\n\tif ( Array.isArray( config.items ) ) {\n\t\tthis.addItems( config.items );\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.FieldsetLayout, OO.ui.Layout );\nOO.mixinClass( OO.ui.FieldsetLayout, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.FieldsetLayout, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.FieldsetLayout, OO.ui.mixin.GroupElement );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.FieldsetLayout.static.tagName = 'fieldset';\n","/**\n * FormLayouts are used to wrap {@link OO.ui.FieldsetLayout FieldsetLayouts} when you intend to use browser-based\n * form submission for the fields instead of handling them in JavaScript. Form layouts can be configured with an\n * HTML form action, an encoding type, and a method using the #action, #enctype, and #method configs, respectively.\n * See the [OOjs UI documentation on MediaWiki] [1] for more information and examples.\n *\n * Only widgets from the {@link OO.ui.InputWidget InputWidget} family support form submission. It\n * includes standard form elements like {@link OO.ui.CheckboxInputWidget checkboxes}, {@link\n * OO.ui.RadioInputWidget radio buttons} and {@link OO.ui.TextInputWidget text fields}, as well as\n * some fancier controls. Some controls have both regular and InputWidget variants, for example\n * OO.ui.DropdownWidget and OO.ui.DropdownInputWidget – only the latter support form submission and\n * often have simplified APIs to match the capabilities of HTML forms.\n * See the [OOjs UI Inputs documentation on MediaWiki] [2] for more information about InputWidgets.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Layouts/Forms\n * [2]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs\n *\n *     @example\n *     // Example of a form layout that wraps a fieldset layout\n *     var input1 = new OO.ui.TextInputWidget( {\n *         placeholder: 'Username'\n *     } );\n *     var input2 = new OO.ui.TextInputWidget( {\n *         placeholder: 'Password',\n *         type: 'password'\n *     } );\n *     var submit = new OO.ui.ButtonInputWidget( {\n *         label: 'Submit'\n *     } );\n *\n *     var fieldset = new OO.ui.FieldsetLayout( {\n *         label: 'A form layout'\n *     } );\n *     fieldset.addItems( [\n *         new OO.ui.FieldLayout( input1, {\n *             label: 'Username',\n *             align: 'top'\n *         } ),\n *         new OO.ui.FieldLayout( input2, {\n *             label: 'Password',\n *             align: 'top'\n *         } ),\n *         new OO.ui.FieldLayout( submit )\n *     ] );\n *     var form = new OO.ui.FormLayout( {\n *         items: [ fieldset ],\n *         action: '/api/formhandler',\n *         method: 'get'\n *     } )\n *     $( 'body' ).append( form.$element );\n *\n * @class\n * @extends OO.ui.Layout\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string} [method] HTML form `method` attribute\n * @cfg {string} [action] HTML form `action` attribute\n * @cfg {string} [enctype] HTML form `enctype` attribute\n * @cfg {OO.ui.FieldsetLayout[]} [items] Fieldset layouts to add to the form layout.\n */\nOO.ui.FormLayout = function OoUiFormLayout( config ) {\n\tvar action;\n\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.FormLayout.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, $.extend( {}, config, { $group: this.$element } ) );\n\n\t// Events\n\tthis.$element.on( 'submit', this.onFormSubmit.bind( this ) );\n\n\t// Make sure the action is safe\n\taction = config.action;\n\tif ( action !== undefined && !OO.ui.isSafeUrl( action ) ) {\n\t\taction = './' + action;\n\t}\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-formLayout' )\n\t\t.attr( {\n\t\t\tmethod: config.method,\n\t\t\taction: action,\n\t\t\tenctype: config.enctype\n\t\t} );\n\tif ( Array.isArray( config.items ) ) {\n\t\tthis.addItems( config.items );\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.FormLayout, OO.ui.Layout );\nOO.mixinClass( OO.ui.FormLayout, OO.ui.mixin.GroupElement );\n\n/* Events */\n\n/**\n * A 'submit' event is emitted when the form is submitted.\n *\n * @event submit\n */\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.FormLayout.static.tagName = 'form';\n\n/* Methods */\n\n/**\n * Handle form submit events.\n *\n * @private\n * @param {jQuery.Event} e Submit event\n * @fires submit\n */\nOO.ui.FormLayout.prototype.onFormSubmit = function () {\n\tif ( this.emit( 'submit' ) ) {\n\t\treturn false;\n\t}\n};\n","/**\n * PanelLayouts expand to cover the entire area of their parent. They can be configured with scrolling, padding,\n * and a frame, and are often used together with {@link OO.ui.StackLayout StackLayouts}.\n *\n *     @example\n *     // Example of a panel layout\n *     var panel = new OO.ui.PanelLayout( {\n *         expanded: false,\n *         framed: true,\n *         padded: true,\n *         $content: $( '<p>A panel layout with padding and a frame.</p>' )\n *     } );\n *     $( 'body' ).append( panel.$element );\n *\n * @class\n * @extends OO.ui.Layout\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [scrollable=false] Allow vertical scrolling\n * @cfg {boolean} [padded=false] Add padding between the content and the edges of the panel.\n * @cfg {boolean} [expanded=true] Expand the panel to fill the entire parent element.\n * @cfg {boolean} [framed=false] Render the panel with a frame to visually separate it from outside content.\n */\nOO.ui.PanelLayout = function OoUiPanelLayout( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( {\n\t\tscrollable: false,\n\t\tpadded: false,\n\t\texpanded: true,\n\t\tframed: false\n\t}, config );\n\n\t// Parent constructor\n\tOO.ui.PanelLayout.parent.call( this, config );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-panelLayout' );\n\tif ( config.scrollable ) {\n\t\tthis.$element.addClass( 'oo-ui-panelLayout-scrollable' );\n\t}\n\tif ( config.padded ) {\n\t\tthis.$element.addClass( 'oo-ui-panelLayout-padded' );\n\t}\n\tif ( config.expanded ) {\n\t\tthis.$element.addClass( 'oo-ui-panelLayout-expanded' );\n\t}\n\tif ( config.framed ) {\n\t\tthis.$element.addClass( 'oo-ui-panelLayout-framed' );\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.PanelLayout, OO.ui.Layout );\n\n/* Methods */\n\n/**\n * Focus the panel layout\n *\n * The default implementation just focuses the first focusable element in the panel\n */\nOO.ui.PanelLayout.prototype.focus = function () {\n\tOO.ui.findFocusable( this.$element ).focus();\n};\n","/**\n * HorizontalLayout arranges its contents in a single line (using `display: inline-block` for its\n * items), with small margins between them. Convenient when you need to put a number of block-level\n * widgets on a single line next to each other.\n *\n * Note that inline elements, such as OO.ui.ButtonWidgets, do not need this wrapper.\n *\n *     @example\n *     // HorizontalLayout with a text input and a label\n *     var layout = new OO.ui.HorizontalLayout( {\n *       items: [\n *         new OO.ui.LabelWidget( { label: 'Label' } ),\n *         new OO.ui.TextInputWidget( { value: 'Text' } )\n *       ]\n *     } );\n *     $( 'body' ).append( layout.$element );\n *\n * @class\n * @extends OO.ui.Layout\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {OO.ui.Widget[]|OO.ui.Layout[]} [items] Widgets or other layouts to add to the layout.\n */\nOO.ui.HorizontalLayout = function OoUiHorizontalLayout( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.HorizontalLayout.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, $.extend( {}, config, { $group: this.$element } ) );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-horizontalLayout' );\n\tif ( Array.isArray( config.items ) ) {\n\t\tthis.addItems( config.items );\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.HorizontalLayout, OO.ui.Layout );\nOO.mixinClass( OO.ui.HorizontalLayout, OO.ui.mixin.GroupElement );\n","}( OO ) );\n"]}
\ No newline at end of file
index 3989caa..5cc9cc4 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-05-16T22:31:39Z
  */
 ( function ( OO ) {
 
@@ -48,14 +48,19 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
        if ( element.supports( [ 'hasFlag' ] ) ) {
                isFramed = element.supports( [ 'isFramed' ] ) && element.isFramed();
                isActive = element.supports( [ 'isActive' ] ) && element.isActive();
-               if ( isFramed && ( isActive || element.isDisabled() || element.hasFlag( 'primary' ) ) ) {
-                       // Button with a dark background, use white icon
+               if (
+                       // Button with a dark background
+                       isFramed && ( isActive || element.isDisabled() || element.hasFlag( 'primary' ) ) ||
+                       // Toolbar with a dark background
+                       OO.ui.ToolGroup && element instanceof OO.ui.ToolGroup && ( isActive || element.hasFlag( 'primary' ) )
+               ) {
+                       // … use white icon / indicator, regardless of other flags
                        variants.invert = true;
                } else if ( !isFramed && element.isDisabled() ) {
-                       // Frameless disabled button, always use black icon regardless of flags
+                       // Frameless disabled button, always use black icon / indicator regardless of other flags
                        variants.invert = false;
                } else if ( !element.isDisabled() ) {
-                       // Any other kind of button, use the right colored icon if available
+                       // Any other kind of button, use the right colored icon / indicator if available
                        variants.progressive = element.hasFlag( 'progressive' );
                        variants.constructive = element.hasFlag( 'constructive' );
                        variants.destructive = element.hasFlag( 'destructive' );
@@ -82,3 +87,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
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.js.map b/resources/lib/oojs-ui/oojs-ui-mediawiki.js.map
new file mode 100644 (file)
index 0000000..cb3503e
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/intro.js.txt","../src/themes/mediawiki/MediaWikiTheme.js","../src/outro.js.txt"],"names":[],"mappings":"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","file":"oojs-ui-mediawiki.js","sourcesContent":["( function ( OO ) {\n\n'use strict';\n","/**\n * @class\n * @extends OO.ui.Theme\n *\n * @constructor\n */\nOO.ui.MediaWikiTheme = function OoUiMediaWikiTheme() {\n\t// Parent constructor\n\tOO.ui.MediaWikiTheme.parent.call( this );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.MediaWikiTheme, OO.ui.Theme );\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {\n\t// Parent method\n\tvar variant, isFramed, isActive,\n\t\tvariants = {\n\t\t\twarning: false,\n\t\t\tinvert: false,\n\t\t\tprogressive: false,\n\t\t\tconstructive: false,\n\t\t\tdestructive: false\n\t\t},\n\t\t// Parent method\n\t\tclasses = OO.ui.MediaWikiTheme.parent.prototype.getElementClasses.call( this, element );\n\n\tif ( element.supports( [ 'hasFlag' ] ) ) {\n\t\tisFramed = element.supports( [ 'isFramed' ] ) && element.isFramed();\n\t\tisActive = element.supports( [ 'isActive' ] ) && element.isActive();\n\t\tif (\n\t\t\t// Button with a dark background\n\t\t\tisFramed && ( isActive || element.isDisabled() || element.hasFlag( 'primary' ) ) ||\n\t\t\t// Toolbar with a dark background\n\t\t\tOO.ui.ToolGroup && element instanceof OO.ui.ToolGroup && ( isActive || element.hasFlag( 'primary' ) )\n\t\t) {\n\t\t\t// … use white icon / indicator, regardless of other flags\n\t\t\tvariants.invert = true;\n\t\t} else if ( !isFramed && element.isDisabled() ) {\n\t\t\t// Frameless disabled button, always use black icon / indicator regardless of other flags\n\t\t\tvariants.invert = false;\n\t\t} else if ( !element.isDisabled() ) {\n\t\t\t// Any other kind of button, use the right colored icon / indicator if available\n\t\t\tvariants.progressive = element.hasFlag( 'progressive' );\n\t\t\tvariants.constructive = element.hasFlag( 'constructive' );\n\t\t\tvariants.destructive = element.hasFlag( 'destructive' );\n\t\t\tvariants.warning = element.hasFlag( 'warning' );\n\t\t}\n\t}\n\n\tfor ( variant in variants ) {\n\t\tclasses[ variants[ variant ] ? 'on' : 'off' ].push( 'oo-ui-image-' + variant );\n\t}\n\n\treturn classes;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MediaWikiTheme.prototype.getDialogTransitionDuration = function () {\n\treturn 250;\n};\n\n/* Instantiation */\n\nOO.ui.theme = new OO.ui.MediaWikiTheme();\n","}( OO ) );\n"]}
\ No newline at end of file
index b154288..172819e 100644 (file)
@@ -1,21 +1,17 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-05-16T22:31:46Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
   z-index: 4;
 }
-.oo-ui-popupTool .oo-ui-popupWidget {
-  /* @noflip */
-  margin-left: 1.25em;
-}
 .oo-ui-toolGroupTool > .oo-ui-popupToolGroup {
   border: 0;
   border-radius: 0;
@@ -47,8 +43,8 @@
   border-radius: 0.3125em;
   border: 1px solid transparent;
   -webkit-transition: border-color 250ms ease;
-     -moz-transition: border-color 250ms ease;
-          transition: border-color 250ms ease;
+  -moz-transition: border-color 250ms ease;
+  transition: border-color 250ms ease;
 }
 .oo-ui-toolGroup-empty {
   display: none;
   border-color: rgba(0, 0, 0, 0.2);
   box-shadow: inset 0 0.0875em 0.0875em 0 rgba(0, 0, 0, 0.07);
   background-color: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #F1F7FB), color-stop(100%, #fff));
-  background-image: -webkit-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #F1F7FB 0, #fff 100%);
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f1f7fb), color-stop(100%, #fff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image: linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff1f7fb', endColorstr='#ffffffff' )";
 }
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
   margin-right: 1.75em;
 }
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle {
+  border: 1px solid #a6cee1;
+  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%);
+  background-image: -moz-linear-gradient(top, #eaf4fa 0, #b0d9ee 100%);
+  background-image: linear-gradient(to bottom, #eaf4fa 0, #b0d9ee 100%);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffeaf4fa', endColorstr='#ffb0d9ee' )";
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:hover,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:focus {
+  border-color: #9dc2d4;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:active,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle {
+  border: 1px solid #a6cee1;
+  background-color: #cde7f4;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #b0d9ee), color-stop(100%, #eaf4fa));
+  background-image: -webkit-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
+  background-image: linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffb0d9ee', endColorstr='#ffeaf4fa' )";
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle {
+  border: 1px solid #b8d892;
+  background-color: #daf0bd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f0fbe1), color-stop(100%, #c3e59a));
+  background-image: -webkit-linear-gradient(top, #f0fbe1 0, #c3e59a 100%);
+  background-image: -moz-linear-gradient(top, #f0fbe1 0, #c3e59a 100%);
+  background-image: linear-gradient(to bottom, #f0fbe1 0, #c3e59a 100%);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff0fbe1', endColorstr='#ffc3e59a' )";
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:hover,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:focus {
+  border-color: #adcb89;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:active,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle {
+  border: 1px solid #b8d892;
+  background-color: #daf0bd;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #c3e59a), color-stop(100%, #f0fbe1));
+  background-image: -webkit-linear-gradient(top, #c3e59a 0, #f0fbe1 100%);
+  background-image: -moz-linear-gradient(top, #c3e59a 0, #f0fbe1 100%);
+  background-image: linear-gradient(to bottom, #c3e59a 0, #f0fbe1 100%);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffc3e59a', endColorstr='#fff0fbe1' )";
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle {
+  color: #d45353;
+}
+.oo-ui-buttonGroupWidget .oo-ui-popupToolGroup {
+  margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-popupToolGroup > .oo-ui-popupToolGroup-handle {
+  height: 2.3em;
+  border-radius: 0;
+  margin-left: -2px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-popupToolGroup:first-child > .oo-ui-popupToolGroup-handle {
+  border-bottom-left-radius: 0.3em;
+  border-top-left-radius: 0.3em;
+  margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-popupToolGroup:last-child {
+  margin-right: 0.5em;
+}
+.oo-ui-buttonGroupWidget .oo-ui-popupToolGroup:last-child > .oo-ui-popupToolGroup-handle {
+  border-bottom-right-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
 .oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
   width: 0.9375em;
   height: 0.9375em;
   border-bottom-right-radius: 0;
   box-shadow: inset 0 0.0875em 0.0875em 0 rgba(0, 0, 0, 0.07);
   background-color: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #F1F7FB), color-stop(100%, #fff));
-  background-image: -webkit-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #F1F7FB 0, #fff 100%);
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f1f7fb), color-stop(100%, #fff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image: linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff1f7fb', endColorstr='#ffffffff' )";
 }
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
   line-height: 2em;
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
-  color: #888;
+  color: #767676;
 }
 .oo-ui-listToolGroup .oo-ui-tool {
   display: block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-listToolGroup .oo-ui-toolGroup-tools {
   padding: 0.3125em;
   border-color: rgba(0, 0, 0, 0.1);
   box-shadow: inset 0 0.0875em 0.0875em 0 rgba(0, 0, 0, 0.07);
   background-color: #f8fbfd;
-  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #F1F7FB), color-stop(100%, #fff));
-  background-image: -webkit-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #F1F7FB 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #F1F7FB 0, #fff 100%);
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #f1f7fb), color-stop(100%, #fff));
+  background-image: -webkit-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image: -moz-linear-gradient(top, #f1f7fb 0, #fff 100%);
+  background-image: linear-gradient(to bottom, #f1f7fb 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff1f7fb', endColorstr='#ffffffff' )";
 }
 .oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled + .oo-ui-tool-active.oo-ui-widget-enabled {
 .oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
   background-image: url('themes/apex/images/icons/check.png');
   background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url('themes/apex/images/icons/check.svg');
-  background-image:         linear-gradient(transparent, transparent), /* @embed */ url('themes/apex/images/icons/check.svg');
-  background-image:      -o-linear-gradient(transparent, transparent), url('themes/apex/images/icons/check.png');
+  background-image: linear-gradient(transparent, transparent), /* @embed */ url('themes/apex/images/icons/check.svg');
+  background-image: -o-linear-gradient(transparent, transparent), url('themes/apex/images/icons/check.png');
   background-size: contain;
   background-position: center center;
   background-repeat: no-repeat;
 .oo-ui-toolbar-actions {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-toolbar-tools {
   display: inline;
 .oo-ui-toolbar-actions .oo-ui-popupWidget {
   -webkit-touch-callout: default;
   -webkit-user-select: all;
-     -moz-user-select: all;
-      -ms-user-select: all;
-          user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
 }
 .oo-ui-toolbar-bar {
   background-color: #f8fbfd;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #F1F7FB));
   background-image: -webkit-linear-gradient(top, #fff 0, #F1F7FB 100%);
-  background-image:    -moz-linear-gradient(top, #fff 0, #F1F7FB 100%);
-  background-image:         linear-gradient(to bottom, #fff 0, #F1F7FB 100%);
+  background-image: -moz-linear-gradient(top, #fff 0, #F1F7FB 100%);
+  background-image: linear-gradient(to bottom, #fff 0, #F1F7FB 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#fff1f7fb' )";
 }
 .oo-ui-toolbar-position-top > .oo-ui-toolbar-bar {
index 5d313ab..a8e82f1 100644 (file)
@@ -1,31 +1,27 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-05-16T22:31:46Z
  */
 .oo-ui-tool.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms;
-     -moz-transition: background-color 100ms;
-          transition: background-color 100ms;
+  -moz-transition: background-color 100ms;
+  transition: background-color 100ms;
 }
 .oo-ui-tool.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
   -webkit-transition: color 100ms;
-     -moz-transition: color 100ms;
-          transition: color 100ms;
+  -moz-transition: color 100ms;
+  transition: color 100ms;
 }
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
   z-index: 4;
 }
-.oo-ui-popupTool .oo-ui-popupWidget {
-  /* @noflip */
-  margin-left: 1.25em;
-}
 .oo-ui-toolGroupTool > .oo-ui-toolGroup {
   border-right: 0;
 }
@@ -37,9 +33,6 @@
   height: 2.5em;
   width: 1.875em;
 }
-.oo-ui-toolGroupTool > .oo-ui-popupToolGroup.oo-ui-labelElement > .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
-  line-height: 2.1;
-}
 .oo-ui-toolGroup {
   display: inline-block;
   vertical-align: middle;
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-enabled > .oo-ui-tool-link .oo-ui-tool-title {
   color: #222;
   -webkit-transition: color 100ms;
-     -moz-transition: color 100ms;
-          transition: color 100ms;
+  -moz-transition: color 100ms;
+  transition: color 100ms;
 }
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-enabled.oo-ui-tool-active {
   background-color: #eaf3ff;
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
   margin-right: 1.75em;
 }
+.oo-ui-popupToolGroup.oo-ui-labelElement:not( .oo-ui-indicatorElement ) .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+  margin: 0 0.5em;
+}
 .oo-ui-popupToolGroup-header {
   line-height: 2.6;
   margin: 0 0.6em;
   height: 2.5em;
 }
 .oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-  width: 0.9375em;
-  height: 1.625em;
-  margin: 0.78125em 0.5em;
   top: 0;
   right: 0;
-  opacity: 0.3;
+  width: 0.9375em;
+  height: 100%;
+  margin: 0 0.5em;
+  opacity: 0.87;
 }
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
   right: -0.3125em;
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
   left: 0;
 }
+.oo-ui-popupToolGroup:not( .oo-ui-labelElement ):not( .oo-ui-iconElement ) .oo-ui-indicatorElement-indicator {
+  opacity: 1;
+}
 .oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
   margin: 0 -1px;
   border: 1px solid #c8ccd1;
 .oo-ui-popupToolGroup .oo-ui-tool-link {
   padding: 0.4em 0.625em;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
   height: 2.5em;
   width: 1.875em;
   min-width: 1.875em;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
-  line-height: 2;
-}
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
   padding-left: 0.5em;
   color: #222;
 }
 .oo-ui-popupToolGroup.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms, box-shadow 100ms;
-     -moz-transition: background-color 100ms, box-shadow 100ms;
-          transition: background-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, box-shadow 100ms;
 }
 .oo-ui-popupToolGroup.oo-ui-widget-enabled.oo-ui-popupToolGroup-active {
   box-shadow: inset 0 0.07em 0.07em 0 rgba(0, 0, 0, 0.07);
 .oo-ui-popupToolGroup.oo-ui-widget-enabled.oo-ui-popupToolGroup-active .oo-ui-tool-active.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
   color: #36c;
 }
-.oo-ui-popupToolGroup.oo-ui-widget-enabled-handle:hover {
+.oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle {
+  -webkit-transition: background-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, box-shadow 100ms;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:hover {
   background-color: #eaecf0;
 }
-.oo-ui-popupToolGroup.oo-ui-widget-enabled-handle:active {
+.oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle:active {
   background-color: #eaf3ff;
 }
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #36c;
+  border-color: #36c;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:hover {
+  background-color: #447ff5;
+  border-color: #447ff5;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:active,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:active:focus,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #2a4b8d;
+  border-color: #2a4b8d;
+  box-shadow: none;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-progressive > .oo-ui-popupToolGroup-handle:focus {
+  border-color: #36c;
+  box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
+  outline: 0;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #36c;
+  border-color: #36c;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:hover {
+  background-color: #447ff5;
+  border-color: #447ff5;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:active,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:active:focus,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-pressed > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive.oo-ui-buttonElement-active > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #2a4b8d;
+  border-color: #2a4b8d;
+  box-shadow: none;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-constructive > .oo-ui-popupToolGroup-handle:focus {
+  border-color: #36c;
+  box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
+  outline: 0;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #d33;
+  border-color: #d33;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle:hover {
+  background-color: #ff4242;
+  border-color: #ff4242;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle:active,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle:active:focus,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-popupToolGroup-handle,
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive.oo-ui-popupToolGroup-active > .oo-ui-popupToolGroup-handle {
+  color: #fff;
+  background-color: #b32424;
+  border-color: #b32424;
+  box-shadow: none;
+}
+.oo-ui-popupToolGroup.oo-ui-flaggedElement-destructive > .oo-ui-popupToolGroup-handle:focus {
+  border-color: #d33;
+  box-shadow: inset 0 0 0 1px #d33, inset 0 0 0 2px #fff;
+  outline: 0;
+}
 .oo-ui-listToolGroup .oo-ui-tool {
   display: block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
   background-color: #eaecf0;
 .oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
   background-image: url('themes/mediawiki/images/icons/check-progressive.png');
   background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-progressive.svg');
-  background-image:         linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-progressive.svg');
-  background-image:      -o-linear-gradient(transparent, transparent), url('themes/mediawiki/images/icons/check-progressive.png');
+  background-image: linear-gradient(transparent, transparent), /* @embed */ url('themes/mediawiki/images/icons/check-progressive.svg');
+  background-image: -o-linear-gradient(transparent, transparent), url('themes/mediawiki/images/icons/check-progressive.png');
   background-size: contain;
   background-position: center center;
   background-repeat: no-repeat;
 .oo-ui-toolbar-actions {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-toolbar-tools {
   display: inline;
 .oo-ui-toolbar-actions .oo-ui-popupWidget {
   -webkit-touch-callout: default;
   -webkit-user-select: all;
-     -moz-user-select: all;
-      -ms-user-select: all;
-          user-select: all;
+  -moz-user-select: all;
+  -ms-user-select: all;
+  user-select: all;
 }
 .oo-ui-toolbar-bar {
   background-color: #fff;
   background-color: transparent;
   box-shadow: none;
 }
-.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement {
+.oo-ui-toolbar-narrow .oo-ui-toolbar-bar:after {
+  content: '';
+  display: block;
+  position: absolute;
+  top: 3.125em;
+  left: 0;
+  width: 100%;
+  height: 0;
+  border-bottom: 1px solid #c8ccd1;
+}
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement,
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-indicatorElement,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-labelElement,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-indicatorElement {
   margin: 0;
 }
-.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button {
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
   border: 0;
   border-radius: 0;
   padding: 0 0.3125em;
 }
-.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
   margin: 0 1em;
   line-height: 3.125em;
 }
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-indicatorElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+  margin: 0;
+}
+.oo-ui-toolbar-actions > .oo-ui-buttonGroupWidget > .oo-ui-buttonElement.oo-ui-indicatorElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+  margin: 0 0.3125em;
+}
 .oo-ui-toolbar-actions > .oo-ui-toolbar:not( :last-child ) {
   border-right: 1px solid #c8ccd1;
 }
index e89a734..940ebbd 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-05-16T22:31:39Z
  */
 ( function ( OO ) {
 
@@ -629,10 +629,8 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
                .attr( 'role', 'button' );
        this.$element
                .data( 'oo-ui-tool', this )
-               .addClass(
-                       'oo-ui-tool ' + 'oo-ui-tool-name-' +
-                       this.constructor.static.name.replace( /^([^\/]+)\/([^\/]+).*$/, '$1-$2' )
-               )
+               .addClass( 'oo-ui-tool' )
+               .addClass( 'oo-ui-tool-name-' + this.constructor.static.name.replace( /^([^\/]+)\/([^\/]+).*$/, '$1-$2' ) )
                .toggleClass( 'oo-ui-tool-with-label', this.constructor.static.displayBothIconAndLabel )
                .append( this.$link );
        this.setTitle( config.title || this.constructor.static.title );
@@ -1469,6 +1467,7 @@ OO.ui.PopupTool = function OoUiPopupTool( toolGroup, config ) {
        OO.ui.mixin.PopupElement.call( this, config );
 
        // Initialization
+       this.popup.setPosition( toolGroup.getToolbar().position === 'bottom' ? 'above' : 'below' );
        this.$element
                .addClass( 'oo-ui-popupTool' )
                .append( this.popup.$element );
@@ -1777,6 +1776,7 @@ OO.ui.BarToolGroup.static.name = 'bar';
  * @mixins OO.ui.mixin.IndicatorElement
  * @mixins OO.ui.mixin.LabelElement
  * @mixins OO.ui.mixin.TitledElement
+ * @mixins OO.ui.mixin.FlaggedElement
  * @mixins OO.ui.mixin.ClippableElement
  * @mixins OO.ui.mixin.TabIndexedElement
  *
@@ -1794,7 +1794,7 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
 
        // Configuration initialization
        config = $.extend( {
-               indicator: toolbar.position === 'bottom' ? 'up' : 'down'
+               indicator: config.indicator === undefined ? ( toolbar.position === 'bottom' ? 'up' : 'down' ) : config.indicator
        }, config );
 
        // Parent constructor
@@ -1811,6 +1811,7 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        OO.ui.mixin.IndicatorElement.call( this, config );
        OO.ui.mixin.LabelElement.call( this, config );
        OO.ui.mixin.TitledElement.call( this, config );
+       OO.ui.mixin.FlaggedElement.call( this, config );
        OO.ui.mixin.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );
        OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$handle } ) );
 
@@ -1825,6 +1826,7 @@ OO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {
        // Initialization
        this.$handle
                .addClass( 'oo-ui-popupToolGroup-handle' )
+               .attr( 'role', 'button' )
                .append( this.$icon, this.$label, this.$indicator );
        // If the pop-up should have a header, add it to the top of the toolGroup.
        // Note: If this feature is useful for other widgets, we could abstract it into an
@@ -1848,6 +1850,7 @@ OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.IconElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.IndicatorElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.LabelElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.TitledElement );
+OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.FlaggedElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.ClippableElement );
 OO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.TabIndexedElement );
 
@@ -2194,6 +2197,9 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
        for ( i = 0, len = this.collapsibleTools.length; i < len; i++ ) {
                this.collapsibleTools[ i ].toggle( this.expanded );
        }
+
+       // Re-evaluate clipping, because our height has changed
+       this.clip();
 };
 
 /**
@@ -2355,3 +2361,5 @@ OO.ui.MenuToolGroup.prototype.onUpdateState = function () {
 };
 
 }( OO ) );
+
+//# sourceMappingURL=oojs-ui-toolbars.js.map
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/oojs-ui-toolbars.js.map b/resources/lib/oojs-ui/oojs-ui-toolbars.js.map
new file mode 100644 (file)
index 0000000..7808df0
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/intro.js.txt","../src/Toolbar.js","../src/Tool.js","../src/ToolGroup.js","../src/ToolFactory.js","../src/ToolGroupFactory.js","../src/tools/PopupTool.js","../src/tools/ToolGroupTool.js","../src/toolgroups/BarToolGroup.js","../src/toolgroups/PopupToolGroup.js","../src/toolgroups/ListToolGroup.js","../src/toolgroups/MenuToolGroup.js","../src/outro.js.txt"],"names":[],"mappings":"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","file":"oojs-ui-toolbars.js","sourcesContent":["( function ( OO ) {\n\n'use strict';\n","/**\n * Toolbars are complex interface components that permit users to easily access a variety\n * of {@link OO.ui.Tool tools} (e.g., formatting commands) and actions, which are additional commands that are\n * part of the toolbar, but not configured as tools.\n *\n * Individual tools are customized and then registered with a {@link OO.ui.ToolFactory tool factory}, which creates\n * the tools on demand. Each tool has a symbolic name (used when registering the tool), a title (e.g., ‘Insert\n * image’), and an icon.\n *\n * Individual tools are organized in {@link OO.ui.ToolGroup toolgroups}, which can be {@link OO.ui.MenuToolGroup menus}\n * of tools, {@link OO.ui.ListToolGroup lists} of tools, or a single {@link OO.ui.BarToolGroup bar} of tools.\n * The arrangement and order of the toolgroups is customized when the toolbar is set up. Tools can be presented in\n * any order, but each can only appear once in the toolbar.\n *\n * The toolbar can be synchronized with the state of the external \"application\", like a text\n * editor's editing area, marking tools as active/inactive (e.g. a 'bold' tool would be shown as\n * active when the text cursor was inside bolded text) or enabled/disabled (e.g. a table caption\n * tool would be disabled while the user is not editing a table). A state change is signalled by\n * emitting the {@link #event-updateState 'updateState' event}, which calls Tools'\n * {@link OO.ui.Tool#onUpdateState onUpdateState method}.\n *\n * The following is an example of a basic toolbar.\n *\n *     @example\n *     // Example of a toolbar\n *     // Create the toolbar\n *     var toolFactory = new OO.ui.ToolFactory();\n *     var toolGroupFactory = new OO.ui.ToolGroupFactory();\n *     var toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory );\n *\n *     // We will be placing status text in this element when tools are used\n *     var $area = $( '<p>' ).text( 'Toolbar example' );\n *\n *     // Define the tools that we're going to place in our toolbar\n *\n *     // Create a class inheriting from OO.ui.Tool\n *     function SearchTool() {\n *         SearchTool.parent.apply( this, arguments );\n *     }\n *     OO.inheritClass( SearchTool, OO.ui.Tool );\n *     // Each tool must have a 'name' (used as an internal identifier, see later) and at least one\n *     // of 'icon' and 'title' (displayed icon and text).\n *     SearchTool.static.name = 'search';\n *     SearchTool.static.icon = 'search';\n *     SearchTool.static.title = 'Search...';\n *     // Defines the action that will happen when this tool is selected (clicked).\n *     SearchTool.prototype.onSelect = function () {\n *         $area.text( 'Search tool clicked!' );\n *         // Never display this tool as \"active\" (selected).\n *         this.setActive( false );\n *     };\n *     SearchTool.prototype.onUpdateState = function () {};\n *     // Make this tool available in our toolFactory and thus our toolbar\n *     toolFactory.register( SearchTool );\n *\n *     // Register two more tools, nothing interesting here\n *     function SettingsTool() {\n *         SettingsTool.parent.apply( this, arguments );\n *     }\n *     OO.inheritClass( SettingsTool, OO.ui.Tool );\n *     SettingsTool.static.name = 'settings';\n *     SettingsTool.static.icon = 'settings';\n *     SettingsTool.static.title = 'Change settings';\n *     SettingsTool.prototype.onSelect = function () {\n *         $area.text( 'Settings tool clicked!' );\n *         this.setActive( false );\n *     };\n *     SettingsTool.prototype.onUpdateState = function () {};\n *     toolFactory.register( SettingsTool );\n *\n *     // Register two more tools, nothing interesting here\n *     function StuffTool() {\n *         StuffTool.parent.apply( this, arguments );\n *     }\n *     OO.inheritClass( StuffTool, OO.ui.Tool );\n *     StuffTool.static.name = 'stuff';\n *     StuffTool.static.icon = 'ellipsis';\n *     StuffTool.static.title = 'More stuff';\n *     StuffTool.prototype.onSelect = function () {\n *         $area.text( 'More stuff tool clicked!' );\n *         this.setActive( false );\n *     };\n *     StuffTool.prototype.onUpdateState = function () {};\n *     toolFactory.register( StuffTool );\n *\n *     // This is a PopupTool. Rather than having a custom 'onSelect' action, it will display a\n *     // little popup window (a PopupWidget).\n *     function HelpTool( toolGroup, config ) {\n *         OO.ui.PopupTool.call( this, toolGroup, $.extend( { popup: {\n *             padded: true,\n *             label: 'Help',\n *             head: true\n *         } }, config ) );\n *         this.popup.$body.append( '<p>I am helpful!</p>' );\n *     }\n *     OO.inheritClass( HelpTool, OO.ui.PopupTool );\n *     HelpTool.static.name = 'help';\n *     HelpTool.static.icon = 'help';\n *     HelpTool.static.title = 'Help';\n *     toolFactory.register( HelpTool );\n *\n *     // Finally define which tools and in what order appear in the toolbar. Each tool may only be\n *     // used once (but not all defined tools must be used).\n *     toolbar.setup( [\n *         {\n *             // 'bar' tool groups display tools' icons only, side-by-side.\n *             type: 'bar',\n *             include: [ 'search', 'help' ]\n *         },\n *         {\n *             // 'list' tool groups display both the titles and icons, in a dropdown list.\n *             type: 'list',\n *             indicator: 'down',\n *             label: 'More',\n *             include: [ 'settings', 'stuff' ]\n *         }\n *         // Note how the tools themselves are toolgroup-agnostic - the same tool can be displayed\n *         // either in a 'list' or a 'bar'. There is a 'menu' tool group too, not showcased here,\n *         // since it's more complicated to use. (See the next example snippet on this page.)\n *     ] );\n *\n *     // Create some UI around the toolbar and place it in the document\n *     var frame = new OO.ui.PanelLayout( {\n *         expanded: false,\n *         framed: true\n *     } );\n *     var contentFrame = new OO.ui.PanelLayout( {\n *         expanded: false,\n *         padded: true\n *     } );\n *     frame.$element.append(\n *         toolbar.$element,\n *         contentFrame.$element.append( $area )\n *     );\n *     $( 'body' ).append( frame.$element );\n *\n *     // Here is where the toolbar is actually built. This must be done after inserting it into the\n *     // document.\n *     toolbar.initialize();\n *     toolbar.emit( 'updateState' );\n *\n * The following example extends the previous one to illustrate 'menu' toolgroups and the usage of\n * {@link #event-updateState 'updateState' event}.\n *\n *     @example\n *     // Create the toolbar\n *     var toolFactory = new OO.ui.ToolFactory();\n *     var toolGroupFactory = new OO.ui.ToolGroupFactory();\n *     var toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory );\n *\n *     // We will be placing status text in this element when tools are used\n *     var $area = $( '<p>' ).text( 'Toolbar example' );\n *\n *     // Define the tools that we're going to place in our toolbar\n *\n *     // Create a class inheriting from OO.ui.Tool\n *     function SearchTool() {\n *         SearchTool.parent.apply( this, arguments );\n *     }\n *     OO.inheritClass( SearchTool, OO.ui.Tool );\n *     // Each tool must have a 'name' (used as an internal identifier, see later) and at least one\n *     // of 'icon' and 'title' (displayed icon and text).\n *     SearchTool.static.name = 'search';\n *     SearchTool.static.icon = 'search';\n *     SearchTool.static.title = 'Search...';\n *     // Defines the action that will happen when this tool is selected (clicked).\n *     SearchTool.prototype.onSelect = function () {\n *         $area.text( 'Search tool clicked!' );\n *         // Never display this tool as \"active\" (selected).\n *         this.setActive( false );\n *     };\n *     SearchTool.prototype.onUpdateState = function () {};\n *     // Make this tool available in our toolFactory and thus our toolbar\n *     toolFactory.register( SearchTool );\n *\n *     // Register two more tools, nothing interesting here\n *     function SettingsTool() {\n *         SettingsTool.parent.apply( this, arguments );\n *         this.reallyActive = false;\n *     }\n *     OO.inheritClass( SettingsTool, OO.ui.Tool );\n *     SettingsTool.static.name = 'settings';\n *     SettingsTool.static.icon = 'settings';\n *     SettingsTool.static.title = 'Change settings';\n *     SettingsTool.prototype.onSelect = function () {\n *         $area.text( 'Settings tool clicked!' );\n *         // Toggle the active state on each click\n *         this.reallyActive = !this.reallyActive;\n *         this.setActive( this.reallyActive );\n *         // To update the menu label\n *         this.toolbar.emit( 'updateState' );\n *     };\n *     SettingsTool.prototype.onUpdateState = function () {};\n *     toolFactory.register( SettingsTool );\n *\n *     // Register two more tools, nothing interesting here\n *     function StuffTool() {\n *         StuffTool.parent.apply( this, arguments );\n *         this.reallyActive = false;\n *     }\n *     OO.inheritClass( StuffTool, OO.ui.Tool );\n *     StuffTool.static.name = 'stuff';\n *     StuffTool.static.icon = 'ellipsis';\n *     StuffTool.static.title = 'More stuff';\n *     StuffTool.prototype.onSelect = function () {\n *         $area.text( 'More stuff tool clicked!' );\n *         // Toggle the active state on each click\n *         this.reallyActive = !this.reallyActive;\n *         this.setActive( this.reallyActive );\n *         // To update the menu label\n *         this.toolbar.emit( 'updateState' );\n *     };\n *     StuffTool.prototype.onUpdateState = function () {};\n *     toolFactory.register( StuffTool );\n *\n *     // This is a PopupTool. Rather than having a custom 'onSelect' action, it will display a\n *     // little popup window (a PopupWidget). 'onUpdateState' is also already implemented.\n *     function HelpTool( toolGroup, config ) {\n *         OO.ui.PopupTool.call( this, toolGroup, $.extend( { popup: {\n *             padded: true,\n *             label: 'Help',\n *             head: true\n *         } }, config ) );\n *         this.popup.$body.append( '<p>I am helpful!</p>' );\n *     }\n *     OO.inheritClass( HelpTool, OO.ui.PopupTool );\n *     HelpTool.static.name = 'help';\n *     HelpTool.static.icon = 'help';\n *     HelpTool.static.title = 'Help';\n *     toolFactory.register( HelpTool );\n *\n *     // Finally define which tools and in what order appear in the toolbar. Each tool may only be\n *     // used once (but not all defined tools must be used).\n *     toolbar.setup( [\n *         {\n *             // 'bar' tool groups display tools' icons only, side-by-side.\n *             type: 'bar',\n *             include: [ 'search', 'help' ]\n *         },\n *         {\n *             // 'menu' tool groups display both the titles and icons, in a dropdown menu.\n *             // Menu label indicates which items are selected.\n *             type: 'menu',\n *             indicator: 'down',\n *             include: [ 'settings', 'stuff' ]\n *         }\n *     ] );\n *\n *     // Create some UI around the toolbar and place it in the document\n *     var frame = new OO.ui.PanelLayout( {\n *         expanded: false,\n *         framed: true\n *     } );\n *     var contentFrame = new OO.ui.PanelLayout( {\n *         expanded: false,\n *         padded: true\n *     } );\n *     frame.$element.append(\n *         toolbar.$element,\n *         contentFrame.$element.append( $area )\n *     );\n *     $( 'body' ).append( frame.$element );\n *\n *     // Here is where the toolbar is actually built. This must be done after inserting it into the\n *     // document.\n *     toolbar.initialize();\n *     toolbar.emit( 'updateState' );\n *\n * @class\n * @extends OO.ui.Element\n * @mixins OO.EventEmitter\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {OO.ui.ToolFactory} toolFactory Factory for creating tools\n * @param {OO.ui.ToolGroupFactory} toolGroupFactory Factory for creating toolgroups\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [actions] Add an actions section to the toolbar. Actions are commands that are included\n *  in the toolbar, but are not configured as tools. By default, actions are displayed on the right side of\n *  the toolbar.\n * @cfg {string} [position='top'] Whether the toolbar is positioned above ('top') or below ('bottom') content.\n */\nOO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( toolFactory ) && config === undefined ) {\n\t\tconfig = toolFactory;\n\t\ttoolFactory = config.toolFactory;\n\t\ttoolGroupFactory = config.toolGroupFactory;\n\t}\n\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.Toolbar.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\tOO.ui.mixin.GroupElement.call( this, config );\n\n\t// Properties\n\tthis.toolFactory = toolFactory;\n\tthis.toolGroupFactory = toolGroupFactory;\n\tthis.groups = [];\n\tthis.tools = {};\n\tthis.position = config.position || 'top';\n\tthis.$bar = $( '<div>' );\n\tthis.$actions = $( '<div>' );\n\tthis.initialized = false;\n\tthis.narrowThreshold = null;\n\tthis.onWindowResizeHandler = this.onWindowResize.bind( this );\n\n\t// Events\n\tthis.$element\n\t\t.add( this.$bar ).add( this.$group ).add( this.$actions )\n\t\t.on( 'mousedown keydown', this.onPointerDown.bind( this ) );\n\n\t// Initialization\n\tthis.$group.addClass( 'oo-ui-toolbar-tools' );\n\tif ( config.actions ) {\n\t\tthis.$bar.append( this.$actions.addClass( 'oo-ui-toolbar-actions' ) );\n\t}\n\tthis.$bar\n\t\t.addClass( 'oo-ui-toolbar-bar' )\n\t\t.append( this.$group, '<div style=\"clear:both\"></div>' );\n\tthis.$element.addClass( 'oo-ui-toolbar oo-ui-toolbar-position-' + this.position ).append( this.$bar );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.Toolbar, OO.ui.Element );\nOO.mixinClass( OO.ui.Toolbar, OO.EventEmitter );\nOO.mixinClass( OO.ui.Toolbar, OO.ui.mixin.GroupElement );\n\n/* Events */\n\n/**\n * @event updateState\n *\n * An 'updateState' event must be emitted on the Toolbar (by calling `toolbar.emit( 'updateState' )`)\n * every time the state of the application using the toolbar changes, and an update to the state of\n * tools is required.\n *\n * @param {...Mixed} data Application-defined parameters\n */\n\n/* Methods */\n\n/**\n * Get the tool factory.\n *\n * @return {OO.ui.ToolFactory} Tool factory\n */\nOO.ui.Toolbar.prototype.getToolFactory = function () {\n\treturn this.toolFactory;\n};\n\n/**\n * Get the toolgroup factory.\n *\n * @return {OO.Factory} Toolgroup factory\n */\nOO.ui.Toolbar.prototype.getToolGroupFactory = function () {\n\treturn this.toolGroupFactory;\n};\n\n/**\n * Handles mouse down events.\n *\n * @private\n * @param {jQuery.Event} e Mouse down event\n */\nOO.ui.Toolbar.prototype.onPointerDown = function ( e ) {\n\tvar $closestWidgetToEvent = $( e.target ).closest( '.oo-ui-widget' ),\n\t\t$closestWidgetToToolbar = this.$element.closest( '.oo-ui-widget' );\n\tif ( !$closestWidgetToEvent.length || $closestWidgetToEvent[ 0 ] === $closestWidgetToToolbar[ 0 ] ) {\n\t\treturn false;\n\t}\n};\n\n/**\n * Handle window resize event.\n *\n * @private\n * @param {jQuery.Event} e Window resize event\n */\nOO.ui.Toolbar.prototype.onWindowResize = function () {\n\tthis.$element.toggleClass(\n\t\t'oo-ui-toolbar-narrow',\n\t\tthis.$bar.width() <= this.getNarrowThreshold()\n\t);\n};\n\n/**\n * Get the (lazily-computed) width threshold for applying the oo-ui-toolbar-narrow\n * class.\n *\n * @private\n * @return {number} Width threshold in pixels\n */\nOO.ui.Toolbar.prototype.getNarrowThreshold = function () {\n\tif ( this.narrowThreshold === null ) {\n\t\tthis.narrowThreshold = this.$group.width() + this.$actions.width();\n\t}\n\treturn this.narrowThreshold;\n};\n\n/**\n * Sets up handles and preloads required information for the toolbar to work.\n * This must be called after it is attached to a visible document and before doing anything else.\n */\nOO.ui.Toolbar.prototype.initialize = function () {\n\tif ( !this.initialized ) {\n\t\tthis.initialized = true;\n\t\t$( this.getElementWindow() ).on( 'resize', this.onWindowResizeHandler );\n\t\tthis.onWindowResize();\n\t}\n};\n\n/**\n * Set up the toolbar.\n *\n * The toolbar is set up with a list of toolgroup configurations that specify the type of\n * toolgroup ({@link OO.ui.BarToolGroup bar}, {@link OO.ui.MenuToolGroup menu}, or {@link OO.ui.ListToolGroup list})\n * to add and which tools to include, exclude, promote, or demote within that toolgroup. Please\n * see {@link OO.ui.ToolGroup toolgroups} for more information about including tools in toolgroups.\n *\n * @param {Object.<string,Array>} groups List of toolgroup configurations\n * @param {Array|string} [groups.include] Tools to include in the toolgroup\n * @param {Array|string} [groups.exclude] Tools to exclude from the toolgroup\n * @param {Array|string} [groups.promote] Tools to promote to the beginning of the toolgroup\n * @param {Array|string} [groups.demote] Tools to demote to the end of the toolgroup\n */\nOO.ui.Toolbar.prototype.setup = function ( groups ) {\n\tvar i, len, type, group,\n\t\titems = [],\n\t\tdefaultType = 'bar';\n\n\t// Cleanup previous groups\n\tthis.reset();\n\n\t// Build out new groups\n\tfor ( i = 0, len = groups.length; i < len; i++ ) {\n\t\tgroup = groups[ i ];\n\t\tif ( group.include === '*' ) {\n\t\t\t// Apply defaults to catch-all groups\n\t\t\tif ( group.type === undefined ) {\n\t\t\t\tgroup.type = 'list';\n\t\t\t}\n\t\t\tif ( group.label === undefined ) {\n\t\t\t\tgroup.label = OO.ui.msg( 'ooui-toolbar-more' );\n\t\t\t}\n\t\t}\n\t\t// Check type has been registered\n\t\ttype = this.getToolGroupFactory().lookup( group.type ) ? group.type : defaultType;\n\t\titems.push(\n\t\t\tthis.getToolGroupFactory().create( type, this, group )\n\t\t);\n\t}\n\tthis.addItems( items );\n};\n\n/**\n * Remove all tools and toolgroups from the toolbar.\n */\nOO.ui.Toolbar.prototype.reset = function () {\n\tvar i, len;\n\n\tthis.groups = [];\n\tthis.tools = {};\n\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\tthis.items[ i ].destroy();\n\t}\n\tthis.clearItems();\n};\n\n/**\n * Destroy the toolbar.\n *\n * Destroying the toolbar removes all event handlers and DOM elements that constitute the toolbar. Call\n * this method whenever you are done using a toolbar.\n */\nOO.ui.Toolbar.prototype.destroy = function () {\n\t$( this.getElementWindow() ).off( 'resize', this.onWindowResizeHandler );\n\tthis.reset();\n\tthis.$element.remove();\n};\n\n/**\n * Check if the tool is available.\n *\n * Available tools are ones that have not yet been added to the toolbar.\n *\n * @param {string} name Symbolic name of tool\n * @return {boolean} Tool is available\n */\nOO.ui.Toolbar.prototype.isToolAvailable = function ( name ) {\n\treturn !this.tools[ name ];\n};\n\n/**\n * Prevent tool from being used again.\n *\n * @param {OO.ui.Tool} tool Tool to reserve\n */\nOO.ui.Toolbar.prototype.reserveTool = function ( tool ) {\n\tthis.tools[ tool.getName() ] = tool;\n};\n\n/**\n * Allow tool to be used again.\n *\n * @param {OO.ui.Tool} tool Tool to release\n */\nOO.ui.Toolbar.prototype.releaseTool = function ( tool ) {\n\tdelete this.tools[ tool.getName() ];\n};\n\n/**\n * Get accelerator label for tool.\n *\n * The OOjs UI library does not contain an accelerator system, but this is the hook for one. To\n * use an accelerator system, subclass the toolbar and override this method, which is meant to return a label\n * that describes the accelerator keys for the tool passed (by symbolic name) to the method.\n *\n * @param {string} name Symbolic name of tool\n * @return {string|undefined} Tool accelerator label if available\n */\nOO.ui.Toolbar.prototype.getToolAccelerator = function () {\n\treturn undefined;\n};\n","/**\n * Tools, together with {@link OO.ui.ToolGroup toolgroups}, constitute {@link OO.ui.Toolbar toolbars}.\n * Each tool is configured with a static name, title, and icon and is customized with the command to carry\n * out when the tool is selected. Tools must also be registered with a {@link OO.ui.ToolFactory tool factory},\n * which creates the tools on demand.\n *\n * Every Tool subclass must implement two methods:\n *\n * - {@link #onUpdateState}\n * - {@link #onSelect}\n *\n * Tools are added to toolgroups ({@link OO.ui.ListToolGroup ListToolGroup},\n * {@link OO.ui.BarToolGroup BarToolGroup}, or {@link OO.ui.MenuToolGroup MenuToolGroup}), which determine how\n * the tool is displayed in the toolbar. See {@link OO.ui.Toolbar toolbars} for an example.\n *\n * For more information, please see the [OOjs UI documentation on MediaWiki][1].\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Toolbars\n *\n * @abstract\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.FlaggedElement\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {OO.ui.ToolGroup} toolGroup\n * @param {Object} [config] Configuration options\n * @cfg {string|Function} [title] Title text or a function that returns text. If this config is omitted, the value of\n *  the {@link #static-title static title} property is used.\n *\n *  The title is used in different ways depending on the type of toolgroup that contains the tool. The\n *  title is used as a tooltip if the tool is part of a {@link OO.ui.BarToolGroup bar} toolgroup, or as the label text if the tool is\n *  part of a {@link OO.ui.ListToolGroup list} or {@link OO.ui.MenuToolGroup menu} toolgroup.\n *\n *  For bar toolgroups, a description of the accelerator key is appended to the title if an accelerator key\n *  is associated with an action by the same name as the tool and accelerator functionality has been added to the application.\n *  To add accelerator key functionality, you must subclass OO.ui.Toolbar and override the {@link OO.ui.Toolbar#getToolAccelerator getToolAccelerator} method.\n */\nOO.ui.Tool = function OoUiTool( toolGroup, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( toolGroup ) && config === undefined ) {\n\t\tconfig = toolGroup;\n\t\ttoolGroup = config.toolGroup;\n\t}\n\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.Tool.parent.call( this, config );\n\n\t// Properties\n\tthis.toolGroup = toolGroup;\n\tthis.toolbar = this.toolGroup.getToolbar();\n\tthis.active = false;\n\tthis.$title = $( '<span>' );\n\tthis.$accel = $( '<span>' );\n\tthis.$link = $( '<a>' );\n\tthis.title = null;\n\n\t// Mixin constructors\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.FlaggedElement.call( this, config );\n\tOO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$link } ) );\n\n\t// Events\n\tthis.toolbar.connect( this, { updateState: 'onUpdateState' } );\n\n\t// Initialization\n\tthis.$title.addClass( 'oo-ui-tool-title' );\n\tthis.$accel\n\t\t.addClass( 'oo-ui-tool-accel' )\n\t\t.prop( {\n\t\t\t// This may need to be changed if the key names are ever localized,\n\t\t\t// but for now they are essentially written in English\n\t\t\tdir: 'ltr',\n\t\t\tlang: 'en'\n\t\t} );\n\tthis.$link\n\t\t.addClass( 'oo-ui-tool-link' )\n\t\t.append( this.$icon, this.$title, this.$accel )\n\t\t.attr( 'role', 'button' );\n\tthis.$element\n\t\t.data( 'oo-ui-tool', this )\n\t\t.addClass( 'oo-ui-tool' )\n\t\t.addClass( 'oo-ui-tool-name-' + this.constructor.static.name.replace( /^([^\\/]+)\\/([^\\/]+).*$/, '$1-$2' ) )\n\t\t.toggleClass( 'oo-ui-tool-with-label', this.constructor.static.displayBothIconAndLabel )\n\t\t.append( this.$link );\n\tthis.setTitle( config.title || this.constructor.static.title );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.Tool, OO.ui.Widget );\nOO.mixinClass( OO.ui.Tool, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.Tool, OO.ui.mixin.FlaggedElement );\nOO.mixinClass( OO.ui.Tool, OO.ui.mixin.TabIndexedElement );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.Tool.static.tagName = 'span';\n\n/**\n * Symbolic name of tool.\n *\n * The symbolic name is used internally to register the tool with a {@link OO.ui.ToolFactory ToolFactory}. It can\n * also be used when adding tools to toolgroups.\n *\n * @abstract\n * @static\n * @inheritable\n * @property {string}\n */\nOO.ui.Tool.static.name = '';\n\n/**\n * Symbolic name of the group.\n *\n * The group name is used to associate tools with each other so that they can be selected later by\n * a {@link OO.ui.ToolGroup toolgroup}.\n *\n * @abstract\n * @static\n * @inheritable\n * @property {string}\n */\nOO.ui.Tool.static.group = '';\n\n/**\n * Tool title text or a function that returns title text. The value of the static property is overridden if the #title config option is used.\n *\n * @abstract\n * @static\n * @inheritable\n * @property {string|Function}\n */\nOO.ui.Tool.static.title = '';\n\n/**\n * Display both icon and label when the tool is used in a {@link OO.ui.BarToolGroup bar} toolgroup.\n * Normally only the icon is displayed, or only the label if no icon is given.\n *\n * @static\n * @inheritable\n * @property {boolean}\n */\nOO.ui.Tool.static.displayBothIconAndLabel = false;\n\n/**\n * Add tool to catch-all groups automatically.\n *\n * A catch-all group, which contains all tools that do not currently belong to a toolgroup,\n * can be included in a toolgroup using the wildcard selector, an asterisk (*).\n *\n * @static\n * @inheritable\n * @property {boolean}\n */\nOO.ui.Tool.static.autoAddToCatchall = true;\n\n/**\n * Add tool to named groups automatically.\n *\n * By default, tools that are configured with a static ‘group’ property are added\n * to that group and will be selected when the symbolic name of the group is specified (e.g., when\n * toolgroups include tools by group name).\n *\n * @static\n * @property {boolean}\n * @inheritable\n */\nOO.ui.Tool.static.autoAddToGroup = true;\n\n/**\n * Check if this tool is compatible with given data.\n *\n * This is a stub that can be overridden to provide support for filtering tools based on an\n * arbitrary piece of information  (e.g., where the cursor is in a document). The implementation\n * must also call this method so that the compatibility check can be performed.\n *\n * @static\n * @inheritable\n * @param {Mixed} data Data to check\n * @return {boolean} Tool can be used with data\n */\nOO.ui.Tool.static.isCompatibleWith = function () {\n\treturn false;\n};\n\n/* Methods */\n\n/**\n * Handle the toolbar state being updated. This method is called when the\n * {@link OO.ui.Toolbar#event-updateState 'updateState' event} is emitted on the\n * {@link OO.ui.Toolbar Toolbar} that uses this tool, and should set the state of this tool\n * depending on application state (usually by calling #setDisabled to enable or disable the tool,\n * or #setActive to mark is as currently in-use or not).\n *\n * This is an abstract method that must be overridden in a concrete subclass.\n *\n * @method\n * @protected\n * @abstract\n */\nOO.ui.Tool.prototype.onUpdateState = null;\n\n/**\n * Handle the tool being selected. This method is called when the user triggers this tool,\n * usually by clicking on its label/icon.\n *\n * This is an abstract method that must be overridden in a concrete subclass.\n *\n * @method\n * @protected\n * @abstract\n */\nOO.ui.Tool.prototype.onSelect = null;\n\n/**\n * Check if the tool is active.\n *\n * Tools become active when their #onSelect or #onUpdateState handlers change them to appear pressed\n * with the #setActive method. Additional CSS is applied to the tool to reflect the active state.\n *\n * @return {boolean} Tool is active\n */\nOO.ui.Tool.prototype.isActive = function () {\n\treturn this.active;\n};\n\n/**\n * Make the tool appear active or inactive.\n *\n * This method should be called within #onSelect or #onUpdateState event handlers to make the tool\n * appear pressed or not.\n *\n * @param {boolean} state Make tool appear active\n */\nOO.ui.Tool.prototype.setActive = function ( state ) {\n\tthis.active = !!state;\n\tif ( this.active ) {\n\t\tthis.$element.addClass( 'oo-ui-tool-active' );\n\t\tthis.setFlags( { progressive: true } );\n\t} else {\n\t\tthis.$element.removeClass( 'oo-ui-tool-active' );\n\t\tthis.setFlags( { progressive: false } );\n\t}\n};\n\n/**\n * Set the tool #title.\n *\n * @param {string|Function} title Title text or a function that returns text\n * @chainable\n */\nOO.ui.Tool.prototype.setTitle = function ( title ) {\n\tthis.title = OO.ui.resolveMsg( title );\n\tthis.updateTitle();\n\treturn this;\n};\n\n/**\n * Get the tool #title.\n *\n * @return {string} Title text\n */\nOO.ui.Tool.prototype.getTitle = function () {\n\treturn this.title;\n};\n\n/**\n * Get the tool's symbolic name.\n *\n * @return {string} Symbolic name of tool\n */\nOO.ui.Tool.prototype.getName = function () {\n\treturn this.constructor.static.name;\n};\n\n/**\n * Update the title.\n */\nOO.ui.Tool.prototype.updateTitle = function () {\n\tvar titleTooltips = this.toolGroup.constructor.static.titleTooltips,\n\t\taccelTooltips = this.toolGroup.constructor.static.accelTooltips,\n\t\taccel = this.toolbar.getToolAccelerator( this.constructor.static.name ),\n\t\ttooltipParts = [];\n\n\tthis.$title.text( this.title );\n\tthis.$accel.text( accel );\n\n\tif ( titleTooltips && typeof this.title === 'string' && this.title.length ) {\n\t\ttooltipParts.push( this.title );\n\t}\n\tif ( accelTooltips && typeof accel === 'string' && accel.length ) {\n\t\ttooltipParts.push( accel );\n\t}\n\tif ( tooltipParts.length ) {\n\t\tthis.$link.attr( 'title', tooltipParts.join( ' ' ) );\n\t} else {\n\t\tthis.$link.removeAttr( 'title' );\n\t}\n};\n\n/**\n * Destroy tool.\n *\n * Destroying the tool removes all event handlers and the tool’s DOM elements.\n * Call this method whenever you are done using a tool.\n */\nOO.ui.Tool.prototype.destroy = function () {\n\tthis.toolbar.disconnect( this );\n\tthis.$element.remove();\n};\n","/**\n * ToolGroups are collections of {@link OO.ui.Tool tools} that are used in a {@link OO.ui.Toolbar toolbar}.\n * The type of toolgroup ({@link OO.ui.ListToolGroup list}, {@link OO.ui.BarToolGroup bar}, or {@link OO.ui.MenuToolGroup menu})\n * to which a tool belongs determines how the tool is arranged and displayed in the toolbar. Toolgroups\n * themselves are created on demand with a {@link OO.ui.ToolGroupFactory toolgroup factory}.\n *\n * Toolgroups can contain individual tools, groups of tools, or all available tools, as specified\n * using the `include` config option. See OO.ui.ToolFactory#extract on documentation of the format.\n * The options `exclude`, `promote`, and `demote` support the same formats.\n *\n * See {@link OO.ui.Toolbar toolbars} for a full example. For more information about toolbars in general,\n * please see the [OOjs UI documentation on MediaWiki][1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Toolbars\n *\n * @abstract\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {OO.ui.Toolbar} toolbar\n * @param {Object} [config] Configuration options\n * @cfg {Array|string} [include] List of tools to include in the toolgroup, see above.\n * @cfg {Array|string} [exclude] List of tools to exclude from the toolgroup, see above.\n * @cfg {Array|string} [promote] List of tools to promote to the beginning of the toolgroup, see above.\n * @cfg {Array|string} [demote] List of tools to demote to the end of the toolgroup, see above.\n *  This setting is particularly useful when tools have been added to the toolgroup\n *  en masse (e.g., via the catch-all selector).\n */\nOO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( toolbar ) && config === undefined ) {\n\t\tconfig = toolbar;\n\t\ttoolbar = config.toolbar;\n\t}\n\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.ToolGroup.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, config );\n\n\t// Properties\n\tthis.toolbar = toolbar;\n\tthis.tools = {};\n\tthis.pressed = null;\n\tthis.autoDisabled = false;\n\tthis.include = config.include || [];\n\tthis.exclude = config.exclude || [];\n\tthis.promote = config.promote || [];\n\tthis.demote = config.demote || [];\n\tthis.onCapturedMouseKeyUpHandler = this.onCapturedMouseKeyUp.bind( this );\n\n\t// Events\n\tthis.$element.on( {\n\t\tmousedown: this.onMouseKeyDown.bind( this ),\n\t\tmouseup: this.onMouseKeyUp.bind( this ),\n\t\tkeydown: this.onMouseKeyDown.bind( this ),\n\t\tkeyup: this.onMouseKeyUp.bind( this ),\n\t\tfocus: this.onMouseOverFocus.bind( this ),\n\t\tblur: this.onMouseOutBlur.bind( this ),\n\t\tmouseover: this.onMouseOverFocus.bind( this ),\n\t\tmouseout: this.onMouseOutBlur.bind( this )\n\t} );\n\tthis.toolbar.getToolFactory().connect( this, { register: 'onToolFactoryRegister' } );\n\tthis.aggregate( { disable: 'itemDisable' } );\n\tthis.connect( this, { itemDisable: 'updateDisabled' } );\n\n\t// Initialization\n\tthis.$group.addClass( 'oo-ui-toolGroup-tools' );\n\tthis.$element\n\t\t.addClass( 'oo-ui-toolGroup' )\n\t\t.append( this.$group );\n\tthis.populate();\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToolGroup, OO.ui.Widget );\nOO.mixinClass( OO.ui.ToolGroup, OO.ui.mixin.GroupElement );\n\n/* Events */\n\n/**\n * @event update\n */\n\n/* Static Properties */\n\n/**\n * Show labels in tooltips.\n *\n * @static\n * @inheritable\n * @property {boolean}\n */\nOO.ui.ToolGroup.static.titleTooltips = false;\n\n/**\n * Show acceleration labels in tooltips.\n *\n * Note: The OOjs UI library does not include an accelerator system, but does contain\n * a hook for one. To use an accelerator system, subclass the {@link OO.ui.Toolbar toolbar} and\n * override the {@link OO.ui.Toolbar#getToolAccelerator getToolAccelerator} method, which is\n * meant to return a label that describes the accelerator keys for a given tool (e.g., 'Ctrl + M').\n *\n * @static\n * @inheritable\n * @property {boolean}\n */\nOO.ui.ToolGroup.static.accelTooltips = false;\n\n/**\n * Automatically disable the toolgroup when all tools are disabled\n *\n * @static\n * @inheritable\n * @property {boolean}\n */\nOO.ui.ToolGroup.static.autoDisable = true;\n\n/**\n * @abstract\n * @static\n * @inheritable\n * @property {string}\n */\nOO.ui.ToolGroup.static.name = null;\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.ToolGroup.prototype.isDisabled = function () {\n\treturn this.autoDisabled || OO.ui.ToolGroup.parent.prototype.isDisabled.apply( this, arguments );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ToolGroup.prototype.updateDisabled = function () {\n\tvar i, item, allDisabled = true;\n\n\tif ( this.constructor.static.autoDisable ) {\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\titem = this.items[ i ];\n\t\t\tif ( !item.isDisabled() ) {\n\t\t\t\tallDisabled = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.autoDisabled = allDisabled;\n\t}\n\tOO.ui.ToolGroup.parent.prototype.updateDisabled.apply( this, arguments );\n};\n\n/**\n * Handle mouse down and key down events.\n *\n * @protected\n * @param {jQuery.Event} e Mouse down or key down event\n */\nOO.ui.ToolGroup.prototype.onMouseKeyDown = function ( e ) {\n\tif (\n\t\t!this.isDisabled() &&\n\t\t( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )\n\t) {\n\t\tthis.pressed = this.getTargetTool( e );\n\t\tif ( this.pressed ) {\n\t\t\tthis.pressed.setActive( true );\n\t\t\tthis.getElementDocument().addEventListener( 'mouseup', this.onCapturedMouseKeyUpHandler, true );\n\t\t\tthis.getElementDocument().addEventListener( 'keyup', this.onCapturedMouseKeyUpHandler, true );\n\t\t}\n\t\treturn false;\n\t}\n};\n\n/**\n * Handle captured mouse up and key up events.\n *\n * @protected\n * @param {MouseEvent|KeyboardEvent} e Mouse up or key up event\n */\nOO.ui.ToolGroup.prototype.onCapturedMouseKeyUp = function ( e ) {\n\tthis.getElementDocument().removeEventListener( 'mouseup', this.onCapturedMouseKeyUpHandler, true );\n\tthis.getElementDocument().removeEventListener( 'keyup', this.onCapturedMouseKeyUpHandler, true );\n\t// onMouseKeyUp may be called a second time, depending on where the mouse is when the button is\n\t// released, but since `this.pressed` will no longer be true, the second call will be ignored.\n\tthis.onMouseKeyUp( e );\n};\n\n/**\n * Handle mouse up and key up events.\n *\n * @protected\n * @param {MouseEvent|KeyboardEvent} e Mouse up or key up event\n */\nOO.ui.ToolGroup.prototype.onMouseKeyUp = function ( e ) {\n\tvar tool = this.getTargetTool( e );\n\n\tif (\n\t\t!this.isDisabled() && this.pressed && this.pressed === tool &&\n\t\t( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )\n\t) {\n\t\tthis.pressed.onSelect();\n\t\tthis.pressed = null;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t}\n\n\tthis.pressed = null;\n};\n\n/**\n * Handle mouse over and focus events.\n *\n * @protected\n * @param {jQuery.Event} e Mouse over or focus event\n */\nOO.ui.ToolGroup.prototype.onMouseOverFocus = function ( e ) {\n\tvar tool = this.getTargetTool( e );\n\n\tif ( this.pressed && this.pressed === tool ) {\n\t\tthis.pressed.setActive( true );\n\t}\n};\n\n/**\n * Handle mouse out and blur events.\n *\n * @protected\n * @param {jQuery.Event} e Mouse out or blur event\n */\nOO.ui.ToolGroup.prototype.onMouseOutBlur = function ( e ) {\n\tvar tool = this.getTargetTool( e );\n\n\tif ( this.pressed && this.pressed === tool ) {\n\t\tthis.pressed.setActive( false );\n\t}\n};\n\n/**\n * Get the closest tool to a jQuery.Event.\n *\n * Only tool links are considered, which prevents other elements in the tool such as popups from\n * triggering tool group interactions.\n *\n * @private\n * @param {jQuery.Event} e\n * @return {OO.ui.Tool|null} Tool, `null` if none was found\n */\nOO.ui.ToolGroup.prototype.getTargetTool = function ( e ) {\n\tvar tool,\n\t\t$item = $( e.target ).closest( '.oo-ui-tool-link' );\n\n\tif ( $item.length ) {\n\t\ttool = $item.parent().data( 'oo-ui-tool' );\n\t}\n\n\treturn tool && !tool.isDisabled() ? tool : null;\n};\n\n/**\n * Handle tool registry register events.\n *\n * If a tool is registered after the group is created, we must repopulate the list to account for:\n *\n * - a tool being added that may be included\n * - a tool already included being overridden\n *\n * @protected\n * @param {string} name Symbolic name of tool\n */\nOO.ui.ToolGroup.prototype.onToolFactoryRegister = function () {\n\tthis.populate();\n};\n\n/**\n * Get the toolbar that contains the toolgroup.\n *\n * @return {OO.ui.Toolbar} Toolbar that contains the toolgroup\n */\nOO.ui.ToolGroup.prototype.getToolbar = function () {\n\treturn this.toolbar;\n};\n\n/**\n * Add and remove tools based on configuration.\n */\nOO.ui.ToolGroup.prototype.populate = function () {\n\tvar i, len, name, tool,\n\t\ttoolFactory = this.toolbar.getToolFactory(),\n\t\tnames = {},\n\t\tadd = [],\n\t\tremove = [],\n\t\tlist = this.toolbar.getToolFactory().getTools(\n\t\t\tthis.include, this.exclude, this.promote, this.demote\n\t\t);\n\n\t// Build a list of needed tools\n\tfor ( i = 0, len = list.length; i < len; i++ ) {\n\t\tname = list[ i ];\n\t\tif (\n\t\t\t// Tool exists\n\t\t\ttoolFactory.lookup( name ) &&\n\t\t\t// Tool is available or is already in this group\n\t\t\t( this.toolbar.isToolAvailable( name ) || this.tools[ name ] )\n\t\t) {\n\t\t\t// Hack to prevent infinite recursion via ToolGroupTool. We need to reserve the tool before\n\t\t\t// creating it, but we can't call reserveTool() yet because we haven't created the tool.\n\t\t\tthis.toolbar.tools[ name ] = true;\n\t\t\ttool = this.tools[ name ];\n\t\t\tif ( !tool ) {\n\t\t\t\t// Auto-initialize tools on first use\n\t\t\t\tthis.tools[ name ] = tool = toolFactory.create( name, this );\n\t\t\t\ttool.updateTitle();\n\t\t\t}\n\t\t\tthis.toolbar.reserveTool( tool );\n\t\t\tadd.push( tool );\n\t\t\tnames[ name ] = true;\n\t\t}\n\t}\n\t// Remove tools that are no longer needed\n\tfor ( name in this.tools ) {\n\t\tif ( !names[ name ] ) {\n\t\t\tthis.tools[ name ].destroy();\n\t\t\tthis.toolbar.releaseTool( this.tools[ name ] );\n\t\t\tremove.push( this.tools[ name ] );\n\t\t\tdelete this.tools[ name ];\n\t\t}\n\t}\n\tif ( remove.length ) {\n\t\tthis.removeItems( remove );\n\t}\n\t// Update emptiness state\n\tif ( add.length ) {\n\t\tthis.$element.removeClass( 'oo-ui-toolGroup-empty' );\n\t} else {\n\t\tthis.$element.addClass( 'oo-ui-toolGroup-empty' );\n\t}\n\t// Re-add tools (moving existing ones to new locations)\n\tthis.addItems( add );\n\t// Disabled state may depend on items\n\tthis.updateDisabled();\n};\n\n/**\n * Destroy toolgroup.\n */\nOO.ui.ToolGroup.prototype.destroy = function () {\n\tvar name;\n\n\tthis.clearItems();\n\tthis.toolbar.getToolFactory().disconnect( this );\n\tfor ( name in this.tools ) {\n\t\tthis.toolbar.releaseTool( this.tools[ name ] );\n\t\tthis.tools[ name ].disconnect( this ).destroy();\n\t\tdelete this.tools[ name ];\n\t}\n\tthis.$element.remove();\n};\n","/**\n * A ToolFactory creates tools on demand. All tools ({@link OO.ui.Tool Tools}, {@link OO.ui.PopupTool PopupTools},\n * and {@link OO.ui.ToolGroupTool ToolGroupTools}) must be registered with a tool factory. Tools are\n * registered by their symbolic name. See {@link OO.ui.Toolbar toolbars} for an example.\n *\n * For more information about toolbars in general, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Toolbars\n *\n * @class\n * @extends OO.Factory\n * @constructor\n */\nOO.ui.ToolFactory = function OoUiToolFactory() {\n\t// Parent constructor\n\tOO.ui.ToolFactory.parent.call( this );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToolFactory, OO.Factory );\n\n/* Methods */\n\n/**\n * Get tools from the factory\n *\n * @param {Array|string} [include] Included tools, see #extract for format\n * @param {Array|string} [exclude] Excluded tools, see #extract for format\n * @param {Array|string} [promote] Promoted tools, see #extract for format\n * @param {Array|string} [demote] Demoted tools, see #extract for format\n * @return {string[]} List of tools\n */\nOO.ui.ToolFactory.prototype.getTools = function ( include, exclude, promote, demote ) {\n\tvar i, len, included, promoted, demoted,\n\t\tauto = [],\n\t\tused = {};\n\n\t// Collect included and not excluded tools\n\tincluded = OO.simpleArrayDifference( this.extract( include ), this.extract( exclude ) );\n\n\t// Promotion\n\tpromoted = this.extract( promote, used );\n\tdemoted = this.extract( demote, used );\n\n\t// Auto\n\tfor ( i = 0, len = included.length; i < len; i++ ) {\n\t\tif ( !used[ included[ i ] ] ) {\n\t\t\tauto.push( included[ i ] );\n\t\t}\n\t}\n\n\treturn promoted.concat( auto ).concat( demoted );\n};\n\n/**\n * Get a flat list of names from a list of names or groups.\n *\n * Normally, `collection` is an array of tool specifications. Tools can be specified in the\n * following ways:\n *\n * - To include an individual tool, use the symbolic name: `{ name: 'tool-name' }` or `'tool-name'`.\n * - To include all tools in a group, use the group name: `{ group: 'group-name' }`. (To assign the\n *   tool to a group, use OO.ui.Tool.static.group.)\n *\n * Alternatively, to include all tools that are not yet assigned to any other toolgroup, use the\n * catch-all selector `'*'`.\n *\n * If `used` is passed, tool names that appear as properties in this object will be considered\n * already assigned, and will not be returned even if specified otherwise. The tool names extracted\n * by this function call will be added as new properties in the object.\n *\n * @private\n * @param {Array|string} collection List of tools, see above\n * @param {Object} [used] Object containing information about used tools, see above\n * @return {string[]} List of extracted tool names\n */\nOO.ui.ToolFactory.prototype.extract = function ( collection, used ) {\n\tvar i, len, item, name, tool,\n\t\tnames = [];\n\n\tcollection = !Array.isArray( collection ) ? [ collection ] : collection;\n\n\tfor ( i = 0, len = collection.length; i < len; i++ ) {\n\t\titem = collection[ i ];\n\t\tif ( item === '*' ) {\n\t\t\tfor ( name in this.registry ) {\n\t\t\t\ttool = this.registry[ name ];\n\t\t\t\tif (\n\t\t\t\t\t// Only add tools by group name when auto-add is enabled\n\t\t\t\t\ttool.static.autoAddToCatchall &&\n\t\t\t\t\t// Exclude already used tools\n\t\t\t\t\t( !used || !used[ name ] )\n\t\t\t\t) {\n\t\t\t\t\tnames.push( name );\n\t\t\t\t\tif ( used ) {\n\t\t\t\t\t\tused[ name ] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Allow plain strings as shorthand for named tools\n\t\t\tif ( typeof item === 'string' ) {\n\t\t\t\titem = { name: item };\n\t\t\t}\n\t\t\tif ( OO.isPlainObject( item ) ) {\n\t\t\t\tif ( item.group ) {\n\t\t\t\t\tfor ( name in this.registry ) {\n\t\t\t\t\t\ttool = this.registry[ name ];\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t// Include tools with matching group\n\t\t\t\t\t\t\ttool.static.group === item.group &&\n\t\t\t\t\t\t\t// Only add tools by group name when auto-add is enabled\n\t\t\t\t\t\t\ttool.static.autoAddToGroup &&\n\t\t\t\t\t\t\t// Exclude already used tools\n\t\t\t\t\t\t\t( !used || !used[ name ] )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnames.push( name );\n\t\t\t\t\t\t\tif ( used ) {\n\t\t\t\t\t\t\t\tused[ name ] = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t// Include tools with matching name and exclude already used tools\n\t\t\t\t} else if ( item.name && ( !used || !used[ item.name ] ) ) {\n\t\t\t\t\tnames.push( item.name );\n\t\t\t\t\tif ( used ) {\n\t\t\t\t\t\tused[ item.name ] = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn names;\n};\n","/**\n * ToolGroupFactories create {@link OO.ui.ToolGroup toolgroups} on demand. The toolgroup classes must\n * specify a symbolic name and be registered with the factory. The following classes are registered by\n * default:\n *\n * - {@link OO.ui.BarToolGroup BarToolGroups} (‘bar’)\n * - {@link OO.ui.MenuToolGroup MenuToolGroups} (‘menu’)\n * - {@link OO.ui.ListToolGroup ListToolGroups} (‘list’)\n *\n * See {@link OO.ui.Toolbar toolbars} for an example.\n *\n * For more information about toolbars in general, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Toolbars\n *\n * @class\n * @extends OO.Factory\n * @constructor\n */\nOO.ui.ToolGroupFactory = function OoUiToolGroupFactory() {\n\tvar i, l, defaultClasses;\n\t// Parent constructor\n\tOO.Factory.call( this );\n\n\tdefaultClasses = this.constructor.static.getDefaultClasses();\n\n\t// Register default toolgroups\n\tfor ( i = 0, l = defaultClasses.length; i < l; i++ ) {\n\t\tthis.register( defaultClasses[ i ] );\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToolGroupFactory, OO.Factory );\n\n/* Static Methods */\n\n/**\n * Get a default set of classes to be registered on construction.\n *\n * @return {Function[]} Default classes\n */\nOO.ui.ToolGroupFactory.static.getDefaultClasses = function () {\n\treturn [\n\t\tOO.ui.BarToolGroup,\n\t\tOO.ui.ListToolGroup,\n\t\tOO.ui.MenuToolGroup\n\t];\n};\n","/**\n * Popup tools open a popup window when they are selected from the {@link OO.ui.Toolbar toolbar}. Each popup tool is configured\n * with a static name, title, and icon, as well with as any popup configurations. Unlike other tools, popup tools do not require that developers specify\n * an #onSelect or #onUpdateState method, as these methods have been implemented already.\n *\n *     // Example of a popup tool. When selected, a popup tool displays\n *     // a popup window.\n *     function HelpTool( toolGroup, config ) {\n *        OO.ui.PopupTool.call( this, toolGroup, $.extend( { popup: {\n *            padded: true,\n *            label: 'Help',\n *            head: true\n *        } }, config ) );\n *        this.popup.$body.append( '<p>I am helpful!</p>' );\n *     };\n *     OO.inheritClass( HelpTool, OO.ui.PopupTool );\n *     HelpTool.static.name = 'help';\n *     HelpTool.static.icon = 'help';\n *     HelpTool.static.title = 'Help';\n *     toolFactory.register( HelpTool );\n *\n * For an example of a toolbar that contains a popup tool, see {@link OO.ui.Toolbar toolbars}. For more information about\n * toolbars in genreral, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Toolbars\n *\n * @abstract\n * @class\n * @extends OO.ui.Tool\n * @mixins OO.ui.mixin.PopupElement\n *\n * @constructor\n * @param {OO.ui.ToolGroup} toolGroup\n * @param {Object} [config] Configuration options\n */\nOO.ui.PopupTool = function OoUiPopupTool( toolGroup, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( toolGroup ) && config === undefined ) {\n\t\tconfig = toolGroup;\n\t\ttoolGroup = config.toolGroup;\n\t}\n\n\t// Parent constructor\n\tOO.ui.PopupTool.parent.call( this, toolGroup, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.PopupElement.call( this, config );\n\n\t// Initialization\n\tthis.popup.setPosition( toolGroup.getToolbar().position === 'bottom' ? 'above' : 'below' );\n\tthis.$element\n\t\t.addClass( 'oo-ui-popupTool' )\n\t\t.append( this.popup.$element );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.PopupTool, OO.ui.Tool );\nOO.mixinClass( OO.ui.PopupTool, OO.ui.mixin.PopupElement );\n\n/* Methods */\n\n/**\n * Handle the tool being selected.\n *\n * @inheritdoc\n */\nOO.ui.PopupTool.prototype.onSelect = function () {\n\tif ( !this.isDisabled() ) {\n\t\tthis.popup.toggle();\n\t}\n\tthis.setActive( false );\n\treturn false;\n};\n\n/**\n * Handle the toolbar state being updated.\n *\n * @inheritdoc\n */\nOO.ui.PopupTool.prototype.onUpdateState = function () {\n\tthis.setActive( false );\n};\n","/**\n * A ToolGroupTool is a special sort of tool that can contain other {@link OO.ui.Tool tools}\n * and {@link OO.ui.ToolGroup toolgroups}. The ToolGroupTool was specifically designed to be used\n * inside a {@link OO.ui.BarToolGroup bar} toolgroup to provide access to additional tools from\n * the bar item. Included tools will be displayed in a dropdown {@link OO.ui.ListToolGroup list}\n * when the ToolGroupTool is selected.\n *\n *     // Example: ToolGroupTool with two nested tools, 'setting1' and 'setting2', defined elsewhere.\n *\n *     function SettingsTool() {\n *         SettingsTool.parent.apply( this, arguments );\n *     };\n *     OO.inheritClass( SettingsTool, OO.ui.ToolGroupTool );\n *     SettingsTool.static.name = 'settings';\n *     SettingsTool.static.title = 'Change settings';\n *     SettingsTool.static.groupConfig = {\n *         icon: 'settings',\n *         label: 'ToolGroupTool',\n *         include: [  'setting1', 'setting2'  ]\n *     };\n *     toolFactory.register( SettingsTool );\n *\n * For more information, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * Please note that this implementation is subject to change per [T74159] [2].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Toolbars#ToolGroupTool\n * [2]: https://phabricator.wikimedia.org/T74159\n *\n * @abstract\n * @class\n * @extends OO.ui.Tool\n *\n * @constructor\n * @param {OO.ui.ToolGroup} toolGroup\n * @param {Object} [config] Configuration options\n */\nOO.ui.ToolGroupTool = function OoUiToolGroupTool( toolGroup, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( toolGroup ) && config === undefined ) {\n\t\tconfig = toolGroup;\n\t\ttoolGroup = config.toolGroup;\n\t}\n\n\t// Parent constructor\n\tOO.ui.ToolGroupTool.parent.call( this, toolGroup, config );\n\n\t// Properties\n\tthis.innerToolGroup = this.createGroup( this.constructor.static.groupConfig );\n\n\t// Events\n\tthis.innerToolGroup.connect( this, { disable: 'onToolGroupDisable' } );\n\n\t// Initialization\n\tthis.$link.remove();\n\tthis.$element\n\t\t.addClass( 'oo-ui-toolGroupTool' )\n\t\t.append( this.innerToolGroup.$element );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToolGroupTool, OO.ui.Tool );\n\n/* Static Properties */\n\n/**\n * Toolgroup configuration.\n *\n * The toolgroup configuration consists of the tools to include, as well as an icon and label\n * to use for the bar item. Tools can be included by symbolic name, group, or with the\n * wildcard selector. Please see {@link OO.ui.ToolGroup toolgroup} for more information.\n *\n * @property {Object.<string,Array>}\n */\nOO.ui.ToolGroupTool.static.groupConfig = {};\n\n/* Methods */\n\n/**\n * Handle the tool being selected.\n *\n * @inheritdoc\n */\nOO.ui.ToolGroupTool.prototype.onSelect = function () {\n\tthis.innerToolGroup.setActive( !this.innerToolGroup.active );\n\treturn false;\n};\n\n/**\n * Synchronize disabledness state of the tool with the inner toolgroup.\n *\n * @private\n * @param {boolean} disabled Element is disabled\n */\nOO.ui.ToolGroupTool.prototype.onToolGroupDisable = function ( disabled ) {\n\tthis.setDisabled( disabled );\n};\n\n/**\n * Handle the toolbar state being updated.\n *\n * @inheritdoc\n */\nOO.ui.ToolGroupTool.prototype.onUpdateState = function () {\n\tthis.setActive( false );\n};\n\n/**\n * Build a {@link OO.ui.ToolGroup toolgroup} from the specified configuration.\n *\n * @param {Object.<string,Array>} group Toolgroup configuration. Please see {@link OO.ui.ToolGroup toolgroup} for\n *  more information.\n * @return {OO.ui.ListToolGroup}\n */\nOO.ui.ToolGroupTool.prototype.createGroup = function ( group ) {\n\tif ( group.include === '*' ) {\n\t\t// Apply defaults to catch-all groups\n\t\tif ( group.label === undefined ) {\n\t\t\tgroup.label = OO.ui.msg( 'ooui-toolbar-more' );\n\t\t}\n\t}\n\n\treturn this.toolbar.getToolGroupFactory().create( 'list', this.toolbar, group );\n};\n","/**\n * BarToolGroups are one of three types of {@link OO.ui.ToolGroup toolgroups} that are used to\n * create {@link OO.ui.Toolbar toolbars} (the other types of groups are {@link OO.ui.MenuToolGroup MenuToolGroup}\n * and {@link OO.ui.ListToolGroup ListToolGroup}). The {@link OO.ui.Tool tools} in a BarToolGroup are\n * displayed by icon in a single row. The title of the tool is displayed when users move the mouse over\n * the tool.\n *\n * BarToolGroups are created by a {@link OO.ui.ToolGroupFactory tool group factory} when the toolbar is\n * set up.\n *\n *     @example\n *     // Example of a BarToolGroup with two tools\n *     var toolFactory = new OO.ui.ToolFactory();\n *     var toolGroupFactory = new OO.ui.ToolGroupFactory();\n *     var toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory );\n *\n *     // We will be placing status text in this element when tools are used\n *     var $area = $( '<p>' ).text( 'Example of a BarToolGroup with two tools.' );\n *\n *     // Define the tools that we're going to place in our toolbar\n *\n *     // Create a class inheriting from OO.ui.Tool\n *     function SearchTool() {\n *         SearchTool.parent.apply( this, arguments );\n *     }\n *     OO.inheritClass( SearchTool, OO.ui.Tool );\n *     // Each tool must have a 'name' (used as an internal identifier, see later) and at least one\n *     // of 'icon' and 'title' (displayed icon and text).\n *     SearchTool.static.name = 'search';\n *     SearchTool.static.icon = 'search';\n *     SearchTool.static.title = 'Search...';\n *     // Defines the action that will happen when this tool is selected (clicked).\n *     SearchTool.prototype.onSelect = function () {\n *         $area.text( 'Search tool clicked!' );\n *         // Never display this tool as \"active\" (selected).\n *         this.setActive( false );\n *     };\n *     SearchTool.prototype.onUpdateState = function () {};\n *     // Make this tool available in our toolFactory and thus our toolbar\n *     toolFactory.register( SearchTool );\n *\n *     // This is a PopupTool. Rather than having a custom 'onSelect' action, it will display a\n *     // little popup window (a PopupWidget).\n *     function HelpTool( toolGroup, config ) {\n *         OO.ui.PopupTool.call( this, toolGroup, $.extend( { popup: {\n *             padded: true,\n *             label: 'Help',\n *             head: true\n *         } }, config ) );\n *         this.popup.$body.append( '<p>I am helpful!</p>' );\n *     }\n *     OO.inheritClass( HelpTool, OO.ui.PopupTool );\n *     HelpTool.static.name = 'help';\n *     HelpTool.static.icon = 'help';\n *     HelpTool.static.title = 'Help';\n *     toolFactory.register( HelpTool );\n *\n *     // Finally define which tools and in what order appear in the toolbar. Each tool may only be\n *     // used once (but not all defined tools must be used).\n *     toolbar.setup( [\n *         {\n *             // 'bar' tool groups display tools by icon only\n *             type: 'bar',\n *             include: [ 'search', 'help' ]\n *         }\n *     ] );\n *\n *     // Create some UI around the toolbar and place it in the document\n *     var frame = new OO.ui.PanelLayout( {\n *         expanded: false,\n *         framed: true\n *     } );\n *     var contentFrame = new OO.ui.PanelLayout( {\n *         expanded: false,\n *         padded: true\n *     } );\n *     frame.$element.append(\n *         toolbar.$element,\n *         contentFrame.$element.append( $area )\n *     );\n *     $( 'body' ).append( frame.$element );\n *\n *     // Here is where the toolbar is actually built. This must be done after inserting it into the\n *     // document.\n *     toolbar.initialize();\n *\n * For more information about how to add tools to a bar tool group, please see {@link OO.ui.ToolGroup toolgroup}.\n * For more information about toolbars in general, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Toolbars\n *\n * @class\n * @extends OO.ui.ToolGroup\n *\n * @constructor\n * @param {OO.ui.Toolbar} toolbar\n * @param {Object} [config] Configuration options\n */\nOO.ui.BarToolGroup = function OoUiBarToolGroup( toolbar, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( toolbar ) && config === undefined ) {\n\t\tconfig = toolbar;\n\t\ttoolbar = config.toolbar;\n\t}\n\n\t// Parent constructor\n\tOO.ui.BarToolGroup.parent.call( this, toolbar, config );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-barToolGroup' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.BarToolGroup, OO.ui.ToolGroup );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.BarToolGroup.static.titleTooltips = true;\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.BarToolGroup.static.accelTooltips = true;\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.BarToolGroup.static.name = 'bar';\n","/**\n * PopupToolGroup is an abstract base class used by both {@link OO.ui.MenuToolGroup MenuToolGroup}\n * and {@link OO.ui.ListToolGroup ListToolGroup} to provide a popup--an overlaid menu or list of tools with an\n * optional icon and label. This class can be used for other base classes that also use this functionality.\n *\n * @abstract\n * @class\n * @extends OO.ui.ToolGroup\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.TitledElement\n * @mixins OO.ui.mixin.FlaggedElement\n * @mixins OO.ui.mixin.ClippableElement\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {OO.ui.Toolbar} toolbar\n * @param {Object} [config] Configuration options\n * @cfg {string} [header] Text to display at the top of the popup\n */\nOO.ui.PopupToolGroup = function OoUiPopupToolGroup( toolbar, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( toolbar ) && config === undefined ) {\n\t\tconfig = toolbar;\n\t\ttoolbar = config.toolbar;\n\t}\n\n\t// Configuration initialization\n\tconfig = $.extend( {\n\t\tindicator: config.indicator === undefined ? ( toolbar.position === 'bottom' ? 'up' : 'down' ) : config.indicator\n\t}, config );\n\n\t// Parent constructor\n\tOO.ui.PopupToolGroup.parent.call( this, toolbar, config );\n\n\t// Properties\n\tthis.active = false;\n\tthis.dragging = false;\n\tthis.onBlurHandler = this.onBlur.bind( this );\n\tthis.$handle = $( '<span>' );\n\n\t// Mixin constructors\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\tOO.ui.mixin.TitledElement.call( this, config );\n\tOO.ui.mixin.FlaggedElement.call( this, config );\n\tOO.ui.mixin.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );\n\tOO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$handle } ) );\n\n\t// Events\n\tthis.$handle.on( {\n\t\tkeydown: this.onHandleMouseKeyDown.bind( this ),\n\t\tkeyup: this.onHandleMouseKeyUp.bind( this ),\n\t\tmousedown: this.onHandleMouseKeyDown.bind( this ),\n\t\tmouseup: this.onHandleMouseKeyUp.bind( this )\n\t} );\n\n\t// Initialization\n\tthis.$handle\n\t\t.addClass( 'oo-ui-popupToolGroup-handle' )\n\t\t.attr( 'role', 'button' )\n\t\t.append( this.$icon, this.$label, this.$indicator );\n\t// If the pop-up should have a header, add it to the top of the toolGroup.\n\t// Note: If this feature is useful for other widgets, we could abstract it into an\n\t// OO.ui.HeaderedElement mixin constructor.\n\tif ( config.header !== undefined ) {\n\t\tthis.$group\n\t\t\t.prepend( $( '<span>' )\n\t\t\t\t.addClass( 'oo-ui-popupToolGroup-header' )\n\t\t\t\t.text( config.header )\n\t\t\t);\n\t}\n\tthis.$element\n\t\t.addClass( 'oo-ui-popupToolGroup' )\n\t\t.prepend( this.$handle );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.PopupToolGroup, OO.ui.ToolGroup );\nOO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.TitledElement );\nOO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.FlaggedElement );\nOO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.ClippableElement );\nOO.mixinClass( OO.ui.PopupToolGroup, OO.ui.mixin.TabIndexedElement );\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.PopupToolGroup.prototype.setDisabled = function () {\n\t// Parent method\n\tOO.ui.PopupToolGroup.parent.prototype.setDisabled.apply( this, arguments );\n\n\tif ( this.isDisabled() && this.isElementAttached() ) {\n\t\tthis.setActive( false );\n\t}\n};\n\n/**\n * Handle focus being lost.\n *\n * The event is actually generated from a mouseup/keyup, so it is not a normal blur event object.\n *\n * @protected\n * @param {MouseEvent|KeyboardEvent} e Mouse up or key up event\n */\nOO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {\n\t// Only deactivate when clicking outside the dropdown element\n\tif ( $( e.target ).closest( '.oo-ui-popupToolGroup' )[ 0 ] !== this.$element[ 0 ] ) {\n\t\tthis.setActive( false );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.PopupToolGroup.prototype.onMouseKeyUp = function ( e ) {\n\t// Only close toolgroup when a tool was actually selected\n\tif (\n\t\t!this.isDisabled() && this.pressed && this.pressed === this.getTargetTool( e ) &&\n\t\t( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )\n\t) {\n\t\tthis.setActive( false );\n\t}\n\treturn OO.ui.PopupToolGroup.parent.prototype.onMouseKeyUp.call( this, e );\n};\n\n/**\n * Handle mouse up and key up events.\n *\n * @protected\n * @param {jQuery.Event} e Mouse up or key up event\n */\nOO.ui.PopupToolGroup.prototype.onHandleMouseKeyUp = function ( e ) {\n\tif (\n\t\t!this.isDisabled() &&\n\t\t( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )\n\t) {\n\t\treturn false;\n\t}\n};\n\n/**\n * Handle mouse down and key down events.\n *\n * @protected\n * @param {jQuery.Event} e Mouse down or key down event\n */\nOO.ui.PopupToolGroup.prototype.onHandleMouseKeyDown = function ( e ) {\n\tif (\n\t\t!this.isDisabled() &&\n\t\t( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )\n\t) {\n\t\tthis.setActive( !this.active );\n\t\treturn false;\n\t}\n};\n\n/**\n * Switch into 'active' mode.\n *\n * When active, the popup is visible. A mouseup event anywhere in the document will trigger\n * deactivation.\n *\n * @param {boolean} value The active state to set\n */\nOO.ui.PopupToolGroup.prototype.setActive = function ( value ) {\n\tvar containerWidth, containerLeft;\n\tvalue = !!value;\n\tif ( this.active !== value ) {\n\t\tthis.active = value;\n\t\tif ( value ) {\n\t\t\tthis.getElementDocument().addEventListener( 'mouseup', this.onBlurHandler, true );\n\t\t\tthis.getElementDocument().addEventListener( 'keyup', this.onBlurHandler, true );\n\n\t\t\tthis.$clippable.css( 'left', '' );\n\t\t\t// Try anchoring the popup to the left first\n\t\t\tthis.$element.addClass( 'oo-ui-popupToolGroup-active oo-ui-popupToolGroup-left' );\n\t\t\tthis.toggleClipping( true );\n\t\t\tif ( this.isClippedHorizontally() ) {\n\t\t\t\t// Anchoring to the left caused the popup to clip, so anchor it to the right instead\n\t\t\t\tthis.toggleClipping( false );\n\t\t\t\tthis.$element\n\t\t\t\t\t.removeClass( 'oo-ui-popupToolGroup-left' )\n\t\t\t\t\t.addClass( 'oo-ui-popupToolGroup-right' );\n\t\t\t\tthis.toggleClipping( true );\n\t\t\t}\n\t\t\tif ( this.isClippedHorizontally() ) {\n\t\t\t\t// Anchoring to the right also caused the popup to clip, so just make it fill the container\n\t\t\t\tcontainerWidth = this.$clippableScrollableContainer.width();\n\t\t\t\tcontainerLeft = this.$clippableScrollableContainer.offset().left;\n\n\t\t\t\tthis.toggleClipping( false );\n\t\t\t\tthis.$element.removeClass( 'oo-ui-popupToolGroup-right' );\n\n\t\t\t\tthis.$clippable.css( {\n\t\t\t\t\tleft: -( this.$element.offset().left - containerLeft ),\n\t\t\t\t\twidth: containerWidth\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.getElementDocument().removeEventListener( 'mouseup', this.onBlurHandler, true );\n\t\t\tthis.getElementDocument().removeEventListener( 'keyup', this.onBlurHandler, true );\n\t\t\tthis.$element.removeClass(\n\t\t\t\t'oo-ui-popupToolGroup-active oo-ui-popupToolGroup-left  oo-ui-popupToolGroup-right'\n\t\t\t);\n\t\t\tthis.toggleClipping( false );\n\t\t}\n\t}\n};\n","/**\n * ListToolGroups are one of three types of {@link OO.ui.ToolGroup toolgroups} that are used to\n * create {@link OO.ui.Toolbar toolbars} (the other types of groups are {@link OO.ui.MenuToolGroup MenuToolGroup}\n * and {@link OO.ui.BarToolGroup BarToolGroup}). The {@link OO.ui.Tool tools} in a ListToolGroup are displayed\n * by label in a dropdown menu. The title of the tool is used as the label text. The menu itself can be configured\n * with a label, icon, indicator, header, and title.\n *\n * ListToolGroups can be configured to be expanded and collapsed. Collapsed lists will have a ‘More’ option that\n * users can select to see the full list of tools. If a collapsed toolgroup is expanded, a ‘Fewer’ option permits\n * users to collapse the list again.\n *\n * ListToolGroups are created by a {@link OO.ui.ToolGroupFactory toolgroup factory} when the toolbar is set up. The factory\n * requires the ListToolGroup's symbolic name, 'list', which is specified along with the other configurations. For more\n * information about how to add tools to a ListToolGroup, please see {@link OO.ui.ToolGroup toolgroup}.\n *\n *     @example\n *     // Example of a ListToolGroup\n *     var toolFactory = new OO.ui.ToolFactory();\n *     var toolGroupFactory = new OO.ui.ToolGroupFactory();\n *     var toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory );\n *\n *     // Configure and register two tools\n *     function SettingsTool() {\n *         SettingsTool.parent.apply( this, arguments );\n *     }\n *     OO.inheritClass( SettingsTool, OO.ui.Tool );\n *     SettingsTool.static.name = 'settings';\n *     SettingsTool.static.icon = 'settings';\n *     SettingsTool.static.title = 'Change settings';\n *     SettingsTool.prototype.onSelect = function () {\n *         this.setActive( false );\n *     };\n *     SettingsTool.prototype.onUpdateState = function () {};\n *     toolFactory.register( SettingsTool );\n *     // Register two more tools, nothing interesting here\n *     function StuffTool() {\n *         StuffTool.parent.apply( this, arguments );\n *     }\n *     OO.inheritClass( StuffTool, OO.ui.Tool );\n *     StuffTool.static.name = 'stuff';\n *     StuffTool.static.icon = 'search';\n *     StuffTool.static.title = 'Change the world';\n *     StuffTool.prototype.onSelect = function () {\n *         this.setActive( false );\n *     };\n *     StuffTool.prototype.onUpdateState = function () {};\n *     toolFactory.register( StuffTool );\n *     toolbar.setup( [\n *         {\n *             // Configurations for list toolgroup.\n *             type: 'list',\n *             label: 'ListToolGroup',\n *             icon: 'ellipsis',\n *             title: 'This is the title, displayed when user moves the mouse over the list toolgroup',\n *             header: 'This is the header',\n *             include: [ 'settings', 'stuff' ],\n *             allowCollapse: ['stuff']\n *         }\n *     ] );\n *\n *     // Create some UI around the toolbar and place it in the document\n *     var frame = new OO.ui.PanelLayout( {\n *         expanded: false,\n *         framed: true\n *     } );\n *     frame.$element.append(\n *         toolbar.$element\n *     );\n *     $( 'body' ).append( frame.$element );\n *     // Build the toolbar. This must be done after the toolbar has been appended to the document.\n *     toolbar.initialize();\n *\n * For more information about toolbars in general, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Toolbars\n *\n * @class\n * @extends OO.ui.PopupToolGroup\n *\n * @constructor\n * @param {OO.ui.Toolbar} toolbar\n * @param {Object} [config] Configuration options\n * @cfg {Array} [allowCollapse] Allow the specified tools to be collapsed. By default, collapsible tools\n *  will only be displayed if users click the ‘More’ option displayed at the bottom of the list. If\n *  the list is expanded, a ‘Fewer’ option permits users to collapse the list again. Any tools that\n *  are included in the toolgroup, but are not designated as collapsible, will always be displayed.\n *  To open a collapsible list in its expanded state, set #expanded to 'true'.\n * @cfg {Array} [forceExpand] Expand the specified tools. All other tools will be designated as collapsible.\n *  Unless #expanded is set to true, the collapsible tools will be collapsed when the list is first opened.\n * @cfg {boolean} [expanded=false] Expand collapsible tools. This config is only relevant if tools have\n *  been designated as collapsible. When expanded is set to true, all tools in the group will be displayed\n *  when the list is first opened. Users can collapse the list with a ‘Fewer’ option at the bottom.\n */\nOO.ui.ListToolGroup = function OoUiListToolGroup( toolbar, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( toolbar ) && config === undefined ) {\n\t\tconfig = toolbar;\n\t\ttoolbar = config.toolbar;\n\t}\n\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties (must be set before parent constructor, which calls #populate)\n\tthis.allowCollapse = config.allowCollapse;\n\tthis.forceExpand = config.forceExpand;\n\tthis.expanded = config.expanded !== undefined ? config.expanded : false;\n\tthis.collapsibleTools = [];\n\n\t// Parent constructor\n\tOO.ui.ListToolGroup.parent.call( this, toolbar, config );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-listToolGroup' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ListToolGroup, OO.ui.PopupToolGroup );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.ListToolGroup.static.name = 'list';\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.ListToolGroup.prototype.populate = function () {\n\tvar i, len, allowCollapse = [];\n\n\tOO.ui.ListToolGroup.parent.prototype.populate.call( this );\n\n\t// Update the list of collapsible tools\n\tif ( this.allowCollapse !== undefined ) {\n\t\tallowCollapse = this.allowCollapse;\n\t} else if ( this.forceExpand !== undefined ) {\n\t\tallowCollapse = OO.simpleArrayDifference( Object.keys( this.tools ), this.forceExpand );\n\t}\n\n\tthis.collapsibleTools = [];\n\tfor ( i = 0, len = allowCollapse.length; i < len; i++ ) {\n\t\tif ( this.tools[ allowCollapse[ i ] ] !== undefined ) {\n\t\t\tthis.collapsibleTools.push( this.tools[ allowCollapse[ i ] ] );\n\t\t}\n\t}\n\n\t// Keep at the end, even when tools are added\n\tthis.$group.append( this.getExpandCollapseTool().$element );\n\n\tthis.getExpandCollapseTool().toggle( this.collapsibleTools.length !== 0 );\n\tthis.updateCollapsibleState();\n};\n\n/**\n * Get the expand/collapse tool for this group\n *\n * @return {OO.ui.Tool} Expand collapse tool\n */\nOO.ui.ListToolGroup.prototype.getExpandCollapseTool = function () {\n\tvar ExpandCollapseTool;\n\tif ( this.expandCollapseTool === undefined ) {\n\t\tExpandCollapseTool = function () {\n\t\t\tExpandCollapseTool.parent.apply( this, arguments );\n\t\t};\n\n\t\tOO.inheritClass( ExpandCollapseTool, OO.ui.Tool );\n\n\t\tExpandCollapseTool.prototype.onSelect = function () {\n\t\t\tthis.toolGroup.expanded = !this.toolGroup.expanded;\n\t\t\tthis.toolGroup.updateCollapsibleState();\n\t\t\tthis.setActive( false );\n\t\t};\n\t\tExpandCollapseTool.prototype.onUpdateState = function () {\n\t\t\t// Do nothing. Tool interface requires an implementation of this function.\n\t\t};\n\n\t\tExpandCollapseTool.static.name = 'more-fewer';\n\n\t\tthis.expandCollapseTool = new ExpandCollapseTool( this );\n\t}\n\treturn this.expandCollapseTool;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ListToolGroup.prototype.onMouseKeyUp = function ( e ) {\n\t// Do not close the popup when the user wants to show more/fewer tools\n\tif (\n\t\t$( e.target ).closest( '.oo-ui-tool-name-more-fewer' ).length &&\n\t\t( e.which === OO.ui.MouseButtons.LEFT || e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )\n\t) {\n\t\t// HACK: Prevent the popup list from being hidden. Skip the PopupToolGroup implementation (which\n\t\t// hides the popup list when a tool is selected) and call ToolGroup's implementation directly.\n\t\treturn OO.ui.ListToolGroup.parent.parent.prototype.onMouseKeyUp.call( this, e );\n\t} else {\n\t\treturn OO.ui.ListToolGroup.parent.prototype.onMouseKeyUp.call( this, e );\n\t}\n};\n\nOO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {\n\tvar i, len;\n\n\tthis.getExpandCollapseTool()\n\t\t.setIcon( this.expanded ? 'collapse' : 'expand' )\n\t\t.setTitle( OO.ui.msg( this.expanded ? 'ooui-toolgroup-collapse' : 'ooui-toolgroup-expand' ) );\n\n\tfor ( i = 0, len = this.collapsibleTools.length; i < len; i++ ) {\n\t\tthis.collapsibleTools[ i ].toggle( this.expanded );\n\t}\n\n\t// Re-evaluate clipping, because our height has changed\n\tthis.clip();\n};\n","/**\n * MenuToolGroups are one of three types of {@link OO.ui.ToolGroup toolgroups} that are used to\n * create {@link OO.ui.Toolbar toolbars} (the other types of groups are {@link OO.ui.BarToolGroup BarToolGroup}\n * and {@link OO.ui.ListToolGroup ListToolGroup}). MenuToolGroups contain selectable {@link OO.ui.Tool tools},\n * which are displayed by label in a dropdown menu. The tool's title is used as the label text, and the\n * menu label is updated to reflect which tool or tools are currently selected. If no tools are selected,\n * the menu label is empty. The menu can be configured with an indicator, icon, title, and/or header.\n *\n * MenuToolGroups are created by a {@link OO.ui.ToolGroupFactory tool group factory} when the toolbar\n * is set up.\n *\n *     @example\n *     // Example of a MenuToolGroup\n *     var toolFactory = new OO.ui.ToolFactory();\n *     var toolGroupFactory = new OO.ui.ToolGroupFactory();\n *     var toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory );\n *\n *     // We will be placing status text in this element when tools are used\n *     var $area = $( '<p>' ).text( 'An example of a MenuToolGroup. Select a tool from the dropdown menu.' );\n *\n *     // Define the tools that we're going to place in our toolbar\n *\n *     function SettingsTool() {\n *         SettingsTool.parent.apply( this, arguments );\n *         this.reallyActive = false;\n *     }\n *     OO.inheritClass( SettingsTool, OO.ui.Tool );\n *     SettingsTool.static.name = 'settings';\n *     SettingsTool.static.icon = 'settings';\n *     SettingsTool.static.title = 'Change settings';\n *     SettingsTool.prototype.onSelect = function () {\n *         $area.text( 'Settings tool clicked!' );\n *         // Toggle the active state on each click\n *         this.reallyActive = !this.reallyActive;\n *         this.setActive( this.reallyActive );\n *         // To update the menu label\n *         this.toolbar.emit( 'updateState' );\n *     };\n *     SettingsTool.prototype.onUpdateState = function () {};\n *     toolFactory.register( SettingsTool );\n *\n *     function StuffTool() {\n *         StuffTool.parent.apply( this, arguments );\n *         this.reallyActive = false;\n *     }\n *     OO.inheritClass( StuffTool, OO.ui.Tool );\n *     StuffTool.static.name = 'stuff';\n *     StuffTool.static.icon = 'ellipsis';\n *     StuffTool.static.title = 'More stuff';\n *     StuffTool.prototype.onSelect = function () {\n *         $area.text( 'More stuff tool clicked!' );\n *         // Toggle the active state on each click\n *         this.reallyActive = !this.reallyActive;\n *         this.setActive( this.reallyActive );\n *         // To update the menu label\n *         this.toolbar.emit( 'updateState' );\n *     };\n *     StuffTool.prototype.onUpdateState = function () {};\n *     toolFactory.register( StuffTool );\n *\n *     // Finally define which tools and in what order appear in the toolbar. Each tool may only be\n *     // used once (but not all defined tools must be used).\n *     toolbar.setup( [\n *         {\n *             type: 'menu',\n *             header: 'This is the (optional) header',\n *             title: 'This is the (optional) title',\n *             include: [ 'settings', 'stuff' ]\n *         }\n *     ] );\n *\n *     // Create some UI around the toolbar and place it in the document\n *     var frame = new OO.ui.PanelLayout( {\n *         expanded: false,\n *         framed: true\n *     } );\n *     var contentFrame = new OO.ui.PanelLayout( {\n *         expanded: false,\n *         padded: true\n *     } );\n *     frame.$element.append(\n *         toolbar.$element,\n *         contentFrame.$element.append( $area )\n *     );\n *     $( 'body' ).append( frame.$element );\n *\n *     // Here is where the toolbar is actually built. This must be done after inserting it into the\n *     // document.\n *     toolbar.initialize();\n *     toolbar.emit( 'updateState' );\n *\n * For more information about how to add tools to a MenuToolGroup, please see {@link OO.ui.ToolGroup toolgroup}.\n * For more information about toolbars in general, please see the [OOjs UI documentation on MediaWiki] [1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Toolbars\n *\n * @class\n * @extends OO.ui.PopupToolGroup\n *\n * @constructor\n * @param {OO.ui.Toolbar} toolbar\n * @param {Object} [config] Configuration options\n */\nOO.ui.MenuToolGroup = function OoUiMenuToolGroup( toolbar, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( toolbar ) && config === undefined ) {\n\t\tconfig = toolbar;\n\t\ttoolbar = config.toolbar;\n\t}\n\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.MenuToolGroup.parent.call( this, toolbar, config );\n\n\t// Events\n\tthis.toolbar.connect( this, { updateState: 'onUpdateState' } );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-menuToolGroup' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.MenuToolGroup, OO.ui.PopupToolGroup );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.MenuToolGroup.static.name = 'menu';\n\n/* Methods */\n\n/**\n * Handle the toolbar state being updated.\n *\n * When the state changes, the title of each active item in the menu will be joined together and\n * used as a label for the group. The label will be empty if none of the items are active.\n *\n * @private\n */\nOO.ui.MenuToolGroup.prototype.onUpdateState = function () {\n\tvar name,\n\t\tlabelTexts = [];\n\n\tfor ( name in this.tools ) {\n\t\tif ( this.tools[ name ].isActive() ) {\n\t\t\tlabelTexts.push( this.tools[ name ].getTitle() );\n\t\t}\n\t}\n\n\tthis.setLabel( labelTexts.join( ', ' ) || ' ' );\n};\n","}( OO ) );\n"]}
\ No newline at end of file
index b8445e9..a9874b2 100644 (file)
@@ -1,26 +1,25 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-05-16T22:31:46Z
  */
-.oo-ui-draggableElement-handle,
-.oo-ui-draggableElement-handle.oo-ui-widget {
+.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
   cursor: url(images/grab.cur );
   cursor: -webkit-grab;
-  cursor:    -moz-grab;
-  cursor:         grab;
+  cursor: -moz-grab;
+  cursor: grab;
 }
-.oo-ui-draggableElement-handle:active {
+.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ):active {
   cursor: url(images/grabbing.cur );
   cursor: -webkit-grabbing;
-  cursor:    -moz-grabbing;
-  cursor:         grabbing;
+  cursor: -moz-grabbing;
+  cursor: grabbing;
 }
 .oo-ui-draggableElement-handle.oo-ui-widget-disabled,
 .oo-ui-widget-disabled .oo-ui-draggableElement-handle {
   display: inline-block;
 }
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
+  overflow: hidden;
 }
 .oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
   width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-padded {
-  padding: 2em;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
   position: absolute;
@@ -53,7 +46,7 @@
   left: 0;
   right: 0;
   bottom: 3em;
-  overflow-y: auto;
+  overflow: auto;
 }
 .oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
   position: absolute;
   left: 0;
   right: 0;
   bottom: 0;
-  /* stylelint-disable declaration-no-important */
-  /* stylelint-enable declaration-no-important */
 }
 .oo-ui-menuLayout-menu,
 .oo-ui-menuLayout-content {
   position: absolute;
   -webkit-transition: all 200ms ease;
-     -moz-transition: all 200ms ease;
-          transition: all 200ms ease;
+  -moz-transition: all 200ms ease;
+  transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
   height: 18em;
   vertical-align: middle;
   overflow: hidden;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
   height: 2em;
   width: 4em;
   border-radius: 1em;
   background-color: #eeeeee;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #ddd), color-stop(100%, #fff));
   background-image: -webkit-linear-gradient(top, #ddd 0, #fff 100%);
-  background-image:    -moz-linear-gradient(top, #ddd 0, #fff 100%);
-  background-image:         linear-gradient(to bottom, #ddd 0, #fff 100%);
+  background-image: -moz-linear-gradient(top, #ddd 0, #fff 100%);
+  background-image: linear-gradient(to bottom, #ddd 0, #fff 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffdddddd', endColorstr='#ffffffff' )";
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
   position: absolute;
   display: block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-toggleSwitchWidget:last-child {
   margin-right: 0;
   box-shadow: 0 0.1em 0.25em rgba(0, 0, 0, 0.1);
   border: 1px #c9c9c9 solid;
   -webkit-transition: left 250ms ease, margin-left 250ms ease;
-     -moz-transition: left 250ms ease, margin-left 250ms ease;
-          transition: left 250ms ease, margin-left 250ms ease;
+  -moz-transition: left 250ms ease, margin-left 250ms ease;
+  transition: left 250ms ease, margin-left 250ms ease;
   background-color: #eeeeee;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #ddd));
   background-image: -webkit-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:    -moz-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:         linear-gradient(to bottom, #fff 0, #ddd 100%);
+  background-image: -moz-linear-gradient(top, #fff 0, #ddd 100%);
+  background-image: linear-gradient(to bottom, #fff 0, #ddd 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
 }
 .oo-ui-toggleSwitchWidget-glow {
   border-radius: 1em;
   box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
   -webkit-transition: opacity 250ms ease;
-     -moz-transition: opacity 250ms ease;
-          transition: opacity 250ms ease;
+  -moz-transition: opacity 250ms ease;
+  transition: opacity 250ms ease;
   background-color: #cde7f4;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #b0d9ee), color-stop(100%, #eaf4fa));
   background-image: -webkit-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
-  background-image:    -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
-  background-image:         linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
+  background-image: -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
+  background-image: linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffb0d9ee', endColorstr='#ffeaf4fa' )";
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
   opacity: 0;
   position: relative;
   overflow: hidden;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
   cursor: default;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-selectFileWidget-label {
   position: absolute;
 }
 .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-fileName {
   display: block;
-  padding-top: 0.5em;
-  padding-right: 2.375em;
-}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-clearButton {
-  right: 0.5em;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
 .oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
   height: auto;
 }
-.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-label {
-  padding: 1em;
-}
 .oo-ui-selectFileWidget:last-child {
   margin-right: 0;
 }
   border-width: 1px 0 1px 1px;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
-  top: 0;
   left: 0;
-  height: 2.3em;
   margin-left: 0.3em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-  top: 0;
   right: 0;
-  height: 2.3em;
   margin-right: 0.775em;
 }
 .oo-ui-selectFileWidget-label {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   left: 0.5em;
   right: 2.175em;
   line-height: 2.3em;
 .oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
   background-color: #e1f3ff;
 }
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-label {
+  padding: 1em;
+}
 .oo-ui-selectFileWidget-dropTarget {
   background-color: #fff;
   border: 1px solid #aaa;
   overflow: inherit;
   white-space: normal;
 }
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-fileName {
+  padding-top: 0.5em;
+  padding-right: 2.375em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-clearButton {
+  right: 0.5em;
+}
 .oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget {
   border-style: dashed;
 }
 .oo-ui-outlineOptionWidget {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
   font-size: 1.1em;
   padding: 0.75em;
 }
 .oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
   opacity: 0.5;
 }
-.oo-ui-outlineOptionWidget-level-0 {
-  padding-left: 3.5em;
-}
-.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
-  left: 1em;
+.oo-ui-outlineOptionWidget-level-0.oo-ui-iconElement {
+  padding-left: 2.5em;
 }
 .oo-ui-outlineOptionWidget-level-1 {
-  padding-left: 5em;
+  padding-left: 2.5em;
+}
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement {
+  padding-left: 4.5em;
 }
-.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement .oo-ui-iconElement-icon {
   left: 2.5em;
 }
 .oo-ui-outlineOptionWidget-level-2 {
-  padding-left: 6.5em;
+  padding-left: 5em;
+}
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement {
+  padding-left: 7em;
 }
-.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
-  left: 4em;
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 5em;
 }
 .oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
   background-color: #a7dcff;
   text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
-  font-weight: bold;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-  opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-  color: #777;
-}
 .oo-ui-outlineControlsWidget {
   height: 3em;
   background-color: #fff;
 .oo-ui-outlineControlsWidget-movers {
   float: left;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
   float: left;
 }
 .oo-ui-tabOptionWidget {
   display: inline-block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   vertical-align: bottom;
-  padding: 0.5em 1em;
   margin: 0.5em 0 0 0.75em;
-  border: 1px solid transparent;
-  border-bottom: 0;
+  border-color: transparent;
+  border-style: solid;
+  border-width: 1px 1px 0 1px;
   border-top-left-radius: 0.5em;
   border-top-right-radius: 0.5em;
+  padding: 0.5em 1em;
 }
-.oo-ui-tabOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-  padding-right: 1.5em;
-}
-.oo-ui-tabOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  opacity: 0.5;
-}
-.oo-ui-selectWidget-pressed .oo-ui-tabOptionWidget.oo-ui-optionWidget-pressed {
-  background-color: transparent;
+.oo-ui-tabOptionWidget.oo-ui-optionWidget-selected {
+  background-color: #fff;
+  border-color: #ddd;
 }
 .oo-ui-tabOptionWidget.oo-ui-widget-enabled:hover {
   background-color: rgba(255, 255, 255, 0.2);
   background-color: #fff;
   border-color: #ddd;
 }
-.oo-ui-selectWidget-pressed .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-selectWidget-depressed .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-tabOptionWidget.oo-ui-optionWidget-selected:hover {
+.oo-ui-tabOptionWidget.oo-ui-widget-enabled.oo-ui-optionWidget-selected:hover {
   background-color: #fff;
+}
+.oo-ui-tagMultiselectWidget {
+  display: inline-block;
+  position: relative;
+  width: 100%;
+  max-width: 50em;
+}
+.oo-ui-tagMultiselectWidget-handle {
+  width: 100%;
+  display: block;
+  position: relative;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
+.oo-ui-tagMultiselectWidget-content {
+  position: relative;
+}
+.oo-ui-tagMultiselectWidget-group {
+  display: inline;
+}
+.oo-ui-tagMultiselectWidget-outlined {
+  width: 100%;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined .oo-ui-tagMultiselectWidget-handle {
+  cursor: text;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-content > input {
+  display: none;
+}
+.oo-ui-tagMultiselectWidget-focusTrap {
+  display: inline-block;
+  height: 1px;
+  width: 1px;
+}
+.oo-ui-tagMultiselectWidget-handle {
+  background-color: #fff;
+  cursor: text;
+  min-height: 2.4em;
+  margin-right: 0.5em;
+  padding: 0.15em 0.25em;
+  border: 1px solid rgba(0, 0, 0, 0.1);
+  border-radius: 0.25em;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.oo-ui-tagMultiselectWidget-handle:last-child {
+  margin-right: 0;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input {
+  border: 0;
+  line-height: 1.675em;
+  margin: 0;
+  margin-left: 0.2em;
+  padding: 0;
+  font-size: inherit;
+  font-family: inherit;
+  background-color: transparent;
+  color: #000;
+  vertical-align: middle;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::-webkit-input-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:-ms-input-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::-moz-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:-moz-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:focus {
+  outline: 0;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-iconElement .oo-ui-tagMultiselectWidget-handle {
+  padding-left: 2.475em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-iconElement .oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon {
+  left: 0;
+  margin: 0 0.3em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-indicatorElement .oo-ui-tagMultiselectWidget-handle {
+  padding-right: 2.4875em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-indicatorElement .oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
+}
+.oo-ui-tagMultiselectWidget:hover .oo-ui-tagMultiselectWidget-handle {
+  border-color: rgba(0, 0, 0, 0.2);
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle {
+  color: #ccc;
+  text-shadow: 0 1px 1px #fff;
   border-color: #ddd;
+  background-color: #f3f3f3;
+  cursor: default;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  opacity: 0.2;
+}
+.oo-ui-tagMultiselectWidget-popup > .oo-ui-popupWidget-popup {
+  border: 0;
+}
+.oo-ui-tagItemWidget {
+  position: relative;
+  display: inline-block;
+  cursor: default;
+  white-space: nowrap;
+  width: auto;
+  max-width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  vertical-align: middle;
+  padding: 0 0.4em;
+  margin: 0.1em;
+  height: 1.7em;
+  line-height: 1.7em;
+  background-color: #eeeeee;
+  background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #ddd));
+  background-image: -webkit-linear-gradient(top, #fff 0, #ddd 100%);
+  background-image: -moz-linear-gradient(top, #fff 0, #ddd 100%);
+  background-image: linear-gradient(to bottom, #fff 0, #ddd 100%);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
+  border: 1px solid #ccc;
+  color: #333;
+  border-radius: 0.25em;
+}
+.oo-ui-tagItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+  display: inline-block;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  cursor: text;
+}
+.oo-ui-tagItemWidget:focus {
+  outline: 0;
+  border-color: #087ecc;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-disabled {
+  opacity: 0.5;
+  -webkit-transform: translateZ(0);
+  transform: translateZ(0);
+  box-shadow: none;
+  color: #333;
+  background: #eee;
+  border-color: #ccc;
+}
+.oo-ui-tagItemWidget > .oo-ui-buttonElement {
+  margin-top: -1.25em;
+  padding-left: 0.3em;
 }
 .oo-ui-capsuleMultiselectWidget {
   display: inline-block;
   display: block;
   position: relative;
 }
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
 .oo-ui-capsuleMultiselectWidget-content {
   position: relative;
 }
   border: 1px solid rgba(0, 0, 0, 0.1);
   border-radius: 0.25em;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-capsuleMultiselectWidget-handle:last-child {
   margin-right: 0;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
-  position: absolute;
-}
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
   border: 0;
   line-height: 1.675em;
   color: #000;
   vertical-align: middle;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
-  outline: none;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
+  color: #767676;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
-  padding-right: 2.4875em;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-ms-input-placeholder {
+  color: #767676;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
-  right: 0;
-  top: 0;
-  margin: 0.775em;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-moz-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-moz-placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::placeholder {
+  color: #767676;
+  opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
+  outline: 0;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
   padding-left: 2.475em;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
   left: 0;
-  top: 0;
-  margin: 0.3em;
+  margin: 0 0.3em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
+  padding-right: 2.4875em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
 }
 .oo-ui-capsuleMultiselectWidget:hover .oo-ui-capsuleMultiselectWidget-handle {
   border-color: rgba(0, 0, 0, 0.2);
   width: auto;
   max-width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   vertical-align: middle;
   padding: 0 0.4em;
   margin: 0.1em;
   background-color: #eeeeee;
   background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #fff), color-stop(100%, #ddd));
   background-image: -webkit-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:    -moz-linear-gradient(top, #fff 0, #ddd 100%);
-  background-image:         linear-gradient(to bottom, #fff 0, #ddd 100%);
+  background-image: -moz-linear-gradient(top, #fff 0, #ddd 100%);
+  background-image: linear-gradient(to bottom, #fff 0, #ddd 100%);
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
   border: 1px solid #ccc;
-  color: #555;
+  color: #333;
   border-radius: 0.25em;
 }
 .oo-ui-capsuleItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
   cursor: text;
 }
 .oo-ui-capsuleItemWidget:focus {
-  outline: none;
+  outline: 0;
   border-color: #087ecc;
 }
 .oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
   opacity: 0.5;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
   box-shadow: none;
   color: #333;
   background: #eee;
   max-width: 50em;
 }
 .oo-ui-numberInputWidget-buttoned .oo-ui-buttonWidget,
-.oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget {
+.oo-ui-numberInputWidget-buttoned .oo-ui-inputWidget-input {
   display: table-cell;
+  height: 100%;
 }
 .oo-ui-numberInputWidget-field {
   display: table;
   border-bottom-left-radius: 0;
   border-left-width: 0;
 }
-.oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget input {
+.oo-ui-numberInputWidget-buttoned .oo-ui-inputWidget-input {
   border-radius: 0;
 }
index aab3b62..abe95cd 100644 (file)
@@ -1,26 +1,28 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-05-16T22:31:46Z
  */
-.oo-ui-draggableElement-handle,
-.oo-ui-draggableElement-handle.oo-ui-widget {
+.oo-ui-draggableElement {
+  padding: 1.0546875em 0.9375em 0.9375em;
+}
+.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
   cursor: url(images/grab.cur );
   cursor: -webkit-grab;
-  cursor:    -moz-grab;
-  cursor:         grab;
+  cursor: -moz-grab;
+  cursor: grab;
 }
-.oo-ui-draggableElement-handle:active {
+.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ):active {
   cursor: url(images/grabbing.cur );
   cursor: -webkit-grabbing;
-  cursor:    -moz-grabbing;
-  cursor:         grabbing;
+  cursor: -moz-grabbing;
+  cursor: grabbing;
 }
 .oo-ui-draggableElement-handle.oo-ui-widget-disabled,
 .oo-ui-widget-disabled .oo-ui-draggableElement-handle {
 .oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement {
   display: inline-block;
 }
+.oo-ui-draggableElement-handle.oo-ui-widget-enabled:focus {
+  border-radius: 2px;
+  box-shadow: inset 0 0 0 1px #36c, 0 0 0 1px #36c;
+  outline: 0;
+}
 .oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
-  overflow-y: hidden;
+  overflow: hidden;
 }
 .oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
   width: 100%;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-scrollable {
-  overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-padded {
-  padding: 2em;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
   position: absolute;
@@ -53,7 +54,7 @@
   left: 0;
   right: 0;
   bottom: 3em;
-  overflow-y: auto;
+  overflow: auto;
 }
 .oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
   position: absolute;
   left: 0;
   right: 0;
   bottom: 0;
-  /* stylelint-disable declaration-no-important */
-  /* stylelint-enable declaration-no-important */
 }
 .oo-ui-menuLayout-menu,
 .oo-ui-menuLayout-content {
   position: absolute;
   -webkit-transition: all 200ms ease;
-     -moz-transition: all 200ms ease;
-          transition: all 200ms ease;
+  -moz-transition: all 200ms ease;
+  transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
   height: 18em;
   outline: 0;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
-  border-radius: 0;
   margin-left: -1px;
+  border-radius: 0;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+  margin-left: 0;
   border-bottom-left-radius: 2px;
   border-top-left-radius: 2px;
-  margin-left: 0;
 }
 .oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
   border-bottom-right-radius: 2px;
   border-top-right-radius: 2px;
 }
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+  position: absolute;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget.oo-ui-widget-disabled + .oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+  border-left-color: #fff;
+}
 .oo-ui-buttonSelectWidget.oo-ui-widget-enabled:focus .oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected .oo-ui-buttonElement-button {
   border-color: #36c;
   box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
 }
 .oo-ui-buttonOptionWidget {
   display: inline-block;
-  padding: 0;
 }
 .oo-ui-buttonOptionWidget.oo-ui-buttonElement-active .oo-ui-buttonElement-button {
   cursor: default;
   display: inline-block;
   vertical-align: middle;
 }
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
-}
 .oo-ui-toggleButtonWidget {
   margin-right: 0.5em;
 }
   vertical-align: middle;
   overflow: hidden;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   -webkit-transform: translateZ(0);
-          transform: translateZ(0);
+  transform: translateZ(0);
   background-color: #f8f9fa;
   width: 3.5em;
   min-height: 26px;
   border-radius: 1em;
   margin-right: 0.5em;
   -webkit-transition: background-color 250ms, border-color 250ms;
-     -moz-transition: background-color 250ms, border-color 250ms;
-          transition: background-color 250ms, border-color 250ms;
+  -moz-transition: background-color 250ms, border-color 250ms;
+  transition: background-color 250ms, border-color 250ms;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
   cursor: pointer;
   position: absolute;
   display: block;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-toggleSwitchWidget:last-child {
   margin-right: 0;
   border-radius: 1em;
   z-index: 1;
   -webkit-transition: border-color 250ms;
-     -moz-transition: border-color 250ms;
-          transition: border-color 250ms;
+  -moz-transition: border-color 250ms;
+  transition: border-color 250ms;
 }
 .oo-ui-toggleSwitchWidget-grip {
   top: 0.3125em;
   height: 1.25em;
   border-radius: 1.25em;
   -webkit-transition: background-color 250ms, left 100ms, margin-left 100ms;
-     -moz-transition: background-color 250ms, left 100ms, margin-left 100ms;
-          transition: background-color 250ms, left 100ms, margin-left 100ms;
+  -moz-transition: background-color 250ms, left 100ms, margin-left 100ms;
+  transition: background-color 250ms, left 100ms, margin-left 100ms;
 }
 .oo-ui-toggleSwitchWidget-glow {
   display: none;
   position: relative;
   overflow: hidden;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   position: absolute;
+  top: 0;
+  height: 100%;
 }
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
   cursor: default;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-selectFileWidget-label {
   position: absolute;
 }
 .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-fileName {
   display: block;
-  padding-top: 0.5em;
-  padding-right: 2.375em;
-}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-clearButton {
-  right: 0.5em;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
 .oo-ui-selectFileWidget-empty.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
   height: auto;
 }
-.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-label {
-  padding: 1em;
-}
 .oo-ui-selectFileWidget:last-child {
   margin-right: 0;
 }
   border-radius: 0 2px 2px 0;
 }
 .oo-ui-selectFileWidget-info {
-  height: 2.4em;
   background-color: #fff;
   border: 1px solid #a2a9b1;
   border-radius: 2px 0 0 2px;
-  border-width: 1px 0 1px 1px;
+  border-right-width: 0;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
-  left: 0;
-  top: 0;
-  height: 2.3em;
-  margin-left: 0.5em;
+  top: -1px;
+  left: 0.46875em;
+  min-height: 2.5em;
+  margin-left: -1px;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-  top: 0;
-  right: 0;
-  height: 2.3em;
-  margin-right: 0.775em;
+  top: -1px;
+  right: 0.9375em;
+  min-height: 2.5em;
 }
 .oo-ui-selectFileWidget-label {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   display: block;
   right: 2.375em;
-  margin: 0;
-  padding-left: 0.5em;
-  line-height: 2.3;
+  padding-top: 0.625em;
+  padding-left: 0.625em;
+  padding-bottom: 0.546875em;
+  line-height: 1.172em;
   white-space: nowrap;
 }
 .oo-ui-selectFileWidget-fileName {
   text-overflow: ellipsis;
 }
 .oo-ui-selectFileWidget-clearButton {
-  top: 0;
-  right: 0;
+  top: -1px;
+  right: 0.46875em;
   min-width: 24px;
   width: 1.875em;
   margin-right: 0;
 }
 .oo-ui-selectFileWidget-clearButton .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  height: 2.3em;
+  height: 2.5em;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-label {
   color: #72777d;
 }
 .oo-ui-selectFileWidget.oo-ui-iconElement .oo-ui-selectFileWidget-label {
-  left: 2.875em;
+  left: 2.5em;
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-label {
-  right: 4.4625em;
+  right: 3.75em;
   padding-left: 0;
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-clearButton {
 .oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-label {
   right: 2em;
 }
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
-  background-color: #eaf3ff;
-}
 .oo-ui-selectFileWidget-dropTarget {
   background-color: #fff;
   border: 1px solid #a2a9b1;
+  border-radius: 2px;
   vertical-align: middle;
   overflow: hidden;
-  border-radius: 2px;
 }
 .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
   border-radius: 2px;
   overflow: inherit;
   white-space: normal;
 }
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-fileName {
+  padding-right: 2.5em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-clearButton {
+  top: 0;
+}
 .oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget {
-  background-color: #eee;
+  background-color: #fff;
   border-style: dashed;
+  -webkit-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  -moz-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+  transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
-.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
-  background-color: #eaecf0;
-  border-color: #c8ccd1;
+.oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget:hover {
+  border-color: #72777d;
+}
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
+  background-color: #eaf3ff;
+  color: #36c;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
   background-color: #eaecf0;
   color: #72777d;
   border-color: #c8ccd1;
   text-shadow: 0 1px 1px #fff;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
-.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
   opacity: 0.51;
 }
+.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
+  opacity: 0.15;
+}
+.oo-ui-selectFileWidget.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget {
+  background-color: #eaecf0;
+  border-color: #c8ccd1;
+}
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info {
+  background-color: #eaecf0;
+  color: #222;
+  border-color: #c8ccd1;
+}
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget {
+  background-color: #eaecf0;
+  border-color: #c8ccd1;
+}
+.oo-ui-selectFileWidget-notsupported.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-label {
+  padding: 1em 0.9375em;
+}
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-dropLabel {
   display: none;
 }
+.oo-ui-outlineSelectWidget {
+  height: 100%;
+}
+.oo-ui-outlineSelectWidget:focus {
+  box-shadow: inset 0 0 0 2px #36c;
+}
 .oo-ui-outlineOptionWidget {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  font-size: 1.1em;
-  padding: 0.75em;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  padding: 1.0546875em 0.9375em 0.9375em;
   -webkit-transition: background-color 100ms, color 100ms;
-     -moz-transition: background-color 100ms, color 100ms;
-          transition: background-color 100ms, color 100ms;
+  -moz-transition: background-color 100ms, color 100ms;
+  transition: background-color 100ms, color 100ms;
 }
 .oo-ui-outlineOptionWidget.oo-ui-optionWidget-highlighted {
   background-color: #eaecf0;
   background-color: rgba(41, 98, 204, 0.1);
   color: #36c;
 }
-.oo-ui-outlineOptionWidget .oo-ui-iconElement-icon {
-  font-size: 90.90909%;
-}
 .oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
   padding-right: 1.5em;
 }
 .oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
   opacity: 0.5;
 }
-.oo-ui-outlineOptionWidget-level-0 {
-  padding-left: 3.5em;
-}
-.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
-  left: 1em;
+.oo-ui-outlineOptionWidget .oo-ui-labelElement-label {
+  font-size: 1.1em;
 }
 .oo-ui-outlineOptionWidget-level-1 {
-  padding-left: 5em;
+  padding-left: 2.571em;
 }
-.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
-  left: 2.5em;
-}
-.oo-ui-outlineOptionWidget-level-2 {
-  padding-left: 6.5em;
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement {
+  padding-left: 4.429em;
 }
-.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
-  left: 4em;
+.oo-ui-outlineOptionWidget-level-1.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 2.571em;
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
-  font-weight: bold;
+.oo-ui-outlineOptionWidget-level-2 {
+  padding-left: 5.142em;
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
-  opacity: 0.5;
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement {
+  padding-left: 6.857em;
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
-  color: #777;
+.oo-ui-outlineOptionWidget-level-2.oo-ui-iconElement .oo-ui-iconElement-icon {
+  left: 4.429em;
 }
 .oo-ui-outlineControlsWidget {
   height: 3em;
 .oo-ui-outlineControlsWidget-movers {
   float: left;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
   float: left;
 }
 .oo-ui-tabOptionWidget {
   display: inline-block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   vertical-align: bottom;
   color: #222;
-  margin: 0.5em 0 0 0.75em;
-  border: 1px solid transparent;
-  border-bottom: 0;
+  margin: 0.46875em 0 0 0.46875em;
+  border-color: transparent;
+  border-style: solid;
+  border-width: 1px 1px 0 1px;
   border-top-left-radius: 2px;
   border-top-right-radius: 2px;
-  padding: 0.35em 1em;
+  padding: 0.625em 1.015625em 0.546875em;
   font-weight: bold;
+  line-height: 1;
   -webkit-transition: background-color 100ms, color 100ms;
-     -moz-transition: background-color 100ms, color 100ms;
-          transition: background-color 100ms, color 100ms;
+  -moz-transition: background-color 100ms, color 100ms;
+  transition: background-color 100ms, color 100ms;
+}
+.oo-ui-tabOptionWidget.oo-ui-optionWidget-selected {
+  background-color: #fff;
+  color: #000;
+}
+.oo-ui-tabOptionWidget .oo-ui-labelElement-label {
+  line-height: 1.172em;
 }
 .oo-ui-tabOptionWidget.oo-ui-widget-enabled:hover {
   background-color: rgba(255, 255, 255, 0.3);
 .oo-ui-tabOptionWidget.oo-ui-widget-enabled:active {
   background-color: rgba(255, 255, 255, 0.8);
 }
-.oo-ui-tabOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
-  padding-right: 1.5em;
+.oo-ui-tabOptionWidget.oo-ui-widget-enabled.oo-ui-optionWidget-selected:hover {
+  background-color: #fff;
 }
-.oo-ui-tabOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
-  opacity: 0.5;
+.oo-ui-tagMultiselectWidget {
+  display: inline-block;
+  position: relative;
+  width: 100%;
+  max-width: 50em;
 }
-.oo-ui-selectWidget-pressed .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-selectWidget-depressed .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-tabOptionWidget.oo-ui-optionWidget-selected:hover {
-  background-color: #fff;
+.oo-ui-tagMultiselectWidget-handle {
+  width: 100%;
+  display: block;
+  position: relative;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
+.oo-ui-tagMultiselectWidget-content {
+  position: relative;
+}
+.oo-ui-tagMultiselectWidget-group {
+  display: inline;
+}
+.oo-ui-tagMultiselectWidget-outlined {
+  width: 100%;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined .oo-ui-tagMultiselectWidget-handle {
+  cursor: text;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-content > input {
+  display: none;
+}
+.oo-ui-tagMultiselectWidget-focusTrap {
+  display: inline-block;
+  height: 1px;
+  width: 1px;
+}
+.oo-ui-tagMultiselectWidget-handle {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  min-height: 2.5em;
+  margin-right: 0.5em;
+  border: 1px solid #a2a9b1;
+  border-radius: 2px;
+  padding: 0 0.625em 0.3125em;
+  line-height: 1;
+}
+.oo-ui-tagMultiselectWidget-handle:last-child {
+  margin-right: 0;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input {
+  background-color: transparent;
   color: #000;
+  margin: 0.46875em 0 0 0.390625em;
+  border: 0;
+  padding: 0;
+  font-family: inherit;
+  font-size: inherit;
+  line-height: 1.563em;
+  vertical-align: middle;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::-webkit-input-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:-ms-input-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:-moz-placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input::placeholder {
+  color: #72777d;
+  opacity: 1;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content > input:focus {
+  outline: 0;
+}
+.oo-ui-tagMultiselectWidget-handle > .oo-ui-tagMultiselectWidget-content .oo-ui-tagMultiselectWidget-group:empty + input {
+  margin-left: 0;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-iconElement .oo-ui-tagMultiselectWidget-handle {
+  padding-left: 2.475em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-iconElement .oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon {
+  left: 0;
+  margin: 0 0.3em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-indicatorElement .oo-ui-tagMultiselectWidget-handle {
+  padding-right: 2.4875em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-indicatorElement .oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0;
+  margin: 0 0.775em;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle {
+  background-color: #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);
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined:hover .oo-ui-tagMultiselectWidget-handle {
+  border-color: #72777d;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-inlined.oo-ui-tagMultiselectWidget-focus .oo-ui-tagMultiselectWidget-handle {
+  border-color: #36c;
+  outline: 0;
+  box-shadow: inset 0 0 0 1px #36c;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagMultiselectWidget-handle {
+  background-color: #f8f9fa;
+  border-bottom: 0;
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagItemWidget.oo-ui-widget-enabled {
+  background-color: #fff;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-inputWidget-input {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle {
+  color: #72777d;
+  text-shadow: 0 1px 1px #fff;
+  border-color: #c8ccd1;
+  background-color: #eaecf0;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle > .oo-ui-iconElement-icon {
+  opacity: 0.51;
+}
+.oo-ui-tagMultiselectWidget.oo-ui-widget-disabled .oo-ui-tagMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  opacity: 0.15;
+}
+.oo-ui-tagItemWidget {
+  position: relative;
+  display: inline-block;
+  cursor: default;
+  white-space: nowrap;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: auto;
+  max-width: 100%;
+  height: 1.71875em;
+  margin: 0.3125em 0.3125em 0 0;
+  border: 1px solid #a2a9b1;
+  border-radius: 2px;
+  padding: 0 0.3125em;
+  line-height: 1.71875em;
+  vertical-align: middle;
+}
+.oo-ui-tagItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+  display: inline-block;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  cursor: text;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled {
+  background-color: #f8f9fa;
+  color: #222;
+  padding-right: 1.5375em;
+  -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled:hover {
+  background-color: #fff;
+  color: #444;
+  border-color: #a2a9b1;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled:focus {
+  border-color: #36c;
+  box-shadow: inset 0 0 0 1px #36c;
+  outline: 0;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid {
+  border-color: #d33;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid:hover {
+  border-color: #d33;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid:focus {
+  border-color: #d33;
+  box-shadow: inset 0 0 0 1px #d33;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled > .oo-ui-buttonElement {
+  display: block;
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button {
+  display: block;
+  width: 1.5375em;
+  height: 100%;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button .oo-ui-indicator-clear {
+  position: absolute;
+  top: 0;
+  right: 0.3em;
+  bottom: 0;
+  height: auto;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-disabled {
+  background-color: #eaecf0;
+  color: #72777d;
+  border-color: #c8ccd1;
+  text-shadow: 0 1px 1px #fff;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-disabled:focus {
+  outline: 0;
+}
+.oo-ui-tagItemWidget.oo-ui-widget-disabled > .oo-ui-buttonElement {
+  display: none;
 }
 .oo-ui-capsuleMultiselectWidget {
   display: inline-block;
   display: block;
   position: relative;
 }
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  position: absolute;
+  top: 0;
+  height: 100%;
+}
 .oo-ui-capsuleMultiselectWidget-content {
   position: relative;
 }
   width: 1px;
 }
 .oo-ui-capsuleMultiselectWidget-handle {
-  min-height: 2.4em;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  min-height: 2.5em;
   margin-right: 0.5em;
-  padding: 0.15em 0.25em;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  padding: 0 0.625em 0.3125em;
+  line-height: 1;
 }
 .oo-ui-capsuleMultiselectWidget-handle:last-child {
   margin-right: 0;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
-  position: absolute;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
+  background-color: transparent;
+  color: #000;
+  border: 0;
+  margin: 0.46875em 0 0 0.390625em;
+  padding: 0;
+  font-family: inherit;
+  font-size: inherit;
+  line-height: 1.563em;
+  vertical-align: middle;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-moz-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-moz-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-ms-input-placeholder {
   color: #72777d;
   opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-ms-input-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-webkit-input-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-moz-placeholder {
   color: #72777d;
+  opacity: 1;
 }
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :placeholder-shown {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::placeholder {
   color: #72777d;
-}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
-  border: 0;
-  line-height: 1.675;
-  margin: 0 0 0 0.2em;
-  padding: 0;
-  font-size: inherit;
-  font-family: inherit;
-  background-color: transparent;
-  color: #000;
-  vertical-align: middle;
+  opacity: 1;
 }
 .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
   outline: 0;
 }
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
-  padding-right: 2.4875em;
-}
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
-  right: 0;
-  top: 0;
-  margin: 0.775em;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content .oo-ui-capsuleMultiselectWidget-group:empty + input {
+  margin-left: 0;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
-  padding-left: 2.475em;
+  padding-left: 2.5em;
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
-  left: 0;
-  top: 0;
-  margin: 0.3em;
+  left: 0.46875em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
+  padding-right: 2.8125em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+  right: 0.9375em;
 }
 .oo-ui-capsuleMultiselectWidget-popup {
   margin-top: -1px;
   background-color: #fff;
   cursor: text;
   -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);
+  -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);
 }
 .oo-ui-capsuleMultiselectWidget.oo-ui-widget-enabled:hover .oo-ui-capsuleMultiselectWidget-handle {
   border-color: #72777d;
   display: inline-block;
   cursor: default;
   white-space: nowrap;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
   width: auto;
   max-width: 100%;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
-  vertical-align: middle;
-  height: 1.7em;
-  line-height: 1.7;
-  background-color: #eee;
-  color: #222;
-  margin: 0.1em;
+  height: 1.71875em;
+  margin: 0.3125em 0.3125em 0 0;
   border: 1px solid #a2a9b1;
   border-radius: 2px;
-  padding: 0 0.4em;
+  padding: 0 0.3125em;
+  line-height: 1.71875em;
+  vertical-align: middle;
 }
 .oo-ui-capsuleItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
   display: inline-block;
   overflow: hidden;
   cursor: text;
 }
-.oo-ui-capsuleItemWidget:focus {
-  outline: 0;
-  border-color: #36c;
-  box-shadow: inset 0 0 0 1px #36c;
-}
-.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
-  background-color: #eaecf0;
-  color: #72777d;
-  border-color: #c8ccd1;
-  text-shadow: 0 1px 1px #fff;
-}
-.oo-ui-capsuleItemWidget > .oo-ui-buttonElement {
-  display: none;
-}
 .oo-ui-capsuleItemWidget.oo-ui-widget-enabled {
+  background-color: #f8f9fa;
+  color: #222;
   padding-right: 1.5375em;
+  -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+  transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-enabled:hover {
+  background-color: #fff;
+  color: #444;
+  border-color: #a2a9b1;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-enabled:focus {
+  border-color: #36c;
+  box-shadow: inset 0 0 0 1px #36c;
+  outline: 0;
 }
 .oo-ui-capsuleItemWidget.oo-ui-widget-enabled > .oo-ui-buttonElement {
   display: block;
   bottom: 0;
   height: auto;
 }
+.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
+  background-color: #eaecf0;
+  color: #72777d;
+  border-color: #c8ccd1;
+  text-shadow: 0 1px 1px #fff;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-buttonElement {
+  display: none;
+}
 .oo-ui-searchWidget-query {
   position: absolute;
   top: 0;
   overflow-y: auto;
 }
 .oo-ui-searchWidget-query {
-  height: 4em;
-  padding: 0 1em;
-  border-bottom: 1px solid #a2a9b1;
+  height: 4.375em;
+  padding: 0 1.25em;
+  border-bottom: 1px solid #c8ccd1;
+  box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
 }
 .oo-ui-searchWidget-query .oo-ui-textInputWidget {
-  margin: 0.75em 0;
+  margin: 0.9375em 0;
 }
 .oo-ui-searchWidget-results {
-  top: 4em;
-  padding: 1em;
+  top: 4.375em;
+  padding: 1.25em;
   line-height: 0;
 }
 .oo-ui-numberInputWidget {
   max-width: 50em;
 }
 .oo-ui-numberInputWidget-buttoned .oo-ui-buttonWidget,
-.oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget {
+.oo-ui-numberInputWidget-buttoned .oo-ui-inputWidget-input {
   display: table-cell;
+  height: 100%;
 }
 .oo-ui-numberInputWidget-field {
   display: table;
   padding-left: 0;
   padding-right: 0;
 }
-.oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget input {
+.oo-ui-numberInputWidget-buttoned .oo-ui-inputWidget-input {
   border-radius: 0;
 }
 .oo-ui-numberInputWidget-minusButton.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
index d5a796b..3c5d16c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-05-16T22:31:39Z
  */
 ( function ( OO ) {
 
@@ -24,6 +24,9 @@
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {jQuery} [$handle] The part of the element which can be used for dragging, defaults to the whole element
+ * @cfg {boolean} [draggable] The items are draggable. This can change with #toggleDraggable
+ *  but the draggable state should be called from the DraggableGroupElement, which updates
+ *  the whole group
  */
 OO.ui.mixin.DraggableElement = function OoUiMixinDraggableElement( config ) {
        config = config || {};
@@ -32,6 +35,7 @@ OO.ui.mixin.DraggableElement = function OoUiMixinDraggableElement( config ) {
        this.index = null;
        this.$handle = config.$handle || this.$element;
        this.wasHandleUsed = null;
+       this.draggable = config.draggable === undefined ? true : !!config.draggable;
 
        // Initialize and events
        this.$element.addClass( 'oo-ui-draggableElement' )
@@ -81,6 +85,32 @@ OO.ui.mixin.DraggableElement.static.cancelButtonMouseDownEvents = false;
 
 /* Methods */
 
+/**
+ * Change the draggable state of this widget.
+ * This allows users to temporarily halt the dragging operations.
+ *
+ * @param {boolean} isDraggable Widget supports draggable operations
+ * @fires draggable
+ */
+OO.ui.mixin.DraggableElement.prototype.toggleDraggable = function ( isDraggable ) {
+       isDraggable = isDraggable !== undefined ? !!isDraggable : !this.draggable;
+
+       if ( this.draggable !== isDraggable ) {
+               this.draggable = isDraggable;
+
+               this.$handle.toggleClass( 'oo-ui-draggableElement-undraggable', !this.draggable );
+       }
+};
+
+/**
+ * Check the draggable state of this widget
+ *
+ * @return {boolean} Widget supports draggable operations
+ */
+OO.ui.mixin.DraggableElement.prototype.isDraggable = function () {
+       return this.draggable;
+};
+
 /**
  * Respond to mousedown event.
  *
@@ -88,6 +118,10 @@ OO.ui.mixin.DraggableElement.static.cancelButtonMouseDownEvents = false;
  * @param {jQuery.Event} e Drag event
  */
 OO.ui.mixin.DraggableElement.prototype.onDragMouseDown = function ( e ) {
+       if ( !this.isDraggable() ) {
+               return;
+       }
+
        this.wasHandleUsed =
                // Optimization: if the handle is the whole element this is always true
                this.$handle[ 0 ] === this.$element[ 0 ] ||
@@ -107,7 +141,7 @@ OO.ui.mixin.DraggableElement.prototype.onDragStart = function ( e ) {
        var element = this,
                dataTransfer = e.originalEvent.dataTransfer;
 
-       if ( !this.wasHandleUsed ) {
+       if ( !this.wasHandleUsed || !this.isDraggable() ) {
                return false;
        }
 
@@ -208,6 +242,7 @@ OO.ui.mixin.DraggableElement.prototype.getIndex = function () {
  *  should match the layout of the items. Items displayed in a single row
  *  or in several rows should use horizontal orientation. The vertical orientation should only be
  *  used when the items are displayed in a single column. Defaults to 'vertical'
+ * @cfg {boolean} [draggable] The items are draggable. This can change with #toggleDraggable
  */
 OO.ui.mixin.DraggableGroupElement = function OoUiMixinDraggableGroupElement( config ) {
        // Configuration initialization
@@ -222,6 +257,7 @@ OO.ui.mixin.DraggableGroupElement = function OoUiMixinDraggableGroupElement( con
        this.itemKeys = {};
        this.dir = null;
        this.itemsOrder = null;
+       this.draggable = config.draggable === undefined ? true : !!config.draggable;
 
        // Events
        this.aggregate( {
@@ -260,15 +296,54 @@ OO.mixinClass( OO.ui.mixin.DraggableGroupElement, OO.ui.mixin.GroupElement );
  */
 
 /**
- * And item has been dropped at a new position.
+ * An item has been dropped at a new position.
  *
  * @event reorder
  * @param {OO.ui.mixin.DraggableElement} item Reordered item
  * @param {number} [newIndex] New index for the item
  */
 
+/**
+ * Draggable state of this widget has changed.
+ *
+ * @event draggable
+ * @param {boolean} [draggable] Widget is draggable
+ */
+
 /* Methods */
 
+/**
+ * Change the draggable state of this widget.
+ * This allows users to temporarily halt the dragging operations.
+ *
+ * @param {boolean} isDraggable Widget supports draggable operations
+ * @fires draggable
+ */
+OO.ui.mixin.DraggableGroupElement.prototype.toggleDraggable = function ( isDraggable ) {
+       isDraggable = isDraggable !== undefined ? !!isDraggable : !this.draggable;
+
+       if ( this.draggable !== isDraggable ) {
+               this.draggable = isDraggable;
+
+               // Tell the items their draggable state changed
+               this.getItems().forEach( function ( item ) {
+                       item.toggleDraggable( this.draggable );
+               }.bind( this ) );
+
+               // Emit event
+               this.emit( 'draggable', this.draggable );
+       }
+};
+
+/**
+ * Check the draggable state of this widget
+ *
+ * @return {boolean} Widget supports draggable operations
+ */
+OO.ui.mixin.DraggableGroupElement.prototype.isDraggable = function () {
+       return this.draggable;
+};
+
 /**
  * Respond to item drag start event
  *
@@ -276,6 +351,9 @@ OO.mixinClass( OO.ui.mixin.DraggableGroupElement, OO.ui.mixin.GroupElement );
  * @param {OO.ui.mixin.DraggableElement} item Dragged item
  */
 OO.ui.mixin.DraggableGroupElement.prototype.onItemDragStart = function ( item ) {
+       if ( !this.isDraggable() ) {
+               return;
+       }
        // Make a shallow copy of this.items so we can re-order it during previews
        // without affecting the original array.
        this.itemsOrder = this.items.slice();
@@ -531,7 +609,7 @@ OO.ui.mixin.RequestManager.prototype.getRequest = null;
 OO.ui.mixin.RequestManager.prototype.getRequestCacheDataFromResponse = null;
 
 /**
- * LookupElement is a mixin that creates a {@link OO.ui.FloatingMenuSelectWidget menu} of suggested values for
+ * LookupElement is a mixin that creates a {@link OO.ui.MenuSelectWidget menu} of suggested values for
  * a {@link OO.ui.TextInputWidget text input widget}. Suggested values are based on the characters the user types
  * into the text input field and, in general, the menu is only displayed when the user types. If a suggested value is chosen
  * from the lookup menu, that value becomes the value of the input field.
@@ -550,7 +628,8 @@ OO.ui.mixin.RequestManager.prototype.getRequestCacheDataFromResponse = null;
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$overlay] Overlay for the lookup menu; defaults to relative positioning
+ * @cfg {jQuery} [$overlay] Overlay for the lookup menu; defaults to relative positioning.
+ *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.
  * @cfg {jQuery} [$container=this.$element] The container element. The lookup menu is rendered beneath the specified element.
  * @cfg {boolean} [allowSuggestionsWhenEmpty=false] Request and display a lookup menu when the text input is empty.
  *  By default, the lookup menu is not generated and displayed until the user begins to type.
@@ -566,10 +645,10 @@ OO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {
 
        // Properties
        this.$overlay = config.$overlay || this.$element;
-       this.lookupMenu = new OO.ui.FloatingMenuSelectWidget( {
+       this.lookupMenu = new OO.ui.MenuSelectWidget( {
                widget: this,
                input: this,
-               $container: config.$container || this.$element
+               $floatableContainer: config.$container || this.$element
        } );
 
        this.allowSuggestionsWhenEmpty = config.allowSuggestionsWhenEmpty || false;
@@ -591,6 +670,11 @@ OO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {
        } );
 
        // Initialization
+       this.$input.attr( {
+               role: 'combobox',
+               'aria-owns': this.lookupMenu.getElementId(),
+               'aria-autocomplete': 'list'
+       } );
        this.$element.addClass( 'oo-ui-lookupElement' );
        this.lookupMenu.$element.addClass( 'oo-ui-lookupElement-menu' );
        this.$overlay.append( this.lookupMenu.$element );
@@ -682,7 +766,7 @@ OO.ui.mixin.LookupElement.prototype.onLookupMenuItemChoose = function ( item ) {
  * Get lookup menu.
  *
  * @private
- * @return {OO.ui.FloatingMenuSelectWidget}
+ * @return {OO.ui.MenuSelectWidget}
  */
 OO.ui.mixin.LookupElement.prototype.getLookupMenu = function () {
        return this.lookupMenu;
@@ -881,23 +965,24 @@ OO.ui.mixin.LookupElement.prototype.getRequestCacheDataFromResponse = function (
 };
 
 /**
- * CardLayouts are used within {@link OO.ui.IndexLayout index layouts} to create cards that users can select and display
- * from the index's optional {@link OO.ui.TabSelectWidget tab} navigation. Cards are usually not instantiated directly,
- * rather extended to include the required content and functionality.
+ * TabPanelLayouts are used within {@link OO.ui.IndexLayout index layouts} to create tab panels that
+ * users can select and display from the index's optional {@link OO.ui.TabSelectWidget tab}
+ * navigation. TabPanels are usually not instantiated directly, rather extended to include the
+ * required content and functionality.
  *
- * Each card must have a unique symbolic name, which is passed to the constructor. In addition, the card's tab
- * item is customized (with a label) using the #setupTabItem method. See
+ * Each tab panel must have a unique symbolic name, which is passed to the constructor. In addition,
+ * the tab panel's tab item is customized (with a label) using the #setupTabItem method. See
  * {@link OO.ui.IndexLayout IndexLayout} for an example.
  *
  * @class
  * @extends OO.ui.PanelLayout
  *
  * @constructor
- * @param {string} name Unique symbolic name of card
+ * @param {string} name Unique symbolic name of tab panel
  * @param {Object} [config] Configuration options
- * @cfg {jQuery|string|Function|OO.ui.HtmlSnippet} [label] Label for card's tab
+ * @cfg {jQuery|string|Function|OO.ui.HtmlSnippet} [label] Label for tab panel's tab
  */
-OO.ui.CardLayout = function OoUiCardLayout( name, config ) {
+OO.ui.TabPanelLayout = function OoUiTabPanelLayout( name, config ) {
        // Allow passing positional parameters inside the config object
        if ( OO.isPlainObject( name ) && config === undefined ) {
                config = name;
@@ -908,7 +993,7 @@ OO.ui.CardLayout = function OoUiCardLayout( name, config ) {
        config = $.extend( { scrollable: true }, config );
 
        // Parent constructor
-       OO.ui.CardLayout.parent.call( this, config );
+       OO.ui.TabPanelLayout.parent.call( this, config );
 
        // Properties
        this.name = name;
@@ -917,55 +1002,56 @@ OO.ui.CardLayout = function OoUiCardLayout( name, config ) {
        this.active = false;
 
        // Initialization
-       this.$element.addClass( 'oo-ui-cardLayout' );
+       this.$element.addClass( 'oo-ui-tabPanelLayout' );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.CardLayout, OO.ui.PanelLayout );
+OO.inheritClass( OO.ui.TabPanelLayout, OO.ui.PanelLayout );
 
 /* Events */
 
 /**
- * An 'active' event is emitted when the card becomes active. Cards become active when they are
- * shown in a index layout that is configured to display only one card at a time.
+ * An 'active' event is emitted when the tab panel becomes active. Tab panels become active when they are
+ * shown in a index layout that is configured to display only one tab panel at a time.
  *
  * @event active
- * @param {boolean} active Card is active
+ * @param {boolean} active Tab panel is active
  */
 
 /* Methods */
 
 /**
- * Get the symbolic name of the card.
+ * Get the symbolic name of the tab panel.
  *
- * @return {string} Symbolic name of card
+ * @return {string} Symbolic name of tab panel
  */
-OO.ui.CardLayout.prototype.getName = function () {
+OO.ui.TabPanelLayout.prototype.getName = function () {
        return this.name;
 };
 
 /**
- * Check if card is active.
+ * Check if tab panel is active.
  *
- * Cards become active when they are shown in a {@link OO.ui.IndexLayout index layout} that is configured to display
- * only one card at a time. Additional CSS is applied to the card's tab item to reflect the active state.
+ * Tab panels become active when they are shown in a {@link OO.ui.IndexLayout index layout} that is configured to
+ * display only one tab panel at a time. Additional CSS is applied to the tab panel's tab item to reflect the
+ * active state.
  *
- * @return {boolean} Card is active
+ * @return {boolean} Tab panel is active
  */
-OO.ui.CardLayout.prototype.isActive = function () {
+OO.ui.TabPanelLayout.prototype.isActive = function () {
        return this.active;
 };
 
 /**
  * Get tab item.
  *
- * The tab item allows users to access the card from the index's tab
+ * The tab item allows users to access the tab panel from the index's tab
  * navigation. The tab item itself can be customized (with a label, level, etc.) using the #setupTabItem method.
  *
  * @return {OO.ui.TabOptionWidget|null} Tab option widget
  */
-OO.ui.CardLayout.prototype.getTabItem = function () {
+OO.ui.TabPanelLayout.prototype.getTabItem = function () {
        return this.tabItem;
 };
 
@@ -979,7 +1065,7 @@ OO.ui.CardLayout.prototype.getTabItem = function () {
  * @param {OO.ui.TabOptionWidget|null} tabItem Tab option widget, null to clear
  * @chainable
  */
-OO.ui.CardLayout.prototype.setTabItem = function ( tabItem ) {
+OO.ui.TabPanelLayout.prototype.setTabItem = function ( tabItem ) {
        this.tabItem = tabItem || null;
        if ( tabItem ) {
                this.setupTabItem();
@@ -997,7 +1083,7 @@ OO.ui.CardLayout.prototype.setTabItem = function ( tabItem ) {
  * @param {OO.ui.TabOptionWidget} tabItem Tab option widget to set up
  * @chainable
  */
-OO.ui.CardLayout.prototype.setupTabItem = function () {
+OO.ui.TabPanelLayout.prototype.setupTabItem = function () {
        if ( this.label ) {
                this.tabItem.setLabel( this.label );
        }
@@ -1005,25 +1091,42 @@ OO.ui.CardLayout.prototype.setupTabItem = function () {
 };
 
 /**
- * Set the card to its 'active' state.
+ * Set the tab panel to its 'active' state.
  *
- * Cards become active when they are shown in a index layout that is configured to display only one card at a time. Additional
- * CSS is applied to the tab item to reflect the card's active state. Outside of the index
- * context, setting the active state on a card does nothing.
+ * Tab panels become active when they are shown in a index layout that is configured to display only
+ * one tab panel at a time. Additional CSS is applied to the tab item to reflect the tab panel's
+ * active state. Outside of the index context, setting the active state on a tab panel does nothing.
  *
- * @param {boolean} active Card is active
+ * @param {boolean} active Tab panel is active
  * @fires active
  */
-OO.ui.CardLayout.prototype.setActive = function ( active ) {
+OO.ui.TabPanelLayout.prototype.setActive = function ( active ) {
        active = !!active;
 
        if ( active !== this.active ) {
                this.active = active;
-               this.$element.toggleClass( 'oo-ui-cardLayout-active', this.active );
+               this.$element.toggleClass( 'oo-ui-tabPanelLayout-active', this.active );
                this.emit( 'active', this.active );
        }
 };
 
+/**
+ * The deprecated name for the TabPanelLayout, provided for backwards-compatibility.
+ *
+ * @class
+ * @extends OO.ui.TabPanelLayout
+ *
+ * @constructor
+ * @deprecated since v0.21.3
+ */
+OO.ui.CardLayout = function OoUiCardLayout() {
+       OO.ui.warnDeprecation( 'CardLayout has been renamed to TabPanel layout. Use that instead. See T155152' );
+       // Parent constructor
+       OO.ui.CardLayout.parent.apply( this, arguments );
+};
+
+OO.inheritClass( OO.ui.CardLayout, OO.ui.TabPanelLayout );
+
 /**
  * PageLayouts are used within {@link OO.ui.BookletLayout booklet layouts} to create pages that users can select and display
  * from the booklet's optional {@link OO.ui.OutlineSelectWidget outline} navigation. Pages are usually not instantiated directly,
@@ -2151,34 +2254,34 @@ OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
 };
 
 /**
- * IndexLayouts contain {@link OO.ui.CardLayout card layouts} as well as
- * {@link OO.ui.TabSelectWidget tabs} that allow users to easily navigate through the cards and
- * select which one to display. By default, only one card is displayed at a time. When a user
- * navigates to a new card, the index layout automatically focuses on the first focusable element,
+ * IndexLayouts contain {@link OO.ui.TabPanelLayout tab panel layouts} as well as
+ * {@link OO.ui.TabSelectWidget tabs} that allow users to easily navigate through the tab panels and
+ * select which one to display. By default, only one tab panel is displayed at a time. When a user
+ * navigates to a new tab panel, the index layout automatically focuses on the first focusable element,
  * unless the default setting is changed.
  *
  * TODO: This class is similar to BookletLayout, we may want to refactor to reduce duplication
  *
  *     @example
- *     // Example of a IndexLayout that contains two CardLayouts.
+ *     // Example of a IndexLayout that contains two TabPanelLayouts.
  *
- *     function CardOneLayout( name, config ) {
- *         CardOneLayout.parent.call( this, name, config );
- *         this.$element.append( '<p>First card</p>' );
+ *     function TabPanelOneLayout( name, config ) {
+ *         TabPanelOneLayout.parent.call( this, name, config );
+ *         this.$element.append( '<p>First tab panel</p>' );
  *     }
- *     OO.inheritClass( CardOneLayout, OO.ui.CardLayout );
- *     CardOneLayout.prototype.setupTabItem = function () {
- *         this.tabItem.setLabel( 'Card one' );
+ *     OO.inheritClass( TabPanelOneLayout, OO.ui.TabPanelLayout );
+ *     TabPanelOneLayout.prototype.setupTabItem = function () {
+ *         this.tabItem.setLabel( 'Tab panel one' );
  *     };
  *
- *     var card1 = new CardOneLayout( 'one' ),
- *         card2 = new OO.ui.CardLayout( 'two', { label: 'Card two' } );
+ *     var tabPanel1 = new TabPanelOneLayout( 'one' ),
+ *         tabPanel2 = new OO.ui.TabPanelLayout( 'two', { label: 'Tab panel two' } );
  *
- *     card2.$element.append( '<p>Second card</p>' );
+ *     tabPanel2.$element.append( '<p>Second tab panel</p>' );
  *
  *     var index = new OO.ui.IndexLayout();
  *
- *     index.addCards ( [ card1, card2 ] );
+ *     index.addTabPanels ( [ tabPanel1, tabPanel2 ] );
  *     $( 'body' ).append( index.$element );
  *
  * @class
@@ -2186,9 +2289,9 @@ OO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {boolean} [continuous=false] Show all cards, one after another
+ * @cfg {boolean} [continuous=false] Show all tab panels, 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. Disabled on mobile.
+ * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new tab panel is displayed. Disabled on mobile.
  */
 OO.ui.IndexLayout = function OoUiIndexLayout( config ) {
        // Configuration initialization
@@ -2198,8 +2301,37 @@ OO.ui.IndexLayout = function OoUiIndexLayout( config ) {
        OO.ui.IndexLayout.parent.call( this, config );
 
        // Properties
-       this.currentCardName = null;
-       this.cards = {};
+       this.currentTabPanelName = null;
+       this.tabPanels = {};
+
+       Object.defineProperty( this, 'currentCardName', {
+               // TODO: read documentation
+               configurable: true,
+               enumerable: true,
+               get: function () {
+                       OO.ui.warnDeprecation( 'IndexLayout\'s currentCardName property is deprecated. Use currentTabPanelName instead. See T155152' );
+                       return this.currentTabPanelName;
+               },
+               set: function ( value ) {
+                       OO.ui.warnDeprecation( 'IndexLayout\'s currentCardName property is deprecated. Use currentTabPanelName instead. See T155152' );
+                       this.currentTabPanelName = value;
+               }
+       } );
+
+       Object.defineProperty( this, 'cards', {
+               // TODO: read documentation
+               configurable: true,
+               enumerable: true,
+               get: function () {
+                       OO.ui.warnDeprecation( 'IndexLayout\'s cards property is deprecated. Use tabPanels instead. See T155152' );
+                       return this.tabPanels;
+               },
+               set: function ( value ) {
+                       OO.ui.warnDeprecation( 'IndexLayout\'s cards property is deprecated. Use tabPanels instead. See T155152' );
+                       this.tabPanels = value;
+               }
+       } );
+
        this.ignoreFocus = false;
        this.stackLayout = new OO.ui.StackLayout( {
                continuous: !!config.continuous,
@@ -2237,25 +2369,25 @@ OO.inheritClass( OO.ui.IndexLayout, OO.ui.MenuLayout );
 /* Events */
 
 /**
- * A 'set' event is emitted when a card is {@link #setCard set} to be displayed by the index layout.
+ * A 'set' event is emitted when a tab panel is {@link #setTabPanel set} to be displayed by the index layout.
  * @event set
- * @param {OO.ui.CardLayout} card Current card
+ * @param {OO.ui.TabPanelLayout} tabPanel Current tab panel
  */
 
 /**
- * An 'add' event is emitted when cards are {@link #addCards added} to the index layout.
+ * An 'add' event is emitted when tab panels are {@link #addTabPanels added} to the index layout.
  *
  * @event add
- * @param {OO.ui.CardLayout[]} card Added cards
- * @param {number} index Index cards were added at
+ * @param {OO.ui.TabPanelLayout[]} tabPanel Added tab panels
+ * @param {number} index Index tab panels were added at
  */
 
 /**
- * A 'remove' event is emitted when cards are {@link #clearCards cleared} or
- * {@link #removeCards removed} from the index.
+ * A 'remove' event is emitted when tab panels are {@link #clearTabPanels cleared} or
+ * {@link #removeTabPanels removed} from the index.
  *
  * @event remove
- * @param {OO.ui.CardLayout[]} cards Removed cards
+ * @param {OO.ui.TabPanelLayout[]} tabPanel Removed tab panels
  */
 
 /* Methods */
@@ -2264,17 +2396,17 @@ OO.inheritClass( OO.ui.IndexLayout, OO.ui.MenuLayout );
  * Handle stack layout focus.
  *
  * @private
- * @param {jQuery.Event} e Focusin event
+ * @param {jQuery.Event} e Focusing event
  */
 OO.ui.IndexLayout.prototype.onStackLayoutFocus = function ( e ) {
        var name, $target;
 
-       // Find the card that an element was focused within
-       $target = $( e.target ).closest( '.oo-ui-cardLayout' );
-       for ( name in this.cards ) {
-               // Check for card match, exclude current card to find only card changes
-               if ( this.cards[ name ].$element[ 0 ] === $target[ 0 ] && name !== this.currentCardName ) {
-                       this.setCard( name );
+       // Find the tab panel that an element was focused within
+       $target = $( e.target ).closest( '.oo-ui-tabPanelLayout' );
+       for ( name in this.tabPanels ) {
+               // Check for tab panel match, exclude current tab panel to find only tab panel changes
+               if ( this.tabPanels[ name ].$element[ 0 ] === $target[ 0 ] && name !== this.currentTabPanelName ) {
+                       this.setTabPanel( name );
                        break;
                }
        }
@@ -2284,12 +2416,12 @@ OO.ui.IndexLayout.prototype.onStackLayoutFocus = function ( e ) {
  * Handle stack layout set events.
  *
  * @private
- * @param {OO.ui.PanelLayout|null} card The card panel that is now the current panel
+ * @param {OO.ui.PanelLayout|null} tabPanel The tab panel that is now the current panel
  */
-OO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {
+OO.ui.IndexLayout.prototype.onStackLayoutSet = function ( tabPanel ) {
        var layout = this;
-       if ( card ) {
-               card.scrollElementIntoView().done( function () {
+       if ( tabPanel ) {
+               tabPanel.scrollElementIntoView().done( function () {
                        if ( layout.autoFocus && !OO.ui.isMobile() ) {
                                layout.focus();
                        }
@@ -2298,33 +2430,33 @@ OO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {
 };
 
 /**
- * Focus the first input in the current card.
+ * Focus the first input in the current tab panel.
  *
- * If no card is selected, the first selectable card will be selected.
- * If the focus is already in an element on the current card, nothing will happen.
+ * If no tab panel is selected, the first selectable tab panel will be selected.
+ * If the focus is already in an element on the current tab panel, nothing will happen.
  *
  * @param {number} [itemIndex] A specific item to focus on
  */
 OO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {
-       var card,
+       var tabPanel,
                items = this.stackLayout.getItems();
 
        if ( itemIndex !== undefined && items[ itemIndex ] ) {
-               card = items[ itemIndex ];
+               tabPanel = items[ itemIndex ];
        } else {
-               card = this.stackLayout.getCurrentItem();
+               tabPanel = this.stackLayout.getCurrentItem();
        }
 
-       if ( !card ) {
-               this.selectFirstSelectableCard();
-               card = this.stackLayout.getCurrentItem();
+       if ( !tabPanel ) {
+               this.selectFirstSelectableTabPanel();
+               tabPanel = this.stackLayout.getCurrentItem();
        }
-       if ( !card ) {
+       if ( !tabPanel ) {
                return;
        }
        // Only change the focus if is not already in the current page
-       if ( !OO.ui.contains( card.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {
-               card.focus();
+       if ( !OO.ui.contains( tabPanel.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {
+               tabPanel.focus();
        }
 };
 
@@ -2344,26 +2476,26 @@ OO.ui.IndexLayout.prototype.focusFirstFocusable = function () {
  */
 OO.ui.IndexLayout.prototype.onTabSelectWidgetSelect = function ( item ) {
        if ( item ) {
-               this.setCard( item.getData() );
+               this.setTabPanel( item.getData() );
        }
 };
 
 /**
- * Get the card closest to the specified card.
+ * Get the tab panel closest to the specified tab panel.
  *
- * @param {OO.ui.CardLayout} card Card to use as a reference point
- * @return {OO.ui.CardLayout|null} Card closest to the specified card
+ * @param {OO.ui.TabPanelLayout} tabPanel Tab panel to use as a reference point
+ * @return {OO.ui.TabPanelLayout|null} Tab panel closest to the specified
  */
-OO.ui.IndexLayout.prototype.getClosestCard = function ( card ) {
+OO.ui.IndexLayout.prototype.getClosestTabPanel = function ( tabPanel ) {
        var next, prev, level,
-               cards = this.stackLayout.getItems(),
-               index = cards.indexOf( card );
+               tabPanels = this.stackLayout.getItems(),
+               index = tabPanels.indexOf( tabPanel );
 
        if ( index !== -1 ) {
-               next = cards[ index + 1 ];
-               prev = cards[ index - 1 ];
-               // Prefer adjacent cards at the same level
-               level = this.tabSelectWidget.getItemFromData( card.getName() ).getLevel();
+               next = tabPanels[ index + 1 ];
+               prev = tabPanels[ index - 1 ];
+               // Prefer adjacent tab panels at the same level
+               level = this.tabSelectWidget.getItemFromData( tabPanel.getName() ).getLevel();
                if (
                        prev &&
                        level === this.tabSelectWidget.getItemFromData( prev.getName() ).getLevel()
@@ -2380,6 +2512,18 @@ OO.ui.IndexLayout.prototype.getClosestCard = function ( card ) {
        return prev || next || null;
 };
 
+/**
+ * Get the tab panel closest to the specified tab panel.
+ *
+ * @param {OO.ui.TabPanelLayout} tabPanel Tab panel to use as a reference point
+ * @return {OO.ui.TabPanelLayout|null} Tab panel closest to the specified
+ * @deprecated since v0.21.3, use `getClosestTabPanel` instead
+ */
+OO.ui.IndexLayout.prototype.getClosestCard = function ( tabPanel ) {
+       OO.ui.warnDeprecation( 'IndexLayout\'s getClosestCard method is deprecated. Use getClosestTabPanel instead. See T155152' );
+       return this.getClosestTabPanel( tabPanel );
+};
+
 /**
  * Get the tabs widget.
  *
@@ -2390,202 +2534,294 @@ OO.ui.IndexLayout.prototype.getTabs = function () {
 };
 
 /**
- * Get a card by its symbolic name.
+ * Get a tab panel by its symbolic name.
+ *
+ * @param {string} name Symbolic name of tab panel
+ * @return {OO.ui.TabPanelLayout|undefined} Tab panel, if found
+ */
+OO.ui.IndexLayout.prototype.getTabPanel = function ( name ) {
+       return this.tabPanels[ name ];
+};
+
+/**
+ * Get a tab panel by its symbolic name.
  *
- * @param {string} name Symbolic name of card
- * @return {OO.ui.CardLayout|undefined} Card, if found
+ * @param {string} name Symbolic name of tab panel
+ * @return {OO.ui.TabPanelLayout|undefined} Tab panel, if found
+ * @deprecated since v0.21.3, use `getTabPanel` instead
  */
 OO.ui.IndexLayout.prototype.getCard = function ( name ) {
-       return this.cards[ name ];
+       OO.ui.warnDeprecation( 'IndexLayout\'s getCard method is deprecated. Use getTabPanel instead. See T155152' );
+       return this.getTabPanel( name );
+};
+
+/**
+ * Get the current tab panel.
+ *
+ * @return {OO.ui.TabPanelLayout|undefined} Current tab panel, if found
+ */
+OO.ui.IndexLayout.prototype.getCurrentTabPanel = function () {
+       var name = this.getCurrentTabPanelName();
+       return name ? this.getTabPanel( name ) : undefined;
 };
 
 /**
- * Get the current card.
+ * Get the current tab panel.
  *
- * @return {OO.ui.CardLayout|undefined} Current card, if found
+ * @return {OO.ui.TabPanelLayout|undefined} Current tab panel, if found
+ * @deprecated since v0.21.3, use `getCurrentTabPanel` instead
  */
 OO.ui.IndexLayout.prototype.getCurrentCard = function () {
-       var name = this.getCurrentCardName();
-       return name ? this.getCard( name ) : undefined;
+       OO.ui.warnDeprecation( 'IndexLayout\'s getCurrentCard method is deprecated. Use getCurrentTabPanel instead. See T155152' );
+       return this.getCurrentTabPanel();
+};
+
+/**
+ * Get the symbolic name of the current tab panel.
+ *
+ * @return {string|null} Symbolic name of the current tab panel
+ */
+OO.ui.IndexLayout.prototype.getCurrentTabPanelName = function () {
+       return this.currentTabPanelName;
 };
 
 /**
- * Get the symbolic name of the current card.
+ * Get the symbolic name of the current tab panel.
  *
- * @return {string|null} Symbolic name of the current card
+ * @return {string|null} Symbolic name of the current tab panel
+ * @deprecated since v0.21.3, use `getCurrentTabPanelName` instead
  */
 OO.ui.IndexLayout.prototype.getCurrentCardName = function () {
-       return this.currentCardName;
+       OO.ui.warnDeprecation( 'IndexLayout\'s getCurrentCardName method is deprecated. Use getCurrentTabPanelName instead. See T155152' );
+       return this.getCurrentTabPanelName();
 };
 
 /**
- * Add cards to the index layout
+ * Add tab panels to the index layout
  *
- * When cards are added with the same names as existing cards, the existing cards will be
- * automatically removed before the new cards are added.
+ * When tab panels are added with the same names as existing tab panels, the existing tab panels
+ * will be automatically removed before the new tab panels are added.
  *
- * @param {OO.ui.CardLayout[]} cards Cards to add
+ * @param {OO.ui.TabPanelLayout[]} tabPanels Tab panels to add
  * @param {number} index Index of the insertion point
  * @fires add
  * @chainable
  */
-OO.ui.IndexLayout.prototype.addCards = function ( cards, index ) {
-       var i, len, name, card, item, currentIndex,
-               stackLayoutCards = this.stackLayout.getItems(),
+OO.ui.IndexLayout.prototype.addTabPanels = function ( tabPanels, index ) {
+       var i, len, name, tabPanel, item, currentIndex,
+               stackLayoutTabPanels = this.stackLayout.getItems(),
                remove = [],
                items = [];
 
-       // Remove cards with same names
-       for ( i = 0, len = cards.length; i < len; i++ ) {
-               card = cards[ i ];
-               name = card.getName();
+       // Remove tab panels with same names
+       for ( i = 0, len = tabPanels.length; i < len; i++ ) {
+               tabPanel = tabPanels[ i ];
+               name = tabPanel.getName();
 
-               if ( Object.prototype.hasOwnProperty.call( this.cards, name ) ) {
+               if ( Object.prototype.hasOwnProperty.call( this.tabPanels, name ) ) {
                        // Correct the insertion index
-                       currentIndex = stackLayoutCards.indexOf( this.cards[ name ] );
+                       currentIndex = stackLayoutTabPanels.indexOf( this.tabPanels[ name ] );
                        if ( currentIndex !== -1 && currentIndex + 1 < index ) {
                                index--;
                        }
-                       remove.push( this.cards[ name ] );
+                       remove.push( this.tabPanels[ name ] );
                }
        }
        if ( remove.length ) {
-               this.removeCards( remove );
+               this.removeTabPanels( remove );
        }
 
-       // Add new cards
-       for ( i = 0, len = cards.length; i < len; i++ ) {
-               card = cards[ i ];
-               name = card.getName();
-               this.cards[ card.getName() ] = card;
+       // Add new tab panels
+       for ( i = 0, len = tabPanels.length; i < len; i++ ) {
+               tabPanel = tabPanels[ i ];
+               name = tabPanel.getName();
+               this.tabPanels[ tabPanel.getName() ] = tabPanel;
                item = new OO.ui.TabOptionWidget( { data: name } );
-               card.setTabItem( item );
+               tabPanel.setTabItem( item );
                items.push( item );
        }
 
        if ( items.length ) {
                this.tabSelectWidget.addItems( items, index );
-               this.selectFirstSelectableCard();
+               this.selectFirstSelectableTabPanel();
        }
-       this.stackLayout.addItems( cards, index );
-       this.emit( 'add', cards, index );
+       this.stackLayout.addItems( tabPanels, index );
+       this.emit( 'add', tabPanels, index );
 
        return this;
 };
 
 /**
- * Remove the specified cards from the index layout.
+ * Add tab panels to the index layout
+ *
+ * When tab panels are added with the same names as existing tab panels, the existing tab panels
+ * will be automatically removed before the new tab panels are added.
+ *
+ * @param {OO.ui.TabPanelLayout[]} tabPanels Tab panels to add
+ * @param {number} index Index of the insertion point
+ * @fires add
+ * @chainable
+ * @deprecated since v0.21.3, use `addTabPanels` instead
+ */
+OO.ui.IndexLayout.prototype.addCards = function ( tabPanels, index ) {
+       OO.ui.warnDeprecation( 'IndexLayout\'s addCards method is deprecated. Use addTabPanels instead. See T155152' );
+       return this.addTabPanels( tabPanels, index );
+};
+
+/**
+ * Remove the specified tab panels from the index layout.
  *
- * To remove all cards from the index, you may wish to use the #clearCards method instead.
+ * To remove all tab panels from the index, you may wish to use the #clearTabPanels method instead.
  *
- * @param {OO.ui.CardLayout[]} cards An array of cards to remove
+ * @param {OO.ui.TabPanelLayout[]} tabPanels An array of tab panels to remove
  * @fires remove
  * @chainable
  */
-OO.ui.IndexLayout.prototype.removeCards = function ( cards ) {
-       var i, len, name, card,
+OO.ui.IndexLayout.prototype.removeTabPanels = function ( tabPanels ) {
+       var i, len, name, tabPanel,
                items = [];
 
-       for ( i = 0, len = cards.length; i < len; i++ ) {
-               card = cards[ i ];
-               name = card.getName();
-               delete this.cards[ name ];
+       for ( i = 0, len = tabPanels.length; i < len; i++ ) {
+               tabPanel = tabPanels[ i ];
+               name = tabPanel.getName();
+               delete this.tabPanels[ name ];
                items.push( this.tabSelectWidget.getItemFromData( name ) );
-               card.setTabItem( null );
+               tabPanel.setTabItem( null );
        }
        if ( items.length ) {
                this.tabSelectWidget.removeItems( items );
-               this.selectFirstSelectableCard();
+               this.selectFirstSelectableTabPanel();
        }
-       this.stackLayout.removeItems( cards );
-       this.emit( 'remove', cards );
+       this.stackLayout.removeItems( tabPanels );
+       this.emit( 'remove', tabPanels );
 
        return this;
 };
 
 /**
- * Clear all cards from the index layout.
+ * Remove the specified tab panels from the index layout.
  *
- * To remove only a subset of cards from the index, use the #removeCards method.
+ * To remove all tab panels from the index, you may wish to use the #clearTabPanels method instead.
  *
+ * @param {OO.ui.TabPanelLayout[]} tabPanels An array of tab panels to remove
  * @fires remove
  * @chainable
+ * @deprecated since v0.21.3, use `removeTabPanels` instead
  */
-OO.ui.IndexLayout.prototype.clearCards = function () {
+OO.ui.IndexLayout.prototype.removeCards = function ( tabPanels ) {
+       OO.ui.warnDeprecation( 'IndexLayout\'s removeCards method is deprecated. Use removeTabPanels instead. See T155152.' );
+       return this.removeTabPanels( tabPanels );
+};
+
+/**
+ * Clear all tab panels from the index layout.
+ *
+ * To remove only a subset of tab panels from the index, use the #removeTabPanels method.
+ *
+ * @fires remove
+ * @chainable
+ */
+OO.ui.IndexLayout.prototype.clearTabPanels = function () {
        var i, len,
-               cards = this.stackLayout.getItems();
+               tabPanels = this.stackLayout.getItems();
 
-       this.cards = {};
-       this.currentCardName = null;
+       this.tabPanels = {};
+       this.currentTabPanelName = null;
        this.tabSelectWidget.clearItems();
-       for ( i = 0, len = cards.length; i < len; i++ ) {
-               cards[ i ].setTabItem( null );
+       for ( i = 0, len = tabPanels.length; i < len; i++ ) {
+               tabPanels[ i ].setTabItem( null );
        }
        this.stackLayout.clearItems();
 
-       this.emit( 'remove', cards );
+       this.emit( 'remove', tabPanels );
 
        return this;
 };
 
 /**
- * Set the current card by symbolic name.
+ * Clear all tab panels from the index layout.
+ *
+ * To remove only a subset of tab panels from the index, use the #removeTabPanels method.
+ *
+ * @fires remove
+ * @chainable
+ * @deprecated since v0.21.3, use `clearTabPanels` instead
+ */
+OO.ui.IndexLayout.prototype.clearCards = function () {
+       OO.ui.warnDeprecation( 'IndexLayout\'s clearCards method is deprecated. Use clearTabPanels instead. See T155152.' );
+       return this.clearTabPanels();
+};
+
+/**
+ * Set the current tab panel by symbolic name.
  *
  * @fires set
- * @param {string} name Symbolic name of card
+ * @param {string} name Symbolic name of tab panel
  */
-OO.ui.IndexLayout.prototype.setCard = function ( name ) {
+OO.ui.IndexLayout.prototype.setTabPanel = function ( name ) {
        var selectedItem,
                $focused,
-               card = this.cards[ name ],
-               previousCard = this.currentCardName && this.cards[ this.currentCardName ];
+               tabPanel = this.tabPanels[ name ],
+               previousTabPanel = this.currentTabPanelName && this.tabPanels[ this.currentTabPanelName ];
 
-       if ( name !== this.currentCardName ) {
+       if ( name !== this.currentTabPanelName ) {
                selectedItem = this.tabSelectWidget.getSelectedItem();
                if ( selectedItem && selectedItem.getData() !== name ) {
                        this.tabSelectWidget.selectItemByData( name );
                }
-               if ( card ) {
-                       if ( previousCard ) {
-                               previousCard.setActive( false );
-                               // Blur anything focused if the next card doesn't have anything focusable.
-                               // This is not needed if the next card has something focusable (because once it is focused
+               if ( tabPanel ) {
+                       if ( previousTabPanel ) {
+                               previousTabPanel.setActive( false );
+                               // Blur anything focused if the next tab panel doesn't have anything focusable.
+                               // This is not needed if the next tab panel has something focusable (because once it is focused
                                // this blur happens automatically). If the layout is non-continuous, this check is
-                               // meaningless because the next card is not visible yet and thus can't hold focus.
+                               // meaningless because the next tab panel 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
+                                       OO.ui.findFocusable( tabPanel.$element ).length !== 0
                                ) {
-                                       $focused = previousCard.$element.find( ':focus' );
+                                       $focused = previousTabPanel.$element.find( ':focus' );
                                        if ( $focused.length ) {
                                                $focused[ 0 ].blur();
                                        }
                                }
                        }
-                       this.currentCardName = name;
-                       card.setActive( true );
-                       this.stackLayout.setItem( card );
-                       if ( !this.stackLayout.continuous && previousCard ) {
-                               // This should not be necessary, since any inputs on the previous card should have been
+                       this.currentTabPanelName = name;
+                       tabPanel.setActive( true );
+                       this.stackLayout.setItem( tabPanel );
+                       if ( !this.stackLayout.continuous && previousTabPanel ) {
+                               // This should not be necessary, since any inputs on the previous tab panel should have been
                                // blurred when it was hidden, but browsers are not very consistent about this.
-                               $focused = previousCard.$element.find( ':focus' );
+                               $focused = previousTabPanel.$element.find( ':focus' );
                                if ( $focused.length ) {
                                        $focused[ 0 ].blur();
                                }
                        }
-                       this.emit( 'set', card );
+                       this.emit( 'set', tabPanel );
                }
        }
 };
 
 /**
- * Select the first selectable card.
+ * Set the current tab panel by symbolic name.
+ *
+ * @fires set
+ * @param {string} name Symbolic name of tab panel
+ * @deprecated since v0.21.3, use `setTabPanel` instead
+ */
+OO.ui.IndexLayout.prototype.setCard = function ( name ) {
+       OO.ui.warnDeprecation( 'IndexLayout\'s setCard method is deprecated. Use setTabPanel instead. See T155152.' );
+       return this.setTabPanel( name );
+};
+
+/**
+ * Select the first selectable tab panel.
  *
  * @chainable
  */
-OO.ui.IndexLayout.prototype.selectFirstSelectableCard = function () {
+OO.ui.IndexLayout.prototype.selectFirstSelectableTabPanel = function () {
        if ( !this.tabSelectWidget.getSelectedItem() ) {
                this.tabSelectWidget.selectItem( this.tabSelectWidget.getFirstSelectableItem() );
        }
@@ -2593,6 +2829,17 @@ OO.ui.IndexLayout.prototype.selectFirstSelectableCard = function () {
        return this;
 };
 
+/**
+ * Select the first selectable tab panel.
+ *
+ * @chainable
+ * @deprecated since v0.21.3, use `selectFirstSelectableTabPanel` instead
+ */
+OO.ui.IndexLayout.prototype.selectFirstSelectableCard = function () {
+       OO.ui.warnDeprecation( 'IndexLayout\'s selectFirstSelectableCard method is deprecated. Use selectFirestSelectableTabPanel instead. See T155152.' );
+       return this.selectFirstSelectableTabPanel();
+};
+
 /**
  * ToggleWidget implements basic behavior of widgets with an on/off state.
  * Please see OO.ui.ToggleButtonWidget and OO.ui.ToggleSwitchWidget for examples.
@@ -2647,7 +2894,7 @@ OO.ui.ToggleWidget.prototype.getValue = function () {
 };
 
 /**
- * Set the state of the toggle: `true` for 'on', `false' for 'off'.
+ * Set the state of the toggle: `true` for 'on', `false` for 'off'.
  *
  * @param {boolean} value The state of the toggle
  * @fires change
@@ -2660,7 +2907,6 @@ OO.ui.ToggleWidget.prototype.setValue = function ( value ) {
                this.emit( 'change', value );
                this.$element.toggleClass( 'oo-ui-toggleWidget-on', value );
                this.$element.toggleClass( 'oo-ui-toggleWidget-off', !value );
-               this.$element.attr( 'aria-checked', value.toString() );
        }
        return this;
 };
@@ -2739,6 +2985,14 @@ OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TitledElement );
 OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.FlaggedElement );
 OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TabIndexedElement );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.ToggleButtonWidget.static.tagName = 'span';
+
 /* Methods */
 
 /**
@@ -2873,6 +3127,15 @@ OO.ui.ToggleSwitchWidget.prototype.onKeyPress = function ( e ) {
        }
 };
 
+/**
+ * @inheritdoc
+ */
+OO.ui.ToggleSwitchWidget.prototype.setValue = function ( value ) {
+       OO.ui.ToggleSwitchWidget.parent.prototype.setValue.call( this, value );
+       this.$element.attr( 'aria-checked', this.value.toString() );
+       return this;
+};
+
 /**
  * OutlineControlsWidget is a set of controls for an {@link OO.ui.OutlineSelectWidget outline select widget}.
  * Controls include moving items up and down, removing items, and adding different kinds of items.
@@ -3373,7 +3636,7 @@ OO.mixinClass( OO.ui.ButtonSelectWidget, OO.ui.mixin.TabIndexedElement );
  * TabOptionWidget is an item in a {@link OO.ui.TabSelectWidget TabSelectWidget}.
  *
  * Currently, this class is only used by {@link OO.ui.IndexLayout index layouts}, which contain
- * {@link OO.ui.CardLayout card layouts}. See {@link OO.ui.IndexLayout IndexLayout}
+ * {@link OO.ui.TabPanelLayout tab panel layouts}. See {@link OO.ui.IndexLayout IndexLayout}
  * for an example.
  *
  * @class
@@ -3542,13 +3805,6 @@ OO.ui.CapsuleItemWidget.prototype.onKeyDown = function ( e ) {
        }
 };
 
-/**
- * Focuses the capsule
- */
-OO.ui.CapsuleItemWidget.prototype.focus = function () {
-       this.$element.focus();
-};
-
 /**
  * CapsuleMultiselectWidgets are something like a {@link OO.ui.ComboBoxInputWidget combo box widget}
  * that allows for selecting multiple values.
@@ -3597,7 +3853,7 @@ OO.ui.CapsuleItemWidget.prototype.focus = function () {
  * @mixins OO.ui.mixin.IndicatorElement
  * @mixins OO.ui.mixin.IconElement
  * @uses OO.ui.CapsuleItemWidget
- * @uses OO.ui.FloatingMenuSelectWidget
+ * @uses OO.ui.MenuSelectWidget
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -3615,6 +3871,7 @@ OO.ui.CapsuleItemWidget.prototype.focus = function () {
  *  its containing `<div>`. The specified overlay layer is usually on top of
  *  the containing `<div>` and has a larger area. By default, the menu uses
  *  relative positioning.
+ *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.
  */
 OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config ) {
        var $tabFocus;
@@ -3643,11 +3900,7 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
                        align: 'forwards',
                        anchor: false
                } );
-               OO.ui.mixin.PopupElement.call( this, $.extend( true, {}, config, {
-                       popup: {
-                               $floatableContainer: this.$element
-                       }
-               } ) );
+               OO.ui.mixin.PopupElement.call( this, config );
                $tabFocus = $( '<span>' );
                OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: $tabFocus } ) );
        } else {
@@ -3663,11 +3916,11 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
        this.allowArbitrary = config.allowArbitrary;
        this.allowDuplicates = config.allowDuplicates;
        this.$overlay = config.$overlay;
-       this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend(
+       this.menu = new OO.ui.MenuSelectWidget( $.extend(
                {
                        widget: this,
                        $input: this.$input,
-                       $container: this.$element,
+                       $floatableContainer: this.$element,
                        filterFromInput: true,
                        disabled: this.isDisabled()
                },
@@ -3713,6 +3966,7 @@ OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config )
                this.$input.prop( 'disabled', this.isDisabled() );
                this.$input.attr( {
                        role: 'combobox',
+                       'aria-owns': this.menu.getElementId(),
                        'aria-autocomplete': 'list'
                } );
        }
@@ -3757,10 +4011,6 @@ OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.TabIndexedElement );
 OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.IndicatorElement );
 OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.IconElement );
 
-/* Static Properties */
-
-OO.ui.CapsuleMultiselectWidget.static.supportsSimpleLabel = true;
-
 /* Events */
 
 /**
@@ -3797,23 +4047,13 @@ OO.ui.CapsuleMultiselectWidget.prototype.createItemWidget = function ( data, lab
 };
 
 /**
- * Get the widget's input's id, or generate one, if it has an input.
- *
- * @return {string}
+ * @inheritdoc
  */
 OO.ui.CapsuleMultiselectWidget.prototype.getInputId = function () {
-       var id;
        if ( !this.$input ) {
-               return false;
-       }
-
-       id = this.$input.attr( 'id' );
-       if ( id === undefined ) {
-               id = OO.ui.generateElementId();
-               this.$input.attr( 'id', id );
+               return null;
        }
-
-       return id;
+       return OO.ui.mixin.TabIndexedElement.prototype.getInputId.call( this );
 };
 
 /**
@@ -3973,7 +4213,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.addItems = function ( items ) {
        }
        if ( !same ) {
                this.emit( 'change', this.getItemsData() );
-               this.updateIfHeightChanged();
+               this.updateInputSize();
        }
 
        return this;
@@ -4013,7 +4253,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.removeItems = function ( items ) {
        }
        if ( !same ) {
                this.emit( 'change', this.getItemsData() );
-               this.updateIfHeightChanged();
+               this.updateInputSize();
        }
 
        return this;
@@ -4026,7 +4266,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.clearItems = function () {
        if ( this.items.length ) {
                OO.ui.mixin.GroupElement.prototype.clearItems.call( this );
                this.emit( 'change', this.getItemsData() );
-               this.updateIfHeightChanged();
+               this.updateInputSize();
        }
        return this;
 };
@@ -4098,6 +4338,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.getMenu = function () {
  */
 OO.ui.CapsuleMultiselectWidget.prototype.onInputFocus = function () {
        if ( !this.isDisabled() ) {
+               this.updateInputSize();
                this.menu.toggle( true );
        }
 };
@@ -4239,6 +4480,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.updateInputSize = function () {
                currentWidth = this.$input.width();
 
                if ( contentWidth < currentWidth ) {
+                       this.updateIfHeightChanged();
                        // All is fine, don't perform expensive calculations
                        return;
                }
@@ -4260,6 +4502,8 @@ OO.ui.CapsuleMultiselectWidget.prototype.updateInputSize = function () {
                }
                this.$input.width( Math.floor( bestWidth ) );
                this.updateIfHeightChanged();
+       } else {
+               this.updateIfHeightChanged();
        }
 };
 
@@ -4273,6 +4517,9 @@ OO.ui.CapsuleMultiselectWidget.prototype.updateIfHeightChanged = function () {
        if ( height !== this.height ) {
                this.height = height;
                this.menu.position();
+               if ( this.popup ) {
+                       this.popup.updateDimensions();
+               }
                this.emit( 'resize' );
        }
 };
@@ -4360,7 +4607,6 @@ OO.ui.CapsuleMultiselectWidget.prototype.setDisabled = function ( disabled ) {
  * Focus the widget
  *
  * @chainable
- * @return {OO.ui.CapsuleMultiselectWidget}
  */
 OO.ui.CapsuleMultiselectWidget.prototype.focus = function () {
        if ( !this.isDisabled() ) {
@@ -4369,86 +4615,1477 @@ OO.ui.CapsuleMultiselectWidget.prototype.focus = function () {
                        this.popup.toggle( true );
                        OO.ui.findFocusable( this.popup.$element ).focus();
                } else {
-                       this.updateInputSize();
-                       this.menu.toggle( true );
-                       this.$input.focus();
+                       OO.ui.mixin.TabIndexedElement.prototype.focus.call( this );
                }
        }
        return this;
 };
 
 /**
- * The old name for the CapsuleMultiselectWidget widget, provided for backwards-compatibility.
+ * TagItemWidgets are used within a {@link OO.ui.TagMultiselectWidget
+ * TagMultiselectWidget} to display the selected items.
  *
  * @class
- * @extends OO.ui.CapsuleMultiselectWidget
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.mixin.ItemWidget
+ * @mixins OO.ui.mixin.LabelElement
+ * @mixins OO.ui.mixin.FlaggedElement
+ * @mixins OO.ui.mixin.TabIndexedElement
+ * @mixins OO.ui.mixin.DraggableElement
  *
  * @constructor
- * @deprecated since 0.17.3; use OO.ui.CapsuleMultiselectWidget instead
+ * @param {Object} [config] Configuration object
+ * @cfg {boolean} [valid=true] Item is valid
  */
-OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget() {
-       OO.ui.warnDeprecation( 'CapsuleMultiSelectWidget is deprecated. Use the CapsuleMultiselectWidget instead.' );
+OO.ui.TagItemWidget = function OoUiTagItemWidget( config ) {
+       config = config || {};
+
        // Parent constructor
-       OO.ui.CapsuleMultiSelectWidget.parent.apply( this, arguments );
+       OO.ui.TagItemWidget.parent.call( this, config );
+
+       // Mixin constructors
+       OO.ui.mixin.ItemWidget.call( this );
+       OO.ui.mixin.LabelElement.call( this, config );
+       OO.ui.mixin.FlaggedElement.call( this, config );
+       OO.ui.mixin.TabIndexedElement.call( this, config );
+       OO.ui.mixin.DraggableElement.call( this, config );
+
+       this.valid = config.valid === undefined ? true : !!config.valid;
+
+       this.closeButton = new OO.ui.ButtonWidget( {
+               framed: false,
+               indicator: 'clear',
+               tabIndex: -1
+       } );
+       this.closeButton.setDisabled( this.isDisabled() );
+
+       // Events
+       this.closeButton
+               .connect( this, { click: 'remove' } );
+       this.$element
+               .on( 'click', this.select.bind( this ) )
+               .on( 'keydown', this.onKeyDown.bind( this ) )
+               // Prevent propagation of mousedown; the tag item "lives" in the
+               // clickable area of the TagMultiselectWidget, which listens to
+               // mousedown to open the menu or popup. We want to prevent that
+               // for clicks specifically on the tag itself, so the actions taken
+               // are more deliberate. When the tag is clicked, it will emit the
+               // selection event (similar to how #OO.ui.MultioptionWidget emits 'change')
+               // and can be handled separately.
+               .on( 'mousedown', function ( e ) { e.stopPropagation(); } );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-tagItemWidget' )
+               .append( this.$label, this.closeButton.$element );
 };
 
-OO.inheritClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.CapsuleMultiselectWidget );
+/* Initialization */
+
+OO.inheritClass( OO.ui.TagItemWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.ItemWidget );
+OO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.LabelElement );
+OO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.FlaggedElement );
+OO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.TabIndexedElement );
+OO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.DraggableElement );
+
+/* Events */
 
 /**
- * SelectFileWidgets allow for selecting files, using the HTML5 File API. These
- * widgets can be configured with {@link OO.ui.mixin.IconElement icons} and {@link
- * OO.ui.mixin.IndicatorElement indicators}.
- * Please see the [OOjs UI documentation on MediaWiki] [1] for more information and examples.
+ * @event remove
  *
- *     @example
- *     // Example of a file select widget
- *     var selectFile = new OO.ui.SelectFileWidget();
- *     $( 'body' ).append( selectFile.$element );
+ * A remove action was performed on the item
+ */
+
+/**
+ * @event navigate
+ * @param {string} direction Direction of the movement, forward or backwards
  *
- * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets
+ * A navigate action was performed on the item
+ */
+
+/**
+ * @event select
  *
- * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.mixin.IconElement
- * @mixins OO.ui.mixin.IndicatorElement
- * @mixins OO.ui.mixin.PendingElement
- * @mixins OO.ui.mixin.LabelElement
+ * The tag widget was selected. This can occur when the widget
+ * is either clicked or enter was pressed on it.
+ */
+
+/**
+ * @event valid
+ * @param {boolean} isValid Item is valid
  *
- * @constructor
- * @param {Object} [config] Configuration options
- * @cfg {string[]|null} [accept=null] MIME types to accept. null accepts all types.
- * @cfg {string} [placeholder] Text to display when no file is selected.
- * @cfg {string} [notsupported] Text to display when file support is missing in the browser.
- * @cfg {boolean} [droppable=true] Whether to accept files by drag and drop.
- * @cfg {boolean} [showDropTarget=false] Whether to show a drop target. Requires droppable to be true.
- * @cfg {number} [thumbnailSizeLimit=20] File size limit in MiB above which to not try and show a
- *  preview (for performance)
+ * Item validity has changed
  */
-OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
-       var dragHandler;
 
-       // Configuration initialization
-       config = $.extend( {
-               accept: null,
-               placeholder: OO.ui.msg( 'ooui-selectfile-placeholder' ),
-               notsupported: OO.ui.msg( 'ooui-selectfile-not-supported' ),
-               droppable: true,
-               showDropTarget: false,
-               thumbnailSizeLimit: 20
-       }, config );
+/* Methods */
 
-       // Parent constructor
-       OO.ui.SelectFileWidget.parent.call( this, config );
+/**
+ * @inheritdoc
+ */
+OO.ui.TagItemWidget.prototype.setDisabled = function ( state ) {
+       // Parent method
+       OO.ui.TagItemWidget.parent.prototype.setDisabled.call( this, state );
 
-       // Mixin constructors
-       OO.ui.mixin.IconElement.call( this, config );
-       OO.ui.mixin.IndicatorElement.call( this, config );
-       OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$info } ) );
-       OO.ui.mixin.LabelElement.call( this, config );
+       if ( this.closeButton ) {
+               this.closeButton.setDisabled( state );
+       }
+       return this;
+};
 
-       // Properties
-       this.$info = $( '<span>' );
-       this.showDropTarget = config.showDropTarget;
+/**
+ * Handle removal of the item
+ *
+ * This is mainly for extensibility concerns, so other children
+ * of this class can change the behavior if they need to. This
+ * is called by both clicking the 'remove' button but also
+ * on keypress, which is harder to override if needed.
+ *
+ * @fires remove
+ */
+OO.ui.TagItemWidget.prototype.remove = function () {
+       if ( !this.isDisabled() ) {
+               this.emit( 'remove' );
+       }
+};
+
+/**
+ * Handle a keydown event on the widget
+ *
+ * @fires navigate
+ * @fires remove
+ * @param {jQuery.Event} e Key down event
+ * @return {boolean|undefined} false to stop the operation
+ */
+OO.ui.TagItemWidget.prototype.onKeyDown = function ( e ) {
+       var movement;
+
+       if ( e.keyCode === OO.ui.Keys.BACKSPACE || e.keyCode === OO.ui.Keys.DELETE ) {
+               this.remove();
+               return false;
+       } else if ( e.keyCode === OO.ui.Keys.ENTER ) {
+               this.select();
+               return false;
+       } else if (
+               e.keyCode === OO.ui.Keys.LEFT ||
+               e.keyCode === OO.ui.Keys.RIGHT
+       ) {
+               if ( OO.ui.Element.static.getDir( this.$element ) === 'rtl' ) {
+                       movement = {
+                               left: 'forwards',
+                               right: 'backwards'
+                       };
+               } else {
+                       movement = {
+                               left: 'backwards',
+                               right: 'forwards'
+                       };
+               }
+
+               this.emit(
+                       'navigate',
+                       e.keyCode === OO.ui.Keys.LEFT ?
+                               movement.left : movement.right
+               );
+       }
+};
+
+/**
+ * Select this item
+ *
+ * @fires select
+ */
+OO.ui.TagItemWidget.prototype.select = function () {
+       if ( !this.isDisabled() ) {
+               this.emit( 'select' );
+       }
+};
+
+/**
+ * Set the valid state of this item
+ *
+ * @param {boolean} [valid] Item is valid
+ * @fires valid
+ */
+OO.ui.TagItemWidget.prototype.toggleValid = function ( valid ) {
+       valid = valid === undefined ? !this.valid : !!valid;
+
+       if ( this.valid !== valid ) {
+               this.valid = valid;
+
+               this.setFlags( { invalid: !this.valid } );
+
+               this.emit( 'valid', this.valid );
+       }
+};
+
+/**
+ * Check whether the item is valid
+ *
+ * @return {boolean} Item is valid
+ */
+OO.ui.TagItemWidget.prototype.isValid = function () {
+       return this.valid;
+};
+
+/**
+ * A basic tag multiselect widget, similar in concept to {@link OO.ui.ComboBoxInputWidget combo box widget}
+ * that allows the user to add multiple values that are displayed in a tag area.
+ *
+ * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
+ *
+ * This widget is a base widget; see {@link OO.ui.MenuTagMultiselectWidget MenuTagMultiselectWidget} and
+ * {@link OO.ui.PopupTagMultiselectWidget PopupTagMultiselectWidget} for the implementations that use
+ * a menu and a popup respectively.
+ *
+ *     @example
+ *     // Example: A basic TagMultiselectWidget.
+ *     var widget = new OO.ui.TagMultiselectWidget( {
+ *         inputPosition: 'outline',
+ *         allowedValues: [ 'Option 1', 'Option 2', 'Option 3' ],
+ *         selected: [ 'Option 1' ]
+ *     } );
+ *     $( 'body' ).append( widget.$element );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.mixin.GroupWidget
+ * @mixins OO.ui.mixin.DraggableGroupElement
+ * @mixins OO.ui.mixin.IndicatorElement
+ * @mixins OO.ui.mixin.IconElement
+ * @mixins OO.ui.mixin.TabIndexedElement
+ * @mixins OO.ui.mixin.FlaggedElement
+ *
+ * @constructor
+ * @param {Object} config Configuration object
+ * @cfg {Object} [input] Configuration options for the input widget
+ * @cfg {OO.ui.InputWidget} [inputWidget] An optional input widget. If given, it will
+ *  replace the input widget used in the TagMultiselectWidget. If not given,
+ *  TagMultiselectWidget creates its own.
+ * @cfg {boolean} [inputPosition='inline'] Position of the input. Options are:
+ *     - inline: The input is invisible, but exists inside the tag list, so
+ *             the user types into the tag groups to add tags.
+ *     - outline: The input is underneath the tag area.
+ *     - none: No input supplied
+ * @cfg {boolean} [allowEditTags=true] Allow editing of the tags by clicking them
+ * @cfg {boolean} [allowArbitrary=false] Allow data items to be added even if
+ *  not present in the menu.
+ * @cfg {Object[]} [allowedValues] An array representing the allowed items
+ *  by their datas.
+ * @cfg {boolean} [allowDuplicates=false] Allow duplicate items to be added
+ * @cfg {boolean} [allowDisplayInvalidTags=false] Allow the display of
+ *  invalid tags. These tags will display with an invalid state, and
+ *  the widget as a whole will have an invalid state if any invalid tags
+ *  are present.
+ * @cfg {boolean} [allowReordering=true] Allow reordering of the items
+ * @cfg {Object[]|String[]} [selected] A set of selected tags. If given,
+ *  these will appear in the tag list on initialization, as long as they
+ *  pass the validity tests.
+ */
+OO.ui.TagMultiselectWidget = function OoUiTagMultiselectWidget( config ) {
+       var inputEvents,
+               rAF = window.requestAnimationFrame || setTimeout,
+               widget = this,
+               $tabFocus = $( '<span>' )
+                       .addClass( 'oo-ui-tagMultiselectWidget-focusTrap' );
+
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.TagMultiselectWidget.parent.call( this, config );
+
+       // Mixin constructors
+       OO.ui.mixin.GroupWidget.call( this, config );
+       OO.ui.mixin.IndicatorElement.call( this, config );
+       OO.ui.mixin.IconElement.call( this, config );
+       OO.ui.mixin.TabIndexedElement.call( this, config );
+       OO.ui.mixin.FlaggedElement.call( this, config );
+       OO.ui.mixin.DraggableGroupElement.call( this, config );
+
+       this.toggleDraggable(
+               config.allowReordering === undefined ?
+                       true : !!config.allowReordering
+       );
+
+       this.inputPosition = this.constructor.static.allowedInputPositions.indexOf( config.inputPosition ) > -1 ?
+                       config.inputPosition : 'inline';
+       this.allowEditTags = config.allowEditTags === undefined ? true : !!config.allowEditTags;
+       this.allowArbitrary = !!config.allowArbitrary;
+       this.allowDuplicates = !!config.allowDuplicates;
+       this.allowedValues = config.allowedValues || [];
+       this.allowDisplayInvalidTags = config.allowDisplayInvalidTags;
+       this.hasInput = this.inputPosition !== 'none';
+       this.height = null;
+       this.valid = true;
+
+       this.$content = $( '<div>' )
+               .addClass( 'oo-ui-tagMultiselectWidget-content' );
+       this.$handle = $( '<div>' )
+               .addClass( 'oo-ui-tagMultiselectWidget-handle' )
+               .append(
+                       this.$indicator,
+                       this.$icon,
+                       this.$content
+                               .append(
+                                       this.$group
+                                               .addClass( 'oo-ui-tagMultiselectWidget-group' )
+                               )
+               );
+
+       // Events
+       this.aggregate( {
+               remove: 'itemRemove',
+               navigate: 'itemNavigate',
+               select: 'itemSelect'
+       } );
+       this.connect( this, {
+               itemRemove: 'onTagRemove',
+               itemSelect: 'onTagSelect',
+               itemNavigate: 'onTagNavigate',
+               change: 'onChangeTags'
+       } );
+       this.$handle.on( {
+               mousedown: this.onMouseDown.bind( this )
+       } );
+
+       // Initialize
+       this.$element
+               .addClass( 'oo-ui-tagMultiselectWidget' )
+               .append( this.$handle );
+
+       if ( this.hasInput ) {
+               if ( config.inputWidget ) {
+                       this.input = config.inputWidget;
+               } else {
+                       this.input = new OO.ui.TextInputWidget( $.extend( {
+                               placeholder: config.placeholder,
+                               classes: [ 'oo-ui-tagMultiselectWidget-input' ]
+                       }, config.input ) );
+               }
+               this.input.setDisabled( this.isDisabled() );
+
+               inputEvents = {
+                       focus: this.onInputFocus.bind( this ),
+                       blur: this.onInputBlur.bind( this ),
+                       'propertychange change click mouseup keydown keyup input cut paste select focus':
+                               OO.ui.debounce( this.updateInputSize.bind( this ) ),
+                       keydown: this.onInputKeyDown.bind( this ),
+                       keypress: this.onInputKeyPress.bind( this )
+               };
+
+               this.input.$input.on( inputEvents );
+
+               if ( this.inputPosition === 'outline' ) {
+                       // Override max-height for the input widget
+                       // in the case the widget is outline so it can
+                       // stretch all the way if the widet is wide
+                       this.input.$element.css( 'max-width', 'inherit' );
+                       this.$element
+                               .addClass( 'oo-ui-tagMultiselectWidget-outlined' )
+                               .append( this.input.$element );
+               } else {
+                       this.$element.addClass( 'oo-ui-tagMultiselectWidget-inlined' );
+                       // HACK: When the widget is using 'inline' input, the
+                       // behavior needs to only use the $input itself
+                       // so we style and size it accordingly (otherwise
+                       // the styling and sizing can get very convoluted
+                       // when the wrapping divs and other elements)
+                       // We are taking advantage of still being able to
+                       // call the widget itself for operations like
+                       // .getValue() and setDisabled() and .focus() but
+                       // having only the $input attached to the DOM
+                       this.$content.append( this.input.$input );
+               }
+       } else {
+               this.$content.append( $tabFocus );
+       }
+
+       this.setTabIndexedElement(
+               this.hasInput ?
+                       this.input.$input :
+                       $tabFocus
+       );
+
+       if ( config.selected ) {
+               this.setValue( config.selected );
+       }
+
+       // HACK: Input size needs to be calculated after everything
+       // else is rendered
+       rAF( function () {
+               if ( widget.hasInput ) {
+                       widget.updateInputSize();
+               }
+       } );
+};
+
+/* Initialization */
+
+OO.inheritClass( OO.ui.TagMultiselectWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.GroupWidget );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.DraggableGroupElement );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.IndicatorElement );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.IconElement );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.TabIndexedElement );
+OO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.FlaggedElement );
+
+/* Static properties */
+
+/**
+ * Allowed input positions.
+ * - inline: The input is inside the tag list
+ * - outline: The input is under the tag list
+ * - none: There is no input
+ *
+ * @property {Array}
+ */
+OO.ui.TagMultiselectWidget.static.allowedInputPositions = [ 'inline', 'outline', 'none' ];
+
+/* Methods */
+
+/**
+ * Handle mouse down events.
+ *
+ * @private
+ * @param {jQuery.Event} e Mouse down event
+ * @return {boolean} False to prevent defaults
+ */
+OO.ui.TagMultiselectWidget.prototype.onMouseDown = function ( e ) {
+       if ( !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) {
+               this.focus();
+               return false;
+       }
+};
+
+/**
+ * Handle key press events.
+ *
+ * @private
+ * @param {jQuery.Event} e Key press event
+ * @return {boolean} Whether to prevent defaults
+ */
+OO.ui.TagMultiselectWidget.prototype.onInputKeyPress = function ( e ) {
+       var stopOrContinue,
+               withMetaKey = e.metaKey || e.ctrlKey;
+
+       if ( !this.isDisabled() ) {
+               if ( e.which === OO.ui.Keys.ENTER ) {
+                       stopOrContinue = this.doInputEnter( e, withMetaKey );
+               }
+
+               // Make sure the input gets resized.
+               setTimeout( this.updateInputSize.bind( this ), 0 );
+               return stopOrContinue;
+       }
+};
+
+/**
+ * Handle key down events.
+ *
+ * @private
+ * @param {jQuery.Event} e Key down event
+ * @return {boolean}
+ */
+OO.ui.TagMultiselectWidget.prototype.onInputKeyDown = function ( e ) {
+       var movement, direction,
+               withMetaKey = e.metaKey || e.ctrlKey;
+
+       if ( !this.isDisabled() ) {
+               // 'keypress' event is not triggered for Backspace
+               if ( e.keyCode === OO.ui.Keys.BACKSPACE ) {
+                       return this.doInputBackspace( e, withMetaKey );
+               } else if ( e.keyCode === OO.ui.Keys.ESCAPE ) {
+                       return this.doInputEscape( e );
+               } else if (
+                       e.keyCode === OO.ui.Keys.LEFT ||
+                       e.keyCode === OO.ui.Keys.RIGHT
+               ) {
+                       if ( OO.ui.Element.static.getDir( this.$element ) === 'rtl' ) {
+                               movement = {
+                                       left: 'forwards',
+                                       right: 'backwards'
+                               };
+                       } else {
+                               movement = {
+                                       left: 'backwards',
+                                       right: 'forwards'
+                               };
+                       }
+                       direction = e.keyCode === OO.ui.Keys.LEFT ?
+                               movement.left : movement.right;
+
+                       return this.doInputArrow( e, direction, withMetaKey );
+               }
+       }
+};
+
+/**
+ * Respond to input focus event
+ */
+OO.ui.TagMultiselectWidget.prototype.onInputFocus = function () {
+       this.$element.addClass( 'oo-ui-tagMultiselectWidget-focus' );
+};
+
+/**
+ * Respond to input blur event
+ */
+OO.ui.TagMultiselectWidget.prototype.onInputBlur = function () {
+       this.$element.removeClass( 'oo-ui-tagMultiselectWidget-focus' );
+};
+
+/**
+ * Perform an action after the enter key on the input
+ *
+ * @param {jQuery.Event} e Event data
+ * @param {boolean} [withMetaKey] Whether this key was pressed with
+ * a meta key like 'ctrl'
+ * @return {boolean} Whether to prevent defaults
+ */
+OO.ui.TagMultiselectWidget.prototype.doInputEnter = function () {
+       this.addTagFromInput();
+       return false;
+};
+
+/**
+ * Perform an action responding to the enter key on the input
+ *
+ * @param {jQuery.Event} e Event data
+ * @param {boolean} [withMetaKey] Whether this key was pressed with
+ * a meta key like 'ctrl'
+ * @return {boolean} Whether to prevent defaults
+ */
+OO.ui.TagMultiselectWidget.prototype.doInputBackspace = function ( e, withMetaKey ) {
+       var items, item;
+
+       if (
+               this.inputPosition === 'inline' &&
+               this.input.getValue() === '' &&
+               !this.isEmpty()
+       ) {
+               // Delete the last item
+               items = this.getItems();
+               item = items[ items.length - 1 ];
+               this.removeItems( [ item ] );
+               // If Ctrl/Cmd was pressed, delete item entirely.
+               // Otherwise put it into the text field for editing.
+               if ( !withMetaKey ) {
+                       this.input.setValue( item.getData() );
+               }
+
+               return false;
+       }
+};
+
+/**
+ * Perform an action after the escape key on the input
+ *
+ * @param {jQuery.Event} e Event data
+ */
+OO.ui.TagMultiselectWidget.prototype.doInputEscape = function () {
+       this.clearInput();
+};
+
+/**
+ * Perform an action after the arrow key on the input, select the previous
+ * or next item from the input.
+ * See #getPreviousItem and #getNextItem
+ *
+ * @param {jQuery.Event} e Event data
+ * @param {string} direction Direction of the movement; forwards or backwards
+ * @param {boolean} [withMetaKey] Whether this key was pressed with
+ *  a meta key like 'ctrl'
+ */
+OO.ui.TagMultiselectWidget.prototype.doInputArrow = function ( e, direction ) {
+       if (
+               this.inputPosition === 'inline' &&
+               !this.isEmpty()
+       ) {
+               if ( direction === 'backwards' ) {
+                       // Get previous item
+                       this.getPreviousItem().focus();
+               } else {
+                       // Get next item
+                       this.getNextItem().focus();
+               }
+       }
+};
+
+/**
+ * Respond to item select event
+ *
+ * @param {OO.ui.TagItemWidget} item Selected item
+ */
+OO.ui.TagMultiselectWidget.prototype.onTagSelect = function ( item ) {
+       if ( this.hasInput && this.allowEditTags ) {
+               if ( this.input.getValue() ) {
+                       this.addTagFromInput();
+               }
+               // 1. Get the label of the tag into the input
+               this.input.setValue( item.getData() );
+               // 2. Remove the tag
+               this.removeItems( [ item ] );
+               // 3. Focus the input
+               this.focus();
+       }
+};
+
+/**
+ * Respond to change event, where items were added, removed, or cleared.
+ */
+OO.ui.TagMultiselectWidget.prototype.onChangeTags = function () {
+       this.toggleValid( this.checkValidity() );
+       if ( this.hasInput ) {
+               this.updateInputSize();
+       }
+       this.updateIfHeightChanged();
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.TagMultiselectWidget.prototype.setDisabled = function ( isDisabled ) {
+       // Parent method
+       OO.ui.TagMultiselectWidget.parent.prototype.setDisabled.call( this, isDisabled );
+
+       if ( this.hasInput && this.input ) {
+               this.input.setDisabled( !!isDisabled );
+       }
+
+       if ( this.items ) {
+               this.getItems().forEach( function ( item ) {
+                       item.setDisabled( !!isDisabled );
+               } );
+       }
+};
+
+/**
+ * Respond to tag remove event
+ * @param {OO.ui.TagItemWidget} item Removed tag
+ */
+OO.ui.TagMultiselectWidget.prototype.onTagRemove = function ( item ) {
+       this.removeTagByData( item.getData() );
+};
+
+/**
+ * Respond to navigate event on the tag
+ *
+ * @param {OO.ui.TagItemWidget} item Removed tag
+ * @param {string} direction Direction of movement; 'forwards' or 'backwards'
+ */
+OO.ui.TagMultiselectWidget.prototype.onTagNavigate = function ( item, direction ) {
+       if ( direction === 'forwards' ) {
+               this.getNextItem( item ).focus();
+       } else {
+               this.getPreviousItem( item ).focus();
+       }
+};
+
+/**
+ * Add tag from input value
+ */
+OO.ui.TagMultiselectWidget.prototype.addTagFromInput = function () {
+       var val = this.input.getValue(),
+               isValid = this.isAllowedData( val );
+
+       if ( !val ) {
+               return;
+       }
+
+       if ( isValid || this.allowDisplayInvalidTags ) {
+               this.addTag( val );
+               this.clearInput();
+               this.focus();
+       }
+};
+
+/**
+ * Clear the input
+ */
+OO.ui.TagMultiselectWidget.prototype.clearInput = function () {
+       this.input.setValue( '' );
+};
+
+/**
+ * Check whether the given value is a duplicate of an existing
+ * tag already in the list.
+ *
+ * @param {string|Object} data Requested value
+ * @return {boolean} Value is duplicate
+ */
+OO.ui.TagMultiselectWidget.prototype.isDuplicateData = function ( data ) {
+       return !!this.getItemFromData( data );
+};
+
+/**
+ * Check whether a given value is allowed to be added
+ *
+ * @param {string|Object} data Requested value
+ * @return {boolean} Value is allowed
+ */
+OO.ui.TagMultiselectWidget.prototype.isAllowedData = function ( data ) {
+       if (
+               !this.allowDuplicates &&
+               this.isDuplicateData( data )
+       ) {
+               return false;
+       }
+
+       if ( this.allowArbitrary ) {
+               return true;
+       }
+
+       // Check with allowed values
+       if (
+               this.getAllowedValues().some( function ( value ) {
+                       return data === value;
+               } )
+       ) {
+               return true;
+       }
+
+       return false;
+};
+
+/**
+ * Get the allowed values list
+ *
+ * @return {string[]} Allowed data values
+ */
+OO.ui.TagMultiselectWidget.prototype.getAllowedValues = function () {
+       return this.allowedValues;
+};
+
+/**
+ * Add a value to the allowed values list
+ *
+ * @param {string} value Allowed data value
+ */
+OO.ui.TagMultiselectWidget.prototype.addAllowedValue = function ( value ) {
+       if ( this.allowedValues.indexOf( value ) === -1 ) {
+               this.allowedValues.push( value );
+       }
+};
+
+/**
+ * Get the datas of the currently selected items
+ *
+ * @return {string[]|Object[]} Datas of currently selected items
+ */
+OO.ui.TagMultiselectWidget.prototype.getValue = function () {
+       return this.getItems()
+               .filter( function ( item ) {
+                       return item.isValid();
+               } )
+               .map( function ( item ) {
+                       return item.getData();
+               } );
+};
+
+/**
+ * Set the value of this widget by datas.
+ *
+ * @param {string|string[]|Object|Object[]} valueObject An object representing the data
+ *  and label of the value. If the widget allows arbitrary values,
+ *  the items will be added as-is. Otherwise, the data value will
+ *  be checked against allowedValues.
+ *  This object must contain at least a data key. Example:
+ *  { data: 'foo', label: 'Foo item' }
+ *  For multiple items, use an array of objects. For example:
+ *   [
+ *      { data: 'foo', label: 'Foo item' },
+ *      { data: 'bar', label: 'Bar item' }
+ *      ]
+ *  Value can also be added with plaintext array, for example:
+ *  [ 'foo', 'bar', 'bla' ] or a single string, like 'foo'
+ */
+OO.ui.TagMultiselectWidget.prototype.setValue = function ( valueObject ) {
+       valueObject = Array.isArray( valueObject ) ? valueObject : [ valueObject ];
+
+       this.clearItems();
+       valueObject.forEach( function ( obj ) {
+               if ( typeof obj === 'string' ) {
+                       this.addTag( obj );
+               } else {
+                       this.addTag( obj.data, obj.label );
+               }
+       }.bind( this ) );
+};
+
+/**
+ * Add tag to the display area
+ *
+ * @param {string|Object} data Tag data
+ * @param {string} [label] Tag label. If no label is provided, the
+ *  stringified version of the data will be used instead.
+ * @return {boolean} Item was added successfully
+ */
+OO.ui.TagMultiselectWidget.prototype.addTag = function ( data, label ) {
+       var newItemWidget,
+               isValid = this.isAllowedData( data );
+
+       if ( isValid || this.allowDisplayInvalidTags ) {
+               newItemWidget = this.createTagItemWidget( data, label );
+               newItemWidget.toggleValid( isValid );
+               this.addItems( [ newItemWidget ] );
+               return true;
+       }
+       return false;
+};
+
+/**
+ * Remove tag by its data property.
+ *
+ * @param {string|Object} data Tag data
+ */
+OO.ui.TagMultiselectWidget.prototype.removeTagByData = function ( data ) {
+       var item = this.getItemFromData( data );
+
+       this.removeItems( [ item ] );
+};
+
+/**
+ * Construct a OO.ui.TagItemWidget (or a subclass thereof) from given label and data.
+ *
+ * @protected
+ * @param {string} data Item data
+ * @param {string} label The label text.
+ * @return {OO.ui.TagItemWidget}
+ */
+OO.ui.TagMultiselectWidget.prototype.createTagItemWidget = function ( data, label ) {
+       label = label || data;
+
+       return new OO.ui.TagItemWidget( { data: data, label: label } );
+};
+
+/**
+ * Given an item, returns the item after it. If the item is already the
+ * last item, return `this.input`. If no item is passed, returns the
+ * very first item.
+ *
+ * @protected
+ * @param {OO.ui.TagItemWidget} [item] Tag item
+ * @return {OO.ui.Widget} The next widget available.
+ */
+OO.ui.TagMultiselectWidget.prototype.getNextItem = function ( item ) {
+       var itemIndex = this.items.indexOf( item );
+
+       if ( item === undefined || itemIndex === -1 ) {
+               return this.items[ 0 ];
+       }
+
+       if ( itemIndex === this.items.length - 1 ) { // Last item
+               if ( this.hasInput ) {
+                       return this.input;
+               } else {
+                       // Return first item
+                       return this.items[ 0 ];
+               }
+       } else {
+               return this.items[ itemIndex + 1 ];
+       }
+};
+
+/**
+ * Given an item, returns the item before it. If the item is already the
+ * first item, return `this.input`. If no item is passed, returns the
+ * very last item.
+ *
+ * @protected
+ * @param {OO.ui.TagItemWidget} [item] Tag item
+ * @return {OO.ui.Widget} The previous widget available.
+ */
+OO.ui.TagMultiselectWidget.prototype.getPreviousItem = function ( item ) {
+       var itemIndex = this.items.indexOf( item );
+
+       if ( item === undefined || itemIndex === -1 ) {
+               return this.items[ this.items.length - 1 ];
+       }
+
+       if ( itemIndex === 0 ) {
+               if ( this.hasInput ) {
+                       return this.input;
+               } else {
+                       // Return the last item
+                       return this.items[ this.items.length - 1 ];
+               }
+       } else {
+               return this.items[ itemIndex - 1 ];
+       }
+};
+
+/**
+ * Update the dimensions of the text input field to encompass all available area.
+ * This is especially relevant for when the input is at the edge of a line
+ * and should get smaller. The usual operation (as an inline-block with min-width)
+ * does not work in that case, pushing the input downwards to the next line.
+ *
+ * @private
+ */
+OO.ui.TagMultiselectWidget.prototype.updateInputSize = function () {
+       var $lastItem, direction, contentWidth, currentWidth, bestWidth;
+       if ( this.inputPosition === 'inline' && !this.isDisabled() ) {
+               this.input.$input.css( 'width', '1em' );
+               $lastItem = this.$group.children().last();
+               direction = OO.ui.Element.static.getDir( this.$handle );
+
+               // Get the width of the input with the placeholder text as
+               // the value and save it so that we don't keep recalculating
+               if (
+                       this.contentWidthWithPlaceholder === undefined &&
+                       this.input.getValue() === '' &&
+                       this.input.$input.attr( 'placeholder' ) !== undefined
+               ) {
+                       this.input.setValue( this.input.$input.attr( 'placeholder' ) );
+                       this.contentWidthWithPlaceholder = this.input.$input[ 0 ].scrollWidth;
+                       this.input.setValue( '' );
+
+               }
+
+               // Always keep the input wide enough for the placeholder text
+               contentWidth = Math.max(
+                       this.input.$input[ 0 ].scrollWidth,
+                       // undefined arguments in Math.max lead to NaN
+                       ( this.contentWidthWithPlaceholder === undefined ) ?
+                               0 : this.contentWidthWithPlaceholder
+               );
+               currentWidth = this.input.$input.width();
+
+               if ( contentWidth < currentWidth ) {
+                       this.updateIfHeightChanged();
+                       // All is fine, don't perform expensive calculations
+                       return;
+               }
+
+               if ( $lastItem.length === 0 ) {
+                       bestWidth = this.$content.innerWidth();
+               } else {
+                       bestWidth = direction === 'ltr' ?
+                               this.$content.innerWidth() - $lastItem.position().left - $lastItem.outerWidth() :
+                               $lastItem.position().left;
+               }
+
+               // Some safety margin for sanity, because I *really* don't feel like finding out where the few
+               // pixels this is off by are coming from.
+               bestWidth -= 10;
+               if ( contentWidth > bestWidth ) {
+                       // This will result in the input getting shifted to the next line
+                       bestWidth = this.$content.innerWidth() - 10;
+               }
+               this.input.$input.width( Math.floor( bestWidth ) );
+               this.updateIfHeightChanged();
+       } else {
+               this.updateIfHeightChanged();
+       }
+};
+
+/**
+ * Determine if widget height changed, and if so,
+ * emit the resize event. This is useful for when there are either
+ * menus or popups attached to the bottom of the widget, to allow
+ * them to change their positioning in case the widget moved down
+ * or up.
+ *
+ * @private
+ */
+OO.ui.TagMultiselectWidget.prototype.updateIfHeightChanged = function () {
+       var height = this.$element.height();
+       if ( height !== this.height ) {
+               this.height = height;
+               this.emit( 'resize' );
+       }
+};
+
+/**
+ * Check whether all items in the widget are valid
+ *
+ * @return {boolean} Widget is valid
+ */
+OO.ui.TagMultiselectWidget.prototype.checkValidity = function () {
+       return this.getItems().every( function ( item ) {
+               return item.isValid();
+       } );
+};
+
+/**
+ * Set the valid state of this item
+ *
+ * @param {boolean} [valid] Item is valid
+ * @fires valid
+ */
+OO.ui.TagMultiselectWidget.prototype.toggleValid = function ( valid ) {
+       valid = valid === undefined ? !this.valid : !!valid;
+
+       if ( this.valid !== valid ) {
+               this.valid = valid;
+
+               this.setFlags( { invalid: !this.valid } );
+
+               this.emit( 'valid', this.valid );
+       }
+};
+
+/**
+ * Get the current valid state of the widget
+ *
+ * @return {boolean} Widget is valid
+ */
+OO.ui.TagMultiselectWidget.prototype.isValid = function () {
+       return this.valid;
+};
+
+/**
+ * PopupTagMultiselectWidget is a {@link OO.ui.TagMultiselectWidget OO.ui.TagMultiselectWidget} intended
+ * to use a popup. The popup can be configured to have a default input to insert values into the widget.
+ *
+ * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
+ *
+ *     @example
+ *     // Example: A basic PopupTagMultiselectWidget.
+ *     var widget = new OO.ui.PopupTagMultiselectWidget();
+ *     $( 'body' ).append( widget.$element );
+ *
+ *     // Example: A PopupTagMultiselectWidget with an external popup.
+ *     var popupInput = new OO.ui.TextInputWidget(),
+ *         widget = new OO.ui.PopupTagMultiselectWidget( {
+ *            popupInput: popupInput,
+ *            popup: {
+ *               $content: popupInput.$element
+ *            }
+ *         } );
+ *     $( 'body' ).append( widget.$element );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
+ *
+ * @class
+ * @extends OO.ui.TagMultiselectWidget
+ * @mixins OO.ui.mixin.PopupElement
+ *
+ * @param {Object} config Configuration object
+ * @cfg {jQuery} [$overlay] An overlay for the popup.
+ *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.
+ * @cfg {Object} [popup] Configuration options for the popup
+ * @cfg {OO.ui.InputWidget} [popupInput] An input widget inside the popup that will be
+ *  focused when the popup is opened and will be used as replacement for the
+ *  general input in the widget.
+ */
+OO.ui.PopupTagMultiselectWidget = function OoUiPopupTagMultiselectWidget( config ) {
+       var defaultInput,
+               defaultConfig = { popup: {} };
+
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.PopupTagMultiselectWidget.parent.call( this, $.extend( { inputPosition: 'none' }, config ) );
+
+       this.$overlay = config.$overlay || this.$element;
+
+       if ( !config.popup ) {
+               // For the default base implementation, we give a popup
+               // with an input widget inside it. For any other use cases
+               // the popup needs to be populated externally and the
+               // event handled to add tags separately and manually
+               defaultInput = new OO.ui.TextInputWidget();
+
+               defaultConfig.popupInput = defaultInput;
+               defaultConfig.popup.$content = defaultInput.$element;
+
+               this.$element.addClass( 'oo-ui-popupTagMultiselectWidget-defaultPopup' );
+       }
+
+       // Add overlay, and add that to the autoCloseIgnore
+       defaultConfig.popup.$overlay = this.$overlay;
+       defaultConfig.popup.$autoCloseIgnore = this.hasInput ?
+               this.input.$element.add( this.$overlay ) : this.$overlay;
+
+       // Allow extending any of the above
+       config = $.extend( defaultConfig, config );
+
+       // Mixin constructors
+       OO.ui.mixin.PopupElement.call( this, config );
+
+       if ( this.hasInput ) {
+               this.input.$input.on( 'focus', this.popup.toggle.bind( this.popup, true ) );
+       }
+
+       // Configuration options
+       this.popupInput = config.popupInput;
+       if ( this.popupInput ) {
+               this.popupInput.connect( this, {
+                       enter: 'onPopupInputEnter'
+               } );
+       }
+
+       // Events
+       this.on( 'resize', this.popup.updateDimensions.bind( this.popup ) );
+       this.popup.connect( this, { toggle: 'onPopupToggle' } );
+       this.$tabIndexed
+               .on( 'focus', this.onFocus.bind( this ) );
+
+       // Initialize
+       this.$element
+               .append( this.popup.$element )
+               .addClass( 'oo-ui-popupTagMultiselectWidget' );
+};
+
+/* Initialization */
+
+OO.inheritClass( OO.ui.PopupTagMultiselectWidget, OO.ui.TagMultiselectWidget );
+OO.mixinClass( OO.ui.PopupTagMultiselectWidget, OO.ui.mixin.PopupElement );
+
+/* Methods */
+
+/**
+ * Focus event handler.
+ *
+ * @private
+ */
+OO.ui.PopupTagMultiselectWidget.prototype.onFocus = function () {
+       this.popup.toggle( true );
+};
+
+/**
+ * Respond to popup toggle event
+ *
+ * @param {boolean} isVisible Popup is visible
+ */
+OO.ui.PopupTagMultiselectWidget.prototype.onPopupToggle = function ( isVisible ) {
+       if ( isVisible && this.popupInput ) {
+               this.popupInput.focus();
+       }
+};
+
+/**
+ * Respond to popup input enter event
+ */
+OO.ui.PopupTagMultiselectWidget.prototype.onPopupInputEnter = function () {
+       if ( this.popupInput ) {
+               this.addTagByPopupValue( this.popupInput.getValue() );
+               this.popupInput.setValue( '' );
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.PopupTagMultiselectWidget.prototype.onTagSelect = function ( item ) {
+       if ( this.popupInput && this.allowEditTags ) {
+               this.popupInput.setValue( item.getData() );
+               this.removeItems( [ item ] );
+
+               this.popup.toggle( true );
+               this.popupInput.focus();
+       } else {
+               // Parent
+               OO.ui.PopupTagMultiselectWidget.parent.prototype.onTagSelect.call( this, item );
+       }
+};
+
+/**
+ * Add a tag by the popup value.
+ * Whatever is responsible for setting the value in the popup should call
+ * this method to add a tag, or use the regular methods like #addTag or
+ * #setValue directly.
+ *
+ * @param {string} data The value of item
+ * @param {string} [label] The label of the tag. If not given, the data is used.
+ */
+OO.ui.PopupTagMultiselectWidget.prototype.addTagByPopupValue = function ( data, label ) {
+       this.addTag( data, label );
+};
+
+/**
+ * MenuTagMultiselectWidget is a {@link OO.ui.TagMultiselectWidget OO.ui.TagMultiselectWidget} intended
+ * to use a menu of selectable options.
+ *
+ * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
+ *
+ *     @example
+ *     // Example: A basic MenuTagMultiselectWidget.
+ *     var widget = new OO.ui.MenuTagMultiselectWidget( {
+ *         inputPosition: 'outline',
+ *         options: [
+ *            { data: 'option1', label: 'Option 1' },
+ *            { data: 'option2', label: 'Option 2' },
+ *            { data: 'option3', label: 'Option 3' },
+ *         ],
+ *         selected: [ 'option1', 'option2' ]
+ *     } );
+ *     $( 'body' ).append( widget.$element );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
+ *
+ * @class
+ * @extends OO.ui.TagMultiselectWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration object
+ * @cfg {Object} [menu] Configuration object for the menu widget
+ * @cfg {jQuery} [$overlay] An overlay for the menu.
+ *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.
+ * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`
+ */
+OO.ui.MenuTagMultiselectWidget = function OoUiMenuTagMultiselectWidget( config ) {
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.MenuTagMultiselectWidget.parent.call( this, config );
+
+       this.$overlay = config.$overlay || this.$element;
+
+       this.menu = this.createMenuWidget( $.extend( {
+               widget: this,
+               input: this.hasInput ? this.input : null,
+               $input: this.hasInput ? this.input.$input : null,
+               filterFromInput: !!this.hasInput,
+               $autoCloseIgnore: this.hasInput ?
+                       this.input.$element.add( this.$overlay ) : this.$overlay,
+               $floatableContainer: this.hasInput && this.inputPosition === 'outline' ?
+                       this.input.$element : this.$element,
+               $overlay: this.$overlay,
+               disabled: this.isDisabled()
+       }, config.menu ) );
+       this.addOptions( config.options || [] );
+
+       // Events
+       this.menu.connect( this, {
+               choose: 'onMenuChoose',
+               toggle: 'onMenuToggle'
+       } );
+       if ( this.hasInput ) {
+               this.input.connect( this, { change: 'onInputChange' } );
+       }
+       this.connect( this, { resize: 'onResize' } );
+
+       // Initialization
+       this.$overlay
+               .append( this.menu.$element );
+       this.$element
+               .addClass( 'oo-ui-menuTagMultiselectWidget' );
+};
+
+/* Initialization */
+
+OO.inheritClass( OO.ui.MenuTagMultiselectWidget, OO.ui.TagMultiselectWidget );
+
+/* Methods */
+
+/**
+ * Respond to resize event
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onResize = function () {
+       // Reposition the menu
+       this.menu.position();
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onInputFocus = function () {
+       // Parent method
+       OO.ui.MenuTagMultiselectWidget.parent.prototype.onInputFocus.call( this );
+
+       this.menu.toggle( true );
+};
+
+/**
+ * Respond to input change event
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onInputChange = function () {
+       this.menu.toggle( true );
+};
+
+/**
+ * Respond to menu choose event
+ *
+ * @param {OO.ui.OptionWidget} menuItem Chosen menu item
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onMenuChoose = function ( menuItem ) {
+       // Add tag
+       this.addTag( menuItem.getData(), menuItem.getLabel() );
+};
+
+/**
+ * Respond to menu toggle event. Reset item highlights on hide.
+ *
+ * @param {boolean} isVisible The menu is visible
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onMenuToggle = function ( isVisible ) {
+       if ( !isVisible ) {
+               this.menu.selectItem( null );
+               this.menu.highlightItem( null );
+       }
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.onTagSelect = function ( tagItem ) {
+       var menuItem = this.menu.getItemFromData( tagItem.getData() );
+       // Override the base behavior from TagMultiselectWidget; the base behavior
+       // in TagMultiselectWidget is to remove the tag to edit it in the input,
+       // but in our case, we want to utilize the menu selection behavior, and
+       // definitely not remove the item.
+
+       // Select the menu item
+       this.menu.selectItem( menuItem );
+
+       this.focus();
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.addTagFromInput = function () {
+       var inputValue = this.input.getValue(),
+               highlightedItem = this.menu.getHighlightedItem(),
+               item = this.menu.getItemFromData( inputValue );
+
+       // Override the parent method so we add from the menu
+       // rather than directly from the input
+
+       // Look for a highlighted item first
+       if ( highlightedItem ) {
+               this.addTag( highlightedItem.getData(), highlightedItem.getLabel() );
+       } else if ( item ) {
+               // Look for the element that fits the data
+               this.addTag( item.getData(), item.getLabel() );
+       } else {
+               // Otherwise, add the tag - the method will only add if the
+               // tag is valid or if invalid tags are allowed
+               this.addTag( inputValue );
+       }
+};
+
+/**
+ * Return the visible items in the menu. This is mainly used for when
+ * the menu is filtering results.
+ *
+ * @return {OO.ui.MenuOptionWidget[]} Visible results
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.getMenuVisibleItems = function () {
+       return this.menu.getItems().filter( function ( menuItem ) {
+               return menuItem.isVisible();
+       } );
+};
+
+/**
+ * Create the menu for this widget. This is in a separate method so that
+ * child classes can override this without polluting the constructor with
+ * unnecessary extra objects that will be overidden.
+ *
+ * @param {Object} menuConfig Configuration options
+ * @return {OO.ui.MenuSelectWidget} Menu widget
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.createMenuWidget = function ( menuConfig ) {
+       return new OO.ui.MenuSelectWidget( menuConfig );
+};
+
+/**
+ * Add options to the menu
+ *
+ * @param {Object[]} menuOptions Object defining options
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.addOptions = function ( menuOptions ) {
+       var widget = this,
+               items = menuOptions.map( function ( obj ) {
+                       return widget.createMenuOptionWidget( obj.data, obj.label );
+               } );
+
+       this.menu.addItems( items );
+};
+
+/**
+ * Create a menu option widget.
+ *
+ * @param {string} data Item data
+ * @param {string} [label] Item label
+ * @return {OO.ui.OptionWidget} Option widget
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.createMenuOptionWidget = function ( data, label ) {
+       return new OO.ui.MenuOptionWidget( {
+               data: data,
+               label: label || data
+       } );
+};
+
+/**
+ * Get the menu
+ *
+ * @return {OO.ui.MenuSelectWidget} Menu
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.getMenu = function () {
+       return this.menu;
+};
+
+/**
+ * Get the allowed values list
+ *
+ * @return {string[]} Allowed data values
+ */
+OO.ui.MenuTagMultiselectWidget.prototype.getAllowedValues = function () {
+       var menuDatas = this.menu.getItems().map( function ( menuItem ) {
+               return menuItem.getData();
+       } );
+       return this.allowedValues.concat( menuDatas );
+};
+
+/**
+ * SelectFileWidgets allow for selecting files, using the HTML5 File API. These
+ * widgets can be configured with {@link OO.ui.mixin.IconElement icons} and {@link
+ * OO.ui.mixin.IndicatorElement indicators}.
+ * Please see the [OOjs UI documentation on MediaWiki] [1] for more information and examples.
+ *
+ *     @example
+ *     // Example of a file select widget
+ *     var selectFile = new OO.ui.SelectFileWidget();
+ *     $( 'body' ).append( selectFile.$element );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.mixin.IconElement
+ * @mixins OO.ui.mixin.IndicatorElement
+ * @mixins OO.ui.mixin.PendingElement
+ * @mixins OO.ui.mixin.LabelElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {string[]|null} [accept=null] MIME types to accept. null accepts all types.
+ * @cfg {string} [placeholder] Text to display when no file is selected.
+ * @cfg {string} [notsupported] Text to display when file support is missing in the browser.
+ * @cfg {boolean} [droppable=true] Whether to accept files by drag and drop.
+ * @cfg {boolean} [showDropTarget=false] Whether to show a drop target. Requires droppable to be true.
+ * @cfg {number} [thumbnailSizeLimit=20] File size limit in MiB above which to not try and show a
+ *  preview (for performance)
+ */
+OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
+       var dragHandler;
+
+       // Configuration initialization
+       config = $.extend( {
+               accept: null,
+               placeholder: OO.ui.msg( 'ooui-selectfile-placeholder' ),
+               notsupported: OO.ui.msg( 'ooui-selectfile-not-supported' ),
+               droppable: true,
+               showDropTarget: false,
+               thumbnailSizeLimit: 20
+       }, config );
+
+       // Parent constructor
+       OO.ui.SelectFileWidget.parent.call( this, config );
+
+       // Mixin constructors
+       OO.ui.mixin.IconElement.call( this, config );
+       OO.ui.mixin.IndicatorElement.call( this, config );
+       OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$info } ) );
+       OO.ui.mixin.LabelElement.call( this, config );
+
+       // Properties
+       this.$info = $( '<span>' );
+       this.showDropTarget = config.showDropTarget;
        this.thumbnailSizeLimit = config.thumbnailSizeLimit;
        this.isSupported = this.constructor.static.isSupported();
        this.currentFile = null;
@@ -4592,7 +6229,17 @@ OO.ui.SelectFileWidget.prototype.setValue = function ( file ) {
  * @chainable
  */
 OO.ui.SelectFileWidget.prototype.focus = function () {
-       this.selectButton.$button[ 0 ].focus();
+       this.selectButton.focus();
+       return this;
+};
+
+/**
+ * Blur the widget.
+ *
+ * @chainable
+ */
+OO.ui.SelectFileWidget.prototype.blur = function () {
+       this.selectButton.blur();
        return this;
 };
 
@@ -5045,14 +6692,13 @@ OO.ui.SearchWidget.prototype.getResults = function () {
  *     $( 'body' ).append( numberInput.$element );
  *
  * @class
- * @extends OO.ui.Widget
+ * @extends OO.ui.TextInputWidget
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {Object} [input] Configuration options to pass to the {@link OO.ui.TextInputWidget text input widget}.
  * @cfg {Object} [minusButton] Configuration options to pass to the {@link OO.ui.ButtonWidget decrementing button widget}.
  * @cfg {Object} [plusButton] Configuration options to pass to the {@link OO.ui.ButtonWidget incrementing button widget}.
- * @cfg {boolean} [isInteger=false] Whether the field accepts only integer values.
+ * @cfg {boolean} [allowInteger=false] Whether the field accepts only integer values.
  * @cfg {number} [min=-Infinity] Minimum allowed value
  * @cfg {number} [max=Infinity] Maximum allowed value
  * @cfg {number} [step=1] Delta when using the buttons or up/down arrow keys
@@ -5060,9 +6706,12 @@ OO.ui.SearchWidget.prototype.getResults = function () {
  * @cfg {boolean} [showButtons=true] Whether to show the plus and minus buttons.
  */
 OO.ui.NumberInputWidget = function OoUiNumberInputWidget( config ) {
+       var $field = $( '<div>' )
+               .addClass( 'oo-ui-numberInputWidget-field' );
+
        // Configuration initialization
        config = $.extend( {
-               isInteger: false,
+               allowInteger: false,
                min: -Infinity,
                max: Infinity,
                step: 1,
@@ -5070,17 +6719,15 @@ OO.ui.NumberInputWidget = function OoUiNumberInputWidget( config ) {
                showButtons: true
        }, config );
 
+       // For backward compatibility
+       $.extend( config, config.input );
+       this.input = this;
+
        // Parent constructor
-       OO.ui.NumberInputWidget.parent.call( this, config );
+       OO.ui.NumberInputWidget.parent.call( this, $.extend( config, {
+               type: 'number'
+       } ) );
 
-       // Properties
-       this.input = new OO.ui.TextInputWidget( $.extend(
-               {
-                       disabled: this.isDisabled(),
-                       type: 'number'
-               },
-               config.input
-       ) );
        if ( config.showButtons ) {
                this.minusButton = new OO.ui.ButtonWidget( $.extend(
                        {
@@ -5103,11 +6750,7 @@ OO.ui.NumberInputWidget = function OoUiNumberInputWidget( config ) {
        }
 
        // Events
-       this.input.connect( this, {
-               change: this.emit.bind( this, 'change' ),
-               enter: this.emit.bind( this, 'enter' )
-       } );
-       this.input.$input.on( {
+       this.$input.on( {
                keydown: this.onKeyDown.bind( this ),
                'wheel mousewheel DOMMouseScroll': this.onWheel.bind( this )
        } );
@@ -5120,40 +6763,31 @@ OO.ui.NumberInputWidget = function OoUiNumberInputWidget( config ) {
                } );
        }
 
-       // Initialization
-       this.setIsInteger( !!config.isInteger );
-       this.setRange( config.min, config.max );
-       this.setStep( config.step, config.pageStep );
-
-       this.$field = $( '<div>' ).addClass( 'oo-ui-numberInputWidget-field' )
-               .append( this.input.$element );
-       this.$element.addClass( 'oo-ui-numberInputWidget' ).append( this.$field );
+       // Build the field
+       $field.append( this.$input );
        if ( config.showButtons ) {
-               this.$field
+               $field
                        .prepend( this.minusButton.$element )
                        .append( this.plusButton.$element );
-               this.$element.addClass( 'oo-ui-numberInputWidget-buttoned' );
        }
-       this.input.setValidation( this.validateNumber.bind( this ) );
-};
 
-/* Setup */
-
-OO.inheritClass( OO.ui.NumberInputWidget, OO.ui.Widget );
+       // Initialization
+       this.setAllowInteger( config.allowInteger || config.isInteger );
+       this.setRange( config.min, config.max );
+       this.setStep( config.step, config.pageStep );
+       // Set the validation method after we set allowInteger and range
+       // so that it doesn't immediately call setValidityFlag
+       this.setValidation( this.validateNumber.bind( this ) );
 
-/* Events */
+       this.$element
+               .addClass( 'oo-ui-numberInputWidget' )
+               .toggleClass( 'oo-ui-numberInputWidget-buttoned', config.showButtons )
+               .append( $field );
+};
 
-/**
- * A `change` event is emitted when the value of the input changes.
- *
- * @event change
- */
+/* Setup */
 
-/**
- * An `enter` event is emitted when the user presses 'enter' inside the text box.
- *
- * @event enter
- */
+OO.inheritClass( OO.ui.NumberInputWidget, OO.ui.TextInputWidget );
 
 /* Methods */
 
@@ -5162,19 +6796,23 @@ OO.inheritClass( OO.ui.NumberInputWidget, OO.ui.Widget );
  *
  * @param {boolean} flag
  */
-OO.ui.NumberInputWidget.prototype.setIsInteger = function ( flag ) {
-       this.isInteger = !!flag;
-       this.input.setValidityFlag();
+OO.ui.NumberInputWidget.prototype.setAllowInteger = function ( flag ) {
+       this.allowInteger = !!flag;
+       this.setValidityFlag();
 };
+// Backward compatibility
+OO.ui.NumberInputWidget.prototype.setIsInteger = OO.ui.NumberInputWidget.prototype.setAllowInteger;
 
 /**
  * Get whether only integers are allowed
  *
  * @return {boolean} Flag value
  */
-OO.ui.NumberInputWidget.prototype.getIsInteger = function () {
-       return this.isInteger;
+OO.ui.NumberInputWidget.prototype.getAllowInteger = function () {
+       return this.allowInteger;
 };
+// Backward compatibility
+OO.ui.NumberInputWidget.prototype.getIsInteger = OO.ui.NumberInputWidget.prototype.getAllowInteger;
 
 /**
  * Set the range of allowed values
@@ -5188,7 +6826,7 @@ OO.ui.NumberInputWidget.prototype.setRange = function ( min, max ) {
        }
        this.min = min;
        this.max = max;
-       this.input.setValidityFlag();
+       this.setValidityFlag();
 };
 
 /**
@@ -5228,31 +6866,13 @@ OO.ui.NumberInputWidget.prototype.getStep = function () {
        return [ this.step, this.pageStep ];
 };
 
-/**
- * Get the current value of the widget
- *
- * @return {string}
- */
-OO.ui.NumberInputWidget.prototype.getValue = function () {
-       return this.input.getValue();
-};
-
 /**
  * Get the current value of the widget as a number
  *
  * @return {number} May be NaN, or an invalid number
  */
 OO.ui.NumberInputWidget.prototype.getNumericValue = function () {
-       return +this.input.getValue();
-};
-
-/**
- * Set the value of the widget
- *
- * @param {string} value Invalid values are allowed
- */
-OO.ui.NumberInputWidget.prototype.setValue = function ( value ) {
-       this.input.setValue( value );
+       return +this.getValue();
 };
 
 /**
@@ -5273,7 +6893,7 @@ OO.ui.NumberInputWidget.prototype.adjustValue = function ( delta ) {
        } else {
                n = v + delta;
                n = Math.max( Math.min( n, this.max ), this.min );
-               if ( this.isInteger ) {
+               if ( this.allowInteger ) {
                        n = Math.round( n );
                }
        }
@@ -5282,7 +6902,6 @@ OO.ui.NumberInputWidget.prototype.adjustValue = function ( delta ) {
                this.setValue( n );
        }
 };
-
 /**
  * Validate input
  *
@@ -5292,11 +6911,15 @@ OO.ui.NumberInputWidget.prototype.adjustValue = function ( delta ) {
  */
 OO.ui.NumberInputWidget.prototype.validateNumber = function ( value ) {
        var n = +value;
+       if ( value === '' ) {
+               return !this.isRequired();
+       }
+
        if ( isNaN( n ) || !isFinite( n ) ) {
                return false;
        }
 
-       if ( this.isInteger && Math.floor( n ) !== n ) {
+       if ( this.allowInteger && Math.floor( n ) !== n ) {
                return false;
        }
 
@@ -5326,7 +6949,7 @@ OO.ui.NumberInputWidget.prototype.onButtonClick = function ( dir ) {
 OO.ui.NumberInputWidget.prototype.onWheel = function ( event ) {
        var delta = 0;
 
-       if ( !this.isDisabled() && this.input.$input.is( ':focus' ) ) {
+       if ( !this.isDisabled() && this.$input.is( ':focus' ) ) {
                // Standard 'wheel' event
                if ( event.originalEvent.deltaMode !== undefined ) {
                        this.sawWheelEvent = true;
@@ -5391,9 +7014,6 @@ OO.ui.NumberInputWidget.prototype.setDisabled = function ( disabled ) {
        // Parent method
        OO.ui.NumberInputWidget.parent.prototype.setDisabled.call( this, disabled );
 
-       if ( this.input ) {
-               this.input.setDisabled( this.isDisabled() );
-       }
        if ( this.minusButton ) {
                this.minusButton.setDisabled( this.isDisabled() );
        }
@@ -5405,3 +7025,5 @@ OO.ui.NumberInputWidget.prototype.setDisabled = function ( disabled ) {
 };
 
 }( OO ) );
+
+//# sourceMappingURL=oojs-ui-widgets.js.map
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/oojs-ui-widgets.js.map b/resources/lib/oojs-ui/oojs-ui-widgets.js.map
new file mode 100644 (file)
index 0000000..6e0df1f
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/intro.js.txt","../src/mixins/DraggableElement.js","../src/mixins/DraggableGroupElement.js","../src/mixins/RequestManager.js","../src/mixins/LookupElement.js","../src/layouts/TabPanelLayout.js","../src/layouts/PageLayout.js","../src/layouts/StackLayout.js","../src/layouts/MenuLayout.js","../src/layouts/BookletLayout.js","../src/layouts/IndexLayout.js","../src/widgets/ToggleWidget.js","../src/widgets/ToggleButtonWidget.js","../src/widgets/ToggleSwitchWidget.js","../src/widgets/OutlineControlsWidget.js","../src/widgets/OutlineOptionWidget.js","../src/widgets/OutlineSelectWidget.js","../src/widgets/ButtonOptionWidget.js","../src/widgets/ButtonSelectWidget.js","../src/widgets/TabOptionWidget.js","../src/widgets/TabSelectWidget.js","../src/widgets/CapsuleItemWidget.js","../src/widgets/CapsuleMultiselectWidget.js","../src/widgets/TagItemWidget.js","../src/widgets/TagMultiselectWidget.js","../src/widgets/PopupTagMultiselectWidget.js","../src/widgets/MenuTagMultiselectWidget.js","../src/widgets/SelectFileWidget.js","../src/widgets/SearchWidget.js","../src/widgets/NumberInputWidget.js","../src/outro.js.txt"],"names":[],"mappings":"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","file":"oojs-ui-widgets.js","sourcesContent":["( function ( OO ) {\n\n'use strict';\n","/**\n * DraggableElement is a mixin class used to create elements that can be clicked\n * and dragged by a mouse to a new position within a group. This class must be used\n * in conjunction with OO.ui.mixin.DraggableGroupElement, which provides a container for\n * the draggable elements.\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$handle] The part of the element which can be used for dragging, defaults to the whole element\n * @cfg {boolean} [draggable] The items are draggable. This can change with #toggleDraggable\n *  but the draggable state should be called from the DraggableGroupElement, which updates\n *  the whole group\n */\nOO.ui.mixin.DraggableElement = function OoUiMixinDraggableElement( config ) {\n\tconfig = config || {};\n\n\t// Properties\n\tthis.index = null;\n\tthis.$handle = config.$handle || this.$element;\n\tthis.wasHandleUsed = null;\n\tthis.draggable = config.draggable === undefined ? true : !!config.draggable;\n\n\t// Initialize and events\n\tthis.$element.addClass( 'oo-ui-draggableElement' )\n\t\t// We make the entire element draggable, not just the handle, so that\n\t\t// the whole element appears to move. wasHandleUsed prevents drags from\n\t\t// starting outside the handle\n\t\t.attr( 'draggable', true )\n\t\t.on( {\n\t\t\tmousedown: this.onDragMouseDown.bind( this ),\n\t\t\tdragstart: this.onDragStart.bind( this ),\n\t\t\tdragover: this.onDragOver.bind( this ),\n\t\t\tdragend: this.onDragEnd.bind( this ),\n\t\t\tdrop: this.onDrop.bind( this )\n\t\t} );\n\tthis.$handle.addClass( 'oo-ui-draggableElement-handle' );\n};\n\nOO.initClass( OO.ui.mixin.DraggableElement );\n\n/* Events */\n\n/**\n * @event dragstart\n *\n * A dragstart event is emitted when the user clicks and begins dragging an item.\n * @param {OO.ui.mixin.DraggableElement} item The item the user has clicked and is dragging with the mouse.\n */\n\n/**\n * @event dragend\n * A dragend event is emitted when the user drags an item and releases the mouse,\n * thus terminating the drag operation.\n */\n\n/**\n * @event drop\n * A drop event is emitted when the user drags an item and then releases the mouse button\n * over a valid target.\n */\n\n/* Static Properties */\n\n/**\n * @inheritdoc OO.ui.mixin.ButtonElement\n */\nOO.ui.mixin.DraggableElement.static.cancelButtonMouseDownEvents = false;\n\n/* Methods */\n\n/**\n * Change the draggable state of this widget.\n * This allows users to temporarily halt the dragging operations.\n *\n * @param {boolean} isDraggable Widget supports draggable operations\n * @fires draggable\n */\nOO.ui.mixin.DraggableElement.prototype.toggleDraggable = function ( isDraggable ) {\n\tisDraggable = isDraggable !== undefined ? !!isDraggable : !this.draggable;\n\n\tif ( this.draggable !== isDraggable ) {\n\t\tthis.draggable = isDraggable;\n\n\t\tthis.$handle.toggleClass( 'oo-ui-draggableElement-undraggable', !this.draggable );\n\t}\n};\n\n/**\n * Check the draggable state of this widget\n *\n * @return {boolean} Widget supports draggable operations\n */\nOO.ui.mixin.DraggableElement.prototype.isDraggable = function () {\n\treturn this.draggable;\n};\n\n/**\n * Respond to mousedown event.\n *\n * @private\n * @param {jQuery.Event} e Drag event\n */\nOO.ui.mixin.DraggableElement.prototype.onDragMouseDown = function ( e ) {\n\tif ( !this.isDraggable() ) {\n\t\treturn;\n\t}\n\n\tthis.wasHandleUsed =\n\t\t// Optimization: if the handle is the whole element this is always true\n\t\tthis.$handle[ 0 ] === this.$element[ 0 ] ||\n\t\t// Check the mousedown occurred inside the handle\n\t\tOO.ui.contains( this.$handle[ 0 ], e.target, true );\n};\n\n/**\n * Respond to dragstart event.\n *\n * @private\n * @param {jQuery.Event} e Drag event\n * @return {boolean} False if the event is cancelled\n * @fires dragstart\n */\nOO.ui.mixin.DraggableElement.prototype.onDragStart = function ( e ) {\n\tvar element = this,\n\t\tdataTransfer = e.originalEvent.dataTransfer;\n\n\tif ( !this.wasHandleUsed || !this.isDraggable() ) {\n\t\treturn false;\n\t}\n\n\t// Define drop effect\n\tdataTransfer.dropEffect = 'none';\n\tdataTransfer.effectAllowed = 'move';\n\t// Support: Firefox\n\t// We must set up a dataTransfer data property or Firefox seems to\n\t// ignore the fact the element is draggable.\n\ttry {\n\t\tdataTransfer.setData( 'application-x/OOjs-UI-draggable', this.getIndex() );\n\t} catch ( err ) {\n\t\t// The above is only for Firefox. Move on if it fails.\n\t}\n\t// Briefly add a 'clone' class to style the browser's native drag image\n\tthis.$element.addClass( 'oo-ui-draggableElement-clone' );\n\t// Add placeholder class after the browser has rendered the clone\n\tsetTimeout( function () {\n\t\telement.$element\n\t\t\t.removeClass( 'oo-ui-draggableElement-clone' )\n\t\t\t.addClass( 'oo-ui-draggableElement-placeholder' );\n\t} );\n\t// Emit event\n\tthis.emit( 'dragstart', this );\n\treturn true;\n};\n\n/**\n * Respond to dragend event.\n *\n * @private\n * @fires dragend\n */\nOO.ui.mixin.DraggableElement.prototype.onDragEnd = function () {\n\tthis.$element.removeClass( 'oo-ui-draggableElement-placeholder' );\n\tthis.emit( 'dragend' );\n};\n\n/**\n * Handle drop event.\n *\n * @private\n * @param {jQuery.Event} e Drop event\n * @fires drop\n */\nOO.ui.mixin.DraggableElement.prototype.onDrop = function ( e ) {\n\te.preventDefault();\n\tthis.emit( 'drop', e );\n};\n\n/**\n * In order for drag/drop to work, the dragover event must\n * return false and stop propogation.\n *\n * @param {jQuery.Event} e Drag event\n * @private\n */\nOO.ui.mixin.DraggableElement.prototype.onDragOver = function ( e ) {\n\te.preventDefault();\n};\n\n/**\n * Set item index.\n * Store it in the DOM so we can access from the widget drag event\n *\n * @private\n * @param {number} index Item index\n */\nOO.ui.mixin.DraggableElement.prototype.setIndex = function ( index ) {\n\tif ( this.index !== index ) {\n\t\tthis.index = index;\n\t\tthis.$element.data( 'index', index );\n\t}\n};\n\n/**\n * Get item index\n *\n * @private\n * @return {number} Item index\n */\nOO.ui.mixin.DraggableElement.prototype.getIndex = function () {\n\treturn this.index;\n};\n","/**\n * DraggableGroupElement is a mixin class used to create a group element to\n * contain draggable elements, which are items that can be clicked and dragged by a mouse.\n * The class is used with OO.ui.mixin.DraggableElement.\n *\n * @abstract\n * @class\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string} [orientation] Item orientation: 'horizontal' or 'vertical'. The orientation\n *  should match the layout of the items. Items displayed in a single row\n *  or in several rows should use horizontal orientation. The vertical orientation should only be\n *  used when the items are displayed in a single column. Defaults to 'vertical'\n * @cfg {boolean} [draggable] The items are draggable. This can change with #toggleDraggable\n */\nOO.ui.mixin.DraggableGroupElement = function OoUiMixinDraggableGroupElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.mixin.GroupElement.call( this, config );\n\n\t// Properties\n\tthis.orientation = config.orientation || 'vertical';\n\tthis.dragItem = null;\n\tthis.itemKeys = {};\n\tthis.dir = null;\n\tthis.itemsOrder = null;\n\tthis.draggable = config.draggable === undefined ? true : !!config.draggable;\n\n\t// Events\n\tthis.aggregate( {\n\t\tdragstart: 'itemDragStart',\n\t\tdragend: 'itemDragEnd',\n\t\tdrop: 'itemDrop'\n\t} );\n\tthis.connect( this, {\n\t\titemDragStart: 'onItemDragStart',\n\t\titemDrop: 'onItemDropOrDragEnd',\n\t\titemDragEnd: 'onItemDropOrDragEnd'\n\t} );\n\n\t// Initialize\n\tif ( Array.isArray( config.items ) ) {\n\t\tthis.addItems( config.items );\n\t}\n\tthis.$element\n\t\t.addClass( 'oo-ui-draggableGroupElement' )\n\t\t.attr( 'role', 'listbox' )\n\t\t.append( this.$status )\n\t\t.toggleClass( 'oo-ui-draggableGroupElement-horizontal', this.orientation === 'horizontal' );\n};\n\n/* Setup */\nOO.mixinClass( OO.ui.mixin.DraggableGroupElement, OO.ui.mixin.GroupElement );\n\n/* Events */\n\n/**\n * An item has been dragged to a new position, but not yet dropped.\n *\n * @event drag\n * @param {OO.ui.mixin.DraggableElement} item Dragged item\n * @param {number} [newIndex] New index for the item\n */\n\n/**\n * An item has been dropped at a new position.\n *\n * @event reorder\n * @param {OO.ui.mixin.DraggableElement} item Reordered item\n * @param {number} [newIndex] New index for the item\n */\n\n/**\n * Draggable state of this widget has changed.\n *\n * @event draggable\n * @param {boolean} [draggable] Widget is draggable\n */\n\n/* Methods */\n\n/**\n * Change the draggable state of this widget.\n * This allows users to temporarily halt the dragging operations.\n *\n * @param {boolean} isDraggable Widget supports draggable operations\n * @fires draggable\n */\nOO.ui.mixin.DraggableGroupElement.prototype.toggleDraggable = function ( isDraggable ) {\n\tisDraggable = isDraggable !== undefined ? !!isDraggable : !this.draggable;\n\n\tif ( this.draggable !== isDraggable ) {\n\t\tthis.draggable = isDraggable;\n\n\t\t// Tell the items their draggable state changed\n\t\tthis.getItems().forEach( function ( item ) {\n\t\t\titem.toggleDraggable( this.draggable );\n\t\t}.bind( this ) );\n\n\t\t// Emit event\n\t\tthis.emit( 'draggable', this.draggable );\n\t}\n};\n\n/**\n * Check the draggable state of this widget\n *\n * @return {boolean} Widget supports draggable operations\n */\nOO.ui.mixin.DraggableGroupElement.prototype.isDraggable = function () {\n\treturn this.draggable;\n};\n\n/**\n * Respond to item drag start event\n *\n * @private\n * @param {OO.ui.mixin.DraggableElement} item Dragged item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.onItemDragStart = function ( item ) {\n\tif ( !this.isDraggable() ) {\n\t\treturn;\n\t}\n\t// Make a shallow copy of this.items so we can re-order it during previews\n\t// without affecting the original array.\n\tthis.itemsOrder = this.items.slice();\n\tthis.updateIndexes();\n\tif ( this.orientation === 'horizontal' ) {\n\t\t// Calculate and cache directionality on drag start - it's a little\n\t\t// expensive and it shouldn't change while dragging.\n\t\tthis.dir = this.$element.css( 'direction' );\n\t}\n\tthis.setDragItem( item );\n};\n\n/**\n * Update the index properties of the items\n */\nOO.ui.mixin.DraggableGroupElement.prototype.updateIndexes = function () {\n\tvar i, len;\n\n\t// Map the index of each object\n\tfor ( i = 0, len = this.itemsOrder.length; i < len; i++ ) {\n\t\tthis.itemsOrder[ i ].setIndex( i );\n\t}\n};\n\n/**\n * Handle drop or dragend event and switch the order of the items accordingly\n *\n * @private\n * @param {OO.ui.mixin.DraggableElement} item Dropped item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.onItemDropOrDragEnd = function () {\n\tvar targetIndex, originalIndex,\n\t\titem = this.getDragItem();\n\n\t// TODO: Figure out a way to configure a list of legally droppable\n\t// elements even if they are not yet in the list\n\tif ( item ) {\n\t\toriginalIndex = this.items.indexOf( item );\n\t\t// If the item has moved forward, add one to the index to account for the left shift\n\t\ttargetIndex = item.getIndex() + ( item.getIndex() > originalIndex ? 1 : 0 );\n\t\tif ( targetIndex !== originalIndex ) {\n\t\t\tthis.reorder( this.getDragItem(), targetIndex );\n\t\t\tthis.emit( 'reorder', this.getDragItem(), targetIndex );\n\t\t}\n\t\tthis.updateIndexes();\n\t}\n\tthis.unsetDragItem();\n\t// Return false to prevent propogation\n\treturn false;\n};\n\n/**\n * Respond to dragover event\n *\n * @private\n * @param {jQuery.Event} e Dragover event\n * @fires reorder\n */\nOO.ui.mixin.DraggableGroupElement.prototype.onDragOver = function ( e ) {\n\tvar overIndex, targetIndex,\n\t\titem = this.getDragItem(),\n\t\tdragItemIndex = item.getIndex();\n\n\t// Get the OptionWidget item we are dragging over\n\toverIndex = $( e.target ).closest( '.oo-ui-draggableElement' ).data( 'index' );\n\n\tif ( overIndex !== undefined && overIndex !== dragItemIndex ) {\n\t\ttargetIndex = overIndex + ( overIndex > dragItemIndex ? 1 : 0 );\n\n\t\tif ( targetIndex > 0 ) {\n\t\t\tthis.$group.children().eq( targetIndex - 1 ).after( item.$element );\n\t\t} else {\n\t\t\tthis.$group.prepend( item.$element );\n\t\t}\n\t\t// Move item in itemsOrder array\n\t\tthis.itemsOrder.splice( overIndex, 0,\n\t\t\tthis.itemsOrder.splice( dragItemIndex, 1 )[ 0 ]\n\t\t);\n\t\tthis.updateIndexes();\n\t\tthis.emit( 'drag', item, targetIndex );\n\t}\n\t// Prevent default\n\te.preventDefault();\n};\n\n/**\n * Reorder the items in the group\n *\n * @param {OO.ui.mixin.DraggableElement} item Reordered item\n * @param {number} newIndex New index\n */\nOO.ui.mixin.DraggableGroupElement.prototype.reorder = function ( item, newIndex ) {\n\tthis.addItems( [ item ], newIndex );\n};\n\n/**\n * Set a dragged item\n *\n * @param {OO.ui.mixin.DraggableElement} item Dragged item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.setDragItem = function ( item ) {\n\tif ( this.dragItem !== item ) {\n\t\tthis.dragItem = item;\n\t\tthis.$element.on( 'dragover', this.onDragOver.bind( this ) );\n\t\tthis.$element.addClass( 'oo-ui-draggableGroupElement-dragging' );\n\t}\n};\n\n/**\n * Unset the current dragged item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.unsetDragItem = function () {\n\tif ( this.dragItem ) {\n\t\tthis.dragItem = null;\n\t\tthis.$element.off( 'dragover' );\n\t\tthis.$element.removeClass( 'oo-ui-draggableGroupElement-dragging' );\n\t}\n};\n\n/**\n * Get the item that is currently being dragged.\n *\n * @return {OO.ui.mixin.DraggableElement|null} The currently dragged item, or `null` if no item is being dragged\n */\nOO.ui.mixin.DraggableGroupElement.prototype.getDragItem = function () {\n\treturn this.dragItem;\n};\n","/**\n * RequestManager is a mixin that manages the lifecycle of a promise-backed request for a widget, such as\n * the {@link OO.ui.mixin.LookupElement}.\n *\n * @class\n * @abstract\n *\n * @constructor\n */\nOO.ui.mixin.RequestManager = function OoUiMixinRequestManager() {\n\tthis.requestCache = {};\n\tthis.requestQuery = null;\n\tthis.requestRequest = null;\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.mixin.RequestManager );\n\n/**\n * Get request results for the current query.\n *\n * @return {jQuery.Promise} Promise object which will be passed response data as the first argument of\n *   the done event. If the request was aborted to make way for a subsequent request, this promise\n *   may not be rejected, depending on what jQuery feels like doing.\n */\nOO.ui.mixin.RequestManager.prototype.getRequestData = function () {\n\tvar widget = this,\n\t\tvalue = this.getRequestQuery(),\n\t\tdeferred = $.Deferred(),\n\t\tourRequest;\n\n\tthis.abortRequest();\n\tif ( Object.prototype.hasOwnProperty.call( this.requestCache, value ) ) {\n\t\tdeferred.resolve( this.requestCache[ value ] );\n\t} else {\n\t\tif ( this.pushPending ) {\n\t\t\tthis.pushPending();\n\t\t}\n\t\tthis.requestQuery = value;\n\t\tourRequest = this.requestRequest = this.getRequest();\n\t\tourRequest\n\t\t\t.always( function () {\n\t\t\t\t// We need to pop pending even if this is an old request, otherwise\n\t\t\t\t// the widget will remain pending forever.\n\t\t\t\t// TODO: this assumes that an aborted request will fail or succeed soon after\n\t\t\t\t// being aborted, or at least eventually. It would be nice if we could popPending()\n\t\t\t\t// at abort time, but only if we knew that we hadn't already called popPending()\n\t\t\t\t// for that request.\n\t\t\t\tif ( widget.popPending ) {\n\t\t\t\t\twidget.popPending();\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.done( function ( response ) {\n\t\t\t\t// If this is an old request (and aborting it somehow caused it to still succeed),\n\t\t\t\t// ignore its success completely\n\t\t\t\tif ( ourRequest === widget.requestRequest ) {\n\t\t\t\t\twidget.requestQuery = null;\n\t\t\t\t\twidget.requestRequest = null;\n\t\t\t\t\twidget.requestCache[ value ] = widget.getRequestCacheDataFromResponse( response );\n\t\t\t\t\tdeferred.resolve( widget.requestCache[ value ] );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.fail( function () {\n\t\t\t\t// If this is an old request (or a request failing because it's being aborted),\n\t\t\t\t// ignore its failure completely\n\t\t\t\tif ( ourRequest === widget.requestRequest ) {\n\t\t\t\t\twidget.requestQuery = null;\n\t\t\t\t\twidget.requestRequest = null;\n\t\t\t\t\tdeferred.reject();\n\t\t\t\t}\n\t\t\t} );\n\t}\n\treturn deferred.promise();\n};\n\n/**\n * Abort the currently pending request, if any.\n *\n * @private\n */\nOO.ui.mixin.RequestManager.prototype.abortRequest = function () {\n\tvar oldRequest = this.requestRequest;\n\tif ( oldRequest ) {\n\t\t// First unset this.requestRequest to the fail handler will notice\n\t\t// that the request is no longer current\n\t\tthis.requestRequest = null;\n\t\tthis.requestQuery = null;\n\t\toldRequest.abort();\n\t}\n};\n\n/**\n * Get the query to be made.\n *\n * @protected\n * @method\n * @abstract\n * @return {string} query to be used\n */\nOO.ui.mixin.RequestManager.prototype.getRequestQuery = null;\n\n/**\n * Get a new request object of the current query value.\n *\n * @protected\n * @method\n * @abstract\n * @return {jQuery.Promise} jQuery AJAX object, or promise object with an .abort() method\n */\nOO.ui.mixin.RequestManager.prototype.getRequest = null;\n\n/**\n * Pre-process data returned by the request from #getRequest.\n *\n * The return value of this function will be cached, and any further queries for the given value\n * will use the cache rather than doing API requests.\n *\n * @protected\n * @method\n * @abstract\n * @param {Mixed} response Response from server\n * @return {Mixed} Cached result data\n */\nOO.ui.mixin.RequestManager.prototype.getRequestCacheDataFromResponse = null;\n","/**\n * LookupElement is a mixin that creates a {@link OO.ui.MenuSelectWidget menu} of suggested values for\n * a {@link OO.ui.TextInputWidget text input widget}. Suggested values are based on the characters the user types\n * into the text input field and, in general, the menu is only displayed when the user types. If a suggested value is chosen\n * from the lookup menu, that value becomes the value of the input field.\n *\n * Note that a new menu of suggested items is displayed when a value is chosen from the lookup menu. If this is\n * not the desired behavior, disable lookup menus with the #setLookupsDisabled method, then set the value, then\n * re-enable lookups.\n *\n * See the [OOjs UI demos][1] for an example.\n *\n * [1]: https://tools.wmflabs.org/oojs-ui/oojs-ui/demos/index.html#widgets-apex-vector-ltr\n *\n * @class\n * @abstract\n * @mixins OO.ui.mixin.RequestManager\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$overlay] Overlay for the lookup menu; defaults to relative positioning.\n *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.\n * @cfg {jQuery} [$container=this.$element] The container element. The lookup menu is rendered beneath the specified element.\n * @cfg {boolean} [allowSuggestionsWhenEmpty=false] Request and display a lookup menu when the text input is empty.\n *  By default, the lookup menu is not generated and displayed until the user begins to type.\n * @cfg {boolean} [highlightFirst=true] Whether the first lookup result should be highlighted (so, that the user can\n *  take it over into the input with simply pressing return) automatically or not.\n */\nOO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( { highlightFirst: true }, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.RequestManager.call( this, config );\n\n\t// Properties\n\tthis.$overlay = config.$overlay || this.$element;\n\tthis.lookupMenu = new OO.ui.MenuSelectWidget( {\n\t\twidget: this,\n\t\tinput: this,\n\t\t$floatableContainer: config.$container || this.$element\n\t} );\n\n\tthis.allowSuggestionsWhenEmpty = config.allowSuggestionsWhenEmpty || false;\n\n\tthis.lookupsDisabled = false;\n\tthis.lookupInputFocused = false;\n\tthis.lookupHighlightFirstItem = config.highlightFirst;\n\n\t// Events\n\tthis.$input.on( {\n\t\tfocus: this.onLookupInputFocus.bind( this ),\n\t\tblur: this.onLookupInputBlur.bind( this ),\n\t\tmousedown: this.onLookupInputMouseDown.bind( this )\n\t} );\n\tthis.connect( this, { change: 'onLookupInputChange' } );\n\tthis.lookupMenu.connect( this, {\n\t\ttoggle: 'onLookupMenuToggle',\n\t\tchoose: 'onLookupMenuItemChoose'\n\t} );\n\n\t// Initialization\n\tthis.$input.attr( {\n\t\trole: 'combobox',\n\t\t'aria-owns': this.lookupMenu.getElementId(),\n\t\t'aria-autocomplete': 'list'\n\t} );\n\tthis.$element.addClass( 'oo-ui-lookupElement' );\n\tthis.lookupMenu.$element.addClass( 'oo-ui-lookupElement-menu' );\n\tthis.$overlay.append( this.lookupMenu.$element );\n};\n\n/* Setup */\n\nOO.mixinClass( OO.ui.mixin.LookupElement, OO.ui.mixin.RequestManager );\n\n/* Methods */\n\n/**\n * Handle input focus event.\n *\n * @protected\n * @param {jQuery.Event} e Input focus event\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputFocus = function () {\n\tthis.lookupInputFocused = true;\n\tthis.populateLookupMenu();\n};\n\n/**\n * Handle input blur event.\n *\n * @protected\n * @param {jQuery.Event} e Input blur event\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputBlur = function () {\n\tthis.closeLookupMenu();\n\tthis.lookupInputFocused = false;\n};\n\n/**\n * Handle input mouse down event.\n *\n * @protected\n * @param {jQuery.Event} e Input mouse down event\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputMouseDown = function () {\n\t// Only open the menu if the input was already focused.\n\t// This way we allow the user to open the menu again after closing it with Esc\n\t// by clicking in the input. Opening (and populating) the menu when initially\n\t// clicking into the input is handled by the focus handler.\n\tif ( this.lookupInputFocused && !this.lookupMenu.isVisible() ) {\n\t\tthis.populateLookupMenu();\n\t}\n};\n\n/**\n * Handle input change event.\n *\n * @protected\n * @param {string} value New input value\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputChange = function () {\n\tif ( this.lookupInputFocused ) {\n\t\tthis.populateLookupMenu();\n\t}\n};\n\n/**\n * Handle the lookup menu being shown/hidden.\n *\n * @protected\n * @param {boolean} visible Whether the lookup menu is now visible.\n */\nOO.ui.mixin.LookupElement.prototype.onLookupMenuToggle = function ( visible ) {\n\tif ( !visible ) {\n\t\t// When the menu is hidden, abort any active request and clear the menu.\n\t\t// This has to be done here in addition to closeLookupMenu(), because\n\t\t// MenuSelectWidget will close itself when the user presses Esc.\n\t\tthis.abortLookupRequest();\n\t\tthis.lookupMenu.clearItems();\n\t}\n};\n\n/**\n * Handle menu item 'choose' event, updating the text input value to the value of the clicked item.\n *\n * @protected\n * @param {OO.ui.MenuOptionWidget} item Selected item\n */\nOO.ui.mixin.LookupElement.prototype.onLookupMenuItemChoose = function ( item ) {\n\tthis.setValue( item.getData() );\n};\n\n/**\n * Get lookup menu.\n *\n * @private\n * @return {OO.ui.MenuSelectWidget}\n */\nOO.ui.mixin.LookupElement.prototype.getLookupMenu = function () {\n\treturn this.lookupMenu;\n};\n\n/**\n * Disable or re-enable lookups.\n *\n * When lookups are disabled, calls to #populateLookupMenu will be ignored.\n *\n * @param {boolean} disabled Disable lookups\n */\nOO.ui.mixin.LookupElement.prototype.setLookupsDisabled = function ( disabled ) {\n\tthis.lookupsDisabled = !!disabled;\n};\n\n/**\n * Open the menu. If there are no entries in the menu, this does nothing.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.openLookupMenu = function () {\n\tif ( !this.lookupMenu.isEmpty() ) {\n\t\tthis.lookupMenu.toggle( true );\n\t}\n\treturn this;\n};\n\n/**\n * Close the menu, empty it, and abort any pending request.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.closeLookupMenu = function () {\n\tthis.lookupMenu.toggle( false );\n\tthis.abortLookupRequest();\n\tthis.lookupMenu.clearItems();\n\treturn this;\n};\n\n/**\n * Request menu items based on the input's current value, and when they arrive,\n * populate the menu with these items and show the menu.\n *\n * If lookups have been disabled with #setLookupsDisabled, this function does nothing.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.populateLookupMenu = function () {\n\tvar widget = this,\n\t\tvalue = this.getValue();\n\n\tif ( this.lookupsDisabled || this.isReadOnly() ) {\n\t\treturn;\n\t}\n\n\t// If the input is empty, clear the menu, unless suggestions when empty are allowed.\n\tif ( !this.allowSuggestionsWhenEmpty && value === '' ) {\n\t\tthis.closeLookupMenu();\n\t// Skip population if there is already a request pending for the current value\n\t} else if ( value !== this.lookupQuery ) {\n\t\tthis.getLookupMenuItems()\n\t\t\t.done( function ( items ) {\n\t\t\t\twidget.lookupMenu.clearItems();\n\t\t\t\tif ( items.length ) {\n\t\t\t\t\twidget.lookupMenu\n\t\t\t\t\t\t.addItems( items )\n\t\t\t\t\t\t.toggle( true );\n\t\t\t\t\twidget.initializeLookupMenuSelection();\n\t\t\t\t} else {\n\t\t\t\t\twidget.lookupMenu.toggle( false );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.fail( function () {\n\t\t\t\twidget.lookupMenu.clearItems();\n\t\t\t} );\n\t}\n\n\treturn this;\n};\n\n/**\n * Highlight the first selectable item in the menu, if configured.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.initializeLookupMenuSelection = function () {\n\tif ( this.lookupHighlightFirstItem && !this.lookupMenu.getSelectedItem() ) {\n\t\tthis.lookupMenu.highlightItem( this.lookupMenu.getFirstSelectableItem() );\n\t}\n};\n\n/**\n * Get lookup menu items for the current query.\n *\n * @private\n * @return {jQuery.Promise} Promise object which will be passed menu items as the first argument of\n *   the done event. If the request was aborted to make way for a subsequent request, this promise\n *   will not be rejected: it will remain pending forever.\n */\nOO.ui.mixin.LookupElement.prototype.getLookupMenuItems = function () {\n\treturn this.getRequestData().then( function ( data ) {\n\t\treturn this.getLookupMenuOptionsFromData( data );\n\t}.bind( this ) );\n};\n\n/**\n * Abort the currently pending lookup request, if any.\n *\n * @private\n */\nOO.ui.mixin.LookupElement.prototype.abortLookupRequest = function () {\n\tthis.abortRequest();\n};\n\n/**\n * Get a new request object of the current lookup query value.\n *\n * @protected\n * @method\n * @abstract\n * @return {jQuery.Promise} jQuery AJAX object, or promise object with an .abort() method\n */\nOO.ui.mixin.LookupElement.prototype.getLookupRequest = null;\n\n/**\n * Pre-process data returned by the request from #getLookupRequest.\n *\n * The return value of this function will be cached, and any further queries for the given value\n * will use the cache rather than doing API requests.\n *\n * @protected\n * @method\n * @abstract\n * @param {Mixed} response Response from server\n * @return {Mixed} Cached result data\n */\nOO.ui.mixin.LookupElement.prototype.getLookupCacheDataFromResponse = null;\n\n/**\n * Get a list of menu option widgets from the (possibly cached) data returned by\n * #getLookupCacheDataFromResponse.\n *\n * @protected\n * @method\n * @abstract\n * @param {Mixed} data Cached result data, usually an array\n * @return {OO.ui.MenuOptionWidget[]} Menu items\n */\nOO.ui.mixin.LookupElement.prototype.getLookupMenuOptionsFromData = null;\n\n/**\n * Set the read-only state of the widget.\n *\n * This will also disable/enable the lookups functionality.\n *\n * @param {boolean} readOnly Make input read-only\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.setReadOnly = function ( readOnly ) {\n\t// Parent method\n\t// Note: Calling #setReadOnly this way assumes this is mixed into an OO.ui.TextInputWidget\n\tOO.ui.TextInputWidget.prototype.setReadOnly.call( this, readOnly );\n\n\t// During construction, #setReadOnly is called before the OO.ui.mixin.LookupElement constructor\n\tif ( this.isReadOnly() && this.lookupMenu ) {\n\t\tthis.closeLookupMenu();\n\t}\n\n\treturn this;\n};\n\n/**\n * @inheritdoc OO.ui.mixin.RequestManager\n */\nOO.ui.mixin.LookupElement.prototype.getRequestQuery = function () {\n\treturn this.getValue();\n};\n\n/**\n * @inheritdoc OO.ui.mixin.RequestManager\n */\nOO.ui.mixin.LookupElement.prototype.getRequest = function () {\n\treturn this.getLookupRequest();\n};\n\n/**\n * @inheritdoc OO.ui.mixin.RequestManager\n */\nOO.ui.mixin.LookupElement.prototype.getRequestCacheDataFromResponse = function ( response ) {\n\treturn this.getLookupCacheDataFromResponse( response );\n};\n","/**\n * TabPanelLayouts are used within {@link OO.ui.IndexLayout index layouts} to create tab panels that\n * users can select and display from the index's optional {@link OO.ui.TabSelectWidget tab}\n * navigation. TabPanels are usually not instantiated directly, rather extended to include the\n * required content and functionality.\n *\n * Each tab panel must have a unique symbolic name, which is passed to the constructor. In addition,\n * the tab panel's tab item is customized (with a label) using the #setupTabItem method. See\n * {@link OO.ui.IndexLayout IndexLayout} for an example.\n *\n * @class\n * @extends OO.ui.PanelLayout\n *\n * @constructor\n * @param {string} name Unique symbolic name of tab panel\n * @param {Object} [config] Configuration options\n * @cfg {jQuery|string|Function|OO.ui.HtmlSnippet} [label] Label for tab panel's tab\n */\nOO.ui.TabPanelLayout = function OoUiTabPanelLayout( name, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( name ) && config === undefined ) {\n\t\tconfig = name;\n\t\tname = config.name;\n\t}\n\n\t// Configuration initialization\n\tconfig = $.extend( { scrollable: true }, config );\n\n\t// Parent constructor\n\tOO.ui.TabPanelLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.name = name;\n\tthis.label = config.label;\n\tthis.tabItem = null;\n\tthis.active = false;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-tabPanelLayout' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.TabPanelLayout, OO.ui.PanelLayout );\n\n/* Events */\n\n/**\n * An 'active' event is emitted when the tab panel becomes active. Tab panels become active when they are\n * shown in a index layout that is configured to display only one tab panel at a time.\n *\n * @event active\n * @param {boolean} active Tab panel is active\n */\n\n/* Methods */\n\n/**\n * Get the symbolic name of the tab panel.\n *\n * @return {string} Symbolic name of tab panel\n */\nOO.ui.TabPanelLayout.prototype.getName = function () {\n\treturn this.name;\n};\n\n/**\n * Check if tab panel is active.\n *\n * Tab panels become active when they are shown in a {@link OO.ui.IndexLayout index layout} that is configured to\n * display only one tab panel at a time. Additional CSS is applied to the tab panel's tab item to reflect the\n * active state.\n *\n * @return {boolean} Tab panel is active\n */\nOO.ui.TabPanelLayout.prototype.isActive = function () {\n\treturn this.active;\n};\n\n/**\n * Get tab item.\n *\n * The tab item allows users to access the tab panel from the index's tab\n * navigation. The tab item itself can be customized (with a label, level, etc.) using the #setupTabItem method.\n *\n * @return {OO.ui.TabOptionWidget|null} Tab option widget\n */\nOO.ui.TabPanelLayout.prototype.getTabItem = function () {\n\treturn this.tabItem;\n};\n\n/**\n * Set or unset the tab item.\n *\n * Specify a {@link OO.ui.TabOptionWidget tab option} to set it,\n * or `null` to clear the tab item. To customize the tab item itself (e.g., to set a label or tab\n * level), use #setupTabItem instead of this method.\n *\n * @param {OO.ui.TabOptionWidget|null} tabItem Tab option widget, null to clear\n * @chainable\n */\nOO.ui.TabPanelLayout.prototype.setTabItem = function ( tabItem ) {\n\tthis.tabItem = tabItem || null;\n\tif ( tabItem ) {\n\t\tthis.setupTabItem();\n\t}\n\treturn this;\n};\n\n/**\n * Set up the tab item.\n *\n * Use this method to customize the tab item (e.g., to add a label or tab level). To set or unset\n * the tab item itself (with a {@link OO.ui.TabOptionWidget tab option} or `null`), use\n * the #setTabItem method instead.\n *\n * @param {OO.ui.TabOptionWidget} tabItem Tab option widget to set up\n * @chainable\n */\nOO.ui.TabPanelLayout.prototype.setupTabItem = function () {\n\tif ( this.label ) {\n\t\tthis.tabItem.setLabel( this.label );\n\t}\n\treturn this;\n};\n\n/**\n * Set the tab panel to its 'active' state.\n *\n * Tab panels become active when they are shown in a index layout that is configured to display only\n * one tab panel at a time. Additional CSS is applied to the tab item to reflect the tab panel's\n * active state. Outside of the index context, setting the active state on a tab panel does nothing.\n *\n * @param {boolean} active Tab panel is active\n * @fires active\n */\nOO.ui.TabPanelLayout.prototype.setActive = function ( active ) {\n\tactive = !!active;\n\n\tif ( active !== this.active ) {\n\t\tthis.active = active;\n\t\tthis.$element.toggleClass( 'oo-ui-tabPanelLayout-active', this.active );\n\t\tthis.emit( 'active', this.active );\n\t}\n};\n\n/**\n * The deprecated name for the TabPanelLayout, provided for backwards-compatibility.\n *\n * @class\n * @extends OO.ui.TabPanelLayout\n *\n * @constructor\n * @deprecated since v0.21.3\n */\nOO.ui.CardLayout = function OoUiCardLayout() {\n\tOO.ui.warnDeprecation( 'CardLayout has been renamed to TabPanel layout. Use that instead. See T155152' );\n\t// Parent constructor\n\tOO.ui.CardLayout.parent.apply( this, arguments );\n};\n\nOO.inheritClass( OO.ui.CardLayout, OO.ui.TabPanelLayout );\n","/**\n * PageLayouts are used within {@link OO.ui.BookletLayout booklet layouts} to create pages that users can select and display\n * from the booklet's optional {@link OO.ui.OutlineSelectWidget outline} navigation. Pages are usually not instantiated directly,\n * rather extended to include the required content and functionality.\n *\n * Each page must have a unique symbolic name, which is passed to the constructor. In addition, the page's outline\n * item is customized (with a label, outline level, etc.) using the #setupOutlineItem method. See\n * {@link OO.ui.BookletLayout BookletLayout} for an example.\n *\n * @class\n * @extends OO.ui.PanelLayout\n *\n * @constructor\n * @param {string} name Unique symbolic name of page\n * @param {Object} [config] Configuration options\n */\nOO.ui.PageLayout = function OoUiPageLayout( name, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( name ) && config === undefined ) {\n\t\tconfig = name;\n\t\tname = config.name;\n\t}\n\n\t// Configuration initialization\n\tconfig = $.extend( { scrollable: true }, config );\n\n\t// Parent constructor\n\tOO.ui.PageLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.name = name;\n\tthis.outlineItem = null;\n\tthis.active = false;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-pageLayout' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.PageLayout, OO.ui.PanelLayout );\n\n/* Events */\n\n/**\n * An 'active' event is emitted when the page becomes active. Pages become active when they are\n * shown in a booklet layout that is configured to display only one page at a time.\n *\n * @event active\n * @param {boolean} active Page is active\n */\n\n/* Methods */\n\n/**\n * Get the symbolic name of the page.\n *\n * @return {string} Symbolic name of page\n */\nOO.ui.PageLayout.prototype.getName = function () {\n\treturn this.name;\n};\n\n/**\n * Check if page is active.\n *\n * Pages become active when they are shown in a {@link OO.ui.BookletLayout booklet layout} that is configured to display\n * only one page at a time. Additional CSS is applied to the page's outline item to reflect the active state.\n *\n * @return {boolean} Page is active\n */\nOO.ui.PageLayout.prototype.isActive = function () {\n\treturn this.active;\n};\n\n/**\n * Get outline item.\n *\n * The outline item allows users to access the page from the booklet's outline\n * navigation. The outline item itself can be customized (with a label, level, etc.) using the #setupOutlineItem method.\n *\n * @return {OO.ui.OutlineOptionWidget|null} Outline option widget\n */\nOO.ui.PageLayout.prototype.getOutlineItem = function () {\n\treturn this.outlineItem;\n};\n\n/**\n * Set or unset the outline item.\n *\n * Specify an {@link OO.ui.OutlineOptionWidget outline option} to set it,\n * or `null` to clear the outline item. To customize the outline item itself (e.g., to set a label or outline\n * level), use #setupOutlineItem instead of this method.\n *\n * @param {OO.ui.OutlineOptionWidget|null} outlineItem Outline option widget, null to clear\n * @chainable\n */\nOO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {\n\tthis.outlineItem = outlineItem || null;\n\tif ( outlineItem ) {\n\t\tthis.setupOutlineItem();\n\t}\n\treturn this;\n};\n\n/**\n * Set up the outline item.\n *\n * Use this method to customize the outline item (e.g., to add a label or outline level). To set or unset\n * the outline item itself (with an {@link OO.ui.OutlineOptionWidget outline option} or `null`), use\n * the #setOutlineItem method instead.\n *\n * @param {OO.ui.OutlineOptionWidget} outlineItem Outline option widget to set up\n * @chainable\n */\nOO.ui.PageLayout.prototype.setupOutlineItem = function () {\n\treturn this;\n};\n\n/**\n * Set the page to its 'active' state.\n *\n * Pages become active when they are shown in a booklet layout that is configured to display only one page at a time. Additional\n * CSS is applied to the outline item to reflect the page's active state. Outside of the booklet\n * context, setting the active state on a page does nothing.\n *\n * @param {boolean} active Page is active\n * @fires active\n */\nOO.ui.PageLayout.prototype.setActive = function ( active ) {\n\tactive = !!active;\n\n\tif ( active !== this.active ) {\n\t\tthis.active = active;\n\t\tthis.$element.toggleClass( 'oo-ui-pageLayout-active', active );\n\t\tthis.emit( 'active', this.active );\n\t}\n};\n","/**\n * StackLayouts contain a series of {@link OO.ui.PanelLayout panel layouts}. By default, only one panel is displayed\n * at a time, though the stack layout can also be configured to show all contained panels, one after another,\n * by setting the #continuous option to 'true'.\n *\n *     @example\n *     // A stack layout with two panels, configured to be displayed continously\n *     var myStack = new OO.ui.StackLayout( {\n *         items: [\n *             new OO.ui.PanelLayout( {\n *                 $content: $( '<p>Panel One</p>' ),\n *                 padded: true,\n *                 framed: true\n *             } ),\n *             new OO.ui.PanelLayout( {\n *                 $content: $( '<p>Panel Two</p>' ),\n *                 padded: true,\n *                 framed: true\n *             } )\n *         ],\n *         continuous: true\n *     } );\n *     $( 'body' ).append( myStack.$element );\n *\n * @class\n * @extends OO.ui.PanelLayout\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [continuous=false] Show all panels, one after another. By default, only one panel is displayed at a time.\n * @cfg {OO.ui.Layout[]} [items] Panel layouts to add to the stack layout.\n */\nOO.ui.StackLayout = function OoUiStackLayout( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( { scrollable: true }, config );\n\n\t// Parent constructor\n\tOO.ui.StackLayout.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, $.extend( {}, config, { $group: this.$element } ) );\n\n\t// Properties\n\tthis.currentItem = null;\n\tthis.continuous = !!config.continuous;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-stackLayout' );\n\tif ( this.continuous ) {\n\t\tthis.$element.addClass( 'oo-ui-stackLayout-continuous' );\n\t\tthis.$element.on( 'scroll', OO.ui.debounce( this.onScroll.bind( this ), 250 ) );\n\t}\n\tif ( Array.isArray( config.items ) ) {\n\t\tthis.addItems( config.items );\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.StackLayout, OO.ui.PanelLayout );\nOO.mixinClass( OO.ui.StackLayout, OO.ui.mixin.GroupElement );\n\n/* Events */\n\n/**\n * A 'set' event is emitted when panels are {@link #addItems added}, {@link #removeItems removed},\n * {@link #clearItems cleared} or {@link #setItem displayed}.\n *\n * @event set\n * @param {OO.ui.Layout|null} item Current panel or `null` if no panel is shown\n */\n\n/**\n * When used in continuous mode, this event is emitted when the user scrolls down\n * far enough such that currentItem is no longer visible.\n *\n * @event visibleItemChange\n * @param {OO.ui.PanelLayout} panel The next visible item in the layout\n */\n\n/* Methods */\n\n/**\n * Handle scroll events from the layout element\n *\n * @param {jQuery.Event} e\n * @fires visibleItemChange\n */\nOO.ui.StackLayout.prototype.onScroll = function () {\n\tvar currentRect,\n\t\tlen = this.items.length,\n\t\tcurrentIndex = this.items.indexOf( this.currentItem ),\n\t\tnewIndex = currentIndex,\n\t\tcontainerRect = this.$element[ 0 ].getBoundingClientRect();\n\n\tif ( !containerRect || ( !containerRect.top && !containerRect.bottom ) ) {\n\t\t// Can't get bounding rect, possibly not attached.\n\t\treturn;\n\t}\n\n\tfunction getRect( item ) {\n\t\treturn item.$element[ 0 ].getBoundingClientRect();\n\t}\n\n\tfunction isVisible( item ) {\n\t\tvar rect = getRect( item );\n\t\treturn rect.bottom > containerRect.top && rect.top < containerRect.bottom;\n\t}\n\n\tcurrentRect = getRect( this.currentItem );\n\n\tif ( currentRect.bottom < containerRect.top ) {\n\t\t// Scrolled down past current item\n\t\twhile ( ++newIndex < len ) {\n\t\t\tif ( isVisible( this.items[ newIndex ] ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else if ( currentRect.top > containerRect.bottom ) {\n\t\t// Scrolled up past current item\n\t\twhile ( --newIndex >= 0 ) {\n\t\t\tif ( isVisible( this.items[ newIndex ] ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( newIndex !== currentIndex ) {\n\t\tthis.emit( 'visibleItemChange', this.items[ newIndex ] );\n\t}\n};\n\n/**\n * Get the current panel.\n *\n * @return {OO.ui.Layout|null}\n */\nOO.ui.StackLayout.prototype.getCurrentItem = function () {\n\treturn this.currentItem;\n};\n\n/**\n * Unset the current item.\n *\n * @private\n * @param {OO.ui.StackLayout} layout\n * @fires set\n */\nOO.ui.StackLayout.prototype.unsetCurrentItem = function () {\n\tvar prevItem = this.currentItem;\n\tif ( prevItem === null ) {\n\t\treturn;\n\t}\n\n\tthis.currentItem = null;\n\tthis.emit( 'set', null );\n};\n\n/**\n * Add panel layouts to the stack layout.\n *\n * Panels will be added to the end of the stack layout array unless the optional index parameter specifies a different\n * insertion point. Adding a panel that is already in the stack will move it to the end of the array or the point specified\n * by the index.\n *\n * @param {OO.ui.Layout[]} items Panels to add\n * @param {number} [index] Index of the insertion point\n * @chainable\n */\nOO.ui.StackLayout.prototype.addItems = function ( items, index ) {\n\t// Update the visibility\n\tthis.updateHiddenState( items, this.currentItem );\n\n\t// Mixin method\n\tOO.ui.mixin.GroupElement.prototype.addItems.call( this, items, index );\n\n\tif ( !this.currentItem && items.length ) {\n\t\tthis.setItem( items[ 0 ] );\n\t}\n\n\treturn this;\n};\n\n/**\n * Remove the specified panels from the stack layout.\n *\n * Removed panels are detached from the DOM, not removed, so that they may be reused. To remove all panels,\n * you may wish to use the #clearItems method instead.\n *\n * @param {OO.ui.Layout[]} items Panels to remove\n * @chainable\n * @fires set\n */\nOO.ui.StackLayout.prototype.removeItems = function ( items ) {\n\t// Mixin method\n\tOO.ui.mixin.GroupElement.prototype.removeItems.call( this, items );\n\n\tif ( items.indexOf( this.currentItem ) !== -1 ) {\n\t\tif ( this.items.length ) {\n\t\t\tthis.setItem( this.items[ 0 ] );\n\t\t} else {\n\t\t\tthis.unsetCurrentItem();\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Clear all panels from the stack layout.\n *\n * Cleared panels are detached from the DOM, not removed, so that they may be reused. To remove only\n * a subset of panels, use the #removeItems method.\n *\n * @chainable\n * @fires set\n */\nOO.ui.StackLayout.prototype.clearItems = function () {\n\tthis.unsetCurrentItem();\n\tOO.ui.mixin.GroupElement.prototype.clearItems.call( this );\n\n\treturn this;\n};\n\n/**\n * Show the specified panel.\n *\n * If another panel is currently displayed, it will be hidden.\n *\n * @param {OO.ui.Layout} item Panel to show\n * @chainable\n * @fires set\n */\nOO.ui.StackLayout.prototype.setItem = function ( item ) {\n\tif ( item !== this.currentItem ) {\n\t\tthis.updateHiddenState( this.items, item );\n\n\t\tif ( this.items.indexOf( item ) !== -1 ) {\n\t\t\tthis.currentItem = item;\n\t\t\tthis.emit( 'set', item );\n\t\t} else {\n\t\t\tthis.unsetCurrentItem();\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Update the visibility of all items in case of non-continuous view.\n *\n * Ensure all items are hidden except for the selected one.\n * This method does nothing when the stack is continuous.\n *\n * @private\n * @param {OO.ui.Layout[]} items Item list iterate over\n * @param {OO.ui.Layout} [selectedItem] Selected item to show\n */\nOO.ui.StackLayout.prototype.updateHiddenState = function ( items, selectedItem ) {\n\tvar i, len;\n\n\tif ( !this.continuous ) {\n\t\tfor ( i = 0, len = items.length; i < len; i++ ) {\n\t\t\tif ( !selectedItem || selectedItem !== items[ i ] ) {\n\t\t\t\titems[ i ].$element.addClass( 'oo-ui-element-hidden' );\n\t\t\t\titems[ i ].$element.attr( 'aria-hidden', 'true' );\n\t\t\t}\n\t\t}\n\t\tif ( selectedItem ) {\n\t\t\tselectedItem.$element.removeClass( 'oo-ui-element-hidden' );\n\t\t\tselectedItem.$element.removeAttr( 'aria-hidden' );\n\t\t}\n\t}\n};\n","/**\n * MenuLayouts combine a menu and a content {@link OO.ui.PanelLayout panel}. The menu is positioned relative to the content (after, before, top, or bottom)\n * and its size is customized with the #menuSize config. The content area will fill all remaining space.\n *\n *     @example\n *     var menuLayout = new OO.ui.MenuLayout( {\n *         position: 'top'\n *     } ),\n *         menuPanel = new OO.ui.PanelLayout( { padded: true, expanded: true, scrollable: true } ),\n *         contentPanel = new OO.ui.PanelLayout( { padded: true, expanded: true, scrollable: true } ),\n *         select = new OO.ui.SelectWidget( {\n *             items: [\n *                 new OO.ui.OptionWidget( {\n *                     data: 'before',\n *                     label: 'Before',\n *                 } ),\n *                 new OO.ui.OptionWidget( {\n *                     data: 'after',\n *                     label: 'After',\n *                 } ),\n *                 new OO.ui.OptionWidget( {\n *                     data: 'top',\n *                     label: 'Top',\n *                 } ),\n *                 new OO.ui.OptionWidget( {\n *                     data: 'bottom',\n *                     label: 'Bottom',\n *                 } )\n *              ]\n *         } ).on( 'select', function ( item ) {\n *            menuLayout.setMenuPosition( item.getData() );\n *         } );\n *\n *     menuLayout.$menu.append(\n *         menuPanel.$element.append( '<b>Menu panel</b>', select.$element )\n *     );\n *     menuLayout.$content.append(\n *         contentPanel.$element.append( '<b>Content panel</b>', '<p>Note that the menu is positioned relative to the content panel: top, bottom, after, before.</p>')\n *     );\n *     $( 'body' ).append( menuLayout.$element );\n *\n * If menu size needs to be overridden, it can be accomplished using CSS similar to the snippet\n * below. MenuLayout's CSS will override the appropriate values with 'auto' or '0' to display the\n * menu correctly. If `menuPosition` is known beforehand, CSS rules corresponding to other positions\n * may be omitted.\n *\n *     .oo-ui-menuLayout-menu {\n *         height: 200px;\n *         width: 200px;\n *     }\n *     .oo-ui-menuLayout-content {\n *         top: 200px;\n *         left: 200px;\n *         right: 200px;\n *         bottom: 200px;\n *     }\n *\n * @class\n * @extends OO.ui.Layout\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [showMenu=true] Show menu\n * @cfg {string} [menuPosition='before'] Position of menu: `top`, `after`, `bottom` or `before`\n */\nOO.ui.MenuLayout = function OoUiMenuLayout( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( {\n\t\tshowMenu: true,\n\t\tmenuPosition: 'before'\n\t}, config );\n\n\t// Parent constructor\n\tOO.ui.MenuLayout.parent.call( this, config );\n\n\t/**\n\t * Menu DOM node\n\t *\n\t * @property {jQuery}\n\t */\n\tthis.$menu = $( '<div>' );\n\t/**\n\t * Content DOM node\n\t *\n\t * @property {jQuery}\n\t */\n\tthis.$content = $( '<div>' );\n\n\t// Initialization\n\tthis.$menu\n\t\t.addClass( 'oo-ui-menuLayout-menu' );\n\tthis.$content.addClass( 'oo-ui-menuLayout-content' );\n\tthis.$element\n\t\t.addClass( 'oo-ui-menuLayout' )\n\t\t.append( this.$content, this.$menu );\n\tthis.setMenuPosition( config.menuPosition );\n\tthis.toggleMenu( config.showMenu );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.MenuLayout, OO.ui.Layout );\n\n/* Methods */\n\n/**\n * Toggle menu.\n *\n * @param {boolean} showMenu Show menu, omit to toggle\n * @chainable\n */\nOO.ui.MenuLayout.prototype.toggleMenu = function ( showMenu ) {\n\tshowMenu = showMenu === undefined ? !this.showMenu : !!showMenu;\n\n\tif ( this.showMenu !== showMenu ) {\n\t\tthis.showMenu = showMenu;\n\t\tthis.$element\n\t\t\t.toggleClass( 'oo-ui-menuLayout-showMenu', this.showMenu )\n\t\t\t.toggleClass( 'oo-ui-menuLayout-hideMenu', !this.showMenu );\n\t\tthis.$menu.attr( 'aria-hidden', this.showMenu ? 'false' : 'true' );\n\t}\n\n\treturn this;\n};\n\n/**\n * Check if menu is visible\n *\n * @return {boolean} Menu is visible\n */\nOO.ui.MenuLayout.prototype.isMenuVisible = function () {\n\treturn this.showMenu;\n};\n\n/**\n * Set menu position.\n *\n * @param {string} position Position of menu, either `top`, `after`, `bottom` or `before`\n * @throws {Error} If position value is not supported\n * @chainable\n */\nOO.ui.MenuLayout.prototype.setMenuPosition = function ( position ) {\n\tthis.$element.removeClass( 'oo-ui-menuLayout-' + this.menuPosition );\n\tthis.menuPosition = position;\n\tthis.$element.addClass( 'oo-ui-menuLayout-' + position );\n\n\treturn this;\n};\n\n/**\n * Get menu position.\n *\n * @return {string} Menu position\n */\nOO.ui.MenuLayout.prototype.getMenuPosition = function () {\n\treturn this.menuPosition;\n};\n","/**\n * BookletLayouts contain {@link OO.ui.PageLayout page layouts} as well as\n * an {@link OO.ui.OutlineSelectWidget outline} that allows users to easily navigate\n * through the pages and select which one to display. By default, only one page is\n * displayed at a time and the outline is hidden. When a user navigates to a new page,\n * the booklet layout automatically focuses on the first focusable element, unless the\n * default setting is changed. Optionally, booklets can be configured to show\n * {@link OO.ui.OutlineControlsWidget controls} for adding, moving, and removing items.\n *\n *     @example\n *     // Example of a BookletLayout that contains two PageLayouts.\n *\n *     function PageOneLayout( name, config ) {\n *         PageOneLayout.parent.call( this, name, config );\n *         this.$element.append( '<p>First page</p><p>(This booklet has an outline, displayed on the left)</p>' );\n *     }\n *     OO.inheritClass( PageOneLayout, OO.ui.PageLayout );\n *     PageOneLayout.prototype.setupOutlineItem = function () {\n *         this.outlineItem.setLabel( 'Page One' );\n *     };\n *\n *     function PageTwoLayout( name, config ) {\n *         PageTwoLayout.parent.call( this, name, config );\n *         this.$element.append( '<p>Second page</p>' );\n *     }\n *     OO.inheritClass( PageTwoLayout, OO.ui.PageLayout );\n *     PageTwoLayout.prototype.setupOutlineItem = function () {\n *         this.outlineItem.setLabel( 'Page Two' );\n *     };\n *\n *     var page1 = new PageOneLayout( 'one' ),\n *         page2 = new PageTwoLayout( 'two' );\n *\n *     var booklet = new OO.ui.BookletLayout( {\n *         outlined: true\n *     } );\n *\n *     booklet.addPages ( [ page1, page2 ] );\n *     $( 'body' ).append( booklet.$element );\n *\n * @class\n * @extends OO.ui.MenuLayout\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [continuous=false] Show all pages, one after another\n * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is displayed. Disabled on mobile.\n * @cfg {boolean} [outlined=false] Show the outline. The outline is used to navigate through the pages of the booklet.\n * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages\n */\nOO.ui.BookletLayout = function OoUiBookletLayout( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.BookletLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.currentPageName = null;\n\tthis.pages = {};\n\tthis.ignoreFocus = false;\n\tthis.stackLayout = new OO.ui.StackLayout( { continuous: !!config.continuous } );\n\tthis.$content.append( this.stackLayout.$element );\n\tthis.autoFocus = config.autoFocus === undefined || !!config.autoFocus;\n\tthis.outlineVisible = false;\n\tthis.outlined = !!config.outlined;\n\tif ( this.outlined ) {\n\t\tthis.editable = !!config.editable;\n\t\tthis.outlineControlsWidget = null;\n\t\tthis.outlineSelectWidget = new OO.ui.OutlineSelectWidget();\n\t\tthis.outlinePanel = new OO.ui.PanelLayout( { scrollable: true } );\n\t\tthis.$menu.append( this.outlinePanel.$element );\n\t\tthis.outlineVisible = true;\n\t\tif ( this.editable ) {\n\t\t\tthis.outlineControlsWidget = new OO.ui.OutlineControlsWidget(\n\t\t\t\tthis.outlineSelectWidget\n\t\t\t);\n\t\t}\n\t}\n\tthis.toggleMenu( this.outlined );\n\n\t// Events\n\tthis.stackLayout.connect( this, { set: 'onStackLayoutSet' } );\n\tif ( this.outlined ) {\n\t\tthis.outlineSelectWidget.connect( this, { select: 'onOutlineSelectWidgetSelect' } );\n\t\tthis.scrolling = false;\n\t\tthis.stackLayout.connect( this, { visibleItemChange: 'onStackLayoutVisibleItemChange' } );\n\t}\n\tif ( this.autoFocus ) {\n\t\t// Event 'focus' does not bubble, but 'focusin' does\n\t\tthis.stackLayout.$element.on( 'focusin', this.onStackLayoutFocus.bind( this ) );\n\t}\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-bookletLayout' );\n\tthis.stackLayout.$element.addClass( 'oo-ui-bookletLayout-stackLayout' );\n\tif ( this.outlined ) {\n\t\tthis.outlinePanel.$element\n\t\t\t.addClass( 'oo-ui-bookletLayout-outlinePanel' )\n\t\t\t.append( this.outlineSelectWidget.$element );\n\t\tif ( this.editable ) {\n\t\t\tthis.outlinePanel.$element\n\t\t\t\t.addClass( 'oo-ui-bookletLayout-outlinePanel-editable' )\n\t\t\t\t.append( this.outlineControlsWidget.$element );\n\t\t}\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.BookletLayout, OO.ui.MenuLayout );\n\n/* Events */\n\n/**\n * A 'set' event is emitted when a page is {@link #setPage set} to be displayed by the booklet layout.\n * @event set\n * @param {OO.ui.PageLayout} page Current page\n */\n\n/**\n * An 'add' event is emitted when pages are {@link #addPages added} to the booklet layout.\n *\n * @event add\n * @param {OO.ui.PageLayout[]} page Added pages\n * @param {number} index Index pages were added at\n */\n\n/**\n * A 'remove' event is emitted when pages are {@link #clearPages cleared} or\n * {@link #removePages removed} from the booklet.\n *\n * @event remove\n * @param {OO.ui.PageLayout[]} pages Removed pages\n */\n\n/* Methods */\n\n/**\n * Handle stack layout focus.\n *\n * @private\n * @param {jQuery.Event} e Focusin event\n */\nOO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {\n\tvar name, $target;\n\n\t// Find the page that an element was focused within\n\t$target = $( e.target ).closest( '.oo-ui-pageLayout' );\n\tfor ( name in this.pages ) {\n\t\t// Check for page match, exclude current page to find only page changes\n\t\tif ( this.pages[ name ].$element[ 0 ] === $target[ 0 ] && name !== this.currentPageName ) {\n\t\t\tthis.setPage( name );\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n/**\n * Handle visibleItemChange events from the stackLayout\n *\n * The next visible page is set as the current page by selecting it\n * in the outline\n *\n * @param {OO.ui.PageLayout} page The next visible page in the layout\n */\nOO.ui.BookletLayout.prototype.onStackLayoutVisibleItemChange = function ( page ) {\n\t// Set a flag to so that the resulting call to #onStackLayoutSet doesn't\n\t// try and scroll the item into view again.\n\tthis.scrolling = true;\n\tthis.outlineSelectWidget.selectItemByData( page.getName() );\n\tthis.scrolling = false;\n};\n\n/**\n * Handle stack layout set events.\n *\n * @private\n * @param {OO.ui.PanelLayout|null} page The page panel that is now the current panel\n */\nOO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {\n\tvar layout = this;\n\tif ( !this.scrolling && page ) {\n\t\tpage.scrollElementIntoView().done( function () {\n\t\t\tif ( layout.autoFocus && !OO.ui.isMobile() ) {\n\t\t\t\tlayout.focus();\n\t\t\t}\n\t\t} );\n\t}\n};\n\n/**\n * Focus the first input in the current page.\n *\n * If no page is selected, the first selectable page will be selected.\n * If the focus is already in an element on the current page, nothing will happen.\n *\n * @param {number} [itemIndex] A specific item to focus on\n */\nOO.ui.BookletLayout.prototype.focus = function ( itemIndex ) {\n\tvar page,\n\t\titems = this.stackLayout.getItems();\n\n\tif ( itemIndex !== undefined && items[ itemIndex ] ) {\n\t\tpage = items[ itemIndex ];\n\t} else {\n\t\tpage = this.stackLayout.getCurrentItem();\n\t}\n\n\tif ( !page && this.outlined ) {\n\t\tthis.selectFirstSelectablePage();\n\t\tpage = this.stackLayout.getCurrentItem();\n\t}\n\tif ( !page ) {\n\t\treturn;\n\t}\n\t// Only change the focus if is not already in the current page\n\tif ( !OO.ui.contains( page.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {\n\t\tpage.focus();\n\t}\n};\n\n/**\n * Find the first focusable input in the booklet layout and focus\n * on it.\n */\nOO.ui.BookletLayout.prototype.focusFirstFocusable = function () {\n\tOO.ui.findFocusable( this.stackLayout.$element ).focus();\n};\n\n/**\n * Handle outline widget select events.\n *\n * @private\n * @param {OO.ui.OptionWidget|null} item Selected item\n */\nOO.ui.BookletLayout.prototype.onOutlineSelectWidgetSelect = function ( item ) {\n\tif ( item ) {\n\t\tthis.setPage( item.getData() );\n\t}\n};\n\n/**\n * Check if booklet has an outline.\n *\n * @return {boolean} Booklet has an outline\n */\nOO.ui.BookletLayout.prototype.isOutlined = function () {\n\treturn this.outlined;\n};\n\n/**\n * Check if booklet has editing controls.\n *\n * @return {boolean} Booklet is editable\n */\nOO.ui.BookletLayout.prototype.isEditable = function () {\n\treturn this.editable;\n};\n\n/**\n * Check if booklet has a visible outline.\n *\n * @return {boolean} Outline is visible\n */\nOO.ui.BookletLayout.prototype.isOutlineVisible = function () {\n\treturn this.outlined && this.outlineVisible;\n};\n\n/**\n * Hide or show the outline.\n *\n * @param {boolean} [show] Show outline, omit to invert current state\n * @chainable\n */\nOO.ui.BookletLayout.prototype.toggleOutline = function ( show ) {\n\tif ( this.outlined ) {\n\t\tshow = show === undefined ? !this.outlineVisible : !!show;\n\t\tthis.outlineVisible = show;\n\t\tthis.toggleMenu( show );\n\t}\n\n\treturn this;\n};\n\n/**\n * Get the page closest to the specified page.\n *\n * @param {OO.ui.PageLayout} page Page to use as a reference point\n * @return {OO.ui.PageLayout|null} Page closest to the specified page\n */\nOO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {\n\tvar next, prev, level,\n\t\tpages = this.stackLayout.getItems(),\n\t\tindex = pages.indexOf( page );\n\n\tif ( index !== -1 ) {\n\t\tnext = pages[ index + 1 ];\n\t\tprev = pages[ index - 1 ];\n\t\t// Prefer adjacent pages at the same level\n\t\tif ( this.outlined ) {\n\t\t\tlevel = this.outlineSelectWidget.getItemFromData( page.getName() ).getLevel();\n\t\t\tif (\n\t\t\t\tprev &&\n\t\t\t\tlevel === this.outlineSelectWidget.getItemFromData( prev.getName() ).getLevel()\n\t\t\t) {\n\t\t\t\treturn prev;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tnext &&\n\t\t\t\tlevel === this.outlineSelectWidget.getItemFromData( next.getName() ).getLevel()\n\t\t\t) {\n\t\t\t\treturn next;\n\t\t\t}\n\t\t}\n\t}\n\treturn prev || next || null;\n};\n\n/**\n * Get the outline widget.\n *\n * If the booklet is not outlined, the method will return `null`.\n *\n * @return {OO.ui.OutlineSelectWidget|null} Outline widget, or null if the booklet is not outlined\n */\nOO.ui.BookletLayout.prototype.getOutline = function () {\n\treturn this.outlineSelectWidget;\n};\n\n/**\n * Get the outline controls widget.\n *\n * If the outline is not editable, the method will return `null`.\n *\n * @return {OO.ui.OutlineControlsWidget|null} The outline controls widget.\n */\nOO.ui.BookletLayout.prototype.getOutlineControls = function () {\n\treturn this.outlineControlsWidget;\n};\n\n/**\n * Get a page by its symbolic name.\n *\n * @param {string} name Symbolic name of page\n * @return {OO.ui.PageLayout|undefined} Page, if found\n */\nOO.ui.BookletLayout.prototype.getPage = function ( name ) {\n\treturn this.pages[ name ];\n};\n\n/**\n * Get the current page.\n *\n * @return {OO.ui.PageLayout|undefined} Current page, if found\n */\nOO.ui.BookletLayout.prototype.getCurrentPage = function () {\n\tvar name = this.getCurrentPageName();\n\treturn name ? this.getPage( name ) : undefined;\n};\n\n/**\n * Get the symbolic name of the current page.\n *\n * @return {string|null} Symbolic name of the current page\n */\nOO.ui.BookletLayout.prototype.getCurrentPageName = function () {\n\treturn this.currentPageName;\n};\n\n/**\n * Add pages to the booklet layout\n *\n * When pages are added with the same names as existing pages, the existing pages will be\n * automatically removed before the new pages are added.\n *\n * @param {OO.ui.PageLayout[]} pages Pages to add\n * @param {number} index Index of the insertion point\n * @fires add\n * @chainable\n */\nOO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {\n\tvar i, len, name, page, item, currentIndex,\n\t\tstackLayoutPages = this.stackLayout.getItems(),\n\t\tremove = [],\n\t\titems = [];\n\n\t// Remove pages with same names\n\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\tpage = pages[ i ];\n\t\tname = page.getName();\n\n\t\tif ( Object.prototype.hasOwnProperty.call( this.pages, name ) ) {\n\t\t\t// Correct the insertion index\n\t\t\tcurrentIndex = stackLayoutPages.indexOf( this.pages[ name ] );\n\t\t\tif ( currentIndex !== -1 && currentIndex + 1 < index ) {\n\t\t\t\tindex--;\n\t\t\t}\n\t\t\tremove.push( this.pages[ name ] );\n\t\t}\n\t}\n\tif ( remove.length ) {\n\t\tthis.removePages( remove );\n\t}\n\n\t// Add new pages\n\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\tpage = pages[ i ];\n\t\tname = page.getName();\n\t\tthis.pages[ page.getName() ] = page;\n\t\tif ( this.outlined ) {\n\t\t\titem = new OO.ui.OutlineOptionWidget( { data: name } );\n\t\t\tpage.setOutlineItem( item );\n\t\t\titems.push( item );\n\t\t}\n\t}\n\n\tif ( this.outlined && items.length ) {\n\t\tthis.outlineSelectWidget.addItems( items, index );\n\t\tthis.selectFirstSelectablePage();\n\t}\n\tthis.stackLayout.addItems( pages, index );\n\tthis.emit( 'add', pages, index );\n\n\treturn this;\n};\n\n/**\n * Remove the specified pages from the booklet layout.\n *\n * To remove all pages from the booklet, you may wish to use the #clearPages method instead.\n *\n * @param {OO.ui.PageLayout[]} pages An array of pages to remove\n * @fires remove\n * @chainable\n */\nOO.ui.BookletLayout.prototype.removePages = function ( pages ) {\n\tvar i, len, name, page,\n\t\titems = [];\n\n\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\tpage = pages[ i ];\n\t\tname = page.getName();\n\t\tdelete this.pages[ name ];\n\t\tif ( this.outlined ) {\n\t\t\titems.push( this.outlineSelectWidget.getItemFromData( name ) );\n\t\t\tpage.setOutlineItem( null );\n\t\t}\n\t}\n\tif ( this.outlined && items.length ) {\n\t\tthis.outlineSelectWidget.removeItems( items );\n\t\tthis.selectFirstSelectablePage();\n\t}\n\tthis.stackLayout.removeItems( pages );\n\tthis.emit( 'remove', pages );\n\n\treturn this;\n};\n\n/**\n * Clear all pages from the booklet layout.\n *\n * To remove only a subset of pages from the booklet, use the #removePages method.\n *\n * @fires remove\n * @chainable\n */\nOO.ui.BookletLayout.prototype.clearPages = function () {\n\tvar i, len,\n\t\tpages = this.stackLayout.getItems();\n\n\tthis.pages = {};\n\tthis.currentPageName = null;\n\tif ( this.outlined ) {\n\t\tthis.outlineSelectWidget.clearItems();\n\t\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\t\tpages[ i ].setOutlineItem( null );\n\t\t}\n\t}\n\tthis.stackLayout.clearItems();\n\n\tthis.emit( 'remove', pages );\n\n\treturn this;\n};\n\n/**\n * Set the current page by symbolic name.\n *\n * @fires set\n * @param {string} name Symbolic name of page\n */\nOO.ui.BookletLayout.prototype.setPage = function ( name ) {\n\tvar selectedItem,\n\t\t$focused,\n\t\tpage = this.pages[ name ],\n\t\tpreviousPage = this.currentPageName && this.pages[ this.currentPageName ];\n\n\tif ( name !== this.currentPageName ) {\n\t\tif ( this.outlined ) {\n\t\t\tselectedItem = this.outlineSelectWidget.getSelectedItem();\n\t\t\tif ( selectedItem && selectedItem.getData() !== name ) {\n\t\t\t\tthis.outlineSelectWidget.selectItemByData( name );\n\t\t\t}\n\t\t}\n\t\tif ( page ) {\n\t\t\tif ( previousPage ) {\n\t\t\t\tpreviousPage.setActive( false );\n\t\t\t\t// Blur anything focused if the next page doesn't have anything focusable.\n\t\t\t\t// This is not needed if the next page has something focusable (because once it is focused\n\t\t\t\t// this blur happens automatically). If the layout is non-continuous, this check is\n\t\t\t\t// meaningless because the next page is not visible yet and thus can't hold focus.\n\t\t\t\tif (\n\t\t\t\t\tthis.autoFocus &&\n\t\t\t\t\t!OO.ui.isMobile() &&\n\t\t\t\t\tthis.stackLayout.continuous &&\n\t\t\t\t\tOO.ui.findFocusable( page.$element ).length !== 0\n\t\t\t\t) {\n\t\t\t\t\t$focused = previousPage.$element.find( ':focus' );\n\t\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentPageName = name;\n\t\t\tpage.setActive( true );\n\t\t\tthis.stackLayout.setItem( page );\n\t\t\tif ( !this.stackLayout.continuous && previousPage ) {\n\t\t\t\t// This should not be necessary, since any inputs on the previous page should have been\n\t\t\t\t// blurred when it was hidden, but browsers are not very consistent about this.\n\t\t\t\t$focused = previousPage.$element.find( ':focus' );\n\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.emit( 'set', page );\n\t\t}\n\t}\n};\n\n/**\n * Select the first selectable page.\n *\n * @chainable\n */\nOO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {\n\tif ( !this.outlineSelectWidget.getSelectedItem() ) {\n\t\tthis.outlineSelectWidget.selectItem( this.outlineSelectWidget.getFirstSelectableItem() );\n\t}\n\n\treturn this;\n};\n","/**\n * IndexLayouts contain {@link OO.ui.TabPanelLayout tab panel layouts} as well as\n * {@link OO.ui.TabSelectWidget tabs} that allow users to easily navigate through the tab panels and\n * select which one to display. By default, only one tab panel is displayed at a time. When a user\n * navigates to a new tab panel, the index layout automatically focuses on the first focusable element,\n * unless the default setting is changed.\n *\n * TODO: This class is similar to BookletLayout, we may want to refactor to reduce duplication\n *\n *     @example\n *     // Example of a IndexLayout that contains two TabPanelLayouts.\n *\n *     function TabPanelOneLayout( name, config ) {\n *         TabPanelOneLayout.parent.call( this, name, config );\n *         this.$element.append( '<p>First tab panel</p>' );\n *     }\n *     OO.inheritClass( TabPanelOneLayout, OO.ui.TabPanelLayout );\n *     TabPanelOneLayout.prototype.setupTabItem = function () {\n *         this.tabItem.setLabel( 'Tab panel one' );\n *     };\n *\n *     var tabPanel1 = new TabPanelOneLayout( 'one' ),\n *         tabPanel2 = new OO.ui.TabPanelLayout( 'two', { label: 'Tab panel two' } );\n *\n *     tabPanel2.$element.append( '<p>Second tab panel</p>' );\n *\n *     var index = new OO.ui.IndexLayout();\n *\n *     index.addTabPanels ( [ tabPanel1, tabPanel2 ] );\n *     $( 'body' ).append( index.$element );\n *\n * @class\n * @extends OO.ui.MenuLayout\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [continuous=false] Show all tab panels, one after another\n * @cfg {boolean} [expanded=true] Expand the content panel to fill the entire parent element.\n * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new tab panel is displayed. Disabled on mobile.\n */\nOO.ui.IndexLayout = function OoUiIndexLayout( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( {}, config, { menuPosition: 'top' } );\n\n\t// Parent constructor\n\tOO.ui.IndexLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.currentTabPanelName = null;\n\tthis.tabPanels = {};\n\n\tObject.defineProperty( this, 'currentCardName', {\n\t\t// TODO: read documentation\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\tget: function () {\n\t\t\tOO.ui.warnDeprecation( 'IndexLayout\\'s currentCardName property is deprecated. Use currentTabPanelName instead. See T155152' );\n\t\t\treturn this.currentTabPanelName;\n\t\t},\n\t\tset: function ( value ) {\n\t\t\tOO.ui.warnDeprecation( 'IndexLayout\\'s currentCardName property is deprecated. Use currentTabPanelName instead. See T155152' );\n\t\t\tthis.currentTabPanelName = value;\n\t\t}\n\t} );\n\n\tObject.defineProperty( this, 'cards', {\n\t\t// TODO: read documentation\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\tget: function () {\n\t\t\tOO.ui.warnDeprecation( 'IndexLayout\\'s cards property is deprecated. Use tabPanels instead. See T155152' );\n\t\t\treturn this.tabPanels;\n\t\t},\n\t\tset: function ( value ) {\n\t\t\tOO.ui.warnDeprecation( 'IndexLayout\\'s cards property is deprecated. Use tabPanels instead. See T155152' );\n\t\t\tthis.tabPanels = value;\n\t\t}\n\t} );\n\n\tthis.ignoreFocus = false;\n\tthis.stackLayout = new OO.ui.StackLayout( {\n\t\tcontinuous: !!config.continuous,\n\t\texpanded: config.expanded\n\t} );\n\tthis.$content.append( this.stackLayout.$element );\n\tthis.autoFocus = config.autoFocus === undefined || !!config.autoFocus;\n\n\tthis.tabSelectWidget = new OO.ui.TabSelectWidget();\n\tthis.tabPanel = new OO.ui.PanelLayout();\n\tthis.$menu.append( this.tabPanel.$element );\n\n\tthis.toggleMenu( true );\n\n\t// Events\n\tthis.stackLayout.connect( this, { set: 'onStackLayoutSet' } );\n\tthis.tabSelectWidget.connect( this, { select: 'onTabSelectWidgetSelect' } );\n\tif ( this.autoFocus ) {\n\t\t// Event 'focus' does not bubble, but 'focusin' does\n\t\tthis.stackLayout.$element.on( 'focusin', this.onStackLayoutFocus.bind( this ) );\n\t}\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-indexLayout' );\n\tthis.stackLayout.$element.addClass( 'oo-ui-indexLayout-stackLayout' );\n\tthis.tabPanel.$element\n\t\t.addClass( 'oo-ui-indexLayout-tabPanel' )\n\t\t.append( this.tabSelectWidget.$element );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.IndexLayout, OO.ui.MenuLayout );\n\n/* Events */\n\n/**\n * A 'set' event is emitted when a tab panel is {@link #setTabPanel set} to be displayed by the index layout.\n * @event set\n * @param {OO.ui.TabPanelLayout} tabPanel Current tab panel\n */\n\n/**\n * An 'add' event is emitted when tab panels are {@link #addTabPanels added} to the index layout.\n *\n * @event add\n * @param {OO.ui.TabPanelLayout[]} tabPanel Added tab panels\n * @param {number} index Index tab panels were added at\n */\n\n/**\n * A 'remove' event is emitted when tab panels are {@link #clearTabPanels cleared} or\n * {@link #removeTabPanels removed} from the index.\n *\n * @event remove\n * @param {OO.ui.TabPanelLayout[]} tabPanel Removed tab panels\n */\n\n/* Methods */\n\n/**\n * Handle stack layout focus.\n *\n * @private\n * @param {jQuery.Event} e Focusing event\n */\nOO.ui.IndexLayout.prototype.onStackLayoutFocus = function ( e ) {\n\tvar name, $target;\n\n\t// Find the tab panel that an element was focused within\n\t$target = $( e.target ).closest( '.oo-ui-tabPanelLayout' );\n\tfor ( name in this.tabPanels ) {\n\t\t// Check for tab panel match, exclude current tab panel to find only tab panel changes\n\t\tif ( this.tabPanels[ name ].$element[ 0 ] === $target[ 0 ] && name !== this.currentTabPanelName ) {\n\t\t\tthis.setTabPanel( name );\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n/**\n * Handle stack layout set events.\n *\n * @private\n * @param {OO.ui.PanelLayout|null} tabPanel The tab panel that is now the current panel\n */\nOO.ui.IndexLayout.prototype.onStackLayoutSet = function ( tabPanel ) {\n\tvar layout = this;\n\tif ( tabPanel ) {\n\t\ttabPanel.scrollElementIntoView().done( function () {\n\t\t\tif ( layout.autoFocus && !OO.ui.isMobile() ) {\n\t\t\t\tlayout.focus();\n\t\t\t}\n\t\t} );\n\t}\n};\n\n/**\n * Focus the first input in the current tab panel.\n *\n * If no tab panel is selected, the first selectable tab panel will be selected.\n * If the focus is already in an element on the current tab panel, nothing will happen.\n *\n * @param {number} [itemIndex] A specific item to focus on\n */\nOO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {\n\tvar tabPanel,\n\t\titems = this.stackLayout.getItems();\n\n\tif ( itemIndex !== undefined && items[ itemIndex ] ) {\n\t\ttabPanel = items[ itemIndex ];\n\t} else {\n\t\ttabPanel = this.stackLayout.getCurrentItem();\n\t}\n\n\tif ( !tabPanel ) {\n\t\tthis.selectFirstSelectableTabPanel();\n\t\ttabPanel = this.stackLayout.getCurrentItem();\n\t}\n\tif ( !tabPanel ) {\n\t\treturn;\n\t}\n\t// Only change the focus if is not already in the current page\n\tif ( !OO.ui.contains( tabPanel.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {\n\t\ttabPanel.focus();\n\t}\n};\n\n/**\n * Find the first focusable input in the index layout and focus\n * on it.\n */\nOO.ui.IndexLayout.prototype.focusFirstFocusable = function () {\n\tOO.ui.findFocusable( this.stackLayout.$element ).focus();\n};\n\n/**\n * Handle tab widget select events.\n *\n * @private\n * @param {OO.ui.OptionWidget|null} item Selected item\n */\nOO.ui.IndexLayout.prototype.onTabSelectWidgetSelect = function ( item ) {\n\tif ( item ) {\n\t\tthis.setTabPanel( item.getData() );\n\t}\n};\n\n/**\n * Get the tab panel closest to the specified tab panel.\n *\n * @param {OO.ui.TabPanelLayout} tabPanel Tab panel to use as a reference point\n * @return {OO.ui.TabPanelLayout|null} Tab panel closest to the specified\n */\nOO.ui.IndexLayout.prototype.getClosestTabPanel = function ( tabPanel ) {\n\tvar next, prev, level,\n\t\ttabPanels = this.stackLayout.getItems(),\n\t\tindex = tabPanels.indexOf( tabPanel );\n\n\tif ( index !== -1 ) {\n\t\tnext = tabPanels[ index + 1 ];\n\t\tprev = tabPanels[ index - 1 ];\n\t\t// Prefer adjacent tab panels at the same level\n\t\tlevel = this.tabSelectWidget.getItemFromData( tabPanel.getName() ).getLevel();\n\t\tif (\n\t\t\tprev &&\n\t\t\tlevel === this.tabSelectWidget.getItemFromData( prev.getName() ).getLevel()\n\t\t) {\n\t\t\treturn prev;\n\t\t}\n\t\tif (\n\t\t\tnext &&\n\t\t\tlevel === this.tabSelectWidget.getItemFromData( next.getName() ).getLevel()\n\t\t) {\n\t\t\treturn next;\n\t\t}\n\t}\n\treturn prev || next || null;\n};\n\n/**\n * Get the tab panel closest to the specified tab panel.\n *\n * @param {OO.ui.TabPanelLayout} tabPanel Tab panel to use as a reference point\n * @return {OO.ui.TabPanelLayout|null} Tab panel closest to the specified\n * @deprecated since v0.21.3, use `getClosestTabPanel` instead\n */\nOO.ui.IndexLayout.prototype.getClosestCard = function ( tabPanel ) {\n\tOO.ui.warnDeprecation( 'IndexLayout\\'s getClosestCard method is deprecated. Use getClosestTabPanel instead. See T155152' );\n\treturn this.getClosestTabPanel( tabPanel );\n};\n\n/**\n * Get the tabs widget.\n *\n * @return {OO.ui.TabSelectWidget} Tabs widget\n */\nOO.ui.IndexLayout.prototype.getTabs = function () {\n\treturn this.tabSelectWidget;\n};\n\n/**\n * Get a tab panel by its symbolic name.\n *\n * @param {string} name Symbolic name of tab panel\n * @return {OO.ui.TabPanelLayout|undefined} Tab panel, if found\n */\nOO.ui.IndexLayout.prototype.getTabPanel = function ( name ) {\n\treturn this.tabPanels[ name ];\n};\n\n/**\n * Get a tab panel by its symbolic name.\n *\n * @param {string} name Symbolic name of tab panel\n * @return {OO.ui.TabPanelLayout|undefined} Tab panel, if found\n * @deprecated since v0.21.3, use `getTabPanel` instead\n */\nOO.ui.IndexLayout.prototype.getCard = function ( name ) {\n\tOO.ui.warnDeprecation( 'IndexLayout\\'s getCard method is deprecated. Use getTabPanel instead. See T155152' );\n\treturn this.getTabPanel( name );\n};\n\n/**\n * Get the current tab panel.\n *\n * @return {OO.ui.TabPanelLayout|undefined} Current tab panel, if found\n */\nOO.ui.IndexLayout.prototype.getCurrentTabPanel = function () {\n\tvar name = this.getCurrentTabPanelName();\n\treturn name ? this.getTabPanel( name ) : undefined;\n};\n\n/**\n * Get the current tab panel.\n *\n * @return {OO.ui.TabPanelLayout|undefined} Current tab panel, if found\n * @deprecated since v0.21.3, use `getCurrentTabPanel` instead\n */\nOO.ui.IndexLayout.prototype.getCurrentCard = function () {\n\tOO.ui.warnDeprecation( 'IndexLayout\\'s getCurrentCard method is deprecated. Use getCurrentTabPanel instead. See T155152' );\n\treturn this.getCurrentTabPanel();\n};\n\n/**\n * Get the symbolic name of the current tab panel.\n *\n * @return {string|null} Symbolic name of the current tab panel\n */\nOO.ui.IndexLayout.prototype.getCurrentTabPanelName = function () {\n\treturn this.currentTabPanelName;\n};\n\n/**\n * Get the symbolic name of the current tab panel.\n *\n * @return {string|null} Symbolic name of the current tab panel\n * @deprecated since v0.21.3, use `getCurrentTabPanelName` instead\n */\nOO.ui.IndexLayout.prototype.getCurrentCardName = function () {\n\tOO.ui.warnDeprecation( 'IndexLayout\\'s getCurrentCardName method is deprecated. Use getCurrentTabPanelName instead. See T155152' );\n\treturn this.getCurrentTabPanelName();\n};\n\n/**\n * Add tab panels to the index layout\n *\n * When tab panels are added with the same names as existing tab panels, the existing tab panels\n * will be automatically removed before the new tab panels are added.\n *\n * @param {OO.ui.TabPanelLayout[]} tabPanels Tab panels to add\n * @param {number} index Index of the insertion point\n * @fires add\n * @chainable\n */\nOO.ui.IndexLayout.prototype.addTabPanels = function ( tabPanels, index ) {\n\tvar i, len, name, tabPanel, item, currentIndex,\n\t\tstackLayoutTabPanels = this.stackLayout.getItems(),\n\t\tremove = [],\n\t\titems = [];\n\n\t// Remove tab panels with same names\n\tfor ( i = 0, len = tabPanels.length; i < len; i++ ) {\n\t\ttabPanel = tabPanels[ i ];\n\t\tname = tabPanel.getName();\n\n\t\tif ( Object.prototype.hasOwnProperty.call( this.tabPanels, name ) ) {\n\t\t\t// Correct the insertion index\n\t\t\tcurrentIndex = stackLayoutTabPanels.indexOf( this.tabPanels[ name ] );\n\t\t\tif ( currentIndex !== -1 && currentIndex + 1 < index ) {\n\t\t\t\tindex--;\n\t\t\t}\n\t\t\tremove.push( this.tabPanels[ name ] );\n\t\t}\n\t}\n\tif ( remove.length ) {\n\t\tthis.removeTabPanels( remove );\n\t}\n\n\t// Add new tab panels\n\tfor ( i = 0, len = tabPanels.length; i < len; i++ ) {\n\t\ttabPanel = tabPanels[ i ];\n\t\tname = tabPanel.getName();\n\t\tthis.tabPanels[ tabPanel.getName() ] = tabPanel;\n\t\titem = new OO.ui.TabOptionWidget( { data: name } );\n\t\ttabPanel.setTabItem( item );\n\t\titems.push( item );\n\t}\n\n\tif ( items.length ) {\n\t\tthis.tabSelectWidget.addItems( items, index );\n\t\tthis.selectFirstSelectableTabPanel();\n\t}\n\tthis.stackLayout.addItems( tabPanels, index );\n\tthis.emit( 'add', tabPanels, index );\n\n\treturn this;\n};\n\n/**\n * Add tab panels to the index layout\n *\n * When tab panels are added with the same names as existing tab panels, the existing tab panels\n * will be automatically removed before the new tab panels are added.\n *\n * @param {OO.ui.TabPanelLayout[]} tabPanels Tab panels to add\n * @param {number} index Index of the insertion point\n * @fires add\n * @chainable\n * @deprecated since v0.21.3, use `addTabPanels` instead\n */\nOO.ui.IndexLayout.prototype.addCards = function ( tabPanels, index ) {\n\tOO.ui.warnDeprecation( 'IndexLayout\\'s addCards method is deprecated. Use addTabPanels instead. See T155152' );\n\treturn this.addTabPanels( tabPanels, index );\n};\n\n/**\n * Remove the specified tab panels from the index layout.\n *\n * To remove all tab panels from the index, you may wish to use the #clearTabPanels method instead.\n *\n * @param {OO.ui.TabPanelLayout[]} tabPanels An array of tab panels to remove\n * @fires remove\n * @chainable\n */\nOO.ui.IndexLayout.prototype.removeTabPanels = function ( tabPanels ) {\n\tvar i, len, name, tabPanel,\n\t\titems = [];\n\n\tfor ( i = 0, len = tabPanels.length; i < len; i++ ) {\n\t\ttabPanel = tabPanels[ i ];\n\t\tname = tabPanel.getName();\n\t\tdelete this.tabPanels[ name ];\n\t\titems.push( this.tabSelectWidget.getItemFromData( name ) );\n\t\ttabPanel.setTabItem( null );\n\t}\n\tif ( items.length ) {\n\t\tthis.tabSelectWidget.removeItems( items );\n\t\tthis.selectFirstSelectableTabPanel();\n\t}\n\tthis.stackLayout.removeItems( tabPanels );\n\tthis.emit( 'remove', tabPanels );\n\n\treturn this;\n};\n\n/**\n * Remove the specified tab panels from the index layout.\n *\n * To remove all tab panels from the index, you may wish to use the #clearTabPanels method instead.\n *\n * @param {OO.ui.TabPanelLayout[]} tabPanels An array of tab panels to remove\n * @fires remove\n * @chainable\n * @deprecated since v0.21.3, use `removeTabPanels` instead\n */\nOO.ui.IndexLayout.prototype.removeCards = function ( tabPanels ) {\n\tOO.ui.warnDeprecation( 'IndexLayout\\'s removeCards method is deprecated. Use removeTabPanels instead. See T155152.' );\n\treturn this.removeTabPanels( tabPanels );\n};\n\n/**\n * Clear all tab panels from the index layout.\n *\n * To remove only a subset of tab panels from the index, use the #removeTabPanels method.\n *\n * @fires remove\n * @chainable\n */\nOO.ui.IndexLayout.prototype.clearTabPanels = function () {\n\tvar i, len,\n\t\ttabPanels = this.stackLayout.getItems();\n\n\tthis.tabPanels = {};\n\tthis.currentTabPanelName = null;\n\tthis.tabSelectWidget.clearItems();\n\tfor ( i = 0, len = tabPanels.length; i < len; i++ ) {\n\t\ttabPanels[ i ].setTabItem( null );\n\t}\n\tthis.stackLayout.clearItems();\n\n\tthis.emit( 'remove', tabPanels );\n\n\treturn this;\n};\n\n/**\n * Clear all tab panels from the index layout.\n *\n * To remove only a subset of tab panels from the index, use the #removeTabPanels method.\n *\n * @fires remove\n * @chainable\n * @deprecated since v0.21.3, use `clearTabPanels` instead\n */\nOO.ui.IndexLayout.prototype.clearCards = function () {\n\tOO.ui.warnDeprecation( 'IndexLayout\\'s clearCards method is deprecated. Use clearTabPanels instead. See T155152.' );\n\treturn this.clearTabPanels();\n};\n\n/**\n * Set the current tab panel by symbolic name.\n *\n * @fires set\n * @param {string} name Symbolic name of tab panel\n */\nOO.ui.IndexLayout.prototype.setTabPanel = function ( name ) {\n\tvar selectedItem,\n\t\t$focused,\n\t\ttabPanel = this.tabPanels[ name ],\n\t\tpreviousTabPanel = this.currentTabPanelName && this.tabPanels[ this.currentTabPanelName ];\n\n\tif ( name !== this.currentTabPanelName ) {\n\t\tselectedItem = this.tabSelectWidget.getSelectedItem();\n\t\tif ( selectedItem && selectedItem.getData() !== name ) {\n\t\t\tthis.tabSelectWidget.selectItemByData( name );\n\t\t}\n\t\tif ( tabPanel ) {\n\t\t\tif ( previousTabPanel ) {\n\t\t\t\tpreviousTabPanel.setActive( false );\n\t\t\t\t// Blur anything focused if the next tab panel doesn't have anything focusable.\n\t\t\t\t// This is not needed if the next tab panel has something focusable (because once it is focused\n\t\t\t\t// this blur happens automatically). If the layout is non-continuous, this check is\n\t\t\t\t// meaningless because the next tab panel is not visible yet and thus can't hold focus.\n\t\t\t\tif (\n\t\t\t\t\tthis.autoFocus &&\n\t\t\t\t\t!OO.ui.isMobile() &&\n\t\t\t\t\tthis.stackLayout.continuous &&\n\t\t\t\t\tOO.ui.findFocusable( tabPanel.$element ).length !== 0\n\t\t\t\t) {\n\t\t\t\t\t$focused = previousTabPanel.$element.find( ':focus' );\n\t\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentTabPanelName = name;\n\t\t\ttabPanel.setActive( true );\n\t\t\tthis.stackLayout.setItem( tabPanel );\n\t\t\tif ( !this.stackLayout.continuous && previousTabPanel ) {\n\t\t\t\t// This should not be necessary, since any inputs on the previous tab panel should have been\n\t\t\t\t// blurred when it was hidden, but browsers are not very consistent about this.\n\t\t\t\t$focused = previousTabPanel.$element.find( ':focus' );\n\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.emit( 'set', tabPanel );\n\t\t}\n\t}\n};\n\n/**\n * Set the current tab panel by symbolic name.\n *\n * @fires set\n * @param {string} name Symbolic name of tab panel\n * @deprecated since v0.21.3, use `setTabPanel` instead\n */\nOO.ui.IndexLayout.prototype.setCard = function ( name ) {\n\tOO.ui.warnDeprecation( 'IndexLayout\\'s setCard method is deprecated. Use setTabPanel instead. See T155152.' );\n\treturn this.setTabPanel( name );\n};\n\n/**\n * Select the first selectable tab panel.\n *\n * @chainable\n */\nOO.ui.IndexLayout.prototype.selectFirstSelectableTabPanel = function () {\n\tif ( !this.tabSelectWidget.getSelectedItem() ) {\n\t\tthis.tabSelectWidget.selectItem( this.tabSelectWidget.getFirstSelectableItem() );\n\t}\n\n\treturn this;\n};\n\n/**\n * Select the first selectable tab panel.\n *\n * @chainable\n * @deprecated since v0.21.3, use `selectFirstSelectableTabPanel` instead\n */\nOO.ui.IndexLayout.prototype.selectFirstSelectableCard = function () {\n\tOO.ui.warnDeprecation( 'IndexLayout\\'s selectFirstSelectableCard method is deprecated. Use selectFirestSelectableTabPanel instead. See T155152.' );\n\treturn this.selectFirstSelectableTabPanel();\n};\n","/**\n * ToggleWidget implements basic behavior of widgets with an on/off state.\n * Please see OO.ui.ToggleButtonWidget and OO.ui.ToggleSwitchWidget for examples.\n *\n * @abstract\n * @class\n * @extends OO.ui.Widget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [value=false] The toggle’s initial on/off state.\n *  By default, the toggle is in the 'off' state.\n */\nOO.ui.ToggleWidget = function OoUiToggleWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.ToggleWidget.parent.call( this, config );\n\n\t// Properties\n\tthis.value = null;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-toggleWidget' );\n\tthis.setValue( !!config.value );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToggleWidget, OO.ui.Widget );\n\n/* Events */\n\n/**\n * @event change\n *\n * A change event is emitted when the on/off state of the toggle changes.\n *\n * @param {boolean} value Value representing the new state of the toggle\n */\n\n/* Methods */\n\n/**\n * Get the value representing the toggle’s state.\n *\n * @return {boolean} The on/off state of the toggle\n */\nOO.ui.ToggleWidget.prototype.getValue = function () {\n\treturn this.value;\n};\n\n/**\n * Set the state of the toggle: `true` for 'on', `false` for 'off'.\n *\n * @param {boolean} value The state of the toggle\n * @fires change\n * @chainable\n */\nOO.ui.ToggleWidget.prototype.setValue = function ( value ) {\n\tvalue = !!value;\n\tif ( this.value !== value ) {\n\t\tthis.value = value;\n\t\tthis.emit( 'change', value );\n\t\tthis.$element.toggleClass( 'oo-ui-toggleWidget-on', value );\n\t\tthis.$element.toggleClass( 'oo-ui-toggleWidget-off', !value );\n\t}\n\treturn this;\n};\n","/**\n * ToggleButtons are buttons that have a state (‘on’ or ‘off’) that is represented by a\n * Boolean value. Like other {@link OO.ui.ButtonWidget buttons}, toggle buttons can be\n * configured with {@link OO.ui.mixin.IconElement icons}, {@link OO.ui.mixin.IndicatorElement indicators},\n * {@link OO.ui.mixin.TitledElement titles}, {@link OO.ui.mixin.FlaggedElement styling flags},\n * and {@link OO.ui.mixin.LabelElement labels}. Please see\n * the [OOjs UI documentation][1] on MediaWiki for more information.\n *\n *     @example\n *     // Toggle buttons in the 'off' and 'on' state.\n *     var toggleButton1 = new OO.ui.ToggleButtonWidget( {\n *         label: 'Toggle Button off'\n *     } );\n *     var toggleButton2 = new OO.ui.ToggleButtonWidget( {\n *         label: 'Toggle Button on',\n *         value: true\n *     } );\n *     // Append the buttons to the DOM.\n *     $( 'body' ).append( toggleButton1.$element, toggleButton2.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Buttons_and_Switches#Toggle_buttons\n *\n * @class\n * @extends OO.ui.ToggleWidget\n * @mixins OO.ui.mixin.ButtonElement\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.TitledElement\n * @mixins OO.ui.mixin.FlaggedElement\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [value=false] The toggle button’s initial on/off\n *  state. By default, the button is in the 'off' state.\n */\nOO.ui.ToggleButtonWidget = function OoUiToggleButtonWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.ToggleButtonWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ButtonElement.call( this, $.extend( {}, config, { active: this.active } ) );\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\tOO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$button } ) );\n\tOO.ui.mixin.FlaggedElement.call( this, config );\n\tOO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$button } ) );\n\n\t// Events\n\tthis.connect( this, { click: 'onAction' } );\n\n\t// Initialization\n\tthis.$button.append( this.$icon, this.$label, this.$indicator );\n\tthis.$element\n\t\t.addClass( 'oo-ui-toggleButtonWidget' )\n\t\t.append( this.$button );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToggleButtonWidget, OO.ui.ToggleWidget );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.ButtonElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TitledElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.FlaggedElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TabIndexedElement );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.ToggleButtonWidget.static.tagName = 'span';\n\n/* Methods */\n\n/**\n * Handle the button action being triggered.\n *\n * @private\n */\nOO.ui.ToggleButtonWidget.prototype.onAction = function () {\n\tthis.setValue( !this.value );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {\n\tvalue = !!value;\n\tif ( value !== this.value ) {\n\t\t// Might be called from parent constructor before ButtonElement constructor\n\t\tif ( this.$button ) {\n\t\t\tthis.$button.attr( 'aria-pressed', value.toString() );\n\t\t}\n\t\tthis.setActive( value );\n\t}\n\n\t// Parent method\n\tOO.ui.ToggleButtonWidget.parent.prototype.setValue.call( this, value );\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ToggleButtonWidget.prototype.setButtonElement = function ( $button ) {\n\tif ( this.$button ) {\n\t\tthis.$button.removeAttr( 'aria-pressed' );\n\t}\n\tOO.ui.mixin.ButtonElement.prototype.setButtonElement.call( this, $button );\n\tthis.$button.attr( 'aria-pressed', this.value.toString() );\n};\n","/**\n * ToggleSwitches are switches that slide on and off. Their state is represented by a Boolean\n * value (`true` for ‘on’, and `false` otherwise, the default). The ‘off’ state is represented\n * visually by a slider in the leftmost position.\n *\n *     @example\n *     // Toggle switches in the 'off' and 'on' position.\n *     var toggleSwitch1 = new OO.ui.ToggleSwitchWidget();\n *     var toggleSwitch2 = new OO.ui.ToggleSwitchWidget( {\n *         value: true\n *     } );\n *\n *     // Create a FieldsetLayout to layout and label switches\n *     var fieldset = new OO.ui.FieldsetLayout( {\n *        label: 'Toggle switches'\n *     } );\n *     fieldset.addItems( [\n *         new OO.ui.FieldLayout( toggleSwitch1, { label: 'Off', align: 'top' } ),\n *         new OO.ui.FieldLayout( toggleSwitch2, { label: 'On', align: 'top' } )\n *     ] );\n *     $( 'body' ).append( fieldset.$element );\n *\n * @class\n * @extends OO.ui.ToggleWidget\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [value=false] The toggle switch’s initial on/off state.\n *  By default, the toggle switch is in the 'off' position.\n */\nOO.ui.ToggleSwitchWidget = function OoUiToggleSwitchWidget( config ) {\n\t// Parent constructor\n\tOO.ui.ToggleSwitchWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.TabIndexedElement.call( this, config );\n\n\t// Properties\n\tthis.dragging = false;\n\tthis.dragStart = null;\n\tthis.sliding = false;\n\tthis.$glow = $( '<span>' );\n\tthis.$grip = $( '<span>' );\n\n\t// Events\n\tthis.$element.on( {\n\t\tclick: this.onClick.bind( this ),\n\t\tkeypress: this.onKeyPress.bind( this )\n\t} );\n\n\t// Initialization\n\tthis.$glow.addClass( 'oo-ui-toggleSwitchWidget-glow' );\n\tthis.$grip.addClass( 'oo-ui-toggleSwitchWidget-grip' );\n\tthis.$element\n\t\t.addClass( 'oo-ui-toggleSwitchWidget' )\n\t\t.attr( 'role', 'checkbox' )\n\t\t.append( this.$glow, this.$grip );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToggleSwitchWidget, OO.ui.ToggleWidget );\nOO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.mixin.TabIndexedElement );\n\n/* Methods */\n\n/**\n * Handle mouse click events.\n *\n * @private\n * @param {jQuery.Event} e Mouse click event\n */\nOO.ui.ToggleSwitchWidget.prototype.onClick = function ( e ) {\n\tif ( !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) {\n\t\tthis.setValue( !this.value );\n\t}\n\treturn false;\n};\n\n/**\n * Handle key press events.\n *\n * @private\n * @param {jQuery.Event} e Key press event\n */\nOO.ui.ToggleSwitchWidget.prototype.onKeyPress = function ( e ) {\n\tif ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {\n\t\tthis.setValue( !this.value );\n\t\treturn false;\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ToggleSwitchWidget.prototype.setValue = function ( value ) {\n\tOO.ui.ToggleSwitchWidget.parent.prototype.setValue.call( this, value );\n\tthis.$element.attr( 'aria-checked', this.value.toString() );\n\treturn this;\n};\n","/**\n * OutlineControlsWidget is a set of controls for an {@link OO.ui.OutlineSelectWidget outline select widget}.\n * Controls include moving items up and down, removing items, and adding different kinds of items.\n *\n * **Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}.**\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.GroupElement\n * @mixins OO.ui.mixin.IconElement\n *\n * @constructor\n * @param {OO.ui.OutlineSelectWidget} outline Outline to control\n * @param {Object} [config] Configuration options\n * @cfg {Object} [abilities] List of abilties\n * @cfg {boolean} [abilities.move=true] Allow moving movable items\n * @cfg {boolean} [abilities.remove=true] Allow removing removable items\n */\nOO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( outline ) && config === undefined ) {\n\t\tconfig = outline;\n\t\toutline = config.outline;\n\t}\n\n\t// Configuration initialization\n\tconfig = $.extend( { icon: 'add' }, config );\n\n\t// Parent constructor\n\tOO.ui.OutlineControlsWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, config );\n\tOO.ui.mixin.IconElement.call( this, config );\n\n\t// Properties\n\tthis.outline = outline;\n\tthis.$movers = $( '<div>' );\n\tthis.upButton = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\ticon: 'collapse',\n\t\ttitle: OO.ui.msg( 'ooui-outline-control-move-up' )\n\t} );\n\tthis.downButton = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\ticon: 'expand',\n\t\ttitle: OO.ui.msg( 'ooui-outline-control-move-down' )\n\t} );\n\tthis.removeButton = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\ticon: 'remove',\n\t\ttitle: OO.ui.msg( 'ooui-outline-control-remove' )\n\t} );\n\tthis.abilities = { move: true, remove: true };\n\n\t// Events\n\toutline.connect( this, {\n\t\tselect: 'onOutlineChange',\n\t\tadd: 'onOutlineChange',\n\t\tremove: 'onOutlineChange'\n\t} );\n\tthis.upButton.connect( this, { click: [ 'emit', 'move', -1 ] } );\n\tthis.downButton.connect( this, { click: [ 'emit', 'move', 1 ] } );\n\tthis.removeButton.connect( this, { click: [ 'emit', 'remove' ] } );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-outlineControlsWidget' );\n\tthis.$group.addClass( 'oo-ui-outlineControlsWidget-items' );\n\tthis.$movers\n\t\t.addClass( 'oo-ui-outlineControlsWidget-movers' )\n\t\t.append( this.removeButton.$element, this.upButton.$element, this.downButton.$element );\n\tthis.$element.append( this.$icon, this.$group, this.$movers );\n\tthis.setAbilities( config.abilities || {} );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.OutlineControlsWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.mixin.GroupElement );\nOO.mixinClass( OO.ui.OutlineControlsWidget, OO.ui.mixin.IconElement );\n\n/* Events */\n\n/**\n * @event move\n * @param {number} places Number of places to move\n */\n\n/**\n * @event remove\n */\n\n/* Methods */\n\n/**\n * Set abilities.\n *\n * @param {Object} abilities List of abilties\n * @param {boolean} [abilities.move] Allow moving movable items\n * @param {boolean} [abilities.remove] Allow removing removable items\n */\nOO.ui.OutlineControlsWidget.prototype.setAbilities = function ( abilities ) {\n\tvar ability;\n\n\tfor ( ability in this.abilities ) {\n\t\tif ( abilities[ ability ] !== undefined ) {\n\t\t\tthis.abilities[ ability ] = !!abilities[ ability ];\n\t\t}\n\t}\n\n\tthis.onOutlineChange();\n};\n\n/**\n * Handle outline change events.\n *\n * @private\n */\nOO.ui.OutlineControlsWidget.prototype.onOutlineChange = function () {\n\tvar i, len, firstMovable, lastMovable,\n\t\titems = this.outline.getItems(),\n\t\tselectedItem = this.outline.getSelectedItem(),\n\t\tmovable = this.abilities.move && selectedItem && selectedItem.isMovable(),\n\t\tremovable = this.abilities.remove && selectedItem && selectedItem.isRemovable();\n\n\tif ( movable ) {\n\t\ti = -1;\n\t\tlen = items.length;\n\t\twhile ( ++i < len ) {\n\t\t\tif ( items[ i ].isMovable() ) {\n\t\t\t\tfirstMovable = items[ i ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\ti = len;\n\t\twhile ( i-- ) {\n\t\t\tif ( items[ i ].isMovable() ) {\n\t\t\t\tlastMovable = items[ i ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tthis.upButton.setDisabled( !movable || selectedItem === firstMovable );\n\tthis.downButton.setDisabled( !movable || selectedItem === lastMovable );\n\tthis.removeButton.setDisabled( !removable );\n};\n","/**\n * OutlineOptionWidget is an item in an {@link OO.ui.OutlineSelectWidget OutlineSelectWidget}.\n *\n * Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}, which contain\n * {@link OO.ui.PageLayout page layouts}. See {@link OO.ui.BookletLayout BookletLayout}\n * for an example.\n *\n * @class\n * @extends OO.ui.DecoratedOptionWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {number} [level] Indentation level\n * @cfg {boolean} [movable] Allow modification from {@link OO.ui.OutlineControlsWidget outline controls}.\n */\nOO.ui.OutlineOptionWidget = function OoUiOutlineOptionWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.OutlineOptionWidget.parent.call( this, config );\n\n\t// Properties\n\tthis.level = 0;\n\tthis.movable = !!config.movable;\n\tthis.removable = !!config.removable;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-outlineOptionWidget' );\n\tthis.setLevel( config.level );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.OutlineOptionWidget, OO.ui.DecoratedOptionWidget );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.OutlineOptionWidget.static.highlightable = true;\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.OutlineOptionWidget.static.scrollIntoViewOnSelect = true;\n\n/**\n * @static\n * @inheritable\n * @property {string}\n */\nOO.ui.OutlineOptionWidget.static.levelClass = 'oo-ui-outlineOptionWidget-level-';\n\n/**\n * @static\n * @inheritable\n * @property {number}\n */\nOO.ui.OutlineOptionWidget.static.levels = 3;\n\n/* Methods */\n\n/**\n * Check if item is movable.\n *\n * Movability is used by {@link OO.ui.OutlineControlsWidget outline controls}.\n *\n * @return {boolean} Item is movable\n */\nOO.ui.OutlineOptionWidget.prototype.isMovable = function () {\n\treturn this.movable;\n};\n\n/**\n * Check if item is removable.\n *\n * Removability is used by {@link OO.ui.OutlineControlsWidget outline controls}.\n *\n * @return {boolean} Item is removable\n */\nOO.ui.OutlineOptionWidget.prototype.isRemovable = function () {\n\treturn this.removable;\n};\n\n/**\n * Get indentation level.\n *\n * @return {number} Indentation level\n */\nOO.ui.OutlineOptionWidget.prototype.getLevel = function () {\n\treturn this.level;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.OutlineOptionWidget.prototype.setPressed = function ( state ) {\n\tOO.ui.OutlineOptionWidget.parent.prototype.setPressed.call( this, state );\n\tif ( this.pressed ) {\n\t\tthis.setFlags( { progressive: true } );\n\t} else if ( !this.selected ) {\n\t\tthis.setFlags( { progressive: false } );\n\t}\n\treturn this;\n};\n\n/**\n * Set movability.\n *\n * Movability is used by {@link OO.ui.OutlineControlsWidget outline controls}.\n *\n * @param {boolean} movable Item is movable\n * @chainable\n */\nOO.ui.OutlineOptionWidget.prototype.setMovable = function ( movable ) {\n\tthis.movable = !!movable;\n\tthis.updateThemeClasses();\n\treturn this;\n};\n\n/**\n * Set removability.\n *\n * Removability is used by {@link OO.ui.OutlineControlsWidget outline controls}.\n *\n * @param {boolean} removable Item is removable\n * @chainable\n */\nOO.ui.OutlineOptionWidget.prototype.setRemovable = function ( removable ) {\n\tthis.removable = !!removable;\n\tthis.updateThemeClasses();\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.OutlineOptionWidget.prototype.setSelected = function ( state ) {\n\tOO.ui.OutlineOptionWidget.parent.prototype.setSelected.call( this, state );\n\tif ( this.selected ) {\n\t\tthis.setFlags( { progressive: true } );\n\t} else {\n\t\tthis.setFlags( { progressive: false } );\n\t}\n\treturn this;\n};\n\n/**\n * Set indentation level.\n *\n * @param {number} [level=0] Indentation level, in the range of [0,#maxLevel]\n * @chainable\n */\nOO.ui.OutlineOptionWidget.prototype.setLevel = function ( level ) {\n\tvar levels = this.constructor.static.levels,\n\t\tlevelClass = this.constructor.static.levelClass,\n\t\ti = levels;\n\n\tthis.level = level ? Math.max( 0, Math.min( levels - 1, level ) ) : 0;\n\twhile ( i-- ) {\n\t\tif ( this.level === i ) {\n\t\t\tthis.$element.addClass( levelClass + i );\n\t\t} else {\n\t\t\tthis.$element.removeClass( levelClass + i );\n\t\t}\n\t}\n\tthis.updateThemeClasses();\n\n\treturn this;\n};\n","/**\n * OutlineSelectWidget is a structured list that contains {@link OO.ui.OutlineOptionWidget outline options}\n * A set of controls can be provided with an {@link OO.ui.OutlineControlsWidget outline controls} widget.\n *\n * **Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}.**\n *\n * @class\n * @extends OO.ui.SelectWidget\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.OutlineSelectWidget = function OoUiOutlineSelectWidget( config ) {\n\t// Parent constructor\n\tOO.ui.OutlineSelectWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.TabIndexedElement.call( this, config );\n\n\t// Events\n\tthis.$element.on( {\n\t\tfocus: this.bindKeyDownListener.bind( this ),\n\t\tblur: this.unbindKeyDownListener.bind( this )\n\t} );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-outlineSelectWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.OutlineSelectWidget, OO.ui.SelectWidget );\nOO.mixinClass( OO.ui.OutlineSelectWidget, OO.ui.mixin.TabIndexedElement );\n","/**\n * ButtonOptionWidget is a special type of {@link OO.ui.mixin.ButtonElement button element} that\n * can be selected and configured with data. The class is\n * used with OO.ui.ButtonSelectWidget to create a selection of button options. Please see the\n * [OOjs UI documentation on MediaWiki] [1] for more information.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Button_selects_and_options\n *\n * @class\n * @extends OO.ui.OptionWidget\n * @mixins OO.ui.mixin.ButtonElement\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.TitledElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.ButtonOptionWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ButtonElement.call( this, config );\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$button } ) );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-buttonOptionWidget' );\n\tthis.$button.append( this.$icon, this.$label, this.$indicator );\n\tthis.$element.append( this.$button );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ButtonOptionWidget, OO.ui.OptionWidget );\nOO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.ButtonElement );\nOO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.TitledElement );\n\n/* Static Properties */\n\n/**\n * Allow button mouse down events to pass through so they can be handled by the parent select widget\n *\n * @static\n * @inheritdoc\n */\nOO.ui.ButtonOptionWidget.static.cancelButtonMouseDownEvents = false;\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.ButtonOptionWidget.static.highlightable = false;\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.ButtonOptionWidget.prototype.setSelected = function ( state ) {\n\tOO.ui.ButtonOptionWidget.parent.prototype.setSelected.call( this, state );\n\n\tif ( this.constructor.static.selectable ) {\n\t\tthis.setActive( state );\n\t}\n\n\treturn this;\n};\n","/**\n * ButtonSelectWidget is a {@link OO.ui.SelectWidget select widget} that contains\n * button options and is used together with\n * OO.ui.ButtonOptionWidget. The ButtonSelectWidget provides an interface for\n * highlighting, choosing, and selecting mutually exclusive options. Please see\n * the [OOjs UI documentation on MediaWiki] [1] for more information.\n *\n *     @example\n *     // Example: A ButtonSelectWidget that contains three ButtonOptionWidgets\n *     var option1 = new OO.ui.ButtonOptionWidget( {\n *         data: 1,\n *         label: 'Option 1',\n *         title: 'Button option 1'\n *     } );\n *\n *     var option2 = new OO.ui.ButtonOptionWidget( {\n *         data: 2,\n *         label: 'Option 2',\n *         title: 'Button option 2'\n *     } );\n *\n *     var option3 = new OO.ui.ButtonOptionWidget( {\n *         data: 3,\n *         label: 'Option 3',\n *         title: 'Button option 3'\n *     } );\n *\n *     var buttonSelect=new OO.ui.ButtonSelectWidget( {\n *         items: [ option1, option2, option3 ]\n *     } );\n *     $( 'body' ).append( buttonSelect.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options\n *\n * @class\n * @extends OO.ui.SelectWidget\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.ButtonSelectWidget = function OoUiButtonSelectWidget( config ) {\n\t// Parent constructor\n\tOO.ui.ButtonSelectWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.TabIndexedElement.call( this, config );\n\n\t// Events\n\tthis.$element.on( {\n\t\tfocus: this.bindKeyDownListener.bind( this ),\n\t\tblur: this.unbindKeyDownListener.bind( this )\n\t} );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-buttonSelectWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ButtonSelectWidget, OO.ui.SelectWidget );\nOO.mixinClass( OO.ui.ButtonSelectWidget, OO.ui.mixin.TabIndexedElement );\n","/**\n * TabOptionWidget is an item in a {@link OO.ui.TabSelectWidget TabSelectWidget}.\n *\n * Currently, this class is only used by {@link OO.ui.IndexLayout index layouts}, which contain\n * {@link OO.ui.TabPanelLayout tab panel layouts}. See {@link OO.ui.IndexLayout IndexLayout}\n * for an example.\n *\n * @class\n * @extends OO.ui.OptionWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.TabOptionWidget = function OoUiTabOptionWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.TabOptionWidget.parent.call( this, config );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-tabOptionWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.TabOptionWidget, OO.ui.OptionWidget );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.TabOptionWidget.static.highlightable = false;\n","/**\n * TabSelectWidget is a list that contains {@link OO.ui.TabOptionWidget tab options}\n *\n * **Currently, this class is only used by {@link OO.ui.IndexLayout index layouts}.**\n *\n * @class\n * @extends OO.ui.SelectWidget\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.TabSelectWidget = function OoUiTabSelectWidget( config ) {\n\t// Parent constructor\n\tOO.ui.TabSelectWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.TabIndexedElement.call( this, config );\n\n\t// Events\n\tthis.$element.on( {\n\t\tfocus: this.bindKeyDownListener.bind( this ),\n\t\tblur: this.unbindKeyDownListener.bind( this )\n\t} );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-tabSelectWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.TabSelectWidget, OO.ui.SelectWidget );\nOO.mixinClass( OO.ui.TabSelectWidget, OO.ui.mixin.TabIndexedElement );\n","/**\n * CapsuleItemWidgets are used within a {@link OO.ui.CapsuleMultiselectWidget\n * CapsuleMultiselectWidget} to display the selected items.\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.ItemWidget\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.FlaggedElement\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.CapsuleItemWidget = function OoUiCapsuleItemWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.CapsuleItemWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ItemWidget.call( this );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\tOO.ui.mixin.FlaggedElement.call( this, config );\n\tOO.ui.mixin.TabIndexedElement.call( this, config );\n\n\t// Events\n\tthis.closeButton = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\tindicator: 'clear',\n\t\ttabIndex: -1\n\t} ).on( 'click', this.onCloseClick.bind( this ) );\n\n\tthis.on( 'disable', function ( disabled ) {\n\t\tthis.closeButton.setDisabled( disabled );\n\t}.bind( this ) );\n\n\t// Initialization\n\tthis.$element\n\t\t.on( {\n\t\t\tclick: this.onClick.bind( this ),\n\t\t\tkeydown: this.onKeyDown.bind( this )\n\t\t} )\n\t\t.addClass( 'oo-ui-capsuleItemWidget' )\n\t\t.append( this.$label, this.closeButton.$element );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.CapsuleItemWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.ItemWidget );\nOO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.FlaggedElement );\nOO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.TabIndexedElement );\n\n/* Methods */\n\n/**\n * Handle close icon clicks\n */\nOO.ui.CapsuleItemWidget.prototype.onCloseClick = function () {\n\tvar element = this.getElementGroup();\n\n\tif ( element && $.isFunction( element.removeItems ) ) {\n\t\telement.removeItems( [ this ] );\n\t\telement.focus();\n\t}\n};\n\n/**\n * Handle click event for the entire capsule\n */\nOO.ui.CapsuleItemWidget.prototype.onClick = function () {\n\tvar element = this.getElementGroup();\n\n\tif ( !this.isDisabled() && element && $.isFunction( element.editItem ) ) {\n\t\telement.editItem( this );\n\t}\n};\n\n/**\n * Handle keyDown event for the entire capsule\n *\n * @param {jQuery.Event} e Key down event\n */\nOO.ui.CapsuleItemWidget.prototype.onKeyDown = function ( e ) {\n\tvar element = this.getElementGroup();\n\n\tif ( e.keyCode === OO.ui.Keys.BACKSPACE || e.keyCode === OO.ui.Keys.DELETE ) {\n\t\telement.removeItems( [ this ] );\n\t\telement.focus();\n\t\treturn false;\n\t} else if ( e.keyCode === OO.ui.Keys.ENTER ) {\n\t\telement.editItem( this );\n\t\treturn false;\n\t} else if ( e.keyCode === OO.ui.Keys.LEFT ) {\n\t\telement.getPreviousItem( this ).focus();\n\t} else if ( e.keyCode === OO.ui.Keys.RIGHT ) {\n\t\telement.getNextItem( this ).focus();\n\t}\n};\n","/**\n * CapsuleMultiselectWidgets are something like a {@link OO.ui.ComboBoxInputWidget combo box widget}\n * that allows for selecting multiple values.\n *\n * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].\n *\n *     @example\n *     // Example: A CapsuleMultiselectWidget.\n *     var capsule = new OO.ui.CapsuleMultiselectWidget( {\n *         label: 'CapsuleMultiselectWidget',\n *         selected: [ 'Option 1', 'Option 3' ],\n *         menu: {\n *             items: [\n *                 new OO.ui.MenuOptionWidget( {\n *                     data: 'Option 1',\n *                     label: 'Option One'\n *                 } ),\n *                 new OO.ui.MenuOptionWidget( {\n *                     data: 'Option 2',\n *                     label: 'Option Two'\n *                 } ),\n *                 new OO.ui.MenuOptionWidget( {\n *                     data: 'Option 3',\n *                     label: 'Option Three'\n *                 } ),\n *                 new OO.ui.MenuOptionWidget( {\n *                     data: 'Option 4',\n *                     label: 'Option Four'\n *                 } ),\n *                 new OO.ui.MenuOptionWidget( {\n *                     data: 'Option 5',\n *                     label: 'Option Five'\n *                 } )\n *             ]\n *         }\n *     } );\n *     $( 'body' ).append( capsule.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.GroupElement\n * @mixins OO.ui.mixin.PopupElement\n * @mixins OO.ui.mixin.TabIndexedElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.IconElement\n * @uses OO.ui.CapsuleItemWidget\n * @uses OO.ui.MenuSelectWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string} [placeholder] Placeholder text\n * @cfg {boolean} [allowArbitrary=false] Allow data items to be added even if not present in the menu.\n * @cfg {boolean} [allowDuplicates=false] Allow duplicate items to be added.\n * @cfg {Object} [menu] (required) Configuration options to pass to the\n *  {@link OO.ui.MenuSelectWidget menu select widget}.\n * @cfg {Object} [popup] Configuration options to pass to the {@link OO.ui.PopupWidget popup widget}.\n *  If specified, this popup will be shown instead of the menu (but the menu\n *  will still be used for item labels and allowArbitrary=false). The widgets\n *  in the popup should use {@link #addItemsFromData} or {@link #addItems} as necessary.\n * @cfg {jQuery} [$overlay=this.$element] Render the menu or popup into a separate layer.\n *  This configuration is useful in cases where the expanded menu is larger than\n *  its containing `<div>`. The specified overlay layer is usually on top of\n *  the containing `<div>` and has a larger area. By default, the menu uses\n *  relative positioning.\n *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.\n */\nOO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config ) {\n\tvar $tabFocus;\n\n\t// Parent constructor\n\tOO.ui.CapsuleMultiselectWidget.parent.call( this, config );\n\n\t// Configuration initialization\n\tconfig = $.extend( {\n\t\tallowArbitrary: false,\n\t\tallowDuplicates: false,\n\t\t$overlay: this.$element\n\t}, config );\n\n\t// Properties (must be set before mixin constructor calls)\n\tthis.$handle = $( '<div>' );\n\tthis.$input = config.popup ? null : $( '<input>' );\n\tif ( config.placeholder !== undefined && config.placeholder !== '' ) {\n\t\tthis.$input.attr( 'placeholder', config.placeholder );\n\t}\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, config );\n\tif ( config.popup ) {\n\t\tconfig.popup = $.extend( {}, config.popup, {\n\t\t\talign: 'forwards',\n\t\t\tanchor: false\n\t\t} );\n\t\tOO.ui.mixin.PopupElement.call( this, config );\n\t\t$tabFocus = $( '<span>' );\n\t\tOO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: $tabFocus } ) );\n\t} else {\n\t\tthis.popup = null;\n\t\t$tabFocus = null;\n\t\tOO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$input } ) );\n\t}\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.IconElement.call( this, config );\n\n\t// Properties\n\tthis.$content = $( '<div>' );\n\tthis.allowArbitrary = config.allowArbitrary;\n\tthis.allowDuplicates = config.allowDuplicates;\n\tthis.$overlay = config.$overlay;\n\tthis.menu = new OO.ui.MenuSelectWidget( $.extend(\n\t\t{\n\t\t\twidget: this,\n\t\t\t$input: this.$input,\n\t\t\t$floatableContainer: this.$element,\n\t\t\tfilterFromInput: true,\n\t\t\tdisabled: this.isDisabled()\n\t\t},\n\t\tconfig.menu\n\t) );\n\n\t// Events\n\tif ( this.popup ) {\n\t\t$tabFocus.on( {\n\t\t\tfocus: this.focus.bind( this )\n\t\t} );\n\t\tthis.popup.$element.on( 'focusout', this.onPopupFocusOut.bind( this ) );\n\t\tif ( this.popup.$autoCloseIgnore ) {\n\t\t\tthis.popup.$autoCloseIgnore.on( 'focusout', this.onPopupFocusOut.bind( this ) );\n\t\t}\n\t\tthis.popup.connect( this, {\n\t\t\ttoggle: function ( visible ) {\n\t\t\t\t$tabFocus.toggle( !visible );\n\t\t\t}\n\t\t} );\n\t} else {\n\t\tthis.$input.on( {\n\t\t\tfocus: this.onInputFocus.bind( this ),\n\t\t\tblur: this.onInputBlur.bind( this ),\n\t\t\t'propertychange change click mouseup keydown keyup input cut paste select focus':\n\t\t\t\tOO.ui.debounce( this.updateInputSize.bind( this ) ),\n\t\t\tkeydown: this.onKeyDown.bind( this ),\n\t\t\tkeypress: this.onKeyPress.bind( this )\n\t\t} );\n\t}\n\tthis.menu.connect( this, {\n\t\tchoose: 'onMenuChoose',\n\t\ttoggle: 'onMenuToggle',\n\t\tadd: 'onMenuItemsChange',\n\t\tremove: 'onMenuItemsChange'\n\t} );\n\tthis.$handle.on( {\n\t\tmousedown: this.onMouseDown.bind( this )\n\t} );\n\n\t// Initialization\n\tif ( this.$input ) {\n\t\tthis.$input.prop( 'disabled', this.isDisabled() );\n\t\tthis.$input.attr( {\n\t\t\trole: 'combobox',\n\t\t\t'aria-owns': this.menu.getElementId(),\n\t\t\t'aria-autocomplete': 'list'\n\t\t} );\n\t}\n\tif ( config.data ) {\n\t\tthis.setItemsFromData( config.data );\n\t}\n\tthis.$content.addClass( 'oo-ui-capsuleMultiselectWidget-content' )\n\t\t.append( this.$group );\n\tthis.$group.addClass( 'oo-ui-capsuleMultiselectWidget-group' );\n\tthis.$handle.addClass( 'oo-ui-capsuleMultiselectWidget-handle' )\n\t\t.append( this.$indicator, this.$icon, this.$content );\n\tthis.$element.addClass( 'oo-ui-capsuleMultiselectWidget' )\n\t\t.append( this.$handle );\n\tif ( this.popup ) {\n\t\tthis.popup.$element.addClass( 'oo-ui-capsuleMultiselectWidget-popup' );\n\t\tthis.$content.append( $tabFocus );\n\t\tthis.$overlay.append( this.popup.$element );\n\t} else {\n\t\tthis.$content.append( this.$input );\n\t\tthis.$overlay.append( this.menu.$element );\n\t}\n\tif ( $tabFocus ) {\n\t\t$tabFocus.addClass( 'oo-ui-capsuleMultiselectWidget-focusTrap' );\n\t}\n\n\t// Input size needs to be calculated after everything else is rendered\n\tsetTimeout( function () {\n\t\tif ( this.$input ) {\n\t\t\tthis.updateInputSize();\n\t\t}\n\t}.bind( this ) );\n\n\tthis.onMenuItemsChange();\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.CapsuleMultiselectWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.GroupElement );\nOO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.PopupElement );\nOO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.TabIndexedElement );\nOO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.IconElement );\n\n/* Events */\n\n/**\n * @event change\n *\n * A change event is emitted when the set of selected items changes.\n *\n * @param {Mixed[]} datas Data of the now-selected items\n */\n\n/**\n * @event resize\n *\n * A resize event is emitted when the widget's dimensions change to accomodate newly added items or\n * current user input.\n */\n\n/* Methods */\n\n/**\n * Construct a OO.ui.CapsuleItemWidget (or a subclass thereof) from given label and data.\n * May return `null` if the given label and data are not valid.\n *\n * @protected\n * @param {Mixed} data Custom data of any type.\n * @param {string} label The label text.\n * @return {OO.ui.CapsuleItemWidget|null}\n */\nOO.ui.CapsuleMultiselectWidget.prototype.createItemWidget = function ( data, label ) {\n\tif ( label === '' ) {\n\t\treturn null;\n\t}\n\treturn new OO.ui.CapsuleItemWidget( { data: data, label: label } );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CapsuleMultiselectWidget.prototype.getInputId = function () {\n\tif ( !this.$input ) {\n\t\treturn null;\n\t}\n\treturn OO.ui.mixin.TabIndexedElement.prototype.getInputId.call( this );\n};\n\n/**\n * Get the data of the items in the capsule\n *\n * @return {Mixed[]}\n */\nOO.ui.CapsuleMultiselectWidget.prototype.getItemsData = function () {\n\treturn this.getItems().map( function ( item ) {\n\t\treturn item.data;\n\t} );\n};\n\n/**\n * Set the items in the capsule by providing data\n *\n * @chainable\n * @param {Mixed[]} datas\n * @return {OO.ui.CapsuleMultiselectWidget}\n */\nOO.ui.CapsuleMultiselectWidget.prototype.setItemsFromData = function ( datas ) {\n\tvar widget = this,\n\t\tmenu = this.menu,\n\t\titems = this.getItems();\n\n\t$.each( datas, function ( i, data ) {\n\t\tvar j, label,\n\t\t\titem = menu.getItemFromData( data );\n\n\t\tif ( item ) {\n\t\t\tlabel = item.label;\n\t\t} else if ( widget.allowArbitrary ) {\n\t\t\tlabel = String( data );\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\titem = null;\n\t\tfor ( j = 0; j < items.length; j++ ) {\n\t\t\tif ( items[ j ].data === data && items[ j ].label === label ) {\n\t\t\t\titem = items[ j ];\n\t\t\t\titems.splice( j, 1 );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif ( !item ) {\n\t\t\titem = widget.createItemWidget( data, label );\n\t\t}\n\t\tif ( item ) {\n\t\t\twidget.addItems( [ item ], i );\n\t\t}\n\t} );\n\n\tif ( items.length ) {\n\t\twidget.removeItems( items );\n\t}\n\n\treturn this;\n};\n\n/**\n * Add items to the capsule by providing their data\n *\n * @chainable\n * @param {Mixed[]} datas\n * @return {OO.ui.CapsuleMultiselectWidget}\n */\nOO.ui.CapsuleMultiselectWidget.prototype.addItemsFromData = function ( datas ) {\n\tvar widget = this,\n\t\tmenu = this.menu,\n\t\titems = [];\n\n\t$.each( datas, function ( i, data ) {\n\t\tvar item;\n\n\t\tif ( !widget.getItemFromData( data ) || widget.allowDuplicates ) {\n\t\t\titem = menu.getItemFromData( data );\n\t\t\tif ( item ) {\n\t\t\t\titem = widget.createItemWidget( data, item.label );\n\t\t\t} else if ( widget.allowArbitrary ) {\n\t\t\t\titem = widget.createItemWidget( data, String( data ) );\n\t\t\t}\n\t\t\tif ( item ) {\n\t\t\t\titems.push( item );\n\t\t\t}\n\t\t}\n\t} );\n\n\tif ( items.length ) {\n\t\tthis.addItems( items );\n\t}\n\n\treturn this;\n};\n\n/**\n * Add items to the capsule by providing a label\n *\n * @param {string} label\n * @return {boolean} Whether the item was added or not\n */\nOO.ui.CapsuleMultiselectWidget.prototype.addItemFromLabel = function ( label ) {\n\tvar item, items;\n\titem = this.menu.getItemFromLabel( label, true );\n\tif ( item ) {\n\t\tthis.addItemsFromData( [ item.data ] );\n\t\treturn true;\n\t} else if ( this.allowArbitrary ) {\n\t\titems = this.getItems();\n\t\tthis.addItemsFromData( [ label ] );\n\t\treturn !OO.compare( this.getItems(), items );\n\t}\n\treturn false;\n};\n\n/**\n * Remove items by data\n *\n * @chainable\n * @param {Mixed[]} datas\n * @return {OO.ui.CapsuleMultiselectWidget}\n */\nOO.ui.CapsuleMultiselectWidget.prototype.removeItemsFromData = function ( datas ) {\n\tvar widget = this,\n\t\titems = [];\n\n\t$.each( datas, function ( i, data ) {\n\t\tvar item = widget.getItemFromData( data );\n\t\tif ( item ) {\n\t\t\titems.push( item );\n\t\t}\n\t} );\n\n\tif ( items.length ) {\n\t\tthis.removeItems( items );\n\t}\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CapsuleMultiselectWidget.prototype.addItems = function ( items ) {\n\tvar same, i, l,\n\t\toldItems = this.items.slice();\n\n\tOO.ui.mixin.GroupElement.prototype.addItems.call( this, items );\n\n\tif ( this.items.length !== oldItems.length ) {\n\t\tsame = false;\n\t} else {\n\t\tsame = true;\n\t\tfor ( i = 0, l = oldItems.length; same && i < l; i++ ) {\n\t\t\tsame = same && this.items[ i ] === oldItems[ i ];\n\t\t}\n\t}\n\tif ( !same ) {\n\t\tthis.emit( 'change', this.getItemsData() );\n\t\tthis.updateInputSize();\n\t}\n\n\treturn this;\n};\n\n/**\n * Removes the item from the list and copies its label to `this.$input`.\n *\n * @param {Object} item\n */\nOO.ui.CapsuleMultiselectWidget.prototype.editItem = function ( item ) {\n\tthis.addItemFromLabel( this.$input.val() );\n\tthis.clearInput();\n\tthis.$input.val( item.label );\n\tthis.updateInputSize();\n\tthis.focus();\n\tthis.menu.updateItemVisibility(); // Hack, we shouldn't be calling this method directly\n\tthis.removeItems( [ item ] );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CapsuleMultiselectWidget.prototype.removeItems = function ( items ) {\n\tvar same, i, l,\n\t\toldItems = this.items.slice();\n\n\tOO.ui.mixin.GroupElement.prototype.removeItems.call( this, items );\n\n\tif ( this.items.length !== oldItems.length ) {\n\t\tsame = false;\n\t} else {\n\t\tsame = true;\n\t\tfor ( i = 0, l = oldItems.length; same && i < l; i++ ) {\n\t\t\tsame = same && this.items[ i ] === oldItems[ i ];\n\t\t}\n\t}\n\tif ( !same ) {\n\t\tthis.emit( 'change', this.getItemsData() );\n\t\tthis.updateInputSize();\n\t}\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CapsuleMultiselectWidget.prototype.clearItems = function () {\n\tif ( this.items.length ) {\n\t\tOO.ui.mixin.GroupElement.prototype.clearItems.call( this );\n\t\tthis.emit( 'change', this.getItemsData() );\n\t\tthis.updateInputSize();\n\t}\n\treturn this;\n};\n\n/**\n * Given an item, returns the item after it. If its the last item,\n * returns `this.$input`. If no item is passed, returns the very first\n * item.\n *\n * @param {OO.ui.CapsuleItemWidget} [item]\n * @return {OO.ui.CapsuleItemWidget|jQuery|boolean}\n */\nOO.ui.CapsuleMultiselectWidget.prototype.getNextItem = function ( item ) {\n\tvar itemIndex;\n\n\tif ( item === undefined ) {\n\t\treturn this.items[ 0 ];\n\t}\n\n\titemIndex = this.items.indexOf( item );\n\tif ( itemIndex < 0 ) { // Item not in list\n\t\treturn false;\n\t} else if ( itemIndex === this.items.length - 1 ) { // Last item\n\t\treturn this.$input;\n\t} else {\n\t\treturn this.items[ itemIndex + 1 ];\n\t}\n};\n\n/**\n * Given an item, returns the item before it. If its the first item,\n * returns `this.$input`. If no item is passed, returns the very last\n * item.\n *\n * @param {OO.ui.CapsuleItemWidget} [item]\n * @return {OO.ui.CapsuleItemWidget|jQuery|boolean}\n */\nOO.ui.CapsuleMultiselectWidget.prototype.getPreviousItem = function ( item ) {\n\tvar itemIndex;\n\n\tif ( item === undefined ) {\n\t\treturn this.items[ this.items.length - 1 ];\n\t}\n\n\titemIndex = this.items.indexOf( item );\n\tif ( itemIndex < 0 ) { // Item not in list\n\t\treturn false;\n\t} else if ( itemIndex === 0 ) { // First item\n\t\treturn this.$input;\n\t} else {\n\t\treturn this.items[ itemIndex - 1 ];\n\t}\n};\n\n/**\n * Get the capsule widget's menu.\n *\n * @return {OO.ui.MenuSelectWidget} Menu widget\n */\nOO.ui.CapsuleMultiselectWidget.prototype.getMenu = function () {\n\treturn this.menu;\n};\n\n/**\n * Handle focus events\n *\n * @private\n * @param {jQuery.Event} event\n */\nOO.ui.CapsuleMultiselectWidget.prototype.onInputFocus = function () {\n\tif ( !this.isDisabled() ) {\n\t\tthis.updateInputSize();\n\t\tthis.menu.toggle( true );\n\t}\n};\n\n/**\n * Handle blur events\n *\n * @private\n * @param {jQuery.Event} event\n */\nOO.ui.CapsuleMultiselectWidget.prototype.onInputBlur = function () {\n\tthis.addItemFromLabel( this.$input.val() );\n\tthis.clearInput();\n};\n\n/**\n * Handles popup focus out events.\n *\n * @private\n * @param {jQuery.Event} e Focus out event\n */\nOO.ui.CapsuleMultiselectWidget.prototype.onPopupFocusOut = function () {\n\tvar widget = this.popup;\n\n\tsetTimeout( function () {\n\t\tif (\n\t\t\twidget.isVisible() &&\n\t\t\t!OO.ui.contains( widget.$element.add( widget.$autoCloseIgnore ).get(), document.activeElement, true )\n\t\t) {\n\t\t\twidget.toggle( false );\n\t\t}\n\t} );\n};\n\n/**\n * Handle mouse down events.\n *\n * @private\n * @param {jQuery.Event} e Mouse down event\n */\nOO.ui.CapsuleMultiselectWidget.prototype.onMouseDown = function ( e ) {\n\tif ( e.which === OO.ui.MouseButtons.LEFT ) {\n\t\tthis.focus();\n\t\treturn false;\n\t} else {\n\t\tthis.updateInputSize();\n\t}\n};\n\n/**\n * Handle key press events.\n *\n * @private\n * @param {jQuery.Event} e Key press event\n */\nOO.ui.CapsuleMultiselectWidget.prototype.onKeyPress = function ( e ) {\n\tif ( !this.isDisabled() ) {\n\t\tif ( e.which === OO.ui.Keys.ESCAPE ) {\n\t\t\tthis.clearInput();\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.popup ) {\n\t\t\tthis.menu.toggle( true );\n\t\t\tif ( e.which === OO.ui.Keys.ENTER ) {\n\t\t\t\tif ( this.addItemFromLabel( this.$input.val() ) ) {\n\t\t\t\t\tthis.clearInput();\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Make sure the input gets resized.\n\t\t\tsetTimeout( this.updateInputSize.bind( this ), 0 );\n\t\t}\n\t}\n};\n\n/**\n * Handle key down events.\n *\n * @private\n * @param {jQuery.Event} e Key down event\n */\nOO.ui.CapsuleMultiselectWidget.prototype.onKeyDown = function ( e ) {\n\tif (\n\t\t!this.isDisabled() &&\n\t\tthis.$input.val() === '' &&\n\t\tthis.items.length\n\t) {\n\t\t// 'keypress' event is not triggered for Backspace\n\t\tif ( e.keyCode === OO.ui.Keys.BACKSPACE ) {\n\t\t\tif ( e.metaKey || e.ctrlKey ) {\n\t\t\t\tthis.removeItems( this.items.slice( -1 ) );\n\t\t\t} else {\n\t\t\t\tthis.editItem( this.items[ this.items.length - 1 ] );\n\t\t\t}\n\t\t\treturn false;\n\t\t} else if ( e.keyCode === OO.ui.Keys.LEFT ) {\n\t\t\tthis.getPreviousItem().focus();\n\t\t} else if ( e.keyCode === OO.ui.Keys.RIGHT ) {\n\t\t\tthis.getNextItem().focus();\n\t\t}\n\t}\n};\n\n/**\n * Update the dimensions of the text input field to encompass all available area.\n *\n * @private\n * @param {jQuery.Event} e Event of some sort\n */\nOO.ui.CapsuleMultiselectWidget.prototype.updateInputSize = function () {\n\tvar $lastItem, direction, contentWidth, currentWidth, bestWidth;\n\tif ( this.$input && !this.isDisabled() ) {\n\t\tthis.$input.css( 'width', '1em' );\n\t\t$lastItem = this.$group.children().last();\n\t\tdirection = OO.ui.Element.static.getDir( this.$handle );\n\n\t\t// Get the width of the input with the placeholder text as\n\t\t// the value and save it so that we don't keep recalculating\n\t\tif (\n\t\t\tthis.contentWidthWithPlaceholder === undefined &&\n\t\t\tthis.$input.val() === '' &&\n\t\t\tthis.$input.attr( 'placeholder' ) !== undefined\n\t\t) {\n\t\t\tthis.$input.val( this.$input.attr( 'placeholder' ) );\n\t\t\tthis.contentWidthWithPlaceholder = this.$input[ 0 ].scrollWidth;\n\t\t\tthis.$input.val( '' );\n\n\t\t}\n\n\t\t// Always keep the input wide enough for the placeholder text\n\t\tcontentWidth = Math.max(\n\t\t\tthis.$input[ 0 ].scrollWidth,\n\t\t\t// undefined arguments in Math.max lead to NaN\n\t\t\t( this.contentWidthWithPlaceholder === undefined ) ?\n\t\t\t\t0 : this.contentWidthWithPlaceholder\n\t\t);\n\t\tcurrentWidth = this.$input.width();\n\n\t\tif ( contentWidth < currentWidth ) {\n\t\t\tthis.updateIfHeightChanged();\n\t\t\t// All is fine, don't perform expensive calculations\n\t\t\treturn;\n\t\t}\n\n\t\tif ( $lastItem.length === 0 ) {\n\t\t\tbestWidth = this.$content.innerWidth();\n\t\t} else {\n\t\t\tbestWidth = direction === 'ltr' ?\n\t\t\t\tthis.$content.innerWidth() - $lastItem.position().left - $lastItem.outerWidth() :\n\t\t\t\t$lastItem.position().left;\n\t\t}\n\n\t\t// Some safety margin for sanity, because I *really* don't feel like finding out where the few\n\t\t// pixels this is off by are coming from.\n\t\tbestWidth -= 10;\n\t\tif ( contentWidth > bestWidth ) {\n\t\t\t// This will result in the input getting shifted to the next line\n\t\t\tbestWidth = this.$content.innerWidth() - 10;\n\t\t}\n\t\tthis.$input.width( Math.floor( bestWidth ) );\n\t\tthis.updateIfHeightChanged();\n\t} else {\n\t\tthis.updateIfHeightChanged();\n\t}\n};\n\n/**\n * Determine if widget height changed, and if so, update menu position and emit 'resize' event.\n *\n * @private\n */\nOO.ui.CapsuleMultiselectWidget.prototype.updateIfHeightChanged = function () {\n\tvar height = this.$element.height();\n\tif ( height !== this.height ) {\n\t\tthis.height = height;\n\t\tthis.menu.position();\n\t\tif ( this.popup ) {\n\t\t\tthis.popup.updateDimensions();\n\t\t}\n\t\tthis.emit( 'resize' );\n\t}\n};\n\n/**\n * Handle menu choose events.\n *\n * @private\n * @param {OO.ui.OptionWidget} item Chosen item\n */\nOO.ui.CapsuleMultiselectWidget.prototype.onMenuChoose = function ( item ) {\n\tif ( item && item.isVisible() ) {\n\t\tthis.addItemsFromData( [ item.getData() ] );\n\t\tthis.clearInput();\n\t}\n};\n\n/**\n * Handle menu toggle events.\n *\n * @private\n * @param {boolean} isVisible Menu toggle event\n */\nOO.ui.CapsuleMultiselectWidget.prototype.onMenuToggle = function ( isVisible ) {\n\tthis.$element.toggleClass( 'oo-ui-capsuleMultiselectWidget-open', isVisible );\n};\n\n/**\n * Handle menu item change events.\n *\n * @private\n */\nOO.ui.CapsuleMultiselectWidget.prototype.onMenuItemsChange = function () {\n\tthis.setItemsFromData( this.getItemsData() );\n\tthis.$element.toggleClass( 'oo-ui-capsuleMultiselectWidget-empty', this.menu.isEmpty() );\n};\n\n/**\n * Clear the input field\n *\n * @private\n */\nOO.ui.CapsuleMultiselectWidget.prototype.clearInput = function () {\n\tif ( this.$input ) {\n\t\tthis.$input.val( '' );\n\t\tthis.updateInputSize();\n\t}\n\tif ( this.popup ) {\n\t\tthis.popup.toggle( false );\n\t}\n\tthis.menu.toggle( false );\n\tthis.menu.selectItem();\n\tthis.menu.highlightItem();\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.CapsuleMultiselectWidget.prototype.setDisabled = function ( disabled ) {\n\tvar i, len;\n\n\t// Parent method\n\tOO.ui.CapsuleMultiselectWidget.parent.prototype.setDisabled.call( this, disabled );\n\n\tif ( this.$input ) {\n\t\tthis.$input.prop( 'disabled', this.isDisabled() );\n\t}\n\tif ( this.menu ) {\n\t\tthis.menu.setDisabled( this.isDisabled() );\n\t}\n\tif ( this.popup ) {\n\t\tthis.popup.setDisabled( this.isDisabled() );\n\t}\n\n\tif ( this.items ) {\n\t\tfor ( i = 0, len = this.items.length; i < len; i++ ) {\n\t\t\tthis.items[ i ].updateDisabled();\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Focus the widget\n *\n * @chainable\n */\nOO.ui.CapsuleMultiselectWidget.prototype.focus = function () {\n\tif ( !this.isDisabled() ) {\n\t\tif ( this.popup ) {\n\t\t\tthis.popup.setSize( this.$handle.outerWidth() );\n\t\t\tthis.popup.toggle( true );\n\t\t\tOO.ui.findFocusable( this.popup.$element ).focus();\n\t\t} else {\n\t\t\tOO.ui.mixin.TabIndexedElement.prototype.focus.call( this );\n\t\t}\n\t}\n\treturn this;\n};\n","/**\n * TagItemWidgets are used within a {@link OO.ui.TagMultiselectWidget\n * TagMultiselectWidget} to display the selected items.\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.ItemWidget\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.FlaggedElement\n * @mixins OO.ui.mixin.TabIndexedElement\n * @mixins OO.ui.mixin.DraggableElement\n *\n * @constructor\n * @param {Object} [config] Configuration object\n * @cfg {boolean} [valid=true] Item is valid\n */\nOO.ui.TagItemWidget = function OoUiTagItemWidget( config ) {\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.TagItemWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ItemWidget.call( this );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\tOO.ui.mixin.FlaggedElement.call( this, config );\n\tOO.ui.mixin.TabIndexedElement.call( this, config );\n\tOO.ui.mixin.DraggableElement.call( this, config );\n\n\tthis.valid = config.valid === undefined ? true : !!config.valid;\n\n\tthis.closeButton = new OO.ui.ButtonWidget( {\n\t\tframed: false,\n\t\tindicator: 'clear',\n\t\ttabIndex: -1\n\t} );\n\tthis.closeButton.setDisabled( this.isDisabled() );\n\n\t// Events\n\tthis.closeButton\n\t\t.connect( this, { click: 'remove' } );\n\tthis.$element\n\t\t.on( 'click', this.select.bind( this ) )\n\t\t.on( 'keydown', this.onKeyDown.bind( this ) )\n\t\t// Prevent propagation of mousedown; the tag item \"lives\" in the\n\t\t// clickable area of the TagMultiselectWidget, which listens to\n\t\t// mousedown to open the menu or popup. We want to prevent that\n\t\t// for clicks specifically on the tag itself, so the actions taken\n\t\t// are more deliberate. When the tag is clicked, it will emit the\n\t\t// selection event (similar to how #OO.ui.MultioptionWidget emits 'change')\n\t\t// and can be handled separately.\n\t\t.on( 'mousedown', function ( e ) { e.stopPropagation(); } );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-tagItemWidget' )\n\t\t.append( this.$label, this.closeButton.$element );\n};\n\n/* Initialization */\n\nOO.inheritClass( OO.ui.TagItemWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.ItemWidget );\nOO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.FlaggedElement );\nOO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.TabIndexedElement );\nOO.mixinClass( OO.ui.TagItemWidget, OO.ui.mixin.DraggableElement );\n\n/* Events */\n\n/**\n * @event remove\n *\n * A remove action was performed on the item\n */\n\n/**\n * @event navigate\n * @param {string} direction Direction of the movement, forward or backwards\n *\n * A navigate action was performed on the item\n */\n\n/**\n * @event select\n *\n * The tag widget was selected. This can occur when the widget\n * is either clicked or enter was pressed on it.\n */\n\n/**\n * @event valid\n * @param {boolean} isValid Item is valid\n *\n * Item validity has changed\n */\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.TagItemWidget.prototype.setDisabled = function ( state ) {\n\t// Parent method\n\tOO.ui.TagItemWidget.parent.prototype.setDisabled.call( this, state );\n\n\tif ( this.closeButton ) {\n\t\tthis.closeButton.setDisabled( state );\n\t}\n\treturn this;\n};\n\n/**\n * Handle removal of the item\n *\n * This is mainly for extensibility concerns, so other children\n * of this class can change the behavior if they need to. This\n * is called by both clicking the 'remove' button but also\n * on keypress, which is harder to override if needed.\n *\n * @fires remove\n */\nOO.ui.TagItemWidget.prototype.remove = function () {\n\tif ( !this.isDisabled() ) {\n\t\tthis.emit( 'remove' );\n\t}\n};\n\n/**\n * Handle a keydown event on the widget\n *\n * @fires navigate\n * @fires remove\n * @param {jQuery.Event} e Key down event\n * @return {boolean|undefined} false to stop the operation\n */\nOO.ui.TagItemWidget.prototype.onKeyDown = function ( e ) {\n\tvar movement;\n\n\tif ( e.keyCode === OO.ui.Keys.BACKSPACE || e.keyCode === OO.ui.Keys.DELETE ) {\n\t\tthis.remove();\n\t\treturn false;\n\t} else if ( e.keyCode === OO.ui.Keys.ENTER ) {\n\t\tthis.select();\n\t\treturn false;\n\t} else if (\n\t\te.keyCode === OO.ui.Keys.LEFT ||\n\t\te.keyCode === OO.ui.Keys.RIGHT\n\t) {\n\t\tif ( OO.ui.Element.static.getDir( this.$element ) === 'rtl' ) {\n\t\t\tmovement = {\n\t\t\t\tleft: 'forwards',\n\t\t\t\tright: 'backwards'\n\t\t\t};\n\t\t} else {\n\t\t\tmovement = {\n\t\t\t\tleft: 'backwards',\n\t\t\t\tright: 'forwards'\n\t\t\t};\n\t\t}\n\n\t\tthis.emit(\n\t\t\t'navigate',\n\t\t\te.keyCode === OO.ui.Keys.LEFT ?\n\t\t\t\tmovement.left : movement.right\n\t\t);\n\t}\n};\n\n/**\n * Select this item\n *\n * @fires select\n */\nOO.ui.TagItemWidget.prototype.select = function () {\n\tif ( !this.isDisabled() ) {\n\t\tthis.emit( 'select' );\n\t}\n};\n\n/**\n * Set the valid state of this item\n *\n * @param {boolean} [valid] Item is valid\n * @fires valid\n */\nOO.ui.TagItemWidget.prototype.toggleValid = function ( valid ) {\n\tvalid = valid === undefined ? !this.valid : !!valid;\n\n\tif ( this.valid !== valid ) {\n\t\tthis.valid = valid;\n\n\t\tthis.setFlags( { invalid: !this.valid } );\n\n\t\tthis.emit( 'valid', this.valid );\n\t}\n};\n\n/**\n * Check whether the item is valid\n *\n * @return {boolean} Item is valid\n */\nOO.ui.TagItemWidget.prototype.isValid = function () {\n\treturn this.valid;\n};\n","/**\n * A basic tag multiselect widget, similar in concept to {@link OO.ui.ComboBoxInputWidget combo box widget}\n * that allows the user to add multiple values that are displayed in a tag area.\n *\n * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * This widget is a base widget; see {@link OO.ui.MenuTagMultiselectWidget MenuTagMultiselectWidget} and\n * {@link OO.ui.PopupTagMultiselectWidget PopupTagMultiselectWidget} for the implementations that use\n * a menu and a popup respectively.\n *\n *     @example\n *     // Example: A basic TagMultiselectWidget.\n *     var widget = new OO.ui.TagMultiselectWidget( {\n *         inputPosition: 'outline',\n *         allowedValues: [ 'Option 1', 'Option 2', 'Option 3' ],\n *         selected: [ 'Option 1' ]\n *     } );\n *     $( 'body' ).append( widget.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.GroupWidget\n * @mixins OO.ui.mixin.DraggableGroupElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.TabIndexedElement\n * @mixins OO.ui.mixin.FlaggedElement\n *\n * @constructor\n * @param {Object} config Configuration object\n * @cfg {Object} [input] Configuration options for the input widget\n * @cfg {OO.ui.InputWidget} [inputWidget] An optional input widget. If given, it will\n *  replace the input widget used in the TagMultiselectWidget. If not given,\n *  TagMultiselectWidget creates its own.\n * @cfg {boolean} [inputPosition='inline'] Position of the input. Options are:\n * \t- inline: The input is invisible, but exists inside the tag list, so\n * \t\tthe user types into the tag groups to add tags.\n * \t- outline: The input is underneath the tag area.\n * \t- none: No input supplied\n * @cfg {boolean} [allowEditTags=true] Allow editing of the tags by clicking them\n * @cfg {boolean} [allowArbitrary=false] Allow data items to be added even if\n *  not present in the menu.\n * @cfg {Object[]} [allowedValues] An array representing the allowed items\n *  by their datas.\n * @cfg {boolean} [allowDuplicates=false] Allow duplicate items to be added\n * @cfg {boolean} [allowDisplayInvalidTags=false] Allow the display of\n *  invalid tags. These tags will display with an invalid state, and\n *  the widget as a whole will have an invalid state if any invalid tags\n *  are present.\n * @cfg {boolean} [allowReordering=true] Allow reordering of the items\n * @cfg {Object[]|String[]} [selected] A set of selected tags. If given,\n *  these will appear in the tag list on initialization, as long as they\n *  pass the validity tests.\n */\nOO.ui.TagMultiselectWidget = function OoUiTagMultiselectWidget( config ) {\n\tvar inputEvents,\n\t\trAF = window.requestAnimationFrame || setTimeout,\n\t\twidget = this,\n\t\t$tabFocus = $( '<span>' )\n\t\t\t.addClass( 'oo-ui-tagMultiselectWidget-focusTrap' );\n\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.TagMultiselectWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupWidget.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.TabIndexedElement.call( this, config );\n\tOO.ui.mixin.FlaggedElement.call( this, config );\n\tOO.ui.mixin.DraggableGroupElement.call( this, config );\n\n\tthis.toggleDraggable(\n\t\tconfig.allowReordering === undefined ?\n\t\t\ttrue : !!config.allowReordering\n\t);\n\n\tthis.inputPosition = this.constructor.static.allowedInputPositions.indexOf( config.inputPosition ) > -1 ?\n\t\t\tconfig.inputPosition : 'inline';\n\tthis.allowEditTags = config.allowEditTags === undefined ? true : !!config.allowEditTags;\n\tthis.allowArbitrary = !!config.allowArbitrary;\n\tthis.allowDuplicates = !!config.allowDuplicates;\n\tthis.allowedValues = config.allowedValues || [];\n\tthis.allowDisplayInvalidTags = config.allowDisplayInvalidTags;\n\tthis.hasInput = this.inputPosition !== 'none';\n\tthis.height = null;\n\tthis.valid = true;\n\n\tthis.$content = $( '<div>' )\n\t\t.addClass( 'oo-ui-tagMultiselectWidget-content' );\n\tthis.$handle = $( '<div>' )\n\t\t.addClass( 'oo-ui-tagMultiselectWidget-handle' )\n\t\t.append(\n\t\t\tthis.$indicator,\n\t\t\tthis.$icon,\n\t\t\tthis.$content\n\t\t\t\t.append(\n\t\t\t\t\tthis.$group\n\t\t\t\t\t\t.addClass( 'oo-ui-tagMultiselectWidget-group' )\n\t\t\t\t)\n\t\t);\n\n\t// Events\n\tthis.aggregate( {\n\t\tremove: 'itemRemove',\n\t\tnavigate: 'itemNavigate',\n\t\tselect: 'itemSelect'\n\t} );\n\tthis.connect( this, {\n\t\titemRemove: 'onTagRemove',\n\t\titemSelect: 'onTagSelect',\n\t\titemNavigate: 'onTagNavigate',\n\t\tchange: 'onChangeTags'\n\t} );\n\tthis.$handle.on( {\n\t\tmousedown: this.onMouseDown.bind( this )\n\t} );\n\n\t// Initialize\n\tthis.$element\n\t\t.addClass( 'oo-ui-tagMultiselectWidget' )\n\t\t.append( this.$handle );\n\n\tif ( this.hasInput ) {\n\t\tif ( config.inputWidget ) {\n\t\t\tthis.input = config.inputWidget;\n\t\t} else {\n\t\t\tthis.input = new OO.ui.TextInputWidget( $.extend( {\n\t\t\t\tplaceholder: config.placeholder,\n\t\t\t\tclasses: [ 'oo-ui-tagMultiselectWidget-input' ]\n\t\t\t}, config.input ) );\n\t\t}\n\t\tthis.input.setDisabled( this.isDisabled() );\n\n\t\tinputEvents = {\n\t\t\tfocus: this.onInputFocus.bind( this ),\n\t\t\tblur: this.onInputBlur.bind( this ),\n\t\t\t'propertychange change click mouseup keydown keyup input cut paste select focus':\n\t\t\t\tOO.ui.debounce( this.updateInputSize.bind( this ) ),\n\t\t\tkeydown: this.onInputKeyDown.bind( this ),\n\t\t\tkeypress: this.onInputKeyPress.bind( this )\n\t\t};\n\n\t\tthis.input.$input.on( inputEvents );\n\n\t\tif ( this.inputPosition === 'outline' ) {\n\t\t\t// Override max-height for the input widget\n\t\t\t// in the case the widget is outline so it can\n\t\t\t// stretch all the way if the widet is wide\n\t\t\tthis.input.$element.css( 'max-width', 'inherit' );\n\t\t\tthis.$element\n\t\t\t\t.addClass( 'oo-ui-tagMultiselectWidget-outlined' )\n\t\t\t\t.append( this.input.$element );\n\t\t} else {\n\t\t\tthis.$element.addClass( 'oo-ui-tagMultiselectWidget-inlined' );\n\t\t\t// HACK: When the widget is using 'inline' input, the\n\t\t\t// behavior needs to only use the $input itself\n\t\t\t// so we style and size it accordingly (otherwise\n\t\t\t// the styling and sizing can get very convoluted\n\t\t\t// when the wrapping divs and other elements)\n\t\t\t// We are taking advantage of still being able to\n\t\t\t// call the widget itself for operations like\n\t\t\t// .getValue() and setDisabled() and .focus() but\n\t\t\t// having only the $input attached to the DOM\n\t\t\tthis.$content.append( this.input.$input );\n\t\t}\n\t} else {\n\t\tthis.$content.append( $tabFocus );\n\t}\n\n\tthis.setTabIndexedElement(\n\t\tthis.hasInput ?\n\t\t\tthis.input.$input :\n\t\t\t$tabFocus\n\t);\n\n\tif ( config.selected ) {\n\t\tthis.setValue( config.selected );\n\t}\n\n\t// HACK: Input size needs to be calculated after everything\n\t// else is rendered\n\trAF( function () {\n\t\tif ( widget.hasInput ) {\n\t\t\twidget.updateInputSize();\n\t\t}\n\t} );\n};\n\n/* Initialization */\n\nOO.inheritClass( OO.ui.TagMultiselectWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.GroupWidget );\nOO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.DraggableGroupElement );\nOO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.TabIndexedElement );\nOO.mixinClass( OO.ui.TagMultiselectWidget, OO.ui.mixin.FlaggedElement );\n\n/* Static properties */\n\n/**\n * Allowed input positions.\n * - inline: The input is inside the tag list\n * - outline: The input is under the tag list\n * - none: There is no input\n *\n * @property {Array}\n */\nOO.ui.TagMultiselectWidget.static.allowedInputPositions = [ 'inline', 'outline', 'none' ];\n\n/* Methods */\n\n/**\n * Handle mouse down events.\n *\n * @private\n * @param {jQuery.Event} e Mouse down event\n * @return {boolean} False to prevent defaults\n */\nOO.ui.TagMultiselectWidget.prototype.onMouseDown = function ( e ) {\n\tif ( !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) {\n\t\tthis.focus();\n\t\treturn false;\n\t}\n};\n\n/**\n * Handle key press events.\n *\n * @private\n * @param {jQuery.Event} e Key press event\n * @return {boolean} Whether to prevent defaults\n */\nOO.ui.TagMultiselectWidget.prototype.onInputKeyPress = function ( e ) {\n\tvar stopOrContinue,\n\t\twithMetaKey = e.metaKey || e.ctrlKey;\n\n\tif ( !this.isDisabled() ) {\n\t\tif ( e.which === OO.ui.Keys.ENTER ) {\n\t\t\tstopOrContinue = this.doInputEnter( e, withMetaKey );\n\t\t}\n\n\t\t// Make sure the input gets resized.\n\t\tsetTimeout( this.updateInputSize.bind( this ), 0 );\n\t\treturn stopOrContinue;\n\t}\n};\n\n/**\n * Handle key down events.\n *\n * @private\n * @param {jQuery.Event} e Key down event\n * @return {boolean}\n */\nOO.ui.TagMultiselectWidget.prototype.onInputKeyDown = function ( e ) {\n\tvar movement, direction,\n\t\twithMetaKey = e.metaKey || e.ctrlKey;\n\n\tif ( !this.isDisabled() ) {\n\t\t// 'keypress' event is not triggered for Backspace\n\t\tif ( e.keyCode === OO.ui.Keys.BACKSPACE ) {\n\t\t\treturn this.doInputBackspace( e, withMetaKey );\n\t\t} else if ( e.keyCode === OO.ui.Keys.ESCAPE ) {\n\t\t\treturn this.doInputEscape( e );\n\t\t} else if (\n\t\t\te.keyCode === OO.ui.Keys.LEFT ||\n\t\t\te.keyCode === OO.ui.Keys.RIGHT\n\t\t) {\n\t\t\tif ( OO.ui.Element.static.getDir( this.$element ) === 'rtl' ) {\n\t\t\t\tmovement = {\n\t\t\t\t\tleft: 'forwards',\n\t\t\t\t\tright: 'backwards'\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tmovement = {\n\t\t\t\t\tleft: 'backwards',\n\t\t\t\t\tright: 'forwards'\n\t\t\t\t};\n\t\t\t}\n\t\t\tdirection = e.keyCode === OO.ui.Keys.LEFT ?\n\t\t\t\tmovement.left : movement.right;\n\n\t\t\treturn this.doInputArrow( e, direction, withMetaKey );\n\t\t}\n\t}\n};\n\n/**\n * Respond to input focus event\n */\nOO.ui.TagMultiselectWidget.prototype.onInputFocus = function () {\n\tthis.$element.addClass( 'oo-ui-tagMultiselectWidget-focus' );\n};\n\n/**\n * Respond to input blur event\n */\nOO.ui.TagMultiselectWidget.prototype.onInputBlur = function () {\n\tthis.$element.removeClass( 'oo-ui-tagMultiselectWidget-focus' );\n};\n\n/**\n * Perform an action after the enter key on the input\n *\n * @param {jQuery.Event} e Event data\n * @param {boolean} [withMetaKey] Whether this key was pressed with\n * a meta key like 'ctrl'\n * @return {boolean} Whether to prevent defaults\n */\nOO.ui.TagMultiselectWidget.prototype.doInputEnter = function () {\n\tthis.addTagFromInput();\n\treturn false;\n};\n\n/**\n * Perform an action responding to the enter key on the input\n *\n * @param {jQuery.Event} e Event data\n * @param {boolean} [withMetaKey] Whether this key was pressed with\n * a meta key like 'ctrl'\n * @return {boolean} Whether to prevent defaults\n */\nOO.ui.TagMultiselectWidget.prototype.doInputBackspace = function ( e, withMetaKey ) {\n\tvar items, item;\n\n\tif (\n\t\tthis.inputPosition === 'inline' &&\n\t\tthis.input.getValue() === '' &&\n\t\t!this.isEmpty()\n\t) {\n\t\t// Delete the last item\n\t\titems = this.getItems();\n\t\titem = items[ items.length - 1 ];\n\t\tthis.removeItems( [ item ] );\n\t\t// If Ctrl/Cmd was pressed, delete item entirely.\n\t\t// Otherwise put it into the text field for editing.\n\t\tif ( !withMetaKey ) {\n\t\t\tthis.input.setValue( item.getData() );\n\t\t}\n\n\t\treturn false;\n\t}\n};\n\n/**\n * Perform an action after the escape key on the input\n *\n * @param {jQuery.Event} e Event data\n */\nOO.ui.TagMultiselectWidget.prototype.doInputEscape = function () {\n\tthis.clearInput();\n};\n\n/**\n * Perform an action after the arrow key on the input, select the previous\n * or next item from the input.\n * See #getPreviousItem and #getNextItem\n *\n * @param {jQuery.Event} e Event data\n * @param {string} direction Direction of the movement; forwards or backwards\n * @param {boolean} [withMetaKey] Whether this key was pressed with\n *  a meta key like 'ctrl'\n */\nOO.ui.TagMultiselectWidget.prototype.doInputArrow = function ( e, direction ) {\n\tif (\n\t\tthis.inputPosition === 'inline' &&\n\t\t!this.isEmpty()\n\t) {\n\t\tif ( direction === 'backwards' ) {\n\t\t\t// Get previous item\n\t\t\tthis.getPreviousItem().focus();\n\t\t} else {\n\t\t\t// Get next item\n\t\t\tthis.getNextItem().focus();\n\t\t}\n\t}\n};\n\n/**\n * Respond to item select event\n *\n * @param {OO.ui.TagItemWidget} item Selected item\n */\nOO.ui.TagMultiselectWidget.prototype.onTagSelect = function ( item ) {\n\tif ( this.hasInput && this.allowEditTags ) {\n\t\tif ( this.input.getValue() ) {\n\t\t\tthis.addTagFromInput();\n\t\t}\n\t\t// 1. Get the label of the tag into the input\n\t\tthis.input.setValue( item.getData() );\n\t\t// 2. Remove the tag\n\t\tthis.removeItems( [ item ] );\n\t\t// 3. Focus the input\n\t\tthis.focus();\n\t}\n};\n\n/**\n * Respond to change event, where items were added, removed, or cleared.\n */\nOO.ui.TagMultiselectWidget.prototype.onChangeTags = function () {\n\tthis.toggleValid( this.checkValidity() );\n\tif ( this.hasInput ) {\n\t\tthis.updateInputSize();\n\t}\n\tthis.updateIfHeightChanged();\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.TagMultiselectWidget.prototype.setDisabled = function ( isDisabled ) {\n\t// Parent method\n\tOO.ui.TagMultiselectWidget.parent.prototype.setDisabled.call( this, isDisabled );\n\n\tif ( this.hasInput && this.input ) {\n\t\tthis.input.setDisabled( !!isDisabled );\n\t}\n\n\tif ( this.items ) {\n\t\tthis.getItems().forEach( function ( item ) {\n\t\t\titem.setDisabled( !!isDisabled );\n\t\t} );\n\t}\n};\n\n/**\n * Respond to tag remove event\n * @param {OO.ui.TagItemWidget} item Removed tag\n */\nOO.ui.TagMultiselectWidget.prototype.onTagRemove = function ( item ) {\n\tthis.removeTagByData( item.getData() );\n};\n\n/**\n * Respond to navigate event on the tag\n *\n * @param {OO.ui.TagItemWidget} item Removed tag\n * @param {string} direction Direction of movement; 'forwards' or 'backwards'\n */\nOO.ui.TagMultiselectWidget.prototype.onTagNavigate = function ( item, direction ) {\n\tif ( direction === 'forwards' ) {\n\t\tthis.getNextItem( item ).focus();\n\t} else {\n\t\tthis.getPreviousItem( item ).focus();\n\t}\n};\n\n/**\n * Add tag from input value\n */\nOO.ui.TagMultiselectWidget.prototype.addTagFromInput = function () {\n\tvar val = this.input.getValue(),\n\t\tisValid = this.isAllowedData( val );\n\n\tif ( !val ) {\n\t\treturn;\n\t}\n\n\tif ( isValid || this.allowDisplayInvalidTags ) {\n\t\tthis.addTag( val );\n\t\tthis.clearInput();\n\t\tthis.focus();\n\t}\n};\n\n/**\n * Clear the input\n */\nOO.ui.TagMultiselectWidget.prototype.clearInput = function () {\n\tthis.input.setValue( '' );\n};\n\n/**\n * Check whether the given value is a duplicate of an existing\n * tag already in the list.\n *\n * @param {string|Object} data Requested value\n * @return {boolean} Value is duplicate\n */\nOO.ui.TagMultiselectWidget.prototype.isDuplicateData = function ( data ) {\n\treturn !!this.getItemFromData( data );\n};\n\n/**\n * Check whether a given value is allowed to be added\n *\n * @param {string|Object} data Requested value\n * @return {boolean} Value is allowed\n */\nOO.ui.TagMultiselectWidget.prototype.isAllowedData = function ( data ) {\n\tif (\n\t\t!this.allowDuplicates &&\n\t\tthis.isDuplicateData( data )\n\t) {\n\t\treturn false;\n\t}\n\n\tif ( this.allowArbitrary ) {\n\t\treturn true;\n\t}\n\n\t// Check with allowed values\n\tif (\n\t\tthis.getAllowedValues().some( function ( value ) {\n\t\t\treturn data === value;\n\t\t} )\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n/**\n * Get the allowed values list\n *\n * @return {string[]} Allowed data values\n */\nOO.ui.TagMultiselectWidget.prototype.getAllowedValues = function () {\n\treturn this.allowedValues;\n};\n\n/**\n * Add a value to the allowed values list\n *\n * @param {string} value Allowed data value\n */\nOO.ui.TagMultiselectWidget.prototype.addAllowedValue = function ( value ) {\n\tif ( this.allowedValues.indexOf( value ) === -1 ) {\n\t\tthis.allowedValues.push( value );\n\t}\n};\n\n/**\n * Get the datas of the currently selected items\n *\n * @return {string[]|Object[]} Datas of currently selected items\n */\nOO.ui.TagMultiselectWidget.prototype.getValue = function () {\n\treturn this.getItems()\n\t\t.filter( function ( item ) {\n\t\t\treturn item.isValid();\n\t\t} )\n\t\t.map( function ( item ) {\n\t\t\treturn item.getData();\n\t\t} );\n};\n\n/**\n * Set the value of this widget by datas.\n *\n * @param {string|string[]|Object|Object[]} valueObject An object representing the data\n *  and label of the value. If the widget allows arbitrary values,\n *  the items will be added as-is. Otherwise, the data value will\n *  be checked against allowedValues.\n *  This object must contain at least a data key. Example:\n *  { data: 'foo', label: 'Foo item' }\n *  For multiple items, use an array of objects. For example:\n *   [\n *      { data: 'foo', label: 'Foo item' },\n *      { data: 'bar', label: 'Bar item' }\n * \t ]\n *  Value can also be added with plaintext array, for example:\n *  [ 'foo', 'bar', 'bla' ] or a single string, like 'foo'\n */\nOO.ui.TagMultiselectWidget.prototype.setValue = function ( valueObject ) {\n\tvalueObject = Array.isArray( valueObject ) ? valueObject : [ valueObject ];\n\n\tthis.clearItems();\n\tvalueObject.forEach( function ( obj ) {\n\t\tif ( typeof obj === 'string' ) {\n\t\t\tthis.addTag( obj );\n\t\t} else {\n\t\t\tthis.addTag( obj.data, obj.label );\n\t\t}\n\t}.bind( this ) );\n};\n\n/**\n * Add tag to the display area\n *\n * @param {string|Object} data Tag data\n * @param {string} [label] Tag label. If no label is provided, the\n *  stringified version of the data will be used instead.\n * @return {boolean} Item was added successfully\n */\nOO.ui.TagMultiselectWidget.prototype.addTag = function ( data, label ) {\n\tvar newItemWidget,\n\t\tisValid = this.isAllowedData( data );\n\n\tif ( isValid || this.allowDisplayInvalidTags ) {\n\t\tnewItemWidget = this.createTagItemWidget( data, label );\n\t\tnewItemWidget.toggleValid( isValid );\n\t\tthis.addItems( [ newItemWidget ] );\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n/**\n * Remove tag by its data property.\n *\n * @param {string|Object} data Tag data\n */\nOO.ui.TagMultiselectWidget.prototype.removeTagByData = function ( data ) {\n\tvar item = this.getItemFromData( data );\n\n\tthis.removeItems( [ item ] );\n};\n\n/**\n * Construct a OO.ui.TagItemWidget (or a subclass thereof) from given label and data.\n *\n * @protected\n * @param {string} data Item data\n * @param {string} label The label text.\n * @return {OO.ui.TagItemWidget}\n */\nOO.ui.TagMultiselectWidget.prototype.createTagItemWidget = function ( data, label ) {\n\tlabel = label || data;\n\n\treturn new OO.ui.TagItemWidget( { data: data, label: label } );\n};\n\n/**\n * Given an item, returns the item after it. If the item is already the\n * last item, return `this.input`. If no item is passed, returns the\n * very first item.\n *\n * @protected\n * @param {OO.ui.TagItemWidget} [item] Tag item\n * @return {OO.ui.Widget} The next widget available.\n */\nOO.ui.TagMultiselectWidget.prototype.getNextItem = function ( item ) {\n\tvar itemIndex = this.items.indexOf( item );\n\n\tif ( item === undefined || itemIndex === -1 ) {\n\t\treturn this.items[ 0 ];\n\t}\n\n\tif ( itemIndex === this.items.length - 1 ) { // Last item\n\t\tif ( this.hasInput ) {\n\t\t\treturn this.input;\n\t\t} else {\n\t\t\t// Return first item\n\t\t\treturn this.items[ 0 ];\n\t\t}\n\t} else {\n\t\treturn this.items[ itemIndex + 1 ];\n\t}\n};\n\n/**\n * Given an item, returns the item before it. If the item is already the\n * first item, return `this.input`. If no item is passed, returns the\n * very last item.\n *\n * @protected\n * @param {OO.ui.TagItemWidget} [item] Tag item\n * @return {OO.ui.Widget} The previous widget available.\n */\nOO.ui.TagMultiselectWidget.prototype.getPreviousItem = function ( item ) {\n\tvar itemIndex = this.items.indexOf( item );\n\n\tif ( item === undefined || itemIndex === -1 ) {\n\t\treturn this.items[ this.items.length - 1 ];\n\t}\n\n\tif ( itemIndex === 0 ) {\n\t\tif ( this.hasInput ) {\n\t\t\treturn this.input;\n\t\t} else {\n\t\t\t// Return the last item\n\t\t\treturn this.items[ this.items.length - 1 ];\n\t\t}\n\t} else {\n\t\treturn this.items[ itemIndex - 1 ];\n\t}\n};\n\n/**\n * Update the dimensions of the text input field to encompass all available area.\n * This is especially relevant for when the input is at the edge of a line\n * and should get smaller. The usual operation (as an inline-block with min-width)\n * does not work in that case, pushing the input downwards to the next line.\n *\n * @private\n */\nOO.ui.TagMultiselectWidget.prototype.updateInputSize = function () {\n\tvar $lastItem, direction, contentWidth, currentWidth, bestWidth;\n\tif ( this.inputPosition === 'inline' && !this.isDisabled() ) {\n\t\tthis.input.$input.css( 'width', '1em' );\n\t\t$lastItem = this.$group.children().last();\n\t\tdirection = OO.ui.Element.static.getDir( this.$handle );\n\n\t\t// Get the width of the input with the placeholder text as\n\t\t// the value and save it so that we don't keep recalculating\n\t\tif (\n\t\t\tthis.contentWidthWithPlaceholder === undefined &&\n\t\t\tthis.input.getValue() === '' &&\n\t\t\tthis.input.$input.attr( 'placeholder' ) !== undefined\n\t\t) {\n\t\t\tthis.input.setValue( this.input.$input.attr( 'placeholder' ) );\n\t\t\tthis.contentWidthWithPlaceholder = this.input.$input[ 0 ].scrollWidth;\n\t\t\tthis.input.setValue( '' );\n\n\t\t}\n\n\t\t// Always keep the input wide enough for the placeholder text\n\t\tcontentWidth = Math.max(\n\t\t\tthis.input.$input[ 0 ].scrollWidth,\n\t\t\t// undefined arguments in Math.max lead to NaN\n\t\t\t( this.contentWidthWithPlaceholder === undefined ) ?\n\t\t\t\t0 : this.contentWidthWithPlaceholder\n\t\t);\n\t\tcurrentWidth = this.input.$input.width();\n\n\t\tif ( contentWidth < currentWidth ) {\n\t\t\tthis.updateIfHeightChanged();\n\t\t\t// All is fine, don't perform expensive calculations\n\t\t\treturn;\n\t\t}\n\n\t\tif ( $lastItem.length === 0 ) {\n\t\t\tbestWidth = this.$content.innerWidth();\n\t\t} else {\n\t\t\tbestWidth = direction === 'ltr' ?\n\t\t\t\tthis.$content.innerWidth() - $lastItem.position().left - $lastItem.outerWidth() :\n\t\t\t\t$lastItem.position().left;\n\t\t}\n\n\t\t// Some safety margin for sanity, because I *really* don't feel like finding out where the few\n\t\t// pixels this is off by are coming from.\n\t\tbestWidth -= 10;\n\t\tif ( contentWidth > bestWidth ) {\n\t\t\t// This will result in the input getting shifted to the next line\n\t\t\tbestWidth = this.$content.innerWidth() - 10;\n\t\t}\n\t\tthis.input.$input.width( Math.floor( bestWidth ) );\n\t\tthis.updateIfHeightChanged();\n\t} else {\n\t\tthis.updateIfHeightChanged();\n\t}\n};\n\n/**\n * Determine if widget height changed, and if so,\n * emit the resize event. This is useful for when there are either\n * menus or popups attached to the bottom of the widget, to allow\n * them to change their positioning in case the widget moved down\n * or up.\n *\n * @private\n */\nOO.ui.TagMultiselectWidget.prototype.updateIfHeightChanged = function () {\n\tvar height = this.$element.height();\n\tif ( height !== this.height ) {\n\t\tthis.height = height;\n\t\tthis.emit( 'resize' );\n\t}\n};\n\n/**\n * Check whether all items in the widget are valid\n *\n * @return {boolean} Widget is valid\n */\nOO.ui.TagMultiselectWidget.prototype.checkValidity = function () {\n\treturn this.getItems().every( function ( item ) {\n\t\treturn item.isValid();\n\t} );\n};\n\n/**\n * Set the valid state of this item\n *\n * @param {boolean} [valid] Item is valid\n * @fires valid\n */\nOO.ui.TagMultiselectWidget.prototype.toggleValid = function ( valid ) {\n\tvalid = valid === undefined ? !this.valid : !!valid;\n\n\tif ( this.valid !== valid ) {\n\t\tthis.valid = valid;\n\n\t\tthis.setFlags( { invalid: !this.valid } );\n\n\t\tthis.emit( 'valid', this.valid );\n\t}\n};\n\n/**\n * Get the current valid state of the widget\n *\n * @return {boolean} Widget is valid\n */\nOO.ui.TagMultiselectWidget.prototype.isValid = function () {\n\treturn this.valid;\n};\n","/**\n * PopupTagMultiselectWidget is a {@link OO.ui.TagMultiselectWidget OO.ui.TagMultiselectWidget} intended\n * to use a popup. The popup can be configured to have a default input to insert values into the widget.\n *\n * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].\n *\n *     @example\n *     // Example: A basic PopupTagMultiselectWidget.\n *     var widget = new OO.ui.PopupTagMultiselectWidget();\n *     $( 'body' ).append( widget.$element );\n *\n *     // Example: A PopupTagMultiselectWidget with an external popup.\n *     var popupInput = new OO.ui.TextInputWidget(),\n *         widget = new OO.ui.PopupTagMultiselectWidget( {\n *            popupInput: popupInput,\n *            popup: {\n *               $content: popupInput.$element\n *            }\n *         } );\n *     $( 'body' ).append( widget.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options\n *\n * @class\n * @extends OO.ui.TagMultiselectWidget\n * @mixins OO.ui.mixin.PopupElement\n *\n * @param {Object} config Configuration object\n * @cfg {jQuery} [$overlay] An overlay for the popup.\n *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.\n * @cfg {Object} [popup] Configuration options for the popup\n * @cfg {OO.ui.InputWidget} [popupInput] An input widget inside the popup that will be\n *  focused when the popup is opened and will be used as replacement for the\n *  general input in the widget.\n */\nOO.ui.PopupTagMultiselectWidget = function OoUiPopupTagMultiselectWidget( config ) {\n\tvar defaultInput,\n\t\tdefaultConfig = { popup: {} };\n\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.PopupTagMultiselectWidget.parent.call( this, $.extend( { inputPosition: 'none' }, config ) );\n\n\tthis.$overlay = config.$overlay || this.$element;\n\n\tif ( !config.popup ) {\n\t\t// For the default base implementation, we give a popup\n\t\t// with an input widget inside it. For any other use cases\n\t\t// the popup needs to be populated externally and the\n\t\t// event handled to add tags separately and manually\n\t\tdefaultInput = new OO.ui.TextInputWidget();\n\n\t\tdefaultConfig.popupInput = defaultInput;\n\t\tdefaultConfig.popup.$content = defaultInput.$element;\n\n\t\tthis.$element.addClass( 'oo-ui-popupTagMultiselectWidget-defaultPopup' );\n\t}\n\n\t// Add overlay, and add that to the autoCloseIgnore\n\tdefaultConfig.popup.$overlay = this.$overlay;\n\tdefaultConfig.popup.$autoCloseIgnore = this.hasInput ?\n\t\tthis.input.$element.add( this.$overlay ) : this.$overlay;\n\n\t// Allow extending any of the above\n\tconfig = $.extend( defaultConfig, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.PopupElement.call( this, config );\n\n\tif ( this.hasInput ) {\n\t\tthis.input.$input.on( 'focus', this.popup.toggle.bind( this.popup, true ) );\n\t}\n\n\t// Configuration options\n\tthis.popupInput = config.popupInput;\n\tif ( this.popupInput ) {\n\t\tthis.popupInput.connect( this, {\n\t\t\tenter: 'onPopupInputEnter'\n\t\t} );\n\t}\n\n\t// Events\n\tthis.on( 'resize', this.popup.updateDimensions.bind( this.popup ) );\n\tthis.popup.connect( this, { toggle: 'onPopupToggle' } );\n\tthis.$tabIndexed\n\t\t.on( 'focus', this.onFocus.bind( this ) );\n\n\t// Initialize\n\tthis.$element\n\t\t.append( this.popup.$element )\n\t\t.addClass( 'oo-ui-popupTagMultiselectWidget' );\n};\n\n/* Initialization */\n\nOO.inheritClass( OO.ui.PopupTagMultiselectWidget, OO.ui.TagMultiselectWidget );\nOO.mixinClass( OO.ui.PopupTagMultiselectWidget, OO.ui.mixin.PopupElement );\n\n/* Methods */\n\n/**\n * Focus event handler.\n *\n * @private\n */\nOO.ui.PopupTagMultiselectWidget.prototype.onFocus = function () {\n\tthis.popup.toggle( true );\n};\n\n/**\n * Respond to popup toggle event\n *\n * @param {boolean} isVisible Popup is visible\n */\nOO.ui.PopupTagMultiselectWidget.prototype.onPopupToggle = function ( isVisible ) {\n\tif ( isVisible && this.popupInput ) {\n\t\tthis.popupInput.focus();\n\t}\n};\n\n/**\n * Respond to popup input enter event\n */\nOO.ui.PopupTagMultiselectWidget.prototype.onPopupInputEnter = function () {\n\tif ( this.popupInput ) {\n\t\tthis.addTagByPopupValue( this.popupInput.getValue() );\n\t\tthis.popupInput.setValue( '' );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.PopupTagMultiselectWidget.prototype.onTagSelect = function ( item ) {\n\tif ( this.popupInput && this.allowEditTags ) {\n\t\tthis.popupInput.setValue( item.getData() );\n\t\tthis.removeItems( [ item ] );\n\n\t\tthis.popup.toggle( true );\n\t\tthis.popupInput.focus();\n\t} else {\n\t\t// Parent\n\t\tOO.ui.PopupTagMultiselectWidget.parent.prototype.onTagSelect.call( this, item );\n\t}\n};\n\n/**\n * Add a tag by the popup value.\n * Whatever is responsible for setting the value in the popup should call\n * this method to add a tag, or use the regular methods like #addTag or\n * #setValue directly.\n *\n * @param {string} data The value of item\n * @param {string} [label] The label of the tag. If not given, the data is used.\n */\nOO.ui.PopupTagMultiselectWidget.prototype.addTagByPopupValue = function ( data, label ) {\n\tthis.addTag( data, label );\n};\n","/**\n * MenuTagMultiselectWidget is a {@link OO.ui.TagMultiselectWidget OO.ui.TagMultiselectWidget} intended\n * to use a menu of selectable options.\n *\n * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].\n *\n *     @example\n *     // Example: A basic MenuTagMultiselectWidget.\n *     var widget = new OO.ui.MenuTagMultiselectWidget( {\n *         inputPosition: 'outline',\n *         options: [\n *            { data: 'option1', label: 'Option 1' },\n *            { data: 'option2', label: 'Option 2' },\n *            { data: 'option3', label: 'Option 3' },\n *         ],\n *         selected: [ 'option1', 'option2' ]\n *     } );\n *     $( 'body' ).append( widget.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options\n *\n * @class\n * @extends OO.ui.TagMultiselectWidget\n *\n * @constructor\n * @param {Object} [config] Configuration object\n * @cfg {Object} [menu] Configuration object for the menu widget\n * @cfg {jQuery} [$overlay] An overlay for the menu.\n *  See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.\n * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`\n */\nOO.ui.MenuTagMultiselectWidget = function OoUiMenuTagMultiselectWidget( config ) {\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.MenuTagMultiselectWidget.parent.call( this, config );\n\n\tthis.$overlay = config.$overlay || this.$element;\n\n\tthis.menu = this.createMenuWidget( $.extend( {\n\t\twidget: this,\n\t\tinput: this.hasInput ? this.input : null,\n\t\t$input: this.hasInput ? this.input.$input : null,\n\t\tfilterFromInput: !!this.hasInput,\n\t\t$autoCloseIgnore: this.hasInput ?\n\t\t\tthis.input.$element.add( this.$overlay ) : this.$overlay,\n\t\t$floatableContainer: this.hasInput && this.inputPosition === 'outline' ?\n\t\t\tthis.input.$element : this.$element,\n\t\t$overlay: this.$overlay,\n\t\tdisabled: this.isDisabled()\n\t}, config.menu ) );\n\tthis.addOptions( config.options || [] );\n\n\t// Events\n\tthis.menu.connect( this, {\n\t\tchoose: 'onMenuChoose',\n\t\ttoggle: 'onMenuToggle'\n\t} );\n\tif ( this.hasInput ) {\n\t\tthis.input.connect( this, { change: 'onInputChange' } );\n\t}\n\tthis.connect( this, { resize: 'onResize' } );\n\n\t// Initialization\n\tthis.$overlay\n\t\t.append( this.menu.$element );\n\tthis.$element\n\t\t.addClass( 'oo-ui-menuTagMultiselectWidget' );\n};\n\n/* Initialization */\n\nOO.inheritClass( OO.ui.MenuTagMultiselectWidget, OO.ui.TagMultiselectWidget );\n\n/* Methods */\n\n/**\n * Respond to resize event\n */\nOO.ui.MenuTagMultiselectWidget.prototype.onResize = function () {\n\t// Reposition the menu\n\tthis.menu.position();\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MenuTagMultiselectWidget.prototype.onInputFocus = function () {\n\t// Parent method\n\tOO.ui.MenuTagMultiselectWidget.parent.prototype.onInputFocus.call( this );\n\n\tthis.menu.toggle( true );\n};\n\n/**\n * Respond to input change event\n */\nOO.ui.MenuTagMultiselectWidget.prototype.onInputChange = function () {\n\tthis.menu.toggle( true );\n};\n\n/**\n * Respond to menu choose event\n *\n * @param {OO.ui.OptionWidget} menuItem Chosen menu item\n */\nOO.ui.MenuTagMultiselectWidget.prototype.onMenuChoose = function ( menuItem ) {\n\t// Add tag\n\tthis.addTag( menuItem.getData(), menuItem.getLabel() );\n};\n\n/**\n * Respond to menu toggle event. Reset item highlights on hide.\n *\n * @param {boolean} isVisible The menu is visible\n */\nOO.ui.MenuTagMultiselectWidget.prototype.onMenuToggle = function ( isVisible ) {\n\tif ( !isVisible ) {\n\t\tthis.menu.selectItem( null );\n\t\tthis.menu.highlightItem( null );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MenuTagMultiselectWidget.prototype.onTagSelect = function ( tagItem ) {\n\tvar menuItem = this.menu.getItemFromData( tagItem.getData() );\n\t// Override the base behavior from TagMultiselectWidget; the base behavior\n\t// in TagMultiselectWidget is to remove the tag to edit it in the input,\n\t// but in our case, we want to utilize the menu selection behavior, and\n\t// definitely not remove the item.\n\n\t// Select the menu item\n\tthis.menu.selectItem( menuItem );\n\n\tthis.focus();\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MenuTagMultiselectWidget.prototype.addTagFromInput = function () {\n\tvar inputValue = this.input.getValue(),\n\t\thighlightedItem = this.menu.getHighlightedItem(),\n\t\titem = this.menu.getItemFromData( inputValue );\n\n\t// Override the parent method so we add from the menu\n\t// rather than directly from the input\n\n\t// Look for a highlighted item first\n\tif ( highlightedItem ) {\n\t\tthis.addTag( highlightedItem.getData(), highlightedItem.getLabel() );\n\t} else if ( item ) {\n\t\t// Look for the element that fits the data\n\t\tthis.addTag( item.getData(), item.getLabel() );\n\t} else {\n\t\t// Otherwise, add the tag - the method will only add if the\n\t\t// tag is valid or if invalid tags are allowed\n\t\tthis.addTag( inputValue );\n\t}\n};\n\n/**\n * Return the visible items in the menu. This is mainly used for when\n * the menu is filtering results.\n *\n * @return {OO.ui.MenuOptionWidget[]} Visible results\n */\nOO.ui.MenuTagMultiselectWidget.prototype.getMenuVisibleItems = function () {\n\treturn this.menu.getItems().filter( function ( menuItem ) {\n\t\treturn menuItem.isVisible();\n\t} );\n};\n\n/**\n * Create the menu for this widget. This is in a separate method so that\n * child classes can override this without polluting the constructor with\n * unnecessary extra objects that will be overidden.\n *\n * @param {Object} menuConfig Configuration options\n * @return {OO.ui.MenuSelectWidget} Menu widget\n */\nOO.ui.MenuTagMultiselectWidget.prototype.createMenuWidget = function ( menuConfig ) {\n\treturn new OO.ui.MenuSelectWidget( menuConfig );\n};\n\n/**\n * Add options to the menu\n *\n * @param {Object[]} menuOptions Object defining options\n */\nOO.ui.MenuTagMultiselectWidget.prototype.addOptions = function ( menuOptions ) {\n\tvar widget = this,\n\t\titems = menuOptions.map( function ( obj ) {\n\t\t\treturn widget.createMenuOptionWidget( obj.data, obj.label );\n\t\t} );\n\n\tthis.menu.addItems( items );\n};\n\n/**\n * Create a menu option widget.\n *\n * @param {string} data Item data\n * @param {string} [label] Item label\n * @return {OO.ui.OptionWidget} Option widget\n */\nOO.ui.MenuTagMultiselectWidget.prototype.createMenuOptionWidget = function ( data, label ) {\n\treturn new OO.ui.MenuOptionWidget( {\n\t\tdata: data,\n\t\tlabel: label || data\n\t} );\n};\n\n/**\n * Get the menu\n *\n * @return {OO.ui.MenuSelectWidget} Menu\n */\nOO.ui.MenuTagMultiselectWidget.prototype.getMenu = function () {\n\treturn this.menu;\n};\n\n/**\n * Get the allowed values list\n *\n * @return {string[]} Allowed data values\n */\nOO.ui.MenuTagMultiselectWidget.prototype.getAllowedValues = function () {\n\tvar menuDatas = this.menu.getItems().map( function ( menuItem ) {\n\t\treturn menuItem.getData();\n\t} );\n\treturn this.allowedValues.concat( menuDatas );\n};\n","/**\n * SelectFileWidgets allow for selecting files, using the HTML5 File API. These\n * widgets can be configured with {@link OO.ui.mixin.IconElement icons} and {@link\n * OO.ui.mixin.IndicatorElement indicators}.\n * Please see the [OOjs UI documentation on MediaWiki] [1] for more information and examples.\n *\n *     @example\n *     // Example of a file select widget\n *     var selectFile = new OO.ui.SelectFileWidget();\n *     $( 'body' ).append( selectFile.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.PendingElement\n * @mixins OO.ui.mixin.LabelElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string[]|null} [accept=null] MIME types to accept. null accepts all types.\n * @cfg {string} [placeholder] Text to display when no file is selected.\n * @cfg {string} [notsupported] Text to display when file support is missing in the browser.\n * @cfg {boolean} [droppable=true] Whether to accept files by drag and drop.\n * @cfg {boolean} [showDropTarget=false] Whether to show a drop target. Requires droppable to be true.\n * @cfg {number} [thumbnailSizeLimit=20] File size limit in MiB above which to not try and show a\n *  preview (for performance)\n */\nOO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {\n\tvar dragHandler;\n\n\t// Configuration initialization\n\tconfig = $.extend( {\n\t\taccept: null,\n\t\tplaceholder: OO.ui.msg( 'ooui-selectfile-placeholder' ),\n\t\tnotsupported: OO.ui.msg( 'ooui-selectfile-not-supported' ),\n\t\tdroppable: true,\n\t\tshowDropTarget: false,\n\t\tthumbnailSizeLimit: 20\n\t}, config );\n\n\t// Parent constructor\n\tOO.ui.SelectFileWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$info } ) );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\n\t// Properties\n\tthis.$info = $( '<span>' );\n\tthis.showDropTarget = config.showDropTarget;\n\tthis.thumbnailSizeLimit = config.thumbnailSizeLimit;\n\tthis.isSupported = this.constructor.static.isSupported();\n\tthis.currentFile = null;\n\tif ( Array.isArray( config.accept ) ) {\n\t\tthis.accept = config.accept;\n\t} else {\n\t\tthis.accept = null;\n\t}\n\tthis.placeholder = config.placeholder;\n\tthis.notsupported = config.notsupported;\n\tthis.onFileSelectedHandler = this.onFileSelected.bind( this );\n\n\tthis.selectButton = new OO.ui.ButtonWidget( {\n\t\tclasses: [ 'oo-ui-selectFileWidget-selectButton' ],\n\t\tlabel: OO.ui.msg( 'ooui-selectfile-button-select' ),\n\t\tdisabled: this.disabled || !this.isSupported\n\t} );\n\n\tthis.clearButton = new OO.ui.ButtonWidget( {\n\t\tclasses: [ 'oo-ui-selectFileWidget-clearButton' ],\n\t\tframed: false,\n\t\ticon: 'close',\n\t\tdisabled: this.disabled\n\t} );\n\n\t// Events\n\tthis.selectButton.$button.on( {\n\t\tkeypress: this.onKeyPress.bind( this )\n\t} );\n\tthis.clearButton.connect( this, {\n\t\tclick: 'onClearClick'\n\t} );\n\tif ( config.droppable ) {\n\t\tdragHandler = this.onDragEnterOrOver.bind( this );\n\t\tthis.$element.on( {\n\t\t\tdragenter: dragHandler,\n\t\t\tdragover: dragHandler,\n\t\t\tdragleave: this.onDragLeave.bind( this ),\n\t\t\tdrop: this.onDrop.bind( this )\n\t\t} );\n\t}\n\n\t// Initialization\n\tthis.addInput();\n\tthis.$label.addClass( 'oo-ui-selectFileWidget-label' );\n\tthis.$info\n\t\t.addClass( 'oo-ui-selectFileWidget-info' )\n\t\t.append( this.$icon, this.$label, this.clearButton.$element, this.$indicator );\n\n\tif ( config.droppable && config.showDropTarget ) {\n\t\tthis.selectButton.setIcon( 'upload' );\n\t\tthis.$thumbnail = $( '<div>' ).addClass( 'oo-ui-selectFileWidget-thumbnail' );\n\t\tthis.setPendingElement( this.$thumbnail );\n\t\tthis.$element\n\t\t\t.addClass( 'oo-ui-selectFileWidget-dropTarget oo-ui-selectFileWidget' )\n\t\t\t.on( {\n\t\t\t\tclick: this.onDropTargetClick.bind( this )\n\t\t\t} )\n\t\t\t.append(\n\t\t\t\tthis.$thumbnail,\n\t\t\t\tthis.$info,\n\t\t\t\tthis.selectButton.$element,\n\t\t\t\t$( '<span>' )\n\t\t\t\t\t.addClass( 'oo-ui-selectFileWidget-dropLabel' )\n\t\t\t\t\t.text( OO.ui.msg( 'ooui-selectfile-dragdrop-placeholder' ) )\n\t\t\t);\n\t} else {\n\t\tthis.$element\n\t\t\t.addClass( 'oo-ui-selectFileWidget' )\n\t\t\t.append( this.$info, this.selectButton.$element );\n\t}\n\tthis.updateUI();\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.SelectFileWidget, OO.ui.Widget );\nOO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.PendingElement );\nOO.mixinClass( OO.ui.SelectFileWidget, OO.ui.mixin.LabelElement );\n\n/* Static Properties */\n\n/**\n * Check if this widget is supported\n *\n * @static\n * @return {boolean}\n */\nOO.ui.SelectFileWidget.static.isSupported = function () {\n\tvar $input;\n\tif ( OO.ui.SelectFileWidget.static.isSupportedCache === null ) {\n\t\t$input = $( '<input>' ).attr( 'type', 'file' );\n\t\tOO.ui.SelectFileWidget.static.isSupportedCache = $input[ 0 ].files !== undefined;\n\t}\n\treturn OO.ui.SelectFileWidget.static.isSupportedCache;\n};\n\nOO.ui.SelectFileWidget.static.isSupportedCache = null;\n\n/* Events */\n\n/**\n * @event change\n *\n * A change event is emitted when the on/off state of the toggle changes.\n *\n * @param {File|null} value New value\n */\n\n/* Methods */\n\n/**\n * Get the current value of the field\n *\n * @return {File|null}\n */\nOO.ui.SelectFileWidget.prototype.getValue = function () {\n\treturn this.currentFile;\n};\n\n/**\n * Set the current value of the field\n *\n * @param {File|null} file File to select\n */\nOO.ui.SelectFileWidget.prototype.setValue = function ( file ) {\n\tif ( this.currentFile !== file ) {\n\t\tthis.currentFile = file;\n\t\tthis.updateUI();\n\t\tthis.emit( 'change', this.currentFile );\n\t}\n};\n\n/**\n * Focus the widget.\n *\n * Focusses the select file button.\n *\n * @chainable\n */\nOO.ui.SelectFileWidget.prototype.focus = function () {\n\tthis.selectButton.focus();\n\treturn this;\n};\n\n/**\n * Blur the widget.\n *\n * @chainable\n */\nOO.ui.SelectFileWidget.prototype.blur = function () {\n\tthis.selectButton.blur();\n\treturn this;\n};\n\n/**\n * Update the user interface when a file is selected or unselected\n *\n * @protected\n */\nOO.ui.SelectFileWidget.prototype.updateUI = function () {\n\tvar $label;\n\tif ( !this.isSupported ) {\n\t\tthis.$element.addClass( 'oo-ui-selectFileWidget-notsupported' );\n\t\tthis.$element.removeClass( 'oo-ui-selectFileWidget-empty' );\n\t\tthis.setLabel( this.notsupported );\n\t} else {\n\t\tthis.$element.addClass( 'oo-ui-selectFileWidget-supported' );\n\t\tif ( this.currentFile ) {\n\t\t\tthis.$element.removeClass( 'oo-ui-selectFileWidget-empty' );\n\t\t\t$label = $( [] );\n\t\t\t$label = $label.add(\n\t\t\t\t$( '<span>' )\n\t\t\t\t\t.addClass( 'oo-ui-selectFileWidget-fileName' )\n\t\t\t\t\t.text( this.currentFile.name )\n\t\t\t);\n\t\t\tthis.setLabel( $label );\n\n\t\t\tif ( this.showDropTarget ) {\n\t\t\t\tthis.pushPending();\n\t\t\t\tthis.loadAndGetImageUrl().done( function ( url ) {\n\t\t\t\t\tthis.$thumbnail.css( 'background-image', 'url( ' + url + ' )' );\n\t\t\t\t}.bind( this ) ).fail( function () {\n\t\t\t\t\tthis.$thumbnail.append(\n\t\t\t\t\t\tnew OO.ui.IconWidget( {\n\t\t\t\t\t\t\ticon: 'attachment',\n\t\t\t\t\t\t\tclasses: [ 'oo-ui-selectFileWidget-noThumbnail-icon' ]\n\t\t\t\t\t\t} ).$element\n\t\t\t\t\t);\n\t\t\t\t}.bind( this ) ).always( function () {\n\t\t\t\t\tthis.popPending();\n\t\t\t\t}.bind( this ) );\n\t\t\t\tthis.$element.off( 'click' );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( this.showDropTarget ) {\n\t\t\t\tthis.$element.off( 'click' );\n\t\t\t\tthis.$element.on( {\n\t\t\t\t\tclick: this.onDropTargetClick.bind( this )\n\t\t\t\t} );\n\t\t\t\tthis.$thumbnail\n\t\t\t\t\t.empty()\n\t\t\t\t\t.css( 'background-image', '' );\n\t\t\t}\n\t\t\tthis.$element.addClass( 'oo-ui-selectFileWidget-empty' );\n\t\t\tthis.setLabel( this.placeholder );\n\t\t}\n\t}\n};\n\n/**\n * If the selected file is an image, get its URL and load it.\n *\n * @return {jQuery.Promise} Promise resolves with the image URL after it has loaded\n */\nOO.ui.SelectFileWidget.prototype.loadAndGetImageUrl = function () {\n\tvar deferred = $.Deferred(),\n\t\tfile = this.currentFile,\n\t\treader = new FileReader();\n\n\tif (\n\t\tfile &&\n\t\t( OO.getProp( file, 'type' ) || '' ).indexOf( 'image/' ) === 0 &&\n\t\tfile.size < this.thumbnailSizeLimit * 1024 * 1024\n\t) {\n\t\treader.onload = function ( event ) {\n\t\t\tvar img = document.createElement( 'img' );\n\t\t\timg.addEventListener( 'load', function () {\n\t\t\t\tif (\n\t\t\t\t\timg.naturalWidth === 0 ||\n\t\t\t\t\timg.naturalHeight === 0 ||\n\t\t\t\t\timg.complete === false\n\t\t\t\t) {\n\t\t\t\t\tdeferred.reject();\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.resolve( event.target.result );\n\t\t\t\t}\n\t\t\t} );\n\t\t\timg.src = event.target.result;\n\t\t};\n\t\treader.readAsDataURL( file );\n\t} else {\n\t\tdeferred.reject();\n\t}\n\n\treturn deferred.promise();\n};\n\n/**\n * Add the input to the widget\n *\n * @private\n */\nOO.ui.SelectFileWidget.prototype.addInput = function () {\n\tif ( this.$input ) {\n\t\tthis.$input.remove();\n\t}\n\n\tif ( !this.isSupported ) {\n\t\tthis.$input = null;\n\t\treturn;\n\t}\n\n\tthis.$input = $( '<input>' ).attr( 'type', 'file' );\n\tthis.$input.on( 'change', this.onFileSelectedHandler );\n\tthis.$input.on( 'click', function ( e ) {\n\t\t// Prevents dropTarget to get clicked which calls\n\t\t// a click on this input\n\t\te.stopPropagation();\n\t} );\n\tthis.$input.attr( {\n\t\ttabindex: -1\n\t} );\n\tif ( this.accept ) {\n\t\tthis.$input.attr( 'accept', this.accept.join( ', ' ) );\n\t}\n\tthis.selectButton.$button.append( this.$input );\n};\n\n/**\n * Determine if we should accept this file\n *\n * @private\n * @param {string} mimeType File MIME type\n * @return {boolean}\n */\nOO.ui.SelectFileWidget.prototype.isAllowedType = function ( mimeType ) {\n\tvar i, mimeTest;\n\n\tif ( !this.accept || !mimeType ) {\n\t\treturn true;\n\t}\n\n\tfor ( i = 0; i < this.accept.length; i++ ) {\n\t\tmimeTest = this.accept[ i ];\n\t\tif ( mimeTest === mimeType ) {\n\t\t\treturn true;\n\t\t} else if ( mimeTest.substr( -2 ) === '/*' ) {\n\t\t\tmimeTest = mimeTest.substr( 0, mimeTest.length - 1 );\n\t\t\tif ( mimeType.substr( 0, mimeTest.length ) === mimeTest ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n};\n\n/**\n * Handle file selection from the input\n *\n * @private\n * @param {jQuery.Event} e\n */\nOO.ui.SelectFileWidget.prototype.onFileSelected = function ( e ) {\n\tvar file = OO.getProp( e.target, 'files', 0 ) || null;\n\n\tif ( file && !this.isAllowedType( file.type ) ) {\n\t\tfile = null;\n\t}\n\n\tthis.setValue( file );\n\tthis.addInput();\n};\n\n/**\n * Handle clear button click events.\n *\n * @private\n */\nOO.ui.SelectFileWidget.prototype.onClearClick = function () {\n\tthis.setValue( null );\n\treturn false;\n};\n\n/**\n * Handle key press events.\n *\n * @private\n * @param {jQuery.Event} e Key press event\n */\nOO.ui.SelectFileWidget.prototype.onKeyPress = function ( e ) {\n\tif ( this.isSupported && !this.isDisabled() && this.$input &&\n\t\t( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER )\n\t) {\n\t\tthis.$input.click();\n\t\treturn false;\n\t}\n};\n\n/**\n * Handle drop target click events.\n *\n * @private\n * @param {jQuery.Event} e Key press event\n */\nOO.ui.SelectFileWidget.prototype.onDropTargetClick = function () {\n\tif ( this.isSupported && !this.isDisabled() && this.$input ) {\n\t\tthis.$input.click();\n\t\treturn false;\n\t}\n};\n\n/**\n * Handle drag enter and over events\n *\n * @private\n * @param {jQuery.Event} e Drag event\n */\nOO.ui.SelectFileWidget.prototype.onDragEnterOrOver = function ( e ) {\n\tvar itemOrFile,\n\t\tdroppableFile = false,\n\t\tdt = e.originalEvent.dataTransfer;\n\n\te.preventDefault();\n\te.stopPropagation();\n\n\tif ( this.isDisabled() || !this.isSupported ) {\n\t\tthis.$element.removeClass( 'oo-ui-selectFileWidget-canDrop' );\n\t\tdt.dropEffect = 'none';\n\t\treturn false;\n\t}\n\n\t// DataTransferItem and File both have a type property, but in Chrome files\n\t// have no information at this point.\n\titemOrFile = OO.getProp( dt, 'items', 0 ) || OO.getProp( dt, 'files', 0 );\n\tif ( itemOrFile ) {\n\t\tif ( this.isAllowedType( itemOrFile.type ) ) {\n\t\t\tdroppableFile = true;\n\t\t}\n\t// dt.types is Array-like, but not an Array\n\t} else if ( Array.prototype.indexOf.call( OO.getProp( dt, 'types' ) || [], 'Files' ) !== -1 ) {\n\t\t// File information is not available at this point for security so just assume\n\t\t// it is acceptable for now.\n\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=640534\n\t\tdroppableFile = true;\n\t}\n\n\tthis.$element.toggleClass( 'oo-ui-selectFileWidget-canDrop', droppableFile );\n\tif ( !droppableFile ) {\n\t\tdt.dropEffect = 'none';\n\t}\n\n\treturn false;\n};\n\n/**\n * Handle drag leave events\n *\n * @private\n * @param {jQuery.Event} e Drag event\n */\nOO.ui.SelectFileWidget.prototype.onDragLeave = function () {\n\tthis.$element.removeClass( 'oo-ui-selectFileWidget-canDrop' );\n};\n\n/**\n * Handle drop events\n *\n * @private\n * @param {jQuery.Event} e Drop event\n */\nOO.ui.SelectFileWidget.prototype.onDrop = function ( e ) {\n\tvar file = null,\n\t\tdt = e.originalEvent.dataTransfer;\n\n\te.preventDefault();\n\te.stopPropagation();\n\tthis.$element.removeClass( 'oo-ui-selectFileWidget-canDrop' );\n\n\tif ( this.isDisabled() || !this.isSupported ) {\n\t\treturn false;\n\t}\n\n\tfile = OO.getProp( dt, 'files', 0 );\n\tif ( file && !this.isAllowedType( file.type ) ) {\n\t\tfile = null;\n\t}\n\tif ( file ) {\n\t\tthis.setValue( file );\n\t}\n\n\treturn false;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.SelectFileWidget.prototype.setDisabled = function ( disabled ) {\n\tOO.ui.SelectFileWidget.parent.prototype.setDisabled.call( this, disabled );\n\tif ( this.selectButton ) {\n\t\tthis.selectButton.setDisabled( disabled );\n\t}\n\tif ( this.clearButton ) {\n\t\tthis.clearButton.setDisabled( disabled );\n\t}\n\treturn this;\n};\n","/**\n * SearchWidgets combine a {@link OO.ui.TextInputWidget text input field}, where users can type a search query,\n * and a menu of search results, which is displayed beneath the query\n * field. Unlike {@link OO.ui.mixin.LookupElement lookup menus}, search result menus are always visible to the user.\n * Users can choose an item from the menu or type a query into the text field to search for a matching result item.\n * In general, search widgets are used inside a separate {@link OO.ui.Dialog dialog} window.\n *\n * Each time the query is changed, the search result menu is cleared and repopulated. Please see\n * the [OOjs UI demos][1] for an example.\n *\n * [1]: https://tools.wmflabs.org/oojs-ui/oojs-ui/demos/#dialogs-mediawiki-vector-ltr\n *\n * @class\n * @extends OO.ui.Widget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string|jQuery} [placeholder] Placeholder text for query input\n * @cfg {string} [value] Initial query value\n */\nOO.ui.SearchWidget = function OoUiSearchWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.SearchWidget.parent.call( this, config );\n\n\t// Properties\n\tthis.query = new OO.ui.TextInputWidget( {\n\t\ticon: 'search',\n\t\tplaceholder: config.placeholder,\n\t\tvalue: config.value\n\t} );\n\tthis.results = new OO.ui.SelectWidget();\n\tthis.$query = $( '<div>' );\n\tthis.$results = $( '<div>' );\n\n\t// Events\n\tthis.query.connect( this, {\n\t\tchange: 'onQueryChange',\n\t\tenter: 'onQueryEnter'\n\t} );\n\tthis.query.$input.on( 'keydown', this.onQueryKeydown.bind( this ) );\n\n\t// Initialization\n\tthis.$query\n\t\t.addClass( 'oo-ui-searchWidget-query' )\n\t\t.append( this.query.$element );\n\tthis.$results\n\t\t.addClass( 'oo-ui-searchWidget-results' )\n\t\t.append( this.results.$element );\n\tthis.$element\n\t\t.addClass( 'oo-ui-searchWidget' )\n\t\t.append( this.$results, this.$query );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.SearchWidget, OO.ui.Widget );\n\n/* Methods */\n\n/**\n * Handle query key down events.\n *\n * @private\n * @param {jQuery.Event} e Key down event\n */\nOO.ui.SearchWidget.prototype.onQueryKeydown = function ( e ) {\n\tvar highlightedItem, nextItem,\n\t\tdir = e.which === OO.ui.Keys.DOWN ? 1 : ( e.which === OO.ui.Keys.UP ? -1 : 0 );\n\n\tif ( dir ) {\n\t\thighlightedItem = this.results.getHighlightedItem();\n\t\tif ( !highlightedItem ) {\n\t\t\thighlightedItem = this.results.getSelectedItem();\n\t\t}\n\t\tnextItem = this.results.getRelativeSelectableItem( highlightedItem, dir );\n\t\tthis.results.highlightItem( nextItem );\n\t\tnextItem.scrollElementIntoView();\n\t}\n};\n\n/**\n * Handle select widget select events.\n *\n * Clears existing results. Subclasses should repopulate items according to new query.\n *\n * @private\n * @param {string} value New value\n */\nOO.ui.SearchWidget.prototype.onQueryChange = function () {\n\t// Reset\n\tthis.results.clearItems();\n};\n\n/**\n * Handle select widget enter key events.\n *\n * Chooses highlighted item.\n *\n * @private\n * @param {string} value New value\n */\nOO.ui.SearchWidget.prototype.onQueryEnter = function () {\n\tvar highlightedItem = this.results.getHighlightedItem();\n\tif ( highlightedItem ) {\n\t\tthis.results.chooseItem( highlightedItem );\n\t}\n};\n\n/**\n * Get the query input.\n *\n * @return {OO.ui.TextInputWidget} Query input\n */\nOO.ui.SearchWidget.prototype.getQuery = function () {\n\treturn this.query;\n};\n\n/**\n * Get the search results menu.\n *\n * @return {OO.ui.SelectWidget} Menu of search results\n */\nOO.ui.SearchWidget.prototype.getResults = function () {\n\treturn this.results;\n};\n","/**\n * NumberInputWidgets combine a {@link OO.ui.TextInputWidget text input} (where a value\n * can be entered manually) and two {@link OO.ui.ButtonWidget button widgets}\n * (to adjust the value in increments) to allow the user to enter a number.\n *\n *     @example\n *     // Example: A NumberInputWidget.\n *     var numberInput = new OO.ui.NumberInputWidget( {\n *         label: 'NumberInputWidget',\n *         input: { value: 5 },\n *         min: 1,\n *         max: 10\n *     } );\n *     $( 'body' ).append( numberInput.$element );\n *\n * @class\n * @extends OO.ui.TextInputWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {Object} [minusButton] Configuration options to pass to the {@link OO.ui.ButtonWidget decrementing button widget}.\n * @cfg {Object} [plusButton] Configuration options to pass to the {@link OO.ui.ButtonWidget incrementing button widget}.\n * @cfg {boolean} [allowInteger=false] Whether the field accepts only integer values.\n * @cfg {number} [min=-Infinity] Minimum allowed value\n * @cfg {number} [max=Infinity] Maximum allowed value\n * @cfg {number} [step=1] Delta when using the buttons or up/down arrow keys\n * @cfg {number|null} [pageStep] Delta when using the page-up/page-down keys. Defaults to 10 times #step.\n * @cfg {boolean} [showButtons=true] Whether to show the plus and minus buttons.\n */\nOO.ui.NumberInputWidget = function OoUiNumberInputWidget( config ) {\n\tvar $field = $( '<div>' )\n\t\t.addClass( 'oo-ui-numberInputWidget-field' );\n\n\t// Configuration initialization\n\tconfig = $.extend( {\n\t\tallowInteger: false,\n\t\tmin: -Infinity,\n\t\tmax: Infinity,\n\t\tstep: 1,\n\t\tpageStep: null,\n\t\tshowButtons: true\n\t}, config );\n\n\t// For backward compatibility\n\t$.extend( config, config.input );\n\tthis.input = this;\n\n\t// Parent constructor\n\tOO.ui.NumberInputWidget.parent.call( this, $.extend( config, {\n\t\ttype: 'number'\n\t} ) );\n\n\tif ( config.showButtons ) {\n\t\tthis.minusButton = new OO.ui.ButtonWidget( $.extend(\n\t\t\t{\n\t\t\t\tdisabled: this.isDisabled(),\n\t\t\t\ttabIndex: -1,\n\t\t\t\tclasses: [ 'oo-ui-numberInputWidget-minusButton' ],\n\t\t\t\tlabel: '−'\n\t\t\t},\n\t\t\tconfig.minusButton\n\t\t) );\n\t\tthis.plusButton = new OO.ui.ButtonWidget( $.extend(\n\t\t\t{\n\t\t\t\tdisabled: this.isDisabled(),\n\t\t\t\ttabIndex: -1,\n\t\t\t\tclasses: [ 'oo-ui-numberInputWidget-plusButton' ],\n\t\t\t\tlabel: '+'\n\t\t\t},\n\t\t\tconfig.plusButton\n\t\t) );\n\t}\n\n\t// Events\n\tthis.$input.on( {\n\t\tkeydown: this.onKeyDown.bind( this ),\n\t\t'wheel mousewheel DOMMouseScroll': this.onWheel.bind( this )\n\t} );\n\tif ( config.showButtons ) {\n\t\tthis.plusButton.connect( this, {\n\t\t\tclick: [ 'onButtonClick', +1 ]\n\t\t} );\n\t\tthis.minusButton.connect( this, {\n\t\t\tclick: [ 'onButtonClick', -1 ]\n\t\t} );\n\t}\n\n\t// Build the field\n\t$field.append( this.$input );\n\tif ( config.showButtons ) {\n\t\t$field\n\t\t\t.prepend( this.minusButton.$element )\n\t\t\t.append( this.plusButton.$element );\n\t}\n\n\t// Initialization\n\tthis.setAllowInteger( config.allowInteger || config.isInteger );\n\tthis.setRange( config.min, config.max );\n\tthis.setStep( config.step, config.pageStep );\n\t// Set the validation method after we set allowInteger and range\n\t// so that it doesn't immediately call setValidityFlag\n\tthis.setValidation( this.validateNumber.bind( this ) );\n\n\tthis.$element\n\t\t.addClass( 'oo-ui-numberInputWidget' )\n\t\t.toggleClass( 'oo-ui-numberInputWidget-buttoned', config.showButtons )\n\t\t.append( $field );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.NumberInputWidget, OO.ui.TextInputWidget );\n\n/* Methods */\n\n/**\n * Set whether only integers are allowed\n *\n * @param {boolean} flag\n */\nOO.ui.NumberInputWidget.prototype.setAllowInteger = function ( flag ) {\n\tthis.allowInteger = !!flag;\n\tthis.setValidityFlag();\n};\n// Backward compatibility\nOO.ui.NumberInputWidget.prototype.setIsInteger = OO.ui.NumberInputWidget.prototype.setAllowInteger;\n\n/**\n * Get whether only integers are allowed\n *\n * @return {boolean} Flag value\n */\nOO.ui.NumberInputWidget.prototype.getAllowInteger = function () {\n\treturn this.allowInteger;\n};\n// Backward compatibility\nOO.ui.NumberInputWidget.prototype.getIsInteger = OO.ui.NumberInputWidget.prototype.getAllowInteger;\n\n/**\n * Set the range of allowed values\n *\n * @param {number} min Minimum allowed value\n * @param {number} max Maximum allowed value\n */\nOO.ui.NumberInputWidget.prototype.setRange = function ( min, max ) {\n\tif ( min > max ) {\n\t\tthrow new Error( 'Minimum (' + min + ') must not be greater than maximum (' + max + ')' );\n\t}\n\tthis.min = min;\n\tthis.max = max;\n\tthis.setValidityFlag();\n};\n\n/**\n * Get the current range\n *\n * @return {number[]} Minimum and maximum values\n */\nOO.ui.NumberInputWidget.prototype.getRange = function () {\n\treturn [ this.min, this.max ];\n};\n\n/**\n * Set the stepping deltas\n *\n * @param {number} step Normal step\n * @param {number|null} pageStep Page step. If null, 10 * step will be used.\n */\nOO.ui.NumberInputWidget.prototype.setStep = function ( step, pageStep ) {\n\tif ( step <= 0 ) {\n\t\tthrow new Error( 'Step value must be positive' );\n\t}\n\tif ( pageStep === null ) {\n\t\tpageStep = step * 10;\n\t} else if ( pageStep <= 0 ) {\n\t\tthrow new Error( 'Page step value must be positive' );\n\t}\n\tthis.step = step;\n\tthis.pageStep = pageStep;\n};\n\n/**\n * Get the current stepping values\n *\n * @return {number[]} Step and page step\n */\nOO.ui.NumberInputWidget.prototype.getStep = function () {\n\treturn [ this.step, this.pageStep ];\n};\n\n/**\n * Get the current value of the widget as a number\n *\n * @return {number} May be NaN, or an invalid number\n */\nOO.ui.NumberInputWidget.prototype.getNumericValue = function () {\n\treturn +this.getValue();\n};\n\n/**\n * Adjust the value of the widget\n *\n * @param {number} delta Adjustment amount\n */\nOO.ui.NumberInputWidget.prototype.adjustValue = function ( delta ) {\n\tvar n, v = this.getNumericValue();\n\n\tdelta = +delta;\n\tif ( isNaN( delta ) || !isFinite( delta ) ) {\n\t\tthrow new Error( 'Delta must be a finite number' );\n\t}\n\n\tif ( isNaN( v ) ) {\n\t\tn = 0;\n\t} else {\n\t\tn = v + delta;\n\t\tn = Math.max( Math.min( n, this.max ), this.min );\n\t\tif ( this.allowInteger ) {\n\t\t\tn = Math.round( n );\n\t\t}\n\t}\n\n\tif ( n !== v ) {\n\t\tthis.setValue( n );\n\t}\n};\n/**\n * Validate input\n *\n * @private\n * @param {string} value Field value\n * @return {boolean}\n */\nOO.ui.NumberInputWidget.prototype.validateNumber = function ( value ) {\n\tvar n = +value;\n\tif ( value === '' ) {\n\t\treturn !this.isRequired();\n\t}\n\n\tif ( isNaN( n ) || !isFinite( n ) ) {\n\t\treturn false;\n\t}\n\n\tif ( this.allowInteger && Math.floor( n ) !== n ) {\n\t\treturn false;\n\t}\n\n\tif ( n < this.min || n > this.max ) {\n\t\treturn false;\n\t}\n\n\treturn true;\n};\n\n/**\n * Handle mouse click events.\n *\n * @private\n * @param {number} dir +1 or -1\n */\nOO.ui.NumberInputWidget.prototype.onButtonClick = function ( dir ) {\n\tthis.adjustValue( dir * this.step );\n};\n\n/**\n * Handle mouse wheel events.\n *\n * @private\n * @param {jQuery.Event} event\n */\nOO.ui.NumberInputWidget.prototype.onWheel = function ( event ) {\n\tvar delta = 0;\n\n\tif ( !this.isDisabled() && this.$input.is( ':focus' ) ) {\n\t\t// Standard 'wheel' event\n\t\tif ( event.originalEvent.deltaMode !== undefined ) {\n\t\t\tthis.sawWheelEvent = true;\n\t\t}\n\t\tif ( event.originalEvent.deltaY ) {\n\t\t\tdelta = -event.originalEvent.deltaY;\n\t\t} else if ( event.originalEvent.deltaX ) {\n\t\t\tdelta = event.originalEvent.deltaX;\n\t\t}\n\n\t\t// Non-standard events\n\t\tif ( !this.sawWheelEvent ) {\n\t\t\tif ( event.originalEvent.wheelDeltaX ) {\n\t\t\t\tdelta = -event.originalEvent.wheelDeltaX;\n\t\t\t} else if ( event.originalEvent.wheelDeltaY ) {\n\t\t\t\tdelta = event.originalEvent.wheelDeltaY;\n\t\t\t} else if ( event.originalEvent.wheelDelta ) {\n\t\t\t\tdelta = event.originalEvent.wheelDelta;\n\t\t\t} else if ( event.originalEvent.detail ) {\n\t\t\t\tdelta = -event.originalEvent.detail;\n\t\t\t}\n\t\t}\n\n\t\tif ( delta ) {\n\t\t\tdelta = delta < 0 ? -1 : 1;\n\t\t\tthis.adjustValue( delta * this.step );\n\t\t}\n\n\t\treturn false;\n\t}\n};\n\n/**\n * Handle key down events.\n *\n * @private\n * @param {jQuery.Event} e Key down event\n */\nOO.ui.NumberInputWidget.prototype.onKeyDown = function ( e ) {\n\tif ( !this.isDisabled() ) {\n\t\tswitch ( e.which ) {\n\t\t\tcase OO.ui.Keys.UP:\n\t\t\t\tthis.adjustValue( this.step );\n\t\t\t\treturn false;\n\t\t\tcase OO.ui.Keys.DOWN:\n\t\t\t\tthis.adjustValue( -this.step );\n\t\t\t\treturn false;\n\t\t\tcase OO.ui.Keys.PAGEUP:\n\t\t\t\tthis.adjustValue( this.pageStep );\n\t\t\t\treturn false;\n\t\t\tcase OO.ui.Keys.PAGEDOWN:\n\t\t\t\tthis.adjustValue( -this.pageStep );\n\t\t\t\treturn false;\n\t\t}\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.NumberInputWidget.prototype.setDisabled = function ( disabled ) {\n\t// Parent method\n\tOO.ui.NumberInputWidget.parent.prototype.setDisabled.call( this, disabled );\n\n\tif ( this.minusButton ) {\n\t\tthis.minusButton.setDisabled( this.isDisabled() );\n\t}\n\tif ( this.plusButton ) {\n\t\tthis.plusButton.setDisabled( this.isDisabled() );\n\t}\n\n\treturn this;\n};\n","}( OO ) );\n"]}
\ No newline at end of file
index 310d616..b2b4d47 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-05-16T22:31:46Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
   background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
@@ -17,8 +17,8 @@
 }
 .oo-ui-window-frame {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-window-content {
   position: absolute;
@@ -34,9 +34,9 @@
 .oo-ui-window-foot {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-window-body {
   margin: 0;
@@ -56,8 +56,8 @@
   left: 0;
   right: 0;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-dialog-content > .oo-ui-window-head {
   overflow: hidden;
   color: #000;
 }
 .oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
-}
-.oo-ui-messageDialog-message-verbose {
   font-size: 1.1em;
   line-height: 1.5em;
+  color: #666;
   text-align: left;
 }
 .oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
   left: 0;
   right: 0;
   bottom: 0;
-  z-index: 2;
+  z-index: 4;
   overflow-x: hidden;
   overflow-y: auto;
 }
   background-color: rgba(255, 255, 255, 0.5);
   opacity: 0;
   -webkit-transition: opacity 250ms ease;
-     -moz-transition: opacity 250ms ease;
-          transition: opacity 250ms ease;
+  -moz-transition: opacity 250ms ease;
+  transition: opacity 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
   background-color: #fff;
   opacity: 0;
   -webkit-transform: scale(0.5);
-     -moz-transform: scale(0.5);
-      -ms-transform: scale(0.5);
-          transform: scale(0.5);
+  -moz-transform: scale(0.5);
+  -ms-transform: scale(0.5);
+  transform: scale(0.5);
   -webkit-transition: all 250ms ease;
-     -moz-transition: all 250ms ease;
-          transition: all 250ms ease;
+  -moz-transition: all 250ms ease;
+  transition: all 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
   opacity: 1;
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
   opacity: 1;
   -webkit-transform: scale(1);
-     -moz-transform: scale(1);
-      -ms-transform: scale(1);
-          transform: scale(1);
+  -moz-transform: scale(1);
+  -ms-transform: scale(1);
+  transform: scale(1);
 }
 .oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
   top: 1em;
   bottom: 1em;
   max-height: 100%;
-  max-height: calc(100% - 2em);
+  max-height: calc( 100% - 2em );
   border: 1px solid #ccc;
   border-radius: 0.5em;
   box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
index 4b99fa6..00d645d 100644 (file)
@@ -1,20 +1,20 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-05-16T22:31:46Z
  */
 .oo-ui-window {
   background: transparent;
 }
 .oo-ui-window-frame {
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-window-content {
   position: absolute;
@@ -30,9 +30,9 @@
 .oo-ui-window-foot {
   -webkit-touch-callout: none;
   -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
 }
 .oo-ui-window-body {
   margin: 0;
@@ -52,8 +52,8 @@
   left: 0;
   right: 0;
   -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
 }
 .oo-ui-dialog-content > .oo-ui-window-head {
   overflow: hidden;
   color: #000;
 }
 .oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25;
-  color: #222;
-}
-.oo-ui-messageDialog-message-verbose {
   font-size: 1.1em;
   line-height: 1.4;
+  color: #222;
   text-align: left;
 }
 .oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
   border-bottom-width: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  min-height: 3.4em;
+  min-height: 3.4375em;
   margin-right: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget:last-child {
   margin-right: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+  margin-left: 0;
+  border: 0;
   border-radius: 0;
+  padding: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-  line-height: 3.4;
+  line-height: 3.4375em;
   text-align: center;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
-  background-color: rgba(0, 0, 0, 0.05);
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button:hover {
+  background-color: #f8f9fa;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
-  background-color: rgba(0, 0, 0, 0.1);
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button:active {
+  background-color: #c8ccd1;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover,
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
-  background-color: rgba(8, 126, 204, 0.05);
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled .oo-ui-buttonElement-button:focus {
+  box-shadow: inset 0 0 0 1px #36c, 0 0 0 1px #36c;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive .oo-ui-buttonElement-button:hover,
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive .oo-ui-buttonElement-button:hover {
+  background-color: #eaf3ff;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active,
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive .oo-ui-buttonElement-button:active,
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive .oo-ui-buttonElement-button:active {
   background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
   font-weight: bold;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
-  background-color: rgba(212, 83, 83, 0.05);
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button:hover {
+  background-color: #fbe8e7;
 }
-.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive .oo-ui-buttonElement-button:active {
   background-color: rgba(212, 83, 83, 0.1);
 }
 .oo-ui-processDialog-location {
   left: 0;
   right: 0;
   bottom: 0;
-  z-index: 2;
+  z-index: 4;
   overflow-x: hidden;
   overflow-y: auto;
 }
 .oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.4em;
+  height: 3.4375em;
 }
 .oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.4em;
-  outline: 1px solid rgba(0, 0, 0, 0.2);
+  top: 3.4375em;
+  outline: 1px solid #c8ccd1;
 }
 .oo-ui-processDialog-navigation {
   position: relative;
-  height: 3.4em;
-  padding: 0 1em;
+  height: 3.4375em;
 }
 .oo-ui-processDialog-location {
-  padding: 0.75em 0;
-  height: 1.875em;
+  height: 3.4375em;
   cursor: default;
   text-align: center;
 }
 .oo-ui-processDialog-title {
   font-weight: bold;
-  line-height: 1.875em;
+  line-height: 3.4375em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-  margin: 0.5em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless {
-  margin: 0;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button {
+  margin: 0.46875em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-iconElement:first-child,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-iconElement:first-child,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-iconElement:first-child {
+  margin-left: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  padding-left: 2.875em;
+  padding-top: 0;
+  min-height: 3.4375em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+  left: 0.5em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-labelElement:first-child,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-labelElement:first-child,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-labelElement:first-child {
+  margin-left: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button {
   padding: 0.75em 1em;
-  vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-labelElement.oo-ui-iconElement > .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-labelElement.oo-ui-iconElement > .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-labelElement.oo-ui-iconElement > .oo-ui-buttonElement-button {
+  padding-left: 2.625em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-labelElement-label,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-labelElement-label,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless:active {
   background-color: rgba(0, 0, 0, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover {
   background-color: rgba(8, 126, 204, 0.05);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active {
   background-color: rgba(8, 126, 204, 0.1);
 }
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
   font-weight: bold;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:hover,
   background-color: rgba(255, 255, 255, 0.5);
   opacity: 0;
   -webkit-transition: opacity 250ms;
-     -moz-transition: opacity 250ms;
-          transition: opacity 250ms;
+  -moz-transition: opacity 250ms;
+  transition: opacity 250ms;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
   background-color: #fff;
   opacity: 0;
   -webkit-transform: scale(0.5);
-     -moz-transform: scale(0.5);
-      -ms-transform: scale(0.5);
-          transform: scale(0.5);
+  -moz-transform: scale(0.5);
+  -ms-transform: scale(0.5);
+  transform: scale(0.5);
   -webkit-transition: all 250ms;
-     -moz-transition: all 250ms;
-          transition: all 250ms;
+  -moz-transition: all 250ms;
+  transition: all 250ms;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
   opacity: 1;
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
   opacity: 1;
   -webkit-transform: scale(1);
-     -moz-transform: scale(1);
-      -ms-transform: scale(1);
-          transform: scale(1);
+  -moz-transform: scale(1);
+  -ms-transform: scale(1);
+  transform: scale(1);
 }
 .oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
   top: 1em;
   bottom: 1em;
   max-height: 100%;
-  max-height: calc(100% - 2em);
+  max-height: calc( 100% - 2em );
   border: 1px solid #a2a9b1;
   border-radius: 2px;
   box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
index c842c62..3a697e1 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.21.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-05-16T22:31:39Z
  */
 ( function ( OO ) {
 
@@ -60,14 +60,6 @@ OO.ui.ActionWidget = function OoUiActionWidget( config ) {
 OO.inheritClass( OO.ui.ActionWidget, OO.ui.ButtonWidget );
 OO.mixinClass( OO.ui.ActionWidget, OO.ui.mixin.PendingElement );
 
-/* Events */
-
-/**
- * A resize event is emitted when the size of the widget changes.
- *
- * @event resize
- */
-
 /* Methods */
 
 /**
@@ -102,87 +94,6 @@ OO.ui.ActionWidget.prototype.getModes = function () {
        return this.modes.slice();
 };
 
-/**
- * Emit a resize event if the size has changed.
- *
- * @private
- * @chainable
- */
-OO.ui.ActionWidget.prototype.propagateResize = function () {
-       var width, height;
-
-       if ( this.isElementAttached() ) {
-               width = this.$element.width();
-               height = this.$element.height();
-
-               if ( width !== this.width || height !== this.height ) {
-                       this.width = width;
-                       this.height = height;
-                       this.emit( 'resize' );
-               }
-       }
-
-       return this;
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.ActionWidget.prototype.setIcon = function () {
-       // Mixin method
-       OO.ui.mixin.IconElement.prototype.setIcon.apply( this, arguments );
-       this.propagateResize();
-
-       return this;
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.ActionWidget.prototype.setLabel = function () {
-       // Mixin method
-       OO.ui.mixin.LabelElement.prototype.setLabel.apply( this, arguments );
-       this.propagateResize();
-
-       return this;
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.ActionWidget.prototype.setFlags = function () {
-       // Mixin method
-       OO.ui.mixin.FlaggedElement.prototype.setFlags.apply( this, arguments );
-       this.propagateResize();
-
-       return this;
-};
-
-/**
- * @inheritdoc
- */
-OO.ui.ActionWidget.prototype.clearFlags = function () {
-       // Mixin method
-       OO.ui.mixin.FlaggedElement.prototype.clearFlags.apply( this, arguments );
-       this.propagateResize();
-
-       return this;
-};
-
-/**
- * Toggle the visibility of the action button.
- *
- * @param {boolean} [show] Show button, omit to toggle visibility
- * @chainable
- */
-OO.ui.ActionWidget.prototype.toggle = function () {
-       // Parent method
-       OO.ui.ActionWidget.parent.prototype.toggle.apply( this, arguments );
-       this.propagateResize();
-
-       return this;
-};
-
 /* eslint-disable no-unused-vars */
 /**
  * ActionSets manage the behavior of the {@link OO.ui.ActionWidget action widgets} that comprise them.
@@ -317,14 +228,6 @@ OO.ui.ActionSet.static.specialFlags = [ 'safe', 'primary' ];
  * @param {OO.ui.ActionWidget} action Action that was clicked
  */
 
-/**
- * @event resize
- *
- * A 'resize' event is emitted when an action widget is resized.
- *
- * @param {OO.ui.ActionWidget} action Action that was resized
- */
-
 /**
  * @event add
  *
@@ -561,7 +464,6 @@ OO.ui.ActionSet.prototype.add = function ( actions ) {
                action = actions[ i ];
                action.connect( this, {
                        click: [ 'emit', 'click', action ],
-                       resize: [ 'emit', 'resize', action ],
                        toggle: [ 'onActionChange' ]
                } );
                this.list.push( action );
@@ -1326,7 +1228,7 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
                                manager.toggleGlobalEvents( true );
                                manager.toggleAriaIsolation( true );
                        }
-                       manager.$returnFocusTo = data.$returnFocusTo || $( document.activeElement );
+                       manager.$returnFocusTo = data.$returnFocusTo !== undefined ? data.$returnFocusTo : $( document.activeElement );
                        manager.currentWindow = win;
                        manager.opening = opening;
                        manager.preparingToOpen = null;
@@ -1734,6 +1636,26 @@ OO.ui.Window = function OoUiWindow( config ) {
        this.manager = null;
        this.size = config.size || this.constructor.static.size;
        this.$frame = $( '<div>' );
+       /**
+        * Overlay element to use for the `$overlay` configuration option of widgets that support it.
+        * Things put inside of it are overlaid on top of the window and are not bound to its dimensions.
+        * See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.
+        *
+        *     MyDialog.prototype.initialize = function () {
+        *       ...
+        *       var popupButton = new OO.ui.PopupButtonWidget( {
+        *         $overlay: this.$overlay,
+        *         label: 'Popup button',
+        *         popup: {
+        *           $content: $( '<p>Popup contents.</p><p>Popup contents.</p><p>Popup contents.</p>' ),
+        *           padded: true
+        *         }
+        *       } );
+        *       ...
+        *     };
+        *
+        * @property {jQuery}
+        */
        this.$overlay = $( '<div>' );
        this.$content = $( '<div>' );
 
@@ -2590,21 +2512,15 @@ OO.ui.Dialog.prototype.getTeardownProcess = function ( data ) {
  * @inheritdoc
  */
 OO.ui.Dialog.prototype.initialize = function () {
-       var titleId;
-
        // Parent method
        OO.ui.Dialog.parent.prototype.initialize.call( this );
 
-       titleId = OO.ui.generateElementId();
-
        // Properties
-       this.title = new OO.ui.LabelWidget( {
-               id: titleId
-       } );
+       this.title = new OO.ui.LabelWidget();
 
        // Initialization
        this.$content.addClass( 'oo-ui-dialog-content' );
-       this.$element.attr( 'aria-labelledby', titleId );
+       this.$element.attr( 'aria-labelledby', this.title.getElementId() );
        this.setPendingElement( this.$head );
 };
 
@@ -2733,12 +2649,6 @@ OO.ui.MessageDialog.static.name = 'message';
  */
 OO.ui.MessageDialog.static.size = 'small';
 
-/**
- * @static
- * @deprecated since v0.18.4 as default; TODO: Remove
- */
-OO.ui.MessageDialog.static.verbose = true;
-
 /**
  * Dialog title.
  *
@@ -2841,6 +2751,7 @@ 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 {string} [data.size] Symbolic name of the dialog size, see OO.ui.Window
  * @param {Object[]} [data.actions] List of OO.ui.ActionOptionWidget configuration options for each
  *   action item
  */
@@ -2856,11 +2767,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
-                       );
+                       this.size = data.size !== undefined ? data.size : this.constructor.static.size;
                }, this );
 };
 
@@ -2879,7 +2786,7 @@ OO.ui.MessageDialog.prototype.getReadyProcess = function ( data ) {
                                return action.getFlags().indexOf( 'primary' ) > -1;
                        } );
                        if ( actions.length > 0 ) {
-                               actions[ 0 ].$button.focus();
+                               actions[ 0 ].focus();
                        }
                }, this );
 };
@@ -3412,6 +3319,8 @@ OO.ui.getWindowManager = function () {
  *         console.log( 'User closed the dialog.' );
  *     } );
  *
+ *     OO.ui.alert( 'Something larger happened!', { size: 'large' } );
+ *
  * @param {jQuery|string} text Message text to display
  * @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess
  * @return {jQuery.Promise} Promise resolved when the user closes the dialog
@@ -3515,3 +3424,5 @@ OO.ui.prompt = function ( text, options ) {
 };
 
 }( OO ) );
+
+//# sourceMappingURL=oojs-ui-windows.js.map
\ No newline at end of file
diff --git a/resources/lib/oojs-ui/oojs-ui-windows.js.map b/resources/lib/oojs-ui/oojs-ui-windows.js.map
new file mode 100644 (file)
index 0000000..0544c0b
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/intro.js.txt","../src/widgets/ActionWidget.js","../src/ActionSet.js","../src/Error.js","../src/Process.js","../src/WindowManager.js","../src/Window.js","../src/Dialog.js","../src/dialogs/MessageDialog.js","../src/dialogs/ProcessDialog.js","../src/windows.js","../src/outro.js.txt"],"names":[],"mappings":"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","file":"oojs-ui-windows.js","sourcesContent":["( function ( OO ) {\n\n'use strict';\n","/**\n * An ActionWidget is a {@link OO.ui.ButtonWidget button widget} that executes an action.\n * Action widgets are used with OO.ui.ActionSet, which manages the behavior and availability\n * of the actions.\n *\n * Both actions and action sets are primarily used with {@link OO.ui.Dialog Dialogs}.\n * Please see the [OOjs UI documentation on MediaWiki] [1] for more information\n * and examples.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs#Action_sets\n *\n * @class\n * @extends OO.ui.ButtonWidget\n * @mixins OO.ui.mixin.PendingElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string} [action] Symbolic name of the action (e.g., ‘continue’ or ‘cancel’).\n * @cfg {string[]} [modes] Symbolic names of the modes (e.g., ‘edit’ or ‘read’) in which the action\n *  should be made available. See the action set's {@link OO.ui.ActionSet#setMode setMode} method\n *  for more information about setting modes.\n * @cfg {boolean} [framed=false] Render the action button with a frame\n */\nOO.ui.ActionWidget = function OoUiActionWidget( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( { framed: false }, config );\n\n\t// Parent constructor\n\tOO.ui.ActionWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.PendingElement.call( this, config );\n\n\t// Properties\n\tthis.action = config.action || '';\n\tthis.modes = config.modes || [];\n\tthis.width = 0;\n\tthis.height = 0;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-actionWidget' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ActionWidget, OO.ui.ButtonWidget );\nOO.mixinClass( OO.ui.ActionWidget, OO.ui.mixin.PendingElement );\n\n/* Methods */\n\n/**\n * Check if the action is configured to be available in the specified `mode`.\n *\n * @param {string} mode Name of mode\n * @return {boolean} The action is configured with the mode\n */\nOO.ui.ActionWidget.prototype.hasMode = function ( mode ) {\n\treturn this.modes.indexOf( mode ) !== -1;\n};\n\n/**\n * Get the symbolic name of the action (e.g., ‘continue’ or ‘cancel’).\n *\n * @return {string}\n */\nOO.ui.ActionWidget.prototype.getAction = function () {\n\treturn this.action;\n};\n\n/**\n * Get the symbolic name of the mode or modes for which the action is configured to be available.\n *\n * The current mode is set with the action set's {@link OO.ui.ActionSet#setMode setMode} method.\n * Only actions that are configured to be avaiable in the current mode will be visible. All other actions\n * are hidden.\n *\n * @return {string[]}\n */\nOO.ui.ActionWidget.prototype.getModes = function () {\n\treturn this.modes.slice();\n};\n","/* eslint-disable no-unused-vars */\n/**\n * ActionSets manage the behavior of the {@link OO.ui.ActionWidget action widgets} that comprise them.\n * Actions can be made available for specific contexts (modes) and circumstances\n * (abilities). Action sets are primarily used with {@link OO.ui.Dialog Dialogs}.\n *\n * ActionSets contain two types of actions:\n *\n * - Special: Special actions are the first visible actions with special flags, such as 'safe' and 'primary', the default special flags. Additional special flags can be configured in subclasses with the static #specialFlags property.\n * - Other: Other actions include all non-special visible actions.\n *\n * Please see the [OOjs UI documentation on MediaWiki][1] for more information.\n *\n *     @example\n *     // Example: An action set used in a process dialog\n *     function MyProcessDialog( config ) {\n *         MyProcessDialog.parent.call( this, config );\n *     }\n *     OO.inheritClass( MyProcessDialog, OO.ui.ProcessDialog );\n *     MyProcessDialog.static.title = 'An action set in a process dialog';\n *     MyProcessDialog.static.name = 'myProcessDialog';\n *     // An action set that uses modes ('edit' and 'help' mode, in this example).\n *     MyProcessDialog.static.actions = [\n *         { action: 'continue', modes: 'edit', label: 'Continue', flags: [ 'primary', 'constructive' ] },\n *         { action: 'help', modes: 'edit', label: 'Help' },\n *         { modes: 'edit', label: 'Cancel', flags: 'safe' },\n *         { action: 'back', modes: 'help', label: 'Back', flags: 'safe' }\n *     ];\n *\n *     MyProcessDialog.prototype.initialize = function () {\n *         MyProcessDialog.parent.prototype.initialize.apply( this, arguments );\n *         this.panel1 = new OO.ui.PanelLayout( { padded: true, expanded: false } );\n *         this.panel1.$element.append( '<p>This dialog uses an action set (continue, help, cancel, back) configured with modes. This is edit mode. Click \\'help\\' to see help mode.</p>' );\n *         this.panel2 = new OO.ui.PanelLayout( { padded: true, expanded: false } );\n *         this.panel2.$element.append( '<p>This is help mode. Only the \\'back\\' action widget is configured to be visible here. Click \\'back\\' to return to \\'edit\\' mode.</p>' );\n *         this.stackLayout = new OO.ui.StackLayout( {\n *             items: [ this.panel1, this.panel2 ]\n *         } );\n *         this.$body.append( this.stackLayout.$element );\n *     };\n *     MyProcessDialog.prototype.getSetupProcess = function ( data ) {\n *         return MyProcessDialog.parent.prototype.getSetupProcess.call( this, data )\n *             .next( function () {\n *                 this.actions.setMode( 'edit' );\n *             }, this );\n *     };\n *     MyProcessDialog.prototype.getActionProcess = function ( action ) {\n *         if ( action === 'help' ) {\n *             this.actions.setMode( 'help' );\n *             this.stackLayout.setItem( this.panel2 );\n *         } else if ( action === 'back' ) {\n *             this.actions.setMode( 'edit' );\n *             this.stackLayout.setItem( this.panel1 );\n *         } else if ( action === 'continue' ) {\n *             var dialog = this;\n *             return new OO.ui.Process( function () {\n *                 dialog.close();\n *             } );\n *         }\n *         return MyProcessDialog.parent.prototype.getActionProcess.call( this, action );\n *     };\n *     MyProcessDialog.prototype.getBodyHeight = function () {\n *         return this.panel1.$element.outerHeight( true );\n *     };\n *     var windowManager = new OO.ui.WindowManager();\n *     $( 'body' ).append( windowManager.$element );\n *     var dialog = new MyProcessDialog( {\n *         size: 'medium'\n *     } );\n *     windowManager.addWindows( [ dialog ] );\n *     windowManager.openWindow( dialog );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs#Action_sets\n *\n * @abstract\n * @class\n * @mixins OO.EventEmitter\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.ActionSet = function OoUiActionSet( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\n\t// Properties\n\tthis.list = [];\n\tthis.categories = {\n\t\tactions: 'getAction',\n\t\tflags: 'getFlags',\n\t\tmodes: 'getModes'\n\t};\n\tthis.categorized = {};\n\tthis.special = {};\n\tthis.others = [];\n\tthis.organized = false;\n\tthis.changing = false;\n\tthis.changed = false;\n};\n/* eslint-enable no-unused-vars */\n\n/* Setup */\n\nOO.mixinClass( OO.ui.ActionSet, OO.EventEmitter );\n\n/* Static Properties */\n\n/**\n * Symbolic name of the flags used to identify special actions. Special actions are displayed in the\n *  header of a {@link OO.ui.ProcessDialog process dialog}.\n *  See the [OOjs UI documentation on MediaWiki][2] for more information and examples.\n *\n *  [2]:https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs\n *\n * @abstract\n * @static\n * @inheritable\n * @property {string}\n */\nOO.ui.ActionSet.static.specialFlags = [ 'safe', 'primary' ];\n\n/* Events */\n\n/**\n * @event click\n *\n * A 'click' event is emitted when an action is clicked.\n *\n * @param {OO.ui.ActionWidget} action Action that was clicked\n */\n\n/**\n * @event add\n *\n * An 'add' event is emitted when actions are {@link #method-add added} to the action set.\n *\n * @param {OO.ui.ActionWidget[]} added Actions added\n */\n\n/**\n * @event remove\n *\n * A 'remove' event is emitted when actions are {@link #method-remove removed}\n *  or {@link #clear cleared}.\n *\n * @param {OO.ui.ActionWidget[]} added Actions removed\n */\n\n/**\n * @event change\n *\n * A 'change' event is emitted when actions are {@link #method-add added}, {@link #clear cleared},\n * or {@link #method-remove removed} from the action set or when the {@link #setMode mode} is changed.\n *\n */\n\n/* Methods */\n\n/**\n * Handle action change events.\n *\n * @private\n * @fires change\n */\nOO.ui.ActionSet.prototype.onActionChange = function () {\n\tthis.organized = false;\n\tif ( this.changing ) {\n\t\tthis.changed = true;\n\t} else {\n\t\tthis.emit( 'change' );\n\t}\n};\n\n/**\n * Check if an action is one of the special actions.\n *\n * @param {OO.ui.ActionWidget} action Action to check\n * @return {boolean} Action is special\n */\nOO.ui.ActionSet.prototype.isSpecial = function ( action ) {\n\tvar flag;\n\n\tfor ( flag in this.special ) {\n\t\tif ( action === this.special[ flag ] ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n\n/**\n * Get action widgets based on the specified filter: ‘actions’, ‘flags’, ‘modes’, ‘visible’,\n *  or ‘disabled’.\n *\n * @param {Object} [filters] Filters to use, omit to get all actions\n * @param {string|string[]} [filters.actions] Actions that action widgets must have\n * @param {string|string[]} [filters.flags] Flags that action widgets must have (e.g., 'safe')\n * @param {string|string[]} [filters.modes] Modes that action widgets must have\n * @param {boolean} [filters.visible] Action widgets must be visible\n * @param {boolean} [filters.disabled] Action widgets must be disabled\n * @return {OO.ui.ActionWidget[]} Action widgets matching all criteria\n */\nOO.ui.ActionSet.prototype.get = function ( filters ) {\n\tvar i, len, list, category, actions, index, match, matches;\n\n\tif ( filters ) {\n\t\tthis.organize();\n\n\t\t// Collect category candidates\n\t\tmatches = [];\n\t\tfor ( category in this.categorized ) {\n\t\t\tlist = filters[ category ];\n\t\t\tif ( list ) {\n\t\t\t\tif ( !Array.isArray( list ) ) {\n\t\t\t\t\tlist = [ list ];\n\t\t\t\t}\n\t\t\t\tfor ( i = 0, len = list.length; i < len; i++ ) {\n\t\t\t\t\tactions = this.categorized[ category ][ list[ i ] ];\n\t\t\t\t\tif ( Array.isArray( actions ) ) {\n\t\t\t\t\t\tmatches.push.apply( matches, actions );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Remove by boolean filters\n\t\tfor ( i = 0, len = matches.length; i < len; i++ ) {\n\t\t\tmatch = matches[ i ];\n\t\t\tif (\n\t\t\t\t( filters.visible !== undefined && match.isVisible() !== filters.visible ) ||\n\t\t\t\t( filters.disabled !== undefined && match.isDisabled() !== filters.disabled )\n\t\t\t) {\n\t\t\t\tmatches.splice( i, 1 );\n\t\t\t\tlen--;\n\t\t\t\ti--;\n\t\t\t}\n\t\t}\n\t\t// Remove duplicates\n\t\tfor ( i = 0, len = matches.length; i < len; i++ ) {\n\t\t\tmatch = matches[ i ];\n\t\t\tindex = matches.lastIndexOf( match );\n\t\t\twhile ( index !== i ) {\n\t\t\t\tmatches.splice( index, 1 );\n\t\t\t\tlen--;\n\t\t\t\tindex = matches.lastIndexOf( match );\n\t\t\t}\n\t\t}\n\t\treturn matches;\n\t}\n\treturn this.list.slice();\n};\n\n/**\n * Get 'special' actions.\n *\n * Special actions are the first visible action widgets with special flags, such as 'safe' and 'primary'.\n * Special flags can be configured in subclasses by changing the static #specialFlags property.\n *\n * @return {OO.ui.ActionWidget[]|null} 'Special' action widgets.\n */\nOO.ui.ActionSet.prototype.getSpecial = function () {\n\tthis.organize();\n\treturn $.extend( {}, this.special );\n};\n\n/**\n * Get 'other' actions.\n *\n * Other actions include all non-special visible action widgets.\n *\n * @return {OO.ui.ActionWidget[]} 'Other' action widgets\n */\nOO.ui.ActionSet.prototype.getOthers = function () {\n\tthis.organize();\n\treturn this.others.slice();\n};\n\n/**\n * Set the mode  (e.g., ‘edit’ or ‘view’). Only {@link OO.ui.ActionWidget#modes actions} configured\n * to be available in the specified mode will be made visible. All other actions will be hidden.\n *\n * @param {string} mode The mode. Only actions configured to be available in the specified\n *  mode will be made visible.\n * @chainable\n * @fires toggle\n * @fires change\n */\nOO.ui.ActionSet.prototype.setMode = function ( mode ) {\n\tvar i, len, action;\n\n\tthis.changing = true;\n\tfor ( i = 0, len = this.list.length; i < len; i++ ) {\n\t\taction = this.list[ i ];\n\t\taction.toggle( action.hasMode( mode ) );\n\t}\n\n\tthis.organized = false;\n\tthis.changing = false;\n\tthis.emit( 'change' );\n\n\treturn this;\n};\n\n/**\n * Set the abilities of the specified actions.\n *\n * Action widgets that are configured with the specified actions will be enabled\n * or disabled based on the boolean values specified in the `actions`\n * parameter.\n *\n * @param {Object.<string,boolean>} actions A list keyed by action name with boolean\n *  values that indicate whether or not the action should be enabled.\n * @chainable\n */\nOO.ui.ActionSet.prototype.setAbilities = function ( actions ) {\n\tvar i, len, action, item;\n\n\tfor ( i = 0, len = this.list.length; i < len; i++ ) {\n\t\titem = this.list[ i ];\n\t\taction = item.getAction();\n\t\tif ( actions[ action ] !== undefined ) {\n\t\t\titem.setDisabled( !actions[ action ] );\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Executes a function once per action.\n *\n * When making changes to multiple actions, use this method instead of iterating over the actions\n * manually to defer emitting a #change event until after all actions have been changed.\n *\n * @param {Object|null} filter Filters to use to determine which actions to iterate over; see #get\n * @param {Function} callback Callback to run for each action; callback is invoked with three\n *   arguments: the action, the action's index, the list of actions being iterated over\n * @chainable\n */\nOO.ui.ActionSet.prototype.forEach = function ( filter, callback ) {\n\tthis.changed = false;\n\tthis.changing = true;\n\tthis.get( filter ).forEach( callback );\n\tthis.changing = false;\n\tif ( this.changed ) {\n\t\tthis.emit( 'change' );\n\t}\n\n\treturn this;\n};\n\n/**\n * Add action widgets to the action set.\n *\n * @param {OO.ui.ActionWidget[]} actions Action widgets to add\n * @chainable\n * @fires add\n * @fires change\n */\nOO.ui.ActionSet.prototype.add = function ( actions ) {\n\tvar i, len, action;\n\n\tthis.changing = true;\n\tfor ( i = 0, len = actions.length; i < len; i++ ) {\n\t\taction = actions[ i ];\n\t\taction.connect( this, {\n\t\t\tclick: [ 'emit', 'click', action ],\n\t\t\ttoggle: [ 'onActionChange' ]\n\t\t} );\n\t\tthis.list.push( action );\n\t}\n\tthis.organized = false;\n\tthis.emit( 'add', actions );\n\tthis.changing = false;\n\tthis.emit( 'change' );\n\n\treturn this;\n};\n\n/**\n * Remove action widgets from the set.\n *\n * To remove all actions, you may wish to use the #clear method instead.\n *\n * @param {OO.ui.ActionWidget[]} actions Action widgets to remove\n * @chainable\n * @fires remove\n * @fires change\n */\nOO.ui.ActionSet.prototype.remove = function ( actions ) {\n\tvar i, len, index, action;\n\n\tthis.changing = true;\n\tfor ( i = 0, len = actions.length; i < len; i++ ) {\n\t\taction = actions[ i ];\n\t\tindex = this.list.indexOf( action );\n\t\tif ( index !== -1 ) {\n\t\t\taction.disconnect( this );\n\t\t\tthis.list.splice( index, 1 );\n\t\t}\n\t}\n\tthis.organized = false;\n\tthis.emit( 'remove', actions );\n\tthis.changing = false;\n\tthis.emit( 'change' );\n\n\treturn this;\n};\n\n/**\n * Remove all action widets from the set.\n *\n * To remove only specified actions, use the {@link #method-remove remove} method instead.\n *\n * @chainable\n * @fires remove\n * @fires change\n */\nOO.ui.ActionSet.prototype.clear = function () {\n\tvar i, len, action,\n\t\tremoved = this.list.slice();\n\n\tthis.changing = true;\n\tfor ( i = 0, len = this.list.length; i < len; i++ ) {\n\t\taction = this.list[ i ];\n\t\taction.disconnect( this );\n\t}\n\n\tthis.list = [];\n\n\tthis.organized = false;\n\tthis.emit( 'remove', removed );\n\tthis.changing = false;\n\tthis.emit( 'change' );\n\n\treturn this;\n};\n\n/**\n * Organize actions.\n *\n * This is called whenever organized information is requested. It will only reorganize the actions\n * if something has changed since the last time it ran.\n *\n * @private\n * @chainable\n */\nOO.ui.ActionSet.prototype.organize = function () {\n\tvar i, iLen, j, jLen, flag, action, category, list, item, special,\n\t\tspecialFlags = this.constructor.static.specialFlags;\n\n\tif ( !this.organized ) {\n\t\tthis.categorized = {};\n\t\tthis.special = {};\n\t\tthis.others = [];\n\t\tfor ( i = 0, iLen = this.list.length; i < iLen; i++ ) {\n\t\t\taction = this.list[ i ];\n\t\t\tif ( action.isVisible() ) {\n\t\t\t\t// Populate categories\n\t\t\t\tfor ( category in this.categories ) {\n\t\t\t\t\tif ( !this.categorized[ category ] ) {\n\t\t\t\t\t\tthis.categorized[ category ] = {};\n\t\t\t\t\t}\n\t\t\t\t\tlist = action[ this.categories[ category ] ]();\n\t\t\t\t\tif ( !Array.isArray( list ) ) {\n\t\t\t\t\t\tlist = [ list ];\n\t\t\t\t\t}\n\t\t\t\t\tfor ( j = 0, jLen = list.length; j < jLen; j++ ) {\n\t\t\t\t\t\titem = list[ j ];\n\t\t\t\t\t\tif ( !this.categorized[ category ][ item ] ) {\n\t\t\t\t\t\t\tthis.categorized[ category ][ item ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.categorized[ category ][ item ].push( action );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Populate special/others\n\t\t\t\tspecial = false;\n\t\t\t\tfor ( j = 0, jLen = specialFlags.length; j < jLen; j++ ) {\n\t\t\t\t\tflag = specialFlags[ j ];\n\t\t\t\t\tif ( !this.special[ flag ] && action.hasFlag( flag ) ) {\n\t\t\t\t\t\tthis.special[ flag ] = action;\n\t\t\t\t\t\tspecial = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( !special ) {\n\t\t\t\t\tthis.others.push( action );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.organized = true;\n\t}\n\n\treturn this;\n};\n","/**\n * Errors contain a required message (either a string or jQuery selection) that is used to describe what went wrong\n * in a {@link OO.ui.Process process}. The error's #recoverable and #warning configurations are used to customize the\n * appearance and functionality of the error interface.\n *\n * The basic error interface contains a formatted error message as well as two buttons: 'Dismiss' and 'Try again' (i.e., the error\n * is 'recoverable' by default). If the error is not recoverable, the 'Try again' button will not be rendered and the widget\n * that initiated the failed process will be disabled.\n *\n * If the error is a warning, the error interface will include a 'Dismiss' and a 'Continue' button, which will try the\n * process again.\n *\n * For an example of error interfaces, please see the [OOjs UI documentation on MediaWiki][1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs#Processes_and_errors\n *\n * @class\n *\n * @constructor\n * @param {string|jQuery} message Description of error\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [recoverable=true] Error is recoverable.\n *  By default, errors are recoverable, and users can try the process again.\n * @cfg {boolean} [warning=false] Error is a warning.\n *  If the error is a warning, the error interface will include a\n *  'Dismiss' and a 'Continue' button. It is the responsibility of the developer to ensure that the warning\n *  is not triggered a second time if the user chooses to continue.\n */\nOO.ui.Error = function OoUiError( message, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( message ) && config === undefined ) {\n\t\tconfig = message;\n\t\tmessage = config.message;\n\t}\n\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Properties\n\tthis.message = message instanceof jQuery ? message : String( message );\n\tthis.recoverable = config.recoverable === undefined || !!config.recoverable;\n\tthis.warning = !!config.warning;\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.Error );\n\n/* Methods */\n\n/**\n * Check if the error is recoverable.\n *\n * If the error is recoverable, users are able to try the process again.\n *\n * @return {boolean} Error is recoverable\n */\nOO.ui.Error.prototype.isRecoverable = function () {\n\treturn this.recoverable;\n};\n\n/**\n * Check if the error is a warning.\n *\n * If the error is a warning, the error interface will include a 'Dismiss' and a 'Continue' button.\n *\n * @return {boolean} Error is warning\n */\nOO.ui.Error.prototype.isWarning = function () {\n\treturn this.warning;\n};\n\n/**\n * Get error message as DOM nodes.\n *\n * @return {jQuery} Error message in DOM nodes\n */\nOO.ui.Error.prototype.getMessage = function () {\n\treturn this.message instanceof jQuery ?\n\t\tthis.message.clone() :\n\t\t$( '<div>' ).text( this.message ).contents();\n};\n\n/**\n * Get the error message text.\n *\n * @return {string} Error message\n */\nOO.ui.Error.prototype.getMessageText = function () {\n\treturn this.message instanceof jQuery ? this.message.text() : this.message;\n};\n","/**\n * A Process is a list of steps that are called in sequence. The step can be a number, a jQuery promise,\n * or a function:\n *\n * - **number**: the process will wait for the specified number of milliseconds before proceeding.\n * - **promise**: the process will continue to the next step when the promise is successfully resolved\n *  or stop if the promise is rejected.\n * - **function**: the process will execute the function. The process will stop if the function returns\n *  either a boolean `false` or a promise that is rejected; if the function returns a number, the process\n *  will wait for that number of milliseconds before proceeding.\n *\n * If the process fails, an {@link OO.ui.Error error} is generated. Depending on how the error is\n * configured, users can dismiss the error and try the process again, or not. If a process is stopped,\n * its remaining steps will not be performed.\n *\n * @class\n *\n * @constructor\n * @param {number|jQuery.Promise|Function} step Number of miliseconds to wait before proceeding, promise\n *  that must be resolved before proceeding, or a function to execute. See #createStep for more information. see #createStep for more information\n * @param {Object} [context=null] Execution context of the function. The context is ignored if the step is\n *  a number or promise.\n */\nOO.ui.Process = function ( step, context ) {\n\t// Properties\n\tthis.steps = [];\n\n\t// Initialization\n\tif ( step !== undefined ) {\n\t\tthis.next( step, context );\n\t}\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.Process );\n\n/* Methods */\n\n/**\n * Start the process.\n *\n * @return {jQuery.Promise} Promise that is resolved when all steps have successfully completed.\n *  If any of the steps return a promise that is rejected or a boolean false, this promise is rejected\n *  and any remaining steps are not performed.\n */\nOO.ui.Process.prototype.execute = function () {\n\tvar i, len, promise;\n\n\t/**\n\t * Continue execution.\n\t *\n\t * @ignore\n\t * @param {Array} step A function and the context it should be called in\n\t * @return {Function} Function that continues the process\n\t */\n\tfunction proceed( step ) {\n\t\treturn function () {\n\t\t\t// Execute step in the correct context\n\t\t\tvar deferred,\n\t\t\t\tresult = step.callback.call( step.context );\n\n\t\t\tif ( result === false ) {\n\t\t\t\t// Use rejected promise for boolean false results\n\t\t\t\treturn $.Deferred().reject( [] ).promise();\n\t\t\t}\n\t\t\tif ( typeof result === 'number' ) {\n\t\t\t\tif ( result < 0 ) {\n\t\t\t\t\tthrow new Error( 'Cannot go back in time: flux capacitor is out of service' );\n\t\t\t\t}\n\t\t\t\t// Use a delayed promise for numbers, expecting them to be in milliseconds\n\t\t\t\tdeferred = $.Deferred();\n\t\t\t\tsetTimeout( deferred.resolve, result );\n\t\t\t\treturn deferred.promise();\n\t\t\t}\n\t\t\tif ( result instanceof OO.ui.Error ) {\n\t\t\t\t// Use rejected promise for error\n\t\t\t\treturn $.Deferred().reject( [ result ] ).promise();\n\t\t\t}\n\t\t\tif ( Array.isArray( result ) && result.length && result[ 0 ] instanceof OO.ui.Error ) {\n\t\t\t\t// Use rejected promise for list of errors\n\t\t\t\treturn $.Deferred().reject( result ).promise();\n\t\t\t}\n\t\t\t// Duck-type the object to see if it can produce a promise\n\t\t\tif ( result && $.isFunction( result.promise ) ) {\n\t\t\t\t// Use a promise generated from the result\n\t\t\t\treturn result.promise();\n\t\t\t}\n\t\t\t// Use resolved promise for other results\n\t\t\treturn $.Deferred().resolve().promise();\n\t\t};\n\t}\n\n\tif ( this.steps.length ) {\n\t\t// Generate a chain reaction of promises\n\t\tpromise = proceed( this.steps[ 0 ] )();\n\t\tfor ( i = 1, len = this.steps.length; i < len; i++ ) {\n\t\t\tpromise = promise.then( proceed( this.steps[ i ] ) );\n\t\t}\n\t} else {\n\t\tpromise = $.Deferred().resolve().promise();\n\t}\n\n\treturn promise;\n};\n\n/**\n * Create a process step.\n *\n * @private\n * @param {number|jQuery.Promise|Function} step\n *\n * - Number of milliseconds to wait before proceeding\n * - Promise that must be resolved before proceeding\n * - Function to execute\n *   - If the function returns a boolean false the process will stop\n *   - If the function returns a promise, the process will continue to the next\n *     step when the promise is resolved or stop if the promise is rejected\n *   - If the function returns a number, the process will wait for that number of\n *     milliseconds before proceeding\n * @param {Object} [context=null] Execution context of the function. The context is\n *  ignored if the step is a number or promise.\n * @return {Object} Step object, with `callback` and `context` properties\n */\nOO.ui.Process.prototype.createStep = function ( step, context ) {\n\tif ( typeof step === 'number' || $.isFunction( step.promise ) ) {\n\t\treturn {\n\t\t\tcallback: function () {\n\t\t\t\treturn step;\n\t\t\t},\n\t\t\tcontext: null\n\t\t};\n\t}\n\tif ( $.isFunction( step ) ) {\n\t\treturn {\n\t\t\tcallback: step,\n\t\t\tcontext: context\n\t\t};\n\t}\n\tthrow new Error( 'Cannot create process step: number, promise or function expected' );\n};\n\n/**\n * Add step to the beginning of the process.\n *\n * @inheritdoc #createStep\n * @return {OO.ui.Process} this\n * @chainable\n */\nOO.ui.Process.prototype.first = function ( step, context ) {\n\tthis.steps.unshift( this.createStep( step, context ) );\n\treturn this;\n};\n\n/**\n * Add step to the end of the process.\n *\n * @inheritdoc #createStep\n * @return {OO.ui.Process} this\n * @chainable\n */\nOO.ui.Process.prototype.next = function ( step, context ) {\n\tthis.steps.push( this.createStep( step, context ) );\n\treturn this;\n};\n","/**\n * Window managers are used to open and close {@link OO.ui.Window windows} and control their presentation.\n * Managed windows are mutually exclusive. If a new window is opened while a current window is opening\n * or is opened, the current window will be closed and any ongoing {@link OO.ui.Process process} will be cancelled. Windows\n * themselves are persistent and—rather than being torn down when closed—can be repopulated with the\n * pertinent data and reused.\n *\n * Over the lifecycle of a window, the window manager makes available three promises: `opening`,\n * `opened`, and `closing`, which represent the primary stages of the cycle:\n *\n * **Opening**: the opening stage begins when the window manager’s #openWindow or a window’s\n * {@link OO.ui.Window#open open} method is used, and the window manager begins to open the window.\n *\n * - an `opening` event is emitted with an `opening` promise\n * - the #getSetupDelay method is called and the returned value is used to time a pause in execution before\n *   the window’s {@link OO.ui.Window#getSetupProcess getSetupProcess} method is called on the\n *   window and its result executed\n * - a `setup` progress notification is emitted from the `opening` promise\n * - the #getReadyDelay method is called the returned value is used to time a pause in execution before\n *   the window’s {@link OO.ui.Window#getReadyProcess getReadyProcess} method is called on the\n *   window and its result executed\n * - a `ready` progress notification is emitted from the `opening` promise\n * - the `opening` promise is resolved with an `opened` promise\n *\n * **Opened**: the window is now open.\n *\n * **Closing**: the closing stage begins when the window manager's #closeWindow or the\n * window's {@link OO.ui.Window#close close} methods is used, and the window manager begins\n * to close the window.\n *\n * - the `opened` promise is resolved with `closing` promise and a `closing` event is emitted\n * - the #getHoldDelay method is called and the returned value is used to time a pause in execution before\n *   the window's {@link OO.ui.Window#getHoldProcess getHoldProces} method is called on the\n *   window and its result executed\n * - a `hold` progress notification is emitted from the `closing` promise\n * - the #getTeardownDelay() method is called and the returned value is used to time a pause in execution before\n *   the window's {@link OO.ui.Window#getTeardownProcess getTeardownProcess} method is called on the\n *   window and its result executed\n * - a `teardown` progress notification is emitted from the `closing` promise\n * - the `closing` promise is resolved. The window is now closed\n *\n * See the [OOjs UI documentation on MediaWiki][1] for more information.\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Window_managers\n *\n * @class\n * @extends OO.ui.Element\n * @mixins OO.EventEmitter\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {OO.Factory} [factory] Window factory to use for automatic instantiation\n *  Note that window classes that are instantiated with a factory must have\n *  a {@link OO.ui.Dialog#static-name static name} property that specifies a symbolic name.\n * @cfg {boolean} [modal=true] Prevent interaction outside the dialog\n */\nOO.ui.WindowManager = function OoUiWindowManager( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.WindowManager.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\n\t// Properties\n\tthis.factory = config.factory;\n\tthis.modal = config.modal === undefined || !!config.modal;\n\tthis.windows = {};\n\tthis.opening = null;\n\tthis.opened = null;\n\tthis.closing = null;\n\tthis.preparingToOpen = null;\n\tthis.preparingToClose = null;\n\tthis.currentWindow = null;\n\tthis.globalEvents = false;\n\tthis.$returnFocusTo = null;\n\tthis.$ariaHidden = null;\n\tthis.onWindowResizeTimeout = null;\n\tthis.onWindowResizeHandler = this.onWindowResize.bind( this );\n\tthis.afterWindowResizeHandler = this.afterWindowResize.bind( this );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-windowManager' )\n\t\t.toggleClass( 'oo-ui-windowManager-modal', this.modal );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.WindowManager, OO.ui.Element );\nOO.mixinClass( OO.ui.WindowManager, OO.EventEmitter );\n\n/* Events */\n\n/**\n * An 'opening' event is emitted when the window begins to be opened.\n *\n * @event opening\n * @param {OO.ui.Window} win Window that's being opened\n * @param {jQuery.Promise} opening An `opening` promise resolved with a value when the window is opened successfully.\n *  When the `opening` promise is resolved, the first argument of the value is an 'opened' promise, the second argument\n *  is the opening data. The `opening` promise emits `setup` and `ready` notifications when those processes are complete.\n * @param {Object} data Window opening data\n */\n\n/**\n * A 'closing' event is emitted when the window begins to be closed.\n *\n * @event closing\n * @param {OO.ui.Window} win Window that's being closed\n * @param {jQuery.Promise} closing A `closing` promise is resolved with a value when the window\n *  is closed successfully. The promise emits `hold` and `teardown` notifications when those\n *  processes are complete. When the `closing` promise is resolved, the first argument of its value\n *  is the closing data.\n * @param {Object} data Window closing data\n */\n\n/**\n * A 'resize' event is emitted when a window is resized.\n *\n * @event resize\n * @param {OO.ui.Window} win Window that was resized\n */\n\n/* Static Properties */\n\n/**\n * Map of the symbolic name of each window size and its CSS properties.\n *\n * @static\n * @inheritable\n * @property {Object}\n */\nOO.ui.WindowManager.static.sizes = {\n\tsmall: {\n\t\twidth: 300\n\t},\n\tmedium: {\n\t\twidth: 500\n\t},\n\tlarge: {\n\t\twidth: 700\n\t},\n\tlarger: {\n\t\twidth: 900\n\t},\n\tfull: {\n\t\t// These can be non-numeric because they are never used in calculations\n\t\twidth: '100%',\n\t\theight: '100%'\n\t}\n};\n\n/**\n * Symbolic name of the default window size.\n *\n * The default size is used if the window's requested size is not recognized.\n *\n * @static\n * @inheritable\n * @property {string}\n */\nOO.ui.WindowManager.static.defaultSize = 'medium';\n\n/* Methods */\n\n/**\n * Handle window resize events.\n *\n * @private\n * @param {jQuery.Event} e Window resize event\n */\nOO.ui.WindowManager.prototype.onWindowResize = function () {\n\tclearTimeout( this.onWindowResizeTimeout );\n\tthis.onWindowResizeTimeout = setTimeout( this.afterWindowResizeHandler, 200 );\n};\n\n/**\n * Handle window resize events.\n *\n * @private\n * @param {jQuery.Event} e Window resize event\n */\nOO.ui.WindowManager.prototype.afterWindowResize = function () {\n\tif ( this.currentWindow ) {\n\t\tthis.updateWindowSize( this.currentWindow );\n\t}\n};\n\n/**\n * Check if window is opening.\n *\n * @param {OO.ui.Window} win Window to check\n * @return {boolean} Window is opening\n */\nOO.ui.WindowManager.prototype.isOpening = function ( win ) {\n\treturn win === this.currentWindow && !!this.opening && this.opening.state() === 'pending';\n};\n\n/**\n * Check if window is closing.\n *\n * @param {OO.ui.Window} win Window to check\n * @return {boolean} Window is closing\n */\nOO.ui.WindowManager.prototype.isClosing = function ( win ) {\n\treturn win === this.currentWindow && !!this.closing && this.closing.state() === 'pending';\n};\n\n/**\n * Check if window is opened.\n *\n * @param {OO.ui.Window} win Window to check\n * @return {boolean} Window is opened\n */\nOO.ui.WindowManager.prototype.isOpened = function ( win ) {\n\treturn win === this.currentWindow && !!this.opened && this.opened.state() === 'pending';\n};\n\n/**\n * Check if a window is being managed.\n *\n * @param {OO.ui.Window} win Window to check\n * @return {boolean} Window is being managed\n */\nOO.ui.WindowManager.prototype.hasWindow = function ( win ) {\n\tvar name;\n\n\tfor ( name in this.windows ) {\n\t\tif ( this.windows[ name ] === win ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n\n/**\n * Get the number of milliseconds to wait after opening begins before executing the ‘setup’ process.\n *\n * @param {OO.ui.Window} win Window being opened\n * @param {Object} [data] Window opening data\n * @return {number} Milliseconds to wait\n */\nOO.ui.WindowManager.prototype.getSetupDelay = function () {\n\treturn 0;\n};\n\n/**\n * Get the number of milliseconds to wait after setup has finished before executing the ‘ready’ process.\n *\n * @param {OO.ui.Window} win Window being opened\n * @param {Object} [data] Window opening data\n * @return {number} Milliseconds to wait\n */\nOO.ui.WindowManager.prototype.getReadyDelay = function () {\n\treturn 0;\n};\n\n/**\n * Get the number of milliseconds to wait after closing has begun before executing the 'hold' process.\n *\n * @param {OO.ui.Window} win Window being closed\n * @param {Object} [data] Window closing data\n * @return {number} Milliseconds to wait\n */\nOO.ui.WindowManager.prototype.getHoldDelay = function () {\n\treturn 0;\n};\n\n/**\n * Get the number of milliseconds to wait after the ‘hold’ process has finished before\n * executing the ‘teardown’ process.\n *\n * @param {OO.ui.Window} win Window being closed\n * @param {Object} [data] Window closing data\n * @return {number} Milliseconds to wait\n */\nOO.ui.WindowManager.prototype.getTeardownDelay = function () {\n\treturn this.modal ? 250 : 0;\n};\n\n/**\n * Get a window by its symbolic name.\n *\n * If the window is not yet instantiated and its symbolic name is recognized by a factory, it will be\n * instantiated and added to the window manager automatically. Please see the [OOjs UI documentation on MediaWiki][3]\n * for more information about using factories.\n * [3]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Window_managers\n *\n * @param {string} name Symbolic name of the window\n * @return {jQuery.Promise} Promise resolved with matching window, or rejected with an OO.ui.Error\n * @throws {Error} An error is thrown if the symbolic name is not recognized by the factory.\n * @throws {Error} An error is thrown if the named window is not recognized as a managed window.\n */\nOO.ui.WindowManager.prototype.getWindow = function ( name ) {\n\tvar deferred = $.Deferred(),\n\t\twin = this.windows[ name ];\n\n\tif ( !( win instanceof OO.ui.Window ) ) {\n\t\tif ( this.factory ) {\n\t\t\tif ( !this.factory.lookup( name ) ) {\n\t\t\t\tdeferred.reject( new OO.ui.Error(\n\t\t\t\t\t'Cannot auto-instantiate window: symbolic name is unrecognized by the factory'\n\t\t\t\t) );\n\t\t\t} else {\n\t\t\t\twin = this.factory.create( name );\n\t\t\t\tthis.addWindows( [ win ] );\n\t\t\t\tdeferred.resolve( win );\n\t\t\t}\n\t\t} else {\n\t\t\tdeferred.reject( new OO.ui.Error(\n\t\t\t\t'Cannot get unmanaged window: symbolic name unrecognized as a managed window'\n\t\t\t) );\n\t\t}\n\t} else {\n\t\tdeferred.resolve( win );\n\t}\n\n\treturn deferred.promise();\n};\n\n/**\n * Get current window.\n *\n * @return {OO.ui.Window|null} Currently opening/opened/closing window\n */\nOO.ui.WindowManager.prototype.getCurrentWindow = function () {\n\treturn this.currentWindow;\n};\n\n/**\n * Open a window.\n *\n * @param {OO.ui.Window|string} win Window object or symbolic name of window to open\n * @param {Object} [data] Window opening data\n * @param {jQuery|null} [data.$returnFocusTo] Element to which the window will return focus when closed.\n *  Defaults the current activeElement. If set to null, focus isn't changed on close.\n * @return {jQuery.Promise} An `opening` promise resolved when the window is done opening.\n *  See {@link #event-opening 'opening' event}  for more information about `opening` promises.\n * @fires opening\n */\nOO.ui.WindowManager.prototype.openWindow = function ( win, data ) {\n\tvar manager = this,\n\t\topening = $.Deferred();\n\tdata = data || {};\n\n\t// Argument handling\n\tif ( typeof win === 'string' ) {\n\t\treturn this.getWindow( win ).then( function ( win ) {\n\t\t\treturn manager.openWindow( win, data );\n\t\t} );\n\t}\n\n\t// Error handling\n\tif ( !this.hasWindow( win ) ) {\n\t\topening.reject( new OO.ui.Error(\n\t\t\t'Cannot open window: window is not attached to manager'\n\t\t) );\n\t} else if ( this.preparingToOpen || this.opening || this.opened ) {\n\t\topening.reject( new OO.ui.Error(\n\t\t\t'Cannot open window: another window is opening or open'\n\t\t) );\n\t}\n\n\t// Window opening\n\tif ( opening.state() !== 'rejected' ) {\n\t\t// If a window is currently closing, wait for it to complete\n\t\tthis.preparingToOpen = $.when( this.closing );\n\t\t// Ensure handlers get called after preparingToOpen is set\n\t\tthis.preparingToOpen.done( function () {\n\t\t\tif ( manager.modal ) {\n\t\t\t\tmanager.toggleGlobalEvents( true );\n\t\t\t\tmanager.toggleAriaIsolation( true );\n\t\t\t}\n\t\t\tmanager.$returnFocusTo = data.$returnFocusTo !== undefined ? data.$returnFocusTo : $( document.activeElement );\n\t\t\tmanager.currentWindow = win;\n\t\t\tmanager.opening = opening;\n\t\t\tmanager.preparingToOpen = null;\n\t\t\tmanager.emit( 'opening', win, opening, data );\n\t\t\tsetTimeout( function () {\n\t\t\t\twin.setup( data ).then( function () {\n\t\t\t\t\tmanager.updateWindowSize( win );\n\t\t\t\t\tmanager.opening.notify( { state: 'setup' } );\n\t\t\t\t\tsetTimeout( function () {\n\t\t\t\t\t\twin.ready( data ).then( function () {\n\t\t\t\t\t\t\tmanager.opening.notify( { state: 'ready' } );\n\t\t\t\t\t\t\tmanager.opening = null;\n\t\t\t\t\t\t\tmanager.opened = $.Deferred();\n\t\t\t\t\t\t\topening.resolve( manager.opened.promise(), data );\n\t\t\t\t\t\t}, function () {\n\t\t\t\t\t\t\tmanager.opening = null;\n\t\t\t\t\t\t\tmanager.opened = $.Deferred();\n\t\t\t\t\t\t\topening.reject();\n\t\t\t\t\t\t\tmanager.closeWindow( win );\n\t\t\t\t\t\t} );\n\t\t\t\t\t}, manager.getReadyDelay() );\n\t\t\t\t}, function () {\n\t\t\t\t\tmanager.opening = null;\n\t\t\t\t\tmanager.opened = $.Deferred();\n\t\t\t\t\topening.reject();\n\t\t\t\t\tmanager.closeWindow( win );\n\t\t\t\t} );\n\t\t\t}, manager.getSetupDelay() );\n\t\t} );\n\t}\n\n\treturn opening.promise();\n};\n\n/**\n * Close a window.\n *\n * @param {OO.ui.Window|string} win Window object or symbolic name of window to close\n * @param {Object} [data] Window closing data\n * @return {jQuery.Promise} A `closing` promise resolved when the window is done closing.\n *  See {@link #event-closing 'closing' event} for more information about closing promises.\n * @throws {Error} An error is thrown if the window is not managed by the window manager.\n * @fires closing\n */\nOO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {\n\tvar manager = this,\n\t\tclosing = $.Deferred(),\n\t\topened;\n\n\t// Argument handling\n\tif ( typeof win === 'string' ) {\n\t\twin = this.windows[ win ];\n\t} else if ( !this.hasWindow( win ) ) {\n\t\twin = null;\n\t}\n\n\t// Error handling\n\tif ( !win ) {\n\t\tclosing.reject( new OO.ui.Error(\n\t\t\t'Cannot close window: window is not attached to manager'\n\t\t) );\n\t} else if ( win !== this.currentWindow ) {\n\t\tclosing.reject( new OO.ui.Error(\n\t\t\t'Cannot close window: window already closed with different data'\n\t\t) );\n\t} else if ( this.preparingToClose || this.closing ) {\n\t\tclosing.reject( new OO.ui.Error(\n\t\t\t'Cannot close window: window already closing with different data'\n\t\t) );\n\t}\n\n\t// Window closing\n\tif ( closing.state() !== 'rejected' ) {\n\t\t// If the window is currently opening, close it when it's done\n\t\tthis.preparingToClose = $.when( this.opening );\n\t\t// Ensure handlers get called after preparingToClose is set\n\t\tthis.preparingToClose.always( function () {\n\t\t\tmanager.closing = closing;\n\t\t\tmanager.preparingToClose = null;\n\t\t\tmanager.emit( 'closing', win, closing, data );\n\t\t\topened = manager.opened;\n\t\t\tmanager.opened = null;\n\t\t\topened.resolve( closing.promise(), data );\n\t\t\tsetTimeout( function () {\n\t\t\t\twin.hold( data ).then( function () {\n\t\t\t\t\tclosing.notify( { state: 'hold' } );\n\t\t\t\t\tsetTimeout( function () {\n\t\t\t\t\t\twin.teardown( data ).then( function () {\n\t\t\t\t\t\t\tclosing.notify( { state: 'teardown' } );\n\t\t\t\t\t\t\tif ( manager.modal ) {\n\t\t\t\t\t\t\t\tmanager.toggleGlobalEvents( false );\n\t\t\t\t\t\t\t\tmanager.toggleAriaIsolation( false );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( manager.$returnFocusTo && manager.$returnFocusTo.length ) {\n\t\t\t\t\t\t\t\tmanager.$returnFocusTo[ 0 ].focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmanager.closing = null;\n\t\t\t\t\t\t\tmanager.currentWindow = null;\n\t\t\t\t\t\t\tclosing.resolve( data );\n\t\t\t\t\t\t} );\n\t\t\t\t\t}, manager.getTeardownDelay() );\n\t\t\t\t} );\n\t\t\t}, manager.getHoldDelay() );\n\t\t} );\n\t}\n\n\treturn closing.promise();\n};\n\n/**\n * Add windows to the window manager.\n *\n * Windows can be added by reference, symbolic name, or explicitly defined symbolic names.\n * See the [OOjs ui documentation on MediaWiki] [2] for examples.\n * [2]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Window_managers\n *\n * This function can be called in two manners:\n *\n * 1. `.addWindows( [ windowA, windowB, ... ] )` (where `windowA`, `windowB` are OO.ui.Window objects)\n *\n *    This syntax registers windows under the symbolic names defined in their `.static.name`\n *    properties. For example, if `windowA.constructor.static.name` is `'nameA'`, calling\n *    `.openWindow( 'nameA' )` afterwards will open the window `windowA`. This syntax requires the\n *    static name to be set, otherwise an exception will be thrown.\n *\n *    This is the recommended way, as it allows for an easier switch to using a window factory.\n *\n * 2. `.addWindows( { nameA: windowA, nameB: windowB, ... } )`\n *\n *    This syntax registers windows under the explicitly given symbolic names. In this example,\n *    calling `.openWindow( 'nameA' )` afterwards will open the window `windowA`, regardless of what\n *    its `.static.name` is set to. The static name is not required to be set.\n *\n *    This should only be used if you need to override the default symbolic names.\n *\n * Example:\n *\n *     var windowManager = new OO.ui.WindowManager();\n *     $( 'body' ).append( windowManager.$element );\n *\n *     // Add a window under the default name: see OO.ui.MessageDialog.static.name\n *     windowManager.addWindows( [ new OO.ui.MessageDialog() ] );\n *     // Add a window under an explicit name\n *     windowManager.addWindows( { myMessageDialog: new OO.ui.MessageDialog() } );\n *\n *     // Open window by default name\n *     windowManager.openWindow( 'message' );\n *     // Open window by explicitly given name\n *     windowManager.openWindow( 'myMessageDialog' );\n *\n *\n * @param {Object.<string,OO.ui.Window>|OO.ui.Window[]} windows An array of window objects specified\n *  by reference, symbolic name, or explicitly defined symbolic names.\n * @throws {Error} An error is thrown if a window is added by symbolic name, but has neither an\n *  explicit nor a statically configured symbolic name.\n */\nOO.ui.WindowManager.prototype.addWindows = function ( windows ) {\n\tvar i, len, win, name, list;\n\n\tif ( Array.isArray( windows ) ) {\n\t\t// Convert to map of windows by looking up symbolic names from static configuration\n\t\tlist = {};\n\t\tfor ( i = 0, len = windows.length; i < len; i++ ) {\n\t\t\tname = windows[ i ].constructor.static.name;\n\t\t\tif ( !name ) {\n\t\t\t\tthrow new Error( 'Windows must have a `name` static property defined.' );\n\t\t\t}\n\t\t\tlist[ name ] = windows[ i ];\n\t\t}\n\t} else if ( OO.isPlainObject( windows ) ) {\n\t\tlist = windows;\n\t}\n\n\t// Add windows\n\tfor ( name in list ) {\n\t\twin = list[ name ];\n\t\tthis.windows[ name ] = win.toggle( false );\n\t\tthis.$element.append( win.$element );\n\t\twin.setManager( this );\n\t}\n};\n\n/**\n * Remove the specified windows from the windows manager.\n *\n * Windows will be closed before they are removed. If you wish to remove all windows, you may wish to use\n * the #clearWindows method instead. If you no longer need the window manager and want to ensure that it no\n * longer listens to events, use the #destroy method.\n *\n * @param {string[]} names Symbolic names of windows to remove\n * @return {jQuery.Promise} Promise resolved when window is closed and removed\n * @throws {Error} An error is thrown if the named windows are not managed by the window manager.\n */\nOO.ui.WindowManager.prototype.removeWindows = function ( names ) {\n\tvar i, len, win, name, cleanupWindow,\n\t\tmanager = this,\n\t\tpromises = [],\n\t\tcleanup = function ( name, win ) {\n\t\t\tdelete manager.windows[ name ];\n\t\t\twin.$element.detach();\n\t\t};\n\n\tfor ( i = 0, len = names.length; i < len; i++ ) {\n\t\tname = names[ i ];\n\t\twin = this.windows[ name ];\n\t\tif ( !win ) {\n\t\t\tthrow new Error( 'Cannot remove window' );\n\t\t}\n\t\tcleanupWindow = cleanup.bind( null, name, win );\n\t\tpromises.push( this.closeWindow( name ).then( cleanupWindow, cleanupWindow ) );\n\t}\n\n\treturn $.when.apply( $, promises );\n};\n\n/**\n * Remove all windows from the window manager.\n *\n * Windows will be closed before they are removed. Note that the window manager, though not in use, will still\n * listen to events. If the window manager will not be used again, you may wish to use the #destroy method instead.\n * To remove just a subset of windows, use the #removeWindows method.\n *\n * @return {jQuery.Promise} Promise resolved when all windows are closed and removed\n */\nOO.ui.WindowManager.prototype.clearWindows = function () {\n\treturn this.removeWindows( Object.keys( this.windows ) );\n};\n\n/**\n * Set dialog size. In general, this method should not be called directly.\n *\n * Fullscreen mode will be used if the dialog is too wide to fit in the screen.\n *\n * @param {OO.ui.Window} win Window to update, should be the current window\n * @chainable\n */\nOO.ui.WindowManager.prototype.updateWindowSize = function ( win ) {\n\tvar isFullscreen;\n\n\t// Bypass for non-current, and thus invisible, windows\n\tif ( win !== this.currentWindow ) {\n\t\treturn;\n\t}\n\n\tisFullscreen = win.getSize() === 'full';\n\n\tthis.$element.toggleClass( 'oo-ui-windowManager-fullscreen', isFullscreen );\n\tthis.$element.toggleClass( 'oo-ui-windowManager-floating', !isFullscreen );\n\twin.setDimensions( win.getSizeProperties() );\n\n\tthis.emit( 'resize', win );\n\n\treturn this;\n};\n\n/**\n * Bind or unbind global events for scrolling.\n *\n * @private\n * @param {boolean} [on] Bind global events\n * @chainable\n */\nOO.ui.WindowManager.prototype.toggleGlobalEvents = function ( on ) {\n\tvar scrollWidth, bodyMargin,\n\t\t$body = $( this.getElementDocument().body ),\n\t\t// We could have multiple window managers open so only modify\n\t\t// the body css at the bottom of the stack\n\t\tstackDepth = $body.data( 'windowManagerGlobalEvents' ) || 0;\n\n\ton = on === undefined ? !!this.globalEvents : !!on;\n\n\tif ( on ) {\n\t\tif ( !this.globalEvents ) {\n\t\t\t$( this.getElementWindow() ).on( {\n\t\t\t\t// Start listening for top-level window dimension changes\n\t\t\t\t'orientationchange resize': this.onWindowResizeHandler\n\t\t\t} );\n\t\t\tif ( stackDepth === 0 ) {\n\t\t\t\tscrollWidth = window.innerWidth - document.documentElement.clientWidth;\n\t\t\t\tbodyMargin = parseFloat( $body.css( 'margin-right' ) ) || 0;\n\t\t\t\t$body.css( {\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t'margin-right': bodyMargin + scrollWidth\n\t\t\t\t} );\n\t\t\t}\n\t\t\tstackDepth++;\n\t\t\tthis.globalEvents = true;\n\t\t}\n\t} else if ( this.globalEvents ) {\n\t\t$( this.getElementWindow() ).off( {\n\t\t\t// Stop listening for top-level window dimension changes\n\t\t\t'orientationchange resize': this.onWindowResizeHandler\n\t\t} );\n\t\tstackDepth--;\n\t\tif ( stackDepth === 0 ) {\n\t\t\t$body.css( {\n\t\t\t\toverflow: '',\n\t\t\t\t'margin-right': ''\n\t\t\t} );\n\t\t}\n\t\tthis.globalEvents = false;\n\t}\n\t$body.data( 'windowManagerGlobalEvents', stackDepth );\n\n\treturn this;\n};\n\n/**\n * Toggle screen reader visibility of content other than the window manager.\n *\n * @private\n * @param {boolean} [isolate] Make only the window manager visible to screen readers\n * @chainable\n */\nOO.ui.WindowManager.prototype.toggleAriaIsolation = function ( isolate ) {\n\tisolate = isolate === undefined ? !this.$ariaHidden : !!isolate;\n\n\tif ( isolate ) {\n\t\tif ( !this.$ariaHidden ) {\n\t\t\t// Hide everything other than the window manager from screen readers\n\t\t\tthis.$ariaHidden = $( 'body' )\n\t\t\t\t.children()\n\t\t\t\t.not( this.$element.parentsUntil( 'body' ).last() )\n\t\t\t\t.attr( 'aria-hidden', '' );\n\t\t}\n\t} else if ( this.$ariaHidden ) {\n\t\t// Restore screen reader visibility\n\t\tthis.$ariaHidden.removeAttr( 'aria-hidden' );\n\t\tthis.$ariaHidden = null;\n\t}\n\n\treturn this;\n};\n\n/**\n * Destroy the window manager.\n *\n * Destroying the window manager ensures that it will no longer listen to events. If you would like to\n * continue using the window manager, but wish to remove all windows from it, use the #clearWindows method\n * instead.\n */\nOO.ui.WindowManager.prototype.destroy = function () {\n\tthis.toggleGlobalEvents( false );\n\tthis.toggleAriaIsolation( false );\n\tthis.clearWindows();\n\tthis.$element.remove();\n};\n","/**\n * A window is a container for elements that are in a child frame. They are used with\n * a window manager (OO.ui.WindowManager), which is used to open and close the window and control\n * its presentation. The size of a window is specified using a symbolic name (e.g., ‘small’, ‘medium’,\n * ‘large’), which is interpreted by the window manager. If the requested size is not recognized,\n * the window manager will choose a sensible fallback.\n *\n * The lifecycle of a window has three primary stages (opening, opened, and closing) in which\n * different processes are executed:\n *\n * **opening**: The opening stage begins when the window manager's {@link OO.ui.WindowManager#openWindow\n * openWindow} or the window's {@link #open open} methods are used, and the window manager begins to open\n * the window.\n *\n * - {@link #getSetupProcess} method is called and its result executed\n * - {@link #getReadyProcess} method is called and its result executed\n *\n * **opened**: The window is now open\n *\n * **closing**: The closing stage begins when the window manager's\n * {@link OO.ui.WindowManager#closeWindow closeWindow}\n * or the window's {@link #close} methods are used, and the window manager begins to close the window.\n *\n * - {@link #getHoldProcess} method is called and its result executed\n * - {@link #getTeardownProcess} method is called and its result executed. The window is now closed\n *\n * Each of the window's processes (setup, ready, hold, and teardown) can be extended in subclasses\n * by overriding the window's #getSetupProcess, #getReadyProcess, #getHoldProcess and #getTeardownProcess\n * methods. Note that each {@link OO.ui.Process process} is executed in series, so asynchronous\n * processing can complete. Always assume window processes are executed asynchronously.\n *\n * For more information, please see the [OOjs UI documentation on MediaWiki] [1].\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows\n *\n * @abstract\n * @class\n * @extends OO.ui.Element\n * @mixins OO.EventEmitter\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string} [size] Symbolic name of the dialog size: `small`, `medium`, `large`, `larger` or\n *  `full`.  If omitted, the value of the {@link #static-size static size} property will be used.\n */\nOO.ui.Window = function OoUiWindow( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.Window.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\n\t// Properties\n\tthis.manager = null;\n\tthis.size = config.size || this.constructor.static.size;\n\tthis.$frame = $( '<div>' );\n\t/**\n\t * Overlay element to use for the `$overlay` configuration option of widgets that support it.\n\t * Things put inside of it are overlaid on top of the window and are not bound to its dimensions.\n\t * See <https://www.mediawiki.org/wiki/OOjs_UI/Concepts#Overlays>.\n\t *\n\t *     MyDialog.prototype.initialize = function () {\n\t *       ...\n\t *       var popupButton = new OO.ui.PopupButtonWidget( {\n\t *         $overlay: this.$overlay,\n\t *         label: 'Popup button',\n\t *         popup: {\n\t *           $content: $( '<p>Popup contents.</p><p>Popup contents.</p><p>Popup contents.</p>' ),\n\t *           padded: true\n\t *         }\n\t *       } );\n\t *       ...\n\t *     };\n\t *\n\t * @property {jQuery}\n\t */\n\tthis.$overlay = $( '<div>' );\n\tthis.$content = $( '<div>' );\n\n\tthis.$focusTrapBefore = $( '<div>' ).prop( 'tabIndex', 0 );\n\tthis.$focusTrapAfter = $( '<div>' ).prop( 'tabIndex', 0 );\n\tthis.$focusTraps = this.$focusTrapBefore.add( this.$focusTrapAfter );\n\n\t// Initialization\n\tthis.$overlay.addClass( 'oo-ui-window-overlay' );\n\tthis.$content\n\t\t.addClass( 'oo-ui-window-content' )\n\t\t.attr( 'tabindex', 0 );\n\tthis.$frame\n\t\t.addClass( 'oo-ui-window-frame' )\n\t\t.append( this.$focusTrapBefore, this.$content, this.$focusTrapAfter );\n\n\tthis.$element\n\t\t.addClass( 'oo-ui-window' )\n\t\t.append( this.$frame, this.$overlay );\n\n\t// Initially hidden - using #toggle may cause errors if subclasses override toggle with methods\n\t// that reference properties not initialized at that time of parent class construction\n\t// TODO: Find a better way to handle post-constructor setup\n\tthis.visible = false;\n\tthis.$element.addClass( 'oo-ui-element-hidden' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.Window, OO.ui.Element );\nOO.mixinClass( OO.ui.Window, OO.EventEmitter );\n\n/* Static Properties */\n\n/**\n * Symbolic name of the window size: `small`, `medium`, `large`, `larger` or `full`.\n *\n * The static size is used if no #size is configured during construction.\n *\n * @static\n * @inheritable\n * @property {string}\n */\nOO.ui.Window.static.size = 'medium';\n\n/* Methods */\n\n/**\n * Handle mouse down events.\n *\n * @private\n * @param {jQuery.Event} e Mouse down event\n */\nOO.ui.Window.prototype.onMouseDown = function ( e ) {\n\t// Prevent clicking on the click-block from stealing focus\n\tif ( e.target === this.$element[ 0 ] ) {\n\t\treturn false;\n\t}\n};\n\n/**\n * Check if the window has been initialized.\n *\n * Initialization occurs when a window is added to a manager.\n *\n * @return {boolean} Window has been initialized\n */\nOO.ui.Window.prototype.isInitialized = function () {\n\treturn !!this.manager;\n};\n\n/**\n * Check if the window is visible.\n *\n * @return {boolean} Window is visible\n */\nOO.ui.Window.prototype.isVisible = function () {\n\treturn this.visible;\n};\n\n/**\n * Check if the window is opening.\n *\n * This method is a wrapper around the window manager's {@link OO.ui.WindowManager#isOpening isOpening}\n * method.\n *\n * @return {boolean} Window is opening\n */\nOO.ui.Window.prototype.isOpening = function () {\n\treturn this.manager.isOpening( this );\n};\n\n/**\n * Check if the window is closing.\n *\n * This method is a wrapper around the window manager's {@link OO.ui.WindowManager#isClosing isClosing} method.\n *\n * @return {boolean} Window is closing\n */\nOO.ui.Window.prototype.isClosing = function () {\n\treturn this.manager.isClosing( this );\n};\n\n/**\n * Check if the window is opened.\n *\n * This method is a wrapper around the window manager's {@link OO.ui.WindowManager#isOpened isOpened} method.\n *\n * @return {boolean} Window is opened\n */\nOO.ui.Window.prototype.isOpened = function () {\n\treturn this.manager.isOpened( this );\n};\n\n/**\n * Get the window manager.\n *\n * All windows must be attached to a window manager, which is used to open\n * and close the window and control its presentation.\n *\n * @return {OO.ui.WindowManager} Manager of window\n */\nOO.ui.Window.prototype.getManager = function () {\n\treturn this.manager;\n};\n\n/**\n * Get the symbolic name of the window size (e.g., `small` or `medium`).\n *\n * @return {string} Symbolic name of the size: `small`, `medium`, `large`, `larger`, `full`\n */\nOO.ui.Window.prototype.getSize = function () {\n\tvar viewport = OO.ui.Element.static.getDimensions( this.getElementWindow() ),\n\t\tsizes = this.manager.constructor.static.sizes,\n\t\tsize = this.size;\n\n\tif ( !sizes[ size ] ) {\n\t\tsize = this.manager.constructor.static.defaultSize;\n\t}\n\tif ( size !== 'full' && viewport.rect.right - viewport.rect.left < sizes[ size ].width ) {\n\t\tsize = 'full';\n\t}\n\n\treturn size;\n};\n\n/**\n * Get the size properties associated with the current window size\n *\n * @return {Object} Size properties\n */\nOO.ui.Window.prototype.getSizeProperties = function () {\n\treturn this.manager.constructor.static.sizes[ this.getSize() ];\n};\n\n/**\n * Disable transitions on window's frame for the duration of the callback function, then enable them\n * back.\n *\n * @private\n * @param {Function} callback Function to call while transitions are disabled\n */\nOO.ui.Window.prototype.withoutSizeTransitions = function ( callback ) {\n\t// Temporarily resize the frame so getBodyHeight() can use scrollHeight measurements.\n\t// Disable transitions first, otherwise we'll get values from when the window was animating.\n\t// We need to build the transition CSS properties using these specific properties since\n\t// Firefox doesn't return anything useful when asked just for 'transition'.\n\tvar oldTransition = this.$frame.css( 'transition-property' ) + ' ' +\n\t\tthis.$frame.css( 'transition-duration' ) + ' ' +\n\t\tthis.$frame.css( 'transition-timing-function' ) + ' ' +\n\t\tthis.$frame.css( 'transition-delay' );\n\n\tthis.$frame.css( 'transition', 'none' );\n\tcallback();\n\n\t// Force reflow to make sure the style changes done inside callback\n\t// really are not transitioned\n\tthis.$frame.height();\n\tthis.$frame.css( 'transition', oldTransition );\n};\n\n/**\n * Get the height of the full window contents (i.e., the window head, body and foot together).\n *\n * What consistitutes the head, body, and foot varies depending on the window type.\n * A {@link OO.ui.MessageDialog message dialog} displays a title and message in its body,\n * and any actions in the foot. A {@link OO.ui.ProcessDialog process dialog} displays a title\n * and special actions in the head, and dialog content in the body.\n *\n * To get just the height of the dialog body, use the #getBodyHeight method.\n *\n * @return {number} The height of the window contents (the dialog head, body and foot) in pixels\n */\nOO.ui.Window.prototype.getContentHeight = function () {\n\tvar bodyHeight,\n\t\twin = this,\n\t\tbodyStyleObj = this.$body[ 0 ].style,\n\t\tframeStyleObj = this.$frame[ 0 ].style;\n\n\t// Temporarily resize the frame so getBodyHeight() can use scrollHeight measurements.\n\t// Disable transitions first, otherwise we'll get values from when the window was animating.\n\tthis.withoutSizeTransitions( function () {\n\t\tvar oldHeight = frameStyleObj.height,\n\t\t\toldPosition = bodyStyleObj.position;\n\t\tframeStyleObj.height = '1px';\n\t\t// Force body to resize to new width\n\t\tbodyStyleObj.position = 'relative';\n\t\tbodyHeight = win.getBodyHeight();\n\t\tframeStyleObj.height = oldHeight;\n\t\tbodyStyleObj.position = oldPosition;\n\t} );\n\n\treturn (\n\t\t// Add buffer for border\n\t\t( this.$frame.outerHeight() - this.$frame.innerHeight() ) +\n\t\t// Use combined heights of children\n\t\t( this.$head.outerHeight( true ) + bodyHeight + this.$foot.outerHeight( true ) )\n\t);\n};\n\n/**\n * Get the height of the window body.\n *\n * To get the height of the full window contents (the window body, head, and foot together),\n * use #getContentHeight.\n *\n * When this function is called, the window will temporarily have been resized\n * to height=1px, so .scrollHeight measurements can be taken accurately.\n *\n * @return {number} Height of the window body in pixels\n */\nOO.ui.Window.prototype.getBodyHeight = function () {\n\treturn this.$body[ 0 ].scrollHeight;\n};\n\n/**\n * Get the directionality of the frame (right-to-left or left-to-right).\n *\n * @return {string} Directionality: `'ltr'` or `'rtl'`\n */\nOO.ui.Window.prototype.getDir = function () {\n\treturn OO.ui.Element.static.getDir( this.$content ) || 'ltr';\n};\n\n/**\n * Get the 'setup' process.\n *\n * The setup process is used to set up a window for use in a particular context,\n * based on the `data` argument. This method is called during the opening phase of the window’s\n * lifecycle.\n *\n * Override this method to add additional steps to the ‘setup’ process the parent method provides\n * using the {@link OO.ui.Process#first first} and {@link OO.ui.Process#next next} methods\n * of OO.ui.Process.\n *\n * To add window content that persists between openings, you may wish to use the #initialize method\n * instead.\n *\n * @param {Object} [data] Window opening data\n * @return {OO.ui.Process} Setup process\n */\nOO.ui.Window.prototype.getSetupProcess = function () {\n\treturn new OO.ui.Process();\n};\n\n/**\n * Get the ‘ready’ process.\n *\n * The ready process is used to ready a window for use in a particular\n * context, based on the `data` argument. This method is called during the opening phase of\n * the window’s lifecycle, after the window has been {@link #getSetupProcess setup}.\n *\n * Override this method to add additional steps to the ‘ready’ process the parent method\n * provides using the {@link OO.ui.Process#first first} and {@link OO.ui.Process#next next}\n * methods of OO.ui.Process.\n *\n * @param {Object} [data] Window opening data\n * @return {OO.ui.Process} Ready process\n */\nOO.ui.Window.prototype.getReadyProcess = function () {\n\treturn new OO.ui.Process();\n};\n\n/**\n * Get the 'hold' process.\n *\n * The hold process is used to keep a window from being used in a particular context,\n * based on the `data` argument. This method is called during the closing phase of the window’s\n * lifecycle.\n *\n * Override this method to add additional steps to the 'hold' process the parent method provides\n * using the {@link OO.ui.Process#first first} and {@link OO.ui.Process#next next} methods\n * of OO.ui.Process.\n *\n * @param {Object} [data] Window closing data\n * @return {OO.ui.Process} Hold process\n */\nOO.ui.Window.prototype.getHoldProcess = function () {\n\treturn new OO.ui.Process();\n};\n\n/**\n * Get the ‘teardown’ process.\n *\n * The teardown process is used to teardown a window after use. During teardown,\n * user interactions within the window are conveyed and the window is closed, based on the `data`\n * argument. This method is called during the closing phase of the window’s lifecycle.\n *\n * Override this method to add additional steps to the ‘teardown’ process the parent method provides\n * using the {@link OO.ui.Process#first first} and {@link OO.ui.Process#next next} methods\n * of OO.ui.Process.\n *\n * @param {Object} [data] Window closing data\n * @return {OO.ui.Process} Teardown process\n */\nOO.ui.Window.prototype.getTeardownProcess = function () {\n\treturn new OO.ui.Process();\n};\n\n/**\n * Set the window manager.\n *\n * This will cause the window to initialize. Calling it more than once will cause an error.\n *\n * @param {OO.ui.WindowManager} manager Manager for this window\n * @throws {Error} An error is thrown if the method is called more than once\n * @chainable\n */\nOO.ui.Window.prototype.setManager = function ( manager ) {\n\tif ( this.manager ) {\n\t\tthrow new Error( 'Cannot set window manager, window already has a manager' );\n\t}\n\n\tthis.manager = manager;\n\tthis.initialize();\n\n\treturn this;\n};\n\n/**\n * Set the window size by symbolic name (e.g., 'small' or 'medium')\n *\n * @param {string} size Symbolic name of size: `small`, `medium`, `large`, `larger` or\n *  `full`\n * @chainable\n */\nOO.ui.Window.prototype.setSize = function ( size ) {\n\tthis.size = size;\n\tthis.updateSize();\n\treturn this;\n};\n\n/**\n * Update the window size.\n *\n * @throws {Error} An error is thrown if the window is not attached to a window manager\n * @chainable\n */\nOO.ui.Window.prototype.updateSize = function () {\n\tif ( !this.manager ) {\n\t\tthrow new Error( 'Cannot update window size, must be attached to a manager' );\n\t}\n\n\tthis.manager.updateWindowSize( this );\n\n\treturn this;\n};\n\n/**\n * Set window dimensions. This method is called by the {@link OO.ui.WindowManager window manager}\n * when the window is opening. In general, setDimensions should not be called directly.\n *\n * To set the size of the window, use the #setSize method.\n *\n * @param {Object} dim CSS dimension properties\n * @param {string|number} [dim.width] Width\n * @param {string|number} [dim.minWidth] Minimum width\n * @param {string|number} [dim.maxWidth] Maximum width\n * @param {string|number} [dim.height] Height, omit to set based on height of contents\n * @param {string|number} [dim.minHeight] Minimum height\n * @param {string|number} [dim.maxHeight] Maximum height\n * @chainable\n */\nOO.ui.Window.prototype.setDimensions = function ( dim ) {\n\tvar height,\n\t\twin = this,\n\t\tstyleObj = this.$frame[ 0 ].style;\n\n\t// Calculate the height we need to set using the correct width\n\tif ( dim.height === undefined ) {\n\t\tthis.withoutSizeTransitions( function () {\n\t\t\tvar oldWidth = styleObj.width;\n\t\t\twin.$frame.css( 'width', dim.width || '' );\n\t\t\theight = win.getContentHeight();\n\t\t\tstyleObj.width = oldWidth;\n\t\t} );\n\t} else {\n\t\theight = dim.height;\n\t}\n\n\tthis.$frame.css( {\n\t\twidth: dim.width || '',\n\t\tminWidth: dim.minWidth || '',\n\t\tmaxWidth: dim.maxWidth || '',\n\t\theight: height || '',\n\t\tminHeight: dim.minHeight || '',\n\t\tmaxHeight: dim.maxHeight || ''\n\t} );\n\n\treturn this;\n};\n\n/**\n * Initialize window contents.\n *\n * Before the window is opened for the first time, #initialize is called so that content that\n * persists between openings can be added to the window.\n *\n * To set up a window with new content each time the window opens, use #getSetupProcess.\n *\n * @throws {Error} An error is thrown if the window is not attached to a window manager\n * @chainable\n */\nOO.ui.Window.prototype.initialize = function () {\n\tif ( !this.manager ) {\n\t\tthrow new Error( 'Cannot initialize window, must be attached to a manager' );\n\t}\n\n\t// Properties\n\tthis.$head = $( '<div>' );\n\tthis.$body = $( '<div>' );\n\tthis.$foot = $( '<div>' );\n\tthis.$document = $( this.getElementDocument() );\n\n\t// Events\n\tthis.$element.on( 'mousedown', this.onMouseDown.bind( this ) );\n\n\t// Initialization\n\tthis.$head.addClass( 'oo-ui-window-head' );\n\tthis.$body.addClass( 'oo-ui-window-body' );\n\tthis.$foot.addClass( 'oo-ui-window-foot' );\n\tthis.$content.append( this.$head, this.$body, this.$foot );\n\n\treturn this;\n};\n\n/**\n * Called when someone tries to focus the hidden element at the end of the dialog.\n * Sends focus back to the start of the dialog.\n *\n * @param {jQuery.Event} event Focus event\n */\nOO.ui.Window.prototype.onFocusTrapFocused = function ( event ) {\n\tvar backwards = this.$focusTrapBefore.is( event.target ),\n\t\telement = OO.ui.findFocusable( this.$content, backwards );\n\tif ( element ) {\n\t\t// There's a focusable element inside the content, at the front or\n\t\t// back depending on which focus trap we hit; select it.\n\t\telement.focus();\n\t} else {\n\t\t// There's nothing focusable inside the content. As a fallback,\n\t\t// this.$content is focusable, and focusing it will keep our focus\n\t\t// properly trapped. It's not a *meaningful* focus, since it's just\n\t\t// the content-div for the Window, but it's better than letting focus\n\t\t// escape into the page.\n\t\tthis.$content.focus();\n\t}\n};\n\n/**\n * Open the window.\n *\n * This method is a wrapper around a call to the window manager’s {@link OO.ui.WindowManager#openWindow openWindow}\n * method, which returns a promise resolved when the window is done opening.\n *\n * To customize the window each time it opens, use #getSetupProcess or #getReadyProcess.\n *\n * @param {Object} [data] Window opening data\n * @return {jQuery.Promise} Promise resolved with a value when the window is opened, or rejected\n *  if the window fails to open. When the promise is resolved successfully, the first argument of the\n *  value is a new promise, which is resolved when the window begins closing.\n * @throws {Error} An error is thrown if the window is not attached to a window manager\n */\nOO.ui.Window.prototype.open = function ( data ) {\n\tif ( !this.manager ) {\n\t\tthrow new Error( 'Cannot open window, must be attached to a manager' );\n\t}\n\n\treturn this.manager.openWindow( this, data );\n};\n\n/**\n * Close the window.\n *\n * This method is a wrapper around a call to the window\n * manager’s {@link OO.ui.WindowManager#closeWindow closeWindow} method,\n * which returns a closing promise resolved when the window is done closing.\n *\n * The window's #getHoldProcess and #getTeardownProcess methods are called during the closing\n * phase of the window’s lifecycle and can be used to specify closing behavior each time\n * the window closes.\n *\n * @param {Object} [data] Window closing data\n * @return {jQuery.Promise} Promise resolved when window is closed\n * @throws {Error} An error is thrown if the window is not attached to a window manager\n */\nOO.ui.Window.prototype.close = function ( data ) {\n\tif ( !this.manager ) {\n\t\tthrow new Error( 'Cannot close window, must be attached to a manager' );\n\t}\n\n\treturn this.manager.closeWindow( this, data );\n};\n\n/**\n * Setup window.\n *\n * This is called by OO.ui.WindowManager during window opening, and should not be called directly\n * by other systems.\n *\n * @param {Object} [data] Window opening data\n * @return {jQuery.Promise} Promise resolved when window is setup\n */\nOO.ui.Window.prototype.setup = function ( data ) {\n\tvar win = this;\n\n\tthis.toggle( true );\n\n\tthis.focusTrapHandler = OO.ui.bind( this.onFocusTrapFocused, this );\n\tthis.$focusTraps.on( 'focus', this.focusTrapHandler );\n\n\treturn this.getSetupProcess( data ).execute().then( function () {\n\t\t// Force redraw by asking the browser to measure the elements' widths\n\t\twin.$element.addClass( 'oo-ui-window-active oo-ui-window-setup' ).width();\n\t\twin.$content.addClass( 'oo-ui-window-content-setup' ).width();\n\t} );\n};\n\n/**\n * Ready window.\n *\n * This is called by OO.ui.WindowManager during window opening, and should not be called directly\n * by other systems.\n *\n * @param {Object} [data] Window opening data\n * @return {jQuery.Promise} Promise resolved when window is ready\n */\nOO.ui.Window.prototype.ready = function ( data ) {\n\tvar win = this;\n\n\tthis.$content.focus();\n\treturn this.getReadyProcess( data ).execute().then( function () {\n\t\t// Force redraw by asking the browser to measure the elements' widths\n\t\twin.$element.addClass( 'oo-ui-window-ready' ).width();\n\t\twin.$content.addClass( 'oo-ui-window-content-ready' ).width();\n\t} );\n};\n\n/**\n * Hold window.\n *\n * This is called by OO.ui.WindowManager during window closing, and should not be called directly\n * by other systems.\n *\n * @param {Object} [data] Window closing data\n * @return {jQuery.Promise} Promise resolved when window is held\n */\nOO.ui.Window.prototype.hold = function ( data ) {\n\tvar win = this;\n\n\treturn this.getHoldProcess( data ).execute().then( function () {\n\t\t// Get the focused element within the window's content\n\t\tvar $focus = win.$content.find( OO.ui.Element.static.getDocument( win.$content ).activeElement );\n\n\t\t// Blur the focused element\n\t\tif ( $focus.length ) {\n\t\t\t$focus[ 0 ].blur();\n\t\t}\n\n\t\t// Force redraw by asking the browser to measure the elements' widths\n\t\twin.$element.removeClass( 'oo-ui-window-ready' ).width();\n\t\twin.$content.removeClass( 'oo-ui-window-content-ready' ).width();\n\t} );\n};\n\n/**\n * Teardown window.\n *\n * This is called by OO.ui.WindowManager during window closing, and should not be called directly\n * by other systems.\n *\n * @param {Object} [data] Window closing data\n * @return {jQuery.Promise} Promise resolved when window is torn down\n */\nOO.ui.Window.prototype.teardown = function ( data ) {\n\tvar win = this;\n\n\treturn this.getTeardownProcess( data ).execute().then( function () {\n\t\t// Force redraw by asking the browser to measure the elements' widths\n\t\twin.$element.removeClass( 'oo-ui-window-active oo-ui-window-setup' ).width();\n\t\twin.$content.removeClass( 'oo-ui-window-content-setup' ).width();\n\t\twin.$focusTraps.off( 'focus', win.focusTrapHandler );\n\t\twin.toggle( false );\n\t} );\n};\n","/**\n * The Dialog class serves as the base class for the other types of dialogs.\n * Unless extended to include controls, the rendered dialog box is a simple window\n * that users can close by hitting the ‘Esc’ key. Dialog windows are used with OO.ui.WindowManager,\n * which opens, closes, and controls the presentation of the window. See the\n * [OOjs UI documentation on MediaWiki] [1] for more information.\n *\n *     @example\n *     // A simple dialog window.\n *     function MyDialog( config ) {\n *         MyDialog.parent.call( this, config );\n *     }\n *     OO.inheritClass( MyDialog, OO.ui.Dialog );\n *     MyDialog.static.name = 'myDialog';\n *     MyDialog.prototype.initialize = function () {\n *         MyDialog.parent.prototype.initialize.call( this );\n *         this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );\n *         this.content.$element.append( '<p>A simple dialog window. Press \\'Esc\\' to close.</p>' );\n *         this.$body.append( this.content.$element );\n *     };\n *     MyDialog.prototype.getBodyHeight = function () {\n *         return this.content.$element.outerHeight( true );\n *     };\n *     var myDialog = new MyDialog( {\n *         size: 'medium'\n *     } );\n *     // Create and append a window manager, which opens and closes the window.\n *     var windowManager = new OO.ui.WindowManager();\n *     $( 'body' ).append( windowManager.$element );\n *     windowManager.addWindows( [ myDialog ] );\n *     // Open the window!\n *     windowManager.openWindow( myDialog );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Dialogs\n *\n * @abstract\n * @class\n * @extends OO.ui.Window\n * @mixins OO.ui.mixin.PendingElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.Dialog = function OoUiDialog( config ) {\n\t// Parent constructor\n\tOO.ui.Dialog.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.PendingElement.call( this );\n\n\t// Properties\n\tthis.actions = new OO.ui.ActionSet();\n\tthis.attachedActions = [];\n\tthis.currentAction = null;\n\tthis.onDialogKeyDownHandler = this.onDialogKeyDown.bind( this );\n\n\t// Events\n\tthis.actions.connect( this, {\n\t\tclick: 'onActionClick',\n\t\tchange: 'onActionsChange'\n\t} );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 'oo-ui-dialog' )\n\t\t.attr( 'role', 'dialog' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.Dialog, OO.ui.Window );\nOO.mixinClass( OO.ui.Dialog, OO.ui.mixin.PendingElement );\n\n/* Static Properties */\n\n/**\n * Symbolic name of dialog.\n *\n * The dialog class must have a symbolic name in order to be registered with OO.Factory.\n * Please see the [OOjs UI documentation on MediaWiki] [3] for more information.\n *\n * [3]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Window_managers\n *\n * @abstract\n * @static\n * @inheritable\n * @property {string}\n */\nOO.ui.Dialog.static.name = '';\n\n/**\n * The dialog title.\n *\n * The title can be specified as a plaintext string, a {@link OO.ui.mixin.LabelElement Label} node, or a function\n * that will produce a Label node or string. The title can also be specified with data passed to the\n * constructor (see #getSetupProcess). In this case, the static value will be overridden.\n *\n * @abstract\n * @static\n * @inheritable\n * @property {jQuery|string|Function}\n */\nOO.ui.Dialog.static.title = '';\n\n/**\n * An array of configured {@link OO.ui.ActionWidget action widgets}.\n *\n * Actions can also be specified with data passed to the constructor (see #getSetupProcess). In this case, the static\n * value will be overridden.\n *\n * [2]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs#Action_sets\n *\n * @static\n * @inheritable\n * @property {Object[]}\n */\nOO.ui.Dialog.static.actions = [];\n\n/**\n * Close the dialog when the 'Esc' key is pressed.\n *\n * @static\n * @abstract\n * @inheritable\n * @property {boolean}\n */\nOO.ui.Dialog.static.escapable = true;\n\n/* Methods */\n\n/**\n * Handle frame document key down events.\n *\n * @private\n * @param {jQuery.Event} e Key down event\n */\nOO.ui.Dialog.prototype.onDialogKeyDown = function ( e ) {\n\tvar actions;\n\tif ( e.which === OO.ui.Keys.ESCAPE && this.constructor.static.escapable ) {\n\t\tthis.executeAction( '' );\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t} else if ( e.which === OO.ui.Keys.ENTER && ( e.ctrlKey || e.metaKey ) ) {\n\t\tactions = this.actions.get( { flags: 'primary', visible: true, disabled: false } );\n\t\tif ( actions.length > 0 ) {\n\t\t\tthis.executeAction( actions[ 0 ].getAction() );\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\t}\n};\n\n/**\n * Handle action click events.\n *\n * @private\n * @param {OO.ui.ActionWidget} action Action that was clicked\n */\nOO.ui.Dialog.prototype.onActionClick = function ( action ) {\n\tif ( !this.isPending() ) {\n\t\tthis.executeAction( action.getAction() );\n\t}\n};\n\n/**\n * Handle actions change event.\n *\n * @private\n */\nOO.ui.Dialog.prototype.onActionsChange = function () {\n\tthis.detachActions();\n\tif ( !this.isClosing() ) {\n\t\tthis.attachActions();\n\t}\n};\n\n/**\n * Get the set of actions used by the dialog.\n *\n * @return {OO.ui.ActionSet}\n */\nOO.ui.Dialog.prototype.getActions = function () {\n\treturn this.actions;\n};\n\n/**\n * Get a process for taking action.\n *\n * When you override this method, you can create a new OO.ui.Process and return it, or add additional\n * accept steps to the process the parent method provides using the {@link OO.ui.Process#first 'first'}\n * and {@link OO.ui.Process#next 'next'} methods of OO.ui.Process.\n *\n * @param {string} [action] Symbolic name of action\n * @return {OO.ui.Process} Action process\n */\nOO.ui.Dialog.prototype.getActionProcess = function ( action ) {\n\treturn new OO.ui.Process()\n\t\t.next( function () {\n\t\t\tif ( !action ) {\n\t\t\t\t// An empty action always closes the dialog without data, which should always be\n\t\t\t\t// safe and make no changes\n\t\t\t\tthis.close();\n\t\t\t}\n\t\t}, this );\n};\n\n/**\n * @inheritdoc\n *\n * @param {Object} [data] Dialog opening data\n * @param {jQuery|string|Function|null} [data.title] Dialog title, omit to use\n *  the {@link #static-title static title}\n * @param {Object[]} [data.actions] List of configuration options for each\n *   {@link OO.ui.ActionWidget action widget}, omit to use {@link #static-actions static actions}.\n */\nOO.ui.Dialog.prototype.getSetupProcess = function ( data ) {\n\tdata = data || {};\n\n\t// Parent method\n\treturn OO.ui.Dialog.parent.prototype.getSetupProcess.call( this, data )\n\t\t.next( function () {\n\t\t\tvar config = this.constructor.static,\n\t\t\t\tactions = data.actions !== undefined ? data.actions : config.actions,\n\t\t\t\ttitle = data.title !== undefined ? data.title : config.title;\n\n\t\t\tthis.title.setLabel( title ).setTitle( title );\n\t\t\tthis.actions.add( this.getActionWidgets( actions ) );\n\n\t\t\tthis.$element.on( 'keydown', this.onDialogKeyDownHandler );\n\t\t}, this );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.Dialog.prototype.getTeardownProcess = function ( data ) {\n\t// Parent method\n\treturn OO.ui.Dialog.parent.prototype.getTeardownProcess.call( this, data )\n\t\t.first( function () {\n\t\t\tthis.$element.off( 'keydown', this.onDialogKeyDownHandler );\n\n\t\t\tthis.actions.clear();\n\t\t\tthis.currentAction = null;\n\t\t}, this );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.Dialog.prototype.initialize = function () {\n\t// Parent method\n\tOO.ui.Dialog.parent.prototype.initialize.call( this );\n\n\t// Properties\n\tthis.title = new OO.ui.LabelWidget();\n\n\t// Initialization\n\tthis.$content.addClass( 'oo-ui-dialog-content' );\n\tthis.$element.attr( 'aria-labelledby', this.title.getElementId() );\n\tthis.setPendingElement( this.$head );\n};\n\n/**\n * Get action widgets from a list of configs\n *\n * @param {Object[]} actions Action widget configs\n * @return {OO.ui.ActionWidget[]} Action widgets\n */\nOO.ui.Dialog.prototype.getActionWidgets = function ( actions ) {\n\tvar i, len, widgets = [];\n\tfor ( i = 0, len = actions.length; i < len; i++ ) {\n\t\twidgets.push(\n\t\t\tnew OO.ui.ActionWidget( actions[ i ] )\n\t\t);\n\t}\n\treturn widgets;\n};\n\n/**\n * Attach action actions.\n *\n * @protected\n */\nOO.ui.Dialog.prototype.attachActions = function () {\n\t// Remember the list of potentially attached actions\n\tthis.attachedActions = this.actions.get();\n};\n\n/**\n * Detach action actions.\n *\n * @protected\n * @chainable\n */\nOO.ui.Dialog.prototype.detachActions = function () {\n\tvar i, len;\n\n\t// Detach all actions that may have been previously attached\n\tfor ( i = 0, len = this.attachedActions.length; i < len; i++ ) {\n\t\tthis.attachedActions[ i ].$element.detach();\n\t}\n\tthis.attachedActions = [];\n};\n\n/**\n * Execute an action.\n *\n * @param {string} action Symbolic name of action to execute\n * @return {jQuery.Promise} Promise resolved when action completes, rejected if it fails\n */\nOO.ui.Dialog.prototype.executeAction = function ( action ) {\n\tthis.pushPending();\n\tthis.currentAction = action;\n\treturn this.getActionProcess( action ).execute()\n\t\t.always( this.popPending.bind( this ) );\n};\n","/**\n * MessageDialogs display a confirmation or alert message. By default, the rendered dialog box\n * consists of a header that contains the dialog title, a body with the message, and a footer that\n * contains any {@link OO.ui.ActionWidget action widgets}. The MessageDialog class is the only type\n * of {@link OO.ui.Dialog dialog} that is usually instantiated directly.\n *\n * There are two basic types of message dialogs, confirmation and alert:\n *\n * - **confirmation**: the dialog title describes what a progressive action will do and the message provides\n *  more details about the consequences.\n * - **alert**: the dialog title describes which event occurred and the message provides more information\n *  about why the event occurred.\n *\n * The MessageDialog class specifies two actions: ‘accept’, the primary\n * action (e.g., ‘ok’) and ‘reject,’ the safe action (e.g., ‘cancel’). Both will close the window,\n * passing along the selected action.\n *\n * For more information and examples, please see the [OOjs UI documentation on MediaWiki][1].\n *\n *     @example\n *     // Example: Creating and opening a message dialog window.\n *     var messageDialog = new OO.ui.MessageDialog();\n *\n *     // Create and append a window manager.\n *     var windowManager = new OO.ui.WindowManager();\n *     $( 'body' ).append( windowManager.$element );\n *     windowManager.addWindows( [ messageDialog ] );\n *     // Open the window.\n *     windowManager.openWindow( messageDialog, {\n *         title: 'Basic message dialog',\n *         message: 'This is the message'\n *     } );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Message_Dialogs\n *\n * @class\n * @extends OO.ui.Dialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.MessageDialog = function OoUiMessageDialog( config ) {\n\t// Parent constructor\n\tOO.ui.MessageDialog.parent.call( this, config );\n\n\t// Properties\n\tthis.verticalActionLayout = null;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-messageDialog' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.MessageDialog, OO.ui.Dialog );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.MessageDialog.static.name = 'message';\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.MessageDialog.static.size = 'small';\n\n/**\n * Dialog title.\n *\n * The title of a confirmation dialog describes what a progressive action will do. The\n * title of an alert dialog describes which event occurred.\n *\n * @static\n * @inheritable\n * @property {jQuery|string|Function|null}\n */\nOO.ui.MessageDialog.static.title = null;\n\n/**\n * The message displayed in the dialog body.\n *\n * A confirmation message describes the consequences of a progressive action. An alert\n * message describes why an event occurred.\n *\n * @static\n * @inheritable\n * @property {jQuery|string|Function|null}\n */\nOO.ui.MessageDialog.static.message = null;\n\n/**\n * @static\n * @inheritdoc\n */\nOO.ui.MessageDialog.static.actions = [\n\t// Note that OO.ui.alert() and OO.ui.confirm() rely on these.\n\t{ action: 'accept', label: OO.ui.deferMsg( 'ooui-dialog-message-accept' ), flags: 'primary' },\n\t{ action: 'reject', label: OO.ui.deferMsg( 'ooui-dialog-message-reject' ), flags: 'safe' }\n];\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nOO.ui.MessageDialog.prototype.setManager = function ( manager ) {\n\tOO.ui.MessageDialog.parent.prototype.setManager.call( this, manager );\n\n\t// Events\n\tthis.manager.connect( this, {\n\t\tresize: 'onResize'\n\t} );\n\n\treturn this;\n};\n\n/**\n * Handle window resized events.\n *\n * @private\n */\nOO.ui.MessageDialog.prototype.onResize = function () {\n\tvar dialog = this;\n\tdialog.fitActions();\n\t// Wait for CSS transition to finish and do it again :(\n\tsetTimeout( function () {\n\t\tdialog.fitActions();\n\t}, 300 );\n};\n\n/**\n * Toggle action layout between vertical and horizontal.\n *\n * @private\n * @param {boolean} [value] Layout actions vertically, omit to toggle\n * @chainable\n */\nOO.ui.MessageDialog.prototype.toggleVerticalActionLayout = function ( value ) {\n\tvalue = value === undefined ? !this.verticalActionLayout : !!value;\n\n\tif ( value !== this.verticalActionLayout ) {\n\t\tthis.verticalActionLayout = value;\n\t\tthis.$actions\n\t\t\t.toggleClass( 'oo-ui-messageDialog-actions-vertical', value )\n\t\t\t.toggleClass( 'oo-ui-messageDialog-actions-horizontal', !value );\n\t}\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MessageDialog.prototype.getActionProcess = function ( action ) {\n\tif ( action ) {\n\t\treturn new OO.ui.Process( function () {\n\t\t\tthis.close( { action: action } );\n\t\t}, this );\n\t}\n\treturn OO.ui.MessageDialog.parent.prototype.getActionProcess.call( this, action );\n};\n\n/**\n * @inheritdoc\n *\n * @param {Object} [data] Dialog opening data\n * @param {jQuery|string|Function|null} [data.title] Description of the action being confirmed\n * @param {jQuery|string|Function|null} [data.message] Description of the action's consequence\n * @param {string} [data.size] Symbolic name of the dialog size, see OO.ui.Window\n * @param {Object[]} [data.actions] List of OO.ui.ActionOptionWidget configuration options for each\n *   action item\n */\nOO.ui.MessageDialog.prototype.getSetupProcess = function ( data ) {\n\tdata = data || {};\n\n\t// Parent method\n\treturn OO.ui.MessageDialog.parent.prototype.getSetupProcess.call( this, data )\n\t\t.next( function () {\n\t\t\tthis.title.setLabel(\n\t\t\t\tdata.title !== undefined ? data.title : this.constructor.static.title\n\t\t\t);\n\t\t\tthis.message.setLabel(\n\t\t\t\tdata.message !== undefined ? data.message : this.constructor.static.message\n\t\t\t);\n\t\t\tthis.size = data.size !== undefined ? data.size : this.constructor.static.size;\n\t\t}, this );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MessageDialog.prototype.getReadyProcess = function ( data ) {\n\tdata = data || {};\n\n\t// Parent method\n\treturn OO.ui.MessageDialog.parent.prototype.getReadyProcess.call( this, data )\n\t\t.next( function () {\n\t\t\t// Focus the primary action button\n\t\t\tvar actions = this.actions.get();\n\t\t\tactions = actions.filter( function ( action ) {\n\t\t\t\treturn action.getFlags().indexOf( 'primary' ) > -1;\n\t\t\t} );\n\t\t\tif ( actions.length > 0 ) {\n\t\t\t\tactions[ 0 ].focus();\n\t\t\t}\n\t\t}, this );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MessageDialog.prototype.getBodyHeight = function () {\n\tvar bodyHeight, oldOverflow,\n\t\t$scrollable = this.container.$element;\n\n\toldOverflow = $scrollable[ 0 ].style.overflow;\n\t$scrollable[ 0 ].style.overflow = 'hidden';\n\n\tOO.ui.Element.static.reconsiderScrollbars( $scrollable[ 0 ] );\n\n\tbodyHeight = this.text.$element.outerHeight( true );\n\t$scrollable[ 0 ].style.overflow = oldOverflow;\n\n\treturn bodyHeight;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MessageDialog.prototype.setDimensions = function ( dim ) {\n\tvar $scrollable = this.container.$element;\n\tOO.ui.MessageDialog.parent.prototype.setDimensions.call( this, dim );\n\n\t// Twiddle the overflow property, otherwise an unnecessary scrollbar will be produced.\n\t// Need to do it after transition completes (250ms), add 50ms just in case.\n\tsetTimeout( function () {\n\t\tvar oldOverflow = $scrollable[ 0 ].style.overflow,\n\t\t\tactiveElement = document.activeElement;\n\n\t\t$scrollable[ 0 ].style.overflow = 'hidden';\n\n\t\tOO.ui.Element.static.reconsiderScrollbars( $scrollable[ 0 ] );\n\n\t\t// Check reconsiderScrollbars didn't destroy our focus, as we\n\t\t// are doing this after the ready process.\n\t\tif ( activeElement && activeElement !== document.activeElement && activeElement.focus ) {\n\t\t\tactiveElement.focus();\n\t\t}\n\n\t\t$scrollable[ 0 ].style.overflow = oldOverflow;\n\t}, 300 );\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MessageDialog.prototype.initialize = function () {\n\t// Parent method\n\tOO.ui.MessageDialog.parent.prototype.initialize.call( this );\n\n\t// Properties\n\tthis.$actions = $( '<div>' );\n\tthis.container = new OO.ui.PanelLayout( {\n\t\tscrollable: true, classes: [ 'oo-ui-messageDialog-container' ]\n\t} );\n\tthis.text = new OO.ui.PanelLayout( {\n\t\tpadded: true, expanded: false, classes: [ 'oo-ui-messageDialog-text' ]\n\t} );\n\tthis.message = new OO.ui.LabelWidget( {\n\t\tclasses: [ 'oo-ui-messageDialog-message' ]\n\t} );\n\n\t// Initialization\n\tthis.title.$element.addClass( 'oo-ui-messageDialog-title' );\n\tthis.$content.addClass( 'oo-ui-messageDialog-content' );\n\tthis.container.$element.append( this.text.$element );\n\tthis.text.$element.append( this.title.$element, this.message.$element );\n\tthis.$body.append( this.container.$element );\n\tthis.$actions.addClass( 'oo-ui-messageDialog-actions' );\n\tthis.$foot.append( this.$actions );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.MessageDialog.prototype.attachActions = function () {\n\tvar i, len, other, special, others;\n\n\t// Parent method\n\tOO.ui.MessageDialog.parent.prototype.attachActions.call( this );\n\n\tspecial = this.actions.getSpecial();\n\tothers = this.actions.getOthers();\n\n\tif ( special.safe ) {\n\t\tthis.$actions.append( special.safe.$element );\n\t\tspecial.safe.toggleFramed( false );\n\t}\n\tif ( others.length ) {\n\t\tfor ( i = 0, len = others.length; i < len; i++ ) {\n\t\t\tother = others[ i ];\n\t\t\tthis.$actions.append( other.$element );\n\t\t\tother.toggleFramed( false );\n\t\t}\n\t}\n\tif ( special.primary ) {\n\t\tthis.$actions.append( special.primary.$element );\n\t\tspecial.primary.toggleFramed( false );\n\t}\n\n\tif ( !this.isOpening() ) {\n\t\t// If the dialog is currently opening, this will be called automatically soon.\n\t\t// This also calls #fitActions.\n\t\tthis.updateSize();\n\t}\n};\n\n/**\n * Fit action actions into columns or rows.\n *\n * Columns will be used if all labels can fit without overflow, otherwise rows will be used.\n *\n * @private\n */\nOO.ui.MessageDialog.prototype.fitActions = function () {\n\tvar i, len, action,\n\t\tprevious = this.verticalActionLayout,\n\t\tactions = this.actions.get();\n\n\t// Detect clipping\n\tthis.toggleVerticalActionLayout( false );\n\tfor ( i = 0, len = actions.length; i < len; i++ ) {\n\t\taction = actions[ i ];\n\t\tif ( action.$element.innerWidth() < action.$label.outerWidth( true ) ) {\n\t\t\tthis.toggleVerticalActionLayout( true );\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Move the body out of the way of the foot\n\tthis.$body.css( 'bottom', this.$foot.outerHeight( true ) );\n\n\tif ( this.verticalActionLayout !== previous ) {\n\t\t// We changed the layout, window height might need to be updated.\n\t\tthis.updateSize();\n\t}\n};\n","/**\n * ProcessDialog windows encapsulate a {@link OO.ui.Process process} and all of the code necessary\n * to complete it. If the process terminates with an error, a customizable {@link OO.ui.Error error\n * interface} alerts users to the trouble, permitting the user to dismiss the error and try again when\n * relevant. The ProcessDialog class is always extended and customized with the actions and content\n * required for each process.\n *\n * The process dialog box consists of a header that visually represents the ‘working’ state of long\n * processes with an animation. The header contains the dialog title as well as\n * two {@link OO.ui.ActionWidget action widgets}:  a ‘safe’ action on the left (e.g., ‘Cancel’) and\n * a ‘primary’ action on the right (e.g., ‘Done’).\n *\n * Like other windows, the process dialog is managed by a {@link OO.ui.WindowManager window manager}.\n * Please see the [OOjs UI documentation on MediaWiki][1] for more information and examples.\n *\n *     @example\n *     // Example: Creating and opening a process dialog window.\n *     function MyProcessDialog( config ) {\n *         MyProcessDialog.parent.call( this, config );\n *     }\n *     OO.inheritClass( MyProcessDialog, OO.ui.ProcessDialog );\n *\n *     MyProcessDialog.static.name = 'myProcessDialog';\n *     MyProcessDialog.static.title = 'Process dialog';\n *     MyProcessDialog.static.actions = [\n *         { action: 'save', label: 'Done', flags: 'primary' },\n *         { label: 'Cancel', flags: 'safe' }\n *     ];\n *\n *     MyProcessDialog.prototype.initialize = function () {\n *         MyProcessDialog.parent.prototype.initialize.apply( this, arguments );\n *         this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );\n *         this.content.$element.append( '<p>This is a process dialog window. The header contains the title and two buttons: \\'Cancel\\' (a safe action) on the left and \\'Done\\' (a primary action)  on the right.</p>' );\n *         this.$body.append( this.content.$element );\n *     };\n *     MyProcessDialog.prototype.getActionProcess = function ( action ) {\n *         var dialog = this;\n *         if ( action ) {\n *             return new OO.ui.Process( function () {\n *                 dialog.close( { action: action } );\n *             } );\n *         }\n *         return MyProcessDialog.parent.prototype.getActionProcess.call( this, action );\n *     };\n *\n *     var windowManager = new OO.ui.WindowManager();\n *     $( 'body' ).append( windowManager.$element );\n *\n *     var dialog = new MyProcessDialog();\n *     windowManager.addWindows( [ dialog ] );\n *     windowManager.openWindow( dialog );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs\n *\n * @abstract\n * @class\n * @extends OO.ui.Dialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nOO.ui.ProcessDialog = function OoUiProcessDialog( config ) {\n\t// Parent constructor\n\tOO.ui.ProcessDialog.parent.call( this, config );\n\n\t// Properties\n\tthis.fitOnOpen = false;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-processDialog' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ProcessDialog, OO.ui.Dialog );\n\n/* Methods */\n\n/**\n * Handle dismiss button click events.\n *\n * Hides errors.\n *\n * @private\n */\nOO.ui.ProcessDialog.prototype.onDismissErrorButtonClick = function () {\n\tthis.hideErrors();\n};\n\n/**\n * Handle retry button click events.\n *\n * Hides errors and then tries again.\n *\n * @private\n */\nOO.ui.ProcessDialog.prototype.onRetryButtonClick = function () {\n\tthis.hideErrors();\n\tthis.executeAction( this.currentAction );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ProcessDialog.prototype.initialize = function () {\n\t// Parent method\n\tOO.ui.ProcessDialog.parent.prototype.initialize.call( this );\n\n\t// Properties\n\tthis.$navigation = $( '<div>' );\n\tthis.$location = $( '<div>' );\n\tthis.$safeActions = $( '<div>' );\n\tthis.$primaryActions = $( '<div>' );\n\tthis.$otherActions = $( '<div>' );\n\tthis.dismissButton = new OO.ui.ButtonWidget( {\n\t\tlabel: OO.ui.msg( 'ooui-dialog-process-dismiss' )\n\t} );\n\tthis.retryButton = new OO.ui.ButtonWidget();\n\tthis.$errors = $( '<div>' );\n\tthis.$errorsTitle = $( '<div>' );\n\n\t// Events\n\tthis.dismissButton.connect( this, { click: 'onDismissErrorButtonClick' } );\n\tthis.retryButton.connect( this, { click: 'onRetryButtonClick' } );\n\n\t// Initialization\n\tthis.title.$element.addClass( 'oo-ui-processDialog-title' );\n\tthis.$location\n\t\t.append( this.title.$element )\n\t\t.addClass( 'oo-ui-processDialog-location' );\n\tthis.$safeActions.addClass( 'oo-ui-processDialog-actions-safe' );\n\tthis.$primaryActions.addClass( 'oo-ui-processDialog-actions-primary' );\n\tthis.$otherActions.addClass( 'oo-ui-processDialog-actions-other' );\n\tthis.$errorsTitle\n\t\t.addClass( 'oo-ui-processDialog-errors-title' )\n\t\t.text( OO.ui.msg( 'ooui-dialog-process-error' ) );\n\tthis.$errors\n\t\t.addClass( 'oo-ui-processDialog-errors oo-ui-element-hidden' )\n\t\t.append( this.$errorsTitle, this.dismissButton.$element, this.retryButton.$element );\n\tthis.$content\n\t\t.addClass( 'oo-ui-processDialog-content' )\n\t\t.append( this.$errors );\n\tthis.$navigation\n\t\t.addClass( 'oo-ui-processDialog-navigation' )\n\t\t// Note: Order of appends below is important. These are in the order\n\t\t// we want tab to go through them. Display-order is handled entirely\n\t\t// by CSS absolute-positioning. As such, primary actions like \"done\"\n\t\t// should go first.\n\t\t.append( this.$primaryActions, this.$location, this.$safeActions );\n\tthis.$head.append( this.$navigation );\n\tthis.$foot.append( this.$otherActions );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ProcessDialog.prototype.getActionWidgets = function ( actions ) {\n\tvar i, len, config,\n\t\tisMobile = OO.ui.isMobile(),\n\t\twidgets = [];\n\n\tfor ( i = 0, len = actions.length; i < len; i++ ) {\n\t\tconfig = $.extend( { framed: !OO.ui.isMobile() }, actions[ i ] );\n\t\tif ( isMobile &&\n\t\t\t( config.flags === 'back' || ( Array.isArray( config.flags ) && config.flags.indexOf( 'back' ) !== -1 ) )\n\t\t) {\n\t\t\t$.extend( config, {\n\t\t\t\ticon: 'previous',\n\t\t\t\tlabel: ''\n\t\t\t} );\n\t\t}\n\t\twidgets.push(\n\t\t\tnew OO.ui.ActionWidget( config )\n\t\t);\n\t}\n\treturn widgets;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ProcessDialog.prototype.attachActions = function () {\n\tvar i, len, other, special, others;\n\n\t// Parent method\n\tOO.ui.ProcessDialog.parent.prototype.attachActions.call( this );\n\n\tspecial = this.actions.getSpecial();\n\tothers = this.actions.getOthers();\n\tif ( special.primary ) {\n\t\tthis.$primaryActions.append( special.primary.$element );\n\t}\n\tfor ( i = 0, len = others.length; i < len; i++ ) {\n\t\tother = others[ i ];\n\t\tthis.$otherActions.append( other.$element );\n\t}\n\tif ( special.safe ) {\n\t\tthis.$safeActions.append( special.safe.$element );\n\t}\n\n\tthis.fitLabel();\n\tthis.$body.css( 'bottom', this.$foot.outerHeight( true ) );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ProcessDialog.prototype.executeAction = function ( action ) {\n\tvar process = this;\n\treturn OO.ui.ProcessDialog.parent.prototype.executeAction.call( this, action )\n\t\t.fail( function ( errors ) {\n\t\t\tprocess.showErrors( errors || [] );\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ProcessDialog.prototype.setDimensions = function () {\n\t// Parent method\n\tOO.ui.ProcessDialog.parent.prototype.setDimensions.apply( this, arguments );\n\n\tthis.fitLabel();\n};\n\n/**\n * Fit label between actions.\n *\n * @private\n * @chainable\n */\nOO.ui.ProcessDialog.prototype.fitLabel = function () {\n\tvar safeWidth, primaryWidth, biggerWidth, labelWidth, navigationWidth, leftWidth, rightWidth,\n\t\tsize = this.getSizeProperties();\n\n\tif ( typeof size.width !== 'number' ) {\n\t\tif ( this.isOpened() ) {\n\t\t\tnavigationWidth = this.$head.width() - 20;\n\t\t} else if ( this.isOpening() ) {\n\t\t\tif ( !this.fitOnOpen ) {\n\t\t\t\t// Size is relative and the dialog isn't open yet, so wait.\n\t\t\t\tthis.manager.opening.done( this.fitLabel.bind( this ) );\n\t\t\t\tthis.fitOnOpen = true;\n\t\t\t}\n\t\t\treturn;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\tnavigationWidth = size.width - 20;\n\t}\n\n\tsafeWidth = this.$safeActions.is( ':visible' ) ? this.$safeActions.width() : 0;\n\tprimaryWidth = this.$primaryActions.is( ':visible' ) ? this.$primaryActions.width() : 0;\n\tbiggerWidth = Math.max( safeWidth, primaryWidth );\n\n\tlabelWidth = this.title.$element.width();\n\n\tif ( 2 * biggerWidth + labelWidth < navigationWidth ) {\n\t\t// We have enough space to center the label\n\t\tleftWidth = rightWidth = biggerWidth;\n\t} else {\n\t\t// Let's hope we at least have enough space not to overlap, because we can't wrap the label…\n\t\tif ( this.getDir() === 'ltr' ) {\n\t\t\tleftWidth = safeWidth;\n\t\t\trightWidth = primaryWidth;\n\t\t} else {\n\t\t\tleftWidth = primaryWidth;\n\t\t\trightWidth = safeWidth;\n\t\t}\n\t}\n\n\tthis.$location.css( { paddingLeft: leftWidth, paddingRight: rightWidth } );\n\n\treturn this;\n};\n\n/**\n * Handle errors that occurred during accept or reject processes.\n *\n * @private\n * @param {OO.ui.Error[]|OO.ui.Error} errors Errors to be handled\n */\nOO.ui.ProcessDialog.prototype.showErrors = function ( errors ) {\n\tvar i, len, $item, actions,\n\t\titems = [],\n\t\tabilities = {},\n\t\trecoverable = true,\n\t\twarning = false;\n\n\tif ( errors instanceof OO.ui.Error ) {\n\t\terrors = [ errors ];\n\t}\n\n\tfor ( i = 0, len = errors.length; i < len; i++ ) {\n\t\tif ( !errors[ i ].isRecoverable() ) {\n\t\t\trecoverable = false;\n\t\t}\n\t\tif ( errors[ i ].isWarning() ) {\n\t\t\twarning = true;\n\t\t}\n\t\t$item = $( '<div>' )\n\t\t\t.addClass( 'oo-ui-processDialog-error' )\n\t\t\t.append( errors[ i ].getMessage() );\n\t\titems.push( $item[ 0 ] );\n\t}\n\tthis.$errorItems = $( items );\n\tif ( recoverable ) {\n\t\tabilities[ this.currentAction ] = true;\n\t\t// Copy the flags from the first matching action\n\t\tactions = this.actions.get( { actions: this.currentAction } );\n\t\tif ( actions.length ) {\n\t\t\tthis.retryButton.clearFlags().setFlags( actions[ 0 ].getFlags() );\n\t\t}\n\t} else {\n\t\tabilities[ this.currentAction ] = false;\n\t\tthis.actions.setAbilities( abilities );\n\t}\n\tif ( warning ) {\n\t\tthis.retryButton.setLabel( OO.ui.msg( 'ooui-dialog-process-continue' ) );\n\t} else {\n\t\tthis.retryButton.setLabel( OO.ui.msg( 'ooui-dialog-process-retry' ) );\n\t}\n\tthis.retryButton.toggle( recoverable );\n\tthis.$errorsTitle.after( this.$errorItems );\n\tthis.$errors.removeClass( 'oo-ui-element-hidden' ).scrollTop( 0 );\n};\n\n/**\n * Hide errors.\n *\n * @private\n */\nOO.ui.ProcessDialog.prototype.hideErrors = function () {\n\tthis.$errors.addClass( 'oo-ui-element-hidden' );\n\tif ( this.$errorItems ) {\n\t\tthis.$errorItems.remove();\n\t\tthis.$errorItems = null;\n\t}\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ProcessDialog.prototype.getTeardownProcess = function ( data ) {\n\t// Parent method\n\treturn OO.ui.ProcessDialog.parent.prototype.getTeardownProcess.call( this, data )\n\t\t.first( function () {\n\t\t\t// Make sure to hide errors\n\t\t\tthis.hideErrors();\n\t\t\tthis.fitOnOpen = false;\n\t\t}, this );\n};\n","/**\n * @class OO.ui\n */\n\n/**\n * Lazy-initialize and return a global OO.ui.WindowManager instance, used by OO.ui.alert and\n * OO.ui.confirm.\n *\n * @private\n * @return {OO.ui.WindowManager}\n */\nOO.ui.getWindowManager = function () {\n\tif ( !OO.ui.windowManager ) {\n\t\tOO.ui.windowManager = new OO.ui.WindowManager();\n\t\t$( 'body' ).append( OO.ui.windowManager.$element );\n\t\tOO.ui.windowManager.addWindows( [ new OO.ui.MessageDialog() ] );\n\t}\n\treturn OO.ui.windowManager;\n};\n\n/**\n * Display a quick modal alert dialog, using a OO.ui.MessageDialog. While the dialog is open, the\n * rest of the page will be dimmed out and the user won't be able to interact with it. The dialog\n * has only one action button, labelled \"OK\", clicking it will simply close the dialog.\n *\n * A window manager is created automatically when this function is called for the first time.\n *\n *     @example\n *     OO.ui.alert( 'Something happened!' ).done( function () {\n *         console.log( 'User closed the dialog.' );\n *     } );\n *\n *     OO.ui.alert( 'Something larger happened!', { size: 'large' } );\n *\n * @param {jQuery|string} text Message text to display\n * @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess\n * @return {jQuery.Promise} Promise resolved when the user closes the dialog\n */\nOO.ui.alert = function ( text, options ) {\n\treturn OO.ui.getWindowManager().openWindow( 'message', $.extend( {\n\t\tmessage: text,\n\t\tactions: [ OO.ui.MessageDialog.static.actions[ 0 ] ]\n\t}, options ) ).then( function ( opened ) {\n\t\treturn opened.then( function ( closing ) {\n\t\t\treturn closing.then( function () {\n\t\t\t\treturn $.Deferred().resolve();\n\t\t\t} );\n\t\t} );\n\t} );\n};\n\n/**\n * Display a quick modal confirmation dialog, using a OO.ui.MessageDialog. While the dialog is open,\n * the rest of the page will be dimmed out and the user won't be able to interact with it. The\n * dialog has two action buttons, one to confirm an operation (labelled \"OK\") and one to cancel it\n * (labelled \"Cancel\").\n *\n * A window manager is created automatically when this function is called for the first time.\n *\n *     @example\n *     OO.ui.confirm( 'Are you sure?' ).done( function ( confirmed ) {\n *         if ( confirmed ) {\n *             console.log( 'User clicked \"OK\"!' );\n *         } else {\n *             console.log( 'User clicked \"Cancel\" or closed the dialog.' );\n *         }\n *     } );\n *\n * @param {jQuery|string} text Message text to display\n * @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess\n * @return {jQuery.Promise} Promise resolved when the user closes the dialog. If the user chose to\n *  confirm, the promise will resolve to boolean `true`; otherwise, it will resolve to boolean\n *  `false`.\n */\nOO.ui.confirm = function ( text, options ) {\n\treturn OO.ui.getWindowManager().openWindow( 'message', $.extend( {\n\t\tmessage: text\n\t}, options ) ).then( function ( opened ) {\n\t\treturn opened.then( function ( closing ) {\n\t\t\treturn closing.then( function ( data ) {\n\t\t\t\treturn $.Deferred().resolve( !!( data && data.action === 'accept' ) );\n\t\t\t} );\n\t\t} );\n\t} );\n};\n\n/**\n * Display a quick modal prompt dialog, using a OO.ui.MessageDialog. While the dialog is open,\n * the rest of the page will be dimmed out and the user won't be able to interact with it. The\n * dialog has a text input widget and two action buttons, one to confirm an operation (labelled \"OK\")\n * and one to cancel it (labelled \"Cancel\").\n *\n * A window manager is created automatically when this function is called for the first time.\n *\n *     @example\n *     OO.ui.prompt( 'Choose a line to go to', { textInput: { placeholder: 'Line number' } } ).done( function ( result ) {\n *         if ( result !== null ) {\n *             console.log( 'User typed \"' + result + '\" then clicked \"OK\".' );\n *         } else {\n *             console.log( 'User clicked \"Cancel\" or closed the dialog.' );\n *         }\n *     } );\n *\n * @param {jQuery|string} text Message text to display\n * @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess\n * @param {Object} [options.textInput] Additional options for text input widget, see OO.ui.TextInputWidget\n * @return {jQuery.Promise} Promise resolved when the user closes the dialog. If the user chose to\n *  confirm, the promise will resolve with the value of the text input widget; otherwise, it will\n *  resolve to `null`.\n */\nOO.ui.prompt = function ( text, options ) {\n\tvar manager = OO.ui.getWindowManager(),\n\t\ttextInput = new OO.ui.TextInputWidget( ( options && options.textInput ) || {} ),\n\t\ttextField = new OO.ui.FieldLayout( textInput, {\n\t\t\talign: 'top',\n\t\t\tlabel: text\n\t\t} );\n\n\t// TODO: This is a little hacky, and could be done by extending MessageDialog instead.\n\n\treturn manager.openWindow( 'message', $.extend( {\n\t\tmessage: textField.$element\n\t}, options ) ).then( function ( opened ) {\n\t\t// After ready\n\t\ttextInput.on( 'enter', function () {\n\t\t\tmanager.getCurrentWindow().close( { action: 'accept' } );\n\t\t} );\n\t\ttextInput.focus();\n\t\treturn opened.then( function ( closing ) {\n\t\t\treturn closing.then( function ( data ) {\n\t\t\t\treturn $.Deferred().resolve( data && data.action === 'accept' ? textInput.getValue() : null );\n\t\t\t} );\n\t\t} );\n\t} );\n};\n","}( OO ) );\n"]}
\ No newline at end of file
index 892b8db..c3977eb 100644 (file)
@@ -2,17 +2,20 @@
        "prefix": "oo-ui-icon",
        "intro": "@import '../../../../src/styles/common';",
        "images": {
+               "alert": { "file": "images/icons/alert.svg" },
                "bell": { "file": "images/icons/bell.svg" },
                "bellOn": { "file": {
                        "ltr": "images/icons/bellOn-ltr.svg",
                        "rtl": "images/icons/bellOn-rtl.svg"
                } },
+               "comment": { "file": "images/icons/comment.svg" },
                "eye": { "file": "images/icons/eye.svg" },
                "eyeClosed": { "file": "images/icons/eyeClosed.svg" },
                "message": { "file": {
                        "ltr": "images/icons/message-ltr.svg",
                        "rtl": "images/icons/message-rtl.svg"
                } },
+               "notice": { "file": "images/icons/notice.svg" },
                "signature": { "file": {
                        "ltr": "images/icons/signature-ltr.svg",
                        "rtl": "images/icons/signature-rtl.svg"
index 394ec85..a9db33f 100644 (file)
                        "ltr": "images/icons/articleRedirect-ltr.svg",
                        "rtl": "images/icons/articleRedirect-rtl.svg"
                } },
+               "history": { "file": "images/icons/history.svg" },
+               "info": { "file": "images/icons/info.svg" },
+               "journal": { "file": {
+                       "ltr": "images/icons/journal-ltr.svg",
+                       "rtl": "images/icons/journal-rtl.svg"
+               } },
+               "tag": { "file": "images/icons/tag.svg" },
                "upload": { "file": {
                        "ltr": "images/icons/upload-ltr.svg",
                        "rtl": "images/icons/upload-rtl.svg"
-               } }
+               } },
+               "window": { "file": "images/icons/window.svg" }
        }
 }
index ec755a1..ea2e2ec 100644 (file)
@@ -56,6 +56,7 @@
                        "rtl": "images/icons/articleRedirect-rtl.svg"
                } },
                "searchCaseSensitive": { "file": "images/icons/case-sensitive.svg" },
+               "searchDiacritics": { "file": "images/icons/diacritic.svg" },
                "searchRegularExpression": { "file": "images/icons/regular-expression.svg" },
                "specialCharacter": { "file": "images/icons/specialCharacter.svg" },
                "table": { "file": "images/icons/table.svg" },
index 5b35e74..718f9ff 100644 (file)
                                "os": "images/icons/bold-cyrl-be.svg"
                        }
                } },
+               "highlight": { "file": {
+                       "ltr": "images/icons/highlight-ltr.svg",
+                       "rtl": "images/icons/highlight-rtl.svg"
+               } },
                "italic": { "file": {
                        "default": "images/icons/italic-a.svg",
                        "lang": {
index 449cb77..64651fc 100644 (file)
@@ -1,15 +1,9 @@
 {
        "prefix": "oo-ui-icon",
        "intro": "@import '../../../../src/styles/common';",
-       "variants": {
-               "invert": {
-                       "color": "#FFFFFF",
-                       "global": true
-               }
-       },
        "images": {
-               "beta": { "file": "images/icons/beta.svg" },
-               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
+               "add": { "file": "images/icons/add.svg" },
+               "advanced": { "file": "images/icons/advanced.svg" },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
                        "ltr": "images/icons/browser-ltr.svg",
                        "rtl": "images/icons/browser-rtl.svg"
                } },
+               "cancel": { "file": "images/icons/cancel.svg" },
+               "check": { "file": "images/icons/check.svg" },
                "clear": { "file": "images/icons/clear.svg" },
                "clock": { "file": "images/icons/clock.svg" },
+               "close": { "file": "images/icons/close.svg" },
+               "ellipsis": { "file": "images/icons/ellipsis.svg" },
+               "feedback": { "file": {
+                       "ltr": "images/icons/feedback-ltr.svg",
+                       "rtl": "images/icons/feedback-rtl.svg"
+               } },
                "funnel": { "file": {
                        "ltr": "images/icons/funnel-ltr.svg",
                        "rtl": "images/icons/funnel-rtl.svg"
                } },
                "heart": { "file": "images/icons/heart.svg" },
+               "help": { "file": {
+                       "ltr": "images/icons/help-ltr.svg",
+                       "rtl": "images/icons/help-rtl.svg",
+                       "lang": {
+                               "he,yi": "images/icons/help-ltr.svg"
+                       }
+               } },
                "key": { "file": {
                        "ltr": "images/icons/key-ltr.svg",
                        "rtl": "images/icons/key-rtl.svg"
                        "ltr": "images/icons/printer-ltr.svg",
                        "rtl": "images/icons/printer-rtl.svg"
                } },
-               "ribbonPrize": { "file": "images/icons/ribbonPrize.svg" },
+               "search": { "file": {
+                       "ltr": "images/icons/search-ltr.svg",
+                       "rtl": "images/icons/search-rtl.svg"
+                       }
+               },
+               "settings": { "file": "images/icons/settings.svg" },
+               "subtract": { "file": "images/icons/subtract.svg" },
                "sun": { "file": {
                        "ltr": "images/icons/sun-ltr.svg",
                        "rtl": "images/icons/sun-rtl.svg"
diff --git a/resources/lib/oojs-ui/themes/apex/icons-layout.json b/resources/lib/oojs-ui/themes/apex/icons-layout.json
new file mode 100644 (file)
index 0000000..173b284
--- /dev/null
@@ -0,0 +1,25 @@
+{
+       "prefix": "oo-ui-icon",
+       "intro": "@import '../../../../src/styles/common';",
+       "images": {
+               "menu": { "file": "images/icons/menu.svg" },
+               "stripeFlow": { "file": {
+                       "ltr": "images/icons/stripeFlow-ltr.svg",
+                       "rtl": "images/icons/stripeFlow-rtl.svg"
+               } },
+               "stripeSideMenu": { "file": "images/icons/stripeSideMenu.svg" },
+               "stripeSummary": { "file": {
+                       "ltr": "images/icons/stripeSummary-ltr.svg",
+                       "rtl": "images/icons/stripeSummary-rtl.svg"
+               } },
+               "stripeToC": { "file": {
+                       "ltr": "images/icons/stripeToC-ltr.svg",
+                       "rtl": "images/icons/stripeToC-rtl.svg"
+               } },
+               "viewCompact": { "file": "images/icons/viewCompact.svg" },
+               "viewDetails": { "file": {
+                       "ltr": "images/icons/viewDetails-ltr.svg",
+                       "rtl": "images/icons/viewDetails-rtl.svg"
+               } }
+       }
+}
index 15c0251..6e6cde3 100644 (file)
@@ -3,22 +3,16 @@
        "intro": "@import '../../../../src/styles/common';",
        "images": {
                "block": { "file": "images/icons/block.svg" },
-               "blockUndo": { "file": {
-                       "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"
                } },
+               "clip": { "file": "images/icons/clip.svg" },
+               "unClip": { "file": "images/icons/unClip.svg" },
                "flag": { "file": {
                        "ltr": "images/icons/flag-ltr.svg",
                        "rtl": "images/icons/flag-rtl.svg"
                } },
-               "flagUndo": { "file": {
-                       "ltr": "images/icons/unFlag-ltr.svg",
-                       "rtl": "images/icons/unFlag-rtl.svg"
-               } },
                "unFlag": { "file": {
                        "ltr": "images/icons/unFlag-ltr.svg",
                        "rtl": "images/icons/unFlag-rtl.svg"
                        "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"
-               } },
+               "pushPin": { "file": "images/icons/pushPin.svg" },
                "ongoingConversation": {
                        "file": {
                                "ltr": "images/icons/ongoingConversation-ltr.svg",
index 9aa1b80..ca49d20 100644 (file)
                        "ltr": "images/icons/arrow-rtl.svg",
                        "rtl": "images/icons/arrow-ltr.svg"
                } },
-               "caretNext": { "file": {
-                       "ltr": "images/icons/caret-rtl.svg",
-                       "rtl": "images/icons/caret-ltr.svg"
-               } },
-               "caretLast": { "file": {
-                       "ltr": "images/icons/caret-ltr.svg",
-                       "rtl": "images/icons/caret-rtl.svg"
-               } },
-               "caretDown": { "file": "images/icons/caretDown.svg" },
-               "caretUp": { "file": "images/icons/caretUp.svg" },
+               "caretNext": {
+                       "file": {
+                               "ltr": "images/icons/move-rtl.svg",
+                               "rtl": "images/icons/move-ltr.svg"
+                       },
+                       "deprecated": "Replaced since v0.21.3, use 'next' instead."
+               },
+               "caretLast": {
+                       "file": {
+                               "ltr": "images/icons/move-ltr.svg",
+                               "rtl": "images/icons/move-rtl.svg"
+                       },
+                       "deprecated": "Replaced since v0.21.3, use 'previous' instead."
+               },
+               "caretDown": { "file": "images/icons/expand.svg", "deprecated": "Replaced since v0.21.3, use 'expand' instead." },
+               "caretUp": { "file": "images/icons/collapse.svg", "deprecated": "Replaced since v0.21.3, use 'collapse' instead." },
+               "collapse": { "file": "images/icons/collapse.svg" },
                "downTriangle": { "file": "images/icons/downTriangle.svg" },
+               "expand": { "file": "images/icons/expand.svg" },
                "move": { "file": "images/icons/move.svg" },
+               "next": { "file": {
+                       "ltr": "images/icons/move-ltr.svg",
+                       "rtl": "images/icons/move-rtl.svg"
+                       }
+               },
+               "previous": { "file": {
+                       "ltr": "images/icons/move-rtl.svg",
+                       "rtl": "images/icons/move-ltr.svg"
+                       }
+               },
+               "last": { "file": {
+                       "ltr": "images/icons/move-end-ltr.svg",
+                       "rtl": "images/icons/move-end-rtl.svg"
+                       }
+               },
+               "first": { "file": {
+                       "ltr": "images/icons/move-end-rtl.svg",
+                       "rtl": "images/icons/move-end-ltr.svg"
+                       }
+               },
                "upTriangle": { "file": "images/icons/upTriangle.svg" }
        }
 }
index b5fbbed..c0ccb36 100644 (file)
@@ -2,49 +2,63 @@
        "prefix": "oo-ui-icon",
        "intro": "@import '../../../../src/styles/common';",
        "images": {
-               "add": { "file": "images/icons/add.svg" },
-               "advanced": { "file": "images/icons/advanced.svg" },
-               "alert": { "file": "images/icons/alert.svg" },
-               "cancel": { "file": "images/icons/cancel.svg" },
-               "check": { "file": "images/icons/check.svg" },
-               "circle": { "file": "images/icons/circle.svg" },
-               "close": { "file": "images/icons/close.svg" },
-               "code": { "file": "images/icons/code.svg" },
-               "collapse": { "file": "images/icons/collapse.svg" },
-               "comment": { "file": "images/icons/comment.svg" },
-               "ellipsis": { "file": "images/icons/ellipsis.svg" },
-               "expand": { "file": "images/icons/expand.svg" },
+               "add": { "file": "images/icons/add.svg", "deprecated": "Moved since v0.19.5, use from the 'interactions' pack instead." },
+               "advanced": { "file": "images/icons/advanced.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "alert": { "file": "images/icons/alert.svg", "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
+               "cancel": { "file": "images/icons/cancel.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "check": { "file": "images/icons/check.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "circle": { "file": "images/icons/circle.svg", "deprecated": "Deprecated since v0.20.1, do not use." },
+               "close": { "file": "images/icons/close.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "code": { "file": "images/icons/code.svg", "deprecated": "Moved since v0.16.2, use from the 'editing-advanced' pack instead." },
+               "collapse": { "file": "images/icons/collapse.svg", "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead." },
+               "comment": { "file": "images/icons/comment.svg", "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
+               "ellipsis": { "file": "images/icons/ellipsis.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "expand": { "file": "images/icons/expand.svg", "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead." },
                "help": { "file": {
                        "ltr": "images/icons/help-ltr.svg",
                        "rtl": "images/icons/help-rtl.svg",
                        "lang": {
                                "he,yi": "images/icons/help-ltr.svg"
-                       }
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead."
                } },
-               "history": { "file": "images/icons/history.svg" },
-               "info": { "file": "images/icons/info.svg" },
-               "menu": { "file": "images/icons/menu.svg" },
+               "history": { "file": "images/icons/history.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
+               "info": { "file": "images/icons/info.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
+               "menu": { "file": "images/icons/menu.svg", "deprecated": "Moved since v0.20.1, use from the 'layout' pack instead." },
                "next": { "file": {
                        "ltr": "images/icons/move-ltr.svg",
                        "rtl": "images/icons/move-rtl.svg"
-               } },
-               "notice": { "file": "images/icons/notice.svg" },
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead."
+               },
+               "notice": { "file": "images/icons/notice.svg", "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
                "previous": { "file": {
                        "ltr": "images/icons/move-rtl.svg",
                        "rtl": "images/icons/move-ltr.svg"
-               } },
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead."
+               },
                "redo": { "file": {
                        "ltr": "images/icons/arched-arrow-ltr.svg",
                        "rtl": "images/icons/arched-arrow-rtl.svg"
-               } },
-               "remove": { "file": "images/icons/trash.svg" },
-               "search": { "file": "images/icons/search.svg" },
-               "settings": { "file": "images/icons/settings.svg" },
-               "tag": { "file": "images/icons/tag.svg" },
+                       },
+                       "deprecated": "Moved since v0.16.2, use from the 'editing-core' pack instead."
+               },
+               "remove": { "file": "images/icons/trash.svg", "deprecated": "Replaced since v0.14.0, use 'trash' from the 'moderation' pack instead." },
+               "search": { "file": {
+                       "ltr": "images/icons/search-ltr.svg",
+                       "rtl": "images/icons/search-rtl.svg"
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead."
+               },
+               "settings": { "file": "images/icons/settings.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "tag": { "file": "images/icons/tag.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
                "undo": { "file": {
                        "ltr": "images/icons/arched-arrow-rtl.svg",
                        "rtl": "images/icons/arched-arrow-ltr.svg"
-               } },
-               "window": { "file": "images/icons/window.svg" }
+                       },
+                       "deprecated": "Moved since v0.16.2, use from the 'editing-core' pack instead."
+               },
+               "window": { "file": "images/icons/window.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." }
        }
 }
index 9dd3404..c194497 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?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="M11 12h4V7h-4v5zm-5 2h9v-1H6v1zm0 2h9v-1H6v1zm0 2h9v-1H6v1zm4-9H6v1h4V9zm0 2H6v1h4v-1zm0-4H6v1h4V7zM4 5h13v16H7c-1.7 0-3-1.3-3-3V5z"/>
     <path d="M18 4v14h2V2H7v2" fill-rule="evenodd"/>
index b57dae2..40a9348 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?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="M13 12H9V7h4v5zm5 2H9v-1h9v1zm0 2H9v-1h9v1zm0 2H9v-1h9v1zm-4-9h4v1h-4V9zm0 2h4v1h-4v-1zm0-4h4v1h-4V7zm6-2H7v16h10c1.7 0 3-1.3 3-3V5z"/>
     <path d="M6 4v14H4V2h13v2" fill-rule="evenodd"/>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png
deleted file mode 100644 (file)
index c3b26b8..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg
deleted file mode 100644 (file)
index a140a5a..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"><g fill="#FFFFFF">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta.png b/resources/lib/oojs-ui/themes/apex/images/icons/beta.png
deleted file mode 100644 (file)
index 7b31e1e..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/beta.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta.svg b/resources/lib/oojs-ui/themes/apex/images/icons/beta.svg
deleted file mode 100644 (file)
index 51a5c78..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="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png
deleted file mode 100644 (file)
index 084cbc7..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.svg
deleted file mode 100644 (file)
index 8098166..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"><g fill="#FFFFFF">
-    <path d="M15 5H8c-1.1 0-2 .9-2 2v3h3v11l4-3 4 3V7c0-1.1-.9-2-2-2zM9 9H7V7c0-.6.4-1 1-1h1v3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png
deleted file mode 100644 (file)
index 125fb74..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.svg
deleted file mode 100644 (file)
index bc3ef4e..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"><g fill="#FFFFFF">
-    <path d="M8 5h7c1.1 0 2 .9 2 2v3h-3v11l-4-3-4 3V7c0-1.1.9-2 2-2zm6 4h2V7c0-.6-.4-1-1-1h-1v3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png
deleted file mode 100644 (file)
index 027df2d..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.svg
deleted file mode 100644 (file)
index 792b4aa..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"><g fill="#FFFFFF">
-    <path d="M3 6v11c0 1.7 1.3 3 3 3h15V6H3zm2.5 1C6.3 7 7 7.7 7 8.5S6.3 10 5.5 10 4 9.3 4 8.5 4.7 7 5.5 7zM20 19H6c-1.1 0-2-.9-2-2v-6h16v8z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png
deleted file mode 100644 (file)
index 51937b7..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.svg
deleted file mode 100644 (file)
index 079a62c..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"><g fill="#FFFFFF">
-    <path d="M21 6v11c0 1.7-1.3 3-3 3H3V6h18zm-2.5 1c-.8 0-1.5.7-1.5 1.5s.7 1.5 1.5 1.5S20 9.3 20 8.5 19.3 7 18.5 7zM4 19h14c1.1 0 2-.9 2-2v-6H4v8z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/caret-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/caret-ltr.png
deleted file mode 100644 (file)
index e95caf2..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/caret-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/caret-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/caret-ltr.svg
deleted file mode 100644 (file)
index 44d2d1a..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 13.1l8.9 8.9c.8-.8.8-2 0-2.8l-6.1-6.1 6-6.1c.8-.8.8-2 0-2.8L7 13.1z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/caret-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/caret-rtl.png
deleted file mode 100644 (file)
index e59bdd5..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/caret-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/caret-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/caret-rtl.svg
deleted file mode 100644 (file)
index 1f90f5c..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="M16.5 13.1L7.6 22c-.8-.8-.8-2 0-2.8l6.1-6.1-6-6.1c-.8-.8-.8-2 0-2.8l8.8 8.9z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/caretDown.png b/resources/lib/oojs-ui/themes/apex/images/icons/caretDown.png
deleted file mode 100644 (file)
index a46ffdb..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/caretDown.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/caretDown.svg b/resources/lib/oojs-ui/themes/apex/images/icons/caretDown.svg
deleted file mode 100644 (file)
index 89e0612..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="M12 16l8.9-8.9c-.8-.8-2-.8-2.8 0L12 13.2l-6.1-6c-.8-.8-2-.8-2.8 0L12 16z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/caretUp.png b/resources/lib/oojs-ui/themes/apex/images/icons/caretUp.png
deleted file mode 100644 (file)
index 9e5c022..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/caretUp.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/caretUp.svg b/resources/lib/oojs-ui/themes/apex/images/icons/caretUp.svg
deleted file mode 100644 (file)
index fcf4e13..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="M12 6.5l8.9 8.9c-.8.8-2 .8-2.8 0L12 9.3l-6.1 6c-.8.8-2 .8-2.8 0L12 6.5z"/>
-</svg>
index 46cd9b0..749e38f 100644 (file)
@@ -1,6 +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">
-    <g id="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png
deleted file mode 100644 (file)
index ec90ed9..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.svg
deleted file mode 100644 (file)
index 09df1d3..0000000
+++ /dev/null
@@ -1,6 +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"><g fill="#FFFFFF">
-    <g id="clear">
-        <path id="circle-with-cross" d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 11l-1 1-3-3-3 3-1-1 3-3-3-3 1-1 3 3 3-3 1 1-3 3 3 3z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clip.png b/resources/lib/oojs-ui/themes/apex/images/icons/clip.png
new file mode 100644 (file)
index 0000000..ac25483
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/clip.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clip.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clip.svg
new file mode 100644 (file)
index 0000000..86d1dbf
--- /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.5 4.5v13.2L12 13.5l-5.5 4.2V4.5zM5 21l7-6 7 6V3H5z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png
deleted file mode 100644 (file)
index fdd3e51..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.svg
deleted file mode 100644 (file)
index c11e11e..0000000
+++ /dev/null
@@ -1,7 +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"><g fill="#FFFFFF">
-    <g id="clock">
-        <path id="circle" d="M12 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm0 1.25a5.75 5.75 0 0 1 0 11.5 5.75 5.75 0 0 1 0-11.5z"/>
-        <path id="hands" d="M15.605 14.08s-1.674-1.36-2.81-2.15c.504-1.683 1.194-4.605 1.194-4.605s-3.057 3.765-3.427 4.703c-.325.82 1.024 1.55 1.647 1.178 1.335.387 3.394.873 3.394.873z"/>
-    </g>
-</g></svg>
index d058d65..b379e18 100644 (file)
@@ -1,6 +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">
-    <g id="close">
-        <path id="cross" d="M17.717 7.697l-1.414-1.414L12 10.586 7.697 6.283 6.283 7.697 10.586 12l-4.303 4.303 1.414 1.414L12 13.414l4.303 4.303 1.414-1.414L13.414 12z"/>
-    </g>
+  <path d="M17.717 7.697l-1.414-1.414L12 10.586 7.697 6.283 6.283 7.697 10.586 12l-4.303 4.303 1.414 1.414L12 13.414l4.303 4.303 1.414-1.414L13.414 12z"/>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png
new file mode 100644 (file)
index 0000000..2359b19
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg b/resources/lib/oojs-ui/themes/apex/images/icons/diacritic.svg
new file mode 100644 (file)
index 0000000..4565101
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png
new file mode 100644 (file)
index 0000000..ac5787b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr.svg
new file mode 100644 (file)
index 0000000..0fdeed9
--- /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="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png
new file mode 100644 (file)
index 0000000..fdbe5e1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl.svg
new file mode 100644 (file)
index 0000000..022d86d
--- /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.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png
deleted file mode 100644 (file)
index 2949648..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.svg
deleted file mode 100644 (file)
index d533779..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"><g fill="#FFFFFF">
-    <path d="M11 13L5 6h15l-6 7v7c-1.7 0-3-1.3-3-3v-4z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png
deleted file mode 100644 (file)
index c0f155a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.svg
deleted file mode 100644 (file)
index f99e338..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"><g fill="#FFFFFF">
-    <path d="M14 13l6-7H5l6 7v7c1.7 0 3-1.3 3-3v-4z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png
deleted file mode 100644 (file)
index 2070997..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.svg
deleted file mode 100644 (file)
index ab9e536..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"><g fill="#FFFFFF">
-    <path d="M15 7c-2 0-3 2-3 2s-1-2-3-2c-2.5 0-4 2-4 4 0 4 5 5 7 8 2-3 7-4 7-8 0-2-1.5-4-4-4z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.png
new file mode 100644 (file)
index 0000000..73dd6b9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-ltr.svg
new file mode 100644 (file)
index 0000000..eb42923
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+    <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png
new file mode 100644 (file)
index 0000000..2ea2983
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/highlight-rtl.svg
new file mode 100644 (file)
index 0000000..9b1940e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+    <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png
new file mode 100644 (file)
index 0000000..2af4eb0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/journal-ltr.svg
new file mode 100644 (file)
index 0000000..8a83e41
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+  <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png
new file mode 100644 (file)
index 0000000..033ede1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/journal-rtl.svg
new file mode 100644 (file)
index 0000000..2a07a44
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+  <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png
deleted file mode 100644 (file)
index 265da14..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.svg
deleted file mode 100644 (file)
index 454f6a9..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"><g fill="#FFFFFF">
-    <path d="M14.5 4C11.5 4 9 6.5 9 9.5c0 1 .3 1.9.7 2.8L4 18v2h4v-2h2v-2h2l1.2-1.2c.4.1.9.2 1.3.2 3 0 5.5-2.5 5.5-5.5S17.5 4 14.5 4zM16 9c-.8 0-1.5-.7-1.5-1.5S15.2 6 16 6s1.5.7 1.5 1.5S16.8 9 16 9z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png
deleted file mode 100644 (file)
index a5f2904..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.svg
deleted file mode 100644 (file)
index 6b7fd63..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"><g fill="#FFFFFF">
-    <path d="M9.5 4c3 0 5.5 2.5 5.5 5.5 0 1-.3 1.9-.7 2.8L20 18v2h-4v-2h-2v-2h-2l-1.2-1.2c-.4.1-.9.2-1.3.2-3 0-5.5-2.5-5.5-5.5S6.5 4 9.5 4zM8 9c.8 0 1.5-.7 1.5-1.5S8.8 6 8 6s-1.5.7-1.5 1.5S7.2 9 8 9z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png
deleted file mode 100644 (file)
index d7d1a0b..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.svg
deleted file mode 100644 (file)
index d137db6..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"><g fill="#FFFFFF">
-    <path d="M3 7v9c0 1.7 1.3 3 3 3h15V7H3zm8 2h2v2h-2V9zm0 3h2v2h-2v-2zM8 9h2v2H8V9zm0 3h2v2H8v-2zm-1 5H6c-.6 0-1-.4-1-1v-1h2v2zm0-3H5v-2h2v2zm0-3H5V9h2v2zm9 6H8v-2h8v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2zm3 6h-2v-2h2v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png
deleted file mode 100644 (file)
index 1b0275e..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.svg
deleted file mode 100644 (file)
index 792025b..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"><g fill="#FFFFFF">
-    <path d="M21 7v9c0 1.7-1.3 3-3 3H3V7h18zm-8 2h-2v2h2V9zm0 3h-2v2h2v-2zm3-3h-2v2h2V9zm0 3h-2v2h2v-2zm1 5h1c.6 0 1-.4 1-1v-1h-2v2zm0-3h2v-2h-2v2zm0-3h2V9h-2v2zm-9 6h8v-2H8v2zm0-3h2v-2H8v2zm0-3h2V9H8v2zm-3 6h2v-2H5v2zm0-3h2v-2H5v2zm0-3h2V9H5v2z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png
deleted file mode 100644 (file)
index fb1bb0c..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.svg
deleted file mode 100644 (file)
index 14f148a..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"><g fill="#FFFFFF">
-    <path d="M15 14v3l5-4.5L15 8v3H8c0 1.7 1.3 3 3 3h4zm-1-9H4v15h10v-2H6V7h8V5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png
deleted file mode 100644 (file)
index dcd2f15..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.svg
deleted file mode 100644 (file)
index e3ce38b..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"><g fill="#FFFFFF">
-    <path d="M9 14v3l-5-4.5L9 8v3h7c0 1.7-1.3 3-3 3H9zm1-9h10v15H10v-2h8V7h-8V5z"/>
-</g></svg>
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
deleted file mode 100644 (file)
index 0963538..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png and /dev/null 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
deleted file mode 100644 (file)
index 971ac48..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"><g fill="#FFFFFF">
-    <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"/>
-</g></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
deleted file mode 100644 (file)
index 6d3c067..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png and /dev/null 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
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/move-end-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/move-end-ltr.png
new file mode 100644 (file)
index 0000000..9d35b9e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/move-end-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-end-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/move-end-ltr.svg
new file mode 100644 (file)
index 0000000..98adcf7
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="move-end-ltr">
+        <path id="arrow" d="M7.935 7.18l5.302 5.303-5.302 5.303L9.35 19.2l6.715-6.717L9.35 5.767z"/>
+        <path id="bar" d="M16 7h2v11h-2z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-end-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/move-end-rtl.png
new file mode 100644 (file)
index 0000000..bcd8a0c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/move-end-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/move-end-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/move-end-rtl.svg
new file mode 100644 (file)
index 0000000..5f9d60d
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="move-end-ltr">
+        <path id="arrow" d="M16.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.72 6.714 6.71z"/>
+        <path id="bar" d="M6 7h2v11H6z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png
deleted file mode 100644 (file)
index 5e432b0..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.svg
deleted file mode 100644 (file)
index f7a92e0..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"><g fill="#FFFFFF">
-    <path d="M12 5l2.5 2.5L11 11c-1.2 1.2-1.2 2.8 0 4l5.5-5.5L19 12V5h-7zm5 12H8c-.6 0-1-.4-1-1V7h3L8 5H5v11c0 1.7 1.3 3 3 3h11v-3l-2-2v3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png
deleted file mode 100644 (file)
index f9a742e..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.svg
deleted file mode 100644 (file)
index ef51a66..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"><g fill="#FFFFFF">
-    <path d="M12 5L9.5 7.5 13 11c1.2 1.2 1.2 2.8 0 4L7.5 9.5 5 12V5h7zM7 17h9c.6 0 1-.4 1-1V7h-3l2-2h3v11c0 1.7-1.3 3-3 3H5v-3l2-2v3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png
deleted file mode 100644 (file)
index ca07bcc..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.svg
deleted file mode 100644 (file)
index 1442004..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"><g fill="#FFFFFF">
-    <path d="M18 8h-1V4H7v4H3v6c0 1.7 1.3 3 3 3h1v3h10v-3h4v-6c0-1.7-1.3-3-3-3zM8 5h8v3H8V5zm8 14H8v-6h8v6z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png
deleted file mode 100644 (file)
index 95ef54a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.svg
deleted file mode 100644 (file)
index 0d1cd83..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"><g fill="#FFFFFF">
-    <path d="M6 8h1V4h10v4h4v6c0 1.7-1.3 3-3 3h-1v3H7v-3H3v-6c0-1.7 1.3-3 3-3zm10-3H8v3h8V5zM8 19h8v-6H8v6z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/pushPin.png b/resources/lib/oojs-ui/themes/apex/images/icons/pushPin.png
new file mode 100644 (file)
index 0000000..27d49e2
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/pushPin.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/pushPin.svg b/resources/lib/oojs-ui/themes/apex/images/icons/pushPin.svg
new file mode 100644 (file)
index 0000000..b852cd0
--- /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.445 12.225c-.813-.935-1.775-.739-2.883-1.768-.55-.511-.498-2.36-.498-2.36s-.041-1.836.524-2.401c.39-.39 1.076-.49 1.475-.883a.973.973 0 0 0 .217-.317c.007-.013.014-.023.018-.035.035-.092.054-.2.064-.316.003-.03.017-.055.017-.085 0-.005-.003-.01-.004-.015.001-.008.004-.014.004-.022 0-.02-.015-.03-.017-.048a1.052 1.052 0 0 0-1.043-.974H8.681c-.555 0-.997.43-1.043.974-.002.018-.017.028-.017.048 0 .008.003.014.003.022 0 .006-.003.01-.003.015 0 .03.014.055.017.085.01.116.029.224.064.316.004.012.012.022.018.035a.965.965 0 0 0 .217.317c.399.393 1.084.493 1.475.883.565.565.523 2.401.523 2.401s.053 1.849-.497 2.36c-1.108 1.03-2.07.833-2.883 1.768C5.979 12.887 6 14 6 14h5.333v4.578L12 21l.668-2.422V14H18s.02-1.113-.555-1.775z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png
deleted file mode 100644 (file)
index 46a180d..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg
deleted file mode 100644 (file)
index 578f12b..0000000
+++ /dev/null
@@ -1,5 +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"><g fill="#FFFFFF">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png
deleted file mode 100644 (file)
index 1010574..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg
deleted file mode 100644 (file)
index 45df8b7..0000000
+++ /dev/null
@@ -1,5 +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">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.png
new file mode 100644 (file)
index 0000000..e8e99f8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.svg
new file mode 100644 (file)
index 0000000..ebc654a
--- /dev/null
@@ -0,0 +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">
+    <g id="search">
+        <path id="magnifying-glass" d="M10.5 4a6.5 6.5 0 1 0 2.844 12.344L16 19c1.4 1.4 2.5 1.5 4 0l-4.438-4.438A6.426 6.426 0 0 0 17 10.5 6.5 6.5 0 0 0 10.5 4zm0 2a4.5 4.5 0 1 1 0 9 4.5 4.5 0 0 1 0-9z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.png
new file mode 100644 (file)
index 0000000..3ab96be
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.svg
new file mode 100644 (file)
index 0000000..c51d4cb
--- /dev/null
@@ -0,0 +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">
+    <g id="search">
+        <path id="magnifying-glass" d="M13.5 4a6.5 6.5 0 1 1-2.844 12.344L8 19c-1.4 1.4-2.5 1.5-4 0l4.438-4.438A6.426 6.426 0 0 1 7 10.5 6.5 6.5 0 0 1 13.5 4zm0 2a4.5 4.5 0 1 0 0 9 4.5 4.5 0 0 0 0-9z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search.png b/resources/lib/oojs-ui/themes/apex/images/icons/search.png
deleted file mode 100644 (file)
index 7b47539..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/search.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search.svg b/resources/lib/oojs-ui/themes/apex/images/icons/search.svg
deleted file mode 100644 (file)
index 823ebf2..0000000
+++ /dev/null
@@ -1,6 +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">
-    <g id="search">
-        <path id="magnifying-glass" d="M18.87 18.375l-3.987-3.99-.286-.17a5.774 5.774 0 0 0 1.082-3.372C15.67 7.616 13.06 5 9.84 5A5.843 5.843 0 0 0 4 10.844a5.84 5.84 0 0 0 5.842 5.842c1.26 0 2.423-.403 3.377-1.08l.16.286 3.99 3.987c.32.31.91.24 1.33-.18.41-.42.49-1.01.17-1.33zM9.837 14.56a3.72 3.72 0 0 1-3.718-3.717c0-2.05 1.67-3.72 3.72-3.72s3.72 1.668 3.72 3.72a3.722 3.722 0 0 1-3.72 3.718z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.png
new file mode 100644 (file)
index 0000000..5423b36
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.svg
new file mode 100644 (file)
index 0000000..2112bb2
--- /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 9h12v2H4V9zm0 3h8v2H4v-2zm0-7h16v3H4V5zm16 14H4v-3h16v3z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.png
new file mode 100644 (file)
index 0000000..0ff3d7c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.svg
new file mode 100644 (file)
index 0000000..39790a9
--- /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 9H8v2h12V9zm0 3h-8v2h8v-2zm0-7H4v3h16V5zM4 19h16v-3H4v3z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.png
new file mode 100644 (file)
index 0000000..e031527
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.svg
new file mode 100644 (file)
index 0000000..e63a7d5
--- /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 19H4v-2h16v2zM20 15H4v-2h16v2zM20 11H4V9h16v2z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.png
new file mode 100644 (file)
index 0000000..ce15bd8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.svg
new file mode 100644 (file)
index 0000000..767d6cd
--- /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 11H4V9h16v2zM4 12h8v2H4v-2z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.png
new file mode 100644 (file)
index 0000000..82ca2bf
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.svg
new file mode 100644 (file)
index 0000000..4d16337
--- /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 11h16V9H4v2zm16 1h-8v2h8v-2z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.png
new file mode 100644 (file)
index 0000000..b482d3e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.svg
new file mode 100644 (file)
index 0000000..d7c202e
--- /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 13H4v-3h13v3zm-5 6H4v-3h8v3zM4 7V4h16v3H4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.png
new file mode 100644 (file)
index 0000000..516bc2c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.svg
new file mode 100644 (file)
index 0000000..0859be6
--- /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 13h13v-3H7v3zm5 6h8v-3h-8v3zm8-12V4H4v3h16z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract.png b/resources/lib/oojs-ui/themes/apex/images/icons/subtract.png
new file mode 100644 (file)
index 0000000..bd719cb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/subtract.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract.svg b/resources/lib/oojs-ui/themes/apex/images/icons/subtract.svg
new file mode 100644 (file)
index 0000000..a79f0b5
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M18 13H6v-2h12"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png
deleted file mode 100644 (file)
index 2bc944a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg
deleted file mode 100644 (file)
index f533999..0000000
+++ /dev/null
@@ -1,5 +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"><g fill="#FFFFFF">
-    <path d="M18.1 5.1c0 .3-.1.6-.3.9l-1.4 1.4-.9-.8 2.2-2.2c.3.1.4.4.4.7zm-.5 5.3h3.2c0 .3-.1.6-.4.9s-.5.4-.8.4h-2v-1.3zm-6.2-5V2.2c.3 0 .6.1.9.4s.4.5.4.8v2h-1.3zm6.4 11.7c-.3 0-.6-.1-.8-.3l-1.4-1.4.8-.8 2.2 2.2c-.2.2-.5.3-.8.3zM6.2 4.9c.3 0 .6.1.8.3l1.4 1.4-.8.9-2.2-2.3c.2-.2.5-.3.8-.3zm5.2 11.7h1.2v3.2c-.3 0-.6-.1-.9-.4s-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9s.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8s.1-.6.3-.8z"/>
-    <circle cx="12" cy="11" r="4"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png
deleted file mode 100644 (file)
index 7ac54ff..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg
deleted file mode 100644 (file)
index 0e19566..0000000
+++ /dev/null
@@ -1,5 +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"><g fill="#FFFFFF">
-    <path d="M5.9 5.1c0 .3.1.6.3.9l1.4 1.4.9-.8-2.2-2.2c-.3.1-.4.4-.4.7zm.5 5.3H3.2c0 .3.1.6.4.9.3.3.5.4.8.4h2v-1.3zm6.2-5V2.2c-.3 0-.6.1-.9.4-.3.3-.4.5-.4.8v2h1.3zM6.2 17.1c.3 0 .6-.1.8-.3l1.4-1.4-.8-.8-2.2 2.2c.2.2.5.3.8.3zM17.8 4.9c-.3 0-.6.1-.8.3l-1.4 1.4.8.9 2.2-2.3c-.2-.2-.5-.3-.8-.3zm-5.2 11.7h-1.2v3.2c.3 0 .6-.1.9-.4.3-.3.4-.5.4-.8l-.1-2zm7-6.2h-2v1.2h3.2c0-.3-.1-.6-.4-.9-.3-.3-.5-.3-.8-.3zM17.8 16l-1.4-1.4-.8.8 2.2 2.2c.2-.2.3-.5.3-.8 0-.3-.1-.6-.3-.8z"/>
-    <circle cx="12" cy="11" r="4" transform="matrix(-1 0 0 1 24 0)"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unClip.png b/resources/lib/oojs-ui/themes/apex/images/icons/unClip.png
new file mode 100644 (file)
index 0000000..37916ef
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/unClip.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/unClip.svg b/resources/lib/oojs-ui/themes/apex/images/icons/unClip.svg
new file mode 100644 (file)
index 0000000..68459db
--- /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="M5 21l7-6 7 6V3H5z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.png b/resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.png
new file mode 100644 (file)
index 0000000..13fe420
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.svg b/resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.svg
new file mode 100644 (file)
index 0000000..d96a2e3
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="viewCompact">
+        <circle cx="6" cy="6" r="2"/>
+        <circle cx="12" cy="6" r="2"/>
+        <circle cx="18" cy="6" r="2"/>
+        <circle cx="6" cy="12" r="2"/>
+        <circle cx="12" cy="12" r="2"/>
+        <circle cx="18" cy="12" r="2"/>
+        <circle cx="6" cy="18" r="2"/>
+        <circle cx="12" cy="18" r="2"/>
+        <circle cx="18" cy="18" r="2"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.png
new file mode 100644 (file)
index 0000000..4341f0e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.svg
new file mode 100644 (file)
index 0000000..1a5092a
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="viewDetails">
+        <circle cx="5.5" cy="8.5" r="2.5"/>
+        <path d="M10 6h12v1H10zm0 2h9v1h-9zm0 2h4v1h-4z"/>
+        <circle cx="5.5" cy="16.5" r="2.5"/>
+        <path d="M10 14h12v1H10zm0 2h9v1h-9zm0 2h4v1h-4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.png
new file mode 100644 (file)
index 0000000..338294c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.svg
new file mode 100644 (file)
index 0000000..f43b05f
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="viewDetails">
+        <circle cx="18.5" cy="8.5" r="2.5"/>
+        <path d="M14 6H2v1h12zm0 2H5v1h9zm0 2h-4v1h4z"/>
+        <circle cx="18.5" cy="16.5" r="2.5"/>
+        <path d="M14 14H2v1h12zm0 2H5v1h9zm0 2h-4v1h4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png
deleted file mode 100644 (file)
index 7018968..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.svg
deleted file mode 100644 (file)
index a6d466a..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"><g fill="#FFFFFF">
-    <path d="M13 14h5v1h-5v-1zm0 3h5v-1h-5v1zm0 1h5v1h-5v-1zm-1-5v3l-5 3 1-6-4-3 6-1 2-5s1.9 5 2 5l6 1-4 3h-4z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png
deleted file mode 100644 (file)
index 28008b5..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.svg
deleted file mode 100644 (file)
index 61a2866..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"><g fill="#FFFFFF">
-    <path d="M11 14H6v1h5v-1zm0 3H6v-1h5v1zm0 1H6v1h5v-1zm1-5v3l5 3-1-6 4-3-6-1-2-5s-1.9 5-2 5l-6 1 4 3h4z"/>
-</g></svg>
index e6fa863..c169b56 100644 (file)
                }
        },
        "images": {
+               "alert": { "file": "images/icons/alert.svg", "variants": [ "warning" ] },
                "bell": { "file": "images/icons/bell.svg" },
                "bellOn": { "file": {
                        "ltr": "images/icons/bellOn-ltr.svg",
                        "rtl": "images/icons/bellOn-rtl.svg"
                } },
+               "comment": { "file": "images/icons/comment.svg" },
                "eye": { "file": "images/icons/eye.svg" },
                "eyeClosed": { "file": "images/icons/eyeClosed.svg" },
                "message": { "file": {
                        "ltr": "images/icons/message-ltr.svg",
                        "rtl": "images/icons/message-rtl.svg"
                } },
+               "notice": { "file": "images/icons/notice.svg" },
                "signature": { "file": {
                        "ltr": "images/icons/signature-ltr.svg",
                        "rtl": "images/icons/signature-rtl.svg"
index 80bbcaf..e952108 100644 (file)
@@ -62,6 +62,8 @@
                        "ltr": "images/icons/folderPlaceholder-ltr.svg",
                        "rtl": "images/icons/folderPlaceholder-rtl.svg"
                } },
+               "history": { "file": "images/icons/history.svg" },
+               "info": { "file": "images/icons/info.svg" },
                "journal": { "file": {
                        "ltr": "images/icons/journal-ltr.svg",
                        "rtl": "images/icons/journal-rtl.svg"
                        "ltr": "images/icons/newspaper-ltr.svg",
                        "rtl": "images/icons/newspaper-rtl.svg"
                } },
+               "tag": { "file": "images/icons/tag.svg", "variants": [ "destructive", "warning", "constructive" ] },
                "upload": { "file": {
                        "ltr": "images/icons/upload-ltr.svg",
                        "rtl": "images/icons/upload-rtl.svg"
-               } }
+               } },
+               "window": { "file": "images/icons/window.svg" }
        }
 }
index 21efb82..7cbbced 100644 (file)
@@ -76,6 +76,7 @@
                        "rtl": "images/icons/articleRedirect-rtl.svg"
                } },
                "searchCaseSensitive": { "file": "images/icons/case-sensitive.svg" },
+               "searchDiacritics": { "file": "images/icons/diacritic.svg" },
                "searchRegularExpression": { "file": "images/icons/regular-expression.svg" },
                "specialCharacter": { "file": "images/icons/specialCharacter.svg" },
                "table": { "file": "images/icons/table.svg" },
index c97d770..85e47ee 100644 (file)
                                "os": "images/icons/bold-cyrl-be.svg"
                        }
                } },
+               "highlight": { "file": {
+                       "ltr": "images/icons/highlight-ltr.svg",
+                       "rtl": "images/icons/highlight-rtl.svg"
+               } },
                "italic": { "file": {
                        "default": "images/icons/italic-a.svg",
                        "lang": {
index e040ffb..668173f 100644 (file)
@@ -22,8 +22,8 @@
                }
        },
        "images": {
-               "beta": { "file": "images/icons/beta.svg" },
-               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg" },
+               "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ] },
+               "advanced": { "file": "images/icons/advanced.svg" },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
                        "ltr": "images/icons/browser-ltr.svg",
                        "rtl": "images/icons/browser-rtl.svg"
                } },
+               "cancel": { "file": "images/icons/cancel.svg", "variants": [ "destructive" ] },
+               "check": { "file": "images/icons/check.svg", "variants": [ "constructive", "progressive", "destructive" ] },
                "clear": { "file": "images/icons/clear.svg" },
                "clock": { "file": "images/icons/clock.svg" },
+               "close": { "file": "images/icons/close.svg" },
+               "ellipsis": { "file": "images/icons/ellipsis.svg" },
+               "feedback": {
+                       "file": {
+                               "ltr": "images/icons/feedback-ltr.svg",
+                               "rtl": "images/icons/feedback-rtl.svg"
+                       },
+                       "variants": [ "progressive" ]
+               },
                "funnel": { "file": {
                        "ltr": "images/icons/funnel-ltr.svg",
                        "rtl": "images/icons/funnel-rtl.svg"
                } },
                "heart": { "file": "images/icons/heart.svg" },
+               "help": { "file": {
+                       "ltr": "images/icons/help-ltr.svg",
+                       "rtl": "images/icons/help-rtl.svg",
+                       "lang": {
+                               "he,yi": "images/icons/help-ltr.svg"
+                       }
+               } },
                "key": { "file": {
                        "ltr": "images/icons/key-ltr.svg",
                        "rtl": "images/icons/key-rtl.svg"
                        "ltr": "images/icons/printer-ltr.svg",
                        "rtl": "images/icons/printer-rtl.svg"
                } },
-               "ribbonPrize": { "file": "images/icons/ribbonPrize.svg" },
+               "search": { "file": {
+                       "ltr": "images/icons/search-ltr.svg",
+                       "rtl": "images/icons/search-rtl.svg"
+                       }
+               },
+               "settings": { "file": "images/icons/settings.svg" },
+               "subtract": { "file": "images/icons/subtract.svg" },
                "sun": { "file": {
                        "ltr": "images/icons/sun-ltr.svg",
                        "rtl": "images/icons/sun-rtl.svg"
index 6ff4a0e..f720a25 100644 (file)
@@ -22,6 +22,7 @@
                }
        },
        "images": {
+               "menu": { "file": "images/icons/menu.svg" },
                "stripeFlow": { "file": {
                        "ltr": "images/icons/stripeFlow-ltr.svg",
                        "rtl": "images/icons/stripeFlow-rtl.svg"
index 7098f23..58feb23 100644 (file)
                        "ltr": "images/icons/mapPinAdd-ltr.svg",
                        "rtl": "images/icons/mapPinAdd-rtl.svg"
                } },
+               "mapTrail": { "file": {
+                       "ltr": "images/icons/mapTrail-ltr.svg",
+                       "rtl": "images/icons/mapTrail-rtl.svg"
+               } },
                "wikitrail": { "file": {
-                       "ltr": "images/icons/wikitrail-ltr.svg",
-                       "rtl": "images/icons/wikitrail-rtl.svg"
-               } }
+                       "ltr": "images/icons/mapTrail-ltr.svg",
+                       "rtl": "images/icons/mapTrail-rtl.svg"
+               }, "deprecated": "Renamed to 'mapTrail' since v0.20.1."
+               }
        }
 }
index 6a47267..554b82b 100644 (file)
        },
        "images": {
                "block": { "file": "images/icons/block.svg", "variants": [ "destructive" ] },
-               "blockUndo": { "file": {
-                       "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"
                } },
+               "clip": { "file": "images/icons/clip.svg", "variants": [ "progressive" ] },
+               "unClip": { "file": "images/icons/unClip.svg", "variants": [ "progressive" ] },
                "flag": { "file": {
                        "ltr": "images/icons/flag-ltr.svg",
                        "rtl": "images/icons/flag-rtl.svg"
                        "ltr": "images/icons/unFlag-ltr.svg",
                        "rtl": "images/icons/unFlag-rtl.svg"
                } },
-               "flagUndo": { "file": {
-                       "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"
                        "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"
-               } },
+               "pushPin": { "file": "images/icons/pushPin.svg", "variants": [ "progressive" ] },
                "ongoingConversation": {
                        "file": {
                                "ltr": "images/icons/ongoingConversation-ltr.svg",
index 059073f..9eafbe3 100644 (file)
                        "ltr": "images/icons/arrow-rtl.svg",
                        "rtl": "images/icons/arrow-ltr.svg"
                } },
-               "caretNext": { "file": {
-                       "ltr": "images/icons/caret-rtl.svg",
-                       "rtl": "images/icons/caret-ltr.svg"
-               } },
-               "caretLast": { "file": {
-                       "ltr": "images/icons/caret-ltr.svg",
-                       "rtl": "images/icons/caret-rtl.svg"
-               } },
-               "caretDown": { "file": "images/icons/caretDown.svg" },
-               "caretUp": { "file": "images/icons/caretUp.svg" },
+               "caretNext": {
+                       "file": {
+                               "ltr": "images/icons/move-rtl.svg",
+                               "rtl": "images/icons/move-ltr.svg"
+                       },
+                       "deprecated": "Replaced since v0.21.3, use 'next' instead."
+               },
+               "caretLast": {
+                       "file": {
+                               "ltr": "images/icons/move-ltr.svg",
+                               "rtl": "images/icons/move-rtl.svg"
+                       },
+                       "deprecated": "Replaced since v0.21.3, use 'previous' instead."
+               },
+               "caretDown": { "file": "images/icons/expand.svg", "deprecated": "Replaced since v0.21.3, use 'expand' instead." },
+               "caretUp": { "file": "images/icons/collapse.svg", "deprecated": "Replaced since v0.21.3, use 'collapse' instead." },
+               "collapse": { "file": "images/icons/collapse.svg" },
                "downTriangle": { "file": "images/icons/downTriangle.svg" },
+               "expand": { "file": "images/icons/expand.svg" },
                "move": { "file": "images/icons/move.svg" },
+               "next": { "file": {
+                       "ltr": "images/icons/move-ltr.svg",
+                       "rtl": "images/icons/move-rtl.svg"
+                       }
+               },
+               "previous": { "file": {
+                       "ltr": "images/icons/move-rtl.svg",
+                       "rtl": "images/icons/move-ltr.svg"
+                       }
+               },
+               "last": { "file": {
+                       "ltr": "images/icons/move-end-ltr.svg",
+                       "rtl": "images/icons/move-end-rtl.svg"
+                       }
+               },
+               "first": { "file": {
+                       "ltr": "images/icons/move-end-rtl.svg",
+                       "rtl": "images/icons/move-end-ltr.svg"
+                       }
+               },
                "upTriangle": { "file": "images/icons/upTriangle.svg" }
        }
 }
index 14f6b18..3bdecff 100644 (file)
                "progressive": {
                        "color": "#36c",
                        "global": true
-               },
-               "constructive": {
-                       "color": "#36c"
-               },
-               "destructive": {
-                       "color": "#d33"
-               },
-               "warning": {
-                       "color": "#ff5d00"
                }
        },
        "images": {
index 4666fd1..958e7e3 100644 (file)
                }
        },
        "images": {
-               "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ] },
-               "advanced": { "file": "images/icons/advanced.svg" },
-               "alert": { "file": "images/icons/alert.svg", "variants": [ "warning" ] },
-               "cancel": { "file": "images/icons/cancel.svg", "variants": [ "destructive" ] },
-               "check": { "file": "images/icons/check.svg", "variants": [ "constructive", "progressive", "destructive" ] },
-               "circle": { "file": "images/icons/circle.svg", "variants": [ "constructive", "progressive" ] },
-               "close": { "file": {
-                       "ltr": "images/icons/close-ltr.svg",
-                       "rtl": "images/icons/close-rtl.svg"
-               } },
-               "code": { "file": "images/icons/code.svg" },
-               "collapse": { "file": "images/icons/collapse.svg" },
-               "comment": { "file": "images/icons/comment.svg" },
-               "ellipsis": { "file": "images/icons/ellipsis.svg" },
-               "expand": { "file": "images/icons/expand.svg" },
+               "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ], "deprecated": "Moved since v0.19.5, use from the 'interactions' pack instead." },
+               "advanced": { "file": "images/icons/advanced.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "alert": { "file": "images/icons/alert.svg", "variants": [ "warning" ], "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
+               "cancel": { "file": "images/icons/cancel.svg", "variants": [ "destructive" ], "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "check": { "file": "images/icons/check.svg", "variants": [ "constructive", "progressive", "destructive" ], "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+       "circle": { "file": "images/icons/circle.svg", "variants": [ "constructive", "progressive" ], "deprecated": "Deprecated since v0.20.1, do not use." },
+               "close": { "file": "images/icons/close.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "code": { "file": "images/icons/code.svg", "deprecated": "Moved since v0.16.2, use from the 'editing-advanced' pack instead." },
+               "collapse": { "file": "images/icons/collapse.svg", "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead." },
+               "comment": { "file": "images/icons/comment.svg", "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
+               "ellipsis": { "file": "images/icons/ellipsis.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "expand": { "file": "images/icons/expand.svg", "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead." },
                "help": { "file": {
                        "ltr": "images/icons/help-ltr.svg",
                        "rtl": "images/icons/help-rtl.svg",
                        "lang": {
                                "he,yi": "images/icons/help-ltr.svg"
-                       }
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead."
                } },
-               "history": { "file": "images/icons/history.svg" },
-               "info": { "file": "images/icons/info.svg" },
-               "menu": { "file": "images/icons/menu.svg" },
+               "history": { "file": "images/icons/history.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
+               "info": { "file": "images/icons/info.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
+               "menu": { "file": "images/icons/menu.svg", "deprecated": "Moved since v0.20.1, use from the 'layout' pack instead." },
                "next": { "file": {
                        "ltr": "images/icons/move-ltr.svg",
                        "rtl": "images/icons/move-rtl.svg"
-               } },
-               "notice": { "file": "images/icons/notice.svg" },
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead."
+               },
+               "notice": { "file": "images/icons/notice.svg", "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
                "previous": { "file": {
                        "ltr": "images/icons/move-rtl.svg",
                        "rtl": "images/icons/move-ltr.svg"
-               } },
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead."
+               },
                "redo": { "file": {
                        "ltr": "images/icons/arched-arrow-ltr.svg",
                        "rtl": "images/icons/arched-arrow-rtl.svg"
-               } },
-               "remove": { "file": "images/icons/trash.svg", "variants": [ "destructive" ] },
+                       },
+                       "deprecated": "Moved since v0.16.2, use from the 'editing-core' pack instead."
+               },
+               "remove": { "file": "images/icons/trash.svg", "variants": [ "destructive" ], "deprecated": "Replaced since v0.14.0, use 'trash' from the 'moderation' pack instead." },
                "search": { "file": {
                        "ltr": "images/icons/search-ltr.svg",
                        "rtl": "images/icons/search-rtl.svg"
-               } },
-               "settings": { "file": "images/icons/settings.svg" },
-               "tag": { "file": "images/icons/tag.svg", "variants": [ "destructive", "warning", "constructive" ] },
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead."
+               },
+               "settings": { "file": "images/icons/settings.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "tag": { "file": "images/icons/tag.svg", "variants": [ "destructive", "warning", "constructive" ], "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
                "undo": { "file": {
                        "ltr": "images/icons/arched-arrow-rtl.svg",
                        "rtl": "images/icons/arched-arrow-ltr.svg"
-               } },
-               "window": { "file": "images/icons/window.svg" }
+                       },
+                       "deprecated": "Moved since v0.16.2, use from the 'editing-core' pack instead."
+               },
+               "window": { "file": "images/icons/window.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." }
        }
 }
index 884e55c..86b004f 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M11 12h4V7h-4v5zm-5 2h9v-1H6v1zm0 2h9v-1H6v1zm0 2h9v-1H6v1zm4-9H6v1h4V9zm0 2H6v1h4v-1zm0-4H6v1h4V7zM4 5h13v16H7c-1.7 0-3-1.3-3-3V5z"/>
     <path d="M18 4v14h2V2H7v2" fill-rule="evenodd"/>
index 599aa69..838655b 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M11 12h4V7h-4v5zm-5 2h9v-1H6v1zm0 2h9v-1H6v1zm0 2h9v-1H6v1zm4-9H6v1h4V9zm0 2H6v1h4v-1zm0-4H6v1h4V7zM4 5h13v16H7c-1.7 0-3-1.3-3-3V5z"/>
     <path d="M18 4v14h2V2H7v2" fill-rule="evenodd"/>
index 9dd3404..c194497 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?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="M11 12h4V7h-4v5zm-5 2h9v-1H6v1zm0 2h9v-1H6v1zm0 2h9v-1H6v1zm4-9H6v1h4V9zm0 2H6v1h4v-1zm0-4H6v1h4V7zM4 5h13v16H7c-1.7 0-3-1.3-3-3V5z"/>
     <path d="M18 4v14h2V2H7v2" fill-rule="evenodd"/>
index 64b9181..e2793b5 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
     <path d="M13 12H9V7h4v5zm5 2H9v-1h9v1zm0 2H9v-1h9v1zm0 2H9v-1h9v1zm-4-9h4v1h-4V9zm0 2h4v1h-4v-1zm0-4h4v1h-4V7zm6-2H7v16h10c1.7 0 3-1.3 3-3V5z"/>
     <path d="M6 4v14H4V2h13v2" fill-rule="evenodd"/>
index 18799af..bf3d169 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
     <path d="M13 12H9V7h4v5zm5 2H9v-1h9v1zm0 2H9v-1h9v1zm0 2H9v-1h9v1zm-4-9h4v1h-4V9zm0 2h4v1h-4v-1zm0-4h4v1h-4V7zm6-2H7v16h10c1.7 0 3-1.3 3-3V5z"/>
     <path d="M6 4v14H4V2h13v2" fill-rule="evenodd"/>
index b57dae2..40a9348 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?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="M13 12H9V7h4v5zm5 2H9v-1h9v1zm0 2H9v-1h9v1zm0 2H9v-1h9v1zm-4-9h4v1h-4V9zm0 2h4v1h-4v-1zm0-4h4v1h-4V7zm6-2H7v16h10c1.7 0 3-1.3 3-3V5z"/>
     <path d="M6 4v14H4V2h13v2" fill-rule="evenodd"/>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png
deleted file mode 100644 (file)
index c3b26b8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.svg
deleted file mode 100644 (file)
index eca628f..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"><g fill="#fff">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png
deleted file mode 100644 (file)
index 4c67bac..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.svg
deleted file mode 100644 (file)
index ba896ef..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"><g fill="#36c">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png
deleted file mode 100644 (file)
index 7b31e1e..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.svg
deleted file mode 100644 (file)
index 51a5c78..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="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-invert.png
deleted file mode 100644 (file)
index 0bf8286..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-invert.svg
deleted file mode 100644 (file)
index f4e15cf..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"><g fill="#fff">
-    <path d="M7 13.1l8.9 8.9c.8-.8.8-2 0-2.8l-6.1-6.1 6-6.1c.8-.8.8-2 0-2.8L7 13.1z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-progressive.png
deleted file mode 100644 (file)
index ddb2318..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr-progressive.svg
deleted file mode 100644 (file)
index 0558da7..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"><g fill="#36c">
-    <path d="M7 13.1l8.9 8.9c.8-.8.8-2 0-2.8l-6.1-6.1 6-6.1c.8-.8.8-2 0-2.8L7 13.1z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr.png
deleted file mode 100644 (file)
index e95caf2..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-ltr.svg
deleted file mode 100644 (file)
index 44d2d1a..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 13.1l8.9 8.9c.8-.8.8-2 0-2.8l-6.1-6.1 6-6.1c.8-.8.8-2 0-2.8L7 13.1z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-invert.png
deleted file mode 100644 (file)
index 4a880d3..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-invert.svg
deleted file mode 100644 (file)
index 6a74d9b..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"><g fill="#fff">
-    <path d="M16.5 13.1L7.6 22c-.8-.8-.8-2 0-2.8l6.1-6.1-6-6.1c-.8-.8-.8-2 0-2.8l8.8 8.9z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-progressive.png
deleted file mode 100644 (file)
index b5711f8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl-progressive.svg
deleted file mode 100644 (file)
index 3274959..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"><g fill="#36c">
-    <path d="M16.5 13.1L7.6 22c-.8-.8-.8-2 0-2.8l6.1-6.1-6-6.1c-.8-.8-.8-2 0-2.8l8.8 8.9z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl.png
deleted file mode 100644 (file)
index e59bdd5..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caret-rtl.svg
deleted file mode 100644 (file)
index 1f90f5c..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="M16.5 13.1L7.6 22c-.8-.8-.8-2 0-2.8l6.1-6.1-6-6.1c-.8-.8-.8-2 0-2.8l8.8 8.9z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-invert.png
deleted file mode 100644 (file)
index f3031d9..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-invert.svg
deleted file mode 100644 (file)
index 4d4bf6e..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"><g fill="#fff">
-    <path d="M12 16l8.9-8.9c-.8-.8-2-.8-2.8 0L12 13.2l-6.1-6c-.8-.8-2-.8-2.8 0L12 16z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-progressive.png
deleted file mode 100644 (file)
index b7a6e5a..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown-progressive.svg
deleted file mode 100644 (file)
index e651488..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"><g fill="#36c">
-    <path d="M12 16l8.9-8.9c-.8-.8-2-.8-2.8 0L12 13.2l-6.1-6c-.8-.8-2-.8-2.8 0L12 16z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown.png
deleted file mode 100644 (file)
index a46ffdb..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretDown.svg
deleted file mode 100644 (file)
index 89e0612..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="M12 16l8.9-8.9c-.8-.8-2-.8-2.8 0L12 13.2l-6.1-6c-.8-.8-2-.8-2.8 0L12 16z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-invert.png
deleted file mode 100644 (file)
index 5706cb4..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-invert.svg
deleted file mode 100644 (file)
index 9686715..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"><g fill="#fff">
-    <path d="M12 6.5l8.9 8.9c-.8.8-2 .8-2.8 0L12 9.3l-6.1 6c-.8.8-2 .8-2.8 0L12 6.5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-progressive.png
deleted file mode 100644 (file)
index 285aba6..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp-progressive.svg
deleted file mode 100644 (file)
index 6f1b02d..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"><g fill="#36c">
-    <path d="M12 6.5l8.9 8.9c-.8.8-2 .8-2.8 0L12 9.3l-6.1 6c-.8.8-2 .8-2.8 0L12 6.5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp.png
deleted file mode 100644 (file)
index 9e5c022..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/caretUp.svg
deleted file mode 100644 (file)
index fcf4e13..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="M12 6.5l8.9 8.9c-.8.8-2 .8-2.8 0L12 9.3l-6.1 6c-.8.8-2 .8-2.8 0L12 6.5z"/>
-</svg>
index dbd98d2..e5590a3 100644 (file)
@@ -1,6 +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"><g fill="#fff">
-    <g id="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
index c5f35b0..ff6e102 100644 (file)
@@ -1,6 +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"><g fill="#36c">
-    <g id="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
index 46cd9b0..749e38f 100644 (file)
@@ -1,6 +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">
-    <g id="regular-expression">
+    <g id="case-sensitive">
         <path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
         <path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
     </g>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-invert.png
new file mode 100644 (file)
index 0000000..eab8915
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-invert.svg
new file mode 100644 (file)
index 0000000..14b03f6
--- /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"><g fill="#fff">
+    <path d="M17.5 4.5v13.2L12 13.5l-5.5 4.2V4.5zM5 21l7-6 7 6V3H5z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-progressive.png
new file mode 100644 (file)
index 0000000..633956d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip-progressive.svg
new file mode 100644 (file)
index 0000000..3744540
--- /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"><g fill="#36c">
+    <path d="M17.5 4.5v13.2L12 13.5l-5.5 4.2V4.5zM5 21l7-6 7 6V3H5z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip.png
new file mode 100644 (file)
index 0000000..ac25483
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/clip.svg
new file mode 100644 (file)
index 0000000..86d1dbf
--- /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.5 4.5v13.2L12 13.5l-5.5 4.2V4.5zM5 21l7-6 7 6V3H5z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.png
new file mode 100644 (file)
index 0000000..92af7b6
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-invert.svg
new file mode 100644 (file)
index 0000000..8027fff
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+  <path d="M18 7.6l-1.4-1.4-4.6 4.6-4.6-4.6L6 7.6l4.6 4.6L6 16.8l1.4 1.4 4.6-4.6 4.6 4.6 1.4-1.4-4.6-4.6z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png
deleted file mode 100644 (file)
index a35e9d1..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg
deleted file mode 100644 (file)
index 6de3e30..0000000
+++ /dev/null
@@ -1,6 +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"><g fill="#fff">
-    <g id="close">
-        <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png
deleted file mode 100644 (file)
index 69f0787..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-progressive.svg
deleted file mode 100644 (file)
index 122340e..0000000
+++ /dev/null
@@ -1,6 +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"><g fill="#36c">
-    <g id="close">
-        <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png
deleted file mode 100644 (file)
index b6a42b8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr.svg
deleted file mode 100644 (file)
index c269316..0000000
+++ /dev/null
@@ -1,6 +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">
-    <g id="close">
-        <path id="cross" d="M17.4 8.1c.8-.8.8-2 0-2.8L12 10.8 7.4 6.2 6 7.6l4.6 4.6-4 4c-.8.8-.8 2 0 2.8l5.4-5.4 4.6 4.6 1.4-1.4-4.6-4.6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png
new file mode 100644 (file)
index 0000000..06fcd5d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-progressive.svg
new file mode 100644 (file)
index 0000000..37c960e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+  <path d="M18 7.6l-1.4-1.4-4.6 4.6-4.6-4.6L6 7.6l4.6 4.6L6 16.8l1.4 1.4 4.6-4.6 4.6 4.6 1.4-1.4-4.6-4.6z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png
deleted file mode 100644 (file)
index 16462a2..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg
deleted file mode 100644 (file)
index 67dc06c..0000000
+++ /dev/null
@@ -1,6 +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"><g fill="#fff">
-    <g id="close">
-        <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png
deleted file mode 100644 (file)
index 2c88596..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-progressive.svg
deleted file mode 100644 (file)
index c6494de..0000000
+++ /dev/null
@@ -1,6 +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"><g fill="#36c">
-    <g id="close">
-        <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png
deleted file mode 100644 (file)
index e3e2417..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl.svg
deleted file mode 100644 (file)
index 36e58ec..0000000
+++ /dev/null
@@ -1,6 +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">
-    <g id="close">
-        <path id="cross" d="M6.6 8.1c-.8-.8-.8-2 0-2.8l5.4 5.5 4.6-4.6L18 7.6l-4.6 4.6 4 4c.8.8.8 2 0 2.8L12 13.6l-4.6 4.6L6 16.8l4.6-4.6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png
new file mode 100644 (file)
index 0000000..cdb037a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close.svg
new file mode 100644 (file)
index 0000000..88ffb56
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+  <path d="M18 7.6l-1.4-1.4-4.6 4.6-4.6-4.6L6 7.6l4.6 4.6L6 16.8l1.4 1.4 4.6-4.6 4.6 4.6 1.4-1.4-4.6-4.6z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png
new file mode 100644 (file)
index 0000000..7bb19e3
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-invert.svg
new file mode 100644 (file)
index 0000000..b19dd0d
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png
new file mode 100644 (file)
index 0000000..eb76fd0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic-progressive.svg
new file mode 100644 (file)
index 0000000..fed1164
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png
new file mode 100644 (file)
index 0000000..2359b19
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/diacritic.svg
new file mode 100644 (file)
index 0000000..4565101
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="diacritic">
+      <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+      <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png
new file mode 100644 (file)
index 0000000..f49ebeb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-invert.svg
new file mode 100644 (file)
index 0000000..8ed4be9
--- /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"><g fill="#fff">
+    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png
new file mode 100644 (file)
index 0000000..28405a8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..49425d0
--- /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"><g fill="#36c">
+    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png
new file mode 100644 (file)
index 0000000..ac5787b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-ltr.svg
new file mode 100644 (file)
index 0000000..0fdeed9
--- /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="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png
new file mode 100644 (file)
index 0000000..efba220
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-invert.svg
new file mode 100644 (file)
index 0000000..f4e7932
--- /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"><g fill="#fff">
+    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png
new file mode 100644 (file)
index 0000000..27bcc2d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..413ea34
--- /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"><g fill="#36c">
+    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png
new file mode 100644 (file)
index 0000000..fdbe5e1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/feedback-rtl.svg
new file mode 100644 (file)
index 0000000..022d86d
--- /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.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.png
new file mode 100644 (file)
index 0000000..314d7ac
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-invert.svg
new file mode 100644 (file)
index 0000000..e301dea
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#fff">
+    <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png
new file mode 100644 (file)
index 0000000..14bd7be
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..4cc90b5
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#36c">
+    <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png
new file mode 100644 (file)
index 0000000..73dd6b9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-ltr.svg
new file mode 100644 (file)
index 0000000..eb42923
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+    <path d="M5.066 18.236l.14-.244c.976-1.69 1.341-4.587.815-6.469l-.14-.507.2-.365L11.074 2l9.011 5.203-4.994 8.65-.204.354-.522.134c-1.893.485-4.22 2.252-5.195 3.94l-.14.244-.721-.416-1.041 1.89H3.914l1.893-3.336z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png
new file mode 100644 (file)
index 0000000..024595e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-invert.svg
new file mode 100644 (file)
index 0000000..46d61c2
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#fff">
+    <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png
new file mode 100644 (file)
index 0000000..039ccbe
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..4f3997a
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24"><g fill="#36c">
+    <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png
new file mode 100644 (file)
index 0000000..2ea2983
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/highlight-rtl.svg
new file mode 100644 (file)
index 0000000..9b1940e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24">
+    <path d="M18.934 18.236l-.14-.244c-.976-1.69-1.341-4.587-.815-6.469l.14-.507-.2-.365L12.926 2 3.914 7.203l4.994 8.65.204.354.522.134c1.893.485 4.22 2.252 5.195 3.94l.14.244.721-.416 1.041 1.89h3.355l-1.893-3.336z" fill-rule="evenodd"/>
+</svg>
index e7dc90e..bc2e9cc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-invert.png differ
index e04818f..370d0a3 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
-    <path d="M16 9V8h-6v1h6zm-2 2v-1h-4v1h4zM6 5h1v16H6V5zm2 0h10v13c0 1.7-1.3 3-3 3H8V5z"/>
+  <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
 </g></svg>
index 444d48b..19f17bd 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr-progressive.png differ
index 0232e22..baf8a4a 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
-    <path d="M16 9V8h-6v1h6zm-2 2v-1h-4v1h4zM6 5h1v16H6V5zm2 0h10v13c0 1.7-1.3 3-3 3H8V5z"/>
+  <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
 </g></svg>
index f30b5ff..2af4eb0 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-ltr.png differ
index c9fa553..8a83e41 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M16 9V8h-6v1h6zm-2 2v-1h-4v1h4zM6 5h1v16H6V5zm2 0h10v13c0 1.7-1.3 3-3 3H8V5z"/>
+  <path d="M16 8V7h-6v1h6zm-2 2V9h-4v1h4zM6 4h1v16H6V4zm2 0h10v13c0 1.7-1.3 3-3 3H8V4z"/>
 </svg>
index deb4f76..60b5f47 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-invert.png differ
index 3487511..4660285 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
-    <path d="M8 9V8h6v1H8zm2 2v-1h4v1h-4zm8-6h-1v16h1V5zm-2 0H6v13c0 1.7 1.3 3 3 3h7V5z"/>
+  <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
 </g></svg>
index e5a4fa1..b16badc 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl-progressive.png differ
index f2eb554..17ccb82 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
-    <path d="M8 9V8h6v1H8zm2 2v-1h4v1h-4zm8-6h-1v16h1V5zm-2 0H6v13c0 1.7 1.3 3 3 3h7V5z"/>
+  <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
 </g></svg>
index 7826fa8..033ede1 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/journal-rtl.png differ
index 84da9fa..2a07a44 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M8 9V8h6v1H8zm2 2v-1h4v1h-4zm8-6h-1v16h1V5zm-2 0H6v13c0 1.7 1.3 3 3 3h7V5z"/>
+  <path d="M8 8V7h6v1H8zm2 2V9h4v1h-4zm8-6h-1v16h1V4zm-2 0H6v13c0 1.7 1.3 3 3 3h7V4z"/>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.png
new file mode 100644 (file)
index 0000000..075f84e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.svg
new file mode 100644 (file)
index 0000000..17d3645
--- /dev/null
@@ -0,0 +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"><g fill="#fff">
+    <path d="M15 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.png
new file mode 100644 (file)
index 0000000..2b26e15
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..2b49b99
--- /dev/null
@@ -0,0 +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"><g fill="#36c">
+    <path d="M15 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.png
new file mode 100644 (file)
index 0000000..331fd59
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.svg
new file mode 100644 (file)
index 0000000..cb073b9
--- /dev/null
@@ -0,0 +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="M15 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.png
new file mode 100644 (file)
index 0000000..75c8dcf
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.svg
new file mode 100644 (file)
index 0000000..fbb9cab
--- /dev/null
@@ -0,0 +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"><g fill="#fff">
+    <path d="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.png
new file mode 100644 (file)
index 0000000..fc0b2d9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..a2f62ff
--- /dev/null
@@ -0,0 +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"><g fill="#36c">
+    <path d="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.png
new file mode 100644 (file)
index 0000000..62f1fe9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.svg
new file mode 100644 (file)
index 0000000..e8b1a08
--- /dev/null
@@ -0,0 +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="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-invert.png
new file mode 100644 (file)
index 0000000..43f819f
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-invert.svg
new file mode 100644 (file)
index 0000000..f5b4b22
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <g id="move-end-ltr">
+        <path id="arrow" d="M7.935 7.18l5.302 5.303-5.302 5.303L9.35 19.2l6.715-6.717L9.35 5.767z"/>
+        <path id="bar" d="M16 7h2v11h-2z"/>
+    </g>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-progressive.png
new file mode 100644 (file)
index 0000000..cbbfa79
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..d55fc51
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <g id="move-end-ltr">
+        <path id="arrow" d="M7.935 7.18l5.302 5.303-5.302 5.303L9.35 19.2l6.715-6.717L9.35 5.767z"/>
+        <path id="bar" d="M16 7h2v11h-2z"/>
+    </g>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr.png
new file mode 100644 (file)
index 0000000..9d35b9e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-ltr.svg
new file mode 100644 (file)
index 0000000..98adcf7
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="move-end-ltr">
+        <path id="arrow" d="M7.935 7.18l5.302 5.303-5.302 5.303L9.35 19.2l6.715-6.717L9.35 5.767z"/>
+        <path id="bar" d="M16 7h2v11h-2z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-invert.png
new file mode 100644 (file)
index 0000000..a745af2
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-invert.svg
new file mode 100644 (file)
index 0000000..121b08d
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <g id="move-end-ltr">
+        <path id="arrow" d="M16.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.72 6.714 6.71z"/>
+        <path id="bar" d="M6 7h2v11H6z"/>
+    </g>
+</g></svg>
+
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-progressive.png
new file mode 100644 (file)
index 0000000..b999538
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..11ed934
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <g id="move-end-ltr">
+        <path id="arrow" d="M16.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.72 6.714 6.71z"/>
+        <path id="bar" d="M6 7h2v11H6z"/>
+    </g>
+</g></svg>
+
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl.png
new file mode 100644 (file)
index 0000000..bcd8a0c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-end-rtl.svg
new file mode 100644 (file)
index 0000000..ee09f7c
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="move-end-ltr">
+        <path id="arrow" d="M16.065 17.786l-5.302-5.303 5.302-5.302-1.415-1.41-6.714 6.72 6.714 6.71z"/>
+        <path id="bar" d="M6 7h2v11H6z"/>
+    </g>
+</svg>
+
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-invert.png
new file mode 100644 (file)
index 0000000..10c46ef
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-invert.svg
new file mode 100644 (file)
index 0000000..9bee56b
--- /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"><g fill="#fff">
+    <path d="M17.445 12.225c-.813-.935-1.775-.739-2.883-1.768-.55-.511-.498-2.36-.498-2.36s-.041-1.836.524-2.401c.39-.39 1.076-.49 1.475-.883a.973.973 0 0 0 .217-.317c.007-.013.014-.023.018-.035.035-.092.054-.2.064-.316.003-.03.017-.055.017-.085 0-.005-.003-.01-.004-.015.001-.008.004-.014.004-.022 0-.02-.015-.03-.017-.048a1.052 1.052 0 0 0-1.043-.974H8.681c-.555 0-.997.43-1.043.974-.002.018-.017.028-.017.048 0 .008.003.014.003.022 0 .006-.003.01-.003.015 0 .03.014.055.017.085.01.116.029.224.064.316.004.012.012.022.018.035a.965.965 0 0 0 .217.317c.399.393 1.084.493 1.475.883.565.565.523 2.401.523 2.401s.053 1.849-.497 2.36c-1.108 1.03-2.07.833-2.883 1.768C5.979 12.887 6 14 6 14h5.333v4.578L12 21l.668-2.422V14H18s.02-1.113-.555-1.775z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-progressive.png
new file mode 100644 (file)
index 0000000..ea2ec8c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin-progressive.svg
new file mode 100644 (file)
index 0000000..1cc4d60
--- /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"><g fill="#36c">
+    <path d="M17.445 12.225c-.813-.935-1.775-.739-2.883-1.768-.55-.511-.498-2.36-.498-2.36s-.041-1.836.524-2.401c.39-.39 1.076-.49 1.475-.883a.973.973 0 0 0 .217-.317c.007-.013.014-.023.018-.035.035-.092.054-.2.064-.316.003-.03.017-.055.017-.085 0-.005-.003-.01-.004-.015.001-.008.004-.014.004-.022 0-.02-.015-.03-.017-.048a1.052 1.052 0 0 0-1.043-.974H8.681c-.555 0-.997.43-1.043.974-.002.018-.017.028-.017.048 0 .008.003.014.003.022 0 .006-.003.01-.003.015 0 .03.014.055.017.085.01.116.029.224.064.316.004.012.012.022.018.035a.965.965 0 0 0 .217.317c.399.393 1.084.493 1.475.883.565.565.523 2.401.523 2.401s.053 1.849-.497 2.36c-1.108 1.03-2.07.833-2.883 1.768C5.979 12.887 6 14 6 14h5.333v4.578L12 21l.668-2.422V14H18s.02-1.113-.555-1.775z"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin.png
new file mode 100644 (file)
index 0000000..27d49e2
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/pushPin.svg
new file mode 100644 (file)
index 0000000..b852cd0
--- /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.445 12.225c-.813-.935-1.775-.739-2.883-1.768-.55-.511-.498-2.36-.498-2.36s-.041-1.836.524-2.401c.39-.39 1.076-.49 1.475-.883a.973.973 0 0 0 .217-.317c.007-.013.014-.023.018-.035.035-.092.054-.2.064-.316.003-.03.017-.055.017-.085 0-.005-.003-.01-.004-.015.001-.008.004-.014.004-.022 0-.02-.015-.03-.017-.048a1.052 1.052 0 0 0-1.043-.974H8.681c-.555 0-.997.43-1.043.974-.002.018-.017.028-.017.048 0 .008.003.014.003.022 0 .006-.003.01-.003.015 0 .03.014.055.017.085.01.116.029.224.064.316.004.012.012.022.018.035a.965.965 0 0 0 .217.317c.399.393 1.084.493 1.475.883.565.565.523 2.401.523 2.401s.053 1.849-.497 2.36c-1.108 1.03-2.07.833-2.883 1.768C5.979 12.887 6 14 6 14h5.333v4.578L12 21l.668-2.422V14H18s.02-1.113-.555-1.775z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png
deleted file mode 100644 (file)
index 46a180d..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.svg
deleted file mode 100644 (file)
index 640d263..0000000
+++ /dev/null
@@ -1,5 +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"><g fill="#fff">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png
deleted file mode 100644 (file)
index 79effe1..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.svg
deleted file mode 100644 (file)
index c0aa287..0000000
+++ /dev/null
@@ -1,5 +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"><g fill="#36c">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png
deleted file mode 100644 (file)
index 1010574..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.svg
deleted file mode 100644 (file)
index 45df8b7..0000000
+++ /dev/null
@@ -1,5 +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">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.png
new file mode 100644 (file)
index 0000000..4e58b70
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-invert.svg
new file mode 100644 (file)
index 0000000..d76eb3c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+       <path d="M18 13H6v-2h12"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png
new file mode 100644 (file)
index 0000000..1732972
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract-progressive.svg
new file mode 100644 (file)
index 0000000..24795ac
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+       <path d="M18 13H6v-2h12"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png
new file mode 100644 (file)
index 0000000..bd719cb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/subtract.svg
new file mode 100644 (file)
index 0000000..a79f0b5
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+       <path d="M18 13H6v-2h12"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-invert.png
new file mode 100644 (file)
index 0000000..6535d43
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-invert.svg
new file mode 100644 (file)
index 0000000..dcc4ebf
--- /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"><g fill="#fff">
+    <path d="M5 21l7-6 7 6V3H5z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-progressive.png
new file mode 100644 (file)
index 0000000..6177f6b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip-progressive.svg
new file mode 100644 (file)
index 0000000..92e965b
--- /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"><g fill="#36c">
+    <path d="M5 21l7-6 7 6V3H5z" fill-rule="evenodd"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip.png
new file mode 100644 (file)
index 0000000..37916ef
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/unClip.svg
new file mode 100644 (file)
index 0000000..68459db
--- /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="M5 21l7-6 7 6V3H5z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.png
deleted file mode 100644 (file)
index 075f84e..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.svg
deleted file mode 100644 (file)
index 17d3645..0000000
+++ /dev/null
@@ -1,5 +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"><g fill="#fff">
-    <path d="M15 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.png
deleted file mode 100644 (file)
index 2b26e15..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.svg
deleted file mode 100644 (file)
index 2b49b99..0000000
+++ /dev/null
@@ -1,5 +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"><g fill="#36c">
-    <path d="M15 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.png
deleted file mode 100644 (file)
index 331fd59..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.svg
deleted file mode 100644 (file)
index cb073b9..0000000
+++ /dev/null
@@ -1,5 +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 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.png
deleted file mode 100644 (file)
index 75c8dcf..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.svg
deleted file mode 100644 (file)
index fbb9cab..0000000
+++ /dev/null
@@ -1,5 +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"><g fill="#fff">
-    <path d="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.png
deleted file mode 100644 (file)
index fc0b2d9..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.svg
deleted file mode 100644 (file)
index a2f62ff..0000000
+++ /dev/null
@@ -1,5 +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"><g fill="#36c">
-    <path d="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.png
deleted file mode 100644 (file)
index 62f1fe9..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.svg
deleted file mode 100644 (file)
index e8b1a08..0000000
+++ /dev/null
@@ -1,5 +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="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png
deleted file mode 100644 (file)
index fa85ac3..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.svg
deleted file mode 100644 (file)
index 900e477..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <path d="M6 12A6 6 0 1 1 6 0a6 6 0 0 1 0 12zM5 7h2V2H5zm0 3h2V8H5z" id="alert"/>
-</g></svg>
index 582adce..ae66af4 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-invert.png differ
index e194d0d..b5e6144 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
-    <g id="down">
-        <path id="arrow" d="M1 4h10L6 9 1 4"/>
-    </g>
+       <path d="M11.05 3.996l-.965-1.053-4.035 3.86-3.947-3.86L1.05 3.996l5 5 5-5"/>
 </g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png
deleted file mode 100644 (file)
index 3539c88..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.svg
deleted file mode 100644 (file)
index 511359a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="down">
-        <path id="arrow" d="M1 4h10L6 9 1 4"/>
-    </g>
-</g></svg>
index af67c7a..34f5041 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down.png differ
index f5c76f3..d3e55d1 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="down">
-        <path id="arrow" d="M1 4h10L6 9 1 4"/>
-    </g>
+       <path d="M11.05 3.996l-.965-1.053-4.035 3.86-3.947-3.86L1.05 3.996l5 5 5-5"/>
 </svg>
index 05578be..68bf475 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png differ
index 9e0e569..78f4b51 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
-    <g id="ltr">
-        <path id="arrow" d="M4 1v10l5-5-5-5"/>
-    </g>
+       <path d="M4.026 11l-1.052-.965L6.832 6 2.974 2.053 4.026 1l5 5-5 5"/>
 </g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png
deleted file mode 100644 (file)
index 7d50f19..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.svg
deleted file mode 100644 (file)
index fc6cb9a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="ltr">
-        <path id="arrow" d="M4 1v10l5-5-5-5"/>
-    </g>
-</g></svg>
index d7a4111..cadc38f 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr.png differ
index 059372d..e99855b 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="ltr">
-        <path id="arrow" d="M4 1v10l5-5-5-5"/>
-    </g>
+       <path d="M4.026 11l-1.052-.965L6.832 6 2.974 2.053 4.026 1l5 5-5 5"/>
 </svg>
index 9731658..fae56f1 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-invert.png differ
index d032b05..bc0ff6f 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
-    <g id="rtl">
-        <path id="arrow" d="M8 11V1L3 6l5 5"/>
-    </g>
+       <path d="M7.974 11l1.052-.965L5.168 6l3.858-3.947L7.974 1l-5 5 5 5"/>
 </g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png
deleted file mode 100644 (file)
index 27bfa29..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.svg
deleted file mode 100644 (file)
index 8f1a254..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="rtl">
-        <path id="arrow" d="M8 11V1L3 6l5 5"/>
-    </g>
-</g></svg>
index afceed6..5a4c0b6 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl.png differ
index c6498e8..1647501 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="rtl">
-        <path id="arrow" d="M8 11V1L3 6l5 5"/>
-    </g>
+       <path d="M7.974 11l1.052-.965L5.168 6l3.858-3.947L7.974 1l-5 5 5 5"/>
 </svg>
index 218a700..56eeea4 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-invert.png differ
index 3b79abb..3c81ae5 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#fff">
-    <g id="up">
-        <path id="arrow" d="M1 8h10L6 3 1 8"/>
-    </g>
+       <path d="M11 7.974l-.965 1.052L6 5.168 2.053 9.026 1 7.974l5-5 5 5"/>
 </g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png
deleted file mode 100644 (file)
index 521e438..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.svg
deleted file mode 100644 (file)
index 4e9221a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="up">
-        <path id="arrow" d="M1 8h10L6 3 1 8"/>
-    </g>
-</g></svg>
index ee12d6e..672b7f3 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up.png differ
index 5eada07..ca93281 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
-    <g id="up">
-        <path id="arrow" d="M1 8h10L6 3 1 8"/>
-    </g>
+       <path d="M11 7.974l-.965 1.052L6 5.168 2.053 9.026 1 7.974l5-5 5 5"/>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png
deleted file mode 100644 (file)
index 325dbeb..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.svg
deleted file mode 100644 (file)
index 4ea1013..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="clear">
-        <path id="circle-with-cross" d="M6 0C2.7 0 0 2.7 0 6s2.7 6 6 6 6-2.7 6-6-2.7-6-6-6zM3.5 2.5L6 5l2.5-2.5 1 1L7 6l2.5 2.5-1 1L6 7 3.5 9.5l-1-1L5 6 2.5 3.5z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png
deleted file mode 100644 (file)
index 01e84e6..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.svg
deleted file mode 100644 (file)
index ab95a3d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <path d="M5 1h2v10H5zm4.83 1.634l1 1.732-8.66 5-1-1.732zM1.17 4.366l1-1.732 8.66 5-1 1.732z" id="required"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png
deleted file mode 100644 (file)
index 84c7dbc..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.svg
deleted file mode 100644 (file)
index 5e8e395..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="search">
-        <path id="magnifying-glass" d="M10.37 9.474L7.994 7.1l-.17-.1a3.45 3.45 0 0 0 .644-2.01A3.478 3.478 0 1 0 4.99 8.47c.75 0 1.442-.24 2.01-.648l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27a2.21 2.21 0 1 1 2.21-2.21A2.21 2.21 0 0 1 4.99 7.21z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png
deleted file mode 100644 (file)
index 0207a8b..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.svg
deleted file mode 100644 (file)
index 015d02e..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="search">
-        <path id="magnifying-glass" d="M1.63 9.474L4.006 7.1l.17-.1a3.45 3.45 0 0 1-.644-2.01A3.478 3.478 0 1 1 7.01 8.47 3.43 3.43 0 0 1 5 7.822l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27A2.21 2.21 0 1 0 4.8 4.994 2.21 2.21 0 0 0 7.01 7.21z"/>
-    </g>
-</g></svg>
index 91d0358..1b99365 100644 (file)
@@ -6,19 +6,6 @@
                "invert": {
                        "color": "#fff",
                        "global": true
-               },
-               "progressive": {
-                       "color": "#36c",
-                       "global": true
-               },
-               "constructive": {
-                       "color": "#36c"
-               },
-               "destructive": {
-                       "color": "#d33"
-               },
-               "warning": {
-                       "color": "#ff5d00"
                }
        },
        "images": {
index 3857f99..f93051c 100644 (file)
@@ -1,18 +1,18 @@
 /*!
- * OOjs v1.1.10 optimised for jQuery
+ * OOjs v2.0.0 optimised for jQuery
  * https://www.mediawiki.org/wiki/OOjs
  *
- * Copyright 2011-2015 OOjs Team and other contributors.
+ * Copyright 2011-2017 OOjs Team and other contributors.
  * Released under the MIT license
- * http://oojs.mit-license.org
+ * https://oojs.mit-license.org
  *
- * Date: 2015-11-11T16:49:11Z
+ * Date: 2017-04-05T02:18:04Z
  */
 ( function ( global ) {
 
 'use strict';
 
-/*exported toString */
+/* exported toString */
 var
        /**
         * Namespace for all classes, static methods and static properties.
@@ -22,21 +22,7 @@ var
        oo = {},
        // Optimisation: Local reference to Object.prototype.hasOwnProperty
        hasOwn = oo.hasOwnProperty,
-       toString = oo.toString,
-       // Object.create() is impossible to fully polyfill, so don't require it
-       createObject = Object.create || ( function () {
-               // Reusable constructor function
-               function Empty() {}
-               return function ( prototype, properties ) {
-                       var obj;
-                       Empty.prototype = prototype;
-                       obj = new Empty();
-                       if ( properties && hasOwn.call( properties, 'constructor' ) ) {
-                               obj.constructor = properties.constructor.value;
-                       }
-                       return obj;
-               };
-       } )();
+       toString = oo.toString;
 
 /* Class Methods */
 
@@ -92,8 +78,11 @@ oo.initClass = function ( fn ) {
 oo.inheritClass = function ( targetFn, originFn ) {
        var targetConstructor;
 
+       if ( !originFn ) {
+               throw new Error( 'inheritClass: Origin is not a function (actually ' + originFn + ')' );
+       }
        if ( targetFn.prototype instanceof originFn ) {
-               throw new Error( 'Target already inherits from origin' );
+               throw new Error( 'inheritClass: Target already inherits from origin' );
        }
 
        targetConstructor = targetFn.prototype.constructor;
@@ -102,9 +91,10 @@ oo.inheritClass = function ( targetFn, originFn ) {
        // by IE 8 and below (bug 63303).
        // Provide .parent as alias for code supporting older browsers which
        // allows people to comply with their style guide.
+       // eslint-disable-next-line dot-notation
        targetFn[ 'super' ] = targetFn.parent = originFn;
 
-       targetFn.prototype = createObject( originFn.prototype, {
+       targetFn.prototype = Object.create( originFn.prototype, {
                // Restore constructor property of targetFn
                constructor: {
                        value: targetConstructor,
@@ -116,7 +106,7 @@ oo.inheritClass = function ( targetFn, originFn ) {
 
        // Extend static properties - always initialize both sides
        oo.initClass( originFn );
-       targetFn.static = createObject( originFn.static );
+       targetFn.static = Object.create( originFn.static );
 };
 
 /**
@@ -153,6 +143,10 @@ oo.inheritClass = function ( targetFn, originFn ) {
 oo.mixinClass = function ( targetFn, originFn ) {
        var key;
 
+       if ( !originFn ) {
+               throw new Error( 'mixinClass: Origin is not a function (actually ' + originFn + ')' );
+       }
+
        // Copy prototype properties
        for ( key in originFn.prototype ) {
                if ( key !== 'constructor' && hasOwn.call( originFn.prototype, key ) ) {
@@ -173,13 +167,26 @@ oo.mixinClass = function ( targetFn, originFn ) {
        }
 };
 
+/**
+ * Test whether one class is a subclass of another, without instantiating it.
+ *
+ * Every class is considered a subclass of Object and of itself.
+ *
+ * @param {Function} testFn The class to be tested
+ * @param {Function} baseFn The base class
+ * @return {boolean} Whether testFn is a subclass of baseFn (or equal to it)
+ */
+oo.isSubclass = function ( testFn, baseFn ) {
+       return testFn === baseFn || testFn.prototype instanceof baseFn;
+};
+
 /* Object Methods */
 
 /**
  * Get a deeply nested property of an object using variadic arguments, protecting against
  * undefined property errors.
  *
- * `quux = oo.getProp( obj, 'foo', 'bar', 'baz' );` is equivalent to `quux = obj.foo.bar.baz;`
+ * `quux = OO.getProp( obj, 'foo', 'bar', 'baz' );` is equivalent to `quux = obj.foo.bar.baz;`
  * except that the former protects against JS errors if one of the intermediate properties
  * is undefined. Instead of throwing an error, this function will return undefined in
  * that case.
@@ -218,7 +225,7 @@ oo.getProp = function ( obj ) {
 oo.setProp = function ( obj ) {
        var i,
                prop = obj;
-       if ( Object( obj ) !== obj ) {
+       if ( Object( obj ) !== obj || arguments.length < 2 ) {
                return;
        }
        for ( i = 1; i < arguments.length - 2; i++ ) {
@@ -233,6 +240,34 @@ oo.setProp = function ( obj ) {
        prop[ arguments[ arguments.length - 2 ] ] = arguments[ arguments.length - 1 ];
 };
 
+/**
+ * Delete a deeply nested property of an object using variadic arguments, protecting against
+ * undefined property errors, and deleting resulting empty objects.
+ *
+ * @param {Object} obj
+ * @param {...Mixed} [keys]
+ */
+oo.deleteProp = function ( obj ) {
+       var i,
+               prop = obj,
+               props = [ prop ];
+       if ( Object( obj ) !== obj || arguments.length < 2 ) {
+               return;
+       }
+       for ( i = 1; i < arguments.length - 1; i++ ) {
+               if ( prop[ arguments[ i ] ] === undefined || Object( prop[ arguments[ i ] ] ) !== prop[ arguments[ i ] ] ) {
+                       return;
+               }
+               prop = prop[ arguments[ i ] ];
+               props.push( prop );
+       }
+       delete prop[ arguments[ i ] ];
+       // Walk back through props removing any plain empty objects
+       while ( ( prop = props.pop() ) && oo.isPlainObject( prop ) && !Object.keys( prop ).length ) {
+               delete props[ props.length - 1 ][ arguments[ props.length ] ];
+       }
+};
+
 /**
  * Create a new object that is an instance of the same
  * constructor as the input, inherits from the same object
@@ -258,7 +293,7 @@ oo.setProp = function ( obj ) {
 oo.cloneObject = function ( origin ) {
        var key, r;
 
-       r = createObject( origin.constructor.prototype );
+       r = Object.create( origin.constructor.prototype );
 
        for ( key in origin ) {
                if ( hasOwn.call( origin, key ) ) {
@@ -314,7 +349,7 @@ oo.binarySearch = function ( arr, searchFunc, forInsertion ) {
                right = arr.length;
        while ( left < right ) {
                // Equivalent to Math.floor( ( left + right ) / 2 ) but much faster
-               /*jshint bitwise:false */
+               // eslint-disable-next-line no-bitwise
                mid = ( left + right ) >> 1;
                cmpResult = searchFunc( arr[ mid ] );
                if ( cmpResult < 0 ) {
@@ -479,10 +514,9 @@ oo.getHash.keySortReplacer = function ( key, val ) {
                        normalized[ keys[ i ] ] = val[ keys[ i ] ];
                }
                return normalized;
-
-       // Primitive values and arrays get stable hashes
-       // by default. Lets those be stringified as-is.
        } else {
+               // Primitive values and arrays get stable hashes
+               // by default. Lets those be stringified as-is.
                return val;
        }
 };
@@ -592,11 +626,11 @@ oo.simpleArrayDifference = function ( a, b ) {
        return simpleArrayCombine( a, b, false );
 };
 
-/*global $ */
+/* global $ */
 
 oo.isPlainObject = $.isPlainObject;
 
-/*global hasOwn */
+/* global hasOwn */
 
 ( function () {
 
@@ -1091,7 +1125,18 @@ oo.isPlainObject = $.isPlainObject;
         * Don't call this directly unless you know what you're doing.
         * Use #addItems instead.
         *
-        * @private
+        * This method can be extended in child classes to produce
+        * different behavior when an item is inserted. For example,
+        * inserted items may also be attached to the DOM or may
+        * interact with some other nodes in certain ways. Extending
+        * this method is allowed, but if overriden, the aggregation
+        * of events must be preserved, or behavior of emitted events
+        * will be broken.
+        *
+        * If you are extending this method, please make sure the
+        * parent method is called.
+        *
+        * @protected
         * @param {OO.EventEmitter} item Items to add
         * @param {number} index Index to add items at
         * @return {number} The index the item was added at
@@ -1297,7 +1342,7 @@ oo.SortedEmitterList.prototype.addItems = function ( items ) {
 
                // Insert item at the insertion index
                index = this.insertItem( items[ i ], insertionIndex );
-               this.emit( 'add', items[ i ], insertionIndex );
+               this.emit( 'add', items[ i ], index );
        }
 
        return this;
@@ -1325,7 +1370,7 @@ oo.SortedEmitterList.prototype.findInsertionIndex = function ( item ) {
 
 };
 
-/*global hasOwn */
+/* global hasOwn */
 
 /**
  * @class OO.Registry
@@ -1421,8 +1466,6 @@ oo.Registry.prototype.lookup = function ( name ) {
        }
 };
 
-/*global createObject */
-
 /**
  * @class OO.Factory
  * @extends OO.Registry
@@ -1431,7 +1474,7 @@ oo.Registry.prototype.lookup = function ( name ) {
  */
 oo.Factory = function OoFactory() {
        // Parent constructor
-       oo.Factory.parent.call( this );
+       oo.Factory.super.call( this );
 };
 
 /* Inheritance */
@@ -1468,7 +1511,7 @@ oo.Factory.prototype.register = function ( constructor ) {
        }
 
        // Parent method
-       oo.Factory.parent.prototype.register.call( this, name, constructor );
+       oo.Factory.super.prototype.register.call( this, name, constructor );
 };
 
 /**
@@ -1490,7 +1533,7 @@ oo.Factory.prototype.unregister = function ( constructor ) {
        }
 
        // Parent method
-       oo.Factory.parent.prototype.unregister.call( this, name );
+       oo.Factory.super.prototype.unregister.call( this, name );
 };
 
 /**
@@ -1523,12 +1566,12 @@ oo.Factory.prototype.create = function ( name ) {
        // the constructor's prototype (which also makes it an "instanceof" the constructor),
        // then invoke the constructor with the object as context, and return it (ignoring
        // the constructor's return value).
-       obj = createObject( constructor.prototype );
+       obj = Object.create( constructor.prototype );
        constructor.apply( obj, args );
        return obj;
 };
 
-/*jshint node:true */
+/* eslint-env node */
 if ( typeof module !== 'undefined' && module.exports ) {
        module.exports = oo;
 } else {
diff --git a/resources/src/dom-level2-skip.js b/resources/src/dom-level2-skip.js
deleted file mode 100644 (file)
index 484c295..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Skip function for dom-level2-shim module.
- *
- * Tests for window.Node because that's the only thing that this shim is adding.
- */
-return !!window.Node;
diff --git a/resources/src/es5-skip.js b/resources/src/es5-skip.js
deleted file mode 100644 (file)
index a4039d8..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*!
- * Skip function for es5-shim module.
- *
- * Test for strict mode as a proxy for full ES5 function support (but not syntax)
- * Per http://kangax.github.io/compat-table/es5/ this is a reasonable shortcut
- * that still allows this to be as short as possible (there are no browsers we
- * support that have strict mode, but lack other features).
- *
- * Do explicitly test for Function#bind because of PhantomJS (which implements
- * strict mode, but lacks Function#bind).
- *
- * IE9 supports all features except strict mode, so loading es5-shim should be close to
- * a no-op but does increase page payload).
- */
-return ( function () {
-       'use strict';
-       return !this && !!Function.prototype.bind;
-}() );
diff --git a/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png
deleted file mode 100644 (file)
index 84ed2a2..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png
deleted file mode 100644 (file)
index c212aeb..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png
deleted file mode 100644 (file)
index e6546bf..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png
deleted file mode 100644 (file)
index 2af30b9..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png
deleted file mode 100644 (file)
index 3ad990b..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png
deleted file mode 100644 (file)
index 1d3048e..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png and /dev/null differ
diff --git a/resources/src/jquery/jquery.arrowSteps.css b/resources/src/jquery/jquery.arrowSteps.css
deleted file mode 100644 (file)
index 92c6c43..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-.arrowSteps {
-       list-style-type: none;
-       list-style-image: none;
-       border: 1px solid #666;
-       position: relative;
-}
-
-.arrowSteps li {
-       float: left;
-       padding: 0;
-       margin: 0;
-       border: 0;
-}
-
-.arrowSteps li div {
-       padding: 0.5em;
-       text-align: center;
-       white-space: nowrap;
-       overflow: hidden;
-}
-
-.arrowSteps li.arrow div {
-       /* @embed */
-       background: url( images/jquery.arrowSteps.divider-ltr.png ) no-repeat right center;
-}
-
-/* applied to the element preceding the highlighted step */
-.arrowSteps li.arrow.tail div {
-       /* @embed */
-       background: url( images/jquery.arrowSteps.tail-ltr.png ) no-repeat right center;
-}
-
-/* this applies to all highlighted, including the last */
-.arrowSteps li.head div {
-       /* @embed */
-       background: url( images/jquery.arrowSteps.head-ltr.png ) no-repeat left center;
-       font-weight: bold;
-}
-
-/* this applies to all highlighted arrows except the last */
-.arrowSteps li.arrow.head div {
-       /* TODO: eliminate duplication of jquery.arrowSteps.head.png embedding */
-       /* @embed */
-       background: url( images/jquery.arrowSteps.head-ltr.png ) no-repeat right center;
-}
diff --git a/resources/src/jquery/jquery.arrowSteps.js b/resources/src/jquery/jquery.arrowSteps.js
deleted file mode 100644 (file)
index b0c36c6..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/*!
- * jQuery arrowSteps plugin
- * Copyright Neil Kandalgaonkar, 2010
- *
- * This work is licensed under the terms of the GNU General Public License,
- * version 2 or later.
- * (see http://www.fsf.org/licensing/licenses/gpl.html).
- * Derivative works and later versions of the code must be free software
- * licensed under the same or a compatible license.
- */
-
-/**
- * @class jQuery.plugin.arrowSteps
- */
-( function ( $ ) {
-       /**
-        * Show users their progress through a series of steps, via a row of items that fit
-        * together like arrows. One item can be highlighted at a time.
-        *
-        *     <ul id="robin-hood-daffy">
-        *       <li id="guard"><div>Guard!</div></li>
-        *       <li id="turn"><div>Turn!</div></li>
-        *       <li id="parry"><div>Parry!</div></li>
-        *       <li id="dodge"><div>Dodge!</div></li>
-        *       <li id="spin"><div>Spin!</div></li>
-        *       <li id="ha"><div>Ha!</div></li>
-        *       <li id="thrust"><div>Thrust!</div></li>
-        *     </ul>
-        *
-        *     <script>
-        *       $( '#robin-hood-daffy' ).arrowSteps();
-        *     </script>
-        *
-        * @return {jQuery}
-        * @chainable
-        */
-       $.fn.arrowSteps = function () {
-               var $steps, width, arrowWidth, $stepDiv,
-                       $el = this,
-                       paddingSide = $( 'body' ).hasClass( 'rtl' ) ? 'padding-left' : 'padding-right';
-
-               $el.addClass( 'arrowSteps' );
-               $steps = $el.find( 'li' );
-
-               width = parseInt( 100 / $steps.length, 10 );
-               $steps.css( 'width', width + '%' );
-
-               // Every step except the last one has an arrow pointing forward:
-               // at the right hand side in LTR languages, and at the left hand side in RTL.
-               // Also add in the padding for the calculated arrow width.
-               $stepDiv = $steps.filter( ':not(:last-child)' ).addClass( 'arrow' ).find( 'div' );
-
-               // Execute when complete page is fully loaded, including all frames, objects and images
-               $( window ).on( 'load', function () {
-                       arrowWidth = parseInt( $el.outerHeight(), 10 );
-                       $stepDiv.css( paddingSide, arrowWidth.toString() + 'px' );
-               } );
-
-               $el.data( 'arrowSteps', $steps );
-
-               return this;
-       };
-
-       /**
-        * Highlights the element selected by the selector.
-        *
-        *       $( '#robin-hood-daffy' ).arrowStepsHighlight( '#guard' );
-        *       // 'Guard!' is highlighted.
-        *
-        *       // ... user completes the 'guard' step ...
-        *
-        *       $( '#robin-hood-daffy' ).arrowStepsHighlight( '#turn' );
-        *       // 'Turn!' is highlighted.
-        *
-        * @param {string} selector
-        */
-       $.fn.arrowStepsHighlight = function ( selector ) {
-               var $previous,
-                       $steps = this.data( 'arrowSteps' );
-               $.each( $steps, function ( i, step ) {
-                       var $step = $( step );
-                       if ( $step.is( selector ) ) {
-                               if ( $previous ) {
-                                       $previous.addClass( 'tail' );
-                               }
-                               $step.addClass( 'head' );
-                       } else {
-                               $step.removeClass( 'head tail lasthead' );
-                       }
-                       $previous = $step;
-               } );
-       };
-
-       /**
-        * @class jQuery
-        * @mixins jQuery.plugin.arrowSteps
-        */
-}( jQuery ) );
index 70dc105..847afd4 100644 (file)
@@ -16,7 +16,7 @@
                        color = $.css( elem, attr );
 
                        // Keep going until we find an element that has color, or we hit the body
-                       if ( color !== '' && color !== 'transparent' || $.nodeName( elem, 'body' ) ) {
+                       if ( color !== '' && color !== 'transparent' || elem.nodeName.toLowerCase() === 'body' ) {
                                break;
                        }
 
index c53ec3b..2be1dba 100644 (file)
@@ -26,7 +26,7 @@
                        var result;
 
                        // Check if we're already dealing with an array of colors
-                       if ( color && $.isArray( color ) && color.length === 3 ) {
+                       if ( color && Array.isArray( color ) && color.length === 3 ) {
                                return color;
                        }
 
index 3064b42..e00298f 100644 (file)
@@ -1,41 +1,37 @@
 /**
  * @class jQuery.plugin.getAttrs
  */
+( function ( $ ) {
+       function serializeControls( controls ) {
+               var i,
+                       data = {},
+                       len = controls.length;
 
-function serializeControls( controls ) {
-       var i,
-               data = {},
-               len = controls.length;
+               for ( i = 0; i < len; i++ ) {
+                       data[ controls[ i ].name ] = controls[ i ].value;
+               }
 
-       for ( i = 0; i < len; i++ ) {
-               data[ controls[ i ].name ] = controls[ i ].value;
+               return data;
        }
 
-       return data;
-}
+       /**
+        * Get the attributes of an element directy as a plain object.
+        *
+        * If there is more than one element in the collection, similar to most other jQuery getter methods,
+        * this will use the first element in the collection.
+        *
+        * @return {Object}
+        */
+       $.fn.getAttrs = function () {
+               return serializeControls( this[ 0 ].attributes );
+       };
 
-/**
- * Get the attributes of an element directy as a plain object.
- *
- * If there is more than one element in the collection, similar to most other jQuery getter methods,
- * this will use the first element in the collection.
- *
- * @return {Object}
- */
-jQuery.fn.getAttrs = function () {
-       return serializeControls( this[ 0 ].attributes );
-};
-
-/**
- * Get form data as a plain object mapping form control names to their values.
- *
- * @return {Object}
- */
-jQuery.fn.serializeObject = function () {
-       return serializeControls( this.serializeArray() );
-};
-
-/**
- * @class jQuery
- * @mixins jQuery.plugin.getAttrs
- */
+       /**
+        * Get form data as a plain object mapping form control names to their values.
+        *
+        * @return {Object}
+        */
+       $.fn.serializeObject = function () {
+               return serializeControls( this.serializeArray() );
+       };
+}( jQuery ) );
index eef3846..5ce9b1f 100644 (file)
                if ( $defaultToggle === undefined ) {
                        $defaultToggle = null;
                }
-               if ( $defaultToggle !== null && !$defaultToggle.jquery ) {
-                       // is optional (may be undefined), but if defined it must be an instance of jQuery.
-                       // If it's not, abort right away.
-                       // After this $defaultToggle is either null or a valid jQuery instance.
-                       return;
-               }
 
                // Trigger a custom event to allow callers to hook to the collapsing/expanding,
                // allowing the module to be testable, and making it possible to
                if ( e ) {
                        if (
                                e.type === 'click' &&
-                               options.linksPassthru &&
-                               $.nodeName( e.target, 'a' ) &&
-                               $( e.target ).attr( 'href' ) &&
-                               $( e.target ).attr( 'href' ) !== '#'
+                               e.target.nodeName.toLowerCase() === 'a' &&
+                               $( e.target ).attr( 'href' )
                        ) {
-                               // Don't fire if a link with href !== '#' was clicked, if requested  (for premade togglers by default)
+                               // Don't fire if a link was clicked (for premade togglers)
                                return;
                        } else if ( e.type === 'keypress' && e.which !== 13 && e.which !== 32 ) {
                                // Only handle keypresses on the "Enter" or "Space" keys
                                .toggleClass( 'mw-collapsible-toggle-expanded', wasCollapsed );
                }
 
-               // Toggle the text ("Show"/"Hide"), if requested (for default togglers by default)
+               // Toggle the text ("Show"/"Hide") within elements tagged with mw-collapsible-text
                if ( options.toggleText ) {
                        collapseText = options.toggleText.collapseText;
                        expandText = options.toggleText.expandText;
 
-                       $textContainer = $toggle.find( '> a' );
-                       if ( !$textContainer.length ) {
-                               $textContainer = $toggle;
+                       $textContainer = $collapsible.find( '.mw-collapsible-text' );
+                       if ( $textContainer.length ) {
+                               $textContainer.text( wasCollapsed ? collapseText : expandText );
                        }
-                       $textContainer.text( wasCollapsed ? collapseText : expandText );
                }
 
                // And finally toggle the element state itself
 
                this.each( function () {
                        var $collapsible, collapseText, expandText, $caption, $toggle, actionHandler, buildDefaultToggleLink,
-                               premadeToggleHandler, $toggleLink, $firstItem, collapsibleId, $customTogglers, firstval;
+                               $toggleLink, $firstItem, collapsibleId, $customTogglers, firstval;
 
                        // Ensure class "mw-collapsible" is present in case .makeCollapsible()
                        // is called on element(s) that don't have it yet.
                                opts = $.extend( defaultOpts, options, opts );
                                togglingHandler( $( this ), $collapsible, e, opts );
                        };
+
                        // Default toggle link. Only build it when needed to avoid jQuery memory leaks (event data).
                        buildDefaultToggleLink = function () {
-                               return $( '<a>' )
-                                       .attr( {
-                                               role: 'button',
-                                               tabindex: 0
-                                       } )
+                               return $( '<a class="mw-collapsible-text"></a>' )
                                        .text( collapseText )
-                                       .wrap( '<span class="mw-collapsible-toggle"></span>' )
-                                               .parent()
-                                               .prepend( '<span class="mw-collapsible-bracket">[</span>' )
-                                               .append( '<span class="mw-collapsible-bracket">]</span>' )
+                                       .wrap( '<span class="mw-collapsible-toggle"></span>' ).parent()
+                                               .attr( {
+                                                       role: 'button',
+                                                       tabindex: 0
+                                               } )
+                                               .prepend( '<span>[</span>' )
+                                               .append( '<span>]</span>' )
                                                .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
                        };
 
-                       // Default handler for clicking on premade toggles
-                       premadeToggleHandler = function ( e, opts ) {
-                               var defaultOpts = { toggleClasses: true, linksPassthru: true };
-                               opts = $.extend( defaultOpts, options, opts );
-                               togglingHandler( $( this ), $collapsible, e, opts );
-                       };
-
                        // Check if this element has a custom position for the toggle link
                        // (ie. outside the container or deeper inside the tree)
                        if ( options.$customTogglers ) {
                                                if ( !$toggle.length ) {
                                                        $toggleLink = buildDefaultToggleLink().appendTo( $caption );
                                                } else {
-                                                       actionHandler = premadeToggleHandler;
                                                        $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
                                                                .prop( 'tabIndex', 0 );
                                                }
                                                if ( !$toggle.length ) {
                                                        $toggleLink = buildDefaultToggleLink().prependTo( $firstItem.eq( -1 ) );
                                                } else {
-                                                       actionHandler = premadeToggleHandler;
                                                        $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
                                                                .prop( 'tabIndex', 0 );
                                                }
                                                $toggleLink = buildDefaultToggleLink();
                                                $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent().prependTo( $collapsible );
                                        } else {
-                                               actionHandler = premadeToggleHandler;
                                                $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
                                                        .prop( 'tabIndex', 0 );
                                        }
                                        if ( !$toggle.length ) {
                                                $toggleLink = buildDefaultToggleLink().prependTo( $collapsible );
                                        } else {
-                                               actionHandler = premadeToggleHandler;
                                                $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
                                                        .prop( 'tabIndex', 0 );
                                        }
index f9675fa..6d478bd 100644 (file)
@@ -45,7 +45,7 @@
                                return false;
                        }
                        for ( i = 0; i < arrThis.length; i++ ) {
-                               if ( $.isArray( arrThis[ i ] ) ) {
+                               if ( Array.isArray( arrThis[ i ] ) ) {
                                        if ( !$.compareArray( arrThis[ i ], arrAgainst[ i ] ) ) {
                                                return false;
                                        }
index 12b0404..afb8837 100644 (file)
 /*!
- * HTML5 placeholder emulation for jQuery plugin
- *
- * This will automatically use the HTML5 placeholder attribute if supported, or emulate this behavior if not.
- *
- * This is a fork from Mathias Bynens' jquery.placeholder as of this commit
- * https://github.com/mathiasbynens/jquery-placeholder/blob/47f05d400e2dd16b59d144141a2cf54a9a77c502/jquery.placeholder.js
- *
- * @author Mathias Bynens <http://mathiasbynens.be/>
- * @author Trevor Parscal <tparscal@wikimedia.org>, 2012
- * @author Krinkle <krinklemail@gmail.com>, 2012
- * @author Alex Ivanov <alexivanov97@gmail.com>, 2013
- * @version 2.1.0
- * @license MIT
+ * No-op for compatibility with code from before we used
+ * native placeholder in all supported browsers.
  */
 
 ( function ( $ ) {
+       var placeholder;
 
-       var isInputSupported = 'placeholder' in document.createElement( 'input' ),
-               isTextareaSupported = 'placeholder' in document.createElement( 'textarea' ),
-               prototype = $.fn,
-               valHooks = $.valHooks,
-               propHooks = $.propHooks,
-               hooks,
-               placeholder;
-
-       function safeActiveElement() {
-               // Avoid IE9 `document.activeElement` of death
-               // https://github.com/mathiasbynens/jquery-placeholder/pull/99
-               try {
-                       return document.activeElement;
-               } catch ( err ) {}
-       }
-
-       function args( elem ) {
-               // Return an object of element attributes
-               var newAttrs = {},
-                       rinlinejQuery = /^jQuery\d+$/;
-               $.each( elem.attributes, function ( i, attr ) {
-                       if ( attr.specified && !rinlinejQuery.test( attr.name ) ) {
-                               newAttrs[ attr.name ] = attr.value;
-                       }
-               } );
-               return newAttrs;
-       }
-
-       function clearPlaceholder( event, value ) {
-               var input = this,
-                       $input = $( input );
-               if ( input.value === $input.attr( 'placeholder' ) && $input.hasClass( 'placeholder' ) ) {
-                       if ( $input.data( 'placeholder-password' ) ) {
-                               $input = $input.hide().next().show().attr( 'id', $input.removeAttr( 'id' ).data( 'placeholder-id' ) );
-                               // If `clearPlaceholder` was called from `$.valHooks.input.set`
-                               if ( event === true ) {
-                                       $input[ 0 ].value = value;
-                                       return value;
-                               }
-                               $input.focus();
-                       } else {
-                               input.value = '';
-                               $input.removeClass( 'placeholder' );
-                               if ( input === safeActiveElement() ) {
-                                       input.select();
-                               }
-                       }
-               }
-       }
-
-       function setPlaceholder() {
-               var $replacement,
-                       input = this,
-                       $input = $( input ),
-                       id = this.id;
-               if ( !input.value ) {
-                       if ( input.type === 'password' ) {
-                               if ( !$input.data( 'placeholder-textinput' ) ) {
-                                       try {
-                                               $replacement = $input.clone().attr( { type: 'text' } );
-                                       } catch ( e ) {
-                                               $replacement = $( '<input>' ).attr( $.extend( args( this ), { type: 'text' } ) );
-                                       }
-                                       $replacement
-                                                       .removeAttr( 'name' )
-                                                       .data( {
-                                                               'placeholder-password': $input,
-                                                               'placeholder-id': id
-                                                       } )
-                                                       .on( 'focus.placeholder drop.placeholder', clearPlaceholder );
-                                       $input
-                                                       .data( {
-                                                               'placeholder-textinput': $replacement,
-                                                               'placeholder-id': id
-                                                       } )
-                                                       .before( $replacement );
-                               }
-                               $input = $input.removeAttr( 'id' ).hide().prev().attr( 'id', id ).show();
-                               // Note: `$input[0] != input` now!
-                       }
-                       $input.addClass( 'placeholder' );
-                       $input[ 0 ].value = $input.attr( 'placeholder' );
-               } else {
-                       $input.removeClass( 'placeholder' );
-               }
-       }
-
-       function changePlaceholder( text ) {
-               var hasArgs = arguments.length,
-                       $input = this;
-               if ( hasArgs ) {
-                       if ( $input.attr( 'placeholder' ) !== text ) {
-                               $input.prop( 'placeholder', text );
-                               if ( $input.hasClass( 'placeholder' ) ) {
-                                       $input[ 0 ].value = text;
-                               }
-                       }
-               }
-       }
-
-       if ( isInputSupported && isTextareaSupported ) {
-
-               placeholder = prototype.placeholder = function ( text ) {
-                       var hasArgs = arguments.length;
-
-                       if ( hasArgs ) {
-                               changePlaceholder.call( this, text );
-                       }
-
-                       return this;
-               };
-
-               placeholder.input = placeholder.textarea = true;
-
-       } else {
-
-               placeholder = prototype.placeholder = function ( text ) {
-                       var $this = this,
-                               hasArgs = arguments.length;
-
-                       if ( hasArgs ) {
-                               changePlaceholder.call( this, text );
-                       }
-
-                       $this
-                               .filter( ( isInputSupported ? 'textarea' : ':input' ) + '[placeholder]' )
-                               .filter( function () {
-                                       return !$( this ).data( 'placeholder-enabled' );
-                               } )
-                               .on( {
-                                       'focus.placeholder drop.placeholder': clearPlaceholder,
-                                       'blur.placeholder': setPlaceholder
-                               } )
-                               .data( 'placeholder-enabled', true )
-                               .trigger( 'blur.placeholder' );
-                       return $this;
-               };
-
-               placeholder.input = isInputSupported;
-               placeholder.textarea = isTextareaSupported;
-
-               hooks = {
-                       get: function ( element ) {
-                               var $element = $( element ),
-                                       $passwordInput = $element.data( 'placeholder-password' );
-                               if ( $passwordInput ) {
-                                       return $passwordInput[ 0 ].value;
-                               }
-
-                               return $element.data( 'placeholder-enabled' ) && $element.hasClass( 'placeholder' ) ? '' : element.value;
-                       },
-                       set: function ( element, value ) {
-                               var $element = $( element ),
-                                       $passwordInput = $element.data( 'placeholder-password' );
-                               if ( $passwordInput ) {
-                                       $passwordInput[ 0 ].value = value;
-                                       return value;
-                               }
-
-                               if ( !$element.data( 'placeholder-enabled' ) ) {
-                                       element.value = value;
-                                       return value;
-                               }
-                               if ( !value ) {
-                                       element.value = value;
-                                       // Issue #56: Setting the placeholder causes problems if the element continues to have focus.
-                                       if ( element !== safeActiveElement() ) {
-                                               // We can't use `triggerHandler` here because of dummy text/password inputs :(
-                                               setPlaceholder.call( element );
-                                       }
-                               } else if ( $element.hasClass( 'placeholder' ) ) {
-                                       if ( !clearPlaceholder.call( element, true, value ) ) {
-                                               element.value = value;
-                                       }
-                               } else {
-                                       element.value = value;
-                               }
-                               // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
-                               return $element;
-                       }
-               };
-
-               if ( !isInputSupported ) {
-                       valHooks.input = hooks;
-                       propHooks.value = hooks;
-               }
-               if ( !isTextareaSupported ) {
-                       valHooks.textarea = hooks;
-                       propHooks.value = hooks;
+       placeholder = $.fn.placeholder = function ( text ) {
+               if ( arguments.length ) {
+                       this.prop( 'placeholder', text );
                }
+               return this;
+       };
 
-               $( function () {
-                       // Look for forms
-                       $( document ).delegate( 'form', 'submit.placeholder', function () {
-                               // Clear the placeholder values so they don't get submitted
-                               var $inputs = $( '.placeholder', this ).each( clearPlaceholder );
-                               setTimeout( function () {
-                                       $inputs.each( setPlaceholder );
-                               }, 10 );
-                       } );
-               } );
-
-               // Clear placeholder values upon page reload
-               $( window ).on( 'beforeunload.placeholder', function () {
-                       $( '.placeholder' ).each( function () {
-                               this.value = '';
-                       } );
-               } );
+       placeholder.input = placeholder.textarea = true;
 
-       }
 }( jQuery ) );
diff --git a/resources/src/jquery/jquery.qunit.completenessTest.js b/resources/src/jquery/jquery.qunit.completenessTest.js
deleted file mode 100644 (file)
index 0aaa4ff..0000000
+++ /dev/null
@@ -1,306 +0,0 @@
-/**
- * jQuery QUnit CompletenessTest 0.4
- *
- * Tests the completeness of test suites for object oriented javascript
- * libraries. Written to be used in environments with jQuery and QUnit.
- * Requires jQuery 1.7.2 or higher.
- *
- * Built for and tested with:
- * - Chrome 19
- * - Firefox 4
- * - Safari 5
- *
- * @author Timo Tijhof, 2011-2012
- */
-/* eslint-env qunit */
-( function ( mw, $ ) {
-       'use strict';
-
-       var util,
-               hasOwn = Object.prototype.hasOwnProperty,
-               log = ( window.console && window.console.log ) ?
-                       function () { return window.console.log.apply( window.console, arguments ); } :
-                       function () {};
-
-       // Simplified version of a few jQuery methods, except that they don't
-       // call other jQuery methods. Required to be able to run the CompletenessTest
-       // on jQuery itself as well.
-       util = {
-               keys: Object.keys || function ( object ) {
-                       var key, keys = [];
-                       for ( key in object ) {
-                               if ( hasOwn.call( object, key ) ) {
-                                       keys.push( key );
-                               }
-                       }
-                       return keys;
-               },
-               each: function ( object, callback ) {
-                       var name;
-                       for ( name in object ) {
-                               if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
-                                       break;
-                               }
-                       }
-               },
-               // $.type and $.isEmptyObject are safe as is, they don't call
-               // other $.* methods. Still need to be derefenced into `util`
-               // since the CompletenessTest will overload them with spies.
-               type: $.type,
-               isEmptyObject: $.isEmptyObject
-       };
-
-       /**
-        * CompletenessTest
-        *
-        * @constructor
-        * @example
-        *  var myTester = new CompletenessTest( myLib );
-        * @param {Object} masterVariable The root variable that contains all object
-        *  members. CompletenessTest will recursively traverse objects and keep track
-        *  of all methods.
-        * @param {Function} [ignoreFn] Optionally pass a function to filter out certain
-        *  methods. Example: You may want to filter out instances of jQuery or some
-        *  other constructor. Otherwise "missingTests" will include all methods that
-        *  were not called from that instance.
-        */
-       function CompletenessTest( masterVariable, ignoreFn ) {
-               var warn,
-                       that = this;
-
-               // Keep track in these objects. Keyed by strings with the
-               // method names (ie. 'my.foo', 'my.bar', etc.) values are boolean true.
-               this.injectionTracker = {};
-               this.methodCallTracker = {};
-               this.missingTests = {};
-
-               this.ignoreFn = ignoreFn === undefined ? function () { return false; } : ignoreFn;
-
-               // Lazy limit in case something weird happends (like recurse (part of) ourself).
-               this.lazyLimit = 2000;
-               this.lazyCounter = 0;
-
-               // Bind begin and end to QUnit.
-               QUnit.begin( function () {
-                       // Suppress warnings (e.g. deprecation notices for accessing the properties)
-                       warn = mw.log.warn;
-                       mw.log.warn = $.noop;
-
-                       that.walkTheObject( masterVariable, null, masterVariable, [] );
-                       log( 'CompletenessTest/walkTheObject', that );
-
-                       // Restore warnings
-                       mw.log.warn = warn;
-                       warn = undefined;
-               } );
-
-               QUnit.done( function () {
-                       var toolbar, testResults, cntTotal, cntCalled, cntMissing;
-
-                       that.populateMissingTests();
-                       log( 'CompletenessTest/populateMissingTests', that );
-
-                       cntTotal = util.keys( that.injectionTracker ).length;
-                       cntCalled = util.keys( that.methodCallTracker ).length;
-                       cntMissing = util.keys( that.missingTests ).length;
-
-                       function makeTestResults( blob, title, style ) {
-                               var elOutputWrapper, elTitle, elContainer, elList, elFoot;
-
-                               elTitle = document.createElement( 'strong' );
-                               elTitle.textContent = title || 'Values';
-
-                               elList = document.createElement( 'ul' );
-                               util.each( blob, function ( key ) {
-                                       var elItem = document.createElement( 'li' );
-                                       elItem.textContent = key;
-                                       elList.appendChild( elItem );
-                               } );
-
-                               elFoot = document.createElement( 'p' );
-                               elFoot.innerHTML = '<em>&mdash; CompletenessTest</em>';
-
-                               elContainer = document.createElement( 'div' );
-                               elContainer.appendChild( elTitle );
-                               elContainer.appendChild( elList );
-                               elContainer.appendChild( elFoot );
-
-                               elOutputWrapper = document.getElementById( 'qunit-completenesstest' );
-                               if ( !elOutputWrapper ) {
-                                       elOutputWrapper = document.createElement( 'div' );
-                                       elOutputWrapper.id = 'qunit-completenesstest';
-                               }
-                               elOutputWrapper.appendChild( elContainer );
-
-                               util.each( style, function ( key, value ) {
-                                       elOutputWrapper.style[ key ] = value;
-                               } );
-                               return elOutputWrapper;
-                       }
-
-                       if ( cntMissing === 0 ) {
-                               // Good
-                               testResults = makeTestResults(
-                                       {},
-                                       'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. No missing tests!',
-                                       {
-                                               backgroundColor: '#D2E0E6',
-                                               color: '#366097',
-                                               paddingTop: '1em',
-                                               paddingRight: '1em',
-                                               paddingBottom: '1em',
-                                               paddingLeft: '1em'
-                                       }
-                               );
-                       } else {
-                               // Bad
-                               testResults = makeTestResults(
-                                       that.missingTests,
-                                       'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. ' + cntMissing + ' methods not covered:',
-                                       {
-                                               backgroundColor: '#EE5757',
-                                               color: 'black',
-                                               paddingTop: '1em',
-                                               paddingRight: '1em',
-                                               paddingBottom: '1em',
-                                               paddingLeft: '1em'
-                                       }
-                               );
-                       }
-
-                       toolbar = document.getElementById( 'qunit-testrunner-toolbar' );
-                       if ( toolbar ) {
-                               toolbar.insertBefore( testResults, toolbar.firstChild );
-                       }
-               } );
-
-               return this;
-       }
-
-       /* Public methods */
-       CompletenessTest.fn = CompletenessTest.prototype = {
-
-               /**
-                * CompletenessTest.fn.walkTheObject
-                *
-                * This function recursively walks through the given object, calling itself as it goes.
-                * Depending on the action it either injects our listener into the methods, or
-                * reads from our tracker and records which methods have not been called by the test suite.
-                *
-                * @param {Mixed} currObj The variable to check (initially an object,
-                *  further down it could be anything).
-                * @param {string|null} currName Name of the given object member (Initially this is null).
-                * @param {Object} masterVariable Throughout our interation, always keep track of the master/root.
-                *  Initially this is the same as currVar.
-                * @param {Array} parentPathArray Array of names that indicate our breadcrumb path starting at
-                *  masterVariable. Not including currName.
-                */
-               walkTheObject: function ( currObj, currName, masterVariable, parentPathArray ) {
-                       var key, currVal, type,
-                               ct = this,
-                               currPathArray = parentPathArray;
-
-                       if ( currName ) {
-                               currPathArray.push( currName );
-                               currVal = currObj[ currName ];
-                       } else {
-                               currName = '(root)';
-                               currVal = currObj;
-                       }
-
-                       type = util.type( currVal );
-
-                       // Hard ignores
-                       if ( this.ignoreFn( currVal, this, currPathArray ) ) {
-                               return;
-                       }
-
-                       // Handle the lazy limit
-                       this.lazyCounter++;
-                       if ( this.lazyCounter > this.lazyLimit ) {
-                               log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, currPathArray );
-                               return;
-                       }
-
-                       // Functions
-                       if ( type === 'function' ) {
-                               // Don't put a spy in constructor functions as it messes with
-                               // instanceof etc.
-                               if ( !currVal.prototype || util.isEmptyObject( currVal.prototype ) ) {
-                                       this.injectionTracker[ currPathArray.join( '.' ) ] = true;
-                                       this.injectCheck( currObj, currName, function () {
-                                               ct.methodCallTracker[ currPathArray.join( '.' ) ] = true;
-                                       } );
-                               }
-                       }
-
-                       // Recursively. After all, this is the *completeness* test
-                       // This also traverses static properties and the prototype of a constructor
-                       if ( type === 'object' || type === 'function' ) {
-                               for ( key in currVal ) {
-                                       if ( hasOwn.call( currVal, key ) ) {
-                                               this.walkTheObject( currVal, key, masterVariable, currPathArray.slice() );
-                                       }
-                               }
-                       }
-               },
-
-               populateMissingTests: function () {
-                       var ct = this;
-                       util.each( ct.injectionTracker, function ( key ) {
-                               ct.hasTest( key );
-                       } );
-               },
-
-               /**
-                * CompletenessTest.fn.hasTest
-                *
-                * Checks if the given method name (ie. 'my.foo.bar')
-                * was called during the test suite (as far as the tracker knows).
-                * If not it adds it to missingTests.
-                *
-                * @param {string} fnName
-                * @return {boolean}
-                */
-               hasTest: function ( fnName ) {
-                       if ( !( fnName in this.methodCallTracker ) ) {
-                               this.missingTests[ fnName ] = true;
-                               return false;
-                       }
-                       return true;
-               },
-
-               /**
-                * CompletenessTest.fn.injectCheck
-                *
-                * Injects a function (such as a spy that updates methodCallTracker when
-                * it's called) inside another function.
-                *
-                * @param {Object} obj The object into which `injectFn` will be inserted
-                * @param {Array} key The key by which `injectFn` will be known in `obj`; if this already
-                *   exists, a wrapper will first call `injectFn` and then the original `obj[key]` function.
-                * @param {Function} injectFn The function to insert
-                */
-               injectCheck: function ( obj, key, injectFn ) {
-                       var spy,
-                               val = obj[ key ];
-
-                       spy = function () {
-                               injectFn();
-                               return val.apply( this, arguments );
-                       };
-
-                       // Make the spy inherit from the original so that its static methods are also
-                       // visible in the spy (e.g. when we inject a check into mw.log, mw.log.warn
-                       // must remain accessible).
-                       spy.__proto__ = val;
-
-                       // Objects are by reference, members (unless objects) are not.
-                       obj[ key ] = spy;
-               }
-       };
-
-       /* Expose */
-       window.CompletenessTest = CompletenessTest;
-
-}( mediaWiki, jQuery ) );
index fdc8a26..75f1ba6 100644 (file)
@@ -96,7 +96,7 @@
  */
  // jscs:enable checkParamNames
 
-( function ( $ ) {
+( function ( $, mw ) {
 
        var hasOwn = Object.hasOwnProperty;
 
                                        context.data.prevText = val;
                                        // Try cache first
                                        if ( context.config.cache && hasOwn.call( cache, val ) ) {
-                                               if ( +new Date() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
+                                               if ( mw.now() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
                                                        context.data.$textbox.suggestions( 'suggestions', cache[ val ].suggestions );
                                                        if ( typeof context.config.update.after === 'function' ) {
                                                                context.config.update.after.call( context.data.$textbox, cache[ val ].metadata );
                                                                        cache[ val ] = {
                                                                                suggestions: suggestions,
                                                                                metadata: metadata,
-                                                                               timestamp: +new Date()
+                                                                               timestamp: mw.now()
                                                                        };
                                                                }
                                                        },
         * @mixins jQuery.plugin.suggestions
         */
 
-}( jQuery ) );
+}( jQuery, mediaWiki ) );
index f84c091..8d019e5 100644 (file)
 
                // We allow a trailing percent sign, which we just strip. This works fine
                // if percents and regular numbers aren't being mixed.
-               ts.numberRegex = new RegExp( '^(' + '[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?' + // Fortran-style scientific
-               '|' + '[-+\u2212]?' + digitClass + '+[\\s\\xa0]*%?' + // Generic localised
-               ')$', 'i' );
+               ts.numberRegex = new RegExp(
+                       '^(' +
+                               '[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?' + // Fortran-style scientific
+                               '|' +
+                               '[-+\u2212]?' + digitClass + '+[\\s\\xa0]*%?' + // Generic localised
+                       ')$',
+                       'i'
+               );
        }
 
        function buildDateTable() {
                ts.dateRegex[ 0 ] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i );
 
                // Written Month name, dmy
-               ts.dateRegex[ 1 ] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[ 1 ] = new RegExp(
+                       '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' +
+                               regex +
+                       ')' +
+                       '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$',
+                       'i'
+               );
 
                // Written Month name, mdy
-               ts.dateRegex[ 2 ] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[ 2 ] = new RegExp(
+                       '^\\s*(' + regex + ')' +
+                       '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$',
+                       'i'
+               );
 
        }
 
index f4ef540..11f472e 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 /* Table Sorting */
 
index 011f9c5..938962f 100644 (file)
@@ -2,27 +2,31 @@
        var collapsibleLists, handleOne;
 
        // Collapsible lists of categories and templates
+       // If changing or removing a storeKey, ensure there is a strategy for old keys.
+       // E.g. detect existence via requestIdleCallback and remove. (T121646)
        collapsibleLists = [
                {
                        listSel: '.templatesUsed ul',
                        togglerSel: '.mw-templatesUsedExplanation',
-                       cookieName: 'templates-used-list'
+                       storeKey: 'mwedit-state-templatesUsed'
                },
                {
                        listSel: '.hiddencats ul',
                        togglerSel: '.mw-hiddenCategoriesExplanation',
-                       cookieName: 'hidden-categories-list'
+                       storeKey: 'mwedit-state-hiddenCategories'
                },
                {
                        listSel: '.preview-limit-report-wrapper',
                        togglerSel: '.mw-limitReportExplanation',
-                       cookieName: 'preview-limit-report'
+                       storeKey: 'mwedit-state-limitReport'
                }
        ];
 
-       handleOne = function ( $list, $toggler, cookieName ) {
-               // Collapsed by default
-               var isCollapsed = mw.cookie.get( cookieName ) !== 'expanded';
+       handleOne = function ( $list, $toggler, storeKey ) {
+               var collapsedVal = '0',
+                       expandedVal = '1',
+                       // Default to collapsed if not set
+                       isCollapsed = mw.storage.get( storeKey ) !== expandedVal;
 
                // Style the toggler with an arrow icon and add a tabIndex and a role for accessibility
                $toggler.addClass( 'mw-editfooter-toggler' ).prop( 'tabIndex', 0 ).attr( 'role', 'button' );
 
                $list.on( 'beforeExpand.mw-collapsible', function () {
                        $toggler.removeClass( 'mw-icon-arrow-collapsed' ).addClass( 'mw-icon-arrow-expanded' );
-                       mw.cookie.set( cookieName, 'expanded' );
+                       mw.storage.set( storeKey, expandedVal );
                } );
 
                $list.on( 'beforeCollapse.mw-collapsible', function () {
                        $toggler.removeClass( 'mw-icon-arrow-expanded' ).addClass( 'mw-icon-arrow-collapsed' );
-                       mw.cookie.set( cookieName, 'collapsed' );
+                       mw.storage.set( storeKey, collapsedVal );
                } );
        };
 
@@ -55,7 +59,7 @@
                        handleOne(
                                $editForm.find( collapsibleLists[ i ].listSel ),
                                $editForm.find( collapsibleLists[ i ].togglerSel ),
-                               collapsibleLists[ i ].cookieName
+                               collapsibleLists[ i ].storeKey
                        );
                }
        } );
index c9834f0..f6a9c54 100644 (file)
@@ -20,7 +20,9 @@
                var editBox, scrollTop, $editForm;
 
                // Make sure edit summary does not exceed byte limit
-               $( '#wpSummary' ).byteLimit( 255 );
+               // TODO: Replace with this when $wgOOUIEditPage is removed:
+               // OO.ui.infuse( 'wpSummary' ).$input.byteLimit( 255 );
+               $( 'input#wpSummary, #wpSummary > input' ).byteLimit( 255 );
 
                // Restore the edit box scroll state following a preview operation,
                // and set up a form submission handler to remember this state.
index 15d0a39..53c1fbb 100644 (file)
                                                .revisions[ 0 ].diff.body;
                                        $wikiDiff.find( 'table.diff tbody' ).html( diffHtml );
                                        mw.hook( 'wikipage.diff' ).fire( $wikiDiff.find( 'table.diff' ) );
-                               } catch ( e ) {
+                               } catch ( err ) {
                                        // "result.blah is undefined" error, ignore
-                                       mw.log.warn( e );
+                                       mw.log.warn( err );
                                }
                                $wikiDiff.show();
                        } );
                                preview: true,
                                sectionpreview: section !== '',
                                disableeditsection: true,
+                               useskin: mw.config.get( 'skin' ),
                                uselang: mw.config.get( 'wgUserLanguage' )
                        } );
                        if ( section === 'new' ) {
index b63f87d..8287264 100644 (file)
@@ -6,32 +6,48 @@
 #wpTextbox1 {
        margin: 0;
        display: block;
+       /* Ensure the textarea is not higher than browser's viewport on small screens */
+       max-height: 100vh;
+       /* But don't let it collapse into nothingness on really tiny screens */
+       min-height: 5em;
+}
+
+/*
+ * Add a bit of margin space between the preview and the toolbar.
+ * This replaces the ugly <p><br /></p> we used to insert into the page source
+ */
+#wikiPreview.ontop {
+       margin-bottom: 1em;
 }
 
 /* Adjustments to edit form elements */
-.editCheckboxes {
+#editpage-copywarn {
+       font-size: 0.9em;
+}
+
+#wpSummary {
+       display: block;
+       width: 80%;
        margin-bottom: 1em;
 }
 
-.editCheckboxes input:first-child {
-       margin-left: 0;
+/* Adjustments to edit form elements (only when $wgOOUIEditPage is false) */
+.mw-editform-legacy .editCheckboxes {
+       margin-bottom: 1em;
 }
 
-.cancelLink {
-       margin-left: 0.5em;
+.mw-editform-legacy .editCheckboxes input:first-child {
+       margin-left: 0;
 }
 
-#editpage-copywarn {
-       font-size: 0.9em;
+.mw-editform-legacy .cancelLink {
+       margin-left: 0.5em;
 }
 
-input#wpSummary {
-       display: block;
+.mw-editform-legacy input#wpSummary {
        background-color: #fff;
        color: #000;
-       width: 80%;
        margin-top: 0;
-       margin-bottom: 1em;
        padding: 0.625em 0.546875em 0.546875em;
        border: 1px solid #a2a9b1;
        border-radius: 2px;
@@ -43,21 +59,43 @@ input#wpSummary {
        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 );
 }
 
-input#wpSummary:focus,
-input#wpSummary:active {
+.mw-editform-legacy input#wpSummary:focus,
+.mw-editform-legacy input#wpSummary:active {
        outline: 0;
        border-color: #36c;
        box-shadow: inset 0 0 0 1px #36c;
 }
 
-.editButtons input:first-child {
+.mw-editform-legacy .editButtons input:first-child {
        margin-left: 0.1em;
 }
 
-/*
- * Add a bit of margin space between the preview and the toolbar.
- * This replaces the ugly <p><br /></p> we used to insert into the page source
- */
-#wikiPreview.ontop {
-       margin-bottom: 1em;
+/* Adjustments to edit form elements (only when $wgOOUIEditPage is true) */
+.mw-editform-ooui #editpage-copywarn {
+       line-height: 1.26;
+}
+
+.mw-editform-ooui #wpSummary {
+       max-width: none;
+}
+
+.mw-editform-ooui #wpSummaryLabel {
+       margin: 0;
+}
+
+.mw-editform-ooui .editCheckboxes .oo-ui-fieldLayout {
+       margin-right: 1em;
+}
+
+.mw-editform-ooui .editHelp {
+       margin-left: 0.5em;
+       vertical-align: middle;
+}
+
+.mw-editform-ooui .editHelp a {
+       font-weight: bold;
+}
+
+.mw-editform-ooui .editOptions {
+       border-radius: 0 0 2px 2px;
 }
index fd5dbc9..f3ea163 100644 (file)
@@ -1,6 +1,6 @@
 /* Styles for the JavaScript enhancements of the history page */
 
-#pagehistory li.before input[name="oldid"],
-#pagehistory li.after input[name="diff"] {
+#pagehistory li.before input[name='oldid'],
+#pagehistory li.after input[name='diff'] {
        visibility: hidden;
 }
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.postEdit.css b/resources/src/mediawiki.action/mediawiki.action.view.postEdit.css
deleted file mode 100644 (file)
index 6e0010c..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-.postedit-container {
-       margin: 0 auto;
-       position: fixed;
-       top: 0;
-       height: 0;
-       left: 50%;
-       z-index: 1000;
-       font-size: 13px;
-}
-
-.postedit-container:hover {
-       cursor: pointer;
-}
-
-.postedit {
-       position: relative;
-       top: 0.6em;
-       left: -50%;
-       padding: 0.6em 3.6em 0.6em 1.1em;
-       line-height: 1.5625em;
-       color: #626465;
-       background-color: #f4f4f4;
-       border: 1px solid #dcd9d9;
-       text-shadow: 0 0.0625em 0 rgba( 255, 255, 255, 0.5 );
-       border-radius: 5px;
-       box-shadow: 0 2px 5px 0 #ccc;
-       -webkit-transition: all 0.25s ease-in-out;
-       -moz-transition: all 0.25s ease-in-out;
-       -ms-transition: all 0.25s ease-in-out;
-       -o-transition: all 0.25s ease-in-out;
-       transition: all 0.25s ease-in-out;
-}
-
-.skin-monobook .postedit {
-       top: 6em !important;
-}
-
-.postedit-faded {
-       opacity: 0;
-}
-
-.postedit-icon {
-       padding-left: 41px; /* 25 + 8 + 8 */
-       /* like min-height, but old IE compatible and keeps text vertically aligned, too */
-       line-height: 25px;
-       background-repeat: no-repeat;
-       background-position: 8px 50%;
-}
-
-.postedit-icon-checkmark {
-       /* @embed */
-       background-image: url( images/green-checkmark.png );
-       background-position: left;
-}
-
-.postedit-close {
-       position: absolute;
-       padding: 0 0.8em;
-       right: 0;
-       top: 0;
-       font-size: 1.25em;
-       font-weight: bold;
-       line-height: 2.3em;
-       color: #000;
-       text-shadow: 0 0.0625em 0 #fff;
-       text-decoration: none;
-       opacity: 0.2;
-       filter: alpha( opacity=20 );
-}
-
-.postedit-close:hover {
-       color: #000;
-       text-decoration: none;
-       opacity: 0.4;
-       filter: alpha( opacity=40 );
-}
index b339371..e25c96a 100644 (file)
         * @member mw.hook
         */
 
-       var config = mw.config.get( [ 'wgAction', 'wgCurRevisionId' ] ),
-               // This should match EditPage::POST_EDIT_COOKIE_KEY_PREFIX:
-               cookieKey = 'PostEditRevision' + config.wgCurRevisionId,
-               cookieVal = mw.cookie.get( cookieKey ),
-               $div, id;
+       var postEdit = mw.config.get( 'wgPostEdit' );
 
-       function removeConfirmation() {
-               $div.remove();
-               mw.hook( 'postEdit.afterRemoval' ).fire();
-       }
-
-       function fadeOutConfirmation() {
-               clearTimeout( id );
-               $div.find( '.postedit' ).addClass( 'postedit postedit-faded' );
-               setTimeout( removeConfirmation, 500 );
+       function showConfirmation( data ) {
+               var $container, $popup, $content, timeoutId;
 
-               return false;
-       }
+               function fadeOutConfirmation() {
+                       $popup.addClass( 'postedit-faded' );
+                       setTimeout( function () {
+                               $container.remove();
+                               mw.hook( 'postEdit.afterRemoval' ).fire();
+                       }, 250 );
+               }
 
-       function showConfirmation( data ) {
                data = data || {};
+
                if ( data.message === undefined ) {
                        data.message = $.parseHTML( mw.message( 'postedit-confirmation-saved', data.user || mw.user ).escaped() );
                }
 
-               $div = mw.template.get( 'mediawiki.action.view.postEdit', 'postEdit.html' ).render();
-
+               $content = $( '<div>' ).addClass( 'postedit-icon postedit-icon-checkmark postedit-content' );
                if ( typeof data.message === 'string' ) {
-                       $div.find( '.postedit-content' ).text( data.message );
+                       $content.text( data.message );
                } else if ( typeof data.message === 'object' ) {
-                       $div.find( '.postedit-content' ).append( data.message );
+                       $content.append( data.message );
                }
 
-               $div
-                       .click( fadeOutConfirmation )
-                       .prependTo( 'body' );
+               $popup = $( '<div>' ).addClass( 'postedit mw-notification' ).append(
+                       $content,
+                       $( '<a>' ).addClass( 'postedit-close' ).attr( 'href', '#' ).text( '×' )
+               ).on( 'click', function ( e ) {
+                       e.preventDefault();
+                       clearTimeout( timeoutId );
+                       fadeOutConfirmation();
+               } );
 
-               id = setTimeout( fadeOutConfirmation, 3000 );
+               $container = $( '<div>' ).addClass( 'postedit-container' ).append( $popup );
+               timeoutId = setTimeout( fadeOutConfirmation, 3000 );
+
+               $( 'body' ).prepend( $container );
        }
 
        mw.hook( 'postEdit' ).add( showConfirmation );
 
-       if ( config.wgAction === 'view' && cookieVal ) {
-               mw.config.set( 'wgPostEdit', true );
-
+       if ( postEdit ) {
                mw.hook( 'postEdit' ).fire( {
                        // The following messages can be used here:
                        // postedit-confirmation-saved
                        // postedit-confirmation-created
                        // postedit-confirmation-restored
                        message: mw.msg(
-                               'postedit-confirmation-' + cookieVal,
+                               'postedit-confirmation-' + postEdit,
                                mw.user
                        )
                } );
-               mw.cookie.set( cookieKey, null );
        }
 
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.postEdit.less b/resources/src/mediawiki.action/mediawiki.action.view.postEdit.less
new file mode 100644 (file)
index 0000000..8094559
--- /dev/null
@@ -0,0 +1,71 @@
+@import 'mediawiki.mixins';
+
+.postedit-container {
+       margin: 0 auto;
+       position: fixed;
+       top: 0;
+       height: 0;
+       left: 50%;
+       z-index: 1000;
+       font-size: 13px;
+
+       &:hover {
+               cursor: pointer;
+       }
+}
+
+.postedit {
+       position: relative;
+       top: 0.6em;
+       left: -50%;
+       line-height: 1.35;
+       opacity: 1;
+       .transition( opacity 250ms );
+
+       &.mw-notification {
+               padding-right: 3em;
+       }
+}
+
+// TODO: Move to monobook skin
+.skin-monobook .postedit {
+       top: 6em !important; /* stylelint-disable-line declaration-no-important */
+}
+
+.postedit-faded {
+       opacity: 0;
+}
+
+.postedit-icon {
+       padding-left: 41px; /* 25 + 8 + 8 */
+       /* like min-height, but old IE compatible and keeps text vertically aligned, too */
+       line-height: 25px;
+       background-repeat: no-repeat;
+       background-position: 8px 50%;
+}
+
+.postedit-icon-checkmark {
+       /* @embed */
+       background-image: url( images/green-checkmark.png );
+       background-position: left;
+}
+
+.postedit-close {
+       position: absolute;
+       padding: 0 0.8em;
+       right: 0;
+       top: 0;
+       font-size: 1.25em;
+       font-weight: bold;
+       line-height: 2.3em;
+       color: #000;
+       text-shadow: 0 0.0625em 0 #fff;
+       text-decoration: none;
+       opacity: 0.2;
+
+       .postedit:hover & {
+               color: #000;
+               text-decoration: none;
+               opacity: 0.4;
+       }
+}
index b791db8..dccbacc 100644 (file)
        list-style: none none;
        display: inline;
        /* shared.css has some very weird directionality-specific rules for 'ul' we need to override,
-          search for "Correct directionality when page dir is different from site/user dir" */
+        * search for "Correct directionality when page dir is different from site/user dir" */
+       /* stylelint-disable declaration-no-important */
        margin: 0 !important;
        padding: 0 !important;
+       /* stylelint-enable declaration-no-important */
 }
 
 /* @noflip */
diff --git a/resources/src/mediawiki.action/templates/postEdit.html b/resources/src/mediawiki.action/templates/postEdit.html
deleted file mode 100644 (file)
index dbb482a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<div class="postedit-container">
-       <div class="postedit">
-               <div class="postedit-icon postedit-icon-checkmark postedit-content"></div>
-               <a href="#" class="postedit-close">&times;</a>
-       </div>
-</div>
index 0dffd7d..f0a86ff 100644 (file)
                                }
                        }
                },
+               {
+                       "label": "‹›",
+                       "action": {
+                               "type": "encapsulate",
+                               "options": {
+                                       "pre": "‹",
+                                       "post": "›"
+                               }
+                       }
+               },
+               {
+                       "label": "⟨⟩",
+                       "action": {
+                               "type": "encapsulate",
+                               "options": {
+                                       "pre": "⟨",
+                                       "post": "⟩"
+                               }
+                       }
+               },
                "¤", "₳", "฿", "₵", "¢", "₡", "₢", "$", "₫", "₯", "€", "₠", "₣", "ƒ", "₴", "₭", "₤", "ℳ", "₥", "₦", "№", "₧", "₰", "£", "៛", "₨", "₪", "৳", "₮", "₩", "¥", "♠", "♣", "♥", "♦", "m²", "m³",
                {
                        "label": "–",
@@ -73,7 +93,7 @@
                                }
                        }
                },
-               "…", "‘", "’", "“", "”", "°", "′", "″", "≈", "≠", "≤", "≥", "±",
+               "…", "‘", "’", "“", "”", "°", "%", "‰", "′", "″", "≈", "≠", "≤", "≥", "±",
                {
                        "label": "−",
                        "titleMsg": "special-characters-title-minus",
        ],
        "khmer": [
                "ក", "ខ", "គ", "ឃ", "ង", "ច", "ឆ", "ជ", "ឈ", "ញ", "ដ", "ឋ", "ឌ", "ឍ", "ណ", "ត", "ថ", "ទ", "ធ", "ន", "ប", "ផ", "ព", "ភ", "ម", "យ", "រ", "ល", "វ", "ស", "ហ", "ឡ", "អ", "ឣ", "ឤ", "ឥ", "ឦ", "ឧ", "ឨ", "ឩ", "ឪ", "ឫ", "ឬ", "ឭ", "ឮ", "ឯ", "ឰ", "ឱ", "ឲ", "ឳ", "្", "឴", "឵", "ា", "ិ", "ី", "ឹ", "ឺ", "ុ", "ូ", "ួ", "ើ", "ឿ", "ៀ", "េ", "ែ", "ៃ", "ោ", "ៅ", "ំ", "ះ", "ៈ", "៉", "៊", "់", "៌", "៍", "៎", "៏", "័", "៑", "៓", "៝", "ៜ", "០", "១", "២", "៣", "៤", "៥", "៦", "៧", "៨", "៩", "៛", "។", "៕", "៖", "ៗ", "៘", "៙", "៚", "៰", "៱", "៲", "៳", "៴", "៵", "៶", "៷", "៸", "៹", "᧠", "᧡", "᧢", "᧣", "᧤", "᧥", "᧦", "᧧", "᧨", "᧩", "᧪", "᧫", "᧬", "᧭", "᧮", "᧯", "᧰", "᧱", "᧲", "᧳", "᧴", "᧵", "᧶", "᧷", "᧸", "᧹", "᧺", "᧻", "᧼", "᧽", "᧾", "᧿"
+       ],
+       "canadianaboriginal": [
+               "ᐁ", "ᐂ", "ᐃ", "ᐄ", "ᐅ", "ᐆ", "ᐇ", "ᐈ", "ᐉ", "ᐊ", "ᐋ", "ᐌ", "ᐍ", "ᐎ", "ᐏ", "ᐐ",
+               "ᐑ", "ᐒ", "ᐓ", "ᐔ", "ᐕ", "ᐖ", "ᐗ", "ᐘ", "ᐙ", "ᐚ", "ᐛ", "ᐜ", "ᐝ", "ᐞ", "ᐟ", "ᐠ",
+               "ᐡ", "ᐢ", "ᐣ", "ᐤ", "ᐥ", "ᐦ", "ᐧ", "ᐨ", "ᐩ", "ᐪ", "ᐫ", "ᐬ", "ᐭ", "ᐮ", "ᐯ", "ᐰ",
+               "ᐱ", "ᐲ", "ᐳ", "ᐴ", "ᐵ", "ᐶ", "ᐷ", "ᐸ", "ᐹ", "ᐺ", "ᐻ", "ᐼ", "ᐽ", "ᐾ", "ᐿ", "ᑀ",
+               "ᑁ", "ᑂ", "ᑃ", "ᑄ", "ᑅ", "ᑆ", "ᑇ", "ᑈ", "ᑉ", "ᑊ", "ᑋ", "ᑌ", "ᑍ", "ᑎ", "ᑏ", "ᑐ",
+               "ᑑ", "ᑒ", "ᑓ", "ᑔ", "ᑕ", "ᑖ", "ᑗ", "ᑘ", "ᑙ", "ᑚ", "ᑛ", "ᑜ", "ᑝ", "ᑞ", "ᑟ", "ᑠ",
+               "ᑡ", "ᑢ", "ᑣ", "ᑤ", "ᑥ", "ᑦ", "ᑧ", "ᑨ", "ᑩ", "ᑪ", "ᑫ", "ᑬ", "ᑭ", "ᑮ", "ᑯ", "ᑰ",
+               "ᑱ", "ᑲ", "ᑳ", "ᑴ", "ᑵ", "ᑶ", "ᑷ", "ᑸ", "ᑹ", "ᑺ", "ᑻ", "ᑼ", "ᑽ", "ᑾ", "ᑿ", "ᒀ",
+               "ᒁ", "ᒂ", "ᒃ", "ᒄ", "ᒅ", "ᒆ", "ᒇ", "ᒈ", "ᒉ", "ᒊ", "ᒋ", "ᒌ", "ᒍ", "ᒎ", "ᒏ", "ᒐ",
+               "ᒑ", "ᒒ", "ᒓ", "ᒔ", "ᒕ", "ᒖ", "ᒗ", "ᒘ", "ᒙ", "ᒚ", "ᒛ", "ᒜ", "ᒝ", "ᒞ", "ᒟ", "ᒠ",
+               "ᒡ", "ᒢ", "ᒣ", "ᒤ", "ᒥ", "ᒦ", "ᒧ", "ᒨ", "ᒩ", "ᒪ", "ᒫ", "ᒬ", "ᒭ", "ᒮ", "ᒯ", "ᒰ",
+               "ᒱ", "ᒲ", "ᒳ", "ᒴ", "ᒵ", "ᒶ", "ᒷ", "ᒸ", "ᒹ", "ᒺ", "ᒻ", "ᒼ", "ᒽ", "ᒾ", "ᒿ", "ᓀ",
+               "ᓁ", "ᓂ", "ᓃ", "ᓄ", "ᓅ", "ᓆ", "ᓇ", "ᓈ", "ᓉ", "ᓊ", "ᓋ", "ᓌ", "ᓍ", "ᓎ", "ᓏ", "ᓐ",
+               "ᓑ", "ᓒ", "ᓓ", "ᓔ", "ᓕ", "ᓖ", "ᓗ", "ᓘ", "ᓙ", "ᓚ", "ᓛ", "ᓜ", "ᓝ", "ᓞ", "ᓟ", "ᓠ",
+               "ᓡ", "ᓢ", "ᓣ", "ᓤ", "ᓥ", "ᓦ", "ᓧ", "ᓨ", "ᓩ", "ᓪ", "ᓫ", "ᓬ", "ᓭ", "ᓮ", "ᓯ", "ᓰ",
+               "ᓱ", "ᓲ", "ᓳ", "ᓴ", "ᓵ", "ᓶ", "ᓷ", "ᓸ", "ᓹ", "ᓺ", "ᓻ", "ᓼ", "ᓽ", "ᓾ", "ᓿ", "ᔀ",
+               "ᔁ", "ᔂ", "ᔃ", "ᔄ", "ᔅ", "ᔆ", "ᔇ", "ᔈ", "ᔉ", "ᔊ", "ᔋ", "ᔌ", "ᔍ", "ᔎ", "ᔏ", "ᔐ",
+               "ᔑ", "ᔒ", "ᔓ", "ᔔ", "ᔕ", "ᔖ", "ᔗ", "ᔘ", "ᔙ", "ᔚ", "ᔛ", "ᔜ", "ᔝ", "ᔞ", "ᔟ", "ᔠ",
+               "ᔡ", "ᔢ", "ᔣ", "ᔤ", "ᔥ", "ᔦ", "ᔧ", "ᔨ", "ᔩ", "ᔪ", "ᔫ", "ᔬ", "ᔭ", "ᔮ", "ᔯ", "ᔰ",
+               "ᔱ", "ᔲ", "ᔳ", "ᔴ", "ᔵ", "ᔶ", "ᔷ", "ᔸ", "ᔹ", "ᔺ", "ᔻ", "ᔼ", "ᔽ", "ᔾ", "ᔿ", "ᕀ",
+               "ᕁ", "ᕂ", "ᕃ", "ᕄ", "ᕅ", "ᕆ", "ᕇ", "ᕈ", "ᕉ", "ᕊ", "ᕋ", "ᕌ", "ᕍ", "ᕎ", "ᕏ", "ᕐ",
+               "ᕑ", "ᕒ", "ᕓ", "ᕔ", "ᕕ", "ᕖ", "ᕗ", "ᕘ", "ᕙ", "ᕚ", "ᕛ", "ᕜ", "ᕝ", "ᕞ", "ᕟ", "ᕠ",
+               "ᕡ", "ᕢ", "ᕣ", "ᕤ", "ᕥ", "ᕦ", "ᕧ", "ᕨ", "ᕩ", "ᕪ", "ᕫ", "ᕬ", "ᕭ", "ᕮ", "ᕯ", "ᕰ",
+               "ᕱ", "ᕲ", "ᕳ", "ᕴ", "ᕵ", "ᕶ", "ᕷ", "ᕸ", "ᕹ", "ᕺ", "ᕻ", "ᕼ", "ᕽ", "ᕾ", "ᕿ", "ᖀ",
+               "ᖁ", "ᖂ", "ᖃ", "ᖄ", "ᖅ", "ᖆ", "ᖇ", "ᖈ", "ᖉ", "ᖊ", "ᖋ", "ᖌ", "ᖍ", "ᖎ", "ᖏ", "ᖐ",
+               "ᖑ", "ᖒ", "ᖓ", "ᖔ", "ᖕ", "ᖖ", "ᖗ", "ᖘ", "ᖙ", "ᖚ", "ᖛ", "ᖜ", "ᖝ", "ᖞ", "ᖟ", "ᖠ",
+               "ᖡ", "ᖢ", "ᖣ", "ᖤ", "ᖥ", "ᖦ", "ᖧ", "ᖨ", "ᖩ", "ᖪ", "ᖫ", "ᖬ", "ᖭ", "ᖮ", "ᖯ", "ᖰ",
+               "ᖱ", "ᖲ", "ᖳ", "ᖴ", "ᖵ", "ᖶ", "ᖷ", "ᖸ", "ᖹ", "ᖺ", "ᖻ", "ᖼ", "ᖽ", "ᖾ", "ᖿ", "ᗀ",
+               "ᗁ", "ᗂ", "ᗃ", "ᗄ", "ᗅ", "ᗆ", "ᗇ", "ᗈ", "ᗉ", "ᗊ", "ᗋ", "ᗌ", "ᗍ", "ᗎ", "ᗏ", "ᗐ",
+               "ᗑ", "ᗒ", "ᗓ", "ᗔ", "ᗕ", "ᗖ", "ᗗ", "ᗘ", "ᗙ", "ᗚ", "ᗛ", "ᗜ", "ᗝ", "ᗞ", "ᗟ", "ᗠ",
+               "ᗡ", "ᗢ", "ᗣ", "ᗤ", "ᗥ", "ᗦ", "ᗧ", "ᗨ", "ᗩ", "ᗪ", "ᗫ", "ᗬ", "ᗭ", "ᗮ", "ᗯ", "ᗰ",
+               "ᗱ", "ᗲ", "ᗳ", "ᗴ", "ᗵ", "ᗶ", "ᗷ", "ᗸ", "ᗹ", "ᗺ", "ᗻ", "ᗼ", "ᗽ", "ᗾ", "ᗿ", "ᘀ",
+               "ᘁ", "ᘂ", "ᘃ", "ᘄ", "ᘅ", "ᘆ", "ᘇ", "ᘈ", "ᘉ", "ᘊ", "ᘋ", "ᘌ", "ᘍ", "ᘎ", "ᘏ", "ᘐ",
+               "ᘑ", "ᘒ", "ᘓ", "ᘔ", "ᘕ", "ᘖ", "ᘗ", "ᘘ", "ᘙ", "ᘚ", "ᘛ", "ᘜ", "ᘝ", "ᘞ", "ᘟ", "ᘠ",
+               "ᘡ", "ᘢ", "ᘣ", "ᘤ", "ᘥ", "ᘦ", "ᘧ", "ᘨ", "ᘩ", "ᘪ", "ᘫ", "ᘬ", "ᘭ", "ᘮ", "ᘯ", "ᘰ",
+               "ᘱ", "ᘲ", "ᘳ", "ᘴ", "ᘵ", "ᘶ", "ᘷ", "ᘸ", "ᘹ", "ᘺ", "ᘻ", "ᘼ", "ᘽ", "ᘾ", "ᘿ", "ᙀ",
+               "ᙁ", "ᙂ", "ᙃ", "ᙄ", "ᙅ", "ᙆ", "ᙇ", "ᙈ", "ᙉ", "ᙊ", "ᙋ", "ᙌ", "ᙍ", "ᙎ", "ᙏ", "ᙐ",
+               "ᙑ", "ᙒ", "ᙓ", "ᙔ", "ᙕ", "ᙖ", "ᙗ", "ᙘ", "ᙙ", "ᙚ", "ᙛ", "ᙜ", "ᙝ", "ᙞ", "ᙟ", "ᙠ",
+               "ᙡ", "ᙢ", "ᙣ", "ᙤ", "ᙥ", "ᙦ", "ᙧ", "ᙨ", "ᙩ", "ᙪ", "ᙫ", "ᙬ", "᙭", "᙮", "ᙯ", "ᙰ",
+               "ᙱ", "ᙲ", "ᙳ", "ᙴ", "ᙵ", "ᙶ"
        ]
 }
index 7c2f92b..b4418e5 100644 (file)
@@ -99,29 +99,30 @@ img {
  * MediaWiki-specific elements
  */
 #globalWrapper {
-       width: 100% !important;
-       min-width: 0 !important;
+       width: 100% !important; /* stylelint-disable-line declaration-no-important */
+       min-width: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .mw-body {
        background: #fff;
        color: #000;
-       border: 0 !important;
-       padding: 0 !important;
-       margin: 0 !important;
+       border: 0 !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
        direction: ltr;
 }
 
 #column-content {
-       margin: 0 !important;
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 #column-content .mw-body {
        padding: 1em;
-       margin: 0 !important;
+       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
-#toc {
+#toc,
+.toc {
        background-color: #f9f9f9;
        border: 1pt solid #aaa;
        padding: 5px;
@@ -164,22 +165,22 @@ img {
  * Links
  */
 a {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 /* Expand URLs for printing */
-.mw-body a.external.text:after,
-.mw-body a.external.autonumber:after {
-       content: " (" attr( href ) ")";
+.mw-body-content a.external.text:after,
+.mw-body-content a.external.autonumber:after {
+       content: ' (' attr( href ) ')';
        word-break: break-all;
        word-wrap: break-word;
 }
 
 /* Expand protocol-relative URLs for printing */
-.mw-body a.external.text[href^='//']:after,
-.mw-body a.external.autonumber[href^='//']:after {
-       content: " (https:" attr( href ) ")";
+.mw-body-content a.external.text[href^='//']:after,
+.mw-body-content a.external.autonumber[href^='//']:after {
+       content: ' (https:' attr( href ) ')';
 }
 
 a,
@@ -187,11 +188,11 @@ a.external,
 a.new,
 a.stub {
        /* IE 6 & 7 don't understand `inherit` */
-       color: #000 !important;
-       text-decoration: none !important;
+       color: #000 !important; /* stylelint-disable-line declaration-no-important */
+       text-decoration: none !important; /* stylelint-disable-line declaration-no-important */
        /* Modern browser will apply this, IE 6 & 7 ignore the unknown */
-       color: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties */
-       text-decoration: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties */
+       color: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties, declaration-no-important */
+       text-decoration: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties, declaration-no-important */
 }
 
 /**
index 7c4dbb1..7b2d711 100644 (file)
@@ -459,4 +459,4 @@ html > body.rtl .mw-body ul#filetoc {
        display: block;
 }
 
-/* RTL specific CSS ends here **/
+/** RTL specific CSS ends here **/
index 8f4ac7d..8839a2c 100644 (file)
@@ -56,22 +56,22 @@ wbr {
 
 /* Input types that should follow user direction, like buttons */
 /* TODO: What about buttons in wikipage content ? */
-input[type="submit"],
-input[type="button"],
-input[type="reset"],
-input[type="file"] {
+input[type='submit'],
+input[type='button'],
+input[type='reset'],
+input[type='file'] {
        direction: ltr;
 }
 
 /* Override default values */
-textarea[dir="ltr"],
-input[dir="ltr"] {
+textarea[dir='ltr'],
+input[dir='ltr'] {
        /* @noflip */
        direction: ltr;
 }
 
-textarea[dir="rtl"],
-input[dir="rtl"] {
+textarea[dir='rtl'],
+input[dir='rtl'] {
        /* @noflip */
        direction: rtl;
 }
@@ -322,11 +322,26 @@ a.new {
        color: #ba0000;
 }
 
+/* self links */
+a.mw-selflink {
+       color: inherit;
+       font-weight: bold;
+       text-decoration: inherit;
+}
+a.mw-selflink:hover {
+       cursor: inherit;
+       text-decoration: inherit;
+}
+a.mw-selflink:active,
+a.mw-selflink:visited {
+       color: inherit;
+}
+
 /* Plainlinks - this can be used to switch
  * off special external link styling */
 .plainlinks a.external {
-       background: none !important;
-       padding: 0 !important;
+       background: none !important; /* stylelint-disable-line declaration-no-important */
+       padding: 0 !important; /* stylelint-disable-line declaration-no-important */
 }
 
 /* External URLs should always be treated as LTR (T6330) */
@@ -540,7 +555,7 @@ table.wikitable > caption {
 }
 
 .mw-small-spinner {
-       padding: 10px !important;
+       padding: 10px !important; /* stylelint-disable-line declaration-no-important */
        margin-right: 0.6em;
        background-image: url( images/spinner.gif );
        background-position: center center;
@@ -570,7 +585,7 @@ h1:lang( pi ),
 h1:lang( sa ),
 h1:lang( ta ),
 h1:lang( te ) {
-       line-height: 1.6em !important;
+       line-height: 1.6em !important; /* stylelint-disable-line declaration-no-important */
 }
 
 /* stylelint-disable selector-list-comma-newline-after */
@@ -621,7 +636,8 @@ ol:lang( sdh ) li {
 }
 
 ol:lang( hi ) li,
-ol:lang( mr ) li {
+ol:lang( mr ) li,
+ol:lang( ne ) li {
        list-style-type: -moz-devanagari;
        list-style-type: devanagari;
 }
index 8062849..6eccc05 100644 (file)
  */
 ( function ( mw, $ ) {
        var msg,
-               win = window,
-               ua = navigator.userAgent.toLowerCase(),
-               onloadFuncts = [],
                loadedScripts = {};
 
-       /**
-        * User-agent sniffing.
-        *
-        * @deprecated since 1.17 Use jquery.client instead
-        */
-
-       msg = 'Use feature detection or module jquery.client instead.';
-
-       mw.log.deprecate( win, 'clientPC', ua, msg );
-
-       // Ignored dummy values
-       mw.log.deprecate( win, 'is_gecko', false, msg );
-       mw.log.deprecate( win, 'is_chrome_mac', false, msg );
-       mw.log.deprecate( win, 'is_chrome', false, msg );
-       mw.log.deprecate( win, 'webkit_version', false, msg );
-       mw.log.deprecate( win, 'is_safari_win', false, msg );
-       mw.log.deprecate( win, 'is_safari', false, msg );
-       mw.log.deprecate( win, 'webkit_match', false, msg );
-       mw.log.deprecate( win, 'is_ff2', false, msg );
-       mw.log.deprecate( win, 'ff2_bugs', false, msg );
-       mw.log.deprecate( win, 'is_ff2_win', false, msg );
-       mw.log.deprecate( win, 'is_ff2_x11', false, msg );
-       mw.log.deprecate( win, 'opera95_bugs', false, msg );
-       mw.log.deprecate( win, 'opera7_bugs', false, msg );
-       mw.log.deprecate( win, 'opera6_bugs', false, msg );
-       mw.log.deprecate( win, 'is_opera_95', false, msg );
-       mw.log.deprecate( win, 'is_opera_preseven', false, msg );
-       mw.log.deprecate( win, 'is_opera', false, msg );
-       mw.log.deprecate( win, 'ie6_bugs', false, msg );
+       function wikiUrlencode( page ) {
+               return encodeURIComponent( String( page ) )
+                       .replace( /'/g, '%27' )
+                       .replace( /%20/g, '_' )
+                       // wfUrlencode replacements
+                       .replace( /%3B/g, ';' )
+                       .replace( /%40/g, '@' )
+                       .replace( /%24/g, '$' )
+                       .replace( /%21/g, '!' )
+                       .replace( /%2A/g, '*' )
+                       .replace( /%28/g, '(' )
+                       .replace( /%29/g, ')' )
+                       .replace( /%2C/g, ',' )
+                       .replace( /%2F/g, '/' )
+                       .replace( /%7E/g, '~' )
+                       .replace( /%3A/g, ':' );
+       }
 
        /**
-        * DOM utilities for handling of events, text nodes and selecting elements
-        *
         * @deprecated since 1.17 Use jQuery instead
         */
-       msg = 'Use jQuery instead.';
-
-       // Ignored dummy values
-       mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
-       mw.log.deprecate( win, 'onloadFuncts', [], msg );
-       mw.log.deprecate( win, 'runOnloadHook', $.noop, msg );
-       mw.log.deprecate( win, 'changeText', $.noop, msg );
-       mw.log.deprecate( win, 'killEvt', $.noop, msg );
-       mw.log.deprecate( win, 'addHandler', $.noop, msg );
-       mw.log.deprecate( win, 'hookEvent', $.noop, msg );
-       mw.log.deprecate( win, 'addClickHandler', $.noop, msg );
-       mw.log.deprecate( win, 'removeHandler', $.noop, msg );
-       mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg );
-       mw.log.deprecate( win, 'getInnerText', function () { return ''; }, msg );
-
-       // Run a function after the window onload event is fired
-       mw.log.deprecate( win, 'addOnloadHook', function ( hookFunct ) {
-               if ( onloadFuncts ) {
-                       onloadFuncts.push( hookFunct );
-               } else {
-                       // If func queue is gone the event has happened already,
-                       // run immediately instead of queueing.
-                       hookFunct();
-               }
-       }, msg );
-
-       $( win ).on( 'load', function () {
-               var i, functs;
-
-               // Don't run twice
-               if ( !onloadFuncts ) {
-                       return;
-               }
-
-               // Deference and clear onloadFuncts before running any
-               // hooks to make sure we don't miss any addOnloadHook
-               // calls.
-               functs = onloadFuncts.slice();
-               onloadFuncts = undefined;
-
-               // Execute the queued functions
-               for ( i = 0; i < functs.length; i++ ) {
-                       functs[ i ]();
-               }
-       } );
-
-       /**
-        * Toggle checkboxes with shift selection
-        *
-        * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
-        */
-       msg = 'Use jquery.checkboxShiftClick instead.';
-       mw.log.deprecate( win, 'checkboxes', [], msg );
-       mw.log.deprecate( win, 'lastCheckbox', null, msg );
-       mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
-       mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg );
-       mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
-
-       /**
-        * Add a button to the default editor toolbar
-        *
-        * @deprecated since 1.17 Use mw.toolbar instead
-        */
-       mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
-       mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
-
-       /**
-        * Spinner creation, injection and removal
-        *
-        * @deprecated since 1.18 Use jquery.spinner instead
-        */
-       mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
-       mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
-
-       /**
-        * Escape utilities
-        *
-        * @deprecated since 1.18 Use mw.html instead
-        */
-       mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
-       mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
-
-       /**
-        * Display a message to the user
-        *
-        * @deprecated since 1.17 Use mediawiki.notify instead
-        * @param {string|HTMLElement} message To be put inside the message box
-        */
-       mw.log.deprecate( win, 'jsMsg', function ( message ) {
-               if ( !arguments.length || message === '' || message === null ) {
-                       return true;
-               }
-               if ( typeof message !== 'object' ) {
-                       message = $.parseHTML( message );
-               }
-               mw.notify( message, { autoHide: true, tag: 'legacy' } );
-               return true;
-       }, 'Use mediawiki.notify instead.' );
-
-       /**
-        * Misc. utilities
-        *
-        * @deprecated since 1.17 Use mediawiki.util or jquery.accessKeyLabel instead
-        */
-       msg = 'Use mediawiki.util instead.';
-       mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
-       mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
-       msg = 'Use jquery.accessKeyLabel instead.';
-       mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
-       mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
-       // mw.util.updateTooltipAccessKeys already generates a deprecation message.
-       win.updateTooltipAccessKeys = function () {
-               return mw.util.updateTooltipAccessKeys.apply( null, arguments );
-       };
+       mw.log.deprecate( window, 'addOnloadHook', function ( fn ) {
+               $( function () { fn(); } );
+       }, 'Use jQuery instead.' );
 
        /**
         * Wikipage import methods
        }
 
        function importScript( page ) {
-               var uri = mw.config.get( 'wgScript' ) + '?title=' +
-                       mw.util.wikiUrlencode( page ) +
+               var uri = mw.config.get( 'wgScript' ) + '?title=' + wikiUrlencode( page ) +
                        '&action=raw&ctype=text/javascript';
                return importScriptURI( uri );
        }
        }
 
        function importStylesheet( page ) {
-               var uri = mw.config.get( 'wgScript' ) + '?title=' +
-                       mw.util.wikiUrlencode( page ) +
+               var uri = mw.config.get( 'wgScript' ) + '?title=' + wikiUrlencode( page ) +
                        '&action=raw&ctype=text/css';
                return importStylesheetURI( uri );
        }
 
        msg = 'Use mw.loader instead.';
-       mw.log.deprecate( win, 'loadedScripts', loadedScripts, msg );
-       mw.log.deprecate( win, 'importScriptURI', importScriptURI, msg );
-       mw.log.deprecate( win, 'importStylesheetURI', importStylesheetURI, msg );
+       mw.log.deprecate( window, 'loadedScripts', loadedScripts, msg );
+       mw.log.deprecate( window, 'importScriptURI', importScriptURI, msg );
+       mw.log.deprecate( window, 'importStylesheetURI', importStylesheetURI, msg );
        // Not quite deprecated yet.
-       win.importScript = importScript;
-       win.importStylesheet = importStylesheet;
+       window.importScript = importScript;
+       window.importStylesheet = importStylesheet;
 
-       // Replace document.write/writeln with basic html parsing that appends
-       // to the <body> to avoid blanking pages. Added JavaScript will not run.
+       /**
+        * Replace document.write/writeln with basic html parsing that appends
+        * to the <body> to avoid blanking pages. Added JavaScript will not run.
+        *
+        * @deprecated since 1.26
+        */
        $.each( [ 'write', 'writeln' ], function ( idx, method ) {
                mw.log.deprecate( document, method, function () {
                        $( 'body' ).append( $.parseHTML( Array.prototype.join.call( arguments, '' ) ) );
index 4cca1a6..fb3b00e 100644 (file)
@@ -1,7 +1,7 @@
 // Common Less mixin library for MediaWiki
 //
 // By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
-// which makes this file importable by all less files via '@import "mediawiki.mixins";'.
+// which makes this file importable by all less files via `@import 'mediawiki.mixins';`.
 //
 // The mixins included below are considered a public interface for MediaWiki extensions.
 // The signatures of parametrized mixins should be kept as stable as possible.
        background-image: -o-linear-gradient( transparent, transparent ), url( @fallback );
 }
 
+// Shorthand for background-image-svg. Use if your PNG and SVG have the same name
+// and only if you cannot use ResourceLoaderImage module for some particular reason.
+.background-image-svg-quick( @url ) {
+       .background-image-svg( ~'@{url}.svg', ~'@{url}.png' );
+}
+
 .list-style-image( @url ) {
        list-style-image: e( '/* @embed */' ) url( @url );
 }
        list-style-image: e( '/* @embed */' ) url( @fallback ) e( '\9' );
 }
 
+.transform( @value ) {
+       -webkit-transform: @value; // Safari 3.1-8.0, iOS 3.2-8.4, Android 2.1-4.4.4
+       -moz-transform: @value; // Firefox 3.5-15
+       transform: @value; // Chrome 36+, Firefox 16+, IE 10+, Safari 9+, Opera 23+, iOS 9.2+, Android 5+
+}
+
 .transition( @value ) {
        -webkit-transition: @value; // Safari 3.1-6.0, iOS 3.2-6.1, Android 2.1-4.3
        -moz-transition: @value; // Firefox 4-15
        transition: @value; // Chrome 26+, Firefox 16+, IE 10+, Safari 6.1+, Opera 12.1+, iOS 7+, Android 4.4+
 }
 
+// Provide a hardware accelerated transform transition
+// We can't use `.transition()` because WebKit requires `-webkit-` prefix before `transform`
+// Example usage: `.transition-transform( 1s, opacity 2s );`
+// First parameter is additional options for `transform` transition commencing with
+// duration property @see https://www.w3.org/TR/css3-transitions/#transition-duration-property
+// and remaining parameters are additional transitions."
+.transition-transform( ... ) {
+       -webkit-backface-visibility: hidden; // Older Webkit browsers: Promote element to a composite layer & involve the GPU
+
+       -webkit-transition: -webkit-transform @arguments; // Safari 3.1-8, iOS 3.2-8.4, Android 2.1-4.4.4
+       -moz-transition: -moz-transform @arguments; // Firefox 4-15 for `-moz-transition`
+       transition: transform @arguments; // Chrome 36+, Firefox 16+, IE 10+, Safari 9+, Opera 12.1+, iOS 9.2+, Android 36+
+}
+
 .box-sizing( @value ) {
        -webkit-box-sizing: @value; // Safari 3.1-5.0, iOS 3.2-4.3, Android 2.1-3.0
        -moz-box-sizing: @value; // Firefox 4-28,
 }
 
 .flex-display( @display: flex ) {
-       display: ~"-webkit-@{display}"; // iOS 6-, Safari 3.1-6
-       display: ~"-moz-@{display}"; // Firefox 21-
-       display: ~"-ms-@{display}box"; // IE 10
+       display: ~'-webkit-@{display}'; // iOS 6-, Safari 3.1-6
+       display: ~'-moz-@{display}'; // Firefox 21-
+       display: ~'-ms-@{display}box'; // IE 10
        display: @display;
 }
 
 // Screen Reader Helper Mixin
 .mixin-screen-reader-text() {
        display: block;
-       position: absolute !important;
+       position: absolute !important; /* stylelint-disable-line declaration-no-important */
        clip: rect( 1px, 1px, 1px, 1px );
        width: 1px;
        height: 1px;
index a404286..64d6b3d 100644 (file)
@@ -1,7 +1,7 @@
 // This is a separate file because importing the mixin causes
 // the keyframes blocks to be included in the output, regardless
 // of whether .rotation is used.
-@import "mediawiki.mixins.animation";
+@import 'mediawiki.mixins.animation';
 
 .rotate-frames() {
        from {
index 1bfa3a3..a0ff767 100644 (file)
@@ -17,8 +17,8 @@
        line-height: normal;
        font-weight: normal;
 
-       & > input[type="checkbox"],
-       & > input[type="radio"] {
+       & > input[type='checkbox'],
+       & > input[type='radio'] {
                width: auto;
                height: auto;
                margin: 0 0.1em 0 0;
index b3ed88c..67460ad 100644 (file)
@@ -10,7 +10,7 @@
  * - Add mw.libs.jpegmeta wrapper.
  */
 
-( function () {
+( function ( mw ) {
        /*
        Copyright (c) 2009 Ben Leslie
        
                return new JpegMeta.JpegFile( fileReaderResult, fileName );
        };
 
-}() );
+}( mediaWiki ) );
index edb6744..d6ce734 100644 (file)
         * Update the model with an updated list of changes
         *
         * @param {jQuery|string} changesListContent
+        * @param {jQuery} $fieldset
         */
-       mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent ) {
+       mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent, $fieldset ) {
                this.valid = true;
-               this.emit( 'update', changesListContent );
+               this.emit( 'update', changesListContent, $fieldset );
        };
 
 }( mediaWiki ) );
index 14a610b..59c0a19 100644 (file)
         * @cfg {string} [separator='|'] Value separator for 'string_options' groups
         * @cfg {boolean} [active] Group is active
         * @cfg {boolean} [fullCoverage] This filters in this group collectively cover all results
+        * @cfg {Object} [conflicts] Defines the conflicts for this filter group
+        * @cfg {Object} [whatsThis] Defines the messages that should appear for the 'what's this' popup
+        * @cfg {string} [whatsThis.header] The header of the whatsThis popup message
+        * @cfg {string} [whatsThis.body] The body of the whatsThis popup message
+        * @cfg {string} [whatsThis.url] The url for the link in the whatsThis popup message
+        * @cfg {string} [whatsThis.linkMessage] The text for the link in the whatsThis popup message
         */
        mw.rcfilters.dm.FilterGroup = function MwRcfiltersDmFilterGroup( name, config ) {
                config = config || {};
                this.active = !!config.active;
                this.fullCoverage = !!config.fullCoverage;
 
+               this.whatsThis = config.whatsThis || {};
+
+               this.conflicts = config.conflicts || {};
+               this.defaultParams = {};
+
                this.aggregate( { update: 'filterItemUpdate' } );
                this.connect( this, { filterItemUpdate: 'onFilterItemUpdate' } );
        };
 
        /* Methods */
 
+       /**
+        * Initialize the group and create its filter items
+        *
+        * @param {Object} filterDefinition Filter definition for this group
+        * @param {string|Object} [groupDefault] Definition of the group default
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.initializeFilters = function ( filterDefinition, groupDefault ) {
+               var supersetMap = {},
+                       model = this,
+                       items = [];
+
+               filterDefinition.forEach( function ( filter ) {
+                       // Instantiate an item
+                       var subsetNames = [],
+                               filterItem = new mw.rcfilters.dm.FilterItem( filter.name, model, {
+                                       group: model.getName(),
+                                       label: mw.msg( filter.label ),
+                                       description: mw.msg( filter.description ),
+                                       cssClass: filter.cssClass
+                               } );
+
+                       filter.subset = filter.subset || [];
+                       filter.subset = filter.subset.map( function ( el ) {
+                               return el.filter;
+                       } );
+
+                       if ( filter.subset ) {
+                               subsetNames = [];
+                               filter.subset.forEach( function ( subsetFilterName ) { // eslint-disable-line no-loop-func
+                                       // Subsets (unlike conflicts) are always inside the same group
+                                       // We can re-map the names of the filters we are getting from
+                                       // the subsets with the group prefix
+                                       var subsetName = model.getPrefixedName( subsetFilterName );
+                                       // For convenience, we should store each filter's "supersets" -- these are
+                                       // the filters that have that item in their subset list. This will just
+                                       // make it easier to go through whether the item has any other items
+                                       // that affect it (and are selected) at any given time
+                                       supersetMap[ subsetName ] = supersetMap[ subsetName ] || [];
+                                       mw.rcfilters.utils.addArrayElementsUnique(
+                                               supersetMap[ subsetName ],
+                                               filterItem.getName()
+                                       );
+
+                                       // Translate subset param name to add the group name, so we
+                                       // get consistent naming. We know that subsets are only within
+                                       // the same group
+                                       subsetNames.push( subsetName );
+                               } );
+
+                               // Set translated subset
+                               filterItem.setSubset( subsetNames );
+                       }
+
+                       items.push( filterItem );
+
+                       // Store default parameter state; in this case, default is defined per filter
+                       if ( model.getType() === 'send_unselected_if_any' ) {
+                               // Store the default parameter state
+                               // For this group type, parameter values are direct
+                               // We need to convert from a boolean to a string ('1' and '0')
+                               model.defaultParams[ filter.name ] = String( Number( !!filter.default ) );
+                       }
+               } );
+
+               // Add items
+               this.addItems( items );
+
+               // Now that we have all items, we can apply the superset map
+               this.getItems().forEach( function ( filterItem ) {
+                       filterItem.setSuperset( supersetMap[ filterItem.getName() ] );
+               } );
+
+               // Store default parameter state; in this case, default is defined per the
+               // entire group, given by groupDefault method parameter
+               if ( this.getType() === 'string_options' ) {
+                       // Store the default parameter group state
+                       // For this group, the parameter is group name and value is the names
+                       // of selected items
+                       this.defaultParams[ this.getName() ] = mw.rcfilters.utils.normalizeParamOptions(
+                               // Current values
+                               groupDefault ?
+                                       groupDefault.split( this.getSeparator() ) :
+                                       [],
+                               // Legal values
+                               this.getItems().map( function ( item ) {
+                                       return item.getParamName();
+                               } )
+                       ).join( this.getSeparator() );
+               }
+       };
+
        /**
         * Respond to filterItem update event
         *
                return this.name;
        };
 
+       /**
+        * Get the default param state of this group
+        *
+        * @return {Object} Default param state
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getDefaultParams = function () {
+               return this.defaultParams;
+       };
+
+       /**
+        * Get the messags defining the 'whats this' popup for this group
+        *
+        * @return {Object} What's this messages
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getWhatsThis = function () {
+               return this.whatsThis;
+       };
+
+       /**
+        * Check whether this group has a 'what's this' message
+        *
+        * @return {boolean} This group has a what's this message
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.hasWhatsThis = function () {
+               return !!this.whatsThis.body;
+       };
+
+       /**
+        * Get the conflicts associated with the entire group.
+        * Conflict object is set up by filter name keys and conflict
+        * definition. For example:
+        * [
+        *              {
+        *                      filterName: {
+        *                              filter: filterName,
+        *                              group: group1
+        *                      }
+        *              },
+        *              {
+        *                      filterName2: {
+        *                              filter: filterName2,
+        *                              group: group2
+        *                      }
+        *              }
+        * ]
+        * @return {Object} Conflict definition
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getConflicts = function () {
+               return this.conflicts;
+       };
+
+       /**
+        * Set conflicts for this group. See #getConflicts for the expected
+        * structure of the definition.
+        *
+        * @param {Object} conflicts Conflicts for this group
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.setConflicts = function ( conflicts ) {
+               this.conflicts = conflicts;
+       };
+
+       /**
+        * Set conflicts for each filter item in the group based on the
+        * given conflict map
+        *
+        * @param {Object} conflicts Object representing the conflict map,
+        *  keyed by the item name, where its value is an object for all its conflicts
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.setFilterConflicts = function ( conflicts ) {
+               this.getItems().forEach( function ( filterItem ) {
+                       if ( conflicts[ filterItem.getName() ] ) {
+                               filterItem.setConflicts( conflicts[ filterItem.getName() ] );
+                       }
+               } );
+       };
+
+       /**
+        * Check whether this item has a potential conflict with the given item
+        *
+        * This checks whether the given item is in the list of conflicts of
+        * the current item, but makes no judgment about whether the conflict
+        * is currently at play (either one of the items may not be selected)
+        *
+        * @param {mw.rcfilters.dm.FilterItem} filterItem Filter item
+        * @return {boolean} This item has a conflict with the given item
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.existsInConflicts = function ( filterItem ) {
+               return Object.prototype.hasOwnProperty.call( this.getConflicts(), filterItem.getName() );
+       };
+
        /**
         * Check whether there are any items selected
         *
         * @return {boolean} All items are selected
         */
        mw.rcfilters.dm.FilterGroup.prototype.areAllSelected = function () {
-               return this.getItems().every( function ( filterItem ) {
-                       return filterItem.isSelected();
+               var selected = [],
+                       unselected = [];
+
+               this.getItems().forEach( function ( filterItem ) {
+                       if ( filterItem.isSelected() ) {
+                               selected.push( filterItem );
+                       } else {
+                               unselected.push( filterItem );
+                       }
+               } );
+
+               if ( unselected.length === 0 ) {
+                       return true;
+               }
+
+               // check if every unselected is a subset of a selected
+               return unselected.every( function ( unselectedFilterItem ) {
+                       return selected.some( function ( selectedFilterItem ) {
+                               return selectedFilterItem.existsInSubset( unselectedFilterItem.getName() );
+                       } );
                } );
        };
 
        mw.rcfilters.dm.FilterGroup.prototype.areAllSelectedInConflictWith = function ( filterItem ) {
                var selectedItems = this.getSelectedItems( filterItem );
 
-               return selectedItems.length > 0 && selectedItems.every( function ( selectedFilter ) {
-                       return selectedFilter.existsInConflicts( filterItem );
-               } );
+               return selectedItems.length > 0 &&
+                       (
+                               // The group as a whole is in conflict with this item
+                               this.existsInConflicts( filterItem ) ||
+                               // All selected items are in conflict individually
+                               selectedItems.every( function ( selectedFilter ) {
+                                       return selectedFilter.existsInConflicts( filterItem );
+                               } )
+                       );
        };
 
        /**
        mw.rcfilters.dm.FilterGroup.prototype.areAnySelectedInConflictWith = function ( filterItem ) {
                var selectedItems = this.getSelectedItems( filterItem );
 
-               return selectedItems.length > 0 && selectedItems.some( function ( selectedFilter ) {
-                       return selectedFilter.existsInConflicts( filterItem );
+               return selectedItems.length > 0 && (
+                       // The group as a whole is in conflict with this item
+                       this.existsInConflicts( filterItem ) ||
+                       // Any selected items are in conflict individually
+                       selectedItems.some( function ( selectedFilter ) {
+                               return selectedFilter.existsInConflicts( filterItem );
+                       } )
+               );
+       };
+
+       /**
+        * Get the parameter representation from this group
+        *
+        * @param {Object} [filterRepresentation] An object defining the state
+        *  of the filters in this group, keyed by their name and current selected
+        *  state value.
+        * @return {Object} Parameter representation
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getParamRepresentation = function ( filterRepresentation ) {
+               var values,
+                       areAnySelected = false,
+                       buildFromCurrentState = !filterRepresentation,
+                       result = {},
+                       filterParamNames = {};
+
+               filterRepresentation = filterRepresentation || {};
+
+               // Create or complete the filterRepresentation definition
+               this.getItems().forEach( function ( item ) {
+                       // Map filter names to their parameter names
+                       filterParamNames[ item.getName() ] = item.getParamName();
+
+                       if ( buildFromCurrentState ) {
+                               // This means we have not been given a filter representation
+                               // so we are building one based on current state
+                               filterRepresentation[ item.getName() ] = item.isSelected();
+                       } else if ( !filterRepresentation[ item.getName() ] ) {
+                               // We are given a filter representation, but we have to make
+                               // sure that we fill in the missing filters if there are any
+                               // we will assume they are all falsey
+                               filterRepresentation[ item.getName() ] = false;
+                       }
+
+                       if ( filterRepresentation[ item.getName() ] ) {
+                               areAnySelected = true;
+                       }
+               } );
+
+               // Build result
+               if ( this.getType() === '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
+
+                       // Go over the items and define the correct values
+                       $.each( filterRepresentation, function ( name, value ) {
+                               result[ filterParamNames[ name ] ] = areAnySelected ?
+                                       // We must store all parameter values as strings '0' or '1'
+                                       String( Number( !value ) ) :
+                                       '0';
+                       } );
+               } else if ( this.getType() === 'string_options' ) {
+                       values = [];
+
+                       $.each( filterRepresentation, function ( name, value ) {
+                               // Collect values
+                               if ( value ) {
+                                       values.push( filterParamNames[ name ] );
+                               }
+                       } );
+
+                       result[ this.getName() ] = ( values.length === Object.keys( filterRepresentation ).length ) ?
+                               'all' : values.join( this.getSeparator() );
+               }
+
+               return result;
+       };
+
+       /**
+        * Get the filter representation this group would provide
+        * based on given parameter states.
+        *
+        * @param {Object|string} [paramRepresentation] An object defining a parameter
+        *  state to translate the filter state from. If not given, an object
+        *  representing all filters as falsey is returned; same as if the parameter
+        *  given were an empty object, or had some of the filters missing.
+        * @return {Object} Filter representation
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getFilterRepresentation = function ( paramRepresentation ) {
+               var areAnySelected, paramValues,
+                       model = this,
+                       paramToFilterMap = {},
+                       result = {};
+
+               if ( this.getType() === 'send_unselected_if_any' ) {
+                       paramRepresentation = paramRepresentation || {};
+                       // Expand param representation to include all filters in the group
+                       this.getItems().forEach( function ( filterItem ) {
+                               var paramName = filterItem.getParamName();
+
+                               paramRepresentation[ paramName ] = paramRepresentation[ paramName ] || '0';
+                               paramToFilterMap[ paramName ] = filterItem;
+
+                               if ( Number( paramRepresentation[ filterItem.getParamName() ] ) ) {
+                                       areAnySelected = true;
+                               }
+                       } );
+
+                       $.each( paramRepresentation, function ( paramName, paramValue ) {
+                               var filterItem = paramToFilterMap[ paramName ];
+
+                               result[ filterItem.getName() ] = areAnySelected ?
+                                       // Flip the definition between the parameter
+                                       // state and the filter state
+                                       // This is what the 'toggleSelected' value of the filter is
+                                       !Number( paramValue ) :
+                                       // Otherwise, there are no selected items in the
+                                       // group, which means the state is false
+                                       false;
+                       } );
+               } else if ( this.getType() === 'string_options' ) {
+                       paramRepresentation = paramRepresentation || '';
+
+                       // Normalize the given parameter values
+                       paramValues = mw.rcfilters.utils.normalizeParamOptions(
+                               // Given
+                               paramRepresentation.split(
+                                       this.getSeparator()
+                               ),
+                               // Allowed values
+                               this.getItems().map( function ( filterItem ) {
+                                       return filterItem.getParamName();
+                               } )
+                       );
+                       // Translate the parameter values into a filter selection state
+                       this.getItems().forEach( function ( filterItem ) {
+                               result[ filterItem.getName() ] = (
+                                               // If it is the word 'all'
+                                               paramValues.length === 1 && paramValues[ 0 ] === 'all' ||
+                                               // All values are written
+                                               paramValues.length === model.getItemCount()
+                                       ) ?
+                                       // All true (either because all values are written or the term 'all' is written)
+                                       // is the same as all filters set to true
+                                       true :
+                                       // Otherwise, the filter is selected only if it appears in the parameter values
+                                       paramValues.indexOf( filterItem.getParamName() ) > -1;
+                       } );
+               }
+
+               // Go over result and make sure all filters are represented.
+               // If any filters are missing, they will get a falsey value
+               this.getItems().forEach( function ( filterItem ) {
+                       result[ filterItem.getName() ] = !!result[ filterItem.getName() ];
                } );
+
+               return result;
+       };
+
+       /**
+        * Get item by its parameter name
+        *
+        * @param {string} paramName Parameter name
+        * @return {mw.rcfilters.dm.FilterItem} Filter item
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getItemByParamName = function ( paramName ) {
+               return this.getItems().filter( function ( item ) {
+                       return item.getParamName() === paramName;
+               } )[ 0 ];
        };
 
        /**
                return this.type;
        };
 
+       /**
+        * Get the prefix used for the filter names inside this group.
+        *
+        * @param {string} [name] Filter name to prefix
+        * @return {string} Group prefix
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getNamePrefix = function () {
+               return this.getName() + '__';
+       };
+
+       /**
+        * Get a filter name with the prefix used for the filter names inside this group.
+        *
+        * @param {string} name Filter name to prefix
+        * @return {string} Group prefix
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getPrefixedName = function ( name ) {
+               return this.getNamePrefix() + name;
+       };
+
        /**
         * Get group's title
         *
index 675f4b5..4e2079d 100644 (file)
        /**
         * Filter item model
         *
-        * @mixins OO.EventEmitter
+        * @extends mw.rcfilters.dm.ItemModel
         *
         * @constructor
-        * @param {string} name Filter name
+        * @param {string} param Filter param name
         * @param {mw.rcfilters.dm.FilterGroup} groupModel Filter group model
         * @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} [selected] The item is selected
         * @cfg {string[]} [subset] Defining the names of filters that are a subset of this filter
-        * @cfg {string[]} [conflictsWith] Defining the names of filters that conflict with this item
-        * @cfg {string} [cssClass] The class identifying the results that match this filter
+        * @cfg {Object} [conflicts] Defines the conflicts for this filter
         */
-       mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( name, groupModel, config ) {
+       mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( param, groupModel, config ) {
                config = config || {};
 
-               // Mixin constructor
-               OO.EventEmitter.call( this );
-
-               this.name = name;
                this.groupModel = groupModel;
 
-               this.label = config.label || this.name;
-               this.description = config.description;
-               this.selected = !!config.selected;
+               // Parent
+               mw.rcfilters.dm.FilterItem.parent.call( this, param, $.extend( {
+                       namePrefix: this.groupModel.getNamePrefix()
+               }, config ) );
+               // Mixin constructor
+               OO.EventEmitter.call( this );
 
                // Interaction definitions
                this.subset = config.subset || [];
-               this.conflicts = config.conflicts || [];
+               this.conflicts = config.conflicts || {};
                this.superset = [];
 
                // Interaction states
                this.included = false;
                this.conflicted = false;
                this.fullyCovered = false;
-
-               // Highlight
-               this.cssClass = config.cssClass;
-               this.highlightColor = null;
-               this.highlightEnabled = false;
        };
 
        /* 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
-        */
+       OO.inheritClass( mw.rcfilters.dm.FilterItem, mw.rcfilters.dm.ItemModel );
 
        /* Methods */
 
        /**
-        * Get the name of this filter
+        * Return the representation of the state of this item.
         *
-        * @return {string} Filter name
+        * @return {Object} State of the object
         */
-       mw.rcfilters.dm.FilterItem.prototype.getName = function () {
-               return this.name;
+       mw.rcfilters.dm.FilterItem.prototype.getState = function () {
+               return {
+                       selected: this.isSelected(),
+                       included: this.isIncluded(),
+                       conflicted: this.isConflicted(),
+                       fullyCovered: this.isFullyCovered()
+               };
        };
 
        /**
-        * Get the model of the group this filter belongs to
+        * Get the message for the display area for the currently active conflict
         *
-        * @return {mw.rcfilters.dm.FilterGroup} Filter group model
+        * @private
+        * @return {string} Conflict result message key
         */
-       mw.rcfilters.dm.FilterItem.prototype.getGroupModel = function () {
-               return this.groupModel;
+       mw.rcfilters.dm.FilterItem.prototype.getCurrentConflictResultMessage = function () {
+               var details = {};
+
+               // First look in filter's own conflicts
+               details = this.getConflictDetails( this.getOwnConflicts(), 'globalDescription' );
+               if ( !details.message ) {
+                       // Fall back onto conflicts in the group
+                       details = this.getConflictDetails( this.getGroupModel().getConflicts(), 'globalDescription' );
+               }
+
+               return details.message;
        };
 
        /**
-        * Get the group name this filter belongs to
+        * Get the details of the active conflict on this filter
         *
-        * @return {string} Filter group name
+        * @private
+        * @param {Object} conflicts Conflicts to examine
+        * @param {string} [key='contextDescription'] Message key
+        * @return {Object} Object with conflict message and conflict items
+        * @return {string} return.message Conflict message
+        * @return {string[]} return.names Conflicting item labels
         */
-       mw.rcfilters.dm.FilterItem.prototype.getGroupName = function () {
-               return this.groupModel.getName();
+       mw.rcfilters.dm.FilterItem.prototype.getConflictDetails = function ( conflicts, key ) {
+               var group,
+                       conflictMessage = '',
+                       itemLabels = [];
+
+               key = key || 'contextDescription';
+
+               $.each( conflicts, function ( filterName, conflict ) {
+                       if ( !conflict.item.isSelected() ) {
+                               return;
+                       }
+
+                       if ( !conflictMessage ) {
+                               conflictMessage = conflict[ key ];
+                               group = conflict.group;
+                       }
+
+                       if ( group === conflict.group ) {
+                               itemLabels.push( mw.msg( 'quotation-marks', conflict.item.getLabel() ) );
+                       }
+               } );
+
+               return {
+                       message: conflictMessage,
+                       names: itemLabels
+               };
+
        };
 
        /**
-        * Get the label of this filter
-        *
-        * @return {string} Filter label
+        * @inheritdoc
         */
-       mw.rcfilters.dm.FilterItem.prototype.getLabel = function () {
-               return this.label;
+       mw.rcfilters.dm.FilterItem.prototype.getStateMessage = function () {
+               var messageKey, details, superset,
+                       affectingItems = [];
+
+               if ( this.isSelected() ) {
+                       if ( this.isConflicted() ) {
+                               // First look in filter's own conflicts
+                               details = this.getConflictDetails( this.getOwnConflicts() );
+                               if ( !details.message ) {
+                                       // Fall back onto conflicts in the group
+                                       details = this.getConflictDetails( this.getGroupModel().getConflicts() );
+                               }
+
+                               messageKey = details.message;
+                               affectingItems = details.names;
+                       } else if ( this.isIncluded() && !this.isHighlighted() ) {
+                               // We only show the 'no effect' full-coverage message
+                               // if the item is also not highlighted. See T161273
+                               superset = this.getSuperset();
+                               // For this message we need to collect the affecting superset
+                               affectingItems = this.getGroupModel().getSelectedItems( this )
+                                       .filter( function ( item ) {
+                                               return superset.indexOf( item.getName() ) !== -1;
+                                       } )
+                                       .map( function ( item ) {
+                                               return mw.msg( 'quotation-marks', item.getLabel() );
+                                       } );
+
+                               messageKey = 'rcfilters-state-message-subset';
+                       } else if ( this.isFullyCovered() && !this.isHighlighted() ) {
+                               affectingItems = this.getGroupModel().getSelectedItems( this )
+                                       .map( function ( item ) {
+                                               return mw.msg( 'quotation-marks', item.getLabel() );
+                                       } );
+
+                               messageKey = 'rcfilters-state-message-fullcoverage';
+                       }
+               }
+
+               if ( messageKey ) {
+                       // Build message
+                       return mw.msg(
+                               messageKey,
+                               mw.language.listToText( affectingItems ),
+                               affectingItems.length
+                       );
+               }
+
+               // Display description
+               return this.getDescription();
        };
 
        /**
-        * Get the description of this filter
+        * Get the model of the group this filter belongs to
         *
-        * @return {string} Filter description
+        * @return {mw.rcfilters.dm.FilterGroup} Filter group model
         */
-       mw.rcfilters.dm.FilterItem.prototype.getDescription = function () {
-               return this.description;
+       mw.rcfilters.dm.FilterItem.prototype.getGroupModel = function () {
+               return this.groupModel;
        };
 
        /**
-        * Get the default value of this filter
+        * Get the group name this filter belongs to
         *
-        * @return {boolean} Filter default
+        * @return {string} Filter group name
         */
-       mw.rcfilters.dm.FilterItem.prototype.getDefault = function () {
-               return this.default;
+       mw.rcfilters.dm.FilterItem.prototype.getGroupName = function () {
+               return this.groupModel.getName();
        };
 
        /**
                return this.superset;
        };
 
-       /**
-        * Get the selected state of this filter
-        *
-        * @return {boolean} Filter is selected
-        */
-       mw.rcfilters.dm.FilterItem.prototype.isSelected = function () {
-               return this.selected;
-       };
-
        /**
         * Check whether the filter is currently in a conflict state
         *
        };
 
        /**
-        * Get filter conflicts
+        * Get all conflicts associated with this filter or its group
+        *
+        * Conflict object is set up by filter name keys and conflict
+        * definition. For example:
+        *              {
+        *                      filterName: {
+        *                              filter: filterName,
+        *                              group: group1,
+        *                              label: itemLabel,
+        *                              item: itemModel
+        *                      }
+        *                      filterName2: {
+        *                              filter: filterName2,
+        *                              group: group2
+        *                              label: itemLabel2,
+        *                              item: itemModel2
+        *                      }
+        *              }
         *
-        * @return {string[]} Filter conflicts
+        * @return {Object} Filter conflicts
         */
        mw.rcfilters.dm.FilterItem.prototype.getConflicts = function () {
+               return $.extend( {}, this.conflicts, this.getGroupModel().getConflicts() );
+       };
+
+       /**
+        * Get the conflicts associated with this filter
+        *
+        * @return {Object} Filter conflicts
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getOwnConflicts = function () {
                return this.conflicts;
        };
 
        /**
-        * Set filter conflicts
+        * Set conflicts for this filter. See #getConflicts for the expected
+        * structure of the definition.
         *
-        * @param {string[]} conflicts Filter conflicts
+        * @param {Object} conflicts Conflicts for this filter
         */
        mw.rcfilters.dm.FilterItem.prototype.setConflicts = function ( conflicts ) {
-               this.conflicts = conflicts || [];
+               this.conflicts = conflicts || {};
        };
 
        /**
                this.superset = superset || [];
        };
 
+       /**
+        * Set filter subset
+        *
+        * @param {string[]} subset Filter subset
+        */
+       mw.rcfilters.dm.FilterItem.prototype.setSubset = function ( subset ) {
+               this.subset = subset || [];
+       };
+
        /**
         * Check whether a filter exists in the subset list for this filter
         *
         * @return {boolean} This item has a conflict with the given item
         */
        mw.rcfilters.dm.FilterItem.prototype.existsInConflicts = function ( filterItem ) {
-               return this.conflicts.indexOf( filterItem.getName() ) > -1;
+               return Object.prototype.hasOwnProperty.call( this.getConflicts(), filterItem.getName() );
        };
 
        /**
                }
        };
 
-       /**
-        * 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' );
-               }
-       };
-
        /**
         * Toggle the fully covered state of the item
         *
                        this.emit( 'update' );
                }
        };
-
-       /**
-        * Set the highlight color
-        *
-        * @param {string|null} highlightColor
-        */
-       mw.rcfilters.dm.FilterItem.prototype.setHighlightColor = function ( highlightColor ) {
-               if ( this.highlightColor !== highlightColor ) {
-                       this.highlightColor = highlightColor;
-                       this.emit( 'update' );
-               }
-       };
-
-       /**
-        * Clear the highlight color
-        */
-       mw.rcfilters.dm.FilterItem.prototype.clearHighlightColor = function () {
-               this.setHighlightColor( null );
-       };
-
-       /**
-        * Get the highlight color, or null if none is configured
-        *
-        * @return {string|null}
-        */
-       mw.rcfilters.dm.FilterItem.prototype.getHighlightColor = function () {
-               return this.highlightColor;
-       };
-
-       /**
-        * Get the CSS class that matches changes that fit this filter
-        * or null if none is configured
-        *
-        * @return {string|null}
-        */
-       mw.rcfilters.dm.FilterItem.prototype.getCssClass = function () {
-               return this.cssClass;
-       };
-
-       /**
-        * Toggle the highlight feature on and off for this filter.
-        * It only works if highlight is supported for this filter.
-        *
-        * @param {boolean} enable Highlight should be enabled
-        */
-       mw.rcfilters.dm.FilterItem.prototype.toggleHighlight = function ( enable ) {
-               enable = enable === undefined ? !this.highlightEnabled : enable;
-
-               if ( !this.isHighlightSupported() ) {
-                       return;
-               }
-
-               if ( enable === this.highlightEnabled ) {
-                       return;
-               }
-
-               this.highlightEnabled = enable;
-               this.emit( 'update' );
-       };
-
-       /**
-        * Check if the highlight feature is currently enabled for this filter
-        *
-        * @return {boolean}
-        */
-       mw.rcfilters.dm.FilterItem.prototype.isHighlightEnabled = function () {
-               return !!this.highlightEnabled;
-       };
-
-       /**
-        * Check if the highlight feature is supported for this filter
-        *
-        * @return {boolean}
-        */
-       mw.rcfilters.dm.FilterItem.prototype.isHighlightSupported = function () {
-               return !!this.getCssClass();
-       };
 }( mediaWiki ) );
index d58eb2e..88ce33c 100644 (file)
@@ -16,6 +16,7 @@
                this.defaultParams = {};
                this.defaultFiltersEmpty = null;
                this.highlightEnabled = false;
+               this.parameterMap = {};
 
                // Events
                this.aggregate( { update: 'filterItemUpdate' } );
                                        // For example, see two groups with conflicts:
                                        // userExpLevel: [
                                        //   {
-                                       //      name: 'experienced',
-                                       //      conflicts: [ 'unregistered' ]
+                                       //     name: 'experienced',
+                                       //     conflicts: [ 'unregistered' ]
                                        //   }
                                        // ],
                                        // registration: [
                                        //   {
-                                       //      name: 'registered',
+                                       //     name: 'registered',
                                        //   },
                                        //   {
-                                       //      name: 'unregistered',
+                                       //     name: 'unregistered',
                                        //   }
                                        // ]
                                        // If we select 'experienced', then 'unregistered' is in conflict (and vice versa),
                } );
        };
 
+       /**
+        * Get whether the model has any conflict in its items
+        *
+        * @return {boolean} There is a conflict
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.hasConflict = function () {
+               return this.getItems().some( function ( filterItem ) {
+                       return filterItem.isSelected() && filterItem.isConflicted();
+               } );
+       };
+
+       /**
+        * Get the first item with a current conflict
+        *
+        * @return {mw.rcfilters.dm.FilterItem} Conflicted item
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getFirstConflictedItem = function () {
+               var conflictedItem;
+
+               $.each( this.getItems(), function ( index, filterItem ) {
+                       if ( filterItem.isSelected() && filterItem.isConflicted() ) {
+                               conflictedItem = filterItem;
+                               return false;
+                       }
+               } );
+
+               return conflictedItem;
+       };
+
        /**
         * Set filters and preserve a group relationship based on
         * the definition given by an object
         *
-        * @param {Object} filters Filter group definition
+        * @param {Array} filters Filter group definition
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters ) {
-               var i, filterItem, selectedFilterNames,
+               var filterItem, filterConflictResult, groupConflictResult,
                        model = this,
                        items = [],
-                       addArrayElementsUnique = function ( arr, elements ) {
-                               elements = Array.isArray( elements ) ? elements : [ elements ];
+                       groupConflictMap = {},
+                       filterConflictMap = {},
+                       /*!
+                        * Expand a conflict definition from group name to
+                        * the list of all included filters in that group.
+                        * We do this so that the direct relationship in the
+                        * models are consistently item->items rather than
+                        * mixing item->group with item->item.
+                        *
+                        * @param {Object} obj Conflict definition
+                        * @return {Object} Expanded conflict definition
+                        */
+                       expandConflictDefinitions = function ( obj ) {
+                               var result = {};
+
+                               $.each( obj, function ( key, conflicts ) {
+                                       var filterName,
+                                               adjustedConflicts = {};
+
+                                       conflicts.forEach( function ( conflict ) {
+                                               var filter;
+
+                                               if ( conflict.filter ) {
+                                                       filterName = model.groups[ conflict.group ].getPrefixedName( conflict.filter );
+                                                       filter = model.getItemByName( filterName );
+
+                                                       // Rename
+                                                       adjustedConflicts[ filterName ] = $.extend(
+                                                               {},
+                                                               conflict,
+                                                               {
+                                                                       filter: filterName,
+                                                                       item: filter
+                                                               }
+                                                       );
+                                               } else {
+                                                       // This conflict is for an entire group. Split it up to
+                                                       // represent each filter
+
+                                                       // Get the relevant group items
+                                                       model.groups[ conflict.group ].getItems().forEach( function ( groupItem ) {
+                                                               // Rebuild the conflict
+                                                               adjustedConflicts[ groupItem.getName() ] = $.extend(
+                                                                       {},
+                                                                       conflict,
+                                                                       {
+                                                                               filter: groupItem.getName(),
+                                                                               item: groupItem
+                                                                       }
+                                                               );
+                                                       } );
+                                               }
+                                       } );
 
-                               elements.forEach( function ( element ) {
-                                       if ( arr.indexOf( element ) === -1 ) {
-                                               arr.push( element );
-                                       }
+                                       result[ key ] = adjustedConflicts;
                                } );
 
-                               return arr;
-                       },
-                       conflictMap = {},
-                       supersetMap = {};
+                               return result;
+                       };
 
                // Reset
                this.clearItems();
                this.groups = {};
 
-               $.each( filters, function ( group, data ) {
+               filters.forEach( function ( data ) {
+                       var i,
+                               group = data.name;
+
                        if ( !model.groups[ group ] ) {
                                model.groups[ group ] = new mw.rcfilters.dm.FilterGroup( group, {
                                        type: data.type,
-                                       title: data.title,
+                                       title: mw.msg( data.title ),
                                        separator: data.separator,
-                                       fullCoverage: !!data.fullCoverage
+                                       fullCoverage: !!data.fullCoverage,
+                                       whatsThis: {
+                                               body: data.whatsThisBody,
+                                               header: data.whatsThisHeader,
+                                               linkText: data.whatsThisLinkText,
+                                               url: data.whatsThisUrl
+                                       }
                                } );
                        }
+                       model.groups[ group ].initializeFilters( data.filters, data.default );
+                       items = items.concat( model.groups[ group ].getItems() );
 
-                       selectedFilterNames = [];
-                       for ( i = 0; i < data.filters.length; i++ ) {
-                               filterItem = new mw.rcfilters.dm.FilterItem( data.filters[ i ].name, model.groups[ group ], {
-                                       group: group,
-                                       label: data.filters[ i ].label,
-                                       description: data.filters[ i ].description,
-                                       subset: data.filters[ i ].subset,
-                                       cssClass: data.filters[ i ].class
-                               } );
-
-                               // For convenience, we should store each filter's "supersets" -- these are
-                               // the filters that have that item in their subset list. This will just
-                               // make it easier to go through whether the item has any other items
-                               // that affect it (and are selected) at any given time
-                               if ( data.filters[ i ].subset ) {
-                                       data.filters[ i ].subset.forEach( function ( subsetFilterName ) { // eslint-disable-line no-loop-func
-                                               supersetMap[ subsetFilterName ] = supersetMap[ subsetFilterName ] || [];
-                                               addArrayElementsUnique(
-                                                       supersetMap[ subsetFilterName ],
-                                                       filterItem.getName()
-                                               );
-                                       } );
-                               }
+                       // Prepare conflicts
+                       if ( data.conflicts ) {
+                               // Group conflicts
+                               groupConflictMap[ group ] = data.conflicts;
+                       }
 
-                               // Conflicts are bi-directional, which means FilterA can define having
-                               // a conflict with FilterB, and this conflict should appear in **both**
-                               // filter definitions.
-                               // We need to remap all the 'conflicts' so they reflect the entire state
-                               // in either direction regardless of which filter defined the other as conflicting.
+                       for ( i = 0; i < data.filters.length; i++ ) {
+                               // Filter conflicts
                                if ( data.filters[ i ].conflicts ) {
-                                       conflictMap[ filterItem.getName() ] = conflictMap[ filterItem.getName() ] || [];
-                                       addArrayElementsUnique(
-                                               conflictMap[ filterItem.getName() ],
-                                               data.filters[ i ].conflicts
-                                       );
-
-                                       data.filters[ i ].conflicts.forEach( function ( conflictingFilterName ) { // eslint-disable-line no-loop-func
-                                               // Add this filter to the conflicts of each of the filters in its list
-                                               conflictMap[ conflictingFilterName ] = conflictMap[ conflictingFilterName ] || [];
-                                               addArrayElementsUnique(
-                                                       conflictMap[ conflictingFilterName ],
-                                                       filterItem.getName()
-                                               );
-                                       } );
+                                       filterItem = model.groups[ group ].getItemByParamName( data.filters[ i ].name );
+                                       filterConflictMap[ filterItem.getName() ] = data.filters[ i ].conflicts;
                                }
+                       }
+               } );
 
-                               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 );
-                               }
+               // Add item references to the model, for lookup
+               this.addItems( items );
 
-                               model.groups[ group ].addItems( filterItem );
-                               items.push( filterItem );
-                       }
+               // Expand conflicts
+               groupConflictResult = expandConflictDefinitions( groupConflictMap );
+               filterConflictResult = expandConflictDefinitions( filterConflictMap );
 
-                       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 ].getSeparator() );
-                       }
+               // Set conflicts for groups
+               $.each( groupConflictResult, function ( group, conflicts ) {
+                       model.groups[ group ].setConflicts( conflicts );
                } );
 
-               items.forEach( function ( filterItem ) {
-                       // Apply conflict map to the items
-                       // Now that we mapped all items and conflicts bi-directionally
-                       // we need to apply the definition to each filter again
-                       filterItem.setConflicts( conflictMap[ filterItem.getName() ] );
-
-                       // Apply the superset map
-                       filterItem.setSuperset( supersetMap[ filterItem.getName() ] );
+               // Set conflicts for items
+               $.each( filterConflictResult, function ( filterName, conflicts ) {
+                       var filterItem = model.getItemByName( filterName );
+                       // set conflicts for items in the group
+                       filterItem.setConflicts( conflicts );
                } );
 
-               // Add items to the model
-               this.addItems( items );
+               // Create a map between known parameters and their models
+               $.each( this.groups, function ( group, groupModel ) {
+                       if ( groupModel.getType() === 'send_unselected_if_any' ) {
+                               // Individual filters
+                               groupModel.getItems().forEach( function ( filterItem ) {
+                                       model.parameterMap[ filterItem.getParamName() ] = filterItem;
+                               } );
+                       } else if ( groupModel.getType() === 'string_options' ) {
+                               // Group
+                               model.parameterMap[ groupModel.getName() ] = groupModel;
+                       }
+               } );
 
+               // Finish initialization
                this.emit( 'initialize' );
        };
 
        };
 
        /**
-        * Get the default parameters object
+        * Get an object representing default parameters state
         *
         * @return {Object} Default parameter values
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.getDefaultParams = function () {
-               return this.defaultParams;
-       };
+               var result = {};
 
-       /**
-        * Set all filter states to default values
-        */
-       mw.rcfilters.dm.FiltersViewModel.prototype.setFiltersToDefaults = function () {
-               var defaultFilterStates = this.getFiltersFromParameters( this.getDefaultParams() );
+               $.each( this.groups, function ( name, model ) {
+                       result = $.extend( true, {}, result, model.getDefaultParams() );
+               } );
 
-               this.updateFilters( defaultFilterStates );
+               return result;
        };
 
        /**
         * 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
+        * @param {Object} [filterDefinition] An object defining the filter values,
+        *  keyed by filter names.
         * @return {Object} Parameter state object
         */
-       mw.rcfilters.dm.FiltersViewModel.prototype.getParametersFromFilters = function ( filterGroups ) {
-               var i, filterItems, anySelected, values,
+       mw.rcfilters.dm.FiltersViewModel.prototype.getParametersFromFilters = function ( filterDefinition ) {
+               var groupItemDefinition,
                        result = {},
-                       groupItems = filterGroups || this.getFilterGroups();
+                       groupItems = this.getFilterGroups();
+
+               if ( filterDefinition ) {
+                       groupItemDefinition = {};
+                       // Filter definition is "flat", but in effect
+                       // each group needs to tell us its result based
+                       // on the values in it. We need to split this list
+                       // back into groupings so we can "feed" it to the
+                       // loop below, and we need to expand it so it includes
+                       // all filters (set to false)
+                       this.getItems().forEach( function ( filterItem ) {
+                               groupItemDefinition[ filterItem.getGroupName() ] = groupItemDefinition[ filterItem.getGroupName() ] || {};
+                               groupItemDefinition[ filterItem.getGroupName() ][ filterItem.getName() ] = !!filterDefinition[ filterItem.getName() ];
+                       } );
+               }
 
                $.each( groupItems, function ( group, model ) {
-                       filterItems = model.getItems();
-
-                       if ( model.getType() === '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();
-                               } );
+                       $.extend(
+                               result,
+                               model.getParamRepresentation(
+                                       groupItemDefinition ?
+                                               groupItemDefinition[ group ] : null
+                               )
+                       );
+               } );
 
-                               // 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 ( model.getType() === 'string_options' ) {
-                               values = [];
-                               for ( i = 0; i < filterItems.length; i++ ) {
-                                       if ( filterItems[ i ].isSelected() ) {
-                                               values.push( filterItems[ i ].getName() );
-                                       }
-                               }
+               return result;
+       };
 
-                               if ( values.length === 0 || values.length === filterItems.length ) {
-                                       result[ group ] = 'all';
-                               } else {
-                                       result[ group ] = values.join( model.getSeparator() );
-                               }
+       /**
+        * 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 groupMap = {},
+                       model = this,
+                       result = {};
+
+               // Go over the given parameters, break apart to groupings
+               // The resulting object represents the group with its parameter
+               // values. For example:
+               // {
+               //    group1: {
+               //       param1: "1",
+               //       param2: "0",
+               //       param3: "1"
+               //    },
+               //    group2: "param4|param5"
+               // }
+               $.each( params, function ( paramName, paramValue ) {
+                       var itemOrGroup = model.parameterMap[ paramName ];
+
+                       if ( itemOrGroup instanceof mw.rcfilters.dm.FilterItem ) {
+                               groupMap[ itemOrGroup.getGroupName() ] = groupMap[ itemOrGroup.getGroupName() ] || {};
+                               groupMap[ itemOrGroup.getGroupName() ][ itemOrGroup.getParamName() ] = paramValue;
+                       } else if ( itemOrGroup instanceof mw.rcfilters.dm.FilterGroup ) {
+                               // This parameter represents a group (values are the filters)
+                               // this is equivalent to checking if the group is 'string_options'
+                               groupMap[ itemOrGroup.getName() ] = groupMap[ itemOrGroup.getName() ] || {};
+                               groupMap[ itemOrGroup.getName() ] = paramValue;
                        }
                } );
 
+               // Go over all groups, so we make sure we get the complete output
+               // even if the parameters don't include a certain group
+               $.each( this.groups, function ( groupName, groupModel ) {
+                       result = $.extend( true, {}, result, groupModel.getFilterRepresentation( groupMap[ groupName ] ) );
+               } );
+
                return result;
        };
 
         *                  are the selected highlight colors.
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.getHighlightParameters = function () {
-               var result = { highlight: this.isHighlightEnabled() };
+               var result = { highlight: Number( this.isHighlightEnabled() ) };
 
                this.getItems().forEach( function ( filterItem ) {
                        result[ filterItem.getName() + '_color' ] = filterItem.getHighlightColor();
         * @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.getGroupFilters( groupName ).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 );
-                       }
+       mw.rcfilters.dm.FiltersViewModel.prototype.sanitizeStringOptionGroup = function ( groupName, valueArray ) {
+               var validNames = this.getGroupFilters( groupName ).map( function ( filterItem ) {
+                       return filterItem.getParamName();
                } );
 
-               return result;
+               return mw.rcfilters.utils.normalizeParamOptions( valueArray, validNames );
        };
 
        /**
         * @return {boolean} Current filters are all empty
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.areCurrentFiltersEmpty = function () {
-               var model = this;
-
                // Check if there are either any selected items or any items
                // that have highlight enabled
                return !this.getItems().some( function ( filterItem ) {
-                       return (
-                               filterItem.isSelected() ||
-                               ( model.isHighlightEnabled() && filterItem.getHighlightColor() )
-                       );
+                       return filterItem.isSelected() || filterItem.isHighlighted();
                } );
        };
 
                if ( this.defaultFiltersEmpty !== null ) {
                        // We only need to do this test once,
                        // because defaults are set once per session
-                       defaultFilters = this.getFiltersFromParameters();
+                       defaultFilters = this.getFiltersFromParameters( this.getDefaultParams() );
                        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.getGroupName() ] = groupMap[ filterItem.getGroupName() ] || {};
-
-                               // Mark the group if it has any items that are selected
-                               groupMap[ filterItem.getGroupName() ].hasSelected = (
-                                       groupMap[ filterItem.getGroupName() ].hasSelected ||
-                                       !!Number( paramValue )
-                               );
-
-                               // Add the relevant filter into the group map
-                               groupMap[ filterItem.getGroupName() ].filters = groupMap[ filterItem.getGroupName() ].filters || [];
-                               groupMap[ filterItem.getGroupName() ].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 ].getItems() };
-                       }
-               } );
-
-               // 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 ].getType() === '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 ].getType() === 'string_options' ) {
-                               paramValues = model.sanitizeStringOptionGroup( group, params[ group ].split( model.groups[ group ].getSeparator() ) );
-
-                               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 ].getItemCount()
-                                               ) ?
-                                               // 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
         *
         * This is equivalent to display all.
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.emptyAllFilters = function () {
-               var filters = {};
-
                this.getItems().forEach( function ( filterItem ) {
-                       filters[ filterItem.getName() ] = false;
-               } );
+                       this.toggleFilterSelected( filterItem.getName(), false );
+               }.bind( this ) );
+       };
+
+       /**
+        * Toggle selected state of one item
+        *
+        * @param {string} name Name of the filter item
+        * @param {boolean} [isSelected] Filter selected state
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.toggleFilterSelected = function ( name, isSelected ) {
+               var item = this.getItemByName( name );
 
-               // Update filters
-               this.updateFilters( filters );
+               if ( item ) {
+                       item.toggleSelected( isSelected );
+               }
        };
 
        /**
         *
         * @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 ] );
-               }
+       mw.rcfilters.dm.FiltersViewModel.prototype.toggleFiltersSelected = function ( filterDef ) {
+               Object.keys( filterDef ).forEach( function ( name ) {
+                       this.toggleFilterSelected( name, filterDef[ name ] );
+               }.bind( this ) );
        };
 
        /**
         * Find items whose labels match the given string
         *
         * @param {string} query Search string
+        * @param {boolean} [returnFlat] Return a flat array. If false, the result
+        *  is an object whose keys are the group names and values are an array of
+        *  filters per group. If set to true, returns an array of filters regardless
+        *  of their groups.
         * @return {Object} An object of items to show
         *  arranged by their group names
         */
-       mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( query ) {
+       mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( query, returnFlat ) {
                var i,
                        groupTitle,
                        result = {},
+                       flatResult = [],
                        items = this.getItems();
 
                // Normalize so we can search strings regardless of case
                        if ( items[ i ].getLabel().toLowerCase().indexOf( query ) === 0 ) {
                                result[ items[ i ].getGroupName() ] = result[ items[ i ].getGroupName() ] || [];
                                result[ items[ i ].getGroupName() ].push( items[ i ] );
+                               flatResult.push( items[ i ] );
                        }
                }
 
                                ) {
                                        result[ items[ i ].getGroupName() ] = result[ items[ i ].getGroupName() ] || [];
                                        result[ items[ i ].getGroupName() ].push( items[ i ] );
+                                       flatResult.push( items[ i ] );
                                }
                        }
                }
 
-               return result;
+               return returnFlat ? flatResult : result;
        };
 
        /**
                } );
        };
 
+       /**
+        * Get items that allow highlights even if they're not currently highlighted
+        *
+        * @return {mw.rcfilters.dm.FilterItem[]} Items supporting highlights
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getItemsSupportingHighlights = function () {
+               return this.getItems().filter( function ( filterItem ) {
+                       return filterItem.isHighlightSupported();
+               } );
+       };
+
        /**
         * Toggle the highlight feature on and off.
         * Propagate the change to filter items.
         * @return {boolean}
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.isHighlightEnabled = function () {
-               return this.highlightEnabled;
+               return !!this.highlightEnabled;
        };
 
        /**
diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ItemModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ItemModel.js
new file mode 100644 (file)
index 0000000..675fcc7
--- /dev/null
@@ -0,0 +1,257 @@
+( function ( mw ) {
+       /**
+        * RCFilter base item model
+        *
+        * @mixins OO.EventEmitter
+        *
+        * @constructor
+        * @param {string} param Filter param name
+        * @param {Object} config Configuration object
+        * @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 {boolean} [selected] The item is selected
+        * @cfg {boolean} [inverted] The item is inverted, meaning the search is excluding
+        *  this parameter.
+        * @cfg {string} [namePrefix='item_'] A prefix to add to the param name to act as a unique
+        *  identifier
+        * @cfg {string} [cssClass] The class identifying the results that match this filter
+        */
+       mw.rcfilters.dm.ItemModel = function MwRcfiltersDmItemModel( param, config ) {
+               config = config || {};
+
+               // Mixin constructor
+               OO.EventEmitter.call( this );
+
+               this.param = param;
+               this.namePrefix = config.namePrefix || 'item_';
+               this.name = this.namePrefix + param;
+
+               this.label = config.label || this.name;
+               this.description = config.description;
+               this.selected = !!config.selected;
+
+               this.inverted = !!config.inverted;
+
+               // Highlight
+               this.cssClass = config.cssClass;
+               this.highlightColor = null;
+               this.highlightEnabled = false;
+       };
+
+       /* Initialization */
+
+       OO.initClass( mw.rcfilters.dm.ItemModel );
+       OO.mixinClass( mw.rcfilters.dm.ItemModel, OO.EventEmitter );
+
+       /* Events */
+
+       /**
+        * @event update
+        *
+        * The state of this filter has changed
+        */
+
+       /* Methods */
+
+       /**
+        * Return the representation of the state of this item.
+        *
+        * @return {Object} State of the object
+        */
+       mw.rcfilters.dm.ItemModel.prototype.getState = function () {
+               return {
+                       selected: this.isSelected(),
+                       inverted: this.isInverted()
+               };
+       };
+
+       /**
+        * Get the name of this filter
+        *
+        * @return {string} Filter name
+        */
+       mw.rcfilters.dm.ItemModel.prototype.getName = function () {
+               return this.name;
+       };
+
+       /**
+        * Get the param name or value of this filter
+        *
+        * @return {string} Filter param name
+        */
+       mw.rcfilters.dm.ItemModel.prototype.getParamName = function () {
+               return this.param;
+       };
+
+       /**
+        * Get the message representing the state of this model.
+        *
+        * @return {string} State message
+        */
+       mw.rcfilters.dm.ItemModel.prototype.getStateMessage = function () {
+               // Display description
+               return this.getDescription();
+       };
+
+       /**
+        * Get the label of this filter
+        *
+        * @return {string} Filter label
+        */
+       mw.rcfilters.dm.ItemModel.prototype.getLabel = function () {
+               return this.label;
+       };
+
+       /**
+        * Get the description of this filter
+        *
+        * @return {string} Filter description
+        */
+       mw.rcfilters.dm.ItemModel.prototype.getDescription = function () {
+               return this.description;
+       };
+
+       /**
+        * Get the default value of this filter
+        *
+        * @return {boolean} Filter default
+        */
+       mw.rcfilters.dm.ItemModel.prototype.getDefault = function () {
+               return this.default;
+       };
+
+       /**
+        * Get the selected state of this filter
+        *
+        * @return {boolean} Filter is selected
+        */
+       mw.rcfilters.dm.ItemModel.prototype.isSelected = function () {
+               return this.selected;
+       };
+
+       /**
+        * Toggle the selected state of the item
+        *
+        * @param {boolean} [isSelected] Filter is selected
+        * @fires update
+        */
+       mw.rcfilters.dm.ItemModel.prototype.toggleSelected = function ( isSelected ) {
+               isSelected = isSelected === undefined ? !this.selected : isSelected;
+
+               if ( this.selected !== isSelected ) {
+                       this.selected = isSelected;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Get the inverted state of this item
+        *
+        * @return {boolean} Item is inverted
+        */
+       mw.rcfilters.dm.ItemModel.prototype.isInverted = function () {
+               return this.inverted;
+       };
+
+       /**
+        * Toggle the inverted state of the item
+        *
+        * @param {boolean} [isInverted] Item is inverted
+        * @fires update
+        */
+       mw.rcfilters.dm.ItemModel.prototype.toggleInverted = function ( isInverted ) {
+               isInverted = isInverted === undefined ? !this.inverted : isInverted;
+
+               if ( this.inverted !== isInverted ) {
+                       this.inverted = isInverted;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Set the highlight color
+        *
+        * @param {string|null} highlightColor
+        */
+       mw.rcfilters.dm.ItemModel.prototype.setHighlightColor = function ( highlightColor ) {
+               if ( this.highlightColor !== highlightColor ) {
+                       this.highlightColor = highlightColor;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Clear the highlight color
+        */
+       mw.rcfilters.dm.ItemModel.prototype.clearHighlightColor = function () {
+               this.setHighlightColor( null );
+       };
+
+       /**
+        * Get the highlight color, or null if none is configured
+        *
+        * @return {string|null}
+        */
+       mw.rcfilters.dm.ItemModel.prototype.getHighlightColor = function () {
+               return this.highlightColor;
+       };
+
+       /**
+        * Get the CSS class that matches changes that fit this filter
+        * or null if none is configured
+        *
+        * @return {string|null}
+        */
+       mw.rcfilters.dm.ItemModel.prototype.getCssClass = function () {
+               return this.cssClass;
+       };
+
+       /**
+        * Toggle the highlight feature on and off for this filter.
+        * It only works if highlight is supported for this filter.
+        *
+        * @param {boolean} enable Highlight should be enabled
+        */
+       mw.rcfilters.dm.ItemModel.prototype.toggleHighlight = function ( enable ) {
+               enable = enable === undefined ? !this.highlightEnabled : enable;
+
+               if ( !this.isHighlightSupported() ) {
+                       return;
+               }
+
+               if ( enable === this.highlightEnabled ) {
+                       return;
+               }
+
+               this.highlightEnabled = enable;
+               this.emit( 'update' );
+       };
+
+       /**
+        * Check if the highlight feature is currently enabled for this filter
+        *
+        * @return {boolean}
+        */
+       mw.rcfilters.dm.ItemModel.prototype.isHighlightEnabled = function () {
+               return !!this.highlightEnabled;
+       };
+
+       /**
+        * Check if the highlight feature is supported for this filter
+        *
+        * @return {boolean}
+        */
+       mw.rcfilters.dm.ItemModel.prototype.isHighlightSupported = function () {
+               return !!this.getCssClass();
+       };
+
+       /**
+        * Check if the filter is currently highlighted
+        *
+        * @return {boolean}
+        */
+       mw.rcfilters.dm.ItemModel.prototype.isHighlighted = function () {
+               return this.isHighlightEnabled() && !!this.getHighlightColor();
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js
new file mode 100644 (file)
index 0000000..3ffc12e
--- /dev/null
@@ -0,0 +1,202 @@
+( function ( mw, $ ) {
+       /**
+        * View model for saved queries
+        *
+        * @mixins OO.EventEmitter
+        * @mixins OO.EmitterList
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {string} [default] Default query ID
+        */
+       mw.rcfilters.dm.SavedQueriesModel = function MwRcfiltersDmSavedQueriesModel( config ) {
+               config = config || {};
+
+               // Mixin constructor
+               OO.EventEmitter.call( this );
+               OO.EmitterList.call( this );
+
+               this.default = config.default;
+
+               // Events
+               this.aggregate( { update: 'itemUpdate' } );
+       };
+
+       /* Initialization */
+
+       OO.initClass( mw.rcfilters.dm.SavedQueriesModel );
+       OO.mixinClass( mw.rcfilters.dm.SavedQueriesModel, OO.EventEmitter );
+       OO.mixinClass( mw.rcfilters.dm.SavedQueriesModel, OO.EmitterList );
+
+       /* Events */
+
+       /**
+        * @event initialize
+        *
+        * Model is initialized
+        */
+
+       /**
+        * @event itemUpdate
+        * @param {mw.rcfilters.dm.SavedQueryItemModel} Changed item
+        *
+        * An item has changed
+        */
+
+       /* Methods */
+
+       /**
+        * Initialize the saved queries model by reading it from the user's settings.
+        * The structure of the saved queries is:
+        * {
+        *    default: (string) Query ID
+        *    queries:{
+        *       query_id_1: {
+        *          data:{
+        *             filters: (Object) Minimal definition of the filters
+        *             highlights: (Object) Definition of the highlights
+        *          },
+        *          label: (optional) Name of this query
+        *       }
+        *    }
+        * }
+        *
+        * @param {Object} [savedQueries] An object with the saved queries with
+        *  the above structure.
+        * @param {Object} [baseState] An object representing the base state
+        *  so we can normalize the data
+        * @fires initialize
+        */
+       mw.rcfilters.dm.SavedQueriesModel.prototype.initialize = function ( savedQueries, baseState ) {
+               var items = [];
+
+               savedQueries = savedQueries || {};
+
+               this.baseState = baseState;
+
+               this.clearItems();
+               $.each( savedQueries.queries || {}, function ( id, obj ) {
+                       var normalizedData = $.extend( true, {}, baseState, obj.data );
+
+                       // Backwards-compat fix: We stored the 'highlight' state with
+                       // "1" and "0" instead of true/false; for already-stored states,
+                       // we need to fix that.
+                       // NOTE: Since this feature is only available in beta, we should
+                       // not need this line when we release this to the general wikis.
+                       // This method will automatically fix all saved queries anyways
+                       // for existing users, who are only betalabs users at the moment.
+                       normalizedData.highlights.highlight = !!Number( normalizedData.highlights.highlight );
+
+                       items.push(
+                               new mw.rcfilters.dm.SavedQueryItemModel(
+                                       id,
+                                       obj.label,
+                                       normalizedData,
+                                       { 'default': savedQueries.default === id }
+                               )
+                       );
+               } );
+
+               this.default = savedQueries.default;
+
+               this.addItems( items );
+
+               this.emit( 'initialize' );
+       };
+
+       /**
+        * Add a query item
+        *
+        * @param {string} label Label for the new query
+        * @param {Object} data Data for the new query
+        */
+       mw.rcfilters.dm.SavedQueriesModel.prototype.addNewQuery = function ( label, data ) {
+               var randomID = ( new Date() ).getTime(),
+                       normalizedData = $.extend( true, {}, this.baseState, data );
+
+               // Add item
+               this.addItems( [
+                       new mw.rcfilters.dm.SavedQueryItemModel(
+                               randomID,
+                               label,
+                               normalizedData
+                       )
+               ] );
+       };
+
+       /**
+        * Get an item that matches the requested query
+        *
+        * @param {Object} fullQueryComparison Object representing all filters and highlights to compare
+        * @return {mw.rcfilters.dm.SavedQueryItemModel} Matching item model
+        */
+       mw.rcfilters.dm.SavedQueriesModel.prototype.findMatchingQuery = function ( fullQueryComparison ) {
+               return this.getItems().filter( function ( item ) {
+                       return OO.compare(
+                               item.getData(),
+                               fullQueryComparison
+                       );
+               } )[ 0 ];
+       };
+
+       /**
+        * Get query by its identifier
+        *
+        * @param {string} queryID Query identifier
+        * @return {mw.rcfilters.dm.SavedQueryItemModel|undefined} Item matching
+        *  the search. Undefined if not found.
+        */
+       mw.rcfilters.dm.SavedQueriesModel.prototype.getItemByID = function ( queryID ) {
+               return this.getItems().filter( function ( item ) {
+                       return item.getID() === queryID;
+               } )[ 0 ];
+       };
+
+       /**
+        * Get the object representing the state of the entire model and items
+        *
+        * @return {Object} Object representing the state of the model and items
+        */
+       mw.rcfilters.dm.SavedQueriesModel.prototype.getState = function () {
+               var obj = { queries: {} };
+
+               // Translate the items to the saved object
+               this.getItems().forEach( function ( item ) {
+                       var itemState = item.getState();
+
+                       obj.queries[ item.getID() ] = itemState;
+               } );
+
+               if ( this.getDefault() ) {
+                       obj.default = this.getDefault();
+               }
+
+               return obj;
+       };
+
+       /**
+        * Set a default query. Null to unset default.
+        *
+        * @param {string} itemID Query identifier
+        * @fires default
+        */
+       mw.rcfilters.dm.SavedQueriesModel.prototype.setDefault = function ( itemID ) {
+               if ( this.default !== itemID ) {
+                       this.default = itemID;
+
+                       // Set for individual itens
+                       this.getItems().forEach( function ( item ) {
+                               item.toggleDefault( item.getID() === itemID );
+                       } );
+               }
+       };
+
+       /**
+        * Get the default query ID
+        *
+        * @return {string} Default query identifier
+        */
+       mw.rcfilters.dm.SavedQueriesModel.prototype.getDefault = function () {
+               return this.default;
+       };
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js
new file mode 100644 (file)
index 0000000..729aee3
--- /dev/null
@@ -0,0 +1,115 @@
+( function ( mw ) {
+       /**
+        * View model for a single saved query
+        *
+        * @mixins OO.EventEmitter
+        *
+        * @constructor
+        * @param {string} id Unique identifier
+        * @param {string} label Saved query label
+        * @param {Object} data Saved query data
+        * @param {Object} [config] Configuration options
+        * @param {boolean} [default] This item is the default
+        */
+       mw.rcfilters.dm.SavedQueryItemModel = function MwRcfiltersDmSavedQueriesModel( id, label, data, config ) {
+               config = config || {};
+
+               // Mixin constructor
+               OO.EventEmitter.call( this );
+
+               this.id = id;
+               this.label = label;
+               this.data = data;
+               this.default = !!config.default;
+       };
+
+       /* Initialization */
+
+       OO.initClass( mw.rcfilters.dm.SavedQueryItemModel );
+       OO.mixinClass( mw.rcfilters.dm.SavedQueryItemModel, OO.EventEmitter );
+
+       /* Events */
+
+       /**
+        * @update
+        *
+        * Model has been updated
+        */
+
+       /* Methods */
+
+       /**
+        * Get an object representing the state of this item
+        *
+        * @returns {Object} Object representing the current data state
+        *  of the object
+        */
+       mw.rcfilters.dm.SavedQueryItemModel.prototype.getState = function () {
+               return {
+                       data: this.getData(),
+                       label: this.getLabel()
+               };
+       };
+
+       /**
+        * Get the query's identifier
+        *
+        * @return {string} Query identifier
+        */
+       mw.rcfilters.dm.SavedQueryItemModel.prototype.getID = function () {
+               return this.id;
+       };
+
+       /**
+        * Get query label
+        *
+        * @return {label} Query label
+        */
+       mw.rcfilters.dm.SavedQueryItemModel.prototype.getLabel = function () {
+               return this.label;
+       };
+
+       /**
+        * Update the query label
+        *
+        * @param {string} newLabel New label
+        */
+       mw.rcfilters.dm.SavedQueryItemModel.prototype.updateLabel = function ( newLabel ) {
+               if ( newLabel && this.label !== newLabel ) {
+                       this.label = newLabel;
+                       this.emit( 'update' );
+               }
+       };
+
+       /**
+        * Get query data
+        *
+        * @return {Object} Object representing parameter and highlight data
+        */
+       mw.rcfilters.dm.SavedQueryItemModel.prototype.getData = function () {
+               return this.data;
+       };
+
+       /**
+        * Check whether this item is the default
+        *
+        * @return {boolean} Query is set to be default
+        */
+       mw.rcfilters.dm.SavedQueryItemModel.prototype.isDefault = function () {
+               return this.default;
+       };
+
+       /**
+        * Toggle the default state of this query item
+        *
+        * @param {boolean} isDefault Query is default
+        */
+       mw.rcfilters.dm.SavedQueryItemModel.prototype.toggleDefault = function ( isDefault ) {
+               isDefault = isDefault === undefined ? !this.default : isDefault;
+
+               if ( this.default !== isDefault ) {
+                       this.default = isDefault;
+                       this.emit( 'update' );
+               }
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/images/clip.svg b/resources/src/mediawiki.rcfilters/images/clip.svg
new file mode 100644 (file)
index 0000000..86d1dbf
--- /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.5 4.5v13.2L12 13.5l-5.5 4.2V4.5zM5 21l7-6 7 6V3H5z" fill-rule="evenodd"/>
+</svg>
diff --git a/resources/src/mediawiki.rcfilters/images/pending.gif b/resources/src/mediawiki.rcfilters/images/pending.gif
new file mode 100644 (file)
index 0000000..1194eed
Binary files /dev/null and b/resources/src/mediawiki.rcfilters/images/pending.gif differ
diff --git a/resources/src/mediawiki.rcfilters/images/pushPin.svg b/resources/src/mediawiki.rcfilters/images/pushPin.svg
new file mode 100644 (file)
index 0000000..b852cd0
--- /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.445 12.225c-.813-.935-1.775-.739-2.883-1.768-.55-.511-.498-2.36-.498-2.36s-.041-1.836.524-2.401c.39-.39 1.076-.49 1.475-.883a.973.973 0 0 0 .217-.317c.007-.013.014-.023.018-.035.035-.092.054-.2.064-.316.003-.03.017-.055.017-.085 0-.005-.003-.01-.004-.015.001-.008.004-.014.004-.022 0-.02-.015-.03-.017-.048a1.052 1.052 0 0 0-1.043-.974H8.681c-.555 0-.997.43-1.043.974-.002.018-.017.028-.017.048 0 .008.003.014.003.022 0 .006-.003.01-.003.015 0 .03.014.055.017.085.01.116.029.224.064.316.004.012.012.022.018.035a.965.965 0 0 0 .217.317c.399.393 1.084.493 1.475.883.565.565.523 2.401.523 2.401s.053 1.849-.497 2.36c-1.108 1.03-2.07.833-2.883 1.768C5.979 12.887 6 14 6 14h5.333v4.578L12 21l.668-2.422V14H18s.02-1.113-.555-1.775z"/>
+</svg>
diff --git a/resources/src/mediawiki.rcfilters/images/unClip.svg b/resources/src/mediawiki.rcfilters/images/unClip.svg
new file mode 100644 (file)
index 0000000..68459db
--- /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="M5 21l7-6 7 6V3H5z" fill-rule="evenodd"/>
+</svg>
index 1df31a2..e9274f5 100644 (file)
@@ -1,14 +1,18 @@
 ( function ( mw, $ ) {
+       /* eslint no-underscore-dangle: "off" */
        /**
         * Controller for the filters in Recent Changes
         *
         * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Filters view model
         * @param {mw.rcfilters.dm.ChangesListViewModel} changesListModel Changes list view model
+        * @param {mw.rcfilters.dm.SavedQueriesModel} savedQueriesModel Saved queries model
         */
-       mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel ) {
+       mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel, savedQueriesModel ) {
                this.filtersModel = filtersModel;
                this.changesListModel = changesListModel;
+               this.savedQueriesModel = savedQueriesModel;
                this.requestCounter = 0;
+               this.baseState = {};
        };
 
        /* Initialization */
        /**
         * Initialize the filter and parameter states
         *
-        * @param {Object} filterStructure Filter definition and structure for the model
+        * @param {Array} filterStructure Filter definition and structure for the model
         */
        mw.rcfilters.Controller.prototype.initialize = function ( filterStructure ) {
-               var uri = new mw.Uri();
-
+               var parsedSavedQueries,
+                       $changesList = $( '.mw-changeslist' ).first().contents();
                // Initialize the model
                this.filtersModel.initializeFilters( filterStructure );
 
-               // Set filter states based on defaults and URL params
-               this.filtersModel.updateFilters(
-                       this.filtersModel.getFiltersFromParameters(
-                               // Merge defaults with URL params for initialization
-                               $.extend(
-                                       true,
-                                       {},
-                                       this.filtersModel.getDefaultParams(),
-                                       // URI query overrides defaults
-                                       uri.query
-                               )
-                       )
-               );
+               this._buildBaseFilterState();
 
-               // Initialize highlights
-               this.filtersModel.toggleHighlight( !!uri.query.highlight );
-               this.filtersModel.getItems().forEach( function ( filterItem ) {
-                       var color = uri.query[ filterItem.getName() + '_color' ];
-                       if ( !color ) {
-                               return;
-                       }
+               try {
+                       parsedSavedQueries = JSON.parse( mw.user.options.get( 'rcfilters-saved-queries' ) || '{}' );
+               } catch ( err ) {
+                       parsedSavedQueries = {};
+               }
 
-                       filterItem.setHighlightColor( color );
-               } );
+               // The queries are saved in a minimized state, so we need
+               // to send over the base state so the saved queries model
+               // can normalize them per each query item
+               this.savedQueriesModel.initialize(
+                       parsedSavedQueries,
+                       this._getBaseState()
+               );
 
-               // Check all filter interactions
-               this.filtersModel.reassessFilterInteractions();
+               this.updateStateBasedOnUrl();
+
+               // Update the changes list with the existing data
+               // so it gets processed
+               this.changesListModel.update(
+                       $changesList.length ? $changesList : 'NO_RESULTS',
+                       $( 'fieldset.rcoptions' ).first()
+               );
        };
 
        /**
         * Reset to default filters
         */
        mw.rcfilters.Controller.prototype.resetToDefaults = function () {
-               this.filtersModel.setFiltersToDefaults();
-               // Check all filter interactions
-               this.filtersModel.reassessFilterInteractions();
-
-               this.updateURL();
+               this._updateModelState( this._getDefaultParams() );
                this.updateChangesList();
        };
 
         * Empty all selected filters
         */
        mw.rcfilters.Controller.prototype.emptyFilters = function () {
+               var highlightedFilterNames = this.filtersModel
+                       .getHighlightedItems()
+                       .map( function ( filterItem ) { return { name: filterItem.getName() }; } );
+
                this.filtersModel.emptyAllFilters();
                this.filtersModel.clearAllHighlightColors();
                // Check all filter interactions
                this.filtersModel.reassessFilterInteractions();
 
-               this.updateURL();
                this.updateChangesList();
+
+               if ( highlightedFilterNames ) {
+                       this._trackHighlight( 'clearAll', highlightedFilterNames );
+               }
        };
 
        /**
-        * Update the state of a filter
+        * Update the selected state of a filter
         *
         * @param {string} filterName Filter name
-        * @param {boolean} isSelected Filter selected state
+        * @param {boolean} [isSelected] Filter selected state
         */
-       mw.rcfilters.Controller.prototype.updateFilter = function ( filterName, isSelected ) {
-               var obj = {},
-                       filterItem = this.filtersModel.getItemByName( filterName );
+       mw.rcfilters.Controller.prototype.toggleFilterSelect = function ( filterName, isSelected ) {
+               var filterItem = this.filtersModel.getItemByName( filterName );
+
+               if ( !filterItem ) {
+                       // If no filter was found, break
+                       return;
+               }
+
+               isSelected = isSelected === undefined ? !filterItem.isSelected() : isSelected;
 
                if ( filterItem.isSelected() !== isSelected ) {
-                       obj[ filterName ] = isSelected;
-                       this.filtersModel.updateFilters( obj );
+                       this.filtersModel.toggleFilterSelected( filterName, isSelected );
 
-                       this.updateURL();
                        this.updateChangesList();
 
                        // Check filter interactions
-                       this.filtersModel.reassessFilterInteractions( this.filtersModel.getItemByName( filterName ) );
+                       this.filtersModel.reassessFilterInteractions( filterItem );
+               }
+       };
+
+       /**
+        * Clear both highlight and selection of a filter
+        *
+        * @param {string} filterName Name of the filter item
+        */
+       mw.rcfilters.Controller.prototype.clearFilter = function ( filterName ) {
+               var filterItem = this.filtersModel.getItemByName( filterName ),
+                       isHighlighted = filterItem.isHighlighted();
+
+               if ( filterItem.isSelected() || isHighlighted ) {
+                       this.filtersModel.clearHighlightColor( filterName );
+                       this.filtersModel.toggleFilterSelected( filterName, false );
+                       this.updateChangesList();
+                       this.filtersModel.reassessFilterInteractions( filterItem );
+               }
+
+               if ( isHighlighted ) {
+                       this._trackHighlight( 'clear', filterName );
+               }
+       };
+
+       /**
+        * Toggle the highlight feature on and off
+        */
+       mw.rcfilters.Controller.prototype.toggleHighlight = function () {
+               this.filtersModel.toggleHighlight();
+               this._updateURL();
+
+               if ( this.filtersModel.isHighlightEnabled() ) {
+                       mw.hook( 'RcFilters.highlight.enable' ).fire();
+               }
+       };
+
+       /**
+        * Set the highlight color for a filter item
+        *
+        * @param {string} filterName Name of the filter item
+        * @param {string} color Selected color
+        */
+       mw.rcfilters.Controller.prototype.setHighlightColor = function ( filterName, color ) {
+               this.filtersModel.setHighlightColor( filterName, color );
+               this._updateURL();
+               this._trackHighlight( 'set', { name: filterName, color: color } );
+       };
+
+       /**
+        * Clear highlight for a filter item
+        *
+        * @param {string} filterName Name of the filter item
+        */
+       mw.rcfilters.Controller.prototype.clearHighlightColor = function ( filterName ) {
+               this.filtersModel.clearHighlightColor( filterName );
+               this._updateURL();
+               this._trackHighlight( 'clear', filterName );
+       };
+
+       /**
+        * Save the current model state as a saved query
+        *
+        * @param {string} [label] Label of the saved query
+        */
+       mw.rcfilters.Controller.prototype.saveCurrentQuery = function ( label ) {
+               var highlightedItems = {},
+                       highlightEnabled = this.filtersModel.isHighlightEnabled();
+
+               // Prepare highlights
+               this.filtersModel.getHighlightedItems().forEach( function ( item ) {
+                       highlightedItems[ item.getName() ] = highlightEnabled ?
+                               item.getHighlightColor() : null;
+               } );
+               // These are filter states; highlight is stored as boolean
+               highlightedItems.highlight = this.filtersModel.isHighlightEnabled();
+
+               // Add item
+               this.savedQueriesModel.addNewQuery(
+                       label || mw.msg( 'rcfilters-savedqueries-defaultlabel' ),
+                       {
+                               filters: this.filtersModel.getSelectedState(),
+                               highlights: highlightedItems
+                       }
+               );
+
+               // Save item
+               this._saveSavedQueries();
+       };
+
+       /**
+        * Remove a saved query
+        *
+        * @param {string} queryID Query id
+        */
+       mw.rcfilters.Controller.prototype.removeSavedQuery = function ( queryID ) {
+               var query = this.savedQueriesModel.getItemByID( queryID );
+
+               this.savedQueriesModel.removeItems( [ query ] );
+
+               // Check if this item was the default
+               if ( this.savedQueriesModel.getDefault() === queryID ) {
+                       // Nulify the default
+                       this.savedQueriesModel.setDefault( null );
+               }
+               this._saveSavedQueries();
+       };
+
+       /**
+        * Rename a saved query
+        *
+        * @param {string} queryID Query id
+        * @param {string} newLabel New label for the query
+        */
+       mw.rcfilters.Controller.prototype.renameSavedQuery = function ( queryID, newLabel ) {
+               var queryItem = this.savedQueriesModel.getItemByID( queryID );
+
+               if ( queryItem ) {
+                       queryItem.updateLabel( newLabel );
+               }
+               this._saveSavedQueries();
+       };
+
+       /**
+        * Set a saved query as default
+        *
+        * @param {string} queryID Query Id. If null is given, default
+        *  query is reset.
+        */
+       mw.rcfilters.Controller.prototype.setDefaultSavedQuery = function ( queryID ) {
+               this.savedQueriesModel.setDefault( queryID );
+               this._saveSavedQueries();
+       };
+
+       /**
+        * Load a saved query
+        *
+        * @param {string} queryID Query id
+        */
+       mw.rcfilters.Controller.prototype.applySavedQuery = function ( queryID ) {
+               var data, highlights,
+                       queryItem = this.savedQueriesModel.getItemByID( queryID );
+
+               if ( queryItem ) {
+                       data = queryItem.getData();
+                       highlights = data.highlights;
+
+                       // Backwards compatibility; initial version mispelled 'highlight' with 'highlights'
+                       highlights.highlight = highlights.highlights || highlights.highlight;
+
+                       // Update model state from filters
+                       this.filtersModel.toggleFiltersSelected( data.filters );
+
+                       // Update highlight state
+                       this.filtersModel.toggleHighlight( !!Number( highlights.highlight ) );
+                       this.filtersModel.getItems().forEach( function ( filterItem ) {
+                               var color = highlights[ filterItem.getName() ];
+                               if ( color ) {
+                                       filterItem.setHighlightColor( color );
+                               } else {
+                                       filterItem.clearHighlightColor();
+                               }
+                       } );
+
+                       // Check all filter interactions
+                       this.filtersModel.reassessFilterInteractions();
+
+                       this.updateChangesList();
                }
        };
 
+       /**
+        * Check whether the current filter and highlight state exists
+        * in the saved queries model.
+        *
+        * @return {boolean} Query exists
+        */
+       mw.rcfilters.Controller.prototype.findQueryMatchingCurrentState = function () {
+               var highlightedItems = {};
+
+               // Prepare highlights of the current query
+               this.filtersModel.getItemsSupportingHighlights().forEach( function ( item ) {
+                       highlightedItems[ item.getName() ] = item.getHighlightColor();
+               } );
+               highlightedItems.highlight = this.filtersModel.isHighlightEnabled();
+
+               return this.savedQueriesModel.findMatchingQuery(
+                       {
+                               filters: this.filtersModel.getSelectedState(),
+                               highlights: highlightedItems
+                       }
+               );
+       };
+
+       /**
+        * Get an object representing the base state of parameters
+        * and highlights.
+        *
+        * This is meant to make sure that the saved queries that are
+        * in memory are always the same structure as what we would get
+        * by calling the current model's "getSelectedState" and by checking
+        * highlight items.
+        *
+        * In cases where a user saved a query when the system had a certain
+        * set of filters, and then a filter was added to the system, we want
+        * to make sure that the stored queries can still be comparable to
+        * the current state, which means that we need the base state for
+        * two operations:
+        *
+        * - Saved queries are stored in "minimal" view (only changed filters
+        *   are stored); When we initialize the system, we merge each minimal
+        *   query with the base state (using 'getNormalizedFilters') so all
+        *   saved queries have the exact same structure as what we would get
+        *   by checking the getSelectedState of the filter.
+        * - When we save the queries, we minimize the object to only represent
+        *   whatever has actually changed, rather than store the entire
+        *   object. To check what actually is different so we can store it,
+        *   we need to obtain a base state to compare against, this is
+        *   what #_getMinimalFilterList does
+        */
+       mw.rcfilters.Controller.prototype._buildBaseFilterState = function () {
+               var defaultParams = this.filtersModel.getDefaultParams(),
+                       highlightedItems = {};
+
+               // Prepare highlights
+               this.filtersModel.getItemsSupportingHighlights().forEach( function ( item ) {
+                       highlightedItems[ item.getName() ] = null;
+               } );
+               highlightedItems.highlight = false;
+
+               this.baseState = {
+                       filters: this.filtersModel.getFiltersFromParameters( defaultParams ),
+                       highlights: highlightedItems
+               };
+       };
+
+       /**
+        * Get an object representing the base state of parameters
+        * and highlights. The structure is similar to what we use
+        * to store each query in the saved queries object:
+        * {
+        *    filters: {
+        *        filterName: (bool)
+        *    },
+        *    highlights: {
+        *        filterName: (string|null)
+        *    }
+        * }
+        *
+        * @return {Object} Object representing the base state of
+        *  parameters and highlights
+        */
+       mw.rcfilters.Controller.prototype._getBaseState = function () {
+               return this.baseState;
+       };
+
+       /**
+        * Get an object that holds only the parameters and highlights that have
+        * values different than the base default value.
+        *
+        * This is the reverse of the normalization we do initially on loading and
+        * initializing the saved queries model.
+        *
+        * @param {Object} valuesObject Object representing the state of both
+        *  filters and highlights in its normalized version, to be minimized.
+        * @return {Object} Minimal filters and highlights list
+        */
+       mw.rcfilters.Controller.prototype._getMinimalFilterList = function ( valuesObject ) {
+               var result = { filters: {}, highlights: {} },
+                       baseState = this._getBaseState();
+
+               // XOR results
+               $.each( valuesObject.filters, function ( name, value ) {
+                       if ( baseState.filters !== undefined && baseState.filters[ name ] !== value ) {
+                               result.filters[ name ] = value;
+                       }
+               } );
+
+               $.each( valuesObject.highlights, function ( name, value ) {
+                       if ( baseState.highlights !== undefined && baseState.highlights[ name ] !== value ) {
+                               result.highlights[ name ] = value;
+                       }
+               } );
+
+               return result;
+       };
+
+       /**
+        * Save the current state of the saved queries model with all
+        * query item representation in the user settings.
+        */
+       mw.rcfilters.Controller.prototype._saveSavedQueries = function () {
+               var stringified,
+                       state = this.savedQueriesModel.getState(),
+                       controller = this;
+
+               // Minimize before save
+               $.each( state.queries, function ( queryID, info ) {
+                       state.queries[ queryID ].data = controller._getMinimalFilterList( info.data );
+               } );
+
+               // Stringify state
+               stringified = JSON.stringify( state );
+
+               if ( stringified.length > 65535 ) {
+                       // Sanity check, since the preference can only hold that.
+                       return;
+               }
+
+               // Save the preference
+               new mw.Api().saveOption( 'rcfilters-saved-queries', stringified );
+               // Update the preference for this session
+               mw.user.options.set( 'rcfilters-saved-queries', stringified );
+       };
+
+       /**
+        * Synchronize the URL with the current state of the filters
+        * without adding an history entry.
+        */
+       mw.rcfilters.Controller.prototype.replaceUrl = function () {
+               window.history.replaceState(
+                       { tag: 'rcfilters' },
+                       document.title,
+                       this._getUpdatedUri().toString()
+               );
+       };
+
+       /**
+        * Update filter state (selection and highlighting) based
+        * on current URL and default values.
+        */
+       mw.rcfilters.Controller.prototype.updateStateBasedOnUrl = function () {
+               var uri = new mw.Uri(),
+                       defaultParams = this._getDefaultParams();
+
+               this._updateModelState( $.extend( {}, defaultParams, uri.query ) );
+               this.updateChangesList();
+       };
+
+       /**
+        * Update the list of changes and notify the model
+        *
+        * @param {Object} [params] Extra parameters to add to the API call
+        */
+       mw.rcfilters.Controller.prototype.updateChangesList = function ( params ) {
+               this._updateURL( params );
+               this.changesListModel.invalidate();
+               this._fetchChangesList()
+                       .then(
+                               // Success
+                               function ( pieces ) {
+                                       var $changesListContent = pieces.changes,
+                                               $fieldset = pieces.fieldset;
+                                       this.changesListModel.update( $changesListContent, $fieldset );
+                               }.bind( this )
+                               // Do nothing for failure
+                       );
+       };
+
+       /**
+        * Update the model state from given the given parameters.
+        *
+        * This is an internal method, and should only be used from inside
+        * the controller.
+        *
+        * @param {Object} parameters Object representing the parameters for
+        *  filters and highlights
+        */
+       mw.rcfilters.Controller.prototype._updateModelState = function ( parameters ) {
+               // Update filter states
+               this.filtersModel.toggleFiltersSelected(
+                       this.filtersModel.getFiltersFromParameters(
+                               parameters
+                       )
+               );
+
+               // Update highlight state
+               this.filtersModel.toggleHighlight( !!Number( parameters.highlight ) );
+               this.filtersModel.getItems().forEach( function ( filterItem ) {
+                       var color = parameters[ filterItem.getName() + '_color' ];
+                       if ( color ) {
+                               filterItem.setHighlightColor( color );
+                       } else {
+                               filterItem.clearHighlightColor();
+                       }
+               } );
+
+               // Check all filter interactions
+               this.filtersModel.reassessFilterInteractions();
+       };
+
+       /**
+        * Get an object representing the default parameter state, whether
+        * it is from the model defaults or from the saved queries.
+        *
+        * @return {Object} Default parameters
+        */
+       mw.rcfilters.Controller.prototype._getDefaultParams = function () {
+               var data, queryHighlights,
+                       savedParams = {},
+                       savedHighlights = {},
+                       defaultSavedQueryItem = this.savedQueriesModel.getItemByID( this.savedQueriesModel.getDefault() );
+
+               if ( mw.config.get( 'wgStructuredChangeFiltersEnableSaving' ) &&
+                       defaultSavedQueryItem ) {
+
+                       data = defaultSavedQueryItem.getData();
+
+                       queryHighlights = data.highlights || {};
+                       savedParams = this.filtersModel.getParametersFromFilters( data.filters || {} );
+
+                       // Translate highlights to parameters
+                       savedHighlights.highlight = String( Number( queryHighlights.highlight ) );
+                       $.each( queryHighlights, function ( filterName, color ) {
+                               if ( filterName !== 'highlights' ) {
+                                       savedHighlights[ filterName + '_color' ] = color;
+                               }
+                       } );
+
+                       return $.extend( true, {}, savedParams, savedHighlights );
+               }
+
+               return this.filtersModel.getDefaultParams();
+       };
+
        /**
         * Update the URL of the page to reflect current filters
+        *
+        * This should not be called directly from outside the controller.
+        * If an action requires changing the URL, it should either use the
+        * highlighting actions below, or call #updateChangesList which does
+        * the uri corrections already.
+        *
+        * @param {Object} [params] Extra parameters to add to the API call
         */
-       mw.rcfilters.Controller.prototype.updateURL = function () {
-               var uri = this.getUpdatedUri();
-               window.history.pushState( { tag: 'rcfilters' }, document.title, uri.toString() );
+       mw.rcfilters.Controller.prototype._updateURL = function ( params ) {
+               var updatedUri,
+                       notEquivalent = function ( obj1, obj2 ) {
+                               var keys = Object.keys( obj1 ).concat( Object.keys( obj2 ) );
+                               return keys.some( function ( key ) {
+                                       return obj1[ key ] != obj2[ key ]; // eslint-disable-line eqeqeq
+                               } );
+                       };
+
+               params = params || {};
+
+               updatedUri = this._getUpdatedUri();
+               updatedUri.extend( params );
+
+               if ( notEquivalent( updatedUri.query, new mw.Uri().query ) ) {
+                       window.history.pushState( { tag: 'rcfilters' }, document.title, updatedUri.toString() );
+               }
        };
 
        /**
         *
         * @return {mw.Uri} Updated Uri
         */
-       mw.rcfilters.Controller.prototype.getUpdatedUri = function () {
+       mw.rcfilters.Controller.prototype._getUpdatedUri = function () {
                var uri = new mw.Uri(),
                        highlightParams = this.filtersModel.getHighlightParameters();
 
                uri.extend( this.filtersModel.getParametersFromFilters() );
 
                // highlight params
+               uri.query.highlight = Number( this.filtersModel.isHighlightEnabled() );
                Object.keys( highlightParams ).forEach( function ( paramName ) {
-                       if ( highlightParams[ paramName ] ) {
-                               uri.query[ paramName ] = highlightParams[ paramName ];
-                       } else {
-                               delete uri.query[ paramName ];
-                       }
+                       // Always have some value (either the color or null) so that
+                       // if we have something in the URL that doesn't have the highlight
+                       // intentionally, it can override default with highlight.
+                       // Otherwise, the $.extend will always add the highlight that
+                       // exists in the default even if the URL query that is being
+                       // refreshed has different highlights, or has highlights enabled
+                       // but no active highlights anywhere
+                       uri.query[ paramName ] = highlightParams[ paramName ] ?
+                               highlightParams[ paramName ] : null;
                } );
 
                return uri;
         * Fetch the list of changes from the server for the current filters
         *
         * @return {jQuery.Promise} Promise object that will resolve with the changes list
+        *  or with a string denoting no results.
         */
-       mw.rcfilters.Controller.prototype.fetchChangesList = function () {
-               var uri = this.getUpdatedUri(),
+       mw.rcfilters.Controller.prototype._fetchChangesList = function () {
+               var uri = this._getUpdatedUri(),
                        requestId = ++this.requestCounter,
                        latestRequest = function () {
                                return requestId === this.requestCounter;
                        }.bind( this );
-               uri.extend( this.filtersModel.getParametersFromFilters() );
+
                return $.ajax( uri.toString(), { contentType: 'html' } )
-                       .then( function ( html ) {
-                               return latestRequest() ?
-                                       $( $.parseHTML( html ) ).find( '.mw-changeslist' ).first().contents() :
-                                       null;
-                       } ).then( null, function () {
-                               return latestRequest() ? 'NO_RESULTS' : null;
-                       } );
-       };
+                       .then(
+                               // Success
+                               function ( html ) {
+                                       var $parsed;
+                                       if ( !latestRequest() ) {
+                                               return $.Deferred().reject();
+                                       }
 
-       /**
-        * Update the list of changes and notify the model
-        */
-       mw.rcfilters.Controller.prototype.updateChangesList = function () {
-               this.changesListModel.invalidate();
-               this.fetchChangesList()
-                       .always( function ( changesListContent ) {
-                               if ( changesListContent ) {
-                                       this.changesListModel.update( changesListContent );
-                               }
-                       }.bind( this ) );
-       };
+                                       $parsed = $( $.parseHTML( html ) );
 
-       /**
-        * Toggle the highlight feature on and off
-        */
-       mw.rcfilters.Controller.prototype.toggleHighlight = function () {
-               this.filtersModel.toggleHighlight();
-               this.updateURL();
-       };
+                                       return {
+                                               // Changes list
+                                               changes: $parsed.find( '.mw-changeslist' ).first().contents(),
+                                               // Fieldset
+                                               fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+                                       };
+                               },
+                               // Failure
+                               function ( responseObj ) {
+                                       var $parsed;
 
-       /**
-        * Set the highlight color for a filter item
-        *
-        * @param {string} filterName Name of the filter item
-        * @param {string} color Selected color
-        */
-       mw.rcfilters.Controller.prototype.setHighlightColor = function ( filterName, color ) {
-               this.filtersModel.setHighlightColor( filterName, color );
-               this.updateURL();
+                                       if ( !latestRequest() ) {
+                                               return $.Deferred().reject();
+                                       }
+
+                                       $parsed = $( $.parseHTML( responseObj.responseText ) );
+
+                                       // Force a resolve state to this promise
+                                       return $.Deferred().resolve( {
+                                               changes: 'NO_RESULTS',
+                                               fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+                                       } ).promise();
+                               }
+                       );
        };
 
        /**
-        * Clear highlight for a filter item
+        * Track usage of highlight feature
         *
-        * @param {string} filterName Name of the filter item
+        * @param {string} action
+        * @param {array|object|string} filters
         */
-       mw.rcfilters.Controller.prototype.clearHighlightColor = function ( filterName ) {
-               this.filtersModel.clearHighlightColor( filterName );
-               this.updateURL();
+       mw.rcfilters.Controller.prototype._trackHighlight = function ( action, filters ) {
+               filters = typeof filters === 'string' ? { name: filters } : filters;
+               filters = !Array.isArray( filters ) ? [ filters ] : filters;
+               mw.track(
+                       'event.ChangesListHighlights',
+                       {
+                               action: action,
+                               filters: filters,
+                               userId: mw.user.getId()
+                       }
+               );
        };
+
 }( mediaWiki, jQuery ) );
index 33e9f57..dd8fae0 100644 (file)
                init: function () {
                        var filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
                                changesListModel = new mw.rcfilters.dm.ChangesListViewModel(),
-                               controller = new mw.rcfilters.Controller( filtersModel, changesListModel ),
+                               savedQueriesModel = new mw.rcfilters.dm.SavedQueriesModel(),
+                               controller = new mw.rcfilters.Controller( filtersModel, changesListModel, savedQueriesModel ),
                                $overlay = $( '<div>' )
                                        .addClass( 'mw-rcfilters-ui-overlay' ),
                                filtersWidget = new mw.rcfilters.ui.FilterWrapperWidget(
-                                       controller, filtersModel, { $overlay: $overlay } );
+                                       controller, filtersModel, savedQueriesModel, { $overlay: $overlay } );
 
+                       // TODO: The changesListWrapperWidget should be able to initialize
+                       // after the model is ready.
                        // eslint-disable-next-line no-new
                        new mw.rcfilters.ui.ChangesListWrapperWidget(
                                filtersModel, changesListModel, $( '.mw-changeslist, .mw-changeslist-empty' ) );
 
+                       controller.initialize( mw.config.get( 'wgStructuredChangeFilters' ) );
+
                        // eslint-disable-next-line no-new
                        new mw.rcfilters.ui.FormWrapperWidget(
-                               changesListModel, $( '.rcoptions form' ) );
-
-                       controller.initialize( {
-                               registration: {
-                                       title: mw.msg( 'rcfilters-filtergroup-registration' ),
-                                       type: 'send_unselected_if_any',
-                                       fullCoverage: true,
-                                       filters: [
-                                               {
-                                                       name: 'hideliu',
-                                                       label: mw.msg( 'rcfilters-filter-registered-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-registered-description' ),
-                                                       'class': 'mw-changeslist-liu'
-                                               },
-                                               {
-                                                       name: 'hideanons',
-                                                       label: mw.msg( 'rcfilters-filter-unregistered-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-unregistered-description' ),
-                                                       'class': 'mw-changeslist-anon'
-                                               }
-                                       ]
-                               },
-                               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: ',',
-                                       fullCoverage: false,
-                                       filters: [
-                                               {
-                                                       name: 'newcomer',
-                                                       label: mw.msg( 'rcfilters-filter-userExpLevel-newcomer-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-newcomer-description' ),
-                                                       conflicts: [ 'hideanons' ],
-                                                       'class': 'mw-changeslist-user-newcomer'
-                                               },
-                                               {
-                                                       name: 'learner',
-                                                       label: mw.msg( 'rcfilters-filter-userExpLevel-learner-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-learner-description' ),
-                                                       conflicts: [ 'hideanons' ],
-                                                       'class': 'mw-changeslist-user-learner'
-                                               },
-                                               {
-                                                       name: 'experienced',
-                                                       label: mw.msg( 'rcfilters-filter-userExpLevel-experienced-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-userExpLevel-experienced-description' ),
-                                                       conflicts: [ 'hideanons' ],
-                                                       'class': 'mw-changeslist-user-experienced'
-                                               }
-                                       ]
-                               },
-                               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',
-                                       fullCoverage: true,
-                                       filters: [
-                                               {
-                                                       name: 'hidemyself',
-                                                       label: mw.msg( 'rcfilters-filter-editsbyself-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-editsbyself-description' ),
-                                                       'class': 'mw-changeslist-self'
-                                               },
-                                               {
-                                                       name: 'hidebyothers',
-                                                       label: mw.msg( 'rcfilters-filter-editsbyother-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-editsbyother-description' ),
-                                                       'class': 'mw-changeslist-others'
-                                               }
-                                       ]
-                               },
-                               automated: {
-                                       title: mw.msg( 'rcfilters-filtergroup-automated' ),
-                                       type: 'send_unselected_if_any',
-                                       fullCoverage: true,
-                                       filters: [
-                                               {
-                                                       name: 'hidebots',
-                                                       label: mw.msg( 'rcfilters-filter-bots-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-bots-description' ),
-                                                       'default': true,
-                                                       'class': 'mw-changeslist-bot'
-                                               },
-                                               {
-                                                       name: 'hidehumans',
-                                                       label: mw.msg( 'rcfilters-filter-humans-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-humans-description' ),
-                                                       'default': false,
-                                                       'class': 'mw-changeslist-human'
-                                               }
-                                       ]
-                               },
-                               significance: {
-                                       title: mw.msg( 'rcfilters-filtergroup-significance' ),
-                                       type: 'send_unselected_if_any',
-                                       fullCoverage: true,
-                                       filters: [
-                                               {
-                                                       name: 'hideminor',
-                                                       label: mw.msg( 'rcfilters-filter-minor-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-minor-description' ),
-                                                       'class': 'mw-changeslist-minor'
-                                               },
-                                               {
-                                                       name: 'hidemajor',
-                                                       label: mw.msg( 'rcfilters-filter-major-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-major-description' ),
-                                                       'class': 'mw-changeslist-major'
-                                               }
-                                       ]
-                               },
-                               changetype: {
-                                       title: mw.msg( 'rcfilters-filtergroup-changetype' ),
-                                       type: 'send_unselected_if_any',
-                                       fullCoverage: true,
-                                       filters: [
-                                               {
-                                                       name: 'hidepageedits',
-                                                       label: mw.msg( 'rcfilters-filter-pageedits-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-pageedits-description' ),
-                                                       'default': false,
-                                                       'class': 'mw-changeslist-src-mw-edit'
-
-                                               },
-                                               {
-                                                       name: 'hidenewpages',
-                                                       label: mw.msg( 'rcfilters-filter-newpages-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-newpages-description' ),
-                                                       'default': false,
-                                                       'class': 'mw-changeslist-src-mw-new'
-                                               },
-                                               {
-                                                       name: 'hidecategorization',
-                                                       label: mw.msg( 'rcfilters-filter-categorization-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-categorization-description' ),
-                                                       'default': true,
-                                                       'class': 'mw-changeslist-src-mw-categorize'
-                                               },
-                                               {
-                                                       name: 'hidelog',
-                                                       label: mw.msg( 'rcfilters-filter-logactions-label' ),
-                                                       description: mw.msg( 'rcfilters-filter-logactions-description' ),
-                                                       'default': false,
-                                                       'class': 'mw-changeslist-src-mw-log'
-                                               }
-                                       ]
-                               }
-                       } );
+                               filtersModel, changesListModel, controller, $( 'fieldset.rcoptions' ) );
 
-                       $( '.rcoptions' ).before( filtersWidget.$element );
+                       $( '.rcfilters-container' ).append( filtersWidget.$element );
                        $( 'body' ).append( $overlay );
 
-                       // 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 ( filtersModel.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 );
-                               }
-                       } );
+                       // Set as ready
+                       $( '.rcfilters-head' ).addClass( 'mw-rcfilters-ui-ready' );
 
                        window.addEventListener( 'popstate', function () {
-                               controller.updateFromURL();
+                               controller.updateStateBasedOnUrl();
                                controller.updateChangesList();
                        } );
+
+                       $( 'a.mw-helplink' ).attr(
+                               'href',
+                               'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:New_filters_for_edit_review'
+                       );
+
+                       controller.replaceUrl();
                }
        };
 
index 3ddb5a0..8cea27e 100644 (file)
@@ -1,3 +1,45 @@
 ( function ( mw ) {
-       mw.rcfilters = { dm: {}, ui: {} };
+       mw.rcfilters = {
+               dm: {},
+               ui: {},
+               utils: {
+                       addArrayElementsUnique: function ( arr, elements ) {
+                               elements = Array.isArray( elements ) ? elements : [ elements ];
+
+                               elements.forEach( function ( element ) {
+                                       if ( arr.indexOf( element ) === -1 ) {
+                                               arr.push( element );
+                                       }
+                               } );
+
+                               return arr;
+                       },
+                       normalizeParamOptions: function ( givenOptions, legalOptions ) {
+                               var result = [];
+
+                               if ( givenOptions.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
+                               givenOptions.forEach( function ( value ) {
+                                       if (
+                                               legalOptions.indexOf( value ) > -1 &&
+                                               result.indexOf( value ) === -1
+                                       ) {
+                                               result.push( value );
+                                       }
+                               } );
+
+                               return result;
+                       }
+               }
+       };
 }( mediaWiki ) );
index 8423363..d47346c 100644 (file)
@@ -1,9 +1,33 @@
 // Corrections for the standard special page
-.rcoptions {
-       border: 0;
-       border-bottom: 1px solid #a2a9b1;
+.client-js{
+       .rcoptions {
+               border: 0;
+               border-bottom: 1px solid #a2a9b1;
 
-       legend {
-               display: none;
+               legend {
+                       display: none;
+               }
        }
+
+       .rcfilters-head {
+               min-height: 270px;
+               &:not( .mw-rcfilters-ui-ready ) {
+                       /* @embed */
+                       background-image: url( ../images/pending.gif );
+                       margin: 0;
+
+                       * {
+                               visibility: hidden;
+                       }
+               }
+       }
+
+       .rcfilters-container {
+               min-height: 100px;
+               margin: 0;
+       }
+}
+
+.mw-rcfilters-staticfilters-selected {
+       font-weight: bold;
 }
index 5c31b5d..2ce2c7f 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mw.rcfilters.variables";
+@import 'mediawiki.mixins';
+@import 'mw.rcfilters.variables';
 
 // This is a general mixin for a color circle
 .mw-rcfilters-mixin-circle( @color: white, @diameter: 2em, @padding: 0.5em, @border: false ) {
@@ -23,7 +23,7 @@
 // a color class on its parent element
 .result-circle( @colorName: 'none' ) {
        &-@{colorName} {
-               .mw-rcfilters-mixin-circle( ~"@{highlight-@{colorName}}", @result-circle-diameter, 0 );
+               .mw-rcfilters-mixin-circle( ~'@{highlight-@{colorName}}', @result-circle-diameter, 0 );
                display: none;
 
                .mw-rcfilters-highlight-color-@{colorName} & {
 
 // This mixin produces color mixes for two, three and four colors
 .highlight-color-mix( @color1, @color2, @color3: false, @color4: false ) {
-       @highlight-color-class-var: ~".mw-rcfilters-highlight-color-@{color1}.mw-rcfilters-highlight-color-@{color2}";
+       @highlight-color-class-var: ~'.mw-rcfilters-highlight-color-@{color1}.mw-rcfilters-highlight-color-@{color2}';
 
        // The nature of these variables and them being inside
        // a 'tint' and 'average' LESS functions is such where
        // the parsing is failing if it is done inside those functions.
        // Instead, we first construct their LESS variable names,
        // and then we call them inside those functions by calling @@var
-       @c1var: ~"highlight-@{color1}";
-       @c2var: ~"highlight-@{color2}";
+       @c1var: ~'highlight-@{color1}';
+       @c2var: ~'highlight-@{color2}';
 
        // Two colors
        @{highlight-color-class-var} when ( @color3 = false ) and ( @color4 = false ) and not ( @color1 = false ), ( @color2 = false ) {
        }
        // Three colors
        @{highlight-color-class-var}.mw-rcfilters-highlight-color-@{color3} when ( @color4 = false ) and not ( @color3 = false ) {
-               @c3var: ~"highlight-@{color3}";
+               @c3var: ~'highlight-@{color3}';
                background-color: tint( mix( @@c1var, average( @@c2var, @@c3var ), 33% ), 30% );
        }
 
        // Four colors
        @{highlight-color-class-var}.mw-rcfilters-highlight-color-@{color3}.mw-rcfilters-highlight-color-@{color4} when not ( @color4 = false ) {
-               @c3var: ~"highlight-@{color3}";
-               @c4var: ~"highlight-@{color4}";
+               @c3var: ~'highlight-@{color3}';
+               @c4var: ~'highlight-@{color4}';
                background-color: tint( mix( @@c1var, mix( @@c2var, average( @@c3var, @@c4var ), 25% ), 25% ), 25% );
        }
 }
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less
deleted file mode 100644 (file)
index 2521899..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-@import "mw.rcfilters.mixins";
-
-.mw-rcfilters-ui-capsuleItemWidget {
-       &-popup-content {
-               padding: 0.5em;
-               color: #54595d;
-       }
-
-       &.oo-ui-labelElement .oo-ui-labelElement-label {
-               vertical-align: middle;
-               cursor: pointer;
-       }
-
-       &-muted {
-               // Muted state
-               // We want everything muted except the circle
-               background-color: rgba( 255, 255, 255, @muted-opacity );
-
-               .oo-ui-labelElement-label,
-               .oo-ui-buttonWidget {
-                       opacity: @muted-opacity;
-               }
-       }
-
-       &-highlight {
-               display: none;
-               padding-right: 0.5em;
-
-               &-highlighted {
-                       display: inline-block;
-
-               }
-
-               &[data-color="c1"] {
-                       .mw-rcfilters-mixin-circle( @highlight-c1, 0.7em, ~"0 0.5em 0 0" );
-               }
-               &[data-color="c2"] {
-                       .mw-rcfilters-mixin-circle( @highlight-c2, 0.7em, ~"0 0.5em 0 0" );
-               }
-               &[data-color="c3"] {
-                       .mw-rcfilters-mixin-circle( @highlight-c3, 0.7em, ~"0 0.5em 0 0" );
-               }
-               &[data-color="c4"] {
-                       .mw-rcfilters-mixin-circle( @highlight-c4, 0.7em, ~"0 0.5em 0 0" );
-               }
-               &[data-color="c5"] {
-                       .mw-rcfilters-mixin-circle( @highlight-c5, 0.7em, ~"0 0.5em 0 0" );
-               }
-       }
-}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less
new file mode 100644 (file)
index 0000000..04e5efe
--- /dev/null
@@ -0,0 +1,9 @@
+.mw-rcfilters-ui-capsuleItemWidget {
+       .oo-ui-buttonElement {
+               // Override the vertical align for the close button
+               // for some unknown reason, this rule, in combination
+               // with the negative margin-top rule, pushes all the
+               // close buttons up above the capsule item.
+               vertical-align: baseline;
+       }
+}
index 5ad2a19..3337a03 100644 (file)
@@ -1,19 +1,37 @@
 @import 'mw.rcfilters.mixins';
 
 .mw-rcfilters-ui-changesListWrapperWidget {
+       &-results {
+               width: 35em;
+               margin: 5em auto;
+
+               &-noresult,
+               &-conflict {
+                       font-weight: bold;
+                       margin-bottom: 0.5em;
+               }
+       }
+
+       ul {
+               // Each li's margin-left should be the width of the highlights
+               // element + the margin
+               margin-left: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )';
+       }
+
        &-highlighted {
                ul {
                        list-style: none;
-                       // Each li's margin-left should be the width of the highlights
-                       // element + the margin
-                       margin-left: ~"calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )";
+
+                       li {
+                               list-style: none;
+                       }
                }
        }
 
        // Correction for Enhanced RC
        // This is outside the scope of the 'highlights' wrapper
        table.mw-enhanced-rc {
-               margin-left: ~"calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )";
+               margin-left: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )';
 
                td:last-child {
                        width: 100%;
@@ -26,7 +44,7 @@
                text-align: right;
                // The width is 5 circles times their diameter + individual margin
                // and then plus the general margin
-               width: ~"calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 )";
+               width: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 )';
                // And we want to shift the entire block to the left of the li
                position: absolute;
                left: 0;
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less
deleted file mode 100644 (file)
index 8921f7a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-.mw-rcfilters-ui-filterCapsuleMultiselectWidget {
-       max-width: none;
-
-       &.oo-ui-widget-enabled .oo-ui-capsuleMultiselectWidget-handle {
-               background-color: #f8f9fa;
-               border: 1px solid #a2a9b1;
-               min-height: 5.5em;
-               padding: 0.75em;
-
-       }
-
-       &-content-title {
-               font-weight: bold;
-               color: #54595d;
-       }
-
-       &-emptyFilters {
-               color: #72777d;
-       }
-
-       &-cell-filters {
-               width: 100%;
-       }
-       &-cell-reset {
-               text-align: right;
-               padding-left: 0.5em;
-       }
-
-       .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
deleted file mode 100644 (file)
index 615ac31..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-@import "mediawiki.mixins";
-
-.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;
-               .box-sizing( border-box );
-       }
-
-       &-active {
-               .mw-rcfilters-ui-filterGroupWidget-title {
-                       font-weight: bold;
-               }
-       }
-}
index 4619b6b..198f599 100644 (file)
@@ -1,8 +1,7 @@
-@import "mw.rcfilters.mixins";
+@import 'mw.rcfilters.mixins';
 
 .mw-rcfilters-ui-filterItemHighlightButton {
-
-       &-circle {
+       .oo-ui-buttonWidget.oo-ui-popupButtonWidget .oo-ui-buttonElement-button > &-circle {
                display: inline-block;
                vertical-align: middle;
                background-image: none;
                        &-c1 {
                                // These values duplicate the sizing of the icon
                                // width/height 1.875em
-                               .mw-rcfilters-mixin-circle( @highlight-c1, 1.875em, 0 );
+                               .mw-rcfilters-mixin-circle( @highlight-c1, 1.875em, 0.2em 0 );
                        }
                        &-c2 {
-                               .mw-rcfilters-mixin-circle( @highlight-c2, 1.875em, 0 );
+                               .mw-rcfilters-mixin-circle( @highlight-c2, 1.875em, 0.2em 0 );
                        }
                        &-c3 {
-                               .mw-rcfilters-mixin-circle( @highlight-c3, 1.875em, 0 );
+                               .mw-rcfilters-mixin-circle( @highlight-c3, 1.875em, 0.2em 0 );
                        }
                        &-c4 {
-                               .mw-rcfilters-mixin-circle( @highlight-c4, 1.875em, 0 );
+                               .mw-rcfilters-mixin-circle( @highlight-c4, 1.875em, 0.2em 0 );
                        }
                        &-c5 {
-                               .mw-rcfilters-mixin-circle( @highlight-c5, 1.875em, 0 );
+                               .mw-rcfilters-mixin-circle( @highlight-c5, 1.875em, 0.2em 0 );
                        }
                }
        }
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less
deleted file mode 100644 (file)
index 94da3ac..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-@import "mediawiki.mixins";
-
-.mw-rcfilters-ui-filterItemWidget {
-       padding: 0 0.5em;
-       .box-sizing( border-box );
-
-       .mw-rcfilters-ui-table {
-               padding-top: 0.5em;
-       }
-
-       &-muted {
-               background-color: #f8f9fa; // Base90 AAA
-               .mw-rcfilters-ui-filterItemWidget-label-title,
-               .mw-rcfilters-ui-filterItemWidget-label-desc {
-                       color: #54595d; // Base20 AAA
-               }
-       }
-
-       &-label {
-               &-title {
-                       font-weight: bold;
-                       font-size: 1.2em;
-                       color: #222;
-               }
-               &-desc {
-                       color: #464a4f;
-               }
-       }
-
-       &-filterCheckbox {
-               .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
-                       // Override margin-top and -bottom rules from FieldLayout
-                       margin: 0 !important;
-               }
-
-       }
-
-       &-highlightButton {
-               width: 4em;
-               padding-left: 1em;
-       }
-}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuHeaderWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuHeaderWidget.less
new file mode 100644 (file)
index 0000000..4914dd9
--- /dev/null
@@ -0,0 +1,29 @@
+@import 'mediawiki.mixins';
+
+.mw-rcfilters-ui-filterMenuHeaderWidget {
+       &-title {
+               font-size: 1.2em;
+               padding: 0.75em 0.5em;
+               // TODO: Unify colors with official design palette
+               color: #54595d;
+       }
+
+       &-header {
+               border-bottom: 1px solid #c8ccd1;
+               background: #f8f9fa;
+
+               &-highlight {
+                       width: 1em;
+                       vertical-align: middle;
+                       // Using the same padding that the filter item
+                       // uses, so the button is aligned with the highlight
+                       // buttons for the filters
+                       padding-right: 0.5em;
+               }
+
+               &-title {
+                       width: 100%;
+                       vertical-align: middle;
+               }
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.less
new file mode 100644 (file)
index 0000000..28aae6c
--- /dev/null
@@ -0,0 +1,20 @@
+@import 'mediawiki.mixins';
+
+.mw-rcfilters-ui-filterMenuOptionWidget {
+       &.oo-ui-flaggedElement-muted {
+               background-color: #f8f9fa; // Base90 AAA
+
+               .mw-rcfilters-ui-itemMenuOptionWidget-label-title,
+               .mw-rcfilters-ui-itemMenuOptionWidget-label-desc {
+                       color: #54595d; // Base20 AAA
+               }
+
+               &.oo-ui-optionWidget-highlighted {
+                       // Copying over styles from OOUI, since it must
+                       // override our 'muted' state
+                       background-color: #eaecf0;
+                       color: #000;
+               }
+       }
+
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.monobook.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.monobook.less
new file mode 100644 (file)
index 0000000..dbcc3e4
--- /dev/null
@@ -0,0 +1,5 @@
+.mw-rcfilters-ui-filterMenuOptionWidget {
+       &.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+               background-image: none;
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuSectionOptionWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuSectionOptionWidget.less
new file mode 100644 (file)
index 0000000..964f27e
--- /dev/null
@@ -0,0 +1,60 @@
+@import 'mediawiki.mixins';
+
+.mw-rcfilters-ui-filterMenuSectionOptionWidget {
+       background: #eaecf0;
+       padding-bottom: 0.7em;
+
+       &-header {
+               padding: 0 0.75em;
+               // Use a high specificity to override OOUI
+               .oo-ui-optionWidget.oo-ui-labelElement &-title.oo-ui-labelElement-label {
+                       // TODO: Unify colors with official design palette
+                       color: #555a5d;
+                       .box-sizing( border-box );
+                       display: inline-block;
+                       line-height: normal;
+               }
+       }
+
+       &-whatsThisButton {
+               margin-left: 1.5em;
+               &.oo-ui-buttonElement {
+                       vertical-align: text-bottom;
+
+                       & > .oo-ui-buttonElement-button {
+                               font-weight: normal;
+                               // Override OOUI's definitions for button
+                               border-color: transparent;
+                               padding: 0;
+
+                               &:focus {
+                                       box-shadow: none;
+                                       outline: 0;
+                               }
+                       }
+               }
+
+               &-popup-content {
+                       padding: 1em;
+
+                       &-header {
+                               font-weight: bold;
+                               margin-bottom: 1em;
+                       }
+
+                       &-link {
+                               margin: 1em 0;
+                       }
+
+                       .oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+                               margin-left: 0;
+                       }
+               }
+       }
+
+       &-active {
+               .mw-rcfilters-ui-filterMenuSectionOptionWidget-header-title {
+                       font-weight: bold;
+               }
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less
new file mode 100644 (file)
index 0000000..66e6d96
--- /dev/null
@@ -0,0 +1,46 @@
+.mw-rcfilters-ui-filterTagMultiselectWidget {
+       max-width: none;
+
+       .oo-ui-tagMultiselectWidget-input input {
+               // Make sure this uses the interface direction, not the content direction
+               direction: ltr;
+       }
+
+       &.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle {
+               border: 1px solid #a2a9b1;
+               border-bottom: 0;
+               background-color: #f8f9fa;
+               border-radius: 2px 2px 0 0;
+               padding: 0.3em 0.6em 0.6em 0.6em;
+               margin-top: 1.6em;
+       }
+
+       .mw-rcfilters-ui-table {
+               margin-top: 0.3em;
+       }
+
+       &-wrapper-content {
+               &-title {
+                       font-weight: bold;
+                       color: #54595d;
+               }
+
+               &-savedQueryTitle {
+                       color: #72777d;
+                       margin-left: 1em;
+               }
+       }
+
+       &-emptyFilters {
+               color: #72777d;
+       }
+
+       &-cell-filters {
+               width: 100%;
+       }
+
+       &-cell-reset {
+               text-align: right;
+               padding-left: 0.5em;
+       }
+}
index bdc94b3..dc8b013 100644 (file)
@@ -2,23 +2,4 @@
        width: 100%;
        // Make sure this uses the interface direction, not the content direction
        direction: ltr;
-
-       &-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;
-
-               input {
-                       // We need to reiterate the directionality
-                       // for the input as well to literally override
-                       // a MediaWiki CSS rule that turns it 'ltr'
-                       direction: ltr;
-               }
-       }
 }
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FiltersListWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FiltersListWidget.less
deleted file mode 100644 (file)
index 7fd3a21..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-.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;
-               overflow: hidden;
-       }
-
-       &-noresults {
-               padding: 0.5em;
-               // TODO: Unify colors with official design palette
-               color: #666;
-       }
-
-       &-hightlightButton {
-               float: right;
-       }
-}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FloatingMenuSelectWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FloatingMenuSelectWidget.less
new file mode 100644 (file)
index 0000000..67823c9
--- /dev/null
@@ -0,0 +1,30 @@
+@import 'mediawiki.mixins';
+
+.mw-rcfilters-ui-floatingMenuSelectWidget {
+       z-index: auto;
+       max-width: 650px;
+
+       &.oo-ui-menuSelectWidget-invisible {
+               display: block;
+       }
+
+       &-noresults {
+               display: none;
+               padding: 0.5em;
+               color: #666;
+
+               .oo-ui-menuSelectWidget-invisible & {
+                       display: inline-block;
+               }
+       }
+
+       &-body {
+               max-height: 70vh;
+       }
+
+       &-footer {
+               background-color: #f8f9fa;
+               text-align: right;
+               padding: 0.5em;
+       }
+}
index 14c07c1..88f1195 100644 (file)
@@ -1,4 +1,4 @@
-@import "mw.rcfilters.mixins";
+@import 'mw.rcfilters.mixins';
 
 .mw-rcfilters-ui-highlightColorPickerWidget {
        &-label {
@@ -16,6 +16,8 @@
 
                        &-none {
                                .mw-rcfilters-mixin-circle( @highlight-none, 2em, 0.5em, true );
+                               // Override border to dashed
+                               border: 1px dashed #565656;
 
                                &.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
                                &.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less
new file mode 100644 (file)
index 0000000..44c5529
--- /dev/null
@@ -0,0 +1,51 @@
+@import 'mediawiki.mixins';
+
+.mw-rcfilters-ui-itemMenuOptionWidget {
+       padding: 0 0.5em;
+       .box-sizing( border-box );
+
+       &:not( :last-child ) {
+               border-bottom: solid 1px #eaecf0; // Base 80 AAA
+       }
+
+       &:hover {
+               background-color: #fbfbfb;
+       }
+
+       .mw-rcfilters-ui-table {
+               padding-top: 0.5em;
+       }
+
+       &.oo-ui-optionWidget-selected {
+               background-color: #eaf3ff; // Accent90 AAA
+       }
+
+       &-label {
+               &-title {
+                       font-weight: bold;
+                       font-size: 1.15em;
+                       color: #222;
+               }
+               &-desc {
+                       color: #464a4f;
+                       white-space: normal;
+               }
+       }
+
+       &-itemCheckbox {
+               .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
+                       // Override margin-top and -bottom rules from FieldLayout
+                       margin: 0 !important; /* stylelint-disable-line declaration-no-important */
+               }
+
+               .oo-ui-checkboxInputWidget {
+                       // Workaround for IE11 rendering issues. T162098
+                       display: block;
+               }
+       }
+
+       &-highlightButton {
+               width: 4em;
+               padding-left: 1em;
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less
new file mode 100644 (file)
index 0000000..fae2b32
--- /dev/null
@@ -0,0 +1,3 @@
+.mw-rcfilters-ui-overlay {
+       font-size: 1.28em; /* 0.8em / x-small */
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less
new file mode 100644 (file)
index 0000000..e19c246
--- /dev/null
@@ -0,0 +1,22 @@
+.mw-rcfilters-ui-saveFiltersPopupButtonWidget {
+       &-popup {
+               &-layout {
+                       padding-bottom: 1.5em;
+               }
+
+               > .oo-ui-popupWidget-popup > .oo-ui-popupWidget-head {
+                       > .oo-ui-iconWidget {
+                               margin: 0.75em 0.5em;
+                               float: left;
+                       }
+
+                       > .oo-ui-labelElement-label {
+                               font-size: 1.2em;
+                               padding: 0.3em;
+                               margin-left: 0;
+                               font-weight: bold;
+                       }
+               }
+       }
+
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less
new file mode 100644 (file)
index 0000000..fb0b93b
--- /dev/null
@@ -0,0 +1,53 @@
+.mw-rcfilters-ui-savedLinksListItemWidget {
+       padding: 0.2em 0.7em;
+
+       &:hover {
+               // Mimicking optionWidget styles
+               background-color: #eaecf0;
+               color: #000;
+       }
+
+       .mw-rcfilters-ui-cell {
+               vertical-align: middle;
+       }
+
+       .oo-ui-iconElement-icon {
+               // Since we made the rows narrower (height smaller than usual)
+               // then the icon needs to be slightly smaller as well, so that
+               // when we toggle 'default' the icon doesn't bounce the option
+               // height up a little
+               width: 1.7em;
+               height: 1.7em;
+       }
+
+       &-icon span {
+               display: inline-block;
+       }
+
+       &-input {
+               display: inline-block;
+               margin-right: 0;
+               width: 15em;
+       }
+
+       &-label {
+               max-width: 15em;
+               display: inline-block;
+               vertical-align: middle;
+               text-overflow: ellipsis;
+               overflow: hidden;
+               cursor: pointer;
+               margin-left: 0.5px;
+               color: #36c; // Accent50;
+       }
+
+       &-icon,
+       &-button {
+               width: 2em;
+       }
+
+       &-content {
+               width: 100%;
+       }
+
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less
new file mode 100644 (file)
index 0000000..716ed03
--- /dev/null
@@ -0,0 +1,30 @@
+.mw-rcfilters-ui-savedLinksListWidget {
+       float: right;
+
+       &-menu {
+               width: 100%;
+       }
+
+       &-placeholder {
+               &-title {
+                       font-weight: bold;
+                       margin-bottom: 1em;
+               }
+
+               // Extra specificity needed to override OOUI rule that sets white-space: nowrap;
+               // on labels inside options
+               &.oo-ui-optionWidget .oo-ui-labelElement-label {
+                       color: #72777d;
+                       white-space: normal;
+               }
+
+               .oo-ui-iconElement-icon {
+                       opacity: 0.5;
+                       // Override OOUI option widget rules for icons
+                       // we want the icon to appear at the top near the
+                       // title, not in the middle of the multiline option
+                       top: 0.7em !important; /* stylelint-disable-line declaration-no-important */
+                       height: inherit !important; /* stylelint-disable-line declaration-no-important */
+               }
+       }
+}
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.TagItemWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.TagItemWidget.less
new file mode 100644 (file)
index 0000000..4805f64
--- /dev/null
@@ -0,0 +1,80 @@
+@import 'mw.rcfilters.mixins';
+
+.mw-rcfilters-ui-tagItemWidget {
+       // Background and color of the capsule widget need a bit
+       // more specificity to override ooui internals
+       &.oo-ui-flaggedElement-muted.oo-ui-tagItemWidget.oo-ui-widget-enabled {
+               // Muted state
+               background-color: #eaecf0;
+               border-color: #c8ccd1;
+
+               .oo-ui-labelElement-label {
+                       color: #72777d;
+               }
+               .oo-ui-buttonWidget {
+                       opacity: @muted-opacity;
+               }
+       }
+
+       &.oo-ui-flaggedElement-invalid.oo-ui-tagItemWidget.oo-ui-widget-enabled {
+               .oo-ui-labelElement-label {
+                       color: #b32424;
+               }
+       }
+
+       // OOUI classes require super-specificity in order to override
+       // the white background
+       // The specificity is fixed in the patch: https://gerrit.wikimedia.org/r/#/c/349525/
+       // and will be available in the next OOUI release.
+       .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled.oo-ui-tagMultiselectWidget-outlined .oo-ui-tagMultiselectWidget-handle &-selected.oo-ui-tagItemWidget.oo-ui-widget-enabled {
+               background-color: #eaf3ff;
+               border-color: #36c;
+       }
+
+       &-popup-content {
+               padding: 0.5em;
+               color: #54595d;
+       }
+
+       &.oo-ui-labelElement .oo-ui-labelElement-label {
+               cursor: pointer;
+       }
+
+       &-highlight {
+               display: none;
+               margin-right: 0.5em;
+               height: 100%;
+               width: 10px;
+
+               &-highlighted {
+                       display: inline-block;
+               }
+
+               &:before {
+                       content: '';
+                       position: absolute;
+                       display: block;
+                       top: 50%;
+               }
+
+               &[data-color='c1']:before {
+                       .mw-rcfilters-mixin-circle( @highlight-c1, 10px, ~'-5px 0.5em 0 0' );
+               }
+
+               &[data-color='c2']:before {
+                       .mw-rcfilters-mixin-circle( @highlight-c2, 10px, ~'-5px 0.5em 0 0' );
+               }
+
+               &[data-color='c3']:before {
+                       .mw-rcfilters-mixin-circle( @highlight-c3, 10px, ~'-5px 0.5em 0 0' );
+               }
+
+               &[data-color='c4']:before {
+                       .mw-rcfilters-mixin-circle( @highlight-c4, 10px, ~'-5px 0.5em 0 0' );
+               }
+
+               &[data-color='c5']:before {
+                       .mw-rcfilters-mixin-circle( @highlight-c5, 10px, ~'-5px 0.5em 0 0' );
+               }
+       }
+}
index 957e9e9..c0f24c6 100644 (file)
        }
 }
 
+// Temporary icon classes, until these icons
+// are merged into OOUI properly
+.oo-ui-iconElement-icon.oo-ui-icon-clip {
+       /* @embed */
+       background-image: url( ../images/clip.svg );
+}
+
+.oo-ui-iconElement-icon.oo-ui-icon-unClip {
+       /* @embed */
+       background-image: url( ../images/unClip.svg );
+}
+
+.oo-ui-iconElement-icon.oo-ui-icon-pushPin {
+       /* @embed */
+       background-image: url( ../images/pushPin.svg );
+}
index 1ef49e2..3060f25 100644 (file)
@@ -11,9 +11,9 @@
 
 // Result list circle indicators
 // Defined and used in mw.rcfilters.ui.ChangesListWrapperWidget.less
-@result-circle-margin: 0.1em;
+@result-circle-margin: 3px;
 @result-circle-general-margin: 0.5em;
 // In these small sizes, 'em' appears
 // squished and inconsistent.
 // Pixels are better for this use case:
-@result-circle-diameter: 5px;
+@result-circle-diameter: 6px;
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js
deleted file mode 100644 (file)
index cf03932..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-( function ( mw, $ ) {
-       /**
-        * Extend OOUI's CapsuleItemWidget to also display a popup on hover.
-        *
-        * @class
-        * @extends OO.ui.CapsuleItemWidget
-        * @mixins OO.ui.mixin.PopupElement
-        *
-        * @constructor
-        * @param {mw.rcfilters.Controller} controller
-        * @param {mw.rcfilters.dm.FilterItem} model Item model
-        * @param {Object} config Configuration object
-        * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
-        */
-       mw.rcfilters.ui.CapsuleItemWidget = function MwRcfiltersUiCapsuleItemWidget( controller, model, config ) {
-               var $popupContent = $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-capsuleItemWidget-popup-content' ),
-                       descLabelWidget = new OO.ui.LabelWidget();
-
-               // Configuration initialization
-               config = config || {};
-
-               this.controller = controller;
-               this.model = model;
-               this.$overlay = config.$overlay || this.$element;
-               this.positioned = false;
-
-               // Parent constructor
-               mw.rcfilters.ui.CapsuleItemWidget.parent.call( this, $.extend( {
-                       data: this.model.getName(),
-                       label: this.model.getLabel()
-               }, config ) );
-
-               // Mixin constructors
-               OO.ui.mixin.PopupElement.call( this, $.extend( {
-                       popup: {
-                               padded: false,
-                               align: 'center',
-                               $content: $popupContent
-                                       .append( descLabelWidget.$element ),
-                               $floatableContainer: this.$element,
-                               classes: [ 'mw-rcfilters-ui-capsuleItemWidget-popup' ]
-                       }
-               }, config ) );
-
-               // Set initial text for the popup - the description
-               descLabelWidget.setLabel( this.model.getDescription() );
-
-               this.$highlight = $( '<div>' )
-                       .addClass( 'mw-rcfilters-ui-capsuleItemWidget-highlight' );
-
-               // Events
-               this.model.connect( this, { update: 'onModelUpdate' } );
-
-               this.closeButton.$element.on( 'mousedown', this.onCloseButtonMouseDown.bind( this ) );
-
-               // Initialization
-               this.$overlay.append( this.popup.$element );
-               this.$element
-                       .prepend( this.$highlight )
-                       .attr( 'aria-haspopup', 'true' )
-                       .addClass( 'mw-rcfilters-ui-capsuleItemWidget' )
-                       .on( 'mouseover', this.onHover.bind( this, true ) )
-                       .on( 'mouseout', this.onHover.bind( this, false ) );
-
-               this.setCurrentMuteState();
-               this.setHighlightColor();
-       };
-
-       OO.inheritClass( mw.rcfilters.ui.CapsuleItemWidget, OO.ui.CapsuleItemWidget );
-       OO.mixinClass( mw.rcfilters.ui.CapsuleItemWidget, OO.ui.mixin.PopupElement );
-
-       /**
-        * Respond to model update event
-        */
-       mw.rcfilters.ui.CapsuleItemWidget.prototype.onModelUpdate = function () {
-               this.setCurrentMuteState();
-
-               this.setHighlightColor();
-       };
-
-       /**
-        * Override mousedown event to prevent its propagation to the parent,
-        * since the parent (the multiselect widget) focuses the popup when its
-        * mousedown event is fired.
-        *
-        * @param {jQuery.Event} e Event
-        */
-       mw.rcfilters.ui.CapsuleItemWidget.prototype.onCloseButtonMouseDown = function ( e ) {
-               e.stopPropagation();
-       };
-
-       /**
-        * Override the event listening to the item close button click
-        */
-       mw.rcfilters.ui.CapsuleItemWidget.prototype.onCloseClick = function () {
-               var element = this.getElementGroup();
-
-               if ( element && $.isFunction( element.removeItems ) ) {
-                       element.removeItems( [ this ] );
-               }
-
-               // Respond to user removing the filter
-               this.controller.updateFilter( this.model.getName(), false );
-               this.controller.clearHighlightColor( this.model.getName() );
-       };
-
-       mw.rcfilters.ui.CapsuleItemWidget.prototype.setHighlightColor = function () {
-               var selectedColor = this.model.isHighlightEnabled() ? this.model.getHighlightColor() : null;
-
-               this.$highlight
-                       .attr( 'data-color', selectedColor )
-                       .toggleClass(
-                               'mw-rcfilters-ui-capsuleItemWidget-highlight-highlighted',
-                               !!selectedColor
-                       );
-       };
-
-       /**
-        * Set the current mute state for this item
-        */
-       mw.rcfilters.ui.CapsuleItemWidget.prototype.setCurrentMuteState = function () {
-               this.$element
-                       .toggleClass(
-                               'mw-rcfilters-ui-capsuleItemWidget-muted',
-                               !this.model.isSelected() ||
-                               this.model.isIncluded() ||
-                               this.model.isConflicted() ||
-                               this.model.isFullyCovered()
-                       );
-       };
-
-       /**
-        * Respond to hover event on the capsule item.
-        *
-        * @param {boolean} isHovering Mouse is hovering on the item
-        */
-       mw.rcfilters.ui.CapsuleItemWidget.prototype.onHover = function ( isHovering ) {
-               if ( this.model.getDescription() ) {
-                       this.popup.toggle( isHovering );
-
-                       if ( isHovering && !this.positioned ) {
-                               // Recalculate position to be center of the capsule item
-                               this.popup.$element.css( 'margin-left', ( this.$element.width() / 2 ) );
-                               this.positioned = true;
-                       }
-               }
-       };
-
-       /**
-        * Remove and destroy external elements of this widget
-        */
-       mw.rcfilters.ui.CapsuleItemWidget.prototype.destroy = function () {
-               // Destroy the popup
-               this.popup.$element.detach();
-
-               // Disconnect events
-               this.model.disconnect( this );
-               this.closeButton.disconnect( this );
-       };
-}( mediaWiki, jQuery ) );
index 84248e1..f4a1807 100644 (file)
         * @param {jQuery|string} $changesListContent The content of the updated changes list
         */
        mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onModelUpdate = function ( $changesListContent ) {
-               var isEmpty = $changesListContent === 'NO_RESULTS';
+               var conflictItem,
+                       $message = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results' ),
+                       isEmpty = $changesListContent === 'NO_RESULTS';
 
                this.$element.toggleClass( 'mw-changeslist', !isEmpty );
                this.$element.toggleClass( 'mw-changeslist-empty', isEmpty );
                if ( isEmpty ) {
                        this.$changesListContent = null;
-                       this.$element.empty().append(
-                               document.createTextNode( mw.message( 'recentchanges-noresult' ).text() )
-                       );
+                       this.$element.empty();
+
+                       if ( this.filtersViewModel.hasConflict() ) {
+                               conflictItem = this.filtersViewModel.getFirstConflictedItem();
+
+                               $message
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results-conflict' )
+                                                       .text( mw.message( 'rcfilters-noresults-conflict' ).text() ),
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results-message' )
+                                                       .text( mw.message( conflictItem.getCurrentConflictResultMessage() ).text() )
+                                       );
+                       } else {
+                               $message
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results-noresult' )
+                                                       .text( mw.message( 'recentchanges-noresult' ).text() )
+                                       );
+                       }
+
+                       this.$element.append( $message );
                } else {
                        this.$changesListContent = $changesListContent;
                        this.$element.empty().append( this.$changesListContent );
                                                .prop( 'data-color', 'none' )
                                );
 
+               if ( $( '.mw-rcfilters-ui-changesListWrapperWidget-highlights' ).length ) {
+                       // Already set up
+                       return;
+               }
+
                mw.rcfilters.HighlightColors.forEach( function ( color ) {
                        $highlights.append(
                                $( '<div>' )
index 86b3b11..9fd4593 100644 (file)
                mw.rcfilters.ui.CheckboxInputWidget.parent.call( this, config );
 
                // Event
-               this.$input.on( 'change', this.onUserChange.bind( this ) );
+               this.$input
+                       // HACK: This widget just pretends to be a checkbox for visual purposes.
+                       // In reality, all actions - setting to true or false, etc - are
+                       // decided by the model, and executed by the controller. This means
+                       // that we want to let the controller and model make the decision
+                       // of whether to check/uncheck this checkboxInputWidget, and for that,
+                       // we have to bypass the browser action that checks/unchecks it during
+                       // click.
+                       .on( 'click', false )
+                       .on( 'change', this.onUserChange.bind( this ) );
        };
 
        /* Initialization */
 
        /* Methods */
 
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.CheckboxInputWidget.prototype.onEdit = function () {
+               // Similarly to preventing defaults in 'click' event, we want
+               // to prevent this widget from deciding anything about its own
+               // state; it emits a change event and the model and controller
+               // make a decision about what its select state is.
+               // onEdit has a widget.$input.prop( 'checked' ) inside a setTimeout()
+               // so we really want to prevent that from messing with what
+               // the model decides the state of the widget is.
+       };
+
        /**
         * Respond to checkbox change by a user and emit 'userChange'.
         */
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js
deleted file mode 100644 (file)
index 2bd2f0e..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-( function ( mw, $ ) {
-       /**
-        * Filter-specific CapsuleMultiselectWidget
-        *
-        * @class
-        * @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
-        * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
-        * @cfg {number} [topScrollOffset=10] When scrolling the entire widget to the top, leave this
-        *  much space (in pixels) above the widget.
-        */
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget = function MwRcfiltersUiFilterCapsuleMultiselectWidget( controller, model, filterInput, config ) {
-               var title = new OO.ui.LabelWidget( {
-                               label: mw.msg( 'rcfilters-activefilters' ),
-                               classes: [ 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-wrapper-content-title' ]
-                       } ),
-                       $contentWrapper = $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-wrapper' );
-
-               this.$overlay = config.$overlay || this.$element;
-
-               // Parent
-               mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.call( this, $.extend( true, {
-                       popup: { $autoCloseIgnore: filterInput.$element.add( this.$overlay ) }
-               }, config ) );
-
-               this.controller = controller;
-               this.model = model;
-               this.filterInput = filterInput;
-
-               this.topScrollOffset = config.topScrollOffset || 10;
-
-               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' ]
-               } );
-               this.$content.append( this.emptyFilterMessage.$element );
-
-               // Events
-               this.resetButton.connect( this, { click: 'onResetButtonClick' } );
-               this.model.connect( this, {
-                       itemUpdate: 'onModelItemUpdate',
-                       highlightChange: 'onModelHighlightChange'
-               } );
-               this.popup.connect( this, { toggle: 'onPopupToggle' } );
-
-               // Add the filterInput as trigger
-               this.filterInput.$input
-                       .on( 'focus', this.focus.bind( this ) );
-
-               // Build the content
-               $contentWrapper.append(
-                       title.$element,
-                       $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-table' )
-                               .append(
-                                       // The filter list 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-row' )
-                                               .append(
-                                                       this.$content
-                                                               .addClass( 'mw-rcfilters-ui-cell' )
-                                                               .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-cell-filters' ),
-                                                       $( '<div>' )
-                                                               .addClass( 'mw-rcfilters-ui-cell' )
-                                                               .addClass( 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-cell-reset' )
-                                                               .append( this.resetButton.$element )
-                                               )
-                               )
-               );
-
-               // Initialize
-               this.$handle.append( $contentWrapper );
-
-               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 */
-
-       /**
-        * Respond to model itemUpdate event
-        *
-        * @param {mw.rcfilters.dm.FilterItem} item Filter item model
-        */
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onModelItemUpdate = function ( item ) {
-               if (
-                       item.isSelected() ||
-                       (
-                               this.model.isHighlightEnabled() &&
-                               item.isHighlightSupported() &&
-                               item.getHighlightColor()
-                       )
-               ) {
-                       this.addItemByName( item.getName() );
-               } else {
-                       this.removeItemByName( item.getName() );
-               }
-
-               // Re-evaluate reset state
-               this.reevaluateResetRestoreState();
-       };
-
-       /**
-        * Respond to highlightChange event
-        *
-        * @param {boolean} isHighlightEnabled Highlight is enabled
-        */
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onModelHighlightChange = function ( isHighlightEnabled ) {
-               var highlightedItems = this.model.getHighlightedItems();
-
-               if ( isHighlightEnabled ) {
-                       // Add capsule widgets
-                       highlightedItems.forEach( function ( filterItem ) {
-                               this.addItemByName( filterItem.getName() );
-                       }.bind( this ) );
-               } else {
-                       // Remove capsule widgets if they're not selected
-                       highlightedItems.forEach( function ( filterItem ) {
-                               if ( !filterItem.isSelected() ) {
-                                       this.removeItemByName( filterItem.getName() );
-                               }
-                       }.bind( this ) );
-               }
-       };
-
-       /**
-        * 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();
-               }
-       };
-
-       /**
-        * Respond to popup toggle event
-        *
-        * @param {boolean} isVisible Popup is visible
-        */
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onPopupToggle = function ( isVisible ) {
-               if ( isVisible ) {
-                       this.scrollToTop();
-               }
-       };
-
-       /**
-        * Scroll the capsule to the top of the screen
-        */
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.scrollToTop = function () {
-               var container = OO.ui.Element.static.getClosestScrollableContainer( this.$element[ 0 ], 'y' );
-
-               $( container ).animate( {
-                       scrollTop: this.$element.offset().top - this.topScrollOffset
-               } );
-       };
-
-       /**
-        * 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.createItemWidget = function ( data ) {
-               var item = this.model.getItemByName( data );
-
-               if ( !item ) {
-                       return;
-               }
-
-               return new mw.rcfilters.ui.CapsuleItemWidget(
-                       this.controller,
-                       item,
-                       { $overlay: this.$overlay }
-               );
-       };
-
-       /**
-        * Add items by their filter name
-        *
-        * @param {string} name Filter name
-        */
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.addItemByName = function ( name ) {
-               var item = this.model.getItemByName( name );
-
-               if ( !item ) {
-                       return;
-               }
-
-               // Check that the item isn't already added
-               if ( !this.getItemFromData( name ) ) {
-                       this.addItems( [ this.createItemWidget( name ) ] );
-               }
-       };
-
-       /**
-        * Remove items by their filter name
-        *
-        * @param {string} name Filter name
-        */
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.removeItemByName = function ( name ) {
-               this.removeItemsFromData( [ name ] );
-       };
-
-       /**
-        * @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.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();
-       };
-
-       /**
-        * @inheritdoc
-        */
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.removeItems = function ( items ) {
-               // Parent call
-               mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.prototype.removeItems.call( this, items );
-
-               // Destroy the item widget when it is removed
-               // This is done because we re-add items by recreating them, rather than hiding them
-               // and items include popups, that will just continue to be created and appended
-               // unnecessarily.
-               items.forEach( function ( widget ) {
-                       widget.destroy();
-               } );
-       };
-
-       /**
-        * Override 'editItem' since it tries to use $input which does
-        * not exist when a popup is available.
-        */
-       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.editItem = function () {};
-}( 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
deleted file mode 100644 (file)
index f858ab0..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-( function ( mw, $ ) {
-       /**
-        * A group of filters
-        *
-        * @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.FilterGroup} model Filter group model
-        * @param {Object} config Configuration object
-        */
-       mw.rcfilters.ui.FilterGroupWidget = function MwRcfiltersUiFilterGroupWidget( controller, model, config ) {
-               config = config || {};
-
-               // Parent
-               mw.rcfilters.ui.FilterGroupWidget.parent.call( this, config );
-
-               this.controller = controller;
-               this.model = model;
-
-               // Mixin constructors
-               OO.ui.mixin.GroupWidget.call( this, config );
-               OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, {
-                       label: this.model.getTitle(),
-                       $label: $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-filterGroupWidget-title' )
-               } ) );
-               this.$overlay = config.$overlay || this.$element;
-
-               // Populate
-               this.populateFromModel();
-
-               this.model.connect( this, { update: 'onModelUpdate' } );
-
-               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 );
-
-       /**
-        * Respond to model update event
-        */
-       mw.rcfilters.ui.FilterGroupWidget.prototype.onModelUpdate = function () {
-               this.$element.toggleClass(
-                       'mw-rcfilters-ui-filterGroupWidget-active',
-                       this.model.isActive()
-               );
-       };
-
-       mw.rcfilters.ui.FilterGroupWidget.prototype.populateFromModel = function () {
-               var widget = this;
-
-               this.addItems(
-                       this.model.getItems().map( function ( filterItem ) {
-                               return new mw.rcfilters.ui.FilterItemWidget(
-                                       widget.controller,
-                                       filterItem,
-                                       {
-                                               label: filterItem.getLabel(),
-                                               description: filterItem.getDescription(),
-                                               $overlay: widget.$overlay
-                                       }
-                               );
-                       } )
-               );
-       };
-
-       /**
-        * Get the group name
-        *
-        * @return {string} Group name
-        */
-       mw.rcfilters.ui.FilterGroupWidget.prototype.getName = function () {
-               return this.model.getName();
-       };
-}( mediaWiki, jQuery ) );
index 32db0b6..616608e 100644 (file)
                this.colorPickerWidget = new mw.rcfilters.ui.HighlightColorPickerWidget( controller, model );
 
                // Parent
-               mw.rcfilters.ui.FilterItemHighlightButton.parent.call( this, $.extend( {}, config, {
-                       icon: 'edit',
+               mw.rcfilters.ui.FilterItemHighlightButton.parent.call( this, $.extend( true, {}, config, {
+                       icon: 'highlight',
                        indicator: 'down',
                        popup: {
-                               anchor: false,
+                               // TODO: There is a bug in non-anchored popups in
+                               // OOUI, so we set this popup to "anchored" until
+                               // the bug is fixed.
+                               // See: https://phabricator.wikimedia.org/T159906
+                               anchor: true,
                                padded: true,
                                align: 'backwards',
+                               horizontalPosition: 'end',
+                               $floatableContainer: this.$element,
                                width: 290,
                                $content: this.colorPickerWidget.$element
                        }
                // Event
                this.model.connect( this, { update: 'onModelUpdate' } );
                this.colorPickerWidget.connect( this, { chooseColor: 'onChooseColor' } );
+               // This lives inside a MenuOptionWidget, which intercepts mousedown
+               // to select the item. We want to prevent that when we click the highlight
+               // button
+               this.$element.on( 'mousedown', function ( e ) { e.stopPropagation(); } );
 
                this.$element
                        .addClass( 'mw-rcfilters-ui-filterItemHighlightButton' );
 
        OO.inheritClass( mw.rcfilters.ui.FilterItemHighlightButton, OO.ui.PopupButtonWidget );
 
+       /* Static Properties */
+
+       /**
+        * @static
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterItemHighlightButton.static.cancelButtonMouseDownEvents = true;
+
        /* Methods */
 
        /**
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js
deleted file mode 100644 (file)
index 63db2b0..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-( 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 mw.rcfilters.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() )
-                       );
-               }
-
-               this.highlightButton = new mw.rcfilters.ui.FilterItemHighlightButton(
-                       this.controller,
-                       this.model,
-                       {
-                               $overlay: config.$overlay || this.$element
-                       }
-               );
-               this.highlightButton.toggle( this.model.isHighlightEnabled() );
-
-               layout = new OO.ui.FieldLayout( this.checkboxWidget, {
-                       label: $label,
-                       align: 'inline'
-               } );
-
-               // Event
-               this.checkboxWidget.connect( this, { userChange: 'onCheckboxChange' } );
-               this.model.connect( this, { update: 'onModelUpdate' } );
-               this.model.getGroupModel().connect( this, { update: 'onGroupModelUpdate' } );
-
-               this.$element
-                       .addClass( 'mw-rcfilters-ui-filterItemWidget' )
-                       .append(
-                               $( '<div>' )
-                                       .addClass( 'mw-rcfilters-ui-table' )
-                                       .append(
-                                               $( '<div>' )
-                                                       .addClass( 'mw-rcfilters-ui-row' )
-                                                       .append(
-                                                               $( '<div>' )
-                                                                       .addClass( 'mw-rcfilters-ui-cell mw-rcfilters-ui-filterItemWidget-filterCheckbox' )
-                                                                       .append( layout.$element ),
-                                                               $( '<div>' )
-                                                                       .addClass( 'mw-rcfilters-ui-cell mw-rcfilters-ui-filterItemWidget-highlightButton' )
-                                                                       .append( this.highlightButton.$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.setCurrentMuteState();
-       };
-
-       /**
-        * Respond to item group model update event
-        */
-       mw.rcfilters.ui.FilterItemWidget.prototype.onGroupModelUpdate = function () {
-               this.setCurrentMuteState();
-       };
-
-       /**
-        * Set the current mute state for this item
-        */
-       mw.rcfilters.ui.FilterItemWidget.prototype.setCurrentMuteState = function () {
-               this.$element.toggleClass(
-                       'mw-rcfilters-ui-filterItemWidget-muted',
-                       this.model.isConflicted() ||
-                       this.model.isIncluded() ||
-                       this.model.isFullyCovered() ||
-                       (
-                               // Item is also muted when any of the items in its group is active
-                               this.model.getGroupModel().isActive() &&
-                               // But it isn't selected
-                               !this.model.isSelected()
-                       )
-               );
-
-               this.highlightButton.toggle( this.model.isHighlightEnabled() );
-       };
-
-       /**
-        * 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.FilterMenuHeaderWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js
new file mode 100644 (file)
index 0000000..15e7eee
--- /dev/null
@@ -0,0 +1,86 @@
+( function ( mw, $ ) {
+       /**
+        * Menu header for the RCFilters filters menu
+        *
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller Controller
+        * @param {mw.rcfilters.dm.FiltersViewModel} model View model
+        * @param {Object} config Configuration object
+        * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
+        */
+       mw.rcfilters.ui.FilterMenuHeaderWidget = function MwRcfiltersUiFilterMenuHeaderWidget( controller, model, config ) {
+               config = config || {};
+
+               this.controller = controller;
+               this.model = model;
+               this.$overlay = config.$overlay || this.$element;
+
+               // Parent
+               mw.rcfilters.ui.FilterMenuHeaderWidget.parent.call( this, config );
+               OO.ui.mixin.LabelElement.call( this, $.extend( {
+                       label: mw.msg( 'rcfilters-filterlist-title' ),
+                       $label: $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget-title' )
+               }, config ) );
+
+               // Highlight button
+               this.highlightButton = new OO.ui.ToggleButtonWidget( {
+                       icon: 'highlight',
+                       label: mw.message( 'rcfilters-highlightbutton-title' ).text(),
+                       classes: [ 'mw-rcfilters-ui-filterMenuHeaderWidget-hightlightButton' ]
+               } );
+
+               // Events
+               this.highlightButton
+                       .connect( this, { click: 'onHighlightButtonClick' } );
+               this.model.connect( this, { highlightChange: 'onModelHighlightChange' } );
+
+               // Initialize
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget' )
+                       .append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-table' )
+                                       .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget-header' )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-row' )
+                                                       .append(
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                                                       .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget-header-title' )
+                                                                       .append( this.$label ),
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                                                       .addClass( 'mw-rcfilters-ui-filterMenuHeaderWidget-header-highlight' )
+                                                                       .append( this.highlightButton.$element )
+                                                       )
+                                       )
+                       );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FilterMenuHeaderWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.FilterMenuHeaderWidget, OO.ui.mixin.LabelElement );
+
+       /* Methods */
+
+       /**
+        * Respond to model highlight change event
+        *
+        * @param {boolean} highlightEnabled Highlight is enabled
+        */
+       mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onModelHighlightChange = function ( highlightEnabled ) {
+               this.highlightButton.setActive( highlightEnabled );
+       };
+
+       /**
+        * Respond to highlight button click
+        */
+       mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onHighlightButtonClick = function () {
+               this.controller.toggleHighlight();
+       };
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js
new file mode 100644 (file)
index 0000000..d235c39
--- /dev/null
@@ -0,0 +1,73 @@
+( function ( mw ) {
+       /**
+        * A widget representing a single toggle filter
+        *
+        * @extends mw.rcfilters.ui.ItemMenuOptionWidget
+        *
+        * @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.FilterMenuOptionWidget = function MwRcfiltersUiFilterMenuOptionWidget( controller, model, config ) {
+               config = config || {};
+
+               this.controller = controller;
+               this.model = model;
+
+               // Parent
+               mw.rcfilters.ui.FilterMenuOptionWidget.parent.call( this, controller, model, config );
+
+               // Event
+               this.model.getGroupModel().connect( this, { update: 'onGroupModelUpdate' } );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterMenuOptionWidget' );
+       };
+
+       /* Initialization */
+       OO.inheritClass( mw.rcfilters.ui.FilterMenuOptionWidget, mw.rcfilters.ui.ItemMenuOptionWidget );
+
+       /* Static properties */
+
+       // We do our own scrolling to top
+       mw.rcfilters.ui.FilterMenuOptionWidget.static.scrollIntoViewOnSelect = false;
+
+       /* Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterMenuOptionWidget.prototype.onModelUpdate = function () {
+               // Parent
+               mw.rcfilters.ui.FilterMenuOptionWidget.parent.prototype.onModelUpdate.call( this );
+
+               this.setCurrentMuteState();
+       };
+
+       /**
+        * Respond to item group model update event
+        */
+       mw.rcfilters.ui.FilterMenuOptionWidget.prototype.onGroupModelUpdate = function () {
+               this.setCurrentMuteState();
+       };
+
+       /**
+        * Set the current muted view of the widget based on its state
+        */
+       mw.rcfilters.ui.FilterMenuOptionWidget.prototype.setCurrentMuteState = function () {
+               this.setFlags( {
+                       muted: (
+                               this.model.isConflicted() ||
+                               (
+                                       // Item is also muted when any of the items in its group is active
+                                       this.model.getGroupModel().isActive() &&
+                                       // But it isn't selected
+                                       !this.model.isSelected() &&
+                                       // And also not included
+                                       !this.model.isIncluded()
+                               )
+                       )
+               } );
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js
new file mode 100644 (file)
index 0000000..9f41712
--- /dev/null
@@ -0,0 +1,123 @@
+( function ( mw ) {
+       /**
+        * A widget representing a menu section for filter groups
+        *
+        * @extends OO.ui.MenuSectionOptionWidget
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller RCFilters controller
+        * @param {mw.rcfilters.dm.FilterGroup} model Filter group model
+        * @param {Object} config Configuration object
+        * @cfg {jQuery} [$overlay] Overlay
+        */
+       mw.rcfilters.ui.FilterMenuSectionOptionWidget = function MwRcfiltersUiFilterMenuSectionOptionWidget( controller, model, config ) {
+               var whatsThisMessages,
+                       $header = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget-header' ),
+                       $popupContent = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget-whatsThisButton-popup-content' );
+
+               config = config || {};
+
+               this.controller = controller;
+               this.model = model;
+               this.$overlay = config.$overlay || this.$element;
+
+               // Parent
+               mw.rcfilters.ui.FilterMenuSectionOptionWidget.parent.call( this, $.extend( {
+                       label: this.model.getTitle(),
+                       $label: $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget-header-title' )
+               }, config ) );
+
+               $header.append( this.$label );
+
+               if ( this.model.hasWhatsThis() ) {
+                       whatsThisMessages = this.model.getWhatsThis();
+
+                       // Create popup
+                       if ( whatsThisMessages.header ) {
+                               $popupContent.append(
+                                       ( new OO.ui.LabelWidget( {
+                                               label: mw.msg( whatsThisMessages.header ),
+                                               classes: [ 'mw-rcfilters-ui-filterMenuSectionOptionWidget-whatsThisButton-popup-content-header' ]
+                                       } ) ).$element
+                               );
+                       }
+                       if ( whatsThisMessages.body ) {
+                               $popupContent.append(
+                                       ( new OO.ui.LabelWidget( {
+                                               label: mw.msg( whatsThisMessages.body ),
+                                               classes: [ 'mw-rcfilters-ui-filterMenuSectionOptionWidget-whatsThisButton-popup-content-body' ]
+                                       } ) ).$element
+                               );
+                       }
+                       if ( whatsThisMessages.linkText && whatsThisMessages.url ) {
+                               $popupContent.append(
+                                       ( new OO.ui.ButtonWidget( {
+                                               framed: false,
+                                               flags: [ 'progressive' ],
+                                               href: whatsThisMessages.url,
+                                               label: mw.msg( whatsThisMessages.linkText ),
+                                               classes: [ 'mw-rcfilters-ui-filterMenuSectionOptionWidget-whatsThisButton-popup-content-link' ]
+                                       } ) ).$element
+                               );
+                       }
+
+                       // Add button
+                       this.whatsThisButton = new OO.ui.PopupButtonWidget( {
+                               framed: false,
+                               label: mw.msg( 'rcfilters-filterlist-whatsthis' ),
+                               $overlay: this.$overlay,
+                               classes: [ 'mw-rcfilters-ui-filterMenuSectionOptionWidget-whatsThisButton' ],
+                               flags: [ 'progressive' ],
+                               popup: {
+                                       $autoCloseIgnore: this.$element.add( this.$overlay ),
+                                       padded: false,
+                                       align: 'center',
+                                       position: 'above',
+                                       $content: $popupContent,
+                                       classes: [ 'mw-rcfilters-ui-filterMenuSectionOptionWidget-whatsThisButton-popup' ]
+                               }
+                       } );
+
+                       $header
+                               .append( this.whatsThisButton.$element );
+               }
+
+               // Events
+               this.model.connect( this, { update: 'onModelUpdate' } );
+
+               // Initialize
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget' )
+                       .addClass( 'mw-rcfilters-ui-filterMenuSectionOptionWidget-name-' + this.model.getName() )
+                       .append( $header );
+       };
+
+       /* Initialize */
+
+       OO.inheritClass( mw.rcfilters.ui.FilterMenuSectionOptionWidget, OO.ui.MenuSectionOptionWidget );
+
+       /* Methods */
+
+       /**
+        * Respond to model update event
+        */
+       mw.rcfilters.ui.FilterMenuSectionOptionWidget.prototype.onModelUpdate = function () {
+               this.$element.toggleClass(
+                       'mw-rcfilters-ui-filterMenuSectionOptionWidget-active',
+                       this.model.isActive()
+               );
+       };
+
+       /**
+        * Get the group name
+        *
+        * @return {string} Group name
+        */
+       mw.rcfilters.ui.FilterMenuSectionOptionWidget.prototype.getName = function () {
+               return this.model.getName();
+       };
+
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagItemWidget.js
new file mode 100644 (file)
index 0000000..8a36eb4
--- /dev/null
@@ -0,0 +1,41 @@
+( function ( mw ) {
+       /**
+        * Extend OOUI's FilterTagItemWidget to also display a popup on hover.
+        *
+        * @class
+        * @extends mw.rcfilters.ui.TagItemWidget
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller
+        * @param {mw.rcfilters.dm.FilterItem} model Item model
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.FilterTagItemWidget = function MwRcfiltersUiFilterTagItemWidget( controller, model, config ) {
+               config = config || {};
+
+               mw.rcfilters.ui.FilterTagItemWidget.parent.call( this, controller, model, config );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterTagItemWidget' );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FilterTagItemWidget, mw.rcfilters.ui.TagItemWidget );
+
+       /* Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterTagItemWidget.prototype.setCurrentMuteState = function () {
+               this.setFlags( {
+                       muted: (
+                               !this.model.isSelected() ||
+                               this.model.isIncluded() ||
+                               this.model.isFullyCovered()
+                       ),
+                       invalid: this.model.isSelected() && this.model.isConflicted()
+               } );
+       };
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js
new file mode 100644 (file)
index 0000000..78f3a08
--- /dev/null
@@ -0,0 +1,509 @@
+( function ( mw ) {
+       /**
+        * List displaying all filter groups
+        *
+        * @extends OO.ui.MenuTagMultiselectWidget
+        * @mixins OO.ui.mixin.PendingElement
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller Controller
+        * @param {mw.rcfilters.dm.FiltersViewModel} model View model
+        * @param {mw.rcfilters.dm.SavedQueriesModel} savedQueriesModel Saved queries model
+        * @param {Object} config Configuration object
+        * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget = function MwRcfiltersUiFilterTagMultiselectWidget( controller, model, savedQueriesModel, config ) {
+               var rcFiltersRow,
+                       areSavedQueriesEnabled = mw.config.get( 'wgStructuredChangeFiltersEnableSaving' ),
+                       title = new OO.ui.LabelWidget( {
+                               label: mw.msg( 'rcfilters-activefilters' ),
+                               classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-content-title' ]
+                       } ),
+                       $contentWrapper = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper' );
+
+               config = config || {};
+
+               this.controller = controller;
+               this.model = model;
+               this.queriesModel = savedQueriesModel;
+               this.$overlay = config.$overlay || this.$element;
+               this.matchingQuery = null;
+               this.areSavedQueriesEnabled = areSavedQueriesEnabled;
+
+               // Parent
+               mw.rcfilters.ui.FilterTagMultiselectWidget.parent.call( this, $.extend( true, {
+                       label: mw.msg( 'rcfilters-filterlist-title' ),
+                       placeholder: mw.msg( 'rcfilters-empty-filter' ),
+                       inputPosition: 'outline',
+                       allowArbitrary: false,
+                       allowDisplayInvalidTags: false,
+                       allowReordering: false,
+                       $overlay: this.$overlay,
+                       menu: {
+                               hideWhenOutOfView: false,
+                               hideOnChoose: false,
+                               width: 650,
+                               $footer: $( '<div>' )
+                                       .append(
+                                               new OO.ui.ButtonWidget( {
+                                                       framed: false,
+                                                       icon: 'feedback',
+                                                       flags: [ 'progressive' ],
+                                                       label: mw.msg( 'rcfilters-filterlist-feedbacklink' ),
+                                                       href: 'https://www.mediawiki.org/wiki/Help_talk:New_filters_for_edit_review'
+                                               } ).$element
+                                       )
+                       },
+                       input: {
+                               icon: 'search',
+                               placeholder: mw.msg( 'rcfilters-search-placeholder' )
+                       }
+               }, config ) );
+
+               this.savedQueryTitle = new OO.ui.LabelWidget( {
+                       label: '',
+                       classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-content-savedQueryTitle' ]
+               } );
+
+               this.resetButton = new OO.ui.ButtonWidget( {
+                       framed: false,
+                       classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-resetButton' ]
+               } );
+
+               if ( areSavedQueriesEnabled ) {
+                       this.saveQueryButton = new mw.rcfilters.ui.SaveFiltersPopupButtonWidget(
+                               this.controller,
+                               this.queriesModel
+                       );
+
+                       this.saveQueryButton.$element.on( 'mousedown', function ( e ) { e.stopPropagation(); } );
+
+                       this.saveQueryButton.connect( this, {
+                               click: 'onSaveQueryButtonClick',
+                               saveCurrent: 'setSavedQueryVisibility'
+                       } );
+               }
+
+               this.emptyFilterMessage = new OO.ui.LabelWidget( {
+                       label: mw.msg( 'rcfilters-empty-filter' ),
+                       classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-emptyFilters' ]
+               } );
+               this.$content.append( this.emptyFilterMessage.$element );
+
+               // Events
+               this.resetButton.connect( this, { click: 'onResetButtonClick' } );
+               // Stop propagation for mousedown, so that the widget doesn't
+               // trigger the focus on the input and scrolls up when we click the reset button
+               this.resetButton.$element.on( 'mousedown', function ( e ) { e.stopPropagation(); } );
+               this.model.connect( this, {
+                       initialize: 'onModelInitialize',
+                       itemUpdate: 'onModelItemUpdate',
+                       highlightChange: 'onModelHighlightChange'
+               } );
+               this.queriesModel.connect( this, { itemUpdate: 'onSavedQueriesItemUpdate' } );
+
+               // The filter list 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
+               rcFiltersRow = $( '<div>' )
+                       .addClass( 'mw-rcfilters-ui-row' )
+                       .append(
+                               this.$content
+                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                       .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-cell-filters' )
+                       );
+
+               if ( areSavedQueriesEnabled ) {
+                       rcFiltersRow.append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                       .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-cell-save' )
+                                       .append( this.saveQueryButton.$element )
+                       );
+               }
+
+               rcFiltersRow.append(
+                       $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-cell' )
+                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-cell-reset' )
+                               .append( this.resetButton.$element )
+               );
+
+               // Build the content
+               $contentWrapper.append(
+                       title.$element,
+                       this.savedQueryTitle.$element,
+                       $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-table' )
+                               .append(
+                                       rcFiltersRow
+                               )
+               );
+
+               // Initialize
+               this.$handle.append( $contentWrapper );
+               this.emptyFilterMessage.toggle( this.isEmpty() );
+               this.savedQueryTitle.toggle( false );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget' );
+
+               this.populateFromModel();
+               this.reevaluateResetRestoreState();
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.FilterTagMultiselectWidget, OO.ui.MenuTagMultiselectWidget );
+
+       /* Methods */
+
+       /**
+        * Respond to query button click
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onSaveQueryButtonClick = function () {
+               this.getMenu().toggle( false );
+       };
+
+       /**
+        * Respond to save query item change. Mainly this is done to update the label in case
+        * a query item has been edited
+        *
+        * @param {mw.rcfilters.dm.SavedQueryItemModel} item Saved query item
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onSavedQueriesItemUpdate = function ( item ) {
+               if ( this.matchingQuery === item ) {
+                       // This means we just edited the item that is currently matched
+                       this.savedQueryTitle.setLabel( item.getLabel() );
+               }
+       };
+
+       /**
+        * Respond to menu toggle
+        *
+        * @param {boolean} isVisible Menu is visible
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onMenuToggle = function ( isVisible ) {
+               // Parent
+               mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onMenuToggle.call( this );
+
+               if ( isVisible ) {
+                       mw.hook( 'RcFilters.popup.open' ).fire();
+
+                       if ( !this.getMenu().getSelectedItem() ) {
+                               // If there are no selected items, scroll menu to top
+                               // This has to be in a setTimeout so the menu has time
+                               // to be positioned and fixed
+                               setTimeout( function () { this.getMenu().scrollToTop(); }.bind( this ), 0 );
+                       }
+               } else {
+                       // Clear selection
+                       this.selectTag( null );
+               }
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onInputFocus = function () {
+               // Parent
+               mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onInputFocus.call( this );
+
+               // Scroll to top
+               this.scrollToTop( this.$element );
+       };
+
+       /**
+        * @inheridoc
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onChangeTags = function () {
+               // Parent method
+               mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onChangeTags.call( this );
+
+               this.emptyFilterMessage.toggle( this.isEmpty() );
+       };
+
+       /**
+        * Respond to model initialize event
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onModelInitialize = function () {
+               this.populateFromModel();
+
+               this.setSavedQueryVisibility();
+       };
+
+       /**
+        * Set the visibility of the saved query button
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.setSavedQueryVisibility = function () {
+               if ( this.areSavedQueriesEnabled ) {
+                       this.matchingQuery = this.controller.findQueryMatchingCurrentState();
+
+                       this.savedQueryTitle.setLabel(
+                               this.matchingQuery ? this.matchingQuery.getLabel() : ''
+                       );
+                       this.savedQueryTitle.toggle( !!this.matchingQuery );
+                       this.saveQueryButton.toggle(
+                               !this.isEmpty() &&
+                               !this.matchingQuery
+                       );
+               }
+       };
+       /**
+        * Respond to model itemUpdate event
+        *
+        * @param {mw.rcfilters.dm.FilterItem} item Filter item model
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onModelItemUpdate = function ( item ) {
+               if (
+                       item.isSelected() ||
+                       (
+                               this.model.isHighlightEnabled() &&
+                               item.isHighlightSupported() &&
+                               item.getHighlightColor()
+                       )
+               ) {
+                       this.addTag( item.getName(), item.getLabel() );
+               } else {
+                       this.removeTagByData( item.getName() );
+               }
+
+               this.setSavedQueryVisibility();
+
+               // Re-evaluate reset state
+               this.reevaluateResetRestoreState();
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.isAllowedData = function ( data ) {
+               return (
+                       this.menu.getItemFromData( data ) &&
+                       !this.isDuplicateData( data )
+               );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onMenuChoose = function ( item ) {
+               this.controller.toggleFilterSelect( item.model.getName() );
+
+               // Select the tag if it exists, or reset selection otherwise
+               this.selectTag( this.getItemFromData( item.model.getName() ) );
+
+               this.focus();
+       };
+
+       /**
+        * Respond to highlightChange event
+        *
+        * @param {boolean} isHighlightEnabled Highlight is enabled
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onModelHighlightChange = function ( isHighlightEnabled ) {
+               var highlightedItems = this.model.getHighlightedItems();
+
+               if ( isHighlightEnabled ) {
+                       // Add capsule widgets
+                       highlightedItems.forEach( function ( filterItem ) {
+                               this.addTag( filterItem.getName(), filterItem.getLabel() );
+                       }.bind( this ) );
+               } else {
+                       // Remove capsule widgets if they're not selected
+                       highlightedItems.forEach( function ( filterItem ) {
+                               if ( !filterItem.isSelected() ) {
+                                       this.removeTagByData( filterItem.getName() );
+                               }
+                       }.bind( this ) );
+               }
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onTagSelect = function ( tagItem ) {
+               var widget = this,
+                       menuOption = this.menu.getItemFromData( tagItem.getData() ),
+                       oldInputValue = this.input.getValue();
+
+               // Reset input
+               this.input.setValue( '' );
+
+               // Parent method
+               mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onTagSelect.call( this, tagItem );
+
+               this.menu.selectItem( menuOption );
+               this.selectTag( tagItem );
+
+               // Scroll to the item
+               if ( oldInputValue ) {
+                       // We're binding a 'once' to the itemVisibilityChange event
+                       // so this happens when the menu is ready after the items
+                       // are visible again, in case this is done right after the
+                       // user filtered the results
+                       this.getMenu().once(
+                               'itemVisibilityChange',
+                               function () { widget.scrollToTop( menuOption.$element ); }
+                       );
+               } else {
+                       this.scrollToTop( menuOption.$element );
+               }
+       };
+
+       /**
+        * Select a tag by reference. This is what OO.ui.SelectWidget is doing.
+        * If no items are given, reset selection from all.
+        *
+        * @param {mw.rcfilters.ui.FilterTagItemWidget} [item] Tag to select,
+        *  omit to deselect all
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.selectTag = function ( item ) {
+               var i, len, selected;
+
+               for ( i = 0, len = this.items.length; i < len; i++ ) {
+                       selected = this.items[ i ] === item;
+                       if ( this.items[ i ].isSelected() !== selected ) {
+                               this.items[ i ].toggleSelected( selected );
+                       }
+               }
+       };
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onTagRemove = function ( tagItem ) {
+               // Parent method
+               mw.rcfilters.ui.FilterTagMultiselectWidget.parent.prototype.onTagRemove.call( this, tagItem );
+
+               this.controller.clearFilter( tagItem.getName() );
+
+               tagItem.destroy();
+       };
+
+       /**
+        * Respond to click event on the reset button
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.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.FilterTagMultiselectWidget.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.setTitle(
+                       currFiltersAreEmpty ? null : mw.msg( 'rcfilters-clear-all-filters' )
+               );
+
+               this.resetButton.toggle( !hideResetButton );
+               this.emptyFilterMessage.toggle( currFiltersAreEmpty );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.createMenuWidget = function ( menuConfig ) {
+               return new mw.rcfilters.ui.FloatingMenuSelectWidget(
+                       this.controller,
+                       this.model,
+                       $.extend( {
+                               filterFromInput: true
+                       }, menuConfig )
+               );
+       };
+
+       /**
+        * Populate the menu from the model
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.populateFromModel = function () {
+               var widget = this,
+                       items = [];
+
+               // Reset
+               this.getMenu().clearItems();
+
+               $.each( this.model.getFilterGroups(), function ( groupName, groupModel ) {
+                       items.push(
+                               // Group section
+                               new mw.rcfilters.ui.FilterMenuSectionOptionWidget(
+                                       widget.controller,
+                                       groupModel,
+                                       {
+                                               $overlay: widget.$overlay
+                                       }
+                               )
+                       );
+
+                       // Add items
+                       widget.model.getGroupFilters( groupName ).forEach( function ( filterItem ) {
+                               items.push(
+                                       new mw.rcfilters.ui.FilterMenuOptionWidget(
+                                               widget.controller,
+                                               filterItem,
+                                               {
+                                                       $overlay: widget.$overlay
+                                               }
+                                       )
+                               );
+                       } );
+               } );
+
+               // Add all items to the menu
+               this.getMenu().addItems( items );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.createTagItemWidget = function ( data ) {
+               var filterItem = this.model.getItemByName( data );
+
+               if ( filterItem ) {
+                       return new mw.rcfilters.ui.FilterTagItemWidget(
+                               this.controller,
+                               filterItem,
+                               {
+                                       $overlay: this.$overlay
+                               }
+                       );
+               }
+       };
+
+       /**
+        * Scroll the element to top within its container
+        *
+        * @private
+        * @param {jQuery} $element Element to position
+        * @param {number} [marginFromTop] When scrolling the entire widget to the top, leave this
+        *  much space (in pixels) above the widget.
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.scrollToTop = function ( $element, marginFromTop ) {
+               var container = OO.ui.Element.static.getClosestScrollableContainer( $element[ 0 ], 'y' ),
+                       pos = OO.ui.Element.static.getRelativePosition( $element, $( container ) ),
+                       containerScrollTop = $( container ).is( 'body, html' ) ? 0 : $( container ).scrollTop();
+
+               // Scroll to item
+               $( container ).animate( {
+                       scrollTop: containerScrollTop + pos.top - ( marginFromTop || 0 )
+               } );
+       };
+}( mediaWiki ) );
index d46bd4b..ebef62f 100644 (file)
@@ -8,11 +8,12 @@
         * @constructor
         * @param {mw.rcfilters.Controller} controller Controller
         * @param {mw.rcfilters.dm.FiltersViewModel} model View model
+        * @param {mw.rcfilters.dm.SavedQueriesModel} savedQueriesModel Saved queries model
         * @param {Object} [config] Configuration object
         * @cfg {Object} [filters] A definition of the filter groups in this list
         * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
         */
-       mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, config ) {
+       mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, savedQueriesModel, config ) {
                config = config || {};
 
                // Parent
 
                this.controller = controller;
                this.model = model;
+               this.queriesModel = savedQueriesModel;
                this.$overlay = config.$overlay || this.$element;
 
-               this.filterPopup = new mw.rcfilters.ui.FiltersListWidget(
+               this.filterTagWidget = new mw.rcfilters.ui.FilterTagMultiselectWidget(
                        this.controller,
                        this.model,
-                       {
-                               label: mw.msg( 'rcfilters-filterlist-title' ),
-                               $overlay: this.$overlay
-                       }
+                       this.queriesModel,
+                       { $overlay: this.$overlay }
                );
 
-               this.textInput = new OO.ui.TextInputWidget( {
-                       classes: [ 'mw-rcfilters-ui-filterWrapperWidget-search' ],
-                       icon: 'search',
-                       placeholder: mw.msg( 'rcfilters-search-placeholder' )
-               } );
+               // Initialize
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterWrapperWidget' );
 
-               this.capsule = new mw.rcfilters.ui.FilterCapsuleMultiselectWidget( controller, this.model, this.textInput, {
-                       $overlay: this.$overlay,
-                       popup: {
-                               $content: this.filterPopup.$element,
-                               classes: [ 'mw-rcfilters-ui-filterWrapperWidget-popup' ],
-                               width: 650
-                       }
-               } );
+               if ( mw.config.get( 'wgStructuredChangeFiltersEnableSaving' ) ) {
+                       this.savedLinksListWidget = new mw.rcfilters.ui.SavedLinksListWidget(
+                               this.controller,
+                               this.queriesModel,
+                               { $overlay: this.$overlay }
+                       );
 
-               // Events
-               this.model.connect( this, {
-                       initialize: 'onModelInitialize'
-               } );
-               this.textInput.connect( this, {
-                       change: 'onTextInputChange'
-               } );
-               this.$element
-                       .addClass( 'mw-rcfilters-ui-filterWrapperWidget' )
-                       .append( this.capsule.$element, this.textInput.$element );
+                       this.$element.append(
+                               this.savedLinksListWidget.$element
+                       );
+
+               }
+
+               this.$element.append(
+                       this.filterTagWidget.$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 model update event and set up the available filters to choose
-        * from.
-        */
-       mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelInitialize = function () {
-               var wrapper = this;
-
-               // 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
-               this.model.getItems().forEach( function ( filterItem ) {
-                       if ( filterItem.isSelected() ) {
-                               wrapper.capsule.addItemByName( filterItem.getName() );
-                       }
-               } );
-       };
 }( 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
deleted file mode 100644 (file)
index ae9ee71..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-( 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.$overlay = config.$overlay || this.$element;
-
-               this.highlightButton = new OO.ui.ButtonWidget( {
-                       label: mw.message( 'rcfilters-highlightbutton-title' ).text(),
-                       classes: [ 'mw-rcfilters-ui-filtersListWidget-hightlightButton' ]
-               } );
-
-               this.$label.append( this.highlightButton.$element );
-
-               this.noResultsLabel = new OO.ui.LabelWidget( {
-                       label: mw.msg( 'rcfilters-filterlist-noresults' ),
-                       classes: [ 'mw-rcfilters-ui-filtersListWidget-noresults' ]
-               } );
-
-               // Events
-               this.highlightButton.connect( this, { click: 'onHighlightButtonClick' } );
-               this.model.connect( this, {
-                       initialize: 'onModelInitialize',
-                       highlightChange: 'onHighlightChange'
-               } );
-
-               // 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 widget = this;
-
-               // Reset
-               this.clearItems();
-
-               this.addItems(
-                       Object.keys( this.model.getFilterGroups() ).map( function ( groupName ) {
-                               return new mw.rcfilters.ui.FilterGroupWidget(
-                                       widget.controller,
-                                       widget.model.getGroup( groupName ),
-                                       {
-                                               $overlay: widget.$overlay
-                                       }
-                               );
-                       } )
-               );
-       };
-
-       mw.rcfilters.ui.FiltersListWidget.prototype.onHighlightChange = function ( highlightEnabled ) {
-               this.highlightButton.setActive( highlightEnabled );
-       };
-
-       /**
-        * Respond to highlight button click
-        */
-       mw.rcfilters.ui.FiltersListWidget.prototype.onHighlightButtonClick = function () {
-               this.controller.toggleHighlight();
-       };
-
-       /**
-        * 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 ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FloatingMenuSelectWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FloatingMenuSelectWidget.js
new file mode 100644 (file)
index 0000000..d98ef2d
--- /dev/null
@@ -0,0 +1,143 @@
+( function ( mw ) {
+       /**
+        * A floating menu widget for the filter list
+        *
+        * @extends OO.ui.FloatingMenuSelectWidget
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller Controller
+        * @param {mw.rcfilters.dm.FiltersViewModel} model View model
+        * @param {Object} [config] Configuration object
+        * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
+        * @cfg {jQuery} [$footer] An optional footer for the menu
+        */
+       mw.rcfilters.ui.FloatingMenuSelectWidget = function MwRcfiltersUiFloatingMenuSelectWidget( controller, model, config ) {
+               var header;
+
+               config = config || {};
+
+               this.controller = controller;
+               this.model = model;
+
+               this.inputValue = '';
+               this.$overlay = config.$overlay || this.$element;
+               this.$footer = config.$footer;
+               this.$body = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-floatingMenuSelectWidget-body' );
+
+               // Parent
+               mw.rcfilters.ui.FloatingMenuSelectWidget.parent.call( this, $.extend( {
+                       $autoCloseIgnore: this.$overlay,
+                       width: 650
+               }, config ) );
+               this.setGroupElement(
+                       $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-floatingMenuSelectWidget-group' )
+               );
+               this.setClippableElement( this.$body );
+               this.setClippableContainer( this.$element );
+
+               header = new mw.rcfilters.ui.FilterMenuHeaderWidget(
+                       this.controller,
+                       this.model,
+                       {
+                               $overlay: this.$overlay
+                       }
+               );
+
+               this.noResults = new OO.ui.LabelWidget( {
+                       label: mw.msg( 'rcfilters-filterlist-noresults' ),
+                       classes: [ 'mw-rcfilters-ui-floatingMenuSelectWidget-noresults' ]
+               } );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-floatingMenuSelectWidget' )
+                       .append( header.$element )
+                       .append(
+                               this.$body
+                                       .append( this.$group, this.noResults.$element )
+                       );
+
+               if ( this.$footer ) {
+                       this.$element.append(
+                               this.$footer
+                                       .addClass( 'mw-rcfilters-ui-floatingMenuSelectWidget-footer' )
+                       );
+               }
+       };
+
+       /* Initialize */
+
+       OO.inheritClass( mw.rcfilters.ui.FloatingMenuSelectWidget, OO.ui.FloatingMenuSelectWidget );
+
+       /* Events */
+
+       /**
+        * @event itemVisibilityChange
+        *
+        * Item visibility has changed
+        */
+
+       /* Methods */
+
+       /**
+        * @fires itemVisibilityChange
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FloatingMenuSelectWidget.prototype.updateItemVisibility = function () {
+               var i,
+                       itemWasHighlighted = false,
+                       inputVal = this.$input.val(),
+                       items = this.getItems();
+
+               // Since the method hides/shows items, we don't want to
+               // call it unless the input actually changed
+               if ( this.inputValue !== inputVal ) {
+                       // Parent method
+                       mw.rcfilters.ui.FloatingMenuSelectWidget.parent.prototype.updateItemVisibility.call( this );
+
+                       if ( inputVal !== '' ) {
+                               // Highlight the first item in the list
+                               for ( i = 0; i < items.length; i++ ) {
+                                       if (
+                                               !( items[ i ] instanceof OO.ui.MenuSectionOptionWidget ) &&
+                                               items[ i ].isVisible()
+                                       ) {
+                                               itemWasHighlighted = true;
+                                               this.highlightItem( items[ i ] );
+                                               break;
+                                       }
+                               }
+                       }
+
+                       if ( !itemWasHighlighted ) {
+                               this.highlightItem( null );
+                       }
+
+                       // Cache value
+                       this.inputValue = inputVal;
+
+                       this.emit( 'itemVisibilityChange' );
+               }
+       };
+
+       /**
+        * Override the item matcher to use the model's match process
+        *
+        * @inheritdoc
+        */
+       mw.rcfilters.ui.FloatingMenuSelectWidget.prototype.getItemMatcher = function ( s ) {
+               var results = this.model.findMatches( s, true );
+
+               return function ( item ) {
+                       return results.indexOf( item.getModel() ) > -1;
+               };
+       };
+
+       /**
+        * Scroll to the top of the menu
+        */
+       mw.rcfilters.ui.FloatingMenuSelectWidget.prototype.scrollToTop = function () {
+               this.$body.scrollTop( 0 );
+       };
+}( mediaWiki ) );
index 2513b07..d17ffff 100644 (file)
 ( function ( mw ) {
        /**
         * Wrapper for the RC form with hide/show links
+        * Must be constructed after the model is initialized.
         *
         * @extends OO.ui.Widget
         *
         * @constructor
-        * @param {mw.rcfilters.dm.ChangesListViewModel} model Changes list view model
+        * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Changes list view model
+        * @param {mw.rcfilters.dm.ChangesListViewModel} changeListModel Changes list view model
+        * @param {mw.rcfilters.Controller} controller RCfilters controller
         * @param {jQuery} $formRoot Root element of the form to attach to
         * @param {Object} config Configuration object
         */
-       mw.rcfilters.ui.FormWrapperWidget = function MwRcfiltersUiFormWrapperWidget( model, $formRoot, config ) {
+       mw.rcfilters.ui.FormWrapperWidget = function MwRcfiltersUiFormWrapperWidget( filtersModel, changeListModel, controller, $formRoot, config ) {
                config = config || {};
 
                // Parent
                mw.rcfilters.ui.FormWrapperWidget.parent.call( this, $.extend( {}, config, {
                        $element: $formRoot
                } ) );
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, config );
 
-               this.model = model;
-               this.$submitButton = this.$element.find( 'input[type=submit]' );
+               this.changeListModel = changeListModel;
+               this.filtersModel = filtersModel;
+               this.controller = controller;
+               this.$submitButton = this.$element.find( 'form input[type=submit]' );
+
+               this.$element
+                       .on( 'click', 'a[data-params]', this.onLinkClick.bind( this ) );
+
+               this.$element
+                       .on( 'submit', 'form', this.onFormSubmit.bind( this ) );
 
                // Events
-               this.model.connect( this, {
-                       invalidate: 'onModelInvalidate',
-                       update: 'onModelUpdate'
+               this.changeListModel.connect( this, {
+                       invalidate: 'onChangesModelInvalidate',
+                       update: 'onChangesModelUpdate'
                } );
+
+               // Initialize
+               this.cleanUpFieldset();
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-FormWrapperWidget' );
        };
 
        /* Initialization */
 
        OO.inheritClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.mixin.PendingElement );
+
+       /**
+        * Respond to link click
+        *
+        * @param {jQuery.Event} e Event
+        * @return {boolean} false
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onLinkClick = function ( e ) {
+               this.controller.updateChangesList( $( e.target ).data( 'params' ) );
+               return false;
+       };
+
+       /**
+        * Respond to form submit event
+        *
+        * @param {jQuery.Event} e Event
+        * @return {boolean} false
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onFormSubmit = function ( e ) {
+               var data = {};
+
+               // Collect all data from form
+               $( e.target ).find( 'input:not([type="hidden"],[type="submit"]), select' ).each( function () {
+                       if ( !$( this ).is( ':checkbox' ) || $( this ).is( ':checked' ) ) {
+                               data[ $( this ).prop( 'name' ) ] = $( this ).val();
+                       }
+               } );
+
+               this.controller.updateChangesList( data );
+               return false;
+       };
 
        /**
         * Respond to model invalidate
         */
-       mw.rcfilters.ui.FormWrapperWidget.prototype.onModelInvalidate = function () {
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onChangesModelInvalidate = function () {
+               this.pushPending();
                this.$submitButton.prop( 'disabled', true );
        };
 
        /**
-        * Respond to model update
+        * Respond to model update, replace the show/hide links with the ones from the
+        * server so they feature the correct state.
+        *
+        * @param {jQuery|string} $changesList Updated changes list
+        * @param {jQuery} $fieldset Updated fieldset
         */
-       mw.rcfilters.ui.FormWrapperWidget.prototype.onModelUpdate = function () {
+       mw.rcfilters.ui.FormWrapperWidget.prototype.onChangesModelUpdate = function ( $changesList, $fieldset ) {
                this.$submitButton.prop( 'disabled', false );
+
+               // Replace the entire fieldset
+               this.$element.empty().append( $fieldset.contents() );
+               // Make sure enhanced RC re-initializes correctly
+               mw.hook( 'wikipage.content' ).fire( this.$element );
+
+               this.cleanUpFieldset();
+
+               this.popPending();
+       };
+
+       /**
+        * Clean up the old-style show/hide that we have implemented in the filter list
+        */
+       mw.rcfilters.ui.FormWrapperWidget.prototype.cleanUpFieldset = function () {
+               var $namespaceSelect = this.$element.find( '#namespace' ),
+                       $namespaceCheckboxes = this.$element.find( '#nsassociated, #nsinvert' ),
+                       collapseCookieName = 'changeslist-state';
+
+               this.$element.find( '.rcshowhideoption[data-feature-in-structured-ui=1]' ).each( function () {
+                       // 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 );
+               } );
+
+               // Bind namespace select to change event
+               // see resources/src/mediawiki.special/mediawiki.special.recentchanges.js
+               $namespaceCheckboxes.prop( 'disabled', $namespaceSelect.val() === '' );
+               $namespaceSelect.on( 'change', function () {
+                       $namespaceCheckboxes.prop( 'disabled', $( this ).val() === '' );
+               } );
+
+               // Collapse legend
+               // see resources/src/mediawiki.special/mediawiki.special.changelist.legend.js
+               this.$element.find( '.mw-changeslist-legend' )
+                       .makeCollapsible( {
+                               collapsed: mw.cookie.get( collapseCookieName ) === 'collapsed'
+                       } )
+                       .on( 'beforeExpand.mw-collapsible', function () {
+                               mw.cookie.set( collapseCookieName, 'expanded' );
+                       } )
+                       .on( 'beforeCollapse.mw-collapsible', function () {
+                               mw.cookie.set( collapseCookieName, 'collapsed' );
+                       } );
+
        };
 }( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ItemMenuOptionWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ItemMenuOptionWidget.js
new file mode 100644 (file)
index 0000000..a88d119
--- /dev/null
@@ -0,0 +1,125 @@
+( function ( mw ) {
+       /**
+        * A widget representing a base toggle item
+        *
+        * @extends OO.ui.MenuOptionWidget
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller RCFilters controller
+        * @param {mw.rcfilters.dm.ItemModel} model Item model
+        * @param {Object} config Configuration object
+        */
+       mw.rcfilters.ui.ItemMenuOptionWidget = function MwRcfiltersUiItemMenuOptionWidget( controller, model, config ) {
+               var layout,
+                       $label = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-itemMenuOptionWidget-label' );
+
+               config = config || {};
+
+               this.controller = controller;
+               this.model = model;
+
+               // Parent
+               mw.rcfilters.ui.ItemMenuOptionWidget.parent.call( this, $.extend( {
+                       // Override the 'check' icon that OOUI defines
+                       icon: '',
+                       data: this.model.getName(),
+                       label: this.model.getLabel()
+               }, config ) );
+
+               this.checkboxWidget = new mw.rcfilters.ui.CheckboxInputWidget( {
+                       value: this.model.getName(),
+                       selected: this.model.isSelected()
+               } );
+
+               $label.append(
+                       $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-itemMenuOptionWidget-label-title' )
+                               .append( this.$label )
+               );
+               if ( this.model.getDescription() ) {
+                       $label.append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-itemMenuOptionWidget-label-desc' )
+                                       .text( this.model.getDescription() )
+                       );
+               }
+
+               this.highlightButton = new mw.rcfilters.ui.FilterItemHighlightButton(
+                       this.controller,
+                       this.model,
+                       {
+                               $overlay: config.$overlay || this.$element,
+                               title: mw.msg( 'rcfilters-highlightmenu-help' )
+                       }
+               );
+               this.highlightButton.toggle( this.model.isHighlightEnabled() );
+
+               layout = new OO.ui.FieldLayout( this.checkboxWidget, {
+                       label: $label,
+                       align: 'inline'
+               } );
+
+               // Events
+               this.model.connect( this, { update: 'onModelUpdate' } );
+               // HACK: Prevent defaults on 'click' for the label so it
+               // doesn't steal the focus away from the input. This means
+               // we can continue arrow-movement after we click the label
+               // and is consistent with the checkbox *itself* also preventing
+               // defaults on 'click' as well.
+               layout.$label.on( 'click', false );
+
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-itemMenuOptionWidget' )
+                       .append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-table' )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-row' )
+                                                       .append(
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell mw-rcfilters-ui-itemMenuOptionWidget-itemCheckbox' )
+                                                                       .append( layout.$element ),
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell mw-rcfilters-ui-itemMenuOptionWidget-highlightButton' )
+                                                                       .append( this.highlightButton.$element )
+                                                       )
+                                       )
+                       );
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.ItemMenuOptionWidget, OO.ui.MenuOptionWidget );
+
+       /* Static properties */
+
+       // We do our own scrolling to top
+       mw.rcfilters.ui.ItemMenuOptionWidget.static.scrollIntoViewOnSelect = false;
+
+       /* Methods */
+
+       /**
+        * Respond to item model update event
+        */
+       mw.rcfilters.ui.ItemMenuOptionWidget.prototype.onModelUpdate = function () {
+               this.checkboxWidget.setSelected( this.model.isSelected() );
+
+               this.highlightButton.toggle( this.model.isHighlightEnabled() );
+       };
+
+       /**
+        * Get the name of this filter
+        *
+        * @return {string} Filter name
+        */
+       mw.rcfilters.ui.ItemMenuOptionWidget.prototype.getName = function () {
+               return this.model.getName();
+       };
+
+       mw.rcfilters.ui.ItemMenuOptionWidget.prototype.getModel = function () {
+               return this.model;
+       };
+
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js
new file mode 100644 (file)
index 0000000..3f920f0
--- /dev/null
@@ -0,0 +1,157 @@
+( function ( mw ) {
+       /**
+        * Save filters widget. This widget is displayed in the tag area
+        * and allows the user to save the current state of the system
+        * as a new saved filter query they can later load or set as
+        * default.
+        *
+        * @extends OO.ui.PopupButtonWidget
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller Controller
+        * @param {mw.rcfilters.dm.SavedQueriesModel} model View model
+        * @param {Object} [config] Configuration object
+        */
+       mw.rcfilters.ui.SaveFiltersPopupButtonWidget = function MwRcfiltersUiSaveFiltersPopupButtonWidget( controller, model, config ) {
+               var layout,
+                       $popupContent = $( '<div>' );
+
+               config = config || {};
+
+               this.controller = controller;
+               this.model = model;
+
+               // Parent
+               mw.rcfilters.ui.SaveFiltersPopupButtonWidget.parent.call( this, $.extend( {
+                       framed: false,
+                       icon: 'clip',
+                       $overlay: this.$overlay,
+                       title: mw.msg( 'rcfilters-savedqueries-add-new-title' ),
+                       popup: {
+                               classes: [ 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup' ],
+                               padded: true,
+                               head: true,
+                               label: mw.msg( 'rcfilters-savedqueries-add-new-title' ),
+                               $content: $popupContent
+                       }
+               }, config ) );
+               // // HACK: Add an icon to the popup head label
+               this.popup.$head.prepend( ( new OO.ui.IconWidget( { icon: 'clip' } ) ).$element );
+
+               this.input = new OO.ui.TextInputWidget( {
+                       validate: /\S/
+               } );
+               layout = new OO.ui.FieldLayout( this.input, {
+                       label: mw.msg( 'rcfilters-savedqueries-new-name-label' ),
+                       align: 'top'
+               } );
+
+               this.applyButton = new OO.ui.ButtonWidget( {
+                       label: mw.msg( 'rcfilters-savedqueries-apply-label' ),
+                       classes: [ 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-buttons-apply' ],
+                       flags: [ 'primary', 'progressive' ]
+               } );
+               this.cancelButton = new OO.ui.ButtonWidget( {
+                       label: mw.msg( 'rcfilters-savedqueries-cancel-label' ),
+                       classes: [ 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-buttons-cancel' ]
+               } );
+
+               $popupContent
+                       .append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-layout' )
+                                       .append( layout.$element ),
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-buttons' )
+                                       .append(
+                                               this.cancelButton.$element,
+                                               this.applyButton.$element
+                                       )
+                       );
+
+               // Events
+               this.popup.connect( this, {
+                       ready: 'onPopupReady',
+                       toggle: 'onPopupToggle'
+               } );
+               this.input.connect( this, { enter: 'onInputEnter' } );
+               this.input.$input.on( {
+                       keyup: this.onInputKeyup.bind( this )
+               } );
+               this.cancelButton.connect( this, { click: 'onCancelButtonClick' } );
+               this.applyButton.connect( this, { click: 'onApplyButtonClick' } );
+
+               // Initialize
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget' );
+       };
+
+       /* Initialization */
+       OO.inheritClass( mw.rcfilters.ui.SaveFiltersPopupButtonWidget, OO.ui.PopupButtonWidget );
+
+       /**
+        * Respond to input enter event
+        */
+       mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onInputEnter = function () {
+               this.apply();
+       };
+
+       /**
+        * Respond to input keyup event, this is the way to intercept 'escape' key
+        *
+        * @param {jQuery.Event} e Event data
+        * @returns {boolean} false
+        */
+       mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onInputKeyup = function ( e ) {
+               if ( e.which === OO.ui.Keys.ESCAPE ) {
+                       this.popup.toggle( false );
+                       return false;
+               }
+       };
+
+       /**
+        * Respond to popup toggle event
+        *
+        * @param {boolean} isVisible Popup is visible
+        */
+       mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onPopupToggle = function ( isVisible ) {
+               this.setIcon( isVisible ? 'unClip' : 'clip' );
+       };
+
+       /**
+        * Respond to popup ready event
+        */
+       mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onPopupReady = function () {
+               this.input.focus();
+       };
+
+       /**
+        * Respond to cancel button click event
+        */
+       mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onCancelButtonClick = function () {
+               this.popup.toggle( false );
+       };
+
+       /**
+        * Respond to apply button click event
+        */
+       mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onApplyButtonClick = function () {
+               this.apply();
+       };
+
+       /**
+        * Apply and add the new quick link
+        */
+       mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.apply = function () {
+               var widget = this,
+                       label = this.input.getValue();
+
+               this.input.getValidity()
+                       .done( function () {
+                               widget.controller.saveCurrentQuery( label );
+                               widget.input.setValue( this.input, '' );
+                               widget.emit( 'saveCurrent' );
+                               widget.popup.toggle( false );
+                       } );
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js
new file mode 100644 (file)
index 0000000..acda29e
--- /dev/null
@@ -0,0 +1,299 @@
+( function ( mw ) {
+       /**
+        * Quick links menu option widget
+        *
+        * @extends OO.ui.Widget
+        * @mixins OO.ui.mixin.LabelElement
+        * @mixins OO.ui.mixin.IconElement
+        * @mixins OO.ui.mixin.TitledElement
+        *
+        * @constructor
+        * @param {mw.rcfilters.dm.SavedQueryItemModel} model View model
+        * @param {Object} [config] Configuration object
+        * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget = function MwRcfiltersUiSavedLinksListWidget( model, config ) {
+               config = config || {};
+
+               this.model = model;
+
+               // Parent
+               mw.rcfilters.ui.SavedLinksListItemWidget.parent.call( this, $.extend( {
+                       data: this.model.getID()
+               }, config ) );
+
+               // Mixin constructors
+               OO.ui.mixin.LabelElement.call( this, $.extend( {
+                       label: this.model.getLabel()
+               }, config ) );
+               OO.ui.mixin.IconElement.call( this, $.extend( {
+                       icon: ''
+               }, config ) );
+               OO.ui.mixin.TitledElement.call( this, $.extend( {
+                       title: this.model.getLabel()
+               }, config ) );
+
+               this.edit = false;
+               this.$overlay = config.$overlay || this.$element;
+
+               this.popupButton = new OO.ui.ButtonWidget( {
+                       classes: [ 'mw-rcfilters-ui-savedLinksListItemWidget-button' ],
+                       icon: 'ellipsis',
+                       framed: false
+               } );
+               this.menu = new OO.ui.FloatingMenuSelectWidget( {
+                       classes: [ 'mw-rcfilters-ui-savedLinksListItemWidget-menu' ],
+                       widget: this.popupButton,
+                       width: 200,
+                       horizontalPosition: 'end',
+                       $container: this.popupButton.$element,
+                       items: [
+                               new OO.ui.MenuOptionWidget( {
+                                       data: 'edit',
+                                       icon: 'edit',
+                                       label: mw.msg( 'rcfilters-savedqueries-rename' )
+                               } ),
+                               new OO.ui.MenuOptionWidget( {
+                                       data: 'delete',
+                                       icon: 'close',
+                                       label: mw.msg( 'rcfilters-savedqueries-remove' )
+                               } ),
+                               new OO.ui.MenuOptionWidget( {
+                                       data: 'default',
+                                       icon: 'pushPin',
+                                       label: mw.msg( 'rcfilters-savedqueries-setdefault' )
+                               } )
+                       ]
+               } );
+
+               this.editInput = new OO.ui.TextInputWidget( {
+                       classes: [ 'mw-rcfilters-ui-savedLinksListItemWidget-input' ]
+               } );
+               this.saveButton = new OO.ui.ButtonWidget( {
+                       icon: 'check',
+                       flags: [ 'primary', 'progressive' ]
+               } );
+               this.toggleEdit( false );
+
+               // Events
+               this.model.connect( this, { update: 'onModelUpdate' } );
+               this.popupButton.connect( this, { click: 'onPopupButtonClick' } );
+               this.menu.connect( this, {
+                       choose: 'onMenuChoose'
+               } );
+               this.saveButton.connect( this, { click: 'onSaveButtonClick' } );
+               this.editInput.connect( this, { enter: 'onEditInputEnter' } );
+               this.editInput.$input.on( {
+                       blur: this.onInputBlur.bind( this ),
+                       keyup: this.onInputKeyup.bind( this )
+               } );
+               this.$element.on( { click: this.onClick.bind( this ) } );
+               this.$label.on( { click: this.onClick.bind( this ) } );
+               // Prevent propagation on mousedown for the save button
+               // so the menu doesn't close
+               this.saveButton.$element.on( { mousedown: function () { return false; } } );
+
+               // Initialize
+               this.toggleDefault( !!this.model.isDefault() );
+               this.$overlay.append( this.menu.$element );
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget' )
+                       .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-query-' + this.model.getID() )
+                       .append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-table' )
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-row' )
+                                                       .append(
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                                                       .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-content' )
+                                                                       .append(
+                                                                               this.$label
+                                                                                       .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-label' ),
+                                                                               this.editInput.$element,
+                                                                               this.saveButton.$element
+                                                                       ),
+                                                               $( '<div>' )
+                                                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                                                       .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-icon' )
+                                                                       .append( this.$icon ),
+                                                               this.popupButton.$element
+                                                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                                       )
+                                       )
+                       );
+       };
+
+       /* Initialization */
+       OO.inheritClass( mw.rcfilters.ui.SavedLinksListItemWidget, OO.ui.Widget );
+       OO.mixinClass( mw.rcfilters.ui.SavedLinksListItemWidget, OO.ui.mixin.LabelElement );
+       OO.mixinClass( mw.rcfilters.ui.SavedLinksListItemWidget, OO.ui.mixin.IconElement );
+       OO.mixinClass( mw.rcfilters.ui.SavedLinksListItemWidget, OO.ui.mixin.TitledElement );
+
+       /* Events */
+
+       /**
+        * @event delete
+        *
+        * The delete option was selected for this item
+        */
+
+       /**
+        * @event default
+        * @param {boolean} default Item is default
+        *
+        * The 'make default' option was selected for this item
+        */
+
+       /**
+        * @event edit
+        * @param {string} newLabel New label for the query
+        *
+        * The label has been edited
+        */
+
+       /* Methods */
+
+       /**
+        * Respond to model update event
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onModelUpdate = function () {
+               this.setLabel( this.model.getLabel() );
+               this.toggleDefault( this.model.isDefault() );
+       };
+
+       /**
+        * Respond to click on the element or label
+        *
+        * @fires click
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onClick = function () {
+               if ( !this.editing ) {
+                       this.emit( 'click' );
+               }
+       };
+       /**
+        * Respond to popup button click event
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onPopupButtonClick = function () {
+               this.menu.toggle();
+       };
+
+       /**
+        * Respond to menu choose event
+        *
+        * @param {OO.ui.MenuOptionWidget} item Chosen item
+        * @fires delete
+        * @fires default
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onMenuChoose = function ( item ) {
+               var action = item.getData();
+
+               if ( action === 'edit' ) {
+                       this.toggleEdit( true );
+               } else if ( action === 'delete' ) {
+                       this.emit( 'delete' );
+               } else if ( action === 'default' ) {
+                       this.emit( 'default', !this.default );
+               }
+               // Reset selected
+               this.menu.selectItem( null );
+               // Close the menu
+               this.menu.toggle( false );
+       };
+
+       /**
+        * Respond to save button click
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onSaveButtonClick = function () {
+               this.emit( 'edit', this.editInput.getValue() );
+               this.toggleEdit( false );
+       };
+
+       /**
+        * Respond to input enter event
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onEditInputEnter = function () {
+               this.emit( 'edit', this.editInput.getValue() );
+               this.toggleEdit( false );
+       };
+
+       /**
+        * Respond to input keyup event, this is the way to intercept 'escape' key
+        *
+        * @param {jQuery.Event} e Event data
+        * @returns {boolean} false
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onInputKeyup = function ( e ) {
+               if ( e.which === OO.ui.Keys.ESCAPE ) {
+                       // Return the input to the original label
+                       this.editInput.setValue( this.getLabel() );
+                       this.toggleEdit( false );
+                       return false;
+               }
+       };
+
+       /**
+        * Respond to blur event on the input
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onInputBlur = function () {
+               this.emit( 'edit', this.editInput.getValue() );
+               this.toggleEdit( false );
+       };
+
+       /**
+        * Toggle edit mode on this widget
+        *
+        * @param {boolean} isEdit Widget is in edit mode
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget.prototype.toggleEdit = function ( isEdit ) {
+               isEdit = isEdit === undefined ? !this.editing : isEdit;
+
+               if ( this.editing !== isEdit ) {
+                       this.$element.toggleClass( 'mw-rcfilters-ui-savedLinksListItemWidget-edit', isEdit );
+                       this.editInput.setValue( this.getLabel() );
+
+                       this.editInput.toggle( isEdit );
+                       this.$label.toggleClass( 'oo-ui-element-hidden', isEdit );
+                       this.$icon.toggleClass( 'oo-ui-element-hidden', isEdit );
+                       this.popupButton.toggle( !isEdit );
+                       this.saveButton.toggle( isEdit );
+
+                       if ( isEdit ) {
+                               this.editInput.$input.focus();
+                       }
+                       this.editing = isEdit;
+               }
+       };
+
+       /**
+        * Toggle default this widget
+        *
+        * @param {boolean} isDefault This item is default
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget.prototype.toggleDefault = function ( isDefault ) {
+               isDefault = isDefault === undefined ? !this.default : isDefault;
+
+               if ( this.default !== isDefault ) {
+                       this.default = isDefault;
+                       this.setIcon( this.default ? 'pushPin' : '' );
+                       this.menu.getItemFromData( 'default' ).setLabel(
+                               this.default ?
+                                       mw.msg( 'rcfilters-savedqueries-unsetdefault' ) :
+                                       mw.msg( 'rcfilters-savedqueries-setdefault' )
+                       );
+               }
+       };
+
+       /**
+        * Get item ID
+        *
+        * @returns {string} Query identifier
+        */
+       mw.rcfilters.ui.SavedLinksListItemWidget.prototype.getID = function () {
+               return this.model.getID();
+       };
+
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js
new file mode 100644 (file)
index 0000000..8c021d0
--- /dev/null
@@ -0,0 +1,153 @@
+( function ( mw ) {
+       /**
+        * Quick links widget
+        *
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller Controller
+        * @param {mw.rcfilters.dm.SavedQueriesModel} model View model
+        * @param {Object} [config] Configuration object
+        * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
+        */
+       mw.rcfilters.ui.SavedLinksListWidget = function MwRcfiltersUiSavedLinksListWidget( controller, model, config ) {
+               var $labelNoEntries = $( '<div>' )
+                       .append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-savedLinksListWidget-placeholder-title' )
+                                       .text( mw.msg( 'rcfilters-quickfilters-placeholder-title' ) ),
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-savedLinksListWidget-placeholder-description' )
+                                       .text( mw.msg( 'rcfilters-quickfilters-placeholder-description' ) )
+                       );
+
+               config = config || {};
+
+               // Parent
+               mw.rcfilters.ui.SavedLinksListWidget.parent.call( this, config );
+
+               this.controller = controller;
+               this.model = model;
+               this.$overlay = config.$overlay || this.$element;
+
+               this.placeholderItem = new OO.ui.DecoratedOptionWidget( {
+                       classes: [ 'mw-rcfilters-ui-savedLinksListWidget-placeholder' ],
+                       label: $labelNoEntries,
+                       icon: 'unClip'
+               } );
+               // The only reason we're using "ButtonGroupWidget" here is that
+               // straight-out "GroupWidget" is a mixin and cannot be initialized
+               // on its own, so we need something to be its widget.
+               this.menu = new OO.ui.ButtonGroupWidget( {
+                       classes: [ 'mw-rcfilters-ui-savedLinksListWidget-menu' ],
+                       items: [ this.placeholderItem ]
+               } );
+               this.button = new OO.ui.PopupButtonWidget( {
+                       classes: [ 'mw-rcfilters-ui-savedLinksListWidget-button' ],
+                       label: mw.msg( 'rcfilters-quickfilters' ),
+                       icon: 'unClip',
+                       indicator: 'down',
+                       $overlay: this.$overlay,
+                       popup: {
+                               width: 300,
+                               anchor: false,
+                               align: 'forwards',
+                               $autoCloseIgnore: this.$overlay,
+                               $content: this.menu.$element
+                       }
+               } );
+
+               this.menu.aggregate( {
+                       click: 'menuItemClick',
+                       'delete': 'menuItemDelete',
+                       'default': 'menuItemDefault',
+                       edit: 'menuItemEdit'
+               } );
+
+               // Events
+               this.model.connect( this, {
+                       add: 'onModelAddItem',
+                       remove: 'onModelRemoveItem'
+               } );
+               this.menu.connect( this, {
+                       menuItemClick: 'onMenuItemClick',
+                       menuItemDelete: 'onMenuItemRemove',
+                       menuItemDefault: 'onMenuItemDefault',
+                       menuItemEdit: 'onMenuItemEdit'
+               } );
+
+               this.placeholderItem.toggle( this.model.isEmpty() );
+               // Initialize
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-savedLinksListWidget' )
+                       .append( this.button.$element );
+       };
+
+       /* Initialization */
+       OO.inheritClass( mw.rcfilters.ui.SavedLinksListWidget, OO.ui.Widget );
+
+       /**
+        * Respond to menu item click event
+        *
+        * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
+        */
+       mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemClick = function ( item ) {
+               this.controller.applySavedQuery( item.getID() );
+               this.button.popup.toggle( false );
+       };
+
+       /**
+        * Respond to menu item remove event
+        *
+        * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
+        */
+       mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemRemove = function ( item ) {
+               this.controller.removeSavedQuery( item.getID() );
+       };
+
+       /**
+        * Respond to menu item default event
+        *
+        * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
+        * @param {boolean} isDefault Item is default
+        */
+       mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemDefault = function ( item, isDefault ) {
+               this.controller.setDefaultSavedQuery( isDefault ? item.getID() : null );
+       };
+
+       /**
+        * Respond to menu item edit event
+        *
+        * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
+        * @param {string} newLabel New label
+        */
+       mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemEdit = function ( item, newLabel ) {
+               this.controller.renameSavedQuery( item.getID(), newLabel );
+       };
+
+       /**
+        * Respond to menu add item event
+        *
+        * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
+        */
+       mw.rcfilters.ui.SavedLinksListWidget.prototype.onModelAddItem = function ( item ) {
+               if ( this.menu.getItemFromData( item.getID() ) ) {
+                       return;
+               }
+
+               this.menu.addItems( [
+                       new mw.rcfilters.ui.SavedLinksListItemWidget( item, { $overlay: this.$overlay } )
+               ] );
+               this.placeholderItem.toggle( this.model.isEmpty() );
+       };
+
+       /**
+        * Respond to menu remove item event
+        *
+        * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item
+        */
+       mw.rcfilters.ui.SavedLinksListWidget.prototype.onModelRemoveItem = function ( item ) {
+               this.menu.removeItems( [ this.menu.getItemFromData( item.getID() ) ] );
+               this.placeholderItem.toggle( this.model.isEmpty() );
+       };
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.TagItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.TagItemWidget.js
new file mode 100644 (file)
index 0000000..637dbdc
--- /dev/null
@@ -0,0 +1,183 @@
+( function ( mw, $ ) {
+       /**
+        * Extend OOUI's TagItemWidget to also display a popup on hover.
+        *
+        * @class
+        * @extends OO.ui.TagItemWidget
+        * @mixins OO.ui.mixin.PopupElement
+        *
+        * @constructor
+        * @param {mw.rcfilters.Controller} controller
+        * @param {mw.rcfilters.dm.FilterItem} model Item model
+        * @param {Object} config Configuration object
+        * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
+        */
+       mw.rcfilters.ui.TagItemWidget = function MwRcfiltersUiTagItemWidget( controller, model, config ) {
+               // Configuration initialization
+               config = config || {};
+
+               this.controller = controller;
+               this.model = model;
+               this.selected = false;
+
+               mw.rcfilters.ui.TagItemWidget.parent.call( this, $.extend( {
+                       data: this.model.getName(),
+                       label: this.model.getLabel()
+               }, config ) );
+
+               this.$overlay = config.$overlay || this.$element;
+               this.popupLabel = new OO.ui.LabelWidget();
+
+               // Mixin constructors
+               OO.ui.mixin.PopupElement.call( this, $.extend( {
+                       popup: {
+                               padded: false,
+                               align: 'center',
+                               position: 'above',
+                               $content: $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-tagItemWidget-popup-content' )
+                                       .append( this.popupLabel.$element ),
+                               $floatableContainer: this.$element,
+                               classes: [ 'mw-rcfilters-ui-tagItemWidget-popup' ]
+                       }
+               }, config ) );
+
+               this.positioned = false;
+               this.popupTimeoutShow = null;
+               this.popupTimeoutHide = null;
+
+               this.$highlight = $( '<div>' )
+                       .addClass( 'mw-rcfilters-ui-tagItemWidget-highlight' );
+
+               // Events
+               this.model.connect( this, { update: 'onModelUpdate' } );
+
+               // Initialization
+               this.$overlay.append( this.popup.$element );
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-tagItemWidget' )
+                       .prepend( this.$highlight )
+                       .attr( 'aria-haspopup', 'true' )
+                       .on( 'mouseenter', this.onMouseEnter.bind( this ) )
+                       .on( 'mouseleave', this.onMouseLeave.bind( this ) );
+
+               this.setCurrentMuteState();
+               this.setHighlightColor();
+       };
+
+       /* Initialization */
+
+       OO.inheritClass( mw.rcfilters.ui.TagItemWidget, OO.ui.TagItemWidget );
+       OO.mixinClass( mw.rcfilters.ui.TagItemWidget, OO.ui.mixin.PopupElement );
+
+       /* Methods */
+
+       /**
+        * Respond to model update event
+        */
+       mw.rcfilters.ui.TagItemWidget.prototype.onModelUpdate = function () {
+               this.setCurrentMuteState();
+
+               this.setHighlightColor();
+       };
+
+       mw.rcfilters.ui.TagItemWidget.prototype.setHighlightColor = function () {
+               var selectedColor = this.model.isHighlightEnabled() ? this.model.getHighlightColor() : null;
+
+               this.$highlight
+                       .attr( 'data-color', selectedColor )
+                       .toggleClass(
+                               'mw-rcfilters-ui-tagItemWidget-highlight-highlighted',
+                               !!selectedColor
+                       );
+       };
+
+       /**
+        * Set the current mute state for this item
+        */
+       mw.rcfilters.ui.TagItemWidget.prototype.setCurrentMuteState = function () {};
+
+       /**
+        * Respond to mouse enter event
+        */
+       mw.rcfilters.ui.TagItemWidget.prototype.onMouseEnter = function () {
+               var labelText = this.model.getStateMessage();
+
+               if ( labelText ) {
+                       this.popupLabel.setLabel( labelText );
+
+                       if ( !this.positioned ) {
+                               // Recalculate anchor position to be center of the capsule item
+                               this.popup.$anchor.css( 'margin-left', ( this.$element.width() / 2 ) );
+                               this.positioned = true;
+                       }
+
+                       // Set timeout for the popup to show
+                       this.popupTimeoutShow = setTimeout( function () {
+                               this.popup.toggle( true );
+                       }.bind( this ), 500 );
+
+                       // Cancel the hide timeout
+                       clearTimeout( this.popupTimeoutHide );
+                       this.popupTimeoutHide = null;
+               }
+       };
+
+       /**
+        * Respond to mouse leave event
+        */
+       mw.rcfilters.ui.TagItemWidget.prototype.onMouseLeave = function () {
+               this.popupTimeoutHide = setTimeout( function () {
+                       this.popup.toggle( false );
+               }.bind( this ), 250 );
+
+               // Clear the show timeout
+               clearTimeout( this.popupTimeoutShow );
+               this.popupTimeoutShow = null;
+       };
+
+       /**
+        * Set selected state on this widget
+        *
+        * @param {boolean} [isSelected] Widget is selected
+        */
+       mw.rcfilters.ui.TagItemWidget.prototype.toggleSelected = function ( isSelected ) {
+               isSelected = isSelected !== undefined ? isSelected : !this.selected;
+
+               if ( this.selected !== isSelected ) {
+                       this.selected = isSelected;
+
+                       this.$element.toggleClass( 'mw-rcfilters-ui-tagItemWidget-selected', this.selected );
+               }
+       };
+
+       /**
+        * Get the selected state of this widget
+        *
+        * @return {boolean} Tag is selected
+        */
+       mw.rcfilters.ui.TagItemWidget.prototype.isSelected = function () {
+               return this.selected;
+       };
+
+       /**
+        * Get item name
+        *
+        * @return {string} Filter name
+        */
+       mw.rcfilters.ui.TagItemWidget.prototype.getName = function () {
+               return this.model.getName();
+       };
+
+       /**
+        * Remove and destroy external elements of this widget
+        */
+       mw.rcfilters.ui.TagItemWidget.prototype.destroy = function () {
+               // Destroy the popup
+               this.popup.$element.detach();
+
+               // Disconnect events
+               this.model.disconnect( this );
+               this.closeButton.disconnect( this );
+       };
+}( mediaWiki, jQuery ) );
index a49cfeb..737ef5f 100644 (file)
@@ -1,2 +1,4 @@
-var Router = require( 'oojs-router' );
-module.exports = new Router();
+( function () {
+       var Router = require( 'oojs-router' );
+       module.exports = new Router();
+}() );
index 823ce05..cd674ef 100644 (file)
@@ -9,7 +9,7 @@
  * compatibility ( browsers able to understand gradient syntax support also SVG ).
  * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
 
-.mw-body a.external,
+.mw-body-content a.external,
 .link-https {
        background: url( images/external-ltr.png ) center right no-repeat;
        /* @embed */
@@ -19,7 +19,7 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="mailto:"],
+.mw-body-content a.external[href^='mailto:'],
 .link-mailto {
        background: url( images/mail.png ) center right no-repeat;
        /* @embed */
@@ -27,7 +27,7 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="ftp://"],
+.mw-body-content a.external[href^='ftp://'],
 .link-ftp {
        background: url( images/ftp-ltr.png ) center right no-repeat;
        /* @embed */
@@ -35,8 +35,8 @@
        padding-right: 15px;
 }
 
-.mw-body a.external[href^="irc://"],
-.mw-body a.external[href^="ircs://"],
+.mw-body-content a.external[href^='irc://'],
+.mw-body-content a.external[href^='ircs://'],
 .link-irc {
        background: url( images/chat-ltr.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".ogg"],
-.mw-body a.external[href$=".OGG"],
-.mw-body a.external[href$=".mid"],
-.mw-body a.external[href$=".MID"],
-.mw-body a.external[href$=".midi"],
-.mw-body a.external[href$=".MIDI"],
-.mw-body a.external[href$=".mp3"],
-.mw-body a.external[href$=".MP3"],
-.mw-body a.external[href$=".wav"],
-.mw-body a.external[href$=".WAV"],
-.mw-body a.external[href$=".wma"],
-.mw-body a.external[href$=".WMA"],
+.mw-body-content a.external[href$='.ogg'],
+.mw-body-content a.external[href$='.OGG'],
+.mw-body-content a.external[href$='.mid'],
+.mw-body-content a.external[href$='.MID'],
+.mw-body-content a.external[href$='.midi'],
+.mw-body-content a.external[href$='.MIDI'],
+.mw-body-content a.external[href$='.mp3'],
+.mw-body-content a.external[href$='.MP3'],
+.mw-body-content a.external[href$='.wav'],
+.mw-body-content a.external[href$='.WAV'],
+.mw-body-content a.external[href$='.wma'],
+.mw-body-content a.external[href$='.WMA'],
 .link-audio {
        background: url( images/audio-ltr.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".ogm"],
-.mw-body a.external[href$=".OGM"],
-.mw-body a.external[href$=".avi"],
-.mw-body a.external[href$=".AVI"],
-.mw-body a.external[href$=".mpeg"],
-.mw-body a.external[href$=".MPEG"],
-.mw-body a.external[href$=".mpg"],
-.mw-body a.external[href$=".MPG"],
+.mw-body-content a.external[href$='.ogm'],
+.mw-body-content a.external[href$='.OGM'],
+.mw-body-content a.external[href$='.avi'],
+.mw-body-content a.external[href$='.AVI'],
+.mw-body-content a.external[href$='.mpeg'],
+.mw-body-content a.external[href$='.MPEG'],
+.mw-body-content a.external[href$='.mpg'],
+.mw-body-content a.external[href$='.MPG'],
 .link-video {
        background: url( images/video.png ) center right no-repeat;
        /* @embed */
        padding-right: 15px;
 }
 
-.mw-body a.external[href$=".pdf"],
-.mw-body a.external[href$=".PDF"],
-.mw-body a.external[href*=".pdf#"],
-.mw-body a.external[href*=".PDF#"],
-.mw-body a.external[href*=".pdf?"],
-.mw-body a.external[href*=".PDF?"],
+.mw-body-content a.external[href$='.pdf'],
+.mw-body-content a.external[href$='.PDF'],
+.mw-body-content a.external[href*='.pdf#'],
+.mw-body-content a.external[href*='.PDF#'],
+.mw-body-content a.external[href*='.pdf?'],
+.mw-body-content a.external[href*='.PDF?'],
 .link-document {
        background: url( images/document-ltr.png ) center right no-repeat;
        /* @embed */
 }
 
 /* Interwiki styling */
-.mw-body a.extiw,
-.mw-body a.extiw:active {
+.mw-body-content a.extiw,
+.mw-body-content a.extiw:active {
        color: #36b;
 }
 
 /* External link color */
-.mw-body a.external {
+.mw-body-content a.external {
        color: #36b;
 }
index b4fe934..7a7df7a 100644 (file)
  * automatically when content is modified.
  */
 .mw-body-content {
-       counter-reset: mw-NumberedExtLink;
+       counter-reset: mw-numbered-ext-link;
 }
 
-.mw-body-content a[rel~="mw:ExtLink"]:empty:after {
-       content: "[" counter( mw-NumberedExtLink ) "]";
-       counter-increment: mw-NumberedExtLink;
+.mw-body-content a[rel~='mw:ExtLink']:empty:after {
+       content: '[' counter( mw-numbered-ext-link ) ']';
+       counter-increment: mw-numbered-ext-link;
 }
 
 /**
@@ -46,7 +46,9 @@ sub {
 /**
  * Block media items
  */
-figure[typeof*='mw:Image'] {
+figure[typeof*='mw:Image'],
+figure[typeof*='mw:Video'],
+figure[typeof*='mw:Audio'] {
        margin: 0;
 
        a {
@@ -88,18 +90,18 @@ figure[typeof*='mw:Image'] {
                display: table-caption;
                caption-side: bottom;
                /* In mw-core the font-size is duplicated, 94% in thumbiner
-                  and again 94% in thumbcaption. 88% for font size of the
-                  caption results in the same behavior. */
-               font-size: 88%;
+                * and again 94% in thumbcaption. 88.4% for font size of the
+                * caption results in the same behavior. */
+               font-size: 88.4%;
                line-height: 1.4em;
                text-align: left;
 
-               border: 1px solid #ccc;
+               border: 1px solid #c8ccd1;
                border-top: 0;
 
                /* taken from .thumbcaption, plus .thumbinner */
-               padding: 1px 5px 5px;
-               background-color: #f9f9f9;
+               padding: 0 6px 6px 6px;
+               background-color: #f8f9fa;
 
                table {
                        /* reset caption side for tables inside figcaptions */
@@ -109,31 +111,50 @@ figure[typeof*='mw:Image'] {
 }
 
 figure[typeof~='mw:Image/Thumb'],
-figure[typeof~='mw:Image/Frame'] {
+figure[typeof~='mw:Video/Thumb'],
+figure[typeof~='mw:Audio/Thumb'],
+figure[typeof~='mw:Image/Frame'],
+figure[typeof~='mw:Video/Frame'],
+figure[typeof~='mw:Audio/Frame'] {
        display: table;
        overflow: auto;
        text-align: center;
-       border: 1px solid #ccc;
+       border: 1px solid #c8ccd1;
        border-bottom: 0; // No border to caption
        border-collapse: collapse;
-       background-color: #f9f9f9;
+       background-color: #f8f9fa;
        // Default to right alignment. This is needed since Parsoid only specifies the
        // alignment class when the alignment is explicitly set.
        margin: 0.5em 0 1.3em 1.4em;
        clear: right;
        float: right;
+
+       > *:first-child {
+               > img,
+               > video {
+                       border: 1px solid #c8ccd1;
+                       margin: 3px;
+                       background: #fff;
+               }
+       }
 }
 
-figure[typeof~='mw:Image/Thumb'] > *:first-child > img,
-figure[typeof~='mw:Image/Frame'] > *:first-child > img,
-.mw-image-border > *:first-child > img {
-       border: 1px solid #ccc;
-       margin: 3px;
-       background: #fff;
+/* Same as img.thumbborder in content.css */
+.mw-image-border > *:first-child {
+       > img,
+       > video {
+               border: 1px solid #eaecf0;
+       }
 }
 
 /* Hide the caption for frameless and plain floated images */
-figure[typeof~="mw:Image/Frameless"] > figcaption,
-figure[typeof~="mw:Image"] > figcaption {
-       display: none;
+figure[typeof~='mw:Image/Frameless'],
+figure[typeof~='mw:Video/Frameless'],
+figure[typeof~='mw:Audio/Frameless'],
+figure[typeof~='mw:Image'],
+figure[typeof~='mw:Video'],
+figure[typeof~='mw:Audio'] {
+       > figcaption {
+               display: none;
+       }
 }
index 46de7b5..d204d5d 100644 (file)
@@ -53,33 +53,33 @@ a.new:visited,
 }
 
 /* Interwiki Styling */
-.mw-body a.extiw,
-.mw-body a.extiw:active {
+.mw-body-content a.extiw,
+.mw-body-content a.extiw:active {
        color: #36b;
 }
 
-.mw-body a.extiw:visited {
+.mw-body-content a.extiw:visited {
        color: #636;
 }
 
-.mw-body a.extiw:active {
+.mw-body-content a.extiw:active {
        color: #b63;
 }
 
 /* External links */
-.mw-body a.external {
+.mw-body-content a.external {
        color: #36b;
 }
 
-.mw-body a.external:visited {
+.mw-body-content a.external:visited {
        color: #636; /* T5112 */
 }
 
-.mw-body a.external:active {
+.mw-body-content a.external:active {
        color: #b63;
 }
 
-.mw-body a.external.free {
+.mw-body-content a.external.free {
        word-wrap: break-word;
 }
 
index 2be3bb2..c6d5082 100644 (file)
@@ -21,7 +21,7 @@ textarea {
 }
 
 .editOptions {
-       background-color: #f8f9fa;
+       background-color: #eaecf0;
        border: 1px solid #c8ccd1;
        border-top: 0;
        padding: 1em 1em 1.5em 1em;
diff --git a/resources/src/mediawiki.special/images/special.search/book-icon.png b/resources/src/mediawiki.special/images/special.search/book-icon.png
deleted file mode 100644 (file)
index 07e3ec7..0000000
Binary files a/resources/src/mediawiki.special/images/special.search/book-icon.png and /dev/null differ
diff --git a/resources/src/mediawiki.special/images/special.search/book-icon.svg b/resources/src/mediawiki.special/images/special.search/book-icon.svg
deleted file mode 100644 (file)
index 6c3fa5f..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
-    <title>wikisource-icon</title>
-    <desc>Created with Sketch.</desc>
-    <defs>
-        <path d="M25.9612634,4.16259168 C25.9612634,3.05318514 26.8209364,1.88015355 27.8804771,1.5831456 C27.8804771,1.5831456 45.019739,-4.60039908 52.9189989,7.7430239 C52.8276879,7.87091176 53.3244937,43.6894771 53.0961715,43.801598 C38.1346526,39.2213878 27.8617804,43.2196252 27.8617804,43.2196252 C26.8121538,43.5410399 25.9612634,42.9124575 25.9612634,41.7928397 L25.9612634,4.16259168 Z" id="path-1"></path>
-        <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="27.195528" height="43.7625003" fill="white">
-            <use xlink:href="#path-1"></use>
-        </mask>
-        <path d="M1.08483248,4.15020908 C1.08483248,3.04080253 1.94450542,1.86777094 3.00404616,1.57076299 C3.00404616,1.57076299 20.1433081,-4.61278168 28.0425679,7.73064129 C27.951257,7.85852916 28.4480627,43.6770945 28.2197406,43.7892154 C13.2582217,39.2090052 2.98534945,43.2072426 2.98534945,43.2072426 C1.93572291,43.5286573 1.08483248,42.9000749 1.08483248,41.7804571 L1.08483248,4.15020908 Z" id="path-3"></path>
-        <mask id="mask-4" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="27.195528" height="43.7625003" fill="white">
-            <use xlink:href="#path-3"></use>
-        </mask>
-    </defs>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="wikisource">
-            <g id="Group-2" transform="translate(3.000000, 7.000000)">
-                <g id="Group">
-                    <rect id="Rectangle-3" fill="#000000" x="19.5269846" y="36.730429" width="15.1876547" height="9.47882039" rx="4.7394102"></rect>
-                    <rect id="Rectangle" fill="#000000" x="0" y="8.29396785" width="55.3264563" height="35.5455765" rx="2"></rect>
-                    <use id="Rectangle-2" stroke="#000000" mask="url(#mask-2)" stroke-width="4" fill="#FFFFFF" transform="translate(39.559027, 21.920348) scale(-1, 1) translate(-39.559027, -21.920348) " xlink:href="#path-1"></use>
-                    <use id="Rectangle-2" stroke="#000000" mask="url(#mask-4)" stroke-width="4" fill="#FFFFFF" xlink:href="#path-3"></use>
-                </g>
-                <path d="M5.94322419,22.653192 C15.2672322,19.3261075 22.9765332,23.990418 22.9765332,23.990418" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
-                <path d="M5.94322419,16.7331266 C15.2672322,13.4060421 22.9765332,18.0703525 22.9765332,18.0703525" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
-                <path d="M5.94322419,11.0846878 C15.2672322,7.75760327 22.9765332,12.4219137 22.9765332,12.4219137" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
-                <path d="M5.94322419,28.5732575 C15.2672322,25.246173 22.9765332,29.9104834 22.9765332,29.9104834" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
-                <path d="M5.94322419,34.4933229 C15.2672322,31.1662384 22.9765332,35.8305489 22.9765332,35.8305489" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
-                <path d="M31.8963536,26.2991517 C41.2203616,22.7867165 48.9296626,27.2977748 48.9296626,27.2977748" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
-                <path d="M31.8963536,32.2192172 C41.2203616,28.7067819 48.9296626,33.2178402 48.9296626,33.2178402" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="round"></path>
-                <path d="M32.1957977,11.8254134 C32.1957977,11.8254134 34.7092977,10.1127027 40.1604435,10.1337008 C45.6115894,10.1546989 47.8024685,11.8254134 47.8024685,11.8254134 L47.8024685,21.3219156 C47.8024685,21.3219156 43.8085467,20.1940894 39.931856,20.1940894 C36.0551653,20.1940894 32.1957977,21.3219156 32.1957977,21.3219156 L32.1957977,11.8254134 Z" id="Rectangle-4" fill="#000000"></path>
-            </g>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/course-icon.png b/resources/src/mediawiki.special/images/special.search/course-icon.png
deleted file mode 100644 (file)
index 9aad230..0000000
Binary files a/resources/src/mediawiki.special/images/special.search/course-icon.png and /dev/null differ
diff --git a/resources/src/mediawiki.special/images/special.search/course-icon.svg b/resources/src/mediawiki.special/images/special.search/course-icon.svg
deleted file mode 100644 (file)
index 4fab1f3..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
-    <title>wikiversity-icon</title>
-    <desc>Created with Sketch.</desc>
-    <defs>
-        <path d="M1.79361627,13.3306367 C-0.140465792,12.4757391 -0.144839204,11.0916093 1.78234628,10.2397601 L23.5026391,0.639016247 C25.4304969,-0.213130142 28.5529839,-0.214539335 30.4952998,0.64399778 L52.8863837,10.5412429 C54.8204658,11.3961405 54.8248392,12.7802702 52.8976537,13.6321195 L31.1773609,23.2328633 C29.2495031,24.0850097 26.1270161,24.0864189 24.1847002,23.2278818 L1.79361627,13.3306367 Z" id="path-1"></path>
-        <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="-5" y="-5" width="64" height="33.8718796">
-            <rect x="-4.66" y="-5" width="64" height="33.8718796" fill="white"></rect>
-            <use xlink:href="#path-1" fill="black"></use>
-        </mask>
-        <circle id="path-3" cx="7" cy="27" r="5"></circle>
-        <mask id="mask-4" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="-3" y="-3" width="16" height="16">
-            <rect x="-1" y="19" width="16" height="16" fill="white"></rect>
-            <use xlink:href="#path-3" fill="black"></use>
-        </mask>
-    </defs>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="wikiversity">
-            <g id="Group-2" transform="translate(3.000000, 11.000000)">
-                <path d="M8,16 L47,16 L47,31.89585 C47,31.89585 42.2783874,38.5113751 27.5,38.8710875 C12.7216126,39.2307999 8,31.89585 8,31.89585 L8,22.2392885 L8,16 Z" id="Rectangle-3" fill="#000000"></path>
-                <g id="Rectangle">
-                    <use fill="#000000" fill-rule="evenodd" xlink:href="#path-1"></use>
-                    <use stroke="#F2F4F7" mask="url(#mask-2)" stroke-width="10" xlink:href="#path-1"></use>
-                </g>
-                <path d="M6.1310053,41.2112479 C5.27479784,42.0096083 10.4373919,43.6053602 11.2296387,43.6053602 C13.2555121,37.7460829 11.8321108,35.5517452 11.8321108,29.1181019 L11.8321108,21.2930015 C11.8321108,21.2930015 16.5515035,18.1566713 21.2216931,16.0206053 C25.8918828,13.8845392 31.215528,12.2538646 31.3550046,12.2096604 C32.1176432,11.9679575 31.2752162,9.09848389 30.5125776,9.34018676 C30.3644648,9.38712813 27.3667572,9.04545881 26.6057472,9.30621378 C24.4302064,10.0516482 11.7945726,16.3687146 9.43776817,19.1164347 C7.08096377,21.8641549 8.67910884,38.8352994 6.1310053,41.2112479 Z" id="Path-3" fill="#F2F4F7"></path>
-                <g id="Oval-3">
-                    <use fill="#000000" fill-rule="evenodd" xlink:href="#path-3"></use>
-                    <use stroke="#F2F4F7" mask="url(#mask-4)" stroke-width="6" xlink:href="#path-3"></use>
-                </g>
-                <path d="M1.13550659,38.2112479 C0.245905063,39.0096083 7.57084983,40.6053602 8.39399608,40.6053602 C9.78724127,36.7270479 9.71041095,34.4853149 9.49920479,31.5470605 C9.43416647,30.6422615 9.35638589,29.6714145 9.30486594,28.5663921 C9.27092907,27.8384991 9.24838677,27.052387 9.24838677,26.1885838 C9.24838677,21.7929074 8.92187195,20.3988432 10.0589683,18.8611032 C10.5891389,18.1441327 14.9624282,15.1566713 19.814766,13.0206053 C24.6671038,10.8845392 30.1983835,9.25386462 30.3432999,9.20966036 C31.1356832,8.96795749 30.2603996,6.09848389 29.4680164,6.34018676 C29.3141268,6.38712813 27.238504,7.04545881 26.4478128,7.30621378 C24.187421,8.05164822 9.84272127,11.7529088 7.39399608,14.500629 C4.94527088,17.2483492 3.78299204,35.8352994 1.13550659,38.2112479 Z" id="Path-3" fill="#000000"></path>
-            </g>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/definition-icon.png b/resources/src/mediawiki.special/images/special.search/definition-icon.png
deleted file mode 100644 (file)
index b279f4e..0000000
Binary files a/resources/src/mediawiki.special/images/special.search/definition-icon.png and /dev/null differ
diff --git a/resources/src/mediawiki.special/images/special.search/definition-icon.svg b/resources/src/mediawiki.special/images/special.search/definition-icon.svg
deleted file mode 100644 (file)
index 1d58906..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
-    <title>wiktionary-icon</title>
-    <desc>Created with Sketch.</desc>
-    <defs>
-        <rect id="path-1" x="0" y="0" width="38.7837838" height="45.5813953" rx="3"></rect>
-        <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="38.7837838" height="45.5813953" fill="white">
-            <use xlink:href="#path-1"></use>
-        </mask>
-    </defs>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="wiktionary">
-            <g id="Group" transform="translate(9.000000, 4.000000)">
-                <rect id="Rectangle-5" fill="#000000" x="2.21621622" y="4.55813953" width="38.7837838" height="44.4418605" rx="3"></rect>
-                <use id="Rectangle-5" stroke="#FFFFFF" mask="url(#mask-2)" stroke-width="4" fill="#000000" xlink:href="#path-1"></use>
-                <rect id="Rectangle-5" fill="#000000" x="2.21621622" y="2.27906977" width="3.32432432" height="45.5813953" rx="1.66216216"></rect>
-                <path d="M9.96584688,24.0254991 L12.5526201,16.7046287 L12.5953767,16.7046287 L15.1393934,24.0254991 L9.96584688,24.0254991 Z M11.4837056,14.8139535 L5.54054054,30.5109549 L7.61423481,30.5109549 L9.32449813,25.7842668 L15.7807422,25.7842668 L17.4482489,30.5109549 L19.6929695,30.5109549 L13.7284262,14.8139535 L11.4837056,14.8139535 Z M19.9922656,28.7521872 L19.9922656,30.5109549 L32.1351351,30.5109549 L32.1351351,28.7521872 L22.4080125,28.7521872 L31.8785956,16.5727212 L31.8785956,14.8139535 L20.7191275,14.8139535 L20.7191275,16.5727212 L29.484227,16.5727212 L19.9922656,28.7521872 Z" id="AZ" fill="#FFFFFF"></path>
-            </g>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/dna-icon.png b/resources/src/mediawiki.special/images/special.search/dna-icon.png
deleted file mode 100644 (file)
index 76ae7b9..0000000
Binary files a/resources/src/mediawiki.special/images/special.search/dna-icon.png and /dev/null differ
diff --git a/resources/src/mediawiki.special/images/special.search/dna-icon.svg b/resources/src/mediawiki.special/images/special.search/dna-icon.svg
deleted file mode 100644 (file)
index b6472d2..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
-    <title>wikispecies-icon</title>
-    <desc>Created with Sketch.</desc>
-    <defs>
-        <path d="M30.7731558,0.186194824 C30.7731558,0.186194824 35.1530541,17.902764 16.3205992,24.2966289 C-2.5118558,30.6904937 1.3758711,49.1033824 1.3758711,49.1033824" id="path-1"></path>
-        <path d="M30.7473572,49.159218 C30.7473572,49.159218 35.6539441,38.982551 16.3205992,25.0539186 C-3.01274582,11.1252862 1.37060607,0.169606006 1.37060607,0.169606006" id="path-2"></path>
-    </defs>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="wikispecies">
-            <g id="Group-3" transform="translate(29.651065, 29.732290) rotate(-18.000000) translate(-29.651065, -29.732290) translate(3.651065, -0.267710)">
-                <g id="Group-2" transform="translate(-0.000000, 0.000000)">
-                    <path d="M16.0550183,26.1396841 L28.2093366,18.8733993" id="Line"></path>
-                    <path d="M8.04887438,16.7717325 L25.4345247,6.48465118" id="Line" stroke="#000000" stroke-width="4" stroke-linecap="square"></path>
-                    <path d="M25.407947,53.9559038 L42.7935973,43.6688225" id="Line" stroke="#000000" stroke-width="4" stroke-linecap="square"></path>
-                    <path d="M15.372315,23.3571115 L32.7579654,13.0700302" id="Line" stroke="#000000" stroke-width="4" stroke-linecap="square"></path>
-                    <path d="M23.3476093,40.6564377 L35.5019275,33.3901529" id="Line"></path>
-                    <path d="M23.587979,44.4357028 L40.6040246,34.7578672" id="Line" stroke="#000000" stroke-width="4" stroke-linecap="square"></path>
-                    <g id="Group" transform="translate(26.088934, 30.408062) rotate(-27.000000) translate(-26.088934, -30.408062) translate(10.088934, 5.408062)">
-                        <g id="Path-2">
-                            <use stroke="#FFFFFF" stroke-width="10" xlink:href="#path-1"></use>
-                            <use stroke="#000000" stroke-width="5" xlink:href="#path-1"></use>
-                        </g>
-                        <g id="Path-2">
-                            <use stroke="#FFFFFF" stroke-width="10" xlink:href="#path-2"></use>
-                            <use stroke="#000000" stroke-width="5" xlink:href="#path-2"></use>
-                        </g>
-                    </g>
-                </g>
-            </g>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/image-icon.png b/resources/src/mediawiki.special/images/special.search/image-icon.png
deleted file mode 100644 (file)
index 1ebbc74..0000000
Binary files a/resources/src/mediawiki.special/images/special.search/image-icon.png and /dev/null differ
diff --git a/resources/src/mediawiki.special/images/special.search/image-icon.svg b/resources/src/mediawiki.special/images/special.search/image-icon.svg
deleted file mode 100644 (file)
index b68762e..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
-    <title>commons-icon</title>
-    <desc>Created with Sketch.</desc>
-    <defs></defs>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="commons">
-            <g id="Group" transform="translate(7.000000, 10.000000)">
-                <rect id="Rectangle-3" fill="#000000" x="0" y="7" width="47" height="32" rx="3"></rect>
-                <path d="M12.5575779,0.983966166 C12.6781522,0.440536658 13.228439,0 13.7774775,0 L33.4411152,0 C33.9942728,0 34.5376987,0.428179934 34.6610148,0.983966166 L36.1940854,7.89352671 C36.3146597,8.43695622 35.9679607,8.87749288 35.4086105,8.87749288 L11.8099821,8.87749288 C11.255602,8.87749288 10.9011913,8.44931294 11.0245073,7.89352671 L12.5575779,0.983966166 Z" id="Rectangle-3" fill="#000000"></path>
-                <ellipse id="Oval" stroke="#FFFFFF" stroke-width="3" cx="23.1981132" cy="23.2091168" rx="10.1981132" ry="10.2091168"></ellipse>
-            </g>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/news-icon.png b/resources/src/mediawiki.special/images/special.search/news-icon.png
deleted file mode 100644 (file)
index 6b79590..0000000
Binary files a/resources/src/mediawiki.special/images/special.search/news-icon.png and /dev/null differ
diff --git a/resources/src/mediawiki.special/images/special.search/news-icon.svg b/resources/src/mediawiki.special/images/special.search/news-icon.svg
deleted file mode 100644 (file)
index 996bc84..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
-    <title>wikinews-icon</title>
-    <desc>Created with Sketch.</desc>
-    <defs>
-        <rect id="path-1" x="0" y="0" width="40.3125" height="44.3773585" rx="3"></rect>
-        <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="40.3125" height="44.3773585" fill="white">
-            <use xlink:href="#path-1"></use>
-        </mask>
-    </defs>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="wikinews">
-            <g id="Group-2" transform="translate(7.000000, 2.000000)">
-                <g id="Group">
-                    <use id="Rectangle" stroke="#000000" mask="url(#mask-2)" stroke-width="8" xlink:href="#path-1"></use>
-                    <rect id="Rectangle-2" fill="#000000" x="5.87890625" y="7.10037736" width="14.2773438" height="15.0883019" rx="1"></rect>
-                    <path d="M23.9355469,8.32075472 L33.2060822,8.32075472" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
-                    <path d="M23.9355469,13.8679245 L33.2060822,13.8679245" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
-                    <path d="M23.9355469,19.4150943 L33.2060822,19.4150943" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
-                    <path d="M22.5550667,30.509434 L33.1506715,30.509434" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
-                    <path d="M7.17212403,30.509434 L17.1811761,30.509434" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
-                    <path d="M7.17212403,35.1320755 L17.1811761,35.1320755" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
-                    <path d="M22.5550667,35.1320755 L33.1506715,35.1320755" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
-                    <path d="M7.12514628,24.9622642 L33.2060822,24.9622642" id="Line" stroke="#000000" stroke-width="2" stroke-linecap="square"></path>
-                </g>
-                <path d="M42.1813257,4.62264151 C43.7380365,4.62264151 45,5.85586295 45,7.39864403 L45,46.2239975 C45,47.7571413 43.7493218,49 42.1813257,49 L7.50617429,49 C5.94946346,49 4.6875,47.7667786 4.6875,46.2239975" id="Rectangle" stroke="#000000" stroke-width="4"></path>
-            </g>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/quotation-icon.png b/resources/src/mediawiki.special/images/special.search/quotation-icon.png
deleted file mode 100644 (file)
index 9d3ade3..0000000
Binary files a/resources/src/mediawiki.special/images/special.search/quotation-icon.png and /dev/null differ
diff --git a/resources/src/mediawiki.special/images/special.search/quotation-icon.svg b/resources/src/mediawiki.special/images/special.search/quotation-icon.svg
deleted file mode 100644 (file)
index 0a24b3e..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
-    <title>wikiquote-icon</title>
-    <desc>Created with Sketch.</desc>
-    <defs></defs>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="wikiquote" fill="#000000">
-            <path d="M25.6795093,50 L25.6795093,29.5241523 L16.904146,29.5241523 C16.904146,26.2444546 17.52462,23.4744813 18.7655867,21.2141491 C20.0065533,18.9538169 22.3111712,17.2475134 25.6795093,16.0951872 L25.6795093,7.31982385 C22.9316545,7.67438575 20.383279,8.49429786 18.0343064,9.77958478 C15.6853338,11.0648717 13.6687932,12.6825361 11.9846241,14.6326266 C10.300455,16.5827171 8.99302762,18.8430154 8.06230261,21.4135892 C7.13157761,23.984163 6.71054166,26.7319766 6.79918214,29.6571123 L6.79918214,50 L25.6795093,50 Z M54,50 L54,29.5241523 L45.2246367,29.5241523 C45.2246367,26.2444546 45.8451107,23.4744813 47.0860774,21.2141491 C48.3270441,18.9538169 50.6316619,17.2475134 54,16.0951872 L54,7.31982385 C51.2521452,7.67438575 48.7037697,8.49429786 46.3547971,9.77958478 C44.0058245,11.0648717 41.9892839,12.6825361 40.3051148,14.6326266 C38.6209458,16.5827171 37.3135183,18.8430154 36.3827933,21.4135892 C35.4520683,23.984163 35.0310324,26.7319766 35.1196729,29.6571123 L35.1196729,50 L54,50 Z" id="“"></path>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/textbook-icon.png b/resources/src/mediawiki.special/images/special.search/textbook-icon.png
deleted file mode 100644 (file)
index 0de2821..0000000
Binary files a/resources/src/mediawiki.special/images/special.search/textbook-icon.png and /dev/null differ
diff --git a/resources/src/mediawiki.special/images/special.search/textbook-icon.svg b/resources/src/mediawiki.special/images/special.search/textbook-icon.svg
deleted file mode 100644 (file)
index 52446b8..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
-    <title>wikibooks-icon</title>
-    <desc>Created with Sketch.</desc>
-    <defs></defs>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="wikibooks">
-            <g id="Group-2" transform="translate(7.000000, 6.000000)">
-                <rect id="Rectangle" fill="#000000" x="0" y="0" width="13.4872062" height="46.9333333" rx="1"></rect>
-                <rect id="Rectangle" fill="#000000" x="16.3773218" y="0" width="13.4872062" height="46.9333333" rx="1"></rect>
-                <rect id="Rectangle-2" fill="#FFFFFF" x="18.3040656" y="3.2" width="9.63371872" height="2.13333333" rx="1"></rect>
-                <rect id="Rectangle-2" fill="#FFFFFF" x="18.3040656" y="7.46666667" width="9.63371872" height="2.13333333" rx="1"></rect>
-                <rect id="Rectangle-2" fill="#FFFFFF" x="18.3040656" y="42.6666667" width="9.63371872" height="2.13333333" rx="1"></rect>
-                <g id="Group" transform="translate(41.629197, 24.582549) rotate(-15.000000) translate(-41.629197, -24.582549) translate(36.629197, 2.082549)">
-                    <rect id="Rectangle" fill="#000000" x="-9.14823772e-14" y="1.0658141e-14" width="9.63371872" height="44.8" rx="1"></rect>
-                    <rect id="Rectangle-2" fill="#FFFFFF" x="1.37624553" y="3.05454545" width="6.88122765" height="2.03636364" rx="1"></rect>
-                    <rect id="Rectangle-2" fill="#FFFFFF" x="4.12873659" y="18.3272727" width="2.0643683" height="8.14545455" rx="1"></rect>
-                    <rect id="Rectangle-2" fill="#FFFFFF" x="1.37624553" y="40.7272727" width="6.88122765" height="2.03636364" rx="1"></rect>
-                </g>
-                <rect id="Rectangle-2" fill="#FFFFFF" x="1.92674374" y="42.6666667" width="9.63371872" height="2.13333333" rx="1"></rect>
-                <rect id="Rectangle-2" fill="#FFFFFF" x="3.85348749" y="21.3333333" width="5.78023123" height="6.4" rx="1"></rect>
-                <rect id="Rectangle-2" fill="#FFFFFF" x="20.2308093" y="21.3333333" width="5.78023123" height="6.4" rx="1"></rect>
-                <rect id="Rectangle-2" fill="#FFFFFF" x="1.92674374" y="2.13333333" width="9.63371872" height="6.4" rx="1"></rect>
-            </g>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/resources/src/mediawiki.special/images/special.search/travel-icon.png b/resources/src/mediawiki.special/images/special.search/travel-icon.png
deleted file mode 100644 (file)
index 9540e5b..0000000
Binary files a/resources/src/mediawiki.special/images/special.search/travel-icon.png and /dev/null differ
diff --git a/resources/src/mediawiki.special/images/special.search/travel-icon.svg b/resources/src/mediawiki.special/images/special.search/travel-icon.svg
deleted file mode 100644 (file)
index c61da34..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="60px" height="60px" viewBox="0 0 60 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 41.2 (35397) - http://www.bohemiancoding.com/sketch -->
-    <title>wikivoyage-icon</title>
-    <desc>Created with Sketch.</desc>
-    <defs></defs>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="wikivoyage">
-            <circle id="Oval" stroke="#000000" stroke-width="5" cx="30.5" cy="29.5" r="22.5"></circle>
-            <polygon id="Line" fill="#000000" points="7.94117647 26 51.7647059 26 51.7647059 21 7.94117647 21"></polygon>
-            <polygon id="Line" fill="#000000" points="11 41 51.7647059 41 51.7647059 36 11 36"></polygon>
-            <path d="M33.3291453,53.239081 C33.3291453,53.239081 36.1487341,50.645866 37.4655139,48.564933 C41.2810931,42.5350981 43.5882353,36.2426616 43.5882353,29.9411765 C43.5882353,23.6228427 41.2687791,17.4752409 37.4345128,11.7108181 C36.1106408,9.72051335 34.6944337,8.91628537 33.2755423,7.32564334 C32.4145319,6.36041143 26.8207622,5.36041143 25.9597518,6.32564334 C24.5408604,7.91628537 23.1246533,9.72051335 21.8007813,11.7108181 C17.9665151,17.4752409 15.6470588,23.6228427 15.6470588,29.9411765 C15.6470588,36.2426616 17.954201,42.5350981 21.7697802,48.564933 C23.08656,50.645866 26.9061488,53.239081 26.9061488,53.239081 L33.3291453,53.239081 Z M25.9949257,45.8913313 C22.6413872,40.5916685 20.6470588,35.1523918 20.6470588,29.9411765 C20.6470588,24.7468098 22.6290732,19.4935807 25.9639246,14.4799765 C27.1264205,12.7322841 28.3724952,11.1396672 29.6176471,9.73642318 C30.8627989,11.1396672 32.1088737,12.7322841 33.2713695,14.4799765 C36.6062209,19.4935807 38.5882353,24.7468098 38.5882353,29.9411765 C38.5882353,35.1523918 36.5939069,40.5916685 33.2403685,45.8913313 C32.0874519,47.7133081 30.8528466,49.389908 29.6176471,50.8822433 C28.3824475,49.389908 27.1478422,47.7133081 25.9949257,45.8913313 Z" id="Oval" fill="#000000"></path>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
index 7f54b90..c3205bd 100644 (file)
@@ -93,3 +93,8 @@
        -o-tab-size: 4;
        tab-size: 4;
 }
+
+.mw-apisandbox-widget-field .oo-ui-textInputWidget {
+       /* Leave at least enough space for icon, indicator, and a sliver of text */
+       min-width: 6em;
+}
index c989c83..da8bdcd 100644 (file)
                                        } else if ( Util.apiBool( pi.multi ) ) {
                                                widget = new OO.ui.CapsuleMultiselectWidget( {
                                                        allowArbitrary: true,
-                                                       allowDuplicates: Util.apiBool( pi.allowsduplicates )
+                                                       allowDuplicates: Util.apiBool( pi.allowsduplicates ),
+                                                       $overlay: $( '#mw-apisandbox-ui' )
                                                } );
                                                widget.paramInfo = pi;
                                                $.extend( widget, WidgetMethods.capsuleWidget );
                                                }
 
                                                widget = new OO.ui.CapsuleMultiselectWidget( {
-                                                       menu: { items: items }
+                                                       menu: { items: items },
+                                                       $overlay: $( '#mw-apisandbox-ui' )
                                                } );
                                                widget.paramInfo = pi;
                                                $.extend( widget, WidgetMethods.capsuleWidget );
                                        } else {
                                                widget = new OO.ui.DropdownWidget( {
-                                                       menu: { items: items }
+                                                       menu: { items: items },
+                                                       $overlay: $( '#mw-apisandbox-ui' )
                                                } );
                                                widget.paramInfo = pi;
                                                $.extend( widget, WidgetMethods.dropdownWidget );
                                        break;
 
                                default:
-                                       if ( !$.isArray( pi.type ) ) {
+                                       if ( !Array.isArray( pi.type ) ) {
                                                throw new Error( 'Unknown parameter type ' + pi.type );
                                        }
 
                                                }
 
                                                widget = new OO.ui.CapsuleMultiselectWidget( {
-                                                       menu: { items: items }
+                                                       menu: { items: items },
+                                                       $overlay: $( '#mw-apisandbox-ui' )
                                                } );
                                                widget.paramInfo = pi;
                                                $.extend( widget, WidgetMethods.capsuleWidget );
                                                }
                                        } else {
                                                widget = new OO.ui.DropdownWidget( {
-                                                       menu: { items: items }
+                                                       menu: { items: items },
+                                                       $overlay: $( '#mw-apisandbox-ui' )
                                                } );
                                                widget.paramInfo = pi;
                                                $.extend( widget, WidgetMethods.dropdownWidget );
                                widget = new OO.ui.CapsuleMultiselectWidget( {
                                        allowArbitrary: true,
                                        allowDuplicates: Util.apiBool( pi.allowsduplicates ),
+                                       $overlay: $( '#mw-apisandbox-ui' ),
                                        popup: {
                                                classes: [ 'mw-apisandbox-popup' ],
                                                $content: $content
 
                                if ( !formatDropdown ) {
                                        formatDropdown = new OO.ui.DropdownWidget( {
-                                               menu: { items: [] }
+                                               menu: { items: [] },
+                                               $overlay: $( '#mw-apisandbox-ui' )
                                        } );
                                        formatDropdown.getMenu().on( 'choose', Util.onFormatDropdownChange );
                                }
                                        }
                                } )
                                        .then( null, function ( code, data, result, jqXHR ) {
+                                               var deferred = $.Deferred();
+
                                                if ( code !== 'http' ) {
                                                        // Not really an error, work around mw.Api thinking it is.
-                                                       return $.Deferred()
-                                                               .resolve( result, jqXHR )
-                                                               .promise();
+                                                       deferred.resolve( result, jqXHR );
+                                               } else {
+                                                       // Just forward it.
+                                                       deferred.reject.apply( deferred, arguments );
                                                }
-                                               return this;
+                                               return deferred.promise();
                                        } )
-                                       .fail( function ( code, data ) {
-                                               var details = 'HTTP error: ' + data.exception;
-                                               $result.empty()
-                                                       .append(
-                                                               new OO.ui.LabelWidget( {
-                                                                       label: mw.message( 'apisandbox-results-error', details ).text(),
-                                                                       classes: [ 'error' ]
-                                                               } ).$element
-                                                       );
-                                       } )
-                                       .done( function ( data, jqXHR ) {
+                                       .then( function ( data, jqXHR ) {
                                                var m, loadTime, button, clear,
                                                        ct = jqXHR.getResponseHeader( 'Content-Type' );
 
                                                                                icon: 'info',
                                                                                popup: {
                                                                                        $content: $( '<div>' ).append( Util.parseMsg( 'apisandbox-continue-help' ) ),
-                                                                                       padded: true
+                                                                                       padded: true,
+                                                                                       width: 'auto'
                                                                                }
                                                                        } ).$element
                                                                )
                                                                .on( 'click', button.setDisabled, [ true ], button )
                                                                .$element.appendTo( $result );
                                                }
+                                       }, function ( code, data ) {
+                                               var details = 'HTTP error: ' + data.exception;
+                                               $result.empty()
+                                                       .append(
+                                                               new OO.ui.LabelWidget( {
+                                                                       label: mw.message( 'apisandbox-results-error', details ).text(),
+                                                                       classes: [ 'error' ]
+                                                               } ).$element
+                                                       );
                                        } );
                        } );
                },
 
                                if ( page.tokenWidget ) {
                                        k = page.apiModule + page.tokenWidget.paramInfo.name;
-                                       tokenWait[ k ] = page.tokenWidget.fetchToken()
+                                       tokenWait[ k ] = page.tokenWidget.fetchToken();
+                                       tokenWait[ k ]
                                                .done( success.bind( page.tokenWidget, k ) )
                                                .fail( failure.bind( page.tokenWidget, k ) );
                                }
 
                Util.fetchModuleInfo( this.apiModule )
                        .done( function ( pi ) {
-                               var prefix, i, j, dl, widget, $widgetLabel, widgetField, helpField, tmp, flag, count,
+                               var prefix, i, j, descriptionContainer, widget, widgetField, helpField, tmp, flag, count,
                                        items = [],
                                        deprecatedItems = [],
                                        buttons = [],
 
                                if ( pi.helpurls.length ) {
                                        buttons.push( new OO.ui.PopupButtonWidget( {
+                                               $overlay: $( '#mw-apisandbox-ui' ),
                                                label: mw.message( 'apisandbox-helpurls' ).text(),
                                                icon: 'help',
                                                popup: {
+                                                       width: 'auto',
+                                                       padded: true,
                                                        $content: $( '<ul>' ).append( $.map( pi.helpurls, function ( link ) {
                                                                return $( '<li>' ).append( $( '<a>', {
                                                                        href: link,
 
                                if ( pi.examples.length ) {
                                        buttons.push( new OO.ui.PopupButtonWidget( {
+                                               $overlay: $( '#mw-apisandbox-ui' ),
                                                label: mw.message( 'apisandbox-examples' ).text(),
                                                icon: 'code',
                                                popup: {
+                                                       width: 'auto',
+                                                       padded: true,
                                                        $content: $( '<ul>' ).append( $.map( pi.examples, function ( example ) {
                                                                var a = $( '<a>', {
                                                                        href: '#' + example.query,
                                                        that.tokenWidget = widget;
                                                }
 
-                                               dl = $( '<dl>' );
-                                               dl.append( $( '<dd>', {
+                                               descriptionContainer = $( '<div>' );
+                                               descriptionContainer.append( $( '<div>', {
                                                        addClass: 'description',
                                                        append: Util.parseHTML( pi.parameters[ i ].description )
                                                } ) );
                                                if ( pi.parameters[ i ].info && pi.parameters[ i ].info.length ) {
                                                        for ( j = 0; j < pi.parameters[ i ].info.length; j++ ) {
-                                                               dl.append( $( '<dd>', {
+                                                               descriptionContainer.append( $( '<div>', {
                                                                        addClass: 'info',
                                                                        append: Util.parseHTML( pi.parameters[ i ].info[ j ] )
                                                                } ) );
 
                                                        case 'limit':
                                                                if ( pi.parameters[ i ].highmax !== undefined ) {
-                                                                       dl.append( $( '<dd>', {
+                                                                       descriptionContainer.append( $( '<div>', {
                                                                                addClass: 'info',
                                                                                append: [
                                                                                        Util.parseMsg(
                                                                                ]
                                                                        } ) );
                                                                } else {
-                                                                       dl.append( $( '<dd>', {
+                                                                       descriptionContainer.append( $( '<div>', {
                                                                                addClass: 'info',
                                                                                append: [
                                                                                        Util.parseMsg( 'api-help-param-limit', pi.parameters[ i ].max ),
                                                                        tmp += 'max';
                                                                }
                                                                if ( tmp !== '' ) {
-                                                                       dl.append( $( '<dd>', {
+                                                                       descriptionContainer.append( $( '<div>', {
                                                                                addClass: 'info',
                                                                                append: Util.parseMsg(
                                                                                        'api-help-param-integer-' + tmp,
                                                                break;
 
                                                        default:
-                                                               if ( $.isArray( pi.parameters[ i ].type ) ) {
+                                                               if ( Array.isArray( pi.parameters[ i ].type ) ) {
                                                                        flag = false;
                                                                        count = pi.parameters[ i ].type.length;
                                                                }
                                                                );
                                                        }
                                                        if ( tmp.length ) {
-                                                               dl.append( $( '<dd>', {
+                                                               descriptionContainer.append( $( '<div>', {
                                                                        addClass: 'info',
                                                                        append: Util.parseHTML( tmp.join( ' ' ) )
                                                                } ) );
                                                        } ), {
                                                                align: 'inline',
                                                                classes: [ 'mw-apisandbox-help-field' ],
-                                                               label: dl
+                                                               label: descriptionContainer
                                                        }
                                                );
 
-                                               $widgetLabel = $( '<span>' );
                                                widgetField = new OO.ui.FieldLayout(
                                                        widget,
                                                        {
                                                                align: 'left',
                                                                classes: [ 'mw-apisandbox-widget-field' ],
-                                                               label: prefix + pi.parameters[ i ].name,
-                                                               $label: $widgetLabel
+                                                               label: prefix + pi.parameters[ i ].name
                                                        }
                                                );
 
-                                               // FieldLayout only does click for InputElement
-                                               // widgets. So supply our own click handler.
-                                               $widgetLabel.on( 'click', widgetLabelOnClick.bind( widgetField ) );
+                                               // We need our own click handler on the widget label to
+                                               // turn off the disablement.
+                                               widgetField.$label.on( 'click', widgetLabelOnClick.bind( widgetField ) );
 
                                                // Don't grey out the label when the field is disabled,
                                                // it makes it too hard to read and our "disabled"
diff --git a/resources/src/mediawiki.special/mediawiki.special.block.css b/resources/src/mediawiki.special/mediawiki.special.block.css
deleted file mode 100644 (file)
index a30a15d..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*!
- * Styling for Special:Block
- */
-
-label[for="mw-input-wpConfirm"] {
-       font-weight: bold;
-}
-
-tr.mw-block-hideuser {
-       font-weight: bold;
-}
diff --git a/resources/src/mediawiki.special/mediawiki.special.changecredentials.js b/resources/src/mediawiki.special/mediawiki.special.changecredentials.js
new file mode 100644 (file)
index 0000000..9592879
--- /dev/null
@@ -0,0 +1,55 @@
+/*!
+ * JavaScript for change credentials form.
+ */
+( function ( mw, $, OO ) {
+       mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
+               var api = new mw.Api();
+
+               $root.find( '.mw-changecredentials-validate-password.oo-ui-fieldLayout' ).each( function () {
+                       var currentApiPromise,
+                               self = OO.ui.FieldLayout.static.infuse( $( this ) );
+
+                       self.getField().setValidation( function ( password ) {
+                               var d;
+
+                               if ( currentApiPromise ) {
+                                       currentApiPromise.abort();
+                                       currentApiPromise = undefined;
+                               }
+
+                               password = $.trim( password );
+
+                               if ( password === '' ) {
+                                       self.setErrors( [] );
+                                       return true;
+                               }
+
+                               d = $.Deferred();
+                               currentApiPromise = api.post( {
+                                       action: 'validatepassword',
+                                       password: password,
+                                       formatversion: 2,
+                                       errorformat: 'html',
+                                       errorsuselocal: true,
+                                       uselang: mw.config.get( 'wgUserLanguage' )
+                               } ).done( function ( resp ) {
+                                       var pwinfo = resp.validatepassword,
+                                               good = pwinfo.validity === 'Good',
+                                               errors = [];
+
+                                       currentApiPromise = undefined;
+
+                                       if ( !good ) {
+                                               pwinfo.validitymessages.map( function ( m ) {
+                                                       errors.push( new OO.ui.HtmlSnippet( m.html ) );
+                                               } );
+                                       }
+                                       self.setErrors( errors );
+                                       d.resolve( good );
+                               } ).fail( d.reject );
+
+                               return d.promise( { abort: currentApiPromise.abort } );
+                       } );
+               } );
+       } );
+}( mediaWiki, jQuery, OO ) );
index 3ad8005..36dfee6 100644 (file)
@@ -35,6 +35,14 @@ p.mw-ipb-conveniencelinks {
        text-align: right;
 }
 
+label[for='mw-input-wpConfirm'] {
+       font-weight: bold;
+}
+
+tr.mw-block-hideuser {
+       font-weight: bold;
+}
+
 /* Special:BlockList */
 table.mw-blocklist span.mw-usertoollinks,
 span.mw-blocklist-actions {
@@ -116,3 +124,7 @@ table.mw-userrights-groups * td,
 table.mw-userrights-groups * th {
        padding-right: 1.5em;
 }
+
+table.mw-userrights-groups * th {
+       text-align: left;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.newFiles.js b/resources/src/mediawiki.special/mediawiki.special.newFiles.js
new file mode 100644 (file)
index 0000000..5e86eaa
--- /dev/null
@@ -0,0 +1,21 @@
+/*!
+ * JavaScript for Special:NewFiles
+ */
+( function ( mw, $ ) {
+       $( function () {
+               var start = mw.widgets.datetime.DateTimeInputWidget.static.infuse( 'mw-input-start' ),
+                       end = mw.widgets.datetime.DateTimeInputWidget.static.infuse( 'mw-input-end' ),
+                       temp;
+
+               // If the start date comes after the end date, swap the two values.
+               // This swap is already done internally when the form is submitted with a start date that
+               // comes after the end date, but this swap makes the change visible in the HTMLForm.
+               if ( start.getValue() !== '' &&
+                       end.getValue() !== '' &&
+                       start.getValue() > end.getValue() ) {
+                       temp = start.getValue();
+                       start.setValue( end.getValue() );
+                       end.setValue( temp );
+               }
+       } );
+}( mediaWiki, jQuery ) );
index 163e85d..84a9a96 100644 (file)
@@ -3,7 +3,7 @@
  */
 ( function ( mw, $ ) {
        $( function () {
-               var $preftoc, $preferences, $fieldsets, labelFunc,
+               var $preftoc, $preferences, $fieldsets, labelFunc, previousTab,
                        $tzSelect, $tzTextbox, $localtimeHolder, servertime, allowCloseWindow,
                        convertmessagebox = require( 'mediawiki.notification.convertmessagebox' );
 
                        var hash = location.hash,
                                matchedElement, parentSection;
                        if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
+                               mw.storage.session.remove( 'mwpreferences-prevTab' );
                                switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
                        } else if ( hash.match( /^#mw-[\w\-]+/ ) ) {
                                matchedElement = document.getElementById( hash.slice( 1 ) );
                                parentSection = $( matchedElement ).closest( '.prefsection' );
                                if ( parentSection.length ) {
+                                       mw.storage.session.remove( 'mwpreferences-prevTab' );
                                        // Switch to proper tab and scroll to selected item.
                                        switchPrefTab( parentSection.attr( 'id' ).replace( 'mw-prefsection-', '' ), 'noHash' );
                                        matchedElement.scrollIntoView();
                        updateTimezoneSelection();
                }
 
-               // Preserve the tab after saving the preferences
-               // Not using cookies, because their deletion results are inconsistent.
-               // Not using jStorage due to its enormous size (for this feature)
-               if ( window.sessionStorage ) {
-                       if ( sessionStorage.getItem( 'mediawikiPreferencesTab' ) !== null ) {
-                               switchPrefTab( sessionStorage.getItem( 'mediawikiPreferencesTab' ), 'noHash' );
-                       }
+               // Restore the active tab after saving the preferences
+               previousTab = mw.storage.session.get( 'mwpreferences-prevTab' );
+               if ( previousTab ) {
+                       switchPrefTab( previousTab, 'noHash' );
                        // Deleting the key, the tab states should be reset until we press Save
-                       sessionStorage.removeItem( 'mediawikiPreferencesTab' );
-
-                       $( '#mw-prefs-form' ).submit( function () {
-                               var storageData = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
-                               sessionStorage.setItem( 'mediawikiPreferencesTab', storageData );
-                       } );
+                       mw.storage.session.remove( 'mwpreferences-prevTab' );
                }
 
+               $( '#mw-prefs-form' ).on( 'submit', function () {
+                       var value = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
+                       mw.storage.session.set( 'mwpreferences-prevTab', value );
+               } );
+
                // Check if all of the form values are unchanged
                function isPrefsChanged() {
                        var inputs = $( '#mw-prefs-form :input[name]' ),
index 3810ac1..9518283 100644 (file)
@@ -3,14 +3,14 @@
        var api = new mw.Api(),
                pageUrl = new mw.Uri(),
                imagesText = new mw.Message( mw.messages, 'searchprofile-images' ),
-               moreResultsText = new mw.Message( mw.messages, 'search-interwiki-more' );
+               moreResultsText = new mw.Message( mw.messages, 'search-interwiki-more-results' );
 
        function itemTemplate( results ) {
 
                var resultOutput = '', i, result, imageCaption, imageThumbnailSrc;
 
                for ( i = 0; i < results.length; i++ ) {
-                       result = results[ i ],
+                       result = results[ i ];
                        imageCaption = mw.html.element( 'span', { 'class': 'iw-result__mini-gallery__caption' }, result.title );
                        imageThumbnailSrc = ( result.thumbnail ) ? result.thumbnail.source : '';
                        resultOutput += '<div class="iw-result__mini-gallery">' +
@@ -28,9 +28,8 @@
 
        function itemWrapperTemplate( pageQuery, itemTemplateOutput ) {
 
-               return '<li class="iw-resultset iw-resultset--image" data-iw-resultsset-pos="0">' +
+               return '<li class="iw-resultset iw-resultset--image" data-iw-resultset-pos="0">' +
                                '<div class="iw-result__header">' +
-                                       '<span class="iw-result__icon iw-result__icon--image"></span>' +
                                        '<strong>' + imagesText.escaped() + '</strong>' +
                                '</div>' +
                                '<div class="iw-result__content">' +
                        return;
                }
 
-               results.sort( function( a, b ) {
-                       return b.index - a.index;
+               results.sort( function ( a, b ) {
+                       return a.index - b.index;
                } );
 
                multimediaWidgetTemplate = itemWrapperTemplate( pageUrl.query.search, itemTemplate( results ) );
                /* we really only need to wait for document ready for DOM manipulation */
                $( function () {
-                       $( '.iw-results' ).prepend( multimediaWidgetTemplate );
+                       $( '.iw-results' ).append( multimediaWidgetTemplate );
                } );
        } );
 
index 8d63902..92e3e1c 100644 (file)
 /* interwiki search results */
 /*==========================*/
 
-#mw-interwiki-results {
-       float: right;
-       width: 30%;
-}
-
-.iw-headline {
-       font-weight: bold;
-       font-size: 1rem;
-       font-size: 16px;
-       opacity: 0.7;
-}
-
-.iw-results {
-       list-style: none;
-       margin: 0;
-}
-
-.iw-resultset {
-       margin-bottom: 1.2em;
-       background-color: #f2f4f7;
-       vertical-align: top;
-       width: 100%;
-       float: left;
-       list-style-type: none;
-}
-
-/* clearfix */
-.iw-result:after {
-       visibility: hidden;
-       display: block;
-       font-size: 0;
-       content: " ";
-       clear: both;
-       height: 0;
-}
-
-* html .interwiki-result { /* IE6 */
-       zoom: 1;
-}
-*:first-child + html .iw-resultset { /* IE7 */
-       zoom: 1;
-}
-
-/* padding each .iw-resultset section seperately.
-This allows us greater flexibility in the design.
-For example changing the background color on the
-header and footer. */
-.iw-result__header,
-.iw-result__title,
-.iw-result__content,
-.iw-result__footer {
-       padding: 0.25em 0.85em;
-}
-
-/* definition titles appear inline,
-to resemble a traditional dictionary definition */
-.iw-resultset--definition .iw-result__title {
-       display: inline;
-       padding: 0;
-}
-
-.iw-resultset > div:first-child {
-       padding-top: 0.85em;
-}
-
-.iw-resultset > div:last-child {
-       padding-bottom: 0.85em;
-}
-
-.iw-result__title {
-       font-size: 16px; /* rem fallback */
-       font-size: 1rem;
-}
-
-.iw-result__title a.extiw {
-       color: #252525;
-       font-weight: bold;
-}
-
-.iw-result__content:after { /* clearfix */
-       visibility: hidden;
-       display: block;
-       font-size: 0;
-       content: " ";
-       clear: both;
-       height: 0;
-}
-
-.iw-result__footer {
-       float: right;
-}
-
-.iw-result__icon {
-       display: inline-block;
-       width: 24px;
-       height: 24px;
-       vertical-align: middle;
-       margin-right: 0.25em;
-       background: url( images/special.search/definition-icon.svg ) no-repeat 0 0;
-       background-size: 100% 100%;
-}
-
-@interwikiContentTypes: definition, travel, quotation, book, course, news, textbook, image;
-
-.generate-iwIcons();
+@import 'mediawiki.ui/variables.less';
+@import 'mediawiki.mixins';
 
-.generate-iwIcons( @i:1 ) when ( @i =< length( @interwikiContentTypes ) ) {
-       @iwIcon: extract( @interwikiContentTypes, @i );
+.mw-searchresults-has-iw {
 
-       .iw-result__icon--@{iwIcon} {
-               /*  stylelint-disable-next-line function-url-quotes */
-               background-image: url( 'images/special.search/@{iwIcon}-icon.png' );
-               /*  stylelint-disable-next-line function-url-quotes */
-               background-image: url( 'images/special.search/@{iwIcon}-icon.svg' );
+       .iw-headline {
+               font-weight: bold;
        }
 
-       .generate-iwIcons( @i + 1 );
-}
-
-/* image search result */
-.iw-result__mini-gallery {
-       position: relative;
-       float: left;
-       width: 60%;
-       height: 200px;
-       box-sizing: border-box;
-       padding: 0.25rem;
-}
-
-/* second and third images are small */
-.iw-result__mini-gallery:nth-child( 2 ),
-.iw-result__mini-gallery:nth-child( 3 ) { /* stylelint-disable-line indentation */
-       width: 40%;
-       height: 100px;
-}
+       .iw-results {
+               list-style: none;
+               margin: 0;
+       }
 
-.iw-result__mini-gallery__image {
-       display: block;
-       position: relative;
-       width: 100%;
-       height: 100%;
-       background-size: cover;
-       background-repeat: no-repeat;
-       background-position: center center;
-}
+       .iw-resultset {
+               .box-sizing(border-box);
+               padding: 0.5em;
+               vertical-align: top;
+               width: 100%;
+               float: left;
+               background-color: @colorGray15;
+               margin-bottom: 1em;
+               word-break: break-word;
+       }
 
-.iw-result__mini-gallery__image > .iw-result__mini-gallery__caption { /* image gallery text */
-       visibility: hidden;
-       position: absolute;
-       bottom: 0;
-       left: 0;
-       text-align: center;
-       color: #fff;
-       text-shadow: 0 0 10px rgba( 0, 0, 0, 0.4 ); /* improves legibility on white background*/
-       font-size: 0.8em;
-       padding: 5px;
-       background-color: rgba( 0, 0, 0, 0.5 );
-}
+       .iw-result__title {
+               font-size: 108%; /* matching regular search title */
+       }
 
-.iw-result__mini-gallery__image:hover > .iw-result__mini-gallery__caption {
-       visibility: visible;
-}
+       .iw-result:after,
+       .iw-result__content:after { /* clearfix */
+               visibility: hidden;
+               display: block;
+               font-size: 0;
+               content: ' ';
+               clear: both;
+               height: 0;
+       }
 
-/* different types of interwiki result boxes */
-/* quotation box */
-.iw-resultset--quotation .iw-result__content {
-       border-left: 4px solid #afb1b5;
-       margin-left: 1em;
-       padding-top: 0;
-       margin-top: 0.25em;
-}
-.iw-resultset--quotation .iw-result__title {
-       margin-left: 1em;
-}
-.iw-result--quotation .iw-result__title:before {
-       content: ' — ';
-       display: inline-block;
-}
-.iw-result--quotation .iw-result__footer {
-       text-align: right;
-}
+       .iw-result__footer {
+               float: right;
+               font-size: 97%; /* matching main search result font-size */
+               margin-top: 0.5em;
+       }
+       .iw-result__footer a {
+               vertical-align: middle;
+               color: @colorGray7;
+               font-style: italic;
+       }
 
-/* no results
-span the interwiki results across the bottom of the page.
-*/
+       .oo-ui-icon-favicon {
+               padding-right: 1em;
+       }
 
-.mw-search-nonefound ~ #mw-search-interwiki {
-       width: 100%;
-}
+       /* image search result */
+       .iw-result__mini-gallery {
+               position: relative;
+               float: left;
+               width: 100%;
+               height: 200px;
+               .box-sizing(border-box);
+               padding: 0.25rem;
+       }
 
-.mw-search-nonefound ~ #mw-search-interwiki .iw-resultset {
-       width: 30%;
-       max-width: 300px;
-       margin-left: 0.5em;
-       margin-right: 0.5em;
-}
+       /* second and third images are small */
+       .iw-result__mini-gallery:nth-child( 2 ),
+       .iw-result__mini-gallery:nth-child( 3 ) { /* stylelint-disable-line indentation */
+               width: 50%;
+               height: 100px;
+       }
 
-/* mobile */
-@media only screen and ( max-width: 768px ) {
-       #mw-interwiki-results {
+       .iw-result__mini-gallery__image {
+               display: block;
+               position: relative;
                width: 100%;
+               height: 100%;
+               background-size: 100% auto;
+               background-size: cover;
+               background-repeat: no-repeat;
+               background-position: center center;
        }
-       .mw-search-results {
-               max-width: none !important;
-       }
-       .iw-resultset {
-               width: 45% !important;
-               margin-left: 0.5em !important;
-               margin-right: 0.5em !important;
+
+       /* image gallery text */
+       .iw-result__mini-gallery__image > .iw-result__mini-gallery__caption {
+               visibility: hidden;
+               position: absolute;
+               bottom: 0;
+               left: 0;
+               text-align: center;
+               color: #fff;
+               font-size: 0.8em;
+               padding: 0.5em;
+               background-color: rgba( 0, 0, 0, 0.5 );
        }
 
-}
+       .iw-result__mini-gallery__image:hover > .iw-result__mini-gallery__caption {
+               visibility: visible;
+       }
 
-@media only screen and ( max-width: 600px ) {
-       .iw-resultset {
-               width: 100% !important;
-               margin-left: 0 !important;
-               margin-right: 0 !important;
-               max-width: none !important;
+       /* tablet and up */
+
+       @media only screen and ( min-width: @deviceWidthTablet ) {
+
+               #mw-interwiki-results {
+                       width: 30%;
+                       display: inline-block; /* used to align interwiki sidebar with the top of the main search results */
+                       margin-left: 10%;
+               }
+               .mw-search-createlink,
+               .mw-search-nonefound,
+               .mw-search-results {
+                       float: left;
+                       width: 60%;
+                       clear: left;
+                       max-width: 60%;
+               }
        }
 }
index 89f5132..72ede97 100644 (file)
@@ -32,9 +32,9 @@
 
 .mw-search-results {
        margin: 0;
-       float: left;
-       max-width: 60%;
+       max-width: 38em;
 }
+
 .mw-search-visualclear {
        clear: both;
 }
index 9da6c83..4a48f46 100644 (file)
@@ -29,7 +29,7 @@
        font-size: 0.8em;
 }
 
-/* Put some space under template's header, which may contain CAPTCHA HTML.*/
+/* Put some space under template's header, which may contain CAPTCHA HTML. */
 section.mw-form-header {
        margin-bottom: 10px;
 }
index 24f54d0..10e19e7 100644 (file)
        } );
 
        // Check if the username is invalid or already taken
-       $( function () {
-               var
-                       // We need to hook to all of these events to be sure we are notified of all changes to the
-                       // value of an <input type=text> field.
-                       events = 'keyup keydown change mouseup cut paste focus blur',
-                       $input = $( '#wpName2' ),
-                       $statusContainer = $( '#mw-createacct-status-area' ),
+       mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
+               var $usernameInput = $root.find( '#wpName2' ),
+                       $passwordInput = $root.find( '#wpPassword2' ),
+                       $emailInput = $root.find( '#wpEmail' ),
+                       $realNameInput = $root.find( '#wpRealName' ),
                        api = new mw.Api(),
-                       currentRequest;
-
-               // Hide any present status messages.
-               function clearStatus() {
-                       $statusContainer.slideUp( function () {
-                               $statusContainer
-                                       .removeAttr( 'class' )
-                                       .empty();
-                       } );
-               }
+                       usernameChecker, passwordChecker;
 
-               // Returns a promise receiving a { state:, username: } object, where:
-               // * 'state' is one of 'invalid', 'taken', 'ok'
-               // * 'username' is the validated username if 'state' is 'ok', null otherwise (if it's not
-               //   possible to register such an account)
                function checkUsername( username ) {
                        // We could just use .then() if we didn't have to pass on .abort()…
                        var d, apiPromise;
                        apiPromise = api.get( {
                                action: 'query',
                                list: 'users',
-                               ususers: username // '|' in usernames is handled below
+                               ususers: username,
+                               usprop: 'cancreate',
+                               formatversion: 2,
+                               errorformat: 'html',
+                               errorsuselocal: true,
+                               uselang: mw.config.get( 'wgUserLanguage' )
                        } )
                                .done( function ( resp ) {
                                        var userinfo = resp.query.users[ 0 ];
 
-                                       if ( resp.query.users.length !== 1 ) {
-                                               // Happens if the user types '|' into the field
-                                               d.resolve( { state: 'invalid', username: null } );
-                                       } else if ( userinfo.invalid !== undefined ) {
-                                               d.resolve( { state: 'invalid', username: null } );
+                                       if ( resp.query.users.length !== 1 || userinfo.invalid ) {
+                                               d.resolve( { valid: false, messages: [ mw.message( 'noname' ).parseDom() ] } );
                                        } else if ( userinfo.userid !== undefined ) {
-                                               d.resolve( { state: 'taken', username: null } );
+                                               d.resolve( { valid: false, messages: [ mw.message( 'userexists' ).parseDom() ] } );
+                                       } else if ( !userinfo.cancreate ) {
+                                               d.resolve( {
+                                                       valid: false,
+                                                       messages: userinfo.cancreateerror ? userinfo.cancreateerror.map( function ( m ) {
+                                                               return m.html;
+                                                       } ) : []
+                                               } );
                                        } else {
-                                               d.resolve( { state: 'ok', username: username } );
+                                               d.resolve( { valid: true, messages: [] } );
                                        }
                                } )
                                .fail( d.reject );
                        return d.promise( { abort: apiPromise.abort } );
                }
 
-               function updateUsernameStatus() {
-                       var
-                               username = $.trim( $input.val() ),
-                               currentRequestInternal;
-
-                       // Abort any pending requests.
-                       if ( currentRequest ) {
-                               currentRequest.abort();
-                       }
+               function checkPassword() {
+                       // We could just use .then() if we didn't have to pass on .abort()…
+                       var apiPromise,
+                               d = $.Deferred();
 
-                       if ( username === '' ) {
-                               clearStatus();
-                               return;
+                       if ( $.trim( $usernameInput.val() ) === '' ) {
+                               d.resolve( { valid: true, messages: [] } );
+                               return d.promise();
                        }
 
-                       currentRequest = currentRequestInternal = checkUsername( username ).done( function ( info ) {
-                               var message;
-
-                               // Another request was fired in the meantime, the result we got here is no longer current.
-                               // This shouldn't happen as we abort pending requests, but you never know.
-                               if ( currentRequest !== currentRequestInternal ) {
-                                       return;
-                               }
-                               // If we're here, then the current request has finished, avoid calling .abort() needlessly.
-                               currentRequest = undefined;
-
-                               if ( info.state === 'ok' ) {
-                                       clearStatus();
-                               } else {
-                                       if ( info.state === 'invalid' ) {
-                                               message = mw.message( 'noname' ).text();
-                                       } else if ( info.state === 'taken' ) {
-                                               message = mw.message( 'userexists' ).text();
-                                       }
+                       apiPromise = api.post( {
+                               action: 'validatepassword',
+                               user: $usernameInput.val(),
+                               password: $passwordInput.val(),
+                               email: $emailInput.val() || '',
+                               realname: $realNameInput.val() || '',
+                               formatversion: 2,
+                               errorformat: 'html',
+                               errorsuselocal: true,
+                               uselang: mw.config.get( 'wgUserLanguage' )
+                       } )
+                               .done( function ( resp ) {
+                                       var pwinfo = resp.validatepassword || {};
+
+                                       d.resolve( {
+                                               valid: pwinfo.validity === 'Good',
+                                               messages: pwinfo.validitymessages ? pwinfo.validitymessages.map( function ( m ) {
+                                                       return m.html;
+                                               } ) : []
+                                       } );
+                               } )
+                               .fail( d.reject );
 
-                                       $statusContainer
-                                               .attr( 'class', 'errorbox' )
-                                               .empty()
-                                               .append(
-                                                       // Ugh…
-                                                       // TODO Change the HTML structure in includes/templates/Usercreate.php
-                                                       $( '<strong>' ).text( mw.message( 'createacct-error' ).text() ),
-                                                       $( '<br>' ),
-                                                       document.createTextNode( message )
-                                               )
-                                               .slideDown();
-                               }
-                       } ).fail( function () {
-                               clearStatus();
-                       } );
+                       return d.promise( { abort: apiPromise.abort } );
                }
 
-               $input.on( events, $.debounce( 1000, updateUsernameStatus ) );
+               usernameChecker = new mw.htmlform.Checker( $usernameInput, checkUsername );
+               usernameChecker.attach();
+
+               passwordChecker = new mw.htmlform.Checker( $passwordInput, checkPassword );
+               passwordChecker.attach( $usernameInput.add( $emailInput ).add( $realNameInput ) );
        } );
 }( mediaWiki, jQuery ) );
index e9fc024..9ee499c 100644 (file)
                 *  button object in a list of variadic arguments.
                 */
                addButtons: function ( buttons ) {
-                       if ( !$.isArray( buttons ) ) {
+                       if ( !Array.isArray( buttons ) ) {
                                buttons = slice.call( arguments );
                        }
                        if ( isReady ) {
        mw.log.deprecate( window, 'insertTags', toolbar.insertTags, 'Use mw.toolbar.insertTags instead.' );
 
        // For backwards compatibility. Used to be called from EditPage.php, maybe other places as well.
-       mw.log.deprecate( toolbar, 'init', $.noop );
+       toolbar.init = $.noop;
 
        // Expose API publicly
-       mw.toolbar = toolbar;
+       // @deprecated since MW 1.29
+       mw.log.deprecate( mw, 'toolbar', toolbar );
 
        $( function () {
                var i, button;
 
                for ( i = 0; i < queue.length; i++ ) {
                        button = queue[ i ];
-                       if ( $.isArray( button ) ) {
+                       if ( Array.isArray( button ) ) {
                                // Forwarded arguments array from mw.toolbar.addButton
                                insertButton.apply( toolbar, button );
                        } else {
index d65b284..93ea294 100644 (file)
@@ -1,42 +1,42 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 #mw-editbutton-bold {
-       .background-image("images/@{button-bold}");
+       .background-image('images/@{button-bold}');
 }
 
 #mw-editbutton-italic {
-       .background-image("images/@{button-italic}");
+       .background-image('images/@{button-italic}');
 }
 
 #mw-editbutton-link {
-       .background-image("images/@{button-link}");
+       .background-image('images/@{button-link}');
 }
 
 #mw-editbutton-extlink {
-       .background-image("images/@{button-extlink}");
+       .background-image('images/@{button-extlink}');
 }
 
 #mw-editbutton-headline {
-       .background-image("images/@{button-headline}");
+       .background-image('images/@{button-headline}');
 }
 
 #mw-editbutton-image {
-       .background-image("images/@{button-image}");
+       .background-image('images/@{button-image}');
 }
 
 #mw-editbutton-media {
-       .background-image("images/@{button-media}");
+       .background-image('images/@{button-media}');
 }
 
 #mw-editbutton-nowiki {
-       .background-image("images/@{button-nowiki}");
+       .background-image('images/@{button-nowiki}');
 }
 
 // Who decided to make only this single one different than the name of the data item?
 #mw-editbutton-signature {
-       .background-image("images/@{button-sig}");
+       .background-image('images/@{button-sig}');
 }
 
 #mw-editbutton-hr {
-       .background-image("images/@{button-hr}");
+       .background-image('images/@{button-hr}');
 }
index 6397c73..8e97c3e 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Helpers
 .mixin-mw-ui-anchor-styles( @mainColor ) {
index 5dc025f..abe7c46 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Buttons
 //
@@ -33,7 +33,8 @@
        display: inline-block;
        min-width: 4em;
        max-width: 28.75em; // equivalent to 460px, @see T95367
-       padding: 0.5em 1em;
+       padding: 0.546875em 1em;
+       line-height: 1.286;
        margin: 0;
        border-radius: @borderRadius;
        .box-sizing( border-box );
        }
 }
 
+input.mw-ui-button,
+button.mw-ui-button {
+       // Buttons in Firefox have extra height
+       &::-moz-focus-inner {
+               margin-top: -1px;
+               margin-bottom: -1px;
+       }
+}
+
 a.mw-ui-button {
        text-decoration: none;
 
@@ -219,12 +229,6 @@ a.mw-ui-button {
        &:focus {
                text-decoration: none;
        }
-
-       // a-tags behave different to inputs if the line-height attribute is inherited
-       // from another element (e.g. mw-body-content). They appear bigger as input
-       // tags. See Bug T116427. To fix that, apply the correct line-height (used
-       // for inputs) to a-tags, too.
-       line-height: normal;
 }
 
 // Button groups
index f983087..2ca20a5 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Checkbox
 //
                vertical-align: middle;
        }
 
-       input[type="checkbox"] {
+       input[type='checkbox'] {
                // we hide the input element as instead we will style the label that follows
                // we use opacity so that VoiceOver software can still identify it
                opacity: 0;
-               // Render "on top of" the label, so that it's still clickable (T98905)
+               // Render *on top of* the label, so that it's still clickable (T98905)
                z-index: 1;
                position: relative;
                // ensure the invisible checkbox takes up the required width
@@ -68,7 +68,7 @@
                }
 
                // the pseudo before element of the label after the checkbox now looks like a checkbox
-               & + label::before {
+               & + label:before {
                        content: '';
                        background-color: #fff;
                        .background-image-svg( 'images/checked.svg', 'images/checked.png' );
                }
 
                // when the input is checked, style the label pseudo before element that followed as a checked checkbox
-               &:checked + label::before {
+               &:checked + label:before {
                        .background-size( 100%, 100% );
                }
 
-               &:active + label::before {
+               &:active + label:before {
                        background-color: @colorGray13;
                        border-color: @colorGray13;
                }
 
-               &:focus + label::before {
+               &:focus + label:before {
                        border-width: 2px;
                }
 
-               &:focus:hover + label::before,
-               &:hover + label::before {
+               &:focus:hover + label:before,
+               &:hover + label:before {
                        border-bottom-width: 3px;
                }
 
                // disabled checkboxes have a gray background
-               &:disabled + label::before {
+               &:disabled + label:before {
                        cursor: default;
                        background-color: @colorGray14;
                        border-color: @colorGray14;
                }
 
                // disabled and checked checkboxes have a white circle
-               &:disabled:checked + label::before {
+               &:disabled:checked + label:before {
                        .background-image-svg( 'images/checked_disabled.svg', 'images/checked_disabled.png' );
                }
        }
index 2327efc..d3c76d0 100644 (file)
@@ -1,8 +1,8 @@
 // Form elements and layouts
 
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // --------------------------------------------------------------------------
 // Layouts
@@ -66,7 +66,7 @@
        }
 
        // Override input styling just for checkboxes and radio inputs.
-       input[type="radio"] {
+       input[type='radio'] {
                display: inline;
                .box-sizing( content-box );
                width: auto;
index efb04ae..f169d1b 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Mixins
 .mixin-mw-ui-icon-bgimage( @iconSvg, @iconPng ) {
index 21f5254..cc9c65a 100644 (file)
@@ -1,8 +1,8 @@
 // Inputs
 
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 // Text inputs
 //
        width: 100%;
        border: 1px solid @colorFieldBorder;
        border-radius: @borderRadius;
-       padding: 0.3em 0.3em 0.3em 0.6em;
+       padding: 0.625em 0.546875em 0.546875em;
        // necessary for smooth transition
        box-shadow: inset 0 0 0 0.1em #fff;
        font-family: inherit;
        font-size: inherit;
-       line-height: inherit;
+       line-height: 1.172em;
        vertical-align: middle;
 
        // Normalize & style placeholder text, see T139034
@@ -73,7 +73,7 @@
        }
 
        // Normalize styling for `<input type="search">`
-       &[type="search"] {
+       &[type='search'] {
                // Correct the odd appearance in Chrome and Safari 5
                -webkit-appearance: textfield;
 
@@ -103,7 +103,7 @@ textarea.mw-ui-input {
 // <button class="mw-ui-button mw-ui-progressive">Submit</button>
 //
 // Styleguide 1.2.
-input[type="number"],
+input[type='number'],
 .mw-ui-input-inline {
        display: inline-block;
        width: auto;
@@ -143,4 +143,5 @@ input.mw-ui-input-large {
        font-size: 1.75em;
        font-weight: bold;
        line-height: 1.25em;
+       padding: 0.3673em 0.3265em 0.3265em;
 }
index 7538ff4..7cb2849 100644 (file)
@@ -1,5 +1,5 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
 
 // Radio
 //
@@ -48,7 +48,7 @@
                vertical-align: middle;
        }
 
-       input[type="radio"] {
+       input[type='radio'] {
                // we hide the input element as instead we will style the label that follows
                // we use opacity so that VoiceOver software can still identify it
                opacity: 0;
@@ -60,7 +60,7 @@
                margin-right: 0.4em;
 
                // the pseudo before element of the label after the radio now looks like a radio
-               & + label::before {
+               & + label:before {
                        content: '';
                        background-color: #fff;
                        .background-image-svg( 'images/radio_checked.svg', 'images/radio_checked.png' );
                }
 
                // when the input is checked, style the label pseudo before element that followed as a checked radio
-               &:checked + label::before {
+               &:checked + label:before {
                        .background-size( 100%, 100% );
                }
 
-               &:active + label::before {
+               &:active + label:before {
                        background-color: @colorGray13;
                        border-color: @colorGray13;
                }
 
-               &:focus + label::before {
+               &:focus + label:before {
                        border-width: 2px;
                }
 
-               &:focus:hover + label::before,
-               &:hover + label::before {
+               &:focus:hover + label:before,
+               &:hover + label:before {
                        border-bottom-width: 3px;
                }
 
                // disabled radios have a gray background
-               &:disabled + label::before {
+               &:disabled + label:before {
                        background-color: @colorGray14;
                        border-color: @colorGray14;
                        cursor: default;
                }
 
                // disabled and checked radios have a white circle
-               &:disabled:checked + label::before {
+               &:disabled:checked + label:before {
                        .background-image-svg( 'images/radio_disabled.svg', 'images/radio_disabled.png' );
                }
        }
index c0684d9..a07aa68 100644 (file)
@@ -1,6 +1,6 @@
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
 
 /*
 Text & Anchors
index c9d6208..0589d39 100644 (file)
@@ -1,5 +1,5 @@
 /**
  * Provide Agora appearance for mw-ui-* classes.
  */
-@import "components/forms";
-@import "components/utilities";
+@import 'components/forms';
+@import 'components/utilities';
index b5b9cbe..093c58b 100644 (file)
@@ -1,5 +1,5 @@
 /* stylelint-disable no-duplicate-selectors */
-@import "mediawiki.widgets.datetime.definitions";
+@import 'mediawiki.widgets.datetime.definitions';
 
 .mw-widgets-datetime-calendarWidget {
        display: inline-block;
index 1c6c490..f205da3 100644 (file)
@@ -1,5 +1,5 @@
 /* stylelint-disable no-duplicate-selectors */
-@import "mediawiki.widgets.datetime.definitions";
+@import 'mediawiki.widgets.datetime.definitions';
 
 .mw-widgets-datetime-dateTimeInputWidget {
        display: inline-block;
index 877edba..0346cc1 100644 (file)
                        config.shortMonthNames = {};
                        $.each( config.fullMonthNames, function ( k, v ) {
                                config.shortMonthNames[ k ] = v.substr( 0, 3 );
-                       }.bind( this ) );
+                       } );
                }
                if ( config.shortDayNames && !config.dayLetters ) {
                        config.dayLetters = [];
                        $.each( config.shortDayNames, function ( k, v ) {
                                config.dayLetters[ k ] = v.substr( 0, 1 );
-                       }.bind( this ) );
+                       } );
                }
                if ( config.fullDayNames && !config.dayLetters ) {
                        config.dayLetters = [];
                        $.each( config.fullDayNames, function ( k, v ) {
                                config.dayLetters[ k ] = v.substr( 0, 1 );
-                       }.bind( this ) );
+                       } );
                }
                if ( config.fullDayNames && !config.shortDayNames ) {
                        config.shortDayNames = {};
                        $.each( config.fullDayNames, function ( k, v ) {
                                config.shortDayNames[ k ] = v.substr( 0, 3 );
-                       }.bind( this ) );
+                       } );
                }
                config = $.extend( {
                        fullMonthNames: this.constructor.static.fullMonthNames,
index bdade36..fa45d5a 100644 (file)
@@ -25,7 +25,7 @@
 }
 
 .oo-ui-transition( @value1, @value2: X, ... ) {
-       @value: ~`"@{arguments}".replace(/[\[\]]|\,\sX/g, '')`; // stylelint-disable-line function-comma-space-after, function-parentheses-space-inside, function-whitespace-after
+       @value: ~`'@{arguments}'.replace(/[\[\]]|\,\sX/g, '')`; // stylelint-disable-line function-comma-space-after, function-parentheses-space-inside, function-whitespace-after, value-keyword-case
        -webkit-transition: @value;
        -moz-transition: @value;
        transition: @value;
index bc752b5..2a47fa2 100644 (file)
 .mw-widget-mediaResultWidget-thumbnail {
        opacity: 0;
        display: inline-block;
-       /* stylelint-disable no-unsupported-browser-features */
        -webkit-transition: opacity 400ms;
        -moz-transition: opacity 400ms;
        transition: opacity 400ms;
-       /* stylelint-enable no-unsupported-browser-features */
 }
 
 .mw-widget-mediaResultWidget-done .mw-widget-mediaResultWidget-thumbnail,
@@ -35,7 +33,7 @@
 }
 
 .mw-widget-mediaResultWidget-crop {
-       background-size: cover; /* stylelint-disable-line no-unsupported-browser-features */
+       background-size: cover;
        background-position: center center;
 }
 
@@ -56,7 +54,7 @@
 .mw-widget-mediaResultWidget-error .mw-widget-mediaResultWidget-thumbnail {
        /* @embed */
        background-image: url( broken-image.png );
-       background-size: auto; /* stylelint-disable-line no-unsupported-browser-features */
+       background-size: auto;
        background-position: center center;
        background-repeat: no-repeat;
 }
@@ -69,7 +67,7 @@
        overflow: hidden;
        padding: 0.5em;
        color: #fff;
-       text-shadow: 1px 1px #000; /* stylelint-disable-line no-unsupported-browser-features */
+       text-shadow: 1px 1px #000;
        line-height: 1.125em;
        background-color: rgba( 0, 0, 0, 0.5 );
        text-overflow: ellipsis;
index c6938e8..1cc168a 100644 (file)
@@ -65,7 +65,7 @@
                this.$results.on( 'scroll', this.onResultsScroll.bind( this ) );
                this.$query.append( this.noItemsMessage.$element );
                this.results.connect( this, {
-                       add: 'onResultsAdd',
+                       change: 'onResultsChange',
                        remove: 'onResultsRemove'
                } );
 
        };
 
        /**
-        * Respond to add results event in the results widget.
+        * Respond to change results event in the results widget.
         * Override the way SelectWidget and GroupElement append the items
         * into the group so we can append them in groups of rows.
         *
         * @param {mw.widgets.MediaResultWidget[]} items An array of item elements
         */
-       mw.widgets.MediaSearchWidget.prototype.onResultsAdd = function ( items ) {
+       mw.widgets.MediaSearchWidget.prototype.onResultsChange = function ( items ) {
                var search = this;
 
+               if ( !items.length ) {
+                       return;
+               }
+
                // Add method to a queue; this queue will only run when the widget
                // is visible
                this.layoutQueue.push( function () {
                        // Go over the added items
                        row = search.getAvailableRow();
                        for ( i = 0, ilen = items.length; i < ilen; i++ ) {
+
+                               // Check item has just been added
+                               if ( items[ i ].row !== null ) {
+                                       continue;
+                               }
+
                                itemWidth = items[ i ].$element.outerWidth( true );
 
                                // Add items to row until it is full
 
                                // Append the item
                                search.rows[ row ].$element.append( items[ i ].$element );
+
                        }
 
                        // If we have less than 4 rows, call for more images
index 57a3d9c..c5a2dd4 100644 (file)
                        }
                        setTimeout( function () {
                                $bodyWrapper.addClass( 'mw-widget-calendarWidget-body-wrapper-fade-' + fade );
-                       }.bind( this ), 0 );
+                       } );
                } else {
                        this.$oldBody.replaceWith( this.$body );
                }
index b929a5a..395f80b 100644 (file)
@@ -68,8 +68,8 @@
        }
 
        .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):first-child {
-               margin-top: -@calendarHeight;
-               margin-left: -@calendarWidth;
+               margin-top: -@calendarHeight; /* stylelint-disable-line value-keyword-case */
+               margin-left: -@calendarWidth; /* stylelint-disable-line value-keyword-case */
        }
 
        .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):last-child {
@@ -83,8 +83,8 @@
        height: @calendarHeight;
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-top: 0 !important;
-               margin-left: 0 !important;
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-left 500ms );
        }
 }
@@ -94,8 +94,8 @@
        height: @calendarHeight;
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: -@calendarWidth !important;
-               margin-top: 0 !important;
+               margin-left: -@calendarWidth !important; /* stylelint-disable-line value-keyword-case, declaration-no-important */
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-left 500ms );
        }
 }
        }
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: 0 !important;
-               margin-top: 0 !important;
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
                .transition( margin-top 500ms );
        }
 }
        }
 
        .mw-widget-calendarWidget-body:first-child {
-               margin-left: 0 !important;
-               margin-top: -@calendarHeight !important;
+               margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
+               margin-top: -@calendarHeight !important; /* stylelint-disable-line value-keyword-case, declaration-no-important */
                .transition( margin-top 500ms );
        }
 }
diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js b/resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js
new file mode 100644 (file)
index 0000000..5f68030
--- /dev/null
@@ -0,0 +1,416 @@
+/*!
+ * MediaWiki Widgets - CategoryMultiselectWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+       var NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
+
+       /**
+        * Category selector widget. Displays an OO.ui.CapsuleMultiselectWidget
+        * and autocompletes with available categories.
+        *
+        *     mw.loader.using( 'mediawiki.widgets.CategoryMultiselectWidget', function () {
+        *       var selector = new mw.widgets.CategoryMultiselectWidget( {
+        *         searchTypes: [
+        *           mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch,
+        *           mw.widgets.CategoryMultiselectWidget.SearchType.InternalSearch
+        *         ]
+        *       } );
+        *
+        *       $( 'body' ).append( selector.$element );
+        *
+        *       selector.setSearchTypes( [ mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories ] );
+        *     } );
+        *
+        * @class mw.widgets.CategoryMultiselectWidget
+        * @uses mw.Api
+        * @extends OO.ui.CapsuleMultiselectWidget
+        * @mixins OO.ui.mixin.PendingElement
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {mw.Api} [api] Instance of mw.Api (or subclass thereof) to use for queries
+        * @cfg {number} [limit=10] Maximum number of results to load
+        * @cfg {mw.widgets.CategoryMultiselectWidget.SearchType[]} [searchTypes=[mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch]]
+        *   Default search API to use when searching.
+        */
+       mw.widgets.CategoryMultiselectWidget = function MWCategoryMultiselectWidget( config ) {
+               // Config initialization
+               config = $.extend( {
+                       limit: 10,
+                       searchTypes: [ mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch ]
+               }, config );
+               this.limit = config.limit;
+               this.searchTypes = config.searchTypes;
+               this.validateSearchTypes();
+
+               // Parent constructor
+               mw.widgets.CategoryMultiselectWidget.parent.call( this, $.extend( true, {}, config, {
+                       menu: {
+                               filterFromInput: false
+                       },
+                       placeholder: mw.msg( 'mw-widgets-categoryselector-add-category-placeholder' ),
+                       // This allows the user to both select non-existent categories, and prevents the selector from
+                       // being wiped from #onMenuItemsChange when we change the available options in the dropdown
+                       allowArbitrary: true
+               } ) );
+
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
+
+               // Event handler to call the autocomplete methods
+               this.$input.on( 'change input cut paste', OO.ui.debounce( this.updateMenuItems.bind( this ), 100 ) );
+
+               // Initialize
+               this.api = config.api || new mw.Api();
+               this.searchCache = {};
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.CategoryMultiselectWidget, OO.ui.CapsuleMultiselectWidget );
+       OO.mixinClass( mw.widgets.CategoryMultiselectWidget, OO.ui.mixin.PendingElement );
+
+       /* Methods */
+
+       /**
+        * Gets new items based on the input by calling
+        * {@link #getNewMenuItems getNewItems} and updates the menu
+        * after removing duplicates based on the data value.
+        *
+        * @private
+        * @method
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.updateMenuItems = function () {
+               this.getMenu().clearItems();
+               this.getNewMenuItems( this.$input.val() ).then( function ( items ) {
+                       var existingItems, filteredItems,
+                               menu = this.getMenu();
+
+                       // Never show the menu if the input lost focus in the meantime
+                       if ( !this.$input.is( ':focus' ) ) {
+                               return;
+                       }
+
+                       // Array of strings of the data of OO.ui.MenuOptionsWidgets
+                       existingItems = menu.getItems().map( function ( item ) {
+                               return item.data;
+                       } );
+
+                       // Remove if items' data already exists
+                       filteredItems = items.filter( function ( item ) {
+                               return existingItems.indexOf( item ) === -1;
+                       } );
+
+                       // Map to an array of OO.ui.MenuOptionWidgets
+                       filteredItems = filteredItems.map( function ( item ) {
+                               return new OO.ui.MenuOptionWidget( {
+                                       data: item,
+                                       label: item
+                               } );
+                       } );
+
+                       menu.addItems( filteredItems ).toggle( true );
+               }.bind( this ) );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.clearInput = function () {
+               mw.widgets.CategoryMultiselectWidget.parent.prototype.clearInput.call( this );
+               // Abort all pending requests, we won't need their results
+               this.api.abort();
+       };
+
+       /**
+        * Searches for categories based on the input.
+        *
+        * @private
+        * @method
+        * @param {string} input The input used to prefix search categories
+        * @return {jQuery.Promise} Resolves with an array of categories
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.getNewMenuItems = function ( input ) {
+               var i,
+                       promises = [],
+                       deferred = $.Deferred();
+
+               if ( $.trim( input ) === '' ) {
+                       deferred.resolve( [] );
+                       return deferred.promise();
+               }
+
+               // Abort all pending requests, we won't need their results
+               this.api.abort();
+               for ( i = 0; i < this.searchTypes.length; i++ ) {
+                       promises.push( this.searchCategories( input, this.searchTypes[ i ] ) );
+               }
+
+               this.pushPending();
+
+               $.when.apply( $, promises ).done( function () {
+                       var categoryNames,
+                               allData = [],
+                               dataSets = Array.prototype.slice.apply( arguments );
+
+                       // Collect values from all results
+                       allData = allData.concat.apply( allData, dataSets );
+
+                       categoryNames = allData
+                               // Remove duplicates
+                               .filter( function ( value, index, self ) {
+                                       return self.indexOf( value ) === index;
+                               } )
+                               // Get Title objects
+                               .map( function ( name ) {
+                                       return mw.Title.newFromText( name );
+                               } )
+                               // Keep only titles from 'Category' namespace
+                               .filter( function ( title ) {
+                                       return title && title.getNamespaceId() === NS_CATEGORY;
+                               } )
+                               // Convert back to strings, strip 'Category:' prefix
+                               .map( function ( title ) {
+                                       return title.getMainText();
+                               } );
+
+                       deferred.resolve( categoryNames );
+
+               } ).always( this.popPending.bind( this ) );
+
+               return deferred.promise();
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.createItemWidget = function ( data ) {
+               var title = mw.Title.makeTitle( NS_CATEGORY, data );
+               if ( !title ) {
+                       return null;
+               }
+               return new mw.widgets.CategoryCapsuleItemWidget( {
+                       apiUrl: this.api.apiUrl || undefined,
+                       title: title
+               } );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.getItemFromData = function ( data ) {
+               // This is a bit of a hack... We have to canonicalize the data in the same way that
+               // #createItemWidget and CategoryCapsuleItemWidget will do, otherwise we won't find duplicates.
+               var title = mw.Title.makeTitle( NS_CATEGORY, data );
+               if ( !title ) {
+                       return null;
+               }
+               return OO.ui.mixin.GroupElement.prototype.getItemFromData.call( this, title.getMainText() );
+       };
+
+       /**
+        * Validates the values in `this.searchType`.
+        *
+        * @private
+        * @return {boolean}
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.validateSearchTypes = function () {
+               var validSearchTypes = false,
+                       searchTypeEnumCount = Object.keys( mw.widgets.CategoryMultiselectWidget.SearchType ).length;
+
+               // Check if all values are in the SearchType enum
+               validSearchTypes = this.searchTypes.every( function ( searchType ) {
+                       return searchType > -1 && searchType < searchTypeEnumCount;
+               } );
+
+               if ( validSearchTypes === false ) {
+                       throw new Error( 'Unknown searchType in searchTypes' );
+               }
+
+               // If the searchTypes has mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories
+               // it can be the only search type.
+               if ( this.searchTypes.indexOf( mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories ) > -1 &&
+                       this.searchTypes.length > 1
+               ) {
+                       throw new Error( 'Can\'t have additional search types with mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories' );
+               }
+
+               // If the searchTypes has mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories
+               // it can be the only search type.
+               if ( this.searchTypes.indexOf( mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories ) > -1 &&
+                       this.searchTypes.length > 1
+               ) {
+                       throw new Error( 'Can\'t have additional search types with mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories' );
+               }
+
+               return true;
+       };
+
+       /**
+        * Sets and validates the value of `this.searchType`.
+        *
+        * @param {mw.widgets.CategoryMultiselectWidget.SearchType[]} searchTypes
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.setSearchTypes = function ( searchTypes ) {
+               this.searchTypes = searchTypes;
+               this.validateSearchTypes();
+       };
+
+       /**
+        * Searches categories based on input and searchType.
+        *
+        * @private
+        * @method
+        * @param {string} input The input used to prefix search categories
+        * @param {mw.widgets.CategoryMultiselectWidget.SearchType} searchType
+        * @return {jQuery.Promise} Resolves with an array of categories
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.searchCategories = function ( input, searchType ) {
+               var deferred = $.Deferred(),
+                       cacheKey = input + searchType.toString();
+
+               // Check cache
+               if ( this.searchCache[ cacheKey ] !== undefined ) {
+                       return this.searchCache[ cacheKey ];
+               }
+
+               switch ( searchType ) {
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch:
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'opensearch',
+                                       namespace: NS_CATEGORY,
+                                       limit: this.limit,
+                                       search: input
+                               } ).done( function ( res ) {
+                                       var categories = res[ 1 ];
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.InternalSearch:
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       list: 'allpages',
+                                       apnamespace: NS_CATEGORY,
+                                       aplimit: this.limit,
+                                       apfrom: input,
+                                       apprefix: input
+                               } ).done( function ( res ) {
+                                       var categories = res.query.allpages.map( function ( page ) {
+                                               return page.title;
+                                       } );
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.Exists:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       prop: 'info',
+                                       titles: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var categories = [];
+
+                                       $.each( res.query.pages, function ( index, page ) {
+                                               if ( !page.missing ) {
+                                                       categories.push( page.title );
+                                               }
+                                       } );
+
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       list: 'categorymembers',
+                                       cmtype: 'subcat',
+                                       cmlimit: this.limit,
+                                       cmtitle: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var categories = res.query.categorymembers.map( function ( category ) {
+                                               return category.title;
+                                       } );
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       prop: 'categories',
+                                       cllimit: this.limit,
+                                       titles: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var categories = [];
+
+                                       $.each( res.query.pages, function ( index, page ) {
+                                               if ( !page.missing && Array.isArray( page.categories ) ) {
+                                                       categories.push.apply( categories, page.categories.map( function ( category ) {
+                                                               return category.title;
+                                                       } ) );
+                                               }
+                                       } );
+
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       default:
+                               throw new Error( 'Unknown searchType' );
+               }
+
+               // Cache the result
+               this.searchCache[ cacheKey ] = deferred.promise();
+
+               return deferred.promise();
+       };
+
+       /**
+        * @enum mw.widgets.CategoryMultiselectWidget.SearchType
+        * Types of search available.
+        */
+       mw.widgets.CategoryMultiselectWidget.SearchType = {
+               /** Search using action=opensearch */
+               OpenSearch: 0,
+
+               /** Search using action=query */
+               InternalSearch: 1,
+
+               /** Search for existing categories with the exact title */
+               Exists: 2,
+
+               /** Search only subcategories  */
+               SubCategories: 3,
+
+               /** Search only parent categories */
+               ParentCategories: 4
+       };
+
+       // For backwards compatibility. See T161285.
+       mw.widgets.CategorySelector = mw.widgets.CategoryMultiselectWidget;
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js b/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
deleted file mode 100644 (file)
index 422c048..0000000
+++ /dev/null
@@ -1,417 +0,0 @@
-/*!
- * MediaWiki Widgets - CategorySelector class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-( function ( $, mw ) {
-       var CSP,
-               NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
-
-       /**
-        * Category selector widget. Displays an OO.ui.CapsuleMultiselectWidget
-        * and autocompletes with available categories.
-        *
-        *     mw.loader.using( 'mediawiki.widgets.CategorySelector', function () {
-        *       var selector = new mw.widgets.CategorySelector( {
-        *         searchTypes: [
-        *           mw.widgets.CategorySelector.SearchType.OpenSearch,
-        *           mw.widgets.CategorySelector.SearchType.InternalSearch
-        *         ]
-        *       } );
-        *
-        *       $( 'body' ).append( selector.$element );
-        *
-        *       selector.setSearchTypes( [ mw.widgets.CategorySelector.SearchType.SubCategories ] );
-        *     } );
-        *
-        * @class mw.widgets.CategorySelector
-        * @uses mw.Api
-        * @extends OO.ui.CapsuleMultiselectWidget
-        * @mixins OO.ui.mixin.PendingElement
-        *
-        * @constructor
-        * @param {Object} [config] Configuration options
-        * @cfg {mw.Api} [api] Instance of mw.Api (or subclass thereof) to use for queries
-        * @cfg {number} [limit=10] Maximum number of results to load
-        * @cfg {mw.widgets.CategorySelector.SearchType[]} [searchTypes=[mw.widgets.CategorySelector.SearchType.OpenSearch]]
-        *   Default search API to use when searching.
-        */
-       function CategorySelector( config ) {
-               // Config initialization
-               config = $.extend( {
-                       limit: 10,
-                       searchTypes: [ CategorySelector.SearchType.OpenSearch ]
-               }, config );
-               this.limit = config.limit;
-               this.searchTypes = config.searchTypes;
-               this.validateSearchTypes();
-
-               // Parent constructor
-               mw.widgets.CategorySelector.parent.call( this, $.extend( true, {}, config, {
-                       menu: {
-                               filterFromInput: false
-                       },
-                       placeholder: mw.msg( 'mw-widgets-categoryselector-add-category-placeholder' ),
-                       // This allows the user to both select non-existent categories, and prevents the selector from
-                       // being wiped from #onMenuItemsChange when we change the available options in the dropdown
-                       allowArbitrary: true
-               } ) );
-
-               // Mixin constructors
-               OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
-
-               // Event handler to call the autocomplete methods
-               this.$input.on( 'change input cut paste', OO.ui.debounce( this.updateMenuItems.bind( this ), 100 ) );
-
-               // Initialize
-               this.api = config.api || new mw.Api();
-               this.searchCache = {};
-       }
-
-       /* Setup */
-
-       OO.inheritClass( CategorySelector, OO.ui.CapsuleMultiselectWidget );
-       OO.mixinClass( CategorySelector, OO.ui.mixin.PendingElement );
-       CSP = CategorySelector.prototype;
-
-       /* Methods */
-
-       /**
-        * Gets new items based on the input by calling
-        * {@link #getNewMenuItems getNewItems} and updates the menu
-        * after removing duplicates based on the data value.
-        *
-        * @private
-        * @method
-        */
-       CSP.updateMenuItems = function () {
-               this.getMenu().clearItems();
-               this.getNewMenuItems( this.$input.val() ).then( function ( items ) {
-                       var existingItems, filteredItems,
-                               menu = this.getMenu();
-
-                       // Never show the menu if the input lost focus in the meantime
-                       if ( !this.$input.is( ':focus' ) ) {
-                               return;
-                       }
-
-                       // Array of strings of the data of OO.ui.MenuOptionsWidgets
-                       existingItems = menu.getItems().map( function ( item ) {
-                               return item.data;
-                       } );
-
-                       // Remove if items' data already exists
-                       filteredItems = items.filter( function ( item ) {
-                               return existingItems.indexOf( item ) === -1;
-                       } );
-
-                       // Map to an array of OO.ui.MenuOptionWidgets
-                       filteredItems = filteredItems.map( function ( item ) {
-                               return new OO.ui.MenuOptionWidget( {
-                                       data: item,
-                                       label: item
-                               } );
-                       } );
-
-                       menu.addItems( filteredItems ).toggle( true );
-               }.bind( this ) );
-       };
-
-       /**
-        * @inheritdoc
-        */
-       CSP.clearInput = function () {
-               CategorySelector.parent.prototype.clearInput.call( this );
-               // Abort all pending requests, we won't need their results
-               this.api.abort();
-       };
-
-       /**
-        * Searches for categories based on the input.
-        *
-        * @private
-        * @method
-        * @param {string} input The input used to prefix search categories
-        * @return {jQuery.Promise} Resolves with an array of categories
-        */
-       CSP.getNewMenuItems = function ( input ) {
-               var i,
-                       promises = [],
-                       deferred = $.Deferred();
-
-               if ( $.trim( input ) === '' ) {
-                       deferred.resolve( [] );
-                       return deferred.promise();
-               }
-
-               // Abort all pending requests, we won't need their results
-               this.api.abort();
-               for ( i = 0; i < this.searchTypes.length; i++ ) {
-                       promises.push( this.searchCategories( input, this.searchTypes[ i ] ) );
-               }
-
-               this.pushPending();
-
-               $.when.apply( $, promises ).done( function () {
-                       var categoryNames,
-                               allData = [],
-                               dataSets = Array.prototype.slice.apply( arguments );
-
-                       // Collect values from all results
-                       allData = allData.concat.apply( allData, dataSets );
-
-                       categoryNames = allData
-                               // Remove duplicates
-                               .filter( function ( value, index, self ) {
-                                       return self.indexOf( value ) === index;
-                               } )
-                               // Get Title objects
-                               .map( function ( name ) {
-                                       return mw.Title.newFromText( name );
-                               } )
-                               // Keep only titles from 'Category' namespace
-                               .filter( function ( title ) {
-                                       return title && title.getNamespaceId() === NS_CATEGORY;
-                               } )
-                               // Convert back to strings, strip 'Category:' prefix
-                               .map( function ( title ) {
-                                       return title.getMainText();
-                               } );
-
-                       deferred.resolve( categoryNames );
-
-               } ).always( this.popPending.bind( this ) );
-
-               return deferred.promise();
-       };
-
-       /**
-        * @inheritdoc
-        */
-       CSP.createItemWidget = function ( data ) {
-               var title = mw.Title.makeTitle( NS_CATEGORY, data );
-               if ( !title ) {
-                       return null;
-               }
-               return new mw.widgets.CategoryCapsuleItemWidget( {
-                       apiUrl: this.api.apiUrl || undefined,
-                       title: title
-               } );
-       };
-
-       /**
-        * @inheritdoc
-        */
-       CSP.getItemFromData = function ( data ) {
-               // This is a bit of a hack... We have to canonicalize the data in the same way that
-               // #createItemWidget and CategoryCapsuleItemWidget will do, otherwise we won't find duplicates.
-               var title = mw.Title.makeTitle( NS_CATEGORY, data );
-               if ( !title ) {
-                       return null;
-               }
-               return OO.ui.mixin.GroupElement.prototype.getItemFromData.call( this, title.getMainText() );
-       };
-
-       /**
-        * Validates the values in `this.searchType`.
-        *
-        * @private
-        * @return {boolean}
-        */
-       CSP.validateSearchTypes = function () {
-               var validSearchTypes = false,
-                       searchTypeEnumCount = Object.keys( CategorySelector.SearchType ).length;
-
-               // Check if all values are in the SearchType enum
-               validSearchTypes = this.searchTypes.every( function ( searchType ) {
-                       return searchType > -1 && searchType < searchTypeEnumCount;
-               } );
-
-               if ( validSearchTypes === false ) {
-                       throw new Error( 'Unknown searchType in searchTypes' );
-               }
-
-               // If the searchTypes has CategorySelector.SearchType.SubCategories
-               // it can be the only search type.
-               if ( this.searchTypes.indexOf( CategorySelector.SearchType.SubCategories ) > -1 &&
-                       this.searchTypes.length > 1
-               ) {
-                       throw new Error( 'Can\'t have additional search types with CategorySelector.SearchType.SubCategories' );
-               }
-
-               // If the searchTypes has CategorySelector.SearchType.ParentCategories
-               // it can be the only search type.
-               if ( this.searchTypes.indexOf( CategorySelector.SearchType.ParentCategories ) > -1 &&
-                       this.searchTypes.length > 1
-               ) {
-                       throw new Error( 'Can\'t have additional search types with CategorySelector.SearchType.ParentCategories' );
-               }
-
-               return true;
-       };
-
-       /**
-        * Sets and validates the value of `this.searchType`.
-        *
-        * @param {mw.widgets.CategorySelector.SearchType[]} searchTypes
-        */
-       CSP.setSearchTypes = function ( searchTypes ) {
-               this.searchTypes = searchTypes;
-               this.validateSearchTypes();
-       };
-
-       /**
-        * Searches categories based on input and searchType.
-        *
-        * @private
-        * @method
-        * @param {string} input The input used to prefix search categories
-        * @param {mw.widgets.CategorySelector.SearchType} searchType
-        * @return {jQuery.Promise} Resolves with an array of categories
-        */
-       CSP.searchCategories = function ( input, searchType ) {
-               var deferred = $.Deferred(),
-                       cacheKey = input + searchType.toString();
-
-               // Check cache
-               if ( this.searchCache[ cacheKey ] !== undefined ) {
-                       return this.searchCache[ cacheKey ];
-               }
-
-               switch ( searchType ) {
-                       case CategorySelector.SearchType.OpenSearch:
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'opensearch',
-                                       namespace: NS_CATEGORY,
-                                       limit: this.limit,
-                                       search: input
-                               } ).done( function ( res ) {
-                                       var categories = res[ 1 ];
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.InternalSearch:
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       list: 'allpages',
-                                       apnamespace: NS_CATEGORY,
-                                       aplimit: this.limit,
-                                       apfrom: input,
-                                       apprefix: input
-                               } ).done( function ( res ) {
-                                       var categories = res.query.allpages.map( function ( page ) {
-                                               return page.title;
-                                       } );
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.Exists:
-                               if ( input.indexOf( '|' ) > -1 ) {
-                                       deferred.resolve( [] );
-                                       break;
-                               }
-
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       prop: 'info',
-                                       titles: 'Category:' + input
-                               } ).done( function ( res ) {
-                                       var categories = [];
-
-                                       $.each( res.query.pages, function ( index, page ) {
-                                               if ( !page.missing ) {
-                                                       categories.push( page.title );
-                                               }
-                                       } );
-
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.SubCategories:
-                               if ( input.indexOf( '|' ) > -1 ) {
-                                       deferred.resolve( [] );
-                                       break;
-                               }
-
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       list: 'categorymembers',
-                                       cmtype: 'subcat',
-                                       cmlimit: this.limit,
-                                       cmtitle: 'Category:' + input
-                               } ).done( function ( res ) {
-                                       var categories = res.query.categorymembers.map( function ( category ) {
-                                               return category.title;
-                                       } );
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.ParentCategories:
-                               if ( input.indexOf( '|' ) > -1 ) {
-                                       deferred.resolve( [] );
-                                       break;
-                               }
-
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       prop: 'categories',
-                                       cllimit: this.limit,
-                                       titles: 'Category:' + input
-                               } ).done( function ( res ) {
-                                       var categories = [];
-
-                                       $.each( res.query.pages, function ( index, page ) {
-                                               if ( !page.missing && $.isArray( page.categories ) ) {
-                                                       categories.push.apply( categories, page.categories.map( function ( category ) {
-                                                               return category.title;
-                                                       } ) );
-                                               }
-                                       } );
-
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       default:
-                               throw new Error( 'Unknown searchType' );
-               }
-
-               // Cache the result
-               this.searchCache[ cacheKey ] = deferred.promise();
-
-               return deferred.promise();
-       };
-
-       /**
-        * @enum mw.widgets.CategorySelector.SearchType
-        * Types of search available.
-        */
-       CategorySelector.SearchType = {
-               /** Search using action=opensearch */
-               OpenSearch: 0,
-
-               /** Search using action=query */
-               InternalSearch: 1,
-
-               /** Search for existing categories with the exact title */
-               Exists: 2,
-
-               /** Search only subcategories  */
-               SubCategories: 3,
-
-               /** Search only parent categories */
-               ParentCategories: 4
-       };
-
-       mw.widgets.CategorySelector = CategorySelector;
-}( jQuery, mediaWiki ) );
index f67ed3d..9edd0bd 100644 (file)
                }
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexNamespaceInputWidget.prototype.setDisabled = function ( disabled ) {
+               mw.widgets.ComplexNamespaceInputWidget.parent.prototype.setDisabled.call( this, disabled );
+               if ( this.namespace ) {
+                       this.namespace.setDisabled( disabled );
+               }
+               if ( this.invert ) {
+                       this.invert.setDisabled( disabled );
+               }
+
+               if ( this.associated ) {
+                       this.associated.setDisabled( disabled );
+               }
+               return this;
+       };
+
 }( jQuery, mediaWiki ) );
index 8f48ec3..a01fbde 100644 (file)
                this.title.restorePreInfuseState( state.title );
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexTitleInputWidget.prototype.setDisabled = function ( disabled ) {
+               mw.widgets.ComplexTitleInputWidget.parent.prototype.setDisabled.call( this, disabled );
+               if ( this.namespace ) {
+                       this.namespace.setDisabled( disabled );
+               }
+
+               if ( this.title ) {
+                       this.title.setDisabled( disabled );
+               }
+               return this;
+       };
+
 }( jQuery, mediaWiki ) );
index 0ec6a4c..50a84f8 100644 (file)
@@ -56,7 +56,7 @@
         *     } );
         *
         * @class
-        * @extends OO.ui.InputWidget
+        * @extends OO.ui.TextInputWidget
         * @mixins OO.ui.mixin.IndicatorElement
         *
         * @constructor
 
                // Properties (must be set before parent constructor, which calls #setValue)
                this.$handle = $( '<div>' );
-               this.label = new OO.ui.LabelWidget();
+               this.innerLabel = new OO.ui.LabelWidget();
                this.textInput = new OO.ui.TextInputWidget( {
                        required: config.required,
                        placeholder: placeholderDateFormat,
                this.longDisplayFormat = config.longDisplayFormat;
                this.required = config.required;
                this.placeholderLabel = config.placeholderLabel;
-
                // Validate and set min and max dates as properties
+
                if ( config.mustBeAfter !== undefined ) {
                        mustBeAfter = moment( config.mustBeAfter, 'YYYY-MM-DD' );
                        if ( mustBeAfter.isValid() ) {
                                this.mustBeBefore = mustBeBefore;
                        }
                }
-
                // Parent constructor
                mw.widgets.DateInputWidget.parent.call( this, config );
 
                } );
                this.$handle.on( {
                        click: this.onClick.bind( this ),
-                       keypress: this.onKeyPress.bind( this )
+                       keypress: this.onKeyPress.bind( this ),
+                       focus: this.activate.bind( this )
                } );
 
                // Initialization
                // Move 'tabindex' from this.$input (which is invisible) to the visible handle
                this.setTabIndexedElement( this.$handle );
                this.$handle
-                       .append( this.label.$element, this.$indicator )
+                       .append( this.innerLabel.$element, this.$indicator )
                        .addClass( 'mw-widget-dateInputWidget-handle' );
                this.calendar.$element
                        .addClass( 'mw-widget-dateInputWidget-calendar' );
 
        /* Inheritance */
 
-       OO.inheritClass( mw.widgets.DateInputWidget, OO.ui.InputWidget );
+       OO.inheritClass( mw.widgets.DateInputWidget, OO.ui.TextInputWidget );
        OO.mixinClass( mw.widgets.DateInputWidget, OO.ui.mixin.IndicatorElement );
 
        /* Methods */
                if ( this.getValue() === '' ) {
                        this.textInput.setValue( '' );
                        this.calendar.setDate( null );
-                       this.label.setLabel( this.placeholderLabel );
+                       this.innerLabel.setLabel( this.placeholderLabel );
                        this.$element.addClass( 'mw-widget-dateInputWidget-empty' );
                } else {
                        moment = this.getMoment();
                        if ( !this.inCalendar ) {
                                this.calendar.setDate( this.getValue() );
                        }
-                       this.label.setLabel( moment.format( this.getDisplayFormat() ) );
+                       this.innerLabel.setLabel( moment.format( this.getDisplayFormat() ) );
                        this.$element.removeClass( 'mw-widget-dateInputWidget-empty' );
                }
        };
index 8ba9a99..3ecdea8 100644 (file)
 @indicator-size: unit( 12 / 16 / 0.8, em );
 
 .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;
+       &.oo-ui-textInputWidget {
+               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 {
+       &-handle,
+       &.oo-ui-textInputWidget input {
                background-color: #fff;
                display: inline-block;
                position: relative;
                .oo-ui-box-sizing( border-box );
                width: 100%;
-               .oo-ui-unselectable();
                cursor: pointer;
                padding: 0.5em 1em;
                border: 1px solid #a2a9b1;
                border-radius: 2px;
                outline: 0;
                line-height: 1.275;
+               /**
+                * Ensures non-infused and infused widget have the same height.
+                * Equal to line height + top padding + bottom padding
+                */
+               height: 2.275em;
+       }
+
+       &-handle {
+               .oo-ui-unselectable();
 
                > .oo-ui-labelElement-label {
                        padding: 0;
index 0a73bef..7880b55 100755 (executable)
@@ -30,7 +30,6 @@
                var $form = config.$input ? config.$input.closest( 'form' ) : $();
 
                config = $.extend( {
-                       type: 'search',
                        icon: 'search',
                        maxLength: undefined,
                        performSearchOnClick: true,
                                )
                        } );
                }.bind( this ) );
+
+               this.$element.addClass( 'oo-ui-textInputWidget-type-search' );
+               this.updateSearchIndicator();
+               this.connect( this, {
+                       disable: 'onDisable'
+               } );
        };
 
        /* Setup */
 
        /* Methods */
 
+       /**
+        * @inheritdoc
+        * @protected
+        */
+       mw.widgets.SearchInputWidget.prototype.getInputElement = function () {
+               return $( '<input>' ).attr( 'type', 'search' );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.SearchInputWidget.prototype.onIndicatorMouseDown = function ( e ) {
+               if ( e.which === OO.ui.MouseButtons.LEFT ) {
+                       // Clear the text field
+                       this.setValue( '' );
+                       this.$input[ 0 ].focus();
+                       return false;
+               }
+       };
+
+       /**
+        * Update the 'clear' indicator displayed on type: 'search' text
+        * fields, hiding it when the field is already empty or when it's not
+        * editable.
+        */
+       mw.widgets.SearchInputWidget.prototype.updateSearchIndicator = function () {
+               if ( this.getValue() === '' || this.isDisabled() || this.isReadOnly() ) {
+                       this.setIndicator( null );
+               } else {
+                       this.setIndicator( 'clear' );
+               }
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.SearchInputWidget.prototype.onChange = function () {
+               mw.widgets.SearchInputWidget.parent.prototype.onChange.call( this );
+               this.updateSearchIndicator();
+       };
+
+       /**
+        * Handle disable events.
+        *
+        * @param {boolean} disabled Element is disabled
+        * @private
+        */
+       mw.widgets.SearchInputWidget.prototype.onDisable = function () {
+               this.updateSearchIndicator();
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.SearchInputWidget.prototype.setReadOnly = function ( state ) {
+               mw.widgets.SearchInputWidget.parent.prototype.setReadOnly.call( this, state );
+               this.updateSearchIndicator();
+               return this;
+       };
+
        /**
         * @inheritdoc mw.widgets.TitleWidget
         */
diff --git a/resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.base.css b/resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.base.css
new file mode 100644 (file)
index 0000000..8c495a5
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+ * MediaWiki Widgets - base SelectWithInput styles.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-selectWithInputWidget .oo-ui-dropdownInputWidget,
+.mw-widget-selectWithInputWidget .oo-ui-textInputWidget {
+       display: inline-block;
+}
+
+.mw-widget-selectWithInputWidget .oo-ui-dropdownInputWidget {
+       max-width: 20em;
+       margin-right: 0.5em;
+}
+
+.mw-widget-selectWithInputWidget .oo-ui-textInputWidget {
+       max-width: 29.5em;
+}
diff --git a/resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js b/resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js
new file mode 100644 (file)
index 0000000..8c60ecf
--- /dev/null
@@ -0,0 +1,135 @@
+/*!
+ * MediaWiki Widgets - SelectWithInputWidget class.
+ *
+ * @copyright 2011-2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Select with input widget. Displays an OO.ui.TextInputWidget along with
+        * an OO.ui.DropdownInputWidget.
+        * TODO Explain the OTHER option
+        *
+        *     mw.loader.using( 'mediawiki.widgets.SelectWithInputWidget', function () {
+        *       var swi = new mw.widgets.SelectWithInputWidget( {
+        *         or: true,
+        *         dropdowninput: {
+        *           options: [
+        *             { data: 'other', label: 'Other' },
+        *             { data: 'a', label: 'First' },
+        *             { data: 'b', label: 'Second' },
+        *             { data: 'c', label: 'Third' }
+        *           ]
+        *         },
+        *         textinput: {
+        *         }
+        *       } );
+        *
+        *       $( 'body' ).append( swi.$element );
+        *     } );
+        *
+        * @class mw.widgets.SelectWithInputWidget
+        * @extends OO.ui.Widget
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {Object} [dropdowninput] Config for the dropdown
+        * @cfg {Object} [textinput] Config for the text input
+        * @cfg {boolean} [or=false] Config for whether the widget is dropdown AND input
+        *                           or dropdown OR input
+        */
+       mw.widgets.SelectWithInputWidget = function MwWidgetsSelectWithInputWidget( config ) {
+               // Config initialization
+               config = $.extend( { or: false }, config );
+
+               // Properties
+               this.textinput = new OO.ui.TextInputWidget( config.textinput );
+               this.dropdowninput = new OO.ui.DropdownInputWidget( config.dropdowninput );
+
+               if ( config.or === true ) {
+                       this.dropdowninput.on( 'change', this.onChange.bind( this ) );
+                       this.onChange();
+               }
+
+               // Parent constructor
+               mw.widgets.SelectWithInputWidget.parent.call( this, config );
+
+               // Initialization
+               this.$element
+                       .addClass( 'mw-widget-selectWithInputWidget' )
+                       .append(
+                               this.dropdowninput.$element,
+                               this.textinput.$element
+                       );
+       };
+
+       /* Setup */
+       OO.inheritClass( mw.widgets.SelectWithInputWidget, OO.ui.Widget );
+
+       /* Static Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.SelectWithInputWidget.static.reusePreInfuseDOM = function ( node, config ) {
+               config = mw.widgets.SelectWithInputWidget.parent.static.reusePreInfuseDOM( node, config );
+               config.dropdowninput = OO.ui.DropdownInputWidget.static.reusePreInfuseDOM(
+                       $( node ).find( '.oo-ui-dropdownInputWidget' ),
+                       config.dropdowninput
+               );
+               config.textinput = OO.ui.TextInputWidget.static.reusePreInfuseDOM(
+                       $( node ).find( '.oo-ui-textInputWidget' ),
+                       config.textinput
+               );
+               return config;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.SelectWithInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+               var state = mw.widgets.SelectWithInputWidget.parent.static.gatherPreInfuseState( node, config );
+               state.dropdowninput = OO.ui.DropdownInputWidget.static.gatherPreInfuseState(
+                       $( node ).find( '.oo-ui-dropdownInputWidget' ),
+                       config.dropdowninput
+               );
+               state.textinput = OO.ui.TextInputWidget.static.gatherPreInfuseState(
+                       $( node ).find( '.oo-ui-textInputWidget' ),
+                       config.textinput
+               );
+               return state;
+       };
+
+       /* Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.SelectWithInputWidget.prototype.restorePreInfuseState = function ( state ) {
+               mw.widgets.SelectWithInputWidget.parent.prototype.restorePreInfuseState.call( this, state );
+               this.dropdowninput.restorePreInfuseState( state.dropdowninput );
+               this.textinput.restorePreInfuseState( state.textinput );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.SelectWithInputWidget.prototype.setDisabled = function ( disabled ) {
+               mw.widgets.SelectWithInputWidget.parent.prototype.setDisabled.call( this, disabled );
+               this.textinput.setDisabled( disabled );
+               this.dropdowninput.setDisabled( disabled );
+       };
+
+       /**
+        * Handle change events on the DropdownInput
+        *
+        * @param {string|undefined} value
+        * @private
+        */
+       mw.widgets.SelectWithInputWidget.prototype.onChange = function ( value ) {
+               value = value || this.dropdowninput.getValue();
+               this.textinput.$element.toggle( value === 'other' );
+       };
+
+}( jQuery, mediaWiki ) );
index 37e6e1a..51508ab 100644 (file)
                } );
 
                // Highlight matching parts of link suggestion
-               this.$label.autoEllipsis( { hasSpan: false, tooltip: true, matchText: config.query } );
+               this.$label
+                       .highlightText( config.query )
+                       .attr( 'title', config.data );
 
                if ( config.missing ) {
                        this.$label.addClass( 'new' );
+               } else if ( config.redirect ) {
+                       this.$label.addClass( 'mw-redirect' );
+               } else if ( config.disambiguation ) {
+                       this.$label.addClass( 'mw-disambig' );
                }
 
                if ( config.imageUrl ) {
index 70d7cb5..d7464b9 100644 (file)
@@ -85,7 +85,7 @@
         *
         * @return {Array} usernames
         */
-       mw.widgets.UsersMultiselectWidget.prototype.getSelectedUsernames = function() {
+       mw.widgets.UsersMultiselectWidget.prototype.getSelectedUsernames = function () {
                return this.getItemsData();
        };
 
@@ -94,7 +94,7 @@
         *
         * @private
         */
-       mw.widgets.UsersMultiselectWidget.prototype.updateMenuItems = function() {
+       mw.widgets.UsersMultiselectWidget.prototype.updateMenuItems = function () {
                var inputValue = this.$input.val();
 
                if ( inputValue === this.inputValue ) {
                                // character to uppercase so that "fo" may yield "Foo".
                                auprefix: inputValue[ 0 ].toUpperCase() + inputValue.slice( 1 ),
                                aulimit: this.limit
-                       } ).done( function( response ) {
+                       } ).done( function ( response ) {
                                var suggestions = response.query.allusers,
                                        selected = this.getSelectedUsernames();
 
                                                        label: user.name
                                                } );
                                        }
-                               } ).filter( function( item ) {
+                               } ).filter( function ( item ) {
                                        return item !== undefined;
                                } );
 
         *
         * @private
         */
-       mw.widgets.UsersMultiselectWidget.prototype.updateHiddenInput = function() {
+       mw.widgets.UsersMultiselectWidget.prototype.updateHiddenInput = function () {
                if ( 'hiddenInput' in this ) {
                        this.hiddenInput.val( this.getSelectedUsernames().join( '\n' ) );
                }
index 37c0c9b..b4639ab 100644 (file)
                        // Handle common MediaWiki API idioms for passing parameters
                        for ( key in parameters ) {
                                // Multiple values are pipe-separated
-                               if ( $.isArray( parameters[ key ] ) ) {
+                               if ( Array.isArray( parameters[ key ] ) ) {
                                        if ( !useUS || parameters[ key ].join( '' ).indexOf( '|' ) === -1 ) {
                                                parameters[ key ] = parameters[ key ].join( '|' );
                                        } else {
index 5299252..f50e59a 100644 (file)
@@ -28,7 +28,7 @@
                                {
                                        formatversion: 2,
                                        action: 'watch',
-                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages )
+                                       titles: Array.isArray( pages ) ? pages.join( '|' ) : String( pages )
                                },
                                addParams
                        )
@@ -37,7 +37,7 @@
                return apiPromise
                        .then( function ( data ) {
                                // If a single page was given (not an array) respond with a single item as well.
-                               return $.isArray( pages ) ? data.watch : data.watch[ 0 ];
+                               return Array.isArray( pages ) ? data.watch : data.watch[ 0 ];
                        } )
                        .promise( { abort: apiPromise.abort } );
        }
index 157ac06..3bf75ae 100644 (file)
@@ -66,7 +66,7 @@
                                funcs = [];
                                fields = [];
                                for ( i = 1; i < l; i++ ) {
-                                       if ( !$.isArray( spec[ i ] ) ) {
+                                       if ( !Array.isArray( spec[ i ] ) ) {
                                                throw new Error( op + ' parameters must be arrays' );
                                        }
                                        v = hideIfParse( $el, spec[ i ] );
                                if ( l !== 2 ) {
                                        throw new Error( 'NOT takes exactly one parameter' );
                                }
-                               if ( !$.isArray( spec[ 1 ] ) ) {
+                               if ( !Array.isArray( spec[ 1 ] ) ) {
                                        throw new Error( 'NOT parameters must be arrays' );
                                }
                                v = hideIfParse( $el, spec[ 1 ] );
diff --git a/resources/src/mediawiki/htmlform/htmlform.Checker.js b/resources/src/mediawiki/htmlform/htmlform.Checker.js
new file mode 100644 (file)
index 0000000..3f53b63
--- /dev/null
@@ -0,0 +1,180 @@
+( function ( mw, $ ) {
+
+       mw.htmlform = {};
+
+       /**
+        * @class mw.htmlform.Checker
+        */
+
+       /**
+        * A helper class to add validation to non-OOUI HtmlForm fields.
+        *
+        * @constructor
+        * @param {jQuery} $element Form field generated by HTMLForm
+        * @param {Function} validator Validation callback
+        * @param {string} validator.value Value of the form field to be validated
+        * @param {jQuery.Promise} validator.return The promise should be resolved
+        *  with an object with two properties: Boolean 'valid' to indicate success
+        *  or failure of validation, and an array 'messages' to be passed to
+        *  setErrors() on failure.
+        */
+       mw.htmlform.Checker = function ( $element, validator ) {
+               this.validator = validator;
+               this.$element = $element;
+
+               this.$errorBox = $element.next( '.error' );
+               if ( !this.$errorBox.length ) {
+                       this.$errorBox = $( '<span>' );
+                       this.$errorBox.hide();
+                       $element.after( this.$errorBox );
+               }
+
+               this.currentValue = this.$element.val();
+       };
+
+       /**
+        * Attach validation events to the form element
+        *
+        * @param {jQuery} [$extraElements] Additional elements to listen for change
+        *  events on.
+        * @return {mw.htmlform.Checker}
+        * @chainable
+        */
+       mw.htmlform.Checker.prototype.attach = function ( $extraElements ) {
+               var $e,
+                       // We need to hook to all of these events to be sure we are
+                       // notified of all changes to the value of an <input type=text>
+                       // field.
+                       events = 'keyup keydown change mouseup cut paste focus blur';
+
+               $e = this.$element;
+               if ( $extraElements ) {
+                       $e = $e.add( $extraElements );
+               }
+               $e.on( events, $.debounce( 1000, this.validate.bind( this ) ) );
+
+               return this;
+       };
+
+       /**
+        * Validate the form element
+        * @return {jQuery.Promise}
+        */
+       mw.htmlform.Checker.prototype.validate = function () {
+               var currentRequestInternal,
+                       that = this,
+                       value = this.$element.val();
+
+               // Abort any pending requests.
+               if ( this.currentRequest && this.currentRequest.abort ) {
+                       this.currentRequest.abort();
+               }
+
+               if ( value === '' ) {
+                       this.currentValue = value;
+                       this.setErrors( [] );
+                       return;
+               }
+
+               this.currentRequest = currentRequestInternal = this.validator( value )
+                       .done( function ( info ) {
+                               var forceReplacement = value !== that.currentValue;
+
+                               // Another request was fired in the meantime, the result we got here is no longer current.
+                               // This shouldn't happen as we abort pending requests, but you never know.
+                               if ( that.currentRequest !== currentRequestInternal ) {
+                                       return;
+                               }
+                               // If we're here, then the current request has finished, avoid calling .abort() needlessly.
+                               that.currentRequest = undefined;
+
+                               that.currentValue = value;
+
+                               if ( info.valid ) {
+                                       that.setErrors( [], forceReplacement );
+                               } else {
+                                       that.setErrors( info.messages, forceReplacement );
+                               }
+                       } ).fail( function () {
+                               that.currentValue = null;
+                               that.setErrors( [] );
+                       } );
+
+               return currentRequestInternal;
+       };
+
+       /**
+        * Display errors associated with the form element
+        * @param {Array} errors Error messages. Each error message will be appended to a
+        *  `<span>` or `<li>`, as with jQuery.append().
+        * @param {boolean} [forceReplacement] Set true to force a visual replacement even
+        *  if the errors are the same. Ignored if errors are empty.
+        * @return {mw.htmlform.Checker}
+        * @chainable
+        */
+       mw.htmlform.Checker.prototype.setErrors = function ( errors, forceReplacement ) {
+               var $oldErrorBox, tagName, showFunc, text, replace,
+                       $errorBox = this.$errorBox;
+
+               if ( errors.length === 0 ) {
+                       $errorBox.slideUp( function () {
+                               $errorBox
+                                       .removeAttr( 'class' )
+                                       .empty();
+                       } );
+               } else {
+                       // Match behavior of HTMLFormField::formatErrors(), <span> or <ul>
+                       // depending on the count.
+                       tagName = errors.length === 1 ? 'span' : 'ul';
+
+                       // We have to animate the replacement if we're changing the tag. We
+                       // also want to if told to by the caller (i.e. to make it visually
+                       // obvious that the changed field value gives the same error) or if
+                       // the error text changes (because it makes more sense than
+                       // changing the text with no animation).
+                       replace = (
+                               forceReplacement || $errorBox.length > 1 ||
+                               $errorBox[ 0 ].tagName.toLowerCase() !== tagName
+                       );
+                       if ( !replace ) {
+                               text = $( '<' + tagName + '>' )
+                                       .append( errors.map( function ( e ) {
+                                               return errors.length === 1 ? e : $( '<li>' ).append( e );
+                                       } ) );
+                               if ( text.text() !== $errorBox.text() ) {
+                                       replace = true;
+                               }
+                       }
+
+                       $oldErrorBox = $errorBox;
+                       if ( replace ) {
+                               this.$errorBox = $errorBox = $( '<' + tagName + '>' );
+                               $errorBox.hide();
+                               $oldErrorBox.after( this.$errorBox );
+                       }
+
+                       showFunc = function () {
+                               if ( $oldErrorBox !== $errorBox ) {
+                                       $oldErrorBox
+                                               .removeAttr( 'class' )
+                                               .detach();
+                               }
+                               $errorBox
+                                       .attr( 'class', 'error' )
+                                       .empty()
+                                       .append( errors.map( function ( e ) {
+                                               return errors.length === 1 ? e : $( '<li>' ).append( e );
+                                       } ) )
+                                       .slideDown();
+                       };
+                       if ( $oldErrorBox !== $errorBox && $oldErrorBox.hasClass( 'error' ) ) {
+                               $oldErrorBox.slideUp( showFunc );
+                       } else {
+                               showFunc();
+                       }
+               }
+
+               return this;
+       };
+
+}( mediaWiki, jQuery ) );
index a53e863..a36b379 100644 (file)
@@ -26,7 +26,7 @@ table.mw-htmlform-nolabel td.mw-label {
 }
 
 tr.mw-htmlform-vertical-label td.mw-label {
-       text-align: left !important;
+       text-align: left !important; /* stylelint-disable-line declaration-no-important */
 }
 
 .mw-icon-question {
index f2b6f5f..8c80cb8 100644 (file)
                return mw.ForeignStructuredUpload.BookletLayout.parent.prototype.initialize.call( this ).then(
                        function () {
                                return $.when(
-                                       // Point the CategorySelector to the right wiki
+                                       // Point the CategoryMultiselectWidget to the right wiki
                                        booklet.upload.getApi().then( function ( api ) {
                                                // If this is a ForeignApi, it will have a apiUrl, otherwise we don't need to do anything
                                                if ( api.apiUrl ) {
-                                                       // Can't reuse the same object, CategorySelector calls #abort on its mw.Api instance
+                                                       // Can't reuse the same object, CategoryMultiselectWidget calls #abort on its mw.Api instance
                                                        booklet.categoriesWidget.api = new mw.ForeignApi( api.apiUrl );
                                                }
                                                return $.Deferred().resolve();
                        multiline: true,
                        autosize: true
                } );
-               this.categoriesWidget = new mw.widgets.CategorySelector( {
+               this.categoriesWidget = new mw.widgets.CategoryMultiselectWidget( {
                        // Can't be done here because we don't know the target wiki yet... done in #initialize.
                        // api: new mw.ForeignApi( ... ),
                        $overlay: this.$overlay
index 0e2af50..6765270 100644 (file)
                        var i, len,
                                pages = this.pages;
 
-                       titles = $.isArray( titles ) ? titles : [ titles ];
+                       titles = Array.isArray( titles ) ? titles : [ titles ];
                        state = state === undefined ? true : !!state;
 
                        for ( i = 0, len = titles.length; i < len; i++ ) {
index 172cac2..3fcbb3f 100644 (file)
@@ -1,4 +1,4 @@
-/* global moment*/
+/* global moment */
 ( function ( $, mw, moment ) {
 
        /**
         */
        mw.Upload.BookletLayout.prototype.uploadFile = function () {
                var deferred = $.Deferred(),
-                       startTime = new Date(),
+                       startTime = mw.now(),
                        layout = this,
                        file = this.getFile();
 
                                deferred.reject( errorMessage );
                        } );
                }, function ( progress ) {
-                       var elapsedTime = new Date() - startTime,
+                       var elapsedTime = mw.now() - startTime,
                                estimatedTotalTime = ( 1 / progress ) * elapsedTime,
                                estimatedRemainingTime = moment.duration( estimatedTotalTime - elapsedTime );
                        layout.emit( 'fileUploadProgress', progress, estimatedRemainingTime );
index 9d9c0a6..1809617 100644 (file)
 
        /* Static Properties */
 
+       /**
+        * @inheritdoc
+        * @property name
+        */
+       mw.Upload.Dialog.static.name = 'mwUploadDialog';
+
        /**
         * @inheritdoc
         * @property title
index 95263ec..59261cd 100644 (file)
                                                // Only copy direct properties, not inherited ones
                                                if ( uri.hasOwnProperty( prop ) ) {
                                                        // Deep copy object properties
-                                                       if ( $.isArray( uri[ prop ] ) || $.isPlainObject( uri[ prop ] ) ) {
+                                                       if ( Array.isArray( uri[ prop ] ) || $.isPlainObject( uri[ prop ] ) ) {
                                                                this[ prop ] = $.extend( true, {}, uri[ prop ] );
                                                        } else {
                                                                this[ prop ] = uri[ prop ];
                                                                        q[ k ] = [ q[ k ] ];
                                                                }
                                                                // Add to the array
-                                                               if ( $.isArray( q[ k ] ) ) {
+                                                               if ( Array.isArray( q[ k ] ) ) {
                                                                        q[ k ].push( v );
                                                                }
                                                        }
                                var args = [];
                                $.each( this.query, function ( key, val ) {
                                        var k = Uri.encode( key ),
-                                               vals = $.isArray( val ) ? val : [ val ];
+                                               vals = Array.isArray( val ) ? val : [ val ];
                                        $.each( vals, function ( i, v ) {
                                                if ( v === null ) {
                                                        args.push( k );
index e3a8f7b..ee3bac2 100644 (file)
@@ -98,6 +98,7 @@
                         */
                        trigger: function () {
                                // use confirm to show the message to the user (if options.text() is true)
+                               // eslint-disable-next-line no-alert
                                if ( options.test() && !confirm( message ) ) {
                                        // the user want to keep the actual page
                                        return false;
index af9eb36..f93df3c 100644 (file)
@@ -115,6 +115,6 @@ td.diff-deletedline .diffchange {
 .diff-otitle,
 .diff-ntitle,
 .diff-lineno {
-       direction: ltr !important;
+       direction: ltr !important; /* stylelint-disable-line declaration-no-important */
        unicode-bidi: embed;
 }
index 0c9ea97..4fedbea 100644 (file)
@@ -66,8 +66,6 @@
                 * assigned to either the A or B buckets. If the experiment were disabled,
                 * then the user would always be assigned to the control bucket.
                 *
-                * This function is based on the deprecated `mw.user.bucket` function.
-                *
                 * @param {Object} experiment
                 * @param {string} experiment.name The name of the experiment
                 * @param {boolean} experiment.enabled Whether or not the experiment is
index 89efae3..2c3e137 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.ui/variables";
+@import 'mediawiki.ui/variables';
 
 .mediawiki-filewarning {
        visibility: hidden;
index dd6bf74..4eed90a 100644 (file)
@@ -1,4 +1,4 @@
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 #mw-indicator-mw-helplink a {
        .background-image-svg('images/help.svg', 'images/help.png');
index 5a37f45..9c7064f 100644 (file)
 }
 /* Generate interpuncts */
 .hlist dt:after {
-       content: ":";
+       content: ':';
 }
 .hlist dd:after,
 .hlist li:after {
-       content: " ·";
+       content: ' ·';
        font-weight: bold;
 }
 .hlist dd:last-child:after,
@@ -57,7 +57,7 @@
 .hlist li dd:first-child:before,
 .hlist li dt:first-child:before,
 .hlist li li:first-child:before {
-       content: "(";
+       content: '(';
        font-weight: normal;
 }
 .hlist dd dd:last-child:after,
@@ -69,7 +69,7 @@
 .hlist li dd:last-child:after,
 .hlist li dt:last-child:after,
 .hlist li li:last-child:after {
-       content: ")";
+       content: ')';
        font-weight: normal;
 }
 /* For IE8 */
@@ -82,7 +82,7 @@
 .hlist li dd.hlist-last-child:after,
 .hlist li dt.hlist-last-child:after,
 .hlist li li.hlist-last-child:after {
-       content: ")";
+       content: ')';
        font-weight: normal;
 }
 /* Put ordinals in front of ordered list items */
        counter-increment: list-item;
 }
 .hlist ol > li:before {
-       content: counter( list-item ) " ";
+       content: counter( list-item ) ' ';
 }
 .hlist dd ol > li:first-child:before,
 .hlist dt ol > li:first-child:before,
 .hlist li ol > li:first-child:before {
-       content: "(" counter( list-item ) " ";
+       content: '(' counter( list-item ) ' ';
 }
index 49f0f70..c692538 100644 (file)
@@ -1,6 +1,6 @@
 /* General-purpose icons via CSS. Classes here should be named "mw-icon-*". */
 
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 /* For the collapsed and expanded arrows, we also provide selectors to make it
  * easy to use them with jquery.makeCollapsible. */
index fdaa989..9332773 100644 (file)
                 */
                getModuleSize: function ( moduleName ) {
                        var module = mw.loader.moduleRegistry[ moduleName ],
-                               payload = 0;
+                               args, i, size;
 
-                       if ( mw.loader.getState( moduleName ) !== 'ready' ) {
+                       if ( module.state !== 'ready' ) {
                                return null;
                        }
 
                        if ( !module.style && !module.script ) {
-                               return null;
+                               return 0;
                        }
 
-                       // Tally CSS
-                       if ( module.style && $.isArray( module.style.css ) ) {
-                               $.each( module.style.css, function ( i, stylesheet ) {
-                                       payload += $.byteLength( stylesheet );
-                               } );
+                       function getFunctionBody( func ) {
+                               return String( func )
+                                       // To ensure a deterministic result, replace the start of the function
+                                       // declaration with a fixed string. For example, in Chrome 55, it seems
+                                       // V8 seemingly-at-random decides to sometimes put a line break between
+                                       // the opening brace and first statement of the function body. T159751.
+                                       .replace( /^\s*function\s*\([^)]*\)\s*{\s*/, 'function(){' )
+                                       .replace( /\s*}\s*$/, '}' );
+                       }
+
+                       // Based on the load.php response for this module.
+                       // For example: `mw.loader.implement("example", function(){}, {"css":[".x{color:red}"]});`
+                       // @see mw.loader.store.set().
+                       args = [
+                               moduleName,
+                               module.script,
+                               module.style,
+                               module.messages,
+                               module.templates
+                       ];
+                       // Trim trailing null or empty object, as load.php would have done.
+                       // @see ResourceLoader::makeLoaderImplementScript and ResourceLoader::trimArray.
+                       i = args.length;
+                       while ( i-- ) {
+                               if ( args[ i ] === null || ( $.isPlainObject( args[ i ] ) && $.isEmptyObject( args[ i ] ) ) ) {
+                                       args.splice( i, 1 );
+                               } else {
+                                       break;
+                               }
                        }
 
-                       // Tally JavaScript
-                       if ( $.isFunction( module.script ) ) {
-                               payload += $.byteLength( module.script.toString() );
+                       size = 0;
+                       for ( i = 0; i < args.length; i++ ) {
+                               if ( typeof args[ i ] === 'function' ) {
+                                       size += $.byteLength( getFunctionBody( args[ i ] ) );
+                               } else {
+                                       size += $.byteLength( JSON.stringify( args[ i ] ) );
+                               }
                        }
 
-                       return payload;
+                       return size;
                },
 
                /**
                                // Use Function.prototype#call to force an exception on Firefox,
                                // which doesn't define console#table but doesn't complain if you
                                // try to invoke it.
+                               // eslint-disable-next-line no-useless-call
                                console.table.call( console, data );
                                return;
                        } catch ( e ) {}
 
                                // Grep module's CSS
                                if (
-                                       $.isPlainObject( module.style ) && $.isArray( module.style.css ) &&
+                                       $.isPlainObject( module.style ) && Array.isArray( module.style.css ) &&
                                        pattern.test( module.style.css.join( '' ) )
                                ) {
                                        // Module's CSS source matches
index c82b9cb..6d3b4f0 100644 (file)
@@ -16,8 +16,7 @@
                parserDefaults = {
                        magic: {
                                PAGENAME: mw.config.get( 'wgPageName' ),
-                               PAGENAMEE: mw.util.wikiUrlencode( mw.config.get( 'wgPageName' ) ),
-                               SITENAME: mw.config.get( 'wgSiteName' )
+                               PAGENAMEE: mw.util.wikiUrlencode( mw.config.get( 'wgPageName' ) )
                        },
                        // Whitelist for allowed HTML elements in wikitext.
                        // Self-closing tags are not currently supported.
@@ -74,7 +73,7 @@
        function appendWithoutParsing( $parent, children ) {
                var i, len;
 
-               if ( !$.isArray( children ) ) {
+               if ( !Array.isArray( children ) ) {
                        children = [ children ];
                }
 
                                // eslint-disable-next-line new-cap
                                parser = new mw.jqueryMsg.parser( options ),
                                key = args[ 0 ],
-                               argsArray = $.isArray( args[ 1 ] ) ? args[ 1 ] : slice.call( args, 1 );
+                               argsArray = Array.isArray( args[ 1 ] ) ? args[ 1 ] : slice.call( args, 1 );
                        try {
                                return parser.parse( key, argsArray );
                        } catch ( e ) {
         * parsers, pass the relevant options to mw.jqueryMsg.parser.
         *
         * @private
-        * @param {Object} data
+        * @param {Object} data New data to extend parser defaults with
+        * @param {boolean} [deep=false] Whether the extend is done recursively (deep)
         */
-       mw.jqueryMsg.setParserDefaults = function ( data ) {
-               $.extend( parserDefaults, data );
+       mw.jqueryMsg.setParserDefaults = function ( data, deep ) {
+               if ( deep ) {
+                       $.extend( true, parserDefaults, data );
+               } else {
+                       $.extend( parserDefaults, data );
+               }
        };
 
        /**
index 7872818..d172a39 100644 (file)
                /* eslint-enable no-bitwise */
        }
 
-       StringSet = window.Set || ( function () {
-               /**
-                * @private
-                * @class
-                */
-               function StringSet() {
-                       this.set = {};
-               }
-               StringSet.prototype.add = function ( value ) {
-                       this.set[ value ] = true;
-               };
-               StringSet.prototype.has = function ( value ) {
-                       return this.set.hasOwnProperty( value );
-               };
-               return StringSet;
-       }() );
+       function defineFallbacks() {
+               // <https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Set>
+               StringSet = window.Set || ( function () {
+                       /**
+                        * @private
+                        * @class
+                        */
+                       function StringSet() {
+                               this.set = {};
+                       }
+                       StringSet.prototype.add = function ( value ) {
+                               this.set[ value ] = true;
+                       };
+                       StringSet.prototype.has = function ( value ) {
+                               return hasOwn.call( this.set, value );
+                       };
+                       return StringSet;
+               }() );
+       }
 
        /**
         * Create an object that can be read from or written to via methods that allow
@@ -82,9 +85,8 @@
         *  copied in one direction only. Changes to globals do not reflect in the map.
         */
        function Map( global ) {
-               this.internalValues = {};
+               this.values = {};
                if ( global === true ) {
-
                        // Override #set to also set the global variable
                        this.set = function ( selection, value ) {
                                var s;
                                return false;
                        };
                }
-
-               // Deprecated since MediaWiki 1.28
-               log.deprecate(
-                       this,
-                       'values',
-                       this.internalValues,
-                       'mw.Map#values is deprecated. Use mw.Map#get() instead.',
-                       'Map-values'
-               );
        }
 
        /**
         * @param {Mixed} value
         */
        function setGlobalMapValue( map, key, value ) {
-               map.internalValues[ key ] = value;
+               map.values[ key ] = value;
                log.deprecate(
                                window,
                                key,
                 *
                 * @param {string|Array} [selection] Key or array of keys to retrieve values for.
                 * @param {Mixed} [fallback=null] Value for keys that don't exist.
-                * @return {Mixed|Object| null} If selection was a string, returns the value,
+                * @return {Mixed|Object|null} If selection was a string, returns the value,
                 *  If selection was an array, returns an object of key/values.
-                *  If no selection is passed, the internal container is returned. (Beware that,
-                *  as is the default in JavaScript, the object is returned by reference.)
+                *  If no selection is passed, a new object with all key/values is returned.
                 */
                get: function ( selection, fallback ) {
                        var results, i;
-                       // If we only do this in the `return` block, it'll fail for the
-                       // call to get() from the mutli-selection block.
                        fallback = arguments.length > 1 ? fallback : null;
 
-                       if ( $.isArray( selection ) ) {
-                               selection = slice.call( selection );
+                       if ( Array.isArray( selection ) ) {
                                results = {};
                                for ( i = 0; i < selection.length; i++ ) {
-                                       results[ selection[ i ] ] = this.get( selection[ i ], fallback );
+                                       if ( typeof selection[ i ] === 'string' ) {
+                                               results[ selection[ i ] ] = hasOwn.call( this.values, selection[ i ] ) ?
+                                                       this.values[ selection[ i ] ] :
+                                                       fallback;
+                                       }
                                }
                                return results;
                        }
 
                        if ( typeof selection === 'string' ) {
-                               if ( !hasOwn.call( this.internalValues, selection ) ) {
-                                       return fallback;
-                               }
-                               return this.internalValues[ selection ];
+                               return hasOwn.call( this.values, selection ) ?
+                                       this.values[ selection ] :
+                                       fallback;
                        }
 
                        if ( selection === undefined ) {
-                               return this.internalValues;
+                               results = {};
+                               for ( i in this.values ) {
+                                       results[ i ] = this.values[ i ];
+                               }
+                               return results;
                        }
 
                        // Invalid selection key
-                       return null;
+                       return fallback;
                },
 
                /**
 
                        if ( $.isPlainObject( selection ) ) {
                                for ( s in selection ) {
-                                       this.internalValues[ s ] = selection[ s ];
+                                       this.values[ s ] = selection[ s ];
                                }
                                return true;
                        }
                        if ( typeof selection === 'string' && arguments.length > 1 ) {
-                               this.internalValues[ selection ] = value;
+                               this.values[ selection ] = value;
                                return true;
                        }
                        return false;
                 * @return {boolean} True if the key(s) exist
                 */
                exists: function ( selection ) {
-                       var s;
-
-                       if ( $.isArray( selection ) ) {
-                               for ( s = 0; s < selection.length; s++ ) {
-                                       if ( typeof selection[ s ] !== 'string' || !hasOwn.call( this.internalValues, selection[ s ] ) ) {
+                       var i;
+                       if ( Array.isArray( selection ) ) {
+                               for ( i = 0; i < selection.length; i++ ) {
+                                       if ( typeof selection[ i ] !== 'string' || !hasOwn.call( this.values, selection[ i ] ) ) {
                                                return false;
                                        }
                                }
                                return true;
                        }
-                       return typeof selection === 'string' && hasOwn.call( this.internalValues, selection );
+                       return typeof selection === 'string' && hasOwn.call( this.values, selection );
                }
        };
 
                }
        };
 
+       defineFallbacks();
+
        /* eslint-disable no-console */
        log = ( function () {
-               // Also update the restoration of methods in mediawiki.log.js
-               // when adding or removing methods here.
+               /**
+                * Write a verbose message to the browser's console in debug mode.
+                *
+                * This method is mainly intended for verbose logging. It is a no-op in production mode.
+                * In ResourceLoader debug mode, it will use the browser's console if available, with
+                * fallback to creating a console interface in the DOM and logging messages there.
+                *
+                * See {@link mw.log} for other logging methods.
+                *
+                * @member mw
+                * @param {...string} msg Messages to output to console.
+                */
                var log = function () {},
                        console = window.console;
 
+               // Note: Keep list of methods in sync with restoration in mediawiki.log.js
+               // when adding or removing mw.log methods below!
+
                /**
+                * Collection of methods to help log messages to the console.
+                *
                 * @class mw.log
                 * @singleton
                 */
 
                /**
-                * Write a message to the console's warning channel.
-                * Actions not supported by the browser console are silently ignored.
+                * Write a message to the browser console's warning channel.
+                *
+                * This method is a no-op in browsers that don't implement the Console API.
                 *
                 * @param {...string} msg Messages to output to console
                 */
                        $.noop;
 
                /**
-                * Write a message to the console's error channel.
+                * Write a message to the browser console's error channel.
+                *
+                * Most browsers also print a stacktrace when calling this method if the
+                * argument is an Error object.
                 *
-                * Most browsers provide a stacktrace by default if the argument
-                * is a caught Error object.
+                * This method is a no-op in browsers that don't implement the Console API.
                 *
                 * @since 1.26
                 * @param {Error|...string} msg Messages to output to console
                        $.noop;
 
                /**
-                * Create a property in a host object that, when accessed, will produce
+                * Create a property on a host object that, when accessed, will produce
                 * a deprecation warning in the console.
                 *
                 * @param {Object} obj Host object of deprecated property
         * @class mw
         */
        mw = {
+               redefineFallbacksForTest: function () {
+                       if ( !window.QUnit ) {
+                               throw new Error( 'Reset not allowed outside unit tests' );
+                       }
+                       defineFallbacks();
+               },
 
                /**
                 * Get the current time, measured in milliseconds since January 1, 1970 (UTC).
                        return mw.message.apply( mw.message, arguments ).toString();
                },
 
-               /**
-                * No-op dummy placeholder for {@link mw.log} in debug mode.
-                *
-                * @method
-                */
+               // Expose mw.log
                log: log,
 
                /**
                                cssBuffer = '',
                                cssBufferTimer = null,
                                cssCallbacks = $.Callbacks(),
-                               isIE9 = document.documentMode === 9,
                                rAF = window.requestAnimationFrame || setTimeout;
 
                        function getMarker() {
                         * @param {Function} [callback]
                         */
                        function addEmbeddedCSS( cssText, callback ) {
-                               var $style, styleEl;
-
                                function fireCallbacks() {
                                        var oldCallbacks = cssCallbacks;
                                        // Reset cssCallbacks variable so it's not polluted by any calls to
                                        cssBuffer = '';
                                }
 
-                               // By default, always create a new <style>. Appending text to a <style> tag is
-                               // is a performance anti-pattern as it requires CSS to be reparsed (T47810).
-                               //
-                               // Support: IE 6-9
-                               // Try to re-use existing <style> tags due to the IE stylesheet limit (T33676).
-                               if ( isIE9 ) {
-                                       $style = $( getMarker() ).prev();
-                                       // Verify that the element before the marker actually is a <style> tag created
-                                       // by mw.loader (not some other style tag, or e.g. a <meta> tag).
-                                       if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) ) {
-                                               styleEl = $style[ 0 ];
-                                               styleEl.appendChild( document.createTextNode( cssText ) );
-                                               fireCallbacks();
-                                               return;
-                                       }
-                                       // Else: No existing tag to reuse. Continue below and create the first one.
-                               }
-
-                               $style = $( newStyleTag( cssText, getMarker() ) );
-
-                               if ( isIE9 ) {
-                                       $style.data( 'ResourceLoaderDynamicStyleTag', true );
-                               }
+                               $( newStyleTag( cssText, getMarker() ) );
 
                                fireCallbacks();
                        }
                         * @return {string} Hash of concatenated version hashes.
                         */
                        function getCombinedVersion( modules ) {
-                               var hashes = $.map( modules, function ( module ) {
+                               var hashes = modules.map( function ( module ) {
                                        return registry[ module ].version;
                                } );
                                return fnv132( hashes.join( '' ) );
                                        el.media = media;
                                }
                                // If you end up here from an IE exception "SCRIPT: Invalid property value.",
-                               // see #addEmbeddedCSS, T33676, and T49277 for details.
+                               // see #addEmbeddedCSS, T33676, T43331, and T49277 for details.
                                el.href = url;
 
                                $( getMarker() ).before( el );
                                registry[ module ].state = 'executing';
 
                                runScript = function () {
-                                       var script, markModuleReady, nestedAddScript, legacyWait, implicitDependencies,
-                                               // Expand to include dependencies since we have to exclude both legacy modules
-                                               // and their dependencies from the legacyWait (to prevent a circular dependency).
-                                               legacyModules = resolve( mw.config.get( 'wgResourceLoaderLegacyModules', [] ) );
+                                       var script, markModuleReady, nestedAddScript, implicitDependencies, implicitWait;
 
                                        script = registry[ module ].script;
                                        markModuleReady = function () {
                                                } );
                                        };
 
-                                       implicitDependencies = ( $.inArray( module, legacyModules ) !== -1 ) ?
-                                               [] :
-                                               legacyModules;
+                                       implicitDependencies = [];
 
                                        if ( module === 'user' ) {
                                                // Implicit dependency on the site module. Not real dependency because
                                                implicitDependencies.push( 'site' );
                                        }
 
-                                       legacyWait = implicitDependencies.length ?
+                                       implicitWait = implicitDependencies.length ?
                                                mw.loader.using( implicitDependencies ) :
                                                $.Deferred().resolve();
 
-                                       legacyWait.always( function () {
+                                       implicitWait.always( function () {
                                                try {
-                                                       if ( $.isArray( script ) ) {
+                                                       if ( Array.isArray( script ) ) {
                                                                nestedAddScript( script, markModuleReady, 0 );
                                                        } else if ( typeof script === 'function' ) {
                                                                // Pass jQuery twice so that the signature of the closure which wraps
 
                                                // Array of css strings in key 'css',
                                                // or back-compat array of urls from media-type
-                                               if ( $.isArray( value ) ) {
+                                               if ( Array.isArray( value ) ) {
                                                        for ( i = 0; i < value.length; i++ ) {
                                                                if ( key === 'bc-url' ) {
                                                                        // back-compat: { <media>: [url, ..] }
                                                // "https://example.org/x.js", "http://example.org/x.js", "//example.org/x.js", "/x.js"
                                                if ( /^(https?:)?\/?\//.test( modules ) ) {
                                                        if ( type === 'text/css' ) {
-                                                               // Support: IE 7-8
-                                                               // Use properties instead of attributes as IE throws security
-                                                               // warnings when inserting a <link> tag with a protocol-relative
-                                                               // URL set though attributes - when on HTTPS. See T43331.
                                                                l = document.createElement( 'link' );
                                                                l.rel = 'stylesheet';
                                                                l.href = modules;
                                 * @return {Array}
                                 */
                                getModuleNames: function () {
-                                       return $.map( registry, function ( i, key ) {
-                                               return key;
-                                       } );
+                                       return Object.keys( registry );
                                },
 
                                /**
         * @member mw.hook
         */
        $( function () {
-               var loading = $.grep( mw.loader.getModuleNames(), function ( module ) {
+               var loading, modules;
+
+               modules = $.grep( mw.loader.getModuleNames(), function ( module ) {
                        return mw.loader.getState( module ) === 'loading';
                } );
                // We only need a callback, not any actual module. First try a single using()
                // for all loading modules. If one fails, fall back to tracking each module
                // separately via $.when(), this is expensive.
-               loading = mw.loader.using( loading ).then( null, function () {
-                       var all = $.map( loading, function ( module ) {
+               loading = mw.loader.using( modules ).then( null, function () {
+                       var all = modules.map( function ( module ) {
                                return mw.loader.using( module ).then( null, function () {
                                        return $.Deferred().resolve();
                                } );
index 4d23604..969e872 100644 (file)
        var original = mw.log,
                slice = Array.prototype.slice;
 
-       /**
-        * Logs a message to the console in debug mode.
-        *
-        * In the case the browser does not have a console API, a console is created on-the-fly by appending
-        * a `<div id="mw-log-console">` element to the bottom of the body and then appending this and future
-        * messages to that, instead of the console.
-        *
-        * @member mw.log
-        * @param {...string} msg Messages to output to console.
-        */
        mw.log = function () {
                // Turn arguments into an array
                var args = slice.call( arguments ),
index 147de92..633798d 100644 (file)
@@ -1,7 +1,8 @@
 .mw-notification-area {
        top: 0;
        right: 0;
-       padding: 1em 1em 0 0;
+       /* Padding on all sides so drop shadows aren't cut by overflow: hidden */
+       padding: 1em;
        width: 20em;
        line-height: 1.35;
        z-index: 10000;
index 4849f5a..d36c4a0 100644 (file)
                defaults: {
                        autoHide: true,
                        autoHideSeconds: 'short',
-                       tag: false,
-                       title: undefined,
-                       type: false
+                       tag: null,
+                       title: null,
+                       type: null
                },
 
                /**
index 822c814..5b3519e 100644 (file)
@@ -3,7 +3,7 @@
  * in MediaWiki (used e.g. on Special:ListFiles).
  */
 
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
 
 .TablePager {
        min-width: 80%;
        .background-image-svg('images/arrow-sort-descending.svg', 'images/arrow-sort-descending.png');
 }
 
-.TablePager_nav {
-       margin: 0 auto;
-}
-
-.TablePager_nav td {
-       padding: 3px;
+.TablePager_nav.oo-ui-buttonGroupWidget {
+       display: block;
        text-align: center;
-       vertical-align: center;
-}
-
-.TablePager_nav a {
-       text-decoration: none;
-}
-
-.TablePager_nav td.TablePager_nav-first .TablePager_nav-disabled {
-       padding-top: 25px;
-       background: none center top no-repeat;
-       .background-image-svg('images/pager-arrow-disabled-fastforward-rtl.svg', 'images/pager-arrow-disabled-fastforward-rtl.png');
-}
-
-.TablePager_nav td.TablePager_nav-prev .TablePager_nav-disabled {
-       padding-top: 25px;
-       background: none center top no-repeat;
-       .background-image-svg('images/pager-arrow-disabled-forward-rtl.svg', 'images/pager-arrow-disabled-forward-rtl.png');
-}
-
-.TablePager_nav td.TablePager_nav-next .TablePager_nav-disabled {
-       padding-top: 25px;
-       background: none center top no-repeat;
-       .background-image-svg('images/pager-arrow-disabled-forward-ltr.svg', 'images/pager-arrow-disabled-forward-ltr.png');
-}
-
-.TablePager_nav td.TablePager_nav-last .TablePager_nav-disabled {
-       padding-top: 25px;
-       background: none center top no-repeat;
-       .background-image-svg('images/pager-arrow-disabled-fastforward-ltr.svg', 'images/pager-arrow-disabled-fastforward-ltr.png');
-}
-
-.TablePager_nav td.TablePager_nav-first .TablePager_nav-enabled {
-       padding-top: 25px;
-       background: none center top no-repeat;
-       .background-image-svg('images/pager-arrow-fastforward-rtl.svg', 'images/pager-arrow-fastforward-rtl.png');
-}
-
-.TablePager_nav td.TablePager_nav-prev .TablePager_nav-enabled {
-       padding-top: 25px;
-       background: none center top no-repeat;
-       .background-image-svg('images/pager-arrow-forward-rtl.svg', 'images/pager-arrow-forward-rtl.png');
-}
-
-.TablePager_nav td.TablePager_nav-next .TablePager_nav-enabled {
-       padding-top: 25px;
-       background: none center top no-repeat;
-       .background-image-svg('images/pager-arrow-forward-ltr.svg', 'images/pager-arrow-forward-ltr.png');
-}
-
-.TablePager_nav td.TablePager_nav-last .TablePager_nav-enabled {
-       padding-top: 25px;
-       background: none center top no-repeat;
-       .background-image-svg('images/pager-arrow-fastforward-ltr.svg', 'images/pager-arrow-fastforward-ltr.png');
+       margin: 1em;
 }
index d414232..6a6aa15 100644 (file)
         *  immediate execution after this amount of time (in milliseconds) if it didn't run
         *  by that time.
         */
-       mw.requestIdleCallback = mw.requestIdleCallbackInternal;
-       /*
-       // XXX: Polyfill disabled due to https://bugs.chromium.org/p/chromium/issues/detail?id=647870
-       mw.requestIdleCallback = window.requestIdleCallback
+       mw.requestIdleCallback = window.requestIdleCallback ?
                // Bind because it throws TypeError if context is not window
-               ? window.requestIdleCallback.bind( window )
-               : mw.requestIdleCallbackInternal;
-       */
+               window.requestIdleCallback.bind( window ) :
+               mw.requestIdleCallbackInternal;
+       // Note: Polyfill was previously disabled due to
+       // https://bugs.chromium.org/p/chromium/issues/detail?id=647870
+       // See also <http://codepen.io/Krinkle/full/XNGEvv>
 }( mediaWiki ) );
index 2e09392..95c77f8 100644 (file)
        };
 
        /**
-         * Set a value in device storage.
-         *
-         * @param {string} key Key name to store under
-         * @param {string} value Value to be stored
-         * @return {boolean} Whether the save succeeded or not
-         */
+        * Set a value in device storage.
+        *
+        * @param {string} key Key name to store under
+        * @param {string} value Value to be stored
+        * @return {boolean} Whether the save succeeded or not
+        */
        SafeStorage.prototype.set = function ( key, value ) {
                try {
                        this.store.setItem( key, value );
        };
 
        /**
-         * Remove a value from device storage.
-         *
-         * @param {string} key Key of item to remove
-         * @return {boolean} Whether the save succeeded or not
-         */
+        * Remove a value from device storage.
+        *
+        * @param {string} key Key of item to remove
+        * @return {boolean} Whether the save succeeded or not
+        */
        SafeStorage.prototype.remove = function ( key ) {
                try {
                        this.store.removeItem( key );
index 0955c23..9ef6c43 100644 (file)
@@ -3,56 +3,60 @@
 
        // Table of contents toggle
        mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               var $toc, $tocTitle, $tocToggleLink, $tocList, hideToc;
-               $toc = $content.find( '#toc' );
-               $tocTitle = $content.find( '#toctitle' );
-               $tocToggleLink = $content.find( '#togglelink' );
-               $tocList = $toc.find( 'ul' ).eq( 0 );
+               $content.find( '.toc' ).addBack( '.toc' ).each( function () {
+                       var hideToc,
+                               $this = $( this ),
+                               // .toctitle is new so may not exist in HTML caches for a few weeks,
+                               // so keep checking for #toctitle for now
+                               $tocTitle = $this.find( '.toctitle, #toctitle' ),
+                               $tocToggleLink = $this.find( '.togglelink' ),
+                               $tocList = $this.find( 'ul' ).eq( 0 );
 
-               // Hide/show the table of contents element
-               function toggleToc() {
-                       if ( $tocList.is( ':hidden' ) ) {
-                               $tocList.slideDown( 'fast' );
-                               $tocToggleLink.text( mw.msg( 'hidetoc' ) );
-                               $toc.removeClass( 'tochidden' );
-                               mw.cookie.set( 'hidetoc', null );
-                       } else {
-                               $tocList.slideUp( 'fast' );
-                               $tocToggleLink.text( mw.msg( 'showtoc' ) );
-                               $toc.addClass( 'tochidden' );
-                               mw.cookie.set( 'hidetoc', '1' );
+                       // Hide/show the table of contents element
+                       function toggleToc() {
+                               if ( $tocList.is( ':hidden' ) ) {
+                                       $tocList.slideDown( 'fast' );
+                                       $tocToggleLink.text( mw.msg( 'hidetoc' ) );
+                                       $this.removeClass( 'tochidden' );
+                                       mw.cookie.set( 'hidetoc', null );
+                               } else {
+                                       $tocList.slideUp( 'fast' );
+                                       $tocToggleLink.text( mw.msg( 'showtoc' ) );
+                                       $this.addClass( 'tochidden' );
+                                       mw.cookie.set( 'hidetoc', '1' );
+                               }
                        }
-               }
 
-               // Only add it if there is a complete TOC and it doesn't
-               // have a toggle added already
-               if ( $toc.length && $tocTitle.length && $tocList.length && !$tocToggleLink.length ) {
-                       hideToc = mw.cookie.get( 'hidetoc' ) === '1';
+                       // Only add it if there is a complete TOC and it doesn't
+                       // have a toggle added already
+                       if ( $tocTitle.length && $tocList.length && !$tocToggleLink.length ) {
+                               hideToc = mw.cookie.get( 'hidetoc' ) === '1';
 
-                       $tocToggleLink = $( '<a role="button" tabindex="0" id="togglelink"></a>' )
-                               .text( mw.msg( hideToc ? 'showtoc' : 'hidetoc' ) )
-                               .on( 'click keypress', function ( e ) {
-                                       if (
-                                               e.type === 'click' ||
-                                               e.type === 'keypress' && e.which === 13
-                                       ) {
-                                               toggleToc();
-                                       }
-                               } );
+                               $tocToggleLink = $( '<a role="button" tabindex="0" class="togglelink"></a>' )
+                                       .text( mw.msg( hideToc ? 'showtoc' : 'hidetoc' ) )
+                                       .on( 'click keypress', function ( e ) {
+                                               if (
+                                                       e.type === 'click' ||
+                                                       e.type === 'keypress' && e.which === 13
+                                               ) {
+                                                       toggleToc();
+                                               }
+                                       } );
 
-                       $tocTitle.append(
-                               $tocToggleLink
-                                       .wrap( '<span class="toctoggle"></span>' )
-                                       .parent()
-                                               .prepend( '&nbsp;[' )
-                                               .append( ']&nbsp;' )
-                       );
+                               $tocTitle.append(
+                                       $tocToggleLink
+                                               .wrap( '<span class="toctoggle"></span>' )
+                                               .parent()
+                                                       .prepend( '&nbsp;[' )
+                                                       .append( ']&nbsp;' )
+                               );
 
-                       if ( hideToc ) {
-                               $tocList.hide();
-                               $toc.addClass( 'tochidden' );
+                               if ( hideToc ) {
+                                       $tocList.hide();
+                                       $this.addClass( 'tochidden' );
+                               }
                        }
-               }
+               } );
        } );
 
 }( mediaWiki, jQuery ) );
index da2c08f..5f6eb25 100644 (file)
@@ -1,4 +1,5 @@
 #toc.tochidden,
+.toc.tochidden,
 .toctoggle {
        display: none;
 }
diff --git a/resources/src/mediawiki/mediawiki.user.blockcookie.js b/resources/src/mediawiki/mediawiki.user.blockcookie.js
deleted file mode 100644 (file)
index ffff039..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-( function ( mw ) {
-
-       // If a user has been autoblocked, a cookie is set.
-       // Its value is replicated here in localStorage to guard against cookie-removal.
-       // This module will only be loaded when $wgCookieSetOnAutoblock is true.
-       // Ref: https://phabricator.wikimedia.org/T5233
-
-       if ( !mw.cookie.get( 'BlockID' ) && mw.storage.get( 'blockID' ) ) {
-               // The block ID exists in storage, but not in the cookie.
-               mw.cookie.set( 'BlockID', mw.storage.get( 'blockID' ) );
-
-       } else if ( parseInt( mw.cookie.get( 'BlockID' ), 10 ) > 0 && !mw.storage.get( 'blockID' ) ) {
-               // The block ID exists in the cookie, but not in storage.
-               // (When a block expires the cookie remains but its value is '', hence the integer check above.)
-               mw.storage.set( 'blockID', mw.cookie.get( 'BlockID' ) );
-
-       } else if ( mw.cookie.get( 'BlockID' ) === '' && mw.storage.get( 'blockID' ) ) {
-               // If only the empty string is in the cookie, remove the storage value. The block is no longer valid.
-               mw.storage.remove( 'blockID' );
-
-       }
-
-}( mediaWiki ) );
index c4c91f9..65e9e41 100644 (file)
                },
 
                /**
-                * Get an automatically generated random ID (stored in a session cookie)
+                * Get an automatically generated random ID (persisted in sessionStorage)
                 *
-                * This ID is ephemeral for everyone, staying in their browser only until they close
-                * their browser.
+                * This ID is ephemeral for everyone, staying in their browser only until they
+                * close their browsing session.
                 *
                 * @return {string} Random session ID
                 */
                sessionId: function () {
-                       var sessionId = mw.cookie.get( 'mwuser-sessionId' );
-                       if ( sessionId === null ) {
+                       var sessionId = mw.storage.session.get( 'mwuser-sessionId' );
+                       if ( !sessionId ) {
                                sessionId = mw.user.generateRandomSessionId();
-                               mw.cookie.set( 'mwuser-sessionId', sessionId, { expires: null } );
+                               mw.storage.session.set( 'mwuser-sessionId', sessionId );
                        }
                        return sessionId;
                },
                        return mw.user.getName() || mw.user.sessionId();
                },
 
-               /**
-                * Get the user's bucket (place them in one if not done already)
-                *
-                *     mw.user.bucket( 'test', {
-                *         buckets: { ignored: 50, control: 25, test: 25 },
-                *         version: 1,
-                *         expires: 7
-                *     } );
-                *
-                * @deprecated since 1.23
-                * @param {string} key Name of bucket
-                * @param {Object} options Bucket configuration options
-                * @param {Object} options.buckets List of bucket-name/relative-probability pairs (required,
-                *  must have at least one pair)
-                * @param {number} [options.version=0] Version of bucket test, changing this forces
-                *  rebucketing
-                * @param {number} [options.expires=30] Length of time (in days) until the user gets
-                *  rebucketed
-                * @return {string} Bucket name - the randomly chosen key of the `options.buckets` object
-                */
-               bucket: function ( key, options ) {
-                       var cookie, parts, version, bucket,
-                               range, k, rand, total;
-
-                       options = $.extend( {
-                               buckets: {},
-                               version: 0,
-                               expires: 30
-                       }, options || {} );
-
-                       cookie = mw.cookie.get( 'mwuser-bucket:' + key );
-
-                       // Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
-                       if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) !== -1 ) {
-                               parts = cookie.split( ':' );
-                               if ( parts.length > 1 && Number( parts[ 0 ] ) === options.version ) {
-                                       version = Number( parts[ 0 ] );
-                                       bucket = String( parts[ 1 ] );
-                               }
-                       }
-
-                       if ( bucket === undefined ) {
-                               if ( !$.isPlainObject( options.buckets ) ) {
-                                       throw new Error( 'Invalid bucket. Object expected for options.buckets.' );
-                               }
-
-                               version = Number( options.version );
-
-                               // Find range
-                               range = 0;
-                               for ( k in options.buckets ) {
-                                       range += options.buckets[ k ];
-                               }
-
-                               // Select random value within range
-                               rand = Math.random() * range;
-
-                               // Determine which bucket the value landed in
-                               total = 0;
-                               for ( k in options.buckets ) {
-                                       bucket = k;
-                                       total += options.buckets[ k ];
-                                       if ( total >= rand ) {
-                                               break;
-                                       }
-                               }
-
-                               mw.cookie.set(
-                                       'mwuser-bucket:' + key,
-                                       version + ':' + bucket,
-                                       { expires: Number( options.expires ) * 86400 }
-                               );
-                       }
-
-                       return bucket;
-               },
-
                /**
                 * Get the current user's groups
                 *
index 78634f6..4844e21 100644 (file)
@@ -8,42 +8,6 @@
         */
        var util = {
 
-               /**
-                * Initialisation
-                * (don't call before document ready)
-                */
-               init: function () {
-                       util.$content = ( function () {
-                               var i, l, $node, selectors;
-
-                               selectors = [
-                                       // The preferred standard is class "mw-body".
-                                       // You may also use class "mw-body mw-body-primary" if you use
-                                       // mw-body in multiple locations. Or class "mw-body-primary" if
-                                       // you use mw-body deeper in the DOM.
-                                       '.mw-body-primary',
-                                       '.mw-body',
-
-                                       // If the skin has no such class, fall back to the parser output
-                                       '#mw-content-text',
-
-                                       // Should never happen... well, it could if someone is not finished writing a
-                                       // skin and has not yet inserted bodytext yet.
-                                       'body'
-                               ];
-
-                               for ( i = 0, l = selectors.length; i < l; i++ ) {
-                                       $node = $( selectors[ i ] );
-                                       if ( $node.length ) {
-                                               return $node.first();
-                                       }
-                               }
-
-                               // Preserve existing customized value in case it was preset
-                               return util.$content;
-                       }() );
-               },
-
                /* Main body */
 
                /**
                 * This function returns the styleSheet object for convience (due to cross-browsers
                 * difference as to where it is located).
                 *
-                *     var sheet = mw.util.addCSS( '.foobar { display: none; }' );
+                *     var sheet = util.addCSS( '.foobar { display: none; }' );
                 *     $( foo ).click( function () {
                 *         // Toggle the sheet on and off
                 *         sheet.disabled = !sheet.disabled;
                /**
                 * The content wrapper of the skin (e.g. `.mw-body`).
                 *
-                * Populated on document ready by #init. To use this property,
-                * wait for `$.ready` and be sure to have a module depedendency on
-                * `mediawiki.util` and `mediawiki.page.startup` which will ensure
-                * your document ready handler fires after #init.
+                * Populated on document ready. To use this property,
+                * wait for `$.ready` and be sure to have a module dependency on
+                * `mediawiki.util` which will ensure
+                * your document ready handler fires after initialization.
                 *
                 * Because of the lazy-initialised nature of this property,
                 * you're discouraged from using it.
                 * (e.g. `document.getElementById( 'foobar' )`) or a jQuery-selector
                 * (e.g. `'#foobar'`) for that item.
                 *
-                *     mw.util.addPortletLink(
+                *     util.addPortletLink(
                 *         'p-tb', 'https://www.mediawiki.org/',
                 *         'mediawiki.org', 't-mworg', 'Go to mediawiki.org', 'm', '#t-print'
                 *     );
                 *
-                *     var node = mw.util.addPortletLink(
+                *     var node = util.addPortletLink(
                 *         'p-tb',
                 *         new mw.Title( 'Special:Example' ).getUrl(),
                 *         'Example'
                        block = allowBlock ? '(?:\\/(?:12[0-8]|1[01][0-9]|[1-9]?\\d))?' : '';
                        RE_IPV6_ADD =
                                '(?:' + // starts with "::" (including "::")
-                               ':(?::|(?::' + '[0-9A-Fa-f]{1,4}' + '){1,7})' +
-                               '|' + // ends with "::" (except "::")
-                               '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){0,6}::' +
-                               '|' + // contains no "::"
-                               '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){7}' +
+                                       ':(?::|(?::' +
+                                               '[0-9A-Fa-f]{1,4}' +
+                                       '){1,7})' +
+                                       '|' + // ends with "::" (except "::")
+                                       '[0-9A-Fa-f]{1,4}' +
+                                       '(?::' +
+                                               '[0-9A-Fa-f]{1,4}' +
+                                       '){0,6}::' +
+                                       '|' + // contains no "::"
+                                       '[0-9A-Fa-f]{1,4}' +
+                                       '(?::' +
+                                               '[0-9A-Fa-f]{1,4}' +
+                                       '){7}' +
                                ')';
 
                        if ( new RegExp( '^' + RE_IPV6_ADD + block + '$' ).test( address ) ) {
                        }
 
                        // contains one "::" in the middle (single '::' check below)
-                       RE_IPV6_ADD = '[0-9A-Fa-f]{1,4}' + '(?:::?' + '[0-9A-Fa-f]{1,4}' + '){1,6}';
+                       RE_IPV6_ADD =
+                               '[0-9A-Fa-f]{1,4}' +
+                               '(?:::?' +
+                                       '[0-9A-Fa-f]{1,4}' +
+                               '){1,6}';
 
                        return (
                                new RegExp( '^' + RE_IPV6_ADD + block + '$' ).test( address ) &&
                return true;
        }, 'Use mw.notify instead.' );
 
+       /**
+        * Initialisation of mw.util.$content
+        */
+       function init() {
+               util.$content = ( function () {
+                       var i, l, $node, selectors;
+
+                       selectors = [
+                               // The preferred standard is class "mw-body".
+                               // You may also use class "mw-body mw-body-primary" if you use
+                               // mw-body in multiple locations. Or class "mw-body-primary" if
+                               // you use mw-body deeper in the DOM.
+                               '.mw-body-primary',
+                               '.mw-body',
+
+                               // If the skin has no such class, fall back to the parser output
+                               '#mw-content-text'
+                       ];
+
+                       for ( i = 0, l = selectors.length; i < l; i++ ) {
+                               $node = $( selectors[ i ] );
+                               if ( $node.length ) {
+                                       return $node.first();
+                               }
+                       }
+
+                       // Should never happen... well, it could if someone is not finished writing a
+                       // skin and has not yet inserted bodytext yet.
+                       return $( 'body' );
+               }() );
+       }
+
+       /**
+        * Former public initialisation. Now a no-op function.
+        *
+        * @method util_init
+        * @deprecated since 1.30
+        */
+       mw.log.deprecate( util, 'init', $.noop, 'Remove the call of mw.util.init().', 'mw.util.init' );
+
+       $( init );
+
        mw.util = util;
+       module.exports = util;
 
 }( mediaWiki, jQuery ) );
index 3cb8e9d..6e9ff0e 100644 (file)
@@ -89,7 +89,7 @@
 
        /**
         * @property {jQuery} $container If the gallery contained in an element that is
-        *      not the main content element, then it stores that element.
+        *   not the main content element, then it stores that element.
         */
 
        /**
 
        /**
         * @property {number} imageHeight Height of the image based on viewport size
-        *      the URLs in the required size.
+        *   the URLs in the required size.
         */
 
        /* Setup */
index d228f3e..1f6c8a6 100644 (file)
@@ -1,6 +1,4 @@
 ( function ( mw, $ ) {
-       var supportsPlaceholder = 'placeholder' in document.createElement( 'input' );
-
        // Break out of framesets
        if ( mw.config.get( 'wgBreakFrames' ) ) {
                // Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet)
        }
 
        mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               var $sortableTables;
+               var $sortable, $collapsible;
 
-               // Run jquery.placeholder polyfill if placeholder is not supported
-               if ( !supportsPlaceholder ) {
-                       $content.find( 'input[placeholder]' ).placeholder();
+               $collapsible = $content.find( '.mw-collapsible' );
+               if ( $collapsible.length ) {
+                       // Preloaded by Skin::getDefaultModules()
+                       mw.loader.using( 'jquery.makeCollapsible', function () {
+                               $collapsible.makeCollapsible();
+                       } );
                }
 
-               // Run jquery.makeCollapsible
-               $content.find( '.mw-collapsible' ).makeCollapsible();
-
-               // Lazy load jquery.tablesorter
-               $sortableTables = $content.find( 'table.sortable' );
-               if ( $sortableTables.length ) {
+               $sortable = $content.find( 'table.sortable' );
+               if ( $sortable.length ) {
+                       // Preloaded by Skin::getDefaultModules()
                        mw.loader.using( 'jquery.tablesorter', function () {
-                               $sortableTables.tablesorter();
+                               $sortable.tablesorter();
                        } );
                }
 
        $( function () {
                var $nodes;
 
-               if ( !supportsPlaceholder ) {
-                       // Exclude content to avoid hitting it twice for the (first) wikipage content
-                       $( 'input[placeholder]' ).not( '#mw-content-text input' ).placeholder();
-               }
-
                // Add accesskey hints to the tooltips
                $( '[accesskey]' ).updateTooltipAccessKeys();
 
                         */
                        mw.hook( 'wikipage.categories' ).fire( $nodes );
                }
+
+               $( '#t-print a' ).click( function ( e ) {
+                       window.print();
+                       e.preventDefault();
+               } );
        } );
 
 }( mediaWiki, jQuery ) );
index 076357a..49cfd8a 100644 (file)
@@ -1,10 +1,7 @@
 ( function ( mw, $ ) {
 
-       mw.page = {};
-
        $( function () {
                var $diff;
-               mw.util.init();
 
                /**
                 * Fired when wiki content is being added to the DOM
index 7d35cb7..6322ccd 100644 (file)
@@ -5,8 +5,9 @@
  * @class mw.page.watch.ajax
  */
 ( function ( mw, $ ) {
-       // The name of the page to watch or unwatch
-       var title = mw.config.get( 'wgRelevantPageName' );
+       var watch,
+               // The name of the page to watch or unwatch
+               title = mw.config.get( 'wgRelevantPageName' );
 
        /**
         * Update the link text, link href attribute and (if applicable)
        }
 
        // Expose public methods
-       mw.page.watch = {
+       watch = {
                updateWatchLink: updateWatchLink
        };
+       module.exports = watch;
+
+       // Deprecated since 1.30
+       mw.log.deprecate( mw, 'page',
+               { watch: watch },
+               'Use require( \'mediawiki.page.watch.ajax\' ) instead.',
+               'mw.page'
+       );
 
        $( function () {
                var $links = $( '.mw-watchlink a, a.mw-watchlink' );
index 8aba831..bafb86a 100644 (file)
@@ -1,42 +1,44 @@
-/* global moment, mw */
+/* global mediaWiki, moment */
 
-// HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
-// wgTranslateNumerals is respected.
-moment.updateLocale( moment.locale(), {
-       preparse: function ( s ) {
-               var i,
-                       table = mw.language.getDigitTransformTable();
-               if ( mw.config.get( 'wgTranslateNumerals' ) ) {
-                       for ( i = 0; i < 10; i++ ) {
-                               if ( table[ i ] !== undefined ) {
-                                       s = s.replace( new RegExp( mw.RegExp.escape( table[ i ] ), 'g' ), i );
+( function ( mw ) {
+       // HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
+       // wgTranslateNumerals is respected.
+       moment.updateLocale( moment.locale(), {
+               preparse: function ( s ) {
+                       var i,
+                               table = mw.language.getDigitTransformTable();
+                       if ( mw.config.get( 'wgTranslateNumerals' ) ) {
+                               for ( i = 0; i < 10; i++ ) {
+                                       if ( table[ i ] !== undefined ) {
+                                               s = s.replace( new RegExp( mw.RegExp.escape( table[ i ] ), 'g' ), i );
+                                       }
                                }
                        }
-               }
-               // HACK: momentjs replaces commas in some languages, which is the only other use of preparse
-               // aside from digit transformation. We can only override preparse, not extend it, so we
-               // have to replicate the comma replacement functionality here.
-               if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
-                       s = s.replace( /،/g, ',' );
-               }
-               return s;
-       },
-       postformat: function ( s ) {
-               var i,
-                       table = mw.language.getDigitTransformTable();
-               if ( mw.config.get( 'wgTranslateNumerals' ) ) {
-                       for ( i = 0; i < 10; i++ ) {
-                               if ( table[ i ] !== undefined ) {
-                                       s = s.replace( new RegExp( i, 'g' ), table[ i ] );
+                       // HACK: momentjs replaces commas in some languages, which is the only other use of preparse
+                       // aside from digit transformation. We can only override preparse, not extend it, so we
+                       // have to replicate the comma replacement functionality here.
+                       if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
+                               s = s.replace( /،/g, ',' );
+                       }
+                       return s;
+               },
+               postformat: function ( s ) {
+                       var i,
+                               table = mw.language.getDigitTransformTable();
+                       if ( mw.config.get( 'wgTranslateNumerals' ) ) {
+                               for ( i = 0; i < 10; i++ ) {
+                                       if ( table[ i ] !== undefined ) {
+                                               s = s.replace( new RegExp( i, 'g' ), table[ i ] );
+                                       }
                                }
                        }
+                       // HACK: momentjs replaces commas in some languages, which is the only other use of postformat
+                       // aside from digit transformation. We can only override postformat, not extend it, so we
+                       // have to replicate the comma replacement functionality here.
+                       if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
+                               s = s.replace( /,/g, '،' );
+                       }
+                       return s;
                }
-               // HACK: momentjs replaces commas in some languages, which is the only other use of postformat
-               // aside from digit transformation. We can only override postformat, not extend it, so we
-               // have to replicate the comma replacement functionality here.
-               if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
-                       s = s.replace( /,/g, '،' );
-               }
-               return s;
-       }
-} );
+       } );
+}( mediaWiki ) );
diff --git a/resources/src/polyfill-nodeTypes.js b/resources/src/polyfill-nodeTypes.js
deleted file mode 100644 (file)
index c8acc86..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Adds window.Node with node types according to:
- * https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
- */
-
-window.Node = window.Node || {
-       ELEMENT_NODE: 1,
-       ATTRIBUTE_NODE: 2,
-       TEXT_NODE: 3,
-       CDATA_SECTION_NODE: 4,
-       ENTITY_REFERENCE_NODE: 5,
-       ENTITY_NODE: 6,
-       PROCESSING_INSTRUCTION_NODE: 7,
-       COMMENT_NODE: 8,
-       DOCUMENT_NODE: 9,
-       DOCUMENT_TYPE_NODE: 10,
-       DOCUMENT_FRAGMENT_NODE: 11,
-       NOTATION_NODE: 12
-};
diff --git a/resources/src/polyfill-object-create.js b/resources/src/polyfill-object-create.js
deleted file mode 100644 (file)
index 607faf6..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Simplified version of es5-sham#Object-create that also works around a bug
- * in the actual es5-sham: https://github.com/es-shims/es5-shim/issues/252
- *
- * Does not:
- * - Support empty inheritance via `Object.create(null)`.
- * - Support getter and setter accessors via `Object.create( .., properties )`.
- * - Support custom property descriptor (e.g. writable, configurtable, enumerable).
- * - Leave behind an enumerable "__proto__" all over the place.
- *
- * @author Timo Tijhof, 2014
- */
-
-// ES5 15.2.3.5
-// http://es5.github.com/#x15.2.3.5
-if ( !Object.create ) {
-       ( function () {
-               var hasOwn = Object.hasOwnProperty,
-                       // https://developer.mozilla.org/en-US/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
-                       // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
-                       isEnumBug = !{ valueOf: 0 }.propertyIsEnumerable( 'valueOf' );
-
-               // Reusable constructor function for Object.create
-               function Empty() {}
-
-               function defineProperty( object, key, property ) {
-                       if ( hasOwn.call( property, 'value' ) ) {
-                               object[ key ] = property.value;
-                       } else {
-                               object[ key ] = property;
-                       }
-               }
-
-               Object.create = function create( prototype, properties ) {
-                       var object, key;
-
-                       if ( prototype !== Object( prototype ) ) {
-                               throw new TypeError( 'Called on non-object' );
-                       }
-
-                       Empty.prototype = prototype;
-                       object = new Empty();
-
-                       if ( properties !== undefined ) {
-                               if ( !isEnumBug ) {
-                                       for ( key in properties ) {
-                                               if ( hasOwn.call( properties, key ) ) {
-                                                       defineProperty( object, key, properties[ key ] );
-                                               }
-                                       }
-                               } else {
-                                       Object.keys( properties ).forEach( function ( key ) {
-                                               defineProperty( object, key, properties[ key ] );
-                                       } );
-                               }
-                       }
-
-                       return object;
-               };
-
-       }() );
-}
index deb280a..d672d76 100644 (file)
@@ -1,44 +1,41 @@
 /**
- * Code in this file MUST work on even the most ancient of browsers!
+ * This file is where we decide whether to initialise the Grade A run-time.
  *
- * This file is where we decide whether to initialise the modern run-time.
+ * - Beware: This file MUST parse without errors on even the most ancient of browsers!
+ * - Beware: Do not call mwNow before the isCompatible() check.
  */
 
-/* global mw, $VARS, $CODE */
-
-var mwPerformance = ( window.performance && performance.mark ) ? performance : {
-               mark: function () {}
-       },
-       // Define now() here to ensure valid comparison with mediaWikiLoadEnd (T153819).
-       mwNow = ( function () {
-               var perf = window.performance,
-                       navStart = perf && perf.timing && perf.timing.navigationStart;
-               return navStart && typeof perf.now === 'function' ?
-                       function () { return navStart + perf.now(); } :
-                       function () { return +new Date(); };
-       }() ),
-       // eslint-disable-next-line no-unused-vars
-       mediaWikiLoadStart = mwNow();
-
-mwPerformance.mark( 'mwLoadStart' );
+/* global mw, mwPerformance, mwNow, isCompatible, $VARS, $CODE */
+
+window.mwPerformance = ( window.performance && performance.mark ) ? performance : {
+       mark: function () {}
+};
+// Define now() here to ensure valid comparison with mediaWikiLoadEnd (T153819).
+window.mwNow = ( function () {
+       var perf = window.performance,
+               navStart = perf && perf.timing && perf.timing.navigationStart;
+       return navStart && typeof perf.now === 'function' ?
+               function () { return navStart + perf.now(); } :
+               function () { return Date.now(); };
+}() );
 
 /**
  * See <https://www.mediawiki.org/wiki/Compatibility#Browsers>
  *
  * Capabilities required for modern run-time:
+ * - ECMAScript 5
  * - DOM Level 4 & Selectors API Level 1
  * - HTML5 & Web Storage
  * - DOM Level 2 Events
- * - JSON
  *
  * Browsers we support in our modern run-time (Grade A):
- * - Chrome 4+
- * - IE 9+
- * - Firefox 3.5+
+ * - Chrome 13+
+ * - IE 10+
+ * - Firefox 4+
  * - Safari 5+
- * - Opera 10.5+
- * - Mobile Safari (iOS 4+)
- * - Android 2.0+
+ * - Opera 12.10+
+ * - Mobile Safari 5.1+ (iOS 5+)
+ * - Android 4.1+
  *
  * Browsers we support in our no-javascript run-time (Grade C):
  * - Chrome 1+
@@ -46,6 +43,8 @@ mwPerformance.mark( 'mwLoadStart' );
  * - Firefox 3+
  * - Safari 3+
  * - Opera 10+
+ * - Mobile Safari 5.0+ (iOS 4+)
+ * - Android 2.0+
  * - WebOS < 1.5
  * - PlayStation
  * - Symbian-based browsers
@@ -61,9 +60,17 @@ mwPerformance.mark( 'mwLoadStart' );
  * @param {string} [str] User agent, defaults to navigator.userAgent
  * @return {boolean} User agent is compatible with MediaWiki JS
  */
-function isCompatible( str ) {
+window.isCompatible = function ( str ) {
        var ua = str || navigator.userAgent;
        return !!(
+               // http://caniuse.com/#feat=es5
+               // http://caniuse.com/#feat=use-strict
+               // http://caniuse.com/#feat=json / https://phabricator.wikimedia.org/T141344#2784065
+               ( function () {
+                       'use strict';
+                       return !this && !!Function.prototype.bind && !!window.JSON;
+               }() ) &&
+
                // http://caniuse.com/#feat=queryselector
                'querySelector' in document &&
 
@@ -75,10 +82,6 @@ function isCompatible( str ) {
                // http://caniuse.com/#feat=addeventlistener
                'addEventListener' in window &&
 
-               // http://caniuse.com/#feat=json
-               // https://phabricator.wikimedia.org/T141344#2784065
-               ( window.JSON && JSON.stringify && JSON.parse ) &&
-
                // Hardcoded exceptions for browsers that pass the requirement but we don't want to
                // support in the modern run-time.
                // Note: Please extend the regex instead of adding new ones
@@ -87,7 +90,7 @@ function isCompatible( str ) {
                        ua.match( /PlayStation/i )
                )
        );
-}
+};
 
 // Conditional script injection
 ( function () {
@@ -147,6 +150,9 @@ function isCompatible( str ) {
                };
        }
 
+       window.mediaWikiLoadStart = mwNow();
+       mwPerformance.mark( 'mwLoadStart' );
+
        script = document.createElement( 'script' );
        script.src = $VARS.baseModulesUri;
        script.onload = script.onreadystatechange = function () {
diff --git a/tests/.gitignore b/tests/.gitignore
deleted file mode 100644 (file)
index eb56bcc..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-# Puppet-managed dependencies for browser tests
-.bundle
-.gem
-.ruby-version
diff --git a/tests/browser/README.mediawiki b/tests/browser/README.mediawiki
deleted file mode 100644 (file)
index 2265762..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-Purpose:
-
-The purpose of these tests is to validate that a newly installed (or updated, or hacked, or whatever) mediawiki instance presents to the user a set of expected features, regardless of what language the wiki is in, or where it is installed, or what extensions it might have.
-
-The tests are based on the basic definition of a wiki, a website where anyone
-
-* can read a page
-* can create a page
-* can edit a page
-* can link one page to another page
-
-Install:
-
-Ruby 1.9.3 or higher is required
-Firefox browser is required
-::
- cd /tests/browser
- gem update --system
- gem install bundler
- bundle install
-
-Run the tests:
-
-Edit the environment_variables file with appropriate values for your wiki
-$source environment_variables (example shown in bash shell)
-
-bundle exec cucumber features/
-
-Note that the acceptance tests will create three pages in your wiki entitled "Editing Test Page", "Link Source Test Page", and "Link Target Test Page".  These pages may be deleted at any time.  If you wish to re-run the tests at any time, these test pages will be re-created or reset to their original contents at the time that the tests run.
-
-For more information about running Selenium tests please see
-https://github.com/wikimedia/mediawiki-selenium
-
-Details:
-
-create_account.feature
-* Checks three different ways to arrive on page allowing the user to create an account
-
-create_and_follow_wiki_link.feature:
-* uses the mediawiki API to create a link target page
-* uses the mediawiki API to create a link source page
-* navigates a browser to the link source page
-* clicks the link in that page to the link target page
-* validates that the browser has in fact followed the link to the target page correctly
-
-edit_page.feature:
-* uses the mediawiki API to create an editable page on the wiki
-* navigates a browser to the page
-* clicks the Edit button to invoke the basic editor
-* edits the page with a particular string containing a static part and also a quasi-unique random part
-* saves the edited page
-* checks that the saved page contains the particular string with which the page was edited
-
-main_page.feature:
-* navigates a browser to the default landing page of the wiki
-* checks for the View History link on the landing page
-* checks for the full set of of sidebar links that should exist on every mediawiki wiki
-
-view_history.feature
-* similar to edit_page.feature but checks for an older version of the edited page
-
-Notes:
-
-Tested on beta labs hewiki, dewiki, enwiki, and on a local installation of mediawiki
\ No newline at end of file
diff --git a/tests/browser/ci.yml b/tests/browser/ci.yml
deleted file mode 100644 (file)
index 8c9865e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-BROWSER:
-  - firefox
-
-MEDIAWIKI_ENVIRONMENT:
-  - beta
-
-PLATFORM:
-  - Linux
diff --git a/tests/browser/environments.yml b/tests/browser/environments.yml
deleted file mode 100644 (file)
index 3f451f1..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-# Customize this configuration as necessary to provide defaults for various
-# test environments.
-#
-# The set of defaults to use is determined by the MEDIAWIKI_ENVIRONMENT
-# environment variable.
-#
-#   export MEDIAWIKI_ENVIRONMENT=mw-vagrant-host
-#   bundle exec cucumber
-#
-# Additional variables set by the environment will override the corresponding
-# defaults defined here.
-#
-#   export MEDIAWIKI_ENVIRONMENT=mw-vagrant-host
-#   export MEDIAWIKI_USER=Selenium_user2
-#   bundle exec cucumber
-#
-mw-vagrant-host: &default
-  user_factory: true
-  mediawiki_url: http://127.0.0.1:8080/wiki/
-
-mw-vagrant-guest:
-  user_factory: true
-  mediawiki_url: http://127.0.0.1/wiki/
-  headless: 'true'
-
-beta:
-  mediawiki_url: https://en.wikipedia.beta.wmflabs.org/wiki/
-  mediawiki_user: Selenium_user
-  # mediawiki_password: SET THIS IN THE ENVIRONMENT!
-
-test2:
-  mediawiki_url: https://test2.wikipedia.org/wiki/
-  mediawiki_user: Selenium_user
-  # mediawiki_password: SET THIS IN THE ENVIRONMENT!
-
-integration:
-  user_factory: true
-  # mediawiki_url: THIS WILL BE SET BY JENKINS
-
-default: *default
diff --git a/tests/browser/features/create_account.feature b/tests/browser/features/create_account.feature
deleted file mode 100644 (file)
index 8029182..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-@chrome @firefox @vagrant
-Feature: Create account
-
-  Scenario Outline: Go to Create account page
-    Given I go to Create account page at <path>
-    Then form has Create account button
-
-  Examples:
-    | path                          |
-    | Special:CreateAccount         |
-    | Special:UserLogin/signup      |
-    | Special:UserLogin?type=signup |
-
-  Scenario: If no username is entered then an error is displayed
-    Given I go to Create account page at Special:CreateAccount
-    When I submit the form
-    Then an error message is displayed
diff --git a/tests/browser/features/create_and_follow_wiki_link.feature b/tests/browser/features/create_and_follow_wiki_link.feature
deleted file mode 100644 (file)
index 510c467..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-@chrome @firefox @vagrant
-Feature: Create Page With Wiki Link
-
-  Scenario: Create Page With Wiki Link
-    Given I create page "Link Target Test Page" with content "Link Target Test Page"
-      And I go to the "Link Source Test Page" page with content "This is a [[Link Target Test Page|link to the test target page]] right here."
-    When I click the Link Target link
-    Then I should be on the Link Target Test Page
-      And the page content should contain "Link Target Test Page"
diff --git a/tests/browser/features/edit_page.feature b/tests/browser/features/edit_page.feature
deleted file mode 100644 (file)
index 0a5d3cd..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-@chrome @firefox @skip @vagrant
-Feature: Edit Page
-
-  Scenario: Create and edit page
-    Given I go to the "Editing Test Page" page with content "This is a page to test editing"
-    When I click Edit
-      And I edit the page with "Edited and a random string"
-      And I click Preview
-      And I click Show Changes
-      And I save the edit
-    Then the edited page content should contain "Edited and a random string"
diff --git a/tests/browser/features/file.feature b/tests/browser/features/file.feature
deleted file mode 100644 (file)
index 0b59c88..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-@chrome @firefox @vagrant
-Feature: File
-
- Scenario: Anonymous goes to file that does not exist
-   Given I am at file that does not exist
-   Then page should show that no such file exists
-
- Scenario: Logged-in user goes to file that does not exist
-   Given I am logged in
-     And I am at file that does not exist
-   Then page should show that no such file exists
diff --git a/tests/browser/features/login.feature b/tests/browser/features/login.feature
deleted file mode 100644 (file)
index 8922234..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-@chrome @firefox @vagrant
-Feature: Log in
-
-  Background:
-    Given I am at Log in page
-
-  Scenario: Go to Log in page
-    Then Username element should be there
-      And Password element should be there
-      And Log in element should be there
-
-  Scenario: Log in without entering credentials
-    When I log in without entering credentials
-    Then error message should be displayed for username
-
-  Scenario: Log in without entering password
-    When I log in without entering password
-    Then error message should be displayed for password
-
-  Scenario: Log in with incorrect username
-    When I log in with incorrect username
-    Then error box should be visible
-
-  Scenario: Log in with incorrect password
-    When I log in with incorrect password
-    Then error box should be visible
-
-  Scenario: Log in with valid credentials
-    When I log in
-    Then error box should not be visible
diff --git a/tests/browser/features/main_page_links.feature b/tests/browser/features/main_page_links.feature
deleted file mode 100644 (file)
index 1f3621b..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-@chrome @firefox @vagrant
-Feature: Main Page View History Links
-
-  Background:
-  Given I open the main wiki URL
-
-  Scenario: Main Page View History links exist
-    Then I should see a link for View History
-
-  Scenario: Main Page Sidebar Links
-    Then I should see a link for Recent changes
-      And I should see a link for Random page
-      And I should see a link for Help
-      And I should see a link for What links here
-      And I should see a link for Related changes
-      And I should see a link for Special pages
-      And I should see a link for Printable version
-      And I should see a link for Permanent link
-      And I should see a link for Page information
diff --git a/tests/browser/features/preferences.feature b/tests/browser/features/preferences.feature
deleted file mode 100644 (file)
index 23663c2..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-@chrome @firefox @vagrant
-Feature: Preferences
-
-  Scenario: Preferences Appearance
-    Given I am logged in
-    When I navigate to Preferences
-      And I click Appearance
-    Then I can select skin Vector
-      And I can select image size
-      And I can select thumbnail size
-      And I can select Threshold for stub link
-      And I can select underline preferences
-      And I have advanced options checkboxes
-      And I can click Save
-      And I can restore default settings
-      And I can select date format
-      And I can see time offset section
-      And I can see local time
-      And I can select my time zone
-
-  Scenario: Preferences Editing
-    Given I am logged in
-    When I navigate to Preferences
-      And I click Editing
-    Then I can select edit area font style
-      And I can select section editing via edit links
-      And I can select section editing by right clicking
-      And I can select section editing by double clicking
-      And I can select to prompt me when entering a blank edit summary
-      And I can select to warn me when I leave an edit page with unsaved changes
-      And I can select show edit toolbar
-      And I can select show preview on first edit
-      And I can select show preview before edit box
-      And I can select live preview
-
-  Scenario: Preferences User profile
-    Given I am logged in
-    When I navigate to Preferences
-      And I click User profile
-    Then I can see my Basic informations
-      And I can change my language
-      And I can change my gender
-      And I can see my signature
-      And I can change my signature
-      And I can see my email
-      And I can click Save
-      And I can restore default settings
diff --git a/tests/browser/features/step_definitions/create_account_steps.rb b/tests/browser/features/step_definitions/create_account_steps.rb
deleted file mode 100644 (file)
index d9b4f52..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-Given(/^I go to Create account page at (.+)$/) do |path|
-  visit(CreateAccountPage, using_params: { page_title: path })
-end
-
-Then(/^form has Create account button$/) do
-  expect(on(CreateAccountPage).create_account_element).to exist
-end
-
-When(/^I submit the form$/) do
-  on(CreateAccountPage).create_account
-end
-
-Then(/^an error message is displayed$/) do
-  expect(on(CreateAccountPage).error_message_element).to exist
-end
diff --git a/tests/browser/features/step_definitions/create_and_follow_wiki_link_steps.rb b/tests/browser/features/step_definitions/create_and_follow_wiki_link_steps.rb
deleted file mode 100644 (file)
index 504d345..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-Given(/^I go to the "(.+)" page with content "(.+)"$/) do |page_title, page_content|
-  @wikitext = page_content
-  api.create_page page_title, page_content
-  step "I am on the #{page_title} page"
-end
-
-Given(/^I am on the (.+) page$/) do |article|
-  article = article.gsub(/ /, '_')
-  visit(ZtargetPage, using_params: { article_name: article })
-end
-
-Given(/^I create page "(.*?)" with content "(.*?)"$/) do |page_title, page_content|
-  api.create_page page_title, page_content
-end
-
-When(/^I click the Link Target link$/) do
-  on(ZtargetPage).link_target_page_link
-end
-
-Then(/^I should be on the Link Target Test Page$/) do
-  expect(@browser.url).to match /Link_Target_Test_Page/
-end
-
-Then(/^the page content should contain "(.*?)"$/) do |content|
-  expect(on(ZtargetPage).page_content).to match content
-end
diff --git a/tests/browser/features/step_definitions/edit_page_steps.rb b/tests/browser/features/step_definitions/edit_page_steps.rb
deleted file mode 100644 (file)
index 0e0aeb1..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-When(/^I click Edit$/) do
-  on(MainPage).edit_link
-end
-
-When(/^I click Preview$/) do
-  on(EditPage).preview_button
-end
-
-When(/^I click Show Changes$/) do
-  on(EditPage).show_changes_button
-end
-
-When(/^I edit the page with "(.*?)"$/) do |edit_content|
-  on(EditPage).edit_page_content_element.send_keys(edit_content + @random_string)
-end
-
-When(/^I save the edit$/) do
-  on(EditPage).save_button
-end
-
-Then(/^the edited page content should contain "(.*?)"$/) do |content|
-  expect(on(MainPage).page_content).to match(content + @random_string)
-end
diff --git a/tests/browser/features/step_definitions/file_steps.rb b/tests/browser/features/step_definitions/file_steps.rb
deleted file mode 100644 (file)
index 15069b2..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-Given(/^I am at file that does not exist$/) do
-  visit(FileDoesNotExistPage, using_params: { page_name: @random_string })
-end
-
-Then(/^page should show that no such file exists$/) do
-  expect(on(FileDoesNotExistPage).file_does_not_exist_message_element).to be_visible
-end
diff --git a/tests/browser/features/step_definitions/login_steps.rb b/tests/browser/features/step_definitions/login_steps.rb
deleted file mode 100644 (file)
index 14a2d76..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-Given(/^I am at Log in page$/) do
-  visit LoginPage
-end
-
-When(/^I log in$/) do
-  on(LoginPage).login_with(user, password, false)
-end
-
-When(/^I log in with incorrect password$/) do
-  on(LoginPage).login_with(user, 'incorrect password', false)
-end
-
-When(/^I log in with incorrect username$/) do
-  on(LoginPage).login_with('incorrect username', password, false)
-end
-
-When(/^I log in without entering credentials$/) do
-  on(LoginPage).login_with('', '', false)
-end
-
-When(/^I log in without entering password$/) do
-  on(LoginPage).login_with(user, '', false)
-end
-
-Then(/^error box should be visible$/) do
-  expect(on(LoginPage).error_message_element).to exist
-end
-
-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
-    expect(page.feedback).to match Regexp.escape(feedback)
-  end
-end
-
-Then(/^Log in element should be there$/) do
-  expect(on(LoginPage).login_element).to exist
-end
-
-Then(/^main page should open$/) do
-  expect(@browser.url).to eq on(MainPage).class.url
-end
-
-Then(/^Password element should be there$/) do
-  expect(on(LoginPage).password_element).to exist
-end
-
-Then(/^there should be a link to (.+)$/) do |text|
-  expect(on(LoginPage).username_displayed_element.when_present.text).to eq text
-end
-
-Then(/^Username element should be there$/) do
-  expect(on(LoginPage).username_element).to exist
-end
diff --git a/tests/browser/features/step_definitions/main_page_links_steps.rb b/tests/browser/features/step_definitions/main_page_links_steps.rb
deleted file mode 100644 (file)
index 7f588c0..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-Given(/^I open the main wiki URL$/) do
-  visit(MainPage)
-end
-
-Then(/^I should see a link for View History$/) do
-  expect(on(MainPage).view_history_link_element).to be_visible
-end
-
-Then(/^I should see a link for Edit$/) do
-  expect(on(MainPage).edit_link_element).to be_visible
-end
-
-Then(/^I should see a link for Recent changes$/) do
-  expect(on(MainPage).recent_changes_link_element).to be_visible
-end
-
-Then(/^I should see a link for Random page$/) do
-  expect(on(MainPage).random_page_link_element).to be_visible
-end
-
-Then(/^I should see a link for Help$/) do
-  expect(on(MainPage).help_link_element).to be_visible
-end
-
-Then(/^I should see a link for What links here$/) do
-  expect(on(MainPage).what_links_here_link_element).to be_visible
-end
-
-Then(/^I should see a link for Related changes$/) do
-  expect(on(MainPage).related_changes_link_element).to be_visible
-end
-
-Then(/^I should see a link for Special pages$/) do
-  expect(on(MainPage).special_pages_link_element).to be_visible
-end
-
-Then(/^I should see a link for Printable version$/) do
-  expect(on(MainPage).printable_version_link_element).to be_visible
-end
-
-Then(/^I should see a link for Permanent link$/) do
-  expect(on(MainPage).permanent_link_link_element).to be_visible
-end
-
-Then(/^I should see a link for Page information$/) do
-  expect(on(MainPage).page_information_link_element).to be_visible
-end
diff --git a/tests/browser/features/step_definitions/preferences_appearance_steps.rb b/tests/browser/features/step_definitions/preferences_appearance_steps.rb
deleted file mode 100644 (file)
index 8ffdaf1..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-When(/^I click Appearance$/) do
-  visit(PreferencesPage).appearance_link_element.when_present.click
-end
-
-When(/^I navigate to Preferences$/) do
-  visit(PreferencesPage)
-end
-
-Then(/^I can click Save$/) do
-  expect(on(PreferencesPage).save_button_element).to exist
-end
-
-Then(/^I can restore default settings$/) do
-  expect(on(PreferencesAppearancePage).restore_default_link_element).to exist
-end
-
-Then(/^I can see local time$/) do
-  expect(on(PreferencesAppearancePage).local_time_span_element).to exist
-end
-
-Then(/^I can see time offset section$/) do
-  expect(on(PreferencesAppearancePage).time_offset_table_element).to be_visible
-end
-
-Then(/^I can select date format$/) do
-  on(PreferencesAppearancePage) do |page|
-    expect(page.no_preference_radio_element).to exist
-    expect(page.mo_day_year_radio_element).to exist
-    expect(page.day_mo_year_radio_element).to exist
-    expect(page.year_mo_day_radio_element).to exist
-    expect(page.iso_8601_radio_element).to exist
-  end
-end
-
-Then(/^I can select image size$/) do
-  expect(on(PreferencesAppearancePage).size_select_element).to exist
-end
-
-Then(/^I can select my time zone$/) do
-  on(PreferencesAppearancePage) do |page|
-    expect(page.time_offset_select_element).to exist
-    expect(page.other_offset_element).to exist
-  end
-end
-
-Then(/^I can select skin Vector$/) do
-  on(PreferencesAppearancePage) do |page|
-    expect(page.vector_element).to exist
-  end
-end
-
-Then(/^I can select Threshold for stub link$/) do
-  expect(on(PreferencesAppearancePage).threshold_select_element).to exist
-end
-
-Then(/^I can select thumbnail size$/) do
-  expect(on(PreferencesAppearancePage).thumb_select_element).to exist
-end
-
-Then(/^I can select underline preferences$/) do
-  expect(on(PreferencesAppearancePage).underline_select_element).to exist
-end
-
-Then(/^I have advanced options checkboxes$/) do
-  on(PreferencesAppearancePage) do |page|
-    expect(page.hidden_categories_check_element).to exist
-    expect(page.auto_number_check_element).to exist
-  end
-end
diff --git a/tests/browser/features/step_definitions/preferences_editing_steps.rb b/tests/browser/features/step_definitions/preferences_editing_steps.rb
deleted file mode 100644 (file)
index f691ffd..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-When(/^I click Editing$/) do
-  visit(PreferencesPage).editing_link_element.when_present.click
-end
-
-Then(/^I can select edit area font style$/) do
-  expect(on(PreferencesEditingPage).edit_area_font_style_select_element.when_present).to exist
-end
-
-Then(/^I can select live preview$/) do
-  expect(on(PreferencesEditingPage).live_preview_check_element.when_present).to exist
-end
-
-Then(/^I can select section editing by double clicking$/) do
-  expect(on(PreferencesEditingPage).edit_section_double_click_check_element.when_present).to exist
-end
-
-Then(/^I can select section editing by right clicking$/) do
-  expect(on(PreferencesEditingPage).edit_section_right_click_check_element.when_present).to exist
-end
-
-Then(/^I can select section editing via edit links$/) do
-  expect(on(PreferencesEditingPage).edit_section_edit_link_element.when_present).to exist
-end
-
-Then(/^I can select show edit toolbar$/) do
-  expect(on(PreferencesEditingPage).show_edit_toolbar_check_element.when_present).to exist
-end
-
-Then(/^I can select show preview before edit box$/) do
-  expect(on(PreferencesEditingPage).preview_on_top_check_element.when_present).to exist
-end
-
-Then(/^I can select show preview on first edit$/) do
-  expect(on(PreferencesEditingPage).preview_on_first_check_element.when_present).to exist
-end
-
-Then(/^I can select to prompt me when entering a blank edit summary$/) do
-  expect(on(PreferencesEditingPage).forced_edit_summary_check_element.when_present).to exist
-end
-
-Then(/^I can select to warn me when I leave an edit page with unsaved changes$/) do
-  expect(on(PreferencesEditingPage).unsaved_changes_check_element.when_present).to exist
-end
diff --git a/tests/browser/features/step_definitions/preferences_user_profile_steps.rb b/tests/browser/features/step_definitions/preferences_user_profile_steps.rb
deleted file mode 100644 (file)
index 5660d49..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-When(/^I click User profile$/) do
-  visit(PreferencesPage).user_profile_link_element.when_present.click
-end
-
-Then(/^I can change my gender$/) do
-  on(PreferencesUserProfilePage) do |page|
-    expect(page.gender_undefined_radio_element).to exist
-    expect(page.gender_male_radio_element).to exist
-    expect(page.gender_female_radio_element).to exist
-  end
-end
-
-Then(/^I can change my language$/) do
-  expect(on(PreferencesUserProfilePage).lang_select_element).to exist
-end
-
-Then(/^I can change my signature$/) do
-  expect(on(PreferencesUserProfilePage).signature_field_element).to exist
-end
-
-Then(/^I can see my Basic informations$/) do
-  expect(on(PreferencesUserProfilePage).basic_info_table_element).to exist
-end
-
-Then(/^I can see my email$/) do
-  expect(on(PreferencesUserProfilePage).email_table_element).to exist
-end
-
-Then(/^I can see my signature$/) do
-  expect(on(PreferencesUserProfilePage).signature_table_element).to exist
-end
diff --git a/tests/browser/features/step_definitions/view_history_steps.rb b/tests/browser/features/step_definitions/view_history_steps.rb
deleted file mode 100644 (file)
index d9b9381..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-When(/^I click View History$/) do
-  on(ViewHistoryPage).view_history_link
-end
-
-Then(/^I should see a link to a previous version of the page$/) do
-  expect(on(ViewHistoryPage).old_version_link_element).to be_visible
-end
diff --git a/tests/browser/features/support/env.rb b/tests/browser/features/support/env.rb
deleted file mode 100644 (file)
index c1072b2..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-require 'mediawiki_selenium/cucumber'
-require 'mediawiki_selenium/pages'
-require 'mediawiki_selenium/step_definitions'
diff --git a/tests/browser/features/support/hooks.rb b/tests/browser/features/support/hooks.rb
deleted file mode 100644 (file)
index 85309f3..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-# Needed for cucumber --dry-run -f stepdefs
-require 'page-object'
diff --git a/tests/browser/features/support/pages/create_account_page.rb b/tests/browser/features/support/pages/create_account_page.rb
deleted file mode 100644 (file)
index de12aee..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-class CreateAccountPage
-  include PageObject
-
-  page_url '<%=params[:page_title]%>'
-
-  button(:create_account, id: 'wpCreateaccount')
-  element(:error_message, css: 'input#wpName2:required:invalid')
-end
diff --git a/tests/browser/features/support/pages/edit_page.rb b/tests/browser/features/support/pages/edit_page.rb
deleted file mode 100644 (file)
index b0f6bff..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-class EditPage
-  include PageObject
-
-  text_area(:edit_page_content, id: 'wpTextbox1')
-  button(:preview_button, id: 'wpPreview')
-  button(:show_changes_button, id: 'wpDiff')
-  button(:save_button, id: 'wpSave')
-end
diff --git a/tests/browser/features/support/pages/file_does_not_exist_page.rb b/tests/browser/features/support/pages/file_does_not_exist_page.rb
deleted file mode 100644 (file)
index 632e303..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-class FileDoesNotExistPage
-  include PageObject
-
-  page_url 'File:<%=params[:page_name]%>'
-
-  div(:file_does_not_exist_message, id: 'mw-imagepage-nofile')
-end
diff --git a/tests/browser/features/support/pages/login_page.rb b/tests/browser/features/support/pages/login_page.rb
deleted file mode 100644 (file)
index c119b38..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-require 'page-object'
-
-class LoginPage
-  include PageObject
-
-  page_url 'Special:UserLogin'
-
-  element(:error_message, css: 'div#userloginForm div.error')
-  div(:feedback, class: 'errorbox')
-  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
-  end
-
-  def login_with(username, password, wait_for_logout_element = true)
-    username_element.when_present.send_keys(username)
-    password_element.when_present.send_keys(password)
-    login_element.when_present.click
-    logout_element.when_present(10) if wait_for_logout_element
-  end
-end
diff --git a/tests/browser/features/support/pages/main_page.rb b/tests/browser/features/support/pages/main_page.rb
deleted file mode 100644 (file)
index 3092ab5..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-class MainPage
-  include PageObject
-
-  page_url ''
-
-  a(:edit_link, css: '#ca-edit a')
-  li(:help_link, id: 'n-help')
-  div(:page_content, id: 'content')
-  li(:page_information_link, id: 't-info')
-  li(:permanent_link_link, id: 't-permalink')
-  a(:printable_version_link, css: '#t-print a')
-  li(:random_page_link, id: 'n-randompage')
-  li(:recent_changes_link, id: 'n-recentchanges')
-  li(:related_changes_link, id: 't-recentchangeslinked')
-  li(:special_pages_link, id: 't-specialpages')
-  a(:view_history_link, css: '#ca-history a')
-  li(:what_links_here_link, id: 't-whatlinkshere')
-end
diff --git a/tests/browser/features/support/pages/preferences_appearance_page.rb b/tests/browser/features/support/pages/preferences_appearance_page.rb
deleted file mode 100644 (file)
index c871e64..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-class PreferencesAppearancePage
-  include PageObject
-
-  page_url 'Special:Preferences#mw-prefsection-rendering'
-
-  checkbox(:auto_number_check, id: 'mw-input-wpnumberheadings')
-  radio_button(:day_mo_year_radio, id: 'mw-input-wpdate-dmy')
-  checkbox(:dont_show_aft_check, id: 'mw-input-wparticlefeedback-disable')
-  checkbox(:exclude_from_experiments_check, id: 'mw-input-wpvector-noexperiments')
-  checkbox(:hidden_categories_check, id: 'mw-input-wpshowhiddencats')
-  radio_button(:iso_8601_radio, id: 'mw-input-wpdate-ISO_8601')
-  span(:local_time_span, id: 'wpLocalTime')
-  radio_button(:mo_day_year_radio, id: 'mw-input-wpdate-mdy')
-  radio_button(:no_preference_radio, id: 'mw-input-wpdate-default')
-  text_field(:other_offset, id: 'mw-input-wptimecorrection-other')
-  a(:restore_default_link, id: 'mw-prefs-restoreprefs')
-  select_list(:size_select, id: 'mw-input-wpimagesize')
-  select_list(:threshold_select, id: 'mw-input-wpstubthreshold')
-  select_list(:time_offset_select, id: 'mw-input-wptimecorrection')
-  table(:time_offset_table, id: 'mw-htmlform-timeoffset')
-  select_list(:thumb_select, id: 'mw-input-wpthumbsize')
-  select_list(:underline_select, id: 'mw-input-wpunderline')
-  radio_button(:vector, id: 'mw-input-wpskin-vector')
-  radio_button(:year_mo_day_radio, id: 'mw-input-wpdate-ymd')
-end
diff --git a/tests/browser/features/support/pages/preferences_editing_page.rb b/tests/browser/features/support/pages/preferences_editing_page.rb
deleted file mode 100644 (file)
index 3b54d45..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-class PreferencesEditingPage
-  include PageObject
-
-  page_url 'Special:Preferences#mw-prefsection-rendering'
-
-  select_list(:edit_area_font_style_select, id: 'mw-input-wpeditfont')
-  checkbox(:edit_section_double_click_check, id: 'mw-input-wpeditondblclick')
-  checkbox(:edit_section_edit_link, id: 'mw-input-wpeditsectiononrightclick')
-  checkbox(:edit_section_right_click_check, id: 'mw-input-wpeditsectiononrightclick')
-  checkbox(:forced_edit_summary_check, id: 'mw-input-wpforceeditsummary')
-  checkbox(:live_preview_check, id: 'mw-input-wpuselivepreview')
-  checkbox(:preview_on_first_check, id: 'mw-input-wppreviewonfirst')
-  checkbox(:preview_on_top_check, id: 'mw-input-wppreviewontop')
-  checkbox(:show_edit_toolbar_check, id: 'mw-input-wpshowtoolbar')
-  checkbox(:unsaved_changes_check, id: 'mw-input-wpuseeditwarning')
-end
diff --git a/tests/browser/features/support/pages/preferences_page.rb b/tests/browser/features/support/pages/preferences_page.rb
deleted file mode 100644 (file)
index 1d836ea..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-class PreferencesPage
-  include PageObject
-
-  page_url 'Special:Preferences'
-
-  a(:appearance_link, id: 'preftab-rendering')
-  a(:editing_link, id: 'preftab-editing')
-  a(:user_profile_link, id: 'preftab-personal')
-  button(:save_button, id: 'prefcontrol')
-end
diff --git a/tests/browser/features/support/pages/preferences_user_profile_page.rb b/tests/browser/features/support/pages/preferences_user_profile_page.rb
deleted file mode 100644 (file)
index ab5eb93..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-class PreferencesUserProfilePage
-  include PageObject
-
-  page_url 'Special:Preferences#mw-prefsection-personal'
-
-  table(:basic_info_table, id: 'mw-htmlform-info')
-  link(:change_password_link, text: 'Change password')
-  table(:email_table, id: 'mw-htmlform-email')
-  radio_button(:gender_female_radio, id: 'mw-input-wpgender-male')
-  radio_button(:gender_male_radio, id: 'mw-input-wpgender-female')
-  radio_button(:gender_undefined_radio, id: 'mw-input-wpgender-unknown')
-  select_list(:lang_select, id: 'mw-input-wplanguage')
-  checkbox(:remember_password_check, id: 'mw-input-wprememberpassword')
-  text_field(:signature_field, id: 'mw-input-wpnickname')
-  table(:signature_table, id: 'mw-htmlform-signature')
-end
diff --git a/tests/browser/features/support/pages/view_history_page.rb b/tests/browser/features/support/pages/view_history_page.rb
deleted file mode 100644 (file)
index ee4d757..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-class ViewHistoryPage
-  include PageObject
-
-  a(:view_history_link, css: '#ca-history a')
-  a(:old_version_link, css: '#pagehistory a.mw-changeslist-date')
-end
diff --git a/tests/browser/features/support/pages/ztargetpage.rb b/tests/browser/features/support/pages/ztargetpage.rb
deleted file mode 100644 (file)
index da789e5..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-class ZtargetPage < MainPage
-  include PageObject
-
-  page_url '<%=params[:article_name]%>'
-
-  a(:link_target_page_link, text: 'link to the test target page')
-end
diff --git a/tests/browser/features/view_history.feature b/tests/browser/features/view_history.feature
deleted file mode 100644 (file)
index 8e72bcf..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-@chrome @firefox @skip @vagrant
-Feature: View History
-
-  Scenario: Edit page and view history
-    Given I go to the "History Test Page" page with content "This is a page that will have history"
-    When I click Edit
-      And I edit the page with "Edited and a random string"
-      And I save the edit
-      And the edited page content should contain "Edited and a random string"
-      And I click View History
-    Then I should see a link to a previous version of the page
index b67c9ab..3de3ba7 100644 (file)
@@ -24,6 +24,7 @@
 global $wgAutoloadClasses;
 $testDir = __DIR__ . "/..";
 
+// @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
 $wgAutoloadClasses += [
 
        # tests/common
@@ -63,7 +64,6 @@ $wgAutoloadClasses += [
 
        # tests/phpunit/includes
        'RevisionStorageTest' => "$testDir/phpunit/includes/RevisionStorageTest.php",
-       'TestingAccessWrapper' => "$testDir/phpunit/includes/TestingAccessWrapper.php",
        'TestLogger' => "$testDir/phpunit/includes/TestLogger.php",
 
        # tests/phpunit/includes/api
@@ -130,6 +130,7 @@ $wgAutoloadClasses += [
 
        # tests/phpunit/includes/specialpage
        'SpecialPageTestHelper' => "$testDir/phpunit/includes/specialpage/SpecialPageTestHelper.php",
+       'AbstractChangesListSpecialPageTestCase' => "$testDir/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php",
 
        # tests/phpunit/includes/specials
        'SpecialPageTestBase' => "$testDir/phpunit/includes/specials/SpecialPageTestBase.php",
@@ -158,6 +159,8 @@ $wgAutoloadClasses += [
        'MockDjVuHandler' => "$testDir/phpunit/mocks/media/MockDjVuHandler.php",
        'MockOggHandler' => "$testDir/phpunit/mocks/media/MockOggHandler.php",
        'MockMediaHandlerFactory' => "$testDir/phpunit/mocks/media/MockMediaHandlerFactory.php",
+       'MockChangesListFilter' => "$testDir/phpunit/mocks/MockChangesListFilter.php",
+       'MockChangesListFilterGroup' => "$testDir/phpunit/mocks/MockChangesListFilterGroup.php",
        'MockWebRequest' => "$testDir/phpunit/mocks/MockWebRequest.php",
        'MediaWiki\\Session\\DummySessionBackend'
                => "$testDir/phpunit/mocks/session/DummySessionBackend.php",
@@ -167,3 +170,4 @@ $wgAutoloadClasses += [
        'ParserTestFileSuite' => "$testDir/phpunit/suites/ParserTestFileSuite.php",
        'ParserTestTopLevelSuite' => "$testDir/phpunit/suites/ParserTestTopLevelSuite.php",
 ];
+// @codingStandardsIgnoreEnd
index 6d1fdf5..5457696 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase {
        protected static $httpEngine;
        protected $oldHttpEngine;
index 5ce0b34..784c29c 100644 (file)
@@ -93,7 +93,7 @@ class DbTestPreviewer extends TestRecorder {
                                        $before = 'n';
                                } elseif ( $prevResults[$test] == 1 ) {
                                        $before = 'p';
-                               } else /* if ( $prevResults[$test] == 0 )*/ {
+                               } else /* if ( $prevResults[$test] == 0 ) */ {
                                        $before = 'f';
                                }
 
@@ -101,7 +101,7 @@ class DbTestPreviewer extends TestRecorder {
                                        $after = 'n';
                                } elseif ( $this->results[$test] == 1 ) {
                                        $after = 'p';
-                               } else /*if ( $this->results[$test] == 0 ) */ {
+                               } else /* if ( $this->results[$test] == 0 ) */ {
                                        $after = 'f';
                                }
 
index 04a2a8d..f68f595 100644 (file)
  * @ingroup Testing
  */
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 class DbTestRecorder extends TestRecorder {
        public $version;
+       /** @var Database */
        private $db;
 
-       public function __construct( IDatabase $db ) {
+       public function __construct( IMaintainableDatabase $db ) {
                $this->db = $db;
        }
 
index 7edde2a..f44b0d5 100644 (file)
@@ -25,6 +25,7 @@
  * @file
  * @ingroup Testing
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
@@ -746,6 +747,10 @@ class ParserTestRunner {
                $user = $context->getUser();
                $options = ParserOptions::newFromContext( $context );
 
+               if ( !isset( $opts['wrap'] ) ) {
+                       $options->setWrapOutputClass( false );
+               }
+
                if ( isset( $opts['tidy'] ) ) {
                        if ( !$this->tidySupport->isEnabled() ) {
                                $this->recorder->skipped( $test, 'tidy extension is not installed' );
@@ -974,10 +979,9 @@ class ParserTestRunner {
                        'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
                        'wgLanguageCode' => $langCode,
                        'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ),
-                       'wgNamespacesWithSubpages' => [
-                               0 => isset( $opts['subpage'] ),
-                               2 => isset( $opts['subpage'] ),
-                       ],
+                       'wgNamespacesWithSubpages' => array_fill_keys(
+                               MWNamespace::getValidNamespaces(), isset( $opts['subpage'] )
+                       ),
                        'wgMaxTocLevel' => $maxtoclevel,
                        'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ),
                        'wgThumbLimits' => [ self::getOptionValue( 'thumbsize', $opts, 180 ) ],
index a48087e..50d1bc9 100644 (file)
Binary files a/tests/parser/extraParserTests.txt and b/tests/parser/extraParserTests.txt differ
index be6e3a8..69fee30 100644 (file)
@@ -32,6 +32,7 @@
 # local         format section links in edit comment text as local links
 # notoc         disable table of contents
 # thumbsize=NNN set the default thumb size to NNNpx for this test
+# wrap          include the normal wrapper <div class="mw-parser-output"> (since 1.30)
 #
 # You can also set the following parser properties via test options:
 #  wgEnableUploads, wgAllowExternalImages, wgMaxTocLevel,
@@ -2310,7 +2311,7 @@ Entities inside <pre>
 <pre>Foo &#8594;bar</pre>
 
 !! html/parsoid
-<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:pre","function":"#tag"},"params":{"1":{"wt":"Foo &lt;nowiki>&amp;rarr;bar&lt;/nowiki>"}},"i":0}}]}'>Foo <span typeof="mw:Entity">→</span>bar</pre>
+<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:pre","function":"tag"},"params":{"1":{"wt":"Foo &lt;nowiki>&amp;rarr;bar&lt;/nowiki>"}},"i":0}}]}'>Foo <span typeof="mw:Entity">→</span>bar</pre>
 !! end
 
 ## Don't expect this to rt, Parsoid drops the unmatched closing pre tags that
@@ -2735,6 +2736,39 @@ Templates: Don't strip whitespace from positional-param values
 </pre>
 !! end
 
+!! test
+Templates: Don't recognize targets split by newlines
+!! options
+parsoid=wt2html
+!! wikitext
+{{ech
+o|foo}}
+!! html/php
+<p>{{ech
+o|foo}}
+</p>
+!! html/parsoid
+<p>{{ech
+o|foo}}</p>
+!! end
+
+!! test
+Templates: Recognize targets when newlines and comments don't split the target
+!! options
+parsoid=wt2html
+!! wikitext
+{{  
+ <!--X--> ech<!--X-->o<!--X-->  
+   <!--X-->   <!--X-->
+
+ |foo}}
+!! html/php
+<p>foo
+</p>
+!! html/parsoid
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"ech&lt;!--X-->o&lt;!--X-->  \n   &lt;!--X-->   &lt;!--X-->\n\n ","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
+!! end
+
 !! test
 Templates: Handle empty comment-and-ws-only lines correctly
 !! wikitext
@@ -5271,6 +5305,64 @@ Bracketed external links with template-generated invalid target
 </p>
 !! end
 
+# wt2html only because Parsoid would want to add <nowiki>s coming from html
+!! test
+Broken wikilinks (but not external links) prevent templates from closing
+!! options
+parsoid=wt2html
+!! wikitext
+[http://example.com x
+
+{{echo|[http://example.com x}}
+
+[[Foo
+
+{{echo|[[Foo}}
+!! html/php
+<p>[<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> x
+</p><p>[<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> x
+</p><p>[[Foo
+</p><p>{{echo|[[Foo}}
+</p>
+!! html/parsoid
+<p>[<a rel="mw:ExtLink" href="http://example.com">http://example.com</a> x</p>
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[http://example.com x"}},"i":0}}]}'>[<a rel="mw:ExtLink" href="http://example.com">http://example.com</a> x</p>
+<p>[[Foo</p>
+<p>{{echo|[[Foo}}</p>
+!! end
+
+!! test
+Wikilinks with embedded newlines are not broken
+!! wikitext
+{{echo|[[ Foo
+B
+C]]}}
+!! html/php
+<p>[[ Foo
+B
+C]]
+</p>
+!! html/parsoid
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[ Foo\nB\nC]]"}},"i":0}}]}'>[[ Foo B C]]</p>
+!! end
+
+!! test
+Broken templates
+!! options
+parsoid=wt2html
+!! wikitext
+{{echo|[[Foo|}}]]
+
+[[Foo|{{echo|]]}}
+!! html/php
+<p>{{echo|<a href="/wiki/Foo" title="Foo">}}</a>
+</p><p>[[Foo|]]
+</p>
+!! html/parsoid
+<p>{{echo|<a rel="mw:WikiLink" href="./Foo" title="Foo">}}</a></p>
+<p>[[Foo|<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"]]"}},"i":0}}]}'>]]</span></p>
+!! end
+
 !! test
 T4702: Mismatched <i>, <b> and <a> tags are invalid
 !! wikitext
@@ -7847,7 +7939,7 @@ File containing double quotes and spaces
 !! wikitext
 [[File:Cool "Gator".png]]
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}]}'><a href="./File:Cool_%22Gator%22.png" data-parsoid='{"a":{"href":"./File:Cool_%22Gator%22.png"},"sa":{"href":"File:Cool \"Gator\".png"}}'><img resource='./File:Cool_"Gator".png' src="./Special:FilePath/Cool_%22Gator%22.png" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Cool_\"Gator\".png","height":"220","width":"220","src":"./Special:FilePath/Cool_%22Gator%22.png"},"sa":{"resource":"File:Cool \"Gator\".png","src":"./Special:FilePath/Cool_\"Gator\".png"}}'/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[]}' data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}]}'><a href="./File:Cool_%22Gator%22.png" data-parsoid='{"a":{"href":"./File:Cool_%22Gator%22.png"},"sa":{"href":"File:Cool \"Gator\".png"}}'><img resource='./File:Cool_"Gator".png' src="./Special:FilePath/Cool_%22Gator%22.png" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Cool_\"Gator\".png","height":"220","width":"220","src":"./Special:FilePath/Cool_%22Gator%22.png"},"sa":{"resource":"File:Cool \"Gator\".png","src":"./Special:FilePath/Cool_\"Gator\".png"}}'/></a></span></p>
 !! end
 
 !! test
@@ -7895,7 +7987,7 @@ Link with double quotes in title part (literal) and alternate part (interpreted)
 </p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)"><i>Pentecoste</i></a>
 </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><span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"apierror-filedoesnotexist","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>
@@ -7915,10 +8007,10 @@ Broken image links with HTML captions (T41700)
 <a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">abc</a>
 </p>
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"&lt;script>&lt;/script>"}]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&amp;lt;script>&amp;lt;/script>"}'><a href="./File:Nonexistent" data-parsoid='{"a":{"href":"./File:Nonexistent"},"sa":{}}'><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Nonexistent","height":"220","width":"220"},"sa":{"resource":"File:Nonexistent"}}'/></a></span>
-<span typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"100x100px"},{"ck":"caption","ak":"&lt;script>&lt;/script>"}]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&amp;lt;script>&amp;lt;/script>"}'><a href="./File:Nonexistent" data-parsoid='{"a":{"href":"./File:Nonexistent"},"sa":{}}'><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="100" width="100" data-parsoid='{"a":{"resource":"./File:Nonexistent","height":"100","width":"100"},"sa":{"resource":"File:Nonexistent"}}'/></a></span>
-<span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"&amp;lt;"}]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&lt;span typeof=\"mw:Entity\" data-parsoid=&#39;{\"src\":\"&amp;amp;lt;\",\"srcContent\":\"&amp;lt;\",\"dsr\":[107,111,null,null]}&#39;>&amp;lt;&lt;/span>"}'><a href="./File:Nonexistent" data-parsoid='{"a":{"href":"./File:Nonexistent"},"sa":{}}'><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Nonexistent","height":"220","width":"220"},"sa":{"resource":"File:Nonexistent"}}'/></a></span>
-<span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"a&lt;i>b&lt;/i>c"}]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"a&lt;i data-parsoid=&#39;{\"stx\":\"html\",\"dsr\":[134,142,3,4]}&#39;>b&lt;/i>c"}'><a href="./File:Nonexistent" data-parsoid='{"a":{"href":"./File:Nonexistent"},"sa":{}}'><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Nonexistent","height":"220","width":"220"},"sa":{"resource":"File:Nonexistent"}}'/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"&lt;script>&lt;/script>"}]}' data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}],"caption":"&amp;lt;script>&amp;lt;/script>"}'><a href="./File:Nonexistent" data-parsoid='{"a":{"href":"./File:Nonexistent"},"sa":{}}'><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Nonexistent","height":"220","width":"220"},"sa":{"resource":"File:Nonexistent"}}'/></a></span>
+<span typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"100x100px"},{"ck":"caption","ak":"&lt;script>&lt;/script>"}]}' data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}],"caption":"&amp;lt;script>&amp;lt;/script>"}'><a href="./File:Nonexistent" data-parsoid='{"a":{"href":"./File:Nonexistent"},"sa":{}}'><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="100" width="100" data-parsoid='{"a":{"resource":"./File:Nonexistent","height":"100","width":"100"},"sa":{"resource":"File:Nonexistent"}}'/></a></span>
+<span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"&amp;lt;"}]}' data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}],"caption":"&lt;span typeof=\"mw:Entity\" data-parsoid=&#39;{\"src\":\"&amp;amp;lt;\",\"srcContent\":\"&amp;lt;\",\"dsr\":[107,111,null,null]}&#39;>&amp;lt;&lt;/span>"}'><a href="./File:Nonexistent" data-parsoid='{"a":{"href":"./File:Nonexistent"},"sa":{}}'><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Nonexistent","height":"220","width":"220"},"sa":{"resource":"File:Nonexistent"}}'/></a></span>
+<span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"a&lt;i>b&lt;/i>c"}]}' data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}],"caption":"a&lt;i data-parsoid=&#39;{\"stx\":\"html\",\"dsr\":[134,142,3,4]}&#39;>b&lt;/i>c"}'><a href="./File:Nonexistent" data-parsoid='{"a":{"href":"./File:Nonexistent"},"sa":{}}'><img resource="./File:Nonexistent" src="./Special:FilePath/Nonexistent" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Nonexistent","height":"220","width":"220"},"sa":{"resource":"File:Nonexistent"}}'/></a></span></p>
 !! end
 
 !! test
@@ -8015,10 +8107,10 @@ title=[[Bug462]]
 !! wikitext
 [[Bu&#103;462]] [[Bug462]]
 !! html/php
-<p><strong class="selflink">Bu&#103;462</strong> <strong class="selflink">Bug462</strong>
+<p><a class="mw-selflink selflink">Bu&#103;462</a> <a class="mw-selflink selflink">Bug462</a>
 </p>
 !! html/php+tidy
-<p><strong class="selflink">Bug462</strong> <strong class="selflink">Bug462</strong></p>
+<p><a class="mw-selflink selflink">Bug462</a> <a class="mw-selflink selflink">Bug462</a></p>
 !! html/parsoid
 <p><a rel="mw:WikiLink" href="./Bug462" title="Bug462">Bug462</a> <a rel="mw:WikiLink" href="./Bug462" title="Bug462">Bug462</a></p>
 !! end
@@ -8047,7 +8139,7 @@ title=[[0]]
 !! wikitext
 [[0]]
 !! html
-<p><strong class="selflink">0</strong>
+<p><a class="mw-selflink selflink">0</a>
 </p>
 !!end
 
@@ -8503,7 +8595,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[local:Main Page]]
 !! html/php
-<p><strong class="selflink">local:Main Page</strong>
+<p><a class="mw-selflink selflink">local:Main Page</a>
 </p>
 !! html/parsoid
 <p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page">local:Main Page</a></p>
@@ -9962,9 +10054,10 @@ Magic Words LOCAL (UTC)
 Magic Word: {{FULLPAGENAME}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{FULLPAGENAME}}
-!! html
+!! html/*
 <p>User:Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -9973,9 +10066,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{FULLPAGENAMEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{FULLPAGENAMEE}}
-!! html
+!! html/*
 <p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -9984,9 +10078,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKSPACE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKSPACE}}
-!! html
+!! html/*
 <p>User talk
 </p>
 !! end
@@ -9995,9 +10090,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKSPACE}}, same namespace
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKSPACE}}
-!! html
+!! html/*
 <p>User talk
 </p>
 !! end
@@ -10006,9 +10102,10 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKSPACE}}, main namespace
 !! options
 title=[[Parser Test]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKSPACE}}
-!! html
+!! html/*
 <p>Talk
 </p>
 !! end
@@ -10017,9 +10114,10 @@ title=[[Parser Test]]
 Magic Word: {{TALKSPACEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKSPACEE}}
-!! html
+!! html/*
 <p>User_talk
 </p>
 !! end
@@ -10028,9 +10126,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTSPACE}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTSPACE}}
-!! html
+!! html/*
 <p>User
 </p>
 !! end
@@ -10039,9 +10138,10 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTSPACE}}, same namespace
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTSPACE}}
-!! html
+!! html/*
 <p>User
 </p>
 !! end
@@ -10050,9 +10150,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTSPACE}}, main namespace
 !! options
 title=[[Parser Test]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTSPACE}}
-!! html
+!! html/*
 
 !! end
 
@@ -10060,9 +10161,10 @@ title=[[Parser Test]]
 Magic Word: {{SUBJECTSPACEE}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTSPACEE}}
-!! html
+!! html/*
 <p>User
 </p>
 !! end
@@ -10071,9 +10173,10 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{NAMESPACE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{NAMESPACE}}
-!! html
+!! html/*
 <p>User
 </p>
 !! end
@@ -10082,9 +10185,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{NAMESPACEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{NAMESPACEE}}
-!! html
+!! html/*
 <p>User
 </p>
 !! end
@@ -10093,9 +10197,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{NAMESPACENUMBER}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{NAMESPACENUMBER}}
-!! html
+!! html/*
 <p>2
 </p>
 !! end
@@ -10104,9 +10209,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBPAGENAME}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBPAGENAME}}
-!! html
+!! html/*
 <p>sub ö
 </p>
 !! end
@@ -10115,9 +10221,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
 Magic Word: {{SUBPAGENAMEE}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBPAGENAMEE}}
-!! html
+!! html/*
 <p>sub_%C3%B6
 </p>
 !! end
@@ -10126,9 +10233,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
 Magic Word: {{ROOTPAGENAME}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{ROOTPAGENAME}}
-!! html
+!! html/*
 <p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -10137,9 +10245,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
 Magic Word: {{ROOTPAGENAMEE}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{ROOTPAGENAMEE}}
-!! html
+!! html/*
 <p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -10148,9 +10257,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
 Magic Word: {{BASEPAGENAME}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{BASEPAGENAME}}
-!! html
+!! html/*
 <p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -10159,9 +10269,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
 Magic Word: {{BASEPAGENAMEE}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{BASEPAGENAMEE}}
-!! html
+!! html/*
 <p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -10170,9 +10281,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
 Magic Word: {{TALKPAGENAME}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKPAGENAME}}
-!! html
+!! html/*
 <p>User talk:Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -10181,9 +10293,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKPAGENAMEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKPAGENAMEE}}
-!! html
+!! html/*
 <p>User_talk:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -10192,9 +10305,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTPAGENAME}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTPAGENAME}}
-!! html
+!! html/*
 <p>User:Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -10203,18 +10317,21 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTPAGENAMEE}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTPAGENAMEE}}
-!! html
+!! html/*
 <p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
 
 !! test
 Magic Word: {{NUMBEROFFILES}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{NUMBEROFFILES}}
-!! html
+!! html/*
 <p>7
 </p>
 !! end
@@ -10223,9 +10340,10 @@ Magic Word: {{NUMBEROFFILES}}
 Magic Word: {{PAGENAME}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGENAME}}
-!! html
+!! html/*
 <p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -10234,6 +10352,7 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{PAGENAME}} with metacharacters
 !! options
 title=[['foo & bar = baz']]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 ''{{PAGENAME}}''
 !! html/php
@@ -10247,6 +10366,7 @@ title=[['foo & bar = baz']]
 Magic Word: {{PAGENAME}} with metacharacters (T28781)
 !! options
 title=[[*RFC 1234 http://example.com/]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGENAME}}
 !! html/php
@@ -10260,9 +10380,10 @@ title=[[*RFC 1234 http://example.com/]]
 Magic Word: {{PAGENAMEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGENAMEE}}
-!! html
+!! html/*
 <p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -10271,6 +10392,7 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{PAGENAMEE}} with metacharacters (T28781)
 !! options
 title=[[*RFC 1234 http://example.com/]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGENAMEE}}
 !! html/php
@@ -10282,53 +10404,65 @@ title=[[*RFC 1234 http://example.com/]]
 
 !! test
 Magic Word: {{REVISIONID}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{REVISIONID}}
-!! html
+!! html/*
 <p>1337
 </p>
 !! end
 
 !! test
 Magic Word: {{SCRIPTPATH}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SCRIPTPATH}}
-!! html
+!! html/*
 
 !! end
 
 !! test
 Magic Word: {{STYLEPATH}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{STYLEPATH}}
-!! html
+!! html/*
 <p>/skins
 </p>
 !! end
 
 !! test
 Magic Word: {{SERVER}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SERVER}}
-!! html
+!! html/*
 <p><a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
 </p>
 !! end
 
 !! test
 Magic Word: {{SERVERNAME}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SERVERNAME}}
-!! html
+!! html/*
 <p>example.org
 </p>
 !! end
 
 !! test
 Magic Word: {{SITENAME}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SITENAME}}
-!! html
+!! html/*
 <p>MediaWiki
 </p>
 !! end
@@ -10337,18 +10471,21 @@ Magic Word: {{SITENAME}}
 Magic Word: {{PAGELANGUAGE}}
 !! options
 language=fr
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGELANGUAGE}}
-!! html
+!! html/*
 <p>fr
 </p>
 !! end
 
 !! test
 Magic Word: {{PAGELANGUAGE}} on a page with no explicitly set language
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGELANGUAGE}}
-!! html
+!! html/*
 <p>en
 </p>
 !! end
@@ -10389,15 +10526,26 @@ Parsoid: Page property magic word with magic word contents
 !! wikitext
 {{DISPLAYTITLE:''{{PAGENAME}}''}}
 !! html/parsoid
-<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>"}]]}'/>
+<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":"DISPLAYTITLE:&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>"}]]}'/>
 !! end
 
+# NOTE: mw:ExpandedAttrs is not the best typeof here. mw:Transclusion is better.
+# But, this is a limitation of our representation and is documented in
+# TemplateHandler.js in processSpecialMagicWord
 !! test
 Parsoid: Template-generated DISPLAYTITLE
 !! wikitext
 {{{{echo|DISPLAYTITLE}}:Foo}}
+!! options
+showtitle
+!! config
+wgAllowDisplayTitle=true
+wgRestrictDisplayTitle=false
+!! html/php
+Foo
+
 !! html/parsoid
-<meta property="mw:PageProp/displaytitle" content="Foo" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"{{echo|DISPLAYTITLE}}:Foo"},"params":{},"i":0}}]}'/>
+<meta property="mw:PageProp/displaytitle" content="Foo" about="#mwt1" typeof="mw:ExpandedAttrs" data-parsoid='{"pi":[[]]}' data-mw='{"attribs":[[{"txt":"content"},{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[2,23,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"DISPLAYTITLE\"}},\"i\":0}}]}&#39;>DISPLAYTITLE&lt;/span>:Foo"}]]}'/>
 !! end
 
 !! test
@@ -10960,6 +11108,39 @@ Template with complex template as argument
 </p>
 !! end
 
+!! test
+Templates with templated name
+!! wikitext
+{{{{echo|echo}}|foo}}
+{{{{echo|inner list}} }}
+!! html
+<p>foo
+</p>
+<ul><li> item 1</li></ul>
+
+!! html/parsoid
+<p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"{{echo|echo}}","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
+<ul about="#mwt4" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"{{echo|inner list}} ","href":"./Template:Inner_list"},"params":{},"i":0}}]}'><li> item 1</li></ul>
+!! end
+
+# Parsoid markup is deliberate "broken". This is an edge case.
+# See long comment in TemplateHandler.js:convertAttribsToString.
+!! test
+Templates with invalid templated targets
+!! wikitext
+{{echo
+{{echo|foo}}
+}}
+!! html/php
+<p>{{echo
+foo
+}}
+</p>
+!! html/parsoid
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo\n{{echo|foo}}\n"},"params":{},"i":0}}]}'>{{echo
+foo }}</p>
+!! end
+
 !! test
 Template with thumb image (with link in description)
 !! wikitext
@@ -10975,7 +11156,7 @@ This is a test template with parameter <div class="thumb tright"><div class="thu
 </div>
 </div>
 !! html/parsoid
-<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"paramtest","href":"./Template:Paramtest"},"params":{"param":{"wt":"[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]"}},"i":0}}]}'>This is a test template with parameter </p><figure class="mw-default-size" typeof="mw:Error mw:Image/Thumb" about="#mwt1" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}]}'><a href="./File:Noimage.png" ><img resource="./File:Noimage.png" src="./Special:FilePath/Noimage.png" height="220" width="220"/></a><figcaption><a rel="mw:WikiLink" href="./No_link" title="No link">link</a> <a rel="mw:WikiLink" href="./No_link" title="No link">caption</a></figcaption></figure>
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"paramtest","href":"./Template:Paramtest"},"params":{"param":{"wt":"[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]"}},"i":0}}]}'>This is a test template with parameter </p><figure class="mw-default-size" typeof="mw:Error mw:Image/Thumb" about="#mwt1" data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}]}'><a href="./File:Noimage.png" ><img resource="./File:Noimage.png" src="./Special:FilePath/Noimage.png" height="220" width="220"/></a><figcaption><a rel="mw:WikiLink" href="./No_link" title="No link">link</a> <a rel="mw:WikiLink" href="./No_link" title="No link">caption</a></figcaption></figure>
 !! end
 
 !! article
@@ -11052,7 +11233,7 @@ Don't abort table cell attribute parsing if wikilink is found in template arg
 |}
 !! html/parsoid
 <table>
-<tbody><tr><td> Test <ref about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:ref","function":"#tag"},"params":{"1":{"wt":"One two \"[[three]]\" four"}},"i":0}}]}'>One two "<a rel="mw:WikiLink" href="./Three" title="Three">three</a>" four</ref></td></tr>
+<tbody><tr><td> Test <ref about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:ref","function":"tag"},"params":{"1":{"wt":"One two \"[[three]]\" four"}},"i":0}}]}'>One two "<a rel="mw:WikiLink" href="./Three" title="Three">three</a>" four</ref></td></tr>
 </tbody></table>
 !! end
 
@@ -11207,17 +11388,23 @@ T2041: Template parameters shown as broken links
 
 !! test
 Template with targets containing wikilinks
+!! options
+parsoid=wt2html
 !! wikitext
 {{[[foo]]}}
 
 {{[[{{echo|foo}}]]}}
 
 {{{{echo|[[foo}}]]}}
-!! html
+!! html/php
 <p>{{<a href="/wiki/Foo" title="Foo">foo</a>}}
 </p><p>{{<a href="/wiki/Foo" title="Foo">foo</a>}}
 </p><p>{{[[foo}}]]
 </p>
+!! html/parsoid
+<p>{{<a rel="mw:WikiLink" href="./Foo" title="Foo">foo</a>}}</p>
+<p>{{<a typeof="mw:ExpandedAttrs" rel="mw:WikiLink" href="./Foo" title="Foo" data-mw='{"attribs":[[{"txt":"href"},{"html":"&lt;span about=\"#mwt3\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[17,29,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"foo\"}},\"i\":0}}]}&#39;>foo&lt;/span>"}]]}'>foo</a>}}</p>
+<p>{{<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[foo}}]]"}},"i":0}}]}'>[[foo}}]]</span></p>
 !! end
 
 !! article
@@ -11668,6 +11855,326 @@ parsoid
 
 !!end
 
+###
+### Preprocessor precedence tests
+### See: https://www.mediawiki.org/wiki/Preprocessor_ABNF
+###
+##{{[[-{{{{{{[[Foo|bar}}]]}-}}}}}]]
+!! test
+Preprocessor precedence 1: link is rightmost opening
+!! wikitext
+{{[[Foo|bar}}]]
+
+But close-brace is not a valid character in a link title:
+{{[[Foo}}|bar]]
+
+However, we can still tell this was handled as a link in the preprocessor:
+{{echo|[[Foo}}|bar]]|bat}}
+!! html
+<p>{{<a href="/wiki/Foo" title="Foo">bar}}</a>
+</p><p>But close-brace is not a valid character in a link title:
+{{[[Foo}}|bar]]
+</p><p>However, we can still tell this was handled as a link in the preprocessor:
+[[Foo}}|bar]]
+</p>
+!! end
+
+!! test
+Preprocessor precedence 2: template is rightmost opening
+!! options
+language=zh
+!! wikitext
+-{{echo|foo}-}}-
+!! html
+<p>-foo}--
+</p>
+!! end
+
+!! test
+Preprocessor precedence 3: language converter is rightmost opening
+!! options
+language=zh
+!! wikitext
+{{echo|hi}}
+
+{{-{R|echo|hi}}}-
+
+[[-{R|raw]]}-
+!! html
+<p>hi
+</p><p>{{echo|hi}}
+</p><p>[[raw]]
+</p>
+!! end
+
+!! test
+Preprocessor precedence 4: left-most angle bracket
+!! options
+language=zh
+!! wikitext
+<!--{raw}-->
+!! html
+!! end
+
+!! article
+Template:Precedence5
+!! text
+{{{{{1}}}}}
+!! endarticle
+
+!! test
+Preprocessor precedence 5: tplarg takes precedence over template
+!! wikitext
+{{Precedence5|Bullet}}
+!! html
+<ul><li> Bar</li></ul>
+
+!! end
+
+!! test
+Preprocessor precedence 6: broken link is rightmost opening
+!! wikitext
+{{echo|[[Foo}}
+
+{{echo|[[Foo|bar|bat=baz}}
+!! html
+<p>{{echo|[[Foo}}
+</p><p>{{echo|[[Foo|bar|bat=baz}}
+</p>
+!! end
+
+# This next test exposes a difference between PHP and Parsoid:
+# Given [[Foo|{{echo|Bar]]x}}y]]z:
+# 1) Both PHP and Parsoid ignore the `]]` inside the `echo` in the
+# "preprocessor" stage.  The `{{echo` extends until the `x}}`, and the
+# outer `[[Foo` extends until the `y]]`
+# 2a) But then the PHP preprocessor emits `[[Foo|Bar]]xy]]z` as an
+# intermediate result (after template expansion), and link processing
+# happens on this intermediate result, which moves the wikilink
+# boundary leftward to `[[Foo|Bar]]`
+# 2b) Parsoid works in a single step, so it's going to keep the
+# wikilink as extending to the `y]]`
+# 3a) Then PHP does linktrail processing which slurps up the trailing
+# `xy` inside the link.
+# 3b) Parsoid will do linktrail processing to slurp up the trailing
+# `z` inside the link.
+# This is "correct" behavior.  Parsoid's basic worldview is that the
+# `]]` inside the template shouldn't be allowed to leak out to affect
+# the surrounding wikilink.  PHP may match Parsoid (in the future)
+# if you use {{#balance}} (T114445).
+
+!! test
+Preprocessor precedence 7: broken template is rightmost opening
+!! wikitext
+[[Foo|{{echo|Bar]]
+
+[[Foo|{{echo|Bar]]-x}}-y]]-z
+
+Careful: linktrails can move the end of the wikilink:
+[[Foo|{{echo|y']]a}}l]]l
+!! html
+<p><a href="/wiki/Foo" title="Foo">{{echo|Bar</a>
+</p><p><a href="/wiki/Foo" title="Foo">Bar</a>-x-y]]-z
+</p><p>Careful: linktrails can move the end of the wikilink:
+<a href="/wiki/Foo" title="Foo">y'al</a>]]l
+</p>
+!! end
+
+!! test
+Preprocessor precedence 8: broken language converter is rightmost opening
+!! options
+language=zh
+!! wikitext
+[[Foo-{R|raw]]
+!! html
+<p>[[Foo-{R|raw]]
+</p>
+!! end
+
+!! article
+Template:Preprocessor_precedence_9
+!! text
+;4: {{{{1}}}}
+;5: {{{{{2}}}}}
+;6: {{{{{{3}}}}}}
+;7: {{{{{{{4}}}}}}}
+!! endarticle
+
+!! test
+Preprocessor precedence 9: groups of braces
+!! wikitext
+{{Preprocessor precedence 9|Four|Bullet|1|2}}
+!! html
+<dl><dt>4</dt>
+<dd> {Four}</dd>
+<dt>5</dt>
+<dd> </dd></dl>
+<ul><li> Bar</li></ul>
+<dl><dt>6</dt>
+<dd> Four</dd>
+<dt>7</dt>
+<dd> {Bullet}</dd></dl>
+
+!! end
+
+!! article
+Template:Preprocessor_precedence_10
+!! text
+;1: -{R|raw}-
+;2: -{{Bullet}}-
+;3: -{{{1}}}-
+;4: -{{{{2}}}}-
+;5: -{{{{{3}}}}}-
+;6: -{{{{{{4}}}}}}-
+;7: -{{{{{{{5}}}}}}}-
+!! endarticle
+
+!! test
+Preprocessor precedence 10: groups of braces with leading dash
+!! options
+language=zh
+!! wikitext
+{{Preprocessor precedence 10|Three|raw2|Bullet|1|2}}
+!! html
+<dl><dt>1</dt>
+<dd> raw</dd>
+<dt>2</dt>
+<dd> -</dd></dl>
+<ul><li> Bar-</li></ul>
+<dl><dt>3</dt>
+<dd> -Three-</dd>
+<dt>4</dt>
+<dd> raw2</dd>
+<dt>5</dt>
+<dd> -</dd></dl>
+<ul><li> Bar-</li></ul>
+<dl><dt>6</dt>
+<dd> -Three-</dd>
+<dt>7</dt>
+<dd> raw2</dd></dl>
+
+!! end
+
+!! test
+Preprocessor precedence 11: found during visual diff testing
+!! wikitext
+{{#tag:span|-{{#tag:span|-{{echo|x}}}}}}
+
+{{echo|-{{echo|-{{echo|x}}}}}}
+
+{{echo|-{{echo|x}}}}
+!! html
+<p><span>-<span>-x</span></span>
+</p><p>--x
+</p><p>-x
+</p>
+!! end
+
+!! test
+Preprocessor precedence 12: broken language converter closed by brace.
+!! wikitext
+This form breaks the template, which is unfortunate:
+* {{echo|foo-{bar}bat}}
+
+But if the broken language converter markup is inside an extension
+tag, nothing bad happens:
+* <nowiki>foo-{bar}bat</nowiki>
+* {{echo|<nowiki>foo-{bar}bat</nowiki>}}
+* <pre>foo-{bar}bat</pre>
+* {{echo|<pre>foo-{bar}bat</pre>}}
+
+<tag>foo-{bar}bat</tag>
+{{echo|<tag>foo-{bar}bat</tag>}}
+
+!! html+tidy
+<p>This form breaks the template, which is unfortunate:</p>
+<ul>
+<li>{{echo|foo-{bar}bat}}</li>
+</ul>
+<p>But if the broken language converter markup is inside an extension tag, nothing bad happens:</p>
+<ul>
+<li>foo-{bar}bat</li>
+<li>foo-{bar}bat</li>
+<li>
+<pre>
+foo-{bar}bat
+</pre></li>
+<li>
+<pre>
+foo-{bar}bat
+</pre></li>
+</ul>
+<pre>
+'foo-{bar}bat'
+array (
+)
+</pre>
+<pre>
+'foo-{bar}bat'
+array (
+)
+</pre>
+!! end
+
+!! test
+Preprocessor precedence, 13: broken language converter in external link
+!! wikitext
+* [http://example.com/-{foo Example in URL]
+* [http://example.com Example in -{link} description]
+* {{echo|[http://example.com/-{foo Breaks template, however]}}
+!! html+tidy
+<ul>
+<li><a rel="nofollow" class="external text" href="http://example.com/-{foo">Example in URL</a></li>
+<li><a rel="nofollow" class="external text" href="http://example.com">Example in -{link} description</a></li>
+<li>{{echo|<a rel="nofollow" class="external text" href="http://example.com/-{foo">Breaks template, however</a>}}</li>
+</ul>
+!! end
+
+!! test
+Preprocessor precedence, 14: broken language converter in comment
+!! wikitext
+* <!--{{foo}}--> ...should be ok
+* <!---{{foo}}--> ...extra dashes
+* {{echo|foo<!-- -{bar} -->bat}} ...should be ok
+!! html+tidy
+<ul>
+<li>...should be ok</li>
+<li>...extra dashes</li>
+<li>foobat ...should be ok</li>
+</ul>
+!! end
+
+!! test
+Preprocessor precedence, 15: broken brace markup in headings
+!! wikitext
+__NOTOC__ __NOEDITSECTION__
+===1 foo[bar 1===
+1
+===2 foo[[bar 2===
+2
+===3 foo{bar 3===
+3
+===4 foo{{bar 4===
+4
+===5 foo{{{bar 5===
+5
+===6 foo-{bar 6===
+6
+!! html+tidy
+<h3><span class="mw-headline" id="1_foo.5Bbar_1">1 foo[bar 1</span></h3>
+<p>1</p>
+<h3><span class="mw-headline" id="2_foo.5B.5Bbar_2">2 foo[[bar 2</span></h3>
+<p>2</p>
+<h3><span class="mw-headline" id="3_foo.7Bbar_3">3 foo{bar 3</span></h3>
+<p>3</p>
+<h3><span class="mw-headline" id="4_foo.7B.7Bbar_4">4 foo{{bar 4</span></h3>
+<p>4</p>
+<h3><span class="mw-headline" id="5_foo.7B.7B.7Bbar_5">5 foo{{{bar 5</span></h3>
+<p>5</p>
+<h3><span class="mw-headline" id="6_foo-.7Bbar_6">6 foo-{bar 6</span></h3>
+<p>6</p>
+!! end
+
 ###
 ### Token Stream Patcher tests
 ###
@@ -13066,6 +13573,17 @@ pst
 [[:Bar:Article (context),context|Article]]
 !! end
 
+!! test
+Parsoid: backwards pipe trick
+!! wikitext
+[[|'''bar''']]
+!! html/php
+<p>[[|<b>bar</b>]]
+</p>
+!! html/parsoid
+<p>[[|<b>bar</b>]]</p>
+!! end
+
 !! test
 pre-save transform: trim trailing empty lines
 !! options
@@ -13745,7 +14263,7 @@ Manually-specified thumbnail image
 !! options
 thumbsize=220
 !! wikitext
-[[File:Foobar.jpg|thumb=Thumb.png|Title]]
+[[File:Foobar.jpg|thumbnail=Thumb.png|Title]]
 !! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><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>
 
@@ -14272,7 +14790,7 @@ Entities in file name and attributes
 <p><a href="/index.php?title=Special:Upload&amp;wpDestFile=7%25_solution.gif" class="new" title="File:7% solution.gif">7% solution</a>
 </p>
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"bogus","ak":"manualthumb=7%25 solution.gif"},{"ck":"link","ak":"link=7%25 solution"},{"ck":"caption","ak":"[[7%25 solution]]"}]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&lt;a rel=\"mw:WikiLink\" href=\"./7%25_solution\" title=\"7% solution\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./7%25_solution\"},\"sa\":{\"href\":\"7%25 solution\"},\"dsr\":[74,91,2,2]}&#39;>7% solution&lt;/a>"}'><a href="./7%25_solution" data-parsoid='{"a":{"href":"./7%25_solution"},"sa":{"href":"link=7%25 solution"}}'><img resource="./File:7%25_solution.gif" src="./Special:FilePath/7%25_solution.gif" height="220" width="220" data-parsoid='{"a":{"resource":"./File:7%25_solution.gif","height":"220","width":"220"},"sa":{"resource":"File:7%25 solution.gif"}}'/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"bogus","ak":"manualthumb=7%25 solution.gif"},{"ck":"link","ak":"link=7%25 solution"},{"ck":"caption","ak":"[[7%25 solution]]"}]}' data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}],"caption":"&lt;a rel=\"mw:WikiLink\" href=\"./7%25_solution\" title=\"7% solution\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./7%25_solution\"},\"sa\":{\"href\":\"7%25 solution\"},\"dsr\":[74,91,2,2]}&#39;>7% solution&lt;/a>"}'><a href="./7%25_solution" data-parsoid='{"a":{"href":"./7%25_solution"},"sa":{"href":"link=7%25 solution"}}'><img resource="./File:7%25_solution.gif" src="./Special:FilePath/7%25_solution.gif" height="220" width="220" data-parsoid='{"a":{"resource":"./File:7%25_solution.gif","height":"220","width":"220"},"sa":{"resource":"File:7%25 solution.gif"}}'/></a></span></p>
 !! end
 
 !! test
@@ -14487,7 +15005,7 @@ wgEnableUploads=0
 <p><a href="/wiki/File:Foobaz.jpg" title="File:Foobaz.jpg">File:Foobaz.jpg</a>
 </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:Foobaz.jpg"><img resource="./File:Foobaz.jpg" src="./Special:FilePath/Foobaz.jpg" height="220" width="220"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}]}'><a href="./File:Foobaz.jpg"><img resource="./File:Foobaz.jpg" src="./Special:FilePath/Foobaz.jpg" height="220" width="220"/></a></span></p>
 !! end
 
 # Parsoid-specific testing for images
@@ -14820,6 +15338,7 @@ Render invalid page names as plain text (T53090)
 [[.]]
 [[..]]
 [[foo././bar]]
+[[foo[http://example.com]xyz]]
 
 [[{{echo|./../foo}}|bar]]
 [[{{echo|foo/.}}|bar]]
@@ -14843,6 +15362,7 @@ Render invalid page names as plain text (T53090)
 [[.]]
 [[..]]
 [[foo././bar]]
+[[foo<a rel="nofollow" class="external autonumber" href="http://example.com">[1]</a>xyz]]
 </p><p>[[./../foo|bar]]
 [[foo/.|bar]]
 [[foo/..|bar]]
@@ -14865,7 +15385,8 @@ Render invalid page names as plain text (T53090)
 [[foo[bar]]
 [[.]]
 [[..]]
-[[foo././bar]]</p>
+[[foo././bar]]
+[[foo<a rel="mw:ExtLink" href="http://example.com"></a>xyz]]</p>
 
 <p>[[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"./../foo"}},"i":0}}]}'>./../foo</span>|bar]]
 [[<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo/."}},"i":0}}]}'>foo/.</span>|bar]]
@@ -15331,12 +15852,15 @@ Parsoid: Defaultsort
 <meta property="mw:PageProp/categorydefaultsort" content="Foo"/>
 !! end
 
+# NOTE: mw:ExpandedAttrs is not the best typeof here. mw:Transclusion is better.
+# But, this is a limitation of our representation and is documented in
+# TemplateHandler.js in processSpecialMagicWord
 !! test
 Parsoid: Defaultsort (template-generated)
 !! wikitext
 {{{{echo|DEFAULTSORT}}:Foo}}
 !! html/parsoid
-<meta property="mw:PageProp/categorydefaultsort" content="Foo" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"{{echo|DEFAULTSORT}}:Foo"},"params":{},"i":0}}]}'/>
+<meta property="mw:PageProp/categorydefaultsort" content="Foo" about="#mwt3" typeof="mw:ExpandedAttrs" data-parsoid='{"src":"{{{{echo|DEFAULTSORT}}:Foo}}","dsr":[0,26,null,null]}' data-mw='{"attribs":[[{"txt":"content"},{"html":"&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[{\"k\":\"1\"}]],\"dsr\":[2,22,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"echo\",\"href\":\"./Template:Echo\"},\"params\":{\"1\":{\"wt\":\"DEFAULTSORT\"}},\"i\":0}}]}&#39;>DEFAULTSORT&lt;/span>:Foo"}]]}'/>
 !! end
 
 ###
@@ -15413,7 +15937,7 @@ Section headings with TOC
 Some text
 ===Another headline===
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
 <ul>
@@ -15456,7 +15980,7 @@ __FORCETOC__
 == Headline 2 ==
 == Headline ==
 !! html/php
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Headline_2"><span class="tocnumber">1</span> <span class="toctext">Headline 2</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Headline"><span class="tocnumber">2</span> <span class="toctext">Headline</span></a></li>
@@ -15487,7 +16011,7 @@ Handling of sections up to level 6 and beyond
 ========= Level 9 Heading=========
 ========== Level 10 Heading==========
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
 <ul>
@@ -15540,7 +16064,7 @@ TOC regression (T11764)
 == title 2 ==
 === title 2.1 ===
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -15575,7 +16099,7 @@ TOC for heading containing <span id="..."></span> (T96153)
 __FORCETOC__
 ==<span id="old-anchor"></span>New title==
 !! html/php
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#New_title"><span class="tocnumber">1</span> <span class="toctext">New title</span></a></li>
 </ul>
@@ -15597,7 +16121,7 @@ wgMaxTocLevel=3
 == title 2 ==
 === title 2.1 ===
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -15633,7 +16157,7 @@ wgMaxTocLevel=3
 ====Section 1.1.1.1====
 ==Section 2==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
 <ul>
@@ -15726,7 +16250,7 @@ __TOC__
 === title 1.1 ===
 == title 2 ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -15793,7 +16317,7 @@ section 5
 !! html
 <p>The tooltips shall not show entities to the user (ie. be double escaped)
 </p>
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#text_.3E_text"><span class="tocnumber">1</span> <span class="toctext">text &gt; text</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#text_.3C_text"><span class="tocnumber">2</span> <span class="toctext">text &lt; text</span></a></li>
@@ -15852,7 +16376,7 @@ section 6
 !! html
 <p>Id should not contain + for spaces
 </p>
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Space_between_Text"><span class="tocnumber">1</span> <span class="toctext">Space between Text</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Space-Entity_between_Text"><span class="tocnumber">2</span> <span class="toctext">Space-Entity&#32;between&#32;Text</span></a></li>
@@ -15898,7 +16422,7 @@ Headers with excess '=' characters
 =''italic'' heading==
 ==''italic'' heading=
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#.3Dfoo"><span class="tocnumber">2</span> <span class="toctext">=foo</span></a></li>
@@ -15928,7 +16452,7 @@ HTML headers vs TOC (T25393)
 == Header 2.2 ==
 __NOEDITSECTION__
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a>
 <ul>
@@ -16328,18 +16852,22 @@ Nesting of <bdo>
 Media link
 !! wikitext
 [[Media:Foobar.jpg]]
-!! html
+!! html/php
 <p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Media:Foobar.jpg</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:MediaLink" href="//example.com/images/3/3a/Foobar.jpg" title="Foobar.jpg">Media:Foobar.jpg</a></p>
 !! end
 
 !! test
 Media link with text
 !! wikitext
 [[Media:Foobar.jpg|A neat file to look at]]
-!! html
+!! html/php
 <p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">A neat file to look at</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:MediaLink" href="//example.com/images/3/3a/Foobar.jpg" title="Foobar.jpg">A neat file to look at</a></p>
 !! end
 
 # FIXME: this is still bad HTML tag nesting
@@ -16348,21 +16876,29 @@ Media link with text
 Media link with nasty text
 !! wikitext
 [[Media:Foobar.jpg|Safe Link<div style=display:none>" onmouseover="alert(document.cookie)" onfoo="</div>]]
-!! html
+!! html/php
 <a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link&lt;div style="display:none"&gt;" onmouseover="alert(document.cookie)" onfoo="&lt;/div&gt;</a>
 
-!! html+tidy
+!! html+php/tidy
 <p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link</a></p>
 <div style="display:none">" onmouseover="alert(document.cookie)" onfoo="</div>
+!! html/parsoid
+<p><a rel="mw:MediaLink" href="//example.com/images/3/3a/Foobar.jpg" title="Foobar.jpg" data-parsoid='{"autoInsertedEnd":true}'>Safe Link</a></p><div style="display:none" data-parsoid='{"stx":"html"}'><a rel="mw:MediaLink" href="//example.com/images/3/3a/Foobar.jpg" title="Foobar.jpg" data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'>" onmouseover="alert(document.cookie)" onfoo="</a></div>
+
 !! end
 
 !! test
 Media link to nonexistent file (T3702)
 !! wikitext
 [[Media:No such.jpg]]
-!! html
+[[Media:No_such file.jpg]]
+!! html/php
 <p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="No such.jpg">Media:No such.jpg</a>
+<a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such_file.jpg" class="new" title="No such file.jpg">Media:No_such file.jpg</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:MediaLink" href="./Special:FilePath/No_such.jpg" title="No such.jpg" typeof="mw:Error" data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}]}' data-parsoid='{"a":{"fileName":"No_such.jpg"},"sa":{"fileName":"No such.jpg"}}'>Media:No such.jpg</a>
+<a rel="mw:MediaLink" href="./Special:FilePath/No_such_file.jpg" title="No such file.jpg" typeof="mw:Error" data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}]}' data-parsoid='{"a":{"fileName":"No_such_file.jpg"},"sa":{"fileName":"No_such file.jpg"}}'>Media:No_such file.jpg</a></p>
 !! end
 
 !! test
@@ -16373,7 +16909,7 @@ Image link to nonexistent file (T3850 - good)
 <p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="File:No such.jpg">File:No such.jpg</a>
 </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:No_such.jpg"><img resource="./File:No_such.jpg" src="./Special:FilePath/No_such.jpg" height="220" width="220"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}]}'><a href="./File:No_such.jpg"><img resource="./File:No_such.jpg" src="./Special:FilePath/No_such.jpg" height="220" width="220"/></a></span></p>
 !! end
 
 !! test
@@ -17351,10 +17887,10 @@ Sanitizer: Validating that <meta> and <link> work, but only for Microdata
 <p>    <meta itemprop="hello" content="world" />
        &lt;meta http-equiv="refresh" content="5"&gt;
        <meta itemprop="hello" content="5" />
-</p>
        <link itemprop="hello" href="http&#58;//example.org" />
        &lt;link rel="stylesheet" href="<a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>"&gt;
        <link itemprop="hello" href="http&#58;//example.org" />
+</p>
 </div>
 
 !! end
@@ -17381,14 +17917,12 @@ all additional text is vanished
 
 !! test
 Self closed html pairs (T7487)
-!! options
 !! wikitext
 <center><font id="bug" />Centered text</center>
 <div><font id="bug2" />In div text</div>
-!! html
-<center>&lt;font id="bug" /&gt;Centered text</center>
-<div>&lt;font id="bug2" /&gt;In div text</div>
-
+!! html+tidy
+<center><font id="bug"></font>Centered text</center>
+<div><font id="bug2"></font>In div text</div>
 !! end
 
 #
@@ -17706,7 +18240,7 @@ Fuzz testing: Parser14
 http://__TOC__
 !! html
 <h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</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: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+http://<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
 </ul>
@@ -17717,7 +18251,7 @@ http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</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: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>http://</p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
@@ -17842,8 +18376,8 @@ MOVE YOUR MOUSE CURSOR OVER THIS TEXT
 
 !! 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}'>
+<u class="|" data-parsoid='{"stx":"html","a":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--":null},"sa":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--":""},"autoInsertedEnd":true}'><meta typeof="mw:Includes/NoInclude" data-parsoid='{"src":"&lt;noinclude>"}'/>}}}} >
+<br style="onmouseover='alert(document.cookie);' " data-parsoid='{"stx":"html","selfClose":true}'/></u></p><p data-parsoid='{"fostered":true,"autoInsertedEnd":true}'><u class="|" data-parsoid='{"stx":"html","a":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--":null},"sa":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--":""},"autoInsertedEnd":true,"autoInsertedStart":true}'>MOVE YOUR MOUSE CURSOR OVER THIS TEXT</u></p><table data-parsoid='{"autoInsertedEnd":true}'>
 
 
 
@@ -17920,7 +18454,7 @@ Fuzz testing: image with bogus manual thumbnail
 <div class="thumb tright"><div class="thumbinner" style="width:182px;">Error creating thumbnail:   <div class="thumbcaption"></div></div></div>
 
 !! html/parsoid
-<figure class="mw-default-size" typeof="mw:Error mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"manualthumb","ak":"thumbnail= "}]}' data-mw='{"errors":[{"key":"missing-thumbnail","message":"This thumbnail does not exist.","params":{"name":""}}],"thumb":""}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="./Special:FilePath/" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"220"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure>
+<figure class="mw-default-size" typeof="mw:Error mw:Image/Thumb" data-parsoid='{"optList":[{"ck":"manualthumb","ak":"thumbnail= "}]}' data-mw='{"errors":[{"key":"apierror-invalidtitle","message":"Invalid thumbnail title.","params":{"name":""}}],"thumb":""}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{"href":"Image:foobar.jpg"}}'><img resource="./File:Foobar.jpg" src="./Special:FilePath/Foobar.jpg" height="220" width="220" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"220"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></figure>
 !! end
 
 !! test
@@ -19010,9 +19544,8 @@ Special:Search page linking.
 | is not a magic word here but | is still a magic word here
 </p>
 !! html/parsoid
-<p><span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is a magic word there and <span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is still a magic word here
-| is not a magic word here but <span about="#mwt3" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","href":"./Template:!"},"params":{},"i":0}}]}'>|</span> is still a magic word here</p>
-
+<p><span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","function":"!"},"params":{},"i":0}}]}'>|</span> is a magic word there and <span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","function":"!"},"params":{},"i":0}}]}'>|</span> is still a magic word here
+| is not a magic word here but <span about="#mwt3" typeof="mw:Transclusion" data-parsoid='{"pi":[[]]}' data-mw='{"parts":[{"template":{"target":{"wt":"!","function":"!"},"params":{},"i":0}}]}'>|</span> is still a magic word here</p>
 !! end
 
 !! test
@@ -19069,6 +19602,27 @@ title=[[Parser test]]
 !! end
 ### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
 
+!! test
+Gallery with valid attributes
+!! wikitext
+<gallery type="123" summary="345">
+File:File:Foobar.jpg
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional" type="123">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="height: 150px;">File:Foobar.jpg</div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" type="123" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"type":"123","summary":"345"},"body":{"extsrc":"\nFile:File:Foobar.jpg\n"}}'>
+<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:File:Foobar.jpg</span></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
 ## Parsoid thinks the "centre" here is a property, not a caption.
 !! test
 Gallery
@@ -19613,6 +20167,56 @@ File:Test.png
 </gallery>
 !! end
 
+!! test
+Gallery with class and style attributes
+!! options
+parsoid={
+  "nativeGallery": true
+}
+!! wikitext
+<gallery class="center" style="text-align: center;">
+File:Foobar.jpg
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional center" style="text-align: center;">
+               <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 center" style="text-align: center;" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"class":"center","style":"text-align: center;"},"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"></div></li>
+</ul>
+!! end
+
+!! test
+Gallery in slideshow mode
+!! options
+parsoid={
+  "nativeGallery": true
+}
+!! wikitext
+<gallery mode="slideshow" showthumbnails="">
+File:Foobar.jpg
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-slideshow" data-showthumbnails="1">
+               <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-slideshow" data-showthumbnails="1" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"mode":"slideshow","showthumbnails":""},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px;"><span typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
 !! test
 HTML Hex character encoding (spells the word "JavaScript")
 !! options
@@ -19871,7 +20475,7 @@ djvu
 <p><a href="/index.php?title=File:LoremIpsum.djvu&amp;page=2" class="image"><img alt="LoremIpsum.djvu" src="http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-2480px-LoremIpsum.djvu.jpg" width="2480" height="3508" srcset="http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg 1.5x, http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg 2x" /></a>
 </p>
 !! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"page","ak":"page=2"}]}'><a href="./File:LoremIpsum.djvu" data-parsoid='{"a":{"href":"./File:LoremIpsum.djvu"},"sa":{}}'><img resource="./File:LoremIpsum.djvu" src="//example.com/images/5/5f/LoremIpsum.djvu" data-file-width="2480" data-file-height="3508" data-file-type="bitmap" height="3508" width="2480" data-parsoid='{"a":{"resource":"./File:LoremIpsum.djvu","height":"3508","width":"2480"},"sa":{"resource":"File:LoremIpsum.djvu"}}'/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"page","ak":"page=2"}]}' data-mw='{"page":"2"}'><a href="./File:LoremIpsum.djvu" data-parsoid='{"a":{"href":"./File:LoremIpsum.djvu"},"sa":{"href":"File:LoremIpsum.djvu"}}'><img resource="./File:LoremIpsum.djvu" src="//example.com/images/5/5f/LoremIpsum.djvu" data-file-width="2480" data-file-height="3508" data-file-type="bitmap" height="3508" width="2480" data-parsoid='{"a":{"resource":"./File:LoremIpsum.djvu","height":"3508","width":"2480"},"sa":{"resource":"File:LoremIpsum.djvu"}}'/></a></span></p>
 !! end
 
 !! test
@@ -20129,7 +20733,7 @@ Out-of-order TOC heading levels
 =====5=====
 ==2==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
 <ul>
@@ -20170,9 +20774,11 @@ ISBN ---
 ISBN with space-delimited number
 !! wikitext
 ISBN 92 9017 032 8
-!! html
+!! html/php
 <p><a href="/wiki/Special:BookSources/9290170328" class="internal mw-magiclink-isbn">ISBN 92 9017 032 8</a>
 </p>
+!! html/parsoid
+<p data-parsoid='{"dsr":[0,18,0,0]}'><a href="./Special:BookSources/9290170328" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink","dsr":[0,18,2,2]}'>ISBN 92 9017 032 8</a></p>
 !! end
 
 
@@ -20194,11 +20800,17 @@ ISBN 123456789
 ISBN 1234567890
 
 ISBN 12345678901
-!! html
+!! html/php
 <p>ISBN 123456789
 </p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
 </p><p>ISBN 12345678901
 </p>
+!! html/parsoid
+<p>ISBN 123456789</p>
+
+<p><a href="./Special:BookSources/1234567890" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1234567890</a></p>
+
+<p>ISBN 12345678901</p>
 !! end
 
 
@@ -20208,10 +20820,14 @@ ISBN with trailing year (T9110)
 ISBN 1-234-56789-0 - 2006
 
 ISBN 1 234 56789 0 - 2006
-!! html
+!! html/php
 <p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1-234-56789-0</a> - 2006
 </p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1 234 56789 0</a> - 2006
 </p>
+!! html/parsoid
+<p><a href="./Special:BookSources/1234567890" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1-234-56789-0</a> - 2006</p>
+
+<p><a href="./Special:BookSources/1234567890" rel="mw:WikiLink" data-parsoid='{"stx":"magiclink"}'>ISBN 1 234 56789 0</a> - 2006</p>
 !! end
 
 
@@ -20327,7 +20943,7 @@ title=[[Dunav]] language=sr
 !! wikitext
 Both [[Dunav]] and [[Дунав]] are names for this river.
 !! html
-<p>Both <strong class="selflink">Dunav</strong> and <strong class="selflink">Дунав</strong> are names for this river.
+<p>Both <a class="mw-selflink selflink">Dunav</a> and <a class="mw-selflink selflink">Дунав</a> are names for this river.
 </p>
 !!end
 
@@ -20344,7 +20960,7 @@ title=[[Duna]] language=sr
 !! wikitext
 [[Дуна]] is not a self-link while [[Duna]] and [[Dуна]] are still self-links.
 !! html
-<p><a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Дуна</a> is not a self-link while <strong class="selflink">Duna</strong> and <strong class="selflink">Dуна</strong> are still self-links.
+<p><a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Дуна</a> is not a self-link while <a class="mw-selflink selflink">Duna</a> and <a class="mw-selflink selflink">Dуна</a> are still self-links.
 </p>
 !! end
 
@@ -20355,7 +20971,7 @@ title=[[Duna]] language=sr
 !! wikitext
 [[Dуна]] is a self-link while [[Dunа#Foo]] and [[Dуна#Foo]] are not self-links.
 !! html
-<p><strong class="selflink">Dуна</strong> is a self-link while <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dunа#Foo</a> and <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dуна#Foo</a> are not self-links.
+<p><a class="mw-selflink selflink">Dуна</a> is a self-link while <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dunа#Foo</a> and <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dуна#Foo</a> are not self-links.
 </p>
 !! end
 
@@ -20664,6 +21280,28 @@ Raw: -{R|zh:China;zh-tw:Taiwan}-
 </p>
 !! end
 
+!! test
+Nested markup inside raw output of variant escape tags (R flag)
+!! options
+language=zh variant=zh-tw
+!! wikitext
+Nested raw: -{R|nested -{zh:China;zh-tw:Taiwan}- nested}-
+!! html
+<p>Nested raw: nested Taiwan nested
+</p>
+!! end
+
+!! test
+Templates inside raw output of variant escape tags (R flag)
+!! options
+language=zh variant=zh-tw
+!! wikitext
+Nested raw: -{R|nested {{echo|hi}} templates}-
+!! html
+<p>Nested raw: nested hi templates
+</p>
+!! end
+
 !! test
 Strings evaluating false shouldn't be ignored by Language converter (T51072)
 !! options
@@ -20831,12 +21469,10 @@ language=sr variant=sr-ec
 </p>
 !! end
 
-# FIXME: This test is currently broken in the PHP parser T153761
 !! test
 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
@@ -21793,7 +22429,7 @@ showindicators
 !! wikitext
 <indicator name=" "></indicator>
 <indicator></indicator>
-!! html
+!! html/php
 <p><span class="error"><strong>Error:</strong> Page status indicators' <code>name</code> attribute must not be empty.</span>
 <span class="error"><strong>Error:</strong> Page status indicators' <code>name</code> attribute must not be empty.</span>
 </p>
@@ -21806,7 +22442,7 @@ showindicators
 !! wikitext
 <indicator name="empty" />
 <indicator name="name"></indicator>
-!! html
+!! html/php
 empty=
 name=
 <p><br />
@@ -21833,7 +22469,7 @@ showindicators
 <indicator name="10">Two
 
 paragraphs</indicator>
-!! html
+!! html/php
 01=hello world
 02=<a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 03=<img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/25px-Foobar.jpg" width="25" height="3" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/38px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg 2x" />
@@ -21965,7 +22601,7 @@ percent-encoding and + signs in internal links (T28410)
 !! html/parsoid
 <p><a rel="mw:WikiLink" href="./User:+%25" title="User:+%" data-parsoid='{"stx":"simple","a":{"href":"./User:+%25"},"sa":{"href":"User:+%"}}'>User:+%</a> <a rel="mw:WikiLink" href="./Page+title%25" title="Page+title%" data-parsoid='{"stx":"simple","a":{"href":"./Page+title%25"},"sa":{"href":"Page+title%"}}'>Page+title%</a>
 <a rel="mw:WikiLink" href="./%25+" title="%+" data-parsoid='{"stx":"simple","a":{"href":"./%25+"},"sa":{"href":"%+"}}'>%+</a> <a rel="mw:WikiLink" href="./%25+" title="%+" data-parsoid='{"stx":"piped","a":{"href":"./%25+"},"sa":{"href":"%+"}}'>%20</a> <a rel="mw:WikiLink" href="./%25+" title="%+" data-parsoid='{"stx":"simple","a":{"href":"./%25+"},"sa":{"href":"%+ "}}'>%+ </a> <a rel="mw:WikiLink" href="./%25+r" title="%+r" data-parsoid='{"stx":"simple","a":{"href":"./%25+r"},"sa":{"href":"%+r"}}'>%+r</a>
-<a rel="mw:WikiLink" href="./%25" title="%" data-parsoid='{"stx":"simple","a":{"href":"./%25"},"sa":{"href":"%"}}'>%</a> <a rel="mw:WikiLink" href="./+" title="+" data-parsoid='{"stx":"simple","a":{"href":"./+"},"sa":{"href":"+"}}'>+</a> <span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"bogus","ak":"foo"},{"ck":"caption","ak":"[[bar]]"}]}' data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"&lt;a rel=\"mw:WikiLink\" href=\"./Bar\" title=\"Bar\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bar\"},\"sa\":{\"href\":\"bar\"},\"dsr\":[94,101,2,2]}&#39;>bar&lt;/a>"}'><a href="./File:%25+abc9" data-parsoid='{"a":{"href":"./File:%25+abc9"},"sa":{}}'><img resource="./File:%25+abc9" src="./Special:FilePath/%25+abc9" height="220" width="220" data-parsoid='{"a":{"resource":"./File:%25+abc9","height":"220","width":"220"},"sa":{"resource":"File:%+abc%39"}}'/></a></span>
+<a rel="mw:WikiLink" href="./%25" title="%" data-parsoid='{"stx":"simple","a":{"href":"./%25"},"sa":{"href":"%"}}'>%</a> <a rel="mw:WikiLink" href="./+" title="+" data-parsoid='{"stx":"simple","a":{"href":"./+"},"sa":{"href":"+"}}'>+</a> <span class="mw-default-size" typeof="mw:Error mw:Image" data-parsoid='{"optList":[{"ck":"bogus","ak":"foo"},{"ck":"caption","ak":"[[bar]]"}]}' data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}],"caption":"&lt;a rel=\"mw:WikiLink\" href=\"./Bar\" title=\"Bar\" data-parsoid=&#39;{\"stx\":\"simple\",\"a\":{\"href\":\"./Bar\"},\"sa\":{\"href\":\"bar\"},\"dsr\":[94,101,2,2]}&#39;>bar&lt;/a>"}'><a href="./File:%25+abc9" data-parsoid='{"a":{"href":"./File:%25+abc9"},"sa":{}}'><img resource="./File:%25+abc9" src="./Special:FilePath/%25+abc9" height="220" width="220" data-parsoid='{"a":{"resource":"./File:%25+abc9","height":"220","width":"220"},"sa":{"resource":"File:%+abc%39"}}'/></a></span>
 <a rel="mw:WikiLink" href="./3E" title="3E" data-parsoid='{"stx":"simple","a":{"href":"./3E"},"sa":{"href":"%33%45"}}'>3E</a> <a rel="mw:WikiLink" href="./3E+" title="3E+" data-parsoid='{"stx":"simple","a":{"href":"./3E+"},"sa":{"href":"%33%45+"}}'>3E+</a></p>
 !! end
 
@@ -21979,8 +22615,8 @@ Special characters in embedded file links (T29679)
 <a href="/index.php?title=Special:Upload&amp;wpDestFile=Does_not_exist.jpg" class="new" title="File:Does not exist.jpg">Title with &amp; ampersand</a>
 </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:Contains_&amp;_ampersand.jpg"><img resource="./File:Contains_&amp;_ampersand.jpg" src="./Special:FilePath/Contains_&amp;_ampersand.jpg" height="220" width="220"/></a></span>
-<span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"missing-image","message":"This image does not exist."}],"caption":"Title with &amp;amp; ampersand"}'><a href="./File:Does_not_exist.jpg"><img resource="./File:Does_not_exist.jpg" src="./Special:FilePath/Does_not_exist.jpg" height="220" width="220"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}]}'><a href="./File:Contains_&amp;_ampersand.jpg"><img resource="./File:Contains_&amp;_ampersand.jpg" src="./Special:FilePath/Contains_&amp;_ampersand.jpg" height="220" width="220"/></a></span>
+<span class="mw-default-size" typeof="mw:Error mw:Image" data-mw='{"errors":[{"key":"apierror-filedoesnotexist","message":"This image does not exist."}],"caption":"Title with &amp;amp; ampersand"}'><a href="./File:Does_not_exist.jpg"><img resource="./File:Does_not_exist.jpg" src="./Special:FilePath/Does_not_exist.jpg" height="220" width="220"/></a></span></p>
 !! end
 
 !! test
@@ -22103,6 +22739,12 @@ language=en
 </p>
 !! end
 
+# Note that Parsoid doesn't emit an explicit TOC.
+# Note also that the html2wt direction tends to emit an extra newline
+# between the __TOC__ magicword and the first heading unless *both*
+# the <meta> and the <h2> have a data-parsoid attribute set (even if
+# it's "{}").
+
 !! test
 T28375: TOC with italics
 !! options
@@ -22110,8 +22752,8 @@ title=[[Main Page]]
 !! wikitext
 __TOC__
 == ''Lost'' episodes ==
-!! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+!! html/php
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
 </ul>
@@ -22119,6 +22761,9 @@ __TOC__
 
 <h2><span class="mw-headline" id="Lost_episodes"><i>Lost</i> episodes</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
+!! html/parsoid
+<meta property="mw:PageProp/toc" data-parsoid='{}'/>
+<h2 data-parsoid='{}'> <i>Lost</i> episodes </h2>
 !! end
 
 !! test
@@ -22128,8 +22773,8 @@ title=[[Main Page]]
 !! wikitext
 __TOC__
 == '''should be bold''' then normal text ==
-!! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+!! html/php
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
 </ul>
@@ -22137,6 +22782,9 @@ __TOC__
 
 <h2><span class="mw-headline" id="should_be_bold_then_normal_text"><b>should be bold</b> then normal text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
+!! html/parsoid
+<meta property="mw:PageProp/toc" data-parsoid='{}'/>
+<h2 data-parsoid='{}'> <b>should be bold</b> then normal text </h2>
 !! end
 
 !! test
@@ -22146,8 +22794,8 @@ title=[[Main Page]]
 !! wikitext
 __TOC__
 == Image [[Image:foobar.jpg]] ==
-!! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+!! html/php
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
 </ul>
@@ -22155,6 +22803,9 @@ __TOC__
 
 <h2><span class="mw-headline" id="Image">Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
+!! html/parsoid
+<meta property="mw:PageProp/toc" data-parsoid='{}'/>
+<h2 data-parsoid='{}'> Image <span class="mw-default-size" typeof="mw:Image"><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" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"Image:foobar.jpg"}}'/></a></span> </h2>
 !! end
 
 !! test
@@ -22164,8 +22815,8 @@ title=[[Main Page]]
 !! wikitext
 __TOC__
 == <blockquote>Quote</blockquote> ==
-!! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+!! html/php
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
 </ul>
@@ -22173,10 +22824,10 @@ __TOC__
 
 <h2><span class="mw-headline" id="Quote"><blockquote>Quote</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
-!! html+tidy
+!! html/php+tidy
 <p></p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
@@ -22189,6 +22840,9 @@ __TOC__
 <p><span class="mw-headline" id="Quote">Quote</span></p>
 </blockquote>
 <p><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a><span class="mw-editsection-bracket">]</span></span></p>
+!! html/parsoid
+<meta property="mw:PageProp/toc" data-parsoid='{}'/>
+<h2 data-parsoid='{}'> <blockquote>Quote</blockquote> </h2>
 !! end
 
 !! test
@@ -22200,8 +22854,8 @@ __TOC__
 == Proof: 2 < 3 ==
 <small>Hanc marginis exiguitas non caperet.</small>
 QED
-!! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+!! html/php
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
 </ul>
@@ -22211,6 +22865,11 @@ QED
 <p><small>Hanc marginis exiguitas non caperet.</small>
 QED
 </p>
+!! html/parsoid
+<meta property="mw:PageProp/toc" data-parsoid='{}'/>
+<h2 data-parsoid='{}'> Proof: 2 &lt; 3 </h2>
+<p><small>Hanc marginis exiguitas non caperet.</small>
+QED</p>
 !! end
 
 !! test
@@ -22220,8 +22879,8 @@ __TOC__
 == <i>Foo</i> <b>Bar</b> ==
 
 == <i>Foo</i> <blockquote>Bar</blockquote> ==
-!! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+!! html/php
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
@@ -22231,10 +22890,10 @@ __TOC__
 <h2><span class="mw-headline" id="Foo_Bar"><i>Foo</i> <b>Bar</b></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: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <h2><span class="mw-headline" id="Foo_Bar_2"><i>Foo</i> <blockquote>Bar</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
-!! html+tidy
+!! html/php+tidy
 <p></p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
@@ -22249,6 +22908,10 @@ __TOC__
 <p><span class="mw-headline" id="Foo_Bar_2">Bar</span></p>
 </blockquote>
 <p><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></p>
+!! html/parsoid
+<meta property="mw:PageProp/toc" data-parsoid='{}'/>
+<h2 data-parsoid='{}'> <i data-parsoid='{"stx":"html"}'>Foo</i> <b data-parsoid='{"stx":"html"}'>Bar</b> </h2>
+<h2> <i data-parsoid='{"stx":"html"}'>Foo</i> <blockquote>Bar</blockquote> </h2>
 !! end
 
 # Don't expect Parsoid to roundtrip this until the php parser comes closer to
@@ -22263,7 +22926,7 @@ __TOC__
 
 == <sup class="a > b">Evilbye</sup> ==
 !! html/php
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></span></a></li>
@@ -22293,8 +22956,8 @@ __TOC__
 == <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> ==
 
 == <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> ==
-!! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+!! html/php
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#C.2B.2B"><span class="tocnumber">1</span> <span class="toctext"><span dir="ltr">C++</span></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#.D7.96.D7.91.D7.A0.D7.92.21"><span class="tocnumber">2</span> <span class="toctext"><span dir="rtl">זבנג!</span></span></a></li>
@@ -22310,6 +22973,13 @@ __TOC__
 <h2><span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <h2><span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
+!! html/parsoid
+<meta property="mw:PageProp/toc" data-parsoid='{}'/>
+<h2 data-parsoid='{}'> <span dir="ltr">C++</span> </h2>
+<h2> <span dir="rtl">זבנג!</span> </h2>
+<h2> <span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span> </h2>
+<h2> <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> </h2>
+<h2> <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> </h2>
 !! end
 
 !! test
@@ -22317,8 +22987,8 @@ T74884: bdi element in ToC
 !! wikitext
 __TOC__
 == <bdi>test</bdi> ==
-!! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+!! html/php
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#test"><span class="tocnumber">1</span> <span class="toctext"><bdi>test</bdi></span></a></li>
 </ul>
@@ -22326,6 +22996,9 @@ __TOC__
 
 <h2><span class="mw-headline" id="test"><bdi>test</bdi></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: test">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
+!! html/parsoid
+<meta property="mw:PageProp/toc" data-parsoid='{}'/>
+<h2 data-parsoid='{}'> <bdi>test</bdi> </h2>
 !! end
 
 !! test
@@ -22333,8 +23006,8 @@ T35715: s/strike element in ToC
 !! wikitext
 __TOC__
 == <s>test</s> test <strike>test</strike> ==
-!! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+!! html/php
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#test_test_test"><span class="tocnumber">1</span> <span class="toctext"><s>test</s> test <strike>test</strike></span></a></li>
 </ul>
@@ -22342,6 +23015,9 @@ __TOC__
 
 <h2><span class="mw-headline" id="test_test_test"><s>test</s> test <strike>test</strike></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: test test test">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
+!! html/parsoid
+<meta property="mw:PageProp/toc" data-parsoid='{}'/>
+<h2 data-parsoid='{}'> <s>test</s> test <strike>test</strike> </h2>
 !! end
 
 # Note that the html output does not have the <p></p>, but the
@@ -22352,8 +23028,8 @@ Empty <p> tag in TOC, removed by Sanitizer (T92892)
 !! wikitext
 __TOC__
 == x ==
-!! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+!! html/php
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#x"><span class="tocnumber">1</span> <span class="toctext">x</span></a></li>
 </ul>
@@ -22361,10 +23037,10 @@ __TOC__
 
 <h2><span class="mw-headline" id="x">x</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: x">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
-!! html+tidy
+!! html/php+tidy
 <p></p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
@@ -22373,6 +23049,9 @@ __TOC__
 </div>
 <p></p>
 <h2><span class="mw-headline" id="x">x</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: x">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+!! html/parsoid
+<meta property="mw:PageProp/toc" data-parsoid='{}'/>
+<h2 data-parsoid='{}'> x </h2>
 !! end
 
 !! article
@@ -22746,14 +23425,12 @@ parsoid={
 ## 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>
+<p><span typeof="mw:Error mw:Extension/section" about="#mwt1" data-mw='{"name":"section","attrs":{"begin":"2011-05-16"},"body":null,"errors":[{"key":"mw-api-extexpand-error","message":"Could not expand extension source."}]}'>&lt;section begin="2011-05-16" /></span>
+<span typeof="mw:Error mw:Extension/section" about="#mwt2" data-mw='{"name":"section","attrs":{"end":"2014-04-10 (MW 1.23wmf22)"},"body":null,"errors":[{"key":"mw-api-extexpand-error","message":"Could not expand extension source."}]}'>&lt;section end="2014-04-10 (MW 1.23wmf22)" /></span></p>
 !! end
 
 #--------- Test stripping of empty nodes in template content ----------
@@ -23780,7 +24457,8 @@ Links 4. ExtLinks: Escapes needed
 parsoid=html2wt
 !! html/parsoid
 <p><a rel="mw:ExtLink" href="http://google.com">[google]</a>
-<a rel="mw:ExtLink" href="http://google.com">google]</a></p>
+<a rel="mw:ExtLink" href="http://google.com">google]</a>
+<a rel="mw:ExtLink" href="http://google.com">goog] le</a></p>
 <p>[http://google.com]</p>
 <p>[http://google.com google]</p>
 <p>[<a rel="mw:ExtLink" href="http://google.com">http://google.com</a>]</p>
@@ -23788,6 +24466,7 @@ parsoid=html2wt
 !! wikitext
 [http://google.com <nowiki>[google]</nowiki>]
 [http://google.com <nowiki>google]</nowiki>]
+[http://google.com <nowiki>goog] le</nowiki>]
 
 <nowiki>[http://google.com]</nowiki>
 
@@ -23799,6 +24478,7 @@ parsoid=html2wt
 !! html/php
 <p><a rel="nofollow" class="external text" href="http://google.com">[google]</a>
 <a rel="nofollow" class="external text" href="http://google.com">google]</a>
+<a rel="nofollow" class="external text" href="http://google.com">goog] le</a>
 </p><p>[http://google.com]
 </p><p>[http://google.com google]
 </p><p>[<a rel="nofollow" class="external free" href="http://google.com">http://google.com</a>]
@@ -24142,7 +24822,7 @@ parsoid=html2wt
 !! test
 4. No escaping needed
 !! options
-options=html2wt
+parsoid=html2wt
 !! html/parsoid
 <p>'<span><i>bar</i></span>'
 '<span><b>bar</b></span>'
@@ -24279,7 +24959,7 @@ parsoid=html2wt
 !! test
 4. Leading whitespace in indent-pre suppressing contexts should not be escaped
 !! options
-options=html2wt
+parsoid=html2wt
 !! 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>caption</figcaption></figure>
 !! wikitext
@@ -25136,7 +25816,7 @@ Properly encapsulate empty-content transclusions in fosterable positions
 }}
 </table>
 !! html/parsoid
-<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["&lt;table>\n",{"template":{"target":{"wt":"#if:","function":"#if"},"params":{"1":{"wt":"\n&lt;td>foo&lt;/td>\n"}},"i":0}},"\n&lt;/table>"]}' data-parsoid='{"stx":"html","pi":[[{"k":"1"}]]}'>
+<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["&lt;table>\n",{"template":{"target":{"wt":"#if:","function":"if"},"params":{"1":{"wt":"\n&lt;td>foo&lt;/td>\n"}},"i":0}},"\n&lt;/table>"]}' data-parsoid='{"stx":"html","pi":[[{"k":"1"}]]}'>
 
 </table>
 !! end
@@ -26582,6 +27262,16 @@ parsoid=html2wt
 [http://test.com][[one]] two three
 !! end
 
+!! test
+Catch regression when unpacking misnested links
+!! options
+parsoid=wt2html
+!! wikitext
+{{echo|hi}}[http://example.com [[ho]]]
+!! html/parsoid
+<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"hi"}},"i":0}}]}'>hi</span><a rel="mw:ExtLink" href="http://example.com"></a><a rel="mw:WikiLink" href="./Ho" title="Ho" data-parsoid='{"misnested":true}'>ho</a></p>
+!! end
+
 !! test
 Use data-parsoid.firstWikitextNode to compute newline constraints for template content
 !! options
@@ -26633,6 +27323,20 @@ parsoid= {
 # Tests spec'ing wikitext serialization norms |
 # --------------------------------------------
 
+!! test
+Serialize multi-line indent-pre starting with wikitext syntax
+!! options
+parsoid=html2wt
+!! html/parsoid
+<pre>* 1
+** 2
+* 3</pre>
+!! wikitext
+ * 1
+ ** 2
+ * 3
+!! end
+
 !! test
 1. Categories should always be serialized on their own line
 !! options
 |}
 !! end
 
+!! test
+Anchor without href scenarios
+!! options
+parsoid={ "modes": ["html2wt"], "suppressErrors": true }
+!! html/parsoid
+<a class="bc"></a>
+<a class="no">dice</a>
+<a name="foo"></a>
+!! wikitext
+
+dice
+<span name="foo"></span>
+!! end
+
 # -----------------------------------------------------------------
 # End of section for Parsoid-only html2wt tests for serialization
 # of new content
index 57223da..286a1a4 100644 (file)
@@ -1,4 +1,4 @@
-<root><template><title>int:allmessagestext</title></template>
+<root><template><title>int:57dbe26a</title></template>
 
 &lt;table border=1 width=100%&gt;&lt;tr&gt;&lt;td&gt;
 '''Name'''
 &lt;/td&gt;&lt;td&gt;
 '''Current text'''
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1movedto2&amp;action=edit 1movedto2]&lt;br&gt;
-[[MediaWiki_talk:1movedto2|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f9cca05b&amp;action=edit f9cca05b]&lt;br&gt;
+[[MediaWiki_talk:f9cca05b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 $1 moved to $2
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:1movedto2</title></template>
+<template lineStart="1"><title>int:f9cca05b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Monobook.css&amp;action=edit Monobook.css]&lt;br&gt;
-[[MediaWiki_talk:Monobook.css|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ed065216&amp;action=edit ed065216]&lt;br&gt;
+[[MediaWiki_talk:ed065216|Talk]]
 &lt;/td&gt;&lt;td&gt;
 /* edit this file to customize the monobook skin for the entire site */
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Monobook.css</title></template>
+<template lineStart="1"><title>int:ed065216</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:About&amp;action=edit about]&lt;br&gt;
-[[MediaWiki_talk:About|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6b21fb79&amp;action=edit 5780daf6]&lt;br&gt;
+[[MediaWiki_talk:6b21fb79|Talk]]
 &lt;/td&gt;&lt;td&gt;
 About
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:About</title></template>
+<template lineStart="1"><title>int:6b21fb79</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Aboutpage&amp;action=edit aboutpage]&lt;br&gt;
-[[MediaWiki_talk:Aboutpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:54f19e13&amp;action=edit 4bd9b804]&lt;br&gt;
+[[MediaWiki_talk:54f19e13|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary:About
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Aboutpage</title></template>
+<template lineStart="1"><title>int:54f19e13</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Aboutwikipedia&amp;action=edit aboutwikipedia]&lt;br&gt;
-[[MediaWiki_talk:Aboutwikipedia|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8e17cc1b&amp;action=edit 7be96c69]&lt;br&gt;
+[[MediaWiki_talk:8e17cc1b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 About Wiktionary
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Aboutwikipedia</title></template>
+<template lineStart="1"><title>int:8e17cc1b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-addsection&amp;action=edit accesskey-addsection]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-addsection|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4b7f0428&amp;action=edit 69f5ae1e]&lt;br&gt;
+[[MediaWiki_talk:4b7f0428|Talk]]
 &lt;/td&gt;&lt;td&gt;
 +
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-addsection</title></template>
+<template lineStart="1"><title>int:4b7f0428</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-anontalk&amp;action=edit accesskey-anontalk]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-anontalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b18a7fba&amp;action=edit ba8c9426]&lt;br&gt;
+[[MediaWiki_talk:b18a7fba|Talk]]
 &lt;/td&gt;&lt;td&gt;
 n
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-anontalk</title></template>
+<template lineStart="1"><title>int:b18a7fba</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-anonuserpage&amp;action=edit accesskey-anonuserpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-anonuserpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3cfd08b4&amp;action=edit 098256f5]&lt;br&gt;
+[[MediaWiki_talk:3cfd08b4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 .
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-anonuserpage</title></template>
+<template lineStart="1"><title>int:3cfd08b4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-article&amp;action=edit accesskey-article]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-article|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d00706c5&amp;action=edit 7638fc38]&lt;br&gt;
+[[MediaWiki_talk:d00706c5|Talk]]
 &lt;/td&gt;&lt;td&gt;
 a
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-article</title></template>
+<template lineStart="1"><title>int:d00706c5</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-compareselectedversions&amp;action=edit accesskey-compareselectedversions]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-compareselectedversions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7bbcdfc9&amp;action=edit 840afed8]&lt;br&gt;
+[[MediaWiki_talk:7bbcdfc9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 v
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-compareselectedversions</title></template>
+<template lineStart="1"><title>int:7bbcdfc9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-contributions&amp;action=edit accesskey-contributions]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-contributions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0750ed4b&amp;action=edit 9703e6d9]&lt;br&gt;
+[[MediaWiki_talk:0750ed4b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;amp;lt;accesskey-contributions&amp;amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-contributions</title></template>
+<template lineStart="1"><title>int:0750ed4b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-currentevents&amp;action=edit accesskey-currentevents]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-currentevents|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:602dda6f&amp;action=edit 7e13f963]&lt;br&gt;
+[[MediaWiki_talk:602dda6f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;amp;lt;accesskey-currentevents&amp;amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-currentevents</title></template>
+<template lineStart="1"><title>int:602dda6f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-delete&amp;action=edit accesskey-delete]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-delete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a395260e&amp;action=edit be42f966]&lt;br&gt;
+[[MediaWiki_talk:a395260e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 d
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-delete</title></template>
+<template lineStart="1"><title>int:a395260e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-edit&amp;action=edit accesskey-edit]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-edit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f89faca3&amp;action=edit 89888a71]&lt;br&gt;
+[[MediaWiki_talk:f89faca3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 e
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-edit</title></template>
+<template lineStart="1"><title>int:f89faca3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-emailuser&amp;action=edit accesskey-emailuser]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-emailuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bc7a3e78&amp;action=edit 7b2ee991]&lt;br&gt;
+[[MediaWiki_talk:bc7a3e78|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;amp;lt;accesskey-emailuser&amp;amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-emailuser</title></template>
+<template lineStart="1"><title>int:bc7a3e78</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-help&amp;action=edit accesskey-help]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-help|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9e9d3613&amp;action=edit fe788279]&lt;br&gt;
+[[MediaWiki_talk:9e9d3613|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;amp;lt;accesskey-help&amp;amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-help</title></template>
+<template lineStart="1"><title>int:9e9d3613</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-history&amp;action=edit accesskey-history]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-history|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7ea0e322&amp;action=edit 4bb7a2e4]&lt;br&gt;
+[[MediaWiki_talk:7ea0e322|Talk]]
 &lt;/td&gt;&lt;td&gt;
 h
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-history</title></template>
+<template lineStart="1"><title>int:7ea0e322</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-login&amp;action=edit accesskey-login]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-login|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4204d3db&amp;action=edit 725cb6bf]&lt;br&gt;
+[[MediaWiki_talk:4204d3db|Talk]]
 &lt;/td&gt;&lt;td&gt;
 o
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-login</title></template>
+<template lineStart="1"><title>int:4204d3db</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-logout&amp;action=edit accesskey-logout]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-logout|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a92e37a&amp;action=edit a1de2049]&lt;br&gt;
+[[MediaWiki_talk:2a92e37a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 o
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-logout</title></template>
+<template lineStart="1"><title>int:2a92e37a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mainpage&amp;action=edit accesskey-mainpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-mainpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:68d388ec&amp;action=edit 0542623d]&lt;br&gt;
+[[MediaWiki_talk:68d388ec|Talk]]
 &lt;/td&gt;&lt;td&gt;
 z
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-mainpage</title></template>
+<template lineStart="1"><title>int:68d388ec</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-minoredit&amp;action=edit accesskey-minoredit]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-minoredit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:18fe1121&amp;action=edit e3f25b72]&lt;br&gt;
+[[MediaWiki_talk:18fe1121|Talk]]
 &lt;/td&gt;&lt;td&gt;
 i
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-minoredit</title></template>
+<template lineStart="1"><title>int:18fe1121</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-move&amp;action=edit accesskey-move]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-move|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6d15983f&amp;action=edit c9d212d3]&lt;br&gt;
+[[MediaWiki_talk:6d15983f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 m
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-move</title></template>
+<template lineStart="1"><title>int:6d15983f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mycontris&amp;action=edit accesskey-mycontris]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-mycontris|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ecaba7f4&amp;action=edit ac57178f]&lt;br&gt;
+[[MediaWiki_talk:ecaba7f4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 y
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-mycontris</title></template>
+<template lineStart="1"><title>int:ecaba7f4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mytalk&amp;action=edit accesskey-mytalk]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-mytalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:711aec5d&amp;action=edit 6d3ae9a7]&lt;br&gt;
+[[MediaWiki_talk:711aec5d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 n
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-mytalk</title></template>
+<template lineStart="1"><title>int:711aec5d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-portal&amp;action=edit accesskey-portal]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-portal|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9905f56f&amp;action=edit 0a376cab]&lt;br&gt;
+[[MediaWiki_talk:9905f56f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;amp;lt;accesskey-portal&amp;amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-portal</title></template>
+<template lineStart="1"><title>int:9905f56f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-preferences&amp;action=edit accesskey-preferences]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-preferences|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9305eef3&amp;action=edit e72912be]&lt;br&gt;
+[[MediaWiki_talk:9305eef3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;amp;lt;accesskey-preferences&amp;amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-preferences</title></template>
+<template lineStart="1"><title>int:9305eef3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-preview&amp;action=edit accesskey-preview]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-preview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:186ee8a4&amp;action=edit cef51de6]&lt;br&gt;
+[[MediaWiki_talk:186ee8a4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 p
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-preview</title></template>
+<template lineStart="1"><title>int:186ee8a4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-protect&amp;action=edit accesskey-protect]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-protect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:676f28e9&amp;action=edit 0f10afb5]&lt;br&gt;
+[[MediaWiki_talk:676f28e9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 =
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-protect</title></template>
+<template lineStart="1"><title>int:676f28e9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-randompage&amp;action=edit accesskey-randompage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-randompage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1a09f43e&amp;action=edit 46a4e82c]&lt;br&gt;
+[[MediaWiki_talk:1a09f43e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 x
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-randompage</title></template>
+<template lineStart="1"><title>int:1a09f43e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-recentchanges&amp;action=edit accesskey-recentchanges]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-recentchanges|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1306607d&amp;action=edit 025b667f]&lt;br&gt;
+[[MediaWiki_talk:1306607d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 r
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-recentchanges</title></template>
+<template lineStart="1"><title>int:1306607d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-recentchangeslinked&amp;action=edit accesskey-recentchangeslinked]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-recentchangeslinked|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e14390c4&amp;action=edit 600e8a44]&lt;br&gt;
+[[MediaWiki_talk:e14390c4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 c
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-recentchangeslinked</title></template>
+<template lineStart="1"><title>int:e14390c4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-save&amp;action=edit accesskey-save]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-save|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:59b75a10&amp;action=edit 0fde75cd]&lt;br&gt;
+[[MediaWiki_talk:59b75a10|Talk]]
 &lt;/td&gt;&lt;td&gt;
 s
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-save</title></template>
+<template lineStart="1"><title>int:59b75a10</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-search&amp;action=edit accesskey-search]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-search|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0b6fd89e&amp;action=edit 5163ba5b]&lt;br&gt;
+[[MediaWiki_talk:0b6fd89e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 f
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-search</title></template>
+<template lineStart="1"><title>int:0b6fd89e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-sitesupport&amp;action=edit accesskey-sitesupport]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-sitesupport|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ba9e0fc4&amp;action=edit f70dbcff]&lt;br&gt;
+[[MediaWiki_talk:ba9e0fc4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;amp;lt;accesskey-sitesupport&amp;amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-sitesupport</title></template>
+<template lineStart="1"><title>int:ba9e0fc4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-specialpage&amp;action=edit accesskey-specialpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-specialpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b932fee9&amp;action=edit 8949be8d]&lt;br&gt;
+[[MediaWiki_talk:b932fee9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;amp;lt;accesskey-specialpage&amp;amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-specialpage</title></template>
+<template lineStart="1"><title>int:b932fee9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-specialpages&amp;action=edit accesskey-specialpages]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-specialpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1ac10275&amp;action=edit 59a5e487]&lt;br&gt;
+[[MediaWiki_talk:1ac10275|Talk]]
 &lt;/td&gt;&lt;td&gt;
 q
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-specialpages</title></template>
+<template lineStart="1"><title>int:1ac10275</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-talk&amp;action=edit accesskey-talk]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-talk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:116fd1b0&amp;action=edit a83f2193]&lt;br&gt;
+[[MediaWiki_talk:116fd1b0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 t
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-talk</title></template>
+<template lineStart="1"><title>int:116fd1b0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-undelete&amp;action=edit accesskey-undelete]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-undelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ec06f1a7&amp;action=edit 5894e42e]&lt;br&gt;
+[[MediaWiki_talk:ec06f1a7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 d
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-undelete</title></template>
+<template lineStart="1"><title>int:ec06f1a7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-unwatch&amp;action=edit accesskey-unwatch]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-unwatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7f99a8c2&amp;action=edit 2a2a9d13]&lt;br&gt;
+[[MediaWiki_talk:7f99a8c2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 w
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-unwatch</title></template>
+<template lineStart="1"><title>int:7f99a8c2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-upload&amp;action=edit accesskey-upload]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-upload|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:903549e8&amp;action=edit 3a1dcde8]&lt;br&gt;
+[[MediaWiki_talk:903549e8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 u
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-upload</title></template>
+<template lineStart="1"><title>int:903549e8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-userpage&amp;action=edit accesskey-userpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-userpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8f696cc0&amp;action=edit be76a8c2]&lt;br&gt;
+[[MediaWiki_talk:8f696cc0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 .
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-userpage</title></template>
+<template lineStart="1"><title>int:8f696cc0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-viewsource&amp;action=edit accesskey-viewsource]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-viewsource|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:613ebbad&amp;action=edit e467bdec]&lt;br&gt;
+[[MediaWiki_talk:613ebbad|Talk]]
 &lt;/td&gt;&lt;td&gt;
 e
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-viewsource</title></template>
+<template lineStart="1"><title>int:613ebbad</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-watch&amp;action=edit accesskey-watch]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-watch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f598b5d6&amp;action=edit 8bbdd8ad]&lt;br&gt;
+[[MediaWiki_talk:f598b5d6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 w
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-watch</title></template>
+<template lineStart="1"><title>int:f598b5d6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-watchlist&amp;action=edit accesskey-watchlist]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-watchlist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:59863979&amp;action=edit f8563593]&lt;br&gt;
+[[MediaWiki_talk:59863979|Talk]]
 &lt;/td&gt;&lt;td&gt;
 l
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-watchlist</title></template>
+<template lineStart="1"><title>int:59863979</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-whatlinkshere&amp;action=edit accesskey-whatlinkshere]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-whatlinkshere|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:00143391&amp;action=edit 016415ff]&lt;br&gt;
+[[MediaWiki_talk:00143391|Talk]]
 &lt;/td&gt;&lt;td&gt;
 b
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-whatlinkshere</title></template>
+<template lineStart="1"><title>int:00143391</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accmailtext&amp;action=edit accmailtext]&lt;br&gt;
-[[MediaWiki_talk:Accmailtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d4dce921&amp;action=edit c90b0565]&lt;br&gt;
+[[MediaWiki_talk:d4dce921|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The Password for &amp;#39;$1&amp;#39; has been sent to $2.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accmailtext</title></template>
+<template lineStart="1"><title>int:d4dce921</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accmailtitle&amp;action=edit accmailtitle]&lt;br&gt;
-[[MediaWiki_talk:Accmailtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9e6cd678&amp;action=edit 05cb31f3]&lt;br&gt;
+[[MediaWiki_talk:9e6cd678|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Password sent.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accmailtitle</title></template>
+<template lineStart="1"><title>int:9e6cd678</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Actioncomplete&amp;action=edit actioncomplete]&lt;br&gt;
-[[MediaWiki_talk:Actioncomplete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:37186ec6&amp;action=edit 6703566b]&lt;br&gt;
+[[MediaWiki_talk:37186ec6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Action complete
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Actioncomplete</title></template>
+<template lineStart="1"><title>int:37186ec6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addedwatch&amp;action=edit addedwatch]&lt;br&gt;
-[[MediaWiki_talk:Addedwatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2bacba53&amp;action=edit 9a954e94]&lt;br&gt;
+[[MediaWiki_talk:2bacba53|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Added to watchlist
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Addedwatch</title></template>
+<template lineStart="1"><title>int:2bacba53</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addedwatchtext&amp;action=edit addedwatchtext]&lt;br&gt;
-[[MediaWiki_talk:Addedwatchtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b28893b8&amp;action=edit cb101aa3]&lt;br&gt;
+[[MediaWiki_talk:b28893b8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The page &amp;quot;$1&amp;quot; has been added to your &amp;#91;&amp;#91;Special:Watchlist&amp;#124;watchlist]].
 Future changes to this page and its associated Talk page will be listed there,
@@ -360,150 +360,150 @@ make it easier to pick out.
 
 &amp;lt;p&amp;gt;If you want to remove the page from your watchlist later, click &amp;quot;Stop watching&amp;quot; in the sidebar.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Addedwatchtext</title></template>
+<template lineStart="1"><title>int:b28893b8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addsection&amp;action=edit addsection]&lt;br&gt;
-[[MediaWiki_talk:Addsection|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:291bfe3c&amp;action=edit 788205f7]&lt;br&gt;
+[[MediaWiki_talk:291bfe3c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 +
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Addsection</title></template>
+<template lineStart="1"><title>int:291bfe3c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Administrators&amp;action=edit administrators]&lt;br&gt;
-[[MediaWiki_talk:Administrators|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0d4d418a&amp;action=edit 69189a95]&lt;br&gt;
+[[MediaWiki_talk:0d4d418a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary:Administrators
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Administrators</title></template>
+<template lineStart="1"><title>int:0d4d418a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Affirmation&amp;action=edit affirmation]&lt;br&gt;
-[[MediaWiki_talk:Affirmation|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1b4ceeda&amp;action=edit f61e4837]&lt;br&gt;
+[[MediaWiki_talk:1b4ceeda|Talk]]
 &lt;/td&gt;&lt;td&gt;
 I affirm that the copyright holder of this file
 agrees to license it under the terms of the $1.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Affirmation</title></template>
+<template lineStart="1"><title>int:1b4ceeda</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:All&amp;action=edit all]&lt;br&gt;
-[[MediaWiki_talk:All|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6a720856&amp;action=edit d87c4480]&lt;br&gt;
+[[MediaWiki_talk:6a720856|Talk]]
 &lt;/td&gt;&lt;td&gt;
 all
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:All</title></template>
+<template lineStart="1"><title>int:6a720856</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allmessages&amp;action=edit allmessages]&lt;br&gt;
-[[MediaWiki_talk:Allmessages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f2fab435&amp;action=edit a6623c77]&lt;br&gt;
+[[MediaWiki_talk:f2fab435|Talk]]
 &lt;/td&gt;&lt;td&gt;
 All system messages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Allmessages</title></template>
+<template lineStart="1"><title>int:f2fab435</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allmessagestext&amp;action=edit allmessagestext]&lt;br&gt;
-[[MediaWiki_talk:Allmessagestext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e57c77b8&amp;action=edit 57dbe26a]&lt;br&gt;
+[[MediaWiki_talk:e57c77b8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This is a list of all system messages available in the MediaWiki: namespace.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Allmessagestext</title></template>
+<template lineStart="1"><title>int:e57c77b8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allpages&amp;action=edit allpages]&lt;br&gt;
-[[MediaWiki_talk:Allpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ff8db74d&amp;action=edit bf1dccf6]&lt;br&gt;
+[[MediaWiki_talk:ff8db74d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 All pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Allpages</title></template>
+<template lineStart="1"><title>int:ff8db74d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alphaindexline&amp;action=edit alphaindexline]&lt;br&gt;
-[[MediaWiki_talk:Alphaindexline|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:89c23e53&amp;action=edit 1ee05de8]&lt;br&gt;
+[[MediaWiki_talk:89c23e53|Talk]]
 &lt;/td&gt;&lt;td&gt;
 $1 to $2
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Alphaindexline</title></template>
+<template lineStart="1"><title>int:89c23e53</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alreadyloggedin&amp;action=edit alreadyloggedin]&lt;br&gt;
-[[MediaWiki_talk:Alreadyloggedin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8550125b&amp;action=edit 0dc174ae]&lt;br&gt;
+[[MediaWiki_talk:8550125b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;font color=red&amp;gt;&amp;lt;b&amp;gt;User $1, you are already logged in!&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Alreadyloggedin</title></template>
+<template lineStart="1"><title>int:8550125b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alreadyrolled&amp;action=edit alreadyrolled]&lt;br&gt;
-[[MediaWiki_talk:Alreadyrolled|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3f7be8a8&amp;action=edit 3f1bd6a1]&lt;br&gt;
+[[MediaWiki_talk:3f7be8a8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Cannot rollback last edit of &amp;#91;&amp;#91;$1]]
 by &amp;#91;&amp;#91;User:$2&amp;#124;$2]] (&amp;#91;&amp;#91;User talk:$2&amp;#124;Talk]]); someone else has edited or rolled back the page already. 
 
 Last edit was by &amp;#91;&amp;#91;User:$3&amp;#124;$3]] (&amp;#91;&amp;#91;User talk:$3&amp;#124;Talk]]). 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Alreadyrolled</title></template>
+<template lineStart="1"><title>int:3f7be8a8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ancientpages&amp;action=edit ancientpages]&lt;br&gt;
-[[MediaWiki_talk:Ancientpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:49a4df39&amp;action=edit 4f70712f]&lt;br&gt;
+[[MediaWiki_talk:49a4df39|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Oldest pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ancientpages</title></template>
+<template lineStart="1"><title>int:49a4df39</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:And&amp;action=edit and]&lt;br&gt;
-[[MediaWiki_talk:And|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a01e33f4&amp;action=edit cffa50a3]&lt;br&gt;
+[[MediaWiki_talk:a01e33f4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 and
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:And</title></template>
+<template lineStart="1"><title>int:a01e33f4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anontalk&amp;action=edit anontalk]&lt;br&gt;
-[[MediaWiki_talk:Anontalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:20cb482e&amp;action=edit 801db13e]&lt;br&gt;
+[[MediaWiki_talk:20cb482e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Talk for this IP
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Anontalk</title></template>
+<template lineStart="1"><title>int:20cb482e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anontalkpagetext&amp;action=edit anontalkpagetext]&lt;br&gt;
-[[MediaWiki_talk:Anontalkpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5bbc19f4&amp;action=edit 07575f81]&lt;br&gt;
+[[MediaWiki_talk:5bbc19f4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 ----&amp;#39;&amp;#39;This is the discussion page for an anonymous user who has not created an account yet or who does not use it. We therefore have to use the numerical &amp;#91;&amp;#91;IP address]] to identify him/her. Such an IP address can be shared by several users. If you are an anonymous user and feel that irrelevant comments have been directed at you, please &amp;#91;&amp;#91;Special:Userlogin&amp;#124;create an account or log in]] to avoid future confusion with other anonymous users.&amp;#39;&amp;#39; 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Anontalkpagetext</title></template>
+<template lineStart="1"><title>int:5bbc19f4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anonymous&amp;action=edit anonymous]&lt;br&gt;
-[[MediaWiki_talk:Anonymous|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9bed5104&amp;action=edit 0a92fab3]&lt;br&gt;
+[[MediaWiki_talk:9bed5104|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Anonymous user(s) of Wiktionary
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Anonymous</title></template>
+<template lineStart="1"><title>int:9bed5104</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Article&amp;action=edit article]&lt;br&gt;
-[[MediaWiki_talk:Article|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4360c2dc&amp;action=edit 565cecd7]&lt;br&gt;
+[[MediaWiki_talk:4360c2dc|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Content page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Article</title></template>
+<template lineStart="1"><title>int:4360c2dc</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Articleexists&amp;action=edit articleexists]&lt;br&gt;
-[[MediaWiki_talk:Articleexists|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d3ee4a57&amp;action=edit ac8af25b]&lt;br&gt;
+[[MediaWiki_talk:d3ee4a57|Talk]]
 &lt;/td&gt;&lt;td&gt;
 A page of that name already exists, or the
 name you have chosen is not valid.
 Please choose another name.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Articleexists</title></template>
+<template lineStart="1"><title>int:d3ee4a57</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Articlepage&amp;action=edit articlepage]&lt;br&gt;
-[[MediaWiki_talk:Articlepage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:494f1af2&amp;action=edit 01d643b6]&lt;br&gt;
+[[MediaWiki_talk:494f1af2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View content page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Articlepage</title></template>
+<template lineStart="1"><title>int:494f1af2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Asksql&amp;action=edit asksql]&lt;br&gt;
-[[MediaWiki_talk:Asksql|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dc93382e&amp;action=edit 4e529571]&lt;br&gt;
+[[MediaWiki_talk:dc93382e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 SQL query
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Asksql</title></template>
+<template lineStart="1"><title>int:dc93382e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Asksqltext&amp;action=edit asksqltext]&lt;br&gt;
-[[MediaWiki_talk:Asksqltext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d12f6023&amp;action=edit 47551563]&lt;br&gt;
+[[MediaWiki_talk:d12f6023|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Use the form below to make a direct query of the
 database.
@@ -511,52 +511,52 @@ Use single quotes (&amp;#39;like this&amp;#39;) to delimit string literals.
 This can often add considerable load to the server, so please use
 this function sparingly.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Asksqltext</title></template>
+<template lineStart="1"><title>int:d12f6023</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Autoblocker&amp;action=edit autoblocker]&lt;br&gt;
-[[MediaWiki_talk:Autoblocker|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f36efd21&amp;action=edit d8f0b5e0]&lt;br&gt;
+[[MediaWiki_talk:f36efd21|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Autoblocked because you share an IP address with &amp;quot;$1&amp;quot;. Reason &amp;quot;$2&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Autoblocker</title></template>
+<template lineStart="1"><title>int:f36efd21</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badarticleerror&amp;action=edit badarticleerror]&lt;br&gt;
-[[MediaWiki_talk:Badarticleerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9503e2b1&amp;action=edit 100ce8a2]&lt;br&gt;
+[[MediaWiki_talk:9503e2b1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This action cannot be performed on this page.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badarticleerror</title></template>
+<template lineStart="1"><title>int:9503e2b1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badfilename&amp;action=edit badfilename]&lt;br&gt;
-[[MediaWiki_talk:Badfilename|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f146770f&amp;action=edit 5c50b102]&lt;br&gt;
+[[MediaWiki_talk:f146770f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Image name has been changed to &amp;quot;$1&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badfilename</title></template>
+<template lineStart="1"><title>int:f146770f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badfiletype&amp;action=edit badfiletype]&lt;br&gt;
-[[MediaWiki_talk:Badfiletype|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a87ee981&amp;action=edit fe89c3de]&lt;br&gt;
+[[MediaWiki_talk:a87ee981|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;quot;.$1&amp;quot; is not a recommended image file format.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badfiletype</title></template>
+<template lineStart="1"><title>int:a87ee981</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badipaddress&amp;action=edit badipaddress]&lt;br&gt;
-[[MediaWiki_talk:Badipaddress|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0222775a&amp;action=edit c7623eeb]&lt;br&gt;
+[[MediaWiki_talk:0222775a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Invalid IP address
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badipaddress</title></template>
+<template lineStart="1"><title>int:0222775a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badquery&amp;action=edit badquery]&lt;br&gt;
-[[MediaWiki_talk:Badquery|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:feabd786&amp;action=edit 798bc46a]&lt;br&gt;
+[[MediaWiki_talk:feabd786|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Badly formed search query
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badquery</title></template>
+<template lineStart="1"><title>int:feabd786</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badquerytext&amp;action=edit badquerytext]&lt;br&gt;
-[[MediaWiki_talk:Badquerytext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7e82f04b&amp;action=edit e5493056]&lt;br&gt;
+[[MediaWiki_talk:7e82f04b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 We could not process your query.
 This is probably because you have attempted to search for a
@@ -565,39 +565,39 @@ It could also be that you have mistyped the expression, for
 example &amp;quot;fish and and scales&amp;quot;.
 Please try another query.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badquerytext</title></template>
+<template lineStart="1"><title>int:7e82f04b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badretype&amp;action=edit badretype]&lt;br&gt;
-[[MediaWiki_talk:Badretype|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:36ad01d4&amp;action=edit c36e32c1]&lt;br&gt;
+[[MediaWiki_talk:36ad01d4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The passwords you entered do not match.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badretype</title></template>
+<template lineStart="1"><title>int:36ad01d4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badtitle&amp;action=edit badtitle]&lt;br&gt;
-[[MediaWiki_talk:Badtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ab570b90&amp;action=edit 5c0f9f2b]&lt;br&gt;
+[[MediaWiki_talk:ab570b90|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Bad title
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badtitle</title></template>
+<template lineStart="1"><title>int:ab570b90</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badtitletext&amp;action=edit badtitletext]&lt;br&gt;
-[[MediaWiki_talk:Badtitletext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:73766845&amp;action=edit e9ac7510]&lt;br&gt;
+[[MediaWiki_talk:73766845|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The requested page title was invalid, empty, or
 an incorrectly linked inter-language or inter-wiki title.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badtitletext</title></template>
+<template lineStart="1"><title>int:73766845</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blanknamespace&amp;action=edit blanknamespace]&lt;br&gt;
-[[MediaWiki_talk:Blanknamespace|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ef0a17b1&amp;action=edit ec00742f]&lt;br&gt;
+[[MediaWiki_talk:ef0a17b1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (Main)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blanknamespace</title></template>
+<template lineStart="1"><title>int:ef0a17b1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockedtext&amp;action=edit blockedtext]&lt;br&gt;
-[[MediaWiki_talk:Blockedtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2fe89b37&amp;action=edit 0756a2f3]&lt;br&gt;
+[[MediaWiki_talk:2fe89b37|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your user name or IP address has been blocked by $1.
 The reason given is this:&amp;lt;br /&amp;gt;&amp;#39;&amp;#39;$2&amp;#39;&amp;#39;&amp;lt;p&amp;gt;You may contact $1 or one of the other
@@ -608,39 +608,39 @@ Note that you may not use the &amp;quot;email this user&amp;quot; feature unless
 Your IP address is $3. Please include this address in any queries you make.
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockedtext</title></template>
+<template lineStart="1"><title>int:2fe89b37</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockedtitle&amp;action=edit blockedtitle]&lt;br&gt;
-[[MediaWiki_talk:Blockedtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4153985a&amp;action=edit ee09eebe]&lt;br&gt;
+[[MediaWiki_talk:4153985a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 User is blocked
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockedtitle</title></template>
+<template lineStart="1"><title>int:4153985a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockip&amp;action=edit blockip]&lt;br&gt;
-[[MediaWiki_talk:Blockip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f8225753&amp;action=edit 387c304e]&lt;br&gt;
+[[MediaWiki_talk:f8225753|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Block user
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockip</title></template>
+<template lineStart="1"><title>int:f8225753</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockipsuccesssub&amp;action=edit blockipsuccesssub]&lt;br&gt;
-[[MediaWiki_talk:Blockipsuccesssub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:178b4021&amp;action=edit d19404ef]&lt;br&gt;
+[[MediaWiki_talk:178b4021|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Block succeeded
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockipsuccesssub</title></template>
+<template lineStart="1"><title>int:178b4021</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockipsuccesstext&amp;action=edit blockipsuccesstext]&lt;br&gt;
-[[MediaWiki_talk:Blockipsuccesstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c9aa5295&amp;action=edit 8c464806]&lt;br&gt;
+[[MediaWiki_talk:c9aa5295|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;quot;$1&amp;quot; has been blocked.
 &amp;lt;br /&amp;gt;See &amp;#91;&amp;#91;Special:Ipblocklist&amp;#124;IP block list]] to review blocks.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockipsuccesstext</title></template>
+<template lineStart="1"><title>int:c9aa5295</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockiptext&amp;action=edit blockiptext]&lt;br&gt;
-[[MediaWiki_talk:Blockiptext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d79d9fe6&amp;action=edit ec372bf2]&lt;br&gt;
+[[MediaWiki_talk:d79d9fe6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Use the form below to block write access
 from a specific IP address or username.
@@ -649,261 +649,261 @@ accordance with &amp;#91;&amp;#91;Wiktionary:Policy&amp;#124;policy]].
 Fill in a specific reason below (for example, citing particular
 pages that were vandalized).
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockiptext</title></template>
+<template lineStart="1"><title>int:d79d9fe6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklink&amp;action=edit blocklink]&lt;br&gt;
-[[MediaWiki_talk:Blocklink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9a96cfdc&amp;action=edit 1c6c7aa2]&lt;br&gt;
+[[MediaWiki_talk:9a96cfdc|Talk]]
 &lt;/td&gt;&lt;td&gt;
 block
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklink</title></template>
+<template lineStart="1"><title>int:9a96cfdc</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklistline&amp;action=edit blocklistline]&lt;br&gt;
-[[MediaWiki_talk:Blocklistline|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b81f5cad&amp;action=edit b821b758]&lt;br&gt;
+[[MediaWiki_talk:b81f5cad|Talk]]
 &lt;/td&gt;&lt;td&gt;
 $1, $2 blocked $3 (expires $4)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklistline</title></template>
+<template lineStart="1"><title>int:b81f5cad</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogentry&amp;action=edit blocklogentry]&lt;br&gt;
-[[MediaWiki_talk:Blocklogentry|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0871a19a&amp;action=edit 9be87d66]&lt;br&gt;
+[[MediaWiki_talk:0871a19a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 blocked &amp;quot;$1&amp;quot; with an expiry time of $2
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklogentry</title></template>
+<template lineStart="1"><title>int:0871a19a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogpage&amp;action=edit blocklogpage]&lt;br&gt;
-[[MediaWiki_talk:Blocklogpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:31534d45&amp;action=edit 4bcce96c]&lt;br&gt;
+[[MediaWiki_talk:31534d45|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Block_log
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklogpage</title></template>
+<template lineStart="1"><title>int:31534d45</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogtext&amp;action=edit blocklogtext]&lt;br&gt;
-[[MediaWiki_talk:Blocklogtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f4872c71&amp;action=edit b9902a3c]&lt;br&gt;
+[[MediaWiki_talk:f4872c71|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This is a log of user blocking and unblocking actions. Automatically 
 blocked IP addresses are not be listed. See the &amp;#91;&amp;#91;Special:Ipblocklist&amp;#124;IP block list]] for
 the list of currently operational bans and blocks.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklogtext</title></template>
+<template lineStart="1"><title>int:f4872c71</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bold_sample&amp;action=edit bold_sample]&lt;br&gt;
-[[MediaWiki_talk:Bold_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d8ae34f5&amp;action=edit e9a0daa2]&lt;br&gt;
+[[MediaWiki_talk:d8ae34f5|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Bold text
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bold_sample</title></template>
+<template lineStart="1"><title>int:d8ae34f5</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bold_tip&amp;action=edit bold_tip]&lt;br&gt;
-[[MediaWiki_talk:Bold_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:58086558&amp;action=edit 02320399]&lt;br&gt;
+[[MediaWiki_talk:58086558|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Bold text
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bold_tip</title></template>
+<template lineStart="1"><title>int:58086558</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Booksources&amp;action=edit booksources]&lt;br&gt;
-[[MediaWiki_talk:Booksources|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1d546a7c&amp;action=edit 9bd576b3]&lt;br&gt;
+[[MediaWiki_talk:1d546a7c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Book sources
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Booksources</title></template>
+<template lineStart="1"><title>int:1d546a7c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Booksourcetext&amp;action=edit booksourcetext]&lt;br&gt;
-[[MediaWiki_talk:Booksourcetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:809e6557&amp;action=edit 72f7a5ba]&lt;br&gt;
+[[MediaWiki_talk:809e6557|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Below is a list of links to other sites that
 sell new and used books, and may also have further information
 about books you are looking for.Wiktionary is not affiliated with any of these businesses, and
 this list should not be construed as an endorsement.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Booksourcetext</title></template>
+<template lineStart="1"><title>int:809e6557</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Brokenredirects&amp;action=edit brokenredirects]&lt;br&gt;
-[[MediaWiki_talk:Brokenredirects|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:40925079&amp;action=edit fe673f57]&lt;br&gt;
+[[MediaWiki_talk:40925079|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Broken Redirects
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Brokenredirects</title></template>
+<template lineStart="1"><title>int:40925079</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Brokenredirectstext&amp;action=edit brokenredirectstext]&lt;br&gt;
-[[MediaWiki_talk:Brokenredirectstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3953d564&amp;action=edit 283e89cc]&lt;br&gt;
+[[MediaWiki_talk:3953d564|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The following redirects link to a non-existing pages.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Brokenredirectstext</title></template>
+<template lineStart="1"><title>int:3953d564</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bugreports&amp;action=edit bugreports]&lt;br&gt;
-[[MediaWiki_talk:Bugreports|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f12ee4ee&amp;action=edit 741bd9a7]&lt;br&gt;
+[[MediaWiki_talk:f12ee4ee|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Bug reports
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bugreports</title></template>
+<template lineStart="1"><title>int:f12ee4ee</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bugreportspage&amp;action=edit bugreportspage]&lt;br&gt;
-[[MediaWiki_talk:Bugreportspage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1e9054cf&amp;action=edit 7cc56699]&lt;br&gt;
+[[MediaWiki_talk:1e9054cf|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary:Bug_reports
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bugreportspage</title></template>
+<template lineStart="1"><title>int:1e9054cf</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucratlog&amp;action=edit bureaucratlog]&lt;br&gt;
-[[MediaWiki_talk:Bureaucratlog|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cfea7660&amp;action=edit eaac0dcf]&lt;br&gt;
+[[MediaWiki_talk:cfea7660|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Bureaucrat_log
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bureaucratlog</title></template>
+<template lineStart="1"><title>int:cfea7660</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucratlogentry&amp;action=edit bureaucratlogentry]&lt;br&gt;
-[[MediaWiki_talk:Bureaucratlogentry|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:04cf1ba3&amp;action=edit cc1544ab]&lt;br&gt;
+[[MediaWiki_talk:04cf1ba3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Rights for user &amp;quot;$1&amp;quot; set &amp;quot;$2&amp;quot;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bureaucratlogentry</title></template>
+<template lineStart="1"><title>int:04cf1ba3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucrattext&amp;action=edit bureaucrattext]&lt;br&gt;
-[[MediaWiki_talk:Bureaucrattext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a0750047&amp;action=edit 5eb1e911]&lt;br&gt;
+[[MediaWiki_talk:a0750047|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The action you have requested can only be
 performed by sysops with  &amp;quot;bureaucrat&amp;quot; status.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bureaucrattext</title></template>
+<template lineStart="1"><title>int:a0750047</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucrattitle&amp;action=edit bureaucrattitle]&lt;br&gt;
-[[MediaWiki_talk:Bureaucrattitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4837977b&amp;action=edit f523b504]&lt;br&gt;
+[[MediaWiki_talk:4837977b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Bureaucrat access required
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bureaucrattitle</title></template>
+<template lineStart="1"><title>int:4837977b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bydate&amp;action=edit bydate]&lt;br&gt;
-[[MediaWiki_talk:Bydate|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:590988e2&amp;action=edit f06de085]&lt;br&gt;
+[[MediaWiki_talk:590988e2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 by date
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bydate</title></template>
+<template lineStart="1"><title>int:590988e2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Byname&amp;action=edit byname]&lt;br&gt;
-[[MediaWiki_talk:Byname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c08c3f0d&amp;action=edit e51a8413]&lt;br&gt;
+[[MediaWiki_talk:c08c3f0d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 by name
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Byname</title></template>
+<template lineStart="1"><title>int:c08c3f0d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bysize&amp;action=edit bysize]&lt;br&gt;
-[[MediaWiki_talk:Bysize|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ede279e9&amp;action=edit 43ba766a]&lt;br&gt;
+[[MediaWiki_talk:ede279e9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 by size
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bysize</title></template>
+<template lineStart="1"><title>int:ede279e9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cachederror&amp;action=edit cachederror]&lt;br&gt;
-[[MediaWiki_talk:Cachederror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e1ad9b35&amp;action=edit 075fc8df]&lt;br&gt;
+[[MediaWiki_talk:e1ad9b35|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The following is a cached copy of the requested page, and may not be up to date.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Cachederror</title></template>
+<template lineStart="1"><title>int:e1ad9b35</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cancel&amp;action=edit cancel]&lt;br&gt;
-[[MediaWiki_talk:Cancel|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:77dfd213&amp;action=edit 4fd0653c]&lt;br&gt;
+[[MediaWiki_talk:77dfd213|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Cancel
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Cancel</title></template>
+<template lineStart="1"><title>int:77dfd213</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cannotdelete&amp;action=edit cannotdelete]&lt;br&gt;
-[[MediaWiki_talk:Cannotdelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:03442eec&amp;action=edit ee57c22e]&lt;br&gt;
+[[MediaWiki_talk:03442eec|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Could not delete the page or image specified. (It may have already been deleted by someone else.)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Cannotdelete</title></template>
+<template lineStart="1"><title>int:03442eec</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cantrollback&amp;action=edit cantrollback]&lt;br&gt;
-[[MediaWiki_talk:Cantrollback|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:27b55ed3&amp;action=edit 4b739ac2]&lt;br&gt;
+[[MediaWiki_talk:27b55ed3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Cannot revert edit; last contributor is only author of this page.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Cantrollback</title></template>
+<template lineStart="1"><title>int:27b55ed3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Categories&amp;action=edit categories]&lt;br&gt;
-[[MediaWiki_talk:Categories|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6ccb6007&amp;action=edit 50b9e781]&lt;br&gt;
+[[MediaWiki_talk:6ccb6007|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Categories
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Categories</title></template>
+<template lineStart="1"><title>int:6ccb6007</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Category&amp;action=edit category]&lt;br&gt;
-[[MediaWiki_talk:Category|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a3c686e7&amp;action=edit 5ccbf9c9]&lt;br&gt;
+[[MediaWiki_talk:a3c686e7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 category
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Category</title></template>
+<template lineStart="1"><title>int:a3c686e7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Category_header&amp;action=edit category_header]&lt;br&gt;
-[[MediaWiki_talk:Category_header|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f2ff5f46&amp;action=edit 7245f61e]&lt;br&gt;
+[[MediaWiki_talk:f2ff5f46|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Articles in category &amp;quot;$1&amp;quot;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Category_header</title></template>
+<template lineStart="1"><title>int:f2ff5f46</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Changepassword&amp;action=edit changepassword]&lt;br&gt;
-[[MediaWiki_talk:Changepassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cc60b2e2&amp;action=edit 3dfd4581]&lt;br&gt;
+[[MediaWiki_talk:cc60b2e2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Change password
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Changepassword</title></template>
+<template lineStart="1"><title>int:cc60b2e2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Changes&amp;action=edit changes]&lt;br&gt;
-[[MediaWiki_talk:Changes|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8aa57de6&amp;action=edit 49a04ba4]&lt;br&gt;
+[[MediaWiki_talk:8aa57de6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 changes
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Changes</title></template>
+<template lineStart="1"><title>int:8aa57de6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Columns&amp;action=edit columns]&lt;br&gt;
-[[MediaWiki_talk:Columns|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cf723c59&amp;action=edit 4f1b1dbe]&lt;br&gt;
+[[MediaWiki_talk:cf723c59|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Columns
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Columns</title></template>
+<template lineStart="1"><title>int:cf723c59</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Commentedit&amp;action=edit commentedit]&lt;br&gt;
-[[MediaWiki_talk:Commentedit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a4f8ff8&amp;action=edit 99be507a]&lt;br&gt;
+[[MediaWiki_talk:2a4f8ff8|Talk]]
 &lt;/td&gt;&lt;td&gt;
  (comment)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Commentedit</title></template>
+<template lineStart="1"><title>int:2a4f8ff8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Compareselectedversions&amp;action=edit compareselectedversions]&lt;br&gt;
-[[MediaWiki_talk:Compareselectedversions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9833df65&amp;action=edit 978cce5f]&lt;br&gt;
+[[MediaWiki_talk:9833df65|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Compare selected versions
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Compareselectedversions</title></template>
+<template lineStart="1"><title>int:9833df65</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirm&amp;action=edit confirm]&lt;br&gt;
-[[MediaWiki_talk:Confirm|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:04a21221&amp;action=edit d0c4047c]&lt;br&gt;
+[[MediaWiki_talk:04a21221|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Confirm
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirm</title></template>
+<template lineStart="1"><title>int:04a21221</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmcheck&amp;action=edit confirmcheck]&lt;br&gt;
-[[MediaWiki_talk:Confirmcheck|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b8e469fe&amp;action=edit bb4bf8de]&lt;br&gt;
+[[MediaWiki_talk:b8e469fe|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Yes, I really want to delete this.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmcheck</title></template>
+<template lineStart="1"><title>int:b8e469fe</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmdelete&amp;action=edit confirmdelete]&lt;br&gt;
-[[MediaWiki_talk:Confirmdelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7773ad82&amp;action=edit 16805d57]&lt;br&gt;
+[[MediaWiki_talk:7773ad82|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Confirm delete
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmdelete</title></template>
+<template lineStart="1"><title>int:7773ad82</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmdeletetext&amp;action=edit confirmdeletetext]&lt;br&gt;
-[[MediaWiki_talk:Confirmdeletetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:87358bf0&amp;action=edit 872e01c0]&lt;br&gt;
+[[MediaWiki_talk:87358bf0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You are about to permanently delete a page
 or image along with all of its history from the database.
@@ -911,94 +911,94 @@ Please confirm that you intend to do this, that you understand the
 consequences, and that you are doing this in accordance with
 &amp;#91;&amp;#91;Wiktionary:Policy]].
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmdeletetext</title></template>
+<template lineStart="1"><title>int:87358bf0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmprotect&amp;action=edit confirmprotect]&lt;br&gt;
-[[MediaWiki_talk:Confirmprotect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b46f1463&amp;action=edit 96a48c11]&lt;br&gt;
+[[MediaWiki_talk:b46f1463|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Confirm protection
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmprotect</title></template>
+<template lineStart="1"><title>int:b46f1463</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmprotecttext&amp;action=edit confirmprotecttext]&lt;br&gt;
-[[MediaWiki_talk:Confirmprotecttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e382b883&amp;action=edit e76ab37d]&lt;br&gt;
+[[MediaWiki_talk:e382b883|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Do you really want to protect this page?
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmprotecttext</title></template>
+<template lineStart="1"><title>int:e382b883</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmunprotect&amp;action=edit confirmunprotect]&lt;br&gt;
-[[MediaWiki_talk:Confirmunprotect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:33be1711&amp;action=edit 306661e6]&lt;br&gt;
+[[MediaWiki_talk:33be1711|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Confirm unprotection
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmunprotect</title></template>
+<template lineStart="1"><title>int:33be1711</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmunprotecttext&amp;action=edit confirmunprotecttext]&lt;br&gt;
-[[MediaWiki_talk:Confirmunprotecttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2d82e05f&amp;action=edit 4df1abe3]&lt;br&gt;
+[[MediaWiki_talk:2d82e05f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Do you really want to unprotect this page?
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmunprotecttext</title></template>
+<template lineStart="1"><title>int:2d82e05f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contextchars&amp;action=edit contextchars]&lt;br&gt;
-[[MediaWiki_talk:Contextchars|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7f051e88&amp;action=edit 0858695c]&lt;br&gt;
+[[MediaWiki_talk:7f051e88|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Characters of context per line
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Contextchars</title></template>
+<template lineStart="1"><title>int:7f051e88</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contextlines&amp;action=edit contextlines]&lt;br&gt;
-[[MediaWiki_talk:Contextlines|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7127b581&amp;action=edit e9d81e50]&lt;br&gt;
+[[MediaWiki_talk:7127b581|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Lines to show per hit
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Contextlines</title></template>
+<template lineStart="1"><title>int:7127b581</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contribslink&amp;action=edit contribslink]&lt;br&gt;
-[[MediaWiki_talk:Contribslink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9850ceab&amp;action=edit df5b918c]&lt;br&gt;
+[[MediaWiki_talk:9850ceab|Talk]]
 &lt;/td&gt;&lt;td&gt;
 contribs
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Contribslink</title></template>
+<template lineStart="1"><title>int:9850ceab</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contribsub&amp;action=edit contribsub]&lt;br&gt;
-[[MediaWiki_talk:Contribsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b688a4d7&amp;action=edit ab48ec14]&lt;br&gt;
+[[MediaWiki_talk:b688a4d7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 For $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Contribsub</title></template>
+<template lineStart="1"><title>int:b688a4d7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contributions&amp;action=edit contributions]&lt;br&gt;
-[[MediaWiki_talk:Contributions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:aa11023f&amp;action=edit 9d5b6e5e]&lt;br&gt;
+[[MediaWiki_talk:aa11023f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 User contributions
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Contributions</title></template>
+<template lineStart="1"><title>int:aa11023f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyright&amp;action=edit copyright]&lt;br&gt;
-[[MediaWiki_talk:Copyright|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a420abf6&amp;action=edit 521307dd]&lt;br&gt;
+[[MediaWiki_talk:a420abf6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Content is available under $1.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Copyright</title></template>
+<template lineStart="1"><title>int:a420abf6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightpage&amp;action=edit copyrightpage]&lt;br&gt;
-[[MediaWiki_talk:Copyrightpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fc8c1b42&amp;action=edit 5327fdcf]&lt;br&gt;
+[[MediaWiki_talk:fc8c1b42|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary:Copyrights
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Copyrightpage</title></template>
+<template lineStart="1"><title>int:fc8c1b42</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightpagename&amp;action=edit copyrightpagename]&lt;br&gt;
-[[MediaWiki_talk:Copyrightpagename|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:52a98e51&amp;action=edit f6652583]&lt;br&gt;
+[[MediaWiki_talk:52a98e51|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary copyright
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Copyrightpagename</title></template>
+<template lineStart="1"><title>int:52a98e51</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightwarning&amp;action=edit copyrightwarning]&lt;br&gt;
-[[MediaWiki_talk:Copyrightwarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:25a1afd7&amp;action=edit 731cc8a6]&lt;br&gt;
+[[MediaWiki_talk:25a1afd7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Please note that all contributions to Wiktionary are
 considered to be released under the GNU Free Documentation License
@@ -1009,66 +1009,66 @@ You are also promising us that you wrote this yourself, or copied it from a
 public domain or similar free resource.
 &amp;lt;strong&amp;gt;DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!&amp;lt;/strong&amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Copyrightwarning</title></template>
+<template lineStart="1"><title>int:25a1afd7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Couldntremove&amp;action=edit couldntremove]&lt;br&gt;
-[[MediaWiki_talk:Couldntremove|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:465ca4b8&amp;action=edit e04b3a96]&lt;br&gt;
+[[MediaWiki_talk:465ca4b8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Couldn&amp;#39;t remove item &amp;#39;$1&amp;#39;...
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Couldntremove</title></template>
+<template lineStart="1"><title>int:465ca4b8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Createaccount&amp;action=edit createaccount]&lt;br&gt;
-[[MediaWiki_talk:Createaccount|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3724dfa6&amp;action=edit 19fd5658]&lt;br&gt;
+[[MediaWiki_talk:3724dfa6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Create new account
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Createaccount</title></template>
+<template lineStart="1"><title>int:3724dfa6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Createaccountmail&amp;action=edit createaccountmail]&lt;br&gt;
-[[MediaWiki_talk:Createaccountmail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a4a1f0cb&amp;action=edit b10d6306]&lt;br&gt;
+[[MediaWiki_talk:a4a1f0cb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 by email
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Createaccountmail</title></template>
+<template lineStart="1"><title>int:a4a1f0cb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cur&amp;action=edit cur]&lt;br&gt;
-[[MediaWiki_talk:Cur|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:07f81f3c&amp;action=edit dce81611]&lt;br&gt;
+[[MediaWiki_talk:07f81f3c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 cur
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Cur</title></template>
+<template lineStart="1"><title>int:07f81f3c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Currentevents&amp;action=edit currentevents]&lt;br&gt;
-[[MediaWiki_talk:Currentevents|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:42b921f8&amp;action=edit 81c8f458]&lt;br&gt;
+[[MediaWiki_talk:42b921f8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Current events
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Currentevents</title></template>
+<template lineStart="1"><title>int:42b921f8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Currentrev&amp;action=edit currentrev]&lt;br&gt;
-[[MediaWiki_talk:Currentrev|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:78892831&amp;action=edit 23418566]&lt;br&gt;
+[[MediaWiki_talk:78892831|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Current revision
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Currentrev</title></template>
+<template lineStart="1"><title>int:78892831</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Databaseerror&amp;action=edit databaseerror]&lt;br&gt;
-[[MediaWiki_talk:Databaseerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e4838ed0&amp;action=edit 66409316]&lt;br&gt;
+[[MediaWiki_talk:e4838ed0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Database error
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Databaseerror</title></template>
+<template lineStart="1"><title>int:e4838ed0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dateformat&amp;action=edit dateformat]&lt;br&gt;
-[[MediaWiki_talk:Dateformat|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:507be676&amp;action=edit 3b538bdf]&lt;br&gt;
+[[MediaWiki_talk:507be676|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Date format
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Dateformat</title></template>
+<template lineStart="1"><title>int:507be676</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dberrortext&amp;action=edit dberrortext]&lt;br&gt;
-[[MediaWiki_talk:Dberrortext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0bfa85bb&amp;action=edit 34c01d3c]&lt;br&gt;
+[[MediaWiki_talk:0bfa85bb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 A database query syntax error has occurred.
 This could be because of an illegal search query (see $5),
@@ -1078,10 +1078,10 @@ The last attempted database query was:
 from within function &amp;quot;&amp;lt;tt&amp;gt;$2&amp;lt;/tt&amp;gt;&amp;quot;.
 MySQL returned error &amp;quot;&amp;lt;tt&amp;gt;$3: $4&amp;lt;/tt&amp;gt;&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Dberrortext</title></template>
+<template lineStart="1"><title>int:0bfa85bb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dberrortextcl&amp;action=edit dberrortextcl]&lt;br&gt;
-[[MediaWiki_talk:Dberrortextcl|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:39d82941&amp;action=edit f6e1bcbd]&lt;br&gt;
+[[MediaWiki_talk:39d82941|Talk]]
 &lt;/td&gt;&lt;td&gt;
 A database query syntax error has occurred.
 The last attempted database query was:
@@ -1090,109 +1090,109 @@ from within function &amp;quot;$2&amp;quot;.
 MySQL returned error &amp;quot;$3: $4&amp;quot;.
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Dberrortextcl</title></template>
+<template lineStart="1"><title>int:39d82941</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deadendpages&amp;action=edit deadendpages]&lt;br&gt;
-[[MediaWiki_talk:Deadendpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ae14da43&amp;action=edit d4234aad]&lt;br&gt;
+[[MediaWiki_talk:ae14da43|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Dead-end pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deadendpages</title></template>
+<template lineStart="1"><title>int:ae14da43</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Debug&amp;action=edit debug]&lt;br&gt;
-[[MediaWiki_talk:Debug|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bd604d99&amp;action=edit 32faaeca]&lt;br&gt;
+[[MediaWiki_talk:bd604d99|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Debug
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Debug</title></template>
+<template lineStart="1"><title>int:bd604d99</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Defaultns&amp;action=edit defaultns]&lt;br&gt;
-[[MediaWiki_talk:Defaultns|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6f349a89&amp;action=edit f674a4a1]&lt;br&gt;
+[[MediaWiki_talk:6f349a89|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Search in these namespaces by default:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Defaultns</title></template>
+<template lineStart="1"><title>int:6f349a89</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Defemailsubject&amp;action=edit defemailsubject]&lt;br&gt;
-[[MediaWiki_talk:Defemailsubject|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:801b725b&amp;action=edit 93c2c32b]&lt;br&gt;
+[[MediaWiki_talk:801b725b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary e-mail
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Defemailsubject</title></template>
+<template lineStart="1"><title>int:801b725b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Delete&amp;action=edit delete]&lt;br&gt;
-[[MediaWiki_talk:Delete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f6fdbe48&amp;action=edit 9485989f]&lt;br&gt;
+[[MediaWiki_talk:f6fdbe48|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Delete
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Delete</title></template>
+<template lineStart="1"><title>int:f6fdbe48</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletecomment&amp;action=edit deletecomment]&lt;br&gt;
-[[MediaWiki_talk:Deletecomment|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:728e102f&amp;action=edit 070ad01c]&lt;br&gt;
+[[MediaWiki_talk:728e102f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Reason for deletion
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletecomment</title></template>
+<template lineStart="1"><title>int:728e102f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletedarticle&amp;action=edit deletedarticle]&lt;br&gt;
-[[MediaWiki_talk:Deletedarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:784f094b&amp;action=edit abb03e0b]&lt;br&gt;
+[[MediaWiki_talk:784f094b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 deleted &amp;quot;$1&amp;quot;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletedarticle</title></template>
+<template lineStart="1"><title>int:784f094b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletedtext&amp;action=edit deletedtext]&lt;br&gt;
-[[MediaWiki_talk:Deletedtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b40dc398&amp;action=edit 81545b85]&lt;br&gt;
+[[MediaWiki_talk:b40dc398|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;quot;$1&amp;quot; has been deleted.
 See $2 for a record of recent deletions.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletedtext</title></template>
+<template lineStart="1"><title>int:b40dc398</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deleteimg&amp;action=edit deleteimg]&lt;br&gt;
-[[MediaWiki_talk:Deleteimg|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:64a8bf46&amp;action=edit 6f4d03ee]&lt;br&gt;
+[[MediaWiki_talk:64a8bf46|Talk]]
 &lt;/td&gt;&lt;td&gt;
 del
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deleteimg</title></template>
+<template lineStart="1"><title>int:64a8bf46</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletepage&amp;action=edit deletepage]&lt;br&gt;
-[[MediaWiki_talk:Deletepage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3316ac85&amp;action=edit c423c282]&lt;br&gt;
+[[MediaWiki_talk:3316ac85|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Delete page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletepage</title></template>
+<template lineStart="1"><title>int:3316ac85</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletesub&amp;action=edit deletesub]&lt;br&gt;
-[[MediaWiki_talk:Deletesub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a2496a13&amp;action=edit a3173eab]&lt;br&gt;
+[[MediaWiki_talk:a2496a13|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (Deleting &amp;quot;$1&amp;quot;)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletesub</title></template>
+<template lineStart="1"><title>int:a2496a13</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletethispage&amp;action=edit deletethispage]&lt;br&gt;
-[[MediaWiki_talk:Deletethispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9d817726&amp;action=edit b93901eb]&lt;br&gt;
+[[MediaWiki_talk:9d817726|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Delete this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletethispage</title></template>
+<template lineStart="1"><title>int:9d817726</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletionlog&amp;action=edit deletionlog]&lt;br&gt;
-[[MediaWiki_talk:Deletionlog|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:49653e1b&amp;action=edit 58f0b919]&lt;br&gt;
+[[MediaWiki_talk:49653e1b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 deletion log
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletionlog</title></template>
+<template lineStart="1"><title>int:49653e1b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dellogpage&amp;action=edit dellogpage]&lt;br&gt;
-[[MediaWiki_talk:Dellogpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d73442e4&amp;action=edit c5ee36a7]&lt;br&gt;
+[[MediaWiki_talk:d73442e4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Deletion_log
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Dellogpage</title></template>
+<template lineStart="1"><title>int:d73442e4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dellogpagetext&amp;action=edit dellogpagetext]&lt;br&gt;
-[[MediaWiki_talk:Dellogpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2349bb58&amp;action=edit 6526e633]&lt;br&gt;
+[[MediaWiki_talk:2349bb58|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Below is a list of the most recent deletions.
 All times shown are server time (UTC).
@@ -1200,185 +1200,185 @@ All times shown are server time (UTC).
 &amp;lt;/ul&amp;gt;
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Dellogpagetext</title></template>
+<template lineStart="1"><title>int:2349bb58</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developerspheading&amp;action=edit developerspheading]&lt;br&gt;
-[[MediaWiki_talk:Developerspheading|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:381bedfc&amp;action=edit 015693e1]&lt;br&gt;
+[[MediaWiki_talk:381bedfc|Talk]]
 &lt;/td&gt;&lt;td&gt;
 For developer use only
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Developerspheading</title></template>
+<template lineStart="1"><title>int:381bedfc</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developertext&amp;action=edit developertext]&lt;br&gt;
-[[MediaWiki_talk:Developertext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:52713d3d&amp;action=edit 9c6f4cd5]&lt;br&gt;
+[[MediaWiki_talk:52713d3d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The action you have requested can only be
 performed by users with &amp;quot;developer&amp;quot; status.
 See $1.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Developertext</title></template>
+<template lineStart="1"><title>int:52713d3d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developertitle&amp;action=edit developertitle]&lt;br&gt;
-[[MediaWiki_talk:Developertitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6cca6111&amp;action=edit 59afe6b0]&lt;br&gt;
+[[MediaWiki_talk:6cca6111|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Developer access required
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Developertitle</title></template>
+<template lineStart="1"><title>int:6cca6111</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Diff&amp;action=edit diff]&lt;br&gt;
-[[MediaWiki_talk:Diff|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d23a1c9f&amp;action=edit 75a0ee1b]&lt;br&gt;
+[[MediaWiki_talk:d23a1c9f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 diff
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Diff</title></template>
+<template lineStart="1"><title>int:d23a1c9f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Difference&amp;action=edit difference]&lt;br&gt;
-[[MediaWiki_talk:Difference|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b16f1f66&amp;action=edit 48d53c6e]&lt;br&gt;
+[[MediaWiki_talk:b16f1f66|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (Difference between revisions)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Difference</title></template>
+<template lineStart="1"><title>int:b16f1f66</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimerpage&amp;action=edit disclaimerpage]&lt;br&gt;
-[[MediaWiki_talk:Disclaimerpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3c1c1596&amp;action=edit 657b3530]&lt;br&gt;
+[[MediaWiki_talk:3c1c1596|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary:General_disclaimer
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disclaimerpage</title></template>
+<template lineStart="1"><title>int:3c1c1596</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimers&amp;action=edit disclaimers]&lt;br&gt;
-[[MediaWiki_talk:Disclaimers|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2cbbc29e&amp;action=edit 774706d2]&lt;br&gt;
+[[MediaWiki_talk:2cbbc29e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Disclaimers
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disclaimers</title></template>
+<template lineStart="1"><title>int:2cbbc29e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Doubleredirects&amp;action=edit doubleredirects]&lt;br&gt;
-[[MediaWiki_talk:Doubleredirects|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ac57c500&amp;action=edit c06b805b]&lt;br&gt;
+[[MediaWiki_talk:ac57c500|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Double Redirects
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Doubleredirects</title></template>
+<template lineStart="1"><title>int:ac57c500</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Doubleredirectstext&amp;action=edit doubleredirectstext]&lt;br&gt;
-[[MediaWiki_talk:Doubleredirectstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ba6ba737&amp;action=edit 49eadc1d]&lt;br&gt;
+[[MediaWiki_talk:ba6ba737|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;b&amp;gt;Attention:&amp;lt;/b&amp;gt; This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.&amp;lt;br /&amp;gt;
 Each row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the &amp;quot;real&amp;quot; target page, which the first redirect should point to.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Doubleredirectstext</title></template>
+<template lineStart="1"><title>int:ba6ba737</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edit&amp;action=edit edit]&lt;br&gt;
-[[MediaWiki_talk:Edit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5301648d&amp;action=edit 9ead47a8]&lt;br&gt;
+[[MediaWiki_talk:5301648d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Edit
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Edit</title></template>
+<template lineStart="1"><title>int:5301648d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editcomment&amp;action=edit editcomment]&lt;br&gt;
-[[MediaWiki_talk:Editcomment|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:299ca80d&amp;action=edit 74940f72]&lt;br&gt;
+[[MediaWiki_talk:299ca80d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The edit comment was: &amp;quot;&amp;lt;i&amp;gt;$1&amp;lt;/i&amp;gt;&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editcomment</title></template>
+<template lineStart="1"><title>int:299ca80d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editconflict&amp;action=edit editconflict]&lt;br&gt;
-[[MediaWiki_talk:Editconflict|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1af657fb&amp;action=edit 3b56e95b]&lt;br&gt;
+[[MediaWiki_talk:1af657fb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Edit conflict: $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editconflict</title></template>
+<template lineStart="1"><title>int:1af657fb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editcurrent&amp;action=edit editcurrent]&lt;br&gt;
-[[MediaWiki_talk:Editcurrent|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8b46c7e0&amp;action=edit 10d395b9]&lt;br&gt;
+[[MediaWiki_talk:8b46c7e0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Edit the current version of this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editcurrent</title></template>
+<template lineStart="1"><title>int:8b46c7e0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edithelp&amp;action=edit edithelp]&lt;br&gt;
-[[MediaWiki_talk:Edithelp|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:47f4389a&amp;action=edit a1524e37]&lt;br&gt;
+[[MediaWiki_talk:47f4389a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Editing help
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Edithelp</title></template>
+<template lineStart="1"><title>int:47f4389a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edithelppage&amp;action=edit edithelppage]&lt;br&gt;
-[[MediaWiki_talk:Edithelppage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:56815513&amp;action=edit 7072deb5]&lt;br&gt;
+[[MediaWiki_talk:56815513|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Help:Editing
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Edithelppage</title></template>
+<template lineStart="1"><title>int:56815513</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editing&amp;action=edit editing]&lt;br&gt;
-[[MediaWiki_talk:Editing|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3b9ba1a2&amp;action=edit f34946be]&lt;br&gt;
+[[MediaWiki_talk:3b9ba1a2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Editing $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editing</title></template>
+<template lineStart="1"><title>int:3b9ba1a2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editingold&amp;action=edit editingold]&lt;br&gt;
-[[MediaWiki_talk:Editingold|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5e6bd9f3&amp;action=edit bd55ff2e]&lt;br&gt;
+[[MediaWiki_talk:5e6bd9f3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;strong&amp;gt;WARNING: You are editing an out-of-date
 revision of this page.
 If you save it, any changes made since this revision will be lost.&amp;lt;/strong&amp;gt;
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editingold</title></template>
+<template lineStart="1"><title>int:5e6bd9f3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editsection&amp;action=edit editsection]&lt;br&gt;
-[[MediaWiki_talk:Editsection|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:51905619&amp;action=edit 965b4116]&lt;br&gt;
+[[MediaWiki_talk:51905619|Talk]]
 &lt;/td&gt;&lt;td&gt;
 edit
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editsection</title></template>
+<template lineStart="1"><title>int:51905619</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editthispage&amp;action=edit editthispage]&lt;br&gt;
-[[MediaWiki_talk:Editthispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2138f524&amp;action=edit 8bc15909]&lt;br&gt;
+[[MediaWiki_talk:2138f524|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Edit this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editthispage</title></template>
+<template lineStart="1"><title>int:2138f524</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailflag&amp;action=edit emailflag]&lt;br&gt;
-[[MediaWiki_talk:Emailflag|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:96c0b2c5&amp;action=edit 4a27c333]&lt;br&gt;
+[[MediaWiki_talk:96c0b2c5|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Disable e-mail from other users
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailflag</title></template>
+<template lineStart="1"><title>int:96c0b2c5</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailforlost&amp;action=edit emailforlost]&lt;br&gt;
-[[MediaWiki_talk:Emailforlost|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8a275a27&amp;action=edit e4573eb4]&lt;br&gt;
+[[MediaWiki_talk:8a275a27|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Fields marked with a star (*) are optional.  Storing an email address enables people to contact you through the website without you having to reveal your 
 email address to them, and it can be used to send you a new password if you forget it.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Your real name, if you choose to provide it, will be used for giving you attribution for your work.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailforlost</title></template>
+<template lineStart="1"><title>int:8a275a27</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailfrom&amp;action=edit emailfrom]&lt;br&gt;
-[[MediaWiki_talk:Emailfrom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:34a573ac&amp;action=edit b29c18eb]&lt;br&gt;
+[[MediaWiki_talk:34a573ac|Talk]]
 &lt;/td&gt;&lt;td&gt;
 From
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailfrom</title></template>
+<template lineStart="1"><title>int:34a573ac</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailmessage&amp;action=edit emailmessage]&lt;br&gt;
-[[MediaWiki_talk:Emailmessage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1653aeb3&amp;action=edit 8d8c0edf]&lt;br&gt;
+[[MediaWiki_talk:1653aeb3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Message
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailmessage</title></template>
+<template lineStart="1"><title>int:1653aeb3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailuser&amp;action=edit emailuser]&lt;br&gt;
-[[MediaWiki_talk:Emailuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ac5cfb8e&amp;action=edit a9b033ab]&lt;br&gt;
+[[MediaWiki_talk:ac5cfb8e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 E-mail user
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailuser</title></template>
+<template lineStart="1"><title>int:ac5cfb8e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailpagetext&amp;action=edit emailpagetext]&lt;br&gt;
-[[MediaWiki_talk:Emailpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e3fc4fe2&amp;action=edit eb6bf1bb]&lt;br&gt;
+[[MediaWiki_talk:e3fc4fe2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 If this user has entered a valid e-mail address in
 his or her user preferences, the form below will send a single message.
@@ -1386,95 +1386,95 @@ The e-mail address you entered in your user preferences will appear
 as the &amp;quot;From&amp;quot; address of the mail, so the recipient will be able
 to reply.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailpagetext</title></template>
+<template lineStart="1"><title>int:e3fc4fe2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsend&amp;action=edit emailsend]&lt;br&gt;
-[[MediaWiki_talk:Emailsend|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:145da553&amp;action=edit 05072b51]&lt;br&gt;
+[[MediaWiki_talk:145da553|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Send
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailsend</title></template>
+<template lineStart="1"><title>int:145da553</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsent&amp;action=edit emailsent]&lt;br&gt;
-[[MediaWiki_talk:Emailsent|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:833a22dc&amp;action=edit b1d3f3e4]&lt;br&gt;
+[[MediaWiki_talk:833a22dc|Talk]]
 &lt;/td&gt;&lt;td&gt;
 E-mail sent
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailsent</title></template>
+<template lineStart="1"><title>int:833a22dc</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsenttext&amp;action=edit emailsenttext]&lt;br&gt;
-[[MediaWiki_talk:Emailsenttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e3935836&amp;action=edit 2effa7aa]&lt;br&gt;
+[[MediaWiki_talk:e3935836|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your e-mail message has been sent.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailsenttext</title></template>
+<template lineStart="1"><title>int:e3935836</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsubject&amp;action=edit emailsubject]&lt;br&gt;
-[[MediaWiki_talk:Emailsubject|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c8dba338&amp;action=edit 275a0d68]&lt;br&gt;
+[[MediaWiki_talk:c8dba338|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Subject
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailsubject</title></template>
+<template lineStart="1"><title>int:c8dba338</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailto&amp;action=edit emailto]&lt;br&gt;
-[[MediaWiki_talk:Emailto|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c35740f4&amp;action=edit 88b0fd50]&lt;br&gt;
+[[MediaWiki_talk:c35740f4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 To
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailto</title></template>
+<template lineStart="1"><title>int:c35740f4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailuser&amp;action=edit emailuser]&lt;br&gt;
-[[MediaWiki_talk:Emailuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ac5cfb8e&amp;action=edit a9b033ab]&lt;br&gt;
+[[MediaWiki_talk:ac5cfb8e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 E-mail this user
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailuser</title></template>
+<template lineStart="1"><title>int:ac5cfb8e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Enterlockreason&amp;action=edit enterlockreason]&lt;br&gt;
-[[MediaWiki_talk:Enterlockreason|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6b0a234b&amp;action=edit 698a308a]&lt;br&gt;
+[[MediaWiki_talk:6b0a234b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Enter a reason for the lock, including an estimate
 of when the lock will be released
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Enterlockreason</title></template>
+<template lineStart="1"><title>int:6b0a234b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Error&amp;action=edit error]&lt;br&gt;
-[[MediaWiki_talk:Error|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7f2f6a15&amp;action=edit 11f9578d]&lt;br&gt;
+[[MediaWiki_talk:7f2f6a15|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Error
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Error</title></template>
+<template lineStart="1"><title>int:7f2f6a15</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Errorpagetitle&amp;action=edit errorpagetitle]&lt;br&gt;
-[[MediaWiki_talk:Errorpagetitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:53ee1378&amp;action=edit aa2d1eba]&lt;br&gt;
+[[MediaWiki_talk:53ee1378|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Error
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Errorpagetitle</title></template>
+<template lineStart="1"><title>int:53ee1378</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exbeforeblank&amp;action=edit exbeforeblank]&lt;br&gt;
-[[MediaWiki_talk:Exbeforeblank|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8aedeece&amp;action=edit a1c634a7]&lt;br&gt;
+[[MediaWiki_talk:8aedeece|Talk]]
 &lt;/td&gt;&lt;td&gt;
 content before blanking was:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Exbeforeblank</title></template>
+<template lineStart="1"><title>int:8aedeece</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exblank&amp;action=edit exblank]&lt;br&gt;
-[[MediaWiki_talk:Exblank|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:42abde88&amp;action=edit eba6d64f]&lt;br&gt;
+[[MediaWiki_talk:42abde88|Talk]]
 &lt;/td&gt;&lt;td&gt;
 page was empty
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Exblank</title></template>
+<template lineStart="1"><title>int:42abde88</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Excontent&amp;action=edit excontent]&lt;br&gt;
-[[MediaWiki_talk:Excontent|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dd028a5c&amp;action=edit fe80d230]&lt;br&gt;
+[[MediaWiki_talk:dd028a5c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 content was:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Excontent</title></template>
+<template lineStart="1"><title>int:dd028a5c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Explainconflict&amp;action=edit explainconflict]&lt;br&gt;
-[[MediaWiki_talk:Explainconflict|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b7845dfb&amp;action=edit 1a7999fa]&lt;br&gt;
+[[MediaWiki_talk:b7845dfb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Someone else has changed this page since you
 started editing it.
@@ -1485,163 +1485,163 @@ You will have to merge your changes into the existing text.
 press &amp;quot;Save page&amp;quot;.
 &amp;lt;p&amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Explainconflict</title></template>
+<template lineStart="1"><title>int:b7845dfb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Export&amp;action=edit export]&lt;br&gt;
-[[MediaWiki_talk:Export|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f3e4fadb&amp;action=edit 51713409]&lt;br&gt;
+[[MediaWiki_talk:f3e4fadb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Export pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Export</title></template>
+<template lineStart="1"><title>int:f3e4fadb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exportcuronly&amp;action=edit exportcuronly]&lt;br&gt;
-[[MediaWiki_talk:Exportcuronly|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b68aeee1&amp;action=edit bf364325]&lt;br&gt;
+[[MediaWiki_talk:b68aeee1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Include only the current revision, not the full history
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Exportcuronly</title></template>
+<template lineStart="1"><title>int:b68aeee1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exporttext&amp;action=edit exporttext]&lt;br&gt;
-[[MediaWiki_talk:Exporttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7e884d79&amp;action=edit eddfb839]&lt;br&gt;
+[[MediaWiki_talk:7e884d79|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You can export the text and editing history of a particular
 page or set of pages wrapped in some XML; this can then be imported into another
 wiki running MediaWiki software, transformed, or just kept for your private
 amusement.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Exporttext</title></template>
+<template lineStart="1"><title>int:7e884d79</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Extlink_sample&amp;action=edit extlink_sample]&lt;br&gt;
-[[MediaWiki_talk:Extlink_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a34d80e8&amp;action=edit 8f95a409]&lt;br&gt;
+[[MediaWiki_talk:a34d80e8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 http&amp;#58;//www.example.com link title
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Extlink_sample</title></template>
+<template lineStart="1"><title>int:a34d80e8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Extlink_tip&amp;action=edit extlink_tip]&lt;br&gt;
-[[MediaWiki_talk:Extlink_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:117651f0&amp;action=edit 481904c0]&lt;br&gt;
+[[MediaWiki_talk:117651f0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 External link (remember http&amp;#58;// prefix)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Extlink_tip</title></template>
+<template lineStart="1"><title>int:117651f0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Faq&amp;action=edit faq]&lt;br&gt;
-[[MediaWiki_talk:Faq|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f11042a4&amp;action=edit e75bc045]&lt;br&gt;
+[[MediaWiki_talk:f11042a4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 FAQ
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Faq</title></template>
+<template lineStart="1"><title>int:f11042a4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Faqpage&amp;action=edit faqpage]&lt;br&gt;
-[[MediaWiki_talk:Faqpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2e891e10&amp;action=edit 5b772c96]&lt;br&gt;
+[[MediaWiki_talk:2e891e10|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary:FAQ
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Faqpage</title></template>
+<template lineStart="1"><title>int:2e891e10</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Feedlinks&amp;action=edit feedlinks]&lt;br&gt;
-[[MediaWiki_talk:Feedlinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:86edbc13&amp;action=edit 62f8af98]&lt;br&gt;
+[[MediaWiki_talk:86edbc13|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Feed:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Feedlinks</title></template>
+<template lineStart="1"><title>int:86edbc13</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filecopyerror&amp;action=edit filecopyerror]&lt;br&gt;
-[[MediaWiki_talk:Filecopyerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2727dd90&amp;action=edit 6c916412]&lt;br&gt;
+[[MediaWiki_talk:2727dd90|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Could not copy file &amp;quot;$1&amp;quot; to &amp;quot;$2&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filecopyerror</title></template>
+<template lineStart="1"><title>int:2727dd90</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filedeleteerror&amp;action=edit filedeleteerror]&lt;br&gt;
-[[MediaWiki_talk:Filedeleteerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e60a2c42&amp;action=edit d393dbbc]&lt;br&gt;
+[[MediaWiki_talk:e60a2c42|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Could not delete file &amp;quot;$1&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filedeleteerror</title></template>
+<template lineStart="1"><title>int:e60a2c42</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filedesc&amp;action=edit filedesc]&lt;br&gt;
-[[MediaWiki_talk:Filedesc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d7b25eeb&amp;action=edit 6dace2d5]&lt;br&gt;
+[[MediaWiki_talk:d7b25eeb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Summary
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filedesc</title></template>
+<template lineStart="1"><title>int:d7b25eeb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filename&amp;action=edit filename]&lt;br&gt;
-[[MediaWiki_talk:Filename|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a3cbb98d&amp;action=edit 08deae8d]&lt;br&gt;
+[[MediaWiki_talk:a3cbb98d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Filename
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filename</title></template>
+<template lineStart="1"><title>int:a3cbb98d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filenotfound&amp;action=edit filenotfound]&lt;br&gt;
-[[MediaWiki_talk:Filenotfound|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c8f6c94d&amp;action=edit 35c4ded6]&lt;br&gt;
+[[MediaWiki_talk:c8f6c94d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Could not find file &amp;quot;$1&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filenotfound</title></template>
+<template lineStart="1"><title>int:c8f6c94d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filerenameerror&amp;action=edit filerenameerror]&lt;br&gt;
-[[MediaWiki_talk:Filerenameerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b9b56972&amp;action=edit 6d195b75]&lt;br&gt;
+[[MediaWiki_talk:b9b56972|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Could not rename file &amp;quot;$1&amp;quot; to &amp;quot;$2&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filerenameerror</title></template>
+<template lineStart="1"><title>int:b9b56972</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filesource&amp;action=edit filesource]&lt;br&gt;
-[[MediaWiki_talk:Filesource|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0a6a1eb6&amp;action=edit 1ffce53a]&lt;br&gt;
+[[MediaWiki_talk:0a6a1eb6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Source
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filesource</title></template>
+<template lineStart="1"><title>int:0a6a1eb6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filestatus&amp;action=edit filestatus]&lt;br&gt;
-[[MediaWiki_talk:Filestatus|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0f0e70a0&amp;action=edit 040e2ba8]&lt;br&gt;
+[[MediaWiki_talk:0f0e70a0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Copyright status
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filestatus</title></template>
+<template lineStart="1"><title>int:0f0e70a0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Fileuploaded&amp;action=edit fileuploaded]&lt;br&gt;
-[[MediaWiki_talk:Fileuploaded|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:45eaa53f&amp;action=edit 79423d38]&lt;br&gt;
+[[MediaWiki_talk:45eaa53f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 File &amp;quot;$1&amp;quot; uploaded successfully.
 Please follow this link: $2 to the description page and fill
 in information about the file, such as where it came from, when it was
 created and by whom, and anything else you may know about it.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Fileuploaded</title></template>
+<template lineStart="1"><title>int:45eaa53f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Formerror&amp;action=edit formerror]&lt;br&gt;
-[[MediaWiki_talk:Formerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a303ff06&amp;action=edit 416cf9e4]&lt;br&gt;
+[[MediaWiki_talk:a303ff06|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Error: could not submit form
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Formerror</title></template>
+<template lineStart="1"><title>int:a303ff06</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Fromwikipedia&amp;action=edit fromwikipedia]&lt;br&gt;
-[[MediaWiki_talk:Fromwikipedia|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dc08787f&amp;action=edit ada66d8e]&lt;br&gt;
+[[MediaWiki_talk:dc08787f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 From Wiktionary
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Fromwikipedia</title></template>
+<template lineStart="1"><title>int:dc08787f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Getimagelist&amp;action=edit getimagelist]&lt;br&gt;
-[[MediaWiki_talk:Getimagelist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c4c83db8&amp;action=edit f8d783cd]&lt;br&gt;
+[[MediaWiki_talk:c4c83db8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 fetching image list
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Getimagelist</title></template>
+<template lineStart="1"><title>int:c4c83db8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Go&amp;action=edit go]&lt;br&gt;
-[[MediaWiki_talk:Go|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2e0b45f2&amp;action=edit 1ec558a6]&lt;br&gt;
+[[MediaWiki_talk:2e0b45f2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Go
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Go</title></template>
+<template lineStart="1"><title>int:2e0b45f2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Googlesearch&amp;action=edit googlesearch]&lt;br&gt;
-[[MediaWiki_talk:Googlesearch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:749351b4&amp;action=edit 49a50bdf]&lt;br&gt;
+[[MediaWiki_talk:749351b4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 
 &amp;lt;!-- SiteSearch Google --&amp;gt;
@@ -1663,527 +1663,527 @@ border=&amp;quot;0&amp;quot; ALT=&amp;quot;Google&amp;quot;&amp;gt;&amp;lt;/A&am
 &amp;lt;/FORM&amp;gt;
 &amp;lt;!-- SiteSearch Google --&amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Googlesearch</title></template>
+<template lineStart="1"><title>int:749351b4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Guesstimezone&amp;action=edit guesstimezone]&lt;br&gt;
-[[MediaWiki_talk:Guesstimezone|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:489b474b&amp;action=edit 8da95a41]&lt;br&gt;
+[[MediaWiki_talk:489b474b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Fill in from browser
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Guesstimezone</title></template>
+<template lineStart="1"><title>int:489b474b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Headline_sample&amp;action=edit headline_sample]&lt;br&gt;
-[[MediaWiki_talk:Headline_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:237cf168&amp;action=edit 7f401fbb]&lt;br&gt;
+[[MediaWiki_talk:237cf168|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Headline text
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Headline_sample</title></template>
+<template lineStart="1"><title>int:237cf168</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Headline_tip&amp;action=edit headline_tip]&lt;br&gt;
-[[MediaWiki_talk:Headline_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:91b3bc72&amp;action=edit c4eef2f5]&lt;br&gt;
+[[MediaWiki_talk:91b3bc72|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Level 2 headline
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Headline_tip</title></template>
+<template lineStart="1"><title>int:91b3bc72</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Help&amp;action=edit help]&lt;br&gt;
-[[MediaWiki_talk:Help|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c47ae153&amp;action=edit 92005ecf]&lt;br&gt;
+[[MediaWiki_talk:c47ae153|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Help
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Help</title></template>
+<template lineStart="1"><title>int:c47ae153</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Helppage&amp;action=edit helppage]&lt;br&gt;
-[[MediaWiki_talk:Helppage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:56203224&amp;action=edit 9ca36083]&lt;br&gt;
+[[MediaWiki_talk:56203224|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Help:Contents
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Helppage</title></template>
+<template lineStart="1"><title>int:56203224</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hide&amp;action=edit hide]&lt;br&gt;
-[[MediaWiki_talk:Hide|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:34d8b60f&amp;action=edit 93c8c96b]&lt;br&gt;
+[[MediaWiki_talk:34d8b60f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 hide
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Hide</title></template>
+<template lineStart="1"><title>int:34d8b60f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hidetoc&amp;action=edit hidetoc]&lt;br&gt;
-[[MediaWiki_talk:Hidetoc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9aa39fe3&amp;action=edit 1cc77a14]&lt;br&gt;
+[[MediaWiki_talk:9aa39fe3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 hide
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Hidetoc</title></template>
+<template lineStart="1"><title>int:9aa39fe3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hist&amp;action=edit hist]&lt;br&gt;
-[[MediaWiki_talk:Hist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4d9810c0&amp;action=edit 56714843]&lt;br&gt;
+[[MediaWiki_talk:4d9810c0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 hist
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Hist</title></template>
+<template lineStart="1"><title>int:4d9810c0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Histlegend&amp;action=edit histlegend]&lt;br&gt;
-[[MediaWiki_talk:Histlegend|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f37ab91a&amp;action=edit 4e7121e9]&lt;br&gt;
+[[MediaWiki_talk:f37ab91a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Diff selection: mark the radio boxes of the versions to compare and hit enter or the button at the bottom.&amp;lt;br/&amp;gt;
 Legend: (cur) = difference with current version,
 (last) = difference with preceding version, M = minor edit.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Histlegend</title></template>
+<template lineStart="1"><title>int:f37ab91a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:History&amp;action=edit history]&lt;br&gt;
-[[MediaWiki_talk:History|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:90ccd649&amp;action=edit 66f79d8a]&lt;br&gt;
+[[MediaWiki_talk:90ccd649|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Page history
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:History</title></template>
+<template lineStart="1"><title>int:90ccd649</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:History_short&amp;action=edit history_short]&lt;br&gt;
-[[MediaWiki_talk:History_short|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:15a13ace&amp;action=edit a937e036]&lt;br&gt;
+[[MediaWiki_talk:15a13ace|Talk]]
 &lt;/td&gt;&lt;td&gt;
 History
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:History_short</title></template>
+<template lineStart="1"><title>int:15a13ace</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Historywarning&amp;action=edit historywarning]&lt;br&gt;
-[[MediaWiki_talk:Historywarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e02c3587&amp;action=edit 6079f80a]&lt;br&gt;
+[[MediaWiki_talk:e02c3587|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Warning: The page you are about to delete has a history: 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Historywarning</title></template>
+<template lineStart="1"><title>int:e02c3587</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hr_tip&amp;action=edit hr_tip]&lt;br&gt;
-[[MediaWiki_talk:Hr_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5741ad8f&amp;action=edit 48849a80]&lt;br&gt;
+[[MediaWiki_talk:5741ad8f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Horizontal line (use sparingly)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Hr_tip</title></template>
+<template lineStart="1"><title>int:5741ad8f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ignorewarning&amp;action=edit ignorewarning]&lt;br&gt;
-[[MediaWiki_talk:Ignorewarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7e18602a&amp;action=edit d874ec59]&lt;br&gt;
+[[MediaWiki_talk:7e18602a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Ignore warning and save file anyway.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ignorewarning</title></template>
+<template lineStart="1"><title>int:7e18602a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ilshowmatch&amp;action=edit ilshowmatch]&lt;br&gt;
-[[MediaWiki_talk:Ilshowmatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5bf1efaa&amp;action=edit a98182df]&lt;br&gt;
+[[MediaWiki_talk:5bf1efaa|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Show all images with names matching
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ilshowmatch</title></template>
+<template lineStart="1"><title>int:5bf1efaa</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ilsubmit&amp;action=edit ilsubmit]&lt;br&gt;
-[[MediaWiki_talk:Ilsubmit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8e7a51d5&amp;action=edit f8288ad8]&lt;br&gt;
+[[MediaWiki_talk:8e7a51d5|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Search
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ilsubmit</title></template>
+<template lineStart="1"><title>int:8e7a51d5</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Image_sample&amp;action=edit image_sample]&lt;br&gt;
-[[MediaWiki_talk:Image_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:133971b3&amp;action=edit be19a728]&lt;br&gt;
+[[MediaWiki_talk:133971b3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Example.jpg
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Image_sample</title></template>
+<template lineStart="1"><title>int:133971b3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Image_tip&amp;action=edit image_tip]&lt;br&gt;
-[[MediaWiki_talk:Image_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a73e0c3&amp;action=edit d103e97d]&lt;br&gt;
+[[MediaWiki_talk:2a73e0c3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Embedded image
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Image_tip</title></template>
+<template lineStart="1"><title>int:2a73e0c3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelinks&amp;action=edit imagelinks]&lt;br&gt;
-[[MediaWiki_talk:Imagelinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:353c260c&amp;action=edit 3414ac48]&lt;br&gt;
+[[MediaWiki_talk:353c260c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Image links
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imagelinks</title></template>
+<template lineStart="1"><title>int:353c260c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelist&amp;action=edit imagelist]&lt;br&gt;
-[[MediaWiki_talk:Imagelist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:affc6aca&amp;action=edit 4c06ba77]&lt;br&gt;
+[[MediaWiki_talk:affc6aca|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Image list
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imagelist</title></template>
+<template lineStart="1"><title>int:affc6aca</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelisttext&amp;action=edit imagelisttext]&lt;br&gt;
-[[MediaWiki_talk:Imagelisttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ade85019&amp;action=edit 2e8294bd]&lt;br&gt;
+[[MediaWiki_talk:ade85019|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Below is a list of $1 images sorted $2.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imagelisttext</title></template>
+<template lineStart="1"><title>int:ade85019</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagepage&amp;action=edit imagepage]&lt;br&gt;
-[[MediaWiki_talk:Imagepage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7277ee94&amp;action=edit a152014b]&lt;br&gt;
+[[MediaWiki_talk:7277ee94|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View image page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imagepage</title></template>
+<template lineStart="1"><title>int:7277ee94</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagereverted&amp;action=edit imagereverted]&lt;br&gt;
-[[MediaWiki_talk:Imagereverted|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c783375c&amp;action=edit b1d4cc4c]&lt;br&gt;
+[[MediaWiki_talk:c783375c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Revert to earlier version was successful.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imagereverted</title></template>
+<template lineStart="1"><title>int:c783375c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imgdelete&amp;action=edit imgdelete]&lt;br&gt;
-[[MediaWiki_talk:Imgdelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c6f52751&amp;action=edit 6656e4f4]&lt;br&gt;
+[[MediaWiki_talk:c6f52751|Talk]]
 &lt;/td&gt;&lt;td&gt;
 del
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imgdelete</title></template>
+<template lineStart="1"><title>int:c6f52751</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imgdesc&amp;action=edit imgdesc]&lt;br&gt;
-[[MediaWiki_talk:Imgdesc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3c281ed6&amp;action=edit a1adca28]&lt;br&gt;
+[[MediaWiki_talk:3c281ed6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 desc
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imgdesc</title></template>
+<template lineStart="1"><title>int:3c281ed6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imghistlegend&amp;action=edit imghistlegend]&lt;br&gt;
-[[MediaWiki_talk:Imghistlegend|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:186e5ca1&amp;action=edit de786597]&lt;br&gt;
+[[MediaWiki_talk:186e5ca1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Legend: (cur) = this is the current image, (del) = delete
 this old version, (rev) = revert to this old version.
 &amp;lt;br /&amp;gt;&amp;lt;i&amp;gt;Click on date to see image uploaded on that date&amp;lt;/i&amp;gt;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imghistlegend</title></template>
+<template lineStart="1"><title>int:186e5ca1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imghistory&amp;action=edit imghistory]&lt;br&gt;
-[[MediaWiki_talk:Imghistory|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8d78c0d7&amp;action=edit d9305ede]&lt;br&gt;
+[[MediaWiki_talk:8d78c0d7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Image history
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imghistory</title></template>
+<template lineStart="1"><title>int:8d78c0d7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imglegend&amp;action=edit imglegend]&lt;br&gt;
-[[MediaWiki_talk:Imglegend|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:86260b9f&amp;action=edit a46e05c1]&lt;br&gt;
+[[MediaWiki_talk:86260b9f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Legend: (desc) = show/edit image description.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imglegend</title></template>
+<template lineStart="1"><title>int:86260b9f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Import&amp;action=edit import]&lt;br&gt;
-[[MediaWiki_talk:Import|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d6fbc9d2&amp;action=edit 62fdfbd5]&lt;br&gt;
+[[MediaWiki_talk:d6fbc9d2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Import pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Import</title></template>
+<template lineStart="1"><title>int:d6fbc9d2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importfailed&amp;action=edit importfailed]&lt;br&gt;
-[[MediaWiki_talk:Importfailed|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bac6ed75&amp;action=edit 85d2877a]&lt;br&gt;
+[[MediaWiki_talk:bac6ed75|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Import failed: $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Importfailed</title></template>
+<template lineStart="1"><title>int:bac6ed75</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importhistoryconflict&amp;action=edit importhistoryconflict]&lt;br&gt;
-[[MediaWiki_talk:Importhistoryconflict|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f4dee51e&amp;action=edit f74f664b]&lt;br&gt;
+[[MediaWiki_talk:f4dee51e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Conflicting history revision exists (may have imported this page before)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Importhistoryconflict</title></template>
+<template lineStart="1"><title>int:f4dee51e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importnotext&amp;action=edit importnotext]&lt;br&gt;
-[[MediaWiki_talk:Importnotext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1d461354&amp;action=edit ff881471]&lt;br&gt;
+[[MediaWiki_talk:1d461354|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Empty or no text
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Importnotext</title></template>
+<template lineStart="1"><title>int:1d461354</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importsuccess&amp;action=edit importsuccess]&lt;br&gt;
-[[MediaWiki_talk:Importsuccess|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5b910f21&amp;action=edit e2781bd1]&lt;br&gt;
+[[MediaWiki_talk:5b910f21|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Import succeeded!
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Importsuccess</title></template>
+<template lineStart="1"><title>int:5b910f21</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importtext&amp;action=edit importtext]&lt;br&gt;
-[[MediaWiki_talk:Importtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3d58d609&amp;action=edit 965243c5]&lt;br&gt;
+[[MediaWiki_talk:3d58d609|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Please export the file from the source wiki using the Special:Export utility, save it to your disk and upload it here.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Importtext</title></template>
+<template lineStart="1"><title>int:3d58d609</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Infobox&amp;action=edit infobox]&lt;br&gt;
-[[MediaWiki_talk:Infobox|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:31be67da&amp;action=edit 176bd169]&lt;br&gt;
+[[MediaWiki_talk:31be67da|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Click a button to get an example text
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Infobox</title></template>
+<template lineStart="1"><title>int:31be67da</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Infobox_alert&amp;action=edit infobox_alert]&lt;br&gt;
-[[MediaWiki_talk:Infobox_alert|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2854823a&amp;action=edit 6de0a6d1]&lt;br&gt;
+[[MediaWiki_talk:2854823a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Please enter the text you want to be formatted.\n It will be shown in the infobox for copy and pasting.\nExample:\n$1\nwill become:\n$2
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Infobox_alert</title></template>
+<template lineStart="1"><title>int:2854823a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Internalerror&amp;action=edit internalerror]&lt;br&gt;
-[[MediaWiki_talk:Internalerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:103c360a&amp;action=edit e90e9e1c]&lt;br&gt;
+[[MediaWiki_talk:103c360a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Internal error
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Internalerror</title></template>
+<template lineStart="1"><title>int:103c360a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Intl&amp;action=edit intl]&lt;br&gt;
-[[MediaWiki_talk:Intl|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:148008a6&amp;action=edit 919b03e5]&lt;br&gt;
+[[MediaWiki_talk:148008a6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Interlanguage links
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Intl</title></template>
+<template lineStart="1"><title>int:148008a6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ip_range_invalid&amp;action=edit ip_range_invalid]&lt;br&gt;
-[[MediaWiki_talk:Ip_range_invalid|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:07586557&amp;action=edit 5c2ff182]&lt;br&gt;
+[[MediaWiki_talk:07586557|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Invalid IP range.
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ip_range_invalid</title></template>
+<template lineStart="1"><title>int:07586557</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipaddress&amp;action=edit ipaddress]&lt;br&gt;
-[[MediaWiki_talk:Ipaddress|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:22f9ff50&amp;action=edit 1f99aaad]&lt;br&gt;
+[[MediaWiki_talk:22f9ff50|Talk]]
 &lt;/td&gt;&lt;td&gt;
 IP Address/username
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipaddress</title></template>
+<template lineStart="1"><title>int:22f9ff50</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipb_expiry_invalid&amp;action=edit ipb_expiry_invalid]&lt;br&gt;
-[[MediaWiki_talk:Ipb_expiry_invalid|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f8994552&amp;action=edit 91b35c2d]&lt;br&gt;
+[[MediaWiki_talk:f8994552|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Expiry time invalid.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipb_expiry_invalid</title></template>
+<template lineStart="1"><title>int:f8994552</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbexpiry&amp;action=edit ipbexpiry]&lt;br&gt;
-[[MediaWiki_talk:Ipbexpiry|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2147c662&amp;action=edit 524cfd7e]&lt;br&gt;
+[[MediaWiki_talk:2147c662|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Expiry
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipbexpiry</title></template>
+<template lineStart="1"><title>int:2147c662</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipblocklist&amp;action=edit ipblocklist]&lt;br&gt;
-[[MediaWiki_talk:Ipblocklist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9cb7e6ee&amp;action=edit 503153e9]&lt;br&gt;
+[[MediaWiki_talk:9cb7e6ee|Talk]]
 &lt;/td&gt;&lt;td&gt;
 List of blocked IP addresses and usernames
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipblocklist</title></template>
+<template lineStart="1"><title>int:9cb7e6ee</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbreason&amp;action=edit ipbreason]&lt;br&gt;
-[[MediaWiki_talk:Ipbreason|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6774dfa8&amp;action=edit 1ecdad25]&lt;br&gt;
+[[MediaWiki_talk:6774dfa8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Reason
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipbreason</title></template>
+<template lineStart="1"><title>int:6774dfa8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbsubmit&amp;action=edit ipbsubmit]&lt;br&gt;
-[[MediaWiki_talk:Ipbsubmit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:62218118&amp;action=edit e29a20a2]&lt;br&gt;
+[[MediaWiki_talk:62218118|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Block this user
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipbsubmit</title></template>
+<template lineStart="1"><title>int:62218118</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipusubmit&amp;action=edit ipusubmit]&lt;br&gt;
-[[MediaWiki_talk:Ipusubmit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7863d305&amp;action=edit 73ecf10c]&lt;br&gt;
+[[MediaWiki_talk:7863d305|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Unblock this address
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipusubmit</title></template>
+<template lineStart="1"><title>int:7863d305</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipusuccess&amp;action=edit ipusuccess]&lt;br&gt;
-[[MediaWiki_talk:Ipusuccess|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ba95215c&amp;action=edit 5fc7f411]&lt;br&gt;
+[[MediaWiki_talk:ba95215c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;quot;$1&amp;quot; unblocked
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipusuccess</title></template>
+<template lineStart="1"><title>int:ba95215c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Isbn&amp;action=edit isbn]&lt;br&gt;
-[[MediaWiki_talk:Isbn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8e89a827&amp;action=edit 9aa403ad]&lt;br&gt;
+[[MediaWiki_talk:8e89a827|Talk]]
 &lt;/td&gt;&lt;td&gt;
 ISBN
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Isbn</title></template>
+<template lineStart="1"><title>int:8e89a827</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Isredirect&amp;action=edit isredirect]&lt;br&gt;
-[[MediaWiki_talk:Isredirect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5b017ff1&amp;action=edit abdf987b]&lt;br&gt;
+[[MediaWiki_talk:5b017ff1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 redirect page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Isredirect</title></template>
+<template lineStart="1"><title>int:5b017ff1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Italic_sample&amp;action=edit italic_sample]&lt;br&gt;
-[[MediaWiki_talk:Italic_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:208e76ed&amp;action=edit 95f02073]&lt;br&gt;
+[[MediaWiki_talk:208e76ed|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Italic text
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Italic_sample</title></template>
+<template lineStart="1"><title>int:208e76ed</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Italic_tip&amp;action=edit italic_tip]&lt;br&gt;
-[[MediaWiki_talk:Italic_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7e5211e9&amp;action=edit 3f1c7185]&lt;br&gt;
+[[MediaWiki_talk:7e5211e9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Italic text
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Italic_tip</title></template>
+<template lineStart="1"><title>int:7e5211e9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Iteminvalidname&amp;action=edit iteminvalidname]&lt;br&gt;
-[[MediaWiki_talk:Iteminvalidname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bcce0a8a&amp;action=edit 0e29818a]&lt;br&gt;
+[[MediaWiki_talk:bcce0a8a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Problem with item &amp;#39;$1&amp;#39;, invalid name...
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Iteminvalidname</title></template>
+<template lineStart="1"><title>int:bcce0a8a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Largefile&amp;action=edit largefile]&lt;br&gt;
-[[MediaWiki_talk:Largefile|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:996c231b&amp;action=edit 5dd7fd8c]&lt;br&gt;
+[[MediaWiki_talk:996c231b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 It is recommended that images not exceed 100k in size.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Largefile</title></template>
+<template lineStart="1"><title>int:996c231b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Last&amp;action=edit last]&lt;br&gt;
-[[MediaWiki_talk:Last|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d1c69a85&amp;action=edit 213ed3ea]&lt;br&gt;
+[[MediaWiki_talk:d1c69a85|Talk]]
 &lt;/td&gt;&lt;td&gt;
 last
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Last</title></template>
+<template lineStart="1"><title>int:d1c69a85</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lastmodified&amp;action=edit lastmodified]&lt;br&gt;
-[[MediaWiki_talk:Lastmodified|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:26d03483&amp;action=edit 1d0be5cf]&lt;br&gt;
+[[MediaWiki_talk:26d03483|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This page was last modified $1.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lastmodified</title></template>
+<template lineStart="1"><title>int:26d03483</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lastmodifiedby&amp;action=edit lastmodifiedby]&lt;br&gt;
-[[MediaWiki_talk:Lastmodifiedby|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d8b6a1ce&amp;action=edit b4c7424e]&lt;br&gt;
+[[MediaWiki_talk:d8b6a1ce|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This page was last modified $1 by $2.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lastmodifiedby</title></template>
+<template lineStart="1"><title>int:d8b6a1ce</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lineno&amp;action=edit lineno]&lt;br&gt;
-[[MediaWiki_talk:Lineno|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b5fb75c3&amp;action=edit 7aab91e5]&lt;br&gt;
+[[MediaWiki_talk:b5fb75c3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Line $1:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lineno</title></template>
+<template lineStart="1"><title>int:b5fb75c3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Link_sample&amp;action=edit link_sample]&lt;br&gt;
-[[MediaWiki_talk:Link_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a1a27fd2&amp;action=edit 4c4ec68a]&lt;br&gt;
+[[MediaWiki_talk:a1a27fd2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Link title
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Link_sample</title></template>
+<template lineStart="1"><title>int:a1a27fd2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Link_tip&amp;action=edit link_tip]&lt;br&gt;
-[[MediaWiki_talk:Link_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:28f8c928&amp;action=edit e0ee37d8]&lt;br&gt;
+[[MediaWiki_talk:28f8c928|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Internal link
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Link_tip</title></template>
+<template lineStart="1"><title>int:28f8c928</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linklistsub&amp;action=edit linklistsub]&lt;br&gt;
-[[MediaWiki_talk:Linklistsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:003058f7&amp;action=edit c692b683]&lt;br&gt;
+[[MediaWiki_talk:003058f7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (List of links)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Linklistsub</title></template>
+<template lineStart="1"><title>int:003058f7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linkshere&amp;action=edit linkshere]&lt;br&gt;
-[[MediaWiki_talk:Linkshere|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6508e12f&amp;action=edit ce30384f]&lt;br&gt;
+[[MediaWiki_talk:6508e12f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The following pages link to here:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Linkshere</title></template>
+<template lineStart="1"><title>int:6508e12f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linkstoimage&amp;action=edit linkstoimage]&lt;br&gt;
-[[MediaWiki_talk:Linkstoimage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f6dbd59d&amp;action=edit 50b839a3]&lt;br&gt;
+[[MediaWiki_talk:f6dbd59d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The following pages link to this image:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Linkstoimage</title></template>
+<template lineStart="1"><title>int:f6dbd59d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linktrail&amp;action=edit linktrail]&lt;br&gt;
-[[MediaWiki_talk:Linktrail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:eb68781a&amp;action=edit 743236e7]&lt;br&gt;
+[[MediaWiki_talk:eb68781a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 /^(&amp;#91;a-z]+)(.*)$/sD
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Linktrail</title></template>
+<template lineStart="1"><title>int:eb68781a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Listform&amp;action=edit listform]&lt;br&gt;
-[[MediaWiki_talk:Listform|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a8ca6811&amp;action=edit 069b38c0]&lt;br&gt;
+[[MediaWiki_talk:a8ca6811|Talk]]
 &lt;/td&gt;&lt;td&gt;
 list
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Listform</title></template>
+<template lineStart="1"><title>int:a8ca6811</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Listusers&amp;action=edit listusers]&lt;br&gt;
-[[MediaWiki_talk:Listusers|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9bf82beb&amp;action=edit aabbb062]&lt;br&gt;
+[[MediaWiki_talk:9bf82beb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 User list
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Listusers</title></template>
+<template lineStart="1"><title>int:9bf82beb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loadhist&amp;action=edit loadhist]&lt;br&gt;
-[[MediaWiki_talk:Loadhist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:61a6ed55&amp;action=edit 1b4ae4f9]&lt;br&gt;
+[[MediaWiki_talk:61a6ed55|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Loading page history
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loadhist</title></template>
+<template lineStart="1"><title>int:61a6ed55</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loadingrev&amp;action=edit loadingrev]&lt;br&gt;
-[[MediaWiki_talk:Loadingrev|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bf19b1de&amp;action=edit b6bb9fa5]&lt;br&gt;
+[[MediaWiki_talk:bf19b1de|Talk]]
 &lt;/td&gt;&lt;td&gt;
 loading revision for diff
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loadingrev</title></template>
+<template lineStart="1"><title>int:bf19b1de</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Localtime&amp;action=edit localtime]&lt;br&gt;
-[[MediaWiki_talk:Localtime|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:43678846&amp;action=edit f25bccd7]&lt;br&gt;
+[[MediaWiki_talk:43678846|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Local time display
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Localtime</title></template>
+<template lineStart="1"><title>int:43678846</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockbtn&amp;action=edit lockbtn]&lt;br&gt;
-[[MediaWiki_talk:Lockbtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:31dcaa22&amp;action=edit 62c50181]&lt;br&gt;
+[[MediaWiki_talk:31dcaa22|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Lock database
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockbtn</title></template>
+<template lineStart="1"><title>int:31dcaa22</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockconfirm&amp;action=edit lockconfirm]&lt;br&gt;
-[[MediaWiki_talk:Lockconfirm|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9dc82fa2&amp;action=edit 5199ac8e]&lt;br&gt;
+[[MediaWiki_talk:9dc82fa2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Yes, I really want to lock the database.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockconfirm</title></template>
+<template lineStart="1"><title>int:9dc82fa2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdb&amp;action=edit lockdb]&lt;br&gt;
-[[MediaWiki_talk:Lockdb|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fef93b9b&amp;action=edit 4f29ae0a]&lt;br&gt;
+[[MediaWiki_talk:fef93b9b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Lock database
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockdb</title></template>
+<template lineStart="1"><title>int:fef93b9b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbsuccesssub&amp;action=edit lockdbsuccesssub]&lt;br&gt;
-[[MediaWiki_talk:Lockdbsuccesssub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b4abc4bb&amp;action=edit e73c06d7]&lt;br&gt;
+[[MediaWiki_talk:b4abc4bb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Database lock succeeded
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockdbsuccesssub</title></template>
+<template lineStart="1"><title>int:b4abc4bb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbsuccesstext&amp;action=edit lockdbsuccesstext]&lt;br&gt;
-[[MediaWiki_talk:Lockdbsuccesstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b6fcfec5&amp;action=edit 88c6fb22]&lt;br&gt;
+[[MediaWiki_talk:b6fcfec5|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The database has been locked.
 &amp;lt;br /&amp;gt;Remember to remove the lock after your maintenance is complete.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockdbsuccesstext</title></template>
+<template lineStart="1"><title>int:b6fcfec5</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbtext&amp;action=edit lockdbtext]&lt;br&gt;
-[[MediaWiki_talk:Lockdbtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:459bf648&amp;action=edit 070ff9ae]&lt;br&gt;
+[[MediaWiki_talk:459bf648|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Locking the database will suspend the ability of all
 users to edit pages, change their preferences, edit their watchlists, and
@@ -2191,87 +2191,87 @@ other things requiring changes in the database.
 Please confirm that this is what you intend to do, and that you will
 unlock the database when your maintenance is done.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockdbtext</title></template>
+<template lineStart="1"><title>int:459bf648</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Locknoconfirm&amp;action=edit locknoconfirm]&lt;br&gt;
-[[MediaWiki_talk:Locknoconfirm|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2727a733&amp;action=edit 8a890d0a]&lt;br&gt;
+[[MediaWiki_talk:2727a733|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You did not check the confirmation box.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Locknoconfirm</title></template>
+<template lineStart="1"><title>int:2727a733</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Login&amp;action=edit login]&lt;br&gt;
-[[MediaWiki_talk:Login|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4e5a2893&amp;action=edit 2736fab2]&lt;br&gt;
+[[MediaWiki_talk:4e5a2893|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Log in
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Login</title></template>
+<template lineStart="1"><title>int:4e5a2893</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginerror&amp;action=edit loginerror]&lt;br&gt;
-[[MediaWiki_talk:Loginerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fcfc7549&amp;action=edit e6f9a4e2]&lt;br&gt;
+[[MediaWiki_talk:fcfc7549|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Login error
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginerror</title></template>
+<template lineStart="1"><title>int:fcfc7549</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginpagetitle&amp;action=edit loginpagetitle]&lt;br&gt;
-[[MediaWiki_talk:Loginpagetitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4113f724&amp;action=edit 36f843a7]&lt;br&gt;
+[[MediaWiki_talk:4113f724|Talk]]
 &lt;/td&gt;&lt;td&gt;
 User login
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginpagetitle</title></template>
+<template lineStart="1"><title>int:4113f724</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginproblem&amp;action=edit loginproblem]&lt;br&gt;
-[[MediaWiki_talk:Loginproblem|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7a6963a6&amp;action=edit d23ee6a8]&lt;br&gt;
+[[MediaWiki_talk:7a6963a6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;b&amp;gt;There has been a problem with your login.&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;Try again!
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginproblem</title></template>
+<template lineStart="1"><title>int:7a6963a6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginprompt&amp;action=edit loginprompt]&lt;br&gt;
-[[MediaWiki_talk:Loginprompt|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bbf56890&amp;action=edit 221d44a4]&lt;br&gt;
+[[MediaWiki_talk:bbf56890|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You must have cookies enabled to log in to Wiktionary.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginprompt</title></template>
+<template lineStart="1"><title>int:bbf56890</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginreqtext&amp;action=edit loginreqtext]&lt;br&gt;
-[[MediaWiki_talk:Loginreqtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:75749962&amp;action=edit ee8446ea]&lt;br&gt;
+[[MediaWiki_talk:75749962|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You must &amp;#91;&amp;#91;special:Userlogin&amp;#124;login]] to view other pages.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginreqtext</title></template>
+<template lineStart="1"><title>int:75749962</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginreqtitle&amp;action=edit loginreqtitle]&lt;br&gt;
-[[MediaWiki_talk:Loginreqtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c779400b&amp;action=edit a90049e8]&lt;br&gt;
+[[MediaWiki_talk:c779400b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Login Required
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginreqtitle</title></template>
+<template lineStart="1"><title>int:c779400b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginsuccess&amp;action=edit loginsuccess]&lt;br&gt;
-[[MediaWiki_talk:Loginsuccess|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:753694e0&amp;action=edit a5607b10]&lt;br&gt;
+[[MediaWiki_talk:753694e0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You are now logged in to Wiktionary as &amp;quot;$1&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginsuccess</title></template>
+<template lineStart="1"><title>int:753694e0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginsuccesstitle&amp;action=edit loginsuccesstitle]&lt;br&gt;
-[[MediaWiki_talk:Loginsuccesstitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:73eb6767&amp;action=edit 5c2a05be]&lt;br&gt;
+[[MediaWiki_talk:73eb6767|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Login successful
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginsuccesstitle</title></template>
+<template lineStart="1"><title>int:73eb6767</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logout&amp;action=edit logout]&lt;br&gt;
-[[MediaWiki_talk:Logout|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e43d612e&amp;action=edit 55525e1b]&lt;br&gt;
+[[MediaWiki_talk:e43d612e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Log out
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Logout</title></template>
+<template lineStart="1"><title>int:e43d612e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logouttext&amp;action=edit logouttext]&lt;br&gt;
-[[MediaWiki_talk:Logouttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a8455b1c&amp;action=edit 50310460]&lt;br&gt;
+[[MediaWiki_talk:a8455b1c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You are now logged out.
 You can continue to use Wiktionary anonymously, or you can log in
@@ -2280,311 +2280,311 @@ continue to be displayed as if you were still logged in, until you clear
 your browser cache
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Logouttext</title></template>
+<template lineStart="1"><title>int:a8455b1c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logouttitle&amp;action=edit logouttitle]&lt;br&gt;
-[[MediaWiki_talk:Logouttitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cd48f4e7&amp;action=edit 8f9db4e5]&lt;br&gt;
+[[MediaWiki_talk:cd48f4e7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 User logout
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Logouttitle</title></template>
+<template lineStart="1"><title>int:cd48f4e7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lonelypages&amp;action=edit lonelypages]&lt;br&gt;
-[[MediaWiki_talk:Lonelypages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:916f5569&amp;action=edit 92ab2259]&lt;br&gt;
+[[MediaWiki_talk:916f5569|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Orphaned pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lonelypages</title></template>
+<template lineStart="1"><title>int:916f5569</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Longpages&amp;action=edit longpages]&lt;br&gt;
-[[MediaWiki_talk:Longpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9cdfa115&amp;action=edit 38996948]&lt;br&gt;
+[[MediaWiki_talk:9cdfa115|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Long pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Longpages</title></template>
+<template lineStart="1"><title>int:9cdfa115</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Longpagewarning&amp;action=edit longpagewarning]&lt;br&gt;
-[[MediaWiki_talk:Longpagewarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b91ee293&amp;action=edit 09b5b0a2]&lt;br&gt;
+[[MediaWiki_talk:b91ee293|Talk]]
 &lt;/td&gt;&lt;td&gt;
 WARNING: This page is $1 kilobytes long; some
 browsers may have problems editing pages approaching or longer than 32kb.
 Please consider breaking the page into smaller sections.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Longpagewarning</title></template>
+<template lineStart="1"><title>int:b91ee293</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailerror&amp;action=edit mailerror]&lt;br&gt;
-[[MediaWiki_talk:Mailerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1ca3c8a2&amp;action=edit 2b82fce3]&lt;br&gt;
+[[MediaWiki_talk:1ca3c8a2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Error sending mail: $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mailerror</title></template>
+<template lineStart="1"><title>int:1ca3c8a2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailmypassword&amp;action=edit mailmypassword]&lt;br&gt;
-[[MediaWiki_talk:Mailmypassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:97681e3e&amp;action=edit 669d145f]&lt;br&gt;
+[[MediaWiki_talk:97681e3e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Mail me a new password
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mailmypassword</title></template>
+<template lineStart="1"><title>int:97681e3e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailnologin&amp;action=edit mailnologin]&lt;br&gt;
-[[MediaWiki_talk:Mailnologin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8646515d&amp;action=edit 874a6660]&lt;br&gt;
+[[MediaWiki_talk:8646515d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 No send address
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mailnologin</title></template>
+<template lineStart="1"><title>int:8646515d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailnologintext&amp;action=edit mailnologintext]&lt;br&gt;
-[[MediaWiki_talk:Mailnologintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f8116e36&amp;action=edit ce0442ed]&lt;br&gt;
+[[MediaWiki_talk:f8116e36|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You must be &amp;lt;a href=&amp;quot;{{localurl:Special:Userlogin&amp;quot;&amp;gt;logged in&amp;lt;/a&amp;gt;
 and have a valid e-mail address in your &amp;lt;a href=&amp;quot;/wiki/Special:Preferences&amp;quot;&amp;gt;preferences&amp;lt;/a&amp;gt;
 to send e-mail to other users.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mailnologintext</title></template>
+<template lineStart="1"><title>int:f8116e36</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpage&amp;action=edit mainpage]&lt;br&gt;
-[[MediaWiki_talk:Mainpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:95989ab3&amp;action=edit 6ad3db9a]&lt;br&gt;
+[[MediaWiki_talk:95989ab3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Main Page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mainpage</title></template>
+<template lineStart="1"><title>int:95989ab3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpagedocfooter&amp;action=edit mainpagedocfooter]&lt;br&gt;
-[[MediaWiki_talk:Mainpagedocfooter|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:216e0fe3&amp;action=edit 19d499cf]&lt;br&gt;
+[[MediaWiki_talk:216e0fe3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Please see &amp;#91;http&amp;#58;//meta.wikipedia.org/wiki/MediaWiki_i18n documentation on customizing the interface]
 and the &amp;#91;http&amp;#58;//meta.wikipedia.org/wiki/MediaWiki_User%27s_Guide User&amp;#39;s Guide] for usage and configuration help.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mainpagedocfooter</title></template>
+<template lineStart="1"><title>int:216e0fe3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpagetext&amp;action=edit mainpagetext]&lt;br&gt;
-[[MediaWiki_talk:Mainpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:29c07aac&amp;action=edit 30186460]&lt;br&gt;
+[[MediaWiki_talk:29c07aac|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiki software successfully installed.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mainpagetext</title></template>
+<template lineStart="1"><title>int:29c07aac</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintenance&amp;action=edit maintenance]&lt;br&gt;
-[[MediaWiki_talk:Maintenance|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:94de303b&amp;action=edit 5b30e2c5]&lt;br&gt;
+[[MediaWiki_talk:94de303b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Maintenance page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Maintenance</title></template>
+<template lineStart="1"><title>int:94de303b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintenancebacklink&amp;action=edit maintenancebacklink]&lt;br&gt;
-[[MediaWiki_talk:Maintenancebacklink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b98df751&amp;action=edit aa734abd]&lt;br&gt;
+[[MediaWiki_talk:b98df751|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Back to Maintenance Page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Maintenancebacklink</title></template>
+<template lineStart="1"><title>int:b98df751</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintnancepagetext&amp;action=edit maintnancepagetext]&lt;br&gt;
-[[MediaWiki_talk:Maintnancepagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5e830e7c&amp;action=edit ff589b21]&lt;br&gt;
+[[MediaWiki_talk:5e830e7c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This page includes several handy tools for everyday maintenance. Some of these functions tend to stress the database, so please do not hit reload after every item you fixed ;-)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Maintnancepagetext</title></template>
+<template lineStart="1"><title>int:5e830e7c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysop&amp;action=edit makesysop]&lt;br&gt;
-[[MediaWiki_talk:Makesysop|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:147d840b&amp;action=edit 192a7baa]&lt;br&gt;
+[[MediaWiki_talk:147d840b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Make a user into a sysop
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysop</title></template>
+<template lineStart="1"><title>int:147d840b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopfail&amp;action=edit makesysopfail]&lt;br&gt;
-[[MediaWiki_talk:Makesysopfail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3e1272dd&amp;action=edit c857a847]&lt;br&gt;
+[[MediaWiki_talk:3e1272dd|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;b&amp;gt;User &amp;quot;$1&amp;quot; could not be made into a sysop. (Did you enter the name correctly?)&amp;lt;/b&amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysopfail</title></template>
+<template lineStart="1"><title>int:3e1272dd</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopname&amp;action=edit makesysopname]&lt;br&gt;
-[[MediaWiki_talk:Makesysopname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f942827d&amp;action=edit 4ae2de91]&lt;br&gt;
+[[MediaWiki_talk:f942827d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Name of the user:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysopname</title></template>
+<template lineStart="1"><title>int:f942827d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopok&amp;action=edit makesysopok]&lt;br&gt;
-[[MediaWiki_talk:Makesysopok|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8933e97e&amp;action=edit 1138d88d]&lt;br&gt;
+[[MediaWiki_talk:8933e97e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;b&amp;gt;User &amp;quot;$1&amp;quot; is now a sysop&amp;lt;/b&amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysopok</title></template>
+<template lineStart="1"><title>int:8933e97e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopsubmit&amp;action=edit makesysopsubmit]&lt;br&gt;
-[[MediaWiki_talk:Makesysopsubmit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ffde53f7&amp;action=edit 51a3d81a]&lt;br&gt;
+[[MediaWiki_talk:ffde53f7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Make this user into a sysop
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysopsubmit</title></template>
+<template lineStart="1"><title>int:ffde53f7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysoptext&amp;action=edit makesysoptext]&lt;br&gt;
-[[MediaWiki_talk:Makesysoptext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6135d20c&amp;action=edit 9014f0fd]&lt;br&gt;
+[[MediaWiki_talk:6135d20c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This form is used by bureaucrats to turn ordinary users into administrators. 
 Type the name of the user in the box and press the button to make the user an administrator
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysoptext</title></template>
+<template lineStart="1"><title>int:6135d20c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysoptitle&amp;action=edit makesysoptitle]&lt;br&gt;
-[[MediaWiki_talk:Makesysoptitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:40537c23&amp;action=edit 9d7a92cc]&lt;br&gt;
+[[MediaWiki_talk:40537c23|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Make a user into a sysop
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysoptitle</title></template>
+<template lineStart="1"><title>int:40537c23</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Matchtotals&amp;action=edit matchtotals]&lt;br&gt;
-[[MediaWiki_talk:Matchtotals|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b00f5f1f&amp;action=edit f2f4e13e]&lt;br&gt;
+[[MediaWiki_talk:b00f5f1f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The query &amp;quot;$1&amp;quot; matched $2 page titles
 and the text of $3 pages.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Matchtotals</title></template>
+<template lineStart="1"><title>int:b00f5f1f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math&amp;action=edit math]&lt;br&gt;
-[[MediaWiki_talk:Math|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3edf0df4&amp;action=edit 7a488390]&lt;br&gt;
+[[MediaWiki_talk:3edf0df4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Rendering math
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math</title></template>
+<template lineStart="1"><title>int:3edf0df4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_bad_output&amp;action=edit math_bad_output]&lt;br&gt;
-[[MediaWiki_talk:Math_bad_output|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:78c6cb06&amp;action=edit d9b8688c]&lt;br&gt;
+[[MediaWiki_talk:78c6cb06|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Can&amp;#39;t write to or create math output directory
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_bad_output</title></template>
+<template lineStart="1"><title>int:78c6cb06</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_bad_tmpdir&amp;action=edit math_bad_tmpdir]&lt;br&gt;
-[[MediaWiki_talk:Math_bad_tmpdir|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f83fe947&amp;action=edit be21263f]&lt;br&gt;
+[[MediaWiki_talk:f83fe947|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Can&amp;#39;t write to or create math temp directory
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_bad_tmpdir</title></template>
+<template lineStart="1"><title>int:f83fe947</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_failure&amp;action=edit math_failure]&lt;br&gt;
-[[MediaWiki_talk:Math_failure|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f8cf40ba&amp;action=edit 53e1c013]&lt;br&gt;
+[[MediaWiki_talk:f8cf40ba|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Failed to parse
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_failure</title></template>
+<template lineStart="1"><title>int:f8cf40ba</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_image_error&amp;action=edit math_image_error]&lt;br&gt;
-[[MediaWiki_talk:Math_image_error|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7b3e958f&amp;action=edit 7082c48f]&lt;br&gt;
+[[MediaWiki_talk:7b3e958f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 PNG conversion failed; check for correct installation of latex, dvips, gs, and convert
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_image_error</title></template>
+<template lineStart="1"><title>int:7b3e958f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_lexing_error&amp;action=edit math_lexing_error]&lt;br&gt;
-[[MediaWiki_talk:Math_lexing_error|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d6a158de&amp;action=edit 41e6fe2b]&lt;br&gt;
+[[MediaWiki_talk:d6a158de|Talk]]
 &lt;/td&gt;&lt;td&gt;
 lexing error
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_lexing_error</title></template>
+<template lineStart="1"><title>int:d6a158de</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_notexvc&amp;action=edit math_notexvc]&lt;br&gt;
-[[MediaWiki_talk:Math_notexvc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8109168a&amp;action=edit 20ec4685]&lt;br&gt;
+[[MediaWiki_talk:8109168a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Missing texvc executable; please see math/README to configure.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_notexvc</title></template>
+<template lineStart="1"><title>int:8109168a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_sample&amp;action=edit math_sample]&lt;br&gt;
-[[MediaWiki_talk:Math_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:41b65279&amp;action=edit 3e8b5972]&lt;br&gt;
+[[MediaWiki_talk:41b65279|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Insert formula here
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_sample</title></template>
+<template lineStart="1"><title>int:41b65279</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_syntax_error&amp;action=edit math_syntax_error]&lt;br&gt;
-[[MediaWiki_talk:Math_syntax_error|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5cbab860&amp;action=edit d5667f6b]&lt;br&gt;
+[[MediaWiki_talk:5cbab860|Talk]]
 &lt;/td&gt;&lt;td&gt;
 syntax error
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_syntax_error</title></template>
+<template lineStart="1"><title>int:5cbab860</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_tip&amp;action=edit math_tip]&lt;br&gt;
-[[MediaWiki_talk:Math_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7e756feb&amp;action=edit 0baadf18]&lt;br&gt;
+[[MediaWiki_talk:7e756feb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Mathematical formula (LaTeX)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_tip</title></template>
+<template lineStart="1"><title>int:7e756feb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_unknown_error&amp;action=edit math_unknown_error]&lt;br&gt;
-[[MediaWiki_talk:Math_unknown_error|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fb4d261d&amp;action=edit 5e0c970a]&lt;br&gt;
+[[MediaWiki_talk:fb4d261d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 unknown error
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_unknown_error</title></template>
+<template lineStart="1"><title>int:fb4d261d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_unknown_function&amp;action=edit math_unknown_function]&lt;br&gt;
-[[MediaWiki_talk:Math_unknown_function|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:26558f91&amp;action=edit a0577d1d]&lt;br&gt;
+[[MediaWiki_talk:26558f91|Talk]]
 &lt;/td&gt;&lt;td&gt;
 unknown function 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_unknown_function</title></template>
+<template lineStart="1"><title>int:26558f91</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Media_sample&amp;action=edit media_sample]&lt;br&gt;
-[[MediaWiki_talk:Media_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:63e94059&amp;action=edit 704093ed]&lt;br&gt;
+[[MediaWiki_talk:63e94059|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Example.mp3
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Media_sample</title></template>
+<template lineStart="1"><title>int:63e94059</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Media_tip&amp;action=edit media_tip]&lt;br&gt;
-[[MediaWiki_talk:Media_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8e4baaa8&amp;action=edit 77fbb90b]&lt;br&gt;
+[[MediaWiki_talk:8e4baaa8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Media file link
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Media_tip</title></template>
+<template lineStart="1"><title>int:8e4baaa8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minlength&amp;action=edit minlength]&lt;br&gt;
-[[MediaWiki_talk:Minlength|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cca18055&amp;action=edit 61350cd2]&lt;br&gt;
+[[MediaWiki_talk:cca18055|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Image names must be at least three letters.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Minlength</title></template>
+<template lineStart="1"><title>int:cca18055</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minoredit&amp;action=edit minoredit]&lt;br&gt;
-[[MediaWiki_talk:Minoredit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7f8c4ff3&amp;action=edit 3dd77123]&lt;br&gt;
+[[MediaWiki_talk:7f8c4ff3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This is a minor edit
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Minoredit</title></template>
+<template lineStart="1"><title>int:7f8c4ff3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minoreditletter&amp;action=edit minoreditletter]&lt;br&gt;
-[[MediaWiki_talk:Minoreditletter|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ce5828a8&amp;action=edit 3c37ba2f]&lt;br&gt;
+[[MediaWiki_talk:ce5828a8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 M
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Minoreditletter</title></template>
+<template lineStart="1"><title>int:ce5828a8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelings&amp;action=edit mispeelings]&lt;br&gt;
-[[MediaWiki_talk:Mispeelings|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1e3a3f5e&amp;action=edit abf0b01a]&lt;br&gt;
+[[MediaWiki_talk:1e3a3f5e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Pages with misspellings
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mispeelings</title></template>
+<template lineStart="1"><title>int:1e3a3f5e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelingspage&amp;action=edit mispeelingspage]&lt;br&gt;
-[[MediaWiki_talk:Mispeelingspage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:18c50601&amp;action=edit 4841b1be]&lt;br&gt;
+[[MediaWiki_talk:18c50601|Talk]]
 &lt;/td&gt;&lt;td&gt;
 List of common misspellings
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mispeelingspage</title></template>
+<template lineStart="1"><title>int:18c50601</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelingstext&amp;action=edit mispeelingstext]&lt;br&gt;
-[[MediaWiki_talk:Mispeelingstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ff661e66&amp;action=edit 20eeb250]&lt;br&gt;
+[[MediaWiki_talk:ff661e66|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The following pages contain a common misspelling, which are listed on $1. The correct spelling might be given (like this).
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mispeelingstext</title></template>
+<template lineStart="1"><title>int:ff661e66</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missingarticle&amp;action=edit missingarticle]&lt;br&gt;
-[[MediaWiki_talk:Missingarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:77dd649d&amp;action=edit 28d8d2f3]&lt;br&gt;
+[[MediaWiki_talk:77dd649d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The database did not find the text of a page
 that it should have found, named &amp;quot;$1&amp;quot;.
@@ -2595,96 +2595,96 @@ page that has been deleted.
 &amp;lt;p&amp;gt;If this is not the case, you may have found a bug in the software.
 Please report this to an administrator, making note of the URL.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Missingarticle</title></template>
+<template lineStart="1"><title>int:77dd649d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missingimage&amp;action=edit missingimage]&lt;br&gt;
-[[MediaWiki_talk:Missingimage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:43bf0acd&amp;action=edit d6472ac8]&lt;br&gt;
+[[MediaWiki_talk:43bf0acd|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;b&amp;gt;Missing image&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;i&amp;gt;$1&amp;lt;/i&amp;gt;
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Missingimage</title></template>
+<template lineStart="1"><title>int:43bf0acd</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinks&amp;action=edit missinglanguagelinks]&lt;br&gt;
-[[MediaWiki_talk:Missinglanguagelinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:75c0518a&amp;action=edit f433e9c8]&lt;br&gt;
+[[MediaWiki_talk:75c0518a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Missing Language Links
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Missinglanguagelinks</title></template>
+<template lineStart="1"><title>int:75c0518a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinksbutton&amp;action=edit missinglanguagelinksbutton]&lt;br&gt;
-[[MediaWiki_talk:Missinglanguagelinksbutton|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5ef61b91&amp;action=edit a4a9fdcd]&lt;br&gt;
+[[MediaWiki_talk:5ef61b91|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Find missing language links for
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Missinglanguagelinksbutton</title></template>
+<template lineStart="1"><title>int:5ef61b91</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinkstext&amp;action=edit missinglanguagelinkstext]&lt;br&gt;
-[[MediaWiki_talk:Missinglanguagelinkstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f5affad8&amp;action=edit e46ff038]&lt;br&gt;
+[[MediaWiki_talk:f5affad8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 These pages do &amp;lt;i&amp;gt;not&amp;lt;/i&amp;gt; link to their counterpart in $1. Redirects and subpages are &amp;lt;i&amp;gt;not&amp;lt;/i&amp;gt; shown.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Missinglanguagelinkstext</title></template>
+<template lineStart="1"><title>int:f5affad8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Moredotdotdot&amp;action=edit moredotdotdot]&lt;br&gt;
-[[MediaWiki_talk:Moredotdotdot|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:22e2c957&amp;action=edit b43c02b9]&lt;br&gt;
+[[MediaWiki_talk:22e2c957|Talk]]
 &lt;/td&gt;&lt;td&gt;
 More...
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Moredotdotdot</title></template>
+<template lineStart="1"><title>int:22e2c957</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Move&amp;action=edit move]&lt;br&gt;
-[[MediaWiki_talk:Move|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:76cdb950&amp;action=edit 379d6ce9]&lt;br&gt;
+[[MediaWiki_talk:76cdb950|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Move
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Move</title></template>
+<template lineStart="1"><title>int:76cdb950</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movearticle&amp;action=edit movearticle]&lt;br&gt;
-[[MediaWiki_talk:Movearticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:31d22872&amp;action=edit d55a3c2a]&lt;br&gt;
+[[MediaWiki_talk:31d22872|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Move page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movearticle</title></template>
+<template lineStart="1"><title>int:31d22872</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movedto&amp;action=edit movedto]&lt;br&gt;
-[[MediaWiki_talk:Movedto|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fb280ed2&amp;action=edit 0bd0c880]&lt;br&gt;
+[[MediaWiki_talk:fb280ed2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 moved to
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movedto</title></template>
+<template lineStart="1"><title>int:fb280ed2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movenologin&amp;action=edit movenologin]&lt;br&gt;
-[[MediaWiki_talk:Movenologin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8ddc20a0&amp;action=edit 7c041d6e]&lt;br&gt;
+[[MediaWiki_talk:8ddc20a0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Not logged in
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movenologin</title></template>
+<template lineStart="1"><title>int:8ddc20a0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movenologintext&amp;action=edit movenologintext]&lt;br&gt;
-[[MediaWiki_talk:Movenologintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:75985d0e&amp;action=edit e479574b]&lt;br&gt;
+[[MediaWiki_talk:75985d0e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You must be a registered user and &amp;lt;a href=&amp;quot;/wiki/Special:Userlogin&amp;quot;&amp;gt;logged in&amp;lt;/a&amp;gt;
 to move a page.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movenologintext</title></template>
+<template lineStart="1"><title>int:75985d0e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepage&amp;action=edit movepage]&lt;br&gt;
-[[MediaWiki_talk:Movepage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:addffb42&amp;action=edit 0f05ab2b]&lt;br&gt;
+[[MediaWiki_talk:addffb42|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Move page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movepage</title></template>
+<template lineStart="1"><title>int:addffb42</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagebtn&amp;action=edit movepagebtn]&lt;br&gt;
-[[MediaWiki_talk:Movepagebtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6f9e8dfc&amp;action=edit 0311d79b]&lt;br&gt;
+[[MediaWiki_talk:6f9e8dfc|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Move page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movepagebtn</title></template>
+<template lineStart="1"><title>int:6f9e8dfc</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagetalktext&amp;action=edit movepagetalktext]&lt;br&gt;
-[[MediaWiki_talk:Movepagetalktext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:993d5ce8&amp;action=edit 53ab3d1c]&lt;br&gt;
+[[MediaWiki_talk:993d5ce8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The associated talk page, if any, will be automatically moved along with it &amp;#39;&amp;#39;&amp;#39;unless:&amp;#39;&amp;#39;&amp;#39;
 *You are moving the page across namespaces,
@@ -2693,10 +2693,10 @@ The associated talk page, if any, will be automatically moved along with it &amp
 
 In those cases, you will have to move or merge the page manually if desired.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movepagetalktext</title></template>
+<template lineStart="1"><title>int:993d5ce8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagetext&amp;action=edit movepagetext]&lt;br&gt;
-[[MediaWiki_talk:Movepagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ce6bc0ee&amp;action=edit a363312c]&lt;br&gt;
+[[MediaWiki_talk:ce6bc0ee|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Using the form below will rename a page, moving all
 of its history to the new name.
@@ -2717,798 +2717,798 @@ This can be a drastic and unexpected change for a popular page;
 please be sure you understand the consequences of this before
 proceeding.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movepagetext</title></template>
+<template lineStart="1"><title>int:ce6bc0ee</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movetalk&amp;action=edit movetalk]&lt;br&gt;
-[[MediaWiki_talk:Movetalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e0a05db0&amp;action=edit 7bd87d2d]&lt;br&gt;
+[[MediaWiki_talk:e0a05db0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Move &amp;quot;talk&amp;quot; page as well, if applicable.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movetalk</title></template>
+<template lineStart="1"><title>int:e0a05db0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movethispage&amp;action=edit movethispage]&lt;br&gt;
-[[MediaWiki_talk:Movethispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:689ff1e7&amp;action=edit 2119d3ee]&lt;br&gt;
+[[MediaWiki_talk:689ff1e7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Move this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movethispage</title></template>
+<template lineStart="1"><title>int:689ff1e7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mycontris&amp;action=edit mycontris]&lt;br&gt;
-[[MediaWiki_talk:Mycontris|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0dc37cdb&amp;action=edit 12b6caf0]&lt;br&gt;
+[[MediaWiki_talk:0dc37cdb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 My contributions
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mycontris</title></template>
+<template lineStart="1"><title>int:0dc37cdb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mypage&amp;action=edit mypage]&lt;br&gt;
-[[MediaWiki_talk:Mypage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:51a7215d&amp;action=edit 5d558678]&lt;br&gt;
+[[MediaWiki_talk:51a7215d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 My page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mypage</title></template>
+<template lineStart="1"><title>int:51a7215d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mytalk&amp;action=edit mytalk]&lt;br&gt;
-[[MediaWiki_talk:Mytalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fbe8f485&amp;action=edit 49886539]&lt;br&gt;
+[[MediaWiki_talk:fbe8f485|Talk]]
 &lt;/td&gt;&lt;td&gt;
 My talk
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mytalk</title></template>
+<template lineStart="1"><title>int:fbe8f485</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Navigation&amp;action=edit navigation]&lt;br&gt;
-[[MediaWiki_talk:Navigation|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cf03cf2e&amp;action=edit ad831792]&lt;br&gt;
+[[MediaWiki_talk:cf03cf2e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Navigation
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Navigation</title></template>
+<template lineStart="1"><title>int:cf03cf2e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nbytes&amp;action=edit nbytes]&lt;br&gt;
-[[MediaWiki_talk:Nbytes|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b5b13ae8&amp;action=edit e75caf8a]&lt;br&gt;
+[[MediaWiki_talk:b5b13ae8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 $1 bytes
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nbytes</title></template>
+<template lineStart="1"><title>int:b5b13ae8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nchanges&amp;action=edit nchanges]&lt;br&gt;
-[[MediaWiki_talk:Nchanges|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bee99a5f&amp;action=edit 3d7d513a]&lt;br&gt;
+[[MediaWiki_talk:bee99a5f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 $1 changes
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nchanges</title></template>
+<template lineStart="1"><title>int:bee99a5f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newarticle&amp;action=edit newarticle]&lt;br&gt;
-[[MediaWiki_talk:Newarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:654df301&amp;action=edit 06b1c460]&lt;br&gt;
+[[MediaWiki_talk:654df301|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (New)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newarticle</title></template>
+<template lineStart="1"><title>int:654df301</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newarticletext&amp;action=edit newarticletext]&lt;br&gt;
-[[MediaWiki_talk:Newarticletext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f1622d18&amp;action=edit b90d5eb0]&lt;br&gt;
+[[MediaWiki_talk:f1622d18|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You&amp;#39;ve followed a link to a page that doesn&amp;#39;t exist yet.
 To create the page, start typing in the box below 
 (see the &amp;#91;&amp;#91;Wiktionary:Help&amp;#124;help page]] for more info).
 If you are here by mistake, just click your browser&amp;#39;s &amp;#39;&amp;#39;&amp;#39;back&amp;#39;&amp;#39;&amp;#39; button.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newarticletext</title></template>
+<template lineStart="1"><title>int:f1622d18</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newmessages&amp;action=edit newmessages]&lt;br&gt;
-[[MediaWiki_talk:Newmessages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:780ce01b&amp;action=edit 0b08523d]&lt;br&gt;
+[[MediaWiki_talk:780ce01b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You have $1.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newmessages</title></template>
+<template lineStart="1"><title>int:780ce01b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newmessageslink&amp;action=edit newmessageslink]&lt;br&gt;
-[[MediaWiki_talk:Newmessageslink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e09d8ffe&amp;action=edit 1f028736]&lt;br&gt;
+[[MediaWiki_talk:e09d8ffe|Talk]]
 &lt;/td&gt;&lt;td&gt;
 new messages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newmessageslink</title></template>
+<template lineStart="1"><title>int:e09d8ffe</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpage&amp;action=edit newpage]&lt;br&gt;
-[[MediaWiki_talk:Newpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ce656abe&amp;action=edit d68c7e3c]&lt;br&gt;
+[[MediaWiki_talk:ce656abe|Talk]]
 &lt;/td&gt;&lt;td&gt;
 New page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newpage</title></template>
+<template lineStart="1"><title>int:ce656abe</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpageletter&amp;action=edit newpageletter]&lt;br&gt;
-[[MediaWiki_talk:Newpageletter|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b886426f&amp;action=edit d081a481]&lt;br&gt;
+[[MediaWiki_talk:b886426f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 N
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newpageletter</title></template>
+<template lineStart="1"><title>int:b886426f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpages&amp;action=edit newpages]&lt;br&gt;
-[[MediaWiki_talk:Newpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2adf1ae7&amp;action=edit eeadf049]&lt;br&gt;
+[[MediaWiki_talk:2adf1ae7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 New pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newpages</title></template>
+<template lineStart="1"><title>int:2adf1ae7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpassword&amp;action=edit newpassword]&lt;br&gt;
-[[MediaWiki_talk:Newpassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:393f8bca&amp;action=edit f2c57870]&lt;br&gt;
+[[MediaWiki_talk:393f8bca|Talk]]
 &lt;/td&gt;&lt;td&gt;
 New password
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newpassword</title></template>
+<template lineStart="1"><title>int:393f8bca</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newtitle&amp;action=edit newtitle]&lt;br&gt;
-[[MediaWiki_talk:Newtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fa56bbd9&amp;action=edit a104cc01]&lt;br&gt;
+[[MediaWiki_talk:fa56bbd9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 To new title
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newtitle</title></template>
+<template lineStart="1"><title>int:fa56bbd9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newusersonly&amp;action=edit newusersonly]&lt;br&gt;
-[[MediaWiki_talk:Newusersonly|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a57c83c&amp;action=edit 41af2ba5]&lt;br&gt;
+[[MediaWiki_talk:2a57c83c|Talk]]
 &lt;/td&gt;&lt;td&gt;
  (new users only)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newusersonly</title></template>
+<template lineStart="1"><title>int:2a57c83c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Next&amp;action=edit next]&lt;br&gt;
-[[MediaWiki_talk:Next|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bc981983&amp;action=edit edee9402]&lt;br&gt;
+[[MediaWiki_talk:bc981983|Talk]]
 &lt;/td&gt;&lt;td&gt;
 next
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Next</title></template>
+<template lineStart="1"><title>int:bc981983</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nextn&amp;action=edit nextn]&lt;br&gt;
-[[MediaWiki_talk:Nextn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5e067f51&amp;action=edit e0bd4ddb]&lt;br&gt;
+[[MediaWiki_talk:5e067f51|Talk]]
 &lt;/td&gt;&lt;td&gt;
 next $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nextn</title></template>
+<template lineStart="1"><title>int:5e067f51</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nlinks&amp;action=edit nlinks]&lt;br&gt;
-[[MediaWiki_talk:Nlinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:61c11c45&amp;action=edit 2b45e9af]&lt;br&gt;
+[[MediaWiki_talk:61c11c45|Talk]]
 &lt;/td&gt;&lt;td&gt;
 $1 links
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nlinks</title></template>
+<template lineStart="1"><title>int:61c11c45</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noaffirmation&amp;action=edit noaffirmation]&lt;br&gt;
-[[MediaWiki_talk:Noaffirmation|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e307257f&amp;action=edit f6f5e28d]&lt;br&gt;
+[[MediaWiki_talk:e307257f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You must affirm that your upload does not violate
 any copyrights.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noaffirmation</title></template>
+<template lineStart="1"><title>int:e307257f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noarticletext&amp;action=edit noarticletext]&lt;br&gt;
-[[MediaWiki_talk:Noarticletext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:335462de&amp;action=edit 2658d031]&lt;br&gt;
+[[MediaWiki_talk:335462de|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (There is currently no text in this page)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noarticletext</title></template>
+<template lineStart="1"><title>int:335462de</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noblockreason&amp;action=edit noblockreason]&lt;br&gt;
-[[MediaWiki_talk:Noblockreason|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:46716843&amp;action=edit 68326cbc]&lt;br&gt;
+[[MediaWiki_talk:46716843|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You must supply a reason for the block.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noblockreason</title></template>
+<template lineStart="1"><title>int:46716843</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noconnect&amp;action=edit noconnect]&lt;br&gt;
-[[MediaWiki_talk:Noconnect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8fa787f6&amp;action=edit 5d122d51]&lt;br&gt;
+[[MediaWiki_talk:8fa787f6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Sorry! The wiki is experiencing some technical difficulties, and cannot contact the database server.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noconnect</title></template>
+<template lineStart="1"><title>int:8fa787f6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocontribs&amp;action=edit nocontribs]&lt;br&gt;
-[[MediaWiki_talk:Nocontribs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f60d1a6d&amp;action=edit b88f305b]&lt;br&gt;
+[[MediaWiki_talk:f60d1a6d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 No changes were found matching these criteria.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nocontribs</title></template>
+<template lineStart="1"><title>int:f60d1a6d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocookieslogin&amp;action=edit nocookieslogin]&lt;br&gt;
-[[MediaWiki_talk:Nocookieslogin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9d931b8c&amp;action=edit de736886]&lt;br&gt;
+[[MediaWiki_talk:9d931b8c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary uses cookies to log in users. You have cookies disabled. Please enable them and try again.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nocookieslogin</title></template>
+<template lineStart="1"><title>int:9d931b8c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocookiesnew&amp;action=edit nocookiesnew]&lt;br&gt;
-[[MediaWiki_talk:Nocookiesnew|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e4a19fc8&amp;action=edit 71c8d192]&lt;br&gt;
+[[MediaWiki_talk:e4a19fc8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The user account was created, but you are not logged in. Wiktionary uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nocookiesnew</title></template>
+<template lineStart="1"><title>int:e4a19fc8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocreativecommons&amp;action=edit nocreativecommons]&lt;br&gt;
-[[MediaWiki_talk:Nocreativecommons|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6fbb6d3a&amp;action=edit cc61a719]&lt;br&gt;
+[[MediaWiki_talk:6fbb6d3a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Creative Commons RDF metadata disabled for this server.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nocreativecommons</title></template>
+<template lineStart="1"><title>int:6fbb6d3a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nodb&amp;action=edit nodb]&lt;br&gt;
-[[MediaWiki_talk:Nodb|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e0dd32fc&amp;action=edit 5ed4cf16]&lt;br&gt;
+[[MediaWiki_talk:e0dd32fc|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Could not select database $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nodb</title></template>
+<template lineStart="1"><title>int:e0dd32fc</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nodublincore&amp;action=edit nodublincore]&lt;br&gt;
-[[MediaWiki_talk:Nodublincore|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:067ee3e9&amp;action=edit 3a58322b]&lt;br&gt;
+[[MediaWiki_talk:067ee3e9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Dublin Core RDF metadata disabled for this server.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nodublincore</title></template>
+<template lineStart="1"><title>int:067ee3e9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemail&amp;action=edit noemail]&lt;br&gt;
-[[MediaWiki_talk:Noemail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:325a917f&amp;action=edit 4c8d93d2]&lt;br&gt;
+[[MediaWiki_talk:325a917f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 There is no e-mail address recorded for user &amp;quot;$1&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noemail</title></template>
+<template lineStart="1"><title>int:325a917f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemailtext&amp;action=edit noemailtext]&lt;br&gt;
-[[MediaWiki_talk:Noemailtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:deb172c1&amp;action=edit f8bace82]&lt;br&gt;
+[[MediaWiki_talk:deb172c1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This user has not specified a valid e-mail address,
 or has chosen not to receive e-mail from other users.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noemailtext</title></template>
+<template lineStart="1"><title>int:deb172c1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemailtitle&amp;action=edit noemailtitle]&lt;br&gt;
-[[MediaWiki_talk:Noemailtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6bd33d89&amp;action=edit a158d61f]&lt;br&gt;
+[[MediaWiki_talk:6bd33d89|Talk]]
 &lt;/td&gt;&lt;td&gt;
 No e-mail address
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noemailtitle</title></template>
+<template lineStart="1"><title>int:6bd33d89</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nogomatch&amp;action=edit nogomatch]&lt;br&gt;
-[[MediaWiki_talk:Nogomatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e68327b0&amp;action=edit 36552107]&lt;br&gt;
+[[MediaWiki_talk:e68327b0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 No page with this exact title exists, trying full text search.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nogomatch</title></template>
+<template lineStart="1"><title>int:e68327b0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nohistory&amp;action=edit nohistory]&lt;br&gt;
-[[MediaWiki_talk:Nohistory|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:90c1625a&amp;action=edit 8d231ce4]&lt;br&gt;
+[[MediaWiki_talk:90c1625a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 There is no edit history for this page.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nohistory</title></template>
+<template lineStart="1"><title>int:90c1625a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nolinkshere&amp;action=edit nolinkshere]&lt;br&gt;
-[[MediaWiki_talk:Nolinkshere|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:13e13fa2&amp;action=edit e63b6d19]&lt;br&gt;
+[[MediaWiki_talk:13e13fa2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 No pages link to here.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nolinkshere</title></template>
+<template lineStart="1"><title>int:13e13fa2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nolinkstoimage&amp;action=edit nolinkstoimage]&lt;br&gt;
-[[MediaWiki_talk:Nolinkstoimage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5c3c99a8&amp;action=edit 1e827a30]&lt;br&gt;
+[[MediaWiki_talk:5c3c99a8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 There are no pages that link to this image.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nolinkstoimage</title></template>
+<template lineStart="1"><title>int:5c3c99a8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noname&amp;action=edit noname]&lt;br&gt;
-[[MediaWiki_talk:Noname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d9ff75a4&amp;action=edit e21bfc14]&lt;br&gt;
+[[MediaWiki_talk:d9ff75a4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You have not specified a valid user name.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noname</title></template>
+<template lineStart="1"><title>int:d9ff75a4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nonefound&amp;action=edit nonefound]&lt;br&gt;
-[[MediaWiki_talk:Nonefound|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f7d27b0c&amp;action=edit 5db654d1]&lt;br&gt;
+[[MediaWiki_talk:f7d27b0c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;strong&amp;gt;Note&amp;lt;/strong&amp;gt;: unsuccessful searches are
 often caused by searching for common words like &amp;quot;have&amp;quot; and &amp;quot;from&amp;quot;,
 which are not indexed, or by specifying more than one search term (only pages
 containing all of the search terms will appear in the result).
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nonefound</title></template>
+<template lineStart="1"><title>int:f7d27b0c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nospecialpagetext&amp;action=edit nospecialpagetext]&lt;br&gt;
-[[MediaWiki_talk:Nospecialpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d5f565dd&amp;action=edit aaaac807]&lt;br&gt;
+[[MediaWiki_talk:d5f565dd|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You have requested a special page that is not
 recognized by the wiki.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nospecialpagetext</title></template>
+<template lineStart="1"><title>int:d5f565dd</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchaction&amp;action=edit nosuchaction]&lt;br&gt;
-[[MediaWiki_talk:Nosuchaction|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:247c2db2&amp;action=edit 273b8154]&lt;br&gt;
+[[MediaWiki_talk:247c2db2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 No such action
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nosuchaction</title></template>
+<template lineStart="1"><title>int:247c2db2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchactiontext&amp;action=edit nosuchactiontext]&lt;br&gt;
-[[MediaWiki_talk:Nosuchactiontext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0e2f696c&amp;action=edit e8773306]&lt;br&gt;
+[[MediaWiki_talk:0e2f696c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The action specified by the URL is not
 recognized by the wiki
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nosuchactiontext</title></template>
+<template lineStart="1"><title>int:0e2f696c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchspecialpage&amp;action=edit nosuchspecialpage]&lt;br&gt;
-[[MediaWiki_talk:Nosuchspecialpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bd0d7ac6&amp;action=edit b98c7c10]&lt;br&gt;
+[[MediaWiki_talk:bd0d7ac6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 No such special page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nosuchspecialpage</title></template>
+<template lineStart="1"><title>int:bd0d7ac6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchuser&amp;action=edit nosuchuser]&lt;br&gt;
-[[MediaWiki_talk:Nosuchuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:22012b0a&amp;action=edit f542883d]&lt;br&gt;
+[[MediaWiki_talk:22012b0a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 There is no user by the name &amp;quot;$1&amp;quot;.
 Check your spelling, or use the form below to create a new user account.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nosuchuser</title></template>
+<template lineStart="1"><title>int:22012b0a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notacceptable&amp;action=edit notacceptable]&lt;br&gt;
-[[MediaWiki_talk:Notacceptable|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:982342c7&amp;action=edit f4909824]&lt;br&gt;
+[[MediaWiki_talk:982342c7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The wiki server can&amp;#39;t provide data in a format your client can read.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notacceptable</title></template>
+<template lineStart="1"><title>int:982342c7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notanarticle&amp;action=edit notanarticle]&lt;br&gt;
-[[MediaWiki_talk:Notanarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:272cfb97&amp;action=edit cdb5d3a9]&lt;br&gt;
+[[MediaWiki_talk:272cfb97|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Not a content page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notanarticle</title></template>
+<template lineStart="1"><title>int:272cfb97</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notargettext&amp;action=edit notargettext]&lt;br&gt;
-[[MediaWiki_talk:Notargettext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8ccaecd6&amp;action=edit 42534913]&lt;br&gt;
+[[MediaWiki_talk:8ccaecd6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You have not specified a target page or user
 to perform this function on.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notargettext</title></template>
+<template lineStart="1"><title>int:8ccaecd6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notargettitle&amp;action=edit notargettitle]&lt;br&gt;
-[[MediaWiki_talk:Notargettitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4532ec15&amp;action=edit dff62a20]&lt;br&gt;
+[[MediaWiki_talk:4532ec15|Talk]]
 &lt;/td&gt;&lt;td&gt;
 No target
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notargettitle</title></template>
+<template lineStart="1"><title>int:4532ec15</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Note&amp;action=edit note]&lt;br&gt;
-[[MediaWiki_talk:Note|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2c924e30&amp;action=edit c51048b7]&lt;br&gt;
+[[MediaWiki_talk:2c924e30|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Note</title></template>
+<template lineStart="1"><title>int:2c924e30</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notextmatches&amp;action=edit notextmatches]&lt;br&gt;
-[[MediaWiki_talk:Notextmatches|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:51c2043b&amp;action=edit 879701e9]&lt;br&gt;
+[[MediaWiki_talk:51c2043b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 No page text matches
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notextmatches</title></template>
+<template lineStart="1"><title>int:51c2043b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notitlematches&amp;action=edit notitlematches]&lt;br&gt;
-[[MediaWiki_talk:Notitlematches|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6f3befe0&amp;action=edit 5a56ca1b]&lt;br&gt;
+[[MediaWiki_talk:6f3befe0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 No page title matches
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notitlematches</title></template>
+<template lineStart="1"><title>int:6f3befe0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notloggedin&amp;action=edit notloggedin]&lt;br&gt;
-[[MediaWiki_talk:Notloggedin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:219a05e4&amp;action=edit 02bcadd3]&lt;br&gt;
+[[MediaWiki_talk:219a05e4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Not logged in
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notloggedin</title></template>
+<template lineStart="1"><title>int:219a05e4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowatchlist&amp;action=edit nowatchlist]&lt;br&gt;
-[[MediaWiki_talk:Nowatchlist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:28b54fd2&amp;action=edit ba736b7f]&lt;br&gt;
+[[MediaWiki_talk:28b54fd2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You have no items on your watchlist.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nowatchlist</title></template>
+<template lineStart="1"><title>int:28b54fd2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowiki_sample&amp;action=edit nowiki_sample]&lt;br&gt;
-[[MediaWiki_talk:Nowiki_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a78319d8&amp;action=edit 2398990d]&lt;br&gt;
+[[MediaWiki_talk:a78319d8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Insert non-formatted text here
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nowiki_sample</title></template>
+<template lineStart="1"><title>int:a78319d8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowiki_tip&amp;action=edit nowiki_tip]&lt;br&gt;
-[[MediaWiki_talk:Nowiki_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:20d39be1&amp;action=edit cf8602ad]&lt;br&gt;
+[[MediaWiki_talk:20d39be1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Ignore wiki formatting
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nowiki_tip</title></template>
+<template lineStart="1"><title>int:20d39be1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-category&amp;action=edit nstab-category]&lt;br&gt;
-[[MediaWiki_talk:Nstab-category|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dee84866&amp;action=edit 7a6336e0]&lt;br&gt;
+[[MediaWiki_talk:dee84866|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Category
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-category</title></template>
+<template lineStart="1"><title>int:dee84866</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-help&amp;action=edit nstab-help]&lt;br&gt;
-[[MediaWiki_talk:Nstab-help|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a3e0d95e&amp;action=edit 16b32116]&lt;br&gt;
+[[MediaWiki_talk:a3e0d95e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Help
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-help</title></template>
+<template lineStart="1"><title>int:a3e0d95e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-image&amp;action=edit nstab-image]&lt;br&gt;
-[[MediaWiki_talk:Nstab-image|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:911dff1f&amp;action=edit 081e450a]&lt;br&gt;
+[[MediaWiki_talk:911dff1f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Image
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-image</title></template>
+<template lineStart="1"><title>int:911dff1f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-main&amp;action=edit nstab-main]&lt;br&gt;
-[[MediaWiki_talk:Nstab-main|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:931f9736&amp;action=edit 5b9c503a]&lt;br&gt;
+[[MediaWiki_talk:931f9736|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Article
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-main</title></template>
+<template lineStart="1"><title>int:931f9736</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-media&amp;action=edit nstab-media]&lt;br&gt;
-[[MediaWiki_talk:Nstab-media|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6da2f6ae&amp;action=edit 86e5f16d]&lt;br&gt;
+[[MediaWiki_talk:6da2f6ae|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Media
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-media</title></template>
+<template lineStart="1"><title>int:6da2f6ae</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-mediawiki&amp;action=edit nstab-mediawiki]&lt;br&gt;
-[[MediaWiki_talk:Nstab-mediawiki|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:53504d48&amp;action=edit 368d5d22]&lt;br&gt;
+[[MediaWiki_talk:53504d48|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Message
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-mediawiki</title></template>
+<template lineStart="1"><title>int:53504d48</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-special&amp;action=edit nstab-special]&lt;br&gt;
-[[MediaWiki_talk:Nstab-special|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:14d4daef&amp;action=edit 34a2cba3]&lt;br&gt;
+[[MediaWiki_talk:14d4daef|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Special
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-special</title></template>
+<template lineStart="1"><title>int:14d4daef</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-template&amp;action=edit nstab-template]&lt;br&gt;
-[[MediaWiki_talk:Nstab-template|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ed2e8b27&amp;action=edit a1024e18]&lt;br&gt;
+[[MediaWiki_talk:ed2e8b27|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Template
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-template</title></template>
+<template lineStart="1"><title>int:ed2e8b27</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-user&amp;action=edit nstab-user]&lt;br&gt;
-[[MediaWiki_talk:Nstab-user|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:31ebc74b&amp;action=edit 313f5ee2]&lt;br&gt;
+[[MediaWiki_talk:31ebc74b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 User page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-user</title></template>
+<template lineStart="1"><title>int:31ebc74b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-wp&amp;action=edit nstab-wp]&lt;br&gt;
-[[MediaWiki_talk:Nstab-wp|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a8d28daa&amp;action=edit 0611a13e]&lt;br&gt;
+[[MediaWiki_talk:a8d28daa|Talk]]
 &lt;/td&gt;&lt;td&gt;
 About
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-wp</title></template>
+<template lineStart="1"><title>int:a8d28daa</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ok&amp;action=edit ok]&lt;br&gt;
-[[MediaWiki_talk:Ok|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b0a98216&amp;action=edit 7a85f476]&lt;br&gt;
+[[MediaWiki_talk:b0a98216|Talk]]
 &lt;/td&gt;&lt;td&gt;
 OK
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ok</title></template>
+<template lineStart="1"><title>int:b0a98216</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Oldpassword&amp;action=edit oldpassword]&lt;br&gt;
-[[MediaWiki_talk:Oldpassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e081cf87&amp;action=edit 23ace733]&lt;br&gt;
+[[MediaWiki_talk:e081cf87|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Old password
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Oldpassword</title></template>
+<template lineStart="1"><title>int:e081cf87</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Orig&amp;action=edit orig]&lt;br&gt;
-[[MediaWiki_talk:Orig|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:db6998a7&amp;action=edit dc894908]&lt;br&gt;
+[[MediaWiki_talk:db6998a7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 orig
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Orig</title></template>
+<template lineStart="1"><title>int:db6998a7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Orphans&amp;action=edit orphans]&lt;br&gt;
-[[MediaWiki_talk:Orphans|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cb5dc4a4&amp;action=edit 89f56e51]&lt;br&gt;
+[[MediaWiki_talk:cb5dc4a4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Orphaned pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Orphans</title></template>
+<template lineStart="1"><title>int:cb5dc4a4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Othercontribs&amp;action=edit othercontribs]&lt;br&gt;
-[[MediaWiki_talk:Othercontribs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:51caf0b1&amp;action=edit e6287b24]&lt;br&gt;
+[[MediaWiki_talk:51caf0b1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Based on work by $1.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Othercontribs</title></template>
+<template lineStart="1"><title>int:51caf0b1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Otherlanguages&amp;action=edit otherlanguages]&lt;br&gt;
-[[MediaWiki_talk:Otherlanguages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:838fda53&amp;action=edit f953cc13]&lt;br&gt;
+[[MediaWiki_talk:838fda53|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Other languages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Otherlanguages</title></template>
+<template lineStart="1"><title>int:838fda53</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagemovedsub&amp;action=edit pagemovedsub]&lt;br&gt;
-[[MediaWiki_talk:Pagemovedsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8b80dc12&amp;action=edit 06b2b863]&lt;br&gt;
+[[MediaWiki_talk:8b80dc12|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Move succeeded
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Pagemovedsub</title></template>
+<template lineStart="1"><title>int:8b80dc12</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagemovedtext&amp;action=edit pagemovedtext]&lt;br&gt;
-[[MediaWiki_talk:Pagemovedtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:67c1c9b9&amp;action=edit 6df06888]&lt;br&gt;
+[[MediaWiki_talk:67c1c9b9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Page &amp;quot;&amp;#91;&amp;#91;$1]]&amp;quot; moved to &amp;quot;&amp;#91;&amp;#91;$2]]&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Pagemovedtext</title></template>
+<template lineStart="1"><title>int:67c1c9b9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagetitle&amp;action=edit pagetitle]&lt;br&gt;
-[[MediaWiki_talk:Pagetitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0488d9f9&amp;action=edit ca0a1736]&lt;br&gt;
+[[MediaWiki_talk:0488d9f9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 $1 - Wiktionary
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Pagetitle</title></template>
+<template lineStart="1"><title>int:0488d9f9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordremindertext&amp;action=edit passwordremindertext]&lt;br&gt;
-[[MediaWiki_talk:Passwordremindertext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:724220c3&amp;action=edit 00c46482]&lt;br&gt;
+[[MediaWiki_talk:724220c3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Someone (probably you, from IP address $1)
 requested that we send you a new Wiktionary login password.
 The password for user &amp;quot;$2&amp;quot; is now &amp;quot;$3&amp;quot;.
 You should log in and change your password now.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Passwordremindertext</title></template>
+<template lineStart="1"><title>int:724220c3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordremindertitle&amp;action=edit passwordremindertitle]&lt;br&gt;
-[[MediaWiki_talk:Passwordremindertitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:67675177&amp;action=edit 9943fd1d]&lt;br&gt;
+[[MediaWiki_talk:67675177|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Password reminder from Wiktionary
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Passwordremindertitle</title></template>
+<template lineStart="1"><title>int:67675177</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordsent&amp;action=edit passwordsent]&lt;br&gt;
-[[MediaWiki_talk:Passwordsent|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:feea022e&amp;action=edit 52c6d21a]&lt;br&gt;
+[[MediaWiki_talk:feea022e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 A new password has been sent to the e-mail address
 registered for &amp;quot;$1&amp;quot;.
 Please log in again after you receive it.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Passwordsent</title></template>
+<template lineStart="1"><title>int:feea022e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfcached&amp;action=edit perfcached]&lt;br&gt;
-[[MediaWiki_talk:Perfcached|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d89b33a4&amp;action=edit 6148b748]&lt;br&gt;
+[[MediaWiki_talk:d89b33a4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The following data is cached and may not be completely up to date:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Perfcached</title></template>
+<template lineStart="1"><title>int:d89b33a4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfdisabled&amp;action=edit perfdisabled]&lt;br&gt;
-[[MediaWiki_talk:Perfdisabled|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7c3d6ba1&amp;action=edit edb94b6f]&lt;br&gt;
+[[MediaWiki_talk:7c3d6ba1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Sorry! This feature has been temporarily disabled
 because it slows the database down to the point that no one can use
 the wiki.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Perfdisabled</title></template>
+<template lineStart="1"><title>int:7c3d6ba1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfdisabledsub&amp;action=edit perfdisabledsub]&lt;br&gt;
-[[MediaWiki_talk:Perfdisabledsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ba8fb63e&amp;action=edit 7971fbbc]&lt;br&gt;
+[[MediaWiki_talk:ba8fb63e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Here&amp;#39;s a saved copy from $1:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Perfdisabledsub</title></template>
+<template lineStart="1"><title>int:ba8fb63e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Personaltools&amp;action=edit personaltools]&lt;br&gt;
-[[MediaWiki_talk:Personaltools|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1f9d5196&amp;action=edit faae8244]&lt;br&gt;
+[[MediaWiki_talk:1f9d5196|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Personal tools
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Personaltools</title></template>
+<template lineStart="1"><title>int:1f9d5196</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Portal&amp;action=edit portal]&lt;br&gt;
-[[MediaWiki_talk:Portal|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b55223c7&amp;action=edit 23f3fd77]&lt;br&gt;
+[[MediaWiki_talk:b55223c7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Community portal
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Portal</title></template>
+<template lineStart="1"><title>int:b55223c7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Portal-url&amp;action=edit portal-url]&lt;br&gt;
-[[MediaWiki_talk:Portal-url|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b6100630&amp;action=edit d69501d7]&lt;br&gt;
+[[MediaWiki_talk:b6100630|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary:Community Portal
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Portal-url</title></template>
+<template lineStart="1"><title>int:b6100630</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Postcomment&amp;action=edit postcomment]&lt;br&gt;
-[[MediaWiki_talk:Postcomment|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:83c6e160&amp;action=edit 7ce546d1]&lt;br&gt;
+[[MediaWiki_talk:83c6e160|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Post a comment
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Postcomment</title></template>
+<template lineStart="1"><title>int:83c6e160</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Poweredby&amp;action=edit poweredby]&lt;br&gt;
-[[MediaWiki_talk:Poweredby|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f715eef0&amp;action=edit 03d7f055]&lt;br&gt;
+[[MediaWiki_talk:f715eef0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary is powered by &amp;#91;http&amp;#58;//www.mediawiki.org/ MediaWiki], an open source wiki engine.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Poweredby</title></template>
+<template lineStart="1"><title>int:f715eef0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Powersearch&amp;action=edit powersearch]&lt;br&gt;
-[[MediaWiki_talk:Powersearch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5f86f380&amp;action=edit fe586261]&lt;br&gt;
+[[MediaWiki_talk:5f86f380|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Search
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Powersearch</title></template>
+<template lineStart="1"><title>int:5f86f380</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Powersearchtext&amp;action=edit powersearchtext]&lt;br&gt;
-[[MediaWiki_talk:Powersearchtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:02360031&amp;action=edit 7c50040c]&lt;br&gt;
+[[MediaWiki_talk:02360031|Talk]]
 &lt;/td&gt;&lt;td&gt;
 
 Search in namespaces :&amp;lt;br /&amp;gt;
 $1&amp;lt;br /&amp;gt;
 $2 List redirects &amp;amp;nbsp; Search for $3 $9
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Powersearchtext</title></template>
+<template lineStart="1"><title>int:02360031</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Preferences&amp;action=edit preferences]&lt;br&gt;
-[[MediaWiki_talk:Preferences|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9dfd349e&amp;action=edit dcedb31d]&lt;br&gt;
+[[MediaWiki_talk:9dfd349e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Preferences
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Preferences</title></template>
+<template lineStart="1"><title>int:9dfd349e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-help-userdata&amp;action=edit prefs-help-userdata]&lt;br&gt;
-[[MediaWiki_talk:Prefs-help-userdata|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6b97fde2&amp;action=edit 4d381b11]&lt;br&gt;
+[[MediaWiki_talk:6b97fde2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 * &amp;lt;strong&amp;gt;Real name&amp;lt;/strong&amp;gt; (optional): if you choose to provide it this will be used for giving you attribution for your work.&amp;lt;br/&amp;gt;
 * &amp;lt;strong&amp;gt;Email&amp;lt;/strong&amp;gt; (optional): Enables people to contact you through the website without you having to reveal your 
 email address to them, and it can be used to send you a new password if you forget it.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefs-help-userdata</title></template>
+<template lineStart="1"><title>int:6b97fde2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-misc&amp;action=edit prefs-misc]&lt;br&gt;
-[[MediaWiki_talk:Prefs-misc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:30cafb20&amp;action=edit 4413aea7]&lt;br&gt;
+[[MediaWiki_talk:30cafb20|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Misc settings
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefs-misc</title></template>
+<template lineStart="1"><title>int:30cafb20</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-personal&amp;action=edit prefs-personal]&lt;br&gt;
-[[MediaWiki_talk:Prefs-personal|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:58796ee5&amp;action=edit 79de347d]&lt;br&gt;
+[[MediaWiki_talk:58796ee5|Talk]]
 &lt;/td&gt;&lt;td&gt;
 User data
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefs-personal</title></template>
+<template lineStart="1"><title>int:58796ee5</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-rc&amp;action=edit prefs-rc]&lt;br&gt;
-[[MediaWiki_talk:Prefs-rc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e055ac90&amp;action=edit b8a6f738]&lt;br&gt;
+[[MediaWiki_talk:e055ac90|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Recent changes and stub display
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefs-rc</title></template>
+<template lineStart="1"><title>int:e055ac90</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefslogintext&amp;action=edit prefslogintext]&lt;br&gt;
-[[MediaWiki_talk:Prefslogintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0603b5a9&amp;action=edit 3b8a7d0e]&lt;br&gt;
+[[MediaWiki_talk:0603b5a9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You are logged in as &amp;quot;$1&amp;quot;.
 Your internal ID number is $2.
 
 See &amp;#91;&amp;#91;Wiktionary:User preferences help]] for help deciphering the options.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefslogintext</title></template>
+<template lineStart="1"><title>int:0603b5a9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsnologin&amp;action=edit prefsnologin]&lt;br&gt;
-[[MediaWiki_talk:Prefsnologin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2366fb91&amp;action=edit f2475be5]&lt;br&gt;
+[[MediaWiki_talk:2366fb91|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Not logged in
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefsnologin</title></template>
+<template lineStart="1"><title>int:2366fb91</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsnologintext&amp;action=edit prefsnologintext]&lt;br&gt;
-[[MediaWiki_talk:Prefsnologintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0389a76a&amp;action=edit 69cb02c9]&lt;br&gt;
+[[MediaWiki_talk:0389a76a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You must be &amp;lt;a href=&amp;quot;/wiki/Special:Userlogin&amp;quot;&amp;gt;logged in&amp;lt;/a&amp;gt;
 to set user preferences.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefsnologintext</title></template>
+<template lineStart="1"><title>int:0389a76a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsreset&amp;action=edit prefsreset]&lt;br&gt;
-[[MediaWiki_talk:Prefsreset|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e6216751&amp;action=edit 2b688ff4]&lt;br&gt;
+[[MediaWiki_talk:e6216751|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Preferences have been reset from storage.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefsreset</title></template>
+<template lineStart="1"><title>int:e6216751</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Preview&amp;action=edit preview]&lt;br&gt;
-[[MediaWiki_talk:Preview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f1fbb2b4&amp;action=edit 1aa787fe]&lt;br&gt;
+[[MediaWiki_talk:f1fbb2b4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Preview
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Preview</title></template>
+<template lineStart="1"><title>int:f1fbb2b4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Previewconflict&amp;action=edit previewconflict]&lt;br&gt;
-[[MediaWiki_talk:Previewconflict|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7357cd58&amp;action=edit 353820b9]&lt;br&gt;
+[[MediaWiki_talk:7357cd58|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This preview reflects the text in the upper
 text editing area as it will appear if you choose to save.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Previewconflict</title></template>
+<template lineStart="1"><title>int:7357cd58</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Previewnote&amp;action=edit previewnote]&lt;br&gt;
-[[MediaWiki_talk:Previewnote|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f0bd6ebe&amp;action=edit 2281018c]&lt;br&gt;
+[[MediaWiki_talk:f0bd6ebe|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Remember that this is only a preview, and has not yet been saved!
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Previewnote</title></template>
+<template lineStart="1"><title>int:f0bd6ebe</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prevn&amp;action=edit prevn]&lt;br&gt;
-[[MediaWiki_talk:Prevn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c7db0778&amp;action=edit 8b3bb669]&lt;br&gt;
+[[MediaWiki_talk:c7db0778|Talk]]
 &lt;/td&gt;&lt;td&gt;
 previous $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prevn</title></template>
+<template lineStart="1"><title>int:c7db0778</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Printableversion&amp;action=edit printableversion]&lt;br&gt;
-[[MediaWiki_talk:Printableversion|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0a67b813&amp;action=edit e1a919ba]&lt;br&gt;
+[[MediaWiki_talk:0a67b813|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Printable version
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Printableversion</title></template>
+<template lineStart="1"><title>int:0a67b813</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Printsubtitle&amp;action=edit printsubtitle]&lt;br&gt;
-[[MediaWiki_talk:Printsubtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dc3b6f21&amp;action=edit d4d3cccd]&lt;br&gt;
+[[MediaWiki_talk:dc3b6f21|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (From http&amp;#58;//tl.wiktionary.org)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Printsubtitle</title></template>
+<template lineStart="1"><title>int:dc3b6f21</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protect&amp;action=edit protect]&lt;br&gt;
-[[MediaWiki_talk:Protect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:016ac2dc&amp;action=edit 145969f1]&lt;br&gt;
+[[MediaWiki_talk:016ac2dc|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Protect
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protect</title></template>
+<template lineStart="1"><title>int:016ac2dc</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectcomment&amp;action=edit protectcomment]&lt;br&gt;
-[[MediaWiki_talk:Protectcomment|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:073135b4&amp;action=edit bf7f9e49]&lt;br&gt;
+[[MediaWiki_talk:073135b4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Reason for protecting
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectcomment</title></template>
+<template lineStart="1"><title>int:073135b4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedarticle&amp;action=edit protectedarticle]&lt;br&gt;
-[[MediaWiki_talk:Protectedarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3ee691ce&amp;action=edit 1f880b64]&lt;br&gt;
+[[MediaWiki_talk:3ee691ce|Talk]]
 &lt;/td&gt;&lt;td&gt;
 protected &amp;#91;&amp;#91;$1]]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectedarticle</title></template>
+<template lineStart="1"><title>int:3ee691ce</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedpage&amp;action=edit protectedpage]&lt;br&gt;
-[[MediaWiki_talk:Protectedpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a44b308c&amp;action=edit 7afa7fea]&lt;br&gt;
+[[MediaWiki_talk:a44b308c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Protected page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectedpage</title></template>
+<template lineStart="1"><title>int:a44b308c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedpagewarning&amp;action=edit protectedpagewarning]&lt;br&gt;
-[[MediaWiki_talk:Protectedpagewarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0017a4f5&amp;action=edit 962032da]&lt;br&gt;
+[[MediaWiki_talk:0017a4f5|Talk]]
 &lt;/td&gt;&lt;td&gt;
 WARNING:  This page has been locked so that only
 users with sysop privileges can edit it. Be sure you are following the
 &amp;lt;a href=&amp;#39;/w/wiki.phtml/Wiktionary:Protected_page_guidelines&amp;#39;&amp;gt;protected page
 guidelines&amp;lt;/a&amp;gt;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectedpagewarning</title></template>
+<template lineStart="1"><title>int:0017a4f5</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedtext&amp;action=edit protectedtext]&lt;br&gt;
-[[MediaWiki_talk:Protectedtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cf2a914e&amp;action=edit 561f00bf]&lt;br&gt;
+[[MediaWiki_talk:cf2a914e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This page has been locked to prevent editing; there are
 a number of reasons why this may be so, please see
@@ -3516,222 +3516,222 @@ a number of reasons why this may be so, please see
 
 You can view and copy the source of this page:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectedtext</title></template>
+<template lineStart="1"><title>int:cf2a914e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectlogpage&amp;action=edit protectlogpage]&lt;br&gt;
-[[MediaWiki_talk:Protectlogpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bb915483&amp;action=edit 85888484]&lt;br&gt;
+[[MediaWiki_talk:bb915483|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Protection_log
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectlogpage</title></template>
+<template lineStart="1"><title>int:bb915483</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectlogtext&amp;action=edit protectlogtext]&lt;br&gt;
-[[MediaWiki_talk:Protectlogtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:061ec7fa&amp;action=edit 197cfa0d]&lt;br&gt;
+[[MediaWiki_talk:061ec7fa|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Below is a list of page locks/unlocks.
 See &amp;#91;&amp;#91;Wiktionary:Protected page]] for more information.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectlogtext</title></template>
+<template lineStart="1"><title>int:061ec7fa</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectpage&amp;action=edit protectpage]&lt;br&gt;
-[[MediaWiki_talk:Protectpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d2ae1354&amp;action=edit 33c2c02c]&lt;br&gt;
+[[MediaWiki_talk:d2ae1354|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Protect page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectpage</title></template>
+<template lineStart="1"><title>int:d2ae1354</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectreason&amp;action=edit protectreason]&lt;br&gt;
-[[MediaWiki_talk:Protectreason|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c0e9bbaf&amp;action=edit 5cbc043a]&lt;br&gt;
+[[MediaWiki_talk:c0e9bbaf|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (give a reason)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectreason</title></template>
+<template lineStart="1"><title>int:c0e9bbaf</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectsub&amp;action=edit protectsub]&lt;br&gt;
-[[MediaWiki_talk:Protectsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:23176a41&amp;action=edit 24a81acc]&lt;br&gt;
+[[MediaWiki_talk:23176a41|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (Protecting &amp;quot;$1&amp;quot;)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectsub</title></template>
+<template lineStart="1"><title>int:23176a41</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectthispage&amp;action=edit protectthispage]&lt;br&gt;
-[[MediaWiki_talk:Protectthispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:884b47b3&amp;action=edit 77ca39fa]&lt;br&gt;
+[[MediaWiki_talk:884b47b3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Protect this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectthispage</title></template>
+<template lineStart="1"><title>int:884b47b3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblocker&amp;action=edit proxyblocker]&lt;br&gt;
-[[MediaWiki_talk:Proxyblocker|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0ebe1928&amp;action=edit 11599708]&lt;br&gt;
+[[MediaWiki_talk:0ebe1928|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Proxy blocker
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Proxyblocker</title></template>
+<template lineStart="1"><title>int:0ebe1928</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblockreason&amp;action=edit proxyblockreason]&lt;br&gt;
-[[MediaWiki_talk:Proxyblockreason|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0ccb1a72&amp;action=edit f4482395]&lt;br&gt;
+[[MediaWiki_talk:0ccb1a72|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your IP address has been blocked because it is an open proxy. Please contact your Internet service provider or tech support and inform them of this serious security problem.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Proxyblockreason</title></template>
+<template lineStart="1"><title>int:0ccb1a72</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblocksuccess&amp;action=edit proxyblocksuccess]&lt;br&gt;
-[[MediaWiki_talk:Proxyblocksuccess|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:88af6e64&amp;action=edit 01b6671f]&lt;br&gt;
+[[MediaWiki_talk:88af6e64|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Done.
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Proxyblocksuccess</title></template>
+<template lineStart="1"><title>int:88af6e64</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbbrowse&amp;action=edit qbbrowse]&lt;br&gt;
-[[MediaWiki_talk:Qbbrowse|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b1594c4a&amp;action=edit 596b17aa]&lt;br&gt;
+[[MediaWiki_talk:b1594c4a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Browse
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbbrowse</title></template>
+<template lineStart="1"><title>int:b1594c4a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbedit&amp;action=edit qbedit]&lt;br&gt;
-[[MediaWiki_talk:Qbedit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:25b61f80&amp;action=edit 9e11e13b]&lt;br&gt;
+[[MediaWiki_talk:25b61f80|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Edit
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbedit</title></template>
+<template lineStart="1"><title>int:25b61f80</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbfind&amp;action=edit qbfind]&lt;br&gt;
-[[MediaWiki_talk:Qbfind|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e1a9ed9d&amp;action=edit cc717307]&lt;br&gt;
+[[MediaWiki_talk:e1a9ed9d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Find
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbfind</title></template>
+<template lineStart="1"><title>int:e1a9ed9d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbmyoptions&amp;action=edit qbmyoptions]&lt;br&gt;
-[[MediaWiki_talk:Qbmyoptions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:24074cfc&amp;action=edit a40d0b3f]&lt;br&gt;
+[[MediaWiki_talk:24074cfc|Talk]]
 &lt;/td&gt;&lt;td&gt;
 My pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbmyoptions</title></template>
+<template lineStart="1"><title>int:24074cfc</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbpageinfo&amp;action=edit qbpageinfo]&lt;br&gt;
-[[MediaWiki_talk:Qbpageinfo|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:af83fbba&amp;action=edit 8f794a0f]&lt;br&gt;
+[[MediaWiki_talk:af83fbba|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Context
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbpageinfo</title></template>
+<template lineStart="1"><title>int:af83fbba</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbpageoptions&amp;action=edit qbpageoptions]&lt;br&gt;
-[[MediaWiki_talk:Qbpageoptions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c8fff0e7&amp;action=edit 20fec244]&lt;br&gt;
+[[MediaWiki_talk:c8fff0e7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbpageoptions</title></template>
+<template lineStart="1"><title>int:c8fff0e7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbsettings&amp;action=edit qbsettings]&lt;br&gt;
-[[MediaWiki_talk:Qbsettings|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5a6ec2af&amp;action=edit 2dfd6121]&lt;br&gt;
+[[MediaWiki_talk:5a6ec2af|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Quickbar settings
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbsettings</title></template>
+<template lineStart="1"><title>int:5a6ec2af</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbspecialpages&amp;action=edit qbspecialpages]&lt;br&gt;
-[[MediaWiki_talk:Qbspecialpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8eda832f&amp;action=edit e97e9088]&lt;br&gt;
+[[MediaWiki_talk:8eda832f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Special pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbspecialpages</title></template>
+<template lineStart="1"><title>int:8eda832f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Querybtn&amp;action=edit querybtn]&lt;br&gt;
-[[MediaWiki_talk:Querybtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ce1c6b9a&amp;action=edit dc17545e]&lt;br&gt;
+[[MediaWiki_talk:ce1c6b9a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Submit query
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Querybtn</title></template>
+<template lineStart="1"><title>int:ce1c6b9a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Querysuccessful&amp;action=edit querysuccessful]&lt;br&gt;
-[[MediaWiki_talk:Querysuccessful|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:342970ff&amp;action=edit 7f2e7314]&lt;br&gt;
+[[MediaWiki_talk:342970ff|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Query successful
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Querysuccessful</title></template>
+<template lineStart="1"><title>int:342970ff</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Randompage&amp;action=edit randompage]&lt;br&gt;
-[[MediaWiki_talk:Randompage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c2300ac1&amp;action=edit 08f4cb5c]&lt;br&gt;
+[[MediaWiki_talk:c2300ac1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Random page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Randompage</title></template>
+<template lineStart="1"><title>int:c2300ac1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Range_block_disabled&amp;action=edit range_block_disabled]&lt;br&gt;
-[[MediaWiki_talk:Range_block_disabled|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9f84f8de&amp;action=edit 0da9559a]&lt;br&gt;
+[[MediaWiki_talk:9f84f8de|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The sysop ability to create range blocks is disabled.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Range_block_disabled</title></template>
+<template lineStart="1"><title>int:9f84f8de</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rchide&amp;action=edit rchide]&lt;br&gt;
-[[MediaWiki_talk:Rchide|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f65142b8&amp;action=edit 65c24302]&lt;br&gt;
+[[MediaWiki_talk:f65142b8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 in $4 form; $1 minor edits; $2 secondary namespaces; $3 multiple edits.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rchide</title></template>
+<template lineStart="1"><title>int:f65142b8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclinks&amp;action=edit rclinks]&lt;br&gt;
-[[MediaWiki_talk:Rclinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:78b9278a&amp;action=edit 96bcbd6a]&lt;br&gt;
+[[MediaWiki_talk:78b9278a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Show last $1 changes in last $2 days&amp;lt;br /&amp;gt;$3
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rclinks</title></template>
+<template lineStart="1"><title>int:78b9278a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclistfrom&amp;action=edit rclistfrom]&lt;br&gt;
-[[MediaWiki_talk:Rclistfrom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ead9cd8b&amp;action=edit 69cdd5ad]&lt;br&gt;
+[[MediaWiki_talk:ead9cd8b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Show new changes starting from $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rclistfrom</title></template>
+<template lineStart="1"><title>int:ead9cd8b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcliu&amp;action=edit rcliu]&lt;br&gt;
-[[MediaWiki_talk:Rcliu|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bad8b81d&amp;action=edit f13491ba]&lt;br&gt;
+[[MediaWiki_talk:bad8b81d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 ; $1 edits from logged in users
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rcliu</title></template>
+<template lineStart="1"><title>int:bad8b81d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcloaderr&amp;action=edit rcloaderr]&lt;br&gt;
-[[MediaWiki_talk:Rcloaderr|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:58a7c0de&amp;action=edit ced7752e]&lt;br&gt;
+[[MediaWiki_talk:58a7c0de|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Loading recent changes
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rcloaderr</title></template>
+<template lineStart="1"><title>int:58a7c0de</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclsub&amp;action=edit rclsub]&lt;br&gt;
-[[MediaWiki_talk:Rclsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c3fd1aca&amp;action=edit d259fbf6]&lt;br&gt;
+[[MediaWiki_talk:c3fd1aca|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (to pages linked from &amp;quot;$1&amp;quot;)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rclsub</title></template>
+<template lineStart="1"><title>int:c3fd1aca</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcnote&amp;action=edit rcnote]&lt;br&gt;
-[[MediaWiki_talk:Rcnote|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2c0a654c&amp;action=edit 15ea8401]&lt;br&gt;
+[[MediaWiki_talk:2c0a654c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Below are the last &amp;lt;strong&amp;gt;$1&amp;lt;/strong&amp;gt; changes in last &amp;lt;strong&amp;gt;$2&amp;lt;/strong&amp;gt; days.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rcnote</title></template>
+<template lineStart="1"><title>int:2c0a654c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcnotefrom&amp;action=edit rcnotefrom]&lt;br&gt;
-[[MediaWiki_talk:Rcnotefrom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0a00aaba&amp;action=edit c516366b]&lt;br&gt;
+[[MediaWiki_talk:0a00aaba|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Below are the changes since &amp;lt;b&amp;gt;$2&amp;lt;/b&amp;gt; (up to &amp;lt;b&amp;gt;$1&amp;lt;/b&amp;gt; shown).
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rcnotefrom</title></template>
+<template lineStart="1"><title>int:0a00aaba</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonly&amp;action=edit readonly]&lt;br&gt;
-[[MediaWiki_talk:Readonly|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1d920fff&amp;action=edit 9a277182]&lt;br&gt;
+[[MediaWiki_talk:1d920fff|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Database locked
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Readonly</title></template>
+<template lineStart="1"><title>int:1d920fff</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonlytext&amp;action=edit readonlytext]&lt;br&gt;
-[[MediaWiki_talk:Readonlytext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:64743780&amp;action=edit e5990e81]&lt;br&gt;
+[[MediaWiki_talk:64743780|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The database is currently locked to new
 entries and other modifications, probably for routine database maintenance,
@@ -3739,476 +3739,476 @@ after which it will be back to normal.
 The administrator who locked it offered this explanation:
 &amp;lt;p&amp;gt;$1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Readonlytext</title></template>
+<template lineStart="1"><title>int:64743780</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonlywarning&amp;action=edit readonlywarning]&lt;br&gt;
-[[MediaWiki_talk:Readonlywarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8c9d6af6&amp;action=edit 74bcbeed]&lt;br&gt;
+[[MediaWiki_talk:8c9d6af6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 WARNING: The database has been locked for maintenance,
 so you will not be able to save your edits right now. You may wish to cut-n-paste
 the text into a text file and save it for later.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Readonlywarning</title></template>
+<template lineStart="1"><title>int:8c9d6af6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchanges&amp;action=edit recentchanges]&lt;br&gt;
-[[MediaWiki_talk:Recentchanges|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4d75dd33&amp;action=edit 51734654]&lt;br&gt;
+[[MediaWiki_talk:4d75dd33|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Recent changes
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Recentchanges</title></template>
+<template lineStart="1"><title>int:4d75dd33</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangescount&amp;action=edit recentchangescount]&lt;br&gt;
-[[MediaWiki_talk:Recentchangescount|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:40f1d259&amp;action=edit 44d93957]&lt;br&gt;
+[[MediaWiki_talk:40f1d259|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Number of titles in recent changes
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Recentchangescount</title></template>
+<template lineStart="1"><title>int:40f1d259</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangeslinked&amp;action=edit recentchangeslinked]&lt;br&gt;
-[[MediaWiki_talk:Recentchangeslinked|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:312aafe1&amp;action=edit b5822b16]&lt;br&gt;
+[[MediaWiki_talk:312aafe1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Related changes
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Recentchangeslinked</title></template>
+<template lineStart="1"><title>int:312aafe1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangestext&amp;action=edit recentchangestext]&lt;br&gt;
-[[MediaWiki_talk:Recentchangestext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2f453993&amp;action=edit 049f8c5f]&lt;br&gt;
+[[MediaWiki_talk:2f453993|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Track the most recent changes to the wiki on this page.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Recentchangestext</title></template>
+<template lineStart="1"><title>int:2f453993</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Redirectedfrom&amp;action=edit redirectedfrom]&lt;br&gt;
-[[MediaWiki_talk:Redirectedfrom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7124fa4a&amp;action=edit 43d741c1]&lt;br&gt;
+[[MediaWiki_talk:7124fa4a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (Redirected from $1)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Redirectedfrom</title></template>
+<template lineStart="1"><title>int:7124fa4a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Remembermypassword&amp;action=edit remembermypassword]&lt;br&gt;
-[[MediaWiki_talk:Remembermypassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:54d89323&amp;action=edit 4eef1c9f]&lt;br&gt;
+[[MediaWiki_talk:54d89323|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Remember my password across sessions.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Remembermypassword</title></template>
+<template lineStart="1"><title>int:54d89323</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removechecked&amp;action=edit removechecked]&lt;br&gt;
-[[MediaWiki_talk:Removechecked|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:537f5507&amp;action=edit bfa5dc98]&lt;br&gt;
+[[MediaWiki_talk:537f5507|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Remove checked items from watchlist
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Removechecked</title></template>
+<template lineStart="1"><title>int:537f5507</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removedwatch&amp;action=edit removedwatch]&lt;br&gt;
-[[MediaWiki_talk:Removedwatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:78e82769&amp;action=edit eeadf87c]&lt;br&gt;
+[[MediaWiki_talk:78e82769|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Removed from watchlist
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Removedwatch</title></template>
+<template lineStart="1"><title>int:78e82769</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removedwatchtext&amp;action=edit removedwatchtext]&lt;br&gt;
-[[MediaWiki_talk:Removedwatchtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ad711aa8&amp;action=edit d9807612]&lt;br&gt;
+[[MediaWiki_talk:ad711aa8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The page &amp;quot;$1&amp;quot; has been removed from your watchlist.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Removedwatchtext</title></template>
+<template lineStart="1"><title>int:ad711aa8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removingchecked&amp;action=edit removingchecked]&lt;br&gt;
-[[MediaWiki_talk:Removingchecked|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:48b0bcb6&amp;action=edit 7d083ee5]&lt;br&gt;
+[[MediaWiki_talk:48b0bcb6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Removing requested items from watchlist...
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Removingchecked</title></template>
+<template lineStart="1"><title>int:48b0bcb6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Resetprefs&amp;action=edit resetprefs]&lt;br&gt;
-[[MediaWiki_talk:Resetprefs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2f022894&amp;action=edit 4b81718e]&lt;br&gt;
+[[MediaWiki_talk:2f022894|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Reset preferences
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Resetprefs</title></template>
+<template lineStart="1"><title>int:2f022894</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Restorelink&amp;action=edit restorelink]&lt;br&gt;
-[[MediaWiki_talk:Restorelink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bc47acaf&amp;action=edit 8f8f7d13]&lt;br&gt;
+[[MediaWiki_talk:bc47acaf|Talk]]
 &lt;/td&gt;&lt;td&gt;
 $1 deleted edits
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Restorelink</title></template>
+<template lineStart="1"><title>int:bc47acaf</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Resultsperpage&amp;action=edit resultsperpage]&lt;br&gt;
-[[MediaWiki_talk:Resultsperpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6add8c15&amp;action=edit 8f0c68f0]&lt;br&gt;
+[[MediaWiki_talk:6add8c15|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Hits to show per page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Resultsperpage</title></template>
+<template lineStart="1"><title>int:6add8c15</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Retrievedfrom&amp;action=edit retrievedfrom]&lt;br&gt;
-[[MediaWiki_talk:Retrievedfrom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6f54af5b&amp;action=edit a5e2f101]&lt;br&gt;
+[[MediaWiki_talk:6f54af5b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Retrieved from &amp;quot;$1&amp;quot;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Retrievedfrom</title></template>
+<template lineStart="1"><title>int:6f54af5b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Returnto&amp;action=edit returnto]&lt;br&gt;
-[[MediaWiki_talk:Returnto|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3dcff1b0&amp;action=edit 58f19667]&lt;br&gt;
+[[MediaWiki_talk:3dcff1b0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Return to $1.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Returnto</title></template>
+<template lineStart="1"><title>int:3dcff1b0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Retypenew&amp;action=edit retypenew]&lt;br&gt;
-[[MediaWiki_talk:Retypenew|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b9ac79c6&amp;action=edit 2b9171b6]&lt;br&gt;
+[[MediaWiki_talk:b9ac79c6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Retype new password
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Retypenew</title></template>
+<template lineStart="1"><title>int:b9ac79c6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reupload&amp;action=edit reupload]&lt;br&gt;
-[[MediaWiki_talk:Reupload|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b7ae8f64&amp;action=edit a3eee606]&lt;br&gt;
+[[MediaWiki_talk:b7ae8f64|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Re-upload
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Reupload</title></template>
+<template lineStart="1"><title>int:b7ae8f64</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reuploaddesc&amp;action=edit reuploaddesc]&lt;br&gt;
-[[MediaWiki_talk:Reuploaddesc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cd783da0&amp;action=edit d7ba5bcb]&lt;br&gt;
+[[MediaWiki_talk:cd783da0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Return to the upload form.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Reuploaddesc</title></template>
+<template lineStart="1"><title>int:cd783da0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reverted&amp;action=edit reverted]&lt;br&gt;
-[[MediaWiki_talk:Reverted|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c73c43f3&amp;action=edit f322de9a]&lt;br&gt;
+[[MediaWiki_talk:c73c43f3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Reverted to earlier revision
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Reverted</title></template>
+<template lineStart="1"><title>int:c73c43f3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revertimg&amp;action=edit revertimg]&lt;br&gt;
-[[MediaWiki_talk:Revertimg|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:18591a4b&amp;action=edit 0d86ed82]&lt;br&gt;
+[[MediaWiki_talk:18591a4b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 rev
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revertimg</title></template>
+<template lineStart="1"><title>int:18591a4b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revertpage&amp;action=edit revertpage]&lt;br&gt;
-[[MediaWiki_talk:Revertpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b24ef4f1&amp;action=edit 8ce494ea]&lt;br&gt;
+[[MediaWiki_talk:b24ef4f1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Reverted edit of $2, changed back to last version by $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revertpage</title></template>
+<template lineStart="1"><title>int:b24ef4f1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revhistory&amp;action=edit revhistory]&lt;br&gt;
-[[MediaWiki_talk:Revhistory|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:96e64350&amp;action=edit 949a77c7]&lt;br&gt;
+[[MediaWiki_talk:96e64350|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Revision history
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revhistory</title></template>
+<template lineStart="1"><title>int:96e64350</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revisionasof&amp;action=edit revisionasof]&lt;br&gt;
-[[MediaWiki_talk:Revisionasof|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0c299dc7&amp;action=edit 3338672b]&lt;br&gt;
+[[MediaWiki_talk:0c299dc7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Revision as of $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revisionasof</title></template>
+<template lineStart="1"><title>int:0c299dc7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revnotfound&amp;action=edit revnotfound]&lt;br&gt;
-[[MediaWiki_talk:Revnotfound|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:159f321a&amp;action=edit d567812b]&lt;br&gt;
+[[MediaWiki_talk:159f321a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Revision not found
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revnotfound</title></template>
+<template lineStart="1"><title>int:159f321a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revnotfoundtext&amp;action=edit revnotfoundtext]&lt;br&gt;
-[[MediaWiki_talk:Revnotfoundtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:955fec48&amp;action=edit 4060f114]&lt;br&gt;
+[[MediaWiki_talk:955fec48|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The old revision of the page you asked for could not be found.
 Please check the URL you used to access this page.
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revnotfoundtext</title></template>
+<template lineStart="1"><title>int:955fec48</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rfcurl&amp;action=edit rfcurl]&lt;br&gt;
-[[MediaWiki_talk:Rfcurl|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b2f04988&amp;action=edit e8b606c2]&lt;br&gt;
+[[MediaWiki_talk:b2f04988|Talk]]
 &lt;/td&gt;&lt;td&gt;
 http&amp;#58;//www.faqs.org/rfcs/rfc$1.html
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rfcurl</title></template>
+<template lineStart="1"><title>int:b2f04988</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rights&amp;action=edit rights]&lt;br&gt;
-[[MediaWiki_talk:Rights|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:db94ff6b&amp;action=edit 1407cb23]&lt;br&gt;
+[[MediaWiki_talk:db94ff6b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Rights:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rights</title></template>
+<template lineStart="1"><title>int:db94ff6b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollback&amp;action=edit rollback]&lt;br&gt;
-[[MediaWiki_talk:Rollback|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f28daee2&amp;action=edit ff3a6f3b]&lt;br&gt;
+[[MediaWiki_talk:f28daee2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Roll back edits
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rollback</title></template>
+<template lineStart="1"><title>int:f28daee2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollback_short&amp;action=edit rollback_short]&lt;br&gt;
-[[MediaWiki_talk:Rollback_short|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2aaec24c&amp;action=edit 5f0fa7e7]&lt;br&gt;
+[[MediaWiki_talk:2aaec24c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Rollback
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rollback_short</title></template>
+<template lineStart="1"><title>int:2aaec24c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollbackfailed&amp;action=edit rollbackfailed]&lt;br&gt;
-[[MediaWiki_talk:Rollbackfailed|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:54d37a4c&amp;action=edit 73c685e6]&lt;br&gt;
+[[MediaWiki_talk:54d37a4c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Rollback failed
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rollbackfailed</title></template>
+<template lineStart="1"><title>int:54d37a4c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollbacklink&amp;action=edit rollbacklink]&lt;br&gt;
-[[MediaWiki_talk:Rollbacklink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b82a8f42&amp;action=edit 1a9fae49]&lt;br&gt;
+[[MediaWiki_talk:b82a8f42|Talk]]
 &lt;/td&gt;&lt;td&gt;
 rollback
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rollbacklink</title></template>
+<template lineStart="1"><title>int:b82a8f42</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rows&amp;action=edit rows]&lt;br&gt;
-[[MediaWiki_talk:Rows|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:52d0b352&amp;action=edit 6c30d261]&lt;br&gt;
+[[MediaWiki_talk:52d0b352|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Rows
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rows</title></template>
+<template lineStart="1"><title>int:52d0b352</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savearticle&amp;action=edit savearticle]&lt;br&gt;
-[[MediaWiki_talk:Savearticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5a43014e&amp;action=edit 1308cde0]&lt;br&gt;
+[[MediaWiki_talk:5a43014e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Save page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Savearticle</title></template>
+<template lineStart="1"><title>int:5a43014e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savedprefs&amp;action=edit savedprefs]&lt;br&gt;
-[[MediaWiki_talk:Savedprefs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0e53fdc8&amp;action=edit 5f6543d0]&lt;br&gt;
+[[MediaWiki_talk:0e53fdc8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your preferences have been saved.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Savedprefs</title></template>
+<template lineStart="1"><title>int:0e53fdc8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savefile&amp;action=edit savefile]&lt;br&gt;
-[[MediaWiki_talk:Savefile|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e1415b15&amp;action=edit d6d40a58]&lt;br&gt;
+[[MediaWiki_talk:e1415b15|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Save file
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Savefile</title></template>
+<template lineStart="1"><title>int:e1415b15</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Saveprefs&amp;action=edit saveprefs]&lt;br&gt;
-[[MediaWiki_talk:Saveprefs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ad98e68e&amp;action=edit 34ac956e]&lt;br&gt;
+[[MediaWiki_talk:ad98e68e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Save preferences
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Saveprefs</title></template>
+<template lineStart="1"><title>int:ad98e68e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Search&amp;action=edit search]&lt;br&gt;
-[[MediaWiki_talk:Search|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bce06414&amp;action=edit 3559d7ac]&lt;br&gt;
+[[MediaWiki_talk:bce06414|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Search
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Search</title></template>
+<template lineStart="1"><title>int:bce06414</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchdisabled&amp;action=edit searchdisabled]&lt;br&gt;
-[[MediaWiki_talk:Searchdisabled|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8f6495a7&amp;action=edit cfa0722d]&lt;br&gt;
+[[MediaWiki_talk:8f6495a7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;p&amp;gt;Sorry! Full text search has been disabled temporarily, for performance reasons. In the meantime, you can use the Google search below, which may be out of date.&amp;lt;/p&amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchdisabled</title></template>
+<template lineStart="1"><title>int:8f6495a7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchhelppage&amp;action=edit searchhelppage]&lt;br&gt;
-[[MediaWiki_talk:Searchhelppage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:72344e87&amp;action=edit 3eea6ce4]&lt;br&gt;
+[[MediaWiki_talk:72344e87|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary:Searching
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchhelppage</title></template>
+<template lineStart="1"><title>int:72344e87</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchingwikipedia&amp;action=edit searchingwikipedia]&lt;br&gt;
-[[MediaWiki_talk:Searchingwikipedia|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cb9c1653&amp;action=edit da48347f]&lt;br&gt;
+[[MediaWiki_talk:cb9c1653|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Searching Wiktionary
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchingwikipedia</title></template>
+<template lineStart="1"><title>int:cb9c1653</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchquery&amp;action=edit searchquery]&lt;br&gt;
-[[MediaWiki_talk:Searchquery|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3d79ca88&amp;action=edit 64bdca9a]&lt;br&gt;
+[[MediaWiki_talk:3d79ca88|Talk]]
 &lt;/td&gt;&lt;td&gt;
 For query &amp;quot;$1&amp;quot;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchquery</title></template>
+<template lineStart="1"><title>int:3d79ca88</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresults&amp;action=edit searchresults]&lt;br&gt;
-[[MediaWiki_talk:Searchresults|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b2f7c0e1&amp;action=edit 8ef6d4d3]&lt;br&gt;
+[[MediaWiki_talk:b2f7c0e1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Search results
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchresults</title></template>
+<template lineStart="1"><title>int:b2f7c0e1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresultshead&amp;action=edit searchresultshead]&lt;br&gt;
-[[MediaWiki_talk:Searchresultshead|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e5ed9018&amp;action=edit 83d578cd]&lt;br&gt;
+[[MediaWiki_talk:e5ed9018|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Search result settings
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchresultshead</title></template>
+<template lineStart="1"><title>int:e5ed9018</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresulttext&amp;action=edit searchresulttext]&lt;br&gt;
-[[MediaWiki_talk:Searchresulttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8cab5350&amp;action=edit 781b9fee]&lt;br&gt;
+[[MediaWiki_talk:8cab5350|Talk]]
 &lt;/td&gt;&lt;td&gt;
 For more information about searching Wiktionary, see $1.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchresulttext</title></template>
+<template lineStart="1"><title>int:8cab5350</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sectionedit&amp;action=edit sectionedit]&lt;br&gt;
-[[MediaWiki_talk:Sectionedit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:37b6df63&amp;action=edit a26b768d]&lt;br&gt;
+[[MediaWiki_talk:37b6df63|Talk]]
 &lt;/td&gt;&lt;td&gt;
  (section)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sectionedit</title></template>
+<template lineStart="1"><title>int:37b6df63</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectnewerversionfordiff&amp;action=edit selectnewerversionfordiff]&lt;br&gt;
-[[MediaWiki_talk:Selectnewerversionfordiff|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:be4aaa62&amp;action=edit 2ddce298]&lt;br&gt;
+[[MediaWiki_talk:be4aaa62|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Select a newer version for comparison
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Selectnewerversionfordiff</title></template>
+<template lineStart="1"><title>int:be4aaa62</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectolderversionfordiff&amp;action=edit selectolderversionfordiff]&lt;br&gt;
-[[MediaWiki_talk:Selectolderversionfordiff|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5124db4d&amp;action=edit 80ffa0cb]&lt;br&gt;
+[[MediaWiki_talk:5124db4d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Select an older version for comparison
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Selectolderversionfordiff</title></template>
+<template lineStart="1"><title>int:5124db4d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectonly&amp;action=edit selectonly]&lt;br&gt;
-[[MediaWiki_talk:Selectonly|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a3c0a747&amp;action=edit 5ec1b504]&lt;br&gt;
+[[MediaWiki_talk:a3c0a747|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Only read-only queries are allowed.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Selectonly</title></template>
+<template lineStart="1"><title>int:a3c0a747</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selflinks&amp;action=edit selflinks]&lt;br&gt;
-[[MediaWiki_talk:Selflinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e93eec9e&amp;action=edit 06cf46b3]&lt;br&gt;
+[[MediaWiki_talk:e93eec9e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Pages with Self Links
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Selflinks</title></template>
+<template lineStart="1"><title>int:e93eec9e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selflinkstext&amp;action=edit selflinkstext]&lt;br&gt;
-[[MediaWiki_talk:Selflinkstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f993dd01&amp;action=edit e7caf074]&lt;br&gt;
+[[MediaWiki_talk:f993dd01|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The following pages contain a link to themselves, which they should not.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Selflinkstext</title></template>
+<template lineStart="1"><title>int:f993dd01</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Seriousxhtmlerrors&amp;action=edit seriousxhtmlerrors]&lt;br&gt;
-[[MediaWiki_talk:Seriousxhtmlerrors|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fa56e16c&amp;action=edit 249c203d]&lt;br&gt;
+[[MediaWiki_talk:fa56e16c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 There were serious xhtml markup errors detected by tidy.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Seriousxhtmlerrors</title></template>
+<template lineStart="1"><title>int:fa56e16c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Servertime&amp;action=edit servertime]&lt;br&gt;
-[[MediaWiki_talk:Servertime|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5123f28d&amp;action=edit 8fcf47da]&lt;br&gt;
+[[MediaWiki_talk:5123f28d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Server time is now
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Servertime</title></template>
+<template lineStart="1"><title>int:5123f28d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Set_rights_fail&amp;action=edit set_rights_fail]&lt;br&gt;
-[[MediaWiki_talk:Set_rights_fail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4075f71a&amp;action=edit 79d35179]&lt;br&gt;
+[[MediaWiki_talk:4075f71a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;b&amp;gt;User rights for &amp;quot;$1&amp;quot; could not be set. (Did you enter the name correctly?)&amp;lt;/b&amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Set_rights_fail</title></template>
+<template lineStart="1"><title>int:4075f71a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Set_user_rights&amp;action=edit set_user_rights]&lt;br&gt;
-[[MediaWiki_talk:Set_user_rights|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:13187ffc&amp;action=edit f2cd2a2a]&lt;br&gt;
+[[MediaWiki_talk:13187ffc|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Set user rights
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Set_user_rights</title></template>
+<template lineStart="1"><title>int:13187ffc</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Setbureaucratflag&amp;action=edit setbureaucratflag]&lt;br&gt;
-[[MediaWiki_talk:Setbureaucratflag|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:56640761&amp;action=edit c5bfd68a]&lt;br&gt;
+[[MediaWiki_talk:56640761|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Set bureaucrat flag
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Setbureaucratflag</title></template>
+<template lineStart="1"><title>int:56640761</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Shortpages&amp;action=edit shortpages]&lt;br&gt;
-[[MediaWiki_talk:Shortpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0d3f883b&amp;action=edit fff9c94a]&lt;br&gt;
+[[MediaWiki_talk:0d3f883b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Short pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Shortpages</title></template>
+<template lineStart="1"><title>int:0d3f883b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Show&amp;action=edit show]&lt;br&gt;
-[[MediaWiki_talk:Show|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d97d1ee3&amp;action=edit 9fb29051]&lt;br&gt;
+[[MediaWiki_talk:d97d1ee3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 show
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Show</title></template>
+<template lineStart="1"><title>int:d97d1ee3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showhideminor&amp;action=edit showhideminor]&lt;br&gt;
-[[MediaWiki_talk:Showhideminor|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f1a75ecf&amp;action=edit 4fe654c7]&lt;br&gt;
+[[MediaWiki_talk:f1a75ecf|Talk]]
 &lt;/td&gt;&lt;td&gt;
 $1 minor edits &amp;#124; $2 bots &amp;#124; $3 logged in users 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showhideminor</title></template>
+<template lineStart="1"><title>int:f1a75ecf</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showingresults&amp;action=edit showingresults]&lt;br&gt;
-[[MediaWiki_talk:Showingresults|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:72fad336&amp;action=edit 9569cf23]&lt;br&gt;
+[[MediaWiki_talk:72fad336|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Showing below &amp;lt;b&amp;gt;$1&amp;lt;/b&amp;gt; results starting with #&amp;lt;b&amp;gt;$2&amp;lt;/b&amp;gt;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showingresults</title></template>
+<template lineStart="1"><title>int:72fad336</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showingresultsnum&amp;action=edit showingresultsnum]&lt;br&gt;
-[[MediaWiki_talk:Showingresultsnum|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6db37657&amp;action=edit f7535b52]&lt;br&gt;
+[[MediaWiki_talk:6db37657|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Showing below &amp;lt;b&amp;gt;$3&amp;lt;/b&amp;gt; results starting with #&amp;lt;b&amp;gt;$2&amp;lt;/b&amp;gt;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showingresultsnum</title></template>
+<template lineStart="1"><title>int:6db37657</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showlast&amp;action=edit showlast]&lt;br&gt;
-[[MediaWiki_talk:Showlast|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:acbdf814&amp;action=edit 43158759]&lt;br&gt;
+[[MediaWiki_talk:acbdf814|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Show last $1 images sorted $2.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showlast</title></template>
+<template lineStart="1"><title>int:acbdf814</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showpreview&amp;action=edit showpreview]&lt;br&gt;
-[[MediaWiki_talk:Showpreview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:915318a0&amp;action=edit ac2b4c32]&lt;br&gt;
+[[MediaWiki_talk:915318a0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Show preview
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showpreview</title></template>
+<template lineStart="1"><title>int:915318a0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showtoc&amp;action=edit showtoc]&lt;br&gt;
-[[MediaWiki_talk:Showtoc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cfff5a5a&amp;action=edit 6eeee3cb]&lt;br&gt;
+[[MediaWiki_talk:cfff5a5a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 show
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showtoc</title></template>
+<template lineStart="1"><title>int:cfff5a5a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sig_tip&amp;action=edit sig_tip]&lt;br&gt;
-[[MediaWiki_talk:Sig_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ac617b53&amp;action=edit 1144c9d9]&lt;br&gt;
+[[MediaWiki_talk:ac617b53|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your signature with timestamp
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sig_tip</title></template>
+<template lineStart="1"><title>int:ac617b53</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitestats&amp;action=edit sitestats]&lt;br&gt;
-[[MediaWiki_talk:Sitestats|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f6baa6ad&amp;action=edit 7f5726ac]&lt;br&gt;
+[[MediaWiki_talk:f6baa6ad|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Site statistics
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sitestats</title></template>
+<template lineStart="1"><title>int:f6baa6ad</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitestatstext&amp;action=edit sitestatstext]&lt;br&gt;
-[[MediaWiki_talk:Sitestatstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e150b0f4&amp;action=edit 8e86f95d]&lt;br&gt;
+[[MediaWiki_talk:e150b0f4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 There are &amp;#39;&amp;#39;&amp;#39;$1&amp;#39;&amp;#39;&amp;#39; total pages in the database.
 This includes &amp;quot;talk&amp;quot; pages, pages about Wiktionary, minimal &amp;quot;stub&amp;quot;
@@ -4220,931 +4220,931 @@ There have been a total of &amp;#39;&amp;#39;&amp;#39;$3&amp;#39;&amp;#39;&amp;#
 since the wiki was setup.
 That comes to &amp;#39;&amp;#39;&amp;#39;$5&amp;#39;&amp;#39;&amp;#39; average edits per page, and &amp;#39;&amp;#39;&amp;#39;$6&amp;#39;&amp;#39;&amp;#39; views per edit.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sitestatstext</title></template>
+<template lineStart="1"><title>int:e150b0f4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitesubtitle&amp;action=edit sitesubtitle]&lt;br&gt;
-[[MediaWiki_talk:Sitesubtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:daaf7240&amp;action=edit 8dca090f]&lt;br&gt;
+[[MediaWiki_talk:daaf7240|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The Free Encyclopedia
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sitesubtitle</title></template>
+<template lineStart="1"><title>int:daaf7240</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitesupport&amp;action=edit sitesupport]&lt;br&gt;
-[[MediaWiki_talk:Sitesupport|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3b434c6d&amp;action=edit 32b42c53]&lt;br&gt;
+[[MediaWiki_talk:3b434c6d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Donations
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sitesupport</title></template>
+<template lineStart="1"><title>int:3b434c6d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitetitle&amp;action=edit sitetitle]&lt;br&gt;
-[[MediaWiki_talk:Sitetitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d75649ef&amp;action=edit d88e8164]&lt;br&gt;
+[[MediaWiki_talk:d75649ef|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sitetitle</title></template>
+<template lineStart="1"><title>int:d75649ef</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Siteuser&amp;action=edit siteuser]&lt;br&gt;
-[[MediaWiki_talk:Siteuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cb06d8a3&amp;action=edit b64ec710]&lt;br&gt;
+[[MediaWiki_talk:cb06d8a3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary user $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Siteuser</title></template>
+<template lineStart="1"><title>int:cb06d8a3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Siteusers&amp;action=edit siteusers]&lt;br&gt;
-[[MediaWiki_talk:Siteusers|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d25d37c8&amp;action=edit 4f548531]&lt;br&gt;
+[[MediaWiki_talk:d25d37c8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary user(s) $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Siteusers</title></template>
+<template lineStart="1"><title>int:d25d37c8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Skin&amp;action=edit skin]&lt;br&gt;
-[[MediaWiki_talk:Skin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8f57bd61&amp;action=edit d0cb2acd]&lt;br&gt;
+[[MediaWiki_talk:8f57bd61|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Skin
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Skin</title></template>
+<template lineStart="1"><title>int:8f57bd61</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spamprotectiontext&amp;action=edit spamprotectiontext]&lt;br&gt;
-[[MediaWiki_talk:Spamprotectiontext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d3a6dd4e&amp;action=edit bcd196f9]&lt;br&gt;
+[[MediaWiki_talk:d3a6dd4e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The page you wanted to save was blocked by the spam filter. This is probably caused by a link to an external site. 
 
 You might want to check the following regular expression for patterns that are currently blocked:
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Spamprotectiontext</title></template>
+<template lineStart="1"><title>int:d3a6dd4e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spamprotectiontitle&amp;action=edit spamprotectiontitle]&lt;br&gt;
-[[MediaWiki_talk:Spamprotectiontitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:add33980&amp;action=edit 60a90929]&lt;br&gt;
+[[MediaWiki_talk:add33980|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Spam protection filter
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Spamprotectiontitle</title></template>
+<template lineStart="1"><title>int:add33980</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Specialpage&amp;action=edit specialpage]&lt;br&gt;
-[[MediaWiki_talk:Specialpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:984c6817&amp;action=edit 25255195]&lt;br&gt;
+[[MediaWiki_talk:984c6817|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Special Page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Specialpage</title></template>
+<template lineStart="1"><title>int:984c6817</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Specialpages&amp;action=edit specialpages]&lt;br&gt;
-[[MediaWiki_talk:Specialpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b67d51d8&amp;action=edit 62bc32dc]&lt;br&gt;
+[[MediaWiki_talk:b67d51d8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Special pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Specialpages</title></template>
+<template lineStart="1"><title>int:b67d51d8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spheading&amp;action=edit spheading]&lt;br&gt;
-[[MediaWiki_talk:Spheading|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c9709132&amp;action=edit 73ac2b41]&lt;br&gt;
+[[MediaWiki_talk:c9709132|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Special pages for all users
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Spheading</title></template>
+<template lineStart="1"><title>int:c9709132</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sqlislogged&amp;action=edit sqlislogged]&lt;br&gt;
-[[MediaWiki_talk:Sqlislogged|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:87ac14f6&amp;action=edit ed31e1e1]&lt;br&gt;
+[[MediaWiki_talk:87ac14f6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Please note that all queries are logged.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sqlislogged</title></template>
+<template lineStart="1"><title>int:87ac14f6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sqlquery&amp;action=edit sqlquery]&lt;br&gt;
-[[MediaWiki_talk:Sqlquery|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:00c261e1&amp;action=edit 26cb51a1]&lt;br&gt;
+[[MediaWiki_talk:00c261e1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Enter query
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sqlquery</title></template>
+<template lineStart="1"><title>int:00c261e1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Statistics&amp;action=edit statistics]&lt;br&gt;
-[[MediaWiki_talk:Statistics|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2086b21f&amp;action=edit 3d18b2ea]&lt;br&gt;
+[[MediaWiki_talk:2086b21f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Statistics
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Statistics</title></template>
+<template lineStart="1"><title>int:2086b21f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Storedversion&amp;action=edit storedversion]&lt;br&gt;
-[[MediaWiki_talk:Storedversion|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8cd0c85e&amp;action=edit 1b9e838c]&lt;br&gt;
+[[MediaWiki_talk:8cd0c85e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Stored version
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Storedversion</title></template>
+<template lineStart="1"><title>int:8cd0c85e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Stubthreshold&amp;action=edit stubthreshold]&lt;br&gt;
-[[MediaWiki_talk:Stubthreshold|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2eb6d4bd&amp;action=edit a5125d69]&lt;br&gt;
+[[MediaWiki_talk:2eb6d4bd|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Threshold for stub display
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Stubthreshold</title></template>
+<template lineStart="1"><title>int:2eb6d4bd</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subcategories&amp;action=edit subcategories]&lt;br&gt;
-[[MediaWiki_talk:Subcategories|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f3da206c&amp;action=edit ef062b0e]&lt;br&gt;
+[[MediaWiki_talk:f3da206c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Subcategories
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Subcategories</title></template>
+<template lineStart="1"><title>int:f3da206c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subject&amp;action=edit subject]&lt;br&gt;
-[[MediaWiki_talk:Subject|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8d183dbd&amp;action=edit 335ce16b]&lt;br&gt;
+[[MediaWiki_talk:8d183dbd|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Subject/headline
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Subject</title></template>
+<template lineStart="1"><title>int:8d183dbd</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subjectpage&amp;action=edit subjectpage]&lt;br&gt;
-[[MediaWiki_talk:Subjectpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ca29f2df&amp;action=edit d7084ef8]&lt;br&gt;
+[[MediaWiki_talk:ca29f2df|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View subject
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Subjectpage</title></template>
+<template lineStart="1"><title>int:ca29f2df</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Successfulupload&amp;action=edit successfulupload]&lt;br&gt;
-[[MediaWiki_talk:Successfulupload|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:17bc3900&amp;action=edit 3dfd0f51]&lt;br&gt;
+[[MediaWiki_talk:17bc3900|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Successful upload
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Successfulupload</title></template>
+<template lineStart="1"><title>int:17bc3900</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Summary&amp;action=edit summary]&lt;br&gt;
-[[MediaWiki_talk:Summary|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:12b71c3e&amp;action=edit 05535ecf]&lt;br&gt;
+[[MediaWiki_talk:12b71c3e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Summary
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Summary</title></template>
+<template lineStart="1"><title>int:12b71c3e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysopspheading&amp;action=edit sysopspheading]&lt;br&gt;
-[[MediaWiki_talk:Sysopspheading|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ee858d9a&amp;action=edit fde4e0f4]&lt;br&gt;
+[[MediaWiki_talk:ee858d9a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 For sysop use only
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sysopspheading</title></template>
+<template lineStart="1"><title>int:ee858d9a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysoptext&amp;action=edit sysoptext]&lt;br&gt;
-[[MediaWiki_talk:Sysoptext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2f758a39&amp;action=edit 85232d4f]&lt;br&gt;
+[[MediaWiki_talk:2f758a39|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The action you have requested can only be
 performed by users with &amp;quot;sysop&amp;quot; status.
 See $1.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sysoptext</title></template>
+<template lineStart="1"><title>int:2f758a39</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysoptitle&amp;action=edit sysoptitle]&lt;br&gt;
-[[MediaWiki_talk:Sysoptitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:91b8467b&amp;action=edit 3265b18d]&lt;br&gt;
+[[MediaWiki_talk:91b8467b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Sysop access required
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sysoptitle</title></template>
+<template lineStart="1"><title>int:91b8467b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tableform&amp;action=edit tableform]&lt;br&gt;
-[[MediaWiki_talk:Tableform|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:77b9c5ad&amp;action=edit 109e51e1]&lt;br&gt;
+[[MediaWiki_talk:77b9c5ad|Talk]]
 &lt;/td&gt;&lt;td&gt;
 table
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tableform</title></template>
+<template lineStart="1"><title>int:77b9c5ad</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talk&amp;action=edit talk]&lt;br&gt;
-[[MediaWiki_talk:Talk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4e6a710d&amp;action=edit e55e91b2]&lt;br&gt;
+[[MediaWiki_talk:4e6a710d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Discussion
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talk</title></template>
+<template lineStart="1"><title>int:4e6a710d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkexists&amp;action=edit talkexists]&lt;br&gt;
-[[MediaWiki_talk:Talkexists|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c11ac522&amp;action=edit 1ed6d2b4]&lt;br&gt;
+[[MediaWiki_talk:c11ac522|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The page itself was moved successfully, but the
 talk page could not be moved because one already exists at the new
 title. Please merge them manually.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talkexists</title></template>
+<template lineStart="1"><title>int:c11ac522</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpage&amp;action=edit talkpage]&lt;br&gt;
-[[MediaWiki_talk:Talkpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6a38ff98&amp;action=edit 3c940bbf]&lt;br&gt;
+[[MediaWiki_talk:6a38ff98|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Discuss this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talkpage</title></template>
+<template lineStart="1"><title>int:6a38ff98</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagemoved&amp;action=edit talkpagemoved]&lt;br&gt;
-[[MediaWiki_talk:Talkpagemoved|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2b630ea0&amp;action=edit f053e191]&lt;br&gt;
+[[MediaWiki_talk:2b630ea0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The corresponding talk page was also moved.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talkpagemoved</title></template>
+<template lineStart="1"><title>int:2b630ea0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagenotmoved&amp;action=edit talkpagenotmoved]&lt;br&gt;
-[[MediaWiki_talk:Talkpagenotmoved|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2282b1ca&amp;action=edit f3b6a64f]&lt;br&gt;
+[[MediaWiki_talk:2282b1ca|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The corresponding talk page was &amp;lt;strong&amp;gt;not&amp;lt;/strong&amp;gt; moved.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talkpagenotmoved</title></template>
+<template lineStart="1"><title>int:2282b1ca</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagetext&amp;action=edit talkpagetext]&lt;br&gt;
-[[MediaWiki_talk:Talkpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:45e3f76d&amp;action=edit 6534acb5]&lt;br&gt;
+[[MediaWiki_talk:45e3f76d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;!-- MediaWiki:talkpagetext --&amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talkpagetext</title></template>
+<template lineStart="1"><title>int:45e3f76d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Textboxsize&amp;action=edit textboxsize]&lt;br&gt;
-[[MediaWiki_talk:Textboxsize|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:607359f2&amp;action=edit 5788df25]&lt;br&gt;
+[[MediaWiki_talk:607359f2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Textbox dimensions
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Textboxsize</title></template>
+<template lineStart="1"><title>int:607359f2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Textmatches&amp;action=edit textmatches]&lt;br&gt;
-[[MediaWiki_talk:Textmatches|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:66571fbc&amp;action=edit 7d66aa0e]&lt;br&gt;
+[[MediaWiki_talk:66571fbc|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Page text matches
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Textmatches</title></template>
+<template lineStart="1"><title>int:66571fbc</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Thisisdeleted&amp;action=edit thisisdeleted]&lt;br&gt;
-[[MediaWiki_talk:Thisisdeleted|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e1f36741&amp;action=edit 83f663ed]&lt;br&gt;
+[[MediaWiki_talk:e1f36741|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View or restore $1?
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Thisisdeleted</title></template>
+<template lineStart="1"><title>int:e1f36741</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Thumbnail-more&amp;action=edit thumbnail-more]&lt;br&gt;
-[[MediaWiki_talk:Thumbnail-more|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a29f027b&amp;action=edit a299730b]&lt;br&gt;
+[[MediaWiki_talk:a29f027b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Enlarge
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Thumbnail-more</title></template>
+<template lineStart="1"><title>int:a29f027b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezonelegend&amp;action=edit timezonelegend]&lt;br&gt;
-[[MediaWiki_talk:Timezonelegend|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9ced4850&amp;action=edit 36ee6f56]&lt;br&gt;
+[[MediaWiki_talk:9ced4850|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Time zone
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Timezonelegend</title></template>
+<template lineStart="1"><title>int:9ced4850</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezoneoffset&amp;action=edit timezoneoffset]&lt;br&gt;
-[[MediaWiki_talk:Timezoneoffset|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ca45a968&amp;action=edit 9dba4eb8]&lt;br&gt;
+[[MediaWiki_talk:ca45a968|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Offset
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Timezoneoffset</title></template>
+<template lineStart="1"><title>int:ca45a968</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezonetext&amp;action=edit timezonetext]&lt;br&gt;
-[[MediaWiki_talk:Timezonetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:60bc3c41&amp;action=edit 3f58a2a9]&lt;br&gt;
+[[MediaWiki_talk:60bc3c41|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Enter number of hours your local time differs
 from server time (UTC).
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Timezonetext</title></template>
+<template lineStart="1"><title>int:60bc3c41</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Titlematches&amp;action=edit titlematches]&lt;br&gt;
-[[MediaWiki_talk:Titlematches|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2618febd&amp;action=edit e3f5384c]&lt;br&gt;
+[[MediaWiki_talk:2618febd|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Article title matches
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Titlematches</title></template>
+<template lineStart="1"><title>int:2618febd</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Toc&amp;action=edit toc]&lt;br&gt;
-[[MediaWiki_talk:Toc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b8684fcf&amp;action=edit 2a609230]&lt;br&gt;
+[[MediaWiki_talk:b8684fcf|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Table of contents
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Toc</title></template>
+<template lineStart="1"><title>int:b8684fcf</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Toolbox&amp;action=edit toolbox]&lt;br&gt;
-[[MediaWiki_talk:Toolbox|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:692107c0&amp;action=edit d75ba923]&lt;br&gt;
+[[MediaWiki_talk:692107c0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Toolbox
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Toolbox</title></template>
+<template lineStart="1"><title>int:692107c0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-addsection&amp;action=edit tooltip-addsection]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-addsection|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b9116941&amp;action=edit 04ced041]&lt;br&gt;
+[[MediaWiki_talk:b9116941|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Add a comment to this page. &amp;#91;alt-+]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-addsection</title></template>
+<template lineStart="1"><title>int:b9116941</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-anontalk&amp;action=edit tooltip-anontalk]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-anontalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b583d36c&amp;action=edit b987f993]&lt;br&gt;
+[[MediaWiki_talk:b583d36c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Discussion about edits from this ip address &amp;#91;alt-n]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-anontalk</title></template>
+<template lineStart="1"><title>int:b583d36c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-anonuserpage&amp;action=edit tooltip-anonuserpage]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-anonuserpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9efcbe2f&amp;action=edit e3522c89]&lt;br&gt;
+[[MediaWiki_talk:9efcbe2f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The user page for the ip you&amp;#39;re editing as &amp;#91;alt-.]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-anonuserpage</title></template>
+<template lineStart="1"><title>int:9efcbe2f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-article&amp;action=edit tooltip-article]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-article|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a4b9eea&amp;action=edit f3025f7a]&lt;br&gt;
+[[MediaWiki_talk:2a4b9eea|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View the content page &amp;#91;alt-a]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-article</title></template>
+<template lineStart="1"><title>int:2a4b9eea</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-atom&amp;action=edit tooltip-atom]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-atom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dcd3ca0c&amp;action=edit e420bf33]&lt;br&gt;
+[[MediaWiki_talk:dcd3ca0c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Atom feed for this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-atom</title></template>
+<template lineStart="1"><title>int:dcd3ca0c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-compareselectedversions&amp;action=edit tooltip-compareselectedversions]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-compareselectedversions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d318992a&amp;action=edit d2ae036e]&lt;br&gt;
+[[MediaWiki_talk:d318992a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 See the differences between the two selected versions of this page. &amp;#91;alt-v]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-compareselectedversions</title></template>
+<template lineStart="1"><title>int:d318992a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-contributions&amp;action=edit tooltip-contributions]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-contributions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:17165e38&amp;action=edit 2039dc44]&lt;br&gt;
+[[MediaWiki_talk:17165e38|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View the list of contributions of this user
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-contributions</title></template>
+<template lineStart="1"><title>int:17165e38</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-currentevents&amp;action=edit tooltip-currentevents]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-currentevents|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:32bcbdd6&amp;action=edit d57ba9d6]&lt;br&gt;
+[[MediaWiki_talk:32bcbdd6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Find background information on current events
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-currentevents</title></template>
+<template lineStart="1"><title>int:32bcbdd6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-delete&amp;action=edit tooltip-delete]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-delete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b1488dbf&amp;action=edit 742e0c2a]&lt;br&gt;
+[[MediaWiki_talk:b1488dbf|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Delete this page &amp;#91;alt-d]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-delete</title></template>
+<template lineStart="1"><title>int:b1488dbf</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-edit&amp;action=edit tooltip-edit]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-edit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8c519c79&amp;action=edit 6b354128]&lt;br&gt;
+[[MediaWiki_talk:8c519c79|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You can edit this page. Please use the preview button before saving. &amp;#91;alt-e]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-edit</title></template>
+<template lineStart="1"><title>int:8c519c79</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-emailuser&amp;action=edit tooltip-emailuser]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-emailuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d61f42ac&amp;action=edit 6a333373]&lt;br&gt;
+[[MediaWiki_talk:d61f42ac|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Send a mail to this user
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-emailuser</title></template>
+<template lineStart="1"><title>int:d61f42ac</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-help&amp;action=edit tooltip-help]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-help|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:691c7c4c&amp;action=edit 1f2e0a5e]&lt;br&gt;
+[[MediaWiki_talk:691c7c4c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The place to find out.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-help</title></template>
+<template lineStart="1"><title>int:691c7c4c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-history&amp;action=edit tooltip-history]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-history|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:da5d5f0e&amp;action=edit 357e85a5]&lt;br&gt;
+[[MediaWiki_talk:da5d5f0e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Past versions of this page, &amp;#91;alt-h]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-history</title></template>
+<template lineStart="1"><title>int:da5d5f0e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-login&amp;action=edit tooltip-login]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-login|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e20e86bb&amp;action=edit ff6db008]&lt;br&gt;
+[[MediaWiki_talk:e20e86bb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You are encouraged to log in, it is not mandatory however. &amp;#91;alt-o]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-login</title></template>
+<template lineStart="1"><title>int:e20e86bb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-logout&amp;action=edit tooltip-logout]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-logout|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ab189540&amp;action=edit bd25c34c]&lt;br&gt;
+[[MediaWiki_talk:ab189540|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Log out &amp;#91;alt-o]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-logout</title></template>
+<template lineStart="1"><title>int:ab189540</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mainpage&amp;action=edit tooltip-mainpage]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-mainpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8d2a8168&amp;action=edit 9dd4b86c]&lt;br&gt;
+[[MediaWiki_talk:8d2a8168|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Visit the Main Page &amp;#91;alt-z]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-mainpage</title></template>
+<template lineStart="1"><title>int:8d2a8168</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-minoredit&amp;action=edit tooltip-minoredit]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-minoredit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7316f250&amp;action=edit 2138d388]&lt;br&gt;
+[[MediaWiki_talk:7316f250|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Mark this as a minor edit &amp;#91;alt-i]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-minoredit</title></template>
+<template lineStart="1"><title>int:7316f250</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-move&amp;action=edit tooltip-move]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-move|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bfe45253&amp;action=edit 00ef7343]&lt;br&gt;
+[[MediaWiki_talk:bfe45253|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Move this page &amp;#91;alt-m]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-move</title></template>
+<template lineStart="1"><title>int:bfe45253</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mycontris&amp;action=edit tooltip-mycontris]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-mycontris|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c2b4d858&amp;action=edit 0bafecde]&lt;br&gt;
+[[MediaWiki_talk:c2b4d858|Talk]]
 &lt;/td&gt;&lt;td&gt;
 List of my contributions &amp;#91;alt-y]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-mycontris</title></template>
+<template lineStart="1"><title>int:c2b4d858</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mytalk&amp;action=edit tooltip-mytalk]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-mytalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:22361e38&amp;action=edit ef887076]&lt;br&gt;
+[[MediaWiki_talk:22361e38|Talk]]
 &lt;/td&gt;&lt;td&gt;
 My talk page &amp;#91;alt-n]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-mytalk</title></template>
+<template lineStart="1"><title>int:22361e38</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-nomove&amp;action=edit tooltip-nomove]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-nomove|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b34e28e3&amp;action=edit 6d66eb21]&lt;br&gt;
+[[MediaWiki_talk:b34e28e3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You don&amp;#39;t have the permissions to move this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-nomove</title></template>
+<template lineStart="1"><title>int:b34e28e3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-portal&amp;action=edit tooltip-portal]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-portal|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dc2cdd3b&amp;action=edit 7e77da11]&lt;br&gt;
+[[MediaWiki_talk:dc2cdd3b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 About the project, what you can do, where to find things
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-portal</title></template>
+<template lineStart="1"><title>int:dc2cdd3b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-preferences&amp;action=edit tooltip-preferences]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-preferences|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2032ad70&amp;action=edit 5611ec73]&lt;br&gt;
+[[MediaWiki_talk:2032ad70|Talk]]
 &lt;/td&gt;&lt;td&gt;
 My preferences
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-preferences</title></template>
+<template lineStart="1"><title>int:2032ad70</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-preview&amp;action=edit tooltip-preview]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-preview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d87a6e27&amp;action=edit 71b5f228]&lt;br&gt;
+[[MediaWiki_talk:d87a6e27|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Preview your changes, please use this before saving! &amp;#91;alt-p]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-preview</title></template>
+<template lineStart="1"><title>int:d87a6e27</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-protect&amp;action=edit tooltip-protect]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-protect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:44edd577&amp;action=edit fa1fc302]&lt;br&gt;
+[[MediaWiki_talk:44edd577|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Protect this page &amp;#91;alt-=]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-protect</title></template>
+<template lineStart="1"><title>int:44edd577</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-randompage&amp;action=edit tooltip-randompage]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-randompage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:aa67a70a&amp;action=edit f2eedbde]&lt;br&gt;
+[[MediaWiki_talk:aa67a70a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Load a random page &amp;#91;alt-x]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-randompage</title></template>
+<template lineStart="1"><title>int:aa67a70a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-recentchanges&amp;action=edit tooltip-recentchanges]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-recentchanges|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a5de539f&amp;action=edit cafd58f7]&lt;br&gt;
+[[MediaWiki_talk:a5de539f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The list of recent changes in the wiki. &amp;#91;alt-r]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-recentchanges</title></template>
+<template lineStart="1"><title>int:a5de539f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-recentchangeslinked&amp;action=edit tooltip-recentchangeslinked]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-recentchangeslinked|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:47cd8236&amp;action=edit ccab4d0f]&lt;br&gt;
+[[MediaWiki_talk:47cd8236|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Recent changes in pages linking to this page &amp;#91;alt-c]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-recentchangeslinked</title></template>
+<template lineStart="1"><title>int:47cd8236</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-rss&amp;action=edit tooltip-rss]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-rss|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:82964371&amp;action=edit 53235bed]&lt;br&gt;
+[[MediaWiki_talk:82964371|Talk]]
 &lt;/td&gt;&lt;td&gt;
 RSS feed for this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-rss</title></template>
+<template lineStart="1"><title>int:82964371</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-save&amp;action=edit tooltip-save]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-save|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ec76631f&amp;action=edit 8ce4a9b9]&lt;br&gt;
+[[MediaWiki_talk:ec76631f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Save your changes &amp;#91;alt-s]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-save</title></template>
+<template lineStart="1"><title>int:ec76631f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-search&amp;action=edit tooltip-search]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-search|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6d206f30&amp;action=edit a6413695]&lt;br&gt;
+[[MediaWiki_talk:6d206f30|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Search this wiki &amp;#91;alt-f]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-search</title></template>
+<template lineStart="1"><title>int:6d206f30</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-sitesupport&amp;action=edit tooltip-sitesupport]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-sitesupport|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:65256208&amp;action=edit c2dafa2a]&lt;br&gt;
+[[MediaWiki_talk:65256208|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Support Wiktionary
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-sitesupport</title></template>
+<template lineStart="1"><title>int:65256208</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-specialpage&amp;action=edit tooltip-specialpage]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-specialpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:280cc8fd&amp;action=edit 73f9a677]&lt;br&gt;
+[[MediaWiki_talk:280cc8fd|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This is a special page, you can&amp;#39;t edit the page itself.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-specialpage</title></template>
+<template lineStart="1"><title>int:280cc8fd</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-specialpages&amp;action=edit tooltip-specialpages]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-specialpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7c7223be&amp;action=edit 764993b1]&lt;br&gt;
+[[MediaWiki_talk:7c7223be|Talk]]
 &lt;/td&gt;&lt;td&gt;
 List of all special pages &amp;#91;alt-q]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-specialpages</title></template>
+<template lineStart="1"><title>int:7c7223be</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-talk&amp;action=edit tooltip-talk]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-talk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:06fb1d8e&amp;action=edit cb23801a]&lt;br&gt;
+[[MediaWiki_talk:06fb1d8e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Discussion about the content page &amp;#91;alt-t]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-talk</title></template>
+<template lineStart="1"><title>int:06fb1d8e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-undelete&amp;action=edit tooltip-undelete]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-undelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:341a8a32&amp;action=edit df81e982]&lt;br&gt;
+[[MediaWiki_talk:341a8a32|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Restore the $1 edits done to this page before it was deleted &amp;#91;alt-d]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-undelete</title></template>
+<template lineStart="1"><title>int:341a8a32</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-unwatch&amp;action=edit tooltip-unwatch]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-unwatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:377e895f&amp;action=edit 53f18c52]&lt;br&gt;
+[[MediaWiki_talk:377e895f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Remove this page from your watchlist &amp;#91;alt-w]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-unwatch</title></template>
+<template lineStart="1"><title>int:377e895f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-upload&amp;action=edit tooltip-upload]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-upload|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b1d4103e&amp;action=edit 6143ca0f]&lt;br&gt;
+[[MediaWiki_talk:b1d4103e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Upload images or media files &amp;#91;alt-u]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-upload</title></template>
+<template lineStart="1"><title>int:b1d4103e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-userpage&amp;action=edit tooltip-userpage]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-userpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3d8cae2f&amp;action=edit 2b3a6ed0]&lt;br&gt;
+[[MediaWiki_talk:3d8cae2f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 My user page &amp;#91;alt-.]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-userpage</title></template>
+<template lineStart="1"><title>int:3d8cae2f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-viewsource&amp;action=edit tooltip-viewsource]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-viewsource|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:141dd88c&amp;action=edit 1ef2ea9d]&lt;br&gt;
+[[MediaWiki_talk:141dd88c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This page is protected. You can view its source. &amp;#91;alt-e]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-viewsource</title></template>
+<template lineStart="1"><title>int:141dd88c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-watch&amp;action=edit tooltip-watch]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-watch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:68a73399&amp;action=edit 07e7b59d]&lt;br&gt;
+[[MediaWiki_talk:68a73399|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Add this page to your watchlist &amp;#91;alt-w]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-watch</title></template>
+<template lineStart="1"><title>int:68a73399</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-watchlist&amp;action=edit tooltip-watchlist]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-watchlist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:56a787ff&amp;action=edit e24666fc]&lt;br&gt;
+[[MediaWiki_talk:56a787ff|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The list of pages you&amp;#39;re monitoring for changes. &amp;#91;alt-l]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-watchlist</title></template>
+<template lineStart="1"><title>int:56a787ff</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-whatlinkshere&amp;action=edit tooltip-whatlinkshere]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-whatlinkshere|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3fd46bc1&amp;action=edit fbd416b7]&lt;br&gt;
+[[MediaWiki_talk:3fd46bc1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 List of all wiki pages that link here &amp;#91;alt-b]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-whatlinkshere</title></template>
+<template lineStart="1"><title>int:3fd46bc1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uclinks&amp;action=edit uclinks]&lt;br&gt;
-[[MediaWiki_talk:Uclinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:47514ec5&amp;action=edit c48d8241]&lt;br&gt;
+[[MediaWiki_talk:47514ec5|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View the last $1 changes; view the last $2 days.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uclinks</title></template>
+<template lineStart="1"><title>int:47514ec5</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ucnote&amp;action=edit ucnote]&lt;br&gt;
-[[MediaWiki_talk:Ucnote|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6442d081&amp;action=edit 0d69ac51]&lt;br&gt;
+[[MediaWiki_talk:6442d081|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Below are this user&amp;#39;s last &amp;lt;b&amp;gt;$1&amp;lt;/b&amp;gt; changes in the last &amp;lt;b&amp;gt;$2&amp;lt;/b&amp;gt; days.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ucnote</title></template>
+<template lineStart="1"><title>int:6442d081</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uctop&amp;action=edit uctop]&lt;br&gt;
-[[MediaWiki_talk:Uctop|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:507d407a&amp;action=edit f9bb6366]&lt;br&gt;
+[[MediaWiki_talk:507d407a|Talk]]
 &lt;/td&gt;&lt;td&gt;
  (top)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uctop</title></template>
+<template lineStart="1"><title>int:507d407a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblockip&amp;action=edit unblockip]&lt;br&gt;
-[[MediaWiki_talk:Unblockip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8c29ba33&amp;action=edit 2b4842fd]&lt;br&gt;
+[[MediaWiki_talk:8c29ba33|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Unblock user
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unblockip</title></template>
+<template lineStart="1"><title>int:8c29ba33</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblockiptext&amp;action=edit unblockiptext]&lt;br&gt;
-[[MediaWiki_talk:Unblockiptext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3a879bdb&amp;action=edit 98f7f719]&lt;br&gt;
+[[MediaWiki_talk:3a879bdb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Use the form below to restore write access
 to a previously blocked IP address or username.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unblockiptext</title></template>
+<template lineStart="1"><title>int:3a879bdb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblocklink&amp;action=edit unblocklink]&lt;br&gt;
-[[MediaWiki_talk:Unblocklink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e954d285&amp;action=edit 24e7c6e7]&lt;br&gt;
+[[MediaWiki_talk:e954d285|Talk]]
 &lt;/td&gt;&lt;td&gt;
 unblock
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unblocklink</title></template>
+<template lineStart="1"><title>int:e954d285</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblocklogentry&amp;action=edit unblocklogentry]&lt;br&gt;
-[[MediaWiki_talk:Unblocklogentry|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5e55820a&amp;action=edit eecac2a2]&lt;br&gt;
+[[MediaWiki_talk:5e55820a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 unblocked &amp;quot;$1&amp;quot;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unblocklogentry</title></template>
+<template lineStart="1"><title>int:5e55820a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undelete&amp;action=edit undelete]&lt;br&gt;
-[[MediaWiki_talk:Undelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9b2a9354&amp;action=edit f690005f]&lt;br&gt;
+[[MediaWiki_talk:9b2a9354|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Restore deleted page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undelete</title></template>
+<template lineStart="1"><title>int:9b2a9354</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undelete_short&amp;action=edit undelete_short]&lt;br&gt;
-[[MediaWiki_talk:Undelete_short|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:85cdbe83&amp;action=edit d4adea3f]&lt;br&gt;
+[[MediaWiki_talk:85cdbe83|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Undelete $1 edits
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undelete_short</title></template>
+<template lineStart="1"><title>int:85cdbe83</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletearticle&amp;action=edit undeletearticle]&lt;br&gt;
-[[MediaWiki_talk:Undeletearticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9ba522b6&amp;action=edit c4635e76]&lt;br&gt;
+[[MediaWiki_talk:9ba522b6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Restore deleted page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletearticle</title></template>
+<template lineStart="1"><title>int:9ba522b6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletebtn&amp;action=edit undeletebtn]&lt;br&gt;
-[[MediaWiki_talk:Undeletebtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3346239e&amp;action=edit 5dd4b2af]&lt;br&gt;
+[[MediaWiki_talk:3346239e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Restore!
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletebtn</title></template>
+<template lineStart="1"><title>int:3346239e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletedarticle&amp;action=edit undeletedarticle]&lt;br&gt;
-[[MediaWiki_talk:Undeletedarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c2a7eb23&amp;action=edit cf1590b6]&lt;br&gt;
+[[MediaWiki_talk:c2a7eb23|Talk]]
 &lt;/td&gt;&lt;td&gt;
 restored &amp;quot;$1&amp;quot;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletedarticle</title></template>
+<template lineStart="1"><title>int:c2a7eb23</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletedtext&amp;action=edit undeletedtext]&lt;br&gt;
-[[MediaWiki_talk:Undeletedtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:40f0db7a&amp;action=edit 5e55bc75]&lt;br&gt;
+[[MediaWiki_talk:40f0db7a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;#91;&amp;#91;$1]] has been successfully restored.
 See &amp;#91;&amp;#91;Wiktionary:Deletion_log]] for a record of recent deletions and restorations.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletedtext</title></template>
+<template lineStart="1"><title>int:40f0db7a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletehistory&amp;action=edit undeletehistory]&lt;br&gt;
-[[MediaWiki_talk:Undeletehistory|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:feaa86c6&amp;action=edit a69aad99]&lt;br&gt;
+[[MediaWiki_talk:feaa86c6|Talk]]
 &lt;/td&gt;&lt;td&gt;
 If you restore the page, all revisions will be restored to the history.
 If a new page with the same name has been created since the deletion, the restored
 revisions will appear in the prior history, and the current revision of the live page
 will not be automatically replaced.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletehistory</title></template>
+<template lineStart="1"><title>int:feaa86c6</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletepage&amp;action=edit undeletepage]&lt;br&gt;
-[[MediaWiki_talk:Undeletepage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9fa6521f&amp;action=edit d650f0a7]&lt;br&gt;
+[[MediaWiki_talk:9fa6521f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View and restore deleted pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletepage</title></template>
+<template lineStart="1"><title>int:9fa6521f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletepagetext&amp;action=edit undeletepagetext]&lt;br&gt;
-[[MediaWiki_talk:Undeletepagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2e99f66e&amp;action=edit 19b68d7f]&lt;br&gt;
+[[MediaWiki_talk:2e99f66e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The following pages have been deleted but are still in the archive and
 can be restored. The archive may be periodically cleaned out.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletepagetext</title></template>
+<template lineStart="1"><title>int:2e99f66e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeleterevision&amp;action=edit undeleterevision]&lt;br&gt;
-[[MediaWiki_talk:Undeleterevision|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b097a89b&amp;action=edit 2a3672ef]&lt;br&gt;
+[[MediaWiki_talk:b097a89b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Deleted revision as of $1
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeleterevision</title></template>
+<template lineStart="1"><title>int:b097a89b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeleterevisions&amp;action=edit undeleterevisions]&lt;br&gt;
-[[MediaWiki_talk:Undeleterevisions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:eb2694a4&amp;action=edit d0cd3f87]&lt;br&gt;
+[[MediaWiki_talk:eb2694a4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 $1 revisions archived
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeleterevisions</title></template>
+<template lineStart="1"><title>int:eb2694a4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unexpected&amp;action=edit unexpected]&lt;br&gt;
-[[MediaWiki_talk:Unexpected|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3b67a8c9&amp;action=edit fd2a2764]&lt;br&gt;
+[[MediaWiki_talk:3b67a8c9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Unexpected value: &amp;quot;$1&amp;quot;=&amp;quot;$2&amp;quot;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unexpected</title></template>
+<template lineStart="1"><title>int:3b67a8c9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockbtn&amp;action=edit unlockbtn]&lt;br&gt;
-[[MediaWiki_talk:Unlockbtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:016b68d2&amp;action=edit 74a8f293]&lt;br&gt;
+[[MediaWiki_talk:016b68d2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Unlock database
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockbtn</title></template>
+<template lineStart="1"><title>int:016b68d2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockconfirm&amp;action=edit unlockconfirm]&lt;br&gt;
-[[MediaWiki_talk:Unlockconfirm|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fc3080bf&amp;action=edit ded00b4f]&lt;br&gt;
+[[MediaWiki_talk:fc3080bf|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Yes, I really want to unlock the database.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockconfirm</title></template>
+<template lineStart="1"><title>int:fc3080bf</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdb&amp;action=edit unlockdb]&lt;br&gt;
-[[MediaWiki_talk:Unlockdb|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4df98d29&amp;action=edit 68a2c7e3]&lt;br&gt;
+[[MediaWiki_talk:4df98d29|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Unlock database
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockdb</title></template>
+<template lineStart="1"><title>int:4df98d29</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbsuccesssub&amp;action=edit unlockdbsuccesssub]&lt;br&gt;
-[[MediaWiki_talk:Unlockdbsuccesssub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:86605aa9&amp;action=edit eb575aa1]&lt;br&gt;
+[[MediaWiki_talk:86605aa9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Database lock removed
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockdbsuccesssub</title></template>
+<template lineStart="1"><title>int:86605aa9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbsuccesstext&amp;action=edit unlockdbsuccesstext]&lt;br&gt;
-[[MediaWiki_talk:Unlockdbsuccesstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1896db20&amp;action=edit a7a78572]&lt;br&gt;
+[[MediaWiki_talk:1896db20|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The database has been unlocked.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockdbsuccesstext</title></template>
+<template lineStart="1"><title>int:1896db20</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbtext&amp;action=edit unlockdbtext]&lt;br&gt;
-[[MediaWiki_talk:Unlockdbtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bd3decce&amp;action=edit 6b32a82f]&lt;br&gt;
+[[MediaWiki_talk:bd3decce|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Unlocking the database will restore the ability of all
 users to edit pages, change their preferences, edit their watchlists, and
 other things requiring changes in the database.
 Please confirm that this is what you intend to do.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockdbtext</title></template>
+<template lineStart="1"><title>int:bd3decce</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotect&amp;action=edit unprotect]&lt;br&gt;
-[[MediaWiki_talk:Unprotect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d180e0d9&amp;action=edit 116b2a3b]&lt;br&gt;
+[[MediaWiki_talk:d180e0d9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Unprotect
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unprotect</title></template>
+<template lineStart="1"><title>int:d180e0d9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectcomment&amp;action=edit unprotectcomment]&lt;br&gt;
-[[MediaWiki_talk:Unprotectcomment|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:affff3c2&amp;action=edit a4439c30]&lt;br&gt;
+[[MediaWiki_talk:affff3c2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Reason for unprotecting
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unprotectcomment</title></template>
+<template lineStart="1"><title>int:affff3c2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectedarticle&amp;action=edit unprotectedarticle]&lt;br&gt;
-[[MediaWiki_talk:Unprotectedarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b8d58125&amp;action=edit 66029ebc]&lt;br&gt;
+[[MediaWiki_talk:b8d58125|Talk]]
 &lt;/td&gt;&lt;td&gt;
 unprotected &amp;#91;&amp;#91;$1]]
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unprotectedarticle</title></template>
+<template lineStart="1"><title>int:b8d58125</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectsub&amp;action=edit unprotectsub]&lt;br&gt;
-[[MediaWiki_talk:Unprotectsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b15ab8cb&amp;action=edit c77cef4c]&lt;br&gt;
+[[MediaWiki_talk:b15ab8cb|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (Unprotecting &amp;quot;$1&amp;quot;)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unprotectsub</title></template>
+<template lineStart="1"><title>int:b15ab8cb</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectthispage&amp;action=edit unprotectthispage]&lt;br&gt;
-[[MediaWiki_talk:Unprotectthispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:10782968&amp;action=edit caa31f1e]&lt;br&gt;
+[[MediaWiki_talk:10782968|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Unprotect this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unprotectthispage</title></template>
+<template lineStart="1"><title>int:10782968</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unusedimages&amp;action=edit unusedimages]&lt;br&gt;
-[[MediaWiki_talk:Unusedimages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5ed67176&amp;action=edit e17373a9]&lt;br&gt;
+[[MediaWiki_talk:5ed67176|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Unused images
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unusedimages</title></template>
+<template lineStart="1"><title>int:5ed67176</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unusedimagestext&amp;action=edit unusedimagestext]&lt;br&gt;
-[[MediaWiki_talk:Unusedimagestext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:373709c4&amp;action=edit 13626cea]&lt;br&gt;
+[[MediaWiki_talk:373709c4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;p&amp;gt;Please note that other web sites may link to an image with
 a direct URL, and so may still be listed here despite being
 in active use.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unusedimagestext</title></template>
+<template lineStart="1"><title>int:373709c4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unwatch&amp;action=edit unwatch]&lt;br&gt;
-[[MediaWiki_talk:Unwatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:51055a00&amp;action=edit f6f282e9]&lt;br&gt;
+[[MediaWiki_talk:51055a00|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Unwatch
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unwatch</title></template>
+<template lineStart="1"><title>int:51055a00</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unwatchthispage&amp;action=edit unwatchthispage]&lt;br&gt;
-[[MediaWiki_talk:Unwatchthispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e21d3614&amp;action=edit c7d1cd1e]&lt;br&gt;
+[[MediaWiki_talk:e21d3614|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Stop watching
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unwatchthispage</title></template>
+<template lineStart="1"><title>int:e21d3614</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Updated&amp;action=edit updated]&lt;br&gt;
-[[MediaWiki_talk:Updated|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f2f8570d&amp;action=edit 13a1891a]&lt;br&gt;
+[[MediaWiki_talk:f2f8570d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (Updated)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Updated</title></template>
+<template lineStart="1"><title>int:f2f8570d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Upload&amp;action=edit upload]&lt;br&gt;
-[[MediaWiki_talk:Upload|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8bdf057f&amp;action=edit bb73aaaf]&lt;br&gt;
+[[MediaWiki_talk:8bdf057f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Upload file
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Upload</title></template>
+<template lineStart="1"><title>int:8bdf057f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadbtn&amp;action=edit uploadbtn]&lt;br&gt;
-[[MediaWiki_talk:Uploadbtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0238951b&amp;action=edit 6be1c689]&lt;br&gt;
+[[MediaWiki_talk:0238951b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Upload file
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadbtn</title></template>
+<template lineStart="1"><title>int:0238951b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploaddisabled&amp;action=edit uploaddisabled]&lt;br&gt;
-[[MediaWiki_talk:Uploaddisabled|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:88f59c5a&amp;action=edit 693f4b51]&lt;br&gt;
+[[MediaWiki_talk:88f59c5a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Sorry, uploading is disabled.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploaddisabled</title></template>
+<template lineStart="1"><title>int:88f59c5a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadedfiles&amp;action=edit uploadedfiles]&lt;br&gt;
-[[MediaWiki_talk:Uploadedfiles|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7b8969f2&amp;action=edit 7d4f03ff]&lt;br&gt;
+[[MediaWiki_talk:7b8969f2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Uploaded files
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadedfiles</title></template>
+<template lineStart="1"><title>int:7b8969f2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadedimage&amp;action=edit uploadedimage]&lt;br&gt;
-[[MediaWiki_talk:Uploadedimage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:954c2a11&amp;action=edit e57056a0]&lt;br&gt;
+[[MediaWiki_talk:954c2a11|Talk]]
 &lt;/td&gt;&lt;td&gt;
 uploaded &amp;quot;$1&amp;quot;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadedimage</title></template>
+<template lineStart="1"><title>int:954c2a11</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploaderror&amp;action=edit uploaderror]&lt;br&gt;
-[[MediaWiki_talk:Uploaderror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:304f9593&amp;action=edit 8f1603bd]&lt;br&gt;
+[[MediaWiki_talk:304f9593|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Upload error
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploaderror</title></template>
+<template lineStart="1"><title>int:304f9593</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadfile&amp;action=edit uploadfile]&lt;br&gt;
-[[MediaWiki_talk:Uploadfile|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9e71a62c&amp;action=edit 40d977b5]&lt;br&gt;
+[[MediaWiki_talk:9e71a62c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Upload images, sounds, documents etc.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadfile</title></template>
+<template lineStart="1"><title>int:9e71a62c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlink&amp;action=edit uploadlink]&lt;br&gt;
-[[MediaWiki_talk:Uploadlink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:955e39f9&amp;action=edit 0bf93eec]&lt;br&gt;
+[[MediaWiki_talk:955e39f9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Upload images
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadlink</title></template>
+<template lineStart="1"><title>int:955e39f9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlog&amp;action=edit uploadlog]&lt;br&gt;
-[[MediaWiki_talk:Uploadlog|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0d39c428&amp;action=edit 0d49abe6]&lt;br&gt;
+[[MediaWiki_talk:0d39c428|Talk]]
 &lt;/td&gt;&lt;td&gt;
 upload log
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadlog</title></template>
+<template lineStart="1"><title>int:0d39c428</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlogpage&amp;action=edit uploadlogpage]&lt;br&gt;
-[[MediaWiki_talk:Uploadlogpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1f68a0e7&amp;action=edit 87611d30]&lt;br&gt;
+[[MediaWiki_talk:1f68a0e7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Upload_log
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadlogpage</title></template>
+<template lineStart="1"><title>int:1f68a0e7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlogpagetext&amp;action=edit uploadlogpagetext]&lt;br&gt;
-[[MediaWiki_talk:Uploadlogpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a430331&amp;action=edit 8aa7bf47]&lt;br&gt;
+[[MediaWiki_talk:2a430331|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Below is a list of the most recent file uploads.
 All times shown are server time (UTC).
@@ -5152,25 +5152,25 @@ All times shown are server time (UTC).
 &amp;lt;/ul&amp;gt;
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadlogpagetext</title></template>
+<template lineStart="1"><title>int:2a430331</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadnologin&amp;action=edit uploadnologin]&lt;br&gt;
-[[MediaWiki_talk:Uploadnologin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:92dd3bc9&amp;action=edit d2d8bd08]&lt;br&gt;
+[[MediaWiki_talk:92dd3bc9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Not logged in
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadnologin</title></template>
+<template lineStart="1"><title>int:92dd3bc9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadnologintext&amp;action=edit uploadnologintext]&lt;br&gt;
-[[MediaWiki_talk:Uploadnologintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fecdb77e&amp;action=edit 09b01f51]&lt;br&gt;
+[[MediaWiki_talk:fecdb77e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You must be &amp;lt;a href=&amp;quot;/wiki/Special:Userlogin&amp;quot;&amp;gt;logged in&amp;lt;/a&amp;gt;
 to upload files.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadnologintext</title></template>
+<template lineStart="1"><title>int:fecdb77e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadtext&amp;action=edit uploadtext]&lt;br&gt;
-[[MediaWiki_talk:Uploadtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7804cb84&amp;action=edit 85bb3caa]&lt;br&gt;
+[[MediaWiki_talk:7804cb84|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;strong&amp;gt;STOP!&amp;lt;/strong&amp;gt; Before you upload here,
 make sure to read and follow the &amp;lt;a href=&amp;quot;/wiki/Special:Image_use_policy&amp;quot;&amp;gt;image use policy&amp;lt;/a&amp;gt;.
@@ -5201,404 +5201,404 @@ or &amp;lt;b&amp;gt;&amp;#91;&amp;#91;Media:file.ogg]]&amp;lt;/b&amp;gt; for sou
 delete your uploads if they think it serves the project, and
 you may be blocked from uploading if you abuse the system.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadtext</title></template>
+<template lineStart="1"><title>int:7804cb84</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadwarning&amp;action=edit uploadwarning]&lt;br&gt;
-[[MediaWiki_talk:Uploadwarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fb3ef2ae&amp;action=edit 8aae8210]&lt;br&gt;
+[[MediaWiki_talk:fb3ef2ae|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Upload warning
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadwarning</title></template>
+<template lineStart="1"><title>int:fb3ef2ae</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:User_rights_set&amp;action=edit user_rights_set]&lt;br&gt;
-[[MediaWiki_talk:User_rights_set|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a5430c9b&amp;action=edit 6a080eb0]&lt;br&gt;
+[[MediaWiki_talk:a5430c9b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;b&amp;gt;User rights for &amp;quot;$1&amp;quot; updated&amp;lt;/b&amp;gt;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:User_rights_set</title></template>
+<template lineStart="1"><title>int:a5430c9b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercssjs&amp;action=edit usercssjs]&lt;br&gt;
-[[MediaWiki_talk:Usercssjs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:89b73748&amp;action=edit 8b23a826]&lt;br&gt;
+[[MediaWiki_talk:89b73748|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;#39;&amp;#39;&amp;#39;Note:&amp;#39;&amp;#39;&amp;#39; After saving, you have to tell your bowser to get the new version: &amp;#39;&amp;#39;&amp;#39;Mozilla:&amp;#39;&amp;#39;&amp;#39; click &amp;#39;&amp;#39;reload&amp;#39;&amp;#39;(or &amp;#39;&amp;#39;ctrl-r&amp;#39;&amp;#39;), &amp;#39;&amp;#39;&amp;#39;IE / Opera:&amp;#39;&amp;#39;&amp;#39; &amp;#39;&amp;#39;ctrl-f5&amp;#39;&amp;#39;, &amp;#39;&amp;#39;&amp;#39;Safari:&amp;#39;&amp;#39;&amp;#39; &amp;#39;&amp;#39;cmd-r&amp;#39;&amp;#39;, &amp;#39;&amp;#39;&amp;#39;Konqueror&amp;#39;&amp;#39;&amp;#39; &amp;#39;&amp;#39;ctrl-r&amp;#39;&amp;#39;.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Usercssjs</title></template>
+<template lineStart="1"><title>int:89b73748</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercssjsyoucanpreview&amp;action=edit usercssjsyoucanpreview]&lt;br&gt;
-[[MediaWiki_talk:Usercssjsyoucanpreview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1656c92b&amp;action=edit 97bd6e75]&lt;br&gt;
+[[MediaWiki_talk:1656c92b|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;strong&amp;gt;Tip:&amp;lt;/strong&amp;gt; Use the &amp;#39;Show preview&amp;#39; button to test your new css/js before saving.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Usercssjsyoucanpreview</title></template>
+<template lineStart="1"><title>int:1656c92b</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercsspreview&amp;action=edit usercsspreview]&lt;br&gt;
-[[MediaWiki_talk:Usercsspreview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9f62117d&amp;action=edit b51c3667]&lt;br&gt;
+[[MediaWiki_talk:9f62117d|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;#39;&amp;#39;&amp;#39;Remember that you are only previewing your user css, it has not yet been saved!&amp;#39;&amp;#39;&amp;#39;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Usercsspreview</title></template>
+<template lineStart="1"><title>int:9f62117d</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userexists&amp;action=edit userexists]&lt;br&gt;
-[[MediaWiki_talk:Userexists|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:77541367&amp;action=edit a49220af]&lt;br&gt;
+[[MediaWiki_talk:77541367|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The user name you entered is already in use. Please choose a different name.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userexists</title></template>
+<template lineStart="1"><title>int:77541367</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userjspreview&amp;action=edit userjspreview]&lt;br&gt;
-[[MediaWiki_talk:Userjspreview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:eca4b211&amp;action=edit 2e8efec0]&lt;br&gt;
+[[MediaWiki_talk:eca4b211|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;#39;&amp;#39;&amp;#39;Remember that you are only testing/previewing your user javascript, it has not yet been saved!&amp;#39;&amp;#39;&amp;#39;
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userjspreview</title></template>
+<template lineStart="1"><title>int:eca4b211</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userlogin&amp;action=edit userlogin]&lt;br&gt;
-[[MediaWiki_talk:Userlogin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:49c670f4&amp;action=edit eb0f23d8]&lt;br&gt;
+[[MediaWiki_talk:49c670f4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Log in
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userlogin</title></template>
+<template lineStart="1"><title>int:49c670f4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userlogout&amp;action=edit userlogout]&lt;br&gt;
-[[MediaWiki_talk:Userlogout|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fb3467d9&amp;action=edit 271a962f]&lt;br&gt;
+[[MediaWiki_talk:fb3467d9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Log out
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userlogout</title></template>
+<template lineStart="1"><title>int:fb3467d9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usermailererror&amp;action=edit usermailererror]&lt;br&gt;
-[[MediaWiki_talk:Usermailererror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e1881ca2&amp;action=edit 0e3f35e1]&lt;br&gt;
+[[MediaWiki_talk:e1881ca2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Mail object returned error: 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Usermailererror</title></template>
+<template lineStart="1"><title>int:e1881ca2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userpage&amp;action=edit userpage]&lt;br&gt;
-[[MediaWiki_talk:Userpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:823fdaf7&amp;action=edit ea81d010]&lt;br&gt;
+[[MediaWiki_talk:823fdaf7|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View user page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userpage</title></template>
+<template lineStart="1"><title>int:823fdaf7</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userstats&amp;action=edit userstats]&lt;br&gt;
-[[MediaWiki_talk:Userstats|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f25ef873&amp;action=edit 2ab9a2af]&lt;br&gt;
+[[MediaWiki_talk:f25ef873|Talk]]
 &lt;/td&gt;&lt;td&gt;
 User statistics
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userstats</title></template>
+<template lineStart="1"><title>int:f25ef873</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userstatstext&amp;action=edit userstatstext]&lt;br&gt;
-[[MediaWiki_talk:Userstatstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b704c939&amp;action=edit 903f135d]&lt;br&gt;
+[[MediaWiki_talk:b704c939|Talk]]
 &lt;/td&gt;&lt;td&gt;
 There are &amp;#39;&amp;#39;&amp;#39;$1&amp;#39;&amp;#39;&amp;#39; registered users.
 &amp;#39;&amp;#39;&amp;#39;$2&amp;#39;&amp;#39;&amp;#39; of these are administrators (see $3).
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userstatstext</title></template>
+<template lineStart="1"><title>int:b704c939</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Version&amp;action=edit version]&lt;br&gt;
-[[MediaWiki_talk:Version|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2da600bf&amp;action=edit c692273d]&lt;br&gt;
+[[MediaWiki_talk:2da600bf|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Version
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Version</title></template>
+<template lineStart="1"><title>int:2da600bf</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewcount&amp;action=edit viewcount]&lt;br&gt;
-[[MediaWiki_talk:Viewcount|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cd20ed80&amp;action=edit 9204f6f2]&lt;br&gt;
+[[MediaWiki_talk:cd20ed80|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This page has been accessed $1 times.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Viewcount</title></template>
+<template lineStart="1"><title>int:cd20ed80</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewprevnext&amp;action=edit viewprevnext]&lt;br&gt;
-[[MediaWiki_talk:Viewprevnext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b3a212e8&amp;action=edit 023f0549]&lt;br&gt;
+[[MediaWiki_talk:b3a212e8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View ($1) ($2) ($3).
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Viewprevnext</title></template>
+<template lineStart="1"><title>int:b3a212e8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewsource&amp;action=edit viewsource]&lt;br&gt;
-[[MediaWiki_talk:Viewsource|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1affdb1e&amp;action=edit db9e2eba]&lt;br&gt;
+[[MediaWiki_talk:1affdb1e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View source
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Viewsource</title></template>
+<template lineStart="1"><title>int:1affdb1e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewtalkpage&amp;action=edit viewtalkpage]&lt;br&gt;
-[[MediaWiki_talk:Viewtalkpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f6336004&amp;action=edit 2e250bd9]&lt;br&gt;
+[[MediaWiki_talk:f6336004|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View discussion
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Viewtalkpage</title></template>
+<template lineStart="1"><title>int:f6336004</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wantedpages&amp;action=edit wantedpages]&lt;br&gt;
-[[MediaWiki_talk:Wantedpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7da05431&amp;action=edit 4d2466a3]&lt;br&gt;
+[[MediaWiki_talk:7da05431|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wanted pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wantedpages</title></template>
+<template lineStart="1"><title>int:7da05431</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watch&amp;action=edit watch]&lt;br&gt;
-[[MediaWiki_talk:Watch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d91ebf58&amp;action=edit 292b0901]&lt;br&gt;
+[[MediaWiki_talk:d91ebf58|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Watch
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watch</title></template>
+<template lineStart="1"><title>int:d91ebf58</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchdetails&amp;action=edit watchdetails]&lt;br&gt;
-[[MediaWiki_talk:Watchdetails|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d815e414&amp;action=edit ddfeb02c]&lt;br&gt;
+[[MediaWiki_talk:d815e414|Talk]]
 &lt;/td&gt;&lt;td&gt;
 ($1 pages watched not counting talk pages;
 $2 total pages edited since cutoff;
 $3...
 &amp;lt;a href=&amp;#39;$4&amp;#39;&amp;gt;show and edit complete list&amp;lt;/a&amp;gt;.)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchdetails</title></template>
+<template lineStart="1"><title>int:d815e414</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watcheditlist&amp;action=edit watcheditlist]&lt;br&gt;
-[[MediaWiki_talk:Watcheditlist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:780e4559&amp;action=edit d7d3bb79]&lt;br&gt;
+[[MediaWiki_talk:780e4559|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Here&amp;#39;s an alphabetical list of your
 watched pages. Check the boxes of pages you want to remove
 from your watchlist and click the &amp;#39;remove checked&amp;#39; button
 at the bottom of the screen.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watcheditlist</title></template>
+<template lineStart="1"><title>int:780e4559</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlist&amp;action=edit watchlist]&lt;br&gt;
-[[MediaWiki_talk:Watchlist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:48a616d9&amp;action=edit db14f0be]&lt;br&gt;
+[[MediaWiki_talk:48a616d9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 My watchlist
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchlist</title></template>
+<template lineStart="1"><title>int:48a616d9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlistcontains&amp;action=edit watchlistcontains]&lt;br&gt;
-[[MediaWiki_talk:Watchlistcontains|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:690e08f8&amp;action=edit 37074879]&lt;br&gt;
+[[MediaWiki_talk:690e08f8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your watchlist contains $1 pages.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchlistcontains</title></template>
+<template lineStart="1"><title>int:690e08f8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlistsub&amp;action=edit watchlistsub]&lt;br&gt;
-[[MediaWiki_talk:Watchlistsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:913a8eb4&amp;action=edit 1d490f51]&lt;br&gt;
+[[MediaWiki_talk:913a8eb4|Talk]]
 &lt;/td&gt;&lt;td&gt;
 (for user &amp;quot;$1&amp;quot;)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchlistsub</title></template>
+<template lineStart="1"><title>int:913a8eb4</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchmethod-list&amp;action=edit watchmethod-list]&lt;br&gt;
-[[MediaWiki_talk:Watchmethod-list|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:983ce9b1&amp;action=edit b5396cea]&lt;br&gt;
+[[MediaWiki_talk:983ce9b1|Talk]]
 &lt;/td&gt;&lt;td&gt;
 checking watched pages for recent edits
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchmethod-list</title></template>
+<template lineStart="1"><title>int:983ce9b1</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchmethod-recent&amp;action=edit watchmethod-recent]&lt;br&gt;
-[[MediaWiki_talk:Watchmethod-recent|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2e5e56e2&amp;action=edit c69b87d2]&lt;br&gt;
+[[MediaWiki_talk:2e5e56e2|Talk]]
 &lt;/td&gt;&lt;td&gt;
 checking recent edits for watched pages
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchmethod-recent</title></template>
+<template lineStart="1"><title>int:2e5e56e2</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnochange&amp;action=edit watchnochange]&lt;br&gt;
-[[MediaWiki_talk:Watchnochange|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cdd40087&amp;action=edit 24353550]&lt;br&gt;
+[[MediaWiki_talk:cdd40087|Talk]]
 &lt;/td&gt;&lt;td&gt;
 None of your watched items were edited in the time period displayed.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchnochange</title></template>
+<template lineStart="1"><title>int:cdd40087</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnologin&amp;action=edit watchnologin]&lt;br&gt;
-[[MediaWiki_talk:Watchnologin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ec51da09&amp;action=edit c873a8c3]&lt;br&gt;
+[[MediaWiki_talk:ec51da09|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Not logged in
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchnologin</title></template>
+<template lineStart="1"><title>int:ec51da09</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnologintext&amp;action=edit watchnologintext]&lt;br&gt;
-[[MediaWiki_talk:Watchnologintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7870af11&amp;action=edit 080c4da9]&lt;br&gt;
+[[MediaWiki_talk:7870af11|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You must be &amp;lt;a href=&amp;quot;/wiki/Special:Userlogin&amp;quot;&amp;gt;logged in&amp;lt;/a&amp;gt;
 to modify your watchlist.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchnologintext</title></template>
+<template lineStart="1"><title>int:7870af11</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchthis&amp;action=edit watchthis]&lt;br&gt;
-[[MediaWiki_talk:Watchthis|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2fa65d73&amp;action=edit 89758668]&lt;br&gt;
+[[MediaWiki_talk:2fa65d73|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Watch this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchthis</title></template>
+<template lineStart="1"><title>int:2fa65d73</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchthispage&amp;action=edit watchthispage]&lt;br&gt;
-[[MediaWiki_talk:Watchthispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:79260dc8&amp;action=edit d94c2857]&lt;br&gt;
+[[MediaWiki_talk:79260dc8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Watch this page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchthispage</title></template>
+<template lineStart="1"><title>int:79260dc8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Welcomecreation&amp;action=edit welcomecreation]&lt;br&gt;
-[[MediaWiki_talk:Welcomecreation|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:622a355f&amp;action=edit 5b3750aa]&lt;br&gt;
+[[MediaWiki_talk:622a355f|Talk]]
 &lt;/td&gt;&lt;td&gt;
 &amp;lt;h2&amp;gt;Welcome, $1!&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;Your account has been created.
 Don&amp;#39;t forget to change your Wiktionary preferences.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Welcomecreation</title></template>
+<template lineStart="1"><title>int:622a355f</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whatlinkshere&amp;action=edit whatlinkshere]&lt;br&gt;
-[[MediaWiki_talk:Whatlinkshere|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bde1fbba&amp;action=edit 28d0e2a8]&lt;br&gt;
+[[MediaWiki_talk:bde1fbba|Talk]]
 &lt;/td&gt;&lt;td&gt;
 What links here
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whatlinkshere</title></template>
+<template lineStart="1"><title>int:bde1fbba</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistacctext&amp;action=edit whitelistacctext]&lt;br&gt;
-[[MediaWiki_talk:Whitelistacctext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:53f0999a&amp;action=edit b3775e04]&lt;br&gt;
+[[MediaWiki_talk:53f0999a|Talk]]
 &lt;/td&gt;&lt;td&gt;
 To be allowed to create accounts in this Wiki you have to &amp;#91;&amp;#91;Special:Userlogin&amp;#124;log]] in and have the appropriate permissions.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistacctext</title></template>
+<template lineStart="1"><title>int:53f0999a</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistacctitle&amp;action=edit whitelistacctitle]&lt;br&gt;
-[[MediaWiki_talk:Whitelistacctitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:901574b0&amp;action=edit 13f7d937]&lt;br&gt;
+[[MediaWiki_talk:901574b0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You are not allowed to create an account
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistacctitle</title></template>
+<template lineStart="1"><title>int:901574b0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistedittext&amp;action=edit whitelistedittext]&lt;br&gt;
-[[MediaWiki_talk:Whitelistedittext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:28589651&amp;action=edit 8d93b543]&lt;br&gt;
+[[MediaWiki_talk:28589651|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You have to &amp;#91;&amp;#91;Special:Userlogin&amp;#124;login]] to edit pages.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistedittext</title></template>
+<template lineStart="1"><title>int:28589651</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistedittitle&amp;action=edit whitelistedittitle]&lt;br&gt;
-[[MediaWiki_talk:Whitelistedittitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d4e0db33&amp;action=edit 76713eb6]&lt;br&gt;
+[[MediaWiki_talk:d4e0db33|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Login required to edit
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistedittitle</title></template>
+<template lineStart="1"><title>int:d4e0db33</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistreadtext&amp;action=edit whitelistreadtext]&lt;br&gt;
-[[MediaWiki_talk:Whitelistreadtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7046be67&amp;action=edit 3c46b4af]&lt;br&gt;
+[[MediaWiki_talk:7046be67|Talk]]
 &lt;/td&gt;&lt;td&gt;
 You have to &amp;#91;&amp;#91;Special:Userlogin&amp;#124;login]] to read pages.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistreadtext</title></template>
+<template lineStart="1"><title>int:7046be67</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistreadtitle&amp;action=edit whitelistreadtitle]&lt;br&gt;
-[[MediaWiki_talk:Whitelistreadtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:56f7b6c8&amp;action=edit 27809c2a]&lt;br&gt;
+[[MediaWiki_talk:56f7b6c8|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Login required to read
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistreadtitle</title></template>
+<template lineStart="1"><title>int:56f7b6c8</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wikipediapage&amp;action=edit wikipediapage]&lt;br&gt;
-[[MediaWiki_talk:Wikipediapage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8815fbb3&amp;action=edit 80a9ff8d]&lt;br&gt;
+[[MediaWiki_talk:8815fbb3|Talk]]
 &lt;/td&gt;&lt;td&gt;
 View project page
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wikipediapage</title></template>
+<template lineStart="1"><title>int:8815fbb3</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wikititlesuffix&amp;action=edit wikititlesuffix]&lt;br&gt;
-[[MediaWiki_talk:Wikititlesuffix|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d00a5142&amp;action=edit 937cdab5]&lt;br&gt;
+[[MediaWiki_talk:d00a5142|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Wiktionary
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wikititlesuffix</title></template>
+<template lineStart="1"><title>int:d00a5142</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlnote&amp;action=edit wlnote]&lt;br&gt;
-[[MediaWiki_talk:Wlnote|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a7ee1c5c&amp;action=edit b6ea8219]&lt;br&gt;
+[[MediaWiki_talk:a7ee1c5c|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Below are the last $1 changes in the last &amp;lt;b&amp;gt;$2&amp;lt;/b&amp;gt; hours.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wlnote</title></template>
+<template lineStart="1"><title>int:a7ee1c5c</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlsaved&amp;action=edit wlsaved]&lt;br&gt;
-[[MediaWiki_talk:Wlsaved|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:deb21c59&amp;action=edit 843af08d]&lt;br&gt;
+[[MediaWiki_talk:deb21c59|Talk]]
 &lt;/td&gt;&lt;td&gt;
 This is a saved version of your watchlist.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wlsaved</title></template>
+<template lineStart="1"><title>int:deb21c59</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlshowlast&amp;action=edit wlshowlast]&lt;br&gt;
-[[MediaWiki_talk:Wlshowlast|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e77517fa&amp;action=edit 89821357]&lt;br&gt;
+[[MediaWiki_talk:e77517fa|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Show last $1 hours $2 days $3
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wlshowlast</title></template>
+<template lineStart="1"><title>int:e77517fa</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wrong_wfQuery_params&amp;action=edit wrong_wfQuery_params]&lt;br&gt;
-[[MediaWiki_talk:Wrong_wfQuery_params|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a9b62164&amp;action=edit d526a8a6]&lt;br&gt;
+[[MediaWiki_talk:a9b62164|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Incorrect parameters to wfQuery()&amp;lt;br /&amp;gt;
 Function: $1&amp;lt;br /&amp;gt;
 Query: $2
 
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wrong_wfQuery_params</title></template>
+<template lineStart="1"><title>int:a9b62164</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wrongpassword&amp;action=edit wrongpassword]&lt;br&gt;
-[[MediaWiki_talk:Wrongpassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3314dacf&amp;action=edit d8ecf7db]&lt;br&gt;
+[[MediaWiki_talk:3314dacf|Talk]]
 &lt;/td&gt;&lt;td&gt;
 The password you entered is incorrect. Please try again.
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wrongpassword</title></template>
+<template lineStart="1"><title>int:3314dacf</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourdiff&amp;action=edit yourdiff]&lt;br&gt;
-[[MediaWiki_talk:Yourdiff|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2e0414f0&amp;action=edit 4fe151ac]&lt;br&gt;
+[[MediaWiki_talk:2e0414f0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Differences
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourdiff</title></template>
+<template lineStart="1"><title>int:2e0414f0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Youremail&amp;action=edit youremail]&lt;br&gt;
-[[MediaWiki_talk:Youremail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0f5ab9c9&amp;action=edit 0a98c2ad]&lt;br&gt;
+[[MediaWiki_talk:0f5ab9c9|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your email*
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Youremail</title></template>
+<template lineStart="1"><title>int:0f5ab9c9</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourname&amp;action=edit yourname]&lt;br&gt;
-[[MediaWiki_talk:Yourname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f495043e&amp;action=edit 32d0e33a]&lt;br&gt;
+[[MediaWiki_talk:f495043e|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your user name
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourname</title></template>
+<template lineStart="1"><title>int:f495043e</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yournick&amp;action=edit yournick]&lt;br&gt;
-[[MediaWiki_talk:Yournick|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6aa78968&amp;action=edit f8b28bd9]&lt;br&gt;
+[[MediaWiki_talk:6aa78968|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your nickname (for signatures)
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yournick</title></template>
+<template lineStart="1"><title>int:6aa78968</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourpassword&amp;action=edit yourpassword]&lt;br&gt;
-[[MediaWiki_talk:Yourpassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:13a44203&amp;action=edit b48cf014]&lt;br&gt;
+[[MediaWiki_talk:13a44203|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your password
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourpassword</title></template>
+<template lineStart="1"><title>int:13a44203</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourpasswordagain&amp;action=edit yourpasswordagain]&lt;br&gt;
-[[MediaWiki_talk:Yourpasswordagain|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c0ad7f05&amp;action=edit e14a732b]&lt;br&gt;
+[[MediaWiki_talk:c0ad7f05|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Retype password
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourpasswordagain</title></template>
+<template lineStart="1"><title>int:c0ad7f05</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourrealname&amp;action=edit yourrealname]&lt;br&gt;
-[[MediaWiki_talk:Yourrealname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:519f30b5&amp;action=edit 7fc3e5b1]&lt;br&gt;
+[[MediaWiki_talk:519f30b5|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your real name*
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourrealname</title></template>
+<template lineStart="1"><title>int:519f30b5</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourtext&amp;action=edit yourtext]&lt;br&gt;
-[[MediaWiki_talk:Yourtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f98650e0&amp;action=edit 5b5af4ea]&lt;br&gt;
+[[MediaWiki_talk:f98650e0|Talk]]
 &lt;/td&gt;&lt;td&gt;
 Your text
 &lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourtext</title></template>
+<template lineStart="1"><title>int:f98650e0</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
 
 </root>
\ No newline at end of file
index cdc223a..3212ae1 100644 (file)
@@ -1,4 +1,4 @@
-{{int:allmessagestext}}
+{{int:57dbe26a}}
 
 <table border=1 width=100%><tr><td>
 '''Name'''
 </td><td>
 '''Current text'''
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1movedto2&action=edit 1movedto2]<br>
-[[MediaWiki_talk:1movedto2|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f9cca05b&action=edit f9cca05b]<br>
+[[MediaWiki_talk:f9cca05b|Talk]]
 </td><td>
 $1 moved to $2
 </td><td>
-{{int:1movedto2}}
+{{int:f9cca05b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Monobook.css&action=edit Monobook.css]<br>
-[[MediaWiki_talk:Monobook.css|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ed065216&action=edit ed065216]<br>
+[[MediaWiki_talk:ed065216|Talk]]
 </td><td>
 /* edit this file to customize the monobook skin for the entire site */
 </td><td>
-{{int:Monobook.css}}
+{{int:ed065216}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:About&action=edit about]<br>
-[[MediaWiki_talk:About|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6b21fb79&action=edit 5780daf6]<br>
+[[MediaWiki_talk:6b21fb79|Talk]]
 </td><td>
 About
 </td><td>
-{{int:About}}
+{{int:6b21fb79}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Aboutpage&action=edit aboutpage]<br>
-[[MediaWiki_talk:Aboutpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:54f19e13&action=edit 4bd9b804]<br>
+[[MediaWiki_talk:54f19e13|Talk]]
 </td><td>
 Wiktionary:About
 </td><td>
-{{int:Aboutpage}}
+{{int:54f19e13}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Aboutwikipedia&action=edit aboutwikipedia]<br>
-[[MediaWiki_talk:Aboutwikipedia|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8e17cc1b&action=edit 7be96c69]<br>
+[[MediaWiki_talk:8e17cc1b|Talk]]
 </td><td>
 About Wiktionary
 </td><td>
-{{int:Aboutwikipedia}}
+{{int:8e17cc1b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-addsection&action=edit accesskey-addsection]<br>
-[[MediaWiki_talk:Accesskey-addsection|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4b7f0428&action=edit 69f5ae1e]<br>
+[[MediaWiki_talk:4b7f0428|Talk]]
 </td><td>
 +
 </td><td>
-{{int:Accesskey-addsection}}
+{{int:4b7f0428}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-anontalk&action=edit accesskey-anontalk]<br>
-[[MediaWiki_talk:Accesskey-anontalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b18a7fba&action=edit ba8c9426]<br>
+[[MediaWiki_talk:b18a7fba|Talk]]
 </td><td>
 n
 </td><td>
-{{int:Accesskey-anontalk}}
+{{int:b18a7fba}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-anonuserpage&action=edit accesskey-anonuserpage]<br>
-[[MediaWiki_talk:Accesskey-anonuserpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3cfd08b4&action=edit 098256f5]<br>
+[[MediaWiki_talk:3cfd08b4|Talk]]
 </td><td>
 .
 </td><td>
-{{int:Accesskey-anonuserpage}}
+{{int:3cfd08b4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-article&action=edit accesskey-article]<br>
-[[MediaWiki_talk:Accesskey-article|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d00706c5&action=edit 7638fc38]<br>
+[[MediaWiki_talk:d00706c5|Talk]]
 </td><td>
 a
 </td><td>
-{{int:Accesskey-article}}
+{{int:d00706c5}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-compareselectedversions&action=edit accesskey-compareselectedversions]<br>
-[[MediaWiki_talk:Accesskey-compareselectedversions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7bbcdfc9&action=edit 840afed8]<br>
+[[MediaWiki_talk:7bbcdfc9|Talk]]
 </td><td>
 v
 </td><td>
-{{int:Accesskey-compareselectedversions}}
+{{int:7bbcdfc9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-contributions&action=edit accesskey-contributions]<br>
-[[MediaWiki_talk:Accesskey-contributions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0750ed4b&action=edit 9703e6d9]<br>
+[[MediaWiki_talk:0750ed4b|Talk]]
 </td><td>
 &amp;lt;accesskey-contributions&amp;gt;
 </td><td>
-{{int:Accesskey-contributions}}
+{{int:0750ed4b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-currentevents&action=edit accesskey-currentevents]<br>
-[[MediaWiki_talk:Accesskey-currentevents|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:602dda6f&action=edit 7e13f963]<br>
+[[MediaWiki_talk:602dda6f|Talk]]
 </td><td>
 &amp;lt;accesskey-currentevents&amp;gt;
 </td><td>
-{{int:Accesskey-currentevents}}
+{{int:602dda6f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-delete&action=edit accesskey-delete]<br>
-[[MediaWiki_talk:Accesskey-delete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a395260e&action=edit be42f966]<br>
+[[MediaWiki_talk:a395260e|Talk]]
 </td><td>
 d
 </td><td>
-{{int:Accesskey-delete}}
+{{int:a395260e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-edit&action=edit accesskey-edit]<br>
-[[MediaWiki_talk:Accesskey-edit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f89faca3&action=edit 89888a71]<br>
+[[MediaWiki_talk:f89faca3|Talk]]
 </td><td>
 e
 </td><td>
-{{int:Accesskey-edit}}
+{{int:f89faca3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-emailuser&action=edit accesskey-emailuser]<br>
-[[MediaWiki_talk:Accesskey-emailuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bc7a3e78&action=edit 7b2ee991]<br>
+[[MediaWiki_talk:bc7a3e78|Talk]]
 </td><td>
 &amp;lt;accesskey-emailuser&amp;gt;
 </td><td>
-{{int:Accesskey-emailuser}}
+{{int:bc7a3e78}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-help&action=edit accesskey-help]<br>
-[[MediaWiki_talk:Accesskey-help|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9e9d3613&action=edit fe788279]<br>
+[[MediaWiki_talk:9e9d3613|Talk]]
 </td><td>
 &amp;lt;accesskey-help&amp;gt;
 </td><td>
-{{int:Accesskey-help}}
+{{int:9e9d3613}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-history&action=edit accesskey-history]<br>
-[[MediaWiki_talk:Accesskey-history|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7ea0e322&action=edit 4bb7a2e4]<br>
+[[MediaWiki_talk:7ea0e322|Talk]]
 </td><td>
 h
 </td><td>
-{{int:Accesskey-history}}
+{{int:7ea0e322}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-login&action=edit accesskey-login]<br>
-[[MediaWiki_talk:Accesskey-login|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4204d3db&action=edit 725cb6bf]<br>
+[[MediaWiki_talk:4204d3db|Talk]]
 </td><td>
 o
 </td><td>
-{{int:Accesskey-login}}
+{{int:4204d3db}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-logout&action=edit accesskey-logout]<br>
-[[MediaWiki_talk:Accesskey-logout|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a92e37a&action=edit a1de2049]<br>
+[[MediaWiki_talk:2a92e37a|Talk]]
 </td><td>
 o
 </td><td>
-{{int:Accesskey-logout}}
+{{int:2a92e37a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mainpage&action=edit accesskey-mainpage]<br>
-[[MediaWiki_talk:Accesskey-mainpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:68d388ec&action=edit 0542623d]<br>
+[[MediaWiki_talk:68d388ec|Talk]]
 </td><td>
 z
 </td><td>
-{{int:Accesskey-mainpage}}
+{{int:68d388ec}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-minoredit&action=edit accesskey-minoredit]<br>
-[[MediaWiki_talk:Accesskey-minoredit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:18fe1121&action=edit e3f25b72]<br>
+[[MediaWiki_talk:18fe1121|Talk]]
 </td><td>
 i
 </td><td>
-{{int:Accesskey-minoredit}}
+{{int:18fe1121}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-move&action=edit accesskey-move]<br>
-[[MediaWiki_talk:Accesskey-move|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6d15983f&action=edit c9d212d3]<br>
+[[MediaWiki_talk:6d15983f|Talk]]
 </td><td>
 m
 </td><td>
-{{int:Accesskey-move}}
+{{int:6d15983f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mycontris&action=edit accesskey-mycontris]<br>
-[[MediaWiki_talk:Accesskey-mycontris|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ecaba7f4&action=edit ac57178f]<br>
+[[MediaWiki_talk:ecaba7f4|Talk]]
 </td><td>
 y
 </td><td>
-{{int:Accesskey-mycontris}}
+{{int:ecaba7f4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mytalk&action=edit accesskey-mytalk]<br>
-[[MediaWiki_talk:Accesskey-mytalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:711aec5d&action=edit 6d3ae9a7]<br>
+[[MediaWiki_talk:711aec5d|Talk]]
 </td><td>
 n
 </td><td>
-{{int:Accesskey-mytalk}}
+{{int:711aec5d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-portal&action=edit accesskey-portal]<br>
-[[MediaWiki_talk:Accesskey-portal|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9905f56f&action=edit 0a376cab]<br>
+[[MediaWiki_talk:9905f56f|Talk]]
 </td><td>
 &amp;lt;accesskey-portal&amp;gt;
 </td><td>
-{{int:Accesskey-portal}}
+{{int:9905f56f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-preferences&action=edit accesskey-preferences]<br>
-[[MediaWiki_talk:Accesskey-preferences|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9305eef3&action=edit e72912be]<br>
+[[MediaWiki_talk:9305eef3|Talk]]
 </td><td>
 &amp;lt;accesskey-preferences&amp;gt;
 </td><td>
-{{int:Accesskey-preferences}}
+{{int:9305eef3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-preview&action=edit accesskey-preview]<br>
-[[MediaWiki_talk:Accesskey-preview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:186ee8a4&action=edit cef51de6]<br>
+[[MediaWiki_talk:186ee8a4|Talk]]
 </td><td>
 p
 </td><td>
-{{int:Accesskey-preview}}
+{{int:186ee8a4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-protect&action=edit accesskey-protect]<br>
-[[MediaWiki_talk:Accesskey-protect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:676f28e9&action=edit 0f10afb5]<br>
+[[MediaWiki_talk:676f28e9|Talk]]
 </td><td>
 =
 </td><td>
-{{int:Accesskey-protect}}
+{{int:676f28e9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-randompage&action=edit accesskey-randompage]<br>
-[[MediaWiki_talk:Accesskey-randompage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1a09f43e&action=edit 46a4e82c]<br>
+[[MediaWiki_talk:1a09f43e|Talk]]
 </td><td>
 x
 </td><td>
-{{int:Accesskey-randompage}}
+{{int:1a09f43e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-recentchanges&action=edit accesskey-recentchanges]<br>
-[[MediaWiki_talk:Accesskey-recentchanges|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1306607d&action=edit 025b667f]<br>
+[[MediaWiki_talk:1306607d|Talk]]
 </td><td>
 r
 </td><td>
-{{int:Accesskey-recentchanges}}
+{{int:1306607d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-recentchangeslinked&action=edit accesskey-recentchangeslinked]<br>
-[[MediaWiki_talk:Accesskey-recentchangeslinked|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e14390c4&action=edit 600e8a44]<br>
+[[MediaWiki_talk:e14390c4|Talk]]
 </td><td>
 c
 </td><td>
-{{int:Accesskey-recentchangeslinked}}
+{{int:e14390c4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-save&action=edit accesskey-save]<br>
-[[MediaWiki_talk:Accesskey-save|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:59b75a10&action=edit 0fde75cd]<br>
+[[MediaWiki_talk:59b75a10|Talk]]
 </td><td>
 s
 </td><td>
-{{int:Accesskey-save}}
+{{int:59b75a10}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-search&action=edit accesskey-search]<br>
-[[MediaWiki_talk:Accesskey-search|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0b6fd89e&action=edit 5163ba5b]<br>
+[[MediaWiki_talk:0b6fd89e|Talk]]
 </td><td>
 f
 </td><td>
-{{int:Accesskey-search}}
+{{int:0b6fd89e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-sitesupport&action=edit accesskey-sitesupport]<br>
-[[MediaWiki_talk:Accesskey-sitesupport|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ba9e0fc4&action=edit f70dbcff]<br>
+[[MediaWiki_talk:ba9e0fc4|Talk]]
 </td><td>
 &amp;lt;accesskey-sitesupport&amp;gt;
 </td><td>
-{{int:Accesskey-sitesupport}}
+{{int:ba9e0fc4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-specialpage&action=edit accesskey-specialpage]<br>
-[[MediaWiki_talk:Accesskey-specialpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b932fee9&action=edit 8949be8d]<br>
+[[MediaWiki_talk:b932fee9|Talk]]
 </td><td>
 &amp;lt;accesskey-specialpage&amp;gt;
 </td><td>
-{{int:Accesskey-specialpage}}
+{{int:b932fee9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-specialpages&action=edit accesskey-specialpages]<br>
-[[MediaWiki_talk:Accesskey-specialpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1ac10275&action=edit 59a5e487]<br>
+[[MediaWiki_talk:1ac10275|Talk]]
 </td><td>
 q
 </td><td>
-{{int:Accesskey-specialpages}}
+{{int:1ac10275}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-talk&action=edit accesskey-talk]<br>
-[[MediaWiki_talk:Accesskey-talk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:116fd1b0&action=edit a83f2193]<br>
+[[MediaWiki_talk:116fd1b0|Talk]]
 </td><td>
 t
 </td><td>
-{{int:Accesskey-talk}}
+{{int:116fd1b0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-undelete&action=edit accesskey-undelete]<br>
-[[MediaWiki_talk:Accesskey-undelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ec06f1a7&action=edit 5894e42e]<br>
+[[MediaWiki_talk:ec06f1a7|Talk]]
 </td><td>
 d
 </td><td>
-{{int:Accesskey-undelete}}
+{{int:ec06f1a7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-unwatch&action=edit accesskey-unwatch]<br>
-[[MediaWiki_talk:Accesskey-unwatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7f99a8c2&action=edit 2a2a9d13]<br>
+[[MediaWiki_talk:7f99a8c2|Talk]]
 </td><td>
 w
 </td><td>
-{{int:Accesskey-unwatch}}
+{{int:7f99a8c2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-upload&action=edit accesskey-upload]<br>
-[[MediaWiki_talk:Accesskey-upload|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:903549e8&action=edit 3a1dcde8]<br>
+[[MediaWiki_talk:903549e8|Talk]]
 </td><td>
 u
 </td><td>
-{{int:Accesskey-upload}}
+{{int:903549e8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-userpage&action=edit accesskey-userpage]<br>
-[[MediaWiki_talk:Accesskey-userpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8f696cc0&action=edit be76a8c2]<br>
+[[MediaWiki_talk:8f696cc0|Talk]]
 </td><td>
 .
 </td><td>
-{{int:Accesskey-userpage}}
+{{int:8f696cc0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-viewsource&action=edit accesskey-viewsource]<br>
-[[MediaWiki_talk:Accesskey-viewsource|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:613ebbad&action=edit e467bdec]<br>
+[[MediaWiki_talk:613ebbad|Talk]]
 </td><td>
 e
 </td><td>
-{{int:Accesskey-viewsource}}
+{{int:613ebbad}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-watch&action=edit accesskey-watch]<br>
-[[MediaWiki_talk:Accesskey-watch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f598b5d6&action=edit 8bbdd8ad]<br>
+[[MediaWiki_talk:f598b5d6|Talk]]
 </td><td>
 w
 </td><td>
-{{int:Accesskey-watch}}
+{{int:f598b5d6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-watchlist&action=edit accesskey-watchlist]<br>
-[[MediaWiki_talk:Accesskey-watchlist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:59863979&action=edit f8563593]<br>
+[[MediaWiki_talk:59863979|Talk]]
 </td><td>
 l
 </td><td>
-{{int:Accesskey-watchlist}}
+{{int:59863979}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-whatlinkshere&action=edit accesskey-whatlinkshere]<br>
-[[MediaWiki_talk:Accesskey-whatlinkshere|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:00143391&action=edit 016415ff]<br>
+[[MediaWiki_talk:00143391|Talk]]
 </td><td>
 b
 </td><td>
-{{int:Accesskey-whatlinkshere}}
+{{int:00143391}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accmailtext&action=edit accmailtext]<br>
-[[MediaWiki_talk:Accmailtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d4dce921&action=edit c90b0565]<br>
+[[MediaWiki_talk:d4dce921|Talk]]
 </td><td>
 The Password for &#39;$1&#39; has been sent to $2.
 </td><td>
-{{int:Accmailtext}}
+{{int:d4dce921}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accmailtitle&action=edit accmailtitle]<br>
-[[MediaWiki_talk:Accmailtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9e6cd678&action=edit 05cb31f3]<br>
+[[MediaWiki_talk:9e6cd678|Talk]]
 </td><td>
 Password sent.
 </td><td>
-{{int:Accmailtitle}}
+{{int:9e6cd678}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Actioncomplete&action=edit actioncomplete]<br>
-[[MediaWiki_talk:Actioncomplete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:37186ec6&action=edit 6703566b]<br>
+[[MediaWiki_talk:37186ec6|Talk]]
 </td><td>
 Action complete
 </td><td>
-{{int:Actioncomplete}}
+{{int:37186ec6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addedwatch&action=edit addedwatch]<br>
-[[MediaWiki_talk:Addedwatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2bacba53&action=edit 9a954e94]<br>
+[[MediaWiki_talk:2bacba53|Talk]]
 </td><td>
 Added to watchlist
 </td><td>
-{{int:Addedwatch}}
+{{int:2bacba53}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addedwatchtext&action=edit addedwatchtext]<br>
-[[MediaWiki_talk:Addedwatchtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b28893b8&action=edit cb101aa3]<br>
+[[MediaWiki_talk:b28893b8|Talk]]
 </td><td>
 The page &quot;$1&quot; has been added to your &#91;&#91;Special:Watchlist&#124;watchlist]].
 Future changes to this page and its associated Talk page will be listed there,
@@ -360,150 +360,150 @@ make it easier to pick out.
 
 &lt;p&gt;If you want to remove the page from your watchlist later, click &quot;Stop watching&quot; in the sidebar.
 </td><td>
-{{int:Addedwatchtext}}
+{{int:b28893b8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addsection&action=edit addsection]<br>
-[[MediaWiki_talk:Addsection|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:291bfe3c&action=edit 788205f7]<br>
+[[MediaWiki_talk:291bfe3c|Talk]]
 </td><td>
 +
 </td><td>
-{{int:Addsection}}
+{{int:291bfe3c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Administrators&action=edit administrators]<br>
-[[MediaWiki_talk:Administrators|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0d4d418a&action=edit 69189a95]<br>
+[[MediaWiki_talk:0d4d418a|Talk]]
 </td><td>
 Wiktionary:Administrators
 </td><td>
-{{int:Administrators}}
+{{int:0d4d418a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Affirmation&action=edit affirmation]<br>
-[[MediaWiki_talk:Affirmation|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1b4ceeda&action=edit f61e4837]<br>
+[[MediaWiki_talk:1b4ceeda|Talk]]
 </td><td>
 I affirm that the copyright holder of this file
 agrees to license it under the terms of the $1.
 </td><td>
-{{int:Affirmation}}
+{{int:1b4ceeda}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:All&action=edit all]<br>
-[[MediaWiki_talk:All|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6a720856&action=edit d87c4480]<br>
+[[MediaWiki_talk:6a720856|Talk]]
 </td><td>
 all
 </td><td>
-{{int:All}}
+{{int:6a720856}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allmessages&action=edit allmessages]<br>
-[[MediaWiki_talk:Allmessages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f2fab435&action=edit a6623c77]<br>
+[[MediaWiki_talk:f2fab435|Talk]]
 </td><td>
 All system messages
 </td><td>
-{{int:Allmessages}}
+{{int:f2fab435}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allmessagestext&action=edit allmessagestext]<br>
-[[MediaWiki_talk:Allmessagestext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e57c77b8&action=edit 57dbe26a]<br>
+[[MediaWiki_talk:e57c77b8|Talk]]
 </td><td>
 This is a list of all system messages available in the MediaWiki: namespace.
 </td><td>
-{{int:Allmessagestext}}
+{{int:e57c77b8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allpages&action=edit allpages]<br>
-[[MediaWiki_talk:Allpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ff8db74d&action=edit bf1dccf6]<br>
+[[MediaWiki_talk:ff8db74d|Talk]]
 </td><td>
 All pages
 </td><td>
-{{int:Allpages}}
+{{int:ff8db74d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alphaindexline&action=edit alphaindexline]<br>
-[[MediaWiki_talk:Alphaindexline|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:89c23e53&action=edit 1ee05de8]<br>
+[[MediaWiki_talk:89c23e53|Talk]]
 </td><td>
 $1 to $2
 </td><td>
-{{int:Alphaindexline}}
+{{int:89c23e53}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alreadyloggedin&action=edit alreadyloggedin]<br>
-[[MediaWiki_talk:Alreadyloggedin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8550125b&action=edit 0dc174ae]<br>
+[[MediaWiki_talk:8550125b|Talk]]
 </td><td>
 &lt;font color=red&gt;&lt;b&gt;User $1, you are already logged in!&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
 
 </td><td>
-{{int:Alreadyloggedin}}
+{{int:8550125b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alreadyrolled&action=edit alreadyrolled]<br>
-[[MediaWiki_talk:Alreadyrolled|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3f7be8a8&action=edit 3f1bd6a1]<br>
+[[MediaWiki_talk:3f7be8a8|Talk]]
 </td><td>
 Cannot rollback last edit of &#91;&#91;$1]]
 by &#91;&#91;User:$2&#124;$2]] (&#91;&#91;User talk:$2&#124;Talk]]); someone else has edited or rolled back the page already. 
 
 Last edit was by &#91;&#91;User:$3&#124;$3]] (&#91;&#91;User talk:$3&#124;Talk]]). 
 </td><td>
-{{int:Alreadyrolled}}
+{{int:3f7be8a8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ancientpages&action=edit ancientpages]<br>
-[[MediaWiki_talk:Ancientpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:49a4df39&action=edit 4f70712f]<br>
+[[MediaWiki_talk:49a4df39|Talk]]
 </td><td>
 Oldest pages
 </td><td>
-{{int:Ancientpages}}
+{{int:49a4df39}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:And&action=edit and]<br>
-[[MediaWiki_talk:And|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a01e33f4&action=edit cffa50a3]<br>
+[[MediaWiki_talk:a01e33f4|Talk]]
 </td><td>
 and
 </td><td>
-{{int:And}}
+{{int:a01e33f4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anontalk&action=edit anontalk]<br>
-[[MediaWiki_talk:Anontalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:20cb482e&action=edit 801db13e]<br>
+[[MediaWiki_talk:20cb482e|Talk]]
 </td><td>
 Talk for this IP
 </td><td>
-{{int:Anontalk}}
+{{int:20cb482e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anontalkpagetext&action=edit anontalkpagetext]<br>
-[[MediaWiki_talk:Anontalkpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5bbc19f4&action=edit 07575f81]<br>
+[[MediaWiki_talk:5bbc19f4|Talk]]
 </td><td>
 ----&#39;&#39;This is the discussion page for an anonymous user who has not created an account yet or who does not use it. We therefore have to use the numerical &#91;&#91;IP address]] to identify him/her. Such an IP address can be shared by several users. If you are an anonymous user and feel that irrelevant comments have been directed at you, please &#91;&#91;Special:Userlogin&#124;create an account or log in]] to avoid future confusion with other anonymous users.&#39;&#39; 
 </td><td>
-{{int:Anontalkpagetext}}
+{{int:5bbc19f4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anonymous&action=edit anonymous]<br>
-[[MediaWiki_talk:Anonymous|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9bed5104&action=edit 0a92fab3]<br>
+[[MediaWiki_talk:9bed5104|Talk]]
 </td><td>
 Anonymous user(s) of Wiktionary
 </td><td>
-{{int:Anonymous}}
+{{int:9bed5104}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Article&action=edit article]<br>
-[[MediaWiki_talk:Article|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4360c2dc&action=edit 565cecd7]<br>
+[[MediaWiki_talk:4360c2dc|Talk]]
 </td><td>
 Content page
 </td><td>
-{{int:Article}}
+{{int:4360c2dc}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Articleexists&action=edit articleexists]<br>
-[[MediaWiki_talk:Articleexists|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d3ee4a57&action=edit ac8af25b]<br>
+[[MediaWiki_talk:d3ee4a57|Talk]]
 </td><td>
 A page of that name already exists, or the
 name you have chosen is not valid.
 Please choose another name.
 </td><td>
-{{int:Articleexists}}
+{{int:d3ee4a57}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Articlepage&action=edit articlepage]<br>
-[[MediaWiki_talk:Articlepage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:494f1af2&action=edit 01d643b6]<br>
+[[MediaWiki_talk:494f1af2|Talk]]
 </td><td>
 View content page
 </td><td>
-{{int:Articlepage}}
+{{int:494f1af2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Asksql&action=edit asksql]<br>
-[[MediaWiki_talk:Asksql|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dc93382e&action=edit 4e529571]<br>
+[[MediaWiki_talk:dc93382e|Talk]]
 </td><td>
 SQL query
 </td><td>
-{{int:Asksql}}
+{{int:dc93382e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Asksqltext&action=edit asksqltext]<br>
-[[MediaWiki_talk:Asksqltext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d12f6023&action=edit 47551563]<br>
+[[MediaWiki_talk:d12f6023|Talk]]
 </td><td>
 Use the form below to make a direct query of the
 database.
@@ -511,52 +511,52 @@ Use single quotes (&#39;like this&#39;) to delimit string literals.
 This can often add considerable load to the server, so please use
 this function sparingly.
 </td><td>
-{{int:Asksqltext}}
+{{int:d12f6023}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Autoblocker&action=edit autoblocker]<br>
-[[MediaWiki_talk:Autoblocker|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f36efd21&action=edit d8f0b5e0]<br>
+[[MediaWiki_talk:f36efd21|Talk]]
 </td><td>
 Autoblocked because you share an IP address with &quot;$1&quot;. Reason &quot;$2&quot;.
 </td><td>
-{{int:Autoblocker}}
+{{int:f36efd21}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badarticleerror&action=edit badarticleerror]<br>
-[[MediaWiki_talk:Badarticleerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9503e2b1&action=edit 100ce8a2]<br>
+[[MediaWiki_talk:9503e2b1|Talk]]
 </td><td>
 This action cannot be performed on this page.
 </td><td>
-{{int:Badarticleerror}}
+{{int:9503e2b1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badfilename&action=edit badfilename]<br>
-[[MediaWiki_talk:Badfilename|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f146770f&action=edit 5c50b102]<br>
+[[MediaWiki_talk:f146770f|Talk]]
 </td><td>
 Image name has been changed to &quot;$1&quot;.
 </td><td>
-{{int:Badfilename}}
+{{int:f146770f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badfiletype&action=edit badfiletype]<br>
-[[MediaWiki_talk:Badfiletype|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a87ee981&action=edit fe89c3de]<br>
+[[MediaWiki_talk:a87ee981|Talk]]
 </td><td>
 &quot;.$1&quot; is not a recommended image file format.
 </td><td>
-{{int:Badfiletype}}
+{{int:a87ee981}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badipaddress&action=edit badipaddress]<br>
-[[MediaWiki_talk:Badipaddress|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0222775a&action=edit c7623eeb]<br>
+[[MediaWiki_talk:0222775a|Talk]]
 </td><td>
 Invalid IP address
 </td><td>
-{{int:Badipaddress}}
+{{int:0222775a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badquery&action=edit badquery]<br>
-[[MediaWiki_talk:Badquery|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:feabd786&action=edit 798bc46a]<br>
+[[MediaWiki_talk:feabd786|Talk]]
 </td><td>
 Badly formed search query
 </td><td>
-{{int:Badquery}}
+{{int:feabd786}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badquerytext&action=edit badquerytext]<br>
-[[MediaWiki_talk:Badquerytext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7e82f04b&action=edit e5493056]<br>
+[[MediaWiki_talk:7e82f04b|Talk]]
 </td><td>
 We could not process your query.
 This is probably because you have attempted to search for a
@@ -565,39 +565,39 @@ It could also be that you have mistyped the expression, for
 example &quot;fish and and scales&quot;.
 Please try another query.
 </td><td>
-{{int:Badquerytext}}
+{{int:7e82f04b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badretype&action=edit badretype]<br>
-[[MediaWiki_talk:Badretype|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:36ad01d4&action=edit c36e32c1]<br>
+[[MediaWiki_talk:36ad01d4|Talk]]
 </td><td>
 The passwords you entered do not match.
 </td><td>
-{{int:Badretype}}
+{{int:36ad01d4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badtitle&action=edit badtitle]<br>
-[[MediaWiki_talk:Badtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ab570b90&action=edit 5c0f9f2b]<br>
+[[MediaWiki_talk:ab570b90|Talk]]
 </td><td>
 Bad title
 </td><td>
-{{int:Badtitle}}
+{{int:ab570b90}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badtitletext&action=edit badtitletext]<br>
-[[MediaWiki_talk:Badtitletext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:73766845&action=edit e9ac7510]<br>
+[[MediaWiki_talk:73766845|Talk]]
 </td><td>
 The requested page title was invalid, empty, or
 an incorrectly linked inter-language or inter-wiki title.
 </td><td>
-{{int:Badtitletext}}
+{{int:73766845}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blanknamespace&action=edit blanknamespace]<br>
-[[MediaWiki_talk:Blanknamespace|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ef0a17b1&action=edit ec00742f]<br>
+[[MediaWiki_talk:ef0a17b1|Talk]]
 </td><td>
 (Main)
 </td><td>
-{{int:Blanknamespace}}
+{{int:ef0a17b1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockedtext&action=edit blockedtext]<br>
-[[MediaWiki_talk:Blockedtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2fe89b37&action=edit 0756a2f3]<br>
+[[MediaWiki_talk:2fe89b37|Talk]]
 </td><td>
 Your user name or IP address has been blocked by $1.
 The reason given is this:&lt;br /&gt;&#39;&#39;$2&#39;&#39;&lt;p&gt;You may contact $1 or one of the other
@@ -608,39 +608,39 @@ Note that you may not use the &quot;email this user&quot; feature unless you hav
 Your IP address is $3. Please include this address in any queries you make.
 
 </td><td>
-{{int:Blockedtext}}
+{{int:2fe89b37}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockedtitle&action=edit blockedtitle]<br>
-[[MediaWiki_talk:Blockedtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4153985a&action=edit ee09eebe]<br>
+[[MediaWiki_talk:4153985a|Talk]]
 </td><td>
 User is blocked
 </td><td>
-{{int:Blockedtitle}}
+{{int:4153985a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockip&action=edit blockip]<br>
-[[MediaWiki_talk:Blockip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f8225753&action=edit 387c304e]<br>
+[[MediaWiki_talk:f8225753|Talk]]
 </td><td>
 Block user
 </td><td>
-{{int:Blockip}}
+{{int:f8225753}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockipsuccesssub&action=edit blockipsuccesssub]<br>
-[[MediaWiki_talk:Blockipsuccesssub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:178b4021&action=edit d19404ef]<br>
+[[MediaWiki_talk:178b4021|Talk]]
 </td><td>
 Block succeeded
 </td><td>
-{{int:Blockipsuccesssub}}
+{{int:178b4021}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockipsuccesstext&action=edit blockipsuccesstext]<br>
-[[MediaWiki_talk:Blockipsuccesstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c9aa5295&action=edit 8c464806]<br>
+[[MediaWiki_talk:c9aa5295|Talk]]
 </td><td>
 &quot;$1&quot; has been blocked.
 &lt;br /&gt;See &#91;&#91;Special:Ipblocklist&#124;IP block list]] to review blocks.
 </td><td>
-{{int:Blockipsuccesstext}}
+{{int:c9aa5295}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockiptext&action=edit blockiptext]<br>
-[[MediaWiki_talk:Blockiptext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d79d9fe6&action=edit ec372bf2]<br>
+[[MediaWiki_talk:d79d9fe6|Talk]]
 </td><td>
 Use the form below to block write access
 from a specific IP address or username.
@@ -649,261 +649,261 @@ accordance with &#91;&#91;Wiktionary:Policy&#124;policy]].
 Fill in a specific reason below (for example, citing particular
 pages that were vandalized).
 </td><td>
-{{int:Blockiptext}}
+{{int:d79d9fe6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklink&action=edit blocklink]<br>
-[[MediaWiki_talk:Blocklink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9a96cfdc&action=edit 1c6c7aa2]<br>
+[[MediaWiki_talk:9a96cfdc|Talk]]
 </td><td>
 block
 </td><td>
-{{int:Blocklink}}
+{{int:9a96cfdc}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklistline&action=edit blocklistline]<br>
-[[MediaWiki_talk:Blocklistline|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b81f5cad&action=edit b821b758]<br>
+[[MediaWiki_talk:b81f5cad|Talk]]
 </td><td>
 $1, $2 blocked $3 (expires $4)
 </td><td>
-{{int:Blocklistline}}
+{{int:b81f5cad}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogentry&action=edit blocklogentry]<br>
-[[MediaWiki_talk:Blocklogentry|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0871a19a&action=edit 9be87d66]<br>
+[[MediaWiki_talk:0871a19a|Talk]]
 </td><td>
 blocked &quot;$1&quot; with an expiry time of $2
 </td><td>
-{{int:Blocklogentry}}
+{{int:0871a19a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogpage&action=edit blocklogpage]<br>
-[[MediaWiki_talk:Blocklogpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:31534d45&action=edit 4bcce96c]<br>
+[[MediaWiki_talk:31534d45|Talk]]
 </td><td>
 Block_log
 </td><td>
-{{int:Blocklogpage}}
+{{int:31534d45}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogtext&action=edit blocklogtext]<br>
-[[MediaWiki_talk:Blocklogtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f4872c71&action=edit b9902a3c]<br>
+[[MediaWiki_talk:f4872c71|Talk]]
 </td><td>
 This is a log of user blocking and unblocking actions. Automatically 
 blocked IP addresses are not be listed. See the &#91;&#91;Special:Ipblocklist&#124;IP block list]] for
 the list of currently operational bans and blocks.
 </td><td>
-{{int:Blocklogtext}}
+{{int:f4872c71}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bold_sample&action=edit bold_sample]<br>
-[[MediaWiki_talk:Bold_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d8ae34f5&action=edit e9a0daa2]<br>
+[[MediaWiki_talk:d8ae34f5|Talk]]
 </td><td>
 Bold text
 </td><td>
-{{int:Bold_sample}}
+{{int:d8ae34f5}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bold_tip&action=edit bold_tip]<br>
-[[MediaWiki_talk:Bold_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:58086558&action=edit 02320399]<br>
+[[MediaWiki_talk:58086558|Talk]]
 </td><td>
 Bold text
 </td><td>
-{{int:Bold_tip}}
+{{int:58086558}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Booksources&action=edit booksources]<br>
-[[MediaWiki_talk:Booksources|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1d546a7c&action=edit 9bd576b3]<br>
+[[MediaWiki_talk:1d546a7c|Talk]]
 </td><td>
 Book sources
 </td><td>
-{{int:Booksources}}
+{{int:1d546a7c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Booksourcetext&action=edit booksourcetext]<br>
-[[MediaWiki_talk:Booksourcetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:809e6557&action=edit 72f7a5ba]<br>
+[[MediaWiki_talk:809e6557|Talk]]
 </td><td>
 Below is a list of links to other sites that
 sell new and used books, and may also have further information
 about books you are looking for.Wiktionary is not affiliated with any of these businesses, and
 this list should not be construed as an endorsement.
 </td><td>
-{{int:Booksourcetext}}
+{{int:809e6557}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Brokenredirects&action=edit brokenredirects]<br>
-[[MediaWiki_talk:Brokenredirects|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:40925079&action=edit fe673f57]<br>
+[[MediaWiki_talk:40925079|Talk]]
 </td><td>
 Broken Redirects
 </td><td>
-{{int:Brokenredirects}}
+{{int:40925079}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Brokenredirectstext&action=edit brokenredirectstext]<br>
-[[MediaWiki_talk:Brokenredirectstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3953d564&action=edit 283e89cc]<br>
+[[MediaWiki_talk:3953d564|Talk]]
 </td><td>
 The following redirects link to a non-existing pages.
 </td><td>
-{{int:Brokenredirectstext}}
+{{int:3953d564}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bugreports&action=edit bugreports]<br>
-[[MediaWiki_talk:Bugreports|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f12ee4ee&action=edit 741bd9a7]<br>
+[[MediaWiki_talk:f12ee4ee|Talk]]
 </td><td>
 Bug reports
 </td><td>
-{{int:Bugreports}}
+{{int:f12ee4ee}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bugreportspage&action=edit bugreportspage]<br>
-[[MediaWiki_talk:Bugreportspage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1e9054cf&action=edit 7cc56699]<br>
+[[MediaWiki_talk:1e9054cf|Talk]]
 </td><td>
 Wiktionary:Bug_reports
 </td><td>
-{{int:Bugreportspage}}
+{{int:1e9054cf}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucratlog&action=edit bureaucratlog]<br>
-[[MediaWiki_talk:Bureaucratlog|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cfea7660&action=edit eaac0dcf]<br>
+[[MediaWiki_talk:cfea7660|Talk]]
 </td><td>
 Bureaucrat_log
 </td><td>
-{{int:Bureaucratlog}}
+{{int:cfea7660}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucratlogentry&action=edit bureaucratlogentry]<br>
-[[MediaWiki_talk:Bureaucratlogentry|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:04cf1ba3&action=edit cc1544ab]<br>
+[[MediaWiki_talk:04cf1ba3|Talk]]
 </td><td>
 Rights for user &quot;$1&quot; set &quot;$2&quot;
 </td><td>
-{{int:Bureaucratlogentry}}
+{{int:04cf1ba3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucrattext&action=edit bureaucrattext]<br>
-[[MediaWiki_talk:Bureaucrattext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a0750047&action=edit 5eb1e911]<br>
+[[MediaWiki_talk:a0750047|Talk]]
 </td><td>
 The action you have requested can only be
 performed by sysops with  &quot;bureaucrat&quot; status.
 </td><td>
-{{int:Bureaucrattext}}
+{{int:a0750047}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucrattitle&action=edit bureaucrattitle]<br>
-[[MediaWiki_talk:Bureaucrattitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4837977b&action=edit f523b504]<br>
+[[MediaWiki_talk:4837977b|Talk]]
 </td><td>
 Bureaucrat access required
 </td><td>
-{{int:Bureaucrattitle}}
+{{int:4837977b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bydate&action=edit bydate]<br>
-[[MediaWiki_talk:Bydate|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:590988e2&action=edit f06de085]<br>
+[[MediaWiki_talk:590988e2|Talk]]
 </td><td>
 by date
 </td><td>
-{{int:Bydate}}
+{{int:590988e2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Byname&action=edit byname]<br>
-[[MediaWiki_talk:Byname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c08c3f0d&action=edit e51a8413]<br>
+[[MediaWiki_talk:c08c3f0d|Talk]]
 </td><td>
 by name
 </td><td>
-{{int:Byname}}
+{{int:c08c3f0d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bysize&action=edit bysize]<br>
-[[MediaWiki_talk:Bysize|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ede279e9&action=edit 43ba766a]<br>
+[[MediaWiki_talk:ede279e9|Talk]]
 </td><td>
 by size
 </td><td>
-{{int:Bysize}}
+{{int:ede279e9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cachederror&action=edit cachederror]<br>
-[[MediaWiki_talk:Cachederror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e1ad9b35&action=edit 075fc8df]<br>
+[[MediaWiki_talk:e1ad9b35|Talk]]
 </td><td>
 The following is a cached copy of the requested page, and may not be up to date.
 </td><td>
-{{int:Cachederror}}
+{{int:e1ad9b35}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cancel&action=edit cancel]<br>
-[[MediaWiki_talk:Cancel|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:77dfd213&action=edit 4fd0653c]<br>
+[[MediaWiki_talk:77dfd213|Talk]]
 </td><td>
 Cancel
 </td><td>
-{{int:Cancel}}
+{{int:77dfd213}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cannotdelete&action=edit cannotdelete]<br>
-[[MediaWiki_talk:Cannotdelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:03442eec&action=edit ee57c22e]<br>
+[[MediaWiki_talk:03442eec|Talk]]
 </td><td>
 Could not delete the page or image specified. (It may have already been deleted by someone else.)
 </td><td>
-{{int:Cannotdelete}}
+{{int:03442eec}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cantrollback&action=edit cantrollback]<br>
-[[MediaWiki_talk:Cantrollback|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:27b55ed3&action=edit 4b739ac2]<br>
+[[MediaWiki_talk:27b55ed3|Talk]]
 </td><td>
 Cannot revert edit; last contributor is only author of this page.
 </td><td>
-{{int:Cantrollback}}
+{{int:27b55ed3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Categories&action=edit categories]<br>
-[[MediaWiki_talk:Categories|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6ccb6007&action=edit 50b9e781]<br>
+[[MediaWiki_talk:6ccb6007|Talk]]
 </td><td>
 Categories
 </td><td>
-{{int:Categories}}
+{{int:6ccb6007}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Category&action=edit category]<br>
-[[MediaWiki_talk:Category|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a3c686e7&action=edit 5ccbf9c9]<br>
+[[MediaWiki_talk:a3c686e7|Talk]]
 </td><td>
 category
 </td><td>
-{{int:Category}}
+{{int:a3c686e7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Category_header&action=edit category_header]<br>
-[[MediaWiki_talk:Category_header|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f2ff5f46&action=edit 7245f61e]<br>
+[[MediaWiki_talk:f2ff5f46|Talk]]
 </td><td>
 Articles in category &quot;$1&quot;
 </td><td>
-{{int:Category_header}}
+{{int:f2ff5f46}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Changepassword&action=edit changepassword]<br>
-[[MediaWiki_talk:Changepassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cc60b2e2&action=edit 3dfd4581]<br>
+[[MediaWiki_talk:cc60b2e2|Talk]]
 </td><td>
 Change password
 </td><td>
-{{int:Changepassword}}
+{{int:cc60b2e2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Changes&action=edit changes]<br>
-[[MediaWiki_talk:Changes|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8aa57de6&action=edit 49a04ba4]<br>
+[[MediaWiki_talk:8aa57de6|Talk]]
 </td><td>
 changes
 </td><td>
-{{int:Changes}}
+{{int:8aa57de6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Columns&action=edit columns]<br>
-[[MediaWiki_talk:Columns|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cf723c59&action=edit 4f1b1dbe]<br>
+[[MediaWiki_talk:cf723c59|Talk]]
 </td><td>
 Columns
 </td><td>
-{{int:Columns}}
+{{int:cf723c59}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Commentedit&action=edit commentedit]<br>
-[[MediaWiki_talk:Commentedit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a4f8ff8&action=edit 99be507a]<br>
+[[MediaWiki_talk:2a4f8ff8|Talk]]
 </td><td>
  (comment)
 </td><td>
-{{int:Commentedit}}
+{{int:2a4f8ff8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Compareselectedversions&action=edit compareselectedversions]<br>
-[[MediaWiki_talk:Compareselectedversions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9833df65&action=edit 978cce5f]<br>
+[[MediaWiki_talk:9833df65|Talk]]
 </td><td>
 Compare selected versions
 </td><td>
-{{int:Compareselectedversions}}
+{{int:9833df65}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirm&action=edit confirm]<br>
-[[MediaWiki_talk:Confirm|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:04a21221&action=edit d0c4047c]<br>
+[[MediaWiki_talk:04a21221|Talk]]
 </td><td>
 Confirm
 </td><td>
-{{int:Confirm}}
+{{int:04a21221}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmcheck&action=edit confirmcheck]<br>
-[[MediaWiki_talk:Confirmcheck|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b8e469fe&action=edit bb4bf8de]<br>
+[[MediaWiki_talk:b8e469fe|Talk]]
 </td><td>
 Yes, I really want to delete this.
 </td><td>
-{{int:Confirmcheck}}
+{{int:b8e469fe}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmdelete&action=edit confirmdelete]<br>
-[[MediaWiki_talk:Confirmdelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7773ad82&action=edit 16805d57]<br>
+[[MediaWiki_talk:7773ad82|Talk]]
 </td><td>
 Confirm delete
 </td><td>
-{{int:Confirmdelete}}
+{{int:7773ad82}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmdeletetext&action=edit confirmdeletetext]<br>
-[[MediaWiki_talk:Confirmdeletetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:87358bf0&action=edit 872e01c0]<br>
+[[MediaWiki_talk:87358bf0|Talk]]
 </td><td>
 You are about to permanently delete a page
 or image along with all of its history from the database.
@@ -911,94 +911,94 @@ Please confirm that you intend to do this, that you understand the
 consequences, and that you are doing this in accordance with
 &#91;&#91;Wiktionary:Policy]].
 </td><td>
-{{int:Confirmdeletetext}}
+{{int:87358bf0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmprotect&action=edit confirmprotect]<br>
-[[MediaWiki_talk:Confirmprotect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b46f1463&action=edit 96a48c11]<br>
+[[MediaWiki_talk:b46f1463|Talk]]
 </td><td>
 Confirm protection
 </td><td>
-{{int:Confirmprotect}}
+{{int:b46f1463}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmprotecttext&action=edit confirmprotecttext]<br>
-[[MediaWiki_talk:Confirmprotecttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e382b883&action=edit e76ab37d]<br>
+[[MediaWiki_talk:e382b883|Talk]]
 </td><td>
 Do you really want to protect this page?
 </td><td>
-{{int:Confirmprotecttext}}
+{{int:e382b883}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmunprotect&action=edit confirmunprotect]<br>
-[[MediaWiki_talk:Confirmunprotect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:33be1711&action=edit 306661e6]<br>
+[[MediaWiki_talk:33be1711|Talk]]
 </td><td>
 Confirm unprotection
 </td><td>
-{{int:Confirmunprotect}}
+{{int:33be1711}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmunprotecttext&action=edit confirmunprotecttext]<br>
-[[MediaWiki_talk:Confirmunprotecttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2d82e05f&action=edit 4df1abe3]<br>
+[[MediaWiki_talk:2d82e05f|Talk]]
 </td><td>
 Do you really want to unprotect this page?
 </td><td>
-{{int:Confirmunprotecttext}}
+{{int:2d82e05f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contextchars&action=edit contextchars]<br>
-[[MediaWiki_talk:Contextchars|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7f051e88&action=edit 0858695c]<br>
+[[MediaWiki_talk:7f051e88|Talk]]
 </td><td>
 Characters of context per line
 </td><td>
-{{int:Contextchars}}
+{{int:7f051e88}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contextlines&action=edit contextlines]<br>
-[[MediaWiki_talk:Contextlines|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7127b581&action=edit e9d81e50]<br>
+[[MediaWiki_talk:7127b581|Talk]]
 </td><td>
 Lines to show per hit
 </td><td>
-{{int:Contextlines}}
+{{int:7127b581}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contribslink&action=edit contribslink]<br>
-[[MediaWiki_talk:Contribslink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9850ceab&action=edit df5b918c]<br>
+[[MediaWiki_talk:9850ceab|Talk]]
 </td><td>
 contribs
 </td><td>
-{{int:Contribslink}}
+{{int:9850ceab}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contribsub&action=edit contribsub]<br>
-[[MediaWiki_talk:Contribsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b688a4d7&action=edit ab48ec14]<br>
+[[MediaWiki_talk:b688a4d7|Talk]]
 </td><td>
 For $1
 </td><td>
-{{int:Contribsub}}
+{{int:b688a4d7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contributions&action=edit contributions]<br>
-[[MediaWiki_talk:Contributions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:aa11023f&action=edit 9d5b6e5e]<br>
+[[MediaWiki_talk:aa11023f|Talk]]
 </td><td>
 User contributions
 </td><td>
-{{int:Contributions}}
+{{int:aa11023f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyright&action=edit copyright]<br>
-[[MediaWiki_talk:Copyright|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a420abf6&action=edit 521307dd]<br>
+[[MediaWiki_talk:a420abf6|Talk]]
 </td><td>
 Content is available under $1.
 </td><td>
-{{int:Copyright}}
+{{int:a420abf6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightpage&action=edit copyrightpage]<br>
-[[MediaWiki_talk:Copyrightpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fc8c1b42&action=edit 5327fdcf]<br>
+[[MediaWiki_talk:fc8c1b42|Talk]]
 </td><td>
 Wiktionary:Copyrights
 </td><td>
-{{int:Copyrightpage}}
+{{int:fc8c1b42}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightpagename&action=edit copyrightpagename]<br>
-[[MediaWiki_talk:Copyrightpagename|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:52a98e51&action=edit f6652583]<br>
+[[MediaWiki_talk:52a98e51|Talk]]
 </td><td>
 Wiktionary copyright
 </td><td>
-{{int:Copyrightpagename}}
+{{int:52a98e51}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightwarning&action=edit copyrightwarning]<br>
-[[MediaWiki_talk:Copyrightwarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:25a1afd7&action=edit 731cc8a6]<br>
+[[MediaWiki_talk:25a1afd7|Talk]]
 </td><td>
 Please note that all contributions to Wiktionary are
 considered to be released under the GNU Free Documentation License
@@ -1009,66 +1009,66 @@ You are also promising us that you wrote this yourself, or copied it from a
 public domain or similar free resource.
 &lt;strong&gt;DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!&lt;/strong&gt;
 </td><td>
-{{int:Copyrightwarning}}
+{{int:25a1afd7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Couldntremove&action=edit couldntremove]<br>
-[[MediaWiki_talk:Couldntremove|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:465ca4b8&action=edit e04b3a96]<br>
+[[MediaWiki_talk:465ca4b8|Talk]]
 </td><td>
 Couldn&#39;t remove item &#39;$1&#39;...
 </td><td>
-{{int:Couldntremove}}
+{{int:465ca4b8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Createaccount&action=edit createaccount]<br>
-[[MediaWiki_talk:Createaccount|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3724dfa6&action=edit 19fd5658]<br>
+[[MediaWiki_talk:3724dfa6|Talk]]
 </td><td>
 Create new account
 </td><td>
-{{int:Createaccount}}
+{{int:3724dfa6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Createaccountmail&action=edit createaccountmail]<br>
-[[MediaWiki_talk:Createaccountmail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a4a1f0cb&action=edit b10d6306]<br>
+[[MediaWiki_talk:a4a1f0cb|Talk]]
 </td><td>
 by email
 </td><td>
-{{int:Createaccountmail}}
+{{int:a4a1f0cb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cur&action=edit cur]<br>
-[[MediaWiki_talk:Cur|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:07f81f3c&action=edit dce81611]<br>
+[[MediaWiki_talk:07f81f3c|Talk]]
 </td><td>
 cur
 </td><td>
-{{int:Cur}}
+{{int:07f81f3c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Currentevents&action=edit currentevents]<br>
-[[MediaWiki_talk:Currentevents|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:42b921f8&action=edit 81c8f458]<br>
+[[MediaWiki_talk:42b921f8|Talk]]
 </td><td>
 Current events
 </td><td>
-{{int:Currentevents}}
+{{int:42b921f8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Currentrev&action=edit currentrev]<br>
-[[MediaWiki_talk:Currentrev|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:78892831&action=edit 23418566]<br>
+[[MediaWiki_talk:78892831|Talk]]
 </td><td>
 Current revision
 </td><td>
-{{int:Currentrev}}
+{{int:78892831}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Databaseerror&action=edit databaseerror]<br>
-[[MediaWiki_talk:Databaseerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e4838ed0&action=edit 66409316]<br>
+[[MediaWiki_talk:e4838ed0|Talk]]
 </td><td>
 Database error
 </td><td>
-{{int:Databaseerror}}
+{{int:e4838ed0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dateformat&action=edit dateformat]<br>
-[[MediaWiki_talk:Dateformat|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:507be676&action=edit 3b538bdf]<br>
+[[MediaWiki_talk:507be676|Talk]]
 </td><td>
 Date format
 </td><td>
-{{int:Dateformat}}
+{{int:507be676}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dberrortext&action=edit dberrortext]<br>
-[[MediaWiki_talk:Dberrortext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0bfa85bb&action=edit 34c01d3c]<br>
+[[MediaWiki_talk:0bfa85bb|Talk]]
 </td><td>
 A database query syntax error has occurred.
 This could be because of an illegal search query (see $5),
@@ -1078,10 +1078,10 @@ The last attempted database query was:
 from within function &quot;&lt;tt&gt;$2&lt;/tt&gt;&quot;.
 MySQL returned error &quot;&lt;tt&gt;$3: $4&lt;/tt&gt;&quot;.
 </td><td>
-{{int:Dberrortext}}
+{{int:0bfa85bb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dberrortextcl&action=edit dberrortextcl]<br>
-[[MediaWiki_talk:Dberrortextcl|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:39d82941&action=edit f6e1bcbd]<br>
+[[MediaWiki_talk:39d82941|Talk]]
 </td><td>
 A database query syntax error has occurred.
 The last attempted database query was:
@@ -1090,109 +1090,109 @@ from within function &quot;$2&quot;.
 MySQL returned error &quot;$3: $4&quot;.
 
 </td><td>
-{{int:Dberrortextcl}}
+{{int:39d82941}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deadendpages&action=edit deadendpages]<br>
-[[MediaWiki_talk:Deadendpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ae14da43&action=edit d4234aad]<br>
+[[MediaWiki_talk:ae14da43|Talk]]
 </td><td>
 Dead-end pages
 </td><td>
-{{int:Deadendpages}}
+{{int:ae14da43}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Debug&action=edit debug]<br>
-[[MediaWiki_talk:Debug|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bd604d99&action=edit 32faaeca]<br>
+[[MediaWiki_talk:bd604d99|Talk]]
 </td><td>
 Debug
 </td><td>
-{{int:Debug}}
+{{int:bd604d99}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Defaultns&action=edit defaultns]<br>
-[[MediaWiki_talk:Defaultns|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6f349a89&action=edit f674a4a1]<br>
+[[MediaWiki_talk:6f349a89|Talk]]
 </td><td>
 Search in these namespaces by default:
 </td><td>
-{{int:Defaultns}}
+{{int:6f349a89}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Defemailsubject&action=edit defemailsubject]<br>
-[[MediaWiki_talk:Defemailsubject|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:801b725b&action=edit 93c2c32b]<br>
+[[MediaWiki_talk:801b725b|Talk]]
 </td><td>
 Wiktionary e-mail
 </td><td>
-{{int:Defemailsubject}}
+{{int:801b725b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Delete&action=edit delete]<br>
-[[MediaWiki_talk:Delete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f6fdbe48&action=edit 9485989f]<br>
+[[MediaWiki_talk:f6fdbe48|Talk]]
 </td><td>
 Delete
 </td><td>
-{{int:Delete}}
+{{int:f6fdbe48}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletecomment&action=edit deletecomment]<br>
-[[MediaWiki_talk:Deletecomment|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:728e102f&action=edit 070ad01c]<br>
+[[MediaWiki_talk:728e102f|Talk]]
 </td><td>
 Reason for deletion
 </td><td>
-{{int:Deletecomment}}
+{{int:728e102f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletedarticle&action=edit deletedarticle]<br>
-[[MediaWiki_talk:Deletedarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:784f094b&action=edit abb03e0b]<br>
+[[MediaWiki_talk:784f094b|Talk]]
 </td><td>
 deleted &quot;$1&quot;
 </td><td>
-{{int:Deletedarticle}}
+{{int:784f094b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletedtext&action=edit deletedtext]<br>
-[[MediaWiki_talk:Deletedtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b40dc398&action=edit 81545b85]<br>
+[[MediaWiki_talk:b40dc398|Talk]]
 </td><td>
 &quot;$1&quot; has been deleted.
 See $2 for a record of recent deletions.
 </td><td>
-{{int:Deletedtext}}
+{{int:b40dc398}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deleteimg&action=edit deleteimg]<br>
-[[MediaWiki_talk:Deleteimg|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:64a8bf46&action=edit 6f4d03ee]<br>
+[[MediaWiki_talk:64a8bf46|Talk]]
 </td><td>
 del
 </td><td>
-{{int:Deleteimg}}
+{{int:64a8bf46}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletepage&action=edit deletepage]<br>
-[[MediaWiki_talk:Deletepage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3316ac85&action=edit c423c282]<br>
+[[MediaWiki_talk:3316ac85|Talk]]
 </td><td>
 Delete page
 </td><td>
-{{int:Deletepage}}
+{{int:3316ac85}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletesub&action=edit deletesub]<br>
-[[MediaWiki_talk:Deletesub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a2496a13&action=edit a3173eab]<br>
+[[MediaWiki_talk:a2496a13|Talk]]
 </td><td>
 (Deleting &quot;$1&quot;)
 </td><td>
-{{int:Deletesub}}
+{{int:a2496a13}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletethispage&action=edit deletethispage]<br>
-[[MediaWiki_talk:Deletethispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9d817726&action=edit b93901eb]<br>
+[[MediaWiki_talk:9d817726|Talk]]
 </td><td>
 Delete this page
 </td><td>
-{{int:Deletethispage}}
+{{int:9d817726}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletionlog&action=edit deletionlog]<br>
-[[MediaWiki_talk:Deletionlog|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:49653e1b&action=edit 58f0b919]<br>
+[[MediaWiki_talk:49653e1b|Talk]]
 </td><td>
 deletion log
 </td><td>
-{{int:Deletionlog}}
+{{int:49653e1b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dellogpage&action=edit dellogpage]<br>
-[[MediaWiki_talk:Dellogpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d73442e4&action=edit c5ee36a7]<br>
+[[MediaWiki_talk:d73442e4|Talk]]
 </td><td>
 Deletion_log
 </td><td>
-{{int:Dellogpage}}
+{{int:d73442e4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dellogpagetext&action=edit dellogpagetext]<br>
-[[MediaWiki_talk:Dellogpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2349bb58&action=edit 6526e633]<br>
+[[MediaWiki_talk:2349bb58|Talk]]
 </td><td>
 Below is a list of the most recent deletions.
 All times shown are server time (UTC).
@@ -1200,185 +1200,185 @@ All times shown are server time (UTC).
 &lt;/ul&gt;
 
 </td><td>
-{{int:Dellogpagetext}}
+{{int:2349bb58}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developerspheading&action=edit developerspheading]<br>
-[[MediaWiki_talk:Developerspheading|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:381bedfc&action=edit 015693e1]<br>
+[[MediaWiki_talk:381bedfc|Talk]]
 </td><td>
 For developer use only
 </td><td>
-{{int:Developerspheading}}
+{{int:381bedfc}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developertext&action=edit developertext]<br>
-[[MediaWiki_talk:Developertext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:52713d3d&action=edit 9c6f4cd5]<br>
+[[MediaWiki_talk:52713d3d|Talk]]
 </td><td>
 The action you have requested can only be
 performed by users with &quot;developer&quot; status.
 See $1.
 </td><td>
-{{int:Developertext}}
+{{int:52713d3d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developertitle&action=edit developertitle]<br>
-[[MediaWiki_talk:Developertitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6cca6111&action=edit 59afe6b0]<br>
+[[MediaWiki_talk:6cca6111|Talk]]
 </td><td>
 Developer access required
 </td><td>
-{{int:Developertitle}}
+{{int:6cca6111}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Diff&action=edit diff]<br>
-[[MediaWiki_talk:Diff|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d23a1c9f&action=edit 75a0ee1b]<br>
+[[MediaWiki_talk:d23a1c9f|Talk]]
 </td><td>
 diff
 </td><td>
-{{int:Diff}}
+{{int:d23a1c9f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Difference&action=edit difference]<br>
-[[MediaWiki_talk:Difference|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b16f1f66&action=edit 48d53c6e]<br>
+[[MediaWiki_talk:b16f1f66|Talk]]
 </td><td>
 (Difference between revisions)
 </td><td>
-{{int:Difference}}
+{{int:b16f1f66}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimerpage&action=edit disclaimerpage]<br>
-[[MediaWiki_talk:Disclaimerpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3c1c1596&action=edit 657b3530]<br>
+[[MediaWiki_talk:3c1c1596|Talk]]
 </td><td>
 Wiktionary:General_disclaimer
 </td><td>
-{{int:Disclaimerpage}}
+{{int:3c1c1596}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimers&action=edit disclaimers]<br>
-[[MediaWiki_talk:Disclaimers|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2cbbc29e&action=edit 774706d2]<br>
+[[MediaWiki_talk:2cbbc29e|Talk]]
 </td><td>
 Disclaimers
 </td><td>
-{{int:Disclaimers}}
+{{int:2cbbc29e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Doubleredirects&action=edit doubleredirects]<br>
-[[MediaWiki_talk:Doubleredirects|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ac57c500&action=edit c06b805b]<br>
+[[MediaWiki_talk:ac57c500|Talk]]
 </td><td>
 Double Redirects
 </td><td>
-{{int:Doubleredirects}}
+{{int:ac57c500}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Doubleredirectstext&action=edit doubleredirectstext]<br>
-[[MediaWiki_talk:Doubleredirectstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ba6ba737&action=edit 49eadc1d]<br>
+[[MediaWiki_talk:ba6ba737|Talk]]
 </td><td>
 &lt;b&gt;Attention:&lt;/b&gt; This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.&lt;br /&gt;
 Each row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the &quot;real&quot; target page, which the first redirect should point to.
 </td><td>
-{{int:Doubleredirectstext}}
+{{int:ba6ba737}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edit&action=edit edit]<br>
-[[MediaWiki_talk:Edit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5301648d&action=edit 9ead47a8]<br>
+[[MediaWiki_talk:5301648d|Talk]]
 </td><td>
 Edit
 </td><td>
-{{int:Edit}}
+{{int:5301648d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editcomment&action=edit editcomment]<br>
-[[MediaWiki_talk:Editcomment|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:299ca80d&action=edit 74940f72]<br>
+[[MediaWiki_talk:299ca80d|Talk]]
 </td><td>
 The edit comment was: &quot;&lt;i&gt;$1&lt;/i&gt;&quot;.
 </td><td>
-{{int:Editcomment}}
+{{int:299ca80d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editconflict&action=edit editconflict]<br>
-[[MediaWiki_talk:Editconflict|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1af657fb&action=edit 3b56e95b]<br>
+[[MediaWiki_talk:1af657fb|Talk]]
 </td><td>
 Edit conflict: $1
 </td><td>
-{{int:Editconflict}}
+{{int:1af657fb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editcurrent&action=edit editcurrent]<br>
-[[MediaWiki_talk:Editcurrent|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8b46c7e0&action=edit 10d395b9]<br>
+[[MediaWiki_talk:8b46c7e0|Talk]]
 </td><td>
 Edit the current version of this page
 </td><td>
-{{int:Editcurrent}}
+{{int:8b46c7e0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edithelp&action=edit edithelp]<br>
-[[MediaWiki_talk:Edithelp|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:47f4389a&action=edit a1524e37]<br>
+[[MediaWiki_talk:47f4389a|Talk]]
 </td><td>
 Editing help
 </td><td>
-{{int:Edithelp}}
+{{int:47f4389a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edithelppage&action=edit edithelppage]<br>
-[[MediaWiki_talk:Edithelppage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:56815513&action=edit 7072deb5]<br>
+[[MediaWiki_talk:56815513|Talk]]
 </td><td>
 Help:Editing
 </td><td>
-{{int:Edithelppage}}
+{{int:56815513}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editing&action=edit editing]<br>
-[[MediaWiki_talk:Editing|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3b9ba1a2&action=edit f34946be]<br>
+[[MediaWiki_talk:3b9ba1a2|Talk]]
 </td><td>
 Editing $1
 </td><td>
-{{int:Editing}}
+{{int:3b9ba1a2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editingold&action=edit editingold]<br>
-[[MediaWiki_talk:Editingold|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5e6bd9f3&action=edit bd55ff2e]<br>
+[[MediaWiki_talk:5e6bd9f3|Talk]]
 </td><td>
 &lt;strong&gt;WARNING: You are editing an out-of-date
 revision of this page.
 If you save it, any changes made since this revision will be lost.&lt;/strong&gt;
 
 </td><td>
-{{int:Editingold}}
+{{int:5e6bd9f3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editsection&action=edit editsection]<br>
-[[MediaWiki_talk:Editsection|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:51905619&action=edit 965b4116]<br>
+[[MediaWiki_talk:51905619|Talk]]
 </td><td>
 edit
 </td><td>
-{{int:Editsection}}
+{{int:51905619}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editthispage&action=edit editthispage]<br>
-[[MediaWiki_talk:Editthispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2138f524&action=edit 8bc15909]<br>
+[[MediaWiki_talk:2138f524|Talk]]
 </td><td>
 Edit this page
 </td><td>
-{{int:Editthispage}}
+{{int:2138f524}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailflag&action=edit emailflag]<br>
-[[MediaWiki_talk:Emailflag|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:96c0b2c5&action=edit 4a27c333]<br>
+[[MediaWiki_talk:96c0b2c5|Talk]]
 </td><td>
 Disable e-mail from other users
 </td><td>
-{{int:Emailflag}}
+{{int:96c0b2c5}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailforlost&action=edit emailforlost]<br>
-[[MediaWiki_talk:Emailforlost|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8a275a27&action=edit e4573eb4]<br>
+[[MediaWiki_talk:8a275a27|Talk]]
 </td><td>
 Fields marked with a star (*) are optional.  Storing an email address enables people to contact you through the website without you having to reveal your 
 email address to them, and it can be used to send you a new password if you forget it.&lt;br /&gt;&lt;br /&gt;Your real name, if you choose to provide it, will be used for giving you attribution for your work.
 </td><td>
-{{int:Emailforlost}}
+{{int:8a275a27}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailfrom&action=edit emailfrom]<br>
-[[MediaWiki_talk:Emailfrom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:34a573ac&action=edit b29c18eb]<br>
+[[MediaWiki_talk:34a573ac|Talk]]
 </td><td>
 From
 </td><td>
-{{int:Emailfrom}}
+{{int:34a573ac}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailmessage&action=edit emailmessage]<br>
-[[MediaWiki_talk:Emailmessage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1653aeb3&action=edit 8d8c0edf]<br>
+[[MediaWiki_talk:1653aeb3|Talk]]
 </td><td>
 Message
 </td><td>
-{{int:Emailmessage}}
+{{int:1653aeb3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailuser&action=edit emailuser]<br>
-[[MediaWiki_talk:Emailuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ac5cfb8e&action=edit a9b033ab]<br>
+[[MediaWiki_talk:ac5cfb8e|Talk]]
 </td><td>
 E-mail user
 </td><td>
-{{int:Emailuser}}
+{{int:ac5cfb8e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailpagetext&action=edit emailpagetext]<br>
-[[MediaWiki_talk:Emailpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e3fc4fe2&action=edit eb6bf1bb]<br>
+[[MediaWiki_talk:e3fc4fe2|Talk]]
 </td><td>
 If this user has entered a valid e-mail address in
 his or her user preferences, the form below will send a single message.
@@ -1386,95 +1386,95 @@ The e-mail address you entered in your user preferences will appear
 as the &quot;From&quot; address of the mail, so the recipient will be able
 to reply.
 </td><td>
-{{int:Emailpagetext}}
+{{int:e3fc4fe2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsend&action=edit emailsend]<br>
-[[MediaWiki_talk:Emailsend|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:145da553&action=edit 05072b51]<br>
+[[MediaWiki_talk:145da553|Talk]]
 </td><td>
 Send
 </td><td>
-{{int:Emailsend}}
+{{int:145da553}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsent&action=edit emailsent]<br>
-[[MediaWiki_talk:Emailsent|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:833a22dc&action=edit b1d3f3e4]<br>
+[[MediaWiki_talk:833a22dc|Talk]]
 </td><td>
 E-mail sent
 </td><td>
-{{int:Emailsent}}
+{{int:833a22dc}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsenttext&action=edit emailsenttext]<br>
-[[MediaWiki_talk:Emailsenttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e3935836&action=edit 2effa7aa]<br>
+[[MediaWiki_talk:e3935836|Talk]]
 </td><td>
 Your e-mail message has been sent.
 </td><td>
-{{int:Emailsenttext}}
+{{int:e3935836}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsubject&action=edit emailsubject]<br>
-[[MediaWiki_talk:Emailsubject|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c8dba338&action=edit 275a0d68]<br>
+[[MediaWiki_talk:c8dba338|Talk]]
 </td><td>
 Subject
 </td><td>
-{{int:Emailsubject}}
+{{int:c8dba338}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailto&action=edit emailto]<br>
-[[MediaWiki_talk:Emailto|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c35740f4&action=edit 88b0fd50]<br>
+[[MediaWiki_talk:c35740f4|Talk]]
 </td><td>
 To
 </td><td>
-{{int:Emailto}}
+{{int:c35740f4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailuser&action=edit emailuser]<br>
-[[MediaWiki_talk:Emailuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ac5cfb8e&action=edit a9b033ab]<br>
+[[MediaWiki_talk:ac5cfb8e|Talk]]
 </td><td>
 E-mail this user
 </td><td>
-{{int:Emailuser}}
+{{int:ac5cfb8e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Enterlockreason&action=edit enterlockreason]<br>
-[[MediaWiki_talk:Enterlockreason|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6b0a234b&action=edit 698a308a]<br>
+[[MediaWiki_talk:6b0a234b|Talk]]
 </td><td>
 Enter a reason for the lock, including an estimate
 of when the lock will be released
 </td><td>
-{{int:Enterlockreason}}
+{{int:6b0a234b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Error&action=edit error]<br>
-[[MediaWiki_talk:Error|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7f2f6a15&action=edit 11f9578d]<br>
+[[MediaWiki_talk:7f2f6a15|Talk]]
 </td><td>
 Error
 </td><td>
-{{int:Error}}
+{{int:7f2f6a15}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Errorpagetitle&action=edit errorpagetitle]<br>
-[[MediaWiki_talk:Errorpagetitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:53ee1378&action=edit aa2d1eba]<br>
+[[MediaWiki_talk:53ee1378|Talk]]
 </td><td>
 Error
 </td><td>
-{{int:Errorpagetitle}}
+{{int:53ee1378}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exbeforeblank&action=edit exbeforeblank]<br>
-[[MediaWiki_talk:Exbeforeblank|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8aedeece&action=edit a1c634a7]<br>
+[[MediaWiki_talk:8aedeece|Talk]]
 </td><td>
 content before blanking was:
 </td><td>
-{{int:Exbeforeblank}}
+{{int:8aedeece}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exblank&action=edit exblank]<br>
-[[MediaWiki_talk:Exblank|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:42abde88&action=edit eba6d64f]<br>
+[[MediaWiki_talk:42abde88|Talk]]
 </td><td>
 page was empty
 </td><td>
-{{int:Exblank}}
+{{int:42abde88}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Excontent&action=edit excontent]<br>
-[[MediaWiki_talk:Excontent|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dd028a5c&action=edit fe80d230]<br>
+[[MediaWiki_talk:dd028a5c|Talk]]
 </td><td>
 content was:
 </td><td>
-{{int:Excontent}}
+{{int:dd028a5c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Explainconflict&action=edit explainconflict]<br>
-[[MediaWiki_talk:Explainconflict|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b7845dfb&action=edit 1a7999fa]<br>
+[[MediaWiki_talk:b7845dfb|Talk]]
 </td><td>
 Someone else has changed this page since you
 started editing it.
@@ -1485,163 +1485,163 @@ You will have to merge your changes into the existing text.
 press &quot;Save page&quot;.
 &lt;p&gt;
 </td><td>
-{{int:Explainconflict}}
+{{int:b7845dfb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Export&action=edit export]<br>
-[[MediaWiki_talk:Export|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f3e4fadb&action=edit 51713409]<br>
+[[MediaWiki_talk:f3e4fadb|Talk]]
 </td><td>
 Export pages
 </td><td>
-{{int:Export}}
+{{int:f3e4fadb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exportcuronly&action=edit exportcuronly]<br>
-[[MediaWiki_talk:Exportcuronly|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b68aeee1&action=edit bf364325]<br>
+[[MediaWiki_talk:b68aeee1|Talk]]
 </td><td>
 Include only the current revision, not the full history
 </td><td>
-{{int:Exportcuronly}}
+{{int:b68aeee1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exporttext&action=edit exporttext]<br>
-[[MediaWiki_talk:Exporttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7e884d79&action=edit eddfb839]<br>
+[[MediaWiki_talk:7e884d79|Talk]]
 </td><td>
 You can export the text and editing history of a particular
 page or set of pages wrapped in some XML; this can then be imported into another
 wiki running MediaWiki software, transformed, or just kept for your private
 amusement.
 </td><td>
-{{int:Exporttext}}
+{{int:7e884d79}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Extlink_sample&action=edit extlink_sample]<br>
-[[MediaWiki_talk:Extlink_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a34d80e8&action=edit 8f95a409]<br>
+[[MediaWiki_talk:a34d80e8|Talk]]
 </td><td>
 http&#58;//www.example.com link title
 </td><td>
-{{int:Extlink_sample}}
+{{int:a34d80e8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Extlink_tip&action=edit extlink_tip]<br>
-[[MediaWiki_talk:Extlink_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:117651f0&action=edit 481904c0]<br>
+[[MediaWiki_talk:117651f0|Talk]]
 </td><td>
 External link (remember http&#58;// prefix)
 </td><td>
-{{int:Extlink_tip}}
+{{int:117651f0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Faq&action=edit faq]<br>
-[[MediaWiki_talk:Faq|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f11042a4&action=edit e75bc045]<br>
+[[MediaWiki_talk:f11042a4|Talk]]
 </td><td>
 FAQ
 </td><td>
-{{int:Faq}}
+{{int:f11042a4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Faqpage&action=edit faqpage]<br>
-[[MediaWiki_talk:Faqpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2e891e10&action=edit 5b772c96]<br>
+[[MediaWiki_talk:2e891e10|Talk]]
 </td><td>
 Wiktionary:FAQ
 </td><td>
-{{int:Faqpage}}
+{{int:2e891e10}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Feedlinks&action=edit feedlinks]<br>
-[[MediaWiki_talk:Feedlinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:86edbc13&action=edit 62f8af98]<br>
+[[MediaWiki_talk:86edbc13|Talk]]
 </td><td>
 Feed:
 </td><td>
-{{int:Feedlinks}}
+{{int:86edbc13}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filecopyerror&action=edit filecopyerror]<br>
-[[MediaWiki_talk:Filecopyerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2727dd90&action=edit 6c916412]<br>
+[[MediaWiki_talk:2727dd90|Talk]]
 </td><td>
 Could not copy file &quot;$1&quot; to &quot;$2&quot;.
 </td><td>
-{{int:Filecopyerror}}
+{{int:2727dd90}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filedeleteerror&action=edit filedeleteerror]<br>
-[[MediaWiki_talk:Filedeleteerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e60a2c42&action=edit d393dbbc]<br>
+[[MediaWiki_talk:e60a2c42|Talk]]
 </td><td>
 Could not delete file &quot;$1&quot;.
 </td><td>
-{{int:Filedeleteerror}}
+{{int:e60a2c42}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filedesc&action=edit filedesc]<br>
-[[MediaWiki_talk:Filedesc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d7b25eeb&action=edit 6dace2d5]<br>
+[[MediaWiki_talk:d7b25eeb|Talk]]
 </td><td>
 Summary
 </td><td>
-{{int:Filedesc}}
+{{int:d7b25eeb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filename&action=edit filename]<br>
-[[MediaWiki_talk:Filename|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a3cbb98d&action=edit 08deae8d]<br>
+[[MediaWiki_talk:a3cbb98d|Talk]]
 </td><td>
 Filename
 </td><td>
-{{int:Filename}}
+{{int:a3cbb98d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filenotfound&action=edit filenotfound]<br>
-[[MediaWiki_talk:Filenotfound|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c8f6c94d&action=edit 35c4ded6]<br>
+[[MediaWiki_talk:c8f6c94d|Talk]]
 </td><td>
 Could not find file &quot;$1&quot;.
 </td><td>
-{{int:Filenotfound}}
+{{int:c8f6c94d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filerenameerror&action=edit filerenameerror]<br>
-[[MediaWiki_talk:Filerenameerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b9b56972&action=edit 6d195b75]<br>
+[[MediaWiki_talk:b9b56972|Talk]]
 </td><td>
 Could not rename file &quot;$1&quot; to &quot;$2&quot;.
 </td><td>
-{{int:Filerenameerror}}
+{{int:b9b56972}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filesource&action=edit filesource]<br>
-[[MediaWiki_talk:Filesource|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0a6a1eb6&action=edit 1ffce53a]<br>
+[[MediaWiki_talk:0a6a1eb6|Talk]]
 </td><td>
 Source
 </td><td>
-{{int:Filesource}}
+{{int:0a6a1eb6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filestatus&action=edit filestatus]<br>
-[[MediaWiki_talk:Filestatus|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0f0e70a0&action=edit 040e2ba8]<br>
+[[MediaWiki_talk:0f0e70a0|Talk]]
 </td><td>
 Copyright status
 </td><td>
-{{int:Filestatus}}
+{{int:0f0e70a0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Fileuploaded&action=edit fileuploaded]<br>
-[[MediaWiki_talk:Fileuploaded|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:45eaa53f&action=edit 79423d38]<br>
+[[MediaWiki_talk:45eaa53f|Talk]]
 </td><td>
 File &quot;$1&quot; uploaded successfully.
 Please follow this link: $2 to the description page and fill
 in information about the file, such as where it came from, when it was
 created and by whom, and anything else you may know about it.
 </td><td>
-{{int:Fileuploaded}}
+{{int:45eaa53f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Formerror&action=edit formerror]<br>
-[[MediaWiki_talk:Formerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a303ff06&action=edit 416cf9e4]<br>
+[[MediaWiki_talk:a303ff06|Talk]]
 </td><td>
 Error: could not submit form
 </td><td>
-{{int:Formerror}}
+{{int:a303ff06}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Fromwikipedia&action=edit fromwikipedia]<br>
-[[MediaWiki_talk:Fromwikipedia|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dc08787f&action=edit ada66d8e]<br>
+[[MediaWiki_talk:dc08787f|Talk]]
 </td><td>
 From Wiktionary
 </td><td>
-{{int:Fromwikipedia}}
+{{int:dc08787f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Getimagelist&action=edit getimagelist]<br>
-[[MediaWiki_talk:Getimagelist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c4c83db8&action=edit f8d783cd]<br>
+[[MediaWiki_talk:c4c83db8|Talk]]
 </td><td>
 fetching image list
 </td><td>
-{{int:Getimagelist}}
+{{int:c4c83db8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Go&action=edit go]<br>
-[[MediaWiki_talk:Go|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2e0b45f2&action=edit 1ec558a6]<br>
+[[MediaWiki_talk:2e0b45f2|Talk]]
 </td><td>
 Go
 </td><td>
-{{int:Go}}
+{{int:2e0b45f2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Googlesearch&action=edit googlesearch]<br>
-[[MediaWiki_talk:Googlesearch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:749351b4&action=edit 49a50bdf]<br>
+[[MediaWiki_talk:749351b4|Talk]]
 </td><td>
 
 &lt;!-- SiteSearch Google --&gt;
@@ -1663,527 +1663,527 @@ border=&quot;0&quot; ALT=&quot;Google&quot;&gt;&lt;/A&gt;
 &lt;/FORM&gt;
 &lt;!-- SiteSearch Google --&gt;
 </td><td>
-{{int:Googlesearch}}
+{{int:749351b4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Guesstimezone&action=edit guesstimezone]<br>
-[[MediaWiki_talk:Guesstimezone|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:489b474b&action=edit 8da95a41]<br>
+[[MediaWiki_talk:489b474b|Talk]]
 </td><td>
 Fill in from browser
 </td><td>
-{{int:Guesstimezone}}
+{{int:489b474b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Headline_sample&action=edit headline_sample]<br>
-[[MediaWiki_talk:Headline_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:237cf168&action=edit 7f401fbb]<br>
+[[MediaWiki_talk:237cf168|Talk]]
 </td><td>
 Headline text
 </td><td>
-{{int:Headline_sample}}
+{{int:237cf168}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Headline_tip&action=edit headline_tip]<br>
-[[MediaWiki_talk:Headline_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:91b3bc72&action=edit c4eef2f5]<br>
+[[MediaWiki_talk:91b3bc72|Talk]]
 </td><td>
 Level 2 headline
 </td><td>
-{{int:Headline_tip}}
+{{int:91b3bc72}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Help&action=edit help]<br>
-[[MediaWiki_talk:Help|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c47ae153&action=edit 92005ecf]<br>
+[[MediaWiki_talk:c47ae153|Talk]]
 </td><td>
 Help
 </td><td>
-{{int:Help}}
+{{int:c47ae153}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Helppage&action=edit helppage]<br>
-[[MediaWiki_talk:Helppage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:56203224&action=edit 9ca36083]<br>
+[[MediaWiki_talk:56203224|Talk]]
 </td><td>
 Help:Contents
 </td><td>
-{{int:Helppage}}
+{{int:56203224}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hide&action=edit hide]<br>
-[[MediaWiki_talk:Hide|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:34d8b60f&action=edit 93c8c96b]<br>
+[[MediaWiki_talk:34d8b60f|Talk]]
 </td><td>
 hide
 </td><td>
-{{int:Hide}}
+{{int:34d8b60f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hidetoc&action=edit hidetoc]<br>
-[[MediaWiki_talk:Hidetoc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9aa39fe3&action=edit 1cc77a14]<br>
+[[MediaWiki_talk:9aa39fe3|Talk]]
 </td><td>
 hide
 </td><td>
-{{int:Hidetoc}}
+{{int:9aa39fe3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hist&action=edit hist]<br>
-[[MediaWiki_talk:Hist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4d9810c0&action=edit 56714843]<br>
+[[MediaWiki_talk:4d9810c0|Talk]]
 </td><td>
 hist
 </td><td>
-{{int:Hist}}
+{{int:4d9810c0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Histlegend&action=edit histlegend]<br>
-[[MediaWiki_talk:Histlegend|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f37ab91a&action=edit 4e7121e9]<br>
+[[MediaWiki_talk:f37ab91a|Talk]]
 </td><td>
 Diff selection: mark the radio boxes of the versions to compare and hit enter or the button at the bottom.&lt;br/&gt;
 Legend: (cur) = difference with current version,
 (last) = difference with preceding version, M = minor edit.
 </td><td>
-{{int:Histlegend}}
+{{int:f37ab91a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:History&action=edit history]<br>
-[[MediaWiki_talk:History|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:90ccd649&action=edit 66f79d8a]<br>
+[[MediaWiki_talk:90ccd649|Talk]]
 </td><td>
 Page history
 </td><td>
-{{int:History}}
+{{int:90ccd649}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:History_short&action=edit history_short]<br>
-[[MediaWiki_talk:History_short|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:15a13ace&action=edit a937e036]<br>
+[[MediaWiki_talk:15a13ace|Talk]]
 </td><td>
 History
 </td><td>
-{{int:History_short}}
+{{int:15a13ace}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Historywarning&action=edit historywarning]<br>
-[[MediaWiki_talk:Historywarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e02c3587&action=edit 6079f80a]<br>
+[[MediaWiki_talk:e02c3587|Talk]]
 </td><td>
 Warning: The page you are about to delete has a history: 
 </td><td>
-{{int:Historywarning}}
+{{int:e02c3587}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hr_tip&action=edit hr_tip]<br>
-[[MediaWiki_talk:Hr_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5741ad8f&action=edit 48849a80]<br>
+[[MediaWiki_talk:5741ad8f|Talk]]
 </td><td>
 Horizontal line (use sparingly)
 </td><td>
-{{int:Hr_tip}}
+{{int:5741ad8f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ignorewarning&action=edit ignorewarning]<br>
-[[MediaWiki_talk:Ignorewarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7e18602a&action=edit d874ec59]<br>
+[[MediaWiki_talk:7e18602a|Talk]]
 </td><td>
 Ignore warning and save file anyway.
 </td><td>
-{{int:Ignorewarning}}
+{{int:7e18602a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ilshowmatch&action=edit ilshowmatch]<br>
-[[MediaWiki_talk:Ilshowmatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5bf1efaa&action=edit a98182df]<br>
+[[MediaWiki_talk:5bf1efaa|Talk]]
 </td><td>
 Show all images with names matching
 </td><td>
-{{int:Ilshowmatch}}
+{{int:5bf1efaa}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ilsubmit&action=edit ilsubmit]<br>
-[[MediaWiki_talk:Ilsubmit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8e7a51d5&action=edit f8288ad8]<br>
+[[MediaWiki_talk:8e7a51d5|Talk]]
 </td><td>
 Search
 </td><td>
-{{int:Ilsubmit}}
+{{int:8e7a51d5}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Image_sample&action=edit image_sample]<br>
-[[MediaWiki_talk:Image_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:133971b3&action=edit be19a728]<br>
+[[MediaWiki_talk:133971b3|Talk]]
 </td><td>
 Example.jpg
 </td><td>
-{{int:Image_sample}}
+{{int:133971b3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Image_tip&action=edit image_tip]<br>
-[[MediaWiki_talk:Image_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a73e0c3&action=edit d103e97d]<br>
+[[MediaWiki_talk:2a73e0c3|Talk]]
 </td><td>
 Embedded image
 </td><td>
-{{int:Image_tip}}
+{{int:2a73e0c3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelinks&action=edit imagelinks]<br>
-[[MediaWiki_talk:Imagelinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:353c260c&action=edit 3414ac48]<br>
+[[MediaWiki_talk:353c260c|Talk]]
 </td><td>
 Image links
 </td><td>
-{{int:Imagelinks}}
+{{int:353c260c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelist&action=edit imagelist]<br>
-[[MediaWiki_talk:Imagelist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:affc6aca&action=edit 4c06ba77]<br>
+[[MediaWiki_talk:affc6aca|Talk]]
 </td><td>
 Image list
 </td><td>
-{{int:Imagelist}}
+{{int:affc6aca}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelisttext&action=edit imagelisttext]<br>
-[[MediaWiki_talk:Imagelisttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ade85019&action=edit 2e8294bd]<br>
+[[MediaWiki_talk:ade85019|Talk]]
 </td><td>
 Below is a list of $1 images sorted $2.
 </td><td>
-{{int:Imagelisttext}}
+{{int:ade85019}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagepage&action=edit imagepage]<br>
-[[MediaWiki_talk:Imagepage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7277ee94&action=edit a152014b]<br>
+[[MediaWiki_talk:7277ee94|Talk]]
 </td><td>
 View image page
 </td><td>
-{{int:Imagepage}}
+{{int:7277ee94}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagereverted&action=edit imagereverted]<br>
-[[MediaWiki_talk:Imagereverted|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c783375c&action=edit b1d4cc4c]<br>
+[[MediaWiki_talk:c783375c|Talk]]
 </td><td>
 Revert to earlier version was successful.
 </td><td>
-{{int:Imagereverted}}
+{{int:c783375c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imgdelete&action=edit imgdelete]<br>
-[[MediaWiki_talk:Imgdelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c6f52751&action=edit 6656e4f4]<br>
+[[MediaWiki_talk:c6f52751|Talk]]
 </td><td>
 del
 </td><td>
-{{int:Imgdelete}}
+{{int:c6f52751}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imgdesc&action=edit imgdesc]<br>
-[[MediaWiki_talk:Imgdesc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3c281ed6&action=edit a1adca28]<br>
+[[MediaWiki_talk:3c281ed6|Talk]]
 </td><td>
 desc
 </td><td>
-{{int:Imgdesc}}
+{{int:3c281ed6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imghistlegend&action=edit imghistlegend]<br>
-[[MediaWiki_talk:Imghistlegend|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:186e5ca1&action=edit de786597]<br>
+[[MediaWiki_talk:186e5ca1|Talk]]
 </td><td>
 Legend: (cur) = this is the current image, (del) = delete
 this old version, (rev) = revert to this old version.
 &lt;br /&gt;&lt;i&gt;Click on date to see image uploaded on that date&lt;/i&gt;.
 </td><td>
-{{int:Imghistlegend}}
+{{int:186e5ca1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imghistory&action=edit imghistory]<br>
-[[MediaWiki_talk:Imghistory|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8d78c0d7&action=edit d9305ede]<br>
+[[MediaWiki_talk:8d78c0d7|Talk]]
 </td><td>
 Image history
 </td><td>
-{{int:Imghistory}}
+{{int:8d78c0d7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imglegend&action=edit imglegend]<br>
-[[MediaWiki_talk:Imglegend|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:86260b9f&action=edit a46e05c1]<br>
+[[MediaWiki_talk:86260b9f|Talk]]
 </td><td>
 Legend: (desc) = show/edit image description.
 </td><td>
-{{int:Imglegend}}
+{{int:86260b9f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Import&action=edit import]<br>
-[[MediaWiki_talk:Import|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d6fbc9d2&action=edit 62fdfbd5]<br>
+[[MediaWiki_talk:d6fbc9d2|Talk]]
 </td><td>
 Import pages
 </td><td>
-{{int:Import}}
+{{int:d6fbc9d2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importfailed&action=edit importfailed]<br>
-[[MediaWiki_talk:Importfailed|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bac6ed75&action=edit 85d2877a]<br>
+[[MediaWiki_talk:bac6ed75|Talk]]
 </td><td>
 Import failed: $1
 </td><td>
-{{int:Importfailed}}
+{{int:bac6ed75}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importhistoryconflict&action=edit importhistoryconflict]<br>
-[[MediaWiki_talk:Importhistoryconflict|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f4dee51e&action=edit f74f664b]<br>
+[[MediaWiki_talk:f4dee51e|Talk]]
 </td><td>
 Conflicting history revision exists (may have imported this page before)
 </td><td>
-{{int:Importhistoryconflict}}
+{{int:f4dee51e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importnotext&action=edit importnotext]<br>
-[[MediaWiki_talk:Importnotext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1d461354&action=edit ff881471]<br>
+[[MediaWiki_talk:1d461354|Talk]]
 </td><td>
 Empty or no text
 </td><td>
-{{int:Importnotext}}
+{{int:1d461354}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importsuccess&action=edit importsuccess]<br>
-[[MediaWiki_talk:Importsuccess|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5b910f21&action=edit e2781bd1]<br>
+[[MediaWiki_talk:5b910f21|Talk]]
 </td><td>
 Import succeeded!
 </td><td>
-{{int:Importsuccess}}
+{{int:5b910f21}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importtext&action=edit importtext]<br>
-[[MediaWiki_talk:Importtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3d58d609&action=edit 965243c5]<br>
+[[MediaWiki_talk:3d58d609|Talk]]
 </td><td>
 Please export the file from the source wiki using the Special:Export utility, save it to your disk and upload it here.
 </td><td>
-{{int:Importtext}}
+{{int:3d58d609}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Infobox&action=edit infobox]<br>
-[[MediaWiki_talk:Infobox|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:31be67da&action=edit 176bd169]<br>
+[[MediaWiki_talk:31be67da|Talk]]
 </td><td>
 Click a button to get an example text
 </td><td>
-{{int:Infobox}}
+{{int:31be67da}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Infobox_alert&action=edit infobox_alert]<br>
-[[MediaWiki_talk:Infobox_alert|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2854823a&action=edit 6de0a6d1]<br>
+[[MediaWiki_talk:2854823a|Talk]]
 </td><td>
 Please enter the text you want to be formatted.\n It will be shown in the infobox for copy and pasting.\nExample:\n$1\nwill become:\n$2
 </td><td>
-{{int:Infobox_alert}}
+{{int:2854823a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Internalerror&action=edit internalerror]<br>
-[[MediaWiki_talk:Internalerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:103c360a&action=edit e90e9e1c]<br>
+[[MediaWiki_talk:103c360a|Talk]]
 </td><td>
 Internal error
 </td><td>
-{{int:Internalerror}}
+{{int:103c360a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Intl&action=edit intl]<br>
-[[MediaWiki_talk:Intl|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:148008a6&action=edit 919b03e5]<br>
+[[MediaWiki_talk:148008a6|Talk]]
 </td><td>
 Interlanguage links
 </td><td>
-{{int:Intl}}
+{{int:148008a6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ip_range_invalid&action=edit ip_range_invalid]<br>
-[[MediaWiki_talk:Ip_range_invalid|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:07586557&action=edit 5c2ff182]<br>
+[[MediaWiki_talk:07586557|Talk]]
 </td><td>
 Invalid IP range.
 
 </td><td>
-{{int:Ip_range_invalid}}
+{{int:07586557}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipaddress&action=edit ipaddress]<br>
-[[MediaWiki_talk:Ipaddress|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:22f9ff50&action=edit 1f99aaad]<br>
+[[MediaWiki_talk:22f9ff50|Talk]]
 </td><td>
 IP Address/username
 </td><td>
-{{int:Ipaddress}}
+{{int:22f9ff50}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipb_expiry_invalid&action=edit ipb_expiry_invalid]<br>
-[[MediaWiki_talk:Ipb_expiry_invalid|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f8994552&action=edit 91b35c2d]<br>
+[[MediaWiki_talk:f8994552|Talk]]
 </td><td>
 Expiry time invalid.
 </td><td>
-{{int:Ipb_expiry_invalid}}
+{{int:f8994552}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbexpiry&action=edit ipbexpiry]<br>
-[[MediaWiki_talk:Ipbexpiry|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2147c662&action=edit 524cfd7e]<br>
+[[MediaWiki_talk:2147c662|Talk]]
 </td><td>
 Expiry
 </td><td>
-{{int:Ipbexpiry}}
+{{int:2147c662}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipblocklist&action=edit ipblocklist]<br>
-[[MediaWiki_talk:Ipblocklist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9cb7e6ee&action=edit 503153e9]<br>
+[[MediaWiki_talk:9cb7e6ee|Talk]]
 </td><td>
 List of blocked IP addresses and usernames
 </td><td>
-{{int:Ipblocklist}}
+{{int:9cb7e6ee}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbreason&action=edit ipbreason]<br>
-[[MediaWiki_talk:Ipbreason|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6774dfa8&action=edit 1ecdad25]<br>
+[[MediaWiki_talk:6774dfa8|Talk]]
 </td><td>
 Reason
 </td><td>
-{{int:Ipbreason}}
+{{int:6774dfa8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbsubmit&action=edit ipbsubmit]<br>
-[[MediaWiki_talk:Ipbsubmit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:62218118&action=edit e29a20a2]<br>
+[[MediaWiki_talk:62218118|Talk]]
 </td><td>
 Block this user
 </td><td>
-{{int:Ipbsubmit}}
+{{int:62218118}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipusubmit&action=edit ipusubmit]<br>
-[[MediaWiki_talk:Ipusubmit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7863d305&action=edit 73ecf10c]<br>
+[[MediaWiki_talk:7863d305|Talk]]
 </td><td>
 Unblock this address
 </td><td>
-{{int:Ipusubmit}}
+{{int:7863d305}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipusuccess&action=edit ipusuccess]<br>
-[[MediaWiki_talk:Ipusuccess|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ba95215c&action=edit 5fc7f411]<br>
+[[MediaWiki_talk:ba95215c|Talk]]
 </td><td>
 &quot;$1&quot; unblocked
 </td><td>
-{{int:Ipusuccess}}
+{{int:ba95215c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Isbn&action=edit isbn]<br>
-[[MediaWiki_talk:Isbn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8e89a827&action=edit 9aa403ad]<br>
+[[MediaWiki_talk:8e89a827|Talk]]
 </td><td>
 ISBN
 </td><td>
-{{int:Isbn}}
+{{int:8e89a827}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Isredirect&action=edit isredirect]<br>
-[[MediaWiki_talk:Isredirect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5b017ff1&action=edit abdf987b]<br>
+[[MediaWiki_talk:5b017ff1|Talk]]
 </td><td>
 redirect page
 </td><td>
-{{int:Isredirect}}
+{{int:5b017ff1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Italic_sample&action=edit italic_sample]<br>
-[[MediaWiki_talk:Italic_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:208e76ed&action=edit 95f02073]<br>
+[[MediaWiki_talk:208e76ed|Talk]]
 </td><td>
 Italic text
 </td><td>
-{{int:Italic_sample}}
+{{int:208e76ed}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Italic_tip&action=edit italic_tip]<br>
-[[MediaWiki_talk:Italic_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7e5211e9&action=edit 3f1c7185]<br>
+[[MediaWiki_talk:7e5211e9|Talk]]
 </td><td>
 Italic text
 </td><td>
-{{int:Italic_tip}}
+{{int:7e5211e9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Iteminvalidname&action=edit iteminvalidname]<br>
-[[MediaWiki_talk:Iteminvalidname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bcce0a8a&action=edit 0e29818a]<br>
+[[MediaWiki_talk:bcce0a8a|Talk]]
 </td><td>
 Problem with item &#39;$1&#39;, invalid name...
 </td><td>
-{{int:Iteminvalidname}}
+{{int:bcce0a8a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Largefile&action=edit largefile]<br>
-[[MediaWiki_talk:Largefile|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:996c231b&action=edit 5dd7fd8c]<br>
+[[MediaWiki_talk:996c231b|Talk]]
 </td><td>
 It is recommended that images not exceed 100k in size.
 </td><td>
-{{int:Largefile}}
+{{int:996c231b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Last&action=edit last]<br>
-[[MediaWiki_talk:Last|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d1c69a85&action=edit 213ed3ea]<br>
+[[MediaWiki_talk:d1c69a85|Talk]]
 </td><td>
 last
 </td><td>
-{{int:Last}}
+{{int:d1c69a85}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lastmodified&action=edit lastmodified]<br>
-[[MediaWiki_talk:Lastmodified|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:26d03483&action=edit 1d0be5cf]<br>
+[[MediaWiki_talk:26d03483|Talk]]
 </td><td>
 This page was last modified $1.
 </td><td>
-{{int:Lastmodified}}
+{{int:26d03483}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lastmodifiedby&action=edit lastmodifiedby]<br>
-[[MediaWiki_talk:Lastmodifiedby|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d8b6a1ce&action=edit b4c7424e]<br>
+[[MediaWiki_talk:d8b6a1ce|Talk]]
 </td><td>
 This page was last modified $1 by $2.
 </td><td>
-{{int:Lastmodifiedby}}
+{{int:d8b6a1ce}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lineno&action=edit lineno]<br>
-[[MediaWiki_talk:Lineno|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b5fb75c3&action=edit 7aab91e5]<br>
+[[MediaWiki_talk:b5fb75c3|Talk]]
 </td><td>
 Line $1:
 </td><td>
-{{int:Lineno}}
+{{int:b5fb75c3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Link_sample&action=edit link_sample]<br>
-[[MediaWiki_talk:Link_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a1a27fd2&action=edit 4c4ec68a]<br>
+[[MediaWiki_talk:a1a27fd2|Talk]]
 </td><td>
 Link title
 </td><td>
-{{int:Link_sample}}
+{{int:a1a27fd2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Link_tip&action=edit link_tip]<br>
-[[MediaWiki_talk:Link_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:28f8c928&action=edit e0ee37d8]<br>
+[[MediaWiki_talk:28f8c928|Talk]]
 </td><td>
 Internal link
 </td><td>
-{{int:Link_tip}}
+{{int:28f8c928}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linklistsub&action=edit linklistsub]<br>
-[[MediaWiki_talk:Linklistsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:003058f7&action=edit c692b683]<br>
+[[MediaWiki_talk:003058f7|Talk]]
 </td><td>
 (List of links)
 </td><td>
-{{int:Linklistsub}}
+{{int:003058f7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linkshere&action=edit linkshere]<br>
-[[MediaWiki_talk:Linkshere|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6508e12f&action=edit ce30384f]<br>
+[[MediaWiki_talk:6508e12f|Talk]]
 </td><td>
 The following pages link to here:
 </td><td>
-{{int:Linkshere}}
+{{int:6508e12f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linkstoimage&action=edit linkstoimage]<br>
-[[MediaWiki_talk:Linkstoimage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f6dbd59d&action=edit 50b839a3]<br>
+[[MediaWiki_talk:f6dbd59d|Talk]]
 </td><td>
 The following pages link to this image:
 </td><td>
-{{int:Linkstoimage}}
+{{int:f6dbd59d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linktrail&action=edit linktrail]<br>
-[[MediaWiki_talk:Linktrail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:eb68781a&action=edit 743236e7]<br>
+[[MediaWiki_talk:eb68781a|Talk]]
 </td><td>
 /^(&#91;a-z]+)(.*)$/sD
 </td><td>
-{{int:Linktrail}}
+{{int:eb68781a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Listform&action=edit listform]<br>
-[[MediaWiki_talk:Listform|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a8ca6811&action=edit 069b38c0]<br>
+[[MediaWiki_talk:a8ca6811|Talk]]
 </td><td>
 list
 </td><td>
-{{int:Listform}}
+{{int:a8ca6811}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Listusers&action=edit listusers]<br>
-[[MediaWiki_talk:Listusers|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9bf82beb&action=edit aabbb062]<br>
+[[MediaWiki_talk:9bf82beb|Talk]]
 </td><td>
 User list
 </td><td>
-{{int:Listusers}}
+{{int:9bf82beb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loadhist&action=edit loadhist]<br>
-[[MediaWiki_talk:Loadhist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:61a6ed55&action=edit 1b4ae4f9]<br>
+[[MediaWiki_talk:61a6ed55|Talk]]
 </td><td>
 Loading page history
 </td><td>
-{{int:Loadhist}}
+{{int:61a6ed55}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loadingrev&action=edit loadingrev]<br>
-[[MediaWiki_talk:Loadingrev|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bf19b1de&action=edit b6bb9fa5]<br>
+[[MediaWiki_talk:bf19b1de|Talk]]
 </td><td>
 loading revision for diff
 </td><td>
-{{int:Loadingrev}}
+{{int:bf19b1de}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Localtime&action=edit localtime]<br>
-[[MediaWiki_talk:Localtime|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:43678846&action=edit f25bccd7]<br>
+[[MediaWiki_talk:43678846|Talk]]
 </td><td>
 Local time display
 </td><td>
-{{int:Localtime}}
+{{int:43678846}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockbtn&action=edit lockbtn]<br>
-[[MediaWiki_talk:Lockbtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:31dcaa22&action=edit 62c50181]<br>
+[[MediaWiki_talk:31dcaa22|Talk]]
 </td><td>
 Lock database
 </td><td>
-{{int:Lockbtn}}
+{{int:31dcaa22}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockconfirm&action=edit lockconfirm]<br>
-[[MediaWiki_talk:Lockconfirm|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9dc82fa2&action=edit 5199ac8e]<br>
+[[MediaWiki_talk:9dc82fa2|Talk]]
 </td><td>
 Yes, I really want to lock the database.
 </td><td>
-{{int:Lockconfirm}}
+{{int:9dc82fa2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdb&action=edit lockdb]<br>
-[[MediaWiki_talk:Lockdb|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fef93b9b&action=edit 4f29ae0a]<br>
+[[MediaWiki_talk:fef93b9b|Talk]]
 </td><td>
 Lock database
 </td><td>
-{{int:Lockdb}}
+{{int:fef93b9b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbsuccesssub&action=edit lockdbsuccesssub]<br>
-[[MediaWiki_talk:Lockdbsuccesssub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b4abc4bb&action=edit e73c06d7]<br>
+[[MediaWiki_talk:b4abc4bb|Talk]]
 </td><td>
 Database lock succeeded
 </td><td>
-{{int:Lockdbsuccesssub}}
+{{int:b4abc4bb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbsuccesstext&action=edit lockdbsuccesstext]<br>
-[[MediaWiki_talk:Lockdbsuccesstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b6fcfec5&action=edit 88c6fb22]<br>
+[[MediaWiki_talk:b6fcfec5|Talk]]
 </td><td>
 The database has been locked.
 &lt;br /&gt;Remember to remove the lock after your maintenance is complete.
 </td><td>
-{{int:Lockdbsuccesstext}}
+{{int:b6fcfec5}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbtext&action=edit lockdbtext]<br>
-[[MediaWiki_talk:Lockdbtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:459bf648&action=edit 070ff9ae]<br>
+[[MediaWiki_talk:459bf648|Talk]]
 </td><td>
 Locking the database will suspend the ability of all
 users to edit pages, change their preferences, edit their watchlists, and
@@ -2191,87 +2191,87 @@ other things requiring changes in the database.
 Please confirm that this is what you intend to do, and that you will
 unlock the database when your maintenance is done.
 </td><td>
-{{int:Lockdbtext}}
+{{int:459bf648}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Locknoconfirm&action=edit locknoconfirm]<br>
-[[MediaWiki_talk:Locknoconfirm|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2727a733&action=edit 8a890d0a]<br>
+[[MediaWiki_talk:2727a733|Talk]]
 </td><td>
 You did not check the confirmation box.
 </td><td>
-{{int:Locknoconfirm}}
+{{int:2727a733}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Login&action=edit login]<br>
-[[MediaWiki_talk:Login|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4e5a2893&action=edit 2736fab2]<br>
+[[MediaWiki_talk:4e5a2893|Talk]]
 </td><td>
 Log in
 </td><td>
-{{int:Login}}
+{{int:4e5a2893}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginerror&action=edit loginerror]<br>
-[[MediaWiki_talk:Loginerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fcfc7549&action=edit e6f9a4e2]<br>
+[[MediaWiki_talk:fcfc7549|Talk]]
 </td><td>
 Login error
 </td><td>
-{{int:Loginerror}}
+{{int:fcfc7549}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginpagetitle&action=edit loginpagetitle]<br>
-[[MediaWiki_talk:Loginpagetitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4113f724&action=edit 36f843a7]<br>
+[[MediaWiki_talk:4113f724|Talk]]
 </td><td>
 User login
 </td><td>
-{{int:Loginpagetitle}}
+{{int:4113f724}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginproblem&action=edit loginproblem]<br>
-[[MediaWiki_talk:Loginproblem|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7a6963a6&action=edit d23ee6a8]<br>
+[[MediaWiki_talk:7a6963a6|Talk]]
 </td><td>
 &lt;b&gt;There has been a problem with your login.&lt;/b&gt;&lt;br /&gt;Try again!
 </td><td>
-{{int:Loginproblem}}
+{{int:7a6963a6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginprompt&action=edit loginprompt]<br>
-[[MediaWiki_talk:Loginprompt|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bbf56890&action=edit 221d44a4]<br>
+[[MediaWiki_talk:bbf56890|Talk]]
 </td><td>
 You must have cookies enabled to log in to Wiktionary.
 </td><td>
-{{int:Loginprompt}}
+{{int:bbf56890}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginreqtext&action=edit loginreqtext]<br>
-[[MediaWiki_talk:Loginreqtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:75749962&action=edit ee8446ea]<br>
+[[MediaWiki_talk:75749962|Talk]]
 </td><td>
 You must &#91;&#91;special:Userlogin&#124;login]] to view other pages.
 </td><td>
-{{int:Loginreqtext}}
+{{int:75749962}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginreqtitle&action=edit loginreqtitle]<br>
-[[MediaWiki_talk:Loginreqtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c779400b&action=edit a90049e8]<br>
+[[MediaWiki_talk:c779400b|Talk]]
 </td><td>
 Login Required
 </td><td>
-{{int:Loginreqtitle}}
+{{int:c779400b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginsuccess&action=edit loginsuccess]<br>
-[[MediaWiki_talk:Loginsuccess|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:753694e0&action=edit a5607b10]<br>
+[[MediaWiki_talk:753694e0|Talk]]
 </td><td>
 You are now logged in to Wiktionary as &quot;$1&quot;.
 </td><td>
-{{int:Loginsuccess}}
+{{int:753694e0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginsuccesstitle&action=edit loginsuccesstitle]<br>
-[[MediaWiki_talk:Loginsuccesstitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:73eb6767&action=edit 5c2a05be]<br>
+[[MediaWiki_talk:73eb6767|Talk]]
 </td><td>
 Login successful
 </td><td>
-{{int:Loginsuccesstitle}}
+{{int:73eb6767}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logout&action=edit logout]<br>
-[[MediaWiki_talk:Logout|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e43d612e&action=edit 55525e1b]<br>
+[[MediaWiki_talk:e43d612e|Talk]]
 </td><td>
 Log out
 </td><td>
-{{int:Logout}}
+{{int:e43d612e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logouttext&action=edit logouttext]<br>
-[[MediaWiki_talk:Logouttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a8455b1c&action=edit 50310460]<br>
+[[MediaWiki_talk:a8455b1c|Talk]]
 </td><td>
 You are now logged out.
 You can continue to use Wiktionary anonymously, or you can log in
@@ -2280,311 +2280,311 @@ continue to be displayed as if you were still logged in, until you clear
 your browser cache
 
 </td><td>
-{{int:Logouttext}}
+{{int:a8455b1c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logouttitle&action=edit logouttitle]<br>
-[[MediaWiki_talk:Logouttitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cd48f4e7&action=edit 8f9db4e5]<br>
+[[MediaWiki_talk:cd48f4e7|Talk]]
 </td><td>
 User logout
 </td><td>
-{{int:Logouttitle}}
+{{int:cd48f4e7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lonelypages&action=edit lonelypages]<br>
-[[MediaWiki_talk:Lonelypages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:916f5569&action=edit 92ab2259]<br>
+[[MediaWiki_talk:916f5569|Talk]]
 </td><td>
 Orphaned pages
 </td><td>
-{{int:Lonelypages}}
+{{int:916f5569}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Longpages&action=edit longpages]<br>
-[[MediaWiki_talk:Longpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9cdfa115&action=edit 38996948]<br>
+[[MediaWiki_talk:9cdfa115|Talk]]
 </td><td>
 Long pages
 </td><td>
-{{int:Longpages}}
+{{int:9cdfa115}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Longpagewarning&action=edit longpagewarning]<br>
-[[MediaWiki_talk:Longpagewarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b91ee293&action=edit 09b5b0a2]<br>
+[[MediaWiki_talk:b91ee293|Talk]]
 </td><td>
 WARNING: This page is $1 kilobytes long; some
 browsers may have problems editing pages approaching or longer than 32kb.
 Please consider breaking the page into smaller sections.
 </td><td>
-{{int:Longpagewarning}}
+{{int:b91ee293}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailerror&action=edit mailerror]<br>
-[[MediaWiki_talk:Mailerror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1ca3c8a2&action=edit 2b82fce3]<br>
+[[MediaWiki_talk:1ca3c8a2|Talk]]
 </td><td>
 Error sending mail: $1
 </td><td>
-{{int:Mailerror}}
+{{int:1ca3c8a2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailmypassword&action=edit mailmypassword]<br>
-[[MediaWiki_talk:Mailmypassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:97681e3e&action=edit 669d145f]<br>
+[[MediaWiki_talk:97681e3e|Talk]]
 </td><td>
 Mail me a new password
 </td><td>
-{{int:Mailmypassword}}
+{{int:97681e3e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailnologin&action=edit mailnologin]<br>
-[[MediaWiki_talk:Mailnologin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8646515d&action=edit 874a6660]<br>
+[[MediaWiki_talk:8646515d|Talk]]
 </td><td>
 No send address
 </td><td>
-{{int:Mailnologin}}
+{{int:8646515d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailnologintext&action=edit mailnologintext]<br>
-[[MediaWiki_talk:Mailnologintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f8116e36&action=edit ce0442ed]<br>
+[[MediaWiki_talk:f8116e36|Talk]]
 </td><td>
 You must be &lt;a href=&quot;{{localurl:Special:Userlogin&quot;&gt;logged in&lt;/a&gt;
 and have a valid e-mail address in your &lt;a href=&quot;/wiki/Special:Preferences&quot;&gt;preferences&lt;/a&gt;
 to send e-mail to other users.
 </td><td>
-{{int:Mailnologintext}}
+{{int:f8116e36}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpage&action=edit mainpage]<br>
-[[MediaWiki_talk:Mainpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:95989ab3&action=edit 6ad3db9a]<br>
+[[MediaWiki_talk:95989ab3|Talk]]
 </td><td>
 Main Page
 </td><td>
-{{int:Mainpage}}
+{{int:95989ab3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpagedocfooter&action=edit mainpagedocfooter]<br>
-[[MediaWiki_talk:Mainpagedocfooter|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:216e0fe3&action=edit 19d499cf]<br>
+[[MediaWiki_talk:216e0fe3|Talk]]
 </td><td>
 Please see &#91;http&#58;//meta.wikipedia.org/wiki/MediaWiki_i18n documentation on customizing the interface]
 and the &#91;http&#58;//meta.wikipedia.org/wiki/MediaWiki_User%27s_Guide User&#39;s Guide] for usage and configuration help.
 </td><td>
-{{int:Mainpagedocfooter}}
+{{int:216e0fe3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpagetext&action=edit mainpagetext]<br>
-[[MediaWiki_talk:Mainpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:29c07aac&action=edit 30186460]<br>
+[[MediaWiki_talk:29c07aac|Talk]]
 </td><td>
 Wiki software successfully installed.
 </td><td>
-{{int:Mainpagetext}}
+{{int:29c07aac}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintenance&action=edit maintenance]<br>
-[[MediaWiki_talk:Maintenance|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:94de303b&action=edit 5b30e2c5]<br>
+[[MediaWiki_talk:94de303b|Talk]]
 </td><td>
 Maintenance page
 </td><td>
-{{int:Maintenance}}
+{{int:94de303b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintenancebacklink&action=edit maintenancebacklink]<br>
-[[MediaWiki_talk:Maintenancebacklink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b98df751&action=edit aa734abd]<br>
+[[MediaWiki_talk:b98df751|Talk]]
 </td><td>
 Back to Maintenance Page
 </td><td>
-{{int:Maintenancebacklink}}
+{{int:b98df751}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintnancepagetext&action=edit maintnancepagetext]<br>
-[[MediaWiki_talk:Maintnancepagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5e830e7c&action=edit ff589b21]<br>
+[[MediaWiki_talk:5e830e7c|Talk]]
 </td><td>
 This page includes several handy tools for everyday maintenance. Some of these functions tend to stress the database, so please do not hit reload after every item you fixed ;-)
 </td><td>
-{{int:Maintnancepagetext}}
+{{int:5e830e7c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysop&action=edit makesysop]<br>
-[[MediaWiki_talk:Makesysop|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:147d840b&action=edit 192a7baa]<br>
+[[MediaWiki_talk:147d840b|Talk]]
 </td><td>
 Make a user into a sysop
 </td><td>
-{{int:Makesysop}}
+{{int:147d840b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopfail&action=edit makesysopfail]<br>
-[[MediaWiki_talk:Makesysopfail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3e1272dd&action=edit c857a847]<br>
+[[MediaWiki_talk:3e1272dd|Talk]]
 </td><td>
 &lt;b&gt;User &quot;$1&quot; could not be made into a sysop. (Did you enter the name correctly?)&lt;/b&gt;
 </td><td>
-{{int:Makesysopfail}}
+{{int:3e1272dd}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopname&action=edit makesysopname]<br>
-[[MediaWiki_talk:Makesysopname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f942827d&action=edit 4ae2de91]<br>
+[[MediaWiki_talk:f942827d|Talk]]
 </td><td>
 Name of the user:
 </td><td>
-{{int:Makesysopname}}
+{{int:f942827d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopok&action=edit makesysopok]<br>
-[[MediaWiki_talk:Makesysopok|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8933e97e&action=edit 1138d88d]<br>
+[[MediaWiki_talk:8933e97e|Talk]]
 </td><td>
 &lt;b&gt;User &quot;$1&quot; is now a sysop&lt;/b&gt;
 </td><td>
-{{int:Makesysopok}}
+{{int:8933e97e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopsubmit&action=edit makesysopsubmit]<br>
-[[MediaWiki_talk:Makesysopsubmit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ffde53f7&action=edit 51a3d81a]<br>
+[[MediaWiki_talk:ffde53f7|Talk]]
 </td><td>
 Make this user into a sysop
 </td><td>
-{{int:Makesysopsubmit}}
+{{int:ffde53f7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysoptext&action=edit makesysoptext]<br>
-[[MediaWiki_talk:Makesysoptext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6135d20c&action=edit 9014f0fd]<br>
+[[MediaWiki_talk:6135d20c|Talk]]
 </td><td>
 This form is used by bureaucrats to turn ordinary users into administrators. 
 Type the name of the user in the box and press the button to make the user an administrator
 </td><td>
-{{int:Makesysoptext}}
+{{int:6135d20c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysoptitle&action=edit makesysoptitle]<br>
-[[MediaWiki_talk:Makesysoptitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:40537c23&action=edit 9d7a92cc]<br>
+[[MediaWiki_talk:40537c23|Talk]]
 </td><td>
 Make a user into a sysop
 </td><td>
-{{int:Makesysoptitle}}
+{{int:40537c23}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Matchtotals&action=edit matchtotals]<br>
-[[MediaWiki_talk:Matchtotals|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b00f5f1f&action=edit f2f4e13e]<br>
+[[MediaWiki_talk:b00f5f1f|Talk]]
 </td><td>
 The query &quot;$1&quot; matched $2 page titles
 and the text of $3 pages.
 </td><td>
-{{int:Matchtotals}}
+{{int:b00f5f1f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math&action=edit math]<br>
-[[MediaWiki_talk:Math|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3edf0df4&action=edit 7a488390]<br>
+[[MediaWiki_talk:3edf0df4|Talk]]
 </td><td>
 Rendering math
 </td><td>
-{{int:Math}}
+{{int:3edf0df4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_bad_output&action=edit math_bad_output]<br>
-[[MediaWiki_talk:Math_bad_output|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:78c6cb06&action=edit d9b8688c]<br>
+[[MediaWiki_talk:78c6cb06|Talk]]
 </td><td>
 Can&#39;t write to or create math output directory
 </td><td>
-{{int:Math_bad_output}}
+{{int:78c6cb06}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_bad_tmpdir&action=edit math_bad_tmpdir]<br>
-[[MediaWiki_talk:Math_bad_tmpdir|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f83fe947&action=edit be21263f]<br>
+[[MediaWiki_talk:f83fe947|Talk]]
 </td><td>
 Can&#39;t write to or create math temp directory
 </td><td>
-{{int:Math_bad_tmpdir}}
+{{int:f83fe947}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_failure&action=edit math_failure]<br>
-[[MediaWiki_talk:Math_failure|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f8cf40ba&action=edit 53e1c013]<br>
+[[MediaWiki_talk:f8cf40ba|Talk]]
 </td><td>
 Failed to parse
 </td><td>
-{{int:Math_failure}}
+{{int:f8cf40ba}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_image_error&action=edit math_image_error]<br>
-[[MediaWiki_talk:Math_image_error|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7b3e958f&action=edit 7082c48f]<br>
+[[MediaWiki_talk:7b3e958f|Talk]]
 </td><td>
 PNG conversion failed; check for correct installation of latex, dvips, gs, and convert
 </td><td>
-{{int:Math_image_error}}
+{{int:7b3e958f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_lexing_error&action=edit math_lexing_error]<br>
-[[MediaWiki_talk:Math_lexing_error|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d6a158de&action=edit 41e6fe2b]<br>
+[[MediaWiki_talk:d6a158de|Talk]]
 </td><td>
 lexing error
 </td><td>
-{{int:Math_lexing_error}}
+{{int:d6a158de}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_notexvc&action=edit math_notexvc]<br>
-[[MediaWiki_talk:Math_notexvc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8109168a&action=edit 20ec4685]<br>
+[[MediaWiki_talk:8109168a|Talk]]
 </td><td>
 Missing texvc executable; please see math/README to configure.
 </td><td>
-{{int:Math_notexvc}}
+{{int:8109168a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_sample&action=edit math_sample]<br>
-[[MediaWiki_talk:Math_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:41b65279&action=edit 3e8b5972]<br>
+[[MediaWiki_talk:41b65279|Talk]]
 </td><td>
 Insert formula here
 </td><td>
-{{int:Math_sample}}
+{{int:41b65279}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_syntax_error&action=edit math_syntax_error]<br>
-[[MediaWiki_talk:Math_syntax_error|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5cbab860&action=edit d5667f6b]<br>
+[[MediaWiki_talk:5cbab860|Talk]]
 </td><td>
 syntax error
 </td><td>
-{{int:Math_syntax_error}}
+{{int:5cbab860}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_tip&action=edit math_tip]<br>
-[[MediaWiki_talk:Math_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7e756feb&action=edit 0baadf18]<br>
+[[MediaWiki_talk:7e756feb|Talk]]
 </td><td>
 Mathematical formula (LaTeX)
 </td><td>
-{{int:Math_tip}}
+{{int:7e756feb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_unknown_error&action=edit math_unknown_error]<br>
-[[MediaWiki_talk:Math_unknown_error|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fb4d261d&action=edit 5e0c970a]<br>
+[[MediaWiki_talk:fb4d261d|Talk]]
 </td><td>
 unknown error
 </td><td>
-{{int:Math_unknown_error}}
+{{int:fb4d261d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_unknown_function&action=edit math_unknown_function]<br>
-[[MediaWiki_talk:Math_unknown_function|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:26558f91&action=edit a0577d1d]<br>
+[[MediaWiki_talk:26558f91|Talk]]
 </td><td>
 unknown function 
 </td><td>
-{{int:Math_unknown_function}}
+{{int:26558f91}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Media_sample&action=edit media_sample]<br>
-[[MediaWiki_talk:Media_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:63e94059&action=edit 704093ed]<br>
+[[MediaWiki_talk:63e94059|Talk]]
 </td><td>
 Example.mp3
 </td><td>
-{{int:Media_sample}}
+{{int:63e94059}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Media_tip&action=edit media_tip]<br>
-[[MediaWiki_talk:Media_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8e4baaa8&action=edit 77fbb90b]<br>
+[[MediaWiki_talk:8e4baaa8|Talk]]
 </td><td>
 Media file link
 </td><td>
-{{int:Media_tip}}
+{{int:8e4baaa8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minlength&action=edit minlength]<br>
-[[MediaWiki_talk:Minlength|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cca18055&action=edit 61350cd2]<br>
+[[MediaWiki_talk:cca18055|Talk]]
 </td><td>
 Image names must be at least three letters.
 </td><td>
-{{int:Minlength}}
+{{int:cca18055}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minoredit&action=edit minoredit]<br>
-[[MediaWiki_talk:Minoredit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7f8c4ff3&action=edit 3dd77123]<br>
+[[MediaWiki_talk:7f8c4ff3|Talk]]
 </td><td>
 This is a minor edit
 </td><td>
-{{int:Minoredit}}
+{{int:7f8c4ff3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minoreditletter&action=edit minoreditletter]<br>
-[[MediaWiki_talk:Minoreditletter|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ce5828a8&action=edit 3c37ba2f]<br>
+[[MediaWiki_talk:ce5828a8|Talk]]
 </td><td>
 M
 </td><td>
-{{int:Minoreditletter}}
+{{int:ce5828a8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelings&action=edit mispeelings]<br>
-[[MediaWiki_talk:Mispeelings|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1e3a3f5e&action=edit abf0b01a]<br>
+[[MediaWiki_talk:1e3a3f5e|Talk]]
 </td><td>
 Pages with misspellings
 </td><td>
-{{int:Mispeelings}}
+{{int:1e3a3f5e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelingspage&action=edit mispeelingspage]<br>
-[[MediaWiki_talk:Mispeelingspage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:18c50601&action=edit 4841b1be]<br>
+[[MediaWiki_talk:18c50601|Talk]]
 </td><td>
 List of common misspellings
 </td><td>
-{{int:Mispeelingspage}}
+{{int:18c50601}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelingstext&action=edit mispeelingstext]<br>
-[[MediaWiki_talk:Mispeelingstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ff661e66&action=edit 20eeb250]<br>
+[[MediaWiki_talk:ff661e66|Talk]]
 </td><td>
 The following pages contain a common misspelling, which are listed on $1. The correct spelling might be given (like this).
 </td><td>
-{{int:Mispeelingstext}}
+{{int:ff661e66}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missingarticle&action=edit missingarticle]<br>
-[[MediaWiki_talk:Missingarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:77dd649d&action=edit 28d8d2f3]<br>
+[[MediaWiki_talk:77dd649d|Talk]]
 </td><td>
 The database did not find the text of a page
 that it should have found, named &quot;$1&quot;.
@@ -2595,96 +2595,96 @@ page that has been deleted.
 &lt;p&gt;If this is not the case, you may have found a bug in the software.
 Please report this to an administrator, making note of the URL.
 </td><td>
-{{int:Missingarticle}}
+{{int:77dd649d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missingimage&action=edit missingimage]<br>
-[[MediaWiki_talk:Missingimage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:43bf0acd&action=edit d6472ac8]<br>
+[[MediaWiki_talk:43bf0acd|Talk]]
 </td><td>
 &lt;b&gt;Missing image&lt;/b&gt;&lt;br /&gt;&lt;i&gt;$1&lt;/i&gt;
 
 </td><td>
-{{int:Missingimage}}
+{{int:43bf0acd}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinks&action=edit missinglanguagelinks]<br>
-[[MediaWiki_talk:Missinglanguagelinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:75c0518a&action=edit f433e9c8]<br>
+[[MediaWiki_talk:75c0518a|Talk]]
 </td><td>
 Missing Language Links
 </td><td>
-{{int:Missinglanguagelinks}}
+{{int:75c0518a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinksbutton&action=edit missinglanguagelinksbutton]<br>
-[[MediaWiki_talk:Missinglanguagelinksbutton|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5ef61b91&action=edit a4a9fdcd]<br>
+[[MediaWiki_talk:5ef61b91|Talk]]
 </td><td>
 Find missing language links for
 </td><td>
-{{int:Missinglanguagelinksbutton}}
+{{int:5ef61b91}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinkstext&action=edit missinglanguagelinkstext]<br>
-[[MediaWiki_talk:Missinglanguagelinkstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f5affad8&action=edit e46ff038]<br>
+[[MediaWiki_talk:f5affad8|Talk]]
 </td><td>
 These pages do &lt;i&gt;not&lt;/i&gt; link to their counterpart in $1. Redirects and subpages are &lt;i&gt;not&lt;/i&gt; shown.
 </td><td>
-{{int:Missinglanguagelinkstext}}
+{{int:f5affad8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Moredotdotdot&action=edit moredotdotdot]<br>
-[[MediaWiki_talk:Moredotdotdot|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:22e2c957&action=edit b43c02b9]<br>
+[[MediaWiki_talk:22e2c957|Talk]]
 </td><td>
 More...
 </td><td>
-{{int:Moredotdotdot}}
+{{int:22e2c957}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Move&action=edit move]<br>
-[[MediaWiki_talk:Move|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:76cdb950&action=edit 379d6ce9]<br>
+[[MediaWiki_talk:76cdb950|Talk]]
 </td><td>
 Move
 </td><td>
-{{int:Move}}
+{{int:76cdb950}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movearticle&action=edit movearticle]<br>
-[[MediaWiki_talk:Movearticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:31d22872&action=edit d55a3c2a]<br>
+[[MediaWiki_talk:31d22872|Talk]]
 </td><td>
 Move page
 </td><td>
-{{int:Movearticle}}
+{{int:31d22872}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movedto&action=edit movedto]<br>
-[[MediaWiki_talk:Movedto|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fb280ed2&action=edit 0bd0c880]<br>
+[[MediaWiki_talk:fb280ed2|Talk]]
 </td><td>
 moved to
 </td><td>
-{{int:Movedto}}
+{{int:fb280ed2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movenologin&action=edit movenologin]<br>
-[[MediaWiki_talk:Movenologin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8ddc20a0&action=edit 7c041d6e]<br>
+[[MediaWiki_talk:8ddc20a0|Talk]]
 </td><td>
 Not logged in
 </td><td>
-{{int:Movenologin}}
+{{int:8ddc20a0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movenologintext&action=edit movenologintext]<br>
-[[MediaWiki_talk:Movenologintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:75985d0e&action=edit e479574b]<br>
+[[MediaWiki_talk:75985d0e|Talk]]
 </td><td>
 You must be a registered user and &lt;a href=&quot;/wiki/Special:Userlogin&quot;&gt;logged in&lt;/a&gt;
 to move a page.
 </td><td>
-{{int:Movenologintext}}
+{{int:75985d0e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepage&action=edit movepage]<br>
-[[MediaWiki_talk:Movepage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:addffb42&action=edit 0f05ab2b]<br>
+[[MediaWiki_talk:addffb42|Talk]]
 </td><td>
 Move page
 </td><td>
-{{int:Movepage}}
+{{int:addffb42}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagebtn&action=edit movepagebtn]<br>
-[[MediaWiki_talk:Movepagebtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6f9e8dfc&action=edit 0311d79b]<br>
+[[MediaWiki_talk:6f9e8dfc|Talk]]
 </td><td>
 Move page
 </td><td>
-{{int:Movepagebtn}}
+{{int:6f9e8dfc}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagetalktext&action=edit movepagetalktext]<br>
-[[MediaWiki_talk:Movepagetalktext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:993d5ce8&action=edit 53ab3d1c]<br>
+[[MediaWiki_talk:993d5ce8|Talk]]
 </td><td>
 The associated talk page, if any, will be automatically moved along with it &#39;&#39;&#39;unless:&#39;&#39;&#39;
 *You are moving the page across namespaces,
@@ -2693,10 +2693,10 @@ The associated talk page, if any, will be automatically moved along with it &#39
 
 In those cases, you will have to move or merge the page manually if desired.
 </td><td>
-{{int:Movepagetalktext}}
+{{int:993d5ce8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagetext&action=edit movepagetext]<br>
-[[MediaWiki_talk:Movepagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ce6bc0ee&action=edit a363312c]<br>
+[[MediaWiki_talk:ce6bc0ee|Talk]]
 </td><td>
 Using the form below will rename a page, moving all
 of its history to the new name.
@@ -2717,798 +2717,798 @@ This can be a drastic and unexpected change for a popular page;
 please be sure you understand the consequences of this before
 proceeding.
 </td><td>
-{{int:Movepagetext}}
+{{int:ce6bc0ee}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movetalk&action=edit movetalk]<br>
-[[MediaWiki_talk:Movetalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e0a05db0&action=edit 7bd87d2d]<br>
+[[MediaWiki_talk:e0a05db0|Talk]]
 </td><td>
 Move &quot;talk&quot; page as well, if applicable.
 </td><td>
-{{int:Movetalk}}
+{{int:e0a05db0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movethispage&action=edit movethispage]<br>
-[[MediaWiki_talk:Movethispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:689ff1e7&action=edit 2119d3ee]<br>
+[[MediaWiki_talk:689ff1e7|Talk]]
 </td><td>
 Move this page
 </td><td>
-{{int:Movethispage}}
+{{int:689ff1e7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mycontris&action=edit mycontris]<br>
-[[MediaWiki_talk:Mycontris|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0dc37cdb&action=edit 12b6caf0]<br>
+[[MediaWiki_talk:0dc37cdb|Talk]]
 </td><td>
 My contributions
 </td><td>
-{{int:Mycontris}}
+{{int:0dc37cdb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mypage&action=edit mypage]<br>
-[[MediaWiki_talk:Mypage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:51a7215d&action=edit 5d558678]<br>
+[[MediaWiki_talk:51a7215d|Talk]]
 </td><td>
 My page
 </td><td>
-{{int:Mypage}}
+{{int:51a7215d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mytalk&action=edit mytalk]<br>
-[[MediaWiki_talk:Mytalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fbe8f485&action=edit 49886539]<br>
+[[MediaWiki_talk:fbe8f485|Talk]]
 </td><td>
 My talk
 </td><td>
-{{int:Mytalk}}
+{{int:fbe8f485}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Navigation&action=edit navigation]<br>
-[[MediaWiki_talk:Navigation|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cf03cf2e&action=edit ad831792]<br>
+[[MediaWiki_talk:cf03cf2e|Talk]]
 </td><td>
 Navigation
 </td><td>
-{{int:Navigation}}
+{{int:cf03cf2e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nbytes&action=edit nbytes]<br>
-[[MediaWiki_talk:Nbytes|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b5b13ae8&action=edit e75caf8a]<br>
+[[MediaWiki_talk:b5b13ae8|Talk]]
 </td><td>
 $1 bytes
 </td><td>
-{{int:Nbytes}}
+{{int:b5b13ae8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nchanges&action=edit nchanges]<br>
-[[MediaWiki_talk:Nchanges|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bee99a5f&action=edit 3d7d513a]<br>
+[[MediaWiki_talk:bee99a5f|Talk]]
 </td><td>
 $1 changes
 </td><td>
-{{int:Nchanges}}
+{{int:bee99a5f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newarticle&action=edit newarticle]<br>
-[[MediaWiki_talk:Newarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:654df301&action=edit 06b1c460]<br>
+[[MediaWiki_talk:654df301|Talk]]
 </td><td>
 (New)
 </td><td>
-{{int:Newarticle}}
+{{int:654df301}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newarticletext&action=edit newarticletext]<br>
-[[MediaWiki_talk:Newarticletext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f1622d18&action=edit b90d5eb0]<br>
+[[MediaWiki_talk:f1622d18|Talk]]
 </td><td>
 You&#39;ve followed a link to a page that doesn&#39;t exist yet.
 To create the page, start typing in the box below 
 (see the &#91;&#91;Wiktionary:Help&#124;help page]] for more info).
 If you are here by mistake, just click your browser&#39;s &#39;&#39;&#39;back&#39;&#39;&#39; button.
 </td><td>
-{{int:Newarticletext}}
+{{int:f1622d18}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newmessages&action=edit newmessages]<br>
-[[MediaWiki_talk:Newmessages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:780ce01b&action=edit 0b08523d]<br>
+[[MediaWiki_talk:780ce01b|Talk]]
 </td><td>
 You have $1.
 </td><td>
-{{int:Newmessages}}
+{{int:780ce01b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newmessageslink&action=edit newmessageslink]<br>
-[[MediaWiki_talk:Newmessageslink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e09d8ffe&action=edit 1f028736]<br>
+[[MediaWiki_talk:e09d8ffe|Talk]]
 </td><td>
 new messages
 </td><td>
-{{int:Newmessageslink}}
+{{int:e09d8ffe}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpage&action=edit newpage]<br>
-[[MediaWiki_talk:Newpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ce656abe&action=edit d68c7e3c]<br>
+[[MediaWiki_talk:ce656abe|Talk]]
 </td><td>
 New page
 </td><td>
-{{int:Newpage}}
+{{int:ce656abe}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpageletter&action=edit newpageletter]<br>
-[[MediaWiki_talk:Newpageletter|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b886426f&action=edit d081a481]<br>
+[[MediaWiki_talk:b886426f|Talk]]
 </td><td>
 N
 </td><td>
-{{int:Newpageletter}}
+{{int:b886426f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpages&action=edit newpages]<br>
-[[MediaWiki_talk:Newpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2adf1ae7&action=edit eeadf049]<br>
+[[MediaWiki_talk:2adf1ae7|Talk]]
 </td><td>
 New pages
 </td><td>
-{{int:Newpages}}
+{{int:2adf1ae7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpassword&action=edit newpassword]<br>
-[[MediaWiki_talk:Newpassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:393f8bca&action=edit f2c57870]<br>
+[[MediaWiki_talk:393f8bca|Talk]]
 </td><td>
 New password
 </td><td>
-{{int:Newpassword}}
+{{int:393f8bca}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newtitle&action=edit newtitle]<br>
-[[MediaWiki_talk:Newtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fa56bbd9&action=edit a104cc01]<br>
+[[MediaWiki_talk:fa56bbd9|Talk]]
 </td><td>
 To new title
 </td><td>
-{{int:Newtitle}}
+{{int:fa56bbd9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newusersonly&action=edit newusersonly]<br>
-[[MediaWiki_talk:Newusersonly|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a57c83c&action=edit 41af2ba5]<br>
+[[MediaWiki_talk:2a57c83c|Talk]]
 </td><td>
  (new users only)
 </td><td>
-{{int:Newusersonly}}
+{{int:2a57c83c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Next&action=edit next]<br>
-[[MediaWiki_talk:Next|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bc981983&action=edit edee9402]<br>
+[[MediaWiki_talk:bc981983|Talk]]
 </td><td>
 next
 </td><td>
-{{int:Next}}
+{{int:bc981983}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nextn&action=edit nextn]<br>
-[[MediaWiki_talk:Nextn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5e067f51&action=edit e0bd4ddb]<br>
+[[MediaWiki_talk:5e067f51|Talk]]
 </td><td>
 next $1
 </td><td>
-{{int:Nextn}}
+{{int:5e067f51}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nlinks&action=edit nlinks]<br>
-[[MediaWiki_talk:Nlinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:61c11c45&action=edit 2b45e9af]<br>
+[[MediaWiki_talk:61c11c45|Talk]]
 </td><td>
 $1 links
 </td><td>
-{{int:Nlinks}}
+{{int:61c11c45}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noaffirmation&action=edit noaffirmation]<br>
-[[MediaWiki_talk:Noaffirmation|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e307257f&action=edit f6f5e28d]<br>
+[[MediaWiki_talk:e307257f|Talk]]
 </td><td>
 You must affirm that your upload does not violate
 any copyrights.
 </td><td>
-{{int:Noaffirmation}}
+{{int:e307257f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noarticletext&action=edit noarticletext]<br>
-[[MediaWiki_talk:Noarticletext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:335462de&action=edit 2658d031]<br>
+[[MediaWiki_talk:335462de|Talk]]
 </td><td>
 (There is currently no text in this page)
 </td><td>
-{{int:Noarticletext}}
+{{int:335462de}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noblockreason&action=edit noblockreason]<br>
-[[MediaWiki_talk:Noblockreason|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:46716843&action=edit 68326cbc]<br>
+[[MediaWiki_talk:46716843|Talk]]
 </td><td>
 You must supply a reason for the block.
 </td><td>
-{{int:Noblockreason}}
+{{int:46716843}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noconnect&action=edit noconnect]<br>
-[[MediaWiki_talk:Noconnect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8fa787f6&action=edit 5d122d51]<br>
+[[MediaWiki_talk:8fa787f6|Talk]]
 </td><td>
 Sorry! The wiki is experiencing some technical difficulties, and cannot contact the database server.
 </td><td>
-{{int:Noconnect}}
+{{int:8fa787f6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocontribs&action=edit nocontribs]<br>
-[[MediaWiki_talk:Nocontribs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f60d1a6d&action=edit b88f305b]<br>
+[[MediaWiki_talk:f60d1a6d|Talk]]
 </td><td>
 No changes were found matching these criteria.
 </td><td>
-{{int:Nocontribs}}
+{{int:f60d1a6d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocookieslogin&action=edit nocookieslogin]<br>
-[[MediaWiki_talk:Nocookieslogin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9d931b8c&action=edit de736886]<br>
+[[MediaWiki_talk:9d931b8c|Talk]]
 </td><td>
 Wiktionary uses cookies to log in users. You have cookies disabled. Please enable them and try again.
 </td><td>
-{{int:Nocookieslogin}}
+{{int:9d931b8c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocookiesnew&action=edit nocookiesnew]<br>
-[[MediaWiki_talk:Nocookiesnew|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e4a19fc8&action=edit 71c8d192]<br>
+[[MediaWiki_talk:e4a19fc8|Talk]]
 </td><td>
 The user account was created, but you are not logged in. Wiktionary uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.
 </td><td>
-{{int:Nocookiesnew}}
+{{int:e4a19fc8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocreativecommons&action=edit nocreativecommons]<br>
-[[MediaWiki_talk:Nocreativecommons|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6fbb6d3a&action=edit cc61a719]<br>
+[[MediaWiki_talk:6fbb6d3a|Talk]]
 </td><td>
 Creative Commons RDF metadata disabled for this server.
 </td><td>
-{{int:Nocreativecommons}}
+{{int:6fbb6d3a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nodb&action=edit nodb]<br>
-[[MediaWiki_talk:Nodb|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e0dd32fc&action=edit 5ed4cf16]<br>
+[[MediaWiki_talk:e0dd32fc|Talk]]
 </td><td>
 Could not select database $1
 </td><td>
-{{int:Nodb}}
+{{int:e0dd32fc}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nodublincore&action=edit nodublincore]<br>
-[[MediaWiki_talk:Nodublincore|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:067ee3e9&action=edit 3a58322b]<br>
+[[MediaWiki_talk:067ee3e9|Talk]]
 </td><td>
 Dublin Core RDF metadata disabled for this server.
 </td><td>
-{{int:Nodublincore}}
+{{int:067ee3e9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemail&action=edit noemail]<br>
-[[MediaWiki_talk:Noemail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:325a917f&action=edit 4c8d93d2]<br>
+[[MediaWiki_talk:325a917f|Talk]]
 </td><td>
 There is no e-mail address recorded for user &quot;$1&quot;.
 </td><td>
-{{int:Noemail}}
+{{int:325a917f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemailtext&action=edit noemailtext]<br>
-[[MediaWiki_talk:Noemailtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:deb172c1&action=edit f8bace82]<br>
+[[MediaWiki_talk:deb172c1|Talk]]
 </td><td>
 This user has not specified a valid e-mail address,
 or has chosen not to receive e-mail from other users.
 </td><td>
-{{int:Noemailtext}}
+{{int:deb172c1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemailtitle&action=edit noemailtitle]<br>
-[[MediaWiki_talk:Noemailtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6bd33d89&action=edit a158d61f]<br>
+[[MediaWiki_talk:6bd33d89|Talk]]
 </td><td>
 No e-mail address
 </td><td>
-{{int:Noemailtitle}}
+{{int:6bd33d89}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nogomatch&action=edit nogomatch]<br>
-[[MediaWiki_talk:Nogomatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e68327b0&action=edit 36552107]<br>
+[[MediaWiki_talk:e68327b0|Talk]]
 </td><td>
 No page with this exact title exists, trying full text search.
 </td><td>
-{{int:Nogomatch}}
+{{int:e68327b0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nohistory&action=edit nohistory]<br>
-[[MediaWiki_talk:Nohistory|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:90c1625a&action=edit 8d231ce4]<br>
+[[MediaWiki_talk:90c1625a|Talk]]
 </td><td>
 There is no edit history for this page.
 </td><td>
-{{int:Nohistory}}
+{{int:90c1625a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nolinkshere&action=edit nolinkshere]<br>
-[[MediaWiki_talk:Nolinkshere|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:13e13fa2&action=edit e63b6d19]<br>
+[[MediaWiki_talk:13e13fa2|Talk]]
 </td><td>
 No pages link to here.
 </td><td>
-{{int:Nolinkshere}}
+{{int:13e13fa2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nolinkstoimage&action=edit nolinkstoimage]<br>
-[[MediaWiki_talk:Nolinkstoimage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5c3c99a8&action=edit 1e827a30]<br>
+[[MediaWiki_talk:5c3c99a8|Talk]]
 </td><td>
 There are no pages that link to this image.
 </td><td>
-{{int:Nolinkstoimage}}
+{{int:5c3c99a8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noname&action=edit noname]<br>
-[[MediaWiki_talk:Noname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d9ff75a4&action=edit e21bfc14]<br>
+[[MediaWiki_talk:d9ff75a4|Talk]]
 </td><td>
 You have not specified a valid user name.
 </td><td>
-{{int:Noname}}
+{{int:d9ff75a4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nonefound&action=edit nonefound]<br>
-[[MediaWiki_talk:Nonefound|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f7d27b0c&action=edit 5db654d1]<br>
+[[MediaWiki_talk:f7d27b0c|Talk]]
 </td><td>
 &lt;strong&gt;Note&lt;/strong&gt;: unsuccessful searches are
 often caused by searching for common words like &quot;have&quot; and &quot;from&quot;,
 which are not indexed, or by specifying more than one search term (only pages
 containing all of the search terms will appear in the result).
 </td><td>
-{{int:Nonefound}}
+{{int:f7d27b0c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nospecialpagetext&action=edit nospecialpagetext]<br>
-[[MediaWiki_talk:Nospecialpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d5f565dd&action=edit aaaac807]<br>
+[[MediaWiki_talk:d5f565dd|Talk]]
 </td><td>
 You have requested a special page that is not
 recognized by the wiki.
 </td><td>
-{{int:Nospecialpagetext}}
+{{int:d5f565dd}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchaction&action=edit nosuchaction]<br>
-[[MediaWiki_talk:Nosuchaction|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:247c2db2&action=edit 273b8154]<br>
+[[MediaWiki_talk:247c2db2|Talk]]
 </td><td>
 No such action
 </td><td>
-{{int:Nosuchaction}}
+{{int:247c2db2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchactiontext&action=edit nosuchactiontext]<br>
-[[MediaWiki_talk:Nosuchactiontext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0e2f696c&action=edit e8773306]<br>
+[[MediaWiki_talk:0e2f696c|Talk]]
 </td><td>
 The action specified by the URL is not
 recognized by the wiki
 </td><td>
-{{int:Nosuchactiontext}}
+{{int:0e2f696c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchspecialpage&action=edit nosuchspecialpage]<br>
-[[MediaWiki_talk:Nosuchspecialpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bd0d7ac6&action=edit b98c7c10]<br>
+[[MediaWiki_talk:bd0d7ac6|Talk]]
 </td><td>
 No such special page
 </td><td>
-{{int:Nosuchspecialpage}}
+{{int:bd0d7ac6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchuser&action=edit nosuchuser]<br>
-[[MediaWiki_talk:Nosuchuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:22012b0a&action=edit f542883d]<br>
+[[MediaWiki_talk:22012b0a|Talk]]
 </td><td>
 There is no user by the name &quot;$1&quot;.
 Check your spelling, or use the form below to create a new user account.
 </td><td>
-{{int:Nosuchuser}}
+{{int:22012b0a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notacceptable&action=edit notacceptable]<br>
-[[MediaWiki_talk:Notacceptable|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:982342c7&action=edit f4909824]<br>
+[[MediaWiki_talk:982342c7|Talk]]
 </td><td>
 The wiki server can&#39;t provide data in a format your client can read.
 </td><td>
-{{int:Notacceptable}}
+{{int:982342c7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notanarticle&action=edit notanarticle]<br>
-[[MediaWiki_talk:Notanarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:272cfb97&action=edit cdb5d3a9]<br>
+[[MediaWiki_talk:272cfb97|Talk]]
 </td><td>
 Not a content page
 </td><td>
-{{int:Notanarticle}}
+{{int:272cfb97}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notargettext&action=edit notargettext]<br>
-[[MediaWiki_talk:Notargettext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8ccaecd6&action=edit 42534913]<br>
+[[MediaWiki_talk:8ccaecd6|Talk]]
 </td><td>
 You have not specified a target page or user
 to perform this function on.
 </td><td>
-{{int:Notargettext}}
+{{int:8ccaecd6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notargettitle&action=edit notargettitle]<br>
-[[MediaWiki_talk:Notargettitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4532ec15&action=edit dff62a20]<br>
+[[MediaWiki_talk:4532ec15|Talk]]
 </td><td>
 No target
 </td><td>
-{{int:Notargettitle}}
+{{int:4532ec15}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Note&action=edit note]<br>
-[[MediaWiki_talk:Note|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2c924e30&action=edit c51048b7]<br>
+[[MediaWiki_talk:2c924e30|Talk]]
 </td><td>
 &lt;strong&gt;Note:&lt;/strong&gt; 
 </td><td>
-{{int:Note}}
+{{int:2c924e30}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notextmatches&action=edit notextmatches]<br>
-[[MediaWiki_talk:Notextmatches|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:51c2043b&action=edit 879701e9]<br>
+[[MediaWiki_talk:51c2043b|Talk]]
 </td><td>
 No page text matches
 </td><td>
-{{int:Notextmatches}}
+{{int:51c2043b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notitlematches&action=edit notitlematches]<br>
-[[MediaWiki_talk:Notitlematches|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6f3befe0&action=edit 5a56ca1b]<br>
+[[MediaWiki_talk:6f3befe0|Talk]]
 </td><td>
 No page title matches
 </td><td>
-{{int:Notitlematches}}
+{{int:6f3befe0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notloggedin&action=edit notloggedin]<br>
-[[MediaWiki_talk:Notloggedin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:219a05e4&action=edit 02bcadd3]<br>
+[[MediaWiki_talk:219a05e4|Talk]]
 </td><td>
 Not logged in
 </td><td>
-{{int:Notloggedin}}
+{{int:219a05e4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowatchlist&action=edit nowatchlist]<br>
-[[MediaWiki_talk:Nowatchlist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:28b54fd2&action=edit ba736b7f]<br>
+[[MediaWiki_talk:28b54fd2|Talk]]
 </td><td>
 You have no items on your watchlist.
 </td><td>
-{{int:Nowatchlist}}
+{{int:28b54fd2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowiki_sample&action=edit nowiki_sample]<br>
-[[MediaWiki_talk:Nowiki_sample|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a78319d8&action=edit 2398990d]<br>
+[[MediaWiki_talk:a78319d8|Talk]]
 </td><td>
 Insert non-formatted text here
 </td><td>
-{{int:Nowiki_sample}}
+{{int:a78319d8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowiki_tip&action=edit nowiki_tip]<br>
-[[MediaWiki_talk:Nowiki_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:20d39be1&action=edit cf8602ad]<br>
+[[MediaWiki_talk:20d39be1|Talk]]
 </td><td>
 Ignore wiki formatting
 </td><td>
-{{int:Nowiki_tip}}
+{{int:20d39be1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-category&action=edit nstab-category]<br>
-[[MediaWiki_talk:Nstab-category|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dee84866&action=edit 7a6336e0]<br>
+[[MediaWiki_talk:dee84866|Talk]]
 </td><td>
 Category
 </td><td>
-{{int:Nstab-category}}
+{{int:dee84866}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-help&action=edit nstab-help]<br>
-[[MediaWiki_talk:Nstab-help|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a3e0d95e&action=edit 16b32116]<br>
+[[MediaWiki_talk:a3e0d95e|Talk]]
 </td><td>
 Help
 </td><td>
-{{int:Nstab-help}}
+{{int:a3e0d95e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-image&action=edit nstab-image]<br>
-[[MediaWiki_talk:Nstab-image|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:911dff1f&action=edit 081e450a]<br>
+[[MediaWiki_talk:911dff1f|Talk]]
 </td><td>
 Image
 </td><td>
-{{int:Nstab-image}}
+{{int:911dff1f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-main&action=edit nstab-main]<br>
-[[MediaWiki_talk:Nstab-main|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:931f9736&action=edit 5b9c503a]<br>
+[[MediaWiki_talk:931f9736|Talk]]
 </td><td>
 Article
 </td><td>
-{{int:Nstab-main}}
+{{int:931f9736}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-media&action=edit nstab-media]<br>
-[[MediaWiki_talk:Nstab-media|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6da2f6ae&action=edit 86e5f16d]<br>
+[[MediaWiki_talk:6da2f6ae|Talk]]
 </td><td>
 Media
 </td><td>
-{{int:Nstab-media}}
+{{int:6da2f6ae}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-mediawiki&action=edit nstab-mediawiki]<br>
-[[MediaWiki_talk:Nstab-mediawiki|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:53504d48&action=edit 368d5d22]<br>
+[[MediaWiki_talk:53504d48|Talk]]
 </td><td>
 Message
 </td><td>
-{{int:Nstab-mediawiki}}
+{{int:53504d48}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-special&action=edit nstab-special]<br>
-[[MediaWiki_talk:Nstab-special|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:14d4daef&action=edit 34a2cba3]<br>
+[[MediaWiki_talk:14d4daef|Talk]]
 </td><td>
 Special
 </td><td>
-{{int:Nstab-special}}
+{{int:14d4daef}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-template&action=edit nstab-template]<br>
-[[MediaWiki_talk:Nstab-template|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ed2e8b27&action=edit a1024e18]<br>
+[[MediaWiki_talk:ed2e8b27|Talk]]
 </td><td>
 Template
 </td><td>
-{{int:Nstab-template}}
+{{int:ed2e8b27}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-user&action=edit nstab-user]<br>
-[[MediaWiki_talk:Nstab-user|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:31ebc74b&action=edit 313f5ee2]<br>
+[[MediaWiki_talk:31ebc74b|Talk]]
 </td><td>
 User page
 </td><td>
-{{int:Nstab-user}}
+{{int:31ebc74b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-wp&action=edit nstab-wp]<br>
-[[MediaWiki_talk:Nstab-wp|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a8d28daa&action=edit 0611a13e]<br>
+[[MediaWiki_talk:a8d28daa|Talk]]
 </td><td>
 About
 </td><td>
-{{int:Nstab-wp}}
+{{int:a8d28daa}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ok&action=edit ok]<br>
-[[MediaWiki_talk:Ok|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b0a98216&action=edit 7a85f476]<br>
+[[MediaWiki_talk:b0a98216|Talk]]
 </td><td>
 OK
 </td><td>
-{{int:Ok}}
+{{int:b0a98216}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Oldpassword&action=edit oldpassword]<br>
-[[MediaWiki_talk:Oldpassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e081cf87&action=edit 23ace733]<br>
+[[MediaWiki_talk:e081cf87|Talk]]
 </td><td>
 Old password
 </td><td>
-{{int:Oldpassword}}
+{{int:e081cf87}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Orig&action=edit orig]<br>
-[[MediaWiki_talk:Orig|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:db6998a7&action=edit dc894908]<br>
+[[MediaWiki_talk:db6998a7|Talk]]
 </td><td>
 orig
 </td><td>
-{{int:Orig}}
+{{int:db6998a7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Orphans&action=edit orphans]<br>
-[[MediaWiki_talk:Orphans|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cb5dc4a4&action=edit 89f56e51]<br>
+[[MediaWiki_talk:cb5dc4a4|Talk]]
 </td><td>
 Orphaned pages
 </td><td>
-{{int:Orphans}}
+{{int:cb5dc4a4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Othercontribs&action=edit othercontribs]<br>
-[[MediaWiki_talk:Othercontribs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:51caf0b1&action=edit e6287b24]<br>
+[[MediaWiki_talk:51caf0b1|Talk]]
 </td><td>
 Based on work by $1.
 </td><td>
-{{int:Othercontribs}}
+{{int:51caf0b1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Otherlanguages&action=edit otherlanguages]<br>
-[[MediaWiki_talk:Otherlanguages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:838fda53&action=edit f953cc13]<br>
+[[MediaWiki_talk:838fda53|Talk]]
 </td><td>
 Other languages
 </td><td>
-{{int:Otherlanguages}}
+{{int:838fda53}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagemovedsub&action=edit pagemovedsub]<br>
-[[MediaWiki_talk:Pagemovedsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8b80dc12&action=edit 06b2b863]<br>
+[[MediaWiki_talk:8b80dc12|Talk]]
 </td><td>
 Move succeeded
 </td><td>
-{{int:Pagemovedsub}}
+{{int:8b80dc12}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagemovedtext&action=edit pagemovedtext]<br>
-[[MediaWiki_talk:Pagemovedtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:67c1c9b9&action=edit 6df06888]<br>
+[[MediaWiki_talk:67c1c9b9|Talk]]
 </td><td>
 Page &quot;&#91;&#91;$1]]&quot; moved to &quot;&#91;&#91;$2]]&quot;.
 </td><td>
-{{int:Pagemovedtext}}
+{{int:67c1c9b9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagetitle&action=edit pagetitle]<br>
-[[MediaWiki_talk:Pagetitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0488d9f9&action=edit ca0a1736]<br>
+[[MediaWiki_talk:0488d9f9|Talk]]
 </td><td>
 $1 - Wiktionary
 </td><td>
-{{int:Pagetitle}}
+{{int:0488d9f9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordremindertext&action=edit passwordremindertext]<br>
-[[MediaWiki_talk:Passwordremindertext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:724220c3&action=edit 00c46482]<br>
+[[MediaWiki_talk:724220c3|Talk]]
 </td><td>
 Someone (probably you, from IP address $1)
 requested that we send you a new Wiktionary login password.
 The password for user &quot;$2&quot; is now &quot;$3&quot;.
 You should log in and change your password now.
 </td><td>
-{{int:Passwordremindertext}}
+{{int:724220c3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordremindertitle&action=edit passwordremindertitle]<br>
-[[MediaWiki_talk:Passwordremindertitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:67675177&action=edit 9943fd1d]<br>
+[[MediaWiki_talk:67675177|Talk]]
 </td><td>
 Password reminder from Wiktionary
 </td><td>
-{{int:Passwordremindertitle}}
+{{int:67675177}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordsent&action=edit passwordsent]<br>
-[[MediaWiki_talk:Passwordsent|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:feea022e&action=edit 52c6d21a]<br>
+[[MediaWiki_talk:feea022e|Talk]]
 </td><td>
 A new password has been sent to the e-mail address
 registered for &quot;$1&quot;.
 Please log in again after you receive it.
 </td><td>
-{{int:Passwordsent}}
+{{int:feea022e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfcached&action=edit perfcached]<br>
-[[MediaWiki_talk:Perfcached|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d89b33a4&action=edit 6148b748]<br>
+[[MediaWiki_talk:d89b33a4|Talk]]
 </td><td>
 The following data is cached and may not be completely up to date:
 </td><td>
-{{int:Perfcached}}
+{{int:d89b33a4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfdisabled&action=edit perfdisabled]<br>
-[[MediaWiki_talk:Perfdisabled|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7c3d6ba1&action=edit edb94b6f]<br>
+[[MediaWiki_talk:7c3d6ba1|Talk]]
 </td><td>
 Sorry! This feature has been temporarily disabled
 because it slows the database down to the point that no one can use
 the wiki.
 </td><td>
-{{int:Perfdisabled}}
+{{int:7c3d6ba1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfdisabledsub&action=edit perfdisabledsub]<br>
-[[MediaWiki_talk:Perfdisabledsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ba8fb63e&action=edit 7971fbbc]<br>
+[[MediaWiki_talk:ba8fb63e|Talk]]
 </td><td>
 Here&#39;s a saved copy from $1:
 </td><td>
-{{int:Perfdisabledsub}}
+{{int:ba8fb63e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Personaltools&action=edit personaltools]<br>
-[[MediaWiki_talk:Personaltools|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1f9d5196&action=edit faae8244]<br>
+[[MediaWiki_talk:1f9d5196|Talk]]
 </td><td>
 Personal tools
 </td><td>
-{{int:Personaltools}}
+{{int:1f9d5196}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Portal&action=edit portal]<br>
-[[MediaWiki_talk:Portal|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b55223c7&action=edit 23f3fd77]<br>
+[[MediaWiki_talk:b55223c7|Talk]]
 </td><td>
 Community portal
 </td><td>
-{{int:Portal}}
+{{int:b55223c7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Portal-url&action=edit portal-url]<br>
-[[MediaWiki_talk:Portal-url|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b6100630&action=edit d69501d7]<br>
+[[MediaWiki_talk:b6100630|Talk]]
 </td><td>
 Wiktionary:Community Portal
 </td><td>
-{{int:Portal-url}}
+{{int:b6100630}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Postcomment&action=edit postcomment]<br>
-[[MediaWiki_talk:Postcomment|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:83c6e160&action=edit 7ce546d1]<br>
+[[MediaWiki_talk:83c6e160|Talk]]
 </td><td>
 Post a comment
 </td><td>
-{{int:Postcomment}}
+{{int:83c6e160}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Poweredby&action=edit poweredby]<br>
-[[MediaWiki_talk:Poweredby|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f715eef0&action=edit 03d7f055]<br>
+[[MediaWiki_talk:f715eef0|Talk]]
 </td><td>
 Wiktionary is powered by &#91;http&#58;//www.mediawiki.org/ MediaWiki], an open source wiki engine.
 </td><td>
-{{int:Poweredby}}
+{{int:f715eef0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Powersearch&action=edit powersearch]<br>
-[[MediaWiki_talk:Powersearch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5f86f380&action=edit fe586261]<br>
+[[MediaWiki_talk:5f86f380|Talk]]
 </td><td>
 Search
 </td><td>
-{{int:Powersearch}}
+{{int:5f86f380}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Powersearchtext&action=edit powersearchtext]<br>
-[[MediaWiki_talk:Powersearchtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:02360031&action=edit 7c50040c]<br>
+[[MediaWiki_talk:02360031|Talk]]
 </td><td>
 
 Search in namespaces :&lt;br /&gt;
 $1&lt;br /&gt;
 $2 List redirects &amp;nbsp; Search for $3 $9
 </td><td>
-{{int:Powersearchtext}}
+{{int:02360031}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Preferences&action=edit preferences]<br>
-[[MediaWiki_talk:Preferences|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9dfd349e&action=edit dcedb31d]<br>
+[[MediaWiki_talk:9dfd349e|Talk]]
 </td><td>
 Preferences
 </td><td>
-{{int:Preferences}}
+{{int:9dfd349e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-help-userdata&action=edit prefs-help-userdata]<br>
-[[MediaWiki_talk:Prefs-help-userdata|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6b97fde2&action=edit 4d381b11]<br>
+[[MediaWiki_talk:6b97fde2|Talk]]
 </td><td>
 * &lt;strong&gt;Real name&lt;/strong&gt; (optional): if you choose to provide it this will be used for giving you attribution for your work.&lt;br/&gt;
 * &lt;strong&gt;Email&lt;/strong&gt; (optional): Enables people to contact you through the website without you having to reveal your 
 email address to them, and it can be used to send you a new password if you forget it.
 </td><td>
-{{int:Prefs-help-userdata}}
+{{int:6b97fde2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-misc&action=edit prefs-misc]<br>
-[[MediaWiki_talk:Prefs-misc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:30cafb20&action=edit 4413aea7]<br>
+[[MediaWiki_talk:30cafb20|Talk]]
 </td><td>
 Misc settings
 </td><td>
-{{int:Prefs-misc}}
+{{int:30cafb20}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-personal&action=edit prefs-personal]<br>
-[[MediaWiki_talk:Prefs-personal|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:58796ee5&action=edit 79de347d]<br>
+[[MediaWiki_talk:58796ee5|Talk]]
 </td><td>
 User data
 </td><td>
-{{int:Prefs-personal}}
+{{int:58796ee5}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-rc&action=edit prefs-rc]<br>
-[[MediaWiki_talk:Prefs-rc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e055ac90&action=edit b8a6f738]<br>
+[[MediaWiki_talk:e055ac90|Talk]]
 </td><td>
 Recent changes and stub display
 </td><td>
-{{int:Prefs-rc}}
+{{int:e055ac90}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefslogintext&action=edit prefslogintext]<br>
-[[MediaWiki_talk:Prefslogintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0603b5a9&action=edit 3b8a7d0e]<br>
+[[MediaWiki_talk:0603b5a9|Talk]]
 </td><td>
 You are logged in as &quot;$1&quot;.
 Your internal ID number is $2.
 
 See &#91;&#91;Wiktionary:User preferences help]] for help deciphering the options.
 </td><td>
-{{int:Prefslogintext}}
+{{int:0603b5a9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsnologin&action=edit prefsnologin]<br>
-[[MediaWiki_talk:Prefsnologin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2366fb91&action=edit f2475be5]<br>
+[[MediaWiki_talk:2366fb91|Talk]]
 </td><td>
 Not logged in
 </td><td>
-{{int:Prefsnologin}}
+{{int:2366fb91}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsnologintext&action=edit prefsnologintext]<br>
-[[MediaWiki_talk:Prefsnologintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0389a76a&action=edit 69cb02c9]<br>
+[[MediaWiki_talk:0389a76a|Talk]]
 </td><td>
 You must be &lt;a href=&quot;/wiki/Special:Userlogin&quot;&gt;logged in&lt;/a&gt;
 to set user preferences.
 </td><td>
-{{int:Prefsnologintext}}
+{{int:0389a76a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsreset&action=edit prefsreset]<br>
-[[MediaWiki_talk:Prefsreset|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e6216751&action=edit 2b688ff4]<br>
+[[MediaWiki_talk:e6216751|Talk]]
 </td><td>
 Preferences have been reset from storage.
 </td><td>
-{{int:Prefsreset}}
+{{int:e6216751}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Preview&action=edit preview]<br>
-[[MediaWiki_talk:Preview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f1fbb2b4&action=edit 1aa787fe]<br>
+[[MediaWiki_talk:f1fbb2b4|Talk]]
 </td><td>
 Preview
 </td><td>
-{{int:Preview}}
+{{int:f1fbb2b4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Previewconflict&action=edit previewconflict]<br>
-[[MediaWiki_talk:Previewconflict|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7357cd58&action=edit 353820b9]<br>
+[[MediaWiki_talk:7357cd58|Talk]]
 </td><td>
 This preview reflects the text in the upper
 text editing area as it will appear if you choose to save.
 </td><td>
-{{int:Previewconflict}}
+{{int:7357cd58}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Previewnote&action=edit previewnote]<br>
-[[MediaWiki_talk:Previewnote|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f0bd6ebe&action=edit 2281018c]<br>
+[[MediaWiki_talk:f0bd6ebe|Talk]]
 </td><td>
 Remember that this is only a preview, and has not yet been saved!
 </td><td>
-{{int:Previewnote}}
+{{int:f0bd6ebe}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prevn&action=edit prevn]<br>
-[[MediaWiki_talk:Prevn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c7db0778&action=edit 8b3bb669]<br>
+[[MediaWiki_talk:c7db0778|Talk]]
 </td><td>
 previous $1
 </td><td>
-{{int:Prevn}}
+{{int:c7db0778}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Printableversion&action=edit printableversion]<br>
-[[MediaWiki_talk:Printableversion|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0a67b813&action=edit e1a919ba]<br>
+[[MediaWiki_talk:0a67b813|Talk]]
 </td><td>
 Printable version
 </td><td>
-{{int:Printableversion}}
+{{int:0a67b813}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Printsubtitle&action=edit printsubtitle]<br>
-[[MediaWiki_talk:Printsubtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dc3b6f21&action=edit d4d3cccd]<br>
+[[MediaWiki_talk:dc3b6f21|Talk]]
 </td><td>
 (From http&#58;//tl.wiktionary.org)
 </td><td>
-{{int:Printsubtitle}}
+{{int:dc3b6f21}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protect&action=edit protect]<br>
-[[MediaWiki_talk:Protect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:016ac2dc&action=edit 145969f1]<br>
+[[MediaWiki_talk:016ac2dc|Talk]]
 </td><td>
 Protect
 </td><td>
-{{int:Protect}}
+{{int:016ac2dc}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectcomment&action=edit protectcomment]<br>
-[[MediaWiki_talk:Protectcomment|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:073135b4&action=edit bf7f9e49]<br>
+[[MediaWiki_talk:073135b4|Talk]]
 </td><td>
 Reason for protecting
 </td><td>
-{{int:Protectcomment}}
+{{int:073135b4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedarticle&action=edit protectedarticle]<br>
-[[MediaWiki_talk:Protectedarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3ee691ce&action=edit 1f880b64]<br>
+[[MediaWiki_talk:3ee691ce|Talk]]
 </td><td>
 protected &#91;&#91;$1]]
 </td><td>
-{{int:Protectedarticle}}
+{{int:3ee691ce}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedpage&action=edit protectedpage]<br>
-[[MediaWiki_talk:Protectedpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a44b308c&action=edit 7afa7fea]<br>
+[[MediaWiki_talk:a44b308c|Talk]]
 </td><td>
 Protected page
 </td><td>
-{{int:Protectedpage}}
+{{int:a44b308c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedpagewarning&action=edit protectedpagewarning]<br>
-[[MediaWiki_talk:Protectedpagewarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0017a4f5&action=edit 962032da]<br>
+[[MediaWiki_talk:0017a4f5|Talk]]
 </td><td>
 WARNING:  This page has been locked so that only
 users with sysop privileges can edit it. Be sure you are following the
 &lt;a href=&#39;/w/wiki.phtml/Wiktionary:Protected_page_guidelines&#39;&gt;protected page
 guidelines&lt;/a&gt;.
 </td><td>
-{{int:Protectedpagewarning}}
+{{int:0017a4f5}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedtext&action=edit protectedtext]<br>
-[[MediaWiki_talk:Protectedtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cf2a914e&action=edit 561f00bf]<br>
+[[MediaWiki_talk:cf2a914e|Talk]]
 </td><td>
 This page has been locked to prevent editing; there are
 a number of reasons why this may be so, please see
@@ -3516,222 +3516,222 @@ a number of reasons why this may be so, please see
 
 You can view and copy the source of this page:
 </td><td>
-{{int:Protectedtext}}
+{{int:cf2a914e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectlogpage&action=edit protectlogpage]<br>
-[[MediaWiki_talk:Protectlogpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bb915483&action=edit 85888484]<br>
+[[MediaWiki_talk:bb915483|Talk]]
 </td><td>
 Protection_log
 </td><td>
-{{int:Protectlogpage}}
+{{int:bb915483}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectlogtext&action=edit protectlogtext]<br>
-[[MediaWiki_talk:Protectlogtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:061ec7fa&action=edit 197cfa0d]<br>
+[[MediaWiki_talk:061ec7fa|Talk]]
 </td><td>
 Below is a list of page locks/unlocks.
 See &#91;&#91;Wiktionary:Protected page]] for more information.
 </td><td>
-{{int:Protectlogtext}}
+{{int:061ec7fa}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectpage&action=edit protectpage]<br>
-[[MediaWiki_talk:Protectpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d2ae1354&action=edit 33c2c02c]<br>
+[[MediaWiki_talk:d2ae1354|Talk]]
 </td><td>
 Protect page
 </td><td>
-{{int:Protectpage}}
+{{int:d2ae1354}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectreason&action=edit protectreason]<br>
-[[MediaWiki_talk:Protectreason|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c0e9bbaf&action=edit 5cbc043a]<br>
+[[MediaWiki_talk:c0e9bbaf|Talk]]
 </td><td>
 (give a reason)
 </td><td>
-{{int:Protectreason}}
+{{int:c0e9bbaf}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectsub&action=edit protectsub]<br>
-[[MediaWiki_talk:Protectsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:23176a41&action=edit 24a81acc]<br>
+[[MediaWiki_talk:23176a41|Talk]]
 </td><td>
 (Protecting &quot;$1&quot;)
 </td><td>
-{{int:Protectsub}}
+{{int:23176a41}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectthispage&action=edit protectthispage]<br>
-[[MediaWiki_talk:Protectthispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:884b47b3&action=edit 77ca39fa]<br>
+[[MediaWiki_talk:884b47b3|Talk]]
 </td><td>
 Protect this page
 </td><td>
-{{int:Protectthispage}}
+{{int:884b47b3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblocker&action=edit proxyblocker]<br>
-[[MediaWiki_talk:Proxyblocker|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0ebe1928&action=edit 11599708]<br>
+[[MediaWiki_talk:0ebe1928|Talk]]
 </td><td>
 Proxy blocker
 </td><td>
-{{int:Proxyblocker}}
+{{int:0ebe1928}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblockreason&action=edit proxyblockreason]<br>
-[[MediaWiki_talk:Proxyblockreason|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0ccb1a72&action=edit f4482395]<br>
+[[MediaWiki_talk:0ccb1a72|Talk]]
 </td><td>
 Your IP address has been blocked because it is an open proxy. Please contact your Internet service provider or tech support and inform them of this serious security problem.
 </td><td>
-{{int:Proxyblockreason}}
+{{int:0ccb1a72}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblocksuccess&action=edit proxyblocksuccess]<br>
-[[MediaWiki_talk:Proxyblocksuccess|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:88af6e64&action=edit 01b6671f]<br>
+[[MediaWiki_talk:88af6e64|Talk]]
 </td><td>
 Done.
 
 </td><td>
-{{int:Proxyblocksuccess}}
+{{int:88af6e64}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbbrowse&action=edit qbbrowse]<br>
-[[MediaWiki_talk:Qbbrowse|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b1594c4a&action=edit 596b17aa]<br>
+[[MediaWiki_talk:b1594c4a|Talk]]
 </td><td>
 Browse
 </td><td>
-{{int:Qbbrowse}}
+{{int:b1594c4a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbedit&action=edit qbedit]<br>
-[[MediaWiki_talk:Qbedit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:25b61f80&action=edit 9e11e13b]<br>
+[[MediaWiki_talk:25b61f80|Talk]]
 </td><td>
 Edit
 </td><td>
-{{int:Qbedit}}
+{{int:25b61f80}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbfind&action=edit qbfind]<br>
-[[MediaWiki_talk:Qbfind|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e1a9ed9d&action=edit cc717307]<br>
+[[MediaWiki_talk:e1a9ed9d|Talk]]
 </td><td>
 Find
 </td><td>
-{{int:Qbfind}}
+{{int:e1a9ed9d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbmyoptions&action=edit qbmyoptions]<br>
-[[MediaWiki_talk:Qbmyoptions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:24074cfc&action=edit a40d0b3f]<br>
+[[MediaWiki_talk:24074cfc|Talk]]
 </td><td>
 My pages
 </td><td>
-{{int:Qbmyoptions}}
+{{int:24074cfc}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbpageinfo&action=edit qbpageinfo]<br>
-[[MediaWiki_talk:Qbpageinfo|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:af83fbba&action=edit 8f794a0f]<br>
+[[MediaWiki_talk:af83fbba|Talk]]
 </td><td>
 Context
 </td><td>
-{{int:Qbpageinfo}}
+{{int:af83fbba}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbpageoptions&action=edit qbpageoptions]<br>
-[[MediaWiki_talk:Qbpageoptions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c8fff0e7&action=edit 20fec244]<br>
+[[MediaWiki_talk:c8fff0e7|Talk]]
 </td><td>
 This page
 </td><td>
-{{int:Qbpageoptions}}
+{{int:c8fff0e7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbsettings&action=edit qbsettings]<br>
-[[MediaWiki_talk:Qbsettings|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5a6ec2af&action=edit 2dfd6121]<br>
+[[MediaWiki_talk:5a6ec2af|Talk]]
 </td><td>
 Quickbar settings
 </td><td>
-{{int:Qbsettings}}
+{{int:5a6ec2af}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbspecialpages&action=edit qbspecialpages]<br>
-[[MediaWiki_talk:Qbspecialpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8eda832f&action=edit e97e9088]<br>
+[[MediaWiki_talk:8eda832f|Talk]]
 </td><td>
 Special pages
 </td><td>
-{{int:Qbspecialpages}}
+{{int:8eda832f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Querybtn&action=edit querybtn]<br>
-[[MediaWiki_talk:Querybtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ce1c6b9a&action=edit dc17545e]<br>
+[[MediaWiki_talk:ce1c6b9a|Talk]]
 </td><td>
 Submit query
 </td><td>
-{{int:Querybtn}}
+{{int:ce1c6b9a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Querysuccessful&action=edit querysuccessful]<br>
-[[MediaWiki_talk:Querysuccessful|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:342970ff&action=edit 7f2e7314]<br>
+[[MediaWiki_talk:342970ff|Talk]]
 </td><td>
 Query successful
 </td><td>
-{{int:Querysuccessful}}
+{{int:342970ff}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Randompage&action=edit randompage]<br>
-[[MediaWiki_talk:Randompage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c2300ac1&action=edit 08f4cb5c]<br>
+[[MediaWiki_talk:c2300ac1|Talk]]
 </td><td>
 Random page
 </td><td>
-{{int:Randompage}}
+{{int:c2300ac1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Range_block_disabled&action=edit range_block_disabled]<br>
-[[MediaWiki_talk:Range_block_disabled|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9f84f8de&action=edit 0da9559a]<br>
+[[MediaWiki_talk:9f84f8de|Talk]]
 </td><td>
 The sysop ability to create range blocks is disabled.
 </td><td>
-{{int:Range_block_disabled}}
+{{int:9f84f8de}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rchide&action=edit rchide]<br>
-[[MediaWiki_talk:Rchide|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f65142b8&action=edit 65c24302]<br>
+[[MediaWiki_talk:f65142b8|Talk]]
 </td><td>
 in $4 form; $1 minor edits; $2 secondary namespaces; $3 multiple edits.
 </td><td>
-{{int:Rchide}}
+{{int:f65142b8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclinks&action=edit rclinks]<br>
-[[MediaWiki_talk:Rclinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:78b9278a&action=edit 96bcbd6a]<br>
+[[MediaWiki_talk:78b9278a|Talk]]
 </td><td>
 Show last $1 changes in last $2 days&lt;br /&gt;$3
 </td><td>
-{{int:Rclinks}}
+{{int:78b9278a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclistfrom&action=edit rclistfrom]<br>
-[[MediaWiki_talk:Rclistfrom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ead9cd8b&action=edit 69cdd5ad]<br>
+[[MediaWiki_talk:ead9cd8b|Talk]]
 </td><td>
 Show new changes starting from $1
 </td><td>
-{{int:Rclistfrom}}
+{{int:ead9cd8b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcliu&action=edit rcliu]<br>
-[[MediaWiki_talk:Rcliu|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bad8b81d&action=edit f13491ba]<br>
+[[MediaWiki_talk:bad8b81d|Talk]]
 </td><td>
 ; $1 edits from logged in users
 </td><td>
-{{int:Rcliu}}
+{{int:bad8b81d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcloaderr&action=edit rcloaderr]<br>
-[[MediaWiki_talk:Rcloaderr|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:58a7c0de&action=edit ced7752e]<br>
+[[MediaWiki_talk:58a7c0de|Talk]]
 </td><td>
 Loading recent changes
 </td><td>
-{{int:Rcloaderr}}
+{{int:58a7c0de}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclsub&action=edit rclsub]<br>
-[[MediaWiki_talk:Rclsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c3fd1aca&action=edit d259fbf6]<br>
+[[MediaWiki_talk:c3fd1aca|Talk]]
 </td><td>
 (to pages linked from &quot;$1&quot;)
 </td><td>
-{{int:Rclsub}}
+{{int:c3fd1aca}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcnote&action=edit rcnote]<br>
-[[MediaWiki_talk:Rcnote|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2c0a654c&action=edit 15ea8401]<br>
+[[MediaWiki_talk:2c0a654c|Talk]]
 </td><td>
 Below are the last &lt;strong&gt;$1&lt;/strong&gt; changes in last &lt;strong&gt;$2&lt;/strong&gt; days.
 </td><td>
-{{int:Rcnote}}
+{{int:2c0a654c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcnotefrom&action=edit rcnotefrom]<br>
-[[MediaWiki_talk:Rcnotefrom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0a00aaba&action=edit c516366b]<br>
+[[MediaWiki_talk:0a00aaba|Talk]]
 </td><td>
 Below are the changes since &lt;b&gt;$2&lt;/b&gt; (up to &lt;b&gt;$1&lt;/b&gt; shown).
 </td><td>
-{{int:Rcnotefrom}}
+{{int:0a00aaba}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonly&action=edit readonly]<br>
-[[MediaWiki_talk:Readonly|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1d920fff&action=edit 9a277182]<br>
+[[MediaWiki_talk:1d920fff|Talk]]
 </td><td>
 Database locked
 </td><td>
-{{int:Readonly}}
+{{int:1d920fff}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonlytext&action=edit readonlytext]<br>
-[[MediaWiki_talk:Readonlytext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:64743780&action=edit e5990e81]<br>
+[[MediaWiki_talk:64743780|Talk]]
 </td><td>
 The database is currently locked to new
 entries and other modifications, probably for routine database maintenance,
@@ -3739,476 +3739,476 @@ after which it will be back to normal.
 The administrator who locked it offered this explanation:
 &lt;p&gt;$1
 </td><td>
-{{int:Readonlytext}}
+{{int:64743780}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonlywarning&action=edit readonlywarning]<br>
-[[MediaWiki_talk:Readonlywarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8c9d6af6&action=edit 74bcbeed]<br>
+[[MediaWiki_talk:8c9d6af6|Talk]]
 </td><td>
 WARNING: The database has been locked for maintenance,
 so you will not be able to save your edits right now. You may wish to cut-n-paste
 the text into a text file and save it for later.
 </td><td>
-{{int:Readonlywarning}}
+{{int:8c9d6af6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchanges&action=edit recentchanges]<br>
-[[MediaWiki_talk:Recentchanges|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4d75dd33&action=edit 51734654]<br>
+[[MediaWiki_talk:4d75dd33|Talk]]
 </td><td>
 Recent changes
 </td><td>
-{{int:Recentchanges}}
+{{int:4d75dd33}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangescount&action=edit recentchangescount]<br>
-[[MediaWiki_talk:Recentchangescount|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:40f1d259&action=edit 44d93957]<br>
+[[MediaWiki_talk:40f1d259|Talk]]
 </td><td>
 Number of titles in recent changes
 </td><td>
-{{int:Recentchangescount}}
+{{int:40f1d259}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangeslinked&action=edit recentchangeslinked]<br>
-[[MediaWiki_talk:Recentchangeslinked|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:312aafe1&action=edit b5822b16]<br>
+[[MediaWiki_talk:312aafe1|Talk]]
 </td><td>
 Related changes
 </td><td>
-{{int:Recentchangeslinked}}
+{{int:312aafe1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangestext&action=edit recentchangestext]<br>
-[[MediaWiki_talk:Recentchangestext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2f453993&action=edit 049f8c5f]<br>
+[[MediaWiki_talk:2f453993|Talk]]
 </td><td>
 Track the most recent changes to the wiki on this page.
 </td><td>
-{{int:Recentchangestext}}
+{{int:2f453993}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Redirectedfrom&action=edit redirectedfrom]<br>
-[[MediaWiki_talk:Redirectedfrom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7124fa4a&action=edit 43d741c1]<br>
+[[MediaWiki_talk:7124fa4a|Talk]]
 </td><td>
 (Redirected from $1)
 </td><td>
-{{int:Redirectedfrom}}
+{{int:7124fa4a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Remembermypassword&action=edit remembermypassword]<br>
-[[MediaWiki_talk:Remembermypassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:54d89323&action=edit 4eef1c9f]<br>
+[[MediaWiki_talk:54d89323|Talk]]
 </td><td>
 Remember my password across sessions.
 </td><td>
-{{int:Remembermypassword}}
+{{int:54d89323}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removechecked&action=edit removechecked]<br>
-[[MediaWiki_talk:Removechecked|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:537f5507&action=edit bfa5dc98]<br>
+[[MediaWiki_talk:537f5507|Talk]]
 </td><td>
 Remove checked items from watchlist
 </td><td>
-{{int:Removechecked}}
+{{int:537f5507}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removedwatch&action=edit removedwatch]<br>
-[[MediaWiki_talk:Removedwatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:78e82769&action=edit eeadf87c]<br>
+[[MediaWiki_talk:78e82769|Talk]]
 </td><td>
 Removed from watchlist
 </td><td>
-{{int:Removedwatch}}
+{{int:78e82769}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removedwatchtext&action=edit removedwatchtext]<br>
-[[MediaWiki_talk:Removedwatchtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ad711aa8&action=edit d9807612]<br>
+[[MediaWiki_talk:ad711aa8|Talk]]
 </td><td>
 The page &quot;$1&quot; has been removed from your watchlist.
 </td><td>
-{{int:Removedwatchtext}}
+{{int:ad711aa8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removingchecked&action=edit removingchecked]<br>
-[[MediaWiki_talk:Removingchecked|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:48b0bcb6&action=edit 7d083ee5]<br>
+[[MediaWiki_talk:48b0bcb6|Talk]]
 </td><td>
 Removing requested items from watchlist...
 </td><td>
-{{int:Removingchecked}}
+{{int:48b0bcb6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Resetprefs&action=edit resetprefs]<br>
-[[MediaWiki_talk:Resetprefs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2f022894&action=edit 4b81718e]<br>
+[[MediaWiki_talk:2f022894|Talk]]
 </td><td>
 Reset preferences
 </td><td>
-{{int:Resetprefs}}
+{{int:2f022894}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Restorelink&action=edit restorelink]<br>
-[[MediaWiki_talk:Restorelink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bc47acaf&action=edit 8f8f7d13]<br>
+[[MediaWiki_talk:bc47acaf|Talk]]
 </td><td>
 $1 deleted edits
 </td><td>
-{{int:Restorelink}}
+{{int:bc47acaf}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Resultsperpage&action=edit resultsperpage]<br>
-[[MediaWiki_talk:Resultsperpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6add8c15&action=edit 8f0c68f0]<br>
+[[MediaWiki_talk:6add8c15|Talk]]
 </td><td>
 Hits to show per page
 </td><td>
-{{int:Resultsperpage}}
+{{int:6add8c15}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Retrievedfrom&action=edit retrievedfrom]<br>
-[[MediaWiki_talk:Retrievedfrom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6f54af5b&action=edit a5e2f101]<br>
+[[MediaWiki_talk:6f54af5b|Talk]]
 </td><td>
 Retrieved from &quot;$1&quot;
 </td><td>
-{{int:Retrievedfrom}}
+{{int:6f54af5b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Returnto&action=edit returnto]<br>
-[[MediaWiki_talk:Returnto|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3dcff1b0&action=edit 58f19667]<br>
+[[MediaWiki_talk:3dcff1b0|Talk]]
 </td><td>
 Return to $1.
 </td><td>
-{{int:Returnto}}
+{{int:3dcff1b0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Retypenew&action=edit retypenew]<br>
-[[MediaWiki_talk:Retypenew|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b9ac79c6&action=edit 2b9171b6]<br>
+[[MediaWiki_talk:b9ac79c6|Talk]]
 </td><td>
 Retype new password
 </td><td>
-{{int:Retypenew}}
+{{int:b9ac79c6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reupload&action=edit reupload]<br>
-[[MediaWiki_talk:Reupload|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b7ae8f64&action=edit a3eee606]<br>
+[[MediaWiki_talk:b7ae8f64|Talk]]
 </td><td>
 Re-upload
 </td><td>
-{{int:Reupload}}
+{{int:b7ae8f64}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reuploaddesc&action=edit reuploaddesc]<br>
-[[MediaWiki_talk:Reuploaddesc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cd783da0&action=edit d7ba5bcb]<br>
+[[MediaWiki_talk:cd783da0|Talk]]
 </td><td>
 Return to the upload form.
 </td><td>
-{{int:Reuploaddesc}}
+{{int:cd783da0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reverted&action=edit reverted]<br>
-[[MediaWiki_talk:Reverted|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c73c43f3&action=edit f322de9a]<br>
+[[MediaWiki_talk:c73c43f3|Talk]]
 </td><td>
 Reverted to earlier revision
 </td><td>
-{{int:Reverted}}
+{{int:c73c43f3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revertimg&action=edit revertimg]<br>
-[[MediaWiki_talk:Revertimg|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:18591a4b&action=edit 0d86ed82]<br>
+[[MediaWiki_talk:18591a4b|Talk]]
 </td><td>
 rev
 </td><td>
-{{int:Revertimg}}
+{{int:18591a4b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revertpage&action=edit revertpage]<br>
-[[MediaWiki_talk:Revertpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b24ef4f1&action=edit 8ce494ea]<br>
+[[MediaWiki_talk:b24ef4f1|Talk]]
 </td><td>
 Reverted edit of $2, changed back to last version by $1
 </td><td>
-{{int:Revertpage}}
+{{int:b24ef4f1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revhistory&action=edit revhistory]<br>
-[[MediaWiki_talk:Revhistory|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:96e64350&action=edit 949a77c7]<br>
+[[MediaWiki_talk:96e64350|Talk]]
 </td><td>
 Revision history
 </td><td>
-{{int:Revhistory}}
+{{int:96e64350}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revisionasof&action=edit revisionasof]<br>
-[[MediaWiki_talk:Revisionasof|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0c299dc7&action=edit 3338672b]<br>
+[[MediaWiki_talk:0c299dc7|Talk]]
 </td><td>
 Revision as of $1
 </td><td>
-{{int:Revisionasof}}
+{{int:0c299dc7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revnotfound&action=edit revnotfound]<br>
-[[MediaWiki_talk:Revnotfound|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:159f321a&action=edit d567812b]<br>
+[[MediaWiki_talk:159f321a|Talk]]
 </td><td>
 Revision not found
 </td><td>
-{{int:Revnotfound}}
+{{int:159f321a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revnotfoundtext&action=edit revnotfoundtext]<br>
-[[MediaWiki_talk:Revnotfoundtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:955fec48&action=edit 4060f114]<br>
+[[MediaWiki_talk:955fec48|Talk]]
 </td><td>
 The old revision of the page you asked for could not be found.
 Please check the URL you used to access this page.
 
 </td><td>
-{{int:Revnotfoundtext}}
+{{int:955fec48}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rfcurl&action=edit rfcurl]<br>
-[[MediaWiki_talk:Rfcurl|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b2f04988&action=edit e8b606c2]<br>
+[[MediaWiki_talk:b2f04988|Talk]]
 </td><td>
 http&#58;//www.faqs.org/rfcs/rfc$1.html
 </td><td>
-{{int:Rfcurl}}
+{{int:b2f04988}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rights&action=edit rights]<br>
-[[MediaWiki_talk:Rights|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:db94ff6b&action=edit 1407cb23]<br>
+[[MediaWiki_talk:db94ff6b|Talk]]
 </td><td>
 Rights:
 </td><td>
-{{int:Rights}}
+{{int:db94ff6b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollback&action=edit rollback]<br>
-[[MediaWiki_talk:Rollback|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f28daee2&action=edit ff3a6f3b]<br>
+[[MediaWiki_talk:f28daee2|Talk]]
 </td><td>
 Roll back edits
 </td><td>
-{{int:Rollback}}
+{{int:f28daee2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollback_short&action=edit rollback_short]<br>
-[[MediaWiki_talk:Rollback_short|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2aaec24c&action=edit 5f0fa7e7]<br>
+[[MediaWiki_talk:2aaec24c|Talk]]
 </td><td>
 Rollback
 </td><td>
-{{int:Rollback_short}}
+{{int:2aaec24c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollbackfailed&action=edit rollbackfailed]<br>
-[[MediaWiki_talk:Rollbackfailed|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:54d37a4c&action=edit 73c685e6]<br>
+[[MediaWiki_talk:54d37a4c|Talk]]
 </td><td>
 Rollback failed
 </td><td>
-{{int:Rollbackfailed}}
+{{int:54d37a4c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollbacklink&action=edit rollbacklink]<br>
-[[MediaWiki_talk:Rollbacklink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b82a8f42&action=edit 1a9fae49]<br>
+[[MediaWiki_talk:b82a8f42|Talk]]
 </td><td>
 rollback
 </td><td>
-{{int:Rollbacklink}}
+{{int:b82a8f42}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rows&action=edit rows]<br>
-[[MediaWiki_talk:Rows|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:52d0b352&action=edit 6c30d261]<br>
+[[MediaWiki_talk:52d0b352|Talk]]
 </td><td>
 Rows
 </td><td>
-{{int:Rows}}
+{{int:52d0b352}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savearticle&action=edit savearticle]<br>
-[[MediaWiki_talk:Savearticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5a43014e&action=edit 1308cde0]<br>
+[[MediaWiki_talk:5a43014e|Talk]]
 </td><td>
 Save page
 </td><td>
-{{int:Savearticle}}
+{{int:5a43014e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savedprefs&action=edit savedprefs]<br>
-[[MediaWiki_talk:Savedprefs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0e53fdc8&action=edit 5f6543d0]<br>
+[[MediaWiki_talk:0e53fdc8|Talk]]
 </td><td>
 Your preferences have been saved.
 </td><td>
-{{int:Savedprefs}}
+{{int:0e53fdc8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savefile&action=edit savefile]<br>
-[[MediaWiki_talk:Savefile|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e1415b15&action=edit d6d40a58]<br>
+[[MediaWiki_talk:e1415b15|Talk]]
 </td><td>
 Save file
 </td><td>
-{{int:Savefile}}
+{{int:e1415b15}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Saveprefs&action=edit saveprefs]<br>
-[[MediaWiki_talk:Saveprefs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ad98e68e&action=edit 34ac956e]<br>
+[[MediaWiki_talk:ad98e68e|Talk]]
 </td><td>
 Save preferences
 </td><td>
-{{int:Saveprefs}}
+{{int:ad98e68e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Search&action=edit search]<br>
-[[MediaWiki_talk:Search|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bce06414&action=edit 3559d7ac]<br>
+[[MediaWiki_talk:bce06414|Talk]]
 </td><td>
 Search
 </td><td>
-{{int:Search}}
+{{int:bce06414}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchdisabled&action=edit searchdisabled]<br>
-[[MediaWiki_talk:Searchdisabled|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8f6495a7&action=edit cfa0722d]<br>
+[[MediaWiki_talk:8f6495a7|Talk]]
 </td><td>
 &lt;p&gt;Sorry! Full text search has been disabled temporarily, for performance reasons. In the meantime, you can use the Google search below, which may be out of date.&lt;/p&gt;
 </td><td>
-{{int:Searchdisabled}}
+{{int:8f6495a7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchhelppage&action=edit searchhelppage]<br>
-[[MediaWiki_talk:Searchhelppage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:72344e87&action=edit 3eea6ce4]<br>
+[[MediaWiki_talk:72344e87|Talk]]
 </td><td>
 Wiktionary:Searching
 </td><td>
-{{int:Searchhelppage}}
+{{int:72344e87}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchingwikipedia&action=edit searchingwikipedia]<br>
-[[MediaWiki_talk:Searchingwikipedia|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cb9c1653&action=edit da48347f]<br>
+[[MediaWiki_talk:cb9c1653|Talk]]
 </td><td>
 Searching Wiktionary
 </td><td>
-{{int:Searchingwikipedia}}
+{{int:cb9c1653}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchquery&action=edit searchquery]<br>
-[[MediaWiki_talk:Searchquery|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3d79ca88&action=edit 64bdca9a]<br>
+[[MediaWiki_talk:3d79ca88|Talk]]
 </td><td>
 For query &quot;$1&quot;
 </td><td>
-{{int:Searchquery}}
+{{int:3d79ca88}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresults&action=edit searchresults]<br>
-[[MediaWiki_talk:Searchresults|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b2f7c0e1&action=edit 8ef6d4d3]<br>
+[[MediaWiki_talk:b2f7c0e1|Talk]]
 </td><td>
 Search results
 </td><td>
-{{int:Searchresults}}
+{{int:b2f7c0e1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresultshead&action=edit searchresultshead]<br>
-[[MediaWiki_talk:Searchresultshead|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e5ed9018&action=edit 83d578cd]<br>
+[[MediaWiki_talk:e5ed9018|Talk]]
 </td><td>
 Search result settings
 </td><td>
-{{int:Searchresultshead}}
+{{int:e5ed9018}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresulttext&action=edit searchresulttext]<br>
-[[MediaWiki_talk:Searchresulttext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8cab5350&action=edit 781b9fee]<br>
+[[MediaWiki_talk:8cab5350|Talk]]
 </td><td>
 For more information about searching Wiktionary, see $1.
 </td><td>
-{{int:Searchresulttext}}
+{{int:8cab5350}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sectionedit&action=edit sectionedit]<br>
-[[MediaWiki_talk:Sectionedit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:37b6df63&action=edit a26b768d]<br>
+[[MediaWiki_talk:37b6df63|Talk]]
 </td><td>
  (section)
 </td><td>
-{{int:Sectionedit}}
+{{int:37b6df63}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectnewerversionfordiff&action=edit selectnewerversionfordiff]<br>
-[[MediaWiki_talk:Selectnewerversionfordiff|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:be4aaa62&action=edit 2ddce298]<br>
+[[MediaWiki_talk:be4aaa62|Talk]]
 </td><td>
 Select a newer version for comparison
 </td><td>
-{{int:Selectnewerversionfordiff}}
+{{int:be4aaa62}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectolderversionfordiff&action=edit selectolderversionfordiff]<br>
-[[MediaWiki_talk:Selectolderversionfordiff|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5124db4d&action=edit 80ffa0cb]<br>
+[[MediaWiki_talk:5124db4d|Talk]]
 </td><td>
 Select an older version for comparison
 </td><td>
-{{int:Selectolderversionfordiff}}
+{{int:5124db4d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectonly&action=edit selectonly]<br>
-[[MediaWiki_talk:Selectonly|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a3c0a747&action=edit 5ec1b504]<br>
+[[MediaWiki_talk:a3c0a747|Talk]]
 </td><td>
 Only read-only queries are allowed.
 </td><td>
-{{int:Selectonly}}
+{{int:a3c0a747}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selflinks&action=edit selflinks]<br>
-[[MediaWiki_talk:Selflinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e93eec9e&action=edit 06cf46b3]<br>
+[[MediaWiki_talk:e93eec9e|Talk]]
 </td><td>
 Pages with Self Links
 </td><td>
-{{int:Selflinks}}
+{{int:e93eec9e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selflinkstext&action=edit selflinkstext]<br>
-[[MediaWiki_talk:Selflinkstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f993dd01&action=edit e7caf074]<br>
+[[MediaWiki_talk:f993dd01|Talk]]
 </td><td>
 The following pages contain a link to themselves, which they should not.
 </td><td>
-{{int:Selflinkstext}}
+{{int:f993dd01}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Seriousxhtmlerrors&action=edit seriousxhtmlerrors]<br>
-[[MediaWiki_talk:Seriousxhtmlerrors|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fa56e16c&action=edit 249c203d]<br>
+[[MediaWiki_talk:fa56e16c|Talk]]
 </td><td>
 There were serious xhtml markup errors detected by tidy.
 </td><td>
-{{int:Seriousxhtmlerrors}}
+{{int:fa56e16c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Servertime&action=edit servertime]<br>
-[[MediaWiki_talk:Servertime|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5123f28d&action=edit 8fcf47da]<br>
+[[MediaWiki_talk:5123f28d|Talk]]
 </td><td>
 Server time is now
 </td><td>
-{{int:Servertime}}
+{{int:5123f28d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Set_rights_fail&action=edit set_rights_fail]<br>
-[[MediaWiki_talk:Set_rights_fail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4075f71a&action=edit 79d35179]<br>
+[[MediaWiki_talk:4075f71a|Talk]]
 </td><td>
 &lt;b&gt;User rights for &quot;$1&quot; could not be set. (Did you enter the name correctly?)&lt;/b&gt;
 </td><td>
-{{int:Set_rights_fail}}
+{{int:4075f71a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Set_user_rights&action=edit set_user_rights]<br>
-[[MediaWiki_talk:Set_user_rights|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:13187ffc&action=edit f2cd2a2a]<br>
+[[MediaWiki_talk:13187ffc|Talk]]
 </td><td>
 Set user rights
 </td><td>
-{{int:Set_user_rights}}
+{{int:13187ffc}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Setbureaucratflag&action=edit setbureaucratflag]<br>
-[[MediaWiki_talk:Setbureaucratflag|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:56640761&action=edit c5bfd68a]<br>
+[[MediaWiki_talk:56640761|Talk]]
 </td><td>
 Set bureaucrat flag
 </td><td>
-{{int:Setbureaucratflag}}
+{{int:56640761}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Shortpages&action=edit shortpages]<br>
-[[MediaWiki_talk:Shortpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0d3f883b&action=edit fff9c94a]<br>
+[[MediaWiki_talk:0d3f883b|Talk]]
 </td><td>
 Short pages
 </td><td>
-{{int:Shortpages}}
+{{int:0d3f883b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Show&action=edit show]<br>
-[[MediaWiki_talk:Show|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d97d1ee3&action=edit 9fb29051]<br>
+[[MediaWiki_talk:d97d1ee3|Talk]]
 </td><td>
 show
 </td><td>
-{{int:Show}}
+{{int:d97d1ee3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showhideminor&action=edit showhideminor]<br>
-[[MediaWiki_talk:Showhideminor|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f1a75ecf&action=edit 4fe654c7]<br>
+[[MediaWiki_talk:f1a75ecf|Talk]]
 </td><td>
 $1 minor edits &#124; $2 bots &#124; $3 logged in users 
 </td><td>
-{{int:Showhideminor}}
+{{int:f1a75ecf}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showingresults&action=edit showingresults]<br>
-[[MediaWiki_talk:Showingresults|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:72fad336&action=edit 9569cf23]<br>
+[[MediaWiki_talk:72fad336|Talk]]
 </td><td>
 Showing below &lt;b&gt;$1&lt;/b&gt; results starting with #&lt;b&gt;$2&lt;/b&gt;.
 </td><td>
-{{int:Showingresults}}
+{{int:72fad336}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showingresultsnum&action=edit showingresultsnum]<br>
-[[MediaWiki_talk:Showingresultsnum|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6db37657&action=edit f7535b52]<br>
+[[MediaWiki_talk:6db37657|Talk]]
 </td><td>
 Showing below &lt;b&gt;$3&lt;/b&gt; results starting with #&lt;b&gt;$2&lt;/b&gt;.
 </td><td>
-{{int:Showingresultsnum}}
+{{int:6db37657}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showlast&action=edit showlast]<br>
-[[MediaWiki_talk:Showlast|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:acbdf814&action=edit 43158759]<br>
+[[MediaWiki_talk:acbdf814|Talk]]
 </td><td>
 Show last $1 images sorted $2.
 </td><td>
-{{int:Showlast}}
+{{int:acbdf814}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showpreview&action=edit showpreview]<br>
-[[MediaWiki_talk:Showpreview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:915318a0&action=edit ac2b4c32]<br>
+[[MediaWiki_talk:915318a0|Talk]]
 </td><td>
 Show preview
 </td><td>
-{{int:Showpreview}}
+{{int:915318a0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showtoc&action=edit showtoc]<br>
-[[MediaWiki_talk:Showtoc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cfff5a5a&action=edit 6eeee3cb]<br>
+[[MediaWiki_talk:cfff5a5a|Talk]]
 </td><td>
 show
 </td><td>
-{{int:Showtoc}}
+{{int:cfff5a5a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sig_tip&action=edit sig_tip]<br>
-[[MediaWiki_talk:Sig_tip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ac617b53&action=edit 1144c9d9]<br>
+[[MediaWiki_talk:ac617b53|Talk]]
 </td><td>
 Your signature with timestamp
 </td><td>
-{{int:Sig_tip}}
+{{int:ac617b53}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitestats&action=edit sitestats]<br>
-[[MediaWiki_talk:Sitestats|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f6baa6ad&action=edit 7f5726ac]<br>
+[[MediaWiki_talk:f6baa6ad|Talk]]
 </td><td>
 Site statistics
 </td><td>
-{{int:Sitestats}}
+{{int:f6baa6ad}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitestatstext&action=edit sitestatstext]<br>
-[[MediaWiki_talk:Sitestatstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e150b0f4&action=edit 8e86f95d]<br>
+[[MediaWiki_talk:e150b0f4|Talk]]
 </td><td>
 There are &#39;&#39;&#39;$1&#39;&#39;&#39; total pages in the database.
 This includes &quot;talk&quot; pages, pages about Wiktionary, minimal &quot;stub&quot;
@@ -4220,931 +4220,931 @@ There have been a total of &#39;&#39;&#39;$3&#39;&#39;&#39; page views, and &#39
 since the wiki was setup.
 That comes to &#39;&#39;&#39;$5&#39;&#39;&#39; average edits per page, and &#39;&#39;&#39;$6&#39;&#39;&#39; views per edit.
 </td><td>
-{{int:Sitestatstext}}
+{{int:e150b0f4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitesubtitle&action=edit sitesubtitle]<br>
-[[MediaWiki_talk:Sitesubtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:daaf7240&action=edit 8dca090f]<br>
+[[MediaWiki_talk:daaf7240|Talk]]
 </td><td>
 The Free Encyclopedia
 </td><td>
-{{int:Sitesubtitle}}
+{{int:daaf7240}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitesupport&action=edit sitesupport]<br>
-[[MediaWiki_talk:Sitesupport|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3b434c6d&action=edit 32b42c53]<br>
+[[MediaWiki_talk:3b434c6d|Talk]]
 </td><td>
 Donations
 </td><td>
-{{int:Sitesupport}}
+{{int:3b434c6d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitetitle&action=edit sitetitle]<br>
-[[MediaWiki_talk:Sitetitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d75649ef&action=edit d88e8164]<br>
+[[MediaWiki_talk:d75649ef|Talk]]
 </td><td>
 Wiktionary
 </td><td>
-{{int:Sitetitle}}
+{{int:d75649ef}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Siteuser&action=edit siteuser]<br>
-[[MediaWiki_talk:Siteuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cb06d8a3&action=edit b64ec710]<br>
+[[MediaWiki_talk:cb06d8a3|Talk]]
 </td><td>
 Wiktionary user $1
 </td><td>
-{{int:Siteuser}}
+{{int:cb06d8a3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Siteusers&action=edit siteusers]<br>
-[[MediaWiki_talk:Siteusers|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d25d37c8&action=edit 4f548531]<br>
+[[MediaWiki_talk:d25d37c8|Talk]]
 </td><td>
 Wiktionary user(s) $1
 </td><td>
-{{int:Siteusers}}
+{{int:d25d37c8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Skin&action=edit skin]<br>
-[[MediaWiki_talk:Skin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8f57bd61&action=edit d0cb2acd]<br>
+[[MediaWiki_talk:8f57bd61|Talk]]
 </td><td>
 Skin
 </td><td>
-{{int:Skin}}
+{{int:8f57bd61}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spamprotectiontext&action=edit spamprotectiontext]<br>
-[[MediaWiki_talk:Spamprotectiontext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d3a6dd4e&action=edit bcd196f9]<br>
+[[MediaWiki_talk:d3a6dd4e|Talk]]
 </td><td>
 The page you wanted to save was blocked by the spam filter. This is probably caused by a link to an external site. 
 
 You might want to check the following regular expression for patterns that are currently blocked:
 </td><td>
-{{int:Spamprotectiontext}}
+{{int:d3a6dd4e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spamprotectiontitle&action=edit spamprotectiontitle]<br>
-[[MediaWiki_talk:Spamprotectiontitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:add33980&action=edit 60a90929]<br>
+[[MediaWiki_talk:add33980|Talk]]
 </td><td>
 Spam protection filter
 </td><td>
-{{int:Spamprotectiontitle}}
+{{int:add33980}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Specialpage&action=edit specialpage]<br>
-[[MediaWiki_talk:Specialpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:984c6817&action=edit 25255195]<br>
+[[MediaWiki_talk:984c6817|Talk]]
 </td><td>
 Special Page
 </td><td>
-{{int:Specialpage}}
+{{int:984c6817}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Specialpages&action=edit specialpages]<br>
-[[MediaWiki_talk:Specialpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b67d51d8&action=edit 62bc32dc]<br>
+[[MediaWiki_talk:b67d51d8|Talk]]
 </td><td>
 Special pages
 </td><td>
-{{int:Specialpages}}
+{{int:b67d51d8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spheading&action=edit spheading]<br>
-[[MediaWiki_talk:Spheading|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c9709132&action=edit 73ac2b41]<br>
+[[MediaWiki_talk:c9709132|Talk]]
 </td><td>
 Special pages for all users
 </td><td>
-{{int:Spheading}}
+{{int:c9709132}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sqlislogged&action=edit sqlislogged]<br>
-[[MediaWiki_talk:Sqlislogged|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:87ac14f6&action=edit ed31e1e1]<br>
+[[MediaWiki_talk:87ac14f6|Talk]]
 </td><td>
 Please note that all queries are logged.
 </td><td>
-{{int:Sqlislogged}}
+{{int:87ac14f6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sqlquery&action=edit sqlquery]<br>
-[[MediaWiki_talk:Sqlquery|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:00c261e1&action=edit 26cb51a1]<br>
+[[MediaWiki_talk:00c261e1|Talk]]
 </td><td>
 Enter query
 </td><td>
-{{int:Sqlquery}}
+{{int:00c261e1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Statistics&action=edit statistics]<br>
-[[MediaWiki_talk:Statistics|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2086b21f&action=edit 3d18b2ea]<br>
+[[MediaWiki_talk:2086b21f|Talk]]
 </td><td>
 Statistics
 </td><td>
-{{int:Statistics}}
+{{int:2086b21f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Storedversion&action=edit storedversion]<br>
-[[MediaWiki_talk:Storedversion|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8cd0c85e&action=edit 1b9e838c]<br>
+[[MediaWiki_talk:8cd0c85e|Talk]]
 </td><td>
 Stored version
 </td><td>
-{{int:Storedversion}}
+{{int:8cd0c85e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Stubthreshold&action=edit stubthreshold]<br>
-[[MediaWiki_talk:Stubthreshold|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2eb6d4bd&action=edit a5125d69]<br>
+[[MediaWiki_talk:2eb6d4bd|Talk]]
 </td><td>
 Threshold for stub display
 </td><td>
-{{int:Stubthreshold}}
+{{int:2eb6d4bd}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subcategories&action=edit subcategories]<br>
-[[MediaWiki_talk:Subcategories|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f3da206c&action=edit ef062b0e]<br>
+[[MediaWiki_talk:f3da206c|Talk]]
 </td><td>
 Subcategories
 </td><td>
-{{int:Subcategories}}
+{{int:f3da206c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subject&action=edit subject]<br>
-[[MediaWiki_talk:Subject|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8d183dbd&action=edit 335ce16b]<br>
+[[MediaWiki_talk:8d183dbd|Talk]]
 </td><td>
 Subject/headline
 </td><td>
-{{int:Subject}}
+{{int:8d183dbd}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subjectpage&action=edit subjectpage]<br>
-[[MediaWiki_talk:Subjectpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ca29f2df&action=edit d7084ef8]<br>
+[[MediaWiki_talk:ca29f2df|Talk]]
 </td><td>
 View subject
 </td><td>
-{{int:Subjectpage}}
+{{int:ca29f2df}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Successfulupload&action=edit successfulupload]<br>
-[[MediaWiki_talk:Successfulupload|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:17bc3900&action=edit 3dfd0f51]<br>
+[[MediaWiki_talk:17bc3900|Talk]]
 </td><td>
 Successful upload
 </td><td>
-{{int:Successfulupload}}
+{{int:17bc3900}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Summary&action=edit summary]<br>
-[[MediaWiki_talk:Summary|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:12b71c3e&action=edit 05535ecf]<br>
+[[MediaWiki_talk:12b71c3e|Talk]]
 </td><td>
 Summary
 </td><td>
-{{int:Summary}}
+{{int:12b71c3e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysopspheading&action=edit sysopspheading]<br>
-[[MediaWiki_talk:Sysopspheading|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ee858d9a&action=edit fde4e0f4]<br>
+[[MediaWiki_talk:ee858d9a|Talk]]
 </td><td>
 For sysop use only
 </td><td>
-{{int:Sysopspheading}}
+{{int:ee858d9a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysoptext&action=edit sysoptext]<br>
-[[MediaWiki_talk:Sysoptext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2f758a39&action=edit 85232d4f]<br>
+[[MediaWiki_talk:2f758a39|Talk]]
 </td><td>
 The action you have requested can only be
 performed by users with &quot;sysop&quot; status.
 See $1.
 </td><td>
-{{int:Sysoptext}}
+{{int:2f758a39}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysoptitle&action=edit sysoptitle]<br>
-[[MediaWiki_talk:Sysoptitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:91b8467b&action=edit 3265b18d]<br>
+[[MediaWiki_talk:91b8467b|Talk]]
 </td><td>
 Sysop access required
 </td><td>
-{{int:Sysoptitle}}
+{{int:91b8467b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tableform&action=edit tableform]<br>
-[[MediaWiki_talk:Tableform|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:77b9c5ad&action=edit 109e51e1]<br>
+[[MediaWiki_talk:77b9c5ad|Talk]]
 </td><td>
 table
 </td><td>
-{{int:Tableform}}
+{{int:77b9c5ad}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talk&action=edit talk]<br>
-[[MediaWiki_talk:Talk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4e6a710d&action=edit e55e91b2]<br>
+[[MediaWiki_talk:4e6a710d|Talk]]
 </td><td>
 Discussion
 </td><td>
-{{int:Talk}}
+{{int:4e6a710d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkexists&action=edit talkexists]<br>
-[[MediaWiki_talk:Talkexists|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c11ac522&action=edit 1ed6d2b4]<br>
+[[MediaWiki_talk:c11ac522|Talk]]
 </td><td>
 The page itself was moved successfully, but the
 talk page could not be moved because one already exists at the new
 title. Please merge them manually.
 </td><td>
-{{int:Talkexists}}
+{{int:c11ac522}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpage&action=edit talkpage]<br>
-[[MediaWiki_talk:Talkpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6a38ff98&action=edit 3c940bbf]<br>
+[[MediaWiki_talk:6a38ff98|Talk]]
 </td><td>
 Discuss this page
 </td><td>
-{{int:Talkpage}}
+{{int:6a38ff98}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagemoved&action=edit talkpagemoved]<br>
-[[MediaWiki_talk:Talkpagemoved|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2b630ea0&action=edit f053e191]<br>
+[[MediaWiki_talk:2b630ea0|Talk]]
 </td><td>
 The corresponding talk page was also moved.
 </td><td>
-{{int:Talkpagemoved}}
+{{int:2b630ea0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagenotmoved&action=edit talkpagenotmoved]<br>
-[[MediaWiki_talk:Talkpagenotmoved|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2282b1ca&action=edit f3b6a64f]<br>
+[[MediaWiki_talk:2282b1ca|Talk]]
 </td><td>
 The corresponding talk page was &lt;strong&gt;not&lt;/strong&gt; moved.
 </td><td>
-{{int:Talkpagenotmoved}}
+{{int:2282b1ca}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagetext&action=edit talkpagetext]<br>
-[[MediaWiki_talk:Talkpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:45e3f76d&action=edit 6534acb5]<br>
+[[MediaWiki_talk:45e3f76d|Talk]]
 </td><td>
 &lt;!-- MediaWiki:talkpagetext --&gt;
 </td><td>
-{{int:Talkpagetext}}
+{{int:45e3f76d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Textboxsize&action=edit textboxsize]<br>
-[[MediaWiki_talk:Textboxsize|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:607359f2&action=edit 5788df25]<br>
+[[MediaWiki_talk:607359f2|Talk]]
 </td><td>
 Textbox dimensions
 </td><td>
-{{int:Textboxsize}}
+{{int:607359f2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Textmatches&action=edit textmatches]<br>
-[[MediaWiki_talk:Textmatches|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:66571fbc&action=edit 7d66aa0e]<br>
+[[MediaWiki_talk:66571fbc|Talk]]
 </td><td>
 Page text matches
 </td><td>
-{{int:Textmatches}}
+{{int:66571fbc}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Thisisdeleted&action=edit thisisdeleted]<br>
-[[MediaWiki_talk:Thisisdeleted|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e1f36741&action=edit 83f663ed]<br>
+[[MediaWiki_talk:e1f36741|Talk]]
 </td><td>
 View or restore $1?
 </td><td>
-{{int:Thisisdeleted}}
+{{int:e1f36741}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Thumbnail-more&action=edit thumbnail-more]<br>
-[[MediaWiki_talk:Thumbnail-more|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a29f027b&action=edit a299730b]<br>
+[[MediaWiki_talk:a29f027b|Talk]]
 </td><td>
 Enlarge
 </td><td>
-{{int:Thumbnail-more}}
+{{int:a29f027b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezonelegend&action=edit timezonelegend]<br>
-[[MediaWiki_talk:Timezonelegend|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9ced4850&action=edit 36ee6f56]<br>
+[[MediaWiki_talk:9ced4850|Talk]]
 </td><td>
 Time zone
 </td><td>
-{{int:Timezonelegend}}
+{{int:9ced4850}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezoneoffset&action=edit timezoneoffset]<br>
-[[MediaWiki_talk:Timezoneoffset|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ca45a968&action=edit 9dba4eb8]<br>
+[[MediaWiki_talk:ca45a968|Talk]]
 </td><td>
 Offset
 </td><td>
-{{int:Timezoneoffset}}
+{{int:ca45a968}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezonetext&action=edit timezonetext]<br>
-[[MediaWiki_talk:Timezonetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:60bc3c41&action=edit 3f58a2a9]<br>
+[[MediaWiki_talk:60bc3c41|Talk]]
 </td><td>
 Enter number of hours your local time differs
 from server time (UTC).
 </td><td>
-{{int:Timezonetext}}
+{{int:60bc3c41}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Titlematches&action=edit titlematches]<br>
-[[MediaWiki_talk:Titlematches|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2618febd&action=edit e3f5384c]<br>
+[[MediaWiki_talk:2618febd|Talk]]
 </td><td>
 Article title matches
 </td><td>
-{{int:Titlematches}}
+{{int:2618febd}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Toc&action=edit toc]<br>
-[[MediaWiki_talk:Toc|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b8684fcf&action=edit 2a609230]<br>
+[[MediaWiki_talk:b8684fcf|Talk]]
 </td><td>
 Table of contents
 </td><td>
-{{int:Toc}}
+{{int:b8684fcf}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Toolbox&action=edit toolbox]<br>
-[[MediaWiki_talk:Toolbox|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:692107c0&action=edit d75ba923]<br>
+[[MediaWiki_talk:692107c0|Talk]]
 </td><td>
 Toolbox
 </td><td>
-{{int:Toolbox}}
+{{int:692107c0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-addsection&action=edit tooltip-addsection]<br>
-[[MediaWiki_talk:Tooltip-addsection|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b9116941&action=edit 04ced041]<br>
+[[MediaWiki_talk:b9116941|Talk]]
 </td><td>
 Add a comment to this page. &#91;alt-+]
 </td><td>
-{{int:Tooltip-addsection}}
+{{int:b9116941}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-anontalk&action=edit tooltip-anontalk]<br>
-[[MediaWiki_talk:Tooltip-anontalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b583d36c&action=edit b987f993]<br>
+[[MediaWiki_talk:b583d36c|Talk]]
 </td><td>
 Discussion about edits from this ip address &#91;alt-n]
 </td><td>
-{{int:Tooltip-anontalk}}
+{{int:b583d36c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-anonuserpage&action=edit tooltip-anonuserpage]<br>
-[[MediaWiki_talk:Tooltip-anonuserpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9efcbe2f&action=edit e3522c89]<br>
+[[MediaWiki_talk:9efcbe2f|Talk]]
 </td><td>
 The user page for the ip you&#39;re editing as &#91;alt-.]
 </td><td>
-{{int:Tooltip-anonuserpage}}
+{{int:9efcbe2f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-article&action=edit tooltip-article]<br>
-[[MediaWiki_talk:Tooltip-article|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a4b9eea&action=edit f3025f7a]<br>
+[[MediaWiki_talk:2a4b9eea|Talk]]
 </td><td>
 View the content page &#91;alt-a]
 </td><td>
-{{int:Tooltip-article}}
+{{int:2a4b9eea}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-atom&action=edit tooltip-atom]<br>
-[[MediaWiki_talk:Tooltip-atom|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dcd3ca0c&action=edit e420bf33]<br>
+[[MediaWiki_talk:dcd3ca0c|Talk]]
 </td><td>
 Atom feed for this page
 </td><td>
-{{int:Tooltip-atom}}
+{{int:dcd3ca0c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-compareselectedversions&action=edit tooltip-compareselectedversions]<br>
-[[MediaWiki_talk:Tooltip-compareselectedversions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d318992a&action=edit d2ae036e]<br>
+[[MediaWiki_talk:d318992a|Talk]]
 </td><td>
 See the differences between the two selected versions of this page. &#91;alt-v]
 </td><td>
-{{int:Tooltip-compareselectedversions}}
+{{int:d318992a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-contributions&action=edit tooltip-contributions]<br>
-[[MediaWiki_talk:Tooltip-contributions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:17165e38&action=edit 2039dc44]<br>
+[[MediaWiki_talk:17165e38|Talk]]
 </td><td>
 View the list of contributions of this user
 </td><td>
-{{int:Tooltip-contributions}}
+{{int:17165e38}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-currentevents&action=edit tooltip-currentevents]<br>
-[[MediaWiki_talk:Tooltip-currentevents|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:32bcbdd6&action=edit d57ba9d6]<br>
+[[MediaWiki_talk:32bcbdd6|Talk]]
 </td><td>
 Find background information on current events
 </td><td>
-{{int:Tooltip-currentevents}}
+{{int:32bcbdd6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-delete&action=edit tooltip-delete]<br>
-[[MediaWiki_talk:Tooltip-delete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b1488dbf&action=edit 742e0c2a]<br>
+[[MediaWiki_talk:b1488dbf|Talk]]
 </td><td>
 Delete this page &#91;alt-d]
 </td><td>
-{{int:Tooltip-delete}}
+{{int:b1488dbf}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-edit&action=edit tooltip-edit]<br>
-[[MediaWiki_talk:Tooltip-edit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8c519c79&action=edit 6b354128]<br>
+[[MediaWiki_talk:8c519c79|Talk]]
 </td><td>
 You can edit this page. Please use the preview button before saving. &#91;alt-e]
 </td><td>
-{{int:Tooltip-edit}}
+{{int:8c519c79}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-emailuser&action=edit tooltip-emailuser]<br>
-[[MediaWiki_talk:Tooltip-emailuser|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d61f42ac&action=edit 6a333373]<br>
+[[MediaWiki_talk:d61f42ac|Talk]]
 </td><td>
 Send a mail to this user
 </td><td>
-{{int:Tooltip-emailuser}}
+{{int:d61f42ac}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-help&action=edit tooltip-help]<br>
-[[MediaWiki_talk:Tooltip-help|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:691c7c4c&action=edit 1f2e0a5e]<br>
+[[MediaWiki_talk:691c7c4c|Talk]]
 </td><td>
 The place to find out.
 </td><td>
-{{int:Tooltip-help}}
+{{int:691c7c4c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-history&action=edit tooltip-history]<br>
-[[MediaWiki_talk:Tooltip-history|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:da5d5f0e&action=edit 357e85a5]<br>
+[[MediaWiki_talk:da5d5f0e|Talk]]
 </td><td>
 Past versions of this page, &#91;alt-h]
 </td><td>
-{{int:Tooltip-history}}
+{{int:da5d5f0e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-login&action=edit tooltip-login]<br>
-[[MediaWiki_talk:Tooltip-login|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e20e86bb&action=edit ff6db008]<br>
+[[MediaWiki_talk:e20e86bb|Talk]]
 </td><td>
 You are encouraged to log in, it is not mandatory however. &#91;alt-o]
 </td><td>
-{{int:Tooltip-login}}
+{{int:e20e86bb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-logout&action=edit tooltip-logout]<br>
-[[MediaWiki_talk:Tooltip-logout|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ab189540&action=edit bd25c34c]<br>
+[[MediaWiki_talk:ab189540|Talk]]
 </td><td>
 Log out &#91;alt-o]
 </td><td>
-{{int:Tooltip-logout}}
+{{int:ab189540}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mainpage&action=edit tooltip-mainpage]<br>
-[[MediaWiki_talk:Tooltip-mainpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8d2a8168&action=edit 9dd4b86c]<br>
+[[MediaWiki_talk:8d2a8168|Talk]]
 </td><td>
 Visit the Main Page &#91;alt-z]
 </td><td>
-{{int:Tooltip-mainpage}}
+{{int:8d2a8168}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-minoredit&action=edit tooltip-minoredit]<br>
-[[MediaWiki_talk:Tooltip-minoredit|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7316f250&action=edit 2138d388]<br>
+[[MediaWiki_talk:7316f250|Talk]]
 </td><td>
 Mark this as a minor edit &#91;alt-i]
 </td><td>
-{{int:Tooltip-minoredit}}
+{{int:7316f250}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-move&action=edit tooltip-move]<br>
-[[MediaWiki_talk:Tooltip-move|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bfe45253&action=edit 00ef7343]<br>
+[[MediaWiki_talk:bfe45253|Talk]]
 </td><td>
 Move this page &#91;alt-m]
 </td><td>
-{{int:Tooltip-move}}
+{{int:bfe45253}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mycontris&action=edit tooltip-mycontris]<br>
-[[MediaWiki_talk:Tooltip-mycontris|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c2b4d858&action=edit 0bafecde]<br>
+[[MediaWiki_talk:c2b4d858|Talk]]
 </td><td>
 List of my contributions &#91;alt-y]
 </td><td>
-{{int:Tooltip-mycontris}}
+{{int:c2b4d858}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mytalk&action=edit tooltip-mytalk]<br>
-[[MediaWiki_talk:Tooltip-mytalk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:22361e38&action=edit ef887076]<br>
+[[MediaWiki_talk:22361e38|Talk]]
 </td><td>
 My talk page &#91;alt-n]
 </td><td>
-{{int:Tooltip-mytalk}}
+{{int:22361e38}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-nomove&action=edit tooltip-nomove]<br>
-[[MediaWiki_talk:Tooltip-nomove|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b34e28e3&action=edit 6d66eb21]<br>
+[[MediaWiki_talk:b34e28e3|Talk]]
 </td><td>
 You don&#39;t have the permissions to move this page
 </td><td>
-{{int:Tooltip-nomove}}
+{{int:b34e28e3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-portal&action=edit tooltip-portal]<br>
-[[MediaWiki_talk:Tooltip-portal|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:dc2cdd3b&action=edit 7e77da11]<br>
+[[MediaWiki_talk:dc2cdd3b|Talk]]
 </td><td>
 About the project, what you can do, where to find things
 </td><td>
-{{int:Tooltip-portal}}
+{{int:dc2cdd3b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-preferences&action=edit tooltip-preferences]<br>
-[[MediaWiki_talk:Tooltip-preferences|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2032ad70&action=edit 5611ec73]<br>
+[[MediaWiki_talk:2032ad70|Talk]]
 </td><td>
 My preferences
 </td><td>
-{{int:Tooltip-preferences}}
+{{int:2032ad70}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-preview&action=edit tooltip-preview]<br>
-[[MediaWiki_talk:Tooltip-preview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d87a6e27&action=edit 71b5f228]<br>
+[[MediaWiki_talk:d87a6e27|Talk]]
 </td><td>
 Preview your changes, please use this before saving! &#91;alt-p]
 </td><td>
-{{int:Tooltip-preview}}
+{{int:d87a6e27}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-protect&action=edit tooltip-protect]<br>
-[[MediaWiki_talk:Tooltip-protect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:44edd577&action=edit fa1fc302]<br>
+[[MediaWiki_talk:44edd577|Talk]]
 </td><td>
 Protect this page &#91;alt-=]
 </td><td>
-{{int:Tooltip-protect}}
+{{int:44edd577}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-randompage&action=edit tooltip-randompage]<br>
-[[MediaWiki_talk:Tooltip-randompage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:aa67a70a&action=edit f2eedbde]<br>
+[[MediaWiki_talk:aa67a70a|Talk]]
 </td><td>
 Load a random page &#91;alt-x]
 </td><td>
-{{int:Tooltip-randompage}}
+{{int:aa67a70a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-recentchanges&action=edit tooltip-recentchanges]<br>
-[[MediaWiki_talk:Tooltip-recentchanges|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a5de539f&action=edit cafd58f7]<br>
+[[MediaWiki_talk:a5de539f|Talk]]
 </td><td>
 The list of recent changes in the wiki. &#91;alt-r]
 </td><td>
-{{int:Tooltip-recentchanges}}
+{{int:a5de539f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-recentchangeslinked&action=edit tooltip-recentchangeslinked]<br>
-[[MediaWiki_talk:Tooltip-recentchangeslinked|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:47cd8236&action=edit ccab4d0f]<br>
+[[MediaWiki_talk:47cd8236|Talk]]
 </td><td>
 Recent changes in pages linking to this page &#91;alt-c]
 </td><td>
-{{int:Tooltip-recentchangeslinked}}
+{{int:47cd8236}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-rss&action=edit tooltip-rss]<br>
-[[MediaWiki_talk:Tooltip-rss|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:82964371&action=edit 53235bed]<br>
+[[MediaWiki_talk:82964371|Talk]]
 </td><td>
 RSS feed for this page
 </td><td>
-{{int:Tooltip-rss}}
+{{int:82964371}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-save&action=edit tooltip-save]<br>
-[[MediaWiki_talk:Tooltip-save|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ec76631f&action=edit 8ce4a9b9]<br>
+[[MediaWiki_talk:ec76631f|Talk]]
 </td><td>
 Save your changes &#91;alt-s]
 </td><td>
-{{int:Tooltip-save}}
+{{int:ec76631f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-search&action=edit tooltip-search]<br>
-[[MediaWiki_talk:Tooltip-search|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6d206f30&action=edit a6413695]<br>
+[[MediaWiki_talk:6d206f30|Talk]]
 </td><td>
 Search this wiki &#91;alt-f]
 </td><td>
-{{int:Tooltip-search}}
+{{int:6d206f30}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-sitesupport&action=edit tooltip-sitesupport]<br>
-[[MediaWiki_talk:Tooltip-sitesupport|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:65256208&action=edit c2dafa2a]<br>
+[[MediaWiki_talk:65256208|Talk]]
 </td><td>
 Support Wiktionary
 </td><td>
-{{int:Tooltip-sitesupport}}
+{{int:65256208}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-specialpage&action=edit tooltip-specialpage]<br>
-[[MediaWiki_talk:Tooltip-specialpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:280cc8fd&action=edit 73f9a677]<br>
+[[MediaWiki_talk:280cc8fd|Talk]]
 </td><td>
 This is a special page, you can&#39;t edit the page itself.
 </td><td>
-{{int:Tooltip-specialpage}}
+{{int:280cc8fd}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-specialpages&action=edit tooltip-specialpages]<br>
-[[MediaWiki_talk:Tooltip-specialpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7c7223be&action=edit 764993b1]<br>
+[[MediaWiki_talk:7c7223be|Talk]]
 </td><td>
 List of all special pages &#91;alt-q]
 </td><td>
-{{int:Tooltip-specialpages}}
+{{int:7c7223be}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-talk&action=edit tooltip-talk]<br>
-[[MediaWiki_talk:Tooltip-talk|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:06fb1d8e&action=edit cb23801a]<br>
+[[MediaWiki_talk:06fb1d8e|Talk]]
 </td><td>
 Discussion about the content page &#91;alt-t]
 </td><td>
-{{int:Tooltip-talk}}
+{{int:06fb1d8e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-undelete&action=edit tooltip-undelete]<br>
-[[MediaWiki_talk:Tooltip-undelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:341a8a32&action=edit df81e982]<br>
+[[MediaWiki_talk:341a8a32|Talk]]
 </td><td>
 Restore the $1 edits done to this page before it was deleted &#91;alt-d]
 </td><td>
-{{int:Tooltip-undelete}}
+{{int:341a8a32}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-unwatch&action=edit tooltip-unwatch]<br>
-[[MediaWiki_talk:Tooltip-unwatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:377e895f&action=edit 53f18c52]<br>
+[[MediaWiki_talk:377e895f|Talk]]
 </td><td>
 Remove this page from your watchlist &#91;alt-w]
 </td><td>
-{{int:Tooltip-unwatch}}
+{{int:377e895f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-upload&action=edit tooltip-upload]<br>
-[[MediaWiki_talk:Tooltip-upload|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b1d4103e&action=edit 6143ca0f]<br>
+[[MediaWiki_talk:b1d4103e|Talk]]
 </td><td>
 Upload images or media files &#91;alt-u]
 </td><td>
-{{int:Tooltip-upload}}
+{{int:b1d4103e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-userpage&action=edit tooltip-userpage]<br>
-[[MediaWiki_talk:Tooltip-userpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3d8cae2f&action=edit 2b3a6ed0]<br>
+[[MediaWiki_talk:3d8cae2f|Talk]]
 </td><td>
 My user page &#91;alt-.]
 </td><td>
-{{int:Tooltip-userpage}}
+{{int:3d8cae2f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-viewsource&action=edit tooltip-viewsource]<br>
-[[MediaWiki_talk:Tooltip-viewsource|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:141dd88c&action=edit 1ef2ea9d]<br>
+[[MediaWiki_talk:141dd88c|Talk]]
 </td><td>
 This page is protected. You can view its source. &#91;alt-e]
 </td><td>
-{{int:Tooltip-viewsource}}
+{{int:141dd88c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-watch&action=edit tooltip-watch]<br>
-[[MediaWiki_talk:Tooltip-watch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:68a73399&action=edit 07e7b59d]<br>
+[[MediaWiki_talk:68a73399|Talk]]
 </td><td>
 Add this page to your watchlist &#91;alt-w]
 </td><td>
-{{int:Tooltip-watch}}
+{{int:68a73399}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-watchlist&action=edit tooltip-watchlist]<br>
-[[MediaWiki_talk:Tooltip-watchlist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:56a787ff&action=edit e24666fc]<br>
+[[MediaWiki_talk:56a787ff|Talk]]
 </td><td>
 The list of pages you&#39;re monitoring for changes. &#91;alt-l]
 </td><td>
-{{int:Tooltip-watchlist}}
+{{int:56a787ff}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-whatlinkshere&action=edit tooltip-whatlinkshere]<br>
-[[MediaWiki_talk:Tooltip-whatlinkshere|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3fd46bc1&action=edit fbd416b7]<br>
+[[MediaWiki_talk:3fd46bc1|Talk]]
 </td><td>
 List of all wiki pages that link here &#91;alt-b]
 </td><td>
-{{int:Tooltip-whatlinkshere}}
+{{int:3fd46bc1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uclinks&action=edit uclinks]<br>
-[[MediaWiki_talk:Uclinks|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:47514ec5&action=edit c48d8241]<br>
+[[MediaWiki_talk:47514ec5|Talk]]
 </td><td>
 View the last $1 changes; view the last $2 days.
 </td><td>
-{{int:Uclinks}}
+{{int:47514ec5}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ucnote&action=edit ucnote]<br>
-[[MediaWiki_talk:Ucnote|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6442d081&action=edit 0d69ac51]<br>
+[[MediaWiki_talk:6442d081|Talk]]
 </td><td>
 Below are this user&#39;s last &lt;b&gt;$1&lt;/b&gt; changes in the last &lt;b&gt;$2&lt;/b&gt; days.
 </td><td>
-{{int:Ucnote}}
+{{int:6442d081}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uctop&action=edit uctop]<br>
-[[MediaWiki_talk:Uctop|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:507d407a&action=edit f9bb6366]<br>
+[[MediaWiki_talk:507d407a|Talk]]
 </td><td>
  (top)
 </td><td>
-{{int:Uctop}}
+{{int:507d407a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblockip&action=edit unblockip]<br>
-[[MediaWiki_talk:Unblockip|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8c29ba33&action=edit 2b4842fd]<br>
+[[MediaWiki_talk:8c29ba33|Talk]]
 </td><td>
 Unblock user
 </td><td>
-{{int:Unblockip}}
+{{int:8c29ba33}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblockiptext&action=edit unblockiptext]<br>
-[[MediaWiki_talk:Unblockiptext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3a879bdb&action=edit 98f7f719]<br>
+[[MediaWiki_talk:3a879bdb|Talk]]
 </td><td>
 Use the form below to restore write access
 to a previously blocked IP address or username.
 </td><td>
-{{int:Unblockiptext}}
+{{int:3a879bdb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblocklink&action=edit unblocklink]<br>
-[[MediaWiki_talk:Unblocklink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e954d285&action=edit 24e7c6e7]<br>
+[[MediaWiki_talk:e954d285|Talk]]
 </td><td>
 unblock
 </td><td>
-{{int:Unblocklink}}
+{{int:e954d285}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblocklogentry&action=edit unblocklogentry]<br>
-[[MediaWiki_talk:Unblocklogentry|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5e55820a&action=edit eecac2a2]<br>
+[[MediaWiki_talk:5e55820a|Talk]]
 </td><td>
 unblocked &quot;$1&quot;
 </td><td>
-{{int:Unblocklogentry}}
+{{int:5e55820a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undelete&action=edit undelete]<br>
-[[MediaWiki_talk:Undelete|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9b2a9354&action=edit f690005f]<br>
+[[MediaWiki_talk:9b2a9354|Talk]]
 </td><td>
 Restore deleted page
 </td><td>
-{{int:Undelete}}
+{{int:9b2a9354}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undelete_short&action=edit undelete_short]<br>
-[[MediaWiki_talk:Undelete_short|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:85cdbe83&action=edit d4adea3f]<br>
+[[MediaWiki_talk:85cdbe83|Talk]]
 </td><td>
 Undelete $1 edits
 </td><td>
-{{int:Undelete_short}}
+{{int:85cdbe83}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletearticle&action=edit undeletearticle]<br>
-[[MediaWiki_talk:Undeletearticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9ba522b6&action=edit c4635e76]<br>
+[[MediaWiki_talk:9ba522b6|Talk]]
 </td><td>
 Restore deleted page
 </td><td>
-{{int:Undeletearticle}}
+{{int:9ba522b6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletebtn&action=edit undeletebtn]<br>
-[[MediaWiki_talk:Undeletebtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3346239e&action=edit 5dd4b2af]<br>
+[[MediaWiki_talk:3346239e|Talk]]
 </td><td>
 Restore!
 </td><td>
-{{int:Undeletebtn}}
+{{int:3346239e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletedarticle&action=edit undeletedarticle]<br>
-[[MediaWiki_talk:Undeletedarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c2a7eb23&action=edit cf1590b6]<br>
+[[MediaWiki_talk:c2a7eb23|Talk]]
 </td><td>
 restored &quot;$1&quot;
 </td><td>
-{{int:Undeletedarticle}}
+{{int:c2a7eb23}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletedtext&action=edit undeletedtext]<br>
-[[MediaWiki_talk:Undeletedtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:40f0db7a&action=edit 5e55bc75]<br>
+[[MediaWiki_talk:40f0db7a|Talk]]
 </td><td>
 &#91;&#91;$1]] has been successfully restored.
 See &#91;&#91;Wiktionary:Deletion_log]] for a record of recent deletions and restorations.
 </td><td>
-{{int:Undeletedtext}}
+{{int:40f0db7a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletehistory&action=edit undeletehistory]<br>
-[[MediaWiki_talk:Undeletehistory|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:feaa86c6&action=edit a69aad99]<br>
+[[MediaWiki_talk:feaa86c6|Talk]]
 </td><td>
 If you restore the page, all revisions will be restored to the history.
 If a new page with the same name has been created since the deletion, the restored
 revisions will appear in the prior history, and the current revision of the live page
 will not be automatically replaced.
 </td><td>
-{{int:Undeletehistory}}
+{{int:feaa86c6}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletepage&action=edit undeletepage]<br>
-[[MediaWiki_talk:Undeletepage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9fa6521f&action=edit d650f0a7]<br>
+[[MediaWiki_talk:9fa6521f|Talk]]
 </td><td>
 View and restore deleted pages
 </td><td>
-{{int:Undeletepage}}
+{{int:9fa6521f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletepagetext&action=edit undeletepagetext]<br>
-[[MediaWiki_talk:Undeletepagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2e99f66e&action=edit 19b68d7f]<br>
+[[MediaWiki_talk:2e99f66e|Talk]]
 </td><td>
 The following pages have been deleted but are still in the archive and
 can be restored. The archive may be periodically cleaned out.
 </td><td>
-{{int:Undeletepagetext}}
+{{int:2e99f66e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeleterevision&action=edit undeleterevision]<br>
-[[MediaWiki_talk:Undeleterevision|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b097a89b&action=edit 2a3672ef]<br>
+[[MediaWiki_talk:b097a89b|Talk]]
 </td><td>
 Deleted revision as of $1
 </td><td>
-{{int:Undeleterevision}}
+{{int:b097a89b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeleterevisions&action=edit undeleterevisions]<br>
-[[MediaWiki_talk:Undeleterevisions|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:eb2694a4&action=edit d0cd3f87]<br>
+[[MediaWiki_talk:eb2694a4|Talk]]
 </td><td>
 $1 revisions archived
 </td><td>
-{{int:Undeleterevisions}}
+{{int:eb2694a4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unexpected&action=edit unexpected]<br>
-[[MediaWiki_talk:Unexpected|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3b67a8c9&action=edit fd2a2764]<br>
+[[MediaWiki_talk:3b67a8c9|Talk]]
 </td><td>
 Unexpected value: &quot;$1&quot;=&quot;$2&quot;.
 </td><td>
-{{int:Unexpected}}
+{{int:3b67a8c9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockbtn&action=edit unlockbtn]<br>
-[[MediaWiki_talk:Unlockbtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:016b68d2&action=edit 74a8f293]<br>
+[[MediaWiki_talk:016b68d2|Talk]]
 </td><td>
 Unlock database
 </td><td>
-{{int:Unlockbtn}}
+{{int:016b68d2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockconfirm&action=edit unlockconfirm]<br>
-[[MediaWiki_talk:Unlockconfirm|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fc3080bf&action=edit ded00b4f]<br>
+[[MediaWiki_talk:fc3080bf|Talk]]
 </td><td>
 Yes, I really want to unlock the database.
 </td><td>
-{{int:Unlockconfirm}}
+{{int:fc3080bf}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdb&action=edit unlockdb]<br>
-[[MediaWiki_talk:Unlockdb|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:4df98d29&action=edit 68a2c7e3]<br>
+[[MediaWiki_talk:4df98d29|Talk]]
 </td><td>
 Unlock database
 </td><td>
-{{int:Unlockdb}}
+{{int:4df98d29}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbsuccesssub&action=edit unlockdbsuccesssub]<br>
-[[MediaWiki_talk:Unlockdbsuccesssub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:86605aa9&action=edit eb575aa1]<br>
+[[MediaWiki_talk:86605aa9|Talk]]
 </td><td>
 Database lock removed
 </td><td>
-{{int:Unlockdbsuccesssub}}
+{{int:86605aa9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbsuccesstext&action=edit unlockdbsuccesstext]<br>
-[[MediaWiki_talk:Unlockdbsuccesstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1896db20&action=edit a7a78572]<br>
+[[MediaWiki_talk:1896db20|Talk]]
 </td><td>
 The database has been unlocked.
 </td><td>
-{{int:Unlockdbsuccesstext}}
+{{int:1896db20}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbtext&action=edit unlockdbtext]<br>
-[[MediaWiki_talk:Unlockdbtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bd3decce&action=edit 6b32a82f]<br>
+[[MediaWiki_talk:bd3decce|Talk]]
 </td><td>
 Unlocking the database will restore the ability of all
 users to edit pages, change their preferences, edit their watchlists, and
 other things requiring changes in the database.
 Please confirm that this is what you intend to do.
 </td><td>
-{{int:Unlockdbtext}}
+{{int:bd3decce}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotect&action=edit unprotect]<br>
-[[MediaWiki_talk:Unprotect|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d180e0d9&action=edit 116b2a3b]<br>
+[[MediaWiki_talk:d180e0d9|Talk]]
 </td><td>
 Unprotect
 </td><td>
-{{int:Unprotect}}
+{{int:d180e0d9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectcomment&action=edit unprotectcomment]<br>
-[[MediaWiki_talk:Unprotectcomment|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:affff3c2&action=edit a4439c30]<br>
+[[MediaWiki_talk:affff3c2|Talk]]
 </td><td>
 Reason for unprotecting
 </td><td>
-{{int:Unprotectcomment}}
+{{int:affff3c2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectedarticle&action=edit unprotectedarticle]<br>
-[[MediaWiki_talk:Unprotectedarticle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b8d58125&action=edit 66029ebc]<br>
+[[MediaWiki_talk:b8d58125|Talk]]
 </td><td>
 unprotected &#91;&#91;$1]]
 </td><td>
-{{int:Unprotectedarticle}}
+{{int:b8d58125}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectsub&action=edit unprotectsub]<br>
-[[MediaWiki_talk:Unprotectsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b15ab8cb&action=edit c77cef4c]<br>
+[[MediaWiki_talk:b15ab8cb|Talk]]
 </td><td>
 (Unprotecting &quot;$1&quot;)
 </td><td>
-{{int:Unprotectsub}}
+{{int:b15ab8cb}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectthispage&action=edit unprotectthispage]<br>
-[[MediaWiki_talk:Unprotectthispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:10782968&action=edit caa31f1e]<br>
+[[MediaWiki_talk:10782968|Talk]]
 </td><td>
 Unprotect this page
 </td><td>
-{{int:Unprotectthispage}}
+{{int:10782968}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unusedimages&action=edit unusedimages]<br>
-[[MediaWiki_talk:Unusedimages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:5ed67176&action=edit e17373a9]<br>
+[[MediaWiki_talk:5ed67176|Talk]]
 </td><td>
 Unused images
 </td><td>
-{{int:Unusedimages}}
+{{int:5ed67176}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unusedimagestext&action=edit unusedimagestext]<br>
-[[MediaWiki_talk:Unusedimagestext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:373709c4&action=edit 13626cea]<br>
+[[MediaWiki_talk:373709c4|Talk]]
 </td><td>
 &lt;p&gt;Please note that other web sites may link to an image with
 a direct URL, and so may still be listed here despite being
 in active use.
 </td><td>
-{{int:Unusedimagestext}}
+{{int:373709c4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unwatch&action=edit unwatch]<br>
-[[MediaWiki_talk:Unwatch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:51055a00&action=edit f6f282e9]<br>
+[[MediaWiki_talk:51055a00|Talk]]
 </td><td>
 Unwatch
 </td><td>
-{{int:Unwatch}}
+{{int:51055a00}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unwatchthispage&action=edit unwatchthispage]<br>
-[[MediaWiki_talk:Unwatchthispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e21d3614&action=edit c7d1cd1e]<br>
+[[MediaWiki_talk:e21d3614|Talk]]
 </td><td>
 Stop watching
 </td><td>
-{{int:Unwatchthispage}}
+{{int:e21d3614}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Updated&action=edit updated]<br>
-[[MediaWiki_talk:Updated|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f2f8570d&action=edit 13a1891a]<br>
+[[MediaWiki_talk:f2f8570d|Talk]]
 </td><td>
 (Updated)
 </td><td>
-{{int:Updated}}
+{{int:f2f8570d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Upload&action=edit upload]<br>
-[[MediaWiki_talk:Upload|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8bdf057f&action=edit bb73aaaf]<br>
+[[MediaWiki_talk:8bdf057f|Talk]]
 </td><td>
 Upload file
 </td><td>
-{{int:Upload}}
+{{int:8bdf057f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadbtn&action=edit uploadbtn]<br>
-[[MediaWiki_talk:Uploadbtn|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0238951b&action=edit 6be1c689]<br>
+[[MediaWiki_talk:0238951b|Talk]]
 </td><td>
 Upload file
 </td><td>
-{{int:Uploadbtn}}
+{{int:0238951b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploaddisabled&action=edit uploaddisabled]<br>
-[[MediaWiki_talk:Uploaddisabled|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:88f59c5a&action=edit 693f4b51]<br>
+[[MediaWiki_talk:88f59c5a|Talk]]
 </td><td>
 Sorry, uploading is disabled.
 </td><td>
-{{int:Uploaddisabled}}
+{{int:88f59c5a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadedfiles&action=edit uploadedfiles]<br>
-[[MediaWiki_talk:Uploadedfiles|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7b8969f2&action=edit 7d4f03ff]<br>
+[[MediaWiki_talk:7b8969f2|Talk]]
 </td><td>
 Uploaded files
 </td><td>
-{{int:Uploadedfiles}}
+{{int:7b8969f2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadedimage&action=edit uploadedimage]<br>
-[[MediaWiki_talk:Uploadedimage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:954c2a11&action=edit e57056a0]<br>
+[[MediaWiki_talk:954c2a11|Talk]]
 </td><td>
 uploaded &quot;$1&quot;
 </td><td>
-{{int:Uploadedimage}}
+{{int:954c2a11}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploaderror&action=edit uploaderror]<br>
-[[MediaWiki_talk:Uploaderror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:304f9593&action=edit 8f1603bd]<br>
+[[MediaWiki_talk:304f9593|Talk]]
 </td><td>
 Upload error
 </td><td>
-{{int:Uploaderror}}
+{{int:304f9593}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadfile&action=edit uploadfile]<br>
-[[MediaWiki_talk:Uploadfile|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9e71a62c&action=edit 40d977b5]<br>
+[[MediaWiki_talk:9e71a62c|Talk]]
 </td><td>
 Upload images, sounds, documents etc.
 </td><td>
-{{int:Uploadfile}}
+{{int:9e71a62c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlink&action=edit uploadlink]<br>
-[[MediaWiki_talk:Uploadlink|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:955e39f9&action=edit 0bf93eec]<br>
+[[MediaWiki_talk:955e39f9|Talk]]
 </td><td>
 Upload images
 </td><td>
-{{int:Uploadlink}}
+{{int:955e39f9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlog&action=edit uploadlog]<br>
-[[MediaWiki_talk:Uploadlog|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0d39c428&action=edit 0d49abe6]<br>
+[[MediaWiki_talk:0d39c428|Talk]]
 </td><td>
 upload log
 </td><td>
-{{int:Uploadlog}}
+{{int:0d39c428}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlogpage&action=edit uploadlogpage]<br>
-[[MediaWiki_talk:Uploadlogpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1f68a0e7&action=edit 87611d30]<br>
+[[MediaWiki_talk:1f68a0e7|Talk]]
 </td><td>
 Upload_log
 </td><td>
-{{int:Uploadlogpage}}
+{{int:1f68a0e7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlogpagetext&action=edit uploadlogpagetext]<br>
-[[MediaWiki_talk:Uploadlogpagetext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2a430331&action=edit 8aa7bf47]<br>
+[[MediaWiki_talk:2a430331|Talk]]
 </td><td>
 Below is a list of the most recent file uploads.
 All times shown are server time (UTC).
@@ -5152,25 +5152,25 @@ All times shown are server time (UTC).
 &lt;/ul&gt;
 
 </td><td>
-{{int:Uploadlogpagetext}}
+{{int:2a430331}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadnologin&action=edit uploadnologin]<br>
-[[MediaWiki_talk:Uploadnologin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:92dd3bc9&action=edit d2d8bd08]<br>
+[[MediaWiki_talk:92dd3bc9|Talk]]
 </td><td>
 Not logged in
 </td><td>
-{{int:Uploadnologin}}
+{{int:92dd3bc9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadnologintext&action=edit uploadnologintext]<br>
-[[MediaWiki_talk:Uploadnologintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fecdb77e&action=edit 09b01f51]<br>
+[[MediaWiki_talk:fecdb77e|Talk]]
 </td><td>
 You must be &lt;a href=&quot;/wiki/Special:Userlogin&quot;&gt;logged in&lt;/a&gt;
 to upload files.
 </td><td>
-{{int:Uploadnologintext}}
+{{int:fecdb77e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadtext&action=edit uploadtext]<br>
-[[MediaWiki_talk:Uploadtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7804cb84&action=edit 85bb3caa]<br>
+[[MediaWiki_talk:7804cb84|Talk]]
 </td><td>
 &lt;strong&gt;STOP!&lt;/strong&gt; Before you upload here,
 make sure to read and follow the &lt;a href=&quot;/wiki/Special:Image_use_policy&quot;&gt;image use policy&lt;/a&gt;.
@@ -5201,403 +5201,403 @@ or &lt;b&gt;&#91;&#91;Media:file.ogg]]&lt;/b&gt; for sounds.
 delete your uploads if they think it serves the project, and
 you may be blocked from uploading if you abuse the system.
 </td><td>
-{{int:Uploadtext}}
+{{int:7804cb84}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadwarning&action=edit uploadwarning]<br>
-[[MediaWiki_talk:Uploadwarning|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fb3ef2ae&action=edit 8aae8210]<br>
+[[MediaWiki_talk:fb3ef2ae|Talk]]
 </td><td>
 Upload warning
 </td><td>
-{{int:Uploadwarning}}
+{{int:fb3ef2ae}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:User_rights_set&action=edit user_rights_set]<br>
-[[MediaWiki_talk:User_rights_set|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a5430c9b&action=edit 6a080eb0]<br>
+[[MediaWiki_talk:a5430c9b|Talk]]
 </td><td>
 &lt;b&gt;User rights for &quot;$1&quot; updated&lt;/b&gt;
 </td><td>
-{{int:User_rights_set}}
+{{int:a5430c9b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercssjs&action=edit usercssjs]<br>
-[[MediaWiki_talk:Usercssjs|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:89b73748&action=edit 8b23a826]<br>
+[[MediaWiki_talk:89b73748|Talk]]
 </td><td>
 &#39;&#39;&#39;Note:&#39;&#39;&#39; After saving, you have to tell your bowser to get the new version: &#39;&#39;&#39;Mozilla:&#39;&#39;&#39; click &#39;&#39;reload&#39;&#39;(or &#39;&#39;ctrl-r&#39;&#39;), &#39;&#39;&#39;IE / Opera:&#39;&#39;&#39; &#39;&#39;ctrl-f5&#39;&#39;, &#39;&#39;&#39;Safari:&#39;&#39;&#39; &#39;&#39;cmd-r&#39;&#39;, &#39;&#39;&#39;Konqueror&#39;&#39;&#39; &#39;&#39;ctrl-r&#39;&#39;.
 </td><td>
-{{int:Usercssjs}}
+{{int:89b73748}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercssjsyoucanpreview&action=edit usercssjsyoucanpreview]<br>
-[[MediaWiki_talk:Usercssjsyoucanpreview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1656c92b&action=edit 97bd6e75]<br>
+[[MediaWiki_talk:1656c92b|Talk]]
 </td><td>
 &lt;strong&gt;Tip:&lt;/strong&gt; Use the &#39;Show preview&#39; button to test your new css/js before saving.
 </td><td>
-{{int:Usercssjsyoucanpreview}}
+{{int:1656c92b}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercsspreview&action=edit usercsspreview]<br>
-[[MediaWiki_talk:Usercsspreview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:9f62117d&action=edit b51c3667]<br>
+[[MediaWiki_talk:9f62117d|Talk]]
 </td><td>
 &#39;&#39;&#39;Remember that you are only previewing your user css, it has not yet been saved!&#39;&#39;&#39;
 </td><td>
-{{int:Usercsspreview}}
+{{int:9f62117d}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userexists&action=edit userexists]<br>
-[[MediaWiki_talk:Userexists|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:77541367&action=edit a49220af]<br>
+[[MediaWiki_talk:77541367|Talk]]
 </td><td>
 The user name you entered is already in use. Please choose a different name.
 </td><td>
-{{int:Userexists}}
+{{int:77541367}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userjspreview&action=edit userjspreview]<br>
-[[MediaWiki_talk:Userjspreview|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:eca4b211&action=edit 2e8efec0]<br>
+[[MediaWiki_talk:eca4b211|Talk]]
 </td><td>
 &#39;&#39;&#39;Remember that you are only testing/previewing your user javascript, it has not yet been saved!&#39;&#39;&#39;
 </td><td>
-{{int:Userjspreview}}
+{{int:eca4b211}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userlogin&action=edit userlogin]<br>
-[[MediaWiki_talk:Userlogin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:49c670f4&action=edit eb0f23d8]<br>
+[[MediaWiki_talk:49c670f4|Talk]]
 </td><td>
 Log in
 </td><td>
-{{int:Userlogin}}
+{{int:49c670f4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userlogout&action=edit userlogout]<br>
-[[MediaWiki_talk:Userlogout|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:fb3467d9&action=edit 271a962f]<br>
+[[MediaWiki_talk:fb3467d9|Talk]]
 </td><td>
 Log out
 </td><td>
-{{int:Userlogout}}
+{{int:fb3467d9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usermailererror&action=edit usermailererror]<br>
-[[MediaWiki_talk:Usermailererror|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e1881ca2&action=edit 0e3f35e1]<br>
+[[MediaWiki_talk:e1881ca2|Talk]]
 </td><td>
 Mail object returned error: 
 </td><td>
-{{int:Usermailererror}}
+{{int:e1881ca2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userpage&action=edit userpage]<br>
-[[MediaWiki_talk:Userpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:823fdaf7&action=edit ea81d010]<br>
+[[MediaWiki_talk:823fdaf7|Talk]]
 </td><td>
 View user page
 </td><td>
-{{int:Userpage}}
+{{int:823fdaf7}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userstats&action=edit userstats]<br>
-[[MediaWiki_talk:Userstats|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f25ef873&action=edit 2ab9a2af]<br>
+[[MediaWiki_talk:f25ef873|Talk]]
 </td><td>
 User statistics
 </td><td>
-{{int:Userstats}}
+{{int:f25ef873}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userstatstext&action=edit userstatstext]<br>
-[[MediaWiki_talk:Userstatstext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b704c939&action=edit 903f135d]<br>
+[[MediaWiki_talk:b704c939|Talk]]
 </td><td>
 There are &#39;&#39;&#39;$1&#39;&#39;&#39; registered users.
 &#39;&#39;&#39;$2&#39;&#39;&#39; of these are administrators (see $3).
 </td><td>
-{{int:Userstatstext}}
+{{int:b704c939}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Version&action=edit version]<br>
-[[MediaWiki_talk:Version|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2da600bf&action=edit c692273d]<br>
+[[MediaWiki_talk:2da600bf|Talk]]
 </td><td>
 Version
 </td><td>
-{{int:Version}}
+{{int:2da600bf}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewcount&action=edit viewcount]<br>
-[[MediaWiki_talk:Viewcount|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cd20ed80&action=edit 9204f6f2]<br>
+[[MediaWiki_talk:cd20ed80|Talk]]
 </td><td>
 This page has been accessed $1 times.
 </td><td>
-{{int:Viewcount}}
+{{int:cd20ed80}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewprevnext&action=edit viewprevnext]<br>
-[[MediaWiki_talk:Viewprevnext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:b3a212e8&action=edit 023f0549]<br>
+[[MediaWiki_talk:b3a212e8|Talk]]
 </td><td>
 View ($1) ($2) ($3).
 </td><td>
-{{int:Viewprevnext}}
+{{int:b3a212e8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewsource&action=edit viewsource]<br>
-[[MediaWiki_talk:Viewsource|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1affdb1e&action=edit db9e2eba]<br>
+[[MediaWiki_talk:1affdb1e|Talk]]
 </td><td>
 View source
 </td><td>
-{{int:Viewsource}}
+{{int:1affdb1e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewtalkpage&action=edit viewtalkpage]<br>
-[[MediaWiki_talk:Viewtalkpage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f6336004&action=edit 2e250bd9]<br>
+[[MediaWiki_talk:f6336004|Talk]]
 </td><td>
 View discussion
 </td><td>
-{{int:Viewtalkpage}}
+{{int:f6336004}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wantedpages&action=edit wantedpages]<br>
-[[MediaWiki_talk:Wantedpages|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7da05431&action=edit 4d2466a3]<br>
+[[MediaWiki_talk:7da05431|Talk]]
 </td><td>
 Wanted pages
 </td><td>
-{{int:Wantedpages}}
+{{int:7da05431}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watch&action=edit watch]<br>
-[[MediaWiki_talk:Watch|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d91ebf58&action=edit 292b0901]<br>
+[[MediaWiki_talk:d91ebf58|Talk]]
 </td><td>
 Watch
 </td><td>
-{{int:Watch}}
+{{int:d91ebf58}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchdetails&action=edit watchdetails]<br>
-[[MediaWiki_talk:Watchdetails|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d815e414&action=edit ddfeb02c]<br>
+[[MediaWiki_talk:d815e414|Talk]]
 </td><td>
 ($1 pages watched not counting talk pages;
 $2 total pages edited since cutoff;
 $3...
 &lt;a href=&#39;$4&#39;&gt;show and edit complete list&lt;/a&gt;.)
 </td><td>
-{{int:Watchdetails}}
+{{int:d815e414}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watcheditlist&action=edit watcheditlist]<br>
-[[MediaWiki_talk:Watcheditlist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:780e4559&action=edit d7d3bb79]<br>
+[[MediaWiki_talk:780e4559|Talk]]
 </td><td>
 Here&#39;s an alphabetical list of your
 watched pages. Check the boxes of pages you want to remove
 from your watchlist and click the &#39;remove checked&#39; button
 at the bottom of the screen.
 </td><td>
-{{int:Watcheditlist}}
+{{int:780e4559}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlist&action=edit watchlist]<br>
-[[MediaWiki_talk:Watchlist|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:48a616d9&action=edit db14f0be]<br>
+[[MediaWiki_talk:48a616d9|Talk]]
 </td><td>
 My watchlist
 </td><td>
-{{int:Watchlist}}
+{{int:48a616d9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlistcontains&action=edit watchlistcontains]<br>
-[[MediaWiki_talk:Watchlistcontains|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:690e08f8&action=edit 37074879]<br>
+[[MediaWiki_talk:690e08f8|Talk]]
 </td><td>
 Your watchlist contains $1 pages.
 </td><td>
-{{int:Watchlistcontains}}
+{{int:690e08f8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlistsub&action=edit watchlistsub]<br>
-[[MediaWiki_talk:Watchlistsub|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:913a8eb4&action=edit 1d490f51]<br>
+[[MediaWiki_talk:913a8eb4|Talk]]
 </td><td>
 (for user &quot;$1&quot;)
 </td><td>
-{{int:Watchlistsub}}
+{{int:913a8eb4}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchmethod-list&action=edit watchmethod-list]<br>
-[[MediaWiki_talk:Watchmethod-list|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:983ce9b1&action=edit b5396cea]<br>
+[[MediaWiki_talk:983ce9b1|Talk]]
 </td><td>
 checking watched pages for recent edits
 </td><td>
-{{int:Watchmethod-list}}
+{{int:983ce9b1}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchmethod-recent&action=edit watchmethod-recent]<br>
-[[MediaWiki_talk:Watchmethod-recent|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2e5e56e2&action=edit c69b87d2]<br>
+[[MediaWiki_talk:2e5e56e2|Talk]]
 </td><td>
 checking recent edits for watched pages
 </td><td>
-{{int:Watchmethod-recent}}
+{{int:2e5e56e2}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnochange&action=edit watchnochange]<br>
-[[MediaWiki_talk:Watchnochange|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:cdd40087&action=edit 24353550]<br>
+[[MediaWiki_talk:cdd40087|Talk]]
 </td><td>
 None of your watched items were edited in the time period displayed.
 </td><td>
-{{int:Watchnochange}}
+{{int:cdd40087}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnologin&action=edit watchnologin]<br>
-[[MediaWiki_talk:Watchnologin|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:ec51da09&action=edit c873a8c3]<br>
+[[MediaWiki_talk:ec51da09|Talk]]
 </td><td>
 Not logged in
 </td><td>
-{{int:Watchnologin}}
+{{int:ec51da09}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnologintext&action=edit watchnologintext]<br>
-[[MediaWiki_talk:Watchnologintext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7870af11&action=edit 080c4da9]<br>
+[[MediaWiki_talk:7870af11|Talk]]
 </td><td>
 You must be &lt;a href=&quot;/wiki/Special:Userlogin&quot;&gt;logged in&lt;/a&gt;
 to modify your watchlist.
 </td><td>
-{{int:Watchnologintext}}
+{{int:7870af11}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchthis&action=edit watchthis]<br>
-[[MediaWiki_talk:Watchthis|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2fa65d73&action=edit 89758668]<br>
+[[MediaWiki_talk:2fa65d73|Talk]]
 </td><td>
 Watch this page
 </td><td>
-{{int:Watchthis}}
+{{int:2fa65d73}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchthispage&action=edit watchthispage]<br>
-[[MediaWiki_talk:Watchthispage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:79260dc8&action=edit d94c2857]<br>
+[[MediaWiki_talk:79260dc8|Talk]]
 </td><td>
 Watch this page
 </td><td>
-{{int:Watchthispage}}
+{{int:79260dc8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Welcomecreation&action=edit welcomecreation]<br>
-[[MediaWiki_talk:Welcomecreation|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:622a355f&action=edit 5b3750aa]<br>
+[[MediaWiki_talk:622a355f|Talk]]
 </td><td>
 &lt;h2&gt;Welcome, $1!&lt;/h2&gt;&lt;p&gt;Your account has been created.
 Don&#39;t forget to change your Wiktionary preferences.
 </td><td>
-{{int:Welcomecreation}}
+{{int:622a355f}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whatlinkshere&action=edit whatlinkshere]<br>
-[[MediaWiki_talk:Whatlinkshere|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:bde1fbba&action=edit 28d0e2a8]<br>
+[[MediaWiki_talk:bde1fbba|Talk]]
 </td><td>
 What links here
 </td><td>
-{{int:Whatlinkshere}}
+{{int:bde1fbba}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistacctext&action=edit whitelistacctext]<br>
-[[MediaWiki_talk:Whitelistacctext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:53f0999a&action=edit b3775e04]<br>
+[[MediaWiki_talk:53f0999a|Talk]]
 </td><td>
 To be allowed to create accounts in this Wiki you have to &#91;&#91;Special:Userlogin&#124;log]] in and have the appropriate permissions.
 </td><td>
-{{int:Whitelistacctext}}
+{{int:53f0999a}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistacctitle&action=edit whitelistacctitle]<br>
-[[MediaWiki_talk:Whitelistacctitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:901574b0&action=edit 13f7d937]<br>
+[[MediaWiki_talk:901574b0|Talk]]
 </td><td>
 You are not allowed to create an account
 </td><td>
-{{int:Whitelistacctitle}}
+{{int:901574b0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistedittext&action=edit whitelistedittext]<br>
-[[MediaWiki_talk:Whitelistedittext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:28589651&action=edit 8d93b543]<br>
+[[MediaWiki_talk:28589651|Talk]]
 </td><td>
 You have to &#91;&#91;Special:Userlogin&#124;login]] to edit pages.
 </td><td>
-{{int:Whitelistedittext}}
+{{int:28589651}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistedittitle&action=edit whitelistedittitle]<br>
-[[MediaWiki_talk:Whitelistedittitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d4e0db33&action=edit 76713eb6]<br>
+[[MediaWiki_talk:d4e0db33|Talk]]
 </td><td>
 Login required to edit
 </td><td>
-{{int:Whitelistedittitle}}
+{{int:d4e0db33}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistreadtext&action=edit whitelistreadtext]<br>
-[[MediaWiki_talk:Whitelistreadtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:7046be67&action=edit 3c46b4af]<br>
+[[MediaWiki_talk:7046be67|Talk]]
 </td><td>
 You have to &#91;&#91;Special:Userlogin&#124;login]] to read pages.
 </td><td>
-{{int:Whitelistreadtext}}
+{{int:7046be67}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistreadtitle&action=edit whitelistreadtitle]<br>
-[[MediaWiki_talk:Whitelistreadtitle|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:56f7b6c8&action=edit 27809c2a]<br>
+[[MediaWiki_talk:56f7b6c8|Talk]]
 </td><td>
 Login required to read
 </td><td>
-{{int:Whitelistreadtitle}}
+{{int:56f7b6c8}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wikipediapage&action=edit wikipediapage]<br>
-[[MediaWiki_talk:Wikipediapage|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:8815fbb3&action=edit 80a9ff8d]<br>
+[[MediaWiki_talk:8815fbb3|Talk]]
 </td><td>
 View project page
 </td><td>
-{{int:Wikipediapage}}
+{{int:8815fbb3}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wikititlesuffix&action=edit wikititlesuffix]<br>
-[[MediaWiki_talk:Wikititlesuffix|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:d00a5142&action=edit 937cdab5]<br>
+[[MediaWiki_talk:d00a5142|Talk]]
 </td><td>
 Wiktionary
 </td><td>
-{{int:Wikititlesuffix}}
+{{int:d00a5142}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlnote&action=edit wlnote]<br>
-[[MediaWiki_talk:Wlnote|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a7ee1c5c&action=edit b6ea8219]<br>
+[[MediaWiki_talk:a7ee1c5c|Talk]]
 </td><td>
 Below are the last $1 changes in the last &lt;b&gt;$2&lt;/b&gt; hours.
 </td><td>
-{{int:Wlnote}}
+{{int:a7ee1c5c}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlsaved&action=edit wlsaved]<br>
-[[MediaWiki_talk:Wlsaved|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:deb21c59&action=edit 843af08d]<br>
+[[MediaWiki_talk:deb21c59|Talk]]
 </td><td>
 This is a saved version of your watchlist.
 </td><td>
-{{int:Wlsaved}}
+{{int:deb21c59}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlshowlast&action=edit wlshowlast]<br>
-[[MediaWiki_talk:Wlshowlast|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:e77517fa&action=edit 89821357]<br>
+[[MediaWiki_talk:e77517fa|Talk]]
 </td><td>
 Show last $1 hours $2 days $3
 </td><td>
-{{int:Wlshowlast}}
+{{int:e77517fa}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wrong_wfQuery_params&action=edit wrong_wfQuery_params]<br>
-[[MediaWiki_talk:Wrong_wfQuery_params|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:a9b62164&action=edit d526a8a6]<br>
+[[MediaWiki_talk:a9b62164|Talk]]
 </td><td>
 Incorrect parameters to wfQuery()&lt;br /&gt;
 Function: $1&lt;br /&gt;
 Query: $2
 
 </td><td>
-{{int:Wrong_wfQuery_params}}
+{{int:a9b62164}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wrongpassword&action=edit wrongpassword]<br>
-[[MediaWiki_talk:Wrongpassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:3314dacf&action=edit d8ecf7db]<br>
+[[MediaWiki_talk:3314dacf|Talk]]
 </td><td>
 The password you entered is incorrect. Please try again.
 </td><td>
-{{int:Wrongpassword}}
+{{int:3314dacf}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourdiff&action=edit yourdiff]<br>
-[[MediaWiki_talk:Yourdiff|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:2e0414f0&action=edit 4fe151ac]<br>
+[[MediaWiki_talk:2e0414f0|Talk]]
 </td><td>
 Differences
 </td><td>
-{{int:Yourdiff}}
+{{int:2e0414f0}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Youremail&action=edit youremail]<br>
-[[MediaWiki_talk:Youremail|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:0f5ab9c9&action=edit 0a98c2ad]<br>
+[[MediaWiki_talk:0f5ab9c9|Talk]]
 </td><td>
 Your email*
 </td><td>
-{{int:Youremail}}
+{{int:0f5ab9c9}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourname&action=edit yourname]<br>
-[[MediaWiki_talk:Yourname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f495043e&action=edit 32d0e33a]<br>
+[[MediaWiki_talk:f495043e|Talk]]
 </td><td>
 Your user name
 </td><td>
-{{int:Yourname}}
+{{int:f495043e}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yournick&action=edit yournick]<br>
-[[MediaWiki_talk:Yournick|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:6aa78968&action=edit f8b28bd9]<br>
+[[MediaWiki_talk:6aa78968|Talk]]
 </td><td>
 Your nickname (for signatures)
 </td><td>
-{{int:Yournick}}
+{{int:6aa78968}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourpassword&action=edit yourpassword]<br>
-[[MediaWiki_talk:Yourpassword|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:13a44203&action=edit b48cf014]<br>
+[[MediaWiki_talk:13a44203|Talk]]
 </td><td>
 Your password
 </td><td>
-{{int:Yourpassword}}
+{{int:13a44203}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourpasswordagain&action=edit yourpasswordagain]<br>
-[[MediaWiki_talk:Yourpasswordagain|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:c0ad7f05&action=edit e14a732b]<br>
+[[MediaWiki_talk:c0ad7f05|Talk]]
 </td><td>
 Retype password
 </td><td>
-{{int:Yourpasswordagain}}
+{{int:c0ad7f05}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourrealname&action=edit yourrealname]<br>
-[[MediaWiki_talk:Yourrealname|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:519f30b5&action=edit 7fc3e5b1]<br>
+[[MediaWiki_talk:519f30b5|Talk]]
 </td><td>
 Your real name*
 </td><td>
-{{int:Yourrealname}}
+{{int:519f30b5}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourtext&action=edit yourtext]<br>
-[[MediaWiki_talk:Yourtext|Talk]]
+[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:f98650e0&action=edit 5b5af4ea]<br>
+[[MediaWiki_talk:f98650e0|Talk]]
 </td><td>
 Your text
 </td><td>
-{{int:Yourtext}}
+{{int:f98650e0}}
 </td></tr></table>
 
index 37f76ff..df3d568 100644 (file)
@@ -1,9 +1,11 @@
 <?php
+
 use MediaWiki\Logger\LegacySpi;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\Logger\MonologSpi;
 use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerInterface;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @since 1.18
@@ -439,7 +441,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @return string Absolute name of the temporary file
         */
        protected function getNewTempFile() {
-               $fileName = tempnam( wfTempDir(), 'MW_PHPUnit_' . get_class( $this ) . '_' );
+               $fileName = tempnam( wfTempDir(), 'MW_PHPUnit_' . static::class . '_' );
                $this->tmpFiles[] = $fileName;
 
                return $fileName;
@@ -735,6 +737,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                        $GLOBALS[$globalKey] instanceof FauxRequest
                                ) {
                                        $this->mwGlobals[$globalKey] = clone $GLOBALS[$globalKey];
+                               } elseif ( $this->containsClosure( $GLOBALS[$globalKey] ) ) {
+                                       // Serializing Closure only gives a warning on HHVM while
+                                       // it throws an Exception on Zend.
+                                       // Workaround for https://github.com/facebook/hhvm/issues/6206
+                                       $this->mwGlobals[$globalKey] = $GLOBALS[$globalKey];
                                } else {
                                        try {
                                                $this->mwGlobals[$globalKey] = unserialize( serialize( $GLOBALS[$globalKey] ) );
@@ -746,6 +753,28 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
+       /**
+        * @param mixed $var
+        * @param int $maxDepth
+        *
+        * @return bool
+        */
+       private function containsClosure( $var, $maxDepth = 15 ) {
+               if ( $var instanceof Closure ) {
+                       return true;
+               }
+               if ( !is_array( $var ) || $maxDepth === 0 ) {
+                       return false;
+               }
+
+               foreach ( $var as $value ) {
+                       if ( $this->containsClosure( $value, $maxDepth - 1 ) ) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
        /**
         * Merges the given values into a MW global array variable.
         * Useful for setting some entries in a configuration array, instead of
@@ -1298,24 +1327,31 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         */
        public function __call( $func, $args ) {
                static $compatibility = [
-                       'assertEmpty' => 'assertEmpty2', // assertEmpty was added in phpunit 3.7.32
+                       'createMock' => 'createMock2',
                ];
 
                if ( isset( $compatibility[$func] ) ) {
                        return call_user_func_array( [ $this, $compatibility[$func] ], $args );
                } else {
-                       throw new MWException( "Called non-existent $func method on "
-                               . get_class( $this ) );
+                       throw new MWException( "Called non-existent $func method on " . static::class );
                }
        }
 
        /**
-        * Used as a compatibility method for phpunit < 3.7.32
-        * @param string $value
-        * @param string $msg
+        * Return a test double for the specified class.
+        *
+        * @param string $originalClassName
+        * @return PHPUnit_Framework_MockObject_MockObject
+        * @throws Exception
         */
-       private function assertEmpty2( $value, $msg ) {
-               $this->assertTrue( $value == '', $msg );
+       private function createMock2( $originalClassName ) {
+               return $this->getMockBuilder( $originalClassName )
+                       ->disableOriginalConstructor()
+                       ->disableOriginalClone()
+                       ->disableArgumentCloning()
+                       // New in phpunit-mock-objects 3.2 (phpunit 5.4.0)
+                       // ->disallowMockingUnknownTypes()
+                       ->getMock();
        }
 
        private static function unprefixTable( &$tableName, $ind, $prefix ) {
@@ -1769,51 +1805,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $this->assertEmpty( $errors, implode( "\n", $errors ) );
        }
 
-       /**
-        * @param array $matcher
-        * @param string $actual
-        * @param bool $isHtml
-        *
-        * @return bool
-        */
-       private static function tagMatch( $matcher, $actual, $isHtml = true ) {
-               $dom = PHPUnit_Util_XML::load( $actual, $isHtml );
-               $tags = PHPUnit_Util_XML::findNodes( $dom, $matcher, $isHtml );
-               return count( $tags ) > 0 && $tags[0] instanceof DOMNode;
-       }
-
-       /**
-        * Note: we are overriding this method to remove the deprecated error
-        * @see https://phabricator.wikimedia.org/T71505
-        * @see https://github.com/sebastianbergmann/phpunit/issues/1292
-        * @deprecated
-        *
-        * @param array $matcher
-        * @param string $actual
-        * @param string $message
-        * @param bool $isHtml
-        */
-       public static function assertTag( $matcher, $actual, $message = '', $isHtml = true ) {
-               // trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
-
-               self::assertTrue( self::tagMatch( $matcher, $actual, $isHtml ), $message );
-       }
-
-       /**
-        * @see MediaWikiTestCase::assertTag
-        * @deprecated
-        *
-        * @param array $matcher
-        * @param string $actual
-        * @param string $message
-        * @param bool $isHtml
-        */
-       public static function assertNotTag( $matcher, $actual, $message = '', $isHtml = true ) {
-               // trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
-
-               self::assertFalse( self::tagMatch( $matcher, $actual, $isHtml ), $message );
-       }
-
        /**
         * Used as a marker to prevent wfResetOutputBuffers from breaking PHPUnit.
         * @return string
index 68b91bf..a8a8f4d 100644 (file)
@@ -27,6 +27,7 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                $options += [
                        'lang' => 'en',
                        'dir' => 'ltr',
+                       'skin' => 'vector',
                        'modules' => 'startup',
                        'only' => 'scripts',
                ];
@@ -35,7 +36,7 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                                'lang' => $options['lang'],
                                'modules' => $options['modules'],
                                'only' => $options['only'],
-                               'skin' => 'vector',
+                               'skin' => $options['skin'],
                                'target' => 'phpunit',
                ] );
                $ctx = $this->getMockBuilder( 'ResourceLoaderContext' )
index 074fab0..106ab68 100644 (file)
@@ -86,9 +86,12 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
 }
 
 if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
-       if ( $wgLocalisationCacheConf['storeClass'] === false
-                && ( $wgLocalisationCacheConf['store'] == 'db'
-                         || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) )
+       if (
+               $wgLocalisationCacheConf['storeClass'] === false
+               && (
+                       $wgLocalisationCacheConf['store'] == 'db'
+                       || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory )
+               )
        ) {
                $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
        }
diff --git a/tests/phpunit/data/helpers/WellProtectedClass.php b/tests/phpunit/data/helpers/WellProtectedClass.php
deleted file mode 100644 (file)
index f2b5a14..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-class WellProtectedParentClass {
-       private $privateParentProperty;
-
-       public function __construct() {
-               $this->privateParentProperty = 9000;
-       }
-
-       private function incrementPrivateParentPropertyValue() {
-               $this->privateParentProperty++;
-       }
-
-       public function getPrivateParentProperty() {
-               return $this->privateParentProperty;
-       }
-}
-
-class WellProtectedClass extends WellProtectedParentClass {
-       protected static $staticProperty = 'sp';
-       private static $staticPrivateProperty = 'spp';
-
-       protected $property;
-       private $privateProperty;
-
-       protected static function staticMethod() {
-               return 'sm';
-       }
-
-       private static function staticPrivateMethod() {
-               return 'spm';
-       }
-
-       public function __construct() {
-               parent::__construct();
-               $this->property = 1;
-               $this->privateProperty = 42;
-       }
-
-       protected function incrementPropertyValue() {
-               $this->property++;
-       }
-
-       private function incrementPrivatePropertyValue() {
-               $this->privateProperty++;
-       }
-
-       public function getProperty() {
-               return $this->property;
-       }
-
-       public function getPrivateProperty() {
-               return $this->privateProperty;
-       }
-
-       protected function whatSecondArg( $a, $b = false ) {
-               return $b;
-       }
-}
diff --git a/tests/phpunit/data/media/adobergb.jpg b/tests/phpunit/data/media/adobergb.jpg
new file mode 100644 (file)
index 0000000..470c2d6
Binary files /dev/null and b/tests/phpunit/data/media/adobergb.jpg differ
diff --git a/tests/phpunit/data/media/missingprofile.jpg b/tests/phpunit/data/media/missingprofile.jpg
new file mode 100644 (file)
index 0000000..4085f0a
Binary files /dev/null and b/tests/phpunit/data/media/missingprofile.jpg differ
index b965dc4..f10ced0 100644 (file)
Binary files a/tests/phpunit/data/media/srgb.jpg and b/tests/phpunit/data/media/srgb.jpg differ
index 12a8e09..63b687e 100644 (file)
Binary files a/tests/phpunit/data/media/tinyrgb.jpg and b/tests/phpunit/data/media/tinyrgb.jpg differ
diff --git a/tests/phpunit/data/resourceloader/oouiimagemodule/apex/icons.json b/tests/phpunit/data/resourceloader/oouiimagemodule/apex/icons.json
new file mode 100644 (file)
index 0000000..4fe3d81
--- /dev/null
@@ -0,0 +1,6 @@
+{
+       "prefix": "oo-ui-icon",
+       "images": {
+               "search": { "file": "images/icons/search.svg" }
+       }
+}
diff --git a/tests/phpunit/data/resourceloader/oouiimagemodule/apex/images/icons/search.svg b/tests/phpunit/data/resourceloader/oouiimagemodule/apex/images/icons/search.svg
new file mode 100644 (file)
index 0000000..6952997
--- /dev/null
@@ -0,0 +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">
+    <g id="search">
+        <path id="magnifying-glass-apex" d="M18.87 18.375l-3.987-3.99-.286-.17a5.774 5.774 0 0 0 1.082-3.372C15.67 7.616 13.06 5 9.84 5A5.843 5.843 0 0 0 4 10.844a5.84 5.84 0 0 0 5.842 5.842c1.26 0 2.423-.403 3.377-1.08l.16.286 3.99 3.987c.32.31.91.24 1.33-.18.41-.42.49-1.01.17-1.33zM9.837 14.56a3.72 3.72 0 0 1-3.718-3.717c0-2.05 1.67-3.72 3.72-3.72s3.72 1.668 3.72 3.72a3.722 3.722 0 0 1-3.72 3.718z"/>
+    </g>
+</svg>
diff --git a/tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/icons.json b/tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/icons.json
new file mode 100644 (file)
index 0000000..4fe3d81
--- /dev/null
@@ -0,0 +1,6 @@
+{
+       "prefix": "oo-ui-icon",
+       "images": {
+               "search": { "file": "images/icons/search.svg" }
+       }
+}
diff --git a/tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/images/icons/search.svg b/tests/phpunit/data/resourceloader/oouiimagemodule/mediawiki/images/icons/search.svg
new file mode 100644 (file)
index 0000000..40438ea
--- /dev/null
@@ -0,0 +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">
+    <g id="search">
+        <path id="magnifying-glass-mediawiki" d="M10.5 4a6.5 6.5 0 1 0 2.844 12.344L16 19c1.4 1.4 2.5 1.5 4 0l-4.438-4.438A6.426 6.426 0 0 0 17 10.5 6.5 6.5 0 0 0 10.5 4zm0 2a4.5 4.5 0 1 1 0 9 4.5 4.5 0 0 1 0-9z"/>
+    </g>
+</svg>
diff --git a/tests/phpunit/includes/AutopromoteTest.php b/tests/phpunit/includes/AutopromoteTest.php
new file mode 100644 (file)
index 0000000..785aa4e
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+
+class AutopromoteTest extends MediaWikiTestCase {
+       /**
+        * T157718: Verify Autopromote does not perform edit count lookup if requirement is 0 or invalid
+        *
+        * @see Autopromote::getAutopromoteGroups()
+        * @dataProvider provideEditCountsAndRequirements
+        * @param int $editCount edit count of user to be checked by Autopromote
+        * @param int $requirement edit count required to autopromote user
+        */
+       public function testEditCountLookupIsSkippedIfRequirementIsZero( $editCount, $requirement ) {
+               $this->setMwGlobals( [
+                       'wgAutopromote' => [
+                               'autoconfirmed' => [ APCOND_EDITCOUNT, $requirement ]
+                       ]
+               ] );
+
+               /** @var PHPUnit_Framework_MockObject_MockObject|User $userMock */
+               $userMock = $this->getMock( 'User', [ 'getEditCount' ] );
+               if ( $requirement > 0 ) {
+                       $userMock->expects( $this->once() )
+                               ->method( 'getEditCount' )
+                               ->willReturn( $editCount );
+               } else {
+                       $userMock->expects( $this->never() )
+                               ->method( 'getEditCount' );
+               }
+
+               $result = Autopromote::getAutopromoteGroups( $userMock );
+               if ( $editCount >= $requirement ) {
+                       $this->assertContains(
+                               'autoconfirmed',
+                               $result,
+                               'User must be promoted if they meet edit count requirement'
+                       );
+               } else {
+                       $this->assertNotContains(
+                               'autoconfirmed',
+                               $result,
+                               'User must not be promoted if they fail edit count requirement'
+                       );
+               }
+       }
+
+       public static function provideEditCountsAndRequirements() {
+               return [
+                       'user with sufficient editcount' => [ 100, 10 ],
+                       'user with insufficient editcount' => [ 4, 10 ],
+                       'edit count requirement set to 0' => [ 1, 0 ],
+               ];
+       }
+}
diff --git a/tests/phpunit/includes/CollationTest.php b/tests/phpunit/includes/CollationTest.php
deleted file mode 100644 (file)
index bf283aa..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-
-/**
- * Class CollationTest
- * @covers Collation
- * @covers IcuCollation
- * @covers IdentityCollation
- * @covers UppercaseCollation
- */
-class CollationTest extends MediaWikiLangTestCase {
-       protected function setUp() {
-               parent::setUp();
-               $this->checkPHPExtension( 'intl' );
-       }
-
-       /**
-        * Test to make sure, that if you
-        * have "X" and "XY", the binary
-        * sortkey also has "X" being a
-        * prefix of "XY". Our collation
-        * code makes this assumption.
-        *
-        * @param string $lang Language code for collator
-        * @param string $base Base string
-        * @param string $extended String containing base as a prefix.
-        *
-        * @dataProvider prefixDataProvider
-        */
-       public function testIsPrefix( $lang, $base, $extended ) {
-               $cp = Collator::create( $lang );
-               $cp->setStrength( Collator::PRIMARY );
-               $baseBin = $cp->getSortKey( $base );
-               // Remove sortkey terminator
-               $baseBin = rtrim( $baseBin, "\0" );
-               $extendedBin = $cp->getSortKey( $extended );
-               $this->assertStringStartsWith( $baseBin, $extendedBin, "$base is not a prefix of $extended" );
-       }
-
-       public static function prefixDataProvider() {
-               return [
-                       [ 'en', 'A', 'AA' ],
-                       [ 'en', 'A', 'AAA' ],
-                       [ 'en', 'Д', 'ДЂ' ],
-                       [ 'en', 'Д', 'ДA' ],
-                       // 'Ʒ' should expand to 'Z ' (note space).
-                       [ 'fi', 'Z', 'Ʒ' ],
-                       // 'Þ' should expand to 'th'
-                       [ 'sv', 't', 'Þ' ],
-                       // Javanese is a limited use alphabet, so should have 3 bytes
-                       // per character, so do some tests with it.
-                       [ 'en', 'ꦲ', 'ꦲꦤ' ],
-                       [ 'en', 'ꦲ', 'ꦲД' ],
-                       [ 'en', 'A', 'Aꦲ' ],
-               ];
-       }
-
-       /**
-        * Opposite of testIsPrefix
-        *
-        * @dataProvider notPrefixDataProvider
-        */
-       public function testNotIsPrefix( $lang, $base, $extended ) {
-               $cp = Collator::create( $lang );
-               $cp->setStrength( Collator::PRIMARY );
-               $baseBin = $cp->getSortKey( $base );
-               // Remove sortkey terminator
-               $baseBin = rtrim( $baseBin, "\0" );
-               $extendedBin = $cp->getSortKey( $extended );
-               $this->assertStringStartsNotWith( $baseBin, $extendedBin, "$base is a prefix of $extended" );
-       }
-
-       public static function notPrefixDataProvider() {
-               return [
-                       [ 'en', 'A', 'B' ],
-                       [ 'en', 'AC', 'ABC' ],
-                       [ 'en', 'Z', 'Ʒ' ],
-                       [ 'en', 'A', 'ꦲ' ],
-               ];
-       }
-
-       /**
-        * Test correct first letter is fetched.
-        *
-        * @param string $collation Collation name (aka uca-en)
-        * @param string $string String to get first letter of
-        * @param string $firstLetter Expected first letter.
-        *
-        * @dataProvider firstLetterProvider
-        */
-       public function testGetFirstLetter( $collation, $string, $firstLetter ) {
-               $col = Collation::factory( $collation );
-               $this->assertEquals( $firstLetter, $col->getFirstLetter( $string ) );
-       }
-
-       function firstLetterProvider() {
-               return [
-                       [ 'uppercase', 'Abc', 'A' ],
-                       [ 'uppercase', 'abc', 'A' ],
-                       [ 'identity', 'abc', 'a' ],
-                       [ 'uca-en', 'abc', 'A' ],
-                       [ 'uca-en', ' ', ' ' ],
-                       [ 'uca-en', 'Êveryone', 'E' ],
-                       [ 'uca-vi', 'Êveryone', 'Ê' ],
-                       // Make sure thorn is not a first letter.
-                       [ 'uca-sv', 'The', 'T' ],
-                       [ 'uca-sv', 'Å', 'Å' ],
-                       [ 'uca-hu', 'dzsdo', 'Dzs' ],
-                       [ 'uca-hu', 'dzdso', 'Dz' ],
-                       [ 'uca-hu', 'CSD', 'Cs' ],
-                       [ 'uca-root', 'CSD', 'C' ],
-                       [ 'uca-fi', 'Ǥ', 'G' ],
-                       [ 'uca-fi', 'Ŧ', 'T' ],
-                       [ 'uca-fi', 'Ʒ', 'Z' ],
-                       [ 'uca-fi', 'Ŋ', 'N' ],
-               ];
-       }
-}
index 4e95a30..a4e3bb9 100644 (file)
@@ -26,6 +26,7 @@ class ExtraParserTest extends MediaWikiTestCase {
                // FIXME: This test should pass without setting global content language
                $this->options = ParserOptions::newFromUserAndLang( new User, $contLang );
                $this->options->setTemplateCallback( [ __CLASS__, 'statelessFetchTemplate' ] );
+               $this->options->setWrapOutputClass( false );
                $this->parser = new Parser;
 
                MagicWord::clearCache();
@@ -40,6 +41,7 @@ class ExtraParserTest extends MediaWikiTestCase {
 
                $title = Title::newFromText( 'Unit test' );
                $options = ParserOptions::newFromUser( new User() );
+               $options->setWrapOutputClass( false );
                $this->assertEquals( "<p>$longLine</p>",
                        $this->parser->parse( $longLine, $title, $options )->getText() );
        }
index e3713ab..9fe694d 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\Session\SessionManager;
+
 class FauxRequestTest extends PHPUnit_Framework_TestCase {
        /**
         * @covers FauxRequest::__construct
@@ -17,6 +19,17 @@ class FauxRequestTest extends PHPUnit_Framework_TestCase {
                $req = new FauxRequest( [], false, 'x' );
        }
 
+       /**
+        * @covers FauxRequest::__construct
+        */
+       public function testConstructWithSession() {
+               $session = SessionManager::singleton()->getEmptySession( new FauxRequest( [] ) );
+               $this->assertInstanceOf(
+                       FauxRequest::class,
+                       new FauxRequest( [], false, $session )
+               );
+       }
+
        /**
         * @covers FauxRequest::getText
         */
index 1d48d08..33b6e2f 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 /**
+ * @group Database
  * @group GlobalFunctions
  */
 class GlobalTest extends MediaWikiTestCase {
@@ -101,22 +102,28 @@ class GlobalTest extends MediaWikiTestCase {
        }
 
        /**
+        * Intended to cover the relevant bits of ServiceWiring.php, as well as GlobalFunctions.php
         * @covers ::wfReadOnly
         */
        public function testReadOnlyEmpty() {
                global $wgReadOnly;
                $wgReadOnly = null;
 
+               MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode()->clearCache();
                $this->assertFalse( wfReadOnly() );
                $this->assertFalse( wfReadOnly() );
        }
 
        /**
+        * Intended to cover the relevant bits of ServiceWiring.php, as well as GlobalFunctions.php
         * @covers ::wfReadOnly
         */
        public function testReadOnlySet() {
                global $wgReadOnly, $wgReadOnlyFile;
 
+               $readOnlyMode = MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode();
+               $readOnlyMode->clearCache();
+
                $f = fopen( $wgReadOnlyFile, "wt" );
                fwrite( $f, 'Message' );
                fclose( $f );
@@ -126,12 +133,23 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertTrue( wfReadOnly() ); # Check cached
 
                unlink( $wgReadOnlyFile );
-               $wgReadOnly = null; # Clean cache
-
+               $readOnlyMode->clearCache();
                $this->assertFalse( wfReadOnly() );
                $this->assertFalse( wfReadOnly() );
        }
 
+       /**
+        * This behaviour could probably be deprecated. Several extensions rely on it as of 1.29.
+        * @covers ::wfReadOnlyReason
+        */
+       public function testReadOnlyGlobalChange() {
+               $this->assertFalse( wfReadOnlyReason() );
+               $this->setMwGlobals( [
+                       'wgReadOnly' => 'reason'
+               ] );
+               $this->assertSame( 'reason', wfReadOnlyReason() );
+       }
+
        public static function provideArrayToCGI() {
                return [
                        [ [], '' ], // empty
index b7249e5..115a8cf 100644 (file)
@@ -41,6 +41,9 @@ class HtmlTest extends MediaWikiTestCase {
 
        /**
         * @covers Html::element
+        * @covers Html::rawElement
+        * @covers Html::openElement
+        * @covers Html::closeElement
         */
        public function testElementBasics() {
                $this->assertEquals(
@@ -302,6 +305,7 @@ class HtmlTest extends MediaWikiTestCase {
 
        /**
         * @covers Html::namespaceSelector
+        * @covers Html::namespaceSelectorOptions
         */
        public function testNamespaceSelector() {
                $this->assertEquals(
index 092d57b..5977652 100644 (file)
@@ -161,7 +161,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testExists() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
@@ -223,7 +223,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testGetCanonicalNamespaces() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
@@ -234,7 +234,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
                public function testGetCanonicalName() {
                        // Remove the following lines when you implement this test.
                        $this->markTestIncomplete(
-                         'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                               'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                        );
                }
        */
@@ -245,7 +245,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testGetCanonicalIndex() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
@@ -257,7 +257,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testGetValidNamespaces() {
                // Remove the following lines when you implement this test.
                $this->markTestIncomplete(
-                 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+                       'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
                );
        }
        */
index 4bca478..c1a46fe 100644 (file)
@@ -23,7 +23,7 @@ class MWTimestampTest extends MediaWikiLangTestCase {
                $expectedOutput, // The expected output
                $desc // Description
        ) {
-               $user = $this->getMock( 'User' );
+               $user = $this->createMock( 'User' );
                $user->expects( $this->any() )
                        ->method( 'getOption' )
                        ->with( 'timecorrection' )
@@ -156,7 +156,7 @@ class MWTimestampTest extends MediaWikiLangTestCase {
                $expectedOutput, // The expected output
                $desc // Description
        ) {
-               $user = $this->getMock( 'User' );
+               $user = $this->createMock( 'User' );
                $user->expects( $this->any() )
                        ->method( 'getOption' )
                        ->with( 'timecorrection' )
index cc95e38..a72662f 100644 (file)
@@ -71,7 +71,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                $newServices = $this->newMediaWikiServices();
                $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
 
-               $service1 = $this->getMock( SalvageableService::class );
+               $service1 = $this->createMock( SalvageableService::class );
                $service1->expects( $this->never() )
                        ->method( 'salvage' );
 
@@ -104,11 +104,11 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                $newServices = $this->newMediaWikiServices();
                $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
 
-               $service1 = $this->getMock( SalvageableService::class );
+               $service1 = $this->createMock( SalvageableService::class );
                $service1->expects( $this->never() )
                        ->method( 'salvage' );
 
-               $service2 = $this->getMock( SalvageableService::class );
+               $service2 = $this->createMock( SalvageableService::class );
                $service2->expects( $this->once() )
                        ->method( 'salvage' )
                        ->with( $service1 );
@@ -178,11 +178,11 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                $newServices = $this->newMediaWikiServices();
                $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
 
-               $service1 = $this->getMock( DestructibleService::class );
+               $service1 = $this->createMock( DestructibleService::class );
                $service1->expects( $this->once() )
                        ->method( 'destroy' );
 
-               $service2 = $this->getMock( DestructibleService::class );
+               $service2 = $this->createMock( DestructibleService::class );
                $service2->expects( $this->never() )
                        ->method( 'destroy' );
 
@@ -219,7 +219,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'Test',
                        function() use ( &$serviceCounter ) {
                                $serviceCounter++;
-                               $service = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+                               $service = $this->createMock( 'MediaWiki\Services\DestructibleService' );
                                $service->expects( $this->once() )->method( 'destroy' );
                                return $service;
                        }
@@ -248,7 +248,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                $services->defineService(
                        'Test',
                        function() {
-                               $service = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+                               $service = $this->createMock( 'MediaWiki\Services\DestructibleService' );
                                $service->expects( $this->never() )->method( 'destroy' );
                                return $service;
                        }
index 2694b85..912bffe 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 class MessageTest extends MediaWikiLangTestCase {
 
        protected function setUp() {
@@ -315,14 +317,14 @@ class MessageTest extends MediaWikiLangTestCase {
                return [
                        [ '<span>foo</span>', 'parse', '<span>foo</span>', '<span>foo</span>' ],
                        [ '<span>foo</span>', 'escaped', '&lt;span&gt;foo&lt;/span&gt;',
-                         '<span>foo</span>' ],
+                               '<span>foo</span>' ],
                        [ '<span>foo</span>', 'plain', '<span>foo</span>', '<span>foo</span>' ],
                        [ '<script>alert(1)</script>', 'parse', '&lt;script&gt;alert(1)&lt;/script&gt;',
                                '&lt;script&gt;alert(1)&lt;/script&gt;' ],
                        [ '<script>alert(1)</script>', 'escaped', '&lt;script&gt;alert(1)&lt;/script&gt;',
                                '&lt;script&gt;alert(1)&lt;/script&gt;' ],
                        [ '<script>alert(1)</script>', 'plain', '<script>alert(1)</script>',
-                         '&lt;script&gt;alert(1)&lt;/script&gt;' ],
+                               '&lt;script&gt;alert(1)&lt;/script&gt;' ],
                ];
        }
 
@@ -394,6 +396,22 @@ class MessageTest extends MediaWikiLangTestCase {
                $this->assertSame( 'example &amp;', $msg->escaped() );
        }
 
+       public function testRawHtmlInMsg() {
+               global $wgParserConf;
+               $this->setMwGlobals( 'wgRawHtml', true );
+               // We have to reset the core hook registration.
+               // to register the html hook
+               MessageCache::destroyInstance();
+               $this->setMwGlobals( 'wgParser',
+                       ObjectFactory::constructClassInstance( $wgParserConf['class'], [ $wgParserConf ] )
+               );
+
+               $msg = new RawMessage( '<html><script>alert("xss")</script></html>' );
+               $txt = '<span class="error">&lt;html&gt; tags cannot be' .
+                       ' used outside of normal pages.</span>';
+               $this->assertSame( $txt, $msg->parse() );
+       }
+
        /**
         * @covers Message::params
         * @covers Message::toString
index 50f851c..32fa468 100644 (file)
@@ -1,9 +1,12 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  *
  * @author Matthew Flaschen
  *
+ * @group Database
  * @group Output
  *
  * @todo factor tests in this class into providers and test methods
@@ -341,6 +344,88 @@ class OutputPageTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedHtml, $actualHtml );
        }
 
+       public static function provideBuildExemptModules() {
+               return [
+                       'empty' => [
+                               'exemptStyleModules' => [],
+                               '<meta name="ResourceLoaderDynamicStyles" content=""/>',
+                       ],
+                       'empty sets' => [
+                               'exemptStyleModules' => [ 'site' => [], 'noscript' => [], 'private' => [], 'user' => [] ],
+                               '<meta name="ResourceLoaderDynamicStyles" content=""/>',
+                       ],
+                       // @codingStandardsIgnoreStart Generic.Files.LineLength
+                       'default logged-out' => [
+                               'exemptStyleModules' => [ 'site' => [ 'site.styles' ] ],
+                               '<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=fallback"/>',
+                       ],
+                       'default logged-in' => [
+                               'exemptStyleModules' => [ 'site' => [ 'site.styles' ], 'user' => [ 'user.styles' ] ],
+                               '<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=fallback"/>' . "\n" .
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=user.styles&amp;only=styles&amp;skin=fallback&amp;version=1e9z0ox"/>',
+                       ],
+                       'custom modules' => [
+                               'exemptStyleModules' => [
+                                       'site' => [ 'site.styles', 'example.site.a', 'example.site.b' ],
+                                       'user' => [ 'user.styles', 'example.user' ],
+                               ],
+                               '<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=example.site.a%2Cb&amp;only=styles&amp;skin=fallback"/>' . "\n" .
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=fallback"/>' . "\n" .
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=example.user&amp;only=styles&amp;skin=fallback&amp;version=0a56zyi"/>' . "\n" .
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=user.styles&amp;only=styles&amp;skin=fallback&amp;version=1e9z0ox"/>',
+                       ],
+                       // @codingStandardsIgnoreEnd Generic.Files.LineLength
+               ];
+       }
+
+       /**
+        * @dataProvider provideBuildExemptModules
+        * @covers OutputPage::buildExemptModules
+        */
+       public function testBuildExemptModules( array $exemptStyleModules, $expect ) {
+               $this->setMwGlobals( [
+                       'wgResourceLoaderDebug' => false,
+                       'wgLoadScript' => '/w/load.php',
+                       // Stub wgCacheEpoch as it influences getVersionHash used for the
+                       // urls in the expected HTML
+                       'wgCacheEpoch' => '20140101000000',
+               ] );
+
+               // Set up stubs
+               $ctx = new RequestContext();
+               $ctx->setSkin( SkinFactory::getDefaultInstance()->makeSkin( 'fallback' ) );
+               $ctx->setLanguage( 'en' );
+               $outputPage = $this->getMockBuilder( 'OutputPage' )
+                       ->setConstructorArgs( [ $ctx ] )
+                       ->setMethods( [ 'isUserCssPreview', 'buildCssLinksArray' ] )
+                       ->getMock();
+               $outputPage->expects( $this->any() )
+                       ->method( 'isUserCssPreview' )
+                       ->willReturn( false );
+               $outputPage->expects( $this->any() )
+                       ->method( 'buildCssLinksArray' )
+                       ->willReturn( [] );
+               $rl = $outputPage->getResourceLoader();
+               $rl->setMessageBlobStore( new NullMessageBlobStore() );
+
+               // Register custom modules
+               $rl->register( [
+                       'example.site.a' => new ResourceLoaderTestModule( [ 'group' => 'site' ] ),
+                       'example.site.b' => new ResourceLoaderTestModule( [ 'group' => 'site' ] ),
+                       'example.user' => new ResourceLoaderTestModule( [ 'group' => 'user' ] ),
+               ] );
+
+               $outputPage = TestingAccessWrapper::newFromObject( $outputPage );
+               $outputPage->rlExemptStyleModules = $exemptStyleModules;
+               $this->assertEquals(
+                       $expect,
+                       strval( $outputPage->buildExemptModules() )
+               );
+       }
+
        /**
         * @dataProvider provideVaryHeaders
         * @covers OutputPage::addVaryHeader
@@ -471,13 +556,110 @@ class OutputPageTest extends MediaWikiTestCase {
                $this->assertEquals( [ 0 => 'Test' ], $outputPage->getCategories( 'hidden' ) );
        }
 
+       /**
+        * @dataProvider provideLinkHeaders
+        * @covers OutputPage::addLinkHeader
+        * @covers OutputPage::getLinkHeader
+        */
+       public function testLinkHeaders( $headers, $result ) {
+               $outputPage = $this->newInstance();
+
+               foreach ( $headers as $header ) {
+                       $outputPage->addLinkHeader( $header );
+               }
+
+               $this->assertEquals( $result, $outputPage->getLinkHeader() );
+       }
+
+       public function provideLinkHeaders() {
+               return [
+                       [
+                               [],
+                               false
+                       ],
+                       [
+                               [ '<https://foo/bar.jpg>;rel=preload;as=image' ],
+                               'Link: <https://foo/bar.jpg>;rel=preload;as=image',
+                       ],
+                       [
+                               [ '<https://foo/bar.jpg>;rel=preload;as=image','<https://foo/baz.jpg>;rel=preload;as=image' ],
+                               'Link: <https://foo/bar.jpg>;rel=preload;as=image,<https://foo/baz.jpg>;rel=preload;as=image',
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider providePreloadLinkHeaders
+        * @covers OutputPage::addLogoPreloadLinkHeaders
+        * @covers ResourceLoaderSkinModule::getLogo
+        */
+       public function testPreloadLinkHeaders( $config, $result, $baseDir = null ) {
+               if ( $baseDir ) {
+                       $this->setMwGlobals( 'IP', $baseDir );
+               }
+               $out = TestingAccessWrapper::newFromObject( $this->newInstance( $config ) );
+               $out->addLogoPreloadLinkHeaders();
+
+               $this->assertEquals( $result, $out->getLinkHeader() );
+       }
+
+       public function providePreloadLinkHeaders() {
+               return [
+                       [
+                               [
+                                       'ResourceBasePath' => '/w',
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => [
+                                               '1.5x' => '/img/one-point-five.png',
+                                               '2x' => '/img/two-x.png',
+                                       ],
+                               ],
+                               'Link: </img/default.png>;rel=preload;as=image;media=' .
+                               'not all and (min-resolution: 1.5dppx),' .
+                               '</img/one-point-five.png>;rel=preload;as=image;media=' .
+                               '(min-resolution: 1.5dppx) and (max-resolution: 1.999999dppx),' .
+                               '</img/two-x.png>;rel=preload;as=image;media=(min-resolution: 2dppx)'
+                       ],
+                       [
+                               [
+                                       'ResourceBasePath' => '/w',
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => false,
+                               ],
+                               'Link: </img/default.png>;rel=preload;as=image'
+                       ],
+                       [
+                               [
+                                       'ResourceBasePath' => '/w',
+                                       'Logo' => '/img/default.png',
+                                       'LogoHD' => [
+                                               '2x' => '/img/two-x.png',
+                                       ],
+                               ],
+                               'Link: </img/default.png>;rel=preload;as=image;media=' .
+                               'not all and (min-resolution: 2dppx),' .
+                               '</img/two-x.png>;rel=preload;as=image;media=(min-resolution: 2dppx)'
+                       ],
+                       [
+                               [
+                                       'ResourceBasePath' => '/w',
+                                       'Logo' => '/w/test.jpg',
+                                       'LogoHD' => false,
+                                       'UploadPath' => '/w/images',
+                               ],
+                               'Link: </w/test.jpg?edcf2>;rel=preload;as=image',
+                               'baseDir' => dirname( __DIR__ ) . '/data/media',
+                       ],
+               ];
+       }
+
        /**
         * @return OutputPage
         */
-       private function newInstance() {
+       private function newInstance( $config = [] ) {
                $context = new RequestContext();
 
-               $context->setConfig( new HashConfig( [
+               $context->setConfig( new HashConfig( $config + [
                        'AppleTouchIcon' => false,
                        'DisableLangConversion' => true,
                        'EnableAPI' => false,
index cf2e120..a6cf14a 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group Search
  * @group Database
@@ -207,6 +210,11 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
 
                $namespaces = isset( $case['namespaces'] ) ? $case['namespaces'] : [];
 
+               if ( wfGetDB( DB_REPLICA )->getType() === 'postgres' ) {
+                       // Postgres will sort lexicographically on utf8 code units (" " before "/")
+                       sort( $case['results'], SORT_STRING );
+               }
+
                $searcher = new StringPrefixSearch;
                $results = $searcher->search( $case['query'], 3, $namespaces );
                $this->assertEquals(
@@ -229,6 +237,11 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
                $searcher = new StringPrefixSearch;
                $results = $searcher->search( $case['query'], 3, $namespaces, 1 );
 
+               if ( wfGetDB( DB_REPLICA )->getType() === 'postgres' ) {
+                       // Postgres will sort lexicographically on utf8 code units (" " before "/")
+                       sort( $case['results'], SORT_STRING );
+               }
+
                // We don't expect the first result when offsetting
                array_shift( $case['results'] );
                // And sometimes we expect a different last result
diff --git a/tests/phpunit/includes/ReadOnlyModeTest.php b/tests/phpunit/includes/ReadOnlyModeTest.php
new file mode 100644 (file)
index 0000000..9c02bbd
--- /dev/null
@@ -0,0 +1,196 @@
+<?php
+
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @group Database
+ *
+ * @covers ReadOnlyMode
+ * @covers ConfiguredReadOnlyMode
+ */
+class ReadOnlyModeTest extends MediaWikiTestCase {
+       public function provider() {
+               $rawTests = [
+                       'None of anything' => [
+                               'confMessage' => null,
+                               'hasFileName' => false,
+                               'fileContents' => false,
+                               'lbMessage' => false,
+                               'expectedState' => false,
+                               'expectedMessage' => false,
+                               'expectedConfState' => false,
+                               'expectedConfMessage' => false
+                       ],
+                       'File missing' => [
+                               'confMessage' => null,
+                               'hasFileName' => true,
+                               'fileContents' => false,
+                               'lbMessage' => false,
+                               'expectedState' => false,
+                               'expectedMessage' => false,
+                               'expectedConfState' => false,
+                               'expectedConfMessage' => false
+                       ],
+                       'File empty' => [
+                               'confMessage' => null,
+                               'hasFileName' => true,
+                               'fileContents' => '',
+                               'lbMessage' => false,
+                               'expectedState' => false,
+                               'expectedMessage' => false,
+                               'expectedConfState' => false,
+                               'expectedConfMessage' => false
+                       ],
+                       'File has message' => [
+                               'confMessage' => null,
+                               'hasFileName' => true,
+                               'fileContents' => 'Message',
+                               'lbMessage' => false,
+                               'expectedState' => true,
+                               'expectedMessage' => 'Message',
+                               'expectedConfState' => true,
+                               'expectedConfMessage' => 'Message',
+                       ],
+                       'Conf has message' => [
+                               'confMessage' => 'Message',
+                               'hasFileName' => false,
+                               'fileContents' => false,
+                               'lbMessage' => false,
+                               'expectedState' => true,
+                               'expectedMessage' => 'Message',
+                               'expectedConfState' => true,
+                               'expectedConfMessage' => 'Message'
+                       ],
+                       "Conf=false means don't check the file" => [
+                               'confMessage' => false,
+                               'hasFileName' => true,
+                               'fileContents' => 'Message',
+                               'lbMessage' => false,
+                               'expectedState' => false,
+                               'expectedMessage' => false,
+                               'expectedConfState' => false,
+                               'expectedConfMessage' => false,
+                       ],
+                       'LB has message' => [
+                               'confMessage' => null,
+                               'hasFileName' => false,
+                               'fileContents' => false,
+                               'lbMessage' => 'Message',
+                               'expectedState' => true,
+                               'expectedMessage' => 'Message',
+                               'expectedConfState' => false,
+                               'expectedConfMessage' => false
+                       ],
+                       'All three have a message: conf wins' => [
+                               'confMessage' => 'conf',
+                               'hasFileName' => true,
+                               'fileContents' => 'file',
+                               'lbMessage' => 'lb',
+                               'expectedState' => true,
+                               'expectedMessage' => 'conf',
+                               'expectedConfState' => true,
+                               'expectedConfMessage' => 'conf'
+                       ]
+               ];
+               $cookedTests = [];
+               foreach ( $rawTests as $desc => $test ) {
+                       $cookedTests[$desc] = [ $test ];
+               }
+               return $cookedTests;
+       }
+
+       private function createMode( $params, $makeLB ) {
+               $config = new HashConfig( [
+                       'ReadOnly' => $params['confMessage'],
+                       'ReadOnlyFile' => $this->createFile( $params ),
+               ] );
+
+               $rom = new ConfiguredReadOnlyMode( $config );
+
+               if ( $makeLB ) {
+                       $lb = $this->createLB( $params );
+                       $rom = new ReadOnlyMode( $rom, $lb );
+               }
+
+               return $rom;
+       }
+
+       private function createLB( $params ) {
+               $lb = $this->getMockBuilder( \Wikimedia\Rdbms\LoadBalancer::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $lb->expects( $this->any() )->method( 'getReadOnlyReason' )
+                       ->willReturn( $params['lbMessage'] );
+               return $lb;
+       }
+
+       private function createFile( $params ) {
+               if ( $params['hasFileName'] ) {
+                       $fileName = $this->getNewTempFile();
+
+                       if ( $params['fileContents'] === false ) {
+                               unlink( $fileName );
+                       } else {
+                               file_put_contents( $fileName, $params['fileContents'] );
+                       }
+               } else {
+                       $fileName = null;
+               }
+               return $fileName;
+       }
+
+       /**
+        * @dataProvider provider
+        */
+       public function testWithLB( $params ) {
+               $rom = $this->createMode( $params, true );
+               $this->assertSame( $params['expectedMessage'], $rom->getReason() );
+               $this->assertSame( $params['expectedState'], $rom->isReadOnly() );
+       }
+
+       /**
+        * @dataProvider provider
+        */
+       public function testWithoutLB( $params ) {
+               $cro = $this->createMode( $params, false );
+               $this->assertSame( $params['expectedConfMessage'], $cro->getReason() );
+               $this->assertSame( $params['expectedConfState'], $cro->isReadOnly() );
+       }
+
+       public function testSetReadOnlyReason() {
+               $rom = $this->createMode(
+                       [
+                               'confMessage' => 'conf',
+                               'hasFileName' => false,
+                               'fileContents' => false,
+                               'lbMessage' => 'lb'
+                       ],
+                       true );
+               $rom->setReason( 'override' );
+               $this->assertSame( 'override', $rom->getReason() );
+       }
+
+       /**
+        * @covers ReadOnlyMode::clearCache
+        * @covers ConfiguredReadOnlyMode::clearCache
+        */
+       public function testClearCache() {
+               $fileName = $this->getNewTempFile();
+               unlink( $fileName );
+               $config = new HashConfig( [
+                       'ReadOnly' => null,
+                       'ReadOnlyFile' => $fileName,
+               ] );
+               $cro = new ConfiguredReadOnlyMode( $config );
+               $lb = $this->createLB( [ 'lbMessage' => false ] );
+               $rom = new ReadOnlyMode( $cro, $lb );
+
+               $this->assertSame( false, $rom->getReason(), 'initial' );
+
+               file_put_contents( $fileName, 'file' );
+               $this->assertSame( false, $rom->getReason(), 'stale' );
+
+               $rom->clearCache();
+               $this->assertSame( 'file', $rom->getReason(), 'fresh' );
+       }
+}
index f22e123..617e39c 100644 (file)
@@ -326,7 +326,8 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
        public function testDisableService() {
                $services = $this->newServiceContainer( [ 'Foo' ] );
 
-               $destructible = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+               $destructible = $this->getMockBuilder( 'MediaWiki\Services\DestructibleService' )
+                       ->getMock();
                $destructible->expects( $this->once() )
                        ->method( 'destroy' );
 
@@ -384,7 +385,8 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
        public function testDestroy() {
                $services = $this->newServiceContainer();
 
-               $destructible = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+               $destructible = $this->getMockBuilder( 'MediaWiki\Services\DestructibleService' )
+                       ->getMock();
                $destructible->expects( $this->once() )
                        ->method( 'destroy' );
 
index 152602a..ab23136 100644 (file)
@@ -8,6 +8,9 @@ require __DIR__ . "/../../../maintenance/runJobs.php";
 class TemplateCategoriesTest extends MediaWikiLangTestCase {
 
        /**
+        * Broken per T165099.
+        *
+        * @group Broken
         * @covers Title::getParentCategories
         */
        public function testTemplateCategories() {
index 469f45a..2bd9086 100644 (file)
@@ -51,6 +51,43 @@ class TemplateParserTest extends MediaWikiTestCase {
                                false,
                                'UnexpectedValueException'
                        ],
+                       [
+                               "\000../foobar",
+                               [],
+                               false,
+                               'UnexpectedValueException'
+                       ],
+                       [
+                               '/',
+                               [],
+                               false,
+                               'UnexpectedValueException'
+                       ],
+                       [
+                               // Allegedly this can strip ext in windows.
+                               'baz<',
+                               [],
+                               false,
+                               'UnexpectedValueException'
+                       ],
+                       [
+                               '\\foo',
+                               [],
+                               false,
+                               'UnexpectedValueException'
+                       ],
+                       [
+                               'C:\bar',
+                               [],
+                               false,
+                               'UnexpectedValueException'
+                       ],
+                       [
+                               "foo\000bar",
+                               [],
+                               false,
+                               'UnexpectedValueException'
+                       ],
                        [
                                'nonexistenttemplate',
                                [],
diff --git a/tests/phpunit/includes/TestingAccessWrapper.php b/tests/phpunit/includes/TestingAccessWrapper.php
deleted file mode 100644 (file)
index 7332e15..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-/**
- * Circumvent access restrictions on object internals
- *
- * This can be helpful for writing tests that can probe object internals,
- * without having to modify the class under test to accomodate.
- *
- * Wrap an object with private methods as follows:
- *    $title = TestingAccessWrapper::newFromObject( Title::newFromDBkey( $key ) );
- *
- * You can access private and protected instance methods and variables:
- *    $formatter = $title->getTitleFormatter();
- *
- * TODO:
- * - Organize other helper classes in tests/testHelpers.inc into a directory.
- */
-class TestingAccessWrapper {
-       /** @var mixed The object, or the class name for static-only access */
-       public $object;
-
-       /**
-        * Return the same object, without access restrictions.
-        */
-       public static function newFromObject( $object ) {
-               if ( !is_object( $object ) ) {
-                       throw new InvalidArgumentException( __METHOD__ . ' must be called with an object' );
-               }
-               $wrapper = new TestingAccessWrapper();
-               $wrapper->object = $object;
-               return $wrapper;
-       }
-
-       /**
-        * Allow access to non-public static methods and properties of the class.
-        * Use non-static access,
-        */
-       public static function newFromClass( $className ) {
-               if ( !is_string( $className ) ) {
-                       throw new InvalidArgumentException( __METHOD__ . ' must be called with a class name' );
-               }
-               $wrapper = new TestingAccessWrapper();
-               $wrapper->object = $className;
-               return $wrapper;
-       }
-
-       public function __call( $method, $args ) {
-               $methodReflection = $this->getMethod( $method );
-
-               if ( $this->isStatic() && !$methodReflection->isStatic() ) {
-                       throw new DomainException( __METHOD__ . ': Cannot call non-static when wrapping static class' );
-               }
-
-               return $methodReflection->invokeArgs( $methodReflection->isStatic() ? null : $this->object,
-                       $args );
-       }
-
-       public function __set( $name, $value ) {
-               $propertyReflection = $this->getProperty( $name );
-
-               if ( $this->isStatic() && !$propertyReflection->isStatic() ) {
-                       throw new DomainException( __METHOD__ . ': Cannot set property when wrapping static class' );
-               }
-
-               $propertyReflection->setValue( $this->object, $value );
-       }
-
-       public function __get( $name ) {
-               $propertyReflection = $this->getProperty( $name );
-
-               if ( $this->isStatic() && !$propertyReflection->isStatic() ) {
-                       throw new DomainException( __METHOD__ . ': Cannot get property when wrapping static class' );
-               }
-
-               return $propertyReflection->getValue( $this->object );
-       }
-
-       private function isStatic() {
-               return is_string( $this->object );
-       }
-
-       /**
-        * Return a property and make it accessible.
-        * @param string $name
-        * @return ReflectionMethod
-        */
-       private function getMethod( $name ) {
-               $classReflection = new ReflectionClass( $this->object );
-               $methodReflection = $classReflection->getMethod( $name );
-               $methodReflection->setAccessible( true );
-               return $methodReflection;
-       }
-
-       /**
-        * Return a property and make it accessible.
-        *
-        * ReflectionClass::getProperty() fails if the private property is defined
-        * in a parent class. This works more like ReflectionClass::getMethod().
-        *
-        * @param string $name
-        * @return ReflectionProperty
-        * @throws ReflectionException
-        */
-       private function getProperty( $name ) {
-               $classReflection = new ReflectionClass( $this->object );
-               try {
-                       $propertyReflection = $classReflection->getProperty( $name );
-               } catch ( ReflectionException $ex ) {
-                       while ( true ) {
-                               $classReflection = $classReflection->getParentClass();
-                               if ( !$classReflection ) {
-                                       throw $ex;
-                               }
-                               try {
-                                       $propertyReflection = $classReflection->getProperty( $name );
-                               } catch ( ReflectionException $ex2 ) {
-                                       continue;
-                               }
-                               if ( $propertyReflection->isPrivate() ) {
-                                       break;
-                               } else {
-                                       throw $ex;
-                               }
-                       }
-               }
-               $propertyReflection->setAccessible( true );
-               return $propertyReflection;
-       }
-}
diff --git a/tests/phpunit/includes/TestingAccessWrapperTest.php b/tests/phpunit/includes/TestingAccessWrapperTest.php
deleted file mode 100644 (file)
index 23eb023..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-
-class TestingAccessWrapperTest extends MediaWikiTestCase {
-       protected $raw;
-       protected $wrapped;
-       protected $wrappedStatic;
-
-       function setUp() {
-               parent::setUp();
-
-               require_once __DIR__ . '/../data/helpers/WellProtectedClass.php';
-               $this->raw = new WellProtectedClass();
-               $this->wrapped = TestingAccessWrapper::newFromObject( $this->raw );
-               $this->wrappedStatic = TestingAccessWrapper::newFromClass( 'WellProtectedClass' );
-       }
-
-       /**
-        * @expectedException InvalidArgumentException
-        */
-       function testConstructorException() {
-               TestingAccessWrapper::newFromObject( 'WellProtectedClass' );
-       }
-
-       /**
-        * @expectedException InvalidArgumentException
-        */
-       function testStaticConstructorException() {
-               TestingAccessWrapper::newFromClass( new WellProtectedClass() );
-       }
-
-       function testGetProperty() {
-               $this->assertSame( 1, $this->wrapped->property );
-               $this->assertSame( 42, $this->wrapped->privateProperty );
-               $this->assertSame( 9000, $this->wrapped->privateParentProperty );
-               $this->assertSame( 'sp', $this->wrapped->staticProperty );
-               $this->assertSame( 'spp', $this->wrapped->staticPrivateProperty );
-               $this->assertSame( 'sp', $this->wrappedStatic->staticProperty );
-               $this->assertSame( 'spp', $this->wrappedStatic->staticPrivateProperty );
-       }
-
-       /**
-        * @expectedException DomainException
-        */
-       function testGetException() {
-               $this->wrappedStatic->property;
-       }
-
-       function testSetProperty() {
-               $this->wrapped->property = 10;
-               $this->assertSame( 10, $this->wrapped->property );
-               $this->assertSame( 10, $this->raw->getProperty() );
-
-               $this->wrapped->privateProperty = 11;
-               $this->assertSame( 11, $this->wrapped->privateProperty );
-               $this->assertSame( 11, $this->raw->getPrivateProperty() );
-
-               $this->wrapped->privateParentProperty = 12;
-               $this->assertSame( 12, $this->wrapped->privateParentProperty );
-               $this->assertSame( 12, $this->raw->getPrivateParentProperty() );
-
-               $this->wrapped->staticProperty = 'x';
-               $this->assertSame( 'x', $this->wrapped->staticProperty );
-               $this->assertSame( 'x', $this->wrappedStatic->staticProperty );
-
-               $this->wrapped->staticPrivateProperty = 'y';
-               $this->assertSame( 'y', $this->wrapped->staticPrivateProperty );
-               $this->assertSame( 'y', $this->wrappedStatic->staticPrivateProperty );
-
-               $this->wrappedStatic->staticProperty = 'X';
-               $this->assertSame( 'X', $this->wrapped->staticProperty );
-               $this->assertSame( 'X', $this->wrappedStatic->staticProperty );
-
-               $this->wrappedStatic->staticPrivateProperty = 'Y';
-               $this->assertSame( 'Y', $this->wrapped->staticPrivateProperty );
-               $this->assertSame( 'Y', $this->wrappedStatic->staticPrivateProperty );
-
-               // don't rely on PHPUnit to restore static properties
-               $this->wrapped->staticProperty = 'sp';
-               $this->wrapped->staticPrivateProperty = 'spp';
-       }
-
-       /**
-        * @expectedException DomainException
-        */
-       function testSetException() {
-               $this->wrappedStatic->property = 1;
-       }
-
-       function testCallMethod() {
-               $this->wrapped->incrementPropertyValue();
-               $this->assertSame( 2, $this->wrapped->property );
-               $this->assertSame( 2, $this->raw->getProperty() );
-
-               $this->wrapped->incrementPrivatePropertyValue();
-               $this->assertSame( 43, $this->wrapped->privateProperty );
-               $this->assertSame( 43, $this->raw->getPrivateProperty() );
-
-               $this->wrapped->incrementPrivateParentPropertyValue();
-               $this->assertSame( 9001, $this->wrapped->privateParentProperty );
-               $this->assertSame( 9001, $this->raw->getPrivateParentProperty() );
-
-               $this->assertSame( 'sm', $this->wrapped->staticMethod() );
-               $this->assertSame( 'spm', $this->wrapped->staticPrivateMethod() );
-               $this->assertSame( 'sm', $this->wrappedStatic->staticMethod() );
-               $this->assertSame( 'spm', $this->wrappedStatic->staticPrivateMethod() );
-       }
-
-       function testCallMethodTwoArgs() {
-               $this->assertSame( 'two', $this->wrapped->whatSecondArg( 'one', 'two' ) );
-       }
-
-       /**
-        * @expectedException DomainException
-        */
-       function testCallMethodException() {
-               $this->wrappedStatic->incrementPropertyValue();
-       }
-
-}
index 9121178..e20cc7b 100644 (file)
@@ -518,11 +518,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->getUserPermissionsErrors( 'bogus',
                                $this->user ) );
 
-               $this->setUserPerm( 'editusercssjs' );
-               $this->assertEquals( [ [ 'badaccess-group0' ] ],
-                       $this->title->getUserPermissionsErrors( 'bogus',
-                               $this->user ) );
-
                $this->setUserPerm( [ 'edituserjs', 'editusercss' ] );
                $this->assertEquals( [ [ 'badaccess-group0' ] ],
                        $this->title->getUserPermissionsErrors( 'bogus',
index bdec0a5..872c580 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @covers WatchedItemQueryService
  */
@@ -66,7 +68,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
         * @return PHPUnit_Framework_MockObject_MockObject|User
         */
        private function getMockNonAnonUserWithId( $id ) {
-               $mock = $this->getMock( User::class );
+               $mock = $this->getMockBuilder( User::class )->getMock();
                $mock->expects( $this->any() )
                        ->method( 'isAnon' )
                        ->will( $this->returnValue( false ) );
@@ -142,7 +144,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
        }
 
        private function getMockAnonUser() {
-               $mock = $this->getMock( User::class );
+               $mock = $this->getMockBuilder( User::class )->getMock();
                $mock->expects( $this->any() )
                        ->method( 'isAnon' )
                        ->will( $this->returnValue( true ) );
index 0bd0bcc..f31028d 100644 (file)
@@ -13,7 +13,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
         * @return PHPUnit_Framework_MockObject_MockObject|IDatabase
         */
        private function getMockDb() {
-               return $this->getMock( IDatabase::class );
+               return $this->createMock( IDatabase::class );
        }
 
        /**
@@ -21,8 +21,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
         */
        private function getMockLoadBalancer(
                $mockDb,
-               $expectedConnectionType = null,
-               $readOnlyReason = false
+               $expectedConnectionType = null
        ) {
                $mock = $this->getMockBuilder( LoadBalancer::class )
                        ->disableOriginalConstructor()
@@ -37,9 +36,6 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                                ->method( 'getConnectionRef' )
                                ->will( $this->returnValue( $mockDb ) );
                }
-               $mock->expects( $this->any() )
-                       ->method( 'getReadOnlyReason' )
-                       ->will( $this->returnValue( $readOnlyReason ) );
                return $mock;
        }
 
@@ -58,12 +54,25 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                return $mock;
        }
 
+       /**
+        * @return PHPUnit_Framework_MockObject_MockObject|ReadOnlyMode
+        */
+       private function getMockReadOnlyMode( $readOnly = false ) {
+               $mock = $this->getMockBuilder( ReadOnlyMode::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $mock->expects( $this->any() )
+                       ->method( 'isReadOnly' )
+                       ->will( $this->returnValue( $readOnly ) );
+               return $mock;
+       }
+
        /**
         * @param int $id
         * @return PHPUnit_Framework_MockObject_MockObject|User
         */
        private function getMockNonAnonUserWithId( $id ) {
-               $mock = $this->getMock( User::class );
+               $mock = $this->createMock( User::class );
                $mock->expects( $this->any() )
                        ->method( 'isAnon' )
                        ->will( $this->returnValue( false ) );
@@ -88,10 +97,13 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                return $fakeRow;
        }
 
-       private function newWatchedItemStore( LoadBalancer $loadBalancer, HashBagOStuff $cache ) {
+       private function newWatchedItemStore( LoadBalancer $loadBalancer, HashBagOStuff $cache,
+               ReadOnlyMode $readOnlyMode
+       ) {
                return new WatchedItemStore(
                        $loadBalancer,
-                       $cache
+                       $cache,
+                       $readOnlyMode
                );
        }
 
@@ -118,7 +130,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals( 12, $store->countWatchedItems( $user ) );
@@ -148,7 +161,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals( 7, $store->countWatchers( $titleValue ) );
@@ -199,7 +213,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $expected = [
@@ -265,7 +280,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $expected = [
@@ -313,7 +329,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals( 7, $store->countVisitingWatchers( $titleValue, '111' ) );
@@ -392,7 +409,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $expected = [
@@ -494,7 +512,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $expected = [
@@ -547,7 +566,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $expected = [
@@ -584,7 +604,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals( 9, $store->countUnreadNotifications( $user ) );
@@ -618,7 +639,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertSame(
@@ -655,7 +677,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals(
@@ -685,7 +708,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $this->getMockCache()
+                       $this->getMockCache(),
+                       $this->getMockReadOnlyMode()
                );
 
                $store->duplicateEntry(
@@ -743,7 +767,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $store->duplicateEntry(
@@ -789,7 +814,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $store->duplicateAllAssociatedEntries(
@@ -882,7 +908,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $store->duplicateAllAssociatedEntries(
@@ -914,7 +941,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $store->addWatch(
@@ -934,7 +962,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $store->addWatch(
@@ -945,8 +974,9 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
        public function testAddWatchBatchForUser_readOnlyDBReturnsFalse() {
                $store = $this->newWatchedItemStore(
-                       $this->getMockLoadBalancer( $this->getMockDb(), null, 'Some Reason' ),
-                       $this->getMockCache()
+                       $this->getMockLoadBalancer( $this->getMockDb() ),
+                       $this->getMockCache(),
+                       $this->getMockReadOnlyMode( true )
                );
 
                $this->assertFalse(
@@ -991,7 +1021,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $mockUser = $this->getMockNonAnonUserWithId( 1 );
@@ -1015,7 +1046,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertFalse(
@@ -1038,7 +1070,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertTrue(
@@ -1072,7 +1105,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $watchedItem = $store->loadWatchedItem(
@@ -1106,7 +1140,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertFalse(
@@ -1128,7 +1163,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertFalse(
@@ -1163,7 +1199,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertTrue(
@@ -1198,7 +1235,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertFalse(
@@ -1221,7 +1259,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertFalse(
@@ -1265,7 +1304,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $watchedItem = $store->getWatchedItem(
@@ -1299,7 +1339,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals(
@@ -1336,7 +1377,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertFalse(
@@ -1359,7 +1401,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertFalse(
@@ -1399,7 +1442,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
                $user = $this->getMockNonAnonUserWithId( 1 );
 
@@ -1449,7 +1493,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $mockLoadBalancer,
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $watchedItems = $store->getWatchedItemsForUser(
@@ -1462,7 +1507,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
        public function testGetWatchedItemsForUser_badSortOptionThrowsException() {
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $this->getMockDb() ),
-                       $this->getMockCache()
+                       $this->getMockCache(),
+                       $this->getMockReadOnlyMode()
                );
 
                $this->setExpectedException( 'InvalidArgumentException' );
@@ -1503,7 +1549,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertTrue(
@@ -1539,7 +1586,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertFalse(
@@ -1562,7 +1610,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertFalse(
@@ -1629,7 +1678,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals(
@@ -1679,7 +1729,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals(
@@ -1740,7 +1791,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals(
@@ -1780,7 +1832,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals(
@@ -1806,7 +1859,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals(
@@ -1830,7 +1884,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertFalse(
@@ -1863,7 +1918,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertFalse(
@@ -1908,7 +1964,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                // Note: This does not actually assert the job is correct
@@ -1948,7 +2005,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                // Note: This does not actually assert the job is correct
@@ -1978,7 +2036,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
         * @return PHPUnit_Framework_MockObject_MockObject|Title
         */
        private function getMockTitle( $text, $ns = 0 ) {
-               $title = $this->getMock( Title::class );
+               $title = $this->createMock( Title::class );
                $title->expects( $this->any() )
                        ->method( 'getText' )
                        ->will( $this->returnValue( str_replace( '_', ' ', $text ) ) );
@@ -2041,7 +2099,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $callableCallCounter = 0;
@@ -2107,7 +2166,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $addUpdateCallCounter = 0;
@@ -2182,7 +2242,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $callableCallCounter = 0;
@@ -2248,7 +2309,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $addUpdateCallCounter = 0;
@@ -2325,7 +2387,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $addUpdateCallCounter = 0;
@@ -2370,7 +2433,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
        public function testSetNotificationTimestampsForUser_anonUser() {
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $this->getMockDb() ),
-                       $this->getMockCache()
+                       $this->getMockCache(),
+                       $this->getMockReadOnlyMode()
                );
                $this->assertFalse( $store->setNotificationTimestampsForUser( $this->getAnonUser(), '' ) );
        }
@@ -2396,7 +2460,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $this->getMockCache()
+                       $this->getMockCache(),
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertTrue(
@@ -2425,7 +2490,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $this->getMockCache()
+                       $this->getMockCache(),
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertTrue(
@@ -2463,7 +2529,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $this->getMockCache()
+                       $this->getMockCache(),
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertTrue(
@@ -2505,7 +2572,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $this->assertEquals(
@@ -2545,7 +2613,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                $watchers = $store->updateNotificationTimestamp(
@@ -2588,7 +2657,8 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
-                       $mockCache
+                       $mockCache,
+                       $this->getMockReadOnlyMode()
                );
 
                // This will add the item to the cache
index 7e1ff3d..8897645 100644 (file)
@@ -14,7 +14,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase {
         * @return PHPUnit_Framework_MockObject_MockObject|User
         */
        private function getMockUser( $id ) {
-               $user = $this->getMock( User::class );
+               $user = $this->createMock( User::class );
                $user->expects( $this->any() )
                        ->method( 'getId' )
                        ->will( $this->returnValue( $id ) );
@@ -84,7 +84,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase {
                $checkRights = 0;
 
                /** @var User|PHPUnit_Framework_MockObject_MockObject $user */
-               $user = $this->getMock( User::class );
+               $user = $this->createMock( User::class );
                $user->expects( $this->once() )
                        ->method( 'addWatch' )
                        ->with( $title, $checkRights );
@@ -99,7 +99,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase {
                $checkRights = 0;
 
                /** @var User|PHPUnit_Framework_MockObject_MockObject $user */
-               $user = $this->getMock( User::class );
+               $user = $this->createMock( User::class );
                $user->expects( $this->once() )
                        ->method( 'removeWatch' )
                        ->with( $title, $checkRights );
@@ -124,7 +124,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase {
                $checkRights = 0;
 
                /** @var User|PHPUnit_Framework_MockObject_MockObject $user */
-               $user = $this->getMock( User::class );
+               $user = $this->createMock( User::class );
                $user->expects( $this->once() )
                        ->method( 'isWatched' )
                        ->with( $title, $checkRights )
index 184dd43..6c059ec 100644 (file)
@@ -397,4 +397,33 @@ class XmlTest extends MediaWikiTestCase {
                        'encodeJsVar() with float-like string'
                );
        }
+
+       /**
+        * @covers Xml::listDropDown
+        */
+       public function testListDropDown() {
+               $this->assertEquals(
+                       '<select id="test-name" name="test-name" class="test-css" tabindex="2">' . "\n" .
+                               '<option value="other">other reasons</option>' .
+                               '<optgroup label="Foo"><option value="Foo 1">Foo 1</option>' .
+                               '<option value="Example" selected="">Example</option>' .
+                               '</optgroup><optgroup label="Bar">' .
+                               '<option value="Bar 1">Bar 1</option></optgroup>' . "\n" .
+                               '</select>',
+                       Xml::listDropDown(
+                               // name
+                               'test-name',
+                               // source list
+                               "* Foo\n** Foo 1\n** Example\n* Bar\n** Bar 1",
+                               // other
+                               'other reasons',
+                               // selected
+                               'Example',
+                               // class
+                               'test-css',
+                               // tabindex
+                               2
+                       )
+               );
+       }
 }
index 7327e85..253ac95 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group API
  * @group Database
index ea8c9ca..3cf1fde 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group API
  * @group Database
index 9060dfb..ea33a9e 100644 (file)
@@ -1,7 +1,10 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group API
+ * @group Database
  * @group medium
  *
  * @covers ApiMain
@@ -42,9 +45,11 @@ class ApiMainTest extends ApiTestCase {
         * @param string|bool $error False if no error expected
         */
        public function testAssert( $registered, $rights, $assert, $error ) {
-               $user = new User();
                if ( $registered ) {
-                       $user->setId( 1 );
+                       $user = $this->getMutableTestUser()->getUser();
+                       $user->load(); // load before setting mRights
+               } else {
+                       $user = new User();
                }
                $user->mRights = $rights;
                try {
@@ -54,7 +59,8 @@ class ApiMainTest extends ApiTestCase {
                        ], null, null, $user );
                        $this->assertFalse( $error ); // That no error was expected
                } catch ( ApiUsageException $e ) {
-                       $this->assertTrue( self::apiExceptionHasCode( $e, $error ) );
+                       $this->assertTrue( self::apiExceptionHasCode( $e, $error ),
+                               "Error '{$e->getMessage()}' matched expected '$error'" );
                }
        }
 
@@ -330,8 +336,6 @@ class ApiMainTest extends ApiTestCase {
        }
 
        public static function provideApiErrorFormatterCreation() {
-               global $wgContLang;
-
                return [
                        'Default (BC)' => [ [], [
                                'uselang' => 'ru',
@@ -381,9 +385,9 @@ class ApiMainTest extends ApiTestCase {
                        'uselang=content' => [
                                [ 'uselang' => 'content', 'errorformat' => 'plaintext' ],
                                [
-                                       'uselang' => $wgContLang->getCode(),
+                                       'uselang' => 'en',
                                        'class' => ApiErrorFormatter::class,
-                                       'lang' => $wgContLang->getCode(),
+                                       'lang' => 'en',
                                        'format' => 'plaintext',
                                        'usedb' => false,
                                ]
@@ -393,7 +397,7 @@ class ApiMainTest extends ApiTestCase {
                                [
                                        'uselang' => 'ru',
                                        'class' => ApiErrorFormatter::class,
-                                       'lang' => $wgContLang->getCode(),
+                                       'lang' => 'en',
                                        'format' => 'plaintext',
                                        'usedb' => false,
                                ]
@@ -473,7 +477,7 @@ class ApiMainTest extends ApiTestCase {
                );
        }
 
-       // Not static so $this->getMock() can be used
+       // Not static so $this can be used
        public function provideExceptionErrors() {
                $reqId = WebRequest::getRequestId();
                $doclink = wfExpandUrl( wfScript( 'api' ) );
@@ -486,7 +490,9 @@ class ApiMainTest extends ApiTestCase {
                        MWExceptionHandler::getRedactedTraceAsString( $ex )
                )->inLanguage( 'en' )->useDatabase( false )->text();
 
-               $dbex = new DBQueryError( $this->getMock( 'IDatabase' ), 'error', 1234, 'SELECT 1', __METHOD__ );
+               $dbex = new DBQueryError(
+                       $this->createMock( 'IDatabase' ),
+                       'error', 1234, 'SELECT 1', __METHOD__ );
                $dbtrace = wfMessage( 'api-exception-trace',
                        get_class( $dbex ),
                        $dbex->getFile(),
index e405b3b..c6f5a8e 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group API
  */
index ad1deee..8a2146a 100644 (file)
@@ -96,4 +96,83 @@ class ApiPageSetTest extends ApiTestCase {
                        $pageSet->getNormalizedTitlesAsResult()
                );
        }
+
+       public function testSpecialRedirects() {
+               $id1 = self::editPage( 'UTApiPageSet', 'UTApiPageSet in the default language' )
+                       ->value['revision']->getTitle()->getArticleID();
+               $id2 = self::editPage( 'UTApiPageSet/de', 'UTApiPageSet in German' )
+                       ->value['revision']->getTitle()->getArticleID();
+
+               $user = $this->getTestUser()->getUser();
+               $userName = $user->getName();
+               $userDbkey = str_replace( ' ', '_', $userName );
+               $request = new FauxRequest( [
+                       'titles' => join( '|', [
+                               'Special:MyContributions',
+                               'Special:MyPage',
+                               'Special:MyTalk/subpage',
+                               'Special:MyLanguage/UTApiPageSet',
+                       ] ),
+               ] );
+               $context = new RequestContext();
+               $context->setRequest( $request );
+               $context->setUser( $user );
+
+               $main = new ApiMain( $context );
+               $pageSet = new ApiPageSet( $main );
+               $pageSet->execute();
+
+               $this->assertEquals( [
+               ], $pageSet->getRedirectTitlesAsResult() );
+               $this->assertEquals( [
+                       [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
+                       [ 'ns' => -1, 'title' => 'Special:MyPage', 'special' => true ],
+                       [ 'ns' => -1, 'title' => 'Special:MyTalk/subpage', 'special' => true ],
+                       [ 'ns' => -1, 'title' => 'Special:MyLanguage/UTApiPageSet', 'special' => true ],
+               ], $pageSet->getInvalidTitlesAndRevisions() );
+               $this->assertEquals( [
+               ], $pageSet->getAllTitlesByNamespace() );
+
+               $request->setVal( 'redirects', 1 );
+               $main = new ApiMain( $context );
+               $pageSet = new ApiPageSet( $main );
+               $pageSet->execute();
+
+               $this->assertEquals( [
+                       [ 'from' => 'Special:MyPage', 'to' => "User:$userName" ],
+                       [ 'from' => 'Special:MyTalk/subpage', 'to' => "User talk:$userName/subpage" ],
+                       [ 'from' => 'Special:MyLanguage/UTApiPageSet', 'to' => 'UTApiPageSet' ],
+               ], $pageSet->getRedirectTitlesAsResult() );
+               $this->assertEquals( [
+                       [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
+                       [ 'ns' => 2, 'title' => "User:$userName", 'missing' => true ],
+                       [ 'ns' => 3, 'title' => "User talk:$userName/subpage", 'missing' => true ],
+               ], $pageSet->getInvalidTitlesAndRevisions() );
+               $this->assertEquals( [
+                       0 => [ 'UTApiPageSet' => $id1 ],
+                       2 => [ $userDbkey => -2 ],
+                       3 => [ "$userDbkey/subpage" => -3 ],
+               ], $pageSet->getAllTitlesByNamespace() );
+
+               $context->setLanguage( 'de' );
+               $main = new ApiMain( $context );
+               $pageSet = new ApiPageSet( $main );
+               $pageSet->execute();
+
+               $this->assertEquals( [
+                       [ 'from' => 'Special:MyPage', 'to' => "User:$userName" ],
+                       [ 'from' => 'Special:MyTalk/subpage', 'to' => "User talk:$userName/subpage" ],
+                       [ 'from' => 'Special:MyLanguage/UTApiPageSet', 'to' => 'UTApiPageSet/de' ],
+               ], $pageSet->getRedirectTitlesAsResult() );
+               $this->assertEquals( [
+                       [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
+                       [ 'ns' => 2, 'title' => "User:$userName", 'missing' => true ],
+                       [ 'ns' => 3, 'title' => "User talk:$userName/subpage", 'missing' => true ],
+               ], $pageSet->getInvalidTitlesAndRevisions() );
+               $this->assertEquals( [
+                       0 => [ 'UTApiPageSet/de' => $id2 ],
+                       2 => [ $userDbkey => -2 ],
+                       3 => [ "$userDbkey/subpage" => -3 ],
+               ], $pageSet->getAllTitlesByNamespace() );
+       }
 }
index 0a2cd83..b508928 100644 (file)
@@ -1475,6 +1475,9 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
 
                $this->watchPages( $otherUser, [ $target ] );
 
+               $reloadedUser = User::newFromName( $otherUser->getName() );
+               $this->assertEquals( '1234567890', $reloadedUser->getOption( 'watchlisttoken' ) );
+
                $result = $this->doListWatchlistRequest( [
                        'wlowner' => $otherUser->getName(),
                        'wltoken' => '1234567890',
index 6b299c9..abef1c9 100644 (file)
@@ -219,7 +219,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
        }
 
        public function testApiTestGroup() {
-               $groups = PHPUnit_Util_Test::getGroups( get_class( $this ) );
+               $groups = PHPUnit_Util_Test::getGroups( static::class );
                $constraint = PHPUnit_Framework_Assert::logicalOr(
                        $this->contains( 'medium' ),
                        $this->contains( 'large' )
index 89e48f7..a3b0df5 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group AuthManager
  * @covers MediaWiki\Auth\AbstractAuthenticationProvider
@@ -9,7 +11,7 @@ namespace MediaWiki\Auth;
 class AbstractAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testAbstractAuthenticationProvider() {
                $provider = $this->getMockForAbstractClass( AbstractAuthenticationProvider::class );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $obj = $this->getMockForAbstractClass( 'Psr\Log\LoggerInterface' );
                $provider->setLogger( $obj );
index a57682b..76d8ee9 100644 (file)
@@ -3,6 +3,7 @@
 namespace MediaWiki\Auth;
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group AuthManager
@@ -13,14 +14,14 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                $provider = $this->getMockForAbstractClass(
                        AbstractPasswordPrimaryAuthenticationProvider::class
                );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
                $this->assertTrue( $providerPriv->authoritative );
 
                $provider = $this->getMockForAbstractClass(
                        AbstractPasswordPrimaryAuthenticationProvider::class,
                        [ [ 'authoritative' => false ] ]
                );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
                $this->assertFalse( $providerPriv->authoritative );
        }
 
@@ -29,7 +30,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                        AbstractPasswordPrimaryAuthenticationProvider::class
                );
                $provider->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $obj = $providerPriv->getPasswordFactory();
                $this->assertInstanceOf( 'PasswordFactory', $obj );
@@ -42,7 +43,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                );
                $provider->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
                $provider->setLogger( new \Psr\Log\NullLogger() );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $obj = $providerPriv->getPassword( null );
                $this->assertInstanceOf( 'Password', $obj );
@@ -61,7 +62,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                        MediaWikiServices::getInstance()->getMainConfig()
                ] ) );
                $provider->setLogger( new \Psr\Log\NullLogger() );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'ResetPasswordExpiration' => [] ] );
 
@@ -109,7 +110,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                );
                $provider->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
                $provider->setLogger( new \Psr\Log\NullLogger() );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $this->assertEquals( $uppStatus, $providerPriv->checkPasswordValidity( 'foo', 'bar' ) );
 
@@ -133,7 +134,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                $provider->setConfig( $config );
                $provider->setLogger( new \Psr\Log\NullLogger() );
                $provider->setManager( $manager );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $manager->removeAuthenticationSessionData( null );
                $status = \Status::newGood();
@@ -161,7 +162,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                        AbstractPasswordPrimaryAuthenticationProvider::class,
                        [ [ 'authoritative' => false ] ]
                );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $req = new PasswordAuthenticationRequest;
 
@@ -172,7 +173,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                        AbstractPasswordPrimaryAuthenticationProvider::class,
                        [ [ 'authoritative' => true ] ]
                );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $req->password = '';
                $ret = $providerPriv->failResponse( $req );
index d8588d5..8d84f4c 100644 (file)
@@ -60,7 +60,7 @@ class AbstractPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testProviderRevokeAccessForUser() {
                $reqs = [];
                for ( $i = 0; $i < 3; $i++ ) {
-                       $reqs[$i] = $this->getMock( AuthenticationRequest::class );
+                       $reqs[$i] = $this->createMock( AuthenticationRequest::class );
                        $reqs[$i]->done = false;
                }
 
index bb90dd9..41cf62e 100644 (file)
@@ -55,7 +55,7 @@ class AbstractSecondaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testProviderRevokeAccessForUser() {
                $reqs = [];
                for ( $i = 0; $i < 3; $i++ ) {
-                       $reqs[$i] = $this->getMock( AuthenticationRequest::class );
+                       $reqs[$i] = $this->createMock( AuthenticationRequest::class );
                        $reqs[$i]->done = false;
                }
 
index f57db11..015fb3e 100644 (file)
@@ -7,6 +7,7 @@ use MediaWiki\Session\UserInfo;
 use Psr\Log\LogLevel;
 use StatusValue;
 use Wikimedia\ScopedCallback;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group AuthManager
@@ -45,7 +46,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
         */
        protected function hook( $hook, $expect ) {
                global $wgHooks;
-               $mock = $this->getMock( __CLASS__, [ "on$hook" ] );
+               $mock = $this->getMockBuilder( __CLASS__ )
+                       ->setMethods( [ "on$hook" ] )
+                       ->getMock();
                $wgHooks[$hook] = [ $mock ];
                return $mock->expects( $expect )->method( "on$hook" );
        }
@@ -125,7 +128,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                }
                $this->manager = new AuthManager( $this->request, $this->config );
                $this->manager->setLogger( $this->logger );
-               $this->managerPriv = \TestingAccessWrapper::newFromObject( $this->manager );
+               $this->managerPriv = TestingAccessWrapper::newFromObject( $this->manager );
        }
 
        /**
@@ -168,7 +171,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        'logger' => new \Psr\Log\NullLogger(),
                        'store' => new \HashBagOStuff(),
                ] );
-               \TestingAccessWrapper::newFromObject( $manager )->getProvider( (string)$provider );
+               TestingAccessWrapper::newFromObject( $manager )->getProvider( (string)$provider );
 
                $reset = \MediaWiki\Session\TestUtils::setSessionManagerSingleton( $manager );
 
@@ -194,7 +197,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $this->assertSame( \RequestContext::getMain()->getRequest(), $singleton->getRequest() );
                $this->assertSame(
                        \RequestContext::getMain()->getConfig(),
-                       \TestingAccessWrapper::newFromObject( $singleton )->config
+                       TestingAccessWrapper::newFromObject( $singleton )->config
                );
        }
 
@@ -762,9 +765,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
        public function testCreateFromLogin() {
                $user = \User::newFromName( 'UTSysop' );
-               $req1 = $this->getMock( AuthenticationRequest::class );
-               $req2 = $this->getMock( AuthenticationRequest::class );
-               $req3 = $this->getMock( AuthenticationRequest::class );
+               $req1 = $this->createMock( AuthenticationRequest::class );
+               $req2 = $this->createMock( AuthenticationRequest::class );
+               $req3 = $this->createMock( AuthenticationRequest::class );
                $userReq = new UsernameAuthenticationRequest;
                $userReq->username = 'UTDummy';
 
@@ -1083,10 +1086,6 @@ class AuthManagerTest extends \MediaWikiTestCase {
        }
 
        public function provideAuthentication() {
-               $user = \User::newFromName( 'UTSysop' );
-               $id = $user->getId();
-               $name = $user->getName();
-
                $rememberReq = new RememberMeAuthenticationRequest;
                $rememberReq->action = AuthManager::ACTION_LOGIN;
 
@@ -1108,6 +1107,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $restartResponse2->createRequest->action = AuthManager::ACTION_LOGIN;
                $restartResponse2->neededRequests = [ $rememberReq, $restartResponse2->createRequest ];
 
+               $userName = 'UTSysop';
+
                return [
                        'Failure in pre-auth' => [
                                StatusValue::newFatal( 'fail-from-pre' ),
@@ -1202,7 +1203,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        'Secondary fail' => [
                                StatusValue::newGood(),
                                [
-                                       AuthenticationResponse::newPass( $name ),
+                                       AuthenticationResponse::newPass( $userName ),
                                ],
                                $tmp = [
                                        AuthenticationResponse::newFail( $this->message( 'fail-in-secondary' ) ),
@@ -1212,7 +1213,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        'Secondary UI, then abstain' => [
                                StatusValue::newGood(),
                                [
-                                       AuthenticationResponse::newPass( $name ),
+                                       AuthenticationResponse::newPass( $userName ),
                                ],
                                [
                                        $tmp = AuthenticationResponse::newUI( [ $req ], $this->message( '...' ) ),
@@ -1220,19 +1221,19 @@ class AuthManagerTest extends \MediaWikiTestCase {
                                ],
                                [
                                        $tmp,
-                                       AuthenticationResponse::newPass( $name ),
+                                       AuthenticationResponse::newPass( $userName ),
                                ]
                        ],
                        'Secondary pass' => [
                                StatusValue::newGood(),
                                [
-                                       AuthenticationResponse::newPass( $name ),
+                                       AuthenticationResponse::newPass( $userName ),
                                ],
                                [
                                        AuthenticationResponse::newPass()
                                ],
                                [
-                                       AuthenticationResponse::newPass( $name ),
+                                       AuthenticationResponse::newPass( $userName ),
                                ]
                        ],
                ];
@@ -1404,12 +1405,13 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        $this->manager->checkAccountCreatePermissions( new \User )
                );
 
-               $this->setMwGlobals( [ 'wgReadOnly' => 'Because' ] );
+               $readOnlyMode = \MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode();
+               $readOnlyMode->setReason( 'Because' );
                $this->assertEquals(
                        \Status::newFatal( 'readonlytext', 'Because' ),
                        $this->manager->checkAccountCreatePermissions( new \User )
                );
-               $this->setMwGlobals( [ 'wgReadOnly' => false ] );
+               $readOnlyMode->setReason( false );
 
                $wgGroupPermissions['*']['createaccount'] = false;
                $status = $this->manager->checkAccountCreatePermissions( new \User );
@@ -1597,7 +1599,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
                $this->assertSame( 'noname', $ret->message->getKey() );
 
-               $this->setMwGlobals( [ 'wgReadOnly' => 'Because' ] );
+               $readOnlyMode = \MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode();
+               $readOnlyMode->setReason( 'Because' );
                $this->hook( 'LocalUserCreated', $this->never() );
                $userReq->username = self::usernameForCreation();
                $ret = $this->manager->beginAccountCreation( $creator, [ $userReq ], 'http://localhost/' );
@@ -1605,7 +1608,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
                $this->assertSame( 'readonlytext', $ret->message->getKey() );
                $this->assertSame( [ 'Because' ], $ret->message->getParams() );
-               $this->setMwGlobals( [ 'wgReadOnly' => false ] );
+               $readOnlyMode->setReason( false );
 
                $this->hook( 'LocalUserCreated', $this->never() );
                $userReq->username = self::usernameForCreation();
@@ -1770,14 +1773,15 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
                $this->request->getSession()->setSecret( 'AuthManager::accountCreationState',
                        [ 'username' => $creator->getName() ] + $session );
-               $this->setMwGlobals( [ 'wgReadOnly' => 'Because' ] );
+               $readOnlyMode = \MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode();
+               $readOnlyMode->setReason( 'Because' );
                $this->hook( 'LocalUserCreated', $this->never() );
                $ret = $this->manager->continueAccountCreation( [] );
                $this->unhook( 'LocalUserCreated' );
                $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
                $this->assertSame( 'readonlytext', $ret->message->getKey() );
                $this->assertSame( [ 'Because' ], $ret->message->getParams() );
-               $this->setMwGlobals( [ 'wgReadOnly' => false ] );
+               $readOnlyMode->setReason( false );
 
                $this->request->getSession()->setSecret( 'AuthManager::accountCreationState',
                        [ 'username' => $creator->getName() ] + $session );
@@ -2468,7 +2472,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
                // Wiki is read-only
                $session->clear();
-               $this->setMwGlobals( [ 'wgReadOnly' => 'Because' ] );
+               $readOnlyMode = \MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode();
+               $readOnlyMode->setReason( 'Because' );
                $user = \User::newFromName( $username );
                $this->hook( 'LocalUserCreated', $this->never() );
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
@@ -2481,7 +2486,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        [ LogLevel::DEBUG, 'denied by wfReadOnly(): {reason}' ],
                ], $logger->getBuffer() );
                $logger->clearBuffer();
-               $this->setMwGlobals( [ 'wgReadOnly' => false ] );
+               $readOnlyMode->setReason( false );
 
                // Session blacklisted
                $session->clear();
@@ -2663,7 +2668,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
                // Test addToDatabase fails
                $session->clear();
-               $user = $this->getMock( 'User', [ 'addToDatabase' ] );
+               $user = $this->getMockBuilder( 'User' )
+                       ->setMethods( [ 'addToDatabase' ] )->getMock();
                $user->expects( $this->once() )->method( 'addToDatabase' )
                        ->will( $this->returnValue( \Status::newFatal( 'because' ) ) );
                $user->setName( $username );
@@ -2684,7 +2690,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $backoffKey = wfMemcKey( 'AuthManager', 'autocreate-failed', md5( $username ) );
                $this->assertFalse( $cache->get( $backoffKey ), 'sanity check' );
                $session->clear();
-               $user = $this->getMock( 'User', [ 'addToDatabase' ] );
+               $user = $this->getMockBuilder( 'User' )
+                       ->setMethods( [ 'addToDatabase' ] )->getMock();
                $user->expects( $this->once() )->method( 'addToDatabase' )
                        ->will( $this->throwException( new \Exception( 'Excepted' ) ) );
                $user->setName( $username );
@@ -2707,7 +2714,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
                // Test addToDatabase fails because the user already exists.
                $session->clear();
-               $user = $this->getMock( 'User', [ 'addToDatabase' ] );
+               $user = $this->getMockBuilder( 'User' )
+                       ->setMethods( [ 'addToDatabase' ] )->getMock();
                $user->expects( $this->once() )->method( 'addToDatabase' )
                        ->will( $this->returnCallback( function () use ( $username, &$user ) {
                                $oldUser = \User::newFromName( $username );
@@ -2815,7 +2823,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
         */
        public function testGetAuthenticationRequests( $action, $expect, $state = [] ) {
                $makeReq = function ( $key ) use ( $action ) {
-                       $req = $this->getMock( AuthenticationRequest::class );
+                       $req = $this->createMock( AuthenticationRequest::class );
                        $req->expects( $this->any() )->method( 'getUniqueId' )
                                ->will( $this->returnValue( $key ) );
                        $req->action = $action === AuthManager::ACTION_UNLINK ? AuthManager::ACTION_REMOVE : $action;
@@ -3018,7 +3026,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
        public function testGetAuthenticationRequestsRequired() {
                $makeReq = function ( $key, $required ) {
-                       $req = $this->getMock( AuthenticationRequest::class );
+                       $req = $this->createMock( AuthenticationRequest::class );
                        $req->expects( $this->any() )->method( 'getUniqueId' )
                                ->will( $this->returnValue( $key ) );
                        $req->action = AuthManager::ACTION_LOGIN;
@@ -3148,7 +3156,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
        public function testAutoCreateOnLogin() {
                $username = self::usernameForCreation();
 
-               $req = $this->getMock( AuthenticationRequest::class );
+               $req = $this->createMock( AuthenticationRequest::class );
 
                $mock = $this->getMockForAbstractClass( PrimaryAuthenticationProvider::class );
                $mock->expects( $this->any() )->method( 'getUniqueId' )->will( $this->returnValue( 'primary' ) );
index 96e50e0..6970313 100644 (file)
@@ -20,7 +20,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        );
                }
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
 
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
@@ -29,14 +29,14 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $provider->getAuthenticationRequests( AuthManager::ACTION_LOGIN, [] )
                );
 
-               $req = $this->getMock( PasswordAuthenticationRequest::class );
+               $req = $this->createMock( PasswordAuthenticationRequest::class );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin, get_class( $req ) );
                $this->assertEquals(
                        [ $req ],
                        $provider->getAuthenticationRequests( AuthManager::ACTION_LOGIN, [] )
                );
 
-               $reqType = get_class( $this->getMock( AuthenticationRequest::class ) );
+               $reqType = get_class( $this->createMock( AuthenticationRequest::class ) );
                try {
                        $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin, $reqType );
                        $this->fail( 'Expected exception not thrown' );
@@ -51,7 +51,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnUserSaveSettings() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'updateExternalDB' )
                        ->with( $this->identicalTo( $user ) );
@@ -63,7 +63,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnUserGroupsChanged() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'updateExternalDBGroups' )
                        ->with(
@@ -79,14 +79,14 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnUserLoggedIn() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->exactly( 2 ) )->method( 'updateUser' )
                        ->with( $this->identicalTo( $user ) );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                \Hooks::run( 'UserLoggedIn', [ $user ] );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'updateUser' )
                        ->will( $this->returnCallback( function ( &$user ) {
@@ -107,14 +107,14 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnLocalUserCreated() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->exactly( 2 ) )->method( 'initUser' )
                        ->with( $this->identicalTo( $user ), $this->identicalTo( false ) );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                \Hooks::run( 'LocalUserCreated', [ $user, false ] );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'initUser' )
                        ->will( $this->returnCallback( function ( &$user ) {
@@ -133,7 +133,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testGetUniqueId() {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $this->assertSame(
@@ -149,7 +149,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
         * @param bool $allowPasswordChange
         */
        public function testGetAuthenticationRequests( $action, $response, $allowPasswordChange ) {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'allowPasswordChange' )
                        ->will( $this->returnValue( $allowPasswordChange ) );
@@ -321,7 +321,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testTestUserExists() {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -330,7 +330,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
 
                $this->assertTrue( $provider->testUserExists( 'foo' ) );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -341,7 +341,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testTestUserCanAuthenticate() {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -355,7 +355,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        ->getMock();
                $pluginUser->expects( $this->once() )->method( 'isLocked' )
                        ->will( $this->returnValue( true ) );
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -375,7 +375,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        ->getMock();
                $pluginUser->expects( $this->once() )->method( 'isLocked' )
                        ->will( $this->returnValue( false ) );
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -433,7 +433,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testProviderAllowsPropertyChange() {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'allowPropChange' )
                        ->will( $this->returnCallback( function ( $prop ) {
@@ -453,7 +453,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
         */
        public function testProviderAllowsAuthenticationDataChange( $type, $allow, $expect ) {
                $domains = $type instanceof PasswordDomainAuthenticationRequest ? [ 'foo', 'bar' ] : [];
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( $domains );
                $plugin->expects( $allow === null ? $this->never() : $this->once() )
                        ->method( 'allowPasswordChange' )->will( $this->returnValue( $allow ) );
@@ -466,7 +466,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                if ( is_object( $type ) ) {
                        $req = $type;
                } else {
-                       $req = $this->getMock( $type );
+                       $req = $this->createMock( $type );
                }
                $req->action = AuthManager::ACTION_CHANGE;
                $req->username = 'UTSysop';
@@ -502,12 +502,12 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testProviderChangeAuthenticationData() {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->never() )->method( 'setPassword' );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $provider->providerChangeAuthenticationData(
-                       $this->getMock( AuthenticationRequest::class )
+                       $this->createMock( AuthenticationRequest::class )
                );
 
                $req = new PasswordAuthenticationRequest();
@@ -515,7 +515,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $req->username = 'foo';
                $req->password = 'bar';
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'setPassword' )
                        ->with( $this->callback( function ( $u ) {
@@ -525,7 +525,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $provider->providerChangeAuthenticationData( $req );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'setPassword' )
                        ->with( $this->callback( function ( $u ) {
@@ -541,7 +541,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $this->assertSame( 'authmanager-authplugin-setpass-failed-message', $e->msg );
                }
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )
                        ->will( $this->returnValue( [ 'Domain1', 'Domain2' ] ) );
                $plugin->expects( $this->any() )->method( 'validDomain' )
@@ -569,7 +569,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
         * @param string $expect
         */
        public function testAccountCreationType( $can, $expect ) {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )
                        ->method( 'canCreateAccounts' )->will( $this->returnValue( $can ) );
@@ -588,7 +588,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testTestForAccountCreation() {
                $user = \User::newFromName( 'foo' );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $this->assertEquals(
@@ -606,7 +606,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $req->action = AuthManager::ACTION_CREATE;
                $reqs = [ PasswordAuthenticationRequest::class => $req ];
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( false ) );
@@ -621,7 +621,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        );
                }
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
@@ -650,7 +650,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $req->username = 'foo';
                $req->password = 'bar';
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
@@ -670,7 +670,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $provider->beginPrimaryAccountCreation( $user, $user, $reqs )
                );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
@@ -689,7 +689,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
                $this->assertSame( 'authmanager-authplugin-create-fail', $ret->message->getKey() );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
                $plugin->expects( $this->any() )->method( 'domainList' )
index 7d2ba8d..0e549a5 100644 (file)
@@ -138,7 +138,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
        public function testMergeFieldInfo() {
                $msg = wfMessage( 'foo' );
 
-               $req1 = $this->getMock( AuthenticationRequest::class );
+               $req1 = $this->createMock( AuthenticationRequest::class );
                $req1->required = AuthenticationRequest::REQUIRED;
                $req1->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [
                        'string1' => [
@@ -165,7 +165,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
                        ],
                ] ) );
 
-               $req2 = $this->getMock( AuthenticationRequest::class );
+               $req2 = $this->createMock( AuthenticationRequest::class );
                $req2->required = AuthenticationRequest::REQUIRED;
                $req2->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [
                        'string1' => [
@@ -187,7 +187,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
                        ],
                ] ) );
 
-               $req3 = $this->getMock( AuthenticationRequest::class );
+               $req3 = $this->createMock( AuthenticationRequest::class );
                $req3->required = AuthenticationRequest::REQUIRED;
                $req3->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [
                        'string1' => [
@@ -197,7 +197,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
                        ],
                ] ) );
 
-               $req4 = $this->getMock( AuthenticationRequest::class );
+               $req4 = $this->createMock( AuthenticationRequest::class );
                $req4->required = AuthenticationRequest::REQUIRED;
                $req4->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [] ) );
 
index 68f574b..111c855 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group AuthManager
  * @group Database
@@ -10,7 +12,7 @@ namespace MediaWiki\Auth;
 class CheckBlocksSecondaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testConstructor() {
                $provider = new CheckBlocksSecondaryAuthenticationProvider();
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
                $config = new \HashConfig( [
                        'BlockDisablesLogin' => false
                ] );
@@ -20,7 +22,7 @@ class CheckBlocksSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
                $provider = new CheckBlocksSecondaryAuthenticationProvider(
                        [ 'blockDisablesLogin' => true ]
                );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
                $config = new \HashConfig( [
                        'BlockDisablesLogin' => false
                ] );
index 3fc45a4..9222843 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group AuthManager
  * @covers MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider
@@ -126,7 +128,7 @@ class ConfirmLinkSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
                        ->will( $this->returnValue( "BadReq" ) );
 
                $user = \User::newFromName( 'UTSysop' );
-               $provider = \TestingAccessWrapper::newFromObject(
+               $provider = TestingAccessWrapper::newFromObject(
                        new ConfirmLinkSecondaryAuthenticationProvider
                );
                $request = new \FauxRequest();
@@ -171,7 +173,7 @@ class ConfirmLinkSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
                        $r->action = AuthManager::ACTION_CHANGE;
                        $r->username = $user->getName();
                }
-               $this->assertEquals( $expectReqs, \TestingAccessWrapper::newFromObject( $req )->linkRequests );
+               $this->assertEquals( $expectReqs, TestingAccessWrapper::newFromObject( $req )->linkRequests );
        }
 
        public function testContinueLinkAttempt() {
@@ -190,7 +192,7 @@ class ConfirmLinkSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
                        ->will( $this->returnValue( $obj ) );
                $this->assertSame(
                        $obj,
-                       \TestingAccessWrapper::newFromObject( $mock )->continueLinkAttempt( $user, 'state', $reqs )
+                       TestingAccessWrapper::newFromObject( $mock )->continueLinkAttempt( $user, 'state', $reqs )
                );
 
                // Now test the actual functioning
@@ -224,7 +226,7 @@ class ConfirmLinkSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
                $request = new \FauxRequest();
                $manager = new AuthManager( $request, $config );
                $provider->setManager( $manager );
-               $provider = \TestingAccessWrapper::newFromObject( $provider );
+               $provider = TestingAccessWrapper::newFromObject( $provider );
 
                $req = new ConfirmLinkAuthenticationRequest( $reqs );
 
index ec4bea1..3757069 100644 (file)
@@ -3,6 +3,7 @@
 namespace MediaWiki\Auth;
 
 use Psr\Log\LoggerInterface;
+use Wikimedia\TestingAccessWrapper;
 
 class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit_Framework_TestCase {
        public function testConstructor() {
@@ -13,14 +14,14 @@ class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit_Fram
 
                $provider = new EmailNotificationSecondaryAuthenticationProvider();
                $provider->setConfig( $config );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
                $this->assertTrue( $providerPriv->sendConfirmationEmail );
 
                $provider = new EmailNotificationSecondaryAuthenticationProvider( [
                        'sendConfirmationEmail' => false,
                ] );
                $provider->setConfig( $config );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
                $this->assertFalse( $providerPriv->sendConfirmationEmail );
        }
 
@@ -57,24 +58,24 @@ class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit_Fram
        public function testBeginSecondaryAccountCreation() {
                $authManager = new AuthManager( new \FauxRequest(), new \HashConfig() );
 
-               $creator = $this->getMock( 'User' );
-               $userWithoutEmail = $this->getMock( 'User' );
+               $creator = $this->getMockBuilder( 'User' )->getMock();
+               $userWithoutEmail = $this->getMockBuilder( 'User' )->getMock();
                $userWithoutEmail->expects( $this->any() )->method( 'getEmail' )->willReturn( '' );
                $userWithoutEmail->expects( $this->any() )->method( 'getInstanceForUpdate' )->willReturnSelf();
                $userWithoutEmail->expects( $this->never() )->method( 'sendConfirmationMail' );
-               $userWithEmailError = $this->getMock( 'User' );
+               $userWithEmailError = $this->getMockBuilder( 'User' )->getMock();
                $userWithEmailError->expects( $this->any() )->method( 'getEmail' )->willReturn( 'foo@bar.baz' );
                $userWithEmailError->expects( $this->any() )->method( 'getInstanceForUpdate' )->willReturnSelf();
                $userWithEmailError->expects( $this->any() )->method( 'sendConfirmationMail' )
                        ->willReturn( \Status::newFatal( 'fail' ) );
-               $userExpectsConfirmation = $this->getMock( 'User' );
+               $userExpectsConfirmation = $this->getMockBuilder( 'User' )->getMock();
                $userExpectsConfirmation->expects( $this->any() )->method( 'getEmail' )
                        ->willReturn( 'foo@bar.baz' );
                $userExpectsConfirmation->expects( $this->any() )->method( 'getInstanceForUpdate' )
                        ->willReturnSelf();
                $userExpectsConfirmation->expects( $this->once() )->method( 'sendConfirmationMail' )
                        ->willReturn( \Status::newGood() );
-               $userNotExpectsConfirmation = $this->getMock( 'User' );
+               $userNotExpectsConfirmation = $this->getMockBuilder( 'User' )->getMock();
                $userNotExpectsConfirmation->expects( $this->any() )->method( 'getEmail' )
                        ->willReturn( 'foo@bar.baz' );
                $userNotExpectsConfirmation->expects( $this->any() )->method( 'getInstanceForUpdate' )
index b96455e..3b00194 100644 (file)
@@ -15,7 +15,8 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
         * @return LegacyHookPreAuthenticationProvider
         */
        protected function getProvider() {
-               $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
+               $request = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'getIP' ] )->getMock();
                $request->expects( $this->any() )->method( 'getIP' )->will( $this->returnValue( '127.0.0.42' ) );
 
                $manager = new AuthManager(
@@ -39,7 +40,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
         * @return object $mock->expects( $expect )->method( ... ).
         */
        protected function hook( $hook, $expect ) {
-               $mock = $this->getMock( __CLASS__, [ "on$hook" ] );
+               $mock = $this->getMockBuilder( __CLASS__ )->setMethods( [ "on$hook" ] )->getMock();
                $this->mergeMwGlobalArrayValue( 'wgHooks', [
                        $hook => [ $mock ],
                ] );
index 72a03c3..4d60342 100644 (file)
@@ -3,6 +3,7 @@
 namespace MediaWiki\Auth;
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group AuthManager
@@ -38,11 +39,10 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                }
                $this->validity = \Status::newGood();
 
-               $provider = $this->getMock(
-                       LocalPasswordPrimaryAuthenticationProvider::class,
-                       [ 'checkPasswordValidity' ],
-                       [ [ 'loginOnly' => $loginOnly ] ]
-               );
+               $provider = $this->getMockBuilder( LocalPasswordPrimaryAuthenticationProvider::class )
+                       ->setMethods( [ 'checkPasswordValidity' ] )
+                       ->setConstructorArgs( [ [ 'loginOnly' => $loginOnly ] ] )
+                       ->getMock();
                $provider->expects( $this->any() )->method( 'checkPasswordValidity' )
                        ->will( $this->returnCallback( function () {
                                return $this->validity;
@@ -132,7 +132,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                $provider->setConfig( $this->config );
                $provider->setLogger( new \Psr\Log\NullLogger() );
                $provider->setManager( $this->manager );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $user = $this->getMutableTestUser()->getUser();
                $userName = $user->getName();
@@ -348,7 +348,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                } elseif ( $type === PasswordDomainAuthenticationRequest::class ) {
                        $req = new $type( [] );
                } else {
-                       $req = $this->getMock( $type );
+                       $req = $this->createMock( $type );
                }
                $req->action = AuthManager::ACTION_CHANGE;
                $req->username = $user;
@@ -444,7 +444,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                if ( $type === PasswordAuthenticationRequest::class ) {
                        $changeReq = new $type();
                } else {
-                       $changeReq = $this->getMock( $type );
+                       $changeReq = $this->createMock( $type );
                }
                $changeReq->action = AuthManager::ACTION_CHANGE;
                $changeReq->username = $user;
@@ -509,7 +509,10 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                $this->assertSame(
                        $expectExpiry,
-                       $dbw->selectField( 'user', 'user_password_expires', [ 'user_name' => $cuser ] )
+                       wfTimestampOrNull(
+                               TS_MW,
+                               $dbw->selectField( 'user', 'user_password_expires', [ 'user_name' => $cuser ] )
+                       )
                );
        }
 
index 3f90169..9bcab77 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group AuthManager
  * @covers MediaWiki\Auth\RememberMeAuthenticationRequest
@@ -17,7 +19,7 @@ class RememberMeAuthenticationRequestTest extends AuthenticationRequestTestCase
 
        public function testGetFieldInfo_2() {
                $req = new RememberMeAuthenticationRequest();
-               $reqWrapper = \TestingAccessWrapper::newFromObject( $req );
+               $reqWrapper = TestingAccessWrapper::newFromObject( $req );
 
                $reqWrapper->expiration = 30 * 24 * 3600;
                $this->assertNotEmpty( $req->getFieldInfo() );
@@ -28,7 +30,7 @@ class RememberMeAuthenticationRequestTest extends AuthenticationRequestTestCase
 
        protected function getInstance( array $args = [] ) {
                $req = new RememberMeAuthenticationRequest();
-               $reqWrapper = \TestingAccessWrapper::newFromObject( $req );
+               $reqWrapper = TestingAccessWrapper::newFromObject( $req );
                $reqWrapper->expiration = $args[0];
                return $req;
        }
index 90ed542..f454a96 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group AuthManager
  * @covers MediaWiki\Auth\ResetPasswordSecondaryAuthenticationProvider
@@ -85,7 +87,7 @@ class ResetPasswordSecondaryAuthenticationProviderTest extends \MediaWikiTestCas
                ] );
                $manager = new AuthManager( new \FauxRequest, $config );
                $provider->setManager( $manager );
-               $provider = \TestingAccessWrapper::newFromObject( $provider );
+               $provider = TestingAccessWrapper::newFromObject( $provider );
 
                $msg = wfMessage( 'foo' );
                $skipReq = new ButtonAuthenticationRequest(
index bc7d65e..6f45fa4 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Auth;
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group AuthManager
@@ -42,11 +43,10 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                $this->validity = \Status::newGood();
 
                $mockedMethods[] = 'checkPasswordValidity';
-               $provider = $this->getMock(
-                       TemporaryPasswordPrimaryAuthenticationProvider::class,
-                       $mockedMethods,
-                       [ $params ]
-               );
+               $provider = $this->getMockBuilder( TemporaryPasswordPrimaryAuthenticationProvider::class )
+                       ->setMethods( $mockedMethods )
+                       ->setConstructorArgs( [ $params ] )
+                       ->getMock();
                $provider->expects( $this->any() )->method( 'checkPasswordValidity' )
                        ->will( $this->returnCallback( function () {
                                return $this->validity;
@@ -107,13 +107,13 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                        'PasswordReminderResendTime' => 101,
                ] );
 
-               $p = \TestingAccessWrapper::newFromObject( new TemporaryPasswordPrimaryAuthenticationProvider() );
+               $p = TestingAccessWrapper::newFromObject( new TemporaryPasswordPrimaryAuthenticationProvider() );
                $p->setConfig( $config );
                $this->assertSame( false, $p->emailEnabled );
                $this->assertSame( 100, $p->newPasswordExpiry );
                $this->assertSame( 101, $p->passwordReminderResendTime );
 
-               $p = \TestingAccessWrapper::newFromObject( new TemporaryPasswordPrimaryAuthenticationProvider( [
+               $p = TestingAccessWrapper::newFromObject( new TemporaryPasswordPrimaryAuthenticationProvider( [
                        'emailEnabled' => true,
                        'newPasswordExpiry' => 42,
                        'passwordReminderResendTime' => 43,
@@ -136,7 +136,7 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                $pwhash = $passwordFactory->newFromPlaintext( 'password' )->toString();
 
                $provider = $this->getProvider();
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $this->assertFalse( $provider->testUserCanAuthenticate( '<invalid>' ) );
                $this->assertFalse( $provider->testUserCanAuthenticate( 'DoesNotExist' ) );
@@ -250,7 +250,7 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                $reqs = [ PasswordAuthenticationRequest::class => $req ];
 
                $provider = $this->getProvider();
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
 
                $providerPriv->newPasswordExpiry = 100;
 
@@ -366,7 +366,7 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                ) {
                        $req = new $type();
                } else {
-                       $req = $this->getMock( $type );
+                       $req = $this->createMock( $type );
                }
                $req->action = AuthManager::ACTION_CHANGE;
                $req->username = $user;
@@ -446,7 +446,7 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                ) {
                        $changeReq = new $type();
                } else {
-                       $changeReq = $this->getMock( $type );
+                       $changeReq = $this->createMock( $type );
                }
                $changeReq->action = AuthManager::ACTION_CHANGE;
                $changeReq->username = $user;
@@ -574,7 +574,7 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                ScopedCallback::consume( $resetMailer );
                $this->assertTrue( $mailed );
 
-               $priv = \TestingAccessWrapper::newFromObject( $provider );
+               $priv = TestingAccessWrapper::newFromObject( $provider );
                $req->username = '<invalid>';
                $status = $priv->sendPasswordResetEmail( $req );
                $this->assertEquals( \Status::newFatal( 'noname' ), $status );
index 2f3e27c..58982de 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group AuthManager
  * @group Database
@@ -10,7 +12,7 @@ namespace MediaWiki\Auth;
 class ThrottlePreAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testConstructor() {
                $provider = new ThrottlePreAuthenticationProvider();
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
                $config = new \HashConfig( [
                        'AccountCreationThrottle' => [ [
                                'count' => 123,
@@ -26,11 +28,11 @@ class ThrottlePreAuthenticationProviderTest extends \MediaWikiTestCase {
                        'accountCreationThrottle' => [ [ 'count' => 123, 'seconds' => 86400 ] ],
                        'passwordAttemptThrottle' => [ [ 'count' => 5, 'seconds' => 300 ] ]
                ], $providerPriv->throttleSettings );
-               $accountCreationThrottle = \TestingAccessWrapper::newFromObject(
+               $accountCreationThrottle = TestingAccessWrapper::newFromObject(
                        $providerPriv->accountCreationThrottle );
                $this->assertSame( [ [ 'count' => 123, 'seconds' => 86400 ] ],
                        $accountCreationThrottle->conditions );
-               $passwordAttemptThrottle = \TestingAccessWrapper::newFromObject(
+               $passwordAttemptThrottle = TestingAccessWrapper::newFromObject(
                        $providerPriv->passwordAttemptThrottle );
                $this->assertSame( [ [ 'count' => 5, 'seconds' => 300 ] ],
                        $passwordAttemptThrottle->conditions );
@@ -39,7 +41,7 @@ class ThrottlePreAuthenticationProviderTest extends \MediaWikiTestCase {
                        'accountCreationThrottle' => [ [ 'count' => 43, 'seconds' => 10000 ] ],
                        'passwordAttemptThrottle' => [ [ 'count' => 11, 'seconds' => 100 ] ],
                ] );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
                $config = new \HashConfig( [
                        'AccountCreationThrottle' => [ [
                                'count' => 123,
@@ -58,15 +60,15 @@ class ThrottlePreAuthenticationProviderTest extends \MediaWikiTestCase {
 
                $cache = new \HashBagOStuff();
                $provider = new ThrottlePreAuthenticationProvider( [ 'cache' => $cache ] );
-               $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
+               $providerPriv = TestingAccessWrapper::newFromObject( $provider );
                $provider->setConfig( new \HashConfig( [
                        'AccountCreationThrottle' => [ [ 'count' => 1, 'seconds' => 1 ] ],
                        'PasswordAttemptThrottle' => [ [ 'count' => 1, 'seconds' => 1 ] ],
                ] ) );
-               $accountCreationThrottle = \TestingAccessWrapper::newFromObject(
+               $accountCreationThrottle = TestingAccessWrapper::newFromObject(
                        $providerPriv->accountCreationThrottle );
                $this->assertSame( $cache, $accountCreationThrottle->cache );
-               $passwordAttemptThrottle = \TestingAccessWrapper::newFromObject(
+               $passwordAttemptThrottle = TestingAccessWrapper::newFromObject(
                        $providerPriv->passwordAttemptThrottle );
                $this->assertSame( $cache, $passwordAttemptThrottle->cache );
        }
@@ -119,7 +121,9 @@ class ThrottlePreAuthenticationProviderTest extends \MediaWikiTestCase {
                $user = \User::newFromName( 'RandomUser' );
                $creator = \User::newFromName( $creatorname );
                if ( $hook ) {
-                       $mock = $this->getMock( 'stdClass', [ 'onExemptFromAccountCreationThrottle' ] );
+                       $mock = $this->getMockBuilder( 'stdClass' )
+                               ->setMethods( [ 'onExemptFromAccountCreationThrottle' ] )
+                               ->getMock();
                        $mock->expects( $this->any() )->method( 'onExemptFromAccountCreationThrottle' )
                                ->will( $this->returnValue( false ) );
                        $this->mergeMwGlobalArrayValue( 'wgHooks', [
index c945885..f52048a 100644 (file)
@@ -8,6 +8,7 @@ use InvalidArgumentException;
 use Psr\Log\AbstractLogger;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group AuthManager
@@ -25,7 +26,7 @@ class ThrottlerTest extends \MediaWikiTestCase {
                        [ 'type' => 'foo', 'cache' => $cache ]
                );
                $throttler->setLogger( $logger );
-               $throttlerPriv = \TestingAccessWrapper::newFromObject( $throttler );
+               $throttlerPriv = TestingAccessWrapper::newFromObject( $throttler );
                $this->assertSame( [ [ 'count' => 123, 'seconds' => 456 ] ], $throttlerPriv->conditions );
                $this->assertSame( 'foo', $throttlerPriv->type );
                $this->assertSame( $cache, $throttlerPriv->cache );
@@ -33,7 +34,7 @@ class ThrottlerTest extends \MediaWikiTestCase {
 
                $throttler = new Throttler( [ [ 'count' => 123, 'seconds' => 456 ] ] );
                $throttler->setLogger( new NullLogger() );
-               $throttlerPriv = \TestingAccessWrapper::newFromObject( $throttler );
+               $throttlerPriv = TestingAccessWrapper::newFromObject( $throttler );
                $this->assertSame( [ [ 'count' => 123, 'seconds' => 456 ] ], $throttlerPriv->conditions );
                $this->assertSame( 'custom', $throttlerPriv->type );
                $this->assertInstanceOf( BagOStuff::class, $throttlerPriv->cache );
@@ -43,7 +44,7 @@ class ThrottlerTest extends \MediaWikiTestCase {
                        'seconds' => 654 ] ] ] );
                $throttler = new Throttler();
                $throttler->setLogger( new NullLogger() );
-               $throttlerPriv = \TestingAccessWrapper::newFromObject( $throttler );
+               $throttlerPriv = TestingAccessWrapper::newFromObject( $throttler );
                $this->assertSame( [ [ 'count' => 321, 'seconds' => 654 ] ], $throttlerPriv->conditions );
                $this->assertSame( 'password', $throttlerPriv->type );
                $this->assertInstanceOf( BagOStuff::class, $throttlerPriv->cache );
@@ -63,7 +64,7 @@ class ThrottlerTest extends \MediaWikiTestCase {
        public function testNormalizeThrottleConditions( $condition, $normalized ) {
                $throttler = new Throttler( $condition );
                $throttler->setLogger( new NullLogger() );
-               $throttlerPriv = \TestingAccessWrapper::newFromObject( $throttler );
+               $throttlerPriv = TestingAccessWrapper::newFromObject( $throttler );
                $this->assertSame( $normalized, $throttlerPriv->conditions );
        }
 
@@ -85,7 +86,7 @@ class ThrottlerTest extends \MediaWikiTestCase {
        }
 
        public function testNormalizeThrottleConditions2() {
-               $priv = \TestingAccessWrapper::newFromClass( Throttler::class );
+               $priv = TestingAccessWrapper::newFromClass( Throttler::class );
                $this->assertSame( [], $priv->normalizeThrottleConditions( null ) );
                $this->assertSame( [], $priv->normalizeThrottleConditions( 'bad' ) );
        }
@@ -163,7 +164,8 @@ class ThrottlerTest extends \MediaWikiTestCase {
        }
 
        public function testExpiration() {
-               $cache = $this->getMock( HashBagOStuff::class, [ 'add' ] );
+               $cache = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'add' ] )->getMock();
                $throttler = new Throttler( [ [ 'count' => 3, 'seconds' => 10 ] ], [ 'cache' => $cache ] );
                $throttler->setLogger( new NullLogger() );
 
diff --git a/tests/phpunit/includes/changes/ChangesListBooleanFilterGroupTest.php b/tests/phpunit/includes/changes/ChangesListBooleanFilterGroupTest.php
new file mode 100644 (file)
index 0000000..07dec05
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+
+use Wikimedia\TestingAccessWrapper;
+
+/**
+ * @covers ChangesListBooleanFilterGroup
+ */
+class ChangesListBooleanFilterGroupTest extends MediaWikiTestCase {
+       public function testIsFullCoverage() {
+               $hideGroupDefault = TestingAccessWrapper::newFromObject(
+                       new ChangesListBooleanFilterGroup( [
+                               'name' => 'groupName',
+                               'priority' => 1,
+                               'filters' => [],
+                       ] )
+               );
+
+               $this->assertSame(
+                       true,
+                       $hideGroupDefault->isFullCoverage
+               );
+       }
+
+       public function testGetJsData() {
+               $definition = [
+                       'name' => 'some-group',
+                       'title' => 'some-group-title',
+                       'priority' => 1,
+                       'filters' => [
+                               [
+                                       'name' => 'hidefoo',
+                                       'label' => 'foo-label',
+                                       'description' => 'foo-description',
+                                       'default' => true,
+                                       'showHide' => 'showhidefoo',
+                                       'priority' => 2,
+                               ],
+                               [
+                                       'name' => 'hidebar',
+                                       'label' => 'bar-label',
+                                       'description' => 'bar-description',
+                                       'default' => false,
+                                       'priority' => 4,
+                               ]
+                       ],
+               ];
+
+               $group = new ChangesListBooleanFilterGroup( $definition );
+
+               $this->assertArrayEquals(
+                       [
+                               'name' => 'some-group',
+                               'title' => 'some-group-title',
+                               'type' => ChangesListBooleanFilterGroup::TYPE,
+                               'priority' => 1,
+                               'filters' => [
+                                       [
+                                               'name' => 'hidebar',
+                                               'label' => 'bar-label',
+                                               'description' => 'bar-description',
+                                               'default' => false,
+                                               'priority' => 4,
+                                               'cssClass' => null,
+                                               'conflicts' => [],
+                                               'subset' => [],
+                                       ],
+                                       [
+                                               'name' => 'hidefoo',
+                                               'label' => 'foo-label',
+                                               'description' => 'foo-description',
+                                               'default' => true,
+                                               'priority' => 2,
+                                               'cssClass' => null,
+                                               'conflicts' => [],
+                                               'subset' => [],
+                                       ],
+                               ],
+                               'conflicts' => [],
+                               'fullCoverage' => true,
+                               'messageKeys' => [
+                                       'some-group-title',
+                                       'bar-label',
+                                       'bar-description',
+                                       'foo-label',
+                                       'foo-description',
+                               ],
+                       ],
+
+                       $group->getJsData(),
+                       /** ordered= */ false,
+                       /** named= */ true
+               );
+       }
+}
diff --git a/tests/phpunit/includes/changes/ChangesListBooleanFilterTest.php b/tests/phpunit/includes/changes/ChangesListBooleanFilterTest.php
new file mode 100644 (file)
index 0000000..000f017
--- /dev/null
@@ -0,0 +1,164 @@
+<?php
+
+/**
+ * @covers ChangesListBooleanFilter
+ */
+class ChangesListBooleanFilterTest extends MediaWikiTestCase {
+       public function testGetJsData() {
+               $group = new ChangesListBooleanFilterGroup( [
+                       'name' => 'group',
+                       'priority' => 2,
+                       'filters' => [],
+               ] );
+
+               $definition = [
+                       'group' => $group,
+                       'label' => 'main-label',
+                       'description' => 'main-description',
+                       'default' => 1,
+                       'priority' => 1,
+               ];
+
+               $fooFilter = new ChangesListBooleanFilter(
+                       $definition + [ 'name' => 'hidefoo' ]
+               );
+
+               $barFilter = new ChangesListBooleanFilter(
+                       $definition + [ 'name' => 'hidebar' ]
+               );
+
+               $bazFilter = new ChangesListBooleanFilter(
+                       $definition + [ 'name' => 'hidebaz' ]
+               );
+
+               $fooFilter->conflictsWith(
+                       $barFilter,
+                       'foo-bar-global-conflict',
+                       'foo-conflicts-bar',
+                       'bar-conflicts-foo'
+               );
+
+               $fooFilter->setAsSupersetOf( $bazFilter, 'foo-superset-of-baz' );
+
+               $fooData = $fooFilter->getJsData();
+               $this->assertArrayEquals(
+                       [
+                               'name' => 'hidefoo',
+                               'label' => 'main-label',
+                               'description' => 'main-description',
+                               'default' => 1,
+                               'priority' => 1,
+                               'cssClass' => null,
+                               'conflicts' => [
+                                       [
+                                               'group' => 'group',
+                                               'filter' => 'hidebar',
+                                               'globalDescription' => 'foo-bar-global-conflict',
+                                               'contextDescription' => 'foo-conflicts-bar',
+                                       ]
+                               ],
+                               'subset' => [
+                                       [
+                                               'group' => 'group',
+                                               'filter' => 'hidebaz',
+                                       ],
+
+                               ],
+                               'messageKeys' => [
+                                       'main-label',
+                                       'main-description',
+                                       'foo-bar-global-conflict',
+                                       'foo-conflicts-bar',
+                               ],
+                       ],
+                       $fooData,
+                       /** ordered= */ false,
+                       /** named= */ true
+               );
+
+               $barData = $barFilter->getJsData();
+               $this->assertArrayEquals(
+                       [
+                               'name' => 'hidebar',
+                               'label' => 'main-label',
+                               'description' => 'main-description',
+                               'default' => 1,
+                               'priority' => 1,
+                               'cssClass' => null,
+                               'conflicts' => [
+                                       [
+                                               'group' => 'group',
+                                               'filter' => 'hidefoo',
+                                               'globalDescription' => 'foo-bar-global-conflict',
+                                               'contextDescription' => 'bar-conflicts-foo',
+                                       ]
+                               ],
+                               'subset' => [],
+                               'messageKeys' => [
+                                       'main-label',
+                                       'main-description',
+                                       'foo-bar-global-conflict',
+                                       'bar-conflicts-foo',
+                               ],
+                       ],
+                       $barData,
+                       /** ordered= */ false,
+                       /** named= */ true
+               );
+       }
+
+       public function testIsFeatureAvailableOnStructuredUi() {
+               $groupA = new ChangesListBooleanFilterGroup( [
+                       'name' => 'groupA',
+                       'priority' => 1,
+                       'filters' => [],
+               ] );
+
+               $foo = new ChangesListBooleanFilter( [
+                       'name' => 'hidefoo',
+                       'group' => $groupA,
+                       'label' => 'foo-label',
+                       'description' => 'foo-description',
+                       'default' => true,
+                       'showHide' => 'showhidefoo',
+                       'priority' => 2,
+               ] );
+
+               $this->assertEquals(
+                       true,
+                       $foo->isFeatureAvailableOnStructuredUi(),
+                       'Same filter appears on both'
+               );
+
+               // Should only be legacy ones that haven't been ported yet
+               $bar = new ChangesListBooleanFilter( [
+                       'name' => 'hidebar',
+                       'default' => true,
+                       'group' => $groupA,
+                       'showHide' => 'showhidebar',
+                       'priority' => 2,
+               ] );
+
+               $this->assertEquals(
+                       false,
+                       $bar->isFeatureAvailableOnStructuredUi(),
+                       'Only on unstructured UI'
+               );
+
+               $baz = new ChangesListBooleanFilter( [
+                       'name' => 'hidebaz',
+                       'default' => true,
+                       'group' => $groupA,
+                       'showHide' => 'showhidebaz',
+                       'isReplacedInStructuredUi' => true,
+                       'priority' => 2,
+               ] );
+
+               $this->assertEquals(
+                       true,
+                       $baz->isFeatureAvailableOnStructuredUi(),
+                       'Legacy filter does not appear directly in new UI, but equivalent ' .
+                               'does and is marked with isReplacedInStructuredUi'
+               );
+       }
+}
diff --git a/tests/phpunit/includes/changes/ChangesListFilterGroupTest.php b/tests/phpunit/includes/changes/ChangesListFilterGroupTest.php
new file mode 100644 (file)
index 0000000..465a9d1
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @covers ChangesListFilterGroup
+ */
+class ChangesListFilterGroupTest extends MediaWikiTestCase {
+       // @codingStandardsIgnoreStart
+       /**
+        * @expectedException MWException
+        * @expectedExceptionMessage Group names may not contain '_'.  Use the naming convention: 'camelCase'
+        */
+       // @codingStandardsIgnoreEnd
+       public function testReservedCharacter() {
+               new MockChangesListFilterGroup(
+                       [
+                               'type' => 'some_type',
+                               'name' => 'group_name',
+                               'priority' => 1,
+                               'filters' => [],
+                       ]
+               );
+       }
+
+       public function testAutoPriorities() {
+               $group = new MockChangesListFilterGroup(
+                       [
+                               'type' => 'some_type',
+                               'name' => 'groupName',
+                               'isFullCoverage' => true,
+                               'priority' => 1,
+                               'filters' => [
+                                       [ 'name' => 'hidefoo' ],
+                                       [ 'name' => 'hidebar' ],
+                                       [ 'name' => 'hidebaz' ],
+                               ],
+                       ]
+               );
+
+               $filters = $group->getFilters();
+               $this->assertEquals(
+                       [
+                               -2,
+                               -3,
+                               -4,
+                       ],
+                       array_map(
+                               function ( $f ) {
+                                       return $f->getPriority();
+                               },
+                               array_values( $filters )
+                       )
+               );
+       }
+
+       // Get without warnings
+       public function testGetFilter() {
+               $group = new MockChangesListFilterGroup(
+                       [
+                               'type' => 'some_type',
+                               'name' => 'groupName',
+                               'isFullCoverage' => true,
+                               'priority' => 1,
+                               'filters' => [
+                                       [ 'name' => 'foo' ],
+                               ],
+                       ]
+               );
+
+               $this->assertEquals(
+                       'foo',
+                       $group->getFilter( 'foo' )->getName()
+               );
+
+               $this->assertEquals(
+                       null,
+                       $group->getFilter( 'bar' )
+               );
+       }
+}
diff --git a/tests/phpunit/includes/changes/ChangesListFilterTest.php b/tests/phpunit/includes/changes/ChangesListFilterTest.php
new file mode 100644 (file)
index 0000000..0015453
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+
+use Wikimedia\TestingAccessWrapper;
+
+/**
+ * @covers ChangesListFilter
+ */
+class ChangesListFilterTest extends MediaWikiTestCase {
+       protected $group;
+
+       public function setUp() {
+               $this->group = $this->getGroup( [ 'name' => 'group' ] );
+
+               parent::setUp();
+       }
+
+       protected function getGroup( $groupDefinition ) {
+               return new MockChangesListFilterGroup(
+                       $groupDefinition + [
+                               'isFullCoverage' => true,
+                               'type' => 'some_type',
+                               'name' => 'group',
+                               'filters' => [],
+                       ]
+               );
+       }
+
+       // @codingStandardsIgnoreStart
+       /**
+        * @expectedException MWException
+        * @expectedExceptionMessage Filter names may not contain '_'.  Use the naming convention: 'lowercase'
+        */
+       // @codingStandardsIgnoreEnd
+       public function testReservedCharacter() {
+               $filter = new MockChangesListFilter(
+                       [
+                               'group' => $this->group,
+                               'name' => 'some_name',
+                               'priority' => 1,
+                       ]
+               );
+       }
+
+       // @codingStandardsIgnoreStart
+       /**
+        * @expectedException MWException
+        * @expectedExceptionMessage Two filters in a group cannot have the same name: 'somename'
+        */
+       // @codingStandardsIgnoreEnd
+       public function testDuplicateName() {
+               new MockChangesListFilter(
+                       [
+                               'group' => $this->group,
+                               'name' => 'somename',
+                               'priority' => 1,
+                       ]
+               );
+
+               new MockChangesListFilter(
+                       [
+                               'group' => $this->group,
+                               'name' => 'somename',
+                               'priority' => 2,
+                       ]
+               );
+       }
+
+       /**
+        * @expectedException MWException
+        * @expectedExceptionMessage Supersets can only be defined for filters in the same group
+        */
+       public function testSetAsSupersetOf() {
+               $groupA = $this->getGroup(
+                       [
+                               'name' => 'groupA',
+                               'filters' => [
+                                       [
+                                               'name' => 'foo',
+                                       ],
+                                       [
+                                               'name' => 'bar',
+                                       ]
+                               ],
+                       ]
+               );
+
+               $groupB =  $this->getGroup(
+                       [
+                               'name' => 'groupB',
+                               'filters' => [
+                                       [
+                                               'name' => 'baz',
+                                       ],
+                               ],
+                       ]
+               );
+
+               $foo = TestingAccessWrapper::newFromObject( $groupA->getFilter( 'foo' ) );
+
+               $bar = $groupA->getFilter( 'bar' );
+
+               $baz = $groupB->getFilter( 'baz' );
+
+               $foo->setAsSupersetOf( $bar );
+               $this->assertArrayEquals( [
+                               [
+                                       'group' => 'groupA',
+                                       'filter' => 'bar',
+                               ],
+                       ],
+                       $foo->subsetFilters,
+                       /** ordered= */ false,
+                       /** named= */ true
+               );
+
+               $foo->setAsSupersetOf( $baz );
+       }
+}
diff --git a/tests/phpunit/includes/changes/ChangesListStringOptionsFilterGroupTest.php b/tests/phpunit/includes/changes/ChangesListStringOptionsFilterGroupTest.php
new file mode 100644 (file)
index 0000000..04b7ee0
--- /dev/null
@@ -0,0 +1,278 @@
+<?php
+
+use Wikimedia\TestingAccessWrapper;
+
+/**
+ * @covers ChangesListStringOptionsFilterGroup
+ */
+class ChangesListStringOptionsFilterGroupTest extends MediaWikiTestCase {
+       /**
+        * @expectedException MWException
+        */
+       public function testIsFullCoverage() {
+               $falseGroup = TestingAccessWrapper::newFromObject(
+                       new ChangesListStringOptionsFilterGroup( [
+                               'name' => 'group',
+                               'filters' => [],
+                               'isFullCoverage' => false,
+                               'queryCallable' => function () {
+                               }
+                       ] )
+               );
+
+               $this->assertSame(
+                       false,
+                       $falseGroup->isFullCoverage
+               );
+
+               // Should throw due to missing isFullCoverage
+               $undefinedFullCoverageGroup = new ChangesListStringOptionsFilterGroup( [
+                       'name' => 'othergroup',
+                       'filters' => [],
+               ] );
+       }
+
+       /**
+        * @param array $filterDefinitions Array of filter definitions
+        * @param array $expectedValues Array of values callback should receive
+        * @param string $input Value in URL
+        *
+        * @dataProvider provideModifyQuery
+        */
+       public function testModifyQuery( $filterDefinitions, $expectedValues, $input ) {
+               $self = $this;
+
+               $queryCallable = function (
+                       $className,
+                       $ctx,
+                       $dbr,
+                       &$tables,
+                       &$fields,
+                       &$conds,
+                       &$query_options,
+                       &$join_conds,
+                       $actualSelectedValues
+               ) use ( $self, $expectedValues ) {
+                       $self->assertSame(
+                               $expectedValues,
+                               $actualSelectedValues
+                       );
+               };
+
+               $groupDefinition = [
+                       'name' => 'group',
+                       'default' => '',
+                       'isFullCoverage' => true,
+                       'filters' => $filterDefinitions,
+                       'queryCallable' => $queryCallable,
+               ];
+
+               $this->modifyQueryHelper( $groupDefinition, $input );
+       }
+
+       public function provideModifyQuery() {
+               $mixedFilters = [
+                       [
+                               'name' => 'foo',
+                       ],
+                       [
+                               'name' => 'baz',
+                       ],
+                       [
+                               'name' => 'goo'
+                       ],
+               ];
+
+               return [
+                       [
+                               $mixedFilters,
+                               [ 'baz', 'foo', ],
+                               'foo;bar;BaZ;invalid',
+                       ],
+
+                       [
+                               $mixedFilters,
+                               [ 'baz', 'foo', 'goo' ],
+                               'all',
+                       ],
+               ];
+       }
+
+       /**
+        * @param array $filterDefinitions Array of filter definitions
+        * @param string $input Value in URL
+        * @param string $message Message thrown by exception
+        *
+        * @dataProvider provideNoOpModifyQuery
+        */
+       public function testNoOpModifyQuery( $filterDefinitions, $input, $message ) {
+               $noFiltersAllowedCallable = function (
+                       $className,
+                       $ctx,
+                       $dbr,
+                       &$tables,
+                       &$fields,
+                       &$conds,
+                       &$query_options,
+                       &$join_conds,
+                       $actualSelectedValues
+               ) use ( $message ) {
+                       throw new MWException( $message );
+               };
+
+               $groupDefinition = [
+                       'name' => 'group',
+                       'default' => '',
+                       'isFullCoverage' => true,
+                       'filters' => $filterDefinitions,
+                       'queryCallable' => $noFiltersAllowedCallable,
+               ];
+
+               $this->modifyQueryHelper( $groupDefinition, $input );
+
+               $this->assertTrue(
+                       true,
+                       'Test successfully completed without calling queryCallable'
+               );
+       }
+
+       public function provideNoOpModifyQuery() {
+               $noFilters = [];
+
+               $normalFilters = [
+                       [
+                               'name' => 'foo',
+                       ],
+                       [
+                               'name' => 'bar',
+                       ]
+               ];
+
+               return [
+                       [
+                               $noFilters,
+                               'disallowed1;disallowed3',
+                               'The queryCallable should not be called if there are no filters',
+                       ],
+
+                       [
+                               $normalFilters,
+                               '',
+                               'The queryCallable should not be called if no filters are selected',
+                       ],
+
+                       [
+                               $normalFilters,
+                               'invalid1',
+                               'The queryCallable should not be called if no valid filters are selected',
+                       ],
+               ];
+       }
+
+       protected function getSpecialPage() {
+               return $this->getMockBuilder( 'ChangesListSpecialPage' )
+                       ->setConstructorArgs( [
+                                       'ChangesListSpecialPage',
+                                       '',
+                               ] )
+                       ->getMockForAbstractClass();
+       }
+
+       /**
+        * @param array $groupDefinition Group definition
+        * @param string $input Value in URL
+        *
+        * @dataProvider provideModifyQuery
+        */
+       protected function modifyQueryHelper( $groupDefinition, $input ) {
+               $ctx = $this->createMock( 'IContextSource' );
+               $dbr = $this->createMock( 'IDatabase' );
+               $tables = $fields = $conds = $query_options = $join_conds = [];
+
+               $group = new ChangesListStringOptionsFilterGroup( $groupDefinition );
+
+               $specialPage = $this->getSpecialPage();
+
+               $group->modifyQuery(
+                       $dbr,
+                       $specialPage,
+                       $tables,
+                       $fields,
+                       $conds,
+                       $query_options,
+                       $join_conds,
+                       $input
+               );
+       }
+
+       public function testGetJsData() {
+               $definition = [
+                       'name' => 'some-group',
+                       'title' => 'some-group-title',
+                       'default' => 'foo',
+                       'priority' => 1,
+                       'isFullCoverage' => false,
+                       'queryCallable' => function () {
+                       },
+                       'filters' => [
+                               [
+                                       'name' => 'foo',
+                                       'label' => 'foo-label',
+                                       'description' => 'foo-description',
+                                       'priority' => 2,
+                               ],
+                               [
+                                       'name' => 'bar',
+                                       'label' => 'bar-label',
+                                       'description' => 'bar-description',
+                                       'priority' => 4,
+                               ]
+                       ],
+               ];
+
+               $group = new ChangesListStringOptionsFilterGroup( $definition );
+
+               $this->assertArrayEquals(
+                       [
+                               'name' => 'some-group',
+                               'title' => 'some-group-title',
+                               'type' => ChangesListStringOptionsFilterGroup::TYPE,
+                               'default' => 'foo',
+                               'priority' => 1,
+                               'fullCoverage' => false,
+                               'filters' => [
+                                       [
+                                               'name' => 'bar',
+                                               'label' => 'bar-label',
+                                               'description' => 'bar-description',
+                                               'priority' => 4,
+                                               'cssClass' => null,
+                                               'conflicts' => [],
+                                               'subset' => [],
+                                       ],
+                                       [
+                                               'name' => 'foo',
+                                               'label' => 'foo-label',
+                                               'description' => 'foo-description',
+                                               'priority' => 2,
+                                               'cssClass' => null,
+                                               'conflicts' => [],
+                                               'subset' => [],
+                                       ],
+                               ],
+                               'conflicts' => [],
+                               'separator' => ';',
+                               'messageKeys' => [
+                                       'some-group-title',
+                                       'bar-label',
+                                       'bar-description',
+                                       'foo-label',
+                                       'foo-description',
+                               ],
+                       ],
+                       $group->getJsData(),
+                       /** ordered= */ false,
+                       /** named= */ true
+               );
+       }
+}
index 4ff1eb8..97b4c08 100644 (file)
@@ -141,103 +141,69 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
        }
 
+       private function assertValidHTML( $actual ) {
+               // Throws if invalid
+               $doc = PHPUnit_Util_XML::load( $actual, /* isHtml */ true );
+       }
+
        private function assertUserLinks( $user, $cacheEntry ) {
-               $this->assertTag(
-                       [
-                               'tag' => 'a',
-                               'attributes' => [
-                                       'class' => 'new mw-userlink'
-                               ],
-                               'content' => $user
-                       ],
+               $this->assertValidHTML( $cacheEntry->userlink );
+               $this->assertRegExp(
+                       '#^<a .*class="new mw-userlink".*><bdi>' . $user . '</bdi></a>#',
                        $cacheEntry->userlink,
                        'verify user link'
                );
 
-               $this->assertTag(
-                       [
-                               'tag' => 'span',
-                               'attributes' => [
-                                       'class' => 'mw-usertoollinks'
-                               ],
-                               'child' => [
-                                       'tag' => 'a',
-                                       'content' => 'talk',
-                               ]
-                       ],
+               $this->assertValidHTML( $cacheEntry->usertalklink );
+               $this->assertRegExp(
+                       '#^ <span class="mw-usertoollinks">\(.*<a .+>talk</a>.*\)</span>#',
                        $cacheEntry->usertalklink,
                        'verify user talk link'
                );
 
-               $this->assertTag(
-                       [
-                               'tag' => 'span',
-                               'attributes' => [
-                                       'class' => 'mw-usertoollinks'
-                               ],
-                               'child' => [
-                                       'tag' => 'a',
-                                       'content' => 'contribs',
-                               ]
-                       ],
+               $this->assertValidHTML( $cacheEntry->usertalklink );
+               $this->assertRegExp(
+                       '#^ <span class="mw-usertoollinks">\(.*<a .+>contribs</a>.*\)</span>$#',
                        $cacheEntry->usertalklink,
                        'verify user tool links'
                );
        }
 
        private function assertDeleteLogLink( $cacheEntry ) {
-               $this->assertTag(
-                       [
-                               'tag' => 'a',
-                               'attributes' => [
-                                       'href' => '/wiki/Special:Log/delete',
-                                       'title' => 'Special:Log/delete'
-                               ],
-                               'content' => 'Deletion log'
-                       ],
+               $this->assertEquals(
+                       '(<a href="/wiki/Special:Log/delete" title="Special:Log/delete">Deletion log</a>)',
                        $cacheEntry->link,
                        'verify deletion log link'
                );
+
+               $this->assertValidHTML( $cacheEntry->link );
        }
 
        private function assertRevDel( $cacheEntry ) {
-               $this->assertTag(
-                       [
-                               'tag' => 'span',
-                               'attributes' => [
-                                       'class' => 'history-deleted'
-                               ],
-                               'content' => '(username removed)'
-                       ],
+               $this->assertEquals(
+                       ' <span class="history-deleted">(username removed)</span>',
                        $cacheEntry->userlink,
                        'verify user link for change with deleted revision and user'
                );
+               $this->assertValidHTML( $cacheEntry->userlink );
        }
 
        private function assertTitleLink( $title, $cacheEntry ) {
-               $this->assertTag(
-                       [
-                               'tag' => 'a',
-                               'attributes' => [
-                                       'href' => '/wiki/' . $title,
-                                       'title' => $title
-                               ],
-                               'content' => $title
-                       ],
+               $this->assertEquals(
+                       '<a href="/wiki/' . $title . '" title="' . $title . '">' . $title . '</a>',
                        $cacheEntry->link,
                        'verify title link'
                );
+               $this->assertValidHTML( $cacheEntry->link );
        }
 
        private function assertQueryLink( $content, $params, $link ) {
-               $this->assertTag(
-                       [
-                               'tag' => 'a',
-                               'content' => $content
-                       ],
+               $this->assertRegExp(
+                       "#^<a .+>$content</a>$#",
                        $link,
-                       'assert query link element'
+                       'verify query link element'
                );
+               $this->assertValidHTML( $link );
 
                foreach ( $params as $key => $value ) {
                        $this->assertRegExp( '/' . $key . '=' . $value . '/', $link, "verify $key link params" );
index 995c4be..68f9079 100644 (file)
@@ -88,15 +88,14 @@ class RecentChangeTest extends MediaWikiTestCase {
        }
 
        /**
-        * 50 mins and 100 mins are used here as the tests never take that long!
         * @return array
         */
        public function provideIsInRCLifespan() {
                return [
-                       [ 6000, time() - 3000, 0, true ],
-                       [ 3000, time() - 6000, 0, false ],
-                       [ 6000, time() - 3000, 6000, true ],
-                       [ 3000, time() - 6000, 6000, true ],
+                       [ 6000, -3000, 0, true ],
+                       [ 3000, -6000, 0, false ],
+                       [ 6000, -3000, 6000, true ],
+                       [ 3000, -6000, 6000, true ],
                ];
        }
 
@@ -104,8 +103,12 @@ class RecentChangeTest extends MediaWikiTestCase {
         * @covers RecentChange::isInRCLifespan
         * @dataProvider provideIsInRCLifespan
         */
-       public function testIsInRCLifespan( $maxAge, $timestamp, $tolerance, $expected ) {
+       public function testIsInRCLifespan( $maxAge, $offset, $tolerance, $expected ) {
                $this->setMwGlobals( 'wgRCMaxAge', $maxAge );
+               // Calculate this here instead of the data provider because the provider
+               // is expanded early on and the full test suite may take longer than 100 minutes
+               // when coverage is enabled.
+               $timestamp = time() + $offset;
                $this->assertEquals( $expected, RecentChange::isInRCLifespan( $timestamp, $tolerance ) );
        }
 
diff --git a/tests/phpunit/includes/collation/CollationTest.php b/tests/phpunit/includes/collation/CollationTest.php
new file mode 100644 (file)
index 0000000..25911a7
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+
+/**
+ * Class CollationTest
+ * @covers Collation
+ * @covers IcuCollation
+ * @covers IdentityCollation
+ * @covers UppercaseCollation
+ */
+class CollationTest extends MediaWikiLangTestCase {
+       protected function setUp() {
+               parent::setUp();
+               $this->checkPHPExtension( 'intl' );
+       }
+
+       /**
+        * Test to make sure, that if you
+        * have "X" and "XY", the binary
+        * sortkey also has "X" being a
+        * prefix of "XY". Our collation
+        * code makes this assumption.
+        *
+        * @param string $lang Language code for collator
+        * @param string $base Base string
+        * @param string $extended String containing base as a prefix.
+        *
+        * @dataProvider prefixDataProvider
+        */
+       public function testIsPrefix( $lang, $base, $extended ) {
+               $cp = Collator::create( $lang );
+               $cp->setStrength( Collator::PRIMARY );
+               $baseBin = $cp->getSortKey( $base );
+               // Remove sortkey terminator
+               $baseBin = rtrim( $baseBin, "\0" );
+               $extendedBin = $cp->getSortKey( $extended );
+               $this->assertStringStartsWith( $baseBin, $extendedBin, "$base is not a prefix of $extended" );
+       }
+
+       public static function prefixDataProvider() {
+               return [
+                       [ 'en', 'A', 'AA' ],
+                       [ 'en', 'A', 'AAA' ],
+                       [ 'en', 'Д', 'ДЂ' ],
+                       [ 'en', 'Д', 'ДA' ],
+                       // 'Ʒ' should expand to 'Z ' (note space).
+                       [ 'fi', 'Z', 'Ʒ' ],
+                       // 'Þ' should expand to 'th'
+                       [ 'sv', 't', 'Þ' ],
+                       // Javanese is a limited use alphabet, so should have 3 bytes
+                       // per character, so do some tests with it.
+                       [ 'en', 'ꦲ', 'ꦲꦤ' ],
+                       [ 'en', 'ꦲ', 'ꦲД' ],
+                       [ 'en', 'A', 'Aꦲ' ],
+               ];
+       }
+
+       /**
+        * Opposite of testIsPrefix
+        *
+        * @dataProvider notPrefixDataProvider
+        */
+       public function testNotIsPrefix( $lang, $base, $extended ) {
+               $cp = Collator::create( $lang );
+               $cp->setStrength( Collator::PRIMARY );
+               $baseBin = $cp->getSortKey( $base );
+               // Remove sortkey terminator
+               $baseBin = rtrim( $baseBin, "\0" );
+               $extendedBin = $cp->getSortKey( $extended );
+               $this->assertStringStartsNotWith( $baseBin, $extendedBin, "$base is a prefix of $extended" );
+       }
+
+       public static function notPrefixDataProvider() {
+               return [
+                       [ 'en', 'A', 'B' ],
+                       [ 'en', 'AC', 'ABC' ],
+                       [ 'en', 'Z', 'Ʒ' ],
+                       [ 'en', 'A', 'ꦲ' ],
+               ];
+       }
+
+       /**
+        * Test correct first letter is fetched.
+        *
+        * @param string $collation Collation name (aka uca-en)
+        * @param string $string String to get first letter of
+        * @param string $firstLetter Expected first letter.
+        *
+        * @dataProvider firstLetterProvider
+        */
+       public function testGetFirstLetter( $collation, $string, $firstLetter ) {
+               $col = Collation::factory( $collation );
+               $this->assertEquals( $firstLetter, $col->getFirstLetter( $string ) );
+       }
+
+       function firstLetterProvider() {
+               return [
+                       [ 'uppercase', 'Abc', 'A' ],
+                       [ 'uppercase', 'abc', 'A' ],
+                       [ 'identity', 'abc', 'a' ],
+                       [ 'uca-en', 'abc', 'A' ],
+                       [ 'uca-en', ' ', ' ' ],
+                       [ 'uca-en', 'Êveryone', 'E' ],
+                       [ 'uca-vi', 'Êveryone', 'Ê' ],
+                       // Make sure thorn is not a first letter.
+                       [ 'uca-sv', 'The', 'T' ],
+                       [ 'uca-sv', 'Å', 'Å' ],
+                       [ 'uca-hu', 'dzsdo', 'Dzs' ],
+                       [ 'uca-hu', 'dzdso', 'Dz' ],
+                       [ 'uca-hu', 'CSD', 'Cs' ],
+                       [ 'uca-root', 'CSD', 'C' ],
+                       [ 'uca-fi', 'Ǥ', 'G' ],
+                       [ 'uca-fi', 'Ŧ', 'T' ],
+                       [ 'uca-fi', 'Ʒ', 'Z' ],
+                       [ 'uca-fi', 'Ŋ', 'N' ],
+                       [ 'uppercase-ba', 'в', 'В' ],
+               ];
+       }
+}
diff --git a/tests/phpunit/includes/collation/CustomUppercaseCollationTest.php b/tests/phpunit/includes/collation/CustomUppercaseCollationTest.php
new file mode 100644 (file)
index 0000000..5d5317b
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+
+class CustomUppercaseCollationTest extends MediaWikiTestCase {
+
+       public function setUp() {
+               $this->collation = new CustomUppercaseCollation( [
+                       'D',
+                       'C',
+                       'B'
+               ], Language::factory( 'en' ) );
+
+               parent::setUp();
+       }
+
+       /**
+        * @dataProvider providerOrder
+        */
+       public function testOrder( $first, $second, $msg ) {
+               $sortkey1 = $this->collation->getSortKey( $first );
+               $sortkey2 = $this->collation->getSortKey( $second );
+
+               $this->assertTrue( strcmp( $sortkey1, $sortkey2 ) < 0, $msg );
+       }
+
+       public function providerOrder() {
+               return [
+                       [ 'X', 'Z', 'Maintain order of unrearranged' ],
+                       [ 'D', 'C', 'Actually resorts' ],
+                       [ 'D', 'B', 'resort test 2' ],
+                       [ 'Adobe', 'Abode', 'not first letter' ],
+                       [ '💩 ', 'C', 'Test relocated to end' ],
+                       [ 'c', 'b', 'lowercase' ],
+                       [ 'x', 'z', 'lowercase original' ],
+                       [ 'C50D', 'C100', 'Numbers' ]
+               ];
+       }
+
+       /**
+        * @dataProvider provideGetFirstLetter
+        */
+       public function testGetFirstLetter( $string, $first ) {
+               $this->assertSame( $this->collation->getFirstLetter( $string ), $first );
+       }
+
+       public function provideGetFirstLetter() {
+               return [
+                       [ 'Do', 'D' ],
+                       [ 'do', 'D' ],
+                       [ 'Ao', 'A' ],
+                       [ 'afdsa', 'A' ],
+                       [ "\xF3\xB3\x80\x80Foo", 'D' ],
+                       [ "\xF3\xB3\x80\x81Foo", 'C' ],
+                       [ "\xF3\xB3\x80\x82Foo", 'B' ],
+                       [ "\xF3\xB3\x80\x83Foo", "\xF3\xB3\x80\x83" ],
+               ];
+       }
+}
diff --git a/tests/phpunit/includes/config/EtcdConfigTest.php b/tests/phpunit/includes/config/EtcdConfigTest.php
new file mode 100644 (file)
index 0000000..763bfa8
--- /dev/null
@@ -0,0 +1,362 @@
+<?php
+
+class EtcConfigTest extends PHPUnit_Framework_TestCase {
+
+       private function createConfigMock( array $options = [] ) {
+               return $this->getMockBuilder( EtcdConfig::class )
+                       ->setConstructorArgs( [ $options + [
+                               'host' => 'etcd-tcp.example.net',
+                               'directory' => '/',
+                               'timeout' => 0.1,
+                       ] ] )
+                       ->setMethods( [ 'fetchAllFromEtcd' ] )
+                       ->getMock();
+       }
+
+       private function createSimpleConfigMock( array $config ) {
+               $mock = $this->createConfigMock();
+               $mock->expects( $this->once() )->method( 'fetchAllFromEtcd' )
+                       ->willReturn( [
+                               $config,
+                               null, // error
+                               false // retry?
+                       ] );
+               return $mock;
+       }
+
+       /**
+        * @covers EtcdConfig::has
+        */
+       public function testHasKnown() {
+               $config = $this->createSimpleConfigMock( [
+                       'known' => 'value'
+               ] );
+               $this->assertSame( true, $config->has( 'known' ) );
+       }
+
+       /**
+        * @covers EtcdConfig::__construct
+        * @covers EtcdConfig::get
+        */
+       public function testGetKnown() {
+               $config = $this->createSimpleConfigMock( [
+                       'known' => 'value'
+               ] );
+               $this->assertSame( 'value', $config->get( 'known' ) );
+       }
+
+       /**
+        * @covers EtcdConfig::has
+        */
+       public function testHasUnknown() {
+               $config = $this->createSimpleConfigMock( [
+                       'known' => 'value'
+               ] );
+               $this->assertSame( false, $config->has( 'unknown' ) );
+       }
+
+       /**
+        * @covers EtcdConfig::get
+        */
+       public function testGetUnknown() {
+               $config = $this->createSimpleConfigMock( [
+                       'known' => 'value'
+               ] );
+               $this->setExpectedException( ConfigException::class );
+               $config->get( 'unknown' );
+       }
+
+       /**
+        * @covers EtcdConfig::__construct
+        */
+       public function testConstructCacheObj() {
+               $cache = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'get' ] )
+                       ->getMock();
+               $cache->expects( $this->once() )->method( 'get' )
+                       ->willReturn( [
+                               'config' => [ 'known' => 'from-cache' ],
+                               'expires' => INF,
+                       ] );
+               $config = $this->createConfigMock( [ 'cache' => $cache ] );
+
+               $this->assertSame( 'from-cache', $config->get( 'known' ) );
+       }
+
+       /**
+        * @covers EtcdConfig::__construct
+        */
+       public function testConstructCacheSpec() {
+               $config = $this->createConfigMock( [ 'cache' => [
+                       'class' =>  HashBagOStuff::class
+               ] ] );
+               $config->expects( $this->once() )->method( 'fetchAllFromEtcd' )
+                       ->willReturn( [
+                               [ 'known' => 'from-fetch' ],
+                               null, // error
+                               false // retry?
+                       ] );
+
+               $this->assertSame( 'from-fetch', $config->get( 'known' ) );
+       }
+
+       /**
+        * Test matrix
+        *
+        * - [x] Cache miss
+        *       Result: Fetched value
+        *       > cache miss | gets lock | backend succeeds
+        *
+        * - [x] Cache miss with backend error
+        *       Result: ConfigException
+        *       > cache miss | gets lock | backend error (no retry)
+        *
+        * - [x] Cache hit after retry
+        *       Result: Cached value (populated by process holding lock)
+        *       > cache miss | no lock | cache retry
+        *
+        * - [x] Cache hit
+        *       Result: Cached value
+        *       > cache hit
+        *
+        * - [x] Process cache hit
+        *       Result: Cached value
+        *       > process cache hit
+        *
+        * - [x] Cache expired
+        *       Result: Fetched value
+        *       > cache expired | gets lock | backend succeeds
+        *
+        * - [x] Cache expired with backend failure
+        *       Result: Cached value (stale)
+        *       > cache expired | gets lock | backend fails (allows retry)
+        *
+        * - [x] Cache expired and no lock
+        *       Result: Cached value (stale)
+        *       > cache expired | no lock
+        *
+        * Other notable scenarios:
+        *
+        * - [ ] Cache miss with backend retry
+        *       Result: Fetched value
+        *       > cache expired | gets lock | backend failure (allows retry)
+        */
+
+       /**
+        * @covers EtcdConfig::load
+        */
+       public function testLoadCacheMiss() {
+               // Create cache mock
+               $cache = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'get', 'lock' ] )
+                       ->getMock();
+               // .. misses cache
+               $cache->expects( $this->once() )->method( 'get' )
+                       ->willReturn( false );
+               // .. gets lock
+               $cache->expects( $this->once() )->method( 'lock' )
+                       ->willReturn( true );
+
+               // Create config mock
+               $mock = $this->createConfigMock( [
+                       'cache' => $cache,
+               ] );
+               $mock->expects( $this->once() )->method( 'fetchAllFromEtcd' )
+                       ->willReturn( [ [ 'known' => 'from-fetch' ], null, false ] );
+
+               $this->assertSame( 'from-fetch', $mock->get( 'known' ) );
+       }
+
+       /**
+        * @covers EtcdConfig::load
+        */
+       public function testLoadCacheMissBackendError() {
+               // Create cache mock
+               $cache = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'get', 'lock' ] )
+                       ->getMock();
+               // .. misses cache
+               $cache->expects( $this->once() )->method( 'get' )
+                       ->willReturn( false );
+               // .. gets lock
+               $cache->expects( $this->once() )->method( 'lock' )
+                       ->willReturn( true );
+
+               // Create config mock
+               $mock = $this->createConfigMock( [
+                       'cache' => $cache,
+               ] );
+               $mock->expects( $this->once() )->method( 'fetchAllFromEtcd' )
+                       ->willReturn( [ null, 'Fake error', false ] );
+
+               $this->setExpectedException( ConfigException::class );
+               $mock->get( 'key' );
+       }
+
+       /**
+        * @covers EtcdConfig::load
+        */
+       public function testLoadCacheMissWithoutLock() {
+               // Create cache mock
+               $cache = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'get', 'lock' ] )
+                       ->getMock();
+               $cache->expects( $this->exactly( 2 ) )->method( 'get' )
+                       ->will( $this->onConsecutiveCalls(
+                               // .. misses cache first time
+                               false,
+                               // .. hits cache on retry
+                               [
+                                       'config' => [ 'known' => 'from-cache' ],
+                                       'expires' => INF,
+                               ]
+                       ) );
+               // .. misses lock
+               $cache->expects( $this->once() )->method( 'lock' )
+                       ->willReturn( false );
+
+               // Create config mock
+               $mock = $this->createConfigMock( [
+                       'cache' => $cache,
+               ] );
+               $mock->expects( $this->never() )->method( 'fetchAllFromEtcd' );
+
+               $this->assertSame( 'from-cache', $mock->get( 'known' ) );
+       }
+
+       /**
+        * @covers EtcdConfig::load
+        */
+       public function testLoadCacheHit() {
+               // Create cache mock
+               $cache = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'get', 'lock' ] )
+                       ->getMock();
+               $cache->expects( $this->once() )->method( 'get' )
+                       // .. hits cache
+                       ->willReturn( [
+                               'config' => [ 'known' => 'from-cache' ],
+                               'expires' => INF,
+                       ] );
+               $cache->expects( $this->never() )->method( 'lock' );
+
+               // Create config mock
+               $mock = $this->createConfigMock( [
+                       'cache' => $cache,
+               ] );
+               $mock->expects( $this->never() )->method( 'fetchAllFromEtcd' );
+
+               $this->assertSame( 'from-cache', $mock->get( 'known' ) );
+       }
+
+       /**
+        * @covers EtcdConfig::load
+        */
+       public function testLoadProcessCacheHit() {
+               // Create cache mock
+               $cache = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'get', 'lock' ] )
+                       ->getMock();
+               $cache->expects( $this->once() )->method( 'get' )
+                       // .. hits cache
+                       ->willReturn( [
+                               'config' => [ 'known' => 'from-cache' ],
+                               'expires' => INF,
+                       ] );
+               $cache->expects( $this->never() )->method( 'lock' );
+
+               // Create config mock
+               $mock = $this->createConfigMock( [
+                       'cache' => $cache,
+               ] );
+               $mock->expects( $this->never() )->method( 'fetchAllFromEtcd' );
+
+               $this->assertSame( 'from-cache', $mock->get( 'known' ), 'Cache hit' );
+               $this->assertSame( 'from-cache', $mock->get( 'known' ), 'Process cache hit' );
+       }
+
+       /**
+        * @covers EtcdConfig::load
+        */
+       public function testLoadCacheExpiredLockFetchSucceeded() {
+               // Create cache mock
+               $cache = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'get', 'lock' ] )
+                       ->getMock();
+               $cache->expects( $this->once() )->method( 'get' )->willReturn(
+                       // .. stale cache
+                       [
+                               'config' => [ 'known' => 'from-cache-expired' ],
+                               'expires' => -INF,
+                       ]
+               );
+               // .. gets lock
+               $cache->expects( $this->once() )->method( 'lock' )
+                       ->willReturn( true );
+
+               // Create config mock
+               $mock = $this->createConfigMock( [
+                       'cache' => $cache,
+               ] );
+               $mock->expects( $this->once() )->method( 'fetchAllFromEtcd' )
+                       ->willReturn( [ [ 'known' => 'from-fetch' ], null, false ] );
+
+               $this->assertSame( 'from-fetch', $mock->get( 'known' ) );
+       }
+
+       /**
+        * @covers EtcdConfig::load
+        */
+       public function testLoadCacheExpiredLockFetchFails() {
+               // Create cache mock
+               $cache = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'get', 'lock' ] )
+                       ->getMock();
+               $cache->expects( $this->once() )->method( 'get' )->willReturn(
+                       // .. stale cache
+                       [
+                               'config' => [ 'known' => 'from-cache-expired' ],
+                               'expires' => -INF,
+                       ]
+               );
+               // .. gets lock
+               $cache->expects( $this->once() )->method( 'lock' )
+                       ->willReturn( true );
+
+               // Create config mock
+               $mock = $this->createConfigMock( [
+                       'cache' => $cache,
+               ] );
+               $mock->expects( $this->once() )->method( 'fetchAllFromEtcd' )
+                       ->willReturn( [ null, 'Fake failure', true ] );
+
+               $this->assertSame( 'from-cache-expired', $mock->get( 'known' ) );
+       }
+
+       /**
+        * @covers EtcdConfig::load
+        */
+       public function testLoadCacheExpiredNoLock() {
+               // Create cache mock
+               $cache = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'get', 'lock' ] )
+                       ->getMock();
+               $cache->expects( $this->once() )->method( 'get' )
+                       // .. hits cache (expired value)
+                       ->willReturn( [
+                               'config' => [ 'known' => 'from-cache-expired' ],
+                               'expires' => -INF,
+                       ] );
+               // .. misses lock
+               $cache->expects( $this->once() )->method( 'lock' )
+                       ->willReturn( false );
+
+               // Create config mock
+               $mock = $this->createConfigMock( [
+                       'cache' => $cache,
+               ] );
+               $mock->expects( $this->never() )->method( 'fetchAllFromEtcd' );
+
+               $this->assertSame( 'from-cache-expired', $mock->get( 'known' ) );
+       }
+}
index c76e8bb..a6b220d 100644 (file)
@@ -40,6 +40,7 @@ class GlobalVarConfigTest extends MediaWikiTestCase {
 
        /**
         * @covers GlobalVarConfig::has
+        * @covers GlobalVarConfig::hasWithPrefix
         */
        public function testHas() {
                $this->maybeStashGlobal( 'wgGlobalVarConfigTestHas' );
@@ -72,12 +73,12 @@ class GlobalVarConfigTest extends MediaWikiTestCase {
        }
 
        /**
-        * @param string $name
-        * @param string $prefix
-        * @param string $expected
         * @dataProvider provideGet
         * @covers GlobalVarConfig::get
         * @covers GlobalVarConfig::getWithPrefix
+        * @param string $name
+        * @param string $prefix
+        * @param string $expected
         */
        public function testGet( $name, $prefix, $expected ) {
                $config = new GlobalVarConfig( $prefix );
index bc6d6eb..d1eb510 100644 (file)
@@ -5,6 +5,7 @@ class MultiConfigTest extends MediaWikiTestCase {
        /**
         * Tests that settings are fetched in the right order
         *
+        * @covers MultiConfig::__construct
         * @covers MultiConfig::get
         */
        public function testGet() {
index ae66253..403bee1 100644 (file)
@@ -429,13 +429,18 @@ class ContentHandlerTest extends MediaWikiTestCase {
         * @covers ContentHandler::getDataForSearchIndex
         */
        public function testDataIndexFields() {
-               $mockEngine = $this->getMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( 'SearchEngine' );
                $title = Title::newFromText( 'Not_Main_Page', NS_MAIN );
                $page = new WikiPage( $title );
 
                $this->setTemporaryHook( 'SearchDataForIndex',
-                       function ( &$fields, ContentHandler $handler, WikiPage $page, ParserOutput $output,
-                                          SearchEngine $engine ) {
+                       function (
+                               &$fields,
+                               ContentHandler $handler,
+                               WikiPage $page,
+                               ParserOutput $output,
+                               SearchEngine $engine
+                       ) {
                                $fields['testDataField'] = 'test content';
                        } );
 
index 276a86e..65efcc9 100644 (file)
@@ -16,7 +16,7 @@ class FileContentHandlerTest extends MediaWikiLangTestCase {
        }
 
        public function testIndexMapping() {
-               $mockEngine = $this->getMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( 'SearchEngine' );
 
                $mockEngine->expects( $this->atLeastOnce() )
                        ->method( 'makeSearchFieldMapping' )
index 918815c..7d9f74e 100644 (file)
@@ -16,7 +16,7 @@ class TextContentHandlerTest extends MediaWikiLangTestCase {
        public function testFieldsForIndex() {
                $handler = new TextContentHandler();
 
-               $mockEngine = $this->getMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( 'SearchEngine' );
 
                $mockEngine->expects( $this->atLeastOnce() )
                        ->method( 'makeSearchFieldMapping' )
index ec97d76..290b11a 100644 (file)
@@ -245,7 +245,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
        */
 
        public function testDataIndexFieldsFile() {
-               $mockEngine = $this->getMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( 'SearchEngine' );
                $title = Title::newFromText( 'Somefile.jpg', NS_FILE );
                $page = new WikiPage( $title );
 
index 4c69d87..b9ce997 100644 (file)
@@ -29,7 +29,7 @@ more stuff
                                "WikitextContentTest_testGetParserOutput",
                                CONTENT_MODEL_WIKITEXT,
                                "hello ''world''\n",
-                               "<p>hello <i>world</i>\n</p>"
+                               "<div class=\"mw-parser-output\"><p>hello <i>world</i>\n</p>\n\n\n</div>"
                        ],
                        // TODO: more...?
                ];
index b95462a..f61569a 100644 (file)
@@ -28,6 +28,7 @@
 use Wikimedia\Rdbms\TransactionProfiler;
 use Wikimedia\Rdbms\DatabaseDomain;
 use Wikimedia\Rdbms\MySQLMasterPos;
+use Wikimedia\Rdbms\DatabaseMysqlBase;
 
 /**
  * Fake class around abstract class so we can call concrete methods.
@@ -90,7 +91,6 @@ class FakeDatabaseMysqlBase extends DatabaseMysqlBase {
        }
 
        protected function mysqlRealEscapeString( $s ) {
-
        }
 
        function insertId() {
index 57754bc..b6088ff 100644 (file)
@@ -660,19 +660,31 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                return [
                        [
                                'text',
-                               "LIKE 'text'"
+                               "LIKE 'text' ESCAPE '`'"
                        ],
                        [
                                [ 'text', new LikeMatch( '%' ) ],
-                               "LIKE 'text%'"
+                               "LIKE 'text%' ESCAPE '`'"
                        ],
                        [
                                [ 'text', new LikeMatch( '%' ), 'text2' ],
-                               "LIKE 'text%text2'"
+                               "LIKE 'text%text2' ESCAPE '`'"
                        ],
                        [
                                [ 'text', new LikeMatch( '_' ) ],
-                               "LIKE 'text_'"
+                               "LIKE 'text_' ESCAPE '`'"
+                       ],
+                       [
+                               'more_text',
+                               "LIKE 'more`_text' ESCAPE '`'"
+                       ],
+                       [
+                               [ 'C:\\Windows\\', new LikeMatch( '%' ) ],
+                               "LIKE 'C:\\Windows\\%' ESCAPE '`'"
+                       ],
+                       [
+                               [ 'accent`_test`', new LikeMatch( '%' ) ],
+                               "LIKE 'accent```_test``%' ESCAPE '`'"
                        ],
                ];
        }
index 10bf028..b90b1ad 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 
 use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DatabaseSqlite;
 
 class DatabaseSqliteMock extends DatabaseSqlite {
        private $lastQuery;
index 606a209..45791e2 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * @group Database
  * @group Database
index 4b857ce..049f81f 100644 (file)
@@ -157,12 +157,12 @@ class LBFactoryTest extends MediaWikiTestCase {
                                ],
                        ],
                        'serverTemplate' => [
-                               'dbname'          => $wgDBname,
-                               'user'            => $wgDBuser,
-                               'password'        => $wgDBpassword,
-                               'type'            => $wgDBtype,
+                               'dbname'      => $wgDBname,
+                               'user'        => $wgDBuser,
+                               'password'    => $wgDBpassword,
+                               'type'        => $wgDBtype,
                                'dbDirectory' => $wgSQLiteDataDir,
-                               'flags'           => DBO_DEFAULT
+                               'flags'       => DBO_DEFAULT
                        ],
                        'hostsByName' => [
                                'test-db1'  => $wgDBserver,
@@ -409,16 +409,27 @@ class LBFactoryTest extends MediaWikiTestCase {
                        "Correct full table name"
                );
 
-               \MediaWiki\suppressWarnings();
-               $this->assertFalse( $db->selectDB( 'garbage-db' ) );
-               \MediaWiki\restoreWarnings();
-
                $this->assertEquals(
                        $this->quoteTable( $db, 'garbage-db' ) . '.' . $this->quoteTable( $db, 'page' ),
                        $db->tableName( 'garbage-db.page' ),
                        "Correct full table name"
                );
 
+               if ( $db->databasesAreIndependent() ) {
+                       try {
+                               $e = null;
+                               $db->selectDB( 'garbage-db' );
+                       } catch ( \Wikimedia\Rdbms\DBConnectionError $e ) {
+                               // expected
+                       }
+                       $this->assertInstanceOf( '\Wikimedia\Rdbms\DBConnectionError', $e );
+                       $this->assertFalse( $db->isOpen() );
+               } else {
+                       \MediaWiki\suppressWarnings();
+                       $this->assertFalse( $db->selectDB( 'garbage-db' ) );
+                       \MediaWiki\restoreWarnings();
+               }
+
                $factory->closeAll();
                $factory->destroy();
        }
index 0ee7d26..fda3ac6 100644 (file)
@@ -21,7 +21,7 @@
 namespace MediaWiki\Logger;
 
 use MediaWikiTestCase;
-use TestingAccessWrapper;
+use Wikimedia\TestingAccessWrapper;
 
 class MonologSpiTest extends MediaWikiTestCase {
 
index d6249bb..88cd2dd 100644 (file)
@@ -22,6 +22,7 @@ namespace MediaWiki\Logger\Monolog;
 
 use MediaWikiTestCase;
 use Monolog\Logger;
+use Wikimedia\TestingAccessWrapper;
 
 class KafkaHandlerTest extends MediaWikiTestCase {
 
@@ -154,13 +155,13 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                        ->method( 'send' )
                        ->will( $this->returnValue( true ) );
                // evil hax
-               \TestingAccessWrapper::newFromObject( $mockMethod )->matcher->parametersMatcher =
+               TestingAccessWrapper::newFromObject( $mockMethod )->matcher->parametersMatcher =
                        new \PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters( [
                                [ $this->anything(), $this->anything(), [ 'words' ] ],
                                [ $this->anything(), $this->anything(), [ 'lines' ] ]
                        ] );
 
-               $formatter = $this->getMock( 'Monolog\Formatter\FormatterInterface' );
+               $formatter = $this->createMock( 'Monolog\Formatter\FormatterInterface' );
                $formatter->expects( $this->any() )
                        ->method( 'format' )
                        ->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) );
@@ -191,7 +192,7 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                        ->method( 'send' )
                        ->will( $this->returnValue( true ) );
 
-               $formatter = $this->getMock( 'Monolog\Formatter\FormatterInterface' );
+               $formatter = $this->createMock( 'Monolog\Formatter\FormatterInterface' );
                $formatter->expects( $this->any() )
                        ->method( 'format' )
                        ->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) );
index f33cf7e..2768d32 100644 (file)
@@ -24,7 +24,7 @@ use InvalidArgumentException;
 use LengthException;
 use LogicException;
 use MediaWikiTestCase;
-use TestingAccessWrapper;
+use Wikimedia\TestingAccessWrapper;
 
 class LineFormatterTest extends MediaWikiTestCase {
 
index b96ec08..11b869a 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 class CdnCacheUpdateTest extends MediaWikiTestCase {
        public function testPurgeMergeWeb() {
                $this->setMwGlobals( 'wgCommandLineMode', false );
index 4227693..2c199bc 100644 (file)
@@ -1,6 +1,39 @@
 <?php
 
 class DeferredUpdatesTest extends MediaWikiTestCase {
+
+       /**
+        * @covers DeferredUpdates::getPendingUpdates
+        */
+       public function testGetPendingUpdates() {
+               # Prevent updates from running
+               $this->setMwGlobals( 'wgCommandLineMode', false );
+
+               $pre = DeferredUpdates::PRESEND;
+               $post = DeferredUpdates::POSTSEND;
+               $all = DeferredUpdates::ALL;
+
+               $update = $this->getMock( DeferrableUpdate::class );
+               $update->expects( $this->never() )
+                       ->method( 'doUpdate' );
+
+               DeferredUpdates::addUpdate( $update, $pre );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $pre ) );
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $post ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
+               DeferredUpdates::clearPendingUpdates();
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
+
+               DeferredUpdates::addUpdate( $update, $post );
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $pre ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $post ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
+               $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
+               DeferredUpdates::clearPendingUpdates();
+               $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
+       }
+
        public function testDoUpdatesWeb() {
                $this->setMwGlobals( 'wgCommandLineMode', false );
 
index 7c36f7d..614a1c9 100644 (file)
@@ -75,53 +75,6 @@ class MWExceptionTest extends MediaWikiTestCase {
                $this->assertTrue( $e->isLoggable() );
        }
 
-       /**
-        * @dataProvider provideRunHooks
-        * @covers MWException::runHooks
-        */
-       public function testRunHooks( $wgExceptionHooks, $name, $args, $expectedReturn ) {
-               $this->setMwGlobals( [
-                       'wgExceptionHooks' => $wgExceptionHooks,
-               ] );
-               $e = new MWException();
-               $this->assertEquals( $expectedReturn, $e->runHooks( $name, $args ) );
-       }
-
-       public static function provideRunHooks() {
-               return [
-                       [ null, null, null, null ],
-                       [ [], 'name', [], null ],
-                       [ [ 'name' => false ], 'name', [], null ],
-                       [
-                               [ 'mockHook' => [ 'MWExceptionTest::mockHook' ] ],
-                               'mockHook', [], 'YAY.[]'
-                       ],
-                       [
-                               [ 'mockHook' => [ 'MWExceptionTest::mockHook' ] ],
-                               'mockHook', [ 'a' ], 'YAY.{"1":"a"}'
-                       ],
-                       [
-                               [ 'mockHook' => [ 'MWExceptionTest::mockHook' ] ],
-                               'mockHook', [ null ], null
-                       ],
-               ];
-       }
-
-       /**
-        * Used in conjunction with provideRunHooks and testRunHooks as a mock callback for a hook
-        */
-       public static function mockHook() {
-               $args = func_get_args();
-               if ( !$args[0] instanceof MWException ) {
-                       return '$caller not instance of MWException';
-               }
-               unset( $args[0] );
-               if ( array_key_exists( 1, $args ) && $args[1] === null ) {
-                       return null;
-               }
-               return 'YAY.' . json_encode( $args );
-       }
-
        /**
         * @dataProvider provideIsCommandLine
         * @covers MWException::isCommandLine
index c3d31d1..ddcf19b 100644 (file)
@@ -1,9 +1,49 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group FileRepo
  * @group FileBackend
  * @group medium
+ *
+ * @covers FileBackend
+ *
+ * @covers CopyFileOp
+ * @covers CreateFileOp
+ * @covers DeleteFileOp
+ * @covers DescribeFileOp
+ * @covers FSFile
+ * @covers FSFileBackend
+ * @covers FSFileBackendDirList
+ * @covers FSFileBackendFileList
+ * @covers FSFileBackendList
+ * @covers FSFileOpHandle
+ * @covers FileBackendDBRepoWrapper
+ * @covers FileBackendError
+ * @covers FileBackendGroup
+ * @covers FileBackendMultiWrite
+ * @covers FileBackendStore
+ * @covers FileBackendStoreOpHandle
+ * @covers FileBackendStoreShardDirIterator
+ * @covers FileBackendStoreShardFileIterator
+ * @covers FileBackendStoreShardListIterator
+ * @covers FileJournal
+ * @covers FileOp
+ * @covers FileOpBatch
+ * @covers HTTPFileStreamer
+ * @covers LockManagerGroup
+ * @covers MemoryFileBackend
+ * @covers MoveFileOp
+ * @covers MySqlLockManager
+ * @covers NullFileJournal
+ * @covers NullFileOp
+ * @covers StoreFileOp
+ * @covers TempFSFile
+ *
+ * @covers FSLockManager
+ * @covers LockManager
+ * @covers NullLockManager
  */
 class FileBackendTest extends MediaWikiTestCase {
 
@@ -89,7 +129,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testIsStoragePath
-        * @covers FileBackend::isStoragePath
         */
        public function testIsStoragePath( $path, $isStorePath ) {
                $this->assertEquals( $isStorePath, FileBackend::isStoragePath( $path ),
@@ -114,7 +153,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testSplitStoragePath
-        * @covers FileBackend::splitStoragePath
         */
        public function testSplitStoragePath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::splitStoragePath( $path ),
@@ -139,7 +177,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_normalizeStoragePath
-        * @covers FileBackend::normalizeStoragePath
         */
        public function testNormalizeStoragePath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::normalizeStoragePath( $path ),
@@ -169,7 +206,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testParentStoragePath
-        * @covers FileBackend::parentStoragePath
         */
        public function testParentStoragePath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::parentStoragePath( $path ),
@@ -191,7 +227,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testExtensionFromPath
-        * @covers FileBackend::extensionFromPath
         */
        public function testExtensionFromPath( $path, $res ) {
                $this->assertEquals( $res, FileBackend::extensionFromPath( $path ),
@@ -224,9 +259,6 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       /**
-        * @covers FileBackend::doOperation
-        */
        private function doTestStore( $op ) {
                $backendName = $this->backendClass();
 
@@ -286,7 +318,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testCopy
-        * @covers FileBackend::doOperation
         */
        public function testCopy( $op ) {
                $this->backend = $this->singleBackend;
@@ -407,7 +438,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testMove
-        * @covers FileBackend::doOperation
         */
        public function testMove( $op ) {
                $this->backend = $this->singleBackend;
@@ -529,7 +559,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testDelete
-        * @covers FileBackend::doOperation
         */
        public function testDelete( $op, $withSource, $okStatus ) {
                $this->backend = $this->singleBackend;
@@ -621,7 +650,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testDescribe
-        * @covers FileBackend::doOperation
         */
        public function testDescribe( $op, $withSource, $okStatus ) {
                $this->backend = $this->singleBackend;
@@ -722,7 +750,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testCreate
-        * @covers FileBackend::doOperation
         */
        public function testCreate( $op, $alreadyExists, $okStatus, $newSize ) {
                $this->backend = $this->singleBackend;
@@ -843,9 +870,6 @@ class FileBackendTest extends MediaWikiTestCase {
                return $cases;
        }
 
-       /**
-        * @covers FileBackend::doQuickOperations
-        */
        public function testDoQuickOperations() {
                $this->backend = $this->singleBackend;
                $this->doTestDoQuickOperations();
@@ -1056,7 +1080,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetFileStat
-        * @covers FileBackend::getFileStat
         */
        public function testGetFileStat( $path, $content, $alreadyExists ) {
                $this->backend = $this->singleBackend;
@@ -1132,7 +1155,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetFileStat
-        * @covers FileBackend::streamFile
         */
        public function testStreamFile( $path, $content, $alreadyExists ) {
                $this->backend = $this->singleBackend;
@@ -1231,8 +1253,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetFileContents
-        * @covers FileBackend::getFileContents
-        * @covers FileBackend::getFileContentsMulti
         */
        public function testGetFileContents( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1304,7 +1324,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetLocalCopy
-        * @covers FileBackend::getLocalCopy
         */
        public function testGetLocalCopy( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1390,7 +1409,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetLocalReference
-        * @covers FileBackend::getLocalReference
         */
        public function testGetLocalReference( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1467,10 +1485,6 @@ class FileBackendTest extends MediaWikiTestCase {
                return $cases;
        }
 
-       /**
-        * @covers FileBackend::getLocalCopy
-        * @covers FileBackend::getLocalReference
-        */
        public function testGetLocalCopyAndReference404() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1499,7 +1513,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetFileHttpUrl
-        * @covers FileBackend::getFileHttpUrl
         */
        public function testGetFileHttpUrl( $source, $content ) {
                $this->backend = $this->singleBackend;
@@ -1544,8 +1557,6 @@ class FileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testPrepareAndClean
-        * @covers FileBackend::prepare
-        * @covers FileBackend::clean
         */
        public function testPrepareAndClean( $path, $isOK ) {
                $this->backend = $this->singleBackend;
@@ -1626,9 +1637,6 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       /**
-        * @covers FileBackend::clean
-        */
        private function doTestRecursiveClean() {
                $backendName = $this->backendClass();
 
@@ -1673,9 +1681,6 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       /**
-        * @covers FileBackend::doOperations
-        */
        public function testDoOperations() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1763,9 +1768,6 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileC" );
        }
 
-       /**
-        * @covers FileBackend::doOperations
-        */
        public function testDoOperationsPipeline() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1862,9 +1864,6 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileC" );
        }
 
-       /**
-        * @covers FileBackend::doOperations
-        */
        public function testDoOperationsFailing() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -1939,9 +1938,6 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileA" );
        }
 
-       /**
-        * @covers FileBackend::getFileList
-        */
        public function testGetFileList() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -2117,10 +2113,6 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       /**
-        * @covers FileBackend::getTopDirectoryList
-        * @covers FileBackend::getDirectoryList
-        */
        public function testGetDirectoryList() {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
@@ -2334,10 +2326,6 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( [], $items, "Directory listing is empty." );
        }
 
-       /**
-        * @covers FileBackend::lockFiles
-        * @covers FileBackend::unlockFiles
-        */
        public function testLockCalls() {
                $this->backend = $this->singleBackend;
                $this->doTestLockCalls();
index 95ffb70..9cd2b10 100644 (file)
@@ -1,9 +1,16 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group FileRepo
  * @group FileBackend
  * @group medium
+ *
+ * @covers SwiftFileBackend
+ * @covers SwiftFileBackendDirList
+ * @covers SwiftFileBackendFileList
+ * @covers SwiftFileBackendList
  */
 class SwiftFileBackendTest extends MediaWikiTestCase {
        /** @var TestingAccessWrapper Proxy to SwiftFileBackend */
@@ -28,8 +35,6 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testSanitizeHdrs
-        * @covers SwiftFileBackend::sanitizeHdrs
-        * @covers SwiftFileBackend::getCustomHeaders
         */
        public function testSanitizeHdrs( $raw, $sanitized ) {
                $hdrs = $this->backend->sanitizeHdrs( [ 'headers' => $raw ] );
@@ -92,7 +97,6 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetMetadataHeaders
-        * @covers SwiftFileBackend::getMetadataHeaders
         */
        public function testGetMetadataHeaders( $raw, $sanitized ) {
                $hdrs = $this->backend->getMetadataHeaders( $raw );
@@ -120,7 +124,6 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provider_testGetMetadata
-        * @covers SwiftFileBackend::getMetadata
         */
        public function testGetMetadata( $raw, $sanitized ) {
                $hdrs = $this->backend->getMetadata( $raw );
index 6c93c79..0d00fbc 100644 (file)
@@ -117,20 +117,21 @@ class FileBackendDBRepoWrapperTest extends MediaWikiTestCase {
                        ->disableOriginalConstructor()
                        ->getMock();
 
-               $backendMock = $this->getMock( 'FSFileBackend',
-                       [],
-                       [ [
-                               'name' => $this->backendName,
-                               'wikiId' => wfWikiID()
-                       ] ] );
-
-               $wrapperMock = $this->getMock( 'FileBackendDBRepoWrapper',
-                       [ 'getDB' ],
-                       [ [
-                               'backend' => $backendMock,
-                               'repoName' => $this->repoName,
-                               'dbHandleFactory' => null
-                       ] ] );
+               $backendMock = $this->getMockBuilder( 'FSFileBackend' )
+                       ->setConstructorArgs( [ [
+                                       'name' => $this->backendName,
+                                       'wikiId' => wfWikiID()
+                               ] ] )
+                       ->getMock();
+
+               $wrapperMock = $this->getMockBuilder( 'FileBackendDBRepoWrapper' )
+                       ->setMethods( [ 'getDB' ] )
+                       ->setConstructorArgs( [ [
+                                       'backend' => $backendMock,
+                                       'repoName' => $this->repoName,
+                                       'dbHandleFactory' => null
+                               ] ] )
+                       ->getMock();
 
                $wrapperMock->expects( $this->any() )->method( 'getDB' )->will( $this->returnValue( $dbMock ) );
 
index d3f9374..800c2fc 100644 (file)
@@ -41,19 +41,21 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
                                new FakeResultWrapper( [] ) // filearchive
                        ) );
 
-               $repoMock = $this->getMock( 'LocalRepo',
-                       [ 'getMasterDB' ],
-                       [ [
-                               'name' => 'migratefilerepolayouttest',
-                               'backend' => $backend
-                       ] ] );
+               $repoMock = $this->getMockBuilder( 'LocalRepo' )
+                       ->setMethods( [ 'getMasterDB' ] )
+                       ->setConstructorArgs( [ [
+                                       'name' => 'migratefilerepolayouttest',
+                                       'backend' => $backend
+                               ] ] )
+                       ->getMock();
 
                $repoMock
                        ->expects( $this->any() )
                        ->method( 'getMasterDB' )
                        ->will( $this->returnValue( $dbMock ) );
 
-               $this->migratorMock = $this->getMock( 'MigrateFileRepoLayout', [ 'getRepo' ] );
+               $this->migratorMock = $this->getMockBuilder( 'MigrateFileRepoLayout' )
+                       ->setMethods( [ 'getRepo' ] )->getMock();
                $this->migratorMock
                        ->expects( $this->any() )
                        ->method( 'getRepo' )
index 25c6e95..82ff12e 100644 (file)
@@ -15,7 +15,7 @@ class RepoGroupTest extends MediaWikiTestCase {
 
        function testForEachForeignRepo() {
                $this->setUpForeignRepo();
-               $fakeCallback = $this->getMock( 'RepoGroupTestHelper' );
+               $fakeCallback = $this->createMock( 'RepoGroupTestHelper' );
                $fakeCallback->expects( $this->once() )->method( 'callback' );
                RepoGroup::singleton()->forEachForeignRepo(
                        [ $fakeCallback, 'callback' ], [ [] ] );
@@ -25,7 +25,7 @@ class RepoGroupTest extends MediaWikiTestCase {
                $this->setMwGlobals( 'wgForeignFileRepos', [] );
                RepoGroup::destroySingleton();
                FileBackendGroup::destroySingleton();
-               $fakeCallback = $this->getMock( 'RepoGroupTestHelper' );
+               $fakeCallback = $this->createMock( 'RepoGroupTestHelper' );
                $fakeCallback->expects( $this->never() )->method( 'callback' );
                RepoGroup::singleton()->forEachForeignRepo(
                        [ $fakeCallback, 'callback' ], [ [] ] );
index 6520610..5b5f1b0 100644 (file)
@@ -155,7 +155,8 @@ class FileTest extends MediaWikiMediaTestCase {
                        ->method( 'getLocalReference' )
                        ->will( $this->returnValue( $fsFile ) );
 
-               $handlerMock = $this->getMock( 'BitmapHandler', [ 'supportsBucketing' ] );
+               $handlerMock = $this->getMockBuilder( 'BitmapHandler' )
+                       ->setMethods( [ 'supportsBucketing' ] )->getMock();
                $handlerMock->expects( $this->any() )
                        ->method( 'supportsBucketing' )
                        ->will( $this->returnValue( $data['supportsBucketing'] ) );
@@ -261,7 +262,8 @@ class FileTest extends MediaWikiMediaTestCase {
                                'generateAndSaveThumb', 'getHandler' ] )
                        ->getMockForAbstractClass();
 
-               $handlerMock = $this->getMock( 'JpegHandler', [ 'supportsBucketing' ] );
+               $handlerMock = $this->getMockBuilder( 'JpegHandler' )
+                       ->setMethods( [ 'supportsBucketing' ] )->getMock();
                $handlerMock->expects( $this->any() )
                        ->method( 'supportsBucketing' )
                        ->will( $this->returnValue( true ) );
index a598d13..3693a27 100644 (file)
@@ -66,6 +66,13 @@ class HttpTest extends MediaWikiTestCase {
         * @covers Http::getProxy
         */
        public function testGetProxy() {
+               $this->setMwGlobals( 'wgHTTPProxy', false );
+               $this->assertEquals(
+                       '',
+                       Http::getProxy(),
+                       'default setting'
+               );
+
                $this->setMwGlobals( 'wgHTTPProxy', 'proxy.domain.tld' );
                $this->assertEquals(
                        'proxy.domain.tld',
@@ -140,50 +147,56 @@ class HttpTest extends MediaWikiTestCase {
                ];
        }
 
+       public static function provideRelativeRedirects() {
+               return [
+                       [
+                               'location' => [ 'http://newsite/file.ext', '/newfile.ext' ],
+                               'final' => 'http://newsite/newfile.ext',
+                               'Relative file path Location: interpreted as full URL'
+                       ],
+                       [
+                               'location' => [ 'https://oldsite/file.ext' ],
+                               'final' => 'https://oldsite/file.ext',
+                               'Location to the HTTPS version of the site'
+                       ],
+                       [
+                               'location' => [
+                                       '/anotherfile.ext',
+                                       'http://anotherfile/hoster.ext',
+                                       'https://anotherfile/hoster.ext'
+                               ],
+                               'final' => 'https://anotherfile/hoster.ext',
+                               'Relative file path Location: should keep the latest host and scheme!'
+                       ],
+                       [
+                               'location' => [ '/anotherfile.ext' ],
+                               'final' => 'http://oldsite/anotherfile.ext',
+                               'Relative Location without domain '
+                       ],
+                       [
+                               'location' => null,
+                               'final' => 'http://oldsite/file.ext',
+                               'No Location (no redirect) '
+                       ],
+               ];
+       }
+
        /**
         * Warning:
         *
         * These tests are for code that makes use of an artifact of how CURL
         * handles header reporting on redirect pages, and will need to be
-        * rewritten when T31232 is taken care of (high-level handling of
-        * HTTP redirects).
+        * rewritten when T31232 is taken care of (high-level handling of HTTP redirects).
+        *
+        * @dataProvider provideRelativeRedirects
+        * @covers MWHttpRequest::getFinalUrl
         */
-       public function testRelativeRedirections() {
+       public function testRelativeRedirections( $location, $final, $message = null ) {
                $h = MWHttpRequestTester::factory( 'http://oldsite/file.ext', [], __METHOD__ );
-
-               # Forge a Location header
-               $h->setRespHeaders( 'location', [
-                               'http://newsite/file.ext',
-                               '/newfile.ext',
-                       ]
-               );
-               # Verify we correctly fix the Location
-               $this->assertEquals(
-                       'http://newsite/newfile.ext',
-                       $h->getFinalUrl(),
-                       "Relative file path Location: interpreted as full URL"
-               );
-
-               $h->setRespHeaders( 'location', [
-                               'https://oldsite/file.ext'
-                       ]
-               );
-               $this->assertEquals(
-                       'https://oldsite/file.ext',
-                       $h->getFinalUrl(),
-                       "Location to the HTTPS version of the site"
-               );
-
-               $h->setRespHeaders( 'location', [
-                               '/anotherfile.ext',
-                               'http://anotherfile/hoster.ext',
-                               'https://anotherfile/hoster.ext'
-                       ]
-               );
-               $this->assertEquals(
-                       'https://anotherfile/hoster.ext',
-                       $h->getFinalUrl( "Relative file path Location: should keep the latest host and scheme!" )
-               );
+               // Forge a Location header
+               $h->setRespHeaders( 'location', $location );
+               // Verify it correctly fixes the Location
+               $this->assertEquals( $final, $h->getFinalUrl(), $message );
        }
 
        /**
@@ -201,8 +214,6 @@ class HttpTest extends MediaWikiTestCase {
         * Extension API: 20140829
         *
         * Commented out constants that were removed in PHP 5.6.0
-        *
-        * @covers CurlHttpRequest::execute
         */
        public function provideCurlConstants() {
                return [
@@ -481,9 +492,8 @@ class HttpTest extends MediaWikiTestCase {
 
        /**
         * Added this test based on an issue experienced with HHVM 3.3.0-dev
-        * where it did not define a cURL constant.
+        * where it did not define a cURL constant. T72570
         *
-        * @T72570
         * @dataProvider provideCurlConstants
         */
        public function testCurlConstants( $value ) {
index db6d002..48310a9 100644 (file)
@@ -133,18 +133,18 @@ class ClassicInterwikiLookupTest extends MediaWikiTestCase {
                // NOTE: CDB setup is expensive, so we only do
                //  it once and run all the tests in one go.
 
-               $dewiki = [
-                       'iw_prefix' => 'de',
-                       'iw_url' => 'http://de.wikipedia.org/wiki/',
-                       'iw_local' => 1
-               ];
-
                $zzwiki = [
                        'iw_prefix' => 'zz',
                        'iw_url' => 'http://zzwiki.org/wiki/',
                        'iw_local' => 0
                ];
 
+               $dewiki = [
+                       'iw_prefix' => 'de',
+                       'iw_url' => 'http://de.wikipedia.org/wiki/',
+                       'iw_local' => 1
+               ];
+
                $cdbFile = $this->populateCDB(
                        'en',
                        [ $dewiki ],
@@ -160,7 +160,7 @@ class ClassicInterwikiLookupTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       [ $dewiki, $zzwiki ],
+                       [ $zzwiki, $dewiki ],
                        $lookup->getAllPrefixes(),
                        'getAllPrefixes()'
                );
@@ -185,17 +185,16 @@ class ClassicInterwikiLookupTest extends MediaWikiTestCase {
        }
 
        public function testArrayStorage() {
-               $dewiki = [
-                       'iw_prefix' => 'de',
-                       'iw_url' => 'http://de.wikipedia.org/wiki/',
-                       'iw_local' => 1
-               ];
-
                $zzwiki = [
                        'iw_prefix' => 'zz',
                        'iw_url' => 'http://zzwiki.org/wiki/',
                        'iw_local' => 0
                ];
+               $dewiki = [
+                       'iw_prefix' => 'de',
+                       'iw_url' => 'http://de.wikipedia.org/wiki/',
+                       'iw_local' => 1
+               ];
 
                $hash = $this->populateHash(
                        'en',
@@ -212,7 +211,7 @@ class ClassicInterwikiLookupTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       [ $dewiki, $zzwiki ],
+                       [ $zzwiki, $dewiki ],
                        $lookup->getAllPrefixes(),
                        'getAllPrefixes()'
                );
@@ -233,4 +232,42 @@ class ClassicInterwikiLookupTest extends MediaWikiTestCase {
                $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
        }
 
+       public function testGetAllPrefixes() {
+               $zz = [
+                       'iw_prefix' => 'zz',
+                       'iw_url' => 'https://azz.example.org/',
+                       'iw_local' => 1
+               ];
+               $de = [
+                       'iw_prefix' => 'de',
+                       'iw_url' => 'https://de.example.org/',
+                       'iw_local' => 1
+               ];
+               $azz = [
+                       'iw_prefix' => 'azz',
+                       'iw_url' => 'https://azz.example.org/',
+                       'iw_local' => 1
+               ];
+
+               $hash = $this->populateHash(
+                       'en',
+                       [],
+                       [ $zz, $de, $azz ]
+               );
+               $lookup = new \MediaWiki\Interwiki\ClassicInterwikiLookup(
+                       Language::factory( 'en' ),
+                       WANObjectCache::newEmpty(),
+                       60 * 60,
+                       $hash,
+                       3,
+                       'en'
+               );
+
+               $this->assertEquals(
+                       [ $zz, $de, $azz ],
+                       $lookup->getAllPrefixes(),
+                       'getAllPrefixes() - preserves order'
+               );
+       }
+
 }
index 4754b04..1d62a78 100644 (file)
@@ -60,20 +60,37 @@ class InterwikiLookupAdapterTest extends MediaWikiTestCase {
        }
 
        public function testGetAllPrefixes() {
+               $foo = [
+                       'iw_prefix' => 'foo',
+                       'iw_url' => '',
+                       'iw_api' => '',
+                       'iw_wikiid' => 'foobar',
+                       'iw_local' => false,
+                       'iw_trans' => false,
+               ];
+               $enwt = [
+                       'iw_prefix' => 'enwt',
+                       'iw_url' => 'https://en.wiktionary.org/wiki/$1',
+                       'iw_api' => 'https://en.wiktionary.org/w/api.php',
+                       'iw_wikiid' => 'enwiktionary',
+                       'iw_local' => true,
+                       'iw_trans' => false,
+               ];
+
                $this->assertEquals(
-                       [ 'foo', 'enwt' ],
+                       [ $foo, $enwt ],
                        $this->interwikiLookup->getAllPrefixes(),
                        'getAllPrefixes()'
                );
 
                $this->assertEquals(
-                       [ 'foo' ],
+                       [ $foo ],
                        $this->interwikiLookup->getAllPrefixes( false ),
                        'get external prefixes'
                );
 
                $this->assertEquals(
-                       [ 'enwt' ],
+                       [ $enwt ],
                        $this->interwikiLookup->getAllPrefixes( true ),
                        'get local prefixes'
                );
index b1ad77a..22b1304 100644 (file)
@@ -119,146 +119,4 @@ class InterwikiTest extends MediaWikiTestCase {
                $this->assertNotSame( $interwiki, $interwikiLookup->fetch( 'de' ), 'invalidate cache' );
        }
 
-       /**
-        * @param string $thisSite
-        * @param string[] $local
-        * @param string[] $global
-        *
-        * @return string[]
-        */
-       private function populateHash( $thisSite, $local, $global ) {
-               $hash = [];
-               $hash[ '__sites:' . wfWikiID() ] = $thisSite;
-
-               $globals = [];
-               $locals = [];
-
-               foreach ( $local as $row ) {
-                       $prefix = $row['iw_prefix'];
-                       $data = $row['iw_local'] . ' ' . $row['iw_url'];
-                       $locals[] = $prefix;
-                       $hash[ "_{$thisSite}:{$prefix}" ] = $data;
-               }
-
-               foreach ( $global as $row ) {
-                       $prefix = $row['iw_prefix'];
-                       $data = $row['iw_local'] . ' ' . $row['iw_url'];
-                       $globals[] = $prefix;
-                       $hash[ "__global:{$prefix}" ] = $data;
-               }
-
-               $hash[ '__list:__global' ] = implode( ' ', $globals );
-               $hash[ '__list:_' . $thisSite ] = implode( ' ', $locals );
-
-               return $hash;
-       }
-
-       private function populateCDB( $thisSite, $local, $global ) {
-               $cdbFile = tempnam( wfTempDir(), 'MW-ClassicInterwikiLookupTest-' ) . '.cdb';
-               $cdb = CdbWriter::open( $cdbFile );
-
-               $hash = $this->populateHash( $thisSite, $local, $global );
-
-               foreach ( $hash as $key => $value ) {
-                       $cdb->set( $key, $value );
-               }
-
-               $cdb->close();
-               return $cdbFile;
-       }
-
-       public function testCDBStorage() {
-               // NOTE: CDB setup is expensive, so we only do
-               //  it once and run all the tests in one go.
-
-               $dewiki = [
-                       'iw_prefix' => 'de',
-                       'iw_url' => 'http://de.wikipedia.org/wiki/',
-                       'iw_local' => 1
-               ];
-
-               $zzwiki = [
-                       'iw_prefix' => 'zz',
-                       'iw_url' => 'http://zzwiki.org/wiki/',
-                       'iw_local' => 0
-               ];
-
-               $cdbFile = $this->populateCDB(
-                       'en',
-                       [ $dewiki ],
-                       [ $zzwiki ]
-               );
-
-               $this->setWgInterwikiCache( $cdbFile );
-
-               $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
-               $this->assertEquals(
-                       [ $dewiki, $zzwiki ],
-                       $interwikiLookup->getAllPrefixes(),
-                       'getAllPrefixes()'
-               );
-
-               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'de' ), 'known prefix is valid' );
-               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
-
-               $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 = $interwikiLookup->fetch( 'zz' );
-               $this->assertInstanceOf( 'Interwiki', $interwiki );
-
-               $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
-               $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
-
-               // cleanup temp file
-               unlink( $cdbFile );
-       }
-
-       public function testArrayStorage() {
-               $dewiki = [
-                       'iw_prefix' => 'de',
-                       'iw_url' => 'http://de.wikipedia.org/wiki/',
-                       'iw_local' => 1
-               ];
-
-               $zzwiki = [
-                       'iw_prefix' => 'zz',
-                       'iw_url' => 'http://zzwiki.org/wiki/',
-                       'iw_local' => 0
-               ];
-
-               $cdbData = $this->populateHash(
-                       'en',
-                       [ $dewiki ],
-                       [ $zzwiki ]
-               );
-
-               $this->setWgInterwikiCache( $cdbData );
-
-               $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
-               $this->assertEquals(
-                       [ $dewiki, $zzwiki ],
-                       $interwikiLookup->getAllPrefixes(),
-                       'getAllPrefixes()'
-               );
-
-               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'de' ), 'known prefix is valid' );
-               $this->assertTrue( $interwikiLookup->isValidInterwiki( 'zz' ), 'known prefix is valid' );
-
-               $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 = $interwikiLookup->fetch( 'zz' );
-               $this->assertInstanceOf( 'Interwiki', $interwiki );
-
-               $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
-               $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
-       }
-
 }
index 600a36f..00c47c8 100644 (file)
@@ -18,7 +18,8 @@ class JobTest extends MediaWikiTestCase {
        }
 
        public function provideTestToString() {
-               $mockToStringObj = $this->getMock( 'stdClass', [ '__toString' ] );
+               $mockToStringObj = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ '__toString' ] )->getMock();
                $mockToStringObj->expects( $this->any() )
                        ->method( '__toString' )
                        ->will( $this->returnValue( '{STRING_OBJ_VAL}' ) );
@@ -90,4 +91,41 @@ class JobTest extends MediaWikiTestCase {
                return $mock;
        }
 
+       /**
+        * @dataProvider provideTestJobFactory
+        *
+        * @param mixed $handler
+        *
+        * @covers Job::factory
+        */
+       public function testJobFactory( $handler ) {
+               $this->mergeMWGlobalArrayValue( 'wgJobClasses', [ 'testdummy' => $handler ] );
+
+               $job = Job::factory( 'testdummy', Title::newMainPage(), [] );
+               $this->assertInstanceOf( NullJob::class, $job );
+
+               $job2 = Job::factory( 'testdummy', Title::newMainPage(), [] );
+               $this->assertInstanceOf( NullJob::class, $job2 );
+               $this->assertNotSame( $job, $job2, 'should not reuse instance' );
+       }
+
+       public function provideTestJobFactory() {
+               return [
+                       'class name' => [ 'NullJob' ],
+                       'closure' => [ function( Title $title, array $params ) {
+                               return new NullJob( $title, $params );
+                       } ],
+                       'function' => [ [ $this, 'newNullJob' ] ],
+                       'static function' => [ self::class . '::staticNullJob' ]
+               ];
+       }
+
+       public function newNullJob( Title $title, array $params ) {
+               return new NullJob( $title, $params );
+       }
+
+       public static function staticNullJob( Title $title, array $params ) {
+               return new NullJob( $title, $params );
+       }
+
 }
index 2e5c0bb..d0121b1 100644 (file)
@@ -18,6 +18,81 @@ class CSSMinTest extends MediaWikiTestCase {
                ] );
        }
 
+       /**
+        * @dataProvider mimeTypeProvider
+        */
+       public function testGetMimeType( $fileContents, $fileExtension, $expected ) {
+               $fileName = wfTempDir() . DIRECTORY_SEPARATOR . uniqid( 'MW_PHPUnit_CSSMinTest_' ) . '.'
+                       . $fileExtension;
+               $this->addTmpFiles( $fileName );
+               file_put_contents( $fileName, $fileContents );
+               $this->assertSame( $expected, CSSMin::getMimeType( $fileName ) );
+       }
+
+       public function mimeTypeProvider() {
+               return [
+                       'JPEG with short extension' => [
+                               "\xFF\xD8\xFF",
+                               'jpg',
+                               'image/jpeg'
+                       ],
+                       'JPEG with long extension' => [
+                               "\xFF\xD8\xFF",
+                               'jpeg',
+                               'image/jpeg'
+                       ],
+                       'PNG' => [
+                               "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A",
+                               'png',
+                               'image/png'
+                       ],
+
+                       'PNG extension but JPEG content' => [
+                               "\xFF\xD8\xFF",
+                               'png',
+                               'image/png'
+                       ],
+                       'JPEG extension but PNG content' => [
+                               "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A",
+                               'jpg',
+                               'image/jpeg'
+                       ],
+                       'PNG extension but SVG content' => [
+                               '<?xml version="1.0"?><svg></svg>',
+                               'png',
+                               'image/png'
+                       ],
+                       'SVG extension but PNG content' => [
+                               "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A",
+                               'svg',
+                               'image/svg+xml'
+                       ],
+
+                       'SVG with all headers' => [
+                               '<?xml version="1.0"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" '
+                               . '"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg></svg>',
+                               'svg',
+                               'image/svg+xml'
+                       ],
+                       'SVG with XML header only' => [
+                               '<?xml version="1.0"?><svg></svg>',
+                               'svg',
+                               'image/svg+xml'
+                       ],
+                       'SVG with DOCTYPE only' => [
+                               '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" '
+                               . '"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg></svg>',
+                               'svg',
+                               'image/svg+xml'
+                       ],
+                       'SVG without any header' => [
+                               '<svg></svg>',
+                               'svg',
+                               'image/svg+xml'
+                       ],
+               ];
+       }
+
        /**
         * @dataProvider provideMinifyCases
         * @covers CSSMin::minify
@@ -72,6 +147,45 @@ class CSSMinTest extends MediaWikiTestCase {
                ];
        }
 
+       public static function provideIsRemoteUrl() {
+               return [
+                       [ true, 'http://localhost/w/red.gif?123' ],
+                       [ true, 'https://example.org/x.png' ],
+                       [ true, '//example.org/x.y.z/image.png' ],
+                       [ true, '//localhost/styles.css?query=yes' ],
+                       [ true, 'data:image/gif;base64,R0lGODlhAQABAIAAAP8AADAAACwAAAAAAQABAAACAkQBADs=' ],
+                       [ false, 'x.gif' ],
+                       [ false, '/x.gif' ],
+                       [ false, './x.gif' ],
+                       [ false, '../x.gif' ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideIsRemoteUrl
+        * @cover CSSMin::isRemoteUrl
+        */
+       public function testIsRemoteUrl( $expect, $url ) {
+               $this->assertEquals( CSSMinTestable::isRemoteUrl( $url ), $expect );
+       }
+
+       public static function provideIsLocalUrls() {
+               return [
+                       [ false, 'x.gif' ],
+                       [ true, '/x.gif' ],
+                       [ false, './x.gif' ],
+                       [ false, '../x.gif' ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideIsLocalUrls
+        * @cover CSSMin::isLocalUrl
+        */
+       public function testIsLocalUrl( $expect, $url ) {
+               $this->assertEquals( CSSMinTestable::isLocalUrl( $url ), $expect );
+       }
+
        /**
         * This tests funky parameters to CSSMin::remap. testRemapRemapping tests
         * the basic functionality.
@@ -136,45 +250,6 @@ class CSSMinTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedOutput, $realOutput, "CSSMin::remap: $message" );
        }
 
-       public static function provideIsRemoteUrl() {
-               return [
-                       [ true, 'http://localhost/w/red.gif?123' ],
-                       [ true, 'https://example.org/x.png' ],
-                       [ true, '//example.org/x.y.z/image.png' ],
-                       [ true, '//localhost/styles.css?query=yes' ],
-                       [ true, 'data:image/gif;base64,R0lGODlhAQABAIAAAP8AADAAACwAAAAAAQABAAACAkQBADs=' ],
-                       [ false, 'x.gif' ],
-                       [ false, '/x.gif' ],
-                       [ false, './x.gif' ],
-                       [ false, '../x.gif' ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideIsRemoteUrl
-        * @cover CSSMin::isRemoteUrl
-        */
-       public function testIsRemoteUrl( $expect, $url ) {
-               $this->assertEquals( CSSMinTestable::isRemoteUrl( $url ), $expect );
-       }
-
-       public static function provideIsLocalUrls() {
-               return [
-                       [ false, 'x.gif' ],
-                       [ true, '/x.gif' ],
-                       [ false, './x.gif' ],
-                       [ false, '../x.gif' ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideIsLocalUrls
-        * @cover CSSMin::isLocalUrl
-        */
-       public function testIsLocalUrl( $expect, $url ) {
-               $this->assertEquals( CSSMinTestable::isLocalUrl( $url ), $expect );
-       }
-
        public static function provideRemapRemappingCases() {
                // red.gif and green.gif are one-pixel 35-byte GIFs.
                // large.png is a 35K PNG that should be non-embeddable.
@@ -232,8 +307,8 @@ class CSSMinTest extends MediaWikiTestCase {
                        ],
                        [
                                'Remote URL (unnecessary quotes not preserved)',
-                               'foo { background: url("http://example.org/w/foo.png"); }',
-                               'foo { background: url(http://example.org/w/foo.png); }',
+                               'foo { background: url("http://example.org/w/unnecessary-quotes.png"); }',
+                               'foo { background: url(http://example.org/w/unnecessary-quotes.png); }',
                        ],
                        [
                                'Embedded file',
@@ -335,9 +410,39 @@ class CSSMinTest extends MediaWikiTestCase {
                                '@import url(http://doc.example.org/styles.css)',
                        ],
                        [
-                               '@import rule to URL (should we remap this?)',
-                               '@import url(//localhost/styles.css?query=yes)',
-                               '@import url(//localhost/styles.css?query=yes)',
+                               '@import rule to local file (should we remap this?)',
+                               '@import url(/styles.css)',
+                               '@import url(http://doc.example.org/styles.css)',
+                       ],
+                       [
+                               '@import rule to URL',
+                               '@import url(//localhost/styles.css?query=val)',
+                               '@import url(//localhost/styles.css?query=val)',
+                       ],
+                       [
+                               'Background URL (double quotes)',
+                               'foo { background: url("//localhost/styles.css?quoted=double") }',
+                               'foo { background: url(//localhost/styles.css?quoted=double) }',
+                       ],
+                       [
+                               'Background URL (single quotes)',
+                               'foo { background: url(\'//localhost/styles.css?quoted=single\') }',
+                               'foo { background: url(//localhost/styles.css?quoted=single) }',
+                       ],
+                       [
+                               'Background URL (containing parentheses; T60473)',
+                               'foo { background: url("//localhost/styles.css?query=(parens)") }',
+                               'foo { background: url("//localhost/styles.css?query=(parens)") }',
+                       ],
+                       [
+                               'Background URL (double quoted, containing single quotes; T60473)',
+                               'foo { background: url("//localhost/styles.css?quote=\'") }',
+                               'foo { background: url("//localhost/styles.css?quote=\'") }',
+                       ],
+                       [
+                               'Background URL (single quoted, containing double quotes; T60473)',
+                               'foo { background: url(\'//localhost/styles.css?quote="\') }',
+                               'foo { background: url("//localhost/styles.css?quote=\"") }',
                        ],
                        [
                                'Simple case with comments before url',
diff --git a/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php b/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php
new file mode 100644 (file)
index 0000000..cfc2d91
--- /dev/null
@@ -0,0 +1,139 @@
+<?php
+
+class DnsSrvDiscovererTest extends PHPUnit_Framework_TestCase {
+       /**
+        * @covers DnsSrvDiscoverer
+        * @dataProvider provideRecords
+        */
+       public function testPickServer( $params, $expected ) {
+               $discoverer = new DnsSrvDiscoverer( 'etcd-tcp.example.net' );
+               $record = $discoverer->pickServer( $params );
+
+               $this->assertEquals( $expected, $record );
+       }
+
+       public static function provideRecords() {
+               return [
+                       [
+                               [ // record list
+                                       [
+                                               'target' => 'conf03.example.net',
+                                               'port' => 'SRV',
+                                               'pri' => 0,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf02.example.net',
+                                               'port' => 'SRV',
+                                               'pri' => 1,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf01.example.net',
+                                               'port' => 'SRV',
+                                               'pri' => 2,
+                                               'weight' => 1,
+                                       ],
+                               ], // selected record
+                               [
+                                       'target' => 'conf03.example.net',
+                                       'port' => 'SRV',
+                                       'pri' => 0,
+                                       'weight' => 1,
+                               ]
+                       ],
+                       [
+                               [ // record list
+                                       [
+                                               'target' => 'conf03or2.example.net',
+                                               'port' => 'SRV',
+                                               'pri' => 0,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf03or2.example.net',
+                                               'port' => 'SRV',
+                                               'pri' => 0,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf01.example.net',
+                                               'port' => 'SRV',
+                                               'pri' => 2,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf04.example.net',
+                                               'port' => 'SRV',
+                                               'pri' => 2,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf05.example.net',
+                                               'port' => 'SRV',
+                                               'pri' => 3,
+                                               'weight' => 1,
+                                       ],
+                               ], // selected record
+                               [
+                                       'target' => 'conf03or2.example.net',
+                                       'port' => 'SRV',
+                                       'pri' => 0,
+                                       'weight' => 1,
+                               ]
+                       ],
+               ];
+       }
+
+       public function testRemoveServer() {
+               $dsd = new DnsSrvDiscoverer( 'localhost' );
+
+               $servers = [
+                       [
+                               'target' => 'conf01.example.net',
+                               'port' => 35,
+                               'pri' => 2,
+                               'weight' => 1,
+                       ],
+                       [
+                               'target' => 'conf04.example.net',
+                               'port' => 74,
+                               'pri' => 2,
+                               'weight' => 1,
+                       ],
+                       [
+                               'target' => 'conf05.example.net',
+                               'port' => 77,
+                               'pri' => 3,
+                               'weight' => 1,
+                       ],
+               ];
+               $server = $servers[1];
+
+               $expected = [
+                       [
+                               'target' => 'conf01.example.net',
+                               'port' => 35,
+                               'pri' => 2,
+                               'weight' => 1,
+                       ],
+                       [
+                               'target' => 'conf05.example.net',
+                               'port' => 77,
+                               'pri' => 3,
+                               'weight' => 1,
+                       ],
+               ];
+
+               $this->assertEquals(
+                       $expected,
+                       $dsd->removeServer( $server, $servers ),
+                       "Correct server removed"
+               );
+               $this->assertEquals(
+                       $expected,
+                       $dsd->removeServer( $server, $servers ),
+                       "Nothing to remove"
+               );
+       }
+}
index 881f5e1..d99c587 100644 (file)
@@ -31,7 +31,8 @@ class MemoizedCallableTest extends PHPUnit_Framework_TestCase {
         * way as the original underlying callable.
         */
        public function testReturnValuePassedThrough() {
-               $mock = $this->getMock( 'stdClass', [ 'reverse' ] );
+               $mock = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ 'reverse' ] )->getMock();
                $mock->expects( $this->any() )
                        ->method( 'reverse' )
                        ->will( $this->returnCallback( 'strrev' ) );
@@ -47,7 +48,8 @@ class MemoizedCallableTest extends PHPUnit_Framework_TestCase {
         * @requires function apc_store/apcu_store
         */
        public function testCallableMemoized() {
-               $observer = $this->getMock( 'stdClass', [ 'computeSomething' ] );
+               $observer = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ 'computeSomething' ] )->getMock();
                $observer->expects( $this->once() )
                        ->method( 'computeSomething' )
                        ->will( $this->returnValue( 'ok' ) );
index f8dda6f..3e0a61e 100644 (file)
@@ -26,20 +26,24 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
        public function testClosureExpansionDisabled() {
                $obj = ObjectFactory::getObjectFromSpec( [
                        'class' => 'ObjectFactoryTestFixture',
-                       'args' => [ function() {
-                               return 'unwrapped';
-                       }, ],
+                       'args' => [
+                               function() {
+                                       return 'wrapped';
+                               },
+                               'unwrapped',
+                       ],
                        'calls' => [
                                'setter' => [ function() {
-                                       return 'unwrapped';
+                                       return 'wrapped';
                                }, ],
                        ],
                        'closure_expansion' => false,
                ] );
                $this->assertInstanceOf( 'Closure', $obj->args[0] );
-               $this->assertSame( 'unwrapped', $obj->args[0]() );
+               $this->assertSame( 'wrapped', $obj->args[0]() );
+               $this->assertSame( 'unwrapped', $obj->args[1] );
                $this->assertInstanceOf( 'Closure', $obj->setterArgs[0] );
-               $this->assertSame( 'unwrapped', $obj->setterArgs[0]() );
+               $this->assertSame( 'wrapped', $obj->setterArgs[0]() );
        }
 
        /**
@@ -49,20 +53,24 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
        public function testClosureExpansionEnabled() {
                $obj = ObjectFactory::getObjectFromSpec( [
                        'class' => 'ObjectFactoryTestFixture',
-                       'args' => [ function() {
-                               return 'unwrapped';
-                       }, ],
+                       'args' => [
+                               function() {
+                                       return 'wrapped';
+                               },
+                               'unwrapped',
+                       ],
                        'calls' => [
                                'setter' => [ function() {
-                                       return 'unwrapped';
+                                       return 'wrapped';
                                }, ],
                        ],
                        'closure_expansion' => true,
                ] );
                $this->assertInternalType( 'string', $obj->args[0] );
-               $this->assertSame( 'unwrapped', $obj->args[0] );
+               $this->assertSame( 'wrapped', $obj->args[0] );
+               $this->assertSame( 'unwrapped', $obj->args[1] );
                $this->assertInternalType( 'string', $obj->setterArgs[0] );
-               $this->assertSame( 'unwrapped', $obj->setterArgs[0] );
+               $this->assertSame( 'wrapped', $obj->setterArgs[0] );
 
                $obj = ObjectFactory::getObjectFromSpec( [
                        'class' => 'ObjectFactoryTestFixture',
index 9a48930..c5bc03e 100644 (file)
@@ -1,13 +1,14 @@
 <?php
 
 use Liuggio\StatsdClient\Entity\StatsdData;
+use Liuggio\StatsdClient\Sender\SenderInterface;
 
 class SamplingStatsdClientTest extends PHPUnit_Framework_TestCase {
        /**
         * @dataProvider samplingDataProvider
         */
        public function testSampling( $data, $sampleRate, $seed, $expectWrite ) {
-               $sender = $this->getMock( 'Liuggio\StatsdClient\Sender\SenderInterface' );
+               $sender = $this->getMockBuilder( SenderInterface::class )->getMock();
                $sender->expects( $this->any() )->method( 'open' )->will( $this->returnValue( true ) );
                if ( $expectWrite ) {
                        $sender->expects( $this->once() )->method( 'write' )
@@ -50,7 +51,7 @@ class SamplingStatsdClientTest extends PHPUnit_Framework_TestCase {
                $nonMatching->setKey( 'oof.bar' );
                $nonMatching->setValue( 1 );
 
-               $sender = $this->getMock( 'Liuggio\StatsdClient\Sender\SenderInterface' );
+               $sender = $this->getMockBuilder( SenderInterface::class )->getMock();
                $sender->expects( $this->any() )->method( 'open' )->will( $this->returnValue( true ) );
                $sender->expects( $this->once() )->method( 'write' )->with( $this->anything(),
                        $this->equalTo( $nonMatching ) );
index 787d9a8..cf891e2 100644 (file)
@@ -57,7 +57,7 @@ class MimeMagicTest extends PHPUnit_Framework_TestCase {
        function testOggRecognize() {
                $oggFile = __DIR__ . '/../../../data/media/say-test.ogg';
                $actualType = $this->mimeAnalyzer->getMediaType( $oggFile, 'application/ogg' );
-               $this->assertEquals( $actualType, MEDIATYPE_AUDIO );
+               $this->assertEquals( MEDIATYPE_AUDIO, $actualType );
        }
 
        /**
@@ -67,6 +67,6 @@ class MimeMagicTest extends PHPUnit_Framework_TestCase {
        function testOpusRecognize() {
                $oggFile = __DIR__ . '/../../../data/media/say-test.opus';
                $actualType = $this->mimeAnalyzer->getMediaType( $oggFile, 'application/ogg' );
-               $this->assertEquals( $actualType, MEDIATYPE_AUDIO );
+               $this->assertEquals( MEDIATYPE_AUDIO, $actualType );
        }
 }
index a1afa77..f2fe07d 100644 (file)
@@ -275,7 +275,7 @@ class BagOStuffTest extends MediaWikiTestCase {
         * @covers BagOStuff::trackDuplicateKeys
         */
        public function testReportDupes() {
-               $logger = $this->getMock( 'Psr\Log\NullLogger' );
+               $logger = $this->createMock( Psr\Log\NullLogger::class );
                $logger->expects( $this->once() )
                        ->method( 'warning' )
                        ->with( 'Duplicate get(): "{key}" fetched {count} times', [
index a01cc6b..8b9abbc 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group BagOStuff
  */
@@ -82,4 +84,73 @@ class CachedBagOStuffTest extends PHPUnit_Framework_TestCase {
                $backend->set( 'bar', true );
                $this->assertEquals( true, $cache->get( 'bar' ) );
        }
+
+       /**
+        * @covers CachedBagOStuff::setDebug
+        */
+       public function testSetDebug() {
+               $backend = new HashBagOStuff();
+               $cache = new CachedBagOStuff( $backend );
+               // Access private property 'debugMode'
+               $backend = TestingAccessWrapper::newFromObject( $backend );
+               $cache = TestingAccessWrapper::newFromObject( $cache );
+               $this->assertFalse( $backend->debugMode );
+               $this->assertFalse( $cache->debugMode );
+
+               $cache->setDebug( true );
+               // Should have set both
+               $this->assertTrue( $backend->debugMode, 'sets backend' );
+               $this->assertTrue( $cache->debugMode, 'sets self' );
+       }
+
+       /**
+        * @covers CachedBagOStuff::deleteObjectsExpiringBefore
+        */
+       public function testExpire() {
+               $backend = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'deleteObjectsExpiringBefore' ] )
+                       ->getMock();
+               $backend->expects( $this->once() )
+                       ->method( 'deleteObjectsExpiringBefore' )
+                       ->willReturn( false );
+
+               $cache = new CachedBagOStuff( $backend );
+               $cache->deleteObjectsExpiringBefore( '20110401000000' );
+       }
+
+       /**
+        * @covers CachedBagOStuff::makeKey
+        */
+       public function testMakeKey() {
+               $backend = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'makeKey' ] )
+                       ->getMock();
+               $backend->method( 'makeKey' )
+                       ->willReturn( 'special/logic' );
+
+               // CachedBagOStuff wraps any backend with a process cache
+               // using HashBagOStuff. Hash has no special key limitations,
+               // but backends often do. Make sure it uses the backend's
+               // makeKey() logic, not the one inherited from HashBagOStuff
+               $cache = new CachedBagOStuff( $backend );
+
+               $this->assertEquals( 'special/logic', $backend->makeKey( 'special', 'logic' ) );
+               $this->assertEquals( 'special/logic', $cache->makeKey( 'special', 'logic' ) );
+       }
+
+       /**
+        * @covers CachedBagOStuff::makeGlobalKey
+        */
+       public function testMakeGlobalKey() {
+               $backend = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'makeGlobalKey' ] )
+                       ->getMock();
+               $backend->method( 'makeGlobalKey' )
+                       ->willReturn( 'special/logic' );
+
+               $cache = new CachedBagOStuff( $backend );
+
+               $this->assertEquals( 'special/logic', $backend->makeGlobalKey( 'special', 'logic' ) );
+               $this->assertEquals( 'special/logic', $cache->makeGlobalKey( 'special', 'logic' ) );
+       }
 }
index c4db0cf..b2278c3 100644 (file)
@@ -1,10 +1,46 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group BagOStuff
  */
 class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
 
+       /**
+        * @covers HashBagOStuff::__construct
+        */
+       public function testConstruct() {
+               $this->assertInstanceOf(
+                       HashBagOStuff::class,
+                       new HashBagOStuff()
+               );
+       }
+
+       /**
+        * @covers HashBagOStuff::__construct
+        * @expectedException InvalidArgumentException
+        */
+       public function testConstructBadZero() {
+               $cache = new HashBagOStuff( [ 'maxKeys' => 0 ] );
+       }
+
+       /**
+        * @covers HashBagOStuff::__construct
+        * @expectedException InvalidArgumentException
+        */
+       public function testConstructBadNeg() {
+               $cache = new HashBagOStuff( [ 'maxKeys' => -1 ] );
+       }
+
+       /**
+        * @covers HashBagOStuff::__construct
+        * @expectedException InvalidArgumentException
+        */
+       public function testConstructBadType() {
+               $cache = new HashBagOStuff( [ 'maxKeys' => 'x' ] );
+       }
+
        /**
         * @covers HashBagOStuff::delete
         */
@@ -56,7 +92,6 @@ class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
        /**
         * Ensure maxKeys eviction prefers keeping new keys.
         *
-        * @covers HashBagOStuff::__construct
         * @covers HashBagOStuff::set
         */
        public function testEvictionAdd() {
@@ -76,7 +111,6 @@ class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
         * Ensure maxKeys eviction prefers recently set keys
         * even if the keys pre-exist.
         *
-        * @covers HashBagOStuff::__construct
         * @covers HashBagOStuff::set
         */
        public function testEvictionSet() {
@@ -102,7 +136,6 @@ class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
        /**
         * Ensure maxKeys eviction prefers recently retrieved keys (LRU).
         *
-        * @covers HashBagOStuff::__construct
         * @covers HashBagOStuff::doGet
         * @covers HashBagOStuff::hasKey
         */
index d7ed4bd..dcb0986 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
        /** @var WANObjectCache */
        private $cache;
@@ -308,10 +310,12 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0, 'lockTSE' => 5, ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated" );
+               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed yet in process cache" );
                $v = $cache->getMultiWithSetCallback(
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0, 'lockTSE' => 5, ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value not regenerated" );
+               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in process cache" );
 
                $priorTime = microtime( true );
                usleep( 1 );
@@ -963,7 +967,8 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
        }
 
        public function testMcRouterSupport() {
-               $localBag = $this->getMock( 'EmptyBagOStuff', [ 'set', 'delete' ] );
+               $localBag = $this->getMockBuilder( 'EmptyBagOStuff' )
+                       ->setMethods( [ 'set', 'delete' ] )->getMock();
                $localBag->expects( $this->never() )->method( 'set' );
                $localBag->expects( $this->never() )->method( 'delete' );
                $wanCache = new WANObjectCache( [
index cd350e5..a3f3981 100644 (file)
@@ -19,7 +19,8 @@ class ConnectionManagerTest extends \PHPUnit_Framework_TestCase {
         * @return IDatabase|PHPUnit_Framework_MockObject_MockObject
         */
        private function getIDatabaseMock() {
-               return $this->getMock( IDatabase::class );
+               return $this->getMockBuilder( IDatabase::class )
+                       ->getMock();
        }
 
        /**
index 3b26d6f..4e76f2a 100644 (file)
@@ -19,7 +19,8 @@ class SessionConsistentConnectionManagerTest extends \PHPUnit_Framework_TestCase
         * @return IDatabase|PHPUnit_Framework_MockObject_MockObject
         */
        private function getIDatabaseMock() {
-               return $this->getMock( IDatabase::class );
+               return $this->getMockBuilder( IDatabase::class )
+                       ->getMock();
        }
 
        /**
diff --git a/tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php b/tests/phpunit/includes/libs/time/ConvertibleTimestampTest.php
deleted file mode 100644 (file)
index d48caf3..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-<?php
-
-/**
- * Tests timestamp parsing and output.
- */
-class ConvertibleTimestampTest extends PHPUnit_Framework_TestCase {
-       /**
-        * @covers ConvertibleTimestamp::__construct
-        */
-       public function testConstructWithNoTimestamp() {
-               $timestamp = new ConvertibleTimestamp();
-               $this->assertInternalType( 'string', $timestamp->getTimestamp() );
-               $this->assertNotEmpty( $timestamp->getTimestamp() );
-               $this->assertNotEquals( false, strtotime( $timestamp->getTimestamp( TS_MW ) ) );
-       }
-
-       /**
-        * @covers ConvertibleTimestamp::__toString
-        */
-       public function testToString() {
-               $timestamp = new ConvertibleTimestamp( '1406833268' ); // Equivalent to 20140731190108
-               $this->assertEquals( '1406833268', $timestamp->__toString() );
-       }
-
-       public static function provideValidTimestampDifferences() {
-               return [
-                       [ '1406833268', '1406833269', '00 00 00 01' ],
-                       [ '1406833268', '1406833329', '00 00 01 01' ],
-                       [ '1406833268', '1406836929', '00 01 01 01' ],
-                       [ '1406833268', '1406923329', '01 01 01 01' ],
-               ];
-       }
-
-       /**
-        * @dataProvider provideValidTimestampDifferences
-        * @covers ConvertibleTimestamp::diff
-        */
-       public function testDiff( $timestamp1, $timestamp2, $expected ) {
-               $timestamp1 = new ConvertibleTimestamp( $timestamp1 );
-               $timestamp2 = new ConvertibleTimestamp( $timestamp2 );
-               $diff = $timestamp1->diff( $timestamp2 );
-               $this->assertEquals( $expected, $diff->format( '%D %H %I %S' ) );
-       }
-
-       /**
-        * Test parsing of valid timestamps and outputing to MW format.
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testValidParse( $format, $original, $expected ) {
-               $timestamp = new ConvertibleTimestamp( $original );
-               $this->assertEquals( $expected, $timestamp->getTimestamp( TS_MW ) );
-       }
-
-       /**
-        * Test outputting valid timestamps to different formats.
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testValidOutput( $format, $expected, $original ) {
-               $timestamp = new ConvertibleTimestamp( $original );
-               $this->assertEquals( $expected, (string)$timestamp->getTimestamp( $format ) );
-       }
-
-       /**
-        * Test an invalid timestamp.
-        * @expectedException TimestampException
-        * @covers ConvertibleTimestamp
-        */
-       public function testInvalidParse() {
-               new ConvertibleTimestamp( "This is not a timestamp." );
-       }
-
-       /**
-        * @dataProvider provideValidTimestamps
-        * @covers ConvertibleTimestamp::convert
-        */
-       public function testConvert( $format, $expected, $original ) {
-               $this->assertSame( $expected, ConvertibleTimestamp::convert( $format, $original ) );
-       }
-
-       /**
-        * Format an invalid timestamp.
-        * @covers ConvertibleTimestamp::convert
-        */
-       public function testConvertInvalid() {
-               $this->assertSame( false, ConvertibleTimestamp::convert( 'Not a timestamp', 0 ) );
-       }
-
-       /**
-        * Test an out of range timestamp
-        * @dataProvider provideOutOfRangeTimestamps
-        * @expectedException TimestampException
-        * @covers       ConvertibleTimestamp
-        */
-       public function testOutOfRangeTimestamps( $format, $input ) {
-               $timestamp = new ConvertibleTimestamp( $input );
-               $timestamp->getTimestamp( $format );
-       }
-
-       /**
-        * Test requesting an invalid output format.
-        * @expectedException TimestampException
-        * @covers ConvertibleTimestamp::getTimestamp
-        */
-       public function testInvalidOutput() {
-               $timestamp = new ConvertibleTimestamp( '1343761268' );
-               $timestamp->getTimestamp( 98 );
-       }
-
-       /**
-        * Returns a list of valid timestamps in the format:
-        * [ type, timestamp_of_type, timestamp_in_MW ]
-        */
-       public static function provideValidTimestamps() {
-               return [
-                       // Various formats
-                       [ TS_UNIX, '1343761268', '20120731190108' ],
-                       [ TS_MW, '20120731190108', '20120731190108' ],
-                       [ TS_DB, '2012-07-31 19:01:08', '20120731190108' ],
-                       [ TS_ISO_8601, '2012-07-31T19:01:08Z', '20120731190108' ],
-                       [ TS_ISO_8601_BASIC, '20120731T190108Z', '20120731190108' ],
-                       [ TS_EXIF, '2012:07:31 19:01:08', '20120731190108' ],
-                       [ TS_RFC2822, 'Tue, 31 Jul 2012 19:01:08 GMT', '20120731190108' ],
-                       [ TS_ORACLE, '31-07-2012 19:01:08.000000', '20120731190108' ],
-                       [ TS_POSTGRES, '2012-07-31 19:01:08 GMT', '20120731190108' ],
-                       // Some extremes and weird values
-                       [ TS_ISO_8601, '9999-12-31T23:59:59Z', '99991231235959' ],
-                       [ TS_UNIX, '-62135596801', '00001231235959' ]
-               ];
-       }
-
-       /**
-        * Returns a list of out of range timestamps in the format:
-        * [ type, timestamp_of_type ]
-        */
-       public static function provideOutOfRangeTimestamps() {
-               return [
-                       // Various formats
-                       [ TS_MW, '-62167219201' ], // -0001-12-31T23:59:59Z
-                       [ TS_MW, '253402300800' ], // 10000-01-01T00:00:00Z
-               ];
-       }
-}
index bf12f80..27e5a65 100644 (file)
@@ -69,7 +69,8 @@ class LinkRendererFactoryTest extends MediaWikiLangTestCase {
 
        public function testCreateForUser() {
                /** @var PHPUnit_Framework_MockObject_MockObject|User $user */
-               $user = $this->getMock( User::class, [ 'getStubThreshold' ] );
+               $user = $this->getMockBuilder( User::class )
+                       ->setMethods( [ 'getStubThreshold' ] )->getMock();
                $user->expects( $this->once() )
                        ->method( 'getStubThreshold' )
                        ->willReturn( 15 );
index 3fb4eab..2337899 100644 (file)
@@ -59,6 +59,32 @@ class DeleteLogFormatterTest extends LogFormatterTestCase {
        public static function provideRestoreLogDatabaseRows() {
                return [
                        // Current format
+                       [
+                               [
+                                       'type' => 'delete',
+                                       'action' => 'restore',
+                                       'comment' => 'delete comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'Page',
+                                       'params' => [
+                                               ':assoc:count' => [
+                                                       'revisions' => 2,
+                                                       'files' => 1,
+                                               ],
+                                       ],
+                               ],
+                               [
+                                       'text' => 'User restored page Page (2 revisions and 1 file)',
+                                       'api' => [
+                                               'count' => [
+                                                       'revisions' => 2,
+                                                       'files' => 1,
+                                               ],
+                                       ],
+                               ],
+                       ],
+
+                       // Legacy format without counts
                        [
                                [
                                        'type' => 'delete',
index c2b791e..1ef3df6 100644 (file)
@@ -4,6 +4,7 @@
  * @group Database
  */
 class LogFormatterTest extends MediaWikiLangTestCase {
+       private static $oldExtMsgFiles;
 
        /**
         * @var User
@@ -30,21 +31,33 @@ class LogFormatterTest extends MediaWikiLangTestCase {
         */
        protected $user_comment;
 
+       public static function setUpBeforeClass() {
+               parent::setUpBeforeClass();
+
+               global $wgExtensionMessagesFiles;
+               self::$oldExtMsgFiles = $wgExtensionMessagesFiles;
+               $wgExtensionMessagesFiles['LogTests'] = __DIR__ . '/LogTests.i18n.php';
+               Language::getLocalisationCache()->recache( 'en' );
+       }
+
+       public static function tearDownAfterClass() {
+               global $wgExtensionMessagesFiles;
+               $wgExtensionMessagesFiles = self::$oldExtMsgFiles;
+               Language::getLocalisationCache()->recache( 'en' );
+
+               parent::tearDownAfterClass();
+       }
+
        protected function setUp() {
                parent::setUp();
 
-               global $wgLang;
-
                $this->setMwGlobals( [
                        'wgLogTypes' => [ 'phpunit' ],
                        'wgLogActionsHandlers' => [ 'phpunit/test' => 'LogFormatter',
                                'phpunit/param' => 'LogFormatter' ],
                        'wgUser' => User::newFromName( 'Testuser' ),
-                       'wgExtensionMessagesFiles' => [ 'LogTests' => __DIR__ . '/LogTests.i18n.php' ],
                ] );
 
-               Language::getLocalisationCache()->recache( $wgLang->getCode() );
-
                $this->user = User::newFromName( 'Testuser' );
                $this->title = Title::newFromText( 'SomeTitle' );
                $this->target = Title::newFromText( 'TestTarget' );
@@ -52,18 +65,11 @@ class LogFormatterTest extends MediaWikiLangTestCase {
                $this->context = new RequestContext();
                $this->context->setUser( $this->user );
                $this->context->setTitle( $this->title );
-               $this->context->setLanguage( $wgLang );
+               $this->context->setLanguage( RequestContext::getMain()->getLanguage() );
 
                $this->user_comment = '<User comment about action>';
        }
 
-       protected function tearDown() {
-               parent::tearDown();
-
-               global $wgLang;
-               Language::getLocalisationCache()->recache( $wgLang->getCode() );
-       }
-
        public function newLogEntry( $action, $params ) {
                $logEntry = new ManualLogEntry( 'phpunit', $action );
                $logEntry->setPerformer( $this->user );
index c4b52f0..333fd88 100644 (file)
@@ -107,16 +107,10 @@ class NewUsersLogFormatterTest extends LogFormatterTestCase {
                                        'user' => 0,
                                        'user_text' => 'User',
                                        'namespace' => NS_USER,
-                                       'title' => 'UTSysop',
-                                       'params' => [
-                                               '4::userid' => 1,
-                                       ],
+                                       'title' => 'UTSysop'
                                ],
                                [
-                                       'text' => 'User account UTSysop was created by User',
-                                       'api' => [
-                                               'userid' => 1,
-                                       ],
+                                       'text' => 'User account UTSysop was created by User'
                                ],
                        ],
                ];
@@ -126,6 +120,10 @@ class NewUsersLogFormatterTest extends LogFormatterTestCase {
         * @dataProvider provideCreate2LogDatabaseRows
         */
        public function testCreate2LogDatabaseRows( $row, $extra ) {
+               // Make UTSysop user and use its user_id (sequence does not reset to 1 for postgres)
+               $user = static::getTestSysop()->getUser();
+               $row['params']['4::userid'] = $user->getId();
+               $extra['api']['userid'] = $user->getId();
                $this->doTestLogFormatter( $row, $extra );
        }
 
@@ -145,16 +143,10 @@ class NewUsersLogFormatterTest extends LogFormatterTestCase {
                                        'user' => 0,
                                        'user_text' => 'Sysop',
                                        'namespace' => NS_USER,
-                                       'title' => 'UTSysop',
-                                       'params' => [
-                                               '4::userid' => 1,
-                                       ],
+                                       'title' => 'UTSysop'
                                ],
                                [
-                                       'text' => 'User account UTSysop was created by Sysop and password was sent by email',
-                                       'api' => [
-                                               'userid' => 1,
-                                       ],
+                                       'text' => 'User account UTSysop was created by Sysop and password was sent by email'
                                ],
                        ],
                ];
@@ -164,6 +156,10 @@ class NewUsersLogFormatterTest extends LogFormatterTestCase {
         * @dataProvider provideByemailLogDatabaseRows
         */
        public function testByemailLogDatabaseRows( $row, $extra ) {
+               // Make UTSysop user and use its user_id (sequence does not reset to 1 for postgres)
+               $user = static::getTestSysop()->getUser();
+               $row['params']['4::userid'] = $user->getId();
+               $extra['api']['userid'] = $user->getId();
                $this->doTestLogFormatter( $row, $extra );
        }
 
index 39b6f9f..c837d26 100644 (file)
@@ -17,7 +17,7 @@ class MailAddressTest extends MediaWikiTestCase {
                if ( wfIsWindows() ) {
                        $this->markTestSkipped( 'This test only works on non-Windows platforms' );
                }
-               $user = $this->getMock( 'User' );
+               $user = $this->createMock( 'User' );
                $user->expects( $this->any() )->method( 'getName' )->will(
                        $this->returnValue( 'UserName' )
                );
index 47ed67b..3dd7e4c 100644 (file)
@@ -142,61 +142,4 @@ class ExifBitmapTest extends MediaWikiMediaTestCase {
                $res = $this->handler->convertMetadataVersion( $metadata, 1 );
                $this->assertEquals( $expected, $res );
        }
-
-       /**
-        * @dataProvider provideSwappingICCProfile
-        * @covers ExifBitmapHandler::swapICCProfile
-        */
-       public function testSwappingICCProfile(
-               $sourceFilename, $controlFilename, $newProfileFilename, $oldProfileName
-       ) {
-               global $wgExiftool;
-
-               if ( !$wgExiftool || !is_file( $wgExiftool ) ) {
-                       $this->markTestSkipped( "Exiftool not installed, cannot test ICC profile swapping" );
-               }
-
-               $this->setMwGlobals( 'wgUseTinyRGBForJPGThumbnails', true );
-
-               $sourceFilepath = $this->filePath . $sourceFilename;
-               $controlFilepath = $this->filePath . $controlFilename;
-               $profileFilepath = $this->filePath . $newProfileFilename;
-               $filepath = $this->getNewTempFile();
-
-               copy( $sourceFilepath, $filepath );
-
-               $file = $this->dataFile( $sourceFilename, 'image/jpeg' );
-               $this->handler->swapICCProfile( $filepath, $oldProfileName, $profileFilepath );
-
-               $this->assertEquals(
-                       sha1( file_get_contents( $filepath ) ),
-                       sha1( file_get_contents( $controlFilepath ) )
-               );
-       }
-
-       public function provideSwappingICCProfile() {
-               return [
-                       // File with sRGB should end up with TinyRGB
-                       [
-                               'srgb.jpg',
-                               'tinyrgb.jpg',
-                               'tinyrgb.icc',
-                               'IEC 61966-2.1 Default RGB colour space - sRGB'
-                       ],
-                       // File with TinyRGB should be left unchanged
-                       [
-                               'tinyrgb.jpg',
-                               'tinyrgb.jpg',
-                               'tinyrgb.icc',
-                               'IEC 61966-2.1 Default RGB colour space - sRGB'
-                       ],
-                       // File with no profile should be left unchanged
-                       [
-                               'test.jpg',
-                               'test.jpg',
-                               'tinyrgb.icc',
-                               'IEC 61966-2.1 Default RGB colour space - sRGB'
-                       ]
-               ];
-       }
 }
index b2f26ee..876e461 100644 (file)
@@ -40,7 +40,7 @@ class ExifTest extends MediaWikiTestCase {
                $data = $exif->getFilteredData();
 
                $expected = [
-                       'UserComment' => 'test⁔comment'
+                       'UserComment' => 'test⁔comment',
                ];
                $this->assertEquals( $expected, $data );
        }
index 05aed4a..abe0280 100644 (file)
@@ -51,4 +51,73 @@ class JpegTest extends MediaWikiMediaTestCase {
 
                $this->assertEquals( $res, $expected );
        }
+
+       /**
+        * @dataProvider provideSwappingICCProfile
+        * @covers JpegHandler::swapICCProfile
+        */
+       public function testSwappingICCProfile(
+               $sourceFilename, $controlFilename, $newProfileFilename, $oldProfileName
+       ) {
+               global $wgExiftool;
+
+               if ( !$wgExiftool || !is_file( $wgExiftool ) ) {
+                       $this->markTestSkipped( "Exiftool not installed, cannot test ICC profile swapping" );
+               }
+
+               $this->setMwGlobals( 'wgUseTinyRGBForJPGThumbnails', true );
+
+               $sourceFilepath = $this->filePath . $sourceFilename;
+               $controlFilepath = $this->filePath . $controlFilename;
+               $profileFilepath = $this->filePath . $newProfileFilename;
+               $filepath = $this->getNewTempFile();
+
+               copy( $sourceFilepath, $filepath );
+
+               $file = $this->dataFile( $sourceFilename, 'image/jpeg' );
+               $this->handler->swapICCProfile(
+                       $filepath,
+                       [ 'sRGB', '-' ],
+                       [ $oldProfileName ],
+                       $profileFilepath
+               );
+
+               $this->assertEquals(
+                       sha1( file_get_contents( $filepath ) ),
+                       sha1( file_get_contents( $controlFilepath ) )
+               );
+       }
+
+       public function provideSwappingICCProfile() {
+               return [
+                       // File with sRGB should end up with TinyRGB
+                       [
+                               'srgb.jpg',
+                               'tinyrgb.jpg',
+                               'tinyrgb.icc',
+                               'sRGB IEC61966-2.1'
+                       ],
+                       // File with TinyRGB should be left unchanged
+                       [
+                               'tinyrgb.jpg',
+                               'tinyrgb.jpg',
+                               'tinyrgb.icc',
+                               'sRGB IEC61966-2.1'
+                       ],
+                       // File without profile should end up with TinyRGB
+                       [
+                               'missingprofile.jpg',
+                               'tinyrgb.jpg',
+                               'tinyrgb.icc',
+                               'sRGB IEC61966-2.1'
+                       ],
+                       // Non-sRGB file should be left untouched
+                       [
+                               'adobergb.jpg',
+                               'adobergb.jpg',
+                               'tinyrgb.icc',
+                               'sRGB IEC61966-2.1'
+                       ]
+               ];
+       }
 }
index 7a052f6..530afa0 100644 (file)
@@ -65,4 +65,27 @@ class MediaHandlerTest extends MediaWikiTestCase {
                }
                return $result;
        }
+
+       /**
+        * @covers MediaHandler::getPageRangesByDimensions
+        *
+        * @dataProvider provideTestGetPageRangesByDimensions
+        */
+       public function testGetPageRangesByDimensions( $pagesByDimensions, $expected ) {
+               $this->assertEquals( $expected, MediaHandler::getPageRangesByDimensions( $pagesByDimensions ) );
+       }
+
+       public static function provideTestGetPageRangesByDimensions() {
+               return [
+                       [ [ '123x456' => [ 1 ] ], '123x456:1' ],
+                       [ [ '123x456' => [ 1, 2 ] ], '123x456:1-2' ],
+                       [ [ '123x456' => [ 1, 2, 3 ] ], '123x456:1-3' ],
+                       [ [ '123x456' => [ 1, 2, 3, 5 ] ], '123x456:1-3,5' ],
+                       [ [ '123x456' => [ 1, 3 ] ], '123x456:1,3' ],
+                       [ [ '123x456' => [ 1, 2, 3, 5, 6, 7 ] ], '123x456:1-3,5-7' ],
+                       [ [ '123x456' => [ 1, 2, 3, 5, 6, 7 ],
+                               '789x789' => [ 4, 8, 9 ] ], '123x456:1-3,5-7/789x789:4,8-9'
+                       ],
+               ];
+       }
 }
index 8441d8f..b75335d 100644 (file)
@@ -69,9 +69,15 @@ class XCFHandlerTest extends MediaWikiMediaTestCase {
 
        public static function provideGetMetadata() {
                return [
-                       [ '80x60-2layers.xcf', 'a:1:{s:9:"colorType";s:16:"truecolour-alpha";}' ],
-                       [ '80x60-RGB.xcf', 'a:1:{s:9:"colorType";s:16:"truecolour-alpha";}' ],
-                       [ '80x60-Greyscale.xcf', 'a:1:{s:9:"colorType";s:15:"greyscale-alpha";}' ],
+                       [ '80x60-2layers.xcf',
+                               'a:1:{s:9:"colorType";s:16:"truecolour-alpha";}'
+                       ],
+                       [ '80x60-RGB.xcf',
+                               'a:1:{s:9:"colorType";s:16:"truecolour-alpha";}'
+                       ],
+                       [ '80x60-Greyscale.xcf',
+                               'a:1:{s:9:"colorType";s:15:"greyscale-alpha";}'
+                       ],
                ];
        }
 }
diff --git a/tests/phpunit/includes/media/XContentDimensionsTest.php b/tests/phpunit/includes/media/XContentDimensionsTest.php
new file mode 100644 (file)
index 0000000..dddcc98
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @group Media
+ */
+class XContentDimensionsTest extends MediaWikiMediaTestCase {
+       /**
+        * @param string $filename
+        * @param string $expectedXContentDimensions
+        * @dataProvider provideGetContentHeaders
+        * @covers File::getContentHeaders
+        */
+       public function testGetContentHeaders( $filename, $expectedXContentDimensions ) {
+               $file = $this->dataFile( $filename );
+               $headers = $file->getContentHeaders();
+               $this->assertEquals( true, isset( $headers['X-Content-Dimensions'] ) );
+               $this->assertEquals( $headers['X-Content-Dimensions'], $expectedXContentDimensions );
+       }
+
+       public static function provideGetContentHeaders() {
+               return [
+                       [ '80x60-2layers.xcf', '80x60:1' ],
+                       [ 'animated.gif', '45x30:1' ],
+                       [ 'landscape-plain.jpg', '1024x768:1' ],
+                       [ 'portrait-rotated.jpg', '768x1024:1' ],
+                       [ 'Wikimedia-logo.svg', '1024x1024:1' ],
+                       [ 'webp_animated.webp', '300x225:1' ],
+                       [ 'test.tiff', '20x20:1' ],
+               ];
+       }
+}
diff --git a/tests/phpunit/includes/objectcache/ObjectCacheTest.php b/tests/phpunit/includes/objectcache/ObjectCacheTest.php
new file mode 100644 (file)
index 0000000..f8ce24e
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+
+class ObjectCacheTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               // Parent calls ObjectCache::clear() among other things
+               parent::setUp();
+
+               $this->setCacheConfig();
+               $this->setMwGlobals( [
+                       'wgMainCacheType' => CACHE_NONE,
+                       'wgMessageCacheType' => CACHE_NONE,
+                       'wgParserCacheType' => CACHE_NONE,
+               ] );
+       }
+
+       private function setCacheConfig( $arr = [] ) {
+               $defaults = [
+                       CACHE_NONE => [ 'class' => 'EmptyBagOStuff' ],
+                       CACHE_DB => [ 'class' => 'SqlBagOStuff' ],
+                       CACHE_ANYTHING => [ 'factory' => 'ObjectCache::newAnything' ],
+                       // Mock ACCEL with 'hash' as being installed.
+                       // This makes tests deterministic regardless of APC.
+                       CACHE_ACCEL => [ 'class' => 'HashBagOStuff' ],
+                       'hash' => [ 'class' => 'HashBagOStuff' ],
+               ];
+               $this->setMwGlobals( 'wgObjectCaches', $arr + $defaults );
+       }
+
+       /** @covers ObjectCache::newAnything */
+       public function testNewAnythingNothing() {
+               $this->assertInstanceOf(
+                       SqlBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'No available types. Fallback to DB'
+               );
+       }
+
+       /** @covers ObjectCache::newAnything */
+       public function testNewAnythingHash() {
+               $this->setMwGlobals( [
+                       'wgMainCacheType' => 'hash'
+               ] );
+
+               $this->assertInstanceOf(
+                       HashBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'Use an available type (hash)'
+               );
+       }
+
+       /** @covers ObjectCache::newAnything */
+       public function testNewAnythingAccel() {
+               $this->setMwGlobals( [
+                       'wgMainCacheType' => CACHE_ACCEL
+               ] );
+
+               $this->assertInstanceOf(
+                       HashBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'Use an available type (CACHE_ACCEL)'
+               );
+       }
+
+       /** @covers ObjectCache::newAnything */
+       public function testNewAnythingNoAccel() {
+               $this->setMwGlobals( [
+                       'wgMainCacheType' => CACHE_ACCEL
+               ] );
+
+               $this->setCacheConfig( [
+                       // Mock APC not being installed (T160519, T147161)
+                       CACHE_ACCEL => [ 'class' => 'EmptyBagOStuff' ]
+               ] );
+
+               $this->assertInstanceOf(
+                       SqlBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'Fallback to DB if available types fall back to Empty'
+               );
+       }
+
+       /** @covers ObjectCache::newAnything */
+       public function testNewAnythingNoAccelNoDb() {
+               $this->overrideMwServices(); // Ensures restore on tear down
+               MediaWiki\MediaWikiServices::disableStorageBackend();
+
+               $this->setMwGlobals( [
+                       'wgMainCacheType' => CACHE_ACCEL
+               ] );
+
+               $this->setCacheConfig( [
+                       // Mock APC not being installed (T160519, T147161)
+                       CACHE_ACCEL => [ 'class' => 'EmptyBagOStuff' ]
+               ] );
+
+               $this->assertInstanceOf(
+                       EmptyBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'Fallback to none if available types and DB are unavailable'
+               );
+       }
+
+       /** @covers ObjectCache::newAnything */
+       public function testNewAnythingNothingNoDb() {
+               $this->overrideMwServices();
+               MediaWiki\MediaWikiServices::disableStorageBackend();
+
+               $this->assertInstanceOf(
+                       EmptyBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'No available types or DB. Fallback to none.'
+               );
+       }
+}
index ebeb109..f722fe1 100644 (file)
@@ -27,7 +27,7 @@ class RESTBagOStuffTest extends MediaWikiTestCase {
                $this->client->expects( $this->once() )->method( 'run' )->with( [
                        'method' => 'GET',
                        'url' => 'http://test/rest/42xyz42'
-                   // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
+                       // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
                ] )->willReturn( [ 200, 'OK', [], 's:8:"somedata";', 0 ] );
                $result = $this->bag->get( '42xyz42' );
                $this->assertEquals( 'somedata', $result );
@@ -69,7 +69,7 @@ class RESTBagOStuffTest extends MediaWikiTestCase {
                $this->client->expects( $this->once() )->method( 'run' )->with( [
                        'method' => 'PUT',
                        'url' => 'http://test/rest/42xyz42',
-                   'body' => 's:8:"postdata";'
+                       'body' => 's:8:"postdata";'
                        // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
                ] )->willReturn( [ 200, 'OK', [], 'Done', 0 ] );
                $result = $this->bag->set( '42xyz42', 'postdata' );
index 6b911bf..556a348 100644 (file)
@@ -549,7 +549,11 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
        public static function provideGetParserOutput() {
                return [
-                       [ CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>" ],
+                       [
+                               CONTENT_MODEL_WIKITEXT,
+                               "hello ''world''\n",
+                               "<div class=\"mw-parser-output\"><p>hello <i>world</i></p></div>"
+                       ],
                        // @todo more...?
                ];
        }
@@ -566,7 +570,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $text = $po->getText();
 
                $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
-               $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
+               $text = preg_replace( '!\s*(</p>|</div>)!sm', '\1', $text ); # don't let tidy confuse us
 
                $this->assertEquals( $expectedHtml, $text );
 
diff --git a/tests/phpunit/includes/pager/RangeChronologicalPagerTest.php b/tests/phpunit/includes/pager/RangeChronologicalPagerTest.php
new file mode 100644 (file)
index 0000000..4721ce6
--- /dev/null
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * Test class for RangeChronologicalPagerTest logic.
+ *
+ * @group Pager
+ *
+ * @author Geoffrey Mon <geofbot@gmail.com>
+ */
+class RangeChronologicalPagerTest extends MediaWikiLangTestCase {
+
+       /**
+        * @covers       RangeChronologicalPager::getDateCond
+        * @dataProvider getDateCondProvider
+        */
+       public function testGetDateCond( $inputYear, $inputMonth, $inputDay, $expected ) {
+               $pager = $this->getMockForAbstractClass( 'RangeChronologicalPager' );
+               $this->assertEquals(
+                       $expected,
+                       wfTimestamp( TS_MW, $pager->getDateCond( $inputYear, $inputMonth, $inputDay ) )
+               );
+       }
+
+       /**
+        * Data provider in [ input year, input month, input day, expected timestamp output ] format
+        */
+       public function getDateCondProvider() {
+               return [
+                       [ 2016, 12, 5, '20161205235959' ],
+                       [ 2016, 12, 31, '20161231235959' ],
+                       [ 2016, 12, 1337, '20161231235959' ],
+                       [ 2016, 1337, 1337, '20161231235959' ],
+                       [ 2016, 1337, -1, '20161231235959' ],
+                       [ 2016, 12, 32, '20161231235959' ],
+                       [ 2016, 12, -1, '20161231235959' ],
+                       [ 2016, -1, -1, '20161231235959' ],
+               ];
+       }
+
+       /**
+        * @covers       RangeChronologicalPager::getDateRangeCond
+        * @dataProvider getDateRangeCondProvider
+        */
+       public function testGetDateRangeCond( $start, $end, $expected ) {
+               $pager = $this->getMockForAbstractClass( 'RangeChronologicalPager' );
+               $this->assertArrayEquals( $expected, $pager->getDateRangeCond( $start, $end ) );
+       }
+
+       /**
+        * Data provider in [ start, end, [ expected output has start condition, has end cond ] ] format
+        */
+       public function getDateRangeCondProvider() {
+               $db = wfGetDB( DB_MASTER );
+
+               return [
+                       [
+                               '20161201000000',
+                               '20161203000000',
+                               [
+                                       '>=' . $db->addQuotes( $db->timestamp( '20161201000000' ) ),
+                                       '<=' . $db->addQuotes( $db->timestamp( '20161203000000' ) ),
+                               ],
+                       ],
+                       [
+                               '',
+                               '20161203000000',
+                               [
+                                       '<=' . $db->addQuotes( $db->timestamp( '20161203000000' ) ),
+                               ],
+                       ],
+                       [
+                               '20161201000000',
+                               '',
+                               [
+                                       '>=' . $db->addQuotes( $db->timestamp( '20161201000000' ) ),
+                               ],
+                       ],
+                       [ '', '', [] ],
+               ];
+       }
+
+       /**
+        * @covers       RangeChronologicalPager::getDateRangeCond
+        * @dataProvider getDateRangeCondInvalidProvider
+        */
+       public function testGetDateRangeCondInvalid( $start, $end ) {
+               $pager = $this->getMockForAbstractClass( 'RangeChronologicalPager' );
+               $this->assertEquals( null, $pager->getDateRangeCond( $start, $end ) );
+       }
+
+       public function getDateRangeCondInvalidProvider() {
+               return [
+                       [ '-2016-12-01', '2017-12-01', ],
+                       [ '2016-12-01', '-2017-12-01', ],
+                       [ 'abcdefghij', 'klmnopqrstu', ],
+               ];
+       }
+
+}
index 5e00384..ae58d1c 100644 (file)
@@ -2,8 +2,8 @@
 
 /**
  * @group Database
+ * @covers Parser
  */
-
 class ParserMethodsTest extends MediaWikiLangTestCase {
 
        public static function providePreSaveTransform() {
@@ -19,7 +19,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider providePreSaveTransform
-        * @covers Parser::preSaveTransform
         */
        public function testPreSaveTransform( $text, $expected ) {
                global $wgParser;
@@ -63,7 +62,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideStripOuterParagraph
-        * @covers Parser::stripOuterParagraph
         */
        public function testStripOuterParagraph( $text, $expected ) {
                $this->assertEquals( $expected, Parser::stripOuterParagraph( $text ) );
@@ -73,7 +71,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
         * @expectedException MWException
         * @expectedExceptionMessage Parser state cleared while parsing.
         *  Did you call Parser::parse recursively?
-        * @covers Parser::lock
         */
        public function testRecursiveParse() {
                global $wgParser;
@@ -90,9 +87,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                return 'bar';
        }
 
-       /**
-        * @covers Parser::callParserFunction
-        */
        public function testCallParserFunction() {
                global $wgParser;
 
@@ -111,7 +105,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @covers Parser::parse
+        * @covers Parser
         * @covers ParserOutput::getSections
         */
        public function testGetSections() {
@@ -155,8 +149,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideNormalizeLinkUrl
-        * @covers Parser::normalizeLinkUrl
-        * @covers Parser::normalizeUrlComponent
         */
        public function testNormalizeLinkUrl( $explanation, $url, $expected ) {
                $this->assertEquals( $expected, Parser::normalizeLinkUrl( $url ), $explanation );
index 414ab8f..7707395 100644 (file)
@@ -2,6 +2,30 @@
 /**
  * Basic tests for Parser::getPreloadText
  * @author Antoine Musso
+ *
+ * @covers Parser
+ * @covers StripState
+ *
+ * @covers Preprocessor_DOM
+ * @covers PPDStack
+ * @covers PPDStackElement
+ * @covers PPDPart
+ * @covers PPFrame_DOM
+ * @covers PPTemplateFrame_DOM
+ * @covers PPCustomFrame_DOM
+ * @covers PPNode_DOM
+ *
+ * @covers Preprocessor_Hash
+ * @covers PPDStack_Hash
+ * @covers PPDStackElement_Hash
+ * @covers PPDPart_Hash
+ * @covers PPFrame_Hash
+ * @covers PPTemplateFrame_Hash
+ * @covers PPCustomFrame_Hash
+ * @covers PPNode_Hash_Tree
+ * @covers PPNode_Hash_Text
+ * @covers PPNode_Hash_Array
+ * @covers PPNode_Hash_Attr
  */
 class ParserPreloadTest extends MediaWikiTestCase {
        /**
@@ -37,16 +61,10 @@ class ParserPreloadTest extends MediaWikiTestCase {
                unset( $this->title );
        }
 
-       /**
-        * @covers Parser::getPreloadText
-        */
        public function testPreloadSimpleText() {
                $this->assertPreloaded( 'simple', 'simple' );
        }
 
-       /**
-        * @covers Parser::getPreloadText
-        */
        public function testPreloadedPreIsUnstripped() {
                $this->assertPreloaded(
                        '<pre>monospaced</pre>',
@@ -55,9 +73,6 @@ class ParserPreloadTest extends MediaWikiTestCase {
                );
        }
 
-       /**
-        * @covers Parser::getPreloadText
-        */
        public function testPreloadedNowikiIsUnstripped() {
                $this->assertPreloaded(
                        '<nowiki>[[Dummy title]]</nowiki>',
index 2a4a4ec..06fe272 100644 (file)
@@ -3,6 +3,30 @@
 /**
  * @group Database
  * @group Parser
+ *
+ * @covers Parser
+ * @covers StripState
+ *
+ * @covers Preprocessor_DOM
+ * @covers PPDStack
+ * @covers PPDStackElement
+ * @covers PPDPart
+ * @covers PPFrame_DOM
+ * @covers PPTemplateFrame_DOM
+ * @covers PPCustomFrame_DOM
+ * @covers PPNode_DOM
+ *
+ * @covers Preprocessor_Hash
+ * @covers PPDStack_Hash
+ * @covers PPDStackElement_Hash
+ * @covers PPDPart_Hash
+ * @covers PPFrame_Hash
+ * @covers PPTemplateFrame_Hash
+ * @covers PPCustomFrame_Hash
+ * @covers PPNode_Hash_Tree
+ * @covers PPNode_Hash_Text
+ * @covers PPNode_Hash_Array
+ * @covers PPNode_Hash_Attr
  */
 class TagHookTest extends MediaWikiTestCase {
        public static function provideValidNames() {
@@ -19,19 +43,25 @@ class TagHookTest extends MediaWikiTestCase {
                return [ [ "foo<bar" ], [ "foo>bar" ], [ "foo\nbar" ], [ "foo\rbar" ] ];
        }
 
+       private function getParserOptions() {
+               global $wgContLang;
+               $popt = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+               $popt->setWrapOutputClass( false );
+               return $popt;
+       }
+
        /**
         * @dataProvider provideValidNames
-        * @covers Parser::setHook
         */
        public function testTagHooks( $tag ) {
-               global $wgParserConf, $wgContLang;
+               global $wgParserConf;
                $parser = new Parser( $wgParserConf );
 
                $parser->setHook( $tag, [ $this, 'tagCallback' ] );
                $parserOutput = $parser->parse(
                        "Foo<$tag>Bar</$tag>Baz",
                        Title::newFromText( 'Test' ),
-                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+                       $this->getParserOptions()
                );
                $this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
 
@@ -41,34 +71,32 @@ class TagHookTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideBadNames
         * @expectedException MWException
-        * @covers Parser::setHook
         */
        public function testBadTagHooks( $tag ) {
-               global $wgParserConf, $wgContLang;
+               global $wgParserConf;
                $parser = new Parser( $wgParserConf );
 
                $parser->setHook( $tag, [ $this, 'tagCallback' ] );
                $parser->parse(
                        "Foo<$tag>Bar</$tag>Baz",
                        Title::newFromText( 'Test' ),
-                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+                       $this->getParserOptions()
                );
                $this->fail( 'Exception not thrown.' );
        }
 
        /**
         * @dataProvider provideValidNames
-        * @covers Parser::setFunctionTagHook
         */
        public function testFunctionTagHooks( $tag ) {
-               global $wgParserConf, $wgContLang;
+               global $wgParserConf;
                $parser = new Parser( $wgParserConf );
 
                $parser->setFunctionTagHook( $tag, [ $this, 'functionTagCallback' ], 0 );
                $parserOutput = $parser->parse(
                        "Foo<$tag>Bar</$tag>Baz",
                        Title::newFromText( 'Test' ),
-                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+                       $this->getParserOptions()
                );
                $this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
 
@@ -78,10 +106,9 @@ class TagHookTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideBadNames
         * @expectedException MWException
-        * @covers Parser::setFunctionTagHook
         */
        public function testBadFunctionTagHooks( $tag ) {
-               global $wgParserConf, $wgContLang;
+               global $wgParserConf;
                $parser = new Parser( $wgParserConf );
 
                $parser->setFunctionTagHook(
@@ -92,7 +119,7 @@ class TagHookTest extends MediaWikiTestCase {
                $parser->parse(
                        "Foo<$tag>Bar</$tag>Baz",
                        Title::newFromText( 'Test' ),
-                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+                       $this->getParserOptions()
                );
                $this->fail( 'Exception not thrown.' );
        }
index 5ea7b1d..8a69b5c 100644 (file)
@@ -20,6 +20,9 @@
  * @file
  */
 
+/**
+ * @group Database
+ */
 class UserPasswordPolicyTest extends MediaWikiTestCase {
 
        protected $policies = [
index e3ea139..3e9c567 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @group Database
+ */
 class RCFeedIntegrationTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
index 71f760d..7b56def 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 class ExtensionProcessorTest extends MediaWikiTestCase {
 
        private $dir, $dirname;
@@ -38,6 +40,58 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                $this->assertArrayNotHasKey( 'AutoloadClasses', $attributes );
        }
 
+       /**
+        * @covers ExtensionProcessor::extractInfo
+        */
+       public function testExtractInfo_namespaces() {
+               // Test that namespace IDs can be overwritten
+               if ( !defined( 'MW_EXTENSION_PROCESSOR_TEST_EXTRACT_INFO_X' ) ) {
+                       define( 'MW_EXTENSION_PROCESSOR_TEST_EXTRACT_INFO_X', 123456 );
+               }
+
+               $processor = new ExtensionProcessor();
+               $processor->extractInfo( $this->dir, self::$default + [
+                       'namespaces' => [
+                               [
+                                       'id' => 332200,
+                                       'constant' => 'MW_EXTENSION_PROCESSOR_TEST_EXTRACT_INFO_A',
+                                       'name' => 'Test_A',
+                                       'content' => 'TestModel'
+                               ],
+                               [ // Test_X will use ID 123456 not 334400
+                                       'id' => 334400,
+                                       'constant' => 'MW_EXTENSION_PROCESSOR_TEST_EXTRACT_INFO_X',
+                                       'name' => 'Test_X',
+                                       'content' => 'TestModel'
+                               ],
+                       ]
+               ], 1 );
+
+               $extracted = $processor->getExtractedInfo();
+
+               $this->assertArrayHasKey(
+                       'MW_EXTENSION_PROCESSOR_TEST_EXTRACT_INFO_A',
+                       $extracted['defines']
+               );
+               $this->assertArrayNotHasKey(
+                       'MW_EXTENSION_PROCESSOR_TEST_EXTRACT_INFO_X',
+                       $extracted['defines']
+               );
+
+               $this->assertSame(
+                       $extracted['defines']['MW_EXTENSION_PROCESSOR_TEST_EXTRACT_INFO_A'],
+                       332200
+               );
+
+               $this->assertArrayHasKey( 'ExtensionNamespaces', $extracted['attributes'] );
+               $this->assertArrayHasKey( 123456, $extracted['attributes']['ExtensionNamespaces'] );
+               $this->assertArrayHasKey( 332200, $extracted['attributes']['ExtensionNamespaces'] );
+               $this->assertArrayNotHasKey( 334400, $extracted['attributes']['ExtensionNamespaces'] );
+
+               $this->assertSame( 'Test_X', $extracted['attributes']['ExtensionNamespaces'][123456] );
+               $this->assertSame( 'Test_A', $extracted['attributes']['ExtensionNamespaces'][332200] );
+       }
+
        public static function provideRegisterHooks() {
                $merge = [ ExtensionRegistry::MERGE_STRATEGY => 'array_merge_recursive' ];
                // Format:
@@ -445,6 +499,72 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                ];
        }
 
+       /**
+        * Attributes under manifest_version 2
+        *
+        * @covers ExtensionProcessor::extractAttributes
+        * @covers ExtensionProcessor::getExtractedInfo
+        */
+       public function testExtractAttributes() {
+               $processor = new ExtensionProcessor();
+               // Load FooBar extension
+               $processor->extractInfo( $this->dir, [ 'name' => 'FooBar' ], 2 );
+               $processor->extractInfo(
+                       $this->dir,
+                       [
+                               'name' => 'Baz',
+                               'attributes' => [
+                                       // Loaded
+                                       'FooBar' => [
+                                               'Plugins' => [
+                                                       'ext.baz.foobar',
+                                               ],
+                                       ],
+                                       // Not loaded
+                                       'FizzBuzz' => [
+                                               'MorePlugins' => [
+                                                       'ext.baz.fizzbuzz',
+                                               ],
+                                       ],
+                               ],
+                       ],
+                       2
+               );
+
+               $info = $processor->getExtractedInfo();
+               $this->assertArrayHasKey( 'FooBarPlugins', $info['attributes'] );
+               $this->assertSame( [ 'ext.baz.foobar' ], $info['attributes']['FooBarPlugins'] );
+               $this->assertArrayNotHasKey( 'FizzBuzzMorePlugins', $info['attributes'] );
+       }
+
+       /**
+        * Attributes under manifest_version 1
+        *
+        * @covers ExtensionProcessor::extractInfo
+        */
+       public function testAttributes1() {
+               $processor = new ExtensionProcessor();
+               $processor->extractInfo(
+                       $this->dir,
+                       [
+                               'name' => 'FooBar',
+                               'FooBarPlugins' => [
+                                       'ext.baz.foobar',
+                               ],
+                               'FizzBuzzMorePlugins' => [
+                                       'ext.baz.fizzbuzz',
+                               ],
+                       ],
+                       1
+               );
+
+               $info = $processor->getExtractedInfo();
+               $this->assertArrayHasKey( 'FooBarPlugins', $info['attributes'] );
+               $this->assertSame( [ 'ext.baz.foobar' ], $info['attributes']['FooBarPlugins'] );
+               $this->assertArrayHasKey( 'FizzBuzzMorePlugins', $info['attributes'] );
+               $this->assertSame( [ 'ext.baz.fizzbuzz' ], $info['attributes']['FizzBuzzMorePlugins'] );
+       }
+
        public function testGlobalSettingsDocumentedInSchema() {
                global $IP;
                $globalSettings = TestingAccessWrapper::newFromClass(
index bf80845..1f2c617 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group Cache
  * @covers MessageBlobStore
@@ -44,6 +46,46 @@ class MessageBlobStoreTest extends PHPUnit_Framework_TestCase {
                return $module;
        }
 
+       /** @covers MessageBlobStore::setLogger */
+       public function testSetLogger() {
+               $blobStore = $this->makeBlobStore();
+               $this->assertSame( null, $blobStore->setLogger( new Psr\Log\NullLogger() ) );
+       }
+
+       /** @covers MessageBlobStore::getResourceLoader */
+       public function testGetResourceLoader() {
+               // Call protected method
+               $blobStore = TestingAccessWrapper::newFromObject( $this->makeBlobStore() );
+               $this->assertInstanceOf(
+                       ResourceLoader::class,
+                       $blobStore->getResourceLoader()
+               );
+       }
+
+       /** @covers MessageBlobStore::fetchMessage */
+       public function testFetchMessage() {
+               $module = $this->makeModule( [ 'mainpage' ] );
+               $rl = new ResourceLoader();
+               $rl->register( $module->getName(), $module );
+
+               $blobStore = $this->makeBlobStore( null, $rl );
+               $blob = $blobStore->getBlob( $module, 'en' );
+
+               $this->assertEquals( '{"mainpage":"Main Page"}', $blob, 'Generated blob' );
+       }
+
+       /** @covers MessageBlobStore::fetchMessage */
+       public function testFetchMessageFail() {
+               $module = $this->makeModule( [ 'i-dont-exist' ] );
+               $rl = new ResourceLoader();
+               $rl->register( $module->getName(), $module );
+
+               $blobStore = $this->makeBlobStore( null, $rl );
+               $blob = $blobStore->getBlob( $module, 'en' );
+
+               $this->assertEquals( '{"i-dont-exist":"\u29fci-dont-exist\u29fd"}', $blob, 'Generated blob' );
+       }
+
        public function testGetBlob() {
                $module = $this->makeModule( [ 'foo' ] );
                $rl = new ResourceLoader();
index 4a3b90a..7d12e59 100644 (file)
@@ -31,9 +31,7 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                                'deprecated' => true,
                        ],
                        'deprecatedTomorrow' => $base + [
-                               'deprecated' => [
-                                       'message' => 'Will be removed tomorrow.'
-                               ],
+                               'deprecated' => 'Will be removed tomorrow.'
                        ],
 
                        'htmlTemplateModule' => $base + [
index aeb82d1..0015486 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @group ResourceLoader
  */
@@ -197,6 +199,62 @@ class ResourceLoaderImageModuleTest extends ResourceLoaderTestCase {
                ] ) );
                $this->assertInstanceOf( ResourceLoaderImage::class, $context->getImageObj() );
        }
+
+       public static function providerGetStyleDeclarations() {
+               return [
+                       [
+                               false,
+<<<TEXT
+background-image: url(rasterized.png);
+       background-image: linear-gradient(transparent, transparent), url(original.svg);
+       background-image: -o-linear-gradient(transparent, transparent), url(rasterized.png);
+TEXT
+                       ],
+                       [
+                               'data:image/svg+xml',
+<<<TEXT
+background-image: url(rasterized.png);
+       background-image: linear-gradient(transparent, transparent), url(data:image/svg+xml);
+       background-image: -o-linear-gradient(transparent, transparent), url(rasterized.png);
+TEXT
+                       ],
+
+               ];
+       }
+
+       /**
+        * @dataProvider providerGetStyleDeclarations
+        * @covers ResourceLoaderImageModule::getStyleDeclarations
+        */
+       public function testGetStyleDeclarations( $dataUriReturnValue, $expected ) {
+               $module = TestingAccessWrapper::newFromObject( new ResourceLoaderImageModule() );
+               $context = $this->getResourceLoaderContext();
+               $image = $this->getImageMock( $context, $dataUriReturnValue );
+
+               $styles = $module->getStyleDeclarations(
+                       $context,
+                       $image,
+                       'load.php'
+               );
+
+               $this->assertEquals( $expected, $styles );
+       }
+
+       private function getImageMock( ResourceLoaderContext $context, $dataUriReturnValue ) {
+               $image = $this->getMockBuilder( 'ResourceLoaderImage' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $image->method( 'getDataUri' )
+                       ->will( $this->returnValue( $dataUriReturnValue ) );
+               $image->expects( $this->any() )
+                       ->method( 'getUrl' )
+                       ->will( $this->returnValueMap( [
+                               [ $context, 'load.php', null, 'original', 'original.svg' ],
+                               [ $context, 'load.php', null, 'rasterized', 'rasterized.png' ],
+                       ] ) );
+
+               return $image;
+       }
 }
 
 class ResourceLoaderImageModuleTestable extends ResourceLoaderImageModule {
index 6751f4d..17861d8 100644 (file)
@@ -76,11 +76,11 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                        'script' => "var a = 'this is';\n {\ninvalid"
                ] );
                $this->assertEquals(
-                       $module->getScript( $context ),
                        'mw.log.error(' .
                                '"JavaScript parse error: Parse error: Unexpected token; ' .
                                'token } expected in file \'input\' on line 3"' .
                        ');',
+                       $module->getScript( $context ),
                        'Replace invalid syntax with error logging'
                );
 
@@ -88,8 +88,8 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                        'script' => "\n'valid';"
                ] );
                $this->assertEquals(
-                       $module->getScript( $context ),
                        "\n'valid';",
+                       $module->getScript( $context ),
                        'Leave valid scripts as-is'
                );
        }
@@ -120,13 +120,13 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                                '../skins/Example/images/quux.png',
                ];
                $this->assertEquals(
-                       $getRelativePaths->invoke( null, $raw ),
                        $canonical,
+                       $getRelativePaths->invoke( null, $raw ),
                        'Insert placeholders'
                );
                $this->assertEquals(
-                       $expandRelativePaths->invoke( null, $canonical ),
                        $raw,
+                       $expandRelativePaths->invoke( null, $canonical ),
                        'Substitute placeholders'
                );
        }
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderOOUIImageModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderOOUIImageModuleTest.php
new file mode 100644 (file)
index 0000000..4e482c8
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * @group ResourceLoader
+ */
+class ResourceLoaderOOUIImageModuleTest extends ResourceLoaderTestCase {
+
+       /**
+        * @covers ResourceLoaderOOUIImageModule::loadFromDefinition
+        */
+       public function testNonDefaultSkin() {
+               $module = new ResourceLoaderOOUIImageModule( [
+                       'class' => 'ResourceLoaderOOUIImageModule',
+                       'name' => 'icons',
+                       'rootPath' => 'tests/phpunit/data/resourceloader/oouiimagemodule',
+               ] );
+
+               // Pretend that 'fakemonobook' is a real skin using the Apex theme
+               SkinFactory::getDefaultInstance()->register(
+                       'fakemonobook',
+                       'FakeMonoBook',
+                       function () {
+                       }
+               );
+               $r = new ReflectionMethod( 'ExtensionRegistry', 'exportExtractedData' );
+               $r->setAccessible( true );
+               $r->invoke( ExtensionRegistry::getInstance(), [
+                       'globals' => [],
+                       'defines' => [],
+                       'callbacks' => [],
+                       'credits' => [],
+                       'autoloaderPaths' => [],
+                       'attributes' => [
+                               'SkinOOUIThemes' => [
+                                       'fakemonobook' => 'Apex',
+                               ],
+                       ],
+               ] );
+
+               $styles = $module->getStyles( $this->getResourceLoaderContext( [ 'skin' => 'fakemonobook' ] ) );
+               $this->assertRegExp(
+                       '/magnifying-glass-apex/',
+                       $styles['all'],
+                       'Generated styles use the non-default image (embed)'
+               );
+               $this->assertRegExp(
+                       '/fakemonobook/',
+                       $styles['all'],
+                       'Generated styles use the non-default image (link)'
+               );
+
+               $styles = $module->getStyles( $this->getResourceLoaderContext() );
+               $this->assertRegExp(
+                       '/magnifying-glass-mediawiki/',
+                       $styles['all'],
+                       'Generated styles use the default image (embed)'
+               );
+               $this->assertRegExp(
+                       '/vector/',
+                       $styles['all'],
+                       'Generated styles use the default image (link)'
+               );
+       }
+
+}
index 1b756be..1e09e92 100644 (file)
@@ -8,7 +8,7 @@ class ResourceLoaderStartUpModuleTest extends ResourceLoaderTestCase {
                ] );
        }
 
-       public static function provideGetModuleRegistrations() {
+       public function provideGetModuleRegistrations() {
                return [
                        [ [
                                'msg' => 'Empty registry',
@@ -33,6 +33,88 @@ mw.loader.register( [
         "test.blank",
         "{blankVer}"
     ]
+] );',
+                       ] ],
+                       [ [
+                               'msg' => 'Omit raw modules from registry',
+                               'modules' => [
+                                       'test.raw' => new ResourceLoaderTestModule( [ 'isRaw' => true ] ),
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                               ],
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );
+mw.loader.register( [
+    [
+        "test.blank",
+        "{blankVer}"
+    ]
+] );',
+                       ] ],
+                       [ [
+                               'msg' => 'Version falls back gracefully if getVersionHash throws',
+                               'modules' => [
+                                       'test.fail' => (
+                                               ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+                                                       ->setMethods( [ 'getVersionHash' ] )->getMock() )
+                                               && $mock->method( 'getVersionHash' )->will(
+                                                       $this->throwException( new Exception )
+                                               )
+                                       ) ? $mock : $mock
+                               ],
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );
+mw.loader.register( [
+    [
+        "test.fail",
+        ""
+    ]
+] );
+mw.loader.state( {
+    "test.fail": "error"
+} );',
+                       ] ],
+                       [ [
+                               'msg' => 'Use version from getVersionHash',
+                               'modules' => [
+                                       'test.version' => (
+                                               ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+                                                       ->setMethods( [ 'getVersionHash' ] )->getMock() )
+                                               && $mock->method( 'getVersionHash' )->willReturn( '1234567' )
+                                       ) ? $mock : $mock
+                               ],
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );
+mw.loader.register( [
+    [
+        "test.version",
+        "1234567"
+    ]
+] );',
+                       ] ],
+                       [ [
+                               'msg' => 'Re-hash version from getVersionHash if too long',
+                               'modules' => [
+                                       'test.version' => (
+                                               ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+                                                       ->setMethods( [ 'getVersionHash' ] )->getMock() )
+                                               && $mock->method( 'getVersionHash' )->willReturn( '12345678' )
+                                       ) ? $mock : $mock
+                               ],
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );
+mw.loader.register( [
+    [
+        "test.version",
+        "016es8l"
+    ]
 ] );',
                        ] ],
                        [ [
@@ -303,8 +385,8 @@ mw.loader.register( [
 
        /**
         * @dataProvider provideGetModuleRegistrations
-        * @covers ResourceLoaderStartUpModule::compileUnresolvedDependencies
         * @covers ResourceLoaderStartUpModule::getModuleRegistrations
+        * @covers ResourceLoaderStartUpModule::compileUnresolvedDependencies
         * @covers ResourceLoader::makeLoaderRegisterScript
         */
        public function testGetModuleRegistrations( $case ) {
@@ -344,6 +426,7 @@ mw.loader.register( [
                ];
        }
        /**
+        * @covers ResourceLoaderStartUpModule::getModuleRegistrations
         * @dataProvider provideRegistrations
         */
        public function testRegistrationsMinified( $modules ) {
@@ -368,6 +451,7 @@ mw.loader.register( [
        }
 
        /**
+        * @covers ResourceLoaderStartUpModule::getModuleRegistrations
         * @dataProvider provideRegistrations
         */
        public function testRegistrationsUnminified( $modules ) {
index e0a82d0..0833047 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 class ResourceLoaderTest extends ResourceLoaderTestCase {
 
        protected function setUp() {
@@ -49,13 +51,26 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
         * @covers ResourceLoader::register
         * @covers ResourceLoader::getModule
         */
-       public function testRegisterValid() {
+       public function testRegisterValidObject() {
                $module = new ResourceLoaderTestModule();
                $resourceLoader = new EmptyResourceLoader();
                $resourceLoader->register( 'test', $module );
                $this->assertEquals( $module, $resourceLoader->getModule( 'test' ) );
        }
 
+       /**
+        * @covers ResourceLoader::register
+        * @covers ResourceLoader::getModule
+        */
+       public function testRegisterValidArray() {
+               $module = new ResourceLoaderTestModule();
+               $resourceLoader = new EmptyResourceLoader();
+               // Covers case of register() setting $rl->moduleInfos,
+               // but $rl->modules lazy-populated by getModule()
+               $resourceLoader->register( 'test', [ 'object' => $module ] );
+               $this->assertEquals( $module, $resourceLoader->getModule( 'test' ) );
+       }
+
        /**
         * @covers ResourceLoader::register
         */
@@ -128,6 +143,23 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                );
        }
 
+       /**
+        * @covers ResourceLoader::getModule
+        */
+       public function testGetModuleFactory() {
+               $factory = function( array $info ) {
+                       $this->assertArrayHasKey( 'kitten', $info );
+                       return new ResourceLoaderTestModule( $info );
+               };
+
+               $rl = new EmptyResourceLoader();
+               $rl->register( 'test', [ 'factory' => $factory, 'kitten' => 'little ball of fur' ] );
+               $this->assertInstanceOf(
+                       ResourceLoaderTestModule::class,
+                       $rl->getModule( 'test' )
+               );
+       }
+
        /**
         * @covers ResourceLoader::getModule
         */
@@ -384,6 +416,33 @@ mw.example();
                );
        }
 
+       /**
+        * @covers ResourceLoader::makeLoaderRegisterScript
+        */
+       public function testMakeLoaderRegisterScript() {
+               $this->assertEquals(
+                       'mw.loader.register( [
+    [
+        "test.name",
+        "1234567"
+    ]
+] );',
+                       ResourceLoader::makeLoaderRegisterScript( [
+                               [ 'test.name', '1234567' ],
+                       ] ),
+                       'Nested array parameter'
+               );
+
+               $this->assertEquals(
+                       'mw.loader.register( "test.name", "1234567" );',
+                       ResourceLoader::makeLoaderRegisterScript(
+                               'test.name',
+                               '1234567'
+                       ),
+                       'Variadic parameters'
+               );
+       }
+
        /**
         * @covers ResourceLoader::makeLoaderSourcesScript
         */
index a332528..78eec6a 100644 (file)
@@ -1,5 +1,9 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\TestingAccessWrapper;
+
 class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
 
        /**
@@ -214,6 +218,156 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                $module = TestingAccessWrapper::newFromObject( $module );
                $this->assertEquals( $expected, $module->getTitleInfo( $context ), 'Title info' );
        }
+
+       /**
+        * @covers ResourceLoaderWikiModule::preloadTitleInfo
+        */
+       public function testGetPreloadedBadTitle() {
+               // Mock values
+               $pages = [
+                       // Covers else branch for invalid page name
+                       '[x]' => [ 'type' => 'styles' ],
+               ];
+               $titleInfo = [];
+
+               // Set up objects
+               $module = $this->getMockBuilder( 'TestResourceLoaderWikiModule' )
+                       ->setMethods( [ 'getPages' ] ) ->getMock();
+               $module->method( 'getPages' )->willReturn( $pages );
+               $module::$returnFetchTitleInfo = $titleInfo;
+               $rl = new EmptyResourceLoader();
+               $rl->register( 'testmodule', $module );
+               $context = new ResourceLoaderContext( $rl, new FauxRequest() );
+
+               // Act
+               TestResourceLoaderWikiModule::preloadTitleInfo(
+                       $context,
+                       wfGetDB( DB_REPLICA ),
+                       [ 'testmodule' ]
+               );
+
+               // Assert
+               $module = TestingAccessWrapper::newFromObject( $module );
+               $this->assertEquals( $titleInfo, $module->getTitleInfo( $context ), 'Title info' );
+       }
+
+       /**
+        * @covers ResourceLoaderWikiModule::preloadTitleInfo
+        */
+       public function testGetPreloadedTitleInfoEmpty() {
+               $context = new ResourceLoaderContext( new EmptyResourceLoader(), new FauxRequest() );
+               // Covers early return
+               $this->assertSame(
+                       null,
+                       ResourceLoaderWikiModule::preloadTitleInfo(
+                               $context,
+                               wfGetDB( DB_REPLICA ),
+                               []
+                       )
+               );
+       }
+
+       public static function provideGetContent() {
+               return [
+                       'Bad title' => [ null, '[x]' ],
+                       'Dead redirect' => [ null, [
+                               'text' => 'Dead redirect',
+                               'title' => 'Dead_redirect',
+                               'redirect' => 1,
+                       ] ],
+                       'Bad content model' => [ null, [
+                               'text' => 'MediaWiki:Wikitext',
+                               'ns' => NS_MEDIAWIKI,
+                               'title' => 'Wikitext',
+                       ] ],
+                       'No JS content found' => [ null, [
+                               'text' => 'MediaWiki:Script.js',
+                               'ns' => NS_MEDIAWIKI,
+                               'title' => 'Script.js',
+                       ] ],
+                       'No CSS content found' => [ null, [
+                               'text' => 'MediaWiki:Styles.css',
+                               'ns' => NS_MEDIAWIKI,
+                               'title' => 'Script.css',
+                       ] ],
+               ];
+       }
+
+       /**
+        * @covers ResourceLoaderWikiModule::getContent
+        * @dataProvider provideGetContent
+        */
+       public function testGetContent( $expected, $title ) {
+               $context = $this->getResourceLoaderContext( [], new EmptyResourceLoader );
+               $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' )
+                       ->setMethods( [ 'getContentObj' ] ) ->getMock();
+               $module->expects( $this->any() )
+                       ->method( 'getContentObj' )->willReturn( null );
+
+               if ( is_array( $title ) ) {
+                       $title += [ 'ns' => NS_MAIN, 'id' => 1, 'len' => 1, 'redirect' => 0 ];
+                       $titleText = $title['text'];
+                       // Mock Title db access via LinkCache
+                       MediaWikiServices::getInstance()->getLinkCache()->addGoodLinkObj(
+                               $title['id'],
+                               new TitleValue( $title['ns'], $title['title'] ),
+                               $title['len'],
+                               $title['redirect']
+                       );
+               } else {
+                       $titleText = $title;
+               }
+
+               $module = TestingAccessWrapper::newFromObject( $module );
+               $this->assertEquals(
+                       $expected,
+                       $module->getContent( $titleText )
+               );
+       }
+
+       /**
+        * @covers ResourceLoaderWikiModule::getContent
+        */
+       public function testGetContentForRedirects() {
+               // Set up context and module object
+               $context = $this->getResourceLoaderContext( [], new EmptyResourceLoader );
+               $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' )
+                       ->setMethods( [ 'getPages', 'getContentObj' ] )
+                       ->getMock();
+               $module->expects( $this->any() )
+                       ->method( 'getPages' )
+                       ->will( $this->returnValue( [
+                               'MediaWiki:Redirect.js' => [ 'type' => 'script' ]
+                       ] ) );
+               $module->expects( $this->any() )
+                       ->method( 'getContentObj' )
+                       ->will( $this->returnCallback( function ( Title $title ) {
+                               if ( $title->getPrefixedText() === 'MediaWiki:Redirect.js' ) {
+                                       $handler = new JavaScriptContentHandler();
+                                       return $handler->makeRedirectContent(
+                                               Title::makeTitle( NS_MEDIAWIKI, 'Target.js' )
+                                       );
+                               } elseif ( $title->getPrefixedText() === 'MediaWiki:Target.js' ) {
+                                       return new JavaScriptContent( 'target;' );
+                               } else {
+                                       return null;
+                               }
+                       } ) );
+
+               // Mock away Title's db queries with LinkCache
+               MediaWikiServices::getInstance()->getLinkCache()->addGoodLinkObj(
+                       1, // id
+                       new TitleValue( NS_MEDIAWIKI, 'Redirect.js' ),
+                       1, // len
+                       1 // redirect
+               );
+
+               $this->assertEquals(
+                       "/*\nMediaWiki:Redirect.js\n*/\ntarget;\n",
+                       $module->getScript( $context ),
+                       'Redirect resolved by getContent'
+               );
+       }
 }
 
 class TestResourceLoaderWikiModule extends ResourceLoaderWikiModule {
index 6833893..fbbcee5 100644 (file)
@@ -1,5 +1,7 @@
 <?php
+
 use MediaWiki\MediaWikiServices;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Search
@@ -26,6 +28,11 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                $this->insertPage( 'Example Foo' );
                $this->insertPage( 'Example Foo/Bar' );
                $this->insertPage( 'Example/Baz' );
+               $this->insertPage( 'Sample' );
+               $this->insertPage( 'Sample Ban' );
+               $this->insertPage( 'Sample Eat' );
+               $this->insertPage( 'Sample Who' );
+               $this->insertPage( 'Sample Zoo' );
                $this->insertPage( 'Redirect test', '#REDIRECT [[Redirect Test]]' );
                $this->insertPage( 'Redirect Test' );
                $this->insertPage( 'Redirect Test Worse Result' );
@@ -94,15 +101,15 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                        ] ],
                        [ [
                                'Main namespace with title prefix',
-                               'query' => 'Ex',
+                               'query' => 'Sa',
                                'results' => [
-                                       'Example',
-                                       'Example/Baz',
-                                       'Example Bar',
+                                       'Sample',
+                                       'Sample Ban',
+                                       'Sample Eat',
                                ],
                                // Third result when testing offset
                                'offsetresult' => [
-                                       'Example Foo',
+                                       'Sample Who',
                                ],
                        ] ],
                        [ [
@@ -181,6 +188,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                $results = array_map( function( Title $t ) {
                        return $t->getPrefixedText();
                }, $results );
+
                $this->assertEquals(
                        $case['results'],
                        $results,
index 3fb4bbb..c74c893 100644 (file)
@@ -164,7 +164,8 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                /**
                 * @var $mockEngine SearchEngine
                 */
-               $mockEngine = $this->getMock( 'SearchEngine', [ 'makeSearchFieldMapping' ] );
+               $mockEngine = $this->getMockBuilder( 'SearchEngine' )
+                       ->setMethods( [ 'makeSearchFieldMapping' ] )->getMock();
 
                $mockFieldBuilder = function ( $name, $type ) {
                        $mockField =
@@ -230,7 +231,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
        }
 
        public function addAugmentors( &$setAugmentors, &$rowAugmentors ) {
-               $setAugmentor = $this->getMock( 'ResultSetAugmentor' );
+               $setAugmentor = $this->createMock( 'ResultSetAugmentor' );
                $setAugmentor->expects( $this->once() )
                        ->method( 'augmentAll' )
                        ->willReturnCallback( function ( SearchResultSet $resultSet ) {
@@ -244,7 +245,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        } );
                $setAugmentors['testSet'] = $setAugmentor;
 
-               $rowAugmentor = $this->getMock( 'ResultAugmentor' );
+               $rowAugmentor = $this->createMock( 'ResultAugmentor' );
                $rowAugmentor->expects( $this->exactly( 2 ) )
                        ->method( 'augment' )
                        ->willReturnCallback( function ( SearchResult $result ) {
index ec046a7..bb7508c 100644 (file)
@@ -10,7 +10,7 @@ class SearchIndexFieldTest extends MediaWikiTestCase {
                return [
                        [ 0, 'test', 0, 'test', true ],
                        [ SearchIndexField::INDEX_TYPE_NESTED, 'test',
-                         SearchIndexField::INDEX_TYPE_NESTED, 'test', false ],
+                               SearchIndexField::INDEX_TYPE_NESTED, 'test', false ],
                        [ 0, 'test', 0, 'test2', true ],
                        [ 0, 'test', 1, 'test', false ],
                ];
@@ -18,14 +18,23 @@ class SearchIndexFieldTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider getMergeCases
+        * @param $t1
+        * @param $n1
+        * @param $t2
+        * @param $n2
+        * @param $result
         */
        public function testMerge( $t1, $n1, $t2, $n2, $result ) {
-               $field1 = $this->getMockBuilder( 'SearchIndexFieldDefinition' )
-                       ->setMethods( [ 'getMapping' ] )
-                       ->setConstructorArgs( [ $n1, $t1 ] )->getMock();
-               $field2 = $this->getMockBuilder( 'SearchIndexFieldDefinition' )
-                       ->setMethods( [ 'getMapping' ] )
-                       ->setConstructorArgs( [ $n2, $t2 ] )->getMock();
+               $field1 =
+                       $this->getMockBuilder( SearchIndexFieldDefinition::class )
+                               ->setMethods( [ 'getMapping' ] )
+                               ->setConstructorArgs( [ $n1, $t1 ] )
+                               ->getMock();
+               $field2 =
+                       $this->getMockBuilder( SearchIndexFieldDefinition::class )
+                               ->setMethods( [ 'getMapping' ] )
+                               ->setConstructorArgs( [ $n2, $t2 ] )
+                               ->getMock();
 
                if ( $result ) {
                        $this->assertNotFalse( $field1->merge( $field2 ) );
@@ -35,5 +44,13 @@ class SearchIndexFieldTest extends MediaWikiTestCase {
 
                $field1->setFlag( 0xFF );
                $this->assertFalse( $field1->merge( $field2 ) );
+
+               $field1->setMergeCallback(
+                       function ( $a, $b ) {
+                               return "test";
+                       }
+               );
+               $this->assertEquals( "test", $field1->merge( $field2 ) );
        }
+
 }
index c1eef2e..90550d2 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Session;
 
 use Psr\Log\LogLevel;
 use MediaWikiTestCase;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Session
@@ -127,7 +128,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $provider = new BotPasswordSessionProvider( [
                        'priority' => 40
                ] );
-               $priv = \TestingAccessWrapper::newFromObject( $provider );
+               $priv = TestingAccessWrapper::newFromObject( $provider );
                $this->assertSame( 40, $priv->priority );
                $this->assertSame( '_BPsession', $priv->sessionCookieName );
                $this->assertSame( [], $priv->sessionCookieOptions );
@@ -136,7 +137,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                        'priority' => 40,
                        'sessionCookieName' => null,
                ] );
-               $priv = \TestingAccessWrapper::newFromObject( $provider );
+               $priv = TestingAccessWrapper::newFromObject( $provider );
                $this->assertSame( '_BPsession', $priv->sessionCookieName );
 
                $provider = new BotPasswordSessionProvider( [
@@ -144,7 +145,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                        'sessionCookieName' => 'Foo',
                        'sessionCookieOptions' => [ 'Bar' ],
                ] );
-               $priv = \TestingAccessWrapper::newFromObject( $provider );
+               $priv = TestingAccessWrapper::newFromObject( $provider );
                $this->assertSame( 'Foo', $priv->sessionCookieName );
                $this->assertSame( [ 'Bar' ], $priv->sessionCookieOptions );
        }
@@ -183,7 +184,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
        public function testNewSessionInfoForRequest() {
                $provider = $this->getProvider();
                $user = static::getTestSysop()->getUser();
-               $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
+               $request = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'getIP' ] )->getMock();
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '127.0.0.1' ) );
                $bp = \BotPassword::newFromUser( $user, 'BotPasswordSessionProvider' );
@@ -210,7 +212,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $provider->setLogger( $logger );
 
                $user = static::getTestSysop()->getUser();
-               $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
+               $request = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'getIP' ] )->getMock();
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '127.0.0.1' ) );
                $bp = \BotPassword::newFromUser( $user, 'BotPasswordSessionProvider' );
@@ -261,7 +264,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                ], $logger->getBuffer() );
                $logger->clearBuffer();
 
-               $request2 = $this->getMock( 'FauxRequest', [ 'getIP' ] );
+               $request2 = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'getIP' ] )->getMock();
                $request2->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '10.0.0.1' ) );
                $data['metadata'] = $dataMD;
@@ -286,7 +290,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $provider->setLogger( $logger );
 
                $backend = TestUtils::getDummySessionBackend();
-               $backendPriv = \TestingAccessWrapper::newFromObject( $backend );
+               $backendPriv = TestingAccessWrapper::newFromObject( $backend );
 
                try {
                        $provider->getAllowedUserRights( $backend );
index da4b06e..a47fd9a 100644 (file)
@@ -5,6 +5,7 @@ namespace MediaWiki\Session;
 use MediaWikiTestCase;
 use User;
 use Psr\Log\LogLevel;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Session
@@ -76,7 +77,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                }
 
                $config = $this->getConfig();
-               $p = \TestingAccessWrapper::newFromObject(
+               $p = TestingAccessWrapper::newFromObject(
                        new CookieSessionProvider( [ 'priority' => 1 ] )
                );
                $p->setLogger( new \TestLogger() );
@@ -95,7 +96,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                ], $p->cookieOptions );
 
                $config->set( 'SessionName', 'SessionName' );
-               $p = \TestingAccessWrapper::newFromObject(
+               $p = TestingAccessWrapper::newFromObject(
                        new CookieSessionProvider( [ 'priority' => 3 ] )
                );
                $p->setLogger( new \TestLogger() );
@@ -113,7 +114,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                        'httpOnly' => true,
                ], $p->cookieOptions );
 
-               $p = \TestingAccessWrapper::newFromObject( new CookieSessionProvider( [
+               $p = TestingAccessWrapper::newFromObject( new CookieSessionProvider( [
                        'priority' => 10,
                        'callUserSetCookiesHook' => true,
                        'cookieOptions' => [
@@ -151,7 +152,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
 
                $this->assertEquals(
                        $extendedCookies,
-                       \TestingAccessWrapper::newFromObject( $provider )->getExtendedLoginCookies(),
+                       TestingAccessWrapper::newFromObject( $provider )->getExtendedLoginCookies(),
                        'List of extended cookies (subclasses can add values, but we\'re calling the core one here)'
                );
 
@@ -412,9 +413,11 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                        new \Psr\Log\NullLogger(),
                        10
                );
-               \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
+               TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
 
-               $mock = $this->getMock( 'stdClass', [ 'onUserSetCookies' ] );
+               $mock = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ 'onUserSetCookies' ] )
+                       ->getMock();
                $mock->expects( $this->never() )->method( 'onUserSetCookies' );
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'UserSetCookies' => [ $mock ] ] );
 
@@ -497,7 +500,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                        new \Psr\Log\NullLogger(),
                        10
                );
-               \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
+               TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
                $backend->setUser( $user );
                $backend->setRememberUser( $remember );
                $backend->setForceHTTPS( $secure );
@@ -560,13 +563,15 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
        }
 
        protected function getSentRequest() {
-               $sentResponse = $this->getMock( 'FauxResponse', [ 'headersSent', 'setCookie', 'header' ] );
+               $sentResponse = $this->getMockBuilder( 'FauxResponse' )
+                       ->setMethods( [ 'headersSent', 'setCookie', 'header' ] )->getMock();
                $sentResponse->expects( $this->any() )->method( 'headersSent' )
                        ->will( $this->returnValue( true ) );
                $sentResponse->expects( $this->never() )->method( 'setCookie' );
                $sentResponse->expects( $this->never() )->method( 'header' );
 
-               $sentRequest = $this->getMock( 'FauxRequest', [ 'response' ] );
+               $sentRequest = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'response' ] )->getMock();
                $sentRequest->expects( $this->any() )->method( 'response' )
                        ->will( $this->returnValue( $sentResponse ) );
                return $sentRequest;
@@ -600,10 +605,11 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                        new \Psr\Log\NullLogger(),
                        10
                );
-               \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
+               TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
 
                // Anonymous user
-               $mock = $this->getMock( 'stdClass', [ 'onUserSetCookies' ] );
+               $mock = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ 'onUserSetCookies' ] )->getMock();
                $mock->expects( $this->never() )->method( 'onUserSetCookies' );
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'UserSetCookies' => [ $mock ] ] );
                $backend->setUser( $anon );
@@ -621,7 +627,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $provider->persistSession( $backend, $this->getSentRequest() );
 
                // Logged-in user, no remember
-               $mock = $this->getMock( __CLASS__, [ 'onUserSetCookies' ] );
+               $mock = $this->getMockBuilder( __CLASS__ )
+                       ->setMethods( [ 'onUserSetCookies' ] )->getMock();
                $mock->expects( $this->once() )->method( 'onUserSetCookies' )
                        ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $user ) {
                                $this->assertSame( $user, $u );
@@ -664,7 +671,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $provider->persistSession( $backend, $this->getSentRequest() );
 
                // Logged-in user, remember
-               $mock = $this->getMock( __CLASS__, [ 'onUserSetCookies' ] );
+               $mock = $this->getMockBuilder( __CLASS__ )
+                       ->setMethods( [ 'onUserSetCookies' ] )->getMock();
                $mock->expects( $this->once() )->method( 'onUserSetCookies' )
                        ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $user ) {
                                $this->assertSame( $user, $u );
@@ -729,7 +737,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
        }
 
        public function testSetLoggedOutCookie() {
-               $provider = \TestingAccessWrapper::newFromObject( new CookieSessionProvider( [
+               $provider = TestingAccessWrapper::newFromObject( new CookieSessionProvider( [
                        'priority' => 1,
                        'sessionName' => 'MySessionName',
                        'cookieOptions' => [ 'prefix' => 'x' ],
@@ -776,7 +784,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $provider->setLogger( new \Psr\Log\NullLogger() );
                $provider->setConfig( $this->getConfig() );
                $provider->setManager( SessionManager::singleton() );
-               $provider = \TestingAccessWrapper::newFromObject( $provider );
+               $provider = TestingAccessWrapper::newFromObject( $provider );
 
                $request = new \FauxRequest();
                $request->setCookies( [
@@ -808,7 +816,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
 
        public function testGetLoginCookieExpiration() {
                $config = $this->getConfig();
-               $provider = \TestingAccessWrapper::newFromObject( new CookieSessionProvider( [
+               $provider = TestingAccessWrapper::newFromObject( new CookieSessionProvider( [
                        'priority' => 10
                ] ) );
                $provider->setLogger( new \Psr\Log\NullLogger() );
index 78edb76..086fa28 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Session;
 
 use MediaWikiTestCase;
 use User;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Session
@@ -37,7 +38,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase {
        public function testConstructor() {
                $provider = $this->getMockBuilder( ImmutableSessionProviderWithCookie::class )
                        ->getMockForAbstractClass();
-               $priv = \TestingAccessWrapper::newFromObject( $provider );
+               $priv = TestingAccessWrapper::newFromObject( $provider );
                $this->assertNull( $priv->sessionCookieName );
                $this->assertSame( [], $priv->sessionCookieOptions );
 
@@ -47,7 +48,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase {
                                'sessionCookieOptions' => [ 'Bar' ],
                        ] ] )
                        ->getMockForAbstractClass();
-               $priv = \TestingAccessWrapper::newFromObject( $provider );
+               $priv = TestingAccessWrapper::newFromObject( $provider );
                $this->assertSame( 'Foo', $priv->sessionCookieName );
                $this->assertSame( [ 'Bar' ], $priv->sessionCookieOptions );
 
@@ -119,7 +120,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase {
                        'bad' => 'bad',
                ], '' );
 
-               $provider = \TestingAccessWrapper::newFromObject( $this->getProvider( null ) );
+               $provider = TestingAccessWrapper::newFromObject( $this->getProvider( null ) );
                try {
                        $provider->getSessionIdFromCookie( $request );
                        $this->fail( 'Expected exception not thrown' );
@@ -131,39 +132,42 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase {
                        );
                }
 
-               $provider = \TestingAccessWrapper::newFromObject( $this->getProvider( 'Foo' ) );
+               $provider = TestingAccessWrapper::newFromObject( $this->getProvider( 'Foo' ) );
                $this->assertSame(
                        'wgfoo---------------------------',
                        $provider->getSessionIdFromCookie( $request )
                );
 
-               $provider = \TestingAccessWrapper::newFromObject( $this->getProvider( 'Foo', 'Bar' ) );
+               $provider = TestingAccessWrapper::newFromObject( $this->getProvider( 'Foo', 'Bar' ) );
                $this->assertSame(
                        'foobar--------------------------',
                        $provider->getSessionIdFromCookie( $request )
                );
 
-               $provider = \TestingAccessWrapper::newFromObject( $this->getProvider( 'Foo', '' ) );
+               $provider = TestingAccessWrapper::newFromObject( $this->getProvider( 'Foo', '' ) );
                $this->assertSame(
                        'foo-----------------------------',
                        $provider->getSessionIdFromCookie( $request )
                );
 
-               $provider = \TestingAccessWrapper::newFromObject( $this->getProvider( 'bad', '' ) );
+               $provider = TestingAccessWrapper::newFromObject( $this->getProvider( 'bad', '' ) );
                $this->assertSame( null, $provider->getSessionIdFromCookie( $request ) );
 
-               $provider = \TestingAccessWrapper::newFromObject( $this->getProvider( 'none', '' ) );
+               $provider = TestingAccessWrapper::newFromObject( $this->getProvider( 'none', '' ) );
                $this->assertSame( null, $provider->getSessionIdFromCookie( $request ) );
        }
 
        protected function getSentRequest() {
-               $sentResponse = $this->getMock( 'FauxResponse', [ 'headersSent', 'setCookie', 'header' ] );
+               $sentResponse = $this->getMockBuilder( 'FauxResponse' )
+                       ->setMethods( [ 'headersSent', 'setCookie', 'header' ] )
+                       ->getMock();
                $sentResponse->expects( $this->any() )->method( 'headersSent' )
                        ->will( $this->returnValue( true ) );
                $sentResponse->expects( $this->never() )->method( 'setCookie' );
                $sentResponse->expects( $this->never() )->method( 'header' );
 
-               $sentRequest = $this->getMock( 'FauxRequest', [ 'response' ] );
+               $sentRequest = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'response' ] )->getMock();
                $sentRequest->expects( $this->any() )->method( 'response' )
                        ->will( $this->returnValue( $sentResponse ) );
                return $sentRequest;
@@ -182,7 +186,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase {
 
                $provider = $this->getProvider( 'session' );
                $provider->setLogger( new \Psr\Log\NullLogger() );
-               $priv = \TestingAccessWrapper::newFromObject( $provider );
+               $priv = TestingAccessWrapper::newFromObject( $provider );
                $priv->sessionCookieOptions = [
                        'prefix' => 'x',
                        'path' => 'CookiePath',
@@ -208,7 +212,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase {
                        new \Psr\Log\NullLogger(),
                        10
                );
-               \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
+               TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
                $backend->setRememberUser( $remember );
                $backend->setForceHTTPS( $secure );
 
@@ -278,7 +282,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase {
        public function testUnpersistSession() {
                $provider = $this->getProvider( 'session', '' );
                $provider->setLogger( new \Psr\Log\NullLogger() );
-               $priv = \TestingAccessWrapper::newFromObject( $provider );
+               $priv = TestingAccessWrapper::newFromObject( $provider );
 
                // No cookie
                $priv->sessionCookieName = null;
index 34e5e44..0a2e84e 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Session;
 
 use Psr\Log\LogLevel;
 use MediaWikiTestCase;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Session
@@ -26,7 +27,7 @@ class PHPSessionHandlerTest extends MediaWikiTestCase {
                $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' );
                $rProp->setAccessible( true );
                if ( $rProp->getValue() ) {
-                       $old = \TestingAccessWrapper::newFromObject( $rProp->getValue() );
+                       $old = TestingAccessWrapper::newFromObject( $rProp->getValue() );
                        $oldManager = $old->manager;
                        $oldStore = $old->store;
                        $oldLogger = $old->logger;
@@ -40,7 +41,7 @@ class PHPSessionHandlerTest extends MediaWikiTestCase {
        }
 
        public function testEnableFlags() {
-               $handler = \TestingAccessWrapper::newFromObject(
+               $handler = TestingAccessWrapper::newFromObject(
                        $this->getMockBuilder( PHPSessionHandler::class )
                                ->setMethods( null )
                                ->disableOriginalConstructor()
@@ -93,7 +94,7 @@ class PHPSessionHandlerTest extends MediaWikiTestCase {
                $this->assertFalse( wfIniGetBool( 'session.use_trans_sid' ) );
 
                $this->assertNotNull( $rProp->getValue() );
-               $priv = \TestingAccessWrapper::newFromObject( $rProp->getValue() );
+               $priv = TestingAccessWrapper::newFromObject( $rProp->getValue() );
                $this->assertSame( $manager, $priv->manager );
                $this->assertSame( $store, $priv->store );
                $this->assertSame( $logger, $priv->logger );
@@ -122,7 +123,7 @@ class PHPSessionHandlerTest extends MediaWikiTestCase {
                        'logger' => $logger,
                ] );
                PHPSessionHandler::install( $manager );
-               $wrap = \TestingAccessWrapper::newFromObject( $rProp->getValue() );
+               $wrap = TestingAccessWrapper::newFromObject( $rProp->getValue() );
                $reset[] = new \Wikimedia\ScopedCallback(
                        [ $wrap, 'setEnableFlags' ],
                        [ $wrap->enable ? $wrap->warn ? 'warn' : 'enable' : 'disable' ]
@@ -323,7 +324,7 @@ class PHPSessionHandlerTest extends MediaWikiTestCase {
                        ->setMethods( null )
                        ->disableOriginalConstructor()
                        ->getMock();
-               \TestingAccessWrapper::newFromObject( $handler )->setEnableFlags( 'disable' );
+               TestingAccessWrapper::newFromObject( $handler )->setEnableFlags( 'disable' );
                $oldValue = $rProp->getValue();
                $rProp->setValue( $handler );
                $reset = new \Wikimedia\ScopedCallback( [ $rProp, 'setValue' ], [ $oldValue ] );
@@ -350,7 +351,7 @@ class PHPSessionHandlerTest extends MediaWikiTestCase {
                        ->setMethods( null )
                        ->disableOriginalConstructor()
                        ->getMock();
-               \TestingAccessWrapper::newFromObject( $handler )->setEnableFlags( 'enable' );
+               TestingAccessWrapper::newFromObject( $handler )->setEnableFlags( 'enable' );
 
                call_user_func_array( [ $handler, $method ], $args );
        }
index 8a0adba..e0d1c30 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Session;
 
 use MediaWikiTestCase;
 use User;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Session
@@ -61,13 +62,13 @@ class SessionBackendTest extends MediaWikiTestCase {
                $id = new SessionId( $info->getId() );
 
                $backend = new SessionBackend( $id, $info, $this->store, $logger, 10 );
-               $priv = \TestingAccessWrapper::newFromObject( $backend );
+               $priv = TestingAccessWrapper::newFromObject( $backend );
                $priv->persist = false;
                $priv->requests = [ 100 => new \FauxRequest() ];
                $priv->requests[100]->setSessionId( $id );
                $priv->usePhpSessionHandling = false;
 
-               $manager = \TestingAccessWrapper::newFromObject( $this->manager );
+               $manager = TestingAccessWrapper::newFromObject( $this->manager );
                $manager->allSessionBackends = [ $backend->getId() => $backend ] + $manager->allSessionBackends;
                $manager->allSessionIds = [ $backend->getId() => $id ] + $manager->allSessionIds;
                $manager->sessionProviders = [ (string)$this->provider => $this->provider ];
@@ -168,16 +169,16 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->assertSame( $info->wasPersisted(), $backend->isPersistent() );
                $this->assertSame( $info->wasRemembered(), $backend->shouldRememberUser() );
                $this->assertSame( $info->forceHTTPS(), $backend->shouldForceHTTPS() );
-               $this->assertSame( $expire, \TestingAccessWrapper::newFromObject( $backend )->expires );
+               $this->assertSame( $expire, TestingAccessWrapper::newFromObject( $backend )->expires );
                $this->assertSame( [ 'foo' ], $backend->getProviderMetadata() );
        }
 
        public function testSessionStuff() {
                $backend = $this->getBackend();
-               $priv = \TestingAccessWrapper::newFromObject( $backend );
+               $priv = TestingAccessWrapper::newFromObject( $backend );
                $priv->requests = []; // Remove dummy session
 
-               $manager = \TestingAccessWrapper::newFromObject( $this->manager );
+               $manager = TestingAccessWrapper::newFromObject( $this->manager );
 
                $request1 = new \FauxRequest();
                $session1 = $backend->getSession( $request1 );
@@ -188,7 +189,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->assertInstanceOf( Session::class, $session2 );
                $this->assertSame( 2, count( $priv->requests ) );
 
-               $index = \TestingAccessWrapper::newFromObject( $session1 )->index;
+               $index = TestingAccessWrapper::newFromObject( $session1 )->index;
 
                $this->assertSame( $request1, $backend->getRequest( $index ) );
                $this->assertSame( null, $backend->suggestLoginUsername( $index ) );
@@ -220,7 +221,7 @@ class SessionBackendTest extends MediaWikiTestCase {
 
        public function testSetProviderMetadata() {
                $backend = $this->getBackend();
-               $priv = \TestingAccessWrapper::newFromObject( $backend );
+               $priv = TestingAccessWrapper::newFromObject( $backend );
                $priv->providerMetadata = [ 'dummy' ];
 
                try {
@@ -265,7 +266,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                        ->will( $this->returnValue( false ) );
                $this->provider->expects( $this->never() )->method( 'sessionIdWasReset' );
                $backend = $this->getBackend( User::newFromName( 'UTSysop' ) );
-               $manager = \TestingAccessWrapper::newFromObject( $this->manager );
+               $manager = TestingAccessWrapper::newFromObject( $this->manager );
                $sessionId = $backend->getSessionId();
                $backend->resetId();
                $this->assertSame( self::SESSIONID, $backend->getId() );
@@ -279,7 +280,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                $backend = $this->getBackend();
                $this->provider->expects( $this->once() )->method( 'sessionIdWasReset' )
                        ->with( $this->identicalTo( $backend ), $this->identicalTo( self::SESSIONID ) );
-               $manager = \TestingAccessWrapper::newFromObject( $this->manager );
+               $manager = TestingAccessWrapper::newFromObject( $this->manager );
                $sessionId = $backend->getSessionId();
                $backend->resetId();
                $this->assertNotEquals( self::SESSIONID, $backend->getId() );
@@ -293,7 +294,8 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testPersist() {
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->once() )->method( 'persistSession' );
                $backend = $this->getBackend();
                $this->assertFalse( $backend->isPersistent(), 'sanity check' );
@@ -304,7 +306,7 @@ class SessionBackendTest extends MediaWikiTestCase {
 
                $this->provider = null;
                $backend = $this->getBackend();
-               $wrap = \TestingAccessWrapper::newFromObject( $backend );
+               $wrap = TestingAccessWrapper::newFromObject( $backend );
                $wrap->persist = true;
                $wrap->expires = 0;
                $backend->persist();
@@ -312,10 +314,11 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testUnpersist() {
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'unpersistSession' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'unpersistSession' ] )->getMock();
                $this->provider->expects( $this->once() )->method( 'unpersistSession' );
                $backend = $this->getBackend();
-               $wrap = \TestingAccessWrapper::newFromObject( $backend );
+               $wrap = TestingAccessWrapper::newFromObject( $backend );
                $wrap->store = new \CachedBagOStuff( $this->store );
                $wrap->persist = true;
                $wrap->dataDirty = true;
@@ -327,7 +330,9 @@ class SessionBackendTest extends MediaWikiTestCase {
                $backend->unpersist();
                $this->assertFalse( $backend->isPersistent() );
                $this->assertFalse( $this->store->getSession( self::SESSIONID ) );
-               $this->assertNotFalse( $wrap->store->get( wfMemcKey( 'MWSession', self::SESSIONID ) ) );
+               $this->assertNotFalse(
+                       $wrap->store->get( $wrap->store->makeKey( 'MWSession', self::SESSIONID ) )
+               );
        }
 
        public function testRememberUser() {
@@ -362,7 +367,8 @@ class SessionBackendTest extends MediaWikiTestCase {
        public function testSetUser() {
                $user = static::getTestSysop()->getUser();
 
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'canChangeUser' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'canChangeUser' ] )->getMock();
                $this->provider->expects( $this->any() )->method( 'canChangeUser' )
                        ->will( $this->returnValue( false ) );
                $backend = $this->getBackend();
@@ -388,7 +394,7 @@ class SessionBackendTest extends MediaWikiTestCase {
 
        public function testDirty() {
                $backend = $this->getBackend();
-               $priv = \TestingAccessWrapper::newFromObject( $backend );
+               $priv = TestingAccessWrapper::newFromObject( $backend );
                $priv->dataDirty = false;
                $backend->dirty();
                $this->assertTrue( $priv->dataDirty );
@@ -398,7 +404,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                $backend = $this->getBackend();
                $data = $backend->getData();
                $this->assertSame( [], $data );
-               $this->assertTrue( \TestingAccessWrapper::newFromObject( $backend )->dataDirty );
+               $this->assertTrue( TestingAccessWrapper::newFromObject( $backend )->dataDirty );
                $data['???'] = '!!!';
                $this->assertSame( [ '???' => '!!!' ], $data );
 
@@ -406,12 +412,12 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend();
                $this->assertSame( $testData, $backend->getData() );
-               $this->assertFalse( \TestingAccessWrapper::newFromObject( $backend )->dataDirty );
+               $this->assertFalse( TestingAccessWrapper::newFromObject( $backend )->dataDirty );
        }
 
        public function testAddData() {
                $backend = $this->getBackend();
-               $priv = \TestingAccessWrapper::newFromObject( $backend );
+               $priv = TestingAccessWrapper::newFromObject( $backend );
 
                $priv->data = [ 'foo' => 1 ];
                $priv->dataDirty = false;
@@ -435,7 +441,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        public function testDelaySave() {
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionMetadata' => [ $this ] ] );
                $backend = $this->getBackend();
-               $priv = \TestingAccessWrapper::newFromObject( $backend );
+               $priv = TestingAccessWrapper::newFromObject( $backend );
                $priv->persist = true;
 
                // Saves happen normally when no delay is in effect
@@ -488,7 +494,8 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->store = new TestBagOStuff();
                $testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ];
 
-               $neverHook = $this->getMock( __CLASS__, [ 'onSessionMetadata' ] );
+               $neverHook = $this->getMockBuilder( __CLASS__ )
+                       ->setMethods( [ 'onSessionMetadata' ] )->getMock();
                $neverHook->expects( $this->never() )->method( 'onSessionMetadata' );
 
                $builder = $this->getMockBuilder( 'DummySessionProvider' )
@@ -505,8 +512,8 @@ class SessionBackendTest extends MediaWikiTestCase {
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
                $this->assertFalse( $backend->isPersistent(), 'sanity check' );
-               \TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
-               \TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
                $backend->save();
                $this->assertFalse( $this->store->getSession( self::SESSIONID ), 'making sure it didn\'t save' );
 
@@ -518,11 +525,11 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
-               \TestingAccessWrapper::newFromObject( $backend )->persist = false;
-               \TestingAccessWrapper::newFromObject( $backend )->forcePersist = true;
+               TestingAccessWrapper::newFromObject( $backend )->persist = false;
+               TestingAccessWrapper::newFromObject( $backend )->forcePersist = true;
                $this->assertFalse( $backend->isPersistent(), 'sanity check' );
-               \TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
-               \TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
                $backend->save();
                $this->assertFalse( $this->store->getSession( self::SESSIONID ), 'making sure it didn\'t save' );
 
@@ -531,14 +538,14 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionMetadata' => [ $neverHook ] ] );
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
-               \TestingAccessWrapper::newFromObject( $backend )->requests[100]
+               TestingAccessWrapper::newFromObject( $backend )->requests[100]
                        ->setSessionId( new SessionId( 'x' ) );
                $this->store->deleteSession( self::SESSIONID );
-               \TestingAccessWrapper::newFromObject( $backend )->persist = false;
-               \TestingAccessWrapper::newFromObject( $backend )->forcePersist = true;
+               TestingAccessWrapper::newFromObject( $backend )->persist = false;
+               TestingAccessWrapper::newFromObject( $backend )->forcePersist = true;
                $this->assertFalse( $backend->isPersistent(), 'sanity check' );
-               \TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
-               \TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
                $backend->save();
                $this->assertFalse( $this->store->getSession( self::SESSIONID ), 'making sure it didn\'t save' );
 
@@ -550,8 +557,8 @@ class SessionBackendTest extends MediaWikiTestCase {
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
                $this->assertFalse( $backend->isPersistent(), 'sanity check' );
-               \TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
-               \TestingAccessWrapper::newFromObject( $backend )->dataDirty = true;
+               TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->dataDirty = true;
                $backend->save();
                $this->assertTrue( $this->onSessionMetadataCalled );
                $blob = $this->store->getSession( self::SESSIONID );
@@ -570,10 +577,10 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
-               \TestingAccessWrapper::newFromObject( $backend )->persist = true;
+               TestingAccessWrapper::newFromObject( $backend )->persist = true;
                $this->assertTrue( $backend->isPersistent(), 'sanity check' );
-               \TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
-               \TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
                $backend->save();
                $this->assertFalse( $this->store->getSession( self::SESSIONID ), 'making sure it didn\'t save' );
 
@@ -585,11 +592,11 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
-               \TestingAccessWrapper::newFromObject( $backend )->persist = true;
-               \TestingAccessWrapper::newFromObject( $backend )->forcePersist = true;
+               TestingAccessWrapper::newFromObject( $backend )->persist = true;
+               TestingAccessWrapper::newFromObject( $backend )->forcePersist = true;
                $this->assertTrue( $backend->isPersistent(), 'sanity check' );
-               \TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
-               \TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
                $backend->save();
                $this->assertFalse( $this->store->getSession( self::SESSIONID ), 'making sure it didn\'t save' );
 
@@ -600,10 +607,10 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
-               \TestingAccessWrapper::newFromObject( $backend )->persist = true;
+               TestingAccessWrapper::newFromObject( $backend )->persist = true;
                $this->assertTrue( $backend->isPersistent(), 'sanity check' );
-               \TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
-               \TestingAccessWrapper::newFromObject( $backend )->dataDirty = true;
+               TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->dataDirty = true;
                $backend->save();
                $this->assertTrue( $this->onSessionMetadataCalled );
                $blob = $this->store->getSession( self::SESSIONID );
@@ -625,11 +632,11 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
-               \TestingAccessWrapper::newFromObject( $backend )->persist = true;
-               \TestingAccessWrapper::newFromObject( $backend )->forcePersist = true;
+               TestingAccessWrapper::newFromObject( $backend )->persist = true;
+               TestingAccessWrapper::newFromObject( $backend )->forcePersist = true;
                $this->assertTrue( $backend->isPersistent(), 'sanity check' );
-               \TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
-               \TestingAccessWrapper::newFromObject( $backend )->dataDirty = true;
+               TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->dataDirty = true;
                $backend->save();
                $this->assertTrue( $this->onSessionMetadataCalled );
                $blob = $this->store->getSession( self::SESSIONID );
@@ -651,10 +658,10 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
-               \TestingAccessWrapper::newFromObject( $backend )->persist = true;
+               TestingAccessWrapper::newFromObject( $backend )->persist = true;
                $this->assertTrue( $backend->isPersistent(), 'sanity check' );
-               \TestingAccessWrapper::newFromObject( $backend )->metaDirty = true;
-               \TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->metaDirty = true;
+               TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
                $backend->save();
                $this->assertTrue( $this->onSessionMetadataCalled );
                $blob = $this->store->getSession( self::SESSIONID );
@@ -675,11 +682,11 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
-               \TestingAccessWrapper::newFromObject( $backend )->persist = true;
+               TestingAccessWrapper::newFromObject( $backend )->persist = true;
                $this->assertTrue( $backend->isPersistent(), 'sanity check' );
-               \TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
-               \TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
-               \TestingAccessWrapper::newFromObject( $backend )->dataHash = 'Doesn\'t match';
+               TestingAccessWrapper::newFromObject( $backend )->metaDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->dataDirty = false;
+               TestingAccessWrapper::newFromObject( $backend )->dataHash = 'Doesn\'t match';
                $backend->save();
                $this->assertTrue( $this->onSessionMetadataCalled );
                $blob = $this->store->getSession( self::SESSIONID );
@@ -694,7 +701,8 @@ class SessionBackendTest extends MediaWikiTestCase {
 
                // Bad hook
                $this->provider = null;
-               $mockHook = $this->getMock( __CLASS__, [ 'onSessionMetadata' ] );
+               $mockHook = $this->getMockBuilder( __CLASS__ )
+                       ->setMethods( [ 'onSessionMetadata' ] )->getMock();
                $mockHook->expects( $this->any() )->method( 'onSessionMetadata' )
                        ->will( $this->returnCallback(
                                function ( SessionBackend $backend, array &$metadata, array $requests ) {
@@ -716,7 +724,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                }
 
                // SessionManager::preventSessionsForUser
-               \TestingAccessWrapper::newFromObject( $this->manager )->preventUsers = [
+               TestingAccessWrapper::newFromObject( $this->manager )->preventUsers = [
                        $user->getName() => true,
                ];
                $this->provider = $neverProvider;
@@ -724,10 +732,10 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
-               \TestingAccessWrapper::newFromObject( $backend )->persist = true;
+               TestingAccessWrapper::newFromObject( $backend )->persist = true;
                $this->assertTrue( $backend->isPersistent(), 'sanity check' );
-               \TestingAccessWrapper::newFromObject( $backend )->metaDirty = true;
-               \TestingAccessWrapper::newFromObject( $backend )->dataDirty = true;
+               TestingAccessWrapper::newFromObject( $backend )->metaDirty = true;
+               TestingAccessWrapper::newFromObject( $backend )->dataDirty = true;
                $backend->save();
                $this->assertFalse( $this->store->getSession( self::SESSIONID ), 'making sure it didn\'t save' );
        }
@@ -738,14 +746,15 @@ class SessionBackendTest extends MediaWikiTestCase {
                $testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ];
 
                // Not persistent
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->never() )->method( 'persistSession' );
                $this->onSessionMetadataCalled = false;
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionMetadata' => [ $this ] ] );
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
-               $wrap = \TestingAccessWrapper::newFromObject( $backend );
+               $wrap = TestingAccessWrapper::newFromObject( $backend );
                $this->assertFalse( $backend->isPersistent(), 'sanity check' );
                $wrap->metaDirty = false;
                $wrap->dataDirty = false;
@@ -763,14 +772,15 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->assertNotEquals( 0, $wrap->expires );
 
                // Persistent
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->atLeastOnce() )->method( 'persistSession' );
                $this->onSessionMetadataCalled = false;
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionMetadata' => [ $this ] ] );
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
-               $wrap = \TestingAccessWrapper::newFromObject( $backend );
+               $wrap = TestingAccessWrapper::newFromObject( $backend );
                $wrap->persist = true;
                $this->assertTrue( $backend->isPersistent(), 'sanity check' );
                $wrap->metaDirty = false;
@@ -789,14 +799,15 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->assertNotEquals( 0, $wrap->expires );
 
                // Not persistent, not expiring
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->never() )->method( 'persistSession' );
                $this->onSessionMetadataCalled = false;
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionMetadata' => [ $this ] ] );
                $this->store->setSessionData( self::SESSIONID, $testData );
                $backend = $this->getBackend( $user );
                $this->store->deleteSession( self::SESSIONID );
-               $wrap = \TestingAccessWrapper::newFromObject( $backend );
+               $wrap = TestingAccessWrapper::newFromObject( $backend );
                $this->assertFalse( $backend->isPersistent(), 'sanity check' );
                $wrap->metaDirty = false;
                $wrap->dataDirty = false;
@@ -821,7 +832,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                if ( !PHPSessionHandler::isEnabled() ) {
                        $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' );
                        $rProp->setAccessible( true );
-                       $handler = \TestingAccessWrapper::newFromObject( $rProp->getValue() );
+                       $handler = TestingAccessWrapper::newFromObject( $rProp->getValue() );
                        $resetHandler = new \Wikimedia\ScopedCallback( function () use ( $handler ) {
                                session_write_close();
                                $handler->enable = false;
@@ -830,27 +841,27 @@ class SessionBackendTest extends MediaWikiTestCase {
                }
 
                $backend = $this->getBackend( static::getTestSysop()->getUser() );
-               \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = true;
+               TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = true;
 
                $resetSingleton = TestUtils::setSessionManagerSingleton( $this->manager );
 
-               $manager = \TestingAccessWrapper::newFromObject( $this->manager );
+               $manager = TestingAccessWrapper::newFromObject( $this->manager );
                $request = \RequestContext::getMain()->getRequest();
                $manager->globalSession = $backend->getSession( $request );
                $manager->globalSessionRequest = $request;
 
                session_id( '' );
-               \TestingAccessWrapper::newFromObject( $backend )->checkPHPSession();
+               TestingAccessWrapper::newFromObject( $backend )->checkPHPSession();
                $this->assertSame( $backend->getId(), session_id() );
                session_write_close();
 
                $backend2 = $this->getBackend(
                        User::newFromName( 'UTSysop' ), 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
                );
-               \TestingAccessWrapper::newFromObject( $backend2 )->usePhpSessionHandling = true;
+               TestingAccessWrapper::newFromObject( $backend2 )->usePhpSessionHandling = true;
 
                session_id( '' );
-               \TestingAccessWrapper::newFromObject( $backend2 )->checkPHPSession();
+               TestingAccessWrapper::newFromObject( $backend2 )->checkPHPSession();
                $this->assertSame( '', session_id() );
        }
 
@@ -861,7 +872,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                if ( !PHPSessionHandler::isEnabled() ) {
                        $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' );
                        $rProp->setAccessible( true );
-                       $handler = \TestingAccessWrapper::newFromObject( $rProp->getValue() );
+                       $handler = TestingAccessWrapper::newFromObject( $rProp->getValue() );
                        $resetHandler = new \Wikimedia\ScopedCallback( function () use ( $handler ) {
                                session_write_close();
                                $handler->enable = false;
@@ -870,11 +881,11 @@ class SessionBackendTest extends MediaWikiTestCase {
                }
 
                $backend = $this->getBackend( User::newFromName( 'UTSysop' ) );
-               \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = true;
+               TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = true;
 
                $resetSingleton = TestUtils::setSessionManagerSingleton( $this->manager );
 
-               $manager = \TestingAccessWrapper::newFromObject( $this->manager );
+               $manager = TestingAccessWrapper::newFromObject( $this->manager );
                $request = \RequestContext::getMain()->getRequest();
                $manager->globalSession = $backend->getSession( $request );
                $manager->globalSessionRequest = $request;
@@ -897,7 +908,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                if ( !PHPSessionHandler::isEnabled() ) {
                        $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' );
                        $rProp->setAccessible( true );
-                       $handler = \TestingAccessWrapper::newFromObject( $rProp->getValue() );
+                       $handler = TestingAccessWrapper::newFromObject( $rProp->getValue() );
                        $resetHandler = new \Wikimedia\ScopedCallback( function () use ( $handler ) {
                                session_write_close();
                                $handler->enable = false;
@@ -906,13 +917,13 @@ class SessionBackendTest extends MediaWikiTestCase {
                }
 
                $backend = $this->getBackend( User::newFromName( 'UTSysop' ) );
-               $wrap = \TestingAccessWrapper::newFromObject( $backend );
+               $wrap = TestingAccessWrapper::newFromObject( $backend );
                $wrap->usePhpSessionHandling = true;
                $wrap->persist = true;
 
                $resetSingleton = TestUtils::setSessionManagerSingleton( $this->manager );
 
-               $manager = \TestingAccessWrapper::newFromObject( $this->manager );
+               $manager = TestingAccessWrapper::newFromObject( $this->manager );
                $request = \RequestContext::getMain()->getRequest();
                $manager->globalSession = $backend->getSession( $request );
                $manager->globalSessionRequest = $request;
index 48a72d3..9eb46bc 100644 (file)
@@ -5,6 +5,7 @@ namespace MediaWiki\Session;
 use MediaWikiTestCase;
 use Psr\Log\LogLevel;
 use User;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Session
@@ -59,7 +60,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                }
                $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' );
                $rProp->setAccessible( true );
-               $handler = \TestingAccessWrapper::newFromObject( $rProp->getValue() );
+               $handler = TestingAccessWrapper::newFromObject( $rProp->getValue() );
                $oldEnable = $handler->enable;
                $reset[] = new \Wikimedia\ScopedCallback( function () use ( $handler, $oldEnable ) {
                        if ( $handler->enable ) {
@@ -100,15 +101,15 @@ class SessionManagerTest extends MediaWikiTestCase {
        }
 
        public function testConstructor() {
-               $manager = \TestingAccessWrapper::newFromObject( $this->getManager() );
+               $manager = TestingAccessWrapper::newFromObject( $this->getManager() );
                $this->assertSame( $this->config, $manager->config );
                $this->assertSame( $this->logger, $manager->logger );
                $this->assertSame( $this->store, $manager->store );
 
-               $manager = \TestingAccessWrapper::newFromObject( new SessionManager() );
+               $manager = TestingAccessWrapper::newFromObject( new SessionManager() );
                $this->assertSame( \RequestContext::getMain()->getConfig(), $manager->config );
 
-               $manager = \TestingAccessWrapper::newFromObject( new SessionManager( [
+               $manager = TestingAccessWrapper::newFromObject( new SessionManager( [
                        'config' => $this->config,
                ] ) );
                $this->assertSame( \ObjectCache::$instances['testSessionStore'], $manager->store );
@@ -418,7 +419,7 @@ class SessionManagerTest extends MediaWikiTestCase {
 
        public function testGetEmptySession() {
                $manager = $this->getManager();
-               $pmanager = \TestingAccessWrapper::newFromObject( $manager );
+               $pmanager = TestingAccessWrapper::newFromObject( $manager );
                $request = new \FauxRequest();
 
                $providerBuilder = $this->getMockBuilder( 'DummySessionProvider' )
@@ -747,14 +748,14 @@ class SessionManagerTest extends MediaWikiTestCase {
 
        public function testGetProviders() {
                $realManager = $this->getManager();
-               $manager = \TestingAccessWrapper::newFromObject( $realManager );
+               $manager = TestingAccessWrapper::newFromObject( $realManager );
 
                $this->config->set( 'SessionProviders', [
                        [ 'class' => 'DummySessionProvider' ],
                ] );
                $providers = $manager->getProviders();
                $this->assertArrayHasKey( 'DummySessionProvider', $providers );
-               $provider = \TestingAccessWrapper::newFromObject( $providers['DummySessionProvider'] );
+               $provider = TestingAccessWrapper::newFromObject( $providers['DummySessionProvider'] );
                $this->assertSame( $manager->logger, $provider->logger );
                $this->assertSame( $manager->config, $provider->config );
                $this->assertSame( $realManager, $provider->getManager() );
@@ -776,10 +777,11 @@ class SessionManagerTest extends MediaWikiTestCase {
        }
 
        public function testShutdown() {
-               $manager = \TestingAccessWrapper::newFromObject( $this->getManager() );
+               $manager = TestingAccessWrapper::newFromObject( $this->getManager() );
                $manager->setLogger( new \Psr\Log\NullLogger() );
 
-               $mock = $this->getMock( 'stdClass', [ 'shutdown' ] );
+               $mock = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ 'shutdown' ] )->getMock();
                $mock->expects( $this->once() )->method( 'shutdown' );
 
                $manager->allSessionBackends = [ $mock ];
@@ -787,7 +789,7 @@ class SessionManagerTest extends MediaWikiTestCase {
        }
 
        public function testGetSessionFromInfo() {
-               $manager = \TestingAccessWrapper::newFromObject( $this->getManager() );
+               $manager = TestingAccessWrapper::newFromObject( $this->getManager() );
                $request = new \FauxRequest();
 
                $id = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
@@ -799,11 +801,11 @@ class SessionManagerTest extends MediaWikiTestCase {
                        'userInfo' => UserInfo::newFromName( 'UTSysop', true ),
                        'idIsSafe' => true,
                ] );
-               \TestingAccessWrapper::newFromObject( $info )->idIsSafe = true;
-               $session1 = \TestingAccessWrapper::newFromObject(
+               TestingAccessWrapper::newFromObject( $info )->idIsSafe = true;
+               $session1 = TestingAccessWrapper::newFromObject(
                        $manager->getSessionFromInfo( $info, $request )
                );
-               $session2 = \TestingAccessWrapper::newFromObject(
+               $session2 = TestingAccessWrapper::newFromObject(
                        $manager->getSessionFromInfo( $info, $request )
                );
 
@@ -812,7 +814,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertSame( $session1->getSessionId(), $session2->getSessionId() );
                $this->assertSame( $id, $session1->getId() );
 
-               \TestingAccessWrapper::newFromObject( $info )->idIsSafe = false;
+               TestingAccessWrapper::newFromObject( $info )->idIsSafe = false;
                $session3 = $manager->getSessionFromInfo( $info, $request );
                $this->assertNotSame( $id, $session3->getId() );
        }
@@ -821,7 +823,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $manager = $this->getManager();
 
                $session = $manager->getSessionForRequest( new \FauxRequest );
-               $backend = \TestingAccessWrapper::newFromObject( $session )->backend;
+               $backend = TestingAccessWrapper::newFromObject( $session )->backend;
                $sessionId = $session->getSessionId();
                $id = (string)$sessionId;
 
@@ -958,7 +960,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $provider3->expects( $this->any() )->method( '__toString' )
                        ->will( $this->returnValue( 'Mock3' ) );
 
-               \TestingAccessWrapper::newFromObject( $manager )->sessionProviders = [
+               TestingAccessWrapper::newFromObject( $manager )->sessionProviders = [
                        (string)$provider => $provider,
                        (string)$provider2 => $provider2,
                        (string)$provider3 => $provider3,
index 8284d05..052c016 100644 (file)
@@ -3,6 +3,7 @@
 namespace MediaWiki\Session;
 
 use MediaWikiTestCase;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Session
@@ -17,7 +18,7 @@ class SessionProviderTest extends MediaWikiTestCase {
                $config = new \HashConfig();
 
                $provider = $this->getMockForAbstractClass( SessionProvider::class );
-               $priv = \TestingAccessWrapper::newFromObject( $provider );
+               $priv = TestingAccessWrapper::newFromObject( $provider );
 
                $provider->setConfig( $config );
                $this->assertSame( $config, $priv->config );
@@ -148,7 +149,7 @@ class SessionProviderTest extends MediaWikiTestCase {
                $provider = $this->getMockForAbstractClass( SessionProvider::class,
                        [], 'MockSessionProvider' );
                $provider->setConfig( $config );
-               $priv = \TestingAccessWrapper::newFromObject( $provider );
+               $priv = TestingAccessWrapper::newFromObject( $provider );
 
                $this->assertSame( 'eoq8cb1mg7j30ui5qolafps4hg29k5bb', $priv->hashToSessionId( 'foobar' ) );
                $this->assertSame( '4do8j7tfld1g8tte9jqp3csfgmulaun9',
@@ -198,7 +199,7 @@ class SessionProviderTest extends MediaWikiTestCase {
                        );
                }
 
-               \TestingAccessWrapper::newFromObject( $backend )->provider = $provider;
+               TestingAccessWrapper::newFromObject( $backend )->provider = $provider;
                $this->assertNull( $provider->getAllowedUserRights( $backend ) );
        }
 
index e6a6ad3..adf0f5d 100644 (file)
@@ -5,6 +5,7 @@ namespace MediaWiki\Session;
 use Psr\Log\LogLevel;
 use MediaWikiTestCase;
 use User;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Session
@@ -14,16 +15,16 @@ class SessionTest extends MediaWikiTestCase {
 
        public function testConstructor() {
                $backend = TestUtils::getDummySessionBackend();
-               \TestingAccessWrapper::newFromObject( $backend )->requests = [ -1 => 'dummy' ];
-               \TestingAccessWrapper::newFromObject( $backend )->id = new SessionId( 'abc' );
+               TestingAccessWrapper::newFromObject( $backend )->requests = [ -1 => 'dummy' ];
+               TestingAccessWrapper::newFromObject( $backend )->id = new SessionId( 'abc' );
 
                $session = new Session( $backend, 42, new \TestLogger );
-               $priv = \TestingAccessWrapper::newFromObject( $session );
+               $priv = TestingAccessWrapper::newFromObject( $session );
                $this->assertSame( $backend, $priv->backend );
                $this->assertSame( 42, $priv->index );
 
                $request = new \FauxRequest();
-               $priv2 = \TestingAccessWrapper::newFromObject( $session->sessionWithRequest( $request ) );
+               $priv2 = TestingAccessWrapper::newFromObject( $session->sessionWithRequest( $request ) );
                $this->assertSame( $backend, $priv2->backend );
                $this->assertNotSame( $priv->index, $priv2->index );
                $this->assertSame( $request, $priv2->getRequest() );
@@ -37,8 +38,9 @@ class SessionTest extends MediaWikiTestCase {
         * @param bool $ret Whether the method returns a value
         */
        public function testMethods( $m, $args, $index, $ret ) {
-               $mock = $this->getMock( DummySessionBackend::class,
-                       [ $m, 'deregisterSession' ] );
+               $mock = $this->getMockBuilder( DummySessionBackend::class )
+                       ->setMethods( [ $m, 'deregisterSession' ] )
+                       ->getMock();
                $mock->expects( $this->once() )->method( 'deregisterSession' )
                        ->with( $this->identicalTo( 42 ) );
 
@@ -97,7 +99,7 @@ class SessionTest extends MediaWikiTestCase {
 
        public function testDataAccess() {
                $session = TestUtils::getDummySession();
-               $backend = \TestingAccessWrapper::newFromObject( $session )->backend;
+               $backend = TestingAccessWrapper::newFromObject( $session )->backend;
 
                $this->assertEquals( 1, $session->get( 'foo' ) );
                $this->assertEquals( 'zero', $session->get( 0 ) );
@@ -157,7 +159,7 @@ class SessionTest extends MediaWikiTestCase {
        public function testArrayAccess() {
                $logger = new \TestLogger;
                $session = TestUtils::getDummySession( null, -1, $logger );
-               $backend = \TestingAccessWrapper::newFromObject( $session )->backend;
+               $backend = TestingAccessWrapper::newFromObject( $session )->backend;
 
                $this->assertEquals( 1, $session['foo'] );
                $this->assertEquals( 'zero', $session[0] );
@@ -221,11 +223,11 @@ class SessionTest extends MediaWikiTestCase {
 
        public function testClear() {
                $session = TestUtils::getDummySession();
-               $priv = \TestingAccessWrapper::newFromObject( $session );
+               $priv = TestingAccessWrapper::newFromObject( $session );
 
-               $backend = $this->getMock(
-                       DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ]
-               );
+               $backend = $this->getMockBuilder( DummySessionBackend::class )
+                       ->setMethods( [ 'canSetUser', 'setUser', 'save' ] )
+                       ->getMock();
                $backend->expects( $this->once() )->method( 'canSetUser' )
                        ->will( $this->returnValue( true ) );
                $backend->expects( $this->once() )->method( 'setUser' )
@@ -238,9 +240,9 @@ class SessionTest extends MediaWikiTestCase {
                $this->assertSame( [], $backend->data );
                $this->assertTrue( $backend->dirty );
 
-               $backend = $this->getMock(
-                       DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ]
-               );
+               $backend = $this->getMockBuilder( DummySessionBackend::class )
+                       ->setMethods( [ 'canSetUser', 'setUser', 'save' ] )
+                       ->getMock();
                $backend->data = [];
                $backend->expects( $this->once() )->method( 'canSetUser' )
                        ->will( $this->returnValue( true ) );
@@ -253,9 +255,9 @@ class SessionTest extends MediaWikiTestCase {
                $session->clear();
                $this->assertFalse( $backend->dirty );
 
-               $backend = $this->getMock(
-                       DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ]
-               );
+               $backend = $this->getMockBuilder( DummySessionBackend::class )
+                       ->setMethods( [ 'canSetUser', 'setUser', 'save' ] )
+                       ->getMock();
                $backend->expects( $this->once() )->method( 'canSetUser' )
                        ->will( $this->returnValue( false ) );
                $backend->expects( $this->never() )->method( 'setUser' );
@@ -268,10 +270,10 @@ class SessionTest extends MediaWikiTestCase {
 
        public function testTokens() {
                $session = TestUtils::getDummySession();
-               $priv = \TestingAccessWrapper::newFromObject( $session );
+               $priv = TestingAccessWrapper::newFromObject( $session );
                $backend = $priv->backend;
 
-               $token = \TestingAccessWrapper::newFromObject( $session->getToken() );
+               $token = TestingAccessWrapper::newFromObject( $session->getToken() );
                $this->assertArrayHasKey( 'wsTokenSecrets', $backend->data );
                $this->assertArrayHasKey( 'default', $backend->data['wsTokenSecrets'] );
                $secret = $backend->data['wsTokenSecrets']['default'];
@@ -279,13 +281,13 @@ class SessionTest extends MediaWikiTestCase {
                $this->assertSame( '', $token->salt );
                $this->assertTrue( $token->wasNew() );
 
-               $token = \TestingAccessWrapper::newFromObject( $session->getToken( 'foo' ) );
+               $token = TestingAccessWrapper::newFromObject( $session->getToken( 'foo' ) );
                $this->assertSame( $secret, $token->secret );
                $this->assertSame( 'foo', $token->salt );
                $this->assertFalse( $token->wasNew() );
 
                $backend->data['wsTokenSecrets']['secret'] = 'sekret';
-               $token = \TestingAccessWrapper::newFromObject(
+               $token = TestingAccessWrapper::newFromObject(
                        $session->getToken( [ 'bar', 'baz' ], 'secret' )
                );
                $this->assertSame( 'sekret', $token->secret );
@@ -357,7 +359,7 @@ class SessionTest extends MediaWikiTestCase {
 
                // Unserializable data
                $iv = \MWCryptRand::generate( 16, true );
-               list( $encKey, $hmacKey ) = \TestingAccessWrapper::newFromObject( $session )->getSecretKeys();
+               list( $encKey, $hmacKey ) = TestingAccessWrapper::newFromObject( $session )->getSecretKeys();
                $ciphertext = openssl_encrypt( 'foobar', 'aes-256-ctr', $encKey, OPENSSL_RAW_DATA, $iv );
                $sealed = base64_encode( $iv ) . '.' . base64_encode( $ciphertext );
                $hmac = hash_hmac( 'sha256', $sealed, $hmacKey, true );
index 759eca6..fd02a2e 100644 (file)
@@ -61,7 +61,7 @@ class TestBagOStuff extends \CachedBagOStuff {
                        $expiry = \RequestContext::getMain()->getConfig()->get( 'ObjectCacheSessionExpiry' );
                }
 
-               $this->set( wfMemcKey( 'MWSession', $id ), $blob, $expiry );
+               $this->set( $this->makeKey( 'MWSession', $id ), $blob, $expiry );
        }
 
        /**
@@ -69,7 +69,7 @@ class TestBagOStuff extends \CachedBagOStuff {
         * @return mixed
         */
        public function getSession( $id ) {
-               return $this->get( wfMemcKey( 'MWSession', $id ) );
+               return $this->get( $this->makeKey( 'MWSession', $id ) );
        }
 
        /**
@@ -77,14 +77,14 @@ class TestBagOStuff extends \CachedBagOStuff {
         * @return mixed
         */
        public function getSessionFromBackend( $id ) {
-               return $this->backend->get( wfMemcKey( 'MWSession', $id ) );
+               return $this->backend->get( $this->makeKey( 'MWSession', $id ) );
        }
 
        /**
         * @param string $id Session ID
         */
        public function deleteSession( $id ) {
-               $this->delete( wfMemcKey( 'MWSession', $id ) );
+               $this->delete( $this->makeKey( 'MWSession', $id ) );
        }
 
 }
index f00de55..af29d6b 100644 (file)
@@ -3,6 +3,7 @@
 namespace MediaWiki\Session;
 
 use Psr\Log\LoggerInterface;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * Utility functions for Session unit tests
@@ -70,7 +71,7 @@ class TestUtils {
                }
 
                $ret = $rc->newInstanceWithoutConstructor();
-               \TestingAccessWrapper::newFromObject( $ret )->logger = new \TestLogger;
+               TestingAccessWrapper::newFromObject( $ret )->logger = new \TestLogger;
                return $ret;
        }
 
@@ -95,7 +96,7 @@ class TestUtils {
                }
 
                $session = $rc->newInstanceWithoutConstructor();
-               $priv = \TestingAccessWrapper::newFromObject( $session );
+               $priv = TestingAccessWrapper::newFromObject( $session );
                $priv->backend = $backend;
                $priv->index = $index;
                $priv->logger = $logger ?: new \TestLogger;
index ca001f3..4797652 100644 (file)
@@ -3,6 +3,7 @@
 namespace MediaWiki\Session;
 
 use MediaWikiTestCase;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Session
@@ -27,7 +28,7 @@ class TokenTest extends MediaWikiTestCase {
        }
 
        public function testToStringAtTimestamp() {
-               $token = \TestingAccessWrapper::newFromObject( new Token( 'sekret', 'salty', false ) );
+               $token = TestingAccessWrapper::newFromObject( new Token( 'sekret', 'salty', false ) );
 
                $this->assertSame(
                        'd9ade0c7d4349e9df9094e61c33a5a0d5644fde2+\\',
@@ -53,7 +54,7 @@ class TokenTest extends MediaWikiTestCase {
        }
 
        public function testMatch() {
-               $token = \TestingAccessWrapper::newFromObject( new Token( 'sekret', 'salty', false ) );
+               $token = TestingAccessWrapper::newFromObject( new Token( 'sekret', 'salty', false ) );
 
                $test = $token->toStringAtTimestamp( time() - 10 );
                $this->assertTrue( $token->match( $test ) );
index cb4b697..c0d8c00 100644 (file)
@@ -75,7 +75,7 @@ class SiteExporterTest extends PHPUnit_Framework_TestCase {
        }
 
        private function newSiteStore( SiteList $sites ) {
-               $store = $this->getMock( 'SiteStore' );
+               $store = $this->getMockBuilder( 'SiteStore' )->getMock();
 
                $store->expects( $this->once() )
                        ->method( 'saveSites' )
index 45241c5..ea49429 100644 (file)
@@ -32,7 +32,7 @@
 class SiteImporterTest extends PHPUnit_Framework_TestCase {
 
        private function newSiteImporter( array $expectedSites, $errorCount ) {
-               $store = $this->getMock( 'SiteStore' );
+               $store = $this->getMockBuilder( 'SiteStore' )->getMock();
 
                $store->expects( $this->once() )
                        ->method( 'saveSites' )
@@ -44,7 +44,7 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase {
                        ->method( 'getSites' )
                        ->will( $this->returnValue( new SiteList() ) );
 
-               $errorHandler = $this->getMock( 'Psr\Log\LoggerInterface' );
+               $errorHandler = $this->getMockBuilder( 'Psr\Log\LoggerInterface' )->getMock();
                $errorHandler->expects( $this->exactly( $errorCount ) )
                        ->method( 'error' );
 
@@ -148,7 +148,7 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase {
        public function testImportFromXML_malformed() {
                $this->setExpectedException( 'Exception' );
 
-               $store = $this->getMock( 'SiteStore' );
+               $store = $this->getMockBuilder( 'SiteStore' )->getMock();
                $importer = new SiteImporter( $store );
                $importer->importFromXML( 'THIS IS NOT XML' );
        }
diff --git a/tests/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php b/tests/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php
new file mode 100644 (file)
index 0000000..b101857
--- /dev/null
@@ -0,0 +1,144 @@
+<?php
+
+/**
+ * Abstract base class for shared logic when testing ChangesListSpecialPage
+ * and subclasses
+ *
+ * @group Database
+ */
+abstract class AbstractChangesListSpecialPageTestCase extends MediaWikiTestCase {
+       // Must be initialized by subclass
+       /**
+        * @var ChangesListSpecialPage
+        */
+       protected $changesListSpecialPage;
+
+       protected $oldPatrollersGroup;
+
+       protected function setUp() {
+               global $wgGroupPermissions;
+
+               parent::setUp();
+               $this->setMwGlobals( 'wgRCWatchCategoryMembership', true );
+
+               if ( isset( $wgGroupPermissions['patrollers'] ) ) {
+                       $this->oldPatrollersGroup = $wgGroupPermissions['patrollers'];
+               }
+
+               $wgGroupPermissions['patrollers'] = [
+                       'patrol' => true,
+               ];
+
+               // Deprecated
+               $this->setTemporaryHook(
+                       'ChangesListSpecialPageFilters',
+                       null
+               );
+
+               # setup the ChangesListSpecialPage (or subclass) object
+               $this->changesListSpecialPage = $this->getPage();
+               $context = $this->changesListSpecialPage->getContext();
+               $context = new DerivativeContext( $context );
+               $context->setUser( $this->getTestUser( [ 'patrollers' ] )->getUser() );
+               $this->changesListSpecialPage->setContext( $context );
+               $this->changesListSpecialPage->registerFilters();
+       }
+
+       protected function tearDown() {
+               global $wgGroupPermissions;
+
+               parent::tearDown();
+
+               if ( $this->oldPatrollersGroup !== null ) {
+                       $wgGroupPermissions['patrollers'] = $this->oldPatrollersGroup;
+               }
+       }
+
+       /**
+        * @dataProvider provideParseParameters
+        */
+       public function testParseParameters( $params, $expected ) {
+               $opts = new FormOptions();
+               foreach ( $expected as $key => $value ) {
+                       // Register it as null so sets aren't rejected.
+                       $opts->add(
+                               $key,
+                               null,
+                               FormOptions::guessType( $expected )
+                       );
+               }
+
+               $this->changesListSpecialPage->parseParameters(
+                       $params,
+                       $opts
+               );
+
+               $this->assertArrayEquals(
+                       $expected,
+                       $opts->getAllValues(),
+                       /** ordered= */ false,
+                       /** named= */ true
+               );
+       }
+
+       /**
+        * @dataProvider validateOptionsProvider
+        */
+       public function testValidateOptions( $optionsToSet, $expectedRedirect, $expectedRedirectOptions ) {
+               $redirectQuery = [];
+               $redirected = false;
+               $output = $this->getMockBuilder( OutputPage::class )
+                       ->disableProxyingToOriginalMethods()
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $output->method( 'redirect' )->willReturnCallback(
+                       function ( $url ) use ( &$redirectQuery, &$redirected ) {
+                               $urlParts = wfParseUrl( $url );
+                               $query = isset( $urlParts[ 'query' ] ) ? $urlParts[ 'query' ] : '';
+                               parse_str( $query, $redirectQuery );
+                               $redirected = true;
+                       }
+               );
+               $ctx = new RequestContext();
+
+               // Give users patrol permissions so we can test that.
+               $user = $this->getTestSysop()->getUser();
+               $ctx->setUser( $user );
+
+               // Disable this hook or it could break changeType
+               // depending on which other extensions are running.
+               $this->setTemporaryHook(
+                       'ChangesListSpecialPageStructuredFilters',
+                       null
+               );
+
+               $ctx->setOutput( $output );
+               $clsp = $this->changesListSpecialPage;
+               $clsp->setContext( $ctx );
+               $opts = $clsp->getDefaultOptions();
+
+               foreach ( $optionsToSet as $option => $value ) {
+                       $opts->setValue( $option, $value );
+               }
+
+               $clsp->validateOptions( $opts );
+
+               $this->assertEquals( $expectedRedirect, $redirected, 'redirection' );
+
+               if ( $expectedRedirect ) {
+                       if ( count( $expectedRedirectOptions ) > 0 ) {
+                               $expectedRedirectOptions += [
+                                       'title' => $clsp->getPageTitle()->getPrefixedText(),
+                               ];
+                       }
+
+                       $this->assertArrayEquals(
+                               $expectedRedirectOptions,
+                               $redirectQuery,
+                               /* $ordered= */ false,
+                               /* $named= */ true,
+                               'redirection query'
+                       );
+               }
+       }
+}
diff --git a/tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php b/tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php
new file mode 100644 (file)
index 0000000..e2209eb
--- /dev/null
@@ -0,0 +1,913 @@
+<?php
+
+use Wikimedia\TestingAccessWrapper;
+
+/**
+ * Test class for ChangesListSpecialPage class
+ *
+ * Copyright © 2011-, Antoine Musso, Stephane Bisson, Matthew Flaschen
+ *
+ * @author Antoine Musso
+ * @author Stephane Bisson
+ * @author Matthew Flaschen
+ * @group Database
+ *
+ * @covers ChangesListSpecialPage
+ */
+class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase {
+       protected function getPage() {
+               $mock = $this->getMockBuilder( ChangesListSpecialPage::class )
+                       ->setConstructorArgs(
+                               [
+                                       'ChangesListSpecialPage',
+                                       ''
+                               ]
+                       )
+                       ->setMethods( [ 'getPageTitle' ] )
+                       ->getMockForAbstractClass();
+
+               $mock->method( 'getPageTitle' )->willReturn(
+                       Title::makeTitle( NS_SPECIAL, 'ChangesListSpecialPage' )
+               );
+
+               $mock = TestingAccessWrapper::newFromObject(
+                       $mock
+               );
+
+               return $mock;
+       }
+
+       /** helper to test SpecialRecentchanges::buildMainQueryConds() */
+       private function assertConditions(
+               $expected,
+               $requestOptions = null,
+               $message = '',
+               $user = null
+       ) {
+               $context = new RequestContext;
+               $context->setRequest( new FauxRequest( $requestOptions ) );
+               if ( $user ) {
+                       $context->setUser( $user );
+               }
+
+               $this->changesListSpecialPage->setContext( $context );
+               $this->changesListSpecialPage->filterGroups = [];
+               $formOptions = $this->changesListSpecialPage->setup( null );
+
+               #  Filter out rc_timestamp conditions which depends on the test runtime
+               # This condition is not needed as of march 2, 2011 -- hashar
+               # @todo FIXME: Find a way to generate the correct rc_timestamp
+
+               $tables = [];
+               $fields = [];
+               $queryConditions = [];
+               $query_options = [];
+               $join_conds = [];
+
+               call_user_func_array(
+                       [ $this->changesListSpecialPage, 'buildQuery' ],
+                       [
+                               &$tables,
+                               &$fields,
+                               &$queryConditions,
+                               &$query_options,
+                               &$join_conds,
+                               $formOptions
+                       ]
+               );
+
+               $queryConditions = array_filter(
+                       $queryConditions,
+                       'ChangesListSpecialPageTest::filterOutRcTimestampCondition'
+               );
+
+               $this->assertEquals(
+                       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 ' ) );
+       }
+
+       public function testRcNsFilter() {
+               $this->assertConditions(
+                       [ # expected
+                               "rc_namespace = '0'",
+                       ],
+                       [
+                               'namespace' => NS_MAIN,
+                       ],
+                       "rc conditions with one namespace"
+               );
+       }
+
+       public function testRcNsFilterInversion() {
+               $this->assertConditions(
+                       [ # expected
+                               "rc_namespace != '0'",
+                       ],
+                       [
+                               'namespace' => NS_MAIN,
+                               'invert' => 1,
+                       ],
+                       "rc conditions with namespace inverted"
+               );
+       }
+
+       public function testRcNsFilterMultiple() {
+               $this->assertConditions(
+                       [ # expected
+                               "rc_namespace IN ('1','2','3')",
+                       ],
+                       [
+                               'namespace' => '1;2;3',
+                       ],
+                       "rc conditions with multiple namespaces"
+               );
+       }
+
+       public function testRcNsFilterMultipleAssociated() {
+               $this->assertConditions(
+                       [ # expected
+                               "rc_namespace IN ('0','1','4','5','6','7')",
+                       ],
+                       [
+                               'namespace' => '1;4;7',
+                               'associated' => 1,
+                       ],
+                       "rc conditions with multiple namespaces and associated"
+               );
+       }
+
+       public function testRcNsFilterMultipleAssociatedInvert() {
+               $this->assertConditions(
+                       [ # expected
+                               "rc_namespace NOT IN ('2','3','8','9')",
+                       ],
+                       [
+                               'namespace' => '2;3;9',
+                               'associated' => 1,
+                               'invert' => 1
+                       ],
+                       "rc conditions with multiple namespaces, associated and inverted"
+               );
+       }
+
+       public function testRcNsFilterMultipleInvert() {
+               $this->assertConditions(
+                       [ # expected
+                               "rc_namespace NOT IN ('1','2','3')",
+                       ],
+                       [
+                               'namespace' => '1;2;3',
+                               'invert' => 1,
+                       ],
+                       "rc conditions with multiple namespaces inverted"
+               );
+       }
+
+       public function testRcHidemyselfFilter() {
+               $user = $this->getTestUser()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               "rc_user_text != '{$user->getName()}'",
+                       ],
+                       [
+                               'hidemyself' => 1,
+                       ],
+                       "rc conditions: hidemyself=1 (logged in)",
+                       $user
+               );
+
+               $user = User::newFromName( '10.11.12.13', false );
+               $this->assertConditions(
+                       [ # expected
+                               "rc_user_text != '10.11.12.13'",
+                       ],
+                       [
+                               'hidemyself' => 1,
+                       ],
+                       "rc conditions: hidemyself=1 (anon)",
+                       $user
+               );
+       }
+
+       public function testRcHidebyothersFilter() {
+               $user = $this->getTestUser()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               "rc_user_text = '{$user->getName()}'",
+                       ],
+                       [
+                               'hidebyothers' => 1,
+                       ],
+                       "rc conditions: hidebyothers=1 (logged in)",
+                       $user
+               );
+
+               $user = User::newFromName( '10.11.12.13', false );
+               $this->assertConditions(
+                       [ # expected
+                               "rc_user_text = '10.11.12.13'",
+                       ],
+                       [
+                               'hidebyothers' => 1,
+                       ],
+                       "rc conditions: hidebyothers=1 (anon)",
+                       $user
+               );
+       }
+
+       public function testRcHidepageedits() {
+               $this->assertConditions(
+                       [ # expected
+                               "rc_type != '0'",
+                       ],
+                       [
+                               'hidepageedits' => 1,
+                       ],
+                       "rc conditions: hidepageedits=1"
+               );
+       }
+
+       public function testRcHidenewpages() {
+               $this->assertConditions(
+                       [ # expected
+                               "rc_type != '1'",
+                       ],
+                       [
+                               'hidenewpages' => 1,
+                       ],
+                       "rc conditions: hidenewpages=1"
+               );
+       }
+
+       public function testRcHidelog() {
+               $this->assertConditions(
+                       [ # expected
+                               "rc_type != '3'",
+                       ],
+                       [
+                               'hidelog' => 1,
+                       ],
+                       "rc conditions: hidelog=1"
+               );
+       }
+
+       public function testRcHidehumans() {
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 1,
+                       ],
+                       [
+                               'hidebots' => 0,
+                               'hidehumans' => 1,
+                       ],
+                       "rc conditions: hidebots=0 hidehumans=1"
+               );
+       }
+
+       public function testRcHidepatrolledDisabledFilter() {
+               $user = $this->getTestUser()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                       ],
+                       [
+                               'hidepatrolled' => 1,
+                       ],
+                       "rc conditions: hidepatrolled=1 (user not allowed)",
+                       $user
+               );
+       }
+
+       public function testRcHideunpatrolledDisabledFilter() {
+               $user = $this->getTestUser()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                       ],
+                       [
+                               'hideunpatrolled' => 1,
+                       ],
+                       "rc conditions: hideunpatrolled=1 (user not allowed)",
+                       $user
+               );
+       }
+       public function testRcHidepatrolledFilter() {
+               $user = $this->getTestSysop()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               "rc_patrolled = 0",
+                       ],
+                       [
+                               'hidepatrolled' => 1,
+                       ],
+                       "rc conditions: hidepatrolled=1",
+                       $user
+               );
+       }
+
+       public function testRcHideunpatrolledFilter() {
+               $user = $this->getTestSysop()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               "rc_patrolled = 1",
+                       ],
+                       [
+                               'hideunpatrolled' => 1,
+                       ],
+                       "rc conditions: hideunpatrolled=1",
+                       $user
+               );
+       }
+
+       public function testRcHideminorFilter() {
+               $this->assertConditions(
+                       [ # expected
+                               "rc_minor = 0",
+                       ],
+                       [
+                               'hideminor' => 1,
+                       ],
+                       "rc conditions: hideminor=1"
+               );
+       }
+
+       public function testRcHidemajorFilter() {
+               $this->assertConditions(
+                       [ # expected
+                               "rc_minor = 1",
+                       ],
+                       [
+                               'hidemajor' => 1,
+                       ],
+                       "rc conditions: hidemajor=1"
+               );
+       }
+
+       public function testHideCategorization() {
+               $this->assertConditions(
+                       [
+                               # expected
+                               "rc_type != '6'"
+                       ],
+                       [
+                               'hidecategorization' => 1
+                       ],
+                       "rc conditions: hidecategorization=1"
+               );
+       }
+
+       public function testFilterUserExpLevel() {
+               $now = time();
+               $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 ],
+               ], $now );
+
+               // newcomers only
+               $this->assertArrayEquals(
+                       [ 'Newcomer1', 'Newcomer2', 'Newcomer3' ],
+                       $this->fetchUsers( [ 'newcomer' ], $now )
+               );
+
+               // newcomers and learner
+               $this->assertArrayEquals(
+                       [
+                               'Newcomer1', 'Newcomer2', 'Newcomer3',
+                               'Learner1', 'Learner2', 'Learner3', 'Learner4',
+                       ],
+                       $this->fetchUsers( [ 'newcomer', 'learner' ], $now )
+               );
+
+               // newcomers and more learner
+               $this->assertArrayEquals(
+                       [
+                               'Newcomer1', 'Newcomer2', 'Newcomer3',
+                               'Experienced1',
+                       ],
+                       $this->fetchUsers( [ 'newcomer', 'experienced' ], $now )
+               );
+
+               // learner only
+               $this->assertArrayEquals(
+                       [ 'Learner1', 'Learner2', 'Learner3', 'Learner4' ],
+                       $this->fetchUsers( [ 'learner' ], $now )
+               );
+
+               // more experienced only
+               $this->assertArrayEquals(
+                       [ 'Experienced1' ],
+                       $this->fetchUsers( [ 'experienced' ], $now )
+               );
+
+               // learner and more experienced
+               $this->assertArrayEquals(
+                       [
+                               'Learner1', 'Learner2', 'Learner3', 'Learner4',
+                               'Experienced1',
+                       ],
+                       $this->fetchUsers( [ 'learner', 'experienced' ], $now ),
+                       'Learner and more experienced'
+               );
+
+               // newcomers, learner, and more experienced
+               // TOOD: Fix test.  This needs to test that anons are excluded,
+               // and right now the join fails.
+               /* $this->assertArrayEquals( */
+               /*      [ */
+               /*              'Newcomer1', 'Newcomer2', 'Newcomer3', */
+               /*              'Learner1', 'Learner2', 'Learner3', 'Learner4', */
+               /*              'Experienced1', */
+               /*      ], */
+               /*      $this->fetchUsers( [ 'newcomer', 'learner', 'experienced' ], $now ) */
+               /* ); */
+       }
+
+       private function createUsers( $specs, $now ) {
+               $dbw = wfGetDB( DB_MASTER );
+               foreach ( $specs as $name => $spec ) {
+                       User::createNew(
+                               $name,
+                               [
+                                       'editcount' => $spec['edits'],
+                                       'registration' => $dbw->timestamp( $this->daysAgo( $spec['days'], $now ) ),
+                                       'email' => 'ut',
+                               ]
+                       );
+               }
+       }
+
+       private function fetchUsers( $filters, $now ) {
+               $tables = [];
+               $conds = [];
+               $fields = [];
+               $query_options = [];
+               $join_conds = [];
+
+               sort( $filters );
+
+               call_user_func_array(
+                       [ $this->changesListSpecialPage, 'filterOnUserExperienceLevel' ],
+                       [
+                               get_class( $this->changesListSpecialPage ),
+                               $this->changesListSpecialPage->getContext(),
+                               $this->changesListSpecialPage->getDB(),
+                               &$tables,
+                               &$fields,
+                               &$conds,
+                               &$query_options,
+                               &$join_conds,
+                               $filters,
+                               $now
+                       ]
+               );
+
+               $result = wfGetDB( DB_MASTER )->select(
+                       $tables,
+                       'user_name',
+                       array_filter( $conds ) + [ 'user_email' => 'ut' ]
+               );
+
+               $usernames = [];
+               foreach ( $result as $row ) {
+                       $usernames[] = $row->user_name;
+               }
+
+               return $usernames;
+       }
+
+       private function daysAgo( $days, $now ) {
+               $secondsPerDay = 86400;
+               return $now - $days * $secondsPerDay;
+       }
+
+       public function testGetFilterGroupDefinitionFromLegacyCustomFilters() {
+               $customFilters = [
+                       'hidefoo' => [
+                               'msg' => 'showhidefoo',
+                               'default' => true,
+                       ],
+
+                       'hidebar' => [
+                               'msg' => 'showhidebar',
+                               'default' => false,
+                       ],
+               ];
+
+               $this->assertEquals(
+                       [
+                               'name' => 'unstructured',
+                               'class' => ChangesListBooleanFilterGroup::class,
+                               'priority' => -1,
+                               'filters' => [
+                                       [
+                                               'name' => 'hidefoo',
+                                               'showHide' => 'showhidefoo',
+                                               'default' => true,
+                                       ],
+                                       [
+                                               'name' => 'hidebar',
+                                               'showHide' => 'showhidebar',
+                                               'default' => false,
+                                       ]
+                               ],
+                       ],
+                       $this->changesListSpecialPage->getFilterGroupDefinitionFromLegacyCustomFilters(
+                               $customFilters
+                       )
+               );
+       }
+
+       public function testGetStructuredFilterJsData() {
+               $this->changesListSpecialPage->filterGroups = [];
+
+               $definition = [
+                       [
+                               'name' => 'gub-group',
+                               'title' => 'gub-group-title',
+                               'class' => ChangesListBooleanFilterGroup::class,
+                               'filters' => [
+                                       [
+                                               'name' => 'hidefoo',
+                                               'label' => 'foo-label',
+                                               'description' => 'foo-description',
+                                               'default' => true,
+                                               'showHide' => 'showhidefoo',
+                                               'priority' => 2,
+                                       ],
+                                       [
+                                               'name' => 'hidebar',
+                                               'label' => 'bar-label',
+                                               'description' => 'bar-description',
+                                               'default' => false,
+                                               'priority' => 4,
+                                       ]
+                               ],
+                       ],
+
+                       [
+                               'name' => 'des-group',
+                               'title' => 'des-group-title',
+                               'class' => ChangesListStringOptionsFilterGroup::class,
+                               'isFullCoverage' => true,
+                               'filters' => [
+                                       [
+                                               'name' => 'grault',
+                                               'label' => 'grault-label',
+                                               'description' => 'grault-description',
+                                       ],
+                                       [
+                                               'name' => 'garply',
+                                               'label' => 'garply-label',
+                                               'description' => 'garply-description',
+                                       ],
+                               ],
+                               'queryCallable' => function () {
+                               },
+                               'default' => ChangesListStringOptionsFilterGroup::NONE,
+                       ],
+
+                       [
+                               'name' => 'unstructured',
+                               'class' => ChangesListBooleanFilterGroup::class,
+                               'filters' => [
+                                       [
+                                               'name' => 'hidethud',
+                                               'showHide' => 'showhidethud',
+                                               'default' => true,
+                                       ],
+
+                                       [
+                                               'name' => 'hidemos',
+                                               'showHide' => 'showhidemos',
+                                               'default' => false,
+                                       ],
+                               ],
+                       ],
+
+               ];
+
+               $this->changesListSpecialPage->registerFiltersFromDefinitions( $definition );
+
+               $this->assertArrayEquals(
+                       [
+                               // Filters that only display in the unstructured UI are
+                               // are not included, and neither are groups that would
+                               // be empty due to the above.
+                               'groups' => [
+                                       [
+                                               'name' => 'gub-group',
+                                               'title' => 'gub-group-title',
+                                               'type' => ChangesListBooleanFilterGroup::TYPE,
+                                               'priority' => -1,
+                                               'filters' => [
+                                                       [
+                                                               'name' => 'hidebar',
+                                                               'label' => 'bar-label',
+                                                               'description' => 'bar-description',
+                                                               'default' => false,
+                                                               'priority' => 4,
+                                                               'cssClass' => null,
+                                                               'conflicts' => [],
+                                                               'subset' => [],
+                                                       ],
+                                                       [
+                                                               'name' => 'hidefoo',
+                                                               'label' => 'foo-label',
+                                                               'description' => 'foo-description',
+                                                               'default' => true,
+                                                               'priority' => 2,
+                                                               'cssClass' => null,
+                                                               'conflicts' => [],
+                                                               'subset' => [],
+                                                       ],
+                                               ],
+                                               'fullCoverage' => true,
+                                               'conflicts' => [],
+                                       ],
+
+                                       [
+                                               'name' => 'des-group',
+                                               'title' => 'des-group-title',
+                                               'type' => ChangesListStringOptionsFilterGroup::TYPE,
+                                               'priority' => -2,
+                                               'fullCoverage' => true,
+                                               'filters' => [
+                                                       [
+                                                               'name' => 'grault',
+                                                               'label' => 'grault-label',
+                                                               'description' => 'grault-description',
+                                                               'cssClass' => null,
+                                                               'priority' => -2,
+                                                               'conflicts' => [],
+                                                               'subset' => [],
+                                                       ],
+                                                       [
+                                                               'name' => 'garply',
+                                                               'label' => 'garply-label',
+                                                               'description' => 'garply-description',
+                                                               'cssClass' => null,
+                                                               'priority' => -3,
+                                                               'conflicts' => [],
+                                                               'subset' => [],
+                                                       ],
+                                               ],
+                                               'conflicts' => [],
+                                               'separator' => ';',
+                                               'default' => ChangesListStringOptionsFilterGroup::NONE,
+                                       ],
+                               ],
+                               'messageKeys' => [
+                                       'gub-group-title',
+                                       'bar-label',
+                                       'bar-description',
+                                       'foo-label',
+                                       'foo-description',
+                                       'des-group-title',
+                                       'grault-label',
+                                       'grault-description',
+                                       'garply-label',
+                                       'garply-description',
+                               ],
+                       ],
+                       $this->changesListSpecialPage->getStructuredFilterJsData(),
+                       /** ordered= */ false,
+                       /** named= */ true
+               );
+       }
+
+       public function provideParseParameters() {
+               return [
+                       [ 'hidebots', [ 'hidebots' => true ] ],
+
+                       [ 'bots', [ 'hidebots' => false ] ],
+
+                       [ 'hideminor', [ 'hideminor' => true ] ],
+
+                       [ 'minor', [ 'hideminor' => false ] ],
+
+                       [ 'hidemajor', [ 'hidemajor' => true ] ],
+
+                       [ 'hideliu', [ 'hideliu' => true ] ],
+
+                       [ 'hidepatrolled', [ 'hidepatrolled' => true ] ],
+
+                       [ 'hideunpatrolled', [ 'hideunpatrolled' => true ] ],
+
+                       [ 'hideanons', [ 'hideanons' => true ] ],
+
+                       [ 'hidemyself', [ 'hidemyself' => true ] ],
+
+                       [ 'hidebyothers', [ 'hidebyothers' => true ] ],
+
+                       [ 'hidehumans', [ 'hidehumans' => true ] ],
+
+                       [ 'hidepageedits', [ 'hidepageedits' => true ] ],
+
+                       [ 'pagedits', [ 'hidepageedits' => false ] ],
+
+                       [ 'hidenewpages', [ 'hidenewpages' => true ] ],
+
+                       [ 'hidecategorization', [ 'hidecategorization' => true ] ],
+
+                       [ 'hidelog', [ 'hidelog' => true ] ],
+
+                       [
+                               'userExpLevel=learner;experienced',
+                               [
+                                       'userExpLevel' => 'learner;experienced'
+                               ],
+                       ],
+
+                       // A few random combos
+                       [
+                               'bots,hideliu,hidemyself',
+                               [
+                                       'hidebots' => false,
+                                       'hideliu' => true,
+                                       'hidemyself' => true,
+                               ],
+                       ],
+
+                       [
+                               'minor,hideanons,categorization',
+                               [
+                                       'hideminor' => false,
+                                       'hideanons' => true,
+                                       'hidecategorization' => false,
+                               ]
+                       ],
+
+                       [
+                               'hidehumans,bots,hidecategorization',
+                               [
+                                       'hidehumans' => true,
+                                       'hidebots' => false,
+                                       'hidecategorization' => true,
+                               ],
+                       ],
+
+                       [
+                               'hidemyself,userExpLevel=newcomer;learner,hideminor',
+                               [
+                                       'hidemyself' => true,
+                                       'hideminor' => true,
+                                       'userExpLevel' => 'newcomer;learner',
+                               ],
+                       ],
+               ];
+       }
+
+       public function provideGetFilterConflicts() {
+               return [
+                       [
+                               "parameters" => [],
+                               "expectedConflicts" => false,
+                       ],
+                       [
+                               "parameters" => [
+                                       "hideliu" => true,
+                                       "userExpLevel" => "newcomer",
+                               ],
+                               "expectedConflicts" => true,
+                       ],
+                       [
+                               "parameters" => [
+                                       "hideanons" => true,
+                                       "userExpLevel" => "learner",
+                               ],
+                               "expectedConflicts" => false,
+                       ],
+                       [
+                               "parameters" => [
+                                       "hidemajor" => true,
+                                       "hidenewpages" => true,
+                                       "hidepageedits" => true,
+                                       "hidecategorization" => false,
+                                       "hidelog" => true,
+                                       "hideWikidata" => true,
+                               ],
+                               "expectedConflicts" => true,
+                       ],
+                       [
+                               "parameters" => [
+                                       "hidemajor" => true,
+                                       "hidenewpages" => false,
+                                       "hidepageedits" => true,
+                                       "hidecategorization" => false,
+                                       "hidelog" => false,
+                                       "hideWikidata" => true,
+                               ],
+                               "expectedConflicts" => true,
+                       ],
+                       [
+                               "parameters" => [
+                                       "hidemajor" => true,
+                                       "hidenewpages" => false,
+                                       "hidepageedits" => false,
+                                       "hidecategorization" => true,
+                                       "hidelog" => true,
+                                       "hideWikidata" => true,
+                               ],
+                               "expectedConflicts" => false,
+                       ],
+                       [
+                               "parameters" => [
+                                       "hideminor" => true,
+                                       "hidenewpages" => true,
+                                       "hidepageedits" => true,
+                                       "hidecategorization" => false,
+                                       "hidelog" => true,
+                                       "hideWikidata" => true,
+                               ],
+                               "expectedConflicts" => false,
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideGetFilterConflicts
+        */
+       public function testGetFilterConflicts( $parameters, $expectedConflicts ) {
+               $context = new RequestContext;
+               $context->setRequest( new FauxRequest( $parameters ) );
+               $this->changesListSpecialPage->setContext( $context );
+
+               $this->assertEquals(
+                       $expectedConflicts,
+                       $this->changesListSpecialPage->areFiltersInConflict()
+               );
+       }
+
+       public function validateOptionsProvider() {
+               return [
+                       [
+                               [ 'hideanons' => 1, 'hideliu' => 1, 'hidebots' => 1 ],
+                               true,
+                               [ 'hideliu' => 1, 'hidebots' => 1, ],
+                       ],
+
+                       [
+                               [ 'hideanons' => 1, 'hideliu' => 1, 'hidebots' => 0 ],
+                               true,
+                               [ 'hidebots' => 0, 'hidehumans' => 1 ],
+                       ],
+
+                       [
+                               [ 'hidemyself' => 1, 'hidebyothers' => 1 ],
+                               true,
+                               [],
+                       ],
+                       [
+                               [ 'hidebots' => 1, 'hidehumans' => 1 ],
+                               true,
+                               [],
+                       ],
+                       [
+                               [ 'hidepatrolled' => 1, 'hideunpatrolled' => 1 ],
+                               true,
+                               [],
+                       ],
+                       [
+                               [ 'hideminor' => 1, 'hidemajor' => 1 ],
+                               true,
+                               [],
+                       ],
+                       [
+                               // changeType
+                               [ 'hidepageedits' => 1, 'hidenewpages' => 1, 'hidecategorization' => 1, 'hidelog' => 1, ],
+                               true,
+                               [],
+                       ],
+               ];
+       }
+}
index 4a46464..fd587bf 100644 (file)
@@ -25,7 +25,7 @@ class SpecialPreferencesTest extends MediaWikiTestCase {
                // Set a low limit
                $this->setMwGlobals( 'wgMaxSigChars', 2 );
 
-               $user = $this->getMock( 'User' );
+               $user = $this->createMock( 'User' );
                $user->expects( $this->any() )
                        ->method( 'isAnon' )
                        ->will( $this->returnValue( false ) );
index 9b0fb6a..85becff 100644 (file)
 <?php
+
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * Test class for SpecialRecentchanges class
  *
- * Copyright © 2011, Antoine Musso
- *
- * @author Antoine Musso
  * @group Database
  *
  * @covers SpecialRecentChanges
  */
-class SpecialRecentchangesTest extends MediaWikiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-               $this->setMwGlobals( 'wgRCWatchCategoryMembership', true );
-       }
-
-       /**
-        * @var SpecialRecentChanges
-        */
-       protected $rc;
-
-       /** helper to test SpecialRecentchanges::buildMainQueryConds() */
-       private function assertConditions(
-               $expected,
-               $requestOptions = null,
-               $message = '',
-               $user = null
-       ) {
-               $context = new RequestContext;
-               $context->setRequest( new FauxRequest( $requestOptions ) );
-               if ( $user ) {
-                       $context->setUser( $user );
-               }
-
-               # setup the rc object
-               $this->rc = new SpecialRecentChanges();
-               $this->rc->setContext( $context );
-               $formOptions = $this->rc->setup( null );
-
-               #  Filter out rc_timestamp conditions which depends on the test runtime
-               # This condition is not needed as of march 2, 2011 -- hashar
-               # @todo FIXME: Find a way to generate the correct rc_timestamp
-               $queryConditions = array_filter(
-                       $this->rc->buildMainQueryConds( $formOptions ),
-                       'SpecialRecentchangesTest::filterOutRcTimestampCondition'
-               );
-
-               $this->assertEquals(
-                       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 ' ) );
-       }
-
-       public function testRcNsFilter() {
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_type != '6'",
-                               "rc_namespace = '0'",
-                       ],
-                       [
-                               'namespace' => NS_MAIN,
-                       ],
-                       "rc conditions with no options (aka default setting)"
+class SpecialRecentchangesTest extends AbstractChangesListSpecialPageTestCase {
+       protected function getPage() {
+               return TestingAccessWrapper::newFromObject(
+                       new SpecialRecentchanges
                );
        }
 
-       public function testRcNsFilterInversion() {
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_type != '6'",
-                               "rc_namespace != '0'",
-                       ],
-                       [
-                               'namespace' => NS_MAIN,
-                               'invert' => 1,
-                       ],
-                       "rc conditions with namespace inverted"
-               );
-       }
-
-       /**
-        * T4429
-        * @dataProvider provideNamespacesAssociations
-        */
-       public function testRcNsFilterAssociation( $ns1, $ns2 ) {
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_type != '6'",
-                               "(rc_namespace = '$ns1' OR rc_namespace = '$ns2')",
-                       ],
-                       [
-                               'namespace' => $ns1,
-                               'associated' => 1,
-                       ],
-                       "rc conditions with namespace inverted"
-               );
-       }
-
-       /**
-        * T4429
-        * @dataProvider provideNamespacesAssociations
-        */
-       public function testRcNsFilterAssociationWithInversion( $ns1, $ns2 ) {
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_type != '6'",
-                               "(rc_namespace != '$ns1' AND rc_namespace != '$ns2')",
-                       ],
-                       [
-                               'namespace' => $ns1,
-                               'associated' => 1,
-                               'invert' => 1,
-                       ],
-                       "rc conditions with namespace inverted"
-               );
-       }
-
-       /**
-        * Provides associated namespaces to test recent changes
-        * namespaces association filtering.
-        */
-       public static function provideNamespacesAssociations() {
-               return [ # (NS => Associated_NS)
-                       [ NS_MAIN, NS_TALK ],
-                       [ NS_TALK, NS_MAIN ],
-               ];
-       }
-
-       public function testRcHidemyselfFilter() {
-               $user = $this->getTestUser()->getUser();
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_user != '{$user->getId()}'",
-                               "rc_type != '6'",
-                       ],
-                       [
-                               'hidemyself' => 1,
-                       ],
-                       "rc conditions: hidemyself=1 (logged in)",
-                       $user
-               );
+       // Below providers should only be for features specific to
+       // RecentChanges.  Otherwise, it should go in ChangesListSpecialPageTest
 
-               $user = User::newFromName( '10.11.12.13', false );
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_user_text != '10.11.12.13'",
-                               "rc_type != '6'",
-                       ],
-                       [
-                               'hidemyself' => 1,
-                       ],
-                       "rc conditions: hidemyself=1 (anon)",
-                       $user
-               );
-       }
+       public function provideParseParameters() {
+               return [
+                       [ 'limit=123', [ 'limit' => '123' ] ],
 
-       public function testRcHidebyothersFilter() {
-               $user = $this->getTestUser()->getUser();
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_user = '{$user->getId()}'",
-                               "rc_type != '6'",
-                       ],
-                       [
-                               'hidebyothers' => 1,
-                       ],
-                       "rc conditions: hidebyothers=1 (logged in)",
-                       $user
-               );
-
-               $user = User::newFromName( '10.11.12.13', false );
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_user_text = '10.11.12.13'",
-                               "rc_type != '6'",
-                       ],
-                       [
-                               'hidebyothers' => 1,
-                       ],
-                       "rc conditions: hidebyothers=1 (anon)",
-                       $user
-               );
-       }
+                       [ '234', [ 'limit' => '234' ] ],
 
-       public function testRcHidemyselfHidebyothersFilter() {
-               $user = $this->getTestUser()->getUser();
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_user != '{$user->getId()}'",
-                               "rc_user = '{$user->getId()}'",
-                               "rc_type != '6'",
-                       ],
-                       [
-                               'hidemyself' => 1,
-                               'hidebyothers' => 1,
-                       ],
-                       "rc conditions: hidemyself=1 hidebyothers=1 (logged in)",
-                       $user
-               );
-       }
+                       [ 'days=3', [ 'days' => '3' ] ],
 
-       public function testRcHidepageedits() {
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_type != '6'",
-                               "rc_type != '0'",
-                       ],
-                       [
-                               'hidepageedits' => 1,
-                       ],
-                       "rc conditions: hidepageedits=1"
-               );
-       }
+                       [ 'namespace=5', [ 'namespace' => '5' ] ],
 
-       public function testRcHidenewpages() {
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_type != '6'",
-                               "rc_type != '1'",
-                       ],
-                       [
-                               'hidenewpages' => 1,
-                       ],
-                       "rc conditions: hidenewpages=1"
-               );
-       }
+                       [ 'namespace=5|3', [ 'namespace' => '5|3' ] ],
 
-       public function testRcHidelog() {
-               $this->assertConditions(
-                       [ # expected
-                               'rc_bot' => 0,
-                               "rc_type != '6'",
-                               "rc_type != '3'",
-                       ],
-                       [
-                               'hidelog' => 1,
-                       ],
-                       "rc conditions: hidelog=1"
-               );
-       }
+                       [ 'tagfilter=foo', [ 'tagfilter' => 'foo' ] ],
 
-       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
-               );
+                       [ 'tagfilter=foo;bar', [ 'tagfilter' => 'foo;bar' ] ],
+               ];
        }
 
-       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(
+       public function validateOptionsProvider() {
+               return [
                        [
-                               'Newcomer1', 'Newcomer2', 'Newcomer3',
-                               'Learner1', 'Learner2', 'Learner3', 'Learner4',
+                               // hidebots=1 is default for Special:RecentChanges
+                               [ 'hideanons' => 1, 'hideliu' => 1 ],
+                               true,
+                               [ 'hideliu' => 1 ],
                        ],
-                       $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 9daae97..4e9d826 100644 (file)
@@ -150,23 +150,25 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        [
                                'With suggestion and no rewritten query shows did you mean',
                                '/Did you mean: <a[^>]+>first suggestion/',
-                               new SpecialSearchTestMockResultSet( 'first suggestion', null, [
-                                       SearchResult::newFromTitle( Title::newMainPage() ),
-                               ] ),
+                               'first suggestion',
+                               null,
+                               [ Title::newMainPage() ]
                        ],
 
                        [
                                'With rewritten query informs user of change',
                                '/Showing results for <a[^>]+>first suggestion/',
-                               new SpecialSearchTestMockResultSet( 'asdf', 'first suggestion', [
-                                       SearchResult::newFromTitle( Title::newMainPage() ),
-                               ] ),
+                               'asdf',
+                               'first suggestion',
+                               [ Title::newMainPage() ]
                        ],
 
                        [
                                'When both queries have no results user gets no results',
                                '/There were no results matching the query/',
-                               new SpecialSearchTestMockResultSet( 'first suggestion', 'first suggestion', [] ),
+                               'first suggestion',
+                               'first suggestion',
+                               []
                        ],
                ];
        }
@@ -174,8 +176,24 @@ class SpecialSearchTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideRewriteQueryWithSuggestion
         */
-       public function testRewriteQueryWithSuggestion( $message, $expectRegex, $results ) {
-               $mockSearchEngine = $this->mockSearchEngine( $results );
+       public function testRewriteQueryWithSuggestion(
+               $message,
+               $expectRegex,
+               $suggestion,
+               $rewrittenQuery,
+               array $resultTitles
+       ) {
+               $results = array_map( function( $title ) {
+                       return SearchResult::newFromTitle( $title );
+               }, $resultTitles );
+
+               $searchResults = new SpecialSearchTestMockResultSet(
+                       $suggestion,
+                       $rewrittenQuery,
+                       $results
+               );
+
+               $mockSearchEngine = $this->mockSearchEngine( $searchResults );
                $search = $this->getMockBuilder( 'SpecialSearch' )
                        ->setMethods( [ 'getSearchEngine' ] )
                        ->getMock();
index 6e702b6..b0490ec 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @author Addshore
  *
@@ -8,6 +10,40 @@
  * @covers SpecialWatchlist
  */
 class SpecialWatchlistTest extends SpecialPageTestBase {
+       public function setUp() {
+               parent::setUp();
+
+               $this->setTemporaryHook(
+                       'ChangesListSpecialPageFilters',
+                       null
+               );
+
+               $this->setTemporaryHook(
+                       'SpecialWatchlistQuery',
+                       null
+               );
+
+               $this->setTemporaryHook(
+                       'ChangesListSpecialPageQuery',
+                       null
+               );
+
+               $this->setMwGlobals(
+                       'wgDefaultUserOptions',
+                       [
+                               'extendwatchlist' => 1,
+                               'watchlistdays' => 3.0,
+                               'watchlisthideanons' => 0,
+                               'watchlisthidebots' => 0,
+                               'watchlisthideliu' => 0,
+                               'watchlisthideminor' => 0,
+                               'watchlisthideown' => 0,
+                               'watchlisthidepatrolled' => 0,
+                               'watchlisthidecategorization' => 1,
+                               'watchlistreloadautomatically' => 0,
+                       ]
+               );
+       }
 
        /**
         * Returns a new instance of the special page under test.
@@ -29,4 +65,124 @@ class SpecialWatchlistTest extends SpecialPageTestBase {
                $this->assertContains( '(nowatchlist)', $html );
        }
 
+       /**
+        * @dataProvider provideFetchOptionsFromRequest
+        */
+       public function testFetchOptionsFromRequest( $expectedValues, $preferences, $inputParams ) {
+               $page = TestingAccessWrapper::newFromObject(
+                       $this->newSpecialPage()
+               );
+
+               $context = new DerivativeContext( $page->getContext() );
+
+               $fauxRequest = new FauxRequest( $inputParams, /* $wasPosted= */ false );
+               $user = $this->getTestUser()->getUser();
+
+               foreach ( $preferences as $key => $value ) {
+                       $user->setOption( $key, $value );
+               }
+
+               $context->setRequest( $fauxRequest );
+               $context->setUser( $user );
+               $page->setContext( $context );
+
+               $page->registerFilters();
+               $formOptions = $page->getDefaultOptions();
+               $page->fetchOptionsFromRequest( $formOptions );
+
+               $this->assertArrayEquals(
+                       $expectedValues,
+                       $formOptions->getAllValues(),
+                       /* $ordered= */ false,
+                       /* $named= */ true
+               );
+       }
+
+       public function provideFetchOptionsFromRequest() {
+               // $defaults and $allFalse are just to make the expected values below
+               // shorter by hiding the background.
+
+               $page = TestingAccessWrapper::newFromObject(
+                       $this->newSpecialPage()
+               );
+
+               $this->setTemporaryHook(
+                       'ChangesListSpecialPageFilters',
+                       null
+               );
+
+               $page->registerFilters();
+
+               // Does not consider $preferences, just wiki's defaults
+               $wikiDefaults = $page->getDefaultOptions()->getAllValues();
+
+               $allFalse = $wikiDefaults;
+
+               foreach ( $allFalse as $key => &$value ) {
+                       if ( $value === true ) {
+                               $value = false;
+                       }
+               }
+
+               // This is not exposed on the form (only in preferences) so it
+               // respects the preference.
+               $allFalse['extended'] = true;
+
+               return [
+                       [
+                               [
+                                       'hideminor' => true,
+                               ] + $wikiDefaults,
+                               [],
+                               [
+                                       'hideMinor' => 1,
+                               ],
+                       ],
+
+                       [
+                               [
+                                       // First two same as prefs
+                                       'hideminor' => true,
+                                       'hidebots' => false,
+
+                                       // Second two overriden
+                                       'hideanons' => false,
+                                       'hideliu' => true,
+                               ] + $wikiDefaults,
+                               [
+                                       'watchlisthideminor' => 1,
+                                       'watchlisthidebots' => 0,
+
+                                       'watchlisthideanons' => 1,
+                                       'watchlisthideliu' => 0,
+                               ],
+                               [
+                                       'hideanons' => 0,
+                                       'hideliu' => 1,
+                               ],
+                       ],
+
+                       // Defaults/preferences for form elements are entirely ignored for
+                       // action=submit and omitted elements become false
+                       [
+                               [
+                                       'hideminor' => false,
+                                       'hidebots' => true,
+                                       'hideanons' => false,
+                                       'hideliu' => true,
+                               ] + $allFalse,
+                               [
+                                       'watchlisthideminor' => 0,
+                                       'watchlisthidebots' => 1,
+                                       'watchlisthideanons' => 1,
+                                       'watchlisthideliu' => 0,
+                               ],
+                               [
+                                       'hidebots' => 1,
+                                       'hideliu' => 1,
+                                       'action' => 'submit',
+                               ],
+                       ],
+               ];
+       }
 }
index d93181c..8a4f662 100644 (file)
@@ -13,7 +13,12 @@ class BalancerTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers MediaWiki\Tidy\Balancer::balance
+        * @covers MediaWiki\Tidy\Balancer
+        * @covers MediaWiki\Tidy\BalanceSets
+        * @covers MediaWiki\Tidy\BalanceElement
+        * @covers MediaWiki\Tidy\BalanceStack
+        * @covers MediaWiki\Tidy\BalanceMarker
+        * @covers MediaWiki\Tidy\BalanceActiveFormattingElements
         * @dataProvider provideBalancerTests
         */
        public function testBalancer( $description, $input, $expected, $useTidy ) {
diff --git a/tests/phpunit/includes/tidy/RemexDriverTest.php b/tests/phpunit/includes/tidy/RemexDriverTest.php
new file mode 100644 (file)
index 0000000..6b16cbf
--- /dev/null
@@ -0,0 +1,297 @@
+<?php
+
+class RemexDriverTest extends MediaWikiTestCase {
+       static private $remexTidyTestData = [
+               // Tests from Html5Depurate
+               [
+                       'Empty string',
+                       "",
+                       ""
+               ],
+               [
+                       'Simple p-wrap',
+                       "x",
+                       "<p>x</p>"
+               ],
+               [
+                       'No p-wrap of blank node',
+                       " ",
+                       " "
+               ],
+               [
+                       'p-wrap terminated by div',
+                       "x<div></div>",
+                       "<p>x</p><div></div>"
+               ],
+               [
+                       'p-wrap not terminated by span',
+                       "x<span></span>",
+                       "<p>x<span></span></p>"
+               ],
+               [
+                       'An element is non-blank and so gets p-wrapped',
+                       "<span></span>",
+                       "<p><span></span></p>"
+               ],
+               [
+                       'The blank flag is set after a block-level element',
+                       "<div></div> ",
+                       "<div></div> "
+               ],
+               [
+                       'Blank detection between two block-level elements',
+                       "<div></div> <div></div>",
+                       "<div></div> <div></div>"
+               ],
+               [
+                       'But p-wrapping of non-blank content works after an element',
+                       "<div></div>x",
+                       "<div></div><p>x</p>"
+               ],
+               [
+                       'p-wrapping between two block-level elements',
+                       "<div></div>x<div></div>",
+                       "<div></div><p>x</p><div></div>"
+               ],
+               [
+                       'p-wrap inside blockquote',
+                       "<blockquote>x</blockquote>",
+                       "<blockquote><p>x</p></blockquote>"
+               ],
+               [
+                       'A comment is blank for p-wrapping purposes',
+                       "<!-- x -->",
+                       "<!-- x -->"
+               ],
+               [
+                       'A comment is blank even when a p-wrap was opened by a text node',
+                       " <!-- x -->",
+                       " <!-- x -->"
+               ],
+               [
+                       'A comment does not open a p-wrap',
+                       "<!-- x -->x",
+                       "<!-- x --><p>x</p>"
+               ],
+               [
+                       'A comment does not close a p-wrap',
+                       "x<!-- x -->",
+                       "<p>x<!-- x --></p>"
+               ],
+               [
+                       'Empty li',
+                       "<ul><li></li></ul>",
+                       "<ul><li class=\"mw-empty-elt\"></li></ul>"
+               ],
+               [
+                       'li with element',
+                       "<ul><li><span></span></li></ul>",
+                       "<ul><li><span></span></li></ul>"
+               ],
+               [
+                       'li with text',
+                       "<ul><li>x</li></ul>",
+                       "<ul><li>x</li></ul>"
+               ],
+               [
+                       'Empty tr',
+                       "<table><tbody><tr></tr></tbody></table>",
+                       "<table><tbody><tr class=\"mw-empty-elt\"></tr></tbody></table>"
+               ],
+               [
+                       'Empty p',
+                       "<p>\n</p>",
+                       "<p class=\"mw-empty-elt\">\n</p>"
+               ],
+               [
+                       'No p-wrapping of an inline element which contains a block element (T150317)',
+                       "<small><div>x</div></small>",
+                       "<small><div>x</div></small>"
+               ],
+               [
+                       'p-wrapping of an inline element which contains an inline element',
+                       "<small><b>x</b></small>",
+                       "<p><small><b>x</b></small></p>"
+               ],
+               [
+                       'p-wrapping is enabled in a blockquote in an inline element',
+                       "<small><blockquote>x</blockquote></small>",
+                       "<small><blockquote><p>x</p></blockquote></small>"
+               ],
+               [
+                       'All bare text should be p-wrapped even when surrounded by block tags',
+                       "<small><blockquote>x</blockquote></small>y<div></div>z",
+                       "<small><blockquote><p>x</p></blockquote></small><p>y</p><div></div><p>z</p>"
+               ],
+               [
+                       'Split tag stack 1',
+                       "<small>x<div>y</div>z</small>",
+                       "<p><small>x</small></p><small><div>y</div></small><p><small>z</small></p>"
+               ],
+               [
+                       'Split tag stack 2',
+                       "<small><div>y</div>z</small>",
+                       "<small><div>y</div></small><p><small>z</small></p>"
+               ],
+               [
+                       'Split tag stack 3',
+                       "<small>x<div>y</div></small>",
+                       "<p><small>x</small></p><small><div>y</div></small>"
+               ],
+               [
+                       'Split tag stack 4 (modified to use splittable tag)',
+                       "a<code>b<i>c<div>d</div></i>e</code>",
+                       "<p>a<code>b<i>c</i></code></p><code><i><div>d</div></i></code><p><code>e</code></p>"
+               ],
+               [
+                       "Split tag stack regression check 1",
+                       "x<span><div>y</div></span>",
+                       "<p>x</p><span><div>y</div></span>"
+               ],
+               [
+                       "Split tag stack regression check 2 (modified to use splittable tag)",
+                       "a<code><i><div>d</div></i>e</code>",
+                       "<p>a</p><code><i><div>d</div></i></code><p><code>e</code></p>"
+               ],
+               // Simple tests from pwrap.js
+               [
+                       'Simple pwrap test 1',
+                       'a',
+                       '<p>a</p>'
+               ],
+               [
+                       '<span> is not a splittable tag, but gets p-wrapped in simple wrapping scenarios',
+                       '<span>a</span>',
+                       '<p><span>a</span></p>'
+               ],
+               [
+                       'Simple pwrap test 3',
+                       'x <div>a</div> <div>b</div> y',
+                       '<p>x </p><div>a</div> <div>b</div><p> y</p>'
+               ],
+               [
+                       'Simple pwrap test 4',
+                       'x<!--c--> <div>a</div> <div>b</div> <!--c-->y',
+                       '<p>x<!--c--> </p><div>a</div> <div>b</div> <!--c--><p>y</p>'
+               ],
+               // Complex tests from pwrap.js
+               [
+                       'Complex pwrap test 1',
+                       '<i>x<div>a</div>y</i>',
+                       '<p><i>x</i></p><i><div>a</div></i><p><i>y</i></p>'
+               ],
+               [
+                       'Complex pwrap test 2',
+                       'a<small>b</small><i>c<div>d</div>e</i>f',
+                       '<p>a<small>b</small><i>c</i></p><i><div>d</div></i><p><i>e</i>f</p>'
+               ],
+               [
+                       'Complex pwrap test 3',
+                       'a<small>b<i>c<div>d</div></i>e</small>',
+                       '<p>a<small>b<i>c</i></small></p><small><i><div>d</div></i></small><p><small>e</small></p>'
+               ],
+               [
+                       'Complex pwrap test 4',
+                       'x<small><div>y</div></small>',
+                       '<p>x</p><small><div>y</div></small>'
+               ],
+               [
+                       'Complex pwrap test 5',
+                       'a<small><i><div>d</div></i>e</small>',
+                       '<p>a</p><small><i><div>d</div></i></small><p><small>e</small></p>'
+               ],
+               [
+                       'Complex pwrap test 6',
+                       '<i>a<div>b</div>c<b>d<div>e</div>f</b>g</i>',
+                       // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
+                       // PHP 5 does not allow concatenation in initialisation of a class static variable
+                       '<p><i>a</i></p><i><div>b</div></i><p><i>c<b>d</b></i></p><i><b><div>e</div></b></i><p><i><b>f</b>g</i></p>'
+                       // @codingStandardsIgnoreEnd
+               ],
+               /* FIXME the second <b> causes a stack split which clones the <i> even
+                * though no <p> is actually generated
+               [
+                       'Complex pwrap test 7',
+                       '<i><b><font><div>x</div></font></b><div>y</div><b><font><div>z</div></font></b></i>',
+                       '<i><b><font><div>x</div></font></b><div>y</div><b><font><div>z</div></font></b></i>'
+               ],
+                */
+               // New local tests
+               [
+                       'Blank text node after block end',
+                       '<small>x<div>y</div> <b>z</b></small>',
+                       '<p><small>x</small></p><small><div>y</div></small><p><small> <b>z</b></small></p>'
+               ],
+               [
+                       'Text node fostering (FIXME: wrap missing)',
+                       '<table>x</table>',
+                       'x<table></table>'
+               ],
+               [
+                       'Blockquote fostering',
+                       '<table><blockquote>x</blockquote></table>',
+                       '<blockquote><p>x</p></blockquote><table></table>'
+               ],
+               [
+                       'Block element fostering',
+                       '<table><div>x',
+                       '<div>x</div><table></table>'
+               ],
+               [
+                       'Formatting element fostering (FIXME: wrap missing)',
+                       '<table><b>x',
+                       '<b>x</b><table></table>'
+               ],
+               [
+                       'AAA clone of p-wrapped element (FIXME: empty b)',
+                       '<b>x<p>y</b>z</p>',
+                       '<p><b>x</b></p><b></b><p><b>y</b>z</p>',
+               ],
+               [
+                       'AAA with fostering (FIXME: wrap missing)',
+                       '<table><b>1<p>2</b>3</p>',
+                       '<b>1</b><p><b>2</b>3</p><table></table>'
+               ],
+       ];
+
+       public function provider() {
+               return self::$remexTidyTestData;
+       }
+
+       /**
+        * @dataProvider provider
+        * @covers MediaWiki\Tidy\RemexCompatFormatter
+        * @covers MediaWiki\Tidy\RemexCompatMunger
+        * @covers MediaWiki\Tidy\RemexDriver
+        * @covers MediaWiki\Tidy\RemexMungerData
+        */
+       public function testTidy( $desc, $input, $expected ) {
+               $r = new MediaWiki\Tidy\RemexDriver( [] );
+               $result = $r->tidy( $input );
+               $this->assertEquals( $expected, $result, $desc );
+       }
+
+       public function html5libProvider() {
+               $files = json_decode( file_get_contents( __DIR__ . '/html5lib-tests.json' ), true );
+               $tests = [];
+               foreach ( $files as $file => $fileTests ) {
+                       foreach ( $fileTests as $i => $test ) {
+                               $tests[] = [ "$file:$i", $test['data'] ];
+                       }
+               }
+               return $tests;
+       }
+
+       /**
+        * This is a quick and dirty test to make sure none of the html5lib tests
+        * generate exceptions. We don't really know what the expected output is.
+        *
+        * @dataProvider html5libProvider
+        * @coversNothing
+        */
+       public function testHtml5Lib( $desc, $input ) {
+               $r = new MediaWiki\Tidy\RemexDriver( [] );
+               $result = $r->tidy( $input );
+               $this->assertTrue( true, $desc );
+       }
+}
index 067d159..d711bac 100644 (file)
@@ -40,39 +40,39 @@ class NaiveImportTitleFactoryTest extends MediaWikiTestCase {
                return [
                        [
                                new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
-                               Title::newFromText( 'MainNamespaceArticle' )
+                               'MainNamespaceArticle'
                        ],
                        [
                                new ForeignTitle( null, '', 'MainNamespaceArticle' ),
-                               Title::newFromText( 'MainNamespaceArticle' )
+                               'MainNamespaceArticle'
                        ],
                        [
                                new ForeignTitle( 1, 'Discussion', 'Nice_talk' ),
-                               Title::newFromText( 'Talk:Nice_talk' )
+                               'Talk:Nice_talk'
                        ],
                        [
                                new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
-                               Title::newFromText( 'Bogus:Nice_talk' )
+                               'Bogus:Nice_talk'
                        ],
                        [
                                new ForeignTitle( 100, 'Bogus', 'Nice_talk' ),
-                               Title::newFromText( 'Bogus:Nice_talk' ) // not Portal:Nice_talk
+                               'Bogus:Nice_talk' // not Portal:Nice_talk
                        ],
                        [
                                new ForeignTitle( 1, 'Bogus', 'Nice_talk' ),
-                               Title::newFromText( 'Talk:Nice_talk' ) // not Bogus:Nice_talk
+                               'Talk:Nice_talk' // not Bogus:Nice_talk
                        ],
                        [
                                new ForeignTitle( 100, 'Portal', 'Nice_talk' ),
-                               Title::newFromText( 'Portal:Nice_talk' )
+                               'Portal:Nice_talk'
                        ],
                        [
                                new ForeignTitle( 724, 'Portal', 'Nice_talk' ),
-                               Title::newFromText( 'Portal:Nice_talk' )
+                               'Portal:Nice_talk'
                        ],
                        [
                                new ForeignTitle( 2, 'Portal', 'Nice_talk' ),
-                               Title::newFromText( 'User:Nice_talk' )
+                               'User:Nice_talk'
                        ],
                ];
        }
@@ -80,9 +80,10 @@ class NaiveImportTitleFactoryTest extends MediaWikiTestCase {
        /**
         * @dataProvider basicProvider
         */
-       public function testBasic( ForeignTitle $foreignTitle, Title $title ) {
+       public function testBasic( ForeignTitle $foreignTitle, $titleText ) {
                $factory = new NaiveImportTitleFactory();
                $testTitle = $factory->createTitleFromForeignTitle( $foreignTitle );
+               $title = Title::newFromText( $titleText );
 
                $this->assertTrue( $title->equals( $testTitle ) );
        }
index 76cedc6..520108a 100644 (file)
@@ -36,10 +36,18 @@ class NamespaceAwareForeignTitleFactoryTest extends MediaWikiTestCase {
                                'MainNamespaceArticle', null,
                                new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
                        ],
+                       [
+                               'Magic:_The_Gathering', 0,
+                               new ForeignTitle( 0, '', 'Magic:_The_Gathering' ),
+                       ],
                        [
                                'Talk:Nice_talk', 1,
                                new ForeignTitle( 1, 'Talk', 'Nice_talk' ),
                        ],
+                       [
+                               'Talk:Magic:_The_Gathering', 1,
+                               new ForeignTitle( 1, 'Talk', 'Magic:_The_Gathering' ),
+                       ],
                        [
                                'Bogus:Nice_talk', 0,
                                new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
@@ -56,6 +64,11 @@ class NamespaceAwareForeignTitleFactoryTest extends MediaWikiTestCase {
                                'Bogus:Nice_talk', 1,
                                new ForeignTitle( 1, 'Talk', 'Nice_talk' ),
                        ],
+                       // Misconfigured wiki with unregistered namespace (T114115)
+                       [
+                               'Nice_talk', 1234,
+                               new ForeignTitle( 1234, 'Ns1234', 'Nice_talk' ),
+                       ],
                ];
        }
 
index 01c47fd..9b6ac93 100644 (file)
@@ -40,27 +40,27 @@ class NamespaceImportTitleFactoryTest extends MediaWikiTestCase {
                        [
                                new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
                                0,
-                               Title::newFromText( 'MainNamespaceArticle' )
+                               'MainNamespaceArticle'
                        ],
                        [
                                new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
                                2,
-                               Title::newFromText( 'User:MainNamespaceArticle' )
+                               'User:MainNamespaceArticle'
                        ],
                        [
                                new ForeignTitle( 1, 'Discussion', 'Nice_talk' ),
                                0,
-                               Title::newFromText( 'Nice_talk' )
+                               'Nice_talk'
                        ],
                        [
                                new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
                                0,
-                               Title::newFromText( 'Bogus:Nice_talk' )
+                               'Bogus:Nice_talk'
                        ],
                        [
                                new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
                                2,
-                               Title::newFromText( 'User:Bogus:Nice_talk' )
+                               'User:Bogus:Nice_talk'
                        ],
                ];
        }
@@ -68,9 +68,10 @@ class NamespaceImportTitleFactoryTest extends MediaWikiTestCase {
        /**
         * @dataProvider basicProvider
         */
-       public function testBasic( ForeignTitle $foreignTitle, $ns, Title $title ) {
+       public function testBasic( ForeignTitle $foreignTitle, $ns, $titleText ) {
                $factory = new NamespaceImportTitleFactory( $ns );
                $testTitle = $factory->createTitleFromForeignTitle( $foreignTitle );
+               $title = Title::newFromText( $titleText );
 
                $this->assertTrue( $title->equals( $testTitle ) );
        }
index a42c86c..dd68cdc 100644 (file)
@@ -130,8 +130,8 @@ class UploadBaseTest extends MediaWikiTestCase {
         */
        public function testCheckSvgScriptCallback( $svg, $wellFormed, $filterMatch, $message ) {
                list( $formed, $match ) = $this->upload->checkSvgString( $svg );
-               $this->assertSame( $wellFormed, $formed, $message );
-               $this->assertSame( $filterMatch, $match, $message );
+               $this->assertSame( $wellFormed, $formed, $message . " (well-formed)" );
+               $this->assertSame( $filterMatch, $match, $message . " (filter match)" );
        }
 
        public static function provideCheckSvgScriptCallback() {
@@ -254,10 +254,16 @@ class UploadBaseTest extends MediaWikiTestCase {
                        ],
                        [
                                '<?xml version="1.0"?> <?xml-stylesheet type="text/xml" href="#stylesheet"?> <!DOCTYPE doc [ <!ATTLIST xsl:stylesheet id ID #REQUIRED>]> <svg xmlns="http://www.w3.org/2000/svg"> <xsl:stylesheet id="stylesheet" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <iframe xmlns="http://www.w3.org/1999/xhtml" src="javascript:alert(1)"></iframe> </xsl:template> </xsl:stylesheet> <circle fill="red" r="40"></circle> </svg>',
-                               true,
+                               false,
                                true,
                                'SVG with embedded stylesheet (http://html5sec.org/#125)'
                        ],
+                       [
+                               '<?xml version="1.0"?> <?xml-stylesheet type="text/xml" href="#stylesheet"?> <svg xmlns="http://www.w3.org/2000/svg"> <xsl:stylesheet id="stylesheet" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <iframe xmlns="http://www.w3.org/1999/xhtml" src="javascript:alert(1)"></iframe> </xsl:template> </xsl:stylesheet> <circle fill="red" r="40"></circle> </svg>',
+                               true,
+                               true,
+                               'SVG with embedded stylesheet no doctype'
+                       ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg" id="x"> <listener event="load" handler="#y" xmlns="http://www.w3.org/2001/xml-events" observer="x"/> <handler id="y">alert(1)</handler> </svg>',
                                true,
@@ -364,7 +370,7 @@ class UploadBaseTest extends MediaWikiTestCase {
                        ],
                        [
                                '<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!ENTITY lol "lol"> <!ENTITY lol2 "&#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x45;&#x44;&#x20;&#x3D;&#x3E;&#x20;&#x27;&#x2B;&#x64;&#x6F;&#x63;&#x75;&#x6D;&#x65;&#x6E;&#x74;&#x2E;&#x64;&#x6F;&#x6D;&#x61;&#x69;&#x6E;&#x29;&#x3B;&#x3C;&#x2F;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;"> ]> <svg xmlns="http://www.w3.org/2000/svg" width="68" height="68" viewBox="-34 -34 68 68" version="1.1"> <circle cx="0" cy="0" r="24" fill="#c8c8c8"/> <text x="0" y="0" fill="black">&lol2;</text> </svg>',
-                               true,
+                               false,
                                true,
                                'SVG with encoded script tag in internal entity (reported by Beyond Security)'
                        ],
@@ -374,6 +380,16 @@ class UploadBaseTest extends MediaWikiTestCase {
                                false,
                                'SVG with external entity'
                        ],
+                       [
+                               // The base64 = <script>alert(1)</script>. If for some reason
+                               // entities actually do get loaded, this should trigger
+                               // filterMatch to be true. So this test verifies that we
+                               // are not loading external entities.
+                               '<?xml version="1.0"?> <!DOCTYPE svg [ <!ENTITY foo SYSTEM "data:text/plain;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pgo="> ]> <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <desc>&foo;</desc> <rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,2)" /> </svg>',
+                               false,
+                               false, /* False verifies entities aren't getting loaded */
+                               'SVG with data: uri external entity'
+                       ],
                        [
                                "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"> <g> <a xlink:href=\"javascript:alert('1&#10;https://google.com')\"> <rect width=\"300\" height=\"100\" style=\"fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,2)\" /> </a> </g> </svg>",
                                true,
@@ -393,6 +409,104 @@ class UploadBaseTest extends MediaWikiTestCase {
                                false,
                                'SVG with local urls, including filter: in style'
                        ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE x [<!ATTLIST image x:href CDATA "data:image/png,foo" onerror CDATA "alert(\'XSSED = \'+document.domain)" onload CDATA "alert(\'XSSED = \'+document.domain)"> ]> <svg xmlns:h="http://www.w3.org/1999/xhtml" xmlns:x="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"> <image /> </svg>',
+                               false,
+                               false,
+                               'SVG with evil default attribute values'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg SYSTEM "data:application/xml-dtd;base64,PCFET0NUWVBFIHN2ZyBbPCFBVFRMSVNUIGltYWdlIHg6aHJlZiBDREFUQSAiZGF0YTppbWFnZS9wbmcsZm9vIiBvbmVycm9yIENEQVRBICJhbGVydCgnWFNTRUQgPSAnK2RvY3VtZW50LmRvbWFpbikiIG9ubG9hZCBDREFUQSAiYWxlcnQoJ1hTU0VEID0gJytkb2N1bWVudC5kb21haW4pIj4gXT4K"><svg xmlns:x="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"> <image /> </svg>',
+                               true,
+                               true,
+                               'SVG with an evil external dtd'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//FOO/bar" "http://example.com"><svg></svg>',
+                               true,
+                               true,
+                               'SVG with random public doctype'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg SYSTEM \'http://example.com/evil.dtd\' ><svg></svg>',
+                               true,
+                               true,
+                               'SVG with random SYSTEM doctype'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg [<!ENTITY % foo "bar" >] ><svg></svg>',
+                               false,
+                               false,
+                               'SVG with parameter entity'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg [<!ENTITY foo "bar%a;" ] ><svg></svg>',
+                               false,
+                               false,
+                               'SVG with entity referencing parameter entity'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg [<!ENTITY foo "bar0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"> ] ><svg></svg>',
+                               false,
+                               false,
+                               'SVG with long entity'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg [<!ENTITY  foo \'"Hi", said bob\'> ] ><svg><g>&foo;</g></svg>',
+                               true,
+                               false,
+                               'SVG with apostrophe quote entity'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg [<!ENTITY name "Bob"><!ENTITY  foo \'"Hi", said &name;.\'> ] ><svg><g>&foo;</g></svg>',
+                               false,
+                               false,
+                               'SVG with recursive entity',
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [ <!ATTLIST svg xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"> ]> <svg width="417pt" height="366pt"
+ viewBox="0.00 0.00 417.00 366.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>',
+                               true, /* well-formed */
+                               false, /* filter-hit */
+                               'GraphViz-esque svg with #FIXED xlink ns (Should be allowed)'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [ <!ATTLIST svg xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink2"> ]> <svg width="417pt" height="366pt"
+ viewBox="0.00 0.00 417.00 366.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>',
+                               false,
+                               false,
+                               'GraphViz ATLIST exception should match exactly'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!-- Comment-here --> <!ENTITY foo "#ff6666">]><svg xmlns="http://www.w3.org/2000/svg"></svg>',
+                               true,
+                               false,
+                               'DTD with comments (Should be allowed)'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!-- invalid--comment  --> <!ENTITY foo "#ff6666">]><svg xmlns="http://www.w3.org/2000/svg"></svg>',
+                               false,
+                               false,
+                               'DTD with invalid comment'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!-- invalid ---> <!ENTITY foo "#ff6666">]><svg xmlns="http://www.w3.org/2000/svg"></svg>',
+                               false,
+                               false,
+                               'DTD with invalid comment 2'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!ENTITY bar "&foo;"> <!ENTITY foo "#ff6666">]><svg xmlns="http://www.w3.org/2000/svg"></svg>',
+                               true,
+                               false,
+                               'DTD with aliased entities (Should be allowed)'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!ENTITY bar \'&foo;\'> <!ENTITY foo \'#ff6666\'>]><svg xmlns="http://www.w3.org/2000/svg"></svg>',
+                               true,
+                               false,
+                               'DTD with aliased entities apos (Should be allowed)'
+                       ]
                ];
                // @codingStandardsIgnoreEnd
        }
@@ -478,7 +592,10 @@ class UploadTestHandler extends UploadBase {
                        $svg,
                        [ $this, 'checkSvgScriptCallback' ],
                        false,
-                       [ 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback' ]
+                       [
+                               'processing_instruction_handler' => 'UploadBase::checkSvgPICallback',
+                               'external_dtd_handler' => 'UploadBase::checkSvgExternalDTD'
+                       ]
                );
                return [ $check->wellFormed, $check->filterMatch ];
        }
index 81c84e8..09cf350 100644 (file)
@@ -2,6 +2,7 @@
 
 use MediaWiki\Session\SessionManager;
 use Wikimedia\ScopedCallback;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @covers BotPassword
@@ -311,7 +312,9 @@ class BotPasswordTest extends MediaWikiTestCase {
                );
 
                // Failed restriction
-               $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
+               $request = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'getIP' ] )
+                       ->getMock();
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '10.0.0.1' ) );
                $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', $request );
@@ -379,6 +382,8 @@ class BotPasswordTest extends MediaWikiTestCase {
                }
 
                $token = $bp->getToken();
+               $this->assertEquals( 42, $bp->getUserCentralId() );
+               $this->assertEquals( 'TestSave', $bp->getAppId() );
                $this->assertFalse( $bp->save( 'insert' ) );
                $this->assertTrue( $bp->save( 'update' ) );
                $this->assertNotEquals( $token, $bp->getToken() );
index feac641..789cf08 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * @covers CentralIdLookup
  * @group Database
index 7ff882a..3363bca 100644 (file)
@@ -23,7 +23,7 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                $authManager->expects( $this->any() )->method( 'allowsAuthenticationDataChange' )
                        ->willReturn( $allowsAuthenticationDataChange ? Status::newGood() : Status::newFatal( 'foo' ) );
 
-               $user = $this->getMock( User::class );
+               $user = $this->getMockBuilder( User::class )->getMock();
                $user->expects( $this->any() )->method( 'getName' )->willReturn( 'Foo' );
                $user->expects( $this->any() )->method( 'isBlocked' )->willReturn( $userIsBlocked );
                $user->expects( $this->any() )->method( 'isAllowed' )
@@ -124,12 +124,12 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
 
                $request = new FauxRequest();
                $request->setIP( '1.2.3.4' );
-               $performingUser = $this->getMock( User::class );
+               $performingUser = $this->getMockBuilder( User::class )->getMock();
                $performingUser->expects( $this->any() )->method( 'getRequest' )->willReturn( $request );
                $performingUser->expects( $this->any() )->method( 'isAllowed' )->willReturn( true );
 
-               $targetUser1 = $this->getMock( User::class );
-               $targetUser2 = $this->getMock( User::class );
+               $targetUser1 = $this->getMockBuilder( User::class )->getMock();
+               $targetUser2 = $this->getMockBuilder( User::class )->getMock();
                $targetUser1->expects( $this->any() )->method( 'getName' )->willReturn( 'User1' );
                $targetUser2->expects( $this->any() )->method( 'getName' )->willReturn( 'User2' );
                $targetUser1->expects( $this->any() )->method( 'getId' )->willReturn( 1 );
index a297f29..f95e387 100644 (file)
@@ -50,8 +50,7 @@ class UserGroupMembershipTest extends MediaWikiTestCase {
         * @covers UserGroupMembership::delete
         */
        public function testAddAndRemoveGroups() {
-               $user = new User;
-               $user->addToDatabase();
+               $user = $this->getMutableTestUser()->getUser();
 
                // basic tests
                $ugm = new UserGroupMembership( $user->getId(), 'unittesters' );
index fea4a44..b58d71c 100644 (file)
@@ -4,6 +4,7 @@ define( 'NS_UNITTEST', 5600 );
 define( 'NS_UNITTEST_TALK', 5601 );
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Database
@@ -24,9 +25,7 @@ class UserTest extends MediaWikiTestCase {
 
                $this->setUpPermissionGlobals();
 
-               $this->user = new User;
-               $this->user->addToDatabase();
-               $this->user->addGroup( 'unittesters' );
+               $this->user = $this->getTestUser( [ 'unittesters' ] )->getUser();
        }
 
        private function setUpPermissionGlobals() {
@@ -99,10 +98,7 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::getRights
         */
        public function testUserGetRightsHooks() {
-               $user = new User;
-               $user->addToDatabase();
-               $user->addGroup( 'unittesters' );
-               $user->addGroup( 'testwriters' );
+               $user = $this->getTestUser( [ 'unittesters', 'testwriters' ] )->getUser();
                $userWrapper = TestingAccessWrapper::newFromObject( $user );
 
                $rights = $user->getRights();
@@ -933,4 +929,50 @@ class UserTest extends MediaWikiTestCase {
 
                $this->assertFalse( $user->getExperienceLevel() );
        }
+
+       public static function provideIsLocallBlockedProxy() {
+               return [
+                       [ '1.2.3.4', '1.2.3.4' ],
+                       [ '1.2.3.4', '1.2.3.0/16' ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideIsLocallBlockedProxy
+        * @covers User::isLocallyBlockedProxy
+        */
+       public function testIsLocallyBlockedProxy( $ip, $blockListEntry ) {
+               $this->setMwGlobals(
+                       'wgProxyList', []
+               );
+               $this->assertFalse( User::isLocallyBlockedProxy( $ip ) );
+
+               $this->setMwGlobals(
+                       'wgProxyList',
+                       [
+                               $blockListEntry
+                       ]
+               );
+               $this->assertTrue( User::isLocallyBlockedProxy( $ip ) );
+
+               $this->setMwGlobals(
+                       'wgProxyList',
+                       [
+                               'test' => $blockListEntry
+                       ]
+               );
+               $this->assertTrue( User::isLocallyBlockedProxy( $ip ) );
+
+               $this->hideDeprecated(
+                       'IP addresses in the keys of $wgProxyList (found the following IP ' .
+                       'addresses in keys: ' . $blockListEntry . ', please move them to values)'
+               );
+               $this->setMwGlobals(
+                       'wgProxyList',
+                       [
+                               $blockListEntry => 'test'
+                       ]
+               );
+               $this->assertTrue( User::isLocallyBlockedProxy( $ip ) );
+       }
 }
index 60d4e99..8b54b72 100644 (file)
@@ -45,7 +45,7 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
                                $last_timestamp_bin,
                                $timestamp_bin,
                                "timestamp ($timestamp_bin) of current ID ($id_bin) >= timestamp ($last_timestamp_bin) " .
-                                 "of prior one ($lastId_bin)" );
+                                       "of prior one ($lastId_bin)" );
 
                        $hostbits_bin = substr( $id_bin, -$hostbits );
                        $last_hostbits_bin = substr( $lastId_bin, -$hostbits );
@@ -55,7 +55,7 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
                                        $hostbits_bin,
                                        $last_hostbits_bin,
                                        "Host ID ($hostbits_bin) of current ID ($id_bin) is same as host ID ($last_hostbits_bin) " .
-                                         "of prior one ($lastId_bin)." );
+                                               "of prior one ($lastId_bin)." );
                        }
 
                        $lastId = $id;
diff --git a/tests/phpunit/languages/LanguageCodeTest.php b/tests/phpunit/languages/LanguageCodeTest.php
new file mode 100644 (file)
index 0000000..b33360c
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @covers LanguageCode
+ *
+ * @group Language
+ *
+ * @license GPL-2.0+
+ * @author Thiemo Mättig
+ */
+class LanguageCodeTest extends PHPUnit_Framework_TestCase {
+
+       public function testConstructor() {
+               $instance = new LanguageCode();
+
+               $this->assertInstanceOf( LanguageCode::class, $instance );
+       }
+
+       public function testGetDeprecatedCodeMapping() {
+               $map = LanguageCode::getDeprecatedCodeMapping();
+
+               $this->assertInternalType( 'array', $map );
+               $this->assertContainsOnly( 'string', array_keys( $map ) );
+               $this->assertArrayNotHasKey( '', $map );
+               $this->assertContainsOnly( 'string', $map );
+               $this->assertNotContains( '', $map );
+
+               // Codes special to MediaWiki should never appear in a map of "deprecated" codes
+               $this->assertArrayNotHasKey( 'qqq', $map, 'documentation' );
+               $this->assertNotContains( 'qqq', $map, 'documentation' );
+               $this->assertArrayNotHasKey( 'qqx', $map, 'debug code' );
+               $this->assertNotContains( 'qqx', $map, 'debug code' );
+
+               // Valid language codes that are currently not "deprecated"
+               $this->assertArrayNotHasKey( 'bh', $map, 'family of Bihari languages' );
+               $this->assertArrayNotHasKey( 'no', $map, 'family of Norwegian languages' );
+               $this->assertArrayNotHasKey( 'simple', $map );
+       }
+
+}
index cb3d227..6b0e344 100644 (file)
@@ -835,7 +835,7 @@ class MaintenanceTest extends MediaWikiTestCase {
         * @covers Maintenance::setConfig
         */
        public function testSetConfig() {
-               $conf = $this->getMock( 'Config' );
+               $conf = $this->createMock( 'Config' );
                $this->m->setConfig( $conf );
                $this->assertSame( $conf, $this->m->getConfig() );
        }
index d7e72bb..ea5ca8d 100644 (file)
@@ -103,7 +103,7 @@ class TextPassDumperDatabaseTest extends DumpTestCase {
                // increasing
                $this->assertEquals(
                        [ $this->pageId2, $this->pageId3, $this->pageId4 ],
-                       [ $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ],
+                       [ $this->pageId1 + 1, $this->pageId1 + 2, $this->pageId1 + 3 ],
                        "Page ids increasing without holes" );
        }
 
@@ -169,7 +169,10 @@ class TextPassDumperDatabaseTest extends DumpTestCase {
                ];
 
                // The mock itself
-               $prefetchMock = $this->getMock( 'BaseDump', [ 'prefetch' ], [], '', false );
+               $prefetchMock = $this->getMockBuilder( 'BaseDump' )
+                       ->setMethods( [ 'prefetch' ] )
+                       ->disableOriginalConstructor()
+                       ->getMock();
                $prefetchMock->expects( $this->exactly( 6 ) )
                        ->method( 'prefetch' )
                        ->will( $this->returnValueMap( $prefetchMap ) );
diff --git a/tests/phpunit/mocks/MockChangesListFilter.php b/tests/phpunit/mocks/MockChangesListFilter.php
new file mode 100644 (file)
index 0000000..79232ad
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+
+class MockChangesListFilter extends ChangesListFilter {
+       public function displaysOnUnstructuredUi() {
+               throw new MWException(
+                       'Not implemented: If the test relies on this, put it one of the ' .
+                       'subclasses\' tests (e.g. ChangesListBooleanFilterTest) ' .
+                       'instead of testing the abstract class'
+               );
+       }
+
+       public function isSelected( FormOptions $opts ) {
+               return false;
+       }
+}
diff --git a/tests/phpunit/mocks/MockChangesListFilterGroup.php b/tests/phpunit/mocks/MockChangesListFilterGroup.php
new file mode 100644 (file)
index 0000000..f2891ce
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+
+class MockChangesListFilterGroup extends ChangesListFilterGroup {
+       public function createFilter( array $filterDefinition ) {
+               return new MockChangesListFilter( $filterDefinition );
+       }
+
+       public function registerFilter( MockChangesListFilter $filter ) {
+               $this->filters[$filter->getName()] = $filter;
+       }
+
+       public function isPerGroupRequestParameter() {
+               throw new MWException(
+                       'Not implemented: If the test relies on this, put it one of the ' .
+                       'subclasses\' tests (e.g. ChangesListBooleanFilterGroupTest) ' .
+                       'instead of testing the abstract class'
+               );
+       }
+}
index bc5a6bd..9e46e07 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * Checks that all API modules, core and extensions, have documentation i18n messages
  *
index 30bae78..c8bcd60 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 11a25c4..7babcac 100644 (file)
@@ -35,8 +35,7 @@
                        <directory>structure</directory>
                        <file>suites/LessTestSuite.php</file>
                </testsuite>
-               <!-- As there is a class Maintenance, we cannot use the
-                    name "maintenance" directly -->
+               <!-- As there is a class Maintenance, we cannot use the name "maintenance" directly -->
                <testsuite name="maintenance_suite">
                        <directory>maintenance</directory>
                </testsuite>
index edc81ff..7d75ffe 100644 (file)
@@ -142,7 +142,7 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
         */
        public function testLoggersAreRestoredOnTearDown_replacingExistingLogger() {
                $logger1 = LoggerFactory::getInstance( 'foo' );
-               $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
+               $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) );
                $logger2 = LoggerFactory::getInstance( 'foo' );
                $this->tearDown();
                $logger3 = LoggerFactory::getInstance( 'foo' );
@@ -156,7 +156,7 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
         * @covers MediaWikiTestCase::restoreLoggers
         */
        public function testLoggersAreRestoredOnTearDown_replacingNonExistingLogger() {
-               $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
+               $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) );
                $logger1 = LoggerFactory::getInstance( 'foo' );
                $this->tearDown();
                $logger2 = LoggerFactory::getInstance( 'foo' );
@@ -171,8 +171,8 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
         */
        public function testLoggersAreRestoredOnTearDown_replacingSameLoggerTwice() {
                $logger1 = LoggerFactory::getInstance( 'baz' );
-               $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
-               $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
+               $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) );
+               $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) );
                $this->tearDown();
                $logger2 = LoggerFactory::getInstance( 'baz' );
 
index 1278ecb..53362c4 100644 (file)
@@ -32,7 +32,6 @@ return [
                        'mediawiki.page.ready',
                        'mediawiki.page.startup',
                        'test.sinonjs',
-                       'dom-level2-shim',
                ],
                'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
@@ -58,7 +57,6 @@ return [
                        'tests/qunit/suites/resources/jquery/jquery.localize.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js',
-                       'tests/qunit/suites/resources/jquery/jquery.placeholder.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js',
@@ -76,6 +74,7 @@ return [
                        'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js',
@@ -94,6 +93,7 @@ return [
                        '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.rcfilters/dm.FilterItem.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',
@@ -112,7 +112,6 @@ return [
                        'jquery.localize',
                        'jquery.makeCollapsible',
                        'jquery.mwExtension',
-                       'jquery.placeholder',
                        'jquery.tabIndex',
                        'jquery.tablesorter',
                        'jquery.textSelection',
@@ -142,6 +141,7 @@ return [
                        'mediawiki.cldr',
                        'mediawiki.cookie',
                        'mediawiki.experiments',
+                       'mediawiki.inspect',
                        'test.mediawiki.qunit.testrunner',
                ],
        ]
index cef5c15..a947484 100644 (file)
@@ -1,8 +1,8 @@
-/* global CompletenessTest, sinon */
+/* global sinon */
 ( function ( $, mw, QUnit ) {
        'use strict';
 
-       var mwTestIgnore, addons;
+       var addons;
 
        /**
         * Add bogus to url to prevent IE crazy caching
                value: 'true'
        } );
 
-       /**
-        * CompletenessTest
-        *
-        * Adds toggle checkbox to header
-        */
-       QUnit.config.urlConfig.push( {
-               id: 'completenesstest',
-               label: 'Run CompletenessTest',
-               tooltip: 'Run the completeness test'
-       } );
-
        /**
         * SinonJS
         *
                };
        }() );
 
-       // Initiate when enabled
-       if ( QUnit.urlParams.completenesstest ) {
-
-               // Return true to ignore
-               mwTestIgnore = function ( val, tester ) {
-
-                       // Don't record methods of the properties of constructors,
-                       // to avoid getting into a loop (prototype.constructor.prototype..).
-                       // Since we're therefor skipping any injection for
-                       // "new mw.Foo()", manually set it to true here.
-                       if ( val instanceof mw.Map ) {
-                               tester.methodCallTracker.Map = true;
-                               return true;
-                       }
-                       if ( val instanceof mw.Title ) {
-                               tester.methodCallTracker.Title = true;
-                               return true;
-                       }
-
-                       // Don't record methods of the properties of a jQuery object
-                       if ( val instanceof $ ) {
-                               return true;
-                       }
-
-                       // Don't iterate over the module registry (the 'script' references would
-                       // be listed as untested methods otherwise)
-                       if ( val === mw.loader.moduleRegistry ) {
-                               return true;
-                       }
-
-                       return false;
-               };
-
-               // eslint-disable-next-line no-new
-               new CompletenessTest( mw, mwTestIgnore );
-       }
-
        /**
         * Reset mw.config and others to a fresh copy of the live config for each test(),
         * and restore it back to the live one afterwards.
                liveMessages = mw.messages;
 
                function suppressWarnings() {
-                       warn = mw.log.warn;
-                       error = mw.log.error;
-                       mw.log.warn = mw.log.error = $.noop;
+                       if ( warn === undefined ) {
+                               warn = mw.log.warn;
+                               error = mw.log.error;
+                               mw.log.warn = mw.log.error = $.noop;
+                       }
                }
 
                function restoreWarnings() {
                                        // Stop tracking ajax requests
                                        $( document ).off( 'ajaxSend', trackAjax );
 
+                                       // As a convenience feature, automatically restore warnings if they're
+                                       // still suppressed by the end of the test.
+                                       restoreWarnings();
+
                                        // Farewell, mock environment!
                                        mw.config = liveConfig;
                                        mw.messages = liveMessages;
                                                messages: liveMessages
                                        } );
 
-                                       // As a convenience feature, automatically restore warnings if they're
-                                       // still suppressed by the end of the test.
-                                       restoreWarnings();
-
                                        // Tests should use fake timers or wait for animations to complete
                                        // Check for incomplete animations/requests/etc and throw if there are any.
                                        if ( $.timers && $.timers.length !== 0 ) {
                                                        );
                                                } );
                                                // Force animations to stop to give the next test a clean start
+                                               $.timers = [];
                                                $.fx.stop();
 
                                                throw new Error( 'Unfinished animations: ' + timers );
                                                        mw.log.warn( 'Pending requests does not match jQuery.active count' );
                                                }
                                                // Force requests to stop to give the next test a clean start
-                                               $.each( pending, function ( i, ajax ) {
-                                                       mw.log.warn( 'Pending AJAX request #' + i, ajax.options );
+                                               $.each( ajaxRequests, function ( i, ajax ) {
+                                                       mw.log.warn(
+                                                               'AJAX request #' + i + ' (state: ' + ajax.xhr.state() + ')',
+                                                               ajax.options
+                                                       );
                                                        ajax.xhr.abort();
                                                } );
                                                ajaxRequests = [];
index c7b7cc0..5c1be67 100644 (file)
                $input: $( '<input>' ).attr( 'type', 'text' )
                        .byteLimit( 12 ),
                sample: mbSample,
-               expected: '1234567890' + '12'
+               expected: '123456789012'
        } );
 
        byteLimitTest( {
index 4e77d72..53d29cf 100644 (file)
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
        } );
 
-       QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)', function ( assert ) {
+       QUnit.test( 'clicks on links inside toggler pass through', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible">' +
                                        '<div class="mw-collapsible-toggle">' +
                assert.assertTrue( $content.is( ':hidden' ), 'click event on non-link inside toggle toggles content' );
        } );
 
+       QUnit.test( 'click on non-link inside toggler counts as trigger', function ( assert ) {
+               var $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' +
+                                       '<div class="mw-collapsible-toggle">' +
+                                               'Toggle <a>toggle</a> toggle <b>toggle</b>' +
+                                       '</div>' +
+                                       '<div class="mw-collapsible-content">' + loremIpsum + '</div>' +
+                               '</div>',
+                               { instantHide: true }
+                       ),
+                       $content = $collapsible.find( '.mw-collapsible-content' );
+
+               $collapsible.find( '.mw-collapsible-toggle a' ).trigger( 'click' );
+               assert.assertTrue( $content.is( ':hidden' ), 'click event on link (with no href) inside toggle toggles content' );
+       } );
+
        QUnit.test( 'collapse/expand text (data-collapsetext, data-expandtext)', function ( assert ) {
                var $collapsible = prepareCollapsible(
                                '<div class="mw-collapsible" data-collapsetext="Collapse me!" data-expandtext="Expand me!">' +
                                        loremIpsum +
                                '</div>'
                        ),
-                       $toggleLink = $collapsible.find( '.mw-collapsible-toggle a' );
+                       $toggleText = $collapsible.find( '.mw-collapsible-text' );
 
-               assert.equal( $toggleLink.text(), 'Collapse me!', 'data-collapsetext is respected' );
+               assert.equal( $toggleText.text(), 'Collapse me!', 'data-collapsetext is respected' );
 
                $collapsible.on( 'afterCollapse.mw-collapsible', function () {
-                       assert.equal( $toggleLink.text(), 'Expand me!', 'data-expandtext is respected' );
+                       assert.equal( $toggleText.text(), 'Expand me!', 'data-expandtext is respected' );
                } );
 
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
                                '<div class="mw-collapsible">' + loremIpsum + '</div>',
                                { collapseText: 'Collapse me!', expandText: 'Expand me!' }
                        ),
-                       $toggleLink = $collapsible.find( '.mw-collapsible-toggle a' );
+                       $toggleText = $collapsible.find( '.mw-collapsible-text' );
+
+               assert.equal( $toggleText.text(), 'Collapse me!', 'options.collapseText is respected' );
+
+               $collapsible.on( 'afterCollapse.mw-collapsible', function () {
+                       assert.equal( $toggleText.text(), 'Expand me!', 'options.expandText is respected' );
+               } );
+
+               $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+       } );
+
+       QUnit.test( 'predefined toggle button and text (.mw-collapsible-toggle/.mw-collapsible-text)', function ( assert ) {
+               var $collapsible = prepareCollapsible(
+                               '<div class="mw-collapsible">' +
+                                       '<div class="mw-collapsible-toggle">' +
+                                               '<span>[</span><span class="mw-collapsible-text">Toggle</span><span>]</span>' +
+                                       '</div>' +
+                                       '<div class="mw-collapsible-content">' + loremIpsum + '</div>' +
+                               '</div>',
+                               { collapseText: 'Hide', expandText: 'Show' }
+                       ),
+                       $toggleText = $collapsible.find( '.mw-collapsible-text' );
 
-               assert.equal( $toggleLink.text(), 'Collapse me!', 'options.collapseText is respected' );
+               assert.equal( $toggleText.text(), 'Toggle', 'predefined text remains' );
 
                $collapsible.on( 'afterCollapse.mw-collapsible', function () {
-                       assert.equal( $toggleLink.text(), 'Expand me!', 'options.expandText is respected' );
+                       assert.equal( $toggleText.text(), 'Show', 'predefined text is toggled' );
+
+                       $collapsible.on( 'afterExpand.mw-collapsible', function () {
+                               assert.equal( $toggleText.text(), 'Hide', 'predefined text is toggled back' );
+                       } );
+
+                       $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
                } );
 
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
diff --git a/tests/qunit/suites/resources/jquery/jquery.placeholder.test.js b/tests/qunit/suites/resources/jquery/jquery.placeholder.test.js
deleted file mode 100644 (file)
index dd7666b..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-( function ( $ ) {
-       var html, testElement;
-
-       QUnit.module( 'jquery.placeholder', QUnit.newMwEnvironment() );
-
-       QUnit.test( 'caches results of feature tests', function ( assert ) {
-               assert.strictEqual( typeof $.fn.placeholder.input, 'boolean', '$.fn.placeholder.input' );
-               assert.strictEqual( typeof $.fn.placeholder.textarea, 'boolean', '$.fn.placeholder.textarea' );
-       } );
-
-       if ( $.fn.placeholder.input && $.fn.placeholder.textarea ) {
-               return;
-       }
-
-       html = '<form>' +
-               '<input id="input-type-search" type="search" placeholder="Search this site...">' +
-               '<input id="input-type-text" type="text" placeholder="e.g. John Doe">' +
-               '<input id="input-type-email" type="email" placeholder="e.g. address@example.ext">' +
-               '<input id="input-type-url" type="url" placeholder="e.g. http://mathiasbynens.be/">' +
-               '<input id="input-type-tel" type="tel" placeholder="e.g. +32 472 77 69 88">' +
-               '<input id="input-type-password" type="password" placeholder="e.g. hunter2">' +
-               '<textarea id="textarea" name="message" placeholder="Your message goes here"></textarea>' +
-       '</form>';
-       testElement = function ( $el, assert ) {
-               var el = $el[ 0 ],
-                       placeholder = el.getAttribute( 'placeholder' );
-
-               assert.strictEqual( $el.placeholder(), $el, 'should be chainable' );
-
-               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
-
-               // test on focus
-               $el.focus();
-               assert.strictEqual( el.value, '', '`value` should be the empty string on focus' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( !$el.hasClass( 'placeholder' ), 'should not have `placeholder` class on focus' );
-
-               // and unfocus (blur) again
-               $el.blur();
-
-               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
-
-               // change the value
-               $el.val( 'lorem ipsum' );
-               assert.strictEqual( $el.prop( 'value' ), 'lorem ipsum', '`$el.val(string)` should change the `value` property' );
-               assert.strictEqual( el.value, 'lorem ipsum', '`$el.val(string)` should change the `value` attribute' );
-               assert.ok( !$el.hasClass( 'placeholder' ), '`$el.val(string)` should remove `placeholder` class' );
-
-               // and clear it again
-               $el.val( '' );
-               assert.strictEqual( $el.prop( 'value' ), '', '`$el.val("")` should change the `value` property' );
-               assert.strictEqual( el.value, placeholder, '`$el.val("")` should change the `value` attribute' );
-               assert.ok( $el.hasClass( 'placeholder' ), '`$el.val("")` should re-enable `placeholder` class' );
-
-               // make sure the placeholder property works as expected.
-               assert.strictEqual( $el.prop( 'placeholder' ), placeholder, '$el.prop(`placeholder`) should return the placeholder value' );
-               $el.placeholder( 'new placeholder' );
-               assert.strictEqual( el.getAttribute( 'placeholder' ), 'new placeholder', '$el.placeholder(<string>) should set the placeholder value' );
-               assert.strictEqual( el.value, 'new placeholder', '$el.placeholder(<string>) should update the displayed placeholder value' );
-               $el.placeholder( placeholder );
-       };
-
-       QUnit.test( 'emulates placeholder for <input type=text>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#input-type-text' ), assert );
-       } );
-
-       QUnit.test( 'emulates placeholder for <input type=search>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#input-type-search' ), assert );
-       } );
-
-       QUnit.test( 'emulates placeholder for <input type=email>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#input-type-email' ), assert );
-       } );
-
-       QUnit.test( 'emulates placeholder for <input type=url>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#input-type-url' ), assert );
-       } );
-
-       QUnit.test( 'emulates placeholder for <input type=tel>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#input-type-tel' ), assert );
-       } );
-
-       QUnit.test( 'emulates placeholder for <input type=password>', function ( assert ) {
-               var $el, el, placeholder, selector = '#input-type-password';
-
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-
-               $el = $( selector );
-               el = $el[ 0 ];
-               placeholder = el.getAttribute( 'placeholder' );
-
-               assert.strictEqual( $el.placeholder(), $el, 'should be chainable' );
-
-               // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $( selector );
-               el = $el[ 0 ];
-
-               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
-
-               // test on focus
-               $el.focus();
-
-               // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $( selector );
-               el = $el[ 0 ];
-
-               assert.strictEqual( el.value, '', '`value` should be the empty string on focus' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( !$el.hasClass( 'placeholder' ), 'should not have `placeholder` class on focus' );
-
-               // and unfocus (blur) again
-               $el.blur();
-
-               // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $( selector );
-               el = $el[ 0 ];
-
-               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
-
-       } );
-
-       QUnit.test( 'emulates placeholder for <textarea>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#textarea' ), assert );
-       } );
-
-}( jQuery ) );
index c0b1657..200395e 100644 (file)
                [ '2000-01-01', true, 946684800000, 'Year with month and 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, -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-24:00',  true, 946816230000, 'Date time in UTC-24' ],
                [ '2000-01-01T12:30:30+24:00',  true, 946643430000, 'Date time in UTC+24' ],
                [ '2000-01-01T12:30:30+0100',   true, 946726230000, 'Time without separator in timezone offset' ]
+               // No "Z", uses local timezone:
+               [ '2000-01-01T12:30:30',                true, 946729830000, 'Date with a time' ],
+               [ '2000-01-01T12:30:61Z',       true, 946729800000, 'Date with invalid amount of seconds, drops seconds' ],
                */
        ];
        parserTest( 'ISO Dates', 'isoDate', ISODates );
index f958e09..5b3c2ed 100644 (file)
                        }
 
                        function among( actual, expected, message ) {
-                               if ( $.isArray( expected ) ) {
+                               if ( Array.isArray( expected ) ) {
                                        assert.ok( $.inArray( actual, expected ) !== -1, message + ' (got ' + actual + '; expected one of ' + expected.join( ', ' ) + ')' );
                                } else {
                                        assert.equal( actual, expected, message );
diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js
new file mode 100644 (file)
index 0000000..271648f
--- /dev/null
@@ -0,0 +1,187 @@
+/* eslint-disable camelcase */
+( function ( mw ) {
+       QUnit.module( 'mediawiki.rcfilters - FilterItem' );
+
+       QUnit.test( 'Initializing filter item', function ( assert ) {
+               var item,
+                       group1 = new mw.rcfilters.dm.FilterGroup( 'group1' ),
+                       group2 = new mw.rcfilters.dm.FilterGroup( 'group2' );
+
+               item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 );
+               assert.equal(
+                       item.getName(),
+                       'group1__filter1',
+                       'Filter name is retained.'
+               );
+               assert.equal(
+                       item.getGroupName(),
+                       'group1',
+                       'Group name is retained.'
+               );
+
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               label: 'test label',
+                               description: 'test description'
+                       }
+               );
+               assert.equal(
+                       item.getLabel(),
+                       'test label',
+                       'Label information is retained.'
+               );
+               assert.equal(
+                       item.getLabel(),
+                       'test label',
+                       'Description information is retained.'
+               );
+
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               selected: true
+                       }
+               );
+               assert.equal(
+                       item.isSelected(),
+                       true,
+                       'Item can be selected in the config.'
+               );
+               item.toggleSelected( true );
+               assert.equal(
+                       item.isSelected(),
+                       true,
+                       'Item can toggle its selected state.'
+               );
+
+               // Subsets
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               subset: [ 'sub1', 'sub2', 'sub3' ]
+                       }
+               );
+               assert.deepEqual(
+                       item.getSubset(),
+                       [ 'sub1', 'sub2', 'sub3' ],
+                       'Subset information is retained.'
+               );
+               assert.equal(
+                       item.existsInSubset( 'sub1' ),
+                       true,
+                       'Specific item exists in subset.'
+               );
+               assert.equal(
+                       item.existsInSubset( 'sub10' ),
+                       false,
+                       'Specific item does not exists in subset.'
+               );
+               assert.equal(
+                       item.isIncluded(),
+                       false,
+                       'Initial state of "included" is false.'
+               );
+
+               item.toggleIncluded( true );
+               assert.equal(
+                       item.isIncluded(),
+                       true,
+                       'Item toggles its included state.'
+               );
+
+               // Conflicts
+               item = new mw.rcfilters.dm.FilterItem(
+                       'filter1',
+                       group1,
+                       {
+                               conflicts: {
+                                       group2__conflict1: { group: 'group2', filter: 'group2__conflict1' },
+                                       group2__conflict2: { group: 'group2', filter: 'group2__conflict2' },
+                                       group2__conflict3: { group: 'group2', filter: 'group2__conflict3' }
+                               }
+                       }
+               );
+               assert.deepEqual(
+                       item.getConflicts(),
+                       {
+                               group2__conflict1: { group: 'group2', filter: 'group2__conflict1' },
+                               group2__conflict2: { group: 'group2', filter: 'group2__conflict2' },
+                               group2__conflict3: { group: 'group2', filter: 'group2__conflict3' }
+                       },
+                       'Conflict information is retained.'
+               );
+               assert.equal(
+                       item.existsInConflicts( new mw.rcfilters.dm.FilterItem( 'conflict1', group2 ) ),
+                       true,
+                       'Specific item exists in conflicts.'
+               );
+               assert.equal(
+                       item.existsInConflicts( new mw.rcfilters.dm.FilterItem( 'conflict10', group1 ) ),
+                       false,
+                       'Specific item does not exists in conflicts.'
+               );
+               assert.equal(
+                       item.isConflicted(),
+                       false,
+                       'Initial state of "conflicted" is false.'
+               );
+
+               item.toggleConflicted( true );
+               assert.equal(
+                       item.isConflicted(),
+                       true,
+                       'Item toggles its conflicted state.'
+               );
+
+               // Fully covered
+               item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 );
+               assert.equal(
+                       item.isFullyCovered(),
+                       false,
+                       'Initial state of "full coverage" is false.'
+               );
+               item.toggleFullyCovered( true );
+               assert.equal(
+                       item.isFullyCovered(),
+                       true,
+                       'Item toggles its fully coverage state.'
+               );
+
+       } );
+
+       QUnit.test( 'Emitting events', function ( assert ) {
+               var group1 = new mw.rcfilters.dm.FilterGroup( 'group1' ),
+                       item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 ),
+                       events = [];
+
+               // Listen to update events
+               item.on( 'update', function () {
+                       events.push( item.getState() );
+               } );
+
+               // Do stuff
+               item.toggleSelected( true ); // { selected: true, included: false, conflicted: false, fullyCovered: false }
+               item.toggleSelected( true ); // No event (duplicate state)
+               item.toggleIncluded( true ); // { selected: true, included: true, conflicted: false, fullyCovered: false }
+               item.toggleConflicted( true ); // { selected: true, included: true, conflicted: true, fullyCovered: false }
+               item.toggleFullyCovered( true ); // { selected: true, included: true, conflicted: true, fullyCovered: true }
+               item.toggleSelected(); // { selected: false, included: true, conflicted: true, fullyCovered: true }
+
+               // Check emitted events
+               assert.deepEqual(
+                       events,
+                       [
+                               { selected: true, included: false, conflicted: false, fullyCovered: false },
+                               { selected: true, included: true, conflicted: false, fullyCovered: false },
+                               { selected: true, included: true, conflicted: true, fullyCovered: false },
+                               { selected: true, included: true, conflicted: true, fullyCovered: true },
+                               { selected: false, included: true, conflicted: true, fullyCovered: true }
+                       ],
+                       'Events emitted successfully.'
+               );
+       } );
+}( mediaWiki ) );
index 3a940d0..618afb2 100644 (file)
+/* eslint-disable camelcase */
 ( function ( mw, $ ) {
-       QUnit.module( 'mediawiki.rcfilters - FiltersViewModel' );
+       QUnit.module( 'mediawiki.rcfilters - FiltersViewModel', QUnit.newMwEnvironment( {
+               messages: {
+                       'group1filter1-label': 'Group 1: Filter 1',
+                       'group1filter1-desc': 'Description of Filter 1 in Group 1',
+                       'group1filter2-label': 'Group 1: Filter 2',
+                       'group1filter2-desc': 'Description of Filter 2 in Group 1',
+                       'group2filter1-label': 'Group 2: Filter 1',
+                       'group2filter1-desc': 'Description of Filter 1 in Group 2',
+                       'group2filter2-label': 'xGroup 2: Filter 2',
+                       'group2filter2-desc': 'Description of Filter 2 in Group 2'
+               }
+       } ) );
 
        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'
-                                               }
-                                       ]
-                               }
-                       },
+               var definition = [ {
+                               name: 'group1',
+                               title: 'Group 1',
+                               type: 'send_unselected_if_any',
+                               filters: [
+                                       {
+                                               name: 'filter1',
+                                               label: 'Group 1: Filter 1',
+                                               description: 'Description of Filter 1 in Group 1'
+                                       },
+                                       {
+                                               name: 'filter2',
+                                               label: 'Group 1: Filter 2',
+                                               description: 'Description of Filter 2 in Group 1'
+                                       }
+                               ]
+                       }, {
+                               name: 'group2',
+                               title: 'Group 2',
+                               type: 'send_unselected_if_any',
+                               filters: [
+                                       {
+                                               name: 'filter1',
+                                               label: 'Group 2: Filter 1',
+                                               description: 'Description of Filter 1 in Group 2'
+                                       },
+                                       {
+                                               name: 'filter2',
+                                               label: 'Group 2: Filter 2',
+                                               description: 'Description of Filter 2 in Group 2'
+                                       }
+                               ]
+                       }, {
+                               name: 'group3',
+                               title: 'Group 3',
+                               type: 'string_options',
+                               filters: [
+                                       {
+                                               name: 'filter1',
+                                               label: 'Group 3: Filter 1',
+                                               description: 'Description of Filter 1 in Group 3'
+                                       },
+                                       {
+                                               name: 'filter2',
+                                               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,
+                       model.getItemByName( 'group1__filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group1__filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group2__filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group2__filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group3__filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group3__filter2' ) 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
+                               group1__filter1: false,
+                               group1__filter2: false,
+                               group2__filter1: false,
+                               group2__filter2: false,
+                               group3__filter1: false,
+                               group3__filter2: false
                        },
                        'Initial state of filters'
                );
 
-               model.updateFilters( {
-                       group1filter1: true,
-                       group2filter2: true,
-                       group3filter1: true
+               model.toggleFiltersSelected( {
+                       group1__filter1: true,
+                       group2__filter2: true,
+                       group3__filter1: true
                } );
                assert.deepEqual(
                        model.getSelectedState(),
                        {
-                               group1filter1: true,
-                               group1filter2: false,
-                               group2filter1: false,
-                               group2filter2: true,
-                               group3filter1: true,
-                               group3filter2: false
+                               group1__filter1: true,
+                               group1__filter2: false,
+                               group2__filter1: false,
+                               group2__filter2: true,
+                               group3__filter1: true,
+                               group3__filter2: false
                        },
                        'Updating filter states correctly'
                );
        } );
 
+       QUnit.test( 'Default filters', function ( assert ) {
+               var definition = [ {
+                               name: '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
+                                       }
+                               ]
+                       }, {
+                               name: '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'
+                                       }
+                               ]
+                       }, {
+
+                               name: 'group3',
+                               title: 'Group 3',
+                               type: 'string_options',
+                               separator: ',',
+                               default: 'filter8',
+                               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 );
+
+               // Empty query = only default values
+               assert.deepEqual(
+                       model.getDefaultParams(),
+                       {
+                               hidefilter1: '1',
+                               hidefilter2: '0',
+                               hidefilter3: '1',
+                               hidefilter4: '0',
+                               hidefilter5: '1',
+                               hidefilter6: '0',
+                               group3: 'filter8'
+                       },
+                       'Default parameters are stored properly per filter and group'
+               );
+       } );
+
        QUnit.test( 'Finding matching filters', function ( assert ) {
                var matches,
-                       definition = {
-                               group1: {
-                                       title: 'Group 1 title',
-                                       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 title',
-                                       type: 'send_unselected_if_any',
-                                       filters: [
-                                               {
-                                                       name: 'group2filter1',
-                                                       label: 'Group 2: Filter 1',
-                                                       description: 'Description of Filter 1 in Group 2'
-                                               },
-                                               {
-                                                       name: 'group2filter2',
-                                                       label: 'xGroup 2: Filter 2',
-                                                       description: 'Description of Filter 2 in Group 2'
-                                               }
-                                       ]
-                               }
-                       },
+                       definition = [ {
+                               name: 'group1',
+                               title: 'Group 1 title',
+                               type: 'send_unselected_if_any',
+                               filters: [
+                                       {
+                                               name: 'filter1',
+                                               label: 'group1filter1-label',
+                                               description: 'group1filter1-desc'
+                                       },
+                                       {
+                                               name: 'filter2',
+                                               label: 'group1filter2-label',
+                                               description: 'group1filter2-desc'
+                                       }
+                               ]
+                       }, {
+                               name: 'group2',
+                               title: 'Group 2 title',
+                               type: 'send_unselected_if_any',
+                               filters: [
+                                       {
+                                               name: 'filter1',
+                                               label: 'group2filter1-label',
+                                               description: 'group2filter1-desc'
+                                       },
+                                       {
+                                               name: 'filter2',
+                                               label: 'group2filter2-label',
+                                               description: 'group2filter2-desc'
+                                       }
+                               ]
+                       } ],
                        testCases = [
                                {
                                        query: 'group',
                                        expectedMatches: {
-                                               group1: [ 'group1filter1', 'group1filter2' ],
-                                               group2: [ 'group2filter1' ]
+                                               group1: [ 'group1__filter1', 'group1__filter2' ],
+                                               group2: [ 'group2__filter1' ]
                                        },
                                        reason: 'Finds filters starting with the query string'
                                },
                                {
                                        query: 'filter 2 in group',
                                        expectedMatches: {
-                                               group1: [ 'group1filter2' ],
-                                               group2: [ 'group2filter2' ]
+                                               group1: [ 'group1__filter2' ],
+                                               group2: [ 'group2__filter2' ]
                                        },
                                        reason: 'Finds filters containing the query string in their description'
                                },
                                {
                                        query: 'title',
                                        expectedMatches: {
-                                               group1: [ 'group1filter1', 'group1filter2' ],
-                                               group2: [ 'group2filter1', 'group2filter2' ]
+                                               group1: [ 'group1__filter1', 'group1__filter2' ],
+                                               group2: [ 'group2__filter1', 'group2__filter2' ]
                                        },
                                        reason: 'Finds filters containing the query string in their group title'
                                }
        } );
 
        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'
-                                               }
-                                       ]
-                               }
-                       },
+               var definition = [ {
+                               name: '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'
+                                       }
+                               ]
+                       }, {
+                               name: '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'
+                                       }
+                               ]
+                       }, {
+                               name: '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 );
                assert.deepEqual(
                        model.getParametersFromFilters(),
                        {
-                               hidefilter1: 0,
-                               hidefilter2: 0,
-                               hidefilter3: 0,
-                               hidefilter4: 0,
-                               hidefilter5: 0,
-                               hidefilter6: 0,
-                               group3: 'all'
+                               hidefilter1: '0',
+                               hidefilter2: '0',
+                               hidefilter3: '0',
+                               hidefilter4: '0',
+                               hidefilter5: '0',
+                               hidefilter6: '0',
+                               group3: ''
                        },
-                       'Unselected filters return all parameters falsey or \'all\'.'
+                       'Unselected filters return all parameters falsey or \'\'.'
                );
 
                // Select 1 filter
-               model.updateFilters( {
-                       hidefilter1: true,
-                       hidefilter2: false,
-                       hidefilter3: false,
-                       hidefilter4: false,
-                       hidefilter5: false,
-                       hidefilter6: false
+               model.toggleFiltersSelected( {
+                       group1__hidefilter1: true,
+                       group1__hidefilter2: false,
+                       group1__hidefilter3: false,
+                       group2__hidefilter4: false,
+                       group2__hidefilter5: false,
+                       group2__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,
+                               hidefilter1: '0',
+                               hidefilter2: '1',
+                               hidefilter3: '1',
                                // Group 2 (nothing is selected, all false)
-                               hidefilter4: 0,
-                               hidefilter5: 0,
-                               hidefilter6: 0,
-                               group3: 'all'
+                               hidefilter4: '0',
+                               hidefilter5: '0',
+                               hidefilter6: '0',
+                               group3: ''
                        },
                        '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
+               model.toggleFiltersSelected( {
+                       group1__hidefilter1: true,
+                       group1__hidefilter2: true,
+                       group1__hidefilter3: false,
+                       group2__hidefilter4: false,
+                       group2__hidefilter5: false,
+                       group2__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,
+                               hidefilter1: '0',
+                               hidefilter2: '0',
+                               hidefilter3: '1',
                                // Group 2 (nothing is selected, all false)
-                               hidefilter4: 0,
-                               hidefilter5: 0,
-                               hidefilter6: 0,
-                               group3: 'all'
+                               hidefilter4: '0',
+                               hidefilter5: '0',
+                               hidefilter6: '0',
+                               group3: ''
                        },
-                       'One filters in one "send_unselected_if_any" group returns the other parameters truthy.'
+                       'Two 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
+               model.toggleFiltersSelected( {
+                       group1__hidefilter1: true,
+                       group1__hidefilter2: true,
+                       group1__hidefilter3: true,
+                       group2__hidefilter4: false,
+                       group2__hidefilter5: false,
+                       group2__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,
+                               hidefilter1: '0',
+                               hidefilter2: '0',
+                               hidefilter3: '0',
                                // Group 2 (nothing is selected, all false)
-                               hidefilter4: 0,
-                               hidefilter5: 0,
-                               hidefilter6: 0,
-                               group3: 'all'
+                               hidefilter4: '0',
+                               hidefilter5: '0',
+                               hidefilter6: '0',
+                               group3: ''
                        },
                        '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
+               model.toggleFiltersSelected( {
+                       group3__filter7: true,
+                       group3__filter8: false,
+                       group3__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,
+                               hidefilter1: '0',
+                               hidefilter2: '0',
+                               hidefilter3: '0',
                                // Group 2 (nothing is selected, all false)
-                               hidefilter4: 0,
-                               hidefilter5: 0,
-                               hidefilter6: 0,
+                               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
+               model.toggleFiltersSelected( {
+                       group3__filter7: true,
+                       group3__filter8: true,
+                       group3__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,
+                               hidefilter1: '0',
+                               hidefilter2: '0',
+                               hidefilter3: '0',
                                // Group 2 (nothing is selected, all false)
-                               hidefilter4: 0,
-                               hidefilter5: 0,
-                               hidefilter6: 0,
+                               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
+               model.toggleFiltersSelected( {
+                       group3__filter7: true,
+                       group3__filter8: true,
+                       group3__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,
+                               hidefilter1: '0',
+                               hidefilter2: '0',
+                               hidefilter3: '0',
                                // Group 2 (nothing is selected, all false)
-                               hidefilter4: 0,
-                               hidefilter5: 0,
-                               hidefilter6: 0,
+                               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'
-                                               }
-                                       ]
+       QUnit.test( 'getParametersFromFilters (custom object)', function ( assert ) {
+               var originalState,
+                       model = new mw.rcfilters.dm.FiltersViewModel(),
+                       definition = [ {
+                               name: 'group1',
+                               title: 'Group 1',
+                               type: 'send_unselected_if_any',
+                               filters: [
+                                       { name: 'hidefilter1', label: 'Hide filter 1', description: '' },
+                                       { name: 'hidefilter2', label: 'Hide filter 2', description: '' },
+                                       { name: 'hidefilter3', label: 'Hide filter 3', description: '' }
+                               ]
+                       }, {
+                               name: 'group2',
+                               title: 'Group 2',
+                               type: 'send_unselected_if_any',
+                               filters: [
+                                       { name: 'hidefilter4', label: 'Hide filter 4', description: '' },
+                                       { name: 'hidefilter5', label: 'Hide filter 5', description: '' },
+                                       { name: 'hidefilter6', label: 'Hide filter 6', description: '' }
+                               ]
+                       }, {
+                               name: 'group3',
+                               title: 'Group 3',
+                               type: 'string_options',
+                               separator: ',',
+                               filters: [
+                                       { name: 'filter7', label: 'Hide filter 7', description: '' },
+                                       { name: 'filter8', label: 'Hide filter 8', description: '' },
+                                       { name: 'filter9', label: 'Hide filter 9', description: '' }
+                               ]
+                       } ],
+                       cases = [
+                               {
+                                       // This is mocking the cases above, both
+                                       // - 'Two filters in one "send_unselected_if_any" group returns the other parameters truthy.'
+                                       // - 'Two filters selected in "string_option" group returns those filters in the value.'
+                                       input: {
+                                               group1__hidefilter1: true,
+                                               group1__hidefilter2: true,
+                                               group1__hidefilter3: false,
+                                               group2__hidefilter4: false,
+                                               group2__hidefilter5: false,
+                                               group2__hidefilter6: false,
+                                               group3__filter7: true,
+                                               group3__filter8: true,
+                                               group3__filter9: false
+                                       },
+                                       expected: {
+                                               // 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: 'filter7,filter8'
+                                       },
+                                       msg: 'Given an explicit (complete) filter state object, the result is the same as if the object given represented the model state.'
                                },
-                               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'
-                                               }
-                                       ]
+                               {
+                                       // This is mocking case above
+                                       // - 'One filters in one "send_unselected_if_any" group returns the other parameters truthy.'
+                                       input: {
+                                               group1__hidefilter1: 1
+                                       },
+                                       expected: {
+                                               // 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: ''
+                                       },
+                                       msg: 'Given an explicit (incomplete) filter state object, the result is the same as if the object give represented the model state.'
                                }
-                       },
-                       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.initializeFilters( definition );
+               // Store original state
+               originalState = model.getSelectedState();
+
+               // Test each case
+               cases.forEach( function ( test ) {
+                       assert.deepEqual(
+                               model.getParametersFromFilters( test.input ),
+                               test.expected,
+                               test.msg
+                       );
+               } );
+
+               // After doing the above tests, make sure the actual state
+               // of the filter stayed the same
+               assert.deepEqual(
+                       model.getSelectedState(),
+                       originalState,
+                       'Running the method with external definition to parse does not actually change the state of the model'
+               );
+       } );
+
+       QUnit.test( 'getFiltersFromParameters', function ( assert ) {
+               var definition = [ {
+                               name: '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
+                                       }
+                               ]
+                       }, {
+                               name: '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'
+                                       }
+                               ]
+                       }, {
+
+                               name: 'group3',
+                               title: 'Group 3',
+                               type: 'string_options',
+                               separator: ',',
+                               default: 'filter8',
+                               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'
+                                       }
+                               ]
+                       } ],
+                       baseFilterRepresentation = {
+                               group1__hidefilter1: false,
+                               group1__hidefilter2: false,
+                               group1__hidefilter3: false,
+                               group2__hidefilter4: false,
+                               group2__hidefilter5: false,
+                               group2__hidefilter6: false,
+                               group3__filter7: false,
+                               group3__filter8: false,
+                               group3__filter9: false
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                // Empty query = only default values
                assert.deepEqual(
                        model.getFiltersFromParameters( {} ),
-                       defaultFilterRepresentation,
-                       'Empty parameter query results in filters in initial default state'
+                       baseFilterRepresentation,
+                       'Empty parameter query results in an object representing all filters set to false'
                );
 
                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"
+                       $.extend( {}, baseFilterRepresentation, {
+                               group1__hidefilter1: true, // The text is "show filter 1"
+                               group1__hidefilter2: false, // The text is "show filter 2"
+                               group1__hidefilter3: true // 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)'
                );
                                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"
+                       $.extend( {}, baseFilterRepresentation, {
+                               group1__hidefilter1: false, // The text is "show filter 1"
+                               group1__hidefilter2: false, // The text is "show filter 2"
+                               group1__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'
                );
                // 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.
+               // This means that the two calls to toggleFiltersSelected() 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.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                hidefilter1: '1'
                        } )
                );
 
-               model.updateFilters(
+               model.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                hidefilter6: '1'
                        } )
                );
 
-               // The result here is ignoring the first updateFilters call
-               // We should receive default values + hidefilter6 as false
+               // The result here is ignoring the first toggleFiltersSelected call
                assert.deepEqual(
                        model.getSelectedState(),
-                       $.extend( {}, defaultFilterRepresentation, {
-                               hidefilter5: false,
-                               hidefilter6: false
+                       $.extend( {}, baseFilterRepresentation, {
+                               group2__hidefilter4: true,
+                               group2__hidefilter5: true,
+                               group2__hidefilter6: false
                        } ),
                        'getFiltersFromParameters does not care about previous or existing state.'
                );
                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.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                group3: 'filter7'
                        } )
                );
                assert.deepEqual(
                        model.getSelectedState(),
-                       $.extend( {}, defaultFilterRepresentation, {
-                               filter7: true,
-                               filter8: false,
-                               filter9: false
+                       $.extend( {}, baseFilterRepresentation, {
+                               group3__filter7: true,
+                               group3__filter8: false,
+                               group3__filter9: false
                        } ),
                        'A \'string_options\' parameter containing 1 value, results in the corresponding filter as checked'
                );
 
-               model.updateFilters(
+               model.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                group3: 'filter7,filter8'
                        } )
                );
                assert.deepEqual(
                        model.getSelectedState(),
-                       $.extend( {}, defaultFilterRepresentation, {
-                               filter7: true,
-                               filter8: true,
-                               filter9: false
+                       $.extend( {}, baseFilterRepresentation, {
+                               group3__filter7: true,
+                               group3__filter8: true,
+                               group3__filter9: false
                        } ),
                        'A \'string_options\' parameter containing 2 values, results in both corresponding filters as checked'
                );
 
-               model.updateFilters(
+               model.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                group3: 'filter7,filter8,filter9'
                        } )
                );
                assert.deepEqual(
                        model.getSelectedState(),
-                       $.extend( {}, defaultFilterRepresentation, {
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
+                       $.extend( {}, baseFilterRepresentation, {
+                               group3__filter7: true,
+                               group3__filter8: true,
+                               group3__filter9: true
                        } ),
-                       'A \'string_options\' parameter containing all values, results in all filters of the group as unchecked.'
+                       'A \'string_options\' parameter containing all values, results in all filters of the group as checked.'
                );
 
-               model.updateFilters(
+               model.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                group3: 'filter7,all,filter9'
                        } )
                );
                assert.deepEqual(
                        model.getSelectedState(),
-                       $.extend( {}, defaultFilterRepresentation, {
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
+                       $.extend( {}, baseFilterRepresentation, {
+                               group3__filter7: true,
+                               group3__filter8: true,
+                               group3__filter9: true
                        } ),
-                       'A \'string_options\' parameter containing the value \'all\', results in all filters of the group as unchecked.'
+                       'A \'string_options\' parameter containing the value \'all\', results in all filters of the group as checked.'
                );
 
-               model.updateFilters(
+               model.toggleFiltersSelected(
                        model.getFiltersFromParameters( {
                                group3: 'filter7,foo,filter9'
                        } )
                );
                assert.deepEqual(
                        model.getSelectedState(),
-                       $.extend( {}, defaultFilterRepresentation, {
-                               filter7: true,
-                               filter8: false,
-                               filter9: true
+                       $.extend( {}, baseFilterRepresentation, {
+                               group3__filter7: true,
+                               group3__filter8: false,
+                               group3__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'
-                                               }
-                                       ]
-                               }
-                       },
+               var definition = [ {
+                               name: '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 );
                );
        } );
 
-       QUnit.test( 'setFiltersToDefaults', 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'
-                                               }
-                                       ]
-                               }
-                       },
-                       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
-                       },
-                       model = new mw.rcfilters.dm.FiltersViewModel();
-
-               model.initializeFilters( definition );
-
-               assert.deepEqual(
-                       model.getSelectedState(),
-                       {
-                               hidefilter1: false,
-                               hidefilter2: false,
-                               hidefilter3: false,
-                               hidefilter4: false,
-                               hidefilter5: false,
-                               hidefilter6: false
-                       },
-                       'Initial state: default filters are not selected (controller selects defaults explicitly).'
-               );
-
-               model.updateFilters( {
-                       hidefilter1: false,
-                       hidefilter3: false
-               } );
-
-               model.setFiltersToDefaults();
-
-               assert.deepEqual(
-                       model.getSelectedState(),
-                       defaultFilterRepresentation,
-                       'Changing values of filters and then returning to defaults still results in default filters being selected.'
-               );
-       } );
-
        QUnit.test( 'Filter interaction: subsets', 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',
-                                                       subset: [ 'filter2', 'filter5' ]
-                                               },
-                                               {
-                                                       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'
-                                               }
-                                       ]
-                               },
-                               group2: {
-                                       title: 'Group 2',
-                                       type: 'send_unselected_if_any',
-                                       filters: [
-                                               {
-                                                       name: 'filter4',
-                                                       label: 'Show filter 4',
-                                                       description: 'Description of Filter 1 in Group 2',
-                                                       subset: [ 'filter3', 'filter5' ]
-                                               },
-                                               {
-                                                       name: 'filter5',
-                                                       label: 'Show filter 5',
-                                                       description: 'Description of Filter 2 in Group 2'
-                                               },
-                                               {
-                                                       name: 'filter6',
-                                                       label: 'Show filter 6',
-                                                       description: 'Description of Filter 3 in Group 2'
-                                               }
-                                       ]
-                               }
-                       },
+               var definition = [ {
+                               name: 'group1',
+                               title: 'Group 1',
+                               type: 'string_options',
+                               filters: [
+                                       {
+                                               name: 'filter1',
+                                               label: 'Show filter 1',
+                                               description: 'Description of Filter 1 in Group 1',
+                                               subset: [
+                                                       {
+                                                               group: 'group1',
+                                                               filter: 'filter2'
+                                                       },
+                                                       {
+                                                               group: 'group1',
+                                                               filter: 'filter3'
+                                                       }
+                                               ]
+                                       },
+                                       {
+                                               name: 'filter2',
+                                               label: 'Show filter 2',
+                                               description: 'Description of Filter 2 in Group 1',
+                                               subset: [
+                                                       {
+                                                               group: 'group1',
+                                                               filter: 'filter3'
+                                                       }
+                                               ]
+                                       },
+                                       {
+                                               name: 'filter3',
+                                               label: 'Show filter 3',
+                                               description: 'Description of Filter 3 in Group 1'
+                                       }
+                               ]
+                       } ],
                        baseFullState = {
-                               filter1: { selected: false, conflicted: false, included: false },
-                               filter2: { selected: false, conflicted: false, included: false },
-                               filter3: { selected: false, conflicted: false, included: false },
-                               filter4: { selected: false, conflicted: false, included: false },
-                               filter5: { selected: false, conflicted: false, included: false },
-                               filter6: { selected: false, conflicted: false, included: false }
+                               group1__filter1: { selected: false, conflicted: false, included: false },
+                               group1__filter2: { selected: false, conflicted: false, included: false },
+                               group1__filter3: { selected: false, conflicted: false, included: false }
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                model.initializeFilters( definition );
                // Select a filter that has subset with another filter
-               model.updateFilters( {
-                       filter1: true
+               model.toggleFiltersSelected( {
+                       group1__filter1: true
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true },
-                               filter2: { included: true },
-                               filter5: { included: true }
+                               group1__filter1: { selected: true },
+                               group1__filter2: { included: true },
+                               group1__filter3: { included: true }
                        } ),
                        'Filters with subsets are represented in the model.'
                );
 
                // Select another filter that has a subset with the same previous filter
-               model.updateFilters( {
-                       filter4: true
+               model.toggleFiltersSelected( {
+                       group1__filter2: true
                } );
-               model.reassessFilterInteractions( model.getItemByName( 'filter4' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'filter2' ) );
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true },
-                               filter2: { included: true },
-                               filter3: { included: true },
-                               filter4: { selected: true },
-                               filter5: { included: true }
+                               group1__filter1: { selected: true },
+                               group1__filter2: { selected: true, included: true },
+                               group1__filter3: { included: true }
                        } ),
                        'Filters that have multiple subsets are represented.'
                );
 
-               // Remove one filter (but leave the other) that affects filter2
-               model.updateFilters( {
-                       filter1: false
+               // Remove one filter (but leave the other) that affects filter3
+               model.toggleFiltersSelected( {
+                       group1__filter1: false
                } );
-               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { included: false },
-                               filter3: { included: true },
-                               filter4: { selected: true },
-                               filter5: { included: true }
+                               group1__filter2: { selected: true, included: false },
+                               group1__filter3: { included: true }
                        } ),
                        'Removing a filter only un-includes its subset if there is no other filter affecting.'
                );
 
-               model.updateFilters( {
-                       filter4: false
+               model.toggleFiltersSelected( {
+                       group1__filter2: false
                } );
-               model.reassessFilterInteractions( model.getItemByName( 'filter4' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
                assert.deepEqual(
                        model.getFullState(),
                        baseFullState,
        } );
 
        QUnit.test( 'Filter interaction: full coverage', function ( assert ) {
-               var definition = {
-                               group1: {
-                                       title: 'Group 1',
-                                       type: 'string_options',
-                                       fullCoverage: false,
-                                       filters: [
-                                               { name: 'filter1' },
-                                               { name: 'filter2' },
-                                               { name: 'filter3' }
-                                       ]
-                               },
-                               group2: {
-                                       title: 'Group 2',
-                                       type: 'send_unselected_if_any',
-                                       fullCoverage: true,
-                                       filters: [
-                                               { name: 'filter4' },
-                                               { name: 'filter5' },
-                                               { name: 'filter6' }
-                                       ]
-                               }
-                       },
+               var definition = [ {
+                               name: 'group1',
+                               title: 'Group 1',
+                               type: 'string_options',
+                               fullCoverage: false,
+                               filters: [
+                                       { name: 'filter1', label: '1', description: '1' },
+                                       { name: 'filter2', label: '2', description: '2' },
+                                       { name: 'filter3', label: '3', description: '3' }
+                               ]
+                       }, {
+                               name: 'group2',
+                               title: 'Group 2',
+                               type: 'send_unselected_if_any',
+                               fullCoverage: true,
+                               filters: [
+                                       { name: 'filter4', label: '4', description: '4' },
+                                       { name: 'filter5', label: '5', description: '5' },
+                                       { name: 'filter6', label: '6', description: '6' }
+                               ]
+                       } ],
                        model = new mw.rcfilters.dm.FiltersViewModel(),
                        isCapsuleItemMuted = function ( filterName ) {
                                var itemModel = model.getItemByName( filterName ),
                        },
                        getCurrentItemsMutedState = function () {
                                return {
-                                       filter1: isCapsuleItemMuted( 'filter1' ),
-                                       filter2: isCapsuleItemMuted( 'filter2' ),
-                                       filter3: isCapsuleItemMuted( 'filter3' ),
-                                       filter4: isCapsuleItemMuted( 'filter4' ),
-                                       filter5: isCapsuleItemMuted( 'filter5' ),
-                                       filter6: isCapsuleItemMuted( 'filter6' )
+                                       group1__filter1: isCapsuleItemMuted( 'group1__filter1' ),
+                                       group1__filter2: isCapsuleItemMuted( 'group1__filter2' ),
+                                       group1__filter3: isCapsuleItemMuted( 'group1__filter3' ),
+                                       group2__filter4: isCapsuleItemMuted( 'group2__filter4' ),
+                                       group2__filter5: isCapsuleItemMuted( 'group2__filter5' ),
+                                       group2__filter6: isCapsuleItemMuted( 'group2__filter6' )
                                };
                        },
                        baseMuteState = {
-                               filter1: false,
-                               filter2: false,
-                               filter3: false,
-                               filter4: false,
-                               filter5: false,
-                               filter6: false
+                               group1__filter1: false,
+                               group1__filter2: false,
+                               group1__filter3: false,
+                               group2__filter4: false,
+                               group2__filter5: false,
+                               group2__filter6: false
                        };
 
                model.initializeFilters( definition );
                );
 
                // Select most (but not all) items in each group
-               model.updateFilters( {
-                       filter1: true,
-                       filter2: true,
-                       filter4: true,
-                       filter5: true
+               model.toggleFiltersSelected( {
+                       group1__filter1: true,
+                       group1__filter2: true,
+                       group2__filter4: true,
+                       group2__filter5: true
                } );
 
                // Both groups have multiple (but not all) items selected, all items are non-muted
                );
 
                // Select all items in 'fullCoverage' group (group2)
-               model.updateFilters( {
-                       filter6: true
+               model.toggleFiltersSelected( {
+                       group2__filter6: true
                } );
 
                // Group2 (full coverage) has all items selected, all its items are muted
                assert.deepEqual(
                        getCurrentItemsMutedState(),
                        $.extend( {}, baseMuteState, {
-                               filter4: true,
-                               filter5: true,
-                               filter6: true
+                               group2__filter4: true,
+                               group2__filter5: true,
+                               group2__filter6: true
                        } ),
                        'All items in \'full coverage\' group are selected - all items in the group are muted'
                );
 
                // Select all items in non 'fullCoverage' group (group1)
-               model.updateFilters( {
-                       filter3: true
+               model.toggleFiltersSelected( {
+                       group1__filter3: true
                } );
 
                // Group1 (full coverage) has all items selected, no items in it are muted (non full coverage)
                assert.deepEqual(
                        getCurrentItemsMutedState(),
                        $.extend( {}, baseMuteState, {
-                               filter4: true,
-                               filter5: true,
-                               filter6: true
+                               group2__filter4: true,
+                               group2__filter5: true,
+                               group2__filter6: true
                        } ),
                        'All items in a non \'full coverage\' group are selected - none of the items in the group are muted'
                );
 
                // Uncheck an item from each group
-               model.updateFilters( {
-                       filter3: false,
-                       filter5: false
+               model.toggleFiltersSelected( {
+                       group1__filter3: false,
+                       group2__filter5: false
                } );
                assert.deepEqual(
                        getCurrentItemsMutedState(),
        } );
 
        QUnit.test( 'Filter interaction: conflicts', function ( assert ) {
-               var definition = {
-                               group1: {
-                                       title: 'Group 1',
-                                       type: 'string_options',
-                                       filters: [
-                                               {
-                                                       name: 'filter1',
-                                                       conflicts: [ 'filter2', 'filter4' ]
-                                               },
-                                               {
-                                                       name: 'filter2',
-                                                       conflicts: [ 'filter6' ]
-                                               },
-                                               {
-                                                       name: 'filter3'
-                                               }
-                                       ]
-                               },
-                               group2: {
-                                       title: 'Group 2',
-                                       type: 'send_unselected_if_any',
-                                       filters: [
-                                               {
-                                                       name: 'filter4'
-                                               },
-                                               {
-                                                       name: 'filter5',
-                                                       conflicts: [ 'filter3' ]
-                                               },
-                                               {
-                                                       name: 'filter6'
-                                               }
-                                       ]
-                               }
-                       },
+               var definition = [ {
+                               name: 'group1',
+                               title: 'Group 1',
+                               type: 'string_options',
+                               filters: [
+                                       {
+                                               name: 'filter1',
+                                               label: '1',
+                                               description: '1',
+                                               conflicts: [ { group: 'group2' } ]
+                                       },
+                                       {
+                                               name: 'filter2',
+                                               label: '2',
+                                               description: '2',
+                                               conflicts: [ { group: 'group2', filter: 'filter6' } ]
+                                       },
+                                       {
+                                               name: 'filter3',
+                                               label: '3',
+                                               description: '3'
+                                       }
+                               ]
+                       }, {
+                               name: 'group2',
+                               title: 'Group 2',
+                               type: 'send_unselected_if_any',
+                               conflicts: [ { group: 'group1', filter: 'filter1' } ],
+                               filters: [
+                                       {
+                                               name: 'filter4',
+                                               label: '1',
+                                               description: '1'
+                                       },
+                                       {
+                                               name: 'filter5',
+                                               label: '5',
+                                               description: '5'
+                                       },
+                                       {
+                                               name: 'filter6',
+                                               label: '6',
+                                               description: '6',
+                                               conflicts: [ { group: 'group1', filter: 'filter2' } ]
+                                       }
+                               ]
+                       } ],
                        baseFullState = {
-                               filter1: { selected: false, conflicted: false, included: false },
-                               filter2: { selected: false, conflicted: false, included: false },
-                               filter3: { selected: false, conflicted: false, included: false },
-                               filter4: { selected: false, conflicted: false, included: false },
-                               filter5: { selected: false, conflicted: false, included: false },
-                               filter6: { selected: false, conflicted: false, included: false }
+                               group1__filter1: { selected: false, conflicted: false, included: false },
+                               group1__filter2: { selected: false, conflicted: false, included: false },
+                               group1__filter3: { selected: false, conflicted: false, included: false },
+                               group2__filter4: { selected: false, conflicted: false, included: false },
+                               group2__filter5: { selected: false, conflicted: false, included: false },
+                               group2__filter6: { selected: false, conflicted: false, included: false }
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                        'Initial state: no conflicts because no selections.'
                );
 
-               // Select a filter that has a conflict with another
-               model.updateFilters( {
-                       filter1: true // conflicts: filter2, filter4
+               // Select a filter that has a conflict with an entire group
+               model.toggleFiltersSelected( {
+                       group1__filter1: true // conflicts: entire of group 2 ( filter4, filter5, filter6)
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true },
-                               filter2: { conflicted: true },
-                               filter4: { conflicted: true }
+                               group1__filter1: { selected: true },
+                               group2__filter4: { conflicted: true },
+                               group2__filter5: { conflicted: true },
+                               group2__filter6: { conflicted: true }
                        } ),
-                       'Selecting a filter set its conflicts list as "conflicted".'
+                       'Selecting a filter that conflicts with a group sets all the conflicted group items as "conflicted".'
                );
 
                // Select one of the conflicts (both filters are now conflicted and selected)
-               model.updateFilters( {
-                       filter4: true // conflicts: filter 1
+               model.toggleFiltersSelected( {
+                       group2__filter4: true // conflicts: filter 1
+               } );
+               model.reassessFilterInteractions( model.getItemByName( 'group2__filter4' ) );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               group1__filter1: { selected: true, conflicted: true },
+                               group2__filter4: { selected: true, conflicted: true },
+                               group2__filter5: { conflicted: true },
+                               group2__filter6: { conflicted: true }
+                       } ),
+                       'Selecting a conflicting filter inside a group, sets both sides to conflicted and selected.'
+               );
+
+               // Reset
+               model = new mw.rcfilters.dm.FiltersViewModel();
+               model.initializeFilters( definition );
+
+               // Select a filter that has a conflict with a specific filter
+               model.toggleFiltersSelected( {
+                       group1__filter2: true // conflicts: filter6
+               } );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               group1__filter2: { selected: true },
+                               group2__filter6: { conflicted: true }
+                       } ),
+                       'Selecting a filter that conflicts with another filter sets the other as "conflicted".'
+               );
+
+               // Select the conflicting filter
+               model.toggleFiltersSelected( {
+                       group2__filter6: true // conflicts: filter2
+               } );
+
+               model.reassessFilterInteractions( model.getItemByName( 'group2__filter6' ) );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               group1__filter2: { selected: true, conflicted: true },
+                               group2__filter6: { selected: true, conflicted: true },
+                               // This is added to the conflicts because filter6 is part of group2,
+                               // who is in conflict with filter1; note that filter2 also conflicts
+                               // with filter6 which means that filter1 conflicts with filter6 (because it's in group2)
+                               // and also because its **own sibling** (filter2) is **also** in conflict with the
+                               // selected items in group2 (filter6)
+                               group1__filter1: { conflicted: true }
+                       } ),
+                       'Selecting a conflicting filter with an individual filter, sets both sides to conflicted and selected.'
+               );
+
+               // Now choose a non-conflicting filter from the group
+               model.toggleFiltersSelected( {
+                       group2__filter5: true
+               } );
+
+               model.reassessFilterInteractions( model.getItemByName( 'group2__filter5' ) );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               group1__filter2: { selected: true },
+                               group2__filter6: { selected: true },
+                               group2__filter5: { selected: true }
+                               // Filter6 and filter1 are no longer in conflict because
+                               // filter5, while it is in conflict with filter1, it is
+                               // not in conflict with filter2 - and since filter2 is
+                               // selected, it removes the conflict bidirectionally
+                       } ),
+                       'Selecting a non-conflicting filter within the group of a conflicting filter removes the conflicts.'
+               );
+
+               // Followup on the previous test, unselect filter2 so filter1
+               // is now the only one selected in its own group, and since
+               // it is in conflict with the entire of group2, it means
+               // filter1 is once again conflicted
+               model.toggleFiltersSelected( {
+                       group1__filter2: false
+               } );
+
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               group1__filter1: { conflicted: true },
+                               group2__filter6: { selected: true },
+                               group2__filter5: { selected: true }
+                       } ),
+                       'Unselecting an item that did not conflict returns the conflict state.'
+               );
+
+               // Followup #2: Now actually select filter1, and make everything conflicted
+               model.toggleFiltersSelected( {
+                       group1__filter1: true
+               } );
+
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
+
+               assert.deepEqual(
+                       model.getFullState(),
+                       $.extend( true, {}, baseFullState, {
+                               group1__filter1: { selected: true, conflicted: true },
+                               group2__filter6: { selected: true, conflicted: true },
+                               group2__filter5: { selected: true, conflicted: true },
+                               group2__filter4: { conflicted: true } // Not selected but conflicted because it's in group2
+                       } ),
+                       'Selecting an item that conflicts with a whole group makes all selections in that group conflicted.'
+               );
+
+               /* Simple case */
+               // Reset
+               model = new mw.rcfilters.dm.FiltersViewModel();
+               model.initializeFilters( definition );
+
+               // Select a filter that has a conflict with a specific filter
+               model.toggleFiltersSelected( {
+                       group1__filter2: true // conflicts: filter6
                } );
-               model.reassessFilterInteractions( model.getItemByName( 'filter4' ) );
+
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true, conflicted: true },
-                               filter2: { conflicted: true },
-                               filter4: { selected: true, conflicted: true }
+                               group1__filter2: { selected: true },
+                               group2__filter6: { conflicted: true }
                        } ),
-                       'Selecting a conflicting filter sets both sides to conflicted and selected.'
+                       'Simple case: Selecting a filter that conflicts with another filter sets the other as "conflicted".'
                );
 
-               // Select another filter from filter4 group, meaning:
-               // now filter1 no longer conflicts with filter4
-               model.updateFilters( {
-                       filter6: true // conflicts: filter2
+               model.toggleFiltersSelected( {
+                       group1__filter3: true // conflicts: filter6
                } );
-               model.reassessFilterInteractions( model.getItemByName( 'filter6' ) );
+
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter3' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true, conflicted: false }, // No longer conflicts (filter4 is not the only in the group)
-                               filter2: { conflicted: true }, // While not selected, still in conflict with filter1, which is selected
-                               filter4: { selected: true, conflicted: false }, // No longer conflicts with filter1
-                               filter6: { selected: true, conflicted: false }
+                               group1__filter2: { selected: true },
+                               group1__filter3: { selected: true }
                        } ),
-                       'Selecting a non-conflicting filter from a conflicting group removes the conflict'
+                       'Simple case: Selecting a filter that is not in conflict removes the conflict.'
                );
+
        } );
 
        QUnit.test( 'Filter highlights', function ( assert ) {
-               var definition = {
-                               group1: {
-                                       title: 'Group 1',
-                                       type: 'string_options',
-                                       filters: [
-                                               { name: 'filter1', class: 'class1' },
-                                               { name: 'filter2', class: 'class2' },
-                                               { name: 'filter3', class: 'class3' },
-                                               { name: 'filter4', class: 'class4' },
-                                               { name: 'filter5', class: 'class5' },
-                                               { name: 'filter6' }
-                                       ]
-                               }
-                       },
+               var definition = [ {
+                               name: 'group1',
+                               title: 'Group 1',
+                               type: 'string_options',
+                               filters: [
+                                       { name: 'filter1', cssClass: 'class1', label: '1', description: '1' },
+                                       { name: 'filter2', cssClass: 'class2', label: '2', description: '2' },
+                                       { name: 'filter3', cssClass: 'class3', label: '3', description: '3' },
+                                       { name: 'filter4', cssClass: 'class4', label: '4', description: '4' },
+                                       { name: 'filter5', cssClass: 'class5', label: '5', description: '5' },
+                                       { name: 'filter6', label: '6', description: '6' }
+                               ]
+                       } ],
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                model.initializeFilters( definition );
                        'Highlight is enabled on toggle.'
                );
 
-               model.setHighlightColor( 'filter1', 'color1' );
-               model.setHighlightColor( 'filter2', 'color2' );
+               model.setHighlightColor( 'group1__filter1', 'color1' );
+               model.setHighlightColor( 'group1__filter2', 'color2' );
 
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter1',
-                               'filter2'
+                               'group1__filter1',
+                               'group1__filter2'
                        ],
                        'Highlighted items are highlighted.'
                );
 
                assert.equal(
-                       model.getItemByName( 'filter1' ).getHighlightColor(),
+                       model.getItemByName( 'group1__filter1' ).getHighlightColor(),
                        'color1',
                        'Item highlight color is set.'
                );
 
-               model.setHighlightColor( 'filter1', 'color1changed' );
+               model.setHighlightColor( 'group1__filter1', 'color1changed' );
                assert.equal(
-                       model.getItemByName( 'filter1' ).getHighlightColor(),
+                       model.getItemByName( 'group1__filter1' ).getHighlightColor(),
                        'color1changed',
                        'Item highlight color is changed on setHighlightColor.'
                );
 
-               model.clearHighlightColor( 'filter1' );
+               model.clearHighlightColor( 'group1__filter1' );
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter2'
+                               'group1__filter2'
                        ],
                        'Clear highlight from an item results in the item no longer being highlighted.'
                );
                model = new mw.rcfilters.dm.FiltersViewModel();
                model.initializeFilters( definition );
 
-               model.setHighlightColor( 'filter1', 'color1' );
-               model.setHighlightColor( 'filter2', 'color2' );
-               model.setHighlightColor( 'filter3', 'color3' );
+               model.setHighlightColor( 'group1__filter1', 'color1' );
+               model.setHighlightColor( 'group1__filter2', 'color2' );
+               model.setHighlightColor( 'group1__filter3', 'color3' );
 
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter1',
-                               'filter2',
-                               'filter3'
+                               'group1__filter1',
+                               'group1__filter2',
+                               'group1__filter3'
                        ],
                        'Even if highlights are not enabled, the items remember their highlight state'
                        // NOTE: When actually displaying the highlights, the UI checks whether
                model = new mw.rcfilters.dm.FiltersViewModel();
                model.initializeFilters( definition );
 
-               model.setHighlightColor( 'filter1', 'color1' );
-               model.setHighlightColor( 'filter6', 'color6' );
+               model.setHighlightColor( 'group1__filter1', 'color1' );
+               model.setHighlightColor( 'group1__filter6', 'color6' );
 
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter1'
+                               'group1__filter1'
                        ],
                        'Items without a specified class identifier are not highlighted.'
                );
index 1bc4c06..d6fe744 100644 (file)
                        title = mw.Title.newFromImg( { src: thisCase.url } );
 
                        if ( thisCase.nameText !== undefined ) {
-                               prefix = '[' + thisCase.typeOfUrl + ' URL' + '] ';
+                               prefix = '[' + thisCase.typeOfUrl + ' URL] ';
 
                                assert.notStrictEqual( title, null, prefix + 'Parses successfully' );
                                assert.equal( title.getNameText(), thisCase.nameText, prefix + 'Filename matches original' );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js
new file mode 100644 (file)
index 0000000..1f7a5ec
--- /dev/null
@@ -0,0 +1,74 @@
+( function ( mw ) {
+
+       QUnit.module( 'mediawiki.inspect' );
+
+       QUnit.test( '.getModuleSize() - scripts', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.script',
+                       function () { 'example'; }
+               );
+
+               return mw.loader.using( 'test.inspect.script' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.script' ),
+                               // name, script function
+                               43,
+                               'test.inspect.script'
+                       );
+               } );
+       } );
+
+       QUnit.test( '.getModuleSize() - scripts, styles', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.both',
+                       function () { 'example'; },
+                       { css: [ '.example {}' ] }
+               );
+
+               return mw.loader.using( 'test.inspect.both' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.both' ),
+                               // name, script function, styles object
+                               64,
+                               'test.inspect.both'
+                       );
+               } );
+       } );
+
+       QUnit.test( '.getModuleSize() - scripts, messages', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.scriptmsg',
+                       function () { 'example'; },
+                       {},
+                       { example: 'Hello world.' }
+               );
+
+               return mw.loader.using( 'test.inspect.scriptmsg' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.scriptmsg' ),
+                               // name, script function, empty styles object, messages object
+                               74,
+                               'test.inspect.scriptmsg'
+                       );
+               } );
+       } );
+
+       QUnit.test( '.getModuleSize() - scripts, styles, messages, templates', function ( assert ) {
+               mw.loader.implement(
+                       'test.inspect.all',
+                       function () { 'example'; },
+                       { css: [ '.example {}' ] },
+                       { example: 'Hello world.' },
+                       { 'example.html': '<p>Hello world.<p>' }
+               );
+
+               return mw.loader.using( 'test.inspect.all' ).then( function () {
+                       assert.equal(
+                               mw.inspect.getModuleSize( 'test.inspect.all' ),
+                               // name, script function, styles object, messages object, templates object
+                               126,
+                               'test.inspect.all'
+                       );
+               } );
+       } );
+}( mediaWiki ) );
index 3b549bd..3c77a00 100644 (file)
                );
        } );
 
+       QUnit.test( 'setParserDefaults', function ( assert ) {
+               mw.jqueryMsg.setParserDefaults( {
+                       magic: {
+                               FOO: 'foo',
+                               BAR: 'bar'
+                       }
+               } );
+
+               assert.deepEqual(
+                       mw.jqueryMsg.getParserDefaults().magic,
+                       {
+                               FOO: 'foo',
+                               BAR: 'bar'
+                       },
+                       'setParserDefaults is shallow by default'
+               );
+
+               mw.jqueryMsg.setParserDefaults(
+                       {
+                               magic: {
+                                       BAZ: 'baz'
+                               }
+                       },
+                       true
+               );
+
+               assert.deepEqual(
+                       mw.jqueryMsg.getParserDefaults().magic,
+                       {
+                               FOO: 'foo',
+                               BAR: 'bar',
+                               BAZ: 'baz'
+                       },
+                       'setParserDefaults is deep if requested'
+               );
+       } );
 }( mediaWiki, jQuery ) );
index 6f9af76..06ea9bc 100644 (file)
@@ -5,6 +5,11 @@
                },
                teardown: function () {
                        mw.loader.store.enabled = false;
+                       // Teardown for StringSet shim test
+                       if ( this.nativeSet ) {
+                               window.Set = this.nativeSet;
+                               mw.redefineFallbacksForTest();
+                       }
                }
        } ) );
 
                function isCssImportApplied() {
                        // Trigger reflow, repaint, redraw, whatever (cross-browser)
                        $element.css( 'height' );
+                       // eslint-disable-next-line no-unused-expressions
                        el.innerHTML;
                        el.className = el.className;
+                       // eslint-disable-next-line no-unused-expressions
                        document.documentElement.clientHeight;
 
                        return $element.css( prop ) === val;
                } );
        } );
 
-       QUnit.test( '.using() Error: Circular dependency', function ( assert ) {
+       // Covers mw.loader#sortDependencies (with native Set if available)
+       QUnit.test( '.using() Error: Circular dependency [StringSet default]', function ( assert ) {
                var done = assert.async();
 
                mw.loader.register( [
                .always( done );
        } );
 
+       // @covers mw.loader#sortDependencies (with fallback shim)
+       QUnit.test( '.using() Error: Circular dependency [StringSet shim]', function ( assert ) {
+               var done = assert.async();
+
+               if ( !window.Set ) {
+                       assert.expect( 0 );
+                       done();
+                       return;
+               }
+
+               this.nativeSet = window.Set;
+               window.Set = undefined;
+               mw.redefineFallbacksForTest();
+
+               mw.loader.register( [
+                       [ 'test.shim.circle1', '0', [ 'test.shim.circle2' ] ],
+                       [ 'test.shim.circle2', '0', [ 'test.shim.circle3' ] ],
+                       [ 'test.shim.circle3', '0', [ 'test.shim.circle1' ] ]
+               ] );
+               mw.loader.using( 'test.shim.circle3' ).then(
+                       function done() {
+                               assert.ok( false, 'Unexpected resolution, expected error.' );
+                       },
+                       function fail( e ) {
+                               assert.ok( /Circular/.test( String( e ) ), 'Detect circular dependency' );
+                       }
+               )
+               .always( done );
+       } );
+
        QUnit.test( '.load() - Error: Circular dependency', function ( assert ) {
                mw.loader.register( [
                        [ 'test.circleA', '0', [ 'test.circleB' ] ],
                                assert.ok( true, 'QUnit expected() count dummy' );
                        },
                        function ( e, dependencies ) {
-                               assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
+                               assert.strictEqual( Array.isArray( dependencies ), true, 'Expected array of dependencies' );
                                assert.deepEqual( dependencies, [ 'test.module7' ], 'Error callback called with module test.module7' );
                        }
                );
                                assert.ok( true, 'QUnit expected() count dummy' );
                        },
                        function ( e, dependencies ) {
-                               assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
+                               assert.strictEqual( Array.isArray( dependencies ), true, 'Expected array of dependencies' );
                                dependencies.sort();
                                assert.deepEqual(
                                        dependencies,
index d3e73ae..119222a 100644 (file)
                assert.strictEqual( conf.set( arry, 'Arry' ), false, 'Map.set returns boolean false if key was invalid (Array)' );
                assert.strictEqual( conf.set( nummy, 'Nummy' ), false, 'Map.set returns boolean false if key was invalid (Number)' );
 
-               assert.strictEqual( conf.get( funky ), null, 'Map.get ruturns null if selection was invalid (Function)' );
-               assert.strictEqual( conf.get( nummy ), null, 'Map.get ruturns null if selection was invalid (Number)' );
-
                conf.set( String( nummy ), 'I used to be a number' );
 
+               assert.strictEqual( conf.get( funky ), null, 'Map.get returns null if selection was invalid (Function)' );
+               assert.strictEqual( conf.get( nummy ), null, 'Map.get returns null if selection was invalid (Number)' );
+               assert.propEqual( conf.get( [ nummy ] ), {}, 'Map.get returns null if selection was invalid (multiple)' );
+               assert.strictEqual( conf.get( nummy, false ), false, 'Map.get returns custom fallback for invalid selection' );
+
                assert.strictEqual( conf.exists( 'doesNotExist' ), false, 'Map.exists where property does not exist' );
                assert.strictEqual( conf.exists( 'undef' ), true, 'Map.exists where value is `undefined`' );
-               assert.strictEqual( conf.exists( nummy ), false, 'Map.exists where key is invalid but looks like an existing key' );
+               assert.strictEqual( conf.exists( [ 'undef', 'example' ] ), true, 'Map.exists with multiple keys (all existing)' );
+               assert.strictEqual( conf.exists( [ 'example', 'doesNotExist' ] ), false, 'Map.exists with multiple keys (some non-existing)' );
+               assert.strictEqual( conf.exists( [] ), true, 'Map.exists with no keys' );
+               assert.strictEqual( conf.exists( nummy ), false, 'Map.exists with invalid key that looks like an existing key' );
+               assert.strictEqual( conf.exists( [ nummy ] ), false, 'Map.exists with invalid key that looks like an existing key' );
 
                // Multiple values at once
+               conf = new mw.Map();
                someValues = {
                        foo: 'bar',
                        lorem: 'ipsum',
                        notExist: null
                }, 'Map.get return includes keys that were not found as null values' );
 
-               // Interacting with globals and accessing the values object
-               this.suppressWarnings();
-               assert.strictEqual( conf.get(), conf.values, 'Map.get returns the entire values object by reference (if called without arguments)' );
-               this.restoreWarnings();
+               assert.propEqual( conf.values, someValues, 'Map.values is an internal object with all values (exposed for convenience)' );
+               assert.propEqual( conf.get(), someValues, 'Map.get() returns an object with all values' );
 
+               // Interacting with globals
                conf.set( 'globalMapChecker', 'Hi' );
 
                assert.ok( ( 'globalMapChecker' in window ) === false, 'Map does not its store values in the window object by default' );
index 297f0fd..8786993 100644 (file)
@@ -7,21 +7,22 @@
        } ) );
 
        QUnit.asyncTest( 'toggleToc', function ( assert ) {
-               var tocHtml, $toggleLink, $tocList;
+               var tocHtml, $toc, $toggleLink, $tocList;
 
-               assert.strictEqual( $( '#toc' ).length, 0, 'There is no table of contents on the page at the beginning' );
+               assert.strictEqual( $( '.toc' ).length, 0, 'There is no table of contents on the page at the beginning' );
 
                tocHtml = '<div id="toc" class="toc">' +
-                       '<div id="toctitle">' +
+                       '<div id="toctitle" class="toctitle">' +
                        '<h2>Contents</h2>' +
                        '</div>' +
                        '<ul><li></li></ul>' +
                        '</div>';
-               $( tocHtml ).appendTo( '#qunit-fixture' );
+               $toc = $( tocHtml );
+               $( '#qunit-fixture' ).append( $toc );
                mw.hook( 'wikipage.content' ).fire( $( '#qunit-fixture' ) );
 
-               $tocList = $( '#toc ul:first' );
-               $toggleLink = $( '#togglelink' );
+               $tocList = $toc.find( 'ul:first' );
+               $toggleLink = $toc.find( '.togglelink' );
 
                assert.strictEqual( $toggleLink.length, 1, 'Toggle link is added to the table of contents' );
 
index 7f6efa0..bc12642 100644 (file)
 
                result2 = mw.user.generateRandomSessionId();
                assert.notEqual( result, result2, 'different when called multiple times' );
+       } );
 
+       QUnit.test( 'sessionId', function ( assert ) {
+               var result = mw.user.sessionId(),
+                       result2 = mw.user.sessionId();
+               assert.equal( typeof result, 'string', 'type' );
+               assert.equal( $.trim( result ), result, 'no leading or trailing whitespace' );
+               assert.equal( result2, result, 'retained' );
        } );
 }( mediaWiki, jQuery ) );
index 01665e5..da04c8d 100644 (file)
@@ -1,5 +1,5 @@
 ( function ( mw, $ ) {
-       var
+       var util = require( 'mediawiki.util' ),
                // Based on IPTest.php > testisIPv4
                IPV4_CASES = [
                        [ false, false, 'Boolean false is not an IP' ],
@@ -89,7 +89,7 @@
        } ) );
 
        QUnit.test( 'rawurlencode', function ( assert ) {
-               assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
+               assert.equal( util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
        } );
 
        QUnit.test( 'escapeId', function ( assert ) {
                        'Test:A & B/Here': 'Test:A_.26_B.2FHere',
                        'A&B&amp;C&amp;amp;D&amp;amp;amp;E': 'A.26B.26amp.3BC.26amp.3Bamp.3BD.26amp.3Bamp.3Bamp.3BE'
                }, function ( input, output ) {
-                       assert.equal( mw.util.escapeId( input ), output );
+                       assert.equal( util.escapeId( input ), output );
                } );
        } );
 
        QUnit.test( 'wikiUrlencode', function ( assert ) {
-               assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
+               assert.equal( util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
                // See also wfUrlencodeTest.php#provideURLS
                $.each( {
                        '+': '%2B',
                        '<>': '%3C%3E',
                        '\'': '%27'
                }, function ( input, output ) {
-                       assert.equal( mw.util.wikiUrlencode( input ), output );
+                       assert.equal( util.wikiUrlencode( input ), output );
                } );
        } );
 
                        wgPageName: 'Foobar'
                } );
 
-               href = mw.util.getUrl( 'Sandbox' );
+               href = util.getUrl( 'Sandbox' );
                assert.equal( href, '/wiki/Sandbox', 'simple title' );
 
-               href = mw.util.getUrl( 'Foo:Sandbox? 5+5=10! (test)/sub ' );
+               href = util.getUrl( 'Foo:Sandbox? 5+5=10! (test)/sub ' );
                assert.equal( href, '/wiki/Foo:Sandbox%3F_5%2B5%3D10!_(test)/sub_', 'complex title' );
 
                // T149767
-               href = mw.util.getUrl( 'My$$test$$$$$title' );
+               href = util.getUrl( 'My$$test$$$$$title' );
                assert.equal( href, '/wiki/My$$test$$$$$title', 'title with multiple consecutive dollar signs' );
 
-               href = mw.util.getUrl();
+               href = util.getUrl();
                assert.equal( href, '/wiki/Foobar', 'default title' );
 
-               href = mw.util.getUrl( null, { action: 'edit' } );
+               href = util.getUrl( null, { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Foobar&action=edit', 'default title with query string' );
 
-               href = mw.util.getUrl( 'Sandbox', { action: 'edit' } );
+               href = util.getUrl( 'Sandbox', { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Sandbox&action=edit', 'simple title with query string' );
 
                // Test fragments
-               href = mw.util.getUrl( 'Foo:Sandbox#Fragment', { action: 'edit' } );
+               href = util.getUrl( 'Foo:Sandbox#Fragment', { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Foo:Sandbox&action=edit#Fragment', 'namespaced title with query string and fragment' );
 
-               href = mw.util.getUrl( 'Sandbox#', { action: 'edit' } );
+               href = util.getUrl( 'Sandbox#', { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Sandbox&action=edit', 'title with query string and empty fragment' );
 
-               href = mw.util.getUrl( 'Sandbox', {} );
+               href = util.getUrl( 'Sandbox', {} );
                assert.equal( href, '/wiki/Sandbox', 'title with empty query string' );
 
-               href = mw.util.getUrl( '#Fragment' );
+               href = util.getUrl( '#Fragment' );
                assert.equal( href, '/wiki/#Fragment', 'empty title with fragment' );
 
-               href = mw.util.getUrl( '#Fragment', { action: 'edit' } );
+               href = util.getUrl( '#Fragment', { action: 'edit' } );
                assert.equal( href, '/w/index.php?action=edit#Fragment', 'epmty title with query string and fragment' );
 
-               href = mw.util.getUrl( 'Foo:Sandbox \xC4#Fragment \xC4', { action: 'edit' } );
+               href = util.getUrl( 'Foo:Sandbox \xC4#Fragment \xC4', { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Foo:Sandbox_%C3%84&action=edit#Fragment_.C3.84', 'title with query string, fragment, and special characters' );
 
-               href = mw.util.getUrl( 'Foo:%23#Fragment', { action: 'edit' } );
+               href = util.getUrl( 'Foo:%23#Fragment', { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Foo:%2523&action=edit#Fragment', 'title containing %23 (#), fragment, and a query string' );
 
-               href = mw.util.getUrl( '#+&=:;@$-_.!*/[]<>\'§', { action: 'edit' } );
+               href = util.getUrl( '#+&=:;@$-_.!*/[]<>\'§', { action: 'edit' } );
                assert.equal( href, '/w/index.php?action=edit#.2B.26.3D:.3B.40.24-_..21.2A.2F.5B.5D.3C.3E.27.C2.A7', 'fragment with various characters' );
        } );
 
                        wgScriptPath: '/w'
                } );
 
-               assert.equal( mw.util.wikiScript(), mw.config.get( 'wgScript' ),
+               assert.equal( util.wikiScript(), mw.config.get( 'wgScript' ),
                        'wikiScript() returns wgScript'
                );
-               assert.equal( mw.util.wikiScript( 'index' ), mw.config.get( 'wgScript' ),
+               assert.equal( util.wikiScript( 'index' ), mw.config.get( 'wgScript' ),
                        'wikiScript( index ) returns wgScript'
                );
-               assert.equal( mw.util.wikiScript( 'load' ), mw.config.get( 'wgLoadScript' ),
+               assert.equal( util.wikiScript( 'load' ), mw.config.get( 'wgLoadScript' ),
                        'wikiScript( load ) returns wgLoadScript'
                );
-               assert.equal( mw.util.wikiScript( 'api' ), '/w/api.php', 'API path' );
+               assert.equal( util.wikiScript( 'api' ), '/w/api.php', 'API path' );
        } );
 
        QUnit.test( 'addCSS', function ( assert ) {
                var $el, style;
                $el = $( '<div>' ).attr( 'id', 'mw-addcsstest' ).appendTo( '#qunit-fixture' );
 
-               style = mw.util.addCSS( '#mw-addcsstest { visibility: hidden; }' );
+               style = util.addCSS( '#mw-addcsstest { visibility: hidden; }' );
                assert.equal( typeof style, 'object', 'addCSS returned an object' );
                assert.strictEqual( style.disabled, false, 'property "disabled" is available and set to false' );
 
                var url;
 
                url = 'http://example.org/?foo=wrong&foo=right#&foo=bad';
-               assert.equal( mw.util.getParamValue( 'foo', url ), 'right', 'Use latest one, ignore hash' );
-               assert.strictEqual( mw.util.getParamValue( 'bar', url ), null, 'Return null when not found' );
+               assert.equal( util.getParamValue( 'foo', url ), 'right', 'Use latest one, ignore hash' );
+               assert.strictEqual( util.getParamValue( 'bar', url ), null, 'Return null when not found' );
 
                url = 'http://example.org/#&foo=bad';
-               assert.strictEqual( mw.util.getParamValue( 'foo', url ), null, 'Ignore hash if param is not in querystring but in hash (T29427)' );
+               assert.strictEqual( util.getParamValue( 'foo', url ), null, 'Ignore hash if param is not in querystring but in hash (T29427)' );
 
                url = 'example.org?' + $.param( { TEST: 'a b+c' } );
-               assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c', 'T32441: getParamValue must understand "+" encoding of space' );
+               assert.strictEqual( util.getParamValue( 'TEST', url ), 'a b+c', 'T32441: getParamValue must understand "+" encoding of space' );
 
                url = 'example.org?' + $.param( { TEST: 'a b+c d' } ); // check for sloppy code from r95332 :)
-               assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c d', 'T32441: getParamValue must understand "+" encoding of space (multiple spaces)' );
+               assert.strictEqual( util.getParamValue( 'TEST', url ), 'a b+c d', 'T32441: getParamValue must understand "+" encoding of space (multiple spaces)' );
        } );
 
        QUnit.test( '$content', function ( assert ) {
-               assert.ok( mw.util.$content instanceof jQuery, 'mw.util.$content instance of jQuery' );
-               assert.strictEqual( mw.util.$content.length, 1, 'mw.util.$content must have length of 1' );
+               assert.ok( util.$content instanceof jQuery, 'mw.util.$content instance of jQuery' );
+               assert.strictEqual( util.$content.length, 1, 'mw.util.$content must have length of 1' );
        } );
 
        /**
                var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo,
                        addedAfter, tbRLDMnonexistentid, tbRLDMemptyjquery;
 
-               pTestTb = '\
-               <div class="portlet" id="p-test-tb">\
-                       <h3>Toolbox</h3>\
-                       <ul class="body"></ul>\
-               </div>';
-               pCustom = '\
-               <div class="portlet" id="p-test-custom">\
-                       <h3>Views</h3>\
-                       <ul class="body">\
-                               <li id="c-foo"><a href="#">Foo</a></li>\
-                               <li id="c-barmenu">\
-                                       <ul>\
-                                               <li id="c-bar-baz"><a href="#">Baz</a></a>\
-                                       </ul>\
-                               </li>\
-                       </ul>\
-               </div>';
-               vectorTabs = '\
-               <div id="p-test-views" class="vectorTabs">\
-                       <h3>Views</h3>\
-                       <ul></ul>\
-               </div>';
+               pTestTb =
+                       '<div class="portlet" id="p-test-tb">' +
+                               '<h3>Toolbox</h3>' +
+                               '<ul class="body"></ul>' +
+                       '</div>';
+               pCustom =
+                       '<div class="portlet" id="p-test-custom">' +
+                               '<h3>Views</h3>' +
+                               '<ul class="body">' +
+                                       '<li id="c-foo"><a href="#">Foo</a></li>' +
+                                       '<li id="c-barmenu">' +
+                                               '<ul>' +
+                                                       '<li id="c-bar-baz"><a href="#">Baz</a></a>' +
+                                               '</ul>' +
+                                       '</li>' +
+                               '</ul>' +
+                       '</div>';
+               vectorTabs =
+                       '<div id="p-test-views" class="vectorTabs">' +
+                               '<h3>Views</h3>' +
+                               '<ul></ul>' +
+                       '</div>';
 
                $( '#qunit-fixture' ).append( pTestTb, pCustom, vectorTabs );
 
-               tbRL = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
+               tbRL = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
                        'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l'
                );
 
                assert.ok( tbRL && tbRL.nodeType, 'addPortletLink returns a DOM Node' );
 
-               tbMW = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/',
+               tbMW = util.addPortletLink( 'p-test-tb', '//mediawiki.org/',
                        'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org', 'm', tbRL );
                $tbMW = $( tbMW );
 
                assert.equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
                assert.strictEqual( $tbMW.next()[ 0 ], tbRL, 'Link is in the correct position (nextnode as Node object)' );
 
-               cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
+               cuQuux = util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
                $cuQuux = $( cuQuux );
 
                assert.equal( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [test-q]', 'Existing accesskey is stripped and updated' );
                        'addPortletLink did not add the item to all <ul> elements in the portlet (T37082)'
                );
 
-               tbRLDM = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+               tbRLDM = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm', 'List of all default modules ', 'd', '#t-rl' );
 
                assert.strictEqual( $( tbRLDM ).next()[ 0 ], tbRL, 'Link is in the correct position (CSS selector as nextnode)' );
 
-               caFoo = mw.util.addPortletLink( 'p-test-views', '#', 'Foo' );
+               caFoo = util.addPortletLink( 'p-test-views', '#', 'Foo' );
 
                assert.strictEqual( $tbMW.find( 'span' ).length, 0, 'No <span> element should be added for porlets without vectorTabs class.' );
                assert.strictEqual( $( caFoo ).find( 'span' ).length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
 
-               addedAfter = mw.util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
+               addedAfter = util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
                assert.strictEqual( $( addedAfter ).next()[ 0 ], tbRL, 'Link is in the correct position (jQuery object as nextnode)' );
 
                // test case - nonexistent id as next node
-               tbRLDMnonexistentid = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+               tbRLDMnonexistentid = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-nonexistent', 'List of all default modules ', 'd', '#t-rl-nonexistent' );
 
                assert.equal( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode non-matching CSS selector)' );
 
                // test case - empty jquery object as next node
-               tbRLDMemptyjquery = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+               tbRLDMemptyjquery = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-empty-jquery', 'List of all default modules ', 'd', $( '#t-rl-nonexistent' ) );
 
                assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode as empty jQuery object)' );
        } );
 
        QUnit.test( 'validateEmail', function ( assert ) {
-               assert.strictEqual( mw.util.validateEmail( '' ), null, 'Should return null for empty string ' );
-               assert.strictEqual( mw.util.validateEmail( 'user@localhost' ), true, 'Return true for a valid e-mail address' );
+               assert.strictEqual( util.validateEmail( '' ), null, 'Should return null for empty string ' );
+               assert.strictEqual( util.validateEmail( 'user@localhost' ), true, 'Return true for a valid e-mail address' );
 
                // testEmailWithCommasAreInvalids
-               assert.strictEqual( mw.util.validateEmail( 'user,foo@example.org' ), false, 'Emails with commas are invalid' );
-               assert.strictEqual( mw.util.validateEmail( 'userfoo@ex,ample.org' ), false, 'Emails with commas are invalid' );
+               assert.strictEqual( util.validateEmail( 'user,foo@example.org' ), false, 'Emails with commas are invalid' );
+               assert.strictEqual( util.validateEmail( 'userfoo@ex,ample.org' ), false, 'Emails with commas are invalid' );
 
                // testEmailWithHyphens
-               assert.strictEqual( mw.util.validateEmail( 'user-foo@example.org' ), true, 'Emails may contain a hyphen' );
-               assert.strictEqual( mw.util.validateEmail( 'userfoo@ex-ample.org' ), true, 'Emails may contain a hyphen' );
+               assert.strictEqual( util.validateEmail( 'user-foo@example.org' ), true, 'Emails may contain a hyphen' );
+               assert.strictEqual( util.validateEmail( 'userfoo@ex-ample.org' ), true, 'Emails may contain a hyphen' );
        } );
 
        QUnit.test( 'isIPv6Address', function ( assert ) {
                $.each( IPV6_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
+                       assert.strictEqual( util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
        QUnit.test( 'isIPv4Address', function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
+                       assert.strictEqual( util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
        QUnit.test( 'isIPAddress', function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
+                       assert.strictEqual( util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
 
                $.each( IPV6_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
+                       assert.strictEqual( util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 }( mediaWiki, jQuery ) );
index 02ca243..ee1340d 100644 (file)
                        'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1',
                        // Safari 5.0+
                        'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 10_6_7; ru-ru) AppleWebKit/534.31+ (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',
-                       // Opera 12+ (Presto-based)
-                       'Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00',
-                       'Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.17',
                        // Opera 15+ (Chromium-based)
                        'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 OPR/15.0.1147.153',
                        'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 OPR/16.0.1196.62',
                        'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 OPR/23.0.1522.75',
-                       // Internet Explorer 9+
-                       'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)',
+                       // Internet Explorer 10+
                        'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
                        'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko',
                        // IE Mobile
@@ -52,7 +48,7 @@
 
                        /* Grade C */
 
-                       // Internet Explorer < 9
+                       // Internet Explorer < 10
                        'Mozilla/2.0 (compatible; MSIE 3.03; Windows 3.1)',
                        'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)',
                        'Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;)',
                        'Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)',
                        'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US)',
                        'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)',
-                       // Firefox < 3
+                       'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)',
+                       // Firefox < 4
                        'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2',
                        'Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1.1) Gecko/20070311 Firefox/2.0.0.1',
-                       // Opera < 12
+                       'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
+                       // Opera < 15 (Presto-based)
                        'Mozilla/5.0 (Windows NT 5.0; U) Opera 7.54 [en]',
                        'Opera/7.54 (Windows NT 5.0; U) [en]',
                        'Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.0',
                        'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.2.15 Version/10.00',
                        'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.10',
                        'Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62',
+                       'Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00',
+                       'Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.17',
                        // BlackBerry < 6
                        'BlackBerry9300/5.0.0.716 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133',
                        'BlackBerry7250/4.0.0 Profile/MIDP-2.0 Configuration/CLDC-1.1',
 
                        /* Grade X */
 
-                       // Firefox 3.6
-                       'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
                        // Gecko
                        'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060928 (Debian|Debian-1.8.0.7-1) Epiphany/2.14',
                        'Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.6) Gecko/20070817 IceWeasel/2.0.0.6-g2',
diff --git a/tests/selenium/.eslintrc.json b/tests/selenium/.eslintrc.json
new file mode 100644 (file)
index 0000000..d64ada9
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "extends": "../../.eslintrc.json",
+       "env": {
+               "es6": true,
+               "mocha": true,
+               "node": true
+       },
+       "parserOptions": {
+               "ecmaVersion": 6
+       },
+       "globals": {
+               "browser": false
+       }
+}
diff --git a/tests/selenium/README.md b/tests/selenium/README.md
new file mode 100644 (file)
index 0000000..479b958
--- /dev/null
@@ -0,0 +1,52 @@
+# Selenium tests
+
+## Prerequisites
+
+- [Chrome](https://www.google.com/chrome/)
+- [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/)
+- [Node.js](https://nodejs.org/en/)
+- [MediaWiki-Vagrant](https://www.mediawiki.org/wiki/MediaWiki-Vagrant)
+
+Set up MediaWiki-Vagrant:
+
+    cd mediawiki/vagrant
+    vagrant up
+
+## Installation
+
+    cd mediawiki
+    npm install
+
+## Usage
+
+    npm run selenium
+
+To run only one file (for example page.js), you first need to spawn the chromedriver:
+
+    chromedriver --url-base=/wd/hub --port=4444
+
+Then in another terminal:
+
+    cd mediawiki/tests/selenium
+    ../../node_modules/.bin/wdio --spec page.js
+
+The runner reads the config file `wdio.conf.js` and runs the spec listed in
+`page.js`.
+
+The defaults in the configuration files aim are targetting  a MediaWiki-Vagrant
+installation on installation on http://127.0.0.1:8080 with a user Admin and
+password 'vagrant'.  Those settings can be overriden using environment
+variables:
+
+`MW_SERVER`: to be set to the value of your $wgServer
+`MW_SCRIPT_PATH`: ditto with  $wgScriptPath
+`MEDIAWIKI_USER`: username of an account that can create users on the wiki.
+`MEDIAWIKI_PASSWORD`: password for above user
+
+Example:
+
+    MW_SERVER=http://example.org MW_SCRIPT_PATH=/dev/w npm run selenium
+
+## Links
+
+- [Selenium/Node.js](https://www.mediawiki.org/wiki/Selenium/Node.js)
diff --git a/tests/selenium/pageobjects/createaccount.page.js b/tests/selenium/pageobjects/createaccount.page.js
new file mode 100644 (file)
index 0000000..a0b9490
--- /dev/null
@@ -0,0 +1,25 @@
+'use strict';
+const Page = require( './page' );
+
+class CreateAccountPage extends Page {
+
+       get username() { return browser.element( '#wpName2' ); }
+       get password() { return browser.element( '#wpPassword2' ); }
+       get confirmPassword() { return browser.element( '#wpRetype' ); }
+       get create() { return browser.element( '#wpCreateaccount' ); }
+       get heading() { return browser.element( '#firstHeading' ); }
+
+       open() {
+               super.open( 'Special:CreateAccount' );
+       }
+
+       createAccount( username, password ) {
+               this.open();
+               this.username.setValue( username );
+               this.password.setValue( password );
+               this.confirmPassword.setValue( password );
+               this.create.click();
+       }
+
+}
+module.exports = new CreateAccountPage();
diff --git a/tests/selenium/pageobjects/edit.page.js b/tests/selenium/pageobjects/edit.page.js
new file mode 100644 (file)
index 0000000..819c546
--- /dev/null
@@ -0,0 +1,22 @@
+'use strict';
+const Page = require( './page' );
+
+class EditPage extends Page {
+
+       get content() { return browser.element( '#wpTextbox1' ); }
+       get displayedContent() { return browser.element( '#mw-content-text' ); }
+       get heading() { return browser.element( '#firstHeading' ); }
+       get save() { return browser.element( '#wpSave' ); }
+
+       open( name ) {
+               super.open( name + '&action=edit' );
+       }
+
+       edit( name, content ) {
+               this.open( name );
+               this.content.setValue( content );
+               this.save.click();
+       }
+
+}
+module.exports = new EditPage();
diff --git a/tests/selenium/pageobjects/history.page.js b/tests/selenium/pageobjects/history.page.js
new file mode 100644 (file)
index 0000000..869484e
--- /dev/null
@@ -0,0 +1,13 @@
+'use strict';
+const Page = require( './page' );
+
+class HistoryPage extends Page {
+
+       get comment() { return browser.element( '#pagehistory .comment' ); }
+
+       open( name ) {
+               super.open( name + '&action=history' );
+       }
+
+}
+module.exports = new HistoryPage();
diff --git a/tests/selenium/pageobjects/page.js b/tests/selenium/pageobjects/page.js
new file mode 100644 (file)
index 0000000..864bdae
--- /dev/null
@@ -0,0 +1,11 @@
+// From http://webdriver.io/guide/testrunner/pageobjects.html
+'use strict';
+class Page {
+       constructor() {
+               this.title = 'My Page';
+       }
+       open( path ) {
+               browser.url( '/index.php?title=' + path );
+       }
+}
+module.exports = Page;
diff --git a/tests/selenium/pageobjects/preferences.page.js b/tests/selenium/pageobjects/preferences.page.js
new file mode 100644 (file)
index 0000000..98b87fe
--- /dev/null
@@ -0,0 +1,20 @@
+'use strict';
+const Page = require( './page' );
+
+class PreferencesPage extends Page {
+
+       get realName() { return browser.element( '#mw-input-wprealname' ); }
+       get save() { return browser.element( '#prefcontrol' ); }
+
+       open() {
+               super.open( 'Special:Preferences' );
+       }
+
+       changeRealName( realName ) {
+               this.open();
+               this.realName.setValue( realName );
+               this.save.click();
+       }
+
+}
+module.exports = new PreferencesPage();
diff --git a/tests/selenium/pageobjects/userlogin.page.js b/tests/selenium/pageobjects/userlogin.page.js
new file mode 100644 (file)
index 0000000..bdbd41b
--- /dev/null
@@ -0,0 +1,23 @@
+'use strict';
+const Page = require( './page' );
+
+class UserLoginPage extends Page {
+
+       get username() { return browser.element( '#wpName1' ); }
+       get password() { return browser.element( '#wpPassword1' ); }
+       get loginButton() { return browser.element( '#wpLoginAttempt' ); }
+       get userPage() { return browser.element( '#pt-userpage' ); }
+
+       open() {
+               super.open( 'Special:UserLogin' );
+       }
+
+       login( username, password ) {
+               this.open();
+               this.username.setValue( username );
+               this.password.setValue( password );
+               this.loginButton.click();
+       }
+
+}
+module.exports = new UserLoginPage();
diff --git a/tests/selenium/pageobjects/userlogout.page.js b/tests/selenium/pageobjects/userlogout.page.js
new file mode 100644 (file)
index 0000000..e355fd5
--- /dev/null
@@ -0,0 +1,11 @@
+'use strict';
+const Page = require( './page' );
+
+class UserLogoutPage extends Page {
+
+       open() {
+               super.open( 'Special:UserLogout' );
+       }
+
+}
+module.exports = new UserLogoutPage();
diff --git a/tests/selenium/specs/page.js b/tests/selenium/specs/page.js
new file mode 100644 (file)
index 0000000..da80aaf
--- /dev/null
@@ -0,0 +1,54 @@
+'use strict';
+const assert = require( 'assert' ),
+       HistoryPage = require( '../pageobjects/history.page' ),
+       EditPage = require( '../pageobjects/edit.page' );
+
+describe( 'Page', function () {
+
+       var content,
+               name;
+
+       beforeEach( function () {
+               content = Math.random().toString();
+               name = Math.random().toString();
+       } );
+
+       it( 'should be creatable', function () {
+
+               // create
+               EditPage.edit( name, content );
+
+               // check
+               assert.equal( EditPage.heading.getText(), name );
+               assert.equal( EditPage.displayedContent.getText(), content );
+
+       } );
+
+       it( 'should be editable', function () {
+
+               var content2 = Math.random().toString();
+
+               // create
+               EditPage.edit( name, content );
+
+               // edit
+               EditPage.edit( name, content2 );
+
+               // check content
+               assert.equal( EditPage.heading.getText(), name );
+               assert.equal( EditPage.displayedContent.getText(), content2 );
+
+       } );
+
+       it( 'should have history', function () {
+
+               // create
+               EditPage.edit( name, content );
+
+               // check
+               HistoryPage.open( name );
+               assert.equal( HistoryPage.comment.getText(), `(Created page with "${content}")` );
+
+       } );
+
+} );
diff --git a/tests/selenium/specs/user.js b/tests/selenium/specs/user.js
new file mode 100644 (file)
index 0000000..6746c5b
--- /dev/null
@@ -0,0 +1,59 @@
+'use strict';
+const assert = require( 'assert' ),
+       CreateAccountPage = require( '../pageobjects/createaccount.page' ),
+       UserLoginPage = require( '../pageobjects/userlogin.page' ),
+       UserLogoutPage = require( '../pageobjects/userlogout.page' ),
+       PreferencesPage = require( '../pageobjects/preferences.page' );
+
+describe( 'User', function () {
+
+       var password,
+               username;
+
+       beforeEach( function () {
+               username = `User-${Math.random().toString()}`;
+               password = Math.random().toString();
+       } );
+
+       it( 'should be able to create account', function () {
+
+               // create
+               CreateAccountPage.createAccount( username, password );
+
+               // check
+               assert.equal( CreateAccountPage.heading.getText(), `Welcome, ${username}!` );
+
+       } );
+
+       it( 'should be able to log in', function () {
+
+               // create
+               CreateAccountPage.createAccount( username, password );
+
+               // logout
+               UserLogoutPage.open();
+
+               // log in
+               UserLoginPage.login( username, password );
+
+               // check
+               assert.equal( UserLoginPage.userPage.getText(), username );
+
+       } );
+
+       it( 'should be able to change preferences', function () {
+
+               var realName = Math.random().toString();
+
+               // create
+               CreateAccountPage.createAccount( username, password );
+
+               // change real name
+               PreferencesPage.changeRealName( realName );
+
+               // check
+               assert.equal( PreferencesPage.realName.getValue(), realName );
+
+       } );
+
+} );
diff --git a/tests/selenium/wdio.conf.jenkins.js b/tests/selenium/wdio.conf.jenkins.js
new file mode 100644 (file)
index 0000000..6049eb2
--- /dev/null
@@ -0,0 +1,20 @@
+/* eslint no-undef: "error" */
+/* eslint-env node */
+'use strict';
+var merge = require( 'deepmerge' ),
+       wdioConf = require( './wdio.conf.js' );
+
+// Overwrite default settings
+exports.config = merge( wdioConf.config, {
+       username: 'WikiAdmin',
+       password: 'testpass',
+       screenshotPath: '../log/',
+       baseUrl: process.env.MW_SERVER + process.env.MW_SCRIPT_PATH,
+
+       reporters: [ 'spec', 'junit' ],
+       reporterOptions: {
+               junit: {
+                       outputDir: '../log/'
+               }
+       }
+} );
diff --git a/tests/selenium/wdio.conf.js b/tests/selenium/wdio.conf.js
new file mode 100644 (file)
index 0000000..adbd8c3
--- /dev/null
@@ -0,0 +1,236 @@
+/* eslint comma-dangle: 0 */
+/* eslint no-undef: "error" */
+/* eslint no-console: 0 */
+/* eslint-env node */
+'use strict';
+
+const path = require( 'path' );
+
+function relPath( foo ) {
+       return path.resolve( __dirname, '../..', foo );
+}
+
+exports.config = {
+
+       //
+       // ======
+       //
+       // ======
+       // Custom
+       // ======
+       // Define any custom variables.
+       // Example:
+       // username: 'Admin',
+       // Use if from tests with:
+       // browser.options.username
+       username: process.env.MEDIAWIKI_USER === undefined ?
+               'Admin' :
+               process.env.MEDIAWIKI_USER,
+       password: process.env.MEDIAWIKI_PASSWORD === undefined ?
+               'vagrant' :
+               process.env.MEDIAWIKI_PASSWORD,
+       //
+       // ======
+       // Sauce Labs
+       // ======
+       //
+       services: [ 'sauce' ],
+       user: process.env.SAUCE_USERNAME,
+       key: process.env.SAUCE_ACCESS_KEY,
+       //
+       // ==================
+       // Specify Test Files
+       // ==================
+       // Define which test specs should run. The pattern is relative to the directory
+       // from which `wdio` was called. Notice that, if you are calling `wdio` from an
+       // NPM script (see https://docs.npmjs.com/cli/run-script) then the current working
+       // directory is where your package.json resides, so `wdio` will be called from there.
+       //
+       specs: [
+               relPath( './tests/selenium/specs/**/*.js' ),
+               relPath( './extensions/*/tests/selenium/specs/**/*.js' ),
+               relPath( './extensions/VisualEditor/modules/ve-mw/tests/selenium/specs/**/*.js' )
+       ],
+       // Patterns to exclude.
+       exclude: [
+       // 'path/to/excluded/files'
+       ],
+       //
+       // ============
+       // Capabilities
+       // ============
+       // Define your capabilities here. WebdriverIO can run multiple capabilities at the same
+       // time. Depending on the number of capabilities, WebdriverIO launches several test
+       // sessions. Within your capabilities you can overwrite the spec and exclude options in
+       // order to group specific specs to a specific capability.
+       //
+       // First, you can define how many instances should be started at the same time. Let's
+       // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
+       // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
+       // files and you set maxInstances to 10, all spec files will get tested at the same time
+       // and 30 processes will get spawned. The property handles how many capabilities
+       // from the same test should run tests.
+       //
+       maxInstances: 1,
+       //
+       // If you have trouble getting all important capabilities together, check out the
+       // Sauce Labs platform configurator - a great tool to configure your capabilities:
+       // https://docs.saucelabs.com/reference/platforms-configurator
+       //
+       // For Chrome/Chromium https://sites.google.com/a/chromium.org/chromedriver/capabilities
+       capabilities: [ {
+               // maxInstances can get overwritten per capability. So if you have an in-house Selenium
+               // grid with only 5 firefox instances available you can make sure that not more than
+               // 5 instances get started at a time.
+               maxInstances: 1,
+               //
+               browserName: 'chrome',
+               // Since Chrome v57 https://bugs.chromium.org/p/chromedriver/issues/detail?id=1625
+               chromeOptions: {
+                       args: [ '--enable-automation' ]
+               }
+       } ],
+       //
+       // ===================
+       // Test Configurations
+       // ===================
+       // Define all options that are relevant for the WebdriverIO instance here
+       //
+       // By default WebdriverIO commands are executed in a synchronous way using
+       // the wdio-sync package. If you still want to run your tests in an async way
+       // e.g. using promises you can set the sync option to false.
+       sync: true,
+       //
+       // Level of logging verbosity: silent | verbose | command | data | result | error
+       logLevel: 'error',
+       //
+       // Enables colors for log output.
+       coloredLogs: true,
+       //
+       // Saves a screenshot to a given path if a command fails.
+       screenshotPath: './log/',
+       //
+       // Set a base URL in order to shorten url command calls. If your url parameter starts
+       // with "/", then the base url gets prepended.
+       baseUrl: (
+               process.env.MW_SERVER === undefined ?
+               'http://127.0.0.1:8080' :
+               process.env.MW_SERVER
+       ) + (
+               process.env.MW_SCRIPT_PATH === undefined ?
+               '/w' :
+               process.env.MW_SCRIPT_PATH
+       ),
+       //
+       // Default timeout for all waitFor* commands.
+       waitforTimeout: 20000,
+       //
+       // Default timeout in milliseconds for request
+       // if Selenium Grid doesn't send response
+       connectionRetryTimeout: 90000,
+       //
+       // Default request retries count
+       connectionRetryCount: 3,
+       //
+       // Initialize the browser instance with a WebdriverIO plugin. The object should have the
+       // plugin name as key and the desired plugin options as properties. Make sure you have
+       // the plugin installed before running any tests. The following plugins are currently
+       // available:
+       // WebdriverCSS: https://github.com/webdriverio/webdrivercss
+       // WebdriverRTC: https://github.com/webdriverio/webdriverrtc
+       // Browserevent: https://github.com/webdriverio/browserevent
+       // plugins: {
+       //     webdrivercss: {
+       //         screenshotRoot: 'my-shots',
+       //         failedComparisonsRoot: 'diffs',
+       //         misMatchTolerance: 0.05,
+       //         screenWidth: [320,480,640,1024]
+       //     },
+       //     webdriverrtc: {},
+       //     browserevent: {}
+       // },
+       //
+       // Test runner services
+       // Services take over a specific job you don't want to take care of. They enhance
+       // your test setup with almost no effort. Unlike plugins, they don't add new
+       // commands. Instead, they hook themselves up into the test process.
+       // services: [],//
+       // Framework you want to run your specs with.
+       // The following are supported: Mocha, Jasmine, and Cucumber
+       // see also: http://webdriver.io/guide/testrunner/frameworks.html
+       //
+       // Make sure you have the wdio adapter package for the specific framework installed
+       // before running any tests.
+       framework: 'mocha',
+
+       // Test reporter for stdout.
+       // The only one supported by default is 'dot'
+       // see also: http://webdriver.io/guide/testrunner/reporters.html
+       reporters: [ 'spec' ],
+       //
+       // Options to be passed to Mocha.
+       // See the full list at http://mochajs.org/
+       mochaOpts: {
+               ui: 'bdd',
+               timeout: 20000
+       },
+       //
+       // =====
+       // Hooks
+       // =====
+       // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
+       // it and to build services around it. You can either apply a single function or an array of
+       // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
+       // resolved to continue.
+       //
+       // Gets executed once before all workers get launched.
+       // onPrepare: function ( config, capabilities ) {
+       // }
+       //
+       // Gets executed before test execution begins. At this point you can access all global
+       // variables, such as `browser`. It is the perfect place to define custom commands.
+       // before: function (capabilities, specs) {
+       // },
+       //
+       // Hook that gets executed before the suite starts
+       // beforeSuite: function (suite) {
+       // },
+       //
+       // Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
+       // beforeEach in Mocha)
+       // beforeHook: function () {
+       // },
+       //
+       // Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
+       // afterEach in Mocha)
+       //
+       // Function to be executed before a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
+       // beforeTest: function (test) {
+       // },
+       //
+       // Runs before a WebdriverIO command gets executed.
+       // beforeCommand: function (commandName, args) {
+       // },
+       //
+       // Runs after a WebdriverIO command gets executed
+       // afterCommand: function (commandName, args, result, error) {
+       // },
+       //
+       // Function to be executed after a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
+       // afterTest: function (test) {
+       // },
+       //
+       // Hook that gets executed after the suite has ended
+       // afterSuite: function (suite) {
+       // },
+       //
+       // Gets executed after all tests are done. You still have access to all global variables from
+       // the test.
+       // after: function (result, capabilities, specs) {
+       // },
+       //
+       // Gets executed after all workers got shut down and the process is about to exit. It is not
+       // possible to defer the end of the process using a promise.
+       // onComplete: function(exitCode) {
+       // }
+};
index c38b89c..7c3e757 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
 require __DIR__ . '/includes/WebStart.php';
@@ -272,7 +273,7 @@ function wfStreamThumb( array $params ) {
        // For 404 handled thumbnails, we only use the base name of the URI
        // for the thumb params and the parent directory for the source file name.
        // Check that the zone relative path matches up so squid caches won't pick
-       // up thumbs that would not be purged on source file deletion (bug 34231).
+       // up thumbs that would not be purged on source file deletion (T36231).
        if ( $rel404 !== null ) { // thumbnail was handled via 404
                if ( rawurldecode( $rel404 ) === $img->getThumbRel( $thumbName ) ) {
                        // Request for the canonical thumbnail name
@@ -317,7 +318,9 @@ function wfStreamThumb( array $params ) {
                $streamtime = microtime( true ) - $starttime;
 
                if ( $status->isOK() ) {
-                       RequestContext::getMain()->getStats()->timing( 'media.thumbnail.stream', $streamtime );
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
+                               'media.thumbnail.stream', $streamtime
+                       );
                } else {
                        wfThumbError( 500, 'Could not stream the file', null, [ 'file' => $thumbName,
                                'path' => $thumbPath, 'error' => $status->getWikiText( false, false, 'en' ) ] );
@@ -527,15 +530,6 @@ function wfExtractThumbParams( $file, $params ) {
        $thumbname = $params['thumbName'];
        unset( $params['thumbName'] );
 
-       // Do the hook first for older extensions that rely on it.
-       if ( !Hooks::run( 'ExtractThumbParameters', [ $thumbname, &$params ] ) ) {
-               // Check hooks if parameters can be extracted
-               // Hooks return false if they manage to *resolve* the parameters
-               // This hook should be considered deprecated
-               wfDeprecated( 'ExtractThumbParameters', '1.22' );
-               return $params; // valid thumbnail URL (via extension or config)
-       }
-
        // FIXME: Files in the temp zone don't set a MIME type, which means
        // they don't have a handler. Which means we can't parse the param
        // string. However, not a big issue as what good is a param string